Okay, welcome back guys. So now for the next talk we have Damian Sugi He is CTO of Exocat and Exocat Hold on, where is it? Oh, yeah. So Exocat is a company that specializes in PHP code quality for code quality solutions for the industry and he also leads a development of the Exocat static analysis engine It's something that automatically reviews your code For version compatibility security and clear code. So today, he'll be talking about teaching PHP new tricks of machine learning I'll let Damian take the stage. Please give him a warm welcome So welcome everyone. I think after two days three days for the most courageous of you of learning PHP you are going to be very interested to have the only session That will tell you that PHP can do on top of what is doing on instead of you do which is We're going to teach PHP to do things and not code on our own But let PHP understand the problem and solve it for us. How good is that? Awesome. Yeah, wow. And the rest over there is sleeping. Be aware that I will be asking question during the talk So be ready to answer them Yeah, I'm threatening you anyway, so We're going to see how to teach new tricks to PHP without Relying on Dave a who's already reasons master but we're going just to give it the information and PHP will solve the problem on his home and That will also be applied to a very specific problem that we have in PHP as in any other language Which is code in commons So we're going to solve the problem of scouting commons, you know Like everyone is coding and then at some point you decide that you don't want this kind of code or you want to debug it Well, then you're going to leave it in a comment And then it's going to get committed go to production and raise some bugs not exactly But we're going to try to chase them down and remove them from a large code base, which is PHP my enemy So as mentioned, I'm I'm sitting at exact We're not doing machine learning on a regular basis But we're introducing that to refine the results any time we have static analysis at some point The machine do not is not able to go further when we look for Objective issues in the code and we use machine learning to reduce the number of false positives in our research So what is machine learning and I will start with the first question who among you is a parent? Kids one kids two three Don't be shy. It's okay. It's I have them. I have some of them too, right? So very little Not the same kids I guess So machine learning towards machine is for computer. We're going that will be basically PHP here So we're going to have PHP learn some something instead of us learning What is Laravel or what is web security? We're just going to end the task to PHP and that's exactly the way it works And if you think about it the way we work with PHP is very imperative. It's a dog Oh, okay. It's an elephant. It's a dog. We say sit roll and sit again fetch That's we give orders and PHP is just there to listen to the orders. Take the command do it If it's too big, which people do it anyway if it's not Well, it will also do it. But then you know, it's a smart comment, right? So now we're going to change that and be more in the idea of in the print the approach of Teaching a kid. Okay. We're going to show him what to do And it's going to repeat that until we as the teacher are going to be satisfied It's more like a you know, Shafoo kind of stuff of learning So we'll have two different phases The first one will be the training and the second one will be the application So the usage in the ring world without our our supervision What can we do with machine learning? I'm sure you have examples Alpha go the pretty the recent contest of playing go that was mastered and I like the the best The best player of go in the world has been defeated like four to one something like earlier in the In the year that was made only on machine learning with exactly the same principle Although a little bit modest then the one I'm going to show you What can we do? Otherwise OCR optical character recognition That's that's a very difficult task very complex and it means a lot of training and then when you have Running when you have it running you want it to be fast and recognize the character for quickly. So that's a good one Medical diagnostic. So once you realize that your doctor is going to be replaced by a robot That's machine learning probably not with PHP, but anyway If you've seen also robot walking That's a lot of machine learning Just like kids, you know, they learn they learn they see and then at some point it works But this is nice Although it's not going to be very applicable I'm not going to show you how to beat, you know, world master of go using PHP But what can we do in terms of application? What is very interesting in this supervised learning system is that we have a first phase where as developer We're going to work on the content make sure the machine understand and develop the right model Learned correctly and when it's done, we're going to push this model Which is a very tiny file of configuration in production where it will be applied to web Okay, and in terms of web, it's going to be able to answer pretty fast and sometimes saving us lots of complex Calculation through the database Through just pure calculations. So that's where it's a it's Andy for PHP You already used spam, you know spam filters not in PHP, but that's the the same idea or That would be a recommendation systems Think about it like e-commerce. You have people who have They're selected five six items and you want from those five or six item to recommend a seventh So that they will you know add that to their own code. That's machine learning at its best And we're going to do to do that in a very specific problem. That's plaguing us as I said coding comments So what is the difficulty of well the situation with coding comments is that as I said Everyone will add some comments maybe hide some code for debugging purpose for reserve for future use things like that and It will just forget forget it Now if you have a small project like it's the trend nowadays Then probably you'll you'll be able to review five twenty thirty files and just clean all those comments Now if you're called PHP my admin and you have like 800 files and a million line of code and History called code from one year for ten years. You don't want to do that. Well, we're going to try to do that There's um about fourteen thousand comments. How many of us today? We're like 60 in the room. How long do you think we would take for us to read all those comments and clean them? Yeah, I'm waiting for an answer. That's right Yeah, at least an hour, right Maybe we can do that faster than that So this is a classic problem. It's very good for machine learning because it's it's a complex problem. Okay Extracting the eigenvector of an imaginary matrix. That's going to be a piece of cake for PHP, right? Everyone knows that on the other hand reading comments and understanding if the code is partial or not if it's PHP code or Python code or maybe broken codes That's very difficult. We usually require our own intelligence to do that and to be able to sort the comments and so That's a complex problem, which has a large number of good reasons to To conclude so peer machine learning is going to be very good for that We also have a lot of expertise available. I'm sure you're all expert in comments Which is the moment you say yes? You've all been writing comments, right? Yeah, so you know you can put lots of things in it drawings codes insults Sadly enough. It's too often So here is the synopsis for today As you can see there are two branches. The first one is going to be the training We start with data history data. We start with our own experience. We start with this data We do the training and then we'll end up the end of the first phase with the model and the model can be stored Okay, so we stop at that point second part will take in PHP my admin all its comments Put the pattern push them through in the model and have our actual results simple enough Good, so we start with that the first element. We need is an engine Okay, we need something that is inside PHP that will that will actually process the incoming data and Produce the model and that's the fan extension If I remember correctly fast artificial neural network and That has been a code that has been around this library That's library that has been around for at least two decades You're going to see that later. That's that shows there's a lot of history Behavior that's are funny to find but it's also been available to PHP since PHP for I think it's working on PHP 7 Thanks to Yakub the Zelenka who's been very kind to push that very fast Although apparently there's not too many people using the extension but it works. So that's a side Compilation don't need we speak old install it and it runs very simple And it's going to bring to bring us the neural networks to PHP Who's been using their neural networks? one two Only two well three continue me I guess Okay, so let me try again who's been using his brain? Okay, I'm Good half of them. I have no brain. So neural network is is an it's a system to To implement the learning that's based on the actual biology Okay, it's based on the number of the neuron We have you can count especially for the youngest of us about a hundred billion neurons Although no one has ever really counted them, but that's basically what you're made of a good 20% of them are used for just transmitting information. Okay, someone hurts you on the field on your fruit There are a number of neurons that bring everything to your brain. So you can count like 80,000 80 billion Neurons that are available to collect everything your history or memories your reactions and handling all your organ internals Function so that's that's one part. How does that work? There is a there is the first visit this Tree like structure, which are called the dendrites which are collecting the information Every single little point is another is a connection to another Neuron or to a sensor like the for touching for the eyes or things like that It will get the inputs the electrical input that will be sent to the center the arts of the neuron will actually Collect all those information together and at some point you will decide that it has to trigger something and that that at that point That's the threshold. It would release electricity that will go down the axon much further up to like to matter I and send that to something else So your brain decides something and you raise your foot. That's the way it works Now you also have to consider that as I said 15,000 dendrites for one neuron If you think about it pitch be my that's that's a 15,000 condition if then Yeah, and I'll now again to compare that with pitch be my admin. There are seven thousand conditions in pitch be my admin So one neuron could fit actually to pitch be my admin And I made a slight calculation, but I think one neuron would probably have as many Conditions that on my old carrier. I've ever written 15,000 you'd imagine how many of them how many of that that represents That's a huge and you have 80 billions of them that are interconnected Hopefully we're going to make that fit with speech be anyway. We start with that usually neural networks in their Computer counterparts works with three layers. There is one layer, which is the input and we're going to work On that on the moment There is in between all those layers that are just for internal calculation for which we will not exactly know what happens But the training will set everything inside. We just decide how many layers we want so the blue lines and how many Neurons that will be there. Okay, and finally we have one output here We will just decide if it's a comment. It is if it's the comment is code or not So just brute true or false that could be a spatial position. Okay, that could be XYZ and you have Coordinate so you can have actually out complex output categorization things like that Okay I've been talking a lot. So let's take a look at actual code Given fun given the structure of a neural network. Here is the first part of your code, right? You can see there is fun create standards This is really funny because fun extension has a really long names So that's always horrible, but we give it all the information I mentioned number of layer number of input neural or output and the hidden ones We just give that and then fun is going to take care of the rest The other things that I just mentioned it's from the dark and that's going going to make your code full But this is the threshold application the threshold function as I mentioned the art of the neuron will filter part of the incoming electrical input and this is what is Most used sigmoid symmetric. I won't dwell into the into that Now we have the engine now. We have our very little brain We need our first data, right? So let's start with that. We're going to start from PHP That's going to be our our source and that are usually how it happens, right? We're not going to get the comments out of the blue from PHP Miami They have no idea what's in there and that we're going to do this Analysis tonight. So we start from the code the first thing we do the extraction with which is looking into this You know unstructured data and extracting the information that is interesting for us Anyone knows how to remove or extract data comments from PHP? code You've raised your hand too many times Okay, um, basically we use the tokenizer to turn the code into tokens There are three tokens that all store comments single line multi line and PHP docs Okay, so that's the part of the process that completely objective Okay, we're going to give the code to PHP PHP breaks down in token We filter the one that are commons the rest out. We don't need that and we keep them Okay, simple now second part We have this raw data, but we can refine that we're not going to train our our neural network on everything because there are a number of things We already know for sure are not going to be useful, right? we mentioned commons single line multi line and PHP docs we can drop PHP docs They may contain code, but that's probably not going to be code that has been you know show of the side to to let the rest of the Implementation run so this is again you from the raw data you remove everything you can that is as easy as possible to remove Second part we also do a human review What is human review? It means that maybe on single lines or multiple lines comments We can understand and look at that and understand immediately that this is not going to be code We're going to see a few examples, but that's an important thing. We don't just extract raw data to give that to the To the system, but we just remove the one that are completely useless and we end up with that. That's ready for for For fun now the thing is we have a number of comments What do we need to do as experts? We have to tag them as code or not How is that how difficult is that? difficult non-difficult Okay, let's give you to try Here is a little list of things we're going to extract to do the training on What do you think of the second comment? Can someone tell me if they think it's a car. It's a coding. It's code or it's not code second comment No third Some code is inside. I don't want that. I want yes or no So some code maybe tomorrow those are answers. I don't want to hear No, that's good. Actually, it's easy because the red thing means that I have already done the sorting for you, right? Yeah, you're learning. That's great. I see more people than that have brain At the bottom on the top on the other hand we have things that are obviously code, right? Even if it's partial Then it's it's code, right in between in between let's do a survey The thing that is you know as with the gradient the first one a and b and multi-dimensional who thinks this is valid PHP code one two three Okay, it's good. I just want yes or no, but you can decide not to vote right now who decided this is not PHP codes And we have more people right? That's more like 20 Okay at that point this is the moment where your expertise is needed at that point those three of them They know do not have an explicit answer We may decide differently depending on our sensibility Depending on how we know the code Maybe this is actually something that could be found mixing two different kind of logical operators is difficult But that happens right, but this is the moment where we need the expertise Okay, everything that's objective we can decide easily and agree on probably is not the the most interesting This is making the difference between different experts and their their opinions Meaning that you can decide do this I do these Expertise on your own one or maybe have other people, but just know that there's not always a good answer now We're going to have another part we have we have that right we have those comments But we need to input numbers into Into fan because it's not going to repeat English or PHP for that matter I would like you to think a little bit and give me give me things that you would like to look for in those comments That would be characteristics of a code or not So let's say for example, we take a look at that Variables this is very ticky typical of PHP So if we find a structure which has dollar and a few letters right after This is something that's typical of PHP code Note that this is not necessarily always code right the the second one as was mentioned by I don't remember who This is some code is inside. Okay, but This is something that's usually characteristic Can you give me other ideas of things that could be characteristic and help us decide if it's code or not? Can either shout out your answers or hit to the max of the back Mmm, semi column at the end. Yeah, that's another one. There are one two three here. That's a good one other ideas keywords like If equal okay, so PHP keywords that may be the classic conditions while do while things like that All that could be PHP typical application Functions die DL for dump things like that. What else? I like What do you mean? I like syntax highlighting No, no, no, we're talking about plain text not ID stuff So no and I like would be the same that preceding that's keywords You know, you make a list of keywords and those are the one that will be helpful in characteristics Other ideas bracket and bracket and And code brace. Yeah, that's kind of usually useful. So so First raise your hand because otherwise, I don't know who to look at Operators. Yeah, that's I would go in the same category as keywords. So that's that's a good variation Good strings quotes, maybe Quotes is that what you're mentioning? The quotation marks Well, all of them are used and I think they're also used in in language That could help another one finally by there. Yeah Patterns Can you be more precise like that? Could you be more precise because pattern? It's kind of general. That's what we're looking for Yeah, but that would look like you want you want to make a regular expression for like an assignation something like a dollar variable equal and Yeah, a little more complex, I guess that could work One thing that could be useful. Thank you sharing The list of characteristics we're going to use what we're going to stop at some point and have to go on The list of characters going characteristics We're going to use is short here because I want to fit on the on the slide, but it's completely mine Okay, and that's a first try so Operators that was mentioned there is one that's not my choice, but that works too Semi column. I just count them I don't care if they are inside the the string or if they're outside or whatever. I just count them because it's not such a useful Punctuation sign in in English A number of equal the dollar, but I just count dollar I do not even take care of variables just dollars and the size the size the sheer size of the comments Most often people do not like to write long comments to just show outside a piece of code So if it's long, maybe it's a full function or something like that This list is completely arbitrary at that point, right? So keeping my all your ideas you'll have time to make them better to add that make that better To make that better what's important here is from the text we have extracted We can now make very simple searches and convert the comments into numbers and that's exactly what fun needs So we're not going to spend too much time here. This is the ugly file format that Fun requires so basically from the comments We need to turn everything all the characteristics into a number So there is a first line of error very C style the number of Of training a set the number of incoming data, which are the number of columns the number of outgoing data Which means that we have sets 45 set of two lines each line is a set of five number and a set of one number And that's repeated you have an example on the side At that point and before we start actually do the training I would like just to To share a feeling I have because you can imagine that with we're trying to look for code in comments Okay, so something that's kind of structure. We can understand. What did we do? We got some text We counted characters to turn that into numbers This is the input for fun fun read those numbers if that was a count of carrots If that was a number of kilometers that was you know traveled by a snail I don't know. I don't care, but fun is still going to an output something It means that the parts of the expertise the part that we turn the code into some numbers is really important This is the one that's going to give the meaning In between the machine is completely blind. I have absolutely no idea what we're doing It just depends on us to apply that to some reality Kind of black magic. I think but Anyway, it works To complete the first piece of string of script. Here is the training. Remember I introduce one two functions This is the third one, right? We have to provide The initial resource we have to provide the data and we have to provide the desired error That's cool, right? Who have ever done that? You know here some that's all and I want no error do some work That's nice So we start with a desired error of zero dots one what's like one thought one thousandth Interesting. What do we want to do? I think is if we start with a very light. I mean a very high error Fun is not going to train all it's just going to do whatever he wants until the number of errors is Within the margin we have asked so if we make the error way too high is going to train very fast Okay, we give it a very light load is going to train something and makes a lot of errors But that's what we asked so what can we do of course we can raise and lower the error and raise the challenge and Probably that fun is going to work a little more Make it a little more complex, but remove a number of errors and then at some point we can say a We're clever. We want him to train exactly on the data. We have and fun is probably going to succeed But suddenly it's going to be really weird and probably overfitted for our training Remember we are training it on a number of comments and it will meet something else So there is a level of error that you have to Choose and it needs some experience to do that As for me, I just started with the documentation values and it worked very well. So that was nice now Training real case here is the actual values that we I worked on so to train for PHP my admins analysis 47 cases not too many five characteristic incoming and our configuration of three denerones five input one output Six second of training we can do that, right? We can do that. That's nice So we're done. We get a file which is also a few kilobytes don't try to read it It's unreadable, but we can reuse that and now put that on real data The application of the code of the model is just as simple as the code previously used, right? We again create another another resource We create the vector. So even from from the real case we need to extract the comments and Build the same characteristic than the one we use for training, of course Otherwise the systems is not going to recognize anything Then we just call run fun and we get the results in a deneray. How cool is that? Except for the long names of our function for fun, I mean no difficulty there, right and to be true We really want to have Results that are above point eight Anyone have an idea what that means point eight Obviously, everyone has an idea. I have no idea what that It could be a score. It could be carrots again. I have no idea. We have inputted a number of counts counting number of dollars we have counted Characters and we have content operators and we get a number which is a composition of two all of that I have no idea what that means. So is this a percentage? Is it something else and beside that we said you train between zero and one true or false We get results ranging from minus 15 to one. I don't know how you found that Apparently closer to one is good and lower to zero is bad and So we decide to have a to have a threshold in the over the 14,000 comments that are available in PHP my admin here is the Reportation of them. So I said it start with minus 15 and it goes up to To one and when we get close to the end, this is the way the The the repetition goes you see from 60 to 70 is very very steep then suddenly there is a little flat and again It goes as a stair. Okay, meaning that for 80 we could actually be missing a quite large number of results Again, this is completely random. It's up to you to take a look at the weights report. It's Distributed and to decide where to exactly put the the point eight that could be a little lower. That could be a little higher Anyway, the results on PHP my am in other than those ones 14,000 comments Script execution to analyze all those 14,000 comments is 68 milliseconds We said how many we do we are like a 60 of us and we work an hour. We have no results. I Cannot even remove the my finger from my from my my keyboard and it's done And we have about 14% of issues now first first count who thinks it's a lot Too much do you think that that's too much who thinks that's too much we're finding too many too many comments Okay, we think that's about the number of pure comments they would expect Who think that should be lower than that? Okay, so three people more and the rest is sleeping here are the results Here are some of the results so Can you imagine that 27 minutes of work and we actually spot lots of codes? Okay, among them the 2000 we have those and we also find those that was too fast. We also find those Now as I said I introduced you with five function from fine. That was very simple codes. Where is the bug? How come do I find errors here? Do you think there's a bug in my code? I'm looking at you guys No, this is no bug. Welcome to a world where there is no more bugs. This is the first creep you see that has no bugs only false positives So false positives are things that the machine will find but we do not agree with Right, so there is everything everything that is Positive is something that's fun will to find Everything that is true is something that we'll agree with and we have everything the true positive are the one we want Fine found it and we agree with it. That's the best The other one you also like is the false negative Okay, fine do not find it and we do agree or so that it's something that should not be found What we don't want is the false positive which are the most often talked about case and the true negative is with no one wants to hear about because found didn't find it and we don't Want to do the work of fine to check what he has and found so usually people don't find that and I think I have to be done so Let's skip that in terms of results if we analyze them and review the 2000 of them about 50 percent of them were Very simple and repetitive strings Remember when I told you initially that everything that's obvious that should not be tested here trained on Like a Veeam Extend a Veeam configuration line That's basically on every single file because mark is using Veeam to produce pitch pin might mean well We can spot that and remove that. There's also a large number of Paper configurations for some PDF printer in that that we could remove also very easily That will actually reduce the training And the false positive to 800 at least and then we can start again Do our own on work and and review them The the total time to do that from beginning to the to now would be 27 minutes Excluding the compilation of fun. I will leave that to you But it means also that you see doing something that will reduce the amount of work from 14,000 comments to read to 800 to check with a really interesting level of True positive is 27 is 30 minutes So that's interesting that could be applied to many situation You can give it a little try half a mile an hour get some data train them get some result Is it is it interesting enough? Is it like 50% is already removed and we can just reduce the work we do Okay, that's interesting or you try it. It doesn't feel any results or it's really bad bad level of true false positive Yeah, just ditch that and finish by hand So to leave the some room for the next floor your speaker I will Make you read online the older lines that that is how to make the what we've seen better The most important and this is why machine learning is often associated to big data is that? If you want that better, we started with 47 comments more data more training The more you have the more is the better the training will be and the more precise it will be so in any case That's your first optimization get more that I get other applications review them really Check the results and put them back train again Training was five seconds. So iteration should be really fast actually This is the time the evolution of the time of training depending on the amount of Neurons and layers you have inside so even if you want to make it really complex. It's still very fast On the other hand results are always very very fast to come But they may vary a lot actually again. I was so clever. I mean so clever Yeah, I was clever to read the dog, but I was lucky one layer three neurons if you see this is almost the best I Could look a little further and maybe with five neurons that would be even better But still one one level one one layer Otherwise the result can vary from actually what we found to almost everything The wall the wall training here and testing would be another how many that like there's 50 configuration Five seconds by 50. It's ten minutes and you have a you have this graph Ten minutes when you have this graph so you can speak pick exactly the good configuration and make it run for you I'll finish with that If you want all the tools fan is nice because it's in PHP So you can use it on the production server But it's really you yourself with the data and no idea to do anything So that's nice But there are other tools that are more interesting and that will bring you further into the world of machine learning Give it a give it a try and That will be it There. Thank you. Thank you, Damian. Does anyone have any questions for Damian? This is your time to fight back and ask me question after the number of them asked Yeah, of course the the retraction is what I've shown well I've shown very briefly on the on the feedback on the making better section so you do a first run you realize that you have missed a number of Of false positive you get them put them back in training Maybe at the same time get some also true positive with the main training go from 47 to 100 lines train and write again at some point you'll probably get the feeling that you will you will Reach a flat in your progression then you can stop Okay, but yes retraction. That's the easy one There are also learning techniques which include directly the retraction which is not presented here Yes Inside the static analysis at some point as I said Analyzing the codes and trying to guess if there is a problem is good And I try to do it as objective as possible But at some point usually I have to do some wild guess and I try to to push that to machine learning So once I've done whatever I can do And I can argument about it Then I stop and the rest of the results then I do it by experience I go myself in the code and reach the conclusion and train a little Literal model on that so that's my my own my main case the other one I mentioned is Either filter I filtering out data and that could be even for identification I don't tell you to run your identification your login system on that But if you have something that that fast and that prevents you to go to the database to detect something that's Fruitulently try to connect then you're saving a lot of resource Okay, if it passed this first filter which has some error level But is okay, then you can go to the database and save the database maybe 80 percent of the hits That's interesting. That's exactly the way I use it Try to filter out some noise things that you cannot remove and for which you have difficulty to you know find their objective filters Use some training like that and finish by something. That's really powerful for for ETA So when I have scripts that runs For example, I don't know I never know exactly how long is going to take for one analysis to run Okay, and I have 200 of them and the the the structure of the code may may have different impact of my code So I also try to use that for for that So I have I any time I run the the analysis I log the time and I use the The time and the a few characteristics from the code to train the data and have an estimation So instead of just counting the the the amount and the number of tasks That's usually more precise and no one really cares if it's too to erroneous or not Yes Yeah, you're going to have a lot of fun with that You have a big database with lots of profiles and information and characteristics And you want to link those characteristics with the fact they buy or they go to this section or they buy this product Yeah, help yourself. That's going to be fun Which fan try and try an error and try try an error Whatever you give you to try if it's better. You keep it if it's worse to just remove it Okay, at that point we want to well We want to bypass the human thinking to be able either to explore things that we do not think about or to remove Options that are not interesting. So don't don't break a sweat too much think about it But don't overthink it just okay. Here is a few options I give it a try if I remove one as I said, it's very fast to have a feedback So I review me move one. Is it's better? Yes, okay I just remove it and I try to put some on some other Retroaction Now what happens also is this is very rudimentary. This is really good for a session like that So you understand the different phases of the machine learning There are also tools ideas that will do this work for for you and give you some Certainty or some efficiency for every characteristics. This is not the case here Yeah, yeah, the other ones. Yeah, no Between you and me, but I don't want to have that big I didn't check them So as you said there the 40% that was detected by fun That's the one I reviewed because that's the one that's the true positive or the true for negative The other one I just didn't check them because this is training at that point So I don't want I don't want to review the 14,000 to know how how good it is I can also open the rest and make myself. Let me make a quick check You know just don't read all of them try to detect if there are things that have been means that are obvious Otherwise at that point. Yeah, you have you have either to trust your system at training level or or review it review it But yeah, you should be testing the two of them until you're satisfied with the level of certainty Any other questions? No, thank you. Thank you, Damien. They were coming to close of


