From 3bedaa9a9fa3572b5a8a4493028efdcbc79d057a Mon Sep 17 00:00:00 2001 From: bbelderbos Date: Fri, 30 Mar 2018 18:23:56 +0200 Subject: [PATCH 01/74] 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 02/74] 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 03/74] 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 04/74] 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 05/74] 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 06/74] 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 07/74] 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 08/74] 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 09/74] 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 10/74] 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 11/74] 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 12/74] 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 13/74] 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 14/74] 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 15/74] 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 16/74] 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 17/74] 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 18/74] 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 19/74] 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 20/74] 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 21/74] 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 22/74] 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 23/74] 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} 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 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 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

    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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