I think they're starting us off. OK. Hi, everyone. Thank you for coming. I am Karine Wallach. I lead the developer community at StarTree. I'm Ron. I'm a software engineer in StarTree. And we're going to be talking to you about real-time analytics, going beyond stream processing with Apache Pinot. So I'm just going to kick it off. I'll kind of just go over some of the foundational stuff. So just types of analytics use cases. So this is just kind of the foundation of what we're talking about in terms of real-time analytics. So some of you guys may be familiar with some of these use cases, but I'll dig into these anyway, just in case. So the first one, in terms of real-time analytics, is dashboards and BI tools. This is usually used for internal purposes. BI analysts are usually the ones analyzing and assessing this kind of data. Another type of analytics use case that you may or may not be familiar with is user-facing analytics. So user-facing analytics is basically when you are providing your end users or customers with their own real-time analytics. So instead of just offering it internally to your BI analysts, you can offer it to your end users. And this is like things like who viewed my profile and stuff like that. I'll dig into some of the use cases a little bit more in terms of user-facing analytics. And then the third one is machine learning. These are usually analytics that are fed into some kind of system that a machine does the processing. So this could be like anomaly detection or some kind of fraud detection that you have a system setup that analyzes this data and then may or may not involve some kind of human interaction in there, too. So overall, just kind of high level. These are like the three types of real-time analytics use cases. For this specific talk, we're going to dig a little deeper into user-facing analytics. So why should you care about user-facing analytics? So just the development of analytics and real-time analytics in general has kind of evolved businesses. So it started off kind of with operators utilizing the analytics. And then BI analysts is what we kind of showed before. And then organizations started enabling their users and their customers by providing them with real-time analytics. And then this business metamorphosis element here. This is when companies actually monetized the ability to give their end users real-time analytics. So you can pay for like premium features or there's like literally entire products that are just targeted to giving your end users or your customers analytics and capabilities when they have those analytics. So taking that one step further, I wanted to highlight something that's actionable insights. So this is something that's highly used inside of user-facing analytics applications. So what actionable insights are when you are building applications and you're providing your end users with these real-time analytics and real-time insights, giving them the opportunity to then take action upon getting those insights. So it can be something like the LinkedIn who viewed my profile thing, they see that once I'm gonna go, somebody viewed their profile, they might make a connection request or send a message or view their profile. So some kind of engagement there, which obviously is great for like user retention. And then it could also be things like even the news feed and things like that on LinkedIn, when you have the ability to like things as soon as you see them happening, this is when you have the ability, I'll dig a couple more use cases of actionable insights and how companies are utilizing this capability inside of their applications. Okay, so this is an example of the real-time analytics. So we're gonna be digging in a little bit into Apache Pino today, which was actually originally built at LinkedIn. So I think this is a really good example because this is one of the companies it's actually used in.  And then they have the ability to slice and dice this data by location, companies, things like that. So there's a lot of dimensionality and very complex, there's a lot of complexity in here. One of the challenges being, I think there's actually more users than that. I think it's like 800 million or something like that. But you have all this fresh data constantly coming in and then you have a lot of dimensionality on this data and then you have to make it queryable to all these end users at the exact same time, which adds a lot of complexity. Another use case at LinkedIn is with a real-time analytics, which is, I mean the news feed. So what happens with the news feed is every time somebody clicks on the homepage, they're basically essentially querying this real-time database and they wanna know, I wanna know what's been liked and posted right now. And in some cases it goes through recommendations and things like that. So this is actually a pretty complex querying system when you have all these people clicking on their news feed. And then again, actionable insights, like what can the user do upon seeing these insights in this real-time analytics. Another use case is the talent insights and this is kind of what I was talking about the business metamorphosis, where organizations are literally transforming their business and creating products by offering their end users real-time analytics. Uber Eats is another really good example of a company that does user-facing analytics. So they have 500,000 plus restaurants that then have the ability to access their own analytics insights platforms with inaccurate order, missed orders, top-selling items, things like that. So one of the benefits in terms of the actionable insights that these restaurants have the ability to do is that if they see that all of a sudden there's a trend and review is going down, they need to know right now. And this is part of the optimization in terms of your user experience. I really like this example because it's not as clearly defined in terms of user-facing analytics, but this is kind of like the complexity of the queries. So Stripes use case around this technology is they have, I mean, it's a financial payment technology company and they have dozens of engineering teams and what they essentially have to do is they have these a bunch of engineering teams on one side that are constantly working with all this fresh data and they need to be able to take all this data, consolidate it into one view and then make it accessible to their accounting team, their finance team, fraud detection, data science, all kinds of things like that in real time, like literally sub-second querying. So this is actually quite complex. Also considering their financial data company, so there's a lot of sensitivity with what data is flowed through and all this kind of stuff, right? Okay, are you gonna take this? Yep, yeah, I can do that. I'm gonna hand this off to Ron. Yeah, so... Oh, is that a question? Is that a question?  He's gonna, he's gonna... Yeah, I'm going to go into that.  So we're gonna dig into it and at the end, if you have questions, we will be here to answer. That's good, yeah. So thanks, Karim. So let me reintroduce a little bit about myself. I'm a software engineer from Star Tree. So looking at some of the examples that Karim just mentioned, I just wanted to generalize some of the evolution that we saw in real-time analytics and how they evolved throughout the past couple of years. So what we are seeing is a trend is that when we are talking about real-time analytics, we are not talking about the exact same thing like five, six years ago. And these are the five very common trends that we saw that the online analytic processing system, or OLAP, if you will, that actually is evolving through with these trends. The first one is the internal-facing analytics are more and more going towards a new user persona, which is the end user. The second is that we are looking at more users actually ingesting semi-structure or even unstructured data into the databases instead of just asking the users to pre-process the data and then structuring them and then ingest them into the OLAP system. The third trend is that user are asking for more stronger and stronger data and query consistencies, which approximate data correctness is almost good enough in most of the old days use cases. And the fourth is the type of psycho semantics that our customers are actually currently using. It goes way beyond just slicing and dicing queries like filtering aggregations. Now we are talking about more of a complex event and analysis type of world. And last but not least is the amount of data is being ingested in the OLAP system. We are seeing it growing from maybe like tens of gigabytes going into the terabyte world. And now some of the largest cluster we see is going into the petabyte world. So let's go into each one of these points individually. One is the user-facing analytics. The real thing behind the scene about this is really the user persona change. I remember back in the old days when I first built my first real-time analytics use case was actually, it kind of like the one on the top left which is creating two of the data centers across the US continent. We're trying to do some data replications in between and we wanted to do a real-time monitoring regarding whether the data replications are actually happening in real-time, how late those replications are, et cetera, et cetera. Well, just keep me from being firing. But if you look at those use cases, it is more sort of like internal system monitoring via time series analysis, dashboarding charts, et cetera, et cetera. But now if you look at the use case that Karin just mentioned, Uber Eats restaurant, dashboards are used by close to a million users or million restaurants every day. And not to mention the LinkedIn user are used by over 800 million users actively using their profiles in LinkedIn. So the three takeaway I wanted to emphasize here is the type of query latency requirements, the ingestion freshness as well as the concurrency of the actual users being behind the scene making those real-time analytics queries. So switching from the old days where a second level query latency is probably enough, you're not going to monitor the dashboards all the time to kind of like you have to make sure that the latency is in the millisecond level, otherwise your user will have a bad experience.  Otherwise, if you're looking at millisecond latencies while you're actually posting, it's not immediately showing up on your fee as well, then it's going to be having some bad user experience. Not to mention the concurrency, now shifting from maybe hundreds to thousands of internal engineers to the couple of hundreds of millions of users across the globe. Next is the data structure, or semi-structured data that is being ingested. In the old days, I think engineers won't hesitate to slap on kind of like a pre-processing pipeline using Apache Fling or Apache Spark, depending on which system you're actually ingesting in and basically sanitize the data, structure them, getting rid of the things that is actually malformed, and conform them with the schema that OLAP system expects and then ingest the data in. Now, if you look at the current days, people just wanted to have this support out of the box. You want to just ingest the semi-structured data into OLAP and be done with it. One of the reasons is tightly coupled with the user-facing analytics trends, so more and more data scientists, machine learning practitioners are actually using these systems, and if you're asking them to set up yet another system that is outside of your OLAP to basically run the pipeline end-to-end, it's going to be really, really cumbersome, and then user don't actually want that type of experience when they are setting out the system itself. The other not to mention is the operational overhead, right? So if standing from the engineering standpoint, it is always easier to only maintain one system instead of two, it just makes debugging easier operational overhead less, and also you can guarantee the data correctness in an easier fashion. The third point is the strong data query consistency. So in the old days, OLAP had this impression for the users that they are ingesting data in an apparently fashion. You never change any data once they are ingested. This is sort of okay because of the best effort QE guarantee in most of the use cases in the old days that can tolerate. For example, if you're going to slice and dice some of the kind of like cross-nental, like data replication of delays, one or two bad data points or replications or duplicates is not going to affect too much. But nowadays, since we are actually doing user-facing analytics, we not only have to have append-only inserts, sometimes we need to mutate the data, sometimes the data becomes obsolete and we are wanting to delete them, and at the same time, we also still want the most accurate query result as soon as possible. The fourth point is the full SQL semantic support. So as I mentioned before, most of the traditional OLAP queries like aggregation, filter, group-by, order-by, or even most complex is like using some kind of complex UDF to transform the roles that you selected out. Nowadays, we are actually seeing users trying to do enrichment joins, nested queries, window functions, or even complex event analysis, like think about you have a kind of like sessionized stream of data they are wanting to correlate with, and these type of query really demands full SQL semantic support. And last but not least is the data size explosion. Back in the hundreds of gigabytes, maybe the low terabytes world, it is really easy to just co-locate your data with the compute. It's always easier to do that, the latency is slower, and you can just horizontally scale out your entire cluster. This is not the case if you're actually going into the petabyte world because it is just not cost efficient to have so many different nodes sitting around idle with the compute resources, just because you have to satisfy the local storage need. So what actually is a great solution here is to move some of the quote-unquote code data or less used data into the cloud storage, which the storage cost is cheap, so that you can actually still maintain a certain amount of level of the key relatedness, but in the same time, it's much, much more cost efficient. So long story short, what we actually summarized in the requirement change for the modern OLAP system is better ingestion, better query, and better scalability. So now let's go into Apache Pino a little bit and let me explain why Apache Pino is de facto platform to support all of these user-facing analytics. For those who is not familiar with Pino, Pino is a distributed columnar database that is built specifically for real-time analytics, including BI, data products, and abnormality detections. It can ingest data from various different kind of sources, including streaming like Kafka or a batch in Hadoop or other data lakes or data warehouses. It is used by over 100 companies nowadays. I think the largest clusters from Stripe, Uber, or LinkedIn are actually ingesting over one million message per second, while at the same time serving out 200,000 queries per second in width. Yeah, thanks pretty much. And then at the same time, it's still maintaining a P99 sub-second latency. So let's dive deep in under the hood and understand what exactly is Apache Pino under the hood. At the heart of it is the columnar data store. A traditional database concept table is being slice and dice into smaller Pino data segments, which is the atomic unit for us to manage replica, et cetera, et cetera, all of these type of flight data management operations. Data's are stored in columnar format, but more importantly, they can generate their own indexes and metadata's for each one of the segment individually so that it can perform cure optimizations in a blazing fast fashion. And then after that, the Pino segments are distributed into various different Pino servers across the cluster. On top of that, we have the control plane that is powered by Apache Helix to manage metadata's like which segment is residing on which server, how many replicas they are. And then last but not least is the Pino broker, which you can think of kind of like a stateless compute layer which accepts user queries, distributed them into the proper servers to do aggregations and computations, gather the intermediate result and then finally compute the final result and return it back to the user. So here are several things that Apache Pino's killer features makes it super fit for the user-facing analytics. First is it supports real-time ingestions, updates and deletes out of the box. It also directly supports semi-structured data ingestions. All of these data's are actually then structured into segment format so that it can support mid-second cure latencies, freshness-wise, it can support a second-level ingestion overhead so that you don't have to wait for the ingestion to complete. And then at the same time, it can serve out millions of users concurrently. In terms of curies, semantics features, all of the OLAP traditional curies plus some of the more complex ones such as joins already supported. And at the same time, we also out of the box support a tiered cloud storage plug-in so that we can move some of the co-datas automatically into the cloud. So let's dig into each one of these points individually, starting by looking at the curies performance. As I just mentioned, the Pinot broker is basically the distributor that basically slice and dice the curies accepted by the user and then distribute them into each one of the individual servers. So here, Pinot actually uses the segment-level metadata to prune out some of the servers that is guaranteed to not have the segments that satisfy the needs from the user query. What I mean by that is let's say, for example, by default, Pinot segments are distributed or partitioned based on timestamps. So all of the data that is being ingested into Pinot will be distributed by the different timestamps. And then this is actually a pretty traditional fashion for time series data. What happens is that users will pretty much not query the entire data spectrum of all of the ingested data, right? They are just going to go into a very, very specific size of the data in between the entire time spectrum. So what happened here is Broker can use the metadata to first prune out what are the servers that is guaranteed to not hold in the segment that is relevant and prune out those security dispatches in the beginning so that we don't have to wait for the server to come back with the results. And next, the server is doing pretty much the exact same thing, except in this case, it's doing it in a segment level rather than a server level. Afterwards, the surviving segments will be going through the future and aggregation of the positions in the segment level. Now, let's look at the bread and butter of the speed of Apache Pinot, which is the segment. So segments are designed specifically for low latency, high throughput aggregational queries. What I mean by that, you know what, let's look at one of the artificial data examples. So let's say we have one table with kind of like a country column, a browser column and some of the other columns. Like if you will, this mostly resembles kind of like an eyeball or user interaction with the website. And these data are structured in columnar basis. And let's just pretend that we wanted to have some query that does count aggregation on top of this table that filters out all the country originating from the US. So what happened for Pinot is, Pinot have this embedded inverted index that can actually do a reverse lookup from the country code to the document ID or the row ID, if you will, on where exactly are the rows that is going to consist of the country code US. With this, instead of actually having to scan through the entire data set, we just need to use this inverted lookup to look up exactly where the data is. And next is the start tree index. This is an index specifically designed to pre-aggregate some aggregational functions like count some mean max, et cetera, et cetera, that instead of actually having the system to process the data on the fly and pre-aggregate the data, what this system can do is, it can go into this start tree index tree and look for the specific country that has the US key in it and directly read out the results. So this would speed up a lot of the additional functions drastically. So here is kind of like a current version of Pinot's all supported indexes. We have the inverted, sorted, and range index pretty much designed to have the normal predicates like equal, inequality, et cetera, et cetera. Then we have the JSON text index specifically designed for semi-structured data. So we can ingest these data without actually having to structure them. And finally, we have the geo-index specifically designed to speed up like geo-spatial optimizations or like, for example, you wanted to know whether a specific lat-long point is within a specific geo-fence. And these are the things that will speed up those queries. Next, we have the aggregational optimizations. Some of these are pretty typical. For example, the hyperlot log is going to use to speed up the approximate distinct applications. And finally, we have the start tree index that sits on top of both category that provides pre-aggregational speed up. In fact, start tree index is so powerful we actually name our company after that. So let me take one step back and answer probably some of the questions you have is why do we have so many indexes? The reason why we have so many indexes is because we are specifically tearing these indexes to different type of user experience or use cases. For example, in Uber's use case, geo-fence indexes will be much more important than some of the others. So that's why we think Pinoe is the one-size-fits or platform to do all type of return analytics. The other point I want to point out is how easy it is to add more indexes towards the system. In fact, the indexing algorithm framework is so flexible. I think the range index and JSON index are actually added maybe within a couple of weeks just from kind of like an idea to an merge code into the main branch. So next, let's look at the semi-structured data ingestion. So as I mentioned before, it's kind of like a continuation of the indexing mechanism. For example, if we want to ingest some type of JSON data, they have sort of having a semi-structure, but you never know whether some of the JSON columns are going to be missing in the entire side of the JSON block, right? So what actually happened instead of actually asking the user to structure the data in the begin with, we're actually going to support a type of placate condition called JSON match. So what happens here is typically the filter expression that you will see in some of the SQL query languages is like if you want to have a top level, name filter equals to Adam, the address array filled with the street number equals to 112, or you have mix and match some of these using N or clauses. So these type of JSON match predicate is drastically speeding up the semi-structured data lookups. In this case, we are looking at 1,000 times or even not more type of like speedups in terms of dealing with semi-structured data. Next is the absurd ingestion. So as I mentioned before, absurd is a pretty common strategy for modern databases to ingest, especially if you're dealing with real-time streaming data. What happens is your real-time streaming data will never be guaranteed to be correct. Like sometimes you have incorrect data, corrupted data, so you want to correct them later. Or just by looking at some of the actual use cases that the data just natively needs to be updated. For example, in a sessionized data stream, you want it to always keep your roles up to date with the latest status rather than having the entire stream to be processed. So let's use this as an example, which is one of the Uber Eats order status update. What happens here is, actually, let's take one step back and try to explain one of the prerequisites. So one of the reasons why Pinoe is so powerful and so fast is because all of the segments, once they are generated, they are immutable. Because of these features, we don't have to keep a global centralized coordinator to keep track on which data is in where, what version is being used. But at the same time, it makes absurd pretty hard because you can't actually mutate the data once it's being generated. So a clever solution that we supply here is, we maintain an external primary index key map that maps, in this case, the audio ID as a primary key to where the latest segment and the dot ID it is to represent the latest result for that specific role. Now, let's say we have one more primary key added to the mutable segment, which is the one that is open to a set real-time ingestion. Let's say the primary key is BB. We previously saw that the BB is pointing at segment one dot ID one. Now it's no longer the case because we actually want the BB primary key to point to a segment two, which is mutable and still dot ID one. Now, next, if you have another column coming in, row coming in that basically have a primary key EE, because it's actually already pointing at the mutable segment, all you need to do is just modify that specific primary key index pair to point to the new document ID. Later, after a while, once the segment has enough data, they need to be sealed, then all you need to do is copy all of your primary key indexes from the mutable segment to the mutable seal segment, and then you can continue with your consumption later on. So as you can imagine, any time during this entire progress, if you have some query coming in and asking for, hey, what is the latest status for some of the primary keys, you just need to look at the primary key indexes and look out exactly where the segment is supposed to be for the latest status. So next is how we think Pinoe is evolving towards Fusico semantics. So one of the earlier examples that we have is lookup join. What this means is a very common use cases in real time analytics, which you have some kind of transactional data that is evolving through time, but you have a relatively static dimensional data that you want to enrich it from. In these type of use cases, usually you already know what type of dimension table you want it to be joined with. So instead of actually having the join, a Fusico join data shuffling operation in the fly, we actually predistributed these dimension tables. So this is where dimension predistributed table in Pinoe means. The data is already prereplicated and predistributed into every single Pinoe server. And if you have some type of enrichment join or lookup join request coming in, all you need to do is distribute those Pinoe queries into each one of the server that has the fact table. For example, in this case, the order satisfied. And all each server needs to do is doing a localized lookup because you already have the data predistributed. Once the enriched the result is sending back to the broker, it will be served out to the end user. Now you're probably already imagining what if the data is not pre-aggregated or predistributed or you don't know what dimension table you wanted to aggregate in the begin with. So one of the drawbacks for this approach obviously is that the other one is, let's say you have a really, really huge data being sent out from each one of these servers, then your final stage broker reduced becomes the bottleneck because you have to process so many data in just one machine. So we are actually having a new features in preview right now which is called a multi-stage query execution engine. This engine insert an intermediate computational stage in between the server and the broker so that we can actually do all of these intermediate stage reduces in a distributed fashion. What's more important is this structure can actually be replicated into multiple different stages so that we can actually support more full SQL semantics in the future. Last but not least, let's talk about the tier storage on cloud natively supported by Apache Pinot. So in the old days, as I mentioned, all of the Pinot segments will be collocated with all of the Pinot servers. You will see some of the server, some of the segments being curing more often than the other. This is just how the real-time analytics characteristics is being, right? The closer you are to the real-time site, the more those data will be used. And the long tail is always going to be exit. You're always having a really small fraction of the data is going to, the queries are going to go into some of these like older segments. So one solution for this is just to horizontally scale out the entire cluster. That would cost a lot of money because you are having a lot of the computational resources idle. Now, what Pinot cleverly did here is to decouple the storage and the compute by moving some of the code segments into the cloud storage. This way whenever the query is requiring older segments, the Pinot servers will bring these segments from the cloud storage into local and cache there. And then because of the caching effects for the least recent use cache, we are still able to serve relatively similar latency requirements by the same time we drastically reduce the cost for storing these code storage data. So to summarize the takeaway is, as Karim mentioned, the real-time analytic use cases have evolving to power more user-facing actionable analytics. And Apache Pinot is our solution for these user-facing real-time analytics because it has an excellent query performance. It can handle real-time data mutation on the fly without any problem. The ingestion can come from stream batch or any type of CQQ sources. It supports semi-structured data out of the box. It also supports hyper-architecture out of the box. And that's why it is one platform to build against all different kinds of user-facing analytics. Thank you. Is there one more slide? Oh, yeah, we have one more slide. So Star Street is actually hosting the very first real-time analytics in August in San Francisco. So if you're interested. It's also free for virtual attendees. So it's actually not virtual. It's on-demand that's available later because we're gonna clean it up and everything.  Or you can come, one or the other. And that's it. You can go back one. Yeah, any questions? Thank you. Thank you. Is this database application playing the same space as MIMS SQL? If you know what MIMS SQL's a similar type of memory. I'm sorry. Does Apache Pinot live in the same space as the MIMS SQL application? Which is a memory-based... Actually, that is a good question. So let's compare this with MIMS SQL. For example, something that I'm more familiar with. So the idea is not actually trying to locate or co-locate all of the data in memory so that the space is really fast, but more sort of like trying to keep the most recent use data in memory. So the short answer is no, because we don't keep every single data in memory. But at the same time, we do have a lot of techniques, caching mechanisms, at least recent use, et cetera, et cetera, to basically making sure that the P99 queries, the most important queries that touches basis the most return data segments are all in memory. Like, empirically, yeah. Any other questions? We're only here for like five more seconds. Yeah, if you have any other questions that come to you later, feel free to join the Slack. You can get to the Slack by dev.startree.ai. And you can ask questions there. Ron is there. Yep. I'm there, but I probably can't help. But there's a lot of people who, from like, Startree and Pino. Oh, actually, you know what? Let's take one step back and answer the gentleman's question previously regarding how this fits into the ecosystem. I actually have to take that slides out because it's a little bit too long. Thank you, left. We left? Yeah. Okay. That's fine. He just walked home like right now. Yeah. I don't think I have the slides here. Yeah, let's find them. Okay. Okay. Any further questions or? Oh, yes, go ahead. She's coming with the microphone. Oh, yeah, okay. Making her run across the room. I kind of like did like a project like this, a former employer, but it kind of reminded me of Kafka and then Apache Spark. So you kind of like tie everything together with Pino? Yes, I think one of the trends that we saw here is that when we look beyond streaming analytics or batch analytics is where you want it to stitch these things together. This is what Apache Pino comes in because it is sort of like like London plus plus architecture where you can actually have co-located your real-time and batch data or fly data at the same time. And all of your queries going into these systems doesn't really have to worry about exactly where the real-time offline boundary is. So that's sort of one of the answers to that. The second is the ingestions and QE are happening simultaneously. So for example, if your data is ingested like one millisecond later, about a goal, then you can actually have the exact same data being served out at the next millisecond. Thank you. Any other questions? So I've actually used Apache Trino, which integrates with SuperSet for like visualizations and stuff. So I was sort of curious to know what kind of like visualization tools would be compatible with Pino. Would SuperSet be like an option? Because I would love to explore how that could be done. Yeah, I think SuperSet, I'm not 100% familiar with SuperSet, but I think as long as you actually conform with the JDBC standard, you can actually use any type of database behind the scene, where I think we do support SuperSet, give a take depending on what type of data you're actually trying to deal with there. Some of the other types are not by default supported by JDBC. But yes, we also have a Trino connector that basically you can actually act Pino as a Trino connector source. So it's kind of like Pino is acting kind of like a virtual data source that supplies data into Trino, or Presto, if you will. And then what happens behind the scene is Trino and Presto and all of these intermediate computational layers will actually push down all of the predicates, doing the SQL optimizations with the plugin that Pino supports, so that they can actually transport much, much less data instead of actually doing a table scan. You can just ship the data that Trino needs and then do the final aggregations on top of that. Oh, okay, so yeah, we do have like an instance of Trino. So it would be great if like I have some examples or maybe I can. Yeah, I think we do have some examples in front of you. I don't have that in this slide, but we can definitely connect. Yeah, sure, that would be great. Thank you so much. Okay, I think we can linger around for more questions if anyone have any more, but yeah. Thank you. Thank you guys.


