Last time I was here, I sat at Matt's table and he invited me to come to Matt's Sue to, you know, to speak at a conference there. And it was a bizarre experience, I'll tell you.   How many of you have coded in, let's say, two of the languages on the, or how many of you have heard of seven languages in seven weeks first? So the languages are Ruby, IO, Prologue, Scala, Erlang, Clozer, and Haskell. How many of you have coded in at least two of those languages? Three, four, five, six, okay, five is the max. So nobody's made it all the way through the book yet. And it's really not fair because we have seven languages to get through in about 35 minutes. And it's really a 45 minute talk and the last time I gave the talk, really the only other time I gave the talk, I went about 15 minutes over. But we'll get about as far as we can. So this was the most interesting writing project that I've ever encountered just because of the breadth of the material. The goal of the project was to, was initially going to be to write the same difficult problem in seven different languages. And then after I got about, I don't know, a chapter or two into the book, I quickly decided that it was more important to show a problem that really worked in the language that I was trying to solve. So the problem became to take somebody to the point where they could solve a non-trivial problem in seven different languages. And my first, so the technical challenges just kept coming and they didn't quit coming until I finished the last chapter and then they came a little bit after that. It was just absolutely mind-boggling to get through learning that many languages and get to the point where I could actually teach something interesting in them. The first writing challenge came when I turned from page 34 to 35. And that took me from Ruby to IO. And I thought something is missing here and I looked at the transition and it looked okay. At least the words made a transition but it was hard to move the reader's head from one language to another one with the simple page term. And a brainstorm with my editor for a little bit about this and eventually we came up with the idea of associating each programming language to a character in the movies. And so along the way I want to do that not just with these seven languages but with other languages that were influences along the way. So we're going to go through the languages in the book in chronological order and then talk about the influences. The other languages that kind of impacted them or were going on at the same time. So we're going to start in 1972 in Prolog. So what movie is this? Rayman. Rayman, right. So I thought that this was a good analogy because Prolog seemed so alien to me. When I was writing a Prolog application I would sometimes think, how did it know that? And sometimes I would think, how doesn't it know that? And so Rayman was a great example. And so in 72 if you were writing something, a high performance application, you'd use this language. Shout them out as you know them. It's simply language, right? And just to give you the idea, this is C-3PO. He doesn't carry a weapon. He doesn't cut metal or anything. He just translates one line of whatever language is coming into whatever goes on the other side, right? So one level of English looking code to one level of machine code. So that's kind of what we're doing here. And if you're writing a business application, you'd be using COBOL. And I'm not sure quite which is older, Rockier COBOL. You know, I think they're both going to outlive me. More if you were using a scientific, writing a scientific application. Yeah, you'd be writing FORTRAM.  Back to Prolog. This was a fascinating language. This was the first language that really changed the way that I was thinking in the book. IO did a little bit, but since that was a prototype language, that's close enough to an object-oriented model that I could approach problems in the same way. And for Prolog, I had to change the way that I was thinking. This is a Hello World application. And the way to read it is that the thing on the left is true if there's a set of variables. Well, there's no variables here. They're all constants. But if there's a set of variables on the right-hand side to make that thing true. And the non-trivial problem that I decided to solve in that language was solving a pseudocube. And I picked that language because that was really the first non-trivial problem that I decided to write in Ruby. And I was really proud. It took me about two weeks. And I wound up with, I don't know, a couple hundred lines of code. And I'd built into it eight or nine solution techniques to reduce the problem before I started guessing. Now with Prolog, I didn't have to think about any techniques at all. I described the problem. This is what that looked like. So the first line says that an empty list is valid. And the second line is going to take a list of rows, columns, or squares. And it's going to say that is valid if for the first element all of those are different and the rest of the list is valid. So it's a recursive definition.  So I said these are 81 rows, rows and columns, or 81 elements. And then there's a board. And so I associate the board to a list of these things in the right order. And then I said everything in the board has to be a digit from one to nine. So you can see what I'm doing here. I'm describing the problem. These things are rows. These things are columns. And these things are squares. And all the rows, the list of rows has to be valid. The list of columns has to be valid. And the list of squares has to be valid. And you are done. And this is what the API looks like in use. And that's pretty cool. I mean, we have built a Sunaku solver in Prolog. And I can't count the number of times that I've had to do something that's constraint-based, you know, a logic problem in Java or a rules-based problem in Java where I could have reached for Prolog and had the solution in 20 minutes rather than, you know, taking three or four weeks or even a month to write some Java or some Ruby code. So Prolog was the first language in the book that changed the way that I thought. So, and this is the way the solution comes out. That's basically all I have to say about Prolog. The next language that we're going to talk about chronologically is Erlang. Yeah, this is Agent Smith of The Matrix. Any of you have written any Erlang? So what do you think of this syntax? How many people really, really like it? How many, okay, how many don't? So, I don't like it at all. I think that Erlang is a language with a lot of power but no soul. And that's why I picked Agent Smith at The Matrix. And I wanted to talk about some of the things that I was coding at the same time. And at the same time, here's the first language. What language is that? Basic, right? Sesame Street. I think that the Muppets are actually smarter than the perceived years, right? There are all these inside jokes. But then there's the close cousin of Basic. What's that? Visual Basic, right? Yeah, you guys get that.  In college, I was writing this language, Pascal, right? Pascal now, Haskell later, right? But I think that like for Scump, this is a wise language. It's not like super intelligent in terms of the features that are in it. But the omissions and the shape of the language really were very well done, I thought. So, it's a wise language. There's another one. Anybody know what that one is? That's small talk. And this is an interesting language because it was getting big at the same time that Joe Armstrong was designing Erlang. And he looked at that, I looked at that language and I saw something beautiful and I saw a way to organize things and think about the problem in a different way. Joe Armstrong looked at small talk and he saw something, he saw a mutable state and it scared him to death. And so he never went down that path. He intentionally stayed away from that path. Instead, he was writing in this language, Fortran, in this language Prolog. In fact, the original versions of the Erlang interpreter were written in Prolog. This was the primary influence. Back to Erlang, this is what a Hello World would look like. And the reason that this syntax is suddenly different than Prolog is that they basically had to make a departure from Prolog to make sure that this could handle the phone switch requirements. And those were that this system had to be live all the time. Now, when I think about scalability and reliability, the first things that come to my mind in language features are things that handcuff you. Things like strong static typing. They're going to scare everybody in this room to death because we're so used to things on the Ruby side. But that's not the way that Erlang approached the problem at all. Erlang approached the problem by a very effective virtual machine that knew how to monitor what was going on with other processes. So whenever a process dies, you are guaranteed to get notification from other processes or two other processes that you're registered to in the same virtual machine. So here's a trivial application that's unreliable. It's Russian roulette. If you get a three, it's going to basically kill the process and anything else is going to print the word click and keep going. So this is an unreliable process. And this is another process that might watch the first process. It returns a new roulette process. And if it gets an exit message, it's going to pass the new message to itself starting another roulette process. So it's like Russian roulette without the consequences. What's the point? So that's all I've got to say about Erlang. And now next chronologically and definitely the last language in the book in terms of the difficulty of actually grasping it is the Haskell language.  Here's a language that you guys are never going to get. I have to give you a clue. This was a commercial language that was all about lazy processing. So the clue here is lazy. The language is called Miranda. So when Miranda was created, a whole lot of offshoots of functional programming started to get built to address some of the holes in the thinking of the time. And academia was saying, wait a minute. We know that these ideas are important, but there's too much proliferation of the languages to actually control. So they formed a committee to actually build a language. And to my knowledge, this is the only language that has been effective language that has been created and built in the committee. I know you might say Java, but Java was really created in a small lab and the committees came later. This language was actually built, designed, and it's grown in the committee. Now some of the other things that were happening at the same time, well of course there was small talk, though this was very much a competing thought group, the object oriented languages. Of course Erlang was created. Now Erlang lets you do things to make these beautiful named value databases like CouchDB that we talked about in the last session. It's not a pure functional language. It's pretty close, but there are places where you can kind of step outside of the functional paradigm to do things like Erlang.display to display a string or actually store an element in a hash table. And of course C was a pretty big influence in the universities at the time. With Haskell you really don't have I.O. without shifting into an idea that's called Monads and I really didn't want to get into that concept with a talk this short because they're pretty conceptually difficult. What you really do is define functions that return values and there's no notion of anything like a side effect or a change in state. It's a very pure functional language. It's not a strict functional language and what that means is that you can declare a function that defines an infinite number of basically a sequence and the sequence might be an infinite sequence. This is what I'm talking about. So the first function there is an infinite sequence that represents part of a definition of a Fibonacci sequence. And that idea is that the next number of the sequence is the sum of the previous two numbers. So the colon on the right hand side is list composition. So I'm adding whatever x was, you know that's wrong. Fibonacci xy is y plus, oh no, it's x plus the lazy Fibonacci sequence with y and x plus y, right? So that's an infinite sequence with no bound on the front end or no bound on the back end and we're going to anchor it where the first two numbers are one and one but so I'm defining an infinite lazy sequence based on a lazy sequence with the second function and the third function, I essentially take the first, for the 500 Fibonacci digit, I take the first 500 and then I drop off the first 499 to have a list and I just take the head of that list, right? So these are two lazy sequences that are used to compute the value of a concrete sequence. Now the reason that this is interesting is that when you're using lazy sequences, you're not computing values until you absolutely need them. So they can be very efficient at times. But sometimes it makes programs in the ordering of things hard to reason about. Now the other thing about Haskell is the typing system. Now I have always thought, well my youngest daughter, when she was two years old, said something that to me seemed very wise. She said, I'm allergic to bears, right? I'm allergic to bears. And after I programmed in Java, I thought that I was allergic to strong static typing. I learned that I was allergic to bad strong static typing. Now when I look at Haskell's type system, it is absolutely beautiful and it has very little ceremony, a whole lot of polymorphism and really shapes the way that you think about and reason about your programs and it makes the Haskell compiler more than this artificial safety net. It's a real safety net that can, particularly if you're writing functions in very small increments, it can save you a lot of pain. This is just kind of a hint of the flavor of what some of it looks like. So the first line of code, I'm making a data element called a suit and that's spades or hearts or diamonds or clubs. And the next data element is a rank and that's the top five values for a deck of cards, tins through aces. And then I've got a type of card. This is a type which has a rank and a suit. And then I have a type deck which is a list of cards or a type hand which is also a list of cards. So that's the atomic sense, the very smallest piece of the data system. And then I have a method and that has a type definition and the method defined after that. Well, the type definition says, well, the shuffle method or the shuffle function takes a deck as a parameter and returns a deck. And the interesting thing about Haskell is you don't have functions with more than one parameter, though there's some syntactic sugar to make it look like that. Essentially, all the functions take one parameter and you can curry that out so that I might have an API that says, okay, deal me a hand. Well, you have to know the number of hands to deal and the size of the hand. Well, so you can imagine building a function that takes hands and size and plugging in only the size and that's going to leave you a function that still needs the number of hands to deal. So that's the idea of currying and partially applied functions and what Haskell is able to do is say, this type signature for deal is a function that takes an integer. It's going to return a function that takes an integer and that's going to return a hand. And when you do that, you get an incredibly sophisticated and rich type system that can enable you to solve a whole lot of types of problems, polymorphically, and you don't have a lot of type definitions, you have a lot of inference and so the typing definition doesn't get in your way. Okay, that's about as much as I'll say about any of the individual languages in terms of code examples. Let's shift gears a little bit. Who's this? Yeah, Edward Scissorhands. This is one of my favorite movie characters because he's this this beautiful yet grotesque monster that's the product of bridging two cultures. And if you think about it, that's exactly what's going on with the Scala language, right? I would submit that those cuts on his face are not from the scissors, they're really from the blogs from both sides of the obj. and versus functional debate. So these are some of the influences on Scala, some of the things that were going on at the same time. Of course, Haskell, if you ever talk about a functional language that was created after Haskell, it's a big influence. The typing models, the lazy processing, the way that they handle currying, a lot of things are just beautifully expressed in the Haskell language. What language is this? Java, of course, right? So when you're basing your model on your whole business model, your whole ecosystem on the virtual machine and you're object-oriented, that is necessarily going to shape the way that your language is built. So we're really merging two worlds, the functional world and the object-oriented world. And since Scala is built not only in the virtual machine, but also in the CLR, you have to consider Java's equal twin. What's that? C-sharp, of course, right? I have a demo. Okay, cheap shot. Here's another bridge language. This wasn't really an influence on Scala, but I thought it was interesting to include because it's a bridge language between the procedural and the object-oriented worlds. What's this? Anybody guess? Ada, who said that? That's awesome. So really, Ada, you know, it's Buzz Lightyear, he thinks he's object-oriented, thinks he can fly, he can't really. But get you close enough, right? So Ada really had the important idea of the encapsulation of data and behavior. So that was... So this is what Hello World in Scala looks like. And the way that you feel about Scala really depends on your perspective. Now if you come from where we have come from in this room, a place where we have this beautiful dynamic typing and we have a lot of flexibility and freedom, and you get plopped down into the Scala community, where you're going to feel like Edward Scissorhands laying on that waterbed with all these sharp scissors, right? It's going to kind of feel like too restrictive, too awkward, and too alien. But if you've come from the Java world and you've been coding that way, and suddenly you're handed things like closures and currying and a better concurrency model and ways to actually put the shappals on the languages and the places that it belongs, like around mutable state, you're going to feel really good about the language. And that's kind of the way that the Scala community has grown up now. Okay, I'm going to shift gears. Now we've moved up through 2003, 2004. I'm going to move up to around 2005. Actually, IO was created in 2002. But when Rails came out and 47 Signals came out, Rails came out and what was the application they built? 42 things? Does anybody remember 42 things? I think that's what it was. One of the highest rated things on that site for a long time was learn the IO programming language. And I think that that basically started a resurgence and kind of started the snowball rolling for IO and it's really since petered out, but I think that this is a small, beautiful language that has a lot to offer. It's really a prototype language that is very much a messaging language. So you have like an object, which is a prototype. It's not based on another class. It's based on cloning another instance. And you call messages on that. And that's essentially what the syntax in IO looks like. It's message or it's object and a message with its arguments and that's going to return object and you basically change those together and that's it. You also have another form which is a message or an object operator object and that's translated to this. And that's basically it. But since it's a prototype language and since Steve Ducorte, the designer, put no restrictions on how you could override which is something called a slot which is either data or behavior in a prototype language. It's really a tremendously flexible language. So you can actually go as far as doing something like this. This little innocuous piece of code does something like this. So if the string is nil, I want you to take the call sender which is whoever invoked this method, whoever called this message. So now we're whoever called us. You take one of those slots. It was nil. It's not supposed to be nil. I'm going to retroactively set that value to an empty string. That is like so right and so wrong I can't begin to describe it, right? So wait a minute. I'm taking the person that called me, the object that called me. I'm getting a nil value. I'm not supposed to have a nil value so I just kind of reach behind myself and fix it for you. I'm going to fix it for you. This says everything about I.O., right? I'm going to fix it for this application. But some of the other things that it got right, the concurrency and the performance of this thing should really be kind of slow and awkward because it really is based on a pretty limited object-oriented model. But he got the concurrency libraries right. So you're doing things like messaging which restricts the way that you can go from object to object. It's got an actor model which builds like a queue for concurrent access between the models. It has something called co-routines that will allow... We do mostly preemptive multi-processing. This allows cooperative multi-processing and immutability is built into the model much like it is in Scala. It's also got this very simple syntax to the point that I think that a pretty good analogy is the Lisp language where since everything is in the same format in Lisp you don't spend a lot of time learning the syntax. You do spend a lot of time learning the power behind the syntax. But there's also this idea that data is code and since I am manipulating messages in this very simple syntax it's very easy to do metaprogramming types of things. And since the syntax is small since the libraries are relatively new and small the footprint is absolutely tiny. So when Steve asked, when I asked Steve where have you found IO he said well it's not in production in too many places but then he said well then the places that it was in production were kind of mind-blowing like satellites and Pixar studios and some of their graphics processors and one of the big automotive manufacturers places where they really had to have a small footprint excellent concurrent performance and embedability and metaprogramming. So I really liked my time with IO. Okay. So the last language that we'll talk to you before we kind of wrap up with Ruby is closure. More in a second. That's what we already do. Enclosure I think is really it's Lisp on the JVM but it's actually a little bit less than that and a little bit more than that. I say it's a little bit less than that because there's some limitations in this Lisp that the scheme folks are really kind of railing about. Things like the lack of, you know, we have iteration, what do you have in functional programming? Recursion and what's the big optimization? Tail call recursion, right? So in closure they solve this problem by making tail recursion optimization very explicit and very wordy, right? But it adds some things that are incredibly powerful that the original Lisp dialects don't have. First there are a couple of syntactic tweaks that I put brackets in some places and I put braces in some places so you don't have this endless chain of parents and it's a little bit easier to read. Second I put some restrictions on when I can use macros and reader macros so that you don't have this proliferation of dialects. Third there are some excellent currency controls that have been invented in the last, especially in the last 10 years like software transactional memory and these ideas are built into the closer library very artfully and tastefully. So it's a powerful Lisp dialect on probably the most important deployment platform of our time. So the big influences are, of course, Java and Lisp. But you can't talk about just Lisp. You have to talk about, you know, the dialects of Lisp, right? There's common Lisp and Scheme well maybe there's more than a couple. Maybe there's more than a couple. That one's Microsoft, right? And the hello world looks exactly like you would expect and I don't really want to break down closure by syntax. I really want to talk about this marriage between the JVM and the beautiful language. You know, the JVM, the whole Java community is, it really needs a drink, right? It needs this, it needs an injection of fun, it needs an injection of intelligence in the language. I mean, they're still talking about how great closures are, right? You're welcome to, like, what, five or 10 years ago. But still, it's the best deployment environment in the world. The JVM is solid and it's robust. It has some limitations now.  But it's still, it's out there. Politically it's the best deployment option in the world. And, you know, until the very last part of the last Star Wars episode, Yoda was in exile, right? That's like the Lisp language. It's been in exile for years. And as soon as it starts to get a little bit of momentum, then we just see another splinter faction kind of splinter off and break that momentum down into, like, different dialects. But still, the ideas behind Lisp are powerful and compelling. And I think that, given this marriage, it really has a chance to work. And this has, you know, I'm not sure if I like the idea of everybody coding Lisp or not. But I think that we have, we stand a pretty good chance of seeing a successful marriage here. And that's all I have to say about Lisp for a little bit. So which brings us to Ruby. Yeah, this is Mary Poppins and everybody gets it, right? Ruby is about, like, the love and the passion. Like Mary Poppins was about the magic and the love and the passion. Hello World and Ruby. That says it all, doesn't it? I mean, who would do that? Who would do that? We would do that. We would totally do that. But when all of a sudden done, I just wrote a book called Seven Languages in Seven Weeks. And, you know, you can't help but kind of question what you're doing, right? You see all these cool things and all these cool languages. And at the end of the day, I thought, Ruby is still where I need to be. I don't want to talk a little bit about that. First from the perspective of the things that I really like about the language. So I remember when there was like this big community that was dealing with the Ruby community, and you know the one I mean. What's that? What language is that? Python, right, right, right. So, you know, there's one way to do everything. There's the right way, right? And Ruby kind of broke that down. Ruby kind of injected the Mary Poppins, right? The magic and the fun back into the programming community. And it was done with a little bit more venom than I would prefer, like when the rail stuff started out and, you know, the idea was to poke a finger in the eye of the Java establishment. But I still really appreciate the way that Ruby brought the passion back to programming. Can I hear a hand about that? Yeah. It was very good for my career. I probably would have moved on to a second career if I hadn't found Ruby. But still, there are some things that I saw in the other languages that I would like to have in Ruby. I'm starting to understand that there's a little bit too much of this language in Ruby. What's that? Pearl, right? So there's still not, sometimes there's not enough discipline. And it shows up in places that, you know, can cost me a good amount of time. And I think that there are some fundamental problems with the way that we code object-oriented applications. I'm almost ready to say that the object-oriented programming paradigm was a mistake. Not quite, but I'm almost ready to say that. I think that as the multi-core systems become more prolific, we will suffer. And we'll suffer because we're programming in a paradigm that doesn't handle concurrency very well. And so in Ruby, we have to be pretty careful about that. So there are some limitations. There are some things that I'd like to see added to Ruby, like better regards for mutable state, ways to turn to lockdown classes so you can't, so after a certain point, after the environments ramped up, I can lock things down and say, okay, no more touching these classes. We're immutable from this point. But I guess at the end of the day, something keeps me coming back to Ruby. And if we're able to do more and more in a scripting way and we're able to tie into these key-value databases that are written in languages like Erlang, maybe that's enough because after all, a spoonful of sugar does help the medicine go down, right? It's the expressiveness and the power of the language that lets us turn that program into our design document. And that's kind of the holy grail for software design. So that's about all I have to say. I'm only two minutes over. I guess I have a few minutes for questions. Yeah. So writing the book took me not quite a year and a half but kind of closing in on that. And yeah, I had to learn a lot of languages for the book. So I knew two of the languages pretty well. And so I knew Erlang pretty well and I knew Ruby pretty well. IO was pretty easy to pick up because it was a prototyping language. Everything else was really a struggle. The hardest one to learn was Haskell and in fact, I put that one off for nearly a month. I didn't even start it because I was afraid of it. And the Monads especially, so in Haskell and in a lot of functional languages, the easy things are hard and the hard things are really easy. So you spend a lot of time writing and teaching about things that object-oriented programmers don't think they have to care about. Like how to store something in a hash table. Well wait a minute, that's a side effect and that's a mutable state and that kind of blows up everything that you're doing. So you wind up writing a lot of things about the software transactional memory and the different ways to handle that in all the different languages. So that was demanding. So it was a hard book but the funnest book I've ever had to write. We did a poll of the readers at the Pragmatic Press and all of these languages made like the top 15. I really took the top nine and I cut Python because I only wanted one object-oriented language and I didn't want to spend my time like learning another object-oriented language well. I cut JavaScript because it's really too many different programming models at once and I thought that I had to add back a programming language and so it was between Lua and IO and I picked IO and I'm kind of glad I did. If I do another book Lua will probably be in there and Python will probably be in there too. But everything else was basically right down the list of the languages that the Prag leaders liked. Thank you.