大家早点休息吧早安早安早安早安早安早安我和你一起玩好好好今天今天我們是在第四個星期今天我們要結束我們要進去英國的英國的英國的英國的所以今天我們會說今天我們會說你知道有三個很重要的通訊Exact, Exit, Exit, ExitWaitAnd I think it's going to be a sprintThe fork is actually a little more complicated than theseSo I think we can get through this nowBut again, as usual, we will go at the speed of comprehensionSo...alrightCouple announcements as usualAssignment zero is kind of in gripsAnd little bristlesSo now I'm going to put up some questions about the codeFor you guys to go throughAnd then, you know, begin next weekThere's a few more steps, but there's really not that muchIt's really just for meYou guys, if you've built a kernel, you've done a lot of what we want you to do alreadyI do want you guys to kind of get into the sourceAnd start poking aroundSo that's going to be it Lecture video is onlineI'm working on itI'm excited about doing itThey should be online at some pointSo if you guys miss classOr if you know you just want to watch againOr if there's parts that you want to reviewYou can do thatAnd I'm hoping to get it set up to the slidesTo the next door to the videoSo you guys can kind of cater along to the slidesSo you're going to relive the fullest yearI'm going to do it like a couple of times a dayAll right, soAs far as the slides, I got some feedback from somebodySo does anyone try to look at the slides online?Does anyone have a hard time with the images in the slide?Anybody using Internet ExplorerOkaySo this is running on Firefox right nowSo you need a browserThe images are SPGsYou need a browser that supports SPGsAnd as I put it, most decent browsers doSupport is kind of lagging in certain placesInternet ExplorerBut anywayIf you're really struggling with thisSo many kind of viewsWhat do you use?Oh, SafariMaybe tryI'll look into itYou might end up plugging into something like thatBut I'm using SPG for the classIt's too late to go backSo an SPG is kind of semi-newAs in 2009 or somethingSo apparently this hasn't made it to Redmond yetBut anyway, maybe hasn't made it toWhere is Apple?CupertinoAnywayOkaySo last time we talked about 4We did a little bit of pipesSo you see why some of the forks and antics are usefulSo questions about WednesdayAnd what are the linksAnd what are the linksAnd what are the linksAnd where can I find a noteAnd what are the linksSo I sent a link to itAre you getting emails from the client?YesYes, so the link is in thereAnd the website will eventuallyHave links to other things on the buttonBut for now you have to put down those linksAny other questionsWe'll go over to the clientAll right, so last time we talked aboutFilementsWe talked about 4We did a little bit of pipesJust so you seeWhy some of the forks and antics are useful我們現在要進一步你們有機會考慮一下你們有什麼想法有什麼想法有什麼問題你們知道它正在發生你們知道它正在發生我正在在後面的房間可能是我最愛的一堆人OK沒有問題我們來考慮一下我們開始在這裡你的名字JP好我可以寫一句嗎Anderson幫你寫2 plus是同一個得分嗎對你們想寫他們是小孩有4個得分找個目標可能會被對越多的数據很好問題是這個為什麼我們要這樣做?為什麼我們有這三個等級的方式?我們繼續走,這是什麼?這是什麼?這是什麼?為什麼我們要這個等級的方式?為什麼我們要把資料分配在這兩個或是三個不同的部分?你想想看嗎?沒有,我不是說過為什麼?因為我們要做得更快更快?所以這個方式會更快嗎?為什麼?因為每次我用資料分配我都要把資料分配在不同部分的部分用資料分配OK,OK現在你把資料分配在一個好的方式然後把資料分配在那裡對那怎麼辦?那什麼是資料分配?就是資料分配在一個好的方式資料分配在哪一個?資料分配在一個好的方式對,那是什麼?我們把資料分配在不同部分的部分所以籌款別人不需要分配OK,但那五個圖像為何必要分配?因為它能在哪個部分的部分為什麼我把資料分配在那種部分?嗯Yes rightBecause the differentThe different informationIn the different cases of the fileThe different file handlesFile handlingIt can be shared differently with different semanticsRightSo file handles store the offsetWhich means that after forwardThe offset is shared between a parent and a childRightFile objects store a lot of other file informationBut that information is usually notYou know it is shared by everybody who has the file openLike the data in the fileWhich does block the ideas and that like that對嗎但在把最後的解釋成為自己的小物體和其他資訊我可以讓它與其他相關的相關相關如果我有資訊與其他資訊與其他資訊與其他資訊與其他資訊與其他資訊與其他資訊與其他資訊與其他資訊與其他資訊與其他資訊與其他資訊與其他資訊我還不確定這個資訊會令更多東西更多東西但做了很多相關資訊與其他資訊與其他資訊與其他資訊與其他資訊為何我會把資訊告訴你還有一個人已經告訴我為什麼我還想把認識的資訊有人告訴我有一個是一個交易對5VC交易我需要想找一位跟孩子交易跟他們交易But what my business is, it's the way they do it, I do this by copying the file tablesso they have the same file offsets into files that are open alright, there's no requirementSo, let's say that the childcare process, does not want to share an off物��But wants to open the same files what do I need to doRight, I need to close the file descriptor that refers to that fileBut then I just open the file againI get my own, I get a new file descriptorand I get a new file handled that's positive to me.So that's how if I'm a child and I'm not interested in sharing information,I can do that.All right, create a new process.It's easy, come on. Everybody together.Fort, all right.Fort creates a new process that is what?Fort creates a new process that is what?Identical to what?The process is called for.What's one notable possible exception to this rulethat we discussed in class?Freads, because working with threads,I don't think so.All right, following code.Who wants to,let's see,Let's go over here somewhere.Following code,who is the parent and who is the child?The child in your ULM.Yeah,that's what I thought.What's pipe?IPC mechanism.TIP should be allowed.IPC mechanism,right?but tell me more about that.He wants to know more about that.Right,so it's used to create a chain andcommunicating process,but what is it?Is it a file?Yeah,that's a good idea.It's a file like option,right?It's got a read-on-land and a write-on-land.You get a different file script for each.Any data that you write in the write-on-landappears on the read-on-land.And why are pipes useful?We've definitely covered that one.Anybody?It's a big yawn.It's a big yawn.No,no.IPC communication mechanism.And it allows us to establish a chain ofcommunicating process.OK,any other questions?Here you go.Questions,dots.OK,so we talked about fork.but it's forked enoughSo what would the world look like if I just had forked?I start so remember we said that the operating system is thoughtful for setting up the in-it processAnd then if I just had forked, what would the system look like?Well copies of what?InitSo this is not interestingAlternatively, I thought about this a little bitWell you could write your codeYou could write all the code that you would ever want to run on the system in one huge functionWith all these different branches based on whether or not you were the parent or notSo it was like if I'm the parent, run the bash codeAll the bash sort of looks like a new blockAnd if I'm the child, I just kind of paste all the Firefox codeSo that would beWhat?Not as easy way of saying itThat would not be a smart ideaThat would make your system difficult to maintain at the minimumSo I need a way to change a processI need to provide a way for processes to changeTo grow, to develop, to realize their full potentialThe system call that doesn'tIs called or the failure system callsBecause if you look at exactly, it's actually like sixI don't know if these are implemented by the C libraryActually by the kernel, but there are sometimes multiple different versions of exactThere's exact V, there's exact VE, there's exact VCEAnd they all do slightly different thingsThey have slightly different semantics of how they set up the environment and other thingsBut the one thing they all do-doIs allow me to run a new processSomeone have a question?So the exact loads information about the new processAnd that file is required to essentially provide all the informationThat's required to create this new processAnd most of that information is about how to set up the memory of the new processHow to set up the address spaceBut it also includes information about things likeWhat libraries might I want to load and the entry pointSo after the operation sets up the address spaceTo start the process running in its new lifeIt needs to know what's the first instructionWhere's the location of the first instruction in the fileThat the thread should start to executeSo linux and other units like systems use something called elfAnd elf is not an extensionIf you guys have used linux or linux, you've noticed thatUnlike windows, there's not typically a fileExecutable files don't have extensionsSo when you run bash, it's not bash.exeBut there's information in that fileThat identifies it as an elf format fileAnd when you load it, that file has informationAbout what to do when you try to run bashHow to set up the address spaceSo let's look at thisYou guys, I'm sure, have these tools in your virtual machineIf you don't, they're easy to installSo one tip for people that haven't used Ubuntu beforeIf you run a commandIf you want to know how to install a commandYou can try and it's not installed on any systemYou can run it and the system will actually give youThe command necessary to install that commandSo if you're missing something, you type firefoxWe'll say firefox not foundRun this command to install firefoxSo I'm pretty sure these tools come standard with your machineBut you can install them if you needSo Redelf as it sounds likeIs a tool that allows us to inspect the contentsOf elf format and minorsAnd Redelf generates a lot of outputSo it actually snipped off quite a bit of itBecause a lot of...So loading programs is actually remarkably complicatedAnd the earlier versions of this class at HarvardUse to spend several lectures talking aboutLinking and loadingAnd I don't want to do thatIt's complicatedIt's not really an operationIt can function completelyAnd it's justI don't find it to be super losingSo I'm going to gloss over a lot of detailsBut I do want to show you what's in hereYou want to learn more about thisThere's lots and lots of informationBut the process of running a fileOn modern systemsIs fairly involvedSo let's look at...Let's try to glean some simple bits of information about thisSo if I run RedelfI'm looking at bin trueI want to find the simplest possible program on thisWhat does bin true do?No, it does not return oneThe exit code that indicates everything is okaySo bin true is not a very big fileBut bin true still has eight different program headersSo the elf file has all the structure built into itEssentially, you know, it's like it's any of the filesThere's an agreement between the operating systemAnd the people who produce elf filesCan you compile and build somethingAbout how this file is set upAnd the elf standard is actually implementedI think back in 1999And now most versions of UNIX use thisSo if you...It provides some degree of portability between systemsRightSo if you take a binary that was compiled on one systemAnd try to run it somewhere elseIt may not because there's still some systemSpecific information that ends up being hard codedAnd here like the location of librariesAnd stuff like thatSo it's not always the case that you can compileSomething on, you know, BSEAnd run the identical binaryRightBut usually versions of UNIX are binarySo you can move binary backSo what's in here, rightSo someone told me something about this elf fileThat they can clean from thisAnd I'm giving you guys some hintsI'm using a highlightCharl, all the way in the backTell me something about this fileThis elf fileWhat does it say?And there you goEntry point, rightSo the entry point, what does the entry point sound like?What does that sound like?That is the first instructionThat this program will start to executeWhen it is finished loadingSo once the kernel is set upThe address page, according to the rest of thisThe first thread at address80 million 48 8 9 0That's a virtual addressTalk about virtual address nameAnd a few weeksBut that is where the first thread will startActually, it's not 80It's 80, well whateverIt's not like thatOkayNow let's look at the rest of itSo someone else told me something about thisHopped out by thatLet's work this outAnd tell me about this fileFrom the information that's provided byLoad elfRead elf, sorryCan you tell me something else?No, okayWe'll be backIt's an executableOkay, he took the easy routeWhat other file types do you think elf might support?Executable is notThat's not the permissionsThat's something about what the file is intended to doSo elfThe executable andIt's up on the slideRead the name of theRead what elf stands forIt'll give you a big hintExecutive only rulesSo what other file type might it support?A linkLike a loadable librarySo libraries were also created using itIn the elf formatThey're different kind of fileThey're not designed to be executedThey're designed to be loadedBy other executable filesSo this is the differenceAlright, let me goKeep going back hereSo tell me something else about this fileRead the parts in greenWhat program interpreter would it like?So this is kind of interestingI just puzzled by this myselfWhen I read this last nightSo it turns outSo if people have used LinuxYou'll notice that the file nameOf this file looks like a librarySo this is a standard format for librariesIt saysSo usually means a shared object fileOr a shared libraryNow it turns outThis is actually an executableRight, on your systemAnd if you'll read thisRight, it is one of the thingsI love about LinuxYou've tried to run somethingAnd there's this, you know10 line explanation of what it doesAnd why you probablyDidn't want to run itRight, you knowConclusions, chances areYou did not intend to run this programAnd that's usefulBecause I did intend to run itBut I was just trying to figure outWhat happenedSo it turns outThat the L file formatAllows each executableTo tell the kernelAfter you load my address spaceThis is a linkerThat I want you to startThat's going to help mapMy loadable librariesInto my address spaceSo there's actually two phasesAgain, I said this was possibleAnd I don't want to getBogged down in itOr confuse peopleBut afterThere are two phasesTo load in real lifeThe kernel loads upBeen trueAnd the next thingIs the kernel will startLive loadlinux.sodep2And that is the programThat will helpBeen trueMap the librariesThat it's usingSo there's two partsNow why is thatWhy would that be the caseWhat's the advantageOf using shared librariesTalk about thisA little bit moreThatRight, and what elseWhat can I doThe executable file is smallerIt's smaller whyBecause it's not being copiedIt doesn't containAnd what else does that meanIt has lessBut what elseSo remember beforeWe talkedThis is interestingSo before with file handlesWe talked aboutSeparating informationIn the different partsAllows me to do whatWhat's thatWell, okayBut the fundamental ideaHere is thatIt allows me to share things differentlyWhich means I canChange different thingsSo by not mappingLoadable librariesInto the outer spaceInside the executable fileWhat does that allow me to doIt allows me to change themIndependently of the fileSo if I makeFor exampleNow thisI haven't shown itThat this executableUses the C libraryRightMany C executablesUse the C libraryIf there's a bugIn the C libraryI only have to fixThe C library onceAnd every processThat loads it dynamicallyWill benefit from thoseChangesRightSo by not copyingCode aroundIt also allows meTo change that code onceThe one placeAnd then everyEvery programThat uses that codeRightAgainI get tiredJust talking about itIt's reallyAgainIt's just aSome sort of signalAbout how complicatedThis isI don't really wantTo go into itBut exactlyIt's the functionThat changesIn outer spaceAnd it usesIn Assignment 2You will learnA little bit moreAbout thatYou knowFear 9On your systemThere are noBasicallyThe L4 methodWe useIs really simpleWe don't implementAny sort ofShare librariesOr runtime linkingSo you don'tHave to worryAbout thatBut you willProcess an L fileAnd use theInformation to loadEven into an addressRightQuestionsAbout any of thisYeahSoIf youOkaySoIn the rest of theOutputRightSo I would encourage youTo look at theOutput at this fileRightAnd in fullAnd in the restOf the outputThere areThere areBasically commandsIn the L fileThat tellThe systemI want to useThis libraryRightThe next thingThat happensIs the systemHas to findThat libraryRightSo if youWant to changeThat libraryWhat do you doNoNoNoI changeThe file on diskThen it loadsRightSo if IMake a changeTo the C libraryRightWhich happensLike sometimesWhen you updateYour systemThere's a new versionOf the C libraryOr some otherShare libraryThat comes inThat fixes bugsOr improves performanceOr whateverRightBecause for exampleI may knowHow to call certain functionsBut I don't knowWhere they areIn the fileRightI know I want to useA certain C library functionBut depending onHow the library is set upThat function moves aroundRightSo part of gettingThis rightIs figuring outPixingSo a lot of thisGet stitched togetherAt runtimeThe program knowsThat it wants toYou know callI don't knowA string comparisonFunction in the C libraryBut it doesn't knowWhere that function isRightSo that's the mysteryThat gets sorted outAt runtimeRightIs that the linkerHelps it figure outWhen you want to callThat functionWhere do you jump toLike what memory addressDo you go toAnd start nextRightAny other questionsAboutDaleIs it possibleIf you're making changesTo these thingsThat someone is writingAn old versionAt the same timeSureIt's going to beAlso runningTo be honest with youI don't knowExactly about that workSo I think thatBecause I thinkThat's going to be fineBecause onceThe thing isThat the linkerSets up all this informationRightBased on the state of the worldOf a linker runSo if you change thingsAnd the function at your pointTo move aroundIn the capitalAnd then onlyI think thatAlsoSo based on this studyYou can move by nowLike you have to reboot windowsAnd you sayI think thatSo that may beThat may be one reasonBut I don't knowThat's a great questionActuallySo yeahIt's interestingThere was a lot ofThere's a period of timeIn the operating system communityWhere reboots wereA source of fair amount of conservationAnd there's actuallyA lot of interestingResearch that was doneBecause a lot of timesThe reasons why systems rebootIs just to get backTo a known good stateRightThey don't knowExactly what's happenedBut they knowWhat's predictableWhich is to boot intoAnd I don't knowI'm sure there's been studies on thisBut I think if you lookYou find that for a long timeA lot of the rebootsThat windows requestedWere probably not necessaryRightIf you knew exactlyHow to detangle thingsAnd which things to restartAnd everythingYou could avoid doing a rebootBut rather than figure that outBecause it's hardThey were just like thatPunt rebootNoBut there was a lot of workInto thisBecause people understood thatPeople get tired of rebootingTheir systems all the timeRightAnd people had aSmall asideI was working at Microsoft ResearchOne summerAnd it was right after Vista came outAnd we came in forTo start our internshipAnd they had theseLike nice new machinesWaiting for usAnd they all had Vista onRightAnd people were coming inAnd they're starting to getTheir environment set upAnd people just ranInto these issues with VistaRightSo this one guy, for exampleHad some sort of experimentRunning overnightRightAnd what happened overnightRightAnd I didn't want it to rebootRightSo it like neededAnd it's some criticalSecurity update to installSo it basically rebootedBecame the next dayIt's likeWhat happened to my experimentAnd it was justIt was goneSo I think withinI'm not making this upI think within aMaybe three weeksEverybody in the oppositeCalled up ITAnd asked to haveXB installed our machineSo basically everybody justRan away from Vista and XBAnd for what we wereDoing, it was more suitableBut anywayRightSo reboots are frequentlyNot really requiredBut sometimesIt's just the safest thingRightOn the other handThere's also these enterpriseSystems that just could notReally can haveBe rebootedRightThere are systems out thereAnd there are system administratorsOut there who I guarantee youThe thing they fear the mostIs that they will haveTo reboot their systemBecause they have no ideaHow to get it backInto the state that it's in nowRightI'm seriousIt's been up for a couple of monthsHe made a lot of configuration changesHe restarted thingsWe've got stuff to stabilizeAnd then someone's likeOh yeah, this is how for a patchWe need to rebootThey're like noNo, we don'tWe will just beAnd that may be one of the reasonsWhy systems continue to runUnpatched codeThat has problems with itRightSo one of the reasonsThat people are able to pull off exploitsIs because system administratorsDon't want to restartRightBecause they're never sureWill it ever run?Will it ever run again?Like will it ever run againThe way I got itRight nowSoOkayLet's forge aheadSoExecThe semantics are the exactAre that the parent processIs allowed to pass argumentsTo the childRightAnd this is importantBecause normallyThere are argumentsThat you want to pass to the childRightMost programs accept some argumentsAnd if you couldn't pass argumentsTo the childThen you wouldn't be ableRun important argumentsAnd it would be kind of dullRightI guess you could haveEvery program prompt youFor the argumentsThat you want to useBut then that makes itPossible to run pipelineSo why am I justifiedThis is just goodOkaySo anywayAnd the processPassing argumentsEssentially meansThat the calling processThe process that callsExactlyPasses some argumentsInto the kernelRightThose argumentsHave to be retrievedCarefully about the kernelRightBecause the kernelDoes not trust usersRightAnd you guys will findIt's not the time toMove argumentsAnd out of the kernelBecause the kernelHas to be very carefulWhen it's accessingUser addressesBecause the userCould be trying to do somethingMeOr could justDone something stupidRightSo the kernelRetreats the argumentsIt sets upA new address spaceAnd then it laysOut those argumentsIn the address spaceWhere the processCan findAnd when it starts to runRightAnd you guys knowThisBecause if you programRightAnd main takes an rpcAnd rpRightWhere does that come fromRp comes fromRightIt comes fromThat's the list of argumentsAnd that's how that getsRightOkayAnd thenThis is itI thought this was kind ofInterestingInteresting dualityBetween fork and excelRightSo what was interestingAbout forkIn terms of returnIt turnsIt turnsIt turnsYou guys are getting thereIt turns twiceRightExactExact on the other handAsThe interesting propertyWhere exact never returnsRightSo there's no returnFor exactRightExactI mean you can think ofExact as quoteAnd quoteReturningRightWhen you call exactAnd it worksThat's the end of youRightLike you will neverSeeYou will never knowIf it's exactOther thanThat you don't existIt worksOkaySo let's goLet's goThe guyThe guyOkaySo I got a threadSorryI got a processThat is called exactRightAnd my shellWants to run been trueOkaySoWhat's the first thingI need to doRightSo the threadIs now running insideThe kernelRightIt's my user kernel boundaryHereSo the processIs made a system calledRun inside the kernelWhat's the first thingI need to doHereNo, do I need to run fork?No, fork and exec are totally...Okay, I need to read the file.Let's see, what did I do first?I need to get the arguments, right?So the arguments are...When I call exec, the arguments are located in memory.There's actually...I can actually pass a certain number of argumentsdirectly to the system call,but there's a limited number of registers on my CPUand so I usually have to leave something in the number.So I've got arguments for the new...I've got arguments for beenTrue in the memory of back.I've got to copy these into the kernel.Now I've got my argument.I guess I should have copied them.I didn't move them.They get copied.What's next?You've got an L in my hand.So now I've got to open up the L file.So I've got my beenTrue fileand as we point out before,the new file tells mehow to set up the outer space for this new file.So there's new process.What are the contents of memorythat should be loaded when this process starts?What do I do next?What's that?I think I did this differently.So what I did next isI've replaced the outer space.And now...What do I do?Somebody had the right answer.I need to push the R.Now the arguments go back.Let's go through this a few more times.I'm also realizing thatI think there's something that's out of order here.So this is a good question.So what I've shown you here isI set up the outer spaceand then I destroy the outer spaceof the process that called itand thenI copy the arguments back in.So what's the problem with my information?No, my arguments are in the kernel now.So that's okay.I copied them into kernel.Yeah.So this is performance issues.I'm more worried about failure.Soif there's a problemcopying the argumentswhat happens here?We'll fail,but can I go back?No.Right.So this is one implementation...So this is one implementationchallenge with exec.Exec either has to...Exec can't get stuck in some indeterminate state.So exec can't...There have to be the same number of processesafter I call exec as before.I can't failand then accidentally be likewhoops,sorryI'm not going to return to the caller.I'm just going to pretend like that didn't happen.No one saw it.So when exec failsit has to return back to the caller.So I have to make all the changesthat I have to set up.The other thing for my new processanything that can fail has to be donebefore I make structure changesto the caller's atmosphere.But of course,againthese processes are just abstractions.So let me go back to my example here.We'll talk about the file head of department.So right herethere's no need for meto replace this address space in this step.I can just keep two address spaces aroundto the very,very last minute.And I can essentially copy the argumentsinto this address space.I can do everything I need to doand then actuallyI can just start the new thread runningover here.I can create a new process container.And then once everything is set upI can kill the new process.So again,when you guys get them with thisI think they'll start to get itwhich is thatthese are just abstractions,right?So there's no real box herethat I can only have one address space.Yeah.If anything succeedsDo you want to return to the bash,right?No.No,no,no.Bash is no more.If execs succeedswhen execs succeedsthe calling process is gone.Go on.Yeah,in case of execbut usually when we usebash and run throughthen we come back to the bash.We'll get to that.Right?So what bash actually doeswe're going to get to our show.Let me keep going.So execone thing about exec is thatby convention exec does not modifythe file tableof the calling process.So if you saw hereI didn't do anything to the file tableI just left it alone.Walking.Because you want to shareif that is between the bear and the butcher.TAs are just so old.Right.So I did all this workin fork to copy the file tableand make sure the parentand the child had the samefile handles,right?If the next thing I do after forkis execand I blow wellit meansI can never reallyimmediate the wayto watch it.Right?So execto use the file tableexactly in this.Right?So by defaultthe process startsexecuting with thesame open files.Same file handles.So this isthe beginningof our simple shell.Right?You can write a shellin pseudo codeif you ignoresome little gummy bitslike how to parsethe argumentsin about 7 or 8 lines.Right?So this isthe beginning.Right?So what does this code do?Oh,I should haveprinted a promptWhat does this code do?Right?So Iread a line of inputfrom thefrom the shelland againif I wouldsimple made a real shellI would havea pretty promptto tell youthat I'm readyfor integer.Right?But Iread a line of inputand again I justmade up this functionit doesn't existand then I fork.Right?Because I'mgoing toI want to stay aroundbecause Iwhat happens if Ijust call execI could do that.Right?I could just callexecWhat would happen then?The shell is gone.Right?There's no shell no more.Right?So Icould just call execand then when thatprocess exitedthat would be the end.Right?There'd be noshell for meterperfume.Right?So I wouldn't be able torun it.If Iwant to write a shellthat only takesonly executesone line of inputthen that works fine.Right?But that's nota very useful shell.Right?So I call fork.So ifthe shell is zeroso what does this mean?And the childI call execand I replace myselfwith whatevernew processthe user wanted to start.Right?So this is reallyit's almost just simple.Right?Butwhat's missing here?Right?What wouldactually happenif I ran this code?What's that?Well you knowwhat's going to happenis it's going to come backto this line hereinput.Right?And nowwhat's going to happenis it's actuallygoing to be competingfor the consolewith whatever started up.Right?You can write the shellit's really annoying.Right?Because it's likebecause basicallythe characters areboth processesthey're sharingfile handles.Remember?So both processesare tryingto grab charactersfrom the consoleand it's kindof like whoever wins.Right?And soit's very difficultto speak to me.That's becausethe shell is sitting theretrying to get some.Right?Okay.Sowhat I needto dowhen I need to dois implementwell this couple thingssowe talked about this alreadywhat am I missingherein my process problem?there's two pieces leftand thesethese areI think in many waysmuch simpler than they are.Okay well noyou're getting ahead of me.Sohow does the processindicate that it'sfinished execute?Right?Wellit turns outthat there's actuallya system call for this.Right?Soyou guys who haveI'm going to come backto the end of theanyone who'swhose written C coderight?Doyou have to callexit at the end你的名字不不不原因是C library 叫 exit 40所以when main completescontrol 其實returns into the C libraryand the C library will call exit problembut every processin order to exitcalls as exitthis is the callexistence of call takes an exit codeand that exit codeis delivered to parentit's made available to parentbut nowso exit is very simpleexit just destroys the process of the callrightI don't even know if exit can actually failif you call exit you're donethere's no trace of you left on thisexcept for this exitrightbut as Michael pointed outI need a wayto figure outhow to communicate that exit codeto the parentso the last call on our listfor today is waitso when a process calls exitthe kernel maintains an exit codefor that processand it maintains that exit codeuntil the parent calls waitwait is another system calland the standards of waitare I give wait a process IDand if that process IDis one of my childrenthen wait will return the exit codeand again wait is the one system callthat I can't figure out exactlyhow to fit intoI was thinking it's kind of likebecause the thing is thata process can call waiteither before or afterthe trial is exitedif it calls wait beforeit's kind of likeI guess it's your parentbut imagine it's like a relativewaiting at your bedsideis you're dyingjust die alreadyso I can reach the wealthof this exit codethat you're about to provideI took care of you for monthsand all I got was this lousy itso if it calls afterand it's almost like a salebeyond the grave of communicationyou know like people gatherand a spirit appearsand the spirit saysforokay soso wait and exit are frequentlyconsidered togetherand the reason is thatboth wait and exit are requiredto completely removeall traces of a processfrom our systemso untila process calls exitand its parent calls waitsome trace of that processis left on the systemit turns outthat there are two piecesone is the return codethe other is the process IDso the process IDwill not be reusedwhy notwhy notwhy wouldn't I reuse process IDrightif I didn't reuse the process IDthen when the parent calls waitI'm likeyou're talking about process 5you're talking about process 5you're talking about process 5you're talking about process 5you're talking about process 5we got a lot of exit codesfor process 5I don't know which oneso the process IDusually hangs aroundbecause it'sneeded to a new type ofplatformso processes thatof exit have notyet had theirexit codewe call thisa reapedrightlike the grim reaperand nowprocesses thatof exit have anadversed code reapedare called zombiesrightand all thatmeans is thatthere's some teenylittle bit of informationleft about this processit's deadit doesn't have anadversed baseit doesn't have any threadsetc.some traceit's stillsogetting weightedexit lifeis going tobedebly a little biton assignment toobecause it createsinterestingsynchronizationrighta processthe semanticsof weightare that a processis supposed to beguaranteed to beable to collectthe exit codeof its childrenrightwhen a child exitswhoever its parentis at that momentis supposed to beable to collectthe exit codeandthe parentis calling weightand the childis calling exitrightaround the same timerightand in thosekind of race conditionsyou have to make surethatyou knoweither one of two thingshappenseither weight succeedsand returns to the exit codeor weight failsbut the exit codeis still availablerightsoit turns outthat there are alsook so let's talka little bit aboutwait an exitsoso what do I doif a processis parentsopairis supposed to be the onepairis supposed to be the onethat's responsiblefor collecting the exit codewhat do I doso I need toI need to find a newthe terminology gets weirdso we refer tothis processas an orphanand we needto find a new parentand normallywhat we dothe standard semanticsare the orphan processis assignedto initright and probably在系統上都會經常發生一直在發生一直在發生所以我父母死了我仍然在發生所以其他問題是我們可以防止狀況嗎所以當孩子死了直至父母的肺炎或是每個系統的父母可以在發生這小段時間就已經發生所以我們可以防止如果我們在發生有時候我們可以找狀況在發生的狀況對嗎還有其他東西但是我可以保證我沒有很多的不太多這些狀況在發生給他們一點時間給他們一點時間給他們一點時間所以你意思是什麼殺了之後的不所以重點是肺炎永遠都要回復什麼我一開始叫他們找到的正確訊息那他們的狀況沒有合作繼續夠了只有或太多所以有兩個理解第一個就是孩子死了腿along肺炎肆腸我不知道為什麼會不會肩我再來看像只有7個8個是有時候會生所以,當我獲得這個信號,這個信號給父母,這個信號是可以給孩子的而很多父母會用這個信號來代替他們即使他們不想用這個信號,即使他們不想用這個信號他們會用這個信號來代替他們即使他們不想用這個信號,即使他們不想用這個信號所以,在某些系統上,在某些系統上,如果父母選擇去代替這個信號那麼,父母會把孩子給你所以,如果我把這個信號傳給父母,父母會去代替這個信號所以,如果父母不在乎這個信號,我就會把這個信號傳給他所以,我會用這個信號來代替這個信號所以,如果父母不在乎這個信號,我就會把這個信號傳給他其實,對不起,這是一句對不起,我忘記了這句所以,其他問題是,如果我不想等如果我想看看父母的招數,或者看如果父母死了我應該說這樣,如果我想看父母死了,我會有兩種選擇一種是,我可以補充所以,原本的計劃是,父母會等到父母死了如果父母還活著所以,如果父母死了,他會補充這個信號如果父母還活著,他會等到父母死了當時,父母就會開始在乎這個信號所以,有人問我之前的問題是否真正的,這就是父母的想法所以,父母會等到你等到你開始繼續在乎這個信號用來補充這個信號還有一種補充這個信號讓我簡單地說所以,補充這個信號會補充這個信號,如果父母死了如果父母死了,他就會補充這個信號這個信號會補充這個信號好,現在,我們其實有這個信號所以,這是我們的簡單信號所以,這是什麼來源讓我們避免這個問題讓我們避免這個問題讓我們避免這個問題讓我們避免這個問題讓我們避免這個問題所以,如果我,父母我會等到我的兒子那兒子所以,這是另一個問題那兒子在哪裡?我已經說過,我以為我會用這個信號那兒子在哪裡?父母在兒子因為,這個信號的全程是父母的信號對然後,父母也會用這個信號所以,我們要快速地讓我們把Aerono和C-Library的分別所以,你們一些人有用過一些信號的信號或,我應該說你們覺得你們用過一些信號的信號對吧? turns out that the forkthat you call when you program in Cis not a direct system callWhat it does, it's a function provided by the C-Librarythat changes the semantics of fork's likenessRight?So, you call the C-Library functionI think sometimes it's even implementedit's just a macroRight?And what it doesis it takes the arguments you passit might rearrange them a little bitand then it passes them into the kerneland then when the kernel returnsone of the significant things it doesis it sets AeronoRight?So, people who use Care familiar with AeronoAerono is a global variablethat set that indicatesafter I make a certain systemor library callsif there was a problemRight?The kernel does not set AeronoRight?The kernel simply returns argumentsor returns an exit codefrom a system callRight?The C-Library is responsiblefor calling AeronoRight?So, I just want to pointand make sure you guys understandwhen you start to do a signature tuneyou start to read aboutwhat your acts to implementthe semantics of sys-4sys-6sys-waythe system callversions of theseare differentthan you might be used toif you're really familiarwith the formatting of CRight?So, just keep that in mindRight?And you get if you want toyou've got all the codefor your systemso if you want to seehow the C-Librarythat I gave youthat we gave youmodifies the argumentsgo look at itit's right thereevery time when youdo a make in your sourcedirectoryand you compile allthe user toolsone of the thingswe're going to takeyou knowwe've basically been up herewe've been lookingat the kernelfrom the perspectiveof applicationswe've been lookingat the kernel interfacethe system callOn Mondaywe're going to startwhat might bea little bit more funwhich is getting downand dirty intothe world of hardwareRight?So, we're going to talk aboutwhat are the problemswith hardwarewhat are the key abstractionswhat are the thingsthat the kernelhas to be able to dothe multiplex resourcesand create thesecomputed plansto try to dobasically a weekand you knowinterruptshow the kernel getscontrolspecial featuresof kernel codeand a lot ofdo certain thingscomputingand a little bitabout the frontthen we're going todo a weekon synchronizationwhich you willappreciatebecause by that pointwe've beenon assignment onewhich has a lotof synchronizationand then we willdo a weekon scheduleand that'sas far as I can