Attention Central Business District residents, this is a community notification of a new sexually violent predator in your area. Please stay tuned to the following short program for more information. Hi, I'm Technician Ron Hackett with the Denver Police Department. The Sex Offender Registration and Compliance Unit at DPD is responsible for the registration, monitoring and tracking of all registered sex offenders and sexually violent predators who live in the city and county of Denver. Here's a brief history of sex offender legislation in Colorado. Our state laws trickle down from federal government mandates. In 1994, we had the Jacob Wetterling Act, which mandated that states would establish a sex offender list. Megan's Law of 1996 said that the public would have access to those sex offender registration lists. The Pam Litchner Act of 1996 stated that some offenders might have to have lifetime registrations, and the Adam Walsh Act of 2006 unified sex offender laws across the country. In Colorado, the legislature has determined that sexually violent predators by definition pose a higher risk to the community at large, and therefore mandated that upon their release from the Department of Corrections, the community must be notified. Sex offender notification in Colorado happens in two ways. The first is passive and ongoing through the sex offender registration process, which is a list maintained by local police departments. The second way is active via community notification for those offenders determined to be sexually violent predators by the courts or by the parole board. Most sex offenders in Colorado are supervised by the criminal justice system in our communities. Most sex offenders engage in crossover behavior, which means they may have been arrested for one type of crime, but be apt to commit another.  There is no typical sex offender, but all tend to be deceptive, manipulative, and secretive. 80 to 93 percent of sex offenses are committed by someone known to the victim. Sexual deviancy begins in mid to late adolescence. Sex offenses are not impulsive.  The community has a vested interest in helping offenders to be successfully managed in the community. Sex offenders have the same need for housing and employment as any other citizen. Any citizen who uses sex offender information to harass, threaten, or intimidate an offender will be subject to criminal prosecution. There are approximately 16,500 registered sex offenders in the state of Colorado. About 65 percent of convicted sex offenders are placed in the community on probation. The remainder are in the Department of Corrections or Community Corrections. Offenders may be caught for one type of offense, but be at a high risk to commit another type. Time of conviction is only one indicator of risk.  The offender's residence must be verified quarterly by the Denver Police Department. The full sex offender registration list is available by calling the Denver Police Department Identification Bureau at<PHONE_NUMBER>. Guided felons and those with multiple convictions are posted online at denvergov.org slash police.   Now, here's a look at the newest sexually violent predator living in Denver. Here's an overview of the registered sex offenders currently living in Denver. There are 2,527 total living within city limits. In Denver Police District 6, there are 466. Precinct 611 has 149 registered sex offenders. Of those, 101 have felony convictions and 48 have misdemeanor convictions. David Allen Stadler is a sexually violent predator currently living in Denver. He's 49 years old and was born on October 11, 1972. He's a white male 5 feet 10 inches tall, 255 pounds with gray hair and green eyes. He's currently living at 815th Street number 519 in the Central Business District neighborhood of Denver. Schools located within one mile of this offender include Montessori Academy of Colorado at 2500 Curtis Street, West Early College High School Middle School and West Leadership Academy High School Middle School at 951 Eladde Street, Polaris Elementary at 410 Park Avenue West, University Prepper Appahoe Street at 2409 Arrapahoe Street, Rise Up Community School at 2342 Broadway, Emily Griffith High School and Downtown Denver Expeditionary School at 1860 Lincoln Street, Colorado High School Charter at 1175 Osage Street, Greenlee Elementary at 1150 LePan Street, Compassion Road Academy at 1000 Cherokee Street. Parks located within one mile of this offender include Commons Park, Sunken Gardens Park, Spear Boulevard Park, Confluence East Park, Sculpture Park, Benedict Fountain Park, McIntosh Park, Confluence Park, Maestas Park, Creek Front Park, LaAlma Lincoln Park, Downtown Playground, Centennial Gardens, Stout Street Children's Park, Pioneer Monument Park, Skyline Park, Sunny Lawson Park, Park Avenue Parks, Broadway Triangles, Rail Yard Dog Park, Civic Center Park. Recreation centers located within one mile of this offender include 20th Street Rec Center at 1011 20th Street, LaAlma Rec Center at 1325 West 11th Avenue. Bus routes located within one mile of this offender include Routes 0, 1, 6, 8, 1948 and 52, 15th Street and Champa Street, Routes 9, 15 and 15 I, 15th Street and Curtis Street.  He's currently on parole and registered with the Denver Police Department on March 4, 2022 to 815th Street number 519 in the Central Business District neighborhood of Denver.  David Allen Stadler has been determined a sexually violent predator after meeting the following criteria. Criteria 1, age 18 or older on the date of the offense or under 18 and tried as an adult. The offender was age 36 at the time of the offense. Criteria 2, the crime must have been committed honor after July 1, 1997 and convicted honor after July 1, 1999.  The offender was convicted on May 4, 2009 for sexual assault on a child victim less than 15. Criteria 3, the relationship to the victim was one of the following. Victim was a stranger to the offender or the offender established or promoted a relationship with the victim primarily for the purpose of sexual victimization. The victim was a 13-year-old female. The offender was known to the victim. Criteria 4, positive results or the passing of a risk assessment instrument administered by probation parole staff and a qualified treatment evaluator. Positive results include an assessment for the presence of a mental abnormality, a level of denial regarding the offense, treatment appropriateness and motivation, presence of sexual deviant interests. The offender was evaluated by the Jefferson County courts with positive results, determining him to be a sexually violent predator.