Recent advancements in virtual reality, VR, technology have enabled the development of a perfect 3D virtual world, providing a cutting-edge social platform for humans. In addition to traditional visual, auditory and tactile senses, ALFACTION also plays a key role in influencing humans' physical and mental states. We propose a novel skin-interfaced ALFACTORY feedback system which utilizes wireless, programmable arrays of flexible and miniaturized ODA generators, OGs. The OGs are optimized for performance in terms of response rate, ODA concentration control, long-term operation, mechanical electrical stability and low power consumption. Demonstrations in 4D movies, smell messages, medical treatments, human emotion control and virtual reality augmented reality, VR AR, based online teaching showcase the potential of this new technology in various practical applications such as entertainment, education, human-machine interfaces and more. This article was authored by Yiming Liu, Chun Qiyu, Zhao Zhao and others. We are article.tv, links in the description below.


1.Visphatine was initially identified as an adipokine with insulin memetic properties and was found to be identical to two previously described molecules, pre-b-cell colony-enhancing factor, PBEF, and the enzyme nicotinamide phosphorybosyl transferase, NAMT. 2.Enhanced circulating visphatine NAMT levels have been reported in metabolic diseases such as obesity and type 2 diabetes, and correlate with markers of systemic inflammation. 3.Visphatine NAMT has been proposed as a clinical marker for cardiovascular diseases, including atherosclerosis and ethereal dysfunction and vascular damage, but further research is needed to understand its mechanisms and potential therapeutical target in these pathologic scenarios. This article was authored by Tanya Romachow, Carlos F. Sanchez-Furrer, and Concepcion Payro.


