 Alright, I think they are just about ready. I do think... let's see here. So I actually switched chat, but it looks like this one stayed alive, which is actually nicer. Let me... just close this one. Let's go with the first one I got. I thought the YouTube chat would close automatically because I basically closed the window that it came from. But it looks like it's there. So how's it going to DevoDessa and BetaGraph in the YouTube chat? And let me shuffle a couple of windows around here, and then we are actually ready to get this show on the road. So make sure I can see all the chats here. Alright, how's it going, see Grover. And also to Liz, happy Friday as well. Should be good there. And I don't think this is not making sound or anything, so we should be fine there. Larry Coats, hello from Boston. Thanks for joining us from Boston today. Charles Birneford, how's the weather? It's pretty nice today. It's nice and sunny. It's a little bit chilly, I think, or it was this morning, which was the last time I was outside. But it's definitely nice and sunny. Clear skies and everything. So yeah, thanks. How about you, Charles? You got pretty good weather there today. Marcus W, hello. Mark Olson, hello. Mark Ambler, DeShipu, hello to everyone joining. Let's do a quick introduction first. So hello to everyone who's watching. My name is Tim, and I go by FOMIGuy on the GitHub and Discord. And the chat, which is showing on the screen down in the bottom corner, is on the Discord, which is at the Adafruit Discord, which I think is linked down there, right? Yeah, I still have the Adafruit Discord URL down there on the screen as well. So head over there if you want to chat or ask questions or interact during the stream. We also have the YouTube chat on the screen there as well, so I'll try to keep an eye on that one. I will say we are streaming on Twitch and a couple other platforms as well, but I am not quite to the point where I can pay attention to all of them and keep going. So Discord and YouTube, I have the chats up, but Twitch and all the other ones I don't. So if you do want to participate or get my attention or ask any questions or anything, the Discord or the YouTube are the two places to do that, not on Twitch or anywhere else for the stream. Head a few short rain showers, I see. New Orleans says hi, David Snowdy. How's it going to New Orleans? Marcus W. All right. So again, yeah, my name is Tim. Go by FOMIGuy on those platforms. And this is the deep dive stream, so we will be working on Circuit Python. I imagine most folks watching this are probably familiar with Circuit Python, but just in case anybody new is catching the replay or anything, Circuit Python is a version of Python that runs on these tiny computers called microcontrollers. I have one of them here called the PyPortal Titanic. This one happens to have a nice big screen on the front of it with a touch overlay. So today I'll be working on some modules for drawing shapes on the displays of Circuit Python devices. But the project itself can be used for lots and lots of other things. Some of the devices have screens. Some of them just have iopins and LEDs and all of the things like this. And so we're writing Python code that runs on these devices to interact with the other electronic hardware that is hooked up. And it is an open source project. So if you think this sounds interesting and you would like to join us in the development of Circuit Python, again, head over to the Discord. All of the development does take place out in the open on GitHub and we all collaborate in the Discord in the Circuit Python dev channel. So if you're interested in getting involved, you can head over there. This website here, circuitpython.org, is where you can go if you want more information or if you're brand new to all of this. And I will mention Circuit Python is an open source project. So anybody can contribute, but it is primarily funded by this company, Adafruit. This is their website, Adafruit.com. So they are paying the folks that work on Circuit Python full time. They're paying folks like me who are working on Circuit Python part time to work on the code and to stream and things like this. So if you want to help support the project, but not necessarily get involved in development, another way that you can do that is by going to Adafruit.com and purchasing hardware from them. They sell the microcontrollers as well as all sorts of sensors and lights and buzzers and beepers and pretty much anything you could imagine that you would want to hook up to one of these microcontrollers. So on behalf of everyone else who works on the project and myself as well, thank you if you do consider purchasing hardware from them. And let me catch up on the chat. So let's see here. We're a little ways back. Regine Maltaeus. I may have mispronounced that. I apologize if so. But thank you for joining. Joe the Magi. Chat is not working. Is it behind? Looks like we're there now. Try to keep an eye on it. YouTube bug most likely. I could believe that for sure. DFG, DFG. How's it going? Thank you for tuning in. So what is this? Sileo? This is your first Adafruit Live. Nice. Welcome. Thanks for tuning in. I'm going to save this video for later. Been enjoying the Discord community a lot so far. Yeah, definitely. Lots of great folks over on the Discord. Everybody pick up the Adafruit PyPortal Titano. If you would like a microcontroller with a built-in screen and a touch overlay, that's definitely a good one. It's got a nice big color screen on the front of it. It also has a Wi-Fi chip that allows you to access the internet for different stuff. So let me start out the time stamps here. I didn't actually take the first one. So let me punch one in. I know YouTube, it really wants to have a 0-0. Otherwise, it won't actually link everything when it comes time to paste them in. So I'll put the next one and say, introduce today's topic. So today, what I will be working on is diving into the core to try to add the functionality to VectorIO in order to have hidden shapes. So this throws out of something that I noticed last week and made an issue for on the CircuitPython core. So it's probably a little ways back by now I'm guessing. So in CircuitPython and DisplayIO in particular, there are things called groups which you can add other objects to in order to show them on the screen. Groups have a property called hidden and the idea is that when you set hidden to true on a group that it will hide all of the objects that are in that group so that they won't get drawn on the screen. So you can use this to create different pages in your applications, for instance. But it turns out that the VectorIO shapes do not actually have support for that hidden functionality. So that is what we are trying to add. There's a video here that shows this text right here, hello shapes, and these actual shapes here, the circle and the rectangle are all in the same group and the code is calling hidden equals true on it and back and forth to false and true and false and true every second or so. But the shapes are not hiding, the text is but the shapes are not. So that's what we are trying to do today is make it so that these shapes will actually hide as well. Let's see here, let me catch up on the discord depends on the kind. Let's see here cupcakes. Dexter, how's it going? Thanks for joining. Yay for Friday, definitely agree with this. Anybody want a cupcake? I'm definitely down for a cupcake. Dealing with a wet cupcake? I like a relatively moist cupcake personally. I'm not a dry cupcake person. Cupcake over ethernet client is broken. Yeah, you wouldn't download a cupcake, would you? I would. I would definitely download a cupcake. The ship who thanks for the sort display group display IO groups by Y position to simulate graphic object perspective suggestion the other day added one line of code and it worked nice. They were cheap from the grocery store ones. Oops, given that was my plan for them. Oh, that's right. Mark showed on show and tell the cupcake with a with a candle and has the robot that puts out the candle. That's right. Worst thing you can do is go somewhere expensive like Switzerland and try some really good pastry there. Yeah, that sounds rough. I have that experience with a few things. You know, one of the things it's not pastry, but one of the things that I have that experience with and it's probably overblown in my mind, to be honest, at this point. But I had back when I was in high school, I went to London. And one of the things I remember from being in London was the melons that they served at the hotel for breakfast, which is such a weird thing. But they they call it a cantaloupe when we were there. And it was I remember it being really yummy. And I was a fan of cantaloupe before. But it turns out actually, I guess that there are different cantaloupes, the cantaloupes that they have over there, the things they call cantaloupes are different than the things that they call cantaloupes throughout at least the portion of the US that I'm in. The one over there was like not quite as orange. And it was just tastier than the ones we have here. And I later learned the ones we have here that we call cantaloupes are also called musk melons. But that is one thing where like I had that cantaloupe over there. And then ever since I've been like, dang, I wish I wish I could get that stuff over here. I don't know exactly why it's different. It's probably just grown closer to over there is my guess. I'm not actually sure. Yes, definitely amazing Chantel. I love the little fire fire extinguishing robot. If folks aren't, folks don't know what we're talking about. Head back and watch the show and tell from this past Wednesday. Keith, how's it going? Hope everybody's having a good day. Definitely agree there. Second that notion. I had this cheesecake thing in Vienna. Not like normal cheesecake and never find anything since. There's millions of melons. Dang, millions of melons. It's crazy. It tastes very different depending on the rightness too. Yeah, that I definitely find true as well. Different times of year, the melons are way better or worse. Sometimes doing a rather pointless project. Yeah, no, totally agree. I totally agree. Stuff like that's always fun. You learn stuff too, right? Even if the project itself is not meant to be fully functional, but beyond amusement, you can still learn from making it. Someday you might want to make something that has a little articulated arm or someday you might want to make something with a pump that pumps water. Some of those skills can come back to be pretty useful in the end, I find. When I play with stuff like that that's more meant to be silly or amusing, but then a couple of months or years down the line, I actually come up with a need and am able to repurpose some of that knowledge. Okay, so this is the, I will say, deep dives return to the core. I think it's been three or four weeks or so now that I've been doing the deep dives and I know for folks that don't know, I should say deep dive about three or four weeks ago is when I started doing this program. Before that, it was Scott Tanduit, the lead developer of Circuit Python, and certainly when Scott does deep dives, he was spending a lot of more time in the core than I am. I tend to work more at the Python layer, but today we are diving back into the core. So for folks that have wanted to really get down to the depths of the ocean, today is the day we are headed back down. And this is what I'm working on. So one thing I want to do is take into account what Warrior of Wire here says, because Warrior of Wire, I want to say their name is Kenny, I'm not 100% sure though, truthfully, so I'll just call them Warrior of Wire. This is the person that created VectorIO. They added it to Circuit Python. So like I mentioned before, Circuit Python is an open source project. This person is just a member of the community, and they came along and contributed the code for VectorIO. And so they ask here on the issue, if you start the application with the shapes hidden, do they draw? It might be sufficient to modify this in the get refresh areas method instead. And he means instead of what I suggested, which was shape fill area. It might be necessary in fact, if memory serves, it would be really nice if this could be supported without adding per shape memory cost. And I assume per shape memory cost what he's referring to would be the property for hidden. Because the way this works on groups and tile grids is they have a property called hidden and you can set that property to true or false. And then they also actually have a property that's not exposed at the Python layer. At least I don't think so, but it is existing in the C layer, which is hidden by parent. So not only is it hidden, but specifically the reason it's hidden is because it was inside of a group that became hidden. And so that's like two extra properties. And I assume what word of wire means with the extra memory is adding those two properties to the shapes. But I do not know if we will be able to get away with not having at least one property. But we'll find out as we dive in. I wish show until it wasn't at like 4am for me. Yeah, it is definitely US time zone based in the time of day. Be interesting, maybe a couple of times a year or something they could do a different time slot that's better for EU or folks in Asia, that might be a good idea. Okay, it's difficult to set a birthday melon on fire, they seem to be self extinguishing. Let's see, is there such thing as sponsoring features for Adafruit devices? Is there a working group that decides where the dev resources should go? Good question. There is, I would say, I mean, Adafruit as a company decides where the development resources that they pay for go to. So for the folks that are specifically being paid to work on CircuitPython, they are focusing on stuff at the direction of Adafruit as a company and which kind of comes from the top down. Limor, Lady Eda, who runs Adafruit and founded Adafruit. There are other folks on the team like Scott, although he's away right now, and Dan and Jeff Hepler and Catney. All of these folks are part of the kind of primary team that works on CircuitPython, and they get together on a weekly basis to discuss what the current focus is going to be. And then as a larger, broader community of both folks that do get paid to work on it and folks that are just members of the community, we also do have a weekly meeting where we talk about what everybody is up to, and that is kind of the place where somebody could suggest a new idea that they would like either help working on themselves or would like some of the folks that do work on the project to try to tackle. So you can always present ideas there, but basically the way it works is like I mentioned, the actual paid work is driven by Adafruit, and it tends to be built around either specific guides or specific new hardware. So as new hardware comes out, there will be lots of development effort around making that hardware work and then making projects that use that hardware, whether it's new sensors or new micro controllers or stuff like that. So hopefully that answers the question a bit. But in terms of the community, you could always just join us on the Discord and suggest anything. Truthfully, it's all out in the open there. Obviously, we can't promise that anybody is going to want to stop what they're doing and work on it. It depends what it is. But oftentimes, ideas that get dropped in the Discord do eventually find their way into Circuit Python. And if you're interested in helping work on it, then definitely head to the Discord and folks are more than happy to help get you spun up on development. The weekly meeting is on Discord. That's correct. Yeah, Mondays at 2 p.m. Eastern Time. The weekly meeting takes place on the Adafruit Discord and the Circuit Python Dev Channel. And then it also gets recorded. So we go to the Voice Channel as well, and it gets recorded and then released on YouTube. So you can watch the historical ones as well. Only missed 16 minutes. How's it going, Zarnolin? Thanks for joining. All right. So let's try this part. I don't actually know the answer to this. If you start the application with the shapes hidden, do they draw? I don't know for sure. So let's try it. This was the sample code that I wrote last week that illustrates. So let's go back to the device. Oh, right. Which one is which? Hopefully, we don't reset the timestamp or here. Also, let me take a timestamp. So I think this is already pretty much with... I think this is already pretty much this other file. Oh, let's see. Yeah, identical. Okay. So I'm just going to override code because I already have a backup of what's in there. And now we have the same test script from the video. So let's modify it to... let's see. What does that mean? I guess we just set it to hidden true before we ever add the... before we ever add the shapes to it. You start the application with the shapes hidden. Yeah, I guess that means hide the group before we add anything to it. So let's do that. And I think why don't we also just turn this off for now? Whoa, looks like yes. Wait, let me scooch it this way. No, let's not do that. Shapes do get drawn even if you hide the group before anything, basically. I created the group and then I immediately hit it. We haven't even created the shapes yet. They get added to a group that is hidden. A label also gets created and added to a group that is hidden. And we do not see the label, but we do see the shapes. So we've answered that portion of it. Yes, they do get drawn if you hide them as it starts before you ever show anything. There's also native fruit jobs board where you can help find there if you want to sponsor a future. Yeah, that's a really good point. Thanks for bringing that up, Mark Komus. That's definitely a really good point. There is the jobs board, which slipped to my mind, and that is also a place. For instance, if you're trying to put forth money or something like that for a specific feature, if you're trying to sponsor a specific feature to get development time and effort, you can do that on the jobs board. So you could post something like that there. I'm muted. Oh, is this an April Fool's Day joke? Surely I'm not muted, right? I haven't been muted the whole time. No, I don't think I'm muted. April Fool's though, so maybe we're getting an April Fool's joke. Either that or there could be a problem, I guess maybe. It seems like a challenge. Oh, but that's to the melon. Yeah, I don't think I'm actually muted. I don't know. I see sound in OBS, although I don't think I have the stream running anywhere, so I might not know. Let's see. I think you should set the hidden property in the Vectorio constructor before you append it. So I don't think it has a hidden property, though. It's hidden, true. Yeah, it says extra keyword argument, 16, so it doesn't have a hidden. We could, I don't know, disgroup. Let's see. Audio is fine on YouTube. Thank you, DFG. I think, I don't know, can you do this hidden? I don't think you can either. I think it's hidden, true. I think that this is a property only and not an argument. Yeah, doesn't work there either. Line 10 this time, which is where we did that. It is weird. Usually when there is a property, there will often be an argument as well, so it may, I don't know if it's intentionally that way or if that's just an oversight or something, but usually you can do properties that way. Or I mean, usually when there is a property, there will also be an argument. You aren't muted. Come in in line and clear. Thanks. Appreciate it. Let's, okay, so how do we tackle this first? So what, let's get back to what where your voyeur said, which was it might be sufficient to modify this in the get refresh areas method instead. Get refresh areas method. So let's pull up the code for this. I'm just going to wipe all this stuff out. Close all. Let's update. We're on main. Let's pull merge. Yeah. Well, that's updating. We can go open some stuff. So this was the place where I had guessed that we might want to modify this. And that guess came because in display IO tile grid, it has this function display IO tile grid fill area. And inside this function it has this part right here where it says hidden is going to be a Boolean variable that's equal to self.hidden or self.hidden by parent. So if either of these is true, then this will be true. And then this here says if hidden is true, then just return false from this function. And that's before anything else happens, which the code after that is where it figures out which pixels will need to get drawn, basically. So by returning true, I mean false, by returning false, before we ever do any of the stuff with pixels, it makes it so that nothing gets drawn. This is my guess at least, by the way. I should say I kind of have a rough idea of how some of this stuff works, but I didn't write any of it. And I also don't really write or read C code very well. So I could definitely be wrong. But this is my understanding of it. So let's see. Local changes were not restored. Did we actually pull? Are we on a good up to date version? So let's find this one where your viewer said modify this and get refresh areas. So first of all, in vector shape, get refresh areas. Okay. Symbols a slightly linked list of dirty areas from all components on the display. I should figure out how to turn this on. This is some kind of debug messaging, but I don't know how to get it to print. I assume there would be a way. Oh, there's a Boolean. I think there's a Boolean somewhere. Actually, maybe I did find this one day. Area copy and tail. Get refresh areas. So does something like that exist over here? Refresh areas it does. Oh, and this does have a check for hidden. Hidden is true. If not first draw, previous area.next is equal to tail, which got passed to us. Return previous area. Else, just return tail. The first draw was true. Then we just return tail. This is all if hidden was true. Else, hidden was false. And self.moved is true and not first draw. This ends up calling bitmap get refresh areas. So I don't know really what this part is doing truthfully. There is a check for hidden here. Get refresh areas. Gets past self and it gets past tail. And it basically hidden is true. It ends up returning tail either just direct or setting it into previous area.next. Oh, well, this one's actually returning previous area. Not I guess tail specifically. Tail gets set into next, but this returns the whole previous area, not just next. Get refresh areas method instead. Might be necessary, in fact. So let's look at group. Get refresh areas. So maybe could we just not have hidden on the shapes, but instead, inside of group, just make it not ever try to get the pixels or whatever. It'll get protocol draw, members, items, I. So we're looping through members. Could we not hear just say like, don't return an area if a group is hidden? Group finish refresh. Group fill area. So I don't actually know, I guess, what exactly were your wires suggesting. Surprised actually that group, or was I in here before fill area? Surprised that group fill area, but there's no logic here for hidden. That seems odd to me. Turn true. Turns false at the end. I'm not sure, where does this get called from? Only vector shape. Draw fill area. So does it get called draw fill area instead, inside of here? Yes. Okay, so I assume that when this is calling, or whatever this is doing, I think this is calling ultimately, but again, I don't actually really read C. So you'll have to bear with me a little bit if I am basically talking nonsense about what this does. But my guess here is that draw fill area, when it gets executed from here, assuming it does get executed from here, is basically ending up calling vector shape fill area, which is here. Which is where I had initially thought about putting the hidden logic. What if we fill area? I mean, group fill area. We are inside the group, right? Self is a instance of group. Could we not just check for hidden here, and then if hidden is true, like just not do some any of this stuff? Let's get some prints going. Actually, let me figure. Okay, first of all, what did I change already? Undo. Undo. Save. Okay, it's not actually different. Let's try to turn that debug thing on. I think I actually asked where or why are about that at one point. I don't remember for sure. Vectorio shape debug. How do we turn this on? That's not very useful. So this is set to empty basically, but if you swap it to this, then it will actually print. That's my theory. What is this? Oh, where are we on circuit playground? Oh, you can't move these. Oh well. So we want to build for this pie portal, Samdee. No, Atmel. Maybe this. Whoops, make board clean. Whoa. So probably we need to do some things to make this environment better. Like, let's start with this. Let's provide a board. Probably something in my repose out of date. And that made it not build. That's my guess. Whoops. Cascade tunnel. Maybe wrong version of click. What are we up to on click? 80. Are there two? I guess we just have click. 812. So this is definitely newer. If anybody has built circuit python in the last week or so and recognizes this issue and knows the solution, please do tell. I think typer from click, not import. Okay, open four days ago. You know, some projects have all of these like boilerplate stuff in the issues. And it's nice in some ways, but it also makes a ton of stuff that's like not, we have to scroll down past a bunch of this, but it's I guess better because it's there for the maintainers. It's all the latest versions of typer. Do we not have typer? We have .04. Okay, or .40. I guess I saw something similar once and was missing a python library the compiler was calling. Is there like, let's go check out. It's always good to check out this. Maybe there's a new step. Okay, but we're not. I don't think we're building that right now. Do I need a newer one of these? This is 2019 Q4. These are all the things that you get to not deal with if you code circuit python. Python code, I mean. Oh yeah, this does say 6.1 and later use this, which is definitely I guess not what I have. Although I don't know how to install this. I find Linux difficult to install. There's too many ways to install things, I should say that. Some things you install like with apt, some things you install with go online and download the file and run it. Some things you install with like go online and download the file and run some command. I wish there was a more unified way to install things on Linux. Easy to file. Looks like I've downloaded this before though, so why did I use it before? Unpack it and set the path to that directory. Let me see if I have one unzipped already. I do have one, so it doesn't get installed. This needs to be unzipped. I think, hmm, isn't it, is this not, isn't Bashar C in home folder? Is this where your path is set? Or is this where I added this thing to my path? Yeah, this isn't showing hidden files. I swear I've turned this on before. Oh, that's not duplicate. So it looks like I copied this into my home directory. See, this is part of the problem I run into is I get stuff loaded and then I don't ever touch it. Like, I never have to touch this. I installed it once when I started and I have no idea how I did it. It was over a year ago. I have no idea what I did. It looks like though, Ben, it looks like I must have copied it into here. Right, okay, so I just put this whole, okay, so let's take this. Oh, put this into here. Grab the name of this. Paste it here. Now, make that tick effect. Same error, sorry. Also, I was not paying attention to the chat. Let me scroll up. Press Ctrl R in the terminal type path to see if you add in your command history. Got to find those packages as deb first. Yeah, I have found deb. I don't know what it's called, but I can double click to install deb. Is that Xarnolin? Do you know dot space dot bash rc? Is that the same as source? I've noticed recently that some things I use source, source space dot bash rc. Also, Python environments, I use this for. Source, I think, right? Or, yeah, I think so. Activate? No, maybe not. I don't know. Anyway, the question is, do you know if source and dot space and then a thing is the same thing or are those two different things? Tech and Mormon, is that Linux? Yeah, it is PopOS Linux, yeah. Which distro, yeah, PopOS is what this is. Although I've added a boatload of things to make it different. So it's not like stock PopOS, but I imagine you're probably familiar with how that goes. Source and dot are the same command. Okay, thank you for the confirmation on that. I was thinking that that was the case, but I don't actually know. Old school, so I learned dot space. Yeah, they seemed interchangeable. In the different examples where I've seen them used, they seemed to do the same thing. And I got to thinking they were interchangeable, but I never was actually sure. I haven't done any, I don't have any like formal training on Linux. And I kind of, I suffer from this thing where I will learn literally exactly just enough to do whatever I'm trying to do right now and then like not really learn anymore. So a lot of stuff with Linux, I was forced to learn in order to be able to use this computer as a daily driver. But like, I don't keep up with it, right? A lot of the stuff I installed and set up way back when I started and like, since I didn't, since I'm not using those skills of getting it installed and figuring out where stuff's at and knowing how all these things work on a day-to-day basis, they escape me. Not an important name. So let's, let's also, I guess, let's see if anybody in the Circuit Python Dev has any ideas here. Manbash, I should do that, yeah. Who actually has formal training? That's a good question. Yeah, I don't know if there is. I should look into that, honestly. I would like some like formal training in just like general Linux literacy. I feel very, don't really know how a lot of stuff works, but I generally can get by by Googling and trying to follow as best as I can. There's a Harvard X course on Linux. I should look into that. Done Linux courses through work, but most of the time they're super high level. Good if you're a beginner, but that's about it. I theoretically should, but I grope for Dash Help all the time. Linux Foundation does training too. I should look into that one as well. Okay, so we'll check back on that in a minute. Cascade Tommel, 031, 033. All right, all right. No dice. Same problem. Okay, let's look back at this page. Install the latest version of Typer and click. I think I'm done. 812, which is two more as of the time of this writing four days ago, which is interesting. 040. Okay, this is promising. A lot of this stuff matches. Mine is PopOS, but it's built, I think, on Ubuntu or else is very similar to Ubuntu. This is the version of Python I'm using, so lots of this stuff is matching. I think this will be fixed in 375. This is closed. Bash is our savior. What is it that you're doing exactly? It wasn't falling from the beginning. Please explain. Yeah, for sure. So we are, I mean, specifically right now, I'm trying to build Circuit Python with the larger goal today being trying to build Circuit Python so that we can make these shapes that we're drawing on the screen support the ability to be hidden. Lots of the other things that we can draw in Circuit Python have the ability to be hidden and shown, but these shapes right now do not. So we're trying to modify the core of Circuit Python to do that. And specifically right now, I try to turn on some debugging print messages, but I need to build Circuit Python to get them to take effect. And so we are trying to build Circuit Python. There is an issue with this exact version of click and type are used to see requirements, text file, or what is required now, but the type or person fixed the problem. So if you upgrade type or it should be okay is 040. Thank you to Dan H, by the way. Dan H is one of the other core developers. Dan H has helped me fix broken devices and broken builds and broken things. More time that I could count on any amount of fingers probably. Dan H is literally a savior if you want to do stuff in Circuit Python in my opinion. Linux Foundation, probably the first place to look. Okay, let's look in requirements. Oh wow, there's a bunch of them. So click we need specifically this. Can you do this for something already installed? Yep, looks like it. It has not failed yet. That looks much better. So let's not start flashing our device just yet, but I'm going to say it looks like we might have a successful build and indeed we do. So let's do start flashing our device yet. So now we have built Circuit Python double click reset to go to bootloader mode. Do it again because we didn't get the timing right and CP build. I'm like so lost when I can't tab complete. That's not true. I know where it's at. I just want to not type it because I'm lazy. Is it this? Okay, so do we have more prints indeed? We have a lot, a lot, a lot of prints. Suppose now the question is though, do we actually want all of these prints? And I think kind of the answer is actually no, truthfully. Because that's going to scroll so fast, I'm not actually going to be able to see stuff happen. So let's put this back and let's instead just use printing. I do notice here's the print statement though, which I don't have committed to memory. So that's helpful because I usually copy it from an old branch that I worked on. So let's go here and let's go this inside group fill area. I don't know how the new lines work with this. I think you have to supply your own new line, but I don't know if you're supposed to do it at the beginning or the end or both. Sometimes I get weird results when I do or don't. Haven't actually done it enough to know the actual like real rule. Okay, we did something wrong. Oh, still did something wrong. Oh, I didn't save it. I have autosave turned off because I use pyterm on circuit python devices and it runs when you save. So I have autosave off and I'm getting back in the habit of control s-ing. Cool stuff. I work at a company that's made a new processor and I worked in on Indian language fonts. Great stuff. I'll stick with the stream. Nice. Thanks for hanging out. Let's see, PapOS is on Ubuntu 21.04 at the moment. Yeah, I think that's true, although I will say I think that I'm still on 20 something. I did not actually do the update to go to the newest one. It reminds me every day and I decline it every day because I have a sneaky suspicion it's going to break a bunch of my stuff and I don't want to spend like an entire day or half a day floundering around trying to fix everything. So instead I ignore it and hope the old version keeps working for a little while longer. I think what I'm going to end up doing actually is buying a new desktop. This is a laptop that came from System76 and I like it for the most part, the hardware especially. So I think I'm actually going to end up buying a desktop from System76 and then on that one I think I might actually just get Ubuntu loaded from the factory instead of PapOS. PapOS seems pretty cool but I had to do so much customization. I really want more stuff to just be how I want it out of the box. I don't know if Ubuntu is actually going to have that so like maybe I try Ubuntu and still have to customize a bunch of stuff and maybe one day I switch back but I'm like fingers crossed hoping that like more stuff that I just want to work will exist already. I want a start bar like thing like this where I can look at all the programs that are open and I can have hot shortcuts pinned. I want to be able to control my volume from inside this thing which I don't feel like it's too much to ask for but like both of those I had to install some kind of plugin or something and the audio one gets messed up every now and then doesn't let me actually change. So we are getting our prints here so can I print instead like the value of self no self and we don't use that we use this thing right hidden can I print this can I just add like this I don't probably can't do this and see can I I don't actually know maybe we can seems like it's all right uh whoops accidentally paused the scrolling here let's see looked at danh tips for python github very handy if ccota can be either new line at the end or new line at the end at the end or the end at the beginning or the end 28.04 is LTS probably not nope on the bar nope on the volume choose a different desktop that's a bummer. Do you have a recommendation by chance if you use Linux to fair amount or if you know of one that has that stuff I'm all ears because I do like I would love to not micromanage all of that stuff I would love for that stuff to just work out of the box ideally or not if not out of the box then like with the least amount of me setting stuff up as possible because it's kind it's like stuff I just take for granted with my computer and I don't want to like work on it basically I don't want to have to spend that much time on it oh that's weird do booleans not print or huh so we were spamming oops why were we why do we not get inside fill area why do we not get anything else printed I'm jaded I use kde and neon I'm just gonna care invalid operands to binary I think I cannot just plus these things together like this let's start with just one of these how do I print a boolean I wonder if we could do a number higher than four this is like the number of cores it uses is that right neon kde oh okay it's printing but it's not actually printing anything oh wait no it's not it's not printing this one is making an empty line but we're just not seeing this one happen that's weird would we not see that one oh neon kde okay has a star bar I do like my star bar on the top but I guess that's probably changeable looks like it has applications pinned on it so that's a good start I see a volume thing here I guess part of my problem with the volume thing is I have different like outputs sometimes I want volume to come out of headphones that are plugged in sometimes I want whoa volume how did I even do that oh I really hope this does not shut down in 60 seconds I don't know what I just pressed anyway what I was saying though is that it uh really I guess what I want up here is the ability to switch outputs like switch between the HDMI versus the three and a half millimeter that's plugged into my microphone versus sometimes I use bluetooth headsets um I don't want to be able to easily switch between them beard why is the spacing different hmm you can do that sound nice pretty sure printf is going you want you to use a format string specification and I think double quotes plus curly braces zero one gonna print a space or whatever the next ascii character is jay is the number of jobs to run I noticed that circuit pythons make sometimes broken with parallel jobs oh interesting place had pretty good luck with it I only learned it like two weeks ago though honestly you can't do that with sound okay that's a good step maybe I'll give that one a try it's gonna want me to use a format string specification so we give it one of these numbers like a replacement thing I see throw it in a VM to try it oh that's a good idea and I don't have to like get it all set up for real can kind of just play around for a bit and see that's a good idea or maybe they have a uh like live boot or whatever maybe I can like live boot it without installing it what is our code right now weird why would these be changing eventually they stopped oh when I control seed no before I control seed no when I control seed okay why would that be going back and forth I guess um are there two groups maybe this is for two different groups so I created main group and I showed it uh label label extends group label extends group turn this off whoops and this and the label is not hidden but the main group is if I stop pressing anything stop scrolling if I press control c scrolls a bunch of times but it doesn't give me a ripple if I try to type it also scrolls it still doesn't give me a ripple am I in the ripple d doesn't seem to do anything oh that time it looked like control d did okay yeah I think that was the problem the label was the zeros the one was the main group and the main group has hit into true so true is one false is zero so we can access self hidden here and if I change this code let's just make sure I actually understand this if we don't put this to true then all of those things will print zeros instead I don't know what it's doing with the control sees and stuff yeah we got zeros instead yeah okay okay okay so hmm could we just not do all of this entire for loop if the group was hidden that sounds dangerous but let's give it a try how do I write if statements some if statements are like this hashtag if but some if statements are like this well like Java anybody know what that's all about I imagine probably lots of people know what that's all about I don't know they all they do have live also nice I'll figure that try have a look at deep in OS D E E P I N OS I'll check that one out as well except we want false I don't know this feels too easy right there's no way this no way this like works and doesn't cause other problems I think probably messes up something with the display that's my guess the commands that start with hashtag are a preprocessor commands they happen at compile time okay so hashtag if when you compile this basically gets replaced with the actual value true or false whatever this is okay that's good to know thank you by the way preprocessor stuff got a successful build okay that's half the battle and we're currently hidden or not hidden forgot which one I say oh must have been hidden true it's the last one I say because we got ones too fast we have no shapes that's fancy let me turn off the prince let's do one more build like this and then with this build I'll go back to setting hidden true and false see if our shapes appear and disappear see does not care about and dense no no oh I might have been wrong about the way it uh looks stuff in didn't realize it was a compile time flag I've used it to define logging levels for print statements if debugging kinds of things hashtag if something and if only gets compiled if something is true oh okay everything inside of it it's not that it basically replaces this with the value it's that if this value is not true then just none of this stuff actually makes it in the build that's what I think that I understand from what you said okay preprocessor stuff interesting it's an interesting concept oh they're showing did we really just solve this this seems way too easy I don't trust this at all we spent way more time trying to get the build environment back to working than we did trying to actually code this okay yeah yeah it doesn't work here so it's not going back and forth okay that's printing so this is correctly alternating and it does work it does draw if the group is showing when it gets created and when it gets shown sleep for three seconds make this true so it doesn't allow it to change interesting okay well this is kind of good because I didn't I thought this wouldn't be this easy feels like it was like we're part of the way there though right hidden equals false then do all this stuff so if hidden equals true all it does is return false it's weird that it works initially correct on the hashtag f stuff c turns all code into one big honking line and then parses it for the compiler white space and code formatting is for human readability allegedly can also serve for confusion I'm rusty at see what I do remember the classes in c compiler design they teach in the dark with a flashlight yikes does it need to redraw yeah it's possible um what's weird is I don't get why I mean I would think like this stuff would basically redraw it I guess I don't know for sure but I kind of assumed that like it calling fill area here and fill area here for tile grids and fill area here for group I kind of thought this was the redrawing and so I figured if hidden was equal to false that it would go inside of here and do these drawing things what happens when we set hidden on the group do we need to like I mean surely it does already tell it to refresh or something right like tell it that it's dirty set hidden by parent submit it as quiin line it was a really cool I don't know the video though I'm not going to remember the right person there was a really cool video on YouTube I watched one day that was about obfuscated code and like writing code for the sake of the code looking interesting or cool instead of for the sake of what the program does um it was a really neat it was a really neat video in the video they basically had like this big old chain where like the first program outputted a program in a different language and when that one runs it outputs a program in a different language and that one runs and it outputs a program in a different language it was like this whole chain of like 20 languages and then the last one outputted the original code from the first program um and so like it went it wrapped around through a bunch of different languages and it was like a program that just printed its own code I think it was like ASCII art too I think they talked about this obfuscated code thing in that video uh where does get I mean where does set hidden occur so isn't there a set hidden so if you're setting it to the value that it already is then just return and don't do anything after that set it to the new value if hidden by parent was true then just return before we do anything else if we make it to here we're looping over the members we're calling set hidden by parent and telling it the value that we got passed so if we are calling hidden equals true then this is going to pass true down to the children then continue on to the next iteration this one is for tile grids and this one is for groups there is not really anything in here though that's like if hidden is false then tell it it needs to refresh that happens well there are some files in the tree yellow slash green um if you mean the tree like this stuff over here uh blue which is what color it appears to me is modified so like this one here is blue although it's white when I highlight it but when I take it off it's blue if that's the one you mean I don't know if maybe that's coming through green from the stream um but those are modified which is what the ship who said and they're blue specifically meaning like if I were to push right now uh or make a commit right now specifically these would be the things that change in that commit uh and then the yellow ones like this um or maybe you were asking about the same ones maybe yellow green because this is like a yellow green color that could be um these are git ignored so these are in the git ignored file and they therefore if we change stuff inside of them they won't they won't get pushed higher up the tree okay yeah I think it's probably the git ignore ones so maybe we need to do something else uh instead of maybe we need to do something in the else branch of that code that we just had what was it get areas or something refresh areas get refresh areas hmm maybe we should have the if statement here instead what was the other one areas draw get refresh areas hmm where's the code I changed fill area let's try this get integration stuff yeah that's one of the main reasons I really like pycharm is very easy to use integration with git I didn't I've gotten better at like actual command line git but I'm still not that good um and the interface that's in pycharm for managing git and choosing lights what what's getting committed and what branch it's going to and all that sort of stuff merging especially merging and resolving conflicts um they have a really really nice interface for why did this never print but not save it maybe I didn't save it would you consider doing a learn guide on setting up pycharm for circuit python I would definitely but I do think what catney says is definitely relevant um there is some stuff uh in the welcome guide which is actually stuff that I set up in that guide and it's I wrote that that page and it is like the exact setup that I used it is I think it's hidden under one of these maybe yeah this one this page has a link this too this page has my exact um process everything that I set up the like high level recap of it is disable autosave create a local project on your computer and then add circuit pi as content routes and what I actually did was add media add slash media as content route that way any thumb drive shows up as part of my project even though it's in a different location than my project this saves it from writing like dot idea files on the actual device which take up space and causes to reboot which we don't want uh circuit python stubs are super helpful install all the libraries you use with pi pi and then I use to to connect to the terminal um and all of that stuff makes developing circuit python code circuit python projects specifically much nicer I will say I'm also doing like C development in pycharm which is absolutely not what it is meant for uh but it works so and I'm used to it so it's what I'm using I tried C lion which is the pycharm company IntelliJ they made C lion as a different IDE that's written for C but there really wasn't like that much upside over pycharm like it I didn't really find it doing things that pycharm didn't so I just kind of switched to uh back to using pycharm okay I must have not saved that file because this time it did print not hidden not hidden not hidden all the way up until we actually set it to hidden although shoot why did I do that are you serious man I can't believe I just copy pasted I didn't change the print so we don't know which one is which okay one more try that's not true we'll probably need more than one more try but one more try right now the guy needs a refresh on some screenshots I did get it going yeah definitely leave uh feedback in there I set up that whole guide I will say too though I don't update my pycharm very often so like the screenshots that are in it are from my version of pycharm which is like 2020.2 and I assume there are newer ones by now I just don't update my pycharm very much because like I use pycharm every day for my job and I have this thing with software where like new software tends to break things and I don't want to spend part of my day fixing pycharm because I need to use pycharm to work so I don't update it very often in fact I don't think I've ever updated it on this computer I whatever version was out when I loaded up this computer that's the one I still have so the screenshots could definitely be out of date I would believe that for sure Olaf from the Colorado loved the factory nice thanks for tuning in all right so now we're loaded here wait what interestingly a bunch of this stuff runs when I press ctrl-c I find strange but I guess the the REPL is a maybe the REPL is a group also yeah maybe the REPL is a group also and whenever I press ctrl-c it's printing the the three like less than thingies and that's causing it to update which is causing it to call all this stuff I don't actually know that's the case but that's kind of what it feels like okay so I did press ctrl-d and it does print all of this stuff up until hiding and then it does not print that stuff anymore so I wonder if we need to return true instead of false it's almost like it's almost like we set hidden to true but then nothing told display I owe that the currently showing stuff is out of date I wonder if we I wonder if we like make something else happen it will cause it to refresh and notice that it's supposed to be hidden let's try this after we hide it we make a label and append it to the same group so one thing is that does cause it to keep calling this over and over although why did it not keep calling this over and over anyway actually come to think of it it should have been doing this the whole time should it not this shouldn't depend on this interesting so this makes it when we do hiding here it makes it so this doesn't keep getting called but if we just make a label and append it to the group and it does keep getting called interesting but it did not cause the display to refresh if it ain't broken don't fix it yeah I'm very very much a if it ain't broke don't fix it type of person especially the I will say especially as it comes to like my computer and the stuff I use to work on day to day what if we after we call this what if we said circle dot y plus equals 100 do we see it move interesting what about one okay so as soon as we make any change to a shape then it notices that it's hidden it stops drawing it and this time it will go away and then when it reappears it'll be down here well we need to make a change again need to make a change again need to make a change again I bet oh yes it didn't wait long enough okay okay so we're close we when the group gets hidden we need to tell the shape that it's a dirty area or else the group needs to know that it's a dirty area or something basically the when we're setting this to hidden it's not knowing that it needs to redraw therefore it's just staying how it was which is showing if we change something like the position the why position is what I'm changing but I suspect we could change anything then it notices that the thing changed and it knows that it needs to redraw it and it doesn't get drawn because it's hidden but we need to figure out how or why changing this causes it to know that it's dirty and redraw it interesting so what makes it know that it's dirty on on dirty don't have a set y that doesn't do very much self dot y equals y dirty area we're used by group to know where it needs to redraw on layer removal for now just always redraw shape set dirty yeah we need to call this but it doesn't feel right the group would be calling this does it doesn't feel right the group would be calling this and so far all the code we've changed is inside group will change finish refresh will change equals false partial change needs refresh I think I broke the refresh yeah I think you're right what if you don't make a change to the shape but add another shape entirely so I think that that will not cause it to get redrawn because I was adding a label which is not a shape to your point but I do think should do roughly the same thing as if we were adding a shape let's try it though for sure so after we set hidden to true circle another another actually just other we have more colors no let's go lower yeah oh it did work it looks like it worked at least but only the circle no why would it be why would it be only the circle radius let's do 10 and then let's do 140 oh I can't control c anymore let's turn this back off I don't know why I can't control c it's drawn it's hidden ah yeah let's do this build let's install this go back to fewer spams for now are the size and location I think I changed them on the circle on the other circle I should say I think I changed them I added 100 to the y and I made the radius smaller but I was adding the wrong one so it was like adding a circle that was already added again I'm surprised did not make it crash actually a reason exception I guess but and this didn't save I think the way that it was spamming cannot save I'm able to create backup file feel like we have messed up our device yeah I can't save but it it's still there and it says it's saved now if I open it back up it's still there but it's not here oh I don't like this I had this before high charm is lying to me about the code on my device I don't like that we might have like corrupted our storage or something oh this is I don't like this at all catcode this is different because this says other circle and this says print showing and this says circle and no print anything so this is like cached somewhere I don't know this is like not on my device but PyCharm thinks it is so here I will say is like one of the weird states that PyCharm I think this is like the second time I've ever gotten into the state and honestly I think that it's my storage is probably corrupted um I think my storage is probably corrupted copy all of this let's go into here put all of these things on the computer I want to get to the REPL though okay so now I think I'm in the REPL but we are having this be weird because it's still printing this thing let's turn this back off also how do you fix it if that's the case uh if you mean the storage is corrupted then we get to the REPL and we run the format storage I think it's how we fix it that's how I've usually fixed it at least you keep disconnecting from the circuit drive like that you'll break the fat file system and get read write errors until you fix it yeah I think that's probably what happened uh well I think the way we I think we can fix it from REPL though I think we'll be able to or I should say in the past every time I have ended up having my drive get corrupted I have been able to fix it from the REPL um so I assume that we will be the same this time but maybe not I also I also though I don't usually like if the REPL I mean if the storage was yeah okay I was gonna say if the storage is just corrupted then I should still be able to get to the REPL uh which I wasn't before but now I am so I think also I was maybe getting to the REPL before but the way that was printing was making it seem like it wasn't um because the REPL also has groups that are not hidden which was making it spam watch this just work now no okay I was gonna say watch it just let me save and not be a problem anymore so this is how you fix it if you have corrupt storage you first take a backup of all the files on your device which I have done already very very important we're about to delete everything from the device so make sure you have a backup of everything you care about in my case I just copied the entire device here libraries codes images everything make sure you have a backup of everything important that is the most important step it is step one it is step two it is step three check double check triple check REPL is like a clean format while f sick fat is a file system fixer uh good night to shippu yeah I've never tried fixing it from the Linux side I've always done it through REPL like this so then you go storage dot erase file system that's a function so we're gonna call it then it disconnects and then it reconnects because it's rebooting I think and then when it comes back everything is all happy again that's the hope at least so now we have empty hello world yep we're good now so we can save it we get the new version everything's fine so now I'm gonna break to REPL because when it's in REPL it doesn't reboot when the files change and I'm about to paste a boatload of files and I don't want it to reboot for every single file so I go to the REPL first then copy all this oh that's weird we have two circuit pies instead of one circuit pie one interesting before I did that we had a circuit pie one so now I'm gonna paste all this and do this and do this if you back up from a corrupt file system you might get a corrupt backup that is definitely true uh is very very possible I would guess that that is definitely possible in this case though I think that the and again like I don't really know how file systems work so like it's very possible I just don't know but I think when I say corrupted I mean like writing doesn't work I think reading still works fine um it's possible that I am wrong but I that's kind of the the the symptoms when this happens are that writing doesn't work correctly but reading does tend to work correctly so taking the backups I've never had a problem with my backups after I do the erase storage and I get back to it like this um not saying 100% for sure that I never will have a problem one of these days it's very possible I could but so far that has been my experience is that reading files seems fine therefore like copying a bunch of stuff off um has always worked fine and has not led to corrupted files for me so far yet next time just unmount circuit pie de-message and find what the device I'll try that um I'll try to try that at least hopefully the next time you'll be around and I can ask you about this because I'm not sure I remember all those commands but I am interested to try that if we do end up in that state again okay so where were we so we're changing this to other circles so it should be showing the start and then we're hiding it and we're adding another circle at the same time which is smaller and in a different location the circle is bigger and in a different location also I did this on the palette but never put it on the shape so I meant for this other circle to be a different color as well so now I'm going to do that so it gets hidden it adds the other circle at the same time it waits for two seconds and then it sets hidden back to false so what do we see at that point is the question uh and we're in REPL and REPL doesn't reload like I said earlier okay so hiding did not when we added this it did not allow the first circle to refresh whereas when we did this adding another thing to the group does not cause the existing things to trip the dirty region whatever is causing it to actually know that it needs to get redrawn um I probably will not go too much longer tonight um it has been a little over two hours is that right already two hours dang uh yeah two hours flies by um yeah I'll probably head out here pretty soon deep dive generally when scott was doing it was usually right around two hours I think so far I've gone over two hours a little bit each time and I kind of just I don't really set an exact time I kind of just go until I want to get up and stretch and do other stuff so that's probably what I'll do but I'm getting pretty antsy I think so we're kind of close to that time of wanting to get up and stretch and do other stuff uh you want to prevent a corrupt file system dismount circuit pie every time you do a firmware push so you're not doing a dirty unmount would I dismount circuit pie before I double press reset or do I do that after I double press reset time flies when you're on a dive yep that's definitely true so if I do both of these then the blue circle will get hidden the other circle is in the group and it will draw if I do this hypothesis question mark yes I thought that would come out more red oh there's not enough digits here there's only five digits that's probably why it's not more red though yeah it's kind of yellowish but that's more like what I was expecting got ahead it's gonna it's a gorgeous day here I'm gonna enjoy the sun hope everyone has a lovely weekend yeah see you Keith thanks for tuning in before the reset so dismount it before the reset how is that you mount there's something for Linux is that this thing you mount you mount or mount file systems or I think there's a button here maybe I could press this button here and mount yeah it looks like it okay I'll give that a try before loading firmwares in the future okay so I feel like I have made some progress both in like understanding how this works although it's I still don't have the full picture um this it feels like we're pretty close with this because like it works for the initial setting only when we go to try to change it after the fact is it not working and so it feels like we're pretty close the fact that it works for both hidden and not hidden when they're initially set as such leads me to think that we're pretty close you know it's possible I'm wrong and we're not actually that close and it will require a bunch more but it it feels like there's a slight tweak somewhere in here that just needs to somehow trip the fact that some regions are dirty after the thing gets set to hidden and vice versa when the thing gets set to non-hidden as well well which it again it feels like we're pretty close I mean maybe one thing I'll do is add a display shape or like an on-disk bitmap or something or these groups are tile grids I don't know does that that doesn't really tell me anything though if I add one of those because I suspect it will do the same thing as the label which is it will hide and show correctly so it's like specifically with vector IO objects we need to tell them when they need to refresh because their parent got made hidden I don't know exactly how to tell them that but as soon as we can figure out how to tell them that I think it will begin working how we are expecting use file manager to safely unmount okay I use file manager and click to unmount all right so yeah I think I'm gonna probably head out here didn't quite get it working all the way got it kind of working in a different way than I was expecting like when I first sat down to do this I was thinking more along the lines of what I posted here which was adding some logic inside of vector shape fill area and if I'm understanding warrior of wire correctly then I think what I ended up with here is more along the lines of what he suggested which is like don't try to change the vector IO shapes to keep track of hidden or not but instead inside group oh I am in a different function still though he said get refresh areas but instead though rather like inside group try to just skip doing stuff if the group is hidden maybe there would still be benefit in adding another thing to the group actually since we changed the hidden logic here maybe we should add our just a really what I want is a tile grid um any kind of tile grid whether it's a display shapes or a non just bitmap or anything we should add something else to the group and see if it hides and shows but I think that will be for another day looking forward to hidden and palette index arguments for vector IO objects already have two projects queued for the change replacing with a bunch of display objects thanks for the stream yeah for sure thanks for watching and I will say color index is in the latest builds there was a new build of circuit python released today or yesterday maybe as beta though I'm not sure uh no official 72724 I think color index it either should be in 724 or it should be in 730 beta zero I don't know for sure which but the color index thing the thing that I did in the code here this one it should be in one of those two but I'm not sure which maybe both um transparency will be cool too when we can do transparency for the color and then make an outline shape only without filled in that's I have another idea in mind for that as well but that will also be for a different day so um I will head out now for folks that don't know I do also stream on Saturdays so tomorrow morning at 10 a.m central time which is my time I will be streaming I don't know if I'm going to work on this or some other stuff um probably will depend how I feel in the morning um but that is what is that uh 20 minutes under 16 hours from right now so 20 minutes ago we were at the top of the hour 6 p.m in my time zone uh 16 hours after that is tomorrow morning when I will be back streaming a grant again it is on my own channel though here we're on the Adafruit channel I'll be on Fumiguy Twitch so if you're interested you can follow me on twitch twitch.tv slash Fumiguy Twitch and that's where I'll be in the morning I also post the links in the live broadcast chat the same one that we're in here so um you can also just go to that discord and watch in the morning and I'll put the links there so thank you to everybody for watching thank you uh Liz uh C Grover Zarneland thank you for all the help on Linux and the suggestions from folks about uh Linux training and Linux versions desktop thingies I appreciate all of you helping me out with this stuff um thank you again to everybody who watched and uh yeah I'll be back tomorrow so I will see all of you who want to watch tomorrow otherwise um I will be back at the same time uh next week on Friday for another deep dive so thanks I will see you then