1 00:00:00,480 --> 00:00:03,480 foreign 2 00:00:08,760 --> 00:00:15,660 good afternoon and welcome back to the 3 00:00:11,519 --> 00:00:18,240 education track here at pycon 23. for 4 00:00:15,660 --> 00:00:21,480 this next session I'd like to introduce 5 00:00:18,240 --> 00:00:23,880 Thea there is a high school teacher 6 00:00:21,480 --> 00:00:26,699 maths 7 00:00:23,880 --> 00:00:29,279 digital Technologies 8 00:00:26,699 --> 00:00:32,340 um something else too wasn't there no 9 00:00:29,279 --> 00:00:35,700 those two she works in Brisbane at the 10 00:00:32,340 --> 00:00:37,800 Kelvin Grove College and from what I've 11 00:00:35,700 --> 00:00:40,500 seen at Kelvin Grove they have a really 12 00:00:37,800 --> 00:00:42,960 good digital Technologies program I know 13 00:00:40,500 --> 00:00:44,520 Thea is passionate for women and being a 14 00:00:42,960 --> 00:00:47,640 bit of a mentor with getting girls 15 00:00:44,520 --> 00:00:49,620 coding very important 16 00:00:47,640 --> 00:00:54,180 um and I'd like you to put your hands 17 00:00:49,620 --> 00:00:56,719 together for a pipe and Esther of coding 18 00:00:54,180 --> 00:00:56,719 thank you 19 00:01:00,420 --> 00:01:05,519 all right 20 00:01:02,280 --> 00:01:08,640 so however everyone I'm Thea katsukas 21 00:01:05,519 --> 00:01:12,240 thesaurus a digital Technologies teacher 22 00:01:08,640 --> 00:01:15,060 up in myanjin Brisbane and I work in a 23 00:01:12,240 --> 00:01:16,860 large State College which I love I'm a 24 00:01:15,060 --> 00:01:20,040 great believer in the power of State 25 00:01:16,860 --> 00:01:21,960 schools but it does mean working within 26 00:01:20,040 --> 00:01:26,759 the most restrictive internet filter 27 00:01:21,960 --> 00:01:28,860 ever no student access to GitHub or any 28 00:01:26,759 --> 00:01:31,740 code repositories project management 29 00:01:28,860 --> 00:01:34,680 tools the Google Suite most cloud 30 00:01:31,740 --> 00:01:36,479 services and it was only last year that 31 00:01:34,680 --> 00:01:38,520 you could apply with principal 32 00:01:36,479 --> 00:01:41,220 permission for the ability to download 33 00:01:38,520 --> 00:01:43,439 python libraries the most dangerous 34 00:01:41,220 --> 00:01:45,119 thing of all 35 00:01:43,439 --> 00:01:46,799 um so I've taught digital Technologies 36 00:01:45,119 --> 00:01:49,140 and Mathematics at all high school 37 00:01:46,799 --> 00:01:53,479 levels and I'm lucky enough to have a 38 00:01:49,140 --> 00:01:53,479 great deal of control over what I teach 39 00:01:53,520 --> 00:01:59,220 so although Haskell was my first love 40 00:01:56,360 --> 00:02:01,740 python quickly became the tool that I 41 00:01:59,220 --> 00:02:03,659 turned to for my own projects and when I 42 00:02:01,740 --> 00:02:06,060 became a teacher I found it was such a 43 00:02:03,659 --> 00:02:08,459 fantastic language for Education there 44 00:02:06,060 --> 00:02:10,739 are so many great python resources and 45 00:02:08,459 --> 00:02:13,140 tutorials out there and I appreciate 46 00:02:10,739 --> 00:02:15,180 that the syntax is close enough to 47 00:02:13,140 --> 00:02:18,000 pseudo code that my year 12s can just 48 00:02:15,180 --> 00:02:20,220 about use it on their external exams 49 00:02:18,000 --> 00:02:22,800 I love that I'm able to use Python 50 00:02:20,220 --> 00:02:25,319 across so many different contexts from 51 00:02:22,800 --> 00:02:28,260 beginner text-based scripts to 52 00:02:25,319 --> 00:02:31,260 Scientific and mathematical modeling AI 53 00:02:28,260 --> 00:02:34,680 game development guis physical Computing 54 00:02:31,260 --> 00:02:37,020 Robotics and web development and I think 55 00:02:34,680 --> 00:02:39,120 that having that common language really 56 00:02:37,020 --> 00:02:42,120 helps reduce the cognitive load on 57 00:02:39,120 --> 00:02:44,940 students when you're throwing in SQL and 58 00:02:42,120 --> 00:02:47,819 databases user interfaces usability and 59 00:02:44,940 --> 00:02:51,560 design HTML and CSS and everything else 60 00:02:47,819 --> 00:02:51,560 that we expect of our students 61 00:02:51,959 --> 00:02:57,540 so in Queensland digital Technologies 62 00:02:54,840 --> 00:03:00,300 curriculum is mandated from prep to year 63 00:02:57,540 --> 00:03:03,959 eight however you only have to teach it 64 00:03:00,300 --> 00:03:06,660 for a suggested semester once per band 65 00:03:03,959 --> 00:03:08,220 of two to three years which means that a 66 00:03:06,660 --> 00:03:11,040 student might do a bit of Digi Tech in 67 00:03:08,220 --> 00:03:13,140 year one then again in year four maybe 68 00:03:11,040 --> 00:03:14,519 some robotics in year six and then they 69 00:03:13,140 --> 00:03:17,340 start high school and they have no idea 70 00:03:14,519 --> 00:03:19,739 what digital Technologies is all about 71 00:03:17,340 --> 00:03:22,980 at my school I work in the middle senior 72 00:03:19,739 --> 00:03:25,260 space we get to access our year sevens 73 00:03:22,980 --> 00:03:28,200 for a total of three weeks once a 74 00:03:25,260 --> 00:03:30,840 semester in which time we train cram in 75 00:03:28,200 --> 00:03:33,239 making an arcade game using arcade make 76 00:03:30,840 --> 00:03:36,060 code which is a simple platform that has 77 00:03:33,239 --> 00:03:37,920 the option for Block coding 78 00:03:36,060 --> 00:03:40,799 and then from then on it's an elective 79 00:03:37,920 --> 00:03:43,319 so in year eight and nine students can 80 00:03:40,799 --> 00:03:46,500 choose to do digital Technologies for a 81 00:03:43,319 --> 00:03:48,959 semester we look at things like computer 82 00:03:46,500 --> 00:03:51,000 hardware and networks we do some basic 83 00:03:48,959 --> 00:03:53,040 programming with robots at the moment 84 00:03:51,000 --> 00:03:54,659 we're trialing micro melons which are 85 00:03:53,040 --> 00:03:56,640 these little robots with a bunch of 86 00:03:54,659 --> 00:04:00,000 sensors that are programmed in Python 87 00:03:56,640 --> 00:04:01,799 and they have a virtual simulator that 88 00:04:00,000 --> 00:04:05,340 helps alleviate the problem of not 89 00:04:01,799 --> 00:04:08,879 having one robot for every student 90 00:04:05,340 --> 00:04:11,760 we do a unit on building a text-based 91 00:04:08,879 --> 00:04:14,819 chat bot in Python making use of some of 92 00:04:11,760 --> 00:04:16,280 the free Rock Resources so thank you for 93 00:04:14,819 --> 00:04:19,320 that 94 00:04:16,280 --> 00:04:21,900 in year 9 we introduce students to web 95 00:04:19,320 --> 00:04:24,600 development creating static websites in 96 00:04:21,900 --> 00:04:27,240 HTML and CSS about an artificial 97 00:04:24,600 --> 00:04:30,139 intelligence project that students can 98 00:04:27,240 --> 00:04:33,120 then submit to the Microsoft imagine cup 99 00:04:30,139 --> 00:04:35,520 we take students through design thinking 100 00:04:33,120 --> 00:04:38,340 process finding problems designing 101 00:04:35,520 --> 00:04:40,800 applications with users in mind we start 102 00:04:38,340 --> 00:04:42,840 to introduce databases and SQL doing 103 00:04:40,800 --> 00:04:44,820 some work around data security and 104 00:04:42,840 --> 00:04:46,500 privacy 105 00:04:44,820 --> 00:04:48,419 then in year 10 106 00:04:46,500 --> 00:04:49,979 we get a whole bunch of new students 107 00:04:48,419 --> 00:04:52,199 who've never done it again 108 00:04:49,979 --> 00:04:54,419 and we start with Game Dev to try and 109 00:04:52,199 --> 00:04:56,520 get them hooked we've been going with 110 00:04:54,419 --> 00:04:58,620 Godot lately which uses a language 111 00:04:56,520 --> 00:05:00,240 that's really similar to python but 112 00:04:58,620 --> 00:05:02,400 after this morning's talk maybe I'll 113 00:05:00,240 --> 00:05:04,680 consider pie game zero 114 00:05:02,400 --> 00:05:06,000 and we start to build on that SQL 115 00:05:04,680 --> 00:05:08,880 knowledge and get into physical 116 00:05:06,000 --> 00:05:11,160 Computing with Raspberry Pi's 117 00:05:08,880 --> 00:05:13,500 at the very end of the year we start to 118 00:05:11,160 --> 00:05:16,680 introduce web applications and apis 119 00:05:13,500 --> 00:05:19,440 building simple web apps that get data 120 00:05:16,680 --> 00:05:21,540 from space apis in Json and then display 121 00:05:19,440 --> 00:05:24,240 it on a website 122 00:05:21,540 --> 00:05:26,220 and in year 11 we officially start the 123 00:05:24,240 --> 00:05:28,560 senior subject which in Queensland is 124 00:05:26,220 --> 00:05:30,360 called digital Solutions the syllabus 125 00:05:28,560 --> 00:05:32,880 assumes that students have done digital 126 00:05:30,360 --> 00:05:34,139 tech only up until year eight so it 127 00:05:32,880 --> 00:05:36,780 starts right back at the beginning 128 00:05:34,139 --> 00:05:38,460 learning to code but we have such a 129 00:05:36,780 --> 00:05:39,960 short time frame to teach it that it 130 00:05:38,460 --> 00:05:41,400 ends up actually being quite challenging 131 00:05:39,960 --> 00:05:42,300 for those students who are new to the 132 00:05:41,400 --> 00:05:43,919 subject 133 00:05:42,300 --> 00:05:45,960 and an interesting Quirk of the 134 00:05:43,919 --> 00:05:48,120 Queensland syllabus is that it requires 135 00:05:45,960 --> 00:05:50,060 students to be creating user interfaces 136 00:05:48,120 --> 00:05:52,800 right from the start 137 00:05:50,060 --> 00:05:54,740 as we saw in the earlier talk about Pi 138 00:05:52,800 --> 00:05:58,199 game this is a big ask 139 00:05:54,740 --> 00:06:01,380 I've been using pi simple GUI it's a 140 00:05:58,199 --> 00:06:04,740 library that's basically a nicer version 141 00:06:01,380 --> 00:06:07,139 of TK enter But students get a bit 142 00:06:04,740 --> 00:06:09,900 frustrated with it so we get them into 143 00:06:07,139 --> 00:06:13,380 web applications combining python with 144 00:06:09,900 --> 00:06:15,720 HTML and SQL which we continue all the 145 00:06:13,380 --> 00:06:18,000 way until the end of year 12. 146 00:06:15,720 --> 00:06:19,440 so at every stage we get students 147 00:06:18,000 --> 00:06:21,479 joining the class who've never really 148 00:06:19,440 --> 00:06:23,639 programmed before along with students 149 00:06:21,479 --> 00:06:25,919 who've been doing it all along or as a 150 00:06:23,639 --> 00:06:28,020 hobby in their spare time so it's really 151 00:06:25,919 --> 00:06:29,819 challenging designing lessons that work 152 00:06:28,020 --> 00:06:33,080 with beginners but don't bore 153 00:06:29,819 --> 00:06:33,080 experienced students 154 00:06:33,600 --> 00:06:38,580 let's talk web apps I didn't touch web 155 00:06:36,360 --> 00:06:40,860 development at Uni or in my previous job 156 00:06:38,580 --> 00:06:43,620 as a junior developer but I did do a bit 157 00:06:40,860 --> 00:06:46,139 of HTML and CSS back in my Neopets and 158 00:06:43,620 --> 00:06:48,060 my space days but that was mainly 159 00:06:46,139 --> 00:06:50,400 copying other people's Styles rather 160 00:06:48,060 --> 00:06:53,520 than creating my own and it wasn't until 161 00:06:50,400 --> 00:06:56,699 I went to a Django girls Workshop in 162 00:06:53,520 --> 00:06:58,199 2015 when pycon was up in Brisbane that 163 00:06:56,699 --> 00:07:00,419 I was introduced to web applications 164 00:06:58,199 --> 00:07:01,560 websites with a back end that you could 165 00:07:00,419 --> 00:07:04,199 program 166 00:07:01,560 --> 00:07:06,300 but I found Django quite overwhelming to 167 00:07:04,199 --> 00:07:08,100 be honest and although I was able to 168 00:07:06,300 --> 00:07:12,020 copy the tutorial I didn't understand 169 00:07:08,100 --> 00:07:12,020 most of what I was writing 170 00:07:12,180 --> 00:07:16,259 but a few years later I became a teacher 171 00:07:14,160 --> 00:07:18,120 and when the New Queensland senior 172 00:07:16,259 --> 00:07:21,360 syllabus was released there was 173 00:07:18,120 --> 00:07:24,240 encouragement to use a web development 174 00:07:21,360 --> 00:07:26,520 context for at least one of the units so 175 00:07:24,240 --> 00:07:28,620 I looked to python for options 176 00:07:26,520 --> 00:07:30,960 I found that a lot of the full stack 177 00:07:28,620 --> 00:07:33,479 Frameworks like Django while obviously 178 00:07:30,960 --> 00:07:35,400 robust and fully featured were a bit too 179 00:07:33,479 --> 00:07:38,280 complex for my liking 180 00:07:35,400 --> 00:07:40,740 my students don't need an admin panel or 181 00:07:38,280 --> 00:07:43,620 to use a professional database server I 182 00:07:40,740 --> 00:07:46,500 needed them writing raw SQL not using an 183 00:07:43,620 --> 00:07:48,300 object relational model or orm that 184 00:07:46,500 --> 00:07:50,940 converts the data relationships into 185 00:07:48,300 --> 00:07:53,160 object-oriented classes and methods I 186 00:07:50,940 --> 00:07:55,440 didn't need all batteries included I 187 00:07:53,160 --> 00:07:57,479 just wanted something lightweight and 188 00:07:55,440 --> 00:07:59,280 easy to learn so that my students could 189 00:07:57,479 --> 00:08:00,180 create something amazing in just a few 190 00:07:59,280 --> 00:08:03,360 weeks 191 00:08:00,180 --> 00:08:06,780 like Jack said earlier I wanted minimal 192 00:08:03,360 --> 00:08:09,720 boilerplate or cruft 193 00:08:06,780 --> 00:08:12,180 so I turned to flask flask is a micro 194 00:08:09,720 --> 00:08:15,360 framework it has no database abstraction 195 00:08:12,180 --> 00:08:17,940 layer no inbuilt form validation and 196 00:08:15,360 --> 00:08:20,520 very minimal boilerplate code this on 197 00:08:17,940 --> 00:08:23,160 the screen is all you need to start a 198 00:08:20,520 --> 00:08:25,020 flask server and display a web page that 199 00:08:23,160 --> 00:08:27,900 says hello world 200 00:08:25,020 --> 00:08:30,660 in jetbrains annual python developer 201 00:08:27,900 --> 00:08:34,200 survey flask came in as the top web 202 00:08:30,660 --> 00:08:36,719 framework used with 41 of the vote 203 00:08:34,200 --> 00:08:40,080 and what really helped is I found this 204 00:08:36,719 --> 00:08:43,200 fantastic series of blog posts by Miguel 205 00:08:40,080 --> 00:08:45,660 grinberg called the flask Mega tutorial 206 00:08:43,200 --> 00:08:47,640 and I highly recommend these as a 207 00:08:45,660 --> 00:08:49,500 beginner project for a teacher to learn 208 00:08:47,640 --> 00:08:51,779 the basics of flask 209 00:08:49,500 --> 00:08:54,899 however it does have some downsides 210 00:08:51,779 --> 00:08:57,420 namely that he uses an orm called SQL 211 00:08:54,899 --> 00:09:01,160 Alchemy instead of the raw SQL which is 212 00:08:57,420 --> 00:09:01,160 what I need to assess my students on 213 00:09:01,260 --> 00:09:05,640 so to run a flask application you open a 214 00:09:03,660 --> 00:09:09,019 terminal navigate to the project folder 215 00:09:05,640 --> 00:09:09,019 and type flask run 216 00:09:10,080 --> 00:09:12,560 so 217 00:09:13,500 --> 00:09:19,200 from there I developed a template for a 218 00:09:16,680 --> 00:09:20,580 basic student flask project and today 219 00:09:19,200 --> 00:09:23,100 what I want to do 220 00:09:20,580 --> 00:09:24,899 is take you through this template and 221 00:09:23,100 --> 00:09:27,660 explain what you need to do to get 222 00:09:24,899 --> 00:09:29,580 started on your own flask projects and 223 00:09:27,660 --> 00:09:31,320 I'll show you some examples of student 224 00:09:29,580 --> 00:09:35,040 projects that we've done and cool 225 00:09:31,320 --> 00:09:37,920 libraries that we've combined with flask 226 00:09:35,040 --> 00:09:39,000 so this is a basic structure of a flask 227 00:09:37,920 --> 00:09:42,240 project 228 00:09:39,000 --> 00:09:43,800 inside our root directory we have the 229 00:09:42,240 --> 00:09:46,260 app folder 230 00:09:43,800 --> 00:09:48,779 now you don't need to call it app but 231 00:09:46,260 --> 00:09:51,240 every example online calls it app it's 232 00:09:48,779 --> 00:09:54,300 the default application name and it 233 00:09:51,240 --> 00:09:57,600 allows you to use the shortcut to make 234 00:09:54,300 --> 00:10:01,440 it just flask run when you run the app 235 00:09:57,600 --> 00:10:04,680 so I like to keep it as app 236 00:10:01,440 --> 00:10:07,560 inside app we have our static folder 237 00:10:04,680 --> 00:10:10,440 that contains any of the CSS and 238 00:10:07,560 --> 00:10:12,120 JavaScript files images videos any 239 00:10:10,440 --> 00:10:13,980 static content that we want to display 240 00:10:12,120 --> 00:10:16,380 on our page 241 00:10:13,980 --> 00:10:20,640 then we have the templates folder so 242 00:10:16,380 --> 00:10:22,320 templates flask looks for HTML pages in 243 00:10:20,640 --> 00:10:26,279 a folder called templates so it's 244 00:10:22,320 --> 00:10:28,200 important that it's named correctly 245 00:10:26,279 --> 00:10:32,100 so let's go through the actual python 246 00:10:28,200 --> 00:10:34,740 files we've got init.pi db.pi roots.pi 247 00:10:32,100 --> 00:10:36,959 and config.pi 248 00:10:34,740 --> 00:10:40,500 so what is init.pi 249 00:10:36,959 --> 00:10:45,060 I chose When developing this template to 250 00:10:40,500 --> 00:10:47,820 split the code up into init.pi and 251 00:10:45,060 --> 00:10:50,399 put all of basically the code that's 252 00:10:47,820 --> 00:10:52,200 necessary to get flask running but that 253 00:10:50,399 --> 00:10:54,600 students don't necessarily have to be 254 00:10:52,200 --> 00:10:57,200 able to write and understand so it 255 00:10:54,600 --> 00:10:59,640 initializes the flask app the database 256 00:10:57,200 --> 00:11:01,500 if you're using one and the login 257 00:10:59,640 --> 00:11:04,740 manager if you're dealing with user 258 00:11:01,500 --> 00:11:07,820 logins so that pretty much stays the 259 00:11:04,740 --> 00:11:07,820 same for every project 260 00:11:08,220 --> 00:11:13,740 then we've got DB dot Pi it's another 261 00:11:11,820 --> 00:11:15,899 file that students will use but not 262 00:11:13,740 --> 00:11:17,459 necessarily have to understand it 263 00:11:15,899 --> 00:11:19,920 defines all of the functions for 264 00:11:17,459 --> 00:11:22,380 creating a database from a schema.sql 265 00:11:19,920 --> 00:11:26,300 file and for connecting to and 266 00:11:22,380 --> 00:11:26,300 disconnecting from the database 267 00:11:27,720 --> 00:11:34,019 we've got config.pi which contains 268 00:11:31,380 --> 00:11:35,459 configure configuration options like the 269 00:11:34,019 --> 00:11:37,920 name of the database 270 00:11:35,459 --> 00:11:39,779 I also get students to put their school 271 00:11:37,920 --> 00:11:41,700 username and password there if we're 272 00:11:39,779 --> 00:11:43,860 working with apis and need to connect 273 00:11:41,700 --> 00:11:46,260 through the school proxy because that 274 00:11:43,860 --> 00:11:48,420 way they can keep that file secret out 275 00:11:46,260 --> 00:11:50,940 of any code repositories if they're 276 00:11:48,420 --> 00:11:52,440 using them and they don't need to 277 00:11:50,940 --> 00:11:54,860 include it in their assignment 278 00:11:52,440 --> 00:11:54,860 submission 279 00:11:55,079 --> 00:12:00,060 the last thing we have is rootstop high 280 00:11:58,079 --> 00:12:02,940 that's the meat of the program where 281 00:12:00,060 --> 00:12:05,399 students will be writing all of the 282 00:12:02,940 --> 00:12:07,860 Python code 283 00:12:05,399 --> 00:12:10,440 so what goes in Roots well if we look at 284 00:12:07,860 --> 00:12:13,200 a structure of a URL we start with the 285 00:12:10,440 --> 00:12:16,140 protocol then the domain and then the 286 00:12:13,200 --> 00:12:20,540 individual paths so these paths are what 287 00:12:16,140 --> 00:12:20,540 we Define in our rootstop PI file 288 00:12:21,120 --> 00:12:26,279 to define a root you can see I've got 289 00:12:23,399 --> 00:12:29,459 some code here we use The app.root 290 00:12:26,279 --> 00:12:31,980 Decorator and then we list the root so 291 00:12:29,459 --> 00:12:34,500 you can see this first one is just slash 292 00:12:31,980 --> 00:12:37,560 so it's basically the home page and then 293 00:12:34,500 --> 00:12:40,380 I've got a further page that is slash 294 00:12:37,560 --> 00:12:43,680 test so if you went to your website 295 00:12:40,380 --> 00:12:48,720 slash test it would deliver 296 00:12:43,680 --> 00:12:51,300 the code that's under that decorator 297 00:12:48,720 --> 00:12:53,519 so once you get into more complex 298 00:12:51,300 --> 00:12:56,220 applications you can use variables 299 00:12:53,519 --> 00:12:57,779 Within These path names but to be honest 300 00:12:56,220 --> 00:13:00,959 I haven't had to teach that for any of 301 00:12:57,779 --> 00:13:04,200 the assessment I've given so far so just 302 00:13:00,959 --> 00:13:05,279 having those simple routes it has been 303 00:13:04,200 --> 00:13:07,500 enough 304 00:13:05,279 --> 00:13:09,779 but I have found that if you use 305 00:13:07,500 --> 00:13:11,820 something like you know when you're 306 00:13:09,779 --> 00:13:13,680 teaching slash test then in the 307 00:13:11,820 --> 00:13:16,260 assignment everyone will just use slash 308 00:13:13,680 --> 00:13:19,760 test even though it doesn't make sense 309 00:13:16,260 --> 00:13:19,760 to the context of their assessment 310 00:13:20,639 --> 00:13:25,920 so here we see the typical flow of code 311 00:13:22,740 --> 00:13:28,560 you create a route that renders an HTML 312 00:13:25,920 --> 00:13:30,980 page in this example I'm rendering 313 00:13:28,560 --> 00:13:34,980 index.html 314 00:13:30,980 --> 00:13:38,279 which inherits from base.html so this 315 00:13:34,980 --> 00:13:42,060 ability to inherit from a template so to 316 00:13:38,279 --> 00:13:44,399 put you know all of your base code and 317 00:13:42,060 --> 00:13:46,500 then have different pages that inherit 318 00:13:44,399 --> 00:13:48,779 from that is through a library called 319 00:13:46,500 --> 00:13:52,139 ginger that comes pre-built with flask 320 00:13:48,779 --> 00:13:54,540 it allows you to do things like Define a 321 00:13:52,139 --> 00:13:56,279 HTML page that's just for the footer or 322 00:13:54,540 --> 00:14:01,320 for the navbar and then you can insert 323 00:13:56,279 --> 00:14:03,420 that into your different pages but to be 324 00:14:01,320 --> 00:14:04,740 honest after reflection I think it's a 325 00:14:03,420 --> 00:14:06,899 bit too much for students they don't 326 00:14:04,740 --> 00:14:08,700 tend to understand what we're doing with 327 00:14:06,899 --> 00:14:12,000 the templates so I think I might remove 328 00:14:08,700 --> 00:14:16,019 that in my next version of the template 329 00:14:12,000 --> 00:14:18,839 but Ginger is useful for other things it 330 00:14:16,019 --> 00:14:21,420 allows us to insert variables from our 331 00:14:18,839 --> 00:14:23,160 rootstop PI file and also do a bit of 332 00:14:21,420 --> 00:14:26,459 code 333 00:14:23,160 --> 00:14:28,920 so here you can see oh it can do things 334 00:14:26,459 --> 00:14:31,620 like FL statements and for loops and the 335 00:14:28,920 --> 00:14:33,480 syntax is very similar to python 336 00:14:31,620 --> 00:14:36,540 so you can see here 337 00:14:33,480 --> 00:14:38,700 I've got a list of indicators it's a 338 00:14:36,540 --> 00:14:40,800 variable called indicators and I'm 339 00:14:38,700 --> 00:14:42,899 looping through it for each indicator 340 00:14:40,800 --> 00:14:45,600 code in indicators 341 00:14:42,899 --> 00:14:47,820 and then I'm creating a drop down menu 342 00:14:45,600 --> 00:14:49,740 that's a the select and the different 343 00:14:47,820 --> 00:14:52,500 options of the options in my drop down 344 00:14:49,740 --> 00:14:54,660 and the value of that is going to be 345 00:14:52,500 --> 00:14:58,019 that indicator code 346 00:14:54,660 --> 00:15:00,959 and I'm also as the text that will 347 00:14:58,019 --> 00:15:03,360 appear I'm inserting a variable with 348 00:15:00,959 --> 00:15:05,760 those double curly brackets and 349 00:15:03,360 --> 00:15:07,740 accessing a particular index of a list 350 00:15:05,760 --> 00:15:10,320 using the square bracket notation just 351 00:15:07,740 --> 00:15:14,720 like you do in Python and this all comes 352 00:15:10,320 --> 00:15:14,720 pre-installed when you get flask 353 00:15:19,880 --> 00:15:25,860 so then we deal with databases so to 354 00:15:23,339 --> 00:15:28,560 create a database of your own you can 355 00:15:25,860 --> 00:15:32,480 Define the create table statements using 356 00:15:28,560 --> 00:15:38,000 standard SQL in a schema document 357 00:15:32,480 --> 00:15:40,620 the default database language is sqlite 358 00:15:38,000 --> 00:15:42,779 the upside to this is that it's a very 359 00:15:40,620 --> 00:15:45,000 easy version of SQL to learn there are 360 00:15:42,779 --> 00:15:46,639 only like five data types and there's no 361 00:15:45,000 --> 00:15:49,620 crazy functions 362 00:15:46,639 --> 00:15:51,360 the downside is that it doesn't deal 363 00:15:49,620 --> 00:15:53,279 well with making changes to your 364 00:15:51,360 --> 00:15:55,920 database structure it's almost always 365 00:15:53,279 --> 00:15:57,540 easiest to just delete your database and 366 00:15:55,920 --> 00:15:58,920 recreate it when you're working with 367 00:15:57,540 --> 00:16:02,880 student projects 368 00:15:58,920 --> 00:16:06,779 of course if you're working so if you 369 00:16:02,880 --> 00:16:09,959 type in flask init.db then it will 370 00:16:06,779 --> 00:16:12,180 initialize the database it will um 371 00:16:09,959 --> 00:16:14,459 create a new database according to that 372 00:16:12,180 --> 00:16:16,620 schema with whatever name you've chosen 373 00:16:14,459 --> 00:16:18,420 in your config file 374 00:16:16,620 --> 00:16:20,880 and of course if you're working with a 375 00:16:18,420 --> 00:16:23,160 pre-existing database you can just skip 376 00:16:20,880 --> 00:16:25,380 this place the database into your root 377 00:16:23,160 --> 00:16:28,100 directory and not bother with a with a 378 00:16:25,380 --> 00:16:28,100 schema document 379 00:16:28,500 --> 00:16:34,860 so how do we interact with databases 380 00:16:30,779 --> 00:16:37,199 well you can see here at the top with my 381 00:16:34,860 --> 00:16:40,579 import statements I'm importing from 382 00:16:37,199 --> 00:16:44,880 app.db that was that 383 00:16:40,579 --> 00:16:47,699 db.pi file that we had back in our 384 00:16:44,880 --> 00:16:52,259 app folder and it has a function called 385 00:16:47,699 --> 00:16:54,420 getdb which gets the database so you can 386 00:16:52,259 --> 00:16:56,459 see I'm calling that function I'm 387 00:16:54,420 --> 00:16:58,199 setting it equal to a variable that I'm 388 00:16:56,459 --> 00:16:58,860 just going to call DB 389 00:16:58,199 --> 00:17:01,079 um 390 00:16:58,860 --> 00:17:03,839 for Simplicity 391 00:17:01,079 --> 00:17:06,240 and then going to execute an SQL 392 00:17:03,839 --> 00:17:08,339 statement select all from category 393 00:17:06,240 --> 00:17:11,579 and then I'm going to fetch all of the 394 00:17:08,339 --> 00:17:14,280 results you can either fetch one result 395 00:17:11,579 --> 00:17:17,040 which is basically select all from 396 00:17:14,280 --> 00:17:18,240 category limit one or you can fetch all 397 00:17:17,040 --> 00:17:21,540 of the results 398 00:17:18,240 --> 00:17:23,520 and I'm saving that in 399 00:17:21,540 --> 00:17:25,679 a results variable 400 00:17:23,520 --> 00:17:30,440 and then I'm closing the database and 401 00:17:25,679 --> 00:17:34,200 I'm passing that results into my 402 00:17:30,440 --> 00:17:38,880 categories.html web page so it's really 403 00:17:34,200 --> 00:17:43,500 easy to pass variables from 404 00:17:38,880 --> 00:17:46,919 rootstop Pi into our HTML Pages through 405 00:17:43,500 --> 00:17:50,220 Ginger it um we sorry and then we can 406 00:17:46,919 --> 00:17:54,679 refer to it using Ginger so we just put 407 00:17:50,220 --> 00:17:54,679 those results into the HTML page 408 00:17:55,799 --> 00:18:02,220 and we can also use variables in 409 00:18:00,179 --> 00:18:04,980 so in this example 410 00:18:02,220 --> 00:18:06,660 I'm getting the country code from an 411 00:18:04,980 --> 00:18:09,419 HTML form 412 00:18:06,660 --> 00:18:13,080 so how do I do that at the top of my 413 00:18:09,419 --> 00:18:14,700 route where I've defined the path I've 414 00:18:13,080 --> 00:18:17,580 said that the methods that are allowed 415 00:18:14,700 --> 00:18:20,039 are get and post so the default is just 416 00:18:17,580 --> 00:18:21,840 get is allowed and if you don't say that 417 00:18:20,039 --> 00:18:24,120 you can do Post requests you'll get a 418 00:18:21,840 --> 00:18:26,520 forbidden error 419 00:18:24,120 --> 00:18:28,380 and because I'm using this same route to 420 00:18:26,520 --> 00:18:30,900 both display the form 421 00:18:28,380 --> 00:18:33,059 and display the output which in this 422 00:18:30,900 --> 00:18:34,280 case happens to be is going to be a 423 00:18:33,059 --> 00:18:37,320 graph 424 00:18:34,280 --> 00:18:40,500 I have an IFL statement that checks 425 00:18:37,320 --> 00:18:42,000 whether the user has done a post request 426 00:18:40,500 --> 00:18:43,860 whether they have picked a country in 427 00:18:42,000 --> 00:18:46,080 the form or else it just sets it to a 428 00:18:43,860 --> 00:18:48,660 default of Australia 429 00:18:46,080 --> 00:18:50,880 and what's cool is it then it's then 430 00:18:48,660 --> 00:18:52,919 going to take that country variable and 431 00:18:50,880 --> 00:18:55,380 it's going to insert it into the SQL 432 00:18:52,919 --> 00:18:57,539 statement using a question mark so you 433 00:18:55,380 --> 00:18:59,580 can see in my SQL at the end of the line 434 00:18:57,539 --> 00:19:02,340 I've got and country code equals 435 00:18:59,580 --> 00:19:04,200 question mark and then when I execute 436 00:19:02,340 --> 00:19:06,419 the statement I'm going to say I'm going 437 00:19:04,200 --> 00:19:08,700 to execute that SQL statement and I'm 438 00:19:06,419 --> 00:19:11,240 going to pass in country 439 00:19:08,700 --> 00:19:13,740 as the variable 440 00:19:11,240 --> 00:19:16,140 so you can have multiple question marks 441 00:19:13,740 --> 00:19:17,820 as well and then instead of just country 442 00:19:16,140 --> 00:19:19,380 it would be country comma and then 443 00:19:17,820 --> 00:19:21,299 whatever other variables you want to 444 00:19:19,380 --> 00:19:23,160 insert in the same order that the 445 00:19:21,299 --> 00:19:25,620 question marks are in 446 00:19:23,160 --> 00:19:27,660 it has to be a tuple which means that 447 00:19:25,620 --> 00:19:30,240 it's kind of weird if you have just one 448 00:19:27,660 --> 00:19:32,760 variable you have to put a comma after 449 00:19:30,240 --> 00:19:34,860 the word country that's the thing that 450 00:19:32,760 --> 00:19:37,679 always trips up students 451 00:19:34,860 --> 00:19:39,660 and this method of inserting variables 452 00:19:37,679 --> 00:19:43,440 rather than just doing country code 453 00:19:39,660 --> 00:19:45,900 equals and then plus country this method 454 00:19:43,440 --> 00:19:47,400 protects against SQL injections which is 455 00:19:45,900 --> 00:19:48,720 always a nice thing for my students to 456 00:19:47,400 --> 00:19:50,640 be able to write about in their 457 00:19:48,720 --> 00:19:54,260 evaluation of the security of the system 458 00:19:50,640 --> 00:19:54,260 like they have to do in year 12. 459 00:19:54,780 --> 00:20:00,860 of course you don't just have to query 460 00:19:57,360 --> 00:20:02,820 databases you can also insert new values 461 00:20:00,860 --> 00:20:05,340 if you 462 00:20:02,820 --> 00:20:07,919 after you execute the SQL statement with 463 00:20:05,340 --> 00:20:10,679 the insert you just then need to commit 464 00:20:07,919 --> 00:20:14,460 those changes 465 00:20:10,679 --> 00:20:17,700 so let's look at some fun libraries 466 00:20:14,460 --> 00:20:18,799 that I have used with flask in the last 467 00:20:17,700 --> 00:20:21,600 couple of years 468 00:20:18,799 --> 00:20:26,240 we've used plotly for making beautiful 469 00:20:21,600 --> 00:20:29,820 graphs requests for doing API requests 470 00:20:26,240 --> 00:20:32,520 flask login for building login systems 471 00:20:29,820 --> 00:20:34,940 authentication systems and cryptography 472 00:20:32,520 --> 00:20:34,940 as well 473 00:20:35,280 --> 00:20:41,820 so this term my year 11s did a project 474 00:20:38,280 --> 00:20:43,220 using an existing database from the 475 00:20:41,820 --> 00:20:49,559 world bank 476 00:20:43,220 --> 00:20:51,900 so I went and pulled CSV files that were 477 00:20:49,559 --> 00:20:55,280 on the World Bank website that collect 478 00:20:51,900 --> 00:20:58,320 data about every country in the world 479 00:20:55,280 --> 00:21:01,559 with all these indicators across you 480 00:20:58,320 --> 00:21:02,960 know social education governance really 481 00:21:01,559 --> 00:21:07,200 interesting stuff 482 00:21:02,960 --> 00:21:11,100 and I put them into an sqlite normalized 483 00:21:07,200 --> 00:21:14,760 database relational database and their 484 00:21:11,100 --> 00:21:16,740 task was to turn data into wisdom so 485 00:21:14,760 --> 00:21:18,240 they had to search the database to find 486 00:21:16,740 --> 00:21:20,039 something that they were interested in 487 00:21:18,240 --> 00:21:23,039 we've got some really 488 00:21:20,039 --> 00:21:27,059 um some really interesting student ideas 489 00:21:23,039 --> 00:21:29,940 like looking at various indicators for 490 00:21:27,059 --> 00:21:34,559 countries before and after there had 491 00:21:29,940 --> 00:21:37,020 been Civil Wars or looking at Country at 492 00:21:34,559 --> 00:21:40,799 all the indicators is that were around 493 00:21:37,020 --> 00:21:44,220 women and what that looked like in in 494 00:21:40,799 --> 00:21:48,059 different different parts of the world 495 00:21:44,220 --> 00:21:49,080 so students used HTML forms to get user 496 00:21:48,059 --> 00:21:51,539 input 497 00:21:49,080 --> 00:21:53,659 they inserted it into an SQL statement 498 00:21:51,539 --> 00:21:56,760 and they graphed the results 499 00:21:53,659 --> 00:21:58,260 using plotly and this was displayed on 500 00:21:56,760 --> 00:22:00,000 the web page 501 00:21:58,260 --> 00:22:02,340 so what is the code for something like 502 00:22:00,000 --> 00:22:05,100 this look like 503 00:22:02,340 --> 00:22:06,500 this is a slightly smaller example 504 00:22:05,100 --> 00:22:10,679 because I couldn't fit it on the screen 505 00:22:06,500 --> 00:22:12,740 but this was a student who was creating 506 00:22:10,679 --> 00:22:17,580 a map 507 00:22:12,740 --> 00:22:21,620 so they had this great big SQL statement 508 00:22:17,580 --> 00:22:25,980 joining tables multiple where statements 509 00:22:21,620 --> 00:22:30,480 and they executed the SQL statement and 510 00:22:25,980 --> 00:22:33,299 then loaded it into a pandas data frame 511 00:22:30,480 --> 00:22:36,780 which basically all you're doing is 512 00:22:33,299 --> 00:22:38,159 putting in the results and then saying 513 00:22:36,780 --> 00:22:39,539 what you want the different columns to 514 00:22:38,159 --> 00:22:42,960 be called 515 00:22:39,539 --> 00:22:46,980 and then creating this graph so this one 516 00:22:42,960 --> 00:22:51,120 was PX dot coreopliff it's a type of map 517 00:22:46,980 --> 00:22:52,799 graph but you can you know if you wanted 518 00:22:51,120 --> 00:22:55,559 to make it a line graph you would just 519 00:22:52,799 --> 00:22:58,799 change it to px.line if you wanted it to 520 00:22:55,559 --> 00:23:01,740 be a bar graph PX dot bar and then you 521 00:22:58,799 --> 00:23:05,640 put that data frame into the function 522 00:23:01,740 --> 00:23:07,500 and you say what you want some of the um 523 00:23:05,640 --> 00:23:09,240 variables to be so if you're looking at 524 00:23:07,500 --> 00:23:12,480 a line graph it might be what do you 525 00:23:09,240 --> 00:23:14,820 want the X and Y axis to be in this case 526 00:23:12,480 --> 00:23:16,919 because it's a map I wanted the 527 00:23:14,820 --> 00:23:18,780 locations to be the country codes 528 00:23:16,919 --> 00:23:20,280 because it turns out 529 00:23:18,780 --> 00:23:23,000 um just putting in the country codes 530 00:23:20,280 --> 00:23:25,919 that were in the World Bank database 531 00:23:23,000 --> 00:23:27,900 works perfectly with the plotly map so 532 00:23:25,919 --> 00:23:29,820 they could actually generate maps of the 533 00:23:27,900 --> 00:23:30,480 world colored 534 00:23:29,820 --> 00:23:34,140 um 535 00:23:30,480 --> 00:23:36,000 with the different values for this life 536 00:23:34,140 --> 00:23:36,900 expectancy 537 00:23:36,000 --> 00:23:39,440 um 538 00:23:36,900 --> 00:23:43,559 statement which was quite cool 539 00:23:39,440 --> 00:23:46,440 then it does it just a little line of 540 00:23:43,559 --> 00:23:49,559 code to turn it into a Json object which 541 00:23:46,440 --> 00:23:51,179 you pass into your HTML page and then a 542 00:23:49,559 --> 00:23:54,980 little bit of code a little bit of 543 00:23:51,179 --> 00:23:59,000 JavaScript just a few lines that then 544 00:23:54,980 --> 00:23:59,000 graphs it on the page 545 00:24:00,000 --> 00:24:03,539 here's another project we did a year 12 546 00:24:01,799 --> 00:24:05,820 project from last year a mock 547 00:24:03,539 --> 00:24:07,919 application for an industrial Warehouse 548 00:24:05,820 --> 00:24:10,380 that needed to keep its workers working 549 00:24:07,919 --> 00:24:12,299 in safe temperatures so students 550 00:24:10,380 --> 00:24:14,760 attached a temperature and humidity 551 00:24:12,299 --> 00:24:17,039 sensor to an Arduino and then output the 552 00:24:14,760 --> 00:24:19,440 results as a Json object that got read 553 00:24:17,039 --> 00:24:21,659 by a Python program and put into a 554 00:24:19,440 --> 00:24:24,120 database and then they created a web 555 00:24:21,659 --> 00:24:25,860 application using flask that read the 556 00:24:24,120 --> 00:24:28,200 most current temperature results from 557 00:24:25,860 --> 00:24:31,740 the database along with the temperature 558 00:24:28,200 --> 00:24:34,140 from a bureau of meteorology API for 559 00:24:31,740 --> 00:24:36,480 external temperature and then it changed 560 00:24:34,140 --> 00:24:38,940 the user interface to an alert if the 561 00:24:36,480 --> 00:24:40,039 internal or external temperature was too 562 00:24:38,940 --> 00:24:43,260 high 563 00:24:40,039 --> 00:24:45,360 students created also created a page in 564 00:24:43,260 --> 00:24:48,679 which users could change what that 565 00:24:45,360 --> 00:24:48,679 safety threshold was 566 00:24:49,320 --> 00:24:56,159 so we used the requests Library here you 567 00:24:53,700 --> 00:24:57,419 can see I have my 568 00:24:56,159 --> 00:25:01,440 um 569 00:24:57,419 --> 00:25:04,740 requesting my URL for the Bureau of 570 00:25:01,440 --> 00:25:07,580 meteorology API which they don't want us 571 00:25:04,740 --> 00:25:10,760 to use but it's really cool 572 00:25:07,580 --> 00:25:14,039 and then I'm doing a get request 573 00:25:10,760 --> 00:25:15,900 and I had to put in proxy information 574 00:25:14,039 --> 00:25:19,020 because we're behind a school proxy and 575 00:25:15,900 --> 00:25:20,820 then loading it into a Json file 576 00:25:19,020 --> 00:25:23,100 another project we did was around 577 00:25:20,820 --> 00:25:25,260 security creating a sign up and login 578 00:25:23,100 --> 00:25:27,720 page and then hiding certain information 579 00:25:25,260 --> 00:25:30,120 behind a login so the context for this 580 00:25:27,720 --> 00:25:31,679 one was the Australian Defense Force for 581 00:25:30,120 --> 00:25:34,140 storing data about how many military 582 00:25:31,679 --> 00:25:36,840 personnel they had in each City and the 583 00:25:34,140 --> 00:25:39,000 city data came from an API and then the 584 00:25:36,840 --> 00:25:40,980 military data was entered by users and 585 00:25:39,000 --> 00:25:44,940 encrypted in the database 586 00:25:40,980 --> 00:25:46,580 so we used the flask login library to do 587 00:25:44,940 --> 00:25:50,159 things like 588 00:25:46,580 --> 00:25:54,240 you know create 589 00:25:50,159 --> 00:25:58,860 safe logins and we use the cryptography 590 00:25:54,240 --> 00:26:02,159 library to encrypt things as well 591 00:25:58,860 --> 00:26:04,919 so basic unit structure of how I teach 592 00:26:02,159 --> 00:26:07,980 flask it is assuming that basic 593 00:26:04,919 --> 00:26:10,919 knowledge of python we go databases and 594 00:26:07,980 --> 00:26:13,679 SQL then intro to flask getting it all 595 00:26:10,919 --> 00:26:15,799 working creating a basic route intro to 596 00:26:13,679 --> 00:26:18,900 HTML and CSS 597 00:26:15,799 --> 00:26:20,700 then combining flask and HTML putting 598 00:26:18,900 --> 00:26:24,419 variables in combining with the 599 00:26:20,700 --> 00:26:27,659 databases and then doing user input 600 00:26:24,419 --> 00:26:30,480 so this is my information GitHub 601 00:26:27,659 --> 00:26:32,220 currently has that base template if 602 00:26:30,480 --> 00:26:35,340 that's something you're interested in 603 00:26:32,220 --> 00:26:37,500 and I'm also working on committing some 604 00:26:35,340 --> 00:26:40,740 sample projects using those different 605 00:26:37,500 --> 00:26:44,240 libraries as well 606 00:26:40,740 --> 00:26:44,240 and that's me thank you 607 00:26:47,460 --> 00:26:52,620 thank you so much Thea here is your 608 00:26:49,380 --> 00:26:55,860 little cup and your uh thank you card 609 00:26:52,620 --> 00:26:59,720 um and so uh I think that was amazing do 610 00:26:55,860 --> 00:26:59,720 we have any questions in the audience 611 00:27:00,419 --> 00:27:02,960 yes 612 00:27:04,620 --> 00:27:08,580 so how have you gone with on 613 00:27:06,900 --> 00:27:11,220 um with students understanding 614 00:27:08,580 --> 00:27:13,380 cryptography the library and also 615 00:27:11,220 --> 00:27:15,620 cryptography as in what it's actually 616 00:27:13,380 --> 00:27:15,620 doing 617 00:27:15,960 --> 00:27:22,679 is a it's in the syllabus as in the year 618 00:27:20,400 --> 00:27:26,640 12 senior syllabus 619 00:27:22,679 --> 00:27:29,340 um starting with you know um Caesar 620 00:27:26,640 --> 00:27:31,500 Cipher and going up to kind of more 621 00:27:29,340 --> 00:27:34,860 modern cryptography things we really 622 00:27:31,500 --> 00:27:38,159 just use the function 623 00:27:34,860 --> 00:27:40,320 in the cryptography Library dot encrypt 624 00:27:38,159 --> 00:27:42,419 and we don't really get into the 625 00:27:40,320 --> 00:27:45,960 specifics of how that particular Crypt 626 00:27:42,419 --> 00:27:48,120 cryptography method is using and same 627 00:27:45,960 --> 00:27:50,400 with with the logins with hashing 628 00:27:48,120 --> 00:27:52,580 passwords there's just a function 629 00:27:50,400 --> 00:27:56,340 generate password hash 630 00:27:52,580 --> 00:27:58,919 and same for checking password hashes as 631 00:27:56,340 --> 00:28:00,900 well that we use so we don't get into 632 00:27:58,919 --> 00:28:02,900 the nitty-gritty of how the cryptography 633 00:28:00,900 --> 00:28:05,100 Library works but we do talk about 634 00:28:02,900 --> 00:28:07,200 cryptography different cryptographic 635 00:28:05,100 --> 00:28:09,740 algorithms a little bit of a theory 636 00:28:07,200 --> 00:28:09,740 behind it 637 00:28:16,020 --> 00:28:18,260 foreign 638 00:28:20,179 --> 00:28:24,539 I suppose it's a question about how do 639 00:28:22,380 --> 00:28:26,940 you teach uh SQL 640 00:28:24,539 --> 00:28:29,640 um how you introduce it to students and 641 00:28:26,940 --> 00:28:31,799 uh I'm guessing you're using vs code 642 00:28:29,640 --> 00:28:33,960 have you experimented with ways of 643 00:28:31,799 --> 00:28:35,880 highlighting Syntax for SQL because I 644 00:28:33,960 --> 00:28:38,460 find that just 645 00:28:35,880 --> 00:28:42,059 the red string and the error messages 646 00:28:38,460 --> 00:28:44,340 are not super helpful quite often yes so 647 00:28:42,059 --> 00:28:46,140 I actually don't use Visual Studio code 648 00:28:44,340 --> 00:28:48,900 I just used it because it was pretty for 649 00:28:46,140 --> 00:28:50,700 this I use pycharm just because it makes 650 00:28:48,900 --> 00:28:53,880 it really easy to install python 651 00:28:50,700 --> 00:28:57,840 libraries behind a school proxy the way 652 00:28:53,880 --> 00:28:59,820 I teach SQL uh 653 00:28:57,840 --> 00:29:03,419 I don't 654 00:28:59,820 --> 00:29:07,860 I do it separately through a GUI at the 655 00:29:03,419 --> 00:29:11,240 start I use DB browser for sqlite and 656 00:29:07,860 --> 00:29:14,460 there are some really good resources 657 00:29:11,240 --> 00:29:15,980 SQL bolt has really good 658 00:29:14,460 --> 00:29:19,140 um 659 00:29:15,980 --> 00:29:21,740 lessons for for practicing and teaching 660 00:29:19,140 --> 00:29:21,740 SQL 661 00:29:21,840 --> 00:29:27,620 yeah I I guess it's hard to explain how 662 00:29:25,080 --> 00:29:27,620 you teach something 663 00:29:27,960 --> 00:29:32,340 yeah I have 664 00:29:29,340 --> 00:29:33,899 steps I mean students have kind of most 665 00:29:32,340 --> 00:29:35,880 of them have done a little bit in year 666 00:29:33,899 --> 00:29:37,320 nine a little bit in year 10 and so by 667 00:29:35,880 --> 00:29:39,419 the time 668 00:29:37,320 --> 00:29:42,360 um you know they're kind of repeating it 669 00:29:39,419 --> 00:29:44,640 and you know SQL is very 670 00:29:42,360 --> 00:29:48,080 does what it says it's very English 671 00:29:44,640 --> 00:29:48,080 friendly I think 672 00:29:52,080 --> 00:29:58,220 yes yes yes I do SQL by itself and then 673 00:29:56,820 --> 00:30:01,860 we jump into 674 00:29:58,220 --> 00:30:04,580 SQL plus python yeah 675 00:30:01,860 --> 00:30:04,580 good question 676 00:30:07,980 --> 00:30:13,340 just still on SQL you were talking about 677 00:30:10,679 --> 00:30:16,860 um not just minimum minimal data types 678 00:30:13,340 --> 00:30:18,960 are objects supported can they put have 679 00:30:16,860 --> 00:30:22,860 a database for images 680 00:30:18,960 --> 00:30:24,779 uh yes you can put blobs 681 00:30:22,860 --> 00:30:27,320 I think is the data type they call it 682 00:30:24,779 --> 00:30:27,320 yeah 683 00:30:33,790 --> 00:30:38,810 [Laughter]