Biographies, that's what happened yesterday, it would consume like the first 10 minutes of the talk, it was kind of funny. Did you have something else to keep going? No, no, that's okay. I am Pete McKinnon, I'm a software engineer in... I think I'll hold this out here, it seems kind of live or hot or something. I think this is picking up the feedback. Yeah, we're going to get something up here quickly.  Any questions so far? This is cute. Oh it does, I'm good. What was your favorite? The entire time. Okay. Hers had a few feedbacks, because we were from the demo. We needed to log into the cluster, we hadn't done that previously, so, as well. I'm turned off, but... There was boom and feedback. Boom. My name is Pete McKinnon from the Red Hat AI Center of Excellence. We need to let the AI know what we want. Oh, we must find them. Good to go, and your mic's good. Hello. Okay, so today's, this morning's talk, is scalable Kafka deployment and open shift for machine learning. So we're going to go through and talk about various concepts, I'm Pete McKinnon as we all know now, and that is Malik Shah, and we both work in the Red Hat AI Center of Excellence. Next slide. So, we're going to do a quick overview of what it means when we're talking about stream processing for machine learning, and then talk about the Kafka project itself in Strimsy and the relationship between those two open source projects. And then Malik's going to lead us through a fascinating demo. And then he'll wrap up and sort of talk about some of the stuff that we learned in deploying this in our internal data hub that we use at Red Hat for processing large amounts of data and integrating with various components in our internal data hub. And I guess some information about monitoring and then Q&A from that. So, next slide, please. So, there's various ways to, as they say, skin and cat, but in this context when we're talking about stream processing and machine learning, we're talking about gathering huge amounts of data, ingesting it and feeding it into a system, whereby the ultimate result will be a model produced from various machine learning sort of techniques and development techniques. So, at the very top we have applications at the edge, IOT devices, databases, and they're all pumping information into a stream processor. And on the front end, for a data scientist, if they're doing development of the model, there's various things that need to be done and it's perhaps more the domain of a data engineer to do take care of the ingest and cleaning of the data, splitting it and then validation. And there's various tools and techniques for doing that. And then there's more into the data science sort of aspect of it. There's the analysis of the data and then coming up with a model using various types of techniques, perhaps the selection for this particular given application. It should be a convolutional neural network or something like that. Finally, you go into model training and then after a period of time when you're doing, you've done model training and comparison of various techniques, perhaps there's parameter tuning for sort of the information that informs the model, not the data within the model itself, but the parameters around the model itself. And then that resolves to a model itself. At this point when we're doing serving of a model, we're sort of talking about inference. So again, from a stream processor that has ingested information out at the edge or IoT or whatever, you can throw that data directly at the model before inference. So there's various sort of paths, if you will, that involve the stream processor. There's model development and then there's the model inference itself. Next slide. So one of the leading stream processors out there, perhaps sort of the de facto these days, is Kafka. It's a project of Apache and it is a distributed fault tolerant stream processing platform. It's JVM based, it's written in Java and Scala. They build it with Gradle. And there is a company that's sort of behind it that brought it to open source, but they also provide enterprise sort of support and value add for that and name of that company is Confluent. So they have sort of a mixed model, sort of, there's open source and there are some proprietary features that customers can get supported versions of to enhance the core of Kafka itself. It's basically represented by four APIs. There's the producer, consumer, streams, and connectors. And we'll sort of go through the architecture on the next slide. But basically the use cases for this stream processor for Kafka is simply as a pub sub type of message bus, right? So you can have message queues and eventing from messages that are passing through the system. It also could be used for highly available data storage. In fact, in our internal data hub, we kind of use it as a data caching layer, basically. And Malik will maybe speak to that more later on. And then there's the processing of the data as it's traveling through the system in real time. And there's APIs for basically appearing into the stream, the message stream, and extracting information from it. There's an add on call case equal for that sort of capability. General architecture, I mentioned the API. So basically producers and consumers, probably most of you are familiar with the general pub sub model. And that is implemented by various different tools and frameworks. But Kafka has become very popular out there in the open source world. And it's actually been highly adopted in the enterprise because of the features of performance, scalability, reliability. But on the producer side, you have some applications that are generating messages through that API into the Kafka cluster. And then consumers taking those messages off the bus. And then stream processors, I mentioned case equal. Those can be written as applications to basically inspect the traffic traveling through the cluster. And then there's a whole portion of Kafka that's devoted to connectors. And there's quite a variety of different types of connectors, different types of databases, various types of, what are some of the examples, Malik? There was some of the connectors that... Well, Kafka 2 S3. Yeah. That's something we use internally and it's streaming around maybe like 50 gigs of data every day. Yeah. Yeah. So that's the overall architecture at a high level. We'll go to the next slide. So the internals, the best way to think of how Kafka operates is as a structure of distributed commit log. So you have these streams of records and they're organized into what are called topics and those topics are partition. And one of the important features, like I mentioned with Kafka is it's highly available and it's resilient. Part of the way that's achieved is by replicating these partitions across servers in a Kafka cluster. So you can configure the number of clusters depending on your requirements for your overall messaging application. Partitions are organized. There's always one leader and you could have zero more followers. Again, it's a decision that you would make about sort of the sweet spot I guess for what you will tolerate for high availability and resilience. So the leader is in charge of doing the read rights to a partition. And then these followers sort of literally that they come up behind and sort of passively replicate from the leader. So for high availability, if a leader was attached to a process and that node went down or went away, then one of the followers in that group can be elected and that's the role of zookeeper of maintaining quorum within the cluster. So that's the high availability part of it and then there's also load balancing. So because servers can act as both leaders and followers, they wouldn't do so for the same partition, but we can assign different partitions so leaders and followers are maintaining the sort of shards, if you will, or slices of the partitions. And again, that means we can distribute the processing traffic across these various servers in the cluster. So anatomy of a topic, we have partition zero, partition one, partition two. And like I say, it's basically commit log. It's writing these records to these partitions at various points in time and then the consumers are reading from those partitions, you know, and consuming them based on where, you know, I guess the model for how they want to consume the messages. Next slide. So we were for Red Hat. Was this all mean? Kafka sounds great. It actually runs great on Kubernetes and it runs great on OpenShift. And most of you are familiar with OpenShift, I would think. So basically our enterprise-grade Kubernetes distribution, it is Kubernetes. It's not a fork or anything like that. It has productive extensions for developers as well as enhanced security for enterprise customers that need to rely on that for their operations. The newest version of OCP as we call it, Red Hat OpenShift, is operator-centric. If you look at OpenShift 4, everything is composed of an operator. It is sort of the defining paradigm going forward for OpenShift and I would say the Kubernetes community in general. So the control plane in OpenShift 4, the infrastructure, it's all defined by operators and those operators are essentially controllers. They are managing a life cycle of specific components. It also has native integration with the operator life cycle manager. And what that means is that you can basically pull in different types of operators for your application and install them into the system. And it basically renders an application for you, something like it could be Couchface or perhaps it's Postgres SQL. It's taking care of everything necessary that you used to have to do as an operator by manually sort of configuring the master and all that stuff. So that's all taken care of for you. The reason we're talking about that is the next slide, which is Strimsy. And Strimsy is a project that was started by Red Hat and it is basically an operator for Kafka. So this is an open source project and the general architecture here is that it's actually a Congress, if you will, of operators. So there's the cluster operator that's responsible for managing the actual broker and worker nodes and the zookeeper quorum. With operators, they're typically defined as some custom resources and perhaps you've heard the term custom resource definition. So there's custom resources that also constitute Strimsy. One is for user operator and the other is for topic operator. And we'll talk about those on the next slide then. So again, cluster operator manages the lifecycle of the brokers, basically the message bus itself, those components, those replicas. That's what we would sort of refer to as the Kafka control plans. And then there's the topic operator that manages the lifecycle for a custom resource called Kafka topic. And those topics can be deployed as part of your application. So when you install, say you built up an application that part of it is the message bus that's provided by Kafka. You can in advance sort of define these topics that will be deployed and managed as part of the application. And then Kafka user. And that custom resource is responsible for defining the authentication for any producers or consumers of messages from the message bus. So I'm just going to go back to this one slide. Yeah, anything you want to correct me on? No. So the demo I'm doing is like the stream processor, which is going to send like one data, probably like every one or two seconds to the solving layer. Oh, yeah. So right now we have open chip running and some AWS server. And I have deployed Jupyter Hub, which is basically a repo for Jupyter Notebooks. We have like three Kafka brokers, three zookeeper brokers. One for me just sense if you know guys who promised us it just like provided the endpoint, it would scrape all the matrix from it. And Grafana is to visualize all those for me just great matrix. And here is a frimsy cluster operator, which manages all of these. So here is a model training notebook. And I'm just going to restart it. And this is all like just getting the dependencies. Do you want to scan the code? Yeah. So here we are getting the like Kafka Python library, which provides us to actually interact with the API and this other standard data science libraries. And here we are reading like a credit card.csv. So this is a credit fraud monitoring use case where we are training it on some 28,000 rows of credit data. And we are splitting it into some, I think it's a 20, 70 split or 80 split or something. And we are then training like random forest classifier on it. What we are dropping is the time and class classes. And actually one is it's a fraud. If it's zero, it's not a fraud. This should take around 30 seconds. So in that time, I'm going to go through the consumer code. Let's just give it a fresh topic name. So one thing to keep in mind is always define a consumer group while writing in consumer just because if you don't specify every time the consumer starts, it's going to get assigned a new consumer group. And the memory overhead of it really builds up because each consumer group is stored on a topic with the consumer offset of it. And it grows exponentially if you have a consumer running every few seconds. And that's something we saw. And here I've just defined a predictor where we provide like a tuple of 29 columns and it would just base on the model, give you a prediction whether it thinks it's a fraud or not. Coming back to this, I'm reading like a record from the consumer as in when it arrives, getting rid of a few columns and things and changing it on tuple and just providing this predictor with that list of 29 columns and see what the model thinks. So it's still training. Last time yesterday I checked leaving. Oh well, we can wait for this. Let's go to the other notebook. Yep, again, the same thing. And here just get the dependencies. Here what I'm doing is read the CSE split into two data frames, which is one is fraud, one is not fraud, just because you have like 400 frauds and 28,500 non-fraud. And there's a fair chance in the demo you might never see a fraud coming up. So split that. This is my function to actually send the message to the topic. It's literally just four lines. Define the produce, like import the produce library, provide it with the server address and define the topic and what do you want to send. And here it's just some logic about every alternate between like send five non-frauds and then send one fraud just for demo purposes. Let's update this tool. We can start sending messages. Sorry. We should piece. So this is like how many non-frauds we have. And this is like 500 frauds in the data set. And ideally it should be sending messages. Let's go back here. Yep. The model strain just printing out a dimensions like it's expecting 29 columns, printing some data about the model. It's random classifier with all of these parameters. And we start consuming. So this is all the messages are already received and it should like get one every three or four seconds. Zero is not fraud. Yep. And this is basically like at a serving layer. If you have some incoming data, you can go via Kafka just so it provides resiliency. Now speaking of scalability, what if we want to scale this thing up? Like you're expecting an influx of data and you don't want to break anything. So going back, we talked about operators and we are using an open data hub operator, which is Kafka like extremely integrated into it. All I need to change is I actually have a bit of this part. Come on. So just change like the broker replicas to five. So as you would have seen, we have three Kafka broker replicas right now. Apply the new custom resource and the port should start terminating in a minute. So it has to go through the reconciliation? Yeah. For the open data operator? Yeah. Just noticing you're updating like the ODA operator to scale. I know. So if it finds, well, it's, I can go through the playbook.yaml. But if it's fine, one specific component that updated, it would only like update that component. So Jupyter Hub and all of those, none of those would be affected. Is that your question? Yeah. I'm just going to restart it. So this sometimes fails with OCP4. Well, not to exist because I'm running the operator on my machine. I'm not using the image. You want to come back to that? To do. Well, we're waiting for the brokers to scale. This thing? It's just going through the reconciliation loop. Yeah. And Kafka is like literally at the end of it. This is the open data hub. So the operator SDK supports the creation of three different types of operators. So you can generate a Golang operator, but it also can be used to create an Ansible-based operator. And there's also a Helm operator. So this is. An Ansible operator. Operator. Yeah. Operators out in the wild. Most of them are written in Golang. There's other toolkits that are out there like Coom Builder for generating Golang. Operator scaffolding. But on this, it has preferences with the operator SDK. It came from CoreOS, which of course is part of the Red Hat family now. So as you can see, it's like the Shimzy operator is shutting down one Kafka broker at a time, spinning it back up. And then it should add two more in about half a minute. So we scaled from three Kafka brokers to five Kafka brokers just because sometimes they expect like more data. This is all on the fly. If you don't know, books should not be affected. It's still consuming and producing data as we speak. I think I understood. You used 48,000 plastic cards for trade taxes. And you're now scaling up your modern production data. Yes. Can you repeat this question? My understanding is that you used 28,000 plastic cards for trade taxes. Yes. And what is the size of the production data? Well, right now production data, what we face internally is around 20,000 messages per second at its peak. Yeah. I'm going to go through that in the next slide. And yep, two more brokers just came up. Let's see. How's Jupyter doing? Still going on. And that's what the talk is mainly about scalability. Like we can change the Kafka configuration and things on the fly, using SwimZ operator, like ODH operator now, without any effect to our production systems. Do you have confidence in the production? No. It's just changing the broken number. And we actually did that internally too, where we onboarded a new customer, which was sending us an extract, the Kui guys. I don't know how much was it, but basically they sent us more data than all of our customers combined in a single day. And during that time, we had to scale up our consumers and Kafka brokers for maybe two days. And it was literally just clicking a button, like plus, plus. And it was that easy. We don't, in our internal data hub, we don't do auto scaling. We're not tied in for me to sort of detecting, you know. No, we haven't done that yet. Yeah. But it's probably in our roadmap. At some point, yes. It's on SwimZ's roadmap actually right now. Yeah. We'll just start this. I said we'll just enable it instead of writing the logic for it. Right. So the rescaling is also the same? Yeah, just change five, two, three, and you should be good to it. It's slightly tricky, which I'm still going to talk about in the next slide. It's tricky when you're scaling down certain things to keep in mind. But scaling up has just changed the number. I mean, your OpenShift cluster has the resources. Yeah, obviously.  So, yeah, last year, when we were doing development and trying to build out the internal data hub, there was some of those questions about, you know, do we need more memory? Oh, yeah. I remember with the memory thing. Yeah. Yeah, that's also different. So now I'm going to talk a bit about monitoring. The open data hub operator comes with monitoring, like, with it. And if you want monitoring out of the box, all you need to do is set this flag to true, as it's easy for you. And so OCD gets out. So it comes with like a base set of dashboards. So let's just create some chaos. So OCD, delete one randomly. They should get a bit down. Oops, they're deleting. So as we see, a pod failed. It just got rid of it and started spinning up a new pod on its own. And they should have been updated, but I don't know what happened. But as we can see, I mean, this thing is still going on. And as we said, we can handle up to, given our application factor, we can handle up to four Kafka pods failing and one Zookeeper pod failing. So that just, and yeah, that was basically the demo. So lessons learned from production. As I said, it's easy to scale up. But while scaling down, you need to keep in mind the application factor, because you can't just scale down the replica count for the topics and its partitions. It needs to manually assign. So internally, what we do is we keep the replica count to, and at any given point of time have at least three pods of maybe 10 terabytes PVC volume. Each one, that just works. So we can handle up to two pods failing. So the partitions might be offline, but there's still no data loss because the in sync replica count is two. And I'm going to go through it the next time. The consumer group offset topic replica count. It's basically a topic which is created for each consumer group, as I said. And it just keeps a count of this was a last message read. This is the first message in the topic. And this is the last message in each partition, not topic, exactly. Partitioning comes with a lot of memory overhead. So just be mindful about how many partitions you create for a topic. More partitions mean more like parallel consumption of data. But it also means like you need extra 30 to 40% memory overheads. Coming to persistent volume games. If you're running Kafka in like a persistent state, have about like 30% extra volume capacity than what you expect, like for an average, just because if you get a data burst, the pods will fail if it's run out of memory.  Zookeepers. So Shreemzy comes with rack awareness and three zookeeper pods run well for maybe like 1000 Kafka brokers without any issues. But it always needs a majority of them available at all times. So given your network setup and your node setup, make sure you have like at least three zookeeper pods, but even five is not a bad idea. Given how prone they are to failure. If you have too many brokers, what we saw internally was two of our brokers were handling all of the load and three of the brokers were just like hanging out in the cluster.  So it's always a good idea to like Kafka balance the load instead of doing it yourself and keying in the values and consumers always define a consumer while consuming. I can't read this enough. Like just make sure you specify consumer group. Don't let it automatically create consumer groups. And this is what our internet application looked like. Like offset topic replication factor three. So each of our Kafka broker has one copy of the consumer offsets. This is a transaction state log to Neumann Cinco Africa. This is what I said. If at least two copies of the partition are available, it would consider it available and it would start producing and consuming data without issues. We are holding the time memory for 48 hours or until it's full. Two partitions each topic by default, because that's how our consumption thing works. Default application factor three. So each Kafka broker would have one copy of each partition. And that's how we can handle two parts failing without worries. Number of recovery tracks for data directly just defaulted to one without worries. This is one thing we found useful auto create topics unable like false so we can just control who we are onboarding and don't allow people to randomly write data of Kafka instance and since it's open to everyone internally. And this is what our monitoring dashboard looks like. This is the row we saw in the demo. On top of that, there is another project called Kafka Consumer Laggets on GitHub, which provides us with one valuable piece of information. How are consumers keeping up? If there's a burst of data, we might also want to scale up our consumer count. So this is something we are alerting on. If it goes around maybe like 3,000 memories per second, let us know we can scale our consumers up. Yeah, that's it. Questions. So in our internal data hub, it's flowing through the system and it's being stored in Elasticsearch and beyond that in the S3. So it's sort of in the middle of all this processing and sending stuff into what you would call a data lake basically and that's accessed by a lot of different groups within the company for the purposes of analytics for model development. And yeah, it serves quite a variety of use cases. Even like persistent lock storage. So when we were scaling up and you said we connect the PVC with it, so when you scale down, do you delete the PVC or is it in your script where when you're scaling up, the PVC itself is created? It's a PVC on its own, it's part of the SHIMS-E offering. Okay, so it's basically when you create it, it creates a PVC and when you scale down. Yes, I mean it should create a PVC if you have volume available. Yes. Yeah, there's no loss of data based on the Kafka architecture because of the replication of the partition. So those PVCs are basically holding redundant information that is captured elsewhere. And that's why Molek was successful in sort of scaling up and scaling down these brokers. The system does self-healing basically to make sure there's no data loss. Yeah. Viva had any experience using that Kafka topic operator? I mean, does it just lie to actually instantiate new topics through the Kube control API? Is that how that works? The topic operator? Yes. So we have, as you saw, we set auto-topic creation to false. Now the only way to create new topics is through the topic operator, you provide it with a Kafka topic custom resource. And I might be able to show them, can we show them? Like internal topics? Are we just topic names? Yeah, it's our internal data. I don't think we're, there's no... No, no, no. No, what he would show you is a flow of information from internal systems. Some of those are like image build systems, various types of build logs and things like that. Yeah, sure. So you basically provide it with like a custom resource of the type Kafka topic. And it's all documented in the stringy documentation. So that's where we actually define. So for like the busiest topic, we have increased the partition count to six instead of, so the topic operator overrides your standard configuration. And it works well. But one caveat is only a select group of users would be able to use the Kafka topic operator because it needs a special load binding of the type stringy admin. Yeah. Again, this is all the domain. This is stringy, which is sort of a meta operator, if you will, for these different Kafka components. So this is an abstraction provided by stringy, the Kafka topic, as well as the Kafka user. Any questions? Thank you. Thank you. MQStreams is the rehab problem about distribution of strings. MQP is the whole other thing. That's what you're... MQ is really... And then there's active MQ. MQ is really... Those three letters are a little too much. What would be the account in the end of... I think I was well-adventured. That's probably the specialty of the end user. Stringtree is open source. If you were doing an action deployment and needed for that support, you'd get a solution for it. By the way, stringy operator, you would find a reason to get open. Dare I say, I can't believe it. I mean, the custom methodology is the same. Yeah, yeah, sure. MQ, do you have any problems with the user? The thing that is going on with Kafka is that it sounds like they've had a problem with the user. That's right. That's the right attack you've got. That's why it's a bit more... It's almost under the hood, so like this. It's literally just great team work, right? Yeah. Yeah. That's it. Oh, here we go. Good luck. You ditching me? I'd love to stay, but I gotta drive to Canada. Are you driving? Which means getting a rental car. I don't know. I don't know. Wow. I'm not sure. Do I need to put that on? So you can use either? The round that's in here. Yeah. Yeah, so just go ahead and put it on. Turn it on. That's the sound check. You just have to put that just above the top of your shirt. Swans. I think our people just get... Oh, just the same thing with the community. You know, just... Do you want to make a little star? Yeah. Okay. That's good. Do you need any other rhymes? Just talk a little bit more. But don't leave the mic where it is. Okay. So what time do you want me to start? Is that good? Yeah. Can you hear me? Or do you want me to put it a little bit higher? Yeah, I think that would be good. Okay. Okay. Is it gonna echo here or... It's fine to sleep this one. Okay. I usually never get a call. It's either from...  That's nice. At least someone calls me. Good. So do you want me to start or do you want to wait for a few more? Yeah, I'll do it. Okay. Yeah, for everyone. Good. Okay. Hey, I'm Prasant. I'm a senior engineer slash data scientist slash... Sometimes I don't know what I'm doing, engineer on the AI center of excellence at Red Hat. So as you see from the slide, it's machine learning for developers and QE. So you can see from the title, I'm gonna start rambling on and on about machine learning. But why developers and QE, why disturb the poor souls and not let them live in peace. So what do I mean by machine learning? Now, if you walk down the hall, not that hall, nobody's there. So if you walk down and ask someone what machine learning is, you'll get n number of definitions. And God forbid, don't ask a data scientist what machine learning is. They'll confuse you even more. So, but here I'll refer machine learning. And I'll use it as an overarching term and relate that to anything related to statistics, like analytics, data, anything that you use with data and try to get meaningful information from there. And coming back to why developers and QE, there are several personas out there, like users, like data scientists, like rocket scientists, the mighty Thor, and even Ant-Man. They all have data. What do you do with that? And what do you do to get meaningful insights into the data? So machine learning is one popular technique to do that. And it lets you get meaningful insights not only into the data that you have, but also lets you foresee the data that you will have in more technical terms that's like the prediction. So I'm going to focus specifically on developers and QE, like explain certain use cases that's specific to development and QE. So let's see. I forgot what I practiced.  Well, is there like a hello world example for machine learning? That's the field is too broad to ask for that. But think of this as like a hello world presentation or a hello world template. I'm going to show like a tool or a framework that lets you turn pre-built machine learning algorithms into a service and kind of provide an easy interface for you to access these machine learning models through the service and play with your data. And if you want to move further and kind of advance the code, like tailor it to your own...


