And here we go with the Ultimate Python Total Graphs Game Tutorial Part 15 drawing text. So let me show you what I mean by what we're going to do in this particular lesson. So I'm going to go back to the demo, and I'm going to run that real quick. And what I want to talk about is this text here. Okay, so you can see this is kind of an old school looking text. Everything's made out of straight lines. And I custom designed this myself. And you may be wondering why would I do something like that? So let me get rid of that. And the reason is that even though there is a built in text method to draw text to the screen, it really slows down the program. I don't know why it just does. If you've seen the introductory videos for this, I talked about it at length and I did some comparisons. So I'll try to remember to put the link down below. It's pretty interesting stuff actually. So what I'm going to do is I'm going to show you how to make your own custom font and draw it. So let's get started. So the first thing I need to do is I'm going to be creating a new class. And I'm going to call this character pen, not call it class, character pen. And it is not a child of any other class, I'm going to leave that blank. I could also just leave it like that, it doesn't really matter, but I like to put the parentheses there. And when we initialize it, what I want to do is put self and then I want to say color. And watch what I do here. I can't remember if I've done this earlier in this tutorial or not. And scale equals, let's see, 1.0 and some or a colon there. I've been doing a lot of C++ and C programs. You might see me throw a few semi-colons in here and there where they don't belong in Python. So what I've done here is I've said that we need a color and we need a scale. But by setting these default values, I've actually made them optional. So it's just kind of pretty cool. I'm going to say self.color equals color. And I'm going to say self.scale equals scale. Now I need to create a dictionary to hold all of my character data. So this is actually the long, hard part of this whole thing. It's not hard, just time-consuming. So for example, what I want to do is I'm going to make a character. And I'm going to make characters for the number one. And how I'm going to do that is I'm going to encode it in a tuple as a series of tuples representing relative x, y coordinates. And I'll explain that in a second here. So let me just leave that like that. I'm going to go over to this. So what I did was in my mind I said, OK, I'm going to make a default size for my characters. And I want them to be taller than they are wider. And I just came up with 10 wide by 20 tall. So I basically have this imaginary border here. So now in the case of the numeral one, what I want to do is I want to start here and I'm going to go over to here. So I'm going to go ahead and color that in. And I just did this all kind of in my head. Again, I'm not a font designer, but it kind of worked. And then I went over to here. And the way I have this working is it's got to be so that you don't pick up the pen. And that was a challenge in some cases. So there's my one. Now I could have put it here and gone out. I could have added a little bit extra. But that's what I want to do. So what we have to look at are the starting and ending points. I'm going to go ahead and color those in. I'll say make those orange so we know where and what they are. And again, it doesn't really matter exactly where you start as long as you can get there without picking up the pen. Now I know a way to get around that, but for this exercise, since I've already done it once, I'll just leave it this way. So what I want to do is, if you remember, 0, 0 was our center. So what I want to do is I'm going to start the pen at wherever the center is, negative 5 and 10. So I'm going to start here. Then I want to go to 0, 10. I want to go to 0, negative 10. I want to go to negative 5, negative 10. And then 5, negative 10. So these are just the x, y coordinates of the start and end of each line. So I've already done this in the other code. So there's no point in me typing everything over again. But let me just do that part with you again. So it was negative 5, 10. Then I went back to 0, 10. Then I went to 0, negative 10. Then I went to negative 5, negative 10. And then I went to plus 5, negative 10. So those are the x, y coordinates, again, of these spots. So basically what I did, we're going to be drawing the lines. It's actually way, way faster to draw these lines than it is to actually render the text normally, which is shocking. So I have all the characters.  I've already done it. And so I'm just going to go ahead and copy that from my original version. So here's my one. And I'm just going to go ahead and copy this. And I didn't do all the characters. I just did the ones that I felt that I needed for the program. But you can feel free to go through and do whatever you like. And so I'll put this code in the link down below. So you're not trying to copy this from the screen, because that would be crazy. So this part here, again, it's just x and y, relative x and y coordinates from the center. And the relative part's really important, because we don't know where we're going to be drawing the characters on the screen. So that's the first part. So I've defined all of my shapes. Now, there's a way to do this with the built-in turtle module.  You may port it to Pygame or something else like that. I use these numbers the way I did them. So next thing is I need a method to draw a character. And so what I've got to do is I do self, because again, this is inside of a class. Then I need to do I need a pen. So what pen am I going to be using to draw it with? I need the character, and I need its x and y coordinates. Now, this x and y coordinate is the center of that character. So remember, we're looking at this center. So all my x, y coordinates that I just entered are relative to the center. So the center is actually at 0, 0 on the screen. And of course, it's very easy to calculate these. But if we put a character over here on the screen, again, we have to calculate a little differently based on its starting location. So I need to set the scale, because we might want some characters to be bigger than others. And what I've done is to make sure I do this. Character equals character.upper. And what that does is it makes sure that every character is uppercase, because if you look here, I've only defined uppercase characters. I haven't defined lowercase characters, so we can't really use them. But actually, I'll talk about that in a minute. I do have a way around that. So what we need to do that is, first, I'm going to check if the character is in the dictionary of characters, because otherwise we'll get an error. So character in self.characters, otherwise we'll get an error. I'm going to say pen.penup, because we have to move to the start. And I'm going to say xy, what should I do here, equals self.characters.character, it's a little complicated in here, 0. So xy equals self.characters character 0. And what that does, if my character is a 1, it gives me this set of coordinates. So my xy is negative 5, 10. So what I can do here is now I'm going to say pen.goTo, and it is x plus xy, 0. Now watch this one, times scale, in this case, scales 1, so don't worry about that one. And y plus xy, 1, times scale. Let me explain that real quick, and I think we're good there. So I've taken this x-coordinate, so wherever I want to draw it on the screen, so this is the screen x, plus the relative xy, 0, which is in this case, it's going to be the first number, so this is the x. So in this case, it would be minus 3, so the center minus 3, times the scale. So if it's double scale, it would be minus 6. So I can actually make any size font out of this, which is pretty cool. And then I go to the screen y-coordinate, plus xy, 1, which gives me, in this case, it would be a 0, times scale, which is 0. So that's the center of that particular object. So I'm going to go to the starting point, and then I'm going to say pen.pendown. So now I'm going to put my pen down. So if I go back to here, wrong. If I go back to here, in Firefox, it's going to put me right here. So now I just got to draw all of my lines. So you're going to see a little loop here. So for i in range, oops, i in range, that's index, in this case, i in range, so this one was a little complicated, 1, because I'm starting at this character, not this set of coordinates, I'm starting at 1. And then I'm going to the length, self.characters, character. So the length of that particular character, because in this case, you can see a minus only has 2, but a z has 1, 2, 3, and 4. There's four different lines. And then all I got to do is go, basically just copy this. I can go, I can just copy this whole thing, because I'm going to be doing the same thing. Let's put x, y equals self.characters, pen.goToScale. And then when I'm done, I'm going to say pen.penUp. So that way I can go to the next character. Wow. Why don't we go ahead and test that, just to see if it's working. Well, first let me run this and see if there's any syntax errors. And this is always a good practice to test things. Over here, function f5. Sorry, it's been a while since I've used this, because I've been programming C++. All right, so it's still working. That's a good sign. I'm happy about that. So let's go ahead and just draw a character somewhere on the screen. So what I have to do is I have got to create a character pen somewhere in my game. So I think what I'm going to do is I'm going to go down to, I'm going to put it right here, just to make it easy. And I'm going to say character pen equals character. And note the capitalization. And what I want it to do, I'm going to make my letters. I can go ahead and make my letters red. But that's all right, let's just leave it as it is. So let's go ahead and do red. And let's do a scale of 3.0. So we'll make it kind of bigger on the screen. And then I can say character pen. Actually, if I do that, it's going to get erased. So let's go ahead and so I'm going to go down to my main loop. And just before update, so I'm going to put it here. And I'll explain why in a little bit. So draw the text here. So I'm going to say character pen, pen dot draw character. And I'll just put it in the middle. So I think it was pen. So it says here, self pen character xy. OK, so I'm going to draw a big x in the center of the screen. And we'll put it 0, 0. OK, so let's test that and see what happens. OK, character pen has no attributes. Draw a character. Now what did I do wrong? Character pen, draw a character. I spelled it wrong. Character, no I didn't. So let's go up to the class. Character pen. Oh, this is indented. So that was indented wrong, my bad. Very common mistake here. People email me constantly about indentation errors. I have a little video about it. That's what I'm going to send you if you email me about an indentation problem. So because it was indented under this, it was never actually defined. So let's go ahead and try that again. Catacors. So how many of you guys saw that before I did? OK, 141. Care actors. OK, and this is why we test our code. So function f5. OK, and I do not see my x. I do see this. So something's gone wrong, unfortunately. So it is working, but it's not drawing it how we would like it to draw it. Let's go ahead and take a look here. And OK, pen. Good self-character. OK, and let me make sure I did that correctly over here. Down here. The pen capital X, 0, 0. That is where I want it. And so let's go ahead and make sure. Let's make sure A that we have an x, which I think is pretty safe to assume. We find if I just forgot the x. No, there's the x. That's a good sign. And then scale. Yeah, we did that. Care for that upper. Character in self.characters. Now, if you've solved it, good for you. Ah, OK, that's why I went wrong. Character I. OK, that should be an I there, not a 0. That's one of the dangers when you copy and paste if you forget to make the necessary changes. So I don't want to draw it from the first set of coordinates to the first set of coordinates to the first set of coordinates.  So again, now notice, I made a mistake. I just looked through the code. And there's only one possible place where this problem could have been. It was either in the class or it was down in the other statement. So let that be a good lesson on debugging. OK, and there is my big x on the screen. It's a little bit big. So that's stage one. So that lets us draw a character on the screen. But what we need to do, this is a bit of a long one, is we also need to be able to draw multiple characters on the screen. So I'm going to say def draw, I'm going to call it drawString. And it's going to be self, of course, pen. And then we're going to be drawing a string. So it might be a word like player or something like that. And then again, x, y. Now in this case, this x, y is going to be, just to make life easy, is going to be the center of that string. So watch what I do here. So I'm going to set the pen.width to two pixels. I'm going to say pen.color to self.color. So that's whatever color I set my object to earlier. And watch what I do here. I'm going to center the text. Now if you recall, the width of the character was 0 to, so it's 10. So what I need to do then is I need to add a little bit of extra space between the characters. So what I'm doing is it's going to be 10 plus 5 more. So there will be a little bit of a gap between the characters. It'll be consistent between each characters. So I'm going to say x minus equals 15 times self.scale times, because we might make it bigger. So self.scale times the length of the string minus 1 and divide it by 2. Now again, I've calculated this all out ahead. That's why I know it. But it took me a very long time to get this to work. So basically, we're looking at the length of the string. So if there's 10 characters, we're going to move all the weights to the left by 9 divided by 2 characters, so 4 and 1 half. Again, I just calculated this. It works out really, really well. You can play with that if you feel it doesn't. You don't like it. So then once we've set the starting point, the x starting point, but y is not going to change, we're going to say 4 character in str. And then watch this, self.drawCharacter. We're going to use this method here, penCharacter. And that's going to be x comma y. So the y doesn't change. Y is always going to be the center of where we hold it. And then we say x plus equals 15 times self.scale. And that's it.  So I'm going to test this out by going down to my thing here. So instead of draw a character, I'm going to draw a string. And I'm going to say, I'll say, call it at Tokyo eddeck. And let's see what happens. So hopefully that will draw that right in the center of the screen. And there we go. There is my font that I created. And it stays on the screen. Again, we don't want it there for now. But it is something. And you see how this got changed. You might want to fix that later. But anyway, so that, whoops, sorry. I accidentally stopped the screen recording there. So I think I was saying, so that is how we put some text on the screen centered. So what we've got to do is to use that to display that side, I don't know what you want to call it, side panel. So I'm going to go ahead and run this. I'm going to show you. OK, I'm going to get past that. So what I want to do is I want to work on this section here. So I want to put the game name here. I'm going to put score, enemies, lives, and level. OK, so I'm going to close that. OK, let's get rid of that sound. So what I want to do is in my game class. Oops, I want to go back to spacer into 15 here. Sorry, that was the demo. So in my game class, which is way up the top, I'm just going to click here, I'm tired of scrolling. So you see where we have render border? I'm also going to make a method called render info. So I'm going to say def render info. That's going to be self. And I'm going to say pen, score. And I think later I'm going to add active enemies. But I think for now I don't really have that. We haven't calculated that yet. So I'm going to go pen.color. And again, this is just the color that I used. And you can use HTML hex codes. So this is that blue color that I chose. Pen.penup and pen.gotue. Now again, I calculated all these things a long time ago when I did the demo. So I just had to play around with it until I got it right. So I'm going to make a pen shape square. I'm going to say pen.set heading to 90. And this will make sure that the square is aligned vertically and horizontally. And then pen.shapeSize, I'm going to set it to 10 by 32 and no outline. And you'll see what that does in a second. I'm going to put pen.stamp. So what I want to do is I'm going to go all the way back down here. And I'm going to say, I'm going to get rid of this thing because I don't need it anymore. But what I want to do is I'm going to say game.renderInfo. Oops, I think it was pen. And I think the score, we'll say score of 0, we'll say enemies with 0 as well. So I'm going to run that, see what happens. Bad color string. OK, I've got too many things there. Game.renderInfo. And this is where this starts to come in handy. You're not scrolling constantly. Put too many 2s in there. Let's try that again. So that gives us this thing over here. And now you can see we still have the radar. Now as you see, the problem with the radar is now invisible. So let me go ahead and find, where did I do the radar? So radar, radar, radar, radar, yeah, render. And where is the drawRadarCircle? So I forgot to set the color. I'm just going to say pen.color, white. So let's test it. OK, and there's the border of our radar. Now the reason earlier, I think I mentioned it in passing, was I didn't put the rate. I put this before I put the radar. Because if I do that, watch what happens. I run it now. The radar is hidden. It's actually behind this big panel. So we're putting stuff on top of stuff, on top of stuff. So the order that we render is really important. So I'm going to go ahead and put that back where it belongs. And so now I just need to finish up this renderInfo method. So I'm going to go back up to game and renderInfo. Oops, where was it? There it is. So then watch what I do here. I'm going to say pen.color, white. And oh, actually, I'm going to put that line there for you. Pen.width, 3. Pen.goTo, 300, 400. And again, I calculated all these things earlier. Pen.penDown, and I'm going to say pen.goTo, 300, negative 400. So let's just run that, just to show you what I did. So what I did is I put this down here. And so now we have a nice panel. And then notice, even though I move this around, I don't see it because this is drawn after this section of the screen. It's there. It's just you don't see it because we drew all this on top of that. So that's pretty cool. And then the next part we've got to do is pen.penUp, pen.color, whites, I'm going to put it to whites. It may not matter, actually. Pen.goTo, I'm going to do 400, 250. I'm not sure what this is. And pen.goTo, I'm not sure why I'm doing this. I don't think I need that. Let's get rid of those. I had them in the original program, but I think I don't need those anymore. So let's try this. So then I'm just going to start drawing stuff. I'm going to say my character pen.scale equals 1.0. So I don't want my text to be too soft. So I'm going to say character pen.drawString, pen. I'm going to say space arena. And that's going to be at 400, 270. 400, 270. So I'm just going to test it. So that works. Then we can use that as a model. And there is my space arena text. OK. And then I'm just going to go ahead and draw all the rest of the stuff. Some of this may or may not work because the program is not done yet, but let's give it a shot. And so I'm going to go ahead and delete that. Delete that. So I can just copy and paste it. Oops. That's not what I wanted to do. And this is a pretty long one. But I think it's pretty interesting how this worked out.  I mean, I spent like a couple of days on this thing. This was crazy. Score. So score. And oops, I can't do that one. parentheses.format.score. And we'll fix all this stuff later. And again, I just played around with the numbers till I got what I needed. And the next one is going to be enemies. You can see here why I used active enemies. You can see why I used the centering because it makes it easier. And we could make that an option if we wanted to. That's something we could code later. Enemies, lives. And actually, I'm going to leave it like that. You'll see there's going to be some problems here. Format. What did I put here? Player.lives. Do we do lives yet? I'm kind of losing track because I haven't done anything on this for a week because I've been so busy with grad school. 180. Again, I'm just kind of copying this from what I did before. And I think level is the last one. And that format, I think it was game.level. And that one's going to go at 450, 450. I think it was 30 between each of those. And then this one we don't need. Now I'm going to go ahead and run this. I'm going to show you where there's a slight problem in the program. Something's missing. But we'll fix that in a sec. Invalid syntax. CharacterPanDrawString. CharacterPanDrawString. And that is line 104. So probably what I did was I missed a parenthesis. Yeah, missed a parenthesis. Let's try it again. And there we have our text. Well, actually, so everything did print out, which is kind of cool. I forgot I had to fix that. But what I wanted to do is I wanted to give the ability to actually print lower case letters. And that's a very easy fix. So I'm going to go down to my character class. And what I can do here is I can go if character in, vcd, def, gh, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, n, z. So if the character is in that list of lower case characters, what I'm going to do is I'm going to say self.scale times equals 0.8. So I'm going to temporarily, not self.scale, I'm going to say scale. So I want to make the lower case character 80% the size of the upper case character. That's it. So let's go ahead and run that.  You may not like that effect. You might, you might not. It's really up to you. So I'm going to go back down to the bottom here. Or I'll say I'm going to back up to the top here. And in the render, I'm going to make everything capitalized. I think it looks a little bit better, to be honest. But it does have that option if you'd like to use it. And I think that's really it for this particular lesson. This is a long one. So I'm going to go ahead and just run it real quick, show you one more time what we did. So we went ahead and we created a character pen class. We created a character pen. We made some methods, such as draw character. We defined our characters as x, y coordinates, or changes, or delta x and delta y, really, from the center of the character space. And then we drew it going across using the draw string method. So again, this whole program here, 15, it'll be in the GitHub, link is below. I'll put the actual just this. I think you can just go ahead and copy it from there. If you want to try it yourself, you can go ahead and just copy this out of there as well. And that'll keep it simple for everybody. And that is it. That is how we draw our own custom font. So you can go ahead and make your own custom font, which is really, it's actually really fun to do. And you can really, really customize it to look as awesome as you would like. OK, so I hope you learned a lot. Stay tuned for more, subscribe for updates, and click like. Thanks, bye-bye.


