I've been programming for a long time, something like 30 years now, and in that time I have written some good code, I've written some crappy code, and I've written a lot of, you know, okay, so-so, average code. But the software that I'm proudest of is the stuff that's reusable by other programmers, the libraries, maybe even one or two little frameworks, the reusable code. I don't know why, I guess some people are proudest of their really fun games, some people are proudest of awesome graphics demos, some people love a really compelling user interface.  So before I get right into the real stuff, I just want to take you all back in time to the early 90s, oh, sorry, that's the wrong early 90s, I meant this early 90s, or mid-90s, when there was a raft of books and magazine articles promising that we were on the brink of a new golden age, the dawn of a new era in programming, when the wonder technology of object-oriented programming would just magically make it so that we're all writing reusable, extensible code for free. If you don't remember the early 90s, you didn't miss much, because this was all snake oil. It's not true, object-oriented programming isn't magic, it isn't pixie dust, it does not miraculously give you the ability to write extensible, reusable code for free. In fact, if you drink the Kool-Aid for long enough, if you believe that with all your heart, despite the evidence, after 15 years, you will write something called Abstract Singleton Proxy Factory Bean, which came out of the Java community about six or eight years ago. If you don't understand what an Abstract Singleton Proxy Factory Bean is, that's okay, you just have to read the documentation, which clearly explains that it is a convenient proxy factory bean superclass for proxy factory beans that create only singletons. Obvious, right? This is why I don't speak at Java conferences, because they would lynch me. So anyway, I'm not here to bash object-oriented programming, I think classes are great, I think inheritance is even a useful tool if you use it carefully. I am merely here to point out that Fred Brooks was right in 1986, years and years before the object-oriented zealots started trying to sell their snake oil, Fred Brooks wrote a paper called No Silver Bullet, in which he claimed there are no silver bullets. There's no magic pixie dust, there's no super-wonder technology that is going to make programmers massively more productive. It just doesn't work that way. In other words, there's no Moore's law for software. Moore has this incredible capacity to double in transistor density every year and a half. It doesn't work that way for software, sorry folks, Fred Brooks was right 30 years ago. So how do you write reusable code? It's not free, there's no magic pixie dust, there's no wonder technology that will instantly make you able to write reusable code. Well, it's work, it's hard work, it requires forethought and attention to detail, but it's not magic. You can do it, anybody can do it. But first, before I start telling you how to do it, should you? Is it really important to write reusable code? In other words, should everything be a library or at least a potential library? No, absolutely not. There's nothing wrong with writing 10 lines or 1,000 lines of code that just solve this problem for this application today. In fact, that should be your default mode of operation, otherwise you will fall into a trap known as premature overgeneralization, which is about as bad as premature optimization. Maybe not as bad as premature optimization, but it's pretty bad. So don't fall into that trap. So, anyways, like I said, I've been programming for a while now. I've learned a few tricks, mostly the hard way, mostly by beating my head against a brick wall, repeatedly doing the wrong thing until I eventually realized, ooh, I'm doing the wrong thing. And then sometimes I figure out the right thing. Sometimes I have learned from others, like reading source code, reading books, but I've mostly learned this the hard way. So I hope I can save you a few decades of difficult experience. And I'm not some super genius. I have seen and watched super genius programmers at work. I wish I was one of them. I'm not. I do it the hard way, like most of us. And if I can do it, you can do it. So for this talk, this isn't like the nine universal principles. I probably could have come up with 12 or seven, but nine fits nicely on a slide. It also fits nicely in a 30-minute talk. So nine principles. Now, I'm not going to insult your intelligence by reading these principles to you one at a time. Instead, I'm going to insult your intelligence by reading through these individuals. I'm not actually going to. Anyway, so the first step to writing a reusable code is writing better code. There are lots of ways to write better code. I recommend these ways. Number one, read more code. This is something that's left out of most computer science education. It's not hugely emphasized in the post-education system of training programmers, although really, you can't work in the real world without reading other people's code. But do it, especially read good code. Don't just read the code written by that older dude down the hall at work. Maybe he's not the best programmer in the world. I get out there into the open source world and look at the good stuff. Look at the beautiful code and read it. Or look at this. There's a whole book about beautiful code, which is exactly dedicated to this principle. Learn from the masters. Write more code. Obviously, you get better at something by doing more of it. But it's not enough just to write more code, to just write thousands and thousands of lines of code. Go back, revisit it. Critique your own code ruthlessly. Refactor it mercilessly. Because if you critique it mercilessly, it will be much less painful when somebody else comes along to critique it because they won't have as much to complain about. Books, read more books. Good advice about life in general. In particular, read more books about programming. There are lots of good books about programming. I like these three, or at least what I haven't actually finished. Beautiful code. It's quite thick and chewy and demands a great deal of attention. But it's worth it. And the other two as well. And lots and lots of programming books out there. Just read some. And please, don't try to learn to program from Google. So a little more technical. Please, write more functions and fewer classes. Again, I'm not here to hate on object-oriented programming. It's a great trick. It's a good tool to have in your toolbox. You don't want it to be the only tool in your toolbox because a person with only one tool. Well, I hope you've heard the expression that if all you have is a hammer, everything looks like a nail. Not everything is a nail. In short, don't write a class when a function will do. On the other hand, if you have a class, the collection of related functions that all operate on some common state, well, that's a class even if you don't call it one. If you're writing in a language like Python that has special syntax for denoting that this collection of functions are a class by all means used that syntax. So here is a code smell that verges on anti-pattern. If you see something like this, a class with a single public method, that is a code smell. If that single method is the only method period, and it's not particularly long or complex, that is an anti-pattern. In particular, this thing loader with only a load method, and if there's like 10 or 20 or 30 lines there, there is no need for this to be a class. This is the sort of anti-pattern that you often see in people fleeing from more rigid and restrictive languages. It's not their fault. They've been trapped in a jail where there is no alternative. If you're programming in Java, this is all you can do. Kindly gently point out the error of their ways and say, you know, there is a better way. The better way, of course, is write a function. That's all it takes. It turns out that just simple standalone functions generally tend to be more reusable than classes. It's not an ironclad rule. It's not a carved in stone commandment handed down by God from the mountain. It's just something you notice after a couple decades of programming that if you've got a 20 line function buried in a class and you just want that 20 line function, it can be hard to reuse. It can be annoying. Why is this buried in this gigantic class? It doesn't need anything else in this class. It can be annoying. Yeah, so on the other hand, here's another anti. This is not as, well, maybe this is as bad an anti pattern. This is in my imaginary made up language, which is somewhere between Go and JavaScript. I think you get the idea.  The functions all take two common arguments, one of which is probably stateful. A connection, maybe it's a connection to a database and HTTP server, who cares? It's probably stateful or long lived, something you don't want to throw away, whereas the article idea is just a common identity. They're not exactly the same, but hey, they're all common. They'll do stuff or tell you stuff about an article, whatever that is.  It should be this, a class called article store because this is a collection of functions that operate on some common state. Nothing wrong with classes, when they're the right solution to the problem. Third principle, so I'm old enough that when I was in high school and early undergraduate, Pascal was the language of the day. I see some smiles of recognition there. So we've moved on from Pascal. Pascal is in the past. There are better languages today, but I think we lost something when we switched away from Pascal because Pascal had a neat, not really a feature, it was more of a restriction, a deliberate unfeature, a deliberate restriction of the language, which is that it distinguishes between functions and procedures. I've honestly forgotten the exact particular rules because it's been like 25 years since I used Pascal, but in general, functions compute stuff, procedures do stuff. All the hot, sexy functional languages these days are extremely keen on this distinction. The mainstream imperative languages, including Python, don't care. In Python, in C, in Java, some functions compute and return something, some functions don't. They probably have side effects. And the language doesn't do anything to stop you from mixing side effects with return values, but you should.  And the reason is reusability because a function, so the best kind of function at all is a pure function. A pure function depends only on its input arguments and the only way it can affect the outside world is through its return value. Pure functions are awesome. I love them. But in the real world, not everything can be a pure function. Lots of things have side effects. Nothing wrong with side effects. You can't put these pixels on the screen without side effects. The important thing is to segregate functions which compute stuff from other functions which have side effects. Please try to keep them separate. It's a rule of thumb that I follow. Every function either returns a value or has a side effect. And if I break that rule of thumb, I try to have a very good reason for doing so. So here's an anti-pattern that C programmers are notorious for. I could come up with an example in Python. It wouldn't operate on strings, of course, because strings in Python are immutable. But this is a C-like language where strings are mutable. You can iterate over the characters of a string and replace some of them. Like I'm going to uppercase all E's and replace them with uppercase E's. You could do the same thing on a list in Python, but I felt like mixing it up a bit and throwing in an imaginary programming language here. Now, there's nothing wrong. Well, personally, I'm not a purist about functional languages and mutable state. If you need to pass a mutable object to something and it mutates that object and doesn't give it back, well, that's just a side effect. Side effects happen and make sure you document them and don't mix them with return values, but side effects are okay. Immutable object, mutable state is okay. But please don't also return a value because now if somebody just wants to count the number of E's in this string, they're screwed. They can't access that functionality because you've clobbered their string. It's really quite annoying. A better way to do this is a function that takes a string and returns two values. Obviously, this is trivial in a language like Python or Go or lots of other languages that support multiple return values. It's a lot harder in C, but it's still doable. And also, obviously, it's slower. Sometimes you have to sacrifice performance in order to gain reusability. Generally, I prefer reuse unless I have a really good reason to prefer performance. So in this case, somebody's gonna, somebody, the person who writes this code is gonna have to allocate a new string, copy and modify into it, and also return an integer based on the computation over that string. That is more reusable and yes, it's slower. If you absolutely need performance, you break the rule of thumb. But personally, I try to follow that rule of thumb by default, keep your functions that return values segregated from your functions that have side effects. More libraries, please, fewer frameworks. If you're unclear on the distinction between a library and a framework, this is the best definition I've seen. A library is code that you call. You're in charge. You call the shots. You decide I'm going to use this bit of the library and that bit of the library and I don't care about the rest. The framework is code that calls you. There's a Yakov Smirnov in Soviet Russia joke lurking in there. I just couldn't think of one, sorry. The framework is in control. You just write some code and hope, you hope you beseech the framework gods.  Please, please, please, in the way that I intend you to. And if you're lucky, it'll work and everything comes out hunky-dory and it's all peachy. Unless, of course, buried in that 4,000-line framework is a little 20-line function that does just exactly what you need right now today, but you can't get to it because it's buried deep in the guts of that framework and really, honestly, you know what you're going to do is you're going to copy that code out.  It's gross, yuck. That's not reused. That's copying. So the trouble with frameworks is typically they're all or nothing. You have to drink the Kool-Aid, sell your soul to the framework, and that hampers reuse. Often, sometimes. Libraries are easier to reuse even if they don't solve every problem. Now, I've been kind of railing a little bit against object-oriented programming, trying not to rail against side effects, railing a little bit against frameworks. None of these things are evil. Object-oriented programming is a fantastic trick to have in the toolbox. I would rather use a language with classes and objects than not. Side effects are unavoidable. Fundamentally, a computer is just a big box of numbers with some wires going in and some wires going out. Anytime you send a bit on one of the wires going out of the machine, like that screen there, that's a side effect. You can't compute without side effects no matter what the Haskell people tell you. Side effects are not evil. They're unavoidable, but please try to keep them segregated and at least be aware of the concept of pure functions. Try to write pure functions, and if you must break the rule of thumb, know why. If you have to do it for performance or if you're doing it because it's 20 lines of code instead of 50 lines, if you're doing it to avoid duplicating code, yeah, okay, have a good reason to do it. And finally, frameworks are not evil. Certain problem domains, I'm looking at you, web development, really call out to constrain the developer down a well-known path of the right way to do it. If you stray from the path, bad things happen, which is why there are so many frameworks for web development, because there are so many wrong ways to do it. Certain problem domains really call out for a framework. Many, many problem domains do not. You don't have to write a framework for everything. So, assuming you've accepted my advice to write a library, your library should not try to solve every problem. It should not try to be all things to all people. Avoid the temptation to satisfy every last feature request or even worse, every conceivable feature request. The reason for this is that the users of your library are your fellow programmers. If you leave a bit of functionality out of your library, who can fix that gap? Your fellow programmers, the users of your library. Now, if 90% of your users have to re-implement the same bit of functionality that you left out of your library, it might be time to add that. Save them the trouble. If 1% of your users need a particular feature, I'd leave it out. And the reason, the really important reason is not the fact that your users, your fellow programmers, are perfectly capable of implementing this code on their own, it's the converse of that, which is that if you've got bad, ill-advised code in your library, you know who can take it out? Nobody. Not your users, not you, because of backwards compatibility. Now, maybe in certain special circumstances for a library that's not very widely used, where you have control, like it's just used in your company and you have control over all the colors, you can go to them and make sure nobody's using this bad piece of code that you wanna remove. Maybe in those particular cases, you, the author or maintainer of the library can remove that code, but it's only you. Really, most of the time your users aren't gonna bother, frankly. It's just too much trouble. So, testing. If you provide me either a library or a framework, and there are no automated tests, that is, what's the nice word? Useless. I can't use that. I mean, it's 2015 unit tests have been mainstream for 15 years now, 15, 16, 17 years now, and there's just no excuse for not writing automated tests for a library these days. Sadly, even that's not enough. Automated tests are a necessary condition for reusable code. They are not a sufficient condition for reusable code. You know, it's another necessary but not sufficient condition, documentation. Unfortunately, the tools for writing documentation are not as good as the tools for writing tests, probably because programmers dislike writing documentation even more than we dislike writing tests. But, you give me a library with no documentation, you're wasting your time. It is useless code. It is not reusable. I can't read your mind. I can probably read your code if I'm really, really dedicated and absolutely keen and burning with a fiery passion to reuse this code, but if I'm not, I'm not gonna bother. Frankly, it's easier to just write it myself than to try to read your code. Give me documentation though, and I might just have a chance. By the way, the bare minimum documentation these days is inline reference documentation, doc strings in Python, Java doc in Java, go doc in go. Every language these days has some sort of syntax for inline reference documentation, which is repeat the bare minimum. Really, I need more than that. I need some sort of high level, descriptive narrative documentation. Probably for 90% of the libraries on the planet, a one page readme is absolutely fine. That's all I need. The really big Harry libraries, that's where you need some separate documentation that says, here's what you do, here's what this library could do for you, blah, blah, blah, blah, blah, blah, blah. But please, please, please, at least a readme. And of course, inline reference documentation, bare minimum. Finally, extensibility and reusability are not the same thing. If you were paying close attention back in the early 90s to those snake oil salesmen, promising a golden age of software development right around the corner, they promised both reusable and extensible software components. Give them credit, at least they recognized that those were two separate properties of a piece of software. Reusable doesn't mean extensible, extensible does not mean reusable. However, just right typing class foo at the top of your module does not make your code extensible any more than it makes your code reusable. It might be a start or it might not. Using objects and classes is largely orthogonal to whether your code is reusable or extensible. You have to design, you have to carefully think about reusability. And honestly, I think I've learned a thing or two about writing reusable code over the years into this talk. I do not know much about writing extensible code. If you do, you should be up here giving a talk next year. Please do, I'd love to go to that talk. I would love to learn how to write extensible code from somebody who's done it the hard way or the easy way better yet. So, wrapping up, there ain't no such thing as a free lunch. There is no silver, there are no silver bullets. There is no magic pixie dust. I'm afraid good software requires effort. And in this particular definition of good, good means reusable. Beware of pompous windbags, clueless pontificators, purveyors of snake oil, and above all, beware of people giving toxic conferences. And here are some links to the books that I like and the video that I like. And there's also the URL of these slides so that you can find these links later. Any questions?