Are we recording yet? Yes, we are awesome. Thank you. I'd like to thank everyone who's joining us today. Welcome to today's CNCF webinar kubernetes storage in action I'm Jeffrey Sika a senior software engineer at Red Hat and a cloud native ambassador I'll be moderating today's webinar. We would like to welcome our presenter today Shang Yang software architect at Rancher Labs a Few housekeeping items before we get started during the webinar. You are not able to talk as an attendee There is a QA button at the bottom of your screen Please feel free to drop your questions in there and we'll get to as many as we can at the end If there are a couple poignant questions during the presentation Cheng said that we can Feel free to grab him and then try and answer them while it's relevant This is an official webinar of the CNCF and as such is subject to the CNCF code of conduct Please do not add anything to the chat or questions that would be in violation of that code of conduct Basically, please be respectful to all of your fellow participants and presenters The recording and slides will be posted later today on the CNCF webinar page We'll provide a link to that but it's cncf.io slash webinars With that, I'll hang it over to shang to kick off today's presentation shang Hi, so welcome everyone. So this is a shang yang and from Rancher Labs and today our topic is commodity storage in action so All right. So first a little bit about myself. I've been with Rancher Labs since 2015 and before that I also worked at the Intel for the KBM current development and At the Citrix and cloud comm for the cloud stack development So you can find me using a yasker at a github treat her at medium And also if necessary, you can send me email for any questions you have in a session To shang.io and rancher.com. So I will gladly answer them So with that Let's get started So the reason I the reason we are having this webinar is the concept of the Persistent storage in the Kubernetes is a little bit always a little bit confusing and from what I heard from the end users and the Many talk ahead in doing multiple coup cons There's people always asking about many Difference between the like PVPVC are the read white ones written many those kind of concepts in Kubernetes So that's one thing we want to talk about today is go through the persistent storage concept in the Kubernetes in one go and I will try to explain them as clear as possible and I'll make sure that you can you are going to get a concrete understanding of the Kubernetes storage concept after this webinar and the second part of this webinar is I'm going to show you How to use persistent storage in Kubernetes doing a live demo and for the live demo purpose We are going to use rancher and the long form which are two open source project and In the Kubernetes area and you are felt free to download them and try them by yourselves So the first thing I want to talk about is that Just the list of the the concept of persistent storage in the Kubernetes The most common one you might have heard about is persistent warning and persistent warning playing So in short, what the persistent warning is is a piece of storage can be used for the communities like many spots and the persistent warning claim is a request for the persistent warning in short PV and The first the one misconception one common misconception About persistent warning and persistent warning claim is you probably think like okay persistent warning is like a storage pool And persistent warning claim is going to cuff in the one part of it. In fact, that's not true So in Kubernetes persistent warning and persistent warning claim is always going to be one to one binding of Relationship so one persistent warning can only be used by the one persistent warning claim and the one persistent warning claim Of course, I'm going to be a bind by the one person one as well. I will explain more of that later So the next concept you're going to likely encounter is the storage class So the story class is essentially a connection of the persistent volumes and in when the storage class work with the provisioner and you can have a dynamically created persistent volume instead of static allocated persistent volume by the domains So where I will go into more detail on that later as well. So the last concept you're probably going to encounter is just simply called volume But in the for the volume inside the Kubernetes. In fact, it's just referred to the storage whatever storage used by the pod. So it's not necessarily persistent So if the volume is pointing to a persistent warning claim, then we will assume that this one is most likely to be persistent storage But if the volume is using something like host pass or empty directory and those are not really treated as persistent So here In fact, the persistent word of persistent storage in Kubernetes has evolved a bit since the incubation of Kubernetes So the one major event in this involvement is the storage class So before storage class was introduced in Kubernetes is I think it's introduced about in the 1.5, 1.6 around that time And before that, every time what's the real the model of persistent storage is that the storage domain have to allocate persistent volume first And then there will be a bunch of persistent warning claim trying to bound it into the persistent warning. For example Now we have create a multiple parts and the parts have a volume and the volume going to pointer to a persistent warning claim And in this case Kubernetes is going to try to match the persistent warning claim to any existing persistent volume through the parameter like the capacity like And the performance and using those parameter to find the PV that matched the requirement of PVC So once Kubernetes found the required PV, the PV match the requirement of PVC, they're going to bound them and you can see that PV status will become bounded And the PVC will start using pointing to that PV and then the pod can start using the PV as a part as a warning inside the pod So this model have a few issues. The first one is like Since the PVC only specify this like some spec like the size of the PV of the storage what you want the PV can be over satisfied like just say the spec of the PV can be better than the PVC wants For example, I am in ask a PVC for like one gigabyte of volume, but there's no existing free PV, which that was one gigabyte of free space. The smallest PV I have might be 100 gigabytes. So in this even in this case in this case, Kubernetes was still going to bind that 100 gigabytes PV into the PVC, which is resulting the waste of space Another issue with this model is that those PVs are static created by the storage at the main beforehand. So in order for this model to work while the storage at the main have to be involved and in the older process that's using the storage, the persistent storage And essentially the storage of the main have to predict that how many PV is and what's the PV size going to be used by the PVC, which is next to impossible. So this provide so this model provides very good like Permission and the request isolation, but it's not a really particular particular flexible when we will want to have a lot of part and the volumes with a lot of PV and the PV sees things for storage and the main need to be manually involved in every step of this allocation. So when, when, after Kubernetes realize that community realize this problem, they make they introduce the concept of storage class and the provisioner. So in the new model, the storage class with provisioner is basically operate as in the role of the storage and main, but the sorry, but you can download the work automatically. So in this case, we still have four pvcs and the four pvc had different requirements. And the part we're going to create as same as before the warning pointed to the PVC and the PV in this case PVC we are going to see, okay, is there is any existing PV can meet my requirements. If not, pvc we're going to talk with the storage class with the provisioner. And the provisioner we are going to provision new pvs to according to the spec requested by the PVC. So those new pvs we are going to match the spec of pvc 100%. For example, if you are going to ask for one gigabytes of the volume, the provisioner will provision you most likely the one gigabytes of volume as with the like say based on SSD and the provisioner will do that as well. So in this case, you are going to have a strictly matched spec between the PV and the pvc. And also you don't need to worry about get the storage main manually involved in the annual volume creation process. So, of course, after the PV was created automatically by the storage class and the provisioner, the pvc we're going to bound with the pv and the part can start use the warning again. Sorry. So another. So in this case, you can see that it was introduced of the storage class, the allocation of the warning and the persistent warning become more flexible. And you can, and also there's one thing about the storage class is, as you notice that mentioned, I mentioned here that storage class with be with the provisioner to automatically provision the new pvs. But also you can use storage class without the provisioner. So that's storage class will essentially become a connection of the PV. So in this case, if you specify the certain storage class, and if there are multiple pvs with that storage class, some pvc we're going to only bound into one of the pvs with the same storage class as the pvc specified. So that's also a way for you to allocate existing pvs into one group and make sure that pvc is going to grab some pvs on the band bound to them within the group. But most in the most common cases, the storage class is working with the provisioner to provide dynamic provision feature to the pvcs. So that's about pvpvc in a storage class and provisioner. The next concept we're going to talk about is read write once and the read write many. So those are the access mode of the pv can have in the Kubernetes. So the read write once means that the storage can only be read write on a single node at any given time. And the read write many means that you can read write on multiple nodes at the same time. So why it caused the difference? In fact, the difference is caused by how the storage was the internal functionality of the storage. So the read write once type storage is most likely the high performance block storage, like AWS, EBS, Azure Disk, Google Persistent Disk, Safari Media, and the long one. So the block device is, since the block device can only be attached in the one node, and also you cannot modify the block device contents without the device system knowing. So the block device is most likely only able to be read write at a single node, but in other cases, you can probably read using read many for the block device as well. Like you can mount this block device on the multiple node as long as you are not writing anything to it, you can you can still read from it. So the read write many type storage is most likely distributed file system. So like AWS, EFS, NFS, Glastafes, and StafFS. So the read write many means that type of storage is on the file system level so any change you down on the multiple node will be made aware to the file system, and the file system are going to have a protocol to deal with that. So then, so you are able to use the, this type of storage across the different node. So, but certainly on the on the contrary sometime you that is because that is involved in more locking and the file system level protocol, the performance of the distributed file system is probably not as good as the dedicated the block device. So, talking about the read write many type of access mode, we need to talk also think about how to use them. So, there's two common way of using persistent volume in the Kubernetes. One is using deployment, another one is using StafFS set. Of course, everybody is probably going to most familiar with this deployment and the deployment has a property that the port in the one deployment is going to share the same volume. And the deployment can be, as you know, the deployment can be spread across different parts. So, the storage for the deployment have to match the requirement that no matter which node the party is running, the storage must be accessible on that node. So the deployment is more suitable for the read write many type of storage. On the other hand, because some workload can scale really well horizontally. So we also have a concept of the StafFS set in the Kubernetes. So each port in the one StafFS set can have one volume. That is because we have a new concept here called wooden claim template. The wooden claim template is essentially automatically provisioned new PVs and with the PVC specification and they are going to use that newly created PVC for each part for each part in the StafFS set. So in this case, if you have workload can scale horizontally really well, you can have a StafFS set for that workload and using the high performance read write once type of storage like block device with your StafFS set and with your workload. All right, so we have, so I'm the maintainer on the Longhorn project and the Longhorn is CNCF, CNCF sandbox project and it's the distributed block storage software for Kubernetes and Longhorn is 100% open source. So Longhorn is in the catalog at read write once type of storage as I mentioned before, with the EBS and others. So what we what we what we do with Longhorn is we want it to provide easily provide persistent storage support to any Kubernetes cluster. So you can find more details about Longhorn at longhorn.io and I'm going to demonstrate how to use Longhorn and the rancher and the Kubernetes to you to operate on persistent storage later. Just a little bit update on the what's the latest status of Longhorn. So the latest release is 0.7 release. And the long week, as I said before Longhorn is enterprise grade distributed block storage software for Kubernetes. And we support warning snapshot inside cluster. And also you can backup and restore warning from outside cluster like S3 or NFS server. We also support the storage tag for the node and the disk selection. For example, if you have some data that doesn't require very fast access the fast band wise you're going you can have the label for for example SSD and NVME on one side and the label on for the spinning disk and other side so you can choose the different speed of your disk using the storage tag. Longhorn also support cross cluster disaster recovery volume was defined to RTO and RPO. So RTO here is a recovery time objective and RPO is a recovery point objective. So this is those two parameters defined that how soon and when how soon you can recover your volume in your backup cluster. And what's the point of data is going to be recovered in your backup cluster. Longhorn also support life upgrade of software without impacting the running volumes. And we have also have intuitive UI which is the one first thing many users like about Longhorn. And of course, Longhorn is right on top of Kubernetes and using Kubernetes controller pattern. So we support one click installation and it's very easy to install. I will demonstrate that later. So of course we have more feature coming and let's start the demo. Alright, so before demo, do we have any questions? None of popped up so far. Okay, good. Okay, so here what you see is the UI from Rancher. So everybody see the UI? Yep, you're looking good. Okay, so as you may know, the Rancher is the Kubernetes management platform is also 100% open source and the Rancher can manage multiple clusters, multiple Kubernetes cluster from different provider, no matter it's on premises or in a cloud. As you see here, this is the three of clusters is in the DigitalOcean and one cluster is in my node. So let's go dive into the demo. So when you click into the demo dashboard, when cluster dashboard, you're going to see the CPU memory usage and the pod stats. And you can see that this cluster is with the three nodes, which have the CPU and what's the version of the Kubernetes and the Docker on top of node. So the storage type here, you can see that we don't have any persistent storage, persistent volume or storage class created. So we are going to start by installing Longhorn to add persistent storage feature to this cluster. So to install Longhorn is very easy. Just go to the project and click app and click launch and find Longhorn in the Rancher catalog. And Longhorn, of course, is also available in storing from the YAML or from HelmChart. And in the back end, this is using HelmChart as well. So I don't need to change everything. I just click launch. Well, when we are installing Longhorn, let's go back to the dashboard for the demo cluster. And in fact, we can launch kubectl here. And it's where you can just run every command using kubectl. Nothing is on default. Yeah. So now the Longhorn is in storing in the Longhorn system namespace. And you can see the things that are running here. And of course, you can see the real time status of all the part in the workload here. So it is in storing right now. I haven't finished yet, I think. Let's see if I can access the UI yet. Oh, okay. In fact, the UI is ready now. So in the Longhorn dashboard, you can see what the current status, like how many volumes you have, what's the health of them and how many storage you are available for you to create new volumes and how many nodes it's here. On the node page, you can configure the, well, Longhorn are going to use the space on the disk to back up to back in the Longhorn volumes. And of course, we don't have any warning right now. And Longhorn also, as I mentioned before, Longhorn also support backing up to others and let me set the backup target first. So that is the setting to S3 and you can see that we already have some backup here. So that's diving to the person's warning and the start using it. I think I need to refresh this. Oh, yes. Okay. So the first thing I want to do is I want to start a WordPress application which using Helm chart and using Kubernetes, using Longhorn persistent warning. So this is a standard WordPress Helm chart. And you can select what the press versus the volume enabled and using Longhorn as storage class. And also, you know that WordPress Helm chart had two parts. One is WordPress itself. Another one is the database, MaraDB. So we want to use the storage class for MaraDB as well. So let's click launch here. And from here, we should able to see that's made to volumes created. So Longhorn is communicating with Kubernetes using the CLI interface and the volumes are being attached. And the same thing I'll see. And you can also see from the Longhorn UI that the warning is this warning is using by MaraDB. Another warning is using by the WordPress itself. And you can click to see the details. So, okay. So let's go and see how the persistent warning, let's see the persistent warning and the storage class. So in the storage tab now you can see that we have two persistent warning and the states will be bound. And the storage class, of course, when you install Longhorn, we are going to create a new storage class with dynamic provisioning feature and the you will see here in the storage class tab. You can also see that using the control and in short, because, yeah, in Rancher we type control so many times. So we normally just shorting to use a K. So you can just do K get a PV and you see two persistent warning is used, has been created and the you see this K get a storage class. Yeah, you can see the Longhorn is there. So we can take a look into deep about the PV is here and see what it has. So this PV has been associated with the. Let me see. Okay, this you can see that this PV is using the CSR driver and using the Longhorn, and we using file system as 64 SL default, and some other parameters provided by Longhorn. And also you can see that this PV contains the size of the warning we want, which is in fact determined by the PVC. This is 10 gigabytes. This PVC and also this PV contains the info to referring to the PVC is using the PV like this PV is using by the PVC name in the name WordPress in the namespace WordPress. So let's take a look at that PVC as well. So now we have the we have to see this week switch to the WordPress namespace and take a look at the PVC and the previously we see this volume. You see this volume name here, then in fact, this is the PV which associated with the this PVC name in WordPress, we can take more into we can look into that more. You can see this what this PVC was created with access mode rate wide ones, which is suitable for Longhorn. And also they ask a request as resource as a storage tanky and the storage class as Longhorn. So that's is how this PVC able to find Longhorn storage system and able to create a new PV to met its demands. And you can see the model mode is fast system, another warning mode available in the newer components release is a Roblox device. So the warning name will be the this PVC dash six EA something this is the PV name we mentioned before. So let's take a look at the storage class. So this is the storage class what how storage class looks like the most important parameter here is, you have to specify the provisioner if you want to do dynamic provision for the storage class. Another one is reclaimed policy, which means that what what will happen if the PV has been unbounded for the PVC. And if you oh sorry, the reclaimed policies what will happen if the PV was going to be removed is going to be deleted out. In this case, another one is recycled. And also this was split special annotation here so by default default the story class means that if you are creating a PV without specify the storage class, this one will be this this story class will be used as a default. So let's go back and take a look at the part is currently running. See some questions. Okay, so um, yeah, so I see some questions here so I can't wasn't sure if you wanted to answer them at the end because some of them weren't necessarily related to what you're talking about. Okay. All right. If you want, we can tackle a couple of them right now. Okay, so. Yeah, so first question I saw from rush is that is it possible to use longer in a deployment. It's possible for longhorn to use in the deployment but you will not, you're not able to scale beyond one node since it's read write ones, and longhorn cannot be run in the read write many mode. The next question is coming from Reno. So the question is what will be the default data location for longhorn or how can allocate space that longhorn can use. So the default data location will be at slash, while the rancher longhorn and we're changing that to slash longhorn slash while the longhorn. So, in order to allocate space for longhorn you can just mount a new have some block device on the node and the month it's more format it in easy for X or XFS and mounted on the some directory on the node and tell longhorn about it. So we can see the front here. In the longhorn UI. So you have the note here, and you can add in this node, and you can add a disk, which putting and putting a different pass here, and then you can have a different another disk using for powerful longhorn. So also we see that the default the past is why leave rancher longhorn at this release. So the next question is, well does longhorn provision the actual on the lane storage does this using EBS automatically deploying AWS. The answer is no we currently just depends on how the users. How the user, the disk has been mounted on the node on the node. So in order to use EBS you need to create EBS volume attached to the VM on the format on the mounted on the node then you just supply the past to the longhorn like that. But we are also considering automatic provision on new block devices if you see using some cloud provider solutions. So what's the difference between the PV get deleted and I'm not recycled. So the PV get deleted is basically means if I remember correctly is when the PVC is get deleted PV is going to get deleted along with it. And if the reclaim policy is recycled if the PVC was deleted, the PV will not get deleted automatically, you are going to be just there remain as unbounded, but it's the content was to be there and the next PVC can pick it up. In fact, it's not really 100% safe you do this way because you know that the data can be reused. So can compare longhorn with the staff. So the one of the motivation we develop a longhorn is because we kind of think self is too complicated. And we heard because our previous experience is like with cloud stack, which is my competitive open stack. So there are many, there are some user stories about how hard the service to how hard to operate and those. So the longhorn itself is more is much simpler. So we only use replicas to store the data we're not doing striping, and we try to keep the code as simple as possible and also, which also have the backup building backup mechanism, compared to the staff. And the staff itself is not really cloud native because staff was built before, of course, before the company was born. And of course, as you know that the project route is helping self to become kind of native, but that is to our understanding, of course, that will be another layer on top of self. So it's going to be introduced more factors to more complexity factors to to the operation. So where do you specify the warning mode at file system where deploying WordPress app, the fact the warning mode at file system is the kind of default setting for provisioners. So unless you, as you specify the warning mode to be the road block device they're going to buy default file system. And also, the warning, the warning mode is also determined in the, the request of the PVC, which is income, which is in the WordPress chart and WordPress chart already find it. Okay, so we're already using Rancher when kind of expect Longhorn to be product grade. So Longhorn to be, we are talking in Q2 this year for the Longhorn to reach GA. So that's, well, at the time we're going to support Longhorn and the way as claim is to be the production grade. And now Longhorn is still in the beta release. So can you elaborate how it works on the multi-class configuration and RPO-RTO limits? Well, that's a topic is probably too deep for this, for this webinar. So I can briefly talk briefly talk about that. So in the multi-class configuration is running as a master backup like setup. And we are going to constantly pull from the backup target with the backup store for the latest data that's shipping from the master cluster. So the backup cluster going to get the refresh, you can define the refresh area, how long you want. And the RPO-RTO limitation, the RPO limitation is depends on how often you are going to back up your volume in the master cluster. The RPO limitation is also determined by how fast you can transfer, activate the volume and put into the workload. I will say that RPO limitation will be pretty optimal and RPO will depends on your setup. Oh, sorry. I think I just running click. So, all right. So that's all the questions we have right now. Let's go back to the demo. Okay, so this one. Okay, so as you can see right now, the WordPress is up. And you can see this function. Well, everything seems working. And you can add new post. Okay, everything seems fine. So we can dive deep into how WordPress is using the part and you can click here. We can see the volume. One is, of course, Configure Map. Another one is Volume Claim Template called Data. And in fact, we probably see that better from the cool control. Let's do that. So as you can see right now, the WordPress namespace has two parts. We can see the MariaDB one. Okay, so you can see here. This one data volume is using the claim that data WordPress dash MariaDB dash one. So, but how it's got here. So that's because we have the WordPress is using Stateful Set for MariaDB. So as you can see here. So this Stateful Set, the first part you will see that it's just typical SPAC for the container, right? But one part is Stateful Set only feature is this Volume Claim Template. So the Volume Claim Template defines that what's the, how to create a new PVC automatically if I'm going to scale the database. We'll say that you're going to have those labeled and also the PVC that you're going to create it must be read by the ones and the resource must be AGB and the storage class name is Longhorn and the Volume Mode is file system. So this is specified in the Volume Claim Template inside a, inside the WordPress chart. So in fact, I can just scale up. I can scale up the database and you will see what's going to happen. In fact, I haven't tried this before. Yeah, hope it won't fail. Okay, so a new volume has been provisioned automatically. You can see the third one, and you're going to get attached. And it's going to be used by the new MariaDB part. Okay, so container started. And as you see, you can also see the log from the, from the wrench as well. I'm a little bit regretting. I'm not sure if you actually try this. Oh, okay. Now it's fine. Okay, so at the same time, yes, you can see their new warning has been created by for the MariaDB one in Longhorn because MariaDB is using Volume Claim Template to create new volumes. And also, in fact, for in the Longhorn UI, you can click into each warning and see what's the detail information about it. So here on the right side, you will see that you have three replicas running on different node and which pass you are using. And the two tip here shows exactly place that Longhorn stored your data. So since we're doing just 100% replication, so you can, as long as you have the data on this pass, for example, if you have node crash or managed cluster crash, as long as you have hard drive and still contains this data, it's still possible we can still recover from that crash and still get your data back. So that is the one of the failsafe mechanism designed by designing Longhorn. So on the left side, you can see that the volume current is attached and healthy. And you have attached a node to the Longhorn demo two. And this is the block device on the Longhorn demo two as exposed by the Longhorn system. So this is an exercise Longhorn take on a space since we're doing the same provisioning the exercise is only 200 megabytes and most of them, in fact, it's just the file system and engine and some other parameters. So down here, we have a snapshot screen and you can take a snapshot. And just remember that snapshot is made in within the cluster and also you can create a backup, and you can add a label to the backup if you want. And that is copying to the backup store right now. Okay, that's quick. So recurring snapshot and backup schedule. So we have a building mechanism for you to create backup and the snapshot on the schedule for like daily or weekly or monthly back upgrade so I'm going. Monthly backup. So that's why we want to ensure that your data always have to copy outside the cluster. So when you lost your whole cluster, you are not going to loss your whole data. So here just for testing purpose. I'm going to do a backup every minute and click save. And this should be kicking in about minutes. So let's go back to. Okay, so I can. Let me see if I have any questions. Okay, so Yeah, so I saw the questions about access mode and the use case for each of them. So the, basically, the things is if you want to use the base concept is if you have a workload that can scale horizontally, like, like a database. The database can scale horizontally and doing the chart. And when you have that kind of workload you better use the read write once block device with the state for set so you can easily have a different storage for different blocks or different storage for the different parts across a different node, but sorry. So but if you don't have that, but if you have the workload that's going to scale but they, they are planning to share the same storage they can have some something like internal locks, and they have multiple instance able to share the same storage, and then you can use read write of many type of storage. And in that case you can use deployment and read running many type of storage to scale your workload. And in that case that all this workload all this part we're going to share the same volume. So you can see that they can they can be some bottleneck on the performance, but if you workload I mean allow that there will be your way. So, there was one other question that was in the chat not actually in the q amp a. Yeah, do you want me to read that off to you. Sure. If a node needs maintenance and has to be upgraded and all the containers need to be migrated. Can you describe the process when you already have a bound PV that is local storage. This can happen with local storage and PM em backed volumes. If you have the if you have the workload and the if you're going to you if you have to know do you have to most likely you have to train it and there the part will be moved. Since, if you are using deployment or state for said they're going to be less than ideal replicas on that note, not on the whole scale so the part will be moved into other node and then but if you are using local storage in fact the local storage and need some clarification here if you mean by local storage is that storage is bound on that node. Like another project I have just local pass provisioner in that case that your storage is always found that by that node so you cannot really move that storage. So the other part we're not going to have the storage available to and we start off. So in that case you are going to last one replica. But if you have some system like long horn, you can that storage will be migrate into another node because that the long horn or some other storage system like set for going to have a replica on the old know all the nodes. So they can connect back to the their replicas or their data through a different node and then continue function from there. So that's all from my presentation. Let's go back to that's all for my demo. Let's go back to our presentation. I think I want another slide. So just one last thing mentioned about long horn. So the net in the next release there.a release we're going to have warning resizing topology support and life upgrade with you coming. So the warning resizing is a future many users has been requested. So now we support warning resizing from the Kubernetes 1.16 release. Since that is the first time the warning resizing become better data in the Kubernetes. The Kubernetes topology support in a previous node as a fill in domain is a new feature adding the Kubernetes to help deal with the the replication into different in the one region but in the different availability zone, like the case that if you are using EKS you are going to have a region wise control plan by default but you know it can fall into different AZs. And also the one thing about AWS is that your EBS warning is in fact bound to the AZ cannot be migrated across AZ. So if you have one region down, sorry one availability zone down this kind of cases, you are going to lost that data in that AZ. So what we add is on top of on top of the EBS, you can use Longhorn to provide a cross availability zone support using this new topology support we added in 0.a release. So after that we don't expect many major changes and we are targeting Q2 2020 for the Longhorn <IP_ADDRESS> GA release. And you can follow up the latest update at github.longhorn.com slash Longhorn Longhorn milestones, and also for the Longhorn related content of Longhorn related discussion, you're welcome to join the CNCF Longhorn channel or the RENJI user Longhorn channel. So we are migrating from the CNCF RENJI user channel to the CNCF channel since we have become the CNCF sandbox project. So that's all for my presentation. So any other questions. Yeah, if there are any other questions we do have time for a few more. You can just click the Q&A tab at the bottom of your screen. But if there are no other questions in the next like minute or so I think we'll wrap it up. All right. All right. Thanks, Sheng for a great presentation. Thanks for all the time we have for today. Thank you for joining us. This webinar recording and slides will be online later today. We are looking forward to seeing you at a future CNCF webinar and please have a great day. Thank you.


