Bonjour tout le monde, I'm Chris Plank, I work as an enterprise architect, an evangelist, passionate advocate for platform engineering at NatWest Bank. Yeah, I'm Derek, I'm a principal engineer at Cintasso. Yeah, we, that's pretty much it. I'm from Brazil originally, it's from Scotland, as you can manage from the accent. Yeah. Yeah, and we're here to talk about... Platform engineering and what we're doing right now at NatWest Bank, so this isn't a polished speech, this isn't about right to the end what we've done, it's about what we're actually doing right now. And for those of you who don't know who NatWest Bank are, we're one of the top five banks in the UK. We serve 19 million customers, we've got 62,000 staff worldwide, over a million new personal current accounts last year, 1.5 million new saving accounts, we process one in four UK payments, we do about 750 million financial transactions per month, 94% of our customers needs are met digitally nowadays, and we've got about 10.9 million active digital users, so all good stuff. Yeah, and for those that are not aware, we are at Cintasso, we are the creators of Cradex, it's a framework for building platform, for building platforms, and Cradex enables you to go faster, to decrease risk in your organization, and to really manage the day-to-day operations of all of your deployments, all of your services, and I'll be running a demo later now, hopefully everything will work. There is some stickers around in the desks, there is a QR code that you can join our Slack channel, we're gonna be donating 10 euros per person that joins, feel free to check it out later as well. Excellent. So, before I start, a quick show of hands, how many people in the room have got a main frame? Great, how many people are working on trying to get rid of those main frames? One, two, how many people are running Kubernetes on the main frame? One, us, excellent, thanks for that. So let me start by saying enterprise transformation is hard, it's really difficult when you're a massive organization, when you've got tens of different departments, hundreds of teams, thousands of staff, and in financial services the risks of getting it wrong are huge. The fines alone are massive, and the number one thing that we've got to do is keep the show on the road whilst we're trying to transform. This light here, oh Derek, let me play with a laser, it's deliberately blurred, but this is something that we got from our internal customers on their journey for platform modernization, standing up provisioning, standing up tools. You spend a number of months on the design phase, Derek, pick a number, one in six? Five. Five months, okay, that'll do. And then you go through a number of hoops and hurdles in the next phase, the build phase. I want to use the laser. Pick a number. Three. Three, good, three months on the build phase, and then on the deploy phase, pick a number again, Derek. Four. Four, okay, so you can see it at a massive amount of time that they might spend going through all these hoops and hurdles. Each one of these is a step on their journey, each of the boxes down at the bottom are all the different teams that are involved, the different handoffs, the different cognitive load that they've got to go through, the different things they've got to learn and understand on that journey. And you can see from this picture, even though it's blurred, it's massive. There's a lot of things that they need to learn about, and with that AI and other technologies coming along, containerization for new teams, there's a lot for them to learn, a lot for them to understand, and a lot for them to manage. So what's the problem? Well, over time, we try to resolve that by creating this library of all the different patterns and the different processes that they should go through. We gave them the promise that if they went through this process, they would get an easy path through governance, it would make their life easy, and they would get into production as quick as possible. But over time, these things have bloated, they've evolved, they've had everything thrown in there. And we now have over 135 patterns in the bank. Some of those are just copies for the same thing, but done in a different way by a different team for very valid reasons. And so what we start to do over this process is start thinking about how we can modernize this, how we can decrease that complexity and the slowness that has come about by everyone pushing in all their requirements, whether that's security, whether that's the governance process, whether that's the engineering practices we've got to go through, the attestation and things that we've heard about today. And how have we gone about resolving this? Well, our leadership set us four challenges. Could we use platforms of product-based thinking and approach to deliver an opinionated way of provisioning services for our customers and allow them to do that in a self-service way? How could our existing platform teams and our business teams contribute in a democratized way? So we heard earlier on today people talking about inner sourcing. That's one of the things that we want to do. How do we get them helping us build that platform in some of these new things that we want to do? How can we do this ten times faster, four times more efficient, simplify this? And how can we ultimately move to an end-to-end delivery which is in one hour rather than those seven to ten months that we talked about earlier? Okay, so how did we do it? Well, we went wide. We came to events like this. We listened to what was going on in the industry. We went and talked to Gartner. We went and talked at various conferences like this one. We watched an awful lot of YouTube videos. An awful lot of Abbey Bangs are talking. An awful lot of Victor Farrak talking as well. And we changed our thinking and our approach. You know, we started thinking about, wait a minute. How do we bake everything in here? How do we make this simpler for our developers? It's not just focused on the automation, but like you've heard from other speakers today, think about that end-to-end view. Think about how we simplify that, simplify the cognitive load. How can we change the provisioning so that we can provision those services back to minutes rather than hours, days, weeks or months? And how do we promote this inner source and this democratization approach that we wanted to do? So we looked at all those patterns, that library, those 135 patterns that we created and we started to assess those in a different way. I think in the past, we tried, everyone tried to use those patterns as one way of doing something in the bank. And we quickly realized that there's really three approaches. The first part is the self-managed approach. You know, we've been very successful. We've got hundreds of applications running in the cloud at the moment and hundreds of AWS subscriptions. We've got thousands of microservices running on our platform as a service internally. We've got thousands of applications using our IaaS platform. So we've been very successful in our cloud adoption, whether it's public or private. But how do we take that and how do we start treating these golden paths that are minimizing this cognitive load? So we've got self-managed patterns that install these business units, they've got their own engineering capabilities. They imagine it themselves. They're carrying on following those patterns, but how do we make them better for them? We've got the self-orchestrated. So that's the ticket ops that we heard about earlier on today. You know, people making requests and getting someone provisioned for them. That's a lot of our user base, say, 80% of our user base, maybe. And then there's this third one, the emerging one that we're looking at, which is the self-service-based approach, where we really want those business units that don't have engineering capability just to select some pre-approved, pre-engineered, fully automated golden paths from a portal, just like we've been talking about today. And if we go back to those 135 patterns that we had in the past, customization is the enemy. We don't want customization. We don't want another pattern each time we come up with our self-service model. What we want to start thinking about is options instead, where they can select those options from that developer portal and be able to say, well, I don't want a Postgres database, I maybe want a Redis database with that. How do we do that? How do we support that? Without them needing to actually understand the technology that's behind that. So we came out with our platform as a product approach. What you see in here is a very, very high-level view of what we're doing right now. So we're using backstage, and we had someone talking about backstage earlier on, which is great to see in here and validate everything that we are doing. We're doing an awful lot around our CI and CD2 chain and pipeline. We're using GitLab. We're using Flux. We're starting small, and we're building bit by bit. We're adding more things in the CNCF landscape. And then we're creating these repos. And that's probably where a lot of the power is going to come from for us. This is what we're hoping we're going to get out of it. As we create these things, as we start to demonstrate it, as we build up that trust, that evidence, those working services, those minimal-loved products that our community really like and really want to use, maybe want to extend, they can start going in there and start using inner sourcing, start collaborating, start making those things better. So with that, thanks over to you now. Great. Thanks, Chris. So just quick recap of that West Objectives with their platform as a product initiative. So what Chris just said, that they want self-service. They want the teams to be able to go to backstage and self-serve on the services that they have in their platform. They want it to be democratized. That means they inner-sourcing, they have lots of teams, like organizations like Northwest have lots of teams and they all have their services. They're responsible for different parts of the organization and they want to provide the service. So they need to be open for other teams to come and then provide their services in their platform. And they want to build those golden paths, like all of those 135 plus patterns. They want to make that easy to follow, simple, so users can come and get like the safest and the right approach to request their services. And that's exactly what Cradex, I may be a little bit biased, but that's exactly what Cradex is really good for. That's where Cradex shines. So the main concept in Cradex is a promise. A promise is a encapsulation of something as a service. It's what will enable teams that not to ask to provide their services as a service, like their things as a service. It also integrates quite nicely with any particular API. It's an API-driven software, so it integrates with any portal, like backstage, and that's exactly what I want to see later on. It's also an open framework. The core of Cradex is what we call the workflows, and the workflows can be written in any language using any technology. So different teams doing different things can actually contribute to the platform with the expertise they already have. And Cradex also has this concept of compound promises, that actually encapsulate other promises and orchestrates those other promises. So this allows teams to build those code and paths. So use the building blocks that has been provided by other teams and build, like, more compelling user experiences. Before I jump into the demo, just a quick, like, high-level 30 seconds overview of what a promise is, just so we can talk the same language. But it's basically an API for you all that are more familiar with Kubernetes. An API is pretty much a CRD. It's a set of imperative pipeline instead of steps that need to be executed in order to fulfill the service. So this goes things like notification, billing, compliance, and actually deploying the service, if that's the case. And it's a set of dependencies. Dependencies are anything that needs to be installed or pre-configured in order for that service to be provided, for that promise to be fulfilled. And with that, you have everything you need to understand about the demo that I'm just about to execute. So let me try to do this. And hopefully you can see my terminal. Here it is. This may be a little bit tricky because I need to look at that monitor over there. But this is backstage. This is not exactly the promise that ATO has built, but it's heavily based on what they wanted to provide and what they want to give to their customers. So you can see that what they have is backstage. Backstage is a framework for building developer portals. I'm pretty sure that you all heard about it. We heard about it here in this talk and allows teams to easily consume and see what is available in the platform. So in this particular example, you can see that I have three promises already available in the platform providing different things as a service. So I have a bucket, a deployment, and a Postgres promise. So a user can quite easily come over here, click the create button, choose one of the tiles, let's say deployment, fill the form out. Let's just do that relatively quick. I set some defaults, so I don't actually need to type too much. But this is kind of the form, the API, the API that the users, the platform team at Northwest is actually providing. The users fill those in and then they can create. All of this is auto-generated by critics. So when you install a promise, critics will auto-generate those templates and those components and populate backstage on the back of it. And when the user sends the request, what critics will do is trigger those series of workflows. So those series of steps that are defined by the team that is building this promise to actually deploy the service. So you can see that the pipeline over there for the deployment is running. And in a moment or so, we should see the deployment coming up on the worker cluster for that particular deployment. So that's what we just saw over here. And that kind of fulfills the first criteria, the first objective of Northwest, which is to provide on-demand self-service services. So you can have deployments here. What is interesting to see is that different teams can contribute to this platform. So you can see that the deployment promise, for example, was built by the networking team. The infrastructure team built their bucket promise. And the Postgres team built the database team built their Postgres promise. As I said before, critics is a really open framework. An example of that is that our bucket promise over here is actually using Terraform. So if I request a new bucket, it will run Terraform commands to actually deploy the bucket on the cloud. But the Postgres promise is actually backed by this Postgres operator that is running there as my dependency. So different teams can go and contribute to the platform, the services that they're using, the technology that they are more familiar with, and then they can evolve over time because the API is there to provide that interface. The third thing that we shout about is that the third objective is the golden path. So right now, for users to get their app running with a database, and let's say that database should be backed by an S3 bucket, they will need to manually go and create each one of those individual services and components and wire themself together. So a platform team in Northwest could actually go around, talk to the users and figure it out what is that they need, what is like taking that platform as a product approach, what would make their life easier. And then they may come up with, for example, app as a service promise. So let's just go ahead and install this promise real quick. And what that app as a service promise will do is actually coordinate and orchestrate in that all of those wiring up that needs to happen between all of those services should be able to provide not only deployments, not only databases, but like the entire developer experience, the entire golden path as a service. I just installed that promise. So in a moment or two, I should see a new component appear on backstage for representing my app. Again, this is auto-generated by Cradex. And if we go ahead and click Create, the user can now see a new template. So a user of this platform can now come over here and say, well, I want to deploy a new app. Let's call it to-do app on my default namespace. Here are the fields that need to configure. So all of the complexity about requesting that service is not hidden for me.  I can reveal and hit Create. So what Cradex will do on the back of this request is exactly the same as it did for the other request. It will go and trigger out the pipeline. So let me go back to the terminal and I should see the pipeline for the app running. But this pipeline is different. It's actually using those building blocks to define it by those different teams to provide that experience. So in a moment or two, we should see other pipelines triggering. And those pipelines are actually the pipelines defined by each one of the individual promise.  You can see the deployment pipeline coming up. We can see the bucket pipeline coming up and running. This is going to take a little bit of time. It's downloading a lot of Terraform. Not a lot, just AWS module, which in the conference Wi-Fi takes a little bit of time. But eventually it will complete and create those buckets and wire all of those things together. And you should also see the Postgres database coming up and the Chidoo app coming up there as well on the back end. And now the user can also go back to backstage and again, it's auto-populates for those components so you can see all of the bits that make the Chidoo app in a single page. So as Derek said, we're trying to realize some of those patterns that we're going to be using from Crattix. We've gone after the type three patterns that I talked about. Really simple use cases. Just like we heard earlier on today, start simple, start small, start iterative on that platform journey, build up those products over time, add more features in based on the user needs, requirements, feedback that we heard about today, build them up into those more fully fledged offerings. Part of this is really about bringing on board thousands of new developers every year. How do we reduce their cognitive load? How do we make them productive on day one instead of say, I don't know, day 50 of them joining the organization? They don't need to know that they need to go and talk to Bill and Eddie and John and different teams. They don't need to know they need to fill in this form and triplicate and go to this service now page that's been changed and hasn't been kept up to date. They can just go to this one portal. They can put in the information that they know and that they need and then they can start being productive. That's really what we're trying to do with this. Yeah. And that's kind of the end of the demo. So just a quick review. They can use, I started with a backstage so you can see a bunch of promises and those promises are what provides the self-service aspect. It's democratic, different teams are contributing to the platform, installing their own promises, defining their own processes. And yeah, the golden path can be offered by compound promises via the platform team. So I'm just going to hand over back to Chris. Yeah. So key takeaways I'd like you to take away from this presentation today. I probably went over it far too quickly but the slide that showed all the steps and all the processes, that came about through engaging with our customers. It actually came from one of our customers and we went through that process, we followed it, we felt their pain. We empathised with them when we went through that process and validated it and now we're trying to do something about that and I heard some people talking about that earlier on this afternoon. So you can kind of relate to that. Another thing, embrace different thinking and different doing. A lot of those type one and type two patterns that teams are doing at the moment are DevOps. And a lot of what we're talking about today is GitOps. Thinking about how to bake things in, thinking about how to simplify, reduce that cognitive load by platform teams baking that in, taking that need for developers to do that away from them and giving them something that they love, they use and they enjoy. And then the third one is don't boil the ocean. You know, start small, simple things. Don't try and change everything, but just try and get something up and running that you can then demonstrate the value of the platform. You can get buy-in to the platform. You've got some evidence there, some examples there that people can start collaborating on, they can look at the code, they can start contributing to that code and then they can actually start adding new features and working with you. I think that's it really. Time for questions. So a quick question. In a bank where you have lots of siloed sources of knowledge, you've got your database team, your middleware team, how do you get them to buy-in to the platform? How do you get them to build those promises that other people can consume? Yeah, so we've... It's on now. So we've started working with our platform teams we've brought them on the journey, we've taken almost a train, the trainer approach with our platform teams, we've taken some of those into a feature team that our leadership is funded and we've helped them on their journey of learning, discovery, we've helped them, working with Sintasso, we've done a lot of pair pairing as well, pair programming, get them up to speed and then in the next PI, they're then kind of the focal point of the team to then expand that out into that wider team. And so we've brought in different teams whether that's the observability team, whether that's some of the cloud team, whether it's some of the database teams, we've brought them together actually working on some real promises. The beauty of the Crattix model is they're like Lego building blocks. So a promise is just like a building block so we can put them together. Some of the things that we've talked about today about it's the platform team's responsibility to create those in the API. Well that's what our platform as a product team does but they're also kind of guiding and mentoring those platform teams that are developing the individual promises and then the platform as a product team wires those together to create those APIs and those products and those patterns for people to use. So you get a lot more collaboration, a lot more deeper collaboration because you're bringing someone into the team and working on them but then you're getting that expansion as well through the organisation into their home kind of teams and they start talking about it, they start doing it and then other people hopefully over time will start actually contributing to that. So we've got some objectives for this year. I mean we're right at the, not right at the start of our journey but you know we're in the early stages of our adoption and we had a call on Friday really wanting to talk about how we expand this out through the whole of the hosted solutions division that I work within, how we get all the platform teams onboarding, how we get them doing some promises at the end of the year, every single team and meaningful things made available for our customers. We've been engaging with the customers as well and asking them what they want so we're trying to bring all that together through this initiative to just make it easier for people to consume and ultimately get products out to market quicker, cheaper, better for those platform teams that actually need these hosting solutions. Sorry, last question I promise. So family that sound like you need to build an internal developer advocacy and developer evangelism I guess within the group, right? But do you need a starting point before you start evangelising to the other teams? So in true proper style, we've got lots of starting points, we've got lots of teams trying to do the same thing and it's how you corral that enthusiasm together. We've got brilliant leadership who set a lot of the direction and we're now in year two kind of year three transformation on how we want to align our whole division and call it DigitalX and we've got a brilliant team Enterprise Engineering that work with us the other ones are actually pushing ahead with a lot of the developer experience they're pushing ahead with a lot of the backstage side of things the GitLab adoption we're pushing ahead with the Crattix stuff, Crattix and backstage work nicely together so you know by collaboration and talking we're working on this I got an email on Friday from a presentation Derek and I did on Thursday to our infrastructure as code community and it was from the security team actually asking well can we do our vault onboarding now working with you guys using Crattix, right? So we had someone else in that presentation it's a business unit, it's our data business unit and they said well we're working on some technology we want to expose that to our users, could we use Crattix to do that? So we're beginning to see the early kind of green shoots of people seeing Crattix, seeing what it can do and thinking about how they could use that how they could contribute to that that's really how we want to grow this we've got a lot of different people talking a lot of different conferences about our open source approach and what we're trying to contribute we're members of FINOS we're trying to use events like this really to talk even to ourselves about this is what we're doing internally come and be part of it hi over here, I've decided it doesn't really matter really interesting talk I'm kind of curious how far do you see your platform going do you see it going to the point where you're actually managing things like AWS accounts or GCP projects or Azure accounts as well so one of the first promises that we actually have been working on is our account machine process but we're looking at that to embed it we can make it available for developers via the developer portal so that they can just go request that instead of going through the current process and that will definitely make it quicker but we're really thinking about how we bake that into some of the products and the Intuit guys that were talking earlier on about the developers not having direct access to the platform that's very much where we're trying to go for the type 3 patterns we've probably got just say it's 80% of the business don't have those engineer teams with those terraform skills, you know we've got some brilliant teams like our M platform team that looks after all our customer facing websites and does phenomenal work there but we've got teams that have maybe only one or two members in that team and they want to do single page web apps and they want simpler internal things that they want to do, they don't really need to learn about AWS, all they want to do is publish content so we're going to build all that into a product for them to use because that's actually quite a popular thing that we do already on our platform as a product, platform as a service platform at the moment same with micro service publishing and several other things that we put on that platform how do we start doing those and spread those out to public cloud, that's what we're trying to do and then we'll manage those accounts and those services they just manage kind of the consumption and the actual application part of that that was a very nice segue to my question oftentimes there are people that come with one or two members and they say okay I want to start with a simple web app and they go with the self service approach after a few months they come okay my requirements have changed, now I want to build X or add on to this now you don't have that big capacity of a team where you are supporting that team for every requirement that comes into play have you come across this challenge and have you thought about how you would scale at that point so I think that's part of the challenge we're trying to address you know in the old pattern model we came across that we would have a pattern and then a new application would come along from some other team and it would be a dash application name kind of copy of that with some subtle changes we're now trying to address that and you know I had on the slide customization is the enemy we're trying to get away from that customization we're really trying to minimize we don't want 135 patterns anymore if you think about AI coming along it's almost like a tsunami of new unknown patterns that are going to hit us so we're really trying to move towards more of a documentation at the end of the pattern you know documentation is code so that as part of building this as part of people using it the documentation is there and if all that documentation is there and we make that a really easy path for them then we should recognize all those different variances and we should be able to kind of steer the teams towards these things that will actually do the work for them and explain why it's better for them to do that than try and come up with some other pattern I think just to maybe add to that as well on the critic side what we show using the compound promise using the building blocks is that one team is actually consuming other teams service via an API so you can change what is happening there so I think segue the next step on the demo would be what happens if there is a new mandate that every single deployment needs to have HA and other characteristics like other things the networking team that owns that promise can easily apply that and get that update rolled out across the fleet I think that's kind of what would help with that as well like requirements change Hello, nice presentation thank you very much for that so a couple of questions how do you deal with some components that are very secure sensitive in terms of security like DNS or fire or whatever and not all the teams so the application team should have access to them and what happens with the governance I know you're a bank you're heavily regulated with governance and the procedures on how to deploy things how do you deal with that do you have a proper processes or yeah so a lot of that in the moment patterns describes those processes and those security controls that you have to go through and we have different parts of our organization different teams and kind of platform teams create some of those controls that everyone has to apply to say their public cloud or the private cloud stuff we already have that right we're very successful in DevOps at the moment so how do we take that and turn that into Crattix promises how do we maybe simplify some of those controls that we've got that were guardrails for how people do engineering in public cloud we're now working on that how do we get those kind of smaller simpler as part of the products baked into the product rather than something that's separate maybe there's a bolt on that's one thing that we're doing at the moment just to add to that as well the Crattix promise the workflow bit is that a lot of those automations about compliance billing notifications security scanning all those things can be incorporated into the product so when the user requests something as a service it actually goes through that series of steps that are like built by the team that is built in the promise or provided by another team one part in WC as well is like you have a security team that builds a stage in the pipeline and what they ask is can you incorporate this stage into your promise because this needs to happen for me to expose a service via the internet for example so I think that's how those things fit together as well Thanks Eric Thanks Chris Thank you