Is this the voice of the Holy Spirit? Or is this just me? That's a question many believers often ask themselves. So I want to show you four ways the Holy Spirit speaks so that you never miss his voice. Before I begin, I want to encourage you to subscribe to us on YouTube if you're watching us on YouTube. When you do subscribe, click that notification bell so that you can receive notices when we release new content. If you're watching anywhere else, don't forget to follow us wherever you're watching us. So the voice of the Holy Spirit. There was a time in my life when I was tormented wondering if I was correctly hearing the voice of the Holy Spirit or not. My own thoughts became obsessions. My own feelings became obsessions.  Was that the Holy Spirit? Did he speak to me? I was tormented by the thought that I might miss the direction of the Holy Spirit. It was a religious way of living, and it became so bad that when I would be getting ready for the day, I would look through my closet. I would look at my jacket and say, Holy Spirit, do you want me to wear that jacket? I would look at my shirts and say, Holy Spirit, do you want me to wear this shirt? And there was this overbearing, religious, complex way of seeing the world that I began to live by. And it wasn't until I truly discovered the voice of the Holy Spirit that I was set free from that kind of tormenting living. And maybe you're in that place right now. You sincerely want to hear the voice of the Holy Spirit.  Or how do I know the voice of the Holy Spirit? I'm going to show you these four ways that the Holy Spirit speaks. Number one, the word. The word is perfect, lacking nothing. It is the inerrant inspired word of God and it is the foundation for your living. The word of God is just the Holy Spirit, pure, through and through. It is what it is. This is where it begins. This is your foundation. The scripture says in 2 Timothy chapter 3, all scripture is inspired by God and is useful to teach us what is true and to make us realize what is wrong in our lives. It corrects us when we are wrong and teaches us to do what is right. God uses it to prepare and equip his people to do every good work. You want a word from God? Open your Bible. If you're serious about hearing the voice of the Holy Spirit, you'll be serious about reading the Bible. The word is your foundation. The more familiar you become with the word of God, the more clearly you'll be able to hear the Holy Spirit speak in the other ways that he speaks. If you don't know the word, then you don't have a foundation. If you don't know the word, then you don't have a safety net. If you don't know the word, then you don't have a measure by which you can judge whether or not you are hearing the voice of the Holy Spirit, for the Holy Spirit will never contradict the word. So it begins with number one, the word. Number two, wisdom. Now, wisdom is the Holy Spirit speaking to your spirit. So it doesn't quite manifest in your intellect or your understanding. There's sort of just this guiding pool, this sense about what should be done in particular circumstances. Romans 12, 2 says, Do not be conformed to this world, but be transformed by the renewal of your mind that by testing you may discern what is the will of God, what is good and acceptable and perfect. So when you have a renewed mind, you're more easily guided by the Lord. It's by the renewed mind that we can test and discern what is the good and acceptable and perfect will of God. It's by the renewed mind that we come into this flow with the Holy Spirit. That's why I said the word comes first, and the word produces wisdom. Wisdom guides you. As I said, it's like this pool. You don't quite hear specific instructions. You don't quite hear specific words or sentences, but you do have an overall sense. So wisdom is not the specific sentences. It's the overall sense, just this knowing, this inner knowing about the direction that you should be going in your life. James 1.5 says, If you need wisdom, ask our generous God, and he will give it to you. He will not rebuke you for asking. After the word, this is the most reliable way by which God speaks. Wisdom. It's that inner guide. It's that pooling. It's what instructed Solomon. It's what James described as something that God would give to you if you simply asked. Wisdom cries out. Wisdom speaks. Wisdom guides.  That foundation helps to renew your mind, and then you have the wisdom of God. As I said, wisdom is not manifested in those specific sentences. Do this, do that, say this, say that. But it's that overall sense that guides you. So the word is the most reliable. After that, you have the wisdom of God. Number three, the whisper. Now this is the Holy Spirit speaking to your spirit and your spirit speaking to your mind. So remember, wisdom is the Holy Spirit speaking directly to your spirit, and then that creates sort of this inner guiding, this inner knowing. But when the Holy Spirit whispers to you, or speaks specifically to you, this is the Holy Spirit speaking to your spirit, and your spirit communicating that to your natural understanding. And so it comes forth as specific instructions. Now this one is a bit more difficult to navigate because there are a lot of thoughts and emotions that can interrupt, intercept, and distort the voice of the Holy Spirit. John 14, 26 says, But the Helper, the Holy Spirit, whom the Father will send in my name, he will teach you all things, and bring to your remembrance all that I have said to you.  This isn't because the Holy Spirit's not reliable, it's because as I said, we have so many things going on inside of us that we can interrupt, or disrupt, or maneuver our way around to distorting the voice of the Holy Spirit when he speaks to us through the whisper. Now some have asked, if it's in God's word, why does the Spirit need to speak it to us? If it's not in God's word, why would the Spirit speak it to us? However, these questions fail to take into account the need for specific instructions and details for our lives that are not addressed in the scriptures. For example, where you should live, who you should marry, where you should work, and so forth. So in the scripture, you can find commands like, live holy, worship God, love one another, forgive each other. These are all things that were very clearly instructed to us. But as far as what you should do in the specifics of your life, who will your spouse be, where indeed should you live, where indeed should you work, should you take that offer to that school, and so forth. These are the things where we need the whisper of the Holy Spirit. These are the things where we need the specific instruction of the Holy Spirit, which leads believers to ask, well, what does he sound like? What is the voice of the Holy Spirit sound like? And on this question, I'll tell you, you're going to get a lot of different answers from a lot of different people. And I'm not saying people are lying. I'm saying that people experience the Holy Spirit's voice in different ways, or at least interpret and describe the voice of the Holy Spirit in different ways. So even if I stand here and say, well, the Holy Spirit, his voice sounds like many waters. Well, what good does that do for you?  Or let's say I say that the Holy Spirit's voice is like a whisper. And you hear a gentle nudge in your heart. Now that could be your own mind still. But because it's gentle, are you therefore going to say every time that's the Holy Spirit? This is why those specific descriptions of the voice of the Holy Spirit don't really give us the help that we actually need. Rather, when talking about the voice of the Holy Spirit, we need to understand that it is simply a sense. It's a spiritual sense. How would you describe sight to a man born blind? How would you describe hearing to a man born deaf? There's no way to describe a sense that someone has never had before. In the same way, the sense of the spirit, the sense of his voice, is something totally outside the realm of description. It's something you either know or you don't. Now that may sound discouraging, but in fact, this is actually really encouraging because for believers, it comes naturally. So it's not a matter of hearing the voice of the Holy Spirit. He's speaking to you. It's a matter of discerning the voice of the Holy Spirit. And the more familiar you become with the Word and the more you walk in wisdom, the more easily you will begin to identify those whispers. And this is something, again, we should not be obsessing about why. Because everything that God gave us that we absolutely need to please him is found in the Word. And then our lives are guided by his wisdom. When it comes to those specific instructions, we mustn't walk in condemnation, especially if we're trying to hear the voice of the Holy Spirit. If we're sincerely seeking his advice and direction and surrendering our lives and saying, Lord, I want you to guide my life. I want to surrender to you. In that case, we can be free of this religious, toxic, destructive mentality that tells us, oh, you missed it here, you missed it there, and therefore God is angry with you. No longer do you have to obsess about these whims and these thoughts that come near mind, but you can be guided by the Word, guided by wisdom, and the Holy Spirit will reveal himself through the whisper as you live based on those first two foundations. So number one, the Word. Number two, wisdom. Number three, the whisper. That's the specific instruction. And number four, wonders. Now the Word is just the Holy Spirit, as I said, pure through and through. Wisdom is the Holy Spirit speaking to your spirit, and that manifests as an inner pool. The whisper is the Holy Spirit speaking to your spirit, and then again the spirit, your spirit speaking to your mind. And this is manifested in specific sentences that you receive or specific instructions that you receive from the Holy Spirit. Wonders, that is the exterior world to your mind and then to your spirit. These are things such as dreams, visions, prophecy, words of knowledge, and signs. We see in 1 Thessalonians chapter 5 verses 19 through 21 that the Holy Spirit speaks through prophets. In Acts chapter 2 verses 17 through 18, we see that the Holy Spirit speaks through visions. In Job chapter 33 verses 14 through 15, we see that the Holy Spirit speaks in dreams. Mark chapter 16 verse 20, we saw that the Lord confirmed messages and therefore spoke through miraculous signs and wonders. So wonders includes this list of exterior manifestations that God uses to speak to us such as miracles, such as prophets. But all in all, we can always come back to the Word if ever we become unsure. So number one, the Holy Spirit speaks to the Word. Number two, the Holy Spirit speaks to wisdom. Number three, the Holy Spirit speaks to the whisper. And number four, the Holy Spirit speaks through wonders. I want to pray now and I'm going to ask the Holy Spirit to begin to speak to you clearly and to help you as you seek His voice, Father in Jesus' name. I thank you, Lord, for that one receiving this prayer now. And Holy Spirit, I pray that you would cause us to be more sensitive to your voice. Give us the hunger for the Word. Help us to walk in wisdom. Let us be attentive to your whispers and, Lord, let us appreciate your wonders. We honor and we bless you. In the name of Jesus, we pray. And I want you to say it because you believe it, say, Amen. Well, that is it for the lesson. Here is a question for conversation. In what ways have you benefited from the voice of the Holy Spirit? Tell me about it in the comments. And now I'm going to read some comments from a previous video titled The Truth. Here's what the Bible actually says about money. K.W. writes, everything you said is true. A lot of Christians are confused about this subject. Thank you for teaching the truth and making it so clear to all. May God bless you, David D. Hernandez, and your ministry. In God I Trust writes, this message is exactly what my family needed to hear. For two days, we have been looking at our finances and need to be better stewards. Thank you, Jesus, for this message right on time. Jechrelle Jopetana writes, Hi, Pastor David, this teaching inspires me so much to be faithful in giving. Thank you, and I pray that God will bless this ministry abundantly. Kathleen Gallo writes, this was a wonderful message at the right time. I'm still a teenager and I believe God has called me to give, so almost all my small savings go to the church and the poor. I know my money is not mine, so at times there is nothing left for me. I am from the Philippines, where many are poor. God has given me the heart to pray and show compassion to the poor. Also, through this ministry, I met and encountered the Holy Spirit and immediately received the gift of tongues. Thank you so much for helping me grow, Brother David, to God be all the glory. And the final comment from this video that I'll read comes from Eunice Rivera, who writes, Thank God and thank you for this wonderful message.  I pray that I will be able to partner monthly with God's work through your ministry one day. I want to encourage you with a portion of scripture found in Mark chapter 12. Jesus sat down near the collection box in the temple and watched as the crowds dropped in their money. Many rich people put in large amounts. Then a poor widow came and dropped in two small coins. Jesus called his disciples to him and said, I tell you the truth, this poor widow has given more than all the others who are making contributions, for they gave a tiny part of their surplus, but she, poor as she is, has given everything she had to live on. When it comes to our giving, God looks at how we give in proportion to what we have. Whether you have much or you have little, you can please the Lord in your giving by giving in proportion to what you have. Give generously, give sacrificially, and help us continue doing what we're doing for the Lord. Help this ministry continue to expand and to grow and to reach souls and to bring healing to the nations. Help us continue to take the power of the Holy Ghost all around the world. This ministry is growing, this ministry is effective, this ministry is good soiled. So give a one-time gift or become a monthly supporter by going to davidhernandezministries.com.  If you believe in what we're doing, if you want to help us win souls, if you want to join hands with us and you want to join our army of supporters from around the world, then go to davidhernandezministries.com. Donate for one-time gifts or davidhernandez ministries.com slash partner to become a monthly ministry supporter. Help us continue to reach people all around the world and remember, nothing is impossible with God. Thank you for watching EncounterTV. Don't forget to subscribe and click the notification bell. Also, help us spread the gospel of Jesus Christ in the power of the Holy Spirit. Make a one-time donation or become a monthly supporter by clicking on the donate link now.