but I know we've both discussed confidence and resilience. I think, I don't even know the appropriate word to say it, but just to be able to stand your ground, and I'm not even talking about a sense of resolve, but just to not be affected by others' opinions and to not let self-doubt creep in. Yeah, there's a level of confidence and resolve within that, but I think just kind of, stubborn isn't really a nice word. It has negative connotations, but I would say try to be relatively stubborn in the pursuit of your needs. If it's not really going to cost anyone else, then there's no reason why you shouldn't have something. And even if it is costing someone else a little bit, if the alternative is that it costs you that much more, then it's costing them, then there should be some sort of comp.


Thank you, Frederik. Hello, everyone. Yeah, we are going to talk a bit about VikiData and OpenSuiteApp and how we can use that in our applications. Why do we care about that? When we think about applications, the first thing that for most of us probably comes to mind is code. But that's by far not enough to actually make the applications work and useful, right? A free media player only solves half of the problem as long as the audio and video files I want to play are stuck in some proprietary streaming service. A free software email client only solves part of the problem as long as emails are hosted at Google. And a free software spell checker only solves half of the problem as long as the dictionary for my language isn't freely available. The last bit is an example for data we need for our applications to function properly. We actually have a number of examples in KDE where applications rely on data. One of the obvious things to come to mind is probably Mabel, which is basically just data, but there's a lot of cases where this is a lot more subtle. The metadata retrieval in media players come to mind. There is a number of places that do some form of coordinate to time zone or coordinate to country or region mapping for image viewers and for setting up the clock and stuff like that. And then of course there is the crazy stuff in things like KDE or January. And that's of course the reason why I looked into that entire topic. And if you haven't seen that, there we do stuff like checking if the power plug between your home country and the travel destination country are compatible or if you have to bring a converter and detect airport and stations mentioned in a travel document. So of course that is heavily relying on data as well. And there's probably many, many more examples all over KDE where this is the case. So where do we get that data from? Fortunately, there has been somewhat of a positive change in the last 10 years or so with open data becoming a thing in the same way as software became a thing in the decade before that. And that results in organizations like government agencies or even bigger companies publishing relevant data sets. That however is often in a form that is fairly disconnected from each other that doesn't use some kind of standard identifiers. So merging those individual data sets is quite some work on trivial. The formats are often fairly primitive like CSV or spreadsheets. They use a varying amount of licenses. And often this data is a factor we don't need. I mean, you find a typo in there and then there's usually no process to get back to the government agency where this came from to tell them here's the patch, the supply data, and then they need some kind of internal process to propagate that and eventually release a new data set, which then results in you having to do all kinds of work arounds in your code for that. Fortunately, there is a much better way to work with this. And that's the two giant databases maintained by the invocated data and by the open streetlap communities. They basically aggregate an enormous amount of data from various different sources provided from somebody else or obtain themselves and collect that in unified databases with a unified format, unified interface, unified license, and in a way that it is really easy to edit that and to change that. So we find a few typos in there. We fix that upstream. That's the easiest way for us to deal with that problem and it benefits for everyone else as well. For itinerary, we were missing some special French and Belgium station identifiers in invocated data. So we just edit them upstream. That avoids a whole lot of complication in our code. That's possible if you use those systems. So a very brief overview on what's actually in invocated data and open street map. And I'm sorry, Lydia, if I'm butchering your work here a bit, I had to simplify this enough to squeeze it on two slides. So Wikidata aims at basically being the machine-needable form of Wikipedia. So that means a very, very broad scope. So any factual statement is basically in scope there. And that so far has resulted in 8 billion statements about 100 million objects and counting. So this is very rapidly growing. And that is accompanied by another 60 million media assets. So images, logos, that kind of stuff. Technically, what this database contains are subject-particle object triples. So if you're old enough that you have been around in the KDE4 era, you might remember some of this from Nepomoc. And indeed, you'll find a number of similarities in here. So the subject is, that's items, which is basically just a numerical identifier prefix for the capital Q. Then the predicate, that can be any of about 9,000 different properties. Again, represented by numerical identifier and prefix by capital P. And that can be anything from very widely used and very generic things like instance of or creation time to something very niche and very specific like powerplug type. And the object that can be then primitive types like strings, numbers, dates or references to media assets or other items. And those statements can be qualified. So we can specify, for example, in which time frame they were valid. So we can also model how things change over time. And then in the data speak as an example, something like Q1431, P31, Q2989, 352 obviously means KDE is a free software community. And similar in OpenStreetMap, very similar size for that database. About 6 billion points in there and 700 million lines and polygons of geometry that represents anything on Earth. The license for OSM is, we need to pay a tiny bit more attention to them for Vickie Vata's CC0. ODBL has a share like an attribution requirements. That is for the somewhat comparable to the EGPL reviews and codes. So easy for us to comply with free software world, but we actually have to take care of that. And then what's technically in here is we basic element types, nodes, ways, and relations. Nodes are points. So that's basically just a geographic coordinate and a 100-nano degree resolution, depending on your latitude, that is in the centimeter range. So you can even model like room scale objects in here. Ways are then ordered sequences of nodes. So that's what's used to build lines or simple polygons. And relations, that is used both for semantic groupings like those five buildings belong to a campus and for modeling complex polygons. So polygons that have holes in them and that you can't represent by a single way. And then the part where this gets really interesting, each of those elements can be annotated by a large set of key value pairs. And that's what's actually adding the meaning to that geometry data. Because anything in here is described on a semantic level.  But it will tell you instead this is a railway track. And then any visual display decides how that is rendered. That's not in the data. And the data in here goes far beyond what you would usually see visualized on the map. So imagine you're building a digital system and you have a query like find me a pizza place within a 500 meter range from where I'm right now that I can enter with a wheelchair that offers vegan options where I can pay with one of my credit cards, which is near to a parking spot where I can charge my electrical car with a Type 2 connector. The data to answer that is all in here. So it's incredibly detailed and can be used very beyond just rendering a map. And if any of those two databases aren't good enough on their own, they offer cross-referencing between OSM elements and Vicky data items in both directions. Okay, so how can we make use of that then in our applications? And there's basically two approaches to this. One is bundling the data we need with the application for offline use. And the other one is accessing some kind of online API. For the bundling, that works if you have a reasonable amount of data and data that is barely static. So that doesn't change with a high probability within a release cycle.  Because since you're doing some offline preparation as a developer for the data you ship, you can actually put quite some effort into this to very efficiently pack it in a way that it needs very little space and can still be very efficiently accessed at runtime. So there's a lot you can squeeze in a few hundred kilobytes if you're not using XML or JSON. And then of course there remains the question on where do you get the data from as the developer? And for that there's the online query APIs that we'll see in a second. There is in some cases derivative databases. So for example, there's the time zone shape pile that's just 120 megabyte in size extract with the exact vector borders for the time zones. That is generated from the full OSM data set. But it's of course a lot more efficient if you work with the small subset if you find one that matches your use case. And otherwise there's of course always the possibility to work with the full data sets. I mean 60 gigabytes of download is hard but that's still manageable if you don't have another option. Then for the online access, generally there is two different types of APIs that you find in both VikiData and OpenSuiteMap. One is a simple single item access API. That usually has a very fast response time in a millisecond. So VikiData for example uses that to power its auto completion. So that scales very well but it has a somewhat limited way of querying this. And for the second option starts the complex query services using query languages like Sparkle, again something you might remember from NEPOMO or OverpassQL for OpenSuiteMap. That little example I have here lists all the members of the KDE community as known by VikiData. And those services come with very nice interactive tools to work with. And that already shows that they are much more focused on research and experiments and obtaining data for offline processing rather than for use from applications. And that's emphasized by the fact that if you're lucky the response comes in within seconds but even waiting minutes isn't heard of. So definitely not something to use from within an application but very useful to you as a developer. And then there is a number of third party services that are built on top of the VikiData or OpenSuiteMap data sets that might be usable for specific purposes. One of them is actually one that KDE hosts itself. And that's on Maps KDE org, the back end for the vector maps in marble. And we are currently working on updating that to ensure it has worldwide coverage and is typically not lagging behind the upstream data by more than 24 hours. And what this offers us is a very efficient way to retrieve basically openSuiteMap data for a very small region, so a range of a few hundred meters for example. And if you look at an area of that size, the full raw data is just a few kilobytes usually. So this gives us a very flexible and powerful mechanism for any kind of use case that you might come up with as long as it has a very localized need of accessing data. And there's plenty of other services versus mentioning like the routing or geocoding services offered around OpenSuiteMap for example. When we use online access from within the application, there's a few things to consider. Privacy is one of the obvious issues because it becomes very, very easy here to leak high resolution coordinates, so possibly the location where the user is right now or where the user lives, as well as specific interests or activities. If you remember the query example from earlier for the digital assistant, if you send that as is to the server, you leak the exact position where it lives, as well as the very specific interest and specific constraints I have on what I'm searching for. If you're on the other hand would run this against something like the MapsKB or Interface, that already reduces the coordinate resolution to a few hundred meters, and it doesn't leak anything about what I'm actually looking for because it just gives me the entire data set. If that's good enough from a privacy point of view, I guess depends on what alternatives you have. So the offline approach will always win against that, but that's not always feasible, obviously. And then if you use somebody else's online access or online APIs, check the guidelines and rules for that because some of this can cause quite some load on somebody else's server. Somebody has to pay for that, like the liquidator and OpenSuite member just communities like us as well. So it's always important to keep in mind the cost on that side. If you want to do anything like that in your application, I listed a few examples here in just covering code that I touched recently. There's probably more like marble comes to mind where some of this that I some of the things I mentioned are actually used or are done in some way so that might give you some examples or inspiration on how this could be approached for this. Offline and online access for those kinds of data in there and various forms of more or less elaborate local pre-processing. And yeah, with that, we are already coming to an end. So I hope that gave you some ideas on what's possible and a bit of an overview on how we can approach using OpenSuite map and VikiData for applications. And I also have a few questions where I'd be interested in feedback. For one, do you think it makes sense if we extract some of those building blocks or collect some of the building blocks for working with this kind of data in say a separate library of framework? And then do you have database features that would make sense in frameworks? And I have the suspicion that some of the coordinate-based lookup teachers to get time zones or countries or so on might be of a broader interest there. So that would be something I would be interested in discussing this week, for example. And yeah, I think we have a few minutes for questions. Yeah, thank you so much for your talk. It's so fun to see Volga dive deeper and deeper into data and itinerary and transport. We do have currently two questions. So the first one is, is there data with shop opening times? Yes, I actually missed that in my query example. That is, of course, in the OpenSuite map data. And that, again, is probably a topic for an entire talk and an entire framework because modeling opening times while considering local public holidays and various different patterns and seasonal things. That's all done. They have all of that in there. It's a very, very detailed comprehensive specification on the format. Writing a parser and interpreter for that is something we still need to do. I expect that to be similar in complexity like the ICO recurrence handling. But yes, that's there and it's extremely powerful in what you can model with it. Well, okay, second question. Are you reusing data from nomantim? No, nominatim. Sorry for address lookup. You probably know what that is. I have no idea. Yeah, that's the field coder or reverse field coder. I always mix up which one is reverse. That is one of the third-party services that come to mind for specific use cases with geographic data, so for field coding. We are currently not doing field coding in itinerary yet, but we will need that at some point. If you get a hotel reservation with trustee address, we need to know where that actually is in order to plan a way to get there, to know and to complete all the missing bits on which country is this in, which time zone is this in, and so on. So that is important to have. I am not sure it's possible to do that offline, seeing that this was added to the question. I suspect the database behind that to be in the multi-gigabyte range, so that is not something you want to deploy on a mobile phone. That is typically something that is only realistically solvable by an online service, I think. All right. Yeah, great discussion in the chat. How do I find the way from my work desk to my bed and stuff like that? Not sure if... Are you solving that? We are working on that not necessarily for the bed-to-desk scenario, but I mean one of the reasons why I'm finding myself digging deeper and deeper into OpenStreetMavis, we are looking into indoor maps for big train stations and airports, and I'm doing sort of navigation in there. So what is the most efficient way to switch on between your trains if you're in a hurry in stations like Berlin-Hauptbahnhof, where you have like eight floors and only one working elevator and so on. But ultimately, if you can model that in an OpenStreetMav and work with it, if you add your bedroom and your office to the OpenStreetMav data, it should work there as well. Nice. All right, then I guess we are out of official questions there. One question from my side, accessibility. I still care about that. Wheelchair, accessibility data, blind navigation lanes and so on. I guess there's a lot of data for that as well. I have only scratched the surface for that, but there is a huge amount of text on that subject for wheelchair access. There is a complete model for toilets and restrooms. There's tactile paving and tactile signs and information about that, and probably more that I haven't found yet or don't even understand. So there seems to be a large sub-community with an accessibility interest involved there. There's things like wheel map that is based on top of OSM and they also have APIs for the life status of elevators and that kind of stuff. So there's people looking specifically at those topics and of course it would be interesting for us to leverage that as well.