So this question basically is assuming that the food is halal Miss, it's correct. The meat is heavy and everything Only that the location serves alcohol. Correct. Now If you're asking me just on a minimum basis the basic ruling about it if it is a Halal dish You are eating on a table where alcohol is not being served Technically, I would say it is permissible but on a Moral ethical level spiritual level, I would say you know Why even bother to go to a place where they are serving alcohol because Contamination is a problem You know, how do you how can you be satisfied that things will not mix with one another Especially when you talk about the greater Toronto area, Mashallah, you know You people don't realize that you're so lucky There's so many, you know Halal okay Restaurants in the city that we don't have to worry about Dark full places on the same note the same question and topic according to say it's his tani's rule He mentions that it is permissible. However, there's a clause there In which he mentions that if it's going to take your image so to speak then it becomes haram Can you please explain the latter part of that? Well, there is another issue related to it that if you frequent a place Where there is halal food, but also alcohol being served and There is a danger that your Reputation can be tarnished When people see you going at that place then So it's nothing to do with the food haram and halal It's more about frequenting a place Which can have a negative? reputation on you and That's what you should avoid Reputation by somebody else looking at yes Yes, somebody else looking at you and assuming that knows of Allah. You are going there You know for alcohol I see Hassan, okay? Any questions on the gents side in the meanwhile will answer this question Can you please put your hand up again? Let's go ahead