What's up everybody, Jayce here for jayspeakscasebreak.com doing a quick little one box break of 1920 UD ice hockey This is round of teams break number three where we're giving away nine mixer spots in the hockey mixer So the way this first guys randomize customer names and teams open up the one box of ice to distribute the hits sure We're no veteran commons will ship out of there There's a full box of ice and at the end of the break we're atomize all 30 customer 31 customer names again And numbers one through an eye pretty much almost a 33 percent chance or so a little less than that maybe 29 But pretty good pretty good odds to get a spot in the mixer So let's do the break first of course then we'll randomize the customer names in a separate actual randomizer To see who gets spots in that. Let me actually set that up here, too. So that way I don't lose the list So this is for the break first guys Dish will for the randomizer for the teams names Three to six nine times. Good luck one two three four five six seven eight Zack done a damn nine times one two three four five six Seven eight percent of the Chicago Blackhawks That is the Sabres Bluejack experiment with the Doug's Michael the Hurricanes wear with the penguins wear with the Yelts Mike the Flyers Craig with the Knights Nick with the Islanders Nicholas with the Jets stars Panthers Adam with the Oilers Kathleen with the Leafs Mike with the Blues Michael with the Vancouver Canucks Nick at the Flames Devokate with the Lightning John the Devils Michael with the Wild Steve with the Preds Timothy the Red Wings Richard with the Kings Mike with the Sharks Adam Rangers Kevin with the Avalanche Nicholas With the Capitals Adam with the Senators Mike with the Canadian Simon with the Bruins And down with the Chicago Blackhawks So again, no one really ever trades in this stuff So just praying rip. Let's do the break really quick Boxing ice. We got an equal live for Horton level three My kings we are Bergman to 999 level four and we got an autograph ice premieres Carl Grunster Here we got Angville Raleigh Q of Jack Hughes very nice So this is our hero ship this will be the base Let's do the break. So actually some hits my Kings. It's going to rich Devils Jonathan We had a couple other ones here Senators going to Adam Leaves going to Kathleen Sharks Mac All right, let's get away some mixer spots remember nine of them top nine dice roll roll it 301 four times top nine get in one two three And fourth and final time Oh Nicholas Mac Timothy Michael Michael Kathleen Mike Zach and Mike There you go Mac. You just played the odds game and you won Some good spots in here four times Congratulations, you nine are in the break Another way to win last one number four on the website. Appreciate it guys