Welcome beautiful friends to Monet Café. I'm artist Susan Jenkins, and yes this is a watercolor painting tutorial. Join me in this lesson as we learn about new and very affordable watercolor painting products. I think this will be exciting for beginners and experienced watercolor artists alike. So we'll be learning lots in this, but specifically how to paint intuitively. This means very loose and free, and I find it's relaxing, therapeutic, and truly lots of fun. These would make neat little greeting cards or gift cards to give to friends. So let's dive right in and get started with this fun and relaxing lesson. But first I would really appreciate it if you would go ahead and like this video and subscribe to this channel for more free videos and click that bell icon to be notified of future videos. If you've been enjoying this channel with literally hundreds of free lessons and you'd like to support this channel for $5 a month, that would be so awesome. It helps keep these free videos coming, plus my patrons get extra content. As in this case, my patrons will get all of the commentary in real time. Now let's talk about the products used in this lesson. I was quite impressed with this watercolor set by my Lang. I hope I'm saying that right. It's a 48 set of watercolors, and I'm really overwhelmed at the vibrancy of these colors, and they are so affordable. I'll have all product links in the description of this video. I also love that they sent me a color chart to literally fill out all of the colors. I don't know why they sent me two of them, but that's cool. They also have this neat little film that goes over the watercolors that shows you all of the color numbers and names. This makes it really convenient for filling out the color chart. I'll be using some watercolor brushes, but it's nice that this set comes with one of these watercolor pens. They're great for travel. Now look at these beautiful colors. I'm going to fill out the color chart real quick and speed it up so you can see the vibrancy of the color, and they even come with metallic colors that work beautifully. I'm going to speed this up, but I wanted to mention some of the advantages to doing this. Watercolors in their dried state look a lot darker than when you wet them and apply them to watercolor paper. So if you try to paint with just the set alone, you're kind of working blind. You can't really see how luminous the colors are. And by the way, these are some luminous, gorgeous colors. I also love the fact that they keep the color names very consistent with traditional color names. Here's some of the metallic colors. And one neat thing about metallic colors is they also look great on black paper. And I think that's just really cool. The surface I'll be using, I'll also have a product link in the description of this video, is called Fluid 100 watercolor paper. Now I had never used, it's a six by eight size. I had never used 300 pound watercolor paper before. I love it. You can add lots of water. It doesn't buckle very much. Again, a very affordable product. This was my first experimental painting using this watercolor block. Because it's a block, it's glued on the sides. You don't get any buckling. And it's just really a neat way to work. The brushes I'll be using will be mostly this Princeton Brush Company. I really like these watercolor brushes. And I just have the round brushes. I'll be using probably a 12, a 10, and a 6. And I will, when I get to some of the final little wildflower stems and details, I'll probably use this Rigger Brush. This is by Windsor Newton. Or a liner brush. I have a liner brush as well.  But I like to use a bigger brush, especially with the beginning painting. And then go from there. I'll also be using some markers. These are nice little thin markers. I got these when Amazon had their Cyber Monday sale. They're called Mugain pigment liners. I can't say any of these names. And they come in various points. So if you need a thick point down to a really thin point, I want these wildflowers to be very delicate. But I'm going to be using probably this thinnest one. And probably use this to get some of the little leaves and stems. I want this to be really delicate and light. And I'll also be using right now this little 5 by 7. Well, I think it's a 4 by 6 on the inside, but it's 5 by 7 on the outside. What I'm going to do, I love marking off and having a little edge around my watercolor painting.  I'm just going to make a pencil mark here. As you could use this to make a gift card or a card you want to send a family member or a loved one. And I think this would be really fun to have some mailable watercolor card creations. Now I'm also going to be using a product that I recently purchased. And I think it's called Washi Tape. I think they use these for like crafts and scrapbooks and stuff like that. But I've just been a fan of seeing other people use them so much because they're just so darn cute and creative tapes. Now it didn't come with this wooden dowel thing. I actually was using it to hold some paintings. I think it's a dish dryer. Oh my goodness, I love this one. Aren't these fun? Alright, so here is my 5 by 7 marked off surface. I'm going to use my cute little tape to outline it. Again, it's just because it's cute. That's really the only reason. And it's kind of hard to find the edge here. Let's do it. Got it. I don't have any nails. I have never really had that desire or I don't want to take the time or money to do it. Alright, isn't this cute? Wow, I love it. I truly had so much fun with this whole painting process. So here we go. We're ready to get started. Now when painting intuitively, it means you don't have to really have everything all detailed and it kind of de-stresses you because you don't have to. What I did is I found some floral images on unsplash.com and you can follow along with my painting but there's not really any one reference image that you'll need to follow. Again, this is intuitive painting and you'll learn more about that as we go. Even though this watercolor palette has this nice little mixing tray, I love it and I use that often. I've recently started just using a white plate. This one I need to clean off or dry off. I have some water on it and it just gives me the freedom to put my colors. Sometimes I'll even do it in like a color wheel arrangement. When I'm mixing them up and I can add a lot of water to one if I need to. Another thing I like to have is paper towels. I just get about three or four paper towels. I fold them up like this and usually just keep them near me. The reason for this is you want to control the amount of water. If you want something to be really light and luminous so the white of the paper is showing through, you need to use a decent amount of water. Say you get a lot of water on your brush and you want something to be a little more rich in color then you don't want as much water so you dab some of the water off on your little paper towel. So that's for really the value and color control when you're using the paper towels like that. It really works well. I also like to have two containers of water. Recently I've been doing this. I saw some artists do it a long time ago and I'm like, you know, I need to do that. You can rinse out your brush in one and then you've got clean water to start fresh again. You don't have to change your water quite as often when you do that technique. All right, so here we go. I'm going to get inspired. I may even add some texture to this and have some fun just with paint. So I think what I'm going to do, I think I want to create kind of a yellowy cool background color and then add my flowers on top. Really light again, super, super light. So I'm going to create the background first. I'm going to use some colors. I think I'll use almost like a yellowy green and this palette has some nice colors. It also has some metallic colors. Look at that, or they're called interface. And I did a little sample of those, of course, on the watercolor guide that they gave me. You can see the shimmer, shimmer, shimmer. They're all on this side here. This whole side is that shimmery paint and it really applied so nicely. But I happen to remember from another set of metallic paint I bought, they work great on black paper too. Oh my gosh, isn't that fantastic? I love it. All right, so let's mix up some pretty yellowy green. I love this color, but I don't think I want to use the sparkly ones for this. So what I'm going to do, I liked this yellow green, but I want it super pale. I think I'm going to mix a little bit of yellow with this green and really get it super light. Really super light. And then I might, I want to warm it up a little bit. I might add a little bit of that olive green too. So let's give that a try. From this point on, I'm speeding things up a bit. Now, if you're a patron of mine, you have already gotten the early release of this tutorial in all real time and all live commentary. I talked literally while I was painting through this entire process, describing all of my colors and everything. But in this free version, you'll still get plenty. I included my palette and my plate right next to me so you can literally watch the colors that I choose. And that's very helpful. If you want to paint along with this, I mean you can buy the exact products that I have in everything. So again, if you're a patron, you get to hear my voice and everything as I was explaining all of my steps. But you get lots when you're just on Monet Cafe as well. No worries. But I am going to give you some voiceover commentary here. My goal was to create a very, very light and luminous background. I had envisioned yellows, earthy yellows, and teals. So I was kind of neutralizing the yellow that's the second one down from white on that far right. It's really intense. It was too lemony yellow. So I'm adding some of the little browns. There was one color that is kind of a golden color. I really liked it. It's not the yellow ochre one. The one that looks kind of like Dijon mustard there. That yellow ochre is always very opaque. It means it doesn't have a lot of ability to see through it. So I wanted this to be light and translucent. One of the beautiful things about watercolor paper is the ability for it to look light and bright. So we don't want to lose that too soon. Now I'm trying to find one of those pretty teal blues. Aha! That's it. It's actually called Turkey Blue. Now I mentioned that I love this set because it has a lot of the traditional names like Ultramarine Blue, Cadmium Yellow, Prussian Blue. Many of your traditional names. But I never heard of Turkey Blue before. But I mixed some of the Turkey Blue with a little forest green. So this is what is inspiring me is this color. Intuitive watercolor painting. It's not really about recreating the actual image.  And as I work here, you'll see that what I do is I allow the shapes and the things that I create to guide me, to take me on a journey as to where I see images. Have you ever... There's actually a scientific name for this.  It used to be, for me, it was a shower I had that had travertine. Oh, here. Let me pause that story. I'm going to be using some props. I got some saran wrap. I got a little toothpick. And I even got a chopstick. Okay, you're going to see me use these. That's one of the fun things too about intuitive watercolor painting. You can just have fun. I'm going to be using some salt too, which gives a kind of a neat reaction to watercolor. But anyway, sometimes we can see images in things like stone. Like I said, I had this travertine and I always saw all of these images just how your brain puts things together. And that's what happens with intuitive watercolor painting. Also notice how I'm laying my brush on the side. I'm imagining a really sunny day. And I loved that cool feel that I had with the yellows and the teals, but a little bit of neutral warm green too. I'm even rolling my brush. But one of the goals here is first to create a background that's inspiring and fun. We're really just letting spontaneity guide the process, which is just so much fun. I have a tendency with pastel painting to go a little dark because with pastel painting, most of my tutorials on my channel are pastel painting. By the way, leave me some feedback. If you want more watercolor painting tutorials, I love watercolor painting. Don't worry though. Sometimes I have some of you guys who are like, please don't stop pastel painting. That will never happen. Okay, so just leave me some commentary if you'd like to see more. I like watercolor painting because it's just so fun and relaxing, especially this intuitive approach. Okay, I forgot what I was saying before. But I'm using now some earthy colors and I'm just making shapes and marks. At first I had a lot of water. Now there's that yellow ochre color. And first I had a lot of water. Notice how it looked very pale. And that's, for me, with this approach a great way to start. And so now I'm rolling and I'm moving my brush around. And before you know it, you start to see some shapes that were reminding me of wild flowers. That was my vision that I had of what I wanted to do with this painting. Light and happy and fun. Alright, this is a technique that I love to use, very intuitive. It's a splatter technique. I literally get some water and paint on my brush. You need enough water for it to splatter. And I tap it onto my finger. What I love about that is the marks that it makes are very spontaneous. Sometimes when we try to make marks for flowers in a field and we dab, dab, dab, dab, we have a tendency to pattern those marks. Well, just let spontaneity do that for you because it will create a much more beautiful and lyrical style of where your placement of leaves and grasses and flowers are. Oh, I added a green that I don't normally use. It's almost like an artificial green. You see that? I think it's like a phthalo green. But in this painting, I kind of wanted to play with color. That is another benefit of intuitive watercolor painting.  And so you put it down. And we're not following reality that much. Again, grab some images that inspire you but let the spontaneity of the water and the color guide you and then just use the images that you see as possible reference material. Now, you could use other mediums besides watercolor for intuitive type of painting. However, for some reason, I find that watercolor lends itself to this so beautifully. And I think it's because the water. Like I said, let the water take you on a journey. Often, I will... I didn't do a lot of wet-on-wet painting. Wet-on-wet technique is when you wet your paper first, then you lay some color down and let the color just flow. But that is one technique that's really fun with intuitive painting. You let it just flow in the water. Again, that's why watercolor is a really wonderful medium for this type of painting. But it's still, even though I didn't do a wet-on-wet technique, I still just let the water kind of flow and guide me. It still dripped into places that were unexpected. Now, this is fun. What I did is I put a little water in the turkey blue, little palette there, and I laid my chopstick in it and I rolled it around. Now, why would I do that? I'm using my brush now to soften the edges. Why would I do that? Well, for one, it gives more intense color, dipping it right onto the watercolor little place there. What do I call those? Little blocks, palettes? I don't know. In the little square there. And more intense color and it gives a linear feel versus a brush. No matter how hard you try to do a little brush on the tip, you won't get the linear feel, like I'm doing now, with the toothpick. I found I needed to roll the toothpick in some of the wetness of the paint that was on my plate to get it to flow a little bit. Now, a little more splatter. Again, adding to that fun spontaneity of this whole piece. And before you know it, you'll start to see branches and twigs and leaves. Now, I just smushed up some of my saran wrap. I think I had seen this from some other artist a while ago. Sorry, I'm bouncing my whole desk here. And it did, you can't see it much here, but it did give a little bit of a pattern to it. It probably would have done it even more if my paper hadn't already dried as much as it did. So do that technique if your paper is a little bit wet. And again, you're going to see shapes and patterns of things that are just fun. Now, I wanted to add some beautiful pinks. And I turned my brush in different ways. You'll notice, a lot of times I'll turn it, lay it on its side or elongate it and pull upwards. So I'm just playing with some little strokes of color. And now I'm starting to imagine these tall pinkish flowers that are almost like the shape of wisteria. But I'm so bad at my flower names. My mama, God rest her soul, would be like, Susan, didn't I teach you more about flowers? She was the expert. All right, so I put some salt on it. It was a little bit wet. You want to do that if you're going to use the salt technique. You want to have your paper more wet. And it did give some texture to it, which was really, really cool. So play around with some salt. Definitely let it dry first before you brush the salt off and start painting again. And now it's where I'm going to use my little thinnest black marker that I mentioned. I've zoomed in because I'm not using any paint at this point. First, I'm using a Faber-Castell hard lead pencil. It is HB. H stands for hard, I think. I can't remember. But anyway, I'm using it just to get an idea before I commit to the black. And I'm just using a combination of just linear and almost geometric strokes. I don't want those curvy, typical grass strokes. So I'm bending my grasses and just getting a feel for how I want these flowers to grow. And there is no right or wrong in this. That's another fun thing. You don't have to feel like, oh, I messed this up. No. Every painting is a winner, especially if you learn something. That's my motto with painting is there are no failures. And it's really become, I used to be very hard on myself. I still am. I mean, I got to be honest here. But I have learned to relax and enjoy the journey over time. I think it was self-preservation. I had to learn to do that myself. I'm always preaching that. All right. So now I've got my black pen. I'm just going over and making little ideas of leafy grasses and branches. Again, find a reference image just to inspire you for certain shapes. You don't have to put them where they are in the reference image. And now with that tall flower, I'm adding just some little circular marks. I want to keep them random, even giving some spaces in between where they're growing, different sizes. We don't want a pattern. We don't want boring. We want wild and free and spontaneous. Also notice how I'm holding my pen on the back and up high on the pen. That's going to help your marks be more gestural and random. I'm making some large leaf shapes. We don't want all of our shapes to be the same. Again, that's another great reason to find some reference images and go, oh, that's a neat leaf shape. So vary your sizes of leaves and shapes and just get in something that feels organic, free and loose. And then when you get in enough of your marks, you can totally do this with a pencil. You don't have to get these black markers. Then we're going to go in and fill in, well, not fill in because we're not really filling in what we're painting. We're just letting it inspire us as to where we put colors. It's better not to just go in and fill in where all those shapes are. Let it run. Let it go outside of the lines. I mean, when we're kids, they say, paint inside the lines. But no, as artists, we don't paint inside the lines. We want our paintings to feel impressionistic. Well, if you paint like I do or you like that style, impressionistic painterly and lost edges, it's called, where you don't really have tight bound edges. I'm claustrophobic, so I don't even like the thought of tight bound edges. So I love a loose style of painting. So now enjoy. While I continue to work on this, we're all set to start adding the color that's a bit less water to paint ratio. In other words, the paint is going to be more brilliant, purposely created that loose, very light value background. And now we can start adding the color. Again, not painting inside the lines. I'm adding a combination of pink and purples to these flowers and really just enjoying this. Now I did, like I mentioned before, my patrons get all of my content. It's not sped up. I'm talking this entire time. I'm telling you the colors I'm using every single thing like that. If you'd like to become a patron, I always say, you know, to get the extra content, but a lot of people support, it's only $5 a month. You can cancel it anytime, but a lot of people support my Patreon page just because they like the fact that I'm bringing all of these free videos. I'll never stop bringing the free videos. So God bless you if, you know, you're supporting this channel because of that. I get so many beautiful comments. I got to tell you it blesses me so much. People who are from other countries and say I would never be able to paint if I didn't have lessons on YouTube and they're so grateful for the free lessons that I give. I give a lot of instruction even in the free content. So God bless you for your support. Again, my patrons, you're going to get the whole kit and caboodle. But right here, I'm going to start adding some music and you just enjoy, you could still follow along to the music and I'm going to be back.  All right guys, you enjoy. I'm going to try to find some nice music for you and a lot of people ask what music I use. I have to use copyright free music but I try to find songs that really kind of match the content of the video. All right guys, enjoy and I'll be back. I don't know why I just felt like there should be a couple of little bees at the tops of the flowers and I do mean little. So I practiced on a little page and they're very gestural. They're moving and you don't want to draw any attention away from the flowers. I practiced first with a little pencil and then I just added some teeny little marks to give the impression of some bees. I just added two of them. So oh my goodness, I had so much fun with this. I am totally ready to do more of these. I could just take an afternoon with a cup of tea and just relax and do lots of these. I think these would make great gifts. Oh, it's time to take the tape off. But I also think I'm going to not only sell the original in my Etsy shop but I'm also going to make prints of this. I think this would make a great greeting card and some of the other products that I have on my Fine Art America site. The tape came off wonderfully. I thought it was pulling up the paper a bit so I did what I always tell everybody to do is pull it off at an angle and rather slowly and then it keeps it from pulling the watercolor paper up along with it. And once I get the tape removed I'm going to show you how I take this sheet of watercolor paper off of the block. And again, one of the advantages about this product in general is first of all it's 300 pounds. It's a thick paper. It's not going to warp and because it's on this block literally the sides are glued it is going to keep your paper nice and flat. So what you need to do I have a palette knife here you could use a butter knife just something you can insert into the top and kind of firmly press down and then do the same thing the tops and the bottoms are not glued but it's the sides well depending on how your painting is but you just have to remove two sides and then look at that you've got a nice flat thick actually sturdy surface for your watercolor painting. I decided to go ahead and upload it at Pixels site which is from FineArtAmerica.com and it's available as a print you could just get a print I also love their canvas prints they do a nice job with their canvas prints and you can order it these are my prices by the way but I don't mark them up very much I don't know just a few bucks more than that but you could check it out I'll have a link to this is a canvas print here I'll have a link to my site that will offer all of these products in the description of this video oh and they do a great job with frames too I particularly like this frame with it so I could go on and on about all of the products that they have available and by the way you guys if you're an artist you can add products to FineArtAmerica.com as well I believe it's free to start the account and there's a paid version for extra features something like that so anyway I hope this was a blessing to you most of all I hope you'll try it and enjoy the creative relaxing process of intuitive painting alright god bless leave me a comment by the way and let me know what you thought it really helps these videos if you comment, like, and share of course alright everyone god bless and happy painting