Just like we happen to have sort of chained conditionals where we may have multiple types of criteria We also can work off of Compound conditionals and the entire idea here is now when I look at say that if statement I might want to have one thing be true and Something else to be true Only when both of those conditions are met will this statement be true or as you can see I can also say something like or And in this case, I only need one of those statements to be true some great examples of this would be something like let's say I'm at the vending machine. So here's my weird-looking vending machine with its buttons Little dispenser units fill that in a little bit and then the crazy. It's got it always like that soda And Here's where you put in the money Okay, well the entire idea if you think about that vending machine is I'm going to put in some amount of money $2 right and dollars So does normally a dollar 25 Okay, well what I need to do is I need to also know That the vending machine is in stock if it's not in stock. I'm not going to get a soda So in this case. Oh, well, I'd need to do two separate checks if The soda inventory in the vending machine is greater than zero in this case. It's 20 awesome L or and and is not just the fact that the vending machine is you know more than Zero that doesn't know that that doesn't give me my soda and Subtotal is greater than the cost of the soda again dollar 25 for this if that's the case I can go buy a soda and I can even do some more work off of this soda inventory minus Equals one and again what that will do is? reduce Inventory by One Okay, and so that entire process can just continue to repeat and so another person could come in and try and buy a soda And so on and so on again We could also reduce or change what Subtotal is after that point as well But again, that's the idea of an and statement two statements must be true must Be true Then we also have something like account creation Well, if we think about this for a second you had to sign up for typos or you have to sign up for almost anything these days What are they gonna do? They're gonna ask for you to type in your username or your email address and then when they ever ask you for a password They're almost always asking you to type it in twice Well, why is that? Well, again, it's a to make sure that you type it in correctly That way you don't freak out and do a forgot password request or something like that But if we were to create your user again, we would do some checks We want to make sure that a your username Was not blank you didn't just do a blank username and that the words you typed in for your password or you Not the words you shouldn't use words. That's a dictionary anyways The key the characters that you used for your password were the same for both times you typed it in and if not You know, we'll give you a little command on the website that says invalid or your passwords didn't match or something like that So again, it's just another example of two things needing to be true Then we think about something like the or command The or command basically states that one of these things has to be true They don't all have to be true, but one of them does so let's think about this in the idea of I wanted to get Whether or not you wanted to play again. You we built a computer game. Do you want to play again? We check whether or not you said yes or no. Well, if you can see I Do a few checks because the user If we think about asking a user to type something, they're not going to type exactly what we want They may type yes with a capital Y. They may just type a capital Y They may type yes with all our cases. They may even go. Yeah, cuz I Don't control the users But all we would then need to do is again just do a play again Equal equal Yeah Now with that in mind very important here. You have to make a command Separate each one of these has to be separate This is not going to work play again equals. Yes, or yes, or yes That does not work and even just to see this in action. So let's say again play Again equals Yes, or why if Play again play again equals yes or Yes, or Yes We'll say Let's begin Okay, now more to my point when I run this code It's gonna say let's begin. Oh, that means that I Magically, you know, it works, right? Well Technically no Let's say for example. They said no in this situation. They don't want to play again They've I don't know it's a casino and they've lost all their money. No, I don't need to lose any more money Let's keep playing right the issue is specifically that this This or blank if we once again think about this as Everything with each one of these oars needs to be its own conditional statement realistically what we're saying is if blank or blank Or sorry if blank or if blank or if blank When we do something like if Why Right that command is True no matter what it will always evaluate this as a true statement and so it does You know, it it will just never work in our case.  No, I don't want to play again Well, this was not true and this was not true and this was not true So all of this gets evaluated out as false. We skip over it else. Goodbye And just to change that up now when we say yes or the why well only one of these Conditionals needed to be true. This was not true This was not true, but this was true So at least one of our commands whether it were true. We then go in to say print. Let's begin