A fiery horse with a speed of light, a clod of dust, and a ha-hee-ha-yo silver! The Lone Ranger! With his faithful Indian companion, Tonto, the daring and resourceful mast rider of the plains led the fight for law and order in the early western United States. Nowhere in the pages of history can one find a greater champion of justice. Return with us now to those thrilling days of yesteryear. From out of the past come the thundering hoofbeats of the Great Horse Silver! The Lone Ranger rides again! Come on, Silver! Sheriff Bailey sat in his dingy office talking to one of his deputies. It was noon on a hot day, and the little town of Crack Rock was quiet. Man alive, Joe. It sure is hot today. Every consort would take it easy, like, seeing as how we have much to do. Hey, something's happening outside. Yeah, come on. We're getting a bit of hurry, Chef. Hey, the mombie's riding away and look like Outlaw. Yeah, and they're riding away from in front of the bank. Let's get over there. And what happened here? Chef, you've got to do something. Now, Julius, calm down. Calm down. You were the killer in the bank. Now tell us what happened. Well, things were quiet in the bank. It'd be a noon time and all. I was counting out a shipment of new bills and some gold coins that come in by express. I wasn't paying much attention to anyone in the bank till I heard a voice of the window. It was an easy, drawlin' kind of voice. Business to attend to. See whether you're in just a few minutes, Stanger. Sorry, but I just can't wait.  Well, as soon as I get these bills cut. A gun. Seein' as how this here's a hold up, I figured I might need it. Push out those nice new bills and gold coins and do it fast. You can shove them right into this open bag I'm holdin' up the window with my left hand. Come on. All right. Yeah, I'm sure. You want to get out of here? Somebody should've come and see. You see them three hombres leaned against the wall? Friends of mine find shots. Julius, I'm going to lunch. Hey. What's going on? It's a hold up.  Help! Help! You see what I mean, mister? The boys are awful good shots. So long. Then they run out of the bank and jump out of their rocks. I guess you know the rest. They all had bandanas over part of their faces. What about Mr. Ward? He's dead, Sheriff. They got away with $10,000 in cash. You've got to do something right away. From what you tell me, I'd say that leader with the droll and voice was Tennessee Moody. What? I got a handbill on him. Holy cow, Tennessee Moody. He and that gang of his are mean. Somebody go get the coroner to come over. The rest of you get your horses. You form a paucine, go after them killers before the trail gets cold. And you can count me out, Sheriff. Yeah, me too. I'm not chasing that, Aubrey. Them gunslingers are too good, Sheriff. Oh, if you're all that scared, stay here. I'll get another deputy or two and we'll go after them. Come on, Joe. Late that afternoon, the Lone Ranger and Tato, who had ridden far north to Prescott in the Arizona territory on an army mission, were making the return trip to Texas. They reached the hills on the outskirts of Craig Rock and made camp for the night. Tato inspected their supplies, then spoke. Kimusavi, we need supplies. Not have much left. Well, we can get some supplies in the town of Craig Rock. And you want me to go to Craig Rock now? Oh, we'll both go, Tato. But before I ride in the town, I'll remove my mask and fix the disguise. I'm not known at all up in this territory and can't take any chances. That's right. Kimusavi, you remember you say maybe Badland Pete, who escaped from prison months ago, come to this territory. Yes, I was hoping we might pick up his trail while we're on this trip. Maybe him grow beard looked different. Well, I've thought of it. With him around town, him recognize voice alone, Ranger. That's so. Well, after I fix my disguise, I'll remember to change my voice when I get to town. That'd be good. Help me with my disguise, Tato. Then we can get to town before darkness sets in. Ah. About an hour later, the lone Ranger and Tato rained up in front of the general store in town. Oh, sir. Come on, Tato. Howdy, stranger. What can I do for you? Good evening. I have a list telling what I want, mister. We come back to get them a little later. Then here's the list. And you sure are laying in a stalk of beetles, it seems, like? I reckon it won't be more than we'll need for training. It's a mighty long ride from here. Yes, that's right, mister. Fixing to go on a trip southward, huh? Well, I haven't seen you with the Indian around here before. Oh, have I?  Seeing as how we're just passing through. How soon will you have the supplies ready? It won't take too long. Maybe we'd better just wait around while you get them together. We'll get them together. Well, now, maybe you better know it, stranger. Take a little while to fill this order. Got something else to get done first. Come back in about a half an hour or so. That suits me fine. We'll go over Yonder to the cafe to pass the time. Come along, Tato. Ah, welcome. Hey, Jay, come here quick. What's the matter? That army that just went out. Didn't you notice him? Not too close. Why? The bank said that outlaw, Tennessee Moody, was tall and well built and spoke with a draw, you remember? Yeah, that's right. Well, I'm positive that that army that just went out is Tennessee Moody. He talked with a draw, you saw how he looked. Yes, yes, I did. He said him and that Indian with him were just passing through, and they ordered supplies to last him on a ride south into Texas. They'll be back here in half an hour. We're not going to see if the sheriff and the party have come back yet. Now, hurry. I sure will. It'll be a chance to catch Tennessee Moody without his gang being with him for protection. I'll run right over there now. Jake hurriedly left the general's store, and a few minutes later, he entered the sheriff's office. Hi, Jake. What's up? Got it, Sheriff. I'm glad you're here. We just got back. Come in the back door. We lost a tray of those outlaws. That's right. They're plenty smart. You've got a chance to catch Tennessee Moody right now, Sheriff. What do you mean? An army entering his description, walks with a slow drawl, just come into the store and get supplies. Right day. He left in order, and he's coming back to pick up the stuff. He had an Indian with him. I came to get you, so maybe you can catch him while he's here in town without his gang. But if he is Tennessee Moody and we grab him, we'll never get the rest of that gang, Sheriff. That's right. Joe, you and Jake ease around town and pass the word. Get as many men together as you can. What for? Tell them to be ready to ride with me and my deputies as soon as that army leaves town. We'll get a look at them when him and the Indian come to pick up their supplies. We'll follow them with a big posse to their camp and grab the whole gang. I'll get moving and have the men ready to ride. Twenty minutes later, the Lone Ranger and Tonto went to the store and got their packages. They carried them out and stood packing them into the saddlebags. As they stowed the supplies away, the Lone Ranger spoke to Tonto in a low voice. He knows how quiet everyone was when we were waiting for the supplies, Tonto. He noticed. The storekeeper, him not saying much, acted pretty strange. He kept looking at back rooms, didn't he? Easy, soldier. They're a little carry-all right. They're being watched on all sides right now. I don't understand it, Tonto. I feel a tension in the air that I don't like. Not good. Me ready now. Easy, sir. Easy. Come on, sir. As the Lone Ranger and Tonto rode leisurely out of town, the sheriff, who had come from the back room of the store and stood in the window with others watching, turned and spoke. I feel sure that's Tennessee Moodio, right? It's him, Sheriff. You can bet on it. It tallies with a description in that hand, Bill. He has that slow drawl that Julia spoke out, too. I noticed he had paid you with a gold piece. Yeah, him and that Indian sure have fine horses.  Well, I guess the posse is waiting around and ready to ride out back. Well, good luck, Sheriff. Hope you grab the gang. You better watch out for an ambush, Sheriff. I don't think he suspects anything. Joe got together a big posse. And before many hours go by, I feel sure we'll round up that outlaw gang once and for all. The more I think about it, the more I wonder about the suspicious attitude of the men back in Craig Rock. Why do you think the man... Wait, Musami. I can't think of anything we might have done to arouse their suspicion. There are quite a number of horses at the hitch-racks in town when we arrived. I noticed when we left that most of them were gone. That's right. Could be that they were waiting for us to ride out of town so they could follow us. Why them do that? I don't know. They had the feeling that they might. Do you think it's safe for us to go back to camp? I don't know. Will you stop behind those boulders just to head tunnel and watch the trail for a while? If they are being followed, I'd like to know it. Come on. Pulling in behind the large boulders, the Lone Ranger and Tonto sat in their saddles for about five minutes, waiting and watching the trail. Well, so far no one has appeared, Tonto. If they're coming, it seems like they'll be along by now. Yes. At least over. I think it's over here or something. Ah, him looking down trail. Look, Kimosabi. Can you see cloud of dust? Look like many riders coming. Yes, you're right, Tonto. I can't make them out yet. And soon come past boulders. That looked like big posse. Yes. I'm sure they're following our trail. That's strange. You see him now, following in front where Sheriff badge. Sheriff and a posse. You left the trail here and drove over for those big boulders. Watch out for that one, Sheriff. It's funny me, you know. All your gunsmen have spread out in a semi-circle. You're right toward those boulders. All right, let's go. What we do, Kimosabi, we'll have to act fast. Hold your fire, Sheriff. We'll come out to talk to you. All right.  All right, Tonto, we'll do as he says. All right, Sheriff. We're coming out now. Come on, Silver. Come on, Silver. Now, don't make a move, either of you. Lucky for you, Tennessee, that you decided to give up so quick. We're out to get you dead or alive. But there must be some mistake, Sheriff. My name ain't Tennessee Moody. What? In fact, I never heard of anyone by that name.  I'm just trying to bluff out of it. I got a handbill that described you to a team.  You made the mistake of coming into town with that draw of yours and buying supplies. I assume that draw for a purpose, Sheriff. Listen to him. I'm speaking now in my natural voice. You're smarter than I thought, Tennessee, than using the draw of the fool, people. But you should have dropped it when you come for them supplies this afternoon. We're taking you back and you'll hang for murder, both of you. The curtain falls on the first act of our Lone Ranger story. Before the next exciting scenes, please permit us to pause for just a few moments. All to continue our story. Suspecting that they might be followed, the Lone Ranger and Tutto pulled off the trail and waited behind some large boulders. Soon, the sheriff and the posse came along and learning from the tracks that the two were hiding nearby started toward the boulders in a semicircle, shooting as they went. The Lone Ranger, playing for time, called out and then he and Tutto came out to face the posse. In spite of the Lone Ranger's denial, the sheriff was certain he was Tennessee Moody and told them the posse was taking them back to town and that they'd hang for murder. Well, I keep him covered. Somebody take his gun. Just a minute, Sheriff. I want to show you something that will prove to you I'm not Tennessee Moody. If you move your hand near one of them guns, I'll... I just want to reach into my shirt pocket. All right. Go ahead. Watch him, Sheriff. First, I'll put this on. A black mask. That's more proof to show an outlaw. But I'm not an outlaw. Now, look at this. Come on, sir. A bullet. A silver bullet. That's right. It is silver. But that doesn't prove anything to me. If you want to use expensive bullets like that, it's up to you.  Nope. Any reason why I should have? All I know is that Tennessee Moody is a bad hombre who pulls all sorts of tricks. This is just another trick to try to gain time, I reckon. Then he's expecting his gain. Yeah, let's get going with these folks, Sheriff. Come here and take his guns, Joe. As the sheriff spoke, the lone ranger noticed that his eyes momentarily glanced toward his deputy, Joe. Acting quickly before anyone could sense what he was doing, the masked man who had moved alongside the sheriff to show him the silver bullet suddenly drew one of his guns and jabbing it into the sheriff's side, spoke firmly. Drop your gun. Drop it. What the... If anyone moves, I'll have to shoot. Yes, I have to. Order your men to ride back up the trail. Go ahead if you want to live. Oh, by a thunder, I won't. You'll kill if we don't, Sheriff.   You'll kill me anyway, even if you do what he said. Let them go, Sheriff.  That's right. I'll see you here, Tennessee Moody. I told you I'm not Tennessee Moody. You're hardly convinced. This is the only way. Men far enough away now, Kimethunny. Good enough. All right, Sheriff. You can ride after them. After we leave, you can come back here and get your gun. I get going. We'll meet again.  I'll see to that. Get up there! Come on. All right, Tunnel. Let's get going and fast. Come on, Tennessee! Come on, Tunnel! Riding at breakneck speed, the mask man and Indian raced along the trail with the sheriff and his posse and full chase behind them. Fortunately, the distance between the fleeing men and the posse was enough to make the posse's shots ineffective. But the lone ranger knew that he had to do something drastic to get the sheriff and posse off their trail. He urged the great stallion, Silver, to greater speed. Come on, Tunnel! Fasten it for them off the trail! Rounding a bend in the trail, the two men were out of sight of the posse momentarily. The lone ranger called out to Tutto. Hello. Swing the ride off the trail. That deep, rocky ravine to right. It's six, seven feet cross. It big jump for horses. We'll have to chase it. Come on, Tunnel!  Rebeen just ahead, Kimmasavi. Yes, get ready for it! Up, still up! Scout! We made it! Passing unable to cross, Rebeen. We'd be able to lose him now. Come on, Tunnel!  The lone ranger and Tutto continued to race on for two or three miles. Then they rained off. Hosell, Rebeen. Easy, easy. We've lost him by now, Tutto. It's narrow escape, Kimmasavi. I still think you aren't law named Tennessee Moody. Yes, I know. Then not here a lone ranger around here, it seem like. Then he raked the sheriff didn't react to the silver bullet I showed him. It's night time now. But they're bright full moon. What we do, go back to camp, maybe? We'll find some other place to camp, Tutto. The party may have discovered our campsite back along the trail. And that's right. Hosell, Hosell! Hosell, help, Tutto. Help, Tutto. Bullet come from left. Must be in the Roy over there. They know what insight. Reach both here. Do as he says, Tutto. Indian. And they're heading right toward our camp. You must be Tennessee Moody. I've heard about that droll of yours. I'm Tennessee Moody all right enough. What I want to know is who are you? What's the idea of poaching on our territory? My name doesn't matter, Tennessee. As a matter of fact, my friend and I just out rode a posse. A posse, eh? What'd you do? Frankly, they mistook me for you. Everybody knows me by the way I talk. They heard that voice of yours.  Well, that's just it. I went to town and got supplies. And I changed my voice in the store. I reckon being about your size and talking like this is the reason for what they thought. What do you know? He is built like a Tennessee. And talking like that, even if I could mistake him for you, if I didn't know you so well. I was hoping I might be able to find you, Moody. What would be your reason for wanting to meet up with me, mister? Maybe to join up with your gang. It could be reasonable enough. Well, how much longer are you going to hold that gun on us? Well, now I guess you can put your hands down and be comfortable. I could use a couple of good men. I can see you don't scare easy. That's right. I don't. Of course, for the time being, you'll both be sought on probation to your work a job with this and prove yourself. That's all right with us. Am I right? I might as well warn you that men will be suspicious of you for a while. So don't go pulling anything funny. One of them decides an ombre can't be trusted. They don't hesitate to put a slug into them. I understand, Tennessee. We'll both be careful. All right, then. Come on, we'll take you to our camp. Get a bag.  After riding hard for half an hour, the outlaws led the Lone Ranger and Tato into a small valley where there were two shacks which they used for a hideout camp. The outlaw, Bill, took the horses to a lean-to out back. Then he went to one of the shacks to rest. Tennessee took the Lone Ranger and Tato into his own shack. You can bunk in here with me, mister. I reckon the Indian will want to roll up in his blanket outside. That's right. Well, thanks, Tennessee. Oh, where are the rest of your men? Well, there are just two more beside Bill and me. Oh? The other two, Tex and Blackie went to Farville west of here to line up a job for us. They'll be back soon, I reckon. Sit down, mister. Oh, thanks. I guess maybe you'll enjoy hearing about how easy we pulled that bank job in Krag Rock today. Yes. Tell me about it. Well, we started at noon. Everything was quiet in town. Then the four of us rode in slow like and drew rain up before the bank. As Tennessee started to tell about the bank robbery, Tato walked back and stood in the shadows. Unabserved by Tennessee, the Lone Ranger moved his hands, forming words in Indian sign language that Tato understood. Though the masked man didn't take his eyes off Tennessee, he knew that Tato would be watching. We wound up Bronx and Hightail it out of town before anybody seemed to catch on to what had happened. You had things well planned? Yep, we sure did. Well, need go now. Get blanket. Get sleep. All right, Tato. Good night. Good night. Until we're sure about you, I'm not letting you and that Indian friend of yours get together to do any talking, mister. I gotta play safe. That's all right with me, Tennessee. Well, I think I'll rest in one of the bunks until the two men you want me to meet get here. Sure, go right ahead. Thanks. I'll play a game of solitaire till Tex and Blackie come back. Then I'll wake you up to meet him. It was almost two hours later that the Lone Ranger heard the door open and sat up in time to see Bill enter the shack. Hey, Tennessee, Tex and Blackie just got back. Did you tell them to come in here? Yeah, but they found out something when they went to the lean tool to put up their Bronx. What? Well, first, the Indian's horse is gone. Are you sure? Maybe Tonto just went for a short ride. I don't save you an Indian riding around at night for pleasure when he's in a saddle most of the day, mister. That isn't all, Tennessee. Tex looked over that white stallion out there. Says he knows of a mask ombre who rides one like it in Texas. A mask ombre who carries silver bullets and is on the side of the law. He's called the Lone Ranger. Don't move, mister. I want to have a look at one of the bullets in your gun belt. This mask ombre has silver bullets. Then he must be the one that Tex is talking about. He must be that Lone Ranger who's on the side of the law. All right, mister, speak up. Is that who you are? What of it? So you admit it, huh?  Well, I think I will.  Let go. Drop that gun.  This will set a view. No, my man. I'll get you for this. I'll get you.  Let him have a text. I sure will. No, you won't. We caught this one outside. From the past. They caught Blackie. You all right? He must have eaten. Yes, Tutto. I was afraid you couldn't convince the sheriff. Got here just in time. The Indian come to my office. We were going to hold him till he showed us a letter he brought from your saddlebag. You know, the one the general of Texas gave you is identification to the command and officer at Fort Prescott. Sorry he didn't show me that when we first met, mister. I didn't think he would do any good then, sheriff. Well, here at Tennessee Moody and his men, I guess you and the posse can handle them. Oh, he sure can. And thanks for capturing them for us. We left our horses back aways and come along on foot, so they wouldn't hear us. Good enough. I don't know how to go now. How do you? How do you miss it? He didn't tell us what that letter said, sheriff. Yeah. Who is that masked man, anyhow? The letter signed by the general said a masked man riding a big white stadion and carrying silver bullets was on a mission for the army and could be trusted, absolutely. And it said... Where I come from, down in Texas, everybody knows who that ombre is. Tennessee made the same mistake lots of other alhoots make. Lots of sheriffs, too. They think that masked ombre is another outlaw, but they soon find out that he's the toughest ombre on the side of the law, the Lone Ranger. This is a feature of the Lone Ranger Incorporated, created and produced by George W. Trendle, directed by Charles D. Livingston, and edited by Fran Stryker. The part of the Lone Ranger is played by Brace Beamer.