This paper presents a comprehensive study on the use of machine learning for intrusion detection systems in the Internet of Things, IoT. It evaluates various feature extraction algorithms and multiple machine learning algorithms, including random forests, k-nearest neighbors, support vector machines, and stacked models. The authors also evaluate the performance of these algorithms when used together with the VGG16 model and DenseNet models. The results show that the combination of VGG16 and stacking achieve the best accuracy of 98.3%, demonstrating the potential of machine learning for intrusion detection in IoT environments. This article was authored by Daya Mazla, Mira Alatebi, Fod Alhidari, and others.


If you sign up for a lightning talk, would you please queue here on the side of the... Oh, sorry. The other side of the podium situation here, please. So first we have Mia from Pyvo Meetup. So if Mia is around, please join us. Perfect. So the order of all the talks, so we have first Mia from Pyvo Meetup, then we have a tournament, then we have Chuck with why you should come to CRA panel tomorrow, then we have AWS Lambda loves Python 3.11. Awesome. So Mia is here, we still have three minutes, if you want to, do you need to prepare? No. You're born ready. Okay. Very good. So hello everyone, one more time. Is there anyone that wasn't at the opening session? Raise your hand. Okay, so a lot of people. So I'm Mia, I'm co-organizer of Prague Python Meetups. In Prague we have Python Meetups that have been going on for more than ten years and these Meetups are every Wednesday in a month and today is, now every third Wednesday in a month and today is the third Wednesday in a month, what means we have a Meetup. So our Meetup is ten minutes on food from here. If you open the Europe Python website and you click on events, you will see there Pyvo Wednesday Meetup. We will have a group of people going from here and so you can join Honza, Honza will be standing in front of the venue when, Honza? Yes. After the lightning talks are over so you can go with him or you can come at any time. The Meetup starts at seven. There will be some food there, some light snacks and some smaller things but in case you are very hungry, if you want something big, it's better to go somewhere before the Meetup. Is that everything? Yes it is. Yeah, and you can check the maps but also we will put the signs on so just follow the signs or follow Honza. Thank you. Awesome, thank you, Mia. Now we have a tournament talk, just a reminder when you come to the, when you come to speak, please have your presentations ready to go. Wonderful. You may start. Okay. Hi. My name is Neil. I'm the AI tournament guy so if you weren't at the opening session, basically I've created a little video game that is meant to be played by a Python program rather than a human and during the conference I want, well, you guys can participate in a tournament that will be held on Friday so you have three days or two and a half to write a little bot that will play this game. I can't handle like 200 bots at the same time on the game so please team up with people so that we keep the number of teams playing to a minimum. So I think I will just show you what the game is so you can get an idea and I hope this doesn't crash. So what happens is everybody starts with one base on a map and your mining resources and with those resources eventually you start building vehicles. You can build some tanks or some boats eventually. With boats you can make new bases and then you can build planes and you have to basically try to conquer the space, yeah. And if you go to that QR code you will get to here with some instructions so if you want to participate you have to fill in Google form to sign up with your team name and some GitHub user names. You will be given a private GitHub repository where you can code your little program. Read the game rules and start working on your bot. You can do that even before you get to a repository. There is a forum on the Discord where you can ask me questions. Creating alliances with other teams is allowed. Betrayals are also allowed so be careful. And the deadline is three o'clock on Friday and we will do the tournament in the open space on Friday afternoon. Thank you. Awesome. Next we have Chuck. I allow but my mouse is gone for some reason. Oh we can see it now. Oh jeez. Oh jeez what's going on? No. What I can do is to drag it over now. Jesus. Okay display. Display. Well don't look at my P.R.s. Is Joshua around? Joshua. Wonderful. Yes you're on the queue. Very good. Good. And then Rodrigo. Amazing. Chuck. Yes. Okay. So five minutes. Okay. So this is actually the answer of the question why you should come to the P.R. session tomorrow. But I'm going to tell you in detail. So because government policy will affect you. How many of you have heard of secure open source software? Oh some of you. Probably because it's a U.S. law. Well welcome to Europe. So yeah you know about it. So next one. Have you heard of European Union Cyber Resilient Act? Okay more and more people. Of course it's European. But how many of you know GDPR? Well actually it's not that exciting because in open source we have no geographical boundaries so no matter where you came from you may be from Europe or maybe you are not from Europe. It will affect you. And government regulation. Yeah exactly. It will affect us. And now we have the Cyber Resilient Act. So who is maintaining an open source software? Okay. Some of you. And who is contributing to an open source software? More of you. Who is using an open source software almost every day? All of you. Yes. Great. So European Union Cyber Resilient Act is actually a regulation that's trying to keep us safe like putting a you know this logo on your software. But yeah so it's trying to protect people but there's a problem that we are facing because we are open source. So open source basically. Who have seen this before? Yes. So you know those pepper ones you know it's actually an updated version that I stole a slice from somebody. So the pepper version are those like you know they have some money because they're supported by some organization. The blue ones are probably like you know a very rich company supporting them. But they are this little one that everybody use but they got no resources maybe one person like trying to maintain it during the weekend and something. So we won't have enough resources to demonstrate that the compliance of the project or it will be very expensive. It's very difficult and it will affect the ecosystem a lot if we have a Cyber Resilient Act that trying to like make you and me may be reliable on the software that is open source. So there is a non-commercial activity that is extended but there is a problem because a lot of open source project they need to have some support they need to accept donation maybe there will be people who work for another company who contribute to the open source is that okay or you know I know some project you have been to the pie data booth there's like some project support of a non-focus is that okay and all these complicated things that will make the term commercial very difficult to define. So what shall I do? So we have to get more information and voice out our concerns that's why the CRA panel session tomorrow is designed for this and for you. So this is actually what happened in Brussels in May but this is in the past so we will have an amazing one tomorrow and one of the advisor will be here tomorrow hopefully. So if you want to come to the session and then you want to get some background information before you come here there's a lot of information in this slide so that's why I would give you the link to you know if you get this link you will have access to this slide and you can read all these things before you come to the CRA session tomorrow but even if you don't it's fine you can just come and ask questions there will be people the leader from the community will be there. So yeah please join us tomorrow thank you. Thank you chair. Thank you. And now we have AWS Lambda loves Python 3.11. Let's see. But anyway I wanted to ask before who was this first zero Python for? Like who was here for the first time? Wow. This is very good. Welcome. It's our pleasure to have you here. Nice. How are we? Almost. Be patient. Just a second. This is quite nice. I should actually. So. Okay. Hello my name is Jonas. I work at Otto. It's a big e-commerce marketplace in Germany. But enough about that. I want to tell you why it's a good idea to run a Python 3.11 if you're running code on AWS Lambda. I expect that most of you are more or less familiar with AWS Lambda. Those who are not, it's a function as a service product sold by AWS. Yes. So right to the chase. We switched one of our functions from 3.10 to 3.11. And what you see here are screenshots from the switch. And you can see that our run times decrease in all categories. I don't have the screenshot from the max run time here, but the average and the minimal run time. Both degrees decreased by 10 to 20%. Just by switching the Python version. Yeah. So you might think, okay, but 3.10 is the latest version that is available on AWS Lambda. Well, you also can build your own containers and run them. We do it with Docker and Terraform. But we do not use Docker itself to build the container. But we use nix to build a smaller container. And that also allows us to actually be confident in saying that the run time improvement is only responsible for the run time improvement. Because we know exactly what our container contains. Because nix allows us to build very small containers. All the system dependencies fit on the slide that are included in this container. Apart from G-Lib C, I forgot to put it on. So everything stayed the same. All dependencies stayed the same. It's just the Python version that changed. And that resulted in this performance increase. And, yeah, so it was basically one character change in the pipeline. And we saved money from it. And I think you can all benefit from this knowledge. And if you're interested in using nix with Python, just find me here. And I'm going to talk about this tomorrow again. Thank you. Thank you, Jonas. Now we have VB joining us. Awesome. Always. I can't see it. All right. Good morning, good afternoon, good evening to everyone who is joining us remotely. And also good evening to everyone over here. I am VB.  I'm also one of the organizers for this conference. Thank you so much for coming here, first of all. All right. So what I'm going to be talking about today is Llama 2. Who over here knows about Llama? Awesome. So Llama is this research model that was released a couple months back by Facebook, which was research access only, which could be used for all LLM things, large language model things. So pretty much everything which Ines spoke about in her keynote. Thank you very much again for that. And so yesterday, they released Llama 2, which is basically the successor for Llama. Now what makes it interesting? So first of all, it was trained on much more data. So it was trained on 40% more data than Llama 1. So it essentially is a much more sort of powerful model. Second of all, they made it faster by using a specific type of attention called grouped query attention. Now this was launched yesterday and, you know, hug and face being hug and face partnered with Meta to make sure that we can release the access for Llama 2 to everyone, right? Now there are certain quirks with the license, but by and large, this model is an open access model. You can talk about, like we can talk about licenses outside, but anyone can access Llama 2. You can read more about, like how to use Llama 2 and so on, you know, on this sort of blog post. It's essentially hf.co slash Llama 2 and you find that. What I'm going to show you is how can you actually run this Llama 2 model on your MacBook, right? So we're going to do a bunch of hacky things. What I did to, in order to do this, what I did was I essentially like hacked together two scripts. One is in case you're a Python enjoyer, then you can essentially go to the script. It's on web of s10 slash Llama Playground. You can use Llama 2 via the Friendly Transformers API, and it works pretty much the same way as any transformer model works. However, let's make it interesting and let's work, like let's make this work on our MacBook using A&E. So I'm going to like quickly bring this screen. If I can. Or can I? Actually I cannot. Can someone, oh wait, no. Do I have some more time left? You have two minutes left. Oh my God, I can't. Okay, we're going to try again. Oh, all right, it appeared. So what I'm doing is I'm using Llama.CPP, which is again another open source project, which allows you to run, you know, machine learning models, large language models on MPS. Again, the script for that is on web of s10 slash Llama Playground. So what I'm going to do is I'm going to essentially like run this, which takes a quantized model, and I'm going to ask it something right now. I'm going to write a joke for me, please. And let's see if it does something. I hope it performs okay. Oh my God, that's like really slow. But essentially what's happening right now is, like it's pulling a 13 billion parameter model, all on my laptop, and it's running it. And so here's one, sure, here's one. Why couldn't the bicycle stand up by itself because it was too tired? Oh, I am also too tired. Get it too tired and well, what? Anyway, so it did something. You can do the same thing. Thank you very much. And you have a great day. Awesome. Thank you, VB. Thank you very much. Now we have August with adding arrow function to Python grammar. I love that. And congratulations on doing a live demo, by the way. That is VB, everyone. So. Do I need to do something special or it should just connect to it? I am going. Yeah, I'm going to start running the timer. A few technical issues today. Okay, to the other side. Okay, well. Okay, it will be very hard to look from here. So what we are going to do is we will change lambda expression into arrow function in C Python. We will try to do that. I hope I won't do something wrong here. I already cloned the C Python. And I'm going to first show you how lambda expression works just to be sure. This is how it is, you know, defined. And we will try to do something like this, right? And it will work. It doesn't work right now. So what we are going to do is we will get into the grammar. Python.gram. Then I will go to the lambda keyword. Then I will copy this. I will create my own definition. Change its name. Then I will. Oh. Okay. This is harder than. So I put my parenthesis. I'm not using lambda style parameters. Then I'm adding this and put my arrow function, which means that I will need to define in the tokens also. But first, I will have to go to the lambda. Oops. The second one. As you see, there is an expression definition here. And here I will put it on top of sky. And add, like, arrow, def. Right. I was correct. Then I will go to the grammar again. And I will get into the tokens. And I will find the column where it is defined. Because we added something new actually here. I will just add the one. Function sign, which will be arrow. Oops. Then make regen token. Okay. I started getting excited here. Oops. Make regen. Okay. All right. Now this works for three minutes or something like that. I'm not so sure if you work on time because I started trembling here. Yeah. So I'm going to show something more. There are two things. One of them is the expression. The other one is statement. Statement is I am old. You don't know what to do with that. You just save it in your mind, right?  You can do anything with it. You can throw it. You can give it to somebody else. It returns something. What's the difference? The difference is like if I define a function, this is a statement, right? I can't do this A equals because it doesn't return anything. But lambda returns something actually, right? It returns a function. So it makes a kind of a difference. When we change this into this definition, it will be kind of, I don't know, it will seem in a nice way. And we could construct some stuff like I add Y like this. And then we could even change this into a function that returns a function which adds X and Y. Then we can call it, for example, 1.2, then like this. It's just, experiences are nice, right? Like you can nest them inside. You can merge them or something like that. Yes. Okay. Now we will see if it worked. There we are. A plus B. Okay. Yeah. We have it. As you see, we changed the grammar. So we can even do this at that. Yeah. I'm going to actually do even more from, this will also work. Thank you very much. I got some help from Pablo today because apparently I put it into the wrong place. Thanks to him also. Thank you very much, everybody. Thank you. Thank you. That was my fun. Very, very fun. Awesome. So who has plans for dinner, actually? How are plans for dinner going? No one. Okay. No one's having dinner today. All right. Everyone is there. Where? Craca. What do they have there? Meat and potatoes. Okay. So vegetarians. That is not for you. Okay. Maybe somewhere else. Awesome. Who? Okay. Hi. My name is Joanie and this is just a funny thing that made me go, to be clear, it was a bug in my code, not in Python's least comprehension, but you might be able to use this as an interview question or an obfuscation technique some time. So here's the coding test to be clear. This is not a trick question at all. This is sort of physical coding. The question is we have a lookup dictionary from country codes, country names. Okay. And then we have a list of data, which is supposed to include country codes, but it has some garbage also. We want to filter just the items that are country codes and we want to keep the country names along. This should be simple. There should be nothing difficult about this. And here is a correct answer. This is what I intended to write. So there's the lookup table. There's a list comprehension, which has eggs looping over the input list, which has garbage under country code and then a condition if eggs in lookup and if those match, if that matches, we return eggs and lookup of eggs. Right? This is what I intended to write. The bug was that I swapped eggs and the tuple. Okay. So this is clearly wrong, right? So who thinks this is a syntax error? A few hands. Who thinks it's a value error? A few hands. Who thinks it's a key error? More hands. You're kind of closer. Who thinks it's no error at all? Several hands. You're correct. There's no error. This is entirely valid code. So what was the... What's the value of result? Sorry. Yeah. So the result is ABCD, which I'm not country codes as far as I know, and we're not even in the input list. Okay. So the next question is what else happened, but you answered it already. Well, what happened was that I modified my lookup dictionary. For those of you who are not yet laughing, maybe I'll explain it. So there are... I'm looping over a list of strings and assigning each string to a tuple of two elements. And each string happens to be two characters long. In Python, if you loop over a string, you loop over the not really characters, the single character substrings. So when I assign X and lookup X to AB, I assign A to X and B to lookup of X. So when you want to give a weird interview question to your candidates, here's one example. And maybe if you want to remember something from this, there was a tweet by Ned Bachelder saying, hey, you can assign to anything you want in a list comprehension. This is a much more useful thing to do than mine. Thank you. So next now we have Antonio Curry with spy. I'm very curious about this one. I'm supposed to... Good. So I'm talking about spy. So the first question, how many of you use type annotations in your Python code? How many of you would like your Python code to go faster? If nobody raised the end now, it's a bit... So spy is a new project which started a few weeks ago. It's brand new. I'm doing it as part of my job at Anaconda in the PyScript team. It's static Python. So it means to be a new implementation of a compiler and an interpreter that aims to be as fast as C and as Pythonic as Python. The first goal for us is to target WebAssembly because of PyScript. And I would like spy to be a first-class WebAssembly language which use all the features which are coming in the WebAssembly world. I can argue whether this is a subset of Python which is statically typed and compiled or it's a different language which is Python-like. I don't think the distinction is too much important. It's more a marketing thing. But I think it's a different language. But you can pretend that it's just Python. Some of the goals for the project. I want this to feel like Python. So for most people who don't know all the details or the corner cases of the language, maybe you don't even notice that they are different. So for example, I want to have a fast editor-on cycle so you can just modify your code and run it without having to recompile. And that's why I'm developing an interpreter and a compiler at the same time and I'm testing them to be 100% compatible so that you can just switch from one to the other. No goals. I don't plan. I don't try. I don't even try to be 100% compatible with C Python in all corner cases because I've tried to optimize Python for 20 years and I know it's hard. So basically I'm cheating and removing some of the rules. For this reason, I don't plan that people use .py files. They use .spy just to underline that we have different rules. The idea is that you should be able to use to create standalone executable that you can just distribute and execute without having the interpreter. You should be able to use .py for creating C Python or other or .py or .py extensions. So in this sense, you can use it instead of Cyton or a better Cyton as Stefan is in first row and is looking better at me. But yes, I plan to have first-class integration with C libraries but also with other Python libraries by embedding C Python so you will be able to use Python modules from spy. But also since we're targeting WebAssembly, you will have full first-class integration with JavaScript and all the browser APIs. In the first slide, I said that I wanted to feel like Python but a static language cannot feel like Python because we are too used to all the magic that Python can do. And if you don't use the magic by yourself, the library that you're using are using this magic. But the insight is that I think that the vast majority of magic happens in part-time when all metaclassies, decorators and all these powerful libraries do stuff. And then the language that you use, normally, it's actually pretty boring and static. We tell people, oh, you should not mix types, you should do step annotation, don't monkey patch things, don't exec, don't create classes at runtime. So if we stick to this, then this is very easy to compile. So the idea is that with spy, we just codify this pattern that there will be an explicit metaprogramming phase in which you have full power of the interpreter and your libraries will be able to do all the magic that they do. But then we draw a line and from there, you are no longer allowed to, for example, monkey patch classes and do things like this so that the compiler have a better and easier job to emit fast code. It's almost bubbleware so far. I started a few weeks ago, so right now I have a very boring language in which you can do computation. I can compile Fibonacci, yes. And I plan to add JavaScript integration very soon so that I can translate to Wasm around in the browser and do interesting stuff already. Then I will add all the other things like list and dictionaries, classes. And then at the second stage, I will add the metaprogramming features, but they are there. Like, I'm designing things for MTS. That's it. Thank you. So next now we have learning Python through blocks. We had it. We don't have it anymore. We have it again. Okay. Good to go. So in this talk, I want to put the spotlight on Python in education. How kids learn how to code with Python and how we can all help. So my name is Josh. I'm a software engineer at Anaconda. And my full-time job is working on edge blocks, which is a project I created when I was 12, when I was a student.  So the most typical thing you're probably going to do is go to Google, type in how to download Python, and it might tell you that it's already pre-installed or give you a guide of how to install it. And then once you kind of got to that point, you probably end up with something that looks like this, which is a Python text prompt that we're probably all familiar with. But for kids, this kind of presents a problem which I kind of call the blank canvas of it's not very kind of obvious where to start. You kind of just thrown into the text prompt and what do I type? And this is a very unfamiliar concept to kids. You know, they've never typed a line of code in their life. So, you know, they're not really kind of sure what to do with this blank canvas and text prompt. And this can kind of become a demoralizing experience that leads kids just to give up. And that's not really what we want because we kind of have a digital skills shortage and, you know, we want more kids to learn Python and coding. So, just to kind of give a bit of background for those who aren't familiar, this is Scratch. So, this is kind of like the most popular tool that kids learn how to code at a very basic level. So, Scratch doesn't necessarily teach the concepts of text-based programming, but teaches fundamental concepts like for loops, iteration, and all that kind of stuff that you need to know, variables, functions. And all the blocks are kind of presented to the user so they can see what they need to do and they can drag and drop an experiment and you can't really get anything wrong. There's no concept of errors. There's debugging, but not in the sense of it's giving me a block of red text and I need to find out what to do with it. So, one of these solutions that I have come up with is kind of introducing this block-based format back. And this is the regi-blocks. And essentially what I've done is I've put the Python text on the blocks so that there's a one-to-one mapping between one line of text and a block. So, the kids can kind of have that familiar environment of this block-based, colorful environment, but they're starting to get to use to the syntax and how Python works, which is really important. And I've tried to include fun libraries, like Turtles, so being able to make it fun and engaging rather than just print hello world. But these are libraries that can be used outside of regi-blocks. So, eventually regi-blocks isn't going to be used by these kids, they'll move on to text-based Python, but we're teaching the concepts that they can later apply when they get to that stage. And very similar to Scratch, you have everything kind of on the canvas that you can drag and drop. An example project to load up kind of tutorials of how to use common things. So, kind of what I want to get out of this talk is kind of just to get across some of the things that have been key considerations for me, and hopefully we can all apply to the stuff that we're building to help beginners, specifically kids. So, especially in the UK where I'm from, and it's mostly a worldwide problem, there is a lack of teacher training. Teachers don't know how to code very well, and that's through no fault of their own. This is just through kind of having not the training in place to be able to deliver the lessons that they need. At touchscreen devices are a problem. I ran a code club and I had one kid ask what a keyboard and mouse was, and using Python that there's a bit of a problem. And also, there is a problem of text-based programming just being scary. You know, it's a big shift from the block-based environment a scratch that I showed you to a text-based prompt, and that is kind of like the jump, going in between one and the other within a matter of a few months within school. And also, installing software in school is a big problem as well, but there is a solution to that which is browsers. If you're in the WebAssembly summit yesterday, we're talking about bringing Python to the browser, PyScript to the open-source project that is being worked on at the minute to make it super easy to get started with Python in the browser, and this is something that I want to implement. And also, kind of just another example of adding more fun kind of libraries. This is based off of scratch extension that I saw, which brings Spotify into Python to be able to play preview songs. So it's kind of just adding another fun element into the learning code with text process. So it's completely free, and that's really important, but it's free. So if you'd like to try it out, I'd like to thank you for your patience and thank you. Thank you. Thank you very much. So I think we're getting to our last talk of the day, our last lightning talk. I don't know who is coming up, so it's a surprise for me too. Let's see. So while he sets up, I actually found a joke because I'm a little bit uncomfortable with this silence. So it's a pie joke joke. Why did the programmer quit his job? Anyone? Because he didn't get a raise. I didn't say it was a great joke. Perfect. So we're ready to start. Thank you. Thank you. Thank you. You go. Okay. So I wanted to talk to you about the 25 years of open source because I don't see anybody celebrating that this year, and this year we are having 25 years of open source software. So you must be thinking he must be wrong, right? People have, like programmers have shared source since times immemorial. What is he talking about? It's almost like 100 years at least, right? But turns out that the guy whose name is on every computer book created a... 25 years ago created a conference where a lot of open source developers congregated and they decided to name this phenomenon open source software. Before that it didn't have a name. And they decided to do... This is a screenshot from... description of that event written by some guy called Guido Van Rossum or something. I don't know if you know him. So, yeah. So they decided to do it to, like, help businesses realize that there is all that free code floating around that they can use in the business area. And after 25 years of that we can evaluate the effects. Like, the largest, most rich companies in the world had made billions on this open source software, right? Every large open source project has a foundation behind it so the companies can influence the development without having to employ programmers. We have developed marvelous processes and tools for making software more like a shiny product that is ready to be sold to customers and packaged. And unfortunately there are some downsides as well. As we use all this work, this effort to package it.  So we built this magnificent machine but we are left with all these crafts that was there because it was a product. Also it takes effort, right? To do the packaging, to do the CI, to do the proper, you know, type annotations, everything. And sometimes this affects open source developers in bad ways.  So I'm thinking, you know, maybe those companies could do that work themselves and let's do more open source code and not open source software for ourselves, within the community. And we don't, like, not every single open source project has to be a shiny product at the end. Thank you. Thank you. Thank you. So that was our last talk for today. I want to thank each and every single one of you for coming here today for helping us make this a party. And while you're free to go for dinner and the party continues tomorrow. Thanks again.