We're going to go out to Jim in Palm Harbor. Jim, thanks for calling. Thanks for holding. How are you doing this morning? Good morning, Steve. I'm doing fine. And I want to wish you a happy Thanksgiving. It's a great time to be with family and celebrate what the Lord's done for us. Absolutely. And thanks for that. And back at you. And now, are you the chef? Or is your family the chef? Or are you heading out for Thanksgiving? I'm from Tennessee, and we're living in Palm Harbor now. So we're not going home this year, but we'll probably go up for Christmas, though. OK. Well, good, good, good. So Walmart, tell us, I know you wanted to talk about Walmart. I believe you do. Are you, what are you looking for here? I'm not in it currently, but I was noticing there's a shooting star candle on the monthly. And it was almost a non-count. And I just wondering what your general analysis of Walmart is, that being a holiday season, where they're going to be selling a lot of merchandise. And I'm just curious what your thoughts and analysis would be on it. So in order for there to be, in order for that monthly candle to be a shooting star, at the close of the month, it's going to have to get rid of some of this wick to the downside. So there's just too much of the wick that is exposed for this to actually be a shooting star candle out there. So that would be the first caution that I have. But of course, as you know, we really can't confirm what the candle is until the end of the month, sometime next week out there. So if you're basing it on what the current candle looks like it's close, but Jim, it's no cigar just yet. If we do take a look at the monthly time frame, we'll only pull this over here, what we can see in the monthly time frame is that coming all the way back to the November 2016 lows, if we begin our wave count, first back in November of 2016 on a monthly basis, and you had mentioned the TD set up nine count, that was a TD set up nine count bottom. Then, so this is back in November of 2016 out there. Then price moves higher, forms a TD set up nine count top, it does it with bar number eight, moves lower, no pattern, just a retracement, no pattern on the monthly time frame, that it was a bottoming then. But if we do take a look at where we're at right now, we start from that November of 2016 count and use our Chapman wave tools out here. We do get to wave number seven. So it's been in wave number seven for quite some time. That actually, that count began back in June of this year. Well, I take that back. It began, the seventh wave began in September of this year. We're already in November, so we can see that this can continue. So it could continue into next month. Jim, it could continue into January. Price is moving higher, doing with less relative energy. So if there were to be a shooting start candle at month then, right now it's actually a bullish candle. It's a bull sash candle out here, but if it were to be a bearish reversal candle, then what we would expect is price to go to the testeebies green line. That's currently priced at $1,320. And below that, that would set up something else. But that's what the monthly timeframe chart is showing us. The profiles are so much lower, $84.19 is the top of the box. We really can't use that. From a weekly perspective, and if I didn't mention it, Jim, this month should be bar number eight on that monthly chart. So reason between bar number eight, it was showing roads momentum indicator, topping signal as well as wave number seven. So you do, your eye is in the right spot with regard to Microsoft. Is it or is it not going to go ahead and form a top out here? Now with regard to your shooting start candles out here, you did get one on the weekly basis last weekend. And if you were referring to that one, Jim, instead of the monthly, my apology for not hearing that clearly. So in the case of the weekly chart, it does have a confirmed roads momentum indicator top. So far this week, what we've seen is price try to get back up and get over the oscillator and change line, Stevie's green line, it hasn't done that. That is resistance, 120.75. And this would suggest that price could pull all the way back to 111.22. That's what the weekly timeframe chart is communicating to us. From a daily timeframe out here, Jim, we take a look at it, we try to find some kind of bottom signal out here. Let me just do a quick wave count, see where we're at. No, nothing there. I don't really have anything on the daily timeframe out here, other than to say that price is trading with insight, it's profiles. Now, are you looking for, what are you looking to do here? I was just looking through different scenarios on the charts and I thought that one was interesting that the monthly look like it could possibly be topping out. Yeah, so the weekly shows that the weekly has a topping pattern. The monthly has a potential and the daily doesn't have really anything of the topping patterns that I use. And it just shows consolidated between 117.13 and 119.85. I would watch 117.13. If Walmart were to close below that, that would suggest to move back to the 114.93 level. And below that, then we would really have a change in trend, a confirmed change in trend on the weekly timeframe out there. So I hope that helps you out with regard to Walmart. Good to hear from you as always and happy Thanksgiving again to you and your family. Thanks for those well wishes. You too, love it.  That was Jim in Palm Harbor.