Mae'n gwneud gwreun, rydyn ni'n 19 oed. Mae ymddiwedd yn 2012, yn yw 14 oed yn ymddiwedd ar hyn y gymaint, mae'n cynghori gynhyrch yn ôl, yn ystod y bydd y gwirionedd eich gweithio, ac mae'n amserהeth o'r cydweud yna bod y gallwn gwneud y bod ymddiwedd. Llywodraeth, lle'n gwirionedd ar y dyfodol. Mae'r ymddiwedd wedi'u sbêig yn y clywbeth, ac mae'n gweithio mwyaf ymddiwedd am gweithio'r sbêig ar y dyfodol. ac siwgoed eich ei wedi'u lle pensio'r awg yn cerdduret ac eisiau ddaeth ei wedi sefydlu i gymryd o'r yrhafl, ac rydyn ni'n gennych i wath ei cyfrifatau. A beth yno mor wneud rydych chi'n cerdduret yn gallu gwneud y tro. Mor maen nhw'n dechrau deitchi a gennymwyr tyfu ysgolwyd. Efallai chi'n dechrau ar y cerdduret, ac ni'n gyntedig yn ychydig, a'i newidio'r lle chyrwysau cerdduret oedd yn cerdduret a oes yn gwybod. after receiving a kidney, she was telling, she wrote a letter. Dear family, my life and health is now improving every day. The gift of a functioning kidney means that I will now be able to do things which have been difficult in recent years, such as enjoy a family holiday without the constraints of dialysis. Go swimming in the sea, take a long soak in a bath, ride horses again, but most importantly, live life to the fall and enjoy each day. But please know, not a day passes when I don't think of her and thank her for this gift she has given to me and my family. On the 17th of April each year, when I celebrate the day when my life started again, I will say a prayer and remember her. We've created a charity called Cronvo LN, which is this, what this badge is and what we try to do is promote the discussion of organ donation. It's a difficult topic to discuss, but it's beneficial for you as a family if anything ever happened. There's so many people waiting and just a quick conversation could save a lot of other people's lives. So the thing you should do is discuss with your family. It's just a simple yes or no to tell them what your wishes would be if anything ever happened because it made our timing a lot easier.


