From 9618b34ca42d92be6f05a4539ed97f0ded0ff7f1 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 23 Mar 2018 15:03:10 -0700 Subject: [PATCH 01/76] Update README.md --- days/25-27-error-handling/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/days/25-27-error-handling/README.md b/days/25-27-error-handling/README.md index cebe4ebc..0b733465 100644 --- a/days/25-27-error-handling/README.md +++ b/days/25-27-error-handling/README.md @@ -1,6 +1,6 @@ # Days 25-27 Error handling -One of the key differentiators of professional programs and scripts thrown together by beginners is pro app does not crash. It anticipates all the error conditions and puts the proper error handling and user feedback to keep working. +One of the key differentiators of professional programs and scripts thrown together by beginners is that the pro app does not crash. It anticipates all the error conditions and puts the proper error handling and user feedback to keep working. Ok, pro apps still crash, but they do so much less often. When they do, we have [logging](https://logbook.readthedocs.io) and other error monitoring such as [Rollbar](https://rollbar.com/?dr) so that we can get notified and fix these once we encounter them. This allows apps to grow stronger and more resilient over time. From 3bedaa9a9fa3572b5a8a4493028efdcbc79d057a Mon Sep 17 00:00:00 2001 From: bbelderbos Date: Fri, 30 Mar 2018 18:23:56 +0200 Subject: [PATCH 02/76] add encoding='utf-8' to open csv file (issue 3) --- days/04-06-collections/collections.ipynb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/days/04-06-collections/collections.ipynb b/days/04-06-collections/collections.ipynb index 2a4fc224..6d76035f 100644 --- a/days/04-06-collections/collections.ipynb +++ b/days/04-06-collections/collections.ipynb @@ -648,7 +648,7 @@ " \"\"\"Extracts all movies from csv and stores them in a dictionary\n", " where keys are directors, and values is a list of movies (named tuples)\"\"\"\n", " directors = defaultdict(list)\n", - " with open(data) as f:\n", + " with open(data, encoding='utf-8') as f:\n", " for line in csv.DictReader(f):\n", " try:\n", " director = line['director_name']\n", From ab5aa407bb24519eeae6a67b272497a25f1f3f07 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Tue, 3 Apr 2018 21:43:36 -0700 Subject: [PATCH 03/76] Chapter 1 transcripts. --- .../01a-what-is-100days_transcript_final.txt | 65 +++++ .../01b-rules-of-100days_transcript_final.txt | 28 ++ ...what-well-cover-short_transcript_final.txt | 81 ++++++ .../03-why-python_transcript_final.txt | 49 ++++ .../04-course-flow_transcript_final.txt | 37 +++ .../05-meet-instructors_transcript_final.txt | 42 +++ .../06-python-primer_transcript_final.txt | 18 ++ .../00-intro/07-source_transcript_final.txt | 54 ++++ .../00-intro/08-3-devs_transcript_final.txt | 47 ++++ .../09-julian-setup_transcript_final.txt | 59 +++++ .../10-bob-setup_transcript_final.txt | 84 ++++++ ...0days-marketing-video_transcript_final.txt | 243 ++++++++++++++++++ .../11-michael-setup_transcript_final.txt | 70 +++++ .../00-intro/12-platform_transcript_final.txt | 82 ++++++ 14 files changed, 959 insertions(+) create mode 100755 transcripts/00-intro/01a-what-is-100days_transcript_final.txt create mode 100755 transcripts/00-intro/01b-rules-of-100days_transcript_final.txt create mode 100755 transcripts/00-intro/02-what-well-cover-short_transcript_final.txt create mode 100755 transcripts/00-intro/03-why-python_transcript_final.txt create mode 100755 transcripts/00-intro/04-course-flow_transcript_final.txt create mode 100755 transcripts/00-intro/05-meet-instructors_transcript_final.txt create mode 100755 transcripts/00-intro/06-python-primer_transcript_final.txt create mode 100755 transcripts/00-intro/07-source_transcript_final.txt create mode 100755 transcripts/00-intro/08-3-devs_transcript_final.txt create mode 100755 transcripts/00-intro/09-julian-setup_transcript_final.txt create mode 100755 transcripts/00-intro/10-bob-setup_transcript_final.txt create mode 100755 transcripts/00-intro/100days-marketing-video_transcript_final.txt create mode 100755 transcripts/00-intro/11-michael-setup_transcript_final.txt create mode 100755 transcripts/00-intro/12-platform_transcript_final.txt diff --git a/transcripts/00-intro/01a-what-is-100days_transcript_final.txt b/transcripts/00-intro/01a-what-is-100days_transcript_final.txt new file mode 100755 index 00000000..3d89a51e --- /dev/null +++ b/transcripts/00-intro/01a-what-is-100days_transcript_final.txt @@ -0,0 +1,65 @@ +00:00 Hello, and welcome to 100 Days of Code +00:02 in Python, written by Bob Belderbos, +00:05 Julian Sequeira, and myself, Michael Kennedy. +00:11 Maybe you're wondering what is this #100DaysOfCode. +00:15 You've probably seen it all over social media. +00:17 In fact, it's really, really taken off +00:19 and people are finding this concept of +00:21 100 days of code really powerful +00:24 for getting them to focus over a long time +00:26 to actually get over the hump, +00:28 and become capable developers, +00:30 or maybe learn a new language, like, say, Python. +00:33 Here's an example of what you might see on Twitter. +00:35 Rene Sanchez says, "Day 11. #100DaysOfCode progress. +00:39 Today I worked some more on bite 18. +00:42 Find the most common word from codechalleng.es/bites." +00:46 This code challenge platform they're referring to +00:48 is actually from your co-authors, Bob and Julian. +00:51 We'll talk more about that later. +00:52 Here's another Tweet: "Day Five of 100. +00:55 Did some short exercises about modules. +00:57 Imported modules, did a couple of my own. +00:59 Tomorrow IO. #100DaysOfCode #Python." +01:03 Way to go, Bricks. +01:04 Here we have "Round one, day 101. +01:07 Had to do an extra day due to +01:09 one day off sick earlier in #100DaysOfCode. +01:12 Today more Python debugging, tomorrow starts round two." +01:17 And Jeff says, "Round one, day 19. #100DaysOfCode. +01:20 Did three exercises in the book. +01:23 Basically my average, been taking it slow +01:25 these last few days. #CodeNewbiePythonIndieDevIndieGameDev" +01:30 And finally, let's look at one more. +01:32 Amit Kumar says, "#Day32. Another autowebcompat +01:36 PR pull request, just got merged. +01:39 Way to go, Python Tkinter, #100DaysOfCode." +01:42 So he added some new feature or bug fix +01:44 to auto Web Compat, very, very cool. +01:47 So you've seen this stuff probably all over +01:49 social media, Facebook, Twitter, and so on. +01:52 What's it about? +01:53 Well, this is actually a very structured project +01:55 put together by this guy, Alexander Calloway. +01:59 So Alexander, he was studying in business school +02:02 but also wanted to learn programming. +02:05 And he was having a hard time making progress. +02:09 So he came up with this idea of #100DaysOfCode. +02:12 Here's a quote from him: "The idea of +02:14 #100DaysOfCode originally came from +02:16 my personal frustration with my inability +02:18 to consistently learn to code after work. +02:21 I'd find other less involved activities to +02:23 spend my time on, like binge watching a TV series. +02:26 One of those days, I was sitting in a restaurant +02:27 with my wife, and sharing my frustrations with her. +02:30 I suggested maybe I should make the public commitment +02:32 to learning for at least an hour every day. +02:35 I thought it would go for three months, +02:36 but it turned out 100 days was the right one." +02:39 How about that? +02:41 Well, thank you for creating this project, Alexander. +02:42 This is really a great thing for many people +02:45 getting started, and this is what this course is all about. +02:47 We're going to give you lessons and exercises +02:51 for every one of these 100 days. diff --git a/transcripts/00-intro/01b-rules-of-100days_transcript_final.txt b/transcripts/00-intro/01b-rules-of-100days_transcript_final.txt new file mode 100755 index 00000000..e72e9e4a --- /dev/null +++ b/transcripts/00-intro/01b-rules-of-100days_transcript_final.txt @@ -0,0 +1,28 @@ +00:00 There are a lot of things that people do +00:01 to support each other and encourage themselves +00:04 to stay focused and keep going on #100DaysOfCode. +00:07 But there's really just two main rules +00:09 and they're really really simple. +00:11 The first rule is to code a minimum of an hour +00:15 every day for the next 100 days. +00:17 And I would say taking a coding class +00:20 like learning the lessons in this course +00:22 and then coding a little bit counts, right? +00:24 You're immersing yourself in code +00:25 for at least an hour a day every single day +00:28 for the 100 days. +00:29 And if you got sick, like you saw the person before +00:31 had gotten sick, had to take a day off, +00:33 that's okay you just add some days on the end. +00:35 Have sick days and just move it to the end. +00:38 The second rule is a public commitment +00:40 to making progress and keeping with it. +00:43 And they way that works is to tweet +00:45 or to put onto somewhere like Facebook +00:47 #100DaysOfCode with an update every day. +00:51 The PyBytes platform actually is going +00:53 to help you a lot with this, but however you want to do it +00:55 it's code an hour a day and +00:57 share your progress every day. +01:00 Super simple rules, and we hope this course +01:02 really makes this work for you. diff --git a/transcripts/00-intro/02-what-well-cover-short_transcript_final.txt b/transcripts/00-intro/02-what-well-cover-short_transcript_final.txt new file mode 100755 index 00000000..1f1fb3a5 --- /dev/null +++ b/transcripts/00-intro/02-what-well-cover-short_transcript_final.txt @@ -0,0 +1,81 @@ +00:00 We are going to cover so much +00:02 content in this course, it's going to be amazing. +00:04 You'll learn many, many different things over these +00:07 #100DaysOfCode. +00:09 In fact, there's so many I can't really +00:11 enumerate all of them, it'll just take too long, +00:14 but I do want to give you a quick sample +00:15 into what we're going to cover. +00:16 We're going to talk about collections, +00:18 lists, dictionaries, working with them. +00:20 We're going to test our code with pytest to make sure we +00:22 build reliable apps. +00:23 We're going to create games, Dungeons and Dragons style with +00:26 classes and inheritance and object-oriented programming. +00:29 We're going to deal with errors +00:31 and proper error handling in Python. +00:33 We'll do logging to keep a history +00:35 of what our application has done. +00:37 We're going to work with the popular exchange format +00:39 called JSON, and it's a really great way to exchange data +00:43 between Python applications and any web service. +00:46 Speaking of services, we're going to learn how to call +00:49 JSON based web services from Python, +00:52 and if there's no service, can still go to the website +00:55 and do web scraping. +00:56 You can turn any HTML page, anything on the internet, +00:59 into a data source using web scraping. +01:03 Another source that we might go and consume, RSS feeds, +01:06 really popular among blogs and podcasts, +01:08 but also other types of subscriptions. +01:11 We're going to use the Twitter and the GitHub API +01:13 to interact with those services automatically from Python. +01:17 Want to send an email? +01:17 Maybe a new user registered for your site, +01:20 well we'll see how to do that as well in this course. +01:23 Excel has got to be the most popular database in the world. +01:26 It's not really a database, but people use it like one, +01:29 and you may need to program against it. +01:31 Turns out, we have the trick for you right here. +01:33 Want to automate something on the web? +01:35 Go login here, navigate over there, click this button, +01:38 make that thing happen. +01:39 We'll see how to do that with something called Selenium. +01:41 You want to write a web application, well we'll do that with +01:44 something called Flask, it's probably the easiest way +01:46 to write a web app in Python. +01:49 SQLite is a database built into Python, +01:52 it's what's called an embedded database, +01:53 and you'll see how to program it, either directly, +01:56 or from what's called an ORM from SQLAlchemy +01:59 where you create these classes and you map them +02:01 to objects in your database, +02:03 so we'll have a couple of places where we talk +02:06 about SQLite and relational data. +02:09 Graphs are wonderful, they explain so many things, +02:11 and so we're going to use something called Plotly +02:14 and draw graphs for you, +02:16 based on a set of data that you have, +02:17 and typically when you're doing +02:19 science like stuff like this, +02:21 that's done in something called +02:22 Jupyter Scientific Notebooks, +02:23 and a good portion of this class will be presented +02:26 in these notebooks. +02:27 Not all of it, maybe about a quarter. +02:30 GUIs and Python, they typically don't go together, +02:32 but in this course, they do. +02:33 You'll see in just a few lines of code that we can +02:36 create a really powerful and cool GUI or +02:39 desktop application, and this will run on all the platforms, +02:42 Windows, Linux, and macOS. +02:45 And finally, it's fun to consume APIs, +02:47 but sometimes you want to build them, +02:49 so we're going to actually take Flask and extend it +02:52 to create our very own API and put that out on the internet. +02:55 This is a ton of stuff right, isn't this exciting? +02:58 Well, it's only a small part +02:59 of what we're going to cover in this course, +03:01 so I hope you're really excited, +03:02 Bob, Julian and I definitely are excited +03:04 to teach it to you, so let's get to it. diff --git a/transcripts/00-intro/03-why-python_transcript_final.txt b/transcripts/00-intro/03-why-python_transcript_final.txt new file mode 100755 index 00000000..f18f4d9c --- /dev/null +++ b/transcripts/00-intro/03-why-python_transcript_final.txt @@ -0,0 +1,49 @@ +00:00 You've chosen Python for your #100DaysOfCode. +00:03 Maybe you're a Python developer who has lots of experience. +00:06 You just want to go through this +00:07 whole challenge, and that's great. +00:09 You probably already know the power +00:11 and popularity of Python. +00:13 But if you're just getting into programming, +00:15 and you're coming here and saying, +00:16 "Well, let's try Python for this 100 days. +00:18 That seems like a great way." +00:20 I want to tell you, you have chosen wisely. +00:23 So check out this graphic. +00:27 This comes from one of the best sources on the internet +00:29 for popularity in adoption of technology, Stack Overflow. +00:34 And the data scientists at Stack Overflow +00:36 did some predictions and said, "Well, how are +00:39 the various languages doing over time? +00:42 Are they becoming more popular, less popular?" +00:45 Based on their view into the industry. +00:47 And they did this up to mid-2017, and then you can see +00:51 the gray part where they're projecting out. +00:54 One of these languages is unlike the others. +00:57 It is just going up, and up, and increasingly up. +01:01 Your other best bet is JavaScript, which is +01:04 barely logarithmically going up. +01:07 Java looks like it's topping off. +01:09 The rest of them are going down. +01:10 So if you're going to focus on something, +01:12 pick one particular language. +01:14 Pick the one that's got all the momentum +01:15 and the popularity behind it, and that's Python. +01:18 Now, you might say, "Okay, Michael, +01:20 this actually is against all these +01:22 older languages, C#, Java, and so on. +01:25 What about the new languages like Go and Rust? +01:28 They're probably even more amazing +01:31 and more powerful, and growing quicker." +01:33 Well, let's see. +01:36 Yeah, they're growing up, they're going upward, +01:38 not downward, that's really great. +01:40 Swift is going up, TypeScript's going up, Go is going up, +01:43 but they are nowhere near Python in this graph. +01:48 I just want to leave you with these two pictures +01:49 in your mind that Python is really a great place +01:52 to put your energy and be learning. +01:54 My rough rule of thumb here is I would like to +01:57 bet my career on things that are going up, not down. +02:02 So which one of these do you want to pick? +02:04 Well, you're in a good place. diff --git a/transcripts/00-intro/04-course-flow_transcript_final.txt b/transcripts/00-intro/04-course-flow_transcript_final.txt new file mode 100755 index 00000000..a4ee48a5 --- /dev/null +++ b/transcripts/00-intro/04-course-flow_transcript_final.txt @@ -0,0 +1,37 @@ +00:00 Let's take just a moment and talk about +00:01 how you're going to experience this course. +00:04 Yes, it is #100DaysOfCode, +00:06 but it's not 100 different topics. +00:09 What we've done is we've broken +00:11 the course into three day segments. +00:13 So day one, two, and three, +00:15 days four, five, and six, and so on. +00:17 So, for example, on day 10, we're going to +00:20 introduce a new topic, teach you how to work with it, +00:24 the ideas behind it, do some live code demos, +00:27 and then after that, you'll get a chance to write +00:29 just a little bit of code, 'cause you're going to +00:31 spend a long time actually watching the videos. +00:34 These vary, they would be between 15 minutes, +00:36 maybe to 20, 25 minutes on average. +00:39 There's a few that are really involved +00:40 that go out longer than that. +00:41 But basically, the first day of any three day segment +00:45 on a single topic is going to be mostly learning +00:48 about that subject, writing a little code. +00:51 The next day is almost entirely writing code. +00:54 We'll have a video for you, it may be just two minutes long, +00:57 and we're also going to have in our GitHub repository +00:59 instructions with hints and tips, and things for you to do. +01:03 So you'll be able to follow along there. +01:05 Then the last day is really about finalizing your code, +01:08 maybe putting the polishing touches on the code +01:10 that you wrote on day one and day two. +01:12 Again, we'll probably have some instructions to guide you, +01:15 but if you want to deviate, that's fine. +01:17 This is your #100DaysOfCode. +01:19 We're just here to support you along the way. +01:21 So you can think of this course as 33 +01:24 three day journeys through it. +01:27 And each one of those journeys will go through a particular +01:29 topic: SQLAlchemy, Flask, Collections, whatever. diff --git a/transcripts/00-intro/05-meet-instructors_transcript_final.txt b/transcripts/00-intro/05-meet-instructors_transcript_final.txt new file mode 100755 index 00000000..23b9208a --- /dev/null +++ b/transcripts/00-intro/05-meet-instructors_transcript_final.txt @@ -0,0 +1,42 @@ +00:00 Hi, I'm Bob Belderbos, and I've been +00:02 programming since ten years. +00:04 And for the last six years, I've been using Python, +00:07 which is now the language of my choice. +00:09 I'm very excited to teach you Python in this course. +00:12 We're going to cover a lot of angles, +00:14 so be prepared to learn a lot of Python. +00:17 These days I'm a web developer, software engineer +00:20 at Oracle, and since end of 2016 co-founder of PyBites, +00:25 together with Julian, where we blog about Python +00:29 and do code challenges which we lately have +00:32 transformed in a code challenge platform. +00:34 We are super passionate about getting people to code, +00:37 have a very hands-on approach +00:40 and really want people to get to the next level of Python. +00:43 And that's why we're so passionate about +00:45 the #100DaysOfCode and this course +00:47 because we get you to write a lot of Python. +00:50 I'm honored to teach you Python +00:51 and look forward to our journey. +00:53 Hi everyone, I'm Julian Sequeira, +00:55 and welcome to the course. +00:57 I've been coding with Python for roughly two years now. +01:00 I currently work at AWS, but surprisingly not with Python. +01:05 Python is something I've taken up on the side, +01:07 and something I'm super passionate about +01:09 and absolutely love doing in my spare time. +01:12 I'm co-founder of PyBites, along with Bob. +01:15 And everything I do with Python +01:17 is purely out of love for the programming language. +01:20 And I'm totally looking forward to teaching you +01:23 everything I've learnt over the past couple of years +01:25 throughout the course. +01:27 Hey, welcome to our course. +01:28 I'm Michael Kennedy, nice to meet you. +01:30 A little background on me, +01:31 I'm primarily a web developer as well as the founder +01:33 of the Talk Python To Me podcast and Talk Python Training. +01:36 I've been a professional developer for 20 years, +01:39 and I'm really excited to share that experience +01:41 with you throughout this course. +01:43 Welcome to the #100DaysOfCode and Python. diff --git a/transcripts/00-intro/06-python-primer_transcript_final.txt b/transcripts/00-intro/06-python-primer_transcript_final.txt new file mode 100755 index 00000000..2ca18bb5 --- /dev/null +++ b/transcripts/00-intro/06-python-primer_transcript_final.txt @@ -0,0 +1,18 @@ +00:00 Do you need a little help with the Python language? +00:02 Of course, we'll cover much of the little details +00:05 and definitely the advanced features +00:07 as we go through this course, +00:08 but we don't start from the absolute beginning. +00:10 What is a variable? +00:11 What is a loop? +00:12 Instead, we've included a Python language primer. +00:15 So when you look at Python, +00:16 if it's, you know, a little fuzzy, +00:17 maybe you've done it a long time ago, but you've forgotten. +00:20 You haven't done very much of it. +00:21 Well, we put something in here to help clear it up. +00:24 So anytime you're confused about something in the language, +00:28 just jump down to the appendix, Python Language Concepts. +00:32 Find that thing, watch the one to two-minute video. +00:35 Hopefully, that'll clear things right up. +00:37 You'll find this at the end of the course. diff --git a/transcripts/00-intro/07-source_transcript_final.txt b/transcripts/00-intro/07-source_transcript_final.txt new file mode 100755 index 00000000..bcbbe1d0 --- /dev/null +++ b/transcripts/00-intro/07-source_transcript_final.txt @@ -0,0 +1,54 @@ +00:00 We've made all the code we've written over our 100 days +00:03 worth of topics available to you in GitHub right here. +00:07 gitHub.com/talkpython/100daysofcode-with-python-course. +00:12 You can go over here and check it out. +00:14 This is also super important because some of the projects +00:17 that you work on have either data that you've got to +00:20 start with, or they've got some instructions +00:22 and all of that you'll find here. +00:24 Let's jump over to GitHub and have a look. +00:27 Here we are at the GitHub repository. +00:29 You have a little bit of a description here +00:31 at the beginning. +00:31 But the main thing you care about is the days. +00:34 You can come in here and see the day one to three. +00:38 This is the stuff with JavaScript. +00:40 Here's day 13 to 15. +00:42 This is our text-based games. +00:44 Down over here is a Search API. +00:46 Let's just check this one out and see what's in here. +00:48 Here's demo that we built, and if you need the code for it +00:51 you can see actually here's what we've written and so on. +00:55 These three pieces work together. +00:58 But what's most important is this ReadMe. +01:00 It's automatically displayed by GitHub when you come here. +01:03 You can see it talks about now that you've seen the videos +01:07 what do you do? +01:08 Here it talks about, okay, so you watch this. +01:10 And the first thing on the day 43, +01:13 that's the first day of these three, +01:14 this is what we're going to do. +01:16 On day two, it talks about working with API. +01:18 It shows you how to use it with this thing called Postman. +01:21 And then finally, it also shows you how to build your app, +01:24 and then finally it says, okay, on the last day, +01:26 we're going to make it even better. +01:28 For the very grand finale, we're going to open it +01:30 in a web browser if somebody picks something inside +01:33 your application. +01:34 You can see that as you go through you want to make sure +01:36 that you go to each day, look at the instructions. +01:39 They're going to be there to help you follow along, +01:41 both the code demo we wrote as well as the steps and data +01:45 that we put together for you. +01:48 Of course, to download this, you'll want to download it. +01:50 I would also say star and fork it if you have +01:53 a GitHub account. +01:54 You could either come here and copy this and Git clone it +01:56 if you're familiar, or if you don't want to mess with Git +01:59 you can just download the Zip file and it will +02:00 be a folder you can unzip somewhere to work with. +02:03 But definitely download this. +02:04 You're going to want it locally. +02:05 You're going to want to save it. +02:07 You're going to use it throughout this course. diff --git a/transcripts/00-intro/08-3-devs_transcript_final.txt b/transcripts/00-intro/08-3-devs_transcript_final.txt new file mode 100755 index 00000000..33936e8e --- /dev/null +++ b/transcripts/00-intro/08-3-devs_transcript_final.txt @@ -0,0 +1,47 @@ +00:00 When you dedicate yourself to taking a course, +00:02 and carefully working the way +00:05 that the instructor, the author, is working, +00:07 you are effectively gaining much of the experience +00:09 that that particular author or developer +00:11 has gained through their career, through their jobs. +00:15 This course is special because it's taught by three people. +00:18 That means you get three experiences in one. +00:21 And this is super valuable. +00:22 Imagine that you have a job at this place. +00:24 You get to work with cool VR gear and +00:27 on hardware and IoT things. +00:29 You'll gain one set of experiences. +00:31 But if you took a different job, +00:33 say, you're starting a fashion start-up +00:35 with your friend, this woman, from college, +00:38 and you're just working on this coffee shop. +00:40 Being scrappy, working, trying to get +00:42 venture capital and launch your application, +00:44 you have a totally different experience +00:46 than this dude in a VR headset. +00:49 Or maybe you go the corporate route, +00:50 work at Microsoft like this guy here. +00:52 He's, you know, working on some new programming, +00:55 language tooling around Python. +00:57 These are all super different experiences. +00:59 And these experiences are very positive. +01:02 They give you a different perspective +01:03 and more perspectives on programming. +01:06 That's awesome. +01:07 How's that relevant to this course? +01:08 Well, with the three instructors, +01:09 we each have a slightly different set of tools. +01:12 And slightly different way of working. +01:15 We're going to show you next, +01:16 how each of us gets set up. +01:18 What you need to follow along with each of us: +01:20 Julian, Bob, and myself during our particular segments. +01:24 You don't have to work like us, +01:25 but if you want to do exactly what we're doing, +01:27 we'll show you how we got started. +01:29 And we feel this is super valuable for you. +01:31 You'll have not just one experience, +01:33 but three experiences kind of bundled up into one. +01:37 And so on the other side of this course, +01:39 you're going to have a broader perspective. +01:41 And that's pretty awesome. diff --git a/transcripts/00-intro/09-julian-setup_transcript_final.txt b/transcripts/00-intro/09-julian-setup_transcript_final.txt new file mode 100755 index 00000000..e3630a21 --- /dev/null +++ b/transcripts/00-intro/09-julian-setup_transcript_final.txt @@ -0,0 +1,59 @@ +00:00 'Kay, guys. This is Julian here, +00:02 and I just wanted to quickly walk you through my environment +00:05 for the duration of the course. +00:08 There's actually not much to it, and that's because +00:10 I'm using Windows, and I really wanted to keep it simple. +00:15 Okay, I wanted to show that you don't need to use +00:17 anything crazy. +00:18 Not that there's anything wrong with that, +00:20 but pretty much bare-bones on Windows, you're able to +00:23 code anything you want and just get into it, okay. +00:28 So the first thing you're going to need to do +00:30 is go and download Python. +00:32 And you can do that at python.org/downloads. Okay. +00:36 And it will detect you're on Windows if you using Windows, +00:40 and you can download Python 3.6.4, +00:43 the current latest version, and install it. +00:46 It's just an Microsoft installer file. +00:49 It will install to a default path. +00:50 You don't have to change anything. +00:52 Don't worry about it. +00:53 Nice and simple. +00:55 And once you're done, you can actually just launch IDLE. +00:59 Okay, that's I-D-L-E. Right? +01:02 You type that into your Windows search, and that will +01:05 actually bring it up into the Start menu. Right? +01:08 Once that's up, you'll see something that +01:10 looks similar to this, the Python shell, +01:13 which you can just type in Python code. +01:17 Okay? And you can live code just like that. +01:20 This is the Python shell. +01:22 Now with IDLE, this Integrated Development Environment, +01:26 okay, that's what IDLE stands for: +01:28 Integrated Development and Learning Environment. +01:31 With that, you can actually create a Python file. +01:34 Okay. This is actually going to be pretty much a +01:38 plain text file, but when you save it, +01:40 it will automatically save it as a .py file. +01:43 So your Python file. +01:45 That's what I like about using IDLE. +01:46 I never have to worry about accidentally +01:49 using the wrong format. +01:51 Okay? And other than that, you've seen some of my videos +01:55 that I run my scripts through the command prompt. +01:59 Okay? There's my path to my environment, +02:01 to where I'm storing everything for this course, +02:04 and I will just run the scripts straight from there +02:08 using the Python command. +02:10 And that is pretty much the bulk of my setup. +02:14 You won't see anything else. +02:16 You won't see anything different. +02:18 That's it, okay? +02:19 So standard command prompt on Windows. +02:21 I don't even use PowerShell. +02:23 I've go the Python shell here, and I just save the files +02:28 using the new document section of the Python IDLE. +02:33 And that's pretty much it. +02:34 So, I say keep it simple. +02:37 One day I probably will make the move to to PyCharm +02:40 or something, but for now, I'm happy with this. diff --git a/transcripts/00-intro/10-bob-setup_transcript_final.txt b/transcripts/00-intro/10-bob-setup_transcript_final.txt new file mode 100755 index 00000000..2aaf497c --- /dev/null +++ b/transcripts/00-intro/10-bob-setup_transcript_final.txt @@ -0,0 +1,84 @@ +00:00 I'm using Anaconda for this course, +00:02 a pre-bundled, Python distribution widely used +00:06 in the Data Science community. +00:08 And it comes with a lot of packages already. +00:10 You're not required to use this distribution. +00:14 You can also pip install my requirements, +00:16 which we will see in a bit. +00:17 You can download the full version here. +00:19 We recommend that you use 3.6. +00:22 Really no reason to start a new project in Python 2 anymore. +00:26 You can also install Miniconda, which is a smaller version, +00:30 which only includes the base packages. +00:33 And, mainly, what you need to know is +00:36 for almost all the lessons, I will be using +00:39 Jupyter Notebooks, which is a great way to experiment +00:42 with Python code and more in the browser. +00:45 It's a great tool to both teach and learn Python. +00:49 You can try it out if you want to play a little bit +00:52 at this point by going to try.jupyter.org, +00:55 but I encourage you to install it +00:57 to follow along with my lessons. +00:59 To install it, again, the recommended way is +01:02 to use Anaconda, but you can also use pip install jupyter, +01:07 and that should get it as well. +01:08 And let me show you that quickly. +01:10 So, first I need to clone the 100 Days of Code repo. +01:14 You cd into that. +01:15 At this point you really want to make +01:17 your virtual environment to work +01:19 on the project's requirement in isolation +01:22 to not mess up your global space. +01:24 And in every lesson, I have a video how to pip install +01:27 the requirements for that lesson, but I also +01:29 have 'em all wrapped together in a requirements file. +01:35 So, for all the notebooks, you need Jupyter; +01:37 and ipykernel, which I will explain why in a bit; +01:41 and then I listed out the requirements for each lesson. +01:44 There are various ways to make a virtual environment. +01:47 The classic way is to use pyvenv built in module. +01:51 You can also use pipenv, the new way, +01:54 which should be perfectly fine. +01:57 And Anaconda comes with Conda, +01:59 a utility to manage environments as well. +02:03 However, I am used to virtualenv, just the classic one. +02:06 So, in this course I am making a virtual environment +02:09 with this alias: +02:10 virtualenv -p, pointing to the Python binary +02:13 that comes with my Anaconda installation, +02:16 and the name of my virtual environment. +02:17 So, let's run that now. +02:20 And then you have to activate it. +02:21 And that's what I'm doing, that a lot I have another alias, +02:25 ae, and now I'm in my virtual environment, +02:29 where I don't have anything installed. +02:31 At this point, you can just do it video by video, +02:34 but if you want to have all the packages up-front, +02:36 you can do pip install -r, +02:38 requirements/requirements, +02:41 and that might take a bit because +02:43 it's not only pulling the dependencies, +02:45 but some of the dependencies have other dependencies. +02:48 With that done, you can launch a Jupyter notebook like this. +02:56 And you can go in today's and do any lesson. +03:00 For example, Selenium. +03:02 And you can open the notebook like this, +03:07 and you can follow the lesson. +03:11 And you see that the notebook discovered +03:13 my virtual environment. +03:15 If that is not the case, you might have to tweak it +03:18 a little bit, and that's why I pip install ipykernel +03:22 and Tornado was pulled in as well. +03:24 That should have been enough. +03:25 If that's not the case, you might have to run +03:28 ipythonkernel install +03:32 And this will be venv, or the name +03:34 of the virtual environment. +03:35 And then back to the notebook. +03:37 You should have the kernel, venv, +03:39 or whatever you named the virtual environment, here, +03:41 and you can switch to that, but I already have it here. +03:44 So, then your dependency should work. +03:46 It's in your virtual environment and you can follow along +03:49 with the lesson and make any modifications in the code +03:52 and experiment and that's how you learn. diff --git a/transcripts/00-intro/100days-marketing-video_transcript_final.txt b/transcripts/00-intro/100days-marketing-video_transcript_final.txt new file mode 100755 index 00000000..b97a813e --- /dev/null +++ b/transcripts/00-intro/100days-marketing-video_transcript_final.txt @@ -0,0 +1,243 @@ +00:00 Hello and welcome to #100DaysOfCode in Python, +00:04 written by Bob Belderbos, Julian Sequeira +00:06 and myself, Michael Kennedy. +00:10 Maybe you're wondering, +00:12 what is this #100DaysOfCode? +00:15 You've probably seen it all over social media. +00:17 In fact, it's really, really taken off +00:19 and people are finding this concept of +00:21 a #100DaysOfCode really powerful for +00:24 getting them to focus over a long time +00:27 to actually get over the hump and become capable developers, +00:30 or, maybe learn a new language like, say, Python. +00:33 Here's an example of what you might see on Twitter, +00:35 Renee Sanchez says, "Day11 #100DaysofCode progress. +00:39 Today I worked some more on bite 18, +00:42 find the most common word from codechalleng.es/bites." +00:46 This code-challenge platform they're referring to +00:48 is actually from your co-authors Bob and Julian. +00:51 We'll talk more about that later. +00:52 Let's look at one more. +00:53 Amit Kumar says, " #Day32 another autowebcompat PR, +00:59 pull request, just got merged. +01:01 Way to to go #Python #tkinter #100DaysofCode. +01:04 So he added some new feature or bug fix to autowebcompat. +01:07 Very, very cool. +01:09 So you've seen this stuff probably all over social media +01:11 Facebook, Twitter and so on. +01:14 What's it about? +01:15 Well, this is actually a very structured project +01:17 put together by this guy, Alexander Callaway. +01:21 So Alexander, he was studying in business school +01:24 but also wanted to learn programming +01:27 and he was having a hard time making progress. +01:30 So, he came up with this idea of #100DaysofCode. +01:34 Here's a quote from him. +01:35 "The idea of #100DaysOfCode originally came from +01:37 my personal frustration with my inability +01:40 to consistently learn to code after work. +01:43 I'd find other less-involved activities +01:45 to spend my time on like binge-watching a TV series. +01:48 One of those days, +01:48 I was sitting in a restaurant with my wife, Anna, +01:50 sharing my frustrations with her. +01:51 I suggested maybe I should make a public commitment +01:54 to learning for at least an hour every day. +01:56 And I thought it would go for three months +01:58 but it turned out, 100 days was the right one." +02:01 How about that? +02:02 Well, thank you for creating this project Alexander. +02:04 This is really a great thing for many people getting started +02:07 and this is what this course is all about. +02:09 We're going to give you lessons and exercises +02:12 for every one of these 100 days. +02:16 We're going to cover so much content in this course, +02:19 it's going to be amazing. +02:20 You'll learn many, many different things +02:23 over these hundred days of code. +02:25 In fact there's so many +02:26 I can't really innumerate all of them. +02:29 It'll just take too long. +02:30 But I do want to give you a quick sampling +02:32 of what we're going to cover. +02:33 We're going to talk about collections, lists, +02:35 dictionaries working with them. +02:36 We're going to test our code with pytest +02:38 and make sure we build reliable apps. +02:40 We're going to create games, Dungeons and Dragons style, +02:42 with classes and inheritance +02:44 and objected oriented programming. +02:46 We're going to deal with errors +02:47 and proper error handling in Python. +02:50 We'll do logging to keep a history +02:51 of what our application has done. +02:53 We're going to work with +02:54 the popular exchange format called JSON +02:57 and this is a really great way +02:58 to exchange data between Python applications +03:01 and any web service. +03:03 Speaking of services, we're going to learn how to +03:05 call JSON based web services from Python. +03:09 And, if there's no service +03:10 you can still go to the website and do web scraping. +03:13 You can turn any HTML page, anything on the internet, +03:16 into a data source using web scraping. +03:19 Another source that we might go and consume, RSS feeds. +03:22 Really popular among blogs and podcasts, +03:24 but also other types of subscriptions. +03:27 We're going to use the Twitter and the GitHub API +03:30 to interact with those services automatically from Python. +03:33 Want to send an email? +03:34 Maybe a new user registered for your site? +03:36 Well we'll see how to do that as well in this course. +03:39 Excel has got to be the most popular database in the world. +03:43 It's not really a database, but people use it like one, +03:45 and, you may need to program against it. +03:47 Turns out, we have the trick for you right here. +03:50 Want to automate something on the web, +03:52 go login here, navigate over there, +03:54 click this button and make that thing happen? +03:56 We'll see how to do that with something called Selenium. +03:58 You want to write a web application? +04:00 Well, we'll do that with something called Flask. +04:02 It's probably the easiest way to write a web app in Python. +04:06 SQLite is a database built into Python. +04:08 It's what's called an embedded database. +04:10 And you'll see how to program it, either directly +04:13 or, from what's called an ORM from SQLAlchemy +04:15 where you create these classes +04:17 and you map them to objects in your database. +04:20 So we'll have a couple of places +04:22 where we talk about SQLite and relational data. +04:26 Graphs are wonderful. +04:26 They explain so many things, +04:28 and, so, we're going to use something called Plotly +04:30 and draw graphs for you +04:32 based on a set of data that you have. +04:34 And, typically, +04:35 when you're doing science-like stuff like this, +04:37 that's done in something called Jupyter Scientific Notebooks +04:40 and a good portion of this class +04:41 will be presented in these notebooks. +04:43 Not all of it. +04:44 Maybe about a quarter. +04:46 GUIs and Python, they typically don't go together. +04:48 But, in this course they do. +04:50 You'll see, in just a few lines of code, +04:52 that we can create a really powerful +04:53 and cool GUI or desktop application +04:57 and this will run on all the platforms. +04:59 Windows, Linux and macOS. +05:01 And finally, it's fun to consume APIs +05:04 but sometimes you want to build them. +05:06 So we're going to actually take Flask +05:07 and extend it to create our very own API +05:10 and put that out on the internet. +05:12 This is a ton of stuff, right? +05:13 Isn't this exciting? +05:14 Well, it's only a small part +05:16 of what we're going to cover in this course, +05:17 so I hope you're really excited. +05:19 Bob, Julian and I definitely are excited to teach it to you, +05:22 so let's get to it. +05:23 You've chosen Python for your #100DaysofCode. +05:27 Maybe you're a Python developer who has lots of experience. +05:29 You just want to go through this whole challenge +05:32 and that's great. +05:33 You probably already know the power +05:34 and popularity of Python. +05:36 But if you're just getting into programming +05:38 and you're coming here and say, +05:39 "Well, let's try Python for this 100 days. +05:42 That seems like a great way." +05:43 I want to tell you, you have chosen wisely. +05:46 So check out this graphic. +05:50 This comes from one of the best sources on the internet +05:53 for popularity and adoption of technology, Stack Overflow. +05:58 And the data scientists at Stack Overflow +06:00 did some predictions and said +06:02 "Well how are the various languages doing over time? +06:06 Are they becoming more popular, less popular?" +06:08 based on their view into the industry. +06:10 And, they did this up to mid-2017 +06:14 and then, you can see the gray part +06:16 where they're projecting out. +06:18 One of these languages is unlike the others. +06:21 It is just going up and up and increasingly up. +06:24 Your other best bet is JavaScript +06:27 which is barely logarithmically going up. +06:30 Java looks like it's topping off. +06:32 The rest of them are going down. +06:34 So if you're going to focus on something, +06:36 pick one particular language, +06:37 pick the one that's got all the momentum +06:39 and the popularity behind it, and that's Python. +06:42 Now you might say, "Okay, Michael, +06:44 this is actually against all these older languages, +06:47 C#, Java and so on. +06:49 What about the new languages like Go and Rust? +06:52 They're probably even more amazing +06:54 and more powerful and growing quicker." +06:57 Well, let's see. +07:00 Yeah, they're growing up. +07:01 They're going upward not downward. +07:02 That's really great. +07:03 Swift is going up. +07:04 TypeScript's going up. +07:05 Go is going up. +07:07 But they are nowhere near Python in this graph. +07:11 I just want to leave you with +07:12 these two pictures in your mind +07:13 that Python is really a great place +07:16 to put your energy and be learning. +07:18 My rough rule of thumb here is +07:21 I would like to bet my career +07:22 on things that are going up, not down. +07:25 So, which one of these do you want to pick? +07:27 Well, you're in a good place. +07:29 When you dedicate yourself to taking a course +07:31 and carefully working the way that the instructor, +07:35 the author, is working, +07:36 you're effectively gaining much of the experience +07:39 that that particular author or developer +07:41 has gained through their career, through their jobs. +07:44 This course is special because it's taught by three people. +07:47 That means you get three experiences in one +07:50 and this is super valuable. +07:52 Imagine that you have a job at this place. +07:54 You get to work with cool VR gear +07:56 and on hardware and IoT things. +07:58 You'll gain one set of experiences. +08:00 But if you took a different job, +08:02 say, you're starting a fashion startup with your friend, +08:05 this woman from college, +08:07 and you're just working in this coffee shop, +08:09 being scrappy, working, trying to get venture capital +08:12 and launch your application, +08:14 you have a totally different experience +08:16 than this dude in a VR headset. +08:18 Or, maybe you go the corporate route, +08:19 work at Microsoft like this guy here. +08:22 He's working on some new programming, +08:24 language tooling, around Python. +08:27 These are all super different experiences +08:28 and these experiences are very positive. +08:31 They give you a different perspective +08:33 and more perspectives on programming. +08:35 That's awesome. +08:36 How's that relevant to this course? +08:37 Well with the three instructors, +08:39 we each have a slightly different set of tools +08:41 and a slightly different way of working. +08:44 We're going to show you next how each of us gets set up. +08:47 What you need to follow along with each of us, +08:49 Julian, Bob and myself, during our particular segments. +08:53 You don't have to work like us +08:54 but if you want to do exactly what we're doing +08:56 we'll show you how we got started. +08:58 And we feel this is super valuable for you. +09:01 You'll have not just one experience +09:03 but three experiences kind of bundled up into one. +09:06 And so, on the other side this course, +09:08 you're going to have a broader perspective. +09:10 And that's pretty awesome. diff --git a/transcripts/00-intro/11-michael-setup_transcript_final.txt b/transcripts/00-intro/11-michael-setup_transcript_final.txt new file mode 100755 index 00000000..9f795297 --- /dev/null +++ b/transcripts/00-intro/11-michael-setup_transcript_final.txt @@ -0,0 +1,70 @@ +00:00 Michael here. +00:01 It's time to show you how I set up the tools +00:02 when I'm writing code. +00:04 Now, I'm going to be using a Mac, +00:06 Mac OS High Sierra for this course. +00:08 That's the latest at the time of the recording. +00:10 However, you can use Windows, you can use Linux. +00:12 They're all basically the same as far as that goes. +00:15 I'm going to be using the editor PyCharm +00:17 and I'm going to be using Python, +00:19 the one that I got from python.org +00:22 not installed any other way. +00:23 So let's see how that goes. +00:25 First off, when you're on a Mac if you've taken no actions +00:28 you don't have Python 3. +00:30 You'll know if you open up your terminal. +00:32 Come over here and type python3 -V +00:37 and you would get the same error +00:39 something like python3 not found +00:42 as if there's a python4. +00:43 Someday, maybe, not right now. +00:56 So if you type python3 -V +00:59 not lowercase v and you get not found +01:02 you need to install it. +01:03 If you get something like, 3.5 or above, +01:06 you're fine, you're done with Python. +01:08 All you got to do is come over here, go to downloads, +01:10 download right now the latest is 3.6.4. +01:13 So download that, it gives you an installer. +01:15 Run the installer; you're good to go. +01:17 The other tool that I use a lot is something called PyCharm. +01:20 It's an editor for Python. +01:22 One of the richest and most powerful editors. +01:25 And I really think it's great both for beginners +01:28 and for professional developers. +01:30 And it comes in two versions. +01:31 You can see the full fledge Professional +01:33 or the Community Edition. +01:35 So you can download the Professional +01:37 or the Community Edition. +01:38 The Professional one costs money. +01:40 You can pay for it monthly or you can buy a license. +01:42 Whatever, it's like about eight or nine dollars a month. +01:45 You can get the Community Edition. +01:46 It's free and open source, okay. +01:48 This also comes with a month long free trial +01:50 so you can try it. +01:51 If you care about the features, +01:53 say which one comes in which, you can compare them +01:55 down here at the bottom under choose your edition. +01:58 So it's up to you which one you get. +02:00 So we can come down here and download this and install it. +02:04 One thing that's cool that you might consider getting +02:05 is this Toolbox App. +02:07 This one will sort of keep track of updates for you. +02:10 It looks like this and it gives you access to +02:12 all of the tools that JetBrains has. +02:14 So if you're going to install more than one, +02:15 this might be handy but you don't have to get it. +02:18 Either way, get either PyCharm Pro or Community Edition +02:21 or get this JetBrains Toolbox which I have up here. +02:24 You can see apparently there's an update +02:26 for my PyCharm Professional. +02:28 If I want a data grip, I can just click that and install it. +02:31 Once you have it you can run PyCharm +02:33 and you'll be able to start creating +02:35 and editing Python projects. +02:37 That's it, I don't really have anything else +02:39 installed for working with the code. +02:41 It's just Python, my OS, and PyCharm and we're good to go. diff --git a/transcripts/00-intro/12-platform_transcript_final.txt b/transcripts/00-intro/12-platform_transcript_final.txt new file mode 100755 index 00000000..9f12d6c7 --- /dev/null +++ b/transcripts/00-intro/12-platform_transcript_final.txt @@ -0,0 +1,82 @@ +00:00 As Michael stated, +00:01 there are 2 important +00:03 rules for the 100 Days. +00:05 And it is code an hour a day, +00:07 and track your progress. +00:08 Do a daily tweet of what you have accomplished that day. +00:11 In order to help you guys do that for this course, +00:14 we made a feature on our code challenges platform. +00:17 So head over to codechalleng.es +00:19 and sign in with GitHub +00:23 and go straight to 100DaysOfCode. +00:26 So here you see a template where you +00:28 can start the #100DaysOfCode, +00:30 but we made it easier +00:31 and made a direct link to populate +00:34 the 100 Days for you. +00:35 Head over to +00:38 start talkpython +00:44 and here you get a grid of 100 Days +00:48 with exactly the materials of each day. +00:51 So for example, +00:52 Day 1 you start with day times. +00:54 Day 1 is a lectures. +00:55 Day 2 is the practice, +00:57 and Day 3 is even more practice. +00:59 And you can just click on the Tweet icon +01:04 and that prepares a tweet for you, +01:06 so you can just tweet this out +01:08 or you can modify it as you want. +01:11 And then you can start to put things +01:13 into complete. +01:15 So here for example I hit Day 1, done. +01:18 And you see that this percent counter +01:20 then goes up and the items that you've done +01:22 are under done. +01:25 And so, +01:26 2. +01:28 And here you can document additional +01:30 learning, so here I learned that +01:34 time Delta, for example, +01:38 and here you are at the second lesson. +01:40 So this is Day 4 and here you're going to +01:42 look in the collections module, here. +01:46 Watch the videos. +01:48 And on 4% and here I did an exercise, +01:55 and marked complete. +01:57 So this is the grid of the whole +01:58 100 Days. +01:59 All the materials we have prepared for +02:01 this course, +02:03 and once you're done, +02:04 you have a nice love of all the stuff +02:06 you have coded and accomplished. +02:07 For example this is our #100DaysOfCode +02:10 which I imported from Twitter. +02:12 As you see we did a ton of coding +02:15 and you have it all nicely in one place, +02:18 and you can refer back to it which +02:20 we do often. +02:21 We go back to our script a lot, +02:23 pull out stuff we learned, +02:25 reuse it, and that's why it's nice to have +02:27 a #100DaysOfCode log. +02:29 Apart from that the tweeting is a very easy +02:33 and we encourage you to do that. +02:35 It's also a way to notify us what cool +02:37 stuff you are building for this course. +02:40 Completing the 100 Days is not easy. +02:42 It's a lot of work and dedication, +02:44 but at the end, it's a great accomplishment. +02:46 And you will have grown as a developer. +02:49 So you should be proud when you see this +02:51 honor of accomplishment when you hit the +02:53 hundred percent done. +02:55 So we hope this will help you +02:57 make it easy to keep track of your progress +02:59 during this course, +03:00 and if you want to tweet along is +03:03 stated in one of the rules. +03:04 This should make it very easy. +03:06 Alright and with that good luck +03:08 and prepare to learn a lot of of Python. From 37edd33cc8fe9961c97043f4c8c18c0230e6b5e2 Mon Sep 17 00:00:00 2001 From: hobojoe1848 Date: Wed, 4 Apr 2018 19:57:04 +1000 Subject: [PATCH 04/76] 01-03-datetimes readme update --- days/01-03-datetimes/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/days/01-03-datetimes/README.md b/days/01-03-datetimes/README.md index 356453af..fcac2b7c 100644 --- a/days/01-03-datetimes/README.md +++ b/days/01-03-datetimes/README.md @@ -20,6 +20,10 @@ Use the following URL to unlock Bite 7 for free: [https://codechalleng.es/bites/ Work on *Bite 7 - Parsing dates from logs* for your second day of learning datetime. +Edit: We decided to simplify Bite 7 slightly after some feedback we received from students. We've now removed the requirement to read in the file which should keep the Bite focused on the theme. + +Additionally, we've added another Bite that should be more appropriate for beginners. Unlock it here: [https://codechalleng.es/bites/promo/datetimes_starter](https://codechalleng.es/bites/promo/datetimes_starter) + ## Day N+2: Your Turn! From 7de47b4dfb62d91118f36d0892193d3023b9c216 Mon Sep 17 00:00:00 2001 From: slowrance Date: Wed, 4 Apr 2018 22:00:53 -0700 Subject: [PATCH 05/76] fixed Tree, Human, and Snake. Each one of them didn't have enough 'lose' entries. --- days/13-15-text-games/data/battle-table.csv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/days/13-15-text-games/data/battle-table.csv b/days/13-15-text-games/data/battle-table.csv index c26d03e3..1decbfe5 100644 --- a/days/13-15-text-games/data/battle-table.csv +++ b/days/13-15-text-games/data/battle-table.csv @@ -1 +1 @@ -Attacker,Rock,Gun,Lightning,Devil,Dragon,Water,Air,Paper,Sponge,Wolf,Tree,Human,Snake,Scissors,Fire Rock,draw,lose,lose,lose,lose,lose,lose,lose,win,win,win,win,win,win,win Gun,win,draw,lose,lose,lose,lose,lose,lose,lose,win,win,win,win,win,win Lightning,win,win,draw,lose,lose,lose,lose,lose,lose,lose,win,win,win,win,win Devil,win,win,win,draw,lose,lose,lose,lose,lose,lose,lose,win,win,win,win Dragon,win,win,win,win,draw,lose,lose,lose,lose,lose,lose,lose,win,win,win Water,win,win,win,win,win,draw,lose,lose,lose,lose,lose,lose,lose,win,win Air,win,win,win,win,win,win,draw,lose,lose,lose,lose,lose,lose,lose,win Paper,win,win,win,win,win,win,win,draw,lose,lose,lose,lose,lose,lose,lose Sponge,lose,win,win,win,win,win,win,win,draw,lose,lose,lose,lose,lose,lose Wolf,lose,lose,win,win,win,win,win,win,win,draw,lose,lose,lose,lose,lose Tree,lose,lose,lose,win,win,win,win,win,win,win,draw,win,win,win,win Human,lose,lose,lose,lose,win,win,win,win,win,win,win,draw,win,win,win Snake,lose,lose,lose,lose,lose,win,win,win,win,win,win,win,draw,win,win Scissors,lose,lose,lose,lose,lose,lose,win,win,win,win,win,win,win,draw,lose Fire,lose,lose,lose,lose,lose,lose,lose,win,win,win,win,win,win,win,draw \ No newline at end of file +Attacker,Rock,Gun,Lightning,Devil,Dragon,Water,Air,Paper,Sponge,Wolf,Tree,Human,Snake,Scissors,Fire Rock,draw,lose,lose,lose,lose,lose,lose,lose,win,win,win,win,win,win,win Gun,win,draw,lose,lose,lose,lose,lose,lose,lose,win,win,win,win,win,win Lightning,win,win,draw,lose,lose,lose,lose,lose,lose,lose,win,win,win,win,win Devil,win,win,win,draw,lose,lose,lose,lose,lose,lose,lose,win,win,win,win Dragon,win,win,win,win,draw,lose,lose,lose,lose,lose,lose,lose,win,win,win Water,win,win,win,win,win,draw,lose,lose,lose,lose,lose,lose,lose,win,win Air,win,win,win,win,win,win,draw,lose,lose,lose,lose,lose,lose,lose,win Paper,win,win,win,win,win,win,win,draw,lose,lose,lose,lose,lose,lose,lose Sponge,lose,win,win,win,win,win,win,win,draw,lose,lose,lose,lose,lose,lose Wolf,lose,lose,win,win,win,win,win,win,win,draw,lose,lose,lose,lose,lose Tree,lose,lose,lose,win,win,win,win,win,win,win,draw,lose,lose,lose,lose Human,lose,lose,lose,lose,win,win,win,win,win,win,win,draw,lose,lose,lose Snake,lose,lose,lose,lose,lose,win,win,win,win,win,win,win,draw,lose,lose Scissors,lose,lose,lose,lose,lose,lose,win,win,win,win,win,win,win,draw,lose Fire,lose,lose,lose,lose,lose,lose,lose,win,win,win,win,win,win,win,draw \ No newline at end of file From 1d7adb3a0bda66a39055583e750a8524a57b7caa Mon Sep 17 00:00:00 2001 From: Jeffrey Allman Date: Thu, 5 Apr 2018 20:46:06 -0400 Subject: [PATCH 06/76] Fix typo Absolution means a "formal release from guilt, obligation, or punishment." --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 7df5547a..52f9be9e 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ View the [full course outline](https://training.talkpython.fm/courses/explore_10 This course is for anyone who wants to immerse themselves in Python for 100 days worth of learning and hands-on projects. -We don’t start from absolution zero in terms of programming but if you are new to Python we have a language appendix and we start somewhat slow. By the end of the course, we get into intermediate-level Python projects. +We don’t start from absolute zero in terms of programming but if you are new to Python we have a language appendix and we start somewhat slow. By the end of the course, we get into intermediate-level Python projects. ## Course flow and the 33 projects From 979ef3b4440194a9d7ebc0b91646cc1e1e2d4dfc Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Fri, 20 Apr 2018 13:54:07 -0700 Subject: [PATCH 07/76] Initial transcripts for all lectures / videos. --- ...-is-100days_transcript_final.txt => 1.txt} | 0 ...lian-setup_transcript_final.txt => 10.txt} | 0 ..._final.txt => 100days-marketing-video.txt} | 0 ...-bob-setup_transcript_final.txt => 11.txt} | 0 ...hael-setup_transcript_final.txt => 12.txt} | 0 ...2-platform_transcript_final.txt => 13.txt} | 0 ...-of-100days_transcript_final.txt => 2.txt} | 0 ...cover-short_transcript_final.txt => 3.txt} | 0 ...-why-python_transcript_final.txt => 4.txt} | 0 ...course-flow_transcript_final.txt => 5.txt} | 0 ...instructors_transcript_final.txt => 6.txt} | 0 ...thon-primer_transcript_final.txt => 7.txt} | 0 .../{07-source_transcript_final.txt => 8.txt} | 0 .../{08-3-devs_transcript_final.txt => 9.txt} | 0 transcripts/01-datetimes/1.txt | 15 ++ transcripts/01-datetimes/2.txt | 34 +++ transcripts/01-datetimes/3.txt | 142 ++++++++++++ transcripts/01-datetimes/4.txt | 119 +++++++++++ transcripts/01-datetimes/5.txt | 77 +++++++ transcripts/04-collections/1.txt | 19 ++ transcripts/04-collections/2.txt | 33 +++ transcripts/04-collections/3.txt | 56 +++++ transcripts/04-collections/4.txt | 21 ++ transcripts/04-collections/5.txt | 20 ++ transcripts/04-collections/6.txt | 66 ++++++ transcripts/04-collections/7.txt | 90 ++++++++ transcripts/04-collections/8.txt | 27 +++ transcripts/07-data-structures/1.txt | 11 + transcripts/07-data-structures/2.txt | 60 ++++++ transcripts/07-data-structures/3.txt | 137 ++++++++++++ transcripts/07-data-structures/4.txt | 57 +++++ transcripts/07-data-structures/5.txt | 123 +++++++++++ transcripts/07-data-structures/6.txt | 70 ++++++ transcripts/10-testing/1.txt | 20 ++ transcripts/10-testing/10.txt | 45 ++++ transcripts/10-testing/11.txt | 39 ++++ transcripts/10-testing/12.txt | 40 ++++ transcripts/10-testing/2.txt | 54 +++++ transcripts/10-testing/3.txt | 70 ++++++ transcripts/10-testing/4.txt | 79 +++++++ transcripts/10-testing/5.txt | 97 +++++++++ transcripts/10-testing/6.txt | 94 ++++++++ transcripts/10-testing/7.txt | 93 ++++++++ transcripts/10-testing/8.txt | 138 ++++++++++++ transcripts/10-testing/9.txt | 69 ++++++ transcripts/100-day-one-hundred/1.txt | 20 ++ transcripts/101-conclusion/1.txt | 13 ++ transcripts/101-conclusion/2.txt | 33 +++ transcripts/101-conclusion/3.txt | 14 ++ transcripts/101-conclusion/4.txt | 29 +++ transcripts/101-conclusion/5.txt | 27 +++ transcripts/101-conclusion/6.txt | 33 +++ transcripts/13-text-games/1.txt | 37 ++++ transcripts/13-text-games/2.txt | 77 +++++++ transcripts/13-text-games/3.txt | 71 ++++++ transcripts/13-text-games/4.txt | 202 ++++++++++++++++++ transcripts/13-text-games/5.txt | 133 ++++++++++++ transcripts/13-text-games/6.txt | 23 ++ transcripts/13-text-games/7.txt | 47 ++++ transcripts/13-text-games/8.txt | 48 +++++ transcripts/13-text-games/9.txt | 32 +++ transcripts/16-comprehensions/1.txt | 27 +++ transcripts/16-comprehensions/10.txt | 29 +++ transcripts/16-comprehensions/2.txt | 68 ++++++ transcripts/16-comprehensions/3.txt | 49 +++++ transcripts/16-comprehensions/4.txt | 36 ++++ transcripts/16-comprehensions/5.txt | 25 +++ transcripts/16-comprehensions/6.txt | 28 +++ transcripts/16-comprehensions/7.txt | 32 +++ transcripts/16-comprehensions/8.txt | 23 ++ transcripts/16-comprehensions/9.txt | 78 +++++++ transcripts/19-iterators/1.txt | 11 + transcripts/19-iterators/2.txt | 54 +++++ transcripts/19-iterators/3.txt | 86 ++++++++ transcripts/19-iterators/4.txt | 111 ++++++++++ transcripts/19-iterators/5.txt | 95 ++++++++ transcripts/19-iterators/6.txt | 72 +++++++ transcripts/19-iterators/7.txt | 162 ++++++++++++++ transcripts/19-iterators/8.txt | 108 ++++++++++ transcripts/22-decorators/1.txt | 18 ++ transcripts/22-decorators/2.txt | 50 +++++ transcripts/22-decorators/3.txt | 69 ++++++ transcripts/22-decorators/4.txt | 33 +++ transcripts/22-decorators/5.txt | 35 +++ transcripts/22-decorators/6.txt | 36 ++++ transcripts/22-decorators/7.txt | 40 ++++ transcripts/22-decorators/8.txt | 16 ++ transcripts/22-decorators/9.txt | 37 ++++ transcripts/25-errors/1.txt | 22 ++ transcripts/25-errors/2.txt | 68 ++++++ transcripts/25-errors/3.txt | 75 +++++++ transcripts/25-errors/4.txt | 107 ++++++++++ transcripts/25-errors/5.txt | 47 ++++ transcripts/25-errors/6.txt | 34 +++ transcripts/25-errors/7.txt | 29 +++ transcripts/25-errors/8.txt | 22 ++ transcripts/28-regex/1.txt | 13 ++ transcripts/28-regex/10.txt | 36 ++++ transcripts/28-regex/2.txt | 41 ++++ transcripts/28-regex/3.txt | 35 +++ transcripts/28-regex/4.txt | 35 +++ transcripts/28-regex/5.txt | 75 +++++++ transcripts/28-regex/6.txt | 115 ++++++++++ transcripts/28-regex/7.txt | 56 +++++ transcripts/28-regex/8.txt | 37 ++++ transcripts/28-regex/9.txt | 46 ++++ transcripts/31-logging/1.txt | 81 +++++++ transcripts/31-logging/10.txt | 14 ++ transcripts/31-logging/11.txt | 32 +++ transcripts/31-logging/2.txt | 38 ++++ transcripts/31-logging/3.txt | 47 ++++ transcripts/31-logging/4.txt | 110 ++++++++++ transcripts/31-logging/5.txt | 113 ++++++++++ transcripts/31-logging/6.txt | 55 +++++ transcripts/31-logging/7.txt | 62 ++++++ transcripts/31-logging/8.txt | 58 +++++ transcripts/31-logging/9.txt | 15 ++ transcripts/34-refactoring/1.txt | 28 +++ transcripts/34-refactoring/10.txt | 54 +++++ transcripts/34-refactoring/11.txt | 57 +++++ transcripts/34-refactoring/12.txt | 50 +++++ transcripts/34-refactoring/13.txt | 108 ++++++++++ transcripts/34-refactoring/14.txt | 29 +++ transcripts/34-refactoring/2.txt | 63 ++++++ transcripts/34-refactoring/3.txt | 33 +++ transcripts/34-refactoring/4.txt | 51 +++++ transcripts/34-refactoring/5.txt | 64 ++++++ transcripts/34-refactoring/6.txt | 62 ++++++ transcripts/34-refactoring/7.txt | 56 +++++ transcripts/34-refactoring/8.txt | 66 ++++++ transcripts/34-refactoring/9.txt | 20 ++ transcripts/37-csv_data/1.txt | 14 ++ transcripts/37-csv_data/10.txt | 44 ++++ transcripts/37-csv_data/11.txt | 5 + transcripts/37-csv_data/12.txt | 13 ++ transcripts/37-csv_data/2.txt | 54 +++++ transcripts/37-csv_data/3.txt | 26 +++ transcripts/37-csv_data/4.txt | 85 ++++++++ transcripts/37-csv_data/5.txt | 99 +++++++++ transcripts/37-csv_data/6.txt | 59 +++++ transcripts/37-csv_data/7.txt | 161 ++++++++++++++ transcripts/37-csv_data/8.txt | 144 +++++++++++++ transcripts/37-csv_data/9.txt | 41 ++++ transcripts/40-json/1.txt | 30 +++ transcripts/40-json/2.txt | 40 ++++ transcripts/40-json/3.txt | 40 ++++ transcripts/40-json/4.txt | 105 +++++++++ transcripts/40-json/5.txt | 155 ++++++++++++++ transcripts/40-json/6.txt | 115 ++++++++++ transcripts/43-search-api/1.txt | 32 +++ transcripts/43-search-api/10.txt | 17 ++ transcripts/43-search-api/11.txt | 56 +++++ transcripts/43-search-api/12.txt | 21 ++ transcripts/43-search-api/2.txt | 38 ++++ transcripts/43-search-api/3.txt | 38 ++++ transcripts/43-search-api/4.txt | 26 +++ transcripts/43-search-api/5.txt | 98 +++++++++ transcripts/43-search-api/6.txt | 56 +++++ transcripts/43-search-api/7.txt | 51 +++++ transcripts/43-search-api/8.txt | 98 +++++++++ transcripts/43-search-api/9.txt | 32 +++ transcripts/46-beautifulsoup4/1.txt | 17 ++ transcripts/46-beautifulsoup4/2.txt | 25 +++ transcripts/46-beautifulsoup4/3.txt | 45 ++++ transcripts/46-beautifulsoup4/4.txt | 186 ++++++++++++++++ transcripts/46-beautifulsoup4/5.txt | 39 ++++ transcripts/46-beautifulsoup4/6.txt | 186 ++++++++++++++++ transcripts/46-beautifulsoup4/7.txt | 99 +++++++++ transcripts/46-beautifulsoup4/8.txt | 54 +++++ transcripts/49-measuring-perf/1.txt | 21 ++ transcripts/49-measuring-perf/10.txt | 51 +++++ transcripts/49-measuring-perf/11.txt | 24 +++ transcripts/49-measuring-perf/12.txt | 24 +++ transcripts/49-measuring-perf/13.txt | 29 +++ transcripts/49-measuring-perf/2.txt | 30 +++ transcripts/49-measuring-perf/3.txt | 106 +++++++++ transcripts/49-measuring-perf/4.txt | 47 ++++ transcripts/49-measuring-perf/5.txt | 90 ++++++++ transcripts/49-measuring-perf/6.txt | 87 ++++++++ transcripts/49-measuring-perf/7.txt | 147 +++++++++++++ transcripts/49-measuring-perf/8.txt | 68 ++++++ transcripts/49-measuring-perf/9.txt | 37 ++++ transcripts/52-feedparser/1.txt | 17 ++ transcripts/52-feedparser/2.txt | 22 ++ transcripts/52-feedparser/3.txt | 81 +++++++ transcripts/52-feedparser/4.txt | 106 +++++++++ transcripts/52-feedparser/5.txt | 47 ++++ transcripts/52-feedparser/6.txt | 65 ++++++ transcripts/52-feedparser/7.txt | 40 ++++ transcripts/55-uplink/1.txt | 27 +++ transcripts/55-uplink/10.txt | 89 ++++++++ transcripts/55-uplink/11.txt | 45 ++++ transcripts/55-uplink/12.txt | 32 +++ transcripts/55-uplink/13.txt | 25 +++ transcripts/55-uplink/14.txt | 16 ++ transcripts/55-uplink/2.txt | 48 +++++ transcripts/55-uplink/3.txt | 24 +++ transcripts/55-uplink/4.txt | 81 +++++++ transcripts/55-uplink/5.txt | 42 ++++ transcripts/55-uplink/6.txt | 100 +++++++++ transcripts/55-uplink/7.txt | 78 +++++++ transcripts/55-uplink/8.txt | 67 ++++++ transcripts/55-uplink/9.txt | 100 +++++++++ transcripts/58-tweepy/1.txt | 21 ++ transcripts/58-tweepy/2.txt | 14 ++ transcripts/58-tweepy/3.txt | 45 ++++ transcripts/58-tweepy/4.txt | 52 +++++ transcripts/58-tweepy/5.txt | 56 +++++ transcripts/58-tweepy/6.txt | 41 ++++ transcripts/58-tweepy/7.txt | 81 +++++++ transcripts/58-tweepy/8.txt | 47 ++++ transcripts/58-tweepy/9.txt | 80 +++++++ transcripts/61-github/1.txt | 17 ++ transcripts/61-github/2.txt | 54 +++++ transcripts/61-github/3.txt | 40 ++++ transcripts/61-github/4.txt | 74 +++++++ transcripts/61-github/5.txt | 99 +++++++++ transcripts/61-github/6.txt | 67 ++++++ transcripts/61-github/7.txt | 41 ++++ transcripts/61-github/8.txt | 41 ++++ transcripts/61-github/9.txt | 35 +++ transcripts/64-email-smtplib/1.txt | 20 ++ transcripts/64-email-smtplib/2.txt | 54 +++++ transcripts/64-email-smtplib/3.txt | 19 ++ transcripts/64-email-smtplib/4.txt | 136 ++++++++++++ transcripts/64-email-smtplib/5.txt | 151 +++++++++++++ transcripts/64-email-smtplib/6.txt | 78 +++++++ transcripts/64-email-smtplib/7.txt | 91 ++++++++ transcripts/64-email-smtplib/8.txt | 33 +++ transcripts/67-pyperclip/1.txt | 17 ++ transcripts/67-pyperclip/2.txt | 42 ++++ transcripts/67-pyperclip/3.txt | 17 ++ transcripts/67-pyperclip/4.txt | 52 +++++ transcripts/67-pyperclip/5.txt | 101 +++++++++ transcripts/67-pyperclip/6.txt | 119 +++++++++++ transcripts/67-pyperclip/7.txt | 65 ++++++ transcripts/70-openpyxl/1.txt | 12 ++ transcripts/70-openpyxl/2.txt | 40 ++++ transcripts/70-openpyxl/3.txt | 16 ++ transcripts/70-openpyxl/4.txt | 69 ++++++ transcripts/70-openpyxl/5.txt | 125 +++++++++++ transcripts/70-openpyxl/6.txt | 75 +++++++ transcripts/70-openpyxl/7.txt | 135 ++++++++++++ transcripts/70-openpyxl/8.txt | 171 +++++++++++++++ transcripts/73-selenium/1.txt | 29 +++ transcripts/73-selenium/2.txt | 46 ++++ transcripts/73-selenium/3.txt | 22 ++ transcripts/73-selenium/4.txt | 120 +++++++++++ transcripts/73-selenium/5.txt | 139 ++++++++++++ transcripts/73-selenium/6.txt | 37 ++++ transcripts/73-selenium/7.txt | 29 +++ transcripts/73-selenium/8.txt | 31 +++ transcripts/76-flask-app/1.txt | 17 ++ transcripts/76-flask-app/2.txt | 42 ++++ transcripts/76-flask-app/3.txt | 123 +++++++++++ transcripts/76-flask-app/4.txt | 195 +++++++++++++++++ transcripts/76-flask-app/5.txt | 49 +++++ transcripts/76-flask-app/6.txt | 39 ++++ transcripts/79-sqlite3/1.txt | 20 ++ transcripts/79-sqlite3/10.txt | 42 ++++ transcripts/79-sqlite3/2.txt | 26 +++ transcripts/79-sqlite3/3.txt | 152 +++++++++++++ transcripts/79-sqlite3/4.txt | 18 ++ transcripts/79-sqlite3/5.txt | 99 +++++++++ transcripts/79-sqlite3/6.txt | 52 +++++ transcripts/79-sqlite3/7.txt | 136 ++++++++++++ transcripts/79-sqlite3/8.txt | 45 ++++ transcripts/79-sqlite3/9.txt | 75 +++++++ transcripts/82-dataviz/1.txt | 21 ++ transcripts/82-dataviz/10.txt | 20 ++ transcripts/82-dataviz/2.txt | 47 ++++ transcripts/82-dataviz/3.txt | 132 ++++++++++++ transcripts/82-dataviz/4.txt | 92 ++++++++ transcripts/82-dataviz/5.txt | 54 +++++ transcripts/82-dataviz/6.txt | 50 +++++ transcripts/82-dataviz/7.txt | 34 +++ transcripts/82-dataviz/8.txt | 74 +++++++ transcripts/82-dataviz/9.txt | 39 ++++ transcripts/85-anvil/1.txt | 18 ++ transcripts/85-anvil/10.txt | 48 +++++ transcripts/85-anvil/11.txt | 116 ++++++++++ transcripts/85-anvil/12.txt | 63 ++++++ transcripts/85-anvil/13.txt | 110 ++++++++++ transcripts/85-anvil/14.txt | 68 ++++++ transcripts/85-anvil/15.txt | 107 ++++++++++ transcripts/85-anvil/16.txt | 140 ++++++++++++ transcripts/85-anvil/17.txt | 38 ++++ transcripts/85-anvil/18.txt | 78 +++++++ transcripts/85-anvil/19.txt | 67 ++++++ transcripts/85-anvil/2.txt | 58 +++++ transcripts/85-anvil/20.txt | 48 +++++ transcripts/85-anvil/21.txt | 82 +++++++ transcripts/85-anvil/22.txt | 47 ++++ transcripts/85-anvil/23.txt | 32 +++ transcripts/85-anvil/24.txt | 33 +++ transcripts/85-anvil/3.txt | 24 +++ transcripts/85-anvil/4.txt | 23 ++ transcripts/85-anvil/5.txt | 72 +++++++ transcripts/85-anvil/6.txt | 56 +++++ transcripts/85-anvil/7.txt | 63 ++++++ transcripts/85-anvil/8.txt | 46 ++++ transcripts/85-anvil/9.txt | 100 +++++++++ transcripts/88-home-inventory-app/1.txt | 16 ++ transcripts/88-home-inventory-app/2.txt | 60 ++++++ transcripts/88-home-inventory-app/3.txt | 120 +++++++++++ transcripts/88-home-inventory-app/4.txt | 96 +++++++++ transcripts/88-home-inventory-app/5.txt | 102 +++++++++ transcripts/88-home-inventory-app/6.txt | 108 ++++++++++ transcripts/88-home-inventory-app/7.txt | 121 +++++++++++ transcripts/88-home-inventory-app/8.txt | 30 +++ transcripts/900-appendix-pylang/1.txt | 25 +++ transcripts/900-appendix-pylang/10.txt | 34 +++ transcripts/900-appendix-pylang/11.txt | 32 +++ transcripts/900-appendix-pylang/12.txt | 40 ++++ transcripts/900-appendix-pylang/13.txt | 70 ++++++ transcripts/900-appendix-pylang/14.txt | 51 +++++ transcripts/900-appendix-pylang/15.txt | 29 +++ transcripts/900-appendix-pylang/16.txt | 30 +++ transcripts/900-appendix-pylang/17.txt | 34 +++ transcripts/900-appendix-pylang/18.txt | 30 +++ transcripts/900-appendix-pylang/19.txt | 34 +++ transcripts/900-appendix-pylang/2.txt | 15 ++ transcripts/900-appendix-pylang/20.txt | 17 ++ transcripts/900-appendix-pylang/21.txt | 46 ++++ transcripts/900-appendix-pylang/22.txt | 45 ++++ transcripts/900-appendix-pylang/23.txt | 37 ++++ transcripts/900-appendix-pylang/24.txt | 51 +++++ transcripts/900-appendix-pylang/25.txt | 13 ++ transcripts/900-appendix-pylang/3.txt | 29 +++ transcripts/900-appendix-pylang/4.txt | 25 +++ transcripts/900-appendix-pylang/5.txt | 23 ++ transcripts/900-appendix-pylang/6.txt | 31 +++ transcripts/900-appendix-pylang/7.txt | 19 ++ transcripts/900-appendix-pylang/8.txt | 32 +++ transcripts/900-appendix-pylang/9.txt | 22 ++ transcripts/91-sqlalchemy/1.txt | 31 +++ transcripts/91-sqlalchemy/10.txt | 91 ++++++++ transcripts/91-sqlalchemy/11.txt | 29 +++ transcripts/91-sqlalchemy/12.txt | 38 ++++ transcripts/91-sqlalchemy/13.txt | 18 ++ transcripts/91-sqlalchemy/2.txt | 71 ++++++ transcripts/91-sqlalchemy/3.txt | 57 +++++ transcripts/91-sqlalchemy/4.txt | 73 +++++++ transcripts/91-sqlalchemy/5.txt | 124 +++++++++++ transcripts/91-sqlalchemy/6.txt | 166 ++++++++++++++ transcripts/91-sqlalchemy/7.txt | 202 ++++++++++++++++++ transcripts/91-sqlalchemy/8.txt | 25 +++ transcripts/91-sqlalchemy/9.txt | 39 ++++ transcripts/94-guis/1.txt | 69 ++++++ transcripts/94-guis/2.txt | 62 ++++++ transcripts/94-guis/3.txt | 52 +++++ transcripts/94-guis/4.txt | 135 ++++++++++++ transcripts/94-guis/5.txt | 114 ++++++++++ transcripts/94-guis/6.txt | 43 ++++ transcripts/94-guis/7.txt | 46 ++++ transcripts/94-guis/8.txt | 25 +++ transcripts/94-guis/9.txt | 24 +++ transcripts/97-online-game-service/1.txt | 89 ++++++++ transcripts/97-online-game-service/10.txt | 34 +++ transcripts/97-online-game-service/11.txt | 42 ++++ transcripts/97-online-game-service/12.txt | 64 ++++++ transcripts/97-online-game-service/13.txt | 90 ++++++++ transcripts/97-online-game-service/14.txt | 64 ++++++ transcripts/97-online-game-service/15.txt | 37 ++++ transcripts/97-online-game-service/16.txt | 110 ++++++++++ transcripts/97-online-game-service/17.txt | 77 +++++++ transcripts/97-online-game-service/18.txt | 58 +++++ transcripts/97-online-game-service/19.txt | 28 +++ transcripts/97-online-game-service/2.txt | 65 ++++++ transcripts/97-online-game-service/20.txt | 20 ++ transcripts/97-online-game-service/21.txt | 76 +++++++ transcripts/97-online-game-service/22.txt | 62 ++++++ transcripts/97-online-game-service/23.txt | 49 +++++ transcripts/97-online-game-service/24.txt | 20 ++ transcripts/97-online-game-service/25.txt | 35 +++ transcripts/97-online-game-service/3.txt | 64 ++++++ transcripts/97-online-game-service/4.txt | 51 +++++ transcripts/97-online-game-service/5.txt | 72 +++++++ transcripts/97-online-game-service/6.txt | 40 ++++ transcripts/97-online-game-service/7.txt | 99 +++++++++ transcripts/97-online-game-service/8.txt | 119 +++++++++++ transcripts/97-online-game-service/9.txt | 39 ++++ 382 files changed, 21629 insertions(+) rename transcripts/00-intro/{01a-what-is-100days_transcript_final.txt => 1.txt} (100%) rename transcripts/00-intro/{09-julian-setup_transcript_final.txt => 10.txt} (100%) rename transcripts/00-intro/{100days-marketing-video_transcript_final.txt => 100days-marketing-video.txt} (100%) rename transcripts/00-intro/{10-bob-setup_transcript_final.txt => 11.txt} (100%) rename transcripts/00-intro/{11-michael-setup_transcript_final.txt => 12.txt} (100%) rename transcripts/00-intro/{12-platform_transcript_final.txt => 13.txt} (100%) rename transcripts/00-intro/{01b-rules-of-100days_transcript_final.txt => 2.txt} (100%) rename transcripts/00-intro/{02-what-well-cover-short_transcript_final.txt => 3.txt} (100%) rename transcripts/00-intro/{03-why-python_transcript_final.txt => 4.txt} (100%) rename transcripts/00-intro/{04-course-flow_transcript_final.txt => 5.txt} (100%) rename transcripts/00-intro/{05-meet-instructors_transcript_final.txt => 6.txt} (100%) rename transcripts/00-intro/{06-python-primer_transcript_final.txt => 7.txt} (100%) rename transcripts/00-intro/{07-source_transcript_final.txt => 8.txt} (100%) rename transcripts/00-intro/{08-3-devs_transcript_final.txt => 9.txt} (100%) create mode 100644 transcripts/01-datetimes/1.txt create mode 100644 transcripts/01-datetimes/2.txt create mode 100644 transcripts/01-datetimes/3.txt create mode 100644 transcripts/01-datetimes/4.txt create mode 100644 transcripts/01-datetimes/5.txt create mode 100644 transcripts/04-collections/1.txt create mode 100644 transcripts/04-collections/2.txt create mode 100644 transcripts/04-collections/3.txt create mode 100644 transcripts/04-collections/4.txt create mode 100644 transcripts/04-collections/5.txt create mode 100644 transcripts/04-collections/6.txt create mode 100644 transcripts/04-collections/7.txt create mode 100644 transcripts/04-collections/8.txt create mode 100644 transcripts/07-data-structures/1.txt create mode 100644 transcripts/07-data-structures/2.txt create mode 100644 transcripts/07-data-structures/3.txt create mode 100644 transcripts/07-data-structures/4.txt create mode 100644 transcripts/07-data-structures/5.txt create mode 100644 transcripts/07-data-structures/6.txt create mode 100644 transcripts/10-testing/1.txt create mode 100644 transcripts/10-testing/10.txt create mode 100644 transcripts/10-testing/11.txt create mode 100644 transcripts/10-testing/12.txt create mode 100644 transcripts/10-testing/2.txt create mode 100644 transcripts/10-testing/3.txt create mode 100644 transcripts/10-testing/4.txt create mode 100644 transcripts/10-testing/5.txt create mode 100644 transcripts/10-testing/6.txt create mode 100644 transcripts/10-testing/7.txt create mode 100644 transcripts/10-testing/8.txt create mode 100644 transcripts/10-testing/9.txt create mode 100755 transcripts/100-day-one-hundred/1.txt create mode 100755 transcripts/101-conclusion/1.txt create mode 100755 transcripts/101-conclusion/2.txt create mode 100755 transcripts/101-conclusion/3.txt create mode 100755 transcripts/101-conclusion/4.txt create mode 100755 transcripts/101-conclusion/5.txt create mode 100755 transcripts/101-conclusion/6.txt create mode 100644 transcripts/13-text-games/1.txt create mode 100644 transcripts/13-text-games/2.txt create mode 100644 transcripts/13-text-games/3.txt create mode 100644 transcripts/13-text-games/4.txt create mode 100644 transcripts/13-text-games/5.txt create mode 100644 transcripts/13-text-games/6.txt create mode 100644 transcripts/13-text-games/7.txt create mode 100644 transcripts/13-text-games/8.txt create mode 100644 transcripts/13-text-games/9.txt create mode 100644 transcripts/16-comprehensions/1.txt create mode 100644 transcripts/16-comprehensions/10.txt create mode 100644 transcripts/16-comprehensions/2.txt create mode 100644 transcripts/16-comprehensions/3.txt create mode 100644 transcripts/16-comprehensions/4.txt create mode 100644 transcripts/16-comprehensions/5.txt create mode 100644 transcripts/16-comprehensions/6.txt create mode 100644 transcripts/16-comprehensions/7.txt create mode 100644 transcripts/16-comprehensions/8.txt create mode 100644 transcripts/16-comprehensions/9.txt create mode 100644 transcripts/19-iterators/1.txt create mode 100644 transcripts/19-iterators/2.txt create mode 100644 transcripts/19-iterators/3.txt create mode 100644 transcripts/19-iterators/4.txt create mode 100644 transcripts/19-iterators/5.txt create mode 100644 transcripts/19-iterators/6.txt create mode 100644 transcripts/19-iterators/7.txt create mode 100644 transcripts/19-iterators/8.txt create mode 100755 transcripts/22-decorators/1.txt create mode 100755 transcripts/22-decorators/2.txt create mode 100755 transcripts/22-decorators/3.txt create mode 100755 transcripts/22-decorators/4.txt create mode 100755 transcripts/22-decorators/5.txt create mode 100755 transcripts/22-decorators/6.txt create mode 100755 transcripts/22-decorators/7.txt create mode 100755 transcripts/22-decorators/8.txt create mode 100755 transcripts/22-decorators/9.txt create mode 100755 transcripts/25-errors/1.txt create mode 100755 transcripts/25-errors/2.txt create mode 100755 transcripts/25-errors/3.txt create mode 100755 transcripts/25-errors/4.txt create mode 100755 transcripts/25-errors/5.txt create mode 100755 transcripts/25-errors/6.txt create mode 100755 transcripts/25-errors/7.txt create mode 100755 transcripts/25-errors/8.txt create mode 100755 transcripts/28-regex/1.txt create mode 100755 transcripts/28-regex/10.txt create mode 100755 transcripts/28-regex/2.txt create mode 100755 transcripts/28-regex/3.txt create mode 100755 transcripts/28-regex/4.txt create mode 100755 transcripts/28-regex/5.txt create mode 100755 transcripts/28-regex/6.txt create mode 100755 transcripts/28-regex/7.txt create mode 100755 transcripts/28-regex/8.txt create mode 100755 transcripts/28-regex/9.txt create mode 100755 transcripts/31-logging/1.txt create mode 100755 transcripts/31-logging/10.txt create mode 100755 transcripts/31-logging/11.txt create mode 100755 transcripts/31-logging/2.txt create mode 100755 transcripts/31-logging/3.txt create mode 100755 transcripts/31-logging/4.txt create mode 100755 transcripts/31-logging/5.txt create mode 100755 transcripts/31-logging/6.txt create mode 100755 transcripts/31-logging/7.txt create mode 100755 transcripts/31-logging/8.txt create mode 100755 transcripts/31-logging/9.txt create mode 100755 transcripts/34-refactoring/1.txt create mode 100755 transcripts/34-refactoring/10.txt create mode 100755 transcripts/34-refactoring/11.txt create mode 100755 transcripts/34-refactoring/12.txt create mode 100755 transcripts/34-refactoring/13.txt create mode 100755 transcripts/34-refactoring/14.txt create mode 100755 transcripts/34-refactoring/2.txt create mode 100755 transcripts/34-refactoring/3.txt create mode 100755 transcripts/34-refactoring/4.txt create mode 100755 transcripts/34-refactoring/5.txt create mode 100755 transcripts/34-refactoring/6.txt create mode 100755 transcripts/34-refactoring/7.txt create mode 100755 transcripts/34-refactoring/8.txt create mode 100755 transcripts/34-refactoring/9.txt create mode 100755 transcripts/37-csv_data/1.txt create mode 100755 transcripts/37-csv_data/10.txt create mode 100755 transcripts/37-csv_data/11.txt create mode 100755 transcripts/37-csv_data/12.txt create mode 100755 transcripts/37-csv_data/2.txt create mode 100755 transcripts/37-csv_data/3.txt create mode 100755 transcripts/37-csv_data/4.txt create mode 100755 transcripts/37-csv_data/5.txt create mode 100755 transcripts/37-csv_data/6.txt create mode 100755 transcripts/37-csv_data/7.txt create mode 100755 transcripts/37-csv_data/8.txt create mode 100755 transcripts/37-csv_data/9.txt create mode 100755 transcripts/40-json/1.txt create mode 100755 transcripts/40-json/2.txt create mode 100755 transcripts/40-json/3.txt create mode 100755 transcripts/40-json/4.txt create mode 100755 transcripts/40-json/5.txt create mode 100755 transcripts/40-json/6.txt create mode 100755 transcripts/43-search-api/1.txt create mode 100755 transcripts/43-search-api/10.txt create mode 100755 transcripts/43-search-api/11.txt create mode 100755 transcripts/43-search-api/12.txt create mode 100755 transcripts/43-search-api/2.txt create mode 100755 transcripts/43-search-api/3.txt create mode 100755 transcripts/43-search-api/4.txt create mode 100755 transcripts/43-search-api/5.txt create mode 100755 transcripts/43-search-api/6.txt create mode 100755 transcripts/43-search-api/7.txt create mode 100755 transcripts/43-search-api/8.txt create mode 100755 transcripts/43-search-api/9.txt create mode 100755 transcripts/46-beautifulsoup4/1.txt create mode 100755 transcripts/46-beautifulsoup4/2.txt create mode 100755 transcripts/46-beautifulsoup4/3.txt create mode 100755 transcripts/46-beautifulsoup4/4.txt create mode 100755 transcripts/46-beautifulsoup4/5.txt create mode 100755 transcripts/46-beautifulsoup4/6.txt create mode 100755 transcripts/46-beautifulsoup4/7.txt create mode 100755 transcripts/46-beautifulsoup4/8.txt create mode 100755 transcripts/49-measuring-perf/1.txt create mode 100755 transcripts/49-measuring-perf/10.txt create mode 100755 transcripts/49-measuring-perf/11.txt create mode 100755 transcripts/49-measuring-perf/12.txt create mode 100755 transcripts/49-measuring-perf/13.txt create mode 100755 transcripts/49-measuring-perf/2.txt create mode 100755 transcripts/49-measuring-perf/3.txt create mode 100755 transcripts/49-measuring-perf/4.txt create mode 100755 transcripts/49-measuring-perf/5.txt create mode 100755 transcripts/49-measuring-perf/6.txt create mode 100755 transcripts/49-measuring-perf/7.txt create mode 100755 transcripts/49-measuring-perf/8.txt create mode 100755 transcripts/49-measuring-perf/9.txt create mode 100755 transcripts/52-feedparser/1.txt create mode 100755 transcripts/52-feedparser/2.txt create mode 100755 transcripts/52-feedparser/3.txt create mode 100755 transcripts/52-feedparser/4.txt create mode 100755 transcripts/52-feedparser/5.txt create mode 100755 transcripts/52-feedparser/6.txt create mode 100755 transcripts/52-feedparser/7.txt create mode 100755 transcripts/55-uplink/1.txt create mode 100755 transcripts/55-uplink/10.txt create mode 100755 transcripts/55-uplink/11.txt create mode 100755 transcripts/55-uplink/12.txt create mode 100755 transcripts/55-uplink/13.txt create mode 100755 transcripts/55-uplink/14.txt create mode 100755 transcripts/55-uplink/2.txt create mode 100755 transcripts/55-uplink/3.txt create mode 100755 transcripts/55-uplink/4.txt create mode 100755 transcripts/55-uplink/5.txt create mode 100755 transcripts/55-uplink/6.txt create mode 100755 transcripts/55-uplink/7.txt create mode 100755 transcripts/55-uplink/8.txt create mode 100755 transcripts/55-uplink/9.txt create mode 100755 transcripts/58-tweepy/1.txt create mode 100755 transcripts/58-tweepy/2.txt create mode 100755 transcripts/58-tweepy/3.txt create mode 100755 transcripts/58-tweepy/4.txt create mode 100755 transcripts/58-tweepy/5.txt create mode 100755 transcripts/58-tweepy/6.txt create mode 100755 transcripts/58-tweepy/7.txt create mode 100755 transcripts/58-tweepy/8.txt create mode 100755 transcripts/58-tweepy/9.txt create mode 100755 transcripts/61-github/1.txt create mode 100755 transcripts/61-github/2.txt create mode 100755 transcripts/61-github/3.txt create mode 100755 transcripts/61-github/4.txt create mode 100755 transcripts/61-github/5.txt create mode 100755 transcripts/61-github/6.txt create mode 100755 transcripts/61-github/7.txt create mode 100755 transcripts/61-github/8.txt create mode 100755 transcripts/61-github/9.txt create mode 100755 transcripts/64-email-smtplib/1.txt create mode 100755 transcripts/64-email-smtplib/2.txt create mode 100755 transcripts/64-email-smtplib/3.txt create mode 100755 transcripts/64-email-smtplib/4.txt create mode 100755 transcripts/64-email-smtplib/5.txt create mode 100755 transcripts/64-email-smtplib/6.txt create mode 100755 transcripts/64-email-smtplib/7.txt create mode 100755 transcripts/64-email-smtplib/8.txt create mode 100755 transcripts/67-pyperclip/1.txt create mode 100755 transcripts/67-pyperclip/2.txt create mode 100755 transcripts/67-pyperclip/3.txt create mode 100755 transcripts/67-pyperclip/4.txt create mode 100755 transcripts/67-pyperclip/5.txt create mode 100755 transcripts/67-pyperclip/6.txt create mode 100755 transcripts/67-pyperclip/7.txt create mode 100755 transcripts/70-openpyxl/1.txt create mode 100755 transcripts/70-openpyxl/2.txt create mode 100755 transcripts/70-openpyxl/3.txt create mode 100755 transcripts/70-openpyxl/4.txt create mode 100755 transcripts/70-openpyxl/5.txt create mode 100755 transcripts/70-openpyxl/6.txt create mode 100755 transcripts/70-openpyxl/7.txt create mode 100755 transcripts/70-openpyxl/8.txt create mode 100755 transcripts/73-selenium/1.txt create mode 100755 transcripts/73-selenium/2.txt create mode 100755 transcripts/73-selenium/3.txt create mode 100755 transcripts/73-selenium/4.txt create mode 100755 transcripts/73-selenium/5.txt create mode 100755 transcripts/73-selenium/6.txt create mode 100755 transcripts/73-selenium/7.txt create mode 100755 transcripts/73-selenium/8.txt create mode 100755 transcripts/76-flask-app/1.txt create mode 100755 transcripts/76-flask-app/2.txt create mode 100755 transcripts/76-flask-app/3.txt create mode 100755 transcripts/76-flask-app/4.txt create mode 100755 transcripts/76-flask-app/5.txt create mode 100755 transcripts/76-flask-app/6.txt create mode 100755 transcripts/79-sqlite3/1.txt create mode 100755 transcripts/79-sqlite3/10.txt create mode 100755 transcripts/79-sqlite3/2.txt create mode 100755 transcripts/79-sqlite3/3.txt create mode 100755 transcripts/79-sqlite3/4.txt create mode 100755 transcripts/79-sqlite3/5.txt create mode 100755 transcripts/79-sqlite3/6.txt create mode 100755 transcripts/79-sqlite3/7.txt create mode 100755 transcripts/79-sqlite3/8.txt create mode 100755 transcripts/79-sqlite3/9.txt create mode 100755 transcripts/82-dataviz/1.txt create mode 100755 transcripts/82-dataviz/10.txt create mode 100755 transcripts/82-dataviz/2.txt create mode 100755 transcripts/82-dataviz/3.txt create mode 100755 transcripts/82-dataviz/4.txt create mode 100755 transcripts/82-dataviz/5.txt create mode 100755 transcripts/82-dataviz/6.txt create mode 100755 transcripts/82-dataviz/7.txt create mode 100755 transcripts/82-dataviz/8.txt create mode 100755 transcripts/82-dataviz/9.txt create mode 100755 transcripts/85-anvil/1.txt create mode 100755 transcripts/85-anvil/10.txt create mode 100755 transcripts/85-anvil/11.txt create mode 100755 transcripts/85-anvil/12.txt create mode 100755 transcripts/85-anvil/13.txt create mode 100755 transcripts/85-anvil/14.txt create mode 100755 transcripts/85-anvil/15.txt create mode 100755 transcripts/85-anvil/16.txt create mode 100755 transcripts/85-anvil/17.txt create mode 100755 transcripts/85-anvil/18.txt create mode 100755 transcripts/85-anvil/19.txt create mode 100755 transcripts/85-anvil/2.txt create mode 100755 transcripts/85-anvil/20.txt create mode 100755 transcripts/85-anvil/21.txt create mode 100755 transcripts/85-anvil/22.txt create mode 100755 transcripts/85-anvil/23.txt create mode 100755 transcripts/85-anvil/24.txt create mode 100755 transcripts/85-anvil/3.txt create mode 100755 transcripts/85-anvil/4.txt create mode 100755 transcripts/85-anvil/5.txt create mode 100755 transcripts/85-anvil/6.txt create mode 100755 transcripts/85-anvil/7.txt create mode 100755 transcripts/85-anvil/8.txt create mode 100755 transcripts/85-anvil/9.txt create mode 100755 transcripts/88-home-inventory-app/1.txt create mode 100755 transcripts/88-home-inventory-app/2.txt create mode 100755 transcripts/88-home-inventory-app/3.txt create mode 100755 transcripts/88-home-inventory-app/4.txt create mode 100755 transcripts/88-home-inventory-app/5.txt create mode 100755 transcripts/88-home-inventory-app/6.txt create mode 100755 transcripts/88-home-inventory-app/7.txt create mode 100755 transcripts/88-home-inventory-app/8.txt create mode 100644 transcripts/900-appendix-pylang/1.txt create mode 100644 transcripts/900-appendix-pylang/10.txt create mode 100644 transcripts/900-appendix-pylang/11.txt create mode 100644 transcripts/900-appendix-pylang/12.txt create mode 100644 transcripts/900-appendix-pylang/13.txt create mode 100644 transcripts/900-appendix-pylang/14.txt create mode 100644 transcripts/900-appendix-pylang/15.txt create mode 100644 transcripts/900-appendix-pylang/16.txt create mode 100644 transcripts/900-appendix-pylang/17.txt create mode 100644 transcripts/900-appendix-pylang/18.txt create mode 100644 transcripts/900-appendix-pylang/19.txt create mode 100644 transcripts/900-appendix-pylang/2.txt create mode 100644 transcripts/900-appendix-pylang/20.txt create mode 100644 transcripts/900-appendix-pylang/21.txt create mode 100644 transcripts/900-appendix-pylang/22.txt create mode 100644 transcripts/900-appendix-pylang/23.txt create mode 100644 transcripts/900-appendix-pylang/24.txt create mode 100644 transcripts/900-appendix-pylang/25.txt create mode 100644 transcripts/900-appendix-pylang/3.txt create mode 100644 transcripts/900-appendix-pylang/4.txt create mode 100644 transcripts/900-appendix-pylang/5.txt create mode 100644 transcripts/900-appendix-pylang/6.txt create mode 100644 transcripts/900-appendix-pylang/7.txt create mode 100644 transcripts/900-appendix-pylang/8.txt create mode 100644 transcripts/900-appendix-pylang/9.txt create mode 100755 transcripts/91-sqlalchemy/1.txt create mode 100755 transcripts/91-sqlalchemy/10.txt create mode 100755 transcripts/91-sqlalchemy/11.txt create mode 100755 transcripts/91-sqlalchemy/12.txt create mode 100755 transcripts/91-sqlalchemy/13.txt create mode 100755 transcripts/91-sqlalchemy/2.txt create mode 100755 transcripts/91-sqlalchemy/3.txt create mode 100755 transcripts/91-sqlalchemy/4.txt create mode 100755 transcripts/91-sqlalchemy/5.txt create mode 100755 transcripts/91-sqlalchemy/6.txt create mode 100755 transcripts/91-sqlalchemy/7.txt create mode 100755 transcripts/91-sqlalchemy/8.txt create mode 100755 transcripts/91-sqlalchemy/9.txt create mode 100755 transcripts/94-guis/1.txt create mode 100755 transcripts/94-guis/2.txt create mode 100755 transcripts/94-guis/3.txt create mode 100755 transcripts/94-guis/4.txt create mode 100755 transcripts/94-guis/5.txt create mode 100755 transcripts/94-guis/6.txt create mode 100755 transcripts/94-guis/7.txt create mode 100755 transcripts/94-guis/8.txt create mode 100755 transcripts/94-guis/9.txt create mode 100755 transcripts/97-online-game-service/1.txt create mode 100755 transcripts/97-online-game-service/10.txt create mode 100755 transcripts/97-online-game-service/11.txt create mode 100755 transcripts/97-online-game-service/12.txt create mode 100755 transcripts/97-online-game-service/13.txt create mode 100755 transcripts/97-online-game-service/14.txt create mode 100755 transcripts/97-online-game-service/15.txt create mode 100755 transcripts/97-online-game-service/16.txt create mode 100755 transcripts/97-online-game-service/17.txt create mode 100755 transcripts/97-online-game-service/18.txt create mode 100755 transcripts/97-online-game-service/19.txt create mode 100755 transcripts/97-online-game-service/2.txt create mode 100755 transcripts/97-online-game-service/20.txt create mode 100755 transcripts/97-online-game-service/21.txt create mode 100755 transcripts/97-online-game-service/22.txt create mode 100755 transcripts/97-online-game-service/23.txt create mode 100755 transcripts/97-online-game-service/24.txt create mode 100755 transcripts/97-online-game-service/25.txt create mode 100755 transcripts/97-online-game-service/3.txt create mode 100755 transcripts/97-online-game-service/4.txt create mode 100755 transcripts/97-online-game-service/5.txt create mode 100755 transcripts/97-online-game-service/6.txt create mode 100755 transcripts/97-online-game-service/7.txt create mode 100755 transcripts/97-online-game-service/8.txt create mode 100755 transcripts/97-online-game-service/9.txt diff --git a/transcripts/00-intro/01a-what-is-100days_transcript_final.txt b/transcripts/00-intro/1.txt similarity index 100% rename from transcripts/00-intro/01a-what-is-100days_transcript_final.txt rename to transcripts/00-intro/1.txt diff --git a/transcripts/00-intro/09-julian-setup_transcript_final.txt b/transcripts/00-intro/10.txt similarity index 100% rename from transcripts/00-intro/09-julian-setup_transcript_final.txt rename to transcripts/00-intro/10.txt diff --git a/transcripts/00-intro/100days-marketing-video_transcript_final.txt b/transcripts/00-intro/100days-marketing-video.txt similarity index 100% rename from transcripts/00-intro/100days-marketing-video_transcript_final.txt rename to transcripts/00-intro/100days-marketing-video.txt diff --git a/transcripts/00-intro/10-bob-setup_transcript_final.txt b/transcripts/00-intro/11.txt similarity index 100% rename from transcripts/00-intro/10-bob-setup_transcript_final.txt rename to transcripts/00-intro/11.txt diff --git a/transcripts/00-intro/11-michael-setup_transcript_final.txt b/transcripts/00-intro/12.txt similarity index 100% rename from transcripts/00-intro/11-michael-setup_transcript_final.txt rename to transcripts/00-intro/12.txt diff --git a/transcripts/00-intro/12-platform_transcript_final.txt b/transcripts/00-intro/13.txt similarity index 100% rename from transcripts/00-intro/12-platform_transcript_final.txt rename to transcripts/00-intro/13.txt diff --git a/transcripts/00-intro/01b-rules-of-100days_transcript_final.txt b/transcripts/00-intro/2.txt similarity index 100% rename from transcripts/00-intro/01b-rules-of-100days_transcript_final.txt rename to transcripts/00-intro/2.txt diff --git a/transcripts/00-intro/02-what-well-cover-short_transcript_final.txt b/transcripts/00-intro/3.txt similarity index 100% rename from transcripts/00-intro/02-what-well-cover-short_transcript_final.txt rename to transcripts/00-intro/3.txt diff --git a/transcripts/00-intro/03-why-python_transcript_final.txt b/transcripts/00-intro/4.txt similarity index 100% rename from transcripts/00-intro/03-why-python_transcript_final.txt rename to transcripts/00-intro/4.txt diff --git a/transcripts/00-intro/04-course-flow_transcript_final.txt b/transcripts/00-intro/5.txt similarity index 100% rename from transcripts/00-intro/04-course-flow_transcript_final.txt rename to transcripts/00-intro/5.txt diff --git a/transcripts/00-intro/05-meet-instructors_transcript_final.txt b/transcripts/00-intro/6.txt similarity index 100% rename from transcripts/00-intro/05-meet-instructors_transcript_final.txt rename to transcripts/00-intro/6.txt diff --git a/transcripts/00-intro/06-python-primer_transcript_final.txt b/transcripts/00-intro/7.txt similarity index 100% rename from transcripts/00-intro/06-python-primer_transcript_final.txt rename to transcripts/00-intro/7.txt diff --git a/transcripts/00-intro/07-source_transcript_final.txt b/transcripts/00-intro/8.txt similarity index 100% rename from transcripts/00-intro/07-source_transcript_final.txt rename to transcripts/00-intro/8.txt diff --git a/transcripts/00-intro/08-3-devs_transcript_final.txt b/transcripts/00-intro/9.txt similarity index 100% rename from transcripts/00-intro/08-3-devs_transcript_final.txt rename to transcripts/00-intro/9.txt diff --git a/transcripts/01-datetimes/1.txt b/transcripts/01-datetimes/1.txt new file mode 100644 index 00000000..bc4556d0 --- /dev/null +++ b/transcripts/01-datetimes/1.txt @@ -0,0 +1,15 @@ +00:00 Good day, this is Julian Sequeira +00:02 and welcome to the course. +00:03 We're going to open things up with playing with datetimes. +00:07 Probably not the most interesting thing for most of us +00:10 and if you're like me, you probably hate it +00:13 because they can be very finicky. +00:15 So, with datetimes I wanted to run us through +00:19 some of the more basic concepts of it. +00:21 Just go with it, there will be more advanced stuff coming up +00:25 but for now we're going to stick with +00:26 just the basics to get you through with datetimes +00:29 specifically around datetimes.date +00:33 and then datetimes.timedelta. +00:36 So, we'll flick through into that, +00:38 carry on, and let's get started. diff --git a/transcripts/01-datetimes/2.txt b/transcripts/01-datetimes/2.txt new file mode 100644 index 00000000..068674ad --- /dev/null +++ b/transcripts/01-datetimes/2.txt @@ -0,0 +1,34 @@ +00:00 Right a quick overview of what we're doing for the next +00:03 couple of days. +00:04 For the first day of your datetimes lessons you're going to +00:08 watch the videos, okay? +00:10 A couple of videos for you to watch to do with datetime, +00:12 date, and timedelta. +00:15 Alright after you've done, after you've completed watching +00:17 the videos go ahead and just play around in the shell. +00:21 So do some timestamp calculations as per the content +00:25 in the videos. +00:26 So we won't dwell on that too much. +00:28 The second day I want you to head to our challenges, +00:32 our challenges platform I should say and sign up with your +00:36 GitHub account. +00:37 It's free and then follow this link here and this will +00:40 unlock this datetimes challenge, okay? +00:46 This bite here is going to be based around parsing dates +00:50 from logs. +00:52 Okay so have a play with it, code in the browser +00:55 and have fun. +00:56 That's your day two. +00:58 Then day three. +01:00 That is all going to be up to you. +01:02 Create something for yourself. +01:04 I reckon you should give a Pomodoro timer a chance. +01:08 Use datetime for it. +01:10 I know you can just use a time module for these +01:12 examples here but the idea is to include some timestamps. +01:16 Do some calculations and see what you can wrap around date +01:19 time okay so the Pomodoro timer is quite simple. +01:24 You can do that or you can do a stop watch. +01:26 Anything like that. +01:28 So if you have any ideas yourself now is your time to +01:30 test it out on day three. diff --git a/transcripts/01-datetimes/3.txt b/transcripts/01-datetimes/3.txt new file mode 100644 index 00000000..8e4d9e60 --- /dev/null +++ b/transcripts/01-datetimes/3.txt @@ -0,0 +1,142 @@ +00:00 Given datetime is part of the Python standard lib, +00:04 we don't actually have to do any setup here. +00:07 You'll see in the coming videos +00:09 that you will have to do setup steps, +00:12 create virtual environments and whatnot, +00:14 but given this is datetime, we don't really have to. +00:17 And, I think it'd be best for us to just work +00:20 in the Python shell here. +00:21 This is IDLE, the default Python IDE +00:25 that it ships with. +00:27 So, let's have a play with that. +00:29 Now, the first thing we're going to do +00:31 is we're going to import datetime. +00:34 But, we're actually going to do +00:37 from datetime import datetime, okay? +00:44 And, this is just going to make it a bit easier for us +00:46 when we're typing in the rest of our code. +00:48 And, just to get yourself prepared, let's just +00:52 from datetime import date +00:54 that's for a bit later in this video. +00:58 Alright so what is datetime, alright. +01:00 For those who are unaccustomed and unaware +01:03 datetime is just the Python library module that allows +01:07 you to deal with dates and times. +01:11 Pretty self-explanatory, right? +01:14 So, if you want to deal with just the dates +01:18 so, you know, today's date, let's call it +01:21 the 23rd of February 2018, not very specific. +01:26 Or if you want to deal with the time +01:29 that you've got to think about that +01:30 from a programming perspective, there is a difference, okay. +01:35 So, datetime allows us to deal with +01:38 the entire time set, the entire timeframe. +01:41 You're talking seconds, minutes, hours, days +01:44 all the way through to years, okay? +01:47 We can visualize that with datetime.today(). +01:52 If we hit enter, there we go, we can see today's date. +01:57 The 24th of February 2018 +02:01 but we also get this timestamp. +02:03 It's 10:17pm +02:05 and these are the extra seconds here. +02:08 So seconds, milliseconds and whatnot, okay? +02:12 Now I'm going to show you this, what kind of an object is this? +02:16 Well let's go, well first actually we have to assign that +02:20 to something that way so, we'll just go with today. +02:24 Here's datetime.today() +02:28 alright and then we'll type it out, so type today. +02:32 So it's a datetime object, okay? +02:35 And that's important because you can't mix these objects. +02:39 I'll point that out in just a minute. +02:42 So with this timestamp, there is more you can do with that. +02:46 And I'll show you that in the next video with timedelta. +02:51 Alright, but for now just understand that this is what your +02:53 standard datetime format will look like. +02:56 This is the sort of data you're going to get back. +02:59 And this is really useful for times when you want to +03:03 deal with say, subscriptions or anything like that +03:06 where it has to do with exact timestamps, or logging +03:10 or anything where you need to know +03:13 the time that something happened. +03:15 Going by the date of say, the 24th of February +03:19 is not accurate enough, okay, there is 24 hours +03:22 within that day so, a lot of things could have happened. +03:25 Alright, so we'll move on to the date part here. +03:30 So we'll just go today date, we'll create that variable. +03:34 Here's date.today(), so you can see straightaway +03:38 we're not using datetime, we're using the date section +03:43 okay, we're using the date option here. +03:45 So date.today() +03:48 and if we type that out +03:53 Today date, we can see +03:56 the different type of object here. +03:58 First one was a datetime and now it's a date object, okay? +04:04 And we can see what that looks like with today date. +04:09 And we have just the date string, okay? +04:12 So we don't have the extra time on the end. +04:15 And this is, again, very useful. +04:18 So you can see the distinction between the two of them. +04:21 Alright let's get ourselves a little bit of white space. +04:25 Now one really cool thing that I love about date +04:30 is that we can drill into it a little more, so we can go +04:36 today.month is 2. +04:41 So you can see we can actually tear it apart a bit. +04:44 So today.day +04:47 is 24 and then +04:51 today.year, and we get 2018. +04:57 So now you can sort of visualize how date can help you +04:59 in your projects, right, if you're not already using it. +05:03 It's actually really cool. +05:04 So one really, really cool thing that +05:07 has come in handy over time, +05:10 is the fact that you can do +05:11 a bit of math with your dates, alright. +05:15 So we'll go, let's just go something easy. +05:18 So Christmas, what's the date for Christmas? +05:21 It's the, we'll go year first, so 2018. +05:25 It's the month next, so 12. +05:29 And then it's the day, so 25th, alright. +05:35 Now one thing, if you had a look, this is ... +05:40 us specifying a date, this is us +05:42 assigning a date to a variable. +05:45 So now the Christmas variable is always going to +05:50 have this date assigned to it. +05:54 You can see that there, okay. +05:57 Now, this is really cool, so +06:00 We can actually go Christmas, cause we know that's +06:04 the end of this year, minus, today date. +06:10 Kay, and that's 304 days, it automatically called +06:15 on timedelta, so that's giving away something for the next +06:18 video but, carry on, 304 days. +06:22 Alright, and we can see that visualized a different way. +06:25 We can, and this is again giving more away +06:27 we can go Christmas +06:31 minus today +06:35 in days, so .days. +06:39 304 days, alright and this is really cool for something +06:43 such as this, I'm just going to copy and paste here +06:46 rather than type it all out for you, alright. +06:50 So if Christmas is not today date +06:55 well what can we do? +06:56 We can print a certain message. +06:58 Again, you can see this is useful for certain other projects +07:03 so print, sorry there are still this many days +07:09 (christmas minus today).days, until Christmas. +07:13 Okay, and then else ... +07:16 We'll copy and paste this as well. +07:20 We're going to print some sort of message, alright. +07:25 "Yay, it's Christmas." +07:27 So, by hitting enter, sorry there are still 304 +07:32 the same value here, until Christmas. +07:35 I've obviously left out the word 'days' +07:37 so that's my mistake, but +07:38 sorry there are still 304 days until Christmas. +07:42 If I happen to wait another, you know, ha ha ha ha +07:46 that many days, 304 days +07:48 we would then get this message here. +07:51 So this is date and this is datetime. +07:54 Very, very tedious at times, I want to say +07:59 but so useful, so this is a great place to start +08:02 manipulating your code, manipulate your dates +08:06 and have some fun with it. +08:08 And in the next video we're going to look at datetime. diff --git a/transcripts/01-datetimes/4.txt b/transcripts/01-datetimes/4.txt new file mode 100644 index 00000000..32a1725b --- /dev/null +++ b/transcripts/01-datetimes/4.txt @@ -0,0 +1,119 @@ +00:00 Okay, just like the previous day, +00:02 we're going to look at something +00:04 but we're going to use the Python shell for this one. +00:06 And specifically today we're looking at timedelta. +00:11 So what is timedelta? +00:12 Well, timedelta is pretty much a gap in time measured out. +00:18 So, for example, if you want to calculate something such as +00:22 how many hours from now until a certain point in time, +00:25 you can use timedelta for that to specify +00:28 what it's going to be. +00:30 A real world example. +00:31 How many hours until I go to bed? +00:33 Well, let's say it's going to be four hours. +00:36 So my timedelta, you can specify for this calculation, +00:40 is four hours. +00:42 And four hours from now could be two in the morning, okay? +00:46 So it's different... +00:49 That's how you calculate things like that, +00:51 you use timedelta. +00:53 All right, so how do we do that? +00:55 Well, we go from datetime import datetime just like usual, +01:01 from datetime import timedelta. +01:06 All right, so let's represent our timedelta as a variable t +01:12 timedelta and let's work on days and hours. +01:17 So let's say we have four days and 10 hours +01:20 until my next day off work, it's pretty depressing. +01:24 And how do we deal with this? How do we work with this? +01:28 Well, let's first of all confirm we have a timedelta +01:31 object there, excellent. +01:33 And what next? What can we do with this? +01:36 Well, we can go how many days in there. +01:38 So t.days. +01:41 That gives us four days, okay? +01:44 One important thing to note here, watch this next one. +01:48 T.seconds. +01:50 36,000. +01:51 So 36,000 seconds is not four days 10 hours. +01:58 36,000 seconds is just the 10 hours. +02:02 And why is that? +02:03 Well, this timedelta is just like... +02:07 Imagine the stopwatch on your watch, +02:10 it's only able to go up to a certain amount of time, right? +02:12 Maybe 23 hours and 59 minutes. +02:15 So with timedelta, the seconds, it's only able to go up +02:19 to a maximum of one day, okay? +02:23 So we have four full days here, +02:26 so it's not going to show us the seconds in four full days. +02:29 It's only going to show us the seconds in the hours. +02:33 So you have to take that into account and your calculation. +02:36 Okay? +02:38 We could calculate the hours but not like this. +02:43 Okay? +02:44 It doesn't allow us to do this because it has seconds, +02:46 it's not going to bother with hours, all right? +02:50 So in order to get around this, +02:52 well, you have to do a bit of maths, +02:53 unfortunately for people like me. +02:56 So t.seconds divided by 60 +03:01 and divided by 60 again. +03:03 Well, because we have 60 seconds in a minute +03:06 and then 60 minutes in an hour. +03:08 And that gives us that 10 hours. +03:10 Alternatively, you could write that as t.seconds +03:14 / 3,600. +03:16 Same thing, okay? +03:19 That's a really important gotcha +03:21 because it definitely got me. +03:25 back at the start. +03:26 So here is an example of a sort of scenario +03:30 you could use it in, +03:31 but just keep in mind, timedelta is that gap, +03:35 it's that sort of way of representing the time +03:38 between two points in time, okay? +03:42 All right, so we have an ETA. +03:44 Well, let's just say it's the ETA until +03:49 I wake up. +03:50 So hours equals six. +03:53 We're not even going to talk days here, okay? +03:57 We can go today. +03:59 We'll give ourselves a datetime today, variable, okay? +04:04 We're not dealing with just date, +04:06 we're dealing with day time because we want the time, +04:08 we want the minutes, the seconds, the hours, right? +04:11 So there we go, we've got two variables, ETA and today. +04:16 All right? So today, let's just show you what that is. +04:19 It's currently 10:39 p.m., okay? +04:25 Let's get rid of that. +04:28 All right. +04:29 We can go what is ETA? +04:32 Is our timedelta, all right? +04:35 Now, what next? +04:38 We want to add these two together, okay? +04:42 So we can go today + ETA, +04:46 this is the beauty, the absolute beauty of timedelta, +04:51 we can just add it straight to a datetime object +04:55 which is so cool and so handy and it makes it so easy. +05:00 So today plus ETA. +05:03 And look at that time. +05:05 It actually changed the date to the 25th +05:09 because we'd cross over midnight +05:11 and it says six hours from now is 4:39 a.m., okay? +05:17 And this is really, really cool +05:19 because you don't have to worry about any conversions, +05:21 you don't have to change anything. +05:24 It's so easy. +05:25 And even better than that, +05:27 we can format it, so today + ETA as a string. +05:34 Look at that, it's glorious. +05:37 We have an actual nicely formatted date string +05:42 and time stamp. +05:45 How awesome is that? +05:47 And that's timedelta, +05:49 that's really the bread and butter of timedelta. +05:51 You're dealing with just setting yourself a static time, +05:55 a static amount of time +05:56 and then you can add it, subtract it, +05:58 do whatever you want with it. +05:59 And this is really useful in a lot of programs, +06:03 so keep this one in your belt diff --git a/transcripts/01-datetimes/5.txt b/transcripts/01-datetimes/5.txt new file mode 100644 index 00000000..5d7a7132 --- /dev/null +++ b/transcripts/01-datetimes/5.txt @@ -0,0 +1,77 @@ +00:00 Okay, and that was the basic overview +00:02 of datetimes. +00:04 How cool was that? +00:05 Not too bad, not too hard. +00:06 Nice way to start your #100DaysOfCode on Python, right? +00:10 Alright, so let's do a quick recap of what we covered. +00:13 There wasn't a lot so this will be pretty quick. +00:16 So we began by importing datetime and date. +00:19 And we then started to look at the differences +00:22 between datetime and date. +00:24 So a datetime object, well when we ran datetime.today(), +00:28 it included the date and the time, +00:31 so we had a timestamp in that object. +00:34 Whereas when we ran that with just date, +00:37 we only get the actual date, the calendar date. +00:40 So we the 19th of February 2018, alright. +00:44 And we found that you can't actually easily combine the two, +00:48 do maths between the two. +00:50 Okay, not without a lot of conversion. +00:55 First we gave ourselves a Christmas variable, +01:00 and we gave it its' actual date, +01:02 which is something you can do with date. +01:04 You can assign an actual date to an object. +01:08 Once we did that, we were then actually able to calculate +01:12 the amount of days between Christmas and the current date. +01:16 So that was just a bit of a little scenario +01:18 for you to use datetime and date. +01:21 Okay, next we played with timedelta. +01:27 Now we began by importing timedelta +01:29 and then we gave ourselves a timedelta object. +01:33 So we set the timedelta length as 4 days and 10 hours. +01:39 Then we discussed the fact that you can view your timedelta +01:44 in those days and you can view it in seconds, +01:49 but you can't view it in hours, okay. +01:52 And that's because it only works in days and seconds. +01:55 And the seconds only go up to a max +01:57 of the 24 hours of a day. +02:00 They expect you to do the calculations yourself. +02:04 And that's what we see here. +02:07 t.seconds / 60 / 60, +02:10 and then we get our ten hours, okay, matches up there. +02:15 As a little scenario to try, we wanted to look at the ETA. +02:20 We wanted to add the estimated time of arrival +02:23 onto the current time. +02:26 So the current time plus six is that there, +02:31 that's the object there. +02:33 That's the response there I should say, the calculation. +02:37 And we were able to add and subtract +02:39 timedelta from datetimes which is really, really cool +02:45 and makes it really easy. +02:48 And using string on that, converting it to a string, +02:51 we got a really nicely formatted timestamp here. +02:55 Very useful for log files right. +02:58 Alright, your turn. +03:02 This is where it gets a lot of fun. +03:04 What I'd like you to do for day three +03:06 is come up with something cool for you to make +03:09 with datetime or timedelta. +03:12 Think about perhaps making it a stopwatch, +03:16 maybe a timer application. +03:19 I actually think a really fun one to make +03:20 would be a Pomodoro timer. +03:22 So if you're not familiar with Pomodoro, +03:23 just go and google it. +03:25 But that would be a really cool way +03:27 of setting specific timestamps that a user could choose +03:32 using datetime and what have you. +03:34 So that would be really, really fun. +03:36 Now I know what you're thinking, +03:37 datetime is a really deep and in-depth topic, +03:41 but unfortunately we just don't have the time +03:45 to run it in this course. +03:48 So I hope you really enjoyed it. +03:50 Move onto the next video, +03:51 we are keeping it nice and simple for the first day. +03:54 Expect things to take it up a notch going forward. +03:57 So enjoy, get cracking, don't waste any time. diff --git a/transcripts/04-collections/1.txt b/transcripts/04-collections/1.txt new file mode 100644 index 00000000..15880450 --- /dev/null +++ b/transcripts/04-collections/1.txt @@ -0,0 +1,19 @@ +00:01 Welcome back to the 100 days of Python. +00:03 In the coming three days I will guide you +00:04 through the collections module, +00:06 a very convenient module +00:08 to work with more advanced data structures. +00:10 First we look at namedtuples +00:12 and how they can make your code +00:13 more readable and elegant. +00:15 Next we look at defaultdict, +00:17 which is convenient to build up +00:18 a nested data structure. +00:20 Third, counter, saves a lot of code +00:22 to find the most common thing in a collection, +00:26 and lastly, deque, which can tremendously improve +00:29 your performance based on the operations +00:31 you want to do on your sequence, +00:33 and for the second and third day +00:35 I got a movie dataset +00:36 where you can put the collections module into practice. diff --git a/transcripts/04-collections/2.txt b/transcripts/04-collections/2.txt new file mode 100644 index 00000000..cbf31b13 --- /dev/null +++ b/transcripts/04-collections/2.txt @@ -0,0 +1,33 @@ +00:00 Get Pythonic with a collections module. +00:03 We are all familiar with dict, list, set, and tuple. +00:05 The collections module +00:07 adds a few other specialized ones that are very useful. +00:12 Let's import the modules we're going to use. +00:20 A namedtuple is a convenient way +00:22 to define a class without methods. +00:24 We all familiar with a normal tuple, +00:28 which you can define with parenthesss, +00:30 and one or more elements. +00:35 The thing with the classic tuple, +00:36 though, is that the order is not +00:38 really meaningful, so if you print +00:43 the user name and the user role, +00:48 user index zero is a user index one, +00:54 and you already notice that the indexing +00:56 is not really saying that much. +00:59 Is there a more readable way +01:00 to define these kinds of tuples? +01:04 And yes, you can use a namedtuple, so let's define one. +01:08 User equals namedtuple, and you give it a name, +01:14 and the fields or arguments it takes, so name and role. +01:22 And let's create a user, +01:27 with user and I give it a name +01:32 Bob and role equals coder. +01:36 The nice thing, then, is that you can +01:38 access the entries like this, instead of +01:41 indexing with zero, one, etc. +01:44 So this is much more meaningful +01:49 And to see that in a print statement. +01:57 So, use namedtuples. +02:00 It's very easy to set up, +02:02 and it definitely makes your code more readable. diff --git a/transcripts/04-collections/3.txt b/transcripts/04-collections/3.txt new file mode 100644 index 00000000..24b0f926 --- /dev/null +++ b/transcripts/04-collections/3.txt @@ -0,0 +1,56 @@ +00:00 A second data type I want to show you, +00:02 today about, is defaultdict. +00:05 And it's very useful when you're building up a nested data +00:09 structure and you have to account for keys not being there. +00:14 Now first of all, what's the problem with keys? +00:16 Let's define a very simple dictionary, +00:20 just one user and role, +00:22 and let's do a lookup by key. +00:24 So... +00:26 Bob is there. +00:28 Julien is... +00:30 Oops, not there and that gives you a key error. +00:33 There's a way around it by using users get. +00:38 Oop, get Bob.. +00:41 and users get... +00:44 Julien... +00:46 which returns none. +00:49 But how do you deal with that +00:51 when you're building up a collection? +00:53 Now let's get some data. +00:54 I'm going to define a list of tuples. +00:57 A challenge is done. +01:00 And it has... +01:03 tuples of name, +01:06 and a number of the challenge that has been completed. +01:12 Let me type that out. +01:17 So the goal is to convert this into a dictionary. +01:20 Let me show you what happens if I use a normal dictionary. +01:25 For name challenge in... +01:28 challenges done. +01:32 Challenges dictionary... +01:34 name append... +01:38 challenge. +01:40 Oops, it says Mike is not in the dictionary. +01:43 In the first round, he is indeed not in the dictionary. +01:48 So here is where is you really want to use a defaultdict. +01:52 So to define one, challenges... +01:57 Equals defaultdict, and you need to define +02:01 what type the values hold. +02:02 So in this case, the key is the user +02:06 and the value is a list of challenge numbers. +02:10 So I put list here and the rest is kind of the same. +02:13 For name challenge in challenges done. +02:19 Challenges... +02:22 Name... +02:23 append... +02:25 challenge. +02:27 I'm almost sure this works. +02:29 So, yes, we have a defaultdict which holds lists +02:33 and here you see keys are Bob, Julien, and Mike +02:36 and values are list of challenge ids. +02:41 So you see here, we work around the key error. +02:44 The defaultdict has the mechanisms to use a factory +02:49 to initialize the data type that the values need to hold +02:52 and yes, it's safer, it's cleaner, and for this type +02:57 of task, I highly recommend that you use this data type. diff --git a/transcripts/04-collections/4.txt b/transcripts/04-collections/4.txt new file mode 100644 index 00000000..9b41b544 --- /dev/null +++ b/transcripts/04-collections/4.txt @@ -0,0 +1,21 @@ +00:00 Let's move on with Counter. +00:02 Let's say we have a text which is split into words, +00:06 and we want to count the most common words. +00:11 Before I knew about collections, +00:14 I would write something like this. +00:26 There you go. +00:28 I had to loop over words, keep a dictionary, +00:32 see if the key was in the dictionary, +00:35 if not, initialize to zero. +00:38 If it's in there do plus one. +00:39 Then I had to loop over the items over the key value pairs, +00:45 sort them and use lambda to sort by value. +00:49 In reversed order and take a slice to get it to five. +00:53 Now compare that with using Counter, +00:55 and its most common method. +01:00 It's like magic, right? +01:02 One line of code, you pass the words list into the Counter, +01:06 and you call most common and you give the number +01:09 of top words you want to see and compare that +01:13 with all the work I had to do here and how easy it gets +01:17 by using the collections, Counter. diff --git a/transcripts/04-collections/5.txt b/transcripts/04-collections/5.txt new file mode 100644 index 00000000..cefcec37 --- /dev/null +++ b/transcripts/04-collections/5.txt @@ -0,0 +1,20 @@ +00:00 So a quick overview of we've learned so far, +00:02 namedtuples, an elegant and readable way to create tuples, +00:07 and instead of user index zero, and index one, +00:10 you can say user.name and user.role. +00:13 A defaultdict is great way +00:15 to buildup a nested data structure, +00:18 you don't get key errors, because the internals +00:20 make sure that the value gets initialized +00:23 before appending to it. +00:25 Counter, don't reinvent the wheel, +00:28 so here at the top you see all the code +00:30 I needed to get the top five words in a string, +00:34 and below we did the same, +00:35 but only with one line of code, very powerful. +00:38 A deque, so lists are your best friend, +00:41 but if you have to insert at them at the start, +00:45 for example, they get very slow. +00:48 So deques are great if you need to insert +00:50 and remove at both ends of the sequence. +00:52 And now it's your turn. diff --git a/transcripts/04-collections/6.txt b/transcripts/04-collections/6.txt new file mode 100644 index 00000000..3b6f369a --- /dev/null +++ b/transcripts/04-collections/6.txt @@ -0,0 +1,66 @@ +00:00 Next up are deques. +00:02 deques are stacks and queues. +00:04 They're useful if you want to insert and append +00:08 on both sides of the sequence. +00:10 In this section, I will compare them to lists. +00:12 I mean, lists are your best friends. +00:14 You will use them everywhere. +00:15 They're easy to use and for 80% of your use cases, +00:19 or maybe 90%, they're just adequate. +00:22 But lists come with a downside which if you have +00:25 to move items around, they get less performant. +00:28 And in this exercise, I will create a list and a deque +00:32 of ten million ints and a function to do random inserts +00:36 and deletes and then we're going to use timeit, +00:39 to see how they perform. +00:41 So let's create the two sequences. +00:44 First I want a list. +00:47 I can just use the range. +00:50 Let me the get the zeros right. +00:52 One, two, three, one, two three. +00:54 That's ten million. +00:56 And let's make a deque. +00:58 You create that big deque. +01:01 Range, one, two, three, one, two three. +01:05 Next, we create an insert and delete function +01:11 that takes a sequence... +01:14 and we do, for... +01:18 Underscore... +01:19 In braces.. +01:21 Index equals random... +01:24 Choice. +01:29 And a random choice takes a sequence +01:33 and just randomly chooses one item. +01:36 I store that into index +01:38 and I remove it. +01:42 So that index is like a random location in the sequence. +01:46 I'm going to remove the item that's at that index. +01:51 And I'm going to do an insert of index +01:55 at index and I'm just going to insert +01:58 the same value of index, doesn't really matter. +02:01 I'm going to use timeit to time this function +02:05 for both the list and the deque. +02:07 Here we have the timeit module. +02:10 And we're going to call it with insert and delete +02:14 on the list, and the list we defined here above. +02:21 You can see this took a little bit. +02:24 And now let's do the same for the deque +02:29 which we defined here. +02:35 And although it seems to take a little bit as well. +02:38 Here we're talking about milliseconds +02:42 and here we're talking about microseconds. +02:45 Here it also run like 10,000 loops. +02:47 This one was slower so it reduced to one loop. +02:51 So deque performs at a fraction of the list +02:54 and that's because inserting and removing +02:57 at both sides of the sequence are more efficient +03:00 in a deque than a list. +03:02 A list has to move all the items around +03:05 and that's expensive. +03:06 I encourage you to look at the docs because there are a few +03:10 other data types that are interesting +03:13 and you can read about ChainMap, for example. +03:16 An OrderedDict is another good data type to know about. +03:19 Although I think in Python 3.6, +03:21 dicts are becoming ordered by default. +03:25 That concludes day one. diff --git a/transcripts/04-collections/7.txt b/transcripts/04-collections/7.txt new file mode 100644 index 00000000..ea6e14e8 --- /dev/null +++ b/transcripts/04-collections/7.txt @@ -0,0 +1,90 @@ +00:00 Welcome back to the 100 days of Python +00:02 and the second day of the collections module. +00:04 Today, we're going to get practical with a code challenge. +00:08 That will be highest rated movie directors. +00:12 We will load in a data set and convert it +00:14 into a default dictionary of directors as keys +00:18 and movie namedtuples as values. +00:20 If you want to try it yourself on scratch, +00:22 I encourage you to pause the video now +00:25 and read through this link and try to code it up yourself. +00:29 What I will do in the rest of this video, +00:31 is to guide you how to get the data loaded +00:34 into the directors variable. +00:36 So parse the CSV, convert it into defaultdict, +00:39 and also will have a Counter example, +00:42 how to get the directors with the most amount of movies. +00:46 So if you need some guidance, keep watching +00:48 but maybe you want to try it yourself first. +00:52 Welcome back. +00:53 I hope you had fun doing the other exercise. +00:56 In the next session, I will show you how to load +00:58 in the data and parse it into a defaultdict. +01:02 So we're going to load this data in +01:04 and the goal is to make a defaultdict +01:08 where the keys are the directors +01:10 and the values are a list of movies +01:13 and every movie will be stored in a namedtuple. +01:16 So let's define the namedtuple first. +01:22 We've defined a namedtuple called movie +01:24 with title, year, and score. +01:26 Those are the only fields I'm interested in for now. +01:29 We need to parse the CSV +01:32 and load the data into defaultdict. +01:34 I'm not going to touch too much upon the CSV part +01:37 because there's a whole lesson dedicated to that. +01:39 I will write out the function and come back +01:42 and comment it line by line. +01:52 And let's see if that works. +01:59 And let's get the movies of Christopher Nolan, +02:03 one of my favorite directors. +02:08 Wow. Look at that. +02:10 I can look up a director and I get a list of movies +02:14 and each movie is a name tuple with title, year, and score. +02:19 Okay, let's go back to the code I've just written. +02:22 We make a function and receives data +02:25 which by default is movies CSV which we retrieved here. +02:30 I initialize a defaultdict of lists called directors. +02:35 I open the data with a with statement. +02:39 Then I use the CSV dict reader to parse every line +02:43 into an OrderedDict. +02:44 Every line, I extract the director name, movie title, +02:48 title year, and IMDB score and store them in variables. +02:53 The year, I convert to int. +02:55 The score, I convert to float. +02:57 With data analysis, there's always bad data +02:59 and this is no exception. +03:01 A value error got raised for some rows. +03:03 So when that happens, I just ignore the row. +03:06 I'm not interested in incomplete data. +03:08 I initialize the movie namedtuple +03:10 and give it movie, year, and score. +03:12 That namedtuple gets appended +03:14 to the director in a directors named list. +03:17 So here you see the defaultdict in action. +03:19 I don't have to initialize an empty list +03:23 for every director up front. +03:25 defaultdict handles that all behind the scene. +03:27 And then I return the directors defaultdict. +03:30 Then I call the function and store the results +03:32 in the directors variable and then I can look up directors. +03:36 So there's a lot of stuff you can do with this data. +03:40 Let's do one more exercise. +03:42 I'm going to use Counter to find the directors +03:44 that have most movies in this dataset. +03:47 So I use a counter and I'm going to loop over... +03:53 the directors... +03:54 we stored before. +04:00 I can loop over dictionary with items +04:04 which gives me the value pairs. +04:06 Then I'm going to store the director... +04:11 in the counter object. +04:13 I'm going to sum up the length of the movies. +04:17 You can do this by hand, but the nice thing +04:20 of having a counter object that now I can do counter... +04:24 Most common. +04:27 Five. +04:28 And there you go. +04:30 Spielberg, Woody Allen, this is pretty plausible. +04:33 So here you got some more practice +04:35 using the collections data types. diff --git a/transcripts/04-collections/8.txt b/transcripts/04-collections/8.txt new file mode 100644 index 00000000..d32f50b3 --- /dev/null +++ b/transcripts/04-collections/8.txt @@ -0,0 +1,27 @@ +00:00 Welcome back to the 100 days of Python, +00:02 and the third day of the collections module. +00:05 Now it's time to get some more practice yourself, +00:07 so I encourage you to try to use +00:10 the new collection's data types in your scripts. +00:13 We did the #100DaysOfCode ourselves +00:15 and we made a module index script +00:18 which lists all the modules we used +00:21 and the days we used them, +00:22 so you can go to our log and look up those days +00:25 and look at the scripts that used the collections +00:28 in one way or the other. +00:30 This was the script to identify if a tip +00:32 was already submitted to pytip, +00:34 and here we use the name namedtuple. +00:37 And this was the script I was just showed you +00:38 about the module indexer, +00:40 and here we used defaultdict and Counter. +00:43 So you can look at more examples +00:44 for where we used those data types, +00:46 but maybe you can refer to some of your code +00:48 to start using collections more. +00:51 And don't forget to mention 100 days of Python +00:54 when you tweet out your progress. +00:56 That's a great way to keep on track. +00:58 Good luck, enjoy, and remember, +01:01 keep calm and code in Python. diff --git a/transcripts/07-data-structures/1.txt b/transcripts/07-data-structures/1.txt new file mode 100644 index 00000000..123f2116 --- /dev/null +++ b/transcripts/07-data-structures/1.txt @@ -0,0 +1,11 @@ +00:00 Good day everyone. +00:01 This is Julian Sequeira and welcome +00:03 to Python Data Structures. +00:05 So this series of lessons in going to walk you through +00:08 the basics of lists, tuples, and dictionaries. +00:13 So hopefully stuff you've seen before, +00:16 but this should be a good refresher. +00:17 There'll be a couple of videos to watch, +00:20 but then there'll be some exercises as well. +00:22 So, nothing left to say. +00:24 Let's get cracking. diff --git a/transcripts/07-data-structures/2.txt b/transcripts/07-data-structures/2.txt new file mode 100644 index 00000000..173015de --- /dev/null +++ b/transcripts/07-data-structures/2.txt @@ -0,0 +1,60 @@ +00:00 Here is your three-day breakdown +00:02 for this lesson. +00:03 It's actually pretty simple. +00:05 There's not much to it because we are dealing +00:07 with data structures. +00:08 Super important though, so very important +00:11 that you get this down. +00:13 For the first day, we're just going to watch the videos. +00:16 Okay, there's not too much involved with this. +00:19 Just watch the videos that we have +00:21 on lists, tuples, dictionaries, and then just have +00:25 a play in the Python shell. +00:26 There's really not much to do. +00:28 So digest the content in the videos +00:30 and then hang around for day two. +00:33 Now the second day, it gets a bit more interesting. +00:37 What I'd like you to do is follow this link here, +00:39 this bites of Py code challenges promotion link. +00:45 This will give you free access to this specific bite. +00:48 This is a little challenge for you. +00:51 We just open it in a new tab. +00:54 Okay, I will log in with GitHub. +00:57 So you have to have your GitHub account ready. +01:00 And there you go. +01:02 So I'm already a premium member obviously, +01:04 but this will unlock this bite for you to work on +01:09 if you are not already a premium member. +01:12 This here is regarding dictionaries. +01:14 So have a good play with this. +01:16 Enjoy the challenge. +01:18 Work on it in the command line within your browser +01:22 and do that for day two. +01:26 Back for day three, this gets a little more tricky. +01:29 What I'd like you to do is a bit different as well. +01:31 I'd like you to go into this data.py file +01:36 which is here in the repo. +01:37 And I'd like you to just have a quick look +01:39 at the dictionary and the lists that are in there. +01:43 It is pretty much a list of just the United States states +01:48 and the acronym used for them. +01:52 So what you can do then is complete each one +01:57 of these little tasks, okay. +02:00 It will involve you actioning or working against +02:04 the list in the dictionary, pulling out data +02:06 and just playing around with them. +02:09 So you'll need to pull them into some, +02:12 whatever script, import them to whatever script +02:14 you'll be running this from. +02:16 And just remember that dictionaries are unsorted +02:20 so that should make this a little more tricky. +02:22 Alright, so that's your day three. +02:24 Just playing around with that data.py file. +02:26 Obviously if you want to play around with it +02:28 in any other way, go ahead, feel free. +02:31 But this is just a couple of quick, +02:33 these are just a couple of quick tasks for you to do +02:36 that should give you around 15 or 20 minutes worth +02:39 of practice which is what we're aiming for. +02:42 So enjoy, these are your three days +02:44 and let's get on with the video. diff --git a/transcripts/07-data-structures/3.txt b/transcripts/07-data-structures/3.txt new file mode 100644 index 00000000..f430c703 --- /dev/null +++ b/transcripts/07-data-structures/3.txt @@ -0,0 +1,137 @@ +00:00 Lists are actually pretty simple. +00:02 They're probably one of the things you're +00:03 going to deal with the most in your Python journey +00:06 and the easiest way to demonstrate it is +00:09 to just create one right here of numbers. +00:13 So let's create a stereotypical list, all right. +00:17 We do that by using the square brackets +00:20 and we're going to create five entries in that list. +00:26 So this list contains five items. +00:29 Okay. Now, because we're dealing with numbers specifically, +00:32 we don't have to put the quotes around it, okay. +00:38 If we were dealing with strings that's what we do, +00:41 but we're dealing with just numbers +00:43 so let's just leave it plain like that. +00:46 So that's our numlist. +00:48 We'll just call it back so you can see what it looks like. +00:51 There you go. +00:53 So it's now a list of five numbers, okay. +00:55 1, 2, 3, 4, 5. +00:57 One of the cool things you can do +00:58 with a list is you can actually reverse it. +01:01 Okay. +01:02 So, now need to write some nifty code +01:04 that will go through, parse it, +01:06 and put all the values in back to front. +01:10 We can just do numlist.reverse() +01:13 Call numlist back and there you go, +01:16 5, 4, 3, 2, 1. +01:19 Now we can do that again. +01:25 Okay, and we're back to one, two, three, four, five. +01:29 Now, if we actually go back, +01:34 one thing we can do, is we can actually sort the list. +01:40 So numlist.sort(), okay. +01:45 And there you go 1, 2, 3, 4, 5 again. +01:47 And this is very handy because you can actually sort +01:49 with letters as well. +01:52 Now let's say we want to actually print out all +01:54 of the values inside num list. +01:57 How do we do that? +01:58 We can use a four loop, okay? +01:59 So we can go four num in numlist, print(str(num)). +02:08 So we hit enter and there are our five numbers, +02:12 1, 2, 3, 4, 5 +02:14 So it's pretty powerful. +02:15 There's with just this basic ideology you can get a lot +02:18 of stuff done in Python code. +02:22 Now one of the other ways you can actually create a list is +02:25 to call the list function against a certain string. +02:31 Let's say we have a string called - +02:33 we have a variable called mystring. +02:36 And we assign it to string Julian. +02:41 Okay, so mystring is Julian. +02:44 Well how do we convert that into a list? +02:46 We simply call list against it. +02:49 So list(mystring) is Julian. +02:53 And there you go, you see my name has just been chopped up +02:57 so that each letter, or each character I should say, +03:01 is now a string value inside this list. +03:06 Right. So, what can we do? +03:08 We can assign that so l = list(mystring). +03:16 So we're assigning this here to the variable l, alright. +03:23 And we'll just call that back. +03:25 And it's Julian. +03:26 Now what are some interesting things we can do with this? +03:28 Well, there's actually quite a lot. +03:30 We can actually reference the values +03:32 by their position, by their index, inside that list. +03:37 So we can go l[0] is J. +03:42 We can go l[4] is A. +03:47 You can see we got J there, we got A there. +03:51 Very handy. +03:52 What else can we do? +03:53 Well there are a few other functions we can call here. +03:55 We can go pop, and what pop will do it's actually going +04:00 to return the last letter from this list. +04:08 So, the letter N is going to be returned. +04:11 But at the same time, +04:13 it's going to be removed from the list. +04:16 So my name is now Julia. +04:18 Right. +04:21 We can then insert it back in. +04:23 And we use insert for that. +04:28 Now when we insert, we actually, +04:30 if you look at this tool tip here that's cheating, +04:33 you can see we have to specify an index and then the object. +04:37 So what position are we inserting the letter N +04:42 into this list? +04:43 Well, we're going to insert it into position 0, +04:47 1, 2, 3, 4, and 5 +04:51 5 is going to be on the end, so position five. +04:54 And what are we inserting? +04:55 We're inserting the letter N. +04:57 All right, it's an actual string. +05:02 Now when we call the list, there we go, +05:05 it's rebuilt with the letter N. +05:07 Another interesting this we can do is +05:09 we can actually replace any of these with any other letter. +05:15 So we can go l[0], which we know will actually return J, +05:20 but we can replace J. +05:22 So L[0] is going to be B. +05:30 So, l is now Bulian. +05:35 Okay? +05:36 Ya, a little play on words. +05:37 Let's go with that. +05:39 Now if we wanted to get rid of the B, +05:42 we could actually delete it or we could pop it. +05:45 The difference is, as I've said before, +05:47 pop will return the letter in that position, +05:53 where as now with the delete option +05:56 it will actually delete it. +05:58 You won't even know what you're deleting. +06:00 It doesn't return anything, it just deletes. +06:03 So if we want to delete that zero we just have +06:05 to type del(l[0] +06:13 and there's the B gone. +06:15 All right? +06:16 Next we can do l.insert(). +06:21 We'll choose index position zero. +06:24 And this time we'll put an M in. +06:28 l is now Mulian, okay. +06:31 And now, even better, with pop, +06:34 let's say we do want to return something, we can go l.pop(), +06:39 but now we can actually specify a position, an index. +06:43 So we can go l.pop(0), we get the M returned, +06:49 and the M has also been removed +06:51 from position 0 in the list. +06:54 So those are some cool little nifty tricks +06:57 you can keep up your sleeve, add them to your book, +07:00 because when it comes to lists, you'll end up dealing +07:02 with them quite a lot. +07:03 So knowing how to pop and how to delete and insert +07:07 and append, which is another one I'll show you quickly. +07:11 l.append(), let's add S. +07:21 We can append, append will always add right at the end +07:26 into the last position. +07:29 So definitely keep all of these handy. +07:31 You'll be using them quite a lot. diff --git a/transcripts/07-data-structures/4.txt b/transcripts/07-data-structures/4.txt new file mode 100644 index 00000000..02be9a54 --- /dev/null +++ b/transcripts/07-data-structures/4.txt @@ -0,0 +1,57 @@ +00:00 If you're learning Python +00:01 you're going to come across two words +00:02 that may or may not make sense to you, +00:04 and they are mutability, and immutability. +00:08 Okay, type them out on screen, +00:11 mutability, immutability. +00:17 And what do they mean? +00:18 Well, mutability means it's something that can be changed, +00:22 it's an object that can be changed. +00:24 You saw in the previous video that we were manipulating +00:27 the mystring variable, and we were dropping j, +00:32 we were dropping n, we were doing all sorts of things +00:35 to that list. +00:37 Now, immutable lists, okay, let's just go with that +00:41 for one second, are lists that cannot be edited, +00:45 so if you tried to edit it, if you tried to +00:48 pop out that j, or pop out that n, +00:51 you'd actually get an error, +00:52 and they're not actually called lists, +00:54 they're called tuples, okay, you've probably heard +00:58 that terminology by now, but we're just covering it again, +01:01 and I'll just quickly demonstrate +01:02 the difference between the two. +01:04 So we're going to say l, again, for list, is +01:10 a list of mystring, so we can see mystring is my name, +01:15 okay, and t for tuple +01:18 is a tuple of mystring. +01:22 So let's just show what the two of them look like. +01:26 And the big difference here is you've got +01:28 the square bracket versus the rounded bracket, +01:33 and that's the telltale sign +01:34 that you're dealing with a tuple, okay? +01:37 Now watch what happens when we try to edit the two, +01:41 okay, we can go, l, let's actually overwrite, +01:45 just like we did in the last video, so, +01:47 l[0], we're going to assign the word, +01:52 or the letter, T, so my name +01:56 is now Tulean, no that wasn't a name I was called in school, +02:01 so don't laugh, and now if we try and do that to the tuple, +02:05 we can go t[0], +02:09 is, let's just go with the B from the other video, +02:15 and we get this error. +02:17 Tuple object does not support item assignment, +02:20 and that's because the tuple is immutable, +02:23 we cannot edit it. +02:26 We can still talk to it, imagine a hard drive or something, +02:31 or your SD card in your camera is read-only, +02:34 that's pretty much what a tuple is, +02:36 so we can go t zero, we can return that, +02:41 you know, we can read it, we can talk to it, +02:43 we can iterate over it we can go, +02:45 four letter in t, +02:51 print letter. +02:56 And there we go, we can still iterate over it, +02:58 just like we do with the list, the difference is, +03:01 we can't edit it, and that is what a tuple is, +03:04 and that's a demonstration of immutability. diff --git a/transcripts/07-data-structures/5.txt b/transcripts/07-data-structures/5.txt new file mode 100644 index 00000000..3e34db2e --- /dev/null +++ b/transcripts/07-data-structures/5.txt @@ -0,0 +1,123 @@ +00:00 Alright. +00:01 Next up we're going to talk about dictionaries, +00:03 or dicts for short, +00:06 let's keep saying dictionaries, just to be safe. +00:09 And they're made up of pretty much two different things. +00:13 The easiest way to demonstrate it is to just create one +00:16 in its simplest form. +00:19 So we'll create a dictionary called pybites, +00:22 and let's just add a few things to it. +00:25 The first thing we need to add is a key, +00:29 and the second thing we need to add is a value. +00:32 Alright. +00:33 Looking at it here, there's a separator here, your colon. +00:37 And that separates your key, the key comes first, +00:40 from your value on the end. +00:43 Alright, and this here is technically a dictionary. +00:48 It may only have one item in it, but it's a dictionary +00:51 all the same. +00:52 Let's make it a little more interesting. +00:54 When you're adding a second item into your dictionary, +00:57 you separate it with a comma. +01:00 Alright, so we've got Julian, now let's add Bob, +01:05 and let's just say he's 33, then we have Mike, +01:09 let's say he's also 33. +01:12 Let's just say I'm being super generous with those ages +01:15 guys, anyway , there's our dictionary. +01:21 So to view what it looks like, we just type in, +01:24 pybites. +01:27 And there it is there, the three different items. +01:31 And these link to each other. +01:32 So the key is Mike, the value is 33. +01:36 The key is Bob, the value is also 33. +01:40 Now notice when we printed it out, it printed out +01:44 in this order. +01:47 Well this order is not explicit. +01:50 With a dictionary, when you're passing it, +01:53 when you're listing it out, when you're displaying it, +01:56 there's no guarantee that the data is going to remain +02:01 in the order, okay? +02:03 That's very important to remember with dictionaries, +02:05 they are unordered, okay? +02:10 Now let's say we wanted to create a dictionary +02:15 but we didn't know what values we were going to put into it +02:18 from the start. +02:19 We'll just do a quick little side track demonstration here. +02:22 You would start off just as you would do with a list +02:25 that's empty, except you're using two curly brackets +02:28 instead of the square ones. +02:32 So people is now an empty dictionary. +02:35 There's absolutely nothing in it. +02:37 To add someone to it, this is the tricky part, this is where +02:41 it gets a bit different. +02:43 What you need to do, you need to actually pretty much +02:46 in square brackets, you need to choose the key, alright? +02:52 In this instance the key for a list of people is going +02:55 to be Julian, and we're going to assign that key a value +03:00 of 30. +03:01 So the dictionary people, we're creating an entry, +03:06 a key, of Julian, and we're assigning it the value of 30. +03:11 We list out people, there we go, we see that exact same +03:18 formatted dictionary as we did when we explicitly +03:22 defined it up here, okay? +03:24 We can add to it again. +03:26 We can go, people, Bob, and we can assign Bob +03:34 the age this time of 103. +03:39 And there we go. +03:42 So same thing, right? +03:45 This time we just populated an empty dictionary. +03:48 But either way it all comes out the same. +03:51 Now the way you interact with the dictionaries is a bit +03:53 different to lists. +03:56 The way we view just the keys, just these keys here, +04:01 forget the values for a minute, +04:02 is we use keys. +04:05 So we can go pybites.keys, and there are our +04:10 dictionary keys. +04:12 Julian, Bob, Mike. +04:14 The same things for the values. +04:16 pybites.values, and there we go, the three values. +04:20 30, 33, and 33. +04:23 Now what if we wanted to see all of this? +04:26 Now this is all well and good because we're in the shell. +04:29 But if this was an actual application you can't just +04:31 type in the name of your dictionary and expect it +04:34 to print out, right? +04:35 This is just all standard out through the shell. +04:39 So the way we would actually print out, first of all, +04:42 the way we actually see each pair of dictionary items +04:48 is to use items(). +04:53 We can see Julian 30, Bob 33, Mike 33. +04:59 These are our three different dictionary key value +05:04 combinations or items. +05:06 Now how do we pass over all of that? +05:08 Well we do it just how we would with a normal list. +05:11 We can go for keys in pybites.keys, print keys. +05:22 There we go. +05:24 We can do for values in PieBites.values, print values. +05:33 Okay? +05:36 This is all very similar, you can see the similarities +05:39 between dictionaries and lists. +05:42 But last but not least, what if we want to print out +05:45 all of this information, not just keys, not just values, +05:48 without having to run two separate for loops, which would +05:53 be quite un-pythonic right? +05:55 Well, God love Python, we can go for keys values in +06:02 pybites.items(), so for keys and values in PieBites.items +06:10 Print keys, and remember we have to do the string thing +06:13 here, values, and there we go. +06:18 Julian 30, Bob 33, Mike 33. +06:22 Now obviously that is not very pleasant on the eye, +06:25 so we can do our standard string formatting. +06:28 So we can go, for keys, values in pybites.items(), +06:35 print, string is digit years of age, keys, values, okay? +06:53 And there we go. We can see Julian is 30 years of age, +06:56 Bob is 33 years of age, Mike is 33 years of age. +07:00 And that's dictionaries. +07:01 It's actually that simple to iterate over dictionary, +07:04 and that's pretty much it. +07:06 You've got your key, and your value. +07:09 And you just do it over and over again, +07:12 just like a list. +07:14 So enjoy your dictionaries, and get used to them, +07:17 because you'll be playing with them. diff --git a/transcripts/07-data-structures/6.txt b/transcripts/07-data-structures/6.txt new file mode 100644 index 00000000..9182e442 --- /dev/null +++ b/transcripts/07-data-structures/6.txt @@ -0,0 +1,70 @@ +00:00 So that's Python data structures. +00:02 I hope you enjoyed that little overview of lists, +00:05 tuples, and dictionaries. +00:07 For the next couple of days, you will be working +00:09 through the exercises outlined in the three-day overview +00:15 which was the second video for this lesson set. +00:18 But before we get to that, let's just quickly +00:20 quickly recap everything we've done. +00:23 So for lists, lists can be sorted with sort, go figure. +00:29 And then worked through how to iterate +00:31 over a list using a for loop. +00:35 We also discovered pop. +00:37 Okay, if we remember, pop just returns the item +00:40 in the index specified. +00:41 It actually removes it from your list +00:45 and then returns it. +00:47 del simply deletes it from the list, +00:50 doesn't even return it. +00:51 insert does exactly as its name implies. +00:55 It will insert the second argument +00:58 into the index specified in the first argument. +01:01 And then append will just tack whatever it is +01:04 right on to the end of the list. +01:08 Now immutable tuple, okay, we know that this means +01:12 we can't edit, it can't change, okay. +01:16 So we've got a tuple. +01:17 We've created it using tuple itself, okay. +01:21 Now we print out the contents just so you can see +01:24 that we have the six items in this tuple, my name, +01:30 the letters of my name. +01:31 And then when we try to manually override it +01:34 with a simple list substitution there, +01:38 t[0] we're going to assign the letter m +01:42 and then we get the fact that it's a type error, +01:45 it's a tuple. +01:46 You cannot change it, it's immutable, okay. +01:51 Now onto dictionaries. +01:52 We created it manually. +01:54 We manually created a dictionary, okay, simple. +01:58 And then this is how you return the keys using .keys. +02:02 Okay this is just the keys at the front, just the names. +02:07 Then we returned the values in the same way +02:09 that we do with the keys. +02:10 We can get just those values, the 30 and the 33s. +02:14 And then we can get everything as a whole. +02:17 We can get each item, so the key and the value. +02:21 We can do that using items(). +02:24 And then we showed you how to iterate over, +02:27 over the item itself so we can get the keys +02:30 and the values, not just one or the other. +02:33 And using a forloop, we can then substitute those keys +02:38 and values into some sort of a string, +02:40 into some sort of text. +02:42 And that's really useful, something you'll probably do +02:44 quite a lot. +02:48 Okay, your turn. +02:49 So for this next couple of days, +02:51 as we discussed in the ReadMe earlier, +02:53 we are going to work through the code challenges bite +02:58 that you have a free code for so go ahead and use that. +03:01 And then for day three, you're going to work +03:04 through that data.py file which in the repo. +03:07 So if you have any sort of thoughts on that +03:09 or any confusion on that, just head back to video two +03:12 where you look at the ReadMe and there's a good +03:16 explanation there as to what you're going to do +03:18 for days two and three. +03:20 So that's Python data structures. +03:22 I hope you enjoyed it. +03:24 Keep calm and... diff --git a/transcripts/10-testing/1.txt b/transcripts/10-testing/1.txt new file mode 100644 index 00000000..b9d504fe --- /dev/null +++ b/transcripts/10-testing/1.txt @@ -0,0 +1,20 @@ +00:00 Welcome back to the Hundred Days of Python. +00:02 In the coming three days I will show you +00:04 how you can test the program with pytest. +00:06 It's a popular testing framework, +00:08 often preferred over the standard libraries unittest. +00:11 And you will see why. +00:13 For this lesson I prepared a guessing game, +00:15 which lets you guess a number from the command line. +00:18 And although is a simple program, +00:20 it has a lot to offer in showing how to use pytest, +00:24 for example to fall out of errors, +00:26 capture standard output, +00:28 mocking certain functionality, and more. +00:31 By writing the test, I will also show you +00:34 how you can use coverage, to see how much +00:37 of your code base, or in this case, +00:39 the script is covered by tests. +00:41 And by the end of this session, +00:42 it should be easy for you +00:44 to write tests for your code, an important skill. diff --git a/transcripts/10-testing/10.txt b/transcripts/10-testing/10.txt new file mode 100644 index 00000000..9e3cd49f --- /dev/null +++ b/transcripts/10-testing/10.txt @@ -0,0 +1,45 @@ +00:00 Let's review what we've learned so far. +00:04 In this lesson we used a guessing game to write pytest. +00:08 And the game went like this. +00:09 There were a maximum of 5 attempts to guess a number +00:12 and you got feedback if the number was too low or too high. +00:17 We compared pytest to unittest +00:19 and saw that it's pretty succinct. +00:23 For unittest you need a class and self-serve +00:26 equal syntax. +00:28 pytest just lets you write functions. +00:30 And this is a very simple example, +00:32 but you're already see that pytest requires far less code. +00:37 pytest has nicely formatted outputs. +00:41 For example, if a fail, +00:44 then we pass. +00:48 We saw pytest code to show how much of our code +00:51 was on our test and where tests were missing +00:54 it showed the lines in our script. +00:58 We saw mocking in action, by mocking out the building input. +01:04 Because we wanted to control what the input function +01:07 returned when playing a game. +01:10 We also saw an example of mocking out the randint() function. +01:17 We also saw how to test exceptions +01:19 with pytest, which is pretty easy. +01:21 And we saw how to get your outputs +01:23 from your program using the capfd. +01:26 And that's nice because then we can check +01:29 if the output was as expected. +01:34 And here we have a complete game, +01:37 wrapped into a test. +01:40 And then we did some TDD on Fizz Buzz, +01:46 writing tests, writing a bit of code, +01:49 writing for more tests, some more code, +01:53 some more tests +01:55 and some more code. +01:57 And notice here we used the parameterize +01:59 feature to prevent duplicating a lot of test code. +02:03 So it takes a list of typals and in the body +02:06 of the test function, I can just do one assert. +02:09 So, that's how we kept it dry. +02:15 And again, the output is very nice. +02:17 Alright, that was quite some material to take in. +02:21 I hope you are more comfortable with pytest now. +02:23 And now, it's your turn. +02:24 Keep calm and code in Python. diff --git a/transcripts/10-testing/11.txt b/transcripts/10-testing/11.txt new file mode 100644 index 00000000..c801e7cc --- /dev/null +++ b/transcripts/10-testing/11.txt @@ -0,0 +1,39 @@ +00:00 Welcome back to the hundred days of Python. +00:02 This is day two of the pytest lesson. +00:05 Yesterday, we went over quite some concepts, +00:08 and now it's time to get practical. +00:10 So here, I pointed to a code challenge, +00:17 which is, not surprisingly, writing tests with pytest, +00:22 and it consists of going through your code, +00:25 see where tests are missing, and add them. +00:28 Another option is to test a Flask API, +00:31 or even contribute to open source. +00:34 There's a lot of great work being done, +00:36 and not all might have test coverage. +00:38 It might be a useful way to get into those projects, +00:41 to start adding tests. +00:43 So basically that, if you want to follow along, +00:45 you can clone our challenges repo +00:48 and make a branch and PR your work, +00:51 because we're always curious to see what you come up with. +00:54 Another way, if you want to just look at some tests, +00:58 is to head over to our bites. +00:59 Every bite is tested with a couple of pytests, +01:02 so each bite under the tests tab shows you pytest in action. +01:16 And a day generator... +01:24 And here is the exceptions being tested by pytest again. +01:28 One syntax we did not see is the pytest .fail. +01:32 This basically where it raises an exception +01:34 when it should not have, alright. +01:39 Then I want to point you to one more resource +01:42 and that's Brian Okken's Test and Code. +01:47 He has this podcast dedicated to testing in Python +01:52 and he is the author of Python Testing with Pytest +01:57 which is a great book. +01:58 I only showed you a couple of things. +02:01 This book goes in detail on how +02:03 to set up pytest configuration, fixtures, and a lot more. +02:08 So if you're serious about pytest, this is a great resource. +02:12 And that's it, today is all about getting practical +02:15 and tomorrow I'll check back in with you how it is going. +02:18 Good luck. diff --git a/transcripts/10-testing/12.txt b/transcripts/10-testing/12.txt new file mode 100644 index 00000000..3b9892df --- /dev/null +++ b/transcripts/10-testing/12.txt @@ -0,0 +1,40 @@ +00:01 Welcome back to the 100 Days of Python. +00:03 Day three of pytest. +00:05 And the final day +00:06 where I want you to get some more exercise. +00:09 And in all honestly, I recorded this lesson +00:13 and something was bugging me. +00:14 Fixtures. +00:15 I mean, fixtures are described +00:18 as the killer feature of pytest +00:19 and I did not cover them. +00:21 But no worries, you will learn them today. +00:24 I made this article explaining +00:26 everything you need to know +00:27 to start to use them in your test code. +00:29 And okay, it's a pretty long article, +00:32 but it's not too hard to actually learn and do. +00:36 There's a practical example in this article. +00:39 If you read through this, then you will see that +00:41 it's pretty easy to set up. +00:43 But it will make your test code a lot better. +00:45 So, I ask you today to come up with a use case, +00:50 so it can be to set up and tear down a database, +00:54 but it doesn't have to be a database. +00:55 It can also be an object of any kind, +00:58 a class, or something that requires +01:00 setUp and tearDown or even only setUp. +01:03 But I really want you to try to learn this skill. +01:05 As you know from unittest, +01:07 setUp and tearDown are commonly used, +01:09 and pytest fixtures are the way to do that. +01:11 So it's critical to understand this. +01:13 That's another day of practical exercises +01:16 and I think by the end of this day, +01:18 you'll have a good grasp on pytest. +01:20 Which will go a long way, because as we mentioned before, +01:23 writing test is a very important skill. +01:26 Good luck and let us know what you come up with. +01:28 Use the #100DaysOfCode and feel to include +01:31 TalkPython or PyBites in your tweets. +01:34 All right, have fun. diff --git a/transcripts/10-testing/2.txt b/transcripts/10-testing/2.txt new file mode 100644 index 00000000..bafce29d --- /dev/null +++ b/transcripts/10-testing/2.txt @@ -0,0 +1,54 @@ +00:00 Before getting into the nitty gritty, +00:02 why do you want to test your code? +00:05 And here I have a useful link that introduces +00:08 testing in Python, +00:10 and from my own experience I think the main +00:12 thing you want is to have a regression test suite. +00:16 As your software grows, it becomes more complex +00:19 and you need to make sure that all the previous +00:21 code keeps running. +00:23 If you have a suite of tests that are fast +00:25 and you can run every time you make changes, +00:27 you have a much more reliable application. +00:30 Down here, what I like about this link is that +00:32 there are rules about testing, +00:35 and I'll highlight a few. +00:36 So every test should test one thing +00:39 and be small and independent. +00:42 One test should not influence the other test. +00:44 And set up and tear down, +00:46 which we will see towards the end with fixtures, +00:48 is a way to guarantee that. +00:51 Tests need to be fast. +00:52 Your test suite will be growing, +00:54 and you will run them often. +00:55 You don't want slow tests to delay your development. +00:59 Testing should be automated. +01:00 Again, because you run them often, +01:02 it should be as hands off as possible. +01:05 Fixing bugs. +01:06 If you find a bug in your application +01:08 you usually want to write a test first +01:10 to show that the bug, or even document the bug, +01:13 and then fix it, and then you always have that test +01:16 to verify that that bug does not occur again. +01:19 And there are couple of other items. +01:21 This is good link to go through when +01:23 testing is really new to you. +01:26 There are various frameworks in Python +01:28 to facilitate you writing tests. +01:31 We have unittest, doctest, pytest, hypothesis, +01:34 and tools like talks that lets you +01:37 test various configurations or environments, +01:40 unittest2, and mock. +01:42 In this lesson we are going to focus on my favorite, +01:45 which is pytest. +01:46 pytest is a framework that allows you to +01:49 write test for your Python code, +01:51 and it specifies a set of rules, +01:53 and it has a couple of features that really +01:56 helps you write better test code. +01:58 Alright, enough theory, let's move on +02:00 to the next video where I pip install pytest +02:02 and pytest coverage, and we look at +02:04 the example for this lesson. diff --git a/transcripts/10-testing/3.txt b/transcripts/10-testing/3.txt new file mode 100644 index 00000000..59e7ef31 --- /dev/null +++ b/transcripts/10-testing/3.txt @@ -0,0 +1,70 @@ +00:00 Let's make a virtual environment +00:02 and install pytest and also pytest coverage, +00:06 which I will use to show you how much +00:08 of the code is covered by tests. +00:11 Let's head over to my terminal +00:13 and make a virtual environment, and I'm using Anaconda, +00:17 so I'm pointing virtualenv +00:19 to the python binary in my Anaconda path. +00:23 As by convention, +00:24 I use venv for all my virtual environments, +00:27 that I can just run this. +00:30 Then I have another alias, ae, +00:35 which will source the venv activate script. +00:39 So that's basically enabling my virtual environment. +00:43 And we have nothing installed, +00:44 and let's now install pytest and pytest coverage. +00:52 Let's look at that little guessing game +00:55 we're going to write test for. +00:56 It lets me guess 5 times, a number between 1 and 20, +01:00 and it will feedback if I'm too low or too high. +01:04 That's funny. +01:07 9 is too high. +01:10 Wow, I'm a good guesser. +01:17 Right. You see here, +01:19 there are some validations we need to do. +01:21 So a number I cannot guess again, +01:23 I need to have a valid number, +01:26 I need to have a valid range and I cannot just do strings. +01:30 So that is all stuff that's in +01:32 that program I will show you next +01:33 and we have to write test for. And we have 5 guesses. +01:40 Right. So here, I didn't guess it, +01:43 and it bailed out after 5 times. +01:45 So that's the program. +01:46 Now look at how that looks in code. +01:48 So we have to max number of guesses, +01:50 the start and end of the range, +01:52 we have a function to get a random number, +01:55 using the random module. +01:56 So we have to constructer +01:58 that sets the guess's internal set, sets the answer, +02:02 and it sets when bullion to falls. +02:05 Then we have the guess method which takes a user input +02:09 and see if there was actually a number, +02:11 if it was an integer, if it was in the range, +02:14 and if it was already guessed. +02:16 And if nothing bails out, +02:17 then we can add it to the guesses set, and return it. +02:21 Then we have an internal validate guess method, +02:23 which just sees if the guess equals the answer, +02:26 otherwise, it gives feedback if it's too low or too high. +02:29 If a property of number of guesses +02:31 that's basically just the length +02:33 of the internal guesses variable, +02:35 and there's a dunder call which makes +02:37 that I can instantiate the class +02:40 and call that object as if it was a function. +02:43 That will initialize a while loop, +02:46 checking if the number of guesses is below the limit, +02:49 try to get a guess, check for a failure error, +02:52 print that and continue, validate the guess. +02:55 If there was a win or done, +02:57 make sure that the print guess or guesses, +03:00 reset the win to true and re-break. +03:02 If the while loop exits without breaking, +03:05 then we know that you have guessed the maximum number +03:08 of times and you didn't find it. +03:10 Although some people are against this, +03:11 I do find this construct useful in this particular case. +03:16 This gives us a nice playground to start using pytest. diff --git a/transcripts/10-testing/4.txt b/transcripts/10-testing/4.txt new file mode 100644 index 00000000..27405d16 --- /dev/null +++ b/transcripts/10-testing/4.txt @@ -0,0 +1,79 @@ +00:00 Right, before diving into writing +00:02 tests for that program, +00:04 let's just quickly look at +00:05 how to write a test +00:06 with pytest in the first place, +00:07 and how to run it from the command line. +00:11 And first of all I want to contrast +00:13 it with unittest, +00:14 which is in the standard library. +00:16 So here at left you have a super simple program, +00:20 it's almost ridiculous. +00:21 But it's Hello name, takes a name +00:24 and just returns the hello name string. +00:27 And look at the amount of code you +00:28 have to write in unittest to get a test +00:31 for that running. +00:33 Because it's class-based, +00:34 so you have to subclass another class, +00:37 write a function, +00:38 and use a self.assert notation +00:41 so let's show that next. +00:53 Alright, so import unittest, +00:55 import the program, +00:56 make a class, +00:58 inherit from unittest test case, +01:01 write a method, which needs to start with test +01:03 to be recognized as a valid test, +01:06 use self.assert equal notation, +01:09 call the function, +01:10 and check for hard coded output. +01:13 If the files run as a main script, +01:15 call the main method on unittest. +01:18 Right, and it works. +01:22 And it fills if I change the return, +01:24 and that's good, +01:26 and notice that pytest can run unittest code, +01:31 so pytest can be run from the command line, +01:34 without any switches, +01:36 if you'll look for files that start with test, +01:38 and run the methods or functions in there +01:41 that start with test. +01:43 So that means that I can even +01:46 leave out this main block +01:47 and it should still work. +01:51 Right, but here comes the first benefit +01:54 of pytest is that you can write +01:55 test code in a much shorter way. +01:57 I don't need unittest, I don't need the class, +02:00 I can just define functions. +02:02 They do need to start with test, +02:03 and instead of the self.assert equal, +02:07 I can just use the classic assert. +02:12 And this should work. +02:14 It does not. +02:15 Self is still in the program +02:16 because it was still in the function. +02:22 Same output. +02:23 Make it fail, +02:27 and here is the second advantage of pytest. +02:30 The output is much nicer. +02:36 unittest was definitely not bad, +02:39 but pytest, +02:40 especially if you go into +02:41 more complex operations and errors, +02:44 it's a great debugging tool. +02:47 So look at that. Instead of what was it? +02:52 Oh that doesn't count +02:53 one two three, well it was +02:54 still short because this is +02:55 an easy program, +02:56 but you can already see that +02:58 this is way cleaner. +03:06 So that's the simplest +03:07 of pytest programs +03:08 and I just wanted to show you +03:10 how it differs from unittest and +03:12 how you can run it from the command line. +03:14 Just the basic steps to get you +03:15 up and running. diff --git a/transcripts/10-testing/5.txt b/transcripts/10-testing/5.txt new file mode 100644 index 00000000..38ca0473 --- /dev/null +++ b/transcripts/10-testing/5.txt @@ -0,0 +1,97 @@ +00:00 Alright. Back to our guessing game. +00:02 So, how do we want to test this program? +00:04 Ideally, you want to test one function or functionality +00:08 in one pytest function. +00:11 So let's start with the Get Random Number. +00:14 I'm going to open a file test on the scoreguess.py. +00:20 Again, using pytest I have the convenience to not +00:23 having to import any module to run the test. +00:26 What I do need is to import the actual program. +00:29 So from guess import get random number and the game class. +00:35 Now, one thing I want to show you in this video is how to +00:38 mark an object. Because Get Random Number, as you can see +00:42 at the right, uses a random integer from start to end. +00:45 And random returns to something randomly every time. +00:49 So how do you actually test that? And the way to do that +00:52 in testing land is to mark an object. +00:54 And for this I'm just going to use the unittest +00:57 patch method on the mark module +01:00 because it's a perfect fit for this scenario. +01:05 So from unittest.mark, import patch. +01:10 I actually need to import to random module +01:12 because that's the one we're going to mark. +01:15 And you can use it as patch object +01:20 and that's to random module. Just specify the function +01:24 or method you want to patch. +01:29 And then in your test function +01:35 you can pass in an argument and you can give that argument +01:38 a fixed return value. And that's key because +01:42 instead of having random return something else every time +01:46 you can give it a fixed value. +01:49 So it's kind of an override of what randint() normally does +01:53 which is randomness. Now we're saying every time +01:56 random gets called it gives us 17, +02:00 and it makes that at least we can call our function, +02:02 which is get random number, and we know that it returns 17. +02:08 Yeah, and this is pretty basic, but it should show you +02:11 how you can override certain things in your program you +02:14 cannot really control and I have another example later +02:17 about the input function where we ask for user input, +02:21 which is another area that can be anything, +02:24 so you want to mark that out. +02:27 So with this code written, +02:28 let's go back to the command line and run this test. +02:31 And I'm using Control Z on a Mac with foreground to +02:35 toggle back and forth between +02:37 my file editor and the terminal. +02:40 And here I can just run pytest, and that's funny +02:44 because the previous example I put in a hello subdirectory +02:47 and it's actually cool that we see this because +02:49 pytest is smart enough to look recursively for test files. +02:54 So in this case it found two and ran them both. +02:57 So I'm going to move this out to somewhere else, +03:02 because we now want to focus on the guessing game. +03:05 And yeah it runs fine, and what I also want to see +03:08 from now on is how much coverage we have of our tests. +03:13 So we installed +03:16 pytest-cov and to use it was a bit of a +03:21 trial-and-error for me, but I found this syntax +03:24 to work well for me. So I want a coverage report +03:27 term missing coverage dot current directory. +03:31 And the term missing is cool because +03:33 it starts to index all the-- +03:35 okay, I actually have to give it something more specific +03:39 because it starts to look in my virtual environment. +03:41 Alright, what I did was in the end moving the files into a +03:45 subdirectory so we got our venv +03:47 and we got our guess new subdirectory with the +03:50 script and the test file in there. +03:53 And when I specify a subdirectory in the minus minus scuff +03:57 argument then it just rounds on our code, +04:00 and what's cool about the missing argument is that +04:02 it shows the lines in the code that are not having +04:05 test yet, which is of course is a lot +04:07 because we just got started. +04:09 But even so, we have 24 percent coverage so +04:11 we are up for a good start. And you can then +04:14 map those lines back to the actual program so +04:18 this is not tested 29. +04:22 This is not tested, et cetera. +04:25 One final thing, as I use Vim I'm going to use the +04:27 coverage command quite a lot so +04:29 in my Vim RC, which I mapped to VRC to edit it, +04:35 I have a comma T which maps to save the file or +04:39 run a command with the exclamation mark +04:41 and then I run this command and I'm going to-- +04:43 yeah, I think that's fine because we're going to work +04:46 in the guess directory from now on +04:48 and the venv is not sitting there +04:50 so the dot should work there. And we can confirm that by +04:53 going into guess, run a test, run a coverage report +05:01 with a dot. Yeah that's fine. +05:05 So when I'm writing my tests, I can just hit comma T, +05:11 it saves the file and it runs my coverage. +05:14 So that's a bit of Vim trick or shortcut +05:18 for Pycharm or another editor. There must be a similar way +05:21 to do this but this is my way of +05:23 running coverage with one keystroke in Vim. diff --git a/transcripts/10-testing/6.txt b/transcripts/10-testing/6.txt new file mode 100644 index 00000000..51431c51 --- /dev/null +++ b/transcripts/10-testing/6.txt @@ -0,0 +1,94 @@ +00:00 The second thing I want to test is the guess method. +00:02 It takes a user input and input is not static, +00:06 you can change and it can be random. +00:08 Even worse, when you run this program +00:10 it's waiting at the prompt to get input +00:11 so your test would hang, quickly demo this. +00:17 Let's make a game object, and run it. +00:26 Actually it's not hanging, it's throwing an error, +00:29 pretty soon, reading from standard input +00:31 output is captured, so that's cool. +00:33 And look at the output, it's pretty verbose +00:35 which is a nice feature of pytest. +00:38 But anyway, we definitely don't want to use input +00:40 literally in tests, so I'm going to use patch again. +00:44 And I'm going to patch the built-ins input, +00:50 and this is another way of marking. +00:52 Here I can give it side effects. +00:56 And a list of expected returns in a row. +01:00 Because I'm having all these exceptions here, +01:02 I'm going to give it a bunch of inputs +01:04 to go through all these scenarios and see +01:06 if each scenario throws the value error +01:09 or accepts the guess as a correct one. +01:11 And will also show you how you can check for +01:14 exceptions in pytest which are important +01:17 because raising exceptions is a common Python pattern. +01:21 So what we're doing here is setting up +01:23 a sequence of return values as if input was +01:26 called that many times. +01:28 So it will return a 11, then 12 as a string, +01:31 then bob, then 12, +01:36 then five minus one, 21 +01:40 seven and None. +01:43 And those are the values that we're going to work with, +01:45 and you have to give it an argument, +01:47 it can be called anything. +01:49 And now we have some return data from input to work with. +01:52 So I'm making a game, and again, +01:54 the constructor sets defaults +01:56 for all the internal variables, +01:57 so that should be fine, +01:59 and then I can start to make assertions. +02:02 And the first two side effects or returns are good. +02:10 and again I will show you guess, +02:11 so guess goes through getting an input, +02:14 looking for all the bad inputs and raise a value error +02:17 if so, and if it's good it ends up adding +02:19 it to it's internal set which is the underscore guesses, +02:23 and returning the guess. +02:24 So 11 is good, +02:30 12 is a string should be fine +02:33 because that can be converted into a int. +02:36 The second one, bob, is not a number. +02:38 And the way in pytest to check if an exception is raised +02:42 is to use pytest, and you need to import that, +02:48 and do a with pytest.raises, +02:51 the name of the exception and then the statement +02:57 that would trigger that exception. +02:59 So the next return value from input in the row +03:03 is bob's string, if I call guess with that +03:06 it should raise a value error +03:07 and we're telling pytest to check if +03:10 it actually raises that exception. +03:12 And the same is true for the next one with is 12. +03:16 If I guess again, the guess is already in the guesses set +03:20 and the function manually raises a value error. +03:23 I can just copy this and it will be the same. +03:26 So every new call of guess triggers this input statement +03:31 or call, which triggers a new value in the return list. +03:35 So 12 is done, five should be fine. +03:42 Right let's run what we have so far +03:44 because it's a lot of code and see if it works. +03:50 All right that looks good. +03:51 So now let's do the complete list again. +03:55 And after five comes minus one and 21 +03:59 which should be two exceptions because +04:00 they are out of range. +04:08 Another good one, and finally None should not be a good one, +04:15 that falls into this one, if not guess +04:17 raise a value error, please enter a number. +04:19 So we wrap up with... +04:24 So that's save, Control + Z, pytest +04:29 you're still happy. +04:30 I mean if it would say... +04:34 Game guess returns None when given None it will fail. +04:41 So we have please enter a number +04:43 so it actually raised a value error, +04:45 and it was not catching that. +04:47 Here I do, and it works. +04:52 So that's how I use mocking to circumvent +04:56 this input function waiting for input. +04:59 I'm going through all these scenarios +05:01 by giving various side effects. +05:03 Next up, validate guess. diff --git a/transcripts/10-testing/7.txt b/transcripts/10-testing/7.txt new file mode 100644 index 00000000..e4dee06e --- /dev/null +++ b/transcripts/10-testing/7.txt @@ -0,0 +1,93 @@ +00:00 The last video I forgot +00:01 to run my coverage report, so let's do that now. +00:05 So I'm in test, and we see an improvement. +00:09 We went from 24% to 56%, +00:12 and it still shows the missing lines, +00:14 which are going further down into the script. +00:17 So let's continue. Next up, validate guess. +00:21 And the doc string says: verify if guess is correct? +00:24 If so print, guess is correct, otherwise it's too low. +00:28 Whoops. +00:31 Guess is too high or too low, depending what it is. +00:34 And it returns a boolean. +00:36 So let's write: def test, validate guess. +00:42 And I'm going to show you another feature of pytest, +00:45 which I will explain you in a bit, +00:47 which is capfd. +00:49 And that will capture the standard output +00:52 of the program and execution. +00:54 Very useful because for this method, +00:56 I not only want to check for the boolean return value +00:59 but I also want to see if the actual output +01:03 by the function to print, +01:04 that the function does because we made this a game, +01:06 prints to the console +01:08 and I want to have accurate information for the user. +01:11 So let's make a game. +01:14 I set the answer. +01:19 So let's validate that one is not a winning number. +01:23 Validate guess. So I call this with one. +01:28 One goes into this method. It checks against answer. +01:32 If it's answer, true, if it's not answer, false. +01:35 And to say false in pytest, you can just say, +01:38 assert not this method is truthy. +01:41 So this return false, not false is true. +01:44 So let's run this. +01:48 And that one passes as well. +01:50 Then of course it's easy to do the same +01:53 for higher an assertion. +01:57 So if it's three, it's still not good, +02:01 and if it's two, it's good +02:02 because that's the answer defined. +02:06 And now back to capfd. +02:08 If I actually want to see what the print is printing +02:11 to the console, because that's what you see before, +02:13 if we run the game. +02:18 It's printing these kind of feedbacks to the user. +02:21 So I want to test if these are what I'm expecting. +02:24 And one very useful trick is to redirect the output, +02:28 standard output, the error I just throw away +02:31 and I use capfd, which I passed into the function, +02:35 and I'm calling its readout error: method. +02:39 And let's just see what that gives me. +02:42 I'm not going to do this for now. +02:44 If you want to print inside your test, +02:47 one way with pytest to show that to the console +02:50 is to add the -s. +02:51 And that actually stands for: +02:53 shortcut for capture equals no. +02:56 So it's not capturing the output, +02:58 meaning in this scenario it prints it to the console. +03:03 So when it's been intermingled into these dots +03:06 but this is the actual print statement, +03:08 there's also a new line. So one is too low. +03:11 I captured that in the output variable, +03:13 which I printed to the console. +03:14 So capfd is very cool to capture output printed +03:18 by your program. +03:19 And now it can make assertions on that, +03:21 as on any other thing. +03:23 So I can say, out, +03:25 and that's strip of the new line, +03:29 right strip equals one is too low. +03:36 Save, control z, pytest, and it worked. +03:40 And if I would say too high, it would fail. +03:45 And look at that nice output. +03:47 So that works and I can do the same for the other two. +03:51 So let's just copy this. +03:55 Too high and two is the right answer. +03:58 So in that case, two is correct. +04:01 Let me just not do it 100% correct I you'll see. +04:07 Oh, one is too high. Oh sorry, this is three. +04:12 So you'll be targeting a lot between running tests +04:15 and writing test code, +04:16 that's something you need to make a habit of. +04:18 Still something bad: assert not true. +04:22 Wait a second. Ah! +04:25 Typical copy and past error. +04:27 Ah. And here, it's nice how pytest shows that, +04:29 not only the diff, but also, +04:32 the actual character that's missing. +04:36 So that's now very easy to spot and fix. +04:41 There you go, we are green again, and let me run comma T. +04:47 Wow we have 68% coverage now. diff --git a/transcripts/10-testing/8.txt b/transcripts/10-testing/8.txt new file mode 100644 index 00000000..7a792384 --- /dev/null +++ b/transcripts/10-testing/8.txt @@ -0,0 +1,138 @@ +00:00 Alright for the final two test methods +00:02 that I actually want to run a whole game from end to end. +00:06 And I'm going to use the same technique as before +00:08 because we're still stuck with this input method +00:11 that requires us to input data which we don't have +00:15 in an automated way of running test with pytest. +00:18 So I'm going to do a patch of the input again +00:21 and I'm going to just simulate a whole game. +00:24 So I'm going to enter 4, 22, 9, 4, and 6. +00:31 They're going to play a win scenario +00:34 and I'm going to give it the input +00:35 which is the requirement of the patch +00:37 but I'm also going to capture the standard out +00:40 as I did before. +00:42 So I make a game. +00:45 And I need to give it a right answer +00:47 to make sense of these numbers. +00:49 So in this scenario win but at the fifth attempt, +00:53 which is 6. So the answer is 6. +00:58 I call the game and assert that the game state +01:02 is underscore win equals true. +01:08 Let's run this. +01:12 Okay. So what it actually did, calling game, +01:15 is it went through all these numbers +01:17 and when it got to the final one, the fifth attempt, +01:21 it asserted answers true, so the win was set to true. +01:25 And again, you can see in the call, +01:29 an actual look that when validate guess returns true, +01:33 which is on the previous test, +01:35 there is an intermediate variable win set to true +01:37 and it also sets the inner, or internal variable win, +01:40 to true. And that's what we are asserting here. +01:44 But what I'm also interested in +01:45 is how the output looks of the program. +01:48 So I can just again do capfd, +01:56 read out err, +01:57 and you can also just call this with zero indexing +02:00 then you don't need the throw-away variable at all. +02:04 And I have a bunch of expected states +02:08 which I'm going to copy in. +02:09 Let's actually assimilate this program. +02:11 So I have these steps I'm just going to +02:14 hard code the answer for a minute, 6. +02:19 So these are the steps. +02:22 So what the test is doing is pretty pretty cool. +02:24 So I'm simulating 4, 22, which is not in range. +02:30 9, 4, 6. So here you see the typical program, +02:37 and that's what we are asserting here +02:39 with these expected values. +02:41 So 4 is too low, number not in range. +02:43 9 is too high, already guessed. +02:45 6 is correct. +02:46 Plus an additional statement of it took you three guesses. +02:50 So let's reset this. +02:51 Let's clean the output from capfd a little, +02:54 with a list comprehension. +02:56 For line in out split by new line. +03:02 Only take lines with one or more characters. +03:05 So ignore blank lines basically. +03:11 And give me the strip lines. So I'm stripping off new lines. +03:18 Alright. And then we can just match it line by line. +03:22 I can use a zip to look over two sequences. +03:25 So you have line and expected in zip output and expected. +03:33 So this will look over expected +03:35 and look over output in parallel. +03:37 So the first value of output +03:39 would match the first value in expected and etc. +03:46 Alright. Look at that. What's my coverage? +03:52 94 percent, very nice. +03:54 So they're only a couple lines missing: 83, 87, 88 +04:00 And 87 I'm okay with because this is just a calling code +04:04 if this is called as a script, which we've done before, +04:07 if I call it like this. +04:10 And line 83. Let's see if we can get +04:13 to this scenario as well. +04:15 So this is a lose scenario, where we tried it 5 times +04:18 and still did not assert the answer. +04:21 So let's set up a filled scenario. +04:25 Test, game, lose. +04:29 That's going to follow the same signature as above. +04:35 But I need more stamps. +04:38 So let's do a none, which should not count right away. +04:41 5, 9, 14, 11, 12, doesn't really matter +04:46 because what I need to do now +04:47 is to give it an answer that's just totally different. +04:50 So let's make a game. +04:53 And the game answer is 13. So it's not in all my guesses. +04:59 But this also test that none doesn't count +05:03 towards my guesses. So I can actually do 6 inputs +05:07 and this would be the fifth guess. +05:09 So I'm actually getting here in the first place. +05:13 Play the game. +05:16 I won't win this game. +05:23 And it should pass, right, +05:26 but the coverage should still be the same +05:29 because I'm not hitting that line yet. +05:31 I do. Yeah, I did. +05:32 So just to recap, this was line 83, +05:36 which corresponds to this line. +05:38 And what happened here, I played, +05:40 actually what I forgot is that this plays the whole game. +05:43 When I launch game, it goes through all these outputs. +05:46 And having guessed 5 times, +05:48 and not asserting this answer, I did get to the L's block. +05:52 I can actually show that. If I turn on non-capture mode. +05:57 See? It just prints the whole thing. +05:59 5's too low, 9 is too low, then I guessed 5 times. +06:02 Answer is 13. So I made it to this actual print statement. +06:06 And that was the final thing +06:08 to actually increase the coverage. +06:11 If you take main out, we have a 100% coverage +06:14 of our tests. You still need to have a critical eye +06:18 to your code and your tests +06:20 because one thing is to test it, +06:21 but, for example, I can get a 100% +06:24 on this earlier validation of the guesses, +06:27 sorry, this one, +06:29 but here I made sure that I'm going +06:31 into all the different kind of value errors. +06:33 Actually let's do an experiment. +06:35 If I'm not doing the not-a-number test, +06:38 would my coverage go down? +06:44 Wow, look at that, how cool. +06:46 So I took a test out +06:47 and now it's complaining that 35 and 36 are missing. +06:50 And 35 36 is they should be a number, +06:54 and that's the thing we just deleted. +06:56 So I had a string here, +06:58 and that not-a-number should raise an exception. +07:01 And coverage spotted that. So that's very cool, +07:03 that you can just pinpoint exactly which code +07:06 is not being tested versus which code it is. +07:08 But again, you still need to have a critical eye +07:10 of what you're testing. +07:11 Because one thing is to have all your lines, some were called, +07:14 but the other thing is how you call them. +07:16 What are you testing? Are you testing all the edge cases? +07:19 So testing is an art in itself. diff --git a/transcripts/10-testing/9.txt b/transcripts/10-testing/9.txt new file mode 100644 index 00000000..b056e608 --- /dev/null +++ b/transcripts/10-testing/9.txt @@ -0,0 +1,69 @@ +00:01 1 final thing is when to write your test. +00:02 I think the motto "having tests is better than no tests" +00:05 is the most important, but there is a whole +00:08 style of test driven development, +00:10 which is to write your test before your actual code, +00:13 and to drive your design by those tests. +00:16 Let's write the Fizz Buzz program, +00:19 which is a children's game, and it basically +00:22 is a sequence where numbers divisible by +00:25 3 and 5 return Fizz and Buzz , +00:28 and if they're both divisible by +00:30 3 and 5 it returns Fizz Buzz. +00:32 So let's write that program, but do it in a TDD way, +00:35 by writing the tests first. +00:37 And I'm going to use the repetitiveness +00:40 of these tests to also show you a nice feature +00:43 of pytest, which is parameterize. +00:51 So let's do it from the ground up. Test Fizz Buzz. +00:59 So let's give it a number, and it should return Fizz, Buzz, +01:02 or Fizz Buzz, or number, right? +01:04 So if I call it with 1, it should return 1. +01:08 If I call it with 2, it should return 2. +01:17 3, Fizz. Actually let me stop there. +01:27 The TDD way would be to fill at the earliest possible way. +01:33 And just start adding code in small increments. +01:44 Alright, so now it is recognized, +01:47 but it takes zero positional arguments, but 1 was given. +01:50 So here 1 was given, but I'm not accepting 1. +01:53 So let's just hard-code that here. +01:58 And now the return's None. So let's just return 1 for now. +02:05 And the second test fails, so let's then decide to return N. +02:13 And then if it's 3, it should return Fizz, okay, +02:18 so we need some sort of if statement, right? +02:34 Alright, that works, okay, let's move on then, 4, 4. +02:46 That still works. 5, +02:57 That's not working, okay. +03:01 And let's accommodate that, return Buzz. +03:09 And we're green again, cool. +03:10 And you already start to see a lot of repetition, right? +03:13 Now there's a cool feature in pytest, called parameterize. +03:20 And let me just copy over the whole test. +03:25 So I can give that a list of tuples of argument, +03:30 where I call the function with, and the return value. +03:33 And then in my test, I can just do this 1 time, +03:38 call Fizz Buzz with arg, and test it against return. +03:42 And look at that, how I put all the parameters +03:44 in a decorator, and I avoid having to write +03:49 assert, assert, Fizz Buzz, Fizz Buzz, Fizz Buzz, +03:52 over and over again. So this is pretty neat. +03:54 I think you will find a use guys for this. +03:59 I need to pass them into the function. +04:01 And I see that Fizz does not assert Fizz Buzz, +04:04 and that this particular call, +04:07 so if it's 15, it should do Fizz Buzz. +04:10 There are various ways to solve this. +04:12 Let's do here, then return, Fizz Buzz. +04:23 As these are returns, I don't need an elif, +04:26 because these are like, or early return, or continue. +04:30 So let's see if this works. And this works. +04:34 And notice that it's also nice that pytest gives +04:37 a dot for every parameter test. +04:40 If 1 would fail, how would that look? +04:42 Ah, we already saw that, right? +04:48 We still get all the dots, and you see +04:50 the actual position of the tuple that failed. +04:53 And that's also, again, nicely indicated by the output. +04:56 Alright, so, this was a little bit of TDD, and also, +05:00 a nice feature of pytest, parameterize, +05:03 that you probably want to become familiar with. diff --git a/transcripts/100-day-one-hundred/1.txt b/transcripts/100-day-one-hundred/1.txt new file mode 100755 index 00000000..581e636e --- /dev/null +++ b/transcripts/100-day-one-hundred/1.txt @@ -0,0 +1,20 @@ +00:00 Wow, look where you are! +00:02 It's Day 100. +00:03 This is literally the last day of your #100DaysOfCode. +00:08 Congratulations, it's time to freestyle! +00:10 You've earned a little bit of freedom. +00:12 So is there some project that you've worked on so far +00:15 that maybe you didn't finish, you really wanted to? +00:17 Go back and finish that one. +00:19 Is there some derivative type thing you want to create? +00:22 Like maybe you'd like a web version of The Wizard game? +00:25 Then go build that. +00:27 Of course it's your time to freestyle, +00:28 so if you would rather just go do something +00:30 totally different, something you wanted explore +00:33 as part of this journey, here's your final day +00:35 to go work on that project. +00:37 Whatever it is you want to do. +00:38 You've earned this, go have fun +00:41 and celebrate this by working for the final day +00:43 on something you're super excited about. diff --git a/transcripts/101-conclusion/1.txt b/transcripts/101-conclusion/1.txt new file mode 100755 index 00000000..2350c482 --- /dev/null +++ b/transcripts/101-conclusion/1.txt @@ -0,0 +1,13 @@ +00:00 Look at that, you've done 100 days. +00:03 You've made it! +00:04 Can you believe you've actually done +00:05 a #100DaysOfCode and completed this entire journey? +00:10 Well, your adventure is both done +00:12 and also just beginning. +00:14 Congratulations. +00:15 There's so much more code you can write, +00:18 so many more projects and things that you can start +00:21 with all the experience you've gained in this course, +00:24 and I hope you do so, and I hope you share it +00:26 with us on social media. +00:27 We love hear about our students being successful. diff --git a/transcripts/101-conclusion/2.txt b/transcripts/101-conclusion/2.txt new file mode 100755 index 00000000..16d249d1 --- /dev/null +++ b/transcripts/101-conclusion/2.txt @@ -0,0 +1,33 @@ +00:00 Now, let's just take a moment +00:01 and reflect upon what you've learned, +00:03 what you've gotten in this course. +00:06 If you've done every one of the 100 Days projects, +00:09 you have done an incredible amount. +00:11 And it's easy to think, well these +00:13 are just small little things, little tiny projects. +00:16 But that's really the secret of software development, +00:19 is it's just the sum of many, many small projects. +00:23 It's not this grand skill that +00:25 somehow you acquire eventually. +00:27 Rather it's, well, what 50 little things +00:29 do I actually need to know in order +00:32 to build this website or that mobile app, +00:34 or this other IoT thing, whatever it is you want to build? +00:38 I'd think you've learned so many little things +00:41 that are going to add up to +00:43 be really, really powerful for you. +00:45 And I just want you to keep this ethos, +00:47 this I'm going to learn one little thing every day going. +00:50 Because one little thing every day +00:52 continuously will put you right +00:54 at the top of the software industry, +00:56 and that's a super-fun place to be. +00:58 But you have learned so much, +01:00 I don't really want to go through all +01:01 of the details and call them out, +01:03 but you know, you work with databases, +01:05 emails, websites, APIs, and so on and so on. +01:10 So just take a moment and reflect upon how far +01:13 you've come and how many things you have gained, +01:15 but most importantly, just keep learning +01:18 one thing a day, and it'll do amazing things for you. diff --git a/transcripts/101-conclusion/3.txt b/transcripts/101-conclusion/3.txt new file mode 100755 index 00000000..7d1cdaee --- /dev/null +++ b/transcripts/101-conclusion/3.txt @@ -0,0 +1,14 @@ +00:00 Right now, you're certainly familiar +00:01 with the GitHub Repository. +00:03 That's where all the instructions and the starter code +00:05 and the data and what not has been for +00:08 all the 100 Days projects. +00:10 But I still want to emphasize one more time: +00:13 maybe you haven't starred, maybe haven't forked this, +00:15 I want you to at least go to GitHub and start +00:18 and probably fork it, +00:19 so you have a permanent history of this. +00:21 You've done 100 days! +00:23 You've gone on this entire journey. +00:24 Make sure you take the source code with you. +00:26 I'm sure you'll find it useful down the line. diff --git a/transcripts/101-conclusion/4.txt b/transcripts/101-conclusion/4.txt new file mode 100755 index 00000000..e4544248 --- /dev/null +++ b/transcripts/101-conclusion/4.txt @@ -0,0 +1,29 @@ +00:00 Now that you're just about to complete this class, +00:02 I want to give you a couple of resources +00:04 to help you dig deeper +00:05 and connect further with the community. +00:08 First of all, the Talk Python to Me podcast. +00:10 You probably know this podcast, +00:11 maybe you subscribe to it but if you don't, +00:14 head over to talkpython.fm and check out the podcast. +00:18 You will the hear the stories and the people behind +00:21 so many of the projects that you worked with. +00:23 You want to hear about SQLAlchemy? +00:26 Well, I had Mike Bayer on the show, +00:28 who was the guy who created it and continues to maintain it. +00:30 Want to learn about contributing to open source? +00:32 I did a whole panel on that. +00:34 Looking to get your first job in Python? +00:36 I actually did a two episode, 12-person panel, +00:40 both people who just got their jobs +00:42 and who are hiring managers. +00:45 Whatever it is you want to dig deeper +00:47 into in Python and the community, +00:49 you can probably find it over here. +00:52 Also, stay up on the latest news, +00:53 check out my other podcast Python Bytes. +00:55 Over at Python Bytes, Brian Okken and I +00:58 share the latest headlines and news +01:00 in what's hot and what's happening in the Python space. +01:03 A great way to keep up on new packages in libraries +01:06 that maybe you haven't heard of. diff --git a/transcripts/101-conclusion/5.txt b/transcripts/101-conclusion/5.txt new file mode 100755 index 00000000..b880d894 --- /dev/null +++ b/transcripts/101-conclusion/5.txt @@ -0,0 +1,27 @@ +00:00 Finishing the 100 Days of Python is both +00:03 an ending and a start of a great Python journey. +00:07 We encourage you to go to PyBites +00:10 and subscribe to our monthly newsletter. +00:13 And keep an eye on the articles, news and code challenges +00:17 we launch on our website. +00:19 We are here to teach you Python. +00:21 Of course, we are learning Python ourselves. +00:24 It's a never ending journey, +00:26 and we're super passionate about it. +00:28 And we are not planning to stop any time soon. +00:31 So, we hope to salute you at PyBites. +00:34 Additionally, a couple of months ago, +00:36 we launched Code Challenges, +00:38 where we integrated a year of blog challenges. +00:41 And we also launched a new line of Bites of Py, +00:44 which are smaller exercises you can code up in a browser. +00:47 We are stoked about this platform. +00:49 It's not only teaching you programming and Python, +00:52 it also shows how to do it in the most Pythonic way. +00:55 And we are rapidly expanding this platform +00:58 adding bites and code challenges. +01:00 So this is a great way to keep up the momentum you gained +01:03 throughout this course +01:04 by keeping calm and code in Python, +01:07 every single day. +01:09 Good luck and we hope to see you there. diff --git a/transcripts/101-conclusion/6.txt b/transcripts/101-conclusion/6.txt new file mode 100755 index 00000000..8b6fa6b1 --- /dev/null +++ b/transcripts/101-conclusion/6.txt @@ -0,0 +1,33 @@ +00:00 You made it to the end, congratulations. +00:02 I hope you had as much fun inspiration +00:05 as we had preparing the course +00:07 and you got practice on a lot of different topics +00:09 which you can now take to the next level. +00:12 And I hope that you keep using Python in your daily work. +00:16 Feel free to reach out on Twitter +00:18 and share what you're working on +00:19 and good luck on your further Python adventure. +00:23 Congratulations on completing the +00:24 #100DaysOfCode in Python. +00:26 This is a huge milestone and huge achievement +00:29 so you should be very proud. +00:31 It's important though to continue coding. +00:33 Don't let this be the end. +00:35 Make sure just like with any other skill +00:37 you keep practicing, you keep coding, +00:39 and you keep working on it and you'll only get better. +00:42 So we look forward to seeing all the cool things +00:44 you come up with going forward. +00:45 Make sure to ping us on Twitter and Facebook +00:48 and wherever else you can think to message us. +00:51 As I've said in the course, keep calm and code in Python. +00:54 Thank you for taking our course. +00:55 It was a pleasure to put it together for you. +00:58 We hope you accomplish amazing things +00:59 with what you've learned here. +01:01 If you enjoyed the course, +01:02 please share it with your coworkers +01:03 and friends on social media. +01:06 Thanks and goodbye. +01:08 Thanks and goodbye. +01:10 Thanks and goodbye. diff --git a/transcripts/13-text-games/1.txt b/transcripts/13-text-games/1.txt new file mode 100644 index 00000000..c91de2ce --- /dev/null +++ b/transcripts/13-text-games/1.txt @@ -0,0 +1,37 @@ +00:00 Michael Kennedy here and I'm going to be your guide +00:02 for the next three days. +00:04 We're going to have a lot of fun working +00:06 with classes and objects. +00:09 This is one of the fundamental ways to model +00:13 things, concepts in your application. +00:15 And you'll see that classes very naturally map to +00:19 sort of real world ideas and more general stuff, +00:23 that gets more specialized like, say, +00:25 a car versus a Ferrari. +00:27 Right, a car is this general idea. +00:29 A Ferrari also is a car but a more specialized type of car. +00:33 And we're going to actually build some really fun games. +00:36 We'll build one in the demo and then I'll hand off +00:38 a separate game for you to build. +00:40 So we're going to build this little +00:42 Dungeons and Dragons wizard game. +00:45 It comes in just says, "Hello, it's the wizard game." +00:47 And we have this wizard, Gandalf. +00:49 And he will encounter various creatures in his little world. +00:54 And he has three options: +00:55 he can attack, or run away, or look around. +00:58 And so you can see we're entering various commands. +01:00 R, A and L. +01:02 So, first we run away and then the wizard sees a bat. +01:05 It's not very strong so he thinks +01:06 he can attack the bat and win. He does. +01:08 And was very, very close actually. +01:10 They basically hide but he had the element of surprise, +01:13 so he beat the bat. +01:14 And then he can look around and see what else is there. +01:18 The toad, the tiger; not so scary. +01:20 Level 1000 evil wizard then he's probably +01:24 getting away from that thing. +01:25 Alright, so, this is what we're going to build and we're +01:27 going to build it by modeling these ideas +01:30 in this little game using classes. diff --git a/transcripts/13-text-games/2.txt b/transcripts/13-text-games/2.txt new file mode 100644 index 00000000..635ae581 --- /dev/null +++ b/transcripts/13-text-games/2.txt @@ -0,0 +1,77 @@ +00:00 Before we actually write the code +00:02 and get into the syntax of working with classes, +00:05 I want to just talk briefly about the idea of two things: +00:08 inheritance and the difference between +00:10 classes and objects. +00:12 So, in our game we have this concept +00:14 of a creature, how it'd be like the tiger, +00:16 that would be, say, the dragon, +00:19 the bat that the wizard defeated, +00:21 things like that and in fact, the wizard himself +00:24 is also a creature. +00:25 This creature concept has the basic ideas of +00:28 what it means to be an actor in the game. +00:31 It has, let's say, a level, a name, +00:33 and it can sort of defend, at least against being attacked. +00:38 But we can, say, well, there's special things +00:41 in the game that have more distinction than that. +00:44 So, there's a tiger, maybe the tiger +00:47 has a special way to defend and so +00:49 its mechanism for defense, it's a little bit different +00:52 than, say, a toad or a standard creature. +00:55 We have a dragon, maybe the dragon takes into effect +00:57 whether it can fly, whether it has scales, +00:59 whether it's fire breathing, things like that. +01:03 And this aspect of the dragon means +01:07 we probably need to model those features +01:09 that make it different from a creature separately. +01:12 So it's like a specialization of this creature. +01:15 Now also, the wizard itself. +01:16 When you model like this, you're modeling what's called +01:19 an is-a relationship. +01:21 So, the tiger is a creature. +01:23 The dragon is a creature and so on, right? +01:26 So tigers are creatures. +01:27 So we're going to model this type of thing +01:30 and I'll show you how simple this is to do in Python. +01:32 The other important distinction to make +01:34 over here is, let's look at this wizard concept. +01:37 You need to think of these classes +01:39 that we're going to define. +01:40 I haven't shown you how to do it yet, +01:41 you may know but if you don't know, +01:43 you got to think of these as blue prints. +01:45 Let's think about a tiger for a second. +01:47 There's a tiger that's in the San Diego Zoo, +01:51 there's a tiger that's in the wild, in the jungle. +01:54 These tigers were created from the same blue print, +01:57 from the same DNA. +01:58 That's kind of like the class. +02:00 But the actual tiger in the zoo and the tiger in the forest, +02:03 those have different properties +02:04 and they evolve in different ways over time. +02:07 They're not exactly the same thing. +02:09 So you'll see, the same thing is happening +02:11 here in codes. +02:12 So we have this line gandalf = Wizard() +02:15 and this line is going to create a new wizard +02:18 from the blue print of the class. +02:19 It's going to create what's called an object. +02:22 And over here we're going to have sort of in memory +02:24 this thing, it knows it's a wizard +02:25 and it knows its name is Gandalf, +02:26 and it's Level 70 and those can change, +02:28 sort of on their own. +02:30 But the evil wizard we're creating, it's going to be +02:32 a separate thing out there in memory +02:35 called evil wizard with the name and the level 100. +02:37 And once they're created they can +02:39 be changed and evolve independently like the wizard +02:42 that is Gandalf can level up to 71 +02:44 and it would have no effect on the evil wizard. +02:46 The thing at the bottom of the two arrows, +02:48 the wizard Gandalf and the wizard that's evil, +02:50 those are objects. +02:52 The modeling blue print thing at the top, those are classes. +02:55 Hopefully that illuminates the confusion around those +02:58 which is always hard when you're getting started. diff --git a/transcripts/13-text-games/3.txt b/transcripts/13-text-games/3.txt new file mode 100644 index 00000000..6a77fed3 --- /dev/null +++ b/transcripts/13-text-games/3.txt @@ -0,0 +1,71 @@ +00:00 Alright, let's write some code. +00:01 So, we're going to begin this first part of our demo +00:04 by simply creating the general skeleton and flow +00:07 of our application. +00:09 We're not going to actually do anything with classes at all, +00:11 but we're going to get it ready to. +00:13 So, let's come over here and add a new Python file. +00:16 I noticed there were none at all, +00:18 and I'll just have this called program. +00:20 In here we're going to define a main method, +00:24 oh, I've got to to configure this, hold on. +00:30 Alright, now Python is happy. +00:31 So, what we're going to do is +00:32 we're going to do a little print the header +00:34 and that's just going to show these methods +00:36 don't exist yet, +00:37 but just think about the ideas. +00:39 Then we're going to run the game loop, okay, +00:43 and it's going to go around and around and run. +00:45 This concept of a game loop you'll find out in a second, +00:47 but let's put this print header here first. +00:52 Now maybe we'll put something more interesting here later, +00:54 but for now, we'll just do like a little line +00:57 and something like, wizard game. +01:01 Or, something like that, that should look pretty decent +01:03 and maybe a little divider there, as well. +01:06 Then, for our game loop +01:10 we're going to come in and we're basically +01:12 going to create the various concepts in the game. +01:16 We'll create a number of creatures, +01:17 we'll create our hero, +01:18 then we'll just say while true, +01:21 we'll sort of like ask the user for action. +01:26 Then we'll say like if win or exit, +01:30 and we'll just brake out of this loop +01:32 and then we'll just say print, goodbye. +01:35 Alright, so we just go around and around, +01:36 and keep asking the user to sort of control the hero. +01:40 Do you want to attack? +01:41 Do you want to look around? +01:42 Things like that. +01:43 Now, there's a bunch of writing here +01:44 that is actually not super interesting +01:47 for you to watch me type it out. +01:49 So, let me just paste a little bit of code here +01:51 to a more full featured version of what I just described. +01:54 There we go. +01:55 So, now we're going to come in +01:56 and we're going to create our creatures. +01:58 We don't have any creaturs yet, +02:00 remember we have to model those +02:01 with classes and that's one of our primary goals. +02:04 We're going to create a hero. +02:05 We're going to go around and around, +02:07 we're going to grab randomly, +02:09 choose one of the creatures to appear. +02:12 We're going to print out details +02:13 about the creature that has appeared. +02:15 Here's the input asking the user +02:18 do you attack, run away, or look around. +02:20 Like what is your hero going to do, and then we just check. +02:24 Do they type A? +02:25 Do they type R? +02:26 And so on. +02:27 So, this not super interesting yet. +02:29 I'll put a little pass here to show it's not upset +02:31 with that section there. +02:33 It's not super interesting yet, +02:35 because we don't really have a hero. +02:36 As you can see right here, and we have no creatures. +02:40 So, let's go and model that next. diff --git a/transcripts/13-text-games/4.txt b/transcripts/13-text-games/4.txt new file mode 100644 index 00000000..64cc0bac --- /dev/null +++ b/transcripts/13-text-games/4.txt @@ -0,0 +1,202 @@ +00:00 Okay, so here's our general program. +00:02 Let's put that aside for a minute, +00:03 and go work on the various creatures that we're going to model. +00:06 And I'll call this actors to kind of say, +00:08 here's where I'm going to put a creature, +00:09 the wizard, and so on. +00:11 So what we need to do is create what we talked about, +00:13 something called a class, +00:14 and this is going to be the blueprint of a creature. +00:17 So, the way you create a class in Python +00:19 is really straightforward. You say class, and then you say the name of it. +00:23 Okay, we're going to model everything at the lowest level +00:26 as a creature, and use a colon to define the block +00:29 that is the class, like you do +00:31 all the various blocks in Python. +00:33 Now, there's a couple of things which we can do +00:36 to get started, but, commonly, you want to store +00:39 pieces of data and behaviors with the creature. +00:42 So, for the data part we're going to use +00:44 what's called an initializer. +00:45 So we'll say def init, and there's this dunder init, +00:48 in fact if I say double underscore, +00:51 these methods are called dunder because it's +00:52 double underscores on both ends. +00:55 These are all part of what makes up classes, +00:58 and they all have special meaning. +00:59 The one that we care about is this init. +01:01 This is very common. +01:03 So down here, we might want to have a name for it. +01:06 Equals, let's call it, toad, and it might have a level. +01:10 And the level of the toad is 1, or something like that. +01:13 Now, this is not really helpful +01:15 because every creature is going to be a toad of level one. +01:19 So what we can do is, we can when we create them say, +01:21 this particular creature is a tiger, +01:23 this creature is a bat, and so on, +01:25 and so we could pass in the name here, +01:27 and we could pass in the level. +01:29 So we're going to go like this. +01:31 So, here we've defined this blueprint. +01:32 What is a creature? +01:33 A creature is anything that can be created +01:36 and given explicitly a name and a level. +01:38 We could go farther and give those types, +01:40 as you can in Python 3, +01:42 but we're not going to do that right now. +01:44 The other thing, this is the data part we have so far, +01:47 the other thing is going to be some kind of +01:51 behaviors around it. +01:52 So, a creature, can, let's suppose that one creature +01:56 can be defensive against some kind of attack. +02:00 So we could say it like this. +02:02 So the creature's going to roll a defensive roll. +02:05 And now, you might want this to be +02:07 somewhat based on the creature's level. +02:10 So let's create some sort of randomness. +02:13 Let's say roll equals, +02:15 well I'll go over here and we'll say random. +02:16 Now this comes from the standard library +02:18 so we have to import it here, put like that at the top. +02:22 Then we can say randint(), and you give a lower bound, +02:26 of let's say 1 to 12, and if you want to know whether this +02:31 goes from 1 to 12, 1 to 11, and things like that, +02:34 we can say view quick documentation. +02:37 And what does it say? +02:39 It returns a number such that A, +02:41 the number that comes back is +02:42 less than or equal to the upper and lower bound. +02:45 Perfect. So this is our, let's say, 12-sided die. +02:48 And then we'll return roll times self.level. +02:52 Anytime you want to refer to your own items, +02:55 your own values, you have to say self dot. +02:58 So to get back to this, we say self.level. +03:02 Alright, so this is going to be some kind of defense here. +03:05 Now let's go and create our various creatures in the game. +03:09 There's this little to do here. +03:11 We had a couple of things, we had a bat, we had a toad, +03:14 we had a tiger, we had a wizard, an evil one, and so on. +03:18 So we'll type creature and of course +03:20 we have to import that at the top here, just like any type. +03:25 We go like this and if I ask Python to +03:28 show me the parameters, you'll see it takes a name. +03:30 So let's call this a bat, and this is a level 5 bat. +03:34 I think we had a toad which is a level 1. +03:38 And we had a tiger which was level 12, let's say. +03:41 And we had a dragon, which is a level 50. +03:46 And for now, I'm going to put it this way, +03:48 evil wizard was a 1000. +03:51 I think that's what it said. +03:53 Okay, so if we just run this and +03:56 we could print out our creatures, +03:59 we need to make sure that we're running the main. +04:02 Remember, up here, at the very top, we wrote this, +04:04 but at the bottom we have to do our little main. +04:07 Like this, to say are we running this script as a program? +04:10 Or are we just importing it? +04:12 If this is true, we're running it +04:13 as a program, then we want to invoke our main method. +04:16 So let's go over here and say run, +04:19 and there's some stuff that +04:20 went a little bit crazy somewhere along the way +04:23 because we didn't finish it. +04:25 But here, you'll see that we've created +04:27 a creature object here, and a +04:28 creature object there, and so on. +04:32 Our little creature part worked, +04:33 but then the code that we sort of commented out below, +04:36 isn't quite done. +04:38 So this is close, but remember I said +04:40 you might want to have special features. +04:42 So let's just focus on the dragon for a minute. +04:45 You might want to have special features that +04:46 take into account the scaliness, the fire-breathingness, +04:49 have a different mechanism for defense, and so on. +04:52 So let's say we're going to have a class called dragon. +04:55 And the dragon also is going to have a defensive roll, +04:58 like this, and maybe the dragon also +05:01 wants to have this information. +05:03 Woops, copy that. +05:05 So the dragon is going to go like this, +05:06 and then it's going to copy it, +05:07 and this seems really, really tedious. +05:10 It is and I'll fix it in just a second. +05:12 You'll see that we can model this differently. +05:14 But when we create a dragon, it will have this. +05:16 And let's also say that it has +05:18 a scaliness factor and breathes fire. +05:26 Alright, so we want to store these here, so I'll say, +05:31 "self dot", that equals that. +05:34 In fact, in PyCharm you can hit alt enter +05:36 and it will even write that whole bit for you +05:38 because it knows that this is what you should do. +05:40 But you probably see a lot of duplication here, and here. +05:44 And if I want to change something about this, +05:46 like add a feature to all creatures, +05:48 well I'll have to go in and add it everywhere, like this. +05:51 So, we'll be able to something a little bit better here +05:53 in just a second. +05:54 But let's go ahead and write this. +05:56 Let's take that and let's say +06:00 we're going to multiply that times the self.scaliness, +06:06 let's go that equals that. +06:07 We'll say if self.breathes_fire, +06:11 then value equals value times 2. +06:14 So it's even worse, stronger if it breathes fire. +06:18 Okay, great, so there's that. +06:20 Now, this is not really super helpful. +06:25 Any change we make over here, we would kind of like +06:29 to copy them over there, and really, we would like +06:31 to treat the dragon as just a specialization of a creature. +06:34 Remember, this is a relationship. +06:37 So we can model that by saying this dragon is a creature, +06:42 like this, alright? +06:44 And when we say that, what it lets us do is +06:47 actually take on all the attributes here. +06:50 Notice this is giving us a little warning, +06:52 it says, "you need to say super dot", +06:55 and in pass the name and the level. +06:57 And this basically says we're going to run +06:59 this bit of code, and we don't actually need +07:01 this stuff here, we're just going to store +07:04 let it pass on through, then we're just going to store +07:06 the things that are special about the dragon. +07:09 Similarly, this right here, we could say the role +07:12 is actually whatever the regular creature does. +07:20 And then we could say, okay we're going to do +07:21 that same thing, and we're going to factor in +07:24 the scaliness and the firebreathing, here. +07:28 You can see right here that PyCharm is saying that +07:30 you're actually getting this detail here +07:33 from your creature class that you're driving from. +07:36 Okay, so this is all well and good. +07:39 Let's do one more thing. +07:40 Let's have a wizard. +07:47 Now the wizard is also going to be a creature, +07:49 and the wizard actually has no special items or a passing +07:53 to it, so we can just leave this init thing off. +07:55 We're just going to add one behavior +07:57 to the wizard, which is going to be attack. +07:59 So he's going to have a creature he's going to attack, +08:02 and it's going to return True or False. +08:04 So it'll go something like this. +08:09 Now notice, both the wizard can get this defensive role, +08:12 or offensively, but it's fine, +08:14 and the creature also knows how to get a defensive role. +08:16 And we'll just compare those, we'll say return, +08:19 my role is greater than or equal to their role. +08:25 Alright, so what we're going to do is have the wizard attack +08:28 another creature, and then if we roll something higher +08:31 than we win, otherwise we lose. +08:32 And we're indicating that by returning True or False. +08:35 Alright, so we were able to take on a lot of the features +08:39 and the blueprint of the creature to get this +08:43 defensive role, and all we're doing is adding +08:45 an attack mechanism. +08:46 Whereas the dragon, we said we're going to change the way +08:49 defense works for dragons as well as, +08:50 like, storing additional stuff. +08:53 So we're able to model these +08:55 various actors in our game, all the while +08:58 keeping a sort of common functionality so they can interact +09:00 with each other. diff --git a/transcripts/13-text-games/5.txt b/transcripts/13-text-games/5.txt new file mode 100644 index 00000000..8b6db94f --- /dev/null +++ b/transcripts/13-text-games/5.txt @@ -0,0 +1,133 @@ +00:00 Now that we've created our actors in the game, +00:03 our creature, our dragon, and our wizard, +00:05 let's go and actually use them to put the behaviors +00:09 or the implementation of the game together. +00:12 So over here, let's also import wizard and dragon. +00:16 Now down here, these bats, and toads, and tigers, +00:19 they're fine, but this one, we're going to create a dragon, +00:22 and this will be called the black dragon +00:25 or something like that. +00:26 And notice PyCharm says the black dragon +00:27 actually takes, breathes fire and a scaliness. +00:31 Alright, so let's do that. +00:32 Let's say this one, +00:34 its scaliness is 2. +00:36 We can make that super explicit +00:37 and I'll say breathe fire, false. +00:40 Okay, so we have a chance to defeat it, but it's still, +00:42 it's going to be tough. +00:43 And here we'll make this a wizard. +00:46 This is an evil wizard. +00:48 So we can have our standard concept of a creature, +00:51 or we can have these specialized ones, +00:53 but we're going to end up treating them all as creatures. +00:56 We don't need this. +00:57 We'll come over here, +00:58 and now we're going to create our hero like this. +01:01 And his name is going to be Gandalf, +01:06 and his level is going to be 75. +01:09 So, it's going to be a little tough for him to beat that, +01:11 he should be able to beat this wizard, he's got no chance. +01:15 Well, he has a chance, but it's highly unlikely, okay? +01:18 Alright, so now we need to randomly choose a creature. +01:21 Now let's go up here and say, import random. +01:27 There's a really great way in Python +01:28 to randomly choose a creature. +01:30 You could say, create the integer, +01:32 figure out how many there were, use the index, +01:34 end to this list of creatures. +01:36 Or you could just say choice, and say, +01:38 give it the creatures, and given a collection here, +01:41 and we'll just grab one. +01:43 Okay, so now we need to print out some information +01:46 about the creature. +01:47 So we can say activecreature., +01:50 now we're not getting very much help here +01:52 from our IntelliSense, but that's okay. +01:56 So then we say name, activecreature.value, +02:00 and that's going to print out a nice little thing. +02:02 And we should be able to actually run it now. +02:03 Let's go ahead and run it and see what happens. +02:06 If it's nice and big, um, not so happy. +02:09 Where did we make this mistake? +02:10 I typed value, this would be level. +02:14 Okay, a tiger of level 12 has appeared. +02:18 Okay, so run away. +02:19 The wizard runs away. +02:21 A black dragon of level 50, has appeared. +02:23 Run away. +02:24 The evil wizard, definitely ran away. +02:26 Okay? +02:27 Then we just hit Enter to exit. +02:28 So it looks like our actors are working. +02:31 All we have to do is have them battle, +02:32 so if they say attack, we'll just have this. +02:35 If a hero.attack(activecreature), +02:40 if that's true then they win. +02:42 So what we actually want to do is make them leave the game. +02:44 So we'll say creatures.remove(activecreature) +02:48 and then we'll say print, +02:50 something like, the wizard defeated them. +02:53 So we'll say just something like that, +02:54 the wizard defeated such and such. +02:56 And we're all good there. +02:58 Wizards run away, there's nothing to that. +03:00 If the wizard looks around, +03:01 we just want to show all the creatures. +03:03 So that's easy. +03:04 We'll just say, for seeing creatures. +03:08 Now we'll do a little format string. +03:13 Like this, and so we'll say, see.name, see.level. +03:17 And notice, +03:18 all we're using are the features of the base creature. +03:21 Not the scaliness, not whether it's breathing fire, +03:24 we're just talking about the standard creature, +03:27 which means we can treat these all uniformly. +03:30 Alright. +03:31 That looks like we've written the game. +03:33 I think we're done. +03:34 I think the last, final thing to do is to play it, +03:38 and it seems more fun to play if we play it full screen. +03:41 So, let's say this, Python 3 a lot. +03:45 Excellent, an evil wizard has appeared. +03:48 Shall we try to attack it? +03:49 I'm sure we'll lose. +03:51 Oh, we're not printing anything if we lose. +03:53 Alright, let's do that one more time. +03:54 So we'll say, if else print the wizard +04:00 has been dealt a defeat. +04:03 Alright, so the wizard has been dealt a defeat. +04:05 Now the wizard doesn't actually lose. +04:09 The game's not over. +04:10 Maybe it could be, but right now it's not. +04:12 So we could attack, first let's look around. +04:15 Alright. +04:16 So we see the bat, the toad, all the things. +04:19 Now if we attack the toad, we should defeat it. +04:22 We do, luckily. If we look around, you'll see now the bat, +04:25 no, the toad is gone. +04:27 This level 12 tiger, we can attack it, and this wizard here, +04:30 let's run away. +04:32 We can look around again. +04:33 Now we just have the bat, the dragon, and the wizard. +04:36 The wizard we're going to run away from. +04:37 The bat we can attack. +04:38 Now what's left? +04:40 Just the dragon and the wizard. +04:41 Alright, we're going to run away from that. +04:43 Maybe we can beat the dragon? +04:44 The wizard has been, guess I got a spelling there, +04:48 the wizard has been defeat by the powerful black dragon, +04:51 has been defeated. +04:52 And we probably, +04:53 it would be nice to see the two roles that came back, +04:55 but that's okay. +04:56 Alright, so if we look around, there's still that. +04:59 Run away, run away, run away. +05:00 Okay, maybe we beat the dragon? +05:03 Yes! Now if we look around, all there is this, +05:04 the chances that we beat this evil wizard, +05:07 not so high, so we're just going to leave. +05:10 But we've defeated all the other creatures. +05:13 There you have it. We've built a game and we've modeled it with classes +05:15 and objects. diff --git a/transcripts/13-text-games/6.txt b/transcripts/13-text-games/6.txt new file mode 100644 index 00000000..85446722 --- /dev/null +++ b/transcripts/13-text-games/6.txt @@ -0,0 +1,23 @@ +00:00 Let's quickly review the concepts around classes +00:02 and remember that classes +00:03 are the blueprints from which we create objects +00:06 and those objects are the things that act +00:09 and take on the data of our application. +00:12 So we start by using them in the class keyword +00:14 and then we just make up a name, +00:15 this is going to be the name of the blueprint, +00:18 or the type that we create, here we called it a creature. +00:21 And then we add a dunder init, +00:24 in one of these magic methods here +00:25 and every method that is on a class +00:27 has this self message what's called +00:29 a static method or a class method +00:31 and they always have self but, +00:33 but we don't have to explicitly pass those, +00:34 Python takes care of that for us. +00:36 If we want additional premiers, they go after self, +00:38 so name and the level and we're going to assign new fields +00:43 to this by saying self.name equals name +00:45 and the new ones for self.level equals the level. +00:49 We also can add behaviors by adding additional functions, +00:52 so get_defensive_role() for example. diff --git a/transcripts/13-text-games/7.txt b/transcripts/13-text-games/7.txt new file mode 100644 index 00000000..80b2b98b --- /dev/null +++ b/transcripts/13-text-games/7.txt @@ -0,0 +1,47 @@ +00:00 I hope it was fun to watch me write this D&D game, +00:02 but it's going to be way more fun +00:04 for you to write one yourself. +00:05 And no, we're not going to write the same game, +00:07 we're going to do something totally different and fun. +00:10 So, over here on the GitHub repo, +00:13 here's the D&D game in case you want to go in +00:15 and actually look the the code we just wrote. +00:17 So you can use that to help you come along here +00:20 as an example. +00:22 Now, let's go down a little bit here. +00:23 We're going to work on a different kind of game. +00:26 Rock, Paper, Scissors. +00:29 So, here's our wikiHow on how to play Rock, Paper, Scissors, +00:31 if you've never done it. +00:32 It's a straightforward, fun little game, +00:35 slightly more complicated than +00:36 just guessing a number and those sorts of things. +00:38 So, it's a pretty interesting game +00:40 in that sort of three option way. +00:43 And so what we're going to do, +00:45 definitely in the first two days, +00:46 maybe even into the third day, +00:47 is we're going to build the standard Rock, Paper, Scissor. +00:50 However, if you feel like you get done early +00:53 and you want something special, +00:54 like a big challenge, +00:55 I've also put a link here to this thing called +00:59 15 Way Rock, Paper, Scissors. +01:01 And, by the way, they even go beyond that +01:03 so you can have more than just 15. +01:05 I think there's like 25 is probably the highest I've seen, +01:08 but there's all sort of fun creatures and interesting +01:11 things going on here. +01:12 So, let's get to the first day. +01:13 So, what you're going to do is mostly just watch the videos, +01:16 learn what you're going to learn by watching them, +01:19 and let's just create a project +01:21 that's going to be the foundation of +01:23 Rock, Paper, Scissors. +01:24 You don't really need to create a virtual environment +01:26 or anything like that +01:27 because there's no dependencies, +01:28 there's really nothing to pip install, +01:30 which is the main reason to have a virtual environment. +01:33 First day, mostly just watch the videos +01:35 and create that starter project. diff --git a/transcripts/13-text-games/8.txt b/transcripts/13-text-games/8.txt new file mode 100644 index 00000000..f946374b --- /dev/null +++ b/transcripts/13-text-games/8.txt @@ -0,0 +1,48 @@ +00:00 Second day, is we're going to write +00:01 standard Rock, Paper, Scissors. +00:03 And you're going to model this with classes. +00:05 There's going to be a roll and the roll has a name. +00:09 It knows what rolls defeat it. +00:12 And, alright, so you store the name +00:17 that other rolls, that the names of the rolls that you +00:20 can defeat as a roll and the rolls that defeat you. +00:24 Also, we have player concept. +00:26 And the player is really just going to have a name. +00:27 So it says, player Sarah rolls this. +00:32 Player Computer rolls that, and so on. +00:34 Alright, so nothing major there. +00:35 You could also keep a history of the rolls. +00:38 You could show like, sort of replay the game if you wanted, +00:41 and each player could remember what they played +00:43 at each stage, that'd be fun. +00:45 And then the basic program flow looks like this. +00:47 This is not perfectly exactly what you necessarily need. +00:50 It's not totally implemented but, we're going to +00:52 print out the header, we're going to initialize the game here +00:55 by getting the various rolls, in this case +00:58 there's only the three: Rock, Paper, Scissors. +01:00 And then we're going to get the name of the player, +01:03 Add the computer and then we'll have an automatic player +01:06 here, and then we're going to run this little game loop, +01:08 by passing them off. +01:09 And the game loopers need to go round-and-round, +01:11 until somebody has won. +01:13 We'll go around three times, and basically +01:15 just have the computer randomly roll. +01:18 And then have the real player ask them what they +01:20 want to roll, Rock, Paper, Scissors, +01:21 and then have them do that roll correctly. +01:24 And then finally, you can just sort of do this comparison. +01:26 Does the one roll defeat the other? +01:28 I don't know, right? +01:29 And then just do a little output here, +01:31 and increment the count so that you'll know, +01:33 like you just played best of three. +01:35 So you'll know who won, figure out who won and then +01:37 print out so-and-so won 2 to 1 or +01:41 3 to 0 or something like that. +01:45 If you get a tie somewhere in the middle, +01:46 this doesn't work so, you know, +01:48 maybe once you get it working, not considering ties, +01:51 then come back and address the possibility +01:53 there might be ties. diff --git a/transcripts/13-text-games/9.txt b/transcripts/13-text-games/9.txt new file mode 100644 index 00000000..292a950e --- /dev/null +++ b/transcripts/13-text-games/9.txt @@ -0,0 +1,32 @@ +00:00 Alright third day, +00:01 if you're not done with the first two days, +00:03 just finish that up. +00:04 Just get your standard 3-way +00:06 Rock, Paper, Scissors working. +00:07 However, if you feel like you want to like, +00:09 take this to the next level and you got done really quickly, +00:12 if you've got some extra time left over, +00:13 try this 15-way Rock, Paper, Scissors. +00:16 This diagram is actually really hard to understand, +00:19 so I put together a battle CSV here +00:23 that tells you if the attacker is a gun +00:25 and the attacker attacks a dragon, +00:27 will a gun defeat a dragon? +00:29 Or does the dragon, over here dragon defeat a gun, +00:33 note the dragon loses to the gun, +00:35 but the gun defeats the dragon. +00:37 So you can think of this like, +00:38 sort of halfway redundant. +00:40 You really only need half this table, +00:42 but having that table is super helpful. +00:45 And here's a little bit of code, +00:46 we haven't gotten to CSVs yet, +00:47 but here's a little bit of code that will read that in +00:50 and you can use it to sort of parse that +00:52 and probably build from. +00:54 Okay, so if you're feeling super adventurous +00:57 and you've got extra time, +00:58 work on this Rock, Paper, Scissors 15-way, +01:01 otherwise just build standard 3-way rock-paper-scissor +01:03 and hope you have a lot of fun modeling these little games +01:06 with classes. diff --git a/transcripts/16-comprehensions/1.txt b/transcripts/16-comprehensions/1.txt new file mode 100644 index 00000000..8c48df9d --- /dev/null +++ b/transcripts/16-comprehensions/1.txt @@ -0,0 +1,27 @@ +00:00 Welcome back to the 100 days of Python. +00:02 In the coming three days I will guide you +00:04 through list comprehensions and generators +00:07 two of my favorite features of the language. +00:09 We're going to look at how you can make +00:12 a for loop with an embedded if statement +00:15 more Pythonic by using list comprehensions, +00:19 then we will load in Harry Potter +00:21 and use list comprehensions to filter out +00:23 non valid and stop words. +00:26 Next up, generators. +00:28 We start very simple with the concept +00:31 of the yield statement writing a simple generator, +00:34 we look at the stop iteration exception, +00:37 and how the for loop catches that for you. +00:40 We move on to more interesting examples +00:43 and finally compare performance of lists +00:46 and generators, because if your data set grows +00:50 you definitely want to know about generators. +00:52 The second day I have practical exercises +00:56 to train your new gained list comprehension +00:59 and generator skills. +01:01 The third day I will show you solutions to those +01:04 exercises and I challenge you to take +01:07 a more advanced generator exercise +01:10 replicating Unix pipelines and it will be a lot of fun. +01:14 So, lets dive straight into those two Python power tools. diff --git a/transcripts/16-comprehensions/10.txt b/transcripts/16-comprehensions/10.txt new file mode 100644 index 00000000..5e93bbd6 --- /dev/null +++ b/transcripts/16-comprehensions/10.txt @@ -0,0 +1,29 @@ +00:00 Alright, you're almost there. +00:02 To get some more practice, I put together +00:04 two smaller exercises, or bites, +00:08 and one bigger co-challenge. +00:11 This one, you will recognize the name's list +00:14 but it's a little different +00:15 because you have to take duplicate names out +00:17 and sort the names and find the shortest first name +00:21 and, of course, you will be using this comprehensions. +00:24 Secondly, what we did not touch upon, +00:27 is dictionary comprehensions, +00:29 so, you might look that up +00:31 and go through bite 26, where you have to +00:34 do some operations on this dictionary +00:38 and this set using a dictionary comprehension. +00:41 And the co-challenge is Generators for Fun +00:44 and Profit, a challenge we run some time ago. +00:46 And this will be a fun one because you have to +00:48 turn this Unix pipline into multiple generators. +00:51 So, I think that's a great way to get some +00:54 more practice using generators. +00:56 Three exercises, see how far you can get +00:59 during this third day of this lesson +01:02 and, of course, share your work. +01:03 Put a tweet out with #100DaysOfCode. +01:06 It's a great way to get visibility of your work +01:09 and, of course, we'll be happy to see +01:11 how you progressed this section. +01:13 Good luck. Have fun. Keep calm and code in Python. diff --git a/transcripts/16-comprehensions/2.txt b/transcripts/16-comprehensions/2.txt new file mode 100644 index 00000000..e44e74e5 --- /dev/null +++ b/transcripts/16-comprehensions/2.txt @@ -0,0 +1,68 @@ +00:00 List comprehensions and generators. +00:02 Let's import the modules we are going to use. +00:09 Let's start making a list of names. +00:15 We've got a bunch of names +00:17 and let's loop over the names. +00:20 for name in names +00:24 and we're going to title case each name. +00:28 There you go. +00:30 Then let's do something more interesting +00:32 involving an if statement. +00:34 So, let's keep the names that start +00:37 with the first half of the alphabet. +00:39 An easy way to do that is to use the strings module, +00:42 which has helpers like ascii.lowercase. +00:51 So here, I used the strings ascii.lowercase, +00:55 I converted it into a list, +00:57 and took a slice of the first 13 elements. +01:01 Great, and the purpose, by the way, of this exercise +01:04 is to first do a classic for loop and if statement +01:08 to later refactor that into a list comprehension. +01:20 Right, so, Mike, Bob, Julian, Guitto, +01:24 but this seems a bit for both, right? +01:26 We looked through the names, +01:28 we do an if statement, +01:30 and it takes like 5 lines of code. +01:33 Before we move on, I have to warn you though, +01:35 if you see the elegance of list comprehensions, +01:37 there is no way back +01:38 and you want to use them everywhere, +01:40 and that's awesome because it reads like English +01:42 and I don't know any reason why not to use them. +01:46 Let's write a simple list comprehension +01:48 to do the same as I did here. +01:51 The very basic level of this comprehension +01:54 uses for inside the square brackets, +01:56 so for name in names. +01:59 And before the for, just returns the name. +02:02 So, this would just bounce the same list we had before +02:05 and the nice thing then, +02:07 is that you can add an if statement after the list. +02:10 So here, first character is in +02:15 first half of the alphabet, +02:18 that's got to stay +02:20 and a result, I want title cased, +02:22 so I can do that here, +02:24 and now we get the same result. +02:26 So, if I call this new names2, +02:30 I can say new_names asserted, +02:34 new_names equals new_names2, +02:38 and they're exactly the same thing. +02:41 So look at that, five lines of code, one line of code, +02:44 and they read pretty well. +02:45 You just have to read from the inside out. +02:48 Have a loop over the names. +02:49 For every loop, I check this if statement +02:53 and I return the name title case, +02:57 if that if statement is true. +02:59 That's all there is to the basics of list comprehensions. +03:02 You can nest them, +03:04 but they might become unreadable, +03:06 so I would definitely stay at this level. +03:08 The other way to write this +03:10 is to use map and filter, +03:12 like the functional programming construction Python, +03:16 and those work equally as well. +03:18 Although, I find this more readable, +03:20 this more like English. +03:22 So, let's move on to another example. diff --git a/transcripts/16-comprehensions/3.txt b/transcripts/16-comprehensions/3.txt new file mode 100644 index 00000000..6c4a30b6 --- /dev/null +++ b/transcripts/16-comprehensions/3.txt @@ -0,0 +1,49 @@ +00:00 Let's do a more interesting example. +00:02 I'm going to load in the text of Harry Potter, +00:05 split it into words, and use list comprehensions to filter +00:10 out stop words, or other words that are not meaningful. +00:15 So let's load in Harry Potter, and parse the response, +00:20 which is response.text, I lowercase it, +00:25 and I split it into a list of words. +00:28 And you can see that by just getting a slice. +00:34 Cool. And let's see the most common words so far. +00:47 Right, well here are stop words +00:50 we're not really interested in, +00:52 and the dataset also has a couple of other characters, +00:56 that should not really be taken into account, +00:59 for example, do we have a dash in words? +01:06 Right, so we need to filter that out as well. +01:08 So let's clean out any non-alphabetic characters first. +01:17 So this looks over the words, and any word that contains +01:20 one or more non-alphabetic, or alphanumeric even, +01:24 characters gets stripped out, and I do realize +01:28 that that might lead to empty words in the result list, +01:31 but next we will have another list comprehension that +01:35 takes care of that. So is the dash gone? +01:42 And yes its gone, but we still have stop words, +01:46 for example "the", which we're not really interested in. +01:50 So let's do another list comprehension to filter those out, +01:54 but for that I need a list of stop words. +01:57 I already prepared it, and the code is the same +02:00 as loading in Harry, I'm just going to copy/paste that. +02:05 And here you have a list of all the stop words. +02:11 Let's wipe those stop words out of the words list so far. +02:16 So words equals word for word in words. +02:22 If word strip, and that's what I said before. +02:26 There might be some empty strings in there, +02:28 and by checking if word strip is true, +02:32 you're basically saying, discard any empty strings. +02:37 So if you have a non empty string, +02:40 and the word is not in stop words, then it's a go. +02:47 So we need non empty words, and a word +02:49 that's not a stop word. If so, store that into the new list. +02:54 And then we can do a simple check. +02:57 If "the" is still in words, and now it's gone. +03:01 Now let's do the counter again, +03:06 and see if we have a more relevant result. +03:12 And there you go, there's the Dumbledore. +03:15 I have to confess I didn't read Harry Potter, +03:18 but this sounds more like Harry Potter. +03:21 So, I think this was a great example to show you +03:25 how you can use list comprehension to clean up data +03:29 for analysis using few lines of code. diff --git a/transcripts/16-comprehensions/4.txt b/transcripts/16-comprehensions/4.txt new file mode 100644 index 00000000..b9a6b425 --- /dev/null +++ b/transcripts/16-comprehensions/4.txt @@ -0,0 +1,36 @@ +00:00 Next up are generators, +00:02 sometimes building up a big list +00:04 hits your performance right? +00:06 It doesn't fit into memory and you can write +00:08 a generator that yields values one by one. +00:11 Its like a function that pauses itself. +00:15 You call it you get one value, it pauses, +00:17 you call it again, it gets you another value +00:20 and it keeps your memory footprint small. +00:22 Its best to write the simplest of generators next, +00:26 lets do a number generator, so def num_10 +00:31 for e in range 5, +00:34 and then we use the yield keyword +00:36 and that's it, that's like the +00:38 smallest easiest generator is, +00:41 that's stored in a variable, +00:47 and that's it. +00:48 Now you can get the next value from the generator +00:51 using the next keyword and that's zero +00:56 and you can loop through them, like this +01:04 and notice that the for loop took of at one +01:07 because zero was already used or returned, +01:12 and another important thing to know about generators +01:16 is that they consume their sequence once +01:18 and once you get to the end and try to go beyond +01:22 that limit you get a StopIteration. +01:24 If I now do next gen, boom +01:26 it doesn't work, it says StopIteration +01:29 because we've exhausted the sequence right? +01:32 And again, for handles this for us, +01:35 so if I initiate this again, +01:41 and do again the for loop, +01:46 we don't get this exception +01:49 because for is smart enough to catch this for us. +01:51 So, that's the simplest generator example +01:54 I could come up with. diff --git a/transcripts/16-comprehensions/5.txt b/transcripts/16-comprehensions/5.txt new file mode 100644 index 00000000..c5b3ac3b --- /dev/null +++ b/transcripts/16-comprehensions/5.txt @@ -0,0 +1,25 @@ +00:00 A common use case I find for generators +00:02 is to build up my sequence. +00:04 So, let's define a list of options. +00:07 Red, yellow, blue, white, black, green, purple. +00:12 And in my older code, I will do something like, +00:22 And that's fine, we just keep an internal list, +00:26 and append to it and return it. +00:30 Just to show you how you can do this in a more +00:32 concise way with a generator. +00:35 I'm just calling it the same name, +00:38 but appending _gen. +00:40 It's the same for loop, +00:42 but instead of building up a new list, +00:44 I'm going to use the yield keyword +00:46 to yield the values one by one. +00:52 Alright, let's see what that gives us, a generator. +00:59 And a way to materialize the generator +01:03 at one go is to convert it into a list, +01:12 and there you go. So this is a shorter, more concise way +01:14 to build up a list or sequence, +01:16 and it's also faster if your data set grows, +01:20 because it's evaluated lazily. +01:23 And actually to show that in practice, +01:24 in the next section, I will compare a list +01:27 and a generator in performance. diff --git a/transcripts/16-comprehensions/6.txt b/transcripts/16-comprehensions/6.txt new file mode 100644 index 00000000..1cd92f53 --- /dev/null +++ b/transcripts/16-comprehensions/6.txt @@ -0,0 +1,28 @@ +00:00 I've said it a couple of times now that generators +00:03 can gain you performance when your data set grows. +00:06 So why not see that in action, and define a million years, +00:10 and loop over them and see which years are leap years. +00:14 So let me write it out and I will explain it next. +00:28 Okay so, first I have a leap years list +00:31 that builds up the list of a million years, +00:34 checking the isleap(), and I'm using calendar.isleap(), +00:37 which is a nice built in way to do that. +00:39 And the second function uses a generator, +00:41 so it's the same loop, but it yields the year. +00:44 So it's not building up the whole list in one go. +00:47 So let's use the timeit module tool, +00:49 time both functions. +00:56 And it's taking a bit. +00:58 Let's do the same for the generator. +01:06 Wow, look at that, that's milliseconds +01:09 versus nanoseconds. +01:11 So the generator is way faster. +01:14 And again, that's because it's not taking up +01:17 so much memory. +01:18 It's yielding the years one by one, +01:21 doing that lazily and saving you memory. +01:24 So that's why generator's faster. +01:27 And when you're working with large data sets, +01:29 you should definitely know about them. +01:32 And that's a wrap of day one of the list comprehension +01:35 generators lesson. diff --git a/transcripts/16-comprehensions/7.txt b/transcripts/16-comprehensions/7.txt new file mode 100644 index 00000000..c9911039 --- /dev/null +++ b/transcripts/16-comprehensions/7.txt @@ -0,0 +1,32 @@ +00:01 Let's look at what we've learned so far. +00:03 List comprehensions. +00:05 For both ways of doing a loop and conditional, +00:09 we loop over list and store all the modifications +00:12 in a new list. +00:13 Five lines of code. +00:15 The more Pythonic ways to use a list comprehension. +00:19 One line of code. +00:20 And it reads like English. +00:22 We went through another sample cleaning up a word list, +00:25 and you can do multiple checks. +00:28 in the conditional part over list comprehension. +00:32 Secondly, generators. +00:35 The simplest generator would be something like this. +00:39 For in range, yield the value. +00:42 Generators, pause. +00:44 So, after every call it stops at the yield, +00:47 and comes back. +00:50 Use a generator to build up a sequence. +00:53 Here I made a bunch of options for a fictional website. +00:57 And instead of building up a list in the function, +01:01 we use the yield statement +01:02 to just generate a sequence of items. +01:06 And lastly, +01:07 we look at list and generators, +01:12 and we saw that when your data set grows +01:15 your really want to know about generators +01:17 because the items are lazily loaded, +01:20 not taking up the whole memory footprint. +01:23 And that's it for the basics. +01:26 And now it's your turn for day two and three +01:29 to get more practical exercise. diff --git a/transcripts/16-comprehensions/8.txt b/transcripts/16-comprehensions/8.txt new file mode 100644 index 00000000..4cf58a5d --- /dev/null +++ b/transcripts/16-comprehensions/8.txt @@ -0,0 +1,23 @@ +00:01 Welcome back to 100 Days of Python. +00:03 The second day of list comprehensions and generators. +00:06 Now that we've got some theory down, +00:08 it's all about getting practice. +00:10 I've got some small exercises to get practice. +00:14 So, here you're provided with a names list +00:18 of names and surnames. +00:19 And can you write a simple list comprehension +00:22 to convert those names to title case, and reverse the +00:25 first and the last name? +00:27 Then we use that data to make a simple +00:30 generator that generates output like this. +00:35 So, we initialize the generator. +00:37 We look through a range of 10, +00:40 and call next on the generator. +00:42 And every time we call next +00:44 it returns name one teams up with name two. +00:47 And those names are randomly chosen +00:50 That should not be too hard +00:52 after yesterday's lesson. +00:54 So have fun, and tomorrow +00:55 we'll show you the solution to +00:56 these two exercises. diff --git a/transcripts/16-comprehensions/9.txt b/transcripts/16-comprehensions/9.txt new file mode 100644 index 00000000..d81d1d4f --- /dev/null +++ b/transcripts/16-comprehensions/9.txt @@ -0,0 +1,78 @@ +00:00 Welcome back. +00:01 I hope yesterday's exercise was reasonable for you +00:04 but starting today I will show you a possible solution. +00:08 If it was very easy for you, +00:10 feel free to skip to the next video +00:12 where I have some other exercises lined up for you. +00:15 Okay, so the first thing we needed to do +00:17 was to title case the names using a list comprehension. +00:22 That should be pretty easy now. +00:24 So, name title for name in names. +00:31 Oops and names is not defined +00:33 because I did not run the cell and let's run it again. +00:37 Okay, cool. So, every name is title cased. +00:40 And then we have to write a list comprehension, +00:42 reverse the first and the last name +00:45 using a helper function. +00:47 So, let's define reverse the first, last names +00:55 and it takes a name, split the name in first and last +01:02 so this is a nice example of unpacking. +01:04 So the name splitted by defaults space, get you two elements +01:09 and you can assign them directly to first and last. +01:13 Then, we return them and I was using a join but in 3.6 +01:18 you can use f-strings where you can embed the variables, +01:21 which is very nice. +01:28 And let's do the list comprehension to use that function. +01:31 Reverse first, last names, name for name in names. +01:42 Right. And yeah, I dropped the title case requirement here +01:45 but that worked. +01:47 Then we move on to generators +01:48 and the exercise was to generate random pairs of names. +01:53 So, name one teams up with name two, etc. +01:57 First, define a function. +02:02 And, let's get the first names and we can again +02:06 use a list comprehension for that. +02:11 So, we split them again +02:12 and we take the first element with indexing. +02:15 We title case that. That's nice with python, +02:19 that you can chain all these operations for name in names. +02:27 So, let's do an infinite loop. +02:30 Which I usually do with while true. +02:34 I initialize first and second. +02:42 And this little while, I'll explain in a bit +02:45 was that I had to add later. +02:51 And I used a random sample to take the first names list +02:57 and pick two items. +02:59 Why you needed the while? Well, it turned out that +03:01 I could have two teams of a Julian +03:04 so the same name came out of random sample. +03:06 So, while that's the case, keep picking two names basically. +03:10 So that was a little tweak I had to do to make sure +03:13 that both names were always different. +03:15 And then again, I used a f-string to return first, +03:21 teams up with second. +03:26 And let's see if that works. +03:28 So, I assign the generator two pairs. +03:35 So for underscore in range and the underscore is just a way +03:41 in Python to say throw away variable +03:43 I don't care really what that loop variable is. +03:46 Print next pairs. I can adjust to four variable in 10 pairs +03:53 because that will go on infinitely. +03:56 So I'm making sure I'm making +03:57 next to retrieve one value at a time. +04:04 Okay, I did not import random. +04:10 And there you go. Jewel teams up with Julian. +04:12 Ali teams up with Bob, etc. +04:16 One final thing I wanted to show you is itertools, islice +04:19 because I said before you can not just loop over +04:21 an infinite generator, it will probably hang your system +04:24 because it never ends but islice, you can slice a generator +04:28 just as you would slice a normal list but that overcomes +04:31 that problem, so I can just do, itertools.islice +04:39 give it the generator and the number I want, +04:42 that gives an islice object and +04:45 I can materialize those in a list by doing this. +04:52 There you go. Okay, those were two possible solutions +04:56 of the small exercises I gave you yesterday +04:59 and in the next video, +05:01 I will show you some more exercises you can do today. diff --git a/transcripts/19-iterators/1.txt b/transcripts/19-iterators/1.txt new file mode 100644 index 00000000..22a5828d --- /dev/null +++ b/transcripts/19-iterators/1.txt @@ -0,0 +1,11 @@ +00:00 Good day guys, this is Julian Sequeira, +00:02 and welcome to iteration with itertools. +00:06 This is going to be a three day series +00:08 just touching on the more common, +00:11 arguably more common, usages of itertools. +00:15 We'll start off with a bit of a coverage +00:17 of what iteration is, very basic stuff, +00:20 and then we'll get straight on into itertools. +00:23 So carry on, move on to the three day overview +00:26 for some more detail, +00:28 and then we'll get straight into the code. diff --git a/transcripts/19-iterators/2.txt b/transcripts/19-iterators/2.txt new file mode 100644 index 00000000..59b3a2d9 --- /dev/null +++ b/transcripts/19-iterators/2.txt @@ -0,0 +1,54 @@ +00:00 The next three days are +00:01 going to be pretty jam-packed +00:02 with content for you guys to consume. +00:05 So, for itertools day one, what I'd like you +00:08 to do is actually just watch the videos. +00:10 There are four videos to do, and they involve +00:13 cycle product combinations and permutations, okay? +00:19 I'd like you to pay specific attention +00:21 to cycle, I'll explain why in a second. +00:24 But, pretty much, that's all you have to do for day one. +00:28 Nice and easy. Just grasp the concept and play in the shell. +00:32 I cannot stress that enough. +00:34 Actually do some live coding in your Python shell, okay? +00:40 Do that to really grasp the concepts +00:42 of cycle product combinations and permutations. +00:46 For day two, you're going to create a traffic light script. +00:52 Okay, now what this script is going to do, +00:55 it's actually going to pretty much just emulate +00:58 or simulate traffic lights. +01:00 Red, amber, and green. +01:02 Okay, nice and simple, it uses cycle. +01:06 Which is why I want you to learn itertools cycle +01:10 and pay attention to that one specifically. +01:13 And you're going to create it before +01:14 you watch the traffic lights video, okay. +01:18 The video is there, it'll be right after combinations +01:21 and permutations, but please try not to do that +01:23 until you actually give this an attempt. +01:27 Okay, give this a go yourself, and then check +01:30 the video to see how you went, okay? +01:34 Now for your last day, after you've finished +01:37 your traffic lights, I would like you to have a play +01:43 with bite 64, +01:45 bite 17, or bite 65 +01:48 on the code challenges platform, okay? +01:52 These are three bites that are free +01:56 for you because you're in this course. +01:58 And they will actually make you use itertools +02:03 in some way, shape, or form, okay. +02:06 Some of them are easy, this one's intermediate here, +02:10 and this one's also intermediate, okay. +02:13 So have a good play with these three bites. +02:18 There's nothing much to it; you'll code within the browser +02:21 and you'll hit test to run some tests against your code. +02:24 A really great way to spend your third day. +02:26 Nice and easy, it's all laid out in front of you, +02:29 you just have to focus on the code. +02:31 So if you want to go +02:32 to bite 64, 17, and 65 +02:35 using these three links, you'll get them for free, and then +02:38 you can spend your last day just plain coding. +02:42 And that is pretty much your three-day wrap-up. +02:45 Go through it, if you have any questions, always reach out. +02:48 But, other than that, move on to the diff --git a/transcripts/19-iterators/3.txt b/transcripts/19-iterators/3.txt new file mode 100644 index 00000000..180b8ffb --- /dev/null +++ b/transcripts/19-iterators/3.txt @@ -0,0 +1,86 @@ +00:00 All right, so let's discuss what iteration is in Python. +00:06 When we say something is iterable, we're saying +00:09 that you're able to iterate over it, +00:10 you're able to move through it one item by item, okay? +00:16 So the easiest way to demonstrate this +00:19 is just to get a simple list. +00:21 So we'll create a quick list here of numbers. +00:26 Let's go with the numbers 1 through 10. +00:31 Okay, oops, what am I doing? +00:35 1 through 10. +00:37 And we know that, +00:41 and we know that number is 10 digits, right? +00:44 Nice and easy. +00:45 Now if we're iterating over that, +00:49 we're going to run a full loop, so for i in numbers, +00:54 in number, I should say, print i. +00:59 This is something we've all done before, we all know +01:02 what this is, but what's happening behind the scenes? +01:05 Okay, yes we're running a full loop, +01:07 but really what is that full loop doing +01:09 to iterate over the number list +01:14 and give you the numbers? +01:17 Well, it's actually calling the iter dunder method, +01:21 or iter protocol, okay? +01:24 So we can see this if we actually +01:27 drill in to the number list. +01:30 We can see that it is actually calling iter +01:35 or it's capable of being iterated over. +01:38 Okay, so we've got iter and dur number +01:43 and we get true, so it's in there. +01:45 This is an iterable item, we can iterate over it, okay? +01:50 Now another way to demonstrate +01:52 an iterable item is to use next. +01:56 We've all seen next before, or hopefully you've seen next. +01:59 And what happens is when you run next on an iterator, +02:03 when it finishes iterating over the sequence, +02:07 over the list or the string or whatever it happens to be, +02:10 when it finishes this, it then gives you an error, +02:15 okay, it gives you a StopIteration error +02:18 because it's only going to iterate through it +02:20 up until the end and then it will stop. +02:24 So now that we know that iter is actually +02:26 what's being called in the background, we can use that, +02:30 okay, we can use that with next. +02:32 Now if you haven't heard of next, +02:34 next is a little function you can run against an iterator. +02:41 And what it will do is it will pass over, +02:44 it will iterate over that iterator, +02:47 that list or that string or whatever it is, +02:50 and it will continue through it until it hits the end. +02:53 When it hits the last item, when it hits the last character, +02:57 it will actually give you a StopIteration error, okay? +03:01 So we'll demonstrate that with a string called, +03:04 let's call it string, okay? +03:06 So it equals iter, we're actually +03:09 calling iter now over the word string. +03:14 Okay, so we know that when you iterate +03:16 over this word here, over this string, +03:19 you're going to get the letters one by one, right? +03:22 So if we call next on that, we'll get the letter S, okay? +03:29 Now let's copy and paste this a few times, +03:31 just so we can demonstrate. +03:34 We get the T, we get the R, I, N, G. +03:38 But then, when we run it one more time, +03:42 we get the stop iteration, okay? +03:45 And that is because we're calling next directly. +03:51 That's because it's hit the end and it's taken care of. +03:53 It gets to the end but then it's not going to go any further +03:57 because it knows it's already finished. +03:59 Now, when you run a full loop, +04:01 so for character in string, +04:07 print character, +04:09 we get the letters, but we don't get this error, +04:13 we don't get the StopIteration error, +04:15 and that's because it's actually built in to the full loop +04:18 so that it's not going to give you that error. +04:21 It's expected, okay, so it knows +04:25 that it's hit the end and it's not going to actually +04:28 sit there and give you the error. +04:30 And that's it, that's a basic coverage of iteration. +04:33 You see it's just going through each object, +04:36 each item, one by one, to get to the end. +04:39 Now, there is iter tools, a nice series of functions +04:44 that are just so cool and make iteration +04:48 a lot more interesting and a lot easier, +04:51 so that's what we're going to look at. diff --git a/transcripts/19-iterators/4.txt b/transcripts/19-iterators/4.txt new file mode 100644 index 00000000..5dcae819 --- /dev/null +++ b/transcripts/19-iterators/4.txt @@ -0,0 +1,111 @@ +00:00 So we're going to kick off our foray into EdiTools +00:03 by using EdiTools.cycle. +00:06 This is one of the infinite usages of EdiTools. +00:11 Okay, in the since that when you use it, it's just going +00:14 to keep iterating over the item or series of items +00:19 over and over again. +00:20 It doesn't stop until something tells it to stop, okay? +00:25 So, let's have a go. +00:27 First thing we're going to do is import EdiTools. +00:32 Now we're going to import, I'll explain all of this +00:34 in a second, we're going to import sis +00:36 and we're going to import time. +00:38 What we're going to make, and this is a really cool one, +00:40 I absolutely love this one, we're going to make +00:43 one of those little, cool spinny line things, you know? +00:47 Like a little loading line that you see on the command line. +00:50 You might actually like this or you might hate it +00:53 depending how many times you've seen it. +00:55 So, to make that, we're going to go symbols, +00:59 let's create a little item here called symbols. +01:03 And it's going to be EdiTools.cycle. +01:08 Now what we have to specify between the brackets is, +01:11 tool tip gave it away, is the iterable, +01:14 the item that we're going to iterate over with cycle, okay? +01:18 Now that could be a variable, could be anything really, +01:21 it could be any object, but, +01:23 we're going to use just a specific set in a specific order. +01:29 So if you think about this, take a look at how these +01:32 are lining up. +01:33 This looks like a spinner right now. +01:35 So it's going to start with a horizontal dash, +01:38 then it's going to go into the slash, then the pipe, +01:40 and then the other, then the forward slash, +01:42 and so on and so forth, okay? +01:44 And it's going to iterate through that. +01:46 It's going to keep cycling through this and you'll see +01:50 that it actually starts to spin. +01:52 Alright, it gives you that sort of feeling of a spin. +01:56 Now, to do this, we need to put it in a loop. +01:59 So we're going to give it a while loop. +02:02 So while true, and again, dangerous, this is just going to +02:05 keep going until you control c out of it all. +02:08 Snap out of it in some way, shape, or form. +02:12 To get this to work the way we want it to work, +02:16 we need to use the sis module, okay? +02:21 So, I won't go into sis now +02:23 because this is pretty straightforward +02:26 and you may already know it +02:28 and it's out of the scope, so we're going to essentially +02:31 send this data to standard out, okay, +02:34 on the system, wherever you're running this from. +02:37 And the little trick we want to do here is, +02:42 I'll just show you, we're going, +02:43 let me type it in first. +02:45 We're going to go next, symbols... +02:47 Alright so what this line is going to do +02:49 for every single loop it's going to do the next. +02:53 Remember we covered next. +02:54 It's going to go through the next iteration +02:56 of EdiTools.cycle, okay? +03:00 And this here, the slash r, is going to negate +03:06 putting this on a new line, okay so, +03:08 it's not going to return, +03:10 it's not going to put it down on a new line, mkay? +03:15 Now, sis, this one here we sort of have to put in +03:17 just for safekeeping. +03:19 Just in case, okay? +03:21 Oops, not flash. +03:22 Flash, so sis standard out flash, this guarantees, +03:26 this will force whatever you're putting to standard out +03:30 to appear on the screen because from time to time +03:33 you might actually get what you're writing to standard out +03:37 going into a buffer and we don't want that. +03:39 We want it to be flushed out of the buffer +03:41 and onto the screen. +03:43 And then we're going to put a time delay. +03:45 That's why the imported time up above. +03:47 Let's just make it one second, okay? +03:49 So, our while loop, it's going to start iterating using next +03:53 through EdiTools.cycle, okay, +03:56 it's going to cycle through this infinitely. +03:59 It's going to flash it and make sure it appears on the screen +04:02 and then it's going to take a second, +04:04 okay it's going to sleep for one second +04:06 and it's going to do that for, +04:10 well, for eternity, until we exit out, okay? +04:15 So look at that, we're starting to go through here. +04:17 Just ignore the two here. +04:20 This is a by product of actually running through this +04:24 in the python shell. +04:26 So what we're actually going to do is we're going to put this +04:30 into a, an actual python file +04:32 and we're going to run it from our Windows command line +04:36 and you'll see how it actually works. +04:39 Okay, with some magic here we now have all of that +04:42 in a little script and now all we have to do +04:46 is run python and what did we call it? +04:49 We called it cycle_demo, +04:53 and look at that. +04:55 Look at this funky little spinner over there. +04:57 So, that looks kind of boring now... +05:02 Mkay, so let's go into this and change this in seconds +05:07 to be zero point, +05:10 five seconds. +05:14 Let's try it again. +05:17 And look it's speeding up, okay it's gettin' quicker. +05:19 It's gettin' quicker. +05:20 And just, just for the fun of it, let's make it super fast. +05:24 And look at that, now it looks like a proper spinner. +05:27 So this is a perfect, perfectly awesome and usable example +05:31 of EdiTools.cycle diff --git a/transcripts/19-iterators/5.txt b/transcripts/19-iterators/5.txt new file mode 100644 index 00000000..98eb9eec --- /dev/null +++ b/transcripts/19-iterators/5.txt @@ -0,0 +1,95 @@ +00:00 Let's take a quick look at itertools product. +00:03 Now product actually is short for Cartesian product +00:08 or it's a Cartesian product, I suppose. +00:11 Now, what does that mean? +00:12 Well, it's not another language. +00:13 It actually means it is every +00:16 possible combination of values. +00:20 Alright, so think of it this way. +00:21 Let's say you had a string. +00:23 Let's say you had my name +00:25 and you wanted to see how many different possible +00:29 combinations you could get of the letters. +00:33 Now you can change that slightly. +00:36 So, the first thing that comes to mind is that you +00:39 might think how many combinations of six letters. +00:43 So my name, J-U-L-I-A-N. +00:46 How many combinations of those six letters can you get? +00:52 Now with itertools product, +00:54 that is exactly what it calculates for you. +00:57 That's what it prints out on the screen for you. +01:00 So, let me demonstrate that for you. +01:01 Okay, so we've done from itertools import product. +01:05 For letter, and we'll use my name +01:07 just because we've discussed that. +01:09 For letter in product, now in product, +01:12 look at that tool tip, we choose the iterable, +01:14 the item that we're iterating over and the repeat. +01:18 Now the repeat, it's actually quite easy. +01:21 It's much easier to show it to you. +01:22 But the repeat is essentially how many of those letters +01:27 or those items in that iterable +01:30 you want to show up as a product. +01:33 Okay, so let me show you. +01:34 So, we're going to use my name. +01:38 Julian. +01:39 And then, for the repeat, we're going to say 1, +01:42 just like the tall tip. +01:43 And when we hit enter, or when we, sorry I should say +01:47 when we print out the letter. +01:51 You'll see we, because we repeat it only 1, +01:54 we're only saying, well we only want one group, +01:58 1 grouping, we're only going to use how many iterations +02:01 of this, how many combinations of this are we getting to +02:07 a maximum of 1 character or 1 object? +02:12 Okay, so you can see here +02:14 Julian, the J can only show up once. +02:17 Okay, because it's only repeated once. +02:19 So, if we change this, let's just copy this back out. +02:26 And we change this to 2, +02:29 we can go print, letter. +02:33 Now, watch what happens. +02:35 We get a lot more as a result. +02:37 Okay, so the first thing it does is it takes the letter J. +02:41 Well, we're repeating 2. +02:42 We're going to use a combination of 2 letters. +02:44 We want to maximum of 2, it can repeat twice, okay. +02:48 So, we're going to have J with J. +02:51 We're going to have J with U. +02:52 We're going to have J with L. +02:53 We're going to have J with I. +02:54 And so on through the list. +02:55 And once it exhausts, J being in the first position +03:00 and this other combination being in the second position +03:05 it then moves down to the U. +03:07 And then it repeats it all over again. +03:09 And then, L and so on. +03:11 And it keeps going. +03:13 Now one thing you'll notice, +03:16 is that we're talking about the positioning here. +03:18 Okay, so U and I appear together here. +03:23 But they also appear together here. +03:26 I and U. +03:28 The difference being obviously that because they're in a +03:30 different order, it counts as a different combination. +03:35 Remember, this is every possible combination. +03:38 While yes, they're still returned as U and I +03:42 you're still getting a U and an I returned, +03:44 because they're in a different order, +03:45 because they're in a +03:46 different technical combination, I suppose. +03:49 They are capable of showing up twice. +03:52 Okay, what you will also notice, +03:56 is that J, J, does not show up twice. +04:02 Okay, it shows up once, because it doesn't matter. +04:06 These aren't treated as different J's. +04:09 It is a J, plain and simple. +04:11 Okay, so it shows up J, J, just once. +04:16 And that is editor's product. +04:19 It's so simple, but just imagine trying to code this +04:25 yourself with a for loop +04:26 and looking at if statements and everything like that. +04:29 It's disgusting, right. +04:31 So, this is the power of itertools with just two lines of +04:34 code you can get every possible combination, +04:39 the Cartesian product of an iterable. diff --git a/transcripts/19-iterators/6.txt b/transcripts/19-iterators/6.txt new file mode 100644 index 00000000..40ef5f2a --- /dev/null +++ b/transcripts/19-iterators/6.txt @@ -0,0 +1,72 @@ +00:00 Next up we're going to look at itertools +00:02 combinations and permutations. +00:06 Now let's look at combinations first. +00:10 Now combinations allows you to get +00:12 the possible combinations of an iterable +00:17 of the certain, you know, of a certain string +00:19 or a certain list, okay? +00:22 So let's just get our setup here. +00:25 From itertools import permutations, combinations, okay? +00:34 Let's say we have Mike, Bob and myself. +00:37 All right and we'll make a friends list, +00:40 'cause we're friends right? +00:42 Please say we're friends. +00:44 Mike, Bob, and Julian, and we'll split that, not splut, +00:49 we'll split, okay so we have friends. +00:51 We have this list, Mike, Bob, and Julian. +00:56 Now with combinations, we can see how many +00:59 combinations you'll get of the three of us, okay. +01:02 Now this will actually give us a generator, +01:07 so we're going to use list, we're going to force it +01:10 to be a list okay, so just bear with me here. +01:14 So print(list(combinations())), okay so this is now +01:18 we're talking edit tool stuff +01:20 and in the brackets we have the iterable, okay? +01:24 And the Iris pretty much what we want +01:27 the combinations to include how many combinations we want. +01:31 So for example if we specified Iris two, +01:34 okay it would say, okay combinations of two. +01:37 So Mike and Bob, Bob and Julian, +01:39 Julian and Mike and so on, okay? +01:41 So we're going to actually choose our friends list, all right? +01:46 And then we're going to have a length of 2 okay? +01:50 Let's close all this off. +01:52 And you'll see that we get, well first of all +01:53 we'll get return, it returns tuples, or tuples. +01:59 And look at the combination set that we get there. +02:01 We get Mike and Bob, get Mike and Julian, +02:04 and then we get Bob and Julian. +02:07 And what is it that you've probably noticed? +02:08 There's no order, okay. +02:14 There's no, what if the order mattered? +02:15 If you were trying to return this list +02:16 but you don't like Mike being first every time, +02:19 what happens if you want it to return a tuple +02:23 as Bob, then Mike, Julian, then Mike, Julian then Bob. +02:27 Well that's where permutations comes in. +02:31 So combination gives you just a valid combination, +02:36 it doesn't care about the order, right? +02:39 Permutation will give you not only the valid combinations +02:43 but also in whatever possible order they can be in, +02:49 okay and that's where permutations is super powerful, okay? +02:54 So we'll do it the same thing, +02:55 we'll do the exact same things, +02:57 let's just, may as well copy and paste. +02:59 We'll do print(list(permutations()) +03:02 works in the same way, see we got the +03:05 iterable and we got the r. +03:07 We can go whoops, can't type. +03:09 We can go friends and we'll do two as well, +03:12 just so we're keeping this standard. +03:16 And look at that, we now have Mike and Bob, +03:19 Mike and Julian, but then we also see, +03:22 Bob and Mike, so over here we same Mike and Bob, +03:25 and over here now we see Bob and Mike. +03:28 Then there's Bob and Julian, then there's the opposite, +03:30 Julian and Mike, as opposed to Mike and Julian, +03:34 and Julian and Bob instead of Bob and Julian. +03:37 And that's why permutations is awesome. +03:41 I mean they're both awesome but this is such +03:43 a great way of doing it, it's one line of code, +03:47 it's just amazing, if again, itertools is awesome. +03:51 That is permutations and combinations diff --git a/transcripts/19-iterators/7.txt b/transcripts/19-iterators/7.txt new file mode 100644 index 00000000..67b7b5ab --- /dev/null +++ b/transcripts/19-iterators/7.txt @@ -0,0 +1,162 @@ +00:00 Alrighty, in this video we are going to create +00:03 some traffic lights. +00:05 As discussed in the ReadMe from the three-day overview, +00:09 I strongly urge you to try this yourself. +00:12 It's not too difficult, it's a nice little challenge +00:15 for your second day. +00:17 This video is going to walk you through +00:18 how I've created it. +00:22 If you haven't done it, +00:23 if you haven't attempted it yourself, +00:25 just pause it here, or hit stop and minimize. +00:28 Avert your eyes, children, and just give it a try yourself. +00:32 This is the best way to learn. +00:34 You're going to need itertools cycle, I'll give you that tip, +00:38 and that's it. +00:40 Out of all the stuff we've covered so far, +00:42 itertools cycle is all you're going to need for this. +00:46 Then, just think about how traffic lights work +00:48 and go from there. +00:50 Now, into the code. +00:53 We're going to just import some modules here. +00:56 For me, I'll discuss this in a minute, we're going to import +01:01 from time import sleep because we do want our traffic lights +01:06 to sleep when you're going between the colors. +01:13 Now let's import itertools +01:15 and let's import random +01:19 because I have an idea. +01:22 First thing we're going to need is we're going to need +01:24 our colors, aren't we? +01:25 What are the three colors on a traffic light? +01:28 We've got red, green, amber, or yellow, +01:32 whatever you want to call it. +01:35 You know what I mean, I can't type this bit, can I? +01:38 And that gets our colors list. +01:41 Now, the rotation between those colors. +01:45 Again, if you haven't done this yet, hit pause now. +01:51 The rotation of going through those lights, +01:53 we're going to use cycle, remember the spinny thing +01:56 from the other video. +01:57 We're going to use itertools.cycle, but this time +02:02 we're going to call colors, +02:06 just like we have here. +02:08 We're calling this and we know it's now going to cycle +02:11 through red, green, and amber because by using split +02:14 we created a list of these three strings. +02:18 So that's what rotation is. +02:21 Alrighty, so let's create our function. +02:25 You know what, before we start any of that, +02:28 let's throw this in so we know where we're starting. +02:33 What do we want our function to be called? +02:36 Let's call it light rotation. +02:42 We're going to pass in rotation. +02:49 Not that, well, I suppose, we have to, +02:50 but we'll just do that anyway. +02:53 We'll go def light(rotation) +02:57 We're reading in the rotation. +03:02 So, what's this app going to do? +03:03 What's this little traffic light going to do? +03:05 It's pretty much going to have three if statements. +03:10 It's going to be, what do we see when it's amber? +03:12 What do we see when it's red? +03:14 And what do we see when it's green? +03:18 So, we'll create a for loop for color +03:23 in rotation. +03:27 Now, remember, that's pretty much, +03:28 we're not saying this here, we're saying just for the item +03:33 in rotation, and rotation is returning each one of these, +03:38 for the item in rotation, for the color in the rotation. +03:42 Let's just make it really simple. +03:44 If color equals amber, +03:47 this is a direct match now, +03:50 we're asking for a direct match. +03:51 At this point, we have to know +03:53 it's going to say exactly that. +03:56 Let's go print. +03:58 Caution. +04:01 The light +04:03 is... +04:05 Where's percent? +04:07 Okay. +04:10 And then we just close it off with color. +04:14 This is now going to print, if the color is amber, +04:17 caution, the light is amber. +04:22 Then, at this point, we want it to sleep +04:27 because, if you think about it, +04:29 when a traffic light goes yellow, or amber, +04:32 it doesn't just go to red straight away, does it? +04:35 It takes a few seconds, so let's just put in a sleep +04:39 of 3 seconds. +04:42 That's it for that. +04:44 Just because we're only dealing with 3 colors here, +04:48 let's just go with an elif statement. +04:50 If the color is, now, red, or, elif color is red. +04:55 We're going to go print, stop, +04:59 the light is... +05:03 Oops. +05:05 S and then we go color. +05:11 Now we can do a sleep of, let's go 2 seconds. +05:18 And then we can go else because in any other case +05:21 it's going to be green, isn't it? +05:23 Print, go. +05:26 The light is... +05:30 Oops. +05:31 Color. +05:34 And we'll do another sleep of 3 seconds. +05:37 Believe it or not, that's our app. +05:40 This function here is going to go +05:44 through editor's dot cycle of colors, red, green, and amber, +05:48 and it's going to say, well, if amber, do that. +05:51 If red, do that. +05:53 And then, if all else fails, it's going to be green, +05:56 it's going to be the other option, +05:57 and we're going to get green. +06:01 Let's run that. +06:03 Save it, F5 it. +06:05 Stop, the light is red. +06:07 Go, the light is green. +06:10 Caution, the light is amber. +06:12 Now, the catch here is that it's going to actually be +06:15 the same few seconds every single time, +06:19 so we can anticipate that. +06:20 That's not how traffic lights work. +06:22 So to make it a little more interesting, +06:26 a little more complicated, let's get rid of these static +06:32 sleep seconds. +06:33 We know with yellow lights, those are always going to be +06:36 3 seconds, or 5 seconds, +06:38 because it's the standard every time. +06:41 This is why I imported random at the start. +06:44 Let's make it a little randomly generated timer. +06:51 We're going to go return, random.randint. +06:56 And what are we going to put the... +06:58 See, here we go, return a random integer in the range. +07:00 So what do we want the range to be? +07:03 Let's go 3 to 7 seconds. +07:08 So it's going to return those integers, anywhere between +07:12 three and seven, so we should just call this +07:16 in sleep +07:20 right there +07:21 and right there. +07:22 What that will do is it's going to generate a random number +07:26 between 7 and 7 every time, and this should change. +07:31 You can't predict what that's going to be. +07:34 Let's run it. +07:35 The light is red, okay. +07:38 We have no idea how long it's going to take. +07:40 There we go, so it actually took longer than before, +07:42 same with the light being green. +07:45 That was very quick, that was only about 3 seconds. +07:47 Amber, default, 3 seconds. +07:49 Then we're back on red, and it's sitting there +07:53 for quite a while, so there you go. +07:54 Now this is more of an accurate street traffic light, +07:59 where it's a bit more randomly generated. +08:01 But all of this, +08:04 due to the awesomeness of itertools.cycle. +08:09 There's your traffic light. +08:10 Hopefully, your code looked something like that. +08:14 Hopefully it was a little cleaner. +08:16 But other than that I think we've just made an awesome +08:19 little nifty app and a little tool, something that you'll +08:23 probably never use , but that's itertools.cycle. diff --git a/transcripts/19-iterators/8.txt b/transcripts/19-iterators/8.txt new file mode 100644 index 00000000..142bdb46 --- /dev/null +++ b/transcripts/19-iterators/8.txt @@ -0,0 +1,108 @@ +00:00 Well, I hope you really enjoyed itertools, +00:02 because it's really one of our favorite modules. +00:05 It's just so much fun to use, and saves you so much time. +00:10 So, without further ado, what did we cover? +00:15 The first thing we covered was itertools.cycle. +00:19 Okay, so itertools.cycle, +00:21 we just imported cycle from itertools. +00:24 Go figure. +00:26 Then, we specified the iterable. +00:29 Okay, the iterable that we wanted cycle to go over, okay? +00:33 and for our little exercise there, +00:35 it was those weird dashes, +00:37 so that we can make a little scroller. +00:39 If you were to use a string, such as the word string +00:42 or my name, Julian, +00:44 it would then cycle through those letters +00:46 in the same way that it's cycling through those. +00:49 Okay? +00:50 And that's why cycle is so easy to use. +00:54 It does exactly what its name implies. +00:56 It's awesome. +00:58 Then, what we did was we threw it in a while loop, +01:01 while True, so that it was infinite, +01:03 it would just keep running while this app was live. +01:07 And then we pumped that.. +01:10 Next, we pumped that cycle out to standard out. +01:14 That way it would work well on the command line. +01:17 Okay? +01:18 Using Next, we were able to actually go through +01:23 one iterable at a time. +01:25 One iteration at a time. +01:27 Okay, so we know each iteration, each cycle +01:31 is going to be one of these characters here. +01:35 So, Next got us to pull just that one in the first loop. +01:39 Then, in the Next loop, it then took the backslash, +01:42 and then the pipe, and then the forward slash. +01:45 Okay? +01:46 That's how this works here. +01:48 And then we just threw in a little time.sleep, +01:50 just to slow things down a bit. +01:52 Next we have itertools.product. +01:54 So again, we imported product, okay? +01:57 And then what we did was we used repeat, okay? +02:02 We used the repeat inside product to say +02:06 how many combinations we wanted. +02:09 How many times we wanted a single iterable +02:13 to be repeated or any iteration to be repeated. +02:17 Okay? +02:18 So by specifying two, when we iterate over my name, +02:23 we were able to start getting a giant list just like this. +02:26 Okay? +02:27 So J matched with J, J and then U, and so on and so forth. +02:32 Okay? +02:33 And that's what product is, it's a Cartesian product, +02:36 it gives you every possible combination. +02:39 Okay? +02:40 It doesn't matter in this instance with the doubles, +02:44 where you've got J and J. +02:45 There's no sort of behind the scenes +02:48 differing index there to say, +02:50 "Hey this is one J, and this is another one. +02:52 "So there needs to be double." +02:54 No. +02:55 It's just a J, okay? +02:59 Then we moved on to combinations and permutations, +03:01 one of my favorites. +03:03 Imported, nice and easy. +03:05 And then we created a quick list of super friends, +03:08 Mike, Bob, and Julian. +03:10 And this was for us to then use as an example. +03:13 So we got the combinations, okay? +03:17 In sets of two... +03:20 Of Mike, Bob, and Julian. +03:22 And you can see we have Mike Bob, +03:24 Mike Julian, and Bob and Julian. +03:26 And then that's when we pointed out +03:28 that, well, there's no order here. +03:31 It takes it into account that, okay +03:33 Mike and Bob both exist in this one tuple +03:36 and therefore that's criteria met, +03:38 that's a combination. +03:41 But, if we wanted the order to change, +03:44 if we wanted to take that into account, +03:46 that's where permutations comes into it. +03:48 We have Mike and Bob here, +03:51 but then we also have Bob and Mike over here. +03:54 So the order actually makes a difference. +03:58 And that's why permutations is +03:59 just as awesome as combinations. +04:02 And that was it. +04:04 So your turn. +04:05 If you haven't yet, I would strongly recommend, +04:08 go and do the traffic lights, okay? +04:12 Try not to watch the video until you've actually done it. +04:15 But at this point, you've probably already completed that. +04:18 So that was for day two. +04:19 So we're looking at the third day of this lesson set. +04:23 For this, go back to the three day overview, +04:26 if you've forgotten what it is that we were talking about, +04:29 but essentially there are a few bites +04:31 to go to the Code Challenges Platform, +04:33 and you have free access to those +04:35 and all three of them have to do with itertools, +04:38 and they're actually quite fun. +04:40 So if you haven't done that, +04:42 go and give that a crack for day three. +04:44 Enjoy. +04:45 Keep calm and code. diff --git a/transcripts/22-decorators/1.txt b/transcripts/22-decorators/1.txt new file mode 100755 index 00000000..bcd174e3 --- /dev/null +++ b/transcripts/22-decorators/1.txt @@ -0,0 +1,18 @@ +00:00 Welcome back to the 100 days of Python. +00:02 Today we look at an important concept which are decorators. +00:05 It might be daunting at first, +00:07 but they're not that hard to grasp, +00:09 and they take your Python knowledge to the next level. +00:11 First we write a simple decorator +00:13 and see how we can decorate a function +00:16 to add additional behavior. +00:18 Then we make a quick detour +00:19 to explain the different ways functions +00:21 and Python can receive different kind of arguments. +00:24 Then we write a second decorator +00:26 and see how they can be stacked up. +00:28 Then we look at some further references, +00:30 and for the second and third day, +00:32 I got a couple of practical exercises +00:35 to hone your newly gained decorator skills. +00:38 All right, let's do this. diff --git a/transcripts/22-decorators/2.txt b/transcripts/22-decorators/2.txt new file mode 100755 index 00000000..911e26f1 --- /dev/null +++ b/transcripts/22-decorators/2.txt @@ -0,0 +1,50 @@ +00:01 All right, a quick primer on decorators. +00:04 What is a decorator? +00:05 I think the best way to explain it +00:07 is that a decorator can add behavior to a function, +00:10 so you pass the function into a decorator, +00:13 it can do something before and or after +00:16 and returns the newly decorated object. +00:19 And it's just one of those common design patterns +00:22 as described in design patterns +00:24 the elements of reusable object oriented software. +00:27 So let's import the modules we're going to use. +00:32 And let's define our first decorator. +00:35 Just a very basic one to show the syntax. +00:49 Alright, now you can use the mydecorator +00:52 to decoratate a function, and this is the syntax for that. +00:58 I will go into some of the details in a bit before, +01:01 example, why should you use wraps which is not required. +01:04 And the whole aspect of args and keyword args. +01:08 For now, at the very basic level, just remember, +01:11 a decorator takes you function, needs an inner function +01:15 to pass in the arguments and keyword arguments +01:18 and calls the function and see this sandwich effect here, +01:22 so you can do something before calling the function +01:25 and after it, so for example, +01:26 when you write a decorator to time your function, +01:29 here you would start the timing, +01:31 here you would call the function, +01:32 and here you would stop the timing. +01:34 You can look at it as adding behavior before +01:37 and after the function. +01:39 The function gets called, but additional logic +01:41 is added around it and that's what a decorator is for. +01:44 And then here is the syntax how to use it. +01:47 So right before the function you +01:50 use the at sign, @decorator. +01:52 If you have been using any web framework +01:55 like Flask for Django, you're familiar with this syntax. +01:58 As we will see towards the end, +02:00 there is a login required decorator for example in Django +02:04 that uses this concept of adding a behavior +02:07 which is that case is to see if the user is logged in +02:10 and it adds that behavior to a function +02:13 which is that case is usually the logic of a web page. +02:17 A route to a certain web page. +02:20 And keep in mind that this is just syntax, +02:23 the same thing could be written as... +02:27 So here you see actually that myfunction +02:31 gets passed into the decorator, +02:34 but this is the common way +02:35 how you would use a decorator. diff --git a/transcripts/22-decorators/3.txt b/transcripts/22-decorators/3.txt new file mode 100755 index 00000000..930a91a3 --- /dev/null +++ b/transcripts/22-decorators/3.txt @@ -0,0 +1,69 @@ +00:00 Alright, one thing we saw in the decorator +00:02 was the args and keyword args being passed in +00:06 and if you're new to python you might not be 100% aware +00:10 of all the different options you have to call a function. +00:14 So there's this great guide, +00:15 The Hitchhiker's Guide to Python +00:17 and it explains very well that you have positional, +00:21 keyword, and two arbitrary kind of arguments, +00:25 one is a list called *args and the other is a +00:28 keyword argument dictionary, which is **kwargs +00:32 and I just wanted to show a quick example +00:35 how this all works, so let's define a get profile function +00:41 and the only thing it's going to do is to +00:43 bounce the different kind of arguments +00:46 first let me just call it without anything +00:48 and it should error because name is a positional argument +00:52 which is required. +00:55 You see that doesn't work +00:56 and the error is pretty self explanatory +00:59 so let me then call it with a positional argument +01:04 and that worked, so the second type is keyword argument +01:07 which is not required and at set here to the default value +01:10 you can also set it to False, of course +01:12 saying active equals False, and that works +01:16 and then lets look at those two arbitrary kind of arguments +01:19 which is list and dictionary, so first +01:22 lets first do the arbitrary argument list +01:25 so that allows me to, for example, here we do sports +01:29 define one or more sports. +01:34 And I really like basketball. +01:38 Oops, yeah this is kind of strange that, +01:41 well it says positional argument follows keyword argument +01:45 so if you want to do it this way +01:47 you have make sure this not to be a keyword argument +01:50 so now it works. The reason is that the fourth +01:52 type of arguments is an arbitrary keyword dictionary +01:56 which goes towards the end. So let's pass in some words, +02:06 and they go last, right? So we here have the dictionary +02:10 of Pythonista and Topcoder, and that was the reason +02:12 we got the error before because the keyword arguments +02:15 always should go last, and to show arguments in action +02:19 I define this show args decorator that prints the args +02:23 before calling the function and prints the keyword arguments +02:27 after calling the function, +02:28 so just to put it into the context of the decorators +02:31 we are dealing with here. So we have show args +02:36 and I'm going to redefine the function, and this time +02:41 not to confuse it with the behavior of the decorator +02:45 I'm just going to print something else. +02:47 Hi from +02:50 the get profile +02:53 function +02:56 okay now lets see what happens +02:57 if I call and get profile again, now that it is decorated +03:01 of course I need to run the cell. +03:09 And here you see, so in the decorator it first +03:13 brings the args, then it does the actual function work +03:16 which is printing 'hi' from the get profile function +03:19 and then we're at the after stage of the decorator +03:23 printing the keyword arguments. +03:25 So here we see that the *args contains +03:27 the position arguments, keyword arguments, and the arbitrary +03:31 argument list, and the **kwargs contains then +03:36 the arbitrary keyword argument dictionary, so here you see +03:40 all those arguments actually being passed into the decorator +03:44 and hopefully now you have a better understanding what +03:47 *args and **kwargs means +03:50 and the different kind of ways +03:51 we can call function in python diff --git a/transcripts/22-decorators/4.txt b/transcripts/22-decorators/4.txt new file mode 100755 index 00000000..790e397c --- /dev/null +++ b/transcripts/22-decorators/4.txt @@ -0,0 +1,33 @@ +00:00 Let's do a more realistic +00:02 and interesting example, let's write a timeit decorator. +00:14 And as we said before, we call the decorated function, +00:17 and we add some behavior before and after calling it. +00:29 Alright, we got that defined, so we +00:32 have a decorator called timeit. +00:34 It receives a function, it wraps the function, +00:37 and we will see in a bit why that is. +00:39 We pass it the args and the keyword args. +00:42 We start a timer, we call the function, +00:45 we end the timer, and then we print +00:47 how much time that function took. +00:49 We return the wrapper, and that's it. +00:52 Let's then define a function that +00:53 we can use this decorator on. +01:02 So that in itself is not decorated yet, +01:05 so let's define it again using the decorator. +01:12 And look at that, how cool is that? +01:14 So the decorator started the timer, +01:16 it ran the function, it measured the time, +01:20 and after the function was complete, +01:22 it reported back how long it took. +01:24 So it took two seconds which of course is not a surprise. +01:27 A final note about wraps, so what if +01:29 I wouldn't have done wraps function? +01:33 So let's take that temporarily out. +01:40 And let's inspect that function. +01:45 Hey, where is my doc string? +01:50 It disappeared. +Not good, let's put it back. +01:55 Let's define the function again using the decorator. +02:00 And there you go, so that's why you should always use wraps +02:04 from the functools module, to preserve your doc strings. diff --git a/transcripts/22-decorators/5.txt b/transcripts/22-decorators/5.txt new file mode 100755 index 00000000..8d8a53a1 --- /dev/null +++ b/transcripts/22-decorators/5.txt @@ -0,0 +1,35 @@ +00:00 Next up, let's talk about how +00:02 you can stack decorators. +00:05 And I've found an image of Russian dolls, +00:07 which might clarify how this "nesting" works. +00:12 So let's define another decorator +00:14 that shows the args and keyword args being passed in, +00:17 and we're going to stack that +00:19 together with the timeit decorator. +00:37 Alright, let's modify generate report +00:40 from the last video to take some arguments. +00:47 And now, let me show you how you can stack +00:49 the two decorators we've defined so far, +00:52 and note that the order matters. +00:55 So I put timeit as the outer decorator, +00:57 because I want to time the whole operation, +00:59 including the use of the print args decorator. +01:05 Let's now call it, but first let's +01:06 give it some parameters, so let me quickly +01:10 find a dictionary of some keyword arguments. +01:16 And now, all should come together, +01:18 because when I call generate report +01:20 with some args and some keyword args, +01:25 look at that. +01:26 We see two decorators in action. +01:28 First a timer, starting the timer, +01:30 doing stuff, ending the timer, +01:32 and printing how long it took, +01:33 and then we see the inner decorator, +01:35 print args, printing the args and the keyword args. +01:39 And here you see that decorators +01:41 can become pretty powerful, because each decorator is doing +01:44 a specific task, which can be applied +01:46 to multiple functions, yet it's all abstracted +01:49 in their definition. +01:51 And, yes, this is how you can stack decorators. diff --git a/transcripts/22-decorators/6.txt b/transcripts/22-decorators/6.txt new file mode 100755 index 00000000..79924d65 --- /dev/null +++ b/transcripts/22-decorators/6.txt @@ -0,0 +1,36 @@ +00:00 Okay, that concludes the basic coverage +00:02 of decorators in Python. +00:04 In this section I provide you some more pointers +00:06 to study some more decorators today. +00:10 I did an article on Twilio, +00:12 and in this app I used a login required decorator +00:15 to check if the user is logged in. +00:18 And you can see that in the code. +00:21 This is what you already saw in this lesson. +00:24 The wraps, and the wrapper. +00:26 It takes the arguments and just checks +00:28 if login is in the session. +00:30 If so, return to function. +00:32 If not, do a flash message and redirect to the login page. +00:37 That's similar to what Django is doing, +00:40 which, I pointed to the source. +00:41 You can check that out as well. +00:43 There's some more stuff going on +00:44 so I challenge you to take a look at this code +00:47 if you have time left today. +00:49 And on PyBites we did an article, +00:52 "Learning Python Decorators By Example," +00:55 which partly overlaps with +00:56 what you have seen in the lesson so far, +00:58 but there are also some more examples for caching, +01:01 some more decorators in the wild. +01:04 And I point you to another article. +01:07 Sometimes you need a decorator that takes arguments +01:10 like speed decorator that takes seconds +01:13 and it's not always straightforward +01:14 how optional arguments work +01:16 so I wrote an article about that. +01:17 So if you still have time left today +01:19 and you want to know decorators a bit more in detail +01:22 you can read this article as well. +01:26 And that concludes the lesson of Day 1. diff --git a/transcripts/22-decorators/7.txt b/transcripts/22-decorators/7.txt new file mode 100755 index 00000000..6963cd25 --- /dev/null +++ b/transcripts/22-decorators/7.txt @@ -0,0 +1,40 @@ +00:00 Alright now it's time to review what we've learned, +00:02 how to write a decorator. +00:05 A decorator takes a function to be decorated. +00:09 It adds behavior before, and or, after. +00:12 Then it returns the function. +00:15 Don't forget to use wraps to the preserve the doc string. +00:19 Args and keyword args. +00:21 There are various ways you can call a function in Python. +00:26 The simplest way is to use a required, positional argument. +00:30 If I leave off this argument, I get an error. +00:34 The second type, is the keyword argument +00:37 which can be set to a default. +00:40 And then we have two arbitrary sequences which are the list, +00:44 in this case sports, and keyword arguments +00:47 which always go last. +00:49 Here is an example how you would call this +00:50 with all the types of arguments. +00:54 Let's write a timeit decorator. +00:56 It takes a function, starts the timer +00:59 before calling the functions, calls the function, +01:02 and ends the timer, +01:03 printing how long the function took to execute. +01:07 We define the decorator. +01:10 Here's how to apply it to a function. +01:14 You can stack decorators. +01:16 Note that the order matters. +01:20 As timeit is the outer decorator, +01:23 that's the one that wraps at the outer level. +01:26 Some examples of common decorators. +01:29 Here are two from the Flask documentation. +01:32 One checks if a user's logged in +01:34 and the other is performing caching. +01:37 Those are ideal examples of decorators +01:40 because they abstract away common behavior +01:43 which you want to apply to multiple functions. +01:46 Here's another example of a well known decorator +01:49 called LRU Cache. +01:52 You can find those in the Flask +01:54 and the Python documentation respectively. +01:58 And now it's your turn. diff --git a/transcripts/22-decorators/8.txt b/transcripts/22-decorators/8.txt new file mode 100755 index 00000000..1bca38a1 --- /dev/null +++ b/transcripts/22-decorators/8.txt @@ -0,0 +1,16 @@ +00:00 Welcome back to the second day of decorators. +00:03 Today, you get your hands dirty writing a decorator, +00:06 and I got an exercise here that you can do +00:10 on the PyBites Code Challenge Platform. +00:12 The goal is to make this work, basically. +00:15 So we have a gettext function +00:18 that takes a text, and you're going to decorate it +00:22 with a make_html that basically adds a tag. +00:26 So you can stack it to add various tags, +00:30 so when I call it like this, it should output +00:32 p strong, the text of the function, +00:35 and closing strong, and closing p. +00:38 And that's all there is for today. +00:40 If that's easy for you, you can already +00:42 try to look at Day 3. +00:44 Good luck. diff --git a/transcripts/22-decorators/9.txt b/transcripts/22-decorators/9.txt new file mode 100755 index 00000000..fad0eff5 --- /dev/null +++ b/transcripts/22-decorators/9.txt @@ -0,0 +1,37 @@ +00:00 Welcome back. +00:01 For this final day of the decorators lesson, +00:03 I got another code challenge for you. +00:07 It's more an open challenge, which you also can do +00:10 on the Code Challenge platform, +00:12 and basically it's to write a decorator +00:14 of your own choice. +00:15 You can just look at your code maybe, +00:17 refactor things that are repetitive, +00:19 but I leave you totally free to build something +00:22 that's useful for your needs. +00:24 For example, when we did the #100DaysOfCode, +00:27 at Day 95, we used a decorator of our own. +00:34 By the way, here you see how cool it is +00:36 to keep a log of your progress, 'cause you can always +00:38 go back to all the scripts you have written. +00:41 So here, Day 95, we used a decorator +00:45 to cache movie results. +00:49 And here we wrote a decorator to store +00:51 or cache movie results. +00:53 It's doing that in the store helper, +00:55 which you can see here. +00:56 So that's an example of how we used the decorator +00:59 for our own needs. +01:00 And that's what I challenge you to do +01:02 by taking this challenge. +01:03 And, of course, we invite you to PR, +01:06 or pull request, your work. +01:08 And there are instructions here to get set up with git +01:11 and pull request your work, which you can also +01:14 do here on the platform. +01:17 By the way, don't forget to share your awesome scripts +01:20 on Twitter using #100DaysOfCode +01:23 and feel free to include us. +01:26 Tag Python and PyBites. +01:27 We are really happy to see what you all come up with. +01:30 So enjoy, and learn a lot about decorators. diff --git a/transcripts/25-errors/1.txt b/transcripts/25-errors/1.txt new file mode 100755 index 00000000..89052540 --- /dev/null +++ b/transcripts/25-errors/1.txt @@ -0,0 +1,22 @@ +00:00 Probably time that we talked about error handling. +00:02 I'm sure that you've encountered some issues +00:05 with your Python code and you may wonder +00:08 what is the right way to catch these errors in Python. +00:12 Well, that's what this next three day section is all about. +00:16 Have you encountered Python's errors? +00:18 Have you seen what's called a traceback here? +00:21 This is the report from trying to run the Python program +00:25 when something actually went wrong on line 21 of api.py. +00:30 Let me get a little info here, +00:31 there's a type error : and this +00:34 gives us a description of what that is. +00:35 The type thing on the left here, the type error +00:37 is an exception type and it tells us the category of error. +00:41 On the right is the actual message +00:43 of what went wrong within that category. +00:45 So None type, object is not iterable. +00:48 Turns out that in this case, the data return +00:51 from the server was empty and we tried to loop over it. +00:53 That doesn't work so well. +00:55 So we're going to see how to deal with a variety of errors +00:58 the proper way in Python. diff --git a/transcripts/25-errors/2.txt b/transcripts/25-errors/2.txt new file mode 100755 index 00000000..c338b5aa --- /dev/null +++ b/transcripts/25-errors/2.txt @@ -0,0 +1,68 @@ +00:00 Let's jump right into our demo here. +00:02 Over in the GitHub repository, we're going to start +00:04 with a movie search app. +00:07 And this is called "movie search error edition." +00:10 Later, we're going to actually build this app from scratch. +00:13 We're going to talk about the underlying API +00:14 and all that kind of stuff. +00:16 Right now, we're just going to run it and try to solve +00:18 the errors that it might encounter. +00:20 Now, there's two parts here: there's the starter, +00:21 exactly where I'm starting from, and I'll leave this here, +00:24 in case you want to play with it. +00:26 This one, we're going to involve into the final one. +00:28 Now, before we open this up, +00:30 let's create a virtual environment, there we go, +00:33 and I'm going to throw it into PyCharm, +00:34 and use whatever editor you want. +00:36 This is one we're using. +00:38 This one actually depends upon a package called "requests" +00:42 So, if we come over here with our +00:44 virtual environment active, we can say pip install requests +00:48 or you can just click this little +00:49 hyperlink thing right there. +00:51 Either way, we're going to have to do that before this will run +00:54 because that's how we're getting to the internet. +00:56 So, here's how this program works. +00:58 Like I said, we're going to, in a different set of three days, +01:01 we're going to build this thing from scratch +01:02 and really focus on the API. +01:04 We don't actually care how the API works. +01:06 All that matters is, we pass a keyword here, +01:09 and it's going to go over to a service +01:11 over at movie_service.talkpython.fm. +01:14 Do a search, get back some JSON data, +01:17 and then return those here as results +01:20 and we're going to loop over them. +01:21 Now, I've introduced some extra errors here, alright, +01:24 sort of a chance of something going really, really wrong, +01:28 just to give us some variety. +01:29 The most likely error you're going to run into +01:32 is a network error. +01:33 Let's just see if this runs correctly. +01:35 How about "Capital?" +01:38 Cool. There. +01:39 We've gotten three movies back +01:40 and see their IMBD score right there. +01:44 It looks like it's working, except for sometimes it's not. +01:47 It actually has these errors baked into it. +01:48 But the one that we're definitely going to hit +01:50 as we come over here, we turn off the wifi, +01:53 this won't be so good. +01:54 So, now if I try to run this, let's see what we get. +01:57 Test, maybe? +01:59 Uh-huh. +02:00 request.exceptions.connectionerror. +02:03 And what went wrong, the connection pool +02:05 had some kind of problem. +02:07 Max retries exceeded with URL, caused by ... +02:12 We couldn't get to the server, right? +02:13 So we turned off the internet, it crashed. +02:15 Instead, what we'd like to have happen +02:17 is our program go, hey, couldn't get to the server. +02:21 Is your wifi off? Check your internet connection. +02:23 Are you at a coffee shop? +02:24 Then you have to maybe authenticate to the local network, +02:27 where you say you agree to their terms or whatever, right? +02:30 So we want to catch these errors instead of having +02:32 this nasty crash and give a helpful message to the users. diff --git a/transcripts/25-errors/3.txt b/transcripts/25-errors/3.txt new file mode 100755 index 00000000..19f00752 --- /dev/null +++ b/transcripts/25-errors/3.txt @@ -0,0 +1,75 @@ +00:00 We've seen that, calling this API, may raise errors. +00:04 And notice the WiFi being off, +00:06 pretty much anything we search for +00:08 is going to result in an error. +00:10 So, we're going to turn the WiFi back on. +00:12 But before we do, let's convert this full on crash +00:14 to something we can catch, maybe log, +00:16 send a message to the user. +00:17 Or we could try again, who knows? +00:19 Here's how error handling in Python works. +00:23 What we're going to do is, +00:25 there's a couple options. +00:26 We could treat this as a separate section. +00:29 Let's say, this part that actually interacts +00:31 with the data does the request. +00:33 We're going to treat this as a block +00:34 that should either work, +00:36 or not work here. +00:37 So, we can come up here and type the word try: +00:41 And indent that into the block. +00:43 Then if something might go wrong, +00:44 we'll say, except: +00:45 And I'll say, print +00:47 Oh, that didn't work. +00:48 And we'll just print that out. +00:50 Yeah? +00:51 Now Python says this is a little aggressive, +00:54 it's too broad, but, that's okay. +00:56 This is going to work for now, +00:57 and then we'll refine this a little bit. +01:00 So now if I run it, +01:02 oh that didn't work. +01:03 It's a big bad crash, um, we just say, +01:05 "You know, that didn't work." +01:06 We could've logged it. +01:07 We could actually loop around and try again. +01:09 All sorts of things. +01:10 But at least we're giving proper feedback +01:12 to system here. +01:15 Let's turn this back on. +01:18 WiFi's back. +01:19 Let's try again. +01:20 Let's search for capital again. +01:22 Boom, it's working. +01:24 Here's how the flow goes. +01:25 We're going to run every function here. +01:28 And if it succeeds, it's just going to run +01:31 from here to there and then skip +01:33 over this except block. +01:34 But if at any step something goes wrong, like, +01:36 suppose, say right here, this title doesn't exist, +01:39 and it's going to be an error +01:40 the first time through or something. +01:41 It's going to immediately stop what it's doing +01:44 and jump down here. +01:45 If this throws an error, +01:46 we're not even going to run this prank code. +01:48 We're just going to jump straight from here +01:49 to there to deal with it. +01:51 So, we can try some stuff, didn't find anything. +01:54 Eventually, we'll run into these random errors. +01:57 That one didn't work. So, this is great, but what didn't work? +02:01 Wouldn't it be nice to know what is going on? +02:04 It turns out there's three or four categories of errors. +02:07 One of which is the network is down. +02:09 But there's actually others. +02:10 So, we're going to adjust this +02:13 to handle these particular errors. +02:15 So, here's how we can stop the errors +02:17 from crashing our program. +02:19 But let's see how we can actually deal with the errors +02:21 in a more fine grained way. +02:23 One message for say, network errors. +02:25 Another message for say, +02:27 if you didn't input any keyword to search for. diff --git a/transcripts/25-errors/4.txt b/transcripts/25-errors/4.txt new file mode 100755 index 00000000..50d4db4e --- /dev/null +++ b/transcripts/25-errors/4.txt @@ -0,0 +1,107 @@ +00:00 So we've stopped the errors from crashing our program +00:02 but we can't do anything meaningful, +00:04 we can only say, you know, that didn't work, sorry. +00:08 Let's be a little more prescriptive here. +00:11 So up the top, +00:12 we need to work with the various exception types, +00:15 so we have to import some stuff. +00:16 So we'll say request.exceptions down here. +00:20 Now in this area, we want to catch +00:22 the different types of problems that can occur, +00:25 and the way we do that is we say except: +00:27 and then we say 'different types', +00:29 remember when we looked at that trace back, +00:31 the first thing is the category, or the type of error, +00:33 and the second part after the colon was the description, +00:36 just more details. +00:38 So what we need to do is, +00:39 we could have potentially multiple ones of these, +00:41 we'll say this, we'll say, +00:43 request.exceptions.connectionerror, okay? +00:48 We be able to just go like this, +00:50 and just do a little print here and say, +00:54 so maybe we'll say something like, +00:55 'couldn't find the server, check your network connection', +00:58 make this really obvious like that, +01:01 and print that out here. +01:02 Now, it could be if this was like a web browser +01:05 they could've typed it in wrong, +01:06 but we've hard-coded the URL, we know that that's correct, +01:09 so if they can't connect it's not the server doesn't exist, +01:12 it's really that there's some problem +01:14 getting to this one known server. +01:16 So let's try this again with my internet off. +01:22 We'll come down here and search for test. +01:23 'Could not find server, check your internet connection.' +01:26 Oh, how cool, that's way more helpful, +01:28 we know exactly what went wrong +01:30 when we want to handle that problem here. +01:33 Now the network is back and we have another problem. +01:36 If we enter no search term it's going to freak out +01:39 and throw what's called a ValueError, and say, +01:41 'hey that didn't work.' +01:43 But all we get is, oh, that didn't work. +01:45 So we could do a little bit better here, +01:47 we could say, +01:48 put this core exception here, +01:51 and we could put some details like so. +01:54 This is kind of going to be our fallback, +01:56 we don't really know what's going on, +01:57 so we're going to try this. +01:58 Let's try again. +02:00 Oh, that didn't work, 'you must specify a search term', +02:03 and if you're just debugging it to try to figure out +02:05 what's going on here you'd say, +02:06 what is the actual thing that I'm getting here? +02:08 What is this actual error? +02:11 It's a ValueError. +02:12 Okay. +02:13 So now let's go add an except clause for that. +02:19 Now notice this is gray because we're not using it, +02:21 and when we're not, we can just leave it off like, +02:24 as we did with the request here. +02:26 So we don't need any details, so now, +02:28 try to run this with nothing, +02:29 'error, you must specify a search term.' +02:31 Now we can really tell the user what's going on. +02:34 We have a few more errors +02:35 that we could potentially deal with, +02:38 I wouldn't leave this here like that, +02:43 and these other errors are just kind of random stuff +02:45 that I threw in there to make the program crash. +02:47 One is a StopIteration, +02:49 and the other is the one that you saw at the opening, +02:50 which is a TypeError I believe. +02:53 So we'll just let those fall through here +02:54 because there's not anything we can particularly do, +02:57 they're just sort of random noise in the system +02:59 to make sure you get some interesting crashes. +03:01 These have real fixes, +03:03 so we have a special message for them. +03:06 The final important thing to see here +03:07 in this whole try except block, +03:10 is the order in which we specify the errors. +03:13 If we change this around +03:15 and we put this up here at the front, +03:17 PyCharm's probably going to freak out +03:18 and say, "no no no, you'll never be getting to these." +03:22 If we have something general, +03:24 and this is a derivative of exception, +03:27 this is not going to work. +03:28 It's actually just going to stop. +03:29 The way it works is, it runs, +03:31 if there's an error it just looks, goes, 'is the error this type, is the error this type, +03:34 is the error that type?' +03:35 And, if it comes along here, +03:37 this is going to catch almost everything, +03:39 and so, even though we have this, +03:41 you'll see if I run it and I hit enter, +03:43 that didn't work. +03:44 I mean, we still did sort of print this out, +03:45 but it's not letting us get to the part where we expect it. +03:51 So it's super important that this goes +03:52 from most specific to most general. +03:55 So, here we have it; +03:57 we've figured out what types of errors +03:58 our program might throw, +04:00 and then we can handle them independently based on the type. diff --git a/transcripts/25-errors/5.txt b/transcripts/25-errors/5.txt new file mode 100755 index 00000000..43a873f1 --- /dev/null +++ b/transcripts/25-errors/5.txt @@ -0,0 +1,47 @@ +00:00 Let's quickly review the concepts +00:01 of try and except blocks in Python. +00:05 Python's primary error handling style +00:08 is what's called it's easier to ask +00:10 for forgiveness than permission. +00:13 As opposed to, say, C style of look before you leap. +00:16 In C you check, check, check, check, check, +00:18 and then you just try to do the thing and hope it works. +00:21 Typically what happens when it doesn't work +00:23 is either you get a false sort of return value there +00:26 or just the program just goes away, it's really bad. +00:28 Python is a little bit safer in that +00:30 it's more carefully captures up the errors +00:33 and converts them to exceptions. +00:35 So if it's going to do that anyway, +00:36 let's just try and make it work. +00:38 And if it doesn't work, well, +00:39 we'll catch it and deal with it in that case. +00:40 So it's kind of an optimistic way of handling errors. +00:44 so what we're going to do is we're +00:45 going to say try and do all the stuff, +00:47 and we're going to hope that it all just works +00:49 and kind of assume that it will just go through that block. +00:51 But if it doesn't, we're going to +00:53 drop into one of the specific error handling sections. +00:56 Here we have two possible errors, +00:58 really one that we're dealing with, +00:59 and the rest is kind of a catch all. +01:01 So we're saying except connection error as CE, +01:04 and then we're going to deal with that. +01:06 And in this case we might need to look inside the error +01:09 to see, well, was there a DNS problem, +01:11 is there a network problem, +01:13 did it not respond, things like that, +01:15 did we get a 500 back from the server, all kinds of things. +01:18 So this connection error, +01:19 we're going to catch and deal with that +01:21 and then we do this more general except block +01:24 where here's something we maybe didn't think of, +01:26 we're going to catch that and at +01:27 least try to somewhat not crash. +01:30 As we talked about before, the order matters. +01:31 Most specific goes first, most general last. +01:34 If you get that order wrong, +01:35 you'll never get to your specific errors. +01:37 So most specific, most general. +01:40 This is error handling in Python. diff --git a/transcripts/25-errors/6.txt b/transcripts/25-errors/6.txt new file mode 100755 index 00000000..11b34f42 --- /dev/null +++ b/transcripts/25-errors/6.txt @@ -0,0 +1,34 @@ +00:00 Now you've seen how error handling +00:01 works in Python, +00:02 it's time to put it into action for your code. +00:05 Before we get started, I just want to make the point +00:07 that one of the key differentiators +00:08 of professional programs and applications +00:11 as opposed to simple scripts that +00:14 people just throw together, or code that beginners write, +00:17 really often has to do with the error handling +00:20 and ability to continue working when something goes wrong. +00:24 This error handling and exception processing in Python +00:28 that we just covered that is really central to it. +00:30 Professional apps still crash of course, +00:33 we still run into problems, +00:34 but they do so much less often +00:36 and when they do we typically have logging +00:38 and real-time error monitoring with things like Rollbar +00:42 to let us know and so when they happen +00:44 we get lots of details and we go back and fix them. +00:46 That sort of hardens our app over time. +00:49 Right, so your goal is to add this error handling +00:52 to one of the applications. +00:53 So you've already watched the video so that's great. +00:56 The thing you're going to do for Day 1 +00:58 is you're going to go and look through the applications +01:01 you've already created as part of +01:02 this #100DaysOfCode challenge. +01:04 Or if you want to pick something else +01:06 that you've maybe written outside of this course +01:08 you're also welcome to pick that, +01:10 and we're going to take that application and improve it. +01:12 So that's today, you've already done most of the learning +01:15 and then just pick the app you're going to work on +01:17 for the next two days. diff --git a/transcripts/25-errors/7.txt b/transcripts/25-errors/7.txt new file mode 100755 index 00000000..87eaed32 --- /dev/null +++ b/transcripts/25-errors/7.txt @@ -0,0 +1,29 @@ +00:00 Day 2, your goal is to discover all the +00:02 error conditions that you might need to catch, +00:05 and actually determine the exception type that +00:08 that results in, in Python. +00:10 Are you working with something that talks to a database? +00:12 What kind of errors could you get from the database? +00:15 Are you talking to something that goes across the network? +00:18 What type of errors come across, from say, the +00:20 network being down or DNS not working, +00:22 or the network being on, +00:24 but not being able to reach the host, +00:26 all those sorts of things. +00:28 So come up with that list, +00:29 and figure out what type, +00:31 what actual exception type in Python does it surface as. +00:35 All right, if it's a connection error it could be +00:37 something built into the standard library, +00:38 or it could be something in say, requests, +00:41 as we saw in our example. +00:42 So, you're going to have know exactly what those types are +00:44 so that you can actually write the +00:46 probably error handling code. +00:47 That's it for today, +00:49 it might be a little bit tricky to get your app +00:51 into all the different situations that it's going +00:53 to encounter, all right? +00:55 Some of these errors are hard to trigger, +00:56 but do your best to figure out all the various +00:58 error cases you're going to run into. diff --git a/transcripts/25-errors/8.txt b/transcripts/25-errors/8.txt new file mode 100755 index 00000000..52dcc910 --- /dev/null +++ b/transcripts/25-errors/8.txt @@ -0,0 +1,22 @@ +00:00 Day 3, it's time to take those +00:02 errors that you've discovered +00:03 and put in specific error handling for each one of them. +00:07 So here I've written out a little try-except block +00:10 that shows the standard error handling +00:12 in Python, you can use this as a template, +00:14 take the various types of errors you found on Day 2, +00:17 figure out how you might either deal with them or at least +00:19 let the user know, keep your application running. +00:23 Add the error handling to your code, +00:25 make sure that it actually does handle the errors, +00:27 you know, get the thing to fail in whatever ways +00:30 you were doing before to find the errors, +00:31 but now you should have some kind of nice response +00:35 that's not a full-on crash, +00:36 maybe it even keeps running +00:37 and just asks the question again, something like that. +00:40 Now that you know how to do error handling, +00:42 you have some practice with it, +00:43 when you're writing your applications, +00:45 be sure to think of the errors that can happen, +00:47 put the error handling in place, and fail gracefully. diff --git a/transcripts/28-regex/1.txt b/transcripts/28-regex/1.txt new file mode 100755 index 00000000..9203ab86 --- /dev/null +++ b/transcripts/28-regex/1.txt @@ -0,0 +1,13 @@ +00:00 Welcome back to 100 Days of Python. +00:02 In the coming three days I will be your guide +00:04 explaining regular expressions in Python. +00:07 First we will look at when not to use them +00:09 when we can use simple string methods. +00:12 Then we will dive into search and match, +00:15 capturing strings. +00:17 Final, compiling your regexes, +00:21 and advanced string replacements. +00:23 Day 2 I will give you some more material +00:26 to read and practice online, +00:29 and the third day I have some really good exercises +00:32 to get your hands dirty with regular expressions. diff --git a/transcripts/28-regex/10.txt b/transcripts/28-regex/10.txt new file mode 100755 index 00000000..bf34673c --- /dev/null +++ b/transcripts/28-regex/10.txt @@ -0,0 +1,36 @@ +00:00 Welcome back to 100 Days of Python. +00:03 Wow, you're almost done. +00:04 It's the third day of the regex 3 days block. +00:08 I hope you're enjoying this and getting a good grasp +00:11 of writing regular expressions in Python. +00:13 So in this third day, let's get you some more practice, +00:17 and I have some exercises lined up for you. +00:21 First of all, we have, on our Code Challenges platform, +00:24 Bite 2, Regex Fun, where you can solve this problem +00:28 of extracting course times out of a string, +00:32 getting hashtags and links, and match the first paragraph. +00:38 Then we have mastering regular expressions +00:41 also as a blog challenge. +00:43 And if you like to work more in your own environment, +00:45 I encourage you to do this one because you get +00:48 a branch on the code challenges repo +00:52 and you can just work on your system. +00:54 And finally, I mean, those exercise, +00:57 we think are good practice, but of course feel free +00:59 to get your own data, and parse it, +01:03 use regular expressions to clean the data, etc. +01:07 It's actually how we got started with code challenges. +01:10 We came up with this exercise where we saw this +01:14 JavaScript course and we saw all these timings, +01:17 but there was not a total so the first +01:20 pilot code challenge was, go filter out these timestamps +01:25 and calculate what the total course time is. +01:28 It's not necessarily curriculum stuff, +01:30 but it gets you to practice. +01:33 And with practice comes mastery. +01:36 So use any data you want. +01:38 The goal is to use more regular expressions. +01:41 And don't forget to share your work on Twitter. +01:44 You can mention the handle @100DaysOfPython. +01:49 Good luck, have fun, and remember: +01:51 Keep calm and code in Python. diff --git a/transcripts/28-regex/2.txt b/transcripts/28-regex/2.txt new file mode 100755 index 00000000..15d7a2f2 --- /dev/null +++ b/transcripts/28-regex/2.txt @@ -0,0 +1,41 @@ +00:00 Let's dive straight into a notebook +00:02 I've prepared for this class. +00:04 It's sometimes said that I have a problem, +00:07 I use a regular expression knife too, +00:09 and in a sense that's true, +00:11 that they're intimidating when you start. +00:13 But there are only a few rules so +00:17 get some practice and you will see that +00:18 they're not that difficult. +00:20 Let's import the re module. +00:22 First of all, there are cases that you don't +00:24 want to use a regex. +00:26 The standard string methods are pretty powerful +00:29 and cover some of your needs already. +00:31 For example, I have a text. +00:33 'Awesome, I'm doing the #100DaysOfCode challenge' +00:36 And we want to see if that string starts with 'Awesome' +00:39 so no regular expression needed for that +00:42 you can just do text starts with +00:45 Awesome and True. +00:49 Or does it end with +00:53 'challenge'? +00:55 It does. +00:57 Or does the case insensitive version +01:01 of text has '100DaysOfCode' in it? +01:04 Now for that you'd first want to lowercase the string +01:08 and then you want to see if +01:11 100DaysOfCode +01:14 is in that string. +01:19 And it is. +01:21 And what about replacing? +01:23 So I am bold and I'm taking 200 days of code. +01:28 I don't recommend that by the way. +01:30 Well you can just do a text, replace +01:36 100 text strings +01:38 by 200 +01:41 and awesome, I'm doing the 200 days of code. +01:45 So for these kind of string operations, +01:48 you don't really need a regex. +01:50 So look at the string operations that are available +01:53 in Python and use those instead. diff --git a/transcripts/28-regex/3.txt b/transcripts/28-regex/3.txt new file mode 100755 index 00000000..ecd95d30 --- /dev/null +++ b/transcripts/28-regex/3.txt @@ -0,0 +1,35 @@ +00:00 Now those string operations were pretty basic, +00:03 but usually we need something more advanced. +00:06 Meet, regex. +00:07 The re module has two main methods. +00:11 search and match. +00:14 match, matches from start to end. +00:17 Search can match a substring. +00:19 It's best to use an example. +00:23 I'm using raw strings by the way, +00:25 because then I can just use special characters +00:27 with a single backslash and not having to escape them +00:31 which makes my regexes more readable. +00:34 So again, we have the same awesome I'm doing a 100 days +00:37 of code challenge and let's... +00:41 do a re.search first. +00:43 So I'm going to... +00:46 match a... +00:48 part of that string +00:50 and you can do this as well with just I am in +00:53 but the point is to just show how you would make a regular +00:57 expression and what a match object would look like. +01:02 To contrast that with match, +01:07 this won't work. +01:09 Oops. +01:10 Match takes two arguments. +01:13 So this is None because match ends end to end +01:17 so I am is not the full string. +01:21 So to do a proper match we would be doing, +01:27 start with awesome, +01:30 end with challenge. +01:33 On text and that works. +01:37 And here you see the first part of a pattern +01:40 which is '.' which matches any character, +01:44 zero or more of them +01:47 up until challenge. diff --git a/transcripts/28-regex/4.txt b/transcripts/28-regex/4.txt new file mode 100755 index 00000000..78ef6a62 --- /dev/null +++ b/transcripts/28-regex/4.txt @@ -0,0 +1,35 @@ +00:00 A common task is to capture strings using a regex. +00:05 Here we have two strings, 100 and 200. +00:08 What if we want to extract number days of code +00:13 out of these strings. +00:16 Here's how you would do it. +00:18 First, I do a research. +00:25 And I use the capturing parentheses. +00:28 What this will do, any regex inside these parentheses +00:32 that matches the string will be stored in a match object, +00:36 which we can access with groups. +00:39 Hashtag, one or more digits, days of code. +00:46 As it is searched, re is happy to just match the substrings. +00:50 So I don't need make sure that the whole string matches. +00:53 If this would be match. +00:57 Let's do it actually. +00:59 I would have to account for anything that comes before, +01:03 and anything that comes after. +01:06 Of course I need to give it a string. +01:09 And let's see what happens. +01:11 So first of all we have a match object, +01:14 and to get the actual matching string I can do groups. +01:19 And it gives me a tuple of the matches. +01:24 So to get the actual string, I can just use indexing. +01:28 And I got 100 days of code. +01:31 Now this will work the same for 200. +01:36 Let me show search, that was my initial intent. +01:40 Search, then I don't have to account for end time, +01:43 so I those wild cards out. +01:46 I'm going to use 200 to show the match object first. +01:56 And again, 200 days of code. +02:01 So you see the power of regular expressions, +02:02 this is still very simple. +02:05 I can just say one or more digits, followed by a string, +02:08 and it will match both 100 and 200 days of code. +02:12 So that's how you capture strings with the re module. diff --git a/transcripts/28-regex/5.txt b/transcripts/28-regex/5.txt new file mode 100755 index 00000000..fb1eda5d --- /dev/null +++ b/transcripts/28-regex/5.txt @@ -0,0 +1,75 @@ +00:00 And now my favorite +00:02 method of the re module: findall. +00:06 findall is useful to match a pattern +00:09 in a string, +00:10 and to get all the occurrences of that pattern. +00:13 In 100 Days of Code, we wrote a script module in that, +00:15 which returned three columns: +00:18 a module, if it was standard lib, +00:20 and the days that we used it. +00:22 As you see in the re module, +00:24 we used quite a lot. +00:26 And it will +00:27 give a link to the actual scripts at the end of this lesson. +00:30 Let's write a +00:32 regular expression to extract all the days, +00:35 and findall really shines in this kind of task. +00:39 So we do re.findall ... +00:42 raw string. +00:45 One or more digits, +00:47 and we have to specify +00:49 the string as the second argument. +00:52 And look at that. +00:53 One simple statement +00:55 and we got all the days. +00:57 That's awesome. +00:58 Let's do a second example. +01:00 Here is some text, +01:01 and let's extract the words +01:04 with a regular expression first. +01:08 re.findall, if I could type. +01:14 raw string. +01:16 One or more characters. +01:18 Text, and I first need to load that in. +01:22 Bang. +01:24 Now you can do this, +01:25 also with text split. +01:30 I'm going to make it just the first five one. +01:33 So you don't really need a regular expression to +01:36 split a text string into a list. +01:40 Let's say we want to find out the most common words, +01:43 but only the ones that start with an uppercase character. +01:47 So, then you can use a regular expression like, +01:53 and I'm using character classes +01:54 which are in square brackets, +01:57 so let's define an uppercase +02:00 and then we have +02:01 one or more lowercase +02:04 characters or digits, +02:07 and the plus is one or more, +02:09 if you want zero more you do an asterisk. +02:12 And we want to do that on the text. +02:15 And here we have all the words +02:18 starting with an uppercase. +02:20 Now just for the fun of it, +02:22 let's wrap that in a counter +02:24 to get the most common words. +02:26 So we are going to use from collections +02:31 import counter, +02:33 and don't worry I will cover counter +02:36 more in detail in the collections lesson. +02:40 Counter receives a list, +02:42 so re.findall returns a list as we +02:46 saw earlier. +02:47 So we can just make a counter object, +02:51 passing that into the counter, +02:55 and as you see we get some counts here. +02:58 And to find out the most common words, +03:01 we can then do the most common method +03:04 on that counter object. +03:06 And lorem and ipsum are the winners. +03:09 So very powerful tool. +03:11 I really like findall. +03:12 This typical Python example, that in +03:15 one line of code you can +03:17 do a lot of good stuff. diff --git a/transcripts/28-regex/6.txt b/transcripts/28-regex/6.txt new file mode 100755 index 00000000..6f3813ad --- /dev/null +++ b/transcripts/28-regex/6.txt @@ -0,0 +1,115 @@ +00:00 Compiling regexes. +00:03 If you want to run a regex multiple times, +00:06 it can be more efficient and convenient +00:08 to define it in a re.compile statement. +00:11 Let's work with some data. +00:13 Here I define a list of movies +00:15 and two extra things in Python. +00:17 You can define a multi-line string with triple quotes, +00:21 and you can build up a list by splitting +00:24 a multi-line string, or whatever string, +00:27 on a space or in this case, a new line. +00:31 So this gives me a nice list +00:32 of the first element, one Citizen Kane, +00:35 second element, Godfather, etc. +00:37 And the task here is to +00:39 identify movie titles with exactly two words. +00:42 Before moving along, maybe you want to +00:44 give this a try yourself. +00:45 I hope you had fun working on this little regex problem. +00:49 And an extra concept I'm going to show you is +00:50 the use of re.verbose, which allows you to +00:55 wrap your regular expressions over multiple lines +00:58 and add commands, which is great to +01:01 teach them and makes them more readable. +01:04 So let's load in the data +01:06 and let's start writing a multi-line, +01:10 medium advanced, regular expression. +01:13 And as we're talking about compiling one, +01:16 the syntax for that is re.compile. +01:19 I'm using a raw string, and as explained before, +01:22 you can make a multi-line string with triple quotes. +01:26 And I'm going to write this out +01:28 because it's quite a large regular expression. +01:31 And then we come back +01:33 and I explain line by line what it does. +01:36 So here you go. +01:37 To define the start of a string, +01:39 we use the caret +01:41 then we need to match one or more digits. +01:46 Let me scroll a little bit up to see the data, +01:48 so the numbering of the movies. +01:50 Then we match a literal dot, +01:52 and note that I escape the dot +01:54 otherwise it would match any character. +01:57 Then we have one or more spaces. +01:59 And then I use a non capturing parentheses. +02:03 So we've seen capturing parentheses before, +02:07 but if you add inside parentheses, question mark, colon, +02:13 it kind of undos the capturing. +02:16 Then you can group the various things together +02:18 without capturing. +02:20 And we use a character class then +02:23 to include uppercase, lowercase, and single quote. +02:28 And we want one or more of them, +02:30 followed by a space. +02:33 And I commanded that all at the right. +02:36 Then we do the closure of that parentheses. +02:41 Then we want exactly two of those. +02:44 So just go back to the data, +02:47 and that's basically a word. +02:50 Why don't I do just backslash w? +02:54 Turns out that was my first approach, but, +02:57 and that's the funny thing with parsing data or strings, +03:01 is that they're always these exceptions. +03:03 And singing has this apostrophe or single quote +03:07 and I had to account for that, +03:08 so instead of just word, I had to go with +03:12 a more specific portion of the regular expression. +03:17 So two of those because we want to match +03:19 the ones that have exactly two words. +03:23 Then, we do a literal open parentheses, +03:27 and as with the dot, right, +03:30 all these characters have a special meaning. +03:33 Dot matches all, parentheses are for capturing, +03:36 so if you want a literal one, you have to escape them. +03:39 So here I'm doing the same thing as with the dot, +03:41 and that's escaping the parentheses. +03:43 I want literal parentheses, because the years +03:46 are in parentheses. +03:50 Then the years are four digits, +03:52 and then I do a dollar which is the end of the string. +03:55 Phew, that was quite a regular expression, +03:58 but the nice thing about verbose is that +04:00 I could add all these commands, +04:02 which made it super easy to explain it to you. +04:06 So run that cell, and it's now stored in pat. +04:09 And pat is just variable name, +04:11 and now I can use that pattern +04:14 to loop over the movies and match them all. +04:17 So let's do that next. +04:20 Four movie in movies. +04:24 Print movie. +04:26 Just the text. +04:28 And then I can use match on the pattern. +04:30 So before we did re.match, +04:33 but now we can do pattern.match. +04:36 And I'm interested in match because I want to +04:38 match the string from beginning to end. +04:43 Put in a movie +04:45 and there you go. +04:46 So let's check if this regular expression is +04:50 actually correct. +04:51 Citizen Kane, two words. Match. +04:53 The Godfather. Match. +04:55 Casablanca, one word. Not a match. +04:57 And Schindler's List, this was another tricky one. +05:00 In the first iteration, I did not match this because +05:04 again, I had to account for that single quote +05:07 which I told you before. +05:09 So this one is actually a match +05:10 because I consider Schindler's as one word. +05:14 Vertigo's not and The Wizard of Oz, +05:15 four words, is not. +05:17 So how cool is that? +05:19 Let's move on to advanced string replacing. diff --git a/transcripts/28-regex/7.txt b/transcripts/28-regex/7.txt new file mode 100755 index 00000000..5883d4e2 --- /dev/null +++ b/transcripts/28-regex/7.txt @@ -0,0 +1,56 @@ +00:00 Welcome back to the last section on the regex lesson. +00:03 This video will show you advanced string replacing +00:06 using re.sub. +00:08 For example, we have a string here +00:09 on doing the 100 days of code, 200 days of Django, +00:12 and, of course, 365 days of PyBites. +00:16 So you're doing a simple string replacement. +00:20 It's a bit ugly, right. +00:22 So this will work but. +00:25 When you start to do things multiple times, +00:28 you have to think about a better way to do it. +00:31 So let's use re.sub +00:34 to make a more flexible replacement regex. +00:38 So re.sub... +00:40 raw string +00:42 and I want one or more digits +00:44 and I just want to replace those by 100. +00:48 And I do that on the text +00:50 and this works as well and it's more flexible +00:54 because if there are will be like five or six +00:57 of these hashtags with different integers, +01:00 they all would work. +01:03 Now let's look at a more advanced example +01:07 where we also want to capture the thing we replaced. +01:12 Say, for the same string, +01:14 I want to replace the thing after the days off. +01:17 So all should be Python, but we want to respect the integer +01:21 so I want to have 100 days of Python, +01:23 200 days of Python, and 365 days of Python. +01:26 Doesn't really make sense in a sentence +01:28 but it does for our exercise. +01:30 And the way to do that is to write a re.sub... +01:35 raw string. +01:37 And let's define the regular expression as a literal hash. +01:45 One or more digits. +01:47 Hard-code days of +01:51 one or more alphanumeric characters. +01:55 Here, you see these capturing parenthesis again. +02:00 I'm going to use that in a replacement part +02:02 which is the second argument +02:04 and I can reference that with backslash one. +02:08 So what this does is it takes the... +02:12 match of hashtag... +02:15 digits days off +02:17 and I'm going to put that in the replacement string. +02:21 And then I want to hard-code Python +02:25 and I want to do this on text. +02:28 And there you go. +02:29 Awesome, I'm doing 100 days of Python, 200 days of Python, +02:33 and, of course, 365 days of Python. +02:35 That's a wrap. +02:37 I hope you enjoyed this and got a better feeling +02:40 of how to write your regexes in Python. +02:44 Of course it's not a complete list of all the features +02:47 and that's why in day two I will provide you +02:50 some more resources and things you can check out. diff --git a/transcripts/28-regex/8.txt b/transcripts/28-regex/8.txt new file mode 100755 index 00000000..2962a432 --- /dev/null +++ b/transcripts/28-regex/8.txt @@ -0,0 +1,37 @@ +00:00 So, let's do a quick wrap of what we've learned so far. +00:04 When to not use regexes. +00:07 Well if simple string operations do, use those. +00:12 Re.search versus re.match, +00:14 re.match matches the whole string, +00:16 re.search matches part of the string. +00:19 Those are probably the main methods +00:21 you will be using on the re module. +00:24 Capturing parentheses, +00:25 to access part of the match use parentheses +00:29 and you can use groups on the matching object +00:33 to get to the string. +00:35 Your new best friend findall, one of my favorites. +00:38 To get all the occurrences of a pattern in a string, +00:42 you can us findall and I showed you two examples. +00:45 One is to get all the days or numbers out of the string +00:50 and it returns a list, and findall combined with counter +00:54 one line of code a lot of stuff gets done. +00:57 Compile for regexes, so you can use re.compile +01:00 to compile a regex to use over and over again. +01:04 And you can add a verbose switch to make regular expressions +01:08 none space sensitive so you can line 'em out +01:13 over multiple lines, making 'em more readable. +01:17 String replacements, resub. +01:19 Again if you can use string replace do that +01:21 but sometimes the pattern you want to match +01:24 is more sophisticated and you need a regular expression. +01:27 The way to use read outsub methods +01:30 is to define your pattern. +01:34 Again I prefer you using a raw string +01:37 to not to escape the back slashes. +01:41 And the second argument is to put in your replacement. +01:44 And here's a little bit more advanced example. +01:47 Where you use capturing parentheses to +01:49 port part of the matching string +01:51 to the replacement arguments. +01:54 And now it's your turn. diff --git a/transcripts/28-regex/9.txt b/transcripts/28-regex/9.txt new file mode 100755 index 00000000..1356c036 --- /dev/null +++ b/transcripts/28-regex/9.txt @@ -0,0 +1,46 @@ +00:00 Welcome back to 100 days of Python. +00:02 This is the second day of the 3 day regEx blog. +00:05 And today I want to give you some pointers +00:08 to get more familiar with regxxes +00:11 and start to write your own. +00:13 So we did an article, +00:15 10 Tips to Get More Out of Your RegExes. +00:18 I recommend you read through it. +00:20 One thing I didn't touch on is greediness, +00:23 which is important and can prevent nasty bugs. +00:27 And if you're still more a beginner in regex land, +00:31 there's a nice talk at the end by Al Sweigart. +00:35 Who by the way wrote an awesome Python beginner book, +00:39 called How to Automate the Boring Stuff, +00:40 and it's called Yes, It's Time to Learn +00:42 Regular Expressions. +00:43 And that gives you a very nice overview +00:46 of regular expressions. +00:48 Secondly, there's a nice how-to on the +00:51 Python documentation page. +00:53 Very refreshing how-to. +00:54 I read this when I wrote the 10 Tips post, +00:56 it's pretty dense, but it is a very good +00:59 primer into regular expression, +01:01 and what all the specific syntaxes mean, etc. +01:07 If that's too much reading, which I can totally get, +01:10 there's a nice online RegEx tester. +01:13 And you just select Python, +01:16 and you can write here your regular expression, +01:18 and test it in real time. +01:20 For example, I have some HTML with two paragraphs. +01:23 And let's experiment a little bit +01:25 with that greediness I mentioned. +01:28 So let's match all of it. +01:31 So that's greediness because it takes everything +01:34 from the starting paragraph tag to the ending one. +01:38 If I do a question mark, the match becomes shorter. +01:41 It only takes the first paragraph. +01:43 And you see all this nice feedback and explanations here. +01:47 So that's a really great tool to experiment +01:50 writing regular expressions in Python, +01:53 because you get instant feedback. +01:55 So that will be the third resource I have for you today. +01:59 Just spend 20 or 30 minutes experimenting with regexes, +02:03 and you'll see that they become a lot easier. +02:06 Good luck. diff --git a/transcripts/31-logging/1.txt b/transcripts/31-logging/1.txt new file mode 100755 index 00000000..4550bf11 --- /dev/null +++ b/transcripts/31-logging/1.txt @@ -0,0 +1,81 @@ +00:00 Hey, this is Michael, and I'll be +00:01 your guide for the next 3 days. +00:03 And over those 3 days, we're going to talk about +00:06 recording the actions of your application, +00:09 giving you insight into how your app is running, +00:11 how users are using or misusing you code, +00:15 and even capturing crashes that might happen. +00:20 So, if you run a website, and the user +00:23 says, "Hey, your site crashed." +00:26 Here's a 500 server error page from Get Up, for example. +00:31 If it crashes, what do you do? +00:33 They say, "Well, I clicked this button, +00:35 "and it just crashed." +00:37 Great, if you click the button and the button works, +00:39 well, you're in a really tough place +00:41 trying to reproduce that, unless you recorded +00:43 exactly what they did and exactly what went wrong. +00:46 So we'll see with logging that that's super easy to do. +00:49 So next time they call you up and say, +00:52 "Hey, something crashed," you can actually go look +00:54 and see what happened, and that will give you +00:56 a much better chance of, one, reproducing +00:58 what they did, and two, solving the problem. +01:01 Let's take a look inside the log file +01:03 for Talk Python training. +01:05 So this is somewhat condensed. +01:07 This is one log file from one day, +01:10 but it's compacted so you can see +01:11 the different scenarios within it. +01:13 And it's also edited to be anonymous. +01:16 We're actually keeping more information in our log files, +01:18 but I don't want to share people's private information, +01:21 so this is what we're going to get. +01:23 Now, if you look through here you'll see a couple of things. +01:25 There's notices, there's errors. +01:27 For example, here's a user action. +01:30 This particular user from that IP address +01:32 has successfully logged in. +01:35 You can see information about their browser, +01:36 and their IP address, and the time, +01:38 and all that kind of stuff. +01:39 We have some more user access. +01:41 Here somebody's subscribed to get notified. +01:44 They basically gave us their email address and said, +01:46 "Hey, mail me when there are new classes." +01:48 Down here, our user happened to have logged out. +01:50 They were logged in, and they did some stuff, +01:52 and now it looks like they're gone. +01:53 They were running Windows 10, for example, with Firefox. +01:56 That's cool, so these are the types of things +01:58 you might record, but we also have other interesting stuff. +02:01 For example, why is a search engine trying to search +02:06 a authenticated only lecture page? +02:09 So, for some reason, it's trying to go to this page. +02:12 Either it doesn't exist, or it's not allowed to get to it. +02:15 But, for some reason, people's trying to get here. +02:18 So maybe we should go and figure out what's going on, +02:21 either make that page accessible to Google, +02:23 or maybe we're linking to it in a way we probably shouldn't. +02:27 Look at this appear, though, this is a little nefarious. +02:29 We see somebody coming in and trying to go to wplogin.php. +02:34 That's WordPress log in. +02:36 This page, this site, is not written in php, +02:40 it's definitely not WordPress, but here +02:42 somebody's trying to get into it. +02:44 And they're telling us that the user agent is Firefox 4.0. +02:47 That's unlikely, 'cause that's so old. +02:51 Here we can see somebody's actually trying to break in. +02:53 If we look carefully, they're doing +02:55 it again, and actually again. +02:57 This happens all the time. +02:59 People are just probing for known ways +03:01 to get into your site, get into your database, and so on. +03:04 So knowing what is happening with +03:05 your application, it's really important. +03:09 It might be obvious what the users are doing, maybe. +03:11 It's really unlikely that it was obvious +03:13 that people are trying hack it, that search engines +03:15 are trying to search hidden parts of it, things like that. +03:17 So having this log information is really, really important, +03:21 and you'll see it's quite easy to add to our apps. diff --git a/transcripts/31-logging/10.txt b/transcripts/31-logging/10.txt new file mode 100755 index 00000000..741e53f3 --- /dev/null +++ b/transcripts/31-logging/10.txt @@ -0,0 +1,14 @@ +00:00 Day 2 you're goal will be to take the application +00:03 you chose yesterday and look at the flow, +00:07 and think about what type of things +00:11 do you want to keep track of. +00:12 Do you want to track errors? +00:14 Would you want to track timing? +00:15 Do you want to track inputs, outputs? +00:17 All that kind of stuff. +00:19 So think about what you're going to try to log +00:21 and how you're going to do it. +00:22 Do you want this to go to a file system, +00:24 do you want it to go to the console, +00:26 all those considerations. +00:27 So just kind of plan out what you're going to do the next day. diff --git a/transcripts/31-logging/11.txt b/transcripts/31-logging/11.txt new file mode 100755 index 00000000..c8e616c4 --- /dev/null +++ b/transcripts/31-logging/11.txt @@ -0,0 +1,32 @@ +00:00 Alright, final day, Day 3, of this block. +00:03 You're going to use logbook, and you're going to +00:05 add logging to your application. +00:07 Now this is an external requirement, +00:09 so I recommend you have a virtual environment +00:11 dedicated to this application. +00:13 Once you have it and you've activated it, +00:14 you'll pip install logbook to get started right here. +00:18 And then, you're going to need +00:20 to do a one time register of the logging, +00:23 and then you'll be able to use it over and over. +00:25 So here's the basic steps of how we did it in ours. +00:28 You could choose other handlers +00:30 and do other interesting things. +00:32 The StreamHandler and timed, rotating FileHandler, +00:35 those are the two that I like, but pick whatever you want. +00:40 And then once you're ready to log something, +00:42 you can create this sort of once. +00:44 You can create as many times as you want, but also can be +00:45 just queried the NAT level in the application. +00:48 And then you're going to use it and, say, "log.notice. +00:51 log.warn, log.critical" and so on. +00:54 So, take that little bit of information there, +00:56 and what you planned on logging and tracking +00:59 the day before, combine them, and make your app +01:01 production ready with logging. +01:04 I hope you enjoyed learning about Logbook and logging. +01:07 Be sure to share what you did with us +01:09 on Twitter, and hashtag it appropriately. +01:12 And that's it, you now have this new skill. +01:14 You can do really cool logging in your application. +01:17 And it's one of those things that pays off in the end. diff --git a/transcripts/31-logging/2.txt b/transcripts/31-logging/2.txt new file mode 100755 index 00000000..f06e43e2 --- /dev/null +++ b/transcripts/31-logging/2.txt @@ -0,0 +1,38 @@ +00:00 Python has built in log in +00:01 and you can do log in without +00:03 any external dependencies. +00:05 But I would like to introduce you to +00:07 this concept to this package logbook. +00:10 Now this as you can see here replaces +00:13 python's standard library for logging +00:16 and it does so in a way that makes it really easy +00:19 to work with logs in our application +00:21 but also super flexible. +00:23 So for example, we can come over here +00:25 and import the logger and we can just say +00:27 "I would just like to push all +00:28 the log messages to standard out", +00:30 could be a file also for example, +00:33 now we'll create a logbook +00:34 and then we just log.info, +00:35 log.trace, +00:36 log.error, +00:38 we sort of categorize the response, +00:41 the message we'll send that way +00:42 and you get something like, +00:43 well see below but also what you see in stock python. +00:47 Why not just use the built in one? +00:49 Well, this is nice and clean and +00:50 it creates a nice hierarchy, +00:52 really really cool for when you use it your application. +00:54 But also it's way more flexible, +00:57 look at this, +00:58 how about getting a notification to your phone +01:00 or pushing notifications or something like that +01:02 under certain log message situations. +01:04 Really cool. +01:05 So we'll see the logbook is really powerful +01:09 and it's actually created by Armin Ronacher +01:11 who is the creator of Flask, +01:13 one of the most popular and well liked +01:16 Python web frameworks out there. diff --git a/transcripts/31-logging/3.txt b/transcripts/31-logging/3.txt new file mode 100755 index 00000000..244041a7 --- /dev/null +++ b/transcripts/31-logging/3.txt @@ -0,0 +1,47 @@ +00:00 For our application, we're going to return to something +00:03 you've seen on day 10 and on day 25. +00:07 Let's go over here to the GitHub repository. +00:09 We're going to go back to our Movie Search application +00:11 that's going to call a web service and talk to the server; +00:15 talk to the Movie Search service that we've already talked +00:18 about in terms of using JSON APIs, and in terms +00:21 of air handling. +00:22 There's no record of what happened with this app, so +00:24 we're going to extend it further by adding logging to +00:27 this simple application. +00:29 Over here on the logging section, you can see we have +00:32 a starter movie search in case you want to recreate this +00:35 for some reason, and then here we have what's going to be +00:38 the final version. +00:39 Before I open this in PyCharm, let's create the virtual +00:41 environment. +00:42 Here we are in the directory we're going to work in. +00:46 Create our little virtual environment here, and we'll be +00:49 done with that. We're just going to open this in PyCharm. +00:56 Here we are in this application. +00:58 We should have our virtual environment active; we do. +01:02 We don't have anything installed; we have a requirements +01:05 file that says we have to have requests, so let's go +01:07 ahead and install that. +01:08 In fact, we're going to use Logbook, so I'll go ahead and add +01:11 Logbook here as well, and then we can say "pip install +01:14 -r requirements". +01:17 Or, I could just click this. +01:19 Great, now we have Logbook and we have requests and +01:22 their various dependencies. +01:25 Let's just go ahead and run this real quick here, so: +01:27 Run the Program. +01:31 It's going to go off to the server; let's search for Capital: +01:35 we found three movies there. +01:37 We could search for Action, and we're getting stuff back. +01:41 However, if we turn off our internet, +01:44 we try this again with anything, +01:47 Boom: "Error. Could not find server. Check your network +01:49 connection". +01:51 Recall, over here, we added our try-except block +01:54 and we have these various pieces there. +01:57 What we're going to do is take this application and record +02:00 a couple of things: what people are searching for, maybe +02:04 how many results were found, the time of day when that was +02:07 done, and of course if there's any errors, we're going +02:10 to record those errors as well. diff --git a/transcripts/31-logging/4.txt b/transcripts/31-logging/4.txt new file mode 100755 index 00000000..8457d72e --- /dev/null +++ b/transcripts/31-logging/4.txt @@ -0,0 +1,110 @@ +00:00 Okay are we ready to start adding +00:01 logging to our application? +00:02 There's two steps. +00:03 One, we have to globally configure +00:05 how we want to log things. +00:08 Do we want our log messages to go to just standard out, +00:11 so the terminal or console? +00:12 Do we want them to go to a file, +00:13 if it's a file do you want that file based on a date +00:16 and roll as the days change, +00:18 or do you want that to just be one big file? +00:20 Or do you want to send that somewhere crazy, like, +00:23 email or desktop notifications, as you saw is possible. +00:27 So we're going to configure logging +00:29 and then we're just going to add the log actions +00:31 as a separate way. +00:33 That actually turned out to be super easy; +00:34 the only thing that's a little bit complicated +00:36 is setting this up. +00:37 So let's write a function over here +00:38 that will let us do that. +00:42 So we're going to pass in a filename, +00:43 and it can be , +00:46 let's give it a default value of None. +00:48 It can mean nothing, or we could pass in a filename. +00:51 So what we're going to do, is we're going to go over here +00:54 and we're going to actually set the level first. +00:56 So here's how this works; +00:57 we're going to say our current application is operating +00:59 at level of notice and above. +01:02 So there's like a hierarchy of levels in the logging, +01:06 there's like, trace, which is just super-verbose stuff, +01:10 there's error, which you almost never want to skip, +01:13 but maybe under normal operations +01:14 you don't want to show the trace. +01:16 Only the notices and the warnings and the errors. +01:18 So we're going to set this here. +01:20 So we're going to use logbook, +01:21 which needs to be imported at the top, +01:23 which we've just had PyCharm do, +01:25 and then we can come over here and let's say, +01:27 let's set it to 'trace' for just a minute. +01:29 So we have it absolutely verbose, +01:30 then we'll dial it back when we're done. +01:33 Alright, so we're going to choose a level, +01:35 and then based on whether we have a filename or not, +01:37 we're going to assume the fact that there's no filename, +01:40 or one was not specified, +01:42 that that just means 'send it to the console'. +01:44 But if there is a filename, we want to do that. +01:46 So we'll say this; if filename, we want to put it in the file. +01:49 So we'll say; logbook, now there's +01:51 all these little handlers in here. +01:54 There's a file handler, a 'fingers crossed' handler, +01:56 a Gmail handler, hashing, mixing, mail, etc. etc. +02:02 The one that we want, is we want a filename +02:04 that is based on the days. +02:05 So it has the date involved in the filename. +02:08 When the date changes, it automatically creates a new file, +02:11 and goes from there. +02:12 So that's going to be real nice. +02:13 So to accomplish that, what we need to use +02:15 is a time-rotating file handler. +02:19 And this takes a couple of things. +02:21 We have to obviously give it the filename, +02:23 we're going to set the level, be the level, +02:25 and then we want to set the date format so it knows +02:28 how to roll that out, and it has a default there, +02:32 and actually that default is totally fine, +02:33 so we're going to leave this off but +02:35 if you want to change that it's year, month, day, +02:38 is how it's going to print that out. +02:40 Okay, so we'll go like this, +02:42 and that's going to create the handler +02:44 and then we would just say, 'push to application'. +02:48 That means every action we do with logging +02:50 is going to use this underlying system here, +02:53 so if that's not the case, +02:55 we're going to say, 'logbook not stream handler', +02:59 we'll give it a stream, which we need to import this at the top, +03:02 'standard out'. +03:04 That's just like what happens when you say 'print'. +03:07 And the level is equal to level again, +03:09 and in this case we're going to push that to the application. +03:14 That's it. Long as we call this function, things will be initialized. +03:17 But before we get on, let's make our first log message +03:20 to be something that says, +03:22 here's how we've configured logging. +03:24 So here's a little message that we might have, +03:27 we'll say, great, the logging is initialized +03:29 and the level is trace, or something like that, +03:33 and the mode is either standard out mode or file mode, +03:36 and we can create one of these logs +03:42 and we'll have this little startup logger, +03:44 and then we can just say 'logger.' +03:46 let's say it's going to be a notice. +03:49 Okay, so this should be our very first message, +03:52 and let's just come down here and say we're going, +03:54 before we even call main we're going to say, +03:55 'init logging but no filename'. +03:58 Let's run this and see that we've got everything working. +04:02 Woo-hoo, look at that! +04:04 We have our time, we have the level, 'notice', +04:10 this comes from the log category, it's the start-up log, +04:14 this is the message that we actually wrote. +04:17 Logging initialized, level is nine, +04:19 which is a stand-in for 'trace', +04:22 and the mode is standard out, +04:23 that's why you see it here and not in a file, +04:25 and of course our app still works. diff --git a/transcripts/31-logging/5.txt b/transcripts/31-logging/5.txt new file mode 100755 index 00000000..986d5910 --- /dev/null +++ b/transcripts/31-logging/5.txt @@ -0,0 +1,113 @@ +00:00 Now that we have logging configured +00:02 and we are calling that to set everything up +00:05 let's go and actually create a app level +00:08 and an API level logger, so let's call this +00:11 the app_log and this, we already saw me say +00:14 Logbook.logger and we give it the category +00:17 so I'll call this App right and then +00:19 we can use that throughout this part +00:21 of our program and we'll know not +00:23 just what the message was but +00:24 generally where it came from and let's do +00:27 something similar over in the API section. +00:32 So we'll call it api_log to import log +00:34 book again and this will be API +00:37 Okay, so when we're doing an accents +00:39 with the API, maybe the timing and so on +00:42 we could track that over here. +00:45 Let's start with the app log. +00:47 Now, I always find there's a super tricky +00:50 balance between too much logging code getting +00:54 into your application and making it hard to read +00:56 being too verbose and not capturing what +00:58 you need so this is a pretty simple example +01:01 so it's a little bit hard to find that balance +01:04 but ,you can see that it's pretty easy to read. +01:06 Let's deal with the error cases first. +01:08 Let's come down here and say app_log +01:11 It's going to be an error. +01:13 So this could either be error or it could be a +01:15 warning right like our program isn't broken it's +01:18 just in an environment that it can't operate in. +01:21 So I'm going to call this actually a warning. +01:23 I'll do a bore in here and it'll say same message. +01:26 So we can come out here and refactor that +01:28 to a variable and just call that message +01:31 more in the same little message like that. +01:34 Actually, we already have a classifier there +01:37 so we'll say like this... +01:41 Same thing here... +01:47 You see it's getting harder to read but we will +01:49 have a record of this so that's pretty cool. +01:51 Now this one, like these two we anticipate right. +01:54 This is if the internet is off. +01:55 This is if they don't type anything +01:57 and they just hit enter. +01:58 This is kind of standard stuff so that's why +01:59 it's a warning but down here +02:01 this is like we didn't expect this. +02:03 We have no idea what went wrong. +02:04 Something went wrong. +02:06 We could say this error and give it the message +02:09 with the formatted exception details +02:12 added in there right? +02:13 Or there's actually a way to say +02:15 there's some kind of unknown exception. +02:16 Just record that as an error so we can actually say +02:19 exception and just give it the exception like this. +02:22 Okay, so let's go and try to run our program now +02:25 and see what we can get to happen on it. +02:31 File just search for T, looks like it works +02:33 so I'll just run a few searches +02:35 see if I can get that exception error to hit. +02:38 Okay here, there's a very rare chance that +02:40 some random error's going to be thrown. +02:42 Recall that from day 25 and I got it finally +02:45 after a bunch of attempts to throw +02:48 a StopIteration exception. +02:49 So here you can see it recorded as an error. +02:52 It said this isn't a category app and then it just +02:54 put the trace back right there. +02:56 That is... this section right here. +03:00 Let's try some other errors. +03:04 We know that it's an error to hit enter +03:06 and that's going to be a ValueError +03:07 because we're searching for nothing. +03:09 Here you can see error, you must search for a term. +03:11 This is just the print statement right there. +03:15 And then here, this is the log +03:16 statement that we put as a warning. +03:18 Right, warning ,the app says you must search +03:20 for a search term and that's because we put it +03:24 in the log as warning 'cause we +03:25 know it's not technically broken. +03:28 The user's just using it wrong. +03:30 So the final thing to test is to +03:31 turn off the internet. +03:36 Alright look, we got our standard print and +03:38 then we got our log message which is warning +03:40 app at the app level we could not +03:43 find a server, check your network connection. +03:50 Alright, let's just add one +03:51 final sort of success message here. +03:54 Let's go down here and say like app_log this info trace +03:59 I don't know. +04:00 Let's put it at trace so this is super verbose +04:02 but we can say something to the effect of.. +04:07 Clean that up a little now let's see how this works. +04:09 Run it successfully, search for action. +04:13 Perfect, it worked and we logged the fact that +04:15 trace app search is successful. +04:18 The keyword is action. +04:19 There were eight results. +04:20 Let's search for runner. +04:23 Here we go, search, we got six results. +04:26 Keyword runner. +04:27 Alright, so I feel like we're getting some +04:29 decent logging at this level. +04:31 The other thing I'd like to do +04:32 before we call this done is to look in here and +04:35 maybe see if there's something we want to put in here +04:38 in terms of logging at a lower level +04:40 just to show how we can work with +04:42 different parts of our application. diff --git a/transcripts/31-logging/6.txt b/transcripts/31-logging/6.txt new file mode 100755 index 00000000..fe33a44e --- /dev/null +++ b/transcripts/31-logging/6.txt @@ -0,0 +1,55 @@ +00:00 Now we've logged at the general top level of our app, +00:02 let's log down into our API interaction here. +00:05 So let's do a couple things, +00:07 let's do some time tracking here +00:09 so we'll import this. +00:12 We'll do this time thing so we know how long this takes. +00:17 So that'll give us a start +00:18 and end time we come down here +00:20 and we say something like this api_log.trace +00:23 we'll do some verbose things +00:25 like "starting search for keyword" +00:32 and then let's put this bookend here, +00:33 "finished search for keyword". +00:37 Some results in some number seconds. +00:41 Put colon g grouping, okay. +00:42 So what're we going to have? +00:44 How many results? That's going to be len of movies +00:47 and the duration is going to be t1 minus t0. +00:51 So this is great. +00:53 We can also come down here +00:54 and say api_log.warn("no keyword supplied") +01:03 We could come down here and maybe store the status. +01:07 That's probably a traced type of thing. +01:10 Request finished. +01:16 There's our status code before +01:17 we potentially throw in exception +01:18 so we know instead of 500 is it 404, things like that. +01:22 Okay, I feel like this is pretty good, +01:23 let's run it one more time and see if our app is ready. +01:26 So we started our logging, that's good. +01:27 We're going to search for "test", +01:29 see what do we get down here. +01:30 API started the search for test. +01:33 The request finished, status code 200. +01:35 That's good. +01:36 And then it finished in this amount of time, +01:38 that's seems like a huge weird number +01:40 so we'll do some clean up on that number +01:42 and then it finished and it came over here. +01:44 So, that's all pretty cool. +01:46 Let's switch this to milliseconds +01:50 and do an integer times 1,000. +01:55 One more to see how that works, quick test. +01:57 There we go, that looks a little more clean to me. +02:00 193 milliseconds for our request, everything was good. +02:04 Let's try some sort of error. +02:06 Starting search for nothing, warning no thing. +02:10 Now noticed over here we have our API levels +02:12 and we have our app level and we have our start up code. +02:15 So it really tells you like +02:16 what part of your application is talking +02:18 to you on this particular message. +02:21 Alright, so I feel like we've pretty much +02:22 added really nice logging to our application. +02:25 But we're not quiet done yet. diff --git a/transcripts/31-logging/7.txt b/transcripts/31-logging/7.txt new file mode 100755 index 00000000..159484eb --- /dev/null +++ b/transcripts/31-logging/7.txt @@ -0,0 +1,62 @@ +00:00 So far, we've got this almost unreadable log goo +00:04 mixed in with our standard user input/output. +00:07 So it's really, +00:09 it's nice that we can see what's going on, +00:11 but it's really not helpful for us here. +00:13 So let's change this. +00:15 Let's just go down here and, to our program, +00:20 and when we init the logging, instead of passing in nothing, +00:22 we're going to pass in a file name, +00:24 and that's going to go to the timed rotating file handler, +00:28 the same level rather than the standard out. +00:31 Okay, so let's go down here, and let's, +00:32 we'll just call this movie app.log, something like this, +00:39 and run it again. +00:41 Alright, now it's back to the way it was before +00:43 in terms of interactions. +00:45 There's none of that mess around. +00:46 Let's search for action again. +00:49 And it runs, and we get our nice output, and, ta-da! +00:52 Let's run it one more time. +00:53 Let's search for hero. +00:55 Ah, we got a bunch of good stuff with heroes and so on. +00:58 And let's run it with an error. +01:00 Nope, must search for something. +01:02 Alright, how about jazz. +01:04 Anything there? Hmm, looks like there is. +01:06 Pretty cool, so that's great. +01:08 Our app is working again, but notice, +01:10 notice over here, we now have a movie-app. +01:13 Instead of .log, it has 2018-02-23, +01:18 because that's today, that's when I'm recording this +01:21 right now, so let's look and see what's in there. +01:23 So you can see it's exactly the same messages. +01:25 Here's the app is starting up. +01:28 Here's the app starting up again. +01:31 Things like that, here's another startup. +01:33 And these are all the messages. +01:34 We started a search for action, we got a 200. +01:37 We got eight results, that long. +01:39 Alright, and you can see the time of day +01:41 to the super accurate right there. +01:44 Again, we're starting up, and this time we searched +01:46 for hero and got 10 results. +01:48 This time we searched for nothing, +01:49 and we got a warning, and so on. +01:51 Okay, so we have this log file here, +01:53 and it's not super important, +01:56 it's less important, let's say, when you're writing +01:57 a regular app, 'cause you could just put +01:59 the data and time in the log file. +02:01 But if you're writing a super long running service, +02:04 like a web application that starts and runs +02:07 basically indefinitely, or +02:09 some kind of queuing application that's just listening +02:13 for messages and is going to run, +02:15 basically anything on the server +02:16 that starts and just runs, +02:18 the ability to have it automatically rotate - +02:21 when it becomes the 24th, the next log message +02:24 will just start a new file, for example. +02:26 So really really nice to have this timed, +02:28 rotating file handler here. diff --git a/transcripts/31-logging/8.txt b/transcripts/31-logging/8.txt new file mode 100755 index 00000000..f85604e5 --- /dev/null +++ b/transcripts/31-logging/8.txt @@ -0,0 +1,58 @@ +00:00 Now that you've seen logging and logbook +00:01 in action, let's quickly review some of the concepts. +00:06 So, we're going to start by importing the logbook, +00:08 And if we're going to not use a file, +00:10 we're going to need to also import sys, +00:12 so we can get to standard out. +00:15 Then we're going to maybe get a file name, +00:17 that can come from, like a configuration file, +00:21 the environment, you could hard-code it, whatever you want. +00:24 We're going to set a logging level here. +00:26 Now I didn't actually demonstrate it, +00:28 but if we went and switched that to say warnings, +00:31 you would no longer see any of the messages that were trace, +00:34 right? Only the stuff warning and above would appear in the +00:37 log file, or in the console, and nothing else. +00:39 So you can dial this up and down, +00:41 depending on whether you're running a debug build, +00:44 or production build, or release build, things like that. +00:47 So, set this, and that may also be based on configuration, +00:50 or version, type of app, right? +00:53 Like it's production or development and so on. +00:56 Then we have to install a handler, +00:58 so we're either going to use a stream handler, +01:00 set that to standard out, +01:01 set the level of push it to the application. +01:03 Or, if you want to go to a file, I recommend +01:06 the timed rotating file handler, and do the same thing. +01:10 Once this is set up, then it's basically ready to go. +01:15 So remember this level acts as a filter here, +01:17 so you can always go logger.trace, logger.info, +01:22 but only if the level is low enough, +01:25 will it actually show on these handlers. +01:29 Now, you do that, what we just saw, once, +01:32 at the beginning of your app, and then, +01:34 anytime you want to log something, +01:35 you're going to create one of these loggers, +01:37 like, heres a start up logger. +01:39 And we have this little info message, like, +01:41 hey, we're getting started like this. +01:43 Now this just a string, nothing logging about it. +01:45 But then we can go to our startup log and say notice, +01:48 this message, right? And that's a pretty high level of +01:52 log message there, this notice level. +01:55 And this is going to go, probably near the front, +01:58 so it'll tell you what level you're logging at, +02:00 which will help you understand what +02:01 the rest of the log means. +02:03 We have different options, we have notice, +02:05 info, trace, warn, error, and critical. +02:08 So critical is even more of an error than error, right? +02:11 We also have exception, if you just want to show +02:14 a straight up exception. +02:15 And then the output looks like this, +02:16 it has the time, it has the level, here, notice, +02:19 it has the log category, log name, in this case, app, +02:23 and then it finally has the actual message. +02:26 Really nice, really easy to set up, +02:27 and it's super, super flexible. diff --git a/transcripts/31-logging/9.txt b/transcripts/31-logging/9.txt new file mode 100755 index 00000000..4d99ed2a --- /dev/null +++ b/transcripts/31-logging/9.txt @@ -0,0 +1,15 @@ +00:00 All right, it's your turn to do some logging. +00:02 Let's look at all the steps that I'm recommending for you. +00:06 So there's a little summary of why you care about logging, +00:09 but we're going to focus on the three things, +00:12 the three days, and what you're going to do on them. +00:13 Today, you're basically done. +00:15 It's watch the videos as usual. +00:18 What you're going to do is you're going to pick an application +00:20 that either you've built in this course or previously built +00:23 that you think could use some logging. +00:25 It would be nicer if it had some logging +00:27 much like we just added to the movie search app. +00:29 So your goal for today is just to pick an app +00:32 that you're going to study and add logging to +00:34 over today and the next two days that follow. diff --git a/transcripts/34-refactoring/1.txt b/transcripts/34-refactoring/1.txt new file mode 100755 index 00000000..aab17410 --- /dev/null +++ b/transcripts/34-refactoring/1.txt @@ -0,0 +1,28 @@ +00:00 Welcome back to the 100 Days of Python. +00:02 In the coming 3 days I will guide you +00:04 through refractoring and writing Phythonic code. +00:08 One thing is to write Python, the other thing +00:10 is to really leverage all the great stuff Python has. +00:14 The Zen of Python states there should be one +00:17 and preferably one way to do something, +00:20 and that's great because in Python there usually is one best +00:24 way to something, and the more you know these constructs +00:27 and idioms, the more readable and elegant +00:30 your code will become. +00:31 For this lesson I've prepared a Jupyter notebook +00:34 with 10 practical examples how you can improve your code. +00:38 For example use a with statement +00:40 instead of a try, accept, finally block. +00:43 Or use enumerate to not keep a manual counter +00:47 or what about refractoring a long if, +00:50 elif else statement using a dictionary. +00:53 We will touch upon list comprehensions, +00:56 generators, using explicit is better than implicit +00:59 in your exceptions, string formatting, tuple unpacking, +01:03 PEP 8, the Zen of Python, and even some common +01:06 best practices writing maintainable code. +01:09 And for day two and three I have you refractor +01:12 your code or the code of somebody else +01:14 to really put into practice what you've learned. +01:17 So there's a lot to cover, I'm really excited. +01:19 Let's dive straight in. diff --git a/transcripts/34-refactoring/10.txt b/transcripts/34-refactoring/10.txt new file mode 100755 index 00000000..be06951d --- /dev/null +++ b/transcripts/34-refactoring/10.txt @@ -0,0 +1,54 @@ +00:00 One thing that the Zen is saying is explicit is +00:02 better than implicit and I want to show you +00:05 that concept with a couple of examples here. +00:08 For example, if you do a from module import *, +00:10 it imports everything in your namespace if this would +00:14 import full or bar and you define such a variable or +00:18 function that will override it +00:19 and that leads to very obscure box. +00:22 So don't do import *. +00:24 Make it explicit what you're importing. +00:26 So from module import full, bar. +00:29 Another coding horror is something like +00:32 try and except pass. +00:36 Now this is like the black hole or monster that +00:39 absorbs all possible errors, muting them away +00:42 and you won't see anything in return. +00:45 So whatever happens, even if I were to interrupt +00:48 the program with a control C which would raise +00:51 the keyboard interrupt exception, +00:53 that will be silenced as well so I cannot even +00:56 kill my program basically. +00:58 So don't do this. +00:59 No bare exceptions, make it explicit. +01:02 So a little bit better will be for example, +01:13 at least I get some information, +01:16 or let's divide it by 0, I'm still shouting +01:19 and I get another error. +01:20 And you see these operations lead to different exceptions +01:24 so the best way to do it is +01:26 to explicitly name the exceptions. +01:32 Again, try to divide number one by number two +01:38 and let's go through the different exceptions we might get. +01:44 Here for example, if I get a ZeroDivision error, +01:46 I just return 0. +01:47 That's my handling of the exception. +01:49 If I get a type error, +01:54 and here I just print a message but I don't +01:56 really have a way to allow this +01:59 and so I just reraise the exception. +02:01 And if something else goes wrong you still can instead of +02:04 doing accept pass or accept print something you can at least +02:08 say accept exception as variable and browse that variable. +02:12 And you can send this to a log file for example. +02:14 To have at least a little bit more information +02:16 when you're debugging the problem. +02:18 So now it's from the cell and call it with a string. +02:31 And here you see that it entered the type error +02:33 and I get the message related to type error +02:36 and it reraised the exception and if I divide by 0, +02:42 here we don't have to crash anymore because I explicitly +02:46 handled ZeroDivision error. +02:47 Printed the message and return 0. +02:49 Great, and that concludes number 9. +02:52 Explicit is better than implicit. diff --git a/transcripts/34-refactoring/11.txt b/transcripts/34-refactoring/11.txt new file mode 100755 index 00000000..c9469000 --- /dev/null +++ b/transcripts/34-refactoring/11.txt @@ -0,0 +1,57 @@ +00:00 Alright number 10, bonus, the last refactoring item. +00:03 I'm just going to talk over some +00:05 general coding best practices +00:07 because of course Pythonic code is important +00:10 and pleasant to read but it's often also a matter +00:13 of sticking to the best of role coding practices. +00:16 For example, make sure your units of code are short. +00:20 Typically, a function or method should +00:23 be around like 10, 15 lines max. +00:26 It can be very Pythonic but if you start to +00:29 write functions of hundreds of lines of code, it's not good. +00:32 It's not easy to maintain. +00:33 So this is your 10 guidelines to make +00:35 your code more maintainable. +00:37 Some other ones I want to highlight here, +00:39 write code once duplication is a monster. +00:42 You really want to prevent having +00:44 the same code defined in multiple places. +00:47 Keep unit interfaces small, so that +00:49 means when you have functions the number +00:51 of arguments to get if you keep that to a +00:54 reasonable level, it's easier to maintain. +00:56 For example, if you have a function that +00:58 takes 10 arguments, not easy to maintain. +01:01 You could consider passing around a +01:03 class or refactoring to a class modules. +01:06 Again, that's the part of name spaces of the Zen. +01:10 It's good to have similar behaviors +01:12 or similar objects grouped together in files. +01:15 To not have one file holding 10 classes, +01:18 split those out in files, right? +01:20 Which makes it easier to reuse them in other programs. +01:23 Testing of course, you want to automate your testing +01:27 that when you make changes you have this regression +01:30 suite that you can just run in seconds +01:32 and highlight if you introduced a new failure. +01:35 Which, if your system becomes more complex, might happen. +01:38 This is an automatic way to catch that +01:41 and keep the quality of your software high. +01:43 In day 10 you learned about pytest +01:45 and how to write tests so that's really important here. +01:48 There's also a lot of habit around this +01:50 so if you get into the habit of writing clean +01:54 code, keeping to high standards, it means +01:56 that when you go into your code base, you leave +01:58 the campground cleaner than you found it, right? +02:01 I love the anology in the pragmatic programmer +02:05 book about having a small crack in +02:08 a window if I remember correctly? +02:10 Leaving that unattended leads to broken windows +02:14 and the same is true for your code base. +02:16 If you let small bad habits creep in +02:18 it might actually lead to a lot of damage in the long term. +02:21 It's really about having good habits +02:24 around writing clean code, run the PEP8 checker +02:27 on your codes, see if it's formatted properly, +02:30 the right conventions are used, etc. diff --git a/transcripts/34-refactoring/12.txt b/transcripts/34-refactoring/12.txt new file mode 100755 index 00000000..8a43b9fb --- /dev/null +++ b/transcripts/34-refactoring/12.txt @@ -0,0 +1,50 @@ +00:00 In this video I'll provide you some extra resources +00:03 to read up about refactoring +00:05 and how to make your code more Pythonic. +00:08 Read about the topic of refactoring, +00:10 we have a whole dedicated post +00:12 on the importance of refactoring code. +00:15 Errors should not pass silently, as we've seen. +00:19 So a lot of this we've discussed in this notebook, +00:22 but it shows you some more examples. +00:24 This is an important one, there's some Python mistakes +00:28 the beginner is likely to make. +00:30 And we listed them here +00:31 so you can know about them in advance. +00:34 There's string formatting we discussed +00:38 and Julian had a very nice article here. +00:41 From going from the terribly un-Pythonic method +00:44 to the nicer way. +00:45 And I think he come to the same conculsion +00:47 that you really want to use f-strings if you can, +00:50 if you're on 3.6. +00:52 There's an awesome talk about beautiful idiomatic Python, +00:55 by Raymond Hettinger. +00:57 I learned a lot from this talk, +00:59 there's a lot of good tips and tricks in it. +01:01 And we've made a summary in this blog post. +01:04 And when we talk about modules, and splitting your code, +01:08 it becomes important to know about packaging your code. +01:11 So here we have a post about how to do that +01:14 on a practical project, like her Karma Bot. +01:17 And it's not that hard, I mean basically +01:19 you have to make an init.py file +01:22 and know how to import your stuff. +01:24 That's important. +01:25 The imports mights be confusing, +01:27 but with this article it should become clearer. +01:30 So when we're talking about splitting code +01:32 and making it maintainable, know how to work with modules +01:35 and packaging is important. +01:37 And generic code quality resources, I have two. +01:41 First of all Martin Fowler's Refactoring Book, +01:44 and yes, the examples are in Java, not Python. +01:47 But it's about the general principles. +01:50 And this book really teaches you how to write better code. +01:53 It shows you very practical examples +01:56 how you can refactor bad code +01:58 into much more maintainable code. +02:00 It's a great read. +02:02 And of course, Uncle Bob's Clean Code, a classic. +02:06 And also shows you a lot of ways +02:08 to write professional quality code. diff --git a/transcripts/34-refactoring/13.txt b/transcripts/34-refactoring/13.txt new file mode 100755 index 00000000..8653dad8 --- /dev/null +++ b/transcripts/34-refactoring/13.txt @@ -0,0 +1,108 @@ +00:00 Lets go over what we've learned so far, 10 refactorings. +00:03 One. +00:05 Having a big if elif else block +00:07 is not really maintainable and looks pretty ugly. +00:10 Rather, use a dict and just look up the items. +00:14 Much better. +00:15 Next, keeping an index when looping over a sequence. +00:21 In Python, you can just use enumerate. +00:24 And look at that, you can even give it a start value of one +00:27 and you get the same result but it looks way more concise. +00:32 Next, context managers. +00:36 Don't use files like this. +00:38 If an exception gets raised, +00:39 the file handle won't be closed. +00:43 This is a bit better because the finally block +00:46 will make sure that your file handle will get closed. +00:49 Yet, much better, is to use a with statement +00:53 which automatically closes the file handle after it's done. +00:58 Four, use builtins and learn about the standard library. +01:04 For example, here we saw a pretty verbose example +01:06 how to get the maximum duration of a couple of workouts. +01:10 Not the best way. +01:12 You can just use max and min which are built into Python. +01:17 Here are two examples how you can do it in one line of code. +01:22 Tuple unpacking and named tuples. +01:25 You need to swap variables and using a temp variable? +01:28 Or what about indexing a tuple? +01:31 By indices? +01:32 Not optimal. +01:35 Use tuple unpacking. +01:37 For example, you can just swap the variables around. +01:40 No need for a temporary variable. +01:43 Or, to access to access elements in a tuple, +01:46 make an attribute thanks to a named tuple. +01:49 Now you can just print, work out that day, +01:51 work out that routine, and work out that duration. +01:54 And it's way more readable. +01:58 List comprehensions and generators. +02:00 Once you need to build up a sequence, +02:03 you don't really need to build up that list. +02:06 You can use a list comprehension. +02:08 That's way shorter. +02:09 Or use a generator which when your dataset grows, +02:13 will be more efficient. +02:16 Here's another generator to get a random day. +02:19 String formatting and concatenation. +02:21 Don't concatenate strings like this. +02:24 It's ugly and less performant. +02:28 Rather, use f-strings if you're on three dot six or later. +02:31 Otherwise, use format as a more elegant way +02:33 to format your strings. +02:36 Another thing we saw was string concatenation +02:39 when you build up your long string, don't do this. +02:41 It's not efficient. +02:43 Python will make a new string object with every operation. +02:46 You rather want to put all the string objects in a list +02:50 and just join them together. +02:52 And here you see an example of that. +02:57 PEP 8 and the Zen of Python, your new best friends. +03:00 You will refer back to them, a lot. +03:04 First of all, to understand Python a bit better, +03:07 why things are designed the way they are, +03:09 read through Zen of Python and, I guess, +03:12 print it out and put it next to your screen +03:14 because it's a very concise list +03:16 and it really explains a lot about Python. +03:20 And equally important, look at the PEP 8 style guide +03:23 and try to abide those principles +03:25 because they make for more readable code +03:27 and more consistency across code bases. +03:30 There's an awesome resource under PEP8.org +03:33 that makes it easier to understand. +03:35 And I forgot to mention in the lesson, +03:37 you probably have a shortcut under PyCharm or Vim +03:40 that you can just run PEP 8 checks +03:43 or Flake 8 upon save and catch those errors early on. +03:47 Definitely something where you want to go from average +03:51 to awesome. +03:53 Explicit is better than implicit. +03:55 That's literally quoted from the Zen. +03:57 Don't do try-except paths, like never do that. +04:00 Don't mute all the exceptions, being kind of a black hole, +04:03 beam into an obscure box, it's just bad. +04:08 Rather, be explicit in catching your exceptions. +04:11 So in this case, dividing num one by num two. +04:14 You can have a ZeroDivision error +04:16 or a type error or any other exception +04:18 and all have their specific message and handling. +04:25 Code quality overall. +04:26 Which the Software Improvement Group has nicely wrapped +04:29 into ten principles. +04:30 In short, keep your methods small, +04:32 don't pass along too many function arguments, +04:35 keep your code organized in modules or files, +04:38 and automate your testing. +04:40 Of course, there's more to it. +04:42 It's a whole study in itself. +04:44 So you can read their building maintainable software book +04:48 but I also recommend Clean Code by Uncle Bob +04:51 and Refactoring by Martin Fowler. +04:54 That's really where you want to go from coding horror +04:57 to writing awesome code. +04:59 Your code can be very Pythonic, +05:01 but if you're writing methods of like 50 lines or more, +05:03 you still want to go back +05:05 to general code quality principles. +05:07 Alright, now it's your turn. +05:09 Keep calm and code in Python. diff --git a/transcripts/34-refactoring/14.txt b/transcripts/34-refactoring/14.txt new file mode 100755 index 00000000..5842ff2a --- /dev/null +++ b/transcripts/34-refactoring/14.txt @@ -0,0 +1,29 @@ +00:01 Welcome back. +00:02 In this second and third day, +00:04 I encourage you to take our Code Challenge 30. +00:07 It's The Art of Refactoring: Improve Your Code. +00:11 And, the task of today and tomorrow is +00:13 to get some of your code, run tests +00:16 and do some refactorings, making it more Pythonic. +00:20 Also, I would recommend to start looking at Flake8, +00:23 or Pylint. +00:24 I personally use Flake8. +00:27 And integrate that into your editor. +00:29 And have a check upon each save. +00:31 Or, what I did, for example, in the vimrc, +00:34 I have a shortcut: , f. +00:36 And when I press that, +00:38 it runs Flake8 and it opens a new editor window +00:41 where it highlights my PEP8 violations. +00:44 So that way I keep my files clean during development. +00:47 Optionally, you can look at Code Challenge 35 +00:52 and use Better Code Hub +00:54 to look at your code quality overall. +00:59 Using how we use the tool +01:02 to improve a couple of our projects. +01:16 And don't forget to tweet out your progress. +01:19 You can mention Talk Python and PyBites in your tweets, +01:22 and we would love to see what refactorings you come up with, +01:25 or what your favorite Pythonic concept is +01:27 you learned from this lesson. +01:29 Alright, good luck and have fun. diff --git a/transcripts/34-refactoring/2.txt b/transcripts/34-refactoring/2.txt new file mode 100755 index 00000000..0cd70de2 --- /dev/null +++ b/transcripts/34-refactoring/2.txt @@ -0,0 +1,63 @@ +00:01 Alright, let's do this. +00:03 Let's look at 10 ways to make your code +00:06 more Pythonic. +00:07 Let's start with these typical +00:09 big if, elif, elif, elif, +00:13 elif constructs. +00:14 You must've seen code like this, right? +00:18 You have the typical workout scheme. +00:20 We check it Monday, elif Tuesday, Wednesday etc. +00:24 And if it's not a day we raise the ValueError. +00:28 Now this is pretty ugly +00:30 but it's also not extensible +00:32 in the sense that if want another +00:34 maybe combination of Thursday and Friday +00:37 to do something we have to add another elif. +00:40 What if we change this in using a dictionary. +00:43 So that we can just look up the key +00:45 and return a value? +00:46 I got this picture from the Code Complete Book +00:49 which is an awesome read about code quality. +00:51 So to refactor that, +00:53 let's start with defining a workouts dictionary. +00:58 And I'm just going to copy these in +01:00 because it's quite some typing. +01:03 Alright. +01:06 And that gives us a workout scheme. +01:09 And note that the dates are in random order +01:12 because it's a dictionary. +01:13 By the way there's another way +01:14 to make this dictionary. +01:16 And that is to use zip two sequences. +01:19 So if I define a list of days +01:21 and a list of routines, +01:23 we can do something like +01:25 workouts +01:28 equals dict of a zip +01:31 and a zip takes one or more sequences. +01:34 So days, routines +01:36 and here you can +01:38 see we have an equal dict. +01:42 Alright, now to go back +01:44 to this refactoring example. +01:46 Now with the dictionary in place +01:48 you can see how much shorter +01:50 and nicer this function looks. +01:55 So note I can now just do a get +01:58 on the dictionary. +02:00 Looking up the day, +02:01 and it gives me the routine +02:03 or None, if today was not found. +02:06 So we can explicitly check routine is None. +02:11 And raise that ValueError, +02:13 as we've seen before. +02:19 And otherwise, just return the routine. +02:26 Let's try it. +02:34 Chest and biceps. +02:37 What about +02:41 Saturday rest +02:45 and call it on nonsense. +02:51 Yes I get a ValueError +02:52 because nonsense is not a day. +02:54 Alright, that's our first refactoring. +02:56 And let's look at counting inside a loop next. diff --git a/transcripts/34-refactoring/3.txt b/transcripts/34-refactoring/3.txt new file mode 100755 index 00000000..af86736f --- /dev/null +++ b/transcripts/34-refactoring/3.txt @@ -0,0 +1,33 @@ +00:00 Next up, counting inside a loop. +00:03 So sometimes you want to keep track of an index +00:06 when you loop over a sequence, +00:07 and when you come from C or another language +00:11 you would typically do something like this. +00:14 Let's define a list of days +00:16 and let's loop through them showing the day +00:19 prepended by the number. +00:26 Alright, so that's straightforward. +00:30 Now, and this is correct, right? +00:31 I mean you can do it like this, +00:33 it's all 100% correct. +00:35 But the more idiomatic or Pythonic way +00:38 is to use enumerate. +00:40 And a way to do it is to wrap your sequence in enumerate, +00:46 which returns the index and the item +00:48 in the sequence on every loop. +00:49 So I can just, +00:52 now, +00:53 print those, +00:57 and it should give me, oops, +00:58 obviously, I should not hard code days. +01:02 So I'm using f-strings by the way because I'm on +01:05 Python 3.6. +01:06 And yes, this gives me the same result, +01:08 and there's even a nice little trick with enumerate, +01:12 which is, you can give it a starting point. +01:14 So I can just copy this, +01:17 and again give enumerate a second argument of 1. +01:20 So I want to start the counter at 1, +01:23 and then I don't have to do this menu +01:25 plus 1 inside the loop. +01:26 And that gives me the same result. diff --git a/transcripts/34-refactoring/4.txt b/transcripts/34-refactoring/4.txt new file mode 100755 index 00000000..a066058b --- /dev/null +++ b/transcripts/34-refactoring/4.txt @@ -0,0 +1,51 @@ +00:00 Right, next up is the with statement. +00:02 You all have worked with files by now, I suppose. +00:05 The way to open and close files is like this. +00:12 That's fine, that's not optimal +00:14 but if an exception occurs between the open +00:17 and close statements. +00:18 Let's demo that here. +00:20 So we write hello and for some reason an exception happens. +00:25 The problem here is that the file +00:27 handle called f stayed open. +00:29 So if I check now for is f closed? +00:33 False, it's still open. +00:34 So it's leaking resources into your program +00:37 which is a problem, right? +00:38 One way to avoid this is to use try +00:40 and use except finally block. +00:41 Try an operation, you catch the exception, if there's one +00:44 and the finally block always execute, +00:47 so you could put f.close in +00:48 there to make sure it always closes, right? +00:51 You would write something like this. +00:56 Let's just trigger an exception. +00:58 I divide by zero which is going to +01:00 give me a ZeroDivision error. +01:03 Let's catch that here. +01:12 Finally, I will always close my file handle +01:17 and I do that here. +01:19 Open the file, write something, +01:21 trigger ZeroDivision error, catch it +01:23 and either working or failing, I always get f.close. +01:27 Let's see if the file handle now is closed. +01:31 And indeed it is closed. +01:32 That's cool, right? +01:33 This is much better code, but there's even +01:36 a better, more pathonic way to do the above +01:38 and it's to use a context manager or the with statement. +01:42 I can rewrite the previous code as with open +01:50 This is the same code and the nice thing +01:52 about with is once you go out of the block +01:54 it auto-closes your resource. +01:57 In this case the file handle f. +01:58 This raises the exception as we told it to do. +02:01 Let's see if f is closed. +02:06 And True. +02:07 Look at that. +02:08 I mean although I like try except finally, +02:10 it's definitely a good feature. +02:13 This is just shorter, more pathonic way to do it. +02:16 Use with statements or context manager if +02:19 you have to deal with resources that +02:21 have some sort of closure at the end. diff --git a/transcripts/34-refactoring/5.txt b/transcripts/34-refactoring/5.txt new file mode 100755 index 00000000..6df5554e --- /dev/null +++ b/transcripts/34-refactoring/5.txt @@ -0,0 +1,64 @@ +00:00 Right. +00:01 Next up, use built in, learn the standard library. +00:04 There's some very powerful built in functions +00:07 you can use that save you a lot of code. +00:09 For example, you run the range of numbers. +00:11 Well instead of for e in, or do this classical for loop. +00:16 I'm not even sure how to do it anymore. +00:22 Now, in Python you can just numbers equals range +00:26 1 11 and the first. +00:27 The start is inclusive, and the end is exclusive. +00:31 So just issue a numbers range of 1 through 11 +00:35 which doesn't say much but if I convert that +00:39 into a list there you go, 1 to 10. +00:41 And I didn't have to go through a for loop +00:43 specifying end boundary, etc. +00:46 So very nice. +00:48 What about sum? +00:50 Let's sum up those numbers. +00:56 But in Python, you can just use sum, +00:59 and look at that. +01:02 It's easier, and less code, and saves you time. +01:05 Let's look at max and min. +01:07 So let's create some data. +01:10 Again to stay at the gym, +01:11 I have routines and I have timings. +01:13 Let's make a dictionary. +01:15 Workout times. +01:20 Now see before I can use the zip with routines +01:23 and timings and put that into the dict constructor +01:29 to make a dictionary. +01:33 So here are the workouts, and the times +01:36 and minutes they should take. +01:38 What I want to do next is to get the workout +01:40 that takes most time and less time. +01:43 Let's do it in the proposed way, +01:46 if you wouldn't know about max. +02:02 Yeah, legs was 55 minutes which was easily visible here. +02:06 Now let's see the max building in action, +02:10 and you will see that we can do this in one line of code. +02:14 Workout times. +02:16 items. +02:18 Again items gets me a tuple, a list of tuples +02:22 of key value, in this case routine and timing. +02:25 Then I can use the key optional arguments +02:27 to give it a or callable or lambda. +02:29 In the lambda, I'm just saying what I want to sort 'em +02:33 which is the value, the timing, the minutes. +02:35 So this is basically telling max, +02:37 that I want to get the maximum value based on the value +02:41 which in this case is minutes. +02:43 There you go. +02:44 Boom. +02:45 That returns a tuple of key value. +02:46 Look at that. +02:47 Compare one, two, three, four, five, six, seven, +02:50 eight lines of code with one line of code +02:52 accomplishing exactly the same thing. +02:54 You can use min in the same way. +02:57 It should get me the core workout of 30 minutes. +03:01 I mean it takes the same inner logic, +03:04 but as it is min it takes the min value. +03:08 Look at that. +03:09 Less code. +03:10 Leveraging the built in functions from the standard library. diff --git a/transcripts/34-refactoring/6.txt b/transcripts/34-refactoring/6.txt new file mode 100755 index 00000000..b7bcba09 --- /dev/null +++ b/transcripts/34-refactoring/6.txt @@ -0,0 +1,62 @@ +00:00 Next up, refactoring 5. +00:02 Tuple unpacking and intervals. +00:04 So, what if you need to do a swap of variables? +00:07 We got a and b +00:10 are 1 and 2. +00:12 In other language you have to keep +00:14 a temporary variable so you store a into tmp +00:18 then you can override, a with b. +00:23 Then you can put the temporary variable +00:24 back into b and now they're swapped. +00:27 Right, so a now became 2 and b became 1. +00:31 Well in Python, it just takes one line of code. +00:35 Let's restore them. +00:39 Let's just do +00:43 just swap them like this. +00:46 And there you go. +00:48 No temporary variable needed. +00:49 So that's step one, unpacking in action. +00:51 Another example of that is the +00:53 earlier max function returning two values. +00:57 Here we had legs 55 minutes, so you can assign them +01:02 or tuple unpack them by assigning them to two variables. +01:06 So in this case, routine and minutes. +01:11 There you go. +01:12 A function that returns two values can +01:15 just be unpacked by specifying +01:18 an equal number of variables before the equal sign. +01:21 In this case, routine and minutes. +01:23 N tuples, I will just do a quick demo +01:26 because I already discussed them +01:28 in more detail in a previous lesson. +01:34 That's not really saying that much +01:35 because if I have to refer to them +01:37 I would have to access them on +01:43 day, what is that? +01:45 The second? +01:46 Okay, so it's zero base so I do 1. +01:49 I train, what do I train? +01:52 Workout. +01:55 Where's my training? +01:56 Okay, it's the first element at 0. +02:02 Okay, at least I got that right. +02:06 Okay, so if you do it that with n tuple. +02:15 Let's create one with workout +02:20 equals workout with uppercase, which is the n tuple. +02:24 I always uppercase, unless because I see them kind +02:27 of as classes without behaviors +02:29 and classes you uppercase in Python. +02:31 You can either give them an args list. +02:45 You can also do that more verbose +02:49 with a keyword argument list. +02:56 Now the print statement becomes a lot cleaner +02:59 because I don't have to think about indexes. +03:01 I can just do workout.day, +03:07 workout.routine, +03:11 workout.duration, and it's much easier to type. +03:17 It's much clearer to the reader of your code +03:19 what you're actually referring to +03:21 and hence you'll probably make less mistakes. +03:24 N tuples, they're very easy to define and use. +03:27 It makes your code much more readable. +03:29 I would encourage you to use them whenever you can. diff --git a/transcripts/34-refactoring/7.txt b/transcripts/34-refactoring/7.txt new file mode 100755 index 00000000..eb3d6584 --- /dev/null +++ b/transcripts/34-refactoring/7.txt @@ -0,0 +1,56 @@ +00:00 Alright. List comprehension generators. +00:02 I did a whole class on this topic. +00:05 So, I just want to quickly recap what we learned here. +00:08 Because it should really be mentioned in refactoring. +00:12 Because it's one of those candidates +00:14 to make your code more readable, and Pythonic. +00:16 Let's get the days starting with a T and let's do +00:20 the old style keeping a list. +00:29 There you go, Tuesday and Thursday. +00:31 And again, this is fine, right? +00:32 However, you can write this in a +00:34 more concise way. +00:35 Let's use a list comprehension. +00:42 So look at that, one, two, three, four, five lines +00:45 of code reduced to one. +00:47 Awesome. +00:48 Next, let's do a quick generator example. +00:51 So, just to recap, let's make a random day generator. +00:55 So, we need some random function, and we're going +00:59 to use choice. +01:03 So while True initiates an infinite look, +01:06 I'm just going to yield the count, +01:09 and a random choice of days. +01:12 Let's initiate that generator. +01:15 I call it daysgen. +01:22 And you can see that that's the generator object. +01:24 And a generator I can call next on. +01:31 And it gives me a random day. +01:34 Lets call it again, and I get Monday again, +01:40 Tuesday, Saturday. +01:43 So it's random. Okay? +01:44 I can use it in a loop. +01:48 So let's get five more days. +01:52 There you go. +01:53 Remember that the index was at four, so now +01:55 it's five, six, seven, eight, nine random days. +01:58 And then the last nice thing to know about generators +02:01 is you can use itertools islice. +02:08 And that lets you get a slice of the generator. +02:10 Because if I now put this generator in a list, +02:13 my system would hang because this never ends. +02:16 It keeps on adding values, consuming memory, +02:19 and there's no way to stop. +02:21 There's not a StopIteration, or a stop clause in here. +02:24 islice is nice. +02:26 It can just get a slice of the generator. +02:28 Just like you do a normal slice on your list, +02:32 like first 20 items. +02:33 This is similar but works for a generator. +02:36 So, let's take an islice of daysgen, +02:39 and I want to start it at position 100 +02:42 and stop it at 105. +02:43 And then it's safe to put this in a list, +02:45 because this is a finite sequence. +02:48 And there you go. +02:50 And that wraps up list comprehensions and generators. diff --git a/transcripts/34-refactoring/8.txt b/transcripts/34-refactoring/8.txt new file mode 100755 index 00000000..c0112e0a --- /dev/null +++ b/transcripts/34-refactoring/8.txt @@ -0,0 +1,66 @@ +00:00 Right, next stop: +00:01 string formatting and concatenation. +00:03 And pretty important because you will be doing this +00:05 a lot in your code. It's funny the other day +00:07 I bought some clay with my daughter +00:09 and we were making python figures +00:12 and obviously we were very bad at it +00:14 and then we got better. And I found it a nice analogy +00:18 with string formatting. As the Zen says there's +00:20 preferably one best way to do it +00:22 and there are various ways to do string formatting +00:25 but in the end there is a best way +00:28 which is now the f-string in 3.6 +00:30 but if you're not on 3.6 then at least you can use format +00:33 that's basically the gist for me of doing formatting +00:36 the right way. But let's also demo that with some code +00:39 And I hope you agree that those last two figures were +00:41 definitely better than the first. +00:43 Alright, total hours +00:45 is six +00:47 print. +00:48 the course +00:50 takes +00:51 plus total hours +00:57 to complete. Okay a type error, not good +01:01 so I cannot add an 'int' to a 'string' +01:03 and vice versa. So I need to make this a string +01:08 and then it works. But yeah, it's not the best way to do it. +01:12 And the best way is using f-strings in Python 3.6 +01:20 and look at that I can just embed the variable. +01:23 This can even take operations, its pretty awesome +01:28 but yeah, this is faster and it's much easier to read +01:32 and I don't have to concatenate +01:33 or even doing any type conversion. +01:35 So go with f-strings, but maybe you're not on 3.6 +01:38 for some reason and then you can use format. +01:41 So you would write this as +01:46 in the same curly braces +01:52 and then you use format on that string +01:55 and give it a variable. And you don't have to worry +01:58 about type conversion because format is, +02:00 sorry, not using f-strings anymore +02:04 format is smart enough to convert this 'int' into a 'string' +02:07 or whatever is needed to make this work. +02:09 And then last note about concatenation +02:12 so as said before, building up a string like this is +02:16 not the way, and its slower +02:18 if you're working with a lot of data +02:22 and how true is that, right? +02:24 Every day you get to write python is a happy day +02:27 but, it's not happy for your performance +02:31 and readability I would say, it's not really looking nice +02:34 in this case you really want to use join +02:37 so you want to really have your strings in a sequence +02:39 or a list, and then just join them together +02:42 and you can specify what to join on +02:46 and there you go, here's my same string as above +02:49 but using the Pythonic way of joining +02:52 and, you know, you can do what you want +02:54 you can also join it on dash, even better +02:57 I can leave off the spaces here +03:01 and give join a space. +03:03 So I'm going from multiple spaces +03:05 or worry about spacing in the first place +03:07 by doing that in one place at the join level +03:10 so much better. diff --git a/transcripts/34-refactoring/9.txt b/transcripts/34-refactoring/9.txt new file mode 100755 index 00000000..0823d029 --- /dev/null +++ b/transcripts/34-refactoring/9.txt @@ -0,0 +1,20 @@ +00:00 Number 8. +00:01 PEP 8 and the Zen of Python. +00:03 Any Python developer should become familiar +00:06 with PEP 8 and use it in their code. +00:09 So here's the Style Guide for Python +00:11 and you really should read this end-to-end +00:14 and make a habit of formatting your code +00:16 in the proper way, using variable names with underscore, +00:19 so all these conventions. +00:20 There's even a recent initiative, pep8.org, +00:24 which should make this even easier to digest. +00:26 And it's really nicely formatted +00:28 and gives you some more context. +00:31 And, of course, if you do import this from your Python REPL, +00:35 you get the Zen of Python. +00:36 And the more you write Python, +00:38 the more you see how this applies +00:40 to the language and it's design. +00:42 It's really where you start to better understand +00:45 and appreciate the language. diff --git a/transcripts/37-csv_data/1.txt b/transcripts/37-csv_data/1.txt new file mode 100755 index 00000000..084cbfd9 --- /dev/null +++ b/transcripts/37-csv_data/1.txt @@ -0,0 +1,14 @@ +00:00 Hello, it's Michael Kennedy, +00:01 and I'm going to be your guide for day 37, 38, and 39. +00:06 And this time we're going to work with structured data +00:10 called CSV files. +00:12 So anything that can be stored in something like Excel +00:15 or Tabular, data like that that you might work with +00:19 in some kind of Excel spreadsheet. +00:21 Much of the data you'll find out +00:23 on the internet lives in this form, +00:25 and we're going to find some really, +00:27 really interesting data sets, +00:28 and we're going to build some programs to ask +00:30 and answer some pretty powerful questions. +00:34 Let's get started. diff --git a/transcripts/37-csv_data/10.txt b/transcripts/37-csv_data/10.txt new file mode 100755 index 00000000..44e64ce9 --- /dev/null +++ b/transcripts/37-csv_data/10.txt @@ -0,0 +1,44 @@ +00:00 Now that you know all about working with CSVs, +00:03 it's time to do some data journalism. +00:05 You're going to come up with an amazing question, +00:07 and find a data set, and answer some questions about it. +00:10 So, let's get you the steps here. +00:12 First day is, you're basically done with the first day. +00:15 It's more or less to watch the videos, +00:16 but the final thing to do, I hope you're inspired, +00:19 is to head over to the GitHub repo, +00:21 fivethirtyeight/data. +00:23 And sort of look through there +00:24 and find one of the data sets that looks interesting to you, +00:28 and think about answering some questions. +00:30 So, here's what an example of that may look like. +00:33 Alright, so you might want to write these three things down. +00:35 So, here's the goal, is, I found, +00:38 maybe I should put data set first in terms of the order, +00:41 but I found this data set on +00:43 where you live in the United States +00:45 you eat different things on the U.S. holiday Thanksgiving. +00:50 So, if you live in the American South, +00:52 you'd have one type of thing, +00:53 if you live in the North, in like the Northwest, +00:56 you eat something different. +00:58 It also varies by income, so pretty interesting. +01:01 So, you go over here and the goal is going to be to predict, +01:05 you know, ask two questions of the user, +01:06 and then predict what they have for Thanksgiving. +01:09 So, you ask them where do they live +01:11 and how much money does their family make, +01:13 and you're going to use this data set to basically, +01:17 generate a set of things they're going to eat, right. +01:20 You're going to eat turkey, and stuffing, +01:22 and mashed potatoes, and things like that. +01:24 And they answer the questions differently, +01:27 that menu that you provide to them might be different. +01:30 So, here's sort of the steps that you need +01:33 to do for those few things, alright. +01:35 I think that's going to be fun. +01:36 You don't write the program on day one. +01:37 You've already watched all those videos +01:39 and listened to me talk, +01:40 so you're goal is to just find the data set +01:42 and have a question. diff --git a/transcripts/37-csv_data/11.txt b/transcripts/37-csv_data/11.txt new file mode 100755 index 00000000..bee84e55 --- /dev/null +++ b/transcripts/37-csv_data/11.txt @@ -0,0 +1,5 @@ +00:00 Day 2 or Day 38, if you're adding them, +00:03 is to actually create the skeleton of that program +00:07 and just open a CSV reader to that file. +00:11 If you can just load it up and just print out the rows, +00:14 you're done with day 2. diff --git a/transcripts/37-csv_data/12.txt b/transcripts/37-csv_data/12.txt new file mode 100755 index 00000000..c49ba5d8 --- /dev/null +++ b/transcripts/37-csv_data/12.txt @@ -0,0 +1,13 @@ +00:00 And on Day 3 you're going to want to +00:02 actually work with the data. +00:04 So you need to transform it into +00:05 a way that you can work with. +00:06 If you need to work with that particular field, +00:09 I think my Thanksgiving example might not actually need it +00:12 because of the way that that works. +00:14 Depending on your data you might have to, you know, +00:16 sort of upgrade it to the numbers or numbers +00:19 and then, you know, ask the user questions +00:21 and try to basically provide an answer based on the data. +00:25 When you're done, share what you learned +00:27 as always, and thanks, hopefully you enjoyed this section. diff --git a/transcripts/37-csv_data/2.txt b/transcripts/37-csv_data/2.txt new file mode 100755 index 00000000..4fe65841 --- /dev/null +++ b/transcripts/37-csv_data/2.txt @@ -0,0 +1,54 @@ +00:00 Let's talk about our data sets real quickly. +00:02 You're probably familiar with CSV data, +00:04 but just in case you're not, it looks like this. +00:07 It's a plain text file and there's a set of headers +00:11 across the top that tell you what each column is. +00:13 So here we can see we've got data, +00:15 an actual mean temperature, an actual minimum temperature, +00:18 and an actual maximum temperature. +00:21 And then we have a bunch of columns +00:22 that correspond to that data. +00:25 Now I told you we're going to work with +00:26 some interesting data sets and it's true, +00:28 I found a good collection here for us to play with. +00:32 Now you may be familiar with a place called FiveThirtyEight. +00:36 It's like a data-driven journalistic news site +00:41 where they gather up a bunch of data +00:43 and they use it to write articles +00:45 and do investigative journalism type things. +00:48 And it turns out every article they have, +00:51 the data that they use to derive those conclusions +00:54 is available online on GitHub, so that's pretty awesome. +01:00 So over at github.com/fivethirtyeight/data, +01:03 that is where we're going to be working +01:05 for the next three days. +01:08 All right, so let's jump over to my web browser here +01:10 and we'll just have a quick look through all the data. +01:12 I told you there's a lot, +01:13 look at the size of that scroll bar. +01:14 There's a ton of options here. +01:15 So let's skip down past all the folders +01:17 and just go to this section. +01:19 So here you can see all of the articles +01:21 written by FiveThirtyEight and then +01:23 the corresponding data that goes with it. +01:28 So let's just grab one here, American Chess is Great Again, +01:31 and if we come back, click on it and you can see +01:32 here's the actual article that they wrote about, +01:35 and you can see here's the graphs +01:37 that they drew based on the data and so on. +01:40 But here is the actual data, so you can come over here +01:43 and it actually describes what it is and so on. +01:47 If you click on it, you can see here's all the data +01:50 that they were using to make these conclusions. +01:53 So what we're going to do in this section of the course +01:56 is we're going to take one set of CSV files +01:59 and use that for our demos +02:00 and ask and answer interesting questions. +02:03 And then for the next three days afterwards, +02:05 you'll be turned loose to build +02:07 your own investigative journalism app. +02:10 You'll choose one of these CSV files +02:12 and come up with a set of questions, +02:13 and it's going to be a ton of fun +02:14 so I hope you're ready to get started on that. diff --git a/transcripts/37-csv_data/3.txt b/transcripts/37-csv_data/3.txt new file mode 100755 index 00000000..0fd16301 --- /dev/null +++ b/transcripts/37-csv_data/3.txt @@ -0,0 +1,26 @@ +00:00 For the learning section of today, +00:01 what we're going to do is we're going to write an app +00:03 that takes a CSV file, and answers a +00:05 set of questions around it. +00:08 The data that we're going to use is +00:10 from the 538 data set, data/us-weather-history. +00:16 It's not very clear what this means, +00:17 but this is the weather history from different cities. +00:20 You can even actually see here's the +00:22 the data that they, +00:24 the code that they used to visualize it. +00:26 Here's the web scraping, they go to Wunderground +00:29 which is the weather site to get the data, pretty awesome. +00:32 So we're going to use this data set, +00:33 this is the Seattle weather data +00:36 for 2014 and 2015, I believe. +00:39 Yeah, there's the dates right there. +00:41 This should look familiar, right? +00:42 Date, actual mean, actual man, actual temp and so on. +00:45 So we're going to take this data and +00:47 we're going to work with it. +00:48 Now, let's make sure we start with the raw, +00:51 we do not want GitHub html, you want the raw. +00:54 So we're going to save this. +00:55 And I'll just save this as seattle.csv. +00:59 Now let's go write some code to work with this data file. diff --git a/transcripts/37-csv_data/4.txt b/transcripts/37-csv_data/4.txt new file mode 100755 index 00000000..c09013e7 --- /dev/null +++ b/transcripts/37-csv_data/4.txt @@ -0,0 +1,85 @@ +00:00 Alright let's create our little application for our demo +00:03 that will let us work with the CSV data. +00:05 I'm over here in the actual GitHub repository +00:09 and we're going to create our application here. +00:12 Now I want to create a virtual environment in here +00:15 before we get started +00:16 and maybe I'll even name it venv +00:20 So, I'm going to go to that same folder in my terminal here +00:24 and I'm going to run the command +00:26 to create the virtual environment +00:27 before I open this in PyCharm. +00:29 Alright. +00:30 If you were going to continue working in the terminal here +00:32 and you wanted to say, run Python commands +00:34 you would do this on Mac and that would activate it, +00:39 and if you were on Windows you would just +00:41 say venv\scripts\activate.bat like that. +00:46 Either way, I guess you would use backslashes wouldn't you? +00:48 But, until you get started here +00:50 I'm not going to worry about this because +00:51 I'm going to work in PyCharm and so +00:53 if I throw this over here or on Windows or Linux +00:56 say file, open directory it'll open this up +00:59 and I'll go ahead and let it add the GitHub root +01:02 doesn't matter so much for you guys +01:03 but I'm going to of course check all the stuff in. +01:06 Now, we can just go to our virtual environment +01:08 and say let's just ignore this, +01:10 it doesn't really matter +01:12 and we're just going to get started like we have been +01:14 by creating a program.py +01:17 this is going to be our little way to explore, +01:19 and this is going to be the top level thing +01:21 that we want to work with. +01:23 So, I'm just going to print out kind of the basic structure +01:27 of what we're going to do in terms of working with this data +01:30 and then we'll actually go write the code to implement that. +01:34 So, I'm going to define a main method here +01:37 and just for a minute I'm going to do the pass. +01:40 We'll do this little structure that is very common in Python +01:42 that says only directly execute this code +01:45 if it's being invoked directly, +01:48 if it's being used as a library. +01:50 Don't run main just leave the other functions here. +01:52 So this is the common pattern +01:53 and we're going to print out a few things. +01:55 We'll print out a little header value. +01:57 Alright, so weather research for Seattle 2014 to 2015 +02:00 and we'll just put a blank line like that. +02:03 And then we're going to need to initialize the data. +02:12 Spelling is hard that's why PyCharm can fix it for us. +02:15 Okay, so that's going to be great +02:17 and once we get down here, +02:18 we want to answer the questions. +02:20 What, say, the hottest five days? +02:24 And then we'll say to do show the days. +02:28 And we're going to do this for a couple of different ways. +02:31 I'm going to come in here and I want to answer +02:32 the coldest five days and the wettest five days. +02:41 So, this is our goal is to run +02:43 basically answer these questions +02:45 and we're going to do that by reading that CSV file. +02:48 Before we do, let's just really quickly run +02:50 and make sure this works. +02:52 Hey, it tells us basically here are the days, +02:55 but doesn't yet show them to us. +02:57 So we're going to need to get the data. +02:59 Let me actually make a little folder to organize that here. +03:02 I'll call this data. +03:04 And into that data file, I'm going to drop +03:05 this thing we downloaded in the previous video. +03:08 Drop that there. +03:09 PyCharm will put it over in the right place +03:12 and we can look. +03:13 Does it look correct? +03:14 Yes. +03:15 Apparently PyCharm can help out with CSV files. +03:18 I don't really care. +03:20 But I do care about what the header values are going to be. +03:22 We're going to work with that later. +03:24 So maybe go ahead and copy that preemptively. +03:27 Now, I think we're pretty much ready to write the code +03:31 that is going to read that file +03:34 and then provide the data +03:35 so we can answer these questions here. diff --git a/transcripts/37-csv_data/5.txt b/transcripts/37-csv_data/5.txt new file mode 100755 index 00000000..00a69e05 --- /dev/null +++ b/transcripts/37-csv_data/5.txt @@ -0,0 +1,99 @@ +00:00 Our goal is to read that CSV file. +00:03 We technically could do that right here, +00:05 but I would like one part of my application to just be +00:08 dedicated to reading, and parsing, +00:10 and working with the data. +00:11 And another to do with this, kind of, UI business. +00:13 So let's make another Python file called research, +00:17 and we'll put that at the top of level of our program here. +00:20 Now we're going to want to work with the CSV file. +00:23 So let's come over here and define a function called init. +00:27 And this is going to basically load up the data, +00:30 the data file and then get it into memory +00:34 and we can answer questions about it later. +00:36 We're going to have this global shared piece of data like this, +00:40 and we're just going to make that a list. +00:44 So we're going to initialize this, and now what we need to do +00:46 is we need to determine this file. +00:48 It would be very tempting to say file +00:50 name is just +00:52 ./data/seattle.csv, +00:57 or back slashes if you're on windows. +01:00 Now, be careful, backslashes and strings +01:02 don't mean quite what you think they mean. +01:04 This, if you said something like \t, +01:06 notice how it changed colors, or \n. +01:08 Backslash and strings is used as a, +01:11 what's called an escape character, +01:13 and it means \n actually stands for a return, +01:16 and \t for a tab and so on. +01:18 You can use double backslashes to say, +01:21 no no, I just mean the backslash. +01:22 All right, so be a little careful there. +01:24 But, even so, that withstanding, +01:27 this, and the spelling as well, +01:30 this is not going to be working out really well. +01:32 It'll work if we'd run it actually, +01:35 but only if the working directory is this folder. +01:38 If you run it from the command prompt, +01:40 or terminal, and you're somewhere else, +01:42 this isn't going to work. +01:43 So we're going to take a slightly more complicated step +01:46 to determine this location. +01:49 So we're going to come up here and import the os module, +01:52 which let's us ask cool questions. +01:54 And we'll say folder, let's call it basefolder, +01:59 = os.path.dirname of where. +02:04 Well, one of the things we have to work with that's +02:07 in variant is where this file is located. +02:10 And what we want to do is go to where this file is +02:12 located, go into the data folder, and go here. +02:14 And there's a way to always get to that in any Python +02:16 file just say dunder file like this. +02:18 So, this is a file, +02:20 dir name, we'll drop the file part, +02:22 and just keep the directory, +02:23 and then we need to say filename, here is +02:26 actually going to be os.path.join, +02:30 and we want to put together the basefolder and data, +02:33 no slashes, and seattle.csv, okay? +02:40 So this will do that in a platform independent, +02:44 location independent way. +02:45 And it's really, you know, not that much work +02:48 above what we were maybe going to type in the first place. +02:50 So let's just open this, we'll use a with block, +02:54 we'll say open file name, and we can give it a read, +02:56 and one can even say encoding=UTF-8, +03:03 that's the safest guess, and we'll say as fin, +03:05 that'll name our variable. +03:06 Let's just do a quick print, +03:07 forget CSV for a minute, we just want to see what's in here. +03:10 So we can say, read lines, or just read, +03:14 look at all the text. +03:15 So now, let's call this function, +03:17 it's not done, it's not even close, it doesn't do +03:20 anything with the data, it just pulls it in as text, +03:22 but it's going to verify this one aspect of what we've done, +03:24 reading the file. +03:26 So let's go over here, and let's, before we do any of this, +03:30 let's go do our initialization. +03:32 So we want to go to the very top, say import research, +03:36 all right, and then down here we can say research. +03:39 forget data, we're not going to work with that directly, +03:41 but we'll say init. +03:42 Now, let's run this and see what we get. +03:45 Boom, we saw a whole bunch +03:48 of CSV data scream by, just like that. +03:51 How cool is this? +03:52 So this is totally working well. +03:54 We've got our research, it can find the file, +03:57 and I can tell you it will find it from +03:59 anywhere on the computer. +04:01 It doesn't matter, it's going to just use the location +04:04 relative from here to there, based +04:06 on this thing that we did. +04:07 All right, so that's how we load the file up +04:10 and get a file stream, that's one half of the problem. +04:13 The other half is to take that giant string +04:15 and convert it into data we can work with. +04:18 That's the next step. diff --git a/transcripts/37-csv_data/6.txt b/transcripts/37-csv_data/6.txt new file mode 100755 index 00000000..6b059342 --- /dev/null +++ b/transcripts/37-csv_data/6.txt @@ -0,0 +1,59 @@ +00:00 We were able to read our file as text, +00:02 and that gets us really close, +00:04 but it doesn't really let us work with it. +00:05 And now, technically, we could do, +00:07 like a crazy bunch of string operations and parse this. +00:10 But, it turns out it is entirely unnecessary. +00:13 So we can import the csv module. +00:15 This is a built in in Python. +00:17 I'll call this reader, and I'll say csv.DictReader. +00:21 There's a couple of kind if readers. +00:23 DictReader is the best one. +00:25 And you pass it this file stream. +00:27 And what this thing is, is it is something that +00:29 you can loop over, and every time you loop over it, +00:33 you get the values out, okay. +00:35 So, let's do just something really, really quick, and, +00:39 just for row in reader, and just so +00:42 you can see it working I'll print out, let's say. +00:47 So if we run this, +00:48 looks like it's working, +00:49 and what we get is something called +00:51 an Ordered Dictionary. +00:52 Doesn't matter that it's ordered, +00:53 all that matters to us I can ask it for +00:55 the date, or the actual mean temperatures. +00:57 Like, if just want to print out this part, +00:59 I can go, because this is a dictionary, +01:03 let's comment that out, I can just print here, +01:08 row.get the actual mean temperature. +01:13 Great, it looks like we already got a lot of data, +01:15 and we could work with it. +01:16 There's one super, super challenging problem, though. +01:20 If I really want to work with this data, +01:23 you very likely want to ask, +01:25 is this thing less than that other thing, right. +01:28 Is this temperature less than that? +01:29 So we can answer our questions. +01:31 What's the hottest day, what's the coldest day? +01:32 Things like this. +01:34 So, let's print out the type, right. +01:36 This is going to tell us the actual underlying data type here. +01:40 Strings, everything that comes back +01:42 from CSV files are strings. +01:43 Even if they look like dates, or they look like, +01:46 you know, numbers or something. +01:48 And so in order to actually work with these, +01:51 we're going to have to do something a little bit different. +01:55 So, we're going to actually write a function +01:57 that takes this sort of raw row that we have here, +02:02 and instead of just saying we're going to store the text, +02:07 we're actually going to convert the numbers to numbers, +02:09 the dates to dates, things like that. +02:10 So we can actually answer questions like, +02:12 is this number less than that number? +02:15 Alright, the string less than or greater than +02:17 is not the same thing +02:18 as numerical less than or greater than, right? +02:20 Like, 100 is less than 7, for example, +02:25 if those were strings, but obviously not as number. diff --git a/transcripts/37-csv_data/7.txt b/transcripts/37-csv_data/7.txt new file mode 100755 index 00000000..240d4c10 --- /dev/null +++ b/transcripts/37-csv_data/7.txt @@ -0,0 +1,161 @@ +00:00 Now, we've actually parsed the CSV file +00:02 and we're ready to go. +00:03 But we saw that everything that comes back +00:06 is actually just a bunch of strings. +00:09 And we can't really do data analysis. +00:11 When you want to do numerical operations +00:13 or date time operations. +00:14 But the data type is a string. +00:17 So what we have to do is that we need +00:19 to write a function that will take one of these rows. +00:21 And kind of upgrade it to its types +00:23 that we know exists in there. +00:25 So let's go down here, +00:26 we're going to write a function called parse_row +00:30 And we'll give it a row +00:32 and it's going to return some kind of item. +00:35 So, first of all, let's write one +00:37 that just actually upgrades the values. +00:39 And we'll do one more step beyond that. +00:42 So, we know, if we look over here. +00:45 That we have a date, we have an actual mean +00:48 and all of these things. +00:50 So, let's start by coming over here +00:52 and we're going to upgrade the rows date. +00:56 Let's upgrade the temperature, it's a little simpler, first. +00:58 So we'll come over here and we'll say actual mean temp, +01:02 that's from the header. +01:05 Now, see, this value is actually the result +01:08 of converting it to an integer. +01:11 And we also have the actual min temp. +01:13 Now, you want to be careful here, of course +01:17 that you don't cross those over +01:18 but also, that you're using integers with the integers +01:21 and the floats where there are floats and so on. +01:24 Now, this is not fun to watch me type this out for each one, +01:27 and there's a lot of it, +01:28 it's quite tedious so let me write this out. +01:30 And then we'll come back to it. +01:35 Alright, here we are. So now we've taken everything that we found in the header +01:39 and we've done a conversion from strings to numbers. +01:42 Sometimes those are integers, sometimes those are floats +01:44 we paid careful attention to when that was the case. +01:46 If you're unsure just use floats +01:48 and then we're going to return this row +01:52 but by getting the value out +01:53 and then replacing the value with the integers +01:56 we should be able to come over here and print this. +01:57 So if I do this and, kind of what we did before +02:00 we do a little type of that. +02:02 We print those. +02:03 Now, if I write on it, +02:04 Actually... Excuse me if I do this parse_row. +02:08 And we kind of upgrade this row here +02:11 And notice these are now integers +02:14 if I change the column to the actual precipitation +02:19 you'll see these are floats. +02:22 Here they are. +02:23 Those look like floats, don't they? +02:25 Great, so we've upgraded this +02:28 and, it's already in a really good shape. +02:31 There's one other thing I want to do to make it nicer. +02:34 And that is to use a data type that's built into Python +02:38 that helps you work directly with sort of these values +02:43 in a really simple way, and it's called a namedtuple. +02:46 So let's go to the top here and we'll say +02:49 import, collections +02:51 and inside Collections there's this thing called +02:53 the namedtuple. +02:54 So we can actually define another type +02:58 something better than this basic dictionary +03:00 which is cumbersome to work with. +03:01 You got to do the .get, the value might not be there, +03:04 things like that, so let's define a record, +03:07 like a weather record, and we're going to +03:09 do that by saying, collections.namedtuple. +03:11 Now, you give it two pieces of information. +03:14 One, you... +03:17 You basically replicate this, so you tell it, +03:20 I'm calling you this, but, your name is what I'm calling you +03:24 it's sort of so it knows what its name is. +03:27 And then the next thing you give it is simply this +03:31 giant thing up here, okay, like so. +03:35 Now, PyCharm says, whoa whoa whoa, what're you doing, +03:37 that's like line, or column 200, this is insane. +03:40 So why don't you do some line wrappings, +03:43 just so people can read what's going on, right. +03:45 And this Python will turn that back into one long string +03:49 because there's no comma separating it. +03:52 These might look like they're separating it, +03:53 but they're on the inside, not the outside. +03:56 Okay, so this is going to let us define a type, +03:58 so come down here, and I could actually upgrade this, +04:01 so I could say, r equals record, +04:06 and if you look and see what it takes, +04:07 it takes a date, a temperature, +04:09 all the temperatures and so on. +04:11 And I could say date equals this, +04:13 mean temperature equals this, +04:15 min temperature equals that. +04:17 So I could say date equals row.getdate comma. +04:24 Did I say data? +04:25 Oh, no, date, yeah, date. +04:27 So date equals that and actual mean temperature equals +04:35 row.get, this is starting to feel tedious isn't it? +04:39 And we got to do this for every one of those. +04:41 It turns out these rows are dictionaries, +04:44 there's a shorthand to say this statement, +04:47 for every element in the dictionary. +04:50 So if I want to say, if date is in there, +04:52 go get the value assigned as date. +04:53 If mean, actual mean temp is in there, +04:56 go get that value and assign it to this, +04:57 and the way you do that is you say **row. +05:01 Star star row just says, well, do what I erased, right. +05:05 Set this value to the value from the dictionary, +05:07 set this argument value to the value of the dictionary, +05:09 and because what's in the dictionary +05:12 is literally what we put right here, +05:14 this is going to match exactly and this will work. +05:17 Alright, so now let's return +05:18 this little record thing instead +05:20 and we can rename it better to record. +05:24 There we go. +05:25 And so we'll call it record here. +05:28 Now we go over here record and say ., +05:30 and notice it gives us a nice, +05:31 beautiful list of all the stuff that's in there, +05:34 we don't have to do this this style over here, +05:37 I'll just say, I don't have to know it's a string +05:39 and is the actual precipitation, +05:40 I just say record.actual_precipitation. +05:45 Then into print out the value, +05:47 then we'll do it again. +05:48 So now it should work just the same, boom, it does. +05:52 Okay, whew, so we've now converted our data, +05:56 the last thing to do is to store it. +05:58 So instead of printing out, which is kind of fun, +06:00 but generally not helpful, +06:02 we're going to go to our data and say, data, append record. +06:07 Alright and just in case somebody goes +06:09 and calls this a second time, right, +06:12 we don't want to over do this, whoops not record, +06:15 we'll say data.clear. +06:17 So we'll reset the data and then we'll load the new data +06:20 from this file just in case you run it twice, +06:23 probably not going to happen. +06:25 Alright, so now we're basically ready, +06:28 let's just check and see that this worked. +06:29 Let's go over here and just print research.data, +06:33 just to see that we got something that looks meaningful. +06:37 And look at that, we did. +06:38 Record, the dataset, the mean is, +06:41 we actually didn't parse the date, +06:42 but just keeping it simple. +06:44 Actual mean temperature and so on, +06:46 you can see this goes on to the right for very long. +06:49 But it did exactly what we wanted. +06:51 So it looks like we're off to the races. +06:53 Now the final bit, actually this is the easy part, +06:56 let's answer the questions now that data +06:57 is super structured to work with. diff --git a/transcripts/37-csv_data/8.txt b/transcripts/37-csv_data/8.txt new file mode 100755 index 00000000..4118d1ce --- /dev/null +++ b/transcripts/37-csv_data/8.txt @@ -0,0 +1,144 @@ +00:00 Alright we're ready to answer the questions, +00:01 let's go through this again. +00:03 I'm going to move this down just so it fits right here, +00:06 so we initialize the data. +00:07 Boom, we're doing that. +00:09 The next thing we need to do is say +00:10 research dot let's say hot days. +00:14 Now what we're going to do is we're going to write a function here +00:18 that is going to give us all the days, hottest to coldest. +00:23 And we come over here and say days equals this, +00:27 then we could loop over and say for d in days, +00:30 and that would show all of them. +00:31 But we want just the top five, and so the way you do that +00:34 in Python is using something called slicing. +00:37 So you can come over here, +00:38 and say I would like to go from index 0 to index 5. +00:43 Alright so this gives us a little subset of our thing, +00:46 and when it starts at zero or ends at the length +00:48 you can just omit it. +00:50 So we can write it like this, +00:51 and that will process the first five of em'. +00:55 And then let's just say, print d for a second. +00:58 So we're going print out what that looks like. +01:00 So let's go write this hot days function. +01:05 Alright so we want to go through our data, +01:07 and figure out the hot days. +01:09 And it turns out, the easiest way to do this +01:11 is just to sort it. +01:12 So we can say return sorted data. +01:16 Now that's going to sort it by, jeez I don't know, maybe the +01:18 first element, alphabetical, by date, I'm not really sure. +01:23 So we want to control what it's sorted by, +01:25 and in here we can say there's a function +01:28 that is going to take basically one of these items, +01:32 one of these rows, +01:33 and tell us what we're going to use to sort for it. +01:36 So we're going to say key equals lambda +01:39 this is a little in line function. +01:41 Lambda says there's a function, +01:43 then the next thing we put is the argument. +01:44 So let's say r for record, +01:47 we do a colon and then we have the body of the function, +01:50 the implementation. +01:51 Where do we want to sort by for hot days? +01:53 Let's say with a max temperature for the hot days. +01:56 Actual max temp is what we want. +01:59 So we're going over here and I'll say r.actual_max_temp. +02:04 Now this is close, +02:07 this is going to actually give us the lowest value first, +02:11 and then the highest value to the end. +02:13 So the default sort is going to go from low to high, +02:16 how do you reverse it? +02:18 There's two ways, we could say reversed=True, +02:23 I'll spell it correctly, that's one way, +02:25 or another way a little more flexible, +02:27 is to just put a negation here and say +02:30 multiply that by a negative number. +02:31 So take your pick, you can do it either way. +02:34 While we're here let's write the cold days function, +02:38 that should be easy. +02:40 On the cold days take away that. +02:42 And let's do wet days. +02:47 And this time we're not going to sort by that, +02:49 we're going to sort by actual precipitation. +02:52 And again wet days are where we have more, +02:54 so we want to sort that in reverse. +02:56 Now the format is a little off so reformat the code. +02:58 So PEP 8 is happy. +03:01 Alright so those three functions actually +03:03 should do what we need. +03:05 So let's go over here and we'll just print out the five hottest days. +03:08 Now this is probably not how we want to view it, +03:11 so let's print this out slightly differently. +03:13 So I would actually like the index, +03:14 like this is the number 1 hot day, +03:16 this is number 3 hot day, so I can come over +03:18 and say idx, and instead of just looping over the days, +03:21 I can innumerate them and then loop over. +03:24 And that will give us the index and the day, for each time. +03:28 So then in here we'll put something like a little dot to +03:31 say what day it is and we'll say the temperature in terms of +03:34 Fahrenheit on such and such day. +03:36 And we'll just do a little string format on this. +03:39 So what this is idx and it's zero base, you don't talk in +03:42 terms of 0 1 2, you talk in 1 2 3 so plus 1. +03:46 And then we need the day, dot. +03:49 Now notice we're not getting any help here, +03:52 let's go back to these real quick. +03:53 So we can come over here and tell Python this is a record. +03:58 Now if we do that, +03:59 sorry not a record, you can tell it it's a list of record. +04:04 Now this is a Python 3.5 feature, +04:07 and if we come over here we import this typing.List. +04:11 So at the very top, we have from typing import List, +04:15 and we put this here, and I'll go ahead and while we're here +04:18 just put it on the others because they're all the same type. +04:21 We come over here and now we go back to this, +04:23 and I say let's try that again, d. +04:25 Oh yeah, now our editor is smart, now it can help us. +04:29 What we want here, we want the actual max temperature, +04:32 and then we want d.date. +04:35 Alright, let's go and run it, +04:37 see if this whole thing's hanging together. +04:40 Boom, look at that, hottest five days, 96-94-92-91-90. +04:45 And those are your dates, that's awesome, right? +04:48 See how easy it is to answer the question. +04:50 The challenge was not actually answering that question, +04:52 the challenge was taking the data, reading it in, +04:56 and then converting it to a workable format +04:58 and storing it in our record. +05:01 Once it's stored like that it is easy. +05:03 Let's go ahead and do the same thing for the coldest days. +05:08 So we'll say that days is not the hot ones but now it's +05:11 research.cold_days, should do exactly the thing. +05:16 And let's do a little print in between just so there's some +05:18 spacing, and you guessed it, +05:21 the wet days, same thing, just ask for the wet days. +05:25 Let's run it, so there's our hot days, +05:27 the cold days look really cold, +05:28 well doesn't look that cold does it? +05:31 Did I get the cold? +05:32 That might be the high on the cold days. +05:34 Let's go down here yeah. +05:35 Yeah, yeah, careful. +05:37 This going to be actual min temp, +05:41 like so, and this is going to be actual precipitation. +05:45 There we go. +05:48 Let's say, inches of rain, +05:52 there we go. +05:54 Oh yeah, now that's starting to look cold isn't it. +05:56 23 Fahrenheit, that's like negative negative 5 Celsius +05:59 for those of you who are on the Celsius scale, +06:01 this is like 36-37. +06:04 Alright so pretty hot, pretty cold. +06:07 I notice the sorting is correct. +06:09 The weather stays, the heaviest amount of rain +06:11 during that time was 2.2 inches, or 5 centimeters. +06:15 And then it goes down pretty quickly from there. +06:19 So hopefully you really got a good sense of how to take the +06:23 CSV file in, read it, parse it, +06:26 convert it to a usable format +06:28 and then just quickly answer questions. +06:30 We stored it in a list and sorted the list, there might be +06:32 other data structures you need to use for your data. diff --git a/transcripts/37-csv_data/9.txt b/transcripts/37-csv_data/9.txt new file mode 100755 index 00000000..124049b2 --- /dev/null +++ b/transcripts/37-csv_data/9.txt @@ -0,0 +1,41 @@ +00:00 Recall there were two basic steps +00:02 that we had to go through to work with this CSV data, +00:05 and they were both pretty simple. +00:06 We're going to start by importing the csv +00:09 module, so that will let us actually create +00:11 this dictionary reader to run through it, +00:14 and we're going to open a file stream +00:16 that we hand to the dictionary reader +00:18 to actually get the data. +00:21 Then we just create one of these dictionary readers +00:24 based on the file, +00:25 and gives us this thing that we can loop over +00:28 and each item that comes out of the loop +00:31 is going to be one of those rows in there. +00:34 And we get this row back and we work with it one at a time. +00:37 Now you saw the data's always text, +00:39 so you may need to upgrade it to something more usable +00:43 if you're working with numbers and dates +00:44 and things that are not just plain text. +00:47 The other thing that makes this really, really nice, +00:49 makes a big difference in terms of working with this data, +00:52 is to give it a little more structure, +00:55 and we saw that we could really easily use +00:58 something called a namedtuple. +01:01 This comes out of the collections +01:02 and then we're going to create the namedtuple here +01:06 and we call it whatever you want, +01:08 we make up the name. I said I'm going to call it record, so record it is. +01:11 Just remember it appears in two places, +01:13 and in that second part, we actually put the +01:17 basically the header from the CSV, +01:19 it just so happens that format works perfectly there. +01:22 And then we can, if we have some data, +01:24 we can create one of the by setting the keyword values. +01:27 So we set all the values there. +01:29 We actually have a shorter way to do it +01:31 if the dictionary exactly matches the items, +01:33 which it does in this case. +01:34 So we could use the **row, +01:37 because often there's a ton of keyword values to set, +01:40 and this will just do it in a super, nice shortcut here. diff --git a/transcripts/40-json/1.txt b/transcripts/40-json/1.txt new file mode 100755 index 00000000..83f9166c --- /dev/null +++ b/transcripts/40-json/1.txt @@ -0,0 +1,30 @@ +00:00 Hi everyone and welcome to JSON in Python. +00:04 This is Julian Sequeira and I'm going to be walking you +00:06 through some of the more interesting ways +00:09 of dealing with detailed JSON output. +00:13 So JSON, if you're not familiar with it, +00:15 stands for JavaScript Object Notation +00:18 and it's pretty much just a way +00:20 of formatting data, okay. +00:22 One of the most common ways of seeing JSON +00:25 when you're working with Python +00:27 is through contacting APIs. +00:30 Through working with numerous APIs out +00:33 through the web. +00:34 And one of the things about that +00:37 is that you actually get +00:38 really complex dictionary nested situations going on. +00:43 So the JSON output, +00:44 if you haven't seen it before, +00:45 just looks like a little dictionaries and lists +00:48 and if you get +00:49 really deeply nested lists and dictionaries, +00:53 it gets really complicated +00:55 to try and pull out that data, +00:57 which is why JSON can sort of screw with you, pretty much. +01:00 So, what we're going to do +01:01 is we're going to go through that +01:02 in the next couple of days, +01:04 have some fun with it and see what other cool APIs +01:08 you can talk to by the end of it. +01:10 So, let's move on. diff --git a/transcripts/40-json/2.txt b/transcripts/40-json/2.txt new file mode 100755 index 00000000..e7b29161 --- /dev/null +++ b/transcripts/40-json/2.txt @@ -0,0 +1,40 @@ +00:00 And here's how your next 3 days are going to look. +00:04 So, for the first day working JSON, +00:07 you're going to watch two videos. +00:08 You're going to inspect some JSON schema, +00:11 and then you're going to watch how +00:13 to pull down and decode JSON data. +00:16 Now, the data set you're going to +00:17 be pulling down does need an API key +00:20 which I don't think you'll have, +00:23 and you don't have to get it for this; +00:24 you can just follow along. +00:25 I've also actually put the data set +00:28 that we pull down into the repo, +00:30 so within this repo you can find it. +00:34 Now for Day 2, you're going to look at how to +00:37 pass the nested dictionaries within that same data set. +00:42 So for Day 1 you were just playing around with it +00:45 with what you found in the video. +00:47 Now for Day 2, that's when you drill down +00:50 further into the actual JSON nested dictionary part. +00:55 Now once you've watched the video on how to do it, +00:58 I'd like you to spend the rest +00:59 of this day, Day 2, playing with it. +01:02 So you're going to actually just use that data, +01:05 pop it into your script, into your shell, +01:07 whatever it is that you're going to be using, +01:09 and then go ahead and just play with it. +01:12 Follow the same advice and have a go. +01:15 And Day 3 is your turn, so what I'd like you +01:19 to do on this one, little more interesting, +01:21 is I would like you to go to our PyBites Code Challenge 16. +01:27 We'll bring that up here, and that's all +01:30 about querying you favorite API. +01:33 A lot of APIs, as we know, will return JSON data, +01:37 so what you can do is, and a good example is the OMDB API. +01:42 You can use that to return JSON-formatted data on +01:46 your favorite movies and then come up with an inventive +01:49 way to present or request that data. +01:54 So have a read-through, have a go, +01:56 and share whatever it is that you come up with. diff --git a/transcripts/40-json/3.txt b/transcripts/40-json/3.txt new file mode 100755 index 00000000..8972e4c9 --- /dev/null +++ b/transcripts/40-json/3.txt @@ -0,0 +1,40 @@ +00:00 Okay, so to start we're going to look at +00:02 a basic example of JSON output or JSON schema. +00:07 Okay so it is pretty complex at times, +00:10 especially when it starts getting really deep. +00:14 So just look at this basic example to understand it. +00:17 So from Python perspective, it looks pretty simple for now. +00:22 This is a really basic one again +00:23 and it's about a sort of person object +00:25 so you've got a title of a person. +00:28 You got the type, it's an object. +00:29 And then what are the properties of that? +00:31 Well there is a first name, a last name, an age, +00:35 a description, and so on and so forth. +00:38 What really gets people and gets me sometimes +00:42 with a JSON is once it's decoded in Python, +00:47 all of these become nested dictionaries and lists. +00:51 And it makes it quite difficult when you're writing loops +00:55 and what not to try and drill down +00:57 to those nested dictionaries. +01:00 So looking at this, if this was formatted +01:03 like a dictionary in Python, your first level +01:07 of the dictionary has the key title value person, +01:11 key type value object. +01:14 Key properties but the value of properties is +01:18 another dictionary and that dictionary goes +01:21 all the way down to here, okay. +01:24 And within that dictionary, you then have +01:28 another key called first name whose value is +01:31 yet another dictionary, okay. +01:34 And then that closes off here and then you have +01:37 another key whose value is yet another dictionary and so on. +01:42 When you break it down visually, it makes a lot more sense. +01:47 That said, it is still a little bit of a crazy process +01:53 trying to drill down, okay. +01:55 And we're going to work through that +01:56 in the next couple of videos. +01:58 So this is just a nice basic example +02:00 of what JSON schema looks like. +02:02 So have a good look at this. +02:04 Wrap your head around it and move onto the next video. diff --git a/transcripts/40-json/4.txt b/transcripts/40-json/4.txt new file mode 100755 index 00000000..cd7a6101 --- /dev/null +++ b/transcripts/40-json/4.txt @@ -0,0 +1,105 @@ +00:00 So, for this video, we're going to look at +00:02 some JSON data that is returned by an API. +00:06 Okay, we're not going to just download a file and parse that. +00:10 What I'd like to do is show you that a lot of APIs +00:12 respond with JSON data, okay, JSON formatted data. +00:17 So, what we need to do in order to look through all of that +00:21 is, first, we need to import json, +00:24 obviously, so we can decode the data. +00:27 We also need to import requests, +00:29 because that's how we're going to get the actual data. +00:32 All right? +00:33 And, for later on in this video, we're going to get pprint, +00:39 all right, and we'll discuss that in a bit. +00:42 Now, there will be some magic here, +00:44 because I don't want you to see my API key, +00:47 but, essentially, we're going to go r., r is requests, .get. +00:54 Okay, let me do some magic here. +00:57 Copy and paste the key and get this JSON data pulled down, +01:01 and then we'll carry on. +01:04 All right, now I've just given us some white space +01:06 here to work with, get it out of the screen. +01:08 So, r has been pulled down, the actual JSON +01:12 has been pulled down, and we're going to assign that +01:15 to the data variable. +01:19 Now, data = json.loads, all right? +01:25 Loads allows us to actually decode the JSON output. +01:30 Okay, so the JSON output is pretty ugly, +01:33 and using json.loads, that allows us to actually decode it, +01:37 and make it readable. +01:39 So, we're going to load in r.text, okay? +01:45 Now, if I was to hit data, and enter, and show you that, +01:49 it would probably kill my session +01:51 because there's so much data in this. +01:52 So what I've actually done is, +01:53 I've copied and pasted this output into a text file for you. +02:03 And that is here, okay? +02:06 So you can see this is all the data +02:07 for my character in the game. +02:12 Now, you can see the sort of nested dictionaries +02:14 I was discussing before. +02:16 Okay, you've got, at the highest level, +02:20 you've got a dictionary key there, and a value, +02:23 and then we move on to the next one, and so on. +02:26 Keep on filtering down, until we get to mounts. +02:29 Now mounts is just, long story short, +02:31 mounts is a sort of creature you can ride on +02:34 in the game to get around. +02:36 So, under the mounts key, we have a large dictionary here, +02:41 called "collected," okay? +02:43 And within that collected key, +02:46 we have our list of dictionaries as the value. +02:52 So, you can see how far it drills down, +02:55 so we've got the parent key here, +02:57 whose value is another dictionary, +03:02 with the key to a list of more dictionaries, okay? +03:06 And each mount, each animal that you ride on +03:10 in this output, has these keys, okay? +03:15 So it's a whole array of data and it just +03:17 goes on and on and on and on, and then you can see +03:22 number collected, we drop out of that list here, +03:25 at the end, and we get back into that, +03:28 we go up one level, and we see number collected, +03:31 number collected, number not collected, +03:33 and then we go up to the parent level. +03:35 I want to call it the parent level, the top level, +03:38 and we see realms and whatnot. +03:40 Okay? +03:41 So that is what that data looks like, +03:43 the stuff we just pulled down, +03:46 so how do we work with that data, okay? +03:49 Well, to look at that data, we need to +03:52 treat it just like a dictionary, okay, +03:54 there's a little bit of difference, +03:56 and we'll get to that in the next video, +03:58 but, for example, we now know what the data looks like, +04:02 so it allows us to figure out how we're going +04:04 to flesh it out in the Python code. +04:07 So for item in data.items, I'm just going to do a standard, +04:12 sort of, dictionary parse here. +04:15 We're just going to print item, okay, +04:18 and watch what happens. +04:21 We get all of that data here and +04:23 it is, honestly, disgusting. +04:27 It does not format correctly, okay. +04:30 Now, I've just scrolled that out of the buffer +04:31 to get the distraction away. +04:34 We can then go for item in data.items, +04:41 okay, same as we just did, but this time, +04:43 we're going to use pretty print, or pprint, okay, +04:46 and the beauty of pprint is that it actually +04:49 knows what JSON data looks like, +04:52 and it formats it nicely for us. +04:55 Okay, and this is the same output we saw +04:59 in our Notepad file just then. +05:03 Wait for it to continue flooding my screen, +05:06 probably overloading my computer, +05:09 and it's going to look just like this. +05:11 Okay, so there it is there, and that's pretty much how +05:14 I got that Notepad file in the first place. +05:17 So this is JSON data. +05:19 This is importing it into Python, +05:21 into your Python application, and this is pretty much +05:24 printing the entire thing in a nicely formatted way. +05:28 So, in the next video, we will cover how to drill into this, +05:33 but for now, have fun. diff --git a/transcripts/40-json/5.txt b/transcripts/40-json/5.txt new file mode 100755 index 00000000..7a4b42f4 --- /dev/null +++ b/transcripts/40-json/5.txt @@ -0,0 +1,155 @@ +00:00 Okay, so carrying on from the last video, +00:02 we have this gargantuan bit of JSON response, +00:06 and it's been formatted nicely by pretty print, +00:10 to look just like this. +00:12 And what we want to do, the aim of this exercise here +00:16 is to take the names of these mounts. +00:20 These in the game I've collected all of these mounts +00:24 in this list here. +00:25 In this list of dictionaries, +00:28 and I want to get the list of them. +00:29 So how do we do that? +00:31 Well it's easy enough using key and value calls +00:33 for a dictionary, to get this data here, so we're not +00:37 going to cover that. +00:38 What we want to do, is talk to the data that's nested +00:43 below these lists and dictionaries. +00:47 So we need to talk to mounts, the mounts key, +00:52 then we need to talk to the collected key, and so on +00:54 down to what we want. +00:56 So how do we do that, how do we do that in Python code? +01:01 Well the first thing we need to do is we need to start off +01:03 our normal for loop. +01:06 So we're going to do for item in data, +01:11 but instead of doing items as we normally would +01:15 for keys and values, we're actually going to do some +01:19 tags, so the key that we want to look at specifically +01:24 is mounts, isn't it? +01:26 So let's just double check that. +01:28 Go back to the file, and sure enough yes it is mounts +01:31 we want to talk to mounts. +01:33 And this is where things are slightly different +01:36 and this is where things get a bit out of hand +01:38 when it comes to handling nested dictionaries, +01:41 you really have to investigate the JSON output, okay? +01:48 So we're going to go for item in data mounts, well let's +01:53 just pprint item and see what we come up with. +01:58 Well, we get collected, num not collected, and +02:02 number collected. +02:03 And where did those come from? +02:04 Let's go back to the file. +02:06 So we have collected here, that's the first key, okay? +02:10 We're going to scroll all the way to the bottom, +02:12 and then we have the next key, number collected +02:14 and number not collected. +02:15 And that's exactly what popped up here. +02:18 We just wanted the first key for mounts. +02:25 But we want to drill into the rest of this stuff. +02:29 We want to get further into mounts. +02:30 And this is where we further talk to collected. +02:33 So you can see we are now going to start staggering +02:38 our way down, almost like a staircase. +02:40 So now we're going to go for item in data mounts, +02:48 and we know that's collected, okay, well what's going to +02:54 happen now? +02:56 I'll give you a clue so we don't flood the screen. +02:59 Printing item is going to print all of this stuff here, +03:05 and we don't want to flood our screen yet again, okay? +03:08 What we do want however, is something in every single one +03:14 of these dictionaries, so in this list, we have this +03:17 dictionary, which comes down to here for the +03:21 Albino Drake. +03:22 And underneath that we have this dictionary for the +03:25 Amber Scorpion which ends here. +03:27 And we want the name; each one of these little dictionaries +03:31 has a name key. +03:35 So we call 'em that. +03:37 So we've drilled down now with our code +03:40 to mounts and collected, and now we're going to start +03:42 talking to these keys here. +03:48 So, we're not going to pprint item, we're actually going to +03:50 pprint the items, but only the name tag. +03:57 So we've got for item in data mounts, we're drilling down +04:00 from the top level to collected, and then pprint the item +04:04 with just the name tag. +04:08 And watch this. +04:11 There we have all of those mounts from the game, +04:16 in the order that they are in those dictionaries, +04:20 and that's all we got, which is exactly what we wanted, +04:23 okay? +04:24 So we go back in here, you can see we got that name, +04:27 Albino Drake, Amber Scorpion, Argent Hippogryph. +04:30 And so on. +04:32 All the way down here. +04:34 And it's really, really cool. +04:37 So that's how we've just worked our way down +04:40 and passed our way down through the steps of the nested +04:44 dictionary. So what can we so with this? +04:46 Let's make it interesting. +04:49 Hop into this, now what's something that differs +04:51 between these mounts? +04:54 Well this mount here, the Albino Drake is a flying mount +04:59 because it's set to True. +05:00 But the Scorpion is not flying. +05:04 The flying is set to False. +05:07 And this is a boolean operator. +05:08 It's just True or False. +05:10 Not a string, if you considered it a string +05:13 it would have had the quotes around it. +05:17 This is completely boolean, is aquatic and ground +05:21 and everything. +05:23 How 'about we just try and get the flying mounts, +05:26 the ones that are capable of flying through the air? +05:29 Let's narrow it down, do something a little more usable. +05:32 So we're going to create a list first that we're going to +05:35 throw these mounts in, so is flying, just create an +05:40 empty list, alright? +05:43 Now we're going to use the same code for mount in data +05:48 mounts, we're going to drill down to the next level again, +05:53 collected, well what do we want to do? +06:01 We're going to say if mount is flying, we're going to +06:09 do something. +06:10 Now note that we don't actually have to check +06:12 for the truthiness so to speak, we don't have to do +06:17 if mount is flying equals equals True, +06:22 because Python assumes True from default. +06:28 And it is in a string so we don't have to try and +06:30 match it with a string called True. +06:32 We can just go if mount is flying, if it is, +06:37 then we're just going to append it. +06:39 So is flying.append mount, alright? +06:48 And that's it. +06:49 So what this has stored now, it's actually stored +06:55 this entire dictionary. +06:58 Each one of these dictionaries is now stored in the +07:01 is flying. What we can now do is talk to this thing, +07:08 we can go Len is flying, we got 65 entries there. +07:17 Let's compare that with here. +07:19 We know our collected has 204. +07:24 I've collected 204 of these mounts in the game. +07:27 But we only had 65 stored in here, 65 of these +07:31 dictionaries stored. +07:32 So we know this worked. +07:34 We know that it took just the flying mounts, the ones +07:37 that are capable of flying. +07:39 So what we can do now, just to show you, we can go +07:42 for i in is flying, print, we'll just keep pretty print +07:52 just in case, pprint I, and you'll see +07:56 we actually got all of that data, didn't we? +07:59 So we got the entire dictionary for each one +08:03 of those flying mounts. +08:05 So again I'm sure you can guess, if we want just the data +08:10 that we want, which is the name, +08:12 we can go for I in is flying, pprint I, and then we use +08:21 the tag again that we want to take, +08:26 name, and there we go. +08:28 So our list has changed yet again, we no longer have +08:31 things like that Scorpion, it goes straight onto the next +08:35 flying mount that I've collected. +08:38 And that's it, so this is really really cool. +08:40 This is the best part about JSON. +08:42 It's got all the data there, it's just really hard +08:45 to get to sometimes, so using this method +08:48 you should be able to drill down through all of the +08:51 sub dictionary or the nested dictionaries +08:55 and find the data you want, and then you can diff --git a/transcripts/40-json/6.txt b/transcripts/40-json/6.txt new file mode 100755 index 00000000..a816d11d --- /dev/null +++ b/transcripts/40-json/6.txt @@ -0,0 +1,115 @@ +00:00 Okay, so that was JSON. +00:02 I hope you enjoyed it. +00:03 I know it seemed a bit basic, but the reality is +00:07 that's most of the work with JSON +00:09 that you'll end up doing, right, +00:10 just passing the code, passing the output to find +00:14 the tags that you need and pulling it out really. +00:17 So let's recap everything we did. +00:21 For the first bit of code, it was just pulling down +00:24 and viewing the JSON files. +00:26 We just had a sort of overview of what it looked like, +00:29 the format and what we were looking for and so on. +00:33 So we begin by putting JSON, okay. +00:36 Then we pull down the file using requests. +00:39 Then we used json.loads. +00:43 And this essentially decodes the JSON code that is, +00:48 or the JSON output that's in the odd.text. +00:52 Okay so the request pulls down the JSON output +00:55 and then json.loads decodes it, +00:58 makes it readable for our code, okay. +01:01 Then we just handle the data similar to a dictionary, okay, +01:06 and we saw that if we would adjust at the top level +01:09 for the output that we had, if we had just run +01:13 standard four loop iteration over the data, +01:17 we got spammed with a lot of data, okay. +01:21 Now that was because we were just doing +01:23 a standard print, yeah, so it didn't format it at all. +01:28 Now that's why we were importing it, +01:31 the top there you can see from pprint import pprint +01:34 and that is pretty print. +01:36 And that formats our JSON decoded output +01:40 in a really nice way. +01:42 Pretty much the way that you would expect to see it +01:44 if you had an in-browser JSON decoder or JSON viewer. +01:49 And this is a nice way of presenting it +01:51 on our Python command line. +01:54 Then we had a look at the JSON nested dictionaries. +01:57 This is where things get a little more complicated +02:00 and you can definitely see that with the data +02:03 that we had. +02:04 So when we looked at our dataset, we saw that +02:07 there was a mouse key sitting there, right. +02:09 So to iterate over that, we run four item in data mounts +02:15 and then we p print the item. +02:17 And that got our next level of keys. +02:23 And specifically we then had a collected key +02:27 which then underneath that had another dictionary +02:30 and list below. +02:31 Okay, so we stared working our way down +02:35 through the hierarchy of dictionaries, +02:38 through the nested dictionaries. +02:40 Next from there we found we wanted to look for +02:44 the specific names of the mounts +02:47 and that's where we used the name key. +02:49 We specified that in the tag, okay. +02:52 And that p printed a really nice list of names for us. +02:56 Then we challenged ourselves to sit there +02:59 and go okay out of all the mounts +03:01 that we had collected, let's just print out +03:05 the ones that are considered flying, okay. +03:08 And that's what this bit of code here does. +03:11 We have an empty list called IsFlying +03:14 and then it goes through, checks to see +03:16 if IsFlying is True, and remembering Python, +03:20 you don't necessarily need to keep saying +03:23 if something is true. +03:25 You can just say if something, +03:27 and that is True in itself. +03:30 So if mount IsFlying, then we add the mount data, +03:34 all of it, we add all of that mount data +03:36 to the IsFlying list. +03:39 And then we can just iterate over that +03:41 as we so pleased. +03:45 So this is the JSON data example +03:48 that we've just gone over just as a little reminder for you. +03:52 It was quite in depth. +03:54 It just dug deep a little bit, okay. +03:58 You could see now everything if you've forgotten already, +04:01 everything sort of makes sense. +04:05 So now it's your turn. +04:06 So what next? +04:07 Well for this one, there is actually something +04:10 very specific I'd like you to try. +04:12 You're welcome to do whatever you want with JSON obviously, +04:15 but I think a really good challenge for you +04:18 at this point would be to go to our Code Challenge platform +04:24 and just look at this code challenge on +04:29 Code Challenger Number 16. +04:30 Query your favorite API, okay. +04:34 Now in this challenge we ask you to go out +04:37 onto the internet to your favorite API +04:39 and just do anything, okay. +04:41 Do any sort of a pull as long as you're querying the API. +04:45 But as we've discussed, APIs tend to return +04:48 a lot of JSON data. +04:50 So a specific one you could try +04:52 rather than going through all of these +04:54 looking for one that might interest you +04:55 is the OMDB API. +04:59 If you click this OMDB API link +05:02 from our Challenge 16, you end up on this website here, +05:07 OMDB Open Movie Database, okay. +05:10 And it actually returns JSON data +05:14 and you can do some examples here +05:16 and see what that will look like for you. +05:19 So if you want something to challenge yourself +05:21 for day three, go through this here, OMDB, +05:24 query the API, and see what you can do +05:27 with the return data. +05:29 Just play with it, manipulate it, +05:31 just like we did with our other code. +05:33 Maybe turn it into an app of some sort. +05:36 Just whatever you have time for +05:38 and whatever you're willing to try. +05:40 And other than that, keep calm and diff --git a/transcripts/43-search-api/1.txt b/transcripts/43-search-api/1.txt new file mode 100755 index 00000000..a6fcb2e9 --- /dev/null +++ b/transcripts/43-search-api/1.txt @@ -0,0 +1,32 @@ +00:00 Hello, this is Michael Kennedy +00:01 and I will be your guide for Day 10, 11 and 12. +00:05 And during these three days you're +00:06 going to work with JSON APIs and +00:09 in particular with a couple of search-based APIs. +00:12 But of course, what you'll learn here +00:13 you'll be able to apply to pretty much any JSON API. +00:18 APIs are really important. +00:20 These are the way that you reach out and +00:21 you add superpowers to your code, to your application. +00:25 You might write an application that has +00:27 some data in the database, +00:28 it's got some information that users have input, +00:31 but maybe you want to add weather information, +00:34 or integrate with Github or talk to Twitter. +00:36 All of these use APIs. +00:38 And so we're going to look at +00:39 the foundation of APIs in this challenge, +00:42 which is basically HTTP and JSON. +00:45 And we're going to do that from Python, of course. +00:47 So we're going to work with two services. +00:50 One service I'm going to demonstrate +00:52 how we write code against it, +00:54 and then I'll give you another service +00:55 for your code challenge that you can play with, +00:58 and if you don't like either of those services +00:59 for your code challenge, feel free to +01:01 just go find another one. +01:02 You'll probably have enough information +01:04 to do something pretty interesting +01:06 after this series of videos. +01:08 So let's go look at this movie db search service. diff --git a/transcripts/43-search-api/10.txt b/transcripts/43-search-api/10.txt new file mode 100755 index 00000000..d88813f1 --- /dev/null +++ b/transcripts/43-search-api/10.txt @@ -0,0 +1,17 @@ +00:00 Now you've seen me build an application +00:02 using requests to consume a JSON API. +00:05 It's your turn to consume a different API. +00:10 So drop over here in GitHub, +00:12 and we're going to go through the various things +00:16 and the read me here for what you do +00:17 for this particular day. +00:19 We're going to start out by basically just making the skeleton, +00:23 create a virtual environment, +00:24 create a program .py and an api.py, +00:27 and just make sure that you can import one +00:29 from the other, and we're going to install Postman. +00:33 So make sure you install the Postman application. +00:35 Most of what today was +00:37 was just watching the corresponding videos. +00:40 So get everything setup and get ready +00:42 for the next day. diff --git a/transcripts/43-search-api/11.txt b/transcripts/43-search-api/11.txt new file mode 100755 index 00000000..ee3259c6 --- /dev/null +++ b/transcripts/43-search-api/11.txt @@ -0,0 +1,56 @@ +00:00 Second day of this section is going to +00:03 actually be to work with +00:04 an entirely different API, +00:06 but another one around the podcast +00:08 just to keep it simple and stable. +00:10 So what your going to do is we're going to +00:12 interact with this search.talkpython.fm +00:15 Now if you're over here and you're +00:16 on Talk Python, +00:17 and you try to search, +00:19 you could say "I would like to search for +00:21 let's say, a 100DaysOfCode". +00:22 Pull that up you can see +00:24 it went back and found a couple of elements, +00:25 an episode and a transcript, +00:27 and it did this in a ridiculously +00:29 fast period of time. +00:31 But there's actually an API underneath here +00:34 there's JSON API, +00:35 and you can write queries you +00:36 can search yourself right? +00:37 it's open, and searchable for you +00:38 and it's exactly like what you've been +00:41 working with. +00:42 So let's go over here and play +00:43 with this a little bit. +00:45 Click on this, and see the raw data, +00:47 This is what you get back if you search for +00:50 tests, so whatever you do is you put +00:52 the little query string pieces there, +00:54 so we'll put a100DaysOfCode, +00:56 uh, and it's going to come back +00:57 Firefox tries to make that response pretty, +00:59 but it's going to come back looking +01:00 something like this. +01:02 Alright, so this is the API we're +01:04 going to work with. +01:05 So the first thing you're donna do is +01:07 explore the API imposement, +01:09 and your goal for the day +01:11 is to create a program that +01:12 does the following: +01:14 It gets a search word from the user, +01:16 It calls the search service using that +01:18 API we just looked at, +01:20 it makes sure the response +01:22 from the server was okay so request. +01:24 response.raise_for_status I believe, +01:28 And then you want to return +01:29 just a basic dictionary of the results, +01:32 and use that to list out the titles. +01:35 So it should look something like this on Day 2. +01:37 Run your program, it has a +01:38 little header if you want, +01:39 ask the user for some search terms +01:40 and it says "Boom. These are the titles." diff --git a/transcripts/43-search-api/12.txt b/transcripts/43-search-api/12.txt new file mode 100755 index 00000000..9a948981 --- /dev/null +++ b/transcripts/43-search-api/12.txt @@ -0,0 +1,21 @@ +00:00 The last day is adding polish. +00:02 We're going to use a namedtuple. +00:04 Now here's an example from our movie one. +00:06 You want to create a corresponding one +00:08 for a search result. +00:10 The other thing we're going to do, +00:11 this is really, really simple and slick, +00:13 is, if we look over here +00:14 you'll see that there is a URL +00:16 that you can get to for every result. +00:19 What you're going to do is you're going to write +00:20 a little bit of code that asks the user +00:24 which one of these would you like to view +00:25 in your web browser. +00:27 Maybe give 'em a number, +00:28 and they can put 3, and so then you're goal +00:30 is to write a little bit of code +00:31 that will open the web browser +00:33 and a new window at that URL, +00:35 and literally those two lines of code +00:37 is all it takes across platform. diff --git a/transcripts/43-search-api/2.txt b/transcripts/43-search-api/2.txt new file mode 100755 index 00000000..59503d63 --- /dev/null +++ b/transcripts/43-search-api/2.txt @@ -0,0 +1,38 @@ +00:00 Over here at movie_service by talkpython.fm +00:04 we have a service that has, I guess probably a couple +00:06 thousand movies. +00:08 Notice down here this does not have all the movie data that +00:11 you might want, it only has some of the movies, but it's +00:14 more than enough for us to play with. +00:17 There's three things that this service will let you do. +00:20 It will let you basically search by keyword, so we come over +00:25 here and call API search, and here we're searching for run. +00:29 And firefox likes to give you this pretty view here, +00:32 let's go in and just look at the raw, so you can know what +00:33 you're getting. +00:35 So here, the keyword is run, and we've got some hits. +00:38 And hits were for things like 'The Rundown', +00:41 and 'Runaway Bride', and 'Bladerunner' and 'Chicken Run', +00:44 and all these movies here. +00:46 So we'll be able to put whatever we want in the +00:49 here, if we wanted away, boom. +00:51 'Flushed Away' is the first result. +00:53 It apparently has to do with sewers and rats and frogs. +00:56 Anyway, we can search for these movies using the service, +00:59 and what we get back is this format here called JSON, +01:02 which is the JavaScript Object Notation. +01:06 This is probably the most popular format for data exchange +01:10 over these HTP services. +01:12 So it's great we can do it here, but we also want to do this +01:16 in a slightly more structured way. +01:19 So we're going to look at two ways. +01:21 One using a tool specifically for accessing and working with +01:25 APIs, cause it is pretty simple to go up here and type enter +01:29 but what if our interaction required us to change the +01:32 headers? +01:33 If our interaction required us to do an HTTP POST rather than +01:35 a GET, which is what you normally do in browsers. +01:38 That gets tricky. +01:39 So we're going to see a tool that helps us explore the full +01:42 spectrum of APIs, and then we're going to interact with it +01:44 from Python. diff --git a/transcripts/43-search-api/3.txt b/transcripts/43-search-api/3.txt new file mode 100755 index 00000000..1c3b5ff9 --- /dev/null +++ b/transcripts/43-search-api/3.txt @@ -0,0 +1,38 @@ +00:00 To truly work with APIs, +00:02 you need to be able to interact with the entire spectrum +00:04 of the HTTP protocol, and browsers, +00:07 while they technically do that, +00:08 they don't let you as a consumer, as a user of the browser, +00:12 really easily do that. +00:13 So we're going to look at this tool called Postman. +00:15 And I've already installed it, +00:16 you can see it works on all the OSs, it's easy to install. +00:19 Let me come over here, and if we wanted to go +00:20 to that same URL we had before, +00:23 we could come over here and enter this, +00:25 and hit Go. +00:27 And you see here's the same JSON that we got. +00:29 Here's the status code, what it means, +00:32 okay versus other things, how long it took, +00:34 how much data there was, what headers were sent back. +00:38 That's interesting. +00:39 We could even come over here and we could pass additional data, +00:41 like user id is 72, +00:44 or something like that. +00:45 Now that's not going to have any effect on this service, +00:47 but it could, right? +00:49 We could even come over here and say, +00:50 we're going to set the accept type, +00:52 notice the auto-completion. +00:54 And accept application, let's just say JSON. +00:57 Right? So be a little more explicit, +00:59 this is the same thing we're getting. +01:01 We come over here and do a PUT and POST. +01:03 So as you interact with APIs, +01:05 here and in other challenges, +01:06 I encourage you to check out Postman. +01:09 It's free, and it's really nice, +01:11 and you can even create an account, notice mine is nsync, +01:13 and save these so you can sort of set up a structured way +01:16 to interact with things, and go back and forth, +01:19 save for testing. diff --git a/transcripts/43-search-api/4.txt b/transcripts/43-search-api/4.txt new file mode 100755 index 00000000..8db6b3d0 --- /dev/null +++ b/transcripts/43-search-api/4.txt @@ -0,0 +1,26 @@ +00:00 We've seen how to poke at our API +00:02 with just doing a GET request. +00:03 We've seen Postman lets us explore better +00:06 but if we want to access it from code, we need another way. +00:09 Now, Python has a built in mechanism +00:12 for accessing HTTP APIs +00:14 but it's not the prettiest thing in the world. +00:16 So a guy named Kenneth Reitz created +00:19 this thing called Requests. +00:20 Maybe you've heard of it. +00:21 It's definitely one of the most popular packages, period. +00:25 And to use it is really, really simple. +00:27 We're going to use it in just a moment. +00:28 If you want to get a URL, you just say GET. +00:30 Here you can even pass the auth, +00:31 check the status code, check the encoding, check the text, +00:34 and even convert the JSON back to Python dictionaries. +00:37 So this is a very popular library. +00:39 It's definitely the most-used for accessing HTTP services +00:43 or Python directly. +00:44 So, unless for some reason, you are very adverse +00:46 to having a dependency on an external package, +00:48 this is the way, +00:49 this is the way we're going to do it in Python. +00:51 So, next up, let's get started +00:53 and actually write some code. diff --git a/transcripts/43-search-api/5.txt b/transcripts/43-search-api/5.txt new file mode 100755 index 00000000..0dc9491b --- /dev/null +++ b/transcripts/43-search-api/5.txt @@ -0,0 +1,98 @@ +00:00 So it's time to get started writing our search app +00:02 that's going to talk to the movie search API. +00:05 Now over here in our repository, +00:06 I've got Day 10 to 12 selected +00:09 and I've opened up the terminal here. +00:12 We want to open this in PyCharm. +00:14 You don't have to use PyCharm, +00:16 but I'm going to open in in PyCharm. +00:17 I'm going to go through a couple of steps. +00:19 Whenever you depend upon external packages, +00:21 it's a good idea to have a virtual environment. +00:24 In order to create one of those over here, +00:25 let's call this app, let's make a folder really quick. +00:30 So call this Movie Search. +00:32 And go in here. +00:33 Then, I'm going to create a virtual environment here. +00:37 If we call it .env or venv, +00:40 then PyCharm will automatically detect it and use it, +00:42 so might as well call it that. +00:45 Now open this in PyCharm, +00:46 can't seen anything because dot creates hidden files on Mac +00:49 and Linux, but we're going to open this +00:52 on Mac and Linux, you have to say file, open, directory +00:56 and Mac, you can just drop it here. +00:59 Let's go ahead and tell PyCharm about about git, +01:02 so everything I create is going to be put +01:04 into the git repository for you. +01:06 And that'll be a little easier here, +01:08 go ahead and also tell it to ignore this directory. +01:12 Maybe someday it'll do that on it's own. +01:13 Now I want to create two files, +01:15 I don't like to cram everything into one Python file. +01:19 When I'm creating an application +01:20 I want to partition it into pieces so let's go over here +01:23 and create two things. +01:24 We're going to create a program +01:26 and we're going to create an API. +01:31 And go ahead and tell PyCharm it can add stuff to git. +01:34 Okay so what we're going to do +01:35 is we're going to write the code to access the service +01:38 in the API file and we're going to work with it +01:41 from the user interaction perspective +01:43 and orchestrate it from over here. +01:45 So let's define a quick method over here, main. +01:48 And we'll just have pass. +01:50 Now we want to follow the convention for running this program +01:54 if and only if it's the target of execution. +01:57 And in PyCharm, the way that, +01:58 or, in Python, the way that you do that +02:00 is you use this if dunder name equals dunder main, +02:03 then that means it's supposed to run +02:05 and I'll just call this method here. +02:09 This is a little bit set up and ready to go. +02:11 We're going to use something over in the API +02:14 so we're going to create a method here +02:16 that's going to take a string +02:18 and it's going to return some search results. +02:19 So create. +02:21 And say find movie by title, let's say, +02:25 because that's what we're actually searching for here. +02:27 And the keyword, and it's going to do some stuff +02:31 and return some movies, that's going to be great. +02:33 How do we do that? +02:34 Well first we have to work with requests. +02:36 So we'll come over here and say import requests. +02:38 Now let me go ahead and run this, +02:41 it's not going to work out so well, +02:43 we're going to right click and create a run configuration +02:45 in PyCharm, or you just type Python 3, you know, +02:48 program.py. +02:51 That didn't actually import it so nothing actually happened. +02:53 But let's do, if we come over here and say import api +02:56 as we're going to need to, now we try that again, boom, +03:00 there is no requests. So of course we have to install requests. +03:03 Now if you look in our terminal, +03:05 notice we have the virtual environment activated here, +03:08 so we could say, see what's in there. +03:11 And there's nothing really in there. +03:14 So one of the conventions people like to follow +03:16 is when they have dependencies +03:19 they'll have a file called requirements.txt. +03:23 And in there, they'll put library names like requests. +03:27 requests, like this. +03:29 And notice, PyCharm already knows, +03:31 hey, you need to say pip install requests, +03:33 or you can just click this and that'll do it for you. +03:37 If you wait for a second down here +03:38 and then we do the pip list again, +03:39 there should be more stuff including requests, +03:42 our program should now run. +03:44 Ta-dah, okay. +03:45 So we have just the basic structure of this thing +03:47 hanging together, right? +03:49 We've installed requests, we've created the program, +03:52 and the api separation, we've got our requirements, +03:54 and it's all kind of hanging together. +03:57 Next up, we actually have to write +03:59 our method here, about how we find movies. diff --git a/transcripts/43-search-api/6.txt b/transcripts/43-search-api/6.txt new file mode 100755 index 00000000..42f62c0b --- /dev/null +++ b/transcripts/43-search-api/6.txt @@ -0,0 +1,56 @@ +00:00 So we have the basic structure +00:01 of our application written here, +00:04 but now we want to actually go, +00:05 when somebody calls this function, +00:07 we want to go and download this result +00:09 from our search service, so, recall over here +00:11 in our movie search service, we put something like this. +00:17 We say api/search/{keyword}, +00:21 and then the search will happen. +00:22 So let's go over here and first create the URL. +00:26 And the URL we're going to use f-strings. +00:28 This is a Python 3.6 feature, if you don't have +00:31 Python 3.6 or above, then you're going to need to +00:35 do the older style format. +00:36 So we'll say like this, and we want to replace +00:39 that little part with the variable keyword, +00:41 so in Python 3.6 with these f-strings, +00:44 you can say, {keyword}. +00:47 Notice the autocomplete. +00:49 So, let's begin just by printing out URL, +00:52 and just make sure that we're on the right path. +00:54 So we're going to come over here, +00:56 and we're going to call result... +00:59 Spelling is hard. +01:00 Results equalsapi., notice there's our little thing, +01:03 and let's just, for now, say this is going to be runner. +01:06 Going to search for runner. +01:08 So if we run this, +01:10 that looks pretty good, we can click it and test. +01:13 Okay, looks like we got the maze runner and runner runner, +01:16 that's a lot of running. +01:17 And so this is working. +01:19 Now instead of printing out this, let's actually use it. +01:22 So we'll say response equals requests, +01:25 which we've already installed, +01:27 get, and we'll pass the URL. +01:30 We could go ahead and just work with this. +01:32 We could say response.text, +01:34 unless that failed, unless the, say, +01:36 wireless is down or something. +01:37 So we need to be careful and say, +01:38 I want to make sure there was no error. +01:40 There's a status code, you could check it. +01:42 But requests has this cool method called raise_for_status. +01:45 So if anything went wrong for whatever reason, +01:47 you'll get an error, otherwise you can just keep going. +01:51 So now we have, and we can print out, what we got back +01:56 here, and then again. +01:59 And notice, there's all the results coming back, +02:02 well, at least all the ones the server would give us. +02:04 That's pretty cool. +02:05 Now, we actually, not to like... +02:08 We don't want to work with strings, we want to work with data. +02:11 So the next thing that we need to do +02:13 is convert this text into Python dictionaries +02:17 from the JSON source. diff --git a/transcripts/43-search-api/7.txt b/transcripts/43-search-api/7.txt new file mode 100755 index 00000000..6c700533 --- /dev/null +++ b/transcripts/43-search-api/7.txt @@ -0,0 +1,51 @@ +00:00 So we've seen that we've downloaded the data +00:02 from our search service and we have created +00:04 the right URL that works, we already tested that +00:07 in our browser and printed out the text. +00:09 So the next thing we need to do is convert +00:11 the text from JSON format into Python dictionaries. +00:15 Now we could use the json library in Python +00:19 but request has a little goody for us here +00:21 so we can say results equals response.json, +00:25 that's all we need, it's converted to JSON +00:27 so we could print out, it's converted to Python +00:30 dictionary so we could print out the type of results +00:33 and we could also print out the results themselves +00:35 so if we do that, notice we get a dictionary and here +00:38 we have the keyword and then we have the hits, +00:41 which is a list of objects that have titles. +00:45 Let's try to print out, let's try to return those +00:47 and then at the program level, print them out. +00:50 So, get rid of that and we'll just return +00:52 results.get hits. +00:56 Right, we don't care about the extra data, +00:57 we just want the results. +00:59 And then over here, we're going to get those results back +01:03 and we can say, for are in results print, +01:07 let's just print out the title. +01:09 Title is, let's, keep going with the f-strings, huh? +01:15 Say are .get, now notice we have to treat this +01:18 as a dictionary, we'll prove this in a moment, +01:22 like that. +01:23 Okay, let's run this and see what we get. +01:27 Man, look at that, title. +01:29 Blade Runner, Maze Runner, Kite Runner, +01:31 something else, Logan's Run and so on. +01:34 Awesome and we could even do a little +01:36 bit better, we could say, print, +01:39 there are length of results, +01:46 movies found, something like that. +01:50 There are six movies found, okay. +01:53 Excellent, you might want to do a little test movie, +01:55 1 movie, 2 movies, 0 movies, things like that +01:58 but we're going to just keep it always plural here. +02:01 Alright so this is pretty good but notice this, +02:04 I'm not loving this at all and the more we have to write +02:07 out there, we could say something like that and IMDB score, +02:15 let's say we're going to write +02:16 that out so we'll say, are .get what, +02:18 what do you put here? +02:20 I have no idea. +02:21 It's completely annoying that you get no help +02:23 about this, we could go look this up but let's go +02:26 and actually improve that in the next video. diff --git a/transcripts/43-search-api/8.txt b/transcripts/43-search-api/8.txt new file mode 100755 index 00000000..29868ff9 --- /dev/null +++ b/transcripts/43-search-api/8.txt @@ -0,0 +1,98 @@ +00:00 Let's make two quick improvements before we wrap up +00:03 this application. First, we're always searching for runner. +00:05 How exciting is it to always run this program +00:08 and just get the same results? +00:09 Let's actually make this a thing that the users can input. +00:13 So we'll begin by creating a variable. +00:14 We could just go and type a variable name, assign the value +00:17 and put it over here, and use PyCharm to refactor. +00:20 Say I want a variable called keyword. +00:22 That's pretty cool. +00:23 Make sure it still runs, it does. +00:25 But let's actually go and say input. +00:27 We'll ask the user for input, and we'll give them a prompt. +00:31 We'll say keyword of title search for movie, +00:34 or something like this. +00:36 So now when we run it down here I can search for away +00:39 and we get The Runaways. +00:41 I can search for runner and we should get Bladerunner, +00:46 and we can search for fight, Fight Club, whatever. +00:50 Whatever we want to search for, we can now do that. +00:52 This is already really awesome, but notice the API is, +00:56 I'm going to call it crummy. +00:57 So we're going to fix that with one more thing. +00:59 We're going to use this thing called collections.namedtuple +01:03 So down here I'll say I'm going to define this type that +01:05 represents a movie. +01:07 It's going to be a collection.namedtuple, and the way it works +01:10 is you say the name that it thinks its own name is, +01:13 and then you say all the fields that go in there. +01:16 Now this turns out to be quite a pain, so let's go back +01:19 over here and see what we get. +01:21 IMDB score, we have a rating, an we have all these things. +01:24 So this is the typical value here, it's going to look like this +01:29 So in order for this to work well, we have to have all these +01:32 values listed in series over here. +01:35 So, I'm just going to type this in, then I'll speed it up. +01:43 Phew, there I've typed them all in and I'll maybe do a few +01:45 line breaks here just so it fits on the screen. +01:48 I just typed in the top level elements here. +01:50 So what we can do, is we can actually instead of just +01:54 churning JSON results, we can actually go over them +01:57 and return these types, and we'll see why that's a benefit +02:00 in just a second. +02:01 So we'll say this, we'll say for our end results, +02:06 you know, the hits, maybe H, I don't know. +02:09 We're going to need a list, going to say movies, that's a list. +02:12 I'm going to put this in here, so we'll say movies.append +02:15 and we need to append one of these movies. +02:18 So we can create a new one and we have to type all of these +02:21 values in here. +02:22 We have to say IMDB code equals R.get IMDB code. +02:26 Title equals R.get title, and so on. +02:31 Or, there's a way to unpack a dictionary, which is what this +02:34 is, back into keyword arguments with the names being the +02:38 keys just like that. +02:40 And, the way you do that is you +02:42 say **, the dictionary name. +02:44 So it's as if you said IMDB code equals whatever value it +02:47 has for IMDB code. +02:49 Title equals whatever value it has for title. +02:52 It's just a super short, simple way to do that. +02:54 So now if we return movies, up here is not going to work the +02:58 same, but now we can just say R.title, and things like that. +03:05 HasScore, take that little bit away. +03:09 HasScore, let's say,r., what did we call it? +03:13 IMDB Score, that, now let's try that. +03:19 Now we are going to search for runner, stick with that. +03:22 Boom! Look how cool that is. +03:24 Now, we're still not where we quite really wanted to be. +03:26 If I hit dot, we get not, so as in not helpful! +03:31 One final trick of what we're going to do, let's go over here +03:34 and we can use what's called type hint in Python . +03:38 Python is a dynamic language, it has no syntactical typing, +03:42 but you can give the editors hints, and I can say this +03:44 is actually a string, so you say colon type name and the +03:48 return value is a list which is actually defined in a +03:52 typings module, so got to import that. +03:55 So we want typings.List. +03:56 Notice the, let's put at the top here. +03:59 And it's going to be a list of movies like this, okay. +04:03 So with a little bit of a hint, I can come over here and +04:07 now I type r., look at that, director, duration, +04:10 IMDB code, IMDB score. +04:13 Let's just add one more. +04:15 With code r.code, now that's the way we like to write. +04:22 All the help we can get. +04:24 Let's search one more. +04:26 Anything on computer, of course! +04:28 Hackers with code TT whatever HasScore 6.2. +04:32 Awesome, there you have it. +04:34 This is how we can consume the movie API. +04:37 When you've broken apart into our, our sort of user +04:41 interaction bit of code here, our API access code here. +04:46 We use requests to actually get the data and convert it +04:51 to JSON and we used a namedtuple to help package it up into +04:55 something that makes more sense to our program, as well +04:58 as adding a little type hints, so that the editor actually +05:01 leverages that help we gave it. diff --git a/transcripts/43-search-api/9.txt b/transcripts/43-search-api/9.txt new file mode 100755 index 00000000..784aa281 --- /dev/null +++ b/transcripts/43-search-api/9.txt @@ -0,0 +1,32 @@ +00:00 Let's review the concepts in our search API. +00:03 We started out by consuming the MovieDb service, +00:06 at movie_service.talkpython.fm. +00:10 We saw that we could get postmen, +00:12 which is a really nice way to +00:14 explore and interact with the API, +00:16 the full spectrum of HTTP APIs. +00:19 And we use requests in Python to actually +00:22 do the direct interaction in code. +00:26 When we zoom down to the code level, +00:28 you can see that we start by importing requests. +00:31 We're going to need to use this library, +00:32 so we got to import it, and remember we had to install it +00:34 with pip as well, or make it part of the requirements +00:38 and PyCharm helped us, +00:40 but we could have also said pip install -r requirements.txt +00:43 and achieve the same effect. +00:45 Then we're going to go and actually download the data. +00:49 Take the URL and say, request.get URL. +00:51 Like, this is a response, this is what we work with +00:53 for the rest of the time. +00:55 We want to make sure everything worked, +00:56 so we're going to check for success with raise for status, +00:59 and then we want to take that string of JSON +01:02 and turn it into a Python dictionary. +01:04 So we do that by calling .json. +01:07 Notice if the format is not actually JSON, this will crash. +01:10 But it was JSON in our example, so it completely worked. +01:13 After this it's plain Python, +01:15 there's no more HTTP service involved, +01:17 we just have a Python dictionary, +01:19 and you work with it like you do regular data in Python diff --git a/transcripts/46-beautifulsoup4/1.txt b/transcripts/46-beautifulsoup4/1.txt new file mode 100755 index 00000000..605909b9 --- /dev/null +++ b/transcripts/46-beautifulsoup4/1.txt @@ -0,0 +1,17 @@ +00:00 Okay, everyone welcome back. +00:02 This is web scraping with BeautifulSoup 4. +00:05 I'm Julian Sequeira, again, +00:07 and just a disclaimer, this has nothing to do with dinner. +00:11 This has everything to do with web scraping. +00:14 If you're hungry, go get something to eat. +00:16 If not, crack on, because what we're going to do now +00:19 is this is going to be a very quick module. +00:21 We're going to run through +00:23 pulling down a webpage with requests, +00:25 not in any detail because we've done that before. +00:28 Then we're going to parse that webpage information +00:32 with BeautifulSoup 4. +00:33 You can do some really cool stuff, +00:35 so I'm very excited to show you this one. +00:37 Just set up your environment and the next video, +00:40 and then we'll get straight to some code. diff --git a/transcripts/46-beautifulsoup4/2.txt b/transcripts/46-beautifulsoup4/2.txt new file mode 100755 index 00000000..fec5f24c --- /dev/null +++ b/transcripts/46-beautifulsoup4/2.txt @@ -0,0 +1,25 @@ +00:00 Okay, we just have a little bit of setup +00:02 to do for this one. +00:03 First things first, as always, +00:05 let's create our virtual environment. +00:09 Same thing, venv. +00:12 Once that's installed, we need to install +00:14 Beautiful Soup 4, of course, +00:16 but we also need to pip install requests. +00:19 So let's do that quickly. +00:21 We'll just activate, +00:24 the virtual environment here. +00:27 Okay, now we can do pip install requests, +00:32 and once that's done, we can then do +00:35 pip install bs4 +00:39 You can probably type in beautifulsoup4, +00:41 but bs4 is fine, and that's it. +00:45 We have that installed. +00:46 The last thing I'd like you to do is just create +00:50 a file called scraper.py, +00:53 and throw that into your project directory. +00:56 When you run it, it will look something like this, +00:58 scraper.py, just here. +01:01 Okay, and that's it. +01:02 So once you've got all that set up, +01:04 launch your file and let's move on to do some coding. diff --git a/transcripts/46-beautifulsoup4/3.txt b/transcripts/46-beautifulsoup4/3.txt new file mode 100755 index 00000000..2ec13fa3 --- /dev/null +++ b/transcripts/46-beautifulsoup4/3.txt @@ -0,0 +1,45 @@ +00:00 I just thought I'd give a quick overview +00:02 for anyone who hasn't dealt with Beautiful Soup 4 before. +00:06 So if you haven't, feel free to keep watching, +00:09 but if you have, +00:10 skip on over because I'm just going to be repeating myself. +00:13 Now, Beautiful Soup 4 allows you to parse web pages. +00:18 Okay, we've all dealt with requests by now +00:21 and we know that we're using requests, +00:23 we can pull down the code behind their web page, right? +00:27 And we can then use Beautiful Soup 4 +00:30 to parse that data. +00:32 All right, I'll tell you what I mean. +00:34 So, let's view the page source +00:36 for our PyBites Code Challenges page. +00:40 And here you'll see all of your HTML. +00:44 Now, if I wanted specifically +00:46 to get all of our code challenge names +00:50 and just put them in a list to make +00:52 in some sort of an email +00:54 or whatever application I can think of, right. +00:57 Well, how am I going to do that? +00:59 If you go into the page source, +01:01 you need to find, +01:02 the first thing you need to do +01:03 is you need to find that data in the code +01:07 and here it is. +01:08 It's an unordered list +01:09 with ID of article list, and a class of article list. +01:13 Okay, and then all of our different challenge headers +01:18 are stored in list elements, okay? +01:22 Now, with that information in hand, +01:25 we can then use Beautiful Soup 4 to search this page, +01:29 remembering that requests will pretty much pull down +01:32 this page looking like this, +01:34 and Beautiful Soup 4 will parse that, +01:37 and we can then tell it what to look for. +01:40 And now you can start thinking, +01:42 imagining the cool things you can do with this. +01:44 So, we can skip all of this junk up here, +01:48 all of this code that we don't care about, +01:50 and drill straight down to the list that we do care about. +01:54 And you can use this on any site that you can think of. +01:57 You can search by all sorts of different criteria. +02:00 And we're going to show that in the next video. +02:04 So, get excited, because this is really, really fun stuff. diff --git a/transcripts/46-beautifulsoup4/4.txt b/transcripts/46-beautifulsoup4/4.txt new file mode 100755 index 00000000..f1acd247 --- /dev/null +++ b/transcripts/46-beautifulsoup4/4.txt @@ -0,0 +1,186 @@ +00:00 Time for some code. +00:02 We need to think about what we're going to do first. +00:05 The first thing we need to do is actually pull down +00:07 our website, and what are we going to use for that? +00:10 We're going to use requests because we pip installed it, +00:13 didn't we, that was a bit of a dead giveaway. +00:16 We're also going to import bs4. +00:19 That's it. +00:22 Let's specify the actual URL that we're going to be +00:25 dealing with here, I'm just going to copy and paste it. +00:28 This is the URL of +00:31 our Pybites projects page. +00:34 Looking here, +00:37 we have out PyBites Code Challenges. +00:41 What we're going to do with this one is bring down +00:44 all of these PyBites +00:47 projects headers, +00:48 so, our 100 days. +00:50 Our 100 Days Of Code, our 100 Days Of Django. +00:53 These different headers. +00:54 We're going to pull all of those down +00:56 and we're just going to use that as a nice, +00:58 simple example for this script. +01:03 Let's start off our code with the standard +01:08 dum dum. +01:11 Now, what are we going to do? +01:12 The first thing, obviously, as I said, is to pull down +01:15 the website, so let's create a function for that. +01:19 def pull_site, nice and creative. +01:24 We're going to use requests, so I'm going to do this +01:26 really quickly +01:28 just so that we can get a move on +01:30 because we've dealt with requests before. +01:33 So, requests.get URL. +01:36 That will get the page and store it +01:38 in the raw site page object. +01:41 So, raw site page .raise_for_status +01:47 Now, this is just to make sure that it works. +01:50 If it doesn't work, we'll get an error. +01:53 And then, we're just going to return, raw site page. +01:57 Nice and easy. +02:00 Let's just assign that to something +02:02 down here called site. +02:04 This will +02:06 assign the raw site page +02:09 to a variable called site. +02:13 Now, we'll record a video after this explaining why +02:16 this is not a good idea, what we're doing . +02:19 But, for now, as just a nice little explainer, this will do. +02:25 Let's create another function. +02:27 This function we're going to call scrape. +02:29 It's going to be used against our site object. +02:37 We need to think ahead a little bit. +02:39 I'm going to think ahead by putting this list here. +02:42 If you think about our page, +02:47 as we pull this data out of the page, these headers, +02:51 we need to store them somewhere, don't we? +02:53 We must store them in a header list. +02:58 We create the empty list. +03:00 Now we get to the Beautiful Soup 4 stuff, +03:03 and this is really, really easy, so don't worry +03:06 if you don't wrap your head around it. +03:08 But it's only a couple of lines of code, +03:09 which is why we all love Python, right? +03:13 We're going to create a soup object, +03:15 and it's not a bowl of soup, it's just a normal object. +03:19 bs4.BeautifulSoup4, +03:23 .BeautifulSoup, sorry. +03:26 We're going to take the text of the site. +03:29 So, site.text, we're going to take that. +03:33 That's going to be called against our Beautiful Soup 4. +03:38 We're going to use the Beautiful Soup 4 +03:40 HTML parser +03:43 in order to get our sort of HTML code +03:48 nicely into this soup object. +03:52 Once we do that we have our soup object +03:56 and HTML header list. +04:01 This is going to be a list of our HTML headers. +04:05 You can see what we're doing. +04:06 This is already really, really simple. +04:09 We've taken +04:11 Beautiful Soup 4 and we've told it +04:14 to get the text of the site using the HTML parser +04:18 because site is going to be a HTML document, +04:21 pretty much, right? +04:23 We're going to store that in soup. +04:27 We're creating an object here +04:30 that is going to be... +04:32 I'll show you. +04:33 HTML header list equals +04:36 soup.select. +04:40 What are we selecting? +04:41 The select option here for soup, +04:45 it allows us to pull down exactly what we need. +04:48 We get to select something out of the HTML source. +04:53 Let's look at the HTML source again. +04:57 We'll go view page source. +05:01 We'll get to these headers. +05:03 The first header +05:05 is called +05:07 zero.PyBites apps. +05:11 We find that on the page, it's going to be +05:13 in a nice little h3 class. +05:16 What's unique about it, and this is where you really +05:19 have to get thinking and analyzing this page, +05:22 the thing that's unique about all of our headers here, +05:25 so, here's zero, +05:27 here's number one down here, +05:30 but they all have the project header CSS class. +05:36 Playing with bs4 does need some tinkering. +05:40 Occasionally, you'll find someone will have reused +05:43 the same CSS class somewhere else +05:46 in the same page, so when you select it you'll get more +05:50 than just what you wanted. +05:51 But in this case, I know, because this is our site, +05:54 we've only used project header against these headers +05:59 that we want to see, these ones here. +06:03 We're going to select everything that has +06:07 the project header class. +06:10 Let's copy that. +06:11 We'll go down here, this is what we're selecting. +06:13 We have to put the dot because it is a CSS class. +06:18 And let's see it. +06:19 All this has done is we've created the soup object +06:23 of the site using the HTML parser, and then we've selected, +06:28 within our soup object, everything with the CSS class +06:32 project header. +06:34 We've stored those, we've stored everything that it finds +06:37 into HTML header list. +06:41 Easy peasy. +06:43 Now all we need to do is iterate over this and store +06:48 the information that we need into this header list. +06:53 We'll do that. +06:54 We'll go, for headers in HTML +06:59 header_list +07:02 we're going to go header_list.append, +07:06 as we know how to do that. +07:08 headers.get text. +07:13 We're saying, just get the text. +07:17 Just to show you what that means. +07:19 Everything in here, in the class project header, +07:25 we actually got the whole h3 tag. +07:29 That soup select pulled the whole tag, +07:32 but all we wanted was the text. +07:37 That's what the get text option does, that's what this +07:40 get text does right here. +07:41 It strips out the tags, the HTML code, and gets you +07:46 just the plain string text that we asked for. +07:51 That's it. +07:52 We want to see these headers, so let's just quickly create +07:55 another for loop here. +07:57 For headers in header_list +08:02 print, ooo, what did I do there? +08:05 Print headers. +08:07 And that's it. +08:09 Save that, and what this will now allow us to do +08:12 is print out the headers that we have stored +08:16 in header list in this for loop here. +08:20 Let's have a look at that and see what it looks like. +08:22 Silly me, I've forgotten one thing, we actually have to call +08:26 our scrape function. +08:28 So now we will write scrape +08:33 site. +08:34 Simple. +08:36 Save that, and let's give it a crack. +08:39 I'll just move the screen to the right. +08:42 There's my command prompt. +08:44 Let's just run Python scraper.py. +08:48 Hit Enter. +08:51 And it worked, look at that. +08:53 There's that plain text that we asked for with the get text. +08:58 We got the first header, PyBites apps. +09:02 We got second header 100 Days Of Code, 100 Days Of Django, +09:06 and so on, and so forth. +09:08 Now we have a list with just our headers. +09:11 This is really cool. If you think about it, +09:12 you could use this to create a newsletter. +09:14 You could use this to save your website's headers for +09:18 who knows what, to print out in a list and stick on the wall +09:20 as a trophy. +09:22 But this is the idea of Beautiful Soup 4. +09:25 You can get a website and you can just strip out +09:28 all the tags and find the information you want, +09:31 pull it out, and then, do things with it. +09:33 So, it's really, really cool. +09:35 The next video we're going to cover some more interesting... diff --git a/transcripts/46-beautifulsoup4/5.txt b/transcripts/46-beautifulsoup4/5.txt new file mode 100755 index 00000000..c2219cf0 --- /dev/null +++ b/transcripts/46-beautifulsoup4/5.txt @@ -0,0 +1,39 @@ +00:00 Alright, one quick public service announcement +00:02 regarding this code that we've just written. +00:04 This section here, the pulling of the site. +00:09 Not actually kosher to keep that in this script. +00:12 The reason for that is we don't want +00:15 to submit a request to a website +00:17 every time we want to scrape some data. +00:20 We might run a scraper like this at a different +00:23 interval set to actually pulling the website. +00:27 The reason for that is, you think about it, +00:29 not every site is going to update every few minutes. +00:32 Not every site is going to update every day. +00:35 So if you keep pinging that site with a request, +00:39 you're going to very quickly spam them. +00:42 You might even get yourself blocked. +00:43 And you could use up their bandwidth limit. +00:46 There are certain websites that, you know, +00:48 can only support a certain amount of hits per +00:51 per minute, alright? +00:52 And if you keep doing that, you're going to make the website +00:56 that you enjoy viewing so much pretty unhappy. +00:59 So the best practice here is to put all of this +01:04 into a different script, run that on a cron job +01:06 at a different interval +01:08 or whatever other automated way you want to do that, +01:11 and then using Beautiful Soup 4, +01:15 point at the downloaded HTML file +01:18 or at the page that you have pulled down +01:22 from requests, alright. +01:24 Nice and easy. +01:26 It's actually much more pleasant for everyone +01:29 to do it that way, and I would totally recommend doing it. +01:32 The only reason we've done it this way right now +01:34 is just for demonstration purposes. +01:36 It's much easier. +01:38 But in production, definitely put your requests +01:41 in a different script and use Beautiful Soup 4 +01:44 to talk to a static file, not the actual URL, +01:48 unless of course it's a one off thing. diff --git a/transcripts/46-beautifulsoup4/6.txt b/transcripts/46-beautifulsoup4/6.txt new file mode 100755 index 00000000..bae97753 --- /dev/null +++ b/transcripts/46-beautifulsoup4/6.txt @@ -0,0 +1,186 @@ +00:00 Alrighty, now we want to actually do something interesting +00:04 so let's go to our article page here on PyBites. +00:08 I want to do something like pull down every single article +00:12 name that we have written. +00:15 Very, very daunting so the first thing we want to do +00:18 is view the page source. +00:22 If you, just a quick tip, if you ever get stuck +00:24 and you're not too sure what is what in this page here, +00:30 you can click on inspect. +00:34 As you scroll down through inspect through the code +00:37 the HTML code within the inspect, you'll actually be able +00:41 to see what is which part of the page. +00:45 We need to lower this down here, lower this down here. +00:49 And here is our HTML code that runs the page. +00:53 As we hover down through these little tabs, +00:56 these little arrows here, these drop downs, +00:59 you'll see parts of the page get highlighted. +01:02 That's how you know which code is actioning which part +01:06 of the page. +01:07 We know this is our main here. +01:09 We find the main tag and sure enough that's highlighted. +01:13 Now we can click on article here. +01:15 You can see that's highlighted the section in the middle +01:17 that we want, right? +01:19 We can keep drilling down. +01:21 Here is the unordered list, ul, that is our list +01:25 of article names. +01:27 Then here are all the list elements, the li. +01:30 Open them up and there is our href link +01:37 and the actual name of the article. +01:40 That's what we want to pull down. +01:42 We can look at that quite simply here. +01:45 But in case this was a much more complex page +01:47 such as news websites and game websites and whatever, +01:51 you might want to use that inspect methodology. +01:56 Alright, now that we know we want to get the unordered list, +02:01 let's do some playing in the Python shell. +02:05 I've started off by importing Beautiful Soup 4 +02:08 and requests. +02:09 I've already done the requests start get +02:11 of our articles page. +02:14 We've done the raise_for_status to make sure it worked. +02:17 Now let's create our soup object. +02:21 So soup equals bs4.BeautifulSoup, +02:27 oops, don't need the capital O. +02:29 site.text. +02:31 So this is very similar to our other script. +02:33 And HTML parser. +02:38 Alright, and with that done what can we do? +02:41 We can search. +02:43 We don't have to use that select object. +02:44 That was very specific and that was very CSS oriented. +02:48 But now we're going to look at tags, alright? +02:50 Back on our webpage, how's this for tricky? +02:53 The individual links don't have specific CSS classes. +02:59 Uh-oh, so how are we going to, how are we going to find them? +03:02 Alright, we're going to have to do some searching right? +03:05 How about we search for the unordered list. +03:10 We could just do soup.tagname, isn't that cool? +03:14 Now you just have to specify the tag that you want to find. +03:17 You don't even have to put anything around it. +03:19 It doesn't need to be in brackets, nothing special. +03:22 Soup.ul. +03:24 Hang on a minute, what do we get? +03:27 Now look at this, we got an unordered list. +03:30 Ah but, we got this unordered list. +03:36 We got the actual menu bar on the left. +03:38 We didn't get this one. +03:41 Now why is that? +03:43 That is because soup.ul, +03:47 or soup.tag only returns the very first tag +03:52 that it finds that matches. +03:55 If we look at that source code again you'll find +03:58 we actually have another unordered list on the page. +04:02 That is our menu here, okay. +04:06 That's not going to work using soup.ul is not going to work, +04:09 because we're only pulling this one here. +04:13 What do we need to do to find the next one? +04:16 Well we need to do a little bit more digging. +04:19 We could try the soup.find_all options. +04:26 Let's see what that returns. +04:27 So soup.find_all. +04:30 Then we specify the name of the tag that we want. +04:33 We're going to specify ul. +04:35 Let's hit enter and see what happens. +04:37 Look at that, we've got everything. +04:40 We got all of the article names. +04:42 Let's scroll up quickly here. +04:44 But no we also got the very first unordered list as well. +04:50 We got that same menu bar. +04:52 How do we strip that out? +04:53 Well, I suppose we could go through and do regex +04:58 and all sorts of crazy stuff. +05:00 But Beautiful Soup actually let's you drill down +05:03 a little bit further. +05:05 What makes our unordered list here unique? +05:10 On our page, on PyBites, it's the only unordered list +05:15 that lives within our main tag. +05:19 Look up here, here's main. +05:22 That's the opening of main and we saw that closing of main +05:24 down on the bottom. +05:25 And look, it's the only unordered list. +05:28 What we can do is we can do soup.main.ul. +05:37 You can see how far we can actually drill down. +05:39 Isn't this really cool? +05:41 We run that and what do we get? +05:45 Let's go back up to where we ran the command +05:47 and from soup.main.ul, we got the unordered list +05:51 and we got all of the list elements with the atags, +05:56 the hrefs, and the actual plain text in the middle. +06:01 There we go, we've already gotten exactly what we want. +06:05 But we actually don't need all of these tags +06:09 around the side. +06:10 We don't even need the URL. +06:13 How are we going to get around that? +06:15 Well let's see what we can do. +06:18 We don't actually need the unordered list, do we? +06:21 We don't need this whole UL tag, +06:23 we only need the list elements and we know +06:26 from looking at the code that these are the only +06:30 list elements within the main tag. +06:33 Main tag ends here, there's no more list elements. +06:36 What if we do that same, find_all, but just on list. +06:42 Let's go soup.manin.find_all, +06:46 because we're only going to search within the main element. +06:53 There we go, look at that. +06:54 It's not formatted as nicely as the other one +06:56 that we saw, but it is the information that we want. +07:01 You've got your list elements, you've got a URL, +07:04 and they you've got your title, and then it closes off. +07:09 Let's give ourselves some white space to make this +07:13 a little easy to read. +07:15 What can we do, we want to store all of that. +07:18 Let's store that in a list called all_li. +07:22 We're getting all of the li options. +07:26 We do soup.main.find_all li. +07:34 Now all of that is stored in all_li. +07:39 Now how cool is this? +07:42 The text in here in each one of these list elements +07:49 is actually the stream, right? +07:51 You know that, we discussed it in the previous video. +07:54 What we can do, we can do for title in all_li +08:01 I guess for items for each one of these items. +08:04 I shouldn't really use the word title. +08:06 Let's actually change that to be for item +08:10 in all_li. +08:13 It's this we're going for each one of these +08:18 just so you can follow along. +08:21 What do we want? +08:22 Well we want just the subject line. +08:24 We just want this string, we just want the text. +08:27 How do we specify that? +08:29 We go print, now this is going to be really easy +08:33 and I'll tell you what, it's just crazy sometimes +08:36 how simple they make it. +08:39 item.string, and that is it. +08:44 Can you believe it? +08:45 To strip out all of this, all the HTML and all we want +08:50 is that, item.string. +08:53 You ready? +08:58 How cool is that? +08:59 We've just gone through I think it's like 100 objects, +09:03 100 articles that we've written. +09:05 We've just printed out all the names. +09:07 This would be so cool to store in a database +09:10 and check back on it from time to time. +09:13 Email it out, keep it saved somewhere. +09:16 I love this sort of stuff. +09:18 There you go, we've look at quite a few things here. +09:22 We've looked at find_all. +09:24 We've looked at using just a tag name, +09:30 and we've looked at using a sort of nested tag name. +09:36 So you can actually drill down through your HTML document +09:40 which is super cool to help you find nested +09:44 or children objects within your HTML. +09:48 That's Beautiful Soup 4. +09:50 That's pretty much it and it's absolutely wonderful. +09:55 There's obviously so much more to cover +09:57 and that could be a course in itself. +09:59 The documentation is wonderful. +10:02 Definitely have a look through that if you get stuck. +10:04 But for most people this is pretty much the bread +10:08 and butter of Beautiful Soup 4, +10:10 so enjoy it, come up with cool stuff. +10:12 If you do make anything cool using bs4, let us know. +10:16 Send us an email or something like that. diff --git a/transcripts/46-beautifulsoup4/7.txt b/transcripts/46-beautifulsoup4/7.txt new file mode 100755 index 00000000..608e67d7 --- /dev/null +++ b/transcripts/46-beautifulsoup4/7.txt @@ -0,0 +1,99 @@ +00:00 And that my friends, is the basic overview +00:03 of web scraping with Beautiful Soup 4. +00:06 There is so much to it as I said, +00:07 but this should get you up and running, +00:09 and I hope it was enough to really get you excited +00:12 about web scraping and get you creating some cool stuff. +00:16 So just a quick re-cap of everything we did. +00:20 Well we scraped a website, and the first thing we did, +00:24 was we imported Beautiful Soup 4, +00:26 simple, simple, simple stuff. +00:29 Now, we then scraped the site, okay, +00:35 and then we created an empty header list, +00:38 all right, the first step was to create an empty list +00:41 so that when we got all the headers, +00:43 we could pop them there. +00:46 All right, now this is the important part. +00:47 We're creating the soup object, +00:49 the Beautiful Soup 4 object and we do that by +00:53 running that bs4.BeautifulSoup +00:56 and we tell it to get the text of the site, site.text +01:00 and pass it using the HTML passer. +01:04 All right, and then, we decided to select, +01:09 okay so we're being very specific here, +01:13 we were selecting the css .projectheader class, +01:18 so anything in our document; in our HTML document; +01:22 that had that class was going to appear, +01:25 and we were very lucky, we did the research, +01:27 and we found that our H3 headers, +01:30 were the only tags that use that CSS class, +01:35 okay, that's why it could work. +01:37 So just be careful again in case you pull a class +01:40 that quite a few HTML objects are using, +01:44 'cause then you're going to get a lot of unexpected results. +01:48 All right, and then after that +01:49 the only thing worth noting here, +01:51 is as we were creating our list, our header list, +01:55 we were using get text on all of those headers, +01:59 on all of those items that we selected +02:02 using the projectheader class, to just get the text, +02:06 we wanted the get text option there. +02:09 Okay, and that's the scraping a website, +02:13 pretty simple, next we did some funky command line stuff, +02:17 using the Python Shell, and that was just to demonstrate +02:21 some very simple, yet effective Beautiful Soup 4 features. +02:26 All right, so the first thing we did was +02:28 we imported bs4 of course and then we +02:31 created that soup object again, so skipping through that. +02:35 The first cool thing we did is we were able to +02:37 search the entire site, that soup object that we created +02:42 for the very first ul tag, +02:45 remembering that this sort of search, +02:48 only brings up the first tag, okay +02:50 and that didn't work for us. +02:52 Then we wanted to find all of the ul, +02:55 the unordered list tags and while that works, +02:59 that brought up everything and again, +03:01 that's not what we wanted, so find_all, +03:04 will search the entire HTML site, for that specific tag. +03:12 All right, now, this time we decided to +03:15 drill down into the main tag, so as we've covered, +03:19 you have that nice little nested feature here, +03:23 where you search soup for the main tag +03:25 and then we went, within the main tag, +03:27 drilled down to the unordered list, +03:30 and the first unordered list it pulled, +03:32 was the list we wanted, but again it had ul tags in there +03:37 which we didn't actually need for our purposes. +03:40 So then we did something very similar, +03:43 but in this case we wanted find_all, +03:46 because if we had just specified soup.main.li, +03:51 we would have only gotten the first list object within main, +03:55 so this time we go soup.main.findall list tags, +04:01 find all of the li tags within that HTML document, +04:06 okay, that fall underneath the main tag. +04:10 And then we stored all of that into an object called all_li, +04:17 and then we just iterated over it using a for loop, +04:20 pulled all of the items within there, +04:23 the individual li tags, and then we used .string +04:28 to simply pull, that plain text, the plain text, +04:32 the headers of our articles and that was it. +04:35 Nice and easy, pretty simple stuff, +04:37 the more practice you do, the better you'll get. +04:39 And that was it, so your turn, very cool stuff. +04:44 Go out, I reckon the challenge for you should be +04:47 to go out to one of your favorite sites, okay, +04:50 find maybe the news article section +04:54 and try and pull down all of their news articles. +04:57 Maybe just on one page, maybe across multiple pages, +05:00 do something like that. +05:02 Even try and pull, rather than just the header, +05:04 maybe try and pull the very first blurb of the news article. +05:09 Do that maybe it's a game news website, +05:12 could be anything you want, but just give it a try. +05:15 This is now your chance to go out there +05:17 and try and pass a website. +05:20 If you want a really fun one, +05:21 try going to talkpython.fm and try +05:24 and pull down maybe all the episodes. +05:26 Either way, have fun, keep calm and code. diff --git a/transcripts/46-beautifulsoup4/8.txt b/transcripts/46-beautifulsoup4/8.txt new file mode 100755 index 00000000..c88bc1ef --- /dev/null +++ b/transcripts/46-beautifulsoup4/8.txt @@ -0,0 +1,54 @@ +00:00 This is the readme file for beautifulsoup4, +00:04 for Day 46 to 48 on web stripping. +00:08 Now, day N the first day you're going to be +00:11 working on this course, I would like you be watching +00:15 the video on setting up the environment, +00:18 getting a quick overview of beautifulsoup4. +00:21 This is if you have no familiarity on +00:23 what it is and how it works, and then +00:27 build your first Beautiful Soup 4 scrapper. +00:30 It's actually not too much work, but there is a bit +00:34 of theory there, with the overview, +00:36 and you should be able to get it up and running, +00:38 and then give it a crack yourself, okay? +00:42 Watch the videos first, because if you're not familiar +00:45 with it, it does help to watch it start to finish, okay? +00:49 Pull your first site, use the example site +00:51 in the video, or if you really want to +00:54 challenge yourself, grab another one. +00:57 Day 2, what I'd like you to do is watch +01:00 this video on requests best practice, okay? +01:04 This is covering a little thing that people tend to +01:07 do with requests that is actually the wrong way to do it, +01:11 and we discuss the best practice for actually +01:14 doing it, I won't give it away now. +01:16 Then, what I'd like you to do is follow +01:19 along with this video, detailed +01:21 Beautiful Soup 4 scrapping and searching. +01:25 This will actually go through how to do some +01:28 targeted searching, so to speak, +01:31 of the data that you pull down and scrape, okay? +01:34 It can be a bit tricky and a bit frustrating +01:37 to find exactly what you want, +01:39 but stick with it and you'll get there in the end. +01:42 And Day 3, as usual, it's your turn. +01:44 So, you've figured out how to scrape a website, +01:48 you can pull the data that you want, +01:50 so now I'd like you to actually do something with it, okay? +01:54 So store it database, display it in something +01:57 like a Flask app or a GUI, automate it by +02:00 emailing it, do whatever you can think of, right? +02:03 So, come up with something and do that. +02:07 If you can't think of anything, you could try this one. +02:10 I've added an extra option here for you to try, +02:13 which is to find a site that looks complex. +02:17 Think of something that maybe has Flash, +02:19 or whatever other animations on the website. +02:23 Pinpoint a data sample, so just something on +02:25 the website you think that could be interesting, +02:28 and then see if you can extract +02:30 it using Beautiful Soup 4, okay? +02:34 So that's it, give anything like that a try. +02:36 Day 3 is your freestyle, free-for-all, +02:39 do whatever you want, and just have a good play. +02:42 And, move on to the videos and get started. diff --git a/transcripts/49-measuring-perf/1.txt b/transcripts/49-measuring-perf/1.txt new file mode 100755 index 00000000..08928bb5 --- /dev/null +++ b/transcripts/49-measuring-perf/1.txt @@ -0,0 +1,21 @@ +00:00 As you advance further in your Python projects, +00:03 you're inevitably going to hit a point +00:05 where you write some code and it's just slower +00:08 than you want it to be. +00:09 This happens all the time, +00:11 when you're doing scientific computation, +00:13 you're calling services, +00:14 maybe you're talking to a database. +00:16 It really happens a lot on the web 'cause, +00:18 for popular websites, performance is critical. +00:21 We're going to spend the next couple of days focusing +00:24 on how to get Python to tell us exactly +00:29 where it's spending its time. +00:31 Making things faster, that's a different problem. +00:33 How do we optimize our code, use the right data structures, +00:36 and so on? That's what you might do after this, +00:39 but this will tell you where things are slow, +00:41 where you need to focus your effort. +00:43 This whole concept is called profiling +00:45 and you'll see a lot of it is built right into Python. +00:47 And there's some great external tools, as well. diff --git a/transcripts/49-measuring-perf/10.txt b/transcripts/49-measuring-perf/10.txt new file mode 100755 index 00000000..44f1eaa8 --- /dev/null +++ b/transcripts/49-measuring-perf/10.txt @@ -0,0 +1,51 @@ +00:00 Now, before I turn you loose +00:01 to go work on the code on your own +00:04 and do your own profiling, +00:06 I want to give you a short warning. +00:08 It's not a major warning, +00:09 but there is an effect you really need to be aware of. +00:13 There's some parallels here with quantum mechanics; +00:15 in quantum mechanics +00:16 we have Heisenberg's uncertainty principle +00:18 where it talks about the more precisely you know +00:21 the position of something, the less precisely +00:24 you can tell its speed and momentum. +00:26 So, by measuring one thing really closely +00:28 you have actually weakened your understanding of the other. +00:31 And profilers are like this as well. +00:33 You have your code operating one way +00:36 and you measure it really deeply, +00:38 actually put tons of hooks into it to do +00:40 this monitoring or porting with cProfile +00:44 and it might actually change the performance of your code. +00:46 So, when you look at those numbers, +00:48 like for example we said our program takes +00:50 610 milliseconds to run. +00:52 Maybe it only takes 400 milliseconds to run, +00:53 but with profiling it takes 600 +00:55 and these effects are not evenly distributed. +00:59 It's not like, "Well, the whole program slows down 20%." +01:01 No. Some of it is barely affected. +01:03 Some of it's massively affected +01:06 and I would say a general rule is: +01:09 the more things you do in small pieces, +01:12 that's affected more. +01:14 The stuff that's kind of pushed into the standard library, +01:16 it doesn't have it's hooks in there. +01:18 So, for example that parse row loop +01:21 looping over every row in CSV +01:23 probably has some affect where as the sort, +01:27 that's one line measured +01:29 and then it's handed off to CPython +01:31 and then it's time when it's back. +01:32 So, there might be a ton of operations in there +01:34 but they're not measured. +01:36 So, just be aware this Heisenberg uncertainty principle +01:39 going on with profilers also somewhat applies to debuggers. +01:43 So, they kind of both apply here +01:45 but in this context we're concerned about +01:47 profilers and timing and it really can have a big affect. +01:50 That said, these profilers are massively helpful +01:54 and much better than your intuition +01:55 on understanding where your code's slow +01:57 and how you should optimize it. diff --git a/transcripts/49-measuring-perf/11.txt b/transcripts/49-measuring-perf/11.txt new file mode 100755 index 00000000..507a5a58 --- /dev/null +++ b/transcripts/49-measuring-perf/11.txt @@ -0,0 +1,24 @@ +00:00 You've seen how profiling +00:01 can make your application faster. +00:04 It turns you into a detective, +00:06 hunting for performance problems in your application. +00:08 Now, it's your turn to work on your applications +00:12 using the cProfile and the techniques +00:14 that you've learned here. +00:15 We're going to start on Day 1 +00:17 by just watching these videos, of course, +00:20 and then picking an application +00:22 that you're going to optimize. +00:23 Pick some app that you've previously built. +00:25 At this point in the course +00:26 you should have built many little applications. +00:28 You can totally pick one of those. +00:29 Or if you've built something outside the course, use that. +00:32 That's all fine, as long as it's the Python app, +00:34 this should work just fine. +00:36 So for today just think about the app +00:38 that you want to work with, +00:39 that you want to try to profile +00:40 and understand the performance, +00:42 and we're going to work on the next two days +00:43 on making it faster. diff --git a/transcripts/49-measuring-perf/12.txt b/transcripts/49-measuring-perf/12.txt new file mode 100755 index 00000000..906becdd --- /dev/null +++ b/transcripts/49-measuring-perf/12.txt @@ -0,0 +1,24 @@ +00:00 Second day, you've already chosen your application. +00:03 So what we're going to do is we're going to use c profile +00:05 or if you're using PyCharm Pro, you can use +00:08 the visual profiling tools there, as well. +00:10 Understand your applications performance. +00:12 So run the cProfile module against your app. +00:16 You can either use the api for very fine-grained stuff +00:19 or just run it against your entire application +00:21 like we saw in the command line. +00:23 Sort probably by cumulative time, cumtime. +00:27 That'll make it much easier to understand +00:29 actually where it's slow. +00:30 So you're job for today is to use cProfile +00:33 to find the five slowest methods in your application. +00:37 Write them down, make a little chart, +00:39 put them in a text file, something like that. +00:40 And be sure to include the millisecond times +00:43 that were recorded. +00:45 That way when you try to improve it on the next day +00:47 you could actually see if that's an improvement +00:50 or maybe even makes it worse. +00:51 So just go through, do a little bit of detective work +00:54 and find the five slowest methods that you control, +00:56 that you might be able to change. diff --git a/transcripts/49-measuring-perf/13.txt b/transcripts/49-measuring-perf/13.txt new file mode 100755 index 00000000..81501c04 --- /dev/null +++ b/transcripts/49-measuring-perf/13.txt @@ -0,0 +1,29 @@ +00:00 Third day, it's time to improve +00:02 the performance of your application. +00:03 You've chosen it. +00:04 You've gone through and found out where it's slow. +00:06 So what you're going to do is focus one by one +00:08 on the five slow functions and try to make it faster. +00:12 Look at it, try to understand where it's slow, +00:14 and if you can change something +00:16 about the way that it works, right, +00:18 in our example we said, well, +00:19 we're parsing the CSV and we're actually converting +00:21 12 columns of data and actually we're only using four. +00:24 Let's just throw away the other eight columns +00:26 because we're never using them, +00:28 and that conversion is entirely wasteful. +00:31 We'll look for things like that. +00:32 Go through each one of the five functions, +00:34 change 'em one at a time, +00:36 rerun the profiler compared against +00:38 your times from the previous day, +00:40 and if it gets better, keep that change. +00:43 If it actually gets slower, forget it. +00:44 Just leave it alone or try something different. +00:46 All right, that's it. +00:47 So now you should have an app that's faster. +00:49 Hopefully, much faster than it was before +00:52 and you now have this new skill +00:54 with profiling to understand +00:55 the performance of Python applications. diff --git a/transcripts/49-measuring-perf/2.txt b/transcripts/49-measuring-perf/2.txt new file mode 100755 index 00000000..1f98271b --- /dev/null +++ b/transcripts/49-measuring-perf/2.txt @@ -0,0 +1,30 @@ +00:00 Now something that will probably +00:01 catch you off guard at some point +00:03 is that your intuition is actually really bad +00:07 for guessing where program is slow +00:09 and where it spends its time. +00:11 This has happened to me many, many times +00:13 and I've been doing programming for a long while. +00:17 Sometimes you get it right, but often you don't. +00:19 So the first thing that you need to do +00:21 before you try to improve +00:22 the performance of your application, +00:24 is measure, measure, measure, and that's profiling. +00:28 So what we're going to do is we're going to run +00:29 a built in command that's built in to Python itself +00:33 to measure where our code is working. +00:35 And we're going to do this in two particular ways. +00:38 We're also going to have some nice output. +00:40 Now in the beginning the output that we're going to work with +00:43 is actually going to be just sort of a +00:45 text table type thing in the terminal +00:48 or just in the program output. +00:50 And at the end, I'll show you actually how to get +00:52 PyCharm to draw these little graphs +00:55 where it shows you we start up program and call main, +00:58 main calls go, and then go is calling these 3 functions +01:01 and even the color tells you where you're spending the time. +01:03 Like, the red is worse than the yellow +01:05 which is worse than the green, and so on. +01:07 So we're going to be able to get this +01:08 kind of output and understanding from our program. diff --git a/transcripts/49-measuring-perf/3.txt b/transcripts/49-measuring-perf/3.txt new file mode 100755 index 00000000..ab4e98d8 --- /dev/null +++ b/transcripts/49-measuring-perf/3.txt @@ -0,0 +1,106 @@ +00:00 Let's take a practical example +00:02 and see how profiling can help us +00:03 understand this performance. +00:06 We previously talked about exploring CSV data +00:10 earlier in the course, +00:11 so we're going to take that exact same code +00:14 and we're going to try to understand it, +00:16 and in fact tweak it a little bit, +00:17 based on what we see in the performance. +00:20 So, let's pull this up here. +00:22 We actually have in our demo code over here, +00:25 under 'Days 49-51' we have two copies, +00:29 and right now they're the same, +00:31 of course the final code'll be changed, +00:32 the starter code is exactly what you're going to see +00:34 which we start with. +00:35 So you can play around with this data over here, +00:37 this is more or less just the end product +00:39 from the CSV section. +00:41 Over here we're going to work on this +00:43 and we're going to try to understand its performance. +00:46 We're going to actually step outside of PyCharm here, +00:50 let me just copy the path to this file, +00:52 there's a couple things we'll need to do. +00:56 And first thing we want to activate our virtual environment. +00:59 What we want to do is we want to use a built in module +01:02 and we can understand the entire program's behavior +01:06 from the outside, +01:07 we don't have to write any code to do this. +01:08 So what we want to do is we want to run cProfile, +01:12 and we want to tell it to sort, +01:14 we'll talk about sorting in a minute, +01:15 we want to run that against program.py. +01:17 How's it going to work? +01:18 Poorly, because it's not a separate program, +01:20 it's just a module in Python so what we need to do +01:23 is say python -m to run the module. +01:26 cProfile, capitalization here, capital 'P' matters. +01:29 Now we're going to give it this, and let's see if that works. +01:32 Okay, great, we got a bunch of gibberish-looking stuff here, +01:35 a lot of things going on about frozen imports +01:37 and all sorts of things, +01:38 and it turns out this is not how we want to look at our code. +01:41 I don't know how it's sorting it but it's not the right way. +01:44 We would like to sort by cumulative time. +01:46 There's basically two things that +01:47 you probably care about here. +01:49 One is per call, which is how much time +01:51 is each one individually spending, +01:54 and I think this is sort of the same thing, +01:56 like how much time is just in this function. +01:58 Not functions it calls, or above, +02:00 but like summed up across the number of calls. +02:04 But I find that by far the most useful one +02:06 is this cumtime, cumulative time. +02:08 So let's go over here, +02:09 and you need to pass the sort parameter, +02:11 but it won't work if you put it over here, -S. +02:15 It needs to be before the script. +02:16 So we'll say '-S cumtime'. +02:18 Try it again. +02:20 Okay, now let's see what we've got. +02:21 A couple of built in imports, +02:23 and notice we're working with research.py and program.py +02:27 so this is some module stuff, this is not a lot we can do. +02:30 But this right here, research.py init, +02:33 this is pretty interesting. +02:35 So this is actually the code that we call to read, +02:38 basically parse the CSV. +02:40 So if we look over here, this init is the thing +02:43 that actually does the loading, the parse row. +02:46 Over here like this we can look for parse row, +02:49 and there's that. +02:50 And we're spending about 300 - about 3 milliseconds +02:55 on this, not super, super long, +02:57 but we're calling a bunch of times. +03:00 Okay, so it turns out that this program's a little hard +03:03 to understand because it's not doing that much. +03:06 This is actually an easier job for complex, +03:09 involved applications I find a lot of times +03:11 because it's pretty clear where it's spending time. +03:15 This one, it's actually really quick. +03:16 But we're still going to analyze it, don't worry. +03:17 I just want to sort of give you the sense that actually this, +03:20 even though it's a simple example, +03:21 it's kind of hard to understand the performance. +03:25 If you want to just run the whole thing +03:26 and see how it works, here you go. +03:28 Just run cProfile, sort by something, +03:30 give a domain script to run, off you go. +03:33 This is one way, but notice when we did this +03:36 there's all sorts of stuff in here that's irrelevant to us. +03:40 For example, initializing the typing module. +03:43 I don't care, we can't control that, +03:45 that's just something we're doing +03:46 to define some definitions. +03:48 You could say 'don't use typing' and that's an option, +03:50 but can you hide that? +03:53 Does importlib bootstrap find and load? +03:56 These things, loading the module, we're spending +03:58 significant time here. +04:01 We can't control that. +04:02 So what we want to do is we want to measure the parts +04:04 that we can really carefully work with and control. +04:07 So we're going to see how to do that using the API from +04:10 within Python and we'll get better answers here. diff --git a/transcripts/49-measuring-perf/4.txt b/transcripts/49-measuring-perf/4.txt new file mode 100755 index 00000000..457d9a91 --- /dev/null +++ b/transcripts/49-measuring-perf/4.txt @@ -0,0 +1,47 @@ +00:00 Now one takeaway from this here +00:02 is that we're actually spending a ton +00:04 of startup time and other things. +00:06 And depending on how your code is working, +00:09 if it's intended to be called over and over again, +00:12 this is very common if you use like a web app, +00:14 and you start it and every time somebody hits this page, +00:16 some stuff is going to happen over and over. +00:19 You might not want to measure +00:20 the start up time so much as steady state time. +00:24 So let's do one real quick thing +00:25 before we actually get fully to the CPython API. +00:29 Let's just run this a lot. +00:31 So, then here we have this main. +00:33 Let's just run main like 100 times, or 50 times, +00:36 or something like that. +00:37 And measure that. +00:39 That will get rid of some of the variation. +00:40 It'll definitely suppress +00:42 some of the module Python startup times. +00:44 So we'll just say this. +00:47 Let's do it 25 times. +00:50 Now we're here and we'll run the same thing. +00:53 Once again, but it'll take a little bit longer. +00:55 Still, not long, right? +00:58 But you can see, it's going over and over again +01:00 it's doing this little printout here. +01:02 So now if we look over here, +01:03 here's our main, spending a little bit of time there. +01:07 Doing our research initialization, +01:09 we're spending a decent amount of time in parse row. +01:13 Over here, these are cumulative times. +01:15 So, like, for example, we're spending 210 milliseconds in module load, +01:18 but now we're spending 180 milliseconds in main. +01:23 That may be totally fast enough, maybe not. +01:25 On the Talk Python Training website, +01:28 we try to get things down to 10 milliseconds, 20 milliseconds. +01:33 Some of the pages that are really complicated, +01:34 you know, there's a lot going on. +01:36 It's like 50 milliseconds. +01:37 But you certainly want to try to get that number down. +01:39 I think if this was a web app, +01:41 that number would be too high. +01:43 Of course it's not, but what we're going to do is +01:45 we're going to look at what we're doing here +01:47 and at first try to understand why this is happening +01:50 and how we can make it faster. diff --git a/transcripts/49-measuring-perf/5.txt b/transcripts/49-measuring-perf/5.txt new file mode 100755 index 00000000..f7e9ea6e --- /dev/null +++ b/transcripts/49-measuring-perf/5.txt @@ -0,0 +1,90 @@ +00:00 Alright, let's go back to our code here +00:01 and we're going to do a little bit of work with the API. +00:04 So what we can do, is we can come up here +00:06 and say we're going to try to, as much as possible, +00:09 ignore the start up time and all those kinds of things +00:12 and we just want to measure all our important code. +00:14 So what we're going to do is import cProfile +00:17 and this is not great, but, before we even +00:20 try to go and import this +00:21 we're going to create a profiler +00:23 and disable further profiling. +00:26 So we'll go like so. +00:31 There we go, we're going to say +00:32 profiler disable and probably we'll just actually +00:35 take this code out once we're done +00:36 playing around with it, 'cause, you know, +00:38 these are supposed to go to the top. +00:39 But I don't want to time that stuff. +00:40 We're going to say, disable. +00:43 What we want to do is we want to time this method, +00:45 I want to time this one, and this one, +00:47 and we're just going to straight up time it at first +00:48 and then we're going to reorganize it +00:50 so we get a better look at it here. +00:51 Alright so let's go to our profiler and say enable. +00:55 And then as soon as we're done down here, +00:58 we'll go down and say profiler disable. +01:02 Okay. Now if we run this +01:03 are we going to see some great profiler output? +01:06 Eh, probably not, let's try. +01:09 Well we ran it 25 times, that was cool. +01:11 But nah, where'd our stats go? +01:13 None. +01:14 Okay, so what we actually need to do down here +01:17 at the end +01:18 is say profiler.printstats +01:23 and this will give us basically +01:24 the same graph as we had before. +01:26 There it is. +01:27 Now, of course, it's sorting by +01:29 heck I don't actually know what it's sorting by. +01:30 But not what we want. +01:32 So we come down here and say sort. +01:34 Now this is annoying, I guess I'll say it that way. +01:38 It says the sort is an integer +01:40 and its default value is -1. +01:43 Do you know what you put here? +01:44 Cumtime as a string. +01:46 Yeah let's go ahead and tell PyCharm +01:47 that's spelled correctly. +01:49 That's what it is, that's how it works. +01:51 Okay, so down here, now +01:53 you can see the cumulative time is descending. +01:56 It looks like we're sorting correctly there. +01:58 We've had 115,000 function calls. +02:02 That's non-trivial, apparently. +02:04 Look at this, look how much cleaner +02:06 and realistic this looks. +02:07 Alright, we're spending time in research and net, +02:09 and parse row, this is kind of the whole startup time bit. +02:12 This next stuff, this is definitely in there. +02:15 We're spending some time in sorted. +02:17 That's pretty cool. +02:18 And here we have our three, +02:19 our hot days, wet days, and cold days. +02:23 Okay, that's pretty cool, and then here you can see +02:25 some of these lambdas, or our sort functions +02:27 that we're passing along in research, and so on. +02:29 So this gives us a much more clean and pure view +02:33 of what's going on here. +02:35 Let's actually crank this up to 100. +02:38 Just to make it stand out a little bit more. +02:42 Here we go. +02:43 So now we're spending a decent amount of time in +02:46 these places, and here we're spending like, +02:49 not quite 20 milliseconds in the three, +02:52 data reporting sections. +02:54 Okay this is all well and good +02:56 and these numbers right here, +02:57 the stuff I've highlighted, is great. +03:00 However, this method here, +03:03 it's kind of hiding, this main, where's main? +03:08 Main's not showing up because we didn't, +03:10 we didn't call it directly, +03:11 we basically disabled profiling +03:13 but there's still some stuff going on here +03:14 like this looping, and this numarray +03:16 and this string formatting, +03:18 all this junk is still being profiled. +03:20 We're going to use the API to clean that up as well. diff --git a/transcripts/49-measuring-perf/6.txt b/transcripts/49-measuring-perf/6.txt new file mode 100755 index 00000000..4884368b --- /dev/null +++ b/transcripts/49-measuring-perf/6.txt @@ -0,0 +1,87 @@ +00:00 Now we're turning off the profile +00:01 until we get to our code. +00:03 Run this little bit and then we disable it again. +00:05 Right up here we have profile enable +00:07 and we have profile disable. +00:08 But there's still a lot of reporting stuff +00:10 and do you really care how fast the thing prints out? +00:12 Like, it's print to the console, +00:14 you really can't control that. +00:16 That's not the essence. +00:17 So let's just reorganize this code, +00:19 refactor it so that we can group the analytics +00:23 and the data bits of it and then we'll move on. +00:27 Okay, so let's come over here and we'll say +00:29 we'll get those days and get those days and those days. +00:34 Now clearly, there's a problem here. +00:36 We can't just keep calling the days like we were. +00:38 So, we've have to call this hot days, +00:40 cold days, and wet days. +00:42 And we got to replace in that here, +00:44 hot days, cold days, and wet days. +00:49 Okay, so now we can take this profile bit +00:52 and disable it way sooner, like this. +00:55 So here we can do a little bit of work +00:58 in this block of code here and only profile that. +01:01 Let's run this one more time. +01:04 All right now, how things are looking. +01:06 Okay, that looks even a little bit cleaner. +01:08 They didn't change the numbers for this obviously +01:10 because that's outside of what we were doing, +01:12 and it wouldn't change this either, right. +01:15 But it does clean things up just a little bit. +01:17 Let's look at what is the worst case scenario here. +01:21 Well there's init right here, +01:24 this is obviously the worst function. +01:25 It's at the top. But let's go look at it. +01:29 It's doing this line right here. +01:33 Chances are we can't really do any better than that. +01:35 It turns out that we can call it less often, +01:39 that's one thing we could try to do +01:41 is check and see if it's already been initialized, +01:43 then don't do it, that's actually a massive, +01:45 massive performance gain, but let's make +01:46 what we already have faster before we add that. +01:50 Over here, we're basically parsing the row +01:53 and we're pinning the data. +01:54 Remember parsing row down here actually +01:56 does all sorts of conversions and then +01:58 assigns it to this record and so on. +02:02 So, there's this init, but really the thing that is +02:04 the problem here, this parse row +02:07 that we're calling 36,135 times. +02:10 That is a ton of times that we're calling this. +02:13 Can we make it faster? Answer is, probably, yes, yes we can. +02:19 How can we do that? +02:21 One thing we could realize is, it's really +02:24 this all this conversion these are taking strings +02:28 and converting them to integers, +02:30 the dictionary read and write is like crazy fast. +02:33 So, you could look at that and figure this out, +02:36 but it, that's not really the problem, the problem is the +02:40 string conversion to numbers ints and floats. +02:43 And then also this, we're allocating this record +02:46 and we're signing well over however elements +02:49 there are in this named tuple and we're giving it back. +02:52 What can we do here to make this faster? +02:55 Well it turns out, if you look at the way our program works, +02:59 first up here that we're working +03:02 with actual max temperature, actual precipitaion, +03:05 and over in the programming we're working +03:07 with actual min temp and we should have been sorting by min +03:13 temp here as well. +03:16 Okay, so minor little bug, but really +03:18 highs on a cold day are pretty close to the lows as well. +03:21 Alright so we're working with these three values, +03:23 max temp, min temp, and precipitation. +03:26 If you look at the little reports we're running +03:28 we're also working with date, nothing else. +03:32 However, just for completeness sake, +03:34 we said we're going to convert everything, +03:36 we're going to convert the mean temperature, +03:38 the record temperature, the average temperature, +03:40 you name it we're converting that. +03:42 Well if we know our program isn't actually +03:45 going to touch those pieces of data let's not do that. +03:48 So let's see what we can do about improving performance +03:50 by reducing some of the data we're working with here. diff --git a/transcripts/49-measuring-perf/7.txt b/transcripts/49-measuring-perf/7.txt new file mode 100755 index 00000000..4e5b52b2 --- /dev/null +++ b/transcripts/49-measuring-perf/7.txt @@ -0,0 +1,147 @@ +00:00 We saw this parse row is where we're spending most +00:02 of the time in the code that we wrote, +00:04 that we're actually interacting with. +00:07 We're also, just for completeness' sake, +00:09 taking every element of this file and converting it, +00:13 and storing it and working with it. +00:14 But what we've learned is that our program actually +00:16 only uses four fields; three of which we're converting. +00:20 Why do we need to convert all the others, right? +00:22 If we're never going to look at the average min temperature, +00:25 why do we need to convert it? +00:27 Now, this is not something you want to start with, +00:29 'cause this could cause all sorts of problems, +00:31 but once you know the data you're working with +00:33 and how you're going to use it, +00:35 you probably want to come along here and say, +00:36 well, actual mean temp, don't use that, +00:39 actual min and max, those we are, +00:41 these averages are out, these records are out, +00:45 we're down to average precipitation, and those. +00:49 So now we're down to just these three. +00:51 So this is going to be faster. +00:54 However, we're still creating this record +00:55 which stores 12 values, +00:57 and we're sort of passing them all along here. +00:59 Let's do a little bit better. +01:03 What do we want, we want a date, actual, not actual mean, +01:06 so we can not even put them into our data structure. +01:09 Take out actual mean, put our min, our max, +01:12 a bunch of average stuff we're not using, +01:14 actual precipitation, +01:18 and that's it. +01:19 So we have one, two, three, four, those are our four values. +01:22 Now this trick is not going to work anymore +01:24 because there's more data in the dictionary than it accepts. +01:27 Okay, so we got to go back +01:28 and do this a little more manual now. +01:31 So we're going to say row.get date, +01:34 and we'll just do this for each one. +01:38 Okay. +01:39 A little bit more verbose, +01:40 but we're only storing the four values, +01:42 we're only getting them from the dictionary, +01:44 initializing them, all that kind of stuff. +01:47 Now let's just look really quickly here +01:49 at how long we spend on these two. +01:50 I'll put these into a comment right up here. +01:57 Alright let's run it and see if that makes any difference. +02:00 It's so fast, really, that you probably +02:02 wouldn't actually visually tell but like I said, +02:05 if you can take it down from 300, +02:07 what are we looking at here? +02:09 We're looking at quite a bit here, 750, +02:13 this is the one that probably matters. +02:15 350 milliseconds, that is a lot of time. +02:17 What if it's something interactive in real time, +02:19 like a webapp for example. +02:21 Let's try again. +02:23 Now look at this. +02:24 This part actually stepped up and got in the way of this. +02:27 It used to be those were next to each other, and why? +02:30 'Cause that got way, way better. +02:33 So let's go down here and print this out. +02:35 I'm going to delete this CSV row, +02:37 there's not a lot we can do about that for the moment. +02:41 Look at this; 350 to 159. +02:45 That's more than 50% reduction, +02:48 just by looking at the way we're creating +02:50 or reading our data, and working like this, right? +02:53 We don't need to load and parse that other data. +02:56 We could actually go and simplify our original data source, +02:58 really, but that probably doesn't make a lot of sense. +03:02 This is probably the way to do it. +03:04 So we used profiling to say, +03:06 well, this function is where we're spending so much time. +03:10 If we look at the other ones, +03:11 look at the part where our code is running, +03:13 this next and sorted, like this stuff we don't control, +03:16 these are the other important ones, +03:18 but they're like 20 milliseconds for 100, +03:22 so that's one fifth of one millisecond? +03:28 .21? +03:29 .21 milliseconds? +03:31 That's fast enough, alright? +03:32 We probably just don't care to optimize that any faster, +03:36 and you know, we look at that code, +03:41 we look at that code down here, like, +03:44 you could try some stuff to try to make it faster, right, +03:46 we could maybe store our data re-sorted +03:50 based on some condition, right, +03:52 like we pre-sort this on the max, +03:55 maybe it's less sorting for the min, +03:57 you know certainly this one would be crazy fast, +04:01 how much better can we make it, right? +04:03 If it's .2 milliseconds and we make it .18 milliseconds, +04:06 no one's going to know. +04:07 Especially when you look at the fact that there's +04:10 a total of 600 milliseconds in this whole experience, +04:15 so really, this is probably as good as it's going to get. +04:19 The other thing we can do, the final thing we can do, +04:21 and just notice that we're still spending +04:23 a very large portion, +04:26 five sixths out of that, whatever that is, +04:29 a very large portion of our time in this init function. +04:32 Because we happen to be calling it over and over. +04:35 So now that we've got it's individual run +04:37 at about as good as we're going to get, +04:39 let's just add one more thing. +04:45 Super simple, like, hey, have you already initialized it? +04:47 We're just going to keep the data, +04:48 it's unlikely to have changed since then. +04:51 Now we run it, and we get different answers still. +04:54 It's now down to these three that are the actual slow ones. +04:57 But like I said, +04:58 I don't think we can optimize that any faster. +05:03 Here's the research.init, and that's six milliseconds. +05:08 I don't think we can do better than that. +05:09 We're loading a pretty large text file and parsing it; +05:12 six milliseconds, we're going to be happy with that. +05:14 So you can see how we went through this process +05:16 of iteration with profiling, +05:18 to actually come to make our code much, much faster. +05:22 It used to take almost half a second, +05:24 now it takes 55 milliseconds. +05:27 And that's actually to call it, +05:29 how many times did we call it, 100 times, +05:31 is that what I said? +05:33 Yeah, so in the end we're sort of running the whole program +05:35 100 times and we've got it down to 55 milliseconds. +05:39 Less than one millisecond to run that whole analysis; +05:43 load that file, do that, and so on. +05:45 That's not quite right because +05:46 we're only technically loading parts of the file once, +05:48 and caching that, right, +05:51 but you can see how we go through this process +05:52 to really look at where our code is slow, +05:55 think about why it's slow, +05:57 and whether or not we can change it. +05:59 Sometimes we could, parse row, +06:01 other times, hot days, cold days, wet days, +06:03 we're kind of there, like, +06:04 there's not a whole lot more we can do. +06:06 If we want that to be faster, +06:07 maybe we have to pre-compute those and store them, like, +06:11 basically cache the result of that cold days list and so on. +06:15 But that's, that adds a bunch of complexity +06:17 and it's just not worth it here. diff --git a/transcripts/49-measuring-perf/8.txt b/transcripts/49-measuring-perf/8.txt new file mode 100755 index 00000000..f8d75061 --- /dev/null +++ b/transcripts/49-measuring-perf/8.txt @@ -0,0 +1,68 @@ +00:00 Alright, so all of this was really +00:01 useful and helpful and I think we did a lot +00:03 of good stuff with it, but this text view, +00:06 while it is technically helpful, you really can do better. +00:12 In this simple program, what I'm going to show you +00:14 doesn't come out really that great +00:16 because there's so much overhead, +00:18 like I said, a sort of programmed start-up and stuff. +00:20 But in a real complex application, +00:22 you would really be able to make great use +00:25 of what I'm going to show you. +00:26 So, we saw that we can come over here +00:30 and run the profiler externally like this. +00:33 And that works fine, +00:34 or we can even use the API internally. +00:36 Let me show you one other option. +00:39 Now for this to work, we need to go back, +00:42 we need to take a bit of a step back into this mode here +00:46 where we're running the profiler from the command line. +00:50 Just the whole program basically. +00:52 So let's drop in this program PyCharm bit. +00:54 Let's drop this enabling and disabling and printing +00:58 and we can still leave everything else the same. +01:02 But we're going to take away the profiler API internally. +01:05 And we're going to run this just like normal, and it runs. +01:08 There's no output that is anything special. +01:11 But once you have a run configuration-- +01:13 now this is only for those of you +01:15 who care about PyCharm and have the Pro Edition. +01:17 If you're using something else like Visual Studio Code +01:19 or something, you're going to have to do +01:21 what we've already seen, alright? +01:22 There are ways to implement these tools +01:24 outside of PyCharm, but this is pretty nice. +01:27 Once we create this, +01:28 we can run it here but if you go over there, +01:30 it'll say profile that. We click it, wait a second. +01:34 First of all, if you look up at the top, way at the top, +01:38 it is running the cProfiler. +01:43 And this list here is the list that you already saw. +01:46 But we can click on, say 'time' +01:49 and see, here's main, here's the +01:52 research py stuff we're doing, +01:54 here's the Hot Days, all that kind of stuff. +01:57 Here's the init that we're calling. +01:59 Same thing, but you can quickly jump around. +02:02 You can even say, "Show this on the call graph." +02:04 Well, of course, you see it right there. +02:07 This is a visualization of that result. +02:09 Let me come down here and zoom in, this will become useful. +02:14 Notice, here's our program, it's calling main, +02:17 it's calling "Hot Days, Wet Days, Cold Days." +02:18 These are pretty quick. Now we're calling this "Init." +02:22 We're calling this one 99 times, +02:25 but we're only going through the parse row +02:27 365 times. Remember, that's one year's worth of data, +02:32 365 rows, so even though we call this 99 times, +02:35 we're not actually parsing it 99 times, +02:38 we're just doing that for one round through the file. +02:41 So here you can see where you're spending your time. +02:43 You can actually visually go through it. +02:45 Like I said, in a real app, this is actually more helpful +02:48 because the overall program start-up is not +02:51 so significantly shown in the graph. +02:54 It's where your app's doing most of its work. +02:56 This is so simple that it kind of +02:57 gets lost in the noise, but this graphical view +03:01 is really, really nice as well. diff --git a/transcripts/49-measuring-perf/9.txt b/transcripts/49-measuring-perf/9.txt new file mode 100755 index 00000000..c3145cc9 --- /dev/null +++ b/transcripts/49-measuring-perf/9.txt @@ -0,0 +1,37 @@ +00:00 Let's review some of the concepts around measuring +00:02 performance with profiling and Python's cProfile module. +00:07 Now from any project, regardless of your editor, +00:11 if you just want to measure the overall performance +00:14 of your app, this is probably the best thing you can do. +00:17 python -m cProfile, +00:20 so run Python, make sure that's the right version. +00:23 Instruct it to run the module cProfile, capital P, +00:28 and while you're at it, the most useful one +00:30 is sorting by cumtime. +00:32 So do a -S, cumtime and then give it +00:35 to a entry point into your Python program to run. +00:38 Here program notqi, and you automatically get +00:40 that nice output that you can start working with it, +00:43 iterating on. +00:45 One, to run just a section of code +00:47 there's two options, there's one I'm showing you here +00:50 and you could also create a unit test +00:53 that just run that code and then +00:55 run the unit test with profiling. +00:57 But we're going to focus on the more general case here. +00:59 So what you do is you import the profiler, +01:02 and tell it to start up disabled +01:04 stop tracking anything, just import yourself +01:07 and go from there. +01:09 Run whatever startup code you got to do +01:11 to get into the state you want to profile, +01:14 and then enable profiling, run your code +01:17 and go back and disable it. +01:19 And in our example you saw we actually moved the reporting +01:21 outside of this block and the data generation +01:25 within it so that we could measure really precisely +01:28 just the part we were working on. +01:30 Some other stuff here at the end +01:31 you probably don't care about. +01:32 And at some point you want to see the stats +01:34 so you'll say, profiler.print_stats. diff --git a/transcripts/52-feedparser/1.txt b/transcripts/52-feedparser/1.txt new file mode 100755 index 00000000..a5de43bd --- /dev/null +++ b/transcripts/52-feedparser/1.txt @@ -0,0 +1,17 @@ +00:00 Good day everyone, I'm Julian Sequeira. +00:02 Welcome back and this time we're going to look at Feedparser. +00:06 This is a library that is really cool +00:08 and I absolutely love it. +00:10 I use it in a few scripts +00:12 and it's actually designed to parse RSS feeds. +00:15 Go figure. +00:16 It's really, really fun to use, +00:18 very simple, very satisfying. +00:20 So let's move on to the first video +00:22 and what we're going to do +00:24 is first we're going to pull down an XML file +00:26 in our RSS feed. +00:27 And in the next video after that, +00:29 we're then going to parse it. +00:31 Really simple and quick. +00:33 Let's get to it! diff --git a/transcripts/52-feedparser/2.txt b/transcripts/52-feedparser/2.txt new file mode 100755 index 00000000..afb8c38f --- /dev/null +++ b/transcripts/52-feedparser/2.txt @@ -0,0 +1,22 @@ +00:00 Okay, very quick setup for this project, +00:02 we're going to create the feedparser folder, +00:04 just like I have, and we're going to install our +00:08 virtual environment, very good practice as always. +00:12 Once it's up and running, we can launch it, venv\scripts\activate, +00:18 it because I'm a Windows junkie, +00:21 alright, now we can install feedparser, +00:27 alright, that might take a minute or two +00:29 to install, depending on your speed, and everything. +00:33 Once that's done, we will try and install requests, +00:37 and that's pretty much all we need for this project. +00:40 After that, we're going, we're actually going to use requests +00:43 to pull down the XML file, +00:45 and then use feedparser to parse the XML feed, +00:49 so install requests. +00:53 Alright, off it goes, +00:55 and we are done, now folder-wise, +00:58 inside your directory, I would like you to create +01:03 two Python files, one called parser.py, +01:07 and one called pull_xml.py. +01:10 Okay, just do that, empty files, +01:13 and we will continue in the next video. diff --git a/transcripts/52-feedparser/3.txt b/transcripts/52-feedparser/3.txt new file mode 100755 index 00000000..7116c41f --- /dev/null +++ b/transcripts/52-feedparser/3.txt @@ -0,0 +1,81 @@ +00:00 Okay, let's get cracking. +00:01 First thing we need to do is import requests, sorry. +00:07 import requests. +00:09 Now I know you probably know how to use requests +00:12 so I'm not going over this too much. +00:14 But what I'd like you to do is +00:15 enter the URL of your feed. +00:18 Now to get that for example, +00:20 we're going to be pulling the +00:23 new releases XML feed from Steam. +00:26 Stored up, steam powered. +00:28 Okay, +00:29 all I've done to get that is just Google +00:31 "Steam Feed." +00:33 Came up here, +00:34 I just grab the first one +00:35 and there was a link on the website for +00:38 their RSS feed. +00:39 Okay, this is the news one, +00:41 but we're actually +00:42 going to use the new releases +00:43 for the video games. +00:45 So you can feel free to grab whatever you want +00:47 and once you do that, +00:49 just pop the URL into here +00:52 and assign it to URL. +00:57 So there's mine there. +00:59 Next, we're just going to use our standard +01:02 Python and dunder there. +01:05 Okay, +01:06 and then what we're going to do is +01:08 we're going to +01:10 requests.get. +01:12 So, essentially, +01:13 we're going to get that URL +01:14 and we're going to store it +01:16 or we're going to assign it to the r variable. +01:19 Okay, and then we're actually going to +01:21 write the contents of this file, +01:24 of this XML feed, this that you're pulling down, +01:28 we're going to write that down to an XML file. +01:30 Okay, so to do that, +01:32 just going to do it the old fashioned way. +01:34 We're going to open a file, let's just call it +01:37 newreleases. +01:39 Just like the actual XML. +01:42 We're just going to write binary +01:43 and we're going to open it as f. +01:46 And I'm using that with Statement as usual +01:49 just to make sure it closes +01:50 out right when it's done. +01:53 So, we're going to write +01:55 r.content. +01:58 I'm not explaining this in detail +01:59 because you would have experienced requests +02:02 by now, so that should be nice and familiar. +02:05 But this is necessary to pull down the file. +02:08 Alright, so we save that, that's all we need. +02:11 Now, head over here to your shell. +02:13 Woops, we don't actually want to launch the shell, +02:18 We want to go Python pull_xml.py. +02:22 Alright, that completed. +02:25 Now, if we bring up our folder here, +02:28 or everything that's inside, +02:30 you will have seen it's created in newreleases XML file. +02:34 Alright, +02:36 that's it there. +02:38 Now, we'll open that file +02:42 in explorer. +02:43 Where are we? +02:45 Open, let's just choose, okay, don't hate me. +02:48 Let's just choose internet explorer. +02:51 So, now that this is open, +02:53 you can have a good look at what's inside this XML file. +02:57 Pay attention, maybe while you're doing this for yours, just open this, +03:01 your XML feed +03:02 in a browser +03:04 or in your favorite editor, +03:06 just so you can have a look at these little tags here. +03:09 So pay attention to that, +03:10 we'll talk about them in the next video. diff --git a/transcripts/52-feedparser/4.txt b/transcripts/52-feedparser/4.txt new file mode 100755 index 00000000..5a97bc74 --- /dev/null +++ b/transcripts/52-feedparser/4.txt @@ -0,0 +1,106 @@ +00:00 Okay, we have our xml feed downloaded +00:03 and saved, and now we're going to +00:05 actually parse it with feedparser. +00:08 So, what we need to do is import feedparser. +00:13 Okay, and that's half the work done. +00:16 No, I'm just kidding. +00:18 What we want to do now is we need to actually +00:22 tell feedparser what file it's going to be passing. +00:25 Now, you could actually use the url, okay. +00:29 You could use the url from, directly, +00:32 but the problem with that is, +00:34 is that it requires the internet connection, +00:36 and if it can't get that, it's going to fail. +00:39 So, it's actually better from and application standpoint +00:43 to download the parse, the feedparser, sorry the feed, +00:48 and then parse it using a separate script. +00:50 That's why we've done it in two different scripts. +00:53 We could have done it in one just by +00:55 telling feedparser to point directly to the url, +00:58 but we're going to do it parsing a local file. +01:01 Okay, so feedfile +01:06 is a newreleases.xml. +01:08 So, the same file that we just downloaded and saved. +01:12 Okay, now what do we want to do? +01:14 We want to actually parse that file, alright? +01:17 And that's an argument for feedparser. +01:21 So, we're going to parse it +01:23 and store it in the feed variable. +01:26 Okay, so feedparser.parse. +01:29 Now, it's as the name implies, right? +01:32 It's going to just parse over the file, +01:34 and store all of those contents inside the feed variable. +01:41 Okay? +01:42 Now, if we bring up our xml file. +01:46 Where have you gone? +01:47 Let's open it here, open it again in internet explorer. +01:52 Don't hate me, let's make it a little bit bigger. +01:55 Okay, so what we notice here is that, +02:00 we can see it's staggered out, it's xml. +02:01 We've all seen that before, but it's pretty much, +02:04 once it's loaded into feed, +02:06 it becomes a sort of dictionary, okay? +02:09 With your title, your link, your description, +02:13 and these are the sort of keys that we want to pull out. +02:16 Okay, and by doing that, +02:19 so to do that we actually use these tags. +02:23 Okay, and that's what feedparser does. +02:25 It parses, and let's you pull data based on these tags. +02:28 Alright, so you'll see that. +02:30 Here's what we'll do, so this is the... +02:33 what I think we should try getting is the title. +02:37 So, we want the title of the feed, the feed entry. +02:42 So, Midweek Madness, Dragon's Dogma, blah blah blah. +02:45 That's what we want to pull. +02:47 We also want the published date. +02:50 Okay, now most xml feeds, +02:53 or most rss feeds should have this. +02:57 Some don't, but we'll get to that in a minute. +02:59 So, we want the publication date, alright? +03:01 So we know what date. +03:02 And then I think we should get the link as well, +03:04 because we would like to get the url for this deal, +03:08 or this new game launch, or whatever it is. +03:11 Alright, so we go back to our file here, +03:14 to our script, and we will go. +03:17 We're going to use a for loop +03:18 to parse over this data, okay? +03:21 So, we're going to go for entry in feed, +03:25 that's this, in feed.entries. +03:30 Okay, that's why I've said for entry. +03:32 So, for every entry within all of the entries within feed. +03:37 What are we going to do? Well, we're going to print something. +03:40 So, this is just for the sake of this script. +03:42 So, we're going to print entry.published, +03:46 so even though I will point this out, +03:49 this one got me at the start. +03:51 Even though it says pub date here, +03:55 that is not actually what feedparser gets. +03:58 That's actually called published +03:59 from the feedparser standpoint. +04:01 So, entry.published. +04:03 Just going to use some standard string stuff here, +04:07 so bare with me, then we're going to choose the title. +04:10 So, imagine this as you're writing it. +04:12 The date, and then the title, alright? +04:16 So, for entry.title, throw in a colon there, +04:21 and what's next? +04:23 entry.link +04:24 So, all we're doing is we're printing out the date, +04:29 the title, and then the link for that, and that's it. +04:34 Okay, nice and simple, and you won't believe me, +04:38 but that's it. +04:41 Okay, so it's pretty simple. +04:44 So, we'll go python parser.py, +04:49 and that's it. +04:50 Let's maximize this, so look at that. +04:53 We have the date, Friday the 5th of January, 2018. +04:57 At that time, watch live on Steam, +04:59 Paladins World Championships, and then, +05:02 we have the url. +05:04 How simple is that? +05:06 We've parsed this entire feed, +05:11 ignored all the extra stuff in there that doesn't matter, +05:15 and we've taken just these titles, +05:19 with the date, and the url. +05:22 Very, very... diff --git a/transcripts/52-feedparser/5.txt b/transcripts/52-feedparser/5.txt new file mode 100755 index 00000000..42176fc8 --- /dev/null +++ b/transcripts/52-feedparser/5.txt @@ -0,0 +1,47 @@ +00:00 Okay, one last little thing for you +00:02 which is a bit of a best practice +00:04 as always with Python scripts, you would +00:06 normally put in some sort of an error check, +00:08 just to make sure or a conditional check, +00:10 just to make sure everything is in place +00:13 before you run your script, right. +00:16 So in this case, what happens if one +00:19 of these tags doesn't exist in the feed? +00:23 Well, sometimes these RSS feeds out there +00:28 don't always include the default tags, +00:32 like title and link or description +00:34 or whatever else, okay, if that happens +00:37 well then your script's going to break. +00:38 So you should try and capture those errors +00:41 but right now, I'm not going to walk you +00:42 through error catching and testing +00:45 and trying except and everything that's +00:47 another module in itself, right. +00:50 So what I will show is just a really +00:53 quick, if statement that just works, okay. +00:57 So you could do if and then your tag name, +01:01 now I would definitely insist on title being in there, +01:05 so if title in feed.entries, we're looking at the +01:11 first item in feed.entries there. +01:16 Then we want you to run the full loop and that's it, +01:21 okay, that's all I'm looking at now then you can put +01:26 ls break or something like that or you could run your +01:30 try and except and what if you want to wrap around it. +01:32 But in this case, that's all we need, so we can save that +01:37 and then we can run that, so Python +01:40 and we'll get the same output as last time. +01:45 Okay, we can go and see all of that data +01:51 now just to prove that this actually worked, +01:53 here's what we can do, let's clear and let's +02:01 change the actual tag we're looking for. +02:04 So let's come up with something that's +02:05 definitely not going to be in there. +02:09 Let's see if I can spell, so that should be in every feed +02:12 right but unfortunately not so if Julian rocks +02:16 in feed.entries then run your forward. +02:20 Okay, let's run that and bang, nothing +02:25 happened, let's put title back in and there we have it, +02:32 okay, so that's it if you want to do some +02:35 sort of testing against it before you run +02:38 it, well that's the way to do it. +02:40 Okay, and that's pretty much feed parser nice and simple. diff --git a/transcripts/52-feedparser/6.txt b/transcripts/52-feedparser/6.txt new file mode 100755 index 00000000..2ac9308a --- /dev/null +++ b/transcripts/52-feedparser/6.txt @@ -0,0 +1,65 @@ +00:00 And that's it, I told you it was simple. +00:02 So Feedparser is awesome. +00:05 A very, very simple and small lightweight thing to use +00:09 but really helps you out if you want to automate things +00:12 like feeds. +00:13 So, let's just recap quickly what we did without going +00:16 into too much detail. +00:18 We import requests and this is for pulling down +00:21 the XML feed. +00:22 Okay. +00:23 Specify the feed that we want to pull down, okay. +00:27 We actually get the feed using that URL +00:31 and we store it in r. +00:34 Okay. +00:35 We then open a file, you can call this whatever you want, +00:38 and then we write the contents of that XML file, +00:44 that feed, into +00:46 the file that you specified there, okay. +00:50 Simple. +00:52 And now, onto the Feedparser stuff. +00:55 So obviously the first thing we do +00:57 is import feedparser. +01:00 Okay. +01:01 Then we specify that actual file that we created +01:05 in the last step. +01:06 Okay, remember we separated these two processes of pulling +01:10 the file and then parsing it just in case you had +01:13 a scenario where, let's say you couldn't pull the file. +01:17 Well, if you couldn't pull it, at least you have +01:19 an existing file and you can continue parsing that. +01:21 The whole thing doesn't fall over, alright. +01:24 Now we parse it using feedparser.parse and throw that +01:29 into the feed, all right. +01:31 And then we have the little sanity check there to make +01:33 sure the feed is okay to parse, +01:35 that it has that title tag that we want +01:38 and that we did necessary again. +01:40 You can wrap some sort of a try except or whatever +01:44 you know, error checking you want around that. +01:48 Then for every entry within that feed we're going to take +01:52 the data stored against publish in the publish tag, +01:56 in the title tag and the link tag and then we're going to +01:59 print that in a nice little string +02:02 and that's it, okay. +02:04 Now, very exciting. +02:07 It's your turn. +02:08 So for the next day I would like you, +02:11 instead of printing out that data, +02:14 so in the previous step you saw we printed out +02:16 the publish, the title and the link. +02:20 Instead of printing it out, +02:22 why not do something interesting with it? +02:24 What can you think that you might be able to do with it? +02:26 So just some ideas, maybe you could e-mail that data +02:31 which is exactly what I'm doing with this steam stuff. +02:33 That's the script I'm running. +02:37 You could e-mail that to yourself. +02:38 You could potentially store it in a database. +02:42 There's a nice little challenge for you. +02:43 You figure out a way to store that data in a database. +02:46 Or you could just think of something else. +02:48 Anything you can think of, any other libraries that +02:50 you could use to do something interesting with that. +02:54 Come up with it, try your own feed and have fun with it +02:58 and go parse those feeds. diff --git a/transcripts/52-feedparser/7.txt b/transcripts/52-feedparser/7.txt new file mode 100755 index 00000000..be024767 --- /dev/null +++ b/transcripts/52-feedparser/7.txt @@ -0,0 +1,40 @@ +00:00 First things first, +00:01 let's go through the ReadMe file. +00:03 Quick word of warning, +00:04 feedparser is a very very quick topic. +00:08 As you can see by this stuff on your screen, +00:10 this is not going to take you very long. +00:12 And yeah, reality is, +00:14 that's what feedparser is. +00:16 It's just that simple, that it's quick to learn. +00:18 So Day 1, you are going to pretty much do everything. +00:23 You're going to watch the videos, +00:25 set up your environment, +00:26 pull the feed and then parse it. +00:29 Okay, so it'll involve using requests. +00:32 Day 2, I'm going to show you how +00:34 to do a quick, sort of tricky sanity check +00:39 when parsing your feed. +00:41 So, watch the Feedparses and the Check video +00:45 and then that's pretty much everything you +00:49 need to know by that point. +00:51 So, I'd like you to pull and parse +00:54 an RSS feed of your choice. +00:56 A bit of practice for you on Day 2. +01:00 Now on Day 3, +01:02 just wrap it up by watching the concepts video +01:05 and then I want you to come up with something to do +01:09 with the data you're pulling from feedparser, okay. +01:13 So, again, the usual stuff is there, +01:15 like store it in the database or email it out. +01:18 Build some sort of application around it, +01:21 but I like the idea of maybe letting the user +01:25 specify from a list +01:27 what RSS tags they want to pull down, okay. +01:31 So, that could be a cool little project. +01:33 So, day three is just testing it. +01:36 Playing it around, seeing how you go, +01:38 but that's the three days for feedparser. +01:40 They're going to be very quick +01:42 and very small in size, +01:45 but enjoy them nonetheless. diff --git a/transcripts/55-uplink/1.txt b/transcripts/55-uplink/1.txt new file mode 100755 index 00000000..219d5a36 --- /dev/null +++ b/transcripts/55-uplink/1.txt @@ -0,0 +1,27 @@ +00:00 Recall way back +00:01 when we worked on the search API, +00:03 consuming the search API, +00:05 and we were using requests to interact with HTTP services. +00:10 That worked pretty well, +00:12 but it turns out if you're working with complex APIs, +00:16 and they're very structured, +00:18 they want you to do things like pass certain headers, +00:21 some things go into query parameters, +00:23 others go into a JSON body, +00:25 and it's this sort of rich, known, fixed API, +00:29 you may well be better off using this thing called Uplink. +00:32 And that's what we're going to focus on now. +00:35 Instead of consuming HTTP services in an ad hoc fashion, +00:39 we're going to use the Uplink library to create +00:40 very structured and predictable APIs. +00:43 So once you implement it, +00:44 you kind of forget that it's there, +00:46 and you just treat it like another part of Python. +00:49 So, Uplink is a really great API for building +00:53 what here they describe as declarative http clients. +00:57 So instead of implementing all the details, +00:59 you just say, +01:00 "I want to do a get request against this URL +01:03 with these variables and parameters, +01:05 and Uplink, make that happen. +01:07 Make this all work for us." diff --git a/transcripts/55-uplink/10.txt b/transcripts/55-uplink/10.txt new file mode 100755 index 00000000..ba8d8df9 --- /dev/null +++ b/transcripts/55-uplink/10.txt @@ -0,0 +1,89 @@ +00:00 Now when we called service.create new entry, +00:03 let's just type it again. +00:04 And we saw Python kind of freaked out, +00:06 and what could we put in here? +00:08 Well, this **kwargs just means, +00:10 you can put anything and so much for the +00:12 help here. +00:14 You're just kind of on your own. +00:15 You have to know this is exactly how it goes, +00:17 but it doesn't have to be this way. +00:19 Let's go over here and fix this. +00:21 Let's rename this to double underscore, +00:25 under here it will say create new underscores. +00:26 A, no that's fine. +00:28 And then we'll define, __create_new_entry. +00:32 So why the double underscore? +00:33 This hides it from being used from the outside. +00:36 When we say service., we'll never see this function. +00:39 Right. +00:40 Almost private, almost. +00:42 So here we can just say return self.__create_new_entry +00:50 and then we need to put some stuff in here. +00:51 Let's go borrow this real quick. +00:53 And up here, +00:54 we don't have to have this unpleasant **kwargs. +00:57 We can have real values like title, +00:59 which is a string, +01:01 content which is a string, +01:03 view count. +01:05 Let's just call them views, which isn't it? +01:07 And published which is a string. +01:15 And we could even put some values like this. +01:19 I'll say if published is None, then we'll go and +01:24 set it to be the current value right here, +01:30 like that. +01:31 Of course we're going to have to import that here, +01:33 and this was views and so on. +01:36 Now this one still is kind of doing this +01:38 free count thing so we can suppress it internally, +01:40 but nobody outside of here will have to know. +01:44 You could specify tighter on content +01:46 or if you want to override the views, +01:47 you can do so here and then this +01:49 is actually going to go to the service. +01:52 And we might as well go ahead and tell it. +01:54 Then it also returns this. +01:56 Okay, so now if we come back over here, +01:59 let's write this again. +02:01 So svc.__create_new_entry, +02:03 oh look, did we get any help with visitor? +02:05 Of course we do. +02:06 We put title, we put content, +02:08 we could put the view count. +02:10 I'll go ahead and do that. +02:11 We'll leave the published off like this. +02:14 Don't need that warning. +02:16 This is much cleaner. +02:17 Now we know how to work with the API. +02:19 We put reasonable defaults +02:20 and have it work really well. +02:22 So let's see what's here. +02:24 Let's do one more post. +02:25 Let's write it. +02:27 Of course, there's that lack +02:29 of error handling. +02:30 Let's write a post. This will be the final post. +02:33 It was Final Frontier +02:36 and say 7,001. +02:40 Okay, created just like before. +02:41 If we go and read them, +02:42 it should be there. +02:43 You want to see details about it, +02:44 it's exactly what we wrote. +02:45 But we have this much nicer way to work with it. +02:48 Okay so that's uplink. +02:50 If you're going to work with this well +02:52 structured API, it really lets you control +02:55 the way you interact with it. +02:56 Let's just look over here really quickly +02:59 at a few more variations. +03:00 We talked about how you can pass at the +03:03 query strings. +03:04 You can do things like specify the headers. +03:07 You can pass in an authorization, +03:09 which then gets stored in the header. +03:11 You could even run synchronous and asynchronous versions. +03:15 Okay, so there's a lot more to go, +03:17 but I think we're going to leave that exploration +03:19 up to you. diff --git a/transcripts/55-uplink/11.txt b/transcripts/55-uplink/11.txt new file mode 100755 index 00000000..ac1df484 --- /dev/null +++ b/transcripts/55-uplink/11.txt @@ -0,0 +1,45 @@ +00:00 Let's review what we built. +00:02 We defined a client to interact +00:05 with our HTTP service by creating a class +00:08 and having it derive from uplink.Consumer. +00:11 So we created blog_client and its consumer +00:13 so uplink can do its magic. +00:16 The next thing that we needed to do +00:17 was pass it the base url. +00:20 Here's one way to do that. +00:21 We could tell this class, it's always going to work +00:24 with that API, so you don't have +00:26 to pass this base url every time. +00:28 It's really nice to have this +00:29 if you're doing testing against your own APIs. +00:32 You could, say if you're in debug mode, +00:35 then you say, like a local host version, +00:37 otherwise use production or staging, whatever, right? +00:40 So this is really nice, it sort of sets it up. +00:42 And then anytime we want to have an API point called, +00:46 we just write a method, decorate it with one of +00:49 the HTTP verbs, here we're using uplink.get/api/blog/post_id, +00:56 and that post_id is one of the arguments. +00:58 Now of course what we get back +00:59 is a request version of a response. +01:02 And notice, there's no real implementation, +01:04 but here's a nice chance to add a doc string +01:07 and add a little documentation. +01:08 So this is what I would think of as a raw API method. +01:12 Down here, we saw when we want to pass the body +01:15 sometimes that's a little cumbersome, doesn't really +01:17 give the consumer of the client a lot of help +01:21 on what to put, so we wrote this wrapper function. +01:23 It takes meaningful arguments, creates +01:25 some default values for us, and then calls +01:27 this hidden internal one that routes to our url/api/blog. +01:31 To create a new one, we just kind of pass on through. +01:34 Really really nice, and for that last part to work +01:37 when we did uplink.body, we had to specify JSON, +01:40 otherwise it's going to pass it as form encoded, +01:42 which, the server, if it doesn't want that, +01:44 it's going to get upset. +01:46 Here's what we got to do to built data servers, +01:48 and now we can just use it as if it was +01:50 a standard class, and all these things flow over +01:53 to the service, really really nice. diff --git a/transcripts/55-uplink/12.txt b/transcripts/55-uplink/12.txt new file mode 100755 index 00000000..d8b1526a --- /dev/null +++ b/transcripts/55-uplink/12.txt @@ -0,0 +1,32 @@ +00:00 You've seen how fun it is +00:01 to build API clients with uplink. +00:04 Now it's your turn, +00:05 and we're going to have you build an API client against +00:08 an API which has several endpoints. +00:10 You've seen this service before, +00:11 over at movie_service.talkpython.fm, +00:14 and it has these three endpoints. +00:16 Recall we did this in one of our service demos previously +00:19 but we're going to take an entirely different approach +00:21 and you're going to write that from scratch. +00:23 So over here, +00:24 we've seen that we can go /api/search/something, +00:29 here we're searching for all movies that have Run +00:32 as a substring on keywords, +00:34 or we can find them by director. +00:36 Here's all of the movies written by, +00:38 or directed by James Cameron. Things like that. +00:40 So we're going to take this +00:42 and let you model it with uplink. +00:45 So the first day, +00:46 really is just mostly watching the videos +00:49 and if you've gotten this far, you're pretty much there. +00:51 So you're mostly done. +00:52 Go ahead and just create a shell project, +00:56 an empty project that has a virtual environment, +00:59 it has uplink installed, +01:01 and program.py and an api.py. +01:05 And then just you know import uplink inside the api.py, +01:07 import api inside program.py, run program. +01:09 Make sure it's all hanging together, right? +01:11 So you'll be ready to start for the next day. diff --git a/transcripts/55-uplink/13.txt b/transcripts/55-uplink/13.txt new file mode 100755 index 00000000..4301b9e7 --- /dev/null +++ b/transcripts/55-uplink/13.txt @@ -0,0 +1,25 @@ +00:00 Now, for Day 2, you're going to +00:01 work with this movie service. +00:03 Now, I just copied these over for you. +00:06 Here are the three API endpoints. +00:08 So, /api/search/{keyword}, +00:11 /api/director/{directorname}, +00:14 things like that. +00:15 So, I've kind of laid out the goals of what I +00:18 would like you to do on this particular day. +00:21 On the second day, what I want is for you to +00:23 more or less create the movie search client class. +00:26 This is the uplink client. +00:27 Don't have to test it, you don't have to use it, +00:29 but you're going to need to add three methods to it, +00:32 one for each endpoint. +00:33 All right, and there's a few other steps about +00:35 like setting the base URL, and things like this. +00:38 And here's just a reminder of how this generally looks. +00:41 This is not what you do for this one but, +00:42 you'll have a class, interactional consumer, +00:44 you have a method, +00:46 it derives from uplink.get, and you can pass parameters. +00:50 So, shouldn't be a huge effort for you, I hope. +00:53 But, fill this out to match these three end +00:55 points as you see fit. diff --git a/transcripts/55-uplink/14.txt b/transcripts/55-uplink/14.txt new file mode 100755 index 00000000..7f9b9353 --- /dev/null +++ b/transcripts/55-uplink/14.txt @@ -0,0 +1,16 @@ +00:00 Third day, you have your API client built. +00:03 You've got your program ready. +00:04 Now you need to use it. +00:06 So just fill out program.py. +00:08 Add a simple UI that just asks +00:11 the user a questions like, hey, what, +00:13 or how do you want to search for your movie? +00:14 By director, by keyword, and so on. +00:17 And then just use your client to do that search +00:20 and then present the results to the user, right? +00:23 Should be pretty straightforward. +00:25 Remember, you get the response back, +00:26 you have to make sure that it's valid +00:28 and then you call json to actually get the data, right? +00:31 That's it, so hope you enjoyed learning about uplink. +00:33 It's a really unique and interesting way to models APIs. diff --git a/transcripts/55-uplink/2.txt b/transcripts/55-uplink/2.txt new file mode 100755 index 00000000..5d326c6c --- /dev/null +++ b/transcripts/55-uplink/2.txt @@ -0,0 +1,48 @@ +00:00 Now, before we go and write this, +00:01 I want to give you a quick glimpse at +00:03 how we define API's with Uplink. +00:06 Just so you know, where we're going, +00:07 and what we're working with. +00:09 So here is a, API, a structured API, +00:13 granted, it only has one method we could +00:15 implement many others, That consumes the GitHub API. +00:19 Now, there's a couple of interesting things here. +00:21 First of all, we have this function called list_repos. +00:24 If you look at its implementation, it's empty. +00:27 It's literally just a string, that says, +00:29 get the users public repository. +00:31 This is the docstring so you get a little help about it. +00:34 Technically you could just put the word, pass. +00:36 You don't actually have to write this function, +00:37 you use the signature of the function +00:40 to let Uplink hook into the API. +00:44 Notice there's an at get decorator, +00:45 it has user /{user}/repos, +00:49 and that {user}, anything that goes in the curly's, +00:51 that actually becomes an argument. +00:54 So if we call this function, list_repos, +00:57 and we say user equals 772, that's going to go into that URL, +01:01 and that's what the path annotation indicates here. +01:03 There's also a sort_by, notice its a query. +01:06 This is really cool, so the URL will actually be users, +01:10 slash, whatever you pass for users, slash repos, +01:13 question mark, sort equals the value of sort_by. +01:16 So, stars for example, something like that. +01:19 So, this way we'd basically declare or imitate our ways +01:25 we're going to access the service, and it's almost +01:27 entirely up to Uplink to make this happen. +01:30 Now, to use it is crazy simple. +01:32 So we're going to come down here and we just create an, +01:34 instance of this class, pass the URL. +01:36 We could hard code that in and we will in our example. +01:39 Then you just call it, gitHub.list_repos, +01:42 and you pass in say, octocat, that's the username, +01:44 and sort by its creted here, +01:47 and you get the repos back, look at this. +01:49 So, really, really nice way to create structured API's +01:53 that let you work with headers, body, query strings, +01:57 the particular URL's and not actually +02:00 have to juggle all those details. +02:02 So, that's what we're going to build for an API +02:05 that we haven't even talked about yet. +02:06 So, let's get to that. diff --git a/transcripts/55-uplink/3.txt b/transcripts/55-uplink/3.txt new file mode 100755 index 00000000..a9b35855 --- /dev/null +++ b/transcripts/55-uplink/3.txt @@ -0,0 +1,24 @@ +00:00 Now, let me just put one final warning out there +00:02 before we jump into building these API's with Uplink. +00:05 Uplink is great for creating structured clients +00:07 against HTTP services, +00:08 works really, really well. +00:10 However, if the API you're working with already has +00:14 a Python implementation, use that. +00:17 It's likely implemented and maintained by the company +00:20 that actually controls the API. +00:22 It'll continually be upgraded, and so on. +00:26 So, for example, over here at Stripe, they have an API. +00:28 We could use Uplink to build our very +00:31 own client to talk to it. +00:32 But, we can just pip install stripe, +00:34 and they'll maintain that and upgrade that over time, +00:37 and we don't have to worry about it. +00:39 So, Uplink really fits in the place where you have this +00:41 structured API you want to work with, +00:43 however, it doesn't have like an official +00:46 PyPI package that is the API wrapper. +00:49 Which there are many, many of those of course, +00:51 but first check and see if there's something from the +00:54 company or organization to already access that API +00:57 and use that, but if not, Uplink, that's where we're goin'. diff --git a/transcripts/55-uplink/4.txt b/transcripts/55-uplink/4.txt new file mode 100755 index 00000000..b1abdc83 --- /dev/null +++ b/transcripts/55-uplink/4.txt @@ -0,0 +1,81 @@ +00:00 Alright, here we are in our GitHub Repo. +00:03 In the Uplink directory, we're going to +00:05 quickly create a virtual environment. +00:06 We're going to want to install some third party packages, +00:09 namely uplink and all of its dependencies. +00:11 So, you want to have this here, so you don't mess +00:14 with the global one. +00:17 Now that that's done, we can just drop this into PyCharm, +00:20 open it however you like. +00:23 Alright, it's open, there's no files, +00:25 we're starting from an entirely blank project. +00:28 So let's do two things, +00:29 let's go over here and add a program +00:33 and let's add a requirements.txt. +00:36 So, in order to work with Uplink, +00:39 it probably won't surprise you to know, +00:40 you have to install Uplink. +00:42 So we'll come over here and say uplink. +00:43 Now, we're going to install this, +00:45 however, let's quickly look at the Uplink documentation. +00:49 So, you can see it's really targeting +00:50 all the versions of Python, +00:52 great code coverage, really nice, +00:54 however, there is this sort of note here: +00:57 warning, until this becomes an official version one, +01:01 maybe don't depend on the exact stability of the API. +01:05 Chances are, what we're doing +01:06 is really pretty basic and won't change, +01:09 but I'll show you how we can hedge for that in a second. +01:11 So let's go over here. +01:15 Install our requirements, +01:17 and notice, we got Uplink 0.4.0 +01:20 and we can actually... +01:22 This will go away in a second. +01:23 We can come over here and say this is actually +01:25 == to this. +01:26 And when we do this, it should still just say: +01:29 "No, no we're all good, everything's installed." +01:31 That way, when you get this project, +01:34 you can put this and it won't change. +01:36 In case that API really is unstable, +01:38 this will let you work with exactly +01:40 what we're using for this video. +01:42 Now this little green here is just PyCharm saying +01:44 this is misspelled. +01:46 We can just save it, tell it no, leave us alone. +01:48 Okay, so we are ready, actually to write some code. +01:52 And let's just put a little bit of structure in place. +01:56 What we're going to do it we're going to work with a blog service. +01:58 So, imagine this is a program that +02:00 lets us edit our own blog, but not from the web. +02:04 We're going to log into our application here +02:07 and we can say view our existing post, +02:09 edit our post, we can create new posts, +02:13 really kind of a toy example but, +02:14 it has much of the RESTful components +02:17 that any API would have. +02:18 So, it accepts POST, PUT, DELETE, +02:21 the various verbs and JSON bodies, +02:24 and other types of interesting things, +02:26 authentication and headers, +02:27 and it'll let you play around +02:28 with many of the capabilities without +02:30 getting into a really super complicated service. +02:33 So let's just write the skeleton here +02:35 and then we'll go check out the service. +02:36 Alright, so I'm going to just copy something in +02:38 and it's just going to like this. +02:40 So, what we're going to do, is we're going to define +02:42 basically a couple of operations here. +02:44 We'll use this one first. +02:45 So we're going to have a main method +02:47 and it's just going to go around and around +02:48 as long as you don't enter a blank line, +02:51 it's going to ask you, would you like to write a post? +02:54 Or, read the existing ones? +02:55 The service starts out with some already there. +02:57 And then it just says each time through, +02:59 do they say write, do they say read, if not exit. +03:04 We're going to fill this out with the implementation +03:06 of talking to the API. diff --git a/transcripts/55-uplink/5.txt b/transcripts/55-uplink/5.txt new file mode 100755 index 00000000..3bbe068d --- /dev/null +++ b/transcripts/55-uplink/5.txt @@ -0,0 +1,42 @@ +00:00 Over here at consumer_services_api.talkpython.fm, +00:04 we have at least three services that you can play with. +00:09 So this is the backend for the blog, +00:11 and it gives you the operations right here. +00:14 So you can get, and it'll list, +00:16 if you just do a getting into this, +00:18 it will give you all of the blog posts. +00:19 If you do a get against that, some particular id, +00:23 you'll get the details only about that blog post. +00:26 Create a new one you do an HTTP POST. +00:28 To update one you do a PUT, +00:29 and to actually remove one you do a +00:31 DELETE against these particular URL's here. +00:33 So this can be totally done with requests, +00:36 but it's a lot of juggling the pieces. +00:38 And if you use the restricted version, +00:40 then you've got to use the authentication settings +00:43 that actually go into the headers and stuff like that. +00:45 There's also this kind of crazy SOAP version, +00:48 we're going to stay away from that. +00:49 So, we're just going to focus with this one here, +00:51 but if you wanted to get more interesting stuff +00:54 going on, you could actually use like +00:56 basic authentication with those, and so on. +00:59 So if we look here, +01:01 and you'll see we have a list, and then just +01:03 blog post, blog post, blog post. +01:05 Now these are not super interesting here, right? +01:08 They're just title, content, view count, id, +01:11 which is kind of like a primary key, +01:13 and then the date it was published, okay? +01:16 They're not advanced, but it's plenty for us to play with. +01:20 Right, so we're going to use this URL, +01:22 and I would just leave this open, +01:24 we might come back in and refer to these +01:26 as we build out our service here. +01:27 You guys can play with this, you can update and +01:31 delete posts however you want. +01:33 Actually, it's each person that comes and works with +01:36 the service gets their own copy. +01:37 So don't worry you're not going to mess it up +01:39 for someone, have fun with it. diff --git a/transcripts/55-uplink/6.txt b/transcripts/55-uplink/6.txt new file mode 100755 index 00000000..3c2bb1ee --- /dev/null +++ b/transcripts/55-uplink/6.txt @@ -0,0 +1,100 @@ +00:00 So here's our skeleton of our app, +00:02 let's go ahead and start by defining the client +00:05 for the service we're going to use over in a separate +00:08 class file, so we'll call this blog_client, +00:11 something like that, actually, call it like this, +00:15 and then create the class as BlogClient. +00:18 You just entered Python class, we talked about this +00:20 in the text game, where we built our wizard +00:22 and dragon and stuff. +00:23 The way Uplink works is, +00:25 of course we're going to import uplink, +00:27 and then, we need to derive from this thing called +00:30 an uplink.Consumer. +00:32 Now this will tell Uplink it's going to work with +00:34 our particular methods. +00:35 However, we still need to do a few things. +00:38 We need to define the operations that we're going to see, +00:41 and then have those map to the service. +00:43 So let's go over here and define a method, +00:45 just all_posts. +00:47 It doesn't take any argument, it's just going to go up there +00:49 and download them, that's what we saw +00:52 when we clicked right here. +00:54 Now notice the whole URL is like so, +00:58 and then, for the various pieces, the part that changes +01:01 as you know, basically this little end part, okay, +01:05 so we can actually go and say this, we can say +01:08 define it dunder init, and we can set that at one place +01:11 so we can say super.__init__, so this is going to +01:14 pass this information off to the Uplink consumer, +01:17 notice there's the base_url, so we'll say base_url is, +01:21 alright so we don't have to say that anywhere. +01:23 Down here we can say what we're going to do, +01:25 this is actually going to be an HTTP GET, +01:30 let's just put the details really quick here, +01:31 so, the way that works is we put a little docstring +01:34 here that just says gets all posts, called blog_entries. +01:39 I know they're typically called posts, but the word, +01:42 let's just call all_entries. +01:44 We're going to use HTTP verbs, GET POST and so on, +01:47 and that's, you know, +01:48 nomenclature can be challenging there. +01:50 So we've got this, now this is not +01:52 going to do anything for us right, +01:54 it's just going to return nothing basically, +01:56 but what we can do down here is we can say +01:58 add uplink.get, and this tells it convert this +02:01 to some sort of method that's going to go to the server +02:04 and it's just going to be, let's take that part off there, +02:07 and say api/blog. +02:12 This is literally all we have to do. +02:14 So, we're ready to use this thing. +02:16 Let's come over here and just test it out on one +02:19 and then we'll look at some more interesting pieces, +02:21 so I'm not going to go and write a lot of code here +02:24 to make a print out, I'm just going to show you that it works. +02:26 So let's come over here and we'll say response equals, +02:29 actually we'll have to create our client say svc equals +02:32 blog_client like that, import at the top, +02:35 and then we'll say svc.all_entries, let's just say +02:39 what is this, and let's just say what value does it have? +02:43 Okay, so let's run this and see if any of it works. +02:47 What went wrong? +02:48 Well, I forgot one little detail, we need to call main. +02:55 Let's read our posts. +02:57 Oh my goodness, look at this, +03:00 we got a response from the server 200, +03:02 everything is A okay, +03:03 and it's actually a requests response, +03:07 now it turns out you can use +03:08 other underlying network providers other than requests, +03:11 but if you don't do anything, that's what you get, +03:13 so requests is pretty cool, +03:14 we already talked about that previously, +03:16 that's what we used before. +03:17 So, what we can do, if we come over here and we type +03:19 response., you get no, no help, nothing. +03:22 So let's go over here and quickly add a little +03:24 type annotation that says this returns this, +03:28 and import at the top. +03:30 If we do that, and now we come over here and +03:32 type response. we get lots of good stuff +03:36 so we can say raise_for_status, +03:38 just to make sure this worked. +03:40 If it doesn't work, that line's going to sort of crash, +03:43 and then we can just come down here and say post equals +03:46 response.json, +03:49 and let's just do a quick print out for this one. +03:53 Let's show the view count, and these things have come +03:55 back here, when we say JSON converts to a dictionary, +03:58 well a list of dictionaries, +03:59 so it does do dictionary stuff, so be a view count, +04:02 you can get this from looking just at +04:04 the JSON that actually comes back, +04:06 and we're going to have title, +04:09 so let's run this one more time. +04:11 Let's read the posts. +04:13 Bam, how awesome is that. +04:15 So, we're off to a really, really good start, +04:18 let's go and implement the rest of the features. diff --git a/transcripts/55-uplink/7.txt b/transcripts/55-uplink/7.txt new file mode 100755 index 00000000..8edcb0d2 --- /dev/null +++ b/transcripts/55-uplink/7.txt @@ -0,0 +1,78 @@ +00:00 Now, before we move on from our read posts, +00:02 let's actually do one more thing. +00:04 Let's add another method here, +00:06 that's going to correspond to this. +00:10 So, what we've done so far is we've just gotten +00:12 the general info for all of them. +00:13 Let's get the details for one in particular. +00:16 Theoretically, this one might return more information +00:19 and more details, whereas, the get all of them +00:21 might just have high level info. +00:23 This is going to be interesting +00:24 because we have to pass the post id, +00:26 so, what we're going to do down here +00:28 is let's change this to "show a number" +00:31 so we can say "which number do you want to see". +00:34 The way that, the easiest way to do that +00:35 is to enumerate this and tell it to start at 1. +00:38 And change this to a little number here like this. +00:45 So, that's going to print it out +00:47 and then let's do a, so, we'll ask which number +00:51 they want to view and then we'll say selected_id. +00:56 It's going to be, we're going to go to our posts, +00:58 and we're going to use the selected index +01:00 but we're showing them 1 based in arrays +01:02 but lists are 0 based would you like this dot get_id. +01:08 Now, let's just print out selected_id really quick. +01:13 Just to prove that this little bit is working. +01:15 Now, this is totally missing error handling +01:17 at lots of levels but just to see that it works. +01:21 Just read them, which number do we want to view, +01:23 I want to view 3, alright, so, that's cool. +01:25 It pulls out that id and I'm sure you know +01:27 that that's correct, actually, you have no way of knowing +01:30 but I'm pretty sure it's working. +01:31 So, what we want to do is actually +01:32 go and use this to get some details. +01:35 So, back here we go, and this is going to to be +01:36 similar to what we had before +01:38 but slightly more interesting. +01:39 I'll say, entry my_id, and here we'll pass post_id. +01:46 Now remember, the way this went, was up here, +01:48 we had a slash curly id like this, +01:51 and if we want to call it, you don't want +01:53 to call it id in Python, because id is a built-in +01:55 and it overrides the name, so, you would just put +01:57 this like so, so, when we call this function this value, +02:01 that is going to be replaced right there. +02:03 So, let's say get, so we'll get one particular detail. +02:07 Now, instead of doing this, we'll say selected post, +02:12 entry by id and then we'll pass in the selected_id. +02:16 Now, again, no error checking to make +02:18 sure that this worked and so on but that's okay. +02:20 So, here we'll actually, I need to say response, +02:24 then response.raise_for_status, +02:25 we'll make this a little bit cleaner in a second +02:27 and then we'll have to come over here +02:28 and say response.json because it comes back as JSON, +02:31 until we do this, it doesn't become a thing +02:33 and then let's just print out the details about it, +02:37 here. So, we get it back. Get the response back. +02:40 Make sure it worked. We get the JSON +02:43 and then that turns it into an object +02:44 and we're going to print out here. +02:45 Let's just try this and make sure it works. +02:49 Let's look at the easy breezy Python HTTP clients. +02:53 Look at that, it totally worked. +02:55 We went and got it from the server, +02:57 here's it's id and it's easy breezy. +03:00 Here's it when it was written. +03:01 Here's it's body content and so on. +03:04 This is pretty cool, and so, this is really nice +03:07 the way this is working; it turns out that this +03:09 raise_for_status is a little bit annoying +03:11 that we have to do this each time. +03:13 It would be better if we could tell +03:14 this whole thing just like "hey, don't even +03:16 give me back anything if it didn't work". +03:19 We'll do that next. diff --git a/transcripts/55-uplink/8.txt b/transcripts/55-uplink/8.txt new file mode 100755 index 00000000..3468fff5 --- /dev/null +++ b/transcripts/55-uplink/8.txt @@ -0,0 +1,67 @@ +00:00 This is working pretty well, +00:01 but this constant need to call raise_for_status, +00:03 super annoying. +00:04 So if it came back with a 404, this would give us an error +00:07 and say 404, you didn't get the right response value. +00:10 So let's go fix that real quick. +00:13 Let's do that by adding another little helper thing, +00:15 I'll call this uplink_helpers. +00:18 Now this is not to do with Uplink, this is us. +00:20 Okay, so we're going to write an import uplink, +00:23 and what we're going to do is we're going to define +00:24 what's called a response handler. +00:27 So we'll say @uplink.responsehandler, +00:31 and define a method called raise_for_status. +00:34 You can call it whatever you want. +00:35 And here, it takes the response. +00:37 So, if we put this somewhere in our service description, +00:41 it will be called automatically, +00:43 and we can just do this, response.raise_for_status. +00:47 And that's like calling, +00:48 this is a response which comes from requests, +00:53 this is it's way to check for errors, +00:55 and if it works then we'll just return this and carry on. +00:59 Because it's one of these Uplink response handlers, +01:02 it lets is do this little bit, +01:04 this little trick here, +01:05 that's going to make everything wonderful. +01:10 Let's go over here and put blog 2 right there. +01:13 So let's try to see if we can make it break. +01:16 I want to read, +01:18 fails, could not find this URL, +01:20 and where did this happen? +01:21 It happened on this raise_for_status. +01:25 And what we need to do, is we need to actually call +01:28 that all over the place, +01:29 if for some reason we don't, +01:32 it'll give us some weird value about the JSON not matching. +01:36 Why, because it gave us a 404 not JSON. +01:38 But we don't want to have to call this everywhere. +01:40 So let's get rid of these, +01:42 any it yet, not yet. +01:44 There would be more but we're going to skip them. +01:46 So now what we can do, is we can take, +01:47 from our little helper, +01:49 we come over here and say, +01:52 @raise_for_status. +01:58 Have to import that from our little helpers we wrote here. +02:01 Python is saying this should be listed in requirements. +02:03 It's not technically required, because it's a dependency, +02:06 but yeah, sure, let's go ahead and list it. +02:08 Now this means all of these functions will all of a sudden +02:11 start validating, so if I run this again we should not see +02:14 that JSON error, +02:15 in fact we should see, well it worked 'cause I changed it. +02:18 Let's put it back so it's broken one more time. +02:23 See 404 client error, where did this happen? +02:27 If you go, +02:29 here, +02:31 it's just right when we try to access it, right? +02:33 Even though we're not checking this raise_for_status +02:35 thing that we added, it's really really nice. +02:37 We're going to need to do one more thing like this. +02:38 When you apply these decorators to the whole class, +02:41 it applies to every method. +02:43 If you apply them to a method, +02:44 it applies only to that method. +02:46 Whew, okay, so now we have our error handling in place. diff --git a/transcripts/55-uplink/9.txt b/transcripts/55-uplink/9.txt new file mode 100755 index 00000000..23846fe6 --- /dev/null +++ b/transcripts/55-uplink/9.txt @@ -0,0 +1,100 @@ +00:00 If we look at our service, +00:01 it tell us the way to create a post +00:04 is to add HTTP POST against that URL. +00:07 And what we need to do in our post, +00:10 is basically pass this information along. +00:13 A title, a content, a view count, and a publisher. +00:16 We don't need the id that's generated by the database. +00:19 We need to somehow do that, and it starts out looking pretty +00:25 obvious, but then it's not so obvious it's easy, +00:27 it's just not obvious. +00:29 So we know that we want to do HTTP POST against +00:34 /api/blog, and this will be create new entry. +00:40 And it's going to have some stuff that goes here. +00:43 This'll be create a new post, but what well it turns out +00:50 right at this level, I don't love the way that this works, +00:54 I would like to see something different, but here's how it +00:57 works. Basically you pass +00:59 **kwargs, you pass arbitrary keyword arguments. +01:02 And then what you say is this an uplink.body +01:06 So this document maps to the body. +01:08 Now this is actually not going to work quite at first, +01:11 it's going to give us the funky error, the fix is super easy +01:15 I want you to see me run into the error, +01:17 so that you can get around it. +01:20 It really depends on what the service is expecting, this +01:23 service expects a JSON body, if this was like a form +01:26 post type of thing, then what we actually have is perfect. +01:29 So let's go and try to use this. +01:33 I'll just pay some code that gets the input from the user. +01:36 Okay so, here's what we're going to do, we're going to ask +01:38 for the title, the body, and the view count from the user +01:42 again no error handling on the view count, +01:44 but you should add that. +01:45 And then we're just going to say it's published right now, +01:47 when you right it. +01:48 You can't change that. +01:49 And so we're going to call create new entry +01:51 and we're going to use keyword arguments here. +01:53 Now PyCharm is being a little more, helpful. +01:57 Basically the way they're using type annotations to +02:00 structure the behavior is conflicting with the actual +02:03 type checking that PyCharm is doing here. +02:06 So I'm not sure PyCharm really has this right, I'm not +02:09 sure who I should blame for this little funkiness here. +02:11 But let's just tell it chill out for a minute, so we can +02:14 suppress that for this statement and it will be okay. +02:16 Now this should fail with a 400 bad response, but it's +02:20 not obvious why. +02:22 Let's go and run that, and now notice there's +02:23 a bunch of these that are starting to pile up. +02:26 Let's close them off, and tell this to run a single instance +02:30 so it restarts. +02:31 Alright let's try this, I'm going try to right a post, +02:34 this is going to be just created this, and the contents are +02:39 going to be a new post, it's viewed 71 times, and boom 400. +02:43 Bad request. Why? +02:46 Well it's not at all obvious why, +02:49 you'd have to somehow look at the response from the server +02:52 or something to that effect maybe the server +02:54 could give you a better answer. +02:56 Could not parse the JSON body you sent, +02:58 it looks like this but I expected something else, +03:00 this service doesn't give us enough +03:02 information really to know. +03:03 But I'll tell you what is happening is, +03:05 it's actually doing form encoded post, rather than a JSON +03:09 post. +03:10 So we need to tell this little client, +03:13 hey when you post stuff to this server do that in JSON form +03:16 not standard web form. +03:17 So we can just say a uplink.json. +03:19 So now this applies to every method anytime it sees the body +03:23 that means JSON when we say that. +03:25 Let's run it again and this should work, +03:27 and let's do a quick read just to see. +03:29 Notice there are 4, let's do one, +03:31 now let's write a new post, this was done live, +03:36 and it should come into existence. +03:38 Should be fun to see it appear now, and it's very popular. +03:43 Boom, look at that it's created. +03:45 Well our program said it's created, +03:47 has an id that means is like probably did, +03:50 but let's just hit list again. +03:51 Look at that, number one this was done live, +03:54 and let's actually view the details of it. +03:56 This was done live, right now you can see +03:59 when it was recorded, and it should be fine +04:00 and appears right now, this is totally cool. +04:02 Let's do one little quick fix, up here let's put a comma. +04:05 Digit grouping in there, so over here +04:10 we can say colon comma, that will do Digit grouping. +04:14 Now we can read them, 1000 view perfect this was done live. +04:19 To review we figured out what the URL +04:23 is that we're going to work with. +04:24 For various API end points, we created functions +04:28 that map that information to behaviors we're doing here. +04:32 And then we just call them, and we don't even implement +04:35 anything, look there's literally no implementation to any of +04:38 these methods. +04:39 They're just documented which is pretty wild actually. diff --git a/transcripts/58-tweepy/1.txt b/transcripts/58-tweepy/1.txt new file mode 100755 index 00000000..218ea4c8 --- /dev/null +++ b/transcripts/58-tweepy/1.txt @@ -0,0 +1,21 @@ +00:00 Hello and welcome back to the 100 Days of Python. +00:03 The next three days, I will be your guide, +00:05 teaching you how you can do +00:07 Twitter data analysis with Python. +00:09 First, we set up an application with the Twitter API. +00:12 Next, we set up a virtual environment and import +00:15 the Twitter key secret and access tokens. +00:18 Then, we dive straight in using the cursor object +00:21 of the tweepy module to get all our tweets. +00:24 Then we show our most popular tweets +00:26 based on an average of the number of likes and retweets. +00:29 Then we look at the top hashtags and mentions, +00:32 and finally, we feed all our tweets into an awesome module +00:36 called Wordcloud, which makes a nice visual representation +00:40 of our Twitter usage. +00:42 And the second and third day, I got a lot of +00:44 interesting projects lined up to solidify +00:47 your newly gained Twitter data analysis skills. +00:50 This will be a lot of fun +00:52 and I'm exciting to teach you this. +00:54 See you in the next video. diff --git a/transcripts/58-tweepy/2.txt b/transcripts/58-tweepy/2.txt new file mode 100755 index 00000000..a6902446 --- /dev/null +++ b/transcripts/58-tweepy/2.txt @@ -0,0 +1,14 @@ +00:00 First we want to make an app using the Twitter API, +00:04 so head over to apps.twitter.com/app/new, +00:09 I'm going to call it Twitter API Demo +00:13 to work on the small Tweepy Python code example. +00:17 We can just put in our website and callback +00:19 URL's not needed. +00:21 After I agree with the terms and create your +00:25 Twitter application. +00:26 With the app created you'll want to head over +00:28 to keys and access tokens, +00:31 and note down the consumer key, consumer secret, +00:35 and your access token, and secret. +00:37 And we will need to export those as variables, +00:40 which I will show you in the next video. diff --git a/transcripts/58-tweepy/3.txt b/transcripts/58-tweepy/3.txt new file mode 100755 index 00000000..0ba9f798 --- /dev/null +++ b/transcripts/58-tweepy/3.txt @@ -0,0 +1,45 @@ +00:00 Next we create our virtual environment, +00:03 and normally I would do that with python -m venv venv. +00:12 Here I got an error and I think that's +00:14 because I'm using Anaconda. +00:16 So I got another way of doing it, +00:21 which is virtualenv -p path to the Anaconda's Python +00:26 and then the name of the virtual environment. +00:29 I'm going to remove the one I had and run that. +00:37 Right, as I'm deactivating +00:39 and activating virtual environments +00:41 all the time, I made another useful alias to activate them. +00:47 So here we activated the virtual environment, +00:50 and to get out of the virtual environment, +00:53 deactivate currently there's nothing installed. +00:56 With the virtual environment activated I'm going +00:59 to install the dependencies. +01:02 pip install tweepy and wordcloud. +01:12 Right? +01:14 See what we have and notice that it +01:16 brought in some other dependencies +01:18 like pillow, which is an image library. +01:20 Numpy, matplotlib, I think those are +01:23 dependencies of wordcloud to show the nice visualization +01:27 we see towards the end of this lesson. +01:29 One final thing we need is to export +01:31 the Twitter, key, secret, and access token. +01:34 Let's do at the virtual environment level. +01:37 First, I'm going to deactivate it. +01:40 Then I'm going to edit the venv bin activate script. +01:44 That's a script that runs every time we +01:47 enable or activate this virtual environment. +01:50 You can ignore all this setup and go straight to the end. +01:54 I'm going to make more environment variables +01:57 and here you have to enter the key, secret, +02:00 and access token and secret you got +02:03 when you created the Twitter app. +02:05 I'm going to save that, activate the virtual environment +02:12 and now, if I look in my env, +02:18 we have these access tokens available in our environment. +02:22 In the next video you'll see how I use the os module +02:27 with the environment method to access +02:29 those variables in my notebook. +02:31 And that concludes the setup process. +02:33 In the next video we're finally going to write some code +02:36 to access data from our PyBites Twitter account. diff --git a/transcripts/58-tweepy/4.txt b/transcripts/58-tweepy/4.txt new file mode 100755 index 00000000..5aa23bb0 --- /dev/null +++ b/transcripts/58-tweepy/4.txt @@ -0,0 +1,52 @@ +00:00 Alright, let's do some coding. +00:02 Finally. First, let's import the modules +00:05 we're going to use and do some set up. +00:08 Then, I'm going to define a namedtuple called Tweet. +00:16 And next, I'm going to set some global variables, +00:20 which, in Python, are uppercase, +00:23 and words divided by underscore. +00:26 So, we're going to look at Twitter data from our account +00:29 and here are the environment variables explained +00:31 in last video, loaded into the notebook. +00:34 And you can use os environment or os.environ +00:39 and you can make a script in your favorite editor. +00:42 Or follow along in the notebook +00:44 but notice to load a virtual environment in iPython, +00:49 there is some set up you might need to do. +00:52 So, here's a link and a command you can run +00:55 to get the virtual environment loaded into your notebook. +00:58 That's all set. Lets dive straight into getting +01:02 PyBite's Twitter history which is over two thousand tweets. +01:06 And we're going to look at the most popular tweets +01:09 by the number of likes and retweets +01:10 the most common hashtags and mentions +01:14 and finally, create a nice Wordcloud and we will see that +01:17 Tweepy is awesome in making this very easy. +01:20 Alright, let's make an API object first. +01:31 Alright, and then let's define a function +01:34 to get all our tweets. +01:47 Wow, that's a lot going on here. +01:49 So, we use a Tweepy cursor, which is an efficient +01:53 way to loop all over the tweets. +01:56 And, I'm going to access the user time line, +01:59 which is basically all our tweets, +02:02 screen name is PyBites and for now, +02:05 I'm not going to show replies +02:06 because I need them later. +02:08 I'm going to include the retweets, +02:10 so, basically I get everything. +02:13 And that's good because we can always discard stuff later. +02:16 But we can not put stuff back that was initially not there. +02:20 So, then to loop over it, I use the items +02:23 on that cursor, we had a namedtuple at the beginning, +02:26 with id text created likes and retweets fields, +02:29 and I'm just populating those and yielding +02:32 each tweet one by one. +02:34 So, this is basically a generator, +02:36 which we covered in Day 16. +02:40 Then let's load it on to a list, +02:42 which might take a while, +02:43 but makes it easier to inspect. +02:48 And let's see how big that is. +02:53 Great, so, we have 2400 tweets. +02:56 Let's see what we can do with those tweets. diff --git a/transcripts/58-tweepy/5.txt b/transcripts/58-tweepy/5.txt new file mode 100755 index 00000000..3e8c6c60 --- /dev/null +++ b/transcripts/58-tweepy/5.txt @@ -0,0 +1,56 @@ +00:00 And let's see, in particular, +00:03 what tweets were most popular. +00:05 And I'm going to first use a list comprehension, +00:08 which I showed you on Day 16, +00:10 to exclude the retweets. +00:15 And a retweet is easy to see +00:18 because it always starts with a RT. +00:21 Next, let's get the top 10. +00:25 And for that I need to do some sorting. +00:33 Okay, so how does sorted work? +00:35 You give it a sequence, which is the list of tweets +00:38 and we use the key argument that can take a function +00:41 or callable and we give it a lambda, +00:43 which is basically a just a simple function in a one-liner. +00:46 And we give it a tweet, +00:47 and then it will average +00:49 of the number of likes and retweets. +00:51 That's sorts the list of tweets by highest average. +00:55 And if you then do it reversed=True, +00:57 you get the highest at the top. +00:59 Alright? +01:00 Got already with this format. +01:02 So, let's try the for loop to make it nicer. +01:05 First, I'll do a specify a format, +01:09 which I will then use for every row. +01:15 I got a column of five. +01:19 Separator... +01:23 Another column of five... +01:26 And the text. +01:28 You can use f-strings. +01:30 When I was preparing this notebook, +01:31 I will still using the older formats, +01:33 so I'm going with that for now. +01:36 Besides, if you're not on 3.6, you might still need it. +01:40 I use some nice icons. +01:44 Then I do a dashed line +01:48 which I can just say +01:50 dash times 100 +01:52 and then the loop. +01:53 For tweet in top 10, +01:57 I'm going to print, format, format, +02:01 and then I can just fit in those keyboard arguments +02:04 likes... +02:08 and just for the fun of it, +02:09 let's use a return icon instead of the new line. +02:14 Oops. +02:19 And I have to close this. +02:21 Look at that. +02:22 Our first tweet was the launch of our co-tennis platform. +02:25 And the second one was our Flash course, etc, etc. +02:30 So we have the likes, number of retweets +02:33 and the text of the tweets. +02:35 So here you already see the benefits +02:37 of doing a bit of data analysis to explore your data set. +02:40 And it's not taking that much of code. +02:43 Once we have the data loaded in, it's fairly easy. diff --git a/transcripts/58-tweepy/6.txt b/transcripts/58-tweepy/6.txt new file mode 100755 index 00000000..094f148d --- /dev/null +++ b/transcripts/58-tweepy/6.txt @@ -0,0 +1,41 @@ +00:01 Next up are common hashtags and mentions. +00:04 I mean, we tweet out a lot of stuff, +00:05 but what is the hashtag that we mention the most? +00:09 Let's define two regular expressions, +00:11 one for hashtag and one for mention. +00:14 And we covered regex more extensively in Day 28, +00:17 so you should be familiar with this syntax. +00:20 Then, I'm going to join all the tweets together +00:23 in one big string. +00:26 And if the mentions can be skewed +00:29 by having retweets in them, I'm going to define +00:31 another string with all the tweets excluding retweets. +00:39 Next, I'm going to use the find_all method, +00:41 which we also covered in Day 28, to get +00:44 all the hashtags. +00:49 Cool. +00:50 Then we can use the calendar, which we covered in Day 4, +00:53 in the collections module, to see the most common hashtags. +00:58 Look at that. Obviously we tweet a lot of about Python, +01:01 but also 100 Days of Code. And web frameworks like Django +01:05 and Flask. Oh yeah, Python and 100 Days of Code. +01:10 Let's look at the mentions. +01:15 Look at that. +01:16 Yeah, we really like the work @python_tip is doing +01:19 by tweeting out every day a Python tip or trick. +01:22 @PacktPub, we tweet out the new free e-book every day, +01:26 which is awesome. And of course, @TalkPython, +01:29 we really like the show and +01:31 all the stuff they put out there. +01:32 Then Bader, @RealPython, they have excellent articles, +01:34 etc. So this makes a lot of sense, and it's nice +01:38 to see this in numbers. Although the results are +01:41 definitely correct, I just want to show you how +01:45 the results are if I exclude the retweets. +01:47 So I can just copy this code, +01:52 and instead of "all tweets", +01:54 I'm going to call it on, "all tweets excluding retweets". +02:01 Yeah, that's more or less the same, but there are +02:04 some other users here that bubble up to the top. +02:08 So next up, you're going to make a Wordcloud of +02:10 all our tweets. And it's going to be awesome. diff --git a/transcripts/58-tweepy/7.txt b/transcripts/58-tweepy/7.txt new file mode 100755 index 00000000..d75d666b --- /dev/null +++ b/transcripts/58-tweepy/7.txt @@ -0,0 +1,81 @@ +00:00 Alright, our last part, +00:02 building a Wordcloud. +00:04 I left this in the notebook, although we prepped +00:07 and we have all the requirements installed. +00:10 One way you could also do it is to run +00:13 pip install inside the notebook using an exclamation mark, +00:17 but make sure that your virtual environment is enabled +00:21 to not install it in your global namespace. +00:24 But we have already Wordcloud, +00:25 so let's move on and get all the Tweets, +00:28 but this time we filter out all the retweets I mentioned. +00:31 And as the code is pretty similar as the last video, +00:33 I'm just going to copy-paste it here. +00:36 It looks over the tweets, and it excludes the retweets +00:39 that start with "RT" and with the at sign. +00:42 So, retweet and mention. +00:46 And that should give us a clean list for the Wordcloud. +00:49 Now, here's the wordcloud module. +00:52 It's a little Wordcloud generator in Python +00:54 and you can just feed it a bunch of text +00:57 and it comes up with this nice output. +01:00 You can put a mask on it to get the words +01:03 in the shape you want. +01:05 And I'm going to use that to put the words +01:08 in the shape of our PyBites logo. +01:10 So let's make the Wordcloud. +01:12 I'm going to type it out because it's a bit of code +01:15 and I come back and explain it line by line. +01:31 And this takes a while. +01:33 It's doing a lot of processing in the background. +01:35 So let's wait for it to come back. +01:37 Cool. +01:38 We got a Wordcloud object. +01:40 Let me quickly highlight what happened. +01:42 First, we made a PyBites mask by doing an image.open +01:46 on a PyBites logo I have in my directory. +01:49 An image is from the Pillow library. +01:52 Then we make a set of stop words, +01:55 and stop words we imported in the beginning +01:58 which is part of the Wordcloud module. +02:00 I add, and that was basically by doing some +02:03 trial and error, I had to add co and https +02:07 because those were common tags. +02:09 They're false positives because those are +02:11 related to Twitter links, and, yeah. +02:13 We don't want to have these misrepresent +02:16 our Twitter word populations, so we add them +02:18 to the stop words. +02:19 Then we make the Wordcloud object. +02:22 We give it a white background, max words 2000, +02:25 you would have to try it on your own data set +02:27 what the best value is here. +02:29 We pass it in the mask and the stop words. +02:32 Then we generate the Wordcloud, passing in the string +02:35 of all the Tweets we defined earlier. +02:38 Next up, I want to show the Wordcloud in the browser. +02:42 And we're going to use a little bit +02:43 of matplotlib to do that. +02:51 This might take a bit as well. +02:55 Alright. +02:58 That looks better. +03:00 And look at that! +03:02 We got the Wordcloud in the form of our PyBites logo. +03:05 By the way, this is our logo and mask, +03:09 so you see the similar shape. +03:12 And look at that. +03:13 I mean, what's cool about this is that you really +03:16 see what we're all about: +03:17 100 Days Of Code, Python, Code Challenge, +03:20 API, Django, PacktPub, Twitter. +03:25 So they're really things that stand out, +03:27 flask, of course, so very cool. +03:29 And nice that you can just import the module. +03:32 Three lines of code to create the object +03:34 and four lines of code to make the image, basically, +03:38 and you're set. +03:39 I mean, it's pretty impressive. +03:41 That's a wrap of this lesson. +03:42 I hope you like it and you got a taste of how +03:45 to get data from the Twitter API +03:47 and do a bit of analysis on that data. diff --git a/transcripts/58-tweepy/8.txt b/transcripts/58-tweepy/8.txt new file mode 100755 index 00000000..140ed19c --- /dev/null +++ b/transcripts/58-tweepy/8.txt @@ -0,0 +1,47 @@ +00:00 Lets quickly summarize what we've learned so far +00:03 you can use Tweepy to interface with the Twitter API +00:07 always load API keys and secrets from your environment +00:11 and a way to do that is to use the os.environ. +00:14 Here's how you make a Tweepy API object, then +00:19 we can use that object to get our way to cursor +00:22 till you see we get all the tweets +00:24 from your timeline, then we did a top ten +00:25 of most popular tweets. +00:29 First we looked over all the tweets +00:33 and used sorted to get a written line down +00:35 to get the most popular tweets as defined by +00:38 an average of total likes and retweets per tweet +00:41 and voila. +00:43 I guess some marketing folks out there +00:46 will be interesting to know which tweets +00:47 are doing well, well you can and it's only +00:50 a few lines of code. +00:53 Next is most used hashtags and mentions. +00:56 What are we talking about the most, +00:57 so we define a couple of regular expressions +00:59 and put all the tweets in a big string +01:02 then we use find all in combination with calender +01:05 and we saw that before in the collections +01:07 and regex lessons. +01:08 To get to most common hashtags, +01:11 which were these, and similarly to get +01:15 the most mentioned Twitter handles, +01:17 which were those, very useful info. +01:20 Lastly, we made a Wordcloud of all the tweets +01:23 and we used the wordcloud module, we define +01:26 the mask which was our pilots logo, +01:30 added some stump words to get a better result +01:33 and constructed the word cloud object. +01:35 To get the Wordcloud to show in the notebook +01:38 we used a little bit of matte lot lip +01:42 and look at that, we got a word cloud +01:46 in the shape PyBites logo. +01:51 How cool is that right? +01:52 I mean visually its beautiful but +01:55 its also informative in that we really see +01:58 some words standing out. +02:00 Alright, with these practical examples +02:02 under your belt now its your turn +02:04 to go through, the practical exercises +02:07 we have lined up for you in Day 2 and 3. +02:09 Good luck. diff --git a/transcripts/58-tweepy/9.txt b/transcripts/58-tweepy/9.txt new file mode 100755 index 00000000..d535be41 --- /dev/null +++ b/transcripts/58-tweepy/9.txt @@ -0,0 +1,80 @@ +00:00 Welcome back to the second day of the +00:03 Twitter API lesson. +00:05 And in this video, I will show you +00:07 a couple of ideas and projects you could be working on. +00:11 The one we prefer, specifically, +00:13 is how to make your #100DaysOfCode daily tweet. +00:17 I mean, if you're doing the challenge properly, +00:19 you should tweet out every day your progress, +00:21 which is a great way to share your progress and work +00:24 and also have that extra push to do it. +00:26 To be accountable. +00:27 And, so, we made a script when we did the 100 days +00:31 to automatically tweet out our progress. +00:34 And, obviously, it uses the Twitter API to automate that. +00:40 As you noticed in the lessons, we did mostly get, +00:43 this would be a post request to the API, +00:46 so that would be a nice extension. +00:48 And this is a related article, +00:50 "How To Build a Twitter Bot". +00:52 Basically, how to automate Twitter. +00:54 A very useful tool to have. +00:56 Then there is this three-part code challenge you can do, +01:00 which we broke down by getting the data +01:04 and do some Twitter data analysis +01:06 to find out about similar tweeters. +01:08 Again, you will be working with Twitter API data +01:11 and look at what Twitter users are similar. +01:14 So, that could be interesting. +01:15 And we have number seven, +01:17 which is a Twitter sentiment analysis. +01:19 For this, you don't have to know about, +01:21 like, very sophisticated machine learning libraries. +01:24 Back in the day, we used TextBlob. +01:27 It was quite easy to use. +01:29 Though your analysis would still be +01:31 a bit more intelligent. +01:33 So, you can do one or more of these challenges. +01:35 And here are some extra links if you're more interest +01:39 in testing how to test an API, +01:41 here's an article about parsing Twitter geo-data +01:46 and mocking API calls. +01:48 So that could be interesting for you +01:49 to look at how to use the patch object +01:52 to mock the Twitter API, or Tweepy, in this case. +01:57 And so, this could be another thing you could be working on. +02:00 You could even combine it with the Slack API. +02:04 For example, to post to a channel every time +02:06 your domain gets, or whatever search term, +02:09 gets mentioned, and we did that here, +02:12 so this is our own 100 Days Of Code repository. +02:16 And Day 20, we had this domain mention script. +02:19 So you can take this, adjust it to your needs, +02:22 or build it up from scratch. +02:24 And as you see here, we used another library, +02:28 Twython, which is also very nice +02:31 to talk with the Twitter API. +02:33 And we use the Twython streamer to look at Twitter data +02:36 in real time. +02:37 So, the other thing that you can do, +02:39 which is very interesting, +02:40 is look at Twitter's streaming API +02:42 and combine that with Slack. +02:44 It would be a very cool project to work on. +02:46 Another option is to export your Twitter archive. +02:50 That'll get you a CSV file. +02:52 And then Day 37, you should have learned about +02:54 parsing CSV, so you could also do that to +02:57 get a similar Twitter archive report with some stats. +03:02 One other example, we did a guest post +03:05 the other day on Real Python. +03:07 Another thing you could do is read through +03:09 this article and see how you can use the +03:12 Twitter API to convert tweets of a particular handle +03:16 into a nice web app. +03:18 So, those are quite some projects and examples. +03:21 You can look through them and take whatever interests you. +03:25 The goal, really, is to get more practice +03:27 using the Twitter API with Python. +03:30 And, with that said, don't forget to have fun, +03:33 and keep calm, and code in Python. diff --git a/transcripts/61-github/1.txt b/transcripts/61-github/1.txt new file mode 100755 index 00000000..5e6cf484 --- /dev/null +++ b/transcripts/61-github/1.txt @@ -0,0 +1,17 @@ +00:00 Welcome back to the 100 Days of Python, Day 61. +00:04 Wow, that means you're already 60% in. +00:07 Way to go and keep going. +00:09 I hope you enjoy it. +00:10 The next 3 days, I will be your guide, +00:13 showing you how you can use the GitHub API with Python. +00:17 We will be using a module called PyGitHub, +00:20 which makes it pretty easy to work with the API. +00:23 We will both retrieve data from the API, +00:26 as well as post data to the API. +00:29 While doing that, I will also show you +00:32 the builtin help and their functions in Python, +00:35 to retrieve more documentation from the API. +00:38 And finally, I will also show you how to use pdb, +00:42 the debugger, to look at your code in realtime. +00:45 Working with APIs is a very useful skill to have. +00:48 So I'm very excited to show you how to do that. diff --git a/transcripts/61-github/2.txt b/transcripts/61-github/2.txt new file mode 100755 index 00000000..68fe5c2c --- /dev/null +++ b/transcripts/61-github/2.txt @@ -0,0 +1,54 @@ +00:00 Alright, let's get started. +00:03 First, we need to pip install pygithub, +00:06 which is the module we are going to use +00:08 to query the API and post to it. +00:12 So, let's head over to my terminal, +00:14 and create a virtual environment. +00:18 Let's create a directory, CD into it, +00:22 and, as explained in other videos, I have an alias +00:26 to create virtual environments based on my use of Anaconda. +00:30 So I found a virtual env with the path +00:34 pointing to my Python binary in Anaconda, +00:37 that's the best way for me to do it, +00:39 but as you've probably seen in other videos, +00:42 another way to do it is Python -m +00:46 venv, and the name of your venv, +00:48 which I usually call venv by convention. +00:51 That's totally cool as well. +00:54 But I'm going to go with my setup. +00:59 Then you have to enable the virtual environment. +01:02 So, I'm doing that often because I use virtual environments +01:05 for every project I work on, I have an alias. +01:09 So, I can just type ae, and I'm in. +01:13 So as you see we are starting from a clean slate, +01:16 and I'm going to do pip install pygithub. +01:31 So with that done, head over to the notebook, +01:33 and note that I have the virtual environment enabled. +01:38 Here's how you can do that. +01:42 You need to pip install ipykernel, +01:45 and then there's a command that you can +01:47 set your virtual environment inside the notebook. +01:52 That's why you see me using venv here, +01:55 and having access to pygithub. +01:57 So, let's import the modules we are going to use. +02:03 And it's a bit inconsistent, +02:04 so the package is called pyGitHub, camel-cased, +02:07 but you actually use it as github lowercased. +02:12 Now, let's make a Github object. +02:23 And now I can work with that object. +02:25 Notice that we didn't log in, so we're a bit limited +02:28 in the amount of calls we can make to the API at this point. +02:38 And you will see later that +02:39 when we make this object with a token, +02:41 we can make many more calls to the API. +02:44 And let's work with our PyBites user. +02:51 So, I'm going to store the user in pb. +03:01 And there you go, and before retrieving data from the API, +03:05 let's take a little bit of a detour +03:08 to show you the help functions in Python. +03:10 And that's because I've found the documentation +03:13 not very complete and helpful for this module, +03:16 so, when I worked with this module +03:19 for a co-challenged platform, I used help and there +03:22 to inspect the module and see what was available for use. +03:26 So that's why I want to give you those tips as well. diff --git a/transcripts/61-github/3.txt b/transcripts/61-github/3.txt new file mode 100755 index 00000000..6d42aedf --- /dev/null +++ b/transcripts/61-github/3.txt @@ -0,0 +1,40 @@ +00:00 Let's look quickly how you can get help in Python. +00:03 And some time ago we did an article +00:06 describing the main functions you can use. +00:09 So we have help, dir, combining them, pydoc. +00:13 So let's see if we can use pydoc on the Github module. +00:17 And to use an outside command in you Jupyter notebook +00:20 you can use the ! or exclamation mark +00:23 followed by the command. +00:29 Right, I thought I mistyped a module, +00:31 but doing it on the package and on the module name, +00:34 the importer there is no Python documentation found. +00:39 But not to worry, you can just use help on an object. +00:43 For example, we just created pb, the get_user PyBites +00:47 and I can now type help on pb, and look at that. +00:53 It's a named user and it shows the class +00:55 and the methods and even the URL to the Github API. +01:00 So in the next example we want to see +01:02 the get_repos in action. +01:05 So I can just go to get_repos, +01:09 see what it receives, see what it returns. +01:12 And see the endpoint in the API. +01:21 That's pretty useful. +01:23 And another command is dir, +01:25 you can use it like that, and here we see all the +01:28 attributes on that object. +01:31 So you see the dunder methods, +01:32 the internal methods and the public interface. +01:36 And now I know I can for example, get followers. +01:42 How cool is that! +01:44 Later we will see git gists, and look at how +01:47 huge the API is, how many methods +01:50 and attributes an object has. +01:52 You can get a lot of data out of it. +01:55 We can also just call help on a method like this. +01:58 So we already saw this one before +02:00 but instead of scrolling through the whole object or class +02:04 we can just look at a single method. +02:07 And that's all there is to the basics. +02:10 I use this heavily when I was working with the API +02:13 and let's look at a practical example next. diff --git a/transcripts/61-github/4.txt b/transcripts/61-github/4.txt new file mode 100755 index 00000000..4a8ff480 --- /dev/null +++ b/transcripts/61-github/4.txt @@ -0,0 +1,74 @@ +00:00 All right. Enough introduction. +00:03 Let's write some code and get something usable working. +00:06 So, I mentioned the git repos method before. +00:10 And we're now going to use it on the PyBites +00:12 or pb object to get all the repos and sort them +00:16 by most popular. +00:17 And I define popularity as +00:19 the amount of stars the repo has at this moment. +00:27 So we're going to use get_repos. +00:31 And the GitHub API tells me it's in paginated list. +00:36 Let's define a namedtuple as best practice +00:40 to better describe what we're working with. +00:42 So we have a repo that holds a name, stars and forks. +00:47 Let's write a method, get_repo_stats. +00:55 Let's collect the repos in a list +00:59 which we then can easily sort. +01:11 Let's ignore the forks. +01:21 Right. +01:22 There's some stuff to take in. +01:24 Just run quickly over it. +01:25 So we keep a list of repos, appending namedtuples, +01:29 which we initialize with data +01:32 we're getting back from the get_repos. +01:34 So every element in that paginated list +01:38 contains attributes of which we want name, stars, +01:42 which are called stargazers in the GitHub API, +01:45 and the fork count. +01:46 Then we return to repos list +01:48 and we give it to sorted +01:51 and the great thing about sorted is that it takes +01:53 an optional key argument which can receive any callable. +01:58 Now a lambda is a quick way to define an inline function +02:01 or anonymous function that we use here +02:05 to indicate that we want to sort on the number of stars. +02:08 And we want the high stars up at the top, most popular, +02:12 so we say reversed=True. +02:14 That gives the whole list. +02:16 I put a second argument to this function, +02:19 the number of items we want to see, +02:21 so I can then slice the list like this. +02:24 So, take the first up until n. +02:27 So this will give me item 0, 1, 2, 3, 4. +02:30 And let's call it. +02:34 get_repo_stats on pb user and I leave n off +02:39 so it will default to five. +02:42 An error. +02:43 All right, this already looked weird to me +02:46 and stargazers does not have a count object. +02:49 That's me mistyping it. +02:51 Repo has a stargazers_count. +02:58 And forks is with an s. +03:04 All right, so here we see our most popular repos. +03:07 The challenge is, by far, +03:08 wins and, look at that, 100 Days Of Code, +03:11 very applicable in this course, +03:13 and, if you want to see what we did in our +03:16 100 Days Of Code, we kept a log. +03:20 We saving that the number's correct. +03:22 And here we logged what we did every day. +03:24 And I encourage you to do the same actually +03:26 because when you log it and tweet it out, +03:28 you make yourself accountable +03:30 and it's very likely that you make it to the end +03:32 and you have a great collection of scripts +03:34 to later use in your further Python career. +03:38 Let's look at another user, for example, Mike Kennedy. +03:43 And his user +03:48 is mikeckennedy. +03:53 So, I create an object and I call get_repo_stats +03:58 on mk. +04:01 Now look at that. You can see from this output that his Jumpstart course +04:05 is popular, as well as Write Pythonic Code. +04:08 So that's pretty cool. +04:09 And next, we're going to post to the API, creating a gist. diff --git a/transcripts/61-github/5.txt b/transcripts/61-github/5.txt new file mode 100755 index 00000000..fa335608 --- /dev/null +++ b/transcripts/61-github/5.txt @@ -0,0 +1,99 @@ +00:00 Alright, let's post to the GitHub API, +00:03 creating a gist. +00:05 Now, with the current access, +00:06 we cannot just post to the API. +00:09 It would mean not very secure, right? +00:11 So we need to create some sort of access token. +00:14 And there are various levels of access. +00:18 I mean the GitHub API is pretty granular. +00:20 But for this one, +00:21 I'm going to create a personal access token. +00:25 Let's go to my GitHub account, +00:28 settings, +00:32 developer settings, +00:35 personal access tokens, +00:37 and click on generate new token. +00:42 I'm just giving the description. +00:50 And look at all the scopes. +00:52 There's a lot of different access levels, +00:54 but I'm interested now in creating gist. +00:57 So I click on the corresponding access. +01:01 And I click on generate token. +01:05 That gives us our token. +01:06 And next I will show you +01:08 how to load that into the notebook. +01:10 As per best practice, +01:11 never leave such a token in your code. +01:14 But load it from the environment. +01:16 So back at the terminal, +01:19 deactivate the virtual environment, +01:21 open your venv virtual environment, +01:24 the name of your virtual environment. +01:25 venv, activate script with your favorite editor. +01:30 Go to the end, +01:31 and let's export +01:33 github_gist_create_token, +01:39 fit a token your just copy over. +01:42 Save this, +01:43 activate the virtual environment again. +01:47 Source or I have my alias set up. +01:53 And now I should have the variable in my environment. +01:58 Okay, great. +01:59 We can now post to the API. +02:02 Let's load in the token. +02:06 It would not be available +02:07 that would give me a keyerror. +02:08 So we are good. +02:10 Let's create a new object. +02:16 Passing in the token. +02:18 And to come back on those rate limits, +02:22 look at the difference. +02:26 Look at that. +02:27 Now we can make five thousand calls to the API. +02:30 Compare that to the, what was it? +02:32 50 or 60 before, +02:33 so authorizing with a token gives you more power. +02:37 Let's get my user. +02:42 And you see that I'm an authenticated user. +02:45 And now, let's create a gist. +02:52 Hold on there. +02:54 I'm missing required arguments. +02:56 Yeah, that's not going to work straight away, of course. +02:59 And I did that on purpose, +03:01 to go back to the help. +03:04 Look at that, +03:05 that's the contract or the interface we have +03:08 to this method of the API. +03:10 We defined if the gist is going to be public or not. +03:14 We give it files and a description. +03:17 And notice that the files need +03:19 to be of an input file contact type, +03:22 which I imported at the start. +03:24 So let's first, write some code to be posted. +03:29 So I have some code here, +03:31 that's actually the code we wrote before +03:33 to get the repo stats. +03:35 I'm not going to share this with the world. +03:37 Excitement! +03:38 So that would be me, +03:40 create, gist, public True. +03:45 And then we need to patch it +03:46 in a dictionary of the file name. +03:49 The name of the gist, +03:51 I'm going to call it, +03:53 repostats.py. +03:55 And the value would be that input file content object. +04:02 And I pass it in my code. +04:04 And lastly, +04:05 we give a description. +04:08 GitHub users most popular repos. +04:12 Alright, let's run this. +04:14 And it comes back with a gist. +04:17 Let's go over to GitHub. +04:24 And look at this. +04:25 There is a repo_stats.py, +04:29 which was just created by my user. +04:33 And look at that. +04:34 This code is now available to the world. +04:36 And it was automatically posted via the GitHub API, +04:40 using Python. diff --git a/transcripts/61-github/6.txt b/transcripts/61-github/6.txt new file mode 100755 index 00000000..4a58379b --- /dev/null +++ b/transcripts/61-github/6.txt @@ -0,0 +1,67 @@ +00:00 Finally, let's wrap up with a pro tip. +00:03 Use pdb to inspect GitHub objects. +00:06 Let's say I want to see all the gists of PyBites. +00:14 So we do a get_user on the GitHub object from before. +00:23 And I call get_gists. +00:28 And I look over them. +00:30 Let's copy this in. +00:31 I'm just going to print the description +00:33 created at and the link to the gist. +00:42 So now I knew about these attributes already, +00:46 but if you don't and you want to inspect the gist, +00:48 what you can do is break +00:53 at this point using pdb. +00:57 This would be the same from the REPL +01:00 and this allows me to inspect the objects +01:03 that are currently in the program's execution. +01:05 It's like if the current frame of the execution +01:09 has been paused and you can just inspect all of that. +01:12 It's like, "Time out," and only you are in +01:14 and you can see all the things. +01:16 Nothing is moving. +01:17 I can look at the object. +01:21 This not really, this doesn't look very nice. +01:23 I can use pp. +01:25 And here you see a better representation of the object, +01:30 nicely laid out. +01:32 So here is the section I'm interested in. +01:36 The files, for example, that are associated with this one. +01:40 And look at that how, you can drill down +01:42 how rich the objects are in the API. +01:46 For example, the owner, I can go +01:48 all the way to his avatar, his URL. +01:52 I could inspect the owner, +02:05 etc. +02:06 It's worth to spend a little time +02:08 reading up on pdb. +02:10 It's very useful, not only to debug issues, +02:13 but also to inspect your program and its objects +02:16 as you're building it. +02:17 And we did an article in PyBites about pdb +02:21 which, if you are interested, is an interesting read. +02:28 Back to the example. +02:29 You can also use help from pdb. +02:34 And you have to actually use exclamation mark. +02:38 And look at that. +02:39 Here's the gist class with its methods and attributes. +02:43 So, here, for example, we have a fork of +02:46 and that we can use to see if +02:48 the gist was forked off somebody else's gist. +02:52 So let's try that next. +02:53 I'm going to copy and paste the previous for loop, +02:57 that used that new attribute that we found in help. +03:02 Right, this hangs because I still, +03:04 that's important and maybe less obvious here in +03:08 the Jupyter notebook. +03:09 When I'm still in pdb, I do need to exit the prompt. +03:13 And there you see that it then finishes the cell +03:16 and I'm ready now to execute the next cell. +03:21 So here we see that some of the gists we have +03:24 we're based off forks. +03:27 This one was not. +03:30 And this one, for example, was forked. +03:34 And you can see that here. +03:36 Cool. +03:38 And just because we can. +03:44 And that's a wrap! +03:45 I hope you enjoyed this lesson of the GitHub API. diff --git a/transcripts/61-github/7.txt b/transcripts/61-github/7.txt new file mode 100755 index 00000000..9e8d6ecf --- /dev/null +++ b/transcripts/61-github/7.txt @@ -0,0 +1,41 @@ +00:00 Let's review what we've learned so far. +00:02 First, we did some setup. +00:06 We had to create a virtual environment +00:08 and pip install pygithub. +00:11 Then, we looked at how you can create a Github object +00:14 to interface with the API. +00:19 Use the get_user method to get info off our PyBites user +00:24 and we've seen that you can use help +00:27 to inspect that object +00:29 to see all the methods and attributes available. +00:34 The same with there. +00:37 And even more interesting, you can use pdb +00:39 to live inspect your code as it is running. +00:42 That was very useful for me working with this module. +00:45 Then we wrote a script +00:46 to get the most popular repos of PyBites. +00:51 We use the get_repos method of the API +00:53 and saw how you can use lambda to sort on an attribute, +00:57 in this case, stars, of the namedtuple +01:00 to get the most popular repo at the top. +01:05 Which lead to this output +01:06 and the Github API offers a ton of data. +01:09 And lastly, we did a post request +01:11 to the API by creating a gist. +01:15 We created an access token and we saw how you can load it +01:18 into your script via the os.environ method. +01:23 We made a Github object with the token +01:26 and saw that the rate limiting increased. +01:29 So you can make more calls to the API +01:30 when you're authenticated. +01:33 Then we used to create_gist method +01:36 to get all of the input file content +01:38 to post code to the Github API. +01:40 So we had some code, which was actually a script we wrote, +01:44 and we used the method saying public True, script name, +01:48 code, wrapped into the input file content method, +01:52 and a description. +01:53 Look at that. +01:54 That created a gist on Github. +01:58 And now it's your turn. +01:59 Keep calm and code in Python. diff --git a/transcripts/61-github/8.txt b/transcripts/61-github/8.txt new file mode 100755 index 00000000..2c3e06f1 --- /dev/null +++ b/transcripts/61-github/8.txt @@ -0,0 +1,41 @@ +00:00 Welcome back to the second day +00:02 of the Github API project and today it's your turn +00:06 to start using the API with Python to build +00:09 something practical, something usable, something you like. +00:13 We've done a couple of code challenges +00:14 on the PyBites blogs that are related. +00:17 One was to query your favorite API. +00:20 And one of the submissions was building a +00:22 Github profiler that takes a user name +00:26 and returns a nice profile page using Flask. +00:30 That could be a nice use case here. +00:33 Secondly, there was Oktoberfest, +00:36 by Digital Ocean last October, +00:38 and you could get a t-shirt if you made four pull requests, +00:41 and obviously the Github API was used +00:44 to measure the amount of pull requests +00:47 so we made a challenge to use bottle +00:50 to replicate that application, +00:52 and although that it's not running anymore, +00:55 it's still a cool app to query the amount +00:57 of pull requests a user makes during +01:01 a certain period, so that could be another thing to work on. +01:04 Then I want to highlight co-challenges. +01:07 Our platform that uses to Githun API +01:09 to log in users and we have a dedicated button. +01:14 And I'm already logged in with Github +01:16 as you saw in the previous lesson. +01:18 And another feature for example +01:20 is the whole integration of our blog challenges. +01:23 The flow is like write up, setup with git, +01:27 total whole process of making your branch, +01:30 and finally you can submit your work. +01:31 And if you do a PR, we used to get API +01:35 to reach out to your branch and see if you +01:38 actually committed Python fouls, +01:40 which in this case I did not, not yet. +01:42 And this again is integrating the Github API +01:45 into our web application, so that's another example. +01:49 And that's it, that's those are a few ideas, +01:52 and be creative, remember this is great stuff +01:55 to show in your Github profile, so have fun and learn a lot. diff --git a/transcripts/61-github/9.txt b/transcripts/61-github/9.txt new file mode 100755 index 00000000..322d60dd --- /dev/null +++ b/transcripts/61-github/9.txt @@ -0,0 +1,35 @@ +00:00 Right, welcome back to the third day of +00:02 the GitHub API project. +00:04 I hope you had some fun by now using the GitHub API +00:07 and you chose an interesting project to work on, +00:10 and this gives you some more links. +00:12 So here's the GitHub Developer REST API +00:15 Version 3 documentation. +00:17 You probably will use this a lot, +00:20 although it should also try to help in the pdb inspection +00:24 techniques I showed you in this lesson. +00:26 And maybe if you're not making the GitHub objects +00:29 with a token, you might run into limitations +00:33 of the amount of calls you can do to the API. +00:35 Here is an article about request cache. +00:38 The cache is close to the API in an SQI database, +00:42 so when you're developing your cool app, +00:45 and you do a lot of calls to the API, +00:48 this could actually be useful to +00:49 keep that limit down. +00:51 The other thing is that this might +00:52 speed up the response from the API, +00:55 because it just creates your local database. +00:57 So this just an extra pointer you might +00:59 want to check out when working with +01:02 any API actually. +01:03 And don't forget to share your work. +01:06 You can use #100DaysOfCode, there's a lot of people +01:09 doing that, and that's getting quite some traction. +01:13 And of course, feel free to include +01:15 Talk Python and PyBites in your tweets. +01:17 We are really passionate about this stuff, +01:20 and love to see what you guys are doing +01:23 and coming up with. +01:24 Have fun and go learn a lot of API GitHub goodness, +01:28 and Python of course. diff --git a/transcripts/64-email-smtplib/1.txt b/transcripts/64-email-smtplib/1.txt new file mode 100755 index 00000000..f653815a --- /dev/null +++ b/transcripts/64-email-smtplib/1.txt @@ -0,0 +1,20 @@ +00:00 G'day everyone, welcome back. +00:01 This is Julian Sequeira again +00:03 and welcome to Sending Emails with SMTPLib. +00:06 This is one of my favorites +00:09 just because I love automating stuff, right. +00:12 And this is one of the first cool things +00:14 that you're going to automate with Python. +00:17 Sending emails virus stripped +00:19 is extremely gratifying and awesome +00:21 if you want to spam your friends +00:23 and I think you're really going to enjoy it, too. +00:26 So, the point of these videos +00:28 is to teach you how to send an email +00:30 using a script, SMPTLib +00:32 and the Python MIME modules +00:35 which I'll explain in a bit. +00:38 So, click next and carry on with the videos. +00:41 Next, we're going to set up your Gmail application ID +00:44 and then straight from there, +00:46 create a script. diff --git a/transcripts/64-email-smtplib/2.txt b/transcripts/64-email-smtplib/2.txt new file mode 100755 index 00000000..a5973590 --- /dev/null +++ b/transcripts/64-email-smtplib/2.txt @@ -0,0 +1,54 @@ +00:00 Okay, the first thing we want to do +00:02 is generate an application password or an application ID. +00:06 This is a specific code, a string +00:08 that we are going to insert into our script +00:12 that allows your script or you program to talk to Google +00:16 okay, this is going to talk to your Google account +00:19 and it'll give you a script access +00:21 into your Gmail account in order +00:23 to be able to send these emails, okay. +00:27 Naturally that needs to happen +00:28 or just anyone could script your account, right? +00:32 So we kind of want to have something like this. +00:34 Now I'm looking at a support.goggle Article 185833, +00:41 just write that number down, 185833 +00:46 that is the article all about signing in +00:49 using application passwords. +00:51 If you go down to How To Generate An App Password +00:54 you can click on App Passwords here +00:57 that takes you to security.google.com +01:00 Settings, Security, App Passwords okay +01:06 don't worry these will all pop up on the screen +01:08 as you're watching this. +01:10 Now, let's just copy and paste that. +01:16 You'll be asked to log in, okay +01:19 enter your Gmail password or your +01:21 Google account password I should say +01:23 and then you can progress to the next screen. +01:33 Once we're logged in you can then see +01:35 any existing application passwords you might have running. +01:40 Probably the safest thing to do would be +01:42 to create one of these passwords per application, okay. +01:46 That way if it ever gets compromised +01:49 it's only really one, you can delete that +01:51 and you'll only impact one application. +01:55 Now to do this, to set one up, you click on +01:57 Select The App, now we want to work with our mail, +02:02 okay, so that's what we're going to select +02:04 select a device, now in this case, +02:07 we're going to choose Other, Custom Name +02:09 let's just call it 100 Days Script +02:13 alright and then we click on Generate. +02:17 And this will give us a nice pop up +02:19 with the application password in a yellow rectangle. +02:22 So like I said, it's going to be mapped to one application +02:27 store it in there maybe save it in a password vault +02:31 if you feel you're going to lose the application +02:33 or the environment variable just keep +02:36 very close tabs on this, understanding that +02:40 it has full access to your account, okay. +02:43 So be careful, be very careful +02:46 and, click on Done and then you'll be able to see it +02:49 in your current application passwords +02:52 and that's it, keep that password handy +02:54 we're going to need it in the next script. diff --git a/transcripts/64-email-smtplib/3.txt b/transcripts/64-email-smtplib/3.txt new file mode 100755 index 00000000..a070bbad --- /dev/null +++ b/transcripts/64-email-smtplib/3.txt @@ -0,0 +1,19 @@ +00:00 Alrighty, this one's nice and quick, +00:02 the setup, so just go ahead +00:04 and create yourself an emailer folder. +00:06 whatever you want to call it for this project, +00:08 and install your virtual environment. +00:12 Now, with this, smtplib and the mime modules +00:16 they're all built in, it's all standard Lib. +00:19 So you actually won't need to pip install anything extra. +00:22 Not for this, but as always let's just +00:27 activate our virtual environment +00:29 just so we have a nice clean environment to run in. +00:34 And in this directory go ahead and create yourself +00:37 two files, I'm separating them just for ease +00:40 of explanation right. +00:42 So we're going to create an emailer file +00:45 and an emailer-mime file. +00:49 Call them whatever you want, +00:51 that's just what I'm naming them. +00:52 And let's populate the files. diff --git a/transcripts/64-email-smtplib/4.txt b/transcripts/64-email-smtplib/4.txt new file mode 100755 index 00000000..b069d17c --- /dev/null +++ b/transcripts/64-email-smtplib/4.txt @@ -0,0 +1,136 @@ +00:00 All right, let's look at that blank slate, +00:03 it's a bit daunting, isn't it? +00:04 So let's fill it up. +00:06 Now, this one here is going to have a few different sections, +00:10 okay? +00:11 It might be a bit complex if you're quite new to this stuff +00:14 but just roll with it and let's see how we do, okay? +00:18 So we're going to start off our application +00:20 using Python 3 and we're going to import our smtplib. +00:26 Nice, all right. +00:28 So when we send an email using smtplib, +00:31 we need an address that we're sending from. +00:35 That's going to be our Gmail, right? +00:38 And we need to send the email to someone, +00:40 so let's just set up two variables for ourselves, okay? +00:46 from_address, let's use the PyBites email. +00:52 Feel free to spam, no actually don't spam us on that, please +00:55 and you can send us some fan mail, +00:59 maybe some, "Hey guys, you're doing a great job," emails. +01:04 Or Julien is cooler than Bob. +01:05 No, I'm just kidding. +01:07 So we have to_address, +01:08 well, we're going to send it to ourselves, okay? +01:11 That way I don't accidentally spam someone +01:13 'cause that actually did happen. +01:15 Now, the email needs body, right? +01:18 This is the text that's going to be populating +01:22 our email script, or our email that we send out, okay? +01:26 Now, I use this script for sending out my email +01:31 to myself for new releases on Steam, +01:34 you know, the game platform. +01:36 So this just going to be a string of some sort, okay? +01:40 It could be a paragraph, it could be whatever you want. +01:43 However it shows up here is going to be the plain text +01:45 that shows up in your email, okay? +01:48 That includes carriage returns and whatnot, +01:51 so we'll just go new releases on +01:54 and sales on Steam. +01:59 Click the links below to check them out. +02:04 Excellent, done. +02:06 Get that right. +02:08 Now, for the nitty-gritty, all right? +02:10 So the first thing we need to tell our script +02:13 is what smtp server we're using. +02:17 So while we in our heads are thinking +02:18 yes, let's use some Gmail, +02:20 our script actually has no idea. +02:23 So we're going to set up a little... +02:25 Oops, smtp, not pt, I always get that wrong +02:29 server equals and now we start using our... +02:33 Oh jeez, every time. +02:34 Now we start using our smtplib module so +02:39 smtp and within the brackets, +02:41 this is where we want to use the Gmail settings. +02:44 Now, these just copy off me smtp.gmail.com. +02:50 You can easily google for these, okay? +02:52 If you just search for Gmail smtp settings, +02:55 you'll get them, okay? +02:57 And the port number to use is 587. +03:01 That's just a number, you don't need to put +03:04 the apostrophes around it, the quotes around it, okay? +03:08 Now, one cool thing that smtplib does is it essentially... +03:13 It requires you to send a hello message, +03:16 almost think of it like a heartbeat, right? +03:18 It has to send this hello message to the smtp server. +03:24 And that way, if there is a failure, +03:28 if, for some reason, the server is unreachable, +03:31 you will get an error in return and your script won't run, +03:35 it won't go through all of these steps for nothing, okay? +03:39 And we do that using smtpserver.ehlo, +03:45 that's it, okay? +03:47 By calling that, by running that, +03:49 we send the sort of heartbeat off to the smtp server +03:53 going, "Are you there? Can you respond?" +03:56 That sort of thing, all right? +03:58 Next up, we want to start the encryption, okay? +04:01 We're using TLS because it's Gmail. +04:05 This is all you googly available, all right? +04:08 Google it, you'll find out, okay? +04:11 So start TLS, that's it. +04:15 Start our encrypted session, right? +04:17 And now, we do the login. +04:20 So makes a bit of sense, right? +04:22 We want to start an encrypted line first +04:24 before we put in any sort of cryptic details, okay? +04:31 So smtp, now we want to actually provide our details +04:34 to the server so we'll logging in, all right? +04:36 So smtpserver.login +04:39 and we're going to put our email +04:43 that we're sending the email from, okay? +04:46 This is your Gmail account that you'll be using +04:49 for automation that you're sending the emails from. +04:52 And now, in this section here, +04:57 you put your application ID, password, +05:01 whatever you want to call it, okay? +05:04 Now, I'm obviously not putting mine in there +05:07 because I don't want you to use my email to spam me +05:10 or get up to other sort of mischief, right? +05:13 Now that that's there, we can go smtpserver.sendmail. +05:19 Yay, send mail, this is the actual fun part, +05:22 this is where we're sending our email. +05:24 So we need three things here. +05:26 What do we need? +05:27 We need the from_address, +05:28 we need to know where we're sending the email from. +05:31 We need to know where we're sending the email to +05:33 and we need the stuff that populates the email, all right? +05:37 So we have from_address, +05:40 we have to_address +05:42 and then we have the body. +05:45 There we go, from_address, to_address and body. +05:50 That's it. +05:51 That's all, we're done. +05:52 Now, as we've come to learn a lot of modules require us +05:57 to close the connection, okay? +06:00 So we're going to close our connection to this and smtp server +06:03 and I like to add something just for login, +06:08 email sent successfully and that is that. +06:14 So if you've done all of that right, +06:16 and you run this script, +06:18 you will end up with an email, okay? +06:21 And it will just be a nice, simple plain text email, +06:23 you'll notice a few things about it +06:24 which I'll show you in just a second. +06:27 Obviously, I can't run this one, +06:28 so I actually have this script fully written +06:31 with my application ID elsewhere, +06:34 here's one I prepared earlier. +06:35 And this is what the email looks like. +06:40 And we just bring up Gmail here, +06:43 and there we go. +06:44 So you can see there's an email that was sent, +06:46 it says new releases and sales on Steam, +06:48 click the links below to check them out. +06:51 That's it, right? +06:52 We only specified diff --git a/transcripts/64-email-smtplib/5.txt b/transcripts/64-email-smtplib/5.txt new file mode 100755 index 00000000..51b75c38 --- /dev/null +++ b/transcripts/64-email-smtplib/5.txt @@ -0,0 +1,151 @@ +00:00 Before we get started with the actual code, +00:03 let's just understand a bit what MIME is. +00:06 MIME is actually an acronym for +00:09 Multipurpose Internet Mail Extensions. +00:13 I'd rather say MIME than all of that. +00:16 With MIME, it actually extends email functionality. +00:21 You think about all the cool HTML stuff, +00:24 and audio, video, images and so on +00:27 that you can attach to emails, and all of that. +00:30 That's all thanks to MIME. +00:33 It's not plain text. +00:35 It actually allows you to give your emails multiple parts +00:41 such as header information, and all of those nice things. +00:44 One thing you'll notice looking at the screen here +00:46 is without email from the previous video, +00:49 the SMTPlib sendmail, we don't have a subject. +00:53 We don't really have much at all. +00:55 There was nothing for BCC. +00:58 There was nothing. +01:00 That was the real basic, basic stuff. +01:04 With MIME we get to go a bit further than that. +01:07 Let's hop into the emailer-mime.py file you created, +01:11 and let's get cracking. +01:13 Now we're import smtplib as we did before. +01:20 We'll keep that the same. +01:22 Now we need to actually start importing the MIME modules. +01:26 It's not too bad. +01:29 Just roll with it here, alright? +01:30 This seems a bit complex, but from email.MIME, +01:37 this is all just the stuff in the module +01:39 that we're taking out, okay? +01:42 We're not going to import everything, just what we need. +01:45 From email.mime.multipart, import MIMEMultipart. +01:51 This is the module that's going to allow us to, +01:55 I guess, section up our email. +01:58 Build our email together, alright? +02:01 You'll see what that means in a minute so just roll with it. +02:04 from email.mime.text, import MIMEText. +02:11 This is just to do with the text section. +02:14 Again, you'll see how this all fits together in a minute. +02:18 Alright, so we'll stick with what we know. +02:20 We get a from_address. +02:22 pybitesblog@gmail.com, okay? +02:26 Now we want a to_address. +02:29 Now one thing I would like you to consider here +02:33 is the BCC, the essence of BCC, alright? +02:38 That was a carbon copy, blind carbon copy. +02:42 That means no one can see who's been BCC'd on an email. +02:47 Now with that, you'll notice that MIME actually fails us. +02:51 I'm going to touch on that in the next video, +02:54 so don't panic. +02:55 Let's just go with this, okay? +02:58 To address, let's again stick with what we know. +03:04 pybytesblog@gmail.com. +03:07 Alright, now what we want to do is we want to take +03:13 the ability to build our email using multipart. +03:19 We're going to take that function and we're going to assign it +03:23 to the message object, alright? +03:25 We're going to make that our message object. +03:29 Why do we do that? +03:30 Just because it's easier to use message +03:32 instead of my multipart. +03:34 Again, you will see what I mean. +03:37 Alright, so what are the different sections +03:38 that we want to build? +03:39 Well we want to build our header. +03:41 To build our header, this is the format. +03:44 We want to have a from field, so message from... +03:51 Is what? +03:52 Well it's going to be our from_address, that's it. +03:57 What we've done is we've actually built +03:58 this little header tag that will actually extend +04:01 the functionality of our email. +04:03 Our email will look nicer and will have that as a valid id +04:08 for the from field. +04:10 Next, we want to have to, so message to... +04:16 We're going to use our to address. +04:19 Nice and easy so far, right? +04:22 Now for the fun part. +04:24 Now we get to specify a subject. +04:27 Message subject equals, well how about we take +04:31 that first line from the last one? +04:33 New releases and sales on steam, okay? +04:40 You can call that obviously whatever you want +04:41 for this practice round. +04:43 Now back to this, we'll build our body. +04:47 I'm just going to take the exact same text +04:51 from our previous script, dump it in there, right? +04:57 Now we want to build it all together. +05:00 We go message.attach, and now we're going to attach, +05:06 if you just paid attention for a second there +05:09 you would've seen that we just created body. +05:11 We didn't actually assign it to message. +05:15 This isn't included in our message. +05:18 That's what this attach thing is doing. +05:19 It's attaching our bulk, our body to the message. +05:24 Message.attach, and this is where MIMEText comes in. +05:30 Now we're taking our body. +05:32 Again, that's this object here, this variable. +05:35 What kind of an email, what kind of a body +05:39 is this going to be? +05:40 Well it's just going to be plain text, not okay text. +05:44 Yes, to answer your question, you can put HTML there. +05:48 Your body can be filled with HTML tags. +05:52 You can literally write HTML between these three here, +05:56 and it will form your HTML email. +05:59 That's just a bit beyond the scope of this +06:01 as it's a bit too much. +06:02 Alright, now we move into our normal SMTP stuff, +06:07 so a bit of magic. +06:09 We're just going to make all of that appear here, +06:12 and we're back. +06:13 It's exactly the same smtplib stuff +06:18 that we saw in the previous video. +06:20 Just chuck it in there. +06:21 You can feel free to edit your existing script, +06:23 whatever you want to do. +06:25 Now when we run sendmail, if you remember +06:29 we threw the body in there, okay? +06:32 We had the from_address, the to_address, and the body. +06:36 In this case, body has already been thrown into our message, +06:41 so how do we combine that? +06:42 How do we get this working? +06:43 Well sendmail needs string, it needs text. +06:49 It doesn't like an object like the message object +06:54 being thrown in there, okay? +06:56 What we need to do is get our message as a string. +07:03 message.as_string, and we'll assign that to text. +07:10 Again, this here text, you can make that whatever you want. +07:13 Let's give ourselves some white space. +07:15 Delete that in a minute. +07:17 Alright, and then we get back down to smtpserver.sendmail, +07:22 and we're going to go from_address, oops. +07:26 We're going to go to_address, and we're going to go text. +07:32 Then as usual, SMTPserver.quit, and we're done, okay? +07:40 Now let's just quickly throw in this +07:43 print email sent successfully. +07:46 Save that. +07:48 Now when you run your script, +07:50 you should get an almost identical email. +07:54 The body should be exactly the same, because again, +07:57 we didn't do anything differently here. +07:59 The thing that's cool is that you should have a subject, +08:02 and some more header information. +08:05 Let's have a look at that. +08:08 Alright, so there's the email. +08:10 New releases and sales on steam. +08:13 And now you can see the same information there. +08:16 When we drop that down we can see a to_address, +08:20 and which is my email , +08:22 and yeah, that's it. diff --git a/transcripts/64-email-smtplib/6.txt b/transcripts/64-email-smtplib/6.txt new file mode 100755 index 00000000..ebbc0ab6 --- /dev/null +++ b/transcripts/64-email-smtplib/6.txt @@ -0,0 +1,78 @@ +00:00 One last thing I wanted to show you really really quickly, +00:03 was the BCC, okay? +00:06 A lot of the times, if you send, if you're automating +00:08 this sort of thing, you don't want everyone to see +00:10 everyone who this e-mail is being sent to, right? +00:13 So imagine you have a mailing list of something. +00:16 Imagine sending out all 100 to 2,000 e-mails +00:21 and everyone's seeing each other on the e-mail. +00:23 Not great, okay? +00:25 So you can actually BCC this. +00:29 As I mentioned before, MIME does not honor BCC by default, +00:35 it's actually by design. +00:36 Go figure, right? +00:37 If you were to create +00:39 an object in here, message... +00:42 BCC, for that field, it actually works in that, +00:46 that field is populated with the e-mail addresses +00:50 that you put in there. +00:51 The problem is, it doesn't honor the nature of BCC +00:54 in that it's blind. +00:56 It may as well be a CC field, +01:00 tagged as a BCC field. +01:02 It's kind of crazy, right? +01:03 And it was something I struggled with for, +01:05 for a while. +01:06 So the way I get around this using MIME and +01:09 SMTPLib is by throwing it into +01:13 your SMTP server line. +01:16 This send mail line I should say. +01:18 Okay? +01:19 So let's say... +01:22 I have three e-mail addresses. +01:23 I'm just going to copy them and paste them in here, right? +01:29 Done. +01:31 So we've got Codewright's blog, we got my e-mail at Gmail, +01:34 and which doesn't actually work, +01:36 and we've got e-mail at Gmail, which I'm hoping +01:38 doesn't work either. +01:39 Now... +01:41 If we again, if we were to do it this way, +01:44 with the message building in the multi part, +01:47 all of these e-mails would see each other when they get +01:50 your e-mail, right? +01:52 So what we actually want to do, +01:55 is rather than do it in specified +01:58 in your header information, +02:00 because that gets displayed by default by design. +02:04 We'll just throw it down here +02:06 into the send mail section. +02:10 In order to do this though, +02:12 if you think of it this way. +02:14 Think about your types here. +02:17 Your Python types. +02:19 to_address is a string, +02:23 which means you can't easily +02:26 add these onto it, because BCC is a list. +02:31 So how do we get around that? +02:33 Well, we make to_address +02:37 a list down here, and then we add on to it with BCC. +02:42 That's it, okay? +02:44 All you need to do is send this now, +02:46 and everyone on your BCC list +02:51 will get the e-mail and they won't be able +02:53 to see each other. +02:55 And furthermore, in the production environment +02:58 or something more official than this demo, +03:00 you'll probably make your BCC list of e-mails. +03:04 This will be an e-mail list. +03:05 You'll pull from a database or something like that, +03:07 and then you'll just pull in the list, all right? +03:10 You won't have to type them all into your script, +03:13 because that'd be ridiculous. +03:14 So there's our send mail with from_address +03:18 to_address, as a list. +03:21 With BCC added on to it, and then our text body, +03:26 and that's it. +03:27 So enjoy, and good luck with all your +03:30 e-mail automated needs. diff --git a/transcripts/64-email-smtplib/7.txt b/transcripts/64-email-smtplib/7.txt new file mode 100755 index 00000000..10e44c1f --- /dev/null +++ b/transcripts/64-email-smtplib/7.txt @@ -0,0 +1,91 @@ +00:00 How easy was that? +00:01 This is pretty much one of the coolest scripts +00:03 because you almost just have to write it once. +00:07 And then you can copy and paste it +00:08 for whatever project you want, +00:10 obviously remembering a couple of good practices there +00:13 which is one of them being to create +00:15 your own application id for every application, right? +00:20 Okay, so, what did we do? +00:22 What's our recap? +00:23 Well, we got our Gmail application password. +00:26 There's your quick guide on how to do it. +00:30 Again, a quick Google will get you everything you need +00:32 to find out how to do that, +00:35 but I will provide the links. +00:38 Next, send email with smtplib. +00:42 Well, we began by importing smtplib, go figure. +00:46 Right, then, we specified the server +00:50 that we're running, specifically the Gmail server. +00:54 Then, we checked for a heartbeat, +00:56 using that hello message, okay, +00:59 that's just to make sure the server's okay and ready to go. +01:02 And then we started the TLS encryption, all right? +01:06 Next, we sent through our login details, +01:10 and just a word of advice, never, ever, ever +01:13 hardcode your application password into your script. +01:17 Okay, never do that. +01:19 The safest thing you can probably do +01:22 that's also super simple, is make your application +01:26 password an environment variable, okay? +01:29 And then use something like os, or whatever +01:34 to, reference that id, okay, in variable form. +01:40 Import it, reference it, okay? +01:43 Next, we sent the email from address to address body +01:46 with a sendmail and then we quit. +01:50 We closed that connection to the SMTP server. +01:53 And we got a nice, plain-text email. +01:57 Next, we have send an email with MIME. +02:01 Okay. +02:03 This one was a little more complex. +02:05 We started by importing the required modules, +02:07 right, Multipart and text. +02:10 Then, we created the Multipart object in Message. +02:14 Again, that's just nice and easy. +02:18 All right, we built the header. +02:20 From, to, and subject, yes? +02:24 Yes, yes, we all got that. +02:25 That was so that we had all that extra information, +02:28 made our emails a little more functional and beautiful. +02:32 All right, now, we had to attach our body text +02:37 to this Message object, okay? +02:39 Remember, when you specify your body text +02:42 or whatever's going to be in the email, +02:44 you don't do it using Message, +02:45 you just sort of create your variable +02:47 and then you attach it, all right? +02:49 That's what MIME text is for. +02:53 And then, we took that entire awesome Message, +02:57 Body, Header object that we'd created +03:01 and we turned it into a nice string, +03:03 and we assigned that to text, and that way, +03:06 sendmail, beautiful sendmail could talk to it +03:10 and send the email off, all right? +03:12 And I've also included this little BCC trick in there. +03:16 Remember, we took our to_address and made it a list, +03:19 that's this here, and then we had our existing list +03:24 of BCC emails, whether we pulled that in from external +03:27 or, I guess, hardcoded it into the script, +03:30 whatever floats your boat, and we combined +03:33 the two lists and sent them out. +03:36 And that is it, my friends. +03:38 It is your turn. +03:39 Now, I reckon, really cool thing you can try +03:43 is to write this script yourself. +03:46 As I hinted at in one of the videos, +03:48 find something that you can populate into your email +03:52 with some sort of Python data structure or process, +03:57 whether it be just a list of names, +03:59 it could be something from a database, whatever, +04:01 try your hand at that, and if you smash that +04:04 and you have some extra time, +04:06 I reckon try and automate it. +04:08 Set yourself up a cron job if you're running Linux, +04:11 hopefully, or a scheduler on Windows, +04:13 whatever you can find, whatever you have, +04:16 just Google around, find a way to automate it, +04:19 and maybe send your mates some annoying emails, +04:22 maybe just your smiley face with a thumbs-up. +04:24 Do something like that. +04:26 In fact, I might go and do that to Bob now. +04:28 So enjoy, keep calm, and code. diff --git a/transcripts/64-email-smtplib/8.txt b/transcripts/64-email-smtplib/8.txt new file mode 100755 index 00000000..4ac3ae56 --- /dev/null +++ b/transcripts/64-email-smtplib/8.txt @@ -0,0 +1,33 @@ +00:00 For the next few days, we're going to be working with +00:03 sending emails with the SMTPLib. +00:06 And to do that, we're going to break it down, +00:08 obviously, across a couple of things. +00:11 The first day is mainly preparation, +00:13 and again, across both days, it's going to be a bit taxing, +00:17 but just bear with it. +00:19 So you'll need a Gmail account, +00:21 and you'll need to obtain your Gmail application ID. +00:25 There is a video on exactly how to do that, +00:28 and it'll walk you through it from start to finish. +00:31 Then, you're going to, pretty much still on Day 1, +00:35 send an email with SMTPLib. +00:39 So it's very cool, you get to send that email using code, +00:42 so that's fantastic, all right? +00:46 Day 2, you're going to actually +00:48 make things a little bit nicer, +00:50 and learn what you can about +00:52 the Multipurpose Internet Mail Extensions module. +00:58 So, you'll learn a couple of little things there, +01:01 you'll also learn a little trick, +01:03 which will allow you to maintain or honor your BCC rules. +01:09 Okay, I'll explain that in the video, you'll find out. +01:12 And lastly, Day 3, what I would like you to do is, +01:17 now that you have your perfect +01:21 basic email script, okay, and it works, +01:25 I'd like you to start adding data to it. +01:27 So figure out somewhere to pull the data from, +01:29 it could be from a previous challenge +01:31 in this entire 100 Days Of Code course, could be anything. +01:34 But what I'd like you to do is +01:36 get that data into an email and email it off to yourself. +01:41 And that's it, so have fun, enjoy the next 3 days. diff --git a/transcripts/67-pyperclip/1.txt b/transcripts/67-pyperclip/1.txt new file mode 100755 index 00000000..f3d36077 --- /dev/null +++ b/transcripts/67-pyperclip/1.txt @@ -0,0 +1,17 @@ +00:00 Welcome back, this is Julian Sequeira +00:02 and I am going to be walking you through a very simple +00:06 yet awesome module named pyperclip. +00:09 This is a module that we'll simply copy and paste +00:13 from your code, there we go, done. +00:16 May as well not watch the next three videos. +00:19 This is a module I actually can't live without. +00:21 It has made so many scripts +00:24 just that little bit easier for me +00:26 and it's just a wonderful, wonderful script. +00:30 So, module I should say. +00:32 So, I reckon you're going to enjoy the next couple of days. +00:35 We're going to do a couple of really simple scripts +00:38 after we walk through how to use pyperclip. +00:40 Don't worry that takes about two seconds, copy and paste. +00:43 So, click the next button, +00:46 watch the next video, and let's create some fun scripts. diff --git a/transcripts/67-pyperclip/2.txt b/transcripts/67-pyperclip/2.txt new file mode 100755 index 00000000..a481e20d --- /dev/null +++ b/transcripts/67-pyperclip/2.txt @@ -0,0 +1,42 @@ +00:00 Okay, very quickly, +00:01 here's how your first three days for pyperclip +00:04 are going to pan out. +00:05 So for the first day, you're actually just going +00:07 to learn how to use pyperclip. +00:09 That shouldn't take long, only a couple of minutes, +00:11 because it's very simple. +00:13 And after that, you're going to generate +00:15 an affiliate link using pyperclip. +00:18 That's a script that we use, +00:19 and it's actually quite useful. +00:21 You've got a used case there that you can probably change +00:26 to suit your needs, so that's a great script +00:28 to be creating on Day 1. Okay? +00:31 Day 2, you're going to do the same thing, +00:33 you're going to create another script. +00:35 So these are going to be a few easy days, +00:37 you're just creating stuff for yourself, right? +00:40 Create a text replacer script. +00:42 Now this one will, well, you can read here. +00:44 It allows you to replace text using pyperclip. +00:48 I won't give too much away, watch the videos. +00:51 And last but not least, Day 3, +00:54 come up with something yourself using pyperclip. +00:57 Okay, so you've got the basics down, +00:59 well, it's all basic, right? +01:02 And what you need to do is create a challenging project +01:05 for yourself, okay? +01:06 You can complete it or not on Day 3, it doesn't matter, +01:09 but one great idea is a persistent clip board. +01:14 Something that will, I guess, save the things +01:18 that you copy to the clipboard, +01:19 and then allow you to paste them all back later. +01:22 That's a really cool idea. +01:24 Another one would be a sort of password vault. +01:27 It doesn't have to be secure. +01:28 I wouldn't actually recommend using it, +01:30 but create a password vault that uses pyperclip +01:33 to do the copying of your password +01:35 for when you want to paste it out somewhere. +01:38 So these are some cool used case ideas, +01:41 use your imagination, and make something great. diff --git a/transcripts/67-pyperclip/3.txt b/transcripts/67-pyperclip/3.txt new file mode 100755 index 00000000..4967c779 --- /dev/null +++ b/transcripts/67-pyperclip/3.txt @@ -0,0 +1,17 @@ +00:00 Righty oh, let's get cracking. +00:02 All right, so a quick setup for us. +00:04 Let us quickly create our virtual environment. +00:11 Create the venv and all we have to do for this video +00:15 for it to work for the rest of +00:16 this lesson is pip install. +00:20 First let's activate it. +00:23 Okay, so, pip install pyperclip +00:27 because it isn't in standard lib. +00:30 And once that is installed, I'd like you to go through +00:33 and just create the following two files +00:36 text-replacer.py and affiliate.py. +00:41 That should give you a hint as to +00:42 what these scripts are going to be. +00:44 So once you've got everything installed, +00:47 and pip installed and whatnot, +00:49 just go ahead and move onto the next video. diff --git a/transcripts/67-pyperclip/4.txt b/transcripts/67-pyperclip/4.txt new file mode 100755 index 00000000..05fcaf25 --- /dev/null +++ b/transcripts/67-pyperclip/4.txt @@ -0,0 +1,52 @@ +00:00 Okay, this might be the quickest demonstration +00:02 you're going to see in this entire course, so . +00:05 Alright, in the shell we're just going to import pyperclip. +00:09 This video is just going to walk you +00:10 through the pyperclip usage. +00:14 In your head just think about the whole, +00:15 the way you copy and paste at the moment, +00:18 so if you want to copy something +00:20 from the command line and paste it somewhere else, +00:23 you're going to copy to put it on the clipboard, +00:26 and then you're going to paste it off the clipboard. +00:29 Same sort of concept here, but almost reversed. +00:33 So, if you want to take the user's text +00:36 that they have copied to the clipboard, +00:38 you're going to paste it into your code, +00:41 and then once you've manipulated it, +00:42 and you want to put it back on the clipboard, +00:45 you're going to copy it out of your code. +00:47 So, if we do pyperclip.paste +00:53 it's going to show you what I have on my clipboard +00:55 or the last item on my clipboard, okay, which is this URL. +01:01 Now, let's say we just want to strip out the HTTPS +01:04 and have just codechallenge.es there, okay. +01:09 If we want to push that back to the clipboard, +01:12 we just go pyperclip.copy +01:18 and then in here we put whatever we want in, okay. +01:23 Now, mind you, you can make this a variable. +01:26 So, this doesn't have to be plain text. +01:28 If your variable happens to contain an entire, say, +01:33 book, or an entire chapter, +01:34 or an entire website worth of text, +01:39 you can pop that variable in here +01:41 and it'll copy it back to the clipboard. +01:43 Okay, and then just to show that that worked, +01:46 let's just put pyperclip.paste back in, +01:50 actually, I'm not going to copy that, +01:51 that'll override the clipboard, won't it? +01:53 So, pyperclip.paste and there we have it, +01:58 just the stuff that we sent back +02:00 to the clipboard using copy. +02:02 Okay, one thing to then keep in mind, +02:06 is that as you use this script, +02:08 as you use this module pyperclip.copy and paste, +02:12 it will override what you have on your clipboard, +02:15 so be careful. +02:17 Just keep that in mind as you're using it, +02:19 especially when you're using it in a script +02:22 that you're going to call, few times a day, +02:26 you might actually end up copying +02:28 over the top of something important. +02:29 So, just keep that in mind. +02:31 And, now let's create some scripts. diff --git a/transcripts/67-pyperclip/5.txt b/transcripts/67-pyperclip/5.txt new file mode 100755 index 00000000..415e0ec5 --- /dev/null +++ b/transcripts/67-pyperclip/5.txt @@ -0,0 +1,101 @@ +00:00 It's time to create something useful. +00:03 This is a script we use, Bob and I use for PyBites, +00:06 to actually put our affiliate code +00:09 into some of the Amazon links that we use on the website. +00:13 This is really cool because it's a great demonstration +00:15 of how you can make a script for yourself +00:19 that is useful day to day and is really +00:22 just a nice, cool, dirty script. +00:25 You know, it doesn't have to be pretty +00:26 and it doesn't have to have +00:27 all the cool Pythonic formation around it. +00:32 It's not going to be any functions. +00:34 It's not going to be anything, just a couple of lines of code. +00:38 So let's start off by importing pyperclip, +00:43 and what this code's going to do is it's going to take a URL +00:46 and it's going to tack on our Amazon affiliate code +00:52 onto the end of your URL. +00:54 So it's going to paste it in, edit it, +00:57 and then copy it back out to the clipboard. +01:00 So the first thing we need is our affiliate code. +01:03 That's a constant, it's not going to change. +01:06 Let me just copy that. +01:10 Now you'll notice that the affiliate code +01:12 is this here, right? +01:15 But this here, if you were to inspect +01:17 any of the affiliate links that we have, +01:21 you need to tack this onto the end of the URL, +01:25 or somewhere in the URL, and this will then +01:29 provide the correct affiliate link. +01:31 You can't just put this in there. +01:33 You have to have this there too, okay? +01:36 Alright, so we'll move on. +01:39 Now we want the URL, so the URL you're bringing in +01:42 is going to be the pyperclip.paste, right? +01:48 Now obviously, we're not going to do +01:50 any huge amount of testing here, +01:54 because this is just, again, a dirty script. +01:56 I'm not going to sit here and say, +01:58 well, if it's not a link that's being pasted in, +02:00 you know, and all that sort of rubbish. +02:02 We just want to go quick and dirty, okay? +02:05 So the most we're going to do is check for the word Amazon +02:09 in the URL, so if Amazon is not in our URL, +02:15 well then, let's just return a message. +02:18 What are we going to say? +02:20 Sorry, invalid link, okay? +02:23 Nice and simple, don't want to go over the top, +02:28 and now what are we going to do? +02:29 This is where we're going to manipulate the URL, +02:32 so we've called in the URL with pyperclip.paste. +02:36 We've checked to see if it has the word Amazon in it, +02:39 and if it does have Amazon in it, we can then, +02:42 let's create a new variable called new_link. +02:47 And it's just going to be simple string manipulation. +02:50 We're going to go URL, which is the paste, +02:54 plus affiliate code. +02:59 That's it , so pyperclip.copy +03:04 as we saw in the other video, +03:07 new_link, and then print. +03:13 Alright, we're going to say +03:15 affiliate link generated +03:20 and copied to clipboard. +03:25 Oops, close that off. +03:27 Alright, so not much to it. +03:30 It's actually very, very simple, isn't it? +03:33 So we like that, so we're pasting it in. +03:36 We're checking to see if it has Amazon in it. +03:38 If it does, we're appending the affiliate code on, +03:43 then we're copying it back to the clipboard, okay? +03:46 Let's save that. +03:47 Now if we need to run that, we just have to copy +03:51 something to the clipboard, so let's copy my Gmail link, +03:56 mail.google.com, and let's run the script, see what happens. +04:02 Alright, it says sorry, invalid link. +04:04 That's exactly what we wanted. +04:06 And now I've just copied an Amazon link +04:09 for one of those Fire Stick devices, +04:11 and we're going to run the script again. +04:15 And it'll go affiliate link generated +04:17 and copied to clipboard, so let's just paste that in here. +04:21 And there's all the standard Amazon URL, +04:25 and then right on the end there we see +04:27 end tag equals 0fpython20, +04:31 which is our affiliate code. +04:33 And then just to be sure, we can go check that +04:35 in on Amazon and see if it works, and it does. +04:37 I don't expect you to do that. +04:39 This isn't some sort of cheap sales trick . +04:43 Yeah, so it all works really well, and this is, again, +04:46 a nice simple script. +04:48 Obviously there's a lot of checking that could be done. +04:51 For example, if I take amazon.com.au, +04:57 copy that to clipboard, and then run this again, +05:01 it's going to say it's generated, but when I hit paste, +05:04 you can see we've just got amazon.com.au and the tag, +05:08 which is not a valid link, so obviously this isn't something +05:12 for production use for the rest of the world. +05:15 This is just something that you're going to use +05:17 just as a little hack job when you know you have +05:19 the proper type of URL copied to the clipboard. +05:22 So there you have it, nice little use case of. diff --git a/transcripts/67-pyperclip/6.txt b/transcripts/67-pyperclip/6.txt new file mode 100755 index 00000000..dbbe8b6c --- /dev/null +++ b/transcripts/67-pyperclip/6.txt @@ -0,0 +1,119 @@ +00:00 Okay for this script we're going +00:02 to create a text replacer. +00:04 So this is a quick script that will take in, +00:07 off the clipboard, some text, +00:10 and will allow you to then substitute +00:12 certain words in that text with other words, +00:16 and then paste it back to the clipboard. +00:19 Again, this is something I've used and I keep handy, +00:22 because there's a few times, +00:24 especially at work that I need to do stuff like this. +00:26 So let's import pyperclip. +00:33 Let's throw in this as usual. +00:38 Let's create our functions first. +00:41 We need to create a function +00:42 that will paste in the information, right? +00:45 So paste_from_clipboard. +00:47 I'm making these very detailed names, +00:50 just so we know what we're talking about. +00:52 And we'll say the text +00:55 that we're going to deal with is pyperclip.paste +01:00 And we'll return that. +01:03 So, return text. +01:06 I'm keeping this super clean and simple. +01:09 So we've got our text, we've read it in from the clipboard, +01:12 and we're going to return it. +01:16 Now we need to take that text, +01:19 and replace it. +01:22 We're going to do that with a replace_text. +01:26 So def replace_text. +01:30 Let's read in old text. +01:32 We'll just change the name like that +01:34 to make it interesting and descriptive. +01:38 Now what do we want to do? +01:39 We want to replace some text, +01:42 so we're going to ask the user what they would like to replace, +01:45 rather than hard code it in. +01:47 So we'll just create a target, is input: +01:52 What would you like to replace? +01:58 Then we're going to actually do the: +02:01 What do they want to replace it with? +02:04 First, they're specifying the word +02:06 they would like to have replaced, +02:07 and now they're saying what they want +02:09 to have it replaced with. +02:11 So replacement = input, +02:16 and what would you like to replace it with? +02:25 Let's just hit enter. +02:26 There we go. +02:33 We're going to build a new text block +02:36 after we've done the replacement. +02:38 To do that, we're going to go new text is... +02:41 So old text.replace, +02:45 cause we can do that. +02:47 It's Python, it's cool! +02:49 Old text.replace target, +02:53 and replacement, +02:55 and that just does a simple search for the target, +02:58 and then replaces it with the replacement text. +03:03 Then we'll return that. +03:04 Return new text. +03:08 Let's call these down here, +03:09 so first we're going to say old text, +03:14 cause remember we're calling that in here? +03:16 Old text is... +03:21 paste_from_clipboard, +03:27 and then new text +03:31 is replace text +03:36 and loading in the old text. +03:40 And now we need to copy it back. +03:44 It's going to be similar to the paste_from_clipboard, +03:46 we're going to def copy_to_clipboard. +03:52 And we'll load the new text into that. +03:56 And then all it needs to do is run that same pyperclip. +04:01 pyperclip.copy +04:04 New text. +04:06 Now obviously, this is a simple enough script, +04:08 you don't actually have to break it down into functions. +04:12 I just thought that'd be much easier +04:13 for displaying that. +04:16 Then we'll just print a little message saying, +04:19 the new string is now copied to the clipboard. +04:27 That's it. +04:31 So we'll get rid of the bright, white space. +04:33 Let's call that function here, okay? +04:36 And we go copy to clipboard +04:40 New text. +04:44 So we'll save that. +04:47 Let me just copy a block of text for us to actually do this. +04:52 We will do this. +04:57 So here's the block of text, alright? +05:03 Let's run the script. +05:07 Alright, what would you like to replace? +05:08 Let's replace Julien. +05:12 And what would you like to replace it with? +05:14 Bob. +05:16 The new string is copied to the clipboard. +05:19 What's cooler than cool? +05:20 Bob. +05:21 Now that's a blatant lie, +05:22 but that's a great demonstration point. +05:26 Let's try it again. +05:27 So we'll go run the script. +05:31 What would you like to replace? +05:32 Let's replace Bob with Mike. +05:37 New string is copied, let's hit paste. +05:39 What's cooler than cool? +05:41 Mike. +05:44 I'm not going to comment. +05:46 Sorry, Mike. +05:49 Let's run it one more time. +05:52 What would you like to replace? +05:54 Let's replace Mike with ice cold. +06:00 And paste. What's cooler than cool? +06:02 Ice cold. +06:03 And that's it. +06:04 Really cool, simple script. +06:05 Something usable, I'm sure it's something +06:07 you can make use of in day-to-day life. +06:10 Enjoy it, use it, and that's pretty's much... diff --git a/transcripts/67-pyperclip/7.txt b/transcripts/67-pyperclip/7.txt new file mode 100755 index 00000000..650b1b35 --- /dev/null +++ b/transcripts/67-pyperclip/7.txt @@ -0,0 +1,65 @@ +00:00 And, that was pyperclip. +00:01 You can see it's pretty fun, isn't it? +00:04 So, there are a lot of different things you can do with it. +00:06 Used cases, I'm sure you're starting to think of, +00:09 which is good because, +00:10 well we'll discuss that in just a minute. +00:12 Let's recap everything we did, okay? +00:15 Just a quick overview, I'll make it very fast. +00:18 We're importing pyperclip, okay? +00:20 We paste what's on the clipboard +00:23 into your code using pyperclip.paste, okay? +00:27 Then, we copy anything between the copy brackets, +00:31 we copy that back to the clipboard using pyperclip.copy. +00:36 Alright, our affiliate script, okay? +00:40 We assigned the paste, okay. +00:42 Everything that was on the clipboard we assigned it +00:44 to a variable, right? +00:47 And, then the only tricky thing, I suppose, +00:49 was that we were checking to see if the word "amazon" +00:52 was in our URL, and if it wasn't, +00:55 then we said it was an invalid link. +00:57 And, if it was, it then appended the affiliate code +01:01 onto the end of the URL. +01:04 Really simple stuff, very useful. +01:06 Obviously, no fact checking to the max, anyway +01:10 because if you just put amazon.com, that would pass +01:13 but that's not a valid affiliate link, okay? +01:18 Right, then we built a text replacer script, +01:21 which is also a lot of fun. +01:22 Maybe not as useful, but really really fun anyway. +01:26 So, we imported pyperclip again. +01:28 Alright, we pasted what was on the clipboard back in, +01:32 into our code, alright. +01:34 We replaced it using user specified text. +01:39 Okay, they got to choose what they wanted to be replaced, +01:42 and then they got to typing the word or words +01:46 that they wanted to replace it with. +01:49 Alright, and once that was done, +01:52 it then copied back to the clipboard. +01:55 Easy peasy. +01:58 Alright, now it's your turn. +01:59 So, pyperclip, one really cool thing with clipboards +02:04 is that you can actually make a clipboard +02:07 that has persistent memory, so to speak, okay? +02:12 Once you copy something onto the clipboard, +02:14 it's saved there and you can look at your history +02:17 of copies, everything that you've copied to the clipboard. +02:21 I think that would be a very, very cool use case +02:24 for pyperclip. +02:25 So, for you Day 3, think about how you can copy what's +02:29 on the clipboard, and if anything is copied to the clipboard +02:33 come up with a way to store it, perhaps +02:35 and maybe make some sort of application +02:38 that will then have your history of everything +02:41 that you've copied. +02:43 That would be very cool. +02:44 If not, if that's too complicated +02:46 and you don't have much time. +02:47 Well then, just go ahead and think about the things +02:50 that you copy and paste on a daily basis. +02:53 You could use this as a simple thing +02:55 to make your own password vault +02:58 and whatever else you can think of, +03:00 so come up with something that uses pyperclip +03:02 and code that for your Day 3. diff --git a/transcripts/70-openpyxl/1.txt b/transcripts/70-openpyxl/1.txt new file mode 100755 index 00000000..91185522 --- /dev/null +++ b/transcripts/70-openpyxl/1.txt @@ -0,0 +1,12 @@ +00:00 Good day and welcome to Excel automation with openpyxl. +00:05 I'm Julian Sequeira and I'm going to be walking you +00:07 through a couple of days of playing +00:09 with a really boring finance Excel spreadsheet. +00:14 But, unfortunately that's the way, +00:16 that's its trial by fire, right. +00:18 We need to be able to play with an actual, +00:21 really well populated spread sheet +00:23 in order to make working with openpyxl doable, really. +00:29 So get your Excel boots on and get prepared to play +00:33 with Excel, manipulate some cells, +00:35 insert some data, all with openpyxl. diff --git a/transcripts/70-openpyxl/2.txt b/transcripts/70-openpyxl/2.txt new file mode 100755 index 00000000..d48b3621 --- /dev/null +++ b/transcripts/70-openpyxl/2.txt @@ -0,0 +1,40 @@ +00:00 Okay, for the next three 3 with ppenpyxl, +00:03 here's what you're going to do. +00:05 For the first day, obviously, there's going to be a bit +00:07 of setup for it and I will be going through +00:10 explaining the workbooks and worksheets. +00:13 Okay, that's in that video there. +00:15 And after we do that we're then going to deal with +00:18 pulling some cell values, +00:19 so pulling data out of the spreadsheet. +00:22 It's going to be pretty simple, +00:24 but it's going to be pretty useful, okay? +00:27 So use the financial sample xlsx file, +00:31 it's located in this repo, okay? +00:34 For Day 2, you're going to actually expand on everything +00:38 you learned in day one with max row, +00:41 and then on inserting data into the spreadsheet, okay? +00:46 That's a very useful one, as you can imagine. +00:48 So that's going to be a lot of fun. +00:50 Once you're done watching the videos, obviously, +00:52 play around again with that spreadsheet, +00:55 and play with inserting data. +00:57 So maybe do it one cell at a time. +01:00 And then try populating an entire column, okay? +01:04 For Day 3, this again as usual, +01:06 is where you're going to do it yourself. +01:08 Okay, come up with something cool. +01:10 Ideas, perhaps try editing an employee shift roster. +01:16 Okay, so imagine a roster in a spreadsheet +01:19 of people's names and times and dates and whatever, +01:23 and maybe monitor it for changes, okay? +01:26 So there's a script that +01:27 does something when something changes, +01:28 or perhaps a script that allows an employee to update it. +01:33 So your spreadsheet is almost like your data base. +01:36 Okay, you could also try doing that with a financial budget, +01:40 something similar, so when you get a list, or a dictionary, +01:44 of spending data, it updates the spreadsheet, okay? +01:48 You could even populate the spreadsheet with data, +01:50 pull down from an API of some sort. +01:53 Okay, so have a go, enjoy it, and excuse the pun. diff --git a/transcripts/70-openpyxl/3.txt b/transcripts/70-openpyxl/3.txt new file mode 100755 index 00000000..9df3065b --- /dev/null +++ b/transcripts/70-openpyxl/3.txt @@ -0,0 +1,16 @@ +00:00 Okay, so the first thing we need to do, +00:02 as usual, is set up our environment. +00:05 So we're going to create ourselves a virtual environment, +00:12 called venv, +00:14 and once that's installed, we are going to launch it. +00:21 Okay, and then we're going to pip install openpyxl +00:28 That's all we're going to need for this lesson. +00:30 The other thing you can do, if you wish, +00:33 is create a python file in this directory +00:36 called excel_automation. +00:40 Furthermore, if you want to follow along with the +00:43 commands, as I type them, +00:45 you'll want to download the financial sample. +00:49 Okay, this is a document that you'll see in the repo. +00:53 Pull that Excel file across and you should be able +00:56 to follow along with that. diff --git a/transcripts/70-openpyxl/4.txt b/transcripts/70-openpyxl/4.txt new file mode 100755 index 00000000..e5ba1593 --- /dev/null +++ b/transcripts/70-openpyxl/4.txt @@ -0,0 +1,69 @@ +00:00 All right, we're going to start off pretty simple, +00:03 because Excel automation can be a bit complex at times. +00:07 Let's open up the Python shell in our virtual environment. +00:11 Okay, and we will import from openpyxl. +00:16 We're going to import load_workbook, okay? +00:20 Now this is going to allow us to actually load +00:25 the Excel workbook, the actual Excel file. +00:29 So I've got the Excel file here. +00:31 This is a financial sample I pulled off the net +00:34 just filled with lots of random data. +00:36 I hope it's not actually real stuff . +00:38 Now terminology, workbook. +00:42 Workbook is the name for this entire file, +00:45 our Excel file, alright? +00:47 That is the workbook. +00:49 So when you hear the term workbook, envision that. +00:52 What you need to then remember if you're not versed +00:56 with Excel is that these tabs down here, +00:58 these are worksheets. +01:00 Okay, so the overall file, the parent file, +01:04 is the workbook and these here are the worksheets. +01:09 Okay, the different spreadsheets inside the workbook, +01:11 alright? +01:13 So visualize that and then you won't get the two confused. +01:16 Now if we want to open the workbook, +01:19 we want to load it in, +01:22 we use workbook or wb = load_workbook, okay? +01:28 And then we need the name of the file. +01:30 So this is financial-sample.xlsx, okay. +01:37 Right and that loaded and then now we can actually +01:41 start to interrogate the workbook. +01:43 So we can go wb.sheetnames +01:47 and that gives us the sheets, +01:50 or the spreadsheets down here so already you see we can +01:55 with interrogating that file, +01:56 we're talking to it, it's pretty cool, right? +01:58 Now one really cool thing that you'll probably see +02:02 is you need to be able to drill down into these sheets. +02:09 So if we're going to import any data or pull any data, +02:12 how are we going to know which sheet we're talking to? +02:16 Well, that's the next step. +02:18 Alright and one of the default things that a lot of people +02:21 go onto is saying okay, my worksheet, worksheet one, +02:25 is going to be the active, the active worksheet, alright, +02:31 and the problem with this is and it's perfectly fine +02:35 if you only have one worksheet +02:36 and you've got some file saves and tests involved here +02:40 but you need to understand this catch. +02:42 wb.active will put you on the first worksheet +02:50 or the last worksheet, I should say, +02:52 that had any sort of data entered or edited, +02:56 whatever, on it, any action on that, any activity, okay? +03:00 So you can see ws one, wb.active, +03:04 is our finances 2017 worksheet. +03:07 If we go in here and we enter in some bogus data, +03:13 we save that. +03:15 Now we obviously need to reload the workbook +03:20 so I'll do that very quickly. +03:23 We reload the workbook. +03:26 Now when we do, let's go ws two equals wb.active. +03:36 We get yearly totals. +03:40 WS one is still pointing at finances 2017. +03:46 So don't let that catch you out. +03:48 If you always want to talk to the active sheet +03:51 or the last sheet that was edited, +03:53 that's perfectly fine but if you want to talk +03:58 to a specific sheet, +03:59 don't assume that workbook dot active is going to get you +04:02 to the right worksheet. diff --git a/transcripts/70-openpyxl/5.txt b/transcripts/70-openpyxl/5.txt new file mode 100755 index 00000000..66866080 --- /dev/null +++ b/transcripts/70-openpyxl/5.txt @@ -0,0 +1,125 @@ +00:00 Let's quickly look at pulling specific cell data +00:04 out of a spreadsheet. +00:05 Okay so we've imported openpyxl using +00:09 load_orkbook, and we've loaded the workbook +00:13 financial sample into the wb variable. +00:17 So let's look at the sheet names we have available. +00:20 And again, we have Finances 2017 and Yearly Totals. +00:25 That's this stuff here, okay? +00:29 Now what do we want to do? +00:30 Well, let's specify the worksheet we +00:33 want to work on, okay? +00:34 Now, if we want to specify the exact sheet, +00:38 we've looked at wb.active and we know that +00:41 you've got a little catch there. +00:42 So if we want to specify the actual one, +00:45 we actually go workbook and then we just +00:48 put the name of the tab, or the spreadsheet +00:52 in there that we got from the previous command. +00:55 Okay so Workbook Finances 2017 is ws1, +01:00 and there we go. +01:01 So now, when we write anything using ws1, +01:05 we are going to be pointing to this worksheet here, +01:08 which is what we want to have a look at. +01:11 All right, what's first? +01:13 Well, if we want to get a cell, okay, +01:17 we need to know the coordinates of that cell. +01:21 So your coordinates are your letters along the top, +01:24 and your numbers down the vertical. +01:26 And specifically, we want to get the value +01:30 of the cell, so we're actually going to +01:33 use the word value. +01:35 So let's look at just randomly, +01:38 we'll look at C9. +01:40 Let's say we want to get the data specifically +01:42 in this cell, C9. +01:44 So we're expecting to see Montana returned. +01:48 How do we do that? +01:49 Well, we go ws1. +01:52 And then we just simply put in the cell coordinates. +01:57 Look at that, ws1['C9']. +02:00 And look at that, all we got returned was +02:03 the object, the fact that C9 is a cell +02:05 in Finances 2017. +02:08 So what were we missing? +02:10 Well, as I mentioned, we're going to use value, okay? +02:16 The value attribute. +02:17 So ws1['C9'].value. +02:20 And there we go, we're returned with Montana. +02:24 And we can try that again just to prove that wasn't +02:26 a fluke, 'cause there are a lot of Montanas there. +02:28 We can go well, what's B9? +02:31 Okay let's say it's the country Canada. +02:33 Okay? +02:34 So we'll go ws1['B9'].value. +02:42 And there's Canada. +02:44 All right? +02:45 So nice, very very cool, very easy. +02:47 You can start pulling data out manually this way. +02:51 All right, let's do something a little more interesting. +02:53 Let's say for example we have column L here. +02:59 And we've got the profit of all of these different +03:02 transactions or whatever they happen to be. +03:06 We can actually collect all of this data +03:10 and get a total for ourselves. +03:13 So why don't we do that? +03:15 Let's go to, let's create ourselves a variable here. +03:18 So profit total equals zero. +03:24 Now what we're going to do is we're going to +03:27 create a list. +03:30 We're going to create a list of this column, +03:33 of the items in this column. +03:35 So we're going to say full column in list L. +03:42 So we've created a list of the L column. +03:50 Should actually put a column there. +03:54 We then go for row. +03:56 So now we've got the column up here. +04:02 And now we're looking at the rows in this column. +04:05 Okay so we've got the column, we specified L, +04:07 now we're going down to each, we're going to +04:09 individually talk to each one of these cells. +04:13 So full row in range. +04:17 Now we're specifically going to look at a range here. +04:21 So why don't we go from row two down to row, +04:26 how about 101. +04:30 Let's try this one here. +04:31 So we're pretty much looking at exactly 100 cells. +04:35 So we'll go full row in range. +04:38 2, 101. +04:44 We want to get the cell. +04:47 So we need, remember we need this cell, +04:49 we need this coordinate, this C9. +04:52 Okay we need to put that together. +04:54 So we're going to go +04:55 column so we go L we know that's our column. +04:58 And then we want a string of the row +05:00 because the row is a number. +05:02 So column, meaning L, string meaning this row here. +05:10 Okay? +05:11 So string rows, that's what our cell is made up of. +05:15 So this is going to generate L2, L3, L4, L5 +05:19 and so on to 101. +05:26 Now, we want to go, want to actually add it all together. +05:29 So profit total. +05:35 Is equal to, we'll make it a float because we +05:38 know there were actual float things in there. +05:41 So ws1, because again we're talking of worksheet one. +05:45 And cell, because remember the code just above +05:48 was generating our cell for us, +05:51 and .value. +05:55 And that should be it. +05:57 Okay we've closed everything off. +06:01 All right, profit total has been populated. +06:04 So now we can print profit total and there we go. +06:10 There's a lot of money. +06:11 So 3.2 million dollars pretty much +06:15 is the profit total of these cells here, +06:20 two down to 101. +06:23 So there you have it. +06:25 We can talk to the cells. +06:27 We've got our cells here. +06:28 We can talk to them individually and we can then run +06:32 some quick little scripts on them, some maths. +06:35 I know it's easier in the document just to +06:37 highlight it and get the sum, but now you know +06:40 how you can do it on diff --git a/transcripts/70-openpyxl/6.txt b/transcripts/70-openpyxl/6.txt new file mode 100755 index 00000000..b9d3d19c --- /dev/null +++ b/transcripts/70-openpyxl/6.txt @@ -0,0 +1,75 @@ +00:00 So I'm sure a few of you had a question from the +00:02 last video, which was "What happens if we don't know +00:07 the end cell for the range?" +00:10 So in the last video we did a sort of range check. +00:13 We went from cell 2, +00:15 down to 101 in our column, +00:19 and we just added all of the values up. +00:22 Now what happens if we don't know that, you know +00:25 that end value, that end range number - 101. +00:29 You know spreadsheets are constantly growing, +00:31 so you know we can't hard code our end value in. +00:36 This is where openpyxl really shines, +00:39 it's got something awesome that I absolutely love, +00:43 and that is max_row. +00:47 What we do is, we go ws1, we've specified our worksheet +00:50 as Finances 2017. +00:52 We go ws1.max_row 705. +01:02 So what this looks at is it goes into the spreadsheet, +01:06 goes down here and it just pops down. +01:09 I'll let it scroll, +01:11 pops down to the last active cell. Okay? +01:17 It's not the last fully populated one just like that +01:20 but wherever the lowest, or the highest, +01:22 rather, the highest cell happens to be. +01:26 So I just popped this in here to show that, +01:28 while yes, in the nicely formatted sort of +01:33 rows that we've got here. +01:34 Because I've entered something here, max_row is 705. +01:39 Okay? +01:40 So we'll just delete that, not that it really matters. +01:43 And we'll just do a quick demonstration +01:45 printing out something really quick. +01:48 So we'll go for row, we can actually let's just do +01:51 max_row=ws1.max_row. +01:56 That way we don't need to type it out every time. +01:58 Let's grab pretty much all of the country data I reckon. +02:02 Let's just double check the file here. +02:05 And yes, B is the country, +02:09 so we'll go four row, in range +02:14 two, 'cause we don't want the header, right? +02:17 So two max row, mkay? +02:22 And we'll just create the cell quickly, +02:25 so we'll go with B, 'cause that's the country, +02:27 try something different rather than money. +02:30 And that's string of the row. +02:34 Okay, and then we'll just print it out. +02:35 So this is going to give us one heck of a list, +02:37 but for the sake of this, let's do it. +02:41 So remember, we still have to specify ws1. +02:43 Even though we have got the cell here, +02:46 we still need to say this is worksheet 1, +02:48 otherwise he's not going to know. +02:50 So ws1 cell.value. +02:54 And before I hit enter, this for-loop, +02:57 it's gone row two, over to the maximum row, +03:01 which we know is 705. +03:03 So this is going to do the 705 times, build this cell number, +03:07 and then print out the value, okay? +03:10 So ready? Here we go. +03:14 And there, we now have None, +03:16 but that's because, we have, +03:21 no data down here, okay. +03:24 So we can expect that, that's okay. +03:27 But, we see all of them, +03:29 United States, Canada, Mexico, France, Germany, and so on. +03:33 That's another way of accessing +03:35 all of the cells that you need, +03:37 in a row you can see here, you can combine things now. +03:40 You can combine that with other rows as well. +03:44 So we could obviously build in the code, +03:48 we could build the B, we could build that cell, +03:52 we could also build that along with A. +03:54 So we know the government in Germany, +03:56 the mid-market in France, and so on. +03:59 You can see I could start to build these. diff --git a/transcripts/70-openpyxl/7.txt b/transcripts/70-openpyxl/7.txt new file mode 100755 index 00000000..d8067948 --- /dev/null +++ b/transcripts/70-openpyxl/7.txt @@ -0,0 +1,135 @@ +00:00 Alright, for this video, +00:01 I thought I'd quickly show you what this could +00:03 potentially look like in a script. +00:07 So we'll do a standard import here, +00:10 from openpyxl import load_workbook, +00:13 and we are going to load the same workbook. +00:19 Now we're going to choose worksheet 1, +00:23 try and format this a little nicer, +00:25 ws1 = wb, we're still specifying the same file, +00:32 finances 2017, that same worksheet I should say. +00:37 Now what do we want to do? +00:41 Let's create a quick function here. +00:43 We are going to select our L column again, now where's +00:48 that file going? +00:50 Let's bring this up here nice and quick. +00:53 We want to take the same profit column, and this time +00:59 we want to calculate the overall profit of whatever this +01:02 data sample happens to be of. +01:06 And we want to dump it below here. +01:08 So how are we going to do that? +01:13 Well let's just pop back to the file quickly. +01:16 We're looking here, okay. +01:19 Let's give ourselves some white space, +01:21 let's throw in the default under there, +01:24 let's create a function. +01:25 We're going to call this function insert_sum. +01:32 Because what we're going to do is we're going to insert +01:35 an actual function here, and insert one of those +01:39 standard Excel sum workers equals sum and so on. +01:46 Now to do that, let's create the function, def insert_sum +01:51 Alright we don't actually need to pass any variables +01:56 into this one, working at global level nice and simple. +02:00 Okay so what do we need to do? +02:02 Well we need to figure out what cell, what row, what column +02:08 we're working with, same with all the other videos +02:11 we've seen so far. +02:13 Let's work with how about this. +02:17 We're in row L, so why don't we go with L703. +02:24 So how do we do that? +02:25 We go ws1, still doing the same thing that we did +02:29 on the Python show before, ws1, and we're going to +02:33 specify L703, now we're hide coding it. +02:40 I'll show you to get around this in a minute. +02:42 Is, is being assigned, now this is where we throw in +02:48 that function, so sum L2, 'cause we don't want the header, +02:55 2L, let's see, what was the last row, 701, so L701. +03:05 Very simple Excel sum there. +03:10 And then what do we need to do? +03:13 Well something we haven't covered yet, +03:15 we actually need to save. +03:16 So we go wb.save. +03:19 And we're saving the workbook. +03:22 Now we don't necessarily have to put it in the function +03:24 here, we can throw it down under here, +03:29 so wb.save. +03:33 Then we save it as the actual file name. +03:35 So financial-sample.xlsx. +03:41 And that's it. +03:42 So what this code will do is it's going to run this +03:45 function here insert sum, and it's going to insert +03:48 this sum function here +03:53 into this actual cell here. +03:56 Let's run that. +04:00 Python Excel Automation. +04:05 Now why didn't that work? +04:06 Ah, why do you think? +04:08 Permission denied, and that is because the file is still +04:11 open. +04:12 So let's close it, let's not save it, and let's +04:16 try again. +04:18 Bang, there we go. +04:19 Okay, let's open the file again. +04:23 And let's see what we've got. +04:25 Alright, so there's our total there. +04:27 We can format, you can see there's the sum that we put +04:30 in our code, let's quickly format the cell's currency, +04:35 we get a 16.8 million dollar, 16.9 million dollars +04:39 pretty much. +04:41 Again we run into that problem with max_row. +04:45 What if this spreadsheet grows? +04:47 Then we're kind of screwed, aren't we. +04:49 So let's incorporate max_row in, +04:51 let's get rid of this, +04:53 delete that, save the file so there's nothing there, +04:59 and close it off so we don't have any issues. +05:03 Now how can we change this? +05:04 Well let's give ourselves a max_row variable, +05:10 max_row equals ws1.max_row. +05:15 We've figured that out in the last video, +05:18 now let's change this up. +05:20 We don't necessarily need to know L703. +05:23 We just need to know it's L. +05:25 So ws1['L'], let's just do some string work here, +05:31 I'm going to keep it nice and simple. +05:33 String max_row. +05:36 So L max_row. +05:39 Remember the max_row could be 700, 800, 900, 10,000. +05:43 It's always going to build that with this here. +05:48 Now we're going to equal assign it, the sum. +05:52 But again the sum, we don't know what that end value +05:55 is going to be, so let's build that. +05:58 So we'll go sum L to L, and we'll do a little add here +06:04 of max_row, but think of it this way. +06:09 If we do max_row, but we're trying to insert max_row +06:14 into max_row, you're trying to insert the highest cell +06:18 into the same cell it's not going to work, because it's +06:20 going to try and override itself. +06:22 So we're going to do max_row minus one. +06:26 We want to go one row down from the max_row. +06:31 And then we have to throw in that bracket at the end. +06:35 Alright. +06:37 That should be it. +06:39 Let's go back across here, get rid of some white space. +06:45 Alright, let's save that and give it a go. +06:53 So far so good, I was always confident. +06:57 Open the Excel, and there we go, it's down here. +07:00 Now why is that? +07:01 We know it's because there's some white space or something +07:05 in one of these cells here, and our max_row is 705. +07:11 So what it's done is it's actually done the max_row +07:14 minus one from our code, max_row here, minus one, +07:19 and that's made our last section here of the range +07:24 to be L704. +07:28 So now if this spreadsheet grows, max_row let's say +07:31 grows up to be 710, max_row will be 710 but our sum +07:37 will point to L2 to L709. +07:42 And we have a nice little, oh let's cancel this, whatever. +07:45 And I assume I've broken that now, look at that. +07:48 I've absolutely broken it. +07:51 So let's pretend I didn't do that. +07:54 And let's open that file again. +07:57 And by doing this we now have this nice little figure there. +08:01 And that's pretty much it. +08:03 That's how you add a sum, some sort of a function, +08:07 or whatever you want. diff --git a/transcripts/70-openpyxl/8.txt b/transcripts/70-openpyxl/8.txt new file mode 100755 index 00000000..b35a2eac --- /dev/null +++ b/transcripts/70-openpyxl/8.txt @@ -0,0 +1,171 @@ +00:00 And that's pretty much the basics of openpyxl. +00:04 So it's really cool, +00:05 it's really interesting and you can see how +00:08 with a little bit of work +00:09 you can start to automate +00:11 adding data to specific cells +00:14 or specific columns. +00:16 Really it's all just about knowing the column numbers, +00:19 isn't it? +00:20 So let's go over everything we've learned +00:23 for the past couple of days. +00:25 Alright, so first and foremost, +00:27 there's the Excel workbook +00:28 that we're playing with. +00:30 By now you probably hate it +00:32 as do I. +00:33 I don't blame you. +00:34 So we pretty much dealt with the L column here +00:38 where we were looking at the profit. +00:40 Okay, we did touch on the country column +00:42 just to show how to list out everything +00:44 in a specific column. +00:46 Alright, so how do we start? +00:49 Well, we import it, openpyxl, +00:51 load_workbook. +00:54 Okay, that's pretty much all we needed really. +00:56 And we use load workbook to load in +00:59 our workbook. +01:00 Nice and easy, so far and +01:04 we assign that to the variable WB +01:07 and we can then call .sheetnames. +01:11 And that allows us to print +01:13 all of the worksheets in the workbook +01:15 remembering that your worksheets +01:17 they're sort of tabbed spreadsheets +01:20 that at along the bottom +01:21 of your Excel workbook. +01:24 Okay. +01:26 Now, the little gotcha. +01:28 Workbook.active, +01:30 the active assigns the last active worksheets. +01:34 So the last worksheet that had an edit +01:37 saved to it. +01:39 Okay, that is what active does. +01:41 So that is something that can catch you out +01:43 if you're not careful. +01:44 The safer bet is to just assign +01:48 the actual spreadsheet name. +01:51 The actual worksheet name. +01:53 So, we used Finances 2017. +01:56 We assign that to the other actual worksheet +01:59 Two Variable, ws2. +02:01 Okay? +02:03 Same sort of thing. +02:05 This time we're specifying a specific cell. +02:10 Okay? So we chose C9, ws1, C9, +02:15 and then we wanted the value of that cell. +02:18 Okay, if we got rid of value +02:19 and we just click that +02:20 we'd get just the object, okay? +02:25 So this is how we got value. +02:28 And finally, on that day +02:30 we did go through putting all of this together +02:33 into a four loop, okay? +02:35 And what this did was it went over that list L, +02:38 we took the column L, and we made it a list +02:41 and we iterated over it +02:43 with every row that we had +02:46 and we went all the way to 101. +02:48 So, pretty much, 100 cells, we looked at +02:52 and then we built the cell number here, +02:55 and then took that cell number +02:57 and added the value, +02:59 so it was a dollar value. +03:00 We added all of that together +03:02 and threw it in the profit total variable. +03:05 Okay? +03:06 And then printed that out. +03:07 So that's a nice little use case +03:09 of openpyxl. +03:14 Then we talked about how to actually +03:16 specify the maximum row because we don't always +03:19 want to hard code a cell in there +03:22 as the higher end of our range. +03:25 So that's where max_row comes in handy. +03:28 Okay? +03:29 So it gets the number of the maximum row +03:31 that is used even if you have blank rows, +03:35 some of them maybe active +03:37 because they have a space in there +03:39 or they had data, +03:40 or that was selected when it was saved. +03:42 And that will result in max_row being +03:46 whatever that cell was. +03:47 Okay? +03:50 Now we put that in place +03:52 in the range, okay. +03:55 As a range argument and therefore, +03:58 we were able to go from cell two +04:01 all the way to the last row, +04:03 and then print that out +04:04 and this column B was our country column +04:07 and that allowed us to printout +04:09 all of the countries that were used in that specific column, +04:13 all 701 of them or something like that. +04:18 Alright, now, moving on. +04:19 We then did something similar +04:22 but we were dealing with the actual sum, +04:26 the actual Excel function that we can put in there, +04:29 the formula. +04:30 Okay? +04:31 So we wanted to hard code +04:34 in cell L703, +04:37 The Excel sum formula or function. +04:40 Okay? +04:41 And we specified L2 to L701, +04:44 sum it up, throw it into that cell there. +04:49 And then we saved it. Super important. +04:50 Have to save it. +04:51 And just remember, the issue that we had +04:54 was that we tried to save it +04:55 while the document was open, +04:56 in Excel itself. +04:57 And it won't do that, okay? +04:58 It won't save, +04:59 you'll get an error code. +05:01 Now to implement max_row into this sum, +05:05 we then did something similar, okay? +05:08 We just rebuilt this entire line here, +05:11 but substituted the actual cells, +05:14 with the max_row command. +05:16 Alright. +05:17 So we put in max_row here, +05:19 to get our cell that we wanted to put +05:21 the actual data into at the end of it. +05:26 Then, in order for the calculation to work +05:30 so there would be no sort of conflicts, +05:32 we then took max_row +05:34 minus one, so we wanted the max_row +05:38 but this, the cell above it +05:41 and that should get us the last dollar value +05:45 and then there would be no overrides +05:49 and no sort of conflict, okay? +05:51 So there we go at the minus one +05:53 to prevent clashes with calculations +05:56 and then we saved it again. +05:57 Now obviously, this is not fool proof. +06:00 This is just working for this specific spreadsheet. +06:02 You'd obviously have to do those checks +06:04 in detail for yours. +06:07 Okay, now it's your turn. +06:09 So what can you do with this? +06:11 Well, I think and I pretty well +06:14 used use case, +06:15 something that's obvious, +06:17 would be to monitor a spreadsheet. +06:20 So a lot of places might use Spreadsheets +06:22 for things like say, rosters +06:24 or financial tracking or your budget, +06:27 so you could potentially use a script +06:29 to monitor a certain cell +06:33 or to add data in as you go, +06:36 just to come up with with something intuitive, +06:38 something interesting to do. +06:41 I think a budget is a really good example +06:43 or some sort of a rostering system. +06:45 So have a play with openpyxl, +06:47 see what you can insert and add and edit and whatever +06:52 to an Excel spreadsheet +06:54 and do that for Day 3. +06:56 Just how. diff --git a/transcripts/73-selenium/1.txt b/transcripts/73-selenium/1.txt new file mode 100755 index 00000000..ef2fa9b1 --- /dev/null +++ b/transcripts/73-selenium/1.txt @@ -0,0 +1,29 @@ +00:00 Welcome back to the 100 Days Of Python. +00:03 Wow, Day 73, you're making great progress. +00:07 The coming 3 days I will be your guide, +00:09 to teach you how to use Selenium in Python +00:12 to automate some cool tasks. +00:14 After some basics, we dive straight into +00:17 a practical example, where I will show you how +00:19 you can use Selenium to login to a website. +00:23 In this case, Packt, where I got some E-books +00:26 piled up that we will grab with Selenium, +00:28 making them downloadable from the Command line. +00:31 That's already pretty cool, but then we will +00:34 look at a second application. +00:36 We log into the PyBites banner app, +00:38 which is a Flask app, we simulate using the +00:41 forum manually by posting the variables straight +00:44 to the server. +00:45 And it comes back with a banner, all in a +00:47 automated way. +00:48 And that's pretty powerful. +00:49 But if you need, like, to make 200 banners, +00:52 a tool like Selenium can save you +00:54 a lot of time. +00:55 So this will be a very practical lesson, +00:57 a lot of code, and will be a lot of fun. +00:59 And at the end of it, I will have some +01:01 practical exercises, so you get your hands dirty +01:04 with Selenium. +01:06 Let's dive straight in. diff --git a/transcripts/73-selenium/2.txt b/transcripts/73-selenium/2.txt new file mode 100755 index 00000000..48034ba3 --- /dev/null +++ b/transcripts/73-selenium/2.txt @@ -0,0 +1,46 @@ +00:00 Alright, o get started, +00:02 you need to install Selenium. +00:04 So I suggest you make a virtual environment. +00:06 So I made a selenium subdirectory. +00:09 And I'm using Anaconda. +00:11 So I have a special alias to do this. +00:13 If you're on a typical Python 3 installation, +00:16 you probably use something like this. +00:18 Which is fine, right? +00:19 It's not working for me. +00:21 So, I'm using... +00:26 all right. +00:27 That makes my venv, +00:28 and let's enable it. +00:30 I have an alias for that. +00:33 Because I'm working with +00:34 virtual environments all the time. +00:35 And deactivate is under tabs. +00:39 and activate is not. +00:45 So, that that, +00:48 There's nothing installed. +00:49 So now I'm doing pip install selenium. +00:55 And that should be all we need. +01:00 No dependencies, just a clean install one package. +01:03 All right, +01:04 one other thing though is, +01:06 before I was using PhantomJS. +01:08 But using Selenium again after awhile, +01:11 I got this Selenium support for +01:13 PhantomJS has been deprecated error. +01:16 So I downloaded this Chrome driver. +01:19 And the only thing you have to do +01:20 is put that in your path. +01:23 So here you download the binary. +01:28 So with that driver downloaded, +01:30 I can extract that somewhere that's under my path. +01:38 And if that directory's not in your path, +01:40 you can put it there by doing in your batch rc +01:44 just for now here on the command line. +01:46 export path = whatever is in path already. +01:50 Appending home/bin. +01:52 Now I'll do a which Chrome driver, +01:56 you see it's in my path. +01:58 That's all you need so that Selenium can work +02:00 with a headless browser. +02:02 And with that, you should be all set up. diff --git a/transcripts/73-selenium/3.txt b/transcripts/73-selenium/3.txt new file mode 100755 index 00000000..e3c80a61 --- /dev/null +++ b/transcripts/73-selenium/3.txt @@ -0,0 +1,22 @@ +00:00 Let's look at the Selenium hello world example. +00:04 And let's look quickly what happens when I run this. +00:08 And I have to move the browser into my recording area. +00:13 I put the PyCon into the search box, hits return, +00:19 looks at the results and makes an assertion. +00:22 Now how cool is that, that it just opens a browser, +00:24 does all this stuff automatically? +00:27 And when you're dealing with web pages +00:29 you probably want to inspect them so you can do that here, +00:32 and you can look at the developer tools +00:35 and here you see that input has a name of queue, +00:38 so that's Selenium here is finding. +00:41 Sending PyCon, hitting return and no results found +00:46 should not be in the driver page source. +00:48 So here to back to the results. +00:51 Yes there are results for PyCon obviously. +00:54 And the talk a lot about automating tasks, +00:56 but one of the most common use cases is actually +00:59 to automate your testing, go through your dev sites, +01:02 filling out forms, looking and returns +01:04 and automate that as part of your functional testing. +01:08 So that's the hello world example of Selenium. diff --git a/transcripts/73-selenium/4.txt b/transcripts/73-selenium/4.txt new file mode 100755 index 00000000..acca886b --- /dev/null +++ b/transcripts/73-selenium/4.txt @@ -0,0 +1,120 @@ +00:00 All right, let the fun start. +00:03 Let's look at a more practical example. +00:05 You're probably familiar with packtpub.com. +00:07 They have a daily free eBook I've been collecting +00:10 the last months, and I got a bunch of eBooks on my account, +00:15 but my account obviously is behind a login. +00:17 So let's write a script to log in to Packt. +00:21 Reach out to my account details. +00:23 Go to my eBooks, this link here +00:25 and make a list of all the books it finds here. +00:28 Then, we retrieve the book titles and URLs, +00:31 so, let's get coding. +00:33 First of all, I don't want to store any password +00:37 and login into my script, +00:39 so we need to load them from the environment. +00:42 One way you can do that in Python is with import os, +00:45 os.environ get and let's say +00:50 we call it packt_user +00:54 and Packt_password. +00:56 We store them in user and password. +01:02 And you see, I already set them in the environment. +01:05 I will show you how to do that next, +01:07 so let's go back to the terminal +01:08 and make sure you have your virtual environment deactivated. +01:11 And go into venn/bin/activate. +01:16 And go to the end and do an export +01:20 of packt_user +01:25 and export packt_password. +01:31 And if you want to follow along, make those the values +01:34 of your login, save that. +01:37 Activate the virtual environment again, +01:39 and I'm using this alias, and now, you should have them +01:43 in your environment variables. +01:52 And it means they will be accessible to your script. +01:56 All right with the user and password set, +01:57 let's log in to the site. +01:59 So this is the login site +02:02 and let's initialize a driver. +02:10 And let's get the page, +02:14 then on the page, let's find +02:17 the actual login form which we can do with +02:21 find_element_by_id. +02:23 And first I looked at the page source +02:24 to see how the user and password fields are named. +02:27 And they have them named as edit name, +02:33 and you want to send the keys, basically sending data +02:37 into that form input fields, user. +02:40 Here we do the same for password, +02:44 and the password field is named pass, +02:47 and here we want to send it our password, +02:51 and importantly we want to make sure we hit enter +02:53 after that last value, so by running Selenium it +02:58 opens the browser and goes to the login page, +03:02 and there's my email and my password, +03:05 and click enter. +03:08 Look at that it logged into my account. +03:11 How cool is that? +03:15 Now we're logged into the page and move on +03:18 to find my eBooks. +03:20 As we saw there is a link on the page, My eBooks, +03:24 so we just need to find that link and click it. +03:31 Before running that cell let me show you +03:33 where we are now and what that page looks after clicking. +03:37 Now, we are in account details. +03:41 Click the cell. +03:46 Now we're in my eBooks. How cool is that? +03:48 I'm navigating this side through Selenium. +03:52 Let's move on and extract the books. +03:59 I'm going to use find_elements again, +04:02 but now by class names because I saw +04:06 that the books are in a class product-line +04:14 and that's in elements. +04:19 Right, couple of Selenium web elements, cool. +04:24 I can write a dictionary comprehension to +04:27 actually I extract the nid, N-I-D, +04:32 kind of the identifier, practice using and the title. +04:35 I'm going to store that in books. +04:41 I'm using the get_attribute, +04:45 nid as key, +04:49 and +04:53 title as value. +04:56 for e in elements. +05:02 Look at that all the books of my account. +05:05 Good I think we're done now, so let's close the driver, +05:10 and that actually closed the browser. +05:12 Alright, so and boom. +05:14 You cannot see it, but that closed my Chrome Browser +05:17 I had open. +05:18 Now that we have the data in a structure, +05:21 I can just write a little bit of code to get the book. +05:24 And to keep the focus on Selenium, +05:26 I'm just going to copy that code in. +05:29 We have to download URL which I extracted from HTML. +05:32 We have that id and the format of the book we want. +05:36 Possible formats are PDF, EPUB, and MOBI. +05:39 We write a function called get_books, +05:41 grabbing my books for a string and checks +05:45 if the book format is correct and then it just looks +05:48 through the titles. +05:49 Does a regular expression match on the title +05:52 and it gives me the title and URL. +05:54 The next step would then be to actually download +05:57 the book to my desktop, but that's out of the scope +05:59 of this lesson. +06:01 Let's try it out. +06:06 As just a regular expression I can get a regular expression +06:10 like searches. +06:11 I want all the MOBI files for Python Data Books. +06:15 Nice. +06:18 I want the books for machine learning +06:24 and I want the format of PDF. +06:27 It should also work in uppercase. +06:29 There you go. +06:31 A little useful script. +06:32 I don't spend too much time on them here +06:34 because I want to really focus on Selenium, +06:36 but the point is that once Selenium loaded your data +06:39 into a structure or you can dump it to your +06:42 database table or whatever then it's just easy to write +06:45 a function to work with that data. diff --git a/transcripts/73-selenium/5.txt b/transcripts/73-selenium/5.txt new file mode 100755 index 00000000..45f1a404 --- /dev/null +++ b/transcripts/73-selenium/5.txt @@ -0,0 +1,139 @@ +00:00 All right, I got another cool project +00:02 to show you Selenium in action. +00:04 A while ago we made a banner generator +00:07 with Pillow and Flask. +00:09 And you can read about that in this blog post. +00:11 And, the thing was, as we were making banners repeatedly, +00:15 we just made a little Flask app, +00:17 we enter some data, and it generates a banner. +00:20 What if you can automate that using Selenium? +00:24 So, again, it's pretty similar as last time. +00:27 We need to look into the site. +00:30 Well this one is actually cooler +00:31 because we are going to provide data in a form. +00:34 So we're actually going to submit this form +00:36 doing a post request with some data, +00:39 and then it will return our banner. +00:41 Let's get that working. +00:42 Similar as last time, +00:44 you need your login to be loaded from the environment. +00:47 You don't want to hardcode that in your script. +00:49 So, in this case, already done that. +00:51 So, I got my user and my password. +00:54 I'm keeping secret here see the last video +00:56 how you load those into your environment, +00:58 putting them into your virtual environment's +01:00 activation script. +01:02 At this notebook I'm not going to do much validation, +01:04 but you could add something like this. +01:07 Class, no login. +01:12 Extends exception. +01:14 Pass exception. +01:18 And then, if user is None, +01:22 or password is None, +01:25 raise a no login... +01:27 exception, +01:29 and tell the user to set... +01:37 in your end. +01:38 Right, so that's a little extra +01:39 if it would be like a script you're going to run. +01:42 But let's focus on Selenium again. +01:44 Here's the site. It's an app we host on the Heroku app +01:47 and the route to the login page. +01:51 Again we need to initialize web driver, Chrome. +01:58 We get to the login page +02:02 and, again, this is pretty similar as last time. +02:05 We need to look at the HTML. +02:07 Let's actually do that. +02:11 Right, so we want to right-click here +02:14 and go to inspect. +02:19 There you see that this is an input field. +02:22 And, the name is username. +02:25 And the name of the second field is password. +02:28 And those are the fields you want to specify +02:31 for Selenium to go find. +02:34 So, try, find, element... +02:38 by id... +02:41 username... +02:43 and we want to send it my user... +02:48 string. +02:51 And the same for password +02:55 with the difference that we need to send our password +03:01 and hit enter. +03:05 Return. +03:07 Running this opens the browser. +03:10 It logs in and that's it. +03:12 Next up, needing a little helper to create a title. +03:15 And if it's not core Selenium, +03:17 I'm going to just paste it in. +03:19 In this exercise I want to make a PyBites news banner +03:22 and they're typically of the format news, year, week. +03:27 And to get a week, I use isocalendar. +03:30 So, basically what this does is, it gets me news +03:33 and then the current year and the current week. +03:36 The same for the variables. +03:38 I'm going to copy them in. +03:39 The news option corresponds to the dropdown. +03:43 So here we have a dropdown of different types of logos +03:46 or banner types. +03:47 So we have special, news, article and challenge. +03:49 And we want the news one, so we have to specify that +03:51 in the script. +03:52 So the news option is pybites-news. +03:55 That's the literal option of that select box. +03:57 I defined the background image +03:59 that will show up on the banner +04:01 and we're going to call the banner from PyBites import news +04:05 to enter digest and we pass in the year and the week. +04:08 Which is nice. +04:10 We have strings that you can just embed your variables. +04:12 And now the actual Selenium coding. +04:15 Driver. +04:16 find_element_by_id. +04:19 Going to find a name, oh that's this guy. +04:23 We're going to send the get title +04:26 which is the function that this is actually stored at. +04:33 Just pass it around. +04:34 That's better. +04:38 Then I'm going to find... +04:40 element... +04:44 by xpath. +04:51 I'm going to copy this over. +04:53 It's a bit tricky. +04:56 That's something I needed to work with select options. +05:01 So go find the select box called image URL one. +05:05 And again, you can use the web tools +05:09 to see what the actual HTML looks like. +05:12 So the select box is image on the score URL one. +05:16 Go grab that one and take the option +05:18 with the text news option and click it. +05:21 So an input field is easier, +05:24 but a select box is actually two actions, right. +05:27 You have to find it and click on the right option +05:29 to get that value, to get it selected. +05:33 Compare that to, again, another input element +05:37 where I can just say... +05:41 send keys. +05:42 It's just way easier, right? +05:46 And I send the banner text. +05:48 So I'm sending that here. +05:49 And finally, +05:52 I want to set the background image +05:54 to that beautiful snake we saw +05:56 and that field is called image_url2. +06:00 I'm going to send that to keys background image. +06:05 As it's the final one, I'm going to hit enter. +06:14 Alright, seems I didn't have year and week +06:17 in the global scope, so let's define those quickly here. +06:25 And look at that, the banner got created. +06:28 Let's show that once more. +06:31 It logged in. +06:33 Put all the data in the form and submitted it. +06:35 And it created this banner all automatically. +06:39 And let's not forget to close the driver when we're done. +06:46 And that closed my window. +06:47 Okay, how cool is that, right? +06:49 A banner completely automated with Selenium. +06:52 And I hope this gave you a taste +06:54 of what you can do with Selenium +06:56 and let's review next what we've learned. diff --git a/transcripts/73-selenium/6.txt b/transcripts/73-selenium/6.txt new file mode 100755 index 00000000..9191facb --- /dev/null +++ b/transcripts/73-selenium/6.txt @@ -0,0 +1,37 @@ +00:00 Right, let's review what we've learned so far. +00:03 The most basic example +00:05 of Selenium, the hello world, so to say. +00:08 You create a driver object. +00:10 You go to python.org. +00:12 You find the search field, named queue. +00:14 You populated the data and we submit it by hitting return. +00:20 We saw that Selenium actually opens your browser. +00:22 You see it doing it in real time which is pretty cool. +00:31 And here we make assertions based +00:34 on the page source that changed after the action. +00:38 Now we're going to do a more fun and practical example, +00:41 scraping my Packt account which you see here +00:43 in the logged in state. +00:47 We retrieve the login URL and loaded user and password +00:50 from the environment variables +00:52 and send them to the login form. +00:54 We submitted the form by hitting enter. +00:58 Then we found the My eBooks link and clicked it +01:01 to actually go to the my eBooks site you see at the left. +01:05 We identified the HTML that contains the books +01:08 and did some parsing to get all the titles and their ids. +01:12 And this is pretty cool to further extend +01:14 to make a download app or whatever. +01:17 And the second app was the PyBites banner generator +01:21 which we fully automated using Selenium. +01:24 Again, we logged in with the credentials. +01:29 We found the corresponding HTML. +01:31 In this case, we had to populate the form +01:34 to send data to the server. +01:38 And finally we closed the driver. +01:41 This led to an automated banner. +01:43 Awesome because, imagine you have +01:45 to create like 200 for some campaign. +01:47 Well, with Selenium, it becomes very easy. +01:51 And now it's your turn. +01:52 Keep calm and code in Python. diff --git a/transcripts/73-selenium/7.txt b/transcripts/73-selenium/7.txt new file mode 100755 index 00000000..3bbe92ec --- /dev/null +++ b/transcripts/73-selenium/7.txt @@ -0,0 +1,29 @@ +00:00 Welcome back. +00:01 In this second and third day, +00:03 it's time to get more practice with Python Selenium. +00:06 Notice that Selenium is a super important tool +00:10 often used in addition to functional testing. +00:13 I've not really explained that or demonstrated that so far, +00:16 but you're going to just play directly with it +00:19 because I have a nice code challenge for you. +00:22 First, take a quick look at this documentation section: +00:26 Using Selenium to Write Tests. +00:28 Then head straight to our Code Challenge 32. +00:31 This is our first Django app we did. +00:33 So, we made a little scraper of Planet Python, +00:37 and made a app to keep track +00:39 of what we were sharing on Twitter. +00:41 That's basically a listing of articles +00:43 where we can say we shared 'em or we skipped 'em. +00:46 Very simple, but it has a login. +00:49 So, it's a nice app to do some testing on. +00:52 So, you'll be asked to log in, look at articles, +00:55 look at various states the articles are in. +00:58 Look at the HTML of the page, etc. +01:01 And the whole write-up is here. +01:03 And I think it's a great exercise +01:05 to practice more with Selenium. +01:08 And that's it. +01:09 Try to do that one today, +01:10 or even the third day if you lack time. +01:13 And, I'll see you tomorrow. diff --git a/transcripts/73-selenium/8.txt b/transcripts/73-selenium/8.txt new file mode 100755 index 00000000..bd963b85 --- /dev/null +++ b/transcripts/73-selenium/8.txt @@ -0,0 +1,31 @@ +00:00 Welcome back. +00:01 This is the third day of the Python Selenium lesson. +00:04 I hope the exercise of yesterday +00:06 to test our little Django app was not too hard. +00:10 If you're still working on it, no problem. +00:12 I think it's a good workout so +00:14 then just use this third day to complete that. +00:18 If you're done or you're bored, +00:19 you want something else, +00:20 we looked at two core examples in this lesson, +00:23 Packt and automated banner generation. +00:26 Maybe you want to try those, +00:28 build them out, +00:29 or maybe even better scratch your own itch. +00:31 What are some of your boring stuff +00:33 that you can automate and write tools for? +00:35 Maybe you have a log in you want to automate to +00:38 your favorite site or social media, +00:40 retrieve some data, +00:42 or maybe even post some data. +00:43 The options are endless +00:45 and the best you can do is practice some more +00:48 because it's the practice with the new technology +00:50 that makes you a master +00:51 and it's also the most fun. +00:53 So enjoy and don't forget to share your work. +00:56 Use the #100DaysOfcode +00:57 and feel free to include @TalkPython +01:00 or @PyBites in your tweets +01:02 because we would love to see what you come up with. +01:04 Good luck and have fun. diff --git a/transcripts/76-flask-app/1.txt b/transcripts/76-flask-app/1.txt new file mode 100755 index 00000000..e5fb0db9 --- /dev/null +++ b/transcripts/76-flask-app/1.txt @@ -0,0 +1,17 @@ +00:00 Good day guys, this is Julian Sequeira again +00:03 and welcome to Day 76, 77, and 78. +00:07 In this three part segment, +00:09 we are going to be building a Flask app. +00:11 For those of you who may have taken other courses, +00:14 this is one of my favorite themes. +00:16 So, I'm really excited to be teaching you this one. +00:19 The basics here, we are going to just build +00:21 a really simple Flask app +00:23 but we're going to use Jinja2 templates +00:25 straight off the bat. +00:26 We're not just going to deal with the basics. +00:29 And then we're going to deal with dictionaries +00:31 and how to print those variables, +00:33 how to print that data straight into a Jinja2 template +00:37 that way your actual website has some functionality. +00:40 So, let's get right into it and start coding. diff --git a/transcripts/76-flask-app/2.txt b/transcripts/76-flask-app/2.txt new file mode 100755 index 00000000..8121d83f --- /dev/null +++ b/transcripts/76-flask-app/2.txt @@ -0,0 +1,42 @@ +00:00 Alrighty, before we start any of the programming +00:03 we need to do a little bit of set up, okay? +00:06 You can have a look at the, what you see on the screen here, +00:08 and you'll see that I've got +00:09 a bit of a folder hierarchy set up. +00:12 Now Flask, in order to operate, +00:14 it needs the route directory. +00:15 Now we're sticking really basic here, okay? +00:19 What you need to do is you'll have an, +00:21 I want you to create two files, first and foremost. +00:25 Wherever you're creating your Flask app, +00:26 I've created it in this directory here. +00:29 I want you to create an app.py file, +00:32 so that's this one here, app.py, +00:34 and a data file, that's for the next video. +00:38 All right, and then also create a templates folder, +00:41 like this one here, +00:42 and inside create a file called index.html. +00:46 You can use whatever editor you want +00:48 to create these files, just go ahead and create them, +00:50 and leave them empty, all right? +00:53 When you're done, it should look something like this. +00:57 And the one thing we're missing is +00:58 we haven't actually installed Flask, +01:00 so let's install that now using pip install. +01:04 Actually, what have I forgotten? +01:06 I've forgotten my virtual environment. +01:09 So shame on me, shame on me. +01:12 So, python -m venv venv +01:15 I'm just creating a virtual environment called venv. +01:18 And there it is there. +01:21 Now we can activate that, activate, and now it's running. +01:27 Now we can install Flask. +01:31 pip install flask, installs everything it needs, +01:34 including those lovely Jinja2 templates, +01:37 and there we go. +01:40 As I mentioned the Jinja2 templates, +01:42 that is what this directory is for. +01:46 So technically yes, this is a html file, +01:48 but it's going to behave like a Jinja2 template +01:50 when we get to it. +01:51 All right, move on to the next video and let's get cracking. diff --git a/transcripts/76-flask-app/3.txt b/transcripts/76-flask-app/3.txt new file mode 100755 index 00000000..991dcb5c --- /dev/null +++ b/transcripts/76-flask-app/3.txt @@ -0,0 +1,123 @@ +00:01 Okay with the files created, app.py, data.py, +00:05 and index.html let's get started. +00:08 Now the first thing we need to do as with any application +00:11 is pretty much import any of the modules +00:13 that we're going to use. +00:14 And in this case it's Flask. +00:16 Now Flask has so much to it that, you know, +00:20 it's not really that Pythonic to import everything. +00:24 So we're going to tell our application +00:26 what we're importing here. +00:28 And specifically we want to import Flask itself, +00:31 you know, go figure and we want to install +00:34 the render template. +00:36 Now this is what allows Flask, your flask app.py file +00:40 to communicate and work with your +00:43 index.html Jinja2 template. +00:45 All right, now we need to actually create +00:50 our application, our Flask application object. +00:54 Now everything that runs in your Flask app +00:56 is running pretty much underneath this app +01:00 that you are specifying here. +01:01 Now this name here can be whatever you want, you know, +01:04 so I'm just using app 'cause it's pretty self explanatory. +01:07 Now, we're going to use this name dunder +01:11 to say it's this file, it's this app +01:16 that's going to be assigned to this variable here, +01:18 to this object here all right. +01:21 Next up, and we're almost done actually +01:23 believe it or not, we have to specify +01:27 a function, okay, just ignore that decorator +01:31 for one second, just one second. +01:34 And all right, so this is our index function. +01:39 Now I've named it index because, +01:41 it's going to be the function that +01:43 operates the route directory of our website. +01:46 The forward slash of our website, +01:49 the home page of our website. +01:50 However you want to phrase that. +01:52 Now the app.route decorator, what this does is +01:58 it assigns this path, this route +02:01 according to Flask terminology. +02:04 It assigns this to this function so when you access +02:09 this page, this is the function that's going to run. +02:13 Okay, so now you're starting to visualize how +02:15 everything ties together, all right. +02:17 Now what we need to do is we need to return +02:21 something to send to that page +02:23 and how we're going to do that, well we're going to return. +02:27 Now if we wanted to make this super simple, +02:30 really basic, we could do something like this. +02:34 All right, hello world, now what this is going to do +02:39 is this is going to ignore that index.html file +02:43 because if you, as with anything, we haven't specified +02:47 index.html anywhere in this Flask code, in this Python code. +02:52 So how does this application.py file, app.py, +02:56 how does it know how to talk to that index.html file? +02:59 Well right now it doesn't. +03:00 All that's going to happen when you run this +03:02 is it's going to print hello world +03:05 in the top left hand corner of your page and that's it. +03:09 We don't want to be that boring, well, +03:10 it's going to be that boring but in a different way. +03:13 So what we're going to do +03:16 is we're going to actually tell our Flask application +03:19 that when you get to the route directory +03:23 of your website, you're going to load index.html. +03:30 So now we, anything that this page presents the html +03:34 is going to be in that index.html template, all right. +03:40 You can imagine what we're going to put in there. +03:43 So now the one last thing that we are missing +03:47 is the line of code that actually tells +03:51 our program to run. +03:53 app.run(). +03:57 Oh come on, got to get that right. +04:00 This app is this. +04:04 You can see this variable being referenced +04:07 multiple times now. +04:09 Everything is linked together via this object here. +04:13 All right. +04:14 So app.run() if you don't have that, +04:17 if you comment it out, it's not going to work. +04:19 Your website's not going to run +04:21 when this file is invoked, okay. +04:25 So all that's going to happen now when we run +04:27 the website is we're going to hit the route page +04:31 it's going to load that html file, and that's it. +04:36 Nothing will, you'll actually get a blank page +04:38 because we haven't specified what to run, all right. +04:43 So here's our index.html file that we've created. +04:46 I've opened it up in Notepad++ +04:48 and all we're going to do is put +04:50 some really basic html in there. +04:53 So never fear if you've never worked with html. +04:56 Let's get this really, really basic. +05:00 Going to open the body tag, I'm going to throw a paragraph +05:03 tag in there and we're going to say, "Hello planet." +05:08 Yeah, let's, let's be slightly different, all right. +05:11 And close the body tag and we're good as gold. +05:18 Now let's actually try and run the app. +05:21 To run it all you actually have to do is +05:23 hop into your command prompt, or whatever you're using, +05:26 and just from your app.py file +05:30 just like any other Python script, python app.py. +05:34 Bang, now this line here tells you the default +05:39 IP address that Flask uses for your website. +05:41 So it's launched the web server and it's going to respond +05:44 on local host 127.0.0.1, port 5000 all right. +05:50 Now that we have port 5000 ready, we'll bring up +05:53 this that, here's one I prepared earlier +05:56 and we're going to hit enter and that's it. +06:00 How simple is that? +06:01 So if you think about it, we've just got +06:03 just a handful of lines of code. +06:06 So you've got a couple of lines +06:08 in the html file, a Jinja2 template, +06:10 and this and that is your Flask website. +06:13 So what I'd like you to do now is have a play with this. +06:17 Just play around with it, that's your day. +06:19 Follow along with the video, run your very first Flask +06:22 website, and see how you go. +06:24 On the next video, we're going to deal +06:26 with some actual data. +06:28 Very exciting. diff --git a/transcripts/76-flask-app/4.txt b/transcripts/76-flask-app/4.txt new file mode 100755 index 00000000..bd8c6e26 --- /dev/null +++ b/transcripts/76-flask-app/4.txt @@ -0,0 +1,195 @@ +00:00 Okay, now we've got our site, let's make it interesting. +00:03 Let's deal with some actual data. +00:05 So, earlier I got you to create a data.py file. +00:09 That would be this one here. +00:10 It's nice and empty. +00:12 So, this is where we're going to create our data. +00:15 As you can imagine, with most applications, +00:17 you're not going to have the data inside one file. +00:21 Everything's going to be spread out. +00:22 So, let's put the data in one file here, +00:25 and we're going to call it fav_beer +00:28 because that's what I wish I was drinking right now. +00:33 So, what's my favorite beer? +00:35 Let's run it through. +00:36 So, I'm just creating a dictionary here, a dict, +00:40 that has a name as the key, and the type of beer, +00:45 or the name of the beer, as the value. +00:48 So, I'm just going to populate this with five entries +00:51 and show you that. +00:53 So, here comes some magic. +00:55 And we are back. +00:56 Take a look at that. +00:57 So, I've populated this quick dictionary here. +01:01 Going to save the data.py file, +01:03 and then we're going to call it in our Flask app. +01:05 We're going to import it, okay? +01:07 So, what do we run here to import it? +01:10 We're going to go from, woops, clicked in the wrong spot. +01:13 We're going to run from data, the data file, +01:16 we're going to import that actual dict, all right? +01:21 So, you can, deer. +01:23 I don't like deer, I like beer. +01:24 So, you can imagine if you had multiple variables, +01:27 or dictionaries, or lists in that file, +01:30 you would import them here, all right? +01:33 So, from data import fav_beer. +01:35 Now, how do pass that dictionary off to the Jinja2 template? +01:41 Alright, we're going to do that in this rendered template, +01:44 'cause we're returning, we're returning that variable. +01:47 We're going to return this dictionary to the template, +01:50 we're passing it off, handing it off, all right? +01:55 If you could've seen my hand gestures just now, +01:56 it would've been hilarious. +01:58 So, fav_beer. +02:01 But is that right? +02:02 Not quite. +02:04 With Flask, you've got a bit of a special way of +02:08 specifying these variables, all right? +02:10 So what we're doing is, at this point here, +02:13 we've said fav_beer=fav_beer, right? +02:18 Now, what we're doing is we're assigning +02:20 the fav_beer dictionary to the fav_beer object +02:27 that is going over to the template, okay? +02:32 That's just how it works. +02:33 I know it looks odd, and I know it probably +02:35 is a little bit confusing, but that's how it works. +02:38 You can't just say, you can't delete this +02:42 and just have the one object going across. +02:47 You have to tell it, okay, I'm assigning this object, +02:50 this data, this dictionary to the actual Flask object +02:55 that's going to be accessible from +02:58 the Jinja2 template, all right? +03:02 So, that's actually nice and easy. +03:03 That's all we have to actually edit in our Flask app. +03:08 Then most of this is actually done +03:10 in the index file. +03:12 So, let's bring up Notepad again, +03:15 where we've got this. +03:17 Now, I'm going to do a bit of magic here again, +03:20 because I don't want you to see me +03:21 have to type all of this stuff out. +03:23 All right, so let's just add in +03:25 a whole bunch of extra HTML stuff +03:27 to make the page a little nicer. +03:29 Let me do that now, and fade to black. +03:32 And we're back. +03:33 So, look at this, I've thrown in a head tag, +03:36 I've thrown in some extra lines for style sheets, okay? +03:42 I did not want to have to deal with CSS myself, +03:44 so I've gone to bootstrap and grabbed all of their +03:48 yummy style sheet stuff, all right? +03:50 We've thrown in title, favorite beer tracker, +03:54 and we've got our body tag. +03:57 I've done some in-line CSS here, +03:59 just to add a margin on the left of 50 pixels, +04:01 got a H1 tag header in there. +04:04 Now, if we run this, let's just see how it looks +04:06 without any actual Python code running here. +04:11 So, we'll quickly go back here, run python app.py, +04:15 kicks off the server, normal 127. +04:20 Bring up my browser, load that, and bang, favorite beers. +04:24 We've got that little margin here, got the H1 tag, +04:27 and we've got the title up there. +04:29 Now, how are we going to do this? +04:31 How are we going to present that dictionary worth of data? +04:34 We have a key, we have a value. +04:36 Well, you can think, you're probably going to want +04:38 a table of some sort, some sort of a spreadsheet. +04:41 We'll go with a table, that sounds nicer. +04:44 Now, to run a table tag, we run, +04:48 we'll type this sort of thing in there. +04:50 Now, I'm just going to quickly copy and paste this +04:54 specific bootstrap tag, which will make our table +04:59 look really nice. +05:01 That way, I don't embarrass myself. +05:04 All right, chuck that in there. +05:07 Now, we're going to create the table row. +05:09 Now, you know, for this you do need some basic HTML, +05:11 but you know, just head to W3 schools, or what have you, +05:15 and you'll have yourself up and running in no time. +05:18 So, we're going to have a table header called name. +05:20 I'm going to have a table header called beer, or beverage. +05:25 We'll go with "beer of choice," I think that works better. +05:30 All right, close off the table row. +05:37 Now, how are we going to do this? +05:39 You think to yourself, we've got a dictionary +05:42 that could potentially grow. +05:43 If this was some sort of a production thing, +05:45 it's going to grow, so we can't manually specify +05:50 every single line one by one. +05:52 This is where the Python code comes in. +05:54 Now, we're going to run a for loop, +05:56 just like, if you could imagine, +05:58 for a script on the command line, +06:00 you're going to run a for loop to print out +06:02 all of the keys and values of that dictionary. +06:05 We're going to do that now, but we're going to do it +06:07 with a table wrapped around it. +06:09 So, no matter what data gets added to our dictionary, +06:13 this table will grow every time the page is launched, +06:16 so that's pretty cool, right? +06:18 So, to run Python code within the Jinja2 template, +06:23 there's a certain format, and that's the +06:26 left curly brace with a percent sign. +06:30 If you see that opening on one of these Jinja templates, +06:34 that denotes you're about to execute some code. +06:37 So, for name and beer. +06:40 You could write for k,v, whatever you want to do. +06:43 Remember, these are arbitrary. +06:44 So, for name, beer in fav_beer.items. +06:50 That's how we open the dictionary +06:51 to access the keys and values, +06:54 and then we close that off. +06:57 Now what are we going to do? +06:58 Well, every time you pass through this loop, +07:04 you're going to create a table row, +07:05 and in that table row, you're going to create +07:08 one cell, so to speak, and the first one +07:13 is going to be titled "name." +07:17 So what this is is this is a substitute +07:22 flag for the Jinja2 templates. +07:24 So, anything that goes in here +07:27 within these two brackets has to be a variable. +07:30 So, we're going to put in whatever the key is, name. +07:35 So again, if you put the letter k there +07:37 as you normally would, you'd put k in here. +07:40 So, the name from that name key in our dictionary +07:44 is going to pop into this cell here, all right? +07:50 So, TD and the next one is going to be our beer, all right? +08:01 And that's it. +08:02 So now, no matter how many people you add +08:05 to your beer tracker table, or dictionary, I should say, +08:10 this table will grow every time +08:13 you reload the page, all right? +08:15 So, let's close this off, and now, +08:21 we can close off the for loop. +08:24 Now, this is very important. +08:25 If you do not close off the for loop, +08:29 your Python code will fail. +08:32 It will tell you that there was no closure +08:34 of the actual for loop. +08:35 And last but not least, we close our table. +08:40 And that, my friends, is it. +08:43 Now let's launch it. +08:45 So, to do that, we make sure we save, +08:49 make sure everything's saved, +08:50 go back into app.py, and we rerun +08:57 the script, and there you go, it's run the web server, +09:01 load up the website, bang, look at that. +09:05 We have this nice, cool table. +09:09 Julian likes White Rabbit Dark Ale. +09:11 Mm, yummy. +09:13 Bob, I'm guessing, likes some sort of light beer, I assume, +09:16 'cause that's Bob, right? +09:17 Mike B. From Oregon, well, Oregano beer, Oregano beer? +09:22 I have no idea. +09:23 And Cornelius and Dan, who happen to be +09:26 friend of mine at work, like these beers. +09:28 So, that's it. +09:30 That was dealing with data, with a dictionary, +09:35 and passing it to Jinja2 templates +09:38 to create yourself a little bit of a front end. +09:40 So, this is really cool. +09:41 This is now where you can start +09:43 seeing your own application. diff --git a/transcripts/76-flask-app/5.txt b/transcripts/76-flask-app/5.txt new file mode 100755 index 00000000..a8a9c453 --- /dev/null +++ b/transcripts/76-flask-app/5.txt @@ -0,0 +1,49 @@ +00:00 Alright. +00:01 Let's quickly cover off everything we've learned +00:03 and leave it to you, +00:05 So, a basic Flask app, +00:08 that's pretty much what we did. +00:09 Okay? +00:10 We did add some data in there, +00:12 which is what made it a little more fun +00:13 and approachable and usable. +00:15 So the first thing we had to do is import Flask +00:18 and render_template, as well as the dictionary information. +00:24 The render_template we will get to. +00:26 We then declared the Flask app object and importantly, +00:32 we added that app.route decorator to the index function +00:38 and that allowed us to get to the URL of route +00:41 and execute this code, +00:45 and then we returned the dictionary to this index html, +00:51 using render_template. +00:53 That was very important for us to talk to the Jinja template +00:57 and finally we ran the app with app.run(). +01:00 Remember, you need that line. +01:02 Don't forget it or your app is not going to run. +01:05 As for the Jinja template, the html, +01:08 I've narrowed in on just the important parts here. +01:11 Alright, we create the table using our normal html and css, +01:14 whatever it is you might use, +01:17 and then we execute the Python code. +01:20 Alright, so we've got our for loop there, +01:23 to pass through, to iterate through the dictionary +01:29 and the items so keys and values, +01:32 and remember, super important, +01:34 your curly brace with the percentage sign +01:38 that denotes the code that will be executed. +01:42 We then use these substitution brackets, +01:45 these double curly brackets on either side +01:47 and that's how we print or display the data in this key +01:53 and this value within this for loop, +01:56 remembering that every pass of this for loop +01:58 is going to create this table row with the data. +02:03 Alright, and finally, just as important, +02:07 you have to close the for loop. +02:09 You have to end it using this syntax, endfor. +02:13 And when we run it on 127.0.0.1 local host, port 5000, +02:20 this is what we got, really, really awesome stuff. +02:25 Okay? And now it is your turn. +02:29 Take everything you've learned and try to make your own app. +02:33 Try and make your own custom app based on some sort of a +02:36 dictionary or list or whatever you can think of +02:39 and enjoy that for day three and move on to the next video. diff --git a/transcripts/76-flask-app/6.txt b/transcripts/76-flask-app/6.txt new file mode 100755 index 00000000..5c3dfa16 --- /dev/null +++ b/transcripts/76-flask-app/6.txt @@ -0,0 +1,39 @@ +00:00 This is the ReadMe for the course, +00:02 for the Python Flask introduction. +00:04 This is going to guide you through the next 3 days, +00:08 so obviously we have the videos coming, +00:11 but there are some little things you should know +00:13 before you get cracking, so looking at these days here, +00:18 the first thing you're actually going to do is set up +00:20 your environment and then create your first Flask app, okay? +00:25 It's quite simple. +00:27 You'll probably complete these very quickly, +00:29 but there are a few concepts that you should know, +00:31 so just follow along with the videos +00:34 and then play around with your Flask app. +00:36 What I'd like you to do on the first day +00:39 is start thinking about potential CLI scripts, +00:43 maybe apps that you've already written for the command line, +00:47 and then see how you can Flaskify them, +00:50 turn them into Flask apps. +00:52 Just have a think about that one. +00:54 For the second day, what I'd like you to do +00:57 is go through the videos, and you're going to be working +01:00 through dictionary data, how to pass that data +01:03 from your Flask app into your Jinja template. +01:07 This is very, very critical, so it's a good day +01:10 to dedicate just to that, alright? +01:13 And play around with that, see what else you can do with it. +01:18 If you want to dive into the more advanced functionality, +01:20 you can, with databases and whatnot. +01:24 But really, that is your Day 3, +01:26 so freestyle, go nuts. +01:29 The CLI app that you would've thought about on day one, +01:33 actually try applying Flask to it. +01:36 Try that on Day 3 and maybe throw in the database thing +01:40 that you probably played around with on Day 2. +01:43 So see what other cool advanced techniques +01:46 you can discover and learn with Flask, +01:48 and see what you can implement on existing apps. +01:51 That's your Day 3. +01:53 And with that, just pop on over to the next video. diff --git a/transcripts/79-sqlite3/1.txt b/transcripts/79-sqlite3/1.txt new file mode 100755 index 00000000..35e776ae --- /dev/null +++ b/transcripts/79-sqlite3/1.txt @@ -0,0 +1,20 @@ +00:00 Welcome to SQLite 3 Databases. +00:03 I'm Julian Sequeira and I'll be walking you through +00:06 possibly one of the most fun and satisfying libraries +00:09 you'll deal with on your Python journey. +00:11 I say that because at this point you'll be looking +00:14 at persistent data, more so than just a simple text file +00:20 or what have you. +00:21 SQLite 3 Databases allow you to actually use your SQL +00:25 knowledge to give you self-persistent databases. +00:29 It's as simple as that. +00:30 It's exactly what you expect if you've ever dealt +00:33 with databases before and it's really, really simple. +00:37 So these three days you're going to be creating your first +00:40 SQLite 3 database +00:43 and then you'll be learning how to inject data into a... +00:47 Print the data out and I've also included a couple of really +00:50 cool scripts that you should help you automate some +00:53 of your SQL journeys and also it should help you, +00:58 help guide you through your SQLite 3 learning. +01:00 So enjoy and get cracking. diff --git a/transcripts/79-sqlite3/10.txt b/transcripts/79-sqlite3/10.txt new file mode 100755 index 00000000..cb111bc3 --- /dev/null +++ b/transcripts/79-sqlite3/10.txt @@ -0,0 +1,42 @@ +00:00 All right, here's how we're going to break down +00:02 these 3 Days on SQLite3 Databases. +00:05 So to start off with you're going +00:07 to install SQLite db browser. +00:11 All right watch the video on that, get it done. +00:13 Then you're going to create your first database, +00:16 or your first sqlite three database, anyway. +00:19 And that's going to quickly be followed by +00:21 a script that generates a database for you. +00:25 So I'm going to demonstrate that for you, +00:26 and it's actually quite useful so, enjoy that one. +00:30 For Day 2, what I'd like you to start doing +00:33 is inserting data into the address book. +00:37 Okay this is the address book database +00:40 that you were going to create in Day 1. +00:42 So Day 2 is, so Day 1 is going to be create the database +00:47 Day 2 is going to be insert data into the database, okay? +00:52 And it's then going to quickly be followed up with +00:56 extracting that data, so pulling the data out with select. +01:01 Okay, all that's explained in the videos. +01:04 Now, Day three, what you're going to do is +01:09 apply everything you've learned into your own project. +01:14 Okay, so by the end of Day 2 you'll have created +01:17 the address book and you'd be able to pull data out +01:20 and insert data into it as you wish. +01:23 So now, try and replicate that +01:25 with something else you can think of. +01:26 Okay copy as much as you want. +01:28 Remember the purpose here is to just practice +01:31 with the code and once you have that down +01:33 if you still have time for Day three, +01:35 figure out how to edit the data in the database, okay. +01:41 So a quick one here is we are inserting +01:44 and extracting the data, we're not editing it. +01:48 Okay we don't cover that in the video, +01:51 so that's a nice little stretch goal for you. +01:52 So do your googling and play around with it +01:55 and see if you can edit the data, +01:57 that's your challenge for Day three. +01:59 And that's it, so those are really +02:01 the basics of sqlite three, move on to the first video +02:05 and enjoy the next couple of Days. diff --git a/transcripts/79-sqlite3/2.txt b/transcripts/79-sqlite3/2.txt new file mode 100755 index 00000000..1d5a1e67 --- /dev/null +++ b/transcripts/79-sqlite3/2.txt @@ -0,0 +1,26 @@ +00:00 Let's get started. +00:01 The first thing I need you to do is open up your browser +00:04 and head to sqlitebrowser.org. +00:09 It's this website here. +00:10 And this is for a database browser for SQLite. +00:14 It's a sort of GUI, a graphical user interface, +00:17 that allows you to see the contents of your database. +00:21 And this is important because sometimes +00:24 when you're checking things on the command line, +00:25 it's quite difficult to figure out. +00:28 You get that visual representation +00:29 of the columns and how everything looks like in the table. +00:33 Looking at this screenshot here, this is a Mac screenshot. +00:36 You can see there's your table here called Total Members. +00:41 There's the different columns and so on. +00:44 Now, we're going to use this a bit later on, but this is +00:47 pretty much the only setup step you're going to need to do. +00:49 So go ahead and download it +00:51 for your operating system of choice. +00:53 I'm using Windows, obviously, and my one, +00:57 once installed, looks like this. +00:59 Okay, no database is actually loaded into it. +01:02 We can use the open database button here +01:04 to load one in once we actually have it. +01:07 But for now, just get it installed. +01:10 That's sqlitebrowser.org. diff --git a/transcripts/79-sqlite3/3.txt b/transcripts/79-sqlite3/3.txt new file mode 100755 index 00000000..75df64b0 --- /dev/null +++ b/transcripts/79-sqlite3/3.txt @@ -0,0 +1,152 @@ +00:00 Okay, blank slate, here we go. +00:03 The first thing you need to do +00:04 is create a Python file called simpledb.py. +00:09 That's this file here in your project directory that +00:13 you're going to use for this video. +00:15 So you see I've got simpledb.py. +00:17 Next up, we're going to start our virtual environment, +00:21 so python -m venv venv +00:26 Now we're not actually going to be +00:27 installing any third party modules +00:28 or anything crazy so, +00:30 I suppose technically the virtual environment +00:32 isn't necessary but, +00:35 for me, I always do it no matter how little the project is. +00:39 So we'll activate that, +00:42 venv\scripts\activate +00:46 and now we're safe. +00:47 Now what we can do is we will actually launch +00:51 the python shell just so that we're using it in here. +00:54 There we go, python 3.6. +00:57 Now technically what we're about to do here +00:59 is we're about to use commands +01:02 that we could sort of run in this virtual shell here. +01:07 But I'd like to actually run these commands +01:09 in a script just to show you how it works +01:13 in a different sort of way. +01:15 So just bear with me. +01:17 The first thing we're going to do is +01:19 create a database. +01:21 It's the first day of SQLite 3, +01:23 so let's create a database. +01:25 We have to do that to work with one, right? +01:29 What we will do is +01:30 we'll just throw this in the top, +01:33 and we'll import sqlite3. +01:36 That's it, that's pretty much all we need to do +01:38 to create our database. +01:40 It's all we're actually importing. +01:43 Now, I want you to visualize this. +01:46 Don't just read what I'm going to be typing here +01:47 and what you'll be following along, +01:49 I'm going to use the full form words +01:51 just so that it makes sense. +01:53 Alright? +01:55 We're going to create a connection object +01:58 and that object is going to store +02:01 our actual connection to the database. +02:05 Think of the database as, you know, +02:07 some sort of a, something you have to tap into, right? +02:11 And in order to do that you need to create +02:13 a connection to it just like you connect +02:14 to the internet or what have you. +02:17 So we're going to connect using +02:19 the SQLite3.connect command and +02:23 this is now where we specify the name of our database. +02:28 So let's, for this exercise, let's create an address book. +02:31 Address book with your name, +02:32 your phone number, your address, maybe. +02:35 And let's call it addressbook.db. +02:40 There's our database. +02:42 Now what this command does is +02:45 sqlite3.connect addressbook +02:48 that is actually going to create this database +02:52 if it doesn't exist. +02:55 If this database did exist, it would just connect us to it. +03:00 Which is really cool in that if it doesn't exist +03:02 it thinks "Well, hey, you just want me to create it, +03:04 "so I'll create it." +03:06 And we're going to store this connection, +03:08 this connection to this database, +03:10 in the connection object. +03:14 Now, +03:16 in order to parse the database, +03:18 P-A-R-S-E, +03:20 in order to parse the database, +03:21 we need to have a cursor. +03:24 So just like this cursor here allows us +03:26 to move through text and say Microsoft Word document, +03:30 or what have you, +03:31 we need this cursor for the database. +03:36 And using this cursor we can execute commands. +03:40 We can send commands to the database +03:43 to do certain things such as +03:45 select information, overwrite information, +03:48 create things, hint hint. +03:52 But we need to store that inside another variable. +03:57 Generally the rule of thumb is to just +03:59 call this cursor c, and that cursor is part of connection. +04:05 So part of our actual SQLite 3 connection. +04:09 So, connection.cursor. +04:12 c =, or c is assigned connection.cursor. +04:18 Now, as I hinted, we want to execute commands. +04:23 So c.execute. +04:25 Now in the brackets here, what are we actually executing? +04:30 This is where you actually start to use your SQL commands. +04:34 We're going to put those within a few of these, +04:38 'cause it's going to be multi-line. +04:42 And the first SQL command is create. +04:47 Because, what are we doing? +04:48 We're creating a table. +04:50 And now, this next word we're going to type in +04:54 is going to be the name of your table. +04:57 So within our address book database, +05:00 we have a table named, let's call it details +05:04 because I have no imagination. +05:08 Now, we have a table named details. +05:10 That's what this command is creating. +05:13 Now what do we want to be in that table? +05:17 Well, I can imagine in my address book +05:20 I might have a name. +05:22 So creating, pretty much we're creating +05:24 a column here named "name" in our table. +05:28 And that name, what kind of information +05:31 is going into that name? +05:33 What type of information is going into that name column? +05:36 Well, it's going to be text. +05:39 Same with the address. +05:41 We want an address column. +05:43 And that's also going to be text. +05:45 But our phone number, +05:47 while that could be text let's just +05:49 shake things up a little. +05:51 That's going to be an int, an integer. +05:54 So that's it. Or so you think. +05:57 But then last thing as you know +05:59 from some of you other python work so far +06:01 is that you actually need to close your connection. +06:04 Now, to do that, as you'd expect, +06:07 connection.close. +06:09 Nice and straightforward. +06:12 And that is so simple. +06:13 So as I mentioned before, all of this, +06:16 all of these commands that we're typing in here, +06:18 all of this python code, +06:19 it's actually stuff you can run on your python shell, +06:24 in your python shell, I should say. +06:26 But we'll put it in a script. +06:29 That way, we can just run the script +06:32 from the command line. +06:34 We'll go directory here, let's see, +06:37 there's our simple db.py, +06:39 and let's run python simpledb.py. +06:45 And look how quickly that returned. +06:47 I hope it actually did something. +06:49 Now we should have a database called addressbook.db. +06:53 Now this database is completely empty +06:58 because all we've done is create a table +07:00 with name, address, and phone number, +07:03 but no data. +07:04 So let's open up SQLite database field, +07:08 the application you installed, +07:10 and let's have a look at that. diff --git a/transcripts/79-sqlite3/4.txt b/transcripts/79-sqlite3/4.txt new file mode 100755 index 00000000..b06f7906 --- /dev/null +++ b/transcripts/79-sqlite3/4.txt @@ -0,0 +1,18 @@ +00:00 So we'll bring up the program here. +00:03 I've got mine open already. +00:04 Control + O will actually open up our open dialogue, +00:09 and there is our address book database. +00:12 So let's open that up. +00:15 You can get a bit of information here, +00:17 although this isn't the most detailed view, +00:19 but straight away, you can see +00:21 there's one table within this database, +00:23 with the name of details, +00:25 and it's got these three columns. +00:28 So let's actually go to browse data. +00:31 This looks more like what you sort of want to see +00:33 when you visualize your database. +00:36 There's the table name, there's our name column, +00:39 address column, and our phone number column. +00:42 In the next video, I'm going to show you +00:45 how to set this up automatically. diff --git a/transcripts/79-sqlite3/5.txt b/transcripts/79-sqlite3/5.txt new file mode 100755 index 00000000..96e17f03 --- /dev/null +++ b/transcripts/79-sqlite3/5.txt @@ -0,0 +1,99 @@ +00:00 So for this video, I just wanted to show you +00:02 a cool little script that you can create to +00:05 sort of generate your own database files. +00:08 Just for testing purposes, right? +00:10 'Cause that's one of the great things about SQLite3. +00:13 It's super lightweight, and you can use it for testing. +00:16 So just create a new file. +00:19 All right, and, I'd like you to +00:22 pretty much use the file, I mean, you could +00:24 edit whichever way you wish, of course. +00:27 But you'll find this file in the course materials. +00:29 So don't feel like you have to copy everything +00:31 I'm typing here, in fact, I'm going to use +00:33 some of my black magic to make it appear on the screen. +00:37 So, I'm going to explain this text to you in just a minute. +00:40 But what we will do is, let's save the file as +00:44 so, create this Python file for yourself. +00:47 generate_db.py, all right? +00:55 Now, here comes the magic. +00:58 Okay, so I know this looks daunting. +01:00 So, just don't panic, if you don't know +01:02 what you're looking at here. +01:04 I'll explain things in a simple way, but, +01:06 I'm going to try and skip over the stuff that isn't +01:08 really SQLite3 relative, but just bear with me. +01:12 Okay. +01:13 So we're creating a context manager here. +01:15 We're creating a generator. +01:16 And that uses a with statement, well that's one way. +01:19 It uses a with statement. +01:20 And it'll have a function in there with this decorator. +01:24 And you can read this stuff up. +01:25 We'll link to that in the course notes. +01:28 And it will yield something. +01:30 In this case, it's going to yield that cursor. +01:34 That we use here. +01:36 So you've got your connection.cursor, right? +01:38 Well, we have that here. +01:41 We've just abbreviated it down to con. +01:43 Which is generally a standard, right? +01:45 So, the first thing that this script if going to do is +01:47 it's going to prompt you for a name. +01:49 So when you run it, it's going to say, well, +01:51 what's the name of your database? +01:52 What would you like to name your database file, all right? +01:55 And, you enter in a name. +01:57 It returns the name. +01:59 And your context manager, this with statement, +02:03 will create the database using that name. +02:07 All right, so runs create_db which is here. +02:10 And create_db when invoked is going to +02:13 set up your connection cursor, all right? +02:15 It's going to yield that cursor line right here, +02:20 with create_db() as cursor so it returns, +02:23 it yields the cursor into here. +02:27 And then now, your width statement, runscursor.execute. +02:32 Okay, so this is just a generator, very simple generator. +02:35 And then it goes cursor.execute, +02:37 and it creates a table called test table. +02:40 With three columns. +02:43 Sorry, four columns. +02:44 Column one, two, three and four. +02:46 Three as text, and one as int. +02:49 And when it's done, it prints. +02:51 The database has been created. +02:53 This is just a simple, string formatting. +02:56 And, again, substitutes the name in, +02:59 you can see that here as well. +03:01 And that's it, that's literally all this script does. +03:04 Now, as you can tell, this is hard coded. +03:07 And this is why I said this is great for testing. +03:10 And this is something I use. +03:11 And I will just quickly pop in here +03:13 and change this if I have to, but for the most part, +03:16 three text columns and an integer column +03:18 is more than enough for me. +03:20 And I've used this on multiple occasions. +03:21 Just to create a really quick, simple SQLite3 database. +03:25 Without having to go through, and create it myself +03:28 manually using these connection commands, all right? +03:32 So let's save this file. +03:34 And, with that out of the way. +03:37 We will run, let's just make sure it's in here. +03:40 python generate_db.py +03:44 What would you like to name your test DB file? +03:48 Well, let's just call it Julian. +03:52 Julian.db has been created. +03:55 There we go. +03:57 Right down there. +03:58 Open up our database browser, again. +04:02 Let's close this database. +04:06 Open up Julian. +04:09 And there we go. +04:10 We've got test table, with one, two, three, four columns. +04:14 It is a very useful script. +04:16 You can edit it to something that's much more, there we go. +04:20 You can edit it to something that's much more +04:22 appropriate for you, and for your testing purposes. +04:24 But it's a really cool one just to keep handy just in case. diff --git a/transcripts/79-sqlite3/6.txt b/transcripts/79-sqlite3/6.txt new file mode 100755 index 00000000..6f57b73f --- /dev/null +++ b/transcripts/79-sqlite3/6.txt @@ -0,0 +1,52 @@ +00:00 Time to finally input some data +00:02 into that address book database, okay. +00:05 So I've just opened up a Python shell +00:07 within that same directory, and the first thing +00:10 we'd need to do is import sqlite3. +00:13 Alright, we need to do that every time we invoke the shell. +00:16 Next, we need to open that connection to the database. +00:21 So, we'll do that, same style as before. +00:23 Connection=SQLite3.connect +00:26 addressbook.db +00:29 Make sure you get the name of the database correct, +00:33 because again it will just generate another database +00:36 if you don't connect exactly +00:39 to the same name as you're trying to, okay. +00:42 Next, we need to actually create that cursor +00:45 that allows us to interact with the database. +00:47 So, c=connection.cursor +00:52 And now we get to execute the code. +00:56 So, execute, what are we inserting, +00:59 well what are we doing, rather, we're inserting data into +01:06 our details table within the address book database +01:10 okay, and this is all SQL now. +01:13 So the values that we're putting in there, +01:16 now visualize this from left to right +01:18 column zero and onwards. +01:20 Column zero was name, column one was address, +01:24 and column two was the phone number. +01:27 So, the first column is going to be, my name. +01:32 The second column is going to be my address. +01:36 I promise this is correct. +01:38 And, my last column is going to be my phone number. +01:44 Don't call me after 9:00. +01:46 And, once we're done, we close off +01:49 the actual execute, the SQL. +01:52 And bang we get that nice little return message. +01:55 Now, that would normally be if you were, sort of, +01:59 using that in a script within a With statement or whatnot +02:02 but, we're doing this all manually +02:04 so we actually need to commit our +02:09 session here. +02:10 So, connection.commit, +02:13 now it's actually saved to the database. +02:16 Alright, so let's close, connection.close. +02:20 Alright, let's bring up our database, +02:23 now I already have this open within SQLite browser, +02:27 so lets refresh here using these little funky arrows. +02:31 And there's our data. +02:33 Let's expand that out so you can see it. +02:35 Now, we've got Julian 123 Fake St. +02:39 and my phone number, alright. +02:41 And that's it, that's how we pop data into there +02:43 one line at a time, in a very manual method. diff --git a/transcripts/79-sqlite3/7.txt b/transcripts/79-sqlite3/7.txt new file mode 100755 index 00000000..8121d026 --- /dev/null +++ b/transcripts/79-sqlite3/7.txt @@ -0,0 +1,136 @@ +00:00 So what just saw in the last video, +00:02 inserting data line by line, +00:05 on this Python shell, within this Python shell, +00:07 is actually quite tedious, right? +00:09 Imagine trying to enter lots and lots of data. +00:12 Well, you're not going to do it that way. +00:14 That was just for demonstrations. +00:16 So, what I've done is I have actually written a simple +00:20 populate_db.py Python file, +00:23 which again is in the materials for this course, +00:26 and what it does it actually prompts you to enter the data +00:32 as it is required, +00:33 and you can run it as many times as you want. +00:35 It actually keeps looping through until you quit out of it. +00:38 So, let's take a look at that file here. +00:40 Now, let's create it. +00:41 You're again going to use some magic here. +00:44 You can just copy the file from the actual repo, otherwise, +00:48 just feel free to pause and tuck this in if you're crazy. +00:51 Uh, alright. +00:52 Let's create the file here. +00:55 Let's save the file as +00:58 pop, woops, populate_db.py +01:02 Alright, here comes the magic. +01:05 Alright, let's take a look at that. +01:07 Now, this is nowhere near as complex as +01:09 the generator one we did before. +01:12 So, first things first, +01:13 as soon as you click on this or run this script, +01:16 it's going to run the enter_details function, okay, +01:19 and the inter details function simply starts a while loop +01:24 and while true, which is always true, right? +01:26 Running the script is true. +01:28 So while true, it creates an info list, +01:33 an empty one, right? +01:34 We need to set this here because we are going to to add to it, +01:37 in a second. +01:38 Now, it actually runs three inputs and this is where it +01:42 prompts you to enter the data that you want in the database. +01:46 So, name=, or name is input, +01:50 enter a name. +01:51 So, when you enter a name, +01:53 this prompt is assigned to the name variable. +01:55 Same with address, same with phone number. +01:57 Nice and simple. +01:58 Now, for I, we are going to run a for loop for I, +02:02 in name, address, number. +02:05 That's the three variables. +02:07 So, it's going to iterate over them. +02:09 We want to append I, +02:14 so append the name for I, +02:16 so, for name let's just break it down. +02:18 So, for name in name here, +02:24 we are going to append the data within the name +02:28 to the info list. +02:30 Okay, so by running this for loop is where we are +02:32 populating the info list with these three variables. +02:35 Simple as that. +02:36 Now, you remember this from the generator before? +02:40 We have a with statement, okay, +02:42 so it's opening the connection, right, +02:45 and within this width statement +02:48 it is running connections on cursor, +02:50 and then it's executing this SQL here. +02:54 Now, this is the important part. +02:56 So, we are inserting into our details table +03:00 these three values, +03:02 but we are not actually. +03:03 These are actually wild cards, right, +03:07 so these are substituted just like you would with a stream, +03:11 okay, using in the print statement, +03:13 but with substituting the contents of info. +03:17 So this is very manual. +03:20 Just think of it that way. +03:21 What if info wasn't filled with three name, address, number, +03:26 three list items? +03:28 What if it wasn't? +03:29 Well, this wouldn't work. +03:31 So this was written specifically for our address book table, +03:36 details table, +03:38 because we know it has three columns: one, two, three; +03:41 and we are going from left to right, +03:43 name, address book, phone number. +03:46 So, if again, if this info was any other way, +03:49 this would mess up. +03:50 Likewise, if someone wrote an address into enter name, +03:55 and a name in enter address, +03:58 you're going to end up putting an address into the name column +04:01 and the name into the address column. +04:03 So, just bare in mind those limitations, +04:05 but the reality is inserting the info list populated +04:11 with name, address, and number into your database +04:14 and then it simply prints data inserted to database. +04:19 Then, it asks you if you want to stop. +04:24 So, if you hit q, in any case, +04:29 it's going to break out of the script. +04:31 Otherwise, it's just going to continue on +04:34 and go back to the top and ask you the same three questions. +04:38 So, let's save this file. +04:41 Lets exit out of our shell +04:45 and let's run it Python populate_db.py +04:50 So, enter a name. +04:52 Let's just give us some white space there. +04:55 Now, the name is going to be Bob. +04:58 What's Bob's address? +05:00 Somewhere over the rainbow. +05:05 Isn't that lovely? +05:06 And a phone number. +05:09 Let's go backwards. +05:13 Alright, that's Bob's phone number. +05:14 Data inserted to database. +05:16 Hit q to quit. +05:18 Ooh, there we go. +05:20 We go back to the start. +05:21 So let's enter name, Mike. +05:24 Where does Mike live? +05:25 The US of A. +05:30 And his phone number? +05:32 As per every US phone number I see on TV 555, +05:37 something else, let's go with 3226. +05:41 Data inserted to database. +05:44 Alright. +05:46 We'll hit q to quit and we get out of the script. +05:49 Done. +05:50 Alright, and it's safely closed and everything +05:52 because the SQLite connection was wrapped +05:54 in that with statement. +05:58 Refresh our database table +06:00 and there we have the new data. +06:03 So you can take something like this script, +06:06 put it into some sort of automation, +06:09 and then you'll be able to add people, +06:12 or users, or whatever to your database. +06:15 Imagine this in a Flask script. +06:17 Pretty cool. +06:18 Alright well, enjoy that and. diff --git a/transcripts/79-sqlite3/8.txt b/transcripts/79-sqlite3/8.txt new file mode 100755 index 00000000..c563cfa9 --- /dev/null +++ b/transcripts/79-sqlite3/8.txt @@ -0,0 +1,45 @@ +00:00 All right, now that we have our lovely table +00:02 with Mike, Bob, and myself in it, +00:04 and our very realistic addresses, +00:08 let's actually print some of that data out. +00:11 So we're going to do that within the Python shell. +00:13 Again, import sqlite3, getting tedious by now. +00:18 So, we will run our connection, +00:21 con equals sqlite3.connect. +00:28 addressbook.db. +00:31 'Kay, c = con.cursor to get our cursor. +00:37 Now to print the actual data within the database, +00:40 we need to put this into a for loop, okay? +00:44 Just bear with me, because we're going to +00:45 iterate over these three rows, okay? +00:50 So, the way we do that, is we go for row in c.execute. +00:57 We're going to select data. +01:00 Now what data were we going to select? +01:02 We're going to select everything from our details table, +01:07 all right, so for row in c.execute. +01:09 Select all from details. +01:12 What next? +01:14 Well, once it's got the row, +01:17 we want to print the row. +01:19 And that's it. +01:22 And there are our three lines. +01:24 You've got these, the formatting's a bit off, +01:26 it's actually taking that data, +01:30 or the literal, the tuple for that, for that row, you know? +01:33 So it doesn't look that great. +01:36 So to actually make that look a little bit better, +01:39 let's just bring that back up to save me some time. +01:42 We can actually choose which column to view, +01:46 so we can go print row... +01:50 Zero. +01:54 Julian, Bob, Mike. +01:56 And once we have this sort of information, +01:59 you can start to pop a few strings together, +02:03 you know, start making sentences from these, +02:05 these sorts of database pulls. +02:08 So let's do one really quickly here. +02:13 And there we go. +02:14 So Julian lives at 123 Fake Street, blah blah blah, +02:16 and his phone number X, okay? +02:19 And that's the sort of manipulation we can do +02:21 by pulling the data out of the database. diff --git a/transcripts/79-sqlite3/9.txt b/transcripts/79-sqlite3/9.txt new file mode 100755 index 00000000..7e8a819a --- /dev/null +++ b/transcripts/79-sqlite3/9.txt @@ -0,0 +1,75 @@ +00:00 Okay, done and done. +00:02 Let's look over everything we've covered +00:04 in the past couple of days +00:05 before you move onto the third day. +00:08 So the first thing you had to do +00:10 was install the SQLite browser, +00:13 and this little application +00:15 just lets you load up your database files +00:17 so you could see everything that was stored in your database +00:21 in a nice GUI environment. +00:25 Now then, the next thing we did was we created +00:27 a simple database, so I've outlined, I've highlighted +00:30 the important things you need to keep in mind here. +00:33 So first thing, you begin +00:35 by importing sqlite3 as you'd expect. +00:38 Then we connected to the database +00:41 using the sqlite3.connect, okay? +00:44 And if the database that you specify +00:49 between the brackets doesn't exist, +00:51 it creates the database for you, +00:54 very important to remember. +00:56 So if you make a typo there, it's going to create +00:58 a new database rather than connect to the existing one. +01:03 Alright, then we actually take the cursor +01:06 that allows you to talk to your database. +01:08 So you've connected to it. +01:09 Now you have to be able to type into it, +01:11 and you use a cursor for that, +01:13 and you assign that to the variable c, which just makes it +01:17 a bit easier to type further on within your application. +01:21 Alright, then we execute the SQL commands, +01:24 and this is true for any SQL command that you want to run, +01:28 not just to create one. +01:30 In this specific instance, we created a table +01:33 with two text columns +01:37 and one integer column, alright? +01:41 And then we always close the connection when we're done. +01:45 Very important to remember to close it, +01:47 'cause if you don't, then the database may still be in use +01:50 and may prevent other connections +01:52 and potentially cause corruption, +01:56 so we'll always close it when we're done. +01:59 Next one, we wanted to add data to the database. +02:03 So again we connected to the database +02:06 using the connect command, +02:08 and we loaded the cursor into the c variable. +02:13 Alright, and more SQL syntax. +02:16 This time we're inserting the data into the database +02:20 and we were inserting a couple of values there. +02:22 We were doing two text values. +02:24 That was the name and the address columns, +02:27 and then the integer column of the phone number. +02:32 And then we can close the connection. +02:34 Now the more Pythonic way to do this +02:37 is to use a with statement, okay? +02:40 And this will allow you to run +02:43 your cursor and your execute commands, +02:46 but then it will actually close it by itself. +02:50 It'll close it for you, it'll auto-close +02:52 once the commands have finished running, +02:55 once the with statement has completed, okay? +02:58 So in this instance, it inserts the contents of the list +03:04 using the wildcards of the three question marks, +03:07 and you saw that in our slightly automated script for this. +03:12 And that's it, so now it's your turn for Day 3. +03:16 Go ahead and implement your own database. +03:18 Try to come up with something interesting, +03:20 and see what other abilities you can try and run. +03:24 So for example, maybe try editing the data +03:28 inside the database, so we inserted and we selected +03:31 the data, but now maybe try +03:33 and actually edit the data. +03:36 I think that's a great challenge for you. +03:38 So enjoy, that's SQLite databases, +03:41 and keep calm and code in Python. diff --git a/transcripts/82-dataviz/1.txt b/transcripts/82-dataviz/1.txt new file mode 100755 index 00000000..d5eaac85 --- /dev/null +++ b/transcripts/82-dataviz/1.txt @@ -0,0 +1,21 @@ +00:00 Welcome back to the 100 Days of Python, +00:02 Day 82, data visualization with Plotly. +00:06 Coming three days, I will be your guide +00:08 teaching you how you can make beautiful plots +00:11 in Python using this library. +00:13 We're going to take some data from our PyBites blog +00:16 and I will show you how to first get that data +00:19 in the right shape so it's easy to +00:22 just hand it off to Plotly and make some cool graphs +00:25 that show some insights about what the blog is about, +00:29 and hopefully that will inspire you +00:32 to then roll your own, be it with Plotly, +00:35 or another awesome library, which I will mention, +00:37 which is Bokeh, and yes, this will be a lot of fun. +00:41 It's one of my favorite topics, +00:42 and having data visualization skills goes a long way. +00:46 I mean, there's a lot of data out there, +00:48 even more now with big data, +00:50 but if you can show it in a nice way, +00:52 it's way more powerful. +00:54 So, let's dive straight in and learn some new skills. diff --git a/transcripts/82-dataviz/10.txt b/transcripts/82-dataviz/10.txt new file mode 100755 index 00000000..89157d6f --- /dev/null +++ b/transcripts/82-dataviz/10.txt @@ -0,0 +1,20 @@ +00:00 Welcome back to the third and final day +00:02 of data visualization. +00:03 I hope you are making great progress. +00:06 And let me just share you one more pointer. +00:09 Randy Olson sends out very cool Tweets +00:13 about data visualization. +00:14 And here's his Twitter account. +00:17 And it's chuck-full of awesome visualizations. +00:24 So that's probably somebody, +00:26 if you like data visualization, who you want to follow. +00:29 And you can also look at the data +00:31 of his hashtag on Twitter. +00:40 Look at that, carots , very cool. +00:43 Right, so, apart from that, keep on coding. +00:46 Keep on using these cool libraries +00:48 that I've shown you in this lesson. +00:50 And don't forget to share your work. +00:52 You can use the hashtag #100DaysOfCode +00:55 and feel free to mention TalkPython and PyBites +00:58 in your Tweets. Good luck and have fun. diff --git a/transcripts/82-dataviz/2.txt b/transcripts/82-dataviz/2.txt new file mode 100755 index 00000000..fefd9f30 --- /dev/null +++ b/transcripts/82-dataviz/2.txt @@ -0,0 +1,47 @@ +00:00 As usual, I have a Jupyter notebook +00:03 prepared for this lesson and first, +00:05 let's actually head over to the terminal +00:08 to install the external modules we're going to use. +00:13 I'm going to create a directory. +00:16 cd into it. I was explaining before I use +00:20 a virtual venv with my Python path +00:23 set to my Anaconda installation. +00:25 I'm using Anaconda because it comes +00:27 with all the data science libraries +00:28 and Jupyter notebook and all that. +00:30 If you're not using Anaconda, you can make +00:33 a virtual environment just by using the standard +00:36 module in Python, like this but I'm using this +00:40 to make it all work with my environment. +00:45 Right. Then I need to enable it. +00:47 I have an as for that as well +00:48 because I'm using virtual environments for anything +00:51 because I always want to isolate my dependencies. +00:54 So, now I'm in the virtual environment +00:57 and you see a nice indication in my prompt. +01:02 As expected there's nothing installed +01:04 and it's exactly what we want because we want +01:05 to have all of our stuff in this namespace. +01:09 I'm going to pip install feedparser +01:12 serve to parse our blog feed +01:14 and plotly to do the graphical work. +01:21 That's all now in our virtual environment, +01:23 so, we can get started. +01:26 So, I'm heading back to my notebook +01:27 and let's import the modules we're going to use. +01:34 Right, by the way, one thing I have +01:36 the virtual environment here enabled +01:38 that's probably not what happens by default for you. +01:42 So, what I did to get the virtual environment +01:46 inside my notebook, was to pip install ipykernel +01:48 so then you run this self install script +01:53 and the name should be your virtual environment. +01:55 So, in my case, that's venv and after we started +01:59 the notebook then I have an option here +02:01 to select my virtual environment. +02:03 So, I put the link here in notebook +02:05 if you want to work from a similar set up +02:07 as I have, you should go through this link. +02:10 That's it for set up, in the next video, +02:12 we're going to use feeds bars +02:14 to pull data from our PyBites blog. diff --git a/transcripts/82-dataviz/3.txt b/transcripts/82-dataviz/3.txt new file mode 100755 index 00000000..fe30da85 --- /dev/null +++ b/transcripts/82-dataviz/3.txt @@ -0,0 +1,132 @@ +00:01 Let's use feedparser to get the +00:03 RSS feed of our blog. +00:04 And I'm not going to do the live feed +00:07 because I want you to see the same results +00:10 if you go through this exercise. +00:12 So, I'm going to paste in the actual copy I made. +00:15 That said, if you do want the live data, +00:18 then just go to our blog, pybit.es, or PyBites. +00:22 Go to 'view page source' and search for RSS, +00:27 and we have two feeds: all.atom and all.rss. +00:30 I'm using the latter. +00:31 The nice thing about feedparser is that +00:34 you can just call ".parse" and it does a lot +00:37 of stuff behind it. +00:38 Let's see what it does. +00:39 Okay, so entries. +00:41 Blog feed, my variable. +00:43 And let's look at what "entries" has. +00:45 And it gives me a lot, +00:47 so let's look at the first one. +00:51 Actually, if you want to pretty-print this, just do from +00:57 pprint import pprint, +00:59 and I usually give it an alias. +01:03 And now it's spaced out a bit better. +01:05 Look at that, what feedparser did +01:06 behind the scene. +01:07 It took that RSS feed and put it in +01:09 a comprehensible data structure. +01:12 Although this is a nice format, +01:14 there is still some work to do. +01:15 For example, the publish date is a string. +01:18 But we also have publish parse, +01:20 but it's at a time, a struc time. +01:22 Now, the most convenient way to work with dates +01:25 is to use datetime. +01:27 So, let's write a helper to convert to a datetime. +01:31 And I call it just that. +01:32 It takes a date string. +01:34 A date string here has some time zone stuff, +01:37 plus zero one. +01:40 So, the first thing is to strip that off. +01:45 Just put it here so we can see it while I'm writing this. +01:52 Date string. +01:54 I can split it on plus and take the first element. +02:00 We can see this live. +02:09 And you cannot see this, but there's still +02:11 a pending space here, so it's best to always +02:15 strip spaces that are not really needed. +02:19 So, you can see here that it disappeared. +02:21 And then, we do a datetime conversion. +02:24 And we can do that by strptime. +02:28 It takes a string, and the only tricky thing is that +02:31 you have to give it the format of the date string. +02:35 This case, it's a week day, a day, +02:37 a string month, so like a three-char. month, +02:40 Jan., Feb., March, +02:42 four digits here, uppercase Y, +02:45 hour, minute, seconds, +02:47 and let's see what they'll give me. +02:48 Okay, the nice thing about a datetime +02:50 is that it actually prints us a string. +02:52 So it's a bit tricky. +02:53 And if I look at what the datetime actually is, +02:57 it's the datetime. +02:58 And that's cool because datetime makes it then +03:00 very easy to work with dates. +03:02 For example, let's just return this. +03:06 So, I'm getting a datetime back. +03:07 What's cool about this is you can now +03:09 do calculations with datetimes. +03:13 So, let's make sure that +03:14 timedelta also here. +03:16 What if I want to... +03:18 So, this is the seventh of January. +03:20 But if I want to add like three days, right, +03:23 I could do datetime + timedelta(days=3) +03:29 And look at that. +03:30 I just added three days. +03:32 I mean, you don't even want to imagine +03:34 doing that on strings, right? +03:36 It's just not done, and... no. +03:39 It's totally no way to go. +03:41 So, when you're working with dates, +03:43 have it in a datetime format. +03:44 Have it in a standardized way that you can +03:47 easily do calculations with it. +03:49 And, actually, for this exercise +03:51 I just want to have the datetime.year. +03:53 That's another advantage you see here. +03:56 Ones I have the datetime, I can just pull out +03:58 different elements from that, right? +04:00 So here, I want the year and the month, +04:02 and I can just access that attribute wise. +04:05 So, now I just get a string. +04:08 We will use this later to plot the data. +04:11 The second helper I need is a get category. +04:14 Takes a link. +04:18 So, it takes a link, and it extracts the category +04:20 out of that. +04:21 And we have these known categories, +04:23 code challenge, new, special, and guest. +04:26 So, that's the dictionary. +04:28 The default. should be an article. +04:33 And here I use a bit of regular expressions +04:36 to pull the category out of the link. +04:39 A raw string, any characters. +04:42 A literal .es/ +04:48 one or more lower-case letters. +04:51 + says one or more, and anything after that. +04:55 Now the parentheses will capture this +04:58 one or more letters into a match, +05:00 and I can access that in the second argument +05:03 by the \1. +05:06 And I'm doing that on link. +05:09 And then, I can just do a nice get on the dictionary, +05:14 which will look for that category. +05:18 So it matches code challenge Twitter, +05:20 special or guest, +05:21 if it finds it's cool. +05:23 If not, get will return None. +05:25 And it then goes to the or, +05:27 which returns default. +05:29 So this will always return something relevant, right? +05:31 Or, I find the key in the dictionary. +05:34 If not, I will return default. +05:37 And that's it. +05:38 That's the pre-work we are going to do +05:41 to important helpers. +05:42 Next up, we will go through the feed data, +05:46 putting it into some useful data structures. +05:49 And with that second part of the preparation done, +05:51 the plotting should be easy. diff --git a/transcripts/82-dataviz/4.txt b/transcripts/82-dataviz/4.txt new file mode 100755 index 00000000..5821fe1d --- /dev/null +++ b/transcripts/82-dataviz/4.txt @@ -0,0 +1,92 @@ +00:00 So that was some prework, but I have not spoke about +00:03 yet is what are we going to plot. +00:05 And there are three graphs I want to make. +00:08 First, I want to make a bar chart of our +00:10 posting activity, what months did we put more content out, +00:13 and what months less. +00:15 Secondly, I want a pie chart of breakdown of our categories, +00:19 so each blog post has one category associated, +00:22 and that will show us what we blog about most. +00:26 Similarly, that also is true for tags, +00:29 tags give an indication what we blog about. +00:31 But we use more tags than categories. +00:34 One blog post can be a ten tags, +00:37 so it's a bit more granular. +00:38 So it still will be another angle, +00:41 or another inside into our data. +00:43 Next up, there are three exercises to get the data +00:47 into a format that I can easily make those three graphs. +00:52 So first of all, I want to have the published entries. +00:56 So I'm going to use Counter, +00:58 to count all the entries by year, month. +01:01 And here's where the helper comes in, +01:03 because we're going to use a list comprehension, +01:07 we've dealt with in, I believe Day 16, +01:10 and we can say pub dates, +01:14 and make a list comprehension. +01:17 And, I can just say for entry in entries, +01:22 and entries is our complete RSS feed broken down +01:26 into nice entries by feedparser. +01:29 And we saw an entry here, laid out. +01:31 So I'm going to look over these entries +01:33 and for every entry, here's the helper, +01:36 I'm going to convert to datetime, +01:39 entry, and I'll take the published fields +01:42 and what's funny, I'm actually going to +01:43 prepare to those two, using the dictionary way. +01:46 But I should actually be able to do a dot notation +01:50 which is much nicer. +01:52 I put that into convert to datetime, +01:54 and convert to datetime, it's actually not +01:57 100 percent accurate. +01:59 It's more like, I mean that was the initial intent, +02:02 but let's actually call +02:04 it date, year, month. +02:10 Because that's actually what it's returning, right? +02:12 So we should make our functions descriptive. +02:16 And, yeah let's give the first five to see if +02:20 I'm going in the right direction. +02:22 And I am. +02:23 And the nice thing about Counter as we've seen in day four +02:28 in the collections module lesson, +02:30 is that I can give it a list of items, +02:33 and it just does a count. +02:34 So if I want to have posts by month, +02:38 so counter can just get this pub dates list, +02:42 and look what happens. +02:44 Wow. Boom. +02:45 I mean I didn't have to keep track of, +02:47 well we saw that in the previous lesson right, +02:49 they can hide it in a manual loophole +02:51 for all the items, keep in account and etc. +02:54 But this is all done, understand the library. +02:57 Secondly, we need to break down the categories. +03:00 So, similar as list comprehension, we're +03:04 going to look over the entries. +03:05 But instead of getting your month, +03:08 I'm going to use the other helper we defined +03:09 and just get category. +03:11 And I'm going to do that on the link. +03:13 And those are not pub dates, those are categories. +03:17 Again, counter is your best friend. +03:26 Tags is almost the same, so I'm going to just copy it over. +03:30 Tags, that is actually a bit more complex. +03:32 Let me go from start, so for entry and entries, +03:36 and here I have an exceptional case +03:38 for a nested for list comprehension. +03:42 For each entry, loop through the tag. +03:46 And each tie has a term, let's lower case +03:49 that to not have to deal with upper and lower case. +03:52 So for each entry, because one entry has a list of tags, +03:56 I'm looping through this list of tags, +03:58 and I'm taking out the term. +04:00 That's what I'm basically doing. +04:01 I lower case that tag, so we have all the tags, +04:04 for all the entries. +04:05 And again, I can use a counter to get that all counted up. +04:09 Let's give most common a limitation of 20, +04:13 and let's print the first five. +04:17 And obviously five then is at the top. +04:19 Right, that was a lot of preparation but the good news, +04:23 is that the data is now in a structure that +04:25 we can easily make plots. diff --git a/transcripts/82-dataviz/5.txt b/transcripts/82-dataviz/5.txt new file mode 100755 index 00000000..9abcf8ba --- /dev/null +++ b/transcripts/82-dataviz/5.txt @@ -0,0 +1,54 @@ +00:00 There's still one extra step to take. +00:03 As you see the data now, +00:04 it's in dictionaries or list of tuples. +00:08 And usually for a graph, +00:10 you want to have two dimensions, right? +00:12 You want to have an X and a Y axis. +00:14 So it's better to have two lists. +00:16 One is the keys, +00:17 and one is the values. +00:18 When I was preparing this notebook, +00:20 I saw a great tip from Raymond Hettinger to use the zip, +00:24 with star arguments, +00:25 transposing to the data. +00:27 So this is exactly the kind of data we have. +00:29 We have a list of tuples. +00:32 And here, he's using a zip with a star +00:35 on that data structure. +00:37 And he gets to transpose the data. +00:39 And I'm going to use that too. +00:41 Make our list of tuples, +00:42 in an axis of keys, +00:44 and a Y axis of values. +00:46 So let's write a transpose +00:50 list of tuples, +00:53 and takes data. +00:56 And it's a little bit of type checking I had to do. +00:59 Because data can come in as a list of tuples. +01:02 But it can also be a date. +01:03 So, if it's date, +01:04 then I make us as list of tuples. +01:07 I'm just making sure that all the data +01:08 we're going to transpose is of the same structure. +01:11 So dictionary should be a list of tuples. +01:15 And then I'm going to use Hettinger's trick +01:17 to do transposed, list, +01:20 zip, *data. +01:27 And I'm going to return the new data. +01:30 Let's see this connection. +01:39 How cool. So here we got the X axis, +01:42 and here got the Y axis. +01:44 And this is kind of format you want, +01:46 to make it easy to plot. +01:48 Before going in to plot, one final thing, +01:51 and you want probably read up the beginner documentation, +01:55 plotly can be used in offline and online mode. +01:59 And for this tutorial, +02:00 we are going to use it in offline mode. +02:03 And there's a special switch +02:04 to use this in my notebook. +02:06 I can set that all with one line of code. +02:09 So I do plotly offline init. +02:12 Notebook mode, connected equals true. +02:18 And with that done, +02:19 we can start plotting in the next video. diff --git a/transcripts/82-dataviz/6.txt b/transcripts/82-dataviz/6.txt new file mode 100755 index 00000000..28607178 --- /dev/null +++ b/transcripts/82-dataviz/6.txt @@ -0,0 +1,50 @@ +00:00 There is some prework necessary to +00:02 get to plotting, but we can now do it. +00:04 Let's start by transposing the +00:06 post by month in X and Y axis. +00:09 Then it becomes pretty easy. +00:13 You can just type data +00:17 equals a list, +00:19 bar, taking, X equals X, +00:22 Y equals Y. +00:28 You can then say plotly offline, +00:32 you have to specify the mode, iplot, +00:36 data, and you can give it a file name. +00:42 Look at that. +00:44 Even has numbers if you hover over the months. +00:48 It also posted when I was preparing to a URL +00:53 so you can access those here. +00:55 That's a nice feature of plotly that +00:57 you can make your work easily accessible. +01:01 Let's move on to the breakdown of the blog categories. +01:04 The code is very similar actually. +01:07 I'm going to use my transpose helper. +01:09 X and Y now make a bit better naming labels and values. +01:14 Again I use the go object but this time I calls with pie +01:20 and I give it labels equals labels and values equals values. +01:25 Then we call plotly again, offline mode, iplot, +01:33 put the pie object in the list and give it a file name. +01:42 Look at that. +01:44 Challenges is our big thing, you probably know by now +01:48 but we do as many articles, relatively. +01:52 We have news and some special and guests. +01:57 Thirdly, the comment tags, similar code +02:01 and to transpose list of tuples, +02:04 and here I have to take the top tags as we find before. +02:13 Tags equals go, again I do a pie chart +02:17 and I could be using other types of graph +02:21 but I find a pie chart being adequate for this type of data. +02:26 I also want to keep it simple. +02:27 So, in the coming days you can +02:29 explore the library further yourself. +02:32 Similarly, has to have labels and values defined. +02:37 Plotly, offline, iplot, and it's important +02:42 to put this in a list, filename, +02:45 just going to say tags for now. +02:51 Cool, right? +02:52 Python learning Twitter Code Challenges. +02:56 Of course similar to the categories +02:58 but here you see also, when we get to a bit +03:01 more granular level you get into Flask and Django. +03:04 It's true that we write quite a bit about those. +03:07 There's even some machine learning, etc. diff --git a/transcripts/82-dataviz/7.txt b/transcripts/82-dataviz/7.txt new file mode 100755 index 00000000..b55f1be8 --- /dev/null +++ b/transcripts/82-dataviz/7.txt @@ -0,0 +1,34 @@ +00:01 And, a quick video on some extra pointers +00:04 Plotly is cool but there are others. +00:07 Matplotlib probably the best known. +00:09 You can do awesome stuff with that as well +00:12 and we have a notebook here integrated on our blog +00:15 as showing some more examples. +00:23 We like Bokeh, and we even had a code challenge +00:27 and there were some submissions +00:30 historical exchange rates for BitCoin +00:32 using Bokeh, integrated in Flask. +00:35 By the way that was the challenge, +00:36 to integrate it into Flask. +00:38 Weather data, look at how nice that looks. +00:42 Life expectancies in countries, very cool. +00:45 Versus Australia, so that's Bokeh. +00:48 And actually the Bokeh side is very well, +00:51 I mean look at this, this is awesome, simple +00:54 text is up high. +00:56 Look at these visualizations that's amazing. +00:59 Bokeh has really great documentation +01:02 and user guide so definitely check it out. +01:05 Then we have Seaborn as well, and we had +01:07 a guest post here looking at Marvel data +01:10 which was a code challenge we did +01:12 and this uses Panda in combination with Seaborn +01:16 and again this is a very nice library. +01:20 Look at these visualizations, very nice. +01:25 And one other example, this was one I did. +01:28 Analyzing Brexit data with pandas uses matplotlib +01:32 it integrates very nicely with pandas +01:34 so it's a very powerful combination. +01:38 One cool thing is scatter plots on demographics. +01:47 And that hopefully gives you some extra inspiration +01:50 to start using data visualizations yourself. diff --git a/transcripts/82-dataviz/8.txt b/transcripts/82-dataviz/8.txt new file mode 100755 index 00000000..f816456b --- /dev/null +++ b/transcripts/82-dataviz/8.txt @@ -0,0 +1,74 @@ +00:00 Let's review what we've learned so far. +00:03 Adding the RSS data, you really want +00:05 to use feedparser to get the RSS data. +00:08 We pip install that as well as Plotly +00:10 to do the data visualization. +00:14 Then we imported the modules +00:16 and I used feedparser to parse the RSS feed. +00:19 Which you can see one line of code +00:21 and it wraps this in a nice data structure. +00:23 Which you can even access with a dot notation. +00:27 Then we prepare to data. +00:30 We wrote two helpers. +00:32 One to convert the date string into datetime object. +00:36 I made a little detour explaining a bit +00:38 why you would want to use datetime +00:40 when you want to calculate the dates. +00:43 But in this example, it was merely to extract year and month +00:45 to have a consistent value for our graphs. +00:49 Then we extracted the categories from the blog links +00:52 making them another helper. +00:54 Using a regular expression to extract the category. +00:56 If it's in the dictionary, +00:58 we return it, otherwise return to default set to article. +01:02 Next we converted the data so far to usable structures. +01:06 All the graphs have counting in common +01:08 and that's where counter is your best friend. +01:12 You can see we generated a big list +01:15 of all the publication dates +01:16 and we can just put them into counter +01:18 which makes this nice, frequency counter. +01:22 We prepare all three graphs. +01:24 This was the first one. +01:27 The second one were the categories +01:29 and the third one were the tags. +01:31 You can already see that this starts to +01:34 paint a picture of what our PyBites blog is about. +01:37 The final trick we needed was transposing the data, +01:41 making X and Y axis. +01:43 I used a nice trick from Raymond Hettinger to +01:47 use*data in combination with zip to make +01:51 a date-like object or a list of tuples. +01:53 Transposing the data to X and Y axis' +01:56 which made it way more easy to plot. +02:02 Then I extenuate Plotly object, +02:05 giving it the offline mode +02:06 and calling the innate notebook mode method +02:10 to make it work inside my Jupiter notebook. +02:13 Then the three plots. +02:14 Post for months frequency with all the prep +02:17 data done, a small amount of code with a nice graph. +02:20 Here you see the activity per month +02:22 and number of entries in the blog. +02:24 Secondly, the common blog categories. +02:27 We went and made a pie chart, which makes a nice visualization +02:30 what kind of categories our blog posts are. +02:33 You can see that challenging articles +02:34 trumped the other categories. +02:36 For common blog tags, it's kind of similar as categories +02:40 but it's a bit more granular. +02:42 There you can also see that we blogged quite a bit about +02:45 Flask and Django, github code automations, +02:49 but this is a way nicer way to +02:50 demonstrate it in any presentation. +02:53 Check out other libraries, Bokeh, +02:57 this is from Panda's in combination with Matplotlib, +03:00 a very powerful combination. +03:03 This is a print screen from the Seaborn library. +03:09 As mentioned before, Matplotlib is +03:11 also a very robust library +03:13 and there might be many others +03:15 but mostly I use Panda's and some Bokeh. +03:17 I decided to use Plotly for this lesson +03:20 as it's simple to use and has nice graphs. +03:23 Now it's your turn, keep calm and code in Python. diff --git a/transcripts/82-dataviz/9.txt b/transcripts/82-dataviz/9.txt new file mode 100755 index 00000000..9eb31592 --- /dev/null +++ b/transcripts/82-dataviz/9.txt @@ -0,0 +1,39 @@ +00:00 Welcome back to the second day +00:01 of the data visualization lesson +00:04 and after the first day of theory and practical examples, +00:08 it's now time to roll your own and now it's going +00:11 to be fun be because you will be experimenting +00:14 with data and give it a nice representation. +00:18 If we head over to our code challenges platform, +00:21 there are a few challenges I have in mind +00:24 that will fit this purpose. +00:26 We have a few data challenges and we're going +00:29 to show you Marvel and PyBites first here in data. +00:34 Here are some data sets you can use in these challenges. +00:39 And for example for the Marvel data, +00:41 I came up with this quick graph +00:43 of comic book characters introduced every year. +00:46 And I used Bokeh for this and that's just one example +00:49 of a graph you can make of that data. +00:52 We did a code challenge about analyzing our data +00:56 and you're free to choose if that's Twitter data +00:59 or Github or anything PyBites related +01:03 and then make a data visualization of that data. +01:08 Another challenge is Bokeh integrating its chart into Flask. +01:12 I think that's a cool challenge +01:14 because not only do you have to make the data visualization +01:18 but also you have to integrate it into a web app +01:20 which makes it much easier to share it out. +01:22 Here are some data sets you can use. +01:27 For the rest, you're just free to make a nice visualization +01:31 and don't forget to pull request your work. +01:34 So if you want to follow along +01:35 with the code challenge platform, you can fork and +01:38 clone our repo and make a branch and +01:40 all the instructions are in here. +01:41 When you're done you can open +01:43 up a pull request via our platform. +01:45 So that's that for challenges. +01:47 Now get your hands dirty and tomorrow I will check in again +01:51 with you to give you some more pointers +01:54 and see how it's going. diff --git a/transcripts/85-anvil/1.txt b/transcripts/85-anvil/1.txt new file mode 100755 index 00000000..e7dd6a5e --- /dev/null +++ b/transcripts/85-anvil/1.txt @@ -0,0 +1,18 @@ +00:00 Hello and welcome to Day 85, Michael here again. +00:02 We're going to build a really cool interactive web application. +00:06 And we're going to do it the easy way. +00:08 You've already seen Flask, +00:09 and Flask is super powerful, and super flexible. +00:12 In fact, we're going to come back to Flask again, +00:15 maybe one or two more times in this course still, +00:18 but I want to show you an alternative way to build web apps, +00:21 and especially if you think to yourself, +00:23 I'm not a web developer, I'm not super good with CSS, +00:26 I'm not great with html, layout doesn't work for me, +00:29 I can't put together the web pieces, +00:32 these tables are crazy, I'm not great with databases. +00:35 All of these things? +00:36 I'm going to show you a way to build +00:38 quite a wide spectrum of apps +00:40 in a super easy and accessible way +00:42 that you can be up and running, literally in a day or two. diff --git a/transcripts/85-anvil/10.txt b/transcripts/85-anvil/10.txt new file mode 100755 index 00000000..f298c57f --- /dev/null +++ b/transcripts/85-anvil/10.txt @@ -0,0 +1,48 @@ +00:00 Alright, our next goal is going to work on, +00:02 to be working on this add_doc_form here. +00:06 So what we want to do is we want to be able to drop in +00:09 some pieces, so we're going to come over +00:11 and add a little sublabel, and this is going to control, +00:15 this is going to basically be the label in our form. +00:17 We don't really program against it, +00:18 so we don't need to set the name, +00:20 but this'll be document name. +00:23 And let's make it a little more standout, make it bold. +00:26 Okay. +00:27 And then, we're going to have a text area where they can type. +00:30 Notice I can drop it in these different locations. +00:32 I'll drop it right here. +00:35 We can tighten that up by dragging that bit over. +00:41 Now this one, let's give this a name, +00:43 such as, like, textbox_doc_name. +00:47 And let's give it a placeholder +00:52 document_name like that. +00:54 I'll do exactly the same thing for the rest of the elements. +01:03 Okay, so I've done a little draggy droppy magic, +01:05 and gotten this far. +01:08 We have a document name, we have a category, +01:10 and this is going to be a dropdown, we'll fill that up. +01:12 This is going to be a text area, and we should +01:14 go ahead and give this a placeholder +01:17 so people see and document this little placeholder, +01:21 which'll only be there until they type text, +01:23 and we have this button, create document. +01:25 Let's do a little more work on this. +01:26 We want this to align to the right over here. +01:31 We want an icon. +01:33 Little plus sign, and let's change the color here. +01:40 Go with this blue, which I just grabbed +01:42 off somewhere on my screen, and let's make this, +01:44 you can type hex here if you want. +01:46 Three F's for white. +01:47 Okay, so there's our create document. +01:49 Let's go ahead and run this, see how it works. +01:51 Again, we can click around. +01:53 And now we can add a new document. +01:55 It says document name, the name, +01:57 look how cool that is, it's got nice little bootstrap forms, +01:59 nothing in our dropdown yet, contents here. +02:02 Nothing happens when we click, +02:03 but that's going to be what we do next, +02:05 is we're going to make this interactive +02:07 and do a little validation. diff --git a/transcripts/85-anvil/11.txt b/transcripts/85-anvil/11.txt new file mode 100755 index 00000000..8731ded3 --- /dev/null +++ b/transcripts/85-anvil/11.txt @@ -0,0 +1,116 @@ +00:00 We have our ad new document form here, +00:03 and it's working pretty well in terms of UI, +00:05 but it has no responsiveness, nothing happens right? +00:08 So let's go to the code side and add that. +00:11 First thing that we want to do is we want to +00:12 populate this combo box here. +00:15 Now you can go type in the items, +00:17 if this was like a set of things you knew, +00:19 like what color of items you want? +00:21 we only have three colors, type it in here. +00:23 Or what month of the year? +00:25 that doesn't change just type it here. +00:27 But, when we're working with things +00:30 that are going to change, +00:31 like categories out of our database, +00:33 we want to do that in code. +00:35 So, let's write some categories. +00:38 Now, for just until we get to the database part, +00:40 I'm going to just type them out here. +00:44 Let's suppose we have four categories that +00:46 we're ultimately going to store in the database +00:48 that can change and grow. +00:50 Then we'd able to do things like go to the database +00:52 and say show me all the documents that have science, +00:55 that are tagged with science or something to that effect. +00:58 So we'll go over here, and we'll go to self.dropdown.items +01:03 I want to set that to two things. +01:05 What we need to do is give it a tuple, +01:07 for everything in the categories, +01:08 we want to give it a thing to show, and then the actual value. +01:12 So I actually want to have two things, +01:14 I want it to start out selected with just nothing. +01:17 So let's say something like this. +01:24 So, this is what's going to appear, +01:25 the words select the category with the value of None, +01:28 so we can test that they're selected nothing. +01:30 And in here, we're going to create a c, c +01:34 maybe we'd use ID or something, +01:36 for now we're just going to use this. +01:37 For c categories, I'll test that. +01:42 Select a category, oh yeah that's sweet. +01:45 Okay, so this is good. +01:48 Now the next interesting thing really has to do +01:50 when we click on this button. +01:52 I'm going to click on button six, +01:53 so if I just double click right here, +01:55 it's going to add that code. +01:57 Let's tighten that up a little. +01:58 It's going to call this function. +02:00 So we either want to save the thing and maybe navigate away, +02:05 or if there's missing data, +02:07 like they haven't given it a name, +02:08 they can't save it right? +02:09 So let's do a little validation bit here. +02:14 Now let me just type this out +02:15 and then I'll talk you through it. +02:18 Alright, so we're going to do a quick validation. +02:19 And the way we get the values, out of say the text box, +02:22 is just the dot text properties. +02:24 And we're also going to strip that down, +02:26 make sure they didn't just put white space. +02:28 For the drop down, it's selected value right, +02:30 that's the second element right here. +02:33 Either the text of the category or nothing. +02:36 And if they haven't typed anything into this textarea, +02:39 a multiline text box, then we're going to say you +02:42 can't create empty documents. +02:43 So let's go over here, +02:47 we don't have to pass anything along, +02:49 because these are all part of this object here. +02:52 Now if there are errors, more than one, +02:53 we want to show them all. +02:54 So we'll say if errors, and then what do we do here? +02:59 Let's add a label where we can put an error, +03:02 maybe give it a nice color. +03:05 We can use a little divider here like this. +03:14 Here we go, made it a little bold, +03:15 put it in the center, give it a nice red color, +03:17 say this is an error. +03:19 Now when it runs, before there's errors, +03:21 we don't want that to show up right? +03:22 We don't see this is an error. +03:25 So let's go and have that removed. +03:26 Also, I put a divider, +03:27 but for the sake of size, let's do this. +03:30 So at the beginning, we're going to come over here +03:32 and just say +03:36 clear this out. +03:37 But if for some reason there is an error, +03:41 we want to set this. +03:42 And let's actually do a cool little trick here. +03:44 We'll say join +03:48 on the error. +03:49 So when they get a list of errors, +03:50 and then we're going to separate them with new lines, +03:52 which preserve themselves from when this ges to the web. +03:54 So let's try this, try our validation. +03:57 So if I just hit go, we should get three errors. +04:00 Bam, look at that. +04:01 Document name is required, +04:02 document category is required, +04:04 and cannot create empty documents. +04:05 Let's pick science. +04:07 Now just the name is required. +04:09 The name, now some details have to be provided. +04:16 Now that almost worked, didn't it? +04:18 Actually, there's no more errors, +04:20 we just need to call this at the beginning every time. +04:23 So let's go over here, +04:25 and zero that out every time we validate, +04:28 or we could maybe do it here, take your pick. +04:32 Or do it else, whatever. +04:33 I'll leave it like this. +04:38 Now once I fill this out, +04:40 boom, it's gone. +04:41 That would've created the document if we had implemented. diff --git a/transcripts/85-anvil/12.txt b/transcripts/85-anvil/12.txt new file mode 100755 index 00000000..c4a1ed91 --- /dev/null +++ b/transcripts/85-anvil/12.txt @@ -0,0 +1,63 @@ +00:00 Our add document form is taking us through the steps here, +00:03 it loads up looking nice. +00:04 We click the button and it validates +00:06 and then down here we'd have to write to do +00:10 create document +00:12 to do go to home or something to that affect. +00:16 Well let's talk about these, +00:17 go home is easy we'll figure that out in a minute. +00:20 Create document, that means we need a database +00:22 and we've talked about SQLAlchemy, +00:24 we've talked about SQLite and +00:27 all of those probably didn't feel super super easy. +00:30 So let's see how it is over here. +00:32 Alright this is probably that +00:33 full stack made easy thing I talked about. +00:36 So we go over here to services, +00:37 expand that out and go to data tables. +00:40 So create a datable service +00:43 and take it back out if we don't like it +00:45 and we're going to add a table. +00:47 Let's create a new table. +00:48 Let's call this categories, lower case. +00:51 And then you define a schema, +00:53 this is just going to have a text column called name +00:57 and it's just going to be text. +00:59 We could add another column like id and so on +01:03 but I think name is actually enough. +01:05 Let's go over here and have +01:06 another table called documents. +01:08 So these are, the documents that our +01:10 little document web app manages. +01:12 Let's give this also a name. +01:14 Give them a date time called created. +01:18 Let's give them a text column called content. +01:23 We could even add, like, a numerical thing for like views, +01:26 how many times they've been viewed or downloaded. +01:28 And now, do this last one that gets pretty interesting. +01:31 Go over here and add link to categories one or many rows. +01:36 How's that? +01:37 Call this category. +01:39 Isn't that awesome? +01:40 So this is your foreign key relationship back over there, +01:43 that's automatically taken care of for us. +01:45 So this is pretty much ready to go, +01:47 let's go and check this part out. +01:48 Let's just add a couple things +01:50 like science +01:53 science news press release documentation. +01:55 So there's a few items. +01:57 Now check this out here, permissions. +02:00 Do you want your server code to be able to get to them? +02:02 Which is pretty safe. +02:04 Or even your client side JavaScript +02:06 which your Python code becomes to get access to them. +02:09 This is not super safe. +02:12 People can mess with the JavaScript +02:13 in your browser when they view the page +02:15 and potentially, especially if this is edit, mess with it. +02:18 So we're going to say only this, only server modules. +02:22 Okay so server modules can talk to this +02:24 and we can talk to those server modules +02:26 that operate on our behalf. +02:28 We have no documents yet but we have our categories. diff --git a/transcripts/85-anvil/13.txt b/transcripts/85-anvil/13.txt new file mode 100755 index 00000000..e53323b6 --- /dev/null +++ b/transcripts/85-anvil/13.txt @@ -0,0 +1,110 @@ +00:00 We have our data and we know +00:01 we can get to it from the server modules, +00:03 but not the forms cause we want to make sure +00:05 that's safe. +00:06 How do we write a server module? +00:08 Let's go and add one. +00:10 So it's called server_module1. +00:12 Not a super name. +00:13 Let's give it something better. +00:14 Let's call it data_layer +00:17 or something like that. +00:18 Now check this out over here. +00:20 It says okay we are going to import +00:21 some server and data stuff. +00:22 And all you really have to do is just +00:24 create any function that is callable, +00:27 has parameters, and return something +00:29 and we can call it. +00:30 So for example to say hello, +00:32 how would we get to that? +00:33 Let's go to our home form really quick. +00:35 And let's just in this lib we'll say print. +00:38 anvil.server.call +00:42 Now look what just happened here. +00:44 It takes a string, the server name, +00:46 but Anvils integrated to know what server +00:49 methods are available and is helping us +00:51 right here. +00:52 So say, say hello. +00:54 And then I could put my name, +00:56 which if you look back here it accepts a name. +00:59 It should say, "Hello there." +01:00 So that'll be the input in return 42 +01:03 as it should. So let's run that. +01:08 See some output. +01:10 Server is yellow. +01:11 Client is clear or white. +01:13 It says, "Hello Michael 42." +01:15 How awesome is that? +01:16 Alright that is an incredibly simple +01:17 way to have a service. +01:19 Put that on there, done. +01:20 Then already host a service, +01:21 host a client, connects them, done. +01:23 So we don't want this. +01:24 We want code that talks to our database. +01:27 We put that here and I'll talk you through it. +01:30 So we're going to come over here +01:31 and we're going to talk to our +01:33 app tables and we say dot. +01:35 You see we have our 2 databases +01:37 that we created. Our 2 data tables and the data table service +01:40 we created, and we can go to them +01:43 and we can say, "Search" +01:44 and we can even do an order by. +01:45 And I'm going to convert that to a list +01:47 and then we'll turn it back. +01:48 Over here I'm going to do something +01:49 similar for categories. +01:51 And categories we're doing by name +01:52 so it's alphabetical. +01:54 Also can find individual documents by name. +01:56 Instead of doing a search, +01:57 you can do a get. +01:58 So here we're doing a where the name is +02:00 equal to what we pass. +02:02 So we're going to leave 4 categories. +02:03 Okay so these 4 functions are now +02:05 available to our code. +02:07 Let's try to add them into our add_doc_form. +02:10 So up here, we got our categories. +02:12 Let's go over here and say, "Categories", +02:15 call them all_categories. +02:18 We're going to go anvil.server.call +02:21 Now look. +02:22 All categories takes no parameters. +02:25 Now these are going to return rows +02:28 which are dictionaries which have things +02:29 and so what I really want is categories +02:32 is going to be c, it's going to be one of the rows. +02:35 And it's going to be named, +02:36 remember we had that in there, +02:38 for c in raw_cats. +02:41 So now we have Docs, Science, News, and Social, +02:44 but remember we put like press releases +02:46 and stuff. +02:47 Let's see what we get now. +02:49 Oh, whoops, +02:50 I got to take that out, don't I? +02:51 It's really cool how you can +02:52 click that to get back. +02:53 Alright that was just test run, +02:54 forgot about that. +02:56 Let's go to add a document, +02:59 and look at that. +03:00 That's now out of our database. +03:02 How slick is this? +03:03 Okay super, super cool. +03:05 One of the challenges there, +03:06 this is going to keep reloading it +03:07 if I do this, and do this. +03:09 Hitting the database again. +03:10 Turns out this is probably not going to +03:12 change that often, so we'll be able to do something slightly +03:14 better, but this is really really cool. +03:18 Add the name. +03:20 Add some stuff here. +03:21 Hit create. +03:22 And then we should be able to call one +03:24 more function on that server. diff --git a/transcripts/85-anvil/14.txt b/transcripts/85-anvil/14.txt new file mode 100755 index 00000000..0d0a1be7 --- /dev/null +++ b/transcripts/85-anvil/14.txt @@ -0,0 +1,68 @@ +00:00 All right, looks like our categories are working, so we can delete that bit. +00:03 Now, here we have the To-Do, Create a Document. +00:07 What we need to do because the security we put +00:09 on our document, our database, +00:11 we need to put over here. +00:13 Let's get rid of this output so we have more room... +00:16 ...to our data layer and add one more function, +00:18 and just for time's sake, I'll paste this in, +00:20 it's really simple. +00:21 So we're going to call Add a Document, and it's going to take +00:23 a Category Name, a Contents, and a Views. +00:26 We also have that created +00:28 which we're going to generate on the server, +00:30 and a little print of what we're going to do. +00:33 And then we'll come over here, +00:34 and we'll call Category by Name, +00:36 give it a category name +00:37 'cause when you have these linked tables, +00:39 you can't just put a value +00:41 that would determine their relationship, +00:43 you actually have to put the row, +00:44 so we're going to get the row back, +00:46 and then set the relationship this way. +00:49 And we have... +00:51 Make sure we have this right here... +00:52 Name, Created, Content, Views, and Category. +00:56 So this needs to be Name, +00:58 Content, Views, +00:59 Created, and Category. +01:00 It looks good. +01:01 So we're just going to go and create this. +01:02 Now, all we have to do is call this Add Doc here. +01:12 There it is. +01:15 And what does it take? +01:16 It's going to take- +01:17 Look at that, it's pretty awesome to show this- +01:18 it takes the document name, +01:21 Name, Category, +01:23 Contents, and Views, +01:25 and let's just put zero for views when we create it. +01:30 So Name, +01:36 something like that, +01:44 So this selected value here, +01:47 that's just going to be the name, +01:49 and that's what we'll use in our look-up on the server site, +01:51 and the Content. +01:58 Something as well. +01:59 All right, so that should do it. +02:01 Let's see if this works. +02:09 So this is going to be some documentation. +02:12 All right, let's see if this works. +02:13 Create Document, +02:15 ha-ha, datetime and Data Layer. +02:19 Yes, yes. +02:20 Import datetime. +02:22 So close, let's try again. +02:28 Alright, let's try it with this. +02:32 Boom. Look at that. +02:33 On the server it says it's creating the new document. +02:35 Does that really mean it was created? +02:36 Let's go to the database. +02:43 Oh my goodness! +02:44 There it is. +02:45 Look! That's it. +02:46 And we linked it over to the documentation. +02:49 Now even the categories. +02:50 That's so super awesome. +02:52 Love it. diff --git a/transcripts/85-anvil/15.txt b/transcripts/85-anvil/15.txt new file mode 100755 index 00000000..c709cfa5 --- /dev/null +++ b/transcripts/85-anvil/15.txt @@ -0,0 +1,107 @@ +00:00 It's great the we created this document +00:01 but the experience wasn't super, +00:02 like it didn't tell us the thing was created, +00:05 we put a bunch of code right into our form, +00:09 things like that. +00:10 So let's clean this up a little bit +00:11 and let's begin by going over here +00:13 and creating a new module. +00:15 I'll call this... +00:18 I'll just call this utilities. +00:20 Now over here we right code, this runs on the client-side +00:24 and it's going to do... +00:25 This basically lets us put these methods wherever we need. +00:28 So one the things we're going to need to do, +00:30 this will take a moment before it's obvious why, +00:32 but we need to, when we're over here +00:35 When we want to go home, we need the home form, +00:37 which we don't have access to, +00:39 to basically run this code again, okay? +00:43 How do we do that? +00:45 Well what we can do is we can come over here +00:47 and say, import utilities +00:52 We can go the the utilities and say, +00:53 home_form = self +00:56 so that we can always get back to it +00:58 from within code over here. +01:00 So we'll have a home_form +01:04 as None +01:05 but of course it will be set soon the application starts. +01:08 And let's just add a method, "Go home". +01:12 How do we do that? +01:13 We say, +01:15 home_form. +01:16 Now it doesn't know what this is. +01:19 We want to call this function here. +01:26 Like that. +01:27 That's all we got to do, super easy right? +01:29 We just wanted to call this function +01:31 go here from wherever. +01:32 So we need this import utilities over in +01:35 our add_doc_form as well. +01:41 And let's go over here and we can just say, +01:42 .go_home +01:45 We've already created the document but +01:46 let's take some of this code and make a little simpler. +01:49 Let's go over here and say, utilities.create. +01:59 And let's pass that in there, okay? +02:02 So we basically need to call this function +02:04 over in this utilities.create_doc, +02:06 but there's a reason I want to do this. +02:07 You'll see in just a second that it makes sense +02:09 to try to put these together. +02:10 So it's find this. +02:14 Remove that one simple call over here. +02:19 Like that. +02:20 And it's going to accomplish the same thing, +02:22 but we also would like to have one more function. +02:27 refresh_data +02:29 Now what I want to store is I want to store +02:34 the docs as a list and the categories as a list. +02:45 And when we call this, I'd like to write that code +02:47 that we had over here again. +02:49 Remember I said I didn't like this? +02:50 Let's take this code and get rid of it +02:53 and put it over here as well. +03:00 So here we're going to go to the server +03:01 and we'll also do this for the documents. +03:03 If you had a ton of documents that's not a good idea, +03:08 but since we only have a few we'll go like +03:12 this. +03:13 Okay, so we're going to set the categories and the documents +03:17 and that means over here we can just go... +03:21 We've got our list, let's say +03:24 utilities +03:27 not categories. +03:29 Now how do we know this is refreshed? +03:31 Let's call it once when the app starts up +03:33 and that's all we're going to do. +03:40 Alright so that should refresh the data +03:42 and then any of the sub-forms will have access +03:45 to the utilities dot categories or documents. +03:50 And here we'll call create_document +03:52 and then we'll call go_home. +03:53 And within create_document, final thing, +03:54 the reason it's nice to have this here +03:56 is we can call refresh_data again and make sure +03:59 that whenever the data is modified, +04:01 we automatically get it updated +04:03 but otherwise, it just stays like it is. +04:06 Let's go and test this, that it's still working. +04:12 Apparently spelling is hard. +04:19 Alright, what happens when I click this? +04:20 It's going to go to the utilities client-side module, +04:24 call the create_document. +04:26 On the server it's going to create and insert the document, +04:28 it'll come back and then it'll call Refresh +04:30 so if for some reason the categories, +04:32 definitely the documents will have changed, +04:34 we'll get those new ones. +04:35 And then it's going to go to the home form, call go_home, +04:37 it should reload this and it will all work. +04:39 Let's try it. +04:42 Boom! +04:43 On the server we created this new document, now we're home. +04:46 We can add more of course. +04:48 I think it's about time to do the other ones +04:50 where we can actually see the documents right? diff --git a/transcripts/85-anvil/16.txt b/transcripts/85-anvil/16.txt new file mode 100755 index 00000000..546f763d --- /dev/null +++ b/transcripts/85-anvil/16.txt @@ -0,0 +1,140 @@ +00:00 Let's go mess with the old documents, +00:02 recall what we had before we had a little filter thing, +00:04 and I'll go ahead and put the text of it up here. +00:09 This isn't going to do anything yet, but we'll have our little +00:11 filter there, and let's put a spacer. +00:13 And then what we need is, +00:14 we want a list of all of the documents. +00:17 How do you do that? +00:18 So far we've set like the text value and so on, +00:20 so what we need for the next thing is actually +00:23 called a linear panel or a repeating panel, +00:26 we'll go for repeating panel. +00:29 Now, there's an item template +00:31 that we've got created right here, +00:32 and I don't like that name, so let me rename this +00:34 to doc_list_item_template. +00:40 If you go down here, we'll see that we have +00:42 the doc_list_item_template, right there, sorry. +00:44 And let's set the name to docs, like that. +00:50 Now, if we actually want to edit that item template, +00:52 we can double click here or just go there, +00:54 we'll double click there and it says +00:56 what items would you like to display? +00:57 Right on the table, how about documents. +01:01 And that means there'll be a little item property +01:03 for each one that comes through here. +01:05 Alright, so within this, how do you want to show it? +01:09 Well, let's go do some more stuff, +01:10 let's set into this thing, we're going to put the title, +01:18 make that bold and go left. +01:22 Put another one right there, +01:31 that's when it's created, and then let's put a link in here, +01:33 so you can click the link to say navigate over and edit it, +01:36 and this is going to be details. +01:47 Alright, make that smaller at that side, +01:49 that created we can make it a little smaller, +01:51 leave some room for the title, +01:53 which is going to be the main thing. +01:55 This is pretty interesting, +01:56 but how do I get the data wired into this? +01:59 Now, we get a little data binding here, +02:01 check that bad boy out right there. +02:03 Self.item of what? +02:04 Well, that is the scheme of our database. +02:08 How cool is that? +02:10 Okay, this should be name, +02:13 and that's looking good. Oops, I don't want this one. +02:15 Self.name and the created, +02:17 we're going to set that up a little bit different, +02:18 but let's just see what we can do to make this work. +02:23 Come into code here, +02:26 go to our utilities, remember it's already loaded the data +02:29 so we shouldn't have to download anything, this is all +02:32 a single paid app, it's amazing. +02:35 So all we have to do is say +02:36 self.repeating_panel.items = utility.docs. +02:42 Let's see if this works. +02:45 Alright, moment of truth, wow, +02:49 it doesn't look like much, +02:50 but that is out of our database right there. +02:52 Super, super cool. +02:54 Let's work on our created date right here. +02:58 Now, if you look over here at the bindings, +02:59 I could try to add a binding, +03:01 and I could have created, +03:03 but I really wanted something like, +03:04 kind of complicated for how I do this, +03:06 like stuff that's happening here. +03:09 So, instead of doing it this way, let's remove that, +03:12 and let's actually go and write +03:13 some code for our doc template. +03:16 Right, so we come over here, and this little item +03:18 thing has been set, actually, I believe it's not set yet. +03:21 We got to be a little careful when the thing is shown, +03:24 or the doc list is shown, then the item has been set, +03:27 so we come down here and say self dot label, +03:31 created dot text, and then we want to use this nice little +03:36 expression here, where we say item.created, +03:39 this is the document, that's it's created field, +03:41 actually, sorry, we got to do it like this. +03:44 Created, and then store format for the friendly +03:48 month, then the day, then the year, let's try that. +03:52 Try all the docs, there you go, March fourth, +03:56 that's today, that's when I created these things. +03:58 Super, super cool, I mean we could make those fonts +04:00 a little bit bigger. +04:01 Last thing is what happens when we click this? +04:03 Right now, nothing. +04:06 So, inside our template, +04:08 when we double click on these details, +04:11 something is going to happen. +04:13 What we want to do is, again tell the home form to navigate +04:17 somewhere, so what we're going to do is we're going to +04:19 write one more function here, kind of like the go_home. +04:35 And we'll tell the home_form to do this thing +04:38 we're calling go_details, +04:39 and what is that? +04:40 Well it's going to show this details form. +04:42 We haven't put that in place yet, +04:43 because it's not a top level navigation item you can do, +04:47 but we'll write it now. +04:53 It's almost the same, +04:58 going to add the doc_details_form. +05:02 Let's pass the doc along, +05:07 and to kind of keep with the pattern +05:08 when you do this binding +05:09 or something is associated with it, +05:11 it's typically item, so I'm going to say item equals this. +05:16 Alright, in our doc_details_form, let's just +05:19 do something like this, +05:20 print self.item name, just to make sure +05:24 that we got the name here, so, +05:29 like that, let's see if the details now work. +05:39 It doesn't, what are we missing? +05:40 Let me check. +05:45 Why didn't it work? +05:46 Well, it doesn't take a genius to figure that +05:49 out does it, look at this, forgot to call it, alright, so let's do our import again. +05:57 Go to details and pass the document that they clicked. +06:02 Remember, the one I clicked was self.item, +06:04 that's the thing that's bound to this particular row +06:07 of our repeating table, so self.item, +06:10 pass that along. +06:14 Click it, what happens? +06:15 Run demo ReadMe, +06:18 oh we didn't pass enough, what's happening here? +06:23 I forgot to put the self parameter. +06:25 Okay, one more time. +06:29 Ready, let's go see the demo ReadMe. +06:32 Boom, we loaded the document demo ReadMe, +06:34 want to try the other, live doc, loaded live doc. +06:37 Yes, it's working. +06:38 So we pretty much have our app all in place, +06:41 the last thing we need to do is sort of replicate this +06:44 view over here on the home, +06:45 as well as filter the documents. +06:47 So what I'm going to do is, +06:48 I'm going to go add a bunch of documents +06:50 so we have things to work with, and then, +06:52 we'll finish out these last two small pieces. diff --git a/transcripts/85-anvil/17.txt b/transcripts/85-anvil/17.txt new file mode 100755 index 00000000..423e577c --- /dev/null +++ b/transcripts/85-anvil/17.txt @@ -0,0 +1,38 @@ +00:00 Now, off scenes, behind the scenes, +00:02 I've put a bunch more content +00:04 into our little document server. +00:06 And when we run it our all forms shows all the documents, +00:09 but I'd kind of like, at the front here, or home, +00:14 I like the recent, like the most three recent ones. +00:16 So let's put the little thing like this, +00:21 so it'll show the recent documents there. +00:23 Now, we're going to do again one of these repeating panels. +00:25 Now check this out, let's go down here, +00:27 and say, you know what, use this template +00:29 that we already had, right there. +00:32 Notice how it's like this. +00:33 All we have to do is put a different sent of documents, +00:36 and we'll have this thing totally written. +00:38 How awesome is that? +00:39 Let's do this. +00:44 Like, a few seconds this page will be implemented. +00:46 Self.repeating_panel1. +00:48 Don't love the name, but for now I'm going to go with it. +00:50 Items is utilities.docs. +00:53 And let's just say, we'll just take the top three, +00:55 use this twice, try that. +01:00 That is incredible, isn't it? +01:02 With literally one minute I wrote this page, +01:04 because I was able to reuse these components, +01:06 both in code and draggy droppy style, +01:09 and how awesome. Look, if I click on it, it even takes me +01:12 to the one that we clicked on. +01:14 So this is super cool. +01:16 We got our all documents view with all of 'em, +01:19 and our home view, there. +01:20 And then, the last thing we want to do +01:22 in this part is to basically +01:24 let us search within here, +01:26 if I type things like science, +01:28 or I type week, I want this +01:30 to filter down. Let's do that now. diff --git a/transcripts/85-anvil/18.txt b/transcripts/85-anvil/18.txt new file mode 100755 index 00000000..9eb7e584 --- /dev/null +++ b/transcripts/85-anvil/18.txt @@ -0,0 +1,78 @@ +00:00 Now what we want to do is go to our all_documents_form. +00:04 Which is hiding. Let's make some room here. +00:08 And when you type in this thing, +00:09 which is called TextBox Filter, +00:11 we want this to change. +00:12 So, we need to hook the change event down here. +00:14 Check this out. Change event. +00:17 And what we want to do is we want to basically set +00:20 the south.repeating_items +00:25 equal to filtered_docs. +00:28 We don't have this written yet. +00:29 We're going to write that. +00:30 And what we're going to do is I'm going to have a function +00:32 that'll take a document and turn it into text. +00:37 So, if I have this function, and I give it +00:38 one of these documents and it just says +00:41 convert into a string. +00:42 I can do a string search on that. +00:45 So, let's write this filtered documents +00:47 leveraging this little bit of code here. +00:52 Here we go. +00:53 So, what we're going to do is going to go to our TextBox Filter. +00:57 Grab the text. +00:58 And if they're not searching for anything, +01:00 we're going to return all the docs. +01:03 We're going to return all the documents. +01:08 Otherwise, we're going to create a list of documents +01:10 that if we converted to text and then lower case it, +01:13 and we do a find on the txt here, +01:16 then, then we're going to get it. +01:19 I guess we want to also say txt = txt.lower(). +01:23 Like that. +01:24 In case you type something upper case +01:25 that wouldn't work well right there. Would it? +01:27 So, we' re just going to go through and say +01:28 literally as a string, +01:30 does that piece of text you typed in the filter, +01:32 does it appear in the document? +01:33 And then we're going to give that back right there. +01:36 Whew. Okay, and let's see if our filtering works. +01:41 So, here's our home. It's got all the documents. +01:44 Some of these, like the space photos and Higgs, +01:47 these are in the science category. +01:49 They have things like exotic materials. +01:52 This one is logging. So, this is logbook. +01:54 Let's just look where we talked about logbook. +01:59 Oh, filtered docs. What did I do wrong here? +02:01 Ah, self. +02:02 Self, self, self.filtered_docs. +02:05 So, let's try this again. +02:06 How about logbook. +02:08 Oh my goodness. Is that cool or what? +02:11 What about the ones that have to do with science? +02:15 Oh, I think the ones that have to do with science +02:16 might not be coming in there quite right. +02:18 This part right here, we have to get the name out. +02:22 Okay. One more time. +02:24 'Cause the category is actually a row. Right? +02:28 So, now let's try our science. +02:30 Those are the ones with that tag. +02:32 And about the ones with documentation. Those. +02:35 What about the ones have to do with datetime. +02:37 Which is what we talked about in Day 1. +02:39 datetime. +02:41 How about the word the? +02:42 That appears a lot. +02:43 How about RSS? Feedparser? +02:45 See how incredibly easy that is? +02:47 Watch how quick it is to go back and forth +02:49 between all of these. +02:50 Because we've downloaded this, +02:51 we're not hitting the server again. +02:53 It's just all running off of that cash thing. +02:56 Right there. Super cool. +02:57 So, we can come over and just search for RSS. +02:59 Bam, find it. Go pull out the details. +03:01 I guess the last thing for us to do +03:02 is put the details page in here. diff --git a/transcripts/85-anvil/19.txt b/transcripts/85-anvil/19.txt new file mode 100755 index 00000000..9a81f1bd --- /dev/null +++ b/transcripts/85-anvil/19.txt @@ -0,0 +1,67 @@ +00:00 Alright, let's fix up this document details page. +00:02 I did a little draggy, droppy magic +00:04 to put title category and labels. +00:06 Labels and then another label to have their text +00:09 that will programmatically set in the contents here as well. +00:13 There's no point in you seeing me drag that over, +00:15 you would have done that a bunch. +00:16 So let's just go over here, and go like this. +00:20 Talk equals self.item. +00:24 In fact, I think we could probably go over here +00:26 and do a data binding if we really want. +00:29 This could be name. +00:35 This we're going to set in codes, +00:36 we're going to take that away. +00:37 This one we also, I think need to set in code. +00:41 This one we could add a data binding of contents. +00:44 We'll just run it and see how we're doing. +00:48 Click on one, boom. +00:49 How awesome is that? +00:50 There it is. +00:51 Okay, so really, really close. +00:53 We got to set those two cause we +00:54 don't want to transfer them over directly. +00:57 Maybe we could do the created category, +00:59 but we'll just do it in code. +01:04 Category is going to be doc of category. +01:09 From the category we'll get the name. +01:13 Oh, don't forget that's text. +01:15 Text, text, text. +01:17 The text here we're going to set that +01:19 to what we had in our item template. +01:27 Like that. +01:28 And, it'll be consistent I guess we'll say doc. +01:34 Okay, that should do it. +01:36 Maybe one thing really quick here. +01:38 Let's take this away, make this font a little bit bigger. +01:45 Same thing for the title, make it a little bit bigger. +01:49 Alright, let's run it. +01:51 Let's see, are we done? +01:52 Let's try the feed parser. +01:54 Wow that is cool, isn't it? +01:56 So document details here probably +01:58 got to line that up a little, +01:59 but we got this, here's your nice date. +02:00 It's under the documentation category, +02:03 and then, there it is. +02:04 Let's go find another. Let's go find the Higgs one. +02:06 There's the Higgs with a little bit of science stuff, +02:08 has the crystals and it's under science. +02:10 These are the things we search for +02:12 and it showed up over here. +02:14 Like Higgs. +02:16 Pretty amazing. +02:17 Let's go check out the day one read me. +02:18 There's the stuff about day times. +02:20 Okay, so our application is pretty much done. +02:23 I'm going to call it done. +02:25 This is really nice. +02:26 Of course, there's a lot more we can do. +02:28 We probably want to save this version, +02:30 and I'll call this final version. +02:32 You know I actually I have a really cool version history, +02:34 that you can publish and roll back versions, +02:37 all sorts of cool stuff, even clone it with git +02:40 which I'll do and put into the repository for you guys +02:43 to look at so you can look at the code +02:45 but you'll have to come back to Anvil to actually use it. diff --git a/transcripts/85-anvil/2.txt b/transcripts/85-anvil/2.txt new file mode 100755 index 00000000..ee2317a5 --- /dev/null +++ b/transcripts/85-anvil/2.txt @@ -0,0 +1,58 @@ +00:00 The title of this chapter is Full Stack +00:02 Web Apps Made Easy. +00:03 So, what the heck is Full Stack anyway? +00:04 You may have heard this term. It's definitely floating +00:07 around there as a buzzword out in the industry, but let's +00:09 try to put some structure to it so you really know +00:12 what I'm talking about. +00:13 Now, let's look at the pieces involved in a standard +00:15 Web App. +00:16 We got our browser, we have some kind of cloud hosting, +00:18 there's really some sort of server, maybe it's a virtual +00:21 machine or set of virtual machines we manage, and +00:23 there's typically a database. +00:26 A request comes in, goes over to the server, goes off +00:29 to the internet; somehow finds its way magically through +00:32 the magic of the internet to our server, our server +00:34 talks to the database, and so on. +00:37 For most deployments, most applications you build, +00:40 what do you need to know? +00:42 It's actually incredibly daunting, I mean you're taking +00:44 100 Days Of Python here, but there's a lot of languages +00:48 and technologies involved. +00:49 We have tried to help with this, but still, let's see. +00:53 On the server side, we got to know Python, we have to know +00:55 HTML and CSS, some kind of templating like Jinja2 +00:59 or Chameleon, some web framework like Flask or Pyramid, +01:03 a data access layer like SQLAlchemy or MongoEngine +01:06 or something like this. The actual infrastructure, +01:08 typically that's Linux, and if you aren't in Linux, probably +01:11 you got to configure the front-end web server, +01:14 which is NGINX. +01:15 You also got to configure the app server which runs your code +01:18 itself, which is uWSGI or Gunicorn, or something +01:21 like that. +01:22 There's just like, "That is just the server! +01:23 Do we forget about the database?" +01:25 Nope. +01:26 There's more stuff that goes over here; you got to know +01:27 the server that is the database, SQLite or MySQL or +01:30 something like that. +01:32 Got to know the query language, the SQL query language. +01:34 In practice, you got to know migrations, how do we evolve +01:37 your database? +01:39 Are we done? No, We still got the front-end code. +01:41 Over here, we've got Javascript, HTML, CSS, Bootstrap, +01:44 a front-end Javascript framework like AngularJS. +01:49 This is an insane amount of stuff to know, and this is why +01:53 building web apps is both really fun but also +01:56 really challenging because you don't just learn the one +01:58 thing and then go build the app; it's all these technologies +02:01 put together. +02:02 Once you master them, this is a super fun way to build +02:04 applications, but it can be really daunting. +02:06 Whatever it is, it's not quick to get started. +02:10 We're going to see that what we're using for this set of +02:12 three days takes many of these things and makes them nearly +02:16 trivial or automatic or just puts them behind the scenes +02:19 for us. diff --git a/transcripts/85-anvil/20.txt b/transcripts/85-anvil/20.txt new file mode 100755 index 00000000..070cc1ae --- /dev/null +++ b/transcripts/85-anvil/20.txt @@ -0,0 +1,48 @@ +00:00 Well, our app is basically working. +00:02 Let's publish it. +00:03 Let's make it so you can get to it. +00:04 'Cause right now, when you click run, +00:06 there's no URL I can go to. +00:08 Now, I probably won't publish this +00:10 and leave it live for you. +00:12 Maybe I will, we'll see. +00:14 You can check the URL when I get there, +00:15 but notice right now there's publish this app +00:17 while it's running, +00:19 and we can either copy this private link, +00:22 or I could share it via public link. +00:25 If I do this let's call this. +00:27 That seems decent, right? +00:28 How about that? +00:30 You could use your own custom domain, +00:32 but I'm not going to do that. I'm going to just hit OK. +00:34 Now, if we close this, and we go open something else, +00:38 actually let's just open this in a private window. +00:43 Go to Anvil app.net. +00:47 What do we get? +00:54 We get our app, up and running, on the Internet! +00:57 It is now hosted as a web server, as a back end, +01:00 all of the stuff, super cool. +01:02 So we go over all docs, pull this up, +01:05 we can search, everything is working. +01:07 It's really fun, right? +01:08 Obviously so are those. +01:10 We can even add a final document. +01:12 And where are we going to put this? +01:14 Let's put it under press releases. +01:16 The amazing app is now alive. +01:19 Pair document, boom, takes us home right there at the top, +01:24 a final document. +01:25 The most recent one. +01:26 And we click on it, there's the details. +01:30 It was a little more than half-an-hour, +01:32 but not terribly long. +01:33 I mean we've built a non-trivial application, +01:37 and published it to the Internet +01:39 in a pretty short amount of time. +01:41 So, hopefully this application platform +01:45 is inspiring to you. +01:46 I don't know if it makes sense for all of your apps, +01:48 but for certain types of apps it's really, +01:50 really a cool one. +01:52 That's Anvil and full stack web apps made easy. diff --git a/transcripts/85-anvil/21.txt b/transcripts/85-anvil/21.txt new file mode 100755 index 00000000..57df4553 --- /dev/null +++ b/transcripts/85-anvil/21.txt @@ -0,0 +1,82 @@ +00:00 Let's review some of the core concepts around Anvil. +00:02 We saw that we start be defining these forms. +00:05 We drag the components over, we set their properties, +00:07 their names, their bindings, all that kinds of stuff. +00:09 Here's our add document UI and we also have the code, +00:13 so on the flip side we could look +00:15 at the code behind in the form +00:17 and hook into the events for like +00:19 the button click or link click +00:21 or page load or this thing shown +00:23 all sorts of cool tuff. +00:25 And this Python code is actually converted +00:28 into Javascript and runs on the client side. +00:31 So all the code you write here +00:32 doesn't ever touch your server at all. +00:34 It's just, we write it in Python +00:36 but it actually runs locally +00:38 which is actually really amazing +00:39 and takes a lot of the load off your server. +00:41 One thing we wanted to do was navigate between sub forms, +00:45 so to load a different sub form +00:47 but effectively in this case +00:48 navigate the home_details_form. +00:50 We go to the content panel +00:52 and clear out whatever happens to be there +00:54 and then we add a new instance of +00:56 the sub form that we want to show. +00:58 Sometimes it's parameterless like this one, +01:00 other times like our document details +01:02 we actually passed in the +01:04 particular document that was selected +01:07 and then it showed the details of that. +01:08 It's a really really nice way to navigate between these. +01:12 Of course you're going to likely need a database. +01:15 You can go to the data table service +01:17 and create these tables and fill them up with data. +01:20 It's really easy, you can even link between them. +01:22 Don't forget to set the permissions, +01:23 in this example it's no access from Javascript +01:26 but on the server side there is access. +01:30 To do that server side code, +01:31 we're going to write a server module +01:33 and make it callable back on the client +01:35 so here we created all docs method +01:37 and we added a callable decorator, +01:40 we just write whatever code we want and return it +01:42 and this magically finds its way back +01:44 linked in with all sorts of auto complete +01:46 in various places back on the client side code. +01:50 Speaking of client side code, +01:51 here's a little bit of our refresh data +01:53 we just say anvil.server.call and we type in the name +01:56 and then we put in the perimeters +01:57 if they're more after that. +01:59 Now we just work with the documents, right? +02:01 So it's just a list of dictionary's, off we go. +02:04 Once you get your app built, +02:05 you want to put it on the internet. +02:07 It's so amazing. +02:08 So you can click publish +02:09 and it pulls up either a little trial link, +02:11 you want to try the mobile version on your phone +02:13 or I clicked share via public link. +02:17 We also saw that there's version history +02:19 which is really nice, you can clone that with git +02:21 but what's relevant here is you can click publish +02:25 at the different save points. +02:26 So you name these like to present, +02:28 that's one I named +02:29 and if for some reason you make +02:30 a new change you don't like it +02:31 just go click publish and instantly +02:33 roll it back to an old version. +02:34 Really awesome, right there. +02:37 Finally, if you want to get the whole story, the back story on Anvil, +02:39 I had Meredydd Luff on Talk Python +02:42 on Episode 138 and we talk about all the +02:44 internal workings of how this is built, +02:47 how he makes all the pieces work together +02:50 and it's pretty cool. +02:51 So if you enjoyed this and want to learn more, +02:52 check out that episode of Talk Python. diff --git a/transcripts/85-anvil/22.txt b/transcripts/85-anvil/22.txt new file mode 100755 index 00000000..dad500dc --- /dev/null +++ b/transcripts/85-anvil/22.txt @@ -0,0 +1,47 @@ +00:00 Well, I'm sure it was fun to watch me build that app +00:02 with Anvil, but now it's your turn to do some full stack +00:05 web development the easy way. +00:08 As usual, we've broken this up into 3 days. +00:11 Let's start with day one. +00:13 Today you've watched quite a few videos, +00:16 so there's just a few quick, simple things, just so you +00:18 actually get your hands dirty a little bit everyday, right? +00:21 So today, the first thing you need to do +00:24 is create a new account and register at Anvil. +00:26 So be sure to use that URL right there. +00:29 You can just click on GitHub. +00:30 It's talkpython.fm/anvil100, and that will get you 10% off. +00:34 If for some reason, +00:35 you do want a subscription in the future. +00:37 If not, obviously, you don't have to buy anything. +00:40 You can build what we built with the free version. +00:44 Alright. So come over here, log in, create your account. +00:47 Once you have your account, I thought today would be fun +00:50 to maybe play with just a little bit of the UI, +00:52 a little bit of the designer. +00:54 So you are going to create a new app, +00:57 and you're going to choose "Material Design," +00:58 and then it'll give you some suboptions. +01:01 Choose the sidebar style. +01:02 Then you saw, just like we did, +01:04 add a few links to the sidebar define a few subforms, +01:07 and make sure that you chose the blank, +01:09 the simple one, for those. +01:11 And if for some reason, you literally just need one form, +01:14 just use the form that you get right away, right there. +01:16 But it if you're building something more interesting +01:18 like we did, you'll need some subforms. +01:20 And then just fill out the visual designer. +01:21 Just, you know, drag and drop this stuff over here +01:24 till it looks this way. +01:25 Be sure to name the elements like label_title, +01:27 label_created, textbox_search or textbox_filter, +01:30 rather than label1, label2, label3. +01:33 textbox1, textbox2, textbox3. +01:34 That is a real recipe for some spaghetti code +01:37 that's hard to understand. +01:38 So a little bit of care there but just define the UI +01:41 for the app you have in mind. +01:42 You don't have to write any logic, nothing like that. +01:44 And you mine as well go and press "Run" +01:46 just to see it come to life, 'cause that's pretty cool. diff --git a/transcripts/85-anvil/23.txt b/transcripts/85-anvil/23.txt new file mode 100755 index 00000000..c612b91e --- /dev/null +++ b/transcripts/85-anvil/23.txt @@ -0,0 +1,32 @@ +00:00 Day 2, on the second day it's all about data. +00:03 So what we're going to do is going to +00:04 create a data table service, +00:06 so just go to the services and say +, +00:08 choose data tables, and then this thing down here +00:10 will pop up like this. +00:12 Create as many tables as you need up here, +00:14 define their schema, and you can even +00:16 enter down here some starter data. +00:19 For example, if it's something that's +00:20 kind of static or you just want a little data to start with. +00:23 That's great, remember no access from forms, +00:25 access from the server modules. +00:27 Once you have that you're going to need +00:28 a way to get that data down to your application +00:31 so go ahead and add a server module +00:33 and then define the functions that you're going to need +00:36 to send the data down. +00:37 You can look in the demo code +00:39 that I put in this repository in this particular day +00:42 if you want to see how we did the queries there. +00:45 It's pretty easy because they basically have +00:47 a commented section when you create a new server module +00:49 that shows you both how to use it on the client +00:51 and how to define it on the server, +00:53 so just follow along what they have in the comments. +00:55 Once you've got that going, that's Day 2. +00:57 You might want to just call those +00:58 functions from your main form +01:00 as a little test just to see that they're working +01:02 and then throw those away, +01:03 but that's what you did today, it's all about the data. diff --git a/transcripts/85-anvil/24.txt b/transcripts/85-anvil/24.txt new file mode 100755 index 00000000..9c43281d --- /dev/null +++ b/transcripts/85-anvil/24.txt @@ -0,0 +1,33 @@ +00:00 Finally, we're going to round this whole section out +00:03 by putting it all together. +00:04 You've built the UI, +00:05 you've built the data access layer and storage, +00:07 now, it's just a matter of making the UI come to life. +00:10 Is that form supposed to fill up with data when it loads? +00:13 Implement that. +00:15 Is the button supposed to do something when you click it? +00:17 Implement that. +00:18 Right, so, you'll double click on the designer, +00:20 it'll flip you over to the code here +00:21 and you just write the code that happens +00:23 when you click the button, +00:25 or when the thing loads, or whatever. +00:28 Just make your app come to life. +00:29 Fill the interaction pieces that you need, +00:31 and you should be done. +00:33 So if this is something you really enjoyed building, +00:35 and you think is kind of cool, you want to share, +00:36 be sure to publish your app. +00:38 You can share with a private link but be aware +00:39 if you change it ever so slightly, +00:41 that private link will expire. +00:43 So it's very, very touchy. +00:45 You could come up with a public link here if you'd like. +00:48 So this is what we came up with, +00:49 you can choose yours however you like. +00:51 All right, that's it. +00:52 I hope you enjoyed building this full stack web app the easy way. +00:55 Be sure to share it on Twitter and Facebook #100DaysOfCode, +00:58 and @mention both TalkPython and PyBites so we can +01:02 share in the glory of what you've created. +01:04 All right, get out there and build somethin' fun. diff --git a/transcripts/85-anvil/3.txt b/transcripts/85-anvil/3.txt new file mode 100755 index 00000000..167defee --- /dev/null +++ b/transcripts/85-anvil/3.txt @@ -0,0 +1,24 @@ +00:00 Let's take a look at the app that we're going to build. +00:03 The app is called HighPoint, +00:05 kind of like SharePoint but with Python. +00:07 So it's just this knockoff off on a really simple +00:10 document management application. +00:12 But you'll see that it's quite involved. +00:14 So here on our homepage, we've got a couple operations. +00:17 You go view all the documents or create a new document. +00:20 Here's the most recent ones. +00:22 You can click and see the details. +00:24 So when it was created, all the info about it, and so on. +00:28 You go over to all the documents and you could filter. +00:31 For example, one of these has +00:33 the word atoms in it, that one. +00:36 Another one has grass-fed request for example. +00:39 So really nice and again you can see the details. +00:41 And then finally you want to add a new document, +00:43 you come down here, you pick a category, +00:46 create it, you have validation, all this kind of stuff. +00:48 So we're going to build this in a really short amount of time. +00:52 And then put it on the internet with a full deployment. +00:55 How about that? +00:56 Hopefully you're looking forward to it. +00:58 It's a cool technology and it's going to be a lot of fun. diff --git a/transcripts/85-anvil/4.txt b/transcripts/85-anvil/4.txt new file mode 100755 index 00000000..781fe08a --- /dev/null +++ b/transcripts/85-anvil/4.txt @@ -0,0 +1,23 @@ +00:00 Now that you've seen the application +00:02 that we're going to build, +00:03 our SharePoint document management knock-off thing, +00:06 you might be thinking there's no way we'll be able +00:09 to build that in like 30 minutes +00:11 or whatever this is going to take. +00:13 Well, it turns out, +00:14 if we use this thing called Anvil, we can. +00:17 So Anvil is this new product that came out +00:19 that lets you write Python code for everything that you do, +00:23 and it's really this cool visual designer +00:27 and application builder for Python web applications +00:30 with both the service side and client side component. +00:33 Now there's a free version of Anvil that you can get, +00:35 and it has some restrictions. +00:37 And so I was a little bit hesitant to use it for this course +00:40 because for it to really take full advantage of it, +00:42 you have to pay for it. +00:43 But on the other hand, it's so powerful. +00:46 I think a lot of you will really appreciate +00:48 what you can do with it +00:49 and might actually find it super useful +00:51 and not mind paying the small bit that you pay anyway. diff --git a/transcripts/85-anvil/5.txt b/transcripts/85-anvil/5.txt new file mode 100755 index 00000000..73e05cc1 --- /dev/null +++ b/transcripts/85-anvil/5.txt @@ -0,0 +1,72 @@ +00:00 Before we start building our application with Anvil, +00:02 lets look at the building blocks, all the pieces, +00:04 the little Lego bricks that we have to put together +00:07 because they're really easy to fit together and use. +00:10 So, let's do a quick survey. +00:12 Probably the first thing you'll notice is forms. +00:14 And forms are the HTML pages and components. +00:17 You have a nice visual designer with a set of components +00:20 you can drag over and visually line up +00:22 and click on them and set their properties and so on. +00:24 So, that's really nice. +00:25 There's also a code behind thing that goes with them +00:28 that you can run some code as part of +00:30 interacting with the form. +00:33 Now, some code doesn't belong within the UI, +00:35 it belongs elsewhere. +00:36 Maybe it's shared across forms or it just doesn't really +00:39 belong there and so, that would be in +00:41 this client module section. +00:43 So here you can create these Python modules that you write +00:45 arbitrary Python code that can +00:47 be called from within the forms, +00:49 can interact with each other and so on. +00:50 So, it's kind of a nice way to separate stuff out there. +00:53 We'll also have server modules. +00:55 So, this client code in the form code behind +00:58 actually runs on the client side. +01:01 Think about that for a minute. +01:02 Python code running a client side. +01:04 That means in the browser, so it actually converts +01:06 to JavaScript and runs there. +01:08 Sometimes you need code to run on the server to interact +01:11 with your database in certain ways or to work with secrets, +01:14 or validate stuff that nobody can mess with. +01:16 So, that's server modules. +01:17 And there's nice integration here. +01:19 And of course you need data, a database. +01:21 So there's this concept of data tables +01:23 which is really nice and easy and integrated. +01:26 On top of these four things we have services. +01:28 So, things like user management, +01:30 storing users with passwords +01:33 and registration and stuff like that. +01:35 Secrets like API keys you don't want to put in your code +01:37 but still make accessible to your web app. +01:39 And Google and Facebook APIs, +01:40 so if you want to get to say like Google Drive, for example. +01:43 Stripe if you want to accept payments. +01:45 And finally, this thing called uplink. +01:47 Now, uplink, we talked about a thing called uplink, +01:50 a Python package for services but this is not that. +01:53 Put these entirely out of your mind +01:55 they're totally unrelated. +01:56 This is just the same name they have here as the thing +01:59 that we played with earlier. +02:00 The idea is, if you would like your web application to reach +02:04 out and get inside some other thing and interact with it +02:09 you can do this thing called uplink. +02:10 Here's an example. +02:11 Suppose I have a Raspberry Pi that's running some +02:13 Python code that controls my house. +02:16 Inside that Raspberry Pi, I don't want to have a service that +02:19 things integrate with but I would, somehow, like my +02:23 web application to initiate a call into that Raspberry Pi. +02:27 Like, let's say to turn on the lights or +02:29 open the garage door by clicking a button on my web app. +02:32 Uplink would make that happen. +02:33 So, really, really cool. +02:34 We're not going to use it at all. +02:35 We're not going to use any of these services +02:37 for what we're doing +02:38 but we are going to work with the top four items for sure. diff --git a/transcripts/85-anvil/6.txt b/transcripts/85-anvil/6.txt new file mode 100755 index 00000000..fdaf9f1d --- /dev/null +++ b/transcripts/85-anvil/6.txt @@ -0,0 +1,56 @@ +00:00 Alright, are you ready to get started? +00:01 It's time to build something now that +00:03 you've seen what we're going to build, +00:04 and some of the building blocks, let's go over to Anvil. +00:07 Now, I suggest you go to talkpython.fm/anvil to get started, +00:11 I'm working with the guys there and maybe +00:13 I'll be able to get you some kind of discount +00:15 if you do decide to sign up based on this. +00:18 I'll put more details in the readme in the your turn, +00:20 but be sure to go there this way, talkpython.fm/anvil. +00:29 Here's their site, you want to just log in, +00:32 you'll probably want to sign up. +00:33 Now, it should take me right there, +00:34 I think I've logged in in this browser session already. +00:38 Now, I find when I'm working with Anvil +00:39 that I really just want to go over here +00:42 and get the web application to go away +00:44 and just get it full screen, because everything's +00:46 going to happen inside here. +00:51 Here's my HighPoint trial test thing +00:53 that we were just playing with. +00:55 You can actually go down here and click on this, +00:57 and get to some of their interactive tutorials +00:59 if you want to look through them, that's pretty cool. +01:01 They've got a lot of helpful little videos and walkthroughs, +01:04 things like that, so really pretty nice +01:06 support to get you started. +01:08 But we're just going to create a new application. +01:11 I can see we have three basic looks, +01:14 and this one looks a lot like the +01:16 app we just build, didn't it, +01:17 so we're going to go with the material design app. +01:22 And once you pick material design, +01:23 you need to pick your layout, there's a lot of options, +01:26 just blank or custom, or single page, +01:28 we're going to go with what's called +01:29 a card-based layout with a sidebar. +01:32 So here we are in our application. +01:34 We only have this one view right now, +01:36 but if you click app browser, +01:37 you see we can have more than one form, +01:39 we have our modules, server modules, +01:41 the services, and things like that. +01:43 Okay, so I'm going to put this away for now, +01:45 but that's the way we get started. +01:46 And what we do is we just go over here +01:48 and we way, I would like a label over here, +01:50 for example, on the title. +01:51 Or I'd like a button to be right there. +01:53 And we're going to drag the stuff around, +01:55 arrange it, and then we can flip over +01:57 to the code side, so here's the code +02:00 that runs when our form is shown. +02:03 So we're going to hook the events from these components +02:05 and they'll call functions back +02:07 on that code that we just saw there. diff --git a/transcripts/85-anvil/7.txt b/transcripts/85-anvil/7.txt new file mode 100755 index 00000000..c4abeb9a --- /dev/null +++ b/transcripts/85-anvil/7.txt @@ -0,0 +1,63 @@ +00:00 Alright, here we are. +00:01 Let's begin, this is going to be our home_form. +00:03 Let's begin by renaming this thing, +00:05 that's not amazing so +00:06 we can come over here and we can +00:07 rename it to home_form is what I'm going to call it. +00:12 Since my resolution is so small, +00:14 I'm going to hide this thing back. +00:15 I typically work with that open +00:16 but for recording I made my resolution really small +00:20 which means I'll try to compact things. +00:22 Alright, so let's go over here and put a title. +00:26 And we're going to give this a name, +00:27 so in code we refer to these things as +00:31 you know, whatever their name is here. +00:33 Label1 is not super helpful, is it? +00:35 So let's call this label title. +00:39 And let's set it's default text +00:41 as HighPoint Home, something like that. +00:46 Alright, so what we want to do is +00:47 we want to take some links, some hyper links +00:50 and put them over here. +00:51 So we're going to have three of them +00:55 and let's just set the properties. +00:58 Give them a name. +01:00 It's going to be link home, +01:02 it's text is going to be HOME all caps. +01:06 This is going to be all_docs +01:10 and this is going to be add_doc for creating a new document. +01:15 Now, one thing you may have picked up on +01:17 in our little demo app was there were some +01:18 cool icons here and Anvil is integrated with +01:21 what's called font awesome +01:23 which I love it, font awesome is so cool. +01:25 I use it. +01:26 You've seen plenty of these fonts +01:27 in the player that you're working with right now I'm sure. +01:30 So we can come over here +01:31 and say I'd like to have a home icon, +01:33 actually this is the ad so let's have a plus. +01:36 And it's a little plus that appears over here, +01:37 let's do it for docs. +01:41 Now if you're going to make a knock off on SharePoint +01:44 obviously you've got to use word, right? +01:46 So we've got a word icon down there +01:48 and for home let's go over here +01:50 and add an icon and type home. +01:53 That looks nice, right there. +01:56 Okay, so we've defined our UI, +01:58 we've got these pieces here. +01:59 Now the next thing to do +02:01 is to actually add the contents. +02:03 Now the way our navigation is going to work +02:05 is we're actually going to load up this one page +02:07 and we're not going to navigate away at all +02:10 as far as the browser is concerned. +02:12 So this is kind of what you'd consider +02:14 a single page application which has a lot of benefits, +02:18 means every time you interact with this stuff +02:19 it doesn't necessarily go back to the server. +02:22 Once the thing is downloaded, +02:23 it runs really really fast +02:24 which is a great way to run Anvil apps. diff --git a/transcripts/85-anvil/8.txt b/transcripts/85-anvil/8.txt new file mode 100755 index 00000000..ae51bb9d --- /dev/null +++ b/transcripts/85-anvil/8.txt @@ -0,0 +1,46 @@ +00:03 Now notice, if we were creating a top level item, +00:05 this might be good, maybe this, +00:06 but for stuff that's nested inside other forms, +00:10 then this blank panel is probably what we want. +00:15 Give it a name. +00:19 add_doc_form. +00:20 So this is going to be the one we'll see +00:21 for when we add a document. +00:23 Now for each one of these, +00:24 I'm going to put a title on them, +00:26 but I'll skip over in the next set, +00:28 so you don't necessarily need to see +00:30 how to put a title every time. +00:32 So we're going to put this over here, +00:33 and let's just put a nice little title, +00:35 called this label subtitle. +00:41 Make it a line center, make it bold, +00:43 make the font size 28 points, +00:46 and the text will be add a new document. +00:50 That's not going to change so we don't need to do any code, +00:52 but we want to be able to see what form do we have active. +00:56 So, we'll have this here. +00:59 Next up, we're going to add +01:06 a doc_details_form. +01:07 So once you click on a particular one, +01:09 we'll get that. +01:12 We want a place where we can filter +01:14 and see all the documents. +01:15 So let's create an all_documents_form. +01:21 Now you might think we're done. +01:22 We have our home_form, +01:23 we have the ability to add a doc, +01:25 go to doc_details and see all of them. +01:28 However, we also want to put something here. +01:31 And the way the interaction's going to work, +01:33 its better of what goes into this section, +01:35 even on the home page, +01:36 is encapsulated as one of these little sub-documents. +01:39 So, let's add one more here. +01:50 And for lack of a better name, +01:51 I'm going to use home_details_form here. +01:55 And there we have it. +01:56 We have all the forms and they have +01:59 a little bit of information on each one of them. +02:01 The next thing we need to do +02:02 is actually make this navigation work. diff --git a/transcripts/85-anvil/9.txt b/transcripts/85-anvil/9.txt new file mode 100755 index 00000000..5ca16062 --- /dev/null +++ b/transcripts/85-anvil/9.txt @@ -0,0 +1,100 @@ +00:00 So we have our cool little app here, we've got our +00:02 various forms, and we've got a navigation. +00:05 Let's go ahead and actually run this, +00:06 we've not run it yet. +00:08 So, what happens when you run it? +00:09 Well it actually just kicks off, I think, +00:11 a docker image on the Anvil servers. +00:13 So let's click this and get started. +00:15 Oh, before we do, let's give it a name. +00:19 I'm going to call this HighPoint-100days. +00:23 Now we can hit run. +00:25 Now notice it's running right here, +00:27 this little helper thing up at the top, +00:29 and then press stop and get back. +00:31 But anything below this, this is our app, +00:33 this is what people will see. +00:34 You can even expand and collapse the little side thing. +00:37 But if we click on these notice, not so much +00:40 is happening, right? +00:41 Our forms are not showing. +00:42 But still, look, our app is running. +00:44 And if we wanted to see it on other browsers +00:46 or on our phone or something you can even go over here. +00:49 But we're not going to that yet, we're just going to hit stop. +00:52 Now remember, don't close your browser, +00:54 you're not going back to an editor, +00:56 you just want to hit stop, you're already here. +00:58 So how do we link these things together? +01:01 Well, this is where this goes from kind of interesting +01:04 to really different and interesting. +01:06 Watch what happens when I hit code here. +01:08 We've already seen that we have our code in the background, +01:10 okay, and let's open our app browser for a minute. +01:14 So what we need to do is import these other forms, +01:16 in Python, so here's how it goes. +01:18 From add_doc_form, +01:21 import add_dock_form. +01:25 So this is the standard way you get +01:27 access to these other forms. +01:28 You're going to need this for all the various sub forms here. +01:37 All right, so we have them all imported, now what? +01:42 So we're going to write a little bit of code here, +01:44 that when the page loads, after init components, +01:48 when the page loads we want to show the home details form. +01:51 So notice we have a content panel here, +01:56 and what we're going to do, is we're going to put instances +01:58 of these forms into the content panel, +02:00 and that's the thing contained in the middle. +02:03 So we'll say self, notice the nice Intellisense, +02:05 cotentpanel.items, +02:07 not items, what you want to say clear, like that. +02:10 So, in case something was here, +02:12 we want to get it out, and we're going to do this every time +02:15 we navigate, but also at the beginning basically. +02:18 Say self.contentpanel.addcomponent, +02:21 and we're going to create, +02:23 we want to create a home details form like that. +02:27 And that's going to do it. +02:28 All right, now let's run this and see if it works. +02:30 Boom! Look at that. HighPoint Home. +02:32 Now none of this is working, so let's go link those +02:34 three things up and replicate it for the various +02:37 operations we have here. +02:39 So we go back to design, and we just double click home, +02:41 and notice link home clicked, and here's a function. +02:44 Go back to design, do it for all docs, +02:48 do it for add_doc. +02:50 So notice, here are the various things that we can do. +02:53 We can go home, and let's actually, +02:55 do this over here. +03:00 Call self.link, clicked, home, like so. +03:04 Do the same thing with the other little forms +03:06 for the various other pieces. +03:08 So what have we got here? +03:11 The all_docs. +03:15 And this would be add_doc. +03:17 Okay, great, it's almost finished. +03:19 Let's run it and see where we are. +03:23 Notice up here our title, HighPoint Home, HighPoint Home, +03:26 and we click here, we get all documents, +03:28 add a new document, but notice this is not changing. +03:31 This is subtitle, but this is label title. +03:33 Let's fix that. +03:38 Now one thing that's cool, is notice over here on the right. +03:40 These are all the stuff, +03:41 things we can work with, and if you expand it, it shows you +03:43 you can set the icon, text, etc., etc. +03:46 So what we want to do is set the text here. +03:50 So we'll set it home there. +03:54 This one let's say All Documents. +03:56 And this one be Add a document. +04:01 How cool! +04:02 Look at that. +04:03 Very, very nice, I love how this is coming together. +04:06 So, I think our navigation is basically done. +04:09 The next thing that we got to do, +04:10 is let's focus on adding a document. +04:13 Because it's not super interesting to show the documents, +04:15 until we have the ability to add them. +04:17 So we're going to focus on adding a document next. diff --git a/transcripts/88-home-inventory-app/1.txt b/transcripts/88-home-inventory-app/1.txt new file mode 100755 index 00000000..2e6e5b99 --- /dev/null +++ b/transcripts/88-home-inventory-app/1.txt @@ -0,0 +1,16 @@ +00:00 Good day everyone, welcome back. +00:02 This is Julian Sequeira and I'm going to be walking you through +00:05 the next 3 days of creating a home inventory app. +00:10 This is designed to just sort of get you thinking about +00:13 the whole app creation process, +00:16 even though I know you've done it by now. +00:18 But also to get you using a few different things in Python. +00:23 So in this specific app we are going to use SQLite3 +00:27 as the database. +00:28 But we're going to cover a little bit of generators. +00:30 And we're just going to do some basic Python to get you through +00:35 creating your own sort of storage app +00:37 that recalls data, takes input, +00:39 and you can imagine what it's going to be like. +00:42 So, carryon through the next three days +00:44 and let's see what we can come up with. diff --git a/transcripts/88-home-inventory-app/2.txt b/transcripts/88-home-inventory-app/2.txt new file mode 100755 index 00000000..122f346b --- /dev/null +++ b/transcripts/88-home-inventory-app/2.txt @@ -0,0 +1,60 @@ +00:00 All right, for the next 3 days, +00:02 creating this home inventory app, +00:04 it's going to be a bit different to everything +00:05 you've done so far and the reason is +00:07 is that we're not actually going to live code +00:10 the app line by line because that would just be +00:13 pretty boring and might take you forever. +00:15 So, take a look at this. +00:18 This is the ReadMe. +00:20 What I'd like you to do for the first day, +00:23 I should say, is watch 3 videos. +00:26 Watch them, one about the main menu, +00:28 the SQLite3 database access, +00:31 and then scrubbing malicious data. +00:33 Watch those 3. +00:34 That should take a significant amount +00:36 of time, maybe 15 minutes or so, +00:38 depending on how much time you have. +00:40 And, after that, start visualizing +00:43 how you're going to form and write your own app. +00:46 So after taking all of those things into account, +00:49 how are you going to do this yourself? +00:51 Feel free to copy along and copy +00:52 exactly what we've got in the repo, but obviously it will be +00:56 more beneficial if you write this yourself, +00:59 taking guidance from what we have, okay? +01:03 Get coding if you have the time. +01:05 Remember, I know we're all short of time, +01:07 so if you don't have the time, don't worry if you can't +01:09 get coding today 'cause these videos can be a bit lengthy. +01:13 But go ahead and code if you can, all right? +01:17 Day 2, I'm going to walk you through +01:20 an entire run-through of the app. +01:22 We're going to see how it functions, +01:24 how everything works together to form the final product. +01:28 Alright? And that's in the app demonstration video. +01:32 If you haven't already by this point, +01:34 start coding up your own solution +01:36 'cause you've only got another day and a bit +01:37 until you have to move onto the next lesson. +01:39 So, start coding your own app up. +01:41 Again, take guidance where you need to, all right? +01:44 And on the last day, there's another video for you to watch. +01:48 I'm not going to leave up to you just yet. +01:51 Watch the pitfalls and bugs issues, okay? +01:55 That video. +01:56 This is actually going to show you where the app fails, +01:59 and there are quite a few points that fails +02:01 because to make a fully functional, +02:03 bug-free app can take a fair bit of time, +02:06 and that's part of the learning process, okay? +02:08 I'm going to walk you through what fails, +02:11 and if you can, go through and see what you can fix, okay? +02:15 They're all issues that you'll need to take into account +02:18 in your own app, so this is a worthy exercise, okay? +02:22 And then if you're super quick, and you have even more time, +02:25 we'll get it out of the command line. +02:27 See if you can give it a GUI or even a web interface, okay? +02:31 And those are your 3 days, +02:33 a lot of watching, a lot of coding. diff --git a/transcripts/88-home-inventory-app/3.txt b/transcripts/88-home-inventory-app/3.txt new file mode 100755 index 00000000..2f2dec09 --- /dev/null +++ b/transcripts/88-home-inventory-app/3.txt @@ -0,0 +1,120 @@ +00:00 Okay, so the first thing we're going to look at +00:02 is pretty much how you get started. +00:05 It's a bit daunting, +00:06 looking at an empty page like this, isn't it? +00:10 The best way I find to start +00:12 is to actually think about what you want your app to do, +00:15 and make a menu for yourself. +00:17 And normally I would say storyboard it, +00:19 you know, get an empty document, +00:21 draw it out with a piece of paper and a pen, whatever. +00:24 But I think given this is a very basic app, +00:28 I think this works quite simply, quite easily, +00:31 to just create a menu. +00:34 Okay? It's just going to be text based like an old CLI app +00:36 that has 1, 2, 3, 4, 5 +00:39 with your different options, okay? +00:41 So, without actually showing you the code, +00:44 again I'm not going to show you the code until the end, +00:47 but it is in the repo if you want to have a peek, of course. +00:50 I'm just going to create under a main menu function, +00:55 let me just copy and paste it in, +00:58 just going to create a list, okay? +01:01 Now this is a dictionary with the menu options in there, +01:05 okay, and we're creating this with Add Room, Add Inventory, +01:11 View Inventory List, Total Value, and Exit. +01:15 So these are the five things we want our app to do, +01:18 okay, so the idea is when the app launches +01:21 it's going to give you the option to add a room +01:24 'cause we're going to add a room to add inventory to. +01:28 So you got to think about it in that sort of a way, alright. +01:31 Sequentially, if you want to use this app, +01:34 you're going to add the room first because by default +01:36 we don't have a room to add anything to, okay? +01:39 Once we have a room, +01:41 then we can actually add some inventory, +01:45 and then once we have inventory in there against a room, +01:49 then we can actually view it. +01:52 And then again, once we have everything in there +01:55 we can see what the total value per room is, +01:59 or the total value for the entire house so to speak, +02:03 and then we can exit. +02:05 And that's what we're going to wrap our entire app around +02:07 today and tomorrow and the day after. +02:11 Now, again, I'm not going to show you the entire app +02:14 and walk you through every single function just yet, +02:17 I'm just going to show you the more critical points, +02:20 the more technical points, okay? +02:22 So to make this menu, +02:25 I've decided to put it in a while loop. +02:28 I'm just going to copy and paste it in +02:30 rather than make you watch me type it all out, there we go. +02:34 So we have a while loop here, while true, +02:37 so this is always going to happen, +02:40 this list is always going to come up on the screen, +02:43 unless something else is happening, +02:45 it's going to come back to this list. +02:49 So we know with the dictionary that unless you sort it first +02:54 it's not always going to print in order +02:57 from 1-2-3-4-5 when you iterate over it. +03:02 So what I've done here is I've said for the item +03:07 and for the description in our sorted menu, +03:12 okay the items in there but sorted, +03:15 we're going to print the item and the description, +03:17 we're going to print that and that. +03:19 And this little for loop here allows us to print this menu +03:22 on screen, and it allows it to print it in order, +03:27 that's what sorted is there for. +03:29 And then we take the user input, +03:33 so if the user selects one +03:36 we're going to call a function called Add Room, +03:38 if they select two, we're going to do Add Inventory, +03:42 I'll explain this in just a second, +03:44 if they do three, View Inventory, +03:46 four Calculate the Total, +03:48 five sys.exit. +03:51 Now for sys.exit to work, +03:53 we have to import sys +03:58 and this sys.exit just exits out of the program, +04:02 and if anything else is entered: invalid option, try again. +04:07 Now the Check Input function here that is being called +04:11 by Add Inventory and View Inventory is a little function +04:16 I wrote just to check whether the room exists. +04:20 So if you're going to add inventory, +04:22 the first thing you need to know +04:24 is what room you're adding the inventory to, right? +04:27 Well that's what this checks here. +04:30 So I'll quickly copy and paste that in again +04:33 for you to have a look at. +04:34 Lets just pop down here. +04:38 Okay, so here's Check Input. +04:40 So the first thing we're doing +04:42 is we're actually printing out a list of the rooms, +04:45 so this is yet another function , +04:48 don't worry you'll see it all in the final code, +04:50 but it's essentially listing out the rooms that we have +04:54 and it'll printed on the screen, +04:55 which allows the user to see what room they want to select. +04:59 And then the user types in the room, +05:03 gets converted to lower case, +05:05 and then if the room, which is assigned to selection, +05:10 if it does not exist in the list of rooms +05:15 then you get the message: that room does not exist. +05:19 Else, we return the selection. +05:22 Don't worry about what scrub is, +05:23 we'll cover that on another video. +05:26 And that's it, okay. +05:27 So then, once we have the room +05:31 we add inventory to that room. +05:35 So all of these functions +05:37 will be available in the final code, +05:39 but what I'd like you to do is start thinking about +05:41 how you would write these functions. +05:44 How would you write Add Room? +05:46 How would you write Add Inventory? +05:48 How would you write View Inventory? +05:50 Okay, and that's it for this one. +05:53 In the next video we're going to look at +05:55 some more of the advanced calls in this program +06:00 and just for now, again, +06:02 think about how you would write these different. diff --git a/transcripts/88-home-inventory-app/4.txt b/transcripts/88-home-inventory-app/4.txt new file mode 100755 index 00000000..24feeff7 --- /dev/null +++ b/transcripts/88-home-inventory-app/4.txt @@ -0,0 +1,96 @@ +00:00 As I've said before, we're using SQLite3 +00:02 for our database for this app. +00:05 This here is how you actually open your connection +00:07 to the app and to the database +00:10 and then do something and close it off. +00:14 So we've got our connection. +00:16 We've covered this in SQLite3 before +00:18 but I'll give you a quick run through. +00:20 We connect to the database, okay? +00:22 We create the cursor which allows us +00:23 to actually write over the database. +00:25 We then execute some sort of code. +00:28 We commit it and then we close it. +00:31 Now as we know from our main menu, +00:33 there are quite a few things +00:34 that are going to need this connection, okay? +00:36 There's going to need, we need to add a room, +00:38 we need to view the room, we need to calculate totals, +00:41 we need to add inventory. +00:43 There's a lot of things there +00:44 that will need this connection. +00:46 Including just listing out the names of the rooms, right? +00:49 So you can't really have this much code +00:53 in a function every single time you need +00:56 to connect to the database. +00:59 It's not Pythonic and it's just a waste of code, right? +01:03 So what I've done is for this app, +01:05 I'll leave this up on the screen. +01:06 I've created a generator. +01:08 Let me paste it in here. +01:13 Alright, so this is called access_db, this function. +01:17 And it's wrapped in context manager, +01:19 so in order to use it, you would have +01:21 to from contextlib, import contextmanager +01:28 Whoops. +01:29 contextmanager, okay? +01:32 And what this is allows us to do is +01:33 it allows us to generate a cursor, okay? +01:37 So the first thing it's going to do, it's going to try. +01:39 It's going to connect to our database. +01:43 It then creates the cursor. +01:45 Again, we're using this lineup here, okay? +01:47 And then it's going to yield that cursor, okay? +01:50 And what does that mean? +01:51 It means it's going to pass back that cursor +01:55 to whatever called this function, okay? +01:58 So it yields this cursor out. +02:00 Now, just a quick demonstration +02:03 of what one of these functions looks like. +02:06 This is the list rooms function +02:09 that we saw previously, okay? +02:12 Now what it does is it says with access_db as cursor, okay? +02:18 So it's calling our access database function here. +02:25 And it's assigning that as cursor, okay? +02:29 So when it yields cursor, whatever is yielded +02:32 by this generator is assigned to cursor, okay? +02:37 So that way we're able to use this cursor here +02:39 that's generated by this try statement. +02:44 We're able to use it here and so it's going +02:46 to do cursor.execute and run our SQLite query. +02:52 And then once everything in this with statement is complete, +02:58 we move back up here into this, +03:01 into our generator, and we finish it off. +03:05 It's just finally, okay? +03:06 So this finally is dependent on +03:08 this yield coming back, okay? +03:11 So this returns a cursor, this yields a cursor +03:14 but this here, this function is generated +03:17 doesn't complete until whatever was +03:20 using this yielded cursor completes, okay? +03:25 So, yielded cursor into here. +03:27 Into this with statement. +03:29 This with statement uses the SQL. +03:32 Runs this quick for loop with this list +03:34 to create it and then once it's closed off, +03:39 we go back here. +03:41 We commit the change and then we close it. +03:44 And now you can see, we don't need to have +03:46 this specific code, the connection, +03:48 the cursor, the commit or the close. +03:51 We don't have to have that in every single function +03:55 that calls or that needs to talk to our database. +03:58 All we really want from this +04:01 database call, is the cursor. +04:04 This cursor is what's important +04:06 and that's what will change from function to function. +04:09 So by putting all of the unnecessary duplicate code +04:14 into its' own function up here, +04:16 we're being more Pythonic +04:18 and we're going to then only return +04:21 what we need and the yield what we need +04:23 to the functions that need to talk to the database. +04:26 Okay, so that's a quick, quick overview +04:29 of how we're using a generator +04:31 in this specific code base, +04:33 in this app to talk to our SQLite3 database. diff --git a/transcripts/88-home-inventory-app/5.txt b/transcripts/88-home-inventory-app/5.txt new file mode 100755 index 00000000..b40da38c --- /dev/null +++ b/transcripts/88-home-inventory-app/5.txt @@ -0,0 +1,102 @@ +00:00 What we're looking at here is the add room function. +00:03 Now the reason I'm showing you this is because +00:06 it was a bit tricky to get around this. +00:09 We want our users of this application to be able +00:13 to add rooms and what that means is +00:15 they're going to be adding tables to our database. +00:20 Each room is going to be a table +00:23 and each room is going to be able to have certain items +00:27 added to it. +00:28 A name and then a value. +00:31 You can see that here. +00:32 We've got our item, meaning the item we're adding +00:35 to the room, which is text +00:36 and then a value which is a real, as in pretty much a float. +00:41 A real dollar value, a real number value. +00:45 The catch is we want the user to be able to specify +00:50 the name which means the user is essentially telling us +00:54 what our table name is. +00:57 That in SQLite3 is actually not allowed. +01:02 It's not Pythonic and it's actually unsafe +01:05 from a database standpoint because it allows people +01:08 to inject malicious code into your database, +01:12 into your execute command. +01:16 You can see here what we've done is +01:19 just ignore this line here. +01:21 Input, what would you like? +01:23 What name would you like to give the room? +01:25 Let's say we gave the room the name Living Room +01:28 or just Kitchen we'll go with Kitchen. +01:31 When the cursor executes to our SQLite database, +01:35 it creates the table. +01:38 Normally, you would just type the table name in here +01:41 within the quotes. +01:43 But we can't do that because we don't know +01:46 what the user is going to specify. +01:48 We need to parse it. +01:49 The variable that the input was assigned to. +01:53 So, name, we need to parse name into SQLite 3. +01:57 That's what actually incorrect. +02:00 That's what actually unsafe. +02:02 By going name.lower and essentially injecting it +02:07 into our SQLite 3 code here, +02:12 we run the risk of actually injecting malicious code +02:16 into our database, which could be very dangerous. +02:22 To get around this, SQLite recommends you use +02:26 question mark substituting. +02:29 On investigation, you can't use that for the table name. +02:34 You can use it for the rest of the query. +02:36 You can use it after that when you're talking about +02:38 data to add into the table, +02:41 which you'll see we use later +02:42 but you can't use it to actually specify the table name, +02:46 which is very frustrating. +02:48 But the way to get around this and it's a bit of a hack job +02:53 is to scrub the data that goes in. +02:57 So the user will add a name and we're going to scrub that name +03:03 to remove anything that's malicious. +03:06 We're going to define anything as malicious as spaces, +03:10 any non-alphanumeric characters. +03:15 Could be back slashes, could be apostrophes, +03:19 could be a percentage sign, plusses, +03:23 anything like that. +03:24 We're going to scrub all that out. +03:26 We have this simple one-liner here that does that for us. +03:32 So any name that gets parsed into scrub, +03:36 so let's say we're going to scrub name, +03:38 scrub of table name. +03:41 What we're going to go is we're going to return, +03:42 this is all in one line, Bob would love this, +03:46 and essentially what it's doing is +03:49 for every character in this table name, +03:53 if it is a alphanumeric number +03:59 or an alphanumeric character, I should say +04:02 then it's going to join it. +04:05 If not, it leaves it out. +04:08 So we could use this function here to then scrub +04:12 any word we want and turn it into the safe format +04:17 that our SQLite database will actually approve of. +04:21 So to demonstrate, let's run this up in the shell. +04:26 All right, so I've used a bit of magic and just copied +04:28 and pasted it in there. +04:29 So now we can scrub anything we want. +04:32 So let's scrub this string here. +04:38 We'll go Julian-Bob, oops. +04:44 And it comes back as just JulianBob. +04:45 It gets rid of that dash. +04:47 So let's scrub an actual room +04:51 and we'll go scrub Living Room. +04:56 You see, it gets rid of the space because all it's doing +04:58 is just capturing the letters and the numbers +05:02 and putting them together. +05:05 Let's try one more thing. +05:08 Mike99+. +05:16 Just mushed some rubbish in there +05:20 and it strips out all the stuff +05:22 that could potentially hurt us. +05:24 This is a nice little workaround to get around +05:27 the SQLite3 restriction on table names +05:32 and not being able to substitute them with variables. +05:37 So this is what I've put in there. +05:39 Hopefully, that'll help you out in the future, as well. +05:43 But that's just a quick explanation of the scrub. diff --git a/transcripts/88-home-inventory-app/6.txt b/transcripts/88-home-inventory-app/6.txt new file mode 100755 index 00000000..a13054c3 --- /dev/null +++ b/transcripts/88-home-inventory-app/6.txt @@ -0,0 +1,108 @@ +00:00 And here's the final code here on the right. +00:02 We'll go through it very quickly, +00:04 not in too much detail. +00:06 But essentially, start down the bottom. +00:09 We can see we launched our first launch first, okay? +00:13 And the reason we do this is this will generate +00:17 the database for us on first launch. +00:20 So as soon as this is run, it tries to +00:22 connect to the SQLite3 database, and then it +00:25 just fails while the except scenerio here +00:28 is to just exit out of the app with some +00:30 error code X that can be expanded on later +00:33 if you feel like it. +00:34 And this just ensures the we actually have +00:37 a database file to talk to, inventory.db +00:41 on the very first time that you launch this app. +00:45 Okay? And then we pop back down and we're launching +00:47 Main Menu here. +00:48 We're running the main menu. +00:50 And down here we've seen that before, +00:53 these are all your different options, okay? +00:56 Now if you want to add room, we then go down +00:59 here to Add Room. +01:00 And again, we've seen the Scrub, we're seen +01:02 the Create the Table based on the user's input. +01:05 Done. +01:06 A room with the name has been added to the database, +01:09 then we can run the inventory check, add inventory +01:12 with the check input. +01:14 Okay, so we'll just do a quick Check Input here. +01:17 We've seen that again, it just checks to see +01:20 if the name exists. +01:24 If it doesn't exist, it just returns. +01:26 Else it will scrub the selection. +01:29 It will use that scrub function again here. +01:33 It'll scrub it and it'll return it to Add Inventory. +01:36 We'll pop down to Add Inventory here. +01:39 Now the reason we want it scrubbed is because +01:42 that selection that the person made is going +01:45 to be used in our Execute command here +01:48 into the database. +01:49 So as they enter the item, it will execute +01:53 insert into the room that they use as specified. +01:59 Okay? And then it will enter in the item values. +02:02 And it will then give them the option to +02:05 keep entering items or to quit, +02:08 which will take them back to the main menu. +02:11 Okay? Back to the main menu. +02:15 View Inventory, similar sort of thing as Add Inventory. +02:19 Okay, the user selects a room. +02:22 And then it will actually go through and add up +02:26 everything in that room. +02:27 So you can see we've got data[0] and data[1]. +02:31 It will actually go and print out the total of data[1], +02:32 one being the value from our SQLite database. +02:39 So we're selecting from, the room that the +02:41 user specified, we're selecting everything from there, +02:45 and then we're going to just add up the values, +02:49 or those real values, and display it on screen. +02:52 The other function that we haven't touched on +02:54 yet is Calc Total, which is pretty much going +02:57 through every single room, okay? +03:00 It'll go through every room in the database, +03:03 add up all the values, add it to the total, +03:06 and then you'll get a total down the bottom. +03:09 Okay? So that's pretty simple, right? +03:10 We've got everything covered there. +03:12 All right, let's actually run it and +03:15 see how it works. +03:16 So this will create a new database file +03:20 called inventory.db because I don't have one. +03:23 And then we'll add the room. +03:26 What name would you like to give the room? +03:28 Let's call it Kitchen. +03:31 Okay a room with the name Kitchen has been +03:33 added to the db. +03:34 Let's add some inventory. +03:36 Okay, which room? +03:38 Okay let's choose Kitchen. +03:40 And what item do we want to add in? +03:42 Let's put in Fridge. +03:45 Monetary value of the fridge is let's say 900 bucks. +03:49 Okay, let's add something else. +03:51 Let's add the oven. +03:54 Let's say it's $1200.00. +03:56 Okay we'll hit q. +03:58 And now it can view the inventory list with three. +04:02 Which room, kitchen, and it came up saying +04:06 we've got a fridge of 900 bucks, we have an +04:08 oven of $1200.00, total value of $2100.00. +04:13 Okay, so we know that's the math there works. +04:16 All right, let's add another room quickly. +04:19 Let's call it the Study. +04:21 All right? +04:23 Let's add some inventory to the study. +04:27 Okay let's call it the Computer. +04:29 And let's say it's a value of $2500.00. +04:33 Okay we don't want to add anything else. +04:36 And now if we do View Inventory List, +04:39 we can see both rooms. +04:40 We choose the Study, we can see the study +04:44 just has a computer in it for $2500, +04:46 total value of $2500. +04:49 Now if we want to see the total value of +04:50 the entire house, we can click on number four. +04:55 Total value of all rooms is $4600.00. +04:58 And that's it. +04:59 Okay, that's pretty much diff --git a/transcripts/88-home-inventory-app/7.txt b/transcripts/88-home-inventory-app/7.txt new file mode 100755 index 00000000..c6c70520 --- /dev/null +++ b/transcripts/88-home-inventory-app/7.txt @@ -0,0 +1,121 @@ +00:00 So while the app actually does work +00:03 there are quite a few things that we've left out. +00:05 And I've done this on purpose because this is what I'd +00:08 like you to work on for your Day 3. +00:11 If not, just work on to expanded just for fun. +00:14 You can do it after your 100 days is up, +00:15 whatever you feel like. +00:17 Or maybe you can use it as an idea +00:19 to factor it into your own inventory app. +00:22 This first thing is, +00:24 is that we haven't actually captured incorrect input. +00:29 We have here. +00:30 So for example, if we're at the main menu +00:32 we put the letter a. +00:34 We just get invalid option, try again. +00:37 Even if we do something like 11. +00:39 We know it's a number but it doesn't +00:41 match any of these, so we get invalid option try again. +00:45 Now what happens if we add a room? +00:48 Now we know we have kitchen in there. +00:50 But if we add kitchen again, what happens? +00:54 Kitchen already exists. +00:56 So we need to be able to capture that. +00:58 What happens if someone wants to add multiple bedrooms +01:02 but they just want to call it bedroom. +01:05 It's a silly scenario because can't think of anyone who'd +01:08 do that but this is something that needs to be captured. +01:11 Rather than allowing an error to just suddenly pop up +01:14 and then exit out of the app. +01:17 So there's one. +01:19 Adding multiple rooms can cause a problem. +01:22 So, see if you can figure out a way to capture that. +01:26 Now that we have that, +01:29 let's see if we can add duplicate items. +01:32 So we'll add a knife for $20. +01:38 Let's try and add another knife for $20. +01:41 And that works. +01:42 So why does that work? +01:43 Well that actually works because SQLite has its own +01:47 sort of tagging behind the scenes. +01:49 It tags each entry with its own id. +01:53 So you can have duplicates items below a table name. +01:58 You can't have duplicate table names though. +02:01 Now is that a problem? +02:02 For me i don't think it is a problem. +02:04 But if you wanted to capture that you could. +02:07 That's something to capture. +02:09 But what about this? +02:12 Let's say we want to add a microwave, +02:17 but by accident instead of hitting $20 we hit 2o. +02:24 We've entered in a letter instead of a number. +02:29 What's going to happen? +02:30 It allowed it didn't it? +02:31 So it allowed the fact that we had a letter and a +02:35 number in there. +02:36 Which is wrong, +02:38 so if you actually pull up our +02:40 SQLite database in SQLite viewer. +02:42 Which I have done here. +02:44 You can see we now have values +02:48 but microwave is now accepted to O. +02:53 So what we'll do now +02:55 by allowing this to happen, +02:57 we've probably caused problems here. +02:59 So view inventory list, let's do kitchen. +03:04 There we go, it failed because +03:06 it needs it formatted as a number not a string. +03:11 This is for the actual value calculation. +03:15 So it was able to print it all out. +03:17 Once it got to the actual calculation for the total value, +03:21 didn't like it. +03:22 Same thing for actually printing out +03:24 microwave and its value. +03:27 So that's something we screwed up and we'd actually, +03:29 in that case we actually broken the application completely +03:33 because we have no way in here to code a deletion. +03:36 Which again is something you could do. +03:38 So I'm going to go manually into the database here. +03:42 And we'll delete this record +03:47 because it's going to cause us problems. +03:50 I'll demonstrate that again. +03:51 This time we'll add an item to the inventory. +03:54 We'll choose the room study. +03:58 Study. +03:59 And then let's add ourselves a chair. +04:02 And instead of actually entering a number at all. +04:05 Let's just use the word water. +04:07 And you can see it actually returned +04:09 and we were able to add it successfully to the table. +04:11 So again, that's going to cause us issues +04:14 and we'll have to delete it manually from the database. +04:17 We can also capture different errors to do with launching +04:20 the app as we saw. +04:22 I've only got this sampler here but we can actually put +04:24 some more scenarios in there if you wanted. +04:28 That's something you could work on. +04:30 And the last thing here is, check this out. +04:35 We just entered an empty room. +04:38 A room with name space has been added to the database. +04:43 That's a problem, so. +04:45 That's something we need to capture as well. +04:48 This is all stuff you can work towards. +04:50 If you get bored and if you want to work towards it. +04:52 But you can see that this is all stuff, +04:55 if you're creating an app that you have to take +04:58 into account. +04:59 And just one other thing as well that is rubbing me +05:02 the wrong way. +05:03 Is this elif tree here. +05:06 I don't like that, I've done it +05:08 just for demonstration purposes but essentially +05:11 you would preferably throw all of these into a dictionary +05:16 and make it a bit more Pythonic. +05:19 There's no need for it to be this large. +05:21 But either way, this is your little go to points to +05:24 see if you can expand on this and improve it. +05:27 If you wish. +05:28 You might even just think about writing this app +05:30 yourself in a way that you see fit. +05:33 And covering these problems as you build it. +05:37 So have fun. diff --git a/transcripts/88-home-inventory-app/8.txt b/transcripts/88-home-inventory-app/8.txt new file mode 100755 index 00000000..459588b0 --- /dev/null +++ b/transcripts/88-home-inventory-app/8.txt @@ -0,0 +1,30 @@ +00:00 Okay and that is it. +00:01 Hopefully by now you've got +00:02 a nice fully functional home inventory app going +00:05 and you learned something on the way, okay. +00:07 Especially with SQLite and with the generator +00:10 and whatever other cool little ways +00:13 you've managed to make this app your own. +00:15 I'm not going to bother going through any slides +00:17 for the finale of this lesson set, +00:20 just because we did go through +00:21 quite a lot of content. +00:23 What I will do is, +00:24 I will show you the ReadMe +00:26 one more time, +00:28 just so you know what you can do with this +00:30 if you haven't done it already, +00:32 is run yourself a GUI or a web interface. +00:36 I think that's the next logical step for this app +00:39 because it would be a lot of fun to be able +00:40 to bring up a website +00:41 and enter in your entire room into one form +00:45 and have it submitted to a database, okay. +00:48 So, this is your turn. +00:50 Obviously, go ahead and identify the pitfalls +00:53 and the bugs as per that video +00:55 and make them your own. +00:57 Solve them, resolve them. +00:59 See if you can turn it into something great +01:02 other than just a CLI app. +01:04 And that's your home inventory app. diff --git a/transcripts/900-appendix-pylang/1.txt b/transcripts/900-appendix-pylang/1.txt new file mode 100644 index 00000000..da8c5639 --- /dev/null +++ b/transcripts/900-appendix-pylang/1.txt @@ -0,0 +1,25 @@ +
0:01 One of the unique concepts in Python is to minimize the number of symbols  +0:05 and control structures in the language.  +0:08 For example, in C and C-based languages like C# and JavaScript,  +0:12 you have lots of curly braces, and variable declarations and so on, +0:16 to define structures and blocks.  +0:19 In Python, it's all about the white space, and indentation.  +0:23 So here we have two particular methods,  +0:26 one called main and one called run and they both define a code block  +0:31 and the way you do that is you say define the method , (colon),  +0:34 and then you indent four spaces.  +0:36 So the purple blocks here these are also code blocks  +0:39 and they are defined because they are indented  +0:42 four spaces the "if" and the "else" statement.  +0:44 But within that "if" statement, we have a colon ending it,  +0:46 and then more indentation, and that defines the part that runs in the "if" case,  +0:50 and then we have the "else" unindented, so that's another piece,  +0:54 another code suite or block, and then we indent again to define  +0:58 what happens when it's not the case that the argument is batch or whatever that means.  +1:02 And we saw that these are spaces, the convention is to use four spaces  +1:06 for each level of indentation, it's generally discouraged to use tabs.  +1:10 Now, if you have a smart editor that deeply understands Python,  +1:13 like PyCharm or Sublime text or something like that,  +1:16 it will manage this indentation and those spaces for you,  +1:19 so it's much, much easier in practice  +1:22 than it sounds before you actually get your hands on it. diff --git a/transcripts/900-appendix-pylang/10.txt b/transcripts/900-appendix-pylang/10.txt new file mode 100644 index 00000000..6b8f7ce8 --- /dev/null +++ b/transcripts/900-appendix-pylang/10.txt @@ -0,0 +1,34 @@ +
0:01 Packages and modules must be imported in Python before they can be used.  +0:06 It doesn't matter if it's in external package of the package index,  +0:09 in module from the standard library or even a module or package +0:12 you yourself have created, you have to import it.  +0:16 So code as it's written right here likely will not work,  +0:20 you will get some kind of NameError, "os doesn't exist, path doesn't exist".  +0:23 That's because the os module and the path method contained within it have not been imported.  +0:29 So we have to write one of two statements above,  +0:33 don't write them both, one or the other.  +0:35 So, the top one lets us import the module and retains the namespace,  +0:39 so that we can write style one below, so here we would say os.path.exist  +0:44 so you know that the path method is coming out of the os module.  +0:47 Alternatively, if you don't want to continue repeat os.this, os.that,  +0:52 and you just want to say "path", you can do that by saying this other style,  +0:56 from os import path.  +0:58 And then you don't have to use the namespace,  +1:00 you might do this for method used very commonly +1:02 whereas you might use style one for methods that are less frequently used.  +1:07 Now, there is the third style here, where we could write "from os import *",  +1:10 that means just like the line above, where we are importing path,  +1:14 but in fact, import everything in the os module.  +1:17 You are strongly advised to stay away from this format  +1:19 unless you really know what you are doing, this style will import and replace  +1:24 anything in your current namespace that happens to come out of the os.  +1:28 So for example, if you had some function that was called register,  +1:33 and maybe there is a register method inside os module,  +1:37 this import might erase your implementation, depending where it comes from.  +1:41 So, modules must be imported before you use them,  +1:44 I would say prefer to use the namespace style, it's more explicit  +1:48 on where path actually comes from,  +1:50 you are certain that this is the path from the os module,  +1:52 not a different method that you wrote somewhere else  +1:54 and it just happens to have the same name.  +1:56 Style two also works well, style three- not so much.  diff --git a/transcripts/900-appendix-pylang/11.txt b/transcripts/900-appendix-pylang/11.txt new file mode 100644 index 00000000..23118681 --- /dev/null +++ b/transcripts/900-appendix-pylang/11.txt @@ -0,0 +1,32 @@ +
0:01 You'll hear it frequently said that Python is an ecosystem  +0:06 or a language that comes with batteries included,  +0:06 and what that means is you don't have to start with a little bit of Python  +0:10 and pull in a bunch of different pieces from here and there  +0:13 and implement your own version of this algorithm or that feature.  +0:17 Oftentimes, the things you need are built already into Python.  +0:21 You should think this batteries included is kind of like an onion with many layers,  +0:25 so at the core, the language itself is quite functional and does many things for us,  +0:31 the next shell out is the standard library, +0:35 and in the standard library we have file io, regular expressions,  +0:39 HTTP capabilities, things like that. +0:42 In the next shell outside of that are all of the packages  +0:45 and external projects written for and in Python,  +0:49 so for example when we want to add credit card capabilities to our website,  +0:52 we are going to reach out and grab the stripe Python package.  +0:56 The web framework we are using itself, is built around many packages,  +0:59 centered around Pyramid, the database access layer is SQLAlchemy.  +1:03 Everything I just named does not come included in Python,  +1:06 but is in the broader ecosystem. +1:09 If it's in the broader ecosystem and it is a package or library for Python developers to use, +1:13 chances are extremely high you will find it in this place called  +1:16 the Python Package Index, which you can find at pypi.org.  +1:20 Notice that there are over 88 thousand packages at PyPi.  +1:24 This means, you can go on and type something in that search box,  +1:28 and there is a very good chance that what you are looking for  +1:31 will return a bunch of results that you can then grab one of them,  +1:35 install into your environment and then use in your project. +1:38 So here is what you do- when you think you need some piece of functionality or +1:42 some library, before you go to start and write that yourself,  +1:46 do yourself a favor and do a few searches at pypi.org,  +1:49 and see if there is already a really great open source project  +1:52 or package that supports it.  diff --git a/transcripts/900-appendix-pylang/12.txt b/transcripts/900-appendix-pylang/12.txt new file mode 100644 index 00000000..ec410483 --- /dev/null +++ b/transcripts/900-appendix-pylang/12.txt @@ -0,0 +1,40 @@ +
0:01 Now that we saw there is over 88 thousand packages at pypi.org,  +0:04 we can just grab and bring into our projects and add great functionality  +0:08 HTTP processing, web services, web frameworks, database access, you name it,  +0:14 the question becomes how do we get those form pypi into our system  +0:19 or, any distributable package even if we actually just have a zip file of the contents,  +0:25 and the answer is pip. Pip knows about the Python Package Index  +0:29 and when we type "pip install" a package, here we are typing "pip install requests",  +0:33 one of the most popular packages in Python, which is an HTTP client,  +0:37 pip will go and look in a certain location on the Python Package Index.  +0:42 And here you can see it found it, it downloaded version 2.9.1 and it unzipped it,  +0:46 installed it in the right location, cleaned everything up, beautiful.  +0:50 So, this is how we install something on the command line,  +0:52 if you need to install it machine-wide, you will likely have to do  +0:57 "sudo pip install requests" or alternatively on Windows,  +1:00 you will have to running in a command line that is running as administrator.  +1:04 Now, be aware, you really want to minimize doing this  +1:07 because when you install one of these things it runs the setup.py file  +1:10 that comes with the package that thing can have anything at once in it,  +1:14 and it could do anything that that package want to do to your machine, really,  +1:18 you are running as admin some sort of untrusted code,  +1:22 so be aware and try to install it locally,  +1:25 but if you've got to install it machine-wide, this is how you do it.  +1:28 If you have Python 3.3 or earlier, you probably don't have pip.  +1:32 Some of the new versions of Python 2 do have it,  +1:34 but most of the versions of Python 2 also don't have pip,  +1:38 so if you need to get pip, just follow this link and install it, +1:41 then you carry on in exactly the same way.  +1:43 All the newer versions, Python 3.4, and later  +1:46 come with pip included, which is excellent.  +1:49 If you are using PyCharm, PyCharm has a really great support for pip as well, +1:53 here you can see under the preferences tab,  +1:56 we found the project interpreter and you can see it's listing a bunch of packages,  +1:59 a version and the latest version, some of them have little blue arrows,  +2:03 indicating that we are using an older version rather than a newer version.  +2:07 So we could actually upgrade it.  +2:09 The little up arrow in the bottom left, once you select something  +2:12 will let you upgrade it and the plus will pull up a listing like a little search box  +2:15 that you can explore all those 88 thousand packages and more.  +2:18 So if you are using PyCharm, there is a really nice way to see  +2:22 what packages are installed in your active environment and manage them. diff --git a/transcripts/900-appendix-pylang/13.txt b/transcripts/900-appendix-pylang/13.txt new file mode 100644 index 00000000..5180a0de --- /dev/null +++ b/transcripts/900-appendix-pylang/13.txt @@ -0,0 +1,70 @@ +
0:01 One of the challenges of installing packages globally has to do with the versioning.  +0:05 The other really has to do with managing deployments and dependencies.  +0:09 Let's talk about the versioning part first.  +0:11 Suppose my web application I am working on right now  +0:14 requires version 2.9 of requests.  +0:18 But somebody else's project required an older version with older behavior,  +0:22 version 2.6 let's say. I don't think those are actually incompatible,  +0:25 but let's just imagine that they were.  +0:28 How would I install via pip version 2.6 and version 2.9 and keep juggling those,  +0:33 how would I run those two applications on my machine without continually reconfiguring it- +0:37 the answer is virtual environments.  +0:39 And, virtual environments are built into Python 3  +0:43 and are also available through a virtual env package  +0:46 that you can install for Python 2  +0:48 and the idea is this- we can crate basically a copy,  +0:52 change our paths and things like that around so that when,  +0:55 you ask for Python or this looks for Python packages,  +0:58 it looks in this little local environment, we create one of these small environments  +1:02 just for a given application, so we would create one for our web app  +1:06 that uses request 2.9 and another one for the one that uses request 2.6  +1:10 and we would just activate those two depending on which project we are trying to run,  +1:14 and they would live happily side by side.  +1:17 The other challenge you can run into is if you look  +1:19 at what you have installed on your machine,  +1:21 and you run some Python application and it works,  +1:24 how do you know what listed in your environment is actually required to run your app,  +1:28 if you need to deploy it or you need to give it to someone else,  +1:31 that could be very challenging. So with virtual environments +1:34 we can install just the things a given application requires to run  +1:37 and be deployed so when we do something like "pip list",  +1:41 it will actually show us exactly what we need to set up  +1:44 and use for our app to run in production.  +1:47 Typically we tie virtual environments one to one to a given application.  +1:51 So how do we create one? +1:53 This example uses virtual env which we would have to install via pip,  +1:57 you could also use venv, just change virtual env to venv in Python 3  +2:01 and it will have the same effect, but this works,  +2:03 like I said in Python 2 and 3, so here you go.  +2:06 So we are going to run Python 3 and we are going to say run the module, virtual env,  +2:09 and create a new environment into ./localenv.  +2:14 Here you can see it creates a copy from Python 3.5.  +2:17 Then we go into that environment, there is a bin directory  +2:20 and there is an activate program that we can run and notice,  +2:23 we'll use the . (dot) to apply that to this shell  +2:26 and not to create a new separate shell environment for that when it runs +2:30 because we wanted to modify our shell environment, not a temporary one.  +2:34 So we say . activate and that will actually change our environment,  +2:38 you can see the prompt change, if we say "pip", we get the local pip, +2:41 if we ask "which python", you'll see it's this one that is in my user profile  +2:45 not the one in the system.  +2:47 Now, few changes for Windows, if I did exactly the same thing in Windows,  +2:51 I would have .\localenv of course, I might not use Python 3,  +2:56 I just say Python and make sure I have the right path to Python 3  +2:59 because that is not a feature in the Python 3 that comes on Windows, +3:03 and I wouldn't use the source activate you don't need to do that in Windows,  +3:06 but you would call activate.bat, otherwise,  +3:10 it's pretty much the same. Also, the "which" command doesn't exist on Windows,  +3:13 use "where" and it gives you the same functionality.  +3:16 So we can create one of these virtual environments in the terminal,  +3:18 but you might suspect that PyCharm has something for us as well,  +3:21 and PyCharm actually has the ability to create  +3:24 and manage virtual environments for us, +3:26 basically it does what you just saw on the screen there.  +3:30 So here we give it a name, we give it a location here,  +3:32 we say blue_yellow_python, this is going to be for a Blue / Yellow band web application,  +3:37 we are going to base this on Python 3.5.1  +3:39 and we are going to put into my Python environments and under this name.  +3:43 Then I just say OK and boom, off it goes, set it as the active interpreter  +3:46 and manage it just the same as before in PyCharm  +3:49 using its ability to install packages and see what is listed and so on.  diff --git a/transcripts/900-appendix-pylang/14.txt b/transcripts/900-appendix-pylang/14.txt new file mode 100644 index 00000000..59b724ec --- /dev/null +++ b/transcripts/900-appendix-pylang/14.txt @@ -0,0 +1,51 @@ +
0:01 Python has this really interesting concept called slicing.  +0:03 It lets us work with things like lists, here in interesting ways.  +0:07 It lets us pull out subsets and subsequences if you will,  +0:10 but it doesn't just apply to lists,  +0:13 this is a more general concept that can be applied in really interesting way,  +0:17 for example some of the database access libraries,  +0:20 when you do a query what you pulled back,  +0:23 you can actually apply this slicing concept for eliminating the results +0:27 as well as paging and things like that. So let's look at slicing.  +0:31 We can index into this list of numbers like so,  +0:34 we just go to nums list and we say bracket and we give the index,  +0:37 and in Python these are zero-based, so the first one is zero,  +0:40 the second one is one and so on.  +0:42 This is standard across almost every language. +0:44 However, in Python, you can also have reverse indexes +0:48 so if I want the last one, I can say minus one.  +0:50 So this is not slicing, this is just accessing the values.  +0:53 But we can take this concept and push it a little farther.  +0:56 So if I want the first four, I could say 0:4  +1:01 and that will say start at the 0th and go up to but not including the one at index 4.  +1:06 So we get 2, 3, 5, 7, out of our list.  +1:09 Now, when you are doing these slices,  +1:12 any time you are starting at the beginning or finishing at the end,  +1:15 you can omit that, so here we could achieve the same goal by just saying :4,  +1:19 assuming zero for the starting point.  +1:21 So, slicing is like array access but it works for ranges instead of for just individual elements. +1:27 Now if we want to get the middle,  +1:30 we can of course say we want to go from the fourth item, so index 3,  +1:34 remember zero-based, so 3 and then we want to go up to  +1:37 but not including the sixth index value,  +1:40 we could say 3:6 and that gives us 7, 11 and 13.  +1:44 If we want to access items at the end of the list, it's very much like the beginning,  +1:50 we could say we want to go from the sixth element so zero-based,  +1:54 that would be 5 up to the end, so 5:9 and it would be 13, 17, 19, 23,  +1:59 but like I said, when you are either starting at the beginning or ending at the end,  +2:03 you can omit that number, which means you don't have to compute it, that's great,  +2:06 so we could say 5: and then it'll get the last one.  +2:09 But you still need to know where that starts,  +2:12 if we actually wanted 4, so there is a little bit of math there,  +2:15 if you just want to think of it starting at the end and give me a certain number of items,  +2:19 just like where we got the last prime and that came back as 23 when we gave it a minus one,  +2:23 we can do something similar for slicing  +2:26 and we could say I'd like to go start 4 in from the back,  +2:29 so negative 4 and then go to the end.  +2:32 So that's the idea of slicing, it's all about working with subsets of our collection here,  +2:36 the example I gave you is about a list, +2:39 but like I said we could apply this to a database query, +2:42 we could apply this to many things in Python  +2:45 and you can write classes that extend this concept and make it mean whatever you want,  +2:49 so you'll find this is a very useful and common thing to do in Python.  + diff --git a/transcripts/900-appendix-pylang/15.txt b/transcripts/900-appendix-pylang/15.txt new file mode 100644 index 00000000..a7d128fd --- /dev/null +++ b/transcripts/900-appendix-pylang/15.txt @@ -0,0 +1,29 @@ +0:01 Tuples are a lightweight, immutable data structure in Python  +0:04 that's kind of like a list but that can't be changed once you create them.  +0:07 And you'll see many very cool techniques that make Python readable  +0:11 and easy to use are actually clever applications of tuples.  +0:16 On the first line here, we are defining a tuple m,  +0:19 the way you define a tuple is you list out the values and you separate them by commas. +0:23 When you look at it, it appears like the parenthesis are part of the definition,  +0:27 and when you print tuples you'll see that the parenthesis do appear  +0:31 but it's not actually the parenthesis that create them, it's the commas.  +0:35 We want to get the value out over here we want to get the temperature,  +0:37 which is the first value, we would say m[0], so zero-based index into them.  +0:41 If we want the last value, the fourth one,  +0:44 we would say m[3], that's the quality of the measurements. +0:47 Notice below we are redefining m, this time without the parentheses,  +0:50 just the commas and we print it out and we get exactly the same thing again,  +0:54 so like I said, it's the commas that define the tuple not the parentheses,  +0:58 there is a few edge cases where you will actually need to put the parentheses  +1:01 but for the most part, commas.  +1:04 Finally, tuples can be unpacked,  +1:07 or assigned to a group of variables that contain the individual values. +1:11 So down here you can see we have a "t" for temperature,  +1:15 "la" for latitude "lo" for longitude, and "q" for quality,  +1:19 and those are the four measurements in our tuple,  +1:22 we want to assign those and instead of doing like we did above  +1:24 where you index each item out and assign them individually,  +1:27 we can do this all in one shot, so here we can say variable,  +1:32 four variables separated by commas equals the tuple,  +1:34 and that reverses the assignment so you can see "t" has the right value of 22,  +1:39 latitude 44, longitude 19 and the quality is strong.  diff --git a/transcripts/900-appendix-pylang/16.txt b/transcripts/900-appendix-pylang/16.txt new file mode 100644 index 00000000..314929f9 --- /dev/null +++ b/transcripts/900-appendix-pylang/16.txt @@ -0,0 +1,30 @@ +0:01 In the previous section we discussed tuples, and how they are useful.  +0:04 Sometimes these anonymous tuples that we discussed are exactly what you need,  +0:08 but oftentimes, it's very unclear what values are stored in them,  +0:12 especially as you evolve the software over time.  +0:15 On the second line here, we have "m", a measurement we are defining  +0:18 this time it's something called a named tuple  +0:21 and just looking at that definition there on what we are instantiating  +0:24 the measurement, it's not entirely clear the first value is the temperature,  +0:28 the second value is the latitude, this third value is a longitude, and so on. +0:32 And we can't access it using code that would treat it like a plain tuple,  +0:36 here we say the temperature is "m" of zero  +0:39 which is not clear at all unless you deeply understand this  +0:42 and you don't change this code, but because we define this as a named tuple,  +0:47 here at the top we define the type by saying  +0:50 measurement is a collections.namedtuple,  +0:53 and it's going to be called a measurement,  +0:55 for error purposes and printing purposes and so on,  +0:58 and then you define a string which contains all the names for the values.  +1:02 So over here you are going to say this type of tuple temperature's first, then latitude,  +1:06 then longitude, then quality, and what that lets us do is access those values by name.  +1:11 So instead of saying "m" of zero temperature,  +1:13 we say m.temp is the temperature, and the quality is m.quality.  +1:16 Named tuples make it much easier to consume these results  +1:20 if you are going to start processing them  +1:23 and sharing them across methods and things like that. +1:25 Additionally, when you print out a named tuple it actually prints a friendlier version  +1:29 here at the bottom you see measurement of temperature, latitude, longitude, and quality.  +1:33 So most of the time if you are thinking about creating a tuple,  +1:36 chances are you should make a named tuple.  +1:39 There is a very small performance overhead but it's generally worth it.  diff --git a/transcripts/900-appendix-pylang/17.txt b/transcripts/900-appendix-pylang/17.txt new file mode 100644 index 00000000..d9dca4ac --- /dev/null +++ b/transcripts/900-appendix-pylang/17.txt @@ -0,0 +1,34 @@ +
0:01 Classes and object-oriented programming are very important parts  +0:04 of modern programming languages and in Python, they play a key role.  +0:08 Here we are creating a class that we can use in some kind of game  +0:12 or something that works with creatures.  +0:15 So to create a creature class, you start with the keyword class, +0:18 and then you name the type and you say colon  +0:21 and everything indented into that block  +0:23 or that code suite to do with the class is a member of the class.  +0:27 Most classes need some kind of initialization to get them started,  +0:30 that's why you create a class, we want them to start up all ready to go  +0:34 and bundled up with their data and then combine that with their methods,  +0:38 their behaviors and they make powerful building blocks in programming.  +0:42 So most classes will have an initializer,  +0:45 and the initializer is where you create the variables and validate  +0:48 that the class is getting setup in correct way, for example making sure the name is not empty,  +0:52 the level is greater than zero, but less than a 100, something like that.  +0:56 Now this is often refered to as __init__ sometimes just init,  +1:01 or even a constructor and these dunder methods  +1:04 because they have double underscores at the beginning and at the end,  +1:07 they are part of the Python data model which lets us control many things about classes,  +1:10 so you'll see a lot of methods like this but the __init__ method  +1:13 is probably the most common on classes.  +1:16 If you want to create behaviors with your class,  +1:19 and if you have a class that's almost certainly part of what you are going to do,  +1:22 you are going to define methods just like functions that are standalone,  +1:26 methods or functions that are parts of classes  +1:29 and you define them in exactly the same way,  +1:32 the only difference is typically they take a self parameter,  +1:35 the self parameter is passed explicitly everywhere when you are defining the class,  +1:40 some languages have a "this" pointer, that's sort of implicit but in Python,  +1:45 we call this self and it refers to the particular instance of the creature that exists,  +1:50 you might have many creatures but the self is the one that you are working with currently.  +1:54 So just be aware you have to pass that explicitly everywhere  +1:58 unless you have what is called a class method or a static method.  diff --git a/transcripts/900-appendix-pylang/18.txt b/transcripts/900-appendix-pylang/18.txt new file mode 100644 index 00000000..e26236be --- /dev/null +++ b/transcripts/900-appendix-pylang/18.txt @@ -0,0 +1,30 @@ +
0:01 When you are new to object-oriented programming,  +0:03 the idea of classes and objects often can seem interchangeable  +0:07 and some people use them interchangeably; that's not really correct  +0:12 and so let's take just a moment and really clarify the relationship  +0:15 and differences between classes and objects.  +0:18 So here we have a Creature class, you can it has an initializer and a walk method,  +0:23 and notice that the walk method does something different if the creature is powerful,  +0:27 if its power is greater than 10 versus if it's lower.  +0:30 This class is a blueprint for creating creatures.  +0:34 We could create a squirrel, we could create a dragon,  +0:37 we could create a tiger, and those would all be specific  +0:40 objects or instances of the Creature class. +0:43 So down here we’re going to create a squirrel and a dragon,  +0:46 and notice the squirrel is created with power 7, the dragon is created with power 50.  +0:50 Now these are both creatures, but they are now distinct things in memory.  +0:55 Objects are created via classes and the squirrel object is somewhere in memory  +1:00 and it has a power 7 and it has this walk behavior it gets from its class,  +1:03 but all of its variables are specific to it.  +1:07 We have also the dragon creature, with its own variables,  +1:10 so it's power is 50 and if we change its power, it won't change the squirrel  +1:13 or any other creature, just the dragon. +1:15 And when we call squirrel.walk(), the squirrel is going to walk in some specific way  +1:19 based on its own power.  +1:22 So you can see the Creature class test is a power greater than 10 or less than 10  +1:26 and if it's greater than 10, it does something special,  +1:29 maybe it walks in a powerful way versus a non-powerful way, who knows, +1:32 but that will mean the squirrel walks in one way  +1:35 and the dragon walks in another way,  +1:38 even though they are both instances of the Creature class.  +1:40 So I hope that clears up the relationship between classes and objects.  diff --git a/transcripts/900-appendix-pylang/19.txt b/transcripts/900-appendix-pylang/19.txt new file mode 100644 index 00000000..a3b6166f --- /dev/null +++ b/transcripts/900-appendix-pylang/19.txt @@ -0,0 +1,34 @@ +
0:01 A key design feature for working with classes and object-oriented programming  +0:04 is modeling and layers, going from the most general to the most specific.  +0:09 So, we started with a creature class,  +0:12 and a creature class has a name and a level and it's just a generic creature, +0:16 it could be anything, so it could be a squirrel as we saw,  +0:20 it could be a dragon, it could be a toad.  +0:23 Any kind of creature we can think of, we could model with the original creature class,  +0:26 and that's great because it's very applicable but there are differences  +0:30 between a dragon and a toad, for example,  +0:33 maybe the dragon breathes fire, not too many toads breed fire,  +0:36 and so we can use inheritance to add additional specializations to our more specific types, +0:43 so we can have a specific dragon class, which can stand in for a creature,  +0:47 it is a creature but it also has more behaviors and more variables.  +0:51 Here we have our initializer, the __init__  +0:54 and you see we take the required parameters  +0:57 and data to pass along to the creature class,  +1:00 in order to create a creature, in order for the dragon to be a creature,  +1:03 it has to supply a name and a level,  +1:05 so we can get to the creature's initializer saying super().__init__  +1:09 and pass name and level and that allows the creature to do  +1:12 whatever sort of setup it does when it gets created,  +1:14 but we also want to have a scale thickness for our dragon,  +1:17 so we create another field specific only to dragons,  +1:20 and we say self.scale_thickness = whatever they passed in.  +1:23 So in addition to having name and level we get from Creature,  +1:26 we also have a scale thickness,  +1:28 so that adds more data we can also add additional behaviors,  +1:30 here we have added a breed_fire method.  +1:33 So the way we create a derived type in Python,  +1:36 is we just say class, because it is a class, the name of the class, Dragon,  +1:40 and in parenthesis the name of the base type.  +1:44 And then, other than that, and using "super",  +1:46 this is basically the same as creating any other class. + diff --git a/transcripts/900-appendix-pylang/2.txt b/transcripts/900-appendix-pylang/2.txt new file mode 100644 index 00000000..cc01f792 --- /dev/null +++ b/transcripts/900-appendix-pylang/2.txt @@ -0,0 +1,15 @@ +
0:02 Variables are the heart of all programming languages.  +0:05 And variables in Python are no nonsense.  +0:08 Let's look at the top one, I am declaring a name variable  +0:11 and assigning it the value of Michael,  +0:13 and age variable and assigning it the variable of 42.  +0:16 Some languages you have to put type descriptors in the front  +0:19 like you might say string name, integer age,  +0:22 you might put semicolons at the end, things like that.  +0:25 None of that happens in Python, it's about as simple as it possibly can be.  +0:28 So we can declare them and assign them to constant values,  +0:32 we can increment their value in this case of the birthday  +0:35 and we can assign them to complex values like the hobby,  +0:39 which is really the list or array of strings, the hobbies that we have.  +0:42 So we assign these on creation, and we can even take the return values of functions  +0:47 and assign them to these variables, like so.  diff --git a/transcripts/900-appendix-pylang/20.txt b/transcripts/900-appendix-pylang/20.txt new file mode 100644 index 00000000..b4203ffa --- /dev/null +++ b/transcripts/900-appendix-pylang/20.txt @@ -0,0 +1,17 @@ +
0:00 By leveraging inheritance, we can crate  +0:02 a wide range of types that model our world very well,  +0:06 in this example on the screen we have a wizard  +0:08 and the wizard knows how to battle a variety of creatures,  +0:11 we have small animals that are easier to defeat,  +0:13 we have standard creatures, we have dragons, we have wizards.  +0:16 All of these types are derived from the creature type.  +0:20 Now, the wizard class, you can see, can attack any of these creatures, +0:24 and the reason the wizard class can attack them  +0:26 is it's built, it's programmed to understand what a creature is  +0:30 and attack it and any of the derived classes can be used interchangeably.  +0:34 So this means we can continue to evolve and generate  +0:38 new and interesting creature derived types  +0:41 and we don't have to change our wizard code to understand how to battle them.  +0:45 That's great, polymorphism is essential in any object-oriented language,  +0:50 and that's absolutely true in Python as well.  + diff --git a/transcripts/900-appendix-pylang/21.txt b/transcripts/900-appendix-pylang/21.txt new file mode 100644 index 00000000..981ccfd1 --- /dev/null +++ b/transcripts/900-appendix-pylang/21.txt @@ -0,0 +1,46 @@ +
0:01 Dictionaries are essential in Python.  +0:03 A dictionary is a data structure that very efficiently stores  +0:07 and can rapidly look up and retrieve items by some kind of key.  +0:11 You can think of this as kind of a primary key in a database  +0:14 or some other unique element representing the thing that you want to look up.  +0:18 Dictionaries come in a couple of forms, the form you see on the screen here +0:22 we put multiple related pieces of information together that we can lookup,  +0:27 so here maybe we have the age of a person and their current location.  +0:31 Other types of dictionaries are maybe long lists of homogeneous data  +0:35 maybe a list of a hundred thousand customers  +0:37 and you can look them up by key which is say their email address, +0:41 which is unique in your system.  +0:43 Whichever type you are working with, the way they function is the same.  +0:45 We can create dictionaries in many ways, three of them here are on the screen;  +0:49 the first block we initialize a dictionary by name and then we set  +0:53 the value for age to 42, we set the location to Italy.  +0:56 We can do this in one line by calling the dict initializer  +0:59 and pass the key value argument, we can say dict age and location  +1:04 or we can use the language syntax version, if you will,  +1:07 with curly braces and then key colon value,  +1:10 and it turns out all three of these are equivalent,  +1:13 and you can use whichever one makes the most sense for your situation,  +1:15 so here the created and then populated,  +1:18 here created via the name and keyword arguments  +1:21 or here created via the language structures.  +1:24 The fact that this is so built-in to the language to tell you dictionaries are pretty important. +1:28 Now, if we want to access an item, from the dictionary,  +1:31 we just use this index [ ] and then we pass the key whatever the key is.  +1:36 In this case, we are using the location or the name of the property  +1:40 we are trying to look up so we are asking for the location.  +1:43 My other example if we had a dictionary  +1:45 populated with a hundred thousand customer objects, +1:47 and the keyword is the email address, you would put in the email  +1:51 for the specific customer you are looking for.  +1:53 Now, if we ask for something that doesn't exist, this will crash with a KeyError exception,  +1:57 so for example if I said "info['height']", there is no height, so it will crash.  +2:01 there is a wide range of ways in which we can get the value out  +2:05 or check for the existence of a value,  +2:07 but the most straightforward is to use it in this "in" operator,  +2:10 so here we can test whether age is in this info object  +2:14 we can say "if age in info" and then it's safe to use info of age.  +2:18 So this is just scratching the surface of dictionaries,  +2:22 you'll see that they appear in many places and they play a central role  +2:25 to many of the internal implementations in Python,  +2:28 so be sure to get familiar with them.  + diff --git a/transcripts/900-appendix-pylang/22.txt b/transcripts/900-appendix-pylang/22.txt new file mode 100644 index 00000000..02b3ff15 --- /dev/null +++ b/transcripts/900-appendix-pylang/22.txt @@ -0,0 +1,45 @@ +
0:01 The primary way error handling is done in Python is exceptions. +0:04 Exceptions interrupt the regular flow, execution of your methods and your code,  +0:08 and unwind and stop executing a code until they find what's called an except clause,  +0:13 that is the explicit error handling that you've written,  +0:16 or if they never find one, your application just crashes.  +0:20 That's not amazing, so let's talk about error handling.  +0:22 Here we have three methods on the screen, method one, two and three,  +0:25 and maybe there are potentially error-prone, something can go wrong,  +0:29 maybe work with the file system, a web service, a database,  +0:31 things that are not always well known or can't rely on them always working. +0:36 It could even just be that someone's input incorrect data  +0:39 and there is going to be a problem there as well.  +0:41 So if we want to make sure that when we run these bits of code,  +0:43 we can catch and handle those errors,  +0:45 we have to put this into what's called a "try...except" block.  +0:48 So we put a "try:", we indent the code, so it is part of the try block,  +0:52 then we add the error handling the except block and it could just be except:  +0:56 an empty catch-all, which is not really recommended.  +1:00 In this case, we are going to catch a particular type of exception,  +1:04 one of the most based types that we'll catch many of the errors  +1:07 that we might not expect, so we'll just say "Exception as x".  +1:10 We say as x then we can get a hold of the actual object that is the exception  +1:14 and ask it what went wrong. So, look at the error message,  +1:17 if this is a custom database error, maybe it has the record id that caused the problem,  +1:22 or something like that, who knows.  +1:24 It depends on the type of exception that you get.  +1:26 So here is a general one, but we're only handling errors in a general way,  +1:30 we can't handle say database exceptions differently than web service exceptions,  +1:36 so we can have multiple except blocks with multiple exception types,  +1:40 and Python will find the most specific one,  +1:43 so if we want to make sure that we can catch when we have a connection error,  +1:46 trying to talk to a web service or something on the network, and it won't connect,  +1:51 we might want to handle that differently than say the users typed in something incorrect. +1:56 So we would add another except clause with the more specific type.  +2:00 The order of these except blocks is really important, the way it works,  +2:03 is Python will try to run the code, if an exception comes up, it will just go through  +2:07 and ask does this exception object derived from the first thing it finds,  +2:11 and the next, and the next, and if the first one answers yes to, +2:14 it will just stop and that's the error handling at run.  +2:17 So if we switch these, almost everything including connection error derives from exception, +2:22 so it would run the code, throw the exception and ask,  +2:26 hey, does this exception derive from exception,  +2:29 yes, boom handle the general error and it will never make it to the connection error  +2:33 so it has to go from most specific error handling to least  +2:36 or most general error handling.  diff --git a/transcripts/900-appendix-pylang/23.txt b/transcripts/900-appendix-pylang/23.txt new file mode 100644 index 00000000..b49cb65f --- /dev/null +++ b/transcripts/900-appendix-pylang/23.txt @@ -0,0 +1,37 @@ +
0:01 In Python, functions are first class citizens,  +0:03 and what that means is they are represented by a class instances of them,  +0:07 particular functions are objects they can be passed around  +0:11 just like other custom types you create just like built-in types, like strings and numbers.  +0:16 So we are going to leverage that fact in a simple little bit of code I have here  +0:19 called find significant numbers.  +0:21 Now, maybe we want to look for all even numbers,  +0:24 all odd numbers, all prime numbers, any of those sorts of things.  +0:27 But this function is written to allow you to specify what it means  +0:32 for a number to be significant, so you can reuse this finding functionality  +0:36 but what determines significance is variable,  +0:40 it could be specified by multiple functions being passed in  +0:43 and that's what we are calling predicate  +0:45 because this ability to pass functions around and create and use them in different +0:50 ways especially as parameters or parts of expressions, +0:53 Python has this concept of lambdas. +0:56 So let's explore this by starting with some numbers,  +0:58 here we have the Fibonacci numbers  +1:00 and maybe we want to find just the odd Fibonacci numbers.  +1:03 So we can start with the sequence and we can use this "find significant numbers" thing  +1:07 along with the special test method we can write the checks for odd numbers.  +1:11 So, in Python we can write this like so,  +1:14 and we can say the significant numbers we are looking for is... call the function,  +1:17 pass the number set we want to filter on  +1:19 and then we can write this lambda expression instead of creating the whole new function. +1:23 So instead of above having the def and a separate block  +1:26 and all that kind of stuff, we can just inline a little bit of code,  +1:30 so we indicate this by saying lambda and then we say the parameters,  +1:34 there can be zero, one or many parameters,  +1:37 here we just have one called x, and we say colon to define the block that we want to run,  +1:42 and we set the expression that we are going to return when this function is called,  +1:46 we don't use the return keyword we just say when you call this function  +1:49 here is the thing that it does in return, so we are doing a little test, True or False,  +1:53 and we ask "if x % 2 == 1" that's all the odd numbers, not the even ones,  +1:58 so when we run this code it loops over all the Fibonacci numbers  +2:01 runs a test for oddness and it pulls out as you can see below  +2:05 just the odd ones, for example 8 is not in there.  diff --git a/transcripts/900-appendix-pylang/24.txt b/transcripts/900-appendix-pylang/24.txt new file mode 100644 index 00000000..8e82dd0c --- /dev/null +++ b/transcripts/900-appendix-pylang/24.txt @@ -0,0 +1,51 @@ +
0:01 Python has a great declarative way to process a set of items  +0:05 and either turn it into a list, a dictionary, a set or a generator.  +0:09 Let's look at the list version through an example. +0:13 Here we have some get_active_customers method,  +0:16 maybe it goes to a database, maybe it just goes to some data structure,  +0:19 it doesn't really matter, but it comes back with an iterable set of users,  +0:23 so we could loop over all of the users, using a "for...in" loop to find the users  +0:29 who have paid today and get their usernames and put that into a list.  +0:33 So what we do is we create a list, some name paying usernames  +0:38 and we'd "for...in" over those to loop over all of them and then we do a test,  +0:41 we'd say if that particular user's last purchase was today  +0:45 then append to their username to this paying usernames list.  +0:50 And then in the end, we'd have a list, which is all the usernames  +0:53 of the customers you bought something from us today. +0:56 This would be an imperative users' search,  +0:59 an imperative style of programming, where you explicitly say all the steps,  +1:02 let's see how we could do this instead with the list comprehension.  +1:05 Here you'll see many of the same elements,  +1:09 and it looks like we are declaring a list, so [ ] in Python means declare an empty list,  +1:14 but there is stuff in the middle.  +1:16 The way you read this you kind of got to piece it together,  +1:18 maybe top to bottom is not necessarily the best way to put this all together  +1:22 but let's go top to bottom for a minute and then I'll pull out the pieces for you.  +1:25 So, we are going to get the name of the user,  +1:27 and we are going to later introduce a variable called "u",  +1:30 which is the individual user for the set we are going through, so we'd say u.name,  +1:33 that's like our projection that we want, and there is a "for...in" statement,  +1:37 like we had before, where we get the active customers +1:40 and we are going to process them,  +1:42 and then there is some kind of test whether or not that particular user should be in this set. +1:46 So, we set the source, that's going to be out get_active_customers  +1:50 and we are going to express that we are iterating over that for "u" in that set  +1:55 and "u" declares the local variable that we are going to work with,  +1:58 we are going to filter on that with an "if" test,  +2:00 and finally we are going to do some kind of projection,  +2:03 we could just say "u" to get all the users, here we want all the usernames  +2:06 so we say u.name. Now, there are multiple structures like this in Python,  +2:11 we could have parenthesis that would generate a generator,  +2:13 but as I said before, [ ] represents list, and so when you have the [ ] here,  +2:18 you know what is going to come out is a list, and this is a list comprehension.  +2:23 Once you get used to it, you'll find this style of programming is a little cleaner  +2:26 and a little more concise.  +2:29 It's also different in another important way,  +2:31 because this can be just part of a larger expression,  +2:34 this could be say in inline argument to a method you are calling.  +2:38 Or, you could chain it together with other comprehensions,  +2:42 or other types of processing.  +2:44 The imperative style of programming required separate language structures  +2:48 that required their own blocks,  +2:51 so you can't really compose "for...in" loops but you can compose these comprehensions  +2:54 which makes then really useful in places the "for...in" loop wouldn't be.  diff --git a/transcripts/900-appendix-pylang/25.txt b/transcripts/900-appendix-pylang/25.txt new file mode 100644 index 00000000..225f3a9c --- /dev/null +++ b/transcripts/900-appendix-pylang/25.txt @@ -0,0 +1,13 @@ +
0:01 So you've reached the end of the Python refresher and reference,  +0:04 if you feel like you still need more help getting started with Python, +0:08 you want to practice more, dig much more into the language features that we just talked about,  +0:13 then please consider my Python Jumpstart By Building Ten Apps course.  +0:17 You can find it at talkpython.fm/course,  +0:20 and it covers almost exactly the same set of topics  +0:23 that we covered in the refresher as well as more,  +0:26 but it does it by building ten applications, seeing them in action,  +0:29 writing tons of code and it's done over seven hours,  +0:33 rather than packing just the concepts into a quick refresher.  +0:37 So, check out the Jumpstart Course, +0:40 if you want to go deeper into Python the language  +0:43 and its features so that you can get the most out of this course.  diff --git a/transcripts/900-appendix-pylang/3.txt b/transcripts/900-appendix-pylang/3.txt new file mode 100644 index 00000000..935b25d0 --- /dev/null +++ b/transcripts/900-appendix-pylang/3.txt @@ -0,0 +1,29 @@ +
0:03 Any interesting program has conditional tests  +0:06 and various branching control structures in it.  +0:08 And  many of these control structures you have to pass some kind of test,  +0:12 a boolean, a True or False value.  +0:15 Go down this path, or don't. Continue looping through this loop or stop.  +0:18 Let's talk for a moment about this general idea of True and False in Python;  +0:22 and I am referring to it as truthiness, because in Python  +0:26 all objects are imbued with either a True value or a False value.  +0:30 And the easiest way to understand this is to think of the list of things that are False,  +0:34 they are clearly spelled out, it's right here- False, the keyword False,  +0:37 the boolean keyword False is false obviously. +0:40 But things that might not be so obvious to that are False,  +0:43 are as well, for example any empty sequence,  +0:46 so an empty list, an empty dictionary, an empty set, empty strings.  +0:50 All of these things are False, even though they point to a real life object.  +0:55 We also have the zero values being False,  +0:58 so integer zero and floating point zero - False. +1:02 Finally, if you have some kind of pointer and it points to nothing,  +1:05 so the keyword none, that is also considered to be False.  +1:09 Now, there is this small addition where you can overwrite  +1:12 certain methods in your custom types to define False,  +1:15 but outside of this list, and those implementations, everything else is true.  +1:19 So if it's not in this list and it's not a custom implementation of a magic method  +1:23 that describes the truthiness of an object, you pretty much know the way it works.  +1:27 Now, in Python, we often leverage this truthiness or falseness of objects,  +1:32 so we might do an "if" test just on a list to see if it's empty,  +1:37 rather than testing for the length of the list to be greater than zero, things like that.  +1:41 So you'll run into this all the time  +1:43 and it's really important to keep in mind what's True and what's False.  diff --git a/transcripts/900-appendix-pylang/4.txt b/transcripts/900-appendix-pylang/4.txt new file mode 100644 index 00000000..fa42fd76 --- /dev/null +++ b/transcripts/900-appendix-pylang/4.txt @@ -0,0 +1,25 @@ +
0:02 The most common control flow structure in programming has to be the "if" statement.  +0:06 Let's see how we do "if" statements in Python.  +0:09 Here we have a simple console program,  +0:12 probably this bit of code is running in some kind of a loop or something like that,  +0:15 and we are asking the user for input saying "what is your command?",  +0:19 either list the items by typing L or exit from the program by hitting x.  +0:23 And we capture that string and we say "if", so simple keyword "if"... some boolean test,  +0:29 so in this case the command is == 'L'  +0:32 so that means is the command equal to L: (colon)  +0:34 and then define what we are going to do in that case.  +0:37 In this case we are going to list the items, we could do multiple lines,  +0:40 we are just doing one here.  +0:42 Now we don't say "else if", in Python we say "elif", for short,  +0:45 but then we just have another test,  +0:48 so if it's not L and the command happens to be x, then we are going to exit.  +0:51 And those are the two options that we are expecting, +0:54 but if we get something that we don't expect, like "hello there",  +0:57 or empty enter or something like that,  +1:00 we'll be in this final bit here where it says "Sorry, that wasn't understood".  +1:04 So we start with "if" some kind of boolean expression, and remember,  +1:08 we could just say "if" command: and leverage the truthiness of that value,  +1:12 and that would run if they provided some kind of input at all,  +1:15 but if we want to test for else, we say if command == 'L',  +1:18 we have these additional as many as you want "else if" tests  +1:21 and there is a final optional "else" clause.  diff --git a/transcripts/900-appendix-pylang/5.txt b/transcripts/900-appendix-pylang/5.txt new file mode 100644 index 00000000..8db11de5 --- /dev/null +++ b/transcripts/900-appendix-pylang/5.txt @@ -0,0 +1,23 @@ +
0:02 Sometimes within a control structure like if or while loops, things like that,  +0:05 we need to have complex tests  +0:07 tests against more than one variable and negations, things like that.  +0:10 So, here is a pretty comprehensive example of testing for both multiple values  +0:15 as well as taking over the precedence by using parenthesis and negation using not.  +0:20 many languages use symbols for this combination,  +0:23 like the C-based languages use double ampersand for and, +0:27 and exclamation mark for not, those kinds of things.  +0:30 Python is more verbose and uses the English words.  +0:33 So here we are going to test for two conditions that both have to be True,  +0:37 it's not the case that x is truthy so x has to be falsie, from the previous discussions,  +0:43 so an empty sequence, None, zero, are False, something like that,  +0:47 and the combination of one of two things- z is not equal to two or y itself is falsie.  +0:53 So, using this as an example,  +0:55 you should be able to come up with pretty comprehensive conditional statements.  +0:59 Now, one final note is Python is a short circuiting conditional evaluation language,  +1:04 for example, if x was True, the stuff to the right and the end would not be evaluated.  +1:11 You might wonder why that matters, a lot of times it doesn't, in this case, nothing really would happen.  +1:15 Sometimes you want to work with like sub values of an object,  +1:19 so you might test that x is not None,  +1:22 so you would say "if x and x.is_registered" or something like that.  +1:26 Whereas if you just said x.is_registered, x was None,  +1:29 your app of course would crash.  diff --git a/transcripts/900-appendix-pylang/6.txt b/transcripts/900-appendix-pylang/6.txt new file mode 100644 index 00000000..76e28fc9 --- /dev/null +++ b/transcripts/900-appendix-pylang/6.txt @@ -0,0 +1,31 @@ +
0:01 In Python we have a fantastically simple way  +0:04 to work with collections and sequences.  +0:06 It's called the "for...in" loop and it looks like this.  +0:08 You just say for some variable name in some collection,  +0:13 so here we have "for item in items" and that creates the variable called item  +0:16 and we are looping over the collection items,  +0:18 it just goes through them one at a time, so here it will go through this loop three times,  +0:22 first time it will print the item is "cat", the second time it will print the item is "hat"  +0:26 and then finally the item is "mat".  +0:29 And then it will just keep going, it will break out the loop and continue on.  +0:31 Some languages have numerical "for" loops, or things like that,  +0:34 in Python there is no numerical "for" loop,  +0:37 there is only these for in loops working with iterables and sequences.  +0:41 Because you don't have to worry about indexes and checking links  +0:44 and possible off-by-one errors, you know,  +0:46 is it less than or less than or equal to, it goes in the test in the normal "for" loop.  +0:50 This is a very safe and natural way to process a collection.  +0:54 Now, there may be times when you actually need the number,  +0:57 if you want to say the first item is "cat", the second item is "hat",  +0:59 the third item is "mat", this makes it a little bit challenging.  +1:04 Technically, you could do it by creating an outside variable, and incrementing, +1:06 but that would not be the proper Pythonic way.  +1:09 The Pythonic way is to use this enumerate function, which takes a collection  +1:13 and converts it into a sequence of tuples  +1:17 where the first element in the tuple is this idx value, that's the index, the number.  +1:21 And the second item is the same value that you had above.  +1:24 So first time through its index is zero, item is cat;  +1:27 second time through, index is one, item is hat, and so on.  +1:30 So these are the two primary ways to loop over collections in Python. +1:35 Remember, if you need to get the index back,  +1:38 don't sneak some variable in there, just use enumerate.  diff --git a/transcripts/900-appendix-pylang/7.txt b/transcripts/900-appendix-pylang/7.txt new file mode 100644 index 00000000..58e7a564 --- /dev/null +++ b/transcripts/900-appendix-pylang/7.txt @@ -0,0 +1,19 @@ +0:01 Functions are reusable blocks of functionality.  +0:04 And of course, they play an absolutely central role in Python.  +0:07 Now, in Python we can have functions that are just stand alone, isolated functions,  +0:11 and these are quite common,  +0:13 or we can have functions bound to classes and objects +0:16 that bind together specific data about an object along with those behaviors,  +0:21 we call those methods.  +0:23 The way we define them, interact with them, is basically the same,  +0:26 regardless whether they are functions or methods.  +0:28 Here you can see we have a main method, we want to call it,  +0:31 it takes no parameters, and returns nothing or nothing that we care about, +0:35 so we just say main open close parenthese, like so, +0:37 we can also call functions that take arguments,  +0:40 here is a function called input, and it gathers input from the user, on the consoles,  +0:44 it will give them a prompt, and this argument we are passing here is a string,  +0:48 and this is the prompt to share to the user,  +0:50 pauses the input on the console and waits for them to type something and hit enter,  +0:54 when they do, the return value comes back  +0:57 and is stored in this new variable called "saying".  \ No newline at end of file diff --git a/transcripts/900-appendix-pylang/8.txt b/transcripts/900-appendix-pylang/8.txt new file mode 100644 index 00000000..d42ce322 --- /dev/null +++ b/transcripts/900-appendix-pylang/8.txt @@ -0,0 +1,32 @@ +
0:00 You just saw how to call functions.  +0:02 Now let's really quickly cover how to create functions.  +0:05 Now, I should say right when we get started that there is a lot of flexibility,  +0:09 more than most languages in Python functions and methods,  +0:12 and so we are just going to scratch the surface here,  +0:14 and not really get into all the details.  +0:17 So the keyword to define functions is def.  +0:20 We always start with def and then some function name  +0:23 and regardless whether these are methods in classes or standalone functions,  +0:26 def is the keyword and then we say the name,  +0:29 and then we have a variety of arguments or if we have no arguments,  +0:32 we can just leave this empty.  +0:34 But here we have two positional required arguments,  +0:37 we could also make these optional by specifying default values,  +0:41 we can create what are called named arguments  +0:44 where you have to say the name of the argument to pass the value  +0:46 instead of using the position.  +0:48 We can also take additional extra arguments  +0:50 that the method was not necessarily designed for, but, like I said,  +0:53 we are not going to dive too deeply into those,  +0:55 here is the basic way to define the method-  +0:57 def, name, parenthesis arguments and then colon +1:01 to define the block that is the method.  +1:03 Here we would probably do something like validate the arguments  +1:07 like throw some kind of ValueError or something,  +1:09 if name is None or email is None, something like that.  +1:12 Then we are going to do our actual logic of the function,  +1:15 create it using the database and here we are going to somehow get that information back  +1:19 and to this db_user, maybe we want to tell whoever called  +1:22 create_user the id of the new user that was just created,  +1:25 so we'll use a return value and we'll return the id  +1:28 that was the database generated id for when we create this user.  diff --git a/transcripts/900-appendix-pylang/9.txt b/transcripts/900-appendix-pylang/9.txt new file mode 100644 index 00000000..4b93ae05 --- /dev/null +++ b/transcripts/900-appendix-pylang/9.txt @@ -0,0 +1,22 @@ +
0:01 Working with files in Python, especially text files  +0:03 is something that you are likely to need in your application.  +0:06 So let's take a really simple example.  +0:09 Here we are going to create a file,  +0:11 we have three items in our data structure we want to save on the three separate lines,  +0:15 so we have cat, hat, mat and a list, and these are just strings.  +0:18 We are going to use the "open" method,  +0:20 and the "open" method takes a file name and a modifier,  +0:23 and then this "open" method, the open string that comes back  +0:26 can be used as a context manager, so we are putting into a "with" block,  +0:30 and naming the variable fout for file output,  +0:33 and this automatically closes the file stream, as soon as we leave this with block.  +0:38 So that's really nice and safe, makes sure we flush, it close it, all those kinds of things.  +0:42 Once we get the file open, we are going to loop over each item  +0:45 and we are just going to say "fout.write" and pass it the item, so cat, hat or mat.  +0:50 Now, write does not append a new line, it just writes characters to the file,  +0:54 so we want to say "\n" to append a new line,  +0:57 so each one of these items up here is on a separate line in the file.  +1:01 And notice this "w" modifier, this means write only and truncate the file if it exists.  +1:06 We could also say "a" for append, "a+" for create an append  +1:11 or "r" if we just wanted to read from the file but not write to it.  +1:15 There is also a "b" modifier for binary files, but you'll use that less often.  diff --git a/transcripts/91-sqlalchemy/1.txt b/transcripts/91-sqlalchemy/1.txt new file mode 100755 index 00000000..80580c23 --- /dev/null +++ b/transcripts/91-sqlalchemy/1.txt @@ -0,0 +1,31 @@ +00:00 Are you ready to have some fun playing with the database? +00:03 Well, we're going to talk about an +00:04 amazing technology called SQLAlchemy. +00:07 And this is probably the best way, +00:09 and also, probably the most popular way +00:12 to access relational databases. +00:15 Previously, you learned about SQLite, +00:17 and SQLAlchemy will of course talk to SQLite, +00:20 but it'll talk to all kinds of databases. +00:23 You can find it at SQLAlchemy.org. +00:26 It's an object relational mapper. +00:28 So when we saw SQLite before, you just created strings, +00:31 and you said, "Create this table," +00:33 or, "Select this from wherever." +00:36 You would write in line SQL, and that was tied to SQLite. +00:40 Well, SQLAlchemy works in a much higher level. +00:42 What we're going to do is we're going to create classes, +00:44 and we're going to model the database shape in our classes. +00:49 SQLAlchemy will actually even create +00:51 the database from the classes, alright? +00:53 So this is really, really powerful. +00:55 We can point at almost any relational database, +00:57 and then we work in these high level Python constructs, +01:00 making it very, very easy for us to write the code. +01:03 We don't have to think in the SQL query language, +01:05 we just think in Python, and it just works. +01:08 It's up to SQLAlchemy to convert that +01:10 to the SQL query language. +01:12 It's really, really easy to get started. +01:14 It's extremely flexible and powerful. +01:16 And we're going to have a lot of fun building an app with it. diff --git a/transcripts/91-sqlalchemy/10.txt b/transcripts/91-sqlalchemy/10.txt new file mode 100755 index 00000000..c0af36c2 --- /dev/null +++ b/transcripts/91-sqlalchemy/10.txt @@ -0,0 +1,91 @@ +00:00 Let's quickly review some of the concepts that we learned. +00:03 We saw everything started with our model base +00:05 and we got that by calling declarative base +00:07 that gave us a type back +00:10 which then we could use to derive from. +00:12 So we get this base class, +00:13 and then we derive all of our various entities from it. +00:17 In this particular example +00:18 when we're looking at an online record store +00:20 with albums, tracks, purchases, users, and so on. +00:23 We'd create an album, track, and purchase +00:24 all deriving from our SQLAlchemy base that we create. +00:28 When we want to model one of these classes, +00:30 we want to use the class to model some data. +00:33 We set the dunder table name, +00:35 pick out the various columns we need. +00:36 So here we have a primary key auto-incrementing id. +00:39 We have a name, year, price. +00:42 We saw that we can put uniqueness constraints. +00:44 We can put indexes to make queries on that data +00:47 or ordering by that data super, super fast. +00:49 And we can even set up relationships. +00:51 But like I said, we're not going into relationships. +00:53 We've already spent a lot of time on discussing SQLAlchemy. +00:56 It's time for you to jump in and write some code. +00:59 Once we've modeled all of the classes, +01:01 then we need to actually create the database connection +01:04 and make sure the database is in sync +01:06 with what we define the classes to be. +01:08 Here we're going to create a connection string +01:10 which is just a sqlite:///. +01:12 Put it in a file. +01:14 We'll create an engine based on that connection string. +01:16 We're going to create, +01:17 go to the metadata for the SQLAlchemy base +01:19 and call create all. +01:21 Pass at the engine so it knows how to do that. +01:23 Then finally we're going to create a session factory +01:25 by calling the session maker, giving it the engine. +01:28 We'll being using that for our unit of work +01:30 for all the queries and transactions and so on +01:33 throughout the rest of our app. +01:34 If we want to to create a query and pull back a single record, +01:37 here we'd create the session. +01:39 We say, "query of the type". +01:41 So we're going to query the account table, +01:42 say, "filter emails this.filter". +01:45 Password hash is that. +01:46 Now this double filter is basically an and. +01:49 So, here we're doing a query +01:50 where the email is what we specify, +01:52 and the passwordhash is what we specify. +01:54 Or we're going to get nothing. +01:55 And then, we can just get one back. +01:57 So we can either say one or first +01:59 and then we're going to return the account +02:01 that we got back here. +02:02 What does that look like in the database? +02:04 It's select star from account +02:05 where account email is some parameter, +02:08 and account.passwordhash at some other parameter. +02:10 And the params happen to be my Gmail address, +02:13 and some random text I threw in there. +02:16 Finally, you might be familiar +02:17 with the SQL query language but not SQLAlchemy. +02:20 And wonder how do these things map over? +02:23 So equals, simple that's a double equal. +02:26 Not equal, that's also kind of simple. +02:28 Not equal goes in the middle here, +02:30 and then it gets a little interesting. +02:32 If you want to do a like query that's like a substring, +02:34 I want all the names that contain the substring ed. +02:37 That's a .like('%ed%). +02:41 So the percents are like wild cards, can match anything. +02:43 Long as ed is in there somewhere we'll get that as a match. +02:46 N, so I want all the users whose name +02:48 is either Ed, Wendy, or Jack. +02:50 You and put the little tilde +02:51 in front of this whole thing and say, not in. +02:52 You can say null is None. +02:54 And is just multiple filters. +02:56 Or is a little more complex, but there's an or operator +02:59 that let's you pass a tuple along. +03:01 Or actually just multiple parameters +03:03 and that will turn those all into an or. +03:04 So you can see the link for all of these +03:06 and there's more as well over at the SQLAlchemy website. +03:10 Alright so that's SQLAlchemy. +03:12 I hope you really enjoy it. +03:13 It's really a great way to build professional, +03:16 data driven applications. diff --git a/transcripts/91-sqlalchemy/11.txt b/transcripts/91-sqlalchemy/11.txt new file mode 100755 index 00000000..f6be14cf --- /dev/null +++ b/transcripts/91-sqlalchemy/11.txt @@ -0,0 +1,29 @@ +00:00 Now you've seen SQLAlchemy in action, +00:02 it's your turn to put it in action +00:03 on whatever you want to build. +00:05 So, jump over here to the GitHub repository +00:07 and check out the SQLAlchemy section. +00:09 What we're going to start with is, +00:11 we're going to pick some application +00:13 that you've already built. +00:14 You're most of the way through this class, +00:16 so you should have a lot of apps. +00:17 You can pick one of the games. +00:18 You can pick another application. +00:20 It doesn't really matter. +00:22 And you're going to add database persistence to it. +00:25 And you're going to add the ability +00:26 to use that to run reports, +00:28 or keep sessions going across runs of the program. +00:32 Something to that effect. +00:33 So we're going to start out on the first day +00:35 by just really picking out an application, +00:37 and then creating a virtual environment and +00:40 installing SQLAlchemy. +00:42 We'll get this all set up. +00:43 If you get a program that can import +00:46 SQLAlchemy and run, then you're pretty much ready. +00:48 Today was mostly about just watching +00:51 the videos and learning. +00:52 So this is just to give you something to +00:54 start with the next day. diff --git a/transcripts/91-sqlalchemy/12.txt b/transcripts/91-sqlalchemy/12.txt new file mode 100755 index 00000000..8bd4260a --- /dev/null +++ b/transcripts/91-sqlalchemy/12.txt @@ -0,0 +1,38 @@ +00:00 On Day 2, you're going to focus on building out +00:03 the database models and the database structure. +00:05 So, recall from the presentation, that what you need to do +00:08 is use some kind of base class that comes from +00:12 SQLAlchemy, and have all of your models derive from that. +00:15 So, here's the example we had for our move, in our game, +00:18 and it derived from model base, we controlled the table, +00:21 by putting table name in there. +00:23 This is optional, but I like to do it. +00:26 And then we just defined all the columns. +00:27 Has integers, or has date times or strings, +00:30 and then be sure to give it a primary key, +00:33 and auto-increment if that's an integer, nice and easy. +00:36 And then you're going to need to actually go and create +00:40 the database, using your base model there. +00:43 And create a session factory for use later. +00:46 Alright, so if you run this code, already, +00:48 you should actually have some kind of database file, +00:50 and whatever you call it here, you'll have down here. +00:54 And then, you can either look at it, +00:55 if you're using Pycharm Pro, in Pycharm Pro, +00:58 or you can use a DB Browser for SQLite. +01:01 Either way, this is going to get your database structure +01:04 all up and running. +01:05 Final warning, or final note here: +01:07 Beware, you cannot modify existing tables, so for example, +01:11 this move, if I decided I also wanted some other value here, +01:16 like the opponent's role, or you know, whatever, +01:19 if I want to change this, at all, once I run this bit here, +01:24 it's fixed, can't change it. +01:26 SQLAlchemy will just ignore it, and it probably will crash +01:29 when you try to work with it, who knows. +01:30 So, if you want to do that, you need to use what's called +01:32 migrations, or for this little example, the easiest way +01:35 would be to just delete the database file, and start over +01:38 and it will create it, new. +01:39 But in production, migrations, or some kind of +01:42 database script to do the change, is what's required. diff --git a/transcripts/91-sqlalchemy/13.txt b/transcripts/91-sqlalchemy/13.txt new file mode 100755 index 00000000..061ad478 --- /dev/null +++ b/transcripts/91-sqlalchemy/13.txt @@ -0,0 +1,18 @@ +00:00 Final day of SQLAlchemy, +00:01 you've got your app selected, +00:04 got it running, you've modeled your classes +00:06 and created your database structure. +00:08 Now you just need to work with your data. +00:10 So you're going to insert some records, +00:12 save some data and insert it, +00:14 and then somewhere do a query. +00:16 Do a session.query of the type of query you want, +00:19 and just look back at the example. +00:21 We should have a variety of types of queries. +00:23 You should be able to make one of those +00:24 adaptable to what you're doing. +00:26 So just use this database, put some data in it, +00:30 and make your application more awesome from it. +00:33 All right, I hope enjoyed SQLAlchemy. +00:34 It's really a wonderful way to work with databases, +00:37 one of the more popular and flexible ones at that. diff --git a/transcripts/91-sqlalchemy/2.txt b/transcripts/91-sqlalchemy/2.txt new file mode 100755 index 00000000..dea19858 --- /dev/null +++ b/transcripts/91-sqlalchemy/2.txt @@ -0,0 +1,71 @@ +00:00 Let's get right into writing some code. +00:03 Now, if you look in the GitHub Repository, +00:05 there's two sets of code here. +00:08 They look exactly the same right now +00:10 but they're going to be very different at the end. +00:12 In this project, we're going to start +00:14 from an existing application. +00:16 One that's already done and all we're going to do +00:19 is add database access to it. +00:22 It's a bit of a trade off that happens to be +00:23 more realistic, more entertaining, +00:25 but slightly more complex by starting with something +00:28 instead of entirely from scratch. +00:29 But we'll isolate the SQLAlchemy pieces really well. +00:32 So this one, this persistent RPS starter, +00:35 this is going to stay in the starter state. +00:37 This one on the other hand, we're going to evolve +00:40 to the final version. +00:41 Now before I open this in PyCharm, +00:43 let me come over here and create a virtual environment. +00:48 And now on MAC OS we can drop it here, +00:50 or on Windows or Linux, you say file, open .directory. +00:54 So let's go through and have a +00:55 quick look at what we got here. +00:56 First, tell PyCharm to chill out on the virtual directory. +01:01 Start up the program. +01:02 So this is the thing that we're going to run. +01:04 Let's just go ahead and run it so you see what happens here, +01:06 in fact, yeah just run it like this. +01:09 So we're going to play, you might've guessed from the RPS, +01:11 Rock Paper Scissors. +01:13 And we're going to use a database to store +01:15 all the players who have played the games, +01:17 all the games that have been played, +01:19 the roles, who has won, who has the highest score, +01:22 we'll do reporting on that so we'll +01:24 sort of show the high score screen +01:26 by just doing a database query +01:27 and order by times they won, things like that. +01:31 It starts out asking what your name is. +01:34 And then we're going to play not rock paper scissors, +01:37 but we're going to play 15-way rock paper scissors. +01:39 So really fun, we have things like: +01:41 the devil, and the dragon, and the sponge, and so on. +01:44 So let's start by throwing standard rock. +01:48 I need that a little higher +01:49 so we can see what's going on here. +01:50 Oh! I've been defeated. +01:52 I threw rock, but the computer threw water. +01:53 Apparently, water beats rock. +01:55 How about fire? +01:57 I'm defeated again, this is not going to be good. +01:59 I'll throw a snake. +02:00 The computer also threw the snake, +02:02 so let's throw eight. +02:06 Paper. They threw tree. +02:08 I'm not looking... I don't think +02:10 it's going to matter what I'll throw +02:12 so let's throw a tree. +02:14 I threw a tree, they threw a scissors, +02:15 I win, but the computer wins 3-1. +02:17 We had one tie, three wins for the computer, one for me. +02:20 Therefore, I lose. +02:22 So we're going to take this game, +02:23 as you can see it lets you play +02:25 but it doesn't show you a high score. +02:27 It has no history of the game. +02:28 If I run it again, it just entirely starts from scratch. +02:32 So we're going to go over here +02:33 and we're going to upgrade this by using SQLAlchemy +02:36 to make it remember. diff --git a/transcripts/91-sqlalchemy/3.txt b/transcripts/91-sqlalchemy/3.txt new file mode 100755 index 00000000..8d5f64fb --- /dev/null +++ b/transcripts/91-sqlalchemy/3.txt @@ -0,0 +1,57 @@ +00:00 So, you saw the game being played. +00:01 Let's look at the code that we're going to work with. +00:04 We're going to come here to our main method and programs. +00:07 This is where it all gets started. +00:09 So, we'll print out the header, +00:10 we'll print the high scores. +00:11 Right now there are no high scores 'cause +00:13 we have no memory of stuff. +00:14 So there's not going to be a whole lot happenin' there. +00:17 We're going to build up the roles and now, +00:19 this is worth checking out. +00:20 Over here, in this battle CSV, we actually have +00:24 the sort of win-lose table for rocks, guns, lightening and +00:28 if it, you know, the lightening attacks the devil then +00:30 apparently the devil beats, uh, the devil beats lightening. +00:33 Alright, something to this effect. +00:36 We're going to use that, we're going to build up these roles +00:38 and sort of indicate which thing can be which. +00:41 We're going to create a couple players and then, +00:43 we're going to go to this game loop thing and say, "Run." +00:46 So we have three parts of the game happening over there. +00:49 Notice here we're just pulling in this CSV file and we're +00:52 allocating a row object, which we'll talk about in a second. +00:56 And here we're just putting in some more details to +00:58 figure out what opponents this thing loses or wins to. +01:02 Here's a little header. +01:03 And here's the high scores. +01:05 So, let's go ahead and start by looking at this game service. +01:07 This is where much of the database access is going to happen. +01:10 So you can see all those little parts here basically become +01:13 database queries or inserts or updates. +01:15 So, here we're going to go do a query and find all the roles. +01:19 Here we're going to find one for, uh, a particular name. +01:22 So, um, Devil, for example. +01:25 Here we're going to record a move given by a particular player, +01:31 a particular role, that was their move, the game id, +01:33 whether that won the game, if it was the final game play. +01:37 Uh, what stage in... you know, what step +01:39 in that particular game. +01:40 Was it 1, 2, 3, 4 or 5? +01:42 As we saw, the 5 that we played with. +01:43 So, we're going to go. +01:44 Basically our job during this section +01:46 is to use SQLAlchemy to fill out this section here. +01:49 And, over in the models we have things like a role, +01:52 which has almost nothing on it right now. +01:54 This is like Devil or so on. +01:56 We have some moves. +01:57 And this is more interesting. +01:58 This is like a history. +01:59 So this is like, uh, what role did they play by id, +02:03 what game is this associated with, uhm, what position. +02:06 Right, this is what we're just looking at there. +02:08 So, we're going to convert these standard classes into +02:11 classes that map to our database using SQLAlchemy. +02:14 So, I think that's a good place to start. +02:16 And, we'll do that next. diff --git a/transcripts/91-sqlalchemy/4.txt b/transcripts/91-sqlalchemy/4.txt new file mode 100755 index 00000000..27a2e99a --- /dev/null +++ b/transcripts/91-sqlalchemy/4.txt @@ -0,0 +1,73 @@ +00:00 Now, the first thing we need to do +00:01 to use SQLAlchemy is to create some classes +00:04 that map to our database. +00:06 Now, these are classes, +00:07 theoretically, we could read and write them to the database +00:10 but there's a specific way in SQLAlchemy. +00:12 So, there's basically two steps that we have to follow. +00:15 The first one is to declare, create this base class +00:18 that SQLAlchemy knows about. +00:20 So, we're going to declare a specific base class +00:23 that SQLAlchemy knows about +00:25 and then everything that derives from it +00:26 is automatically going to be related to a database table. +00:31 And SQLAlchemy, by way of this derived aspects, +00:35 will learn about those tables and those classes. +00:38 So, the first thing that we're going to do is +00:40 going to look really, really lightweight. +00:42 It's going to look like, why did you +00:43 create a separate file for this, +00:45 but if you're going to do this nice partitioning +00:47 or have, one move class in one file, +00:49 one player class in it's own file, +00:51 one role class in it's own file, and so on, +00:53 it makes sense to go ahead and make one more, +00:55 albeit, super small class, +00:57 we're going to call this model base, like so. +01:00 And we're going to start just by importing SQLAlchemy. +01:04 Now, this is not going to go so well +01:05 because we don't have SQLAlchemy installed. +01:07 So, let's go over here +01:09 and actually make a requirements.txt file, +01:13 and put sqlalchemy. +01:15 Now, this is not set up. +01:16 Notice over here we have our virtual environment +01:18 if we do a pip list, there's only those few things here. +01:22 So, let's do a pip install --upgrade setuptools +01:26 don't know why this is so old +01:27 but it's like 10 versions out of date. +01:29 So, let's get it out of the way. +01:32 Now, we want, go ahead and let PyCharm install SQLAlchemy, +01:35 and it's all good. +01:37 So, go back to our model base here, this is good. +01:39 And what we actually want, is we're going to say +01:41 from sqlalchemy.ext.declarative +01:46 we're going to import declarative_base. +01:48 Now, this is a function, which when called +01:51 will create a class not an object, a class. +01:54 It's a little bit funky but here's how it works. +01:56 Instead of say it defining a class like this, +02:01 and you put some kind of base class and details, +02:04 we're going to let this function do it. +02:06 And we do it like this. +02:08 That's all there's to it, this whole file is now finished. +02:11 But anything that needs to become an entity +02:14 that's stored in our database, it derives from this. +02:17 So, now we can come over here and say, +02:18 hey role, you want to map to a database table? +02:21 We just import this, +02:24 like so, +02:25 and we're good. +02:28 Do the same for player. +02:32 And the move. +02:35 Now, PyCharm can go a little crazy here +02:37 and say oh, you need to add this to your requirements. +02:39 No, no, I don't. +02:41 This thing right here, that is their requirements. +02:44 You can come over here and put this little statement +02:46 to say, you know, +02:47 this is not actually an external thing, calm down. +02:50 Okay, so we're halfway there. +02:53 Step one is to derive from this model base, +02:55 on all the things we're going to map to the database. +02:58 Step two is going to be to define the columns. diff --git a/transcripts/91-sqlalchemy/5.txt b/transcripts/91-sqlalchemy/5.txt new file mode 100755 index 00000000..1a21b172 --- /dev/null +++ b/transcripts/91-sqlalchemy/5.txt @@ -0,0 +1,124 @@ +00:01 Now, let's go ahead and define the columns +00:03 that are going to be in our tables, +00:06 and also, how they appear in the classes. +00:09 So, here we're defining the name property +00:11 and in memory usually the thing that defines +00:14 what specific item you have is just the address in memory. +00:19 Like, when you created the pointer to the thing, +00:21 that is kind of it's id, +00:23 but in the database world we typically need +00:25 to set and id to a particular thing. +00:27 Let's say none for second and we're going to set the name +00:30 to something else. +00:32 We can also control +00:34 what table this gets mapped to. +00:37 So, if we do nothing it will just be added to role, +00:40 like capitol 'R' role and I'm not a super fan of that. +00:42 So, let's say table name is going to be roles. +00:45 Plural, lower case, I kind of like that better. +00:47 Alright, so how do we tell SQLAlchemy, +00:50 if this is an and id, and even a primary key, +00:53 and auto incrementing, unique, and all that stuff? +00:56 Simple enough we say SQLAlchemy and we add that +00:59 to the top and we say column capitol 'C', +01:01 not lower case 'C'. There's two for some reason +01:04 and here we'll say +01:05 what type of things SQLAlchemy.Integer. +01:09 We'll say primary key is True. +01:11 Auto increment, True. +01:13 Okay, so that's great. +01:14 That's going to get us started there +01:15 and this is going to be a string, +01:19 that's what we say, string. +01:21 Now, we might want to add some other features +01:24 like this role is supposed to be the one and only +01:26 dragon, or rock, or paper, or something. +01:28 So, we could come over here +01:30 and say unique equals True, as well. +01:32 No creative uniqueness constraint for the database. +01:36 This go moved out of the way by it's own self, +01:38 but that's okay. +01:40 If a role, it's going to have an id and a name +01:42 and whenever I'm working with databases +01:44 there's one other thing I really like to know. +01:46 Like, when was this record created? +01:48 Is this old, is this new? +01:50 It doesn't matter so much for the role, +01:51 but for players and the history that's going to matter a lot. +01:55 Let's go ahead and add one here as well. +01:56 It's going to be a SQLAlchemy.DateTime. +02:00 This is pretty good, it doesn't have to be unique, +02:02 but what we would like is to not have to bother +02:04 to manually set this, +02:05 but just have this happen automatically. +02:07 Saved role, the created time was when it was first created +02:10 in the database. +02:12 So, we can come over here and set the default, +02:13 simply some kind function, how about date time, +02:17 and I'll have to import that .date.time.now. +02:21 Now, it's super critical you don't put +02:23 these parentheses here. You just put the functions here. +02:26 You put the parentheses, everything is going to be created +02:29 when the program starts. +02:30 If you put a function it will be called +02:32 every time something is inserted. +02:34 So, we want this kind of now and I'm going to copy this +02:37 because we're going to use it actually, +02:39 probably want both of these top ones here. +02:43 Perfect. So, this role class, this role model +02:46 is going to be mapped to the database is 100% done. +02:48 Let's quickly knock out the other two. +02:54 Now, the only other thing we're going to have here +02:56 is the players name again. +02:57 So, this will be super easy. +03:01 It'll say novel is false. +03:03 This is a required value you have to give it to us. +03:06 Okay, we can also put that in our role while we're at it. +03:10 Here, you have to say the name. +03:12 So, again the player classes are pretty much ready to go. +03:19 Now, it turns out that this move is the most complicated +03:21 and we're going to sort of stop short of some, +03:23 maybe some full modeling here. +03:26 Just for the sake of keeping us time bounded here, +03:29 but we're going to say the table is moves. +03:31 Then I'm going to put in a bunch of columns +03:32 we're going to talk about . +03:37 So, like before we have the id +03:39 of when it was created and now we have some +03:41 sort of relationship thing. +03:43 So, what role is it associated with +03:46 and what player is it associated with? +03:48 So, these are integers +03:49 and it's going to be foreign keys back to the other thing. +03:52 Now, we could model these relationships, +03:54 but like I said, this is a super quick intro +03:56 to SQLAlchemy and not to deep dive into it. +03:59 There's a lot of complexity to those relationships. +04:01 So, we're just going to kind of keep them loose for +04:03 the time being. +04:04 We'll have a string, which is like some sort of UUID +04:06 type thing for the game. +04:07 So, we know when the game is played, which it is, +04:10 this is the role, like this is the first round, +04:12 second round, third round. +04:14 Who played that particular role, +04:16 and is this the play that wins the game? +04:19 Alright, is this the final play that beaks this up. +04:23 You typically might say well, +04:24 that's always going to be the fifth one. +04:25 Unless, there's some kind of tie +04:27 and we tie, and tie, tie, +04:28 and this keeps going. +04:30 Alright. So, it can get slightly more complicated because of ties. +04:32 So, we need to know when the last, +04:34 and when the particular play is the final one +04:37 that is the winning play. +04:38 Okay. +04:39 So, with this we have our classes all defined. +04:41 We've got our role, our player, +04:44 and then for historical reasons, +04:46 we have our moves. +04:47 Of course they all derive from this model base, +04:49 which is super simple to create. +04:51 Not obvious, but very, very simple to do +04:53 and we did that in our model_base.py file. diff --git a/transcripts/91-sqlalchemy/6.txt b/transcripts/91-sqlalchemy/6.txt new file mode 100755 index 00000000..75369ca6 --- /dev/null +++ b/transcripts/91-sqlalchemy/6.txt @@ -0,0 +1,166 @@ +00:00 Now SQLAlchemy is powerful because it can connect +00:02 to any type of database that is relational. +00:06 Oracle, SQLServer, SQLite, MySQL, +00:09 you name it. +00:10 But that means we have to tell SQLAlchemy +00:13 where the database is, what is the connection string, +00:16 how do we get to it? +00:18 So we're going to to real quick things to get started here. +00:20 We're going to create a quick directory. +00:24 In here, we're going to do a little trick +00:25 just to find this folder super, super easy. +00:27 Call this db folder. +00:30 We'll define one function, get_db_path. +00:34 And it's going to take a base file name +00:36 and this'll be like rps.bin or something like that. +00:39 And from that, we need the full path. +00:41 So we're going to use a cool little trick here, using os. +00:44 And we'll say base folder is os.path.dirname +00:49 of this particular file. +00:51 So what folder is this file located in? +00:55 It's in here, and we want our database to also be created +00:58 in that same folder. +00:59 So we're just going to say return os.path.join, +01:02 base folder, base file. +01:04 So not a whole lot going on here, +01:06 but this is going to make it nice and easy for us to create, +01:08 we're create just a SQLite file that's going to live here. +01:13 And we'll create a data access bit here. +01:16 And let's add a new part here, say, +01:19 create this to be a session factory. +01:21 These are not the models that we're modeling the data on, +01:24 these are the sort of connection, +01:26 low level infrastructure type things. +01:28 So we're going to create the session factory thing +01:30 and its job is going to be +01:32 to create what's called a unit of work. +01:33 And SQLAlchemy, the way it works, +01:35 is you create this session, +01:36 you do queries, inserts, updates, deletes. +01:39 And you can either commit those changes +01:41 or throw them away. +01:42 So the job of this is to set up the connection +01:45 and create these sessions +01:46 that we can do the rest of our work with. +01:49 So we're going to need a few things here. +01:50 We're going to need the ORM, +01:52 this is the object relational mapper, +01:53 this is really interesting. +01:55 We're going to need the db folder. +01:57 We're going to need our model base, +01:59 we'll work with that. +02:00 Now there's one final thing that's a little bit weird +02:03 but we're going to need it. +02:04 Now at this stage in the program's life cycle, +02:08 it may not have interacted with these files, +02:11 the move, the player and the role. +02:13 For what's about to happen, +02:15 SQLAlchemy has to have seen and loaded into memory +02:19 all of these things. +02:20 And if that hasn't happened yet, +02:22 we're going to miss some things. +02:23 Like maybe one of the tables won't get created +02:25 or something weird like that. +02:26 So we can make sure that this is not a problem here +02:29 by just importing everything we need. +02:32 So move import, move player role. +02:36 Whew, so that's a lot of imports that we're going to need +02:38 but we are all ready. +02:40 Now we're going to create a thing called a factory. +02:43 And it's going to be nothing in the beginning. +02:45 So we need to do is write a function +02:46 that will get called one time and initialize everything. +02:50 So we'll say def. +02:52 It's going to work with this factory +02:53 so we'll say global factory so it can change this +02:56 from outside without, +02:58 and overwrite it with a local variable bit. +03:00 We want to change this, one and only factory, +03:02 there should be one of these in the entire process +03:04 per database, not a bunch. +03:06 So let's use our little db folder thing to get the path, +03:11 and let's call this rock_paper_scissors.bin. +03:15 Extension doesn't matter, +03:16 just something I like to stick with, +03:18 or actually let's change it to sqlite, how's that? +03:21 Even more clear what it's supposed to be. +03:22 And we can create our connections string, +03:24 this you saw already, +03:25 is going to be sqlite:///. +03:29 So this tells SQLAlchemy what kind of database +03:32 it's talking to. +03:33 Is it SQLServer, is it SQLite, is it Oracle? +03:35 And then for SQLite the connection string +03:37 is just the file name. +03:38 So this is nice and straightforward. +03:40 The next thing we're going to do, +03:41 is we need what's called an engine. +03:43 This manages all the connections and the connection pooling +03:45 and stuff like that. +03:46 And just like the factory, there's one of these +03:48 per database connection. +03:52 So we say create_engine, +03:54 and then all we have to do is give it the connection string. +03:57 And you can also, if you wanted to debug this, +03:59 you could say echo equals True. +04:01 I'm going to say false, so we can see what's going on, +04:03 but if you switch this to true, +04:04 you'll see every command issued to the database +04:07 by SQLAlchemy in SQL form. +04:10 So that's really nice. +04:11 Now the next thing we need to do +04:13 is actually create the structure. +04:15 If the database doesn't exist, +04:16 like right now, there's no database file here, +04:18 we would like to have SQLAlchemy get it up and running +04:21 and get everything connected. +04:22 So we can say model_base.metadata.create_all, +04:27 and we'll have to give it the engine. +04:29 So this is going to run +04:30 and actually look at all of these classes up here, +04:32 and it's going to create the related tables +04:35 that we told it about. +04:36 And finally, after all of that, +04:37 we're ready to create our factory. +04:39 So we'll say sqlalchemy.orm.sessionmaker. +04:45 And the session needs to talk to the database. +04:46 So the way that happens is we bind the engine +04:49 to the session factory, therefore all created sessions +04:53 know how to get back to the database. +04:54 Whew, okay, and that is that. +04:57 The other thing we're going to need to do, +04:58 just from making this work a little nicer, +05:01 is we want to be able to safely create these sessions. +05:04 We could directly work with that but it's problematic. +05:07 What if we forget to call this, +05:08 how do we check that, and so on. +05:09 So let's do a little create_session function here. +05:12 Instead of forcing other people to call that +05:15 we can just check, do we need this to be called. +05:17 So we'll say global, we'll say if factory is none, +05:22 like it hasn't been created yet, +05:23 then we'll call global in it. +05:26 Otherwise, this is super easy. +05:27 We'll just say factory, and again, you call it, +05:30 it's a session factory, when you call it, +05:32 it creates a session. +05:34 Okay so, that's all we got to do. +05:35 The last thing I would like to do here +05:37 well, maybe two things. +05:38 One is, PyCharm thinks we're not using these, +05:40 but they're important that they're here, +05:43 so let's go over here and say suppress that. +05:45 That's good. +05:47 Great, okay so no more complaints up there, +05:49 everybody's happy. +05:50 The other thing to do, is when we import the session factory +05:54 and hit dot, we'll see factory, we'll see create_session, +05:57 and global in that, what I'd kind of like to do +05:59 is make this not accessible from the outside +06:02 so we can do that by refactoring it to a double underscore +06:06 and then it'll be hidden by Python from the outside. +06:09 That's kind of a private variable for this module. +06:12 Our database is all configured, our models are built, +06:15 now all we have left to do +06:17 is just use this database access layer +06:19 to actually create some history in our game. diff --git a/transcripts/91-sqlalchemy/7.txt b/transcripts/91-sqlalchemy/7.txt new file mode 100755 index 00000000..4ac52c4e --- /dev/null +++ b/transcripts/91-sqlalchemy/7.txt @@ -0,0 +1,202 @@ +00:00 Alright, we have everything set up +00:01 and ready to go. +00:02 We can access the database all we want. +00:04 Now we just need to decide what do we want to do +00:07 with the database? +00:08 So if you recall over here in program, +00:10 there's this game service +00:12 that's being used in a couple places. +00:14 Find or create a player. +00:16 Alright so one is going to be us, the other is the computer. +00:19 Down here, get the game count, get the all players. +00:21 Now this is really a nice design pattern +00:24 because that means the only data access +00:26 that's really happening in the entire program +00:28 is in this one file. +00:30 If you have a really complicated app, +00:31 maybe you create different types of these little +00:34 data access layers service type things. +00:35 But, you isolate it into one place. +00:37 That means if you decide like, +00:39 hey, I'd like to switch to some entirely different type +00:41 of database or completely change this around to call web +00:44 service is instead of to call +00:46 data access layer uh, direct database access. +00:49 It's one place that you change. +00:51 So, I strongly encourage you to create this kind of pattern +00:54 that isolates all the database stuff into one place. +00:56 In order to make this work, we really just have to +00:58 write the code to make these things go. +01:01 Let's start over here. +01:02 If we want to say get the history +01:04 of a game, how do we do that? +01:05 Well, remember that session +01:06 thing we talked about. +01:07 This is how it's going to start over and over and over again. +01:10 So we'll say session factory +01:13 and we'll import this up at the top. +01:18 And down here we can say sessionfactory.create_session. +01:21 Notice that we do not have a factory. +01:24 Alright, there's no factory. +01:25 Uh, so we're just going to say create session. +01:27 And that's going to create this and at the end, +01:31 we're going to do session.close. +01:35 If we had made changes, we would say commit. +01:38 But, we're not going to do that. +01:39 Okay so we've created our session +01:40 and now we can create a query. +01:42 So I'll say the query is going to be +01:44 session.query, and you give it some kind of type. +01:47 We're going to look for moves. +01:49 So what we'd want to get back is a list of moves. +01:51 So we want to come in here and say query of move +01:53 and then we can do a bunch of things. +01:54 Orderby, filter, all, first and so on. +01:58 So we're going to say filter and the way you do this is +02:00 you go to the class and you say what are we looking for? +02:02 Game id equals, do a double equals, not a single, +02:05 equals this. +02:07 Now we can wrap that around and we want to do +02:09 an order, orderby, and then want to say we want to +02:12 orderby move, roll number. +02:15 Here we're going to say roll one, +02:17 then roll two, then roll three within this particular game. +02:20 And then we want to return all of those as a list. +02:23 So we'll say .all, we'll say moves equals list of query. +02:27 And then we'll return the moves. +02:28 Now, you might say it's slightly less efficient +02:31 to turn this into a list, +02:32 instead of like return this back and iterate over it, +02:35 and that would be cool. +02:36 However, this means that all the +02:38 data access is done by line 21. +02:41 Then we close the session +02:42 and we can just say forget about database access. +02:45 We are now back to just working with Python objects. +02:48 So, this is great. +02:49 Let's go ahead and write the rest of them. +02:53 To figure out how many wins a player has, +02:55 we'll create a session again or create a query on the move. +02:58 I want to say, I want to find the move that is for this +03:02 particular player and is a winning move. +03:04 This is the move that wins the game +03:06 for that particular player. +03:08 If they lose the game, this never gets set. +03:10 So, that doesn't count. +03:11 So, this thing here will get us all +03:12 the moves, then we can call .count instead of get the +03:15 objects back, this'll just give us a number called wins, +03:18 close the session and carry on. +03:23 Now for find and create a player, this one has sort of two +03:25 modes, which is, makes it somewhat, uh, more cumbersome. +03:28 But, what we're going to do is we're going to come in and +03:29 create a session. +03:30 This is how it always begins. +03:32 Create a query for the player. +03:33 When I say I would've liked to find the player by name +03:36 and this time just give me the first one. +03:37 Remember, the name is unique so this is one or zero +03:40 we're getting back. +03:41 If we got one back we'd just close the +03:42 session and say, "Here, this one already existed.". +03:45 But if we don't get one back, that means it's time +03:47 to create a new player. +03:48 Right, we've never seen this player. +03:50 So, what we're going to do is create a player object, +03:52 set the various values, the only one that doesn't have +03:54 a default of any form is the name so it's kind of boring. +03:58 But, we just set the name. +03:59 We'd set all the things, if we're setting more. +04:01 And then the way it gets in the database, +04:03 so we say session.add and then session.commit. +04:06 Now, if we were not using player again, the object, +04:10 and we just wanted to create it and forget it, +04:13 this should be fine. +04:14 We'd just be done. +04:15 However, once you call commit, +04:16 all the properties of this object get stale. +04:19 And you have to like reset them and try to get them back. +04:22 Which is kind of, uh, annoying. +04:23 So, what we're going to do is just get a new object +04:25 back from the database and this one, +04:27 uh, will not, this one will not be stale. +04:30 Right, the commit flag won't tell that we got to re-read +04:33 that data. So, sort of refresh this object after it's in +04:35 the database and send it back. +04:39 Getting all the players, actually this is the easiest query +04:42 we're going to write. +04:43 All we have to do is go to the session, +04:44 create a query player and say all, hit that with a list to +04:48 read through it, close the session and now +04:50 we have all players. +04:51 We might want to do an orderby, +04:53 alright maybe order by name. +04:54 But, if you don't care about ordering, this is all it takes. +04:58 While we're at it, let's do all rolls. +05:02 This one's basically the same. +05:03 We're going to get all the rolls, and this time +05:04 we actually do want to order them by name. +05:06 So they're alphabetical, that'll just make it easier to find +05:09 in our UI. Convert that to a list and return them. +05:11 It's all good. +05:12 Oh, except for I put that into the wrong spot, didn't I? +05:16 There, there's all our rolls. +05:19 Want to find a roll? +05:22 Here, we're just going to go through and say create a query +05:24 based on roll, where the name is that and go first. +05:27 It's either going to give us one back or not, which we've +05:29 indicated with a optional roll. +05:31 Rather than it's just a roll, it's a return value. +05:35 Now, for creating a roll, it's going to be very similar +05:38 to what we did before. +05:40 I'm going to come down here, create a session, +05:42 we're going to create a roll and this time +05:45 I think we just got to say roll.name == name. +05:47 There's no more constructor initializer there. +05:50 Save it and re-refresh +05:51 it so that it's not stale, and give it back, all good. +05:55 Only have one more left here and that's record roll. +05:57 This has probably got the most going on in terms of data. +06:00 So we'll come down here and we'll set all these properties. +06:02 And we're going to create a session, create the moves, +06:04 here we set all the things we care about that don't have +06:07 default values. +06:08 Again out of the session, commit, close. +06:10 We don't even return it back. +06:11 We don't care about getting the record of the move, +06:14 we're just going to say put it in the database, +06:15 I'll ask for it back some other time. +06:17 Now that defines all of our functions. +06:19 Let's see if we run it, if it'll even work. +06:22 First of all, before I run this, look over here. +06:25 If I do a quick refresh, sync. +06:28 We now, that I already ran it, just this second actually +06:31 created this rockpaperscissors.sqlite. +06:34 And notice that it's a database icon. +06:35 That's not because of the extension, +06:37 that's because PyCharm looked at it and said, +06:39 "I understand what that is.". +06:42 So, we're going to be able to work with that in a second. +06:44 Let's see if our game just runs. +06:45 We may have to go fix it up. +06:48 Michael, here's all our rolls, I'm going to throw some water, +06:51 and I'm going to throw some fire, +06:52 just keep him off guard there, maybe some more fire. +06:55 Uh, how 'about we throw down a tree and let's see if we +06:58 can hit him with some scissors. +06:59 4 to 1, dominated. +07:02 That's pretty cool, let's run it again. +07:04 Look at this. +07:05 Now here's our player history. +07:08 In a historical perspective, +07:09 Michael's won one time and the computer's won no times. +07:12 Let's throw Jennifer in here, see how she does, uh, 2. +07:17 She's going to throw some air, lots of air, who wouldn't want to +07:21 throw a sponge in there? +07:22 Maybe a little wolf action. +07:24 Boom, Jennifer also wins. +07:25 Now if you run it again you'll see +07:27 Michael and Jennifer won, the computer zero. +07:29 How cool is that? +07:30 And this is in our little database. +07:32 Let's look at that a little bit deeper. diff --git a/transcripts/91-sqlalchemy/8.txt b/transcripts/91-sqlalchemy/8.txt new file mode 100755 index 00000000..d724995c --- /dev/null +++ b/transcripts/91-sqlalchemy/8.txt @@ -0,0 +1,25 @@ +00:00 For the grand finale, let's just play one more game, +00:02 full-screen, not stuck inside of PyCharm there. +00:04 So we'll come over here, you can see +00:06 I have my virtual environment activated, +00:07 so I'll say python program, and in here, +00:09 we're already reading from that database. +00:12 I've got Michael's wins once, Jennifer +00:14 wins once, and computer. +00:15 Now, if I say Michael, it's going to go +00:17 and find that same player again, +00:18 and I'll just play some dragon, some dragon, +00:21 a little bit of lightning. +00:22 Am I doing, doing alright, I won that last round. +00:25 Let me try a little snake, and we'll finish it +00:27 off with some fire, five to zero, amazing. +00:30 Alright, now if I run it again, +00:31 you'll see, now I have two wins, Jennifer +00:34 has one win, computer getting crushed this time. +00:36 This is the game I built, and you can see +00:39 it wasn't totally easy to build up those relational classes +00:43 and so on, but it really wasn't that hard. +00:45 And we built our little separate database service, +00:48 our game service, code, so all +00:51 of our data access is contained +00:53 within just that little set of files. diff --git a/transcripts/91-sqlalchemy/9.txt b/transcripts/91-sqlalchemy/9.txt new file mode 100755 index 00000000..e17817b3 --- /dev/null +++ b/transcripts/91-sqlalchemy/9.txt @@ -0,0 +1,39 @@ +00:00 Before we put the wraps on our game, +00:01 let's have a quick look inside the database. +00:03 Julian already talked about DB Browser for SQlite, +00:06 runs on all the platforms this little thing. +00:08 This is quite cool and if this is what you want to use +00:11 I totally recommend it. +00:12 It looks quite nice. +00:13 I'm a fan of PyCharm and PyCharm also +00:16 already has tools for this. +00:18 So if you go over to database, +00:19 and you hit the + and say data source. +00:21 Now if we pick Sqlite serial, +00:24 you'll have to make sure if it doesn't say driver, +00:26 there's a little button to say download the driver here. +00:30 So if you don't do that, this is not going to work. +00:32 But once that is done, +00:33 I'm going to drag from here to there, +00:35 you can actually see what is in our database. +00:37 Go to schema, to main, hit our moves players rolls. +00:40 Roll moves is most interesting, let's look there. +00:42 Here you can see it's all the various pieces. +00:44 These orange things mean these have indexes. +00:48 Here's the actual details. +00:49 I can even come over here, jump to the console +00:51 and say select star from, move to where, +00:55 and you get all sorts of details. +00:56 Like let's say player id equals one, that's probably me. +01:00 Then there's all the moves that I made +01:03 since I entered first into the game. +01:05 Pretty sure my id is one, we can check that. +01:07 Anyway here's how we query it, +01:08 and you can see all the different games +01:11 that this has been running in and so on. +01:13 So this is really nice when caveat +01:15 this only works in PyCharm professional. +01:17 If you have PyCharm community +01:18 well you're going to need to use something else right. +01:21 The database access stuff is not part of that +01:22 so I'd check out that DB browser for Sqlite. diff --git a/transcripts/94-guis/1.txt b/transcripts/94-guis/1.txt new file mode 100755 index 00000000..a21a526d --- /dev/null +++ b/transcripts/94-guis/1.txt @@ -0,0 +1,69 @@ +00:00 Hello again, it's Michael. +00:02 And we're getting really near the end +00:04 of your 100 day journey. +00:06 And I think this topic is going to be a really nice one +00:08 to round out some of the work that you've already done. +00:11 We're going to talk about building GUI applications. +00:15 That's right. +00:16 Windows applications, not terminal applications. +00:20 You're going to work cross-platform just like Python, +00:22 in fact, we're going to take it a step farther, +00:24 we're even going to bundle these up so nobody will even know +00:27 you wrote them in Python. +00:29 Right, you give them an .exe, or .app, or linux binary, +00:32 and they can just run it. +00:33 It's going to be amazing. +00:35 Here is the simple application that we're going to build. +00:38 Now, we're going to start pretty simple. +00:41 We're not going to build super complicated applications, +00:45 but we're going to use a framework that basically takes +00:48 CLI, command line argument apps, and converts those +00:51 into what we would have in some sort of GUI here. +00:55 So, what might have been a command line argument, +00:58 the search term, or the mode, are now UI elements. +01:02 One you can see is free form text, one is a dropdown. +01:05 Really, really nice framework. +01:08 The framework we are going to use to build this +01:09 is something called Gooey: G-O-O-E-Y. +01:13 You know, it's a play on the spelling phonetics +01:15 of GUIs, I'm sure. +01:17 But it turns almost any Python command-line program +01:21 into a full GUI application in just, +01:23 maybe not one line of code, but just a couple lines of code. +01:27 Really, really simple and easy. +01:29 So, the bang for the buck on this one is amazing. +01:31 It's really nice to have a GUI application +01:35 and yet it's really, actually not much work, +01:37 if you're willing to accept a simple UI. +01:39 So, Gooey, we're going to do that. +01:42 We talked about packaging Python applications. +01:45 It's one thing to have a script that shows a window, +01:47 it's an entire another thing +01:49 to give a simple, single application +01:51 to a non-technical person who may or may not +01:54 have Python installed, who may or may not have +01:57 the right version or any of the dependencies installed. +01:59 Just give them one thing that they can run. +02:01 Like on Mac, it'd be great if they could just have +02:03 like a movie search app +02:04 they could double-click and it would run. +02:07 Or on Windows, a movie search app +02:08 they could double click this .exe. +02:12 There's nothing more to it. +02:13 It's literally just this .exe file, +02:15 you do that and you run it. +02:17 Or even, over here on Ubuntu. +02:19 Give them the movie search app, +02:20 they double click it, it runs. +02:22 Don't have to set up Python, +02:23 it doesn't even have to be installed on the machine. +02:25 Just like any other fully packaged application, +02:28 it's ready to go. +02:29 For this, we're going to use something called PyInstaller. +02:33 So, there's sort of two parts to this whole section. +02:36 We're going to one, build the GUI application. +02:38 Two, an additional step to add this sort of +02:42 packaged element in this distributable version to it. +02:46 It's really fun. +02:47 I really hope you enjoy it +02:48 and we're going to get started right now. diff --git a/transcripts/94-guis/2.txt b/transcripts/94-guis/2.txt new file mode 100755 index 00000000..7f0408c7 --- /dev/null +++ b/transcripts/94-guis/2.txt @@ -0,0 +1,62 @@ +00:00 All right, let's jump right into writing some code. +00:02 Now we're going to start with some already existing code. +00:05 In fact, you've seen the application we're +00:07 going to write already, just in an entirely different form. +00:10 Remember way back when, for the movie search app, +00:14 where we consumed JSON APIs? +00:17 So this would be the 'set of days' base that we worked +00:19 with the JSON APIs. +00:22 We're going to take that application, which was definitely +00:24 just a terminal, text based interactive application, +00:28 and we're going to turn that into a Gooey app. +00:30 So here you can see I've made basically a copy +00:34 of those and I've changed it just a little bit. +00:36 We're going to open this in PyCharm, +00:38 but before we do, let's just go over here and +00:40 set up a virtual environment, like so, +00:42 and we'll just all it venv +00:46 and we'll just drop this folder onto PyCharm. +00:49 Now, while it's loading, notice over here, +00:51 I have this starter search app in the file. +00:54 So this is the starter code. +00:56 I'm going to leave it exactly as what you're about to see. +00:59 I'm going to take this one and +01:00 evolve it into the final version. +01:02 Alright, so let's go over here and get started. +01:04 So I'll add the root, look over here, +01:07 and we'll pip install -r requirements.txt +01:10 because we have a couple of things +01:12 that we need for that application. +01:14 Namely, we really needed requests, right there. +01:18 Later we're going to add more to this, +01:20 but for now it's requests. +01:21 These files are red because they're not yet staged in Git, +01:24 which we'll do shortly. +01:25 Now I've changed this just a little tiny bit. +01:28 I've gone over here and I've added the ability-- +01:30 Originally what we could only do was find by keyword, +01:33 now we can also find by director +01:35 and we can find by IMDB code. +01:38 So let's try to run this. +01:43 So here's the command line addition. +01:45 So let's search by director, I'll say Cameron, +01:49 so Avatar, that kind of stuff. +01:51 There we go, Almost Famous, Jerry Maguire, Avatar, +01:56 so our search is working, and this is finding all the ones +02:00 that James Cameron directed. +02:02 Okay, so this is working just fine, +02:04 and notice, right now we can pass it, or we can select +02:06 at the moment in this input mode, +02:10 We can select whether or not it's a director, +02:14 or it's the IMDB code, or when we started to fall through. +02:18 The last case is just a generic search here. +02:21 So we're going to do a couple of things. +02:23 The first thing we're going to look at is we're going to see +02:26 how do we make this a Gooey application? +02:29 And then we'll package it all up. +02:31 So we're not going to change the functionality +02:34 of this application hardly at all. +02:35 In fact, we're going to more or less just leave it like it is, +02:39 but instead of getting the inputs from the user via these +02:42 input statements here, we're going to get them +02:45 from a beautiful Gooey. diff --git a/transcripts/94-guis/3.txt b/transcripts/94-guis/3.txt new file mode 100755 index 00000000..00ff474d --- /dev/null +++ b/transcripts/94-guis/3.txt @@ -0,0 +1,52 @@ +00:00 Now, before we actually add Gooey, let's just change this +00:03 around a little bit so that we can have a cleaner separation +00:07 of where we get our data versus where we run it. +00:11 Notice we're asking for the mode here, and then based on the +00:13 mode we're doing these three things. +00:16 I'm going to come over here and make a new function, +00:19 put that down on the bottom, and call this get_parameters, +00:23 or get_params, something like that. +00:25 We're going to do the same thing here. +00:27 We're just going to keep it the same. +00:28 Instead of doing the search, we're just going to +00:32 return which thing it is that we want to do. +00:35 We're going to return the mode. +00:38 Let's say, yeah, return mode from director. +00:45 We're not going actually going to do the search. +00:46 We're going to return the mode and the code. +00:49 And finally, down here we're going to say return mode +00:54 and keyword. +00:56 We can come over here and say +00:59 we're going to come over here and say mode and value +01:03 with the comma there. +01:04 Sorry, your equals get_params. +01:07 These two values that come back are going to go here. +01:10 I guess we could even put this little part down here, +01:14 this little print statement. +01:15 It belongs together. +01:16 Instead of doing this, if the mode is that, we're going +01:18 to say we're going to pass the value over here. +01:21 Instead of doing this, we already asked that question. +01:23 It stored a value. +01:24 Instead of doing this, we're going +01:26 to go over here and say value. +01:28 Let's just see if this runs. +01:29 All right, I want to search by a director, Cameron. +01:33 Seems that works. +01:34 Let's try one more. +01:35 I want to search by keyword, capital. +01:39 Try again. +01:40 Keyword, capital. +01:42 There we go. +01:43 You spell it right, +01:44 it works really well. +01:45 Okay, so this is working. +01:46 It's nice because we just have this one function, +01:48 and we get these two values back. +01:50 It's this point where we can plug in our Gooey stuff. +01:54 All we have to do to create our Gooey is to add +01:56 a decorator right here, and then basically tell +02:00 Gooey, G-O-O-E-Y, what the parameters it's supposed to +02:05 ask for are, and how to describe them to the user. +02:11 Like is this a drop down with a list? +02:13 Is it a text input? Things like that. diff --git a/transcripts/94-guis/4.txt b/transcripts/94-guis/4.txt new file mode 100755 index 00000000..8cbecf03 --- /dev/null +++ b/transcripts/94-guis/4.txt @@ -0,0 +1,135 @@ +00:00 Now we're ready to incorporate Gooey. +00:02 So, first thing we have to do is install it. +00:04 Over here, we can say pip install gooey. +00:08 Now, this works fine on Windows and Mac, +00:10 I've found there's a little bit of a problem with Linux. +00:13 I'll show you that in a second. +00:14 But notice that it's depending on wxPython Phoenix, +00:17 which is a brand new version of wxPython, +00:20 a cross platform GUI thing, very nice. +00:23 The G-U-I version, and then Gooey is built upon that. +00:26 So while that's installing, let's look over here. +00:29 I've noticed that there's a problem installing this, and I couldn't get it to work, +00:32 so if you run these two sets of commands on Ubuntu, +00:36 at least if you're using Ubuntu, +00:38 I haven't tried it on anything else, +00:39 they should get everything set up and ready to go. +00:42 And then, you'll be able to work with wxPython +00:45 and Gooey and so on. +00:46 Without this, I couldn't get it to install. +00:48 By the way, this takes a really long time, +00:50 like ten minutes or something crazy like that, +00:52 so just be aware. +00:53 Here's the link for it over here in the Phoenix release, +00:56 the 465. +00:59 Okay, so this is all set up and ready to go, +01:01 and the other thing that we want to do, +01:03 just for completeness sake, +01:05 is we want to make sure this gets put +01:07 into the requirements file. +01:08 Partram will do that for us. +01:10 So let's say this: from gooey import GooeyParser. +01:13 We're going to need that to, actually, +01:15 that's basically the thing that triggers the UI. +01:17 We need this other thing, Decorator, +01:19 that will let us basically say run this method, +01:22 and get the parameters from it. +01:24 So we'll come over and say Gooey, +01:25 I'll say Program Name, this will be Movie Search App, +01:29 and we'll set the description. +01:31 Search, talk, Python, Demo data for movies. +01:34 Remember, this is just the search, +01:37 the movie search jacent API we've already played with. +01:40 Let's change this to the Gooey Edition here. +01:43 This is the first thing, we have to put this Decorator, +01:46 and the other, let's go to this get params. +01:48 Now all of this stuff, we don't need this at all anymore. +01:51 What we're going to do is, +01:52 we're going to create a thing called a parser. +01:54 That's going to be the GooeyParser. +01:56 Then, on the parser, +01:57 we're going to add a couple of arguments. +01:59 This is super varied, +02:00 you could have all kinds of flexibility here, +02:03 but we want to do two things. +02:04 A basic search term, and well give it, +02:07 we'll say help equals the search term, or keyword, +02:11 something to that effect. +02:13 We want another one that's a little bit more complex. +02:16 So we'll come up here and say, +02:17 dest=mode. +02:19 That's going to be the name of the parameter that comes out. +02:22 The widget, here's where it gets interesting, +02:24 this is a dropdown. +02:25 Alright, there's a lot of different type of widgets, +02:27 and our choices for our dropdown, +02:29 tell PyCharm that's spelled correctly. +02:31 That's going to be by director, +02:33 by IMDB code, +02:36 you can just say director, IMDB code, +02:40 and keyword. +02:42 Okay, so we got this and then all we need to do, +02:45 actually, keep that for one more moment, +02:47 we have to go over here +02:48 and say args = parser.args +02:50 parse args. +02:51 This actually is what triggers the UI. +02:54 And then in here, +02:56 this is a dictionary that contains two values, +02:59 search term and mode. +03:01 So we can just say return, +03:03 we return first the bottom mode and then the value. +03:06 So args.get_mode, +03:08 args.get_search_term. +03:12 this little bit of code right here, +03:16 that should do it. +03:17 Let's go ahead and run this and see what happens. +03:19 So we got our new way of getting arguments through the UI. +03:22 we've got our Gooey, fingers crossed, run it. +03:27 Look at that. How sweet is this? +03:29 See our search term right there, and this is our search term +03:32 and our mode. +03:33 So the search term is going to be Cameron again, +03:35 and this time, we're going to go down it. +03:38 Look, there's our director. +03:39 Oh, I already, I noticed something we did wrong. +03:41 This is not going to work so much here, unfortunately. +03:44 We need to change these to understand what those are. +03:48 So we could either return different values, +03:51 like if the mode is director, make it D, +03:55 or we could just put these back at the top. +03:57 I'll just change it up here. +03:58 This was not, I was just going to search under keyword, +04:01 which is not what we wanted, alright? +04:03 So this and then else it's going to fall through, +04:06 but let me just fix the comments. +04:08 You know, the comments that lie. +04:10 There we go, mode equals this. Alright, try again. +04:15 Alright, now let's go and try to find those. Ready? Go. +04:20 Oh, well I guess you can see what an error looks like. +04:22 I think, actually we don't do get. We just .mode. +04:26 It's just dynamic, it's not like a dictionary. +04:29 There you go. One more time. +04:34 Go. Boom. Look at that. +04:37 How cool is this? +04:38 That we built this Gooey application right here? +04:41 Our program exited successfully, found ten movies. +04:44 These are the ones we just saw a little bit before. +04:46 We can re-run it and it will run again. +04:48 That doesn't mean a whole lot, +04:50 it just searched the same thing. +04:52 Let's go over here and say we're now searching by keyword +04:54 for capital. Run it, and you'll see something interesting. +04:57 Notice, it put the data down here, kind of on top of it, +05:00 so there's this kind of funky weird buildup, +05:02 whereas if you run it again and again, +05:05 you get like a history. +05:06 So this is kind of just like your terminal here, +05:09 more or less. +05:10 But I think it's okay. +05:11 I mean, it's not going to win any design awards, +05:13 but it's definitely better than handing out +05:15 a command line application to somebody +05:17 who's really not into command lines. +05:20 So, a great way to sort of make your +05:22 Python application more general. diff --git a/transcripts/94-guis/5.txt b/transcripts/94-guis/5.txt new file mode 100755 index 00000000..c04a6c86 --- /dev/null +++ b/transcripts/94-guis/5.txt @@ -0,0 +1,114 @@ +00:00 So, we've seen that we can run our app, +00:02 and let's actually run it over here. +00:04 We could go to somebody and say, +00:06 all right here's what you need to do +00:07 to run our little program. +00:09 You have to create the virtual environment +00:10 and then you have to activate the virtual environment. +00:13 They have to pip install the actual requirements. +00:19 Once that's all set up, you can Python your program, +00:22 and whew, it runs, finally. +00:24 Okay, so that's not really the way you want to hand out +00:27 a general application, is it? +00:29 You want to say, here, double click this. +00:31 It looks just like your Firefox, or your Word, +00:34 or whatever application people are used to working with. +00:36 So, we're going to use a program, +00:38 or a utility, called PyInstaller. +00:41 So, over here, the first thing have to do +00:44 to use PyInstaller, is install it. +00:50 Now, PyInstaller works on all of the platforms, +00:53 so that's really nice, and the easiest way to run it +00:56 is to create a file called build.spec. +01:00 And if you go to the PyInstaller page, +01:02 it'll say, here's an example one. +01:04 So we're going to do, basically, grab this. +01:10 I'm going to grab some text, basically, that I got from there, +01:12 other than I put in the name, so you can see like +01:15 right here, Movie Search App is the name. +01:19 But it does things like, don't you have the console, +01:21 make it windowed, things like that. +01:23 And the other thing it needs is the Python path, +01:26 so I'm going to say, which Python, +01:28 with my virtual environment activated. +01:30 So in that case, we're going to use +01:31 this great long one there, okay. +01:37 That should pretty much be it. +01:39 Go through, set the name of your application +01:41 and things like this. +01:42 So once this is here, we can come over here, and we can, +01:46 in our terminal, either one will do, +01:48 we just say PyInstaller, let's do it over +01:50 in this bigger one, 'cause you'll see +01:52 all the stuff that comes out. +01:53 So again, the virtual environment is there, +01:56 this build spec is here, +01:57 so we'll say PyInstaller ... +02:01 So PyInstaller build.spec. +02:07 It's done. It's completed successfully. +02:09 How awesome it that? +02:10 That took a moment, but let's go see +02:11 what we have in here now. +02:13 Just minimize everything. +02:14 And now, in our final search app, we have a build folder, +02:17 which is kind of a temporary working directory +02:18 and it will be quicker if you rerun the PyInstaller +02:21 based for that stuff is there. +02:23 But this is what we care about. Look at this. +02:25 This one .app file, put it over here. +02:29 Now, what happens if I double click it? +02:32 Wait for a second. +02:33 And there's our UI. Let's go search for something. +02:36 I'm going to search for "action," +02:39 and this will be a general keyword. +02:41 Boom, there are eight movies, the action in it. +02:43 So, Last Action Hero, Looney Tunes: Back in Action, +02:46 Civil Action, things like that. +02:48 How cool is that? +02:49 Now, you may notice this +02:50 little thing back here, this terminal. +02:53 That is actually what I would call not cool, +02:55 so I'm going to close that. +02:56 Now, if I go over to my Windows virtual machine, +02:59 and I run the exact same process. +03:01 I pip install, I run the requirements, +03:03 and then I pip install, PyInstaller, +03:05 and I run PyInstaller build.spec, I will get a single .exe, +03:10 and that single exe will run just like we saw. +03:14 But it has no command prompt. +03:16 It literally runs as just a Windows application. +03:18 If I do the same thing on the Linux +03:19 after I get the funky stuff to install with Aptitude, +03:22 then I run the PyInstaller, +03:24 I get this to show the Gooey, no terminal. +03:27 For some reason, I think it's a minor bug +03:28 with PyInstaller that this is shown, +03:32 even when I'm in the command thing. +03:34 We told it not to, but still, +03:36 the benefit of having a thing I can double click right here, +03:40 and that Gooey comes up in Python, that is really sublime. +03:44 And the fact that this is all bundled up. +03:45 I literally just compressed this .app and I send it around. +03:49 There's no dependencies. Even better. +03:51 So, I really hope you like this ability create +03:54 a Gooey and then package it up for reuse, +03:56 because I think that really broadens the reach +03:59 of what you can do with Python. +04:01 Now, these are not super, super general applications +04:03 that you've seen. +04:04 There are some nice examples. +04:06 If we go to the Gooey page and we scroll down here, +04:09 scroll, scrolling, you see some nice examples, +04:10 even at the bottom, I think there's some here. +04:13 Yeah, you can see tabbed groups, custom groups, +04:16 sidebar navigation, all kinds of stuff going on here. +04:19 But what I want to show you is, if you go to the examples, +04:23 there's actually a different repository +04:25 with a bunch of different examples. +04:27 Success screen, error screen, flat versus column layout, +04:31 all that kind of stuff. So you can go over here and play around with those, +04:33 just even like a dynamically generated one. +04:35 So, you can do a lot, but you can't build +04:38 entirely general applications. +04:40 This is a quick way to turn command line apps +04:43 into rich Gooey apps, and I think it does it really well. diff --git a/transcripts/94-guis/6.txt b/transcripts/94-guis/6.txt new file mode 100755 index 00000000..d2b22fd1 --- /dev/null +++ b/transcripts/94-guis/6.txt @@ -0,0 +1,43 @@ +00:00 Now you've seen how easy it is to create a GUI +00:02 from a command line application. +00:05 Let's go and review the core concepts. +00:07 So it all starts with the Gooey library, +00:10 so we're going to import GooeyParser, +00:13 to get the, to actually show the UI +00:15 and get the input, +00:16 and then Gooey to indicate +00:18 here's the method that runs, +00:19 that triggers the Gooey application. +00:22 So we got to apply that decorator, +00:24 uh, the best place I found is right on the +00:25 main method here, +00:27 and we can give it things like the name, +00:29 and the program description, +00:30 and that actually shows up in the UI, +00:33 then when we actually want to get the data, +00:35 we did this is another method +00:36 but you could just do it straight in line here +00:38 We're going to configure the parser, +00:40 create it at a argument, +00:41 we saw that it can be simple text, +00:43 or you know all sorts of widgets, +00:45 that we can put in here and those are cool. +00:47 And then to actually show the UI +00:49 we're going to parser.parsarcs, +00:50 and then what comes back as Gooey args, +00:53 we just say .whatever your called the variables +00:56 .mode, .searchterm is the two that we used, +00:59 of course you can have arbitrarily many, +01:01 and you can make up those names, so +01:03 so just make it consistent, +01:04 and you're off to the races. +01:05 It's standard python at this point. +01:08 You provide feedback for, sort of the rest of +01:10 your app through just print statements, +01:12 and those will land in that little +01:14 text window in Gooey +01:16 in the Gooey GUI +01:18 so it's really nice. Straightforward and simple. +01:20 If you just want a quick and simple +01:22 GUI application, +01:23 this is what you do! diff --git a/transcripts/94-guis/7.txt b/transcripts/94-guis/7.txt new file mode 100755 index 00000000..2a0c5533 --- /dev/null +++ b/transcripts/94-guis/7.txt @@ -0,0 +1,46 @@ +00:00 Now comes the exciting part, +00:02 you get to write some code and +00:04 build a GUI in Python as well. +00:06 So here's the demos you've already seen from the videos. +00:11 And down here we have the various steps. +00:13 So a quick warning for Anaconda users, +00:16 I've heard some people say that +00:18 installing wxPython has been causing some +00:20 compatibility issues with their install of Anaconda, +00:24 actually I have no idea what they're really referring to, +00:26 but just consider using a plain old Python 3 environment, +00:30 or a separate virtual Conda environment. +00:33 Okay, today, Day N, we're going to start out +00:37 and mostly it's just about watching the videos +00:39 and learning the material you've already done. +00:41 So congratulations, you're basically done. +00:43 But let's take one little step along with, +00:47 I guess you would call it code, we're going to create +00:49 some files that contain code, anyway. +00:51 So create a new virtual environment, activate it, +00:53 this is pretty standard at this point, nothing special here. +00:56 You're going to install Gooey and Cookiecutter. +00:59 And just go ahead and make a program file, +01:01 because we're going to put some stuff in there, +01:03 that's where all the code is going to go, +01:05 just have one this time. +01:07 And just to make sure everything's hanging together, +01:10 inside your program file, just import Gooey at the top, +01:14 and maybe also import Cookiecutter and run it, +01:16 and just see that it exits with code zero, +01:18 no errors or anything like that. +01:21 This step here about pip install gooey and pip install cookiecutter, +01:24 this is fine on Windows and Mac OS, +01:26 but I did run into trouble trying +01:28 to get that to work on Ubuntu. +01:31 So I had to run this set of prerequisites +01:35 before I could even get it to install and build and so on. +01:38 So you want to make sure that you run these steps here +01:41 if you're on Ubuntu. +01:42 This is going to trigger and install wxPython, +01:45 which is what was causing the trouble, +01:47 that takes a long time on Ubuntu for some reason. +01:50 I mean, like 10 minutes for that +01:52 to just be on that one line. +01:54 But don't give up, eventually you'll get there +01:57 and then you'll be golden. diff --git a/transcripts/94-guis/8.txt b/transcripts/94-guis/8.txt new file mode 100755 index 00000000..a7514d95 --- /dev/null +++ b/transcripts/94-guis/8.txt @@ -0,0 +1,25 @@ +00:00 The next day is you're going to actually build your GUI. +00:03 So the steps to make this happen are pretty straightforward. +00:06 They're just right here. +00:07 You're going to have a main method. +00:08 You're going to put an @gooey directive decorator on it. +00:12 Somewhere near the beginning we'll create a GooeyParser. +00:15 You've seen how to add the arguments. +00:17 At the end you call parser.parse_args. +00:20 Get that back, that'll give you your data. +00:23 You should have your UI running, right? +00:25 Remember, the goal is going to be to look through +00:28 the applications that you've built +00:31 and find one that's kind of fire and forget. +00:33 You give it some information +00:34 and press go do that and it will. +00:37 So find an application that you built, +00:39 that you like along these lines +00:41 and convert it to a UI version of that same application. +00:45 Right, so through these steps here. +00:47 Here's an example of one I had +00:48 that was a sort of project creation thing +00:51 for Pearman Web Apps and it would take Cookiecutter +00:55 and the various types of templates +00:56 and ask you the questions but it does it visually right here +00:59 so you're going to end up with something like this in the end. diff --git a/transcripts/94-guis/9.txt b/transcripts/94-guis/9.txt new file mode 100755 index 00000000..fe7e9066 --- /dev/null +++ b/transcripts/94-guis/9.txt @@ -0,0 +1,24 @@ +00:00 Day 3, what you're going to do is +00:01 you're going to package up your app, so you're going to +00:03 install PyInstaller, and you're going to run this +00:06 build.spec, so the way to get started with these +00:08 is to just copy one, so here I've linked to the one +00:11 that I used for my demos. +00:13 You can take this and just change it ever so slightly, +00:16 so here's where I specify the name, +00:19 here's where I specify the name of the sort of entry point, +00:23 the main Python program we're going to run. +00:25 I think those are the only two things you need to change, +00:27 right, so take this, put it there, +00:31 and then just after you've installed PyInstaller, +00:33 you're going to run this line a little bit later. +00:35 In distribution app name, you should have either +00:38 an exe or a .app or, you name it. +00:42 Right, on Linux, you'll have +00:43 a Linux binary that you can run. +00:46 Zip it up and run it. +00:47 I hope you really enjoyed this experience building +00:50 simple, fire and forget, GUI applications in Python. +00:54 When you're done, as usual, share with the world +00:57 all the fun and joy of what you've had building this thing, +01:00 and I hope you have a great time and get to it. diff --git a/transcripts/97-online-game-service/1.txt b/transcripts/97-online-game-service/1.txt new file mode 100755 index 00000000..1e1d5ded --- /dev/null +++ b/transcripts/97-online-game-service/1.txt @@ -0,0 +1,89 @@ +00:00 Welcome to Day 97. +00:02 Michael again here with you and we're going to bring +00:05 a bunch of things together that we've previously done +00:08 and what I think is actually a really cool way +00:11 of pushing and combining what you know. +00:14 So we're going to build an online game. +00:17 And it's going to be a multiplayer game, +00:19 not multi-interactive real time game, +00:22 but multiple players from multiple places +00:23 log in and play this game online +00:26 and you get things like high scores, +00:27 who's won the most games, active players, things like that. +00:31 And what's really cool is you basically +00:33 already know like 80% of what you need to do this. +00:37 The final bit we're going to put together here +00:39 with a little bit of APIs and Flask. +00:43 Online games are fun, right? +00:45 Here's a cool one, Eve Online. +00:47 This is actually powered by Python on the backend +00:50 in some really, really important ways +00:52 and it's this MMO, massively multiplayer online game. +00:57 And I actually interviewed the guys from Eve +00:59 over on Talk Python in Episode 52 +01:01 if you want to learn about that. +01:02 That's all pretty interesting. +01:04 So we're going to build an online game. +01:06 Now, it's not as amazing as this, right? +01:08 This is incredibly cool, taking hundreds of people +01:10 working on it for a really long time. +01:12 But let's see what we have and how we can piece it together. +01:15 So over here, on Days 13, 14, and 15, +01:19 we talked about text games. +01:21 And the thing we actually built +01:22 was a Dungeons & Dragons wizard game. +01:24 Remember that? +01:25 It was a long time ago, I know, +01:27 but that was one of the first things we built. +01:28 It was really fun, we learned about classes and so on. +01:31 We also discussed this 15-way Rock Paper Scissors. +01:36 And we've come back to this 15-way Rock Paper Scissors +01:39 several times so we're going to do that again today +01:42 for the thing we're going to build together. +01:44 You don't necessarily have to build that one. +01:46 Actually you probably won't build that one yourself +01:48 but that's the one we're going to build together. +01:50 What else do we have? +01:51 Well, we saw that we can consume structured APIs +01:55 with Uplink, recall this? +01:56 We actually went to our movie search service +01:59 and created this Uplink client +02:00 to communicate with that and we're going to again +02:02 use Uplink to build the client side, +02:06 the playing the game side, the user side of this app. +02:09 Not the service side but consuming the service side +02:11 stuff that we build. +02:12 So Uplink's coming back, that'll be fun. +02:14 On Day 76, Julian told us all about Flask +02:17 and how simple and easy it is to get started. +02:19 We're going to take our Flask knowledge +02:22 and use Flask as the web framework for hosting +02:25 our application that is our game server. +02:28 It has the various operations that we need to use +02:31 in order to make our client applications run. +02:35 Finally and really, really importantly, we have databases. +02:40 In order to scale out our server, +02:43 make it survive reboots and all sorts of stuff, +02:45 we need to save our data and have data integrity +02:49 across the various requests and executions +02:53 of our web server. +02:54 So we're going to use SQLAlchemy. +02:56 In fact we're going to use already the exact same model +02:58 that we already added here. +03:00 So over in our demo recall we built +03:02 our persistent Rock Paper Scissors. +03:04 So we're going to take our persistent Rock Paper Scissors +03:07 and convert it to a server side version +03:10 and use the database to keep that information +03:13 going back and forth and then we're going to write +03:14 a little client to use it, that way everybody +03:17 plays on the same server, we have all the shared data +03:19 about who's played what, what were the history high scores, +03:23 things like that. +03:24 I hope you see that we have all the pieces +03:26 with the exception of building just the API methods +03:30 which turn out to be pretty simple in Flask +03:31 if you're not trying to do too much. +03:33 It's going to be an ambitious 3 days +03:36 but we can do it and it's going to be super rewarding. +03:39 So let's get started. diff --git a/transcripts/97-online-game-service/10.txt b/transcripts/97-online-game-service/10.txt new file mode 100755 index 00000000..425ebf03 --- /dev/null +++ b/transcripts/97-online-game-service/10.txt @@ -0,0 +1,34 @@ +00:00 It is cool that we have all of our +00:01 API endpoints doing JSON-ie stuff, +00:04 but, well not quite yet, almost, +00:06 but they are sort of set up for RESTful interactions. +00:10 But they don't return any real data, do they? +00:14 So, this one's pretty easy. +00:15 Let's work on this. +00:18 So what we're supposed to return here is a list of names +00:21 that then the client can use to show to the player, +00:25 and say which one do you want to play. +00:27 We could return rich objects, +00:29 but really just the names are enough. +00:32 So we're going to use a list comprehension to +00:33 take the database objects which have all sorts of stuff, +00:36 don't go in JSON very well, and just convert those +00:39 to just the particular names. +00:41 So we'll have r.name for r in game_service.all_rolls. +00:48 And then down here remember, +00:49 we say flask.jsonify(rolls). +00:54 All right, it's still running down here, see the dot? +00:56 So it should've restarted, let's give this +00:57 all rolls here a shot. +01:00 Remember we've said this before, +01:01 what'd give you all the rolls? +01:02 There we go, make that an easier read. +01:05 Boom, look at that. +01:06 So we got this back, here's our JSON. +01:08 We look at the headers we got out of JSON, +01:11 that's it, we've implemented it. +01:13 Let's review. +01:14 We got a list of names, we returned Flask JSON, +01:18 we listed to the right URL, and the right HTTP verb, done. +01:21 All right, well, that was easy, +01:23 let's see another one that's easy. diff --git a/transcripts/97-online-game-service/11.txt b/transcripts/97-online-game-service/11.txt new file mode 100755 index 00000000..b5d6e003 --- /dev/null +++ b/transcripts/97-online-game-service/11.txt @@ -0,0 +1,42 @@ +00:00 How's our create game operation working, +00:02 here we're going to do a post of this. +00:04 This says we would create a new game. +00:07 If you think about how the way that +00:09 our data base actually works, +00:11 there's not actually a lot of integrity +00:12 around this game concept and +00:14 we maybe could create some more models +00:16 and put them in there but one of my goals of this +00:18 is to change as little as possible +00:20 about the models and data access layer +00:22 and the other stuff we've already done +00:24 and just to adapt it to online. +00:26 Not exactly possible but it is very, very close. +00:29 What we really need to do here +00:30 is to just create a unique id that can be shared. +00:35 Okay? And it turns out we can do that super easily. +00:43 So we're going to create a dictionary. +00:44 In our dictionary we're going to have a game id +00:46 and how do we get it it? +00:47 It's going to be a UUID, +00:49 which is a standard library thing +00:50 we got to import at the top +00:52 and there's UUID4, +00:53 which is a great random thing we could use +00:56 but we're just going to create +00:57 a string representation of it +00:59 and give that back. +01:00 Let's save this, +01:01 it should reload if everything worked out. +01:03 Instead of saying "would create a game" +01:04 what do we get? +01:06 Boom. There is a very unique looking game id +01:09 that we can then use for all subsequent requests +01:11 to correlate or relate the various operations +01:14 between say playing around, +01:16 getting the game status, +01:17 things like that. +01:18 So that's it. +01:19 Create a game, +01:20 just create a random identifier that we can use +01:22 that is pretty unique. diff --git a/transcripts/97-online-game-service/12.txt b/transcripts/97-online-game-service/12.txt new file mode 100755 index 00000000..3df9d7c4 --- /dev/null +++ b/transcripts/97-online-game-service/12.txt @@ -0,0 +1,64 @@ +00:00 Now let's turn our attention to finding a user. +00:03 This is pretty straightforward, +00:04 but it does introduce an entirely new concept. +00:08 I could ask for a user that doesn't exist, right? +00:11 Over here, we can go to our get_user, +00:14 and Mark, I don't think Mark exists in the database, +00:16 it just says, hey, we would find him. +00:19 I'm sure that Mark doesn't exist. +00:21 Eh, it still thinks it would find him. +00:23 And the status code is 200 OK. +00:25 So what we need to do is say, +00:27 yes, this user was found and here's their details, +00:30 or no, the user was not found, and here's what happened. +00:34 So it's really easy to do this with the code +00:36 we've already written and encapsulated in our service. +00:46 Alright, so, there's our user. +00:48 And if it wasn't null, we could return it. +00:51 Be super easy. +00:52 Let's go ahead and write that code really quick. +00:56 Now, to all these database entities +00:58 that need to be returned, if I just try to return Player, +01:01 let's try to make this work here. +01:04 We know Computer exists, let's try to get them. +01:06 What happens? Boom. +01:08 Player is not JSON serializable. +01:09 Failure. +01:11 What we have to put here is not +01:13 a random object out of the database, but a dictionary. +01:20 I've added this to_json method for every one of these. +01:23 The one that's most interesting is this, +01:26 this move here, so you can see this to_json, +01:29 that is going to create this dictionary to be sent back, +01:33 right, and it's kind of encapsulated here with this class, +01:35 which I think is pretty cool. +01:37 So what we got to go over here and say to_json now, +01:40 we do that, boom, there's our computer, ID is 1. +01:47 What about Michael, does he exist? +01:49 None type has no attribute to JSON. +01:51 No, there is no Michael, so what we need to do +01:53 instead of let it crash, is we need to say, +01:55 sorry, that user wasn't found. +01:56 So we'll say if not player, +01:59 and we can just say this, abort, sorry flask.abort(404), Not Found +02:06 Alright, now let's try it for one that doesn't exist. +02:09 Okay, the page was not found, 404, that's fine. +02:12 Maybe we could give a better message about the user, +02:14 but notice this is a little bit off. +02:18 What we need to do is actually return a response +02:20 and set the status to be 404 +02:22 in our little not found handler. +02:26 Alright, there we go, 404 not found. +02:28 That's what our client can use +02:29 to say no no no, that didn't work. +02:30 We could put a little JSON message in here if we want, +02:33 but it doesn't really matter for what we're doing. +02:35 Okay, go back to working one. +02:39 Here we go. +02:40 Okay, so our get user is implemented, +02:43 and the interesting thing that we learned here +02:45 is this response message, a flask.abort(404) +02:49 which really redirects over to this not found handler, +02:52 and does whatever it's going to do. +02:54 So this is really important when people are trying +02:56 to interact with things that don't exist. diff --git a/transcripts/97-online-game-service/13.txt b/transcripts/97-online-game-service/13.txt new file mode 100755 index 00000000..d7bdef66 --- /dev/null +++ b/transcripts/97-online-game-service/13.txt @@ -0,0 +1,90 @@ +00:00 We were getting to a pretty interesting one here. +00:02 Let's look at our create_user request +00:04 that we expect to send. +00:07 We're going to send over a PUT, +00:10 in JSON form, +00:11 who's body is this JSON object. +00:14 Now it's pretty simple here, but it could be +00:15 way more interesting. +00:19 The moves, or powers, +00:22 could be a list of power one, you know, +00:25 jumping, running, whatever, hunting. +00:29 All right, we're not actually doing that. +00:30 But we could send a rich document over, +00:33 it just happens to be pretty straight forward. +00:34 Want to do a PUT to that URL. +00:36 So how do we deal with this, +00:38 how do we get that data? +00:39 We saw, +00:42 over here this really cool way of doing this +00:44 little thing in the URL, and it would come out there, +00:47 but we don't have that here, so what do we do? +00:52 Let's do a try/except, +00:58 thing, just for a second. +00:59 So let's do a little work in here, +01:00 because there's certain things that can go wrong. +01:03 So what we can do to get to this body, +01:05 is we can flask.request.json. +01:08 But it might not be there if, +01:10 there was some sort of invalid input. +01:12 So we got to test. +01:13 We'll say if, +01:17 so, if it's not there, +01:22 or they didn't supply the user field, +01:26 or they supplied it but it was null, or somehow otherwise +01:30 empty, any of those cases, this is a problem, +01:33 so we'll raise an exception. +01:35 Then it will just kick us right down here. +01:39 Okay, so this is our error handling. +01:46 Here we go, so let's do that, +01:48 this is going to be our username, +01:49 and now, what do you do with that? +01:52 So let's say player = game_service.create_player, +01:57 and it takes a name. +01:58 What happens if that already exists? +02:00 It's going to raise an exception that the player +02:02 already exists, which is another case that's going to +02:05 kick us down here. +02:06 But if we made it through all these levels of tests here, +02:09 we'll say return, +02:13 Whew, okay, so test for this, make sure we get this. +02:16 This is going to do a little bit more testing in here, +02:19 and then we'll just send this back. +02:21 However, if there's a problem, we can do this. +02:25 Instead of kicking it over to our handler, we can be +02:28 very specific and say we want a flask response, +02:33 and the response is going to be, +02:43 and the status we'll set to be 400, +02:45 which is typically bad request, +02:46 like these are all bad requests. +02:48 This, it could be some other reason that causes it, +02:51 but let's blame it on the client this time, how's that? +02:55 All right, you want to try to create the user Michael? +02:57 Let's, before we do that, let's try to get the user +02:59 Michael and just see that they do not exist. +03:01 Page was not found, page maybe that's the wrong word, +03:05 but entity not found. +03:07 So just create the user Michael. +03:10 We got this richer object back, +03:12 which gave us the name again. +03:14 But also when it was created, the id, +03:16 everything out of the database, +03:17 and now if we go and we say look for Michael, +03:20 hey there it is. +03:21 We can run that as many times as we want. +03:23 'Course if we try to recreate him again, +03:25 boom invalid request, player already exists, 400. +03:29 So literally if we go over here and we change the body, +03:31 don't pass the user field, +03:34 invalid request, no value for user. +03:36 So all of our error handling is really rocking, rocking on. +03:39 All right, let's create one more. +03:42 We'll create a Mark. +03:43 Boom, now Mark exists as well. +03:47 That's it, so we're going to come in, we're going to +03:49 try/except, just 'cause there's a lot of conditions here. +03:52 Work with flask.request.json. +03:54 If it's invalid it can be parsed it would just be none, +03:57 otherwise we're going to check the values within it, +04:00 and then we're just going to do the logic, +04:02 and return the newly created player back to the user. diff --git a/transcripts/97-online-game-service/14.txt b/transcripts/97-online-game-service/14.txt new file mode 100755 index 00000000..fe5762d3 --- /dev/null +++ b/transcripts/97-online-game-service/14.txt @@ -0,0 +1,64 @@ +00:00 Next up, let's implement game status. +00:03 So, if we're in Postman, we can pull this up, check. +00:06 I would get the details for this game +00:09 that actually doesn't even exist. +00:10 Okay, so we have a little bit of work to do. +00:12 Now, on a couple of these going forward, +00:16 I'm going to take some code and just put it in here. +00:18 I'm not against typing it out as you guys +00:20 can probably tell, I'd love to do that for you. +00:22 But there's times when it's just not really worth +00:26 you watching me write these details, +00:27 'cause we really already computed this, +00:29 but we need to change the way which we're computing it +00:33 because we can't store the state between +00:35 rounds in a particular game like we did before. +00:37 So we got to go back to the database and compute it. +00:39 It's kind of clumsy. +00:41 If we change our data model, we could do +00:43 this much more simply, but remember one +00:46 of my goals is to actually not change +00:47 the data model, 'cause I think that's adding too much. +00:51 This is going to be a little bit less pretty, +00:52 but let's have a look. +00:56 And when we ask for the game status, +00:57 we want to give several pieces of information. +01:00 Is the game over, what moves were there? +01:04 What players were involved in the game? +01:07 And, who won the game if the game is over? +01:11 So, here, we're grabbing, up here we have +01:14 the history, these are all the moves played. +01:16 We have, is the game over? +01:17 These are all things that we've wrote before. +01:20 We need to quickly, give it an id, +01:22 find a roll and find a player so +01:25 that we can use the names and stuff +01:26 in some of these methods down here, like this to_json. +01:30 So, we've built to sort of look up +01:31 that we can just quickly pass id +01:33 instead of going back and back and back to the database, +01:36 we can just store those here. +01:37 This works for a small number of players, +01:39 for hundreds or thousands, but not millions. +01:42 Alright, we'd change the way this is written +01:43 if that were the case. +01:45 Find the player, count how many times +01:47 they've won, because that actually helps us, +01:50 I don't need this anymore. +01:51 That actually helps us know whether +01:52 the game is over, things like that. +01:54 Okay, so let's go and run this. +02:00 It shouldn't be super-interesting, +02:01 because there's going to be no game, +02:03 it might even crash, index out of range, yes. +02:08 Yeah, I thought so, so there's no history here. +02:10 So let's say we need to do our little 404 thing. +02:13 We'll say this level, I'm going to just say abort 404, +02:20 flask.abort(404), and that should throw +02:24 an exception and stop it right away. +02:25 Let's try that again. +02:29 Ooh, page not found. +02:30 So we don't have any games created +02:32 'cause we have to be able to play a game, +02:34 but I think it's going to work. +02:35 We'll come back to this and test it again. diff --git a/transcripts/97-online-game-service/15.txt b/transcripts/97-online-game-service/15.txt new file mode 100755 index 00000000..8144b93d --- /dev/null +++ b/transcripts/97-online-game-service/15.txt @@ -0,0 +1,37 @@ +00:00 All right, let's do the top scores. +00:02 Over here in Postman we get, these are the top scores +00:08 as HTML, not what we want. +00:10 So let's write these. +00:11 Go ahead and put a little bit of code here like before +00:14 We're going to go get all the players +00:15 and we're going to compute the wins. +00:17 We're going to store the player as JSON +00:20 and the score as the number of wins for that player. +00:23 So this is a list of dictionaries that contains +00:28 two things, the player and the score. +00:30 And there's no particular order to this, +00:32 but because it contains the score, +00:35 what we can do is simply go down here +00:36 and say we're going to sort, give it the function +00:39 that's going to say, go get the score for each one +00:42 and sort in reverse order with that negative there. +00:46 Okay? +00:47 So now we want a return flask.jsonify. +00:51 Do you want to return all of them? +00:52 What if there's 100,000 players? +00:54 Not a great idea, so let's just return the top 10, +00:57 and we can use a slice. +00:59 So it'll construct here, if we haven't talked +01:01 about it previously we'll say, +01:02 given a large array, return either +01:04 the whole array or just the first 10 +01:06 if it's larger than 10. +01:09 Now this is not going to return anything too amazing yet. +01:14 It's given our two players, but they both have score, +01:17 actually our three players, we all have the score +01:19 0, 0, and 0. +01:20 But at least you can kind of see that it's working and then +01:23 what do you think, you can't say the sort's wrong, +01:25 because it is sorting, but as we start playing, +01:27 you'll see the highest winning players +01:29 appearing at the top here, of course. diff --git a/transcripts/97-online-game-service/16.txt b/transcripts/97-online-game-service/16.txt new file mode 100755 index 00000000..0c047d1e --- /dev/null +++ b/transcripts/97-online-game-service/16.txt @@ -0,0 +1,110 @@ +00:00 Alright, we are down to the big method, +00:03 this play_round. +00:04 It turns out this one is fairly complicated, +00:06 but its important right? +00:07 This is the way that you play a round in the game. +00:10 Okay I'm going to put some code here. +00:12 Its not going to be quite complete at first. +00:14 So, here we're going to get this thing called Game Round. +00:18 I've updated this Game Class, to have this game filed. +00:22 To have this Game Round, +00:23 and it basically stores all the information about who +00:26 rolled what, whether that roll is winning, or losing, +00:31 and who won that Round, and things like that. +00:33 It'll record it in the database, +00:35 and I'm not really going to go into it because it's +00:38 exactly the same logic as we had before but its just +00:40 kind of rewritten. +00:42 Okay, so we're going to use that here. +00:45 And we also have to do some validation. +00:46 Remember, up here, in our create_user. +00:50 We have ff not flask.json give the user and someone... +00:54 Turns out this is way more complicated. +00:56 So let me write one more method that will do this. +00:59 We'll just put that at the bottom here. +01:00 Look at all this validation. +01:01 Okay, so, we're going to come in and validate that we have a +01:04 JSON body. +01:05 That the game id was passed. +01:07 That the user was passed. +01:09 That if we try to get the user from the database the user exists +01:12 That a rule was passed. +01:13 That if we try to get the rule from the database by name, +01:15 the rule exists. +01:17 The game is not already over, etc... +01:19 We could just validate that and then re-ask those questions +01:22 above, but when you're doing web maps and you're doing +01:25 these data access things, if you already have a hold of +01:27 the roll and the user, just give them back. +01:30 What we're going to do is we're going to get those three pieces +01:32 as valid data or we'll have an exception and we'll just +01:35 return a response again, saying what went wrong. +01:39 And then we're going to jsonify the roll, the computer roll, +01:43 the player, the opponent, outcome, all the stuff we need to +01:45 basically keep track of the client and at least report to +01:48 the client what happened there. +01:50 Looks like that reload worked so let's go and see if we +01:54 can Play roll. +01:55 Lets verify that we have Michael. +01:58 Michael is there so Michael can play a game. +02:02 Lets go here and we can create another new game. +02:04 Turns out that it doesn't matter what we actually use there. +02:07 Let's look at the body. +02:09 We're going to pass in. +02:10 Some game id. +02:12 Doesn't have to exist it turns out. +02:14 Michael, and a Roll. +02:16 And let's see what we get. +02:19 Whoa, it worked, look at that. +02:20 We got a 200, response is JSON, very good. +02:24 So, what did we get down here. +02:27 Computer rolled water. +02:29 Is it the Final Round? No. +02:30 The opponent is the computer. +02:32 It's kind of not the best name, is it? +02:33 But the opponent is the computer, +02:35 the player is Michael. +02:36 We have our IDs. +02:37 Michael rolled rock. +02:39 Computer rolled water. +02:41 This is the First Round and the outcome is, +02:43 The Player loses. +02:44 Ugh, well, I'm not rolling rock anymore. +02:47 I'm going to roll human. +02:49 Let's try again. This time, they rolled scissors, +02:53 I rolled human, and I win. +02:55 Awesome. 2 for 2. +02:57 Let me just roll human a bunch of times. +02:59 And one of these times, its going to be the Final Round. +03:03 Final Round is True, +03:05 so if we go over here and ask for the status of this game, +03:08 now we can see if this thing actually works. +03:10 Oh, look, oh no, not quite the same. +03:12 Let's do that. +03:13 Boom, look at that, here's our status. +03:15 It's over, the moves are, you know, +03:18 Michael played rock, Computer played water, +03:20 Michael played human, Computer played scissors, +03:23 and then Michael just went human on it all the way the end. +03:27 Computer lost by trying to throw the sponge at us. +03:29 Okay. +03:30 Here's the players that were participating, +03:32 and the winner of this whole outcome is Michael. +03:35 How awesome is that? +03:37 And let's just do one more thing. +03:38 Let's do our error handling here. +03:40 Check our error handling. +03:42 What happens if we try to play a Round that's finished? +03:45 Remember there was an exception? +03:46 Boom, Invalid Request. +03:48 The game is already over, 400 bad requests. +03:51 Maybe it should be Invalid Operation? I don't know. +03:53 There's probably something better than bad requests. +03:54 But 404 is not it so we're going to go with 400 just for the +03:57 sake of time. +03:58 That probably felt like a lot, but the entire server is written +04:02 That's it, we're done. +04:03 We have play_round, top_scores, game_status, all_rolls, +04:07 now it's just a matter of literally going and writing +04:10 the client that's going to consume it. +04:12 And that turns out to be quite easy. diff --git a/transcripts/97-online-game-service/17.txt b/transcripts/97-online-game-service/17.txt new file mode 100755 index 00000000..fe4e73a3 --- /dev/null +++ b/transcripts/97-online-game-service/17.txt @@ -0,0 +1,77 @@ +00:00 You may be just fine having your entire website +00:02 crammed into a single file, I'm not. +00:05 It really drives me crazy to have everything jammed in here. +00:08 And this is a super simple web app, I got to tell you, +00:10 this was in the training website, for example, +00:13 this would be many thousands of lines of code here. +00:16 And it's just not great. We can do so much better. +00:20 So, let's create two files here, +00:25 one that holds just the API stuff, +00:28 and one that holds just the web view, +00:30 and then we're going to leave +00:31 the sort of start up stuff in app. +00:32 Now, you don't have to do this. +00:33 If you don't want to do this, it's fine. +00:34 But I'll show you how to do it. +00:35 So, I'm going to go over here and +00:36 create a directory called views +00:41 and something called a game_api +00:50 and also be home views, just called home. +00:54 So what we're going to do, try and come up here to the top, +00:57 and we're going to say, from views +00:59 import game_api and home +01:03 And what we need to do, is we need to basically +01:05 provide it this object, and then use that object +01:09 to define methods like this. +01:12 It's going to look a little bit funky. +01:14 It's probably not obvious, but this is what I like to do. +01:17 So, I'm going to say game_api.build_views +01:23 Now, notice this does not exist, +01:25 PyCharm says "Cannot find a Reference", +01:27 but if I hit Alt Enter, it will create that function, okay? +01:31 And then when I'm going to do +01:32 is I'm going to go down here to all +01:33 skip, skip, skip +01:35 here, from this bit down. +01:45 And just cut those and put them right here, indent it. +01:48 Indent it. So when we call the function +01:52 the buildviews function we do these things. +01:54 I'm probably going to go through +01:55 and make sure some of this stuff is imported, +01:57 like import flask. +02:21 Whew, okay. So I had to go through and import all the stuff, +02:24 or rather, let PyCharm import the stuff that is needed here, +02:29 but let's go back to our app. Do a little cleanup, +02:34 and notice this is looking better. +02:36 We don't need this. Actually, we need that one +02:38 in just a second. But these things we don't need, +02:41 this is looking a little cleaner. +02:42 So let's do exactly the same thing, but for home. +02:49 And what's going in there, well, +02:50 let's give it this index API test travel delete. +02:57 And this. +03:03 Now again, we got to import flask at the top. +03:05 We have our index and we have our not found. +03:08 Whew, now if you look at this page, +03:10 if you look at this app file, what does it do? +03:13 It'll just start update it runs the app. +03:14 Um, we should probably make this method like so +03:20 like build_views. +03:28 Because again, this is simple now, +03:29 later this is going to be not so simple. +03:34 Is it still running? Let's see. +03:37 It is. Does it still work? +03:40 Um, play around is not going to work. +03:42 But we can get Tom's scores now. It works, awesome. +03:45 And let's see then, 4, 4. +03:50 This works, and if we just go here, +03:52 test our other API stuff, hello world. Awesome. +03:54 So we've cleaned up our code, in my opinion, dramatically. +03:58 You know exactly where to go +03:59 to work with the main home page webviews. +04:01 Here's the API just for the game. +04:04 Here's your startup code, how you config your app. +04:07 To me, this just is like, ah, so much better, +04:10 so much cleaner. If it's not that way for you, +04:13 then, you know, put it some other way. Right? +04:15 But this is a pattern that I like to use. diff --git a/transcripts/97-online-game-service/18.txt b/transcripts/97-online-game-service/18.txt new file mode 100755 index 00000000..2fcf193c --- /dev/null +++ b/transcripts/97-online-game-service/18.txt @@ -0,0 +1,58 @@ +00:00 Okay, let's come over here +00:01 and close the story on the web +00:03 and go to our client. +00:04 And we're going to use Uplink, +00:06 so we're going to put that in our requirements on txt +00:09 and let's add a game app, call it game_app. +00:13 That's the thing that you're going to play. +00:15 And let's separate our API definition +00:18 from our UI, which is kind of this. +00:21 So let's do a quick main. +00:29 Do a little bit of skeleton code here, +00:31 get that running. +00:32 Okay, this is our little game_app. +00:33 Let's add another one called api. +00:37 And this over here is where we're going to use Uplink. +00:40 So we're going to import uplink +00:44 and we have not installed those have we? +00:47 So let's go over here to client +00:48 and run the same code. +00:53 There PyCharm is less unhappy, let's say. +00:57 So what we're going to do is we're going to +00:58 define a class over here using Uplink +01:00 and remember the way it goes, +01:01 this is going to be a GameService +01:04 and the way it works is it's going to be uplink.consumer +01:09 and then we just define methods. +01:11 Like def find_user. +01:15 We put in the user name +01:16 and then down here we just have nothing +01:18 but we put in this at uplink.get +01:21 and then it's something like +01:22 API game users username. +01:26 Now they use curly braces which I prefer over here, +01:29 where as Flask uses angle brackets +01:31 but whatever it's all the same. +01:33 The other little trick that +01:34 we'll have to do here is to define an init +01:38 and set the base URL to wherever it is. +01:43 Something like 5000. +01:46 Let's add another one here. +01:47 This time for all rolls, +01:48 remember that's doing a get against api/games/rolls. +01:53 It gets more interesting, code word for complicated. +01:56 If we're going to do a create game, +01:58 we're going to do a post up to API games game games +02:02 and we're going to pass a body +02:04 of just a dictionary as a body. +02:06 But let's just go over here +02:07 and let's just see if we can get this +02:09 all rolls thing to work for a second. +02:13 You've got to import that and we'll just say all_rolls. +02:16 Now remember what we get back here +02:18 is we're going to get a response. +02:20 It's going to be okay but not amazing. +02:23 200 response, 200 that's already good right? +02:26 And if that's true we could do a JSON here like this +02:31 and we get boom, look at that. +02:33 It's already working, that is so super cool. diff --git a/transcripts/97-online-game-service/19.txt b/transcripts/97-online-game-service/19.txt new file mode 100755 index 00000000..6d882ac5 --- /dev/null +++ b/transcripts/97-online-game-service/19.txt @@ -0,0 +1,28 @@ +00:00 So we're over here, and we're calling service all_rolls, +00:04 and then we have to, remember you have to basically say, +00:07 service.all_rolls. Store that," and another thing +00:11 you have to say, raise_for_status +00:15 and then call JSON if that worked. +00:17 So that was really cumbersome. +00:20 So we created this thing called The uplink_helpers, +00:26 which had this basically uplink response handler +00:30 raise_for_status. +00:32 So if we go over here to our game, +00:34 oh sorry, api, excuse me, and we say this, +00:38 then it won't let any code through that fails. +00:42 So we know that it's safe to say .json right here, +00:45 'cause it's already tested it. +00:47 We can do better though. +00:48 We make it all of these methods return the dot. +00:50 JSON will response a result by adding one other thing. +00:55 This response to data. +00:56 So given a response, we just call response.json. +00:59 Otherwise, they throw a format error. +01:02 If we also put this at the top, +01:06 on the outside, not the inside. +01:08 The outside; That's important. +01:10 And this one goes on the inside. +01:11 Then we can come down here, and just print this. +01:15 And we should be our little devil, all the various pieces. +01:19 We do. Very nice. So I feel like our game service is in place, +01:23 and that really makes working with it nice and easy. diff --git a/transcripts/97-online-game-service/2.txt b/transcripts/97-online-game-service/2.txt new file mode 100755 index 00000000..ed06588c --- /dev/null +++ b/transcripts/97-online-game-service/2.txt @@ -0,0 +1,65 @@ +00:00 Now before we write some code and we're going to do +00:02 some pretty interesting things, I think, +00:04 in terms of organization and the way +00:05 we put this all together but let's just think +00:07 at a really high level, what operations +00:10 does our website need to support? +00:12 So we'll talk about how to build these. +00:14 But let's just sit back and think about, +00:16 if you can remember back to our 15-way persistent +00:20 Rock Paper Scissors, pretty recent, +00:22 we had a couple of things that were happening in that game. +00:26 Here's what I think we're going to need to do in order +00:29 to move all the logic and persistence to the server +00:32 and still let the client communicate with it. +00:35 So first of all, you're going to need to be able to +00:37 register a user or get an existing user +00:40 and I broke those apart you know, with a website, +00:42 it just kind of seemed like you should either +00:44 kind of login or register as two separate things. +00:47 You can put them separate or if you want to, +00:49 you can combine them back like we had get or create user. +00:52 We want to start a new game, now this is really important +00:55 because what we're going to do is we're going to create +00:57 basically an id for the game and all subsequent +01:00 operations will exchange that game id as part of +01:04 who they are and how they're interacting so if you ask +01:07 for, show me the history, who won, play a round, +01:10 you're going to pass around this id that +01:12 we get by starting a new game, +01:13 we will show the rolls and let the user pick +01:17 the rolls from an existing list. +01:19 Now we could just hard code the 15 rolls into the client +01:21 but what if we want to someday upgrade it? +01:24 Maybe around St. Paddy's Day, you could throw a leprechaun +01:27 and you want to make that a feature of the game, +01:28 you want to add it, it just automatically have everybody +01:30 pick those up or you want to convert it to 25-way +01:33 Rock Paper Scissors or something along those lines. +01:35 So we're going to get the rolls from the server +01:38 so that we're always consistent +01:39 with what the server expects. +01:41 We can ask, what is the game status? +01:43 Most importantly, is it over and who won and things +01:46 like that but this will kind of give us the history +01:49 and the status of whether it's over and so on +01:51 and finally one of the critical parts +01:54 is actually playing a round. +01:56 I want to roll the devil and see what happens, right. +01:58 We'll have a computer player on the other side +02:01 and they'll randomly choose something and you'll see +02:03 if they win, whether you win and so on. +02:05 But this is sort of the playing of the game +02:08 and we'll just play the rounds until +02:09 we find out that the game is over. +02:12 And finally, one of the fun things we had in the original +02:14 game, the persistent one, was when it started it showed +02:17 that the players with the top scores. +02:20 Of course, those were just the players on your machine +02:22 that you happened to have played previously. +02:24 We're going to add a top scores operation so basically +02:28 you get the global top scores and you can be ranked +02:31 in the top ten, in the entire world in 15way +02:34 Rock Paper Scissors demo app, wouldn't that be cool? +02:37 So you'll be able to see that here, as it comes along. +02:41 So these are the operations we're going to build in Flask. diff --git a/transcripts/97-online-game-service/20.txt b/transcripts/97-online-game-service/20.txt new file mode 100755 index 00000000..bbe5eb06 --- /dev/null +++ b/transcripts/97-online-game-service/20.txt @@ -0,0 +1,20 @@ +00:00 You saw how easy these are to add. +00:02 Let me just drop in the other however many more, +00:04 five methods or whatever it is. +00:07 So we've got play_round, which has the body. +00:09 We've got top_scores. +00:10 We've got game_status, and so on. +00:13 That rounds out our little game service. +00:15 And we'll come over here, +00:17 we'll create one of these. +00:19 Create the top of our main method, actually, +00:20 let's do that. +00:22 And then we can call things like all_rolls +00:24 or Top Scores, and see what we get. +00:29 There's all_rolls, these are the top scores. +00:31 Michael apparently has scored one, +00:33 which beats, I guess everything else was score zero. +00:36 Yeah, it looks like it. +00:37 Okay, so, really, really cool! +00:39 This lets us interact with this service. +00:42 Now let's add in the logic. diff --git a/transcripts/97-online-game-service/21.txt b/transcripts/97-online-game-service/21.txt new file mode 100755 index 00000000..3e655629 --- /dev/null +++ b/transcripts/97-online-game-service/21.txt @@ -0,0 +1,76 @@ +00:00 You saw us write the game, +00:01 interaction of the game loop previously. +00:04 We've consumed a bunch of API's with Uplink already. +00:07 So let me just drop in some code here that is going to +00:11 be basically, the same thing but using the service, +00:15 just for the sake of time. +00:18 So what do we got? +00:19 We're going to print out the top scores, +00:20 and we're going to call top_scores and then we'll loop +00:22 over them, and remember everything that comes back is a +00:24 dictionary so we've got to get the values and then +00:28 this is a nested dictionary, +00:29 so we've got to get the name from the player that we got, +00:31 and so on. +00:32 So we're going to print out the top scores, +00:35 we're going to create a new game that's going to return +00:37 that dictionary which we're going to get the game id. +00:39 We could do some work to make this much easier to consume, +00:41 but just keep it focused on more the server side. +00:44 Kind of just roll with what we got. +00:46 Give us all the rolls, get us the player list. +00:48 Suppose we want to be the player Charles. +00:52 And then we're just going to say while the game is not over, +00:54 we're just going to go through and play a round, +00:55 pass the game id, +00:57 the user being Charles, and the roll which we're randomly +01:00 choosing from the various options we got from the server. +01:05 Right up there. +01:06 Okay, so we're just going to go run and do that, and when +01:08 it's over we're going to get the game status, +01:10 and print the outcome which the game status has the winner. +01:13 Oh, okay, so let's run this. +01:16 By the way, it doesn't ask us what we want to do. +01:19 It just randomly chooses rolls for Charles, +01:21 and makes him play those. +01:22 But it could just as well, this could be an input or +01:25 some other type of UI. +01:29 Oh, Charles is not found. +01:33 Yeah, I guess we got to create Charles. +01:34 Let's go ahead and just create him this way, +01:35 it's probably the easiest way. +01:43 All right, try again. +01:45 Boom, look at that. +01:48 Top scores, Michael scored 1, Charles scored 0, +01:51 so Charles threw rock, computer threw scissors, +01:54 that resulted in a win for the player which is Charles. +01:57 We got a tree and a sponge, win. +02:00 Lightning does not beat the devil, +02:02 water does not beat humans, +02:03 but finally the end, humans beat scissors and that takes it. +02:07 The game is over and Charles is the winner. +02:10 Let's run it again. +02:11 At the top you see now Charles and Michael have 1. +02:13 One score each in the top score, in the leaderboard there. +02:17 Come down here, game is over, the computer won. +02:20 Let's try again. +02:21 Leaderboard should now be 1, 1, 1. +02:24 How come Charles winner, is the winner. +02:26 So if we run it this time, +02:27 Charles now has the global high score. +02:32 Pretty amazing. +02:33 It might feel like we're kind of playing the same game, +02:35 but this is totally different, right? +02:36 We could put this on a phone app, +02:38 we could distribute this around the world. +02:40 And if we were hosting that website somewhere +02:42 like Heroku, or Digital Ocean, or Linode, +02:45 or something like that. +02:46 Put it out there, and this would be shared for the world. +02:49 Pretty cool. +02:50 Hopefully this has inspired you to see what you could build. +02:55 I know it's not the super simplest demo, +02:57 but it's pretty realistic, and it does cover a lot of +03:00 interesting use cases, and it really opens another world +03:04 for you guys to build cool applications that are +03:07 data driven remotely. diff --git a/transcripts/97-online-game-service/22.txt b/transcripts/97-online-game-service/22.txt new file mode 100755 index 00000000..706325db --- /dev/null +++ b/transcripts/97-online-game-service/22.txt @@ -0,0 +1,62 @@ +00:00 Let's review just a few of the core concepts +00:02 that are new for this set of days. +00:06 We interacted with a lot of powerful, and honestly, +00:09 a little bit tricky bit of code, with SQLAlchemy, +00:12 and some of the other stuff, configuring Flask. +00:16 The stuff that was new was using these Flask view methods +00:20 as api methods, so, how do we do that? +00:23 Well we start out by defining the route, +00:25 this is standard Flask stuff. +00:27 We particularly focused on the methods +00:29 because this really strongly drives how RESTful API's work. +00:33 some of them are GET, some of them are POST, and so on. +00:35 So we set the methods there. +00:38 Then we'd write our standard implementation, +00:41 nothing really to do with Flask at all in this one. +00:44 We just go to the data base, convert our wins +00:47 into something that we'll be able to send back. +00:49 So, dictionaries, or dictionaries +00:51 of dictionaries, things like that. +00:53 Here's a list where each item is first, the player, +00:56 which is the dictionary and the scorer which is a number. +00:59 Okay. And then once we have our data to send back, +01:02 we just call, return flask.jsonify, the data we wanted. +01:06 Here we grab the top ten wins +01:08 sorted by the most winning players. +01:12 So this is super simple and super straightforward +01:14 for these GET methods. +01:16 The other type that we worked with was the POST. +01:19 Now this one's a little bit more interesting +01:22 because typically there is some kind +01:24 of body being sent to us. +01:26 A JSON body with lots of data in it. +01:29 We're going to come in here, have a route again. +01:31 This method is set to POST this time. +01:34 But now we're going to check +01:35 that the body was understood as JSON, +01:38 and if it's not, we're going to send a 400 +01:40 which is a bad request. +01:44 You saw in the code that you can actually abort +01:46 within a Flask response, which is richer. +01:49 You could give 'em a description of what went wrong +01:51 and things like that. +01:53 Then we have to get the data. +01:55 Once we know that we have a JSON body, +01:57 we have to get the data out of it. +01:59 So here we're pulling the game id, +02:01 but in our play round example, +02:03 there's actually a bunch of stuff +02:04 we had to pull out and validate. +02:05 So a lot of validation, what ended up, +02:07 we actually moved that to a separate method, +02:10 and in the very end we just, again, returned +02:12 some jsonify result of whatever we wanted to tell them +02:16 We created, or was the outcome of this post. +02:19 So that's it, you also have PUT and DELETE, +02:21 but you can imagine they're really quite similar. +02:24 So you should be able to implement those. +02:26 It's just more of a conceptual thing for your API +02:29 than it is actually different in code. +02:32 So you now know how to make these APIs in Flask. +02:35 Hope you enjoy it, there's really cool +02:37 stuff you can do with it. diff --git a/transcripts/97-online-game-service/23.txt b/transcripts/97-online-game-service/23.txt new file mode 100755 index 00000000..8b20c9a5 --- /dev/null +++ b/transcripts/97-online-game-service/23.txt @@ -0,0 +1,49 @@ +00:00 That was a big one, wasn't it? +00:01 Quite a bit of stuff we covered there +00:03 but I hope it was worth it. +00:04 I hope you really feel like you have +00:06 this great, cool power. +00:08 What I would like you to attempt with whatever +00:10 time you have remaining for these 3 days, +00:13 make it as far as you can, if you don't +00:14 get done like, no big deal. +00:17 Try to create a game, kind of like we did, +00:20 but do it remotely. +00:22 Set it up so you that you can play a game +00:26 and people can have their high scores +00:27 and a record of the game and a history and so on, +00:31 players that can come back and resume +00:33 playing other games and so on. +00:35 If they get some kind of ranking or something right, +00:37 like experience or points. +00:40 One game I had in mind, it's really simple. +00:42 Simpler than what we were doing by quite a bit +00:45 that you could work on is the high, +00:47 low or guess that number game. +00:49 Just goes like this, what's your name? +00:50 Pick a number between 0 and 100. +00:52 50, too high. +00:53 30, too high. +00:54 10, too low. +00:55 15, too low. +00:56 19, boom, you win. +00:58 Simple game and you don't even have to write it. +01:00 The whole thing actually exists right here, +01:02 you can grab it but your goal is to move this logic +01:05 and the persistence to the server. +01:07 So hopefully this is a simpler version +01:09 of what we talked about. +01:11 In addition to watching the videos today, +01:14 if you have extra time, take this high, low game +01:17 or some other game you want to do +01:18 and add database persistence to it. +01:21 Feel free to borrow heavily from the code that we dropped +01:25 in there as well on this one, right? +01:26 You've got to, remember you've got to create the sequel +01:28 off of your base, you've got to define the classes, +01:31 you've got to create the factory, you can just copy +01:33 that stuff over, change the names of the classes +01:35 in the columns 'till it works for you. +01:37 Okay, so that should be pretty quick, +01:40 if you rob the code from a previous day +01:43 that you've already done. diff --git a/transcripts/97-online-game-service/24.txt b/transcripts/97-online-game-service/24.txt new file mode 100755 index 00000000..e194023e --- /dev/null +++ b/transcripts/97-online-game-service/24.txt @@ -0,0 +1,20 @@ +00:00 On the second day, you'll create the web services. +00:03 What are the various operations +00:06 you're going to need to do? You'll probably have a create and find user, +00:08 a game status, top scores, play round, +00:12 that kind of seems like it, but think +00:14 about how you want that game to play +00:16 if you chose something other than Hi-Low, +00:18 well, then I can't really guess, I can't really help you. +00:20 You don't need to write any client code, +00:22 you can just use Postman right here +00:24 then you can get it right there. +00:25 Of course, you use Postman like we did +00:28 to get it entirely working. +00:29 Remember, by the time we even created +00:31 our client code, we never touched +00:33 the web app again, it was totally working, +00:36 and that's partly 'cause I had prepared +00:38 a few of the tricky bits beforehand, +00:40 and that's also to a large degree +00:42 'cause we tested it out with Postman. diff --git a/transcripts/97-online-game-service/25.txt b/transcripts/97-online-game-service/25.txt new file mode 100755 index 00000000..9babc139 --- /dev/null +++ b/transcripts/97-online-game-service/25.txt @@ -0,0 +1,35 @@ +00:00 Final day, Day 99, use Uplink +00:03 to write a client that then consumes the API. +00:07 One thing you'll have to be really careful about +00:09 is you have to have the flask server running +00:12 while you run your client game code, +00:16 because obviously the server has to be running +00:18 for you to talk to it. +00:20 Other than that, right, it's pretty straightforward +00:22 to use Uplink, you can borrow the code +00:25 that we wrote, and those little helpers +00:27 make the code a little bit cleaner. +00:29 But use Uplink, or if you'd rather, +00:30 just use the raw requests code, +00:32 although it's slightly more cumbersome, +00:35 but would totally work as well, +00:36 it's not that big of a difference. +00:38 And I probably won't get done early +00:40 but if you and you feel like, hey, +00:42 I want to do something bigger, +00:44 you can jump over here to Heroku, +00:47 Heroku is like a simple platform, +00:49 it's a service for, really popular among Python developers, +00:52 and you follow their getting started guide, +00:54 you could put this not just on your machine, +00:56 but you could put it on the internet +00:58 and play it from your phone, +00:59 play it from all over the place, share it with your friend, +01:01 whatever you want to do. +01:02 So that's kind of a stretch goal if you happen to get there, +01:06 but if you don't, don't feel bad about it. +01:09 This is a big deal, this is your +01:10 last major block of three days +01:12 and so you are almost done with your #100DaysOfCode, +01:15 it's awesome you made it this far, +01:17 and I hope you're loving what you're doing. diff --git a/transcripts/97-online-game-service/3.txt b/transcripts/97-online-game-service/3.txt new file mode 100755 index 00000000..78696728 --- /dev/null +++ b/transcripts/97-online-game-service/3.txt @@ -0,0 +1,64 @@ +00:00 Alright, so let's get our project ready +00:02 and everything set up here. +00:04 So I'm over here in the GitHub repository and +00:09 Day 97 to 99 in the demo app. +00:12 So, what I want to do is just create a +00:14 virtual environment and then +00:15 we'll do the rest from within PyCharm. +00:21 Okay, so we can just open this folder +00:22 on Windows you would type "start." +00:25 on Mac you type "open". +00:31 So here we have our empty app and we've done this +00:33 many, many times throughout this course +00:36 but this time is different. +00:37 We want to actually have two separate applications +00:40 contained within this project. +00:43 Let's go and create a folder for the client +00:48 and let's create a folder for the web. +00:52 Alright, so there's our client, there's our web, +00:54 each one of these is going to have it's own +00:56 set of requirements, so let's go ahead and add those. +01:06 Okay, this is a pretty good start. +01:08 So we have our set of requirements for a client +01:10 and we have the set of requirements for the web. +01:14 And notice we have our virtual environment active here +01:17 and if we ask what is installed, +01:20 there's nothing, of course. +01:22 So we're going to entirely focus on the beginning. +01:25 Just on the web application, okay? +01:28 So we're going to close up this client here but before +01:31 we do there's one really quick thing we should do. +01:33 When we have files over here, +01:35 we kind of want to treat this as the whole project, right? +01:38 You might have a api.py and a program.py +01:41 and the program might import api. +01:43 In order for that to work easily in PyCharm is what we +01:46 need to mark this directory as the source's root, +01:48 say this is kind of its own little area. +01:50 Same thing for web. +01:53 It's effectively adding that thing to the Python path +01:57 and making that the working directory and things like that. +02:00 Okay, so, this is just the basic stuff +02:03 that we've got going on here. +02:06 Alright, that's the web one. +02:07 We're going to tell the web one +02:08 that we require Flask and SQLAlchemy. +02:11 Those are the things that we're going to need. +02:14 So, we'll go over here to web. +02:18 pip install -r requirements.txt +02:20 install everything in that file. +02:26 And last thing, let's go ahead and add an app.py +02:31 this is pretty standard in Flask +02:32 and we'll just print Flask coming soon. +02:37 And let's go ahead and run this. +02:39 Yay, Flask is coming soon. +02:41 Let's get this run configuration set up +02:43 for a few good things here. +02:45 So we'll go over here and say +02:46 this is going to be the web app. +02:49 And we also want to have it restart +02:51 because the web apps open a port, +02:53 this one will be port 5000 and if you try to run +02:56 a second one without closing this one it'll crash, +02:58 so this will tell PyCharm obviously to do that correctly. +03:01 Alright, well, I think our structure is in place. diff --git a/transcripts/97-online-game-service/4.txt b/transcripts/97-online-game-service/4.txt new file mode 100755 index 00000000..7cbc3cb4 --- /dev/null +++ b/transcripts/97-online-game-service/4.txt @@ -0,0 +1,51 @@ +00:00 Alright, so this Flask is coming soon. +00:02 Flask is coming now, let's do it. +00:03 So we're going to import flask, +00:05 and down here, remember, you have to create the Flask app. +00:08 And I'm going to use it like this, so we always see +00:10 the full namespace of flask, +00:12 just so it's really clear what's going on here. +00:14 And let's just build, like, a hello world, +00:16 or welcome to our site, little view method here. +00:20 So let's call this index. +00:22 And you have to add the app.route decorator +00:25 and in here we're just going to put forward slash. +00:28 So that's going to tell it what to do, +00:29 and then we'll just say return hello world. +00:33 And just for good measure, just so we can keep track of this +00:36 in the future, 'cause we're going to run into issues, +00:38 let's add a not found 404 handler, +00:41 and we'll just return the page was not found. +00:46 So that's great. +00:47 And then let's go down here and we'll actually +00:50 have a main method, let's put that right at the top. +00:52 That's my style. +00:54 So we'll say app.run like so. +00:57 And let's even say debug=True. +01:00 That's going to be really nice for us, we'll see why in a bit. +01:03 And then we'll say down here, we'll do our little +01:05 main convention, that is in Python, +01:07 and we'll run the main method if that's the case. +01:10 Whew, okay, is it ready to run? +01:11 Let's run our web app and see. +01:14 Whoa, success. +01:15 We have something here. +01:17 Click on it. +01:19 Hello world, awesome, how about that. +01:20 What if we go to abc? +01:24 Page was not found. Okay, so it looks like both the regular index +01:28 and the not found stuff is working really well. +01:31 So this is cool, and just so you know, +01:33 what this debug=True is it'll watch these files +01:37 and see if you make a change and automatically reload it. +01:40 So let's go to hello world, three exclamation marks. +01:44 Go over here, if I refresh. +01:46 Automatically, I didn't have to do anything. +01:49 Because down here, you can see +01:50 it detected a change in that file. +01:53 Restarting, debugger is active. +01:54 Beautiful. +01:55 Okay, so, this is all really good, +01:57 we got our Flask up and running. +01:59 But this doesn't feel very much like +02:01 a JSON API method, does it? diff --git a/transcripts/97-online-game-service/5.txt b/transcripts/97-online-game-service/5.txt new file mode 100755 index 00000000..35430d6e --- /dev/null +++ b/transcripts/97-online-game-service/5.txt @@ -0,0 +1,72 @@ +00:00 Alright so, this simple little bit of code +00:02 is a pretty decent Flask application +00:05 running in debug mode. +00:08 What's going to be important for us is not +00:09 to return HTML, not really HTML, just text, +00:13 but not really is it to return +00:15 text and HTML for the browsers, +00:17 but is instead to return JSON to communicate. +00:21 Remember, several times throughout this course, +00:24 we've interacted with JSON APIs, +00:26 we had the Movie Search app, +00:27 we had searching talk Python.fm, +00:30 we've worked with GitHub, we've worked with other things, +00:33 and all that was consuming JSON APIs. +00:35 Now we need to build one. +00:36 So how does that work? +00:38 Turns out to be not too hard here. +00:40 So let's come over here and this will just be api/test. +00:44 And you got to make sure that you name this, +00:46 let's just call this test api_test. +00:49 Like that. +00:52 Now if we call this, it's just going to return +00:55 Hello world. Or Hello API test. +00:58 Let's just see that that actually is working. +01:00 And we're going to use Postman over here. +01:02 So, if we go and just get a request, +01:05 straight like that, we can look at the headers. +01:07 The content type is HTML and it's a 200. +01:11 What if we go to api/test? +01:15 Look we got a 200 again. +01:17 That's really cool. +01:18 Right now we're getting HTML and the body is just this. +01:20 So we have the routing working, +01:22 and notice it automatically detected that change, +01:24 that's super cool. +01:25 But, what we want to do is instead let's suppose +01:28 we have some data. +01:31 So this'll be name is Michael. +01:36 Day, it's going to be 97. +01:38 What if we want to return this, +01:40 like we could've gotten that from our database, for example, +01:42 but we want to return this as JSON. +01:46 Super easy. So we're going to return flask.jsonify(data). +01:52 Let's try that. +01:54 Now if we do a get. +01:55 Boom. +01:56 There's our raw JSON coming back +01:59 and the type is application JSON. +02:01 So that's all it takes really to build these APIs. +02:04 Is we put in a route and then we have some data +02:07 and we jsonify it. +02:09 The other aspect that we're going to need to work with +02:11 is how do we work with whether this a +02:15 HTTP GET or POST or PUT. +02:17 Because when you're working with the APIs remember, +02:19 creational type things are done with POST and PUT. +02:22 Read only stuff is done with GET, and so on. +02:24 So you'll see, we can go over here +02:26 and say method=GET, or POST, or PUT, or both. +02:30 We could actually handle GET and POST. +02:34 Like that. +02:35 This one's only going to be for GET. +02:37 Okay, so these are the building blocks that we need +02:39 to build the seven operations that we've talked about. +02:43 The other stuff that we're going to need is the actual data, +02:46 and the game play, and so on. +02:47 And we've already written that +02:49 and we're just going to move that in, +02:50 and copy some code over, and adapt it. +02:53 Because we've already spent a lot of time +02:54 working with that code. +02:55 And then we're going to adapt it to methods just like this. diff --git a/transcripts/97-online-game-service/6.txt b/transcripts/97-online-game-service/6.txt new file mode 100755 index 00000000..51b38402 --- /dev/null +++ b/transcripts/97-online-game-service/6.txt @@ -0,0 +1,40 @@ +00:00 All right, it's time to move some existing code and data +00:04 over here, just from our previous persistent +00:06 Rock Paper Scissors. +00:08 Remember, one of the things that we used in the 15-way +00:10 Rock Paper Scissors was we needed this CSV file to +00:14 basically determine who wins and who loses +00:18 for any combination of those 15-way battles. +00:22 Let's paste that over here. +00:24 We're going to have our CSV file that tells us that, +00:27 and we'll also have this DB folder thing, +00:29 we already saw that. +00:30 This just tells us easy way to get back to this location +00:33 base and generate either read or writable files here. +00:36 We're going to put our SQLAlchemy data in there as well. +00:40 That has to do with reading the data in the games. +00:43 The other thing we had was lots of stuff around SQLAlchemy +00:45 defining the models and saving and querying who played +00:50 a game, does the player exist, all of that stuff. +00:52 We're just going to take that and drop it in here. +00:55 We're not really going to change that hardly at all. +00:59 But I'm going to make this folder called game_logic, +01:02 and you can see we have our SQLAlchemy declarative base. +01:05 We have our move. +01:06 This literally is the same thing as before. +01:08 It's not changed at all. +01:09 We have our game decider, our GameService. +01:12 These are all basically the same. +01:14 I had to add just a couple of methods to GameService, +01:16 but they're super trivial, like find a roll by id, +01:18 and things like that. +01:20 Nothing important or new here, +01:24 other than this only change really is that this game, +01:27 it used to have all the loop logic and all that stuff, +01:31 and now we need to really separate that. +01:33 That's going to go down into the client, +01:35 but there's still a little bit of work that our game class +01:37 is going to do. +01:38 We'll have this over here. +01:41 There we've moved in the code from our game previously. +01:44 Now our job is to integrate it into our web application. diff --git a/transcripts/97-online-game-service/7.txt b/transcripts/97-online-game-service/7.txt new file mode 100755 index 00000000..9a7d4592 --- /dev/null +++ b/transcripts/97-online-game-service/7.txt @@ -0,0 +1,99 @@ +00:00 When you saw me get started with Flask here, and I created +00:03 a main method, and the main method we call run. +00:05 And then down here where if the, +00:07 the main convention where I call main, +00:09 you might have thought, +00:10 "Well, why don't you just run down there? +00:11 Come on. +00:12 Like, what are you doing?" +00:13 It turns out that in real web applications, +00:15 there's tons of startup and configuration code. +00:17 Configuring the logger, configuring the +00:18 database connections, etc., etc. +00:21 So I did this with that fact in mind. +00:23 So one of the things that we're going to need to do is +00:26 we actually need to make sure that the starter data that +00:30 they application is going to use exists. +00:33 All the rules have have been created in the database. +00:35 There's always going to need to be a computer, +00:39 sort of opponent user, like a built-in user. +00:41 We are going to create that as just a standard user +00:43 in the database with a special lookup and things like that. +00:47 So let's go over here, +00:49 and maybe we can make this more obvious. +00:51 We can say... +00:55 "Run web app," +00:56 and we can take this and put that down there. +01:01 And up here, we'll say, "Run web app" as the last thing, +01:04 but let's call another one, let's say, "Build starter data." +01:07 And we'll define Builder Starter Data. +01:10 Well, what goes in here? +01:11 Well, we can go to our game decider. +01:19 Go up here and say, "from game_logic import game_decider" +01:26 We're also going to need GameService later +01:28 in just a second. +01:34 So we'll come down here and say, +01:35 game_decider.all_rollnames." +01:42 We can just print out roll names, just to see what's +01:44 coming along really quick here. +01:47 And let's just throw a quick return so the app +01:49 doesn't actually start. +01:52 Here you can see we are getting all the roll names. +01:54 That's really cool. +01:56 So it looks like that's working. +01:58 And then the GameService, +02:00 this is the thing that talks to the database. +02:01 It has an init rolls, and if you give it the roll names, +02:04 it will make sure that all these are created in the +02:06 database, have ID's and things like that. +02:10 If they're already existing, +02:11 this is just going to bail out of that. +02:14 The other thing has to do with that computer users. +02:16 So let's come over here and say, +02:17 Computer = GameService() +02:22 Find player by computer." +02:24 And if the computer already exists, that's great. +02:26 But if it doesn't, we're going to create this one. +02:35 We'll create the player called computer. +02:37 Okay, so we want to make sure this happens +02:40 every single time. +02:41 Now, it's kind of silly because, really, +02:43 it only has to happen once, and then the +02:44 database is initialized. +02:45 But have this here to make any changes, +02:47 make any additions to, will be really, really nice. +02:50 So, before we run our web app, we're going to make sure that +02:53 the starter date, or like the rolls, +02:54 and the computer player, and so on, are all there. +02:57 Let's go ahead and run this and see how it works. +02:59 Run it and nothing happens. +03:01 Well, not nothing. +03:02 It built the starter data and then I, +03:04 sure, sure I could do this right here, right? +03:06 So if we run it now, it should be running the web app. +03:08 But let's look in here. +03:11 Woo, look what we got over here. +03:13 We have our Rock Paper Scissors SQLite database. +03:16 Let's put over into here and see what we got. +03:29 There are all the rolls. +03:31 Created that time: rock, gun, lightning, devil, and so on. +03:34 If we run it again and again, we're never going to have +03:36 more than 15 rolls. +03:37 The other thing that we might want to look at +03:40 is from players. +03:42 And now we just have our computer that we created, as well. +03:44 So we have our starter data. +03:46 Now our system is just going to check. +03:52 Like this init_rolls, if we go to there, you'll see. +03:55 It says, "Look, if we have some here, let's just get out." +03:57 Right? +03:58 Similarly, we check to see if the player already exists, +04:01 and if they do, we're just not going to do anything. +04:04 But if they don't exist, we're going to +04:05 create them the one time. +04:07 All right, so now we have our models imported. +04:10 And remember, this is effectively just what we did +04:14 in the previous demo. There's nothing changed here. +04:16 We just dropped it in here and called a couple of functions +04:19 in the beginning of our web app before we let it run every +04:21 time it starts up, to make sure out database is all set up. diff --git a/transcripts/97-online-game-service/8.txt b/transcripts/97-online-game-service/8.txt new file mode 100755 index 00000000..616e1f5a --- /dev/null +++ b/transcripts/97-online-game-service/8.txt @@ -0,0 +1,119 @@ +00:00 Now, we're going to do something that makes +00:02 my skin crawl a little bit. +00:03 We're going to write a ton of code into this one, +00:06 ginormous, what's going to become +00:07 a ginormous single file web app, yuk. +00:11 Afterwards, I'll refactor it in a way +00:14 that I think is much cleaner and simpler. +00:17 If you don't like the refactored one I do, +00:19 you can just stop with what we're going to do +00:21 this time around and leave it organized this way. +00:23 I think you'll find it to be a lot nicer. +00:25 Okay, so what is the goal of this particular video? +00:29 We're going to go in here, and we're going to define +00:32 7 API methods, the 7 that we talked about +00:35 at the beginning, and recall down here, +00:37 we saw how to do this. +00:38 We have some kind of route, some kind of HTTP verb. +00:43 These are very important in RESTful services. +00:45 We get the data; this, we're going to get +00:47 from the database in the end. +00:49 And, we're going to return just the JSON response +00:54 of that dictionary. +00:57 So, just to keep things movin' along, +00:59 I'm going to go down here, and I'm going to, +01:01 let's put these at the very bottom. +01:05 I'm going to paste in some stuff, and we'll talk about it. +01:10 These are not implementations. +01:12 These are just getting started. +01:13 So, the first one is going to be: find a particular user. +01:17 So, we want to have api/game/users. +01:21 And then, you'll put the name here. +01:23 So, api/game/users/{name}, /computer /jeff or /jennifer. +01:29 You say, whatever you want, there at the end, +01:30 and that becomes this argument, right here. +01:34 So, let's just do something like: return would find, +01:40 just to make sure everything's working. +01:42 We'll see. +01:44 So, we still got to put the details of what that means. +01:46 It turns out this one's quite simple. +01:48 Some are really easy, some, not so much. +01:50 So, what is the next one? +01:53 So, down here, we're going to create a user. +01:56 And, we're going to do an HTTP PUT to the user's collection. +02:00 Why? +02:01 Well, there's only two reasonable options, here. +02:03 GET, get is out. +02:05 Delete is obviously out. +02:06 PATCH, obviously, they're out. +02:07 But, POST or PUT, and if you think you can do the operation +02:12 again and again and it shouldn't affect the state +02:14 of the system, well then, +02:15 PUT is probably what you want to do +02:17 if you know where it goes. +02:18 So, it's kind of, we're creating the /user, +02:21 whatever we paste in here. +02:23 So, this is going to create a user, +02:24 and it's going to be interesting. +02:25 I'll just say, we'd create_user. +02:26 It's going to be interesting how we get to that data, +02:29 and that's not too hard. +02:32 Next, we're going to create a new game. +02:37 So, over here, we have game. +02:38 And then, you're going to just do a POST to game. +02:40 You don't know where the ID or the link +02:43 of that game is going to go. +02:44 So, we're using POST as opposed to here, +02:47 we know the name of the user we're creating, +02:48 which drives the URL. +02:49 That's the reason PUT. +02:50 You don't have to be this nuanced with the rest, +02:52 but this is the way I'm doin' it. +02:55 Next one up, we're just going to be able to get all the rules. +02:57 Remember, we want to be able to change the rules, +02:59 potentially, in the server and have all the clients +03:01 immediately adapt. +03:03 And, this is a read operation, so we're going to do a GET, +03:06 very, very straightforward. +03:08 We'll implement that momentarily. +03:11 Next step, we want to get the game status. +03:13 This is a read operation, so it's GET. +03:15 We have api/game, and then here, in this part, +03:18 we're going to do the game ID. +03:20 So, API/gameS223/status. +03:25 And, that's going to be passed in here, +03:27 and then we'll just say, almost there, with our methods. +03:32 So, the next thing we want to do is just get the top scores. +03:34 Again, this is a read operation. +03:36 So, we'll just return. +03:39 And finally, comes our most complicated +03:41 but also most important method. +03:44 Those often go together, don't they? +03:45 Called play_round. +03:48 And, because this is modifying, it's doing a POST. +03:51 That's not where it goes, so this one is, +03:53 it's ready to POST. +03:55 Okay, so we have all of these methods, here, +03:57 if I can get my little green helper thing +03:59 to get out of the way. +04:00 You notice that somewhere along the way, +04:03 it was detecting changes, and it said, +04:05 "A view mapping over ID. +04:06 "Existing end point: find_user." +04:11 That just happened 'cause I duplicated something +04:13 before I typed it in. +04:14 That happens, sometimes, when Flask gets into bug mode, +04:16 is you can be messin' with it, and if you put, like, +04:18 junk and you accidentally save it, it tries to reload. +04:21 But then, it detects some kind of error, +04:23 and if I actually take that away and save again, +04:26 it's, the process is gone, got to restart it. +04:30 Okay, so let's just test one of these: +04:39 would find user jeff. +04:40 How cool, huh? +04:41 And, it's workin' pretty well. +04:43 This works pretty well because this is a get operation, +04:45 but how do you test this users by doing a PUT operation +04:50 in the browser? Now, it's super easy. +04:51 So, we're going to employ Postman to configure +04:54 all this stuff for us. diff --git a/transcripts/97-online-game-service/9.txt b/transcripts/97-online-game-service/9.txt new file mode 100755 index 00000000..b7d39a19 --- /dev/null +++ b/transcripts/97-online-game-service/9.txt @@ -0,0 +1,39 @@ +00:00 Alright, we have the stubs for our APIs in place. +00:04 And we're going to start focusing on +00:06 some of these that are easy. +00:07 For example, this all_rolls, this one is really easy. +00:11 top_scores, somewhat easy. +00:13 play_round, we're going to save that one for later. +00:15 But I've already sort of configured +00:17 Postman to deal with this. +00:19 So Postman is cool because you can create these groups, +00:21 like here I have Online RPS, +00:24 and here are all the operations, +00:26 and you can see GET, PUT, POST, POST, GET, GET, GET. +00:28 So if I go get_user, we have api/game/users/mark, +00:32 and you can see down here would find user Mark. +00:36 Come over here and say create_user, +00:37 the body's already set, +00:38 here's the user that didn't exist yet. +00:42 But if we do this, +00:45 response is would create user 200 okay. +00:49 So what we're going to do is we're going to +00:50 go through and work on these. +00:51 Let's start with all_rolls. +00:53 Right now we're getting would create all_rolls. +00:55 I think we're going to start knocking out +00:57 some of these simple ones, game_status, all_rolls, +01:00 new game, create user, these types of things. +01:02 And then the play_round and the top_scores +01:04 those are a little bit trickier. +01:06 But you'll see that we can configure these in Postman +01:10 like for example, this play_round is going to pass the body, +01:14 here's the game id, here's the user, here's the roll, +01:17 alright, so we're going to want to make sure +01:19 we have a user, we could create a user over here, +01:23 want to make sure we have, Michael for example, +01:25 so that other one would work. +01:27 Things like that. So we're going to use Postman to exercise +01:30 and get our API just right, +01:32 and then, then we're going to go write +01:34 the client side code that consumes it. From 6c090aca027c1de97bc6e8d51712c7b53ecc2ead Mon Sep 17 00:00:00 2001 From: Julian Sequeira Date: Fri, 27 Apr 2018 22:43:39 +1000 Subject: [PATCH 08/76] Remove inappropriate dict/list key/value swap instruction from readme --- days/07-09-data-structures/README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/days/07-09-data-structures/README.md b/days/07-09-data-structures/README.md index 3a9cb828..9d15c331 100644 --- a/days/07-09-data-structures/README.md +++ b/days/07-09-data-structures/README.md @@ -35,8 +35,6 @@ Perform the following tasks on the list and dict. The less you look at them, the - Print out the 27th value in the dictionary. -- Replace the 15th key in the dictionary with the 28th item in the list. - ### Time to share what you've accomplished! @@ -44,4 +42,4 @@ Be sure to share your last couple of days work on Twitter or Facebook. Use the h Here are [some examples](https://twitter.com/search?q=%23100DaysOfCode) to inspire you. Consider including [@talkpython](https://twitter.com/talkpython) and [@pybites](https://twitter.com/pybites) in your tweets. -*See a mistake in these instructions? Please [submit a new issue](https://github.com/talkpython/100daysofcode-with-python-course/issues) or fix it and [submit a PR](https://github.com/talkpython/100daysofcode-with-python-course/pulls).* \ No newline at end of file +*See a mistake in these instructions? Please [submit a new issue](https://github.com/talkpython/100daysofcode-with-python-course/issues) or fix it and [submit a PR](https://github.com/talkpython/100daysofcode-with-python-course/pulls).* From 38a4196be7a0ffe4b03dc18d7208dbfe0d25feff Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Mon, 30 Apr 2018 14:28:42 -0700 Subject: [PATCH 09/76] Update README.md --- days/37-39-csv-data-analsys/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/days/37-39-csv-data-analsys/README.md b/days/37-39-csv-data-analsys/README.md index 63748561..c539e955 100644 --- a/days/37-39-csv-data-analsys/README.md +++ b/days/37-39-csv-data-analsys/README.md @@ -19,7 +19,9 @@ Here's an example of how you might get started. **Goal**: Predict the menu items at an (American) Thanksgiving meal for a random region in the US. -**Data set**: [Thanksgiving 2015](https://github.com/fivethirtyeight/data/tree/master/thanksgiving-2015) +**Data set**: [Thanksgiving 2015](https://github.com/mikeckennedy/data-1/tree/master/thanksgiving-2015) + +(Note: I forked FiveThirtyEight's data and edit it here due to an encoding error) **Implementation**: Write a program that From 0ae035bd1a98ee0771bb0e981635d8654b21ad1d Mon Sep 17 00:00:00 2001 From: Julian Sequeira Date: Sat, 5 May 2018 10:44:55 +1000 Subject: [PATCH 10/76] Data Structures readme update with Bite promo code alternative --- days/07-09-data-structures/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/days/07-09-data-structures/README.md b/days/07-09-data-structures/README.md index 9d15c331..303fb31f 100644 --- a/days/07-09-data-structures/README.md +++ b/days/07-09-data-structures/README.md @@ -25,6 +25,8 @@ Follow the instructions on page once you've redeemed the Bite and see if you can ## Day N+2: Your Turn! +**UPDATE: We decided to wrap the below (and a little more) into a Bite on the CodeChalleng.es Platform for you. You're still more than welcome to perform the work as per the below but if you want to try this in a Bite then [click here](https://codechalleng.es/bites/promo/listvsdict) to redeem the Bite for free. + Create a script that imports the US States data structures contained in the following script file in our Repo: [https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/07-09-data-structures/code/data.py](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/07-09-data-structures/code/data.py) Perform the following tasks on the list and dict. The less you look at them, the better this exercise will be. Remember: **Dicts are unsorted**. From 0bb1ff77aec044647bbe849ab9d314f7a55baf43 Mon Sep 17 00:00:00 2001 From: Julian Sequeira Date: Sat, 5 May 2018 17:50:04 +1000 Subject: [PATCH 11/76] Data Structures readme type/grammar fix --- days/07-09-data-structures/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/days/07-09-data-structures/README.md b/days/07-09-data-structures/README.md index 303fb31f..74cca6c8 100644 --- a/days/07-09-data-structures/README.md +++ b/days/07-09-data-structures/README.md @@ -18,9 +18,9 @@ Feel free to watch the *What we learned* video as well as a recap! Click this link: [https://codechalleng.es/bites/promo/datastructures](https://codechalleng.es/bites/promo/datastructures) -This will take you to our CodeChalleng.es platform and give unlock a Bite for free. +This will take you to our CodeChalleng.es platform and unlock a Bite for free. -Follow the instructions on page once you've redeemed the Bite and see if you can solve the problem! +Follow the on page instructions once you've redeemed the Bite and see if you can solve the problem! ## Day N+2: Your Turn! From 9b09d9712ee6865aef71697d4fbd2cefc7bd27ff Mon Sep 17 00:00:00 2001 From: __ROLLER__ Date: Wed, 23 May 2018 13:11:11 -0600 Subject: [PATCH 12/76] Update README.md Added a few words for clarity --- days/46-48-beautifulsoup4/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/days/46-48-beautifulsoup4/README.md b/days/46-48-beautifulsoup4/README.md index 2d018cf6..7e6407d0 100644 --- a/days/46-48-beautifulsoup4/README.md +++ b/days/46-48-beautifulsoup4/README.md @@ -4,7 +4,7 @@ Web Scraping! It's one of the main reasons we all love and hate to code. BeautifulSoup4 (BS4) thankfully makes it a bit easier for us Pythonistas. -Over the following couple of days you're going to learn how to use BS4 to website data pulled down using the Requests module. +Over the following couple of days you're going to learn how to use BS4 to work with website data pulled down using the Requests module. ## Day N: Setup, Overview and Making your first BS4 Scraper @@ -42,4 +42,4 @@ Be sure to share your last couple of days work on Twitter or Facebook. Use the h Here are [some examples](https://twitter.com/search?q=%23100DaysOfCode) to inspire you. Consider including [@talkpython](https://twitter.com/talkpython) and [@pybites](https://twitter.com/pybites) in your tweets. -*See a mistake in these instructions? Please [submit a new issue](https://github.com/talkpython/100daysofcode-with-python-course/issues) or fix it and [submit a PR](https://github.com/talkpython/100daysofcode-with-python-course/pulls).* \ No newline at end of file +*See a mistake in these instructions? Please [submit a new issue](https://github.com/talkpython/100daysofcode-with-python-course/issues) or fix it and [submit a PR](https://github.com/talkpython/100daysofcode-with-python-course/pulls).* From ac0c0cc3ef766af3bb9f78af87769af0b85f8e88 Mon Sep 17 00:00:00 2001 From: Luis San Martin Date: Thu, 31 May 2018 13:53:30 -0400 Subject: [PATCH 13/76] Launch jupyter notebooks on binder --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 52f9be9e..cc62169d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ # #100DaysOfCode with Python course +[![Binder](https://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/pathcl/100daysofcode-with-python-course.git/master) + [![Visit the course page](readme_resources/100days-course.png)](https://training.talkpython.fm/courses/explore_100days_in_python/100-days-of-code-in-python) From 79cdd87d0d022414b9b712e1975a7d2d2078bb86 Mon Sep 17 00:00:00 2001 From: Luis San Martin Date: Thu, 31 May 2018 13:55:07 -0400 Subject: [PATCH 14/76] Typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index cc62169d..f1d91096 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # #100DaysOfCode with Python course -[![Binder](https://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/pathcl/100daysofcode-with-python-course.git/master) +[![Binder](https://mybinder.org/badge.svg)](https://mybinder.org/v2/gh/talkpython/100daysofcode-with-python-course.git/master) [![Visit the course page](readme_resources/100days-course.png)](https://training.talkpython.fm/courses/explore_100days_in_python/100-days-of-code-in-python) From a991f6e4338054a14b1dc8db27b4217f7e326609 Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Sat, 2 Jun 2018 10:11:50 -0700 Subject: [PATCH 15/76] JSON version of python dictionary contained in mount.txt --- days/40-42-json-data/code/mount-data.json | 2469 +++++++++++++++++++++ 1 file changed, 2469 insertions(+) create mode 100644 days/40-42-json-data/code/mount-data.json diff --git a/days/40-42-json-data/code/mount-data.json b/days/40-42-json-data/code/mount-data.json new file mode 100644 index 00000000..cf0913db --- /dev/null +++ b/days/40-42-json-data/code/mount-data.json @@ -0,0 +1,2469 @@ +{ + "achievementPoints": 14565, + "battlegroup": "Cyclone", + "calcClass": "V", + "class": 9, + "faction": 0, + "gender": 0, + "lastModified": 1519011260000, + "level": 110, + "mounts": { + "collected": [ + { + "creatureId": 32158, + "icon": "ability_mount_drake_blue", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 44178, + "name": "Albino Drake", + "qualityId": 4, + "spellId": 60025 + }, + { + "creatureId": 63502, + "icon": "ability_mount_hordescorpionamber", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 85262, + "name": "Amber Scorpion", + "qualityId": 4, + "spellId": 123886 + }, + { + "creatureId": 24487, + "icon": "ability_mount_warhippogryph", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 45725, + "name": "Argent Hippogryph", + "qualityId": 4, + "spellId": 63844 + }, + { + "creatureId": 16509, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 47180, + "name": "Argent Warhorse", + "qualityId": 4, + "spellId": 67466 + }, + { + "creatureId": 71381, + "icon": "ability_mount_dragonhawkarmorallliance", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 98259, + "name": "Armored Blue Dragonhawk", + "qualityId": 4, + "spellId": 142478 + }, + { + "creatureId": 32206, + "icon": "ability_mount_polarbear_brown", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 44225, + "name": "Armored Brown Bear", + "qualityId": 4, + "spellId": 60114 + }, + { + "creatureId": 27258, + "icon": "ability_mount_gryphon_01", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 44689, + "name": "Armored Snowy Gryphon", + "qualityId": 4, + "spellId": 61229 + }, + { + "creatureId": 18545, + "icon": "inv_misc_summerfest_brazierorange", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32458, + "name": "Ashes of Al'ar", + "qualityId": 4, + "spellId": 40192 + }, + { + "creatureId": 58522, + "icon": "inv_pandarenserpentmount_blue", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 85430, + "name": "Azure Cloud Serpent", + "qualityId": 4, + "spellId": 123992 + }, + { + "creatureId": 23456, + "icon": "ability_mount_netherdrakepurple", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32858, + "name": "Azure Netherwing Drake", + "qualityId": 4, + "spellId": 41514 + }, + { + "creatureId": 65006, + "icon": "ability_mount_cranemountblue", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87781, + "name": "Azure Riding Crane", + "qualityId": 4, + "spellId": 127174 + }, + { + "creatureId": 60941, + "icon": "ability_mount_waterstridermount", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 81354, + "name": "Azure Water Strider", + "qualityId": 4, + "spellId": 118089 + }, + { + "creatureId": 14334, + "icon": "ability_mount_blackbattlestrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29465, + "name": "Black Battlestrider", + "qualityId": 4, + "spellId": 22719 + }, + { + "creatureId": 31778, + "icon": "ability_mount_drake_twilight", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 43986, + "name": "Black Drake", + "qualityId": 4, + "spellId": 59650 + }, + { + "creatureId": 70026, + "icon": "ability_mount_raptor_black", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 94292, + "name": "Black Primal Raptor", + "qualityId": 4, + "spellId": 138642 + }, + { + "creatureId": 66177, + "icon": "ability_mount_goatmountblack", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 89391, + "name": "Black Riding Goat", + "qualityId": 4, + "spellId": 130138 + }, + { + "creatureId": 32203, + "icon": "ability_mount_polarbear_black", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 44223, + "name": "Black War Bear", + "qualityId": 4, + "spellId": 60118 + }, + { + "creatureId": 26439, + "icon": "ability_mount_ridingelekkelite_blue", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 35906, + "name": "Black War Elekk", + "qualityId": 4, + "spellId": 48027 + }, + { + "creatureId": 31849, + "icon": "ability_mount_mammoth_black", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 43956, + "name": "Black War Mammoth", + "qualityId": 4, + "spellId": 59785 + }, + { + "creatureId": 14335, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29467, + "name": "Black War Ram", + "qualityId": 4, + "spellId": 22720 + }, + { + "creatureId": 14332, + "icon": "ability_mount_nightmarehorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29468, + "name": "Black War Steed", + "qualityId": 4, + "spellId": 22717 + }, + { + "creatureId": 14336, + "icon": "ability_mount_blackpanther", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29471, + "name": "Black War Tiger", + "qualityId": 4, + "spellId": 22723 + }, + { + "creatureId": 65018, + "icon": "ability_mount_yakmountbrown", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87789, + "name": "Blonde Riding Yak", + "qualityId": 4, + "spellId": 127220 + }, + { + "creatureId": 38778, + "icon": "ability_mount_redfrostwyrm_01", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 51954, + "name": "Bloodbathed Frostbrood Vanquisher", + "qualityId": 4, + "spellId": 72808 + }, + { + "creatureId": 31239, + "icon": "ability_hunter_pet_dragonhawk", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 44843, + "name": "Blue Dragonhawk", + "qualityId": 4, + "spellId": 61996 + }, + { + "creatureId": 31695, + "icon": "ability_mount_drake_azure", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 43953, + "name": "Blue Drake", + "qualityId": 4, + "spellId": 59568 + }, + { + "creatureId": 22978, + "icon": "ability_hunter_pet_netherray", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32319, + "name": "Blue Riding Nether Ray", + "qualityId": 4, + "spellId": 39803 + }, + { + "creatureId": 31717, + "icon": "ability_mount_drake_bronze", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 43951, + "name": "Bronze Drake", + "qualityId": 4, + "spellId": 59569 + }, + { + "creatureId": 47652, + "icon": "ability_mount_camel_brown", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 63044, + "name": "Brown Riding Camel", + "qualityId": 4, + "spellId": 88748 + }, + { + "creatureId": 66150, + "icon": "ability_mount_goatmountbrown", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 89362, + "name": "Brown Riding Goat", + "qualityId": 4, + "spellId": 130086 + }, + { + "creatureId": 40625, + "icon": "ability_mount_celestialhorse", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 54811, + "name": "Celestial Steed", + "qualityId": 4, + "spellId": 75614 + }, + { + "creatureId": 24488, + "icon": "ability_mount_warhippogryph", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 33999, + "name": "Cenarion War Hippogryph", + "qualityId": 4, + "spellId": 43927 + }, + { + "creatureId": -64426, + "icon": "inv_lessergronnmount_red", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 128311, + "name": "Coalfist Gronnling", + "qualityId": 4, + "spellId": 189364 + }, + { + "creatureId": 23460, + "icon": "ability_mount_netherdrakepurple", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32859, + "name": "Cobalt Netherwing Drake", + "qualityId": 4, + "spellId": 41515 + }, + { + "creatureId": 22510, + "icon": "inv_misc_foot_centaur", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 31830, + "name": "Cobalt Riding Talbuk", + "qualityId": 4, + "spellId": 39315 + }, + { + "creatureId": 20072, + "icon": "inv_misc_foot_centaur", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29227, + "name": "Cobalt War Talbuk", + "qualityId": 4, + "spellId": 34896 + }, + { + "creatureId": 85286, + "icon": "ability_hunter_pet_corehound", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 115484, + "name": "Core Hound", + "qualityId": 4, + "spellId": 170347 + }, + { + "creatureId": -63032, + "icon": "inv_feldreadravenmount", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 123974, + "name": "Corrupted Dreadwing", + "qualityId": 4, + "spellId": 183117 + }, + { + "creatureId": 47841, + "icon": "inv_mount_darkphoenixa", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 63125, + "name": "Dark Phoenix", + "qualityId": 4, + "spellId": 88990 + }, + { + "creatureId": 22511, + "icon": "inv_misc_foot_centaur", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 28915, + "name": "Dark Riding Talbuk", + "qualityId": 4, + "spellId": 39316 + }, + { + "creatureId": 20149, + "icon": "inv_misc_foot_centaur", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29228, + "name": "Dark War Talbuk", + "qualityId": 4, + "spellId": 34790 + }, + { + "creatureId": 55188, + "icon": "ability_hunter_pet_bear", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 73766, + "name": "Darkmoon Dancing Bear", + "qualityId": 4, + "spellId": 103081 + }, + { + "creatureId": -73254, + "icon": "inv_stingray2mount", + "isAquatic": true, + "isFlying": false, + "isGround": false, + "isJumping": false, + "itemId": 142398, + "name": "Darkwater Skate", + "qualityId": 4, + "spellId": 228919 + }, + { + "creatureId": 33298, + "icon": "ability_mount_whitetiger", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 45591, + "name": "Darnassian Nightsaber", + "qualityId": 4, + "spellId": 63637 + }, + { + "creatureId": 47647, + "icon": "inv_misc_stormdragongreen", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 63039, + "name": "Drake of the West Wind", + "qualityId": 4, + "spellId": 88741 + }, + { + "creatureId": 77178, + "icon": "inv_ravenlordmount", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 109013, + "name": "Dread Raven", + "qualityId": 4, + "spellId": 155741 + }, + { + "creatureId": 33318, + "icon": "ability_mount_ridingelekkelite", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 45590, + "name": "Exodar Elekk", + "qualityId": 4, + "spellId": 63639 + }, + { + "creatureId": 21354, + "icon": "ability_mount_dreadsteed", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 30480, + "name": "Fiery Warhorse", + "qualityId": 4, + "spellId": 36702 + }, + { + "creatureId": 52672, + "icon": "ability_mount_warhippogryph", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 69213, + "name": "Flameward Hippogryph", + "qualityId": 4, + "spellId": 97359 + }, + { + "creatureId": 45338, + "icon": "ability_mount_fossilizedraptor", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 60954, + "name": "Fossilized Raptor", + "qualityId": 4, + "spellId": 84751 + }, + { + "creatureId": 33301, + "icon": "ability_mount_mechastrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 45589, + "name": "Gnomeregan Mechanostrider", + "qualityId": 4, + "spellId": 63638 + }, + { + "creatureId": 58524, + "icon": "inv_pandarenserpentmount_yellow", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 85429, + "name": "Golden Cloud Serpent", + "qualityId": 4, + "spellId": 123993 + }, + { + "creatureId": 48632, + "icon": "inv_mount_allianceliong", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 62298, + "name": "Golden King", + "qualityId": 4, + "spellId": 90621 + }, + { + "creatureId": 70524, + "icon": "ability_mount_triceratopsmount_orange", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 95564, + "name": "Golden Primal Direhorn", + "qualityId": 4, + "spellId": 140249 + }, + { + "creatureId": 65007, + "icon": "ability_mount_cranemount", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87782, + "name": "Golden Riding Crane", + "qualityId": 4, + "spellId": 127176 + }, + { + "creatureId": 68771, + "icon": "inv_misc_elitegryphonarmored", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 93168, + "name": "Grand Armored Gryphon", + "qualityId": 4, + "spellId": 135416 + }, + { + "creatureId": 31862, + "icon": "ability_mount_mammoth_black_3seater", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 43959, + "name": "Grand Black War Mammoth", + "qualityId": 4, + "spellId": 61465 + }, + { + "creatureId": 69067, + "icon": "inv_misc_elitegryphon", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 93385, + "name": "Grand Gryphon", + "qualityId": 4, + "spellId": 136163 + }, + { + "creatureId": 31858, + "icon": "ability_mount_mammoth_white_3seater", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 43961, + "name": "Grand Ice Mammoth", + "qualityId": 4, + "spellId": 61470 + }, + { + "creatureId": 65072, + "icon": "ability_mount_pandaranmountepicblack", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 91011, + "name": "Great Black Dragon Turtle", + "qualityId": 4, + "spellId": 127295 + }, + { + "creatureId": 65074, + "icon": "ability_mount_pandaranmountepicblue", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87803, + "name": "Great Blue Dragon Turtle", + "qualityId": 4, + "spellId": 127302 + }, + { + "creatureId": 20848, + "icon": "ability_mount_ridingelekkelite_blue", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29745, + "name": "Great Blue Elekk", + "qualityId": 4, + "spellId": 35713 + }, + { + "creatureId": 27707, + "icon": "ability_mount_kotobrewfest", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 37828, + "name": "Great Brewfest Kodo", + "qualityId": 4, + "spellId": 49379 + }, + { + "creatureId": 65076, + "icon": "ability_mount_pandaranmountepicbrown", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 91014, + "name": "Great Brown Dragon Turtle", + "qualityId": 4, + "spellId": 127308 + }, + { + "creatureId": 65071, + "icon": "ability_mount_pandaranmountepic", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 91012, + "name": "Great Green Dragon Turtle", + "qualityId": 4, + "spellId": 127293 + }, + { + "creatureId": 20849, + "icon": "ability_mount_ridingelekkelite_green", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29746, + "name": "Great Green Elekk", + "qualityId": 4, + "spellId": 35712 + }, + { + "creatureId": 65078, + "icon": "ability_mount_pandaranmountepicpurple", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87805, + "name": "Great Purple Dragon Turtle", + "qualityId": 4, + "spellId": 127310 + }, + { + "creatureId": 20850, + "icon": "ability_mount_ridingelekkelite_purple", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29747, + "name": "Great Purple Elekk", + "qualityId": 4, + "spellId": 35714 + }, + { + "creatureId": 62106, + "icon": "ability_mount_pandaranmountepicred", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 82811, + "name": "Great Red Dragon Turtle", + "qualityId": 4, + "spellId": 120822 + }, + { + "creatureId": 33415, + "icon": "ability_mount_ridingelekkelite", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 46756, + "name": "Great Red Elekk", + "qualityId": 4, + "spellId": 65637 + }, + { + "creatureId": 70027, + "icon": "ability_mount_raptor", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 94293, + "name": "Green Primal Raptor", + "qualityId": 4, + "spellId": 138643 + }, + { + "creatureId": 32562, + "icon": "ability_mount_drake_proto", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 44707, + "name": "Green Proto-Drake", + "qualityId": 4, + "spellId": 61294 + }, + { + "creatureId": 22958, + "icon": "ability_hunter_pet_netherray", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32314, + "name": "Green Riding Nether Ray", + "qualityId": 4, + "spellId": 39798 + }, + { + "creatureId": 47654, + "icon": "ability_mount_camel_gray", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 63046, + "name": "Grey Riding Camel", + "qualityId": 4, + "spellId": 88750 + }, + { + "creatureId": 65017, + "icon": "ability_mount_yakmountgrey", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87788, + "name": "Grey Riding Yak", + "qualityId": 4, + "spellId": 127216 + }, + { + "creatureId": 27152, + "icon": "ability_mount_nightmarehorse", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 37012, + "name": "Headless Horseman's Mount", + "qualityId": 4, + "spellId": 48025 + }, + { + "creatureId": 71486, + "icon": "inv_pegasusmount", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 98618, + "name": "Hearthsteed", + "qualityId": 4, + "spellId": 142073 + }, + { + "creatureId": 31855, + "icon": "ability_mount_mammoth_white", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 43958, + "name": "Ice Mammoth", + "qualityId": 4, + "spellId": 59799 + }, + { + "creatureId": 91905, + "icon": "inv_felstalkermount", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 128425, + "name": "Illidari Felstalker", + "qualityId": 4, + "spellId": 189998 + }, + { + "creatureId": 63831, + "icon": "ability_mount_quilenflyingmount", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 85870, + "name": "Imperial Quilen", + "qualityId": 4, + "spellId": 124659 + }, + { + "creatureId": 58523, + "icon": "inv_pandarenserpentmount_green", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 79802, + "name": "Jade Cloud Serpent", + "qualityId": 4, + "spellId": 113199 + }, + { + "creatureId": 61589, + "icon": "ability_mount_pandarenkitemount_blue", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 91802, + "name": "Jade Pandaren Kite", + "qualityId": 4, + "spellId": 133023 + }, + { + "creatureId": 29046, + "icon": "inv_misc_key_14", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 44413, + "name": "Mekgineer's Chopper", + "qualityId": 4, + "spellId": 60424 + }, + { + "creatureId": 87423, + "icon": "ability_mount_elekkdraenormount", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116661, + "name": "Mottled Meadowstomper", + "qualityId": 4, + "spellId": 171622 + }, + { + "creatureId": -75533, + "icon": "inv_warlockmountshadow", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 142233, + "name": "Netherlord's Accursed Wrathsteed", + "qualityId": 4, + "spellId": 238454 + }, + { + "creatureId": -75532, + "icon": "inv_warlockmountfire", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 143637, + "name": "Netherlord's Brimstone Wrathsteed", + "qualityId": 4, + "spellId": 238452 + }, + { + "creatureId": 23455, + "icon": "ability_mount_netherdrakepurple", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32857, + "name": "Onyx Netherwing Drake", + "qualityId": 4, + "spellId": 41513 + }, + { + "creatureId": 66661, + "icon": "ability_mount_pandarenkitemount_blue", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 89785, + "name": "Pandaren Kite", + "qualityId": 4, + "spellId": 130985 + }, + { + "creatureId": -74298, + "icon": "inv_firecatmount", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 143631, + "name": "Primal Flamesaber", + "qualityId": 4, + "spellId": 232405 + }, + { + "creatureId": 23458, + "icon": "ability_mount_netherdrakepurple", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32860, + "name": "Purple Netherwing Drake", + "qualityId": 4, + "spellId": 41516 + }, + { + "creatureId": 22975, + "icon": "ability_hunter_pet_netherray", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32316, + "name": "Purple Riding Nether Ray", + "qualityId": 4, + "spellId": 39801 + }, + { + "creatureId": 33840, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 46815, + "name": "Quel'dorei Steed", + "qualityId": 4, + "spellId": 66090 + }, + { + "creatureId": 30161, + "icon": "ability_mount_drake_red", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 43955, + "name": "Red Drake", + "qualityId": 4, + "spellId": 59570 + }, + { + "creatureId": 31902, + "icon": "ability_mount_drake_proto", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 44160, + "name": "Red Proto-Drake", + "qualityId": 4, + "spellId": 59961 + }, + { + "creatureId": 22976, + "icon": "ability_hunter_pet_netherray", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32317, + "name": "Red Riding Nether Ray", + "qualityId": 4, + "spellId": 39800 + }, + { + "creatureId": 65009, + "icon": "ability_mount_cranemountpurple", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87783, + "name": "Regal Riding Crane", + "qualityId": 4, + "spellId": 127177 + }, + { + "creatureId": -74314, + "icon": "inv_serpentmount_darkblue", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 147835, + "name": "Riddler's Mind-Worm", + "qualityId": 4, + "spellId": 243025 + }, + { + "creatureId": 50269, + "icon": "inv_misc_stonedragonorange", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 65891, + "name": "Sandstone Drake", + "qualityId": 4, + "spellId": 93326 + }, + { + "creatureId": 24489, + "icon": "ability_mount_warhippogryph", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 46813, + "name": "Silver Covenant Hippogryph", + "qualityId": 4, + "spellId": 66087 + }, + { + "creatureId": 22977, + "icon": "ability_hunter_pet_netherray", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32318, + "name": "Silver Riding Nether Ray", + "qualityId": 4, + "spellId": 39802 + }, + { + "creatureId": 22512, + "icon": "inv_misc_foot_centaur", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 31832, + "name": "Silver Riding Talbuk", + "qualityId": 4, + "spellId": 39317 + }, + { + "creatureId": 20152, + "icon": "inv_misc_foot_centaur", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29229, + "name": "Silver War Talbuk", + "qualityId": 4, + "spellId": 34898 + }, + { + "creatureId": -46686, + "icon": "ability_mount_shreddermount", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 95416, + "name": "Sky Golem", + "qualityId": 4, + "spellId": 134359 + }, + { + "creatureId": -65040, + "icon": "spell_beastmaster_rylak", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 128706, + "name": "Soaring Skyterror", + "qualityId": 4, + "spellId": 191633 + }, + { + "creatureId": -70874, + "icon": "inv_ghostlymoosemount", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 131734, + "name": "Spirit of Eche'ro", + "qualityId": 4, + "spellId": 196681 + }, + { + "creatureId": 14745, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 19030, + "name": "Stormpike Battle Charger", + "qualityId": 4, + "spellId": 23510 + }, + { + "creatureId": 33217, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 45125, + "name": "Stormwind Steed", + "qualityId": 4, + "spellId": 63232 + }, + { + "creatureId": 18361, + "icon": "ability_mount_gryphon_01", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 25473, + "name": "Swift Blue Gryphon", + "qualityId": 4, + "spellId": 32242 + }, + { + "creatureId": 24368, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 33977, + "name": "Swift Brewfest Ram", + "qualityId": 4, + "spellId": 43900 + }, + { + "creatureId": 14546, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18786, + "name": "Swift Brown Ram", + "qualityId": 4, + "spellId": 23238 + }, + { + "creatureId": 14561, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18777, + "name": "Swift Brown Steed", + "qualityId": 4, + "spellId": 23229 + }, + { + "creatureId": 5521, + "icon": "ability_hunter_pet_tallstrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 72140, + "name": "Swift Forest Strider", + "qualityId": 4, + "spellId": 102346 + }, + { + "creatureId": 14556, + "icon": "ability_mount_whitetiger", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18766, + "name": "Swift Frostsaber", + "qualityId": 4, + "spellId": 23221 + }, + { + "creatureId": 14548, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18787, + "name": "Swift Gray Ram", + "qualityId": 4, + "spellId": 23239 + }, + { + "creatureId": 34017, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 46758, + "name": "Swift Gray Steed", + "qualityId": 4, + "spellId": 65640 + }, + { + "creatureId": 18375, + "icon": "ability_mount_gryphon_01", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 25528, + "name": "Swift Green Gryphon", + "qualityId": 4, + "spellId": 32290 + }, + { + "creatureId": 14553, + "icon": "ability_mount_mechastrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18772, + "name": "Swift Green Mechanostrider", + "qualityId": 4, + "spellId": 23225 + }, + { + "creatureId": 3068, + "icon": "ability_hunter_pet_tallstrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 72146, + "name": "Swift Lovebird", + "qualityId": 4, + "spellId": 102350 + }, + { + "creatureId": 14555, + "icon": "ability_mount_blackpanther", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18767, + "name": "Swift Mistsaber", + "qualityId": 4, + "spellId": 23219 + }, + { + "creatureId": 33319, + "icon": "ability_mount_whitetiger", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 46759, + "name": "Swift Moonsaber", + "qualityId": 4, + "spellId": 65638 + }, + { + "creatureId": 55273, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 73839, + "name": "Swift Mountain Horse", + "qualityId": 4, + "spellId": 103196 + }, + { + "creatureId": 14559, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18776, + "name": "Swift Palomino", + "qualityId": 4, + "spellId": 23227 + }, + { + "creatureId": 18362, + "icon": "ability_mount_gryphon_01", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 25529, + "name": "Swift Purple Gryphon", + "qualityId": 4, + "spellId": 32292 + }, + { + "creatureId": 18376, + "icon": "ability_mount_gryphon_01", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 25527, + "name": "Swift Red Gryphon", + "qualityId": 4, + "spellId": 32289 + }, + { + "creatureId": 54741, + "icon": "ability_hunter_pet_tallstrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 72145, + "name": "Swift Springstrider", + "qualityId": 4, + "spellId": 102349 + }, + { + "creatureId": 14602, + "icon": "ability_mount_blackpanther", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18902, + "name": "Swift Stormsaber", + "qualityId": 4, + "spellId": 23338 + }, + { + "creatureId": 34554, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 46762, + "name": "Swift Violet Ram", + "qualityId": 4, + "spellId": 65643 + }, + { + "creatureId": 22969, + "icon": "ability_mount_cockatricemountelite_white", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 35513, + "name": "Swift White Hawkstrider", + "qualityId": 4, + "spellId": 46628 + }, + { + "creatureId": 14552, + "icon": "ability_mount_mechastrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18773, + "name": "Swift White Mechanostrider", + "qualityId": 4, + "spellId": 23223 + }, + { + "creatureId": 14547, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18785, + "name": "Swift White Ram", + "qualityId": 4, + "spellId": 23240 + }, + { + "creatureId": 14560, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18778, + "name": "Swift White Steed", + "qualityId": 4, + "spellId": 23228 + }, + { + "creatureId": 14551, + "icon": "ability_mount_mechastrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 18774, + "name": "Swift Yellow Mechanostrider", + "qualityId": 4, + "spellId": 23222 + }, + { + "creatureId": 27684, + "icon": "ability_mount_charger", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 37719, + "name": "Swift Zhevra", + "qualityId": 4, + "spellId": 49322 + }, + { + "creatureId": 47653, + "icon": "ability_mount_camel_tan", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 63045, + "name": "Tan Riding Camel", + "qualityId": 4, + "spellId": 88749 + }, + { + "creatureId": 22513, + "icon": "inv_misc_foot_centaur", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 31834, + "name": "Tan Riding Talbuk", + "qualityId": 4, + "spellId": 39318 + }, + { + "creatureId": 20150, + "icon": "inv_misc_foot_centaur", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29230, + "name": "Tan War Talbuk", + "qualityId": 4, + "spellId": 34899 + }, + { + "creatureId": 63766, + "icon": "inv_pandarenserpentmount_lightning_green", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 85666, + "name": "Thundering Jade Cloud Serpent", + "qualityId": 4, + "spellId": 124408 + }, + { + "creatureId": 32212, + "icon": "ability_mount_mammoth_brown_3seater", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 44235, + "name": "Traveler's Tundra Mammoth", + "qualityId": 4, + "spellId": 61425 + }, + { + "creatureId": 24654, + "icon": "ability_mount_gyrocoptorelite", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 34061, + "name": "Turbo-Charged Flying Machine", + "qualityId": 4, + "spellId": 44151 + }, + { + "creatureId": 14563, + "icon": "ability_mount_mechastrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 46763, + "name": "Turbostrider", + "qualityId": 4, + "spellId": 65642 + }, + { + "creatureId": 31698, + "icon": "ability_mount_drake_twilight", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 43954, + "name": "Twilight Drake", + "qualityId": 4, + "spellId": 59571 + }, + { + "creatureId": 56921, + "icon": "ability_mount_tyraelmount", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 76755, + "name": "Tyrael's Charger", + "qualityId": 4, + "spellId": 107203 + }, + { + "creatureId": 15666, + "icon": "trade_archaeology_sceptorofazaqir", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 64883, + "name": "Ultramarine Qiraji Battle Tank", + "qualityId": 4, + "spellId": 92155 + }, + { + "creatureId": 23457, + "icon": "ability_mount_netherdrakepurple", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32861, + "name": "Veridian Netherwing Drake", + "qualityId": 4, + "spellId": 41517 + }, + { + "creatureId": -79485, + "icon": "inv_manaraymount_purple", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 152842, + "name": "Vibrant Mana Ray", + "qualityId": 4, + "spellId": 253106 + }, + { + "creatureId": 23459, + "icon": "ability_mount_netherdrakepurple", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 32862, + "name": "Violet Netherwing Drake", + "qualityId": 4, + "spellId": 41518 + }, + { + "creatureId": 32157, + "icon": "ability_mount_drake_proto", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 44177, + "name": "Violet Proto-Drake", + "qualityId": 4, + "spellId": 60024 + }, + { + "creatureId": 29596, + "icon": "ability_mount_polarbear_white", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 43962, + "name": "White Polar Bear", + "qualityId": 4, + "spellId": 54753 + }, + { + "creatureId": 66176, + "icon": "ability_mount_goatmountwhite", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 89390, + "name": "White Riding Goat", + "qualityId": 4, + "spellId": 130137 + }, + { + "creatureId": 22514, + "icon": "inv_misc_foot_centaur", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 31836, + "name": "White Riding Talbuk", + "qualityId": 4, + "spellId": 39319 + }, + { + "creatureId": 20151, + "icon": "inv_misc_foot_centaur", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29231, + "name": "White War Talbuk", + "qualityId": 4, + "spellId": 34897 + }, + { + "creatureId": 53273, + "icon": "inv_mount_wingedlion", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 69846, + "name": "Winged Guardian", + "qualityId": 4, + "spellId": 98727 + }, + { + "creatureId": 11021, + "icon": "ability_mount_pinktiger", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 13086, + "name": "Winterspring Frostsaber", + "qualityId": 4, + "spellId": 17229 + }, + { + "creatureId": 31851, + "icon": "ability_mount_mammoth_brown", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 44230, + "name": "Wooly Mammoth", + "qualityId": 4, + "spellId": 59791 + }, + { + "creatureId": -59347, + "icon": "inv_giantboarmount_brown", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116668, + "name": "Armored Frostboar", + "qualityId": 3, + "spellId": 171629 + }, + { + "creatureId": -59753, + "icon": "inv_wolfdraenormountfrost", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116781, + "name": "Armored Frostwolf", + "qualityId": 3, + "spellId": 171838 + }, + { + "creatureId": 65058, + "icon": "ability_mount_pandaranmountblack", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87795, + "name": "Black Dragon Turtle", + "qualityId": 3, + "spellId": 127286 + }, + { + "creatureId": 308, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 2411, + "name": "Black Stallion", + "qualityId": 3, + "spellId": 470 + }, + { + "creatureId": 65060, + "icon": "ability_mount_pandaranmountblue", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87796, + "name": "Blue Dragon Turtle", + "qualityId": 3, + "spellId": 127287 + }, + { + "creatureId": 7749, + "icon": "ability_mount_mechastrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 8595, + "name": "Blue Mechanostrider", + "qualityId": 3, + "spellId": 10969 + }, + { + "creatureId": 15666, + "icon": "inv_misc_qirajicrystal_04", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 21218, + "name": "Blue Qiraji Battle Tank", + "qualityId": 3, + "spellId": 25953 + }, + { + "creatureId": 23588, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 33976, + "name": "Brewfest Ram", + "qualityId": 3, + "spellId": 43899 + }, + { + "creatureId": 65061, + "icon": "ability_mount_pandaranmountbrown", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87797, + "name": "Brown Dragon Turtle", + "qualityId": 3, + "spellId": 127288 + }, + { + "creatureId": 17530, + "icon": "ability_mount_ridingelekk", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 28481, + "name": "Brown Elekk", + "qualityId": 3, + "spellId": 34406 + }, + { + "creatureId": 284, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 5656, + "name": "Brown Horse", + "qualityId": 3, + "spellId": 458 + }, + { + "creatureId": 4779, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 5872, + "name": "Brown Ram", + "qualityId": 3, + "spellId": 6899 + }, + { + "creatureId": 4269, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 5655, + "name": "Chestnut Mare", + "qualityId": 3, + "spellId": 6648 + }, + { + "creatureId": 18357, + "icon": "ability_mount_ebongryphon", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 25471, + "name": "Ebon Gryphon", + "qualityId": 3, + "spellId": 32239 + }, + { + "creatureId": 25460, + "icon": "ability_mount_flyingcarpet", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 44554, + "name": "Flying Carpet", + "qualityId": 3, + "spellId": 61451 + }, + { + "creatureId": 18360, + "icon": "ability_mount_goldengryphon", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 25470, + "name": "Golden Gryphon", + "qualityId": 3, + "spellId": 32235 + }, + { + "creatureId": 20846, + "icon": "ability_mount_ridingelekk_grey", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29744, + "name": "Gray Elekk", + "qualityId": 3, + "spellId": 35710 + }, + { + "creatureId": 4710, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 5864, + "name": "Gray Ram", + "qualityId": 3, + "spellId": 6777 + }, + { + "creatureId": 61809, + "icon": "ability_mount_pandaranmountgreen", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 91004, + "name": "Green Dragon Turtle", + "qualityId": 3, + "spellId": 120395 + }, + { + "creatureId": 11147, + "icon": "ability_mount_mechastrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 13321, + "name": "Green Mechanostrider", + "qualityId": 3, + "spellId": 17453 + }, + { + "creatureId": 15715, + "icon": "inv_misc_qirajicrystal_03", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 21323, + "name": "Green Qiraji Battle Tank", + "qualityId": 3, + "spellId": 26056 + }, + { + "creatureId": 55272, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 73838, + "name": "Mountain Horse", + "qualityId": 3, + "spellId": 103195 + }, + { + "creatureId": -59746, + "icon": "inv_hippo_green", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116769, + "name": "Mudback Riverbeast", + "qualityId": 3, + "spellId": 171826 + }, + { + "creatureId": 307, + "icon": "ability_mount_ridinghorse", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 2414, + "name": "Pinto", + "qualityId": 3, + "spellId": 472 + }, + { + "creatureId": 65063, + "icon": "ability_mount_pandaranmountpurple", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 91006, + "name": "Purple Dragon Turtle", + "qualityId": 3, + "spellId": 127289 + }, + { + "creatureId": 20847, + "icon": "ability_mount_ridingelekk_purple", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 29743, + "name": "Purple Elekk", + "qualityId": 3, + "spellId": 35711 + }, + { + "creatureId": 65065, + "icon": "ability_mount_pandaranmountred", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 87800, + "name": "Red Dragon Turtle", + "qualityId": 3, + "spellId": 127290 + }, + { + "creatureId": 66151, + "icon": "ability_mount_cloudmount", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 89363, + "name": "Red Flying Cloud", + "qualityId": 3, + "spellId": 130092 + }, + { + "creatureId": 7739, + "icon": "ability_mount_mechastrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 8563, + "name": "Red Mechanostrider", + "qualityId": 3, + "spellId": 10873 + }, + { + "creatureId": 15716, + "icon": "inv_misc_qirajicrystal_02", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 21321, + "name": "Red Qiraji Battle Tank", + "qualityId": 3, + "spellId": 26054 + }, + { + "creatureId": -59363, + "icon": "ability_mount_talbukdraenormount", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116772, + "name": "Shadowmane Charger", + "qualityId": 3, + "spellId": 171829 + }, + { + "creatureId": -59760, + "icon": "inv_wolfdraenormountred", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116786, + "name": "Smoky Direwolf", + "qualityId": 3, + "spellId": 171843 + }, + { + "creatureId": 18359, + "icon": "ability_mount_snowygryphon", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 25472, + "name": "Snowy Gryphon", + "qualityId": 3, + "spellId": 32240 + }, + { + "creatureId": 7687, + "icon": "ability_mount_whitetiger", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 8632, + "name": "Spotted Frostsaber", + "qualityId": 3, + "spellId": 10789 + }, + { + "creatureId": 35168, + "icon": "ability_mount_whitetiger", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 47100, + "name": "Striped Dawnsaber", + "qualityId": 3, + "spellId": 66847 + }, + { + "creatureId": 6074, + "icon": "ability_mount_whitetiger", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 8631, + "name": "Striped Frostsaber", + "qualityId": 3, + "spellId": 8394 + }, + { + "creatureId": 7690, + "icon": "ability_mount_blackpanther", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 8629, + "name": "Striped Nightsaber", + "qualityId": 3, + "spellId": 10793 + }, + { + "creatureId": -59320, + "icon": "inv_clefthoofdraenormount_blue", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116656, + "name": "Trained Icehoof", + "qualityId": 3, + "spellId": 171617 + }, + { + "creatureId": 78443, + "icon": "ability_mount_elekkdraenormount", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116662, + "name": "Trained Meadowstomper", + "qualityId": 3, + "spellId": 171623 + }, + { + "creatureId": 87080, + "icon": "inv_hippo_green", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116676, + "name": "Trained Riverwallow", + "qualityId": 3, + "spellId": 171638 + }, + { + "creatureId": -59735, + "icon": "inv_giantboarmount_brown", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116675, + "name": "Trained Rocktusk", + "qualityId": 3, + "spellId": 171637 + }, + { + "creatureId": -59365, + "icon": "ability_mount_talbukdraenormount", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116774, + "name": "Trained Silverpelt", + "qualityId": 3, + "spellId": 171831 + }, + { + "creatureId": 87076, + "icon": "inv_wolfdraenormountbrown", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 116784, + "name": "Trained Snarler", + "qualityId": 3, + "spellId": 171841 + }, + { + "creatureId": 10180, + "icon": "ability_mount_mechastrider", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 13322, + "name": "Unpainted Mechanostrider", + "qualityId": 3, + "spellId": 17454 + }, + { + "creatureId": 40054, + "icon": "ability_mount_seahorse", + "isAquatic": true, + "isFlying": false, + "isGround": false, + "isJumping": false, + "itemId": 54465, + "name": "Vashj'ir Seahorse", + "qualityId": 3, + "spellId": 75207 + }, + { + "creatureId": 4777, + "icon": "ability_mount_mountainram", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 5873, + "name": "White Ram", + "qualityId": 3, + "spellId": 6898 + }, + { + "creatureId": 15714, + "icon": "inv_misc_qirajicrystal_01", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 21324, + "name": "Yellow Qiraji Battle Tank", + "qualityId": 3, + "spellId": 26055 + }, + { + "creatureId": 14505, + "icon": "ability_mount_dreadsteed", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 0, + "name": "Dreadsteed", + "qualityId": 1, + "spellId": 23161 + }, + { + "creatureId": 304, + "icon": "spell_nature_swiftness", + "isAquatic": true, + "isFlying": false, + "isGround": true, + "isJumping": true, + "itemId": 0, + "name": "Felsteed", + "qualityId": 1, + "spellId": 5784 + }, + { + "creatureId": 119386, + "icon": "inv_warlockmount", + "isAquatic": false, + "isFlying": true, + "isGround": true, + "isJumping": false, + "itemId": 0, + "name": "Netherlord's Chaotic Wrathsteed", + "qualityId": 1, + "spellId": 232412 + } + ], + "numCollected": 204, + "numNotCollected": 284 + }, + "name": "Ardy", + "race": 1, + "realm": "Cenarion Circle", + "thumbnail": "cenarion-circle/217/107253465-avatar.jpg", + "totalHonorableKills": 17803 +} \ No newline at end of file From 3ac6ceedc555d23df37b41f219ae07c5cfe52b5d Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Tue, 12 Jun 2018 14:46:22 -0700 Subject: [PATCH 16/76] Ooops, this got blocked by the .gitignore --- .../demos/final_search_app/build.spec | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 days/94-96-guis/demos/final_search_app/build.spec diff --git a/days/94-96-guis/demos/final_search_app/build.spec b/days/94-96-guis/demos/final_search_app/build.spec new file mode 100644 index 00000000..b02b42de --- /dev/null +++ b/days/94-96-guis/demos/final_search_app/build.spec @@ -0,0 +1,33 @@ +# -*- mode: python -*- + +block_cipher = None + + +a = Analysis(['build'], + pathex=['/Users/mkennedy/github/talk-python/courses/100daysofcode/100days-course/days/94-96-guis/demos/final_search_app'], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + exclude_binaries=True, + name='build', + debug=False, + strip=False, + upx=True, + console=True ) +coll = COLLECT(exe, + a.binaries, + a.zipfiles, + a.datas, + strip=False, + upx=True, + name='build') From 1385b0138be2c0baacbc805f17a4b4810f2821c5 Mon Sep 17 00:00:00 2001 From: Julian Sequeira Date: Sun, 15 Jul 2018 09:30:17 +1000 Subject: [PATCH 17/76] itertools readme update for traffic lights instruction set --- days/19-21-itertools/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/days/19-21-itertools/README.md b/days/19-21-itertools/README.md index 058e66f4..586c4733 100644 --- a/days/19-21-itertools/README.md +++ b/days/19-21-itertools/README.md @@ -16,6 +16,10 @@ After watching the first 4 videos pop into your Python shell and start playing a Yep that's right! For your second day, use itertools to create a script that simulates traffic lights! +The idea is to perhaps... *cycle* (hint hint!) through the different colours of a set of traffic lights - red, amber and green - printing the name of the colour every time the cycle occurs. + +For bonus points: traffic lights normally cycle between green and red based on traffic levels so you never know exactly when the change will happen. This is a great chance to throw some randomness into your script. + If you get absolutely stuck, watch the *Traffic Lights* video to see how we did it. @@ -40,4 +44,4 @@ Be sure to share your last couple of days work on Twitter or Facebook. Use the h Here are [some examples](https://twitter.com/search?q=%23100DaysOfCode) to inspire you. Consider including [@talkpython](https://twitter.com/talkpython) and [@pybites](https://twitter.com/pybites) in your tweets. -*See a mistake in these instructions? Please [submit a new issue](https://github.com/talkpython/100daysofcode-with-python-course/issues) or fix it and [submit a PR](https://github.com/talkpython/100daysofcode-with-python-course/pulls).* \ No newline at end of file +*See a mistake in these instructions? Please [submit a new issue](https://github.com/talkpython/100daysofcode-with-python-course/issues) or fix it and [submit a PR](https://github.com/talkpython/100daysofcode-with-python-course/pulls).* From 6097732c71fbe63727335e0006acef4a1a8fbfff Mon Sep 17 00:00:00 2001 From: Martin Uribe Date: Sat, 28 Jul 2018 21:39:07 -0500 Subject: [PATCH 18/76] Added an Anaconda environment.yml file for Anaconda users. --- requirements/bob-environment.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 requirements/bob-environment.yml diff --git a/requirements/bob-environment.yml b/requirements/bob-environment.yml new file mode 100644 index 00000000..83c9f591 --- /dev/null +++ b/requirements/bob-environment.yml @@ -0,0 +1,26 @@ +# This file can be used by Anaconda users in order to create their virtual +# environment. If you open up the command prompt/shell in the +# 100daysofcode-with-python-course directory, simply use this command: +# +# conda env create -f requirements/bob-environment.yml +name: 100days +channels: + - defaults +dependencies: + - cython + - feedparser + - ipykernel + - jupyter + - matplotlib + - numpy + - pillow + - plotly + - pytest + - pytest-cov + - python=3.6.6 + - requests + - selenium + - pip: + - tweepy + - wordcloud + - PyGithub From 4ca3a2f8220415cca98afc5ae7a64bc721d880eb Mon Sep 17 00:00:00 2001 From: Martin Uribe Date: Thu, 16 Aug 2018 12:45:58 -0500 Subject: [PATCH 19/76] Added gimp and texturepacker files to .gitignnore file --- .gitignore | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.gitignore b/.gitignore index ebe84718..22746164 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,9 @@ ENV/ days/91-93-sqlalchemy/demo/persistent_rps/db/rock_paper_scissors.sqlite days/91-93-sqlalchemy/demo/persistent_rps_starter/.vscode/settings.json rock_paper_scissors.sqlite + +# Gimp +*.xcf + +# TexturePacker +*.tps From 778f75fd6e2ac51179ebae91ed5920431ae30081 Mon Sep 17 00:00:00 2001 From: Julian Sequeira Date: Sat, 8 Sep 2018 09:34:20 +1000 Subject: [PATCH 20/76] Third datetime Bite for datetime days. Should help cover the datetime skills spread --- days/01-03-datetimes/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/days/01-03-datetimes/README.md b/days/01-03-datetimes/README.md index fcac2b7c..917aa449 100644 --- a/days/01-03-datetimes/README.md +++ b/days/01-03-datetimes/README.md @@ -22,7 +22,7 @@ Work on *Bite 7 - Parsing dates from logs* for your second day of learning datet Edit: We decided to simplify Bite 7 slightly after some feedback we received from students. We've now removed the requirement to read in the file which should keep the Bite focused on the theme. -Additionally, we've added another Bite that should be more appropriate for beginners. Unlock it here: [https://codechalleng.es/bites/promo/datetimes_starter](https://codechalleng.es/bites/promo/datetimes_starter) +Additionally, we've added another TWO free Bites that should be more appropriate for beginners. Unlock them here: [https://codechalleng.es/bites/promo/datetimes_starter](https://codechalleng.es/bites/promo/datetimes_starter) and [https://codechalleng.es/bites/promo/more-datetimes](https://codechalleng.es/bites/promo/more-datetimes). ## Day N+2: Your Turn! @@ -40,4 +40,4 @@ Be sure to share your last couple of days work on Twitter or Facebook. Use the h Here are [some examples](https://twitter.com/search?q=%23100DaysOfCode) to inspire you. Consider including [@talkpython](https://twitter.com/talkpython) and [@pybites](https://twitter.com/pybites) in your tweets. -*See a mistake in these instructions? Please [submit a new issue](https://github.com/talkpython/100daysofcode-with-python-course/issues) or fix it and [submit a PR](https://github.com/talkpython/100daysofcode-with-python-course/pulls).* \ No newline at end of file +*See a mistake in these instructions? Please [submit a new issue](https://github.com/talkpython/100daysofcode-with-python-course/issues) or fix it and [submit a PR](https://github.com/talkpython/100daysofcode-with-python-course/pulls).* From c315e93f520979ac423356c17011a2489390bf70 Mon Sep 17 00:00:00 2001 From: Paul Cutler Date: Tue, 9 Oct 2018 13:08:36 -0500 Subject: [PATCH 21/76] Fix typo in pytest chapter Fix wrong word in transcript in the Das 10-12 Chapter 1 (Lesson introduction) --- transcripts/10-testing/1.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/transcripts/10-testing/1.txt b/transcripts/10-testing/1.txt index b9d504fe..60a94587 100644 --- a/transcripts/10-testing/1.txt +++ b/transcripts/10-testing/1.txt @@ -8,7 +8,7 @@ 00:15 which lets you guess a number from the command line. 00:18 And although is a simple program, 00:20 it has a lot to offer in showing how to use pytest, -00:24 for example to fall out of errors, +00:24 for example to validate errors, 00:26 capture standard output, 00:28 mocking certain functionality, and more. 00:31 By writing the test, I will also show you From 558ba897606ac5fa24237169999cbdf4243d9f4c Mon Sep 17 00:00:00 2001 From: Paul Cutler Date: Tue, 9 Oct 2018 13:35:38 -0500 Subject: [PATCH 22/76] Update transcript in Testing Chapter 5 The word "mark" in the transcripts should be "mock". Updated the transcript. --- transcripts/10-testing/5.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/transcripts/10-testing/5.txt b/transcripts/10-testing/5.txt index 38ca0473..40d1a8fe 100644 --- a/transcripts/10-testing/5.txt +++ b/transcripts/10-testing/5.txt @@ -9,13 +9,13 @@ 00:26 What I do need is to import the actual program. 00:29 So from guess import get random number and the game class. 00:35 Now, one thing I want to show you in this video is how to -00:38 mark an object. Because Get Random Number, as you can see +00:38 mock an object. Because Get Random Number, as you can see 00:42 at the right, uses a random integer from start to end. 00:45 And random returns to something randomly every time. 00:49 So how do you actually test that? And the way to do that -00:52 in testing land is to mark an object. +00:52 in testing land is to mock an object. 00:54 And for this I'm just going to use the unittest -00:57 patch method on the mark module +00:57 patch method on the mock module 01:00 because it's a perfect fit for this scenario. 01:05 So from unittest.mark, import patch. 01:10 I actually need to import to random module @@ -38,7 +38,7 @@ 02:14 cannot really control and I have another example later 02:17 about the input function where we ask for user input, 02:21 which is another area that can be anything, -02:24 so you want to mark that out. +02:24 so you want to mock that out. 02:27 So with this code written, 02:28 let's go back to the command line and run this test. 02:31 And I'm using Control Z on a Mac with foreground to From 7b7cc9efc71a1b7e215dbef358d3d71521c521e5 Mon Sep 17 00:00:00 2001 From: Paul Cutler Date: Tue, 9 Oct 2018 13:36:25 -0500 Subject: [PATCH 23/76] Update transcript in Testing Chapter 5 The word "mark" in the transcripts should be "mock". Updated the transcript - found two more instances for update. --- transcripts/10-testing/5.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/transcripts/10-testing/5.txt b/transcripts/10-testing/5.txt index 40d1a8fe..9aecc560 100644 --- a/transcripts/10-testing/5.txt +++ b/transcripts/10-testing/5.txt @@ -17,9 +17,9 @@ 00:54 And for this I'm just going to use the unittest 00:57 patch method on the mock module 01:00 because it's a perfect fit for this scenario. -01:05 So from unittest.mark, import patch. +01:05 So from unittest.mock, import patch. 01:10 I actually need to import to random module -01:12 because that's the one we're going to mark. +01:12 because that's the one we're going to mock. 01:15 And you can use it as patch object 01:20 and that's to random module. Just specify the function 01:24 or method you want to patch. From 3e5f664042a0e245a9b8022dee96fcfbd3be180f Mon Sep 17 00:00:00 2001 From: Michael Kennedy Date: Tue, 9 Oct 2018 12:50:55 -0700 Subject: [PATCH 24/76] Image optimisation (lossless) --- days/13-15-text-games/rps15.jpg | Bin 182242 -> 179789 bytes days/22-24-decorators/stacking.png | Bin 39271 -> 21510 bytes days/34-36-refactoring/coding-horror.gif | Bin 16110 -> 16080 bytes days/34-36-refactoring/strings.png | Bin 324054 -> 266331 bytes .../readme_resources/post-sm.jpg | Bin 68036 -> 56322 bytes .../readme_resources/post.png | Bin 171099 -> 106294 bytes days/58-60-twitter-api/pybites.png | Bin 391825 -> 339531 bytes days/61-63-github-api/images/token1.png | Bin 101342 -> 63629 bytes days/61-63-github-api/images/token2.png | Bin 135221 -> 86073 bytes days/61-63-github-api/images/token3.png | Bin 106062 -> 66222 bytes days/73-75-selenium/images/banner1.png | Bin 55308 -> 30070 bytes days/73-75-selenium/images/banner2.png | Bin 55521 -> 30413 bytes days/73-75-selenium/images/banner3.png | Bin 100741 -> 63905 bytes days/73-75-selenium/images/banner4.png | Bin 77508 -> 50953 bytes days/73-75-selenium/images/banner5.png | Bin 111751 -> 76227 bytes days/73-75-selenium/images/packt1.png | Bin 122742 -> 78472 bytes days/73-75-selenium/images/packt2.png | Bin 153326 -> 103663 bytes days/73-75-selenium/images/packt3.png | Bin 164606 -> 113433 bytes days/73-75-selenium/images/packt4.png | Bin 153147 -> 104515 bytes days/82-84-dataviz-plotly/images/plot1.png | Bin 16971 -> 7504 bytes days/82-84-dataviz-plotly/images/plot2.png | Bin 29757 -> 15132 bytes days/82-84-dataviz-plotly/images/plot3.png | Bin 68219 -> 38353 bytes .../readme_resources/code.png | Bin 114181 -> 56467 bytes .../readme_resources/edit-ui.png | Bin 35607 -> 18163 bytes .../readme_resources/pub.png | Bin 71874 -> 37967 bytes .../readme_resources/register.png | Bin 116243 -> 71031 bytes .../readme_resources/tables.png | Bin 55835 -> 25713 bytes days/94-96-guis/readme_resources/app.png | Bin 52384 -> 28159 bytes readme_resources/100days-course-flow.png | Bin 74594 -> 43677 bytes readme_resources/100days-course.png | Bin 165851 -> 111919 bytes 30 files changed, 0 insertions(+), 0 deletions(-) diff --git a/days/13-15-text-games/rps15.jpg b/days/13-15-text-games/rps15.jpg index 5839bb5ba60bec05e696f3857f3028ec388b5f62..4a1c90897f4fca771ab8058fd1a99d1037ebae70 100644 GIT binary patch delta 92557 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å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 diff --git a/days/34-36-refactoring/coding-horror.gif b/days/34-36-refactoring/coding-horror.gif index 384c8bdc1b61f23192f5cf8dbebdf3e0c9b8899c..20589541b2fc6dfa259c716a987b74c45895393d 100644 GIT binary patch delta 6569 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 delta 6590 zcmY*-XHb*d_w|$HNk~FMAVdgA386>{5<(FIXy^fy4pJ2mm8uj`6f`099(-t0l%@ir zbVZ8NK|zXuilBlG^eQ)4(TnouH}9wSoSAiI&Y81znZ5UiHFbXNyr{K}m4TuE7QliH z2mwMuLV2P}h&y-g#o^ZG~0&2qO!A%j+3Puff5)#8k!=|8QY`74f zb(%y!jfZ|=!(q>$3$deZ-J{!#GL>lEN@+d#}$!9a4Qs&R`^o z*Wi^C5Hz8)!J4!cg-80FUy0iivPJFL$

jhgB5!=3%YW5|ak}>0A;j6!v_lg`}70 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 A9smFU diff --git a/days/34-36-refactoring/strings.png b/days/34-36-refactoring/strings.png index 06b8a58da49eec343c68bf0a45fefeae53e674b2..014e79d60f4ac9ab83dd4190c0562c36d8e5d197 100644 GIT binary patch literal 266331 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⁣ed?wiE`twBJVdLj-F~0dl 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

    eUPcyld{4jhY6a1B-Nje0h3s(9 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

    N${xxKqbOJskkokTE3CuohJ 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

    }*STCyT%P;DZ?nvdn(A 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 z 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 diff --git a/days/43-45-search-api/readme_resources/post-sm.jpg b/days/43-45-search-api/readme_resources/post-sm.jpg index 88d359ff2729bb8fef08a2501536eed0f93c3a45..da5c19a2e60751e42a88b6553aad521e3c33da3d 100644 GIT binary patch literal 56322 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 diff --git a/days/43-45-search-api/readme_resources/post.png b/days/43-45-search-api/readme_resources/post.png index fa80caf12049f54c66d11d588bf3bae99ddea63c..fbace2714699eb7f9e9f9f904e94653b3234a6ee 100644 GIT binary patch literal 106294 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

    CvcqG9*EfdlX&xd&hj73QvNWgOkpW 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 literal 171099 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⪚D4GWB)xdhy|i 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≧%nI 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%0ADak>;-lL} zA1NMmTtc*P&BMpd$X!f6J0Gyr!eSK8sO4kzJq#*>{ATZ6>sy>I7*R1~Eixz@nRlbZ z%Z_{+ZkmWXSo^s=L0cau)3RtD(OAg0tcP;fyK$%94Huw*i9%5!`nw_UFt@+y`c{JM zXIA2b%0zuGWSub0p!p<%Aawp+;5tm(EoD~M-! z1n^zJCbUQX-nc>*%uBv@`#N7W9x{++X4MXtfeq%{@4X6q-%RnxEgb<2@*QZX1{V3j z@K$NkW!hab#-f-mzoOd{&3@$?O?S(ln`~|eys^q`NzN`$@6LnSSiRlUaZrE-E3-9t z;w5-oo&Tgcg|4vhL3yzkA+O+tJY2yHV|@V7x&9aUm%&OI&;PVZ0q$jFd};AGx=I99 zX!Zz&(O3OcN2E1LQAe!2_@8g{Uh)I|r^&+R5VhChD+Rb$0p@V7EQN*N--L62{)rd} zD5|_O`8WN-%omgv9OwZw)7K&F#UZ=di6QA~6BF8CW6_+sQxo9KS$dNxDixbSrW}C) zxcrpO0&?H(nt!*8fm=%FAkz9t$C%^l4FOMBfC)#+-{z`}Uh?a{Hm|pv1%)L)03Hwpypa&O|6pidzyvQq zG~)^7SNim5RIk(Z9++4LCX?7@Z`T+F#mGhbc?s4h02xD`gBTPF%d$XgKqs#{WJA*| zkIGM)Vk;Xoi{r2$W8V5`&vx8&ZoB_&(PH}V<^PkkfEElo27s;XXZ@79H-z01$j#?N933?gbuoO44R(dGQ+y|y6fgw+pEIsH z;dvmTS&9B<4%!gN;6Q5zl&vhQ)q#e-Ho2g7PK=@`xPbXswuopxo#Aiv+wC-u0^$!j zRS2qv2?iU#kffq)$2VC(w zYw~hnYdHzVsswuTuM)3Iz-yYG!0@$ynCCg!8Y+oS?{j|;cx~A*_x%CS^v~9(JF)Ii ztT^4bg&BKaa%vDjE7|S#1o?Z8^kA`od?SifShF_j&-M7{Edm4Jm+udW%=rUp=-1{8 zg(SwXGmvC-2UlX$#r?o^{s@Nl|25EP+pz=8!H)YP~ zJ(Z8Itoa|Pn7oM+i*}Q%*N6Ta!1)4^s1SJR46o|vzfO8Y7!JozZW-y9#-4O$dLFM= zc|S#={5(!~o>sm+MrQ-GYMHi|>)mcHxmZyd|IU~g4GOYFVM&8AMX}pI$dEs=6ud_- zkN}6@2XL?QLWuYc=(e1we8@vad?*rMC!fh` z?U(U>7@7+CztJ&&EFe7qA(8L%RI~cyM+h)c9RjdVv&zb5^_#JiApGmErtDvHls5($ z|BnfI?=^-m4GohqHZdXk`XGN|bY9+KC4tUum2FMqIE(&ZaNz!4vIvcmO&=6t@!JS4M5u4KxJ!TsML%)d<~3U3>gFU6bG z#TP`a7#?Wr^HU?|)r=nfw-NjV4hQp(Z}fV?B${xYTrA~kL50FyJe^*){o&jh zU>E#plnS2#<Jl`5*P%7V>FbYxnkKOVz_Ip7g z6>iZRzJS6C2v4>EiUwqKFrHK{7yF<=)oNp*ih1D3XzT6!i(R=Rb#kfbe*VBZ@n7%_ z$1V38b?aeKpF=TYKD?v+U%gV+MWltvAg(bg)_s{uAd6Ej1U?F^>IZW3?7q`AVfr9(YemOcXJG2+$ex=8e=S9D(U$1D{O7^9!a} zLh$}O1md?KYDP2|hu^AS@K7J{S7K1W61p?rfq$+v9MqpwP?E43uQHM|T557)%XtT# zDfX#e5S3arn%y7eGjX11J)xKZ0hl|GQAWV?JV-lV9gy=pKiIG>9r*r_BL#dhHi!*I zA*+9^5AYEcF=W{$CrFNrtTrs8UiW)~2wTANW=kY7KWCf(XsMqiR&ZkJWc*OJT_{S? zmAFBoYC$$RO9mn6{C`zz{*gXuPC#$uIZdg*0)tcTK!~T+;Wyr<)GB^CUaKbVc&a$5 zsH_9}$yQY57oI(4upFdSGllBAb~JgwD=9VfZuCVNJYG)6`NLw}$=Uz^$_5I+%QHZ| zjZ^>&)%GKlwiWU z^>6V5L=FcORUmJUDS^)P#WV1pB9Z}r8B_}xdP)PQ>a`$BRjQ0Nmin0gqTI`(UxI|3 zqW0p3*J11X@B-%ays5an8}ke>-u+EZ=f3gcd~uv<-C_Ss%%3-j-~l!CN#n7%&wX7K zF)C0%SiRI$qIze(bv98oP956O%(NE7@YjE)B$M?=fgu5Iz}11Om_AC6{hmetzcX>+96y zfx$u8dJ%JL2KV7@8|$gYp=+-0WW3??CPIABYHwaLPGA1fuf_3HT)vQjp8vd}eLTT3 zta;^75D`ES^A5rIR|$}VxJ~Xk_ihDw!Tx!re+2#DD@vHP58RGWIsnSILyZ*K%{nL? zmn%p^jG4f!6L$l9s3VrGFd{8VDc6vPh67ElRV}pWEe31d;nxG@x_0Y)GT*}_PrHFW zbmd4;>^ZGb)Iy6#Jj1t1Q(zXZ`qi!k($a5C)xi&Du$yWofBf@|5uRWK%@D8u_#J3M zLP9*N6=8QcUie!GI7egi#Re1r6<`<{YH)R2nxNH|aWVxZlx7bas!X?=Sgw4vRLfdL z1Z$D^8`;|cPVL_T>l;q?vW!56`dBP zYF5tkUii(du;(&78%aFpg<86a@@cV$?jUk#MWtuYG1yI$LAh%dM}?%M{i$lwG$>0N zgnsthVXim7@l-*2+J1I0{z1M?sSr)aoaH&ZH0g{6M^ z4QqyXn|*j0#YAvW=;z1J<#}J3xji1c%lUR|RbbLP^Lc%5O|nF6@GDMA!(6)GIE1{T zXYk}f&)8}4c(dsI7WvB>7DUcIg;}TXcA7p?U?#;u$AnfiV@6jFf0_0LSTJ17@;ic{}^fM5Yi-mH8qj z5c&vNThn)RnrxNM7NGh-G9tTGXbq|LXr*~&kI!f76dLZhp3)$USAkfl3_P&mL|HhY zWOe$_A7%xoeYS6~a-!=-C``C+4e!zWyi$$p(a{t4)ai_N>fCV33>_X)=HiTtGt&fL zpAbd~*&N{RdX1$PemLZG)=JjPQqJdB<1wx&-ZHxzb?9zA%TOaVrFJ*Ol3MQSzMaJU zJ9N@9TyM5T8wa(Cbuf0d4jqo=cy{=tD{YB#?ehG*K?8mIo=+c--McsbTQX-}qtnw* z)(l~K=LJi+4x*rzM!oJ3zBFz(%bOD&hxnYMdHZ)m?9+%$@1EX$bE}Zc$sg_cpaw!c zk52Fl5~p|$gjy9;gw%>V`6O=|_iarHgn9GG>Br2t_no=l-V3=rz-_a0g)7HiZ;8J( ze1uRwLE*K?qI3o+jAgaEVK9KRG;7sM6&WYRZtNkN!ZPjta!fpxcI{{5(PNkk@3F3v zHhlqtTesxMTWsIo$g}K*dt*pJ>)=1W6!R6AGRhFU=gQQ9^e`0Bw;XeX%PklqS<^4NrHl?!wuF?5@dm$jxZx0eYlhBA%Mz@wf(}f5hRt-*S_LqDb=IWlB@)UL^=6a%SWTai8;W@#2u^+xRo`!^Nt@ z%`q&^ymR^B+Nt4kYlhdU?4Hv&FZPn#8yW`;znZsFUB|Mi6`;c*F3WtHil1Vec_79= zw;1d*885y+hIIzLS2XXjV|a$wS=E`THHO&2jLbDCwXd_k^SQbCk=t%rX1|@{Kkd8} zel!iwyJkc>d-`y)X3Hok$!qKCMj51W+DGQXl_5rHdCuH2PfkugQ)fkFZDZ4HfpdKm zo%)7lj%*!eW7t}}4u#97iF(-fbWLFB>bEej1yP{1GF@jGVLv_*zJ?nItpWJSID9w9 z*CxcUCunRsT;Z&eH;I_T*&dkX+l5kIbPjJVJYYAr-oP(GEk{Rw7;A?vJqRD(7PB1dJZBr|EP{47PPH=SJGS3T;}U${pu- zwGC#i5Q&I*~+YWrK)rIIBCOR-aFtpz3~ytY;mk+&}H@C;sE* z(Gs&UqJa;!UTiG`Im#0f3=XG^=E9RryTB9ME z+ov+H`-^j(c-u4`k*@Ufu<9a|I=Y~ZMs44@VABO&lYt$wz`0=rc*e7?sI2EO*nF^* z6dU)4YCnS`&B`4UIaC>Fy~Tp>oL9H$oL#Uvs-*YY|LwSQDgZ;no--u$hz#-)w7k5$ z5D+5*qyyUu)qv|nsTIdtuXwS*&wLpqs$@-eK;UC!BQP94G072;mK4zI-19@iM$>_M z$#=#OmQ$iA?UcxxzM=?WT~i-Du2e`+XzqbiNvZ`e#ogv}viOwVnfHX zl|7$`hvBbNI2?43mzt-L0;kbvG)<9?a5)_jfSjX36Qi%MkLj#kV6_-2h+8Zv`3mi_ zOeB+s>DImIM)wT7IH?BgcGih?bBv+gFBjdsg!=mEHs=X?3b+u;|<=}jIJu>#>r0{Uy`P| zj*-L+^`6M;J;W9@1z()8*`!02JI{)=JzQ0iY!4H)8LkIzZ{3sUU*ja<9H(Er<;BX% zrPHZ2QExYyv5-KY3vK&RAGY$#V40=JRxG+D_av$T>&v{_gbBG_c%>~Tk|Klf=%Q3S zEejFvD0=tSC$3?xd;LdV)8!U7*4vFJt7#2~*=0Vj2^oyP_PUz3XQ&Mk*HHMns>&yQms=%wk9`=MLIM1A94Y+u-$apIK%^&D&n zot9~K<3V=-#E8+k9$mP!dh&XtyzFg-dTy<_zWgcXX=sqvdW_oBK@qaOIb|i`jOF^S z9(G=xt;nIbN2X6$?2`EOYB5x0frFDSA)YZI`4(#xi7U6b6hW$%fXuV^ka* z^FuvAwe18b#AJ#@b<|ajQS7z+V@Cm=Z3d5x$={CeBr;yZZC(Nr3W|RBK>9clTU$m# zLc#-xDjLYx;{IQ?=FbnjVq#*Ix!=EkM^UwI0m_%=l?1cnYPkjAiP9G;sCB|)aP#Ot z??Uysj&YvRM8ol&ccVXcTe3M#<$T*n3Jx3?9}gyD=k5+-$A;(fP>wAOl5tg~cdt1` zzC(5>avefiv(s;t`6Rx4ne@x4`$KOft$YY&7Qie-Y#CEgfi5&mBpl{Rx#Kst0~>7s zmOdtk>9MXqgAw&bF66uYnJ*go)>3Y~z;H&;j6f^+oc%j<#s<7*FEa64hI>v!^>UKr zqHOx7J(=v5gNlJN`$N@VzmOYnZYlFjUIMq*7gOw;R9BlOwVWbz)+fMe!OQ9J8 z0c(C}ni1$5@GT{O$EDGtyx!9Jf%31R%O0+mwBx>S=I|bKC33vKR0Dh=&m&0E*U~pi zxc3_UawHRlW`6#OEewNOG?=HiZ@=->3H!~-Zni-!*e;hxRJECaEB*kz0Cpvg7OT~^ zQRGGcBSJR_(!KHU2q{6Hkn&QXOa%H=@f-X&^r*kT%De`|e@!hg!J9-+p+aQ%Ru!Tm3qADM|RKPsgeiP)1l+Gbk-J zzg7Gmk~xQepFYjylh2%wD-JVxKv31XwX<*N>(9@tyP2M|P!8_Nf-`#z51TmL7AodU zkB!@u84M5{%<9Ef{rG#Tfqyum3c6}2WTcu`i?~B{@{qs zYMK5;q~z{=O3gwCfb!Vu)jzmaPT9g%{qb-dOu}9w(;;0I*DYNcI7W{92LX|GC-K@H zo6DrjXPEAH+Cx@fe++cBx($6hpv^=uJ3cFRyng73aNB|W`Sb)^>H475Q;fGW`1`jy zQ13UbGJj;hI%e6=y)W;JnkJ$l%%`Co(e9%V_*3 z0RaJs&pX(Pb#XB<0be|WmVzFQ)Tf(d1?mysOsRox$MJ4bCT6i_7Jfl_Fv5MbM?3?0 zamJ&?D~b-H;AhHUmib<1nY?LQ)YYG`szoYcsb)fg!h|gbNP>y>6vmZ?X6@i;;*7`2 z^w!o7!J+%pcx}XSu0g2OVa3Igt2+dLvAnqweB>an8k1?b&H#88ys2%peRseg zUCl)h2oz}x5(KVEOH>02-%I|IlS7B#c)0m%%r*ZzCD-Zly>-l3OmXx$L7J&F4Q}3g z^wH$g3Qr9L(s6C^EUbv~>-24V*MXlqwArL&WOfgBG*xVk!P~g-6%`e2*9I3mqs*qo zy@MYl8yuwCG6aa|%op%mi7P73EN?fXtWLWQgBPB!<`2IualY&Hw_|hzNpr2}UczHB zPvD}FRVMxSO4@mQa{BK5V%#SXO1DP{3=8wGCHn<`TfnHaA|fF{Jw@H@<>&$I1zj17 zP}JX<8FkdT0NP9>>X5Gv*LFK|I8UoS0R8HeD|H>o`J>*BNv&>waq0XB%`mKuWz`B< z_oX`mM9o1bliaiJIh-4Y@hDdHm;7(({HIsy{!x1*k#NM1AG*s%TX@hLZjxUt zo80Y>hb)uGEAY6Sao@fF78*$;CA{2%=X^Ap6o@N;h`1Wh?S_O(v!o}K-?34{)o&Npd zU)Kcb*!<40|5Wb&PV`<(P8ebYzI+dfdN}331n6Jp?1S$G++R2P@7;NEi17LH!X)Z& zm0sP(zi<0`{Sk5(=ilS`=h}RyjjN_l*_fi#0 zZ-Pk;@bd$RZ*#cN6Y3XwGcu__QGKm{h6^2qln>ox?!B#75$fqTX;D-rF&_CM2#>q# z!t!mqzP^5@$_NQ)S@?y7yq`B$SI7SGMI(EmSad$eBO-k_#Hjd8xlOu*T>ffx}FFMO(4Z9O|mlHbvB z5)4ryg?;ks@UeKvVy~&GiLi40n7fBnzc+$#)A%0BE^IJ~g@}o%y0?kRVhJ0FyVIX! zaA6om!edoO9p4!|lq2c(PzfmuX87xa;VXR%axr(a^2#e4&AN5!bxns@OVyAgPvv(_ zP%2j4bh27Ni>G0yrlV@h0+ENfX@S(%ZCgRk~bA!zkbaEs{A_> z`EvLQ@}K{Y)#?}b%;Xmpg$B;gFl-IiDEEUyeJJ^9)47|QrfF_PFak2_r3>`d(b;YD zwmFuH#d4wC)ohjlr>uK@+x!f)LgpLHQ|4N<%60whJTofA`1wI~b#)Jj@Yt-u?ynBd z7xw3>O%i0lwg}|WNesL2r;&Ou5v-g27WTOXAO$i=5$7STchI%w31d%l z&yVaBS2|xBKRlcdr_#%FQg+faFjxVVHQVDQ93VVPM^{K3`aJz9HY2dgCj+DBg!13H!#=Sb{ zcNqCbdmc5fnxz7u*>&Xo!Ow7x=V^L&*>i4|V7hOCHm)fHP-h0){=Ps4Hk#)pjh`7X zvep$$=keqkZFdwjRy!Dbk_FbD>pLbyqm*qv8q4`ro^BUIa32s7I{0)Fi9}^|lj#z0 zmRJMGghFp;Oy~|iNy)Gj^xDI*U-&%u(+%ou-(qw(wm$N1jVyIZ)L%Bj|RHq2lp=U1n~8g{*?;-rMQWFo{{8Ukl^pd zbbA#QAo(Z1W8*M6Umuw<0jyV*_n}9rHcd@isps*y;nneB$2) zvc?C_HU~z51{(*Q|NUSp*Szz4@I<-1ZfJgaR-+I~szG*#BhxO-sr>hRfsYJf;YnB( zigWP`_wUW3{ttV}Yk-h$$p_)jD+tO?sc&F_g2+vwCq7v$!ER!im5bm8>D61vVG3Ae@H3 zEiLy(Kw;pv#Rq*qAl;>hgQi&am71M>&Y8k$l6Lw$w~Bj5L~xjRi~m0X)t`2iw+!k; zEq+(xhFU%GR4sP7rUXsgXwzigEr{EE%y2rvmoS*}_e~?7={w|;y2SW>sErzrZj7(U zeM-L=*|7^9;E2LvQU#V$#m(J3?h91phO~wiTtjJW(=*gJF)+Ov`%>aVf_n~*9kK3p z*rxtf)&1LD0CS_AhZvVgGl;IxnapT6Np@qYL*br#9>1!60jJCV6}RzvSEy^fpLXx< z?(QzGPXA%2+6}-p50uZoa``XZFUaBRF7h(@V^TuOWMp+48v(A*Aw z9#7LVmLqm32v(_4P5gg28Ux}sdCK?1x)b6e-7dD~-^PDRhzJ=!+8Mt`maj|12+t?B zJjO+Ob9|n}Bj4?$%Zg?5&T6$NNI4Y6cL8D>MlI27rmVf8Nd~1D+J?c6M!gOJK+qHi zeVPpTug`iN@eMI=0JL+}h?Q3`!!2g%Den0(zys7`V0_P(6%;?_m;3<<>5#7Vu+JYW z9HT$RG}dW*P4VJmLC6SuO`j{DIoJ;x2jlk#%W0%&`(@_o>jmX(zVX`Mp-DC7;@y(A zpF+$vlF7Qot=D$gQOK}84#BNMHNPbL@;1eR8c7-a|1L!^oe->!ouyS_dnhFs4C!e9>AI>QRNssgcW7-Yafj^WCn%QDZxk=VYy*>(yK8`ZV7e%ojL( zOv27B6d2{ewLvUXjhP;9%6@n0-Bd-comoo4{(&7{dOW_14P5${8lSh>d?M(}9GA8! z8+Bf9khzUCb%vA?g)CmL*_^Xua=AQk4)B}Z+DXZE;=gC@&)%1+^?1&`pyl(bRvmxb ze*eXBza3nfoD^eP%mZ@TbA$~cBM1WQX0JPxslMJ-t1*MXe=kS(fL#bM1T zMEe~qvf>-d3dUN2V~MkLuHNZ4xP3J3b@n!u%_p%GaNzDhmL21>{zopr0QHd)x&QzG diff --git a/days/58-60-twitter-api/pybites.png b/days/58-60-twitter-api/pybites.png index d554872e2036c75936a6a2bd5bd5fb89109406ab..b342c994a9ba36a435e6bafb3b11581d0bfb2112 100644 GIT binary patch literal 339531 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%0DBYl(?c+mc1Gl7fsZW z8GRU`!E_+}bAE7Q`qWD)ZkksF=@OV!_&fVf{LJVVkr~cFC@Y~@$P-Bt{xN>R2mD$B z*!dzJhG#;?2{b<^r&fB?Gz|b^muZq;GNnK^?Pv=^8l(z^<`~@~U708+fVXNpU_y34 ziItR9ka_aa3;bqrela*VaQYK|f^fH{GO@9>+ z8?gl_5EGJU&I;;ut|^}3q}cb^@&594rtB%Ti&A3?y~JG-{ZOk(ixlZW-Z zfBfAy)-syYKmrBTPt|raC%%&>2Smz)fJ}LRLf=w0?#2PciOdSX)&`WSI>a6nbz?Ow z>p?M9!_RLS=lFOkYQ8nLUwOF_+-;SRjHL;|3Jqds;%J|xrm2K37z9HNZrTT|VF`+qCR+xIFdy{8vb&RX z`%}zj?4=FShV5?e5c+Nseh0I`H+t7 z`PVv4F^6ML{RXU0nG&;t{6*JlS0c87FvI8J*b^-3R(e(@PeFCs{P^=sRRyw`q=QK( zfUvc)R>~9o%R!uyu{9eMT0ndVklp~UQb*bqm!@-tF^{Q&Z`v`*718w{iu$_oIar*` zMb_MK{$9E84+3%b1o5P0JH|@3Nv?EUrj~O|fsHameGD}k>XSRcR?b)*75ImbNe!AK z0ptg+C7aIOWNK--k#cN!_C|)0Sp0=Tj;;g{=DWo*vN34({P7xbYqwMs)z$?2F_Uyj;7{<4E4pU&?FLg~HFMZ3ZCz!{ z3YL~E@Oi(~u|R*aAI4_#2vnTdLH3e+HJn?t{#rYa2PGiqcyF(n!|Lq6vd$ec=Aug@xM;!q< zSeN+I*z-R@WUIiYOc25

    ;U6slrI;=v`Vz)v4tbkd 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%0A4$n&q!)XhsHwXon$qx$fY5H9tDcQUn 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∓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

    F8T#mkH)KS@o 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%0A?Dla@R{pDK3jFC;@ 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%0D$1rSKnhyaFS>e@HmNIW4o|#qy=im zM3=0_dK=DCL>aD=z@a4ohvB z{_xDD+dcf9zQ8E)Nt~y$u1kyYa_J``X-qjmGG<`+pk-qZg0AJ*GWh@rSSoqqf#N1 zn{`K0XRbIdczwl)_QGvtq(MZUtg~Mj5W25I&^F9`TvkAzba~k|7tQ`)gXX{3SCAux zg^919sU7lDl$ExZ;9HyO(hQ6Mw^rH#;*=E18>cMT;sp5l;QkxiCkj3Q@B|v98%2Fe zrzkh5yKU!chPmUU{8?_`TfxXr$8A0U2%I9p?E1sDBdT$$0oNx}PpRr4!2ha9v6F7bM%be|3TAdoK2E*AQ1s-3!^ch&nf>J^UIKO15| zfM!9j7XzI!tKZN$1^#+bjoC(E2<|ELLzgluNt_0Ye3k9bwLfr?3p+85!Tt64KC}TvqS%APvxEnUO=xHy54Of1UiKOeuK5 z*QXEtrGM+5I;bn>wUAxw)q5(yn*5=DqV707h|A1v;O?3;oyGaL^Z4m!S57tJ0PAr+ zyV)|B9kd$WefcPc%SC1d)4=rn4xS(7u{UgxFynMFuHAv(GiA0-pZY1!Baj{3<7gio zFkE07^UK)BA>8_K7cSSU~;By(IAGkjNU%@r%5674{+9lU}9NgldYLs=^6Vg7$Zif)tpa5B7l50qZdK-b;fMb~ zSo7#uR>H*vQT*wNZ<(dvw9Ujj+GKW+;*%+Lem!P>Iv8C89iRnY%a7Qmu4Jr*ya zaTIp+u_&Qu0I2ypNHZuJQ%DaTC_vRlY5)_I3HzVFfBCsY)v@%}uZJkx3fsq}Ivs0W z$=ZYUo}cP!D6;+@2fpqkokTPKG+J z*D6IAZsV`6Z$Ik9XlH4bG!01|_Kmg&uhXnXQjU$v!mva%_lXM!LTiH#svLg!mcq<3 zJN3Y%fbhcL_1?8AlU@z0z1sO!n{&Oz*RAP<=v<- zUWsN?GBU5S?qvr6%pz*Qmj}h5iEsa%^u#w!ub}Kgd>Ss)gC*Y$JjpB@BV%KfJK2~e zcIcH96aq&IDWL{@3Oq^#G@$pPrf-|qe-y>f!OAOd_Pn;3oylqxau+eTU)8+xo}J4^ z>DSACpk)J`H^Ju-LvIkCrFnikpxuv_y2lJMJ_gQ^*wh0XO5T_rvDNE^3S5Zm&k>~! zI~HikC5s;LYK)z3iexH1Lt;K5dLm`;DK%{@l@^*YQ{6e+;LwlzsIV_mx1hd)js}~L zwUGc^ahy;+NOjZBnj?hwkDY*&qcUz9@aORf56@0uuW>-V7QoAteVphg{lB~x$)v4B zDVz)e3D$mnZsR>ya67GNRC#{E^A{vYT`$NA*zc_GN16(oCDAH&DLZEp@>$^=&@l^zi)F6GVn zt+gljhDE;Ls-GcX!2TTWUu-PNz6z{P7`v9#lJ3X;Vp&@+%5oGEs z%GtE@sw}Z0FpP(yWol>^S zC+&1(9@4s*`=QgZZkwHZE978~N>-semEpW%rCWp0x}+>Oc=N_;iXGRsJO&s`f9lt} zhls)#G(uqnwKQf4nQ5jX?@3lUcMw!q)X!+-2fK7$U837vieMrHn?9JhM!9gS2||pZ z;^XPfZacUuddN)Xe_N?0ZWh4M1rDpAqv2?&|Hw>5hTvD|N%l(+wvi#tu9Terv#lPr z-z#)87z?IPO@=r%j-(hOUYpov7^?oF^!h!3Ts|P>e>W|GyAQ0T*Jis!;Poa$UPcE& z&X%aqHrxt-1J$NJPTQMZzbWDo%nn>yx@!?K!SS2&>##sOpZvGKV>sOLxy z=dqzf1c>EXI}?<^`o&#Hf8`&4h>#-@V&#t+c8Ok;v(cEwJ-Sq@5=HEx6?f+$%O@VM z-ou-FKkgwGXLLc&GAxU0jy@#^dsTK@8B`F166pfn@&BXa|5t{UIX;EvqY9EJ&XtJC zutx((Ahf^I_sXHgnT3YWFeI@uCNZ?oP!!u%u?TU**`q(B%vWcATd{gkrb%anTu24&*=cyQ<&0=(TyaSLw--LADXW(Yb=5Nao7smx zQoJmzZKxl>encCCkG`asC&2t_bIM|%39u&h3V?lhKE_)_ld@c;;$lRgb`Ed}Q=`jA z_WW1pMD#5-%ZTY-eYy|B#=zyQj+_Yz@6Z3Y7rp--K%NR3K;QrAPqAI^pXx*=f(3N> ze(BOWdZ6`IhEiyMeI@zFMj&)0%V4qd-m2x_+~amSfM8!cQSd!Iz1P6M<(gkBs8+&i zH=1}D_qbGqw{Ww2bimlcJtpJ1|y$Kupx(6&Us^O+?|f@Q5-A1g#6k>Vr8^b_K&c z9){1@D5NQ8I~L=q0Ls}#WWBQOC_e{40Cb4tSEB|vpTB)a(;#8RIQ-#6sKflfer1mrX6xD^LXZ3<_RGH;dZVQgs7B*iU@4%G%dgo`&lA)OZeHX{q5)KPO0+oA z?j3!z4SfpJ)6xr{U6ni@pDx~f`qX?UviE0;%i6|Fpy5(&X&LVuj04;O0eSZiAj9pF zc$4UF6+AbW9&7+-(=!J(i($KaDS!P-rvzd)Xr`Be&SvwXYEs$4IS}fvBVz|U{sirW z$lNq;(JES}vn9T1wzs_dAAiZa3Q>7dw^5&8@T7F?%kF#17tX~Bilup1S+(u84#O8@ zUQ)1PxvaF}D&SP;y^3g-^k@#>&_kmIGUr}8StjsCRH>vGXKC!q+*(W8&_ll0vOGJ= z(7-)psG!eeu2&pyE^^mp$9$1wE7Z|p60E9XVJl?S0)FVEB0&W4NKw6NF^oQAnG)O5 zZ=@Ai&w;K%nH>5Vq`){Ga+ofDuqVuT9?t?7tmGGaK8gn>Y{}(VC4ydW!%%(W$whPg>KQ2}?-=ez>JZTzNO+ zJ7$JmCUj=k^2UO-W!gc;ijBW0mcBn+ylXkz*o3vWs!&%8>QT=NZ?r?{vHvb= zo&Jl%8*Mgz9b^B?WjF_@Q;+-D*~A^Qrk*t%{9hhpl;{0~SyG8BXLE$M!I3M!G0>2` z*vuF%J0w-5;Z)N9$JKksQ~mz&|Hz8$Rb-12NgT4*A)CWFRz~r*j#XLNQFaot_p#17 zR^nvymQ`692OXiz?Cj0=(&zpCeQ&qlU;XQJy{_l=9FNESX+LdQ|0itwVt_Ff*ehvB zG49g?n?Cz|dw<;d_BTV*?TFpz9RH)L%HVCg+|y4KT)}f(Wf0;#WhWs_Vhjl*sbM(f zvm7kDt(_oW(Y2vBFJ)jaT_{k9*(NMoTyx~%s3f*WFTfpv$9BPWw^B=O>p6@POausL zslWWT1iiz0j`R-}KArp3q>)r5K-ZDmR_y2xnJfV_H z_fqORvi!JRR(Nq!iytire0=pEg&yUmZFj8IPLhM*E9w1-wb9@QRSm53%5KQn8Dh5E zJ?8NX-6Bu@jjOgtN2xi%3+I8WNgho=l40idD_jnB)k_TvCn0_NNDyJj&IaAKvwWhM z)^n+N#wtf6+)qo72G>w$fqyeMJ?>Pi!)zK8%q9 z;ieoY^<dxW(_sWxUboWsqh?!4?op#agP zA84^8?le4Eu5n%pjY3akJ?k9-ekrP&gr>k&PNmI{FSBn&P*@C&{o5t+VazV7VfE{F z@KeHAPSD=vGG4#nlA#zF@1cPO0}0_0Munv~%q%$&!F}XBl0g~|K+?yaqh6GByu_Pk?32Vov*51 zO^5TW(pQ>RKZdGtyX(@>i^NC$E|A;R=dl03A7y3DIXRkuWz{ z!uqJ44{`X7V^3xYjk&6i_Q(tMj^PUY-Oqh~66^cJn{yOSsq*aZwEz%fHBk7RLJIs& z3RXFf57ie6PtJ=76!6%#rld&qd1lK#GU5lL?)yEG@!$-3rikU`9CWaS|VDrj2P&#A0eO;)pcbztwc;Zu@$hCieHKHS%jPHCTX6|uOa8; zFX&axwV59xZuQ*t?An>!A6G+wD~f>56&4f+&c1eePdw;Q;D2_i5V?WtF}osBz)eF^E)If~o8^x9?NK8aLu2(V>$ULMjMVJ0wC$1?=FHa+9$XxX_(IOHRJ zLca49W($t~gw=~}Ml`EtN0EAdBYm6K*Gh(cS^1!^Iq!qWN%^a{zG&lKvD%Z)nULT* zaheqpz3tQjezMQ}aTwr=+lmOaJ5m!f35#-iojRa*?biQ2=t_mG82T_N$iS}X@E_-b zn=^Klnr`iE73c`#pg^PB*b&@YBS@YIUIY#$ecBh~vraQ+Rl9L^{1SZ9P0KH`gT2=K zw%K+ctNlXYz)+as;Tx{dUy(Tv-!pT>`$q8Qi}Y-Z$*#Sg4)VPyYF%VB^i=%~lgFdr zbTR~8o&<6Py6C|o3FtK#Q7`9V{q`hHQnyDOKC-7e5x&IZ7jXnr1~rKU1XM<=PXZGK zY5H8>qVfX#)+AuO-5!fQyY)ucmNVaZJx0IBaKmjiXyspqTDt4kE9}u0MKx%4b#KL2Kbt)y*;_PmPLjRpx68atn8~Rx<>zDVZ`#r1 zUm^ZpW-hTmsnOpIk5XpFXzQCk94pYKPa1bwr4ei5VqwqHky}s~ZTjO6AG}_? zFrCO|9WPAPp<%>t=KPw#D!b(mKLTAyYv7OL%r9U4RkcSi+n#uLd8nG6)Ss%=8%2`i4}rB@-EpBIm?G0JwOVK1(`QN2YT`@@MGoTFnr z-?CYP9|dUIeia)ai(wh25BL&)yMfF5513Gz?OVlb^LtOBY$Zn-2<WOF zq_#Bq9TUS^OEhT7SzoxR;h=fmAj3ku)*jqfCekxr(v{^IE_Pk@rsYg?rT&>Hd&T2$ zbG5#r0SYw{%w-jUnhi|MZepzCTH|!^Cfh|0X8OFv_B?vg@~N29>A3G!ok8>LTT!XC z&bu0P3NmyYctQT<-}*W!BC;#-(@OhcHd5@DR{mJpd?`mu`rZJ}8y+f{`MN(mR#egv z^%1oKgP0-dQwdbyC&e{8A^QFy8!K3VIPrLggMamw%?jq~g~W*^Yd(#{9_t@&C+>#= z3+n58hg%~F*8d5J8tx&IQ?g1jkSEd2o)uTxSc=Ts)&1__e#N3hEEBNF5r!!i%ob!- zjA6v;=BlLBYI6`!QH6S)@1iBO7r^BzUkj~!Uo|QIk8a9);*nO{ zC+bjW3^4F9tG?i2VnDDUjE7GinVg!5prX-*Z z41-|c*DkBtzZ2BGwp-pBU@xb2qhU9+qzV?dl=HF}=zs<*gI2iDX17DqlSXg?c#9N} zZVs6kma{vr-R_-XMBFzvL;Dn3M3rhA6lE96im?XdvV*2?Z)GX=8Z`4(nGAlE2E(}W zQvks*-OU$o!-jta6a<-GpFVfii_i_wCd8I3huRvm#4On16kZM_tdj*v=2RESWy97*~hCV zH^$KoGow>QL9rqG-P}2zX9E=EM`NHaqr?|{6yv3-GG)*#UEnaH;X|?ZI!kCEU=+B$ z_n5-uOysm5BsNY&DUJ%^G-VnUb1U!Ls4}vV3YAP-xX`z*%J0qP6t`-X8N3xGMx`or zrO;vfYk9?bfG9Y;2k~D`OX8ybGeo10tMO1cGq#xgHrTx3t$3rj|4;*#rqe5e*KnN? z{(3LXyx`jb{ft_aj@r=4Op(s8Xc$jGl2#whC!fr zKLC>`c^O}Er`-#wTC2j-R?!FXM1xyj>F?AnoW%t_MjCib<{MA??b9e7&Zn-2{PZdN zNc1_DrjQB_EF*9_MtBhkOmi1K>bmvX8K=sngtu=m&fmS7mGna{a*qOPTnQfB8&XE1 zELw<%OSg=eq8IL@+N*w+Yo`=4cFrY)dtBf2_DUmJ2jk}pr~Y-Nk9%EDAzpI-72f^E z3>oq4=_$OdG!E*J7z;@u<7NXjY=u+Z&iE7Ff6ZY|gN6{?Bi>hxA6@UWylrVYi*@Yt z-*vHxtx$#jBkUn-`_=dSiGq{2Yb#zbWV`s3F6$#rl*!zOhg^O;7_xEnh2l$gXm~*W ztY^6OX(yiT75#faXQx{OVLlnl5RKT9f~!lSRSSazD$_7d@5k?BxL!8c52H~)BVvD; z#e&4dXzwbt!8>`vd?GReI%1GGn`hT7oZj`4mA{!hDH4i1xFrAEG-GM`9^7#I>z#|#Y7lzirUSxInMUz|xh2J_s8Wdm!m z20vcV)k9>dTLh^b5eslQNjlgBii2jupV5I?y6@L&sNPKaM&<@DAJjGnjDXJF=! zr}*8+%jj%lrXcJK*ujy5OQahy2ks}ghNp}JOk7pZ~ z&?1)$M(_JE3V`%K*^EzpS@oOAt8}Mtbs`EFYChYP6pI`KgbOWLVNIu&o$1HQWd=l8`+P$x`EvhqAuJpg z4%>P<-`EVGDgDgQ(x0Ymlm6dD<9$Ad@QOPOTf55Z936%HiBviVkMz+IMb5cN{pBmA z$|)<%TFN6}2n;w4PIwoKVpLVtIMk2=0UOgc$acctXWBMe`&T9^+H;6qJ=_UdhX1U6 zk&@cq7%QO7422WmImFHA)cupd8pUvZ79L;P>y&&b#NAJGF2fo-XnZRh*AU%J#1rHUN3w|bUuhd~clVo_N#c3oN} zSz#c=)_|$*hMe=t%6c#fQQYcg$#sb}Q2*|Yaz>fxoeVIXZN!fiNUVOGH5u1brEJag zKCBJdjx1U1>yEjSS3)`U4^gQAC25SVBoGagYT~6=v-?xE_YI*Bv z%QpvGVJt7=<#tuEqNr8M#~5-61a*coHktj4_n~KysbXBlF>ibl#!Q9)%~g2sBPBbo z7H0(-(co0ca&vyjJ$(fl(N2Cbypd6wJm&5rl8HO~RT=3f2uYo|`8A|Es&6`6k{C_p z-ng3r1|fM9^bFZvJ8&>Jbi9~ex1OX*H*F_3R{AGudoA_FpNtKNQ4@38#%F*0)b(W7 z&A0h5S8;!7<2=w_3(1UiF|I;pXd%)57*G}sj-+XiG_}FiXtg^Z-I2mpeX+w>_ZIab zZ6tT!BZvJ&bc{sZO^y#abn$srSFy#}g|xC`rlEg62|(DbwS?mm>%p(8^vMB(g7=ve zZ%9G>dA=>RJLZl6g7piajnl!8EGlI^H3n!$?^o2#>}~sNnFq_j70H@OuR8c7+_&P% z5+6b|%hUcJdrfWhyBpApq^{P%+H3IP)S1u4`*Eqny|I0?fIHBZE21bTLk{rmrk<_V zh?;CafulStoAz~D8&Eed$#zX8ee8Q~FO!6I?$+hG>!N{O&LhFqWVvw7xs1jDFJRSz{_!R3d#s1eYpj$LGei`2nO+lT zG3f68_A>q5Ra-cF(ZJ(*Cl4h~P7!7IYxhaOu-0h|=Cj=2e3cf&+Y3D!Usw!wfjv4( zrX=A;e|juFAk{B7C#%xmvEndvnQb-^tMaaWL~f&Ld+-65hAA%}W80Sp2G?@Lky#q2 zU`N%jcA?cq3oT(7<-wAlbjTT7sxLgT;X67fyLRF_$JZ0}*w&ru>8yk3fil}fc2U|) z)U76HqA)!sri<~#w+uBFaTxVeKOxNMRv|`K?2Z)VAY&ByR0!TYvdqX~O5H+hlj^TG z>tKm*d}7@zEoOkA=;^`E^YpTx5UQlj1m4 zy_&oDA(2;kF$b}H?5gRl$S(Ea>CJWD0uXeY16!k&?k^StdnavfBg`gbyzsfg^6vz1 z`tst#*kh&rZJi5uxL4Xs-$@ho_h*opnHp-bv)1bV^x7v3Cf!4K?Drqz~Qa z;oH)`7=D4egDIlneyINp%-A~QcOioU7htr3@q8dSaRrd_$`0^0y2bB`_2+ka2F)(D zm<16x+;_cav>;kbaZNssO7a0ro%aP6evBfA5!q6CIuGlPAn-r2zI|#Co0kMGDVA8g zz}^BBvWFkqvqP{L?eax!>GyjUk-P&Po@8)yzxkP6CJYZiDKa0r2LX{851&5_sOdaM zuG0PYqPlwM_q{9>W>2?x!utV*)`0aKFp^}6A>&X^l3BhLzieGB(##n+T=WX~@@}dZ z290l&Ee#8`Yy|xlhC(al{zccFcq2iZfVN!ASbVI7$oo$?=7}}vLN7pTSc*+D4|_TV@D35|WEf!*BNn1hSCg%8 zo}c&bsLrmQJ?|Bh9q%pjprJ3j&M=st+1N_BP|!i!|MY{G6<~m3FRpJa4Um$W#^Osx z{Wh$E%cOdpkLsud6lsoHNjfgk$v+vG{QLE~$$mHk1GHNeYwKHL1@jokA^ zh^A5WSNb!r?+P0StK6~>tv<&S_pyh*W=c6Z(&y8y``fiA!;7OgwUX-uM!$Y~R=vo% zc3aTM4MS269WFyY6GYA+k#`OWJ<`?#EjMmX%hP9**v! zam%$c1*Pn%j%Mn{ZnW5#7$^Er9?im^%EHZ2T;_#0mBpSsKdt@!$TKGTf;@Kn0klTX zs#Vgv@B*cCKV2KzB!iR5LiV_WokEXW)qh|ZNB96-W?LO5nN_Xv*n)YffGq5G>8}yg z6{E|`1iz>6ImRq#u111HX3mo7jCsjlK{fD@%dgIdRO zgpv|ZgI(CtA?!^d@{!K!`E6lRl2rLugn7}LV8vO`YE`#;>)J=>#`TzWfd5)!EufvY zJ6X--(nwvw)Q?@S8P*T%wc+;560#Tpf(3k1xPAs3wwrEK?5&qe%B!m`; zz?)0wDBVQnw0lIUS6 z0I-??_*e+RzGFS}Dmdo|KQJS{u3w(R3zm?=n0wX@Ah@Bjn_1gLGd(|ljc5!;$(h(= z96+BhD>*vmRUH_A^S(-#aL~<`(u00e_zShrHjTtQe7znt%wYUR>7P_RjS=OVV)usq zFS*$vJ&0PRh&!9hmwfk%&3r3bx2MF;XI?+t2%s<3Gx;FYr+-(;6{3;jWED^KWr9ye z1990dwNZx}EDo4S4cru{1eL-u>`wK+E==sWzKge$t=8Pnu9X0yDh<9Um} zulqzcmvIDOJ9;6Ozp`(~M#x-Jg=HUbs9sBVrp#B!I_miADO+)G+<0?wyg(A}Gx@aV z{@Y0R>S3wO>}S0-cKefU>0wTBV8=nwtXgZjU$^MKQuunlun-r7Y~{0>XU@q{Wr*}? z2FLp&5}wb5#iIpLEuFVfBAXR#YmJFoz-MQ}G5y(f;R+m~r z%udEk_gl%qU6%BIciK~U(S^Q%5Yd*aCk5C9xb@OKvZ*fh&=|;Ytmrg zVVJw;Tn$Ey;x$^S&>)hkDH?KjUi}fIAgDloQdvI z4ZDx8-t1#9`N$roVV(-IKwShhN>Zmz{*aCR2-yxY$aiVpMl{;3?a)aEd!N1DI6oVp zW)(9RT0E){(1?>PG-0*fF8M?|@mo!1>6KK8rg~Vqb_*k3)tz99k`+Q>q?yLDwE7?( zs?;Zs0G8MdR>+Q!qReG)C?(crMvm^RYq7P~^Y*)sYA7p@>ic}^kBzbpTvk14? zc9*5{_oUkEhN?5V$ka*;yMw-IrRT4V?F~`+p(Pgws7GqDep}z*DU6%zAoQzc1v@ zUaMKE-B7aUXktd8uJ|gPth&+3d!J4k{CG0JM9sQyr)ih~gwJASn3avD{hrqQv!lmc z9T{&=h6OWnEf5)yC=)t9z<83>EJU#fR@VEWWa#^<3;Vh{r?gh~K;F@7xc$aNuGr8t zNLlDgzS-MGFxoAzsMt~3M!iwTunv`>fCK|v!{!%mHXzG5|L0Ms<_)9dg;Q( z0$TYY8wVG%<_rBxxrjlyvi27^R=4H~vgqaQa?QuccaA`{3M6q|qAq62Q9)e)(DXzY zPb6K#K&y)f#=#hS)}ug&o?#cPtf9@^>7n*ecWm6Nkl9z*`=LMK9+Av{bRs5}8@zTY z2yh9rX6YvF0ff1GIl!qu$>w}_qu9pt(&*ct;U>=%kfaGO%!c@(>NJ?K>j|<bE|UYnsRzekiuc&}x+0C{943>=6&7%=xu8oO|!_@_Mk8 z?7#&^OXTRpxbyi%>TIPk?kE^f4ag{KZrvMf9? z2=9I<6hR(|p=JeSz6_U(&J!@w{o@$(=0fwPvV;1_u3)Pvh~W=71?pvv(xrMb>efHQ z!_zyU5;9L@r`M{cD;G+r$*aetsEVSMABt1ZMKUl0XvJcw>@BFdB)cG z!H-J3v2kfMeum#tFA!(Bs*pv!a6@VVYE{My5iTER!S<+Qo!)#VXXulAInRlLXTTxb|SF!Mkjf!OFesaIVbXeg+W4;d}S&tOPt7Q8bQnqrHfcNoaPPfy2#ASCIKlw-Qu$}cWlo}mHOiz z+j{=*zaEj32k&%m$Dfb4o-UuH$D#g3x)c{XG4vTE=JE_FjDWJc87WGr;*#zE`st&9KJT=<?q zKFLV0wrq|Cu7w(PEO)|55*12EEPZlpEb`*eo@NeG=uVPzZqTJpH5XQfK7M&0tgPq` z+2V|heuS_L=vMGJP8ADWmQxBoS#qp8BHj8Vs=S5OuAmZ6ivh4_aqN8|6GSfEoSS|= z`37vhXxE|u@)r06CrS>a3Wj%XiQ(VlB3n2PG&QzGw_$v%|z_tp|qIKx_{oE8%+`?_NY*gDc zuboj;5&pSx2~!^AEb8<^m5h}m^y)~*71mO~)Cshd;h}Lp42%%7P05hL0K- zlz5nWJ}dkYCe*3l@FC0*+jhl|9TJIh#xt0TD(sEMHa*54KP@W66}K#BM^+1Kc|Xzb z4XZ!dts1z7MN2u_s*{Vd!1Zcc?BFP}`GvgxC%$&A6daAefO8?vXRCZt?nVDlO@D=#c~-!>Nj2MrkO z?9lwQCHfPOds^iViOPN?wt!yyoZWPD*O)BUq+^}v0sz>E!iSJxwmL0Np6S7e1@OBYEP5qMXGN$EFt z?aea(Wm&)wOGjK4r^g`U!t79d_%dHa9Zt%pQiyKRjX^an130kE&ie~2DR`wgoA+OB zoGwKGnYPMbYu#pUOfrwG!!&2`^ZvNs4i7yPw_2w{YNR`3-q{~cTuTk!@2$>Fmk!DP z2c4g+6G0D^q}j2U(OYL_0w;~g$JuU?_crIKN=(kES%|yagGbaMUvb;SKS2- z_@ZMOHHs8u8JdFQ0|}Keb8W_p&GlxWmus_q=flB2cZ_h_1SXYTveB$mLpRBo@6`_Z z0rU(q!_u5GWSkrQkva8;Ekad{P^K<-S-+F3UgZf2XR+L}KCyZMReZyh^}qCT4|+q+ zew(fcYsEpgTB3wW`4V$R!fx)60invL`jPwGsdZkP&S-@V%jt%Z07ISIBP&y>haxsM zLBe~A3fj0DfX7ch*JVSyT=zdP_sVam z6$|_`&SHJ+KRdY}v}Wo!`DCowjGvgE(n6IIbqL#%<1GaGCQ4#@@z^2@0vBgoP*k%_ z;REUgNs}?f5$UzqZ6{ik|9wYVTmu?%$=utPYEV9j9S*g6Ylb^DRY_5DHWRpW`7mJ^ zT_Y}!cq5j7wd>=z?r+3LsvE!?9v1ameNB#Vx?RWsGRg})!=UUJV=_cJ*l~e2cP;Bv zPbo1Dnro^@N{cxnv3P@B8j`|f7Ikr#BQGzYO$Xo?pi7^%3SQxlm&Xx7Z#PSMtETEl zhMZmMUa#La6WM5!F$iAeINx742=UWP8gaNDt&(D3WXuw-Oic44P31C zuBipgBncDl$@?mzemqSgRZ@E+=EJv7x-@s*Rhf$Fq>=G3tJAAc)@^oiyt%)O?(2T7 z0!o7zq0=0h6#^NFS)<4*ry@f|Jmb_q0i(`(0s4@@f;A33pt|b5d)dj!e(KzN%aLIDwoC>t& zVDVq2eL3pY^?)SlVq=Vx)jTF)PAM@Mj_Z{!NwLS8JgpFUxnBXRTV5YQIWfl_JW@|* z#NT^0)I0x^cTXmX2DGa(0f7uypbRv?PbK(oCp=h}30|O~%dgJ%#h-2jtyvd57#%!~ z5;}c@K0fz9A3WCQicGl?bgCqC9G08o`D>;q$V~0SD%2)Hh2z7gtB^t(XQ8amaTedO z;<^43dd)7PFSl)5CS8(CBI<4lmm7yz_02?N)U;LxrBuRk-%E0N?%mgzmlXDniHxxV z0M^kG0A07U3uyRp_Nz))fXFK8u6Z!GHqKS} zwj$~1%Rg5gum1@NY2uoE)LYzabMmw5={wfs4H?bYnDmJy*DxxXz6InMEPGZ`R=6x34&J9?1+e;QY^DAZ(V1Ar0B>81{kZEN zrG%^yh1rEzG%2OPWo2wOYXPIe$oMYCRz9LC2+2l8BK2|Q$mUHlKi^R%CxAyJQ~dWh z?%pdBUNR`gQs%=U<&22MvYV=uKoUrauaDTTaO#j6MSbI2Pf<6wxU7r^e;(n)Rwc0h zcNq25(O&IE<)e2^NpOnre7M;FRegGv*a)UV72X~^{-JIkui{o{A5H;#$!}K>iI3)i zbNNRa46WO`5OJ=!wofO2MmqYoEYJpe!<#Q^M3u7dxiRU`6+_}EbNW~W^fBVavXOd@ zBuhEFSpQ-y+%EY?A*b3DENQ%y3}QpwUwaQ8ZgQJQ_ywsJi%bbacog3*XF?$(a6Sce z4b@JMjWe}RwBV@USCM`8KCSG~27?ZtQo{dB)du~6WDxcOo{@w>BrboY|N7zXrEfQ> zz^Izvph)Uj1tBU#+cc=dR#eR#I38G7Zf$i2`%XRW&XV!$isOg`XT7svSL_p>V_AzHPWJ(1LGGfThAu0g1n#*2C>W^U#+c|Lu)6rpe)E~^f&Jo!&z2R~;$qaYvDhJ70)?_L(H;5oz>66Cve->7 zc(wTV^OAuk{#QgOmPicKx3($ZSX4X@wX;q1pDu_GnJb+R+AnEsD%QfnOEKAn5#RiE zjQ)Q?7?QeuHy2yk7Er$X%HP%Ba3!>|q|ah?rEN^DoYoZY|HELTD`?aEOY1}YcsG9K zc+0Z%>N88~@Vx9fZOhNiPuP>CS{lh|4@Sd0&bsG!IS1gBID7yYxX$W?y zO#qf8K0b?Skbg56Bif!hBgH5%NQlbv8e#ToipEnA2joqHNvpm-1wl$&+@qxE!pKwoyZ zTB5SidChJ_B>*4qB!VY_UXnz|NT5}9d%^PZ4!=6~-nOxhF9INvPlYM zzSjb^DXTgp&4O8-zXgl{7cC2J_EHV=IYs5ZA(W8CUUa4wz^2td=TrNNUclyNx~jDK zU~!5$en|aqN*KBNk+XpmygV4Dj|a8qz8#+%0(VovK9*l)Eoa1Km(34zI#@^#>GJ49 z!O%Jx4jKIsg*4QO^Fx#MG{-7f9-mlq-_H1gX2Si@IgWsP+p=foMbr?a3oPj4kOW6^ z5T5$-;E=rUwPXN{t+8cjM>y1(J_Z{0z9e& z#83uD<&*+gYo5zBjB+@rr1p(Hgm=oEUi9RLHj}}&Y3^f+_4su)@XBESim(SaXC^Cr z6;DKflnb=nc*1D&`8ERQ*KJP!R4rQjFRduON%dF) z2l+RN*wu!rQoaKLv6AcF6eGrhkNIOt^N3B~;?OQ0jU6H2^z;V`z> zw8ejT)n&xj@cV@NY~~WTGWgm4?Z1+Oy$9V+pN(8i$FJf;j+Pb|9@AV-5z6otcy-;VxaFu|O&$R!VHV~iPmq@pK3uih zPNXpMq{Pw|-%T~m(W0pbJHoCYt1ybLwwTCBrjHR86OH*~3Csn*P|TQ&YUYX~6iiYw4Z~uA#CD><1pd+lve&mG86fvl~!wG|CccE(P$BFAzzMlKOaV6aiM#x1i2 z;btwL94^4QN3dPd&W2V#U6n+9zHAh#%pX2@1`QMLMjfdQsOwB079A?pmu17-qtltiTew~xl73~NZWkWXZ67UqVB$^;iL$d*2I?sBU;~OH%;|$hUL%To-`X) zusU=CSD&1zKV9Cj z@qiB$)TyxHk6$nFcj56r(`s$zm@k~3YLGj7%jw>{NEkT#dA&@gjfXE$dMlspP$(Iw zXX(YMiJ&(O5>y|_5NgJw3I);8eswiWwgt3(W+N(+bqm*8s~9}-jeXJhJblpzAIm#N zuv9cyJ}Tm8;mQJI>W`}_VkdpPYUh4Sl3qkB!%r2^ae7eq*a`wl!wQgo% zqDoMpl5KUKE!loQ5tZ(;fMrijW2&wjdb8gqKl2P?CJMh)>^xV)mAODFjP!Pfp!Yiz z6-JSazJYG$v&f9rK0mE^{VZza;T9Ygu8rlRcN6`xk`l^qcsaj0k|yH!XlQ$j;`zDl zy;`7wSz9Zyo2@V0=x{l*i33)?te=^UaX+d|FP@;Mz<9y8fJuOd)Tl#8dY{Q67am3) zcQHQnbnaC2b{nbtl~&O5mJP4K$odMNg<9fy1i|vM(JWn+_}*cf+ZP!gwrOwBce zv0IJCUo*hmhZgCa=DAD6Vc?X{kdZlKapgb}_g7Dqom4_q=>Gx>q&#Tz^}b#|kA6hu zlzL0bQQ({hPFHjY8xw_H@Q5RlKVGdKvk4HrIB14|H`AcryGSAHIH9+n0S>_XDcy1Z z;e!1is|gRp6c!Vy$0ULJ!sPu}3lpLSi(!Dk!f)01OA4hJ8wuUvZeQsbV>qsBvXP3j zD876pSj2D?Nts3%j9n22=NB6IeCM6uHvt591SEaM7b zOs-c?2V(&O;*Fy)SXDJY(b`Cxy*AaoU>z`)bt)KtX>jY!50_74A)emXNJcT7AE&&Q z4~|}!I!-?8Zt{l2v4>~n3zDd;Xyr2!!9d-d(mqm07)HNen8&o$n{^t6Z}$L1GyW0z z?u_MB>It!DpN%wIMr)}pE0iI%_(u7+8UpkU%#($uOh7~ZhIQr?hq9r2X6le;_rBOjYjAfr(0kOJ?xI2(DyxK|qEc!% zoY?3N0QHE$+YBfdI^-dYn#!7)d{_%CHk~ybk>#lld(N%XZyXDp;W92A+@=j5Zuam6 zjfc~dlZU0J*b_awAM3ZhU=xH#0JPWL20$uxp(Px4hqU+&4iS5OobIj5ek|@lNUie zr8N=7z4ghOBOYxs4EP`?A$3j_a-(oeA;SJnjsszWJIQyxKmic#n12 zp$j(1-yqNVFLIcU_G$sqeny_Awk!! zTl@YN@M&jriVS*4uKKTIp~TFFh=MC6M? z4Rv@vJ5&w%%s+$uX$#@$Q?k^Q`;j&BW!S2Lxc#=QI`%RXw~wi8I5WH@*!4IJ&^F;1 zS%BP4V7Y;LPHaB7Ky#@(%t_%nx@yIjHTZNaRuT6r>91fCq;;>)zoSCV=TRZSkHPFr zva9EOT^zhr|F!5~-He*=*cswp zUh9FSk7}A*Y_@;*TYBSpBRL~Lgxl%j7t9r3d7}XXFSYnee@I}DO5X0=dG$Wq&lJnC z^grh<8w78Uq;EH0y7t)K?MUfm&UnrFX6?#(>qgHv3HfUg|K8o!O-s5g^VC+*9EnR4 zA=mk6&)V}L5B~%^+KM#I_G}cjGEZ!LxbM^2+88j2IELryyDA+hx@>r_lvf50hJ*~* zyQMzY)(`wO7&6m4o8t}L@7Xy2vk|l-CGV{(P({(dFEPjzz4-twT1fi&suT+kMpKyo zDlv;TM)}q&6LKSjVR8D%>--NkF&j<&)+P{-rSne}e1mAPfy;}{ybzG0A^EJZNyg=>EauD;#a zpl|fBmG?G$(L-(n;h0ljQ}YTk(7T%cz%_8TMkaKT=|ZR6I9?tTSgPZShFa zCs8|in3_RJA^?ARo+>S<$7e3Z)8`~T*7r;~mL%Y)$@h3V==+dg354x>kzDS)8z{<%QSp-XIQ&tZ3g`i?{SyD)I;%&V0|6mfn0^UQ%{? z*L&0_q-Je6C?}>ly?K|VTe0o#?zkiOSyyWFpFT0Ay*azw&BKX}1EmeW0U1-vr1awx zLmQIxgNUmTiOYhQ$)YVT$K?NW7qv&Wy#hlV6`TK4Dq??KC)+080>sgVYhffA8!mxx z;hUk}&Tn}r<*U?!Ru-6^?N-#v=;AzJ6jlw}$BOl{18xKDn_ksowL(FM2}z14pKTN^ z_nYp!KUX>2k=UK*_a1YYntsCeg4N#9ec3~=rBZI8bZyfnEBjf%@et`|U2pH%_f3xJ zqu1mP;QvQn7a}2%Nc8OBu>s>fWA-Gtw^fZ56l}czC|dO8x}fpI_p*(NGha@9PHWc! z=s&5{L`SN$yJ2n<{qiei^Yiv)ehv=Z3LBq2eA$zZ<@fDY^CfD>*?ycSawtpqUh?qrp zyG)zvcH|MsEPqvEzEON?TH^Ch?mteC%=1W!Zu-D zbZkACy0^E*UTN>sywYxyeHrzCH%Zg>EfEEy1O~KSi_W|z%iJ=H`&PBnll@0LCQ_!j z+A;YbdwS38qt#&23m7?{)wh2^hU?@Z3GO@Q!roatj65$^3rEszR=O$i8bti2!j}JX3*S+u?2aKZ2Mg zf4KASFOO|9j0ToehZA{k(a#<@tLVn6#bxcABXeY13O0Y*geDCASz`W{$S%bjHY2a5 zx0Oj(nD~6_h!~gYP^nPxoxECTX?-u8o3Lr>{yj*rw|6yfZ_iQmbTZZTReE}QI~@GQ z&xSTg+7dM5+A&723mFGBUb7XCQsO$wb{vYVa|yynSgC}BudB=ZOq%di>%dL0{4Iip zL+amN*S>&Vt?s6|G=BHS(-pIcDbJ}sr9WLvnznQf)1ISG8+~d|U+?O?k=Z(6yYBso z`i;Blc)QvJ_u(#G?&$=#obU0Q?B~m$5q2X>YNJ%@4kZ7OM!n(*3xkr`QW=&w!x@VV zjcsN13Q~%ymQ01m#|YI|Sax;Lo5oM)4W~6385e7-Mj@Yto>X`Qt=(#H7@NpZO+)Tg z)1Ah1)?agQ@G%V7WtgANX^J*;?CtG+j7H$I zLv5nsbm*aVu*lw{J%d?xW3n~)GGS-djub>Qq(Ga@Sxl6BUKr>H>&>nYiE87 zqvjo3xO(Di)lTMO4c#Eph3#Syng~Q9uH-1V*Z5kfQ`ek#mc|VTIhyjuC1!*#E441s zh;%a-WOF3Qf8U&LksZ@wnSu!QIReCmLP<2=sm&q*-I zAspu1k*a+)wwt{G&#(V<9a!NgUt52_#eHwLFM0pC@d|-8F|a>J-=znt=iX2z{$e(d4^L97qb@+k_tphb}X!R1du| zds!TrsFAG+v48nk-!jAS1Wns#%uJ1{w$^riZ)eZ}y+m+ojf9@h$oTXjtnX^g2M7OK zeRbB$dwU12t*70mW8Gh5itL}PWtQ8i-wuBewvY1v>=U9J+-H;K?i-@mpI7YCY3Trk z(p0V7T4x^|54QTdlI_QTPwVS5(Iaj{55=zqX_N)G4L}~CTI-mfRY-TeG_gjp$v_u3 z=$s$FDP)Y|kIu$qo%{Nym9w6P*7HDGdvxh=EQPoi^{#EwcX4I=(|mo9VNj2hLw&6E zRLjxyW%zCgZ}SSVYI};V&hdr_WzKfAU?(;X<bmJvR)luquR zo8rKe>QUF)1MQ)>kSf*C4oF+p5&nT!yOYFv<5tL&7_p`GXqdD$2Hyq=V@~{6MWgE8 z>P8gkNSMpAb;Q2>XTn9@b=j{#%-I@J`#SXYZN~D6FG~(cyMb!cZb)V=d_(ni-y$^E z$kwsethLOrXw(ddxJq+-ELg{kj$VuTcbE>Od}=ClcJ^A7aL3d04U6`Vq0p*WjvetpoH)vJG#gc#NL3>|DnsOFw-#kR zOi2?FqGr}$bJ91@UX7pIHJdG|62h0**~sU~7OB%^$3HLi0?))WT62V$LNs_zkuefY zsBl3JzIB!_o#PdWoy6x$@3y<%IMjFY$o+YXK)fV9+bi)>Ed0f14~42MkM;NKKubg} zzM6MnVn+47yGl%B@wjSW3awR00W8`7px{qkQ1p*|ZPO$_-vUXwubxZ&Ba5HM%6{HW zxX=BZYE((8*01@n_{i4Z9qLHmx8Y^jyz14uuWtrjc@!`}3LTWDH$#KwQ^beq`cvoq9Pd(kgmv|Pb#Tq&_sf_W(y3>Gq% zrH*A$(@)pfGzrRE&!!R8u>I&Z=11&FXk~pn&jcIeVX*B0v&AfL39q zj12tYsrOz*L%?>02U#W7CnIUlGjvPu#lz+Eq7=`t^_%sT4{88RqkQz|wpZZ9JQaT|WtN@^$SKqzpj+^0x&^6jU(SFnt6STz3&6a10LXcF{kqSoU zy2dnrBC#XNsZqAA>jwVq{l33%a6bgfQdRSlj;2KG_BJ4gDIwgT%VB04>JW=>8{eYQ zQW$ErvHBo}(z^yy-P52IER@ZM%%LI|M@=tu`U|bC5zDolQ#G$#Mxw`yM9;%Pg$_#N%-8tdr>iWt2 zcMj~63mmgJ6C{4!iq@fKi%q?bR*!Ljt0eSheR{uKlx(F6zM$toX!>rqKz6^wZ>*5^TJgN_-MOzO@E-P>vz${bA_~~IbT|o zcB{?lkY1C6HHPVRNQ<5-R4ifcc5r3=Y_08lpH}nw$>{|Yg7m=ov_V>oJ`M(Q(@1vb z)8(1ItGL**#i1ktWqdKz+13u=Bm(DvQEv4mAn+JW2l^Qnl+x{uF0;y@T`?u5A?&4R zcQvFuMft(vB9Zsl&KZ7hA~w2jf5LlKFhYT+^^Cf*j_PRqf)`?^o{7|4RXK`iCFT={ z?2cDSFHRB~et{N(4J3V9EJ?eJJRY*eB~J>+s@fSq6Gy6YaFbtq@Y0JD-0c9A*=Df$znO=#e^NW=-L85nGvKy(tM2ZbGBbBkt!~1;K`6YM_g*fVB znUf0&x=J4F!~z0AG>C>LtH$fphC`@GKYQ3c0+MLQqON84rtlPO42q$;$gG@VAD-kV zyY`Xvq0xIR|M*=(>!a$cNqtW(JwKO*P>iZdNht>ComCCr^#qeM2&u7li*F5Ox^AxAWMwZY)=| zGvGK5yGeNQv(^0LBXV|YNG^W=PMJv_>!AAPrtlKPo-fTYJgx)QO_c^?m2t8X(IfOa z6n=21%^8S%-uOc4Tc!pN-kC0+AzhXAex^Qh3>}Rj$#91a3lF55PHErqHVM<1ry=-7S&sZ z^UGE(hi}QCFpLssnrRL)9pcZ4nYxr4&I>uULtW%Ts_eq!cf1TRmFj+c=q}T~{0US>2WYWDVJZ^2&&k(JT#_89#bB z`*I2C(kxXsXVNNlpz(Rq3yKK=g$#(itui~f%qo;T=a1fAq$^If(i59FA>6@3TfXPT z!Up^M^J**XRGj*L&_8Daj)QmK9oS?kpC7k84XN*pn8o~Qe0ObmsvqhBa<+g<-2CBZ z+jZ;oU4jK6l@HAP!`XMyGQnVMKEr4(xSPjM>FCo?1Y%;ce!BChm3TaN+DUIUr2^~Y zX$W0%7gi#PjJL5B;i67M7k(PS@Hk^TvC!wlZy58(H$XZC-{a0*!a4pC5{0yha2A&M z1TvSwavpfR_X3A4%g_oGq%!ZTFiC{6vF>wQCW}zKemy(>=G>S`WaG{fuCwZcu!^c@ z+giWpEWxJ21wh#T^Fz5UCnr~_{tYr7eygxwIofHCcZhCX*4PpZYV=fUuo!m_sjEY! zR%Y>d;Z6QA6&ZW-1~0}KFpqvd$_cu{@DJ{!YW5_FG*tC@pO>_rWb5tRz*}NM0ZnYR zW-rhYRoB)9fxx$@H9VLM23;UgBe$G~H)Ikf=>$p%3wvF_=U<@cVPp%8tFGm4<%YYf z6_*G{O4j{K7C8&CR4nXHLSti`a*kWl`n=LYT&-!1CjiYZ?79H^xv=~a`1?8!a6wL% zu{F#iMf{OMBif>e*8?@!m9+^K{4$|oYugbIygn`U*`2ZgAp3I>!_J8Gjs1*6EeMtw-RyKnO*Qi-0q>i6=7ST24q|P#2cLq7#P{49*X*<^{#lIQ7;QVAwdaYUxyW~n=MNf~PjIXLZ zu#T*{hxPL8l}o0j7AQHk;1*qnynJXKlzn&X^FLoZFgQ7}sT1D{BPjI7uesb0s|ojI z??_4ckbk>9j8-EENg*?2T0{r?PS?9*x^G@dS7sO{+II2zId3jQ!UB8CIe>g^kFRhO zvrO}%WVTb$Ub+dn1QOOM6GU8GbJ732Kw(%}z-PGhb5%l^@f$5a-+q)6>Bd`WpYFmxz1 zW^RK^v=*B;>2I05HaAxmci01nCMTD!&Jj0+D&WAz1DlU~oZR29rSTqjUKfFRq?6k< zkF}o4sE>OKv(=t)1G{Fk)Ith91Pa}o3_Z&GpH4kazr@mP1iY|F!aJ#6Ag^e~OY!7q zc1vuX2R?BoB=2;qA&>Hbs>GUjE6Hhl%6E5bf^Lq*(d&~-9&NaWL1Iw2m8ug&P|c(a zAC8mrvrLJr`5^)`pzrR6Kq64dDJW03z$j)6+T4BE&#Ld(VSo&zN=!{q4eXb^@NYp^%E_AJDACp&yNM!=e0Ws?QUjtwI$Nv1 zmjg8_3Tftkf#_$Qp#0X!u0lGQQaSpR$?eAtT!?y0Zc@&bN6)a8c0?|q@_9Bb-JcEi zj;_{_)~>XIU(h!+N*B2yuT{1|eUHk!-x%|_n#xR4le(yXaU@(4=luDCOi^_eZQA=i z8;`XNsB)#=X=0z^rlGAk%v4r#pCR8_2G*A+v`phzUR4Wk)#~ zDSWo+m=+L$xOWYCdtUH${t6Gjkj?o@OZdEE%jVZ=nPAy9apLZM74KcPIh*+2kt3@y zE4g}IinmZBcShGN+D5kaDl2q^&6i7onrg?lr1wQ4GkKb@f3R=~3 zfY#TObxGm^O;rn?xCuxywTH`f+$9Rygzs9J3G78%QG)5F-CERa9LW&M{b@5kBw9~b zG7BTF6~|F`m;3aajY;Gfhe1aBMYQ@wlP~rn-3YT76YpIkW2QF?y|7AuN(ncuYnnY1 zNecRP5%@+YvAGjvD=(lh)8y427$wa`D+8*MJU|flpNYQIr0p;gmonF?S_h|bq3RJ6 z8S0t{Ps7{Jql1O!bhO{=ZOaWkGAowtl6(eLf;P!=?RDZ#w&CdswQ#(FrX*TTlOO`Q2f|h(P#Z9` zmvl6`oUWWM$&By;TXqlBO_zR;O7LYgA9Z-_L%|~cXFG;P@3!=6O;u!rPM$AuorCfQ z{1%5@thfnW?A)QJ#F3cn=vN8AVgR~`XVpz`wVT-n)*>0O!{g@0>wfLwaJ2q2mGrWU3F*3B#gKzl*9uF!!Bk16O~`qGTMjZgG4 zHWa{*D{aO0u>DHgIX;GR^HgsUl^!9fr-@@NA5`zNyH5$ph91WGDL>n&WsFh|@x-t3 zwC;5Co^+z}*CdZjBNfcW%J`r++S1P;PHb!(8DEf+VC`x`o5`WIF)G z5}zWQ&&m(r4u82r*8~$%&(PUg6S1fDWL(H{Ye+Etm*b__-_=7Rpac!H>Fo&EQ&y8T zzEzeifNW$d#M<09j0z2S^6|s-il?Uvp=OqZxLb!_>7log(y&`~1^UBiW8=6Di?}eX zmr4S7f$7)08U9#+G}Jt^UlR&&4$i2rLpk*UuP*+3788r5We5;0Wl5Aeptv`_>tpdy ztbi1P1}gf&roFc&p`decv;1{bnNJ zcWKMZy3Iw)X`Iux|4GV&yI&Z>T+QgdT}-}Y_zI~(A3OZ}iF9&g3oEGWf~W?HsqKkm zWOqCicm~0-irq}o@vOc@(s4X95)7fV3R3Gu+O7B%ZPCbXh0bJ7zOmzw?O@Q&&(95= zALMO21++S0k3>5qr#^>>{~my{ip4MNt5?wl#nI2xCFx5?f2P?8fK4N9R4)&B89EEO zGM51URvutbSAYzl0NsSOBB04-hBp^}c|+~fQk-3YO^FH8K??M`z#+=SlCw(v_Mi3Y zj9ORk4ZSyuYHk=Q%<%DQ*T(u@q$?{dppgw0oDkv>$usJTMQZn4%=jrAyXt91m#*=3 zAr)KmJhgFQ<35pcBl*Kk*|RoW>zulkFp#2N5A5oR2c_x)Aww3vrScE@A|@j*{K)3| zYV3{yBkDy=Xh)!YEXsov>|t5(#!-$WQ}c2SR+h~xzdENkpS6tkO{ecOQ?I`35S7b zfql%WP|e3XFdI6EH9N;mW^p%EwX86v=z&XBqX$lM9J$gw1wRAGcf}PT8MP;zre}J{ zH6kLHzvQw`h>dQcD4Y|-PO3_{KPTCcC~Qb@pweEctb%K z(G!|-X$Lpu)kV{?MZ-LwVxK{We@_xffwtym`Bb z-8M*|#k}*H#K!p(q6yg9c$+F$LR_B?UufI0hWut@G)oh z*URc7V~*pNB5cOGj_Ad)R8UxW8aJKtdy9%t*)k_Ao6Gj`Ww>kKToeyjZ1&{*e_Ah3 z34)kbVx=IE`2Q9@?g~SYh)#lP>}&peqRbwgb*mcO_|L0>Q0_D)+O?3Zk`J}e(Rzb1=O_Q5G{;7+kHmE9KZe|! zTAuNn3t2oI%U_;1lX@`qEmZEXn6!t_bnx&WG|9%3f@X=6i?U+u==a=NK;xuwNViijk-H4u_VZ>WwROPS%nCAPi@_CbB0w|6=68zK%w!OOJ5 z5Qxe*f`?;|>X)eh(!DuAqk|f8_jvueRK}J4osYHoXL%iG+9Lwn!1pu`(5WFC=%wf1?sqSu* zmf=JMA+wlLP{s_@(^&Lcq=rfaZ5$T;d^Qc`U=1GFR^G%zFAY@pKsoiUMviPBzyc6@ zeSa)xT4T75wL9i(s{6f6%n#f@!(g$NJvQzdCPoUnb&6B$wk`Wc z3-&IGK8sbVXI0mFi^z@M2@`stt3J@}$=ad?#AF^B$P8fY2^6g0-~K0s&@sY_`8AcZdQw_X)vmRnL2}6&FeU^Aued6 z`DH9=t}nCR^H)dpE3>#g#VOJWU>*Px_qw1ift*X8`+WJgAyHp-!CWXIsf^#TLMT$w zEwGMGQR3`CPolZPMg(V^f|f1K8;0?aLH;(Ju-j+w>x+%(F3^`Cj*)tf2RrNiRcThu3^hCsjvF=BnW3>Vzhd0pp?qD(Q;HYW(bD?^&?btZ_aeQO-s^ z9RZ!66p7LseCfYYYNqO_kAR zR%mHj{fFB6g!;I5RX<3O%n1}#!FtzrcgRslC9h$~*PC{i07|y8GtftFU2Zq+Sa37l z_p~Oq$>trL_fndV9_XtkxB~kC@G>$#^P9%k5fl=#F5zAauFpy*(9$}FP;q?kl@?{q zF-l>ODcnk%WW`3JIJv%7gB{YiN00CQmdg;O#}B8Y3n_npcUrn=2e#5LIt|1Ueii1b zz8KxRpNFja!l1zG|GUbzcHKiR4M-rmKy&^-JUP9fn87|%V;GhdXACll5k?l*AdPWd6n zNeMK0Fb8+8X$4ezSFdx3bj_SC8in{&NnvWNboTI7HP% zA%YPO4%aeAMNNb>xO{tiiL(-G{K`CB)K1JF2TM)liCU;|4I#c@jd)QCDvLccqoOV0 z{M_b+UfVfB87irRp-}MfGmk1QuqI*MHSw0GeXdc|z}?~o1f@+&1`7(E-u`#%WT5>| z2d36KO|P|NA$#32qpEewi;*nSU>ZC#p(e;=O?rc} zJ~L=H?YWpLI3di)HsEXdkP={`a35b44;aOW2QDYreWby+m(UL!wcw6k!4YF@y;>vx`Am)c!*!z!H>yqz* ztT^vg;tez|xiN+Rld=|^n(infAEN4}VK0%Kbu*?a7`+` z0IzGMVF!Xt5a^BlH2~bc0J)-T%o2!5eP2={KZwYHOsazn#+IJ_-mb_^ug6H05i|~1 za}`oqnhbyQXKCFK8}}tPG_Q@M+C%Fjo7X*rNpW^f=jO6hlnL{)`3KEaiY-H?4)_U| zma`E%!k2E<(23H?`l;<B16@m$90t|hPQT6)m= z+C31C!w4-D6Sbh;dGE;-HD`}+UpHKhsMt@ld|eJ8-F_cdR#q++Q92m z4BPh;j^?(>@B%;kqU&-}Kv%}pcF08|U3i8Uym0%0-EJWhu$;qu!kIYym($d{Mir^u z%7sNwpAnAq;%~}MW|tt~{gWRp8LSxlG!W-zw&X!hiOG4ouAR3MpVinzEP&6`>pb%} zD-PG7W-HdYaglaGiP!o4mf1BO<(=6kLN^IF4-ZhjhI4Q7Iq_>Cy~*}%W%$3AG!ZU^ zO~0o5Yy*x)!^)VjbdI`b`bL}}q?jl~Uq9)R zB&9%^Mfjfd+VDD3X^*ji)ZAKqBJ8l<3zQ}=m9t^MW(8yepHu)H{WaxTw93~Jlix;R zVxya*Oq;~;q5huW{zBKRiHh42!J}GZrou5YMu!6!Xg%>PrZy2jlJp4w3uo(3nE?(a zd+gpdtd~Y5bkW03vu>`$q*XT_{CxU)_n)-nNH*$Uy)$T33cub< zQ}X|@fIL8)w%i(z;&g+i1|P(<^h`1(sV0Cg#X2z8(VE=x9NgA6NO$## zHDRYYyW8`PCH|DMZVcH%D_XK^8q4wpi+xFXNz4&@dhxf7!jCZ(+&9uu`^OWlr3>R( zep4IHq@(%#@w})G0LHv3;v$}LJ}{hO0l4d5e;^G<&%5<5s5(T)Ho;Vnb4&ZS?U?pK z2wRk>eE(ub zHn60mjp@Uvl}9^p)xg2rqnXwrpol<|HKanNRYrwJR0WU6htaoD!MQLSm@||8)-TMtI#}M1`>j7-t*(G?ck9()xe3B>IT57hD&PM{5_V73r+=U z5814io8(0x)HW!8Brpe;e>}Y=ukx&7v7W{LNz#YZBtU<6q%*#Zb}f|70`df!uNP>O zN1!mA@)o0Uw$%W(OV|T&`UU?DUxTQ4CbNGOfbYM5Rca-_@d_C?(G^5I% zr8v2HCM88KMSodg9`_1nT)=3lSH1OzmMd+tP+@|I`BcWFOs!;Gy-sbk*yNMK$78xF z6Qm2E0syW<>mMD|md4#NUjWQm8%=Y8d%E2!=j%x!C+~tzuY{;RYeOmeZEDw%Qq5lK zGUa&D3U)ps=o~ias8cyPbD3u?gE?8(p>%a(i3T7}3K=HAXxKjgoVl)RheJr$*jRU< z)I>|IL*N{ULX_nhu#8}oGBV$Ya5)>QtPyKW~;Xc~j>) zCFja!@R9Jf6Sx9ZfB(~5|H1d6o6ZjsX8;$#e;kl?ciuF9VdE&jQDN=cSHr0F8au`! z5obJxbDn%0f(-SEQhw-9JgHLH*Jmuvny~Thm#Y7Qt9`dV*mAaJhyO0@Nj%GB&;+np zA+YmWFZWlC)GK7vAmB^fq5=hycQIcUJh4ys42IE%JZbI7s{BNAaC$n(ysWC{L{+_V zIvMO}mDSyxW9iQa%N3o5ecTGGq?p>@nVTardi^zRJ|+0iYZHEQK6q5E{-4C<9)*xM z$_4C;@~LSE=C!yq)C=3vXrTYsKY5oQ?3xATFi)^v1+#a|?g-cRy%T5(C>F)6D<~a* z*NEDCMixycoAH31>?8s3``z^0EYFE4_o~n@x*<_;@!p0rrJ&HDhJkTf!8aSwZ72lw zO@e9UED#G(gU-b#?bD?@KXsb~OVXB_)mg;W4QT zq-L5%7ocfBYMy$!E;*-PylQ^)J zmA;k2!ja6RvGkorBR8B@vq#wpdok^T6Q7NRqgmQ+?#XwzkTB-&AE{XOInpbV7S~+= z{2WHpqzG-jRIY?RQ91pVWczua<_h47t>hJcnrIg=kx_K@e?NF;-b_$J2qP#^xUQg? zCWbGG2k?BL&ss9(uE8qrq*#-+;!Teis1F^c^+;k!jO~3jwfhTzkx!*K5-==m==se8 zj@PME;=cGqjr$mJ$k=_!jE43`st(JB)>evhVu}kmnS(+*gYtqvDtD>j%6)xmjNM;_2R|I)^iuhB`X;8f>tD@3^a10wzmuhpGsM4pY zZAKA9VAS2NSPow+OGrf$hpbEsZ_nywkWiEijz>sRH~z9_5`dS~SKGEYt4lS)SGI%4 zCX&t~IJp45rO~^~VK>g@seA?5(e{@O-exQ{RF32Y_itnhp0i&3*;4PJ2!JSY=eu#x zN%30A2Zzg83f(yX@cAb9^#f0Y;~G>>d)z&nH_zq#$&P6QzZH%C<{+#a`w}9^-cZOu z&&tQ_9NOrW9409p4IOuwNs|1EMya)lSj(EmwOVoPbC_qf+~*1uGi0&wPR1&2Em`Fv zuT@;@6~G56Fpeo#pZ^1(BKSu_x2mcl4-{HIn-lQ(#IDrS_kX*b`y0d7rU~wq*U}st zC~o#NOb|gK(ydodXCQ?YzCLbahx9!Ur*j%Vd;pvhiqRXB%}uIBBb6i* zsW-o`O*t9SB7!>6=lS1$SunN(pZl~j{-hG4Mipg~nT0fbRr;7Ni4*yrN>mRc&d3%! zX+)1+eI9E_Eed!m3ch}72^x*n$TWm7YRe7{D!2o0P@XS*B{qICSnGFoVl4*P>PE9= zxy^|yuGzBD|3yFR?Rm1L3`yz58xTm$-dovHD73#2ZnL?J)yJI^^E3>ZxjK6e_{k!{ zn{82{M^{z|ZSw5Xq+c3%SFUva>h72pWk))z9%V-}5JkKqD=0bsTsp0eMpXe;>$=Pg zj4Mtfq;%J`tT-}{S$?a$06WmgciR#B*qAcC4w93E^0p~ADk_n}zQQgkl73TMHU*T` zpa#+m;4~rU4diwpbU)v4V)}ovVLO|XrIX5k9kwPC(lLNBFkM@15vq01g5Gt{{;9M) zfZ?K*vIKtip|uMzbqsjhw=VllkJ!bZ0@DRkpWKfqS%No?LLnWbIeVWN&qbB+U^&=m(K@{%$!dnox7@3AXbaKE>lc1rqbSo6 zj7}*vVe}2DC*wD5NO%D zpjM~sY>t9^5!@3D&5*q6J87Nf4*=%0aiN~C0~pJL4or(YAdAd2t_|lC5|VO4+D2qw zAn=MBxuPk$v?J09S%PeQSBlNzyz`0^9fXV2Op9&sI$v2MG9(mkTeBD9V&l~`OIJhm zGmA4G(iKBMCcTpy8(}F_*Y-Wllq^yeTA(zTr0ruku{VP^YLmBN@DYKy2`9{M1pp=f zaCJx-e!|=OLI98q{{k?E*lg1&ZnrU5IRGkAH%H23OY1q2-2GmLGxeJzE_tf}pR7GZ zc{CY4#9>JI8XvFEn{nf^#~-J-|B|b2M zQ6~*@mKGH%O|H8`$(6}OFQ~2SO;nb+&`^xa)1Fb(-ZYtex|3G@YK$FPI#Z3O2gZKd zahNKEZidukPFi@Rk%1>UlRRz913T)O8mvG?VE-k@=4> z?xH4ZC4uUPR++}nw~z`se>EGx_KL3x*|{=@KMGyTCrnrIz7&-4sS=clndNvCKJB!V zX0IQTRx?^sAT1(P6qZ$U-@0so1%D%Q;MTBvbSlbW_$V&(DnofF>)Lu+tt8-864Lo? ztZrO0c8E^O2fpO;{?$y>wUhEDAI|!u7t#BEE&Hvi$9iPFaH2=?)ffggzlb1iHXd1OpdQyzP9r{rk)ckH~rNcY|-b^L(G%gAb!{aFX;<~ zLP8>4*O)nl1U`Dpx*7K(FBDH^26*-stC{R~ru8GuDQ`NsZHCAKei3E-1`nKQ)MO;6_XTi+uI6^%0`~hqRh{%EbcJ4B-v>2;Do$>Uez)G2j2?t~ zxK8$02%imtt3b8B|I}uED9hDFs)YlP@P*IXD@HQ+sIA-ByXv)SbkMw$wd#l^NF;z6 zlH{cq?;k$jr3zCPyp*WyK5`s=5&V`W-?#^fqjcV|bTq>bIH;S(+i-z_q#5TFMqRe0 z=@$FcT>yMeWXV{-q>`lwQ2H+xY3%)4^n4r{y zKHs59z^wMwE97AMLF+;Kc^?VUZkj~cv;`&IfKTtKhyz#}fmKpVXaw9{PO8gA9fQW4 zLPZ6h@4e9JMwpYHFI-U;7+{iRd93ILH7$!SHho8W?TX|5H8Ej~(FC9<$SV@3QHpav zu9Is!;8}y`H2!Oz`VV=1<7$H@>Tta>KNJBoBNcKLvJ>852IO*V;Eb@*dW~W(LcaAC zp(aBJu2msf^Y-Dg8Gv9Bm25|<$KS~!;&zDlREQm%sfdtYOsOCKE7;V2CM9y^t4Nu& zbSxEf+ePe!*!Y6T2$4nLmx~xAm^k%YV7{HoeMQq6CU8&#=^Ye#?w)$g@9OjRf6_JX z8x^Uj<1*-5X@d5Amm)9w62F}&&eciDlC$|I0a`fj0GN~eOzu9A6;hsQ%-Z5~PS&@; zE-#==uF*-=U0*5!obf(38)uoArKCCM_htRRW-I$qyGi)TXG315{lCfUgF_V3b6>@FvX^ih#7Q&ZoX zdB1FAsiXLThYq8mLvcf&-Bz8dg`G0=GB*Re0~F^7_I}a;NgxCPB!PG^ApDf!za-%m zP*8&3WSdIW-fo80Wt*B#Sn4LV$R85%+pT-CH-TxmTL7M+$V9L|^y%0R4qkVbolV8B zIAZ$+KXv0CNw^udQnPTM6QmBOL*tl}Szgl$s2NJQxtd)?7j$w|;j(pahntTMOm;f@ zT{yPR)P z=t=zTp((!q{a|47@!~rGePqHY>-sI47mIt4LuM{Z!KoT|-a_N6p8pFbPB!tu}Vxntt~g zjt2~l{Y<4U0kcKSr z`F;tWPizV$ZFrDfi<^qRTl*$v;YqVMKK)s)&E*O#vIm9%t_q628t{p{C^10t{VoZ*vWiR)KJ|2dLeElix zVDuBvUONE!YeIdoLZFYN1lxCrkb41a?O$(G8aZrZ`|CZ5(ndTD2Q;UAJw5=nF>wB5 zB}k6k&}iD3yb3>BT(J!%7$5@p#I+45b!pSp?&-f|MI%!RkSovKHPh+TkrGC? zsp;qp&Qq@lA3<5m?xF<0Mk@od5e}xx$=ddo{{hQQm&;X>32StRF%n3;X*Oxobs(Zz z7^CrYX15eb3^WnI5D0*iWJEnqnY=#F=f0Bh_3uDi;gIZCY6A3wrjGP z1gaQDBO2YjrDnjUrK^?U@J19+9q9#9xo(=ZBC_5+6pDI86)ntLq_TV;I@hoZSJVx0 z8=Tm6+1|{f0U9Kv*?|6^M%P+F(HiOh9yd)n+ojZBYOFF9(P)^};`S;CTNi@K)s(n* zIHj;L|GDyk9d0j^9HyHBcAxNhb0^0EgqRirJ!U-fc-*C(ao`vPqWi{OmRz9o?2I~^ zE715RduD1h<<}h!^$Tnw6r*L~Z@cun$Gn5%B~`>0%#Dr1+=NUeLbLdUjCCDO$E?Tr zbOqIv>oh_J9@U;9L)-E`-}DPP0(y*ez6(4#3j=`M|&euCGApjTB>rG<3*->#syn^B~2!%Zx;{r3@V+BZLGkl zro2L>X0Rn=J6!r}Fj$_typUfAq6@i~L}`69lAy1~l#84+-KPs#;<*a{2Pa4_+lz|8 zbVa=xkdYLGf0Y_e9}KRD%`*X>?Z2Y*#TyWag-Ozh*0MgA(P@ID`=n$Xz*r7j-HWqq zoA1a>UaY%~N^a~=d++h!oSjIk~00@l^HRnPZ4#_NhzhN#WB))w6dD%lV zV+n&YH-Ezm5ho&R!S~Dx9s7+zLg}by{_zhx(K6Bzl&E6!=90B67wB36}0P0?PC;qHxgCAehZhXX_|^urSSFceyvNRGgWI$ zWZ>cX>KGse2b)7ro{0d*^0z%Yk3C^d)TN_e5xicjx!U+n6X544Y3FZd+4G~=lFj$o zb+tdWEy0RP&R5swGRI+5R4)X#fN%F)eb-7nkQxMB;L5uBgx<|oIIf=2?nOX;>DJge z8L76}B1tno_iWZ4Do(Hje^w|jR7+^be z?!N7SNetLunmC|LE*}h3$$cgd-u*=-+!ZYPg1RXfb*N~uMXU%)lip;iz8~zWccu1j z;nnsLq-!^Yg)Vci{`>WH{tq*O|1-x-T=`x<^U3njK0bdM7<|f~*e*h|eLX4d#Il?p zX?L&;vW*AR3d(4e@^$}u6C2-t5#)XLA|)wRYJhQ*;YG<6yzR^n$M4ZN#nC!(B!@08@XNUiuNlxiI zZ=W@_LmU>U0Jm*hAArfFV6(9W!C0E-lh}dnc7Xbhl&a$Mdp88kv%b1^{>_wwxI+vKu?(jRMApaROIx_gW@X~JdzV-}as4}(pR5FT(x%UL^ z4q?(_pg;bgUzBy|GLE}EvcDiD=RY&Xvu}6pc!UZFo2WdgBoWg3hk?IiGJi|JM7x`8 zDY#cms1m>cP++2@lw7MGdvO^yHEg>Dfee(OHA$a$u(Ta#@ ziiSqNxHh#UC+o6P0p%-ZUGF7FEE4*9Il!%~fc3!KQ5tqXK3qa0L9#_P0+Ur};dXW} zvCS>qEV;i?msVrwgoFtUEHxQm7!Hy1w|&2l&nX7bUe@gH1`6);vxMy2{EsXi?PVB& z#T0#*9KaxKhox(+n}EN#XxTe3D;_gzWN*NHebwylY$bchuQR=C)5LF~u_l&A5Jb*> z3?*N66cutlV2IVnigr+3duf)vD4aV;lP<1J5{eem3jSt2=m8 zN2iD4ACl|=T3M8RM7NB`{_61^28fh&{^X%8`J9LB0_P)J390nt*?4k*2DJzKlmV}0 zXp&W&zg*qolYBZ$(?hz_S>j05-_$-@4}9KxfHyCwtyG18=K!Mmot-6 zhs#;mi_mpQ+~>{@k1qnDN=c`G@`N+{^qv~ENsyK{U32fk07xxiSMe1WS2BpA|7)wF z*~_4_Ic<3j+sn7^bf~YL+Ir3YZC^16QHJilHrQ5xUiw!o+tA$|z<4m!tv8a-_Gh}= z2*A|ijTtO}uU`XQps0$f*^q7CT)!XqdfVW+^NfWG&!SF8#ncV6!7us0A(3|~YOV|E z*caT@t^AEaCEx3;HY>o)SDQk5pD?vW1CI6rW48pz(fU|ox+B$>X@M4JBk(OpEaqLV zt66Q-o(}g5me1wNIKZ4w7Piu!GLfb**|WhffD8YhHq>JPHS2y02HJ;GwN)s@-%!Ne zzG*MwH~qXDc#zGzJqD0^Hj;lhKYDg}2>0KLV7K#gYRJEDB6Vd0=?G1wlpr-r#x}~0 z@EE)O;iIsp;xHC$6XC<8vhbsoBaPW*^F*z((yBjl)U|Y>y%?I;vVWgR0M}l}b^1EO zN**hF>Dlzg56(3kC%dd%@6n%8HAG7 zlFYx`3%o`gj$I?GV#6P5tpPl0rpbVH_8yuyi^4#Cqd%??X^8$)TJR5tg^Jtw$uLeW zlpHB-|NdaUh2g;fl_vNXU^Em^6OuQ~g7luGqdT}vf2J1&Ugn252i}e?d{Hy@6&+1U z%UUFeFi`~_+@!=VKrOs?;lk{eh0C)NqG2ym8}E+SHO=jfZutT3AV#)K2UOQp*>Kh$7VbQ6bTfl6s-x?beUjZo|Xv8B;;fiihvw~bKvF>rx#$Y zL~|W|lE@|FUrM^Rmy9ErV?;~UMkLmThkRG|yp#Zc!P9+J;N_BE=fKrN>f3I1FD#GR zo2Hx;U*GANzMw+)?7nB2mz#^{B;u-{LkDhahi0F%$@@G2aF-v!G*9MAJybsbS6tfw zzJIN7cVCW;l^VwNnpLRK91u_zb1^2s%p*v`J&L{XgHY4FFu&v*{hvT>@!i2szG4j7 z3D=uzI&2r836RApt8879QXh0O3y*6u(a?W9Q<%1KiT0eChYq$xY^nE!YuH8Lvnd~o z+9i2S5}?7YIF#wL>HMVf8(%M`I!P-=l)!}B8dZ7k2~jvcvP{sc^?XMG1**xJDkEW= zck+17&{OOy5$jS&HnjsYXszRUdqC+|=>{_JM8h&Zulb1rc3K_GQQBu2+spXRL4bJ>_W z{W(tBsfN=`9i*XQ0Jn91@@>}{EKj_`s#~ox3VzADCSJipHmubRUE4@pTQN2A67$D* z<*P#c9P-zMjlCubli7Z)C9MM=wAxgF*#n%c-RJo#?xwKu`@pIFHQ<<<<22Q2wY0}z zsI+$;dNG$A0h2Mr4P%5rZ{EUAN{Xm&#u7z#h$P{k-4Z zU5a4$mRaR>KwoU}Jj!lSQj}NUPy~_!{jQhcv%sI&vpZwsZp?8m*g{WDq&?mLH{G+<^a+yiR_+a zPdl*^jey)C4Hh$jFF5@Hq2yXQ(hD?i1c41#cRp^Lm?>WD|NijfeiXT%o(+Q+czl$q zZhB_#*M;8i+>?*x_OdUZ^S=BpHkRbO9GUG>^*pjMA4nxB^rSINcI#$zcnC1~ z_8&s|{}K}#0dk;o#!l4u?96#04}Ab1QMjKx;IUGeSbiJ5b&97r3TsK}q>` zawK)h#n?KUsC1{pm=@n1HLeiL{eL9{ujZv;zv)oC zPm=rv_dJC47;MEZgb>v5=mqd{l`n$EpEVtwJ}sp!M8$j_n1(1*ELICI=2zDg{CZKx z9%x|19i)XjN+k3mGd9Xg{N9IVG2cX#(>k4&Iozj8r%jcY&gyP_O|=mqvBo#gLH3(% ze39S(wx?<|6YPH-2N2-@5Eal!_a{J!@tD#Ek=68=`pwBFy!*@8cO54yUO{6`|A(!& z3W)0c+J*rM0i~o{I;24b>24UhJBM!RQaU818z$(M7LjflT0lU$L`wSI=>PY8C*KJ$ z!^z(FTKBcC)xm@gfB;C2+OKbcn9Ps&AJ1otMU9K0mVO3e$h3HvA>aK^>zOrZ$rRD~ zPfspE)~G}|MVb;%Ekw)7{Y@eapaVf^Umm;9{amv^u>3gHmZC>4NX2?0^4va4+&CIU zA^=JnQwOSLM{q)D-U1nl*KV3p`bBB;9a%pg&4)< zB)==O*Mj}@On0e#l8O>j8cMe(T3mv{!>{Sb#zRM>RTJc-p;gj{Wi}V8!znvzt|slY z$pe=I{e40Pl;AB!in}%JS3h(`8I|)Vl7vdD|ZKS)V>UPIyN>J zBENoMaJ5&^$lTr>_*iuPC{8@-jfyobiHPjA)uP>F)?k9BfwZ8VWpr!i)|gECBl;^gJ?`MaD^qRT3DjL==rDlRYKT~gw>NQ?yNBIjJw zfq&Qi^|2>6pTpwe7YCO=>rNyWjYqXzc>eT}xxGu!vn1NhaF}A4)nS?rmI2wLT#WK0 zLV9ry)l(I8#gHT(N7Zr!seocaV(h7>8`R~%p+~DQb%nGT9SCN|C}Ms60rCOj@__~q zVaksEnm>RY2bdS&!u$)sljfgd(YOkYFU8=JN=6T^1EOz?!UypbF>>)7@I+~^VeD|e) ziK!o6$kZ*uDa-hpKlg9x%3Eza^z@ShU#fNuP9Cj zO02-XhoW92k%FWI7C}hP-8d4I0rc@m));7G8X5WP&3LW#Sp)3xZ&+pjvqz00cM^k4 z8G0t{g8^$%DuIBs(;_c>DTm6)LX`7k-N-VITbo727I}Bn6O!J5M}Y znvqeo5Wh8+K9L}LDL&;@7y%Ie7RRA+3xZbDDd1>NL4IUZqNJvpabd2+x0XE|`RxIT z%O9nF=ZCo$4{AG)ytRse$r0q_pJpc`S(wXcGW0$7sQaY`5l#A^;85x`QpyFL;6Cl3J^*~vDm44Vi!0p2b700w}O-AdF$v|vgfX|ZncIp9o>oA^d#0+!#PZ=)PwYSFw zc8@%i-t8Yr9VDJ~oGF&k7t+>X!-|DTFv{{K4ZL!_`x`ZwN2-h+&Rd02e)F5QRvZ3nx1qONzP zAHTb5E_%-;0vTY2y`FX*6n}YTkNlF)wJ|3ifqOBm$?+&?r2(fbU_$kM2kApMbGGZw zk#%jbpXU3*gznx8hY=M4nG&gSa|~!A(gmsHSufNf?%@yoZX>4HtC%) zY-a-2w+4#p3SqksgIH`f1Muy>&`CsR(_!a)0oWjuZIq9-8yMHehvY?Bsm{FIc0h1#GDs${hj^?D5nWpM*qJ|GIpmRQ3+5wEx?yumODBG+zUGQ0%x~}e6i@; zX^5!TroJt3F=~Zx1`>b@pt5oG>h{YS&XXN#nT?yIsWKGfGI=}@dnOR({~!-|HbBt6 z3>5p7GloT)frR-AE6YY1-}-xrMWVbH(2r~lRTr0#iHSoRVAZgeOqCC%^zNH3mS?H~ z$0^cM6^lNQk&(_V{n0K#`zdsM2Vf}8KiyO40$Rg}En&~SG)@UCBMfMEO|%t9YEfKgN@e-4H=#762*vrLca&D~J)grv&F|2i?yEq)=#%j`M;p~|(G)U(D9F`#;3_a( z?rxC1suKv%s8<#~3xv=iDeU_eamlFvROd;}=#!$~OajxUVzKRBCl&VgLbV1-vspQ{ z`B_Uh1EGkBMF?yDAnDz9`469G&HQVY641_=oUR0~CAg$RNi z=3L}x{M@jZv{4w>?Hd0(Hd#Iun8t}?BZ5j|O00Z=C<>2A*gV(7WZ*^$Y_ARQnPek(UBdPUsM4kaso7IMW4+ zFrHo$NW3dR${^3WO2SKea;{yZgMugoL-((v%g%hm}4-0<)ri^ zSdk)=jB%lggVFowkijO#5jo(D-SqPNmZ<-CH?H@YRPCMa7ag{yLDS4!UAtxD!S)l0r57bDoqb5R{d z)#(rv05Vez)(HO6T!H#;O*|CdrFXg{PW&KmuUtaokCec+Xd~C>e9q272|b z4+MlOuVWOaslwR9>!o^^&3D_Yj_n_6(fQsuDcxLXz7lf@|F7g_|3`*KAP}ETns0JS zopjVe#|P~OfEQCo;8T2|pXY77>zXb_6jtF3zK z74cw`nmTVLJU#}k{fQr@`;To@UOe#{4|=ecvT!FCAb0(Zf3!l^rnC~~km~&QRbN;3 zJTfXvq0`AtrQymg85Zv#D}-77||5oMDRryQa~Fnmsx zHy0IbC4FgqP?+I9qfs!xV;e6?Bp*1cF<_reRJ!lW&c>+h_QHY4;r-))9u~HU+q7(x z4ba1x)t}iZ{E1$Fb^FWX-bzg9d%wOh+f$VYujuJYQ<#6n)^-XcJLyuV(~IVP_207KcFa}`F)#k z4a%twqXb7p1Z@zmpkS5iM1u-6Rx%ULRo*Kq*eh%A0WN&M+VglGCm^+`C&?nAh}zvv z9nJc`n_VRm9DY?CsJ8UCujL^l>iz5aB{W+TBb5#x|6~;*@wLKUF;^*9hSk`nVX}d- z*rBz~K{O`|)}%s!UZT8WX(WL#xzFXR<-!pk9mYd4 z5bDp>X*KDPVyu#(xc-r_zqQFWP1GHi+nX!-?K@GD4{pgrwE9gHzVgph2$Qz;>{H`+ z3~+Cr8&*)!?t&_Tln5T798w?3&uLxbvxAk(T*D^EZgLx&+2BL$t-##{H50e9kB99P z7=*_x3?5MECsN5#hWCogwLGqQ^3s82)&5rp0vUVJEQ3Sm~LkW(#nmD5B>5Q;tezA+ zhR4YS>g;Itc7&E<)2vcNz{^dm7js8ov1*siLSLW}S_%y`cjA30qirJTv2_1VD6edP zIDv=s-Zx`6_Fo`{T#oP#qWQ9G6^ilz0uTBdDPN9SW?Qe!U%HYhLo)fXs@OootZqn|;DM_?_-pk`~VSu z3&&2$b`=v>BMH-n6iyZG+c?1m3r#AfkyQ;Un!Ih^0qXZ}7Mh;Q0AXDFne_R3|Y#e>5dYJ^CmqT_jA7L7Wfew&IZ$$*CA zF8X$;woko#fRwFQB;mxVY)1o&ym%_PmQ;qyG&U{IKfY))ph=+H?U_}~yX53K(6&8P zA(WPQ3&`8Xc>V*pvD=+3j{BbVmk*uT|5!Ipsc<9R<4^?!<5`)n>ZRLhQQiYekvoWa zM|t&P&&g56H$m{1iqZQ_T6LN>a&*uB4&7e)74gsvgfa8+u+?@^d-iNEYyA6+7ZqIK zWsIWh^2wxb5htCt2CCMp-DEt8n(Bgx(vVa-!k+<;1$4%KQ}H26B7|_VBLHqg|GL8z zsMz5kT>lsw8yuz_V_^~Fl@cx@2ikg7f<+XKO7+)atu)OJzrQL`S-BlS|Gy^}hy@IV znZPD2xoFmlu_#w(C4E_)SLqFfoQ_nzPN7|~HoLVqs|~>igviaW9$jPK4gKmsj&m`- z;gLPDi}xqsh$~<~e!#*bpeintz3};7Lg#ZSl@H&FtECx{V>ELHQ6+d$(O&CFN~Pcz z^>uPSA6iSok4nY@=B-x#EHi2stF9Qm*)|K6z?70wNA+M4Vf+I%1UX1qXl4KJyz_D! z1n+<(q-g`_!TNe+_(k#Yt>g$1U_Rw7qW(bv+P#H7^b-j1wh>r!XP;3x&5qev$XB+i zS}EEs5{G<^{a0#*Pc}z@B-L$WwPy`I5q4>0;Otddhoh6WQ7ZN9r zWkk7U=%0*F3vnc(REcKYT8B_FL=80;Jwyqp_#cX-!~%EzMV0>Nq_K5}eyvJDH0IJ- z2pu)QvjLT@B1R~$2%gEnlE8t1v^<)|7zJ(jch}WjhpitwZZ_s1Bm2WXOCH?`g)brTkCRX3(Eh7$pkz zL3uiQ($)h!sM{hx>j2wZO+f z7VBXW9&qkIV?W0X8KG`3u`+W zdn4wtSJ|KMijqgb*LJaoYvj445*XpP^Atdk+7o+Rb)bpEa;$Ld)x{sJ&iJT;{Ua34SRlDnGYBb^*3?tEmGCX(yy!qLGR-furm) z-h`p6_$#jL@Vdh{QV#(5M(_5sNBRRvq6mNe;qHEaNjre5e}?f_$4r&w2QJOms+5sj ze0)=T++DciQ`{%*xO^x5Bd%mp=$V2e(Fo(~y{cWXK2}Qc++OwF^t`b##%X&{nngoKSzidHJ%=Fk=Iew#;n#9)mhC0b~5xjYOk_#|CwhconW?dfsa1ta&uMv z)O7sGg*j7zK`YI>5;r_=f=ayTa;DGBq`hEwR%d#j?EO|6B zl>RjlI=dZIV8lG428ojY5yWT;kM{M9Id@a;+wMzwEhO~juWpXac}1ILs+KXlpIu-v396YspR6^JBhLDg zG8(J-?9J(yttQ0G=Ur-7CHt!e;@kv>i7RzvkNl~rt4Cjuc)=Dzw~ncX4wX<%kZdgP z*qZQ=x(pzvpI20OaD2Z(aAQAc*Pe*|nOLLZq^ZH{sLbqb~i^11trq|QsL5C-=mI6|ujiA(q`j>}P z*PU*|K!xS8lbqU${j|-4=qSTVA3GEl>m$Blh1Jvup{vi-zbGa>mfz$Goy1a&B{ z!4joaT*>?B7U(Bd^F+v^c%O-L#9@kmvOH)*YN90ZNWgBW@a$CgSn=(Izkhi~1g!8A zRJ#pTYQ8H4N(=~?=zvYK+}hI8c|3Z#>nSgB;*j({`Qw;19v;8BYk8KlHdDo?*CMkL zEB8Xepf^4_2kPA9_zucTOpKUb%Q4us$Oq zw%}t{x>vFAj)(2ZddX-?#BaI!nHZr;ijYvGn|&Rvo`PImux5(go|@B+eMf0?`TMf7 z8Ih2tZmv}rRpM@h(E4Y>w!YIr6Inf9!Vu(2mJ{*ZhHkCYOi=dhJQR3vx~)cC=9}ET zbkXaw_tAi4Sd@wIlWeDpu%yhyztPFdj(J{0rOLtf=!*7_v(fVcJ`lqw4*ie%uPJAq zdrWNE%hF2DE$B+JAQR2%`5 zjs;ES!0AenMj#3kj~e)=W%EVro$s+x7vw?(tON?;_#5)EzEq4uO7fh+t6kWtX}c}EWql=-N$ zAFeVVxzMVvq-`VaIG`Rsr8q*y){d6afQ&hz$C=HmMgPPk1yRsLMQZz^wiLoI^kY?& z*g8&VhxNy%BN>={&py@+CyW)z^*{-dk!~aVNCMrAxS$%XsK8#%6wtUN?CJbgi@p37 za9a;>odDd6i4w*TdYSf9FS3wUJzI0B!$(cfrzgXG1-JOZ7~HM~+iU%qr&(8H&a|b> z`{Ki+0)6zE)|I@u9HBR#0)Cis(aZ%ddF5Z7LVQdbr%XbnsRRBb9UU0oEmK`bKJmKz zGZ-~TxwF$Js`W@bqjFEmsUxd~moUeDrco3T?|)e|GEQ;c^rf;l2N}cMvu3m4#Jdy5 z8PQBu<|?O8X3f}_w0UM9$i)r#yoj72t9bV z3cmdoX_~M6@LJ~Zr~!{sVS$(y!D*!AOzE+~j-zX>x^J~ajW0`xV;i===>glLd^XLF ztkih7;*w;u zq!!EqBfvG>7Fo}+9#tm1o9wYm$Vx*uJ7nkyAunhWZ-~daD4zY#LwP?>>K~a_1 zZ^-bfOPKto>5=t(Lc`)4`q>VY7>PsqA9$l}J#*0muFuEinh+7(hx>%3DI<;gnXs7@ zox!0EJ{2zLI}}KxN&{b>;wCnU2uf;K8WR;xS`&4Xit|t7!E8sxfK~+S*pMH_dj=8K=OL};KK7#-b^CWjeR9{mwRuBT7E z%!-fkD+nxBX18^9mxT4H8r_%3S)*6z2|50R9v-`V2d8b5(U$%9{lT}@UB5i4?jBAe%UIjg@D%S zm>~%u_<7@gv1&hMelp3c72e#VqDcn1{Gs=5>O+QxawL2#9x@p6OKX=rw~Tel>s9#V zqDf~liwtb93-tr~yWX6_vG)d`zY3<@_VI>h<&)h~8l)k-tyW7O_1OB`W` zmd=1{rJ0}H2H{tZyI3xT`lGaMbuw>x=sq=*Mt`w&lk*#~+v$IFJD-1-X?oRb>UZJ4 zd=iQq^oxU}qj!ubDV$mLDe^8ZK>R)rwjIvz@7TY8O0R&!xWVtmoKi!B$VHqs9mz>Zam&v55$Q{GyPDiX zudShmS^$8+(ovV^o+&UDjKZ7?{l6C)(lkU4FT|l;64~0fdb_mIOk=1) z5-9T8>xEAL>`&vLKl5?}y^pR|Ypbgw{5_4kYWdDu42|_KH;?WPUv(YF0~y7R`*501 z$7R{ymrNY#*vreCX++Q0Z!sJqu0Ho9>YXXZg6N-!XG=It{xt9-KYu5xMJ~H8k4|dM zs7J4c1LGN12N2Od@>PkvbGc`oTf2NYw4k zijcm`B9s)cn9@JLoVKFfoqH+e2d#fG!TRq45mtOb3X_c;5I<0kuUYn|VYqOn)G+Wg z{-{_FXU2_nX2}T@dqORkGBRaX`u(l@t_QK3nXm7sbnpGQv;Gk}(-&}%w#lbwK1+ea zzgKCvXj;!c7mCOw_yoFS4=mg*jw9X~6s9AM%v==C%yZNCpp=l!T&Y8b<1;jsLpHpJ z6d&QBoc?H!bupYU0IgD6xn?2TS)HSP?n~0#V>65ZR}v9r6wf1#i4rs-9`XI@d(ucW zq|W{zjmsZ<-&VTJcQ_2~xTyXUkC5QBMXN3TVcaiaFNn82Sn1%pcNe^M*yHprEmEXE zHcx~vB`)ge;?>N6x6^Km|IgLP;OkdG9-lb7)?$3x_i|l=uNQsVceR;*?+Z88xi5Cp zOZoW?hxRnTplRI-#c<*a6JYU@MtXbI5wN!qVO@7tm~36OQ6?LnyA%mtNBcAz@+_p0 z!+RB|XkvZpwN4o;6p)qZ+icQ0X_*t*Qe0)aXU-^Jp2FQw4~nNIb-hi3+PT5VewC1c zJFvqo{wdx(@j`wF_?o68fPKI8|0oYLgc!94C7ib#`SCYFSJw*7->cP!=uf`ouG7q^ z70NT=cX#5}&;2pxqE)L*pb`->5AD* z?=LKFrhXl;jmXTYchabVAkp@@t($Z<-g>GUKs;o7&}sWn`1L|U(zH>_2FZ*2QhK4Z z_3O3 zu{qNS>OO{{mP1XhcJw;H(@t_Jcwc(HDUx~K8c{!+(L&!c>Sftm? z5t;%5g;#H}-G}t&>lCi|S5yU`W|$AXseE5t@a(aw3KZF(a_7feY##t7lBv-fnzZP< ztxE0oB)Gprj-2M5ILZc*F=@jo__QXNxKqnD;uikWJQ>5wi)z!W&wI(aO8)^!!@P_1 zXYS{u{Cu1HhaHKm;FXV^h+{?LSuSE$Iv?X^`3;cj@&&7m^jIbkT82SsI#>6e)WFBu z&03CdIcZ3%^6v)o+qc(ZBjwK)_Nv-`53wsO_)1U*{OY9dKc^OL-TILfzVf=E_5QR+ z(01{=h2rac@;p5e>u2EGPxdFKyf4b0q#X!rsdj@?DL&X@WFkGy;L}2kd*c4lbERGq z|0LJ;)F(t1XhkyaCPdoa^b&c(?=w@)WO;Y)9@~l()nZOXDXpiZG5ZAp8B!-Ih||Zp-z7%JjzJdE@+gN-tH;1ks4+i*PdpPdInSUNT(@)J>=jWl`~=Bf)T=@kTV-og zmm)+0?{QDT`>#o+RRMdF>weN61LE2vs<^>|F~-kz&-d6w5RmN7L;y)(6^O z3$#@)H9E|Wl~=cJ7sVnuh9UWfV_#edU;Pajv)g2Yd0n34PVdw!vsB^VD2yoa6C`I4BX@@(c?iFa5#2+DAj86ufKI@n-; zc;)f^@M@*tt*cU{rf(*)58vzpz8F4|hX+_i@HLYDwd(bL-uE|Z#l3X;Unj2S&y4ev zeOUdE^8ChOUm+#U6Aj)ln{VzoNcdBB(@OKDLjI>oaxRyXi4nsiP0lM#Cqucq`|ZEK zDRH&AZ>1?IDS6`zE?tPd{R8YSWLBjS^0Fa~Bt1ijTo^oxeTDDh87@MlXS6mvsB<{< z(diBc0f_?PXXH;k{>txyQ!Wr-fJ2T%U<2B{rfBK@FJ@hd`)xC|TSSc0TT+c9AdQ^+LpE8LYAoE_IS^L;N4? zwx$Qi`pbjF5t#rnH@A>3~S#g7?&@oRt#6neY?##A?ybI)fP>8E3j7 zb-gL)eC2n!&jQB)lhU@mrsQqxaYm$zGr2oPRlQI+h9DURdgc7DPIveq<2iyJS3d_e znbq=JHZJDg#EL3p<+kmyz}@`bZir|N$THcJt2!VFXfm%KxB`-mlY3;S@z_Zz)D@c&LkI(qmDx;RQtle0y&ObNU z@mqQR&X$%^I+ET#K4R{oo^)4Tz$_!OX(Dg^pG8sWqqxj(dKA0&^Nj!Op1u;%4RVrm z8BpZhyM88kHTKJfC=K$M+6F7cq&P92yoea{MH?F3z_74gIu@?{WP{g--Le#>Nka8& z*-ku}=u8$33mZS>(%$cPuhd=&aFC9|CY382lxj!?5X;It{8kIc1KP;nLR&w5VLdL)01oG8Ju}Qe8XryhO<~E5 z`LEXqb0;SYi&CPL#zBL#8Sc0IU2v5V+SjSFmA~weCkT#Y+zmKJCvh}vy2(hjnM;j2 zJ$G*2V_zIDcN`DKtBGFzWDdGvWsqI(8X_6IHNTVWj0!i0XY;)q@hlt0NalrjB z78I5AJ#)SXLhGmb(`86B3t4*cq$)Ljf>9D9yu<0bN*2{>MA%LiJ3lDX z1{@6%VQE7*g(VYJew>Q~%?{9k=NzonHaJ%O>#v_%a`J}Kxx0L^Iy``HdX359G_u&m zbr~^Os`UvEPoHA`I}~VC8)zw|wd(JYNZPVJfA?XW1!?5PvxbbN2+77xf(uS_PX7~irpp0 zG2sxqK3F|y^9E7loGvQXNJ`~i6msS~0cT2ic$NkFh2AlX>vHx=bhpRBdks(<%w{Iv zcLaFxDweb~x_m`R-Oq;GcPmGUq=TNuSduk%p`o4d!kN)T$yue%n5_`+rObJR7HM?; zci(CXw$ec&H7s86JD1gd=5}y=nCpMX^V`$a%S$5$yF5EP z+rZPQuBoXrFRRK&$G)_OJ5PRh7aC0^7%Aucj5^|Z+T=L)tKk_r>uZS@@SvDo!H!0Y z1k7a`lMYaROZDyPF(nkD3~k}9!wla7PiC(S=u#%~u(jwrgUgq0=hJkl;!EbEG4U|T zyxh1}=Ie{w`15zkcV9Da7Aw^-CTr=LlSe}fCyU?;&4b=&uWlRB-45GwkA7={)Zz*L zDoYVv@J?@h@UPv?h=0n%QU?6vaz7SEEN@iL;TK+Pwi{;rV@G0T`(pcttC-a^e*OkZ z#W-yGD12Ioid=wuuMUjWoSQdxpYb9+>42}hYlJF?)kO5^0RCx*f`OJUa+1SU&R0QTON z`Uj|{c2dAKz>^%1288PxzQTjKBdskWr>+>?;qSouOl{N(8eUoLuPI5YBA|t$t*niF z*16k&6VB2Az2s|rM5EDV$gGQ0q2u;@8pUkK4gNV3vz%gYk3x3_(&Oslyw@|V(n)wpe~Crk57$jgwwHCNr^!|Z`Vya7!n(NkL)qvjW0H2p9vU~e$m0%_wtZSMvPsz3kS@zFat^o1*_SG=ZH#L} z?cqKtJU3mdW&XxQn_CZm35JqOO^(YWH~!UKNjv$!Z=DMR-q=pHa+P^BH^@-gc6V}; zn+iwd>6=}N9{;=-jwgGy24_~}i#JzTto=AGc4jl=#8%UzP~uaXne_~Y{ITUOfB!1@ z)hwp(H_F0x-Lc9hsH7D}e$JF3$uEWO$w8F>IZ5BZu1>Iy&6fZaeN;>S$Eq%?<)pJs zq$vF4N#e56JkR){=! z4K9ygfCW+G0;T8~Ojy)KqH=#10=Gjn6_+RkxQq{Wk-y}xo{nh&f14V4z~y4G;oO>b zti2;cR=ltTiLZ_vXXAINR$A|wN}u#JG#HYVNo6+Z?S;VLWpD%f60t@}73Ik1vlWFd zWVFw#t2Bbgzm;Pp9aM7MzY)$_UhLS~>dg`c*@1GGTVNFIFW^k>i&gv6xsM!=eyrzO z#+MhjU^FdQge zii@~J!!0s#wR?Tv(!d8lKKgeV|Ech{@`G?az>T|aMPE;O3-s*pA0|poR-z+M+Xe6msQEjeq~u0(&nmUSWhRVhhZb~=vU_DGuwyyUQdt&8pJPASpl|E&m1 zu(xShG?L=uX^%xDQo5=@npy;jD5(j&4C#qr)?m>iFJYwVubY%mfA&!3&C&q)x+t}{33 zH!wl?Yn?Ea7bzQ}2<1u9pbdB1VML9X#v$UJFylAY@6YARWwo(Vhh&O6!n zD7so5d&=u@DV3$^ww@1lI}N37%F<1NU5h)-k4naW?Sbt<<#D`2#1hEIUDVfZSyevCdIGYKf$B;EYx&4!ZXY2ZZ;5>oK9` z6ls>5)hVQ@Vx~A%^)^2idLVjc$WOjZ7N#tzK016%WMEO4e`VFBByjZBqFAXhrHi3h z_n3l4TZ8Cij}y+=BqgDY^r8`Z#R~VSZPIc&Fq87(TJ6F9^$E{uok`j@o6%f3~`;JR6U{|z=J=>bWgK=#ksDdX98BfURMH?_P@jQDz0WgIAMOP`|Av7)sjNvGn#uvA_p_nzg<ER7L|uKS@G(;&BE@xQ`;FqH!&&thO?x#T5H zWapE#S`*GPRAt@U67fz!mSb@l)KdX=QNA|B^y_YLRqRX7S$P8cDabM{)|eEk`r@pD;SwOkn*w( zSG|PrT~YMlS3FHGy4~BE2GZm~>EV*mQ&NSm0>_yt+sZR_JFx{7<{A~Ll#&#`H@{lc zG1to!jga(e^xmsu)xmZr>53XY)mU;H90ne2l~~vqyuWDki_r?>(|3hc(J~7Q|FuHz za@hZDxj5eLH8*ip{vsyWz^~x&UH{fwo|niOq*|jkVZlsvusPiE?b-a? zfTuOSv1MP9-nbupObGIyewyS)vJ$j!ch@VNGD(^>MF*_VCJVNHflc>{rS%RgRE=BW z2`n`LE}hI?Za0!RjR$N#rxlV9MEKENia;)Yk7ksH^W^2?0?-Vo`Uf$0>w}f{#f3rl`$Ia|C?7=*mi(i{H8k`mD7?QC$aIQ^> z*fjN(st2~pL=Or7=*Lr?K&lU=7rx}#3SgC|<4*xt7c(bD|kfO{m z;Qf-Mj)9ukjMDf(J1}5=TG~ig)Q+-GSJ-&pAKTUjMR?6;do2YPw|wza%WC42?xP~q zuTLiVm0Iwac(8Y=wC(YsbTp|R04QduZD>e{X(J{D_Ql>@UY-3ORau%s;Yq5B(b2!Z z+&MZv(JUo=Z{Y3aS$yuh!*URz^>e084^M)}|5t-ujQoU>oC?vc{+shWxM{zN1e1FO z&(?MrrogZ$mIALJJM#ZT-}USJm6)H?-VN$MEMO#g@RMBYO@}=Rwb!xy^3Js!?hrZ8 z7B3h0n@9dF4m6d`9nh>w;bFKc(!9=|Sz4+IggS)>6ErJ-U z7y#sJwVdA2*6+?_v9j@c&q3q|9uIHxZT^qWQEB35b-o2g@EYtcH z##k!BYz#JIvBlUtBnUmg>&jrNFH8lEmdNl6Q(2p#J*j&;u|ulHIG8yM{deKpn~d+) z4Gp_)*B<-_JjuUqQDNS$xO$~ca4IJsOahVatig9|IMIwU7Oa^Vy`?{PewTZ`K=O-j zv~rylE@hUk;84&(C-7aTY|ZcywnkM0c#S6lDNc&)qkVaYu*|t`bF!Rw% zWi;uP)#)digl{n+d!D}gAm+i%fI?(vs?dnjroTtLDo>y7mI4<^eTaeKs?qxpO}k)!oL#QC zJw@!FN$IcKm?*}^H}u3PRAtIe-!zJ@O(x&0;>(%~$a;(&%RMUpsjY@ok*?`~lEkw$ z!MLHW4Vi-J2h#l}MP(F@P%0`7MArcV}WSO=%xE90lF95R+WaA-*E=C*M=vx>UNsvmp-U$PyA*> z`PDs%LzRaw24SD%RaY}TNX$ah17XF3E#JIz>^?=$`AcNl6* z@(@e0Y~B*73`pgIz2LF{zNx-lcS}9kKX=nIxM8fUdf13PQncH&eC?EdKaQ(G&tVnR}jXJ!mK%H$$5vrp`hpY z(9B+CP`u&UrNn6FeD30(W&@R^nUsOLtqhqwZ*898OuDrLkVK`x)M*VJfs2(Uab-Di zpp{TH1VzcX9k(RUJ94jwCs%ddQ9Cgb^3k}eL{g_X#1rn-tzG-8T^oss`gae#hhq>? zls4!B7{ZwUkTU@NQggiGetovNs^TAI_=_RWaqU1N#${(7lhCY^nuT9qEzdI6 zz#mMs66g1{Dde>UAUSg%omh9S<>l3h7_)ehvcwBdkX zTKPz??JlDDEFoZYq;kmme@;!1wynFy>)RcE&t(Yo!c8oUx*NWhRU4VKo%t(%zQIj*bIty6ru`LwLr2j8LFDR-5Rf;`c!vf{#!Sj ziuH}Fjcl0;b*4`1jmJQ%*<#aKa6nTc@Y~6f$$omL3UXqUwxfK$f9pQxd#DW8t(5$K z<$ZTlQ(e0EK~WGXDgsK?S4D~xmEHyEO?oGEqzlqpP!Um@(t8A?g(|%TklqnOP+I69 zHS|unC*aIC-nx>9xs70= zzEy}|85;)nT$+Tjl+Jnc=LFwW{w!IFc1T;kwyHO|m06x~_dV8#gp)K2`-FOGh~*G% zf~!gCF>6N=%M#qR$NcHr#aGgYo*k}NrG$+bEd*QCdcJBr?K!78Ie~skh$o7lW`%dr z=lb{NP}$gXZCZiqRX?v(?I$(}46tuq_4FTe)u_5|ymi#q{=+#F+n-XkEr${g9(G^u zrcz4Yx);%E`}Uld>1c!~R;*^us#&=v9eWg87J}g2jt+dMV34Jzt&VR&z~2_*shgg) z%YVv9O+OgM50(-vwG`isd7NIks|My^8~l&DR`@x}%>JCB3rxCiX(j8#>*dr-fYL0^ z3=L?#LlpQ`rPCv7ro~fg9`7rhwO!X7Xi`6y@jPw{$mDJGAAqd4#kMer2w|vh$5f0M zk>BmJr1T(O?!JYnaaTwi`}$#9t9$K#*h2I!#>#D z_Rmka`^EIa7>lcGQ>fj9Jo4>qwiTP_#|-Aq(%bly0~HzRG4;4E6irSgdWfDAsJTd?e65%D+4{J- ztw5XBX){Ah+N00_8RI&Pj?iX@-^ko6!RCpu$0hG#RP=fAzTo%{1T z>0@1ebdKmU6`fn47NKIt(5yl)+B^QhN=-&>=3zf?EUCeV;I9ew-pk*Jsies`F102< z6sas^TekmpC!osE&$!m{kYe0(Ml|%@?v{fmNw%G=o0sH%sj}hGmh{v@zRgzl5*|49`#*?w>uc{3inH$UYVkgz!mc?0n{s1$pnq;@G2>W=5!%U3_G`vb?_ev zVod@+C|B!QF){Y94Hxf(4w95m&6vKPh1&%X0A2!r{Jh4M&6SHjnaU6P*?rhd(`5A} zq-=B2_JL}olteUh$y}ewXM9D5F1VVNgG!{Nin=+5P)JoFlK_5gNy9!KM(I%QTv6N!fwJ?*53)cD7f{AK&65Z~2N^=_yku`C9RPunfGt z^(6l7$su18M}p9XO$J$_f2F0!b!ce_4C33XHZNLaqqPP}sso=XQ(Jjc`1(1G(@Y5D z5EQ^BBv|s&-Hbas>M2l&6FL?!X)wul3=nE(QQzh_7GG~c((58?36iKI?sNyJ(x?T+ z3C)$C*K%GD)c|k7120Mf<*ktt8(c=;3#|64V;{YY9k3stz530aj(N@`^jlt;4=-)i z<e$MwtnGJ6&o-!iE@%u>nuWx6E-Xn#5;1|lK+D~s%m@3I%$~P)y$|=&1l-wo% zWf=2_f`nCJ%!JyhHABAB>f%W}=NpO(&gsC&q=c!pl~jG>u3#*iz|&4*+yNq09Q z6DF+GI+j-^`=$MhF=euX@htYza~48nyrnS#Vcyfr(7NY`m+($lAnQL~R?pmQ4im}T z!~S8P37%~SBtEO0l_fp|9d;{Y!7XW+2iN@*-p0XW%CHPY_9PI>q5UP z49hgE3@8rEYO8hWFTP9@@aPtovD+byr+`WG4%yWd?7HSO@9aQf2nemB# zREoHG)KHwp3*G$$t+3ycYjh`AdO0l}j|_tx9d&+iXlQ7(Q9iS_XZyH&DI=!j)8C{3 z2aAST?6~(1N86Ix9cuj-Hww3TC@uxm)W0vgWwF3Qc2(+8hO(ep-=cj+`u-rPYI>0? zWtzLYQDoLqBnw>pPVFV)TXh>>%@@7J^mdfEkzed({wNh7bh;n++4(6iey9Zz*M4V) z6{VyOMY9RBmMJ;iW+k~<=6T9m0ePi}>@PbCsH|8#%*}&-RUvok3+m~V4TK|4LeD+; z5|*CDy&N59GGn?39c>LOL~?AU*|Bf+>8zYWa(A6lZ)Oc%YU}35mGEC41 z24y1A)>QvSIbKUHRaM|0$&UQBtpu6%58o0{Th`e$-+oER?Eb9bw)kT?DeKRGA3rvrW{U>q+9&^Xtd`p(MSjE)QY@!l9o60mC{gT{+n~8m>?YX}nOG)*| z+%VSafG4YAHayp*?i2?yh!fCsJN14r4f#f6x8vtNTkUN!TJGL8+OqJgORjLQ0^hZ7v21c>$v6^| zC*FL)8CS(vNlTQat@vV;+lRFCmiO^nEN+4A#(LqcoVcR(U|V znVJiqQG7E!cU#n+$_PrRyF6Ieh?1!1Ok`*L(kh#Fv&{PuzQQ?YE9HkY9!k%#hPa0NQt0iqO$#6km9$!#SJ{d@OmgPBq_KuRk6(dn7YU@Wq zQkRtdsp;a6KwfJyW>z;Z9L$W@xdwh8QFjh_>La@0#%61y`1M1n$8BqNov#9nAB&fr zA9kWy2!ieELG*iTK*F-XeXEhy5CRORuy z=6%hB9`A6WZb4fhS6GtqRa{w}wvTk;XaWCbm3tG9)8Wo$t?7YsrnEz`k9O0YFxbh_ zOUm&d+J#;;XSUc2JUR$Uuz5Y>s;`%&0UrwE+PCfJWj$%rwENxA1LjTG^YhgNS5LzN z-s_zi-N6`$3f9gto~Gq#_v{_NuTHv>slGb^-|a;Mk<%r$3gjR@Jv9^Rs)|JbHH_i7Tk`;ViK}KR3Q7a+Xv-ke=`r zvVtvQl&3t?>n=OKb+UB5-PdA*0=TtXjJ*rG#au;u?%BKW?Fmws#u>8a^<%hNuLFB& z2<>Ie@yH+o0SmI19Z?o^i~3WfTFjNLhHbO_g*wSrGJGKT14LKRN0oU;C&!j+u! zIUgA3JOWjnKYaiU%zi0+YPuFG9%DkywURumA62^=N^dDZ!SQ-oTk>5~YjLqoI zwUmROm*_uokrH#UaNo~-L3rEzLBX@c#4h~Z%ghT~`9p}rON=+uLd!5_yL5qurpb0Z z3{5xY>4L^~1R=}It7UMCdC`%#FFx)UIAok?C3(Jl{53>h(0ALd7rPqYXJbnjWhd-` zMJgwq#LB6kR_Ug(4is`tnzyU=cp&=hzvJ!dAckOZaunaz?9v(~{BBCbJ&LgT5m=s> zZ}Ns(%{g25Fy&{#ETR%oo#q@x7DO=7Lknn&c9GNKCw7W9?Hkv%eXiR|TVmC8d~!vb zC*JAm6T+=DuaJd}pwfpNce}4=&CAj^CWz6~kfE5*=TGIayaZG6!;K<&rrKpGn>m zW*XeEO9#e;Gsw?T8uWDANc9!p@UZ2ezcxnMGxG|u$L5^w5u`J}ogo!F)7!Dp=ziW@ zhcTN7F?@3n4qrB5?qV>Y^HKN6C9#E;d9QOv5cnL=oRs<0?y$kZ`ZA+7C#o~@^Ne{b zSZ`DwuMMq?3!g0g?hJ92l#p5D;}FWW;UJbVYCpl`0$Bo68>U9H_g0i@*Ez5Mxkv>s&F zFGhW;gVW!FAYgLK~iq?Sfhx39UZ=BZCN-IhG zF}96bJ?Ubu+{CBrRx-5O8BTeYvb~G^cS0w}p7ZuSxoDH};gfEi8LIG{@>*?zywcak zu@yx!84VOd*RD=*#j-r#Mv%e5p7BJF7HTJ48j?tZSogAkx;5^Z^L+lgw$&Ua zO~!sW&zwn-V8pNnuQ}W+?1pI(Tu^Y#t^6K`L0&gZ-Eimo#;?}t=V?2k;NxHR9OALP z>udHjYpGLu45f!Qg6mFaE-|?iF(C@wo{1@l)A!W!#NitZ;OW_1ZhOLn;;A9;zRE>{ z@tOkF?!Z06TlC)D?e(tDV%je?lKb!u>AaNk*L!v4T(!P$1^%K1Wl*zHcn)lNSXom8 zLDP7rgOy&-P{sEHqI#`h%8*Lqzr5T(4-E`puR~DipbkTJ!o8DS#|Toh>NSa zKB;EoG1Na9lw*&T({?sr*LhouR+gO1V-91DDHRFEHFu9vbMwcNe4v&^St1#P$Fix( zFZ%^8)63P{poudxF&+SzumD-`<1gP|U9a06 zPp$jG`GS^ikDnkkdy&eIf#UEk^^oHsdY)F5=@ zyEJR$oaGM@mBWOZtb@1e7D0+}t%SnC6%d5H z4sF;U!^1nCR}Z)!qMePmTkqcslS=ueW;UHZG%9Ta9ajs!)JO*aD87Tkg#}S%<<{sl z;B=qYHlhKF_skuN_pnvV)k{Um7FQ2YhPscd5614W%1bZ^H~)NRb5bExT|yye%y$m> zeEsc`KtBg?*$zZYGM(wR1ymvgjvCyms)n5*dd;0ZK!nBqw z(IcDtD|tPjj8_Z(j^Km8RfX-u`F}5bXE;1|)NA8Ox%%ASS2BeUUbNS+7nXE6DjRiXr`Sm}#`>t7yOg4OM=+c6wr9mWjB0jsQIZ+} zZfua!XdLu^Lk+31sGPNfGk)7^ak!h*78B;-006f(eDTS8 zfDTGeNtT}dtrTHOHUH-NvV&n;ZVtZ?* z)+zFYF}pUlw`h+F5RLLz0tqoFm*9ZNrC>jdulw>8oI9F>-adbu@E1)m3Hp; zCS>*titr&gqMP&M`}Miv{%R$8dYLrDZGVHj_RB>}(X%nAAT9t{t5r~%g2sJ9e_!BP z{0MFU=G1qh!|=ruy#z#A=FN-YPlctmC}DA{}R}#vF z-3s1XB)#dB?&cnZDVo8C@sQfju4Bn2 z-T?3!g3MVL?UgB5kYW9uDidNwMqbBtbp~F(ZjXt@rLDFr7Zh9XDL1E}n8IiG6TzGm z)TP4%{6sm^*sw=ki=)}H%%J0Oj;76uUbQ_Mce4(1<7&925X{>v=OE1OQAj(Rcco7K zWB^&Z^n;g-3;>QAuBOSulH+=kAEc2|oe~|uv1*TnmEtfI#97$am;V^)rKG${M}r}} zooh`iDq4-*KCqGuY>>GCyy&mku(Zr5X4FXKT>cHELG;`S^nP`@paZ3`So(K95s$^? ztsblN9}nyNIt4F`R;#$tg-ZRhEJ-2h+w4v}KuI5HAW?hu@5KC;wIHfYXk*X7Fl zfs-&|+GYMrIV@2~_kB@KR({+3gRcCcK5Mc@Qb3HKXmdCM%+4O$pvE@*Q_ibTws72R zIg(x~?$%)?7S}5|+}gqxhgY{Y>*?M0{VHPPyHd5?-Pl+N0GwsCW8dSB#!8&!u7RR) zkK+IG@e~i_t%2kg1W9T6 zmr!=e6ppjyOyaS12<({4&_+@SCm-VB_VQLfh$^|1uch2R#;)Cu_a(Rg081@FDD-jF z76_Bh48|y?-xLHj934Aats1_gx0uJtWSW|knYo*kJj%PTp>HI zyq4_k1>THxOdP`v_elUF1?H;!$NLHSB{|ff)AlAnb_1v-arD&aG9-`TZk)KQvf|%C zZuw=`H45GJp$s-(Ol7HMZ=-k_28PHAwdatT{=@ZdnmmXQKQdtuob?|JLKt#8lYeS* zG#DvzAbh1fd)K2fSyXnUrUxX4YJMzb`q)-O@c<=SE$q96g|`G6>Y&;p8(^&jY`k8?TeDkOD!q#o$R+=ZJ9HkY&;Ke*4AJ+!2+G0WCfBt_)IVm zncs;f*Yma+9NMBWw*F6O$XA3OdMty9*1ld<8j=<>^Agf!$t`{lqy*qy82j-`$<{`8 z)G0sT_ygxK!*S$Md%!Zfds`Poh^x$gGcueYG_R{y!bOtDQpa~cRMYDx0{}P@QYqwb zSqvasV!-}|xEp71HFa|y%_a@61&wtc=X2CA1bM`L&m3!ME0oPP5)?h21=ICs+PVxF z>GN0R-`VfXch==51=D@Ylm$opxH<&d-Ra8HfQ{AkoG#gVHO;DQ(VS(uG%uO}si^dj z0pn^)<8xBQnlxgc2Ie+_1xV6<8eR#!_Fb6KNL-eE?@;k|Ht)-Bmw;*-4$-KAbReQv z_uS1Uwf8>oEVN;nxgG3j?uW2~Ny7IXCwbY9a@TpD*S-xhjwC)b^{$y6nE8etH=U*{ z80giHHrUae{-Vir0Wg|bP?%m4j93yx%HqIL&lv=Ie61_LrI%-h%%Ph`@!td4NcPqjmQ3(W_)V0SPhsRsa3e#Q5rPvES=ZmQ|m!IF5R2j}v#+2*{2B0Zit znqtkL3~8xuVamzNd2kTg^OD=M2mGCz{5I6BxT05I_&A@|0F``XuI2ec4~)6d3=SpF z-*Q5|jx$I+FyncJ(2Phlf7zpx*p7z${scWeWQ=)CUKhu(S}+;7{>8@L#x`C1GIJDH zDA;cV|HQ>Dp=i)9VFNv$0LoX6mDW22mp zQNY@&Gap?$gZTFcJ0x&)%~#kH6jmXyIxMdXLy`m95MvpWp9`s}=6* z%qe86hoqj>%zEjES;IE^H7l_luR%R?sPET4gMo#IQymX5?d%)PK9o`+V=w@K%uo|OgbqGn6w7ZXz8}9c6TU0_0h|Oj&;ZyCy4j(5v#LBD9@9<$e$2Ao zF49geUXO~|NEyI6I2tvYtquX%pUgIUm-cxC97j6yig5jrIB#nc@NI5nU}od$TVbY- zP(`}$NXAj68;vnoY)S2c3KkUR6%|S4QbFk8#Ca2IV(idg`RgoSA_N`Y-o6NageMd< zQ6H6@$d?ZW2iHINg+Yo5<=uEZa~4hYmcXI|V*+lGPAZdlY zw$yIdx!Lt-`CeOs;`ud7Mde#7=i3%2$WC$MgLN1eDu>+?&xpmbgv}5gR_`XjZ+-Sx zQMRmul(4HUGqKOvMq;e~FpTZ!NRntpI@Yk5kbwpGeC_Qf8C<_Fxhq~pI zXu3Oj9Vd71AFXVAUKJq(ZV^omtk0qY1iYNgZTUfYr;2eF=BNmjr2Fn33c!hgqy4P@ zsFn6vHC8$t?HFla!}--G&jsS<>*nUOjkfqj1#oh|_d35gx-%2lmk#646L)lyJYqK1TmECN1P5A^Hx+d?Py)34aJ3Cah`XYv5x&d=EX zTJWpeB0F@*S<^w>0WfccS;$Z|fiQm+mtSLMq_c&kZu_vStzhLu>29&z$VzC2l7=0l zXf7Rba^?&2lb2{Jzz_AAbn?^sHoVFk0ar35=OG53r?+S4?Kdks2%tH5(m|i#GGu}w zNU;K{j@?Sz*nQ(<$c+aKW_MdT<-#C)&W=Tp2WGOM0!;%aR{-F_kI8S2`#H)T6 zn@4ZVnAPzW=kX2p>RDa0e|)BmAESR}#(MdiDEPr#lmJjqx4oda04iN+m$2iuDRk+q zLIXJsoiXrn(vERoRT18T20MHJVx2x;Mqyb_F*4!-9u-d2(#+Y-AFR6>S$Fuw+mbOv)9Fd?U>ZWSFR%)uDsH9{`|o{~;AkVLdD?dt4h9grXVwy8je`o*wo)Gs zag_EK8vh1>x}v)`HHJFcjci&z23~j@Z|$w7XDWntX`Z0UgH^Es09y%lq5I-ZlE;ydQQ$r+m_!)On0a&Kcd-8}j%362q`U0T~JpNFe+jFaiJh zd6aPD23p121oUyP6W|SfDA>;$y0ej#R3p>C29_Nh#nh+6JoD<2X@eCCLHX zHXKX=2ZL-3L(Fd2)SGF(5XA~}Tz;eNeP5)f%#G`G^%qitfx{8kvv+I#HJ;C}G0?Y4 zGd3(Lo+r!_92u&$udRzXsX#ameg^l#%_GbK2(x~h->{e#!FN^jrMTVpWZ4Ba@}xy9Tr6!(+l{eyO-?FNj`H+bQ3WiUwW^Qi z;68{MlzGy<(u;mCt9-6N7RHx-%pWp!rbS!_Z97Fr*P$y6qF3g?KEm6fUkbA?g1!UD zf{{U+b8oSm$c?LucNUp{hb?z_HA#ac$05(!*vB%ee32#5MUl9-%bLq4g)Hk{8k#@& zFJ|$*qiv8*I2tS>%URl4(Ky`aA(&uv!!QZ+D))BBQ&DY4h6@D#Wpc%XB`gx<_M@^# zq`FEc-B1)^_~Sx zbZkzU$0d5xu`aUnh19pC#=T!(O8V#etXMitBLo-{zu=;BMXeVk2BU=PVNKrsh}uHm zvTm5eCRO!O@w?ZR+4KuO?uqotU!)nKQb_4c^a6;y3L>0u{4_?u+OWS`UN(%`o*VI5 zJ*UqAa-+ob*7v)@`j(2Bvz9{`+7?hk{dNe>H?&o2+w4$8FJ!fz_r&B!68i|d zK55|X(Z?+BxzM6=WWk;9$)fq?c6Sf&Hse+*;&>eRCBBy*mOH*Guf5WN?XF!mpK~B{ z8JY(aiQUNLX+w68L@+eXUh?d8Af=frD-we%M|DqigoS064g36^q}O|l`4`Z}l}BvxXzt*L`nWxC`3elPAHCRPE5N?! z5@o1@h0YGN9ZXvld@BV@@Et8!1o~m%HnCbEO!KwyEBw zxO+_5$Iu`exif#`U?^#hV|J?(zT(QCdx*HK9>l2BA#02tcp$*gG!kFIBv0-@A<-WH%@a3_X5W`r{mN;xL5z)DgWl}{yTdAcjo?k z-0+{5_*cFE`r>~nj(=|&A$UjrbntrO3OH{3DJA~9nc@c-Dn5Ujyic%$Z}h2gFa7?a z$wwST;l`uCBs{LO!HqT?4d6x`c#^=4TYo`-8Q80wj{m`$KPC9jDEn8zdltXd|Lc{1 zyzSqa{4cEe=YIPaHu+Br{>MT77nJ=o7XSYv_|JGr>|Y1v-^c4eE%=`)>o;6{{wByD zejpvq?`eX3^k=f&kNh9<)8D(|&k)u>GYhonFU0u&w&4FsDfqWo{2v$mkBR?(88iQB Z!D1sKGrJD8GN)BrR#NF{zPQor{{mn6IW_|$(0j;l1@}4k-gEB#{(x^B297K;)_UJrpZU!BE<;|bDcrb9ca@Bc>;_0tPLqu6 z%6HPg%jbY^(r;PV0Uxv;FZ4aMoNYY3%-yWXo?AIvSU&_gnuD!1t<9}`TwARr$jHt! zLA3Qf^i@^FES(*>%t`lfc{{oQPm_^JNPD}OTiRQDJhZR|L!2ZT@pV|nhY%}CMm<4Q z9#t1vYg>q-ubZ`&ubQ@{uf3(H6{ED&LkVv&U;#&K5A%oKjt)-lV&0OBXX}aq*QBqx z86TeA;$bhz_**D_)t3)to!zV-3UcvtTJrGnJ`@t-;uR1S65{1}$j8IW$IS!$3UTrZ zhzSab@d-ct`-c(O&CSY2OjAz&@4bM(BpGczJY2-MxxKu+xV-qeoZZ0OyrQC_q&4{X zIDtDj-F=)q%)L3C+#mmA1vzVXOE-v%2gKRwA!$W(3umZ@BqJc{ZxtL}{<*A^``=~) z494wk?!wK>#Y0l*A2+J1{(s-<==jgO-90p||4ZKgbzygH9~WzGO>1{&sGB9=IGe|$ ztz5)p-K@<$oZYmYogMyR#h13u9?tHz&MpsSwS*o%RW-MSIFY_!J$ph`RSe|h?qTj^ zX$_K-WCYgWfX!)fcPO@{xfiaKmHl|)=ogYy8(f{!i(o6`*Z(1Nbb3|_sHtFPprxQ z^IwN`^$nhAZJiP2ItPO)OYxAHyNm9xtrTUuzj!d*O|*H--}v+Aha8IB1b7a_wl;wVfea|i2~n2vq>Y@caUH z9O-pxF5pNf6P&N5U%nKt2}4?bgeuOEvQoYrI&N!I#GTUVuye9|;88U3<4HlKU4y8O zeMgtLiG76)Dh*jEWVqd-7S-J`QSTr)JnG{Bxm|q+yeEQ43OVVJyI&b+^JH3N<>?(T z^?il3CO;_@m3z&=FJrpOgs?+nO|Gmt87|Zl`ndr;5R7#)xm0jXoE(s5Oc7{gkU(3a z&m_-c&u`#SHd2dBLZ*VUN+ySr^CHy;!CVV{5c_G1KhgrLk6WdU5}PnZ)>R2xYfVX? z#P~JZbV3g!H8GlPUX^oo>`m)c7JAt~ak`5Tc9YEdX4loYi@+`&!HK|-MEJ*W=~7>& z7FZ$o?UVdQN?iJ8(#k+YBV}KCU(t#Uf8AG~t+Y%17Kv!q>_n9iiwCCslAkAKkp96i>Yaf0c`&1EOS39faoyC51bZg&Z zt@1vWcP!nJs)NP;R1nW$>^zQMPji9K=)QuaV>WWn!Wj$!DY$;DD=RGT9n_JM)>tp3 zD#i*kV}Jq9mo+ugveh|B*1#g_*DJXwS>8QSkL*yXc7m9^Wy#lzLiJs8V&1K7?{He2 zPuPOM^|DKH#|90S@aV$D;zHvQj2*iqi5);Z}2ezx~tszBuI(T`otX$}In;!xf!|wRYG@v54hH@HnR< zshxCkwE&hhc5!kz`h_kH%xxh@JrMtyEF$Q8GA5VlvwLa2CLl;xa{(L|mXn1k9coWV zQ;)$l(Ayu24RDFWladw-soV#LX=4n5e)Uxkscro%n|2>LMjTnhP&Qsti=+qETHG00 zv~nchWuvFIl3qo|Wl){{D!~T&xf5frWhz}@5q%z#g{$+?hBLvkV3fFvXLo5j zAQ9?8+SUDHpMx(2XF4s!^%v}V#^dj;j$^94R`QW`dfYX8lSU1nymIqNVdQsa+c*_n z@cHE=u&HGE@sAq22A|e6J^wPO%Cba9Zq`H)!Z)}}X$mQ*TwSu%0QbjN;gq*)tRnf_ z3IItq$V1R%WE`F|eY;?a)TD-0Q88m@0olyh{@_G)P{Sef?$svaT7O4;-N3%o=XBz_ zpu3obpr#Js*S zYHtGJ5e8V(Rm;n0GhMX-Kk<2|AteE-ZMQow*C0A!tCkHyPuwjLX1Ukd`c$bm>jRL^ zhs;f5y&`JvAW_xOfCE6uFDbW3G1v+umioHnVWnh=KOrv0Qme9Br26+B)%u_Y8F=^7 zE_;-Nk$An&i+&RWGuGl&4#zwy-Pmn^knv}aSzE~zJ9({6hm2dQ0ya4;DF&4qD5vYV zTKfus3Lm$m+X*#bVe9;!@pV%C%edjY*AG}Ro%x@9JU(#bWr^Hf#2*J|n`7OH&PX@3;CIQ3l&)P^pJoOJ;U5gN)TP=Di1?Wu-Ri zYYhgm)YGj4*>@|8bDxxTX+_|2Q`mFMs+tZT+g6o(&Q5Fg)^^N}4tT8aiTBhxb-$p8 zjK!y*Kdse#mW&YJ<{u33JrCfR##wr$+VI1sHfmbT#7^VJSt3(u;oxgpnlu(t%)5K6 z=me!c8{(H?)dIj;xMEF6Ep2x8ftd3b(NhCl^n5Q%!DM;C-jA2%CGq2@;OlBLdF(V^ z^V7wCTSszZIe5+@PPNMy0# zyz|$;cRK~ruE7LcRXhyqew$D``mUJQfzMtVr|+Lr9{ z%}#v=W5M?_^-2LD*lND^E(KMLb+A>4B?;`EsDOFoYoG0{(y4Aq_k$jj7WF8V@sCou zSzV2OO3U=dn%o8ssa6dH%JzZC$UVog1WEnQHus4lsy(L)ncJM)PuP`OLoK$NBoGZ54pY7r^}n4Oaztnc2Buyp!jc0i_ggb&^(`Ca272gt(kg?Aiuw7z<;)rth2D<}i#eVYw6!j4mM!~PLAzc7 zn^d3G21h%ga&ElTDGl7qw&k?1vt3Gu4SfxJxXq73^`S3;Lu?z02fvr7uCdh3PeT;g$LBm8hD zJrmqgQmX|rIp{>84r8^Mp=#&D4wp>=OX}_WwmXaWO4Q(!ypGi)1Exa=X5M>?+C{f&&HiiQT}}!I4iim! zV=acox|g7Z2_+qzkrLcBr>K~dWu?n&U^mV~r`6!EKgeE-Cy=V^u3+*o4NCkdqy#_d z?s3qm!1`b6V+d~yN?)2(=2tmEb-6mjU1OK&AJQnSur1YYn?wDXhhKs&v4dDQC4qce zzf6koK|T|EKc|IgX~M{RKIinH)F0(Pzj5F}@U@KV51u?Z zOi~BwXfAlAl*y~BL;H?=C(D%g_?U4iul(0*ux6)2t# zT7%Jns`Mg9Eu&ftV%{GGSi%TJvP7KPb=A|Q!9DoVy?0Lvc15r2Y0?C2FMy?(bwFv8 zj=q+*mLPTL%wZOt0=agB0V1#F(SFCk$z)NxBs{0a!fWk3H|_zlZNzETQZe&r%L8u2 z7aL{=iru9eg()`#&RID^d>uux8NGeF`b*+~YGZ~Z;G1v(*c*eNH6Dx-)pQnE5PJ9D z!u-TZ>y>SJd3i0w-_eJt!q}N{&0I&*MsO-nj^b7>%%QtBv?mew6K~oLJHS1D65%zLi~A>gw(%>Vi%sL0H?1v8j8vF$)fxAr9J{5fg!ZQu zt31HF;_5;J#=g$14@Q&Wc1EZ6DQ@CdH?<$Pr9lc4e~7(HY2O=Q7}JBl(m86Y9dj>Y z@pmS?;ZVk8@3dAf75hm5fH=Lhgg>fVewSOe=L7Gk`8 z@Isvs+suOUTI;@GN@7=+K+Aa@X57k>G6l3LS507WG7Zj1qobDt!*ic>_B7|D;qXI7 z@D1Z~Ebs$?2*P81DKISYE&+um3(qTU=5A%yw`nahr4!r zf@Oef^jG3V+K|No-r(I)qp*fQjQW#OX%)@r75AJuR`2~t`>_zug&wP}SuiOOt73NT z^12UHu9`C~20e;4!Ro8T#+JPZbrf+lPifis5-WNeBf~6Mo5Y>}Ck!v_TU%fxJea^G zirx2VJxA@OX_5w8av>DIIFPNAmOOYhb*;(ULg+8@c~c-_btcoj%?NMkaTM#t4aDC3 zk?7PqVd9+QVaXGXZ58*X;rTBGyD$pjs(~^KDdcJVG>i1h6K&B4up-`}WPgbjl}vg2 zJC2(_+jqUNF9}ta5fQ=;{G&7J5r_0%bEvUYm<^jj0{fWwPgndN^FAm0?m-g(_G8{a zet${J+ojzI>t-NyayRUZ{G448ZV0ZSnZCu@p%mMH@Aze0e|7om(W)#{Z9G0@qPAw( z^|YdNb56O|Q^4ePmRKTe6aJK-#!Ope9o$-InK$fJEV^N_7ClH8$iPOJXlznvuyYvw zFnU;!$smr?Cs4Fu0}4xB6?SEZEyOlg+dS~cp(qRsQJ-$mD2m7*BVEckK6nQ;l1h|U z-x_H$*D@I8$58}09>KZ=kHOBMjQJ?&$@Wad4LI*+^nizgn`hzh_a!8j*8 zhx6#q-C`JQAfflWvpc}GFOtgmx(JEB7NAC9exBj<3e`FWO-8oQ7c1 zkt^-TV1!+^1f}*&JB{CY3T=Yf$SGm(#8Pkabax59F|@N!4C{iY%5@GTV0n-1TkhQp zC_aW6nqf3yi&)i@6hmEOZRyt0=_%M%Gm`|^dN)ge&0cAfMwKXW=TazYBym(!Jm=ON zoxysTmh{&59ijlN{q0y6u0}FS)gR7ZTP8<6jaCSSn}#T~Z!VVYY*-CEQ0N@5q^KxX zNKy8}Nx8U(ZS~F$9gVr$yVniQdvdBqs#!aNGwaH~$r2-Xr40J$>-X()bFd-D4b2l5BiBbuFUMGAW1V6}(|!*MVR+yOvk z>ZO2ySjTqw+W98+qRzF@E(X+*-!9%CdUPBqEMzRkL4#Y?I1TlQ$vd3dYFX!&Fbq-1 zDccL&t=sQs2*4Z_#TY28OiaxFaH(=ArOz52`EaMEp<#hS&oS(sIHG*lqkX<@C|R?j z26i0ZH5XhlZAofI_q@tTa5g%j1yd*Vf=xwyJx|)iWBY5!H8mIfgO%(&_|3G#el<)k zt|w1;>SgA_Ji9&C;mU#$_tILE!ptza8^f2v%uX^lQIf`3_K4+4ozu0w*)cP)UrL+d4FEcVgYNj_{4gMdfl&h^FZTSnur1r$~bOPu^4!T>ujdL|_H?%*b*00I#X-Nu$FO zJ&sv!7U`}2ok>(0Knb?s6~y+{6EljmuC}$-mvp#=vKuJWNl!~Iaf)-N?xVP9&7*2} zOQ(gSv2t}i>61Y%=@Z?ApT1qkF@XwnDMpk=?&{-u2crXg#8)RYhTSKOV-o{`_f^dF zV@CU^DT);L@63ewYA?R;_Iv`)$yhgBMf-C|KW!H?amfLJFvtY3i?OOx&%w>8 zfTP3oO}k%G|C098Fg!SWx__^ZJ9SsMwm#j|ZD10!^HV`AfCJ-qrAVBmtcxghI8#|j zDr`pE>YWp(EHlLYuu6rC?%bzlYtrtABhy5YlUz%K{ovuu!pe@*onJ=d;eor34EK)X zjCS;7MIWR|g7NejH`U4KJpp1jNQ+tmnHt4E;F8kBJnPJyI2=s`0at)LkqGgn!}0_?17_ovr7pAs53QPLAbJi`tsf_pkd8?L@tK52L& zr{{K5d++CaHyR2P!ZZjH_8)ahg2>O9`wUfFh#NOkpDAAt#ejhiofsD6?RVA?C&hNscr1sj2LY%n? zo7D-Yi^~e`^`)moT0*C=O;lOetj8l{+Y5e^qU1Q`&4Yd2)0I$<$tK#SIHAOoh*ifN1AKhJdzkZ{+ z)JHQKlO9qy(}O1NRyG@AZJjJ#V>y*6N>sgyx+SYwv6;7{NPz1grOo9;&yjm?WaKCe z1csP^A+l6WNMLyLIna~(%>0e%eKXR>A@s1w8`!1G{}S~@dlTKEO=ws(?$Wn+dBxq5 z$Bm9eA(RSs$#ng&w6bvM{Z_X3YUkSq!^zWw9qA(*!YOm>CZ2=v)q7xf4$UAkcz-rA{&PyRn=|FV%~jY2D8U)%o>lSh@ZLy^iGZzomIf!?k2D{S>AIO7hb@Y zvhGI=V~dR1Lvu4D(ja5eVONKf_NGHmBlq{A600A9G3;kf(%7=P$|jyLkg#{MIdfdR zTdD?1TY1O~ozTn6k{8~70S&|Mr_iraQj87Onj$cJ{Ato#D!a0%jwadiUX-tL7mhs zUUm<3|CY_De!tvUtdg*PDriZ}n#r9JIl}csId`lbtZ%h+Q=s`YTLnL0yH9 z!LjVzw`XQ8$0JwSB{j&%TvpnAt^%&qQ0P`WS&{bfoeYV#zX23hFB(Vq^MGXpw8`5I;x=6tjKb&4c~{Uf!|W-# zn)^Az>X3=3!pU{yWcx>U=lko57GN7 z@CNbY@~6kyd(+97$o*ZfdTce}4HK7lFMyx}(?3XN?6u@hJE&1#PfaW~vj;$E@Ojs| z_&<=SmVWX$O_EajVE?qD+|eUXbYpXqXdKxh)w`)atxT>Y*>m?KWr^r$Mlit@R`6DD zH_k;tSy)yyPWPJwT%olKu+f0sW$Q?x1V4}2D7q4&dh?<8k(tM-3rxbp^$UBY7girO zo3!jDl-ZA`pLi=HQNvt4Gu1XY*sRXnW1CC`8)aCwhkJkAHew5&Loxs{$xNE`R3oL~ z%U??T_L^+mF?5N)+joA_lSLI+TITvO`=tc9y}hr=dJ{!F9Lplw^WF_;cbub$TOPVTmIush6*tuhRxRpW zs*!SfaRbtH#A3Td!3rr3Fd+n*U zoH)jPt<)N=lG_XpJe(F;S5$LuhXa&!t9M5q=2uJ=)p-)#FH&qX*IEe7GODHajn|1_ zycF5YQ}U`mx*ZxawD6q>hxUf{@u6m_6jK$M+lIc1GQOB+KlUk=wt|_0E-1daa5?B% z9`Dz?#ui!*E_l^=2ZPRKliJ#~$v(7EnR;(paf5o0d$q8*k&UibZ$VOa@%mPS4t+vA z#=-yN!V;q^LB`ylLyKF}Xp++jI#!Bv6`y$frTTVaKKdk=KR9h^)wS(OgnBLK+o;l- z{4tXe9w||~KicoQ#sjp6jO-k_IWXWNduHpR)JDWq!4=HcUbH;|?N;4HXrr8Og4nKD z<%WK;H&X&tb|eYJ5+ z1l(OqjKPmDfP;Xa%Tz%?bd!-i`m(MWaMU(2p1Z=WNe;@d4*rmJ7Z>h11lBqtMdWr7V#Ukkh@uSK- z28zmEtmlcE8I800FQapn3$E`BGQMw32MrCgQ(7)Gf1;1nB1eDy!P0b>Wr_-*$7E#T zlH{ZVZ?cC!pdwj#fFOHYZ~wcc`t4D`Oc!3;QsshV&1o`8z1@wvsq`df2}So)MDB~w%pn;ESajQV&0`iYp6UHAp@BbWi}%w4gRPo;g!<+ z;!MXgS8}?H8bz(1lzMMS#NA$-SRB3Bu`{Yygy_q7B3!_VYdetfF|VVG+UMAKCzsRv z%(2LDxnl7^new3h_Mt%ZSIC*Y?($zI^%Z1)C1mC8W9q%Y8sqR$mNoO)X^!k-hs4eZmuy;kIFX>7}mje|zJ@#ysLU|1Nh6<$Jtl zNI6*r$A4Vmt9So;H<7x@6!~Mt%;yO;7$BCw#BlQFZ_BX0zya}tSqm1VVSUGh8<=gHIv3AW0O-cV7{`$PS`QV3Y)Rn$8p;#$9o zzui)Vc4pGs;|%8&pW2?&IQ2APPX2nI?5W^utIe5?B^Br^-o(FnW9+TCl&PriNx2!C zMF^@XMb&WhNJMFd8v!F%pv_|b9n@bHaTN*^VilV&=l;zqG6>%X$T(-i!>-SNBoZ-hdxZJrKIQ~Gofk`$NB{xai zDe$2^C0p9L?lVayv`AM+4?+;0$8IE!>ksD4iQdf5;+#{>!Ag(2wOY+AdEbZdv*q z<&o_QJ3UkUO|kFlttRcco2Xfr7USe8$^}&*sLMB$8YlJWOmPe%0^5y6#OAs?7gDaL z?=~k=l(ovM*|&z9#L&Y{D$FI+uAMo~_8|bx004-UtZ^JRzMY|A1-Ad6Zd?9yv(T?S z+Zp^sFB+*`0Y@(PcSKb*;I=6@Z%RMyOJ9xx=a&eb#xa+fg!ztpa!-7EXge47Vo=@@ zU{Wu_hG(WrI>Svm%c)bTNn5_Y^$eK7labvt_N2xU4p1;{oF466gf@`@2 zHZAa*gI1-!dD}H_gtfWn>T>L&^?l3lA!h)$@!%UUfG2zXP_xID(AGCPy4D+f^7ZzOZ2pT^`?=CvY&T~#_Q z8sq<*wu!D_GN8^eq-J^1DSRzy{oWNy59pby*Pj1Ym1C9ba0O17^-vxCU$zzNus0LD zm&pYp7>@a$n_=|NIf2?Wn^iUx-z;7c-O|3SbzK8|l>zW`{%nXs)*Sgh!_7s4$-QoR zV}~J;Bx0=H?dv$qKS#Jt;-I2Z-0=BrGY>T9{Om_HnTfh0K+a^fkPYL_yVI+Wh#w7dO z5#G7>BbbvNPmu0Aj(?XXuf$)Jd%NHoGAl@;=Trr&U$M=*rG57gq!^ZZcSfZuuN?c6 zj(NXOVx>ajI9x)Z_xno;#z@7O14;KF&X_~V>l!=E9FIed|H?s^*{Sk$w}u+U(D`4H z{j)-fWD~iEza8?&d~7WD>ETT8QRE}#hySzw13{Q+k4i~Ojvw_jHk|L0+vWB$UOs&D z8IJUwGRk9A50;X%!?qm^o-=r1?;^u#YjVC8+qbY2CcoR$v1V;ZZUfWpvpNGS9i zO*`)sRV^wUlCD95-wA4={Ri{)Ba$Fwa^!zYviI&ri`l3F-)#H8ACMRQ{A_l=#4TJe5Gg*9dt9D8 z|DeL|7bU-?-ijG-GidRwO5D8ica`YUEW|TUHYPL% zv!@eiYf`I7DSqi1qxzqd>2mEer{4;@0m z`R~{$ndhyVOtRs$hg3TkNJ?G?j>CV~#dA%ptY+R@jrlgCzqlX&o54}`W@_)NyHN$a zX?-!Co%;pQ;LN}Y={r7b-fwcd#5*X|evx0-`I1d5EROj+>Qf~1`GdHax;C(JDwhK| zL_!;#mG@WS=Yl>9uDQF9YtJ?hV))y_+XYw7{N z5V+^2vWR8JM@(p`$%hE-+dtHTnQ+8GOwp^V)L4OfiMUsOY}c2*Cf?)zz`ciAVy7G& z#hP%bUn$B|w(RDhoK&)4AMHPg>76d$>hKGg1i0{3BhNRL;eKv5V>$+<_8e~|c5a?+ zef}R?A9Jsc_}2z}p!qlD>0|88?p#=54ik93%Kw#njh^@YCYq<>%Gg)AD#jR2#1(vh zhiB*N&yMm#$Kf#$xBbw9Vfok78@V=Di_Uk?s{!&PH^Vcei$CP1#?pY26T8lw2hLakdrAFRZ1D&K8Oe@v?L&wl)_0z3m$I>+B)7~+LJuKWG*KgsnSL_aTf z&(R$WVg*V4(7Kf)kFd?zRNFqkw7L{s6rf_bm%N*M^~#z+H1n3qRA%-xR>9?g92Xb= zdcLdcpwac3MKzM9H)VcjSa{_=xvs?4K>8cy=qyjmr-JuH&UatEUmy)t3f0mbS-Xws z4;u_&f->EC2)Z#_DV^HpXOPQwnZBLIUSd*OeT_1bJUQ1>N(`TCH;cX{_c5|EXR`B` z^nz6=dVqWyBp=gJaf+Xy9)IYp>HDt!S~2h9f!1x2m7aX4g(@Bn3>Q3 zvxTWBY7*QIs%rSNXJ;R6^=~g6zd+LUG`qjc*$|JYFv$`kK*V5A;?dhSOvaxm!gZC+!5(m9!zYpOXsvE88gHS(-{Kfip&4!;aVTkZ10 zhjd3R@Fr9sh*F_JeepwB=jv)bRhTn{EUqHcS{2X0G3ocYcRrQ?Q;N>=)#5~Gn?0aJ zXv66-Y@zh+)bJnCyH;Q*sSd|gL{@(7M4K~@qn*Oe`m-&X3rquw8_qG9GtWhw8R ziyX7^WsFAOx0aN!Z;h;bB0NQ1o)~=kTc$t%mdS_sYOc|le%1d0FGR^SbgoMINpW(t z`7Z-3a>}!=V)NBu`>6V0#n6e{nLLg`PteKmwzqASC5K=JLcl@SW=-T3AIU%R#W~h| zRbcqYWox9;P4rvQ^OXT#Pkvlj|F~a}7v$5vml;^x-gr=P7jnGYEUijYRW7#&3T}-L zuDMd3r5~@+_Hpnm#dv;mN*>SklRkweoTG_4<71GCnCNcg93^;;DSXaHS8%QG+sH!o z9iVI5n_~r{O0^Pjp#im}CINnMy$|F4hR%A=D$m56?Gd3lckh~(ILe}IQZeqkuHT^B zzKd2PeOD!Z82g|(w@JkadmHM^1{-(>r912&3rZ=UDWRzm@c{luHh{YvzmeZ^7U){_ zP!m17Oy_!IJ1%Tf6sOf#X?}4c&$SzwmyJ_zfESjIPX%V4iIO-zn9vf$1PxCHDS@gw zlPCDUI-|a#t=>!A5mt|Qd2z%Q-mxIU=wpC+p&Eem#AaP_w9C*5yRsi++0b|LjNGfE z8pju_4s<}$hg@NgC?wB-_}t(Ax_fwd?~)LM)ItE&IwVx%7shoiw(^?0sL%%GjwsU{ zis4Sffq8UR-eYM)02#Hzc+nV+uwnm}itNH|o7O8=WEaqB!>n7{53Lxh@#XWAiI9SX zxo%cUv&z#7jn4N$F^w97mCd;{m+$$R@@K2qtS;Ao?{1=F$)qIZ+Lxi90-)%$$Rs=~1>aPV->1p?hP{iqF{j{y_fa$K{F zxvkb4c&G1W11)MKC6Q4jf`d9|iMr2{vW8$9pCI5`KBJ5hbM9A^^9ZLsX&Fp9rFvm> zqTy2ykvE+#g77Br#mefD>hf#eKpx=5IkHzA^`$GTGx!JB@B+c+i!^%kaBG|u;rUIW zH(Htx%-{#oFl7awu5*2wQbQl5_bEa7-0h5@8!F1fIjYfonwPq@j^Ac3ETHKw=E~n! zstBI0v%lVbwSQ`k4LmzsVu+_WZViwOuds~R90rKmZa2f`-GlF`2Py8iotoFQNg?|x zJmA9LL3+xWn%rx9RLNW-g8Eekt{MZ)+^5`+HJOy3rXhnmsz}2si3RbdOcB zgpxsqIvH-&qz`n2V{T4R#a)>UQKgj;?EVRPgNFPd`DrTOV9Tf+LaeG&V5>|~^ZbZr z(2$KvoMsHHu^;&r9kg=~HG-cO)<(oeZ6ZeVP4AI_Oy*$7f4VD_*Ou3wd zAGGAd!Xl=It*XZ0Der|l6F>MV*zGXK@+_hNYmxn;_)RHJ*5}s1r=K^2ysTxpRSkF^ z9rldU+zozN3p22+n>mIPvp&~Csn%ZelJMDx8f5p(C_lzR2+EO!C)eWk*w$Vyt}#O@ z)n)Rk?A>D(SvIuy^NZj3$^&B>U#g$NMvC7z)Rs%*QmPpKR@Hu;yNMrnIvV<-BPsQ0 zcPFv^r!>iRUlxWgG5FmCpIw(AN4ztNaVewu!KTS&BGPk!Ja2Uo`TQYc`Af9N%5-!i z_Zyurg@bk##uYVXS4Z}jq%OWd2IN zowiv>w}-@oQgC=~*Pq{D?M;ImD&@qg+m;>bVWzb9srMaIZD(V8G|qxOmWPj&c3-fh zo_}8v*Q5kki;t6iz1oZGwvUiU%G-rR<(w>kkBt0rE+4N@VC@Ij~e37 zxm_%il!3aCLLJkLyoGLLFmi2+xG_NJteVl)tC4m37|Xj6vRF)tE*^`!NhH(#GQ%2r z9i;is(Qw@Mg|ubu3`zStCK+6RcV%bUaLo*Ul$lI@?>BeCwOB`IT~vr##v)>4U!@6- zr$z8Bj7!AbENRZQaIp(AcojCsTv3rU;2?^qfTGN+YPC z4k;l(<0$(lz(2gtOe6qWJ7G<#;xft$VYFWS5JR}#E3BUFU# zttQ{&YER&8>ZN6S2S(geUKVzz8{P7>pR@WGm7iL>&Y#6JEO8z(flQ@b_XvgMhc~@R7pD&IhP;TBwa>mOKZPo z!eIw7_&weW2<`6nf#JUF?-#r-_@=i8)FJwxU(B8ELf-;?B!Bxu-i}nwuNwKjL9}Ek zo0d=H-Xv#P^8+m8oC+EFo+W;-@RB|olMyvb;=-$sY$SQE|E}?`83+g2k|?SHWVHxW zAJyAl>_mef@V?jG>cN4`g@C;+C%6#hbHwtyt3Yn;kL-_2y;VWv6Iqy948bbQ*Zb}u z$m4R!p$po7NeGs`%KEIVHIDm1$r#~ z=GQS4Bq`4S>Ru;(p1kO*=&g<1ra89M3K;tFh0Vz{_TB_2f4z*Bwmm27u;`x#!4G1h zmak9pX4H9$}Dmrr$zA>X(4ek>3<-3D(jA0j8=k7zS^g3_s~JoG{NTv6hF1xp%A zKiMy`K&Dx`QXbgDT>}a0AnqagGz97G33+wsHS&cPkxKhDvMx7#ubuW zA20n*E_k$6Wo^>{+#oN9HKgZlT}dk4m7=|wdp5Lx4oE|R*?l{+R}F{upNa+Q>}Mc@Dpy`a?6hl%pC5SCsCQYo$Zq;_bE4Xuv9R2N0Hu%cXx}m&Nyfosh;Mum6?^`%|DOe>f-KAMX6% z8>B6PE6s}f@$`Tbx-_RUY^ymV+wZ3xP*!VEz=WoVdk3LSfx(oD^Wr3kACT8^F}b&U zwLY%6IwO5cHS%wot|nUt67D_L=Y50zHeC1gS|3$Q{{f6$(2)VpMPNu6D|@=Id0~6? z{2dB^&8@Y!k>^E-B=dZkq9T19fE)`Ny322>X=z$S4AO*$rM|7RoXe{Aj2kj3V=!vF zRP>ff@Z)g^FvmNR5d=Yr6=OqkcR-dt`weR1{F?h#m~kSsILl;KC@=OE`QVSz7HEW` zqaH1ae!#FixM=jg+2YS>mvhIr(S(aLF;7OGP@48$?@?*gcQhz)7}g#>njAa0mk>d; zhpt?LwXcT>g`*I@UiCiIBcvhqLyJ-hse^}IXEa6nKCAudK^FMo3)@^)GgCnyT{W3m zfz&tPd!zI$Y{>+irj)H9z?H_;0Y*DO^9{u2+Pzc2Y7;|e?fEW4Qq*p8Cl)cmvOWh8 z+cm91JeH83;~jQgd9JO(keMY)y0Cf^KSDGu3h$na-0FwE(Gg(-$#F#A>W7+#)DP?& zbmmA~xxKjJpmW z2ItI^%}9ox+*a8h8k;&KKmh4^pG@WaDH=WSS2bt%f_^hMK!0^*5p+KZa=^64KRqqW zcSE%^d4RZ=CmBN^*NhQU9H-(Z$j4juGDlTmw)98CIPJFn7`y{_AZkS*U{gA}w5FJW z1A!Yy8Xea)3>c4L>{q7%(7*hacRYWdBOf+}eNkN+KGl1ow-a_a(`Pme-Mdt@r?t31 z5-s}T6EcnWQfq>KZeMz8GgG3v3}sy|4rZ$ zMoj?D^d*n8kAp{lhH)4_W=5_rsy(kP=@~&CR8nj)xxks|S3gBnJHrTsu*uNZoBL+rO*}XL z{3g%uC|S_)@-n`l2srrSh4_R>umdlUT#q4`KC8>js#u!T)zhhPt^XpQ*+&B3Am;Gj zT@Fp;<`lSyEQ>W3p`4qo;C8Jz896mm9{PJWM!#YY&)N;PMC8L+oL3$ukBAOcfDc%4 zzRl_6cT-0QYvq%_wBf0DFW&-2PW3-GmEU<)(-i5IDbFo^g}-FUZgL(D$l9fKZ%{Ob zN6kHWytc9SwyTYwICQ!o>?rM|6?n9sm7Jq1;5_8J%zugPK~;_2&ovSS`$qBmsQIA% zwETubn;%~)BM(GLt!%FA&SCV}Um-osdR|n@jfusyz(AS(8G`P$JzQ=#7>rO73)Es| zHKiP@j?AfmC9;~t{hd9TYY0M zQX_MA`51lc$y4iJwz}|FG?i zj!Nm1qi;f>-4C2L%=z|K=G_w5EcT~sAW$8{u3SFywn-FZGN_W~TmO$&eHP?(T%Gf3 z&3sTAuA~lK58KU!*qaB+PYS5Dn7SvYjA8n<+Kd;mPRh*2XbDTKeZ({Rr7;NI_r?an zjH;n)-9nh9*c8j~!~6C!#4~Zv|IKj|Dx|c;<&)&4jeW z`MmCn9Tp9-{a#}lOzK`u|3LIVGd*rZbDzX$??-j6(XZdEaHm4&K-RzJq^Z|Eh$()r zof+g?)yGc*p%jWEWXQ3T=|h`ghck%4sfzyy#9W_ zz?kh++3W@Be9e^Kv1V)|3ZqOsg>m6_i+=30eeYNo#s{@1wb@K(3dXSizwHZ+#)UBe3k$siv3cNE1z`*@6 z{f6&wTRPa)F8|n#V|)Fym;9Xo;-67VnwB3iGJ}}YqS5Tk zpqbCev5E!qysVWjG!jg()Dio&p6`$U5GtN4PvvV|%k&naXsKLp{0Q*NcRVLzL0rK7 zGJWnF&kjoAh3(_%q-0F{pUeGG{y7^xe4CS^C$0pY2pH}yA$%-|AxRWUucz|AP% zRyOMllXCC!CSO7OsFe|UK@+ofMe)B5XKjZ@HSEDR%Ss5b{)0 z8z+>(Be(&|chU&hDr-gC%8eIijI_zGeClRH^hX1&$=@FO$b^%P4AY1}-h%e0h4*${ zi1lpAst^`~a%TfY5FD|-QE4y74kTm7&C{TYikF759q}!E(1}6|^JL&Cm@N*(X{U6V z9yl0ry@>VCJ9k|NI4zV|-;gkO7wGfWMWRc3p&_@@UmAKFBE{8*%GwUf-i)xtwI0cE z3n|;j)|+&#B=`4gR|))htfS*DXh;z&L@>h5>I1#Z)@L!2QZna$b9fSC&hx!sZugQ2 zT?-&g*N;dA@ntn_A%+rLx(QNYM*xNW;?@X*n*XhYtYxb(gOJGO5XIwgfnBSDarH|< zXhY|&5oZ^+Z~gE4i<$4cm?U+?=YF!Dh^5JMkNnh`V*qIL$nAZ_|KsXA!{J=Jw)akz zL`k#+L5dQ+_m&7^#vpnpB8bs@C$<&@(Ty^q&6p9r_eAfaj51o(i86X;_-@I5pZEFR zU*mB2;lA#5t#zK~I@cOS{m5*Hn$HJiIK1A|pKyEOPT-yr;dY~VF%YOfMMgH<_HsxnUsdVlsCK52yY(6c2WvE>1bilsGiRjG`%ty|js2HMD| zGALh;YL0%9MH`>%AjFI}gG1hV)P0@H+OUJy=acD^mtuwtmv89Bo!|X|4^5OhWE>EZ zEG8}YzWVj`)@OoQ8!oPENF=mgDqm6kmHK~Dn{1qBI{Q{(PEcWQxn&L;o+8do`AmsN zc-a2%>|3=hG-vh4JYB`!${FdVPS>)E+j~b`{MlVGIWMsBx4S|~606E9f|c*!)wycQ zMLK0()L5aO$7ALvv0}}Y<{?#kSoTE}yQ%kWrV<`&`U;b)6t2Meun#=j*vX%PbOYpylGK2zgLnjtpXZ1ow zKkZgz9!LJ>(Jzk#9ZM?Esv@8~&~{q;i|)(Y#jX~{o2Q{b1iR!_8fS4pRZuAx0paWA z(X6I;I>dY>DyBfYYmg|egZ{veDh5kd!#$?hxfe(7S@|*|rE~MpBKrDjGMi6)XBtO> zrDE%kLpi)_0iOWAr`3OeQo2xW$7|!!WFBISZ2_@WM}z*Ax+RCMnNovo33IhWCO?g= zj(obA!y)53qnitnWFD~B6u7op&fE9Gqm~k5Jl2?><$1N|K~^LMAo;*9U)(h+v=!|i zVx_uAc$X{VxA|s?=fbx$b)UQT&9zhh?kt{}GADH}PORqP;5ORZ1nar|e{!NY2$QdM zz0v%9y$}*_I>pA;;u3;@;F2t}Oe{LTqj0mrRGv_|`Hy>Tc^R(lEBd7FHo8w)B9{Kq zDUhkK&J?t2b@4j|a`|X9wr5A1Yngsh>Q(O2)kI5YRy%&_nC8R{N27+pbFEN|1I~dr z5r{jJaj@`rm7D=6@g`Y<3%!d`W|0>1op<7|HtMi7+?~x^Blpr+`#O<}to~MpXZ!zN zz?=UftM(5~YH?bptZk`ei68G9ZD!q3DCWuLIXTWhnVh)= z!9eB~)IAmIs2Ta~zpPdRH4d-74#4*f+3o2<0L$aSeh_sj zvNS6;+69Kt)mxe%oi~7nO*164RnGBfEq%p3ZxTTsgu1ty7CUf{EmT7KAJ@oov%>1O zOxOThoZ?5w@njZDMtl-v&YdO?)1wtT5q`x~BQ;Ssd-0%#5=P5h^rA1VcN4~8Lvy#f zR8E+;(#dnxZ)_E8J|wykRC2NW7FKI@#v0MOPmQS2Q^s(}a12cG6pX4`(R#BGspjUC zW6FIECrUv--vX`#@D||`W3ax)KLj3MA^pt~DW&~w+7yh$X2OESB6MZ!%Wd7?b|=}_)M z%}Z)TSC7^~Z6QjN1(fn@)%lKA6u2tc?|#cjT>m%M#;r!J2$XiaH+Oxia#Pdj5kwr= zWd2Y$dHLSh=Wp6nM5(Em5ph>T#fPOz0t~U*<_^f44P`6G{52XXeTL6? zUV}D$Uz$Hji@o2wC_{}(cd^LVI5Mi4isAQ6QI3#iHD+-W_WAE%8h_JX}w zi#CHIcO|I9Hx>A}sCMF2)2!(*dyZ4vKkH-AN>%`E)yA9z1gMsNTp;?B&iO+B^Z?7h z7Ip_xMN^J7#Alqf!DwV8&7&I+bM_~|$SG{+NCj!7LNP0y7nsbzIV9w zEB9{SsqsL-J|Xni{q8(>Aoai3q0MH}!hxf7u4hU-V}{3|a#$JhVBI>)6M7)m=U58A z0geLlc#6$)(8VwGP+%4wjVuJNK2v3u9Gv+cA7xaE%)CBLo1kTJ+kLLDCd7J%nSLLr zb{2)XN-S$$Mu>9_q%!+-y3Pg(MWNDpY~nv=8p6CZ^<%!nRo+Z{7Cfha$&B*t&lE_N zSfR<&XH%V7JOWeNg3Ofu*}Yb~xa`bj0L4mEA77J010nF28S$SsekTZg+J!}uX-hsd zORML_@zF`_&b>Xg?;p>nhYC)5pw^B{(P_Kdw*#28cm(ZzhDLft1xxHs!_ZI7Bc-AL zE3btzx!xu!*VN-WDvusFfPm#PL{kIc~J#Y&T%kg2rUYCMhC5TK7sR9$kXwd#1k z3Nr0kCb}rlDWk)D`Y8jA9hnvCz^qlv?M>Knk1B zR9r%-W*6=-5=Xkyb68y{G#CZh7%6t^m3pl;-uT=DNEtR76jF{hpAR0^Y#a6@)*hrQ zNKbHD%&A`n{)2xBs)8&g2grKf-5YW7qsI&9JkrYo{_IZ=GfJrpv}G$gR({Mf9B2J$fY$1juYtN+6R*&_SWUtOr-EtU!%rR#-hOLc)cMXM z|IvTftYyA&E#bjt={dDc$E+-QH|EZ!%0(VBU%dhMa-7s80R&1xq=oprz8G8vun0w# zqBSdB0=D1^$zXH!fk*vcw2CaKx^|IUb&~Ef4S-N>_{c6^s6-YvU-LuKbJfN4=B(5# z&x(MYYt>pUeZRrARmeg=uN=wPxmgmlJLPg?7NZb) z<-5$9eI0cX<7M>@wmLvaz8ncV3y|DU43nJ9gn=yK`b<2@-TvZ_Vj|5~sfjjMkocy4 z37}SJ-%9G#CUuX860JBSCJHw!eO@(-)DRsFvcBwKeq;Po;|$Z#pvcje9oBG3tv9PL^{R{ zMr42D9672Z!^U8g{}@E_%MYmh%N2}A3{>&JU%?Y|whfzNQ0dVp*Yo3viS@i21&4&L z@-}P!Qe|mYvuYD{hwJCd*lG%lPB!@}>L+wjv+`m9i*Hi506EOrm~>un@Brwt6IWKt z!feJkzx(`D>GM&n3S--6;_M|{qx=Qg#waIf)T*fp#FS*ihEHX1W z$4hb_W4_zLD(|t@RCc(2(NN(}`9GJzRc_4hk+)_s3u@!=A2AKBz;W0o{vgw-64v44 zNI}mtv=rT;Wfo^<7 z6sQMKLk1A?YtfPA3uOos)%inWR|XYDB|tdiie2_rI8hi}wrWO}9odRam29mkUZIQ2 z*jbtisvur+)VqX7N9!6Kzp=rGOkJY{W|AVUN}EKg$)lVBWZUdMgapYXh+!9J22{Fij*XTt z?sts*iVh{xK)OXi=ofR<9sqDau8012J zqRimM=CGqg9EFi+7#}1p#Z9%;{2n(Aa55j%WPh9Ke?+5e`i1NDhK^GDv?#38B&7(U z9cdc=&h5s~O+wp4X6zNm7TT6FDG}aXb_fXyPykDM6K@vs-8O7>3n@K0FkqZq+)Si3 z2AGAf&vQlf!0cDoJ!8>LLR*HrQ&vV|d8{J)k{kWnR)_VC4dyp)X`t$6`mazUVwj;o z=6pZ(#dOtU<0mkc_s&m5Y4Pv6gIfH|%R(*RBw$jakzqeOlXS^sG=n}Nae*M!`-|SJ zW-d~RgvVKKXLW(Z^gy&|dcL}+Q2sh5fRl2z;rr1@o^;JUi=tg9;fG||IikeUPEb0b zEq%|z$TwklXiC;|&dN$fy2(9ZF2MsK-dhVUHJ>Xl-;}3oUqD~pp9g$@G`9w{zKp0b zA*WBv{3itx;Wx=`c$`Y!(ZB51)Tv_HW5<6kU3bB=a)U(UFp1}AbED@b=fhw=Wpycr z+KM;(>t8?O$#`rej`t7?ezvGN41hE5-tT_@2WQ^)iA8H%&-CnH>^I2bZ+O9m7wEH} zJ@bQp7PmRxpP6q_7j~cD$Yb;{nL)_gSNb~^ zt*!oq?I%561&pJ8yI%A2nZJ@+{OR4-os5y>iR1;(#{oZUeORR@fj%IyYd8wrLo!k+ zXK0Bim>W^uv)7&29#a7|7%Y-IU@mXir^TyOf4GQI>cZY2dREBg;hQ{OzT>Ez@yQEa zl^L`no3Av7YNca`r7LygT8}FrPx+>0WOs%G zYz`rA=DJ1{1UG5VvF*O}{uw$O0nG-U<;rK+^}ZNQjs=r)=_v$DA%DG3%^YK3qUZOM zo+qep&o4({fR?Aed74(l_fx;|qr@c%n9X3ZHcFkP-t5AyMp8(TG~jW!R=Z_V_yvQn zmMa*zdLrRVR|q9Bm6t<+k8E;Uj#aY!gE-=l0QBNF@H@vfd~WA&4+FVF6l){RiK~Bq zn@`9elZTvm(vVl_@=7V9ifxYnZBeIcjkl3+Z$|e+yi-#&$a5-&PFaS11q%J<8K&>Zimi%;mGqg$DUUZSyA>L{pjEO8Q!re{!vAEi@hPEj5|K?B@a4 zGB%@;T7YoZ5%;8m@NEaPYhtTG;Xi$#sv30K@~g;WrtPaf1SYxvRWe@=u9v-dec+M& zgMcfh3w?;$=r?UI3wvhVeJYG1$zrd<`t41uy$mn?{_UE2pMB*pOdV(Hlci!J@(u(f5A<{QFXl2ZTu)D zWN;JV-|d-H3uR)%iawQ)zEanr#0VER9$bu0q;>nRoE5ARyXqHgPHz2aJt(;%6yPOqX_6Q`S$lmltOthpfKzU z({F^M)+Ye}9sj+4wqsh;D}Ik$0e&zPE{YHiD9Fk_CH>q9H+a<8L4h)aW%&zF;%d<^ zBl_l|oHchE$rHOxCrsaAE>!~G(~b8n9#1nqaa107+mfSxIXizz4R6?XMwd;S0~u$GRMoU+kEWmHLk)?a%)VWG zRyCH!vlc?GsA{`!?#@>$%$-?r5u2*Z?nV?ZZz$@XPTO6fPzhm!@zFdB!8}+(cMhQtLyZti zkcyCAkjAJR=?(ka6t0R63q}de1ziTB;e+3K?V~6u>fED`FN zRrPiO(suPjEC+GX^n0J~Q_u{g+*Z>6_0zq)a#@zd1!cv^uXO7T zJC1`lt@GBqLr5fKz#2Jj@SI_WW(HK^Hly1%+zW*HY;Qpl&bM0#w}Q|!WE&%?em9yLbh&@5-3ns@%R)@O~^)MV9RmST1&yN{z1V6<6Lw7Z!`z%w1gf8B* zck#|C00gW|4LX0ALN`@co}L(=hVT0WEDo|DL$ikgnnEul0gjdhQy>sFvMT7~xIHHi zj0SpJ?hffbF-S(pEgP~M04A5^;*LFJVAG-1Adj1*dM1PvO%NG6z_d3F+@GOaYHj+D zSdLFTU+yy+E+|~d;-2YUC6oB$E>09!MI~W?fX~X3o zRI)zD_iER*XsSZ6FysM=hLk7!tEGnIRSGNZpBzvR>g>7dKOb zT+%Mt@Q1&Dv*G7Q&Wa>J8#_t3p^vW}5c>EY+=jC|*Xu8R%EaUo^9YCfM|G|u^1%^5}W}6^C zoBeNBQ|IprG)<4#xgQr_51BssUq~Bl6APX)g?3o-9H*XtQAjVwxLOvZNbo{()1PWf znL@{!{Q@;WoAesfMG+$hV!PRKM}%pmle2gR!Lq+bp4F&U%0#N(`%>4oH*RPeasEY1 z84FCp^?0V^6za`FvJ3M`{0*2I1-iXbM#^;x4t3a%)05J*AK4h1`M3#+Sds`3Q|-hx ziSiwj68`SLoZ@*-_NVFH3`2JTzQFXn^M#txf&~g05s|gb0xs07w4KzTepCC_y8iA0 z@M4@iu@R#tX`d6{2f=`mD!`w5WsT6s4{C_rm+jz*0&|>@jQsNHj9P@Fz9;9bV%K9k z%gUT7S{et={0MWGN})}_|DU$fa#lV1g@jK3%57~H9JnjJoTr%!QNJ}QMO3kSjtXio z-PfTt>70vZE!I+KN2rg=LsBI4m~#%JP#gYK%^Y%Rk8L(j3kUak-#3o{BdAJ?6GxnX z*BWl*;Wm4TM-n^e^`156yN@_`%OyCN?S(}ZBNwk@x`VpT>=L7Vyo{gXlR4~4tOpai znF!E)bry#BLdaWoiV1MJ6Yfwx_j~PyVGni0<1x;6KYyol7eaE#Z$JIrLVY~4J7oq1 zB|O6N`e`pWB&cJbwjG$^M|0G$RfBr$zjszfLNJUtBKb^36 z;}aC&!lTLZ9n>~(`$w??;)Yf1>f@dDe3@!Vu71jP-(_9T;jxRe0IzM;PQdb61z0{i z&aj8y3qw2rW6vvupT)%N$qZ@5i@vG(GjOhWjpbc-^9OM8jmU-`DZvVFMKriZL8w8k z=e@eXzJETZp4PlxVS4z%g9noXZ>4*@+?b!WjLcR@&E`E({#zvE*%<9bsiNVmyJ>35 zQNZqQs9}4Egi@$`5Jy+GNJaZ+x(DDHI3R9*0F(zrc z>)I}JXJp1bGbhX|V*;2BN#l34aeEqoItf|2sa9?tzn`YDb7AV6X9SEgE1L~Wnftxj zR8TN(7REyc_Mkj&+Wk{~mI_iP>$|RP6+NS)Ad$hAwXIe+WS>?Tp|Gnw+d| z_~d=qZQ~QNR*nW1xD5ECG~wr&ySwu0-yf{E%h_EdWoZ4N;IV)??lNMRSK}Kw4*fnSJ zpvGL%o(St!jCWk8Q zaf%nu>Kz!9R+00-%1N%q5IN`EfzpAId_|Ly`|Dk`JH%`8CrDtZDntHZBHMf>^U3saS6s+@0wSAj)s3vw}Omch0)0BO?eq{e*vHq7} zu_=^TL&j*_bU15rL=N`x$mMTevGP1%P;o6`9kLN0pnuv(*)!5dU8%g}zM76S?qg|< zCRBrz83*WTeOIl%REjl^iVFe1AIbpi3V^9e^IXGM3|m_@n0r!+xOkQ#@Le)OotpJ> zVC~7>-%yh1W;oRTm#70`E}<;a9?|hN1-Abyq5^i9UP`m%YZ6rp?Ak#mvBlm#xANZl zvUWS{Be7aym_6X)@A0Vgx|Ryyar+7Xyt{s#Q%y@H-i| zW@)kOv%YS1)6Azi*F!GnNKa1wy<~uzbrHRg<7djw+@Nvp#?2>C(5J88z;AcO|5>1f zKs|55wXsgk^sq{0oI9rouy{z~fxLl4xo#bGBpKb0;g{B!G^s*s8+{0^w?a--V-c{> zgQmGd;3zu1RTKGX_+yha*T^%^>+=fYtM)9MS{6i%T`9l|-}PyiSge(dDS*7?7##9# zq7c?2%dnn!%eM%-J_Wv%qMmG0@FI>capP-Td@4uEtc1}8f5!vdJHjR(ZqFpGQbe=> z5W~30$JVZ|#;=nc*i-fx?e^!ET8^doC4Hxk_J|m8m-Nzy58DqO51&DU^6drb>$e1( z9w+7;RKL|;ep%ITdFA}nFJq4pbUfocNtSNA1-e6g8vkE>*%&}ZkFfSe2M|k!Rrqq1 z^SSXntfy+18Vyg)L`d2aT8z}lEOz9}y;DrwExLn@lf4@CnE`!rFQ>d34EwS_VFWIh z=#^2mRLyUdGVVjcjH?Ja`ZUpGtoQz5-T_h(xuemgGLWwf#RAO;LLmopAJ5A)osUID z!qT{W>_N@wS;ql=umcoAg#BAiNEf4`gs`_TEv7A>1VhZ@LK4tBf z^_-774~)EM(Il)0=x(_-`Ud^a;!NzNjbL~6*HeV!DejL z<7I=s$fbUx*L_x)(Yq;q!LsMZ1#Pn4mmW(IXP(5RHhw=^lywX&f(}a@^o-tI*Vlo( zH%-|ahy%t#-_QRo#|@NdUm(>wTn@@SQkUL-@|$Da&9#Dp7S>p;;VQfXDT(I`RjY9q zn#-RxanP1sKzi3|-f%K*!Z@bBjM#}Em{%zjl9v9}8D@%l&2o`T2-`hG%q~QPqArd3 zQzeoYlRC;|)7&{|EP-e9WNTdP{~o~{0E!@QJ1i5WCI$L<%s)zSFi!(Q0SIy`=@9zW z^a0`klf?q;@4{X94pDa)0s7kqGWL6ln`A(}1?&T&h-KN$rXWWv1*FASO%~fy|C$$l z54Wk=2DNF=T>(96Q00K=qe8X#UMSYNE` zULB68+Z;#df%DvBb z6(8*x3sL@k??p+(b;>*A-kbD$*sYnh1~>n@vG8%V;>X~dE1wm~t|_v*u9feqmfn?B zoS5!C*!1;i-dOL2!33P$R1bQ3A1}_%+MYp|?2Mv53}}S|ZFYLuSXu^4&3G2nNDOa6 zRul`O189bezLX;WQb~#MYFD!rhU7+dX*?xl`QtUVI64}zmVC7wC7?AsSDf(j1HV;! z-F`K7I>rvlI;`)(W+6v8cjBz|dRsx=kF&Q|GzxnTdMIUP9oJ0eVI&&-6ZA>?aAk{d z2ZvPN;#+~@vvDww8<$_u^H)}VM8t0=!IOxr+RB9b1pi+>8*EAM5XOWZ>62aAD&)%+ zbtfHe9utNU578?4RLGs)3(#9Iwh1c2*JSB!*ECcG8%sGrt-_tmsh0O^ItEskR-0u& z`_=C?54{KI$n_SGwaiN;syaM<93x9aM~1n8-(m(>;4$Z@Aa5TFKBh-7I2W*Eun8zl z&0rM6THCOnb6=kN@DJB8J(gOximK#Q)oFeiUCR1<@I*; z*25mTR=s!bphN%aw*)wUgWGHsJ1_~mOA6?Y(E{w~I8C%Pq`{+CqGKt0#t7#1ZhlTl zLrTwzI0&UlkPr2*<|gzBU8PUfRnW+xt1|z(rN!vyx&}f*h|QranGZzxlv;m2x}^ox zM`6wLMO6?U_M-{kH>6wk3XQYV5}!>lPG*SaxY;H1gOAQRhYf6v?dSrDZO(r7lewt0 z?*9TF^lq-N{%;Zg?!76erP1aKP0>o?b(i~3KY4p4?H<15@{2S7lFoW(xBa#W&HE&7 zYn^8sS0@GPmNL2e=d_Y((?RHtU(zdOh-D^yVpG2-RNCW=r|-080>HlRvy=b*uvp+> z9h1F!)4kW4HSuD@C&?)35R@Rsg$VPJg?v~B-83StFc`PpRf8C#NFI7R@cw>@2Sd$A z*Ua5oqJja<7f9z@^CBc0*^*;}tRLQv4B6nR3lv_`tL1%~0?;G_=2CI=QAlt#oXwU3} z+z^RH%VO`7Z4NwBrfk9AebTOZ z;}%%MFm`8c`D!>gD6`izhz4D~w<@sP={CfkkD;cMN^N|5zw$jF% zdQMtiuwmXyjZHTdk{P4QCi3ITLTPNnq4X6N~B-cp!7T&PWYBh;pOKL31@O@X8JwAPQI1O7rP~sYh6!9}fSi4Mx z?9W>o%<+=(xcR%9oOKdd*3 zm_GqwJVQU{gcwbdjhbf3#^$Iu0+*|KgoP1-6uGTIB8lHEMFp6G8wLe%S=YNXRQU3}Bh zo^q~t**e4?ISG~R-^fn)rfUnU8PW}Kb9-}m>J>V70|e>1+cJM8*Q5gbT|nMoA2?D; z=e(z>vmPq=y&0BB>{Bv54tOR3VgW8UH^Z+NIO3;FDjv;@4?lUA_4~*uzuEd-%JA#s zZCBecO1G`gJHe7=*4@Wz`4~NkhsXWPO=n<>aF)~=x>lY+cRCxUZG(>V$k0yc%Q$H& zRGncEM-gw)?!mH?+UFc$zDi(YFp^kFl{a|H5Nn_>fJ-HzJBYsyJ#1hD`epqRK}ke&sX9#&{gN)1TTyku>MsA1cl%x-}>5%<+4!9T*fuBq2` z@P<{E9JY~&KY&dJbR^tS{7rF^V36*X#qDBT)$IFXA*`Xg0+%wYXih2!LA@3*&iBQD zNH4VX82$Qa+TDjI8u&b}xGTf?i-(OKn#mdf;?{?cA-^kfGg0P9Gg{u8v`=7n<*LLq z^KjQim%Fd=_}NmPMeVZY0`h6_F(>m{BlBdAS}-`8Rwy?-hd$oBiZE?=+6>IXt4r}1 zM4q)}dmHj2EMtYn4?Q{1<^E^5sAGRTl{xe4x=m%+zqL4K@ZjqHz03>o1|woqs015j zm6{|*R_Aa@r;0x{LN~D%$?a_NOPQBiLPf}rzw4-J6n8w~iO<-ux>p+*23gTcd^J3N zrAg_>i515*uE;H8LHPmCkN$@(|HK8^SL~lu)%Fb?716s#EWUr9w=eG;be(3MA;9gy zv#JAUq~sad*j@U*ALD99Yc$M1mn48ZiXr29lJr_EP3xtvY*%64gU`@DZuJcUG#GF8mQ z#8?i{4dP238^l>s0v(<#C5`y(;SNlMH>c>I7EHF4_)A*Woh?{BXB|g*J|p*hU7W*55IBl zNZpM_ha}0~RG7B|ovLvET3f-sE7ub~-=%8H2$#~LJEZeTX_kIkle4E0x0#v$3Nv=wwH~{e*B_5XFTMcbn^SvLuc6D9`~!@5y<`At92I-hf|IHCgoQf zKOQt?lqu65CoC8HMKxb5ZeRcYE0B)9rT@DOW{N;#^C*f&$>F`qQ7MDP+8y_?rM~{`{XM&a$ydI1 zK?Yx443--m;yj>}hxbv@nghHIld$QzHT}do9>ZVtD!IBDi2zu+pL#K!dciSD`}M$h zf)!soW2G}FsC4Pokb5n1t20eO4IufV$dF7cbpW#bJ~}roqv-R#{#hRKT;jHJHwpd*y6}@+-EigEvno7K5#jXt(#aV=-s;B?rG1aw9{>>9 zTv;@rA2@z+4-q03Mr7Su=I?H_%;cz6pBi|?Jj^v9II)ehmLBvilH$NJsT?(Le=)v) zZfx%P^|6HElC*u}ZlZ+}!&_aSuwzg9!#0Ij?b-o@1?jrJ>U2csbH5cDgu8D8q089w zr)AVDUy`y4OeCeBXwRPiL*_R9KxKY1$;_TO>X$4tb(iQz{r6tj4?i3}2G_{*AUmS* zu`W>ud!g#v6Gr{e8moaIMCa?4EP+p(t$YbHly&mr$2z#)TkWc$G}Ol>T5aH}ny654 zyiG=ujW9$?)5>_#Cpny{LXYL@7~90#d!qReCpN5iOmt!BmrzUFe)Zf4 zVdlVTf$1FxhloRzHm4cw$Vy>hm&R5*fTRDq_xJCJy2jWgvxj+n8WKR`PIFAUl!YC- z4s6d#$H9zy=FblhKj_u_c?$DyC%~~!vV%4W<6jdtcJJ2~?(RmpH3k8LpRNWRz&f7W zfU)Hi{5eO#fAWwEVooddJek(zX1p}O*9=;>g<~JYlKiwfe7E4OfZgz9*SJw&{g^yc zu5X5WsrqAuRB&0m4{B+m{b~d?P*cP<#>{&Lgc^iT#u+Fxf2ppQ?c@yNc?`d#AGR7% zbZ81fjxj>cC2OTDWhC=Skh0$GWfi9L31%{bIe4iN?ZgRHl~HwlPwzmhz|u_8SM^@i z{x#sH*`OBhgdENN3G*HPNFs{oK^rS;pfm>MR4XEV~qJPU7JvPpp8_)eqAbJq_0 zCwG>1q@3_P2o=is6hcCr@YWsFBBDqE z&>p5I*PJm6!8`ywvOQq7Rl20W>+qSaBm+l?c>ygoh+L_Qj1?j>EToKxXx&5LW!k_Z z8DN2-N=`RAC64LpK67wlfE%2%H^P!s2!_9j>*JVuRiq3grUTKro=598!6_xpzUShO zrK!mVDX%86G>NP}^a4+GXm@iL{6wrQ#{VgU*hf+|LiyD)t4Zc_m$~&dI}7uBq@H#EoMa1t%H*x5QiuIJG`@3Cl zr?rLTaPy6b^8Qbd?Z;o41Kc3OjY!vTDZUk8W$%UqDwCo;Ury82R|gYfAsHcbepcp{ zMGp@PDO3+7r7=fcObZwPRF2ub)n`>PUXs>XQx%p7jHxuSf?*;j=QT?7tun?lM9=-2 zIhjqYeR)$Su~QP1=^T;MOe&&%M*+ASJtZs>OaA~Dsr1t=dp#hA?!x~xQ+UUxPn{!7 z@M*j#=Xop5p8Gi##dSy+E~o4i%UP_gtiPC2qMi0t{i|iS;#??j+(+eF203y5E;G8> zh}GiIzF<^?_4za7u7?6$`B^@x)5rqiZ@~8Ln4Hzdmx}6x2Q7v8DnLv^Jc2|L0rVOG zvA{{a$aR0N6WL+4+iDuU)x_v&?(T%?f`5dBn+mmId%XYH2%YEfIu(^Nax*xD!l zWzTQ&fG4AHyMgr_D_T2mJ1L_IoN($z{?Y-+AE2^pu~yN;FN&W`BsOO_;X`}rL4`GJ8ykrVidt+I*`k90%A6Z(eRHRR zNRRcM6zmktrtccj4c#PuSaTmuDOHoy|C|aeG!rolY#SykBq+gi`yQcPxdndKg3j zYmLgo{?;V|u>+&4?!X7uPqflE2sJ3TcGc!Ct1Ts~CYt_gc{me-DOfDImvV{djzpP6 zgPz=4RuA)()nHKlI^!l;8tD+xesEJ4O`W7_VP4` zxm;XzxJ6>va#sb`4{ZjF-kjT0*A?W(R`AP|4$M4WdLL~cRworVeJ_?GTS56)Nz%E% z!(zY0-vVa>N9%1gzRBD@VfowkiiTg=e!sSY8C95Cev9V8o1ZtLNDQzNRvG1MUPvSP zVa}OLh5S*yIQyS-b6B7MUW&!AC1yIdZ(xTrx^s|j;!#bH0O9O@@`XV1#c(RWzr#%V zB}ZW+93>c{#USQ2-_IJh(}F_=P;V)O(@Gj=(d=j@eUPS2cus7UpvBqfR)F zubvJc@BDn&(hSIsBy)N%o_SSC+7yV2sfwda-y1aTj`(=~z(u`EC61U3nD!6cH@;&u zePZ!L^OK)R(mMtZ*(6r35J>&2%fxi_#&Q52sSljehv(0#irjlb`6*QISLd*YNjA0| zW2KV}Y{d;;318^1y`1^=(9$6fk7Klz8PV!?etW^aCI$F` z8Kr2`E6;x_ChIdsRX#+h6KTAB6u`FDQ$%BS#u7J;awTR5z0#VMDMxQQ*~F-9e7FB( zN$M%!PhC}T=kSpG_?l`o^WBE{{`EqN;0#s4v*uwtll!WchptQKKsYJJ4+^v?b4oG` zOOU?5N@2U%z2vvz@r9>J|4Vvbf6Gw!b3e~uEb28LGxVe2duB!bJH-1(P3uf^b;QCM znVKTzZlAB=MctNmVw1@;z)Ekyp<5Am;?FVA(2y{FEAPd}FNyt~%162_S~-(6Ym44C zeq&}yIhnV;lvtau75-jGLSRGZPc=$^AD`?Tn`Xri+_oAewS?s{$XG_1&H-AW7+|r3 zgrD}F>jHUVyOq;zvSRcmNqK(4^|1)##jpB7(AR)z+=;Z7Z|q4ok!b)<;*4OfmoZ`j zTWy=~I74nGUVj7V#{kNheQX#PUdcFW%cz5BzaqkCpU`ec$+{5}de^9hQ^3eMaDPUy z@>|cbRyamnQpqss;SVd1F;T=@q9%_=P32GP#(v1Atw_;<^ncd-#d)BSi4VXv{U^`Y zJlVBGR-qZ!`{^w78ScM-m9H#vyQp(SyhPu`CE>KbouY!a4!iS_F~)8E*M9&4`ZBUU z|EYfB`EGVel-_99zSQZ;fR%*8CeRhEuwuT9>R}VE-hSgJZw`C-XtZ?In zu4Y4YvwO>AV?IEB(tQeN#>^5W46Bw`rc$t!8n!1jAl09;GNfrad z5{cvCNy<}k#WSS}dm$Q^Vc@Gn*P^QFXuu?K?0pICz?EtoIWx3@tI30-qw%VODjhLM zuWavC=Bxa6X78{5?uy7>H@n>X|3SLj#u{jfUVRPvdOt)&PiD z!GzjTEEk*F>PbjsU4Q|PRiLIZTP98B+i(OHDCB})**W&bQue$KP-;IV2Vyzs z+HaxZJ&&HN9hXnn@{EMwuIbgJ>ORC&aa-fjXUYyuxV_gBz`DtqIh_VN7v11*j?7E9 z34_gtoCO{lPQfYLmH3P$sKr7U8)R;O^pqS{8p2iq-Qg*;UKZP!eWZfEaAF^yecmAu z3fwcx6~tJ|i0Hh*9gUcrND*ERTpE)Qe~FGU#z*3(q$X{eK-u+ z_Bf;s_&OL4vK>M1f^2|_GrredR)#~r7#(+ip57^Tv0z*gR5!A)9@-+?5%8AaUTYl}}H5dFM?S51#`{s%f{j)q3awa(C%FKXVY89Ka9utl zqIrAA!@gZ^p6?j#A`i+(X_~~EfE^AXXlmPkSVK?{hA$dOfSw@q4O8f+?6oJ~@GnUs z?j*pqpkChLSY|Rt=#kNvbZIV3;AFWLEz&j5N1r`_EyKo(hj>k6?QS8}z$41x0I9pF z$T)3aQG289j$*=mUah21 zPFxv=vgW`07-yC9j$Z*l&GZ_9FY=sBob)w6w?>#hY z{v9XRD(-~xUHYuQ$pk%<0MGKEk9S+SFN$wZ$lL8_+D27ioZRh(fxJI7;frVUX`0&f zJsswLYb(hYG3{2dulCe-SJIVY7+^@kALC?=sdV%$k~$~W+QOEgEXpxJPWU9`ldCM_ zkhj|rVewGMu}^YnyZG8=1*p9bxuT(v!-V=Sp6#Fv6|E$Egs2O-njxavl2KpipLqdv zP`;33QXm{^;4*gyBVyo-!V#Pr*>I#I^E?+p*NC-K%EK~ zGE16uVCzxIQt9FG41jd6gR+7nFENrH{J=@mhz^uu?f+VW1Kp^8q*NMkR*x z7~e{{sG6bjn^le>OSj-|-tgs~z($uTlZnRsmwTGCNd6!FsAYdZ*7Ioew`YM|F53o% z)(LD^#{j5L&V+gaXbg4$AIdBNcscI>vGtX4QEy$_#yO$_B1$L{3PVemG}1%I&;m*` z2uSx}0RjRtl(f{qfOHSSDBTDQUDDm%?}l?f&wKyg_k5bKd(VIGwXSuo>smWBz_5PG z?G|8L2&Q66cHmKQ+F3i_)p#f&DzuIMi@u6!ETNwzd_|&>0Gy46j8HQ7W$o_Nyb;NA zp^ErA^;I+m#AVR_jAR;0$`qSL$AQ}3*VT~jKH}rXbW80IX%w$(cAi12%ysTH9D?wd z@I|or>*{5&*wB04aPnhn;K*{cpMEicB37idcT+Le>HEg+U(=a4XzUH#et^DB(NSkv>fZ zzIr;dyvFVr7jCDlic(uk*J=zzjmtgLIRw4He_ zM)m=jv^Jkm;I2)RD9EU$sWzs2FM2vtb!?3DwKYXmkNaFalP8&4+8S(dk;yLxZ0|At zCRuFA@8Ej6(3Zb9=lV%k)LdeHd_6;HgF{AHTzsF$~wj7Xv0@VJE*bOM2CGJZ=jz1hB0JQgiWXT_RQIbgA5R-iz_6A@iyAL9F~Kk>;S-v&(H)kNDj$Bc*lII&oeD` zG)vaWJM)ibZI6R$;~6f#^*?&94eeOlj@A=l>B^}{Bbvh3!@-B0zAMfI^EDOqTR)=E zaNonWQSuJAaRnySW<5v>pzbj6?Y>hz>eCG%J3RDc7SZfb;vTx#VI56=W23Fg(I9rZ zW;@%Z5q$QGCjb~g3TVCHkUYPnr>+WYgV{;Xk^;+iXZT-7GO&=WFBchBtbQQ$E#a0T zvWt)qc5A7t4*LY|EZ$7b=^<%2Y05)uIlQ@_Kpt_tl>&tzs(-Fyxn0f1rVFzqa z*RhCJ#Lvk2o8q9isQ+YmYB;voC@!Iva^)xWr?qUlNPP> zLzLZj2XF-dbB)cU_T5!@b;romC!GeH9p&*l^g#Jg3d~}*69*l?E%}d#lDiNzara)@ zOg__Hlw|RDB`p@Om%+T_1AluA=k9*fPtL^Oce8XI;P*)1e`V`8Y#or$n{3Qn;x*{^ zScgtE7C@@Q|KPYNn;!qeqVhkhuhsHe7t=j82r_Smju{_UW^Yqf?n%2e z^!3a24*4W`0C3U1`d~#Nr2-&ZGX*OVt`B3PV_V<%UPe5dlseWlhsSK7BS4{Usc%8g zZJyhuz5F=`Uy~?!6FesKGBF&Pek1FQmI+GO3Scf_QyGouKpLHrUvzrm-{x@bK;&w# zMkz$kpdf{&4+-0o@I}mm>i$E$mtIi_#6C)8ts%FVvyT`S(xT)L6=#&{yxct3G#6N} z2DeA7dTu($a=W8oXi&qXd>~ZxZq+Px#Jm}iy@~I+wd_P7-k|a~OMUKX*%Y!>BbSkz zR~792%EIkSI<#c&WnX^I{MYUTgQFo-x%+T#huY))^U=*W zjIM6nnk)PIWeU^$K@o9ECE+u$xj!^(i`c3>s{lU4!KkJ0TH^ z3kqT&&_+YbO?GmvW}M6)5)~9z7RIT?!OeBDfKea8N~1n+9+9D5u}6#*_V^$o9BvPn z7*Y?#j>XoJm5Idz(Ts&IEZtQ+-F2_XjJ)u5q{?dREIoGy_%9x=B-!@JuRb@kEeriz zLKn+6&XPFFnc<%filjTdPv@<>GgF`G!&SRP9JPeY$+bBY$_Ti(s5ZPPFSh^B^BugZ z>WKz-&RFvg2t&E%%*1^^37=!wLN%K5a@fLlCeM2;va}*<97oH4yZBhT&bv>K?tNdD zn^z``1Xm@JBL(n(34P)KK2?pC)0a{?hB5} zu~VW>L+aF+OEMmkf%@hsCgs!;{fpPn=H%kcXBwNSUC`lgL}Fky&ijO3tTmvy@L*)w z*NKP_YoTfDwlrceWw$?yvWcRO3Udd4O?7it||bY|BNSo-9L}3O2}=R{@tF z*4E&N1U&eSZ=Y{s7)agrLuSiVW%Ndf>f(Ln@&X%y-CY@i3Yn_kx9t)!-W~$|0L3VF z;%d$6%2LGB42^d0c{V31BGAjr?Sg8~fYSpo(xYmXhXIcef%S0-uRZN!k0r?q8(&`+ zY}iOrF9fbNBxtN@p!P4RvD{DWOmFFO~7j4VR1vEP4Rmg;X&K{nC3qh6U( zB7?yZxgC7}b8?~B_?O>vC7?>r=16CLHw3s^&$at&Yl?nb@+qs!V|&okDD?F= z=Glnk>|076dA$AGFbL{Y0jo9TQ8oLDS4JcD!|T7s&jz3kfPOnFe;wFko8c9tO=MVs zHK37x93{%xT;LoglHL)jd86u>b~`v+H$q>BC%&!kC|2|!WO(|)O2BrBmC0++4sUX1 zhW1SKEL=Ug{m%7|4k?FVed_yGnx~Q$35Ac~7Xze*Z(Uw(O8T5m@VHecn`dCkVM1Ql z8iaiGN1xsw4Ugf=(B%{mx&7{R@tVh5%QM7DD5n)+U8!zscJi7cDHtoW3H?hdUsJvc>>rn#Or31&gYg$@CUesxOci*|E2834vVVub=ykk zTBRxe37rDKBe)(HGSQ=O9+VMv^~90KFef*hm*NL=I5QQUw`hlm<(F5?wZ_}-E zc9*@deqmv7y;U~j$n9p4A+^KF!y*}>N^vZ=MN{OiYN?agtKC$Rw!3u6LBn9%SH!)n zKEB+zcoyKXu;Tf?TTA@MtT7Fg{ylrFTYN?D_;Bu|BLRNqSL4*vqfmpC3VSNI@Anx4 zJTgAtpG$n@S-vSotszX_eELkEvYx{lG#ufnXVwnpM|jv5xdU9c0r{@^C4H$%RbB(F zM$KH}Q$2#1)@y%nyEN#wT%?K;dtgpMk0NOJt(-~e^9G`1zQmm$T?f18^a}1n*bDd> zy{V-BR*`F~&wg#R$=4B44W3T^;K;|-sN-rgQW3vhUE@4dEL|;^i>-Z-s#IaZxPzLL zrTc{9AgcCs^Zl?l{H78y}L}5sDjc1OKz?gSh39O;i#U zd*-9lTNmojw=tJ+rd~)Lt!K=clkV!bS7Ec|;Z<>*JT&W!&fUGMa<2x26qIic=x&QS zv;%(E&!bd{zgpPnpmtj~A&}O?T(c#o`0oyb|Kajv?qt!xMhE1?nxZs)j!DNz_JiDb&o<+zAn4VPjEj}sO&#d z6R>kyE*1>bir4&>*zM{0ow#eQ)lS)Rzu_hMY0HxRSW{^*1T{l4ZD~08WAJ;#o?>Z| zyJY`sx{0e=7r9$(@-l=Mey=SwU#*c#)Ck;rHsm-pUp6uqQ^s|t_n%hLpNXYAOx5CL zUD@h&r(_0#{(gi|cpmQ@W0TvVC6 zO-Zy8g;(Y+y)d?=wrYG$lfQOj8W5O%d3PdK2Rv_12;28n>qeQBnyi1WD%>4PJ#)<; zo;<5_v8L3tM%kn~;@R|>1>RF~wvCWNCvJ0FTYOecaOJfUK>y|S*A3|IMcH3s=M!@%U__2!PmxF79HE-djj|l>A z!p98jw0@YD^wtE~6AcX{56&+BrAdRka5k3Qx}+ZK6DS7O49#hp9#+khR#Vt7ofq#6 zo@_<-lfPox1qm0>c}ImpjD-jb-`6oBPbG5{zftvebnVOyl!+M>o1&s&F7D^^Hm8O> zJ&`|O1BfZQe+$Y&+DhkFmhU!VZ%+0(mO{xDSun`wQ+oWOp$U6VW|irew>8SuCs9?B z$(!-O8c&&+&Q{e-!P8;crSf;Layzyn4~VbB)ZU4z06uSQbAVPbZOJZk^ziMd*QZww zBzx_Bk>oZL_XE4z4rzk0lmo2Gekq3tD*LseN$#Lj^+#ZPzi(frp2Cb0SFKVT%Y@&n zfJI|uc)^=#CR-C>?L!=m%+#9$#Kl1&2DHuP_83`lpKs>oNu!)mvzyMY_VG^q_fb7C zYpo?Oal`q6xbS~Dvxw#5$4Z1XEPSg11D^?}AXL{C<7i_?%buU~fa)XHIfI6tiKJX5 z;YYKJOl}-yf@ekji8qYl6Jn5&=(mdhYdf2rRsAGh&u|;r@Sd^wSWq5wl#BRnKbNEW zPUmmg!M%mPB*3jUb#7g5hwJ@azVqKAIlueZbmqvaU)Ui23|+6QFJpHB`UdCiVxL1T z#CI-L3em33Z}HMgy3%?pWvscy)h9(-1DvGR3NQIVJ1yz>BP8nfY`EmeK-FrwAbu@Q zjaePT?reyaYV9u9_1Ey)TK3-z2HIl6lD2r6lC$LJ7_ap?dETRR3%1FVv`DIh!hCIzv}rrHDN_GA9sTFnacgl7iq zNeD|(!e8($zL8&qWxFzKV+0mek}Xa^`Kp;fB*a~CtFDN8`GGI@B|{$PcS-q~yf?@j z)!9^zNp~XB<`7cbJ-$7+n|~WQ{Gt`~{tDXHI&JN^$DBs0`>_LUF?hZv$uhLt(Rw1Q zptHUS)CYUxx?u-}$NwHzjVU_;WvHV^J@RB0bX^_gSJQP0SsJX&;pZi)Ct{<<*AL7^ z4|mBhn4wrACLaJEZ0|Cb&ac-A6;}N{j1~m|LEEC&2uM9^HX|MRoJx-qfEv+(+X@I~ z`-3d&H>3QIT0e6q4jOi-#4sa@pS|)sK9S7Gv~11Ki`D0#nqFLzhh^)mSBwACz%Tqv zd>M(9|Fi<{-`fS9>0v|Am!@BQA=$F5h(I`=4~lk{N!375W~kXh-m-5k&f#DAp_wxe z$jXYIrYr!yX@ASYd=f=oZWnYo3qcKLW;kQG|MmNORocCXrEt7Qi~s{;dwgmXxUL>L zexz+tQpa<}2IggioiURdKHg{5;TbVL6GRE9-m9^8;*T=H7Km2>2(+1;rnj(kJZVBdpaFz~k$$FdQh7xpe{jGXP{W9wF*vKsc8VLsG%IgR=j9vZV5R!Q4#Ct467vCdOBrIx`{{k(fvCb7|$Phic_IFHUeytFqBEB=rtrTb4(k>;>XNe z=J~|*JJ9Z&kDe9uKMJg1!-A)J?yMj8f`iyXXv*Q)!}2}(>d4d$or@PL-aN3oc>3sW15p2!Yc0V4 z+#6##Y+|1mXh;}|%A3?bnw?BI|4g_;ys#ie> z1(hWOH$BK2B}TQh1Ee5lJ?}G1$>|cna(^+Vz$i=n7hsba3Ck{{@rT04=1Y5y4+4kf zvJIh38lG=ToZ~j7obB$#_AKY_SDSjJNVnYCRyJoUWi8iQeo62r=GgF4cp2!!ycvxL zg6Bb8y%ao?1a-Ic>N_?4D$mW%Hq~ZNZZv)0SbPhnS&{7= zIs*JqU$pe%QO&6yULbb(M4px2y^#m#xb8jQ?Ts)H?>p&whN69(;pJk_`F|@-B#b3e z?zXM*dKpa;G#dq59B$1CHjIh2dbGBy(05LX(~52a>T4h>taZW%B3`aq0YDutcs1c$ zJ&hlUV+`qs56X|IKe~G}^+hSm`I^|`z%CSfqx=LA0iPT$MHQ*hl34@$mE%v}c<}Hj zwgAaQcZ{(MXf(omKm*4HhtvF=OwS|37FD1_eGoOBBn6+BN7MLgFoLnH4F?{7v?m*E z5&xR71{u(^a1_vAC0nL!dxj!qZ%qg&wL~?3T^L>)ozq>OfpD6~=*|In75dS*)**E= zbGswoN|bd+=6bF;*0I>V^>JOY^BV)!`a6>75ry$==eeXWyO6HN6iIMGOvolpZ*%sxz?ZLLGShsO~ltrS&2@t-!wK95J_`)&B|yOOob zXhpj^HZ}!^o+FQ=;)+z;ArHkPVsV+ENO}ZZr^*yN$`O402pnfqaw7I2kB;B%0Y%78SzEB|`o}je=B(dk zlh5_a-*d7HKW+^v6{AN>5d_Ek>{`zA0j1mOb8>cjP)IZ6D@Y%7d-RT!0gfIy9Bkkf zv77f8f_4c=Z?K>K*8}pE5zW%zNrUnfd+#RCi20PUS%0l^Lb!}v+9W73PgO)yY;Z$P z*H(iDL5N9zPSyn5D9O=S{gnOoXN~%Ohtso6ej4xR^!F|<-sApDM)%VVcJz-5i-%q2 zVnt(zIF-zqvHhR9jA$TvVRukXTf#dN8QAfR(AjUjZk*?1T6z5bCZ;ss;x5+A-z8c? zSQ10}-&x!0SiNtrP6XOF)Ak__l6J{Lgc1>%BBZwnF z*C<0sWZ)B5PiZ;=aqyYHzcDT_5+S6*-JP=H@?(Cgh55$v_~y-wIZ|wm=lb;`6S<4K zA}xA}nu!l`gw=t(!th0LiSN8#@gAgoXcgvta&Hhi<(R<*7=>wL{kfW~$)m3TxLQpL zcTFo#eRO-xF(_|RucgCZzRTU#n^MUTWmkb9|2GgVr+~~JVh_WWON4)QZId$1G>+_C zTdkcf#U?1ZdeLeQC*7-Y9ZlPf`K?Kq@(d+;Y|VHp>-NpisW^HtZBTEyRqokASjwJ`GDDY5n@SUtEgD)9h>ScSd5p&XI;X$a7sCc*YNU4&PDbsffSE=8bB_0^bwe+8prPfo@4kPaV$)FnKw<8n@A$ zFY#_COy^HpiNLZ^jO8^%SXtBo5Weth$B3wQ#2kb^jQ=~ zd<n~)0I32#!%aaDHbxWB*Ow`|Nva?lFVI&2j6S+FoiE)4lnQ&I2J~rOEX84(ef%b* zy4c-})le2H0^)SPRh&(vXcId))G=jSO@3D}BYH=#N}ZYl4bOfRJ6!PdZ<#I)FORQ% za_oz)^|ho=taDgQo*mC>HWz=kPR;1OScw6-&~i_X5+VlL3{QK{bIDZ=R>i6^Qh^jP z5#sH1vePJ)0axKYsaI=VF3pE!FB0op58Ls_KMW9tplzdp$*0Rl5~%>#c|VVlOxpZa zxfjT6X7wT$X1Q-vpt53V2&~T%bs@GPg(_wcsd1V9*znuS-;DgAkPq5>Iej?o=v3xX z2jtQ(wI$H<0dgWN#=?%c>DVn~@ecDm+X&WDH%b0wYj+f(*!5NJ?mc}z=1{b>t;BEO zz&>%BZzmq&sDI>@dXe)}Z(Zj6H;k-%KBNOUl0UU0E=UEg1)<`NW>icE4Rh za|XVgHmfiX)K`Fd3G0kEV1eJo&Hx{Dld3&8EL%btw2&uCP6h4`wEiVWR<#Ox7%3BX zhMPE+FBCpHdm5xy3Y`M^ zKVGkLf76m@6JRdZFSyBj!R$!jeqL$@UY%Qa+^p`g$YVc49RCW~N)MM&*e_PL=ZB!F zwJ~-ZI3SGIJWhk-C$A3^^geY8O&&MPf`!E9owYg`&oH1tfU)p+mlFBKKG0sL=rPcZ zDP4A2F7Yo*!pH?-SCkWoiKHV=VKK31AbzHgx9GX-1M+a0H~(+pnfnIJPd<$K0BZ%_ zRQ^}96JuJ)Q25R9GneC^Y?|ENHbP1Lhn0gT`NhiTO==yP6u~ca6r`=HzdS>2 z!KN9B>Ww`NMsvaS^Pvc@2F7I|pUJkp`B4(j)wePTb@fR>&PoL7VR^6u-$g0=`1U2* zxoKn9u%|b^S~NWm#Qn~bXViefcLfErc&Rud%TK&I%#sJoQ!$h#q*k#mtVivrz+LgWg={>kr?$r`hCPMRhrNC`Y&Tevy$>W56p z4Z-@UjH*2GCpOx$wSQgSg_+b_PqM(4-f~776k0F8J8p~o4Ai!$xbxU{l2YFJ+xve5 ziW*)l;jaONA(;kAnj1gFermwtV@-Wi?5@X;cD&s?yngiVfc5kNj;Fuk)2vfdop5@Bg>eRR4{-IjZe^v6 z=@3+X>XT_7UNQ@c`J@hM>>O2LH4K!x%MyU=3>P5yOFFz}QD6s(^$*H3t^wcE1n;u@ zdQ%QdbAm29iM8z+jGFS$(NB6kn^O)T4o#wfrzT3F5VVf>Bv8ONyZ@R*HKa(PcW=#X z`p28Wdx1Bx&+_$|lT=&mSWB}T4!@vE{yVx|a=eTw_QyxfW^QjvnC?pnw=LGrK7sD~ zhnIDgh@3@iV=~r) z5fawnfzm1UAvm-Eax(itBcmrO*3%V_m976fYW-8S^Fdj(d_Nrhh53Fun_zKrSComP zn?w+}lwjNVY-2kvvCAeL0cw8DLTeTnGAVqio21(37tMKUt+pYWI3exzEqrAi+Uk9te^ z*AzQu$C;}x?k)aE=In0YafU0Cd@E9)i6o!XrX__M3a7F3rz$|ut43gob2~jc4jghI zlNr%#29ho6QQ4g|Z|?R2rYO;aLLcqixX~GUVW@lMUdOgF2k>5N?(XlsxgXI_Z*yMl z`=o@RM3eSL?3AE_q^*QJOxW$|kjpNBK#Xxmmr0cN=08y)-ZKOwZMj63u#;X z_r!-Qre^f!UdN9fgCt}JJdnn%S&w*J66{P-7^a*Mh_JkO4Yzx^SK}nf8f<5?%61@OH9Jo4rBNZUa3#= zJUP|rUj87_4Twx6#po({(b)7M<|8^oVeg&;yhfxX8sbsZa}>K!x4gxwvGx+Bxx_OCTdoLl}$yvjraX_p^o>Iadr>rbVd*{gj7#sm`Kul9|*+6T((!h&X9^AlA*4nOO;xlnZfW+O99p>*oaJVTTL0g*{+Ef-Sh=`HsZ94UN zq)gK(_K2F&LREVMbgw@>dP zFh8(9RzVlO3tQ#dhli~ zIS|Hp(1e01E7khP`pUeaQZ)GP!^%vJPWu*b?*bv?E3LCJPO(rO0>BFfYz%$>icq0szt^8-^-5#8x{rKuX z2PHe%yd-B3h@{*)M{Z`!SFHh?G`N*-0(vB}u*%J=qLqY3o$HS`vr3xHQ*sRJgFN4U z$#GaUDq4<%&%0idID@syhu}|^{H6r6AA)xkGZSPanR@y}a$-AVz|@rs79-o{X(;-E z`BxgG7PzD9gL9yCv+aL?~z`{Zh7;4EGO&o!-ry8QfG3`~1$+Y!G(T+>@^U zYxmp(+3oM3@u;SdG2Qx&VqE1J>9^App+umvauWvjD?Qn&pfNV0c%anI*!>Z;fNoS} zcz7OAp7;~A!EQWgeQD9rnTK>9}yh@AC7Tdn%tZL^IA6yZ5$a740 zTdX3?rHGRQVvOhm0chmRLwgTaNl}T(&9*em!*0;b~b>C?c$GOk>Y( zKJRViN3>emE%kJ5*A{{g$oarrsWn%?Ulo6LB|R?ZJ+hgvzMVT_DIf>Eu<^AQ+_V>Y zhw>=_|7{vw{CVQ^Ufzpw;Hb`uuxijKl7HATIZi6U)RJuq&OPYgbt#ElF9o0FuH8l= zct}PPO`cnmw|C1OG?xSveWojNBs(Nl`7Ba$oCxsWV~vENR$|bMMGK9L zI`Yt-01ie`&y=NbnXEcJT(_duqAYnfKM-Vx`xETGA#R#OC*`Px>G27=j%<)V`76?1 zQ1n09K)lUr;u*RJEiPoQzN@H_>pV*u%~E* z%#t?J;cTO)S{j;kyhI?n|1g6h$)uR%u~`^%_M`Gy$2Lt1Ok;e;*}bmOry+8yd|dhm z><4KXo{iAm$v7NCphfY(1{Ke#JW_$LrYV1TfkHF8y92RE=aIb^kz!qX26c+MR|a@H3Kw5$LQha~D{xP9f+Zu#t20Z(3Xdyd?-OjGX4~6Ss=kUr@6=A$#zq*!U(R zsE&j)kU-xriw8paWAA_JjT?Sy=fl${6VJ={fY)s2UfcFldaugYpbG?;af;2?0$gbf zqJIs0AUABk=qy1sfP}`V!{^!U-7Wk>*=>)t9j^nE{v!vCWoiNHTTyUc75Ma`(rHin zt58#Z|E*)!?^kjY$_dG3ybjH2{&&F}SY7f$@A)65F^*G{;%?n_5{Myyo&u$nPpQ1XZAte{}3>x?R=QPL#dJ8aRzkmV>$azo->U#NsLJbo79!P`3j*7 z-{cx)L|t1aYbj>Ya%&K!r8KrU%Gkq=+f0z`yU&aa-v#_{Ts+|@lUO^hUhbsmd1vAb z*CmO4dE$)R^mPxrdXqOANl(kkTMN5Mj+cXoii{&RG=BMz4)EA#$<@bK-lXRpi;H2Q zBd_;7f3c2Ub(4>{LwozSF3oIM7%kadYMfl52!9YsMj8{X7>ii+y!zED+8~o(3iB)j zUL&qv2KEM?+}p>N0#!qh_^}lRo`{y2(=CxA=$ydzv3bqVnD^TLqbsDqWN_terRV)E zY?&Yb9fA(2>a4X)dT$8k$=T7w$NYhiBdfBb%E+0@eicP!`H3(|V|bsDSanA|$=Xv+ zOXnS-oFSV-i@bzvrr6-j(AV_R3^G*K@EKW5;z_S;f&K#puDFlpiQ;MG*T^)5fwLo5 zR0WB{ktbB&1{my>kkV^rmIpqbuQH#fThpOfvJftl}2q0`*LMtO>CG2xpjS1gGYxRJB? zGG_C8u@UMl4aG1d%qA=XQd-Zi@Y>aKO6xqxnCmgQMKmGP1ZC;;DWMy?ty5 zv-O=PB>kIj4R`#@Ma$3A=BZDWv6fHLu3nM&n;4kwUPdclZ&7`Xzsr!W2sI+BSSRV~ z?X{g;@6I`USp7b{-6?6Et8I^-baQ)y?HHMp(1ZS!qTG)3Y%ZFOfp zH$_5gyV=i`huLYWs$Ei~bOV;8X_eW{x6I}4{LR!i7#P{IwLPc78X>z2LHAQLLg9h7 zkv%K#W|+GgCS2r=nPIQ~V08o=s~3IVar})#j3ch(V5gZibY8q?&8$_qk%pHvcAT6q zHfKOsGy56PI#CyciQY1wjVD$(SU$^E%>QIWT(PXXe`IaTPP!>QGtJRhp#rZl9gQci z+S4zqlB*L~kxwu<+AI1^(EXzg74(C#ErIc-){>`1Z}%a3X(L*%8~q^gb+IW-Fxs7q zku)Rm=ly!cX(vxDr5D$4P>0>JjrPcbpk+p!O^_53XNH?j{0!rR^f5$HA5!cK=Z~m; zbIy-h^zNuVQBv_El(|RMwRYT`6LvQD^xWZM!K4>4^zA0Xk#jG~huBd4TI#ttg`MHj zFkfy5U&E=@!IAPN{==5d&h692A|FxW!$JRp28y<9~*b&er&Z%iU>=oP_L(KN55MnB$<&21#GHoa9(h_<{WOH0$|lsfFD6 zrC zi##8X7K|@a$!u3zxHkU)nqAs-x$0i4z3%4SfZc|m?6}Q5At_OBnLkN%W5VuLSFeyn z;v_k!4{$?mSnvAJIy@9tuIMVsTL9+f<(H2zyP=0?nmQsbUeUv+lm5%|*#W3NNu_>q zN=y~k;q4nvv{$=*J3iaY=j5W+W*fk(L3a<`nGNPn&G_PcQ0p{@m5Qz3Nqqt`V_DK{ z_E78UJx;0_$Xz*>O4SEdqD5QwDiF?YBKMO&cv3T9*19sp5*tYc9FzK92@o`W8CQsf zXpM9e+LEYx09A*>O-P-8emS!~X@j~mMphTbQWq9f$Vgy3CgfwFUUW{42-RI0-aR`K zwybbGE4_P8aN`PR63eJ1rN=yS$o?hMl`94Jc!1ZBv+<<{!c}geVLV*}j--fmLOl3U zZYUi0D?wVm)01|qFz0%*fIYdvy?o`>+RxGW-*@6g1xsJ{#Ga8DwNC0~)uF91;X5$g zBx`1<5sOQ@I`g*JhZw=!tFz4*ruD&?y6rUlWXBsT-5>eeL|{lw&rQq$~CY(qwX#k9GK!u5Sy$@pn~0cScS%#s1U*gN(! zwe>iY4T8S%cF|k0N1zPBjP}!hT9MEV?2(tAz{nh~RO4d$L5jX8jR@SG)hrtSH7eXZ z_g76~wPR)Y;WyV6RjG2D*^{@CK2Y2!UQhB^n6gTTh`4g=dyi}+&%SDU%uQ+|GDml+ zKkW&y@cl*a{=J_#QX#K~gIgVXn@bByR$QJ_58XL~Hf=*~#(sy$Yf#0f$FVUi`_O*B za)r~}fXGKGqA-Tz#-uxR+a6J`XPdFBlUYWdNDS*{YqB5q%a=HrJBaDJ>GS3%b+z&ll8paFao5duhT{q)v)@I zrpFnF`-E@DLH&zewOfRZ>E|hbM5~Y5+J#JF58s%ctW>A`?Ip+VBXolHKqO_G6=jD* zv_j3Yf>MJDiH2tf#kh5>Nxd6C-|HGwA`m~C7Ve4OWCJ0*(;$pqb^P>ic|!G+goId|Klk_Vz^cAEG6v8&QHDZtTu{UE0D5R?3>A;`n33sN9mN-}v7@ z#zmx)HEYVP>2MdT%Q2Q&=)(v?i{2*Cr!jiJXc0>c5xNdg@IN`C$Cds@4#^JrSB20z%(WLuZp=9DbS* zIG@Q9>yf4LX~o4iU@j~4W041bUTE%FTRVf2@vrvh7KT3roY1gWzqzp&2^a!pD1w4WJiI;;8N=3upnxF0o za|^qSMrq>Dprw?9B*{A>Dwp$7-~?NXtZzjx7HCtA5qw?KOZ2S`dBMr&)EH{mT7E*s z3_;JWe1Viw+_pV1Zg}c?{KH?)yQg-$c8~@`5_=T!MdLm#pJRjp2hwY~=mOUojJZ|>Q4K);r zVmxm6ld)?o+`VlA;}@aC2tzD4?~(AT+6w2d3DCbjFj+xnrmb_WJTpTx%QL7_m5;Cg zZWou4=gLDn+r=f;&V4UuVHo6~xo3J*KNw55{r)`M`ghtdxZbR0i3)+$Whh&XNmppY z*iU(QCJ1vXy2Sbp_RNUNM;QGjx?A@ZN2@`^>Z!Z*0TX?6AI7Upv2CbAv5B~Gg%rni zP@COo(Z+%wo|}K@J~O%OADg>Y0K%YghDLr5KXZUGf1eEWDb#J9Alo(*6_uS$nO3 z#+AMd;fgcA)8uFS3-+Eb2rp2c>;+Zyt)lMM;UwFy#OKOPTldb(J2y`qFl<&q$CfD^ z7a(*eHapc=ZGU@U;8d5u_sZeOM&>@FYU%p#=2q1s!E~x^s{_pbjT+uvWql;$3AcAz zURFO<#@FE)T)UrouT74{-#I4E+l7JI9&P8hUj@Wm*HTnM|13s54>O7opn4b;$Nwdr z%=V%@xRJehs)mYz(+HUva_xI*k}{(2^Tkk9zE!)P?bh;J=L~oAj(o0xqH~K`Sdu*1 zsHf1nu9D8*YA&92BS{nIn@(Y8{#~L07iaPA#aSfjrsz9&QY@fP%?WbVJJnI$J+r}F zfWYwIhM+ni^_f#DogdpZ7Hg~)Je>tmp@zg)(;Q={RX7@5Z$mB{&yjuH0!tcA<2Z9z z2*m}P?8=iJQM$f%T#_e=yQL<_SPc)cikC zt*|U9a&5QFGs=7%J;@N7ad@}>30pYKtTTw%kzyi0HtY5`eFEuy(em}Uf$s;Q6UAS^ zhxw*-86>Q>zwH&~{;K)76SSc9ZY0#fK5oyx;OGRvoK;-3@)@sI_xRNLFOQlDv$b2T zg4jF0Dl8};?fHt`mzt)1aUzHX~6~TNBV(e`nJ2ipH+X9sj zv*qEmWaOI_LMP?&OSG{d5Tz$YyF?X+D{E<0_=|DiM5!0I71TFU?MU0KH0Ahn?B->; zCiPo=j^6WamiuK4q*0di1~T9)9c!ZaOH}0RGn9u5y6jd?6lT-8xQ`)`Qub86)QU(L zkE=XVpRF``yUUi=(LdInr&C!&aZ0^jqc8p_LT%;A`Zw!4Yjc81EAnDk z@>_4;rOy*TSQ8>!?+vWwTr2NT^U55lO`6dYzcm*9rKTlWn-glQkhHVEpk?m*Jfso# z?i=d^4Lm9MvlR*gX3tofH^ZV(wn??jVq)u{QzYyW3gk^3BDY@*3KtAfWIhgJGf_V> zlGn&AIHjD7o6Zy0L)-V6c$Eyk#rfx>S#H~_KV>xs&H6_{447mPum&i%#b+)6)aCLh zv0@}x8&zGM$OzG{A30};uutHIhinET?$@ZW?kShOL{fwkVhJYFGpQ38_>$C)@m^G) zu8kx39^8Z4u5jV^k|1HGu23YreC^Q>CnO9$pkXFsOkgu~-vQH;m`iK6R6XZIfff(Ug%5WVFB5UK_vPD|qPPd-<> z^*{7bvq>+R2<_h4Ps1k6!0Z@6tGhl&FmZL#xH+NG^|eKp{T+15#s-B`l#-^rM#vC7 zfRuz^(zU+2cycL`?O``P!(QLNAh7?*+H=^OHTFEOvy_g*DKv-}e;YWd*Cr z{B9x=YhafIKCmcyfvw;8eSRS52e#d)jG_6KV;0+7luzun$I4sT`^+BIw+Azw` zfDH8I^?v2&HN9hSH_T7GO6+VdwJU)MYTK)QM!%JO-ww45R+kjY?j{!|4`Eo44i{FS zcrcwL7pGC849LGnkD`}UXHtm;l6@JXMRGXw3Y?>T0xX^(ouFA_1B3vWEX2BxmY7S5f)jsFOBf9 zS{TlX!HMfiBICZ)82j5V^@X{cj!AXZkKd0t3rrGJM^eO`B?pKl!$dsx@s+ooovVZ~ zqoO`RDAnOWTDM4E&PLHN-VCdFKr`@5AoUA}b+S$=@_dl6={-Sid#Rcwcxx)m8cJBjle6_>GPxKghZspTpAArdU7 zk3opED4XrLlp!re{BY;LoJ$zpK69h?k*!M78|3_uw`F}e_JYVp z1Vjb4Q~?2{N(oUBF?5mu(p7q>(mPlH0f9|IkuIHtCPF}Z6Ob;1-a&dtI-z_k?tAV% z$K(Ee|G>N6HEYTHKFVIr{5hma=i^+zJI4Zo(1b6&i-JC#i;T*>g za$59?{A*A(-ag?Y~xNi%h?v>njR z@o(J~IvkWWLeh(ehX=LQA4_AjmLH`6?^nO&&lW!5gjxbpgr}I`g55jbOBN65{gtA% zxs}7+bUxBLZ@xcGCWescbr3;=YvO7}7zJ=cBp%P;(wSWrI{U53DbV|qAO-qBC*$C< zw6#j~^TVKW-|A3*&QvCbtZC1qneN$ZC(G6ovb<}p|O z73~t(aK6?LqaR?<7NEd|^N{VXNZFDfs{PX2czN!KO4#GE#3O7@r`vrDdRKmteqM8V zPo}0^Gw|W$H=iYn7DTI+rUL2YF$l%1z%F7v4tI_0mlb}>$}Xv7zpv+8bVZ_h=y@4E zt)nXHoHX03iye`Y)VrozP;gts$dm2W&}Bxfg@d!r2!E0LP1}#H=?lbBPB?!2T4>r| zDOU#p&*5)>jNXX1%Z=qu@E$6DBaG-(W!(96$V>KkuwdyHrm@0zpt4{=Gs@pHb&0;z+u zGKC7I^lUgGcFze~rX!Z&d_IPYaHs@BYeG`=$XhNvWKouTufE640mlekK|DGE zYQYHZmx%Ek0Op>t)nvtR8<>*$5AOJ|(6VIZW?j zVxjnuYW5Dh)2F$<%iSAEZQ$@0(d*SD`=}>(j><0p4w(!2_XsTf@VHdRa{g5r)gF_< ziOBI7kh7#z>Wq)<#8;J5CgqM{W5gq2<-0Y7@$6F$uh_a*gC3JZ*Afk!o3N5GkZX_8 zniFiwI-r+pNg0ZiESJ|7Z|@fGek~{p4>!K(L&S6mg|H}X@6a#AM_x+&x@sp7I{)>u z8rP3&H*HwnSsaJZ<`I?_N|+=Z$GynaD??V0f_1$qW9!al%Q-tl`^Ujl!7gYB4ASJP z`|_9Vm6YgLadVqX+9*ZCDpejH!q+3FTJvUEryc|@AACg&r_;&dsL@k98>yomWV8S1{Yo{IA4F(BsuLsMo z^QUmnG5a+HgY{TWa6um3KfAe+2b1be+SXYDHP#>~P^iWpzf-J<9Hq zvO|P(;|@A68s5F$9Qd{KhW46dI2+*={|l}d-anQD%LMfl-t47Bz!iWf#DNfi26I1G z?qx-EC~0lLWyUSfLR1#WIvgx41&20le~CGO-NqkiqMb&dXG$ZbiVsJ{Npx3x|6^^% zXRPq-aIjsqMNLvo*>e*myfn5;s8U6L#cVjxu93nJ_0UE&VgCcsntYcSK!%{-{iGxUiefQglkN)ePcGRQ%rQ@qvhU?^>m3#Xy-_R7R~ag!l6s zZf`lWMVDJYrTw9vj6bfMx?@~l&D1r|uLzoHHRkkuKicbzkq$jAtqr8=PEO%a2Be1= zbV!W`uudF6YK>8(-8CB(kr#SeOK`lZ;@oHQcTk z&Uhn)E&OjZs=jPwYYbwny8O~L2h(D+K0_iRE+$25=rbjzs~`%$a9qE3J@1=$Qc&#K z?`avqk6}Xhxon;NInkKdCi*n)x}mLK7zO3Or+Ig%{% zi+A3KG52GzDWD|m^6QAiovHX3!4Ait8&p$`u9>e0mjE~V;11+^DiGDc z=!8GEf@ek$d^i6T>{ja#!*#3jM>uqCun8Y9tEuWuW$G{gNNanwk&yR;@j&3<>*IIa zOIuWhkglAqmnOX;!&%LDrH?@}7=ick#z!h4iY|b^$nRPvcL$J5A~yVqrel%Hx@$v) z>kei+PVMK@$#`rL)9oQ|=FLXH5OP&W!a4xV))&rEud(VV5+$FARYyi};yMpEpKoPa zY>^P-Gv{!zbDR8jZYeF|rwk7nZsaS|YK}=_-ef^;^-8TS2A+{ho>TQb4pCtxA62)d zJLc*i2O4LjU>Z=v$(4ZeK+hi`nb#yDwYzvgnqI`Jc!TWq$On{+PGIYPx9ld9vdHxH zd3DoeogDA-yxG@PyYNxV)nd>6P@mbi3|fx8-1~0nKkxuJ7z}-mEn&o7i7uR1#q5hgs{^fYHE_s6ZC7z&K12~hlbq+BSNa zr+%cZcjZN;CA-W&{wltaalIKyp$Oi+3*7WA3I$z}>mg*|?;(V9H+GwytMzYz^0Dud zQ}@rJ41~b=m%CI)OVUA%ve*=@E{_w1zn)~*GVEHZz4?AwmPlIv+v0Oq;OJAz<#UY0 zsER%I+I1u?J50G%N^vrU^8(oK0$8;C;}K1sAwOBj++-n#ccj>^=d2>3V(@v|m!%;N zxq@hVUfpKT{g6!3gM2uGcfR7-f1Rh^w!x>vj@8ZfI=*n3nKZfSlz~Y#J~u%#_3sb3 zb2ob0k;DBi_%H*k3Wd%C^4TsX@_)hte>e7&Y&mEa+9`_CTCc@-CLWx`Q8lllwRp8h zOV8cb{VSd415C?;*}9XKuYF|vB?FvxsMObA1+cZ;U$ANRv>k%iGrW03A=*uWPbPMS zvgJ~aLVUFT2GaaJsFrP>P9l9JM-Os0FXJjgb$Ntl*Q4PHhWqkv+g@(M{6VB@X4gG|*W7-2UFmg^A{2GH#9 zcADmRl-rScX0zCL>m6HnmqzhoYl?%9etO1?+llxgNnr^a{@C=UeVPCu+bsG3f@I~2 z0a=azUeNDMOj5}87C2&5W&3M!MFXXoj@;VhUQy1#+WdwF$90fa{I`vww^?oL4=2sk z){&Rt=-n92_bF+E?{OtV}! zk>Y!Im`VY=%2$Xlb%!``RP@Yx@0AG~F2a7)`@ih7lr%hmz@05U9AayA7Y5`9zWpo_ zy=mKoxpQAbCDoL;l#M*OA#PXR30F9e5zp~{1&}kAJi_$UDTFCtv^Mi~R8U9(wNX@lDRV@=dIO)Qh-VaaIcECePmwkT^j6s78!8_= zgecvPyQR!1kzDUZ|J)N`t=V&yT15L~KAH=l`7=<=a2(=o3GK#yb}@O;pB!4O2C1R#JGm>i-Z@e9`}dEd2#@;#VyQB0rR5O1Fco?+{3a9&l5Tn7^Xh-5mW2Laff6Cgf4MsecyrylIoH{D!ihn6Is083U&l02P~ zGvczmKG?=w0qV){ZOXo1aiLr#B3$hn9A7>XeF5qzR(?ileQzc+CrilwybE^+7sTzG zk*y_B@paxKGI|Iiqla+dJ-S@zQmn2keWkKI=lEr#MVixDuS~$kPZd7Dm8KyHT-A8Y zf7sRk(9SMN8GcN}Y3l))8Yv0(TjiPzmRA!zQEX?Mo?n&LEeCjFvxHDtWgT`KEfX2<^R9oJ8}ZUn_exNOqn(awM$1?Ebm@CiL71Pi`bC@3 zsrtAkyeWn|+clgP(^V5u3T@UI$&wWIIMzMnL@l=L*ZBaz)+*QXaZ6x5)s;UW5EMN* z%GSO4Zi%b(SQd*$S@lut4ZM(@&Z8k$sQQMHq&AQmA82C}Yk4V6j}-KE?`3>n?`otYseu^RC!>8-S;)L6LRMWC za)fPq%O+0adUH&do0d#q@Y-S%penE5?i)N96+p{IFT3vhIBoeE3vzY`EMLq2HO_{6 zrgF=xfATO}5AKn}L{CspSS09Q;2qPp0@VoGy!3^JAV05$yFjR?$U;3nF>vo@k9g*C zU)K_8Th_Cex?OUETq9{cf}YskOc$mXb>ek0B)f(dzP}CR-;nUn#iEDg^MP$nXKF~p z(E|@6NmER@7`uK{l!JC-kP2rDGAb5i!XnK3ax-Jx^~WG8v}D~?CmQYBm=gDW1rbGF z-!8dj2uHZgf;vQb@v`6PWphx+Din@Wz@TNegZh6l6_i_dMK|Ep+TSg!M)=z&MGGeUF)n)ZJ>MDE z0LkW2<&C+OjH4A$h_D)q-zv;@M-#7sug_N8`7i90J5aRWz=;ic%ho-qp@fxkJk zv;TbODvjn#Q@}ka?OW;FM|A@9{a4q6%!@kL+{Gn%Tj|RlM_x|(A!5;nIq5IU3%cH_6a2#!Kn!<2aS zLU^(ZzU9^ikKL%TVJK8kjP_pY!%It<*K&J}ViO^dJ_c~WRpLR=5W>dci~d;o!i(sH z5hkUJUT7re1Lm_swn;OmPB?{qlMJb}F}pP`oJhllGybnIP>vo&1JZ7#FoSqc=SKd* z!(1<4d~h=|-)g2!Id0XIEtK24X_nG@@SCk@{`4`3Be}Zt@o_`ddJL7PL*1)pZG(7F zRDHCWI2vY*8}1d-aSLg)=Z|{3VWV%9$hPvU8gJn}GDB0;SJkqE+0+;`7mM^5 zbbFnIXj)rTTL+Bv;^i!kRf%Yk4ofn>`vLb`RrvFCX9E{?2Hl%qG33SyuX`}}Us_bW z;NhHK)orU-YZ783e6=*U^^DSBhwZC#aew}!n1!DSHn8K&)=|CZi)7O@wp*K!>wNLi z1k$;66bA@4VR4M3u)b|kpvzB{$-#!`^L;7vqI+R=(f*gzZBKXY0%3gmvSerZcUH>Y zR&|M>VU6vo{mSwU4jOV%uio*OO22sC){-4~kd7lkl@9P3x0E*b4w9-kCF}Ts%@*b* zZZ21>I+9nDCa-44UNDBQZ!bZOYBpDT4l8-cs>lz!#G15vowmC0)-!o~%4L7oi37uw zEb;%d7)V{Ym~MbL)1a)x=%QX7n10@9mI@1;lJCzR5%b?jxb%e}xbbTJF)rJ@f<0nZ z%zEl*q`18@P1HSLyI8~J=;@9Of*3zyui9I6yjDVWaor+kib7! z>a_v&7V=Ji6oTK{d!oStSJYm1Tv7a7x{<;n!@)-Tps6eJ`ArtaVhux2l}MHYnVvX^ zie{c+I|u}A`fDDM^W;|07T^m*y!}OrJP4cxYq7~IM~BruNAptqb5XrzMTdHz?d@U7 z)3YSjJgW{zwEh}rQJg)V3=N=jc4(}mh@c>NMYQu9_OPqUGGmI(_orK+w5KpXPx-^) z*JX#+BDjnRu;48+efxIvNKS&trljX|sFPH`(@=<3G9WyP>RSq%>4&~Q;$PqsDNzIb zfd5MM{0Y{PMU)s6v0(soWa)OEN8od8NMZI@#S8m#lN4;$x+j5zO5JWCiq?tR0pgvo5#oOQ(mFW2m4Mwm7 z^WdW(4jf&Pbw2P%haYBy67=cb$BLI}R@ZqpFiq26g@|10-O~`(i|Kkm&I3M?9g=S- zLVwiVd>)q0Lv81tKXg0h;_-%up~=NN<=5b zOpe`LKXJ?aGe`>Jo{+kK*u_BgO({m=E_jp!CSDq^Ln-}d9irYMJ!H}3w(C>f=4`|~ zdCgZp*X$oTTpC&3$`5fJTX*|X|8i2S0u~Q4SC`U2_W8rTPVIN*Apqt6n%6lzUm6S$ zvU|8B4iYbiE?h-P=oMj}dx|qS8on*rxJS#>4&w_-?xZGzf*qF2mrXWaP*o8T#gBT{{)%mUfE7wPTr5_)5{ z{4a`$+9}BHSoQNVDHs{gV}0H6Im|^HhfzR9QRH_4svyJFks{1xD;un^Bg4@qKWzib zq?I34!vKDcFi|n;?RSm{QldfT{o5Uaf_fuoc)@B)c&ezUR-D&{C2sY3rNN4J=bFs1 z5A&852MB9t9x@g?O9p?%5Aq@iilRABY+RBL_xP8CG6D`qsv#%h+0-T#g z#tAp&A6(Pvb{-z8GRt9LE_Rd!{1s7>m-9O}EKXt=bVYIweI6BnQvL62-clx742-FC zhoz*&O>A@ZM?MVSrPw#Nq7RZM_oZ}h_2;LpomLDX7dQgRHX+BET39$|tmYh1xfmQ` zP3b4Jd%it?hU95EukDO`k^4j;t%`X3!Bng3+6#rEXRm$>kJ1{k#{(wnQ z*T+N)NM|%d!K_LH|CU5Vh_Rw>oT)AT0jSuY-eZvvEf}e_o&49*MX5{XCpya0c}tJ5 zgPU9LEBXlApZ0R2%ZVn1dROFknyf%Si}AdYc1eWg zh?iV{>+etq*qinp3DAhF@Mgnd3ry~Pm&PK8<6Gt{jFgm4K_vP*4$GxaC<_92)=cJ5 z$aT=_yHt0EVf6Ap5P zG}Nbm5qP>mtl%Ld0Tit~g3>Ojo%3?26)YcwiFZ>t)==~o0mXUua$4T;kN#i?V_SBc z94gGoYp3yEG1nTjZw}a9(WdnvhG-c)2#wrh29qV0Tb@pZ@!xv#3(7=5r}{S$u_7Dn z-W{PP02j_W=;!MVwJN%~X8V87S&4a*5@A{2P(a zC2M=do1AA3n9EJ9?>e;0IKZHFq_EveuHtw;CoS%OaHg~v6jqsAmJMgdxic>ixM$3f zPN%=9Ax?0F+`WHyqykVYbUA?E_Ub@YY~1>MkQ)DpEKce-=DCx}YCeVb_q z>DxZWk#>tRE4S17ZU4pOL0tV)5oh=>CJ!EjCp}nXlq4_>I&j(G#=1kiJhWy?RiIaa zcPHn*{rL|A8*fCcq;}NED2v>(trD^@bNc}Mw2+dz?S=Nc{tjGpy~kV4x&gNmnLOn#1PQ(`$-;%&>3k zH-VborUh#H6o1u?$y|KDR1nZ!BFgixvF<4lNT8R+M4kV%*W9s!`+6q7gZV%C((d>a zIYH1Qjr-QDvs}y5klZ+XpPdIKz*(&p}A9$ZESk)k^W-eM~nKfgk5#0D2JN1ELJTi{^%b)~CIK zYgun(d~9@7L^M>)VbR}3Ly6bk9+ZKeCR+y~vwAE0wS&xP@OzZ{QD0ev0bXo z(0FeZ!TYnH8*!Mom+yrG(p`^`UhdBx%hS_jA5MMF(njsOgWbITo!O%=Uf8`*(8@M+o;tc>ST-VA+B?z2ORf< z|2SWzzL)GKQZUk50(_ew*%&!kQ-KoG$xs88byy0{$hpbssz)YzMKD(3<8qZu<1bw- zn`KN5@(XSMpV^TA@dM%LEDy5~4g4Np^8rbd`~X@=69MlU%N{+9!j~y#9>2 zI!_AO6hj&az8d(ul{xn}AVOXV24&XUQQ)*UWE^AdCpBQj(ty(vS$wgq^pGcF$>X+w zLG6fOS|uYK4Zju&XyOrU-CqGaZy*ggpiytoWJ}#r1ZDCcJVq}t+`N*+dYNRY8xd}0 zh{m`e?)8MPlc3s)mL)k2o{2XA+EmX%)~1ZSnY{YiN-^`@@}lLK!Rs9-l8!(FM(^3M z@MHC*yP~+_^kQn@3Vvno$SuXZ16w<>SimN{IJ}dh%_G zf>z6IGU)i=t&(M=NK|Z|)+v*5YhXQN0CWiFwR&?~ohRg3YmQx-7%%87zYF@Mm-V+W z4+GhGC21BzQ_>h0*4{D77~A4+iHHd+t`1&;lv313_Y@6rq>_!~0y)e08u{%sfRUp4 z%UABK4@hjiL2kz`A2jrjz_eX1i5#j;=rN;2XnjGgpG=O7myDRC%azp z1|`ID%lF-YJjpf~+ht@NH3H}6O9tPQej9X9DX)#?;Ut69Y$C2L^w7j?epcSo63ni=}Iqbx#zgN z(I3;-$6tGRk(FhN+^3uD>)g7hVYAdIzw+5CGFKwU?cw5&J-0Fz^wb^G67%6@4W->V zvSetZmr}-S35Pd*nL@*s|2_oU+vpdN@6W# zI0LyCMUEZ@z^zJrTVF7s*V)Z3#1?`9MK``JubHzN$#s5t<#V*JLm7~6e7_fHy9gX# zU~}6tG$s1r`M^!MV$>9ZzC_31n(-xM6w&ady3wx08Azb1tA!$w@xmAI}3vAqf_e7%G4EOs@R);(=X5xa+Pg*_})K_o= zbqF3mPB0+#4HYaLp*L4FHs0)?{_(gsC8#-o{(2~aoSw3iC41oo%uoYBy2lb{O>J_e*v@b;^^8{$abpY#8<6#!;y+dhR zR82k^Yy8Up)ynlyodcHu`V0bsV;O%82ae0?M(__;j)Yjbhv%ypwj2(!2rF=MesL8z z?+gb78tn37eKdWmYprfJ{RXF>6u%3YwGPxFfrTo@VmdkCoGF6^dJvJQQHGbTIMu_qUL$ThUC~M0;tSYvd_kBDviuymYTU z`HZV4>t#Z-*TRZ;InIr)B$_|_NK57-N9cxyxXpZuG9U#Qu>R6N!X1QKa?_?^Qlcdw zgm~a=ghj+0CaXAOW1}6UjTM!JXFh`jAJo-L(%R*5f|nuQW&jI#4|J0;tL076xH}8; z{Gz!E!>fVS0JD;~U*NjJvV+pUTymg+DS`O-Z(OvW1XTpdASRqTP2}yN%Y3yMI$ie5 ztz7W@HbuL(yoP~@t%eZ}${{ zILWo?TY_9RbqnF3jl`6(*lbG@vJrj-&yMD3V2^*hvQc!ZV}i!^&e}+~V0SI6YL?1G z=O}Naqq(djy7?k|h*SzQ4JKbf;tBX4<bAp88#r0EJd@g^F zSW|?(U(XspQrHlJd`vIbg+(pFJR289L4xGX1)`3(Rv2){qIwB?gWu6R@Y(w1FW=(m zNtJf*+>ogk=e~{C#g)q{tp531_c4R?QGOG=Symtmli)Z}=h>kDB%+5(w zm&@%v-^%v)=gzU&lW$-#|X(c%-<3d^;{tXG$*<3PR~qyJ#le zVdvU~V2{3q=tffrBw!*M2T`$eblCr3u-ei_7x5vM_!2O;J+kbzntiyk`_MUwbK6vYi>)nVsJiLAM$9hEJ-p*I9R18w zO?Qmxz}wW`UoXl7*VQ5Y*JK(bmgTy&_NaSim^cXUKZ)gN`I)gm35i2~huS5*{i&Rg zRI3&wl^)Y)Hw(>TxxRka2aXlYG@a=e>G_?B{Es5L6hQM*02tuW^kEZ)2kJAfuqw9R4(YC z7HuA3!CxqlQ6$=j@4I=lm4fMO++gWc_yTJ~Y1rh{OHg^z0&ijtpIE1IVN82E?_J#vMeJ{JOYcKrpYfe|t=Y?P$KT zyt6!U;!Gi7ZE{HBH_--#t~52!Q+7`}qv0&#`KQe~VmrQ!ByBrwFuowCx!B9cUvz3k zwZ0r&&-uvScozVOD0?A^N4z!!)F%W)DRC~eTQNZ%eZv+B9l==1A$}-~VA# zQL(z!dS*p=^iX;S3*Aeif%2Et9i5Q4u5H)*>8WA;EZ|c720_8<26ERQ1stHW%R7!% zQ#Yx09^NG#(i>QNNgXN)dc9|X6Sm62>B4N%T;u@|@V04nDkW;-S|m=2`848Qg?k=D zZqxxJZ&QeHkn^) z13so-Em3H@ErO;~R($ze5Cequ_gMk{J9;!_;d$_W1B`H6P4&wyka+uQ1NDu<&(4*C z4WZhbEvwza68WPFR?D(qf)emWBr$U@_#}=MH~)1LDa)CzRMN>0S|=!8-0VWM6mxJ9 zIl@Ykqug~1lZI{LQ5J%GUix(ck+v61XqsgBS=u_221ESo7l7vW|C@Zaay`U03*+9W zM0aswx~LsSW>JOm$|AG@lB3%(;UkJ?2$B4oi+Ypde^vBuS#Q#n$ujI=06@L%Yp0vz zjrUExuJuXd0{;*XXPgW#C9LS!2h7Ak)j-;{cKzK-{HnlJi1!7+3Gp@{P)X*OuFK91 z@_!i}j+I>V*wojW956{>9qO=Uf#bzMg808Q??ZzAcQ_titBet^S&~aRR49t7%K?Ox z1FlUc;{bg5=zO-MJe=(6d|tzVn_CwsHoUzu}&^fEAyW3r0*}rZSsI--JjP$ zpt_5^IkJanj++}C{_(l;O|E<9kz0d{h5cHHb7$$ySl;e7SoKL znI!R?Ek$Jn^7!Fcmq?-Ut9UXmWE>3WXnC4&jC2cx$Tk|L3UCUwiYsU~vOpkM;ccmo zzIAPYIsU2^sDzB&0~J@x60t-|kJWUFm6ES6%n55;+O2TK{=q_l(2dC<;Ge1pAg z_bg74*HV5-E~1uTEd#2X$yO>1x;0MwNomh(3g76CNZ&FAtW0l@e$dSlt66fSNSumm zz{Ym;Q#IB=X#ndJ-x^Vv+xnx@9Zc6Li| z6)hLX--b{cmwPEv<--^9%7^zOTGIRLLoE)xa|{4rcK zH|DVgYnyJHT1#=7q`;s~h_Jx3r^u9Se>MU)y7E$fEF7_f0OZ<$Z~}7%1?^|2q#>k& zqc^r8Z{BbrBU)UNT!7WEgQJ_ChqzhLh&lfCNyS_1gAv{4sj!#$!u|O;PI90~{4DO1!vq2CE&Sf!VAh+%wAWeARux>MzJXN&u?dbr*yM zn_x=b?UM$rTQDVEyxYZ#en5AA%C#AUgZAtsu+8hNaI{)iMV51%3Mo9(Lo;+Bf#Ifm zc|l$k>WZCnjsWLIC`gBLuPP#lbVj)wF=8VE>U+Rw2#HfUPqX}AK)kicZS{+Jl_U+z zgQJW9Y0D+OtNtXwH|fi$&kYA4dB-jat3?a=tWB|9S~(tdd%)NGmM=S-2`Z*HYd_`h zY#F}+(x38ZB}6z-lW>2HJz6B--YK3^DaW`PDiVXDnV#K*d@u%W0dE>`UznxDMi5$T z0D49rfd4O#gyU19J4DO^cKx&nW&xIa#Z1~t^Z{meVR2CNH0Q7iAlR=Lfe-34q zWr=2FBU)^%Ji8%c*f(p5O${V7-+rzM>T~y&cnEqxL%J%a2r!;+5>ivwncb9x?9^@= zXe&#VcJp*yaswsHN~A@nhuVD%{z5uweR!AWU|JMbEmujy2qAlCLQe&FvRJa|E|~Tr z!+SJmujnWp+#c0DzIDoE`}9m$ztQUiEe|^cZ6*~MC;?PqR(>ph1-;^z0ZYWmDs@9n~HFPHd%;U;mPI{6{8on(?&>zW}mz_tYP6g0kXd^Lh` zX*4^>V8qK*hCv&f!mZBC{deEtN(Bw3E1K+N(3Q3XnDry4aTTF_=Ujn^M5WJvtz1TQ zcl`UJY7r@Ew`@xNV1kznfLwESCBO~lvHtj7Mt0Pxv0I@J8}=dwQ@Q|IEQ1ReqDuCq zfw8@5{>M1A?mKSL5|QC0!f^ca&BTG*zy=9rDos!@c7h)LYamw#*oCkjiSqDRh=f$N zy3Fy;L<@Uyw`&!~_^iq1C(GnkPk&@VW1tW(Ut){eu$XlnOFm3R& z^?g?>S?pZ8UT~og-=OY@m^;|^U+baho*cikiC6}HXR&#Jt@~T~RQ5*9u3#sxm}UsY z=^RV}tvBo9{LZt6F$%ILxJU+wa-h`&?K(njGCGp(uv^Mv@J~EI(}7%%c)p|b_b|gb zg7Q*&OH>Dz=IwN$s?D;QI5X|@0TNzAP0-Je%>lE87azr@IZmAoF~23=YE}77uJU9m z1nsXg>aN{=aKZ_4uMxQO4}0J)2un-SBVnf9ib8Nf4+d2?52iVI0pa3utrK`-VoBqZ zQicZ_W?7vTN(HY2!zdK(P~L)~q&2)3w;&R@j?u`*V;_o-B?}ev*d`998WZ^K0-7Q+ z5huLWz{w4y#n>}|>e2@~vQ)$22PqX5yFKWAmvWd;rs!SkXn+s?Qhr-v@+>`{HykTO~0@QiMT6HnKl>1=d`MDil5d~_TYT)(L|66e*6Y#w}|vRI~2px zf=IviCtPo?RK!(?b@omiJ-=tukAf(r&2U}Iv|jAvctp!I#Rszr}l|B z-^r}XM^Yd84(Y_I_jIh-$7!h(-gf!_CHv4r?h8-SdiQJk?t?F^&!f^eFSIaUXn#K- z1^=hxlYH=1#*S)we}mQcNYvc`^8t0)tZ?$2#4A;r;*-t?=J9jo;<&Hspda@V zkB&c`U9p!0x0CpBW&~uZdF9*nbiID?sf{1v2P*0!1kc?TBPUSA8AFjB5#v=i&%ryZ zW#MjJv<_;EOI{%rFz#y{E?S5+wp7krCey=}JT6_n0h*)TI5(ZK`XLA#-=C2Jn`YdIz>6U0xzXqPLX*KDzF24or&{5c7+e_I$(L z7CY#@%vVd5A4-Y4V8s0$muAnLsVtXxp}yBV-G+MuaK-Qc$@6~TG~vPlr`wHD1>Z2Y zXJ7YcO(!U_lrSILt}v%*>7;koXn+@l_uHQAvSLwmt~#txg>6+s*v-HqS3IBwvl`^5ld_ReWgA1N0vWkV&@Nf>kg0FM_j7lwqZ`C_)^X#i;?oO z$W-J#u^TVhFw_iKnU6-=@7vGqi(T74Vess>NWu$4Frwj2s{3kaj&h z&k+8-e&?}T$|pW@4N1I&%Pf)@INy4FsenqqmJOhV<9sgi@}^C7R`?!Ilg~88UH|Aw zFDQOeQ4cKE4Zc2v*urz1Ug5_#D(jCjhA*M^PC*K| z-IToYD!=bn1V@rf=pT&kk*@$f8F`Rg)RIEw+%rs3oXI5T@y#=ahjm+jbgf+m8~rQ~ zS{x~6rWqTR_v8dtu1pH`zRUHhx8nH7IR)?w*n9+SWjZnL?#8aE~|B+@x4nIW?JR^GdNgP+YpEHtwwl?EA^QkiOiefC^+Hc+>OE)xD0(huyqSeK(cnxO#Sc z;8R2N3f%1r!hia!T}*DeMjZ=!mgSF){Su&_G}B?HA>I+k1i(W9uimzN8VvCYxYHlA zJUv-4NF!>bnKd85(3x1~dBZ6+*(sWVc(w92?#qI-4?H{lSl{L4xT+MEt%G+oU!%;q6_+|M3F`RtToXOs8M@98UvF5vPd*w~j zc0KJeaN0Eenh@`;?>^&4@sA}#$iG4N^EZw+SnPcRe*#@tUY;C{y=C#@lhOM$zVk;q zyTaA3*UO0t*Eke>;Ou(L+zMzYWmTHZ%1I8|ycLt!Kewn!7i08>y;!cwnNL3uR^RAO zY*$VlSPFEz`?!um^(y_zkVgbw1$=WsDx9}7SA8!vy!L7SoBO!qkOA8I$)$!PDUJ6H zpz(VzpY_>Upf;w=gaqhe$UEAhg^7pbS!a;U3i-}!m23-+pTAFypD{okh~5hUSHs$? zL77!Grs+Atojo#c<2HpLF*W5h?@?bW5?;LOlUWy~Y{+V+1ay$qL^)=cYNSw}gQ$?bWg^ z9IDP!B{WymqxoM*-KS`3$^FMubRlBiYZpz}G@c1pqfYhRMRpGnC)8z(QY?&zDy|+R zP1a@9q}a}8$|&LuPP4tpi(SF6>xO;E(xKG0YZuI)=$l$*s4D|Q6NQssHl%q<^rgB; z;-Jg|5#ql|esK60ODHtYX_9A|P$}v(W$EvgRhz>1QE7n4`R)pxf~5(hNKu_%^@ppAE6HM|${^F}-SY7~kQ|-c8=Acy1%lpuz&wk4Sa9 z91dc}MY*KX_(GAAFn$~X*kbyj_RBdHh4sP(YwbZ7R*ukG6iba1>$6nWr^0mgPa@N32dD?MJ+#`A^c`mQN zvMe47SBCd|>->^gaynyL2DfmNRvaBK*d3I447k@wKaTG2Tjndp8kf`Lkj`PoGHU6H zYUl&HKnSspGVFHEPzIn*g*q=+^(|>f9Pt4>1&OBqiUNB%IXBd|Ow_l>t;q_k0E|#C zhb_53usJYmc`cQ3z~@=Cr`e?Ji)VY<{>rA2xmh=7BzUMiEf4i)G!u*(KHX|-lYl9` zM@f~}r1TIW7U#E>o+7A8p7rORGw10yB*y2tDzC}hIiVJ*DEICYsvqHTKgc|8>~lT8 z-8#A|Wng0}dv4p%6B@h`xl z{o`yrY`0kF*+@_Xv)t&;<2~2f8bT*UCH28{RHq10S0L;AVON4_xT=u(zIGX*CHVy<>fdFk11!88@QF`)C-DZ(%=D+Lkw@rqU2_-Rl$Dqh8rb^L%8#-a*33M zH6nz*EhqN0L+Xc~oz}dsy#DR6d=_|DNRnU_Fr##h-{6A<36xxazqu1y!@SP41Ba&A zAF051?P3EK)Lz4Uc0E8c)yZ zHP$&wJOLg^ry?uvYLssJArzZ1F|zn_--s&ROSW|K)i+kJzTKJfnv7OG0qSMNL(Qp0 zJWpM19laP`F?0=Quxl50{WbO+@}E>-*srAI=!r&ykgBnK_Qr>Si3%gtk^+Y0=z^{Z zt?rNN>$nrI9+rC|UX-I-zL)maZaqU}&xM{Os(0T(dT_s11Kt!F4?Uc-x4I4z1c>5E zLjbUL8fS;F4e3l{Ba2~WKP3D^nx_0D*%wP@c~^ptkZ+9_o!o`ibH;1xo2D`&4ABvF zR?6=4Du*nxXR6=chUr_<$S&O-EqwG8IV1)wt!=O-?awW3Zm={p>DapiyIz=v0!-Lm z2{)Z??1oPeBM9Z9u4PANF| z$BM|fCa^Tw!rSYM{>sT4Vjvt)lg(`G+9|R8?~|1_)*=loPHcxa>PiACADRB}-5ISE z*o(tUC^hnU#UJt#)lN*{dgWVdt6@f9 zbb%qFxdhdytyaiosaQaor&E`BKZThb$2PrAk1!9aO%ajWd8bYCz+?=Kv!~1XC)f1o z=>qLEJ^yIN)5Cs34^)#NLKK&Lfw1?VkIuIGFT$5wJz<+Oa*lH!Y$kl$l==4UKYgb{ zGB@VEox@wROG$C%Hhs!iul-}1M#TJ|^x(Ch>v&pvAb)_=+j*plFbwyiSjtQdx0cyz zLb&nJj6b~06|q)f(^6YX&p}w@X?89gWj!CrKR01YyRx22|L#tSPz<;ByA$fqG~#Z7 zJIqB4dgu6WEtIe@G1ZVU%<6qI^4_V{*;}p7v$nO~(ui`BO7Kuy+l=@|^cvbszo`0H|m+_#-365e*c!7>uF)@2)E6K=OV-8=VN7%7!02YbYS@GYK< zIgV}e(C)kZ#Z$h{Q#%Ib+ec-;m{2($H9?_Om?GbAi`VU@+u`NCv3I^Iu=MueIbp5aNQ5c%O^Lddt`E-T@Kfed&f7)1Ni`rQjqkr*;gVT_(|rU z4&Y@n78a|pZ2B=&@?0EuY^YJ*L@x2i4{J^-KAIa31y|;FB6}OG(t<0cTyAexyYw_{ zU&m=i>Hn{4DscZRSiy;3r0y@C5#7?*X4dZadQi$Gj9ORYP~hz)2}kUuMthjLl;=04 z^3?s2@Dd~t-{=+4luP_WW4gz?DZyB&j`4LfUpRQ>t<$|lnxrj3cKM;7e)jT|VCGG0 zD`QhkkuX>G2&-CYN@@ybxbZduH&(QB*)pD(k%$J5?)lKd?G_eDJs;;v{U7% z1+xJ>jrz*9yS%Pt;@c*Amzp2ER7!6629Lf>E0(ZL^Th5^@8vF!-dr*D;=e<7qr*&y zhm4yx=Gb*m2`+#ZxVENoOgDX;5&A}*(#W9YI$MGkfUW>tBRc*@*WVe-$Pn~%}XtVUUI)abUzvPz7)?74T5V%Po^r-2VpvNx_1H> zDs*1CnSo7xk)pXG#rI4C5O{)@SMV9ts{>?I_Pl`R!YYmLn;lEi7Bg*oU&I$GH^)ij z!3+F-vCTfK`NJvqijM(U{jUq7ZE5yq$Qn?8W$d4=CWAt;z%b}vh2R6lyeLig4Sf}8 z?s*0(M8{aY4@jO-lI~K`wF(a^F6*`FislpnGIfHU+`Ije-}fT~cR8AxksAxtY*m>==Fl3?bBORE z&q^jht7U$a1?;3UjWbms)9pJd^(*gc8yOXqe{XJOMHU&Tv}$R*PnFlxHEPL;-?^L} zqDX*0W(_Ckcq5yh@d6ED_a48^`iZvKLrmUz^>lEg;^D3Sbewq7e>3?k#66c88pL9y z+RHvU4G+e$dV5Y7Tnys$nABxW?aWZ?0!YMG~k( zLK{=ZkpiNnD%<)#@_mp}>|G7ITRnv*;41pQ0s}q-9%l=X*)WWe@@3AUJM)wzhG zK-JdhM7R*lGU}yO>Uz+|?-LTdAl``@lT4DvkN>?OI3p<&A2TJ^jiL!30tmOa)a4S+ z5+HYkkeia8m$=cJwV6;8kQQg~!8Oi6X;n<7(&J|u+@(`O;9_8Ht^}0*{S}qA(s)Up-f7dt3c}oY= zzj}Q{+2!mqrp$sR(J4O0qvZ>v_$2uxQ$2njFYz0IwQH&o1c$@l%%dmR%q zJsPJQ$EeM;j?`Xme{fALY>^vmbvE*f?NLN57;ZC}>taNJu%va~f0PRFW&ek5((3S= zB~+G8^cEcMvqmxTtOadHTza>0RLk7GQO4N9jsO&sUZ?6diM>Z`OGwL`PTOHD8_wDs zx^EK31Bsuwoow?I9r_Bq?#tcr*lj*`y^bG@>37PzJkb5fI9C&9}jR;S@#V+LPe3@>G$FKmbXy<7sfzXE=K zLKLr~y&p0g4zS$pXc#%t!5lVi$f}}^4+jl<3^sN93PZ+MqHpoMK7KhfV$=*c6E24h z*Tim`e_x8p9F%Z&VzZo?QOTam|68#6gv@@i++27F*LYB~aQIj344od}ibdp^tx{9wiA6mUE5BH9$<>$PnHBd%J)h#k?hWL}N=h%@EUXftmb?Q9{@y)M+O1c^C zJy?n3DD3+8QU6Vf#|{;NR(c$H9L2fg@~9>&VNOnOQv-dAyJ`r+t&y#YPE9lpO5DBO zVrP-TclWg`Ao7Z_mZj+hv+JAPChj?Zr*{}3K~5J`;62|V^(gD zKvL*Xa7B`fYr=PXpY^>2+*ft_2QnjvGO>^%#eOJ||Osm}K7M%qzq zS9z4^_U9R;tFye)aw8`bdoq3WO%f^=}yOmVXH z_~fZHGJ>R^6t6Tws|ivH9=kDT#sk3)BI&tNA<&6m=0{I_I(i{P8D`tRUskrCPw%oA zyR|)9UTVhK@OyMUfLx`U`E6ELy;%2DNkcHz1o?5Q#ZSka(GN`jR~2B;Q0!y7#`NzO6*1e@-}w@{Wu0~3s#u(IZ_JXzVVt7kZNabupekE>@F;V zeS}-^_|5zn62<4s9}@Vu`Iz#^f(MZ`CgbBUt+CQ&a){VkE2fGWyM9_n-i@vG%?xJl ztRHU>Y~VWjLA6?n-;3hHy#`DRxDq2V|TD+=`eo+=i2t;%EGV`&b zfJ7vyj|2gM_$1U5*>&u5d;O8P=!CfhJF%@F@4mrt^8$l}41IRHxUm2k;QO=}Zdv^8U|8mUpLu*U)bz5C#bQC&zG99W-iJRISIuu$e3&GE-VR*%krV53+ zdI_3!b6uj7O$gofD!=5rq&oaF?Vz_A*2iFOdFrMP&|)w;Zv^W!PtUOAkwP;$SgjJM zjTay{=uS;vt#p0ubk1r*r)fSf*esP;c*?~6Ro+WzlZRHOn{vH+U+YWof~Gi5A)nUt zXmsVF9TCvT6c_vQ=xd6xsQ|xSy(hKV89V$%|7jB= zaH|mb|A7bUV{eQ^QlvcWj(8Mj6h}D77aoSiDA_H_Wdw|KV^er`i5Q z1PjteWjbf_^ANuDj`M-o(72+yYlzy9cT$#)>4ITIA}F7Ve`@mp7hOAi?U!Yh z1>N~x;omnX)>t5qdkV$8hJvjtdQ@z14XvO6xtkLYp?;xKGvrd%R+^_I`!uEGfYN*> zQai{^Ld}5Ws2M4KLpT`=AABjSefK(897ou4`}tf?b9|Wdo`pG?drEE&`GlyO`>U1Z zE|WT5PlZ=(9@)V^n-$I49;l;|PMH6c-%gm=9aTwJZv8F2XwV)exeV9(x88C(uWD-V z%?8V$F&UAaSKY2aQDCyv67YwtcUiag0rBCzo6(~$RJQpC(uR=&9!gOUP*IFbpSdvL zD?gt=I|VVUi?4^j3GwOs$2o?q$!9(`4kdhp%AC_1-|j3dF$kesnkr$CPNB454cBa~ zWY}pmr3flyhy0M68Zi6U$9WOQn<9=9R@;_=Z*rt@vyqESZxWsE3fJQIs}+Uvh==>* zs;x2-YduTX2t3XKoWSuLvN1WJz3<4oG4i~I?bv?D1(DW_=^&Na=d$lOULOyH z`QZ^`f9pw}o^S8uyC|+24UIrE4I)S%)t)d*G8A*kK*Jc5nx(p^s)mYmOuQ|rN%a@7 zU1J>hJtUYz6t6)KNs62EKDejzq0_Z4i4c}eiUTGZKIBq6B;#N=uhx6OiYl^$;vAvI z)spfuYxWDTA|R@2g#HP1P>=m0>r;$q0Z4zM%CT1=LeF#XHTV-!A{LQA}*}2}D#N%eyRAac8#V1J{xEG@HkVcdh}eZcQOC zZOZG@f;3#`fdVa-Mea!aVEMiJ@@LR9Oyk*kUo`C6P8ZW>X{}?7;lsSv60VDftDevl zL(or9vr``r2H`%1af!ylf_gW%mbH;TDXm$&1}9z5dWi`(g6OUXg?WRj@5!Y>mSYr5 z67%tza>j!KuQSFh)bi9#%W!#E#^>RksIH2}gsGoxV8gT?Pc+kWCMaA+D3|p3iFLw; zs63-7*%CG{f6BWs9WA@O`TFmJtXZlytDY^h)P!(%4;q%|j&wA@H6gh8MQR~Je?nXw z2IUtfV2k;VIgvwn7%#GMIHn}hpRwl`c=r4p0la%x=r@1xfU8w)z4p~WaG&FBeV6eF z3rluqL*3_e9nIWXbSrG=fvt~MGL}$rhSXzilv}-C+-IJ2y{Yu!7h*|kh-0|Km&=Hb z{UCGQm##{;cD!4p0fcT^usmf2YpmQ?S)p*cY}WmSF0aH|UT}d!kK~A=g7{-d`Nx*z zM7T9nLAEz8Co1EvI!5C!(wvzJn}xz2QNn%tuDhQu0?mQp4KIu7^%DWS=1?z>uM_vj z(=)w;t_cY2dc9h?BtPe&JRO`Z?lVc@vl#ySJc$g41<*iuW&PH!M)nDnis@SXCD*cF zNTZ09ATH~@bEepWv@u^CF!xeJE5ScIB192A@GupUfF|_EJ??iqHdTF{T8J4qLc!f2 zeR=P{ho5Uo*v!Wy+Eq|Rr-th%!>;-X*Qr=Ln^MNOLyb^E!X`Eq(bw`coxy{_ANjwq ztxXE;Wv>3B!*|ku6XDZI0Ycp$b2EQ8>bcbY&=zruqWnA)Q=0ux!m)J;^+W6eE@Fu? z`K#yO4l~AVzWDduROMT}+aet^6bg8hs0onpP8K#rq;(JW9#A2Sq1oywkc8_Rm^}Z| zMJ0_bh)%hI2bAYq;XGbor6u^tpgl)RK(P4u@oHHLw(+Sm*S%1oTcsuThn>x2jbc02t;n8^ zS7ay`$6p%3ayI|%64Y3lQEeJD&17$iIOjffHH+Hj3i}?XBAgeUr~$zx?z3XVfB?xV zzh3U4?)T2r@amV&r#a}>i|EmI)G^OZ5>Y*eh!=A#k`LU_+s() zhRyejcdwCYjZqhAeGjhc5uLcZa?~Bo3r`wLI(QP|A>>9-+4o-&2=J*}SWx8jsko?g%GkBa^J#Ae?+tUQQZ_N1dR@!_mRX~tMrO&k|5 z9n@){@Fe~^9Tn2U@>_fWJX08YXC%K)d=iCO#pYc_16kql3J5kN3 zi;KFNZ|xA=82#|73l{iwZDlXtddhXBIrKYoI^vLFIm2eDWSt~!s>cbw zdQ<)vVYZZiov+Y!)3he5UL5RK32xh%kF9jcM=M-CoFF01Wk&RWeC;MHWoTetdG z|Ejs3p;e|?NGhTtG4XxfY=o6}rsP0#!%B?iryD_pd)@%izat6y>fhB!#xUQd6JIjl zt#drkjtDJBrRLPe>q2=xcS78t9tu9fAqfTFVNGvFv=ZQ@u->Z*R*uqDhp zt0P*w=d-ByY}r9+{JJo#)J8daar(@)^^x^Vq}NPQVNOOve86ekKkjwT$V_A1ya)Xwj=fJnW#tV(55`dtRJn zD*EkV!nbfg?mSiQ1_6ZRdDzHp1-PV6GVE~mkrOi;u0bLc=dFTHdJpn-C0m{5@x?o5 zb@I_!x0|u-ckELhzrC+};}4|2KInTM7kM}1G^3{}rccbe-73X%3~{8EGF?YtRTaMv z(Cpu6=${qGz=i92nT(LvOt-;v-|6t<*$e${m(6kvzbg#4D-S17)TP5P?L5>MR4?OB zRIeb4<5KfgP3|LS;+{kfJOg-5Pg<|`FneNL*IoiK@^!X+IO#zFi0UYCu1r}6{P?2& z=p3*D5`4U-8O@|R%haYx%W*BV%asC@lvI$@J zq_WIXIs-?;rHVyROft;6 zS#OqFhoJ}<2<|CGKGP{nq;wKNEV_cL9YyAUU+6La(-f6HQ`Q2oy5Fnj{1Z4x>95rd#PX16_>*+Z9|JFM4 z4xpqo=9nN|V?;-MOMf{q!AF(5wPB`IyTRvD!jGYlyFB{q<+a~Gh0sBZTY6vI%-~RP z5bHbR)E7(trGD-Gvnca5vTO)Y!E!FX9?6JPuJHpeec2V822i# zANAjIEmEP0T$C|p)HS7hwfB*A6wKoZb#29~g|`3C-i{_LzV0$>v|d^ar1iLr4l3Zt zg=vtnc3|^W?ae&0tq_=YxE|Cvp;4HvDxB7s>oQAM0(wRZWFVRdp8WVY#Kb@}aU=GCAHTJagLCv6V)j!KRg8m05&C5GeP;4r#TD#Gdsm`aDNL?8XKkGz{Z8~kKz7RlJQQpcq$G#CHgf)T&&%qPWJc*VjIEbeMDAUo&`{baNF}5sMLBp zD3z0iy!B=d(9RpMBt_#68eIH@Ug2S4qV5C31HGHg-?bq3_|QSuF((wqSJ22*m8fe! z%eB*ep6`Q$mZ1Y1xcgW?f>U2RiwD&4N~y?p-;mR^vU7M#%e|Mt5KZvz@RHB-#Q=7M zgx`X%*=o21g=o9{8)fI>N>9Yr7|lWoun|>NZ_3XV%V-6BT**b1JFep{{VTtZ2(t@c zG5|nc;ta_5&~M&)D{Hwr<}uo9S|>-oksyfV$t$NeOH|vSs48&rCQ<}1PbN^l{XS*< zK$p(Y0ZNE*2(+udRa>HAWVem_8LiB3F;LNY*7g2~6lt{0SX)V^0JyGxZmWwoT4TJa z@zm+;_zCgHZzzy5=Iyws)c90N-|#SF<_oZmdQ*tU$prjt%8H%5L8Vy_d>Ij+$s~@> zxfrZ2GNVquM%)q6Qu}v~g*+$v7pF7hr3_T5GQO55Fkj^RtTWXlE?E%0^zgX`uC@{7 zkqTaIYlTD82DSIzHzO0Psf2Vu!+MD z<&&c|Hff0OMnQgX$2o!j^G^GpN5Ey3J2Kx}j6O6yD0Ux|Vu*9A4T51_Ul*pWivMkt zNsxeXPv@aoMyWBwu_{n>-tW@4DP(#s&GP4ha|-*MH=43ZRg&IKao-$hLw4rmn3i%#rOS+AtD<_uEAVcB=r z2H4ChLY}2JJX2x;`qhGo?6ss0Stpapji>n$8j!ZiN)55u$`6A%G}iQG#+fWQKIX+7 zLspyZz_32#_wW>5;m|teq?@Mn(S&XIe(Ei}w|dff6FI`3De!Wt5yUBPzU>X8VUO+E=cKB29)hT%@?%z=gfV|EccZSDwAl>Y_4;%u5$ij%Gfs zOI)0yRk36Q6AT2TXDwDXM#egKY4@%}|E!+IpX*(t%kOLM9aSvlydQCVV=gtBe7amD z`C~S=zh1x=qK^4X78n^u9$eG@BiwHW87C4A^ov2QCU$Apo{{-MZkfB633IX-syZz^@G9byWFG;kS++9y|N)tET#z7F1ZU(pN! z!d`PFMy0sQdk??6H-?*++ZVD*el^yz`>=s;9}&=>S==L+?`@X~boz`fRMsB>e!}K!X+s7ChzWdmc6TehxooioGDLp}@VX)m^T`(TCke zwFSXgC$YD?u_MUuZe*nMNFK%`8jkV@R}SgzO2*p(C^Ac?5kZ?8yaCea58^Z7_Pt5< zD)YK6a9n@8gr^m6fm6P3ecx7cRS0iVb56BwXf@-oaEbC;N5!6ce5g|odIh>ywq}R2 zCmq3gM|2;amt-~o$+Md7V`&-w|78Sy3lKS+=E0v?GE{I?XSAbfm94^LdvGsz{NjPp zQE@WNSY4kpP18eIhbGZYtCOQ(Hke+}_!0D#ibpyEv(UMrJ{bOUvn9DSaBd{y3aFRC z>)(+?OBujXbH88vO}`-eJaGR#8r>zre=-((#@hDTw zSl|L&86K3*^4(4!o8KIoolW%&R4E=|!yE#Nc?RM6(2|w_gb#LN2g)X?(~O#qK8EP| z*5y=)Uo^^GjYkvub~+SbxKjqqXh=?pvG1Y|j5U;iwfFg4a*|X} z$NBfH(k7uQ!2KE1AMpF}oW>t?wJ3q6DguOYl?Dtvstp+2-?#cU=pQrwitH(R=x;Y( zF6U=r6;Gcgsu^i~q+zy`lt8Jj7iFw7nDk3+o5Gq%uQLdiVZo{|hQ|KTU`oN>yH*lE zm6Q9@tJ@hm4zuM$o678t`R9Xe{PvuWEq`(r45WZF54k#QHztYV43u&@P_0ZRT6K4{`?#&&- z?01;mz0^;+oQE-Too4RV};^}pDwiEoTh6`$C8)wCIot6%ayWi9r{(S#j z8J6@0iU*KH%J0mP_aiUawSkdoqDOrU%H0;Q80iO<&E^ z-Pxtn%lLkd$C-)~!6NX*EWLiPV)fZ<$%*rZ%O+P5SBKfE z3MU0KV{C41n9k)gp2fP~P;FC=hx&FfS#@=c{kcNuh(VJYDO{;INp4m% z=bzkXTTFUtt2#PCewgZa2hZ^RH+m_H*x%l{E4uoJxi0Xp{O`3#4Xs7?l>Cw@E8pGQ zXzVY0QtozM?v`0jQcU9Pb51rzR_fcjN$ILwl?5s$W^z{xt?kWZ7x~c{Py3L!*{gmw z)(dBJeO97Whp2ME=s%QK@m`_b#j^T6r2i7((S{;$fIW4d?SzW7d49*-KkvM+GGXrRGm^20Z*!s)Arpeievb{!?L@p915s z55|$7kwmBNb)EU=5R1oxGytvUKi)v#=Q^Aw)0!KpB2<%pl>PsjPos(!v?aAVOy*T?zsY01-yNab1AH3;np~_I?Y09IjMS;KrQ0&n81h$~`K&vAt<9J3LODbU#pY z_LH?{0*)lHiW7Js#ZJi3AZL;cFjY;=WC=$pa%VNTWKn?5LeR?&%h|lncMt|$5({juRSgu0rmI! z?*{dgr-yWEKMnBHf5`HDrCIgc?vgi*BKpA33&o2HBdNKRlUk3pK4ABb(K4xtNu!QW zOn>zyOkMlj3@l^*eA^EO90SHRNNfav6A+#TDrN6wwuC)z6!~F2n3||^vXWu3=CFv6 zS!nK67m5!L`c85hj0&brvAah{!VZishWD~FRx3B$&*#>{8zM3bbG%Ax>x?Mi)=O<1 zI$@f*i>7y}{lW%9C~lKmH75h+;Czn7;c{bWP&ji>SQ9B|`&mU|(K_ox~YyBSkSJj*y~=Iq%cI_U;Zmp^|T z2YT#lcA3kj(`JBfz#eQT>Z+)}wfsuPH6PCnm(0$_TJJ9ic$3nr|M*E9vX50~?d~#1 z&D^o@R(U)3Ic}8%md2~=&}EjrXIf21uAKew`WKYjy40WmITzd+I=jXwbWJnt!9B=A ze$aJ6?W$}?W9FeB+F>HpdUtt|stB9m0$9GXhJaBaD>Bu9PlO@P|3N)8TuDj<-SyeC zY=9r_Oh&Da+07~iadjaWJ=4<|y{V;s`nX`%<1BF#<1eFzx5Zw-=d|mtJlpxBMpK8Lq=vyJzAa)sb;DsDf(IQ>Qrw@d0DqR~%*TH3DJYJxC z>JuHVCixXiJy`fo84MTguYT(=`9Kze)*tb-7_3138nz4?_u4@L<6?Q8|Cf`K`pWYxRs$7~DW58u+y5=d;yRv=K&o;W@+HuZPe=uLMC@HSjI z4#cj3IX?HzfGdMXMdh&!OzvxxY`9HMJ*{~#jak9Ts%BYoCoV>*qRdX3Mx-nmYr~_o z2|+#kP9Z#IPKx~@ zj6P~JOxd}T~0!w^3Z8I91Te=?2*z)&OPni}NA;rl> zST1V4@o#(=A$q}T3U{#bV*{CQR1;MXO?f=p5|G|9leQ+lpyZ02G+se0e(DB!@TT$% zvAYu6s?q4Kjmm2a0N_938`k$n`9)5#Lr49L3`a%>A+(#kX#1qT=7Zp@rjGi}pIfBd z0!8J=@MO?nZkz`?@6-bA?QC^}FU}fd*!D%^a8+OsJEwMA4B`WB{bS6$8@=CVkuGa#oY#4y_mQ za}?(1@gX!0z)wJ!m3!zWtz=wd<3NKVF+*lo{Q_`58QVQ_YV;0N0kb5&ntbSzbboNa z78bug^Psw&Z5(ea9IDz4iGg;j=vZ=VI5njNE0RhITx0GT<5MFly*l}-&+bxPU55DB zfNI8Kv%Xoj!MK_r9fZRcP5&NiXqdyj^H7W*4kWpp!2nys_F zn5i9}L+YHM-ZJfgurxvV(2tZDT|kxnCXaNxgHDN!I=^;BtpT44-r+ks-%Qh!PukVP zN2#2Ft9N{6vO~VW<4bIF$e}K?4fi(fSW(-o^A^q=j3{QBp?$;wkyaPEp|RWQp22TK z#UufH7-;M#u6Im@5gs@x?y4%}I()eOA}~oZ!*7$3;kn7OO)M23J&%r5U0RA_VNDFz zTqX~_uKr2GcL$6&3Vs7}iw#{+Ssz=gzggHQ%n+rzsH`ky5T41QXxFV}oeWEB1Ojkl zd9e+2{VI^}G6JLY9`$Ch5T|-W=q-G`Wk^R z-iZcS-yYtrj^+)rC(ivuiir}Krp&o5yRw{{>W{eud(eHKm0B=P+_eBHTSs4nsZnHQ zYYkkPdsgKo!j=2IH9J}pf<1wS;9JsYaJvRChyhiDAT_yW>!-TEKmtQla3Y@Cex$-j z27~L8=rYcQ6xggxL21B__j)I zMA2Q{4iu6I`l21DR{&1mCs2N@_3TSEu!Xh-J4lD)k3koI3@fsxn%vKMW^f}K5r$)DQ)8n;omB6@Cvd4gp5h4wQeZo#&Yzx8;sw&l-j-ZW#H1c zl1#x4k%_c}&Ls(Hh8&|vqJVVju7TDpBXj+pAdK(1O+ygGtme^{NuW*_P~-yN|j?&71#oKgil^c*>-NE zq5d%LdOV67oj2nW+>LtKo}HGinZRqw(TFA$`Mi-gzMo`9bwU`Dll`t5;-kU+GCyae z`nW5%V=iRIz#-K5r%{!!0ZWYtMyLA*nIEiHJA8)(+JL|Mp;_yX{3V?A@Lfc%dtb;v zI4t%Q?WDitDu<)S?!#Z7GI(eIrPY zD-JKN$7{-YZ`N>-s!ZU*O-J{Xt&UA|+|yffu%4t>akr@xet#=yfJthFbJHS;GCRP4 zlGNdgdHst#Sq6OSn4~P&8DGbC?j7~}G0g+Rz|@}-$@Md^NC+mYc)oJ*XlQg4X7<$o zAqW2hPnRd%U#b*4xI9oMeTF)yv(~BXQmmq(nxofC14&bVVFOoCrn|W%8lidFRY(dm z-gfh?cC&ss@9n@3nc2D9&Whds{ctVIjom9mzHqJ?HOxI2v{aE*q(4`m{7$nN^l8KO zJW{EIvvH8m=Foe$h+JZ`#nK`uqe+qo{CBk2hVlB`zXl?iP zuG+Di8yC37k5Qy?2aFXw-|P%*D{cXkzbZNLETdRRxj)>mI8Q`>8O_th>A}%2 zO&r;KMV0HAv+sC6`1n&Y<1=Nkl3v#-0H&GPHSRZ5#jxD#iKC zM-$uMYqnxbektOGC_B7ou~HhO#M>2;NqIIi)}sQYpWmbgrvFu2jTr<`3xOpw=Dd`_ zZcL{6!v$EOYehm4@K#91z3jH=D4^4a4@ z$ic-cSe4g97*+Ts%5JL%;6tY;MjVR?GARXJa;!Ay0_4>wOtu>N`%AG^BJ>F#k!}lx z9vYY=dyvlXNsu(f+B#9@-i}5WeuC|6pSgR~;gewtS-;^cNh!P3zh|(}lM*NXz~IeY zXFjxZZXe3Iq6#F=#T%UcL5@7lRNNBTg8vwgDycN zB394x^@ca(GgANb>AdO1#wx(X8&q2FFoPvWmF=?|JTr>`U;ZHABVYx4?7DO1RJ1hj zO(OjK+FBcs{q4@PCHTsmq+uU%2{gfPGLtw6Vf;+Y9!43D-Irj+sBoL*WeMVLpRdAb z@^@+#e?!lCm$W?)6coDo=JfYhmrE-z)wX9cz~{8s6DlbB!}HJa^W@gnyF&~=d=IbD zRB0_LB#Ns2_Um=MYvnuXPqltywG7rfKMC1-WcbzMX^pgdfyP92yIY#uh}FPu0klb#s^nJVp6x-f#md!jm?5v?K*Y~?pJT4`p*1`i0LpA+z#Ibc z@<|}*4K!N<)!NSX@p-%^68;ffCF2y@kke2DU3a(1YOe3l;-7OM3I263(rH+Am*@W0 zONga^<>f zMYC6L!krxE4j3cMVcb7AkMF5t7@R;Dt$oo#7++FzFTCi!UQlvbjS?-)oOd~wjbwYc zK>mH12Dh0iH@z*EuL_R3kJ4k)M8+FS+Ps}h4I$Ua;*dI@viPa4So~|(y-%(xZ!uwW z$nSlrQZmaM+F?MJU2%Kh{jDs#fL-WwEn<1ZK&hICR#vw7GoWAj5@0Hkmj^FszRrgH9G3)1SSJgN#8WNmi+YB^u5iGm2mOSp?y_16Emzt; zZSVfbVdmCgcZ9wQ;3z_`2+HkuI|?eb)}Za}6zw32^Ry&K@Dp*_+xwk&4kyUHr>gq$ zeS^egWlKP!?*`g2p!d_S)=;iNDqx3yNV_k5X3r0(wccMlYh#}+Jpp_QJ3p@O&kV1u zRxF!Kf1V8&B?2Y}cc;@-x_r2d65u(PKD{?YI z^!g3CD+^EV+3U$zZF=d@OsP$<{ml8wdpAgQ@?u@L7t}Jf$7zF>q^mld7fq3yP% z>@XO?PGZYlf1TXMl+tf5p>M??;q?{u58lxMP6gJ z6Mh*D-u9`o35IHjVDfTGO#?t9p_>Wg&jxb{G*-yaS5dR3q4_ElP<6xV%k@USXR)Rh zjt!L;r?myy0#|?Sh>)E_r0Al@%>;%tA3Gw#;T{Ae879;d1FVd-kou+Y-y{~P4qJaP z#1{bOE(z=$QEPNJ5#hTUAjSBB*^sum%y2UNb`#(U6t$RCod;W0mVrZz%|wDVe`Gfq{^#BI~wIz$Z0q&hDvqxvBXL-{$W&i&l4 zU%jk+^oA(-w}d6x6W@3-Uo zS}b)hA9W(WsUKwsb|Y>vUe-K zLWffbV-10ek>Q?gV8P=kdim=8*K*^<{gHbxNOed)W22?WBfe*@GxK-XA9^IiKh!Me zlko&+PS*`Ruy?9pLT@+m*=OA(eLY2xa6riMXm$h)H4EXVZ&$Lxj=6t0gIe))S(DPS zUj7BNcwTqr)G{VTq7GhiU9#+!@SgqdRrU8u-x-d0>dE9*&e1^&ALqu62w?=sFma*A zt=XwIZ=vI{P``3C|2nq0&TDy!-t7wZXSs+)!-sqW#!n2av~Y~2$I94^2m#cjR%(h;~ld)oSRH)SCa?`ol<98xz_;z4$zrPmIBv^_e;dLq+;>AD{KyOGDhm+)6szKDRRO)ZarEMez8O?=tf z1=>vstqRMwc7daGa5RQ0xinRGg$s;S@A9vgIxf6RdR&~EZlfP<*fgepaeX6IWP@N4 zE8Hx!9rtbex_Q96QXj#n)BcI!1$d|Lr|J_+xI_NVWCZs3PUHNb4N zhqVQee0-AuD6!LZ3*NUv?2(Km5={A%> zD#aCl2AVmP7W94I*OOmGM?4ivZwt~iDaqG2gfATkVCapaM63D=4#FE-BL`YnQX1s+ zDl7<(`%+nv1Nxfr;x}w;)}LFB3k~04^J#gUo~HouB<2Wwr)lxiKj}*ARzEz(k?uCkRUETKadgIZI2Ju#LevGDT zD(L?Hh0E7JA#EhADjbq3zE85kV7tYsZ#rIE-<*{rpBeRICHAt5oOY`kFUi|nhqCF}*wmVywLGCkyY_5YWrGxA= zTU)%h7yCyf5!VK03yT5Ii2<}Kwo8bASQ2!_=?HmUe8D2S+r2DD<)@7B?*0)Pyebg^ zo)z<#EXy!((B0_xydS}b>B)X+=mcKa6CHV>GCL7N#wIK_gfN`QztI0ZJvWgJS5#SQ zB)e#Nr{%d1%;a2Qm?F2{7PpG-v^)k`*<~57Z^@&J?si1uWQu7-LbbA(#L8HoZ=`=+ z7yO)0)H1wi0L)3Pc6N)G?>rnq5*<{7S07Ktckl**Mm9e5L_iS0d3bjKGw==>&ClkL zw*nG8f_LcLk9cCfr5{}^g=mNte&k->AgyQ6{vZ1}Z$OGXsC#-i1csG(MfuS%PNmK| zLl&ey>==bI6YfU~D9q{i7kJ#mhR<@gpw+BGd7^LBv$*|^{JlWlJ@^a-#MMZmWY`+B zr*l(^k2~-p`;YH%n?qC523frDZ?v7agx+!jMVc;IS<=_%*^>5}2XGMGXTZ0p?FhjW z2ugD|=67AZ57cRxNgWu4AVX1i(eD3|?Ih;($?^`xJ0H?(AiXs)pR7}pcBtd4YJ;$# zeS<7;;b5qe z!~37VT>SF^ypYnOFU|@#htfC7*9;ps94K$DsihF5@YmmxNX+(yLzmgxKj)jV_x1tqM-!r z%Q=sqLOrC+b&$s0xUZi`?t~t;cwaSu{Ib?Gk>W{)F_+S)V@SRX(tr}iK*=Vo925N3 zufx)`AzvH8fXE>N##15oiUm3F3`}{+S~q?Z>+n;tc0O^#y6m<$=7xS$cL9|{*op^l zxB8QJN$c&dEJ0jUxGy{&)}?oc3KM#Ds^sZWKuPKKvIj0Yy@Igc<5`9B5ZAl$+7th=d(UX; zL%=JajBxij7}XGwr0cu|wV^K~xwl?e0~bac9faNcV1A{bfO z3N_jH3H!r!Cu%+4jCS&w&el8a(-(jM1TgqILQ_Vyu4n)=d}bq|m-}Dq9Yhk9G>Yes zkBlODB=a~P3($+g6Nsu(4PUfh^E$AC~3LisVVBO#P%fgJQw;V&J;i~-6M0fS|T;sQuI z4Ab+>s3+GCdTdLgSBU%T>;B9=V3c>SX6A!fGR*TL0UK_(T?hqc@+K^uoS^)a0CZQ9 z0Ux=ppv=SmLu35L`kieozd+}Wj1T#-G#gycA5JlY?D~jASdjW(B;u8d#%|lZ!B*iz z2(>40dZwz!sj9Q96e}z1iEujEr{AioEY+T{S&z_aP^`lIT58GWS@@}zdvS8SYP)t% zP$zYBN)gnCYss*fEVbw~l3Gw9-go zTz6K*O^DdYGKlMXfh?7e*ShujmC<377vPdpH4@ojekwUmmC)B%drg zOvE@ux~h;-7U6FkJkl(%6ZDvRzescE(o^|U8{OsZxSF|>F~gEY6L?Iir@Nc;G?XB{ z5`v`3LzhKju_2ttAc1r*5?7RYF?ToU%Y48qa_JCwXJ-0f@(WP&MNV6wwLwbQ zkDqDPb9G^u-h7+o12j?lLOjRQCq0OsP!dQ+g@<|N36dV)w0;t1U^%wR!Ic=jzLf-Nx36z23=O7_I!B{|>$2MF#q9`vyT@=tLFMMJ$Sq0KC#>rKXcv zByg1%j&-Q{i*%BGxj~NuBNA2)ZM#6Ye19+5Vl6e>22lcO?Ypk&fBoEZ&iWEIZ8wuLF0HTwbs`Jl`r!3Wj`R>XA`O!t0RKg)cXsYh+s+#qz-@)7n9E_8G! zK$_X_&x+pppp#wQbaW;^5f41ZSr{gvaR+wu*7;qNBfISHtLmR(GWW_FPMsR@Br4q~ zyjXNam~^~=4&*UvUq1#Qa|_md5LJ9bIAAuwCgI^Gy+Xj?cHFyyI?@R230?J!G#k~+ z1%y$#aMsr{j&Ff99&0wZBaqGO9G|C8&D9*SqfsrAFuD&gMiwPX>5U)p)2$93Il@ce z*;hOJ0-gNW_67EJ;u&0|vtn)MVR<>SNKmcjjb^WwwQ`#&*GpIJk9Y6O)I)FYU%Z$B zc-76c6E+P=S8M|V;))87y?qEughUf^yZ-BFl@9ZAe8!%DNbd4{2#)HlMoYf?FjE$OOT2k#xEuUZ;W9&`{w1q3rvOr zWsrCvnf3xh3c2|3*pn943;3Sl{img^*-_!dV8G%4E(Ah49<|z zgGs-UfrOr5dl-{>*t!QP6WrOOVHhO4pF#7;^R z``onZT>-+VU=p3uN9@=XJQ4u%hZES&)4L>i0_AmShe2rUNn%r?<((E)J2YlXZa z6@@De?D6kwRu(Oed7bf)uCCu$VnB1RfN$FT@y!|{zo68GTl;)3xWzCnB(GjlkB!6P zg*itn6}#o|aeU!#P`Jc(yz&h`iS?e__JSn-;CE?? z`%!s4yq$oNx14n8tlgRh{!?XpM-uRFs9*&0#qa29dT***K5>Omwl)E9WC^lefH8E~onid7ko}asY_@yZ z1bQwOcEpn^0Go8WSzw~MLRMUUu8sJ&5jG&MIY0%R#9Aub$gLswBU z<8bbf2$A*3wI9*1G&tEx#%h1`jCy~$RHB6>1LG)cP12B>&%ou<-P7V%{|$)`?`k0y zc`SbYSk_X^$mjv^SVdf7V_JfDOYqOaOdUoO1UdPAFXS2$z8-H=F1j&!KESA}H8t=^lO3@Ut?C;Pb@&>yuEU+dH3xJ~HxCsWfA&ixB%# zsdK))!%4byqin6Gcx|Fn2?t+gv&1<$I5@OPq>_ug;Pc{S8wZL6Zc7rk^k8GvEBLUy z3inoF=LWK3x zRdrM$3%krO5;HMp(soiQbB(qKK;2bw#v8sZa%rY-Fr>=RrABHsd~}K7g4@yI>aqK= zzdx~^V_yPH{vlJ6z+iv*~XqlC^u_M z>!j-*2F)oQ_f-b5t>#3@*)J~IY{$QLMPZw1_Yzpu&!8N-2$n0y-`vyVIc=TV^ghmk z;)7O6Yo}2rQT_B{GVyvC^<|{WkyGqT>AN0PYU5IWO3Yq*?b~+kMuYALb zvm^WbRcw%`!teNd zB=NOWAfR^m1@ zB3rtWxb^c@vFT@{JDB?Mu7Ox=vvMxF{y`2?RLkdCL6Y&c;{@{A10+$m44hCN4^_q0 z>8900TsL1I6&1sNh^w=Y#wHRwmIIc@yvo*3XP!GEmi9IHjD`@&?2zG{kP)UIBkB1m zI(EXE5*xvKGj(G3#K89k6B2d(-Ko%WOn&OsiG9uD5+q<7=IF9Emu=#g!`T9~`t~po zV%&$JreJNzswAc~kMBl_mYO9x5%8-Z0&2!DKK=^5o!>PJi)?;SO)>04j`Bf+$*b9R z=}u+?|j3Qp~w4T+-Iut`d+y`%d|0AdO?!aqmF*XHE7TM zE-RHFHI;K^MN2IiTCXy3O1NvC+*;K;%}b}=bEh(xxN5dJ zhA&bUjbap`p%UaSab7XbEKq|>n+0HV`OpvU#7o69kuz=OY3oS|Q75e<)N_PPc~F$E zzbs`?%J_T4ABDg0lz1lG)AV1QKig!hZElzJrie|{p)w~jtOh#i#YOle0GZ%4lh!ZJE-E3nfu(cLzpz- zKs=vYy~!b{hUcZhf#F+4wR8?Qx{p^Iy7$(8Oxlgu(Uu@dyW~r3nP?UNAp-s)l}m!) z5kia(V&iA(J#!-hB6d?n-CVR}YP9lvDo$1L1W?t(bbH5s_{@jg*KmRN1v2VusK*h9 z?Cqc17-Q<$%Z7|AiNOjZ%k)zf);#nZ9Ki`AO1d#QCrs|EY8Wb5bP`vuFNM=5tzFzZ zHz7jWyLX{Yt88^mY`v+@yiI`yg%VxaglWD!9T^m5)^LYZy}@nF>9LrbgqZFIwZ8i8 z9`cn0-8HY3k2|Os5cndjQs_7`K4cy?eJ67(dN$;FM9eXRFy$&@jD&lA%@Z^St+{QP z`-9{eOn%?02b1^1)F`tMZ#tm*kAxmdQ)d+gMX3AGGdtK4us?>Q%TZyA|7C zo_8Yc?^{CsAo4Ve(HgEqVbi>Jk6&t;)<#`RYoP{*!iKCZx$_NLwF z#ga0xm_&BQ?vq|L@vl7GhS0Q}-C{Q#)`lOaZ_Lj0u1_8ElA%z+tKQ2>hzZx#81EA# znNdGP2RR8AULe()FnlDYw2bedx-IA8I3Y{Fiz@026gi>#XM3a~xu>Je7ueDgF0N!>7aeqgNycs4&bCIE1I&9fm*qr3!2!4FNInnSxLHql2yQ$^p zp{4jQ^_y^{%Dm@aS#SNoy`okjKa*A?hh@bTPy33kkBQZnM^#Js>jR^7J4%RTA?o(r z3(2`gnA4-#mXhHsyh`@^QP{fDBz3YD%iW(;RH5jE^7$>~)i5KkMxEWp%W5ra(K5|e zvu8GQ<-rQqKAq7wE81H&D7@fJK@{%C4+>hCBo`Kv{yt}-m49zz^LcM{nu^vaL)r%Q z`fB~%+Xj?pJdXto#JonG)YfBT%>`0zgYQI&l2DXI>9)QGV+^5yU76fYHPBAfDbv1< znGkgonnBFw#AC{Yn-g#9Gsv%qQ1bIR^NTX-4h45I*Ui^tHPn@M@j18)JK&YcmBi|E zj@im&uECx>UwOsf#OPJXVM;}sc~TWNiI<__b1_?$4HlDrpoWjBnUO6DzubZ zn!+0R=gcNimM-b9?RgyG$I!+)

    9v;bROyQ_8&iBekWA`Z$#7y3V~45Xx1$?&Zkz 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�B3d_q8w&Qsb+H*UzF$@|qs z6uu~B4``85z6{C0=X}i3%}`IeCh7XTZPr8&Wbgw!zTE|P-bA!YiBOE-jYq!-U_0!A zPs%|gSVDn<&UiJplW_XA$`@La_}L9LLv6h*Rb1y#i_bA~Swvgt+fn`fie}4YY6iZZ z$5ulv4lR-6%B65dbXgg+0aKlS2`_>hEJnhrJ*QikKk2qQMg7bkNn=ex zw)RjNaFAj4<6*YuEk`ILlAHqgv&D9;B8r#fH^IOhlKcLn$5^ornx)&eho>)p`uxPh z9Y;I%J&)WLly$NcGUzxCSjRg|;bbQD53B<=ZYZ2KOPhh1ZUCeOA4)2^zW;iA$6i0E z00x#$*pLiFVel0_Ab(R^a401Te)8Xuu$Wb9j7#$@dXac1Y9rt%p>+6(o?ZUnbAhP* zZ92X|r904K5vUV~#nXE@J)Z9!zYGqf(23PNd!i@{gh%S;fCYt9#~O9#*=d|UZk&t8 zqDXP;!qerDeSlg+zC(mlNM04YfF1I^dz3nAk5Llt0{-Fs_~{W0k)qE$!m6-|y_l(< zr((>gc7f2^40F@a)h{ji>Zoe__U-iU{N_+xNj;DXk4&7Ca@kz!I#u71*EKq6QLSAl zb|1_M{O^19w0~-H)B8~Y1+udh&}i!@*0^up+KBb>EYD8iT^E|2e(r|l)JU2re1>?_ zl!{|;?@2|jh$LD^w%)@wbDLB%!8`XCW7Tcz^%V4MnwlS#hR9S_Z0;xha8pY-k>vEt zW+N1gCA%tChCV?~J=k`u)1EvYv@_tU7LzLAEZeV>@+;eY~|< zLYy%gc`~tmxiq+TRvYBE^=Z>RT;S*rhLCDkA&+gTdC)HeMaYWnm6oo%%ZF}T?5bL4 zDm2_!2f|f_1;E)F_fZTfD*z<=XJFrUE^mY0s=ZP8GW#7%f?He(wS~v~*6HAC; zlqv0PLk_p=J1rCH$G`pVXN^AW7a<)s$cJcfLx8g7JBjTb;9vF8&dL(opuoq-+`|mX zzQ+RAPx($Nv>|K2SiPmj56Nqnz>L%I2++OO9J02yL?2_$KLI#b0=7hVq{hI`}@9#Xs)d zN?d$=!TucN0bsXyzkKPsw#(GmdCfq~lR))g%Gn+HI#xpt?)meFkJhn1H1Ij4)%)y$ zZY3+77@dMNIYAE_$LaR6$D9VJ7C=VV<6GU@ay3oD&~tfe&&|tjiHC~R_JPc?k@54a-rS+Rq#D{<=AR}?ZV1}kc6zD7UF2s_vh;cY3d?LQ%}p^^aRvpQU_+J zxSHP=vAYr8b-+uZf;`(cWAm6(SF^ZiL*!3bM4DPPdE~HXK`o|4_L*|63jnAIY0p0l zMNs?wOw3Vlp8W#?n;?X>EI}aPr3hsuQ?bzwo!qo|QrN^x)puFm5*Ohg?l=sG-^0;M zLqljUhb)Y9>ZOMZltYc{RdB+l+LPVyIZt*!QX)jU-b+%h4hyay(GOc|i(UsWN80*_ zr@*fF{=4;k{DruV&MFrcH|l`1{q8Ksfe1NG@l2NJ1j=L$ix1C9x8vN0nFo}|7c4|Q zPkA1lq}Rwd6wyrVowd-OosCewmYVnCg;s*q0~c2$N_d56y6wK0K>L#=^CBjbO5F+A zk77#7!BlIr$ku1EiVhdKGrUt>)Ew+AcxawzGbnz!k|gy40udZ@+N-*>?MKJ5%g1%h zvFebpm$^Z}R6umNmj~UH0p4VL z)t3Bc>)%Y5f|T{0bBo^G8t!RLDBk}uM-5r{WjYD}C5Po(iCK+#Tj&Rk6YB9GntA>} zp3`p0PeY2sxF4gD8M;>WTWf`*yP2az?%t5;NiAC&8IhW>=M+y*Q$-HTok>>6GbP6e zh*uOGG>+=WPY3vsrH`GL$_$|$$&3L*o`yYXrBPZQJMILGgkWZoyqVAVn*}x@guodvIo7Frvz0#JXilJ(uvL%u^6pv{ z0;pVJW<6t`w-KZ}r@ZZ-67CmiOQyaUjHte$iN?-SVfM~_K2>=GH+k9CKW9mMSc)n3%Z``-E%Clu=(p_HQ&rNh_tHh+c^UReG$>Ule-@Uzkx z9maJDY`}VR@iro_MEV|2d@P1M=e9HJ&51j3q=fZZkpFgEh-5l=%R21&)Db~rO18&% zt|>KwrDEYV@3i&UJRr1xb@n3kHhYfubE*4zorOj|LB3#tZYUn|zfUXA;zsJF7k&1I ztxYvHgu7Ia>uZ0y`8V~6iR)s043@EyRHD!=J-fT|ltn~uvaYZB{F7xXy2HA`tY zakQquJz=lsGi(=23L=oV+ILd;qbw96a(ckOuaNE;A6;Rt@mRhjLg|9o!YRwd0Hth@ z>bO|v2#3e74^n961?mXzMvanLJ@ewoKoZICqj9n7--P6EK1)u#tF8u%Z;vbHi=p+W zp{GFC=ofxQx9X?nqJ!Fh>6@Lce?#n|)z2~Pvl%r4`P}b`%y6|hb(NO9?&f8S?Bp*n z@umVgiOH0JuSp`lim$&7I=3$?NELi)3YM2LjN~NHhC$_npHF2O_Y0H@eJ7qP@3yjq(BJjmQMbAvS8gbo)bl!unv}2ZI2( zbsskd=@k`)Gt@`F)y>tP;D~e;YH3o)gTSp`e*2SLrkUSu6xbcNoqaU6a`89tmkPsA=IJ9yXk^dL9Sl=(kn>#EziM%FR`9VO)`d*l%Cl z827I7!x?lNqlD!KKER*Nj{Hw>@;0gtgv+`A02!<@8X#Qtq^o2ThQq21`N z$d&Goc*6_59TSz&LrtmCstL;vGrli}mjOH(>jO#b2%?$<&PpS)) zduIS5?M-Sm_;yuuc=+BobP+bOmItL5M|9oShRjGl! z)fpWRLwKM>#%Zf@Sk5PFtdt;z@G5L5et>O7AKrMour+p3C(h*7y#r+n-dI!UhiQ#) zqpvx)IZn}8@eWV^;F@kQ(F*i?Dvr8=|K)>y*!8f&L~F|Yvnq7;m-*bINN9-u$2beQ z5*6bjMGpM!RIFwayYN$mOS*}Ev$1lcP{@(X8N#IHsaKvYw_sIQvIkhhT{{@M_&k5F z8{dIii7}!5XSTMIi}=)!Tcfa4vOn49Ak`RtyIL%=vvP5DY1+uyZQ;t$pEAGUbQzE;Gyv`P#h;;s9#MmEEJL~|#4`M|o(i~PD8W~dxq)lvTI3%J zbYJ9#3l{JXiRg4J3!jjkwe7x&d9xi_n6xj1ivIL9S0@VXlWI;qMzQuSk{qsHl+#49(oPgydEO6FULZCuctdESX#bk;a1pi4teMj1FnLAh$}DFVF$ z{VJ=?t#mRGHdz;=&ABZ0IcPvIw?PMnLeQ2li#P1VK3LJ&*0g}iYaZ}OqyC4OQg(k=1FN@mZjK-|JGGT%^JiaPh-~std|K;#<@gP1t(sGE!Us z4s>{|o;q1s-nUM6Hfgs#E)yh2F&jv0hBI)7W=9s=~4UBdHko} z*eUy%R<+%bc8ibh_uRi0?+++!9eC<|I~Wh_dabzhq~;WajLJ7AhC+c$p)?&h^^r7d zRALeq3U+Y~rhCDjih-e@A3-c*uBSkyuir9oYL$Vz7+Y9%BAvMf1uuP}|E=^1L(g)~ zZo{aYL+i&OUd_+?^%eKUPcG@2M-8uHv@N2WQl^hwu%s%4-PoJ`8KuA75CWcYj*sULk!LrZ z=AF_*WaRXL;K^iW$Sc^@ec#Z=Gg?oK5{~ye>!h37bdC8TV>4WPZj14-_f&|r9c6^` zNl}-Ldi96=GY~39%DqS61^-@OWQn)LrE6oLC?i6F960jS)iUtboyAX6+Hz>cE$uw4 z)myqE^t$;GA$L2e(F%xCiX75m*NWd8pgO?S#XYd_jFC9Nb-QOPD98Lsfs*oA*NDLN z#K#etV9YVEQVVUn(z{EpEwrI&y|bJmV3?qZUbQpO?nWcyV4}4JY3xt;^G<8Sd1!Hr z5iG@5ZH>twRP7!*&2jQ&!NTfiq1rwg^zW2BTigJ)Zsw4#`7BI+hB~P_Ur`!g{H7~c z5blyUp!QM}Vp#hk&@e;vo(Nc~!$(9}Ps_1KvJmVbHy-li%6KP$}vd-5BnlBc6-#+K3gJOdi6q3tRs4j)7h*A_T( zJmNm{CD6bS?SjkJH~Gmk>vH+0Q=BIO{>RN28c@=lAJqU5h0kJxC9dY8-$5g8)HB!$ znEC@5B2~PN4+7QmlID_Fgj{XhFAWbn^SXr7-Cd;`wT|ID=`JWK)4&Bgf3CNDon2!0 zT703Y%hfeFV~|1S8fhU)XBtmyCA})Wy~8)y$eS$&#T5RUsxAgD=~s3@|56W5lo^}qJRK(R6i`LkPpx~?;EwRWD_8x! z>9}m41SxLC!XkWi2=|{vE=;HkU_ z&I!-)M+EbcqYt_;-MiDS_GkC7pNkA>L+{Q_Hw{{H^@KpYYhT>(BE{^>Bz)~Vh}khc z?r~Y5VM$tDbq%n(uEVR>Hgs{pZBvwSbMEP|*YA+#-P6P-PAtLiuOPBDIP%lYD)&>SgO-<3=edG1_l(Tn%3 z@hx+0@xk)c`c2Hep|apTeG0eBCP$27JkPqFo|AHs=~@4Z-^U^jn;Y2k`a9FOPC?E* zC~?MFn???c0b;-l;QIUByVyywMn=#>tET`gP!q!9|oZKjmDXi7yL&Gl_tFd|m#WsYn~7a)ufu#a^@5g$R)8B3}pn%n6@ zhG-_jl0E6gJx_f|_;VS)BW;Jv7D5dmW>Z;W(&Vs2AzvsS1y&g(_3-iGC|uT#j8(-O_+RWX$HK9bladv9&t>|W?Nn9N3+ z?fOqNjyt-RzV76EzbeaK()En@&kJi<6_9W^prIS*JBJ0d(XJ^C;%qw2H0{fN)yB23 z#T)ESb%IBu&`8QmS1D+*u5VzE`O#^H2#$)y>y6(oJKg%-;GV8lrNEiR!EyEKNbBhm z9jZlotAoizfKj5r>U#3fuATpM_jg|6y$Z*ooUWYUw7aN zSm--kKGfduC2z_X^ALI4JGcUa8I@+{yWgdm(1PQf7E~^i!xCD>H(R$^>xN{e-n5eYIbzsWtr;o+nJq~G& zjaX&yp|GF5Ni#NoO7hJMcI~l*+^}TKm(Y$2u!*4`I89X@kRYncczto#o{?FS9P&CT zY&qzAx=ktZG-y5itKIXONvpV%&39&A5oxDg=^@=UcZru$0mAw>eGnoq+AnX&IVa-@ zGLUh|XFI<;aC2tW0qZCn%kAHEns9cypn0!24PCh9Xn(en7NRLHB3m~v?&-%`mJ1^Y zg4Pd?Ek`WE9vhYw!*cGnYu}qlT;me3<^9UEmP@UItX$-0ePCmWyF~X2{O1owSMJQ7Nlh9lhWYB zKQHz;b(CZFk4Brug^$m%Jo;>s`#CNWy$$XUXDo9kS@KxQV^E_L|9#P6fs_5Aa<1Van^6jT^70V(^9m>~1`D=Nq-E1LRY zz&5HlR$`vsi9W<7w7#bdoH{=VmpEP$c(a~-`lZ%Gh5Y%~H33^X*-5$@w>%Agutn~v z=cv^lqVTzH(6sL!p9uyvWQs+-)bmYAp|Z_KwZVngn%L*4tiDF}+}|}`6J={13ni@= zKcx%l#EFS6fU;)Bbi8@q{b+8JpTa3s6f(y|4YC|#Hbe2ng3>Fx4LGza;Q^fMF+31X zPgFCGN0h#_W9fi%4ES&lXlQV^_B~1wAttT3tQPsx=ie$7Wz=TH33n?lx4D~WRfRr# zsl{v<$v6O*aobgo#C|=MIsHw`_!;-3yIjZkI<3Ids<^PrV!sm4JW$A=ts3YL+w{Sk8bQX|z{y9sCK>MoZ7*n)u3PDUv8E7VAQlDh$FJ9>ofeo z;D~tbobv!4oa%7D_VD0JJC6-ueTe-WHR%+$|8}{J`MuNY;JozNJDM z8cWaCRpXTBIJv(`J7)xWF!7FrLm*@DlM>s&As5mcI9(7?3t{T163} zwC{)GLcWpclR%3FvynkI z8NkwzFa?qW{h7AfV9mXXQhVm|)81@p4>J~EBXmodxA@Cq$8=voH;0n%=#0U>x6_I( z-VIRrwA&5~vRv-!xN@(7cakwIyFakpq%!`J3k!y!e|XO`g8bK$Kw%k zh5wJPw+@T4Yu|+j6h#mb0SQGw327t+B&3IiAtZ;88bG9bK&4ZL?v5Esq+5}Yt^uT_ zySrxg&GWqP{_XEO_CA2);Jt5Ho&hxy^b*)5G{cD>{4JkPeP+FZkpQoL*<7!*~ zwCh}ub`f!MqF_zAa79w7^7Rq@g;l!hpB{PQ_u~8eUBm^2eodgZ?)H!w2R{9kb>Cj^ z6|^ODN zF8dc#oLed3MkW2@Pw@lbx6F-u`7E#Ls%{0*{J@*q)mrtOS{kjD8vhF4`1@6-sX1;+ zn`_FX;=|vLl9&`0nSduFQ6W-5S<6??oj4NwP>_NdI+XZKu7|f{C1YtX@b{G3t}q^t6X; zOpUD2z}$WX0I~;*j7FIEmRDWW;@T|-Cz*qZL_L9b3mHzd|IXUYhWQW7Onll!4J_e{ zdocE&PY($-8Tqg6Mava-pl|Z+j?_!lIO4o7-gNi?@l|#5BAp`2dfJtuyilIGbVB_VKf<10pX)k-;vYhnOjS6tEvi#4*$Zy6uv&tQ<3F(DHTEj^vWW z;Oj`sstl%3&jCmBP}SokMLRnFuQ^U%k7TZy^OwX_6QtCi*fcjWf9FP)RL!+_1P$d1 zs~?__n58qurezdq|DtO5lp2#4vt&1M+^yL|(v^<1RGvbdO4La!o}7e_k$EGsJXdKq zmeL3DN>xOgBvXcKaLwf>}@1VM&$l!V4DGzxP3s?}})k3GTt{H$h7P-Lkm>Z?i0Je1f#rZatk4) z#ViooJ_L2)0%@oM+LZd|N8!_8>whIdN{txQGs!Uu1uGUjAM>=%+PWtSp9+Q_9UGkS59&BxBWTJRf&Ppkb{yMGINbiAVuTXi2BBELF@!lczqPFTX`b~yA-DSua zwfA$Z*W7RT;~??Eo?|5Qg3VQB^LG0}$`CN?aC-eWS^|!1K=Z;IF|2Ez9gxA+oT$Bj zuX3Qe$*`*s!>VTexHmQ>GjIDOUzR+sd1m9~$Thakx8l<{|NV5pF+c`yn8;VzNDz(p-Ng)Vx<20d86kkb8hEr=UX6{px^&L% zz6ClW@@Db9-2^xpng~H(+@t0CfO!wO!@C(uH+kudU73Ft^_Rp3KqPunva7=51Hf-XDu3XlcGq{?ys4yRQ ze(58;0I}7o5qa0?^a;DV$6?O&-5O@-bgaa%vZFGB=p2?-Iu+nb+ca} zIUvd$3$tcPNi5tpDy)FLHzEqjojAYLoLkTHA0MWmYZb}IStNQfci4^QQS=c#q=ow~ z5GUC1M(`adtVcvrj_4i$6yfx43|62^;g5;L!+X1!lak!?T?Di!?_)R zz59O8c+rH9myc!a%INMZz=|oh)s+Ysz?WB#o2z3q2{q1#J;ZOI7hghHI|?Fa{4&@e5YT7m&WKDdztxqDIDJQt1ilT9GBi8!PC*- zw3wvUs#vze8sN4!7uy-%D4`5;jzEp)N9M@Z3#na*?7lS@g&iH9*Vs?^G+S}L#(k~z z^2Zk~Z-s3&JbJe~YXtz?f2psIGAz|gObIsb>LmbZp3SDhOj^LUF2=v~Ij0dPtA^Va zKivAYJ>_}n?%rWXev8pXS!cJ)BVr8qY1zON3YJ?LEYruf`zl+;birigrK+MNo9yZA zS3AY80!o1_EfyB=3)rA<;`7$;touNGQc~-=e=mHeao}Id%JmqfcXyTX%rrxVZr%FB z%uZE$Zp~G#AVyyFM$7O6N5G8$SEn!sa4_Mhs*2Pj7R4JWJh_~3Wzv!V|-R0fP@^lsQWXH~CknfzNom@^t(Xc>+cJSU#^Bl+*Zzr7n z7UcESI}f`V;p_8ZC3UETIB+~+kULi5mhqq3)Al@QU&0VE=spXH(L|GSz&Or!0(1Hs zr&RNf)$$kY(Np{e~*;I1#rsuv;!MiTHo1F*hMv1S^z(umi0xbhWZxTDhn^q`q@pmmf`yN zF1ZQoU?69`rRnra4pHW3A|KL}rqqH`b|pq|N!gX(=5sJn-Id;Qbne*b83U4p3E9l0 zx6JLr^pw1t#{;%JcizHDmCssXw#DTUs}df%_>Sj#H74VgxxgNx0X^ilJlkL}pyOOi z8*6kvx?mq@*mGxlAKHs?i1LiRb9eB&%G93M)Ey&L5l~vV3H*~Q@4P%h6V%DAWVHF> z-vJPKC61^;$-uCP`uAbIxqo|@!4U%Bk`IvOt-W20Z+dJe-0=0%?*5nSXARjvm6CD= z=beHiOL`2xdG9Do8J0F5YdWki^wy*q6(v z4044N634nB32geDP0={<&TkKjQ25L5?5FiFht`Rs3l`kLdG7TN`nSo+-=A6@`tEgI zWkh;xTDgKatcJZqWkJGEflu%uox_t4*H4S?ouL+KpM74(lL&^Y=7U?MVGR6B2R3mO zo3kDa$UeO-83;mCok;!~D=H+e5ywkBu!Pj;-}JBN<}(}=B7fIpbi60Fxbu~Oc0aHS zQl5K=fJPOUc5XR|zd0V-O|-9h9~ysmPy-)=^DrNGd&Q$w6Xc>_dJ6NYsrGPVV>vmy zs~Y_OeeeN-_Ct*(0&T%@lC2AdB{4T`5NL7sLoDNK@m`_c{6zfLN&MzX!HBhY4~Qu+ z1^=3ik*0M-pe0&+l`4W7 zmMe{*-nont2FKASv}C#?(1Dg8!r=FEkYLoq!=OWQC#fsWUI@h-C!~x9A}jk6s`uf+2OfN2|#5gn>{;6L!k)ZNP;5nXOyevXb zZocT;477Y#Eg{@C`ysU-LzQk=Q?M_B^;c?k7kHz0K?|%JW%x`B-(mU~Lcy^YCR`wJ z_$8|P+dyp*)Q1JlD%&_8rHplhSXkR>F30ZAboeME>t8ltgs^gMaUb4uf~)r2XTBozZv zIdy;mX(CW_zw|1=P-XQ1Jpql(%Pm?Hq=}+n<1obU=TKx13aRmuK2BJ|rouify7gYHafzGsfP!k*+qe*2*`Zf2? zo`t-|lMJ4GFe>rMfEzqr_|WOCC#y|q7{#>=i3AO&JiJd$fke~UX`klqbQ<4lZ?A}5 z!Bf0iNvskk>ZG9|kph%#KJ1MEqW<6K&(Hj)D0%)%=M$Xf>t zNRBGKck;UK9-6OCi_})!RMHx50j` z1LOx7>G)%sjNHKLKLajOX?>98MvzOj6U;}81ewhVY?2~5)UL-54wd;{uTUzihqt-; z@}FkFTP_ny6?{;@9&j=K_uh6&yBpm3LMmvcua^Wg^s&*jizwuIN$VIMKy zweL&g{Oy?1b8YI|AYqdkT5ANg!#M+TUVt0C(LEa;{;|t`oPmGg;FrNxkuFl>TK!y0 z-2%>8{C;UQ-UFAR;V<2w#uE*J>U%)YhL&zxG}wthOYl2|4u>L|0p zi`mv)jlC@1gj*P{;J@gm*b8@>oKw2K)(zP;NWNI0j(cYIFgaNPb{#ktgTCv`pHpOw zZO+ek;m@-XQdWj3NJ4l+v(KYmN@M%)uApP1&2erF=Ak_Ff~AIv=Ok5xgtd${BD^%1faaz1{I~ zHAeCqK9#oyKLOjlfO;jdaujyPqwDU227N1l)qtXbHMn#jRjhd15cn(+2lBxF^vW(3 z=wBqRtIpvwY66d&@Fa6#;w*We(XE85SJ#)9#c!(q2y)xB0JBIB950%tAwjz|oaY+~ zwQ9246=A;mHi%tEUzXVHa?Ehg6Uk~8G;v&hK5xgz$#)sUcVjLjGMp6>fH$^ zrnpgkVqgw5NJG?Y0)N`07>;KPYoXW>$#Z0*ty}K@Z@VSUH5=csM|Hp zQaO)y>3eY!kl)*ng-E^{;Qr7gaJ^s2(>`7Hr8K`Hq@-@Cy0W~#CGUtoF1E7hX)KCG zSvg)L&~-yFicDs-`}~_paBqm~SJ81NgR=Jx9#cs?X(S_J8sAQVnE;M@D(MesUjBam z63<3F0_41A5yk|XlxnUNXN2zUD)kuY-2zP}r(Tknp7Yb<*ZvpUa`zPJ-URFFZSckx z&$|dktydHUteqW~aiKgEMV#q-{xn*j>eEcU?IlFH7l`E4#<%kXTa>XNyU0nt`P7uN z4&4y@Ig4f>lp~D%(vGz&->Rj%ot)K(NS{l#2$|b9oooqjC(&;wy*&;P+s?$wZ$DDt zIrKmL4y-Dn=2LiO!pq)YIy%yMdJjiN~FaR-&TF7^kihYqQre zlnNWyKzo>BBwq$~&M+E(H2cw|yli0zJ7L;K3QlP-Pv~LHx^FS!HSE zn);P0 zO}3)9UXteb4pD;!`+*eB^_hYHtX^ItB{Hf^2xBWpgHD=T_pLW-843^7wRp54f<{#$X8>2@U3B@1@B!x zO9gET<`CKq|JZ;T5lBy&Xj@4?O5a&}fK{nWK@MdM);n{6O{w)m#V@b)nS{7o#EY0k zr@9ihh8kUryS*)@y`3xf77>AaTfm4C-yjfOO%9 z=YC<3d##(ogybDpI9|EPdNz0IykCKrAT6WGH*bKr8Ws%Qjm#_!Dpr(*WUT3|*Z9W? zx7ThqF15_+*Jm}&S%59XlCUGtevJB)C1ic_x^l*3%Is9yWIEVZp6Uy@M4v4v-*!m& zGpZ1r)6?Q&S$#i*5Jl{nZqpEe5HfuLn6#|0Xc-XU1z=By`K@D3TL$ z1qzG93=PS*+H-JL89p@6csm)L_!~wuSBmrrHZmOwRtjnFgrY4c#gxe7#L6;yu&Z<1 za4*SMiwDUrRW@{9+V(JeH&07}a(d(`^HDL%v7RyviHg@`yI1swp>3k#^3AYAAA&cU zYdeEeR7Bg`9hhv>yWx)vDj%4~q`YJGQ~5PUVs*Dv=V*F=!$HO zDz*VmAVU&_Wh=}AzIRIpHI7(MoJwtyQ!r!m@SrIuN}qMe1+S%Rfh#b8;SOWTf#{TM z5{ybzR>8GCXB9lnJ?Wufr~<8aPZFnI5L2IJN2s_+GWPAPXLH}I`;d?%fXL|tk|aca z>)*Ay4YGnVAm9Ga3K0Xtykj&cK4R4we^}y#875wJr{xL0kl<{ z06AFCo?b}M)lc2E3>J0gp&4)>pe*5%EKLkpOdEzMH2btv242_k%wirRhzZOPEMd`~ar9u8)5og0j_E)r1TrT@vp0Ud004j|&P+ zc3ibj2xHHOV8_kby<(`BPN#8s&i%z`P0cN*jq0W=VOf zvSyeTQ`FZZm$%wQt+#gu3o*P~_qy3I?))c84+BlBgVdGvW2WF?pYk^h*Xgm%;b;D^+N6yUM{V2U<)z`7rMqz--iV*`H}{9d z$%i~3fLv>x0n3Pjspb1{$E&diF3?wBg>poyc+)7+RhkXeN{qB6SJ0-_K1CH#7RDSt z_DQOD>M5Epv|I#CIIxLLBhS=rBnOUGT`z0WHfR5Oe8_TkFW&q86DdNh;xiu8S2vsl z1~w0df98HWCwMinUX!nnKb};pru0bD6&t9scSK+DFFsq<04$Sy?VS z5`H3tKrUs^+8PVTL?hw?r&mhtlUh(t_cm=CQLtp~bN)#CG2i35qp!YGd>`{-X@UM| z`wM1V%Cm6e1N~A8!#M@QKOCZFKQx~Mc|myZAs%RQ>s=xPzu)u8 z*Wfsl$3{i+2z31lI~eA5431-C{rr@?uSVMop5bsRbVouQjJ`bc=~ytVZ8;{ly2JaObqE7;+bvDA|K1BRqx6f_pzW~dYpKEu zMA+WuBfiB4lTWMiVkM{NK0jZ2d_6xBK1Ey21@9KhIf-d-k=eXROE{+80cWIwi$^P^ z*@;ywBuDT>fsT_;O?{Viw+A-rTdP;ajUsfaVBhtwse=5g9u=SD#jFw^r~Br6Lx-qo zy2Ra$7xeEIT=hX-D%uW-0r%%RQ@3i;ohbDGsr+6<*HF~LwBQ?z3rh2N^JJC5g`7V~ zU%Cy93NO6}tbBJ~24sZlL>Cx#&R73EG)a#TRD zO3E+W31gr_g8O|&Ro+=`6{K?)?wA&_#Z+OeQ2lex?NKh;L6yy6f!yQpQUV9P@Yx)< z@YFEXb-l??1_OuoCmQ!Q4OGWqt&`tx;azgE$2|Sb0BuHMmoW`V0#IQdpSi8_!bB#l551~IgjfZ=B-5@nrz-D(+LWhb&}uIj|9|p}UNM`{5R2ZhIdVXT zH2>L0H?a>H6;riQ0&+zAM3937G|5xW0Pa3fty8+?^O9oRW;-(+Z(v?LOca?^NOd% z7six+lE?QmM}URBKUWaFLT{PIX2Dr!^764AE~s1*p{Fx%(sE{;ACrANWjt{MVSxm7 z1~A-SH!i94q#`b;?$81JO6Y`<_V(xR;LGz5iI;p|Z<1>%D!(^L&z;>=hoY!-_JrOYSe%zZNmKmZn36ja*@#hGtt;{M<13F)7UT zXK=)(LG{$Wz~0-w+4<}@nmB{zav}Hpoljm|>Z^F1f5vV1?Q)^fikN0fNKI+-HfZ4s zLse<(7vSU|7*-e!C_(>Rp7%Y?lf3nno8xN~NA)SZv_n;zHqF25((|2sR4I1s%GIR^ zpYCWcjGpTlr`^+bF)X{X@~lqg=GpWb*tah|{nXW3amn0#IQ@s>Y1zltdpF4uz*2N4 z1l{1pS!dvk9p$tu{Cv3AlAqAE#1aTlY}>L%=tSQnfMR2~_@uPhA?uZf>ukAoT77mD%&7 zHA{saDCMa08Zh3cH{*SvFG(On{^5AMP6Xul__5vpLzP-g%5|K9RMy&Ed`UTygMK{m zZ?VjIvz;oN7)m}I&?M#iqeY7%U1~=g>-uNP@%N15;EcdZNy0pFV!CF#i_H<+-6KfD z5kI(Ov|~5z392SJ>rq-Z2S;>?Hs!LjmQAahrj&nmRe#q&Ew8!fPKymOcnA z#rdkZfBA%tQ*UP*r`9>zysSTJ_8${IN5(n|2$skeJ|ny%tj4d;5vP#-2-c5Rq`Xmy zdJp+B1u2_oKH5*`1dekRakcc-NT?)dYTGnn8hnac-gFq(-*Lm=@mhT%67Zffx8uC z4o14aHSyLVvBWg0pBBYmxXK)xS}Z&G5#>-9qfpfQVO_a*stb&oeD+3x7s%@p$#{BR zYfXEQTf%zBiD2z1P;A?xVUIhlTNTb_sV7x_3dUr-+3MQHSnVK1gxWm(ZPOMu_`=p_p3$J;23}? zrkz}TPhw+-=8pW$jOHN25IT8G5K5EYf~!KWPy5Av?KofuJ2u;S9jQjv1lDoKd&u}t zOlg-UC8v(l^XDkthyiSXY~P5FK>r15w08YL@eKT~VAksg4{Z|i#IO@rwElYS!rQu& zR73hH4Ij;RU9KlacthUGsHdDMSd@9`MXFHMQ3Q8f^%TRBEi`3ZB1Sg?46jAfV@ns$ zxacnEgK?z)S!TcDOyGtNTOw-X1>y(U4VP4_eAt2)qpFPo}W;)WC{R`EQgf;ekn7;6eUe}+%%f0jBqbrGQ^dmoro(5PCL z!n=!ck}o{idHW8Gf5_&wz_K0VM)6VF8#a4ykek%Mu(;bnz>*haX)83Gg>rS5 z*4;g&JUtV{_6OI@b1`G1wQ>Dc%1Xe1u#-)`$OZ%~5C(V3_rB&xo4nEJ+;qG%;M;=0-M<+MM1db9pPlj^6j_ac$z zB6#Y>M#lW}bB|U#&yqAFadxUsTs20=C;;et

    A44exox=ykh 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