out of the blue suddenly Taylor Swift's most famous person on earth now she's at every NFL game with her boyfriend who's backed by Bud Light and Pfizer yeah because when she posted the link to the vote.org like hundreds of thousands of young Taylor Swift fans all of a sudden registered to vote I wonder who got to her from the White House or from wherever who makes that initial handshake some people think this is a massive Psyop major league sports in and of itself is nothing but a Psyop sure seems planned sure seems like something that is like concocted in order to accelerate the fame of these two people get them to the Super Bowl largest screens on earth get maybe a get maybe like a proposal after they get this might this is what I think is going to happen there's going to be like some type of proposal after the Super Bowl is rigged for the chiefs and then the two of these people become it's like reach like crazy levels of absolute fame and then they take all that fame that has been given to them by the rotted corporate press media entertainment industry that explicitly backs Democrats and then they use that in order to try and save Joe Biden just imagine for a moment if people were as dedicated to Jesus as they are professional sports well it turns out right wingers have figured out Joe Biden's master plan to win a reelection and I think that this is foolproof so let me walk you through it step number one turn Taylor Swift into the world's biggest celebrity Joe Biden did that check she wasn't very popular before he became president so he did that then he got her to date a specific football player one who in particular has done ad campaigns with Bud Light and Pfizer that's really important and then once you've gotten her to do that you then rig the NFL for him to increase the status of both of them to turn them into a power couple and now we're at the point where the stage is set so all that's left is to rig the Super Bowl for her boyfriend so that way the camera can see him drop down on one knee after his huge victory and propose to her in a magical moment and after she says yes he then puts the ring on her finger and then the camera zooms in and you see Biden 2024 engraved on the ring and then the crowd goes wild they start chanting Biden Biden and the entire country is captivated by that magical moment including Donald Trump who then sees that and drops out of the presidential race immediately and endorses Joe Biden after getting caught up in the moment just like all of us that is exactly how it's going to play out and the conservative geniuses who crack the code see Biden's plan coming to fruition before our very eyes so Tori Auden of the New Republic explains the chiefs defeated the Baltimore Raven Sunday night and will go on to defend their Super Bowl champions title much of the buzz around the recent chief's games though is due to the presence of music superstar Swift who is dating the chief's tight end Travis Kelce the far right is convinced that the Super Bowl will be rigged in favor of the Kansas City chiefs so that Taylor Swift can get more attention before she endorses another competition rigor President Joe Biden I just think it's so funny that like as Biden's brain is melting out of his ears they think that he's able to pull off this massive conspiracy theory but they unironically believe that they think on one hand well you know he very clearly isn't mentally competent but on the other hand he's competent enough to do all of this it's pretty crazy isn't it now let me show you what I mean by that so in response to pizzagate conspiracy theorist Jack Pasobiak failed presidential candidate Vivek Rama Swami writes quote I wonder who's going to win the Super Bowl next month and I wonder if there's a major presidential endorsement coming from an artificially culturally propped up couple this fall just some wild speculation over here let's see how it ages over the next eight months and once he spoke it into the universe a lot of other conservatives began to see it as well and they've convinced themselves that uh the Super Bowl isn't just being rigged but it's specifically rigged because of Joe Biden it's rigged at his behest probably because of him Tim Poole for example writes how old were you when you learned the NFL was fake well I was today years old Tim Jack Lombardi chimes in saying I have never been more convinced that the Super Bowl is rigged with all the unneeded and unwanted Taylor coverage at the games Casey's journey to the Super Bowl totally scripted next Travis and Taylor together at the Super Bowl appearing happy and in love then Casey wins and then later announcing their support for Biden coincidental nope bought and paid for a couple shakes my head bookmark this post oh I will I absolutely will Joe Manorino chimed in with a viral tweet also claiming that the NFL is rigged and that they made sure that Taylor Swift's boyfriend's team won and calls for a true problem for our country which is a bit um melodramatic but nonetheless Nick Sorter chimes in saying I haven't given a crap about the NFL since all their black lives matter BS but now I'm a 49ers fan specifically to see Taylor Swift and that Pfizer guy go down and just the picture that they included of him is so funny like him with the the bandaid at the Pfizer go for some reason that should is so funny to me but unfortunately for you it's rigged so I guess that his team's victory is already predetermined sorry I don't make the rules but conservative flat earth or Candice Owens also chimed in with a different take and reminded everyone how she accused Taylor Swift of being quote demonic evil and Luciferian adding of course said wants to use her now to elect Joe back into the White House to destroy what's left of America well of course that's obvious idiot now there's a couple of things that is fueling their hysteria over Taylor Swift obviously she's one of the biggest stars in the world and also she's a liberal with a significant amount of political influence she was able to get tens of thousands of her fans to register to vote with a single instagram post and conservatives view that as a threat to their electoral ambitions and they should now second of all there's this assumption that the media is fixated on her specifically because she's a liberal so if you promote Taylor Swift you're in effect promoting liberalism as well so you kind of kill two birds with one stone I guess but on top of that a recent New York Times article reports about how Biden aids view Taylor Swift as the endorsement of their wildest dreams which has led to speculation among conservatives that there's a level of coordination between Taylor Swift and the White House now in reality I mean America has always been obsessed with celebrities and who they date and this is like I remember this since I was a kid so this is really nothing new and politicians have always tried to court any and all celebrity endorsements that they get even if they don't know the celebrity just knowing that somebody is famous is important to them because clearly they want votes case in point one of the big superstars of the world little pimp there he is how's it going do you want to come up and say something come on little pump come on come on up here come on up here maga 2020 20 don't forget that don't forget that and do not vote for sleepy Joe I mean Trump was genuinely excited to win the coveted little pump endorsement or as he called him little pimp which is amazing but I mean he hasn't been relevant since 2017 when Gucci game came out but Trump was like oh he was famous at least a couple of years ago I want that endorsement to come up on stage even though none of the people here know about you or have ever heard about you but I mean politicians know the value of celebrity endorsements particularly during election years so I just feel like it's so absurd to think that there's like this conspiracy surrounding Biden trying to get the endorsement of Taylor Swift of course he's trying to get her endorsement but I mean there were no claims of little pump being a sigh up from liberals when he endorsed Trump so the question is why is it suddenly suspicious when Biden tries to court a celebrity endorsement and I think the answer is because Biden is somebody who they think is already a bad person who rigged the election so I mean if he could rig the election if he's savvy enough to do that he's also savvy enough to coordinate this massive sigh up campaign with the NFL for a Taylor Swift endorsement and maybe you know if he rigs the Super Bowl for her for her boyfriend in particular then she'll be like well since you did this to me Biden I have to pay it forward and endorse you so thank you for ringing it for my boyfriend who does ads for for Pfizer the situation is just amazing to me now the reality is like Trump Biden is also clueless about celebrities and I would guarantee you he's probably never heard of Taylor Swift and I say this because when he tried to reference her in a line that was probably scripted by one of his aides he literally confused her with Britney Spears now just to get here Liberty and Bell had to beat some tough odds the competition they had to work hard to show patience and be willing to travel over a thousand miles you could say even this harder than getting a ticket to the Renaissance tour or or or rip it niche to her she's down in it's kind of warm in brazil right now so close but yet so far but that guy according to conservatives is surely going to rig the entire NFL for an endorsement that he doesn't even need because they think he's just going to rig the election anyway you know it's weird because if they actually believed Biden has as much power as they say he does why even vote because it doesn't matter he's just going to rig the election and if he's going to rig the election what's the point in rigging the NFL for an endorsement right they make so many logical leaps while not stopping to think hmm what's the motive here why do this if he's already doing that but I mean it's a conspiracy theory so there's not much thought put into it only wild speculation and a little bit of delusion or a lot of delusion I should say but you know we've reached a stage in American politics where conservatives are so batshit crazy that Fox News has somehow become the voice of reason in a sense now I say this because Brian killed me to all people I think one of the dumbest people on Fox News he responded to Vivek Ramaswamy's idea that Biden rigged the NFL and he shot it down okay good for you Brian kill me now he still had some choice words for Taylor Swift but nonetheless he shot down this stupid idea that the NFL has been rigged by Biden for Taylor Swift okay number one if there's going to be a fix at the Super Bowl it'll be the biggest scandal in history of the world it's the biggest game the whole world watches now nobody told the 49ers because I'm pretty sure they play tackle football pretty well too so it's a crazy statement their special strategy is to get young people to vote is to have her support him now he she evidently tweeted out support for him and I saw the full screen this morning I don't remember that 2018 she went for the candidate Phil Bredson against Marsha Blackburn uh Marsha Blackburn felt that she does have power but it would be the single dumbest thing a mega superstar could ever do why would you tell half the country that you don't agree with them in this highly polarized time you stay out of it hey listen I'm Taylor Swift I like this guy happens to play football for a living I'm on the stage a lot selling out that's it I think I think it would be the craziest thing ever for to do it and Joe Biden's not worth it I mean my goodness if you need Taylor Swift to get you another four years that's how bad your first four years have been you're done you've finished your through so Brian killed me through cold water on this insane conspiracy theory and I think that that's really important kudos to him for doing that I mean this conspiracy theory isn't as damaging to the country as say you know a conspiracy about the election being stolen but nonetheless I think that the less we get people to think in delusional terms the better off we all are as a country but I mean you can still acknowledge Taylor Swift's political influence and be against that because you know she hurt your team while not jumping to hysterical conclusions about her and this scheme between Biden and maybe she's working with the deep state but I mean Brian Kilmeade is wrong about one thing he does say that it's a mistake for Taylor Swift to endorse Biden and that makes sense in theory like usually you don't want to split your fans in half and you know let them know that you don't agree with them politically if she does have conservative fans which I'm assuming that she does but as Brian Tyler Cohen points out she endorsed Biden in 2020 and then proceeded to host the highest grossing concert tour of all time so she's one of these celebrities that's just too big to cancel I mean she's not the only one with that level of fame and power Elon Musk chums it up with white supremacists on the regular yet he still gets government handouts for his companies so some people are just too big and too wealthy and that makes them untouchable in a sense and anything that they do it doesn't really matter because they're they're they're too big to fail for lack of a better word but going back to Fox News being the voice of reason Judge Janine Pirro of all people made a sound point I can't believe I'm saying that about the political limitations of Taylor Swift's political influence and she kind of implied that maybe conservatives are being a bit hysterical about Taylor Swift without actually saying that but nonetheless let's watch people are Biden is assuming that if she gets involved in this election and she did support Joe Biden in 2020 so it's not unusual for her to get involved in politics and you're right with the Marsha Blackburn Marsha Blackburn kicked that guy's butt but again that's Tennessee and you know but but with the young vote a new poll shows that 18 percent of voters are more likely to back a Taylor Swift endorsed candidate but listen to this 17 percent are less likely to vote for someone she chooses so they cancel each other out yeah so don't get involved don't get involved in politics we don't want to see you there and but Joe Biden's in the hole with young people he knows it and if he thinks Taylor can get him out of that hole he's gonna go for it I never thought that I would say this but I agree with Judge Janine Pirro what a world we're living in you know it's insulting to the intelligence of young people to assume that they care more about Taylor Swift's endorsement than say ending a genocide in Gaza but she is right that Taylor Swift triggers both positive and negative partisan responses however what Pirro doesn't acknowledge is the negative partisanship she triggers can be offset by her registering new voters which she is more than capable of doing and has demonstrated that she has been able to do now that right there is why conservatives hate Taylor Swift the most she's become so big so famous that she is a literal threat to the republican party's power but let's be honest she's just a human being she's not all powerful nor do I think she has the power to single-handedly change the outcome of elections but let's keep it real conservatives don't like her specifically because she's a liberal if she told everyone to vote for Donald Trump they would love her and all of this you know concern trolling about people worshiping celebrities would go out the window if she tells them what they want to hear but to be fair I think liberals would probably have the same response to her if she were conservative that republicans have to her now because we do live in a highly polarized political climate but we know that conservatives would love her if she were conservative because their criticisms of her are so incredibly ironic and you'll see what I mean when you watch this next clip by Greg Kelly of Newsmax they're elevating her to an idol idolatry this is a little bit what idolatry I think looks like and you're not supposed to do that in fact if you look it up in the Bible it's a sin so I don't like that idolatry is a sin according to Trump supporter Greg Kelly of Newsmax the Trump supporting network if not the Trump supporting news network I mean the irony just went right over his head but he goes on to conspiratorialize about the potential Cyop campaign that she's allegedly involved with to boost Biden and look at one of the ways that he tries to make fun of her I need to be on the right side of history and if he doesn't win that at least I at least I tried so um that is literally what Trump does all the time there are memes about his weird hand gestures but all of a sudden weird hand gestures bothers Greg Kelly I mean what a hack but on the subject of Donald Trump he's also pissed off about Taylor Swift albeit for a completely different reason rolling stone reports behind the scenes Trump has reacted to the possibility of Biden and Swift teaming up against him this year not with alarm but with an instant projection of ego in recent weeks the former president has told people in his orbit that no amount of A-list celebrity endorsements will save Biden Trump has also privately claimed that he is more popular than swift and that he has more committed fans than she does a person close to Trump at another source with knowledge of the matter tell rolling stone last month the source close to Trump adds the ex-president commented to some confidants that it obviously made no sense that he was not named Time magazine's 2023 person of the year and honored that went to none other than Swift in December in other words he's jealous of her now I love the claim that his fans are more committed than hers because it's probably true since they literally did an insurrection for him and I doubt that they would do that for her but he can't deny that even though his fans might be more committed her fans are way more intelligent despite the fact that most of them are probably 12 years old on average but one last thing that I do want to show you is a clip from OIN and this host is going to use the Taylor Swift hysteria to concoct a new conspiracy theory about all sports though so they're broadening it out but let's watch America's pop star celebrity sweetheart joins forces with a top dog in the NFL playing for the team that's going to the Super Bowl I mean let's be real here this is bread and circuses on steroids major league sports in and of itself is nothing but a Psyop get kids plugged into the cycle of going to public indoctrination camps playing sports for their school and going to games so then they become obsessed with some grown man who gets paid millions of dollars every year to throw a ball around while promoting poison death shots and child slave labor through various brand deals and endorsements so sad imagine being so brainwashed by sports you actually show up to your team stadium to shovel snow for free so you can watch a bunch of grown men who are overpaid tackle each other seriously though trudging through three feet of snow amid a massive blizzard just to watch a game yeah sorry you couldn't pay me to do that just imagine for a moment if people were as dedicated to Jesus as they are professional sports listen as somebody who is also not into sports i would much rather prefer them be dedicated to sports than Jesus i think that'd be a lot less harmful for society overall but it's just so interesting to me that she thinks sports is a Psyop but somehow religion isn't i just don't get the way that their brains work furthermore imagine shitting on people simply finding happiness i mean like her i don't get sports but i'm also into things that people don't get like video games but whatever leads us to happiness or find some enjoyment out of our short time on earth i think that's that's good why shit on people because they enjoy doing something i just don't understand that but it really speaks to a growing trend with conservatives they're not only becoming more detached from reality they're also getting more detached from the rest of the country because while they conspiracy monger about taylor swift in the nfl normal americans seem to be enjoying the nfl just fine media ight reports that this was the most watched a of c championship ever with a peak viewership of 64 million people so they've just become so detached from the rest of the country which i think is a logical consequence of them becoming detached from reality but it's one of the many reasons why they are struggling to find a message that resonates with normal americans they've just become too insulated and too tribalistic and overly conspiratorial and they're just miserable fucking people and that's why they're unable to win over americans what i mean as desperate as they are to obtain power i can guarantee relentlessly attacking and conspiracy mongering about one of the biggest pop stars in the world during an election year is not going to help their cause