Bonjour tout le monde, we've had a productive couple of days in New York talking with leaders in government, philanthropy, culture and more about the issues that matter to Canada and to the world. Yesterday was at the UN where alongside Prime Minister Mia Motley of Barbados I co-chaired a conversation with the Sustainable Development Goals advocates. We talked about how we can amp up our efforts in a world where so much is going on. I also spoke at Global Citizen Now alongside Canada's ambassador for women, peace and security, Jacqueline O'Neill. We discussed gender equality, what Canada is doing to amplify women's voices around the world including in conflict zones and what we are doing to protect women's rights. This morning I spoke at the Council on Foreign Relations about how the Canada and the US can work together to strengthen liberal democracy at home and around the world, make sure that our decision-making reflects our values at every level and build economies that work for everyone. I spent two productive days here in New York talking with leaders in government, philanthropic, cultural and other issues about the important issues for Canada and the world. Yesterday I was at the UN where alongside Prime Minister Mia Motley of Barbados I co-chaired a conversation with the Sustainable Development Goals advocates. I also spoke at Global Citizen Now alongside Canada's ambassador for women, peace and security, Jacqueline O'Neill. We talked about gender equality, Canada's initiatives to amplify women's voices around the world, including in conflict zones and what we are doing to protect women's rights. This morning I spoke at the Council on Foreign Relations about how we can work together to strengthen liberal democracy at home and around the world, make sure that our decision-making reflects our values at every level and build economies that work for everyone.