Christopher, I really enjoyed your recent think piece. You call them think pieces actually from Hellgarten and Company. Bricks, the company one keeps. Can you tell me why you selected or decided to do an update on Bricks? What news story was the catalyst? The summit that the five Bricks nations had in the last fortnight in Hectare. I'm I'm sure it was their second gathering, but it's a new concept that's appeared on the stage quite recently. Now, some of the news stories about that particular summit are stating that they feel that the West really needs to pay attention and Bricks is going to be a formidable competitor for the G7. What are your thoughts on that? And by the way, I cannot wait to hear your response on this. Well, you know, some of these countries are on the rise. Some of them have risen and some of them are falling. And definitely, Russia is in freefall economically and diplomatically and it's just persona non grata everywhere. South Africa does not have a great reputation economically ongoing power problems and other things. You know, strategically, it's a great mineral problems, but not much else. And yet countries like India are storming ahead. You know, they're rising in the GDP world. So it's a very disparate group. And you know, the G7 have a lot more commonality between them than these five countries do. These are just sort of cobbled together. In fact, because Goldman Sachs invented the concept of Bricks as a way to sell emerging market shares in the 1990s, you couldn't sell a Russian share these days. You can't even trade a Russian share any weeks at Moscow. So it's sort of like a strange concept that was invented for investors that has now been morphed into like a diplomatic sort of stick to beat the West with. And the West, frankly, is not feeling the blows from this development.  Well, you specifically write in your report, Goldman's brainchild disowned. Would you like to give us kind of the kind of little background on that? They invented this to sell shares of Pemex, oh no, Pemex, TomEx and telegraphs back in the 90s. You know, they haven't even talked about it for ages now. And the actual strategist to Goldman said, you know, this is not what we were talking about in the 1990s and why we invented this. And it's outdated. I mean, virtually, if you remember back to the time in the late 90s, when this was invented, people said, what about Thailand? What about this one? And what about Indonesia? And what about that? Why were they left out of the Bricks? I mean, the Bricks, of course, was a easy concept.  When you throw all these other countries in, it's unpronounceable. And so, you know, it's just soundbite. And Goldman sort of like moved on. And everybody else moved on. People are sort of like grasping at it as something as a concept that they can read life into as Chinese diplomats. And unfortunately, it's a bit like a balloon that's got a hole in it. It can blow as much life as it's going to inflate. Well, I recommend everybody out there interested in finding out more. I certainly enjoyed this think piece. Christopher, thank you. Please go to the following website for Hellgarden Plus Company. Thank you, Christopher. Thank you.