All right so we got us a geothermal here. This is a pretty good size unit. We got floor loops basically is what this thing does to keep the garage area warm through concrete floor. And then we got our recovery tank here. So what we're doing is we've got a compressor here that's acting up. It's running but it's not pumping. So they're doing a lot of work outside. So let me go and get this door off here. All right so here's our compressors. Basically it's not wanting to pump the way it should. The amperage I had prior to on previous checks was around 41 to 37 amps. Now I believe it was around 16 amps area. I tried to reverse and then I tried to change in the phasing. None of it made a difference. Charge is fine. So we're going to go and get this thing recovered and we're going to get this thing changed out. This thing is capable of running in both modes but because it is water to water generally you don't cool the floor. So it's never going to run in that mode. So we're going to go ahead and get this thing recovered. Okay well I can probably weasel this thing out but I'm going to have to weasel it back in when it's all said and done. So we're going to make use of my little lift. All right once again I forgot my freaking bracket. I keep forgetting I need both of those L channels. One in the receiver and one on the pipe so that I can get a 90 degree bracket off of that. So say the least it made it work. Not probably the best thing in the world but it did work. So I got it out of the way so I can get my recovery machine and stuff out. I'll go ahead and get started. We're just doing it off of liquid line slash discharge line. You can feel it definitely coming through cold. You can say it's shaking every now and again so you know it's pulling liquid. You hear the machine kind of chugging a little bit before it starts dripping limit. If it starts dripping they have to pull out my cooler. This is about 14 pounds, 15 pounds, something like that. I've got a chainsie liquid dryer on this thing too. This thing is never going to run in the reverse mode so it's a standard direction dryer. So we got that in there. That's going to go in here on top and you've got to get that replaced but it could be a fairly easy one to get done. Everything's right in the front. It's convenient. I think the main thing I'll have to do is undo the connection here on the reversing valve. One of these fittings right here plus there. We'll have to remove our pressure switch so we don't melt it. I've done one of these once before. It wasn't too bad. I didn't even change that reversing valve. That was a lot of fun. Fairly decent size reversing valve. All right we're going to change this bleed valve here, auto bleeder. Going to valve it off there and obviously right there. That'll isolate it because it literally just comes out of the top over up and then boom. So we're going to get that change. That was not working well. So we got our new one ready to go. It's all primed up ready to roll. Just need to get the splash here. About 15 pounds of pressure. Come on baby. There you go. Leak a little bit. There you go. Come on. There shouldn't be that much. Come on. I guess it could be that expansion tank fight. And there it is. See if that helps. That's the problem. Expansion tank was screwing me. There we go. Now this one here can be tore apart and cleaned, which would be kind of nice if you ever need to clean it up. I think they're a little bit better quality. Open that back up. There we go. This valve won't get exercised ever. There we go. Got that change. Just got to label it yet. Make sure the cap's loose. That'll help out a little bit. It didn't lose any pressure, which is nice. That makes it a little easier to get into the side of it. Right in there. Here's your coax coil. One of them. The other one's back over in that corner there. The filter dryer and stuff's up in here. Let's get this thing purged out with some nitrogen. Get this thing unbrazed. Got them labeled on that there, so we've got it ready to go there. So I forgot my GoPro, and I don't have the tripod, so this can be a little hard to record, so you're just going to have to trust me on that. We're just going to probably undo it here and down here and then slide it to the left. That way I don't have to jack around with anything up in here. It won't be putting any heat on any of that stuff, so it'll work out fine. We do have our nitrogen flowing like a river, so you can feel it coming through. All right, so we got her out of there with my tip here. It's the number 15 by UniWeld 17-15. I have had nothing but problems with all this tip backfiring. I have made sure my acetylene and oxygen is set exactly per spec. 12 on the oxygen and 10 on the acetylene. After cleaning it with my brushes, and the brushes didn't do no good, so I washed out with water and then blew it out in nitrogen after that, and it actually started to work, but I don't like it when she backfires like that. It's kind of dangerous. So anyhow, got it out there, didn't take long at all, so I'm just going to yank this thing out. Like I said, we've got the nitrogen rolling there, so far so good. All right, so we got it out pretty much no problem. Just wiggled her out. We kept the back ones loose and fed that suction line up in there. I've got my fire script there to kind of hold it so it doesn't pop out on me when I'm trying to braise it in. All right, and this here is the fun part. Basically, it's all wrapped in all this flammable insulation. So we're going to cut what we can cut and unbraise what we can unbraise. Kind of put some shields in here and get that thing removed. All right, so we went ahead and got our hot block out. We've got it wrapped completely around the valve, which went ahead and wetted it a little bit. Sometimes it's a little hard to form it the way you want, so just add a little bit of water to it and form it in there and wrap it all around that one side to block the heat from getting to the valve and it should be okay and good to go. Otherwise, I'm going to put extensions in here to make up for where I cut it out at. This is not a burnout. It's just a defective compressor. It's not pumping correctly, so the inefficient compressor is our issue. So we're not really too concerned with cleanup or anything like that. We're just mainly wanting to do good practices. So that's what we're doing right now. So we're going to use the insurance pads. I've been using these for years. So I've got one wrapped around there. That one's wetted. This one's dry. This is going to just catch any over flame, basically, that might be out and about, but we're going to use that to isolate it. All right, so we was able to get in there. You can see the nitrogen worked. And the same thing over here. Not that I need you to verify it for me, but I can't quite get in there and get the perfect light necessarily in the studio. So I added a little extra water to my hot block air, which it did great. So we're just going to go ahead and continue purging through here with the nitrogen, get this new dryer in there, and we should be good to go. Okay, so now we're basically going to make sure we're on the right direction here for this dryer. So we're coming out of the hot gas discharge. It goes through here. It goes all the way back to the back. The backside is our load. So we're going to go through this coil. We're going to reject the heat into that water coil. We're going to come out of it now as a liquid, then into the TXV. So our flow is going to be coming this direction. And then that's the TXV for the other side there. But you can kind of see what we got going on here. All right, so we got it all insulated back up. We used most of it. Used foam tape for the rest of it. Got it in there. Now it's time to pull a quick vacuum. It started to evacuate here. So we're going to see how long this takes to get her down. This, I'm pretty sure it might be about a 15 ton. It says 137K down there. So we'll do some math on there real quick. It comes out to about 11.4 tons, but it wouldn't doubt it don't round up to maybe 15 with the efficiencies and stuff. So anyhow, like I said, we got everything changed. We're just now starting to pull the evacuation. This compressor actually has a cyclast down there, which you'll be able to see. The bubbles probably are the oil boiling. If we actually start getting a little lower, it'll probably make more of a difference. But she's going down there real quick. Just got to finish getting that last piece of insulation on there. All we had to do is re-braise it here and there and then at the dryer. Everything else is good to go. All right, so we're back here again. Let's go ahead and take a look at our temperatures. So we've got our gas discharge coming off the compressor here, 30 something. This is not real. Between here it's one to the right. So we'll go ahead and other compressor effects are going through the, see it's hot there on the left, cold on the left here. They're opposite. So we've got about the same temperature going through. Let me give you a little. Okay, so we're getting our bottle prep because we'll recover this thing. I've called the factory multiple times and they're hiding in a cave somewhere and can't answer their phone. So I'm going to go ahead and just get this thing cut out. The hot gas discharge comes off the compressor here, comes into the reversing valve. Like I said, I compared it to my other ones and the heat has been coming out on the left side. That's the easiest way for me to explain this. This one here has been going out on the left side. If you follow the piping, it comes through here. It goes all the way to the back. So when you walk around to the back here, you can see right there is your reversing valve up there. You follow that pipe right here, comes up, comes into the back side here of the water coil, comes in there. You can see, boom, comes into there, the distributor goes down, back up, down, back up, comes out up here on top, goes across to here, then through my filter dryer right here, which is what I just replaced and I had it pointing that direction. Then it goes to the other water coil, which is your source side. So our load is back here. So we want the hot gas to come into the load side of the coil. So we're just going to re-pipe around it. This is for the radiant heat in the floor. It never is going to try to cool the floor with cold water. So we are just going to get rid of that and move on down the line because the compressor's new. Like I said, my amperage before was somewhere in the 40, some amperage. I end up having like 16, the new ones, at least 26, 27 amperage. And I think we've got something going on with the reversing valve. What I believe happened was that it probably overheated the compressor. How the case that is, I don't know, but it was not a burnout. And basically, at this point, we're going to go ahead and just get it changed. There was no way to have known that because if you listen to it, the reversing valve will switch back and forth. But at this point, we're just going to undo it and get it removed. It's not necessary and we'll get them back up and going. So we went ahead and got the reversing valve cut out. Like I said, got that in there. Just was able to get away with 190 there, reducing fitting there and a piece of 7 eighths and a new 90 here on the elbow. Works perfectly. Works perfectly. The amp drawl was pretty much exactly the same as it was before. Now as it built up head pressure, it got up to around 30 amps and it was equivalent to what the other unit was running at. But as it built up even more head pressure, they both started getting more close to what I had originally. So basically had a bad reversing valve, which I would say the recirculation of the gas. When you look at the reversing valve, it don't look that bad, but it must have been dumping on itself some and it definitely didn't help it none. There was a lot of oil in the piping here and stuff. All right, that's going to wrap the video up, guys. Basically, what I ended up running into was a reversing valve and a compressor that was inefficient. Don't know if you caught it or not when I was describing things, but my previous amp reach on the old compressor was around 16 amps as it was acting up. Prior to that, I had as high as around 41, 42 amps area. So even with the new compressor, I had 26. So I had almost a 10 amp difference in a higher than what I had originally. So I would not agree with anyone that says the reversing valve was the only issue. Otherwise, it would have acted up the same way with the new compressor. They were the exact same model. Only thing different was the last three digits, which is a production thing. Otherwise, it's the same compressor. I didn't get a show it in the video, but when I did use the reversing valve and test it back and forth, it made the swish noise as it went from one side to the other. I did chop it in half and take a look inside here, or I should say I chopped it open to kind of look and see if I can move the switching mechanism back and forth, which I was able to. And even in the testing that I was doing, you could hear it swish back and forth. No problem. And it sounded normal. I did that multiple times in hopes that maybe it was that I tried even reversing the phasing of the compressor, thought maybe something weird had happened with that, but none of those things did anything to help me out. So I'm pretty confident in the fact that the compressor was inefficient. Why? I'm not 100% certain. I didn't tear the compressor apart, but it is what I needed to do to make the system run. I did have one setback with the reversing valve being an issue, but that geothermal will never need that reversing valve anyhow. So it's gone now and it's one less thing to have to worry about. So just for those new guys out there that are kind of getting new into the field, here's a reversing valve. This is kind of a little bit larger one than what you'll see in say a residential setting. This one here basically is the same. They're all the same. Nothing changes. Your middle is always your suction. Your opposite side here is always going to be your discharge gas.  So it's just going to be here to here or here to there. And then when it shifts over, it allows the gas to go one through here or let it go through here and go around that inside there. So it's not a whole lot too to them.  They can be a little difficult to diagnose sometimes if they do what this one did. Sometimes it's pretty obvious because they don't transfer back and forth the way they should or they don't transfer at all. Basically all it is, you have electric solenoid here that controls a valve mechanism here. It's using the discharge gas to push it this way or that way. And it relieves the differential into the suction here. That's it. Nothing much to it. So that's a reversing valve guys.  You don't want to overheat them. But then this one here, this is the second one I've had to change prior to this one. I actually seen the Mylar plastic that helps seal it was kind of coming apart. Now what I'm wondering is this thing probably never was ran in the other mode because you know this one here is for in floor. Now if they were using it for say, you know, air handlers or something, I could see it being switched back and forth quite often. And that's what the other one was that I repaired or replaced was that piece had worn out from all the switching back and forth. What I kind of wonder happened here is if that's got enough of a gap because you can hear it, that you know that maybe it just wasn't sealing very well and it was bleeding by, you know, raising your suction up, dropping your head down, you know, that kind of all goes along with it. They're like, I don't know if I mentioned it in the video, but there was a lot of oil up in this piping area a lot. You know, it was laying pretty thick in there, which tells me, again, we had lower flow than normal. Otherwise it'd be coming back. I mean, it just, it seemed like a lot more than what I would normally see in there. So if you guys like the video and you want to see more like it, please consider subscribing. Also want to remind you on Sunday evenings at 8.30pm Eastern. I'm doing live shows where I go over some of the videos and have basically a hangout time. If you guys want to hang out with us, love to see you there. But as for this video, until next time guys, we'll catch you on the next one.