KZN-born teacher living in China on how to curb COVID infections As the country battles the coronavirus, a South African living and teaching in a Chinese city where the pandemic has been contained offers the assurance it can be beaten, and shares his own experience. Endo Miso Chilli on Thursday told Times Live that in the city of Xi'an where he is based, they are reaping the benefits of having followed strict lockdown regulations when they were first implemented at the start of the outbreak. None of our students have tested positive for COVID-19, said Chilli, who teaches English and biology to grade 10 to 12 pupils. It goes back to what the country did at the initial stages. We tried to avoid as much contact as comprehensively as possible. China was very efficient and good with how it dealt with it, Chilli said, quickly highlighting that it would be unfair to compare the strengths of the two countries. But when they said lockdown here, it was really a lockdown, said Chilli, adding that they were strict with self isolation and quarantine. The 27-year-old teacher explained that during their lockdown, he spent 52 days indoors, not even going out for essentials. They structured things in such a way that a single person would go on essential runs and drop-off items at each of their residences. They dealt with all the cases that were there and ensured that there were no people going outside, golly-banding. Everything was literally closed. The economy included. Everything was at a standstill, he added. Like South Africans back home, he also faced the hardships of the lockdown, saying they had salary cuts and were forced to survive on minimum wage. Times were very hard. Life completely changed during our lockdown. Chilli said the coronavirus was a virus that required a different attitude. It needed discipline and for people to follow and support the authorities, he said. In ZN, after weeks of lockdown, they reached a stage where on some days, there would be zero new cases reported. Chilli said the attitude and behavior of the people at the beginning of the pandemic contributed greatly to containment of the virus. It never reached a stage where the hospitals were being overwhelmed while we are going out to parties. We listened. No parties, no clubs, and no gatherings meant just that, he said. As a precaution, pupils are still wearing masks and sonny-ticing at his school. It's just for formalities but, honestly speaking, the outbreak is over in my city. We are OK here and things are much more relaxed, he added. Asked how South African teachers who are dealing with fear and anxiety could handle the virus, Chilli said they should continue adhering to the rules and regulations being put in place by the authorities. Though I believe, in my own individual capacity, that it wasn't yet time to allow students to come back into the classrooms especially because it's winter in SA. The same thing happened in China, it was at its peak during winter, he said. As things returned to normal where Chilli is based, the teacher, who is originally from Kwadukyosa in KwaZulu, Natal, is making waves as a foreign teacher. At his school, he was recently awarded the Teacher of the Year Award, after more than 95% of his biology students obtained straight as. He also achieved a 100% pass mark for both life sciences and English. It has not happened in eight years in the school. It's not a norm because of the language barrier. Students do not perform well at times when taught by foreigner experts, he said. Asked about his future plans, the University of Pretoria alumni is doing his masters at the University of Hong Kong. Home is where the heart is. I'd love to come back home should there be a need for me to come back home and give back my skills. It's part of the plan, when exactly, I am not sure, he said.