Next up we have Manas who is the data science and NLP lead at our episode which is a US healthcare company and today you will be talking about building a decentralized data collection platform for deep learning healthcare. Good morning. So before we start off I just want to quickly introduce myself in addition to what she mentioned. So I have been working with machine learning and data science at episodes and our major target has been to build automated platforms for medical charts. So you have a length of medical charts and you would want to analyze what content it has. So you would have to do a fair bit of machine learning as well as natural language processing to extract entities and entities being lapped as procedures, diseases and then map them to the corresponding ICD codes. So in that effort it has been a massive exercise both from a point of view of data collection as well as creating machine learning pipelines and one of the major targets and challenges of creating machine learning pipelines in healthcare is you have to abide by certain regulations and how they add more complications and how we essentially worked around it is what this talk is going to be about. So this is the broad agenda. So we will talk about the problems and challenges and I will take you through three architectures that we are using in production now and how they are essentially allowing us to be HIPAA compliant as well as ensuring that our machine learning pipelines work efficiently. So this is the problem statement. So last year when I joined episodes and was brought on board to lead the data science team, episodes were struggling with a fair amount of competitive market pressures and these market pressures were more to do with the amount of people you had to hire to deliver certain projects. Now the projects to resources essentially the employee was a very linear relationship. So if you wanted to deliver more projects, you would have to have hire more people and since this is a very linear relationship this scalability then suffers massively. So what you would want to do is add augmented intelligence using machine learning and NLP and ensure that these things are taken care of. And of course episodes since it is in a healthcare risk management business, it becomes a lot more important for it to adhere to new ML and NLP based experience platforms and ensure that they are at the bleeding edge of the healthcare machine learning research. So when I was brought on board I was told and I was given a very clear directive that we have to build a scalable information extraction pipeline for healthcare documents and that's what we started off with. Now there were major three challenges with creating this machine learning pipeline. The first being that it has to be scalable and the second being it has to be local. As it goes with any machine learning platform or any machine learning pipeline you create, there are three things. It can be good, fast or cheap and you cannot have all three of them. You can only choose two of them. So you can either have a cheap and good but it won't be fast and so on. So it's a triangle which you only have access to a couple of them. So that was a big major challenge while creating this platform. And of course when we are talking about creating a platform at that scale where you are processing not thousands or hundreds of documents but we are processing millions of documents. You have to create an architecture which is useful for optimized machine learning as well as optimized training data collection. And anyone who has worked with healthcare will tell you that there is a big compliance issue when you are working with machine learning healthcare. Now privacy is a big factor nowadays whether you are working in finance or whether you are working healthcare or anywhere. So privacy and when you are using social networks or when your medical data is out there becomes lot more important. And HIPAA is that rule which guides and has a list of compliance checklists that you have to take care of. Now what it essentially talks about at the core of it is that you have to secure the data both while it is in transit as well as the rest. So while you are transferring the data or while you are storing the data you have to secure it in your best possible manner. And that's what HIPAA compliance talks about. And the KPI for us was we have to minimize the cost of processing both from the data cleaning data preprocessing and the data inference the machine learning inference that is to the bare minimum USD per chart cost as much as possible. And I'll talk about what that cost has been brought down to. So this was a philosophy when I started off for the team. So I think this is a philosophy which is true for majority of the machine learning teams out there. So we would want scalable fault tolerance cost effectively machine learning pipelines and we would want immutable configurations. So I do not want to be giving excuses to my boss it works on my machine I don't know why it's not working on the cloud. So I don't want to give those kind of reasoning to my peers or to my superiors. And at the end of the day I did not want a bunch of people who are very good at DevOps or very good at ML. So I wanted people who are mostly ML Ops kind of a profile people so who have a fair bit of understanding of machine learning as well as they can deploy their own algorithms because if I create my own algorithms and allow someone else to deploy it Chinese whispers essentially will dictate that by the time my machine learning pipeline is deployed it has become something else to what I had devised in the earlier. So that's what I want to avoid in the first place. So anyone in my team is able to create algorithm as well as deployed on it on their own. So now why is HIPAA roadblock for us now you may say ok HIPAA dictates certain security dictates that you undertake certain security measures in terms of securing ML pipelines but the major reasons why HIPAA becomes a roadblock is one there are many machine learning as well as backend architectures that you now can't use ok now for example if you are using if you are working on AWS cloud there are many AWS services which are not HIPAA compliant which means that you can't use them. Now there are services like S3 there are services like AWS lambda which are HIPAA compliant AWS lambda is not actually HIPAA compliant so you have to make sure that you are launching it in your own private VPC to make it HIPAA compliant but explicitly it's not HIPAA compliant and you can't have public IP for service which means that if I have to run my entire machine learning pipeline monitoring it as well as ensuring to how to debug it becomes an issue so I have to create a automated pipeline where all these logs as well as debugging and what information in the way they are processed becomes lot more streamlined and as I said that data has to be secure data privacy has to be at the utmost and that was going to regulate our entire machine learning architecture so that's when we decided to go serverless so we said okay there are three components to machine learning one is the training data collection now you would know anyone who has worked in machine learning will tell you that no matter how complicated your algorithms are if you don't have quality training data doesn't matter okay so you can have a high quality training data with as something as simple as logistic regression is going to work very well unlike you have 10 layer deep neural networks based on PyTorch with very low quality training data so the first target was to collect that data in the first place and we being in healthcare there is no public data available which is annotated which says okay this is a medical chart this these are the annotated diseases these are the annotated labs these are the annotated procedures so in that case what we had to do is since we had and that's why we like to call episodes as a machine learning heaven because we have roughly more than 3000 people and our data science and LP team can get access to anywhere from 50 to 200 people to create training data for three months at very short notice so if you want to create training data I could just call up the senior management who handles ops and ask them okay I want certain amount of people deployed for certain amount of time but even then they're going to be working on private healthcare data they're going to be annotating private medical data and so which means that their entire architecture to even annotate that data as well as collect the training data has to be encrypted as well as a backup plan so we'll talk about couple of methods how we are doing so and well we are while we are going going serverless there are multiple platforms like Docker which allow us to create those immutable configures and anyone who has used Docker will also tell you that once it's you learn the basics of Docker it's extremely easy to deploy and as well as use it in machine learning it's a very nifty tool when it comes to any amount of DevOps deployments and these are our major kind of pillars so we are using Docker Ansible Boto which is a python wrapper around AWS cloud and the AWS platform itself and that's what we believe is if I'm not maintaining my platform if I'm not spending time maintaining my platform which is essentially no ops that's the best kind of doubt so I did not want my DevOps people to come in and just work on maintenance but rather create a HIPAA compliant platform which is self-healing as well as self-reland so here I'll take you through three architectures so there are three architectures that I'm going to be showcasing and one is the data collection architecture where we are creating it in a serverless manner as well as ensuring that they're HIPAA compliant the second part is the data processing and the third part is the machine learning model deployments so these are the three separate architectures that I'll basically be showing you as to how we are creating these machine learning platforms so this is the broad overview so how do I essentially make sure that my environments at the bare minimum are well maintained so I use PyCharm as my preferred id and since I have to use Python to create all my machine learning models and exclusively use PyTorch now so what I've done is I've created a Docker container as a remote interpreter for PyCharm and every time I'm compiling a bunch of code I'm testing this Docker container and what happens is that my code base machine learning training my preprocessing as well as my prediction code bases are tested in real time and all I have to do is I have to push this Docker image to AWS CCR now AWS CCR is same as Docker Hub for private Docker images and once I've done this I essentially have lambdas triggering these architectures and we are using services like AWS STS which is the security token service to generate temporary credentials so we are not plugging in the core AWS security keys but rather generating these keys on the fly and at the end when we are using Docker we know that Docker can't be used for persistent tasks so we can't use Docker where the persistent data becomes a lot more important but we want to be using Docker where we want to save logs we want to load our pickle files so what we essentially do is we mount an encrypted disk from AWS EC2 services as the Docker volumes and ensure that the models as well as the logs are saved in real time and then which are pushed to S3 at the end of the run so this is the first architecture that we are using to collect data now so so this is a kind of very skeleton framework of what we are doing so obviously we have like 300 people working on a platform like brat which is a Stanford NLP annotator open source annotator so what we have done is we have created multiple images of brat on multiple servers now the issue is that I am trying to create a three-level QA system which means that the same chart has to be annotated by at least three coders before I finalize that as my training data which also means that I cannot have three separate copies I need to have the same copy on across servers so for that what happens is that 300 people logging in I do not want the site the brat to become slow what I would do is I will place it in front of a load balancer and there would be three or four servers attached to my load balancer but the content the training data itself is going to be pulled from something called the elastic file system now EFS is essentially you can think of so has anyone worked with AWS before ok so in AWS there is the concept of you can attach your own disks which is called EBS and you can encrypt them on your own now in a typical scenario you would have to attach three separate EBS to these three separate servers but what that would mean that I have three separate copies and these three copies are not synced but my use case dictates that I need to sync my copies so what EFS essentially is is an advanced form of EBS to put it simply which you can attach to multiple servers so you can think about it like it is a remote disk which you can mount across your machines ok so if you make any change on your machine and it is a remote server FTP server it will reflect on someone else's machine as well so EFS works in that manner which means that by the time a person comes in and makes a change here it gets automatically synced in EFS which then automatically gets reflected across the servers and it is real time and then once that is done we have a lambda job which ensures that we take regular 6 hour backups of the CFS servers so what we have is we run lambda jobs to take backups from the CFS into S3 and what this is also allows us is we have used this architecture which is a relatively simplistic architecture to even create chatbots now in healthcare you have to collect two kinds of data now one you have to collect the annotated data itself where you have to say ok this refers to this disease or this procedure but you also have to collect taxonomies ok so you have to create collect data where you say diabetes mellitus also means diabetes so while I would know that diabetes and diabetes mellitus are similar the machine would not necessarily know unless and until until I use techniques like cosine similarity and even in that case it is going to fail so I need to also create these taxonomies and ontologies on the fly so for that what we have done is we have created a simplistic chatbot which will collect these taxonomies so we would have these questions asked to the person ok what is the nearest synonym of diabetes mellitus and he is going to provide us a list of synonyms and this is what is going to then we are also going to have three level QA so we are not going to take the answer from only one person but we are going to aggregate it from across people so this is our kind of data collection kind of methodology where and all these servers are in the private VPCs private subnets and the only the and the reason being is that we cannot have a public IP for a server with private healthcare data which means that all this has to be in a private subnet and this one the load balancer itself then routes request via the net gateways to these servers so this is a slightly more complicated version of the data processing architecture and we are actually we have created two new components using this architecture so the first part is how does the data processing pipeline start now we are provided lots of healthcare data now the healthcare data can be anywhere from 10,000 charts to even half a million charts so what we do is we have a certain threshold is when the data is uploaded to S3 which is the storage buckets for AWS we trigger a lambda so we have a threshold which says okay if the number of charts in a certain bucket are greater than X in our case is typically anywhere from 1000 to 2000 then you start off a pipeline so then there is a AWS lambda which is a function as a service service for AWS and we use AWS lambda to launch our architecture using Ansible now you may say okay why I am not using AWS lambda itself to do my complete processing because AWS lambda puts two limitations on my entire processing pipeline so one is that the maximum RAM memory that I can have access to is only one and a half GB and it is lot more expensive so the minimum is 128 MB and the maximum is one and a half GB so I cannot have my machine learning pipeline operate in one and a half GB and the second and the most business critical limitation that it places on is that the execution time of one lambda function cannot be more than 5 minutes which means that I cannot use lambda to create my entire machine learning pipeline end to end so now what I do just lambda using lambda I just use create an architecture using Ansible now if you are using Ansible it essentially is a method by which you can run through a multiple level of steps so I like to look at Ansible like it is a cleaner form of bad scripting so it is a YAML file where you specify a list of steps and that allows you to launch your architecture in the way that you would want now I could also could have used services like Terraform or AWS cloud formation but Ansible looks lot more readable and it is lot more easier to debug and lot more easier to implement and once this is done then we launch the service now there is a master slave kind of architecture so where the master itself is launched in the public subnets and the slaves here are launched in the private subnets now the tasks the task of the master essentially is to pull the tasks from a queue which is the SQS queue of AWS and provide them to the slaves that is all it requires to be done so but now what we have moved on to is we have moved on from AWS lambda to this master slave architecture to lambda to AMR clusters so instead of launching a master slave architecture in both public and private subnet now we are doing this using AMR architectures and then finally once the data processing is done it saved on S3 now we could always have saved it in a database now we could always saved our data processing outputs in a database now but what that provides while that provides a good amount of flexibility to us to go out and share it with others as well but what it doesn't take care of is the cost now if you are saving the data on something like DynamoDB the costs are very prohibitive and the maximum amount of data that you can save in DynamoDB is something around 64 kb per item which means and since if it is a longer chart I am never going to have data worth of 64 kb it is going to be more than 1 mb at the bare minimum so I can't save it in DynamoDB or any database for that matter so what we have done is we have created a serverless database API where we are saying that we have created an API endpoint with its own resources in a restful manner we saved the data itself as JSONs in S3 and once you hit this API endpoint it triggers a lambda and this lambda then goes ahead and fetches the data from S3 and it fetches the JSON and returns the data as a JSON format and while the response time is not that great it is not in seconds but it is somewhere around 100 to 200 ms but at the end of the day we don't require real time updates or we don't require real time response at the anyway so what that does is it allows me to create my own API endpoint in my own scalable mesh so I can say in this chart how many diseases were there in this chart how many procedures with body parts are mentioned so was there leg x-ray mentioned or was there only x-ray mentioned so I can create my own custom API endpoint using this API so what this essentially is we have created as a serverless S3 based database it's not a database but is more of pseudo database as we put it inside our team so but if you are working with any kind of places where you have larger documents that you have to store and analyze it's preferable that you also use this method so you store it in S3 you have a lambda in the middle and you back it with the API gateway and create your own APIs with that and the final architecture is how we deploy our models so we need to save our models in S3 bucket for example now this model has to be either a place where we understand whether or not our models has improved or whether or not we have been able to create a proper environment for this model to be deployed in the first place so what we do is every time there is new data in our S3 bucket which is the annotated data which is coming from the first architecture so every time we have three level QA performed and the data is saved into S3 we have we again trigger a lambda and ansible based architecture and what that does is every time either there is a new data in S3 or there is new code pushed into our GitHub master so we have a separate GitHub repo where we push our data processing and training pipeline code and every time there is a new code pushed after obviously the relevant tests in the master branch there is a lambda which is triggered so now this lambda can be triggered by only two methods either new data or updated code and once that is done we start training the model using our GPUs on the AWS and what we have is in a certain place we have the runs for the last few weeks saved so we know what was our previous best so every time my new model and new data comes in I need to see it automatically whether I have improved from my earlier performance and if I have what I then essentially do is I remove the previous one and previous model from the docker image and re upload and rebuild my docker image so that is what we essentially do so all this is automated so no one essentially takes care of this aspect so no one looks or debugs into that all we know is when was this model run what was the precision what was the recall what was the f score and what was the accuracy and we typically monitor recall so if the recall is better the current recall is better than the previous recall then we deploy the new model and that is how this architecture runs in all these three architectures the one common underlying point for us is no one is monitoring it and that itself is kind of a big challenge but with this what we have been able to do is that the processing cost either machine learning inference or the data processing cost itself for us is extremely low so we can process a million documents at roughly 500 US dollars and that brings us as to a very low cost per chart kind of rate and of course all of these architectures are HIPAA compliant which means that I have created an architecture which processes lots of documents in a lot scalable fashion but also is not breaking the bank to put this in perspective would have processed a million documents with having servers 24-7 as well as proper sys admins and monitoring platforms then this one would have been roughly around 25,000 dollars and this I am talking about just for one month so if I am processing 1 million charts per month then with all the servers and all the cost that I have would have been roughly around 25,000 dollars but with these three architectures that I currently showed you which is pure serverless as well as requires very limited monitoring the cost comes down to 500 dollars which is lot less and lot effective when you are trying to create a scalable machine learning platform and of course there are their own challenges when it comes to creating your own serverless back and now there are two major questions that everyone will ask so what do you do if something fails do you know if something fails how do you monitor because one you are going to be launching everything in private VPCs which means that you do not necessarily know what failed unless until you log into that server and how do you monitor each step because in each of these architectures which I showed there are multiple moving parts so there is a launching of the architecture there is the pulling of data from S3 deploying the code and pulling the docker image from S3 and there are multiple such steps now how do you monitor each step now these are the two challenges that come with a lower cost but scalable architecture so what you have done is I think just in the purposes of time I think I just have couple of slides so what we have essentially done is we have decoupled our tasks so we are using SQSQs to decouple our tasks and to set up lambdas to see if these tasks are there any pending tasks that are there and re-initiate those tasks and of course there are dead letter queues which would re-initiate the processing after some tries and then finally we use cloud watch metrics to monitor our complete pipeline and we have automated these using Slack so every time some task fails or succeeds there is a alerts sent to Slack and emails to all the stakeholders and I think that's it thank you all unfortunately we have run out of time for questions but I am sure you can take it