I took so many great classes but the one that really stood out I believe it was in my final year and I took a class on leadership. I loved it. It just it opened up so so many windows to better understanding management in a public environment and just being an effective leader. And I'm just going to go back to my leadership class. I don't know the specifics but when I do come across the the name or the teachings of a particular author that we studied I am reminded of of what I learned in that class and I think Venice is one that brings a bell but what I learned in that one class it just really it it really helped me put it all together and bring it to the profession. You know like any other system we've had a few but nothing like you're hearing about in the news. I mean we're talking about what our response should be will be has been but that's an anticipation of something happening. We hope we don't ever have to put any hard core things into place but we need an association to support the initiatives that are needed statewide. I mean in Sacramento we are we aren't well funded but we're better funded than a lot of other libraries and we have a large enough staff where we can make a lot of things happen. In my little hometown of Loomis it's a single library. They need resources so if you don't have an association that helps fight the fight at the government level and helps keep the entire industry in our state informed and trained then it's not going to be a profession that really holds true into the future and it does it cost a lot to be a CLA member and these conferences are so important to bring people together to learn new things so yes it's important to be a CLA member and I love that the iSchool offers that your first year because that's its prime in the pump. My reason I chose SJSU A it was affordable it was accessible and it was completely online and living in the Sacramento area during the great recession entering into a new profession it just it ticked all the boxes and so when I started getting involved in it the next great thing I discovered was that entering into this digital world I was five steps ahead of a lot of my colleagues because I was constantly in it having to learn new platforms having to communicate effectively in teams online so it was it was even more than what the class has brought it was just really the the platform the experience now of course today we're all kind of used to it but in 2011 it was it really gave me that extra boost in the career that was an unanticipated benefit