In the rover head, it takes a while, it's 2 years. So you need to make sure the bubble inside the seat belt, right? Yeah, so there's an electronic level on here too, on the controller, and it matches up with this one here. So we have the elevation here, 2.6. How many hours this battery? We never usually run out, we just usually be able to finish our survey before it dies. The one that actually dies faster is the base. It dies because it's like constantly talking to the...


Here's some exciting things coming up at radiant that we want you to know about You were designed to live out your faith with others here at radiant church Our groups meet together on a regular basis and are drawn together by common interests or a specific topic We have groups that meet during the week throughout the southwest region of Michigan as well as groups that meet online These groups are designed to help you thrive by creating a space for authentic connection and Christian growth with others on a similar journey Visit radiant.church slash weekend to learn more and find a group perfect for you One of the core values here at radiant church is that we are mission motivated Whether you're preparing to go on a trip across the globe or you want to begin serving more locally We want to equip you with the practical tools needed to minister to anyone and further the great commission We're excited to offer an outreach training on July 17th at our radiant city center prayer room downtown Kalamazoo Register now at radiant.church slash weekend Water baptism is a significant decision in the life of every believer and is an outward Proclamation of a decision to follow Jesus at our last water baptism service We had over 75 believers make the decision and publicly declare their faith because they have been marked forever by Jesus While we do host these in person Did you know that you can baptize someone at a time outside of our weekend services? Water baptisms are not limited to happening just in a church building Why because you are the church learn more about water baptisms and Register for our upcoming water baptisms on July 24th and 25th at radiant.church slash weekend Lastly make sure you follow us on social media at the radiant city. That's it for me. Thanks for following along