1 00:00:05,239 --> 00:00:07,259 [music] 2 00:00:09,825 --> 00:00:11,845 [music] 3 00:00:16,000 --> 00:00:18,080 We love more bin chickens. That's what 4 00:00:18,080 --> 00:00:21,920 we're here for. Uh we welcome. We are 5 00:00:21,920 --> 00:00:23,920 here for a few things. It's the 6 00:00:23,920 --> 00:00:28,165 education showcase. Woo! 7 00:00:28,165 --> 00:00:28,720 [applause] 8 00:00:28,720 --> 00:00:31,599 We are joined by some fabulous students 9 00:00:31,599 --> 00:00:33,840 to hear about all about the amazing 10 00:00:33,840 --> 00:00:36,025 things that they've been doing. 11 00:00:36,025 --> 00:00:36,559 [laughter] 12 00:00:36,559 --> 00:00:39,360 We will probably not set fire to 13 00:00:39,360 --> 00:00:43,440 anything today. I know this is intensely 14 00:00:43,440 --> 00:00:44,960 disappointing for some, but we will 15 00:00:44,960 --> 00:00:46,960 maybe light a flame of hope in your 16 00:00:46,960 --> 00:00:50,640 hearts for the youth. They are okay. Um 17 00:00:50,640 --> 00:00:53,199 we are we are joined in person by a 18 00:00:53,199 --> 00:00:54,480 bunch of students but there is one 19 00:00:54,480 --> 00:00:56,079 student who couldn't join us in person 20 00:00:56,079 --> 00:00:59,920 today. Uh apparently Perth is far away. 21 00:00:59,920 --> 00:01:05,360 I don't know. Um uh Pyon Extreme West 22 00:01:05,360 --> 00:01:09,600 soon something. Um okay. So first up we 23 00:01:09,600 --> 00:01:15,920 have um a video from Alla and uh she is 24 00:01:15,920 --> 00:01:20,000 in year 11. Uh she's going to talk about 25 00:01:20,000 --> 00:01:22,640 Stallic Tits. Uh and I've realized I 26 00:01:22,640 --> 00:01:24,479 don't have her favorite emoji up on my 27 00:01:24,479 --> 00:01:26,320 spreadsheet, which is an oversight on my 28 00:01:26,320 --> 00:01:29,200 part. So at the end of this, you get to 29 00:01:29,200 --> 00:01:30,560 find out how long she's been programming 30 00:01:30,560 --> 00:01:32,799 and what her favorite emoji is. But in 31 00:01:32,799 --> 00:01:36,479 the meantime, uh we're going to hear 32 00:01:36,479 --> 00:01:37,840 directly from her. 33 00:01:37,840 --> 00:01:39,439 If we plug the audio in, we 34 00:01:39,439 --> 00:01:41,040 Oh, 35 00:01:41,040 --> 00:01:42,799 sorry. This is all my fault. 36 00:01:42,799 --> 00:01:46,119 That's all right. 37 00:01:46,799 --> 00:01:51,600 This one. No, thank you. I I my uh I 38 00:01:51,600 --> 00:01:54,320 would do a terrible voice over for it as 39 00:01:54,320 --> 00:01:57,880 well. Okay. 40 00:01:58,159 --> 00:02:00,880 Stalmmites and a drone, a Python arcade 41 00:02:00,880 --> 00:02:03,360 game. 42 00:02:03,360 --> 00:02:05,840 I was handed out an assignment from 43 00:02:05,840 --> 00:02:08,239 school to build a Python game during my 44 00:02:08,239 --> 00:02:11,280 twoe term break and that led me to build 45 00:02:11,280 --> 00:02:14,000 cable drone. It involves a yellow drone 46 00:02:14,000 --> 00:02:16,239 moving inside a cave avoiding obstacles 47 00:02:16,239 --> 00:02:18,400 of mineral formations called stallic 48 00:02:18,400 --> 00:02:21,280 mites and stallctites. Here is the game 49 00:02:21,280 --> 00:02:24,280 play. 50 00:02:49,599 --> 00:02:52,599 Oo. 51 00:03:11,760 --> 00:03:14,000 The objective of the game is for the 52 00:03:14,000 --> 00:03:15,680 drone to explode the cave without 53 00:03:15,680 --> 00:03:17,680 colliding with the stalkites and 54 00:03:17,680 --> 00:03:20,560 stallites. And if the drone does happen 55 00:03:20,560 --> 00:03:22,720 to collide, it crashes to the ground and 56 00:03:22,720 --> 00:03:24,800 a game over text is displayed to the 57 00:03:24,800 --> 00:03:26,319 player. 58 00:03:26,319 --> 00:03:29,040 And the up and down arrow keys help the 59 00:03:29,040 --> 00:03:30,640 player navigate between the mineral 60 00:03:30,640 --> 00:03:35,319 formations without crashing into them. 61 00:03:35,440 --> 00:03:38,400 A bit of backstory first. After getting 62 00:03:38,400 --> 00:03:40,560 the school project, I was stuck on two 63 00:03:40,560 --> 00:03:42,959 things during the ideation process. What 64 00:03:42,959 --> 00:03:44,959 type of game to create? Should it be 65 00:03:44,959 --> 00:03:47,440 text based or graphical? And what the 66 00:03:47,440 --> 00:03:50,000 game play should be. I wanted to create 67 00:03:50,000 --> 00:03:52,560 a 2D graphical game using the Python 68 00:03:52,560 --> 00:03:55,519 open-source library called Pygame. This 69 00:03:55,519 --> 00:03:59,120 was my first attempt to make a Python 70 00:03:59,120 --> 00:04:01,519 graphical game without with sound 71 00:04:01,519 --> 00:04:04,560 effects. I knew that this was not easy, 72 00:04:04,560 --> 00:04:07,519 so I got right to work. 73 00:04:07,519 --> 00:04:10,720 I have seen videos of how the popular 74 00:04:10,720 --> 00:04:13,200 Flappy Bird game is, and I know that 75 00:04:13,200 --> 00:04:15,200 beginner programmers usually create a 76 00:04:15,200 --> 00:04:17,600 Flappy Bird clone as their first Python 77 00:04:17,600 --> 00:04:20,560 game project. The simplicity of the game 78 00:04:20,560 --> 00:04:22,800 and the addictive nature of the gameplay 79 00:04:22,800 --> 00:04:25,840 was what drew me to it. However, I 80 00:04:25,840 --> 00:04:27,600 wanted to personalize the game in a 81 00:04:27,600 --> 00:04:31,120 unique setting. Thus, I picked a terrain 82 00:04:31,120 --> 00:04:34,000 in my game as a cave with mineral 83 00:04:34,000 --> 00:04:37,040 formations. And the drone is exploring 84 00:04:37,040 --> 00:04:41,960 the cave and trying to avoid obstacles. 85 00:04:42,639 --> 00:04:45,040 One of the first things I learned was 86 00:04:45,040 --> 00:04:47,280 what a stallicmite and stallctides 87 00:04:47,280 --> 00:04:50,400 actually are. Stallctides are mineral 88 00:04:50,400 --> 00:04:52,320 formations that hang from the ceilings 89 00:04:52,320 --> 00:04:55,040 of caves. And stallic mides are mineral 90 00:04:55,040 --> 00:04:57,120 formations that rise from the cave 91 00:04:57,120 --> 00:05:00,960 floor. The C in stallctite stands for 92 00:05:00,960 --> 00:05:04,800 celic. They are always found in pairs as 93 00:05:04,800 --> 00:05:07,120 stallic mites are the accumulation of 94 00:05:07,120 --> 00:05:11,199 materials that drip from stallctites. So 95 00:05:11,199 --> 00:05:13,520 the G in the stallicmite stands for 96 00:05:13,520 --> 00:05:16,639 ground. These formations are the 97 00:05:16,639 --> 00:05:18,960 obstacles in the game which the drone 98 00:05:18,960 --> 00:05:21,680 must avoid to prevent a collision from 99 00:05:21,680 --> 00:05:24,680 happening. 100 00:05:25,360 --> 00:05:26,880 Some of the things that I learned from 101 00:05:26,880 --> 00:05:30,639 the game is how to detect key presses 102 00:05:30,639 --> 00:05:33,680 and the drawn movement physics and 103 00:05:33,680 --> 00:05:36,320 blading images on transparent layers. 104 00:05:36,320 --> 00:05:38,880 Also had to learn how to draw the 105 00:05:38,880 --> 00:05:41,840 obstacles in and save the best score as 106 00:05:41,840 --> 00:05:46,039 well as add the sound effects. 107 00:05:46,400 --> 00:05:48,880 For the key press, I used a building 108 00:05:48,880 --> 00:05:52,800 function called bygame.key get pressed. 109 00:05:52,800 --> 00:05:55,360 It continuously checks for identifying 110 00:05:55,360 --> 00:05:59,360 any keys. The pressing the up arrow 111 00:05:59,360 --> 00:06:01,680 makes the Y value of the drone be 112 00:06:01,680 --> 00:06:04,560 decremented so that the drone goes up by 113 00:06:04,560 --> 00:06:07,520 a factor of 10 pixels. The down arrow 114 00:06:07,520 --> 00:06:09,919 increments the drone's Y value by 10 115 00:06:09,919 --> 00:06:14,039 pixels moving it down. 116 00:06:14,080 --> 00:06:17,039 The game shows 30 frames per second 117 00:06:17,039 --> 00:06:21,360 using clawframe tick 30. The drone in a 118 00:06:21,360 --> 00:06:23,840 game moves only up and down. Its 119 00:06:23,840 --> 00:06:27,039 movement in the X-axis is locked. The 120 00:06:27,039 --> 00:06:29,039 only user controlled object in the game 121 00:06:29,039 --> 00:06:31,759 is the drone. The up and down arrow key 122 00:06:31,759 --> 00:06:33,759 presses move the drone along the 123 00:06:33,759 --> 00:06:36,560 vertical Y-axis. The up and down arrow 124 00:06:36,560 --> 00:06:39,039 keys also need to be constantly pressed 125 00:06:39,039 --> 00:06:42,080 to keep the drone afloat since it will 126 00:06:42,080 --> 00:06:46,919 fall down due to gravity by 5 pixels. 127 00:06:46,960 --> 00:06:49,440 The obstacles move towards the drone 128 00:06:49,440 --> 00:06:51,919 from right to left of the screen 10 129 00:06:51,919 --> 00:06:55,360 pixels per frame. This stimulates the 130 00:06:55,360 --> 00:06:57,919 forward drone movement. And unlike the 131 00:06:57,919 --> 00:07:00,240 drone, the stallic mites and stallctides 132 00:07:00,240 --> 00:07:03,840 change their xaxis while the yaxis is 133 00:07:03,840 --> 00:07:06,840 locked. 134 00:07:07,199 --> 00:07:09,280 Similar to the obstacles, the cave 135 00:07:09,280 --> 00:07:12,479 background with cobwebs, bats, and 136 00:07:12,479 --> 00:07:15,120 spiders also move from right to left of 137 00:07:15,120 --> 00:07:18,240 the screen, but it is slower at 5 pixels 138 00:07:18,240 --> 00:07:21,599 per frame. This relative speed between 139 00:07:21,599 --> 00:07:23,599 the obstacles and the cave background 140 00:07:23,599 --> 00:07:27,199 create a parallax effect, giving an 141 00:07:27,199 --> 00:07:32,440 illusion of a 3D depth of the cave. 142 00:07:33,199 --> 00:07:37,039 In Pygame, blit or block image transfer 143 00:07:37,039 --> 00:07:39,840 means to draw, copy this image onto 144 00:07:39,840 --> 00:07:42,880 another surface. The drone layer has the 145 00:07:42,880 --> 00:07:45,599 transparent PNG image of the drone. And 146 00:07:45,599 --> 00:07:47,919 using the blit function, we position the 147 00:07:47,919 --> 00:07:50,240 drone layer at a specific X Y 148 00:07:50,240 --> 00:07:52,560 coordinate. 149 00:07:52,560 --> 00:07:55,759 Similarly, we blit the polygon layer and 150 00:07:55,759 --> 00:07:58,879 cave layer. Once all the layers are 151 00:07:58,879 --> 00:08:01,680 updated, we call pygame.d display.flip. 152 00:08:01,680 --> 00:08:05,759 flip. The function is used to update the 153 00:08:05,759 --> 00:08:08,240 actual game window to show everything we 154 00:08:08,240 --> 00:08:12,919 have changed since the previous update. 155 00:08:14,080 --> 00:08:16,240 The game has different shapes of 156 00:08:16,240 --> 00:08:18,639 stallmides and stallctites with random 157 00:08:18,639 --> 00:08:21,680 heights. The height is generated using 158 00:08:21,680 --> 00:08:25,039 the standard random function in Pygame. 159 00:08:25,039 --> 00:08:27,280 The obstacles are drawn using the 160 00:08:27,280 --> 00:08:30,720 built-in polygon, rectangle, and ellipse 161 00:08:30,720 --> 00:08:33,919 functions. First, the stallmite on the 162 00:08:33,919 --> 00:08:36,800 ground is drawn. And then after adding a 163 00:08:36,800 --> 00:08:40,240 constant gap of 300 pixels to its 164 00:08:40,240 --> 00:08:42,719 height, the stallctites are drawn by 165 00:08:42,719 --> 00:08:46,440 calculating the coordinates. 166 00:08:48,240 --> 00:08:50,560 Three steps are involved in the saving 167 00:08:50,560 --> 00:08:53,920 of the best score. When the game loads, 168 00:08:53,920 --> 00:08:57,120 we first look for the file score.txt in 169 00:08:57,120 --> 00:09:00,000 the drone game folder at the app data 170 00:09:00,000 --> 00:09:02,320 local location. 171 00:09:02,320 --> 00:09:05,040 If it doesn't exist, this is the first 172 00:09:05,040 --> 00:09:08,000 run of the game. So, the folder and the 173 00:09:08,000 --> 00:09:10,640 file are created and the variable high 174 00:09:10,640 --> 00:09:14,000 score is loaded with zero. When the game 175 00:09:14,000 --> 00:09:16,000 is finished, if the current high score 176 00:09:16,000 --> 00:09:19,760 is larger than the high score in the txt 177 00:09:19,760 --> 00:09:22,320 file, then it is written with the new 178 00:09:22,320 --> 00:09:25,320 score. 179 00:09:26,720 --> 00:09:29,440 While the game is being loaded, a 34 180 00:09:29,440 --> 00:09:32,080 second eerie background music with water 181 00:09:32,080 --> 00:09:34,640 flowing sound and an explosion sound 182 00:09:34,640 --> 00:09:37,920 effect clip are loaded. Their volumes 183 00:09:37,920 --> 00:09:40,080 can be independently controlled using 184 00:09:40,080 --> 00:09:43,680 Pygame DOB mixer settings and the 185 00:09:43,680 --> 00:09:45,839 background music is played in loop 186 00:09:45,839 --> 00:09:48,399 during the game play. When the drone 187 00:09:48,399 --> 00:09:51,200 crashes into an obstacle, the explosion 188 00:09:51,200 --> 00:09:54,000 sound is played once and the background 189 00:09:54,000 --> 00:09:58,040 music is stopped immediately. 190 00:09:58,880 --> 00:10:01,680 I'm proud of the ca drone game that I 191 00:10:01,680 --> 00:10:04,080 could do during my term break. I used 192 00:10:04,080 --> 00:10:06,399 Chad GPT to learn the ropes of game 193 00:10:06,399 --> 00:10:09,760 design. I overcame many challenges, but 194 00:10:09,760 --> 00:10:12,560 one cute bug in the game pointed out by 195 00:10:12,560 --> 00:10:14,880 my little sister during her testing was 196 00:10:14,880 --> 00:10:16,800 about the text showing the current score 197 00:10:16,800 --> 00:10:20,399 and best score. The score.txt is to stay 198 00:10:20,399 --> 00:10:22,880 visible as a top layer all the time in 199 00:10:22,880 --> 00:10:25,680 the game, but Stallides overlap it 200 00:10:25,680 --> 00:10:28,680 repeatedly. 201 00:10:30,720 --> 00:10:33,680 But I decided to keep the bug. This 202 00:10:33,680 --> 00:10:36,720 effect adds a depth to the field of the 203 00:10:36,720 --> 00:10:39,839 game and so I kept it as an imperfect 204 00:10:39,839 --> 00:10:42,839 perfection. 205 00:10:43,440 --> 00:10:46,000 I used many free assets for designing 206 00:10:46,000 --> 00:10:50,000 this game. Images are from magnafic.com 207 00:10:50,000 --> 00:10:52,399 and I edited some of the images in Adobe 208 00:10:52,399 --> 00:10:55,440 Photoshop. Sound effects are downloaded 209 00:10:55,440 --> 00:10:58,720 from pixabay.com and the audio editing 210 00:10:58,720 --> 00:11:01,760 was done in Audacity. The game's title 211 00:11:01,760 --> 00:11:04,959 font is downloaded from Google Fonts and 212 00:11:04,959 --> 00:11:06,640 this PowerPoint template is from 213 00:11:06,640 --> 00:11:09,640 slidescope.com. 214 00:11:10,880 --> 00:11:13,040 That's all for today. Thank you very 215 00:11:13,040 --> 00:11:15,279 much for your time and kindly connect 216 00:11:15,279 --> 00:11:17,440 with me on LinkedIn. You can either scan 217 00:11:17,440 --> 00:11:20,000 the QR code here or find me at 218 00:11:20,000 --> 00:11:23,000 linkedin.com/in. 219 00:11:27,102 --> 00:11:28,560 [applause] 220 00:11:28,560 --> 00:11:31,440 Massive round of applause. [screaming] 221 00:11:31,440 --> 00:11:34,720 That was the fantastic 222 00:11:34,720 --> 00:11:37,760 Alla. Next up, we have Dev. While I'm 223 00:11:37,760 --> 00:11:41,760 stalling, unplug this. Gosh, I have two. 224 00:11:41,760 --> 00:11:45,519 Yeah, there you go. Good luck. Um, so, 225 00:11:45,519 --> 00:11:47,040 uh, 226 00:11:47,040 --> 00:11:49,120 that was Alla her she has been 227 00:11:49,120 --> 00:11:51,839 programming for four years. Her favorite 228 00:11:51,839 --> 00:11:54,880 emoji I will act out and you all have to 229 00:11:54,880 --> 00:11:57,839 guess it. [snorts] 230 00:11:57,839 --> 00:12:02,800 Yeah, nice. Uh, and she recently learned 231 00:12:02,800 --> 00:12:04,079 that she really loves the latest 232 00:12:04,079 --> 00:12:06,880 framework laptop 13 Pro, which can be 233 00:12:06,880 --> 00:12:08,480 customized and upgraded. This sounds 234 00:12:08,480 --> 00:12:10,880 like a plug. uh in the future based on 235 00:12:10,880 --> 00:12:12,880 my growing demands. It really celebrates 236 00:12:12,880 --> 00:12:14,639 my right to repair. Okay, good. 237 00:12:14,639 --> 00:12:16,720 Modularity and continued support for 238 00:12:16,720 --> 00:12:19,279 many years. Excellent. Sponsor next year 239 00:12:19,279 --> 00:12:24,000 maybe. Um okay, so up on deck we have 240 00:12:24,000 --> 00:12:26,160 Dev. Dev is going to talk to us about 241 00:12:26,160 --> 00:12:28,959 Connect 4, which I assume is how you 242 00:12:28,959 --> 00:12:30,480 procrastinate in class. Don't answer 243 00:12:30,480 --> 00:12:33,920 that. Um uh Dev has been programming for 244 00:12:33,920 --> 00:12:37,120 3 years. Uh, you started in year 8 when 245 00:12:37,120 --> 00:12:40,480 you were approximately 13 years old. Uh, 246 00:12:40,480 --> 00:12:45,000 your favorite emoji is 247 00:12:45,519 --> 00:12:49,519 Yeah. blush emoji. Yes. 248 00:12:49,519 --> 00:12:52,399 Um, and something you recently learned 249 00:12:52,399 --> 00:12:55,600 about computers is that AI has stolen 250 00:12:55,600 --> 00:12:57,440 more data than quantum computing 251 00:12:57,440 --> 00:13:00,000 breaches ever will. And with that, can 252 00:13:00,000 --> 00:13:01,519 we get a massive round of applause for 253 00:13:01,519 --> 00:13:04,098 Dev [applause] 254 00:13:07,680 --> 00:13:10,160 Hi everyone. Thank you for coming to see 255 00:13:10,160 --> 00:13:11,839 our education talks. Today I'll be 256 00:13:11,839 --> 00:13:14,480 talking to you guys about an AI made to 257 00:13:14,480 --> 00:13:18,079 play Connect 4. So 258 00:13:18,079 --> 00:13:21,440 firstly, who am I? Hi, my name is Dev. 259 00:13:21,440 --> 00:13:23,519 My I'm a year 11 student and I go to 260 00:13:23,519 --> 00:13:25,120 Bergman Anglican School and I'm also 261 00:13:25,120 --> 00:13:28,079 studying cyber security at UNSW. My 262 00:13:28,079 --> 00:13:30,800 favorite colors are blue and purple and 263 00:13:30,800 --> 00:13:35,279 uh Oh, hi I like to win. 264 00:13:35,279 --> 00:13:36,240 So, [gasps] 265 00:13:36,240 --> 00:13:38,079 the problem I've had is that all my 266 00:13:38,079 --> 00:13:40,399 friends suck at Connect 4 and I really 267 00:13:40,399 --> 00:13:43,360 wanted to challenge myself. The solution 268 00:13:43,360 --> 00:13:45,519 was to build an AI that I could play 269 00:13:45,519 --> 00:13:48,079 with and have it powered by the miniax 270 00:13:48,079 --> 00:13:51,519 algorithm with alpha beta pruning. 271 00:13:51,519 --> 00:13:52,720 So, raise your hand if you've played 272 00:13:52,720 --> 00:13:55,040 Connect 4 before, guys. Nice. Okay, 273 00:13:55,040 --> 00:13:57,519 perfect. So, we all know Connect 4 is a 274 00:13:57,519 --> 00:13:59,199 six row by seven column game where 275 00:13:59,199 --> 00:14:01,360 players take turns to drop counters in a 276 00:14:01,360 --> 00:14:02,800 grid trying to make four in a We 277 00:14:02,800 --> 00:14:04,639 understand that. I'll explain my 278 00:14:04,639 --> 00:14:05,920 algorithm first in a little bit of 279 00:14:05,920 --> 00:14:07,920 detail in the context of chess because I 280 00:14:07,920 --> 00:14:09,199 feel like everyone knows chess. It's 281 00:14:09,199 --> 00:14:11,440 pretty popular, right? Um, basically how 282 00:14:11,440 --> 00:14:13,600 this works is my algorithm is a search 283 00:14:13,600 --> 00:14:16,639 algorithm. Basically, you foresee the 284 00:14:16,639 --> 00:14:19,360 future going forward several moves until 285 00:14:19,360 --> 00:14:21,440 you reach a point where you perform an 286 00:14:21,440 --> 00:14:24,800 evaluation. So, let's assume in our 287 00:14:24,800 --> 00:14:27,120 chess example, right, that we have a 288 00:14:27,120 --> 00:14:29,760 white and a black player. The white 289 00:14:29,760 --> 00:14:31,279 player is trying to maximize their 290 00:14:31,279 --> 00:14:33,680 evaluation. hence pick numbers or 291 00:14:33,680 --> 00:14:35,839 evaluations that are higher and black is 292 00:14:35,839 --> 00:14:37,600 trying to minimize or pick smaller 293 00:14:37,600 --> 00:14:38,959 numbers. So you can see in the number 294 00:14:38,959 --> 00:14:43,120 line is five, black can be neg five. So 295 00:14:43,120 --> 00:14:45,360 if we figure out that the two positions 296 00:14:45,360 --> 00:14:48,160 in the bottom are valued at -4 and 297 00:14:48,160 --> 00:14:50,399 three. White as a maximizing player 298 00:14:50,399 --> 00:14:52,399 picks the best of the two options or the 299 00:14:52,399 --> 00:14:55,040 larger number it picks three. If we do 300 00:14:55,040 --> 00:14:57,040 that for the other side of the branch 301 00:14:57,040 --> 00:14:59,199 five and one, white also picks five. 302 00:14:59,199 --> 00:15:01,360 Black is a minimizing player. So, black 303 00:15:01,360 --> 00:15:03,760 will pick three. Now, if we do the same 304 00:15:03,760 --> 00:15:05,680 logic on the other side, we get4 for 305 00:15:05,680 --> 00:15:08,480 white. We get 9 for white again. Black 306 00:15:08,480 --> 00:15:10,639 picks4 again, the smallest number. So, 307 00:15:10,639 --> 00:15:12,639 what do you guys think white will pick 308 00:15:12,639 --> 00:15:16,560 in this scenario? Three org4? 309 00:15:16,560 --> 00:15:18,639 You guys are geniuses. It's three. Great 310 00:15:18,639 --> 00:15:22,160 job. Okay, now that we've uh covered the 311 00:15:22,160 --> 00:15:23,920 algorithm that I'm going to be using, uh 312 00:15:23,920 --> 00:15:25,360 I have to actually figure out how I'm 313 00:15:25,360 --> 00:15:27,519 going to implement it. And I ran into a 314 00:15:27,519 --> 00:15:30,160 little problem. I didn't actually know 315 00:15:30,160 --> 00:15:31,760 what I was going to use to visualize the 316 00:15:31,760 --> 00:15:34,000 brain of the AI. So, at first I was 317 00:15:34,000 --> 00:15:36,079 doing some research and I thought, hm, I 318 00:15:36,079 --> 00:15:37,920 can use this library called Manom, which 319 00:15:37,920 --> 00:15:39,680 is a Python library that you can use to 320 00:15:39,680 --> 00:15:42,720 programmatically create math animations. 321 00:15:42,720 --> 00:15:44,240 Here are some photos of what it looks 322 00:15:44,240 --> 00:15:46,560 like. This this is a photo of some 323 00:15:46,560 --> 00:15:48,959 circular geometry. And this is an 324 00:15:48,959 --> 00:15:51,279 example of uh visualizing a neural 325 00:15:51,279 --> 00:15:54,720 network. However, as I would soon come 326 00:15:54,720 --> 00:15:56,160 to discover after reading the 327 00:15:56,160 --> 00:15:59,040 documentation is that there's no way to 328 00:15:59,040 --> 00:16:01,279 actually visualize data in real time 329 00:16:01,279 --> 00:16:04,720 using manom with the exception of OpenGL 330 00:16:04,720 --> 00:16:06,480 which is a variant of manom but that 331 00:16:06,480 --> 00:16:08,639 only works on your desktop and there's 332 00:16:08,639 --> 00:16:10,560 no actual way to port that to the web 333 00:16:10,560 --> 00:16:13,199 which is very unfortunate. So uh yeah, 334 00:16:13,199 --> 00:16:15,600 no madam. 335 00:16:15,600 --> 00:16:17,279 However, after doing some more research, 336 00:16:17,279 --> 00:16:20,000 I decided to use D3JS, which is a 337 00:16:20,000 --> 00:16:21,360 JavaScript library that lets you 338 00:16:21,360 --> 00:16:23,680 visualize data and it's really pretty. I 339 00:16:23,680 --> 00:16:25,199 picked this because it works really well 340 00:16:25,199 --> 00:16:26,639 with the front end, which I've coded in 341 00:16:26,639 --> 00:16:29,440 TypeScript. And um yeah, so after 342 00:16:29,440 --> 00:16:31,040 figuring out how to solve that problem, 343 00:16:31,040 --> 00:16:32,560 I had another small problem which was 344 00:16:32,560 --> 00:16:34,399 that if I were to use the algorithm I 345 00:16:34,399 --> 00:16:36,560 just explained to you guys, then uh it 346 00:16:36,560 --> 00:16:38,800 would be pretty inefficient. So the time 347 00:16:38,800 --> 00:16:40,399 complexity which is basically like how 348 00:16:40,399 --> 00:16:43,360 good or bad a efficiency of algorithm is 349 00:16:43,360 --> 00:16:45,920 the time complexity for this is O of the 350 00:16:45,920 --> 00:16:47,440 branching factor to the power of the 351 00:16:47,440 --> 00:16:49,839 depth of the tree which uh in layman 352 00:16:49,839 --> 00:16:51,920 terms just means that uh it's not 353 00:16:51,920 --> 00:16:54,800 efficient. We need to fix it. So the 354 00:16:54,800 --> 00:16:58,880 solution is if I use alpha beta pruning. 355 00:16:58,880 --> 00:17:00,880 This is a variant of the same algorithm 356 00:17:00,880 --> 00:17:02,320 that lets you ignore the branches that 357 00:17:02,320 --> 00:17:05,199 don't influence your final decision. So 358 00:17:05,199 --> 00:17:07,760 um what I have up here now are the time 359 00:17:07,760 --> 00:17:09,600 complexities with the new variant. 360 00:17:09,600 --> 00:17:12,799 Basically what it means is um at best we 361 00:17:12,799 --> 00:17:15,439 can perform a search twice as deep at 362 00:17:15,439 --> 00:17:17,600 the exact same time as vanilla miniax. 363 00:17:17,600 --> 00:17:19,600 So it's basically twice as good. At the 364 00:17:19,600 --> 00:17:22,160 average case you can probably go about 365 00:17:22,160 --> 00:17:25,360 33% deeper than the vanilla miniax. And 366 00:17:25,360 --> 00:17:27,839 um yeah if we continue on with our 367 00:17:27,839 --> 00:17:29,919 visualization we have this tree. This is 368 00:17:29,919 --> 00:17:31,120 the same tree as before. We have 369 00:17:31,120 --> 00:17:33,200 negative 1 and three. So, white picks 370 00:17:33,200 --> 00:17:35,600 three, the maximum value. We have five. 371 00:17:35,600 --> 00:17:37,760 But instead of evaluating the final 372 00:17:37,760 --> 00:17:40,160 black node, we can simply realize that 373 00:17:40,160 --> 00:17:41,760 white is obviously going to pick a value 374 00:17:41,760 --> 00:17:44,400 that's five or greater. Henceforth, we 375 00:17:44,400 --> 00:17:47,440 genuinely don't need to know what that 376 00:17:47,440 --> 00:17:49,039 uh node is. We can just leave it as a 377 00:17:49,039 --> 00:17:50,559 question mark and we can effectively cut 378 00:17:50,559 --> 00:17:52,880 the branch getting rid of it. And uh 379 00:17:52,880 --> 00:17:54,080 that's really good because we don't have 380 00:17:54,080 --> 00:17:55,520 to calculate these types of nodes that 381 00:17:55,520 --> 00:17:57,440 are useless to the final result. So, we 382 00:17:57,440 --> 00:17:58,960 can basically cut that off. If we 383 00:17:58,960 --> 00:18:00,320 continue with our visualization with 384 00:18:00,320 --> 00:18:03,360 four and negative6, we get neg4. And um 385 00:18:03,360 --> 00:18:05,360 we know that black at the top here is 386 00:18:05,360 --> 00:18:07,600 going to pick a value that is -4 or 387 00:18:07,600 --> 00:18:10,640 lower. And if we look to the um other 388 00:18:10,640 --> 00:18:12,400 side, which has three, we know that 389 00:18:12,400 --> 00:18:13,919 white obviously needs to pick a value 390 00:18:13,919 --> 00:18:15,520 that is large. So it's not going to pick 391 00:18:15,520 --> 00:18:17,520 neg4, it's going to pick three. So we 392 00:18:17,520 --> 00:18:19,120 can effectively get rid of that side of 393 00:18:19,120 --> 00:18:21,760 the branch. And uh yeah, leaving us with 394 00:18:21,760 --> 00:18:24,240 three. I'll go through a uh quick demo 395 00:18:24,240 --> 00:18:29,440 now just to show what it looks like. 396 00:18:32,160 --> 00:18:34,559 Yeah. So, this is what it looks like. We 397 00:18:34,559 --> 00:18:38,360 have an animation 398 00:18:40,480 --> 00:18:45,960 that's using the uh Gap library and 399 00:18:46,000 --> 00:18:47,679 I'll play it on hard difficulty just so 400 00:18:47,679 --> 00:18:49,360 you guys can see it. You can see at the 401 00:18:49,360 --> 00:18:53,039 top uh top right we have the search tree 402 00:18:53,039 --> 00:18:56,000 visualization using the D3JS which I had 403 00:18:56,000 --> 00:18:58,320 to pivot to uh the architecture change. 404 00:18:58,320 --> 00:19:00,799 Below that you can see the stats for the 405 00:19:00,799 --> 00:19:03,840 AI that's uh how good it thinks each 406 00:19:03,840 --> 00:19:05,679 move is. You can check how long it takes 407 00:19:05,679 --> 00:19:08,240 to evaluate each position as well. And 408 00:19:08,240 --> 00:19:11,360 um below that is the AI column scores 409 00:19:11,360 --> 00:19:13,280 which is basically calculating how good 410 00:19:13,280 --> 00:19:15,760 it thinks each column is uh for it to 411 00:19:15,760 --> 00:19:18,000 place. Um, so yeah, that's basically the 412 00:19:18,000 --> 00:19:21,640 gist of the demo. 413 00:19:23,293 --> 00:19:24,799 [applause] 414 00:19:24,799 --> 00:19:26,880 All right, so 415 00:19:26,880 --> 00:19:28,720 I'll talk about the uh main libraries I 416 00:19:28,720 --> 00:19:30,880 used in a little bit of detail. So D3JS 417 00:19:30,880 --> 00:19:32,240 obviously that's what I used for the 418 00:19:32,240 --> 00:19:33,840 visualization when you saw the node 419 00:19:33,840 --> 00:19:36,720 tree. Um, we use recharts here for the 420 00:19:36,720 --> 00:19:39,120 chart you saw at the bottom. that um 421 00:19:39,120 --> 00:19:41,360 helps because it gives us a clear easy 422 00:19:41,360 --> 00:19:42,720 visualization that humans actually 423 00:19:42,720 --> 00:19:44,720 understand and it complements the tree 424 00:19:44,720 --> 00:19:46,640 diagram pretty well in my opinion and 425 00:19:46,640 --> 00:19:48,559 fast API is my bridge between the front 426 00:19:48,559 --> 00:19:50,559 end and the back end and I use it to 427 00:19:50,559 --> 00:19:53,520 expose endpoints like the /ai move uh 428 00:19:53,520 --> 00:19:56,799 state and reset um endpoints that the 429 00:19:56,799 --> 00:19:59,440 function uh front end will call on each 430 00:19:59,440 --> 00:20:02,640 turn. Here's a laundry list of other 431 00:20:02,640 --> 00:20:05,120 stuff. Uh the main things uh from this 432 00:20:05,120 --> 00:20:08,320 list are I use shad CN for the pre-built 433 00:20:08,320 --> 00:20:10,240 um pre-built front-end components. 434 00:20:10,240 --> 00:20:12,000 They're styled with tailwind and CSS. 435 00:20:12,000 --> 00:20:13,679 For the animation you guys saw that said 436 00:20:13,679 --> 00:20:16,480 Python 2026, that's using Gap and I used 437 00:20:16,480 --> 00:20:20,240 frame motion for the board drop. Okay, 438 00:20:20,240 --> 00:20:22,400 so this is a little bit on workflow 439 00:20:22,400 --> 00:20:24,480 because I made this for a school project 440 00:20:24,480 --> 00:20:27,840 and I had to learn how to use GitHub. So 441 00:20:27,840 --> 00:20:29,440 fun little learning experience here. I 442 00:20:29,440 --> 00:20:31,679 used two branches and I had like roughly 443 00:20:31,679 --> 00:20:34,080 55 commits and it took me like two to 444 00:20:34,080 --> 00:20:36,880 four weeks to make this. Um, see my 445 00:20:36,880 --> 00:20:38,320 teacher forced us to use more than one 446 00:20:38,320 --> 00:20:41,239 branch but like I didn't really 447 00:20:41,239 --> 00:20:41,760 [laughter] 448 00:20:41,760 --> 00:20:45,840 like I didn't really need to cuz like I 449 00:20:45,840 --> 00:20:48,320 didn't actually um I had to um I used 450 00:20:48,320 --> 00:20:49,760 one branch for front end and the other 451 00:20:49,760 --> 00:20:51,360 one for the back end but I feel like it 452 00:20:51,360 --> 00:20:52,640 would have been simplistic just to use 453 00:20:52,640 --> 00:20:55,120 one but all right so what did I learn 454 00:20:55,120 --> 00:20:57,600 really quickly? So, uh, making UIs are 455 00:20:57,600 --> 00:20:59,440 brutal, and I think this project just 456 00:20:59,440 --> 00:21:00,960 made me realize how much respect I have 457 00:21:00,960 --> 00:21:02,240 for a lot of front-end developers out 458 00:21:02,240 --> 00:21:03,280 there, especially making things 459 00:21:03,280 --> 00:21:05,200 accessible, making things look pretty. 460 00:21:05,200 --> 00:21:07,039 Uh, make your algorithms better, faster, 461 00:21:07,039 --> 00:21:08,640 stronger, and research what it should 462 00:21:08,640 --> 00:21:10,240 look like instead of just making a bad 463 00:21:10,240 --> 00:21:12,240 one. Uh, read the docs before you marry 464 00:21:12,240 --> 00:21:14,080 a library. And don't be stupid like I 465 00:21:14,080 --> 00:21:16,000 did. Uh, and yeah, my friends won't play 466 00:21:16,000 --> 00:21:17,919 me because I'm the best at Connect 4. 467 00:21:17,919 --> 00:21:18,880 [laughter] 468 00:21:18,880 --> 00:21:20,240 Here are some socials if you want to 469 00:21:20,240 --> 00:21:22,159 take a look at the code. The the code is 470 00:21:22,159 --> 00:21:23,840 on the the GitHub QR code and my 471 00:21:23,840 --> 00:21:25,200 LinkedIn's on the other side. And uh 472 00:21:25,200 --> 00:21:28,399 yeah, thank you guys for listening. 473 00:21:28,399 --> 00:21:30,419 [applause] 474 00:21:32,799 --> 00:21:36,320 Thank you. Next up, we have the fabulous 475 00:21:36,320 --> 00:21:40,480 Tun and Anoo. And while they connect, oh 476 00:21:40,480 --> 00:21:43,200 gosh, there's setup. Uh while they 477 00:21:43,200 --> 00:21:46,240 connect and get ready, I'm going to tell 478 00:21:46,240 --> 00:21:50,240 you about them. Uh they have been 479 00:21:50,240 --> 00:21:54,320 programming for seven and 3 years 480 00:21:54,320 --> 00:21:57,440 respectively and their favorite emoji 481 00:21:57,440 --> 00:22:00,400 are 482 00:22:00,400 --> 00:22:02,159 yawning and I really don't want to do 483 00:22:02,159 --> 00:22:05,120 this one. 484 00:22:05,120 --> 00:22:07,679 Yeah, that kind of Oh gosh. Yeah, my 485 00:22:07,679 --> 00:22:10,159 brain is definitely shaking now. Um 486 00:22:10,159 --> 00:22:12,000 Terrone recently learned that compilers 487 00:22:12,000 --> 00:22:14,799 don't read code line by line. They first 488 00:22:14,799 --> 00:22:16,400 pass it into a tree structure that 489 00:22:16,400 --> 00:22:18,000 represents the program before checking 490 00:22:18,000 --> 00:22:20,960 it and generating machine code and 491 00:22:20,960 --> 00:22:24,880 recently learned uh was ASA path finding 492 00:22:24,880 --> 00:22:27,120 algorithm uh which uses a heruristic to 493 00:22:27,120 --> 00:22:29,039 help determine the fastest path in a 494 00:22:29,039 --> 00:22:30,720 graph and they are going to teach 495 00:22:30,720 --> 00:22:31,840 they're going to here to talk about 496 00:22:31,840 --> 00:22:34,799 neither of those two things but instead 497 00:22:34,799 --> 00:22:37,919 um from vision to braille massive round 498 00:22:37,919 --> 00:22:40,450 of applause. 499 00:22:40,450 --> 00:22:42,470 [applause] 500 00:22:49,919 --> 00:22:54,200 more applause. Okay. 501 00:22:54,860 --> 00:22:56,825 [laughter] 502 00:22:56,825 --> 00:22:58,845 [applause] 503 00:22:59,039 --> 00:23:01,840 Oh, wow. Did you know I recently learned 504 00:23:01,840 --> 00:23:04,480 that they called this a confidence 505 00:23:04,480 --> 00:23:05,919 monitor? 506 00:23:05,919 --> 00:23:08,720 Yeah. Uh, and this gave me confidence 507 00:23:08,720 --> 00:23:11,891 that may in fact have been misplaced. 508 00:23:11,891 --> 00:23:13,911 [laughter] 509 00:23:14,080 --> 00:23:16,320 Um, but I do like I do like the naming 510 00:23:16,320 --> 00:23:19,039 convention of it. Um, okay. We're we're 511 00:23:19,039 --> 00:23:20,400 going to be I'm just going to steal 512 00:23:20,400 --> 00:23:21,919 their thunder and steal their talk now. 513 00:23:21,919 --> 00:23:23,039 We're going to be learning about from 514 00:23:23,039 --> 00:23:26,240 vision to braille building a tactile 515 00:23:26,240 --> 00:23:28,880 reading system with Python, which I'm 516 00:23:28,880 --> 00:23:33,280 imagining will involve these things. 517 00:23:33,280 --> 00:23:35,760 AAA 518 00:23:35,760 --> 00:23:40,039 batteries don't cause fires, right? 519 00:23:40,711 --> 00:23:41,600 [laughter] 520 00:23:41,600 --> 00:23:42,880 Okay, one more massive round of 521 00:23:42,880 --> 00:23:45,296 applause. [cheering] 522 00:23:45,296 --> 00:23:47,316 [applause] 523 00:23:49,760 --> 00:23:52,559 Good afternoon everyone. My name is Tun 524 00:23:52,559 --> 00:23:54,000 and I'm Ambu. 525 00:23:54,000 --> 00:23:55,280 Today we're going to present our project 526 00:23:55,280 --> 00:23:57,919 Brail Vision. 527 00:23:57,919 --> 00:24:00,559 So what is Brail Vision? So back in year 528 00:24:00,559 --> 00:24:02,559 10, we wanted to experiment with OCR in 529 00:24:02,559 --> 00:24:05,360 Python. We're testing how Python could 530 00:24:05,360 --> 00:24:08,320 use a camera to extract and recognize 531 00:24:08,320 --> 00:24:10,320 information. From there, we started 532 00:24:10,320 --> 00:24:11,840 thinking about the actual uses that it 533 00:24:11,840 --> 00:24:14,320 could have. We looked at accessibility 534 00:24:14,320 --> 00:24:16,000 and we thought we could use it to help 535 00:24:16,000 --> 00:24:18,159 blind and visually impaired people read 536 00:24:18,159 --> 00:24:20,640 physically. 537 00:24:20,640 --> 00:24:22,640 How does our braille vision work? It 538 00:24:22,640 --> 00:24:24,799 takes an input from the camera and then 539 00:24:24,799 --> 00:24:28,000 that's converted for easy OCR into text. 540 00:24:28,000 --> 00:24:29,840 This is then corrected through our 541 00:24:29,840 --> 00:24:32,400 algorithms and converted into braille 542 00:24:32,400 --> 00:24:34,159 which is represented through our 543 00:24:34,159 --> 00:24:38,360 physical braille solenoids. 544 00:24:38,799 --> 00:24:41,440 So we use easy OCR to detect printed 545 00:24:41,440 --> 00:24:44,640 text from the camera. Um easy OCR gives 546 00:24:44,640 --> 00:24:46,559 us both the detected text and the 547 00:24:46,559 --> 00:24:49,200 confidence score. This confidence score 548 00:24:49,200 --> 00:24:51,919 is important because OCR isn't always a 549 00:24:51,919 --> 00:24:55,200 reliable source. Instead um treating 550 00:24:55,200 --> 00:24:56,880 instead of treating every detection the 551 00:24:56,880 --> 00:24:59,440 same, we use the confidence to decide 552 00:24:59,440 --> 00:25:02,960 how much correction should be allowed. 553 00:25:02,960 --> 00:25:05,919 Easy OCR can be unreliable at times 554 00:25:05,919 --> 00:25:08,080 based on lighting and angles of the 555 00:25:08,080 --> 00:25:10,080 image. 556 00:25:10,080 --> 00:25:12,640 We tried using a grayscale and altering 557 00:25:12,640 --> 00:25:14,640 the contrast of the image, but it made 558 00:25:14,640 --> 00:25:16,799 the accuracy worse than using original 559 00:25:16,799 --> 00:25:19,440 images. We found out the reason why is 560 00:25:19,440 --> 00:25:21,840 because OCR was trained across a wide 561 00:25:21,840 --> 00:25:25,600 variety of natural images. 562 00:25:25,600 --> 00:25:27,919 As such, we've had to break down uh the 563 00:25:27,919 --> 00:25:30,000 confidence the results of the confidence 564 00:25:30,000 --> 00:25:32,640 scores so we can actually make use of 565 00:25:32,640 --> 00:25:35,760 this text. If it's below 20%, we 566 00:25:35,760 --> 00:25:38,400 disregard the detection altogether. 567 00:25:38,400 --> 00:25:40,960 Between 20 and 35% 568 00:25:40,960 --> 00:25:43,760 uh we dis we keep the detection but 569 00:25:43,760 --> 00:25:46,400 avoid general dictionary corrections. 570 00:25:46,400 --> 00:25:49,360 between 35 and 80% we allow dictionary 571 00:25:49,360 --> 00:25:52,480 corrections within two characters 572 00:25:52,480 --> 00:25:55,360 and if if it's above 80% we trust the 573 00:25:55,360 --> 00:25:59,400 OCR and move on. 574 00:26:00,159 --> 00:26:02,000 So small typos can greatly alter the 575 00:26:02,000 --> 00:26:03,520 meaning and affect understanding of 576 00:26:03,520 --> 00:26:06,000 text. So for general spelling errors we 577 00:26:06,000 --> 00:26:08,799 use Python module SIM spell. So Sim 578 00:26:08,799 --> 00:26:10,240 spell searches it dictionary for 579 00:26:10,240 --> 00:26:12,400 possible corrections. We use the max 580 00:26:12,400 --> 00:26:13,919 edit distance to control how much 581 00:26:13,919 --> 00:26:16,799 characters it's allowed to change. 582 00:26:16,799 --> 00:26:18,960 If it finds several suggestions, we take 583 00:26:18,960 --> 00:26:21,039 the highest ranked one. If it can't find 584 00:26:21,039 --> 00:26:23,360 any suitable, we keep the original word. 585 00:26:23,360 --> 00:26:25,200 But using the same edit distance for 586 00:26:25,200 --> 00:26:28,480 every word did have another problem. 587 00:26:28,480 --> 00:26:30,320 An edit distance of one had a much 588 00:26:30,320 --> 00:26:32,000 bigger impact on shorter words compared 589 00:26:32,000 --> 00:26:34,080 to longer words. So we had to make a new 590 00:26:34,080 --> 00:26:35,919 method to determine the edit distance 591 00:26:35,919 --> 00:26:38,480 where we combine both the confidence 592 00:26:38,480 --> 00:26:42,000 score and word length. 593 00:26:42,000 --> 00:26:44,640 A dictionary still has one major 594 00:26:44,640 --> 00:26:46,960 limitation. OCR can produce the wrong 595 00:26:46,960 --> 00:26:49,760 word, but that wrong word might still be 596 00:26:49,760 --> 00:26:52,240 a real English word. For example, the 597 00:26:52,240 --> 00:26:55,679 dog ran Rome contains only valid words. 598 00:26:55,679 --> 00:26:57,919 So, Sim spell has no reason to change 599 00:26:57,919 --> 00:27:00,080 Rome. Originally, we tried using the 600 00:27:00,080 --> 00:27:03,360 charge API to correct words using 601 00:27:03,360 --> 00:27:06,000 context. But without a stable Wi-Fi, it 602 00:27:06,000 --> 00:27:09,039 ran too slow and was ineffective for us. 603 00:27:09,039 --> 00:27:12,159 That's where distill belt distill came 604 00:27:12,159 --> 00:27:15,679 in. Our code selects a word um and to 605 00:27:15,679 --> 00:27:18,640 check and replace it with a mask. It 606 00:27:18,640 --> 00:27:20,400 then generates plausible alternatives 607 00:27:20,400 --> 00:27:23,600 such as sum and home. 608 00:27:23,600 --> 00:27:25,120 This tool belt uses a rest of the 609 00:27:25,120 --> 00:27:27,760 sentence to score which candidate fits 610 00:27:27,760 --> 00:27:30,159 the context better. In this case, the 611 00:27:30,159 --> 00:27:35,080 final correct output is dog ran home. 612 00:27:35,200 --> 00:27:37,760 So before distiller scores anything, we 613 00:27:37,760 --> 00:27:39,679 need to restrict the candidate set. We 614 00:27:39,679 --> 00:27:41,919 use simf spell to generate um possible 615 00:27:41,919 --> 00:27:43,919 alternatives with like a head distance 616 00:27:43,919 --> 00:27:46,720 of one. That keeps alternatives visually 617 00:27:46,720 --> 00:27:48,320 similar to what the OCR originally 618 00:27:48,320 --> 00:27:50,640 detected. We also limit dictionary 619 00:27:50,640 --> 00:27:53,039 suggestions to eight words. Those 620 00:27:53,039 --> 00:27:54,480 suggest suggestions are stored as 621 00:27:54,480 --> 00:27:56,799 candidates for the still book. This is 622 00:27:56,799 --> 00:27:58,240 done so the model doesn't freely just 623 00:27:58,240 --> 00:28:00,080 change a sentence only ranks the best 624 00:28:00,080 --> 00:28:03,080 candidate. 625 00:28:03,200 --> 00:28:05,360 Once we have the candidates, we run the 626 00:28:05,360 --> 00:28:07,760 mask sentence through distiller. The 627 00:28:07,760 --> 00:28:09,360 code finds the exact position of the 628 00:28:09,360 --> 00:28:12,000 mask. Distiller outputs raw scores 629 00:28:12,000 --> 00:28:13,919 called logits possible words at that 630 00:28:13,919 --> 00:28:16,559 position. We convert those scores into 631 00:28:16,559 --> 00:28:18,880 log probabilities using the log softmax 632 00:28:18,880 --> 00:28:21,679 function. They can be compared. A higher 633 00:28:21,679 --> 00:28:23,760 log probability means the model 634 00:28:23,760 --> 00:28:25,360 considered that candidate more likely in 635 00:28:25,360 --> 00:28:27,279 the sentence. 636 00:28:27,279 --> 00:28:29,600 So how are logits comp converted into 637 00:28:29,600 --> 00:28:32,159 log probabilities? So at first the 638 00:28:32,159 --> 00:28:34,000 program gives you a raw score which 639 00:28:34,000 --> 00:28:36,159 isn't really too helpful. 640 00:28:36,159 --> 00:28:38,480 Then we use the softmax function formula 641 00:28:38,480 --> 00:28:40,799 to convert them into 642 00:28:40,799 --> 00:28:42,720 probabilities. It does this by 643 00:28:42,720 --> 00:28:44,559 exponentiating each score and dividing 644 00:28:44,559 --> 00:28:47,200 it by the total. These probabilities 645 00:28:47,200 --> 00:28:48,880 then are then put on a logarithmic scale 646 00:28:48,880 --> 00:28:50,880 to enhance the differences making it 647 00:28:50,880 --> 00:28:54,640 easier for the program to compare. 648 00:28:54,640 --> 00:28:56,159 We still don't automatically accept 649 00:28:56,159 --> 00:28:58,880 whichever candidate distes highest. 650 00:28:58,880 --> 00:29:01,039 First, we calculate how much better the 651 00:29:01,039 --> 00:29:02,960 best alternative scored compared to the 652 00:29:02,960 --> 00:29:05,440 original. That improvement must pass the 653 00:29:05,440 --> 00:29:08,159 minimum threshold. If easy OCR was 654 00:29:08,159 --> 00:29:10,240 already very confident, we increase the 655 00:29:10,240 --> 00:29:12,240 required threshold. So, the context 656 00:29:12,240 --> 00:29:14,480 model acts like a cautious opinion 657 00:29:14,480 --> 00:29:18,600 rather than having complete control. 658 00:29:18,640 --> 00:29:20,720 Once the text is corrected, the process 659 00:29:20,720 --> 00:29:22,720 becomes deterministic. 660 00:29:22,720 --> 00:29:25,039 Each character is mapped to a six dot 661 00:29:25,039 --> 00:29:28,080 brail pattern. This six pattern the six 662 00:29:28,080 --> 00:29:31,039 positions are one numbered one to six. 663 00:29:31,039 --> 00:29:33,120 For example, different letters comp 664 00:29:33,120 --> 00:29:35,520 correspond to different combinations of 665 00:29:35,520 --> 00:29:38,399 raised dots. The character is converted 666 00:29:38,399 --> 00:29:40,080 into a pattern before being sent to the 667 00:29:40,080 --> 00:29:42,240 hardware. 668 00:29:42,240 --> 00:29:45,360 This is the full physical circuit. Um 669 00:29:45,360 --> 00:29:47,360 the main parts of the ESP 32, the 670 00:29:47,360 --> 00:29:49,760 solenoids, the power source and the 671 00:29:49,760 --> 00:29:53,760 solenoid pistons and the relay module. 672 00:29:53,760 --> 00:29:56,320 The ESP32 access the control of our 673 00:29:56,320 --> 00:29:59,440 system. It hosts its own Wi-Fi which 674 00:29:59,440 --> 00:30:01,360 that code connects and sends over 675 00:30:01,360 --> 00:30:03,520 individual characters. It then 676 00:30:03,520 --> 00:30:05,120 determines which braille dots are 677 00:30:05,120 --> 00:30:08,000 necessary. The ESP32 itself does not 678 00:30:08,000 --> 00:30:10,880 power the solenoids. 679 00:30:10,880 --> 00:30:12,880 The relay module acts as a sort of 680 00:30:12,880 --> 00:30:15,200 electrical switch 681 00:30:15,200 --> 00:30:17,039 channels. It channels the power to the 682 00:30:17,039 --> 00:30:19,760 solenoids. The ESP32 tells individual 683 00:30:19,760 --> 00:30:21,840 relays when to switch. Each relay 684 00:30:21,840 --> 00:30:24,799 controls power to one solenoid. This 685 00:30:24,799 --> 00:30:27,360 means each braille dot can be controlled 686 00:30:27,360 --> 00:30:29,440 independently. 687 00:30:29,440 --> 00:30:31,600 The solenoids create physical braille 688 00:30:31,600 --> 00:30:34,399 dots. When powered, the solenoids rise 689 00:30:34,399 --> 00:30:35,679 to represent different braille 690 00:30:35,679 --> 00:30:37,679 characters. This is where the digital 691 00:30:37,679 --> 00:30:41,520 characters become something tactile. 692 00:30:41,520 --> 00:30:43,360 We will now visually demonstrate our 693 00:30:43,360 --> 00:30:45,440 project on video one. 694 00:30:45,440 --> 00:30:47,440 So now we'll go over a quick um demo of 695 00:30:47,440 --> 00:30:49,919 our project. On the laptop over here, we 696 00:30:49,919 --> 00:30:53,120 have the OCR running scanning for text. 697 00:30:53,120 --> 00:30:54,880 So now we're like pick up on the text on 698 00:30:54,880 --> 00:30:58,320 the notebook. 699 00:30:58,320 --> 00:31:00,480 The laptop individually sends characters 700 00:31:00,480 --> 00:31:02,799 to the ESP32. 701 00:31:02,799 --> 00:31:05,520 As you can see over here, the ESP32 702 00:31:05,520 --> 00:31:07,919 sends signals to the relay module and 703 00:31:07,919 --> 00:31:09,919 the relay module in turn powers the 704 00:31:09,919 --> 00:31:12,159 solenoids which represents individual 705 00:31:12,159 --> 00:31:15,640 braid patterns. 706 00:31:24,456 --> 00:31:26,476 [applause] 707 00:31:26,640 --> 00:31:29,041 Thank you so much for your time. 708 00:31:29,041 --> 00:31:33,039 [applause] Thank you for your time. 709 00:31:33,039 --> 00:31:36,640 Woo. That's amazing. Before you unplug 710 00:31:36,640 --> 00:31:38,960 this, you must hold this up so that the 711 00:31:38,960 --> 00:31:41,360 audience can see as well. I don't want 712 00:31:41,360 --> 00:31:43,120 to I I don't want to break that. That 713 00:31:43,120 --> 00:31:48,679 was amazing. Yes. Proof. 714 00:31:50,002 --> 00:31:51,039 [applause] 715 00:31:51,039 --> 00:31:55,120 Up on deck. Now we have Tara. And Tara's 716 00:31:55,120 --> 00:31:57,919 going to be talking to us about rocket 717 00:31:57,919 --> 00:32:01,840 science in the shower. Uh, which I guess 718 00:32:01,840 --> 00:32:04,000 if it does catch fire, you've got this. 719 00:32:04,000 --> 00:32:05,840 Yeah. Okay. Um, Tara has been 720 00:32:05,840 --> 00:32:10,880 programming for 1.5 years. And, um, her 721 00:32:10,880 --> 00:32:14,000 favorite emoji is 722 00:32:14,000 --> 00:32:16,480 I should have checked this. 723 00:32:16,480 --> 00:32:20,000 The rockstar one. Yes. Thank you. I'm so 724 00:32:20,000 --> 00:32:21,919 glad you all know what these emoji are 725 00:32:21,919 --> 00:32:25,760 named cuz I Yeah. Um she recently found 726 00:32:25,760 --> 00:32:29,440 out that Samsung was founded in 1938 727 00:32:29,440 --> 00:32:32,480 as a grocery trading company that 728 00:32:32,480 --> 00:32:36,000 exported dried Korean fish, vegetables, 729 00:32:36,000 --> 00:32:38,080 and fruit directly to cities in 730 00:32:38,080 --> 00:32:40,880 northeast China. I didn't know that 731 00:32:40,880 --> 00:32:42,960 either. 732 00:32:42,960 --> 00:32:46,320 Um, and she's also now discovering the 733 00:32:46,320 --> 00:32:49,519 complexities of HDMI cables. There we 734 00:32:49,519 --> 00:32:53,679 go. Um, 735 00:32:53,679 --> 00:32:56,000 now I have to revisit my earlier 736 00:32:56,000 --> 00:33:00,039 citation about confidence. 737 00:33:01,120 --> 00:33:02,640 While we have some confidence, can I get 738 00:33:02,640 --> 00:33:05,327 a massive round of applause for Tara? 739 00:33:05,327 --> 00:33:07,347 [applause] 740 00:33:09,679 --> 00:33:11,760 Now, despite what Nikki said, my project 741 00:33:11,760 --> 00:33:14,000 isn't exactly about rocket science. It's 742 00:33:14,000 --> 00:33:15,760 actually about Wordle, but rocket 743 00:33:15,760 --> 00:33:17,840 science is still part of the picture. 744 00:33:17,840 --> 00:33:20,159 So, I'm going to be playing an animation 745 00:33:20,159 --> 00:33:22,880 that sort of explains how I actually 746 00:33:22,880 --> 00:33:26,480 figured out the idea. So, let's begin. 747 00:33:26,480 --> 00:33:29,480 Okay. 748 00:33:33,840 --> 00:33:36,240 Yep. Ideas rarely start in a neat 749 00:33:36,240 --> 00:33:38,000 planning space. They hit you when you 750 00:33:38,000 --> 00:33:39,919 are completely vulnerable. Like standing 751 00:33:39,919 --> 00:33:42,000 under scalding water in the shower, 752 00:33:42,000 --> 00:33:43,840 staring blankly at the grid of bathroom 753 00:33:43,840 --> 00:33:46,320 war tiles. I was planning drafting a 754 00:33:46,320 --> 00:33:48,799 Python telemetry script to calculate 755 00:33:48,799 --> 00:33:51,360 orbital velocities and fuel burn curves 756 00:33:51,360 --> 00:33:53,919 for interstellar spacecraft. Rocket 757 00:33:53,919 --> 00:33:56,960 physics is clean and predictable. But as 758 00:33:56,960 --> 00:33:59,840 the water ran, my eyes locked onto the 759 00:33:59,840 --> 00:34:01,840 intersecting grout lines of the tiles 760 00:34:01,840 --> 00:34:04,399 and my brain flipped. I didn't want to 761 00:34:04,399 --> 00:34:06,480 launch rockets anymore. I wanted to 762 00:34:06,480 --> 00:34:08,560 build an engine to solve the daily 763 00:34:08,560 --> 00:34:10,879 Wordle. I leaped out of the shower, 764 00:34:10,879 --> 00:34:12,960 leaving wet footprints across the floor, 765 00:34:12,960 --> 00:34:15,440 booting up a blank IDE. 766 00:34:15,440 --> 00:34:17,440 Today's presentation will be providing a 767 00:34:17,440 --> 00:34:20,653 glimpse of what I did after. 768 00:34:20,653 --> 00:34:21,520 [laughter] 769 00:34:21,520 --> 00:34:23,040 For those of you who are wondering, I 770 00:34:23,040 --> 00:34:25,520 did that animation completely on HTML. 771 00:34:25,520 --> 00:34:29,639 It was really hard. 772 00:34:29,839 --> 00:34:32,960 A bit about me. Hi everyone. I'm Tara. 773 00:34:32,960 --> 00:34:35,119 I'm 13 years old. And a fun fact about 774 00:34:35,119 --> 00:34:36,639 me is I'm kind of obsessed with the 775 00:34:36,639 --> 00:34:41,013 periodic table. So yeah, [laughter] 776 00:34:41,919 --> 00:34:43,919 so this presentation will be following 777 00:34:43,919 --> 00:34:45,839 this structure starting with a context 778 00:34:45,839 --> 00:34:48,639 on Wordle entropy, a demo, and a little 779 00:34:48,639 --> 00:34:50,639 reflection about stuff I learned and the 780 00:34:50,639 --> 00:34:53,280 things I could improve. 781 00:34:53,280 --> 00:34:55,599 All right, Wordle is a simple guessing 782 00:34:55,599 --> 00:34:57,920 game. You have six attempts to find a 783 00:34:57,920 --> 00:35:00,160 fiveletter word. And after each guess, 784 00:35:00,160 --> 00:35:02,079 the game gives you information about 785 00:35:02,079 --> 00:35:04,880 three colors, green, yellow, and gray. 786 00:35:04,880 --> 00:35:06,720 But out of that, feedback is doing 787 00:35:06,720 --> 00:35:08,720 something much more important than 788 00:35:08,720 --> 00:35:10,480 simply telling us whether a letter is 789 00:35:10,480 --> 00:35:12,400 right or wrong. It is reducing 790 00:35:12,400 --> 00:35:15,040 uncertainty. We begin with thousands of 791 00:35:15,040 --> 00:35:17,280 possible words. Before our first guess, 792 00:35:17,280 --> 00:35:19,440 we have a huge amount of uncertainty 793 00:35:19,440 --> 00:35:21,760 about which one is correct. Then we make 794 00:35:21,760 --> 00:35:24,000 a guess. The five tiles return a pattern 795 00:35:24,000 --> 00:35:26,160 of colors, and that pattern allows us to 796 00:35:26,160 --> 00:35:28,240 eliminate words that could no longer be 797 00:35:28,240 --> 00:35:30,160 the answer. So, our goal isn't 798 00:35:30,160 --> 00:35:31,920 necessarily to guess the answer 799 00:35:31,920 --> 00:35:34,560 immediately. Our goal is to gain as much 800 00:35:34,560 --> 00:35:37,280 information as possible. But that 801 00:35:37,280 --> 00:35:39,839 creates a question, how can we measure 802 00:35:39,839 --> 00:35:42,480 information? This is where we need 803 00:35:42,480 --> 00:35:45,359 entropy. In information theory, entropy 804 00:35:45,359 --> 00:35:47,040 is the qualitative measurement of 805 00:35:47,040 --> 00:35:50,240 uncertainty or randomness in a data set. 806 00:35:50,240 --> 00:35:52,240 If a system is completely predictable, 807 00:35:52,240 --> 00:35:54,000 its entropy is zero. If [snorts] a 808 00:35:54,000 --> 00:35:56,160 system is completely random, its entropy 809 00:35:56,160 --> 00:35:58,560 is at its maximum. In the context of 810 00:35:58,560 --> 00:36:00,400 word orle, entropy represents the 811 00:36:00,400 --> 00:36:03,200 slicing power of a word. A high entropy 812 00:36:03,200 --> 00:36:05,839 guess is one that is guaranteed to split 813 00:36:05,839 --> 00:36:07,760 our remaining word pool into small 814 00:36:07,760 --> 00:36:10,000 manageable groups, no matter what the 815 00:36:10,000 --> 00:36:12,560 colors of the game returns. This is the 816 00:36:12,560 --> 00:36:17,079 idea that will drive our solver. 817 00:36:17,280 --> 00:36:19,040 Let's look at entropy and how it's 818 00:36:19,040 --> 00:36:21,200 calculated in our function. First, the 819 00:36:21,200 --> 00:36:23,359 word handles a boundary condition. If 820 00:36:23,359 --> 00:36:25,520 the pool of remaining words is empty, 821 00:36:25,520 --> 00:36:28,000 there is zero uncertainty left. So, it 822 00:36:28,000 --> 00:36:30,720 returns an entropy of zero. Here, the 823 00:36:30,720 --> 00:36:33,040 code runs a simulation. It takes a 824 00:36:33,040 --> 00:36:35,200 potential guess and simulates playing it 825 00:36:35,200 --> 00:36:37,200 against every single word left in our 826 00:36:37,200 --> 00:36:39,200 current pool. For every word, it 827 00:36:39,200 --> 00:36:41,040 calculates what the word oral feedback 828 00:36:41,040 --> 00:36:43,280 colors would be. It uses Python's 829 00:36:43,280 --> 00:36:45,280 counter to group the words into these 830 00:36:45,280 --> 00:36:47,280 color buckets, we'll call them, and 831 00:36:47,280 --> 00:36:50,160 counts them. 832 00:36:50,160 --> 00:36:52,079 This is the formula that calculates 833 00:36:52,079 --> 00:36:54,400 standard Shannon entropy. For every 834 00:36:54,400 --> 00:36:56,400 color bucket, the code calculates the 835 00:36:56,400 --> 00:36:59,040 probability P of hitting that bucket by 836 00:36:59,040 --> 00:37:01,359 dividing the count of words in that 837 00:37:01,359 --> 00:37:03,520 bucket by the total number of words in 838 00:37:03,520 --> 00:37:06,720 the P pool. If P is greater than zero, 839 00:37:06,720 --> 00:37:08,720 it multiplies that probability by the 840 00:37:08,720 --> 00:37:11,920 base 2 logarithm of its inverse. It adds 841 00:37:11,920 --> 00:37:14,240 these values together for all buckets to 842 00:37:14,240 --> 00:37:17,040 return the total expected entropy. If a 843 00:37:17,040 --> 00:37:19,760 word clumps all remaining words into one 844 00:37:19,760 --> 00:37:22,240 giant bucket, P is equal to 1, the 845 00:37:22,240 --> 00:37:24,320 answer to the logarithm is zero. So 846 00:37:24,320 --> 00:37:27,040 entropy is zero. If it distributes words 847 00:37:27,040 --> 00:37:30,960 evenly across many buckets is small, the 848 00:37:30,960 --> 00:37:33,280 answer to the logarithm is large and the 849 00:37:33,280 --> 00:37:36,160 resulting entropy is high. While entropy 850 00:37:36,160 --> 00:37:38,720 is our primary tool, our solver also 851 00:37:38,720 --> 00:37:41,440 uses three other functions that act as 852 00:37:41,440 --> 00:37:43,839 huristics to analyze the physical 853 00:37:43,839 --> 00:37:47,040 properties of human language. 854 00:37:47,040 --> 00:37:49,440 The first function evaluates positional 855 00:37:49,440 --> 00:37:52,160 topology. It uses a numerate word to 856 00:37:52,160 --> 00:37:54,480 loop through each letter position I from 857 00:37:54,480 --> 00:37:56,960 1 to four. It counts how many words in 858 00:37:56,960 --> 00:37:59,280 our remaining pool share that exact same 859 00:37:59,280 --> 00:38:01,680 letter at that exact same position. It 860 00:38:01,680 --> 00:38:03,440 divides this by the total number of 861 00:38:03,440 --> 00:38:05,599 remaining words to create a probability 862 00:38:05,599 --> 00:38:08,720 score. This ensures that the solver 863 00:38:08,720 --> 00:38:11,280 favors words containing letters placed 864 00:38:11,280 --> 00:38:15,119 in highly common positions. 865 00:38:15,119 --> 00:38:17,280 This function scores words based on 866 00:38:17,280 --> 00:38:20,240 their phonetic rhythm. It sets up a set 867 00:38:20,240 --> 00:38:22,560 of vowels and counts how many are in a 868 00:38:22,560 --> 00:38:25,359 word. The ideal amount of vowels to 869 00:38:25,359 --> 00:38:28,880 constants is 2 to three. The second 870 00:38:28,880 --> 00:38:31,359 measures informational variance. 871 00:38:31,359 --> 00:38:33,520 Converting the fiveletter word into a 872 00:38:33,520 --> 00:38:36,480 set removes duplicate letters. If all 873 00:38:36,480 --> 00:38:39,839 letters are unique, lenset word is five, 874 00:38:39,839 --> 00:38:42,079 yielding a perfect diversity score of 875 00:38:42,079 --> 00:38:45,280 one. A word like robot drops to 0.8 876 00:38:45,280 --> 00:38:47,760 because O is repeated. This pushes the 877 00:38:47,760 --> 00:38:50,720 solver to test five unique dimensions. 878 00:38:50,720 --> 00:38:53,440 On the very first turn where Len is 879 00:38:53,440 --> 00:38:56,960 zero, the code sort of shortcircuits the 880 00:38:56,960 --> 00:39:00,320 heavy math and immediately plays Tara's 881 00:39:00,320 --> 00:39:03,200 kind of sounds like my name, [laughter] 882 00:39:03,200 --> 00:39:05,200 which is a mathematically proven 883 00:39:05,200 --> 00:39:08,000 preomputed optimal opening word because 884 00:39:08,000 --> 00:39:10,320 it fulfills all these three checkpoints. 885 00:39:10,320 --> 00:39:12,400 One, it has two vowels and three 886 00:39:12,400 --> 00:39:14,720 consonants. Two, it has all different 887 00:39:14,720 --> 00:39:16,720 letters. And three, it has its letters 888 00:39:16,720 --> 00:39:19,359 at the most common places for them to 889 00:39:19,359 --> 00:39:22,880 be. Now, that was entropy and the 890 00:39:22,880 --> 00:39:26,079 calculation behind the solver. So, let's 891 00:39:26,079 --> 00:39:28,320 actually see if it works in actuality. 892 00:39:28,320 --> 00:39:31,782 Let's demo time. 893 00:39:31,782 --> 00:39:33,802 [applause] 894 00:39:45,280 --> 00:39:46,960 All right, 895 00:39:46,960 --> 00:39:48,240 while we're getting that out, who else 896 00:39:48,240 --> 00:39:52,599 has word first words? 897 00:39:55,920 --> 00:39:59,320 We have audio. 898 00:40:00,000 --> 00:40:03,240 It's you. 899 00:40:10,240 --> 00:40:14,680 Uh, has anyone ever 900 00:40:22,720 --> 00:40:25,720 seconded? 901 00:40:26,320 --> 00:40:27,680 Have you ever gotten a word on your 902 00:40:27,680 --> 00:40:28,320 first go? 903 00:40:28,320 --> 00:40:29,359 No. 904 00:40:29,359 --> 00:40:33,040 No. Y. [cheering] 905 00:40:33,040 --> 00:40:35,839 So, as you can probably tell, oh, as you 906 00:40:35,839 --> 00:40:38,960 can probably tell, the UI, like the user 907 00:40:38,960 --> 00:40:40,400 interface isn't the best. So, that's one 908 00:40:40,400 --> 00:40:41,359 of the things that I'm going to improve 909 00:40:41,359 --> 00:40:44,880 on. But, nonetheless, it still works. 910 00:40:44,880 --> 00:40:47,440 So, let's test it out. So, obviously, 911 00:40:47,440 --> 00:40:52,800 we're going to put in Tara into Wordle. 912 00:40:52,800 --> 00:40:53,119 Oh, 913 00:40:53,119 --> 00:40:54,400 give me give me a second. 914 00:40:54,400 --> 00:40:55,680 Thank you. Sorry. 915 00:40:55,680 --> 00:40:57,200 Here we go. You talk. I'll hold it. 916 00:40:57,200 --> 00:40:58,720 All right. So, we're going to put Tara 917 00:40:58,720 --> 00:41:02,800 into it. Let's do it. Okay. So, in my 918 00:41:02,800 --> 00:41:04,720 word, I forgot to mention this in the 919 00:41:04,720 --> 00:41:07,520 presentation, but the gray letter will 920 00:41:07,520 --> 00:41:10,000 be used as zero, yellow will be one, and 921 00:41:10,000 --> 00:41:14,000 green will be two. So, here two 0 0 two 922 00:41:14,000 --> 00:41:17,119 0. Let's put it in then. 923 00:41:17,119 --> 00:41:20,480 Two zero zero two zero. Thanks. I kind 924 00:41:20,480 --> 00:41:23,280 of forget sometimes. All right. Now, we 925 00:41:23,280 --> 00:41:25,680 have we're going to put in tweet. Can we 926 00:41:25,680 --> 00:41:29,028 see that? Cool. 927 00:41:29,028 --> 00:41:31,048 [laughter] 928 00:41:31,920 --> 00:41:34,400 Okay. 929 00:41:34,400 --> 00:41:36,800 Oh, so close. 930 00:41:36,800 --> 00:41:39,839 I was like, "Oh, oh, no." 931 00:41:39,839 --> 00:41:40,319 Okay. 932 00:41:40,319 --> 00:41:41,680 So close. [laughter] 933 00:41:41,680 --> 00:41:45,040 Okay. What was it? Two. Two. Two. Two. 934 00:41:45,040 --> 00:41:49,560 Zero. Let's see what it does. 935 00:41:50,480 --> 00:41:59,000 Tweed is I think that's our word. E E D 936 00:41:59,520 --> 00:42:03,640 Oh no. 937 00:42:04,240 --> 00:42:06,560 Okay. 938 00:42:06,560 --> 00:42:08,640 Two. Two. Two. Two. 939 00:42:08,640 --> 00:42:10,800 If you if you don't want your worldle 940 00:42:10,800 --> 00:42:11,839 spoiled today, 941 00:42:11,839 --> 00:42:15,280 look away now. [laughter] 942 00:42:15,280 --> 00:42:17,119 Oh no. 943 00:42:17,119 --> 00:42:19,359 The feedback seems to be inconsist 944 00:42:19,359 --> 00:42:22,079 continuing with current possibilities. 945 00:42:22,079 --> 00:42:23,839 That's never happened before. I think we 946 00:42:23,839 --> 00:42:25,520 need to update the dictionary. Let's try 947 00:42:25,520 --> 00:42:26,480 tween. 948 00:42:26,480 --> 00:42:30,040 Tween. All right. 949 00:42:35,839 --> 00:42:37,119 [screaming] 950 00:42:37,119 --> 00:42:40,800 Now, going back. [applause] 951 00:42:40,800 --> 00:42:43,040 Obviously, it needs some improvements. 952 00:42:43,040 --> 00:42:45,520 Tween isn't in the dictionary. So, as 953 00:42:45,520 --> 00:42:50,079 soon as I as soon as I get home, that's 954 00:42:50,079 --> 00:42:52,160 what I'm adding into the dictionary. 955 00:42:52,160 --> 00:42:53,920 Let's look at some of my future 956 00:42:53,920 --> 00:42:57,280 ambitions of this project. So, the first 957 00:42:57,280 --> 00:42:59,359 thing I want to do is obviously create a 958 00:42:59,359 --> 00:43:01,520 much better user interface. It's there's 959 00:43:01,520 --> 00:43:02,960 lots of words and I don't really like 960 00:43:02,960 --> 00:43:05,200 that that much. I want it to look nice. 961 00:43:05,200 --> 00:43:07,599 The next thing I want to do is expand my 962 00:43:07,599 --> 00:43:09,280 solver to different languages like 963 00:43:09,280 --> 00:43:12,640 Italian, Chinese, Hindi. And my 964 00:43:12,640 --> 00:43:14,319 short-term goal, however, is to create 965 00:43:14,319 --> 00:43:16,400 an Italian word or solver. But if there 966 00:43:16,400 --> 00:43:18,000 are any other languages that you guys 967 00:43:18,000 --> 00:43:20,800 want to see, please do tell me. But 968 00:43:20,800 --> 00:43:23,839 anyway, that's it from me. Bye. Thank 969 00:43:23,839 --> 00:43:25,619 you. [cheering] 970 00:43:25,619 --> 00:43:27,640 [applause] 971 00:43:30,480 --> 00:43:34,135 Massive round of applause for Tara. 972 00:43:34,135 --> 00:43:35,445 [cheering] 973 00:43:35,445 --> 00:43:37,040 [applause] 974 00:43:37,040 --> 00:43:38,640 Okay, 975 00:43:38,640 --> 00:43:44,615 I hope you all like words and also maths 976 00:43:44,615 --> 00:43:45,680 [cheering] 977 00:43:45,680 --> 00:43:48,640 because next up we have Isa who's going 978 00:43:48,640 --> 00:43:52,560 to talk about polomial long division. 979 00:43:52,560 --> 00:43:55,040 Now while she sets up I have it on good 980 00:43:55,040 --> 00:43:57,280 authority that it was her birthday 981 00:43:57,280 --> 00:44:00,240 earlier in the week and she was stuck in 982 00:44:00,240 --> 00:44:03,200 exams and then prep for pyon. So, can we 983 00:44:03,200 --> 00:44:04,480 all do the most embarrassing thing 984 00:44:04,480 --> 00:44:06,000 possible and sing her the first line of 985 00:44:06,000 --> 00:44:07,599 happy birthday ridiculously quickly? 986 00:44:07,599 --> 00:44:11,440 Ready? Happy birthday to you. Cut. Thank 987 00:44:11,440 --> 00:44:13,435 you. 988 00:44:13,435 --> 00:44:15,839 [screaming] Um, she has been programming 989 00:44:15,839 --> 00:44:17,920 for an unknown length of time depending 990 00:44:17,920 --> 00:44:19,920 on what our definition of programming 991 00:44:19,920 --> 00:44:22,319 is. And I never clarified 992 00:44:22,319 --> 00:44:25,440 so we'll never know. 993 00:44:25,440 --> 00:44:26,640 No, but how long? 994 00:44:26,640 --> 00:44:27,920 Uh, I don't know. 995 00:44:27,920 --> 00:44:30,960 Nobody knows. [laughter] 996 00:44:30,960 --> 00:44:33,760 He's saying two uh two two years. Two 997 00:44:33,760 --> 00:44:39,000 years. Uh her favorite emoji is 998 00:44:41,920 --> 00:44:44,720 swan. Swan. I was worried about that 999 00:44:44,720 --> 00:44:46,240 one. Um [laughter] 1000 00:44:46,240 --> 00:44:49,599 and recently she learned how CC cyclic 1001 00:44:49,599 --> 00:44:51,440 redundancy check can detect errors in 1002 00:44:51,440 --> 00:44:53,599 data transmission by using polomial 1003 00:44:53,599 --> 00:44:55,680 division to generate a check sum. It 1004 00:44:55,680 --> 00:44:58,079 helps ensure data hasn't been corrupted 1005 00:44:58,079 --> 00:45:00,560 during transfer. 1006 00:45:00,560 --> 00:45:02,560 One massive round of applause. Let's 1007 00:45:02,560 --> 00:45:05,181 hear all about it. 1008 00:45:05,181 --> 00:45:07,201 [applause] 1009 00:45:07,680 --> 00:45:10,079 Um hello everyone. My name is Isa and my 1010 00:45:10,079 --> 00:45:12,480 project is the CRC checker. So it uses 1011 00:45:12,480 --> 00:45:14,880 polomial long division. So just a bit 1012 00:45:14,880 --> 00:45:17,040 about CRC. It stands for the cyclic 1013 00:45:17,040 --> 00:45:19,280 redundancy check. Um and it checks to 1014 00:45:19,280 --> 00:45:21,200 see if data being sent and received on 1015 00:45:21,200 --> 00:45:23,040 two ends is the same data. So whether 1016 00:45:23,040 --> 00:45:24,560 it's been changed or altered in the 1017 00:45:24,560 --> 00:45:26,079 process, whether it's been corrupted or 1018 00:45:26,079 --> 00:45:27,760 not, it helps us make sure the 1019 00:45:27,760 --> 00:45:30,640 information is secure. Um, and so you 1020 00:45:30,640 --> 00:45:32,319 might be wondering how or like more 1021 00:45:32,319 --> 00:45:34,240 specifically why I decided to figure 1022 00:45:34,240 --> 00:45:36,319 this out or learn about it at all. So 1023 00:45:36,319 --> 00:45:38,960 CRC is very heavily maths based like in 1024 00:45:38,960 --> 00:45:40,400 the background is just lots and lots of 1025 00:45:40,400 --> 00:45:42,960 maths algorithm. And some of you 1026 00:45:42,960 --> 00:45:44,480 probably for that reason think it's 1027 00:45:44,480 --> 00:45:47,040 extremely boring. But let me explain. 1028 00:45:47,040 --> 00:45:49,280 You say yes. [laughter] Sorry. Let me 1029 00:45:49,280 --> 00:45:52,079 let me explain. Let me explain why I 1030 00:45:52,079 --> 00:45:54,480 care so much about it despite that. So, 1031 00:45:54,480 --> 00:45:56,640 just a bit of context about me. I'm in 1032 00:45:56,640 --> 00:45:58,800 year 11 and I go to Bergman Anglican 1033 00:45:58,800 --> 00:46:01,520 School located in the ACT and my skills 1034 00:46:01,520 --> 00:46:04,800 are maths. 1035 00:46:04,800 --> 00:46:06,960 Um, and given that my skills and passion 1036 00:46:06,960 --> 00:46:09,119 are in maths, um, I was accelerated to 1037 00:46:09,119 --> 00:46:12,480 year 11 spec when I was in year 10 and 1038 00:46:12,480 --> 00:46:14,640 our first exam was a polomial long 1039 00:46:14,640 --> 00:46:17,920 division exam. Um, however, I decided to 1040 00:46:17,920 --> 00:46:20,000 throw away a mark [snorts] because I 1041 00:46:20,000 --> 00:46:24,640 said that 180 - 75 - 60 is 55. And as 1042 00:46:24,640 --> 00:46:26,400 you can see, my teacher suggested that 1043 00:46:26,400 --> 00:46:29,680 it wasn't 55 and it was 45 instead. Um, 1044 00:46:29,680 --> 00:46:31,200 but what sucks about this is I actually 1045 00:46:31,200 --> 00:46:33,359 had two calculators in front of me, but 1046 00:46:33,359 --> 00:46:35,119 both my graphics and my scientific 1047 00:46:35,119 --> 00:46:38,192 calculator, and I decided not to use it. 1048 00:46:38,192 --> 00:46:40,960 [snorts] So, as you can see, and then a 1049 00:46:40,960 --> 00:46:42,960 couple months go by and my second exam 1050 00:46:42,960 --> 00:46:45,920 comes up. Um however once again polomial 1051 00:46:45,920 --> 00:46:48,960 long division was on our second exam but 1052 00:46:48,960 --> 00:46:51,947 I kind of did that on my exam. 1053 00:46:51,947 --> 00:46:52,880 [clears throat] 1054 00:46:52,880 --> 00:46:56,800 So as you can see 4 + 4 + 4 apparently 1055 00:46:56,800 --> 00:46:58,960 doesn't equal 16. I was told it equals 1056 00:46:58,960 --> 00:47:01,599 12. Um and what sucks more about this 1057 00:47:01,599 --> 00:47:04,000 exam is once again two calculators in 1058 00:47:04,000 --> 00:47:05,040 front of me right graphics and 1059 00:47:05,040 --> 00:47:07,200 scientific. But like I also had my 1060 00:47:07,200 --> 00:47:09,119 fingers like I could have counted and I 1061 00:47:09,119 --> 00:47:12,560 would have gotten it right. So like any 1062 00:47:12,560 --> 00:47:15,359 anyways moving on. So for the next 6 1063 00:47:15,359 --> 00:47:17,839 months my friends and my teacher Mr. 1064 00:47:17,839 --> 00:47:19,760 Griffin sitting in the front row there 1065 00:47:19,760 --> 00:47:21,280 kept making fun of me. They were like 1066 00:47:21,280 --> 00:47:23,119 whispering 12 in my ear every now and 1067 00:47:23,119 --> 00:47:26,640 then just reminding me of of what 1068 00:47:26,640 --> 00:47:29,200 happened. So like best friends by the 1069 00:47:29,200 --> 00:47:32,560 way. Um and so conveniently in computer 1070 00:47:32,560 --> 00:47:34,079 science we got to pick our own 1071 00:47:34,079 --> 00:47:36,720 algorithms for our project. 1072 00:47:36,720 --> 00:47:39,108 Guess what algorithm I picked? 1073 00:47:39,108 --> 00:47:39,359 [laughter and gasps] 1074 00:47:39,359 --> 00:47:41,599 I picked polomial long division, my 1075 00:47:41,599 --> 00:47:43,920 favorite algorithm by this point. And so 1076 00:47:43,920 --> 00:47:45,520 for the next three weeks, I continued to 1077 00:47:45,520 --> 00:47:47,760 hustle my IT teacher because I was like, 1078 00:47:47,760 --> 00:47:49,760 what the hell can polomial long division 1079 00:47:49,760 --> 00:47:51,680 do in computer science? Like my friends 1080 00:47:51,680 --> 00:47:53,040 picked these ones that like sounded 1081 00:47:53,040 --> 00:47:54,480 really complex, like they sounded like 1082 00:47:54,480 --> 00:47:56,240 they belonged in computer science, but 1083 00:47:56,240 --> 00:47:58,720 mine was like purely math space. And so 1084 00:47:58,720 --> 00:48:01,680 that's how I landed on CRC. And as a 1085 00:48:01,680 --> 00:48:03,680 direct consequence of the 4 plus 4 plus 1086 00:48:03,680 --> 00:48:06,240 4 incidents, here we are in Queensland 6 1087 00:48:06,240 --> 00:48:09,560 months later. 1088 00:48:10,000 --> 00:48:13,359 So I'll just go through the underlying 1089 00:48:13,359 --> 00:48:16,000 theory of CLC and how polomial long 1090 00:48:16,000 --> 00:48:17,680 division as a math algorithm can 1091 00:48:17,680 --> 00:48:19,920 actually be applied in computer science. 1092 00:48:19,920 --> 00:48:21,520 So when we're sending information we 1093 00:48:21,520 --> 00:48:23,599 have a sender and we have a receiver. 1094 00:48:23,599 --> 00:48:25,920 The sender message first gets converted 1095 00:48:25,920 --> 00:48:27,760 into a bitstream. So a bitstream is just 1096 00:48:27,760 --> 00:48:30,079 binary a bunch of zeros and ones. And so 1097 00:48:30,079 --> 00:48:31,920 every single digit is treated as the 1098 00:48:31,920 --> 00:48:34,160 coefficient of a degree in a polomial. 1099 00:48:34,160 --> 00:48:36,000 So once we've converted this bitstream 1100 00:48:36,000 --> 00:48:38,480 into a polomial, we divide it by what we 1101 00:48:38,480 --> 00:48:41,040 call a generator polomial. The generator 1102 00:48:41,040 --> 00:48:43,680 polomial is predefined. It's usually 32 1103 00:48:43,680 --> 00:48:45,599 bits. And what's key about this is it's 1104 00:48:45,599 --> 00:48:47,200 not a secret. It's not private. You can 1105 00:48:47,200 --> 00:48:49,200 search it up online. However, we divide 1106 00:48:49,200 --> 00:48:51,200 it by the generator polomial and we will 1107 00:48:51,200 --> 00:48:53,040 get a remainder. We append this 1108 00:48:53,040 --> 00:48:54,720 remainder to the end of our original 1109 00:48:54,720 --> 00:48:56,480 bitstream and we get what is called a 1110 00:48:56,480 --> 00:48:58,559 code word. So the sender sends the code 1111 00:48:58,559 --> 00:49:00,400 word to the receiver. Now on the 1112 00:49:00,400 --> 00:49:02,160 receiving end what happens is they take 1113 00:49:02,160 --> 00:49:03,599 this code word which is once again a 1114 00:49:03,599 --> 00:49:05,280 bunch of zeros and ones and once again 1115 00:49:05,280 --> 00:49:06,559 the digits are treated as the 1116 00:49:06,559 --> 00:49:09,040 coefficients of a polomial. We divide it 1117 00:49:09,040 --> 00:49:11,119 by the same generated polomial that was 1118 00:49:11,119 --> 00:49:13,200 used by the sender and we should get a 1119 00:49:13,200 --> 00:49:15,599 remainder of zero. So that's what should 1120 00:49:15,599 --> 00:49:17,440 happen theoretically. But let's say in 1121 00:49:17,440 --> 00:49:19,359 the middle a corruptor comes in a packet 1122 00:49:19,359 --> 00:49:21,440 gets lost or for whatever reason a bit 1123 00:49:21,440 --> 00:49:23,280 has been switched. In this case the 1124 00:49:23,280 --> 00:49:24,960 message is no longer the same message 1125 00:49:24,960 --> 00:49:26,720 and the integrity of the data has been 1126 00:49:26,720 --> 00:49:28,960 breached. However, this is okay because 1127 00:49:28,960 --> 00:49:30,800 when the receiver gets this message, 1128 00:49:30,800 --> 00:49:32,240 what's going to happen is they will 1129 00:49:32,240 --> 00:49:34,160 perform the same steps of division and 1130 00:49:34,160 --> 00:49:35,839 they will get a remainder that is not 1131 00:49:35,839 --> 00:49:37,599 zero. So that's how we can use the 1132 00:49:37,599 --> 00:49:39,119 remainder to determine whether or not 1133 00:49:39,119 --> 00:49:41,920 the message has been corrupted. My next 1134 00:49:41,920 --> 00:49:43,680 question was what are the likelihoods of 1135 00:49:43,680 --> 00:49:46,000 two different polomials being divided by 1136 00:49:46,000 --> 00:49:48,319 the generator polomial and getting the 1137 00:49:48,319 --> 00:49:51,200 same remainder. That is about 1 in 2 to 1138 00:49:51,200 --> 00:49:53,359 the^ of 32. And if you're good at math, 1139 00:49:53,359 --> 00:49:55,440 you'll know that's 4.3 billion. So it's 1140 00:49:55,440 --> 00:49:56,880 not very likely that that will happen 1141 00:49:56,880 --> 00:49:59,440 which proves to be very useful. 1142 00:49:59,440 --> 00:50:01,440 So that's the theory behind CRC and how 1143 00:50:01,440 --> 00:50:02,880 we can use the remainder to determine 1144 00:50:02,880 --> 00:50:04,319 whether or not the message is still 1145 00:50:04,319 --> 00:50:07,040 safe. Now I'll do a quick demo but what 1146 00:50:07,040 --> 00:50:09,119 I will have is I will have two senders a 1147 00:50:09,119 --> 00:50:11,359 receiver and a corruptor uh just to show 1148 00:50:11,359 --> 00:50:13,359 the process. One of the one of the 1149 00:50:13,359 --> 00:50:14,880 senders will send a message that does 1150 00:50:14,880 --> 00:50:16,400 get corrupted and one of the senders 1151 00:50:16,400 --> 00:50:18,160 will send a message that is untouched. 1152 00:50:18,160 --> 00:50:19,760 The receiver will be able to determine 1153 00:50:19,760 --> 00:50:21,280 whether the message is corrupted or not. 1154 00:50:21,280 --> 00:50:25,720 And I set this all up using sockets. 1155 00:50:26,079 --> 00:50:29,280 So here, [laughter] sorry I didn't make 1156 00:50:29,280 --> 00:50:31,760 a pretty, but um in the top row I have 1157 00:50:31,760 --> 00:50:33,680 two senders. One I'll just show you 1158 00:50:33,680 --> 00:50:36,000 later. Um in the bottom left corner I 1159 00:50:36,000 --> 00:50:38,160 have I have the receiver and in the 1160 00:50:38,160 --> 00:50:39,200 bottom right corner I have the 1161 00:50:39,200 --> 00:50:41,359 corruptor. So if I were to send a 1162 00:50:41,359 --> 00:50:43,599 message from the top right window, let's 1163 00:50:43,599 --> 00:50:46,559 say I decide to send hello. 1164 00:50:46,559 --> 00:50:48,559 Hi. Um it's [clears throat] green. Um, 1165 00:50:48,559 --> 00:50:50,240 and I've I've made it green so that it's 1166 00:50:50,240 --> 00:50:51,920 clear to show it's valid. Um, the 1167 00:50:51,920 --> 00:50:53,440 receiver has detected that the remainder 1168 00:50:53,440 --> 00:50:55,760 is zero. Everything is perfect. However, 1169 00:50:55,760 --> 00:50:58,400 if I were to decide to send hello from 1170 00:50:58,400 --> 00:51:00,800 this terminal, it is red. So, it has 1171 00:51:00,800 --> 00:51:02,319 been corrupted. Um, it goes through the 1172 00:51:02,319 --> 00:51:04,319 corruptor in the bottom right where it's 1173 00:51:04,319 --> 00:51:06,640 taken that um list of ones and zeros. 1174 00:51:06,640 --> 00:51:08,240 It's switched something and the receiver 1175 00:51:08,240 --> 00:51:10,079 has determined that. So, as you can see, 1176 00:51:10,079 --> 00:51:12,079 the second L is no longer an L. It's a 1177 00:51:12,079 --> 00:51:14,640 comma. I have two corruptors. I have a 1178 00:51:14,640 --> 00:51:16,559 one bit corruptor and a flip corruptor. 1179 00:51:16,559 --> 00:51:18,400 If the message is five characters or 1180 00:51:18,400 --> 00:51:20,480 lower, it is a one bit corruptor where a 1181 00:51:20,480 --> 00:51:22,319 random bit, it's completely random, will 1182 00:51:22,319 --> 00:51:24,079 get switched. Um, and this replicates 1183 00:51:24,079 --> 00:51:26,480 those uh tiny packet losses that may not 1184 00:51:26,480 --> 00:51:28,240 seem significant. Sometimes it's not 1185 00:51:28,240 --> 00:51:30,000 visible to humans and the message might 1186 00:51:30,000 --> 00:51:31,440 look the same. But what is really 1187 00:51:31,440 --> 00:51:33,040 important is that the computer can still 1188 00:51:33,040 --> 00:51:34,960 determine that the message is changed, 1189 00:51:34,960 --> 00:51:36,640 is altered, and it is not the same that 1190 00:51:36,640 --> 00:51:38,800 was being sent. My second type of 1191 00:51:38,800 --> 00:51:40,559 corruptor is a flip corruptor. If the 1192 00:51:40,559 --> 00:51:42,319 message exceeds five characters, every 1193 00:51:42,319 --> 00:51:44,079 single one and zero is flipped to the 1194 00:51:44,079 --> 00:51:46,640 opposite. This demonstrates the more 1195 00:51:46,640 --> 00:51:48,559 extreme like data manipulation when 1196 00:51:48,559 --> 00:51:50,160 everything gets corrupted or malicious 1197 00:51:50,160 --> 00:51:53,280 attempts in real life. If I were to send 1198 00:51:53,280 --> 00:51:55,760 hello again and again, you can see every 1199 00:51:55,760 --> 00:51:58,880 single time the corruption is different. 1200 00:51:58,880 --> 00:52:00,559 In the second time, the O is changed to 1201 00:52:00,559 --> 00:52:03,280 an M. And in the final time, we can't 1202 00:52:03,280 --> 00:52:05,200 see a difference. However, the receiver 1203 00:52:05,200 --> 00:52:06,559 has still been able to determine that 1204 00:52:06,559 --> 00:52:08,319 the message has been changed. That is 1205 00:52:08,319 --> 00:52:09,760 actually really lucky cuz um it's 1206 00:52:09,760 --> 00:52:11,440 random. And that's a perfect example of 1207 00:52:11,440 --> 00:52:13,040 when we can't see the change in the 1208 00:52:13,040 --> 00:52:14,640 message but it has been tampered with 1209 00:52:14,640 --> 00:52:16,240 and the integrity of the data has been 1210 00:52:16,240 --> 00:52:18,559 breached. 1211 00:52:18,559 --> 00:52:20,400 So this demo is just like really 1212 00:52:20,400 --> 00:52:22,960 important to show that although um 1213 00:52:22,960 --> 00:52:24,720 polomial long division doesn't seem 1214 00:52:24,720 --> 00:52:26,240 significant. It seems like a really 1215 00:52:26,240 --> 00:52:28,480 basic like maths thing but we use it in 1216 00:52:28,480 --> 00:52:30,000 our everyday lives. every time you send 1217 00:52:30,000 --> 00:52:31,280 a message online, those message 1218 00:52:31,280 --> 00:52:33,040 transmissions online and all of that 1219 00:52:33,040 --> 00:52:35,440 that it uses CRC to determine whether or 1220 00:52:35,440 --> 00:52:36,960 not that what you're receiving is 1221 00:52:36,960 --> 00:52:38,400 actually what's being sent and that the 1222 00:52:38,400 --> 00:52:42,119 message hasn't been corrupted. 1223 00:52:44,000 --> 00:52:45,200 Thank you for listening to my 1224 00:52:45,200 --> 00:52:47,616 presentation. 1225 00:52:47,616 --> 00:52:49,636 [applause and cheering] 1226 00:52:50,880 --> 00:52:53,520 That was amazing. [cheering] 1227 00:52:53,520 --> 00:52:55,520 Woo! 1228 00:52:55,520 --> 00:52:58,079 Massive round of applause. Next up, we 1229 00:52:58,079 --> 00:52:59,839 have Heidi. 1230 00:52:59,839 --> 00:53:04,480 And Heidi has been programming uh since 1231 00:53:04,480 --> 00:53:06,880 she was introduced to Scratch Junior in 1232 00:53:06,880 --> 00:53:10,200 year two. 1233 00:53:10,720 --> 00:53:13,760 Uh and she's going to talk about Oh 1234 00:53:13,760 --> 00:53:16,559 gosh. And I've forgotten Fabula and 1235 00:53:16,559 --> 00:53:19,920 Shette. Shette. Okay. I'm gonna find out 1236 00:53:19,920 --> 00:53:22,559 what that means soon. Uh her favorite 1237 00:53:22,559 --> 00:53:25,440 emoji is 1238 00:53:25,440 --> 00:53:28,160 salute. salute. Uh, and she recently 1239 00:53:28,160 --> 00:53:30,559 discovered that Cobalt, 1240 00:53:30,559 --> 00:53:32,400 that's it. No, that Cobalt, a 1241 00:53:32,400 --> 00:53:34,240 programming language developed nearly 70 1242 00:53:34,240 --> 00:53:38,160 years ago in 1959, is still being used 1243 00:53:38,160 --> 00:53:40,960 to manage 70 to 80% of business 1244 00:53:40,960 --> 00:53:43,200 transactions. That that keeps us 1245 00:53:43,200 --> 00:53:46,480 confident. And the average age of a 1246 00:53:46,480 --> 00:53:49,280 Cobalt programmer is around 55 years 1247 00:53:49,280 --> 00:53:51,200 old. 1248 00:53:51,200 --> 00:53:53,680 There's hope for us yet. Massive round 1249 00:53:53,680 --> 00:53:55,737 of applause. 1250 00:53:55,737 --> 00:53:57,047 [cheering] 1251 00:53:57,047 --> 00:53:59,067 [applause] 1252 00:53:59,200 --> 00:54:01,760 Um hello everyone. Have you as you have 1253 00:54:01,760 --> 00:54:04,880 heard um my name is Heidi and to 1254 00:54:04,880 --> 00:54:06,640 introduce myself I thought I'd share 1255 00:54:06,640 --> 00:54:08,079 three things I think you should know 1256 00:54:08,079 --> 00:54:10,240 about me. Uh the first one is that I 1257 00:54:10,240 --> 00:54:13,200 love Tiramisu. 1258 00:54:13,200 --> 00:54:16,000 The second one is that I like things to 1259 00:54:16,000 --> 00:54:18,559 go according to plan. 1260 00:54:18,559 --> 00:54:21,280 And number three is that I don't like to 1261 00:54:21,280 --> 00:54:23,760 make plans. 1262 00:54:23,760 --> 00:54:25,520 Now, that's enough about me. Let me 1263 00:54:25,520 --> 00:54:27,040 introduce you to the real star of the 1264 00:54:27,040 --> 00:54:30,480 show. This here is Tuti. Um, it's a web 1265 00:54:30,480 --> 00:54:32,000 app that I made that's sort of a mix 1266 00:54:32,000 --> 00:54:35,359 between Google Classroom and Flora. And 1267 00:54:35,359 --> 00:54:37,680 basically, teachers can create a 1268 00:54:37,680 --> 00:54:39,200 classroom where they can add their 1269 00:54:39,200 --> 00:54:41,280 students, set them tasks, and then 1270 00:54:41,280 --> 00:54:43,599 monitor their project on tasks. And then 1271 00:54:43,599 --> 00:54:45,440 students can join their teachers class 1272 00:54:45,440 --> 00:54:49,280 to do these um tasks and um complete 1273 00:54:49,280 --> 00:54:52,079 study sessions. So, um, as you can see 1274 00:54:52,079 --> 00:54:53,920 in the big screen, that's like the 1275 00:54:53,920 --> 00:54:55,599 student view, and there's like a list of 1276 00:54:55,599 --> 00:54:58,000 tasks to complete and a little calendar 1277 00:54:58,000 --> 00:54:59,920 that shows you when your tasks are due. 1278 00:54:59,920 --> 00:55:03,040 Um, in the top corner up there, um, 1279 00:55:03,040 --> 00:55:04,800 that's the student, uh, the teacher view 1280 00:55:04,800 --> 00:55:06,480 where you can see all your students. Um, 1281 00:55:06,480 --> 00:55:08,800 and below that, you can add their tasks. 1282 00:55:08,800 --> 00:55:11,359 And in the bottom corner, that's um, I 1283 00:55:11,359 --> 00:55:13,760 used a Google Charts API to like give 1284 00:55:13,760 --> 00:55:15,680 you some nice statistics about how your 1285 00:55:15,680 --> 00:55:18,960 students are going. And um in the middle 1286 00:55:18,960 --> 00:55:21,599 there, there's the timer function that 1287 00:55:21,599 --> 00:55:24,880 lets you do um study sessions. Now, the 1288 00:55:24,880 --> 00:55:27,359 origins of this project here um were 1289 00:55:27,359 --> 00:55:29,200 late November last year where our 1290 00:55:29,200 --> 00:55:30,480 teacher gave us our assessment 1291 00:55:30,480 --> 00:55:33,040 notification. Um and I'd like to draw 1292 00:55:33,040 --> 00:55:35,520 your attention to a word in it. It's 1293 00:55:35,520 --> 00:55:37,359 agile. 1294 00:55:37,359 --> 00:55:39,760 Yeah. Now when I learned about agile 1295 00:55:39,760 --> 00:55:41,359 along with waterfall and whatever 1296 00:55:41,359 --> 00:55:43,520 quantum state waggile decides to be in 1297 00:55:43,520 --> 00:55:45,778 any given day 1298 00:55:45,778 --> 00:55:46,640 [laughter] 1299 00:55:46,640 --> 00:55:48,480 um I just decided that this was a 1300 00:55:48,480 --> 00:55:50,559 syllabus prescribed over complication of 1301 00:55:50,559 --> 00:55:52,240 me just getting in there and getting it 1302 00:55:52,240 --> 00:55:54,880 done. But as always hindsight has done 1303 00:55:54,880 --> 00:55:58,079 me dirty and what I wanted to share with 1304 00:55:58,079 --> 00:56:00,000 you today is what I learned about the 1305 00:56:00,000 --> 00:56:02,720 importance of making a plan and um 1306 00:56:02,720 --> 00:56:05,839 agility I suppose. Um, but this isn't 1307 00:56:05,839 --> 00:56:07,280 going to be best illustrated by a 1308 00:56:07,280 --> 00:56:08,799 finished product. So, I'm going to take 1309 00:56:08,799 --> 00:56:11,200 you back to the beginning. Fabula and 1310 00:56:11,200 --> 00:56:13,839 Shuette. Now, I don't expect you to know 1311 00:56:13,839 --> 00:56:16,000 what these two words mean. Uh, they 1312 00:56:16,000 --> 00:56:18,240 originate in a literary period called 1313 00:56:18,240 --> 00:56:20,640 Russian formalism and are used to 1314 00:56:20,640 --> 00:56:22,720 describe the functions of a narrative. 1315 00:56:22,720 --> 00:56:25,280 Fabula is in as much words the plot of 1316 00:56:25,280 --> 00:56:27,359 the story. It's the linear progression 1317 00:56:27,359 --> 00:56:30,720 of events as they progress. Um, and 1318 00:56:30,720 --> 00:56:32,799 Shuette on the other hand is the story 1319 00:56:32,799 --> 00:56:35,839 as it is presented to the reader. Now, 1320 00:56:35,839 --> 00:56:37,920 you may be wondering, Heidi, what does 1321 00:56:37,920 --> 00:56:40,720 this have to do with programming? And I 1322 00:56:40,720 --> 00:56:42,559 think the best way to illustrate this is 1323 00:56:42,559 --> 00:56:44,799 with a story of my own. So, let's start 1324 00:56:44,799 --> 00:56:47,599 this one in media res. Uh, we're two 1325 00:56:47,599 --> 00:56:49,280 days out from submission and the 1326 00:56:49,280 --> 00:56:51,359 antagonist of our tale is rearing its 1327 00:56:51,359 --> 00:56:54,720 ugly head. It's this guy. And the reason 1328 00:56:54,720 --> 00:56:57,440 it's causing me so much grief is because 1329 00:56:57,440 --> 00:57:01,760 2 days out it looks like this. 1330 00:57:01,760 --> 00:57:04,640 Now the reason 2 days out I don't have a 1331 00:57:04,640 --> 00:57:06,880 calendar module is because something you 1332 00:57:06,880 --> 00:57:08,960 might have experienced before is I told 1333 00:57:08,960 --> 00:57:11,119 myself that it was going to be easy. So 1334 00:57:11,119 --> 00:57:14,240 I could just leave it till the end. But 1335 00:57:14,240 --> 00:57:16,880 I know that was pretty bad of me. But I 1336 00:57:16,880 --> 00:57:19,040 decided to come up with a little plan to 1337 00:57:19,040 --> 00:57:21,359 solve it. Step one, if there's ever a 1338 00:57:21,359 --> 00:57:24,739 complex but [laughter] 1339 00:57:25,119 --> 00:57:27,280 If there's ever a complex but ultimately 1340 00:57:27,280 --> 00:57:29,040 mundane unique thing you need to do in 1341 00:57:29,040 --> 00:57:31,359 Python, there's probably a library for 1342 00:57:31,359 --> 00:57:33,760 it. Step two was to just, you know, 1343 00:57:33,760 --> 00:57:36,480 package it up, sprinkle on some CSS, and 1344 00:57:36,480 --> 00:57:38,400 straight to step three where it'd be 1345 00:57:38,400 --> 00:57:40,559 finished. Now, this wouldn't be a good 1346 00:57:40,559 --> 00:57:43,280 story if it didn't have a complication. 1347 00:57:43,280 --> 00:57:45,920 Instead of packaging it up nicely, I 1348 00:57:45,920 --> 00:57:49,119 ended up sending 15 different lists 1349 00:57:49,119 --> 00:57:52,960 through to Ginger. And um that I know 1350 00:57:52,960 --> 00:57:54,640 there isn't any limit on how many you 1351 00:57:54,640 --> 00:57:56,480 can send through, but I think that's at 1352 00:57:56,480 --> 00:58:00,480 least 10 too many. On top of this, I 1353 00:58:00,480 --> 00:58:02,880 didn't realize it until recently, but I 1354 00:58:02,880 --> 00:58:05,040 was using two different kind of dates in 1355 00:58:05,040 --> 00:58:08,079 my SQL tables. [laughter] 1356 00:58:08,079 --> 00:58:11,119 And on top of this, I was moving between 1357 00:58:11,119 --> 00:58:13,040 two different datetime objects in my 1358 00:58:13,040 --> 00:58:15,680 Python, which caused me two days of 1359 00:58:15,680 --> 00:58:18,160 syntax error and non-type objects. And 1360 00:58:18,160 --> 00:58:21,359 perhaps my worst sin of them all is that 1361 00:58:21,359 --> 00:58:23,920 in an effort not to format but another 1362 00:58:23,920 --> 00:58:26,640 button on my HTML, I decided to move 1363 00:58:26,640 --> 00:58:28,559 between the different months in the 1364 00:58:28,559 --> 00:58:31,760 calendar with URL links. So that means I 1365 00:58:31,760 --> 00:58:34,000 had to send um the month through the 1366 00:58:34,000 --> 00:58:36,079 URL. And if my software teacher has 1367 00:58:36,079 --> 00:58:37,839 taught me anything is that you never 1368 00:58:37,839 --> 00:58:40,640 send anything through their URL. That's 1369 00:58:40,640 --> 00:58:42,630 a security breach. 1370 00:58:42,630 --> 00:58:43,200 [laughter] 1371 00:58:43,200 --> 00:58:45,359 Now, 1372 00:58:45,359 --> 00:58:47,520 this leaves you with no kind resolution 1373 00:58:47,520 --> 00:58:49,760 and actually an ultimately unanswered 1374 00:58:49,760 --> 00:58:51,680 question. What does this have to do with 1375 00:58:51,680 --> 00:58:54,240 Fabula and Shette? And I ask for your 1376 00:58:54,240 --> 00:58:56,720 patience as I digress, but a little bit 1377 00:58:56,720 --> 00:58:59,280 more. Now, one of the key features of 1378 00:58:59,280 --> 00:59:01,119 Russian formalism is that they chose to 1379 00:59:01,119 --> 00:59:03,760 approach poetics as a science rather 1380 00:59:03,760 --> 00:59:06,079 than an art. And this meant that they 1381 00:59:06,079 --> 00:59:07,680 were much more interested in how 1382 00:59:07,680 --> 00:59:09,920 literature achieved things rather than 1383 00:59:09,920 --> 00:59:12,160 what exactly it tried to achieve. think 1384 00:59:12,160 --> 00:59:15,599 like metaphors and the like. And I 1385 00:59:15,599 --> 00:59:17,680 suppose this is all a very roundabout ma 1386 00:59:17,680 --> 00:59:19,680 way of me saying that in and amongst 1387 00:59:19,680 --> 00:59:21,680 this confusion, what I learned is that 1388 00:59:21,680 --> 00:59:24,079 it's pro perhaps equally as important as 1389 00:59:24,079 --> 00:59:26,240 how your code achieves something as what 1390 00:59:26,240 --> 00:59:28,880 it achieves. And by extension of this, 1391 00:59:28,880 --> 00:59:31,280 it's both true that your first plan is 1392 00:59:31,280 --> 00:59:33,119 your most important and probably going 1393 00:59:33,119 --> 00:59:36,160 to be your worst. And yet the question 1394 00:59:36,160 --> 00:59:38,240 remains and I thank you for your 1395 00:59:38,240 --> 00:59:39,839 forbearance at the increasingly 1396 00:59:39,839 --> 00:59:42,880 nonlinear way I've gotten here. What 1397 00:59:42,880 --> 00:59:45,440 does this have to do with fabulous yet? 1398 00:59:45,440 --> 00:59:48,079 Well, I guess it can also be said that 1399 00:59:48,079 --> 00:59:50,240 no matter how way how well you plot out 1400 00:59:50,240 --> 00:59:52,319 your plan, how linear the sequence of 1401 00:59:52,319 --> 00:59:54,319 events, the story as it's going to be 1402 00:59:54,319 --> 00:59:57,359 presented to you can be very different. 1403 00:59:57,359 --> 00:59:59,359 But thankfully, we're using an agile 1404 00:59:59,359 --> 01:00:02,400 approach here. So this 1405 01:00:02,400 --> 01:00:05,359 this is not the end. Ultimately, 2 days 1406 01:00:05,359 --> 01:00:07,599 out, there was very little I could do. 1407 01:00:07,599 --> 01:00:10,079 But one of the benefits of hindsight is 1408 01:00:10,079 --> 01:00:12,319 that now I know what to do next time, 1409 01:00:12,319 --> 01:00:14,000 even if it's stuff my software teacher 1410 01:00:14,000 --> 01:00:16,296 told me to do the first time around. 1411 01:00:16,296 --> 01:00:17,760 [laughter] 1412 01:00:17,760 --> 01:00:21,359 Number one, plan your data. A data 1413 01:00:21,359 --> 01:00:22,960 dictionary is one of the things that my 1414 01:00:22,960 --> 01:00:24,960 teacher told me to do before the 1415 01:00:24,960 --> 01:00:26,559 assessment, which I ultimately did 1416 01:00:26,559 --> 01:00:29,520 afterwards. But if I had done it, I 1417 01:00:29,520 --> 01:00:32,000 would have known that in SQL, the way 1418 01:00:32,000 --> 01:00:34,160 they format dates is much different to 1419 01:00:34,160 --> 01:00:37,040 the way Python does. Number two, 1420 01:00:37,040 --> 01:00:39,760 security always comes first. It might be 1421 01:00:39,760 --> 01:00:41,280 easier just to send all your data 1422 01:00:41,280 --> 01:00:43,680 through the URL, but that's not really 1423 01:00:43,680 --> 01:00:46,480 good for your client. So, how about you 1424 01:00:46,480 --> 01:00:50,960 use post with CSRF tokens, escaping, and 1425 01:00:50,960 --> 01:00:53,520 validation, which I did in the rest of 1426 01:00:53,520 --> 01:00:55,280 my project. I just didn't want to do it 1427 01:00:55,280 --> 01:00:58,160 here. And perhaps third and the most 1428 01:00:58,160 --> 01:01:00,000 important is please listen to your 1429 01:01:00,000 --> 01:01:03,480 software teacher. 1430 01:01:03,839 --> 01:01:06,240 But um thankfully there is no reason to 1431 01:01:06,240 --> 01:01:08,160 fear because as always there will be 1432 01:01:08,160 --> 01:01:11,119 time to do it all over again. That's my 1433 01:01:11,119 --> 01:01:13,119 name. Um that's my website if you want 1434 01:01:13,119 --> 01:01:17,212 to look at it. Um thanks. 1435 01:01:17,212 --> 01:01:19,177 [cheering] 1436 01:01:19,177 --> 01:01:20,319 [applause] 1437 01:01:20,319 --> 01:01:22,319 Massive round of applause. Those are 1438 01:01:22,319 --> 01:01:26,382 some things that I wish I learned. 1439 01:01:26,382 --> 01:01:26,880 [applause] 1440 01:01:26,880 --> 01:01:30,559 actually listening to teachers. Oh, what 1441 01:01:30,559 --> 01:01:33,587 the kids think of next? 1442 01:01:33,587 --> 01:01:34,160 [laughter] 1443 01:01:34,160 --> 01:01:37,760 I see the teachers grimacing. Um, 1444 01:01:37,760 --> 01:01:40,480 next up on deck, we have the fantabulous 1445 01:01:40,480 --> 01:01:46,359 Emma. We only have two more talks left. 1446 01:01:46,880 --> 01:01:50,000 I know. Which kind of relates to Emma's 1447 01:01:50,000 --> 01:01:54,760 favorite emoji, which is 1448 01:01:55,119 --> 01:01:59,599 crying sobbing emoji. Uh Emma has been 1449 01:01:59,599 --> 01:02:03,440 programming from for six years 1450 01:02:03,440 --> 01:02:04,960 and 1451 01:02:04,960 --> 01:02:07,520 uh she told me or at least she wrote it 1452 01:02:07,520 --> 01:02:09,599 down in the form that it took a month 1453 01:02:09,599 --> 01:02:13,200 for her to figure out. 1454 01:02:13,200 --> 01:02:15,920 Hang on. [laughter] 1455 01:02:15,920 --> 01:02:17,599 Uh okay, I'm just going to read it for 1456 01:02:17,599 --> 01:02:19,920 about him. It took a month for me to 1457 01:02:19,920 --> 01:02:21,440 figure out. I really should read this 1458 01:02:21,440 --> 01:02:23,760 earlier. Uh but a monad brackets in 1459 01:02:23,760 --> 01:02:26,240 functional programming is the decoration 1460 01:02:26,240 --> 01:02:28,000 on a regular type which allows 1461 01:02:28,000 --> 01:02:30,160 computational effects like errors and 1462 01:02:30,160 --> 01:02:33,040 exceptions to be handled gracefully. 1463 01:02:33,040 --> 01:02:34,503 Almost as gracefully as I handled 1464 01:02:34,503 --> 01:02:36,468 [laughter] that. 1465 01:02:36,468 --> 01:02:38,000 [gasps] Massive round of applause for 1466 01:02:38,000 --> 01:02:39,743 Emma. 1467 01:02:39,743 --> 01:02:41,053 [cheering] 1468 01:02:41,053 --> 01:02:43,073 [applause] 1469 01:02:43,200 --> 01:02:45,920 Hey everyone. Today I'm going to discuss 1470 01:02:45,920 --> 01:02:49,440 how I made this socket app using Python 1471 01:02:49,440 --> 01:02:51,920 that I secured using a bunch of really 1472 01:02:51,920 --> 01:02:54,480 cool Python cryptography libraries as 1473 01:02:54,480 --> 01:02:57,599 well as a P2P gossip protocol over the 1474 01:02:57,599 --> 01:03:01,680 LAN. I use Arch by the way. 1475 01:03:01,680 --> 01:03:03,839 And before I get into my app, I'm just 1476 01:03:03,839 --> 01:03:08,640 going to unpack a couple network basics. 1477 01:03:08,640 --> 01:03:12,480 I hope you guys get the joke. 1478 01:03:12,480 --> 01:03:14,720 So, some network basics. First of all, 1479 01:03:14,720 --> 01:03:17,359 what is a LAN? The LAN stands for the 1480 01:03:17,359 --> 01:03:19,839 local area network, which is basically 1481 01:03:19,839 --> 01:03:22,000 your internet. That's where all of the 1482 01:03:22,000 --> 01:03:24,640 computers in a local area can talk to 1483 01:03:24,640 --> 01:03:26,480 each other. This is not the full 1484 01:03:26,480 --> 01:03:28,640 internet. The full internet is where you 1485 01:03:28,640 --> 01:03:31,039 can talk to like a computer in Europe, 1486 01:03:31,039 --> 01:03:33,760 but you're too far away from Europe. So, 1487 01:03:33,760 --> 01:03:37,039 that is the W, the WAN, the wide area 1488 01:03:37,039 --> 01:03:39,440 network. However, for now, we are just 1489 01:03:39,440 --> 01:03:41,440 sticking to LAN because one, it's 1490 01:03:41,440 --> 01:03:43,440 easier. Two, I don't need to deal with 1491 01:03:43,440 --> 01:03:45,359 NAT and the firewall and all the ports 1492 01:03:45,359 --> 01:03:49,640 shenanigans. And what 1493 01:03:50,484 --> 01:03:52,504 [laughter] 1494 01:03:53,039 --> 01:03:54,799 Sorry, that was Microsoft. That was 1495 01:03:54,799 --> 01:03:59,400 Microsoft. We can all blame Microsoft. 1496 01:03:59,654 --> 01:04:01,674 [cheering] 1497 01:04:01,920 --> 01:04:04,559 Anyways, back to the LAN. So the LAN is 1498 01:04:04,559 --> 01:04:07,359 also much faster because uh everything's 1499 01:04:07,359 --> 01:04:09,200 closer together which is why I decided 1500 01:04:09,200 --> 01:04:13,200 to use it for my project. 1501 01:04:13,200 --> 01:04:15,839 And this is the OSI model which you 1502 01:04:15,839 --> 01:04:18,480 might recognize. Uh for my project I'm 1503 01:04:18,480 --> 01:04:20,160 going to be using the Python socket 1504 01:04:20,160 --> 01:04:22,559 library which handles everything here. 1505 01:04:22,559 --> 01:04:24,319 So I don't have to worry about all of 1506 01:04:24,319 --> 01:04:26,480 that. I only have to worry about the 1507 01:04:26,480 --> 01:04:28,960 application level which I'm focusing on 1508 01:04:28,960 --> 01:04:31,119 the session presentation and application 1509 01:04:31,119 --> 01:04:33,280 levels. 1510 01:04:33,280 --> 01:04:36,160 Next up is TCP sockets. TCP is much 1511 01:04:36,160 --> 01:04:38,559 better than UDP if you care about data 1512 01:04:38,559 --> 01:04:40,720 reliability. That's because we have a 1513 01:04:40,720 --> 01:04:43,359 bunch of handshakes. When you want to 1514 01:04:43,359 --> 01:04:46,799 connect to another socket using TCP, you 1515 01:04:46,799 --> 01:04:49,359 have to go through a three uh three-way 1516 01:04:49,359 --> 01:04:51,680 handshake, unlike with UDP where you 1517 01:04:51,680 --> 01:04:53,440 just throw the data out and hope they 1518 01:04:53,440 --> 01:04:55,440 get it, which usually doesn't happen 1519 01:04:55,440 --> 01:04:57,119 unless you're torrenting or something 1520 01:04:57,119 --> 01:05:00,624 cool like that. [laughter] 1521 01:05:02,480 --> 01:05:06,079 Anyways, before I get into my own app, I 1522 01:05:06,079 --> 01:05:07,760 just want to acknowledge a bunch of 1523 01:05:07,760 --> 01:05:10,079 inspirations to me. The first one is 1524 01:05:10,079 --> 01:05:12,880 Reticulum, also known as RNS. It's a 1525 01:05:12,880 --> 01:05:15,440 type of decentralized network and it's 1526 01:05:15,440 --> 01:05:18,079 super super cool. I can't emphasize how 1527 01:05:18,079 --> 01:05:20,319 cool this is. It is hardware agnostic. 1528 01:05:20,319 --> 01:05:22,480 So, you can use it over Laura radio, 1529 01:05:22,480 --> 01:05:25,839 I2P, TCP, so many different hardwares 1530 01:05:25,839 --> 01:05:28,000 you can choose from. Uh you can see all 1531 01:05:28,000 --> 01:05:30,240 of the active reticulum nodes on rw 1532 01:05:30,240 --> 01:05:32,640 world.map. There's a I2P mirror at 1533 01:05:32,640 --> 01:05:34,400 reticulum.2p 1534 01:05:34,400 --> 01:05:37,280 and you can install it using uh pip. 1535 01:05:37,280 --> 01:05:39,680 It's a python app which is great for 1536 01:05:39,680 --> 01:05:42,720 pyon I guess. And uh you might have to 1537 01:05:42,720 --> 01:05:44,240 break your system packages but that's 1538 01:05:44,240 --> 01:05:48,839 okay because it won't break your system. 1539 01:05:49,039 --> 01:05:51,520 Second of all I want to acknowledge I2P. 1540 01:05:51,520 --> 01:05:56,079 Uh I2P is a niche darknet uh which I 1541 01:05:56,079 --> 01:05:59,280 believe to be uh better than tour in 1542 01:05:59,280 --> 01:06:01,599 many ways. Sorry if there are any tour 1543 01:06:01,599 --> 01:06:03,839 operators here. You're awesome too. Um 1544 01:06:03,839 --> 01:06:07,760 but ITP is decentralized. Um unlike tour 1545 01:06:07,760 --> 01:06:10,000 which has a central or directory 1546 01:06:10,000 --> 01:06:12,079 authority which manages stuff like let's 1547 01:06:12,079 --> 01:06:15,200 hope they don't go corrupt but I2P 1548 01:06:15,200 --> 01:06:17,839 relies on all of the users. Uh if you 1549 01:06:17,839 --> 01:06:20,079 are a peer in I2P, you are actively 1550 01:06:20,079 --> 01:06:21,599 contributing to the network and you're 1551 01:06:21,599 --> 01:06:24,799 helping make I2P go faster. I have a 1552 01:06:24,799 --> 01:06:27,520 computer science network uh a blog 1553 01:06:27,520 --> 01:06:29,760 really on ITP. It's called Aiden 1554 01:06:29,760 --> 01:06:31,680 CSblog.itp 1555 01:06:31,680 --> 01:06:34,160 can go check that out. I'm uh adding to 1556 01:06:34,160 --> 01:06:36,559 it. Uh I have a lot of content on it 1557 01:06:36,559 --> 01:06:38,960 with about Linux and networking. So you 1558 01:06:38,960 --> 01:06:40,960 can check that out if you like. uh you 1559 01:06:40,960 --> 01:06:43,599 can just install it using pseudo apt and 1560 01:06:43,599 --> 01:06:46,000 there is a web console for you to look 1561 01:06:46,000 --> 01:06:51,160 at at localhost uh port 7070. 1562 01:06:51,599 --> 01:06:54,240 And finally I want to acknowledge 1563 01:06:54,240 --> 01:06:57,119 Miuwire for being a heavy inspiration on 1564 01:06:57,119 --> 01:06:59,839 this project. Muire is a app built on 1565 01:06:59,839 --> 01:07:03,680 top of I2P uh and it is a decentralized 1566 01:07:03,680 --> 01:07:06,000 file sharing network that heavily 1567 01:07:06,000 --> 01:07:08,000 influenced the way I implemented the 1568 01:07:08,000 --> 01:07:10,559 file sharing network in my app. It uses 1569 01:07:10,559 --> 01:07:13,599 the gossip protocol to share resources 1570 01:07:13,599 --> 01:07:17,119 and it's a direct descendant of GNUA uh 1571 01:07:17,119 --> 01:07:19,359 which is also a descendant of Napster. 1572 01:07:19,359 --> 01:07:23,359 So P2P networks all love each other. 1573 01:07:23,359 --> 01:07:26,640 Okay, next up the way I encrypted my 1574 01:07:26,640 --> 01:07:29,200 sockets. This is a shark uh image. 1575 01:07:29,200 --> 01:07:32,160 That's because wire shark um to sniff 1576 01:07:32,160 --> 01:07:36,319 the so uh sniff the packets. Um, 1577 01:07:36,319 --> 01:07:39,200 and the first thing I need to do is I 1578 01:07:39,200 --> 01:07:42,079 need to encrypt all of the messages 1579 01:07:42,079 --> 01:07:43,920 going through sockets because sockets 1580 01:07:43,920 --> 01:07:45,599 just sends it in plain text. That's not 1581 01:07:45,599 --> 01:07:47,440 good if you're going to use wireshot to 1582 01:07:47,440 --> 01:07:49,039 sniff the packets and then get all my 1583 01:07:49,039 --> 01:07:52,240 sensitive info. Uh, so I'm using diffy 1584 01:07:52,240 --> 01:07:55,520 helman to exchange keys over a public 1585 01:07:55,520 --> 01:07:58,799 insecure channel. So then uh two peers 1586 01:07:58,799 --> 01:08:02,079 can communicate securely using the uh 1587 01:08:02,079 --> 01:08:04,720 agreed upon key. Uh, Diffy Helman relies 1588 01:08:04,720 --> 01:08:06,640 on the commutative property of 1589 01:08:06,640 --> 01:08:09,200 multiplication to allow these two peers 1590 01:08:09,200 --> 01:08:12,240 to get towards a single uh, agreed on 1591 01:08:12,240 --> 01:08:14,720 key without like talking to each other 1592 01:08:14,720 --> 01:08:17,199 and whispering. You can just do it over 1593 01:08:17,199 --> 01:08:20,319 a public channel. And uh, another really 1594 01:08:20,319 --> 01:08:22,400 big threat for security is the 1595 01:08:22,400 --> 01:08:24,400 man-in-the-middle attack. That's where 1596 01:08:24,400 --> 01:08:27,040 in oh I think that I'm talking directly 1597 01:08:27,040 --> 01:08:29,199 to Bob but actually my message is being 1598 01:08:29,199 --> 01:08:31,359 intercepted by Eve and she's changing 1599 01:08:31,359 --> 01:08:32,960 some stuff and she's pretending to be 1600 01:08:32,960 --> 01:08:35,199 Bob and then she can see all of our 1601 01:08:35,199 --> 01:08:38,080 communications whereas I think I am 1602 01:08:38,080 --> 01:08:41,520 talking to Bob but uh I'm not. That's 1603 01:08:41,520 --> 01:08:44,080 why certificates are very important to 1604 01:08:44,080 --> 01:08:46,239 help us solve this. Unfortunately, I 1605 01:08:46,239 --> 01:08:48,000 don't want to go through the hassle of 1606 01:08:48,000 --> 01:08:50,560 uh let's encrypt and the CA. So, I need 1607 01:08:50,560 --> 01:08:53,759 to self-sign my certificate which um 1608 01:08:53,759 --> 01:08:57,440 failed a lot because uh the SSL um 1609 01:08:57,440 --> 01:08:59,839 library does not like that. So, instead 1610 01:08:59,839 --> 01:09:02,000 I do authentication using challenges. 1611 01:09:02,000 --> 01:09:04,319 So, I set up a public and private key on 1612 01:09:04,319 --> 01:09:07,839 all of the nodes and then I uh ask Bob 1613 01:09:07,839 --> 01:09:10,560 to sign it and sign a random challenge 1614 01:09:10,560 --> 01:09:13,120 and if he signs it, it's sure to be Bob, 1615 01:09:13,120 --> 01:09:15,040 not to be Eve. 1616 01:09:15,040 --> 01:09:17,279 Next up, network architectures. When I 1617 01:09:17,279 --> 01:09:20,239 first submitted the Pyon uh my proposal 1618 01:09:20,239 --> 01:09:22,560 for Pyon, it was initially a server 1619 01:09:22,560 --> 01:09:25,839 client architecture um which was not 1620 01:09:25,839 --> 01:09:28,239 good. It's it's bad. It's bad because if 1621 01:09:28,239 --> 01:09:30,159 the server goes offline, which it 1622 01:09:30,159 --> 01:09:33,040 probably would um because I run out of 1623 01:09:33,040 --> 01:09:35,440 battery very quickly, uh the whole thing 1624 01:09:35,440 --> 01:09:38,319 is going to crash. So instead, I'm 1625 01:09:38,319 --> 01:09:40,239 opting for a peer-to-peer uh 1626 01:09:40,239 --> 01:09:43,359 peer-to-peer network architecture where 1627 01:09:43,359 --> 01:09:45,279 there's a birectional connection between 1628 01:09:45,279 --> 01:09:48,000 every peer. So uh as you can see on this 1629 01:09:48,000 --> 01:09:50,159 diagram, each peer has a receiving 1630 01:09:50,159 --> 01:09:52,159 socket and a sending socket. So it 1631 01:09:52,159 --> 01:09:54,239 receives information from other peers 1632 01:09:54,239 --> 01:09:56,159 using the receiving socket and it can 1633 01:09:56,159 --> 01:09:57,760 send out information to other peers 1634 01:09:57,760 --> 01:10:00,719 using a sending socket. 1635 01:10:00,719 --> 01:10:03,120 Oh, additionally, all the peers have uh 1636 01:10:03,120 --> 01:10:06,480 their own public and private key. 1637 01:10:06,480 --> 01:10:09,360 Okay, so this is the peer-to-peer uh LAN 1638 01:10:09,360 --> 01:10:13,360 app with two users. Uh I have a Debian 1639 01:10:13,360 --> 01:10:16,719 desktop here and it's sending some 1640 01:10:16,719 --> 01:10:20,000 messages to my MacBook here and you can 1641 01:10:20,000 --> 01:10:23,920 see that they're all uh synced up. 1642 01:10:23,920 --> 01:10:26,080 Next is verify messages because you 1643 01:10:26,080 --> 01:10:28,239 never know if messages can be tampered 1644 01:10:28,239 --> 01:10:29,920 with. The way you do this is with 1645 01:10:29,920 --> 01:10:32,159 signatures. So you use a private key to 1646 01:10:32,159 --> 01:10:35,040 sign your message so uh other people can 1647 01:10:35,040 --> 01:10:37,520 be sure that you wrote it and it's not 1648 01:10:37,520 --> 01:10:40,000 being tampered with. 1649 01:10:40,000 --> 01:10:42,159 Uh I added a lot more features to this 1650 01:10:42,159 --> 01:10:44,320 app. So it's not just a chat app. I also 1651 01:10:44,320 --> 01:10:46,080 added a connections manager. So you can 1652 01:10:46,080 --> 01:10:48,719 have trusted and untrusted connections. 1653 01:10:48,719 --> 01:10:51,040 Uh you can add people to your trusted 1654 01:10:51,040 --> 01:10:53,600 list and everyone else they show up in 1655 01:10:53,600 --> 01:10:56,159 the untrusted category here. And you can 1656 01:10:56,159 --> 01:10:57,760 manage your connections so you can close 1657 01:10:57,760 --> 01:11:00,800 and restart them. All right. Now for the 1658 01:11:00,800 --> 01:11:02,960 fun stuff is file sharing. This is the 1659 01:11:02,960 --> 01:11:05,600 gossip protocol which gutella uses. If 1660 01:11:05,600 --> 01:11:07,120 you want to send out a query to a 1661 01:11:07,120 --> 01:11:09,040 decentralized network, there's no single 1662 01:11:09,040 --> 01:11:11,040 central server you have to query. So 1663 01:11:11,040 --> 01:11:12,560 instead, you send it out to all your 1664 01:11:12,560 --> 01:11:14,800 peers who send it out to their peers who 1665 01:11:14,800 --> 01:11:16,800 send it out to their peers and so on. 1666 01:11:16,800 --> 01:11:19,360 Usually uh the peers will pick uh some 1667 01:11:19,360 --> 01:11:20,960 random connections to send it to, but 1668 01:11:20,960 --> 01:11:22,480 because I'm just doing this in the land 1669 01:11:22,480 --> 01:11:24,320 and there's not many people anyways, I'm 1670 01:11:24,320 --> 01:11:26,159 just sending it to all peers instead of 1671 01:11:26,159 --> 01:11:29,120 a random selection. 1672 01:11:29,120 --> 01:11:31,199 Uh I also want to mention a concept 1673 01:11:31,199 --> 01:11:34,159 known as the web of trust which I think 1674 01:11:34,159 --> 01:11:37,360 is better than the CA. Um because 1675 01:11:37,360 --> 01:11:40,719 instead of having to register uh with a 1676 01:11:40,719 --> 01:11:44,000 single central authority, you can uh 1677 01:11:44,000 --> 01:11:46,640 just chat up with your friends and add 1678 01:11:46,640 --> 01:11:49,199 each other to your own trusted lists. 1679 01:11:49,199 --> 01:11:53,280 And this way uh if you trust Bob and Bob 1680 01:11:53,280 --> 01:11:56,480 trusts Charlie then you indirectly trust 1681 01:11:56,480 --> 01:11:59,440 Charlie which is what I use for resource 1682 01:11:59,440 --> 01:12:02,480 queries. So I added a file sharing uh 1683 01:12:02,480 --> 01:12:05,760 feature to my chat app. Uh so you can 1684 01:12:05,760 --> 01:12:09,040 query for resources and your queries get 1685 01:12:09,040 --> 01:12:12,719 bounced to different peers. Um but uh in 1686 01:12:12,719 --> 01:12:14,800 the in the initial versions I didn't 1687 01:12:14,800 --> 01:12:16,480 really have a way for you to know 1688 01:12:16,480 --> 01:12:19,679 whether uh the queries you receive the 1689 01:12:19,679 --> 01:12:21,199 resources you receive whether they're 1690 01:12:21,199 --> 01:12:23,360 trusted or not. So I had to add a trust 1691 01:12:23,360 --> 01:12:25,760 chain to implement the web of trust 1692 01:12:25,760 --> 01:12:28,159 protocol. Uh so you can see how many 1693 01:12:28,159 --> 01:12:31,040 hops the query took and whether it's 1694 01:12:31,040 --> 01:12:33,199 along a chain of trust or whether it's 1695 01:12:33,199 --> 01:12:35,600 not. Uh because remember you can 1696 01:12:35,600 --> 01:12:37,840 actually have connections with untrusted 1697 01:12:37,840 --> 01:12:41,280 peers. uh which is something that Miwire 1698 01:12:41,280 --> 01:12:42,960 and Kutella I don't think they support 1699 01:12:42,960 --> 01:12:46,640 yet. Uh unfortunately Miwire stopped uh 1700 01:12:46,640 --> 01:12:48,719 stopped maintenance which is really sad. 1701 01:12:48,719 --> 01:12:51,760 I hope someone picks that up. Um all 1702 01:12:51,760 --> 01:12:54,880 right and next for file sharing uh you 1703 01:12:54,880 --> 01:12:57,920 can share files which is really cool. Um 1704 01:12:57,920 --> 01:13:00,159 however if the file gets tampered with 1705 01:13:00,159 --> 01:13:02,400 there's a way you can know which is by 1706 01:13:02,400 --> 01:13:07,199 using hashes. So I add a hash uh a hash 1707 01:13:07,199 --> 01:13:09,520 entry to my database so you can ensure 1708 01:13:09,520 --> 01:13:12,000 that the file you receive on your end 1709 01:13:12,000 --> 01:13:14,239 has not been corrupted. 1710 01:13:14,239 --> 01:13:17,120 Uh and this is a demo where I sent the 1711 01:13:17,120 --> 01:13:21,360 Otus uh PDF to another computer. Otus is 1712 01:13:21,360 --> 01:13:23,840 a great Math Olympia textbook. Highly 1713 01:13:23,840 --> 01:13:25,920 recommend. 1714 01:13:25,920 --> 01:13:28,159 Anyways, commenting. Now you can also 1715 01:13:28,159 --> 01:13:30,800 comment on resources which uh is an 1716 01:13:30,800 --> 01:13:33,360 extra feature that um UI didn't have. 1717 01:13:33,360 --> 01:13:35,280 But I wanted to addit it uh because I 1718 01:13:35,280 --> 01:13:37,199 think it's really cool. You basically 1719 01:13:37,199 --> 01:13:38,880 create these the same way as you do with 1720 01:13:38,880 --> 01:13:41,280 other resources. Um but you just have to 1721 01:13:41,280 --> 01:13:44,239 paste the hash of the resource as the 1722 01:13:44,239 --> 01:13:47,199 label. So that way your comment is uh 1723 01:13:47,199 --> 01:13:50,000 tied towards the resource. This way is 1724 01:13:50,000 --> 01:13:53,120 if you select a resource and you press 1725 01:13:53,120 --> 01:13:55,520 uh query comments then you can find all 1726 01:13:55,520 --> 01:13:57,520 the comments with the hash of the 1727 01:13:57,520 --> 01:14:00,239 resource as its label. 1728 01:14:00,239 --> 01:14:02,000 Now for the stuff I learned. First of 1729 01:14:02,000 --> 01:14:04,560 all, decentralized network is really 1730 01:14:04,560 --> 01:14:07,440 really cool and I don't need to let the 1731 01:14:07,440 --> 01:14:10,159 CIA uh the CA tell you that I'm a human 1732 01:14:10,159 --> 01:14:11,679 being. 1733 01:14:11,679 --> 01:14:15,440 Um and secondly, uh there's so many 1734 01:14:15,440 --> 01:14:17,679 really cool decentralized B2B networks 1735 01:14:17,679 --> 01:14:19,440 and I highly encourage you to check them 1736 01:14:19,440 --> 01:14:22,800 out, especially Reticular. Third of all, 1737 01:14:22,800 --> 01:14:24,880 um IPv6 1738 01:14:24,880 --> 01:14:28,320 is great, NAT is terrible, IPv4 is 1739 01:14:28,320 --> 01:14:31,280 terrible. I cannot stress how many times 1740 01:14:31,280 --> 01:14:34,960 CGNAT caused to have so many bugs in my 1741 01:14:34,960 --> 01:14:38,400 code and my I2B setup. So CGNAT is a 1742 01:14:38,400 --> 01:14:40,400 really no really big no no. Please turn 1743 01:14:40,400 --> 01:14:45,546 it off when you get home. Um [laughter] 1744 01:14:46,239 --> 01:14:48,159 uh fourth of all uh please don't laugh 1745 01:14:48,159 --> 01:14:50,000 at other people because they spent 2,000 1746 01:14:50,000 --> 01:14:51,760 lines of code for a simple chatup. It's 1747 01:14:51,760 --> 01:14:54,717 actually pretty hard. [laughter] 1748 01:14:57,281 --> 01:14:58,640 [applause] 1749 01:14:58,640 --> 01:15:01,120 Uh, number five, check your firewall 1750 01:15:01,120 --> 01:15:05,120 before you give up debugging. I um had a 1751 01:15:05,120 --> 01:15:08,080 UFW and it blocked all my ports, which 1752 01:15:08,080 --> 01:15:09,520 was really annoying. I didn't know what 1753 01:15:09,520 --> 01:15:12,159 went wrong, but you just enable the port 1754 01:15:12,159 --> 01:15:16,000 and it works. [laughter] Uh, and here is 1755 01:15:16,000 --> 01:15:18,640 my GitHub repo. You can scan the QR 1756 01:15:18,640 --> 01:15:21,040 code. It's not that great. 2,000 lines 1757 01:15:21,040 --> 01:15:23,840 of code in one file, but I'm making a 1758 01:15:23,840 --> 01:15:25,840 dev branch and I'm refactoring all my 1759 01:15:25,840 --> 01:15:27,679 code and then modularizing it and 1760 01:15:27,679 --> 01:15:30,000 splitting it up like a professional dev. 1761 01:15:30,000 --> 01:15:32,000 So hopefully 1762 01:15:32,000 --> 01:15:33,679 hopefully that would be better and 1763 01:15:33,679 --> 01:15:35,679 easier to debug. If you find any issues, 1764 01:15:35,679 --> 01:15:39,280 please submit a PR. Um, [laughter] 1765 01:15:39,280 --> 01:15:41,600 uh, some steps for the future. First of 1766 01:15:41,600 --> 01:15:43,600 all, peer discovery. I think I'm already 1767 01:15:43,600 --> 01:15:44,960 doing a good job at that because I'm 1768 01:15:44,960 --> 01:15:46,800 allowing untrusted connections although 1769 01:15:46,800 --> 01:15:50,239 I flag them but I also want to have u a 1770 01:15:50,239 --> 01:15:52,719 specialized feature for discovering new 1771 01:15:52,719 --> 01:15:55,600 peers. Second of all uh user creation of 1772 01:15:55,600 --> 01:15:57,920 channels. My current chat app is similar 1773 01:15:57,920 --> 01:16:00,239 to IRC in terms of aesthetic even though 1774 01:16:00,239 --> 01:16:01,920 it's not actually a server client 1775 01:16:01,920 --> 01:16:04,000 architecture. It's P2P but it does have 1776 01:16:04,000 --> 01:16:06,400 channels but they're all hardcoded. So I 1777 01:16:06,400 --> 01:16:08,400 think that uh user creation of channels 1778 01:16:08,400 --> 01:16:11,120 would be a good step to add. Um, third 1779 01:16:11,120 --> 01:16:13,600 of all, uh, I want to expand this to the 1780 01:16:13,600 --> 01:16:17,840 WAN, potentially I2P. Um, since like, 1781 01:16:17,840 --> 01:16:19,280 you know, if you're in a land, you can 1782 01:16:19,280 --> 01:16:21,120 just talk to people. Like, do you really 1783 01:16:21,120 --> 01:16:22,560 need to? [laughter] 1784 01:16:22,560 --> 01:16:25,199 Uh, and yeah, now I need to clean up the 1785 01:16:25,199 --> 01:16:26,960 code base. Hopefully, it will look 1786 01:16:26,960 --> 01:16:28,719 really good. Add more comments. It will 1787 01:16:28,719 --> 01:16:31,920 all be great. And that's it. Thank you 1788 01:16:31,920 --> 01:16:34,222 for listening. 1789 01:16:34,222 --> 01:16:36,242 [applause and cheering] 1790 01:16:37,199 --> 01:16:40,773 Massive round of applause for Emma. 1791 01:16:40,773 --> 01:16:42,793 [applause and cheering] 1792 01:16:43,600 --> 01:16:48,640 Yes. H I mean I just Yes. Yes. Yes. Yes. 1793 01:16:48,640 --> 01:16:50,239 Okay. 1794 01:16:50,239 --> 01:16:54,440 It's the last talk. 1795 01:16:56,080 --> 01:16:59,520 We might have time at the end of this 1796 01:16:59,520 --> 01:17:02,880 talk for a couple of questions. I'm not 1797 01:17:02,880 --> 01:17:05,040 going to promise. I don't know when the 1798 01:17:05,040 --> 01:17:07,679 venue I'm avoiding eye contact will kick 1799 01:17:07,679 --> 01:17:09,120 us out. 1800 01:17:09,120 --> 01:17:10,640 Um, 1801 01:17:10,640 --> 01:17:13,440 but what we will be doing is getting all 1802 01:17:13,440 --> 01:17:17,440 of the links that the students have uh 1803 01:17:17,440 --> 01:17:20,000 put on the put on slides I want to share 1804 01:17:20,000 --> 01:17:21,520 and I will be putting them all in the 1805 01:17:21,520 --> 01:17:23,199 discord unless the students have already 1806 01:17:23,199 --> 01:17:25,920 put them in the discord. Email them to 1807 01:17:25,920 --> 01:17:28,159 me right now otherwise. Um, but it's 1808 01:17:28,159 --> 01:17:30,800 okay. There's one last talk. We can do 1809 01:17:30,800 --> 01:17:32,518 it. 1810 01:17:32,518 --> 01:17:33,280 [cheering] 1811 01:17:33,280 --> 01:17:35,920 This is Jasmine. [applause] 1812 01:17:35,920 --> 01:17:38,000 Jasmine is going to be talking about 1813 01:17:38,000 --> 01:17:40,880 friendship. 1814 01:17:40,880 --> 01:17:42,880 Uh Jasmine has been programming since 1815 01:17:42,880 --> 01:17:44,960 primary school. 1816 01:17:44,960 --> 01:17:48,080 Um oh gosh, 1817 01:17:48,080 --> 01:17:50,480 really? 1818 01:17:50,480 --> 01:17:53,478 Okay, there are two of them. Um 1819 01:17:53,478 --> 01:17:55,199 [laughter] 1820 01:17:55,199 --> 01:17:59,920 I'm an adult. Uh okay. Um 1821 01:17:59,920 --> 01:18:03,760 cat. Cat. Squinty cat. Angry cat. 1822 01:18:03,760 --> 01:18:07,199 Oh, squinty cat. Angry cat. I don't 1823 01:18:07,199 --> 01:18:08,880 I'm going to say that's Yes, it's 1824 01:18:08,880 --> 01:18:11,120 smirking cat. 1825 01:18:11,120 --> 01:18:13,760 Yeah, I that's and I don't even know how 1826 01:18:13,760 --> 01:18:16,080 to uh 1827 01:18:16,080 --> 01:18:19,120 uh quick 1828 01:18:19,120 --> 01:18:22,400 I need four more green shirts or three 1829 01:18:22,400 --> 01:18:24,640 more green shirts. Come on. Come on. 1830 01:18:24,640 --> 01:18:28,480 This is totally worth it. Yeah. Okay. Um 1831 01:18:28,480 --> 01:18:31,520 you stand there. You No. No. Alex, 1832 01:18:31,520 --> 01:18:34,239 you're not needed. You stand. Kneel down 1833 01:18:34,239 --> 01:18:38,019 here. And now be more plant-based. 1834 01:18:38,019 --> 01:18:40,039 [laughter] 1835 01:18:41,679 --> 01:18:47,960 Yes. A fourleaf clover. Yeah. 1836 01:18:49,809 --> 01:18:52,320 [applause] Thank you. Amazing GPN 1837 01:18:52,320 --> 01:18:53,739 tutors. Always willing to step 1838 01:18:53,739 --> 01:18:57,040 [laughter] in. Um 1839 01:18:57,040 --> 01:18:59,199 we're normal adults. Um, Jasmine 1840 01:18:59,199 --> 01:19:02,239 recently learned about the new reaction 1841 01:19:02,239 --> 01:19:04,640 video setting when you're screen 1842 01:19:04,640 --> 01:19:06,560 recording on your phone and she said 1843 01:19:06,560 --> 01:19:09,040 that her mom has loved this discovery 1844 01:19:09,040 --> 01:19:11,920 and that she now gets silly reaction 1845 01:19:11,920 --> 01:19:14,320 videos to music videos. I love this. I 1846 01:19:14,320 --> 01:19:17,600 love this so much. So, one more massive 1847 01:19:17,600 --> 01:19:19,939 round of applause to welcome Jasmine. 1848 01:19:19,939 --> 01:19:21,905 [cheering] 1849 01:19:21,905 --> 01:19:23,679 [applause] 1850 01:19:23,679 --> 01:19:27,679 Hello everyone. Hi. Um, so I'm Jasmine 1851 01:19:27,679 --> 01:19:30,239 Terron and this is my talk, Friendship 1852 01:19:30,239 --> 01:19:33,679 is Magic. Um, and it's a data 1853 01:19:33,679 --> 01:19:35,040 investigation that uses machine 1854 01:19:35,040 --> 01:19:38,800 learning. So, a little bit about me. I'm 1855 01:19:38,800 --> 01:19:41,360 a year 12 student and I study at Bergman 1856 01:19:41,360 --> 01:19:44,719 Anglican School in CRA. And as you may 1857 01:19:44,719 --> 01:19:48,400 guess from the topic, I really like My 1858 01:19:48,400 --> 01:19:51,199 Little Pony. 1859 01:19:51,199 --> 01:19:56,159 Like, I really like My Little Pony. 1860 01:19:56,159 --> 01:20:00,480 Look how cool I am. That's pretty cool. 1861 01:20:00,480 --> 01:20:02,239 So, what did I want to do for my 1862 01:20:02,239 --> 01:20:04,719 project? I wanted to find out what makes 1863 01:20:04,719 --> 01:20:07,920 their friendship so special to me or 1864 01:20:07,920 --> 01:20:10,640 find the magic behind their friendship 1865 01:20:10,640 --> 01:20:13,280 and learn how to replicate that. 1866 01:20:13,280 --> 01:20:16,000 So, what is my project? 1867 01:20:16,000 --> 01:20:18,159 It analyzes the 30 characters with the 1868 01:20:18,159 --> 01:20:20,159 most lines in Friendship is Magic. And 1869 01:20:20,159 --> 01:20:21,920 it starts by looking at all the 1870 01:20:21,920 --> 01:20:23,360 characters and what makes them different 1871 01:20:23,360 --> 01:20:25,920 and interesting. Then we do sentiment 1872 01:20:25,920 --> 01:20:28,960 analysis and investigation. 1873 01:20:28,960 --> 01:20:30,640 We do sentiment analysis with two 1874 01:20:30,640 --> 01:20:32,400 different methods. We do Vader and 1875 01:20:32,400 --> 01:20:34,560 Roberta. And once the better option is 1876 01:20:34,560 --> 01:20:36,400 found, investigation was continued with 1877 01:20:36,400 --> 01:20:38,000 that. 1878 01:20:38,000 --> 01:20:40,960 So what is sentiment? Sentiment is 1879 01:20:40,960 --> 01:20:43,280 basically the overall emotional tone of 1880 01:20:43,280 --> 01:20:46,560 a piece of text. So if numerical values 1881 01:20:46,560 --> 01:20:48,560 come back higher in positive, it would 1882 01:20:48,560 --> 01:20:51,360 evoke positive feelings in the viewer. 1883 01:20:51,360 --> 01:20:54,640 My hypothesis was that characters in the 1884 01:20:54,640 --> 01:20:56,320 show will speak with an overall positive 1885 01:20:56,320 --> 01:20:58,560 or neutral sentiment on average in order 1886 01:20:58,560 --> 01:21:00,159 to appeal to the show's young target 1887 01:21:00,159 --> 01:21:02,000 audience. 1888 01:21:02,000 --> 01:21:04,640 This is the data set that I used. It's 1889 01:21:04,640 --> 01:21:06,480 um seasons 1 through eight of Friendship 1890 01:21:06,480 --> 01:21:08,560 is Magic as well as two of the movies. 1891 01:21:08,560 --> 01:21:11,120 Um basically in My Little Pony, each 1892 01:21:11,120 --> 01:21:13,440 season contains 26 episodes except for 1893 01:21:13,440 --> 01:21:15,840 season 3 which was created as a possible 1894 01:21:15,840 --> 01:21:17,679 season finale before the show got 1895 01:21:17,679 --> 01:21:20,560 renewed for season 4. Um, and the data 1896 01:21:20,560 --> 01:21:22,880 is broken up into four smaller subsets, 1897 01:21:22,880 --> 01:21:25,360 which pretty much just made it easier to 1898 01:21:25,360 --> 01:21:28,320 access the data that I needed. Um, yeah, 1899 01:21:28,320 --> 01:21:30,400 onto visualizations. 1900 01:21:30,400 --> 01:21:32,480 So, here we see the top 30 characters 1901 01:21:32,480 --> 01:21:34,320 with the most lines sorted from highest 1902 01:21:34,320 --> 01:21:36,719 to lowest. Um, these will basically just 1903 01:21:36,719 --> 01:21:38,640 be used as the order for further graphs 1904 01:21:38,640 --> 01:21:41,199 in the future. As we can see, Twilight 1905 01:21:41,199 --> 01:21:44,159 speaks a lot. She is the main character. 1906 01:21:44,159 --> 01:21:46,880 Nice. Here, instead of the most lines 1907 01:21:46,880 --> 01:21:48,480 said, it's the most words said within 1908 01:21:48,480 --> 01:21:50,480 the script. This follows a similar 1909 01:21:50,480 --> 01:21:52,639 trend. However, some characters say more 1910 01:21:52,639 --> 01:21:55,360 words in their sentences. For example, 1911 01:21:55,360 --> 01:21:57,280 Rarity says lots of words within her 1912 01:21:57,280 --> 01:21:58,800 lines, which makes sense within her 1913 01:21:58,800 --> 01:22:00,800 character. The other graph just shows 1914 01:22:00,800 --> 01:22:02,560 the average number of words per line 1915 01:22:02,560 --> 01:22:05,760 with the overall being around 11. Now, 1916 01:22:05,760 --> 01:22:07,120 we'll move on to the start of our 1917 01:22:07,120 --> 01:22:09,840 sentiment analysis. 1918 01:22:09,840 --> 01:22:12,560 The Vader method shows majority neutral 1919 01:22:12,560 --> 01:22:15,520 sentiment at around 70%. With little 1920 01:22:15,520 --> 01:22:17,840 differences between characters, all 1921 01:22:17,840 --> 01:22:19,520 characters yielding similar results 1922 01:22:19,520 --> 01:22:22,080 highlights how the VETA model is likely 1923 01:22:22,080 --> 01:22:24,159 inaccurate. Vader is basically a 1924 01:22:24,159 --> 01:22:25,920 rule-based tool that uses a dictionary 1925 01:22:25,920 --> 01:22:28,080 of words with assigned sentiment values 1926 01:22:28,080 --> 01:22:30,159 where the sum of the words present gives 1927 01:22:30,159 --> 01:22:32,080 the overall sentiment as a numerical 1928 01:22:32,080 --> 01:22:34,800 value. Basically, you've got a bunch of 1929 01:22:34,800 --> 01:22:36,960 words. Each word has a number. You add 1930 01:22:36,960 --> 01:22:39,840 them together. That's your sentiment. 1931 01:22:39,840 --> 01:22:41,600 The key limitation with this tool is 1932 01:22:41,600 --> 01:22:43,280 that the dictionary is static and it 1933 01:22:43,280 --> 01:22:44,880 works from predefined values for the 1934 01:22:44,880 --> 01:22:46,639 words. Therefore, it lacks the 1935 01:22:46,639 --> 01:22:48,480 contextual understanding to understand 1936 01:22:48,480 --> 01:22:50,800 things like sarcasm. 1937 01:22:50,800 --> 01:22:53,360 In the Robera model, it shows characters 1938 01:22:53,360 --> 01:22:55,440 having an average sentiment of around 1939 01:22:55,440 --> 01:22:58,239 50% neutral and 25% positive and 1940 01:22:58,239 --> 01:23:00,880 negative. The Roberto model is a 1941 01:23:00,880 --> 01:23:02,880 transformersbased machine learning model 1942 01:23:02,880 --> 01:23:04,400 that is used in order to analyze 1943 01:23:04,400 --> 01:23:06,159 sentiment in terms of the context words 1944 01:23:06,159 --> 01:23:08,000 are coming from instead of the words 1945 01:23:08,000 --> 01:23:10,080 themselves. 1946 01:23:10,080 --> 01:23:11,920 That makes it the preferred method for 1947 01:23:11,920 --> 01:23:15,679 heavily sarcastic or ironic pieces. The 1948 01:23:15,679 --> 01:23:17,280 limitation with the Roberto model is 1949 01:23:17,280 --> 01:23:20,560 that it has a token limit of 512. Um, so 1950 01:23:20,560 --> 01:23:22,159 it means that not all the text within a 1951 01:23:22,159 --> 01:23:23,920 section can be processed within the same 1952 01:23:23,920 --> 01:23:26,719 group. And just so you know, 512 tokens 1953 01:23:26,719 --> 01:23:30,239 is typically 400 to 500 words. So that 1954 01:23:30,239 --> 01:23:32,560 means while Roberta was the obvious 1955 01:23:32,560 --> 01:23:34,960 better pick, the graph here only 1956 01:23:34,960 --> 01:23:36,880 corresponds to the data in the first 1957 01:23:36,880 --> 01:23:40,239 season that a character's in. 1958 01:23:40,239 --> 01:23:42,960 So I decided to gather sentiment data 1959 01:23:42,960 --> 01:23:44,560 for every season that was available 1960 01:23:44,560 --> 01:23:46,719 within the data set in order to analyze 1961 01:23:46,719 --> 01:23:48,800 how sentiment changed over the show and 1962 01:23:48,800 --> 01:23:51,120 how characters grew. The differences 1963 01:23:51,120 --> 01:23:52,639 within these graphs could be due to the 1964 01:23:52,639 --> 01:23:54,880 character story arcs including shifts in 1965 01:23:54,880 --> 01:23:57,199 character motivations, relationships, 1966 01:23:57,199 --> 01:23:59,280 personal growth, and all of this could 1967 01:23:59,280 --> 01:24:02,400 potentially create differences. 1968 01:24:02,400 --> 01:24:03,920 Interestingly, 1969 01:24:03,920 --> 01:24:05,600 Friendship is Magic also had many 1970 01:24:05,600 --> 01:24:07,760 changes to showrunners and directors 1971 01:24:07,760 --> 01:24:09,679 during its time, which may have also 1972 01:24:09,679 --> 01:24:11,840 influenced its direction. 1973 01:24:11,840 --> 01:24:13,760 The top section shows the seasons with 1974 01:24:13,760 --> 01:24:15,920 the original developer and showrunner, 1975 01:24:15,920 --> 01:24:17,600 and the next section is the next 1976 01:24:17,600 --> 01:24:20,320 showrunner. In the first seasons, the 1977 01:24:20,320 --> 01:24:21,920 show was still finding its footing and 1978 01:24:21,920 --> 01:24:24,719 as a result in this section in season 2, 1979 01:24:24,719 --> 01:24:26,960 a higher negativity within the main six 1980 01:24:26,960 --> 01:24:29,679 can be seen which does not occur in any 1981 01:24:29,679 --> 01:24:31,440 other season. 1982 01:24:31,440 --> 01:24:33,440 Additionally, all these seasons were d 1983 01:24:33,440 --> 01:24:36,639 created under this director. Now, watch 1984 01:24:36,639 --> 01:24:38,320 what happens when we change director in 1985 01:24:38,320 --> 01:24:40,239 season 6. 1986 01:24:40,239 --> 01:24:42,400 Not only are there many new characters, 1987 01:24:42,400 --> 01:24:44,159 but some episodes become more highly 1988 01:24:44,159 --> 01:24:47,040 positive with less negative or emotional 1989 01:24:47,040 --> 01:24:50,080 episodes. From reviews, some fans prefer 1990 01:24:50,080 --> 01:24:51,920 the original portrayal, while others 1991 01:24:51,920 --> 01:24:53,760 appreciate the new directions taken by 1992 01:24:53,760 --> 01:24:56,320 subsequent writers. I believe that this 1993 01:24:56,320 --> 01:24:58,400 speaks to every version of a character 1994 01:24:58,400 --> 01:25:00,880 being important. 1995 01:25:00,880 --> 01:25:02,639 Interestingly, 1996 01:25:02,639 --> 01:25:04,400 the first season that this new director 1997 01:25:04,400 --> 01:25:06,719 directs looks highly similar to the data 1998 01:25:06,719 --> 01:25:09,840 from season 3, which was the big hit 1999 01:25:09,840 --> 01:25:11,440 season that ended up getting the show 2000 01:25:11,440 --> 01:25:13,199 renewed. And I just thought this was 2001 01:25:13,199 --> 01:25:14,880 interesting. 2002 01:25:14,880 --> 01:25:16,239 Looking back to the initial 2003 01:25:16,239 --> 01:25:18,000 visualization, I wanted to look at the 2004 01:25:18,000 --> 01:25:20,880 outliers in a further depth. These are 2005 01:25:20,880 --> 01:25:23,360 our positive outliers. Up the top, we'll 2006 01:25:23,360 --> 01:25:25,040 start with Starlight Glimmer. You can 2007 01:25:25,040 --> 01:25:27,360 see a huge level of positivity within 2008 01:25:27,360 --> 01:25:31,120 her first season, which is interesting 2009 01:25:31,120 --> 01:25:32,800 because she's actually a villain to the 2010 01:25:32,800 --> 01:25:34,560 main six in this season. So, she 2011 01:25:34,560 --> 01:25:37,280 shouldn't be positive. Um, the reason 2012 01:25:37,280 --> 01:25:39,120 for this is that while the things she 2013 01:25:39,120 --> 01:25:41,440 says are positive, the overall mood of 2014 01:25:41,440 --> 01:25:43,920 the episodes and the real meaning of 2015 01:25:43,920 --> 01:25:46,320 what she's saying is negative, which the 2016 01:25:46,320 --> 01:25:48,080 model couldn't pick up from just the 2017 01:25:48,080 --> 01:25:50,639 text that it was given. You can then see 2018 01:25:50,639 --> 01:25:54,239 that in season 6, seven, and eight, 2019 01:25:54,239 --> 01:25:56,239 slow increases in sentiment as she 2020 01:25:56,239 --> 01:25:58,719 finally begins to be genuine and becomes 2021 01:25:58,719 --> 01:26:01,920 more friendly. Cheerly is highly 2022 01:26:01,920 --> 01:26:04,719 positive as she is a teacher and she has 2023 01:26:04,719 --> 01:26:08,009 to do that for her job. 2024 01:26:08,009 --> 01:26:10,029 [laughter] 2025 01:26:10,719 --> 01:26:13,520 But this data misses the nuance with her 2026 01:26:13,520 --> 01:26:16,880 facial expressions that is shown in 2027 01:26:16,880 --> 01:26:20,960 which conveys her real emotions. 2028 01:26:21,040 --> 01:26:23,199 Additionally, Mort and Spitfire are both 2029 01:26:23,199 --> 01:26:25,280 highly sarcastic characters. And while 2030 01:26:25,280 --> 01:26:26,800 Roberta is the preferred method for 2031 01:26:26,800 --> 01:26:29,520 picking up sarcasm, it also can't show 2032 01:26:29,520 --> 01:26:31,040 their facial expressions that show how 2033 01:26:31,040 --> 01:26:33,120 they truly feel and therefore portrays 2034 01:26:33,120 --> 01:26:35,679 them as more positive than they are. I 2035 01:26:35,679 --> 01:26:37,600 think interestingly, you can also see 2036 01:26:37,600 --> 01:26:40,159 character arcs within this data, and 2037 01:26:40,159 --> 01:26:41,360 these characters aren't all 2038 01:26:41,360 --> 01:26:43,920 overwhelmingly positive. 2039 01:26:43,920 --> 01:26:45,840 I also made visualizations for the main 2040 01:26:45,840 --> 01:26:48,639 six. I think most interestingly in this 2041 01:26:48,639 --> 01:26:50,880 is that Twilight has a huge negative 2042 01:26:50,880 --> 01:26:53,360 section in season 4. This is because 2043 01:26:53,360 --> 01:26:55,199 she's learning to become a princess and 2044 01:26:55,199 --> 01:26:58,960 like I would be stressed about that too. 2045 01:26:58,960 --> 01:27:00,960 And then she's positive again in season 2046 01:27:00,960 --> 01:27:02,639 6 when she's basically becoming a 2047 01:27:02,639 --> 01:27:04,960 teacher and finding her calling. I think 2048 01:27:04,960 --> 01:27:06,560 it's cool that across all these 2049 01:27:06,560 --> 01:27:08,400 characters, their key traits still stay 2050 01:27:08,400 --> 01:27:10,480 the same even when some characterize 2051 01:27:10,480 --> 01:27:12,400 them slightly differently or they're 2052 01:27:12,400 --> 01:27:14,560 going through a tough time. I think this 2053 01:27:14,560 --> 01:27:16,320 consistency is what makes it so 2054 01:27:16,320 --> 01:27:20,719 comforting for me and for many others. 2055 01:27:20,719 --> 01:27:22,880 I've attempted and am working on further 2056 01:27:22,880 --> 01:27:24,560 project which would use this data set of 2057 01:27:24,560 --> 01:27:26,880 scripts for generation of new and unique 2058 01:27:26,880 --> 01:27:29,040 episodes through machine learning. 2059 01:27:29,040 --> 01:27:31,840 However, while that is cool, I think a 2060 01:27:31,840 --> 01:27:33,199 lot more value can be gained from 2061 01:27:33,199 --> 01:27:35,679 analyzing existing work and appreciating 2062 01:27:35,679 --> 01:27:38,080 the show that was so special to little 2063 01:27:38,080 --> 01:27:40,960 me as well. And because we looked at how 2064 01:27:40,960 --> 01:27:42,880 each writer and time period shaped the 2065 01:27:42,880 --> 01:27:44,719 characters and their sentiment, this 2066 01:27:44,719 --> 01:27:46,239 will be very useful for building 2067 01:27:46,239 --> 01:27:49,600 accuracy within this project to add on. 2068 01:27:49,600 --> 01:27:53,360 So I think what I really learned wasn't 2069 01:27:53,360 --> 01:27:56,159 my struggles with using Roberta or how 2070 01:27:56,159 --> 01:27:58,400 I'd managed to store all the variables I 2071 01:27:58,400 --> 01:28:00,880 was gen generating in a spreadsheet of 2072 01:28:00,880 --> 01:28:04,880 doom. I think being authentic in all 2073 01:28:04,880 --> 01:28:06,880 your negatives and positives, in all 2074 01:28:06,880 --> 01:28:09,920 your achievements and flaws, in every 2075 01:28:09,920 --> 01:28:12,320 characterization of yourself, being 2076 01:28:12,320 --> 01:28:14,800 authentically you is the greatest magic 2077 01:28:14,800 --> 01:28:17,199 you can give yourself. 2078 01:28:17,199 --> 01:28:19,010 Thank you. 2079 01:28:19,010 --> 01:28:19,666 [cheering] 2080 01:28:19,666 --> 01:28:21,686 [applause] 2081 01:28:23,679 --> 01:28:26,239 Can we get a massive round of applause? 2082 01:28:26,239 --> 01:28:29,199 And indeed, a massive round of applause 2083 01:28:29,199 --> 01:28:33,120 for all our superbly fabulous speakers. 2084 01:28:33,120 --> 01:28:36,041 Students, come on up here. 2085 01:28:36,041 --> 01:28:37,520 [applause] 2086 01:28:37,520 --> 01:28:39,199 All of you, come on. I didn't warn them 2087 01:28:39,199 --> 01:28:42,080 about this. Come on, students. Go on. Up 2088 01:28:42,080 --> 01:28:44,960 on deck. Up on deck. [applause] 2089 01:28:44,960 --> 01:28:47,360 Yes. I think we've all learned 2090 01:28:47,360 --> 01:28:48,960 something. 2091 01:28:48,960 --> 01:28:53,726 It's that I'm crying. No. [cheering] 2092 01:28:53,726 --> 01:28:55,746 [applause] 2093 01:28:57,840 --> 01:28:59,120 Yes. [screaming] 2094 01:28:59,120 --> 01:29:01,360 Okay. All of the students are being 2095 01:29:01,360 --> 01:29:02,960 mugged. 2096 01:29:02,960 --> 01:29:08,136 Keep that applause going. Epic. Yes. 2097 01:29:08,136 --> 01:29:10,101 [cheering] 2098 01:29:10,101 --> 01:29:12,121 [applause] 2099 01:29:16,560 --> 01:29:19,927 What a journey we've been on. 2100 01:29:19,927 --> 01:29:20,400 [cheering] 2101 01:29:20,400 --> 01:29:22,400 We've got three minutes before we get 2102 01:29:22,400 --> 01:29:25,822 kicked out of the venue. 2103 01:29:25,822 --> 01:29:26,000 [cheering] 2104 01:29:26,000 --> 01:29:28,560 Who has questions? 2105 01:29:28,560 --> 01:29:32,120 Who has questions? 2106 01:29:34,239 --> 01:29:36,880 Yes, there are too many questions. It's 2107 01:29:36,880 --> 01:29:38,880 okay. We 2108 01:29:38,880 --> 01:29:41,280 there's I I know there's so so many 2109 01:29:41,280 --> 01:29:42,880 things. 2110 01:29:42,880 --> 01:29:45,520 Um I've got a 16-year-old sister who 2111 01:29:45,520 --> 01:29:47,360 hasn't even started programming. How 2112 01:29:47,360 --> 01:29:49,199 should I get her into it? 2113 01:29:49,199 --> 01:29:52,022 Oh, 2114 01:29:52,022 --> 01:29:53,600 [laughter] remember that fourleaf 2115 01:29:53,600 --> 01:29:55,440 clover? 2116 01:29:55,440 --> 01:29:57,280 Uh, would you like to direct this at any 2117 01:29:57,280 --> 01:29:59,199 particular one or should they all just 2118 01:29:59,199 --> 01:30:02,239 yell out a word at once and then I will 2119 01:30:02,239 --> 01:30:05,280 summarize that? 2120 01:30:05,280 --> 01:30:06,000 Pay her. 2121 01:30:06,000 --> 01:30:08,960 Pay her. [laughter] Honestly, 2122 01:30:08,960 --> 01:30:13,037 that is the best idea. [cheering] 2123 01:30:13,679 --> 01:30:16,239 Uh, there are heaps of resources. I will 2124 01:30:16,239 --> 01:30:18,239 make sure that some get posted in the 2125 01:30:18,239 --> 01:30:20,800 Discord, but paying would be a fantastic 2126 01:30:20,800 --> 01:30:22,862 idea. [laughter] 2127 01:30:23,199 --> 01:30:27,080 Is there another question? 2128 01:30:27,520 --> 01:30:29,199 I I heard someone say, "I have a 2129 01:30:29,199 --> 01:30:29,760 question." 2130 01:30:29,760 --> 01:30:30,719 Scared everybody. 2131 01:30:30,719 --> 01:30:33,040 I had questions. I know. I just lost 2132 01:30:33,040 --> 01:30:36,080 them all in the glory of all of those. 2133 01:30:36,080 --> 01:30:39,760 Uh here there's a question here. Yes. 2134 01:30:39,760 --> 01:30:41,600 Uh this is a question for the networking 2135 01:30:41,600 --> 01:30:43,760 one. Um, 2136 01:30:43,760 --> 01:30:46,320 uh, have you heard of, uh, what's it 2137 01:30:46,320 --> 01:30:50,880 called? Sisters. It's a thing, a a group 2138 01:30:50,880 --> 01:30:53,040 for women to get into network 2139 01:30:53,040 --> 01:30:54,960 engineering. 2140 01:30:54,960 --> 01:30:56,320 Oh, sorry. Can you say that again? What 2141 01:30:56,320 --> 01:30:56,719 was it? 2142 01:30:56,719 --> 01:31:00,400 It's called like I I aa sisters. 2143 01:31:00,400 --> 01:31:02,080 Okay, I I'll take a look at that. 2144 01:31:02,080 --> 01:31:02,880 Check it out. 2145 01:31:02,880 --> 01:31:04,880 Yeah, thank you. 2146 01:31:04,880 --> 01:31:07,520 Excellent. I will accept that comment. I 2147 01:31:07,520 --> 01:31:09,679 will absolutely accept that comment. 2148 01:31:09,679 --> 01:31:13,440 Okay, then I think we are Oh no, there's 2149 01:31:13,440 --> 01:31:17,360 one more. There's one more. 2150 01:31:17,360 --> 01:31:19,679 There you go. 2151 01:31:19,679 --> 01:31:21,600 Somebody's sister is going to be asking 2152 01:31:21,600 --> 01:31:22,400 question. 2153 01:31:22,400 --> 01:31:24,480 Oh, 2154 01:31:24,480 --> 01:31:26,159 I mean it could be their teacher as 2155 01:31:26,159 --> 01:31:27,600 well. So, you know, 2156 01:31:27,600 --> 01:31:29,600 definitely a speaker sister. 2157 01:31:29,600 --> 01:31:30,960 Okay, go for it. 2158 01:31:30,960 --> 01:31:32,400 Yeah. [laughter] 2159 01:31:32,400 --> 01:31:35,360 Um, okay. So, this question is directed 2160 01:31:35,360 --> 01:31:38,560 towards Jasmine. You said that they 2161 01:31:38,560 --> 01:31:40,880 couldn't see like the facial expressions 2162 01:31:40,880 --> 01:31:43,199 and body language. So, how did you 2163 01:31:43,199 --> 01:31:48,000 actually get the text from episode to 2164 01:31:48,000 --> 01:31:49,679 code? 2165 01:31:49,679 --> 01:31:50,880 Yes. 2166 01:31:50,880 --> 01:31:51,920 Hello. 2167 01:31:51,920 --> 01:31:53,360 Did I turn that off? No. 2168 01:31:53,360 --> 01:31:55,920 No, I'm here. Okay. Hi. Um, basically it 2169 01:31:55,920 --> 01:31:58,159 came up in like the data set was a big 2170 01:31:58,159 --> 01:32:00,000 thing of transcripts which is basically 2171 01:32:00,000 --> 01:32:02,080 just all the words that they say. So, it 2172 01:32:02,080 --> 01:32:03,840 doesn't actually take in any of like 2173 01:32:03,840 --> 01:32:05,679 what's visually happen happening on 2174 01:32:05,679 --> 01:32:07,760 screen. So, it only like does stuff 2175 01:32:07,760 --> 01:32:09,360 based on the words they're saying. Does 2176 01:32:09,360 --> 01:32:12,159 that make sense? Yeah. Okay, cool. 2177 01:32:12,159 --> 01:32:15,120 Fantastic question. Okay, 2178 01:32:15,120 --> 01:32:17,120 there's one more very important thing to 2179 01:32:17,120 --> 01:32:18,880 do, 2180 01:32:18,880 --> 01:32:23,000 which is give out some Lego. 2181 01:32:23,120 --> 01:32:24,800 Students, you're going to awkwardly stay 2182 01:32:24,800 --> 01:32:27,280 there [laughter] 2183 01:32:27,280 --> 01:32:29,440 because you're all going to get one more 2184 01:32:29,440 --> 01:32:31,360 massive round of applause. Absolutely. 2185 01:32:31,360 --> 01:32:33,440 Oh, no. No, no, not yet. Not yet. I'm 2186 01:32:33,440 --> 01:32:36,560 sorry. I'm sorry. I was ambiguous. 2187 01:32:36,560 --> 01:32:38,960 Um, but first, 2188 01:32:38,960 --> 01:32:41,120 uh, okay, we've got two winners. One for 2189 01:32:41,120 --> 01:32:43,679 the adult Lego drawer and one for the 2190 01:32:43,679 --> 01:32:45,679 student Lego drawer. They are both the 2191 01:32:45,679 --> 01:32:48,320 same thing. Uh, but it's in honor of the 2192 01:32:48,320 --> 01:32:49,679 student showcase, we have to have one, 2193 01:32:49,679 --> 01:32:50,800 especially for the students, cuz I'd be 2194 01:32:50,800 --> 01:32:52,239 sad if a student go didn't go home with 2195 01:32:52,239 --> 01:32:55,040 Lego. So, firstly, for the adult Lego 2196 01:32:55,040 --> 01:32:59,800 winner today, it is Nicole King. 2197 01:33:00,159 --> 01:33:01,600 She might be [applause] 2198 01:33:01,600 --> 01:33:04,400 in another room. It's mine. That's okay. 2199 01:33:04,400 --> 01:33:05,199 Wow. 2200 01:33:05,199 --> 01:33:09,120 For now. And for the student winner, and 2201 01:33:09,120 --> 01:33:10,320 I'm just going to note that some of our 2202 01:33:10,320 --> 01:33:12,000 students had to go back to Touumba on 2203 01:33:12,000 --> 01:33:14,159 the bus. So, I don't know if this 2204 01:33:14,159 --> 01:33:16,400 student is part of them, but this 2205 01:33:16,400 --> 01:33:19,440 student is Arya Bray. 2206 01:33:19,440 --> 01:33:21,840 I think she's gone back to Toumba. 2207 01:33:21,840 --> 01:33:22,719 Toua. 2208 01:33:22,719 --> 01:33:24,800 Yay. [cheering] 2209 01:33:24,800 --> 01:33:26,159 We will make sure they get that. Thank 2210 01:33:26,159 --> 01:33:28,159 you, GPN. Thank you again so much for 2211 01:33:28,159 --> 01:33:30,639 sponsoring the education track. 2212 01:33:30,639 --> 01:33:32,719 Yay. 2213 01:33:32,719 --> 01:33:34,639 for being fantastic. Thank you audience 2214 01:33:34,639 --> 01:33:36,159 for being fantastic and supportive as 2215 01:33:36,159 --> 01:33:38,000 you always are. Thank you students for 2216 01:33:38,000 --> 01:33:40,619 being amazing. 2217 01:33:40,619 --> 01:33:41,679 [cheering] 2218 01:33:41,679 --> 01:33:43,440 Can I also note that several of these 2219 01:33:43,440 --> 01:33:48,239 students are GPN students? Yes. 2220 01:33:48,239 --> 01:33:50,639 Okay. One, two, three. We're going to do 2221 01:33:50,639 --> 01:33:53,760 one more big woo. Yay. I'm going to take 2222 01:33:53,760 --> 01:33:57,080 a big breath. 2223 01:33:57,650 --> 01:33:59,670 [cheering] 2224 01:34:01,280 --> 01:34:04,760 Let's go home.