Welcome to this session on solving simultaneous equations. Simultaneous equations arise on many occasions in mathematical and scientific analysis. In order to represent these equations we will use multidimensional arrays. But first let us quickly look at what we have studied already. We know that an array handles a set of values of the same type declared with a type and size and the elements of an array can be accessed by using index expressions which must evaluate to a value between 0 and size minus 1. We now look at multidimensional arrays also called matrices. A matrix is actually a two dimensional array. We can in fact declare in C plus plus arrays with more than one dimension. A two dimensional array would be declared in this fashion in A 50 40. Note that two dimensions are independently defined in terms of their sizes. So, this effectively means that A is an array containing integer elements. It has 50 rows and 40 columns. Each element of this two dimensional array is accessed by a reference which will now require two index expressions. So, for example, A i comma j will mean i th row and j th column element. Suppose its value is 3782 then the i th row j th column element will have will be assigned this value. We note that row index i can have a value from 0 to 49 because the size of the first dimension is 50. Similarly, the column index j can have a value from 0 to 39 because the column index can vary between 0 to 40 minus 1 which is 39. Naturally, all rules for index expression apply to index for each dimension. We use these two dimensional arrays now to represent simultaneous equations. To begin with, let us look at some simple algebraic equations. All of you would have solved them in your high school algebra. Consider 2 x plus 4 y equal to 8 as equation 1 and 4 x plus 3 y equal to 1 as equation 2. The objective is to solve this system of linear equations and find out the value of x and y. To begin with, we look at how we can represent these two equations by using a matrix. Suppose we choose to put the coefficients of x and y in both these equations in a matrix in this fashion. The first row represents the coefficients of x and y in the first equation. Second row represents the questions in the second equation. We then write a vector or as one dimensional array x and y and this is equal to the right hand side which happens to be 8 in one. In fact, those of you who recall the matrix operations will know that this effectively means 2 multiplied by x plus 4 multiplied by y equal to 8 and 4 multiplied by x plus 3 multiplied by y equal to 1. We all know how to solve this, but to consider a specific method which actually generalizes and systematizes the normal solution process is known as the Gaussian elimination method. This method uses two important properties of linear algebraic systems to solve such equations. The first, any system of equations is not affected if an equation is multiplied by a constant. What it means is, if I have 2 x plus 4 y equal to 8 as an equation and if I multiply it by any value, say 0.5 to get 1 x plus 2 y equal to 4 as equation 1 prime, both these equations actually mean the same thing and therefore, the total system of two equations does not change at all. Observe that 0.5 is not an arbitrary number. We have chosen it such that the coefficient of x now becomes 1. We shall comment on it as we proceed. With this change, we now have the same system of equations, but in this form 1 x plus 2 y equal to 4 as equation 1 prime and 4 x plus 3 y equal to 1 as equation 2. We again represent these equations in the form of matrices that we saw. So, this system naturally translates into a two dimensional matrix having 1, 2, 4, 3 as elements, x and y as a vector and 4 and 1 representing the right hand side. The second important property that we utilize to implement the Gaussian elimination algorithm is, if an equation is replaced by a linear combination of itself and any other row, the system of equations remains same. So, basically we are trying to transform the system into an equivalent system, but the new system should be more amenable to find the final solution. In terms of practical usage, we can multiply equation 1 prime by 4 to get 4 x plus 8 y equal to 16. Now, if we subtract it from equation 2 to get a new equation 2 dash, let us look at this operation. Equation 2 was originally 4 x plus 3 y equal to 1. After multiplying equation 1 prime by 4, we have got 4 x plus 8 y equal to 16, which we subtract from equation 2 and get a new equation 2 prime, which happens to be 0 x minus 5 y equal to minus 15. Notice the importance of the choice of 4 as a multiplying factor and the operation of subtraction, so that we get the coefficient of x as 0. If we now write the two new equations that we have, which represent the same system, we have 1 x plus 2 y equal to 4, 0 x minus 5 y equal to minus 15, which is represented by this matrix, this vector x y and 4 n minus 15 as right hand side. Observe that this matrix has undergone change, so has the right hand side. Also observe that the matrix has undergone very important change. You have 1 on this diagonal here and you have 0 here. Let us look at further operations. If we multiply equation 2 prime by minus 0.2 or equivalently divide the whole thing by minus 5, we will get 1 x plus 2 y equal to 4, 0 x plus 1 y equal to 3. Notice that we are following the same rules and therefore, this system is same as the previous system. But now the matrix is 1, 2, 0, 1 and the right hand side is now 4, 3. We call them equation 1 prime and equation 2 prime. Now you will observe the importance of all the operations that we have done. Notice that these two equations can be looked backwards. First we look at the last equation, 0 into x plus 1 into y equal to 3. This directly gives us the value of y as 3. Next we use this value of y equal to 3 and substitute it in this equation. 1 into x plus 2 into 3 equal to 4, this is called the back substitution. This gives us x plus 6 equal to 4 which in turn gives us the solution x equal to minus 2. Notice that having transformed the matrix by such permissible operations into a form where we have 1 on the diagonal, 0s below the diagonal and some numerical value above the diagonal reduces the system of equations to a form where we get the solution for the last variable directly and by back substituting we can successfully find the previous variables. The essence of this method is to reduce the coefficient matrix to what is called as an upper triangular matrix. That means all elements on the diagonal are 1 and there are non-zero elements on the higher side of the diagonal. Then we use the back substituting. This process is of course susceptible to round off errors when your system is very large. There are other variations which tackle such problems. We will of course not go into those details but these are just the names such as Gauss, Jordan elimination, use of pivoting, l u d composition etcetera etcetera. In fact, there is a huge amount of literature with lots of useful algorithms which solve these and similar computational problems involving systems of equations. A very useful reference is the numerical recipes in C plus plus written by these four stalwarts that also written similar numerical recipes in C and Fortran earlier. Coming back to generalized simultaneous equations, a system of linear equations in n variables we now can represent by the following matrices. This is one matrix which is an n by n matrix. The coefficients in the C plus plus style are a 0 0 a 0 1 a 0 2 2 a 0 n minus 1 a 1 1 1 etcetera etcetera and the variables are named x 0 x 1 x 2 x 3 x n minus 1 which are naturally elements of a one dimensional array containing an unknown variable. This represents the right hand side which are standard numerical values again making a one dimensional array. The Gaussian elimination technique will essentially reduce the coefficient matrix to an upper triangular form that means we will have 1 1 1 1 on the diagonal. We will have all 0's on the left bottom corner and we will have non-zero numerical values which will represent the modified system of the equation which represents the same system anyway because we would be following the rules which are prescribed. Remember that the right hand side b 0 b 1 etcetera etcetera will not be original values but these will also be now modified based on the computations that are performed in order to do this transformation. But once we obtain this then it is easy to see that the last variable can directly be determined by using b n minus 1 and by back substitution successively we can actually determine all the other unknown variables. In summary then in this session we have examined the properties of a system of simultaneous equations in many variables. We have understood how matrices can be used to represent such systems and in particular we have studied the Gauss elimination method of reducing the coefficient matrix to an upper triangular form so that the system can be solved very easily. In the next session we will attempt to write a program to implement the Gaussian elimination technique. Thank you.


This is a skimmer that was just recently taken off an ATM This is more of a two-piece skimmer This first piece is the cap that goes over the card reader where you insert your card in here same exact cap That's on the ATM that this is removed from so it blends right in on the back here You'll see the inner workings of the skimmer This is the second part of the two-piece skimmer this plate goes over part of the ATM Which matches up pretty much exactly like what's on the ATM the pinhole camera on this fascia plate is right in this area On the back it also has the inner workings of the camera system This is kind of a two-in-one skimmer. This is just a basic plate that goes over that reads the card It's got a pinhole camera down at the bottom. So as you're inserting your card, it's triggering in that camera It's watching you punch in your pincoat and then the back here is the camera and the inner workings of the skimmer With the memory chip those are some of the things you need to be aware of when you're using an ATM


One year ago in the semi-final game, Mini Ha Ha and Pierce met for a trip to Target Field. The Red Hawks won that battle for two and then the state title over Bell Plain. Fast forward of this year and the rematch is set. This time the championship game at Target Field. Pierce, Mini Ha Ha who will be crowned the class two-way state champ. This season the defending champ struck first though, John Goff, drills one to the gap right center. RBI triple puts them up one nothing. The offense looked like he put Pierce away early next inning. Alex Stevenson over the center field there. Mini Ha Ha goes a four sip after three but hold on a sec, here comes the pioneers. Brandon Dignan puts it in play. Runner safe at second. Run scores from the third to get them on the board. Then they break out in the fifth. Lane Gertz base hit. RBI double just like that. Pierce only down by two but the biggest at bat comes later in the inning. The other Gertz. Luke with two outs that gets to the grass. Two score, we're all tied at four. A piece stays that way the seventh. Mini Ha Ha's offense strikes again. Noah Denny brings home a run base hit. They add a pair to go up six, four. Last chance for Pierce. Tying run on second, two outs but Ben Teeson gets Dickman looking for the winning strikeout.  Mini Ha Ha though, your back to back state champ. Six four, Pierce finishes second, 26 and three on the season. Kids, that's how they do. They battle, battle, battle. It doesn't matter the score, who we're playing. We won three, one, nothing in the games and playoffs and it's not ideal to be known for nothing in defending state champs but I truly was confident. These kids have done it over and over and over and sometimes things don't go your way. One play can change a whole game early on too just momentum and they came up with clutch hits and we didn't have the clutch hits that we needed to come out with a W. It was a fun game, we both battled back and forth and just being here is unreal and it was a good, it was a moment I'll never forget. The old tournament team announced after the game the pioneers get three all seniors, Lane Gertz, Matthew Tautschis and Matt Comet. If you've enjoyed this segment of Lakeland News, please consider making a tax deductible contribution to Lakeland Public Television.


There are different ways to determine the moisture content. Usually farmers don't have sophisticated equipment. They bite the grains and they have a feeling for how wet the grain is, but that's not a very accurate method. So there are also devices like this moisture meter, which helps us to measure the moisture content, but they are very expensive. So this unit, for example, costs in the market between $200 and $400, which is far too expensive for a single farm or even for usage in villages. So because we believe that being able to measure moisture content in the villages is very important for the farmers to maintain quality of their grain and also to get the maximum profit from their sales, we have developed this, we call it the low-cost moisture tester, which is basically using the same principle like a commercial moisture tester, but it's basically only contains the minimum functions and therefore can be very, very cheap. The way this instrument works is that instead of having a digital display, it just has the indicator lights. And the lights basically give an indication about whether the grain is wet and needs to be dried, indicated by the red light or whether it's significantly dried for storage, which is represented by the green light, or whether it's dry enough to be stored as seeds. So seeds need to be stored at the moisture content below 12%. So if the yellow light is on, then the grain will have moisture content below 12%. So this is a commercially available moisture meter. As I mentioned before, it costs around between $200 and $400. And the low-cost moisture tester, at the moment, we can sell for $55, which is around one eighth of the commercial moisture meter. And if the local production will increase in numbers, then there's potential to bring down the price to $35 or less. So this is significantly cheaper than the commercial unit, and we believe that at that price it's in the reach of farmers, groups, cooperatives, and will enable farmers and people in the village to measure the moisture content more accurately. One of the big advantages they will get from that, beyond just being able to maintain their crop and save the quality is also that they are in a better negotiating position than they have to deal with the traders because they can actually quantify what moisture content their crop has. I will demonstrate to you now how the moisture meter works. We have a little spoon here, and we put a couple of grains in, and at the moment I'm working with a sample that has 16% moisture content. So we put the grains in there, then we insert it in the moisture tester, and then we crush the grains using the screw. You can see it shows us that the grain is too wet to be stored safely. And from the pattern of the light we even can tell what moisture content it has. So if it's permanently red, then the moisture content is between 15% and 16%. I'll take another sample. People here should have around 14% moisture content, and we do the same. And you can see green means it's dry enough for safe storage, and green permanently on means that it has between 12% and 13% moisture content. Just to compare the Erie low-cost moisture meter with the reading of the commercial moisture meter, I used the same sample as I used last with 14%. So the principle is the same. You use a couple of grains, put it inside the moisture tester, and then we crush it, we measure, and it gives us a reading of 13.3%, which is the same result as we had with the Erie moisture tester. What you just saw is the Erie super bag. The Erie super bag is a storage bag for safe storage of seeds over a long period of time. And a precondition for safe storage is that the seeds go in there at low moisture content. And that's where the Erie moisture meter comes in. It basically allows the seed producer to quantify that the seeds are actually at the low moisture content that is needed for safe storage. For example here we have a sample of that seed, crush it again, and it is so dry that all lamps blink, which basically means that it's below 10%. So that would be safe for the storage of seed.