This is Classics of Liberty from Libertarianism.org and the Cato Institute, narrated by Caleb Brown. Today's classic is To the Non-Slaveholders of the South by Lysander Spooner. Lysander Spooner lived during a period of world history in which daily life for hundreds of millions around the globe profoundly changed. In the United States, perhaps the most significant and transformative single change during the whole of the century was the abolition of private slaveholding. A penetrating and challenging legal thinker, Spooner left important marks on the anti-slavery debate and the long history of abolitionist activism before the Civil War. Most significantly, he argued in the unconstitutionality of slavery that the Constitution should and must be interpreted as an anti-slavery document, most especially because slavery contradicted natural law and even the Constitution was bounded by the natural law. The supreme law of the land, therefore, is not permitted to contradict the natural rights of individuals, including those condemned to slavery by unjust, unnatural legislation. In response to the Dred Scott decision of 1857, Spooner released this self-published broadside we present today. Addressed to the non-slaveholders of the South, Spooner's abolition plan called for what can only be properly described as abolitionist filibustering throughout the South to free the slave and inspire rebellion. Spooner argues that it is the moral duty of Americans everywhere, but particularly non-slaveholders in the South, to assist the slave in seizing his person and property from the slaveholders great and small, perhaps most significantly for the history of liberal thought. Spooner accepts the time-honored Lockean premise that slavery indeed represented a state of war between slave and slave master. In Spooner's eyes, anyone who would be combatants in such a war between individuals or institutional groups of individuals are entirely justified in killing their enemies if necessary. Rather than endorse the wholesale slaughter of slaveholders, Spooner instead advises anti-slavery filibusters to assist the slave in turning master's whips against themselves until sufficient chastisement shall have taken place to ensure compliance with respect for former slaves' rights. To the non-slaveholders of the South by Lysander Spooner, 1858. We present to you herewith a plan for the abolition of slavery and solicit your aid to carry it into execution. Your numbers combined with those of the slaves will give you all power. You have but to use it, and the work is done. The following self-evident principles of justice and humanity will serve as guides to the measures proper to be adopted. These principles are 1. That the slaves have a natural right to their liberty. 2. That they have a natural right to compensation so far as the property of the slaveholders and their abetters can compensate them for the wrongs they have suffered. 3. That so long as the governments under which they live refuse to give them liberty or compensation, they have the right to take it by stratagem or force. 4. That it is the duty of all who can to assist them in such an enterprise. In rendering this assistance, you will naturally adopt these measures. 1. To ignore and spurn the authority of all the corrupt and tyrannical political institutions which the slaveholders have established for the security of their crimes. 2. Soon as may be to take the political power of your states into your own hands and establish governments that shall punish slaveholding as a crime, and also give to the slaves civil actions for damages for the wrongs that have already been committed against them. 3. Until such new governments shall be instituted to recognize the slaves as free men and as being the rightful owners of the property which is now held by their masters but which would pass to them if justice were done. 4. To justify and assist them in every effort to acquire their liberty and obtain possession of such property by stratagem or force. 5. To hire them as laborers, pay them their wages and defend them meanwhile against their tyrants. 6. To sell them firearms and teach them the use of them. 7. To trade with them, buying the property they may have taken from their oppressors and paying them for it. 8. To encourage and assist them to take possession of the land they cultivate and the crops they produce and appropriate them to their own use. 9. And in every way possible to recognize them as being now the rightful owners of the property which justice, if administered, would give them in compensation for the injuries they have received. 4. To form vigilance committees or leagues of freedom in every neighborhood or township whose duty it shall be to stand in the stead of the government and do that justice for the slaves which government refuses to do and especially to arrest, try and chastise with their own whips all slaveholders who shall beat their slaves or restrain them of their liberty and compel them to give deeds of emancipation and conveyances of their property to their slaves. 5. To treat and teach the Negroes to treat all active abetters of the slaveholders as you and they treat the slaveholders themselves both in person and property. Perhaps some say that this taking of property by the slaves would be stealing and should not be encouraged. The answer is that it would not be stealing, it would be simply taking justice into their own hands and redressing their own wrongs. The state of slavery is a state of war. In this case it is a just war on the part of the Negroes, a war for liberty and the recompense of injuries. And necessity justifies them in carrying it on by the only means their oppressors have left to them. In war the plunder of enemies is as legitimate as the killing of them and stratagem is as legitimate as open force. The right of the slaves therefore in this war to take property is as clear as their right to take life and their right to do it secretly is as clear as their right to do it openly. And as this will probably be their most effective mode of operation for the present, they ought to be taught, encouraged and assisted to do it to the utmost so long as they are unable to meet their enemies in the open field. And to call this taking of property stealing is as false and unjust as it would be to call the taking of life in just war murder. It is only those who have a false and superstitious reverence for the authority of governments and have contracted the habit of thinking that the most tyrannical and iniquitous laws have the power to make that right which is naturally wrong or that wrong which is naturally right, who will have any doubt as to the right of the slaves and those who would assist them to make war to all possible extent upon the property of the slaveholders and their abetters. We are unwilling to take the responsibility of advising any general insurrection or any taking of life until we of the north go down to take part in it in such numbers as to ensure a certain and easy victory. We therefore advise that for the present, operations be confined to the seizure of property and the chastisement of individual slaveholders and their accomplices. And that these things be done only so far as they can be done without too great danger to the actors. We specially advise the flogging of individual slaveholders. This is a case where the medical principle that like cures like will certainly succeed. Give the slaveholders then a taste of their own whips, spare their lives, but not their backs. The arrogance they have acquired by the use of the lash upon others will soon be taken out on them when the same scourge shall be applied to themselves. A band of ten or twenty determined negroes, well armed, having their rendezvous in the forests, coming out upon the plantations by day or night, seizing individual slaveholders, stripping them and flogging them soundly in the presence of their own slaves would soon abolish slavery over a large district. These bands could also do a good work by kidnapping individual slaveholders, taking them into the forest and holding them as hostages for the good behavior of the whites remaining on the plantations, compelling them also to execute deeds of emancipation and conveyances of their property to their slaves. These contracts could probably never afterward be successfully disallowed on the ground of duress, especially after new governments favorable to liberty should be established, in as much as contracts would be nothing more than justice, and men may rightfully be coerced to do justice. Such contracts would be intrinsically as valid as the treaties by which conquered nations make satisfaction for the injustice which caused the war. The more bold and resolute slaves should be encouraged to form themselves into bands, build forts in the forests, and there collect arms, stores, horses, everything that will enable them to sustain themselves and carry on their warfare upon the slaveholders. Another important measure on the part of the slaves will be to disarm their masters so far as that is practicable by seizing and concealing their weapons whenever opportunity offers. They should also kill all slave hunting dogs and the owners too if that should prove necessary. Whenever the slaves on a plantation are not powerful or courageous enough to resist, they should be encouraged to desert in a body temporarily, especially at harvest time so as to cause the crops to perish for want of hands to gather them. Many other ways will suggest themselves to you and to the slaves by which the slaveholders can be annoyed and injured without causing any general outbreak or shedding of blood. Our plan then is one, to make war openly or secretly as circumstances may dictate upon the property of the slaveholders and their rebetters, not for its destruction, if that can easily be avoided, but to convert it to the use of the slaves. If it cannot be thus converted, then we advise its destruction.  Make slavery unprofitable in this way if it can be done in no other. Two, to make slaveholders objects of derision and contempt by flogging them whenever they shall be guilty of flogging their slaves. Three, to risk no general insurrection until we of the north go to your assistance or you are sure of success without our aid. Four, to cultivate the friendship and confidence of the slaves, to consult with them as to their rights and interests and the means of promoting them, to show your interest in their welfare and your readiness to assist them. Let them know that they have your sympathy and it will give them courage, self-respect and ambition and make men of them. Infinitely better men to live by as neighbors and friends than the indolent, arrogant, selfish, heartless, domineering robbers and tyrants who now keep both yourselves and the slaves in subjection and look with contempt upon all who live by honest labor. Five, to change your political institutions soon as possible and in the meantime give never a vote to a slaveholder. Pay no taxes to their government if you can either resist or evade them. As witnesses and jurors give no testimony and no verdicts in support of any slaveholding claims. Perform no military, patrol or police service, mob slaveholding courts, jails and sheriffs. Do nothing in short for sustaining slavery but everything you safely and rightfully can publicly and privately for its overthrow. While rascals of the south, willing tools of the slaveholders, you who drive slaves to their labor, hunt them with dogs and flog them for pay without asking any questions, we have a word specially for you. You are one of the main pillars of the slave system. You stand ready to do all that vile and inhuman work which must be done by somebody but which the more decent slaveholders themselves will not do. Yet we have heard one good report even of you. It is that you have no such prejudices against color nor against liberty as that you would not as willingly earn money by helping a slave to Canada as by catching a fugitive and returning him to his master. If you are thus indifferent as to whom you serve, we advise you henceforth to serve the slaves instead of their masters. Turn about and help the robbed to rob their robbers. The former can afford to pay you better than the latter. Help them to get possession of the property which is rightfully their due and they can afford to give you liberal commissions. Help them flog individual slaveholders and they can afford to pay you ten times as much as you ever received for flogging slaves. Help them to kidnap the slaveholders and they can afford to pay you more than you now get for catching fugitive slaves. Be true to the slaves and we hope they will pay you well for your services.  Lawyers of the South, you can, if you will, exert a potent influence for good in this matter. If in the true spirit of law as a science you shall see a man in the most crushed of human beings and recognize his right to obtain justice by such means as may be in his power, you shall take the side of the oppressed in this controversy and teach them to trample on their tyrants and vindicate their manhood. If you do this and then aid in establishing new institutions based upon liberty, equality and right, you will have the satisfaction of doing your part towards bringing into life a great, free and happy people where now all is crime, tyranny, degradation and death. If on the contrary you shall take the side of the slaveholders and continue to be as professionally under slave institutions, you must forever be the degraded, pedophogging pimps, hirelings and tools of a few soulless robbers of their species, denying continually the authority of justice and the rights of humanity. If you shall do this, we need not attempt to tell you what your true rank will be in the scale of lawyers, statesmen, patriots or men. Merchants of the South, we hope you will deliberately consider this matter and make up your minds whether the slaves have the right to take the property of their masters in compensation for the injuries they have suffered. If you decide that they have that right, we hope you will act accordingly and will not hesitate to buy of them cotton or any other property which they may have taken from their masters and give them in exchange weapons or any other articles they may need. If you will but do this, you will soon put an end to slavery. Non-slaveholders generally of the South. If it is right for the slaves to take the property of their masters to compensate their wrongs, it is right for you to help them. Your numbers, compared with those of the slaveholders, are as five or six to one. It will be perfectly easy for you by combining with the slaves to put them in possession of the plantations on which they labor and of all the property upon them. They could afford to pay you well for doing them such a service. They could afford to let you share with them in the division of the property taken. We hope you will adopt this measure. It will not only be right in itself, it will be the noblest act of your lives, provided you do not take too large a share to yourselves and provided also that you afterwards faithfully protect the slaves in their liberty and the property assigned to them. Finally, we say to all, correspond with us of the North. Let each person who receives or sees one of these sheets send his letters to the one who sent it, with liberty to publish them in northern papers. Finally, we say to all, correspond with us of the North. Let each person who receives or sees one of these sheets send his letters to the one who sent it, with liberty to publish them in the northern papers. This correspondence, we are confident, will be a more interesting literature than the South has ever furnished and will enlist the feelings of Northern people to such a degree that we shall be induced to go, in large numbers, to your assistance whenever you shall need us. That was To the Non-Slaveholders of the South by Lysenver Spooner. Find more Classics of Liberty at libertarianism.org.