Welcome to the ControlM for Azure video. In this video, you will learn how to set up a connection profile for the Azure application plugin, and create an Azure job to activate an Azure web service. Many users are moving towards using web services in a cloud environment. ControlM users need the ability to orchestrate workflows in a hybrid environment that includes multi-cloud integration. The ControlM for Azure application plugin enables you to integrate your workflows with Azure web services. There are two ways you can integrate your ControlM workflows with Azure. You can create a connection profile using the application plugin in ControlM version 19. Or you can use application integrator to create a connection profile and Azure job type to integrate with any Azure web service. In this video, we will use the ControlM for Azure plugin to create a connection profile and create an Azure job for logic apps. Note that before you start using ControlM for Azure, make sure you have done the following. Native app registration in the Azure portal, create an Active Directory user with permissions to invoke a function, logic app or batch, and define logic apps and functions with an HTTP trigger. First, we'll create and set up the connection profile. In the ControlM configuration manager or CCM, locate the relevant host, right-click ControlM for Azure and select Connection Profile Management. We'll click plus to add the connection profile and we'll call it Azure Central US Prod 1. Here we'll enter the connection information. If you don't have your subscription ID, you can retrieve it from the Azure portal from the subscription menu. If you are using a batch account, select the checkbox. Note that you can set up only one batch account per connection profile. If you don't have the batch account primary access key, you can retrieve it from the Azure portal. Use the location that's defined in the batch account properties. Now we'll click Next and then click Test to make sure that the connection is working. Everything looks good. Let's click Finish. Next, we'll create an Azure job and take a look at the job properties. In the Planning domain, we'll drag the Azure job type into a folder. In the job properties, in the What area, we'll select the connection profile that we created. In the Service field, select the service that you want to connect to. Note that the fields change according to the service that you select. As mentioned earlier, this job should connect to the Logic App service. In the Logic App Name field, select the Logic App that you want to activate. In the Request Body field, enter the information that you want to send to the web service. Click here to expand the dialog box. And last, if you want to add the log to the job's output, make sure this checkbox is selected. Let's order the job. Now we'll go to the Monitoring domain to view the job. The job completed successfully. Thank you for watching this video.