Thanks so much for your lecture, Dr. Phillips. At this time, we will open the floor for some questions. You can submit those through the Q&A feature and we will try to get through as many as we can. We have a few coming in and I will go ahead and open this up. How much iodinated contrast do we administer for CEM? So the dose of contrast is largely, so it's weight-based and so the actual dose is built around the patient who walks in the door. So we weigh the patients and the imaging units, you plug in the weight and it tells you what the dose should be. Often enough, institutions have a maximum dose that they administer, so our maximum dose is 150 ccs. ML, I should say. So I'm sorry, the weight-based calculation is 1.5 ccs per kilogram. If you work up in the asymmetry with CEM and see no enhancement, how confident can you be that the asymmetry is benign? Does it become by-rads three or by-rads two? So this is a really great question and it's one of the challenges of contrast mammos. What do you do with these enhanced, what we call now enhancing asymmetries, which are areas of enhancement on one view only. And the answer is, is really, you need to be concerned about it. I would not blow these off. So typically what we do now is you look at your low-energy images and you see if there's a mammocorrelate to help you figure out is this enhancement, perhaps it's associated with an area on the 2D mammogram that's been there for 10 years, in which case, yes, it's enhancing, but you're using the other features to tell you, no, no, it's enhancing associated with a benign by name. But if you are not able to get a low-energy correlate, then you would do a targeted ultrasound. But I would say you do not necessarily call it a by-rads three or by-rads two, you would want to work it out. And then if you absolutely have no correlate on your mammore ultrasound, then what we had been doing before CM biopsy was actually sending the patient to MR to further evaluate it. And now that CM biopsy is around, you can do a CM biopsy. Very rarely do I follow it. Can you clarify, does CEM only use 2D and not TOMO images? Yeah, that's a great question. So CEM is a planar exam, it's just 2D. So when the exam is applied, think about your 2D mammos and that's exactly how it's done. There's no TOMO sweep. There are people that are talking about contrast-enhanced TOMO synthesis where during the TOMO sweep, you're performing your dual-energy images. There are people that have studied that, but that's not available now. Got it. We've got two questions in the insurance reimbursement billing area. Can you speak to your experience on this? Do you have to get pre-authorization prior to performing? No. Okay. No, it's billed as a diagnostic mammogram plus the administration of contrast. So it's just a dive mammow and then the contrast often enough, depending on where you work, hospital or non-hospital related, you may or may not get reimbursed for the contrast. The contrast is roughly like $12. So at the moment, that is how it's billed and there's not typically an insurance coverage issue. I hope that I've answered, the people that have questions about reimbursement, I hope I've answered them. We all would like to get reimbursed more and have a dedicated CCT code for it, but that's not the thing yet. All right. Does the compression affect the enhancement? I think whoever asked that question, I'm interested to know what you're specifically asking about. So the degree of compression I can't answer, I can only say that a contrast mammogram is done where you administer the contrast of the patient sitting and then you do the mammogram. So the patient gets put in compression after the contrast is administered. That is how these exams are done. And so at the moment, it does not seem to impact our ability of seeing the enhancement. Now, I cannot answer the question about like the degree of compression and how it impelled me. In your experience with any surgeons, have they liked CEM versus pre-op MRI? Oh my God. Our surgeons love it. Every surgeon that I spoke into has loved it. And I think that the challenge, the reason why the surgeons love it is because one of the challenges of MRI is, yes, MRI is an amazing tool and I really don't want to diminish it because it's been an amazing boon for our field. It finds many cancers, but it also finds a lot of non-cancers. And these women are going for more biopsies, more stress, which is associated with more stress. And so our surgeons are really liking it because if we see an abnormality, we can do something about it. There are fewer false positives, fewer extra visits. And so they appreciate the ability to identify just what we need to know and not anything more. Surgeons love it. And it doesn't delay care. You know, you can do it right in the mammoth suite. Can we do dynamic contrast enhanced study, enhancement curve with CEM? So that is not a part of the exam currently. We do not do that currently. There are a number of studies that have looked at looking at how the breast takes up contrast or how a lesion takes up contrast over time to help us differentiate cancer from not cancer. That has not been included in our current interpretation of the exam. It's not as consistent as it is with MRI where you're looking at the breast, you know, you're looking at every portion of the breast at the same time, you know, at the same time over multiple time periods. What do you do with multiple small foci of less than five millimeters of enhancement? On MRI or on contrast mammoth? I think it's about contrast mammoth. So this isn't also an interesting question because with MRI, when MRI was started, there were a lot more follow-ups and the reason why there were more follows for this specific indication is because we didn't have the data to say, oh, this is just BPE versus not. And I would say at the moment, the standard practice for this is variable among practices and how comfortable you are. If you were to see multiple scattered enhancing foci, none of which stood out as being definitively different than everything else, I would just call it a by-rides too in background. If there was one that really looked a little bit different or if I couldn't tell, is there something here that I'm missing and I'm questioning certain areas then I would do a follow-up and comfortable doing a follow-up because I don't have the same amount of data, long-term data to say, oh, this is really just all background, being able to differentiate background from it, from an abnormal enhancement. So I would say the short answer is I am comfortable if I see multiple scattered areas of enhancement, which we call foci, less than five millimeters, all throughout the breath, calling it marked BPE and not doing more for it. If there's one specific area I'm questioning something, I would also feel comfortable doing a follow-up. Thank you. All right, I'll ask two more questions and we'll let you go. You've got tons of questions here. Do you always repeat CEM after biopsy to confirm cliff placement? Is that after CEM biopsy? If it's after CEM biopsy, I'm not able to answer that question. We don't routinely, in general, I do not perform CEM after biopsy to confirm cliff placement. And for CEM biopsy, I can't answer that because I don't do those. So I cannot tell you what I would normally do. Is there a recommended timeframe for image acquisition in CEM after contrast administration? So the standard thought is that two minutes from the start of the injection is when you start acquiring the pictures. And you want to image within 10 minutes to make sure that the contrast material that's in the breast is still there. Hasn't washed out yet. Okay, one more question. In young patients with breast cancer, do you prefer MR over CEM? So for newly diagnosed breast cancer, I would say that currently my answer largely has to do with logistics. And it has to do with when the patient's gonna be able to come in for the MR, when the patient's gonna be able to come in for contrast. Often enough, if I see a young woman who's coming in, we will do the contrast mammal right at the time of the diagnostic exam. And so I don't actually have to bring the patient back for a contrast mammal or an MRI. If I've already done a workup and then I've diagnosed the cancer and I'm now doing a contrast study for extended disease, it really would be a logistical choice. And the location of the cancer. So if the cancer is located deep within the breast or medial, then I would choose MRI. Thank you, Dr. Phillips for answering all those questions. And thank you for your lecture today. That was wonderful. Appreciate you being here. Absolutely, I'm happy to. If anybody has any other questions, I don't know, I really have not been following to see what other questions there are, but anybody should feel free to reach out.