The International Donation and Transplantation Legislative and Policy Forum has released a set of recommendations to guide the development of a robust deceased donor research framework. The recommendations focus on PFD and public involvement in research, donor, surrogate, and recipient consent within a research ethics framework and data management. Additionally, the forum recommends the creation of a centrally administered donor research oversight committee, a single specialist institutional review board, and a research oversight body to facilitate coordination and ethical oversight of organ donor intervention research. This article was authored by Manuel Escoto, MPH, Fadi Issa, D-Phil, Florence Kaowet, MDCM, FRCPC, and others.


Hi everyone again welcome to the LPS class we are continuing our discussion on Python in the last lecture we saw like the regular expression pretty much lately covered how to do the expression we saw this particular thing basically where we kind of match the string using the R which is the raw string basically like I mean then once we have that the one the match string then we substitute it PSI 3 PSI 4 and then we explain this concept of this basically so event will do this section this section we also talked about some of the additional stuff so we can use basically can do the search regex is the subject or match regex is the subject as alternative syntax and the match basically it only looks for the match at the beginning of the line it does not match the whole string just the search attempt to match throughout the string until it finds a complete match so that is the difference between the match and the search we also have this find all that is another method inside the class re and that actually returns then array of all the non-overlapping matches we can also do like using a far loop here basically which is for M in the find-deter method basically and then you can find each one and then on the M is basically and then find all of them so this same as the find all and then the the matching itself is basically the level where the we can start the regex with question mark I question mark S question mark M so this is something that we saw and then we also saw the split basically which is another method in the regular expression class and here when we do the split essentially splits on that particular string so it basically it replaces the PSI 3 with PSI 4 so in this one basically it just splits and then this is removed so your output is going to be just the program PSI 4 was an excellent problem that's all so today we will continue some more the discussions on the regular expression finish off the regular expression and then move on to the next chapter so so basically the match object function essentially like so search and match return a match object the object has some useful functions basically and do group that is to return the match stream and then start basically that is the starting position of the match and then end is the ending position of match and then we can also like do a span which is basically it's simple containing the start in positions of the match so just to understand it more thoroughly like I mean the Python offers two different primitive operations based on the match checks for the match only the name that we saw and then the search basically searches for the whole thing and both of them returns a match object now here are some match object examples so we declare or we define one of the variables line also the string and then we say match string search for PSI 3 in line and then so basically the match starts a character we can say match string start master this particular variable start dot start and that gives basically like I mean where it starts the match which is the PSI 3 and then there it ends and then before the match before match and after match basically that is with you can specify the index and then start and then all the way up to the end now start at end so so this will give you like on this section so the first one will say the three and then essentially like I mean from three next to all the way up to end and then here it will start from here and so now let's talk about the capture groups so this is useful to actually apply certain after after obtaining a match take that match and then use it in then as a next variable to do some processing so we did this for both pearl and tickle so the parenthesis inside the regular expression denote a capture group which can be accessed by the number or by name to get the matching essentially of the capture text so we can name the capture groups with this kind of syntax where we can say like in question mark P and then the name and then we can also take advantage of the triple quoted strings which are multiple lines if you remember we talk about that to define the regular expression and that can include comments as well and if you use the this particular method which is verbose method that option and you can use that so let us look at some examples here so again we define a in file where we open this test or text with a read only and then we define all the lines basically like when read the lines and this is the method for the reading the lines for the in file and then we close that particular file now we use the triple quoted string essentially like I mean so we want to be spring so we start with the triple quoted string basically like some optional white space in the beginning and then we say basically so okay now question mark P key and then followed by any other thing so any word that begins with P we match that here and then we again have like you know equals time with some optional white spaces so whatever there is some sign there and then finally like I mean the non space after the equals to is the value this is so we match the key and we match the value and they are stored in the key and then the value so here as we saw here basically the P name so so assume that you have like X Y equal to 3 B equal to 4 C equal to 5 something like that in this particular test of text file so now we have the thing before the equal to is a P and then thing after the equal to is the value so this becomes an an array that you can store as a key value that then we do the restring ignore case essentially like I mean then then pipe it to the verbose basically and then that is what we are compelling and then we do like the for line in the lines so print key equal to the match group key and then value is match group value so this again prints basically X Y and then 3 and then it continues on the 4 C 5 so that is what we want to get basically so in the in other words actually like now this is for as an array basically you can think of this as restring X Y E equal to 3 this is what we have store essentially so now let us move on to the next collection data types so here we will talk about tuples the lists and dictionaries essentially so tuples are collections of collection of data items they may be of different types and usually tuples are immutable just like strings that we saw basically like I mean the the lists are like tuples but they are mutable so that is the difference between a list and the tuple so Python uses this parenthesis to denote a tuple you could also use the parenthesis if you have just one you have only one item but if you have one sorry if you have only one item then we need to use a comma to indicate the tuple so here we have like three names so we just put comma and then put it and put it into whereas if you have just one name we just put the name then follow the comma and then put it inside the parenthesis and then the empty tuple is denoted by just empty parenthesis we need to enclose a tuple in a parenthesis if you want to pass it all together as one argument to a function so this is you can think of in the typical we had this basically like notation there we pass the entire thing as this one object so some of the other things that you want to know about tuples are tuples are also like iterable meaning like you can iterate one by one and the anything like I mean that that is pretty much it basically on the tuple now the list essentially lists are like tuples the only difference is that they are mutable that means that you can actually change that data structure and they are denoted by square brackets instead of the parenthesis so here we have like 1 3 5 7 11 and that is the that is denoted as a list and then you can also have different values this 0 1 boom is also list and empty list is just square brackets stuck together and so the mutable property is described here and add elements to the list or basically you can append an item here we define a particular list 1 2 3 and if you want to append done to it we use the method except and done and then that prints out with that both the lists and tuples contain object references so the list and tuples are also they can be nested so you can actually describe the tuple within a list and the list within a tuple and tuple within a tuple and list within a list so here we can say basically so a equal to 0 1 2 b is a 34 and when we print a it basically a nested list is getting printed if you print b 0 1 it prints 1 so if you print b 1 0 basically that results in an error so the 0 1 is the subject so b 0 if you just print b 0 that is 0 1 2 and b 1 is 3 so b 0 1 is actually this object which is 1 there has be 0 0 is just 0 so some more examples of lists so this is like a list example of I we define one list which is just the odd number except odd numbers except 9 and we print x now when we print x 2 and anyone tell me like what is this one this is actually like now it is 5 x 2 is 5 now we do this operation which is here to in assignment x 2 equal to 0 now what do you think will this is a replacement happen it happens in list because this are mutable so we can you can actually change them so we will replace 5 with 0 with when we assign this one and then if you print out x if it prints like 1 3 0 7 11 and then we can apply x append the method append to it with number 13 which just adds 13 and then everything in square brackets okay and then if you remove one this removes one and it is not the item at position 1 it just removes one item so the remove one basically let me remove the first item the position 1 is actually number 3 so this is the first item just gets removed and then we after that we insert at the first position the insert number 42 so this now the insert actually takes this as the positioning thing so for that it starts from 0 1 2 so the one position is going to insert 42 so overall list is going to be like 3 42 then 0 7 so the 0 is pushed and then it is inserted there so I want you to remember this thing the remove one doesn't mean that the first position gets moved but the insert one means that the first insertion the insertion happens at the first position okay now let us look at the some of the indexing so the indexing we know that actually it starts from 0 1 2 3 and 4 so in this case the x2 is actually 5 that is because it is a counting from just to write it is 0 1 and 2 and then when we do an assignment with x2 equal to 0 since it is a mutable it basically now changes that and then so that the 5 is replaced with 0 so the difference between again the list and the triple that we saw is while the index indexing of a triple also works exactly the same way starts from 0 1 2 3 4 you cannot do this operation because the the triple is an immutable data structure so you want to do that and then slices is another one slices work as for strings basically like so if you remember in a string like I mean S T R ING we can specify a slice of R IN which is like starting from 2 3 4 2 column 4 that is the string those are still apply with the lists so here we can specify like I mean it's a 2 column 4 and then that is like 0 1 2 2 4 so 2 and 3 will be printed out so here it's basically R IN is 2 equal 5 and now we cannot this additional operator which is basically the incremental operator that we saw basically here we have a list 1 3 5 so we can use the method a dot up n this is one way to do it and then we say 7 and then that added at the end we can also do just simply a equal to plus and then the square brackets 7 and then this will add that element into that list if you try just a plus equal to this regular 7 this is a failing fail case because you need to specify the 7 inside the list file for it to be added to the existing list so when we do this the result is 1 3 5 and 7 and then we can also add anything basically so we say like the end add the end into the list so again we use the same thing and then now we feel printed a it's 1 3 5 7 and then the string the hyphen end so this is another shortcut operator that you can use it instead of the append function now let us look at the dictionaries the dictionaries are nothing but items are it is an unordered collection where items are accessed by a key and not by the position in the list so a dictionary is just like a hash in the collections of arbitrary objects and we can use object references like this and then dictionaries are also nestable you can grow and shrink in place just like this and it allows concatenation slicing and other operations that depend on order of the elements so they depend on the order of the elements do not work on this so all these concatenation slicing and operations which depend on the order of elements they do not work in dictionaries so let us look at some examples of a dictionary so here in this example made like jobs basically David professor Saharan postdoc Sean grad student so these are the three elements that we define inside the dictionary and you notice that actually each of them is basically it is a keyword followed by a colon and then another keyword and then a comma so anything before calling is the easier key and then the other side is the value so if you just say jobs Sahan if you post it off and then this is also a mutable database so essentially you can just say like jobs Sean equal to postdoc and then you can change the job of Sean also to a postal and then if you want to list of keys and values we use this basically like the this method is so for jobs dot is basically it prints the three keys and if you notice basically like the order actually it changed originally our order was David Sahan and Sean now the new order is Sahan Sean and then values generate again the corresponding values in the thing so this is another method that you want to remember and then once you specify the values you get postdoc postdoc and professor which has professors are in profession of the jobs of these people to query like every element which is like a key and the value together use the items function so the jobs dot items function returns Sahan postdoc Sean postdoc David professor so that is how you can access those values in the dictionary so the key thing that you want to remember is it starts with the curly braces ends with the curly brace that is the dictionary and then the items the each key is separated from its value by this column and then the each items are separated by commas essentially so that is what here and then the whole thing is enclosed within the databases so the empty dictionary you can create it by just putting empty databases so here only thing is even though we said that basically like this is a mutable type of database the keys are of immutable database in data type so these are immutable they they should be one of either string number or a chip these are the only data types allowed as the key the value can be anything else so because the value itself is not immutable it is actually immutable so now let us look at some of the common operations that we can do in a dictionary so we can delete an entry by just using DAL followed by D and then the key name then if you want to add an entry then the new key is the new value if you want to find out if particular key is in the dictionary and we can use the has key function as key key name or a name in D basically this is another another thing the get is a method that is useful to return value but no it does not fail basically so it returns none the keys does not exist so you can use the get to get the one but if it it won't fail basically the key doesn't exist so that is only target so the way to use it is be get and then the key value then the default update merges one dictionary with another and then this overwrites the values with the same key so the usage is like the update D2 and then we give the dictionary version so now if you want to iterate dictionary through the keys we can use the far command so here actually like I mean we can specify like one with the win and Margaret Mitchell in a the Virgil and Odyssey by Homer and then we do the par book in book authors so it knows that the key is actually like going to be the book and then we basically book authors basically so it gets each one and then it adds the buy and then basically prints the whole thing so wherever like I mean when you specify variable that always iterates on the key so as you can see like actually key is the most important item in dictionary so the properties for the dictionary keys essentially the values themselves have no restriction they can be any arbitrary Python of it either standard objects or use of different objects but there are two important things that you want to remember one is more than one entry for key is allowed so if you have so when a duplicate keys encountered during an assignment the last assignment always win so the simple example will be define a dictionary it equals again the three things that you want to define in between your intro within the value basis and then put the key say name and then put the colon essentially and then Zara and then comma so this forms one element and then age I mean pollen and then cell and then another comma and then finally again we call it name pollen num this also includes we need to close the process so now in this particular dictionary if you want to print the square brackets name and this will always be many the Zara name is gone only we can smell because that is what its last updated values so if it cannot be hashed it just just overwrites it overwrites the previous value or with the new value now constructing dictionaries from lists so for this we can use the zip function so if there are two separate lists for keys and values we can combine them into a dictionary using the zip function and the dict constructor so that we have a dict constructor and a zip function so the way to use is basically we define the keys we define the values and then the dictionary variable equal to dict zip keys with values so some general keys instruction basically like so keys don't have to be strings it can be any value that we already saw it is only it is immutable data that including tuples this particular property is good for representing sparse matrices so here there is a matrix which is just a blank a dictionary and then we populate essentially one value 101 0.5 so the key is triple you can see that basically it's imposed in the analysis and then 1 1 4 is another one which is 0.8 so to represent this basically so it's it's a good that you don't have the string or any other this attack so collection length essentially is computed using the length variable that returns the length of a triple list or a dictionary that is like how many number of characters of a string so LEN Tony with these parenthesis because this is a triple and we are looking for that the length of the triple it returns 1 but if you do a length of just Tony without the triple now it returns 4 and length of a list essentially 0 1 boom is 3 so let me talk about some of the built-in operators dictionary functions and methods within the thing so LEN LEN is one of them the other one is CMP CMP basically the usage is dict one and it too so this method actually uses CMP basically compares these two dictionaries and then sees whether they are the same or different we can also have a STR dict which is a conversion from the dictionary to string and then there is also a type variable this returns the type of the past variable if the past variable is a dictionary it will it will define or it will return a dictionary type now Python also supports a lot of methods one is dict clear this clears the all the elements in the dictionary essentially dict and then copy is another one which makes a shallow copy of the dictionary itself and then the dictionary from keys is another object that creates a new dictionary with keys from the old dictionary and then it sets the values so to 0 no sorry the set the values to the value itself so the usage is this dict not from keys and then the palm keys as the parenthesis as well and then there is also a dict key with the default none this returns the key and then it returns a value or a default if the key is not in the dictionary and then dict has key actually returns true if the key in the dictionary is in the dictionary dict is form and dict items essentially it returns the collection of dict key value to put that big standard faulty is another one which is similar to the get but it so the dict has has key returns true is the key is in the dictionary dict or returns false and then we have items update dict values there are several methods that are available now let us talk about the ease operator the Python variables are really like object references is something that we saw the ease operator checks to see if the references referred to by the same by the object the same object are they like actually like referenced by the same object or not here we can have two identical objects that are not the same object actually try to access the other other motion and then the references to the individual constants should be identical so the reference to strings may or may not show up in the top as referring to the same object to identical mutable objects are not necessarily the same object so let us look at an example some examples of ease operator so here we define two of them and then print x is y then it is true here but it is not necessary 1, 2 this one is false because it is a list and then in a triple again if you ask print x is y it is also false even though it is identical and then it is equal to the stack bracket basically there x is none true now we talk about an in operator in operator is for the traction data again the in operator determines whether something is a member of a function or not so this is what we used for for like some value that is part of the program or not so we use that so here an example basically like team we define as three people and then we say like other how well is in the team and then it is false and then stored not in team so keywords are here then it becomes true to travel the collection data type we are to use the you can use the IN essentially for something in something so the something in something is different here numbers are different at 1, 2, 3 and then we can fail it for I in numbers so basically takes those things and then print so here we get 1, 2, 3 so now how do we copy collections essentially we can actually if you if you make an if you use an assignment it it just makes a new can new reference to so here basically like we just say it's a list B equal to a C equal to a column a star brackets and then just call and then you say B equal to 1 and C equal to 1 and then we say like then as to print the A B and C so then now essentially like it prints 0 5 3 0 5 0 7 and we can copy the dictionary with the copy function so essentially a column copy now there are a lot of other methods essentially like for the this variable essentially so some of them are one is clear which removes all elements of the dictionary or dictionary whichever dictionary that is specified the copy that we saw basically it returns a shallow copy of the dictionary from keys we saw already like that is set and then get E default none it gets all the keys and then has key returns the value basically of the key returns true if the key is in the dictionary else it falls and then the item that we saw keys we saw and then we can also do a set default there we can which is very similar to the get or DB copy sorry DB get of the get parenthesis function and update is essentially we saw that that is updates the key value there and then values actually gives the dictionary of the dictionary values so let's stop at this point today and then we will go into the advanced functions in the next class