Hey everybody, this is Brian and welcome to the 116th cute tutorial with C++ and GUI programming.  If you don't know what a service is, well, there's lots of programs running in the background on your computer and you can see from Wikipedia a window service, and there's also something called a daemon. Some people call them daemons, but I think the correct pronunciation is daemon. Anyways, they do essentially the same thing. They run in the background, but they do it totally different. That's kind of the crux with cross-platform programming is that, you know, every operating system has similar components, but they are implemented drastically different under the hood. And that's kind of one of the the issues that cute really handles very well is how to tackle the monolithic task of cross-platform programming. So, so all you really need to know is a service or a daemon runs in the background. It's a computer program like any other program. It's just called special on the operating system, meaning the operating system will start it in a different manner than it will a normal program. So of course, if it's going to start it in a different manner, we have to program it in a different manner. Well, cute at one point, actually was working on a mobility project, which I'm not sure what happened with that. But part of that was they had a service class, or I should say set of classes that turn your program into a service so it can run in the background. But as you can see here from the solutions archive, this repository contains components from the discontinued cute solutions product. Hmm, discontinued. It's nice of them to actually leave the code back up. So maybe if my internet connection wants to go a little faster, there we go. You can see there's a whole bunch of stuff like there's a browser plugged in, a lock file, a property browser, et cetera, et cetera. We're really interested in this cute service. And you can go ahead and just click the download button, download it locally, or you can just download it from my website on www.voidrealms.com. I'll have the complete source code for this and all my other tutorials. All right, so let's jump right in here. I have actually downloaded it. Given it a good build and we're just going to kind of walk through this a little bit here just to give you an idea. And then we're going to build our own service. So if you look at this, it's kind of complex. The first thing you'll notice in the project file is use lib, build lib. You can actually build this as a library that your application will use, or you can build it into the application itself. It's actually, and then of course there's the build lib. This project right here, if it's going to build the library, and they've got a common file which some of this may look like ancient Egyptian algebra, do you? Don't worry. Some of this looks like ancient Egyptian algebra to me, too. All right. Examples, this is what we're really interested in here. There's a controller, an interactive service, and a server. Now, controller, what is a controller? Controller allows you to control services. For this tutorial, really all you need to know is you really just pass command line arguments to the application. For example, a dash s will start, dash t will terminate, p will pause, r will resume. You can send a custom command with a dash c. Dash v will do a version. And there's a lot of directions in here that, you know, if you really want to spend the time, you can really get to know very well. Interactive, an interactive service is a different concept. It's a program that runs in the background, but you can still bring it up into the foreground and interact with it. That's what an interactive service is. Some operating systems don't even support this, so just kind of buy or beware on that. And if it feels like I'm kind of whipping through these without explaining them, you're right. I'm not. We're going to actually spend a little bit more time into the server. You can see from the project, it's actually a pretty simple little project. It's just including the acute service project include, which is the source. Which is this guy right here. And that's the meat of this service right here, is you'll have the project include or project implementation. And you're just setting the include path, the depend path. You're saying if it's not Windows, include network. Why? Because I believe Unix actually uses sockets to talk to their services under the hood. And then they've got a couple snazzy commands here, like we're saying, you know, if we're building the library, then do this. Otherwise, you know, include these headers. If it's Windows, include this Windows header. If it's Unix, include these. If it's Windows, include these. So they're really trying to encompass the whole, the whole spectrum of operating systems. Now, I should note that this has been discontinued, meaning there will be no further development on this, unless other people in the community decide to develop upon this. So if you're going to use this, be aware that things may change in the future that break this, you know, some Microsoft may come out with a different operating system that totally changes everything, and this doesn't work anymore. And then it's kind of on you to fix it. Doesn't mean we can't use it in the current time, though. So just looking at this, we've got some headers and we got some source files. There's a cute service, which if you read this, there's your license. And it's not very well documented. This was kind of a work in progress. But there is a lot of documentation out there if you want to go hunting for it. There's the cute service private class, meaning they call this privately. The Unix server socket, that's what the Unix systems will use to talk to the services. And then the Unix socket class. Let's close a bunch of those. And the source code, you know, as I mentioned before, it's kind of kind of deep if you want to get in there and really start looking through it. But if you open up cuteservice.cpp, you'll see they actually have the documentation in here. And you kind of read through this and figure out a little bit of what this is doing and how it's doing it. And they actually do a fairly well job. There are some features in here, like an install. I wouldn't even bother with that, to be brutally honest with you. I don't think it was fully implemented with it. You can see on a Windows account, you can pass the the account, the password, and it'll install it. Well, you can do the same thing on the command line in much less time, much less headache uninstall. Oh, and I should mention install does absolutely nothing on Linux systems. It even says right here, due to the different implementations on how services or damons are installed, Unix like systems. This method doesn't really do a darn thing. We'll actually cover that a little bit later, but I just wanted you to be aware of this. Now, if this class looks unruly and difficult to work with, well, it can be. It can be very difficult to work with. We're going to try and make that simple and easy because I like simple and I like easy. So the main functions of a service is you want to be able to start, stop, pause, resume and process custom commands. That's really all service does is it just starts and stops. Runs in the background. So we're going to collapse that whole tree and we're going to look at my service, which is a program that I'm working on right now. And as you can see, it's not much different. I mean, it's just a very simple. We've included the cute service framework. Is that a framework or just much classes? That's a good question. I don't know. But because we've included it, we've got all the source here. Same source we just looked at. And our program is for a very small, very simple. No, I'm actually going to, I lied to you.  I want to show you something, their main file. You notice how in the server under the examples, their main file is just a big string of stuff. It's like they just wrote it as fast as possible, not knocking anybody. But I think best practices you put each class in its own file. Let's go all the way down to the main here. Here's our main function. And you say, if it's defined windows, you're doing something else. You can actually just kind of ignore that. This is the heart of it right here. HTTP service, service. And then they're passing the arguments from the main into this. And then they're starting the loop. Now you notice how this is different. It's this service that's exacting. We're in our program, a standard command line program. It's the QCore application that's exacting. The reason for that is, if we scroll up here, you can see the HTTP service class actually inherits QCore application. That's why we're going to actually implement that. And I'm going to show you a little better detail of what I mean here. So let me grab my notes because it's going to be kind of a complex little topic here. All right, so I'm just going to add new. We're going to create a class. We're going to call this myService. And I don't really want to inherit QObject. I know normally we do, but I'm not going to in this case. So here's our beautiful illustrious myService class. And we're just going to add some stuff in here. And we want to include, actually let me put it right at the top here, QCore application. Now QCore application is the event loop for command line applications. It's pretty important that you know that we're doing a QCore application here. All right, now we want to actually inherit this. So we're going to say public, QCore service. Probably help if I actually include a QCore service. And this is template based. So we're going to, I don't know if you can hear my cat in the background. I've gotten smarter about this. I've locked her out of the office, so she's out there whining. And we're going to change this constructor here to match our main. Sorry about that, I got distracted. Now we're going to change that. Good. So there's our constructor. I'm going to kind of document this as we go. And we don't normally do this, but we're going to make a deconstructor. Reason for that, if we want to really take control of our application here, we're going to make objects in memory and things like that. We'll need a place to actually get rid of those, but whoops. And I forgot it doesn't like to do that. So we're just going to copy this. Oh, how embarrassing. I actually misspelled that the constructor. It's been a very long week. My the job that I have has been experiencing network outages every day. And of course, being the network guy, they're all looking at me. Unfortunately, I don't actually have access to the equipment. It's somebody at corporate that has to do it. So that gets kind of unnerving. So what I'm typing in now is just the foundation of every type of service. You got start, pause, resume. Now we got that. Just going to document these real quick. And we're going to say start service, pause the service, resume the service. What's the difference between starting the service and resuming the service? Somebody's going to ask me, well, start is when you initially start. So you'd create all your objects in memory, things of that nature. Resume is where you've paused. So you still have your objects out in memory. Like if you have a pointer to a file or something and resume is just where you would pick back up. So like, let's say you had a timer and that timer was firing off and it was, you know, writing to a file every 30 seconds or something will pause. You'd stop the timer, resume, you'd start the timer back up. All right. So let's actually implement these guys making our little service skillet in here that you guys can reuse in any project moving forward. And I should stress this is cross platform. However, I do not know if this will actually work on like an iPhone or an Android phone. I do not know. I think they might handle those a little bit differently, but you could try it. Let me know. All right. So notice how these are all public and private. Just going to say add in any pointers. All right. So let's get rid of that annoying little thing. Let's give this a good build. Make sure it'll actually build up real fast. Ooh, no matching can function call. That's a nerving. What did we do wrong here? Oh, yes. We have forgotten to do a few things here. Namely, we have forgotten to. Cue service, Cue core application because we're inheriting this, right? We're going to pass the arguments. R, V. And you notice how there is a constant name. What is that? Well, that's actually the name of our service. So we're going to say my service. That's how the operating system will know what the service actually is. And we're just going to give this another good build and we'll make sure there's no errors. Good. So we got a clean build here. Good compile. Just because it compiled doesn't mean it actually does anything. So now we're going to make it actually do something. We're going to set the service information. So we're going to say set service description. And this is the actual description of your service. This may or may not show up in the service controllers in different operating systems, depending on what operating system you're on. Set service flags. We're going to say cute service base can be suspended. You notice how there's can be and cannot. That is the pause and resume functionality. We're going to say that yes, this can be suspended. And it's a good idea to actually let's do it. Just because I keep saying it's a good idea to do it. And then we never actually do do it. So it's a good idea to do error handling. Silly me. I must hit the wrong button there. I really do know what I'm doing sometimes. You wouldn't know it by watching some of these videos. But we're just going to just keep critical this out and say save that copy. And what I'm really building here is more or less just a skeleton that you can reuse in your programs. Copy this. No, I'm just going to kind of whip through these real quick here. Man, did I dismiss my spell? Deconstructor again. How embarrassing. Get rid of this, grab this, grab this. And we're just going to fill in the blanks here. Pause, resume, and stop. Give another good build just to make sure we didn't goof anything up. All right. So in the constructor, you see how we're inheriting. We're setting the name of the service. And then we're giving it a description and saying whether or not it can be resumed. In the deconstructor, you're going to release any memory. Like if you make any pointers to objects, that's where you just release them. You can also do it in stop and start and all that stuff. Start takes a little bit of extra work here. So what we're going to do is we're going to say qcore application, pointer to app, we're going to get the application. If you fail to do that, if you fail to do this step right here, your service will not start on Windows. It may or may not start on Linux, but Windows, it just will not start. Nothing will happen. It'll look like it's running, but just nothing happens. And that's because you're not actually entering the event loop correctly. I'm going to say qdebug, service started, service paused, resumed, and of course stopped. Now, in case you're wondering, this application isn't going to actually do a whole lot here. Let's go over it a little bit more here. We need to actually change that up a bit. Look at our little guy here. We're going to copy this out of their code. And we're going to say we're going to include my service. We're going to actually just get rid of these. So notice how we're actually replacing the default event loop with an instance of my service, the service we just created here. And our service, which of course inherits from qcore application, is actually handling the event loop, as we say service.exec. So let's give it another build here, save all. And we have a warning unused variable. Not really worried about that, but just to get rid of that, we can actually use it here. We can say qdebug, app. And we're going to get the actual path to the application. You know, what folder the application's actually started in. In different operating systems, that'll be handled differently. So like in Linux, it'll be the actual current path, the actual path of where the exe, or I'm sorry, the binary is located in Windows. It'll actually start it in C Windows System 32, or C Windows System, depending on which version of Windows. So if you have an application that's relying on the application path, it's good to grab it here. All right, so we're going to give this a good build. All right, so it runs. Let's actually run this and see what happens. See it says service started. And then there's our path right here. That's where it actually is right there. Notice how it says return to close the window, meaning this thing actually stopped. Why did it stop? Because we're not running it as a service. This is kind of the catch. Different operating systems handle this differently. There's a little explanation that you need to be aware of here. Let me jump back here. On Linux, Unix, and I think even Mac, uses something called Upstart. There are scripts that run when your computer starts. And we're just going to ls-l, etsy, etsy init. ls is just list. We're going to list in a list format on this directory. etsy init is typically where your Upstart scripts are. And as you can see, I've got some running here on this virtual machine. I've got Bluetooth, check file system, check root, cron jobs, cups, a little bit of everything here running. Now, I'm not going to really do a full tutorial on how to install services, but I'm going to point you in the right direction. I love the name of that. Whoopsie. Anyways, it'd be good to get familiar with Upstart and how it works, but I will give you a little bit of information here. Upstart scripts are, well, just that, scripts. They are just quite literally, and I'll just drag one out into the video here so you can see what it looks like. This is an Upstart script I'm working on for a program here. Quite literally, all it is, is you have the pound sign, which is a comment. You give me a description, the author. Start on. This is important. When is this script being called by Upstart? Well, I'm waiting for the file systems and the net device, or eth0, or I'm sorry, iface.lo to actually come up. You can actually start programs before the file systems even mounted. So you need to be kind of careful about that. You will start throwing some errors. Start on run level. Two, three, four, five. Run levels are different. Run levels of the system. For example, I think run level zero.  I think zero is actually shut down or reboot. I'm going to say it's shut down. Run zero, shut down. All right, so notice how those are commented out. Start on started network services. What's that mean started? Well, started means another upstart job named network services has run. Or I should actually call that an event. Upstart has various events. So when the network services calls the started event, Upstart's going to scan through the list of config files, see our config, and then actually start this. Stop on run level zero, one and six. So we're going to stop on system shutdown, single user mode and reboot. Console log. What that means is Upstart will actually take all your QDebug statements and pump them out to a text file. Pretty handy feature. I'll let you actually go out and Google Upstart and figure out how that happens. It's a little different on each operating system. Exec, what do we want to actually do? Now, you notice how quite literally I'm just calling a script. That's all I'm doing here. In that script, I would just simply set, you know, my local variables like my lib paths, things like that and start the application. Respawn. What that means is you're going to allow this to restart the application if it crashes. And you're going to limit this to five times in, I think, 60 seconds. So if this thing crashes four times in under a minute, it'll restart it again. If it crashes six times, it will not. You can define that. Whew, that was a handful. Upstart is actually a lot easier than the old school method. I looked into doing the old school method and it's being phased out. And I would highly recommend using Upstart. This is not an Upstart tutorial by any means. This is just a service tutorial. So you should go out and look at Upstart. Hold on, Wikipedia or whatever you use. There's a lot of information out there. Now, if you're in Windows, it's a different story altogether. Sadly, I can't keep this video and boot into Windows at the same time. But let me find my notes here. All right. Windows uses something called the SC command or service controller. You would go to an elevated command line. Let me type that out here. Elevated command line. And what that means is you're going to go to start, run, type, CMD. And then in the list of programs it gives you, you're going to right click CMD. And then run as administrator. If you don't do that, you're going to get error five access denied. Once you're in a command window, which looks very similar to this, only beyond Windows. And it'll say like C, Windows system 32. If you're watching this tutorial, I'm going to take a wild leap of faith that you know what a command line on Windows looks like. Anyways, you will run the SC command and you will say SC create. So service controller create the name of your service. So it would actually be my service. And I actually misspelled that. Wow, embarrassing.  Bin path is actually the path to the application. So I'm just going to swap this out as C download my service.exe. That's where it would actually be. And start equals auto. Meaning you're going to tell it to start automatically. Windows has much simpler start methods. You have manual, auto, never start, and auto delayed. We're just going to set it to auto. Now, if you ever want to delete your service, you can just say SC delete and then the name of your service. And it deletes it from the service list. The reason why you can't just take a normal EXE and make it a service is because of, well, I hate to say it, Windows. Windows has special bindings or special APIs.  But it has Windows PowerShell bindings. And we don't list them here, but there's a whole bunch of Windows APIs for services. And you can actually, if you're so inclined, you can go into the source of the cute service and see all the little, if it's Windows do this, if it's Windows do that, blah, blah, blah, blah. And it gets just mind boggling some of the APIs Windows has. And it just, it's very frustrating for developers. I mean, just look at some of this stuff. Anyways, but on Linux in Unix, you literally are just running a normal program. And then it is forked. And what forked means is that you are actually making a copy of that in memory. So you'll have a main program and a secondary program. And Upstart takes care of that for you. So you can literally make a normal command line program and then use it in Upstart as a service. As long as you do that config file. That was a mouthful. This is kind of an advanced tutorial. And I assume I'm going to get a lot of mail from people that just download this compiler and go, oh yeah, it won't run. Some little gotchas you need to be aware of is, well, when you go to run this, you need to have the dependencies in place. For example, if you build this and you go to run it in Windows, it's going to pop up and say, you know, cutecore.dll not found. So you're going to have to use dependency walker, depends.dxe, go out and find all the dependencies, wrap them up, put them in the same directory.  If you're running the service and you're not seeing anything, that's because it's running as a service. You can give it dash e for the command line arguments. And what it will do is it'll do it in executable mode, meaning it won't run as a service or to run as a normal executable. And you'll see suddenly all your Qtabug messages. That's it for all the tutorial. Thank you for watching. I hope you found this educational and entertaining.  So I just say I'm going to throw it up. I did. I'm sorry. I'm going to put all this up on my website. And you can use the My Service project with the My Service classes that we wrote in this tutorial to just wrap around your classes. So you would say, you know, during start, you would say, you know, myclass.dosomething. Just put that little note in there. All right. Thank you for watching.