Hello and welcome to my talk, Know Your QMU and KVM Test Frameworks. My name is Thomas Hoot, I am working for Redhead and I am part of the QMU KVM community since a couple of years now already. Since I am also involved in some of the various test efforts here, and since the KVM virtualization stack is a rather huge and complex stack, I thought it might be a good idea to give a quick overview of the various available test frameworks in this area for newcomers, but also for established developers who are not aware of these frameworks yet. In this short talk I will focus on the test frameworks for KVM and QMU only, that means KVM self-tests, KVM unit tests and the test suites that are part of the QMU repository. There are of course more test suites out there that address additional needs, like the tests from LibVert or Avocado VT, but due to time constraints I am focusing only on the first three here. Let's get started with the lowest layer first, the KVM self-tests. The KVM self-tests are a framework written in CE designed for testing the KVM part in the kernel directly at the IOControl API level. The framework is part of the Linux Git repository and provides some library functions for directly creating virtual machines and virtual CPUs in a test program. That means there is no typical user space application like QMU involved here. Another very interesting thing to know about the KVM self-tests is that the framework also contains an Elfloader which allows you to load the binary code of the host test program into the guest2 so that both the test on the host and the code that runs within the guest can reside in one source file. Let's have a closer look at the KVM self-tests now. Assuming that you already have a checked out Linux kernel Git repository, you can find the KVM self-tests in the folder tools, testing, self-tests, KVM. To compile the self-tests, simply run make there. To run a test, you can simply run the test executable directly. For example, let's run the dirty log test. The files here in the main directory are the files that are common between all architectures. There are of course also some tests that are specific to the various architectures. For example, in the x86 folder you can find the tests for the typical x86 architectures. Now let's have a look here at one of the rather simple tests. For example, the CF4 CPU ID sync test. If you scroll down here a little bit, you can see a function called guest code. This is indeed the code that is run on the guest. It modifies a register and then here calls a macro called guest sync, which transfers the control flow back to the hypervisor. The main function is indeed run on a host instead. If you scroll down here a little bit, you can see some interesting parts here. It creates a virtual machine using this guest code pointer function. And then in a while loop, it runs the guest code. This vcpu run function only returns once the guest hits this macro that transfers the control flow back to the hypervisor. Then when the guest has finished, you can test some conditions here with some test macros and check whether the hypervisor call called you call in this test framework returned the right values. At the end, you just clean up and return. The next framework that I'd like to talk about are the KVM unit tests. This test framework is almost as old as KVM itself as it has been used for testing the very first implementations of KVM already. The tests which are written in C are mainly very low level CPU and device tests compiled into standalone binaries or you could also say mini kernels, which then get run via the dash kernel option of QMU. To ease the development of the tests, the framework provides a simple libc and some other library functions for the test kernels. If you want to have a closer look, you can clone the repository from GitLab or visit the wiki page on linux-kvm.org for some more information. To use the KVM unit tests, you basically just have to clone the repository, run the configure script and then run make. If you have a cross compiler installed, you can also compile the tests for other architectures like ARM or S390 by passing the dash dash arg and some other options to the configure script. To run the tests, you can use the provided run tests.sh script which takes the test descriptions from a file called unit tests.cfg. Alternatively, you can also run the tests manually by directly starting QMU like this. This runs the sieve test and if you want to make sure that the tests can terminate properly at the end, you should also specify the either debug exit device at the command line. Let's see these tests in action now. To use the KVM unit tests run configure first, then you can compile them with make. This creates the binaries in the corresponding folder of the architecture. To run the tests, simply use the run tests script. Since this takes a while, I'm interrupting it here. You can also run single tests by specifying the name. To have a look at the available test definitions, have a look at the unit tests.cfg file. There's a description of the options at the beginning and then you can see the single tests definitions. This is especially useful if you want to run one of the tests directly with QMU. For example, I already prepared a command line here for running the xsave.flat file in QMU. That way you can see the serial console output of the test, which reports paths or fail for each single subtest in the file. Let's have a look at that file now to see how the source code looks like. So there's some inline assembly metric here of course and here you can see what generated the serial output from the test run before. You can see that you can use the typical libc functions like printf and there are also some other library functions like this report function which is used to print these nice paths or fail lines. The entry point to the test can be found at the very end. It's a simple main function. So all in all, writing a KVM unit test is very similar to writing a normal C program. Next set of tests that I'd like to talk about can be found in the QMU repository itself. The QMU repository contains multiple different test frameworks that target different areas. You can get some help on how to run the different test suites by running make-check-help. The easiest way to run most of them in one go is to simply run make-check. Now let's have a closer look at some of these frameworks. The first set of QMU tests that I'd like to mention are the unit tests. These reside in a test slash unit folder and are the typical unit tests that you might know from other projects already. That means they are written the same language as the QMU binary itself, that means C, and the test code is linked with certain code from the QMU binary to exercise it. The main purpose for these tests are the library functions from the util folder in the source repository. But there are also some unit tests which test other parts of QMU. You can run these tests with make-check-unit. Let's have a closer look at these unit tests now. To run all the unit tests simply type make-check-unit. Since this takes a while, I'm interrupting it here now too. You can also run single unit tests by simply executing the binary directly. For example, the UUID test can be run like this. Now let's have a look how that works in detail. For example, the UUID code that is linked into the QMU binary can be found in this file here. And you can see this is a typical library function for generating a UUID or comparing a UUID with a null UUID. And the test is exactly exercising these functions. So if you have now a look at the test source code, which can be found in a test slash unit test UUID file, you can see here that there are some predefined UUIDs. And for example, here's the test that checks whether a UUID is null. So we define some UUIDs and then it simply runs the library functions and asserts that it returns the right values. The main function at the end is the entry point here too. And as you can see, this test uses the G test functions from the GLIP framework. Most of the other unit tests work similarly. The second set of QMU tests that I'd like to talk about are the so-called IOTests. These reside in the test slash QMU IOTest folder and are mixed back of various Bash and Python scripts that are used to test the block layer of QMU. You can run a subset of the tests with make-check-blog, but for running all of them with more fine-grained control, you should go to the tests slash QMU IOTests directory and run a check script there directly. Let's try that out. To run the IOTests, you best go to the IOTests directory where QMU has been built. Here you can find the check script and if you run it with dash H, you get a nice help text about the available options. For example, if I want to run the tests with the raw image format, I can do so by running it with dash raw. Since this takes a while, I'm interrupting it here now. Let's have a look at the sources. Most of the IOTests are still named by a number only. Some newer tests have real names, but the majority is still just a number. So for example, if you have a look at the test 51, you can see that this is a simple Bash script. If you scroll down here a little bit, you can see that this test here runs QMU in various ways. And at the end, the output is captured and compared to a reference output file in the .out file. And if the output of the test run does not match this reference output, then the test fails. Some other tests, like tests 310, for example, are written in Python instead. Another major test framework in the QMU repository is the so-called QTest framework. The related files can be found in the tests slash QTest folder. This framework, which is also written in C, can be used to exercise devices in QMU directly from within the emulator. To do this, the tests start a QMU binary with the so-called QTest accelerator, which replaces the CPU of the emulated system with an interface for the test binary. That way, the tests can read and write guest memory, trigger interrupts the clock of the emulated system and do some other tricks that would not be possible otherwise. To visualize this, here's a picture of how QMU is normally run. The QMU binary emulates the guest environment with the CPU, the memory and the devices. Now, if a QTest runs, it replaces the CPU with this QTest accelerator that also provides an interface for the external QTest program. That way, the test code can read and write memory or trigger IO actions in the device, just like the normal CPU of the emulated system would normally do it. So how does this look like in action now? To run the QTests, simply run make check QTest in the folder where QMU has been built. Since this takes a while, I'm interrupting it here now again. You can also run individual tests, but in that case, you have to set the QTest QMU binary environment variable first to point to the corresponding QMU binary, in this case the x86 binary. And I want to run the Q35 test here. Let's have a look at the corresponding source code, which can be found in tests QTest. And as you can see here, it's also based on the G-Lib testing framework. You have the GTest init function here and the GTest run at the end. But the tests itself, they are added with a QTest add wrapper function. A QTest subtest looks basically like this. So you start with a QTest init in this case. And this starts a QMU with the dash M Q35 machine. And then you can do various things like accessing the memory or also more complex stuff like PCI config space accesses and the like. At the end, QTest quit. Test on the M later again. The last framework that I want to present here today are the avocado-based tests in the QMU repository. These can be found in the tests slash acceptance folder. Note that the name acceptance is a little bit unfortunate here and there have been discussions already whether the folder should be renamed, but up to QMU 6.1 this has not been done yet. Tests here are written in Python and use the so-called avocado test framework for various actions. The Python scripts can be used to run QMU in many ways. For example, some of them download a Linux or another test kernel from the Internet and then check whether they can be started successfully. There are even some tests that take a snapshot of the emulated graphic parts and then use OCR or some other image processing tricks to look for the expected output on a screen. The tests can be run with make check dash acceptance. Since the tests require a working Internet connection to download the test kernels, this test suite is not part of the common make check step, so please make sure to run this separately if you'd like to use it. Now let's have a look at some of the avocado-based tests. The avocado-based QMU tests, which by the way should not be confused with Avocado VT or other avocado-based test suites, can be run with check acceptance on the command line. This will download the images from the Internet first and as you might guess, this can take quite a while. So I'm interrupting it here now and we are having a look at the sources instead. A nice example are the boot Linux console tests. These download a kernel from the Internet. So for example on here the x86 test, download a Linux kernel from the Internet, set up the command line and other stuff, launch the VM and then simply wait for a console pattern on the serial console to check whether the kernel has been started right. Quite simple, isn't it? A more complex example is the machine 68k next cube test. This for example uses the Tesseract OCR tool to analyze the frame buffer for strings. So you can also check whether the output on the video screen is the right one or not. And since we are in Python, you can use all kind of fancy Python libraries to check your test runs. So this is quite a powerful framework for testing complex scenarios. Beside all the frameworks that I already presented so far, there are some more test suites in the QMU repository that I'd like at least to mention here. There are benchmark tests for checking the performance of certain functions. There are some tests for checking the QAPI schema of QMU and tests for verifying the CPU emulation parts of QMU like the FPUs of float tests, the TCG tests and the decode tree tests. Additionally, as I already mentioned earlier, there are more external test suites out there like the Avocado VT tests, but these certainly deserve their own presentation and are available for some of them by other people already. For my presentation, I've got to stop here now. I hope I was able to give you a good overview of at least some of the basic KVM and QMU test frameworks and that you enjoyed my talk. Please let me know in case you've got any questions. Thank you for listening and enjoy the rest of the conference.