This is an archived blog post from 2016 of someone that had gone missing soon after making it. His account was mysteriously deleted a week after they made the blog, and they haven't been seen since. This is his final blog, unedited. I'm pretty sure at least a few of you know about the Nicktoons Summer Splash event that took place from 2000 to 2001 on Nickelodeon. However, there has been something bothering me since I was a kid. A hijack had taken place around July of 2001, and I haven't seen many people talking about it online. I've asked my friends about it recently, and only a few of them said they knew what I was talking about. If I had to take a guess, the hijack had probably only been broadcasted in certain areas. I decided to call my father about it, as he was with me when the hijack happened. I was surprised I had remembered what happened, as I was about six when it happened. He said that he had recorded the entire event, and that the tape was in the attic of our old house. The only problem, was that my mother was still living there. The reason why it's a problem, was that my parents had gotten divorced when I was nine, and I had to live with my dad, while my sister stayed with my mom. I won't go into it too much as it isn't important to this. My father wasn't willing to do the 30 minutes drive there, so I had my friend Eric drive me there. To make a long story short, we got there, got the tape and left. But since nothing can ever be easy, the tape didn't even work. My only option left was to have my sister put the tape through a tape to DVD burner, or whatever it's called. After an hour, I got the disc, and was finally able to watch it. As I put the DVD in the DVD player, a feeling of dread and excitement went over me. Dread because I was a little nervous of what the disc held, and excited because I was able to experience it again. The disc started no problem as it showed a summer splash bumper. The bumper was of SpongeBob and Patrick sitting on SpongeBob's couch. It was normal until a few seconds in when they both stopped talking.  SpongeBob's mouth moved like he was talking, but all that came out was garbled noises and beeps. After a few seconds, Patrick began to become pixelated before disappearing. The screen then went completely pixelated as a droning sound played. A message quickly flashed on screen for a split second. After rewinding it, the message read, I'm sorry, but it had to be done. Unpausing the DVD, it then cut to a recording of a street at night. The date at the bottom read, May 12, 2001. The shot of the road stayed for at least a minute, with a car passing by every now and then. It then cut to a recording of a dark forest, as the person operating the camera walked through the forest not saying a word. They were holding a handheld radio playing the song Living in the Sunlight by Tiny Tim. After a while, they had reached an opening to a leak, with the reflection of the moonlight being visible on the water. I then noticed a disturbing detail, that being a blood trail leading to the leak. The guy then said in a quiet tone, She's in the water. Want to see. The man then approached the leak to reveal a woman's corpse floating in the water. The body didn't show signs of decay, so I imagined that she was killed not long before the recording. Then the multicolored lines and loud beep played, as Nick had gotten control of the network again. The stick with Nick technical difficulties screen then appeared before the disc ended. It took me a minute to piece everything together of what I had just seen. My conclusion was that a serial killer had hijacked Nick for whatever reason, and showed one of his victims. I then went to the library to do more research, as I didn't have a computer at the time. It turns out, a total of 30 people ranging from age 10 to 35, had gone missing from 1999 to now, 2016. The police were only able to find one person, and that was 21-year-old Elizabeth Jones. She was found in a leak at a local forest, just like the one from the recording. When I got back home, two cop cars were parked outside my house. I asked them what was going on, and they said that they got a call from a neighbor, that someone broke my front window and had gone inside. When we went in, nothing was stolen, except of course the DVD. I told them of what I watched, and the research I did. They said that case is still ongoing, but they're starting to lose hope to find the killer. They then asked me if I knew anyone that would try to rob me, and my only guess was the killer somehow tracked me down, and stolen the DVD. At the time I'm writing this, I'm on edge, as that lunatic possibly knows where I live. I'm just afraid he'll try to kill me next, but I just hope he doesn't try to.