The cloud is evolving. You know, it's no longer a set of remote services somewhere off in the cloud in the distance. It's expanding, it's moving to on-prem. On-prem workloads are connecting to the cloud. They're spanning clouds in a way that hides the plumbing and simplifies deployment, management, security, and governance. So hybrid multi-cloud is the next big thing in infrastructure. And at the recent Nutanix.next conference, we got a major dose of that theme. And with me, to talk about what we heard at that event, what we learned, why it matters, and what it means to customers are Monica Kumar, who's the senior vice president of marketing and cloud go-to-market at Nutanix, and Tarkin Maynard, who's the chief commercial officer at Nutanix. Guys, great to see you again. Welcome to theCUBE. Great to be back here. Great to see you there. Okay, so you just completed another.next. As an analyst, I like to evaluate the messaging at an event like this, drill into the technical details to try to understand if you're actually investing in the things that you're promoting in your keynotes and then talk to customers to see how real it is. So with that as a warning, you guys are all in on hybrid multi-cloud. And I have my takeaways that I'd be happy to share, but Tarkin, what were your impressions coming out of the event?  Our goal is, as Monica is now out by two, cloud is not a destination, it's an operating model. Our customers basically using cloud as a business model, it's an operating model, it's not just about your techno-mamba jumbo, it's kind of new outline. You wanna make sure you make cloud invisible to the customer so they can focus on what they need to focus on as a business. So as part of that, you wanna make sure the workloads, the apps, they can run anywhere the way the customer wants. So in that context, our entire story was bringing customer workloads, use cases, partner ecosystem with ISPs and cloud providers and service providers and ISPs. We recommend like Citrix and user computing like Red Hat on cloud native. And also bringing right products, both in terms of infrastructure capability and management capability for both operators and application developers. So bringing all these pieces together and make it simple for the customer used to cloud as an operating model. That was the big story here. Great, thank you, Monica. Anything you'd add in terms of your takeaways? Well, I think Tarkin said it, right? We are here to make cloud complexity invisible. This was a big event to get thousands of our customers, partners, our supporters together and unveil our product portfolio which is much more simplified now, it's a cloud platform. And really have a chance to show them how we're building an ecosystem around it. And really bringing to life the whole notion of hybrid multicloud computing. So Monica, could you just for our audience just summarize the big news that came out of .NEXT? Yeah, we actually made four different announcements and most of them were focused around obviously our product portfolio. So the first one was around enhancements to a cloud platform to help customers build modern software defined data centers to speed their hybrid multicloud deployments while supporting the business critical applications. And that was really about the next version of our flagship AOS 6 availability. We announced a general availability of that. And key features really enable, included things like built-in virtual networking, disaster recovery enhancements, security enhancements that otherwise would need a lot of specialized hardware, software and skills are now built into a platform. And most importantly, all of this functionality being managed for a single interface, right? Which significantly decreases the operational overhead. So there was one announcement. The second announcement was focused on data services and really making it easy for customers to simplify data management, also optimize big data and database workloads. We announced capability that now improves performances of database workloads by 2X, big data workloads by 3X. So lots of great stuff there. We also announced a new service called Nutanix Data Lens, which is the new unstructured data governance service. So again, I don't want to go into a lot of details here. Maybe we can do it later. That was our second big announcement. The third announcement, which is really around partnerships and we'll talk more about that is with Microsoft. We announced the preview of Nutanix clusters in Azure. And that's really taking our entire flagship Nutanix platform and running it on Azure. And so now we're in preview on that one and we're super excited about that. And then last but not least, and I know Tharkin's going to go into a lot more detail is we announced a strategic partnership with Citrix around the whole future of hybrid work. So lots of great news coming out of it. I just give you a quick summary. There's a lot more around this as well. Okay, now I'd like to give you my honest take. If you guys don't mind, I'm talking, I'll steal one of your lines. Don't hate me. Okay, so but so the first thing I'm going to say is I think Nutanix, you have the absolute right vision. There's no question in my mind. But what you're doing is not trivial. And I think it's going to play out. It's going to take a number of years and to actually build an abstraction layer, which is where you're going as I take it, as a platform that can exploit all the respective cloud native primitives and run virtually any workload and any cloud. And then what you're doing is I see it as abstracting that underlying technology complexity and bringing that same experience on-prem across clouds. And as they say, that's hard. I will say this, the deep dives that I got at the analyst event, it convinced me that you're committed to this vision. You're spending real dollars on focused research and development on this effort. And very importantly, you're sticking to your true heritage of making this simple. Now, you're not alone. All the non-hyperscalers are going after the multi-cloud opportunity, which again is really challenging. But my assessment is you're ahead of the game. You're certainly focused on your markets. But from what I've seen, I believe it's one of the best examples of a true hybrid multi-cloud, you're on that journey that I've seen to date. So I would give you a high marks there and I like the ecosystem building piece of it. So Tarkin, you could course correct anything that I've said and I'd love for you to pick up on your comments. It takes a village. You're sort of invoking Hillary Clinton to bring the right solution to customers. So maybe you could talk about some of that as well. Look, actually you hit all the right points and I don't hate you for that. I love you for that, as you know. Look, at the end of the day, we started this journey about 10 years ago, the last two years with Monica, with the great executive team and overall team as a whole, big push to what you just suggested. You're not necessarily passionate about cloud. Again, it's a business model. You're passionate about customer outcomes. And some of those outcomes sometimes gonna also be on-prem. That's why we focus on this terminology, hybrid multi-cloud. It is not multi-cloud, it's not just private cloud or on-prem and non-cloud. You wanna make sure customers have the right outcomes. So based on that, better those are cloud partners or platform partners like HPE, Dowl, Supermicrob, we just announced a partnership with Supermicro now reselling our software. HPE, we run on GreenLake, Lenovo, we run on TrueScale, big support for Lenovo. Dowl's still a great partner to us on cloud partnerships. As Monica mentioned, obviously Azure, we had a big session with AWS, Luxo, New York Conan with Red Hat as an ISP partner, tying that also to IBM cloud as we move forward, as Red Hat and IBM cloud go hand in hand. And also, tons of work around as Monica mentioned. So it takes a village. We wanna make sure customer outcomes deliver value. So anywhere for any app, on any infrastructure, any cloud, regardless standards or protocols, we wanna make sure we have an open system coverage, not only for operators, but also for application developers, develop those applications securely and for operators run and manage those applications securely anywhere. So from that perspective, tons of interest opposite on the EUC site, as Monica mentioned earlier, you also just announced a Red Hat partnership for cloud services right before the dot next, you highlighted that and you're super excited about those two partnerships. Yeah, so when I talked to some of your product folks and got into the technology a little bit, you know, it's not, it's clear to me, you're not just wrapping your stack in containers and shoving it into the cloud and hosting it like some do. You're actually going much deeper. And again, that's why it's hard to take advantage of those things. But so Monica, you were on the stage at dot next with Eric Lockhart of Microsoft. Maybe you can share some details around the focus on Azure and what it means for customers. Absolutely, first of all, I'm so grateful that Eric actually flew out to the Bay Area to be live on stage with us. So very super grateful for Eric and Azure partnership there. As I said earlier, we announced the preview of Nutanix clusters in Azure. It's a big deal we've been working on for a while. What this means is that a select few organizations will have an opportunity to get early access and also help shape the roadmap of our offering. And obviously we're looking forward to that announcing general availability soon after that. So that's number one. We already seem tremendous interest. We have a large number of customers who want to get their hands on early access. We are already working with them to get them set up. The second piece that Eric and I talked about really was, you know, the reason why the work that we're doing together is so important is because we do know that hybrid cloud is the preferred IT model. You know, we've heard that in spades from all different industry research by talking to customers, by talking to people like yourself. However, when customers actually start deploying it, there's lots of issues that come up. There's limited skill sets, resources. And most importantly, there's a disparity between, you know, the on-premises networking security management and the cloud networking security management. And that's why, that's where we are focused on together is partners is removing that barrier, the friction between on-prem and Azure cloud. So our customers can easily migrate their workloads at Azure cloud. You know, do cloud disaster recovery. You know, create a burst into cloud for elasticity if they need to, or even use Azure as an on-ramp to modernize applications by using the Azure cloud services. So that's one big piece. The second piece is a partnership around Kubernetes and cloud native. And that's something we've already, you know, provided to the market. It's GA with Azure and Nutanix cloud platform working together to build Kubernetes-based applications, container-based applications and run them and manage them. So there's a lot more information on Nutanix.com slash Azure. And I would say for those of our listeners who want to give it a try and who want their hands on it, we also have a test drive available. You can actually experience the product by going to Nutanix.com slash Azure and taking the test drive. Excellent. Tarkin, we saw recently that you announced services. You got HPE GreenLake, Lenovo, there as a service, which is called TrueScale. We saw you with Keith White at HPE Discover. I was just with Keith White this week, by the way. Face to face, awesome guy. So that's exciting. You got some investments going on there. What can you tell us about those partnerships? So look, as we talk through this a little bit, the HPE relationship is a very critical relationship, one of our fastest growing partnerships. Our customers now can run a Nutanix software on any HPE platform. We call it DX as the platform. But beyond that, now if the customers want to use HPE services as a service, now Nutanix software, the entire stack is not the only multi-cloud platform. The database capability, EUC capability, storage capability can run on HPE service, GreenLake service. Same thing, by the way, same way available on Lenovo. Again, if you're doing a similar work with Dell and Supermicro, again, given our customer's choice. If they want to go to a public cloud, partner like Azure or AWS, they have that choice. And also, as you know, I know Monica, you're going to talk about this. We are GSI partnerships and new service provider program. We're giving options to customers because in some other regions, HPE might not be our choice or Azure might not be choice and a local telco might be choice in some country like Japan or India. So they give options and capability to customers to run Nutanix software anywhere they like. Well, I think that's a really important point you're making because as I see all these infrastructure providers who are traditionally on-prem players introduce as a service. One of the things I'm looking for is, sure, they've got to have their own services, their own products available, but what other ecosystem partners are they offering? Are they truly giving the customer's choice? Because that's really, that's the hallmark of a cloud provider. You know, if we think about Amazon, you don't always have to use the Amazon product. You can use actually a competitive product and that's the way it is. They let the customers choose, of course they want to sell their own. But if you innovate fast enough, which of course Nutanix is all about innovation, a lot of customers are going to choose you. So that's key to these as a service models. So Monica, Tarkin mentioned the GSIs. What can you tell us about the big partners there? Yeah, definitely. Actually, before I talk about GSIs, you know, I do want to make sure, you know, our listeners understand we already support AWS in a public cloud, right? So Nutanix today is available in general, generally available on AWS to use and build a hybrid cloud offering. And the reason I say that is because our philosophy from day one, even on the infrastructure side has been freedom of choice for our customers and supporting as large a number of, you know, platforms and substrates as we can. And that's the notion that we are continuing here forward with. So to talk about GSIs a bit more, obviously when you say, you know, one platform, any app, any cloud, any cloud includes on-prem, it includes hyperscalers, it includes the regional service providers as well. So as an example, TCS is a really great partner of ours. We have a long history of working together with TCS in global 2000 accounts, you know, across many different industries, you know, retail, financial services, energy. And we are really focused, for example, with them on expanding our joint business around machine critical applications, deployment in our customer accounts and specifically our databases with Nutanix era, for example. Another great partner for us is HCL. In fact, HCL's solution scale DB, we showcased at .next just yesterday. And scale DB is a fully managed database service that HCL offers, which includes the Nutanix platform, including Nutanix era, which is our database service, along with, you know, along with HCL services, as well as the hardware software that they, that customers need to actually run their business applications on it. And then moving on to service providers, you know, we have great partnerships like with Sixterra, who in fact was the service provider partner of the year. That's the award they just got. And many of the service providers, including working with, you know, OVH cloud, Equinix. So I can go on, we have a long list of partnerships, but what I want to say is that these are very important partnerships to us, all the way from, as Tharkin said, OEMs, hyperscalers, ISVs, you know, like Red Hat Citrix, and of course, our service provider and GSI partnerships. And then last but not least, I think Tharkin, I'd love for you to maybe comment on our channel partnerships as well, right? That's a very important part of our ecosystem. No, absolutely, you're absolutely right, Monica. As you suggested, our GSI program is one of the best programs in the industry in number of GSI's support. New SP program, enterprise solution provider, service provider program, covering TALCOs and regional service providers. Like you suggested, OVH in France and TT in Japan. Yoda Group in India, Sixer in the US. We have only 50 new service providers signed up in the last few months since the announcement, but tying all these things obviously to our overall channel ecosystem with our distributors and resellers, which is moving very nicely with Christian Alvarez who's running our channel programs globally. And one last piece, Dave, I think this was an important point that Monica brought up. Again, give choice to our customers. It's not about club by itself, it's outcomes, but club is an enabler to get there, especially in a hybrid multi-club fashion. And last point I would add to this is, help customers regardless of the stage they're in, in their club migration, from re-hosting, to re-platforming, re-purchasing, or re-factoring, re-architecting applications or retaining applications or retiring applications, they will have different needs. And what you're trying to do with Monica's help with the entire team, choice, choice in stage, choice in maturity to migrate to cloud and choice on platform. So I want to close. First of all, I want to give some of my impressions. So we've been watching Nutanix since the early days. I remember vividly standing around the conference call with my colleague at the time, Stu Miniman, the state of the art was converged infrastructure at the time, bolting together storage, networking and compute, very hardware centric. And the founding team at Nutanix told us, we're going to have a software led version of that. And you popularized, you kind of created the hyper-converged infrastructure market. You created what we had called at the time, true private cloud, scaled up as a company. And now you're really going after that, that multi-cloud, hybrid cloud opportunity, Jerry Chen and Greylock, they just wrote a piece called Castles on the Cloud. And the whole concept was, and I say this all the time, the hyperscalers last year just spent $100 billion on CapEx. That's a gift to companies that can add value on top of that. And that's exactly the strategy that you're taking. So I like it, you got to move fast and you are. So guys, thanks for coming on, but I want you to both maybe talking, you can start and Monica, you can bring us home, give us your wrap up, your summary and any final thoughts. All right, look, I'm going to go back to where I started this. Again, I know I go back, this is like a broken record, but it's so important to hear from the customers. Again, cloud is not a destination, it's a business model. We are here to support those outcomes regardless of platform, regardless of hypervisor, cloud type or app, making sure from legacy apps to cloud native apps, we are there for the customers regardless of their stage in their migration. Great, thank you, Monica. Yeah, and I again, just the whole conversation we've been having is around this, but I'll remind everybody that while we started out, you know, our journey was to make infrastructure invisible. We are now very well poised to helping our customers making the cloud complexity invisible. So our customers can focus on business outcomes and innovation. And as you can see, coming out of .next, we've been firing on all cylinders to deliver this differentiated, unified hybrid multi-cloud platform so our customers can really have run any app and even any cloud. And with the simplicity that we are known for because of our, you know, our customers love us, NPS 90 plus seven years in a row. But again, it's the guiding principle is simplicity, portability, choice and really our compass is our customers. So that's what we are focused on. Well, I love not having to get on planes every Sunday and coming back every Friday, but I do miss going to events like .next where I meet a lot of those customers. And now again, we've been following you guys since the early days, I can attest to the customer delight. I've spent a lot of time with them driven in taxis, hung out at parties, on buses. And so guys, listen, good luck in the next chapter of Nutanix will be there reporting and really appreciate your time. Thank you so much. Thank you so much, Dave. All right, and thank you for watching everybody. This is Dave Vellante for theCUBE. And as always, we'll see you next time.