We are ready to start. Our next speaker is called Guillaume, so please welcome him. Hi, I'm here to present you a GTK RS. It won't be a technical speaker at all, so if you have technical questions, we can speak after the talk. So GTK RS, how to make an unsafe thing. So first, what is GTK? So it's a GNOME UI library, very used in the Linux environments. So cross-platform, it works as well on the Mac and as far as I know, it works as well on Windows. So a bit of history. At first it was started by Ben-Mary LeTang in 2015. When we were both of us still at school, we started it to learn REST. So first it was called LGTK, and we have sub-creates for each GNOME library like GAO, JLIB and stuff. It was all in the same repository at the opposite of currently. So the first implementation was very simple. It was one-to-one binding. So you had a function, an object, it was the same in REST. So not much advantages, but you could use a GTK in REST. So now the cons. So yeah, it was at the time very slow to compile. We were still in 2015. It wasn't that. We had a huge macro to generate all signals. It wasn't very, very efficient. So since it was bound by hand, a lot of typo, human errors were there, casting errors. Just like I said, it was just a wrapper around C code, just one-to-one, not much safety. And at the time the compiler was getting updated and having breaking changes like every two or three days. So changing the thousands of lines at once was quite long for a library as this big. So that's, I think it was at the start of 2016. We had a new contributor. We brought the gear support. So gear is a format which is used by the GNOME libraries to describe your API and is used by other languages to generate their own binding. And that's what we did in REST with a whole new create, gear, which generates all the code. So that's the first thing we did. We also rewrote all the glib, how to explain, the glib is the base and we had to rewrite it in order to make it work to build upon it. And so we did that. We could bring a whole new trait system. So now you can say if an object inherits from another. Very helpful. It prevents from casting from a type to another. And another thing, which I think it's still a bit of a debate, but we decided to split libraries into their own repository. So now glib isn't in GTK repository anymore. It's the same organization, but not the same repository, which has its issues for every reason. That's a debate. So the new trait system is basically based on this one, is R. So now when you have a function, for example, for the widget, you take is a widget. So every object which implements this trait can be used in this function. So now, why is it better to use GTK-RS over GTK directly? For a few things. So like it's written, let's start with compiler errors type conversions. So in C, you can totally do that. It's not a problem, not much checks. In rest, you will do it by using the upcast method. The big difference being, at this point, there isn't much. It's just in rest, we have checks done at compile time. So here, if you try to make an invalid cast, it will just take fault when you run it. So it's inconvenient to discover there is an error in your code after being compiled when distributed. And in rest, if you try the same, casting a type which isn't a children of a window. For example, a button is a children of a widget, but isn't a children of a window. If you try it, you won't compile. You will get an error. So the trait isn't implemented for a GTK button. It's quite convenient. So yeah, another advantage, of course, is the code readability. So in C, very verbose. In rest, a bit less. It's the advantage of object oriented languages. Not to say you can share. So some other gains. So there are quite a lot brought by rest directly. Automatic rafting and memory management brought by the rest compiler directly. The same can send trait bonds, which are used for signals, for example. So like that, your shell, your object won't be destroyed and called while after being destroyed. Makes sense. And we enforce when we generate the API that if you want a string or a pass, which is very convenient when you have to open a file or to specify a title, to be sure you won't try to do something strange at best. Like I said above, everything related to closure. So signals, callbacks, everything. So yeah, some other gains, of course. Now you can't have arrays which have invalid size. You can't give, we don't allow to give a size of an array when you give it to a function. It's done. An array is a five pointer. So you have it's a lens provided by the type directly. So no need to give the size anymore. Very convenient and allow to have a lot less errors. And of course the strong type system, which is one of the biggest advantages of REST. You can't make a cast however you want. Just what the function needs. Now at this point, what remains to be done? Well, I think we are around 90% of bindings automatically generated. And most of the missing functionalities, functions, objects are clearly in GIO. So I'm starting to write new things in it directly. We'll see how much time it takes, hopefully a few months, I don't know yet. We started recently at the last GNOME REST hackfest to improve the asynchronous support, which is very asked by a few people, so it's coming. And of course, from now, the documentation is generated at the same time as the API. So we directly have a C documentation, not REST one. So examples are in C, a lot of things aren't perfect. We have still a lot of work to do in there. It will be the next step, I think, once we are done with the bindings. So beyond the epic IRS. So we had a few people from the GNOME community bearing interesting interest. We started a few hackfest last year about this to write the GNOME class project, for example, where the previous talker is from GNOME and, yeah, Heidi. There is Federico, a big guy in GNOME, which is rewriting a library, live RSVG in REST directly. Yeah, I think that's because of him, we started, yeah, it was for this. And of course, yeah, we have other GNOME libraries, which start to have a binding, so just trimmer from, I don't know where he is, but yeah. We have a WebKit to GTK and SourceView and a lot more. As long as it has a gear file, basically, you can generate it automatically. I don't know how it goes for this trimmer. I think it's mostly wrote by hand. So now we have achieved a good level, I think, at this point. We don't miss much. We are on little details now, having deprecation, having more dogs, having a better interface, better roles. And at this point, how could we do to make it even better? And REM has been created for that. It's another abstraction level, so I will let its creators speak for it. So I'll give you some mic. So, as GNOME said, REM is an abstraction of our GTK RS, which provides a more idiomatic way to create desktop applications in REST, and it is based on GTK RS, and it also provides some support for asynchronous programming. So first I'll cover some pen points I had when working with GTK RS by developing a web browser. So the first problem I had is when you want to associate some data with a widget, let's say the model of your application. When you want to do that with GTK RS, because of the safety we had in REST, we need to use an RC RAF solve, so we have a RAF content value that we want to check the borough at runtime. So we need to use this borough plate code with borough mat and borough when we want to update the model in a signal, which is something we want to do somewhat frequently in GUI applications. So that's not very ergonomic. It's error prone because we only get the error at runtime instead of at compile time. So one thing I wanted to tell you is that if you can avoid using RAF solve, it's a good thing to avoid. And what I do in REST is that I use RAF solve, but I'm just not telling you. So also you can do asynchronous programming with JLIB and stuff, but it's not very ergonomic. And I wanted to integrate realm with the asynchronous IO library in REST, which is Tokyo. And also since REST does not provide inheritance, you cannot do, for instance, like in VALA, declare a new class deriving from an existing widget to be able to use this new widget like any other widgets. So that's not possible in REST. So I wanted to, with Realm, be able to declare new widgets that could be used the same way as the GTK widgets. So Realm is inspired by a language that is called M that is used for developing client-side applications. So M is an alternative to JavaScript. I found out it provides a good way to do model view controller. So that's my main inspiration for Realm. So in Realm you will declare a model, which is the data that you associate with a view, and you have an update function that would take the model in response to some event and return the new model. And you also have a view function that describes your view in a declarative way. In Realm, I use that, but I adapt it to REST. So, for instance, update and view are no matter of a widget and we use mutation when it's convenient. For instance, the update method will take some reference so that we can mutate the model instead of having to return a new model. So let's see how we can use Realm. First we need to declare a model, which is a normal type in REST, so it could be a struct. And then we use this widget attribute and an ample of widgets, which is the trait we want to implement. And for a window in this case, which will create a window. So we need, first, the model method, which declared the initial model of your widget. And then we have messages that are used to communicate, for instance, between widgets or having a message when there's a GTK event and it can also be used when there's a QNAS IO. So, for instance, you do a network request and when it's done, you receive a message. So we use the derived, well, the custom derived message and we have an enum, which has many variants that can have a value. And then we have the view. So it's still in the ample widget and we use the view macro and we now have the declarative syntax. So we can create GTK widgets and nest them and also set their properties. We can connect the click event, for instance, we will send the increment message in this case and we can also do bindings, meaning that at the last line we have the text property of the label that is bound to an attribute of the model. So that means that whenever this attribute of the model is changed, that will update the view. And then we have this update method. So it takes solved by mutable reference, which has access to the model and we can modify when we receive a message. So in this case, when we receive the decrement message we just change the counter attribute of the model and that will actually update the view even though it's not shown here. So how does all of that work? So the widget attribute will start by collecting the data binding. So it will analyze the view, check that in this case the label has a property that is called text that is bound to the counter attribute of the model. And then it will actually change the code you wrote in the update method to actually update the view. So it will see here that the counter attribute was changed and it will use this value to update the view because it noticed that there was a binding in the view. So even though I use attributes, RAM can work on stable routes because I use a hack to have the procedure on macro to work. And the future of RAM may be without features. Also I will work to improve the error messages because at the time I first started RAM it was using the old sync crate. So we didn't have access to the position of the token so that's why when you have an error message it's shown on the widget attribute which is not convenient and I will support more GDK feeders. So do you have any questions? Yes? Sorry. So the question is... I'll take this one. So the question is how does Rust check the length of arrays at compile time? It's basically an array in Rust is a slice. So in the type you have the pointer where it starts and you have its length in the same point. It's what we call a fight pointer. So when we give it to a function when we generate the code we just know the size of the slice. You can't cheat. When you create a slice you know its size. But it's constant. So when you pass it to a function obviously you know its size and we can give it to the GDK function. Other question? Yes? So the question is do I enter in JIO to use Tokyo for... I think that's it? To use futures. So I don't really know for instance with Anthony we talk a lot about how to do asynchronous stuff. And I think he will be the best one so this one actually. Yes, so in the Hackfest we had I implemented the code generator the stuff to generate the asynchronous method and for now it's just working with callbacks. So for now there's no support for futures but that may be added in the future. No pun intended. The question is for the gear generator for now. He asked if we intended to make it simpler because I didn't talk about that so I will go into details a bit. The gear generator first generates a low level API which isn't supposed to be used directly by the users and then from this it just writes the functions and all the types from the libraries and from this you can... we have another level which is used directly and it provides the API which calls the functions bound by the low level. That's clear. So at this point it's a bit complicated if you don't know how gear works even if you know it's a bit... So we interned in the few more weeks to make something better but it's more like when we have someone new starting a new library using GEAR we take what it says is missing so that's why we wrote this huge readme file and then we add new elements and maybe someday I will write a guide or something in order to avoid... to just allow more people to have their own libraries if they want.