QuickBooks Online. Print, email, and create PDF of reports. Get ready to start moving on up with QuickBooks Online. We're going to be using the free QuickBooks Online test drive searching in our Online Search Engine 4. QuickBooks Online test drive selecting the option that has Intuit.com in the URL, Intuit being the owner of QuickBooks. We're going to be picking the United States version of the software and verifying that we're not a robot. Support accounting instruction by clicking the link below, giving you a free month membership to all of the content on our website, broken out by category, further broken out by course, each course then organized in a logical, reasonable fashion, making it much more easy to find what you need than can be done on a YouTube page. We also include added resources such as Excel practice problems, PDF files, and more like QuickBooks backup files when applicable. So once again, click the link below for a free month membership to our website and all the content on it. Zooming in a bit by holding down control up on the scroll wheel currently at 125% on the zoom and noting in the cog dropdown. We're currently in the accountant view as opposed to the business view. We'll try to toggle back and forth between the two views so you can see where stuff is located in each of them. We're going to be duplicating some tabs by right-clicking on the tab up top to duplicate it and then right-click on the duplicated tab to duplicate it again as the tab to the right thinks we're going to go to the tab in the middle and down to the reports on the left this time, opening up the balance sheet report as that's thinking back to the tab to the right, opening up the reports on the tab to the left and open the profit and loss to P to the L the income statement. Then I'm going to close the hamburger otherwise no one has the hand boogie range change up top from a 101 222 tab 1231 222 tab, run it to refresh it back to the tab to the middle to do the same thing on the closing of the hand boogie ranges to changes. A 101 222 tab 1231 222 tab run it because we want to refresh it. That's how you do it. So this is the balance sheet. We've been focusing in on our reports on the balance sheet reports. And now we're thinking about how we can present those balance sheet reports to a client possibly at the end of the month quarter or a year. We talked about a few different options in that we're going to have multiple reports. First thing we want to understand we could have multiple reports. So just with the balance sheet reports that we can we can make like almost an infinite number of balance sheet reports when we have these comparative reports, vertical analysis, horizontal analysis, comparing this year to last year and so on. So when we provide them to the client, we want to do so in such a way that it's professional looking because that's going to be half our job really is to make it look nice, provide confidence with the fact that it's a nice clean looking report. So one way we could do that is to create the reports and then possibly memorize or customization or save the customization of the reports. So that if I go into my reports center on the left tab reports into the customized reports, I can have my list of reports. Then we can basically organize them. And then the question is how are we going to organize them? We could use the managed reports that we saw in a prior presentation to give a little bit of a professional feel and use that for our customization. We might just print out the reports one by one, for example, and then email them to our clients with an email. But oftentimes that means we're going to be sending them one at a time. And if we're sending a bundle of reports, that's probably not the best way to do it. We could save all the reports on a cloud drive. But if we do that, the reports could be a little bit out of order. So we might want to number the reports to give some indication on how they might want to be opened in order. So we could do that. We could zip the file so that we provide it to a client as a zipped file to an attached email, for example, which would be better than an email with 10 attachments. Or we can use the Qt PDF printer or AQ PDF printer and Excel to try to get all of the reports on one PDF file. So that's another way we could do that. We could do that with Excel and we can do that with the manager over here. So we'll use the Excel option in a following presentation to show that. And we can get more detail than that if we want to make more formalized reports kind of combining Excel and Word to create, you know, a formalized report structure. So we won't get into that in a lot of detail. So first, let's just organize our reports and save them as a PDF and then zip them. And then we'll talk about Excel in a following presentation. So I'm going to recreate a couple balance sheet reports. So I'm going to right-click on this one again and duplicate it and then go back down to the reports on the left-hand side. And let's make a summary balance sheet again. I'm going to go to the standard reports and I'm going to close the hamburger and then scroll down. I'm looking for the summary balance sheet. So this oftentimes might be the first report we provide to somebody. So I might try to save that and customize it. Standard customization. Let's make this as of 12-31-2-2. Run it and then customize it. And I'm going to say that this is going to be, let's remove the pennies, brackets, numbers, make it red. I'm doing this fairly quickly because we've seen this in the past. This is our standard kind of external report customization for the purposes of the course. On the header and footer, I'm going to call this a summary balance sheet. I'll put summary up front. Summary balance sheet. And then close this out and then get rid of the date, time, report, basis. And that looks good.  I'm going to create a new group to put it in, adding a group.  Reports and add the group and then make sure that that's in the dropdown, saving it. So now we've got our balance sheet. I'm going to close this out, go to the first tab, refresh the tab and then scroll on down to the reports in the customized area. And there's our balance sheet report. Notice you might also want to number it. So if I was to save customization, we might then want to actually let me go back here and open up the reports. Summarize or let's edit it here. Edit the report. I'm going to put a number one in front of it so that it'll be in order instead of alphabetical order. So I'll save that. So there we have it. It's saved and boom. So there it is. So let's go back to the second tab. Let's make a comparative balance sheet. Let's make a quarter by quarter breakout drop down quarters. I'm going to run it. I'll do my editing up top or customizing and let's say bracketed numbers, red, remove the pennies and then on the header and footer. I'm going to make this a balance sheet. Let's say by quarter by quarter and then remove the date time report basis again and run it. So there it is. Let's customize it. Save customization. I'm going to put it into my month end reports and then I'm going to call it number two balance sheet by quarter and I'll save that one. And now I'm going to change it again, making a comparative balance sheet. So I'm going to select the drop down back to the totals only and then let's just do a month by month comparison. So I'll say 120122 to 123122 and then I'm going to select the drop down here and compare it to the prior period, November. I'm going to show the dollar change and percent change and then run it. So there's that and I already have the nice formatting here on the numbers and whatnot. Let's save that one. So actually I should change the name. So this should be this should be a comparative balance sheet. Let's say comparative comparative balance sheet month month by month or current and prior month or something current and prior month. And so I could say, OK, let's go ahead and run it and then I'll customize it. And so this is going to be actually I'm going to close this out for a second and I'll save the name. So I'm going to say copy that because it's going to try to save it as the other. So I'm going to say save customization. I'm going to say this is number three. And hopefully that will not overwrite the the prior one we saved, but rather make a new one. I'll save it. I'll double check it, tab to the left, run or refresh the screen and just check this out. So now we've got three over here. That looks good. And maybe I'll make one more. And let's say we're going to say let's say last quarter or let's say last quarter to last quarter or year by year. So from this is going to be from 010122. Actually, I'm on this tab. This is going to be from 010122 to 123122. Run it and maybe compare it to the prior year, which there's nothing in, but we'll just do that one. And then I'll say current. I'll call this a comparative balance sheet. Current and prior year. Prior year. And then I'm going to copy that. And I'm going to save it, save customization. And then I'll change the name up top to boom. This is going to be number four. And there it is. So we'll save that. So there we have it. So now when we're going to be organizing these at the end of the month, I can go into my reports. I can run it again. I can go into my customized reports. And possibly I can have someone else do this because it should be a pretty standardized process, meaning I can give it to a staff member or something and just say I would like to print these reports, change the date range to whatever the relevant date range is, save it as a PDF or print it as a bundle. So let's look at those options. I'm going to go into the summary report. Actually, let's do it this way. I'll go back and I'm going to right click and open it in a new tab. So let me do that right click. And I'm going to say open in a new tab. It's not giving me that option. That's weird. The other reports usually do anyways, I'll click on it. And then we can just change the name up top or the dates and the name should be should be good. So then our options are to email it, but then you typically have to send one at a time. We can print it, which would be useful if you're going to be handing it to somebody. But sometimes that's not the case. Oftentimes we're going to have to email it or put it on a cloud drive, which means we want to export it to a PDF generally. And we'll talk about exporting to Excel later, which could be a nice option for us to then use Excel to create all the reports on one PDF file. So I'm going to export to a PDF. This is the format that it looks like. So most of the time we're good on the default formatting. Notice you have a couple options to the right portrait landscape. Smart page fits helps it to fit on one page, meaning we don't want two pages wide typically. And then repeat the page header. Here's the header up top. If you have two pages and you don't want the header on there, you can remove the repeat page header. So those are some nice options here, but it's still quite limited. If you get to a longer reports that are quite wide in nature and you're to force it to fit on one page wide, for example, then it can change the size of the font, which will be different than the other size of the fonts or the other reports. And so in those cases, sometimes it's useful to export it to Excel where you have further formatting options there. And once again here, we can email. We could save as a PDF. We can print it. I'm going to go ahead and save it as a PDF. So there it is. I'm going to pull this to the right and then grab my folder. So I've got a folder here that's going to say QuickBooks Online. In practice, you might call it your client folder. I'm going to call it a test drive because this is that's what I'm naming the first half of the course where you might put it as clients. For example, you might have another folder that would be broken out by date, which would be quite common, maybe by year, for example, and then have your reports in there each year. And then I'm going to go into my reports and I'm just going to drag this one into my reports. There it is. So notice it gives us the name with no spaces. So that's usually pretty good. It didn't put the number one on it. So I'm going to try to number my reports in here because when I send them out, I would like to give an idea of which reports I think the client should open first. Okay, let's do it again.  I'm going to close this out. I'm going to try to go back to my reports. So that gets us back into my custom reports here. And then I'll do the same thing for the second one, the balance sheet. And there it is.  I'm going to go ahead and export this to a PDF. Boom. It looks like it's fitting on one page because it's got the smart fit. So I'll go ahead and notice there's the title repeating. So if you didn't want the title to repeat, you can take that one off and that'll not have the title repeating. So either way, you might like either format. But I'm going to go ahead and save it as a PDF. It's going to open up down here because I'm in Google Chrome. Note that if you're in another browser, Firefox or Explorer or whatever, it's going to show up however the forms show up in those browsers, possibly with an arrow up top in Firefox, for example, or something. Right click.  And then I'll go back on over. We'll do it two more times. Dose Vases Moss. And then we're going to say number three, open that up. And let's go ahead and export that to a PDF. And it fits on one page because we got the smart fit. So that looks good. Mui B to the end.  I'm going to right click, rename it. Rename number three. Oh, wait a second. So I'm going to don't name that way. Do it again. Don't delete it. Just put a three in front of it. That's what I'm trying to do. You know what I was trying to do. You just made it messed it up on purpose. So I'm going to go back on over and say this is number four. Last one. And let's go ahead and download the PDF. Save it as. And we're going to go ahead and pull that one over. The final. It's the final countdown. Number number four. I don't know why I have that song in my head. I think I heard that song. There's a final countdown song. So there they are. So now once you have them here, you can add these one by one to an email attachment, but four and four connect four attachments isn't too bad, but we're going to be adding other reports to this as well, such as income statement reports. So it would probably be better if you can give it to them possibly in a cloud drive format like a Google drive or or a soft one drive or whatever or our drop box, right? Or you can zip it and give it in an attachment in an email, which I think would be a little bit nicer, which I can do by adding another folder.  And let's say these are as of 12.31.22. And then I'll put these reports in it, grabbing them, dragging them in to the folder and then I can right click on the folder and I can zip it. I can say zip it. Just like I told my my dog when it was barking, zip it, compress what says compress now, compress it. So there it is. So you might not have the same compression. You might have like a folder with a zipper on it or something like that. But the point is that you can now attached this file directly to an email. So instead of having multiple attachments that they would have to open one by one, you've got the one file. And I think it's kind of nice if you're going to give it in this in this way in this format to then have the numbers as well, meaning now you've got the numbered files so they can open it and you have some indication on how they should, you know, what order they should open them. Okay. So that's those are the formats we can provide the files. Remember your other options. If I go back here and I go to my reports are to create your management reports, which can help you to combine it in one file and give you some some like a lead sheet or a header page. So we looked at that in a prior presentation, although it's somewhat limited still, but that's one way you can get everything into one PDF, for example, and make it look a little bit more professional. We can also use as we'll see in a future presentation Excel to export these to Excel and then use Excel to get all the reports on one PDF file. And if you really want to do the best job that has the most flexibility, then you can use some format of Excel and possibly word or possibly try to do the wording in Excel too, which can be a little bit tricky in order to create, you know, a lead page, a header page and whatnot, multiple contents in that format. That's the most time consuming format that you can basically use. So next time we'll talk about how to export to Excel, how to use Excel and a PDF printer to basically get all these documents that we've got here onto one PDF file formatted a little bit differently, but also allowing you to have the formatting of Excel over and above what you might be able to do within QuickBooks. So just a quick look at the cog and the business view. We've really just been spending our time in the reports which under the business view is under the business overview and then the reports.