diff --git a/.gitignore b/.gitignore index ebe84718..a1639bdd 100644 --- a/.gitignore +++ b/.gitignore @@ -105,3 +105,11 @@ 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 + +**.DS_Store diff --git a/README.md b/README.md index 52f9be9e..f1d91096 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/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) diff --git a/days/01-03-datetimes/README.md b/days/01-03-datetimes/README.md index fcac2b7c..fc6695c0 100644 --- a/days/01-03-datetimes/README.md +++ b/days/01-03-datetimes/README.md @@ -9,20 +9,18 @@ This set of lessons will walk you through the basics of datetime, starting with A super basic day to get you started. Watch *Learning datetime and date* and *Calculating time with datetime timedelta*. -After watching the videos, use your Python shell to play around with some timestamp calculations as per the content in the videos. +After watching the videos, use your Python shell to play around with some timestamp calculations as per the content in the videos. -## Day N+1: Bites of Py Bite 7 - Parsing dates from logs +## Day N+1: Parsing dates from logs Bite exercise -Head on over to [CodeChalleng.es](https://codechalleng.es) and sign up if you haven't already. +Head on over to [Pybites Platforms](https://pybitesplatform.com/) and sign up if you haven't already. -Use the following URL to unlock Bite 7 for free: [https://codechalleng.es/bites/promo/datetimes](https://codechalleng.es/bites/promo/datetimes) +Work on [Parsing dates from logs](https://pybitesplatform.com/bites/parsing-dates-from-logs/) for your second day of learning datetime. -Work on *Bite 7 - Parsing dates from logs* for your second day of learning datetime. +Edit: We decided to simplify the original Bite exercise 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. -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: [Working with datetimes](https://pybitesplatform.com/bites/working-with-datetimes/) and [Work with datetime's strptime and strftime](https://pybitesplatform.com/bites/work-with-datetimes-strptime-and-strftime/). ## Day N+2: Your Turn! @@ -33,11 +31,12 @@ A fun project would be to create yourself a Pomodoro Timer that incorporates dat This could also be applied to a stopwatch app. Use time of course but also throw in the timestamps and even some basic calculations on the difference between the start and end timestamps. +We encourage you to _pull request_ your work via [PyBites Code Challenge #52](https://pybit.es/articles/codechallenge52/). Have fun! ### Time to share what you've accomplished! -Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. 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).* diff --git a/days/01-03-datetimes/code/datetime_date.py b/days/01-03-datetimes/code/datetime_date.py index 05bc842f..17e85784 100644 --- a/days/01-03-datetimes/code/datetime_date.py +++ b/days/01-03-datetimes/code/datetime_date.py @@ -1,41 +1,41 @@ #!python3 -from datetime import datetime from datetime import date +from datetime import datetime datetime.today() -#datetime.datetime(2018, 2, 19, 14, 38, 52, 133483) +# datetime.datetime(2021, 1, 19, 14, 38, 52, 133483) today = datetime.today() - type(today) -# +# -todaydate = date.today() +today_date = date.today() -todaydate -#datetime.date(2018, 2, 19) +today_date +# datetime.date(2021, 1, 19) -type(todaydate) -# +type(today_date) +# -todaydate.month -#2 +today_date.month +# 1 -todaydate.year -#2018 +today_date.year +# 2021 -todaydate.day -#19 +today_date.day +# 19 -christmas = date(2018, 12, 25) +christmas = date(today_date.year, 12, 25) christmas -#datetime.date(2018, 12, 25) +# datetime.date(2021, 12, 25) -if christmas is not todaydate: - print("Sorry there are still " + str((christmas - todaydate).days) + " until Christmas!") +# We need to use != & == rather than is / is not for comparison. Sorry for the mistake in the video. +if christmas != today_date: + print("Sorry there are still " + str((christmas - today_date).days) + " until Christmas!") else: print("Yay it's Christmas!") diff --git a/days/04-06-collections/README.md b/days/04-06-collections/README.md new file mode 100644 index 00000000..d5387c2f --- /dev/null +++ b/days/04-06-collections/README.md @@ -0,0 +1,30 @@ +# Collections module + +## Day 1: Your new data structure friends + +Welcome to this lesson. Today you will learn about some powerful new data structures: `namedtuple`, `defaultdict`, `Counter` and `deque`. + +Today you watch the videos. I also prepared a [Jupyter notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/04-06-collections/collections.ipynb) so you can follow along with this lesson. + +## Day 2: Practice using movie data + +You get to use these new data structures I encourage you to code an exercise: [PyBites Code Challenge 13 - Highest Rated Movie Director](https://pybit.es/articles/codechallenge13). + +See the [notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/04-06-collections/collections.ipynb) for more info how to complete this exercise. + +## Day 3: More practice on your own data + +We challenge you to find your own data set and try to use the new collections data structures yourself. + +Stuck at finding examples? We used `collections` quite a bit for [when we did the 100 Days of Code](https://github.com/pybites/100DaysOfCode/blob/master/LOG.md): + + $ python module_index.py |grep collections + collections | stdlib | 001, 021, 023, 034, 036, 042, 045, 055, 057, 063, 076, 084, 086, 095, 096 + +## Time to share what you've accomplished! + +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. + +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). diff --git a/days/07-09-data-structures/README.md b/days/07-09-data-structures/README.md index 3a9cb828..3ffd3c3e 100644 --- a/days/07-09-data-structures/README.md +++ b/days/07-09-data-structures/README.md @@ -14,18 +14,18 @@ Have a play with your own lists, dicts and tuples in the Python shell and famili Feel free to watch the *What we learned* video as well as a recap! -## Day N+1: PyBites CodeChalleng.es Bite +## Day N+1: Pybites exercise -Click this link: [https://codechalleng.es/bites/promo/datastructures](https://codechalleng.es/bites/promo/datastructures) +This will take you to our [Pybites Platform and do this Bite: [Query a nested data structure](https://pybitesplatform.com/bites/query-a-nested-data-structure/) -This will take you to our CodeChalleng.es platform and give 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! -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) +**UPDATE: We decided to wrap the below (and a little more) into a Bite on our Pybites Platform for you. You're still more than welcome to perform the work as per the instructions below, but if you want to try this in a Bite then [try it here](https://pybitesplatform.com/bites/playing-with-lists-and-dicts/) 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**. @@ -35,13 +35,11 @@ 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! -Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. 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).* diff --git a/days/10-12-pytest/README.md b/days/10-12-pytest/README.md index edab35b7..35027092 100644 --- a/days/10-12-pytest/README.md +++ b/days/10-12-pytest/README.md @@ -1,46 +1,46 @@ # Days 10-12 Test your code with pytest -In this lesson I show you how to use `pytest` to test a simple guessing game. It might not be the easiest example for a beginner, but it allows me to show some real world issues you want to address in your test code. +In this lesson I show you how to use `pytest` to test a simple guessing game. It might not be the easiest example for a beginner, but it allows me to show some real world issues you want to address in your test code. After pip installing the module, I quickly show you how to write a test with `pytest` and how it differs from the classic (more verbose) `unittest` syntax. -Next I show you some tactics to mock out user inputs and random data, because test data needs to be predictable. We also learn how we can capture/test standard output of our program. +Next I show you some tactics to mock out user inputs and random data, because test data needs to be predictable. We also learn how we can capture/test standard output of our program. Finally I show you some TDD or _test driven development_ in action by implementing _Fizz Buzz_ by writing the tests first, in small incremental steps. You learn about the `pytest.mark.parametrize` decorator to elegantly handle repetitive tests. -The `pytest` framework is huge and this is just a subset of features. I hope this gives you a head start though to start writing (more) tests for your programs to produce more reliable software. +The `pytest` framework is huge and this is just a subset of features. I hope this gives you a head start though to start writing (more) tests for your programs to produce more reliable software. Be warned: mastering `pytest` might feel like possessing a super power! ## Day N: Setup + Learn pytest -Today you will pip install `pytest` and `pytest-cov` and watch the video lectures. +Today you will pip install `pytest` and `pytest-cov` (best practice is to use a [virtual environment](https://pybit.es/the-beauty-of-virtualenv.html)) and watch the video lectures. Start thinking about how you can write tests for your code ... ## Day N+1: Your Turn: Test your code -Head over to [PyBites Code Challenge 39 - Writing Tests With Pytest](https://codechalleng.es/challenges/39/) and start adding tests to your code or if you're already covered maybe you want to do that as contribution to an open source project? +Head over to [PyBites Code Challenge 39 - Writing Tests With Pytest](https://pybit.es/articles/codechallenge39/) and start adding tests to your code or if you're already covered maybe you want to do that as contribution to an open source project? -By the way, notice that we use `pytest` for [our Bites](https://codechalleng.es/bites/) too. Under the _TESTS_ tab of each Bite you can see how your code will be tested and when you hit _Save + verify_ you can look at its output. +By the way, notice that we use `pytest` for [our Bites](https://pybitesplatform.com/bites/regular/) too. Under the _TESTS_ tab of each Bite you can see how your code will be tested and when you hit _Save + verify_ you can look at its output. Lastly if you are serious about writing tests and `pytest` check out Brian Okken's [Test and Code](http://testandcode.com) podcast and his [Python Testing with pytest](https://pragprog.com/book/bopytest/python-testing-with-pytest) book which goes into much more depth. ## Day N+2: Your Turn: Write a fixture -You wrote some test code? Good, hope that felt good. I know it does because with a set of tests you have more confidence to make any changes in the future. Software systems become increasingly complex so it's paramount to have a suite of tests as your project grows to catch any regression bugs. +You wrote some test code? Good, hope that felt good. I know it does because with a set of tests you have more confidence to make any changes in the future. Software systems become increasingly complex so it's paramount to have a suite of tests as your project grows to catch any regression bugs. On the topic of more complex code, one thing I did not cover are `pytest` fixtures: > The purpose of test fixtures is to provide a fixed baseline upon which tests can reliably and repeatedly execute. pytest fixtures offer dramatic improvements over the classic xUnit style of setup/teardown functions - [pytest fixtures: explicit, modular, scalable](https://docs.pytest.org/en/latest/fixture.html) -A typical example is a database app that needs to setup and tear down its state before each test. Today try to come up with a use case to use `@pytest.fixture` after checking out our article: [All You Need to Know to Start Using Fixtures in Your pytest Code](https://pybit.es/pytest-fixtures.html). +A typical example is a database app that needs to setup and tear down its state before each test. Today try to come up with a use case to use `@pytest.fixture` after checking out our article: [All You Need to Know to Start Using Fixtures in Your pytest Code](https://pybit.es/articles/pytest-fixtures/). Ready to become a `pytest` ninja? You can do it! ### Time to share what you've accomplished! -Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. 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. diff --git a/days/13-15-text-games/README.md b/days/13-15-text-games/README.md index 45797c33..d772961c 100644 --- a/days/13-15-text-games/README.md +++ b/days/13-15-text-games/README.md @@ -74,7 +74,7 @@ def game_loop(player1, player2, rolls): # Compute who won ``` -Bonus points for address the possibility of a tie after three rounds. +Bonus points if you address the possibility of a tie after three rounds. ## Day 15: Tidy up standard **Rock, Paper, Scissors** @@ -116,4 +116,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).* diff --git a/days/13-15-text-games/data/sample_reader.py b/days/13-15-text-games/data/sample_reader.py index d70d7c18..d57c028e 100644 --- a/days/13-15-text-games/data/sample_reader.py +++ b/days/13-15-text-games/data/sample_reader.py @@ -15,8 +15,8 @@ def read_roll(row: dict): print("Roll: {}".format(name)) for k in row.keys(): can_defeat = row[k].strip().lower() == 'win' - print(" * {} will default {}? {}".format(name, k, can_defeat)) + print(" * {} will defeat {}? {}".format(name, k, can_defeat)) print() -read_rolls() \ No newline at end of file +read_rolls() diff --git a/days/13-15-text-games/rps15.jpg b/days/13-15-text-games/rps15.jpg index 5839bb5b..4a1c9089 100644 Binary files a/days/13-15-text-games/rps15.jpg and b/days/13-15-text-games/rps15.jpg differ diff --git a/days/16-18-listcomprehensions-generators/README.md b/days/16-18-listcomprehensions-generators/README.md new file mode 100644 index 00000000..1e7f7f34 --- /dev/null +++ b/days/16-18-listcomprehensions-generators/README.md @@ -0,0 +1,34 @@ +# List comprehensions and generators + +## Day 1: Ready to learn some powerful, Pythonic concepts? + +> List comprehensions and generators are in my top 5 favorite Python features leading to clean, robust and Pythonic code. + +Welcome to this lesson. In today's videos you will learn two powerful techniques you can use in Python: list comprehensions and generators. + +I prepared a [Jupyter notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/16-18-listcomprehensions-generators/list-comprehensions-generators.ipynb) so you can follow along with this lesson. + +## Day 2: Practice! + +Look at your code and see if you can refactor it to use list comprehensions. Same for generators. Are you building up a list somewhere where you could potentially use a generator? + +[My notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/16-18-listcomprehensions-generators/list-comprehensions-generators.ipynb) has an exercise to sink your teeth in. Please try it and tomorrow I will discuss the solution. + +## Day 3: Solution / simulate unix pipelines + +I will detail the solution of yesterday's exercise [in my notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/16-18-listcomprehensions-generators/list-comprehensions-generators.ipynb) + +Today if you have time left, I encourage you to try another exercise [on our platform](https://pybitesplatform.com): + +- [Parse a list of names](https://pybitesplatform.com/bites/parse-a-list-of-names/) +- [Dictionary comprehensions are awesome](https://pybitesplatform.com/bites/dictionary-comprehensions-are-awesome/) + +If you still have time left, or you prefer to practice generators check out this cool blog code challenge: [Code Challenge 11 - Generators for Fun and Profit](https://pybit.es/articles/codechallenge11/) + +## Time to share what you've accomplished! + +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. + +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). diff --git a/days/16-18-listcomprehensions-generators/list-comprehensions-generators.ipynb b/days/16-18-listcomprehensions-generators/list-comprehensions-generators.ipynb index 5c675528..6b7c39f0 100644 --- a/days/16-18-listcomprehensions-generators/list-comprehensions-generators.ipynb +++ b/days/16-18-listcomprehensions-generators/list-comprehensions-generators.ipynb @@ -206,7 +206,7 @@ } ], "source": [ - "resp = requests.get('http://projects.bobbelderbos.com/pcc/harry.txt')\n", + "resp = requests.get('https://bites-data.s3.us-east-2.amazonaws.com/harry.txt')\n", "words = resp.text.lower().split()\n", "words[:5]" ] @@ -339,7 +339,7 @@ } ], "source": [ - "resp = requests.get('http://projects.bobbelderbos.com/pcc/stopwords.txt')\n", + "resp = requests.get('https://bites-data.s3.us-east-2.amazonaws.com/stopwords.txt')\n", "stopwords = resp.text.lower().split()\n", "stopwords[:5] " ] diff --git a/days/19-21-itertools/README.md b/days/19-21-itertools/README.md index 058e66f4..35bb4301 100644 --- a/days/19-21-itertools/README.md +++ b/days/19-21-itertools/README.md @@ -1,8 +1,8 @@ # Days 19-21: Itertools -Iteration is something you absolutely have to grasp in order to master Python. +Iteration is something you absolutely have to grasp in order to master Python. -Itertools helps make iteration simpler and is incredibly powerful which is why you'll be learning it for the next 3 days! +Itertools helps make iteration simpler and is incredibly powerful which is why you'll be learning it for the next 3 days! ## Day N: Watch videos and Play in the Shell! @@ -16,28 +16,32 @@ 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. ## Day N+2: Your Turn! -For your last day, I'm going to suggest you head to our [codechalleng.es](https://codechalleng.es) platform and take a few of the itertools themed Bites. +For your last day, I'm going to suggest you head to our [Pybites Platform](https://pybitesplatform.com) platform and take a few of the itertools themed Bites. The following 3 links will get you free access to the Bites: -[Bite 64](https://codechalleng.es/bites/promo/itertools-fun1) +[Fix a truncating zip function](https://pybitesplatform.com/bites/fix-a-truncating-zip-function/) -[Bite 17](https://codechalleng.es/bites/promo/itertools-fun2) +[Form teams from a group of friends](https://pybitesplatform.com/bites/form-teams-from-a-group-of-friends/) -[Bite 65](https://codechalleng.es/bites/promo/itertools-fun3) +[Get all valid dictionary words for a draw of letters](https://pybitesplatform.com/bites/get-all-valid-dictionary-words-for-a-draw-of-letters/) You don't need to do them in any particular order, they're just there for you to learn something! ### Time to share what you've accomplished! -Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. 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).* diff --git a/days/22-24-decorators/README.md b/days/22-24-decorators/README.md new file mode 100644 index 00000000..063a3310 --- /dev/null +++ b/days/22-24-decorators/README.md @@ -0,0 +1,27 @@ +# Decorators + +## Day 1: Quick howto + +Welcome to this lesson. Decorators are a sometimes overlooked and more advanced feature. They support a nice way to abstract your code. Although hard to grasp at first there is not that much to it. + +In today's videos you will watch me explain this powerful concept. You can follow along with my Jupyter notebook [here](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/22-24-decorators/decorators.ipynb). + +## Day 2: A practical exercise + +Try to take a crack at [Write a decorator with argument](https://pybitesplatform.com/bites/write-a-decorator-with-argument/). + +If you get stuck we have a more open-ended challenge as well: [Write DRY Code With Decorators blog challenge](https://pybit.es/articles/codechallenge14/). + +Look at the code you have written so far, where could you refactor / add decorators? The more you practice the sooner you grok them and the easier they become. + +## Day 3: More practice + +The exercise and code challenge of yesterday should keep you busy for a bit, today get some more practice in. + +## Time to share what you've accomplished! + +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. + +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). diff --git a/days/22-24-decorators/decorators.ipynb b/days/22-24-decorators/decorators.ipynb index d2f6add8..54f1a176 100644 --- a/days/22-24-decorators/decorators.ipynb +++ b/days/22-24-decorators/decorators.ipynb @@ -554,7 +554,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "For [Never Forget A Friend’s Birthday with Python, Flask and Twilio](https://www.twilio.com/blog/2017/09/never-forget-friends-birthday-python-flask-twilio.html) I used a [decorator](https://github.com/pybites/bday-app/blob/a360a02316e021ac4c3164dcdc4122da5d5a722b/app.py#L28) to check if a user is logged in, loosely based on the one provided in the [Flask documentation](http://flask.pocoo.org/docs/0.12/patterns/viewdecorators/#login-required-decorator). \n", + "For [Never Forget A Friend’s Birthday with Python, Flask and Twilio](https://www.twilio.com/blog/2017/09/never-forget-friends-birthday-python-flask-twilio.html) I used a [decorator](https://github.com/pybites/bday-app/blob/a360a02316e021ac4c3164dcdc4122da5d5a722b/app.py#L28) to check if a user is logged in, loosely based on the one provided in the [Flask documentation](https://flask.palletsprojects.com/en/1.1.x/patterns/viewdecorators/#login-required-decorator). \n", "\n", "Another interesting one to check out (if you still have some time to squeeze in today): Django's `login_required` decorator - [source](https://github.com/django/django/blob/master/django/contrib/auth/decorators.py)." ] @@ -582,7 +582,7 @@ " @make_html('p')\n", " @make_html('strong')\n", " def get_text(text):\n", - " pass\n", + " print(text)\n", "\n", "Calling:\n", "\n", diff --git a/days/22-24-decorators/stacking.png b/days/22-24-decorators/stacking.png index 26d3a537..68c7ff87 100644 Binary files a/days/22-24-decorators/stacking.png and b/days/22-24-decorators/stacking.png differ diff --git a/days/25-27-error-handling/demo/movie_search_error_edition/api.py b/days/25-27-error-handling/demo/movie_search_error_edition/api.py index b47777f9..044fc1ac 100644 --- a/days/25-27-error-handling/demo/movie_search_error_edition/api.py +++ b/days/25-27-error-handling/demo/movie_search_error_edition/api.py @@ -12,7 +12,7 @@ def find_movie_by_title(keyword: str) -> List[Movie]: if not keyword or not keyword.strip(): raise ValueError('Must specify a search term.') - url = f'http://movie_service.talkpython.fm/api/search/{keyword}' + url = f'https://movieservice.talkpython.fm/api/search/{keyword}' resp = requests.get(url) resp.raise_for_status() diff --git a/days/25-27-error-handling/demo/starter_movie_search_error_edition/api.py b/days/25-27-error-handling/demo/starter_movie_search_error_edition/api.py index b47777f9..044fc1ac 100644 --- a/days/25-27-error-handling/demo/starter_movie_search_error_edition/api.py +++ b/days/25-27-error-handling/demo/starter_movie_search_error_edition/api.py @@ -12,7 +12,7 @@ def find_movie_by_title(keyword: str) -> List[Movie]: if not keyword or not keyword.strip(): raise ValueError('Must specify a search term.') - url = f'http://movie_service.talkpython.fm/api/search/{keyword}' + url = f'https://movieservice.talkpython.fm/api/search/{keyword}' resp = requests.get(url) resp.raise_for_status() diff --git a/days/28-30-regex/README.md b/days/28-30-regex/README.md new file mode 100644 index 00000000..120c5a65 --- /dev/null +++ b/days/28-30-regex/README.md @@ -0,0 +1,33 @@ +# Regular Expressions + +> Some people, when confronted with a problem, think, "I know, I'll use regular expressions." Now they have two problems. - Jamie Zawinski + +## Day 1: Quick overview + +In today's videos I will teach you the 80/20 you need to know about Python's `re` (regular expression) module. It's a powerful skill to add to your Python toolkit, however I will also show you when not to use them. + +## Day 2: Solidify what you've learned + +I recommend reading [10 Tips to Get More out of Your Regexes](https://pybit.es/mastering-regex.html) and watch Al Sweigart's PyCon talk: [Yes, It's Time to Learn Regular Expressions](https://www.youtube.com/watch?v=abrcJ9MpF60). + +If you still have time check out Kuchling's [Regular Expression HOWTO](https://docs.python.org/3.7/howto/regex.html#regex-howto). + +The best way to learn though is to get practical: try to write some regexes interactively using an online tool like [regex101](https://regex101.com/#python). + +## Day 3: Put your new skill to the test + +Take [Bite 2. Regex Fun](https://pybitesplatform.com/bites/regex-fun/) on our platform. It lets you write 3 regexes. + +Do you prefer to work on your desktop? Maybe you can try [blog challenge 42 - Mastering Regular Expressions](https://pybit.es/articles/codechallenge42/) which is similar but lets you solve 6 regex problems! + +B. More fun: `wget` or `request.get` your favorite site and use regex on the output to parse out data (fun trivia: [a similar exercise](https://pybit.es/js_time_scraper_ch.html) is where our code challenges started). + +Good luck and remember: _Keep calm and code in Python!_ + +## Time to share what you've accomplished! + +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. + +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). diff --git a/days/28-30-regex/regex.ipynb b/days/28-30-regex/regex.ipynb index 15ed0471..dc9e7861 100644 --- a/days/28-30-regex/regex.ipynb +++ b/days/28-30-regex/regex.ipynb @@ -92,7 +92,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "I am bold and want do do 200 days (note strings are inmutable, so save to a new string)" + "I am bold and want to do 200 days (note strings are inmutable, so save to a new string)" ] }, { @@ -247,7 +247,11 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Of course you can do the same with `words.split()` but if you have more requirements you might fit it in the same regex, for example let's only count words that start with a capital letter. I am using the _`[]` character class_ as an alternative to \\w here: " + "Of course you can do the same with `words.split()` but if you have more requirements you might fit it in the same regex, for example let's only count words that start with a capital letter.\n", + "\n", + "I am using two _character classes_ here (= pattern inside `[]`), the first to match a capital letter, the second to match 0 or more common word characters. \n", + "\n", + "Note I am escaping the single quote (') inside the second character class, because the regex pattern is wrapped inside single quotes as well: " ] }, { @@ -258,7 +262,7 @@ "source": [ "from collections import Counter\n", "\n", - "cnt = Counter(re.findall(r'[A-Z][a-z0-9]+', text))\n", + "cnt = Counter(re.findall(r'[A-Z][A-Za-z0-9\\']*', text))\n", "cnt.most_common(5)" ] }, @@ -394,7 +398,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Or what if I want to change all the #nDaysOf... to #nDaysOfPyton? You can use `re.sub` for this. Note how I use the capturing parenthesis to port over the matching part of the string to the replacement (2nd argument) where I use `\\1` to reference it:" + "Or what if I want to change all the #nDaysOf... to #nDaysOfPython? You can use `re.sub` for this. Note how I use the capturing parenthesis to port over the matching part of the string to the replacement (2nd argument) where I use `\\1` to reference it:" ] }, { @@ -471,7 +475,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.1" + "version": "3.6.5" } }, "nbformat": 4, diff --git a/days/31-33-logging/demo/movie_search_logging_edition/api.py b/days/31-33-logging/demo/movie_search_logging_edition/api.py index 76167dfd..a6bc4a41 100644 --- a/days/31-33-logging/demo/movie_search_logging_edition/api.py +++ b/days/31-33-logging/demo/movie_search_logging_edition/api.py @@ -22,7 +22,7 @@ def find_movie_by_title(keyword: str) -> List[Movie]: api_log.warn("No keyword supplied") raise ValueError('Must specify a search term.') - url = f'http://movie_service.talkpython.fm/api/search/{keyword}' + url = f'https://movieservice.talkpython.fm/api/search/{keyword}' resp = requests.get(url) api_log.trace("Request finished, status code {}.".format(resp.status_code)) diff --git a/days/31-33-logging/demo/starter_movie_search/api.py b/days/31-33-logging/demo/starter_movie_search/api.py index b47777f9..044fc1ac 100644 --- a/days/31-33-logging/demo/starter_movie_search/api.py +++ b/days/31-33-logging/demo/starter_movie_search/api.py @@ -12,7 +12,7 @@ def find_movie_by_title(keyword: str) -> List[Movie]: if not keyword or not keyword.strip(): raise ValueError('Must specify a search term.') - url = f'http://movie_service.talkpython.fm/api/search/{keyword}' + url = f'https://movieservice.talkpython.fm/api/search/{keyword}' resp = requests.get(url) resp.raise_for_status() diff --git a/days/34-36-refactoring/README.md b/days/34-36-refactoring/README.md new file mode 100644 index 00000000..9df4c02a --- /dev/null +++ b/days/34-36-refactoring/README.md @@ -0,0 +1,38 @@ +# Refactoring / Pythonic code + +In today's videos I will show you 10 ways to improve your Python code. The accompanying Jupyter notebook is [here](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/34-36-refactoring/refactoring.ipynb). + +This is by no means a complete list, just some tips to get you started. The more time you spend with Python the more patterns you start to recognize and the more elegant your code will become. + +## Day 1: Study the materials + +Go through the 10 refactoring tips: + +1. The problem with big if-elif-else constructs +2. Counting inside a loop +3. Use the with statement to deal with resources +4. Use builtins (learn the stdlib!) +5. Leverage tuple unpacking and namedtuples +6. List comprehensions and generators +7. String formatting and concatenation +8. PEP8 and Zen +9. Explicit is better than implicit +10. (bonus) General coding best practices + +There are also some additional resources in the notebook. + +Ideally you combine this lesson with [Day 10-12 `pytest`](https://github.com/talkpython/100daysofcode-with-python-course/tree/master/days/10-12-pytest) to get in the habit of writing tests before doing any refactorings. + +## Day 2 and 3: Refactor your code + +Take our [Blog Code Challenge 30: The Art of Refactoring: Improve Your Code](https://pybit.es/articles/codechallenge30/) + +Check out [the notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/34-36-refactoring/refactoring.ipynb) for further instructions. + +## Time to share what you've accomplished! + +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. + +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). diff --git a/days/34-36-refactoring/coding-horror.gif b/days/34-36-refactoring/coding-horror.gif index 384c8bdc..20589541 100644 Binary files a/days/34-36-refactoring/coding-horror.gif and b/days/34-36-refactoring/coding-horror.gif differ diff --git a/days/34-36-refactoring/strings.png b/days/34-36-refactoring/strings.png index 06b8a58d..014e79d6 100644 Binary files a/days/34-36-refactoring/strings.png and b/days/34-36-refactoring/strings.png differ diff --git a/days/37-39-csv-data-analsys/README.md b/days/37-39-csv-data-analysis/README.md similarity index 94% rename from days/37-39-csv-data-analsys/README.md rename to days/37-39-csv-data-analysis/README.md index 63748561..c539e955 100644 --- a/days/37-39-csv-data-analsys/README.md +++ b/days/37-39-csv-data-analysis/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 diff --git a/days/37-39-csv-data-analsys/weather_csv_demo/data/seattle.csv b/days/37-39-csv-data-analysis/weather_csv_demo/data/seattle.csv similarity index 100% rename from days/37-39-csv-data-analsys/weather_csv_demo/data/seattle.csv rename to days/37-39-csv-data-analysis/weather_csv_demo/data/seattle.csv diff --git a/days/37-39-csv-data-analsys/weather_csv_demo/program.py b/days/37-39-csv-data-analysis/weather_csv_demo/program.py similarity index 100% rename from days/37-39-csv-data-analsys/weather_csv_demo/program.py rename to days/37-39-csv-data-analysis/weather_csv_demo/program.py diff --git a/days/37-39-csv-data-analsys/weather_csv_demo/research.py b/days/37-39-csv-data-analysis/weather_csv_demo/research.py similarity index 96% rename from days/37-39-csv-data-analsys/weather_csv_demo/research.py rename to days/37-39-csv-data-analysis/weather_csv_demo/research.py index fa2dcc7d..19ac0eea 100644 --- a/days/37-39-csv-data-analsys/weather_csv_demo/research.py +++ b/days/37-39-csv-data-analysis/weather_csv_demo/research.py @@ -53,7 +53,7 @@ def hot_days() -> List[Record]: def cold_days() -> List[Record]: - return sorted(data, key=lambda r: r.actual_max_temp) + return sorted(data, key=lambda r: r.actual_min_temp) def wet_days() -> List[Record]: diff --git a/days/40-42-json-data/README.md b/days/40-42-json-data/README.md index fa7d118f..6db6ef1c 100644 --- a/days/40-42-json-data/README.md +++ b/days/40-42-json-data/README.md @@ -7,14 +7,14 @@ This lesson will walk you through importing, decoding, understanding and parsing ## Day N: Understand and download JSON output -Two videos to watch today: *Inspecting JSON schema* and *Pulling and decoding JSON data*. +Two videos to watch today: *Inspecting JSON schema* and *Request JSON data from an API*. These videos will demo some basic JSON schema as well a complex data set. After watching, feel free to play around with your own data sets or use the example in the repo code. ## Day N+1: Parsing JSON nested dicts -One of the hardest things with JSON is grabbing data that's nested deep within the dict tree of the JSON schema. +One of the hardest things with JSON is grabbing data that's nested deep within the dict tree of the JSON schema. Watch *Parsing JSON nested dicts* to get a first hand look how to do this. @@ -23,7 +23,7 @@ Use the rest of this day to play around with the included JSON data provided in ## Day N+2: Your Turn! -Day 3 means it's your turn! Head over to [PyBites Code Challenge 16](https://codechalleng.es/challenges/16/) and query your favourite API. +Day 3 means it's your turn! Head over to [PyBites Code Challenge 16](https://pybit.es/articles/codechallenge16/) and query your favourite API. A great choice is the [OMDb API](http://www.omdbapi.com/) to query your favourite movies. @@ -34,8 +34,8 @@ Enjoy! ### Time to share what you've accomplished! -Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. 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).* 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 diff --git a/days/43-45-search-api/README.md b/days/43-45-search-api/README.md index d070ea06..3cd790b0 100644 --- a/days/43-45-search-api/README.md +++ b/days/43-45-search-api/README.md @@ -53,7 +53,7 @@ There are 7 matching episodes: Your app is basically working. Today we'll polish it up a bit with some code cleanup and user interaction. -Start with code cleanup. We have been passing dictionaries around. These are not so much fun. Let's use `nametuples`. You create one link this: +Start with code cleanup. We have been passing dictionaries around. These are not so much fun. Let's use `namedtuples`. You create one like this: ```python import collections diff --git a/days/43-45-search-api/demo/movie_search/api.py b/days/43-45-search-api/demo/movie_search/api.py index 00d88309..d840ec7f 100644 --- a/days/43-45-search-api/demo/movie_search/api.py +++ b/days/43-45-search-api/demo/movie_search/api.py @@ -8,7 +8,7 @@ def find_movie_by_title(keyword: str) -> List[Movie]: - url = f'http://movie_service.talkpython.fm/api/search/{keyword}' + url = f'https://movieservice.talkpython.fm/api/search/{keyword}' resp = requests.get(url) resp.raise_for_status() 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 88d359ff..da5c19a2 100644 Binary files a/days/43-45-search-api/readme_resources/post-sm.jpg and b/days/43-45-search-api/readme_resources/post-sm.jpg differ diff --git a/days/43-45-search-api/readme_resources/post.png b/days/43-45-search-api/readme_resources/post.png index fa80caf1..fbace271 100644 Binary files a/days/43-45-search-api/readme_resources/post.png and b/days/43-45-search-api/readme_resources/post.png differ 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).* diff --git a/days/55-57-uplink/README.md b/days/55-57-uplink/README.md index 04c48cd3..9848b971 100644 --- a/days/55-57-uplink/README.md +++ b/days/55-57-uplink/README.md @@ -1,6 +1,6 @@ # Days 55-57 Structured APIs with `uplink` -Remember the [movie search service](http://movie_service.talkpython.fm/) we discussed when we first worked with HTTP services? It's back and you're going to build a proper API client for it using `uplink`. +Remember the [movie search service](https://movieservice.talkpython.fm/) we discussed when we first worked with HTTP services? It's back and you're going to build a proper API client for it using `uplink`. ## Day N: Application skeleton @@ -17,7 +17,7 @@ Today is mostly watching the corresponding videos from the course. Be sure to wa ## Day N+1: Model the API -Visit the movie search service: [movie_service.talkpython.fm](http://movie_service.talkpython.fm/). +Visit the movie search service: [movieservice.talkpython.fm](https://movieservice.talkpython.fm/). You'll see there are three RESTful operations. @@ -34,7 +34,7 @@ Your goal today will be to build an API client class in `api.py`. 1. Create a class (name it something like `MovieSearchClient`). 2. Indicate `uplink.Consumer` as the base class. -3. Add a `__init__` method to pass `http://movie_service.talkpython.fm/` as the `base_url` to the super class. +3. Add a `__init__` method to pass `https://movieservice.talkpython.fm/` as the `base_url` to the super class. 2. Add a method for each of the three HTTP endpoints Recall that you define an endpoint method inside the class as: diff --git a/days/55-57-uplink/demo/blog_client.py b/days/55-57-uplink/demo/blog_client.py index e80d8cb2..80b3495b 100644 --- a/days/55-57-uplink/demo/blog_client.py +++ b/days/55-57-uplink/demo/blog_client.py @@ -11,11 +11,14 @@ class BlogClient(uplink.Consumer): def __init__(self): - super().__init__(base_url='http://consumer_services_api.talkpython.fm') + # Updating this to the latest SSL based version + # Should have redirected in code but not in many browsers oddly + # Hopefully it's just clearer having it here like this. + super().__init__(base_url='https://consumerservicesapi.talkpython.fm/') @uplink.get('/api/blog') def all_entries(self) -> requests.models.Response: - """ Get's all blog entries from the server. """ + """ Gets all blog entries from the server. """ @uplink.get('/api/blog/{post_id}') def entry_by_id(self, post_id) -> requests.models.Response: @@ -27,13 +30,11 @@ def create_new_entry(self, title: str, content: str, published = datetime.datetime.now().isoformat() # noinspection PyTypeChecker - return self.__create_new_entry( - title=title, - content=content, - view_count=views, - published=published - ) + resp = self.internal_create_new_entry(title=title, content=content, view_count=views, published=published) + return resp + # Note: For some reason, the name of this method was freaking out the latest version of + # uplink. So we just named it internal_. That's why it's different from the video. @uplink.post('/api/blog') - def __create_new_entry(self, **kwargs: uplink.Body) -> requests.models.Response: + def internal_create_new_entry(self, **kwargs: uplink.Body) -> requests.models.Response: """ Creates a new post. """ diff --git a/days/55-57-uplink/demo/program.py b/days/55-57-uplink/demo/program.py index 36cd85c3..bcb0593f 100644 --- a/days/55-57-uplink/demo/program.py +++ b/days/55-57-uplink/demo/program.py @@ -50,7 +50,8 @@ def write_post(): resp = svc.create_new_entry(title, content, view_count) print() - print("Created new post successfully: {}".format(resp.json().get('id'))) + resp = resp.json() + print("Created new post successfully: {}".format(resp.get('id'))) print() diff --git a/days/55-57-uplink/demo/requirements.txt b/days/55-57-uplink/demo/requirements.txt index 622c506e..0f155718 100644 --- a/days/55-57-uplink/demo/requirements.txt +++ b/days/55-57-uplink/demo/requirements.txt @@ -1,2 +1,3 @@ requests -uplink==0.4.0 \ No newline at end of file +# Moving to the latest version of uplink to keep things fresh and relevant. +uplink==0.9.4 \ No newline at end of file diff --git a/days/58-60-twitter-api/README.md b/days/58-60-twitter-api/README.md new file mode 100644 index 00000000..d34ce066 --- /dev/null +++ b/days/58-60-twitter-api/README.md @@ -0,0 +1,25 @@ +# Twitter Data Analysis with Python + +In today's lesson we will do some analysis of Twitter data! If you want to follow along with the videos of this lesson, you can use [this notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/58-60-twitter-api/twitter-api.ipynb). + +## Day 1: Retrieving tweets with Tweepy + +First you will set up a [virtual environment](https://pybit.es/the-beauty-of-virtualenv.html), install `tweepy` and set some ENV variables. + +Then we will retrieve PyBites tweets which we will put in a [nice wordcloud](https://github.com/amueller/word_cloud) in the shape of our (old) PyBites logo (update: we have a new logo now, but see [this banner](https://pybit.es/articles/decorators-by-example/) for example for the old one). + +![pybites wordcloud](wordcloud-image.png) + +Pretty exciting no? + +## Day 2 and 3: Practice + +We covered Twitter data analysis quite extensively on our blog. See [the notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/58-60-twitter-api/twitter-api.ipynb) for a listing of tools and challenges you can work on. As they are not small projects I bundled day 2 and 3 to focus on getting one working. + +## Time to share what you've accomplished! + +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. + +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). diff --git a/days/58-60-twitter-api/pybites.png b/days/58-60-twitter-api/pybites.png index d554872e..b342c994 100644 Binary files a/days/58-60-twitter-api/pybites.png and b/days/58-60-twitter-api/pybites.png differ diff --git a/days/58-60-twitter-api/twitter-api.ipynb b/days/58-60-twitter-api/twitter-api.ipynb index c33c2803..58eadfe6 100644 --- a/days/58-60-twitter-api/twitter-api.ipynb +++ b/days/58-60-twitter-api/twitter-api.ipynb @@ -1,1822 +1 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Twitter Data Analysis with Python" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### First day: retrieving tweets with Tweepy" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "See the course appendix for how to setup your virtual environment. If you want to follow along make sure you:\n", - "- pip installed the `requirements.txt` which includes `tweepy`, `wordcloud` and related dependencies we will use in this lesson\n", - "- create your own Twitter app [here](https://apps.twitter.com/app/new), generating the required credentials/tokens \n", - "- export these as environment variables in your `venv/bin/activate` (virtual env startup script):\n", - "\n", - " export TWITTER_KEY='abc'\n", - " export TWITTER_SECRET='abc'\n", - " export TWITTER_ACCESS_TOKEN='xyz'\n", - " export TWITTER_ACCESS_SECRET='xyz'" - ] - }, - { - "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from collections import namedtuple, Counter\n", - "import os\n", - "import re\n", - "\n", - "import matplotlib.pyplot as plt\n", - "import numpy as np\n", - "from PIL import Image\n", - "import tweepy\n", - "from wordcloud import WordCloud, STOPWORDS\n", - "\n", - "Tweet = namedtuple('Tweet', 'id text created likes rts')\n", - "\n", - "TWITTER_ACCOUNT = 'pybites'\n", - "\n", - "TWITTER_KEY = os.environ['TWITTER_KEY']\n", - "TWITTER_SECRET = os.environ['TWITTER_SECRET']\n", - "TWITTER_ACCESS_TOKEN = os.environ['TWITTER_ACCESS_TOKEN']\n", - "TWITTER_ACCESS_SECRET = os.environ['TWITTER_ACCESS_SECRET']" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "In this lesson we will be using [Tweepy](http://docs.tweepy.org/en/v3.5.0/api.html) and its powerful [Cursor pagination object](http://docs.tweepy.org/en/v3.5.0/cursor_tutorial.html).\n", - "\n", - "We will use it to retrieve PyBites' Twitter history (~ 2.4k tweets as of Jan 2018) to:\n", - "- get most popular tweets by # likes / RTs, \n", - "- see what the most common hashtags and mentions are, and\n", - "- create a nice [wordcloud](https://github.com/amueller/word_cloud) of our tweets." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "First we need to instantiate `tweepy` and create an `api` object." - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "auth = tweepy.OAuthHandler(TWITTER_KEY, TWITTER_SECRET)\n", - "auth.set_access_token(TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_SECRET)\n", - "api = tweepy.API(auth)\n", - "api" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's define a function to get all our tweets. My first attempts left RTs and replies out but if we look at mentions it might be useful to keep them around. They are also easy to exclude later with some _list comprehensions_." - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [], - "source": [ - "def get_tweets():\n", - " for tw in tweepy.Cursor(api.user_timeline, screen_name=TWITTER_ACCOUNT,\n", - " exclude_replies=False, include_rts=True).items():\n", - " yield Tweet(tw.id, tw.text, tw.created_at, tw.favorite_count, tw.retweet_count)" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "metadata": {}, - "outputs": [], - "source": [ - "tweets = list(get_tweets())" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "2484" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "len(tweets)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Let's look at what our most popular tweets have been so far based on a simple average of number of likes and retweets. " - ] - }, - { - "cell_type": "code", - "execution_count": 22, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "❤ | ♺ | ✎\n", - "--------------------------------------------------------------------------------\n", - "168 | 89 | >>> import this ⏎ ... ⏎ Now is better than never. ⏎ ... ⏎ ⏎ Start coding in #Python ⏎ ⏎ PyBites Code Challenge Platform is… https://t.co/8iNjGWrJuQ\n", - "82 | 40 | We are very excited to announce our first #Python #Flask course on Udemy. ⏎ ⏎ Check it out here:… https://t.co/r1tdMWmbdL\n", - "64 | 32 | Beginner Pythonistas tend to have trouble parsing nested data structures. ⏎ ⏎ Here is a Bite of Py to practice just t… https://t.co/YOkyvbd8t8\n", - "59 | 24 | Here is the deal: we <3 #Chatbots, they are cool and rising. ⏎ ⏎ We challenge YOU to code one in #Python:… https://t.co/5GfUnMbVJx\n", - "52 | 27 | It's official! PyPI has hit 100,000 packages! Woohoo!! #Python #milestone @TalkPython @pybites https://t.co/jqDoWsjfyR\n", - "58 | 19 | Codementor: Building a desktop notification tool using #python https://t.co/2V2pfqu2yx\n", - "36 | 17 | PyBites Code Challenge #40: ⏎ Daily Python Tip Part 1 - Make a Web App ⏎ https://t.co/OMa6BSgSxR ⏎ @python_tip ⏎ #django… https://t.co/ISNkpJpFYS\n", - "34 | 12 | We are honoured to have been on the @TalkPython podcast. Listen to this episode if you want to learn more about our… https://t.co/NMidGnQunk\n", - "29 | 16 | The coolest chatbot built with #Python and PR'd to PyBites earns a copy of 'Designing Bots' have fun! Instructions:… https://t.co/HJRWRF2FkE\n", - "38 | 6 | Happy birthday @PyBites: in today's new article we reflect on last year and we have an important announcement to ma… https://t.co/pAFQmYtjA7\n", - "32 | 12 | #100DaysOfCode - Day 013: simple #Flask app to compare weather of 2 cities (using OpenWeatherMap #API) https://t.co/XOQVTOUdFn #Python\n", - "35 | 8 | Wow 300 forks on our Challenges repo - https://t.co/UoVsqf3bLA - keep on coding and let us know if you have more id… https://t.co/igVDD7pvUU\n", - "30 | 12 | Great book: Python Testing With Pytest by @brianokken - review: https://t.co/S319H9Se80\n", - "28 | 11 | #100DaysOfCode - Day 061: Plan your next book read using the @twilio SMS API (cc @mattmakai) https://t.co/flWISk9KgM #Python\n", - "26 | 10 | Import Python: #159: How to speed up Python application startup time, Hunting Memory Leaks and more https://t.co/EKj5TvqUKm\n", - "27 | 9 | New article: ⏎ Bootstrap Your Next #Python Project With #Cookiecutter ⏎ https://t.co/RN2x6Cxzlg https://t.co/Ks4AEcpKWk\n", - "26 | 10 | Nice intro tutorial by @dbader_org: What Are #Python #Generators? - https://t.co/3qNTvLu80H - easy to use + many advantages, use them!\n", - "22 | 13 | #100DaysOfCode - Day 066: Use Selenium to login to a site and show content https://t.co/jjkJ2hh36a #Python\n", - "17 | 17 | Free @PacktPub ebook of the day: #Python Data Science Essentials - Second Edition - https://t.co/t2aLcaSm56\n", - "24 | 9 | Meet the man behind the most important tool in data science https://t.co/TEUKBGo1dc via @qz #pandas\n", - "19 | 14 | How to Monitor #Python Web Applications - Full Stack Python https://t.co/i9bowbjS9I #Rollbar\n", - "23 | 10 | New tutorial series on @vitorfs Simple is Better Than Complex: ⏎ ⏎ A Complete Beginner's Guide to #Django - Part 1 ⏎ ⏎ https://t.co/i2w16V6u8y\n", - "24 | 8 | A Step-by-Step Guide on Deploying a Simple #Flask app to #Heroku. This absolutely made my week! https://t.co/uOs7VctbTE #Python\n", - "19 | 13 | Learned more #python and #flask ⏎ ⏎ Simple API Part 2 - Building a Deep Work Logger with Flask, Slack and Google Docs ⏎ ⏎ https://t.co/DTTuAQt69Q\n", - "26 | 5 | Announcing the @PyBites Code Challenge 47 winner: @FerroRodolfo! Thanks for your awesome Twitter Hashtag word cloud… https://t.co/YR21EVfzoG\n", - "24 | 7 | Today we cover an often requested, important to know and powerful topic: ⏎ ⏎ Learning #Python Decorators by Example… https://t.co/RvK4CMgYoC\n", - "24 | 6 | Want to learn some #python, building something cool, getting featured on PyBites? #codechallenge ideas are welcome: https://t.co/vpEQb5lAIG\n", - "23 | 6 | “How to use Python and Flask to build a web app — an in-depth tutorial” by @abhisuri97 https://t.co/gQ0KcRNC64\n", - "22 | 7 | \"Who's behind PyBites?\" ⏎ \"What do we do?\" ⏎ ⏎ Our newly designed homepage explains it in a nutshell ... ⏎ ⏎ Check it out… https://t.co/nb9RkYtoE9\n", - "20 | 9 | #100DaysOfCode - Day 056: #Python #Flask BMI calculator https://t.co/ARbG06bF2a #Python\n", - "16 | 11 | Conclusion 1st #PyChallengeDay co-hosted with @python_alc: ⏎ \"Live workshops offer an effective and fun way to build… https://t.co/cwMacgzebT\n", - "11 | 16 | Tomorrow 10 am CET University of Alicante: #PyChallengeDay workshop ⏎ ⏎ Join us and @python_alc to flex your coding mu… https://t.co/M3hdQFHs50\n", - "15 | 12 | Import #Python: News This Week - EuroSciPy Videos are out, Reducing Python's startup time, Predicting algo .. https://t.co/afLv8bwHuL\n", - "15 | 11 | “A brief tour of Python 3.7 data classes” by @anthonypjshaw https://t.co/ClOABPFZkj\n", - "20 | 6 | You want to hone your #Regex skills? Here is a little Bite of #Python to practice: ⏎ https://t.co/9xBJchTK0L\n", - "18 | 8 | Import #Python 140 - Publish your Python packages, Python for research course, sys.getrefcount ... https://t.co/vu6jXaqseh\n", - "20 | 6 | #100DaysOfCode - Day 099: Simple #Flask app to display photos in a directory https://t.co/VGTQUxpEiE #Python\n", - "15 | 11 | Just added @TalkPython video training to our resources article, among the best #python video trainings out there! https://t.co/8bpGOQ13pz\n", - "20 | 5 | New @lynda course: OpenCV for #Python Developers - https://t.co/lcWsQkHR5S\n", - "20 | 5 | #100DaysOfCode - Day 097: Create a default #Flask App dir structure for new projects https://t.co/43QMRAerkO #Python\n", - "17 | 7 | WOW #milestone: ⏎ 391 Pythonistas have solved 1,000 Bites, writing 18,003 lines of code. ⏎ ⏎ Join us at… https://t.co/z6m3HmIr0E\n", - "21 | 3 | #100DaysOfCode - Day 038: Simple #Twitter login for your #Flask app using flask_oauthlib https://t.co/iSE1Pcp0hk #Python\n", - "16 | 8 | Learn how to format strings in #python - https://t.co/faGOvTZ51u\n", - "17 | 6 | Nice example how to start the new year by automating a boring task with #Python » Word Notifier · Words to Thoughts… https://t.co/IhlvapbeTb\n", - "14 | 9 | Step-by-Step Guide on Deploying a Simple #Flask App to #Heroku https://t.co/65JTiy0whK\n", - "18 | 5 | A Complete Beginner's Guide to #Django - Part 4 is out https://t.co/zchdtkvceV via @vitorfs\n", - "21 | 2 | Simple is Better Than Complex: A Complete Beginner's Guide to #Django - Part 3 https://t.co/qH83RGfujh\n", - "15 | 7 | Wow: ⏎ 💪 584 bites completed by 241 Pythonistas! 💪 ⏎ ⏎ - will you be the next one to crack some bites of py?… https://t.co/XGg40QwPGF\n", - "17 | 5 | #Python Data: Forecasting Time Series data with #Prophet – Trend Changepoints https://t.co/HRK3l35pse\n", - "12 | 10 | #100DaysOfCode - Day 032: #Flask #jQuery movie autocomplete https://t.co/x8ODLnJd8u #Python\n", - "10 | 12 | #100DaysOfCode - Day 026: Simple script to retrieve #movie data from OMDb #API https://t.co/dRiEnI9XE0 #Python\n", - "17 | 4 | » PyFormat: Using % and .format() for great good! https://t.co/kfAEpWDIdA\n", - "18 | 3 | Recommended: a Complete Beginner's Guide to #Django - Part 2 https://t.co/OWAbypWSbU via @vitorfs\n", - "11 | 10 | #100DaysOfCode - Day 006: simple reusable code snippet to print a dict https://t.co/bDTNT2X7wa #Python\n", - "12 | 8 | New PyBites Code Challenge 45 is up: #TDD: Code #FizzBuzz Writing Tests First! ⏎ https://t.co/cStZFUWm36 - have fun with #Python\n", - "14 | 6 | New Article / guest post is up: ⏎ Using #Pandas and #Seaborn to solve PyBites Marvel Challenge… https://t.co/R2IKL0uo3n\n", - "14 | 6 | Free @PacktPub ebook today: mastering object oriented #Python https://t.co/t2aLcaALdy\n", - "16 | 4 | An #API should make the simple easy, the complex possible and the wrong impossible - great talk by @flaviojuvenal… https://t.co/jiw3UeUkZy\n", - "14 | 6 | So we made an #app to compare the weather in two cities with #Python #Flask and deployed it on #Heroku! Excitement! https://t.co/VQ4ZwbI6Ac\n", - "14 | 6 | Behind the Scenes of @PyBites - a Blog for Passionate Pythonistas (Post #100 Special) https://t.co/iqeiM7Dk6q #python\n", - "12 | 7 | Our guest post is up! Thanks @RealPython https://t.co/4sn5ygKren\n", - "12 | 7 | How to Use #Pdb to Debug Your Code https://t.co/OkqLq1iqvl - invaluable tool for any #python developer\n", - "10 | 9 | Mark your calendars: this Friday at 10 am CET: #Marvel meets #Python at our first live #CodeChallenge in collaborat… https://t.co/V3jYX4YRUm\n", - "14 | 5 | PyBites Newsletter - Python Flask Online Course Launch, Decorators, Pdb, Cookiecutter, Open Source and Community https://t.co/hLYOcDjN8x\n", - "17 | 2 | Simple is Better Than Complex: A Complete Beginner's Guide to #Django - Part 5 https://t.co/D8duhMih2O\n", - "12 | 7 | New PyBites Article: Improve the Quality of Your #Code with @BetterCodeHub - https://t.co/GUVZD4qWTv #cleancode… https://t.co/eXLM948XGu\n", - "15 | 4 | Had fun with #Python #Selenium and submitted my code. ⏎ ⏎ Who else joins this week's PyBites code challenge? https://t.co/YxKRxTW44i\n", - "12 | 7 | Import #Python Weekly - debugging, machine learning, data science, testing ,docker ,locust and more https://t.co/B8iIA3O7TW\n", - "13 | 6 | Cool - Using the PythonAnywhere API: an (open source) helper script to create a Django webapp with a virtualenv ⏎ ⏎ https://t.co/qKZWpP4r2B\n", - "15 | 4 | #100DaysOfCode - Day 065: Use #Python #webbrowser to simplify #Flask testing https://t.co/sqwnz6ZBBI #Python\n", - "11 | 8 | Awesome learning: 3 cool #Flask apps in our #Python Code Challenge 15 review https://t.co/kOcr5H65Bw @mohhinder @techmoneykids @bbelderbos\n", - "12 | 7 | Have a nice pythonic day :) #coffee #python @techmoneykids https://t.co/gfQxwAI6so\n", - "10 | 8 | Wooo it's the weekend! The perfect time to have a crack at an Advanced Bite of #Python! Free for the weekend, give… https://t.co/LM1ZArB0xP\n", - "16 | 2 | PyBites Newsletter - PyBites One Year / Introducing codechalleng.es, our new Code Challenge Platform - https://t.co/Fo2ozmsH3v\n", - "10 | 8 | Full Stack Python: DevOps, Continuous Delivery... and You https://t.co/PTtkbaCZKH\n", - "12 | 5 | PRs do count: David solved our Marvel #pychallenge earning a copy of @AlSweigart’s Automate the boring stuff. I thi… https://t.co/0HlF3jYvKS\n", - "9 | 8 | Free @PacktPub ebook of the day: #Python Geospatial Development - Third Edition - https://t.co/t2aLcaSm56\n", - "12 | 5 | New PyBites article: Making a Banner Generator With #Pillow and #Flask - https://t.co/2IqTyidX1w https://t.co/LobuJrVCHV\n", - "12 | 5 | Debugging in Python https://t.co/otTstPcQxr -> import pdb; ⏎ pdb.set_trace() -> debug!\n", - "14 | 3 | Some nice #flask #bokeh submissions being PR'd :) ⏎ ⏎ It's never too late to join our code challenges: ⏎ https://t.co/CO3esWd37H ⏎ ⏎ cc @realpython\n", - "11 | 6 | New PyBites article: The Importance of Refactoring Code https://t.co/HeMVp5WktZ #python\n", - "12 | 5 | Guest post on @dbader_org - dunder / special methods in #Python, to which we linked this week's code challenge #24… https://t.co/1LyCZahOH0\n", - "13 | 4 | #100DaysOfCode - Day 083: #Python #Flask app to print the current time in a given timezone https://t.co/LjD5EpJoPW #Python\n", - "13 | 3 | Finally using f-strings, not sure what took me so long, going back to the otherwise elegant '{}'.format feels weird… https://t.co/SrLlJAALOh\n", - "13 | 3 | 5 tips to speed up your #Python code https://t.co/zbGWIFHPVG #performance\n", - "14 | 2 | Free @PacktPub ebook of the day: Scientific Computing with #Python 3 - https://t.co/t2aLcaSm56\n", - "10 | 6 | Morning Pythonistas, #regexes can be hard but we got your back with our new #Python code challenge #42:… https://t.co/QCe3iTrl7Y\n", - "10 | 6 | New PyBites Code Challenge 41 is out: ⏎ Daily Python Tip Part 2 - Build an #API https://t.co/dQCo203vwP ⏎ @python_tip https://t.co/bL7FWyjdzC\n", - "11 | 5 | Building and Testing an API Wrapper in Python via @semaphoreci https://t.co/gL4vlmQc0f - excellent article #requests #vcrpy #pytest\n", - "13 | 3 | #100DaysOfCode - Day 096: Script to measure which 100Days tweets were most successful (RTs / Favs) https://t.co/TXgWL29ps4 #Python\n", - "11 | 5 | #100DaysOfCode - Day 058: Playing with OOP / classes in Python https://t.co/eufNZ5CUVd #Python\n", - "12 | 4 | #100DaysOfCode - Day 052: Build a user focused REPL with prompt_toolkit (source @amjithr) https://t.co/JsHrgcMnz9 #Python\n", - "14 | 2 | #100DaysOfCode - Day 001: script to check if tip already submitted to @python_tip https://t.co/SwtTASAcuv\n", - "12 | 4 | The #Python data model by example - https://t.co/j3wu8kfFO4\n", - "12 | 3 | How to Implement Multiple User Types with Django https://t.co/3gEQgqHBYh via @vitorfs\n", - "11 | 4 | Quantify/visualize our #data and win one of our prizes ... ⏎ ⏎ Code Challenge 47 - PyBites First Year in Data (Special) https://t.co/FF1yEM4WiN\n", - "11 | 4 | Some PyBites pointers/ advice on How to Learn #Python https://t.co/fDWzVLlnIh\n", - "11 | 4 | Our new #CodeChallenge special is up. ⏎ ⏎ Original submissions are rewarded with a price - have fun! ⏎ ⏎ #47 - PyBites F… https://t.co/D0E6dDShcZ\n", - "11 | 4 | Surely you can code FizzBuzz right? Now do it in #tdd for one of our challenges this month, and don’t forget to PR… https://t.co/oRLUKJNokQ\n", - "12 | 3 | Codementor: How they work - The 3 Magical Functions of Python : map, filter and lambda https://t.co/QMuVBcaFTp\n", - "11 | 4 | #Python Data: Stock market forecasting with #prophet https://t.co/moLFmyWiVu\n", - "10 | 5 | What Does It Take to Be An Expert At #Python - https://t.co/lZqMIOHEjF\n", - "10 | 5 | Learning #flask ebook for free today thanks to @PacktPub - https://t.co/t2aLcaALdy\n", - "10 | 5 | Thanks @mkennedy and @brianokken for your nice feedback on our #100DaysOfCode, motivates us even more. https://t.co/GzLgyyM8Sg\n", - "7 | 8 | #100DaysOfCode - Day 089: #Python #Flask overtime hours tracker. #sqlite https://t.co/PDN389aOoD #Python\n", - "11 | 3 | “Playing with Twitter Streaming API” by @ssola https://t.co/YJjf163T4u\n", - "10 | 4 | You want to flex your #Python muscles working on some #Marvel data? ⏎ ⏎ Come join us for our \"Code Challenge 44 - Mar… https://t.co/ss4RzJIltK\n", - "7 | 7 | Live #Python code challenge this Friday at the University of Alicante - stay tuned ... https://t.co/ucdEOo3jYm\n", - "10 | 4 | How to Use #Pdb to Debug Your #Python Code https://t.co/m5qxdabh0C https://t.co/iWs9F5xLvo\n", - "8 | 6 | You want more maintainable #Python code? ⏎ ⏎ Join #PyBitesChallenge35 and use @github + @BetterCodeHub to do so. Spon… https://t.co/F3TcrbPP2Q\n", - "13 | 1 | Writing good decorators definitely enhances your #python skills. Nice intro below, practice with challenge 14 -… https://t.co/qYGNMygv7X\n", - "9 | 5 | New @lynda course: Data Science Foundations: #Python Scientific Stack - https://t.co/YPIBP46cpt\n", - "11 | 3 | 93 days done, next week we will hit 100% on our #100DaysOfCode #Python challenge - standby for an overview ...… https://t.co/EmDiFeqzJn\n", - "10 | 4 | #100DaysOfCode - Day 087: Currency Conversion script using openexchangerates API https://t.co/JSS6BpEcHB #Python\n", - "9 | 5 | Some nice Packt ebook utilities/scripts came out of last week's challenge. Review: https://t.co/4YErFZvrKm cc @Pybonacci @wonderfulboyx_e\n", - "11 | 3 | #100DaysOfCode - Day 062: #Python #Flask friends list with #sqlite db https://t.co/DPPWSevfBL #Python\n", - "11 | 3 | #100DaysOfCode - Day 060: #Python #Flask Pay Calculator using a session object https://t.co/EW82NyA2Bq #Python\n", - "12 | 2 | Zen of python on a T-shirt, how cool! #PyCon2017 https://t.co/YqDmuTg1zY\n", - "11 | 3 | #100DaysOfCode - Day 031: Simple and reusable #Python #script to move all files from one folder to another https://t.co/K6sA5sG9eZ #Python\n", - "9 | 5 | 5 tips to speed up your Python code https://t.co/XRjKM1c1ag #python\n", - "9 | 4 | Ned Batchelder: Python’s misleading readability https://t.co/xVXF9kOjSf\n", - "12 | 1 | No better way to start the year with a Bite of Py: https://t.co/RGAoq9378I - Happy New Year and keep calm and code in #Python\n", - "10 | 3 | Creating a Chatbot with Deep Learning, Python, and TensorFlow p.1 https://t.co/fYl9CVbovO via @YouTube\n", - "11 | 2 | Using Pandas and Seaborn to solve PyBites Marvel Challenge https://t.co/dkEwl2a27H\n", - "7 | 6 | from pybites import News ⏎ ⏎ Twitter Digest 2017 Week 51 ⏎ https://t.co/HMSvS6pU6X ⏎ ⏎ #Python #CodeChallenges… https://t.co/oZPjJmshag\n", - "10 | 3 | Never Forget A Friend’s Birthday with #Python, #Flask and #Twilio https://t.co/JctXeeOwxa via @twilio\n", - "9 | 4 | Excited! https://t.co/MpnGtiHZCc 7 code challenge PRs in little over a week - great work, keep coding and learn more #Python @techmoneykids\n", - "9 | 4 | #Django Weekly #56 - Free continuous delivery eBook from GoCD, A Complete Beginner's Guide to Django 2 https://t.co/Y8daJynDeI\n", - "9 | 4 | New on PyBites: How to learn #Python ⏎ ⏎ Read about Julian + Bob's Python journey in Special Post #200:… https://t.co/K7yO6XbUE2\n", - "8 | 5 | Obey the Testing Goat - \"TDD for the Web, with Python, Selenium, Django, JavaScript and pals\" - 2nd ed is out! https://t.co/UyqC7Ps3Ah\n", - "9 | 4 | PyCon 2017: Must-See Talks https://t.co/ejxZgRLA0k via @cuttlesoft\n", - "11 | 2 | \"Mentors learn from you too\" - so glad I attended this inspiring talk, thanks @mariatta https://t.co/NFtR6RitaI\n", - "7 | 6 | DataCamp: #Pandas Cheat Sheet: Data Wrangling in #Python https://t.co/zCdACatBq8\n", - "11 | 1 | Every time I use #Jupyter Notebooks I love them more, such a great tool to try out code (pdb), making notes, sharin… https://t.co/xT24j8bNor\n", - "9 | 3 | And the winner of the PyBites Code Challenge 43 (aka the chat bot challenge) is (drum roll) ... @FerroRodolfo - gra… https://t.co/WkVS6MPeaW\n", - "7 | 5 | “DisAtBot — How I Built a Chatbot With Telegram And Python” by @FerroRodolfo https://t.co/9i4QWFJZtg\n", - "8 | 4 | PyBites Newsletter - Chatbot Winner, Talk Python Podcast, Code Challenge Platform Preview, Live Workshop Alicante - https://t.co/F1Bko5VGVy\n", - "7 | 5 | New #Python Code Challenge 38 up: ⏎ ⏎ Build Your Own #Hacktoberfest Checker With #Bottle ⏎ https://t.co/lOV7nmufKj ⏎ Enjo… https://t.co/sxwBjm4WvR\n", - "8 | 4 | Our @twilio guest post is live! ⏎ ⏎ No more excuses to forget any birthday. Use Twilio's api for sms reminders and bir… https://t.co/hcwWtcC1oP\n", - "8 | 4 | Delighted to have @RealPython delivering this week's #Python Code Challenge #36: Create an #AWS #Lambda Function -… https://t.co/EjRULKz02c\n", - "7 | 5 | Codementor: Some tricky #Python snippets that may bite you off! https://t.co/IO5jgUjr75\n", - "8 | 4 | New PyBites Code Challenge 34 - Build a Simple #API With #Django Rest Framework - https://t.co/XdEE0s3RO3 …… https://t.co/awhEwVSmTZ\n", - "9 | 3 | wow deploying a django app to @pythonanywhere was very easy, nice service\n", - "7 | 5 | #100DaysOfCode - Day 023: use Counter to count the most common words in a file https://t.co/ewUUhffGUi #Python\n", - "6 | 6 | Get #flask by example @PacktPub ebook for free today, nice timing with our code challenge of this week :) https://t.co/GOtuNRhBmY\n", - "10 | 2 | Import Python: Import Python Weekly Issue 119 - PEP8 compliance, Python to Go, Flask, Pandas and more https://t.co/Yr88WSPT50 #python\n", - "8 | 3 | “Coding style matters, the importance of PEP8” by @bbelderbos https://t.co/UO64scQxRi\n", - "5 | 6 | Learn how @Mridu__ uses Feedparser, Difflib and Plotly to solve ⏎ #Python Code Challenge 03 - \"PyBites Blog Tag Analy… https://t.co/xowfim43iA\n", - "10 | 1 | Happy birthday @_juliansequeira, to celebrate here is a free bite of #Python, just on a topic you like, you gotta l… https://t.co/J4dhYBw53o\n", - "10 | 1 | Congratulations @fullstackpython, what a great milestone! https://t.co/kkQmuwSWEu\n", - "7 | 4 | from pybites import News ⏎ ⏎ Twitter Digest 2017 Week 50 https://t.co/b5s5xycPBD ⏎ ⏎ #python #news\n", - "11 | 0 | Awesome! Python is everywhere https://t.co/qlMygEikh8\n", - "7 | 4 | New PyBites Code Challenge 46 is up: Add Continuous Integration (CI) to Your Project - https://t.co/t1LhyjIzVl #CI… https://t.co/KKefAcRszk\n", - "9 | 2 | from pybites import ⏎ Twitter Digest 2017 Week 48 https://t.co/kl9fKtCtQq\n", - "8 | 3 | Free @PacktPub ebook of the day: #Python 3 Object-oriented Programming - Second Edition - https://t.co/t2aLcaSm56\n", - "9 | 2 | Remember: tomorrow last day to submit your awesome python bot for: ⏎ ⏎ Code Challenge 43 - Build a Chatbot Using Pyth… https://t.co/Y0fLg0lTIL\n", - "8 | 3 | Free @PacktPub ebook of the day: Modern #Python Cookbook - https://t.co/t2aLcaSm56\n", - "9 | 2 | People are really enjoying our #Python #Flask course on #udemy! We're absolutely stoked! Perfect timing with… https://t.co/5OFY0sRbM7\n", - "10 | 1 | Free @PacktPub ebook of the day: Web Development with #Django Cookbook - Second Edition - https://t.co/t2aLcaSm56\n", - "9 | 2 | free Scrapy ebook today ⏎ #python https://t.co/GV00QgK9Z7\n", - "8 | 3 | Free @PacktPub ebook of the day: Learning #Python Design Patterns - Second Edition - https://t.co/t2aLcaSm56\n", - "9 | 2 | #Django Weekly 59: TDD, React, Admin Panel, Good Django Books and more https://t.co/LvawI3iDAy\n", - "8 | 3 | New PyBites Code Challenge 37 - Automate a Task With @Twilio https://t.co/BizubUwnGM https://t.co/Vye2emNgMD\n", - "9 | 2 | Python Data: Forecasting Time Series data with Prophet – Part 3 https://t.co/oFJlhCthfq\n", - "9 | 2 | Simple is Better Than Complex: How to Use Celery and RabbitMQ with #Django https://t.co/eNATo3pGWG\n", - "7 | 4 | This week @MikeHerman from @realpython delivers Code Challenge 28 - Integrate a #Bokeh Chart Into #Flask https://t.co/CO3esWd37H - have fun!\n", - "9 | 2 | #100daysofcode + 200 Days of PyBites! We recap the challenge, 10 stand out scripts and our next project here https://t.co/RNTI13cjvm #Python\n", - "10 | 1 | #100DaysOfCode - Day 100: 100DaysOfCode done! 5K LOC!! Day #100 Special: a Histogram of LOC/day https://t.co/EhKs9yHU7b #Python\n", - "7 | 4 | #100DaysOfCode - Day 082: #Python script to list all #timezones and their current time https://t.co/kyjpul0vW2 #Python\n", - "7 | 4 | A #Python #cheatsheet resource guide on parsing common data formats. If you have any of your own tips let us know! https://t.co/GVC7Hhbx0t\n", - "9 | 2 | #100DaysOfCode - Day 025: Simple test #database generator script #python #sqlite #contextmanager https://t.co/6yKI6eLYFE #Python\n", - "9 | 1 | New @lynda course: #Python Essential Training - https://t.co/bCkHwrbzQx\n", - "7 | 3 | » Episode #60 Don't dismiss SQLite as just a starter DB - [Python Bytes Podcast] https://t.co/RVzSLHXOUR\n", - "8 | 2 | PyBites Code Challenges | Bite 10. Practice exceptions - https://t.co/ExU0s59oGV\n", - "8 | 2 | PyBites Code Challenges | Sum n numbers https://t.co/nb3THySQ2T - good morning, a small little bite for you to solve\n", - "6 | 4 | Free @PacktPub ebook of the day: Building RESTful #Python Web Services - https://t.co/t2aLcaSm56\n", - "5 | 5 | And another PyBites Code Challenge: #39 - Writing Tests With #Pytest ⏎ ⏎ https://t.co/TQ74ronFeE ⏎ ⏎ @pytestdotorg… https://t.co/0GBZRbKyGl\n", - "6 | 4 | Was just about to tweet it, but @importpython was there to catch it for us as well as other awesome articles: ⏎ ⏎ Wha… https://t.co/fnEJl6yisk\n", - "6 | 4 | \"5 killer use cases for AWS Lambda\" https://t.co/PxzTordHbn\n", - "7 | 3 | @Gustavoaz7_ LOL that's why #100DaysOfCode works :)\n", - "6 | 4 | We are stoked about this week's Code Challenge #30 - The Art of #Refactoring: Improve Your #Python Code https://t.co/Uy749gdzuH\n", - "6 | 4 | Codementor: How to Deploy a Django App on Heroku Easily | Codementor https://t.co/PU4bCfluRm\n", - "8 | 2 | #Django Weekly 47 - Concurrency in Django models, Towards Channels 2.0 , routing in uWSGI and more https://t.co/uerYJAyodz #python\n", - "6 | 4 | So you got the basics in #Python down, where to look next? We wrote a resources article some time ago: https://t.co/bZiqk0VRvl\n", - "9 | 1 | #100DaysOfCode - Day 086: Script to pull some quick stats from a #Twitter Archive CSV https://t.co/DwDw36bBj7 #Python\n", - "5 | 5 | #100DaysOfCode - Day 084: Use PyGithub to retrieve some basic stats for a GH user https://t.co/ojbRZH1Ngy #Python\n", - "8 | 2 | #100DaysOfCode - Day 063: Coding an account class using properties, dunders and pytest https://t.co/cpYDQBFWEc #Python\n", - "6 | 4 | #100DaysOfCode - Day 028: Jupyter notebook to plot and list new #Python titles on @safari by month https://t.co/LNWUIEr8zO #Python\n", - "7 | 3 | #100DaysOfCode - Day 021: script to make an index of modules used for this challenge (stdlib >50%) https://t.co/LSkcLT8Xcy #Python\n", - "6 | 4 | #100DaysOfCode - Day 017: script to automatically tweet out new @safari Python titles https://t.co/4nPyS5ImV6 #Python\n", - "7 | 3 | Write Pythonic Code Like a Seasoned Developer Review https://t.co/y8J4J7AU9z #python\n", - "6 | 3 | Don't let mutability of compound objects fool you! https://t.co/76jTypZAD7 #python\n", - "7 | 2 | New PyBites review post: a lot of good pull requests on our #codechallenges from last month!… https://t.co/fK6kMm2HRd\n", - "7 | 2 | Awesome: all PRs merged, review posts 38, 39 and 40 are up: ⏎ https://t.co/B9rjJoBWH5 ⏎ ⏎ Keep coding #python! ⏎ ⏎ #pytest… https://t.co/lXbIkccLR9\n", - "7 | 2 | Codementor: How I used #Python to find interesting people to follow on Medium https://t.co/8sh81xKU0M\n", - "4 | 5 | Easier #python PR review https://t.co/X5EsQ9jATE\n", - "6 | 3 | Semaphore Community: Dockerizing a Python Django Web Application https://t.co/OY3w4mSqsl #docker #python #django\n", - "5 | 4 | New PyBites Article: Fully Automate Login and Banner Generation with #Python #Selenium, #Requests and #Click -… https://t.co/vRzy9wAkiY\n", - "6 | 3 | psst ... too busy too keep up with #python news? ⏎ PyBites Twitter digest 2017 week 33 is out ... https://t.co/TK0ccqFiNr\n", - "6 | 3 | Free @PacktPub ebook of the day: #Python 3 Web Development Beginner's Guide - https://t.co/t2aLcaSm56\n", - "6 | 3 | This week's #Python Twitter Digest is out! It includes a great talk by @anthonypjshaw at #PyConAU & other cool stuff https://t.co/KfuVuwqeby\n", - "6 | 3 | New PyBites Article: ⏎ ⏎ A Step by Step Guide to Implementing and Deploying Two-Phase Registration in #Django ⏎ ⏎ https://t.co/s8R8K2CZej\n", - "5 | 4 | PyBites new Code Challenge #27 is up: #PRAW: The #Python #Reddit API Wrapper https://t.co/vj4hjuXORW - looking forward what you will code...\n", - "7 | 2 | Hi there, always wanted to play with GUIs? ⏎ ⏎ Now you can! ⏎ ⏎ Join our new Challenge 26 - Create a Simple #Python GUI - https://t.co/HK1PVHPZqV.\n", - "7 | 2 | And our second PyBites article of this week: ⏎ ⏎ Flask Web Server Port Mapping - https://t.co/5RqZPMn1di ⏎ ⏎ #python #flask\n", - "7 | 2 | #100DaysOfCode - Day 092: #Python script to ping every IP on a specified #network https://t.co/Ys78WTZeKj #Python\n", - "5 | 4 | #100DaysOfCode - Day 088: Using #Slack Real Time Messaging #API to capture all messages https://t.co/VUNjrRhiCG #Python\n", - "6 | 3 | Lots of #Python goodness in this week's Twitter Digest! The #django v #flask one is awesome! Happy Sunday! https://t.co/MMZzaqI52B\n", - "5 | 4 | #100DaysOfCode - Day 078: Use a context manager to rollback a transaction https://t.co/Bvhlxmg194 #Python\n", - "6 | 3 | #100DaysOfCode - Day 064: Prework code challenge #21: ApplianceCost class to calc energy cost https://t.co/KOUXxr9KNB #Python\n", - "5 | 4 | Awesome initiative: https://t.co/bsq3se1u8Y - a stylized presentation of the well-established PEP 8 #Python\n", - "6 | 3 | #100DaysOfCode - Day 059: Using the #Twilio #API to send SMS messages https://t.co/dkA2skiolM #Python\n", - "5 | 4 | New PyBites article: PyCon 2017 - Digest, Impressions, Reflection https://t.co/BgzFAdZcaU\n", - "7 | 2 | #100DaysOfCode - Day 053: Script to start automating posting to our PyBites FB group https://t.co/WOaRlkxcJx #Python\n", - "7 | 2 | Cool, @pycharm supports #vim mode via IdeaVim - https://t.co/g2TId7f70K - trying it out ...\n", - "5 | 4 | New @lynda course: Learning #Python for Data Science, with Tim Fox and Elephant Scale - https://t.co/WZi0nW5plU\n", - "6 | 3 | #100DaysOfCode - Day 036: Use #Python #pickle to store and retrieve a defaultdict https://t.co/ZheFpoGHGu #Python\n", - "7 | 2 | Our new #Python Code Challenge is up: #16 - Query Your Favorite #API - many options to practice for this one, enjoy! https://t.co/usDTVynyBZ\n", - "7 | 2 | #100DaysOfCode - Day 008: reusable python flask html template for printing a dict https://t.co/bSL5V4y7oj #Python\n", - "6 | 3 | #100DaysOfCode - Day 007: script to automatically tweet 100DayOfCode progress tweet https://t.co/n9L1fTj8Bz #Python\n", - "4 | 5 | Learn how to format strings in a Pythonic way: https://t.co/faGOvTZ51u https://t.co/NXDCZBShAY\n", - "2 | 7 | Time is scarce, save cycles: 5 nice #Python Development Setup Tips and #tools to Boost Your #Productivity https://t.co/zPNLCKYNnA\n", - "7 | 1 | Free @PacktPub ebook of the day: Learning #Python - https://t.co/t2aLcaSm56\n", - "6 | 2 | Module of the Week: Openpyxl - Automate Excel! https://t.co/U98is6UOc0\n", - "8 | 0 | Nice free ebook, useful for code challenge 41 - https://t.co/zrNJCuwtR9 - I think I will go with Flask. Want to giv… https://t.co/jjxQEYVXnq\n", - "5 | 3 | Happy Sunday, from pybites import News ⏎ ⏎ Twitter Digest 2017 Week 49 https://t.co/jjNNuZ9iS3 #python\n", - "5 | 3 | from pybites import news ⏎ ⏎ Twitter Digest 2017 Week 47 https://t.co/QBsyr0fX6h #Python\n", - "7 | 1 | Free @PacktPub ebook of the day: Learning Predictive Analytics with #Python - https://t.co/t2aLcaALdy\n", - "7 | 1 | @SlackHQ @ashevat Oh yeah, already got a Slack chatbot PR submission 👏🐍 https://t.co/OQNowTzQVJ\n", - "7 | 1 | Nice: a simple #Python Twitter Bot (Tweepy) to daily tweet out the price of #Bitcoin https://t.co/xyLaFBPUcu via @joshsisto\n", - "5 | 3 | Weekly Python Chat: Classes: When, How, Why, and Why Not https://t.co/iZ0ot18jd6\n", - "5 | 3 | Free @PacktPub ebook of the day: Learning Penetration Testing with #Python - https://t.co/t2aLcaSm56\n", - "7 | 1 | PyBites Newsletter - Code Challenges, Bottle, PyTest, Django, MIME, Openpyxl - https://t.co/SzR9QRVLs7\n", - "6 | 2 | Import Python: #143 - Build Book Recommender System, Terrible Python Error Message, Free CI eBook and more https://t.co/AQRx5tIURh\n", - "3 | 5 | We had fun with @bettercodehub - check out the review of our last PyBites Code Challenge: https://t.co/M9vjE3cw1W… https://t.co/n4ZubKvpp6\n", - "5 | 3 | Code Challenge 34 - Build a Simple API With #Django REST Framework - Review is up https://t.co/wSbrbC76hZ\n", - "7 | 1 | Excellent article: Mocking External APIs in #Python - Real Python https://t.co/OlauZiKPlO\n", - "6 | 2 | Talk Python to Me: #123 Lessons from 100 straight dev job interviews https://t.co/lUD1Fi9tkb\n", - "4 | 4 | Review of Code Challenge 28 \"Integrate a #Bokeh Chart Into #Flask\" is up: https://t.co/svYfwKCZtB - great work! Thx @MikeHerman @realpython\n", - "5 | 3 | New @lynda course: Learning #Python with PyCharm - https://t.co/i1IH9epweE\n", - "6 | 2 | #100DaysOfCode - Day 067: #Python script to pull a random entry from an #sqlite db https://t.co/i2Iro5yukd #Python\n", - "5 | 3 | #100DaysOfCode - Day 057: Using the #YouTube #API to determine most popular #PyCon2017 talks https://t.co/9r4oVM7Jcj #Python\n", - "8 | 0 | If you are interested in Twitter bots check out this cool poster / initiative by @kkvie #PyCon2017 https://t.co/QHejQD2LY0\n", - "5 | 3 | #100DaysOfCode - Day 035: Text replacer script using #pyperclip by @AlSweigart https://t.co/MXPsfu7cdr #Python\n", - "6 | 2 | #100DaysOfCode - Day 034: Import a #podcast feed into a DB table with #SQLAlchemy https://t.co/KtKBgXO6Zd #Python\n", - "7 | 1 | #100DaysOfCode - Day 030: Script to import movie csv file into an sqlite database https://t.co/qlld9p48z1 #Python\n", - "6 | 2 | #100DaysOfCode - Day 005: script to create a 100DaysOfCode tweet https://t.co/oNhW5tS6n9 #Python\n", - "5 | 3 | Interesting, how to make cleaner code reducing for loops https://t.co/Ny2JefgBKd\n", - "4 | 4 | @Pybonacci nice script to get the ebook automatically every day: https://t.co/FKKS7nGymq\n", - "6 | 1 | Almost due: Code Challenges #47 - PyBites First Year in Data (Special) https://t.co/XHJBROl6Vk - PR your data analy… https://t.co/sGUpIPRp39\n", - "5 | 2 | PyBites Code Challenges | 45 - TDD: Code FizzBuzz Writing Tests First! https://t.co/b0uDgdS2VB\n", - "7 | 0 | Love list comprehensions, so elegant https://t.co/cIv54ZliGp\n", - "5 | 2 | @PlanetaChatbot @FerroRodolfo Bot muy original y buen trabajo @FerroRodolfo, me alegro verlo publicado aqui tambien!\n", - "4 | 3 | Using #Pillow to Create Nice Banners For Your Site https://t.co/EZQsYvuIFZ #Python\n", - "3 | 4 | Few days left ... ⏎ Code Challenge 38 - Build Your Own #Hacktoberfest Checker With #Bottle https://t.co/6JurrT6qb7\n", - "5 | 2 | A beginner's guide to building a simple database-backed #Flask website on PythonAnywhere: part 2 https://t.co/FP6BuPEZow @techmoneykids\n", - "4 | 3 | 2 challenge review posts today: ⏎ 1. Code Challenge 36 - Create an #AWS Lambda Function ⏎ https://t.co/bqRt7iTJ4c ⏎ ⏎ -… https://t.co/bKw2xFrAYr\n", - "5 | 2 | Python Bytes: #45 A really small web API and OS-level machine learning https://t.co/iWV0UemuZL\n", - "6 | 1 | Free @PacktPub ebook of the day: #Python 3 Object-oriented Programming - Second Edition - https://t.co/t2aLcaSm56\n", - "5 | 2 | “btcpy released: a full featured #Bitcoin library” by @simonebronzini https://t.co/fRFpC5CHa8\n", - "7 | 0 | “The Hitchhiker’s Guide to Machine Learning in #Python” by @conordewey3 https://t.co/CLbqpzkqqQ\n", - "5 | 2 | #Python: Guidelines & Code Style by @LeCoupa https://t.co/yqRTDpfKJy - do your friends and colleagues a favor :)\n", - "5 | 2 | Code Challenge 32 - Test a Simple #Django App With #Selenium - Review -> https://t.co/Dzjj2qQL8X if you join(ed), P… https://t.co/DB5LWkFd1b\n", - "6 | 1 | Simple is Better Than Complex: How to Render #Django Form Manually https://t.co/DIwAkFLog4\n", - "5 | 2 | We started autotweeting any free #python #flask #django Packt ebook that comes out, what else to filter on? #pandas… https://t.co/CqMeQAm5Iz\n", - "5 | 2 | @techmoneykids nice #Flask #Heroku guide: https://t.co/uOs7VcKNie - helped me deploying our Pillow Banner Generator… https://t.co/gBMZKPVcS5\n", - "4 | 3 | Free @PacktPub ebook of the day: Learning Robotics Using #Python (time left: 16 hours)\n", - "3 | 4 | Our review of Code Challenge 30 \"The Art of #Refactoring\" is up: https://t.co/rPn0ThG0Gq - cc @realpython @sig_eu @bettercodehub #cleancode\n", - "3 | 4 | #python for secret agents ebook for free today -> https://t.co/t2aLcaALdy\n", - "5 | 2 | Codementor: Building An Image Crawler Using Python And Scrapy https://t.co/SqNqt0b13Z\n", - "3 | 4 | Our new Twitter digest 2017 - week 30 is up: https://t.co/ZCqZaZTHU3 #python #news #vim #machinelearning #bokeh and more ...\n", - "4 | 3 | Building Machine Learning Systems with #Python for free today - https://t.co/t2aLcaALdy\n", - "5 | 2 | Let's do some gui programming this week. Join our new #python code challenge number 26: https://t.co/HK1PVHPZqV\n", - "5 | 2 | #100DaysOfCode - Day 093: Refactored day 86's Tweet Achive Stats script into a Package https://t.co/iSV8fGS0lE #Python\n", - "5 | 2 | #100DaysOfCode - Day 085: #Python script to list out the current exchange rate https://t.co/JEvYCzyRTh #Python\n", - "5 | 2 | #100DaysOfCode - Day 074: Using Pillow to add text and opacity to an image = your own cards https://t.co/uWEo3nW9Cu #Python\n", - "4 | 3 | #100DaysOfCode - Day 072: Packt ebook download manager https://t.co/3SmBgHYPO3 #Python\n", - "4 | 3 | New PyBites Code Challenge 22 - #Packt Free Ebook Web Scraper https://t.co/j5KGazaGWJ - you get to sponsor the #Python community! @Pybonacci\n", - "4 | 3 | #100DaysOfCode - Day 039: #Python script to give you every valid dictionary match of a specified letter ... https://t.co/HXkd94ZAnM #Python\n", - "6 | 1 | #100DaysOfCode - Day 037: #Python script to pull down an #XML feed and save it https://t.co/N1PTn00yvj #Python\n", - "5 | 2 | #100DaysOfCode - Day 016: script to #ssh to specified IPs and check their hostnames https://t.co/mPTmZ4RVWH #Python\n", - "4 | 3 | #100DaysOfCode - Day 014: script to automatically tweet out new @lynda (#Python) titles https://t.co/i7yasDEUyv #Python\n", - "4 | 3 | #100DaysOfCode - Day 011: generic script to email the contents of a text file https://t.co/kV0socnMST #Python\n", - "7 | 0 | #100DaysOfCode - Day 002: script to print out valid IPs of a specified user specified network https://t.co/gPvRe6EseJ\n", - "5 | 2 | From beginner to pro: #Python books, videos and resources https://t.co/A99B0jIT82\n", - "4 | 3 | Send Advanced Emails with Python MIME Submodules https://t.co/qm33tgIVKV #python\n", - "3 | 4 | The ultimate list of #Python #Podcasts https://t.co/fqPkqS3zva - nice list\n", - "5 | 1 | Enjoy our new free Bite of Py: ⏎ ⏎ PyBites Code Challenges | Bite 30. Movie data analysis https://t.co/ljJSmfxgWZ\n", - "6 | 0 | Beautiful is better than ugly :) ⏎ ⏎ And Now is better than never! ⏎ ⏎ Happy 2018, get coding in #Python https://t.co/Kry4AqP2Wb\n", - "6 | 0 | from pybites import news: ⏎ ⏎ #Python Twitter Digest 2017 Week 46 https://t.co/WK2XieG5Xn\n", - "5 | 1 | Dataquest: Kaggle Fundamentals: The Titanic Competition https://t.co/0sEsbNbLq7\n", - "5 | 1 | Hiding BCC Recipients in Python MIME Emails https://t.co/ZIeM0ZOIzN - thanks @techmoneykids for this invaluable Python mailing trick\n", - "6 | 0 | PyGithub - a nice wrapper for the #github #api https://t.co/GmglE3C8Bl\n", - "4 | 2 | 10 Tips to Get More out of Your #python #Regexes https://t.co/h7LvrvW5mi\n", - "4 | 2 | Simple is Better Than Complex: A Complete Beginner's Guide to #Django - Part 7 https://t.co/yHkgHhGTSd\n", - "6 | 0 | Oh yeah! Getting serious about #django :) https://t.co/8wgkRtfHZF\n", - "5 | 1 | @jojociru Cool, will you PR it? Any feedback on our challenges welcome. Nice to see you combine them with #100DaysOfCode\n", - "5 | 1 | Just attended a talk: very cool. Can't wait to try this! https://t.co/Y14S1uyHIm\n", - "4 | 2 | Free @PacktPub ebook of the day: #Python Machine Learning Blueprints: Intuitive data projects you can relate to - https://t.co/t2aLcaALdy\n", - "5 | 1 | nice one @dbader_org - unix pipelines are awesome. We did a code challenge on this one some time ago: https://t.co/oDbnM6fINT\n", - "6 | 0 | Scriptflask was developed using #Flask which offered good interoperability with #Python, used across a wide range o… https://t.co/HM9cyzYBBz\n", - "6 | 0 | Generator Expressions in #Python: An Introduction https://t.co/tsVDOZp5jm\n", - "6 | 0 | Python + Django + CSS Bootstrap + Heroku deployment == joyful coding!\n", - "6 | 0 | DataCamp: New Course: Natural Language Processing Fundamentals in #Python https://t.co/dSpo2sBH88 #NLP\n", - "5 | 1 | Bruno Rocha: Simple Login Extension for #Flask https://t.co/sjI8JU9jY0\n", - "5 | 1 | PyBites reached 1K followers - thx all Pythonistas/devs/enthusiasts! ⏎ (wordcloud via @python_tip's recipe… https://t.co/2uROoa7tcl\n", - "5 | 1 | Codementor: #Python Practices for Efficient Code: Performance, Memory, and Usability https://t.co/0HbLmaKIC5\n", - "6 | 0 | When to use #Flask vs #Django? ⏎ ⏎ Julian shares what he learned so far looking at both frameworks ...… https://t.co/PcLxRaUoih\n", - "5 | 1 | You want to learn some #Pillow and #Flask? You can! Join @PyBites #CodeChallenge 31 - Image Manipulation With Pillow https://t.co/cGaIakkKmk\n", - "3 | 3 | Code Challenge 29 - Create a Simple #Django App - Review is up: https://t.co/0D2QoumJss #heroku #django-registration, learned quite a bit\n", - "5 | 1 | Tarek Ziade: #Python #Microservices Development https://t.co/YTwIZET7aJ #flask - @techmoneykids @mohhinder to add your list\n", - "3 | 3 | Data School: How to launch your data science career (with Python) https://t.co/WztZsMs1Tv\n", - "3 | 3 | New #Python article by @mohhinder: ⏎ ⏎ From Challenge to Project - How I Made PyTrack, Learning Modules and Packaging - https://t.co/VaQUU6kdIK\n", - "4 | 2 | Stay up2date with #Python and its ecosystem: checkout out our Twitter news digest. This week's edition # 26 is out: https://t.co/rz1zYunp4M\n", - "6 | 0 | #100DaysOfCode - Day 094: Simple Python script to #scp get a file from a remote host https://t.co/r63Eiuf1R9 #Python\n", - "4 | 2 | #100DaysOfCode - Day 091: Showing the broadcasting network for a show using TheTVDB API https://t.co/RjPQxBMTcO #Python\n", - "4 | 2 | #100DaysOfCode - Day 081: Using unittest mock patch to test Tweepy code without calling the API https://t.co/1cTwGxpvLz #Python\n", - "5 | 1 | #100DaysOfCode - Day 079: #Python script to capture exceptions when creating an #sqlite db https://t.co/afDF3IzqGa #Python\n", - "3 | 3 | How to make a game with pygame, nice https://t.co/TFCxcIY8Oa\n", - "5 | 1 | Might be useful: Using a virtualenv in an IPython notebook - https://t.co/Mr4NZ9Dle4\n", - "5 | 1 | #100DaysOfCode - Day 054: Script to create a person #class and calculate BMI https://t.co/Ee4zMEKGLh … #Python\n", - "3 | 3 | PyBites new Code Challenge 20 - Object Oriented Programming Fun https://t.co/MQURZAeTkv #challenge #Python\n", - "4 | 2 | #100DaysOfCode - Day 051: Use #Python #requests module on a page behind a login https://t.co/1klrgIXOnH #Python\n", - "4 | 2 | #100DaysOfCode - Day 050: Use folium to draw a map with cities I traveled to https://t.co/YAHxZKxlrY #Python\n", - "5 | 1 | #100DaysOfCode - Day 046: Get friends updates from Goodreads #API #books https://t.co/9Tu8DhFuNj #Python\n", - "4 | 2 | #100DaysOfCode - Day 045: #steam XML feed scraper for new #game releases https://t.co/w5eA64oDNM #Python\n", - "4 | 2 | #100DaysOfCode - Day 044: Random name generator, reading in a bunch of names from a CSV file https://t.co/cHzZdOHBAr #Python\n", - "4 | 2 | #100DaysOfCode - Day 041: Script to check all possible combinations of letters and match against a dicti... https://t.co/56sMpJjWf6 #Python\n", - "5 | 1 | Wrote a quick article for #Python beginners (and me!) on how to pull down an #XML file using the requests module. https://t.co/avuGJOLQ7R\n", - "2 | 4 | Code Challenge 16 - Query Your Favorite #API - Review https://t.co/Aq70VdWK9N - great submissions @mohhinder #Flask #Quotes #books #warcraft\n", - "5 | 1 | #100DaysOfCode - Day 029: Traffic Lights script to demo #itertools cycle https://t.co/AoNwbklIg5 #Python\n", - "4 | 2 | New PyBites article: ⏎ ⏎ How to Write a Simple #Slack Bot to Monitor Your Brand on #Twitter ⏎ ⏎ https://t.co/WU1S4t3Cqa ⏎ ⏎ #Python #tools\n", - "2 | 4 | You want to learn some #Flask? Maybe now is a good time ... ⏎ ⏎ Code Challenge 15 - Create a Simple Flask App ⏎ ⏎ https://t.co/QhBX9ba90o\n", - "3 | 3 | #100DaysOfCode - Day 018: using #pytest to write tests for @safari RSS scraper (day 017) https://t.co/RWIEw7Pl2t #Python\n", - "4 | 2 | New on PyBites: the absolute #Flask basics we'd liked to have had: https://t.co/XOGcxlnq0w\n", - "2 | 4 | Best Practices for Compatible #Python 2 and 3 Code https://t.co/GDORtGOmQP\n", - "5 | 1 | CPython internals: A ten-hour codewalk through the #Python interpreter source code https://t.co/VY1vJMs2I4\n", - "4 | 2 | And a screenshot for good measure! Onward to 200k! https://t.co/q8vB0Y7bVn\n", - "3 | 3 | Nice new article by @dbader_org - Context Managers and the “with” Statement in #Python https://t.co/q2b21rAFXa (including exercises)\n", - "6 | 0 | @dbader_org great article, nice related history lesson: https://t.co/82bJPsnphM\n", - "4 | 2 | One of my favorite programming quotes #cleancode https://t.co/qzDrzKgdq5\n", - "4 | 1 | Next Pythonista to join will be user #1300 and gets 2 ⏎ extra Bites for free @ https://t.co/IZeNwwOWMk ⏎ ⏎ Keep calm and code in #Python\n", - "5 | 0 | A nice little #python Bite of Py to start your week: “Bite 39. Calculate the total duration of a course” -… https://t.co/hfNHhJdPh7\n", - "4 | 1 | New @lynda course: Learning #Python - https://t.co/QV7dnuVniR\n", - "5 | 0 | Free @PacktPub ebook of the day: Learning #Python Application Development - https://t.co/t2aLcaSm56\n", - "4 | 1 | Keynote - Jacob Kaplan-Moss - Pycon 2015 https://t.co/kfdx4rRvQt - great talk, thanks for sharing @treyhunner\n", - "4 | 1 | Free @PacktPub ebook of the day: Bayesian Analysis with #Python - https://t.co/t2aLcaSm56\n", - "3 | 2 | New PyBites Code Challenges | 48 - Create a #Python #News Digest Tool: https://t.co/MWW6TjiuIU - have fun!\n", - "3 | 2 | #Python Bite of the day: ⏎ Find the most common word in Harry Potter - have fun! ⏎ https://t.co/GNmyv6UDFy ⏎ #BitesOfPy #CodeChallenges #promo\n", - "3 | 2 | “Myths and mistakes of PyCon proposals” by @irinatruong https://t.co/L69H3Q7VcY\n", - "4 | 1 | 5 cool things you can do with #python #itertools https://t.co/QpmyZFri6d\n", - "3 | 2 | @FerroRodolfo recently joined our Code Challenges and built Disaster Attention Bot, a #Telegram #chatbot that helps… https://t.co/cmIRqdtDIF\n", - "5 | 0 | @pythonbytes @brianokken sure @_juliansequeira (Flask addict) wants to hear this asap :)\n", - "2 | 3 | Not sure what's best? ⏎ I keep my virtual environment directories\n", - "4 | 1 | Twitter Digest 2017 Week 41 https://t.co/ekRDhWLvTQ\n", - "2 | 3 | Python Data: Text Analytics with Python – A book review https://t.co/D9pjf6k1um\n", - "3 | 2 | Daniel Bader: Iterator Chains as Pythonic Data Processing Pipelines https://t.co/pZLhjw70w7\n", - "5 | 0 | cc @techmoneykids - I think you will enjoy this book https://t.co/7HYU8hknOJ\n", - "5 | 0 | PyBites Newsletter - #Code Challenges, #Django, Code Quality, Resources https://t.co/DVo9B2BQdq\n", - "4 | 1 | Free @PacktPub ebook of the day: #Python Machine Learning - https://t.co/t2aLcaSm56\n", - "5 | 0 | very useful! #python #debugging https://t.co/P7o863moT6\n", - "3 | 2 | Free #TensorFlow ebook today https://t.co/PA8hO5WMC1\n", - "4 | 1 | Building a Bullet Graph in #Python - https://t.co/hJebuqkGmO via @chris1610 - \"the old world of Excel pie charts is not going to cut it ...\"\n", - "5 | 0 | Forecasting Time Series data with #Python #Prophet (Notebook) https://t.co/1TqLdYpKAn - @techmoneykids remember our PYPI 100k challenge?\n", - "4 | 1 | Great article on #writing: ⏎ - respect the reader ⏎ - simple > complicated ⏎ - importance lead paragraph ⏎ - read post alou… https://t.co/kGnL0olofv\n", - "2 | 3 | PyBites New #Python Code Challenge is up: #33 - Build a - #Django Tracker, Weather or Review App -… https://t.co/6FNHg8Sv03\n", - "4 | 1 | @python_tip Cool. See also https://t.co/3Ei8SqPo1S for comparison using sorted\n", - "2 | 3 | Nice: “A Closer Look At How Python f-strings Work” by @skabbass1 https://t.co/1BZxsMJmph - not only more elegant also faster! Here's why\n", - "3 | 2 | PyBites Code Challenge 31 - Image Manipulation With #Pillow - Review is up: https://t.co/coZK3EREOV - nice submission @mohhinder #Python\n", - "4 | 1 | Bookmarking: A Minimal Django Application https://t.co/tkgf7nRAMA via @vitorfs - awesome Django tutorials, thanks\n", - "4 | 1 | The Digital Cat: Refactoring with tests in Python: a practical example https://t.co/ImejByWnHZ\n", - "4 | 1 | Talk Python to Me: #121 Microservices in Python https://t.co/416f4cs1bU\n", - "5 | 0 | Mike Driscoll: Python: All About Decorators https://t.co/KVwrmoDRkX\n", - "3 | 2 | PyBites Code Challenge 26 - Create a Simple Python GUI - Review is up: https://t.co/JMPeT0mEDX #python #GUI #tkinter #easygui #matplotlib\n", - "5 | 0 | New @lynda course: #Python Parallel Programming Solutions - https://t.co/YmqrYSemMi\n", - "5 | 0 | @lynda @techmoneykids funny how this was completely auto-tweeted by a script we wrote for our #100DaysOfCode challenge :)\n", - "2 | 3 | Challenge #25 - Notification Service of Upcoming Movies Review is up: https://t.co/klWFvY2qaZ - standby for our new challenge tomorrow ...\n", - "5 | 0 | #100DaysOfCode - Day 095: Class to cache moviedb API responses #shelve #decorator #namedtuple https://t.co/u6yQt9ttFs #Python\n", - "4 | 1 | @pybites max Twitter mentions: @talkpython @dbader_org @python_tip @mohhinder - https://t.co/DwDw35U0rz - good weekend! cc @techmoneykids\n", - "3 | 2 | Instagram Makes a Smooth Move to Python3 https://t.co/a5BEEUA8DC \"Performance speed is no longer the primary worry. Time to market speed is\"\n", - "2 | 3 | New #python code challenge: https://t.co/R0zVIrIm7l - this week we challenge you to build a simple API to track challenge stats - have fun!\n", - "4 | 1 | @python_tip cool! it even supports unary + ⏎ ⏎ >>> c = collections.Counter([1, 2, 2]) ⏎ >>> c[1] -= 3 ⏎ >>> c ⏎ Counter({2:… https://t.co/dykmTILBKA\n", - "4 | 1 | #100DaysOfCode - Day 075: #Python script to take screenshots using #pyscreeze @AlSweigart https://t.co/jURbnimd6Y #Python\n", - "5 | 0 | #100DaysOfCode - Day 070: How to parse html tables with #pandas (#jupyter notebook) https://t.co/ScxtNzq303 #Python\n", - "4 | 1 | #100DaysOfCode - Day 069: #Python CLI based #Pomodoro Timer with #webbrowser alarm https://t.co/3N4ZwK9LrL #Python\n", - "4 | 1 | New #PyBites Article: OOP Beyond the Basics: Using Properties for Encapsulation, Computation and Refactoring - https://t.co/VfFHqtQYQm\n", - "2 | 3 | #100DaysOfCode - Day 043: Script to read in a list and reverse its contents https://t.co/FdytckaNgw #Python\n", - "3 | 2 | #100DaysOfCode - Day 042: Using #Python icalendar module to parse FB birthdays cal (ics file) https://t.co/mBfWyYjAeV #Python\n", - "2 | 3 | #100DaysOfCode - Day 033: I need to drink more water at work so I wrote a #Python #script to remind (spa... https://t.co/OuuZeORbNy #Python\n", - "3 | 2 | A thorough guide to #SQLite database operations in Python - https://t.co/OEGdMemdOQ\n", - "2 | 3 | Minimal examples of data structures and algorithms in #Python - https://t.co/7DstzyEOUF\n", - "4 | 1 | #100DaysOfCode - Day 020: monitor #Twitter and post to #slack each time our domain gets mentioned https://t.co/AQpYOxDxi1 #Python\n", - "3 | 2 | @python_tip Very cool, but note it's >= 3.5, for earlier version you probably want itertools.chain, nice article: https://t.co/laftUQNw2J\n", - "4 | 1 | #100DaysOfCode - Day 012: using OpenWeatherMap #API to compare weather in Australia vs Spain https://t.co/h0gxy7K2C0 #Python\n", - "4 | 1 | #100DaysOfCode - Day 010: script to spot cheap @transavia flights using their #API https://t.co/THZQRdsbCm #Python\n", - "3 | 2 | #100DaysOfCode - Day 004: script that converts a text list to a text string https://t.co/kdRkwGe27h #Python\n", - "2 | 3 | A new week, a new 'bite' of py: ⏎ This week we will build Hangman #game. ⏎ Have fun! ⏎ ⏎ Join us and learn more #python ⏎ ⏎ https://t.co/QOMEWZhyPs\n", - "3 | 2 | Showing the Difflib #Python stdlib module some love today by comparing lists! Read it then enjoy a beer! https://t.co/FBZQvywkLy\n", - "2 | 3 | Code Challenge 06 - When does PyPI reach 100K packages? https://t.co/bY5Hmv6XOm #python\n", - "4 | 1 | Build Your First Python and Django Application https://t.co/3N8FgBn6mZ\n", - "3 | 2 | Python Tricks #5: String Conversion in Python (__str__ vs __repr__) https://t.co/1XoX1Hh75R - well explained!\n", - "2 | 3 | Pybit.es — our new #Python blog - https://t.co/jM6ZsdyKPR\n", - "3 | 2 | List of Awesome Python Resources https://t.co/7i4ODGGwkb #python\n", - "4 | 1 | Challenge: Course Total Time Web Scraper https://t.co/RTwa15021s #python\n", - "3 | 1 | from pybites import News ⏎ ⏎ Twitter Digest 2018 Week 04 https://t.co/DreQRPE2fU ⏎ ⏎ #python #news #regex #blockchain… https://t.co/AC1XwlOEmD\n", - "3 | 1 | Using Pandas and Seaborn to solve PyBites Marvel Challenge https://t.co/bKJhIbneVm\n", - "4 | 0 | This is awesome! Thanks @anthonypjshaw ⏎ ⏎ Run this in your terminal: ⏎ ⏎ python <(curl -s https://t.co/Rix6bn0JWB)\n", - "4 | 0 | Thanks guys for covering our new platform, much appreciated :) https://t.co/n6wWLddRw1\n", - "2 | 2 | Back in the PHP days I liked print_r, for #python we can use this to see all properties and values of an object: ⏎ ⏎ f… https://t.co/oN4qRS6atJ\n", - "3 | 1 | Our new Twitter #Python #News digest is out: ⏎ https://t.co/wptQwm5XH4 https://t.co/eNDH3Cw3DX\n", - "3 | 1 | Nice: 3 pull requests already on #regex Challenge 42 https://t.co/nJlsDPQ34l - always be coding! #python\n", - "4 | 0 | Thanks @digitalocean for #Hacktoberfest, our corresponding #python challenge got some nice PRs submitted: https://t.co/ewEOxVgYCv\n", - "3 | 1 | Cool: VCR.py simplifies and speeds up tests that make HTTP requests. - https://t.co/BNk8jpHURt #testing cc @brianokken\n", - "2 | 2 | 5 min guide to PEP8 https://t.co/sYP5YjtcvO - bears rereading from time to time. Set up pre-save flake checks in your editor, so useful!\n", - "2 | 2 | Here our weekly Twitter Digest 2017 Week 42 https://t.co/iCYtVPVfE6 #python #news\n", - "3 | 1 | PyBites Twitter Digest 2017 Week 39 https://t.co/iQH1lSJaNf - #python #news\n", - "2 | 2 | On the reading list and recommended #ML book - @safari users take notice! https://t.co/TDhQ5c9DCS\n", - "3 | 1 | Ned Batchelder: Beginners and experts https://t.co/WMxkk9TS0E \"The good news for beginners is: this isn't about you. Software is difficult.\"\n", - "3 | 1 | \"You don't need to be expert\" ... this realization also helps when stuck on an article. Great thread! https://t.co/FHVt4iy7Qv\n", - "3 | 1 | @fredosantana227 awesome, #100DaysOfCode it really works. it was tough at times but we finished it writing 5K loc.… https://t.co/9xTci0jbVa\n", - "3 | 1 | PyBites of the Week - Challenge 32 Review, #Flask, #Django, #Pillow, #Selenium, #Requests, #Apps! - https://t.co/nvetyLktoR\n", - "3 | 1 | NumFOCUS: How to Compare Photos of the Solar #Eclipse using #Python and SunPy https://t.co/bSpJ3M3V5F\n", - "4 | 0 | @python_tip nice, hope you got some more tips, we shared the tip submit link in our last newsletter. we need to submit some ourselves too :)\n", - "2 | 2 | Our new Code Challenge 32 is up: Test a Simple #Django App With #Selenium https://t.co/mz7mJteNca https://t.co/2lAU9pmYpL\n", - "3 | 1 | Django Tips #21 Using The Redirects App https://t.co/71WIjL72Bk via @vitorfs\n", - "2 | 2 | New PyBites article: Using #Pillow to Create Nice Banners For Your Site - https://t.co/b2E65Q7ygp #Python https://t.co/HofmDbrLk0\n", - "3 | 1 | What will you be working on this weekend? Gonna play a bit with Django REST Framework :)\n", - "3 | 1 | Codementor: A Dive Into Python Closures and Decorators - Part 2 https://t.co/XCXDa2raPD\n", - "3 | 1 | Mastering #Python for #finance #ebook today for FREE, thanks to @PacktPub - https://t.co/t2aLcaALdy\n", - "3 | 1 | https://t.co/cUDz09VRcU python microservices on safaribooks :)\n", - "3 | 1 | Useful: #Django Best Practice: Settings file for multiple environments by @ayarshabeer https://t.co/Fi3xlDSZlW\n", - "3 | 1 | Code Challenge 27 - PRAW: The Python Reddit API Wrapper - Review is up: https://t.co/HfPXpOZ6Jt - some nice submissions, thx @bboe for Praw\n", - "3 | 1 | Our first #Django app! ⏎ ⏎ And new PyBites Article: ⏎ ⏎ First Steps Learning Django: PyPlanet Article Sharer App ⏎ ⏎ https://t.co/8uDoCgR9Xb\n", - "2 | 2 | New @lynda course: Introduction to #Python Recommendation Systems for Machine Learning - https://t.co/k67VSuMTh5\n", - "3 | 1 | @techmoneykids + our community: ⏎ ⏎ Happy 200 days of @pybites !! ⏎ ⏎ I knew, but was reminded by our newpost script :)… https://t.co/4REtqyDtwg\n", - "4 | 0 | #100DaysOfCode - Day 098: Script to use the #Instagram #API to authenticate and pull your media https://t.co/2eUDW8JyNG #Python\n", - "3 | 1 | @tacolimCass Maybe you want to take one of our code challenges? https://t.co/B9rjJoBWH5\n", - "2 | 2 | #100DaysOfCode - Day 080: \"Is this Bob or Julian?\" - script to reveal who of @pybites tweets https://t.co/BGo97eXUAG #Python\n", - "2 | 2 | Records, Structs, and Data Transfer Objects in Python ⏎ ⏎ Nice overview! ⏎ ⏎ https://t.co/N9zdAsJBrw\n", - "3 | 1 | https://t.co/5OTk6XaXhk #python decorators unwrapped @wonderfulboyx_e\n", - "3 | 1 | #100DaysOfCode - Day 068: @mohhinder translated our 'from PyBites import newsletter' into code https://t.co/6ynnsBlS6e #Python\n", - "2 | 2 | Wow @mohhinder this is so cool, thanks (missed this tweet somehow). @techmoneykids need to mention this in next new… https://t.co/qol7UevnPa\n", - "3 | 1 | Good questions, what's your #Python story? Hearing many cool stories here at #PyCon2017 https://t.co/6C6zBoN2wA\n", - "3 | 1 | Awesome talk https://t.co/TVeRsHpGv5\n", - "4 | 0 | Good vibes at #PyCon2017 https://t.co/W91qvRM1Xz\n", - "3 | 1 | #100DaysOfCode - Day 049: Email contents of an #sqlite db https://t.co/cBIedbdbwp #Python\n", - "3 | 1 | #100DaysOfCode - Day 048: Use the Faker module to get (random) fake Dutch names https://t.co/ZZTT1C0fg5 #Python\n", - "3 | 1 | #100DaysOfCode - Day 047: Customisable script for pulling down XML feeds with a cron job https://t.co/8sMXlib2te #Python\n", - "3 | 1 | #100DaysOfCode - Day 040: PyBites podcast challenge 17 in less than 100 LOC using #scheduler and #shelve https://t.co/iQkcR0dPW9 #Python\n", - "2 | 2 | Nice article on Object-relational mappers (ORMs) - https://t.co/gVqojN4qlF\n", - "3 | 1 | #100DaysOfCode - Day 027: rough script to query the #warcraft #API for a character's mounts https://t.co/sMvmlbV8F0 #Python\n", - "3 | 1 | #100DaysOfCode - Day 024: generate color hex codes from random RGBs and color terminal text https://t.co/PtTTDbthGA #Python\n", - "2 | 2 | #100DaysOfCode - Day 019: paste in a list of numbers from the clipboard, sort to ascending then copy bac... https://t.co/yg6BsAdU5X #Python\n", - "2 | 2 | #100DaysOfCode - Day 015: script to calculate the number of posts on @pybites https://t.co/Nvqp0rMuGk #Python\n", - "4 | 0 | Interesting @techmoneykids https://t.co/8eLpqZdRRs\n", - "2 | 2 | New @lynda course: #Python for Data Science Essential Training - https://t.co/AWFvjxaZwv\n", - "3 | 1 | amazing how many python books and videos get released these days\n", - "2 | 2 | #100DaysOfCode - Day 009: interactive script to create a new Pelican blog article https://t.co/Tg7sjYHz8j #Python\n", - "2 | 2 | New PyBites Article: How to Build a Simple #Slack Bot - https://t.co/aycTca3jEZ #python\n", - "2 | 2 | from @pybites import newsletter - https://t.co/3dFZAdKx3f - #Python #Articles #Challenges #News\n", - "2 | 2 | [Article]: Generators are Awesome, Learning by Example https://t.co/ijy6BZK3n6 - enjoy and let us know if you found other cool uses #python\n", - "2 | 2 | Python's data model by example https://t.co/TamQncQvuc - I really like #python magic methods, very powerful (might need to do a part II)\n", - "2 | 2 | Nice tutorial, thanks https://t.co/Z36BKO6LRE\n", - "2 | 2 | Code Challenge 07 - Twitter data analysis Part 3: sentiment analysis https://t.co/Ues7UOlMBN #python\n", - "3 | 1 | nice one, had not used print like this before https://t.co/b3mbLZT7DY\n", - "2 | 2 | Color quantization using k-means #Data Mining #Python\n", - "2 | 2 | Cool: Ex Machina features #python https://t.co/wTns5sgrCn - even more eager to watch it now :)\n", - "2 | 1 | Free @PacktPub ebook of the day: Learning OpenCV 3 Computer Vision with #Python - Second Edition - https://t.co/t2aLcaSm56\n", - "3 | 0 | Doug Hellmann: pyclbr — Class Browser — PyMOTW 3 https://t.co/3WukItBmAn\n", - "2 | 1 | PyBites Code Challenges | Bite 4. Top 10 PyBites tags https://t.co/Wm9zD4Hy5r\n", - "2 | 1 | Love this tool https://t.co/jc9El6BQQH\n", - "3 | 0 | @pythonbytes @brianokken Thanks guys for featuring our guest article on @RealPython\n", - "3 | 0 | @FerroRodolfo Good point, we're not at 5 yet. Yes, let's buy it for the best submission regardless. Surprise us! :)… https://t.co/griKvcRbtd\n", - "3 | 0 | You want a quick way of persisting data without a full blown database? Why not Shelve It? https://t.co/SnxiX9BC6m\n", - "2 | 1 | Free @PacktPub ebook of the day: #Python Projects for Kids - https://t.co/t2aLcaSm56\n", - "2 | 1 | Our new weekly Twitter Digest is up: ⏎ ⏎ https://t.co/wCalciSSdl ⏎ ⏎ #python #regex #hacktoberfest #twilio #flask… https://t.co/8NW2gBrMry\n", - "2 | 1 | #python #codechallenges #poll ⏎ ⏎ I'd like to see more PyBites code challenges on:\n", - "3 | 0 | “Using UUIDs as primary keys” by Julien Dedek https://t.co/58mp8wxyO1\n", - "3 | 0 | What can we write about that helps you improve your Python? What are you struggling with? (Decorators already at the top of our list)\n", - "2 | 1 | Free @PacktPub ebook of the day: Building RESTful #Python Web Services - https://t.co/t2aLcaSm56\n", - "2 | 1 | Celebrate #opensource this October with #Hacktoberfest https://t.co/zlULiGez2m - a good opportunity to PR some of our #Python challenges ...\n", - "2 | 1 | Getting serious: bought a copy of Two Scoops of #Django 1.11: Best Practices for the Django Web Framework https://t.co/6yoN8rnhLA\n", - "1 | 2 | Enjoyed @astrojuanlu's keynote (Spanish) about the importance of open source and our community! Thanks streaming… https://t.co/JAUB2P9rnn\n", - "1 | 2 | PyBites #python Twitter Digest 2017 Week 38 is out: https://t.co/xq6jOhcsKV\n", - "2 | 1 | Daniel Bader: Contributing to #Python Open-Source Projects https://t.co/u60A0qgqI2\n", - "3 | 0 | Thanks @sivers, your learn JS post inspired us to craft our own for Python and your \"hell yeah!\" helped us focus on PyBites\n", - "2 | 1 | Weekly #Python Chat: #Generators! https://t.co/3R8G5ZV8XJ\n", - "3 | 0 | “Python Gem #9: itertools.chain” by Adam Short https://t.co/JisPG9aSaT\n", - "2 | 1 | “A Brief Analysis of ‘The #Zen of #Python’” by Jonathan Michael Hammond https://t.co/rp3iHkXQFY\n", - "2 | 1 | Python Insider: #Python 3.6.2 is now available https://t.co/Z2MpMfbc0V\n", - "3 | 0 | Daniel Bader: Extending #Python With C Libraries and the “ctypes” Module https://t.co/zQ8hrVfpwK\n", - "2 | 1 | #Django News This Week https://t.co/8WrIg4fe5O - thanks @originalankur\n", - "1 | 2 | PyBites #Python Twitter News Digest 2017 week 35 is out - https://t.co/qLcQpl9kc8 https://t.co/jCoDCoPsXR\n", - "3 | 0 | “Modern #Django — Part 2: REST APIs, Apps, and Django REST Framework” by @d_j_stein https://t.co/HaB9dNZb3f\n", - "3 | 0 | Possbility and Probability: Debugging #Flask, requests, curl, and form data https://t.co/IwMcsiPhTz\n", - "1 | 2 | Challenge #33 - Build a #Django Tracker/Weather/Review App - Review: https://t.co/sKIZDJCbs9 -> built anything cool with Django this week?\n", - "3 | 0 | #Django Weekly 53 - Celery Workflow, Transaction Hooks, Django Rest API https://t.co/MzVR4G3JDx\n", - "3 | 0 | @dbader_org absolute joy for programmers, maybe we have become spoiled though ;)\n", - "3 | 0 | Nice: PyCharm: Develop #Django Under the Debugger https://t.co/CHWxnwGwi1 - hm ... maybe need to give PyCharm a serious try :) #debugging\n", - "3 | 0 | Awesome: How to Add Social Login to #Django https://t.co/TSMgNRYEO0 via @vitorfs - useful for this week's challenge https://t.co/MtUaZeHc8k\n", - "2 | 1 | #Python Bytes: #39 The new PyPI https://t.co/kISzvV52bh\n", - "2 | 1 | Another great episode of @pythonbytes full of cool #python stuff to explore https://t.co/rTiDGov5vO\n", - "1 | 2 | New @lynda course: #Python for Data Science Tips, Tricks, &amp; Techniques - https://t.co/EQfKR8BKFk\n", - "3 | 0 | Interesting read: From List Comprehensions to Generator Expressions - https://t.co/vLbEdvONYf\n", - "2 | 1 | Speed up your Python data processing scripts with Process Pools https://t.co/ErCvNTASrg\n", - "3 | 0 | Doug Hellmann: sqlite3 — Embedded Relational Database — PyMOTW 3 https://t.co/R1YUSMvxsB\n", - "1 | 2 | codeboje: Review: #Python Hunting Book https://t.co/1ayW8HTK4O../../review-python-hunting-book/ #pygame\n", - "2 | 1 | Python Bytes: #36 Craft Your Python Like Poetry and Other Musings https://t.co/HNygHuzfvy\n", - "2 | 1 | New PyBites Article: Module of the Week - Pexpect https://t.co/49Leqe8c0P\n", - "2 | 1 | Our new Code Challenge 29 is up: Create a Simple #Django App https://t.co/IlPSdmY956 - have fun\n", - "2 | 1 | New PyBites Article: Deploying a Django App to PythonAnywhere https://t.co/DIPAKIXNLU\n", - "2 | 1 | Python Bytes: #35 How developers change programming languages over time https://t.co/02n3QZPWdt\n", - "2 | 1 | Django docs are great!\n", - "2 | 1 | This week's PyBites Twitter News Digest is out: https://t.co/icBV1ReBvh #Python\n", - "3 | 0 | @benjaminspak Lol don't think so :) ⏎ ⏎ Gonna focus on one big project next 100 days == Django ⏎ ⏎ We did see 100 days wo… https://t.co/i7IWmySN67\n", - "2 | 1 | 10 Tips to Get More out of Your Regexes: ⏎ https://t.co/k3fd8aEh8d ⏎ ⏎ Updated with @AlSweigart nice PyCon intro talk. ⏎ ⏎ #Python #regex\n", - "3 | 0 | @dale42 @rarity2305 @tacolimCass @petermuniz @masharicodes @elliot_zoerner Thanks, 9 days left! :)\n", - "2 | 1 | New PyBites article: Module of the Week - Pendulum - https://t.co/rh7DQvyffK\n", - "3 | 0 | Today's free @PacktPub ebook: Modular Programming with #Python - get it here: https://t.co/t2aLcaALdy\n", - "2 | 1 | Mike Driscoll: Book Review: Software Architecture with Python https://t.co/s8wJk7P2ms - ok sold, my next #Python read\n", - "2 | 1 | PyBites #Python News Digest Week 24 is up - https://t.co/p8il7lCTbv #faker #flask #instagram #twilio #nasa #data #PyCon2017\n", - "3 | 0 | Articles week #24: ⏎ ⏎ 1. How to Write a Python Subclass ⏎ 2. Parsing Twitter Geo Data and Mocking API Calls by Example ⏎ ⏎ https://t.co/RgF1Za8Se3\n", - "3 | 0 | Go Portland! @mkennedy @brianokken - read you are even aiming for 100% wow https://t.co/vesDGLYINE\n", - "2 | 1 | @techmoneykids @anthonypjshaw @bbelderbos @dbader_org $ python whotweeted.py https://t.co/bmKyW0TYMH ⏎ Bob tweeted it… https://t.co/Elzii2wlrY\n", - "3 | 0 | @techmoneykids @anthonypjshaw @bbelderbos @dbader_org I thought we could do better than that :) ⏎ ⏎ (it started small… https://t.co/VCPJpjvCwQ\n", - "2 | 1 | #100DaysOfCode - Day 076: Script to scrape Packt free ebook site and send html notification mail https://t.co/Bol7mcSc9I #Python\n", - "3 | 0 | from @PyBites import newsletter - https://t.co/0ARvFHun7o - #Python #Articles #Challenges #News\n", - "3 | 0 | #100DaysOfCode - Day 073: #Python script to download a file using #FTP https://t.co/dF8dd0o89g #Python\n", - "3 | 0 | #100DaysOfCode - Day 071: How to calculate the # of days between two dates #Python #datetime https://t.co/J78b38HFPd #Python\n", - "3 | 0 | PyBites #python #news tweet digest, so much good stuff happening in our community! https://t.co/IvSfe5S9X2\n", - "2 | 1 | New PyBites article: #flask sessions - https://t.co/pwdz9T8aEs\n", - "3 | 0 | Cool: #movie recommendation system based on the GroupLens dataset of MovieLens data - https://t.co/7jiiorRSW1\n", - "2 | 1 | Our weekly #Python Twitter digest 2017 - week 21 https://t.co/DJgig7YAWo\n", - "2 | 1 | Had fun with #python OOP and dunder aka special methods, some (lshift / rshift) I had not used before - https://t.co/2pAvG0WqZc\n", - "3 | 0 | #100DaysOfCode - Day 055: Parse/store #PyCon2017 talks meta data in DB - #BeautifulSoup #sqlite https://t.co/co0y5MXts7 #Python\n", - "3 | 0 | Well that was it, goodbye #PyCon2017 - what an awesome conference + community, so happy I could attend. Thanks all that made it possible!\n", - "3 | 0 | pgcli - a REPL for Postgres https://t.co/8ddSupFmi3\n", - "3 | 0 | Thanks @pythonbytes for the mention: https://t.co/uZLLF8nqE6 #flask #sqlalchemy\n", - "3 | 0 | Awesome finally meeting @dbader_org at PyCon :)\n", - "2 | 1 | Code Challenge 19 - Post to Your Favorite API https://t.co/oZnXM16Ncm\n", - "2 | 1 | Code Challenge 18 - Get Recommendations - Review https://t.co/pA27kC62dF\n", - "2 | 1 | New PyBites article: ⏎ Building a Simple Birthday App with #Flask #SQLAlchemy (importing #Facebook bday calendar) ⏎ ⏎ https://t.co/mbydDRIlMv\n", - "1 | 2 | New PyBites Article: Learning Python by Building a Wisdom Quotes App https://t.co/A3AWHiOOmb #Flask #API #Python\n", - "2 | 1 | Inspirational guest post from @mohhinder: The making of my Task Manager App - https://t.co/QvZGu1C921 - thx Martin #Flask #codechallenges\n", - "3 | 0 | @bbelderbos @techmoneykids Plus! Who wants to hear their alarm every hour ;) Python is way more humane!\n", - "1 | 2 | New PyBites Twitter digest is up: 2017 week 17 https://t.co/WhMOs4848f\n", - "2 | 1 | Learn #Python by Coding for Yourself https://t.co/zP1DTxDiTX - round of applause for our Julian @techmoneykids - great progress man!\n", - "3 | 0 | Totally stoked people PR their code for our weekly #Python code challenges - https://t.co/nugm84MhkB (cc @techmoneykids )\n", - "2 | 1 | #100DaysOfCode - Day 022: create and paste #Amazon affiliation link to clipboard #pyperclip @AlSweigart https://t.co/4Wy244OgRW #Python\n", - "1 | 2 | Code Challenge 14 - Write DRY Code With #Python #Decorators - Review is up - https://t.co/tN2S6L7E4L - we hope you learned as much as we did\n", - "2 | 1 | @stephanieaslan @twilio @SeekTom Very inspiring, thanks, can't wait to use @twilio to automate a future event :)\n", - "2 | 1 | Comparing Lists with Difflib https://t.co/cxGvrZ3rqF - nice #python module I used again this week\n", - "3 | 0 | Started watching Modern #Python LiveLessons by @raymondh, just released on @safari, awesome, learning a lot! Thanks https://t.co/5WoHQJnwkU\n", - "2 | 1 | New PyBites Article: Flask for Loops - Printing Dict Data https://t.co/DZy2zDNyOu - starting #flask and #jinja templates\n", - "2 | 1 | New PyBites Article: How we Automated our #100DaysOfCode Daily Tweet https://t.co/jro1giMpyK #python\n", - "2 | 1 | #100DaysOfCode - Day 003: script to generate a gif from various png/jpg images https://t.co/9D5ZORJ6qL #Python\n", - "1 | 2 | New on #lynda: Migrating from Python 2.7 to Python 3 - https://t.co/Td41gXvhFm\n", - "2 | 1 | Jeff Knupp: Improve Your Python: Python Classes and Object Oriented Programming https://t.co/SwABT9Q3jo\n", - "1 | 2 | PyBites – 5 #Vim Tricks to Speed up Your #Python Development https://t.co/CpndCvMKKj\n", - "2 | 1 | #Python Logging Tutorial https://t.co/lc8gejSiWd - good reminder, setting up logging might save you hours of debugging later\n", - "2 | 1 | Check out this week's @PyBites Newsletter! We learned a LOT of #python with our #code challenge. Join us at - https://t.co/chzxl0RLrd\n", - "3 | 0 | Interesting example / stack (cc @mschilling swagger) https://t.co/dwD6n48mlx\n", - "2 | 1 | Tips to Become a Better #Python Developer cheat sheet. Get your own @pybites https://t.co/G8zezP8BI2\n", - "2 | 1 | New on PyBites: Don't let mutability of compound objects fool you! ⏎ - https://t.co/l5tFd5bbr9 #python\n", - "2 | 1 | Nice article, saved for future reference: ⏎ ⏎ A Simple Guide for Python Packaging” by @flyfengjie https://t.co/iRHEuIGwnS\n", - "2 | 1 | New article on PyBites: How To Build a Simple #API with #Flask and Unit Test it - https://t.co/yLMoNf74r7 #python\n", - "2 | 1 | Sublime Text Settings for Writing Clean Python https://t.co/GUgXHAL8Pk #python\n", - "2 | 1 | Code Challenge 06 - When does PyPI reach 100K packages? https://t.co/bY5Hmv6XOm #python\n", - "2 | 1 | #9 Walking with async coroutines, diving deep into requests, and a universe of options (for AIs) https://t.co/fW9nzSSKHF #python\n", - "2 | 1 | #PyBites #python Code Challenge 02 - Word Values Part II - a simple game: https://t.co/BzKQg8t1ad - have fun!\n", - "2 | 1 | How to Write Regularly for Your Programming Blog https://t.co/fbUCU1do5v #python\n", - "2 | 1 | 5 min guide to PEP8 https://t.co/8LoAzqBqvT #python\n", - "2 | 1 | Book that makes algorithms accessible https://t.co/2tkf4ZWiJA #python\n", - "2 | 0 | from pybites import News ⏎ ⏎ Twitter Digest 2018 Week 06 https://t.co/troWcWY4ES ⏎ ⏎ #python\n", - "2 | 0 | @python_tip Congrats, a lot of great tips so far\n", - "2 | 0 | Free @PacktPub ebook of the day: Modern #Python Cookbook - https://t.co/t2aLcaSm56\n", - "2 | 0 | @diek007 @RealPython Thanks this was a fun project indeed\n", - "2 | 0 | @RobHimself1982 Outside your comfort zone you grow ;)\n", - "2 | 0 | @MattStibbs @AndySugs this makes our day\n", - "2 | 0 | from pybites import News ⏎ ⏎ Twitter Digest 2018 Week 03 https://t.co/5w2ob7S0tF\n", - "1 | 1 | New edition: ⏎ ⏎ from pybites import News ⏎ https://t.co/wZanBJELlJ ⏎ ⏎ So much cool #python stuff going on!\n", - "2 | 0 | from pybites import News ⏎ ⏎ Twitter Digest 2018 Week 01 https://t.co/STI8XbQA9t ⏎ ⏎ #Python #news\n", - "1 | 1 | Happy New Year / Feliz año nuevo. Wishing you all a joyful, healthy and Python rich 2018! https://t.co/2EgjDc9eKt\n", - "2 | 0 | @FerroRodolfo Mate this ROCKS! It looks like we may have a thing for code challenges haha! I want a copy!\n", - "2 | 0 | Thanks @mui_css for making it easy to create an elegant and mobile friendly design!\n", - "2 | 0 | @pyconit beautiful, nice teaser\n", - "2 | 0 | @anthonypjshaw @tryexceptpass Likely yes, we really want to join you there!\n", - "2 | 0 | @FerroRodolfo @bbelderbos @_juliansequeira haha race condition, I tweeted it the same minute. Thank you too, awesome job!\n", - "2 | 0 | @fullstackpython Thanks, the more I use Django the more I love it :)\n", - "2 | 0 | @FerroRodolfo Exciting, we get it up soon, thanks!\n", - "2 | 0 | Free @PacktPub ebook of the day: Expert #Python Programming - Second Edition - https://t.co/t2aLcaSm56\n", - "1 | 1 | @FerroRodolfo You earned it mate! Again, great work!!\n", - "2 | 0 | @pythonbytes or @pybites? haha - follow them both I'd say :) https://t.co/z0TakzyQ94\n", - "1 | 1 | Free @PacktPub ebook of the day: #Python Machine Learning - https://t.co/t2aLcaSm56\n", - "2 | 0 | Our first Code Challenge 01 - Word Values Part I https://t.co/1mNw7KyqIn - a fun little exercise to explore #python's builtin sum and max.\n", - "2 | 0 | @AlSweigart @python_alc Enhorabuena @DavidPeinad0\n", - "2 | 0 | Talk Python to Me: #136 Secure code lessons from Have I Been Pwned https://t.co/42oCDY146p\n", - "1 | 1 | Few hours left ... https://t.co/lCgHjbDU5o\n", - "2 | 0 | Playing with #pytest ⏎ Fascinating how adding tests changes your modularity/ design for the better.\n", - "1 | 1 | New PyBites Twitter Digest 2017 Week 43 is up: https://t.co/LhPl5hYDoj - because we love #python! Good weekend\n", - "2 | 0 | @BetterCodeHub @bbelderbos thanks, very nice feature\n", - "2 | 0 | Ned Batchelder: How code slows as data grows https://t.co/atCQnIDFPm\n", - "2 | 0 | @CaktusGroup Nice newsletter!\n", - "1 | 1 | Excited about Code Challenge 38 - Build Your Own Hacktoberfest Checker With #Bottle https://t.co/l6TT4seCzh\n", - "1 | 1 | Free @PacktPub ebook of the day: Scientific Computing with #Python 3 - https://t.co/t2aLcaSm56\n", - "2 | 0 | Creating Charts in #Django https://t.co/nWpb8a39a3\n", - "2 | 0 | free @PacktPub #ml book https://t.co/smzcraHBDy\n", - "1 | 1 | DataCamp: How Not To Plot Hurricane Predictions https://t.co/bvNwj8X5ch\n", - "2 | 0 | Stack Abuse: Differences Between .pyc, .pyd, and .pyo Python Files https://t.co/rktFXaeDSw\n", - "1 | 1 | Watch “Pipenv Screencast” on #Vimeo https://t.co/5qhvmrkGjO\n", - "2 | 0 | doing it again right? ;) ⏎ here is the link: https://t.co/NTFBqLkTsY\n", - "2 | 0 | Dataquest: How to Generate FiveThirtyEight Graphs in Python https://t.co/iqpSAE7vKS\n", - "2 | 0 | Vladimir Iakolev: Building a graph of flights from airport codes in tweets https://t.co/AbNrdH4pT7\n", - "1 | 1 | What up everybody, for #PyBites #CodeChallenges, re @github infrastructure, what would be best? Thanks\n", - "2 | 0 | #DRF tutorial #3 - https://t.co/pIfu0nfI9d \"Using generic class-based views\" - wow that is indeed some pretty concise code!\n", - "1 | 1 | New PyBites Article: Hiding BCC Recipients in #Python MIME Emails https://t.co/Fll7Riwa2V\n", - "2 | 0 | PyCharm: Hacking Reddit with #PyCharm https://t.co/8Hg8k7FWAy #python\n", - "1 | 1 | PyBites Code Challenge 35 - Improve Your #Python Code With @BetterCodeHub https://t.co/hb5xh6jzxd\n", - "1 | 1 | Python Software Foundation \"#Python is popular in Nigeria because it’s one of the easiest ways to learn programming\" https://t.co/GetPfOr5j2\n", - "2 | 0 | William Minchin: PhotoSorter #Python script 2.1.0 Released https://t.co/dl9RXKI14x\n", - "1 | 1 | Bruno Rocha: Deploying #Python Packages to PyPI using #Flit - https://t.co/8QloOk16yG\n", - "2 | 0 | Not sure why I waited so long to use command-t (again) to navigate files in #vim! - https://t.co/blrizX8mge\n", - "2 | 0 | Free @PacktPub ebook of the day: Mastering #Python - https://t.co/t2aLcaSm56\n", - "2 | 0 | Nice to see more people switching to static site generators, we are quite happy with #python #pelican\n", - "2 | 0 | Seems cool module for mock data ⏎ ⏎ Romanized decorator :) https://t.co/vC3Xz0n2RZ\n", - "2 | 0 | #click has an incredibly elegant and versatile interface, wow! ⏎ https://t.co/nM9p1AS0OV\n", - "2 | 0 | @botherchou most of these titles have python keyword in them: https://t.co/9xQQrlO1sW :)\n", - "2 | 0 | @python_tip very cool, congrats!\n", - "2 | 0 | @EA1HET @bbelderbos @techmoneykids re #microservices I started reading https://t.co/L5fBLScYRy, you also want to ch… https://t.co/wF2TnaFR6d\n", - "2 | 0 | Django Weekly: Django Weekly 50 https://t.co/SDw5uAa9yt\n", - "2 | 0 | Mike Driscoll: Python 101: Recursion https://t.co/IEghZqgS7k\n", - "2 | 0 | Flask Video Streaming Revisited - https://t.co/ob66JmNcVB https://t.co/lVjZs1Wzaf via @miguelgrinberg\n", - "1 | 1 | PyBites of the Week - Challenge 30 Review, Django Tutorial, PyCon AU - https://t.co/WSHkRdu0i2\n", - "2 | 0 | “How to build a modern CI/CD pipeline” by @robvanderleek https://t.co/dTFbO5Q90g\n", - "2 | 0 | Chris Moffitt: #Pandas Grouper and Agg Functions Explained https://t.co/UGeayidbEE\n", - "2 | 0 | Codementor: Working with pelican https://t.co/YSjBavJna1 - oh yeah ... at PyBites we're happy with #Pelican and the responsive Flex theme!\n", - "1 | 1 | Debugging in Python https://t.co/8gbm7kB8Fs\n", - "2 | 0 | Simple is Better Than Complex: How to Setup Amazon S3 in a #Django Project https://t.co/mkfpU2JlPq @techmoneykids\n", - "2 | 0 | Python Bytes: #37 Rule over the shells with Sultan https://t.co/jGHdtfSOOL\n", - "2 | 0 | Nice article: How to contribute to Open Source https://t.co/G3DUkXCHSC\n", - "2 | 0 | DataCamp: New Python Course: Data Types for Data Science https://t.co/PVpcgSNtPp\n", - "2 | 0 | Software engineering resources thread on reddit learnpython: https://t.co/ntHpkDMuLb\n", - "2 | 0 | Daniel Bader: How to Install and Uninstall Python Packages Using Pip https://t.co/lOqATpqvls\n", - "2 | 0 | Mike Driscoll: Python is #1 in 2017 According to IEEE Spectrum https://t.co/4RUikyLKFx\n", - "2 | 0 | New on PyBites: Twitter digest 2017 week 29 https://t.co/3Eh0KcKwFN #python\n", - "2 | 0 | Cool: translate text in your terminal with py-translate python module. https://t.co/6VzXO5ixU6 #python\n", - "2 | 0 | Interesting: Possbility and Probability: pip and private repositories: vendoring python https://t.co/52nWq0CorF\n", - "2 | 0 | FuzzyFinder - in 10 lines of #Python - https://t.co/Po2cgy19We\n", - "2 | 0 | @brianokken @mkennedy Thanks, you too! Great momentum.\n", - "1 | 1 | Didn't know: https://t.co/X4VsbFI45k - how to take a printscreen of a window = Shift-Command-4 + Space bar + click mouse/trackpad #mac #tips\n", - "2 | 0 | New @lynda course: Learning #Python GUI Programming - https://t.co/kZnibY03xh\n", - "2 | 0 | @techmoneykids @benjaminspak Haha so true :) ⏎ ⏎ I do like the daily progress tweet though, maybe we could stick with that ;)\n", - "1 | 1 | Last tweet cont'd ... and remember: you build something cool, we will feature it on our weekly review post :)\n", - "1 | 1 | Always wanted to play with @themoviedb api? This week we offer you a great occasion ... https://t.co/7gPagmranP\n", - "2 | 0 | ok enough tweeting, an interesting code challenge to be solved :) ⏎ https://t.co/sh347dedlf\n", - "2 | 0 | @mohhinder @dbader_org Really nice: not only did you learn new packages, you also documented and packaged it like a… https://t.co/q1y6yhWHyQ\n", - "2 | 0 | New PyBites article: ⏎ ⏎ From Script to Project part 2. - Packaging Your Code in #Python: ⏎ ⏎ https://t.co/mQNPG7k69F\n", - "2 | 0 | Checkout @mohhinder's nice PyTrack submission for Code Challenge 23: ⏎ ⏎ https://t.co/F40QtkXnJ0 ⏎ ⏎ #Python #codechallenges #alwaysbecoding\n", - "1 | 1 | #100DaysOfCode - Day 090: Playing with TheTVDB API to scrape some movies/series info https://t.co/3Tl2XAOX8B #Python\n", - "2 | 0 | @python_tip very nice\n", - "1 | 1 | You like #Slack? We wrote a Karma bot with #Python - https://t.co/GKpve6hH1J\n", - "2 | 0 | from @PyBites import newsletter - https://t.co/RTkXX2k2YX - #Python #Articles #Challenges #News\n", - "2 | 0 | Code Challenge 23 \"Challenge Estimated Time API\" Review is up: https://t.co/gfJyGGJWi2 - we built a nice feature for our challenges platform\n", - "1 | 1 | Playing with the Github API, are you doing anything cool with #Python this weekend?\n", - "2 | 0 | @techmoneykids @bbelderbos @anthonypjshaw @dbader_org Aha! Sydney. The power of PyBites! We can be in two places at once!\n", - "1 | 1 | #100DaysOfCode - Day 077: Blank template of a #Python #class and #subclass https://t.co/qDEWbjgfSD #Python\n", - "1 | 1 | New PyBites article of the week 2: use #python #requests module to login to a website https://t.co/aD1kElU5wh\n", - "2 | 0 | Finally https on PyBites :) - thanks @Cloudflare for making it so easy\n", - "2 | 0 | @genupula thanks Raja\n", - "2 | 0 | @techmoneykids @bbelderbos congrats, keep up the good work/ momentum\n", - "2 | 0 | Still some #PyCon2017 talks to watch on YouTube, what were your favorites and why?\n", - "2 | 0 | @techmoneykids so cool to see folks participating in our PyBItes #code #challenges https://t.co/LfkN8LImHK\n", - "2 | 0 | There is still some #PyCon2017 left luckily :) https://t.co/DbOsGXUXJ3\n", - "2 | 0 | Can't believe we are already ending #PyCon2017 - but it has been awesome and a new record was set: https://t.co/t2nWvcyyiD\n", - "2 | 0 | @mohhinder @steam_games Thanks. Greetings from pycon!\n", - "2 | 0 | At pycon, weather and views are nice :) https://t.co/fOuQIcJ4L9\n", - "1 | 1 | Amazing keynote! https://t.co/WGdi57KcTh\n", - "2 | 0 | @mohhinder Haha! Kids, work and an unexpectedly super difficult challenge didn't mix very well :P it's a tough one… https://t.co/ffG1ch0Gw8\n", - "2 | 0 | Lots of #Python goodies to enjoy in this week's @pybites Twitter Digest! Image Recognition is exciting! https://t.co/87oVNThhwZ\n", - "1 | 1 | from @PyBites import newsletter - https://t.co/IyHFGGVthT - #Python #Articles #Challenges #News\n", - "2 | 0 | PyBites new Code Challenge #18 is up: Get Recommendations From #Twitter Influencers https://t.co/qn5SRKUOMy #TwitterAPI #books\n", - "2 | 0 | from @PyBites import newsletter - https://t.co/Wg75oDvYUE - #Python #Articles #Challenges #News\n", - "2 | 0 | New PyBites Code Challenge is up, wow #17 already: ⏎ ⏎ Never Miss a Good Podcast ⏎ ⏎ https://t.co/U2gKU5hI2O ⏎ ⏎ #podcast #sqlite #python\n", - "2 | 0 | Got #Python for Finance by @dyjh - can't wait to read it next holidays! https://t.co/ytSBY9bXSP\n", - "2 | 0 | Free @PacktPub ebook today: ⏎ ⏎ #Python 3 Object-oriented Programming - Second Edition ⏎ ⏎ https://t.co/t2aLcaALdy\n", - "1 | 1 | from @PyBites import newsletter - https://t.co/RpiDwUkQTY - #python #Articles #Challenges #News\n", - "2 | 0 | @pydanny F-strings?\n", - "2 | 0 | @sh4hidkh4n Cool, so you can run cronjobs on Heroku?\n", - "2 | 0 | @ZurykMalkin Nice, is it on GH? Yeah I usually don't care if it already exists. It's all about the process and lear… https://t.co/5rUKaIQBkV\n", - "1 | 1 | PyBites: Code Challenge 13 - Highest Rated Movie Directors - Review https://t.co/fZeENmatBb #python\n", - "2 | 0 | Comparison with SQL — pandas 0.19.2 docs - very cool, definitely looking into this for this week's challenge https://t.co/ufPKfodouF\n", - "2 | 0 | @python_tip or just pull your own copy :) https://t.co/bAcw8U2yVs\n", - "2 | 0 | @python_tip + nice shortcut for shell: ⏎ ⏎ function pytip(){ ⏎ python <(curl -s https://t.co/1I6S7gq0ur) $@ ⏎ } ⏎ ⏎ sourc… https://t.co/wI6Va7pr5m\n", - "1 | 1 | We are: ⏎ >>> from datetime import datetime as dt ⏎ >>> (https://t.co/dtEYAsVGgU() - dt(2016, 12, 19)).days ⏎ 100 ⏎ ⏎ days :) ⏎ https://t.co/dCqt08UfYp\n", - "2 | 0 | @RealPython @ahmed_besbes_ I really enjoyed this article / analysis, thanks\n", - "1 | 1 | #python #Module of the Week - #ipaddress https://t.co/Fz9GJS3KcS\n", - "0 | 2 | Code Challenge 09 - With Statement / Context Manager review is up, we found some nice use cases https://t.co/mny5bud3A4 @dbader_org #python\n", - "2 | 0 | @dbader_org thanks Dan, it has been great learning so far. ABC: always be coding, right?\n", - "2 | 0 | New on PyBites Code Challenges: ⏎ ⏎ Code Challenge 08 - House Inventory Tracker - review ⏎ ⏎ https://t.co/Av7RlVFRJt ⏎ ⏎ #python #challenge #coding\n", - "1 | 1 | Postmodern Error Handling in #Python 3.6 https://t.co/IInRMDGP29 - nice article highlighting enums, typed NamedTuples, type annotations\n", - "1 | 1 | Pos or neg talk about 50 shades of darker? Find out in our #python Twitter analysis Challenge review https://t.co/N8IkMT550A cc @RealPython\n", - "2 | 0 | Twitter digest 2017 week 08 https://t.co/KpiODOVlMR #python\n", - "2 | 0 | @pythonbytes thanks a lot guys for mentioning our python resources article and PyBites blog, really appreciated\n", - "1 | 1 | PyBites of the Week - https://t.co/tY0xDwwWQJ\n", - "1 | 1 | Code readability https://t.co/GiRyjevWly #python\n", - "2 | 0 | Scientists make huge dataset of nearby stars available to public https://t.co/4Gg72kcTHV @Pybonacci @astrojuanlu\n", - "2 | 0 | Tiny Python 3.6 notebook - https://t.co/DhkDN4wz1E\n", - "1 | 1 | Python Excel Tutorial: The Definitive Guide https://t.co/z7fOQjCABG via @DataCamp\n", - "1 | 1 | Visualizing website and social media metrics with #matplotlib [notebook] https://t.co/2DDmfUXJ4A #data #python #jupyter\n", - "2 | 0 | free ebook: Mastering Object-oriented Python - https://t.co/t2aLcaALdy @techmoneykids -> kindle! :)\n", - "1 | 1 | #pybites #python Code Challenge 04 - Twitter data analysis Part 1 review if up: https://t.co/ZTQhs3TtHL\n", - "1 | 1 | New on our blog: Discover Python Help Options https://t.co/hsky5JAktv\n", - "2 | 0 | impressed by the free chapter on functional programming of The Hacker's Guide to #Python by @juldanjou\n", - "2 | 0 | free #packt ebook of the day: Python 3 Web Development Beginner's Guide - https://t.co/t2aLcaALdy\n", - "1 | 1 | @PyBites new #codechallenge is up: https://t.co/8dRJyFtin0 #python @techmoneykids @bbelderbos\n", - "1 | 1 | Everything is an Object, Python OOP primer https://t.co/gm5TSGlOFK #python\n", - "2 | 0 | #Python Knowledge Base https://t.co/3bwraJt7Jm via @quantifiedcode\n", - "1 | 1 | Good vibes on our code challenges posts. Working towards solutions with our readers, awesome cc @techmoneykids\n", - "2 | 0 | Customizing your Navigation Drawer in Kivy & KivyMD https://t.co/DevICadiuN #python\n", - "1 | 1 | Cheat Sheet: Python For Data Science https://t.co/pqhepaavl1 #python\n", - "1 | 1 | Code Challenge 01 - Word Values Part I https://t.co/h4N81Ll6ZC #python\n", - "1 | 1 | Time for a #python code challenge! ⏎ ⏎ Code Challenge 01 - Word Values Part I ⏎ ⏎ https://t.co/h4N81L3w84 https://t.co/lnvYc6xJXG\n", - "1 | 1 | Copy and Paste with Pyperclip https://t.co/6CNbUpCWw4 #python\n", - "0 | 2 | Python Naming Conventions https://t.co/P3ox8A01D3 #python\n", - "2 | 0 | @TalkPython @_egonschiele thanks for this episode and book, flying through it, finally a book that makes algorithms easy to grasp. Great job\n", - "1 | 0 | @jeorryb @dbader_org @intoli Nice!\n", - "1 | 0 | @jeorryb @dbader_org @intoli Cool for which one did you use it?\n", - "1 | 0 | @RobHimself1982 @Pybites100 Great progress, keep going!\n", - "1 | 0 | @_juliansequeira @bbelderbos @OReillyMedia @dabeaz On my desk! Enjoy it\n", - "1 | 0 | @ryentzer nice :)\n", - "0 | 1 | >>> from pybites import News ⏎ ⏎ Twitter Digest 2018 Week 05 https://t.co/4WYatkCCIv\n", - "1 | 0 | @PyConES Logo guapo!\n", - "1 | 0 | @RobHimself1982 @Pybites100 Awesome\n", - "1 | 0 | @RobHimself1982 Nice to see you are learning a lot\n", - "1 | 0 | @RobHimself1982 awesome\n", - "1 | 0 | @imonsh una maquina ;)\n", - "1 | 0 | @defpodcastmx Gracias amigos de Mejico\n", - "1 | 0 | @mohhinder awesome, this was a tough one!\n", - "1 | 0 | @RobHimself1982 Hang in there\n", - "1 | 0 | @RobHimself1982 Hang in there, it becomes easier with practice\n", - "1 | 0 | @AndrewsForge Looking forward to this one 💪\n", - "1 | 0 | @RealPython Nice!\n", - "1 | 0 | @FabioRosado_ Awesome, We love this one, safer and more elegant\n", - "1 | 0 | @RobHimself1982 Awesome!\n", - "1 | 0 | excluding stopwords\n", - "1 | 0 | @jcastle13 thanks Jason for the shout out, happy you are using our material towards the 100 days challenge. Good lu… https://t.co/dqdbHSZp6a\n", - "1 | 0 | @diraol thanks for the reminder, should be using them more, we do love them: https://t.co/jEGY2Agj5W\n", - "1 | 0 | Forget about envs and setup, learn #Python in the comfort of your browser with our new Bites of Py solution -… https://t.co/HNlrFxFqhh\n", - "1 | 0 | @gowthamsadasiva Thanks will check ...\n", - "1 | 0 | @FerroRodolfo wow, nice\n", - "1 | 0 | “Out and back again” by @roach https://t.co/9bRxPSxbxN - cool, can’t wait to try it out. Love Slack\n", - "1 | 0 | PyDev of the Week: Anthony Tuininga https://t.co/NsE6qaxuj2\n", - "1 | 0 | @michaelc0n @fullstackpython @TalkPython Python OOP 2nd ed, nice :)\n", - "1 | 0 | @CCMedic521 @TalkPython Awesome, let us know how it goes ... good luck!\n", - "1 | 0 | @westen_dev If it was not to teach stdlib Python on our live workshop for this one, I was eager to tackle this with Pandas too :)\n", - "1 | 0 | @westen_dev pandas + seaborn, very nice, thank you!\n", - "1 | 0 | @yasoobkhalid inspiring read, keep up the good work\n", - "1 | 0 | Free @PacktPub ebook of the day: Artificial Intelligence with #Python - https://t.co/t2aLcaSm56\n", - "1 | 0 | @Mike_Washburn @restframework Thanks might try this for code challenge 41\n", - "1 | 0 | @DavidPeinad0 @AlSweigart @python_alc Me alegro, nos vemos en el siguiente reto!\n", - "1 | 0 | @justin_aung19 I (Bob) really like Django. Elegant framework and great docs. What are you building? Any recommendations?\n", - "1 | 0 | @justin_aung19 Thanks for sharing. How is your Python journey going?\n", - "1 | 0 | @DEEPSUA @python_alc @EPSAlicante Gracias ha molado mucho\n", - "1 | 0 | @PacktPub @techmoneykids nice\n", - "1 | 0 | @newsafaribooks cc @brianokken\n", - "0 | 1 | Mike Driscoll: Python 3: Variable Annotations https://t.co/FsLH9tp2vo\n", - "1 | 0 | PyCharm: Webinar Recording: “#GraphQL in the Python World” with Nafiul Islam https://t.co/PwmmcLiJZZ\n", - "1 | 0 | cc @RegexTip\n", - "1 | 0 | @tezosevangelist @fullstackpython @python_tip PR or it didn't happen ;) ⏎ ⏎ Seriously though, why?\n", - "1 | 0 | @diek007 @pydanny Thanks for sharing, awesome tool\n", - "1 | 0 | Pythonic String Formatting https://t.co/l3A3lLseTx\n", - "1 | 0 | @fullstackpython On mine too, would be nice to blog something about it ...\n", - "1 | 0 | @fullstackpython Cool, watched an oreilly talk today on microservices and all the tooling, it’s massive! Have you tried Kubernetes?\n", - "1 | 0 | 5 reasons you need to learn to write Python decorators - O'Reilly Media https://t.co/PSG6pSclRY via @oreillymedia\n", - "1 | 0 | Python Bytes: #48 Garbage collection and memory management in #Python https://t.co/ALg5dCO3mR\n", - "1 | 0 | @mohhinder Nice, 4 of which are challenges, awesome!\n", - "1 | 0 | Mike Driscoll: How to Watermark Your Photos with Python https://t.co/mjRbLovg4U\n", - "1 | 0 | @shravankumar147 Indeed!\n", - "1 | 0 | @jojociru That said we actively started adding submissions to our review posts starting around challenge 15, becaus… https://t.co/IEkG64vpam\n", - "1 | 0 | Support open source in October and earn a limited edition T-shirt from @digitalocean and @github https://t.co/gDfINlP6ad #hacktoberfest\n", - "0 | 1 | EuroPython 2017: Videos available... https://t.co/Ec29edzYdI\n", - "1 | 0 | @PacktPub Nice some good stuff in here :)\n", - "1 | 0 | Have you seen this week's issue of Programming Today? @oreillymedia (https://t.co/ilkmQdnT1W)\n", - "1 | 0 | Dataquest: Explore Happiness Data Using Python Pivot Tables https://t.co/8cmaMiupYH\n", - "1 | 0 | @PyImageSearch Oh yeah, a lot of my learning I can contribute to just that, and reason we do code challenges. Thanks\n", - "1 | 0 | @michaelc0n @kelseyhightower @pycon @kubernetesio @TalkPython Oh yeah, this was awesome, I remember the audience going wild :)\n", - "1 | 0 | Great article! \"You will be learning new things forever. That feeling of frustration is you learning a new thing. Get used to it.\"\n", - "1 | 0 | @PacktPub 2 free ebooks today?! How generous\n", - "1 | 0 | Python Software Foundation: Improving #Python and Expanding Access: How the PSF Uses Your Donation https://t.co/DYWIuNIWuW\n", - "1 | 0 | @gazhay @shravankumar147 @dbader_org @python_tip nice how this led to this thread, maybe we should do a code kata /… https://t.co/6duZ60TaJV\n", - "1 | 0 | @shravankumar147 @janikarh @python_tip @dbader_org Cool, thanks for sharing\n", - "0 | 1 | pgcli: Release v1.8.0 https://t.co/1RuEXz17PD\n", - "1 | 0 | DataCamp: Keras Cheat Sheet: Neural Networks in #Python https://t.co/bAtDN4Ql8m\n", - "1 | 0 | New PyBites Article: ⏎ ⏎ Module of the Week: Openpyxl - Automate Excel! ⏎ ⏎ #openpyxl #python #excel #automation https://t.co/6nxkMbysfG\n", - "0 | 1 | Free @PacktPub ebook of the day: Mastering Social Media Mining with #Python - https://t.co/t2aLcaSm56\n", - "1 | 0 | DataCamp: 3 Things I learned at JupyterCon https://t.co/w8XC3k1VJN #python #datascience\n", - "1 | 0 | Why not state it again? ;) ⏎ ⏎ Python's future looks bright! https://t.co/jojONo8WbM\n", - "1 | 0 | #Python Twitter News Digest 2017 Week 36 is out: https://t.co/WWA17leLbv\n", - "1 | 0 | @unisys12 @georgespake @chadfowler One of my favorite dev / career books, coincidentally took it from the shelve ye… https://t.co/RPr9s2NBYy\n", - "1 | 0 | PyCharm: #Webinar: “Visual #Testing With #PyCharm” with Kenneth Love, Sept 28 https://t.co/YfeyBCAC7N #python\n", - "0 | 1 | #Django security releases issued: 1.11.5 and 1.10.8 https://t.co/iGmX8NpRT2\n", - "1 | 0 | Michy Alice: Let #Python do the job for you: AutoCAD drawings printing bot https://t.co/xTSmBDl1Ua\n", - "0 | 1 | #Python overtakes R, becomes the leader in Data Science, Machine Learning platforms: https://t.co/Gng3TaWKfI #ML\n", - "1 | 0 | @p3pijn @BetterCodeHub @bbelderbos https://t.co/eFGu6vNcXJ\n", - "0 | 1 | Great life lessons and books! https://t.co/76NNlb98QG\n", - "1 | 0 | @saronyitbarek Awesome advice, thanks\n", - "1 | 0 | @Mike_Washburn @djangoproject @restframework ... just as I hit publish on our Django/DRF code challenge :) - adding… https://t.co/1cq8sPDsm2\n", - "1 | 0 | Mike Driscoll: #Python developer of the Week: Shannon Turner https://t.co/Z9tPJMxz6L\n", - "1 | 0 | @python_tip thanks for the reminder ;)\n", - "1 | 0 | @LegoSpaceBot Nostalgia, precursor to coding, already were building stuff back then :)\n", - "1 | 0 | Serverless everywhere https://t.co/PiAj1UAEO5\n", - "0 | 1 | PyBites Weekly Twitter Digest #34 is out: 1K Followers Wordcloud, #Eclipse, #JupyterCon, Serverless, #notabs,… https://t.co/DuBnRcBb4b\n", - "1 | 0 | @steven_braham idd goeie structuur. ben begonnen met part 3.\n", - "1 | 0 | @ka11away Hahaha same here last night ;)\n", - "1 | 0 | @CaktusGroup Thanks for the shoutout\n", - "1 | 0 | @steven_braham agreed! what did you read?\n", - "1 | 0 | @treyhunner learning some more Django this week :)\n", - "0 | 1 | Import #Python 138 - 18th Aug 2017 https://t.co/XcRYypylO7\n", - "1 | 0 | @mohhinder that's cool, it did not occur to me that I could just do one daily tweet from my account, thanks for tha… https://t.co/xYDKTvIWEy\n", - "1 | 0 | @mohhinder Haha maybe I tweet out each book from my own account and just RT from pybites if I see something Python… https://t.co/fyIMP26ioa\n", - "1 | 0 | @botherchou talking about web scraping we can of course scrape all packt titles from there and make a more informed decision ;)\n", - "1 | 0 | @importpython ROFL\n", - "1 | 0 | @simecek @python_tip sure, I like what you guys are doing, I will send you a message\n", - "1 | 0 | @EA1HET @bbelderbos I focus a bit more on Django now but Microservices is on my list. @techmoneykids (Julian) take… https://t.co/61WIAJi9Xk\n", - "1 | 0 | @EA1HET @bbelderbos Thanks Jonathan, glad you like it. What could we add to make it even better for you?\n", - "0 | 1 | @Joao_Santanna @PacktPub oops: it's the daily one: https://t.co/t2aLcaALdy\n", - "0 | 1 | PyBites of the Week - Challenge 31 Review, #Pillow, #Flask - https://t.co/e4aYEFexfy\n", - "1 | 0 | @DataCamp @joshsisto @mkennedy Congrats, great progress for 8 months.\n", - "0 | 1 | @bbelderbos @BetterCodeHub Congrats having BCH on @GitHub Marketplace!\n", - "1 | 0 | Nice article: “Getting started with translating a #Django Application” by @steven_braham https://t.co/IN2zTaqbMo\n", - "1 | 0 | @steven_braham @mosenturm Great article! I saw these {% load i18n %} in django-registration templates yesterday, ni… https://t.co/tZrFafhcCd\n", - "1 | 0 | @steven_braham @mosenturm Fair enough. Good luck. Will blog and code challenge DRF at some point, will let you know ...\n", - "1 | 0 | @RealPython nice, thanks\n", - "1 | 0 | “Writing a map-reduce job to concatenate a millions of small documents” by didier deshommes https://t.co/CRK3R5pvHv\n", - "1 | 0 | Full Stack Python: Creating Bar Chart Visuals with Bokeh, Bottle and Python 3 https://t.co/9jafKVM8xX\n", - "1 | 0 | #Djagno - \"The web framework for perfectionists with deadlines\" - very true :)\n", - "1 | 0 | Neat: django-lockdown - Lock down a #Django site or individual views, with configurable preview authorization - https://t.co/oVVMiKAWDW\n", - "1 | 0 | Daniel Bader: Python Iterators: A Step-By-Step Introduction https://t.co/AbI7QYn7Iv\n", - "1 | 0 | PyBites of the Week - Challenge 29 Review, Pexpect, Flask, Refactoring, Django - https://t.co/5y7x8261vi\n", - "0 | 1 | Interesting new book on @safari : #cloud native #python https://t.co/wHyRn9PGRC\n", - "1 | 0 | Data School: Web scraping the President's lies in 16 lines of Python https://t.co/dHjfN3f7lZ\n", - "1 | 0 | @techmoneykids Rofl don't worry Flask won't run away. You will always be our Flask guy, specially now I got the Django fever haha\n", - "1 | 0 | @CaktusGroup Thanks, welcome to submit a cool app :)\n", - "1 | 0 | Catalin George Festila: Fix Gimp with python script. https://t.co/OstJ51RuZM\n", - "0 | 1 | from @PyBites import newsletter - https://t.co/sNDiQeojsK - #Python #Articles #Challenges #News\n", - "1 | 0 | Catalin George Festila: Make one executable from a python script. https://t.co/Whg2kwQhCc\n", - "1 | 0 | Weekly Python Chat: Ranges in Python https://t.co/zYmKq6MVNW\n", - "0 | 1 | PyBites Twitter digest 2017 week 28 is out - some really nice #Python articles for your weekend reading list: https://t.co/a1mlRiztLa\n", - "1 | 0 | Caktus Consulting Group: Readability Counts (PyCon 2017 Must-See Talk 6/6) https://t.co/AvLLOnCEuX #python\n", - "1 | 0 | from @PyBites import newsletter - https://t.co/aATmfY2fSc - #Python #Articles #Challenges #News\n", - "1 | 0 | @techmoneykids agreed wanna read more. First django app a tracker like in this article? https://t.co/mDmY6NWKlX\n", - "1 | 0 | @colorado_kim @MikeHerman Thanks for the inspiration.\n", - "0 | 1 | from @PyBites import newsletter - https://t.co/lG5f2NUUD8 - #Python #Articles #Challenges #News\n", - "1 | 0 | neat @techmoneykids\n", - "1 | 0 | from @PyBites import newsletter - https://t.co/nwKfOsSWlH - #Python #Articles #Challenges #News\n", - "1 | 0 | New #Python #Codechallenge #25 is up: build a Notification Service of Now Playing/Upcoming #Movies (or #Series) - https://t.co/sh347dedlf\n", - "1 | 0 | Code Challenge 24 - Use Dunder / Special Methods to Enrich a Class - Review is up: https://t.co/q2MNe2WbS2 #Python #codechallenges #dunders\n", - "1 | 0 | 16 hours left to grab your free @PacktPub ebook of the day: Mastering #Python - https://t.co/t2aLcaALdy\n", - "1 | 0 | A new week, more Python ... this week we're coding a new movie/series notification email, stay tuned for our new challenge ...\n", - "1 | 0 | @lynda @techmoneykids lol forgot we auto-tweeted this. Likely gonna check this one out this weekend :)\n", - "1 | 0 | @python_tip Really useful\n", - "1 | 0 | @anthonypjshaw @techmoneykids @bbelderbos @dbader_org Haha can't help it ... and lazy cause now I can keep replying from this account ;)\n", - "1 | 0 | @pythonbytes @brianokken Thanks guys, interesting stuff\n", - "1 | 0 | @anthonypjshaw @dbader_org Thanks, good to know :) - hope you are doing well\n", - "1 | 0 | PyBites weekly Twitter digest is up: https://t.co/XtSN2QxouT - happy weekend\n", - "1 | 0 | was playing with #python Pillow, nice library, makes image manipulation pretty easy\n", - "1 | 0 | @benjaminspak Those were the golden days. A tribe called quest :)\n", - "1 | 0 | New PyBites article of the week 1: parsing html tables https://t.co/bFevaUQgM0 #python #pandas\n", - "1 | 0 | Make sure you grab this awesome #python book, it's free (please use Pybonacci's affliation link below to sponsor Py… https://t.co/IDgN9q89Mo\n", - "1 | 0 | from @PyBites import newsletter - https://t.co/flJl9W9rFx - #Python #Articles #Challenges #News\n", - "1 | 0 | PyBites Code Challenge 21 - Electricity Cost Calculation App - Review https://t.co/Rk9KhGrD8F - we got some nice PRs this week!\n", - "1 | 0 | @mohhinder looks awesome man! https://t.co/RgF8YXqeDu\n", - "1 | 0 | @importpython Thanks for the shout out :)\n", - "1 | 0 | @techmoneykids Really glad you did that. Best way to learn is to challenge yourself which you did :)\n", - "1 | 0 | @CaktusGroup Thanks for the RT, was nice meeting you at pycon!\n", - "1 | 0 | from @PyBites import newsletter - https://t.co/adbWEckVqB - #Python #Articles #Challenges #News\n", - "1 | 0 | Some nice PRs for our #Python Code Challenge 20 - our review is up: https://t.co/PlXNkJqMdu\n", - "1 | 0 | @kelseyhightower @RealPython So inspiring, thanks!\n", - "0 | 1 | from @PyBites import newsletter - https://t.co/VcQ1PI2ESR - #Python #Articles #Challenges #News\n", - "1 | 0 | Why have I not used bpython yet?! It's awesome https://t.co/mAO9CJojVC\n", - "1 | 0 | @mariatta Thanks for sharing your great story\n", - "1 | 0 | Use #Python to Build a #Steam Game Release Notifier App! Nice and handy (your wallet may disagree!) https://t.co/oJRexhPXPv @steam_games\n", - "1 | 0 | from @PyBites import newsletter - https://t.co/c2GXbQBKPj - #Python #Articles #Challenges #News\n", - "1 | 0 | Obsolete haha, use faker, thx @mohhinder\n", - "1 | 0 | @mohhinder thanks, yours was awesome!\n", - "1 | 0 | Review of this week's code challenge is up: https://t.co/NyIPK3iLTn #python #challenge cc @mohhinder\n", - "1 | 0 | @mohhinder Thanks, our pleasure. We are all learning here, more fun to build a community around it.\n", - "1 | 0 | @mohhinder That's awesome. Nice to see how you are picking this up. As you PR'd it will feature it in our review\n", - "1 | 0 | Regarding PyBites code challenges do you like them to be:\n", - "1 | 0 | @CaktusGroup thanks for the shout out, hope you enjoy these challenges\n", - "1 | 0 | from @PyBites import newsletter - https://t.co/zOR5CJ3MQI - #Python #Articles #Challenges #News\n", - "1 | 0 | @mohhinder @PacktPub Thanks, nice timing haha\n", - "1 | 0 | @JMChapaZam @pymty Gracias, saludos desde España / Australia\n", - "1 | 0 | Our weekly #Python news digest is out: ⏎ ⏎ https://t.co/KjCa0HJdnU https://t.co/gHPsClCE4T\n", - "1 | 0 | Thanks @importpython for featuring our decorators article this week.\n", - "1 | 0 | @python_tip Wonder though if on py 3 what % would be < 3.5?\n", - "1 | 0 | This O’Reilly report surveys 30 #Python web frameworks and provides a deeper look into six of the most widely used. https://t.co/1cbRoXqNoj\n", - "0 | 1 | New PyBites Article: How to Write a #Decorator with an Optional Argument? - https://t.co/ED7lXZVOrc #Python\n", - "1 | 0 | @ZurykMalkin How is it going? We are enjoying the challenge. What DB did you use? App?\n", - "1 | 0 | @ZurykMalkin Got my copy the other day, read 50 pages, already picked up several tricks. Really enjoying it. You?\n", - "1 | 0 | New PyBites Code Challenge #14 - Write DRY Code With #Python #Decorators https://t.co/m9S9KvPI7p (cc @dbader_org @realpython)\n", - "1 | 0 | @python_tip ok thanks, just to avoid a lot of dubs as you grow :)\n", - "1 | 0 | PyBites: Code Challenge 13 - Highest Rated Movie Directors - Review https://t.co/fZeENlSSJD #python\n", - "0 | 1 | https://t.co/LIYMJ0bXRP #flask #api\n", - "1 | 0 | @shashanksharma9 @github Thanks, what bot did you make? The FB thing I saw on your profile?\n", - "1 | 0 | @shashanksharma9 We did hangman. Sudoku or 8 queens (backtracking or brute force) would be cool\n", - "1 | 0 | @shashanksharma9 @adebarros funny we did those 2 games in our weekly challenges, any other game of similar difficul… https://t.co/Lum9Clh4Or\n", - "1 | 0 | @shashanksharma9 @github starting day 007 it does, I just wrote an article about it: https://t.co/bVafsHPViu\n", - "1 | 0 | from @PyBites import newsletter - https://t.co/jVlNKDM8v5 - #python #Articles #Challenges #News\n", - "1 | 0 | @shashanksharma9 @github Glad you asked, stay tuned for part 2 (day 007)\n", - "0 | 1 | Our new weekly code challenge is up: Highest Rated Movie Directors - https://t.co/BJx58QaM1q - happy coding!\n", - "1 | 0 | Our weekly #python news digest is up: https://t.co/ybB6Gh3LCf\n", - "1 | 0 | Code Challenge 12 - Build a Tic-tac-toe Game - Review https://t.co/8rEdrd3G4o\n", - "1 | 0 | Zip and ship, make an executable zipfile of your #Python project - https://t.co/2St6qlrhTi - still a neat trick :)\n", - "1 | 0 | Stay tuned for our tictactoe review later today, we learned a lot. You can join our weekly code challenges here: https://t.co/nugm84MhkB\n", - "1 | 0 | Hone your #Python skills by joining us in our #100DaysOfCode challenge - https://t.co/xfQpzdmmEU\n", - "1 | 0 | @python_tip You are welcome, it was nice practice. I hope it does lead to less duplicate submissions\n", - "1 | 0 | What #python concepts you'd feel if mastered make you a pro? What is still hard to grasp? Happy coding\n", - "1 | 0 | @techmoneykids https://t.co/2F67M15LNk\n", - "1 | 0 | @ZurykMalkin and now we're too :) ⏎ ⏎ That is an awesome book to have on your desk as a Python developer\n", - "1 | 0 | from @PyBites import newsletter - https://t.co/u9TbRu3W4e - #python #Articles #Challenges #News\n", - "1 | 0 | Carl Chenet: Retweet all tweets matching a regex with the Retweet bot https://t.co/RloSFOiS3e #python\n", - "0 | 1 | New PyBites Code Challenge #12 - Build a Tic-tac-toe Game ⏎ ⏎ https://t.co/bK9F2iht9x ⏎ ⏎ #python #TicTacToe\n", - "1 | 0 | WTF loosing against the #AI I just built - https://t.co/iL8Otdg1cm #tictactoe in #python cc @techmoneykids: run with 'hard' switch to go 2nd\n", - "0 | 1 | Code Challenge 11 - Generators for Fun and Profit - the review is up, hope you enjoyed this one - https://t.co/kblieroEbl #python\n", - "1 | 0 | @python_tip thanks, I can grep that :) ⏎ ⏎ Maybe nice RFE to have an API to validate and submit?\n", - "1 | 0 | Nice #python package I used today (again) to copy and paste to/from clipboard: Pyperclip https://t.co/xZS5TmH0Uf\n", - "1 | 0 | @ArtSolopov @python_tip ah ok thanks\n", - "1 | 0 | @python_tip I really like these tips, thanks. I will submit some more soon. Is there an easy way to avoid duplicate submissions?\n", - "1 | 0 | nice #Vim plugin for the awesome stackoverflow cli tool #howdoi - https://t.co/pke6RuigMF\n", - "0 | 1 | Morning Pythonistas, our new Code Challenge 11 is up: Generators for Fun and Profit, happy #python learning - https://t.co/JCnbnhf7gI\n", - "0 | 1 | New on PyBites: Code Challenge 10 - Build a Hangman Game - Review is up - check our solution and learning here: https://t.co/n82cQVRsL5\n", - "1 | 0 | @nicjamesgreen @mkennedy I got mine yesterday too Nick! Will get it on the lappy and show you :P\n", - "1 | 0 | New PyBites article is up: ⏎ ⏎ 10 Tips to Get More out of Your Regexes ⏎ ⏎ https://t.co/7H2sxR9WVW ⏎ ⏎ #regex #python\n", - "1 | 0 | #python everywhere: kids homework can be so much more fun ;) https://t.co/oxnUec0nHU\n", - "1 | 0 | Awesome: create isolated #Jupyter ipython kernels with pyenv and virtualenv - https://t.co/4fFbN6T0r7 #python\n", - "0 | 1 | Every week @pybites publishes a #python #challenge, join us at https://t.co/UoVsqfkNaa / archive… https://t.co/6P9sKHhPU7\n", - "1 | 0 | New on PyBites: ⏎ ⏎ Code Challenge 09 - Give the With Statement some Love and Create a Context Manager ⏎ ⏎ https://t.co/roiKPq21eg\n", - "1 | 0 | @TalkPython 11 almost countdown from 10 haha\n", - "1 | 0 | Everything is an Object, #Python OOP primer https://t.co/OS9SFUedMi\n", - "1 | 0 | Improve your programs with beautiful, idiomatic #Python https://t.co/BPw8nRvJtW\n", - "0 | 1 | cool, want to try ... https://t.co/TqTkkNz7AU\n", - "1 | 0 | Python Programming Language LiveLessons - excellent beyond basics #python course, thanks @dabeaz, learning a lot - https://t.co/tjsWJbzmFk\n", - "1 | 0 | Had fun writing this article on the #Python fun that's trending on Twitter! https://t.co/PvME6U5fup Stay humble Pythonistas!\n", - "1 | 0 | Thanks @illustratology for making our logo, it looks awesome! Cc @techmoneykids\n", - "1 | 0 | Psst ... our new #python Code Challenge is up: #08 - House Inventory Tracker https://t.co/Xmn3RvXyNj\n", - "1 | 0 | PyBites of the Week - https://t.co/tHcqS0JwWn\n", - "1 | 0 | @TalkPython you are welcome, thanks for this great #python training material!\n", - "1 | 0 | @pythonbytes \"@pybites that is a pretty similar name\" LOL ... true! We only found out about Python Bytes shortly after we started :)\n", - "1 | 0 | @TalkPython looking forward to it. Nice timing, 100 as in (almost) 100k pypi packages. Coincidence right? ;)\n", - "0 | 1 | New article on our blog: 5 tips to speed up your #Python code https://t.co/wFfjqpVTPd\n", - "1 | 0 | Lambdas or no lambdas, interesting discussion - https://t.co/heYzUAZ5Sy #python\n", - "0 | 1 | new #python code challenge is up: https://t.co/Ues7UOlMBN - perform a Twitter sentiment analysis ... https://t.co/KGj3v6qnK0\n", - "1 | 0 | Code Challenge 06 - When does PyPI reach 100K packages? - review https://t.co/ZnfBIDKwjH #python\n", - "0 | 1 | Guido's King's Day Speech - wonderful talk: https://t.co/Zrp7Uo79BP #python\n", - "1 | 0 | neat https://t.co/mV4o1Mla3l\n", - "1 | 0 | @python_tip nice idea!\n", - "1 | 0 | Brett Slatkin - Refactoring Python: Why and how to restructure your code... https://t.co/wd6yUQipf0 - great talk\n", - "1 | 0 | Wow! Awesome video. @dbader_org @techmoneykids check this out https://t.co/y6xBeoaXoH\n", - "1 | 0 | #98 Adding concurrency to Django with Django Channels https://t.co/NHBYmxAS4F #python\n", - "1 | 0 | Visualizing website and social media metrics with matplotlib [notebook] https://t.co/N3QIKXWYtW #python\n", - "1 | 0 | Working with iterables: itertools & more https://t.co/yPoCfaOItK #python\n", - "1 | 0 | From beginner to pro: Python books, videos and resources https://t.co/8bpGOQ13pz #python\n", - "1 | 0 | Lambda Functions in Python: What Are They Good For? https://t.co/D9PqD4wxhn #python\n", - "1 | 0 | Code Challenge 05 - Twitter data analysis Part 2: how similar are two tweeters? https://t.co/4WQOH2ig3U #python\n", - "1 | 0 | Code Challenge 04 - Twitter data analysis Part 1: get the data - Review https://t.co/WvIQkYxC6j #python\n", - "1 | 0 | #97 Flask, Django style with Flask-Diamond https://t.co/ggqrD2zPIT #python\n", - "1 | 0 | #11 Django 2.0 is dropping Python 2 entirely, pipenv for profile functionality, and Pythonic home automation https://t.co/ivbetn0zxD #python\n", - "0 | 1 | Twitter digest 2017 week 04 https://t.co/L3njBuBats #python\n", - "1 | 0 | interesting #pandas #Python https://t.co/eMaivdMeRW\n", - "0 | 1 | Python's data model by example https://t.co/j3wu8jY4pu #python\n", - "1 | 0 | great course: Python Beyond The Basics - Object Oriented Programming https://t.co/Fhapwpz7pZ\n", - "0 | 1 | true, this book is awesome for developers wanting to advance in their career, recommended it to a co-worker today :… https://t.co/9tW8m3oEYU\n", - "1 | 0 | wow! stdlib has a way to find similarity between words! how? join our #python #codechallenge and you will learn ... https://t.co/LJ1px8JuwI\n", - "1 | 0 | @kjam nice article thanks, gonna dig up my copy, it has been on the shelf for too long\n", - "1 | 0 | Code Challenge 02 - Word Values Part II - Review https://t.co/nyQXxl87zy #python\n", - "1 | 0 | Machine learning in Python with scikit-learn https://t.co/youL2NJd3L\n", - "1 | 0 | 5 cool things you can do with itertools https://t.co/Nk4s3yL6zL #python\n", - "0 | 1 | #8 Python gets Grumpy, avoiding burnout, Postman for API testing and more https://t.co/rSLt7q7g8S #python\n", - "0 | 1 | Beautiful, idiomatic Python https://t.co/Gft5OaBkon #python\n", - "1 | 0 | I love the key on max, min, sorted, so powerful and concise. Also using it in this week's coding challenge :) https://t.co/vpL1R3bSIW\n", - "1 | 0 | @PyPiglesias @bedjango thx for sharing. Nice to see folks jumping on it! We comment possible solutions and learning on Friday ...\n", - "1 | 0 | Like this video https://t.co/CmKKSbXKhE\n", - "1 | 0 | I got Python Tricks: The Book (Work-In-Progress) from @dbader_org on @Gumroad: https://t.co/U54ZyzTEa0\n", - "1 | 0 | @techmoneykids challenge, recreate this graph ... https://t.co/hQ0SziiQDv\n", - "1 | 0 | #7 Python 3.6 is out, Sanic is a blazing web framework, and are failing our open source infrastructure? https://t.co/1632fQa3xU #python\n", - "1 | 0 | @CAChemEorg thanks for the share, happy New Year\n", - "0 | 1 | https://t.co/Dko7iUWysc Pybites weekly newsletter! Our latest posts on one handy page. Keep Calm and Code in #Python!\n", - "1 | 0 | @dbader_org loved automate boring, fluent py takes you to the next level. Also liked powerful python, mastering py. Started expert py 2nd ed\n", - "1 | 0 | “Boot Up 2017 with the #100DaysOfCode Challenge” @ka11away https://t.co/LLJkOWpGDt\n", - "0 | 1 | Learning from Python mistakes https://t.co/hPWVXt21p7 #python\n", - "0 | 1 | How to create a nice-looking HTML page of your #Kindle book highlights (notes) https://t.co/HKFK7inhUa #python\n", - "0 | 1 | Zip and ship, make an executable zipfile of your py project https://t.co/XBK5CSyKyP #python #packaging #pip\n", - "0 | 0 | @RobHimself1982 @Pybites100 excellent\n", - "0 | 0 | @jcastle13 @levlaz @Pybites100 Great!\n", - "0 | 0 | @RobHimself1982 @Pybites100 Please somebody stop him ;)\n", - "0 | 0 | @jcastle13 @levlaz @Pybites100 where did you get stuck?\n", - "0 | 0 | @malaga_python oh yeah!\n", - "0 | 0 | @davidleefox @TalkPython nice, enjoy :)\n", - "0 | 0 | @juzerali 14th of Feb + 50% discounts for early birds - https://t.co/fox6ul3OrK\n", - "0 | 0 | @juzerali Yes this will be a subscription service starting March\n", - "0 | 0 | @jcastle13 Ping @_juliansequeira\n", - "0 | 0 | @mohhinder Ouch haha\n", - "0 | 0 | @makgunay Cool, what did you learn?\n", - "0 | 0 | @Allwright_Data Hey Stephen, nice to hear, thanks. Enjoy and let us know how it goes ...\n", - "0 | 0 | @FabioRosado_ nice, hope you learned some more regex? we will add a part II\n", - "0 | 0 | @FabioRosado_ Awesome\n", - "0 | 0 | @anthonypjshaw Added a Bite :)\n", - "0 | 0 | @RobHimself1982 Movies, marvel or other?\n", - "0 | 0 | @jcastle13 well done\n", - "0 | 0 | @Arclight27 @freeCodeCamp Nice, which one?\n", - "0 | 0 | @anthonypjshaw lol sounds cool\n", - "0 | 0 | @FabioRosado_ @RobHimself1982 Nice book!\n", - "0 | 0 | @RobHimself1982 keep up the momentum\n", - "0 | 0 | @proudvisionary Thanks 😎\n", - "0 | 0 | @Thelostcircuit Way to go https://t.co/C3VfqTevQd\n", - "0 | 0 | @brochu121 how is it going?\n", - "0 | 0 | @jcastle13 good progress!\n", - "0 | 0 | @_juliansequeira @bbelderbos this is awesome, thanks :)\n", - "0 | 0 | @FabioRosado_ sure thing, thanks!\n", - "0 | 0 | @Arclight27 wow, which one(s)? hope you learned a thing or two!\n", - "0 | 0 | @jcastle13 cool, hang in there, the progress is in the struggling!\n", - "0 | 0 | @FabioRosado_ Do 1 hour a day and log (tweet) your progress, you will be amazed. Scripts can be split over days. Pr… https://t.co/Iu0qbkBj80\n", - "0 | 0 | @charlesforelle excluding stopwords ;)\n", - "0 | 0 | @jcastle13 Awesome!\n", - "0 | 0 | @diraol PR? https://t.co/Xthc6Pyncy\n", - "0 | 0 | @rsletten thanks Rob, will fix\n", - "0 | 0 | @BetterCodeHub Thanks guys!\n", - "0 | 0 | @anthonypjshaw Excel macros is where I started lol (b)\n", - "0 | 0 | Cool: “Dealing with datetimes like a pro in Python” by @irinatruong https://t.co/cbH5tcHFZ0 via @pythonbytes\n", - "0 | 0 | @FabioRosado_ Cool, glad they are well ... challenging :)\n", - "0 | 0 | @jeorryb Nice, good point: could do 30 days as well :)\n", - "0 | 0 | @jscottweber Working on a beginner py challenge, stay tuned. 100 days repo should have some easy scripts as well.\n", - "0 | 0 | @brnkimani @bbelderbos on the blog or with Python, or both?\n", - "0 | 0 | @fullstackpython Awesome! Cc @PacktPub\n", - "0 | 0 | New @lynda course: Dynamo for Revit: #Python Scripting - https://t.co/RIxSiNMVfJ\n", - "0 | 0 | @ChekosWH you are welcome\n", - "0 | 0 | @anthonypjshaw Awesome!\n", - "0 | 0 | @fullstackpython I have to go through it in detail. Was it recorded? What about using actual slides with prev and n… https://t.co/VQKR0qXDiQ\n", - "0 | 0 | @PacktPub Nice one. Vim saves me so much time and increases the joy of coding :)\n", - "0 | 0 | Remember this month's challenge #43 not only lets you make a bot to wow your colleagues making their lives easier,… https://t.co/AwU2zN3LQx\n", - "0 | 0 | Read the stdlib: deque https://t.co/g5Vzod8KNN - collections is one of our favorite #python modules and we really w… https://t.co/HvkPp1rwF9\n", - "0 | 0 | @python_alc cc @Pybonacci @python_es\n", - "0 | 0 | @sec_ua @python_alc @DEEPSUA @EPSAlicante Guapa la foto :)\n", - "0 | 0 | @mohhinder @python_alc @bbelderbos Nope but hope to have you in a live workshop one day :)\n", - "0 | 0 | @heroes_bot You are awesome\n", - "0 | 0 | @Dr_Meteo @Pybonacci @PacktPub buen punto! Esperamos un poco ... Neo, this is your last chance. After this, there i… https://t.co/1gHZjvAIO4\n", - "0 | 0 | @Pybonacci @PacktPub mola!\n", - "0 | 0 | @shravankumar147 why the poll?\n", - "0 | 0 | @PyImageSearch Thanks Adrian for the kind words\n", - "0 | 0 | @Pybonacci Gracias amigos\n", - "0 | 0 | Remember EMEA clock is going back 1 hour this weekend so you have a little bit more time to sneak in another PR ;) #Hacktoberfest\n", - "0 | 0 | @tezosevangelist @fullstackpython @python_tip Cool! Do you have any examples of apps you've made with Tornado?? - JS\n", - "0 | 0 | @brianokken Indeed. Not sure what happened. However you wouldn't install cookiecutter in each venv / project, would… https://t.co/xEGhjydc3K\n", - "0 | 0 | Steve Holden: What's In a Namespace? https://t.co/Zs4E1blriy\n", - "0 | 0 | @d4ntr0n Cool we did it, it was hard but so worth it, we build a big repo of scripts :) - good luck\n", - "0 | 0 | Building a Karma Bot with Python and the Slack API https://t.co/wyE4xAZlOX\n", - "0 | 0 | How to Learn #Python https://t.co/xnUk5r3QWN\n", - "0 | 0 | Module of the Week: Openpyxl - Automate Excel! https://t.co/Br04LGnSUW\n", - "0 | 0 | @dbader_org thanks: What's the best Python coding interview book? #PythonQ&A https://t.co/XHrAjdvuQm\n", - "0 | 0 | @mohhinder They have a checker themselves now?\n", - "0 | 0 | @esStackOverflow Esta muy bien, cada dia un ebook gratis, ya tengo toda una coleccion :)\n", - "0 | 0 | Awesome! https://t.co/rgiE9tqBeQ\n", - "0 | 0 | #Python Twitter Digest 2017 Week 40 https://t.co/mXMN6DExci\n", - "0 | 0 | @FabioRosado_ @dbader_org but we do have a related code challenge: https://t.co/oDbnM6fINT\n", - "0 | 0 | @FabioRosado_ @dbader_org rather :)\n", - "0 | 0 | I found my #FirstPullRequest: https://t.co/sG3yrYleXa. What was yours? https://t.co/8jdTVmPqrQ\n", - "0 | 0 | @jojociru Yep, you can PR any challenge at any time.\n", - "0 | 0 | And review post #2 for today: ⏎ ⏎ Code Challenge 37 - Automate a Task With @Twilio ⏎ https://t.co/9sRUOCXors ⏎ ⏎ PR any tim… https://t.co/nASWZXA4WJ\n", - "0 | 0 | Python Software Foundation: Join the #Python Developers Survey 2017: Share and learn about the #community https://t.co/mfzOadxxxm\n", - "0 | 0 | Simple is Better Than Complex: How to Create #Django Data Migrations https://t.co/oZJQNDkIxQ\n", - "0 | 0 | Weekly Python Chat: Linting Code https://t.co/DjTt6RUb4s\n", - "0 | 0 | PyCon 2018 Call for Proposals is Open! https://t.co/Nuorq6H9kR\n", - "0 | 0 | @JagDecoded @wesmckinn you will be when you read the book, as the library, very well done\n", - "0 | 0 | @practice_python nice site/initiative! We do code challenges as well.\n", - "0 | 0 | @PyConES Enjoy!\n", - "0 | 0 | @BecomingDataSci @Twitter Abusing likes as bookmarks too. You are not alone :)\n", - "0 | 0 | @esStackOverflow Yo (Bob)\n", - "0 | 0 | Yasoob Khalid: 13 #Python libraries to keep you busy https://t.co/0m1JKYiF2T\n", - "0 | 0 | Reuven Lerner: My favorite terrible Python error message https://t.co/Hy9X2UO4l8\n", - "0 | 0 | Mike Driscoll: PyDev of the Week: Daniel Roseman https://t.co/bnBoMDd7XZ\n", - "0 | 0 | Zato Blog: Building a protocol-agnostic #API for SMS text messaging with Zato and #Twilio https://t.co/EOuEq0CezQ\n", - "0 | 0 | Python Twitter Digest 2017 Week 37 https://t.co/GR9lekYXSH\n", - "0 | 0 | “WTF? What’s the Future and Why It’s Up To Us” by @timoreilly https://t.co/kQtqsFoC5l\n", - "0 | 0 | PyCon 2018 Launches New Site, Sponsorship Search https://t.co/VVqEu7cW4O\n", - "0 | 0 | Talk Python to Me: #129 Falcon: The bare-metal Python web framework https://t.co/7hsjXJw7gc\n", - "0 | 0 | #Python, un lenguaje simple para comprender la complejidad del mundo https://t.co/olz6apRsxu vía @nobbot\n", - "0 | 0 | @BecomingDataSci @fluentpython That is indeed a great book for oop, special methods and python overall!\n", - "0 | 0 | @Pybonacci Mola!\n", - "0 | 0 | @Pybonacci @PacktPub Nice one! Gracias @PacktPub\n", - "0 | 0 | Doug Hellmann: platform — System Version Information — PyMOTW 3 https://t.co/jfTXlKuUe4\n", - "0 | 0 | Mike Driscoll: PyDev of the Week: Jeff Forcier https://t.co/XLGyMmVqr1\n", - "0 | 0 | @19emtuck @python_tip cannot get more concise than your slice notation though ;)\n", - "0 | 0 | @19emtuck @python_tip I wondered the same?\n", - "0 | 0 | Mike Driscoll: #python dev of the Week: Matthias Bussonnier https://t.co/OPxtPtVKlx\n", - "0 | 0 | Chris Warrick: Spawning subprocesses smartly and securely https://t.co/ZdM8DlYaug\n", - "0 | 0 | @anthonypjshaw @pluralsight cool! congrats\n", - "0 | 0 | @seabisquet have you tried it?\n", - "0 | 0 | #PyCharm Community Edition and Professional Edition Explained: Licenses and More https://t.co/hdYXBtjo5V\n", - "0 | 0 | @PacktPub https://t.co/0xceRyfctY\n", - "0 | 0 | @tjholowaychuk Indeed! Ashamed of my old php code but also reason I got better. Have to stay hungry and curious, re… https://t.co/bvFJXrhnH8\n", - "0 | 0 | @_ericelliott @marlysson10 Thanks, good reminder to start my day with 20-30 min code / design book study.\n", - "0 | 0 | @Transition @kscottz Thanks. Keep practicing!\n", - "0 | 0 | Mike Driscoll: PyDev of the Week: Katherine Scott - ⏎ https://t.co/G8DeScYCEv -> \"if I can dream it up I can code it\" == why we love #Python\n", - "0 | 0 | Stein Magnus Jodal: Bringing the Mopidy music server to the browser https://t.co/r8R6hdRsuk\n", - "0 | 0 | Mauveweb: Fun and Games in #Python (Pycon PL Keynote) https://t.co/azngbasyAe\n", - "0 | 0 | @WinnieDaPooh83 @RealPython Oh yeah wanna try this one out. Maybe a popup to forcefully take breaks ;)\n", - "0 | 0 | https://t.co/IPAKBbBWiU\n", - "0 | 0 | @Pybonacci @PacktPub good one! - estamos muy pendientes eh ;)\n", - "0 | 0 | Awesome: Do your research online; create offline. https://t.co/VzKC2bSsX0\n", - "0 | 0 | @steven_braham Ok dank, goed te weten, welk hoofdstuk ben je begonnen? Het is idd nogal een dik boek\n", - "0 | 0 | @steven_braham thanks I will give it a try! :)\n", - "0 | 0 | @steven_braham Bit lengthy but you reckon worth the read then ... I did like soft skills a lot, hope it's not 'oude… https://t.co/vdRSR1Ssf6\n", - "0 | 0 | @mohhinder @bbelderbos Might need to give it another spin then ;)\n", - "0 | 0 | @mohhinder @bbelderbos I add most manually via the email notification. Did you get around the captcha to automate this further?\n", - "0 | 0 | @mohhinder @bbelderbos @PacktPub via my own Twitter account, PyBites only Python of course :)\n", - "0 | 0 | @bbelderbos @PacktPub @mohhinder here you go :)\n", - "0 | 0 | @mohhinder Good ones, will add. Thanks\n", - "0 | 0 | @Dan_Jeffries1 @mohhinder talking about math, found this article\n", - "0 | 0 | @python_tip Python is so elegant :)\n", - "0 | 0 | @aeroaks @techmoneykids oops too caught up making a banner ;) ⏎ Her you go: https://t.co/9Rb7wdgSuZ\n", - "0 | 0 | @EA1HET @bbelderbos anything specific regarding Flask?\n", - "0 | 0 | @hannelita Interesting, bookmarked some links, thanks\n", - "0 | 0 | Check out aosabook chapter 20 if you want to learn more about #SQLAlchemy\n", - "0 | 0 | @pythonbytes We definitely like Pelican :)\n", - "0 | 0 | Eradicating Non-Determinism in Tests ➙ https://t.co/vu21k8OtaT\n", - "0 | 0 | Semaphore Community: Testing Python Applications with Pytest https://t.co/c0ErzApiu0\n", - "0 | 0 | New on PyBites: #Python Twitter digest 2017 week 31 https://t.co/wXpkNGVBot\n", - "0 | 0 | @steven_braham @mosenturm Cool what are you building?\n", - "0 | 0 | @steven_braham @mosenturm To heroku?\n", - "0 | 0 | PyCharm: Using Docker Compose on Windows in PyCharm https://t.co/5fRCAkndSi\n", - "0 | 0 | Continuum Analytics News: What’s New with Anaconda in 2017? https://t.co/HxWogmATZA\n", - "0 | 0 | Anwesha Das: Developers, it's License but it's easy https://t.co/mx9XH3tovz\n", - "0 | 0 | Amjith Ramanujam: FuzzyFinder - in 10 lines of Python https://t.co/Po2cgy19We\n", - "0 | 0 | cookiecutter-simple-django - A cookiecutter template for creating reusable #Django projects quickly - thanks @mohhinder\n", - "0 | 0 | Peter Bengtsson: Find static files defined in django-pipeline but not found https://t.co/1s7t5gIigN\n", - "0 | 0 | Will Kahn-Greene: Soloists: code review on a solo project https://t.co/QhENJrTYdm\n", - "0 | 0 | Doug Hellmann: hmac — Cryptographic Message Signing and Verification — PyMOTW 3 https://t.co/YyGurvyh9m\n", - "0 | 0 | PyBites has a new project page: https://t.co/s2HIcgKVle\n", - "0 | 0 | from @PyBites import newsletter - https://t.co/ml4U4yEqHF - #Python #Articles #Challenges #News\n", - "0 | 0 | Our first #django app: https://t.co/qMU0y7UMd7 - let's wrap an article around it ...\n", - "0 | 0 | @bboe Cool, already getting PR submissions, we are having a play this weekend, the docs are great, thanks for building this.\n", - "0 | 0 | Nice, tomorrow with breakfast :) https://t.co/gb0Ji3RfaF\n", - "0 | 0 | @techmoneykids Can't wait :)\n", - "0 | 0 | @mohhinder Thanks for the kind words Martin\n", - "0 | 0 | @heroes_bot you're the coolest bot so far :)\n", - "0 | 0 | @mohhinder Using pycharm? Still need to give it a serious go, too used to Vim and tweaking vimrc with flake8 etc\n", - "0 | 0 | @mohhinder @babetoduarte curious too now :)\n", - "0 | 0 | @mohhinder ah I see what you mean now, yeah the namespace import is pretty neat, no?\n", - "0 | 0 | @haxor ... ah and I want to read your book again as well, it taught me a lot, thanks for writing it.\n", - "0 | 0 | @haxor Cool, thanks for reminding me to get that book. The other two O'Reilly books I have at close reach are Fluen… https://t.co/uU8Ye9Mp5N\n", - "0 | 0 | @mohhinder Thanks for updating the PR, will merge now\n", - "0 | 0 | @mohhinder Thanks, glad it was helpful\n", - "0 | 0 | Free ebook today: Mastering #Python Design Patterns ⏎ https://t.co/t2aLcaALdy ⏎ ⏎ Thanks @PacktPub ⏎ ⏎ Notification script: ⏎ https://t.co/4YErFZvrKm\n", - "0 | 0 | @mohhinder Cool! Challenges don't expire :) ⏎ ⏎ Build something cool and we will update the review post.\n", - "0 | 0 | From Script to Project part 1. - Building a Karma Bot with #Python and the #Slack API - https://t.co/GKpve6hH1J\n", - "0 | 0 | New @lynda course: #Python Projects - https://t.co/tC4Dx6FACn\n", - "0 | 0 | @Mooredvdcoll ok thanks, will look into it\n", - "0 | 0 | If you enjoy our code challenges feel free to submit ideas here: https://t.co/vpEQb5lAIG\n", - "0 | 0 | @Mooredvdcoll Cool, I always seeing it with pip install flask but have not looked in detail yet\n", - "0 | 0 | @ahnee3773 Woohoo! How are you progressing with this? PyBites is built with Pelican running on github! Good luck! - Julian\n", - "0 | 0 | @techmoneykids @anthonypjshaw @bbelderbos @dbader_org Indeed!\n", - "0 | 0 | @anthonypjshaw @techmoneykids @bbelderbos @dbader_org That's cool, gonna try it\n", - "0 | 0 | @techmoneykids @bbelderbos @anthonypjshaw @dbader_org LOL, we can set the geo location on our tweets, trying it now (Spain == Bob)\n", - "0 | 0 | @abbyleighanneco cool thanks!\n", - "0 | 0 | @abbyleighanneco ok http://127.0.0.1:8080 - index.html loads, isValidZip() validation works but not getting anything for valid zips\n", - "0 | 0 | @abbyleighanneco var weather = xyz that is ... (might need to update readme). sorry new to JS deploy I ended up np… https://t.co/dpxMfI2Lu3\n", - "0 | 0 | @abbyleighanneco cool. hi, Bob here (sorry we share this account). I needed to create a config file - just with this right? var key = xyz\n", - "0 | 0 | @abbyleighanneco Awesome! Is the code on github or anything like that??\n", - "0 | 0 | @abbyleighanneco Open weather api?\n", - "0 | 0 | Still overwhelmed by the amount of #PyCon2017 talks? Here is a good filter to apply ... https://t.co/ZO9MMAWkLs\n", - "0 | 0 | @mohhinder thanks!\n", - "0 | 0 | Why we believe in doing code challenges ... https://t.co/Xpwe36vlIt\n", - "0 | 0 | @heroes_bot thank you @heroes_bot :)\n", - "0 | 0 | Wow really cool and all that in few LOC https://t.co/C9bNrl0yxK\n", - "0 | 0 | @Mooredvdcoll Thanks\n", - "0 | 0 | @wonderfulboyx Congrats. Will review / feature tomorrow. Nice you joined our challenges :)\n", - "0 | 0 | @treyhunner this poster :) https://t.co/F0cyNCKwg0\n", - "0 | 0 | @PacktPub @Pybonacci Nice, will retweet this promo\n", - "0 | 0 | @treyhunner @CurrentTime Thanks will try that one\n", - "0 | 0 | @treyhunner @CurrentTime Cool, building bots is fun. Did you see the poster at Pycon? Do you run it as a unix cronj… https://t.co/wGfxk69AoT\n", - "0 | 0 | @mohhinder good to hear, hope you learned a few new things\n", - "0 | 0 | @InformIT @raymondh Excellent course, highly recommended\n", - "0 | 0 | Our new #Python Code Challenge is up, wow #21 already: Electricity Cost Calculation App - https://t.co/3dshs4PgeP\n", - "0 | 0 | @techmoneykids dude you're going strong lol\n", - "0 | 0 | @techmoneykids you like that cat picture?\n", - "0 | 0 | @jiffyclub Saw that one, awesome\n", - "0 | 0 | @mohhinder I missed a talk for that one ;)\n", - "0 | 0 | @mohhinder I hope it is useful in this format. Enjoy\n", - "0 | 0 | @mohhinder Thanks bit rushed as I was at pycon. Click is neat yes :)\n", - "0 | 0 | Code Challenge 19 - Post to Your Favorite API - Review https://t.co/QKVTxP5vho\n", - "0 | 0 | @amjithr Awesome, thanks\n", - "0 | 0 | @datapythonista Enjoy! Greetings from pycon portland :)\n", - "0 | 0 | @nkantar That's awesome\n", - "0 | 0 | @nkantar Me too haha, enjoy\n", - "0 | 0 | @TheAhmedSherif thanks for the shout out, hope this is useful\n", - "0 | 0 | @MPeucker hope you like it, thanks for signing up\n", - "0 | 0 | @nkantar it was paid swag, not part of the free bag I believe\n", - "0 | 0 | @nkantar It was part of the sign up package, not sure if you can still buy them separately, they did have a lot this morning ...\n", - "0 | 0 | @mohhinder @python_tip For the HW profiler challenge? ;)\n", - "0 | 0 | Wow: Sorting 2 Tons of Lego, The software Side - https://t.co/ENk92Gvd7B\n", - "0 | 0 | @audioholyx lol\n", - "0 | 0 | Our weekly #python twitter digest is up - https://t.co/Zp56XtNkjQ\n", - "0 | 0 | @techmoneykids @bbelderbos Good work mate, taking them in piece by piece\n", - "0 | 0 | @dbader_org Thanks Dan :)\n", - "0 | 0 | @importpython Thanks, surely will. It's fun and very rewardig! You too with your great newsletter, it's nice to get this weekly digest.\n", - "0 | 0 | @Yes_I_Know_IT @python_tip Thanks, good to know\n", - "0 | 0 | @audioholyx Nice to hear. Keep us posted :)\n", - "0 | 0 | @audioholyx Thanks. Ideas, feedback welcome. Are you doing the 100days challenge as well?\n", - "0 | 0 | Mike Driscoll: PyDev of the Week: Paweł Piotr Przeradowski https://t.co/MId9ivX7pp #python\n", - "0 | 0 | @ZurykMalkin cool, what are you building?\n", - "0 | 0 | from @PyBites import newsletter - https://t.co/DNqzR6CqHp - #python #Articles #Challenges #News\n", - "0 | 0 | PyBites: Twitter digest 2017 week 14 https://t.co/U5nMD1LfDz #python\n", - "0 | 0 | Weekly Python StackOverflow Report: (lxviii) stackoverflow python report https://t.co/MORAPbkNbN #python\n", - "0 | 0 | @gwuah_ haha good point, how do you keep up with JS?!\n", - "0 | 0 | @python_tip maybe you can link to it here? https://t.co/5Q6P5E3CtR - just used it to check before submitting. thanks\n", - "0 | 0 | @rkarabut Ah great idea! Will do the same in the AM. I wonder if they've pinched anything else. Thx for catching th… https://t.co/boehqd6lYd\n", - "0 | 0 | @rkarabut Oh wow! That's crazy! I wonder why they'd bother tbh. Might need to look into this tomorrow. Worst case,… https://t.co/yJwZCIeIPR\n", - "0 | 0 | Wow: solver for the eight queens puzzle with itertools permutations - https://t.co/nH8f4nsDiH\n", - "0 | 0 | Who joins us in our #code challenges? ⏎ ⏎ We are starting to get a nice set of exercises to hone your #python skills: ⏎ ⏎ https://t.co/nugm84MhkB\n", - "0 | 0 | PyBites – Twitter digest 2017 week 12 - some cool #python stuff we picked up this week https://t.co/iLC1A6c7k0\n", - "0 | 0 | PyBites Code Challenge 11 - Generators for Fun and Profit - Review - click around @pybites: each #theme its color :) https://t.co/1RxpGlhI2s\n", - "0 | 0 | PyBites – Simple API Part 2 - Building a Deep Work Logger with Flask, Slack and Google Docs https://t.co/liojgkJkfd\n", - "0 | 0 | next(PyBites CodeChallenge) ... tictactoe ... stay tuned. Good weekend\n", - "0 | 0 | What #python project will you be working on this weekend?\n", - "0 | 0 | Nice project: Feed2tweet 1.0, tool to post RSS feeds to Twitter, released https://t.co/fjpk1lM2oP #python\n", - "0 | 0 | @ArtSolopov @python_tip seriously? what version? cannot reproduce that in 2 nor 3 :)\n", - "0 | 0 | Very nice #Data Analysis: How to mine newsfeed data and extract interactive insights in #Python - https://t.co/hkXrQcZRBd\n", - "0 | 0 | EuroPython 2017: Welcome our new Logo - nice logo https://t.co/eTK0yGfUm3\n", - "0 | 0 | New PyBites article: Module of the Week - Requests-cache for Repeated API Calls - https://t.co/ATSDpW48q3 #python #APIs\n", - "0 | 0 | @RealPython thanks for the RT, btw enjoying your excellent tutorials on web/db/flask, added a link to our resources page.\n", - "0 | 0 | PyBites weekly #python news digest is out: https://t.co/YnrFElKHDc\n", - "0 | 0 | PyBites – 5 min guide to PEP8 - for .vimrc: autocmd FileType python map <buffer> ,f :call Flake8()<CR> #flake8 #vim https://t.co/8LoAzqjPEl\n", - "0 | 0 | @Pybonacci +1: speed, power, vimrc ... nmap comma + f para checkear flake8 :)\n", - "0 | 0 | Nice trick, similarly we use shell shortcut $_ - it all saves time! https://t.co/uhUUOs2Baq\n", - "0 | 0 | @dbader_org thanks for this Dan, it inspired us to start writing some context managers in our next challenge https://t.co/roiKPq21eg\n", - "0 | 0 | PyBites of the Week - https://t.co/jsZGCeE5qR\n", - "0 | 0 | @squeekyhoho Wow 400k! Certainly a feat! Go npm!\n", - "0 | 0 | @TalkPython will keep an eye :) https://t.co/FnBkf0cPGo (ironically started with requests/bs4, but could use stdlib, batteries included :) )\n", - "0 | 0 | @richardburcher Flask makes building APIs pretty easy as well. Had some fun with it yesterday.\n", - "0 | 0 | Hi, my name is PyBites. I've been writing Python for 0.2 years and I (will) never remember diff between re group vs groups on match object\n", - "0 | 0 | @richardburcher nice one mate! How great does it feel? More to it than you'd think! Looking forward to diving into more #flask myself! - JS\n", - "0 | 0 | @richardburcher what did you build?\n", - "0 | 0 | To create (subclass) your own exceptions or not ... https://t.co/6eRRD55tqo\n", - "0 | 0 | @dbader_org great video, do you see enough use cases for staticmethod vs regular function in module? See note in fluent python.\n", - "0 | 0 | Django Forms https://t.co/6nfBl6wWMx #python\n", - "0 | 0 | Twitter digest 2017 week 07 https://t.co/BY4G78jLwe #python\n", - "0 | 0 | Twitter digest 2017 week 07 https://t.co/BY4G78jLwe #python\n", - "0 | 0 | @bbelderbos @raymondh @techmoneykids we get 1st of March - https://t.co/ZnfBIE27Ih - pretty soon :)\n", - "0 | 0 | How to Order Dict Output in Python https://t.co/nq4FR9F5PX #python\n", - "0 | 0 | The definitive guide on how to use static, class or abstract methods in #Python https://t.co/n8imiKdlqv\n", - "0 | 0 | #99 Morepath: Super Powered Python Web Framework https://t.co/3xPnSAjqBB #python\n", - "0 | 0 | PyCaribbean Chat https://t.co/FWi67PXLuF #python\n", - "0 | 0 | #13 Python making the move to GitHub and Dropbox is stepping back from Pyston https://t.co/Z4iGIQjbZv #python\n", - "0 | 0 | Writing Clean Python With Namedtuples https://t.co/OUx89PN8mL #python\n", - "0 | 0 | Shelve It! https://t.co/wwcjvKbPJW #python\n", - "0 | 0 | PyBites of the Week - https://t.co/TwyRXizqSA\n", - "0 | 0 | Twitter digest 2017 week 06 https://t.co/6miYlYGGb1 #python\n", - "0 | 0 | Code Challenge 05 - Twitter data analysis Part 2: similar tweeters - review https://t.co/JVmXtTPoim #python\n", - "0 | 0 | Twitter digest 2017 week 06 https://t.co/6miYlYGGb1 #python\n", - "0 | 0 | https://t.co/t2aLcaSm56 free #pandas ebook today!\n", - "0 | 0 | https://t.co/pw64b7E6m2 think python 2nd ed (py3)\n", - "0 | 0 | @raymondh cool ... I get 2017-02-25 17:52:34 - fun to see the different replies. are we allowed to post our methods? interested to see ...\n", - "0 | 0 | #12 Expanding your Python mental model and serving millions of requests per second with Python https://t.co/gssoadNjIG #python\n", - "0 | 0 | Free @PacktPub ebook: #Python 3 Text Processing with NLTK 3 Cookbook https://t.co/t2aLcaALdy - might be useful for this week's challenge :)\n", - "0 | 0 | Nice article @SuConant - bookmarked a couple of courses https://t.co/gRx0wzCe3P\n", - "0 | 0 | From beginner to pro: Python books, videos and resources https://t.co/8bpGOQ13pz #python\n", - "0 | 0 | PyBites of the Week - https://t.co/pthMv8UBkn\n", - "0 | 0 | Twitter digest 2017 week 05 https://t.co/S8EhXDYaRP #python\n", - "0 | 0 | Twitter digest 2017 week 05 https://t.co/S8EhXDYaRP #python\n", - "0 | 0 | python tricks: https://t.co/MTei4wkOqe\n", - "0 | 0 | Python Weekly - Issue 280 - https://t.co/8MTwN2DKTV\n", - "0 | 0 | Send Advanced Emails with Python MIME Submodules - https://t.co/qm33tgrkTn\n", - "0 | 0 | PyTennessee Chat https://t.co/q7nePuTgP9 #python\n", - "0 | 0 | Python Tricks book review https://t.co/3QyKlVzpg6 #python\n", - "0 | 0 | MySQL for #Python - free #packt ebook today - https://t.co/t2aLcaALdy\n", - "0 | 0 | Why Learn Python? Here Are 8 Data-Driven Reasons https://t.co/a1M0ztYp4L #python\n", - "0 | 0 | Python Tricks book review https://t.co/3QyKlVzpg6 #python\n", - "0 | 0 | PyBites of the Week - https://t.co/DFTz3e20KA\n", - "0 | 0 | Code Challenge 04 - Twitter data analysis Part 1: get the data https://t.co/8dRJyFKTey #python\n", - "0 | 0 | Twitter digest 2017 week 04 https://t.co/L3njBuBats #python\n", - "0 | 0 | Code Challenge 03 - PyBites blog tag analysis - Review https://t.co/xvcLQBbvup #python\n", - "0 | 0 | Send Emails with Python smtplib https://t.co/FlXEhuosuY\n", - "0 | 0 | “Understanding the underscore( _ ) of Python” by @mingrammer https://t.co/zgiSGBPd3s\n", - "0 | 0 | why you should (tech) blog: a. meet and learn from other developers, b. share knowledge with the wider community, c. refer back to own notes\n", - "0 | 0 | Code Challenge 03 - PyBites blog tag analysis - Review https://t.co/wKHxFsXTtm #python\n", - "0 | 0 | #96 Exploring Awesome Python https://t.co/iYz6nWnHRp #python\n", - "0 | 0 | Awesome: pelican-ipynb - Pelican plugin for blogging with #jupyter / IPython Notebooks\n", - "0 | 0 | PyBites of the Week - https://t.co/J6wyRMM1U0\n", - "0 | 0 | Code Challenge 03 - PyBites blog tag analysis https://t.co/LJ1px8rT88 #python\n", - "0 | 0 | Twitter digest 2017 week 03 https://t.co/msNAGxpC4b #python\n", - "0 | 0 | Imgur Post - 20 years of Moore's law, wow https://t.co/NvXgMlbBQu\n", - "0 | 0 | Python Iteration https://t.co/lrP0hVoaWX #python\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "0 | 0 | #95 Grumpy: Running Python on Go https://t.co/LGQl1HJfZM #python\n", - "0 | 0 | Errors should never pass silently https://t.co/Efy2AIQlzY #python\n", - "0 | 0 | Python 3.5.3 and 3.4.6 are now available https://t.co/pUp21JKnk9 #python\n", - "0 | 0 | Assert Statements in Python https://t.co/Lx6l0AkanQ #python\n", - "0 | 0 | I just signed up for Hacker Newsletter so I can keep up with all the great articles on Hacker News. https://t.co/OVNcVE2K0m\n", - "0 | 0 | Teaching Python & Python Tutor https://t.co/fq1X2KyJIS #python\n", - "0 | 0 | Python 3.5.3 and 3.4.6 are now available https://t.co/pUp21K1YbH #python\n", - "0 | 0 | Code Challenge 02 - Word Values Part II - a simple game https://t.co/BzKQg8KC1L #python\n", - "0 | 0 | PyBites of the Week - https://t.co/jhwwHWcxZt\n", - "0 | 0 | PyBites of the Week - https://t.co/31TdXLG8UT\n", - "0 | 0 | Check out this cool episode: https://t.co/VtXiXwY8aA - interesting episode about SQLAlchemy https://t.co/CMUzapsLqG\n", - "0 | 0 | Vlad's blog – What every Python project should have https://t.co/Yfe1rS1tHh\n", - "0 | 0 | cookiecutter: utility that creates projects from cookiecutters (project templates). E.g. Python package projects https://t.co/EMxC7CHur0\n", - "0 | 0 | Code Challenge 01 - Word Values Part I - Review https://t.co/ymC1HcbaLt #python\n", - "0 | 0 | Twitter digest 2017 week 02 https://t.co/5TsAOp6Jcx #python\n", - "0 | 0 | #94 Guarenteed packages via Conda and Conda-Forge https://t.co/6pKEQ9t89J #python\n", - "0 | 0 | Create a Simple Web Scraper with BeautifulSoup4 https://t.co/PY4JSvWIZw #python\n", - "0 | 0 | Comprehending Python’s Comprehensions https://t.co/we9hO354uv #python\n", - "0 | 0 | #94 Guarenteed packages via Conda and Conda-Forge https://t.co/6pKEQ9t89J #python\n", - "0 | 0 | https://t.co/s5rEdcKZin talk about #data and #nlp, so cool we can watch all #pycon videos online, such a great way to learn\n", - "0 | 0 | @kennethreitz same feeling yesterday :)\n", - "0 | 0 | Iterators https://t.co/n3MXkT0Gr3 #python\n", - "0 | 0 | Code Challenge 01 - Word Values Part I https://t.co/h4N81Ll6ZC #python\n", - "0 | 0 | Beautiful, idiomatic Python https://t.co/Gft5OaBkon #python\n", - "0 | 0 | refactor ugly switch statement in #python https://t.co/2Plq0XHVAu\n", - "0 | 0 | PyBites of the Week - https://t.co/Lynq8vE7Tb\n", - "0 | 0 | @Duvancarrez we're a new blog rather. We added challenges as we think they are a fun and great way to learn more Python.\n", - "0 | 0 | Twitter digest 2017 week 01 https://t.co/lRZrfmB9QN #python\n", - "0 | 0 | https://t.co/WZ4lad2oJv - go running python\n", - "0 | 0 | Twitter digest 2017 week 01 https://t.co/lRZrfmB9QN #python\n", - "0 | 0 | Code Challenge #01 - code review https://t.co/UjR3G68eSq #python\n", - "0 | 0 | https://t.co/szO1tTdMre good explanation of iterators and iterables\n", - "0 | 0 | Python 3.5.3rc1 and Python 3.4.6rc1 are now available https://t.co/8XP5CWH6XF #python\n", - "0 | 0 | #93 Spreading Python through the sciences with Software Carpentry https://t.co/38EBc45KL9 #python\n", - "0 | 0 | A great book that makes algorithms accessible https://t.co/2tkf4ZWiJA #python\n", - "0 | 0 | interesting #python #dict https://t.co/BTXxPWNYVc https://t.co/9d1RgcrhXK\n", - "0 | 0 | @_egonschiele ML, more confident tackling it after your book, maybe idea for part II? (Applying algorithms to ML problems)\n", - "0 | 0 | Python 3.5.3rc1 and Python 3.4.6rc1 are now available https://t.co/8XP5CWH6XF #python\n", - "0 | 0 | #python #excel https://t.co/lGuSaOFaio\n", - "0 | 0 | 3.6 new features https://t.co/6atEam0H9i #python\n", - "0 | 0 | @Pybonacci violaciones mas dramaticas?\n", - "0 | 0 | Don't Let Indentation Catch You Out https://t.co/u2iR5XPKXS #python\n", - "0 | 0 | 3 best #python books https://t.co/fDYkPZ07S7\n", - "0 | 0 | #92 Bonus: Python Bytes Crossover: Python 3.6 is going to be awesome, Kite: your friendly co-developing AI https://t.co/0gazCa1EpZ #python\n", - "0 | 0 | Automate Tweeting: how to build a Twitterbot https://t.co/y75ZCLBJaB #python\n", - "0 | 0 | The Difference Between “is” and “==” in Python https://t.co/6HCZugHkQS #python\n", - "0 | 0 | #91 Top 10 Data Science Stories of 2016 https://t.co/Aao9ZJFLW8 #python\n", - "0 | 0 | one place for all #python videos, awesome - https://t.co/QgxtrlNtwW\n", - "0 | 0 | #vim #python environment https://t.co/WFzvrdQX5j\n", - "0 | 0 | Quick Automate the Boring Stuff Review https://t.co/XI8EHWX4Ks - great #book to start learning #python #pybites\n", - "0 | 0 | Get a weekly digest from a Pelican blog https://t.co/uPTtW5AYKh #python #pelican #blog\n", - "0 | 0 | 2016 py articles and useful books https://t.co/apNLDseUA1 #python #pybooks #tips\n", - "0 | 0 | The Beauty of Python Virtualenvs https://t.co/JI0E2vA1ub #python #virtualenv\n", - "0 | 0 | Read the stdlib: deque https://t.co/l0q89ffPM5 #python #datatypes #deque\n" - ] - } - ], - "source": [ - "excl_rts = [tweet for tweet in tweets if not tweet.text.startswith('RT')]\n", - "top_10 = sorted(excl_rts, key=lambda tw: (tw.likes + tw.rts)/2, reverse=True)\n", - "\n", - "fmt = '{likes:<5} | {rts: <5} | {text}'\n", - "print(fmt.format(likes='❤', rts='♺', text='✎'))\n", - "print('-'*100)\n", - "for tw in top_10:\n", - " print(fmt.format(likes=tw.likes, rts=tw.rts, text=tw.text.replace('\\n', ' ⏎ ')))" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "What are our common hashtags and mentions? " - ] - }, - { - "cell_type": "code", - "execution_count": 14, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[('#python', 908),\n", - " ('#100daysofcode', 147),\n", - " ('#django', 71),\n", - " ('#flask', 67),\n", - " ('#news', 28),\n", - " ('#api', 24),\n", - " ('#pandas', 21),\n", - " ('#challenges', 20),\n", - " ('#pycon2017', 20),\n", - " ('#articles', 19),\n", - " ('#jupyter', 18),\n", - " ('#packtpublishing', 14),\n", - " ('#programming', 12),\n", - " ('#vim', 12),\n", - " ('#code', 12),\n", - " ('#pytest', 11),\n", - " ('#machinelearning', 11),\n", - " ('#python3', 11),\n", - " ('#tensorflow', 11),\n", - " ('#docker', 10)]" - ] - }, - "execution_count": 14, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "hashtag = re.compile(r'#[-_A-Za-z0-9]+')\n", - "mention = re.compile(r'@[-_A-Za-z0-9]+')\n", - "\n", - "all_tweets = ' '.join([tw.text.lower() for tw in tweets])\n", - "all_tweets_excl_rt = ' '.join([tw.text.lower() for tw in tweets if not tw.text.startswith('RT')])\n", - "\n", - "hashtags = hashtag.findall(all_tweets)\n", - "cnt = Counter(hashtags)\n", - "cnt.most_common(20)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "❤ #Python ❤ #100DaysOfCode ❤" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[('@python_tip', 173),\n", - " ('@pybites', 158),\n", - " ('@packtpub', 95),\n", - " ('@talkpython', 94),\n", - " ('@dbader_org', 92),\n", - " ('@realpython', 77),\n", - " ('@bbelderbos', 77),\n", - " ('@techmoneykids', 66),\n", - " ('@pythonbytes', 57),\n", - " ('@fullstackpython', 53),\n", - " ('@mohhinder', 51),\n", - " ('@brianokken', 38),\n", - " ('@anthonypjshaw', 33),\n", - " ('@robhimself1982', 32),\n", - " ('@mkennedy', 30)]" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mentions = mention.findall(all_tweets)\n", - "cnt = Counter(mentions)\n", - "cnt.most_common(15)" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[('@packtpub', 54),\n", - " ('@techmoneykids', 50),\n", - " ('@mohhinder', 47),\n", - " ('@pybites', 36),\n", - " ('@python_tip', 35),\n", - " ('@dbader_org', 33),\n", - " ('@bbelderbos', 30),\n", - " ('@anthonypjshaw', 17),\n", - " ('@lynda', 16),\n", - " ('@realpython', 16),\n", - " ('@pybonacci', 14),\n", - " ('@robhimself1982', 13),\n", - " ('@talkpython', 13),\n", - " ('@ferrorodolfo', 12),\n", - " ('@pythonbytes', 10)]" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "mentions = mention.findall(all_tweets_excl_rt)\n", - "cnt = Counter(mentions)\n", - "cnt.most_common(15)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# !pip install wordcloud\n", - "# just for demo: you can run shell commands with ! \n", - "# this dependency you should already have after pip install -r requirements.txt" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [], - "source": [ - "all_tweets_excl_rts_mentions = ' '.join([tw.text.lower() for tw in tweets \n", - " if not tw.text.startswith('RT') and not tw.text.startswith('@')])" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Andreas Mueller's [wordcloud](https://github.com/amueller/word_cloud) is awesome, you just feed it a text (here: all our concatenated tweets) and a mask image and it creates a word cloud on top of it:" - ] - }, - { - "cell_type": "code", - "execution_count": 19, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 19, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pb_mask = np.array(Image.open(\"pybites.png\"))\n", - "stopwords = set(STOPWORDS)\n", - "\n", - "stopwords.add('co')\n", - "stopwords.add('https')\n", - "\n", - "wc = WordCloud(background_color=\"white\", max_words=2000, mask=pb_mask,\n", - " stopwords=stopwords)\n", - "\n", - "wc.generate(all_tweets_excl_rts_mentions)" - ] - }, - { - "cell_type": "code", - "execution_count": 21, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(-0.5, 2499.5, 2499.5, -0.5)" - ] - }, - "execution_count": 21, - "metadata": {}, - "output_type": "execute_result" - }, - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2oAAANSCAYAAAAUAj3LAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3deTpFea3/fvOa9Nb8q3RwMYYAAMxuzsari7XFqRUsgGQ3+gLhShS/GCumCIEskQSe3u7Jgdgx7Y9l2+sir9687RxVtdaAANoAH0ADmY3ydmoruz0rz5VqEyf3me8zzGe4+IiIiIiIisDvtNH4CIiIiIiIh8lIKaiIiIiIjIilFQExERERERWTEKaiIiIiIiIitGQU1ERERERGTFKKiJiIiIiIisGAU1ERERERGRFaOgJiIiIiIismIU1ERERERERFZM+E0fwOfw3/QBiIiIiIiIPCPzvO5IK2oiIiIiIiIrRkFNRERERERkxSioiYiIiIiIrBgFNRERERERkRWjoCYiIiIiIrJiFNRERERERERWjIKaiIiIiIjIilFQExERERERWTEKaiIiIiIiIitGQU1ERERERGTFKKiJiIiIiIisGAU1ERERERGRFaOgJiIiIiIismIU1ERERERERFaMgpqIiIiIiMiKUVATERERERFZMQpqIiIiIiIiK0ZBTUREREREZMUoqImIiIiIiKwYBTUREREREZEVo6AmIiIiIiKyYhTUREREREREVoyCmoiIiIiIyIpRUBMREREREVkxCmoiIiIiIiIrRkFNRERERERkxSioiYiIiIiIrBgFNRERERERkRWjoCYiIiIiIrJiFNRERERERERWjIKaiIiIiIjIilFQExERERERWTEKaiIiIiIiIitGQU1ERERERGTFKKiJiIiIiIisGAU1ERERERGRFaOgJiIiIiIismIU1ERERERERFaMgpqIiIiIiMiKUVATERERERFZMQpqIiIiIiIiK0ZBTUREREREZMUoqImIiIiIiKwYBTUREREREZEVo6AmIiIiIiKyYhTUREREREREVoyCmoiIiIiIyIpRUBMREREREVkxCmoiIiIiIiIrRkFNRERERERkxSioiYiIiIiIrBgFNRERERERkRWjoCYiIiIiIrJiFNRERERERERWjIKaiIiIiIjIilFQExERERERWTEKaiIiIiIiIitGQU1ERERERGTFKKiJiIiIiIisGAU1ERERERGRFaOgJiIiIiIismIU1ERERERERFaMgpqIiIiIiMiKUVATERERERFZMQpqIiIiIiIiK0ZBTUREREREZMUoqImIiIiIiKwYBTUREREREZEVo6AmIiIiIiKyYhTUREREREREVoyCmoiIiIiIyIpRUBMREREREVkxCmoiIiIiIiIrRkFNRERERERkxSioiYiIiIiIrBgFNRERERERkRWjoCYiIiIiIrJiFNRERERERERWjIKaiIiIiIjIilFQExERERERWTEKaiIiIiIiIitGQU1ERERERGTFKKiJiIiIiIisGAU1ERERERGRFaOgJiIiIiIismIU1ERERERERFaMgpqIiIiIiMiKUVATERERERFZMQpqIiIiIiIiK0ZBTUREREREZMUoqImIiIiIiKwYBTUREREREZEVo6AmIiIiIiKyYhTUREREREREVoyCmoiIiIiIyIpRUBMREREREVkxCmoiIiIiIiIrRkFNRERERERkxSioiYiIiIiIrBgFNRERERERkRWjoCYiIiIiIrJiFNRERERERERWjIKaiIiIiIjIilFQExH5I1AWFVXlvunDEBERkWcUftMHICIiX01VOR7dOyZJI4qiIm3EAEzHCxrNmMUiZzpe0mwlpI2YKA5YzHPiOMRYw3KRs7XTJ0mjb/iZiIiIyGMKaiIif+CKvOSDd/fp9ZtkWYk1hrKqyBYF/WGLk+MprXZKUVTMpxnOO5bzgiSNSBoRew9HtDupgpqIiMgKMd77b/oYPstKH5yIyCrw3jObLgmCgLKssMbgzn+3h2HA/qMR/WGbJI0oy4owDKgqh3eeKA443BszWG/T7qTf8DMRERH5g2ee2x0pqImIfLs9/j1vzNNfOz7v6yIiIvLMFNRERGS1OOdw7sPQ573HGIOrHGXlCMOAPC+pKkeaRhhjsPbD63nvCQKrwCgiIn/IntuLmPaoiYh8A1zl6mASBp9+HVeXJwZhwGw8J22lBMFHm/UuZxn79464/OIWjz44YPPaGmkz+ch1vPdUZUUQBp+5qvZ51/k8D+6f8MF7BzQaEVEcUpWOVjthMl6SpCGXLg85OhxTnHeg7HRSrLU457CBpdVK2NrufanHFhER+bZRUBMR+T3LFjn3f/eIdr9J3Iwp84rD+8cs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\n", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "plt.figure(figsize=(15, 15))\n", - "plt.imshow(wc, interpolation=\"bilinear\")\n", - "plt.margins(x=0, y=0)\n", - "plt.axis(\"off\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Second and third day - practice, practice, practice:" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "We covered Twitter data analysis quite extensively on our blog. Below I am listing a combination of tools and challenges you can work on. As they are not small projects I bundled day 2 and 3 to focus on getting one working." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "- (__PyBites preferred__) [How we Automated our 100DaysOfCode Daily Tweet](https://pybit.es/100days-autotweet.html) - seriously: automate this task, it makes your life easier freeing you up to do more coding (it's not only the tweet, Twitter is a distraction everytime you go there ...) - the daily tweet re-enforces commitment to completing the _#100DaysOfCode_! \n", - " - Related article: [Automate Tweeting: how to build a Twitterbot](https://pybit.es/automate-twitter.html) - nice extension to learn how to POST to the Twitter API\n", - "\n", - "- 3 part code challenge: \n", - " - [04 - Twitter data analysis Part 1: Getting Data](https://codechalleng.es/challenges/4/)\n", - " - [05 - Twitter data analysis Part 2: Similar Tweeters](https://codechalleng.es/challenges/5/)\n", - " - [07 - Twitter Sentiment Analysis](https://codechalleng.es/challenges/7/) (using a cool module called _TextBlob_)\n", - "\n", - "- You like the testing part? Maybe you can try to mock Twitter API calls, see [Parsing Twitter Geo Data and Mocking API Calls by Example](https://pybit.es/twitter-api-geodata-mocking.html)\n", - "\n", - "- You could also combine this effort with the [Slack API](https://api.slack.com), posting to a channel each time your domain is mentioned, see [here](https://github.com/pybites/100DaysOfCode/blob/master/020/domain_mentions.py) (a tool we still use).\n", - "\n", - "- Or manually draw stats from a downloaded Twitter archive, see [here](https://github.com/pybites/100DaysOfCode/tree/master/086)\n", - "\n", - "- One final option: build a small web app around Twitter data, for example: [Building a Simple Web App With Bottle, SQLAlchemy, and the Twitter API](https://realpython.com/blog/python/building-a-simple-web-app-with-bottle-sqlalchemy-twitter-api/) (here I learned about _Cursor_ as efficient/fast way to retrieve Twitter data). \n", - "\n", - "- Another Twitter data related project ..." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Have fun and remember, keep calm and code in Python!" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.1" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} +{"cells":[{"cell_type":"markdown","metadata":{},"source":["## Twitter Data Analysis with Python"]},{"cell_type":"markdown","metadata":{},"source":["### First day: retrieving tweets with Tweepy"]},{"cell_type":"markdown","metadata":{},"source":"See the course appendix for how to setup your virtual environment. If you want to follow along make sure you:\n- pip installed the `requirements.txt` which includes `tweepy`, `wordcloud` and related dependencies we will use in this lesson\n- create your own Twitter app [here](https://developer.twitter.com/en/apps), generating the required credentials/tokens \n- export these as environment variables in your `venv/bin/activate` (virtual env startup script):\n\n export TWITTER_KEY='abc'\n export TWITTER_SECRET='abc'\n export TWITTER_ACCESS_TOKEN='xyz'\n export TWITTER_ACCESS_SECRET='xyz'"},{"cell_type":"code","execution_count":1,"metadata":{},"outputs":[],"source":"from collections import namedtuple, Counter\nimport os\nimport re\n\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom PIL import Image\nimport tweepy\nfrom wordcloud import WordCloud, STOPWORDS\n\nTweet = namedtuple('Tweet', 'id text created likes rts')\n\nTWITTER_ACCOUNT = 'pybites'\n\nTWITTER_KEY = os.environ['TWITTER_KEY']\nTWITTER_SECRET = os.environ['TWITTER_SECRET']\nTWITTER_ACCESS_TOKEN = os.environ['TWITTER_ACCESS_TOKEN']\nTWITTER_ACCESS_SECRET = os.environ['TWITTER_ACCESS_SECRET']"},{"cell_type":"markdown","metadata":{},"source":["In this lesson we will be using [Tweepy](http://docs.tweepy.org/en/v3.5.0/api.html) and its powerful [Cursor pagination object](http://docs.tweepy.org/en/v3.5.0/cursor_tutorial.html).\n","\n","We will use it to retrieve PyBites' Twitter history (~ 2.4k tweets as of Jan 2018) to:\n","- get most popular tweets by # likes / RTs, \n","- see what the most common hashtags and mentions are, and\n","- create a nice [wordcloud](https://github.com/amueller/word_cloud) of our tweets."]},{"cell_type":"markdown","metadata":{},"source":["First we need to instantiate `tweepy` and create an `api` object."]},{"cell_type":"code","execution_count":2,"metadata":{},"outputs":[{"data":{"text/plain":[""]},"execution_count":2,"metadata":{},"output_type":"execute_result"}],"source":"auth = tweepy.OAuthHandler(TWITTER_KEY, TWITTER_SECRET)\nauth.set_access_token(TWITTER_ACCESS_TOKEN, TWITTER_ACCESS_SECRET)\napi = tweepy.API(auth)\napi"},{"cell_type":"markdown","metadata":{},"source":["Let's define a function to get all our tweets. My first attempts left RTs and replies out but if we look at mentions it might be useful to keep them around. They are also easy to exclude later with some _list comprehensions_."]},{"cell_type":"code","execution_count":3,"metadata":{},"outputs":[],"source":"def get_tweets():\n for tw in tweepy.Cursor(api.user_timeline, screen_name=TWITTER_ACCOUNT,\n exclude_replies=False, include_rts=True).items():\n yield Tweet(tw.id, tw.text, tw.created_at, tw.favorite_count, tw.retweet_count)"},{"cell_type":"code","execution_count":4,"metadata":{},"outputs":[],"source":"tweets = list(get_tweets())"},{"cell_type":"code","execution_count":5,"metadata":{},"outputs":[{"data":{"text/plain":["2484"]},"execution_count":5,"metadata":{},"output_type":"execute_result"}],"source":"len(tweets)"},{"cell_type":"markdown","metadata":{},"source":["Let's look at what our most popular tweets have been so far based on a simple average of number of likes and retweets. "]},{"cell_type":"code","execution_count":22,"metadata":{},"outputs":[{"name":"stdout","output_type":"stream","text":["❤ | ♺ | ✎\n","--------------------------------------------------------------------------------\n","168 | 89 | >>> import this ⏎ ... ⏎ Now is better than never. ⏎ ... ⏎ ⏎ Start coding in #Python ⏎ ⏎ PyBites Code Challenge Platform is… https://t.co/8iNjGWrJuQ\n","82 | 40 | We are very excited to announce our first #Python #Flask course on Udemy. ⏎ ⏎ Check it out here:… https://t.co/r1tdMWmbdL\n","64 | 32 | Beginner Pythonistas tend to have trouble parsing nested data structures. ⏎ ⏎ Here is a Bite of Py to practice just t… https://t.co/YOkyvbd8t8\n","59 | 24 | Here is the deal: we <3 #Chatbots, they are cool and rising. ⏎ ⏎ We challenge YOU to code one in #Python:… https://t.co/5GfUnMbVJx\n","52 | 27 | It's official! PyPI has hit 100,000 packages! Woohoo!! #Python #milestone @TalkPython @pybites https://t.co/jqDoWsjfyR\n","58 | 19 | Codementor: Building a desktop notification tool using #python https://t.co/2V2pfqu2yx\n","36 | 17 | PyBites Code Challenge #40: ⏎ Daily Python Tip Part 1 - Make a Web App ⏎ https://t.co/OMa6BSgSxR ⏎ @python_tip ⏎ #django… https://t.co/ISNkpJpFYS\n","34 | 12 | We are honoured to have been on the @TalkPython podcast. Listen to this episode if you want to learn more about our… https://t.co/NMidGnQunk\n","29 | 16 | The coolest chatbot built with #Python and PR'd to PyBites earns a copy of 'Designing Bots' have fun! Instructions:… https://t.co/HJRWRF2FkE\n","38 | 6 | Happy birthday @PyBites: in today's new article we reflect on last year and we have an important announcement to ma… https://t.co/pAFQmYtjA7\n","32 | 12 | #100DaysOfCode - Day 013: simple #Flask app to compare weather of 2 cities (using OpenWeatherMap #API) https://t.co/XOQVTOUdFn #Python\n","35 | 8 | Wow 300 forks on our Challenges repo - https://t.co/UoVsqf3bLA - keep on coding and let us know if you have more id… https://t.co/igVDD7pvUU\n","30 | 12 | Great book: Python Testing With Pytest by @brianokken - review: https://t.co/S319H9Se80\n","28 | 11 | #100DaysOfCode - Day 061: Plan your next book read using the @twilio SMS API (cc @mattmakai) https://t.co/flWISk9KgM #Python\n","26 | 10 | Import Python: #159: How to speed up Python application startup time, Hunting Memory Leaks and more https://t.co/EKj5TvqUKm\n","27 | 9 | New article: ⏎ Bootstrap Your Next #Python Project With #Cookiecutter ⏎ https://t.co/RN2x6Cxzlg https://t.co/Ks4AEcpKWk\n","26 | 10 | Nice intro tutorial by @dbader_org: What Are #Python #Generators? - https://t.co/3qNTvLu80H - easy to use + many advantages, use them!\n","22 | 13 | #100DaysOfCode - Day 066: Use Selenium to login to a site and show content https://t.co/jjkJ2hh36a #Python\n","17 | 17 | Free @PacktPub ebook of the day: #Python Data Science Essentials - Second Edition - https://t.co/t2aLcaSm56\n","24 | 9 | Meet the man behind the most important tool in data science https://t.co/TEUKBGo1dc via @qz #pandas\n","19 | 14 | How to Monitor #Python Web Applications - Full Stack Python https://t.co/i9bowbjS9I #Rollbar\n","23 | 10 | New tutorial series on @vitorfs Simple is Better Than Complex: ⏎ ⏎ A Complete Beginner's Guide to #Django - Part 1 ⏎ ⏎ https://t.co/i2w16V6u8y\n","24 | 8 | A Step-by-Step Guide on Deploying a Simple #Flask app to #Heroku. This absolutely made my week! https://t.co/uOs7VctbTE #Python\n","19 | 13 | Learned more #python and #flask ⏎ ⏎ Simple API Part 2 - Building a Deep Work Logger with Flask, Slack and Google Docs ⏎ ⏎ https://t.co/DTTuAQt69Q\n","26 | 5 | Announcing the @PyBites Code Challenge 47 winner: @FerroRodolfo! Thanks for your awesome Twitter Hashtag word cloud… https://t.co/YR21EVfzoG\n","24 | 7 | Today we cover an often requested, important to know and powerful topic: ⏎ ⏎ Learning #Python Decorators by Example… https://t.co/RvK4CMgYoC\n","24 | 6 | Want to learn some #python, building something cool, getting featured on PyBites? #codechallenge ideas are welcome: https://t.co/vpEQb5lAIG\n","23 | 6 | “How to use Python and Flask to build a web app — an in-depth tutorial” by @abhisuri97 https://t.co/gQ0KcRNC64\n","22 | 7 | \"Who's behind PyBites?\" ⏎ \"What do we do?\" ⏎ ⏎ Our newly designed homepage explains it in a nutshell ... ⏎ ⏎ Check it out… https://t.co/nb9RkYtoE9\n","20 | 9 | #100DaysOfCode - Day 056: #Python #Flask BMI calculator https://t.co/ARbG06bF2a #Python\n","16 | 11 | Conclusion 1st #PyChallengeDay co-hosted with @python_alc: ⏎ \"Live workshops offer an effective and fun way to build… https://t.co/cwMacgzebT\n","11 | 16 | Tomorrow 10 am CET University of Alicante: #PyChallengeDay workshop ⏎ ⏎ Join us and @python_alc to flex your coding mu… https://t.co/M3hdQFHs50\n","15 | 12 | Import #Python: News This Week - EuroSciPy Videos are out, Reducing Python's startup time, Predicting algo .. https://t.co/afLv8bwHuL\n","15 | 11 | “A brief tour of Python 3.7 data classes” by @anthonypjshaw https://t.co/ClOABPFZkj\n","20 | 6 | You want to hone your #Regex skills? Here is a little Bite of #Python to practice: ⏎ https://t.co/9xBJchTK0L\n","18 | 8 | Import #Python 140 - Publish your Python packages, Python for research course, sys.getrefcount ... https://t.co/vu6jXaqseh\n","20 | 6 | #100DaysOfCode - Day 099: Simple #Flask app to display photos in a directory https://t.co/VGTQUxpEiE #Python\n","15 | 11 | Just added @TalkPython video training to our resources article, among the best #python video trainings out there! https://t.co/8bpGOQ13pz\n","20 | 5 | New @lynda course: OpenCV for #Python Developers - https://t.co/lcWsQkHR5S\n","20 | 5 | #100DaysOfCode - Day 097: Create a default #Flask App dir structure for new projects https://t.co/43QMRAerkO #Python\n","17 | 7 | WOW #milestone: ⏎ 391 Pythonistas have solved 1,000 Bites, writing 18,003 lines of code. ⏎ ⏎ Join us at… https://t.co/z6m3HmIr0E\n","21 | 3 | #100DaysOfCode - Day 038: Simple #Twitter login for your #Flask app using flask_oauthlib https://t.co/iSE1Pcp0hk #Python\n","16 | 8 | Learn how to format strings in #python - https://t.co/faGOvTZ51u\n","17 | 6 | Nice example how to start the new year by automating a boring task with #Python » Word Notifier · Words to Thoughts… https://t.co/IhlvapbeTb\n","14 | 9 | Step-by-Step Guide on Deploying a Simple #Flask App to #Heroku https://t.co/65JTiy0whK\n","18 | 5 | A Complete Beginner's Guide to #Django - Part 4 is out https://t.co/zchdtkvceV via @vitorfs\n","21 | 2 | Simple is Better Than Complex: A Complete Beginner's Guide to #Django - Part 3 https://t.co/qH83RGfujh\n","15 | 7 | Wow: ⏎ 💪 584 bites completed by 241 Pythonistas! 💪 ⏎ ⏎ - will you be the next one to crack some bites of py?… https://t.co/XGg40QwPGF\n","17 | 5 | #Python Data: Forecasting Time Series data with #Prophet – Trend Changepoints https://t.co/HRK3l35pse\n","12 | 10 | #100DaysOfCode - Day 032: #Flask #jQuery movie autocomplete https://t.co/x8ODLnJd8u #Python\n","10 | 12 | #100DaysOfCode - Day 026: Simple script to retrieve #movie data from OMDb #API https://t.co/dRiEnI9XE0 #Python\n","17 | 4 | » PyFormat: Using % and .format() for great good! https://t.co/kfAEpWDIdA\n","18 | 3 | Recommended: a Complete Beginner's Guide to #Django - Part 2 https://t.co/OWAbypWSbU via @vitorfs\n","11 | 10 | #100DaysOfCode - Day 006: simple reusable code snippet to print a dict https://t.co/bDTNT2X7wa #Python\n","12 | 8 | New PyBites Code Challenge 45 is up: #TDD: Code #FizzBuzz Writing Tests First! ⏎ https://t.co/cStZFUWm36 - have fun with #Python\n","14 | 6 | New Article / guest post is up: ⏎ Using #Pandas and #Seaborn to solve PyBites Marvel Challenge… https://t.co/R2IKL0uo3n\n","14 | 6 | Free @PacktPub ebook today: mastering object oriented #Python https://t.co/t2aLcaALdy\n","16 | 4 | An #API should make the simple easy, the complex possible and the wrong impossible - great talk by @flaviojuvenal… https://t.co/jiw3UeUkZy\n","14 | 6 | So we made an #app to compare the weather in two cities with #Python #Flask and deployed it on #Heroku! Excitement! https://t.co/VQ4ZwbI6Ac\n","14 | 6 | Behind the Scenes of @PyBites - a Blog for Passionate Pythonistas (Post #100 Special) https://t.co/iqeiM7Dk6q #python\n","12 | 7 | Our guest post is up! Thanks @RealPython https://t.co/4sn5ygKren\n","12 | 7 | How to Use #Pdb to Debug Your Code https://t.co/OkqLq1iqvl - invaluable tool for any #python developer\n","10 | 9 | Mark your calendars: this Friday at 10 am CET: #Marvel meets #Python at our first live #CodeChallenge in collaborat… https://t.co/V3jYX4YRUm\n","14 | 5 | PyBites Newsletter - Python Flask Online Course Launch, Decorators, Pdb, Cookiecutter, Open Source and Community https://t.co/hLYOcDjN8x\n","17 | 2 | Simple is Better Than Complex: A Complete Beginner's Guide to #Django - Part 5 https://t.co/D8duhMih2O\n","12 | 7 | New PyBites Article: Improve the Quality of Your #Code with @BetterCodeHub - https://t.co/GUVZD4qWTv #cleancode… https://t.co/eXLM948XGu\n","15 | 4 | Had fun with #Python #Selenium and submitted my code. ⏎ ⏎ Who else joins this week's PyBites code challenge? https://t.co/YxKRxTW44i\n","12 | 7 | Import #Python Weekly - debugging, machine learning, data science, testing ,docker ,locust and more https://t.co/B8iIA3O7TW\n","13 | 6 | Cool - Using the PythonAnywhere API: an (open source) helper script to create a Django webapp with a virtualenv ⏎ ⏎ https://t.co/qKZWpP4r2B\n","15 | 4 | #100DaysOfCode - Day 065: Use #Python #webbrowser to simplify #Flask testing https://t.co/sqwnz6ZBBI #Python\n","11 | 8 | Awesome learning: 3 cool #Flask apps in our #Python Code Challenge 15 review https://t.co/kOcr5H65Bw @mohhinder @techmoneykids @bbelderbos\n","12 | 7 | Have a nice pythonic day :) #coffee #python @techmoneykids https://t.co/gfQxwAI6so\n","10 | 8 | Wooo it's the weekend! The perfect time to have a crack at an Advanced Bite of #Python! Free for the weekend, give… https://t.co/LM1ZArB0xP\n","16 | 2 | PyBites Newsletter - PyBites One Year / Introducing codechalleng.es, our new Code Challenge Platform - https://t.co/Fo2ozmsH3v\n","10 | 8 | Full Stack Python: DevOps, Continuous Delivery... and You https://t.co/PTtkbaCZKH\n","12 | 5 | PRs do count: David solved our Marvel #pychallenge earning a copy of @AlSweigart’s Automate the boring stuff. I thi… https://t.co/0HlF3jYvKS\n","9 | 8 | Free @PacktPub ebook of the day: #Python Geospatial Development - Third Edition - https://t.co/t2aLcaSm56\n","12 | 5 | New PyBites article: Making a Banner Generator With #Pillow and #Flask - https://t.co/2IqTyidX1w https://t.co/LobuJrVCHV\n","12 | 5 | Debugging in Python https://t.co/otTstPcQxr -> import pdb; ⏎ pdb.set_trace() -> debug!\n","14 | 3 | Some nice #flask #bokeh submissions being PR'd :) ⏎ ⏎ It's never too late to join our code challenges: ⏎ https://t.co/CO3esWd37H ⏎ ⏎ cc @realpython\n","11 | 6 | New PyBites article: The Importance of Refactoring Code https://t.co/HeMVp5WktZ #python\n","12 | 5 | Guest post on @dbader_org - dunder / special methods in #Python, to which we linked this week's code challenge #24… https://t.co/1LyCZahOH0\n","13 | 4 | #100DaysOfCode - Day 083: #Python #Flask app to print the current time in a given timezone https://t.co/LjD5EpJoPW #Python\n","13 | 3 | Finally using f-strings, not sure what took me so long, going back to the otherwise elegant '{}'.format feels weird… https://t.co/SrLlJAALOh\n","13 | 3 | 5 tips to speed up your #Python code https://t.co/zbGWIFHPVG #performance\n","14 | 2 | Free @PacktPub ebook of the day: Scientific Computing with #Python 3 - https://t.co/t2aLcaSm56\n","10 | 6 | Morning Pythonistas, #regexes can be hard but we got your back with our new #Python code challenge #42:… https://t.co/QCe3iTrl7Y\n","10 | 6 | New PyBites Code Challenge 41 is out: ⏎ Daily Python Tip Part 2 - Build an #API https://t.co/dQCo203vwP ⏎ @python_tip https://t.co/bL7FWyjdzC\n","11 | 5 | Building and Testing an API Wrapper in Python via @semaphoreci https://t.co/gL4vlmQc0f - excellent article #requests #vcrpy #pytest\n","13 | 3 | #100DaysOfCode - Day 096: Script to measure which 100Days tweets were most successful (RTs / Favs) https://t.co/TXgWL29ps4 #Python\n","11 | 5 | #100DaysOfCode - Day 058: Playing with OOP / classes in Python https://t.co/eufNZ5CUVd #Python\n","12 | 4 | #100DaysOfCode - Day 052: Build a user focused REPL with prompt_toolkit (source @amjithr) https://t.co/JsHrgcMnz9 #Python\n","14 | 2 | #100DaysOfCode - Day 001: script to check if tip already submitted to @python_tip https://t.co/SwtTASAcuv\n","12 | 4 | The #Python data model by example - https://t.co/j3wu8kfFO4\n","12 | 3 | How to Implement Multiple User Types with Django https://t.co/3gEQgqHBYh via @vitorfs\n","11 | 4 | Quantify/visualize our #data and win one of our prizes ... ⏎ ⏎ Code Challenge 47 - PyBites First Year in Data (Special) https://t.co/FF1yEM4WiN\n","11 | 4 | Some PyBites pointers/ advice on How to Learn #Python https://t.co/fDWzVLlnIh\n","11 | 4 | Our new #CodeChallenge special is up. ⏎ ⏎ Original submissions are rewarded with a price - have fun! ⏎ ⏎ #47 - PyBites F… https://t.co/D0E6dDShcZ\n","11 | 4 | Surely you can code FizzBuzz right? Now do it in #tdd for one of our challenges this month, and don’t forget to PR… https://t.co/oRLUKJNokQ\n","12 | 3 | Codementor: How they work - The 3 Magical Functions of Python : map, filter and lambda https://t.co/QMuVBcaFTp\n","11 | 4 | #Python Data: Stock market forecasting with #prophet https://t.co/moLFmyWiVu\n","10 | 5 | What Does It Take to Be An Expert At #Python - https://t.co/lZqMIOHEjF\n","10 | 5 | Learning #flask ebook for free today thanks to @PacktPub - https://t.co/t2aLcaALdy\n","10 | 5 | Thanks @mkennedy and @brianokken for your nice feedback on our #100DaysOfCode, motivates us even more. https://t.co/GzLgyyM8Sg\n","7 | 8 | #100DaysOfCode - Day 089: #Python #Flask overtime hours tracker. #sqlite https://t.co/PDN389aOoD #Python\n","11 | 3 | “Playing with Twitter Streaming API” by @ssola https://t.co/YJjf163T4u\n","10 | 4 | You want to flex your #Python muscles working on some #Marvel data? ⏎ ⏎ Come join us for our \"Code Challenge 44 - Mar… https://t.co/ss4RzJIltK\n","7 | 7 | Live #Python code challenge this Friday at the University of Alicante - stay tuned ... https://t.co/ucdEOo3jYm\n","10 | 4 | How to Use #Pdb to Debug Your #Python Code https://t.co/m5qxdabh0C https://t.co/iWs9F5xLvo\n","8 | 6 | You want more maintainable #Python code? ⏎ ⏎ Join #PyBitesChallenge35 and use @github + @BetterCodeHub to do so. Spon… https://t.co/F3TcrbPP2Q\n","13 | 1 | Writing good decorators definitely enhances your #python skills. Nice intro below, practice with challenge 14 -… https://t.co/qYGNMygv7X\n","9 | 5 | New @lynda course: Data Science Foundations: #Python Scientific Stack - https://t.co/YPIBP46cpt\n","11 | 3 | 93 days done, next week we will hit 100% on our #100DaysOfCode #Python challenge - standby for an overview ...… https://t.co/EmDiFeqzJn\n","10 | 4 | #100DaysOfCode - Day 087: Currency Conversion script using openexchangerates API https://t.co/JSS6BpEcHB #Python\n","9 | 5 | Some nice Packt ebook utilities/scripts came out of last week's challenge. Review: https://t.co/4YErFZvrKm cc @Pybonacci @wonderfulboyx_e\n","11 | 3 | #100DaysOfCode - Day 062: #Python #Flask friends list with #sqlite db https://t.co/DPPWSevfBL #Python\n","11 | 3 | #100DaysOfCode - Day 060: #Python #Flask Pay Calculator using a session object https://t.co/EW82NyA2Bq #Python\n","12 | 2 | Zen of python on a T-shirt, how cool! #PyCon2017 https://t.co/YqDmuTg1zY\n","11 | 3 | #100DaysOfCode - Day 031: Simple and reusable #Python #script to move all files from one folder to another https://t.co/K6sA5sG9eZ #Python\n","9 | 5 | 5 tips to speed up your Python code https://t.co/XRjKM1c1ag #python\n","9 | 4 | Ned Batchelder: Python’s misleading readability https://t.co/xVXF9kOjSf\n","12 | 1 | No better way to start the year with a Bite of Py: https://t.co/RGAoq9378I - Happy New Year and keep calm and code in #Python\n","10 | 3 | Creating a Chatbot with Deep Learning, Python, and TensorFlow p.1 https://t.co/fYl9CVbovO via @YouTube\n","11 | 2 | Using Pandas and Seaborn to solve PyBites Marvel Challenge https://t.co/dkEwl2a27H\n","7 | 6 | from pybites import News ⏎ ⏎ Twitter Digest 2017 Week 51 ⏎ https://t.co/HMSvS6pU6X ⏎ ⏎ #Python #CodeChallenges… https://t.co/oZPjJmshag\n","10 | 3 | Never Forget A Friend’s Birthday with #Python, #Flask and #Twilio https://t.co/JctXeeOwxa via @twilio\n","9 | 4 | Excited! https://t.co/MpnGtiHZCc 7 code challenge PRs in little over a week - great work, keep coding and learn more #Python @techmoneykids\n","9 | 4 | #Django Weekly #56 - Free continuous delivery eBook from GoCD, A Complete Beginner's Guide to Django 2 https://t.co/Y8daJynDeI\n","9 | 4 | New on PyBites: How to learn #Python ⏎ ⏎ Read about Julian + Bob's Python journey in Special Post #200:… https://t.co/K7yO6XbUE2\n","8 | 5 | Obey the Testing Goat - \"TDD for the Web, with Python, Selenium, Django, JavaScript and pals\" - 2nd ed is out! https://t.co/UyqC7Ps3Ah\n","9 | 4 | PyCon 2017: Must-See Talks https://t.co/ejxZgRLA0k via @cuttlesoft\n","11 | 2 | \"Mentors learn from you too\" - so glad I attended this inspiring talk, thanks @mariatta https://t.co/NFtR6RitaI\n","7 | 6 | DataCamp: #Pandas Cheat Sheet: Data Wrangling in #Python https://t.co/zCdACatBq8\n","11 | 1 | Every time I use #Jupyter Notebooks I love them more, such a great tool to try out code (pdb), making notes, sharin… https://t.co/xT24j8bNor\n","9 | 3 | And the winner of the PyBites Code Challenge 43 (aka the chat bot challenge) is (drum roll) ... @FerroRodolfo - gra… https://t.co/WkVS6MPeaW\n","7 | 5 | “DisAtBot — How I Built a Chatbot With Telegram And Python” by @FerroRodolfo https://t.co/9i4QWFJZtg\n","8 | 4 | PyBites Newsletter - Chatbot Winner, Talk Python Podcast, Code Challenge Platform Preview, Live Workshop Alicante - https://t.co/F1Bko5VGVy\n","7 | 5 | New #Python Code Challenge 38 up: ⏎ ⏎ Build Your Own #Hacktoberfest Checker With #Bottle ⏎ https://t.co/lOV7nmufKj ⏎ Enjo… https://t.co/sxwBjm4WvR\n","8 | 4 | Our @twilio guest post is live! ⏎ ⏎ No more excuses to forget any birthday. Use Twilio's api for sms reminders and bir… https://t.co/hcwWtcC1oP\n","8 | 4 | Delighted to have @RealPython delivering this week's #Python Code Challenge #36: Create an #AWS #Lambda Function -… https://t.co/EjRULKz02c\n","7 | 5 | Codementor: Some tricky #Python snippets that may bite you off! https://t.co/IO5jgUjr75\n","8 | 4 | New PyBites Code Challenge 34 - Build a Simple #API With #Django Rest Framework - https://t.co/XdEE0s3RO3 …… https://t.co/awhEwVSmTZ\n","9 | 3 | wow deploying a django app to @pythonanywhere was very easy, nice service\n","7 | 5 | #100DaysOfCode - Day 023: use Counter to count the most common words in a file https://t.co/ewUUhffGUi #Python\n","6 | 6 | Get #flask by example @PacktPub ebook for free today, nice timing with our code challenge of this week :) https://t.co/GOtuNRhBmY\n","10 | 2 | Import Python: Import Python Weekly Issue 119 - PEP8 compliance, Python to Go, Flask, Pandas and more https://t.co/Yr88WSPT50 #python\n","8 | 3 | “Coding style matters, the importance of PEP8” by @bbelderbos https://t.co/UO64scQxRi\n","5 | 6 | Learn how @Mridu__ uses Feedparser, Difflib and Plotly to solve ⏎ #Python Code Challenge 03 - \"PyBites Blog Tag Analy… https://t.co/xowfim43iA\n","10 | 1 | Happy birthday @_juliansequeira, to celebrate here is a free bite of #Python, just on a topic you like, you gotta l… https://t.co/J4dhYBw53o\n","10 | 1 | Congratulations @fullstackpython, what a great milestone! https://t.co/kkQmuwSWEu\n","7 | 4 | from pybites import News ⏎ ⏎ Twitter Digest 2017 Week 50 https://t.co/b5s5xycPBD ⏎ ⏎ #python #news\n","11 | 0 | Awesome! Python is everywhere https://t.co/qlMygEikh8\n","7 | 4 | New PyBites Code Challenge 46 is up: Add Continuous Integration (CI) to Your Project - https://t.co/t1LhyjIzVl #CI… https://t.co/KKefAcRszk\n","9 | 2 | from pybites import ⏎ Twitter Digest 2017 Week 48 https://t.co/kl9fKtCtQq\n","8 | 3 | Free @PacktPub ebook of the day: #Python 3 Object-oriented Programming - Second Edition - https://t.co/t2aLcaSm56\n","9 | 2 | Remember: tomorrow last day to submit your awesome python bot for: ⏎ ⏎ Code Challenge 43 - Build a Chatbot Using Pyth… https://t.co/Y0fLg0lTIL\n","8 | 3 | Free @PacktPub ebook of the day: Modern #Python Cookbook - https://t.co/t2aLcaSm56\n","9 | 2 | People are really enjoying our #Python #Flask course on #udemy! We're absolutely stoked! Perfect timing with… https://t.co/5OFY0sRbM7\n","10 | 1 | Free @PacktPub ebook of the day: Web Development with #Django Cookbook - Second Edition - https://t.co/t2aLcaSm56\n","9 | 2 | free Scrapy ebook today ⏎ #python https://t.co/GV00QgK9Z7\n","8 | 3 | Free @PacktPub ebook of the day: Learning #Python Design Patterns - Second Edition - https://t.co/t2aLcaSm56\n","9 | 2 | #Django Weekly 59: TDD, React, Admin Panel, Good Django Books and more https://t.co/LvawI3iDAy\n","8 | 3 | New PyBites Code Challenge 37 - Automate a Task With @Twilio https://t.co/BizubUwnGM https://t.co/Vye2emNgMD\n","9 | 2 | Python Data: Forecasting Time Series data with Prophet – Part 3 https://t.co/oFJlhCthfq\n","9 | 2 | Simple is Better Than Complex: How to Use Celery and RabbitMQ with #Django https://t.co/eNATo3pGWG\n","7 | 4 | This week @MikeHerman from @realpython delivers Code Challenge 28 - Integrate a #Bokeh Chart Into #Flask https://t.co/CO3esWd37H - have fun!\n","9 | 2 | #100daysofcode + 200 Days of PyBites! We recap the challenge, 10 stand out scripts and our next project here https://t.co/RNTI13cjvm #Python\n","10 | 1 | #100DaysOfCode - Day 100: 100DaysOfCode done! 5K LOC!! Day #100 Special: a Histogram of LOC/day https://t.co/EhKs9yHU7b #Python\n","7 | 4 | #100DaysOfCode - Day 082: #Python script to list all #timezones and their current time https://t.co/kyjpul0vW2 #Python\n","7 | 4 | A #Python #cheatsheet resource guide on parsing common data formats. If you have any of your own tips let us know! https://t.co/GVC7Hhbx0t\n","9 | 2 | #100DaysOfCode - Day 025: Simple test #database generator script #python #sqlite #contextmanager https://t.co/6yKI6eLYFE #Python\n","9 | 1 | New @lynda course: #Python Essential Training - https://t.co/bCkHwrbzQx\n","7 | 3 | » Episode #60 Don't dismiss SQLite as just a starter DB - [Python Bytes Podcast] https://t.co/RVzSLHXOUR\n","8 | 2 | PyBites Code Challenges | Bite 10. Practice exceptions - https://t.co/ExU0s59oGV\n","8 | 2 | PyBites Code Challenges | Sum n numbers https://t.co/nb3THySQ2T - good morning, a small little bite for you to solve\n","6 | 4 | Free @PacktPub ebook of the day: Building RESTful #Python Web Services - https://t.co/t2aLcaSm56\n","5 | 5 | And another PyBites Code Challenge: #39 - Writing Tests With #Pytest ⏎ ⏎ https://t.co/TQ74ronFeE ⏎ ⏎ @pytestdotorg… https://t.co/0GBZRbKyGl\n","6 | 4 | Was just about to tweet it, but @importpython was there to catch it for us as well as other awesome articles: ⏎ ⏎ Wha… https://t.co/fnEJl6yisk\n","6 | 4 | \"5 killer use cases for AWS Lambda\" https://t.co/PxzTordHbn\n","7 | 3 | @Gustavoaz7_ LOL that's why #100DaysOfCode works :)\n","6 | 4 | We are stoked about this week's Code Challenge #30 - The Art of #Refactoring: Improve Your #Python Code https://t.co/Uy749gdzuH\n","6 | 4 | Codementor: How to Deploy a Django App on Heroku Easily | Codementor https://t.co/PU4bCfluRm\n","8 | 2 | #Django Weekly 47 - Concurrency in Django models, Towards Channels 2.0 , routing in uWSGI and more https://t.co/uerYJAyodz #python\n","6 | 4 | So you got the basics in #Python down, where to look next? We wrote a resources article some time ago: https://t.co/bZiqk0VRvl\n","9 | 1 | #100DaysOfCode - Day 086: Script to pull some quick stats from a #Twitter Archive CSV https://t.co/DwDw36bBj7 #Python\n","5 | 5 | #100DaysOfCode - Day 084: Use PyGithub to retrieve some basic stats for a GH user https://t.co/ojbRZH1Ngy #Python\n","8 | 2 | #100DaysOfCode - Day 063: Coding an account class using properties, dunders and pytest https://t.co/cpYDQBFWEc #Python\n","6 | 4 | #100DaysOfCode - Day 028: Jupyter notebook to plot and list new #Python titles on @safari by month https://t.co/LNWUIEr8zO #Python\n","7 | 3 | #100DaysOfCode - Day 021: script to make an index of modules used for this challenge (stdlib >50%) https://t.co/LSkcLT8Xcy #Python\n","6 | 4 | #100DaysOfCode - Day 017: script to automatically tweet out new @safari Python titles https://t.co/4nPyS5ImV6 #Python\n","7 | 3 | Write Pythonic Code Like a Seasoned Developer Review https://t.co/y8J4J7AU9z #python\n","6 | 3 | Don't let mutability of compound objects fool you! https://t.co/76jTypZAD7 #python\n","7 | 2 | New PyBites review post: a lot of good pull requests on our #codechallenges from last month!… https://t.co/fK6kMm2HRd\n","7 | 2 | Awesome: all PRs merged, review posts 38, 39 and 40 are up: ⏎ https://t.co/B9rjJoBWH5 ⏎ ⏎ Keep coding #python! ⏎ ⏎ #pytest… https://t.co/lXbIkccLR9\n","7 | 2 | Codementor: How I used #Python to find interesting people to follow on Medium https://t.co/8sh81xKU0M\n","4 | 5 | Easier #python PR review https://t.co/X5EsQ9jATE\n","6 | 3 | Semaphore Community: Dockerizing a Python Django Web Application https://t.co/OY3w4mSqsl #docker #python #django\n","5 | 4 | New PyBites Article: Fully Automate Login and Banner Generation with #Python #Selenium, #Requests and #Click -… https://t.co/vRzy9wAkiY\n","6 | 3 | psst ... too busy too keep up with #python news? ⏎ PyBites Twitter digest 2017 week 33 is out ... https://t.co/TK0ccqFiNr\n","6 | 3 | Free @PacktPub ebook of the day: #Python 3 Web Development Beginner's Guide - https://t.co/t2aLcaSm56\n","6 | 3 | This week's #Python Twitter Digest is out! It includes a great talk by @anthonypjshaw at #PyConAU & other cool stuff https://t.co/KfuVuwqeby\n","6 | 3 | New PyBites Article: ⏎ ⏎ A Step by Step Guide to Implementing and Deploying Two-Phase Registration in #Django ⏎ ⏎ https://t.co/s8R8K2CZej\n","5 | 4 | PyBites new Code Challenge #27 is up: #PRAW: The #Python #Reddit API Wrapper https://t.co/vj4hjuXORW - looking forward what you will code...\n","7 | 2 | Hi there, always wanted to play with GUIs? ⏎ ⏎ Now you can! ⏎ ⏎ Join our new Challenge 26 - Create a Simple #Python GUI - https://t.co/HK1PVHPZqV.\n","7 | 2 | And our second PyBites article of this week: ⏎ ⏎ Flask Web Server Port Mapping - https://t.co/5RqZPMn1di ⏎ ⏎ #python #flask\n","7 | 2 | #100DaysOfCode - Day 092: #Python script to ping every IP on a specified #network https://t.co/Ys78WTZeKj #Python\n","5 | 4 | #100DaysOfCode - Day 088: Using #Slack Real Time Messaging #API to capture all messages https://t.co/VUNjrRhiCG #Python\n","6 | 3 | Lots of #Python goodness in this week's Twitter Digest! The #django v #flask one is awesome! Happy Sunday! https://t.co/MMZzaqI52B\n","5 | 4 | #100DaysOfCode - Day 078: Use a context manager to rollback a transaction https://t.co/Bvhlxmg194 #Python\n","6 | 3 | #100DaysOfCode - Day 064: Prework code challenge #21: ApplianceCost class to calc energy cost https://t.co/KOUXxr9KNB #Python\n","5 | 4 | Awesome initiative: https://t.co/bsq3se1u8Y - a stylized presentation of the well-established PEP 8 #Python\n","6 | 3 | #100DaysOfCode - Day 059: Using the #Twilio #API to send SMS messages https://t.co/dkA2skiolM #Python\n","5 | 4 | New PyBites article: PyCon 2017 - Digest, Impressions, Reflection https://t.co/BgzFAdZcaU\n","7 | 2 | #100DaysOfCode - Day 053: Script to start automating posting to our PyBites FB group https://t.co/WOaRlkxcJx #Python\n","7 | 2 | Cool, @pycharm supports #vim mode via IdeaVim - https://t.co/g2TId7f70K - trying it out ...\n","5 | 4 | New @lynda course: Learning #Python for Data Science, with Tim Fox and Elephant Scale - https://t.co/WZi0nW5plU\n","6 | 3 | #100DaysOfCode - Day 036: Use #Python #pickle to store and retrieve a defaultdict https://t.co/ZheFpoGHGu #Python\n","7 | 2 | Our new #Python Code Challenge is up: #16 - Query Your Favorite #API - many options to practice for this one, enjoy! https://t.co/usDTVynyBZ\n","7 | 2 | #100DaysOfCode - Day 008: reusable python flask html template for printing a dict https://t.co/bSL5V4y7oj #Python\n","6 | 3 | #100DaysOfCode - Day 007: script to automatically tweet 100DayOfCode progress tweet https://t.co/n9L1fTj8Bz #Python\n","4 | 5 | Learn how to format strings in a Pythonic way: https://t.co/faGOvTZ51u https://t.co/NXDCZBShAY\n","2 | 7 | Time is scarce, save cycles: 5 nice #Python Development Setup Tips and #tools to Boost Your #Productivity https://t.co/zPNLCKYNnA\n","7 | 1 | Free @PacktPub ebook of the day: Learning #Python - https://t.co/t2aLcaSm56\n","6 | 2 | Module of the Week: Openpyxl - Automate Excel! https://t.co/U98is6UOc0\n","8 | 0 | Nice free ebook, useful for code challenge 41 - https://t.co/zrNJCuwtR9 - I think I will go with Flask. Want to giv… https://t.co/jjxQEYVXnq\n","5 | 3 | Happy Sunday, from pybites import News ⏎ ⏎ Twitter Digest 2017 Week 49 https://t.co/jjNNuZ9iS3 #python\n","5 | 3 | from pybites import news ⏎ ⏎ Twitter Digest 2017 Week 47 https://t.co/QBsyr0fX6h #Python\n","7 | 1 | Free @PacktPub ebook of the day: Learning Predictive Analytics with #Python - https://t.co/t2aLcaALdy\n","7 | 1 | @SlackHQ @ashevat Oh yeah, already got a Slack chatbot PR submission 👏🐍 https://t.co/OQNowTzQVJ\n","7 | 1 | Nice: a simple #Python Twitter Bot (Tweepy) to daily tweet out the price of #Bitcoin https://t.co/xyLaFBPUcu via @joshsisto\n","5 | 3 | Weekly Python Chat: Classes: When, How, Why, and Why Not https://t.co/iZ0ot18jd6\n","5 | 3 | Free @PacktPub ebook of the day: Learning Penetration Testing with #Python - https://t.co/t2aLcaSm56\n","7 | 1 | PyBites Newsletter - Code Challenges, Bottle, PyTest, Django, MIME, Openpyxl - https://t.co/SzR9QRVLs7\n","6 | 2 | Import Python: #143 - Build Book Recommender System, Terrible Python Error Message, Free CI eBook and more https://t.co/AQRx5tIURh\n","3 | 5 | We had fun with @bettercodehub - check out the review of our last PyBites Code Challenge: https://t.co/M9vjE3cw1W… https://t.co/n4ZubKvpp6\n","5 | 3 | Code Challenge 34 - Build a Simple API With #Django REST Framework - Review is up https://t.co/wSbrbC76hZ\n","7 | 1 | Excellent article: Mocking External APIs in #Python - Real Python https://t.co/OlauZiKPlO\n","6 | 2 | Talk Python to Me: #123 Lessons from 100 straight dev job interviews https://t.co/lUD1Fi9tkb\n","4 | 4 | Review of Code Challenge 28 \"Integrate a #Bokeh Chart Into #Flask\" is up: https://t.co/svYfwKCZtB - great work! Thx @MikeHerman @realpython\n","5 | 3 | New @lynda course: Learning #Python with PyCharm - https://t.co/i1IH9epweE\n","6 | 2 | #100DaysOfCode - Day 067: #Python script to pull a random entry from an #sqlite db https://t.co/i2Iro5yukd #Python\n","5 | 3 | #100DaysOfCode - Day 057: Using the #YouTube #API to determine most popular #PyCon2017 talks https://t.co/9r4oVM7Jcj #Python\n","8 | 0 | If you are interested in Twitter bots check out this cool poster / initiative by @kkvie #PyCon2017 https://t.co/QHejQD2LY0\n","5 | 3 | #100DaysOfCode - Day 035: Text replacer script using #pyperclip by @AlSweigart https://t.co/MXPsfu7cdr #Python\n","6 | 2 | #100DaysOfCode - Day 034: Import a #podcast feed into a DB table with #SQLAlchemy https://t.co/KtKBgXO6Zd #Python\n","7 | 1 | #100DaysOfCode - Day 030: Script to import movie csv file into an sqlite database https://t.co/qlld9p48z1 #Python\n","6 | 2 | #100DaysOfCode - Day 005: script to create a 100DaysOfCode tweet https://t.co/oNhW5tS6n9 #Python\n","5 | 3 | Interesting, how to make cleaner code reducing for loops https://t.co/Ny2JefgBKd\n","4 | 4 | @Pybonacci nice script to get the ebook automatically every day: https://t.co/FKKS7nGymq\n","6 | 1 | Almost due: Code Challenges #47 - PyBites First Year in Data (Special) https://t.co/XHJBROl6Vk - PR your data analy… https://t.co/sGUpIPRp39\n","5 | 2 | PyBites Code Challenges | 45 - TDD: Code FizzBuzz Writing Tests First! https://t.co/b0uDgdS2VB\n","7 | 0 | Love list comprehensions, so elegant https://t.co/cIv54ZliGp\n","5 | 2 | @PlanetaChatbot @FerroRodolfo Bot muy original y buen trabajo @FerroRodolfo, me alegro verlo publicado aqui tambien!\n","4 | 3 | Using #Pillow to Create Nice Banners For Your Site https://t.co/EZQsYvuIFZ #Python\n","3 | 4 | Few days left ... ⏎ Code Challenge 38 - Build Your Own #Hacktoberfest Checker With #Bottle https://t.co/6JurrT6qb7\n","5 | 2 | A beginner's guide to building a simple database-backed #Flask website on PythonAnywhere: part 2 https://t.co/FP6BuPEZow @techmoneykids\n","4 | 3 | 2 challenge review posts today: ⏎ 1. Code Challenge 36 - Create an #AWS Lambda Function ⏎ https://t.co/bqRt7iTJ4c ⏎ ⏎ -… https://t.co/bKw2xFrAYr\n","5 | 2 | Python Bytes: #45 A really small web API and OS-level machine learning https://t.co/iWV0UemuZL\n","6 | 1 | Free @PacktPub ebook of the day: #Python 3 Object-oriented Programming - Second Edition - https://t.co/t2aLcaSm56\n","5 | 2 | “btcpy released: a full featured #Bitcoin library” by @simonebronzini https://t.co/fRFpC5CHa8\n","7 | 0 | “The Hitchhiker’s Guide to Machine Learning in #Python” by @conordewey3 https://t.co/CLbqpzkqqQ\n","5 | 2 | #Python: Guidelines & Code Style by @LeCoupa https://t.co/yqRTDpfKJy - do your friends and colleagues a favor :)\n","5 | 2 | Code Challenge 32 - Test a Simple #Django App With #Selenium - Review -> https://t.co/Dzjj2qQL8X if you join(ed), P… https://t.co/DB5LWkFd1b\n","6 | 1 | Simple is Better Than Complex: How to Render #Django Form Manually https://t.co/DIwAkFLog4\n","5 | 2 | We started autotweeting any free #python #flask #django Packt ebook that comes out, what else to filter on? #pandas… https://t.co/CqMeQAm5Iz\n","5 | 2 | @techmoneykids nice #Flask #Heroku guide: https://t.co/uOs7VcKNie - helped me deploying our Pillow Banner Generator… https://t.co/gBMZKPVcS5\n","4 | 3 | Free @PacktPub ebook of the day: Learning Robotics Using #Python (time left: 16 hours)\n","3 | 4 | Our review of Code Challenge 30 \"The Art of #Refactoring\" is up: https://t.co/rPn0ThG0Gq - cc @realpython @sig_eu @bettercodehub #cleancode\n","3 | 4 | #python for secret agents ebook for free today -> https://t.co/t2aLcaALdy\n","5 | 2 | Codementor: Building An Image Crawler Using Python And Scrapy https://t.co/SqNqt0b13Z\n","3 | 4 | Our new Twitter digest 2017 - week 30 is up: https://t.co/ZCqZaZTHU3 #python #news #vim #machinelearning #bokeh and more ...\n","4 | 3 | Building Machine Learning Systems with #Python for free today - https://t.co/t2aLcaALdy\n","5 | 2 | Let's do some gui programming this week. Join our new #python code challenge number 26: https://t.co/HK1PVHPZqV\n","5 | 2 | #100DaysOfCode - Day 093: Refactored day 86's Tweet Achive Stats script into a Package https://t.co/iSV8fGS0lE #Python\n","5 | 2 | #100DaysOfCode - Day 085: #Python script to list out the current exchange rate https://t.co/JEvYCzyRTh #Python\n","5 | 2 | #100DaysOfCode - Day 074: Using Pillow to add text and opacity to an image = your own cards https://t.co/uWEo3nW9Cu #Python\n","4 | 3 | #100DaysOfCode - Day 072: Packt ebook download manager https://t.co/3SmBgHYPO3 #Python\n","4 | 3 | New PyBites Code Challenge 22 - #Packt Free Ebook Web Scraper https://t.co/j5KGazaGWJ - you get to sponsor the #Python community! @Pybonacci\n","4 | 3 | #100DaysOfCode - Day 039: #Python script to give you every valid dictionary match of a specified letter ... https://t.co/HXkd94ZAnM #Python\n","6 | 1 | #100DaysOfCode - Day 037: #Python script to pull down an #XML feed and save it https://t.co/N1PTn00yvj #Python\n","5 | 2 | #100DaysOfCode - Day 016: script to #ssh to specified IPs and check their hostnames https://t.co/mPTmZ4RVWH #Python\n","4 | 3 | #100DaysOfCode - Day 014: script to automatically tweet out new @lynda (#Python) titles https://t.co/i7yasDEUyv #Python\n","4 | 3 | #100DaysOfCode - Day 011: generic script to email the contents of a text file https://t.co/kV0socnMST #Python\n","7 | 0 | #100DaysOfCode - Day 002: script to print out valid IPs of a specified user specified network https://t.co/gPvRe6EseJ\n","5 | 2 | From beginner to pro: #Python books, videos and resources https://t.co/A99B0jIT82\n","4 | 3 | Send Advanced Emails with Python MIME Submodules https://t.co/qm33tgIVKV #python\n","3 | 4 | The ultimate list of #Python #Podcasts https://t.co/fqPkqS3zva - nice list\n","5 | 1 | Enjoy our new free Bite of Py: ⏎ ⏎ PyBites Code Challenges | Bite 30. Movie data analysis https://t.co/ljJSmfxgWZ\n","6 | 0 | Beautiful is better than ugly :) ⏎ ⏎ And Now is better than never! ⏎ ⏎ Happy 2018, get coding in #Python https://t.co/Kry4AqP2Wb\n","6 | 0 | from pybites import news: ⏎ ⏎ #Python Twitter Digest 2017 Week 46 https://t.co/WK2XieG5Xn\n","5 | 1 | Dataquest: Kaggle Fundamentals: The Titanic Competition https://t.co/0sEsbNbLq7\n","5 | 1 | Hiding BCC Recipients in Python MIME Emails https://t.co/ZIeM0ZOIzN - thanks @techmoneykids for this invaluable Python mailing trick\n","6 | 0 | PyGithub - a nice wrapper for the #github #api https://t.co/GmglE3C8Bl\n","4 | 2 | 10 Tips to Get More out of Your #python #Regexes https://t.co/h7LvrvW5mi\n","4 | 2 | Simple is Better Than Complex: A Complete Beginner's Guide to #Django - Part 7 https://t.co/yHkgHhGTSd\n","6 | 0 | Oh yeah! Getting serious about #django :) https://t.co/8wgkRtfHZF\n","5 | 1 | @jojociru Cool, will you PR it? Any feedback on our challenges welcome. Nice to see you combine them with #100DaysOfCode\n","5 | 1 | Just attended a talk: very cool. Can't wait to try this! https://t.co/Y14S1uyHIm\n","4 | 2 | Free @PacktPub ebook of the day: #Python Machine Learning Blueprints: Intuitive data projects you can relate to - https://t.co/t2aLcaALdy\n","5 | 1 | nice one @dbader_org - unix pipelines are awesome. We did a code challenge on this one some time ago: https://t.co/oDbnM6fINT\n","6 | 0 | Scriptflask was developed using #Flask which offered good interoperability with #Python, used across a wide range o… https://t.co/HM9cyzYBBz\n","6 | 0 | Generator Expressions in #Python: An Introduction https://t.co/tsVDOZp5jm\n","6 | 0 | Python + Django + CSS Bootstrap + Heroku deployment == joyful coding!\n","6 | 0 | DataCamp: New Course: Natural Language Processing Fundamentals in #Python https://t.co/dSpo2sBH88 #NLP\n","5 | 1 | Bruno Rocha: Simple Login Extension for #Flask https://t.co/sjI8JU9jY0\n","5 | 1 | PyBites reached 1K followers - thx all Pythonistas/devs/enthusiasts! ⏎ (wordcloud via @python_tip's recipe… https://t.co/2uROoa7tcl\n","5 | 1 | Codementor: #Python Practices for Efficient Code: Performance, Memory, and Usability https://t.co/0HbLmaKIC5\n","6 | 0 | When to use #Flask vs #Django? ⏎ ⏎ Julian shares what he learned so far looking at both frameworks ...… https://t.co/PcLxRaUoih\n","5 | 1 | You want to learn some #Pillow and #Flask? You can! Join @PyBites #CodeChallenge 31 - Image Manipulation With Pillow https://t.co/cGaIakkKmk\n","3 | 3 | Code Challenge 29 - Create a Simple #Django App - Review is up: https://t.co/0D2QoumJss #heroku #django-registration, learned quite a bit\n","5 | 1 | Tarek Ziade: #Python #Microservices Development https://t.co/YTwIZET7aJ #flask - @techmoneykids @mohhinder to add your list\n","3 | 3 | Data School: How to launch your data science career (with Python) https://t.co/WztZsMs1Tv\n","3 | 3 | New #Python article by @mohhinder: ⏎ ⏎ From Challenge to Project - How I Made PyTrack, Learning Modules and Packaging - https://t.co/VaQUU6kdIK\n","4 | 2 | Stay up2date with #Python and its ecosystem: checkout out our Twitter news digest. This week's edition # 26 is out: https://t.co/rz1zYunp4M\n","6 | 0 | #100DaysOfCode - Day 094: Simple Python script to #scp get a file from a remote host https://t.co/r63Eiuf1R9 #Python\n","4 | 2 | #100DaysOfCode - Day 091: Showing the broadcasting network for a show using TheTVDB API https://t.co/RjPQxBMTcO #Python\n","4 | 2 | #100DaysOfCode - Day 081: Using unittest mock patch to test Tweepy code without calling the API https://t.co/1cTwGxpvLz #Python\n","5 | 1 | #100DaysOfCode - Day 079: #Python script to capture exceptions when creating an #sqlite db https://t.co/afDF3IzqGa #Python\n","3 | 3 | How to make a game with pygame, nice https://t.co/TFCxcIY8Oa\n","5 | 1 | Might be useful: Using a virtualenv in an IPython notebook - https://t.co/Mr4NZ9Dle4\n","5 | 1 | #100DaysOfCode - Day 054: Script to create a person #class and calculate BMI https://t.co/Ee4zMEKGLh … #Python\n","3 | 3 | PyBites new Code Challenge 20 - Object Oriented Programming Fun https://t.co/MQURZAeTkv #challenge #Python\n","4 | 2 | #100DaysOfCode - Day 051: Use #Python #requests module on a page behind a login https://t.co/1klrgIXOnH #Python\n","4 | 2 | #100DaysOfCode - Day 050: Use folium to draw a map with cities I traveled to https://t.co/YAHxZKxlrY #Python\n","5 | 1 | #100DaysOfCode - Day 046: Get friends updates from Goodreads #API #books https://t.co/9Tu8DhFuNj #Python\n","4 | 2 | #100DaysOfCode - Day 045: #steam XML feed scraper for new #game releases https://t.co/w5eA64oDNM #Python\n","4 | 2 | #100DaysOfCode - Day 044: Random name generator, reading in a bunch of names from a CSV file https://t.co/cHzZdOHBAr #Python\n","4 | 2 | #100DaysOfCode - Day 041: Script to check all possible combinations of letters and match against a dicti... https://t.co/56sMpJjWf6 #Python\n","5 | 1 | Wrote a quick article for #Python beginners (and me!) on how to pull down an #XML file using the requests module. https://t.co/avuGJOLQ7R\n","2 | 4 | Code Challenge 16 - Query Your Favorite #API - Review https://t.co/Aq70VdWK9N - great submissions @mohhinder #Flask #Quotes #books #warcraft\n","5 | 1 | #100DaysOfCode - Day 029: Traffic Lights script to demo #itertools cycle https://t.co/AoNwbklIg5 #Python\n","4 | 2 | New PyBites article: ⏎ ⏎ How to Write a Simple #Slack Bot to Monitor Your Brand on #Twitter ⏎ ⏎ https://t.co/WU1S4t3Cqa ⏎ ⏎ #Python #tools\n","2 | 4 | You want to learn some #Flask? Maybe now is a good time ... ⏎ ⏎ Code Challenge 15 - Create a Simple Flask App ⏎ ⏎ https://t.co/QhBX9ba90o\n","3 | 3 | #100DaysOfCode - Day 018: using #pytest to write tests for @safari RSS scraper (day 017) https://t.co/RWIEw7Pl2t #Python\n","4 | 2 | New on PyBites: the absolute #Flask basics we'd liked to have had: https://t.co/XOGcxlnq0w\n","2 | 4 | Best Practices for Compatible #Python 2 and 3 Code https://t.co/GDORtGOmQP\n","5 | 1 | CPython internals: A ten-hour codewalk through the #Python interpreter source code https://t.co/VY1vJMs2I4\n","4 | 2 | And a screenshot for good measure! Onward to 200k! https://t.co/q8vB0Y7bVn\n","3 | 3 | Nice new article by @dbader_org - Context Managers and the “with” Statement in #Python https://t.co/q2b21rAFXa (including exercises)\n","6 | 0 | @dbader_org great article, nice related history lesson: https://t.co/82bJPsnphM\n","4 | 2 | One of my favorite programming quotes #cleancode https://t.co/qzDrzKgdq5\n","4 | 1 | Next Pythonista to join will be user #1300 and gets 2 ⏎ extra Bites for free @ https://t.co/IZeNwwOWMk ⏎ ⏎ Keep calm and code in #Python\n","5 | 0 | A nice little #python Bite of Py to start your week: “Bite 39. Calculate the total duration of a course” -… https://t.co/hfNHhJdPh7\n","4 | 1 | New @lynda course: Learning #Python - https://t.co/QV7dnuVniR\n","5 | 0 | Free @PacktPub ebook of the day: Learning #Python Application Development - https://t.co/t2aLcaSm56\n","4 | 1 | Keynote - Jacob Kaplan-Moss - Pycon 2015 https://t.co/kfdx4rRvQt - great talk, thanks for sharing @treyhunner\n","4 | 1 | Free @PacktPub ebook of the day: Bayesian Analysis with #Python - https://t.co/t2aLcaSm56\n","3 | 2 | New PyBites Code Challenges | 48 - Create a #Python #News Digest Tool: https://t.co/MWW6TjiuIU - have fun!\n","3 | 2 | #Python Bite of the day: ⏎ Find the most common word in Harry Potter - have fun! ⏎ https://t.co/GNmyv6UDFy ⏎ #BitesOfPy #CodeChallenges #promo\n","3 | 2 | “Myths and mistakes of PyCon proposals” by @irinatruong https://t.co/L69H3Q7VcY\n","4 | 1 | 5 cool things you can do with #python #itertools https://t.co/QpmyZFri6d\n","3 | 2 | @FerroRodolfo recently joined our Code Challenges and built Disaster Attention Bot, a #Telegram #chatbot that helps… https://t.co/cmIRqdtDIF\n","5 | 0 | @pythonbytes @brianokken sure @_juliansequeira (Flask addict) wants to hear this asap :)\n","2 | 3 | Not sure what's best? ⏎ I keep my virtual environment directories\n","4 | 1 | Twitter Digest 2017 Week 41 https://t.co/ekRDhWLvTQ\n","2 | 3 | Python Data: Text Analytics with Python – A book review https://t.co/D9pjf6k1um\n","3 | 2 | Daniel Bader: Iterator Chains as Pythonic Data Processing Pipelines https://t.co/pZLhjw70w7\n","5 | 0 | cc @techmoneykids - I think you will enjoy this book https://t.co/7HYU8hknOJ\n","5 | 0 | PyBites Newsletter - #Code Challenges, #Django, Code Quality, Resources https://t.co/DVo9B2BQdq\n","4 | 1 | Free @PacktPub ebook of the day: #Python Machine Learning - https://t.co/t2aLcaSm56\n","5 | 0 | very useful! #python #debugging https://t.co/P7o863moT6\n","3 | 2 | Free #TensorFlow ebook today https://t.co/PA8hO5WMC1\n","4 | 1 | Building a Bullet Graph in #Python - https://t.co/hJebuqkGmO via @chris1610 - \"the old world of Excel pie charts is not going to cut it ...\"\n","5 | 0 | Forecasting Time Series data with #Python #Prophet (Notebook) https://t.co/1TqLdYpKAn - @techmoneykids remember our PYPI 100k challenge?\n","4 | 1 | Great article on #writing: ⏎ - respect the reader ⏎ - simple > complicated ⏎ - importance lead paragraph ⏎ - read post alou… https://t.co/kGnL0olofv\n","2 | 3 | PyBites New #Python Code Challenge is up: #33 - Build a - #Django Tracker, Weather or Review App -… https://t.co/6FNHg8Sv03\n","4 | 1 | @python_tip Cool. See also https://t.co/3Ei8SqPo1S for comparison using sorted\n","2 | 3 | Nice: “A Closer Look At How Python f-strings Work” by @skabbass1 https://t.co/1BZxsMJmph - not only more elegant also faster! Here's why\n","3 | 2 | PyBites Code Challenge 31 - Image Manipulation With #Pillow - Review is up: https://t.co/coZK3EREOV - nice submission @mohhinder #Python\n","4 | 1 | Bookmarking: A Minimal Django Application https://t.co/tkgf7nRAMA via @vitorfs - awesome Django tutorials, thanks\n","4 | 1 | The Digital Cat: Refactoring with tests in Python: a practical example https://t.co/ImejByWnHZ\n","4 | 1 | Talk Python to Me: #121 Microservices in Python https://t.co/416f4cs1bU\n","5 | 0 | Mike Driscoll: Python: All About Decorators https://t.co/KVwrmoDRkX\n","3 | 2 | PyBites Code Challenge 26 - Create a Simple Python GUI - Review is up: https://t.co/JMPeT0mEDX #python #GUI #tkinter #easygui #matplotlib\n","5 | 0 | New @lynda course: #Python Parallel Programming Solutions - https://t.co/YmqrYSemMi\n","5 | 0 | @lynda @techmoneykids funny how this was completely auto-tweeted by a script we wrote for our #100DaysOfCode challenge :)\n","2 | 3 | Challenge #25 - Notification Service of Upcoming Movies Review is up: https://t.co/klWFvY2qaZ - standby for our new challenge tomorrow ...\n","5 | 0 | #100DaysOfCode - Day 095: Class to cache moviedb API responses #shelve #decorator #namedtuple https://t.co/u6yQt9ttFs #Python\n","4 | 1 | @pybites max Twitter mentions: @talkpython @dbader_org @python_tip @mohhinder - https://t.co/DwDw35U0rz - good weekend! cc @techmoneykids\n","3 | 2 | Instagram Makes a Smooth Move to Python3 https://t.co/a5BEEUA8DC \"Performance speed is no longer the primary worry. Time to market speed is\"\n","2 | 3 | New #python code challenge: https://t.co/R0zVIrIm7l - this week we challenge you to build a simple API to track challenge stats - have fun!\n","4 | 1 | @python_tip cool! it even supports unary + ⏎ ⏎ >>> c = collections.Counter([1, 2, 2]) ⏎ >>> c[1] -= 3 ⏎ >>> c ⏎ Counter({2:… https://t.co/dykmTILBKA\n","4 | 1 | #100DaysOfCode - Day 075: #Python script to take screenshots using #pyscreeze @AlSweigart https://t.co/jURbnimd6Y #Python\n","5 | 0 | #100DaysOfCode - Day 070: How to parse html tables with #pandas (#jupyter notebook) https://t.co/ScxtNzq303 #Python\n","4 | 1 | #100DaysOfCode - Day 069: #Python CLI based #Pomodoro Timer with #webbrowser alarm https://t.co/3N4ZwK9LrL #Python\n","4 | 1 | New #PyBites Article: OOP Beyond the Basics: Using Properties for Encapsulation, Computation and Refactoring - https://t.co/VfFHqtQYQm\n","2 | 3 | #100DaysOfCode - Day 043: Script to read in a list and reverse its contents https://t.co/FdytckaNgw #Python\n","3 | 2 | #100DaysOfCode - Day 042: Using #Python icalendar module to parse FB birthdays cal (ics file) https://t.co/mBfWyYjAeV #Python\n","2 | 3 | #100DaysOfCode - Day 033: I need to drink more water at work so I wrote a #Python #script to remind (spa... https://t.co/OuuZeORbNy #Python\n","3 | 2 | A thorough guide to #SQLite database operations in Python - https://t.co/OEGdMemdOQ\n","2 | 3 | Minimal examples of data structures and algorithms in #Python - https://t.co/7DstzyEOUF\n","4 | 1 | #100DaysOfCode - Day 020: monitor #Twitter and post to #slack each time our domain gets mentioned https://t.co/AQpYOxDxi1 #Python\n","3 | 2 | @python_tip Very cool, but note it's >= 3.5, for earlier version you probably want itertools.chain, nice article: https://t.co/laftUQNw2J\n","4 | 1 | #100DaysOfCode - Day 012: using OpenWeatherMap #API to compare weather in Australia vs Spain https://t.co/h0gxy7K2C0 #Python\n","4 | 1 | #100DaysOfCode - Day 010: script to spot cheap @transavia flights using their #API https://t.co/THZQRdsbCm #Python\n","3 | 2 | #100DaysOfCode - Day 004: script that converts a text list to a text string https://t.co/kdRkwGe27h #Python\n","2 | 3 | A new week, a new 'bite' of py: ⏎ This week we will build Hangman #game. ⏎ Have fun! ⏎ ⏎ Join us and learn more #python ⏎ ⏎ https://t.co/QOMEWZhyPs\n","3 | 2 | Showing the Difflib #Python stdlib module some love today by comparing lists! Read it then enjoy a beer! https://t.co/FBZQvywkLy\n","2 | 3 | Code Challenge 06 - When does PyPI reach 100K packages? https://t.co/bY5Hmv6XOm #python\n","4 | 1 | Build Your First Python and Django Application https://t.co/3N8FgBn6mZ\n","3 | 2 | Python Tricks #5: String Conversion in Python (__str__ vs __repr__) https://t.co/1XoX1Hh75R - well explained!\n","2 | 3 | Pybit.es — our new #Python blog - https://t.co/jM6ZsdyKPR\n","3 | 2 | List of Awesome Python Resources https://t.co/7i4ODGGwkb #python\n","4 | 1 | Challenge: Course Total Time Web Scraper https://t.co/RTwa15021s #python\n","3 | 1 | from pybites import News ⏎ ⏎ Twitter Digest 2018 Week 04 https://t.co/DreQRPE2fU ⏎ ⏎ #python #news #regex #blockchain… https://t.co/AC1XwlOEmD\n","3 | 1 | Using Pandas and Seaborn to solve PyBites Marvel Challenge https://t.co/bKJhIbneVm\n","4 | 0 | This is awesome! Thanks @anthonypjshaw ⏎ ⏎ Run this in your terminal: ⏎ ⏎ python <(curl -s https://t.co/Rix6bn0JWB)\n","4 | 0 | Thanks guys for covering our new platform, much appreciated :) https://t.co/n6wWLddRw1\n","2 | 2 | Back in the PHP days I liked print_r, for #python we can use this to see all properties and values of an object: ⏎ ⏎ f… https://t.co/oN4qRS6atJ\n","3 | 1 | Our new Twitter #Python #News digest is out: ⏎ https://t.co/wptQwm5XH4 https://t.co/eNDH3Cw3DX\n","3 | 1 | Nice: 3 pull requests already on #regex Challenge 42 https://t.co/nJlsDPQ34l - always be coding! #python\n","4 | 0 | Thanks @digitalocean for #Hacktoberfest, our corresponding #python challenge got some nice PRs submitted: https://t.co/ewEOxVgYCv\n","3 | 1 | Cool: VCR.py simplifies and speeds up tests that make HTTP requests. - https://t.co/BNk8jpHURt #testing cc @brianokken\n","2 | 2 | 5 min guide to PEP8 https://t.co/sYP5YjtcvO - bears rereading from time to time. Set up pre-save flake checks in your editor, so useful!\n","2 | 2 | Here our weekly Twitter Digest 2017 Week 42 https://t.co/iCYtVPVfE6 #python #news\n","3 | 1 | PyBites Twitter Digest 2017 Week 39 https://t.co/iQH1lSJaNf - #python #news\n","2 | 2 | On the reading list and recommended #ML book - @safari users take notice! https://t.co/TDhQ5c9DCS\n","3 | 1 | Ned Batchelder: Beginners and experts https://t.co/WMxkk9TS0E \"The good news for beginners is: this isn't about you. Software is difficult.\"\n","3 | 1 | \"You don't need to be expert\" ... this realization also helps when stuck on an article. Great thread! https://t.co/FHVt4iy7Qv\n","3 | 1 | @fredosantana227 awesome, #100DaysOfCode it really works. it was tough at times but we finished it writing 5K loc.… https://t.co/9xTci0jbVa\n","3 | 1 | PyBites of the Week - Challenge 32 Review, #Flask, #Django, #Pillow, #Selenium, #Requests, #Apps! - https://t.co/nvetyLktoR\n","3 | 1 | NumFOCUS: How to Compare Photos of the Solar #Eclipse using #Python and SunPy https://t.co/bSpJ3M3V5F\n","4 | 0 | @python_tip nice, hope you got some more tips, we shared the tip submit link in our last newsletter. we need to submit some ourselves too :)\n","2 | 2 | Our new Code Challenge 32 is up: Test a Simple #Django App With #Selenium https://t.co/mz7mJteNca https://t.co/2lAU9pmYpL\n","3 | 1 | Django Tips #21 Using The Redirects App https://t.co/71WIjL72Bk via @vitorfs\n","2 | 2 | New PyBites article: Using #Pillow to Create Nice Banners For Your Site - https://t.co/b2E65Q7ygp #Python https://t.co/HofmDbrLk0\n","3 | 1 | What will you be working on this weekend? Gonna play a bit with Django REST Framework :)\n","3 | 1 | Codementor: A Dive Into Python Closures and Decorators - Part 2 https://t.co/XCXDa2raPD\n","3 | 1 | Mastering #Python for #finance #ebook today for FREE, thanks to @PacktPub - https://t.co/t2aLcaALdy\n","3 | 1 | https://t.co/cUDz09VRcU python microservices on safaribooks :)\n","3 | 1 | Useful: #Django Best Practice: Settings file for multiple environments by @ayarshabeer https://t.co/Fi3xlDSZlW\n","3 | 1 | Code Challenge 27 - PRAW: The Python Reddit API Wrapper - Review is up: https://t.co/HfPXpOZ6Jt - some nice submissions, thx @bboe for Praw\n","3 | 1 | Our first #Django app! ⏎ ⏎ And new PyBites Article: ⏎ ⏎ First Steps Learning Django: PyPlanet Article Sharer App ⏎ ⏎ https://t.co/8uDoCgR9Xb\n","2 | 2 | New @lynda course: Introduction to #Python Recommendation Systems for Machine Learning - https://t.co/k67VSuMTh5\n","3 | 1 | @techmoneykids + our community: ⏎ ⏎ Happy 200 days of @pybites !! ⏎ ⏎ I knew, but was reminded by our newpost script :)… https://t.co/4REtqyDtwg\n","4 | 0 | #100DaysOfCode - Day 098: Script to use the #Instagram #API to authenticate and pull your media https://t.co/2eUDW8JyNG #Python\n","3 | 1 | @tacolimCass Maybe you want to take one of our code challenges? https://t.co/B9rjJoBWH5\n","2 | 2 | #100DaysOfCode - Day 080: \"Is this Bob or Julian?\" - script to reveal who of @pybites tweets https://t.co/BGo97eXUAG #Python\n","2 | 2 | Records, Structs, and Data Transfer Objects in Python ⏎ ⏎ Nice overview! ⏎ ⏎ https://t.co/N9zdAsJBrw\n","3 | 1 | https://t.co/5OTk6XaXhk #python decorators unwrapped @wonderfulboyx_e\n","3 | 1 | #100DaysOfCode - Day 068: @mohhinder translated our 'from PyBites import newsletter' into code https://t.co/6ynnsBlS6e #Python\n","2 | 2 | Wow @mohhinder this is so cool, thanks (missed this tweet somehow). @techmoneykids need to mention this in next new… https://t.co/qol7UevnPa\n","3 | 1 | Good questions, what's your #Python story? Hearing many cool stories here at #PyCon2017 https://t.co/6C6zBoN2wA\n","3 | 1 | Awesome talk https://t.co/TVeRsHpGv5\n","4 | 0 | Good vibes at #PyCon2017 https://t.co/W91qvRM1Xz\n","3 | 1 | #100DaysOfCode - Day 049: Email contents of an #sqlite db https://t.co/cBIedbdbwp #Python\n","3 | 1 | #100DaysOfCode - Day 048: Use the Faker module to get (random) fake Dutch names https://t.co/ZZTT1C0fg5 #Python\n","3 | 1 | #100DaysOfCode - Day 047: Customisable script for pulling down XML feeds with a cron job https://t.co/8sMXlib2te #Python\n","3 | 1 | #100DaysOfCode - Day 040: PyBites podcast challenge 17 in less than 100 LOC using #scheduler and #shelve https://t.co/iQkcR0dPW9 #Python\n","2 | 2 | Nice article on Object-relational mappers (ORMs) - https://t.co/gVqojN4qlF\n","3 | 1 | #100DaysOfCode - Day 027: rough script to query the #warcraft #API for a character's mounts https://t.co/sMvmlbV8F0 #Python\n","3 | 1 | #100DaysOfCode - Day 024: generate color hex codes from random RGBs and color terminal text https://t.co/PtTTDbthGA #Python\n","2 | 2 | #100DaysOfCode - Day 019: paste in a list of numbers from the clipboard, sort to ascending then copy bac... https://t.co/yg6BsAdU5X #Python\n","2 | 2 | #100DaysOfCode - Day 015: script to calculate the number of posts on @pybites https://t.co/Nvqp0rMuGk #Python\n","4 | 0 | Interesting @techmoneykids https://t.co/8eLpqZdRRs\n","2 | 2 | New @lynda course: #Python for Data Science Essential Training - https://t.co/AWFvjxaZwv\n","3 | 1 | amazing how many python books and videos get released these days\n","2 | 2 | #100DaysOfCode - Day 009: interactive script to create a new Pelican blog article https://t.co/Tg7sjYHz8j #Python\n","2 | 2 | New PyBites Article: How to Build a Simple #Slack Bot - https://t.co/aycTca3jEZ #python\n","2 | 2 | from @pybites import newsletter - https://t.co/3dFZAdKx3f - #Python #Articles #Challenges #News\n","2 | 2 | [Article]: Generators are Awesome, Learning by Example https://t.co/ijy6BZK3n6 - enjoy and let us know if you found other cool uses #python\n","2 | 2 | Python's data model by example https://t.co/TamQncQvuc - I really like #python magic methods, very powerful (might need to do a part II)\n","2 | 2 | Nice tutorial, thanks https://t.co/Z36BKO6LRE\n","2 | 2 | Code Challenge 07 - Twitter data analysis Part 3: sentiment analysis https://t.co/Ues7UOlMBN #python\n","3 | 1 | nice one, had not used print like this before https://t.co/b3mbLZT7DY\n","2 | 2 | Color quantization using k-means #Data Mining #Python\n","2 | 2 | Cool: Ex Machina features #python https://t.co/wTns5sgrCn - even more eager to watch it now :)\n","2 | 1 | Free @PacktPub ebook of the day: Learning OpenCV 3 Computer Vision with #Python - Second Edition - https://t.co/t2aLcaSm56\n","3 | 0 | Doug Hellmann: pyclbr — Class Browser — PyMOTW 3 https://t.co/3WukItBmAn\n","2 | 1 | PyBites Code Challenges | Bite 4. Top 10 PyBites tags https://t.co/Wm9zD4Hy5r\n","2 | 1 | Love this tool https://t.co/jc9El6BQQH\n","3 | 0 | @pythonbytes @brianokken Thanks guys for featuring our guest article on @RealPython\n","3 | 0 | @FerroRodolfo Good point, we're not at 5 yet. Yes, let's buy it for the best submission regardless. Surprise us! :)… https://t.co/griKvcRbtd\n","3 | 0 | You want a quick way of persisting data without a full blown database? Why not Shelve It? https://t.co/SnxiX9BC6m\n","2 | 1 | Free @PacktPub ebook of the day: #Python Projects for Kids - https://t.co/t2aLcaSm56\n","2 | 1 | Our new weekly Twitter Digest is up: ⏎ ⏎ https://t.co/wCalciSSdl ⏎ ⏎ #python #regex #hacktoberfest #twilio #flask… https://t.co/8NW2gBrMry\n","2 | 1 | #python #codechallenges #poll ⏎ ⏎ I'd like to see more PyBites code challenges on:\n","3 | 0 | “Using UUIDs as primary keys” by Julien Dedek https://t.co/58mp8wxyO1\n","3 | 0 | What can we write about that helps you improve your Python? What are you struggling with? (Decorators already at the top of our list)\n","2 | 1 | Free @PacktPub ebook of the day: Building RESTful #Python Web Services - https://t.co/t2aLcaSm56\n","2 | 1 | Celebrate #opensource this October with #Hacktoberfest https://t.co/zlULiGez2m - a good opportunity to PR some of our #Python challenges ...\n","2 | 1 | Getting serious: bought a copy of Two Scoops of #Django 1.11: Best Practices for the Django Web Framework https://t.co/6yoN8rnhLA\n","1 | 2 | Enjoyed @astrojuanlu's keynote (Spanish) about the importance of open source and our community! Thanks streaming… https://t.co/JAUB2P9rnn\n","1 | 2 | PyBites #python Twitter Digest 2017 Week 38 is out: https://t.co/xq6jOhcsKV\n","2 | 1 | Daniel Bader: Contributing to #Python Open-Source Projects https://t.co/u60A0qgqI2\n","3 | 0 | Thanks @sivers, your learn JS post inspired us to craft our own for Python and your \"hell yeah!\" helped us focus on PyBites\n","2 | 1 | Weekly #Python Chat: #Generators! https://t.co/3R8G5ZV8XJ\n","3 | 0 | “Python Gem #9: itertools.chain” by Adam Short https://t.co/JisPG9aSaT\n","2 | 1 | “A Brief Analysis of ‘The #Zen of #Python’” by Jonathan Michael Hammond https://t.co/rp3iHkXQFY\n","2 | 1 | Python Insider: #Python 3.6.2 is now available https://t.co/Z2MpMfbc0V\n","3 | 0 | Daniel Bader: Extending #Python With C Libraries and the “ctypes” Module https://t.co/zQ8hrVfpwK\n","2 | 1 | #Django News This Week https://t.co/8WrIg4fe5O - thanks @originalankur\n","1 | 2 | PyBites #Python Twitter News Digest 2017 week 35 is out - https://t.co/qLcQpl9kc8 https://t.co/jCoDCoPsXR\n","3 | 0 | “Modern #Django — Part 2: REST APIs, Apps, and Django REST Framework” by @d_j_stein https://t.co/HaB9dNZb3f\n","3 | 0 | Possbility and Probability: Debugging #Flask, requests, curl, and form data https://t.co/IwMcsiPhTz\n","1 | 2 | Challenge #33 - Build a #Django Tracker/Weather/Review App - Review: https://t.co/sKIZDJCbs9 -> built anything cool with Django this week?\n","3 | 0 | #Django Weekly 53 - Celery Workflow, Transaction Hooks, Django Rest API https://t.co/MzVR4G3JDx\n","3 | 0 | @dbader_org absolute joy for programmers, maybe we have become spoiled though ;)\n","3 | 0 | Nice: PyCharm: Develop #Django Under the Debugger https://t.co/CHWxnwGwi1 - hm ... maybe need to give PyCharm a serious try :) #debugging\n","3 | 0 | Awesome: How to Add Social Login to #Django https://t.co/TSMgNRYEO0 via @vitorfs - useful for this week's challenge https://t.co/MtUaZeHc8k\n","2 | 1 | #Python Bytes: #39 The new PyPI https://t.co/kISzvV52bh\n","2 | 1 | Another great episode of @pythonbytes full of cool #python stuff to explore https://t.co/rTiDGov5vO\n","1 | 2 | New @lynda course: #Python for Data Science Tips, Tricks, &amp; Techniques - https://t.co/EQfKR8BKFk\n","3 | 0 | Interesting read: From List Comprehensions to Generator Expressions - https://t.co/vLbEdvONYf\n","2 | 1 | Speed up your Python data processing scripts with Process Pools https://t.co/ErCvNTASrg\n","3 | 0 | Doug Hellmann: sqlite3 — Embedded Relational Database — PyMOTW 3 https://t.co/R1YUSMvxsB\n","1 | 2 | codeboje: Review: #Python Hunting Book https://t.co/1ayW8HTK4O../../review-python-hunting-book/ #pygame\n","2 | 1 | Python Bytes: #36 Craft Your Python Like Poetry and Other Musings https://t.co/HNygHuzfvy\n","2 | 1 | New PyBites Article: Module of the Week - Pexpect https://t.co/49Leqe8c0P\n","2 | 1 | Our new Code Challenge 29 is up: Create a Simple #Django App https://t.co/IlPSdmY956 - have fun\n","2 | 1 | New PyBites Article: Deploying a Django App to PythonAnywhere https://t.co/DIPAKIXNLU\n","2 | 1 | Python Bytes: #35 How developers change programming languages over time https://t.co/02n3QZPWdt\n","2 | 1 | Django docs are great!\n","2 | 1 | This week's PyBites Twitter News Digest is out: https://t.co/icBV1ReBvh #Python\n","3 | 0 | @benjaminspak Lol don't think so :) ⏎ ⏎ Gonna focus on one big project next 100 days == Django ⏎ ⏎ We did see 100 days wo… https://t.co/i7IWmySN67\n","2 | 1 | 10 Tips to Get More out of Your Regexes: ⏎ https://t.co/k3fd8aEh8d ⏎ ⏎ Updated with @AlSweigart nice PyCon intro talk. ⏎ ⏎ #Python #regex\n","3 | 0 | @dale42 @rarity2305 @tacolimCass @petermuniz @masharicodes @elliot_zoerner Thanks, 9 days left! :)\n","2 | 1 | New PyBites article: Module of the Week - Pendulum - https://t.co/rh7DQvyffK\n","3 | 0 | Today's free @PacktPub ebook: Modular Programming with #Python - get it here: https://t.co/t2aLcaALdy\n","2 | 1 | Mike Driscoll: Book Review: Software Architecture with Python https://t.co/s8wJk7P2ms - ok sold, my next #Python read\n","2 | 1 | PyBites #Python News Digest Week 24 is up - https://t.co/p8il7lCTbv #faker #flask #instagram #twilio #nasa #data #PyCon2017\n","3 | 0 | Articles week #24: ⏎ ⏎ 1. How to Write a Python Subclass ⏎ 2. Parsing Twitter Geo Data and Mocking API Calls by Example ⏎ ⏎ https://t.co/RgF1Za8Se3\n","3 | 0 | Go Portland! @mkennedy @brianokken - read you are even aiming for 100% wow https://t.co/vesDGLYINE\n","2 | 1 | @techmoneykids @anthonypjshaw @bbelderbos @dbader_org $ python whotweeted.py https://t.co/bmKyW0TYMH ⏎ Bob tweeted it… https://t.co/Elzii2wlrY\n","3 | 0 | @techmoneykids @anthonypjshaw @bbelderbos @dbader_org I thought we could do better than that :) ⏎ ⏎ (it started small… https://t.co/VCPJpjvCwQ\n","2 | 1 | #100DaysOfCode - Day 076: Script to scrape Packt free ebook site and send html notification mail https://t.co/Bol7mcSc9I #Python\n","3 | 0 | from @PyBites import newsletter - https://t.co/0ARvFHun7o - #Python #Articles #Challenges #News\n","3 | 0 | #100DaysOfCode - Day 073: #Python script to download a file using #FTP https://t.co/dF8dd0o89g #Python\n","3 | 0 | #100DaysOfCode - Day 071: How to calculate the # of days between two dates #Python #datetime https://t.co/J78b38HFPd #Python\n","3 | 0 | PyBites #python #news tweet digest, so much good stuff happening in our community! https://t.co/IvSfe5S9X2\n","2 | 1 | New PyBites article: #flask sessions - https://t.co/pwdz9T8aEs\n","3 | 0 | Cool: #movie recommendation system based on the GroupLens dataset of MovieLens data - https://t.co/7jiiorRSW1\n","2 | 1 | Our weekly #Python Twitter digest 2017 - week 21 https://t.co/DJgig7YAWo\n","2 | 1 | Had fun with #python OOP and dunder aka special methods, some (lshift / rshift) I had not used before - https://t.co/2pAvG0WqZc\n","3 | 0 | #100DaysOfCode - Day 055: Parse/store #PyCon2017 talks meta data in DB - #BeautifulSoup #sqlite https://t.co/co0y5MXts7 #Python\n","3 | 0 | Well that was it, goodbye #PyCon2017 - what an awesome conference + community, so happy I could attend. Thanks all that made it possible!\n","3 | 0 | pgcli - a REPL for Postgres https://t.co/8ddSupFmi3\n","3 | 0 | Thanks @pythonbytes for the mention: https://t.co/uZLLF8nqE6 #flask #sqlalchemy\n","3 | 0 | Awesome finally meeting @dbader_org at PyCon :)\n","2 | 1 | Code Challenge 19 - Post to Your Favorite API https://t.co/oZnXM16Ncm\n","2 | 1 | Code Challenge 18 - Get Recommendations - Review https://t.co/pA27kC62dF\n","2 | 1 | New PyBites article: ⏎ Building a Simple Birthday App with #Flask #SQLAlchemy (importing #Facebook bday calendar) ⏎ ⏎ https://t.co/mbydDRIlMv\n","1 | 2 | New PyBites Article: Learning Python by Building a Wisdom Quotes App https://t.co/A3AWHiOOmb #Flask #API #Python\n","2 | 1 | Inspirational guest post from @mohhinder: The making of my Task Manager App - https://t.co/QvZGu1C921 - thx Martin #Flask #codechallenges\n","3 | 0 | @bbelderbos @techmoneykids Plus! Who wants to hear their alarm every hour ;) Python is way more humane!\n","1 | 2 | New PyBites Twitter digest is up: 2017 week 17 https://t.co/WhMOs4848f\n","2 | 1 | Learn #Python by Coding for Yourself https://t.co/zP1DTxDiTX - round of applause for our Julian @techmoneykids - great progress man!\n","3 | 0 | Totally stoked people PR their code for our weekly #Python code challenges - https://t.co/nugm84MhkB (cc @techmoneykids )\n","2 | 1 | #100DaysOfCode - Day 022: create and paste #Amazon affiliation link to clipboard #pyperclip @AlSweigart https://t.co/4Wy244OgRW #Python\n","1 | 2 | Code Challenge 14 - Write DRY Code With #Python #Decorators - Review is up - https://t.co/tN2S6L7E4L - we hope you learned as much as we did\n","2 | 1 | @stephanieaslan @twilio @SeekTom Very inspiring, thanks, can't wait to use @twilio to automate a future event :)\n","2 | 1 | Comparing Lists with Difflib https://t.co/cxGvrZ3rqF - nice #python module I used again this week\n","3 | 0 | Started watching Modern #Python LiveLessons by @raymondh, just released on @safari, awesome, learning a lot! Thanks https://t.co/5WoHQJnwkU\n","2 | 1 | New PyBites Article: Flask for Loops - Printing Dict Data https://t.co/DZy2zDNyOu - starting #flask and #jinja templates\n","2 | 1 | New PyBites Article: How we Automated our #100DaysOfCode Daily Tweet https://t.co/jro1giMpyK #python\n","2 | 1 | #100DaysOfCode - Day 003: script to generate a gif from various png/jpg images https://t.co/9D5ZORJ6qL #Python\n","1 | 2 | New on #lynda: Migrating from Python 2.7 to Python 3 - https://t.co/Td41gXvhFm\n","2 | 1 | Jeff Knupp: Improve Your Python: Python Classes and Object Oriented Programming https://t.co/SwABT9Q3jo\n","1 | 2 | PyBites – 5 #Vim Tricks to Speed up Your #Python Development https://t.co/CpndCvMKKj\n","2 | 1 | #Python Logging Tutorial https://t.co/lc8gejSiWd - good reminder, setting up logging might save you hours of debugging later\n","2 | 1 | Check out this week's @PyBites Newsletter! We learned a LOT of #python with our #code challenge. Join us at - https://t.co/chzxl0RLrd\n","3 | 0 | Interesting example / stack (cc @mschilling swagger) https://t.co/dwD6n48mlx\n","2 | 1 | Tips to Become a Better #Python Developer cheat sheet. Get your own @pybites https://t.co/G8zezP8BI2\n","2 | 1 | New on PyBites: Don't let mutability of compound objects fool you! ⏎ - https://t.co/l5tFd5bbr9 #python\n","2 | 1 | Nice article, saved for future reference: ⏎ ⏎ A Simple Guide for Python Packaging” by @flyfengjie https://t.co/iRHEuIGwnS\n","2 | 1 | New article on PyBites: How To Build a Simple #API with #Flask and Unit Test it - https://t.co/yLMoNf74r7 #python\n","2 | 1 | Sublime Text Settings for Writing Clean Python https://t.co/GUgXHAL8Pk #python\n","2 | 1 | Code Challenge 06 - When does PyPI reach 100K packages? https://t.co/bY5Hmv6XOm #python\n","2 | 1 | #9 Walking with async coroutines, diving deep into requests, and a universe of options (for AIs) https://t.co/fW9nzSSKHF #python\n","2 | 1 | #PyBites #python Code Challenge 02 - Word Values Part II - a simple game: https://t.co/BzKQg8t1ad - have fun!\n","2 | 1 | How to Write Regularly for Your Programming Blog https://t.co/fbUCU1do5v #python\n","2 | 1 | 5 min guide to PEP8 https://t.co/8LoAzqBqvT #python\n","2 | 1 | Book that makes algorithms accessible https://t.co/2tkf4ZWiJA #python\n","2 | 0 | from pybites import News ⏎ ⏎ Twitter Digest 2018 Week 06 https://t.co/troWcWY4ES ⏎ ⏎ #python\n","2 | 0 | @python_tip Congrats, a lot of great tips so far\n","2 | 0 | Free @PacktPub ebook of the day: Modern #Python Cookbook - https://t.co/t2aLcaSm56\n","2 | 0 | @diek007 @RealPython Thanks this was a fun project indeed\n","2 | 0 | @RobHimself1982 Outside your comfort zone you grow ;)\n","2 | 0 | @MattStibbs @AndySugs this makes our day\n","2 | 0 | from pybites import News ⏎ ⏎ Twitter Digest 2018 Week 03 https://t.co/5w2ob7S0tF\n","1 | 1 | New edition: ⏎ ⏎ from pybites import News ⏎ https://t.co/wZanBJELlJ ⏎ ⏎ So much cool #python stuff going on!\n","2 | 0 | from pybites import News ⏎ ⏎ Twitter Digest 2018 Week 01 https://t.co/STI8XbQA9t ⏎ ⏎ #Python #news\n","1 | 1 | Happy New Year / Feliz año nuevo. Wishing you all a joyful, healthy and Python rich 2018! https://t.co/2EgjDc9eKt\n","2 | 0 | @FerroRodolfo Mate this ROCKS! It looks like we may have a thing for code challenges haha! I want a copy!\n","2 | 0 | Thanks @mui_css for making it easy to create an elegant and mobile friendly design!\n","2 | 0 | @pyconit beautiful, nice teaser\n","2 | 0 | @anthonypjshaw @tryexceptpass Likely yes, we really want to join you there!\n","2 | 0 | @FerroRodolfo @bbelderbos @_juliansequeira haha race condition, I tweeted it the same minute. Thank you too, awesome job!\n","2 | 0 | @fullstackpython Thanks, the more I use Django the more I love it :)\n","2 | 0 | @FerroRodolfo Exciting, we get it up soon, thanks!\n","2 | 0 | Free @PacktPub ebook of the day: Expert #Python Programming - Second Edition - https://t.co/t2aLcaSm56\n","1 | 1 | @FerroRodolfo You earned it mate! Again, great work!!\n","2 | 0 | @pythonbytes or @pybites? haha - follow them both I'd say :) https://t.co/z0TakzyQ94\n","1 | 1 | Free @PacktPub ebook of the day: #Python Machine Learning - https://t.co/t2aLcaSm56\n","2 | 0 | Our first Code Challenge 01 - Word Values Part I https://t.co/1mNw7KyqIn - a fun little exercise to explore #python's builtin sum and max.\n","2 | 0 | @AlSweigart @python_alc Enhorabuena @DavidPeinad0\n","2 | 0 | Talk Python to Me: #136 Secure code lessons from Have I Been Pwned https://t.co/42oCDY146p\n","1 | 1 | Few hours left ... https://t.co/lCgHjbDU5o\n","2 | 0 | Playing with #pytest ⏎ Fascinating how adding tests changes your modularity/ design for the better.\n","1 | 1 | New PyBites Twitter Digest 2017 Week 43 is up: https://t.co/LhPl5hYDoj - because we love #python! Good weekend\n","2 | 0 | @BetterCodeHub @bbelderbos thanks, very nice feature\n","2 | 0 | Ned Batchelder: How code slows as data grows https://t.co/atCQnIDFPm\n","2 | 0 | @CaktusGroup Nice newsletter!\n","1 | 1 | Excited about Code Challenge 38 - Build Your Own Hacktoberfest Checker With #Bottle https://t.co/l6TT4seCzh\n","1 | 1 | Free @PacktPub ebook of the day: Scientific Computing with #Python 3 - https://t.co/t2aLcaSm56\n","2 | 0 | Creating Charts in #Django https://t.co/nWpb8a39a3\n","2 | 0 | free @PacktPub #ml book https://t.co/smzcraHBDy\n","1 | 1 | DataCamp: How Not To Plot Hurricane Predictions https://t.co/bvNwj8X5ch\n","2 | 0 | Stack Abuse: Differences Between .pyc, .pyd, and .pyo Python Files https://t.co/rktFXaeDSw\n","1 | 1 | Watch “Pipenv Screencast” on #Vimeo https://t.co/5qhvmrkGjO\n","2 | 0 | doing it again right? ;) ⏎ here is the link: https://t.co/NTFBqLkTsY\n","2 | 0 | Dataquest: How to Generate FiveThirtyEight Graphs in Python https://t.co/iqpSAE7vKS\n","2 | 0 | Vladimir Iakolev: Building a graph of flights from airport codes in tweets https://t.co/AbNrdH4pT7\n","1 | 1 | What up everybody, for #PyBites #CodeChallenges, re @github infrastructure, what would be best? Thanks\n","2 | 0 | #DRF tutorial #3 - https://t.co/pIfu0nfI9d \"Using generic class-based views\" - wow that is indeed some pretty concise code!\n","1 | 1 | New PyBites Article: Hiding BCC Recipients in #Python MIME Emails https://t.co/Fll7Riwa2V\n","2 | 0 | PyCharm: Hacking Reddit with #PyCharm https://t.co/8Hg8k7FWAy #python\n","1 | 1 | PyBites Code Challenge 35 - Improve Your #Python Code With @BetterCodeHub https://t.co/hb5xh6jzxd\n","1 | 1 | Python Software Foundation \"#Python is popular in Nigeria because it’s one of the easiest ways to learn programming\" https://t.co/GetPfOr5j2\n","2 | 0 | William Minchin: PhotoSorter #Python script 2.1.0 Released https://t.co/dl9RXKI14x\n","1 | 1 | Bruno Rocha: Deploying #Python Packages to PyPI using #Flit - https://t.co/8QloOk16yG\n","2 | 0 | Not sure why I waited so long to use command-t (again) to navigate files in #vim! - https://t.co/blrizX8mge\n","2 | 0 | Free @PacktPub ebook of the day: Mastering #Python - https://t.co/t2aLcaSm56\n","2 | 0 | Nice to see more people switching to static site generators, we are quite happy with #python #pelican\n","2 | 0 | Seems cool module for mock data ⏎ ⏎ Romanized decorator :) https://t.co/vC3Xz0n2RZ\n","2 | 0 | #click has an incredibly elegant and versatile interface, wow! ⏎ https://t.co/nM9p1AS0OV\n","2 | 0 | @botherchou most of these titles have python keyword in them: https://t.co/9xQQrlO1sW :)\n","2 | 0 | @python_tip very cool, congrats!\n","2 | 0 | @EA1HET @bbelderbos @techmoneykids re #microservices I started reading https://t.co/L5fBLScYRy, you also want to ch… https://t.co/wF2TnaFR6d\n","2 | 0 | Django Weekly: Django Weekly 50 https://t.co/SDw5uAa9yt\n","2 | 0 | Mike Driscoll: Python 101: Recursion https://t.co/IEghZqgS7k\n","2 | 0 | Flask Video Streaming Revisited - https://t.co/ob66JmNcVB https://t.co/lVjZs1Wzaf via @miguelgrinberg\n","1 | 1 | PyBites of the Week - Challenge 30 Review, Django Tutorial, PyCon AU - https://t.co/WSHkRdu0i2\n","2 | 0 | “How to build a modern CI/CD pipeline” by @robvanderleek https://t.co/dTFbO5Q90g\n","2 | 0 | Chris Moffitt: #Pandas Grouper and Agg Functions Explained https://t.co/UGeayidbEE\n","2 | 0 | Codementor: Working with pelican https://t.co/YSjBavJna1 - oh yeah ... at PyBites we're happy with #Pelican and the responsive Flex theme!\n","1 | 1 | Debugging in Python https://t.co/8gbm7kB8Fs\n","2 | 0 | Simple is Better Than Complex: How to Setup Amazon S3 in a #Django Project https://t.co/mkfpU2JlPq @techmoneykids\n","2 | 0 | Python Bytes: #37 Rule over the shells with Sultan https://t.co/jGHdtfSOOL\n","2 | 0 | Nice article: How to contribute to Open Source https://t.co/G3DUkXCHSC\n","2 | 0 | DataCamp: New Python Course: Data Types for Data Science https://t.co/PVpcgSNtPp\n","2 | 0 | Software engineering resources thread on reddit learnpython: https://t.co/ntHpkDMuLb\n","2 | 0 | Daniel Bader: How to Install and Uninstall Python Packages Using Pip https://t.co/lOqATpqvls\n","2 | 0 | Mike Driscoll: Python is #1 in 2017 According to IEEE Spectrum https://t.co/4RUikyLKFx\n","2 | 0 | New on PyBites: Twitter digest 2017 week 29 https://t.co/3Eh0KcKwFN #python\n","2 | 0 | Cool: translate text in your terminal with py-translate python module. https://t.co/6VzXO5ixU6 #python\n","2 | 0 | Interesting: Possbility and Probability: pip and private repositories: vendoring python https://t.co/52nWq0CorF\n","2 | 0 | FuzzyFinder - in 10 lines of #Python - https://t.co/Po2cgy19We\n","2 | 0 | @brianokken @mkennedy Thanks, you too! Great momentum.\n","1 | 1 | Didn't know: https://t.co/X4VsbFI45k - how to take a printscreen of a window = Shift-Command-4 + Space bar + click mouse/trackpad #mac #tips\n","2 | 0 | New @lynda course: Learning #Python GUI Programming - https://t.co/kZnibY03xh\n","2 | 0 | @techmoneykids @benjaminspak Haha so true :) ⏎ ⏎ I do like the daily progress tweet though, maybe we could stick with that ;)\n","1 | 1 | Last tweet cont'd ... and remember: you build something cool, we will feature it on our weekly review post :)\n","1 | 1 | Always wanted to play with @themoviedb api? This week we offer you a great occasion ... https://t.co/7gPagmranP\n","2 | 0 | ok enough tweeting, an interesting code challenge to be solved :) ⏎ https://t.co/sh347dedlf\n","2 | 0 | @mohhinder @dbader_org Really nice: not only did you learn new packages, you also documented and packaged it like a… https://t.co/q1y6yhWHyQ\n","2 | 0 | New PyBites article: ⏎ ⏎ From Script to Project part 2. - Packaging Your Code in #Python: ⏎ ⏎ https://t.co/mQNPG7k69F\n","2 | 0 | Checkout @mohhinder's nice PyTrack submission for Code Challenge 23: ⏎ ⏎ https://t.co/F40QtkXnJ0 ⏎ ⏎ #Python #codechallenges #alwaysbecoding\n","1 | 1 | #100DaysOfCode - Day 090: Playing with TheTVDB API to scrape some movies/series info https://t.co/3Tl2XAOX8B #Python\n","2 | 0 | @python_tip very nice\n","1 | 1 | You like #Slack? We wrote a Karma bot with #Python - https://t.co/GKpve6hH1J\n","2 | 0 | from @PyBites import newsletter - https://t.co/RTkXX2k2YX - #Python #Articles #Challenges #News\n","2 | 0 | Code Challenge 23 \"Challenge Estimated Time API\" Review is up: https://t.co/gfJyGGJWi2 - we built a nice feature for our challenges platform\n","1 | 1 | Playing with the Github API, are you doing anything cool with #Python this weekend?\n","2 | 0 | @techmoneykids @bbelderbos @anthonypjshaw @dbader_org Aha! Sydney. The power of PyBites! We can be in two places at once!\n","1 | 1 | #100DaysOfCode - Day 077: Blank template of a #Python #class and #subclass https://t.co/qDEWbjgfSD #Python\n","1 | 1 | New PyBites article of the week 2: use #python #requests module to login to a website https://t.co/aD1kElU5wh\n","2 | 0 | Finally https on PyBites :) - thanks @Cloudflare for making it so easy\n","2 | 0 | @genupula thanks Raja\n","2 | 0 | @techmoneykids @bbelderbos congrats, keep up the good work/ momentum\n","2 | 0 | Still some #PyCon2017 talks to watch on YouTube, what were your favorites and why?\n","2 | 0 | @techmoneykids so cool to see folks participating in our PyBItes #code #challenges https://t.co/LfkN8LImHK\n","2 | 0 | There is still some #PyCon2017 left luckily :) https://t.co/DbOsGXUXJ3\n","2 | 0 | Can't believe we are already ending #PyCon2017 - but it has been awesome and a new record was set: https://t.co/t2nWvcyyiD\n","2 | 0 | @mohhinder @steam_games Thanks. Greetings from pycon!\n","2 | 0 | At pycon, weather and views are nice :) https://t.co/fOuQIcJ4L9\n","1 | 1 | Amazing keynote! https://t.co/WGdi57KcTh\n","2 | 0 | @mohhinder Haha! Kids, work and an unexpectedly super difficult challenge didn't mix very well :P it's a tough one… https://t.co/ffG1ch0Gw8\n","2 | 0 | Lots of #Python goodies to enjoy in this week's @pybites Twitter Digest! Image Recognition is exciting! https://t.co/87oVNThhwZ\n","1 | 1 | from @PyBites import newsletter - https://t.co/IyHFGGVthT - #Python #Articles #Challenges #News\n","2 | 0 | PyBites new Code Challenge #18 is up: Get Recommendations From #Twitter Influencers https://t.co/qn5SRKUOMy #TwitterAPI #books\n","2 | 0 | from @PyBites import newsletter - https://t.co/Wg75oDvYUE - #Python #Articles #Challenges #News\n","2 | 0 | New PyBites Code Challenge is up, wow #17 already: ⏎ ⏎ Never Miss a Good Podcast ⏎ ⏎ https://t.co/U2gKU5hI2O ⏎ ⏎ #podcast #sqlite #python\n","2 | 0 | Got #Python for Finance by @dyjh - can't wait to read it next holidays! https://t.co/ytSBY9bXSP\n","2 | 0 | Free @PacktPub ebook today: ⏎ ⏎ #Python 3 Object-oriented Programming - Second Edition ⏎ ⏎ https://t.co/t2aLcaALdy\n","1 | 1 | from @PyBites import newsletter - https://t.co/RpiDwUkQTY - #python #Articles #Challenges #News\n","2 | 0 | @pydanny F-strings?\n","2 | 0 | @sh4hidkh4n Cool, so you can run cronjobs on Heroku?\n","2 | 0 | @ZurykMalkin Nice, is it on GH? Yeah I usually don't care if it already exists. It's all about the process and lear… https://t.co/5rUKaIQBkV\n","1 | 1 | PyBites: Code Challenge 13 - Highest Rated Movie Directors - Review https://t.co/fZeENmatBb #python\n","2 | 0 | Comparison with SQL — pandas 0.19.2 docs - very cool, definitely looking into this for this week's challenge https://t.co/ufPKfodouF\n","2 | 0 | @python_tip or just pull your own copy :) https://t.co/bAcw8U2yVs\n","2 | 0 | @python_tip + nice shortcut for shell: ⏎ ⏎ function pytip(){ ⏎ python <(curl -s https://t.co/1I6S7gq0ur) $@ ⏎ } ⏎ ⏎ sourc… https://t.co/wI6Va7pr5m\n","1 | 1 | We are: ⏎ >>> from datetime import datetime as dt ⏎ >>> (https://t.co/dtEYAsVGgU() - dt(2016, 12, 19)).days ⏎ 100 ⏎ ⏎ days :) ⏎ https://t.co/dCqt08UfYp\n","2 | 0 | @RealPython @ahmed_besbes_ I really enjoyed this article / analysis, thanks\n","1 | 1 | #python #Module of the Week - #ipaddress https://t.co/Fz9GJS3KcS\n","0 | 2 | Code Challenge 09 - With Statement / Context Manager review is up, we found some nice use cases https://t.co/mny5bud3A4 @dbader_org #python\n","2 | 0 | @dbader_org thanks Dan, it has been great learning so far. ABC: always be coding, right?\n","2 | 0 | New on PyBites Code Challenges: ⏎ ⏎ Code Challenge 08 - House Inventory Tracker - review ⏎ ⏎ https://t.co/Av7RlVFRJt ⏎ ⏎ #python #challenge #coding\n","1 | 1 | Postmodern Error Handling in #Python 3.6 https://t.co/IInRMDGP29 - nice article highlighting enums, typed NamedTuples, type annotations\n","1 | 1 | Pos or neg talk about 50 shades of darker? Find out in our #python Twitter analysis Challenge review https://t.co/N8IkMT550A cc @RealPython\n","2 | 0 | Twitter digest 2017 week 08 https://t.co/KpiODOVlMR #python\n","2 | 0 | @pythonbytes thanks a lot guys for mentioning our python resources article and PyBites blog, really appreciated\n","1 | 1 | PyBites of the Week - https://t.co/tY0xDwwWQJ\n","1 | 1 | Code readability https://t.co/GiRyjevWly #python\n","2 | 0 | Scientists make huge dataset of nearby stars available to public https://t.co/4Gg72kcTHV @Pybonacci @astrojuanlu\n","2 | 0 | Tiny Python 3.6 notebook - https://t.co/DhkDN4wz1E\n","1 | 1 | Python Excel Tutorial: The Definitive Guide https://t.co/z7fOQjCABG via @DataCamp\n","1 | 1 | Visualizing website and social media metrics with #matplotlib [notebook] https://t.co/2DDmfUXJ4A #data #python #jupyter\n","2 | 0 | free ebook: Mastering Object-oriented Python - https://t.co/t2aLcaALdy @techmoneykids -> kindle! :)\n","1 | 1 | #pybites #python Code Challenge 04 - Twitter data analysis Part 1 review if up: https://t.co/ZTQhs3TtHL\n","1 | 1 | New on our blog: Discover Python Help Options https://t.co/hsky5JAktv\n","2 | 0 | impressed by the free chapter on functional programming of The Hacker's Guide to #Python by @juldanjou\n","2 | 0 | free #packt ebook of the day: Python 3 Web Development Beginner's Guide - https://t.co/t2aLcaALdy\n","1 | 1 | @PyBites new #codechallenge is up: https://t.co/8dRJyFtin0 #python @techmoneykids @bbelderbos\n","1 | 1 | Everything is an Object, Python OOP primer https://t.co/gm5TSGlOFK #python\n","2 | 0 | #Python Knowledge Base https://t.co/3bwraJt7Jm via @quantifiedcode\n","1 | 1 | Good vibes on our code challenges posts. Working towards solutions with our readers, awesome cc @techmoneykids\n","2 | 0 | Customizing your Navigation Drawer in Kivy & KivyMD https://t.co/DevICadiuN #python\n","1 | 1 | Cheat Sheet: Python For Data Science https://t.co/pqhepaavl1 #python\n","1 | 1 | Code Challenge 01 - Word Values Part I https://t.co/h4N81Ll6ZC #python\n","1 | 1 | Time for a #python code challenge! ⏎ ⏎ Code Challenge 01 - Word Values Part I ⏎ ⏎ https://t.co/h4N81L3w84 https://t.co/lnvYc6xJXG\n","1 | 1 | Copy and Paste with Pyperclip https://t.co/6CNbUpCWw4 #python\n","0 | 2 | Python Naming Conventions https://t.co/P3ox8A01D3 #python\n","2 | 0 | @TalkPython @_egonschiele thanks for this episode and book, flying through it, finally a book that makes algorithms easy to grasp. Great job\n","1 | 0 | @jeorryb @dbader_org @intoli Nice!\n","1 | 0 | @jeorryb @dbader_org @intoli Cool for which one did you use it?\n","1 | 0 | @RobHimself1982 @Pybites100 Great progress, keep going!\n","1 | 0 | @_juliansequeira @bbelderbos @OReillyMedia @dabeaz On my desk! Enjoy it\n","1 | 0 | @ryentzer nice :)\n","0 | 1 | >>> from pybites import News ⏎ ⏎ Twitter Digest 2018 Week 05 https://t.co/4WYatkCCIv\n","1 | 0 | @PyConES Logo guapo!\n","1 | 0 | @RobHimself1982 @Pybites100 Awesome\n","1 | 0 | @RobHimself1982 Nice to see you are learning a lot\n","1 | 0 | @RobHimself1982 awesome\n","1 | 0 | @imonsh una maquina ;)\n","1 | 0 | @defpodcastmx Gracias amigos de Mejico\n","1 | 0 | @mohhinder awesome, this was a tough one!\n","1 | 0 | @RobHimself1982 Hang in there\n","1 | 0 | @RobHimself1982 Hang in there, it becomes easier with practice\n","1 | 0 | @AndrewsForge Looking forward to this one 💪\n","1 | 0 | @RealPython Nice!\n","1 | 0 | @FabioRosado_ Awesome, We love this one, safer and more elegant\n","1 | 0 | @RobHimself1982 Awesome!\n","1 | 0 | excluding stopwords\n","1 | 0 | @jcastle13 thanks Jason for the shout out, happy you are using our material towards the 100 days challenge. Good lu… https://t.co/dqdbHSZp6a\n","1 | 0 | @diraol thanks for the reminder, should be using them more, we do love them: https://t.co/jEGY2Agj5W\n","1 | 0 | Forget about envs and setup, learn #Python in the comfort of your browser with our new Bites of Py solution -… https://t.co/HNlrFxFqhh\n","1 | 0 | @gowthamsadasiva Thanks will check ...\n","1 | 0 | @FerroRodolfo wow, nice\n","1 | 0 | “Out and back again” by @roach https://t.co/9bRxPSxbxN - cool, can’t wait to try it out. Love Slack\n","1 | 0 | PyDev of the Week: Anthony Tuininga https://t.co/NsE6qaxuj2\n","1 | 0 | @michaelc0n @fullstackpython @TalkPython Python OOP 2nd ed, nice :)\n","1 | 0 | @CCMedic521 @TalkPython Awesome, let us know how it goes ... good luck!\n","1 | 0 | @westen_dev If it was not to teach stdlib Python on our live workshop for this one, I was eager to tackle this with Pandas too :)\n","1 | 0 | @westen_dev pandas + seaborn, very nice, thank you!\n","1 | 0 | @yasoobkhalid inspiring read, keep up the good work\n","1 | 0 | Free @PacktPub ebook of the day: Artificial Intelligence with #Python - https://t.co/t2aLcaSm56\n","1 | 0 | @Mike_Washburn @restframework Thanks might try this for code challenge 41\n","1 | 0 | @DavidPeinad0 @AlSweigart @python_alc Me alegro, nos vemos en el siguiente reto!\n","1 | 0 | @justin_aung19 I (Bob) really like Django. Elegant framework and great docs. What are you building? Any recommendations?\n","1 | 0 | @justin_aung19 Thanks for sharing. How is your Python journey going?\n","1 | 0 | @DEEPSUA @python_alc @EPSAlicante Gracias ha molado mucho\n","1 | 0 | @PacktPub @techmoneykids nice\n","1 | 0 | @newsafaribooks cc @brianokken\n","0 | 1 | Mike Driscoll: Python 3: Variable Annotations https://t.co/FsLH9tp2vo\n","1 | 0 | PyCharm: Webinar Recording: “#GraphQL in the Python World” with Nafiul Islam https://t.co/PwmmcLiJZZ\n","1 | 0 | cc @RegexTip\n","1 | 0 | @tezosevangelist @fullstackpython @python_tip PR or it didn't happen ;) ⏎ ⏎ Seriously though, why?\n","1 | 0 | @diek007 @pydanny Thanks for sharing, awesome tool\n","1 | 0 | Pythonic String Formatting https://t.co/l3A3lLseTx\n","1 | 0 | @fullstackpython On mine too, would be nice to blog something about it ...\n","1 | 0 | @fullstackpython Cool, watched an oreilly talk today on microservices and all the tooling, it’s massive! Have you tried Kubernetes?\n","1 | 0 | 5 reasons you need to learn to write Python decorators - O'Reilly Media https://t.co/PSG6pSclRY via @oreillymedia\n","1 | 0 | Python Bytes: #48 Garbage collection and memory management in #Python https://t.co/ALg5dCO3mR\n","1 | 0 | @mohhinder Nice, 4 of which are challenges, awesome!\n","1 | 0 | Mike Driscoll: How to Watermark Your Photos with Python https://t.co/mjRbLovg4U\n","1 | 0 | @shravankumar147 Indeed!\n","1 | 0 | @jojociru That said we actively started adding submissions to our review posts starting around challenge 15, becaus… https://t.co/IEkG64vpam\n","1 | 0 | Support open source in October and earn a limited edition T-shirt from @digitalocean and @github https://t.co/gDfINlP6ad #hacktoberfest\n","0 | 1 | EuroPython 2017: Videos available... https://t.co/Ec29edzYdI\n","1 | 0 | @PacktPub Nice some good stuff in here :)\n","1 | 0 | Have you seen this week's issue of Programming Today? @oreillymedia (https://t.co/ilkmQdnT1W)\n","1 | 0 | Dataquest: Explore Happiness Data Using Python Pivot Tables https://t.co/8cmaMiupYH\n","1 | 0 | @PyImageSearch Oh yeah, a lot of my learning I can contribute to just that, and reason we do code challenges. Thanks\n","1 | 0 | @michaelc0n @kelseyhightower @pycon @kubernetesio @TalkPython Oh yeah, this was awesome, I remember the audience going wild :)\n","1 | 0 | Great article! \"You will be learning new things forever. That feeling of frustration is you learning a new thing. Get used to it.\"\n","1 | 0 | @PacktPub 2 free ebooks today?! How generous\n","1 | 0 | Python Software Foundation: Improving #Python and Expanding Access: How the PSF Uses Your Donation https://t.co/DYWIuNIWuW\n","1 | 0 | @gazhay @shravankumar147 @dbader_org @python_tip nice how this led to this thread, maybe we should do a code kata /… https://t.co/6duZ60TaJV\n","1 | 0 | @shravankumar147 @janikarh @python_tip @dbader_org Cool, thanks for sharing\n","0 | 1 | pgcli: Release v1.8.0 https://t.co/1RuEXz17PD\n","1 | 0 | DataCamp: Keras Cheat Sheet: Neural Networks in #Python https://t.co/bAtDN4Ql8m\n","1 | 0 | New PyBites Article: ⏎ ⏎ Module of the Week: Openpyxl - Automate Excel! ⏎ ⏎ #openpyxl #python #excel #automation https://t.co/6nxkMbysfG\n","0 | 1 | Free @PacktPub ebook of the day: Mastering Social Media Mining with #Python - https://t.co/t2aLcaSm56\n","1 | 0 | DataCamp: 3 Things I learned at JupyterCon https://t.co/w8XC3k1VJN #python #datascience\n","1 | 0 | Why not state it again? ;) ⏎ ⏎ Python's future looks bright! https://t.co/jojONo8WbM\n","1 | 0 | #Python Twitter News Digest 2017 Week 36 is out: https://t.co/WWA17leLbv\n","1 | 0 | @unisys12 @georgespake @chadfowler One of my favorite dev / career books, coincidentally took it from the shelve ye… https://t.co/RPr9s2NBYy\n","1 | 0 | PyCharm: #Webinar: “Visual #Testing With #PyCharm” with Kenneth Love, Sept 28 https://t.co/YfeyBCAC7N #python\n","0 | 1 | #Django security releases issued: 1.11.5 and 1.10.8 https://t.co/iGmX8NpRT2\n","1 | 0 | Michy Alice: Let #Python do the job for you: AutoCAD drawings printing bot https://t.co/xTSmBDl1Ua\n","0 | 1 | #Python overtakes R, becomes the leader in Data Science, Machine Learning platforms: https://t.co/Gng3TaWKfI #ML\n","1 | 0 | @p3pijn @BetterCodeHub @bbelderbos https://t.co/eFGu6vNcXJ\n","0 | 1 | Great life lessons and books! https://t.co/76NNlb98QG\n","1 | 0 | @saronyitbarek Awesome advice, thanks\n","1 | 0 | @Mike_Washburn @djangoproject @restframework ... just as I hit publish on our Django/DRF code challenge :) - adding… https://t.co/1cq8sPDsm2\n","1 | 0 | Mike Driscoll: #Python developer of the Week: Shannon Turner https://t.co/Z9tPJMxz6L\n","1 | 0 | @python_tip thanks for the reminder ;)\n","1 | 0 | @LegoSpaceBot Nostalgia, precursor to coding, already were building stuff back then :)\n","1 | 0 | Serverless everywhere https://t.co/PiAj1UAEO5\n","0 | 1 | PyBites Weekly Twitter Digest #34 is out: 1K Followers Wordcloud, #Eclipse, #JupyterCon, Serverless, #notabs,… https://t.co/DuBnRcBb4b\n","1 | 0 | @steven_braham idd goeie structuur. ben begonnen met part 3.\n","1 | 0 | @ka11away Hahaha same here last night ;)\n","1 | 0 | @CaktusGroup Thanks for the shoutout\n","1 | 0 | @steven_braham agreed! what did you read?\n","1 | 0 | @treyhunner learning some more Django this week :)\n","0 | 1 | Import #Python 138 - 18th Aug 2017 https://t.co/XcRYypylO7\n","1 | 0 | @mohhinder that's cool, it did not occur to me that I could just do one daily tweet from my account, thanks for tha… https://t.co/xYDKTvIWEy\n","1 | 0 | @mohhinder Haha maybe I tweet out each book from my own account and just RT from pybites if I see something Python… https://t.co/fyIMP26ioa\n","1 | 0 | @botherchou talking about web scraping we can of course scrape all packt titles from there and make a more informed decision ;)\n","1 | 0 | @importpython ROFL\n","1 | 0 | @simecek @python_tip sure, I like what you guys are doing, I will send you a message\n","1 | 0 | @EA1HET @bbelderbos I focus a bit more on Django now but Microservices is on my list. @techmoneykids (Julian) take… https://t.co/61WIAJi9Xk\n","1 | 0 | @EA1HET @bbelderbos Thanks Jonathan, glad you like it. What could we add to make it even better for you?\n","0 | 1 | @Joao_Santanna @PacktPub oops: it's the daily one: https://t.co/t2aLcaALdy\n","0 | 1 | PyBites of the Week - Challenge 31 Review, #Pillow, #Flask - https://t.co/e4aYEFexfy\n","1 | 0 | @DataCamp @joshsisto @mkennedy Congrats, great progress for 8 months.\n","0 | 1 | @bbelderbos @BetterCodeHub Congrats having BCH on @GitHub Marketplace!\n","1 | 0 | Nice article: “Getting started with translating a #Django Application” by @steven_braham https://t.co/IN2zTaqbMo\n","1 | 0 | @steven_braham @mosenturm Great article! I saw these {% load i18n %} in django-registration templates yesterday, ni… https://t.co/tZrFafhcCd\n","1 | 0 | @steven_braham @mosenturm Fair enough. Good luck. Will blog and code challenge DRF at some point, will let you know ...\n","1 | 0 | @RealPython nice, thanks\n","1 | 0 | “Writing a map-reduce job to concatenate a millions of small documents” by didier deshommes https://t.co/CRK3R5pvHv\n","1 | 0 | Full Stack Python: Creating Bar Chart Visuals with Bokeh, Bottle and Python 3 https://t.co/9jafKVM8xX\n","1 | 0 | #Djagno - \"The web framework for perfectionists with deadlines\" - very true :)\n","1 | 0 | Neat: django-lockdown - Lock down a #Django site or individual views, with configurable preview authorization - https://t.co/oVVMiKAWDW\n","1 | 0 | Daniel Bader: Python Iterators: A Step-By-Step Introduction https://t.co/AbI7QYn7Iv\n","1 | 0 | PyBites of the Week - Challenge 29 Review, Pexpect, Flask, Refactoring, Django - https://t.co/5y7x8261vi\n","0 | 1 | Interesting new book on @safari : #cloud native #python https://t.co/wHyRn9PGRC\n","1 | 0 | Data School: Web scraping the President's lies in 16 lines of Python https://t.co/dHjfN3f7lZ\n","1 | 0 | @techmoneykids Rofl don't worry Flask won't run away. You will always be our Flask guy, specially now I got the Django fever haha\n","1 | 0 | @CaktusGroup Thanks, welcome to submit a cool app :)\n","1 | 0 | Catalin George Festila: Fix Gimp with python script. https://t.co/OstJ51RuZM\n","0 | 1 | from @PyBites import newsletter - https://t.co/sNDiQeojsK - #Python #Articles #Challenges #News\n","1 | 0 | Catalin George Festila: Make one executable from a python script. https://t.co/Whg2kwQhCc\n","1 | 0 | Weekly Python Chat: Ranges in Python https://t.co/zYmKq6MVNW\n","0 | 1 | PyBites Twitter digest 2017 week 28 is out - some really nice #Python articles for your weekend reading list: https://t.co/a1mlRiztLa\n","1 | 0 | Caktus Consulting Group: Readability Counts (PyCon 2017 Must-See Talk 6/6) https://t.co/AvLLOnCEuX #python\n","1 | 0 | from @PyBites import newsletter - https://t.co/aATmfY2fSc - #Python #Articles #Challenges #News\n","1 | 0 | @techmoneykids agreed wanna read more. First django app a tracker like in this article? https://t.co/mDmY6NWKlX\n","1 | 0 | @colorado_kim @MikeHerman Thanks for the inspiration.\n","0 | 1 | from @PyBites import newsletter - https://t.co/lG5f2NUUD8 - #Python #Articles #Challenges #News\n","1 | 0 | neat @techmoneykids\n","1 | 0 | from @PyBites import newsletter - https://t.co/nwKfOsSWlH - #Python #Articles #Challenges #News\n","1 | 0 | New #Python #Codechallenge #25 is up: build a Notification Service of Now Playing/Upcoming #Movies (or #Series) - https://t.co/sh347dedlf\n","1 | 0 | Code Challenge 24 - Use Dunder / Special Methods to Enrich a Class - Review is up: https://t.co/q2MNe2WbS2 #Python #codechallenges #dunders\n","1 | 0 | 16 hours left to grab your free @PacktPub ebook of the day: Mastering #Python - https://t.co/t2aLcaALdy\n","1 | 0 | A new week, more Python ... this week we're coding a new movie/series notification email, stay tuned for our new challenge ...\n","1 | 0 | @lynda @techmoneykids lol forgot we auto-tweeted this. Likely gonna check this one out this weekend :)\n","1 | 0 | @python_tip Really useful\n","1 | 0 | @anthonypjshaw @techmoneykids @bbelderbos @dbader_org Haha can't help it ... and lazy cause now I can keep replying from this account ;)\n","1 | 0 | @pythonbytes @brianokken Thanks guys, interesting stuff\n","1 | 0 | @anthonypjshaw @dbader_org Thanks, good to know :) - hope you are doing well\n","1 | 0 | PyBites weekly Twitter digest is up: https://t.co/XtSN2QxouT - happy weekend\n","1 | 0 | was playing with #python Pillow, nice library, makes image manipulation pretty easy\n","1 | 0 | @benjaminspak Those were the golden days. A tribe called quest :)\n","1 | 0 | New PyBites article of the week 1: parsing html tables https://t.co/bFevaUQgM0 #python #pandas\n","1 | 0 | Make sure you grab this awesome #python book, it's free (please use Pybonacci's affliation link below to sponsor Py… https://t.co/IDgN9q89Mo\n","1 | 0 | from @PyBites import newsletter - https://t.co/flJl9W9rFx - #Python #Articles #Challenges #News\n","1 | 0 | PyBites Code Challenge 21 - Electricity Cost Calculation App - Review https://t.co/Rk9KhGrD8F - we got some nice PRs this week!\n","1 | 0 | @mohhinder looks awesome man! https://t.co/RgF8YXqeDu\n","1 | 0 | @importpython Thanks for the shout out :)\n","1 | 0 | @techmoneykids Really glad you did that. Best way to learn is to challenge yourself which you did :)\n","1 | 0 | @CaktusGroup Thanks for the RT, was nice meeting you at pycon!\n","1 | 0 | from @PyBites import newsletter - https://t.co/adbWEckVqB - #Python #Articles #Challenges #News\n","1 | 0 | Some nice PRs for our #Python Code Challenge 20 - our review is up: https://t.co/PlXNkJqMdu\n","1 | 0 | @kelseyhightower @RealPython So inspiring, thanks!\n","0 | 1 | from @PyBites import newsletter - https://t.co/VcQ1PI2ESR - #Python #Articles #Challenges #News\n","1 | 0 | Why have I not used bpython yet?! It's awesome https://t.co/mAO9CJojVC\n","1 | 0 | @mariatta Thanks for sharing your great story\n","1 | 0 | Use #Python to Build a #Steam Game Release Notifier App! Nice and handy (your wallet may disagree!) https://t.co/oJRexhPXPv @steam_games\n","1 | 0 | from @PyBites import newsletter - https://t.co/c2GXbQBKPj - #Python #Articles #Challenges #News\n","1 | 0 | Obsolete haha, use faker, thx @mohhinder\n","1 | 0 | @mohhinder thanks, yours was awesome!\n","1 | 0 | Review of this week's code challenge is up: https://t.co/NyIPK3iLTn #python #challenge cc @mohhinder\n","1 | 0 | @mohhinder Thanks, our pleasure. We are all learning here, more fun to build a community around it.\n","1 | 0 | @mohhinder That's awesome. Nice to see how you are picking this up. As you PR'd it will feature it in our review\n","1 | 0 | Regarding PyBites code challenges do you like them to be:\n","1 | 0 | @CaktusGroup thanks for the shout out, hope you enjoy these challenges\n","1 | 0 | from @PyBites import newsletter - https://t.co/zOR5CJ3MQI - #Python #Articles #Challenges #News\n","1 | 0 | @mohhinder @PacktPub Thanks, nice timing haha\n","1 | 0 | @JMChapaZam @pymty Gracias, saludos desde España / Australia\n","1 | 0 | Our weekly #Python news digest is out: ⏎ ⏎ https://t.co/KjCa0HJdnU https://t.co/gHPsClCE4T\n","1 | 0 | Thanks @importpython for featuring our decorators article this week.\n","1 | 0 | @python_tip Wonder though if on py 3 what % would be < 3.5?\n","1 | 0 | This O’Reilly report surveys 30 #Python web frameworks and provides a deeper look into six of the most widely used. https://t.co/1cbRoXqNoj\n","0 | 1 | New PyBites Article: How to Write a #Decorator with an Optional Argument? - https://t.co/ED7lXZVOrc #Python\n","1 | 0 | @ZurykMalkin How is it going? We are enjoying the challenge. What DB did you use? App?\n","1 | 0 | @ZurykMalkin Got my copy the other day, read 50 pages, already picked up several tricks. Really enjoying it. You?\n","1 | 0 | New PyBites Code Challenge #14 - Write DRY Code With #Python #Decorators https://t.co/m9S9KvPI7p (cc @dbader_org @realpython)\n","1 | 0 | @python_tip ok thanks, just to avoid a lot of dubs as you grow :)\n","1 | 0 | PyBites: Code Challenge 13 - Highest Rated Movie Directors - Review https://t.co/fZeENlSSJD #python\n","0 | 1 | https://t.co/LIYMJ0bXRP #flask #api\n","1 | 0 | @shashanksharma9 @github Thanks, what bot did you make? The FB thing I saw on your profile?\n","1 | 0 | @shashanksharma9 We did hangman. Sudoku or 8 queens (backtracking or brute force) would be cool\n","1 | 0 | @shashanksharma9 @adebarros funny we did those 2 games in our weekly challenges, any other game of similar difficul… https://t.co/Lum9Clh4Or\n","1 | 0 | @shashanksharma9 @github starting day 007 it does, I just wrote an article about it: https://t.co/bVafsHPViu\n","1 | 0 | from @PyBites import newsletter - https://t.co/jVlNKDM8v5 - #python #Articles #Challenges #News\n","1 | 0 | @shashanksharma9 @github Glad you asked, stay tuned for part 2 (day 007)\n","0 | 1 | Our new weekly code challenge is up: Highest Rated Movie Directors - https://t.co/BJx58QaM1q - happy coding!\n","1 | 0 | Our weekly #python news digest is up: https://t.co/ybB6Gh3LCf\n","1 | 0 | Code Challenge 12 - Build a Tic-tac-toe Game - Review https://t.co/8rEdrd3G4o\n","1 | 0 | Zip and ship, make an executable zipfile of your #Python project - https://t.co/2St6qlrhTi - still a neat trick :)\n","1 | 0 | Stay tuned for our tictactoe review later today, we learned a lot. You can join our weekly code challenges here: https://t.co/nugm84MhkB\n","1 | 0 | Hone your #Python skills by joining us in our #100DaysOfCode challenge - https://t.co/xfQpzdmmEU\n","1 | 0 | @python_tip You are welcome, it was nice practice. I hope it does lead to less duplicate submissions\n","1 | 0 | What #python concepts you'd feel if mastered make you a pro? What is still hard to grasp? Happy coding\n","1 | 0 | @techmoneykids https://t.co/2F67M15LNk\n","1 | 0 | @ZurykMalkin and now we're too :) ⏎ ⏎ That is an awesome book to have on your desk as a Python developer\n","1 | 0 | from @PyBites import newsletter - https://t.co/u9TbRu3W4e - #python #Articles #Challenges #News\n","1 | 0 | Carl Chenet: Retweet all tweets matching a regex with the Retweet bot https://t.co/RloSFOiS3e #python\n","0 | 1 | New PyBites Code Challenge #12 - Build a Tic-tac-toe Game ⏎ ⏎ https://t.co/bK9F2iht9x ⏎ ⏎ #python #TicTacToe\n","1 | 0 | WTF loosing against the #AI I just built - https://t.co/iL8Otdg1cm #tictactoe in #python cc @techmoneykids: run with 'hard' switch to go 2nd\n","0 | 1 | Code Challenge 11 - Generators for Fun and Profit - the review is up, hope you enjoyed this one - https://t.co/kblieroEbl #python\n","1 | 0 | @python_tip thanks, I can grep that :) ⏎ ⏎ Maybe nice RFE to have an API to validate and submit?\n","1 | 0 | Nice #python package I used today (again) to copy and paste to/from clipboard: Pyperclip https://t.co/xZS5TmH0Uf\n","1 | 0 | @ArtSolopov @python_tip ah ok thanks\n","1 | 0 | @python_tip I really like these tips, thanks. I will submit some more soon. Is there an easy way to avoid duplicate submissions?\n","1 | 0 | nice #Vim plugin for the awesome stackoverflow cli tool #howdoi - https://t.co/pke6RuigMF\n","0 | 1 | Morning Pythonistas, our new Code Challenge 11 is up: Generators for Fun and Profit, happy #python learning - https://t.co/JCnbnhf7gI\n","0 | 1 | New on PyBites: Code Challenge 10 - Build a Hangman Game - Review is up - check our solution and learning here: https://t.co/n82cQVRsL5\n","1 | 0 | @nicjamesgreen @mkennedy I got mine yesterday too Nick! Will get it on the lappy and show you :P\n","1 | 0 | New PyBites article is up: ⏎ ⏎ 10 Tips to Get More out of Your Regexes ⏎ ⏎ https://t.co/7H2sxR9WVW ⏎ ⏎ #regex #python\n","1 | 0 | #python everywhere: kids homework can be so much more fun ;) https://t.co/oxnUec0nHU\n","1 | 0 | Awesome: create isolated #Jupyter ipython kernels with pyenv and virtualenv - https://t.co/4fFbN6T0r7 #python\n","0 | 1 | Every week @pybites publishes a #python #challenge, join us at https://t.co/UoVsqfkNaa / archive… https://t.co/6P9sKHhPU7\n","1 | 0 | New on PyBites: ⏎ ⏎ Code Challenge 09 - Give the With Statement some Love and Create a Context Manager ⏎ ⏎ https://t.co/roiKPq21eg\n","1 | 0 | @TalkPython 11 almost countdown from 10 haha\n","1 | 0 | Everything is an Object, #Python OOP primer https://t.co/OS9SFUedMi\n","1 | 0 | Improve your programs with beautiful, idiomatic #Python https://t.co/BPw8nRvJtW\n","0 | 1 | cool, want to try ... https://t.co/TqTkkNz7AU\n","1 | 0 | Python Programming Language LiveLessons - excellent beyond basics #python course, thanks @dabeaz, learning a lot - https://t.co/tjsWJbzmFk\n","1 | 0 | Had fun writing this article on the #Python fun that's trending on Twitter! https://t.co/PvME6U5fup Stay humble Pythonistas!\n","1 | 0 | Thanks @illustratology for making our logo, it looks awesome! Cc @techmoneykids\n","1 | 0 | Psst ... our new #python Code Challenge is up: #08 - House Inventory Tracker https://t.co/Xmn3RvXyNj\n","1 | 0 | PyBites of the Week - https://t.co/tHcqS0JwWn\n","1 | 0 | @TalkPython you are welcome, thanks for this great #python training material!\n","1 | 0 | @pythonbytes \"@pybites that is a pretty similar name\" LOL ... true! We only found out about Python Bytes shortly after we started :)\n","1 | 0 | @TalkPython looking forward to it. Nice timing, 100 as in (almost) 100k pypi packages. Coincidence right? ;)\n","0 | 1 | New article on our blog: 5 tips to speed up your #Python code https://t.co/wFfjqpVTPd\n","1 | 0 | Lambdas or no lambdas, interesting discussion - https://t.co/heYzUAZ5Sy #python\n","0 | 1 | new #python code challenge is up: https://t.co/Ues7UOlMBN - perform a Twitter sentiment analysis ... https://t.co/KGj3v6qnK0\n","1 | 0 | Code Challenge 06 - When does PyPI reach 100K packages? - review https://t.co/ZnfBIDKwjH #python\n","0 | 1 | Guido's King's Day Speech - wonderful talk: https://t.co/Zrp7Uo79BP #python\n","1 | 0 | neat https://t.co/mV4o1Mla3l\n","1 | 0 | @python_tip nice idea!\n","1 | 0 | Brett Slatkin - Refactoring Python: Why and how to restructure your code... https://t.co/wd6yUQipf0 - great talk\n","1 | 0 | Wow! Awesome video. @dbader_org @techmoneykids check this out https://t.co/y6xBeoaXoH\n","1 | 0 | #98 Adding concurrency to Django with Django Channels https://t.co/NHBYmxAS4F #python\n","1 | 0 | Visualizing website and social media metrics with matplotlib [notebook] https://t.co/N3QIKXWYtW #python\n","1 | 0 | Working with iterables: itertools & more https://t.co/yPoCfaOItK #python\n","1 | 0 | From beginner to pro: Python books, videos and resources https://t.co/8bpGOQ13pz #python\n","1 | 0 | Lambda Functions in Python: What Are They Good For? https://t.co/D9PqD4wxhn #python\n","1 | 0 | Code Challenge 05 - Twitter data analysis Part 2: how similar are two tweeters? https://t.co/4WQOH2ig3U #python\n","1 | 0 | Code Challenge 04 - Twitter data analysis Part 1: get the data - Review https://t.co/WvIQkYxC6j #python\n","1 | 0 | #97 Flask, Django style with Flask-Diamond https://t.co/ggqrD2zPIT #python\n","1 | 0 | #11 Django 2.0 is dropping Python 2 entirely, pipenv for profile functionality, and Pythonic home automation https://t.co/ivbetn0zxD #python\n","0 | 1 | Twitter digest 2017 week 04 https://t.co/L3njBuBats #python\n","1 | 0 | interesting #pandas #Python https://t.co/eMaivdMeRW\n","0 | 1 | Python's data model by example https://t.co/j3wu8jY4pu #python\n","1 | 0 | great course: Python Beyond The Basics - Object Oriented Programming https://t.co/Fhapwpz7pZ\n","0 | 1 | true, this book is awesome for developers wanting to advance in their career, recommended it to a co-worker today :… https://t.co/9tW8m3oEYU\n","1 | 0 | wow! stdlib has a way to find similarity between words! how? join our #python #codechallenge and you will learn ... https://t.co/LJ1px8JuwI\n","1 | 0 | @kjam nice article thanks, gonna dig up my copy, it has been on the shelf for too long\n","1 | 0 | Code Challenge 02 - Word Values Part II - Review https://t.co/nyQXxl87zy #python\n","1 | 0 | Machine learning in Python with scikit-learn https://t.co/youL2NJd3L\n","1 | 0 | 5 cool things you can do with itertools https://t.co/Nk4s3yL6zL #python\n","0 | 1 | #8 Python gets Grumpy, avoiding burnout, Postman for API testing and more https://t.co/rSLt7q7g8S #python\n","0 | 1 | Beautiful, idiomatic Python https://t.co/Gft5OaBkon #python\n","1 | 0 | I love the key on max, min, sorted, so powerful and concise. Also using it in this week's coding challenge :) https://t.co/vpL1R3bSIW\n","1 | 0 | @PyPiglesias @bedjango thx for sharing. Nice to see folks jumping on it! We comment possible solutions and learning on Friday ...\n","1 | 0 | Like this video https://t.co/CmKKSbXKhE\n","1 | 0 | I got Python Tricks: The Book (Work-In-Progress) from @dbader_org on @Gumroad: https://t.co/U54ZyzTEa0\n","1 | 0 | @techmoneykids challenge, recreate this graph ... https://t.co/hQ0SziiQDv\n","1 | 0 | #7 Python 3.6 is out, Sanic is a blazing web framework, and are failing our open source infrastructure? https://t.co/1632fQa3xU #python\n","1 | 0 | @CAChemEorg thanks for the share, happy New Year\n","0 | 1 | https://t.co/Dko7iUWysc Pybites weekly newsletter! Our latest posts on one handy page. Keep Calm and Code in #Python!\n","1 | 0 | @dbader_org loved automate boring, fluent py takes you to the next level. Also liked powerful python, mastering py. Started expert py 2nd ed\n","1 | 0 | “Boot Up 2017 with the #100DaysOfCode Challenge” @ka11away https://t.co/LLJkOWpGDt\n","0 | 1 | Learning from Python mistakes https://t.co/hPWVXt21p7 #python\n","0 | 1 | How to create a nice-looking HTML page of your #Kindle book highlights (notes) https://t.co/HKFK7inhUa #python\n","0 | 1 | Zip and ship, make an executable zipfile of your py project https://t.co/XBK5CSyKyP #python #packaging #pip\n","0 | 0 | @RobHimself1982 @Pybites100 excellent\n","0 | 0 | @jcastle13 @levlaz @Pybites100 Great!\n","0 | 0 | @RobHimself1982 @Pybites100 Please somebody stop him ;)\n","0 | 0 | @jcastle13 @levlaz @Pybites100 where did you get stuck?\n","0 | 0 | @malaga_python oh yeah!\n","0 | 0 | @davidleefox @TalkPython nice, enjoy :)\n","0 | 0 | @juzerali 14th of Feb + 50% discounts for early birds - https://t.co/fox6ul3OrK\n","0 | 0 | @juzerali Yes this will be a subscription service starting March\n","0 | 0 | @jcastle13 Ping @_juliansequeira\n","0 | 0 | @mohhinder Ouch haha\n","0 | 0 | @makgunay Cool, what did you learn?\n","0 | 0 | @Allwright_Data Hey Stephen, nice to hear, thanks. Enjoy and let us know how it goes ...\n","0 | 0 | @FabioRosado_ nice, hope you learned some more regex? we will add a part II\n","0 | 0 | @FabioRosado_ Awesome\n","0 | 0 | @anthonypjshaw Added a Bite :)\n","0 | 0 | @RobHimself1982 Movies, marvel or other?\n","0 | 0 | @jcastle13 well done\n","0 | 0 | @Arclight27 @freeCodeCamp Nice, which one?\n","0 | 0 | @anthonypjshaw lol sounds cool\n","0 | 0 | @FabioRosado_ @RobHimself1982 Nice book!\n","0 | 0 | @RobHimself1982 keep up the momentum\n","0 | 0 | @proudvisionary Thanks 😎\n","0 | 0 | @Thelostcircuit Way to go https://t.co/C3VfqTevQd\n","0 | 0 | @brochu121 how is it going?\n","0 | 0 | @jcastle13 good progress!\n","0 | 0 | @_juliansequeira @bbelderbos this is awesome, thanks :)\n","0 | 0 | @FabioRosado_ sure thing, thanks!\n","0 | 0 | @Arclight27 wow, which one(s)? hope you learned a thing or two!\n","0 | 0 | @jcastle13 cool, hang in there, the progress is in the struggling!\n","0 | 0 | @FabioRosado_ Do 1 hour a day and log (tweet) your progress, you will be amazed. Scripts can be split over days. Pr… https://t.co/Iu0qbkBj80\n","0 | 0 | @charlesforelle excluding stopwords ;)\n","0 | 0 | @jcastle13 Awesome!\n","0 | 0 | @diraol PR? https://t.co/Xthc6Pyncy\n","0 | 0 | @rsletten thanks Rob, will fix\n","0 | 0 | @BetterCodeHub Thanks guys!\n","0 | 0 | @anthonypjshaw Excel macros is where I started lol (b)\n","0 | 0 | Cool: “Dealing with datetimes like a pro in Python” by @irinatruong https://t.co/cbH5tcHFZ0 via @pythonbytes\n","0 | 0 | @FabioRosado_ Cool, glad they are well ... challenging :)\n","0 | 0 | @jeorryb Nice, good point: could do 30 days as well :)\n","0 | 0 | @jscottweber Working on a beginner py challenge, stay tuned. 100 days repo should have some easy scripts as well.\n","0 | 0 | @brnkimani @bbelderbos on the blog or with Python, or both?\n","0 | 0 | @fullstackpython Awesome! Cc @PacktPub\n","0 | 0 | New @lynda course: Dynamo for Revit: #Python Scripting - https://t.co/RIxSiNMVfJ\n","0 | 0 | @ChekosWH you are welcome\n","0 | 0 | @anthonypjshaw Awesome!\n","0 | 0 | @fullstackpython I have to go through it in detail. Was it recorded? What about using actual slides with prev and n… https://t.co/VQKR0qXDiQ\n","0 | 0 | @PacktPub Nice one. Vim saves me so much time and increases the joy of coding :)\n","0 | 0 | Remember this month's challenge #43 not only lets you make a bot to wow your colleagues making their lives easier,… https://t.co/AwU2zN3LQx\n","0 | 0 | Read the stdlib: deque https://t.co/g5Vzod8KNN - collections is one of our favorite #python modules and we really w… https://t.co/HvkPp1rwF9\n","0 | 0 | @python_alc cc @Pybonacci @python_es\n","0 | 0 | @sec_ua @python_alc @DEEPSUA @EPSAlicante Guapa la foto :)\n","0 | 0 | @mohhinder @python_alc @bbelderbos Nope but hope to have you in a live workshop one day :)\n","0 | 0 | @heroes_bot You are awesome\n","0 | 0 | @Dr_Meteo @Pybonacci @PacktPub buen punto! Esperamos un poco ... Neo, this is your last chance. After this, there i… https://t.co/1gHZjvAIO4\n","0 | 0 | @Pybonacci @PacktPub mola!\n","0 | 0 | @shravankumar147 why the poll?\n","0 | 0 | @PyImageSearch Thanks Adrian for the kind words\n","0 | 0 | @Pybonacci Gracias amigos\n","0 | 0 | Remember EMEA clock is going back 1 hour this weekend so you have a little bit more time to sneak in another PR ;) #Hacktoberfest\n","0 | 0 | @tezosevangelist @fullstackpython @python_tip Cool! Do you have any examples of apps you've made with Tornado?? - JS\n","0 | 0 | @brianokken Indeed. Not sure what happened. However you wouldn't install cookiecutter in each venv / project, would… https://t.co/xEGhjydc3K\n","0 | 0 | Steve Holden: What's In a Namespace? https://t.co/Zs4E1blriy\n","0 | 0 | @d4ntr0n Cool we did it, it was hard but so worth it, we build a big repo of scripts :) - good luck\n","0 | 0 | Building a Karma Bot with Python and the Slack API https://t.co/wyE4xAZlOX\n","0 | 0 | How to Learn #Python https://t.co/xnUk5r3QWN\n","0 | 0 | Module of the Week: Openpyxl - Automate Excel! https://t.co/Br04LGnSUW\n","0 | 0 | @dbader_org thanks: What's the best Python coding interview book? #PythonQ&A https://t.co/XHrAjdvuQm\n","0 | 0 | @mohhinder They have a checker themselves now?\n","0 | 0 | @esStackOverflow Esta muy bien, cada dia un ebook gratis, ya tengo toda una coleccion :)\n","0 | 0 | Awesome! https://t.co/rgiE9tqBeQ\n","0 | 0 | #Python Twitter Digest 2017 Week 40 https://t.co/mXMN6DExci\n","0 | 0 | @FabioRosado_ @dbader_org but we do have a related code challenge: https://t.co/oDbnM6fINT\n","0 | 0 | @FabioRosado_ @dbader_org rather :)\n","0 | 0 | I found my #FirstPullRequest: https://t.co/sG3yrYleXa. What was yours? https://t.co/8jdTVmPqrQ\n","0 | 0 | @jojociru Yep, you can PR any challenge at any time.\n","0 | 0 | And review post #2 for today: ⏎ ⏎ Code Challenge 37 - Automate a Task With @Twilio ⏎ https://t.co/9sRUOCXors ⏎ ⏎ PR any tim… https://t.co/nASWZXA4WJ\n","0 | 0 | Python Software Foundation: Join the #Python Developers Survey 2017: Share and learn about the #community https://t.co/mfzOadxxxm\n","0 | 0 | Simple is Better Than Complex: How to Create #Django Data Migrations https://t.co/oZJQNDkIxQ\n","0 | 0 | Weekly Python Chat: Linting Code https://t.co/DjTt6RUb4s\n","0 | 0 | PyCon 2018 Call for Proposals is Open! https://t.co/Nuorq6H9kR\n","0 | 0 | @JagDecoded @wesmckinn you will be when you read the book, as the library, very well done\n","0 | 0 | @practice_python nice site/initiative! We do code challenges as well.\n","0 | 0 | @PyConES Enjoy!\n","0 | 0 | @BecomingDataSci @Twitter Abusing likes as bookmarks too. You are not alone :)\n","0 | 0 | @esStackOverflow Yo (Bob)\n","0 | 0 | Yasoob Khalid: 13 #Python libraries to keep you busy https://t.co/0m1JKYiF2T\n","0 | 0 | Reuven Lerner: My favorite terrible Python error message https://t.co/Hy9X2UO4l8\n","0 | 0 | Mike Driscoll: PyDev of the Week: Daniel Roseman https://t.co/bnBoMDd7XZ\n","0 | 0 | Zato Blog: Building a protocol-agnostic #API for SMS text messaging with Zato and #Twilio https://t.co/EOuEq0CezQ\n","0 | 0 | Python Twitter Digest 2017 Week 37 https://t.co/GR9lekYXSH\n","0 | 0 | “WTF? What’s the Future and Why It’s Up To Us” by @timoreilly https://t.co/kQtqsFoC5l\n","0 | 0 | PyCon 2018 Launches New Site, Sponsorship Search https://t.co/VVqEu7cW4O\n","0 | 0 | Talk Python to Me: #129 Falcon: The bare-metal Python web framework https://t.co/7hsjXJw7gc\n","0 | 0 | #Python, un lenguaje simple para comprender la complejidad del mundo https://t.co/olz6apRsxu vía @nobbot\n","0 | 0 | @BecomingDataSci @fluentpython That is indeed a great book for oop, special methods and python overall!\n","0 | 0 | @Pybonacci Mola!\n","0 | 0 | @Pybonacci @PacktPub Nice one! Gracias @PacktPub\n","0 | 0 | Doug Hellmann: platform — System Version Information — PyMOTW 3 https://t.co/jfTXlKuUe4\n","0 | 0 | Mike Driscoll: PyDev of the Week: Jeff Forcier https://t.co/XLGyMmVqr1\n","0 | 0 | @19emtuck @python_tip cannot get more concise than your slice notation though ;)\n","0 | 0 | @19emtuck @python_tip I wondered the same?\n","0 | 0 | Mike Driscoll: #python dev of the Week: Matthias Bussonnier https://t.co/OPxtPtVKlx\n","0 | 0 | Chris Warrick: Spawning subprocesses smartly and securely https://t.co/ZdM8DlYaug\n","0 | 0 | @anthonypjshaw @pluralsight cool! congrats\n","0 | 0 | @seabisquet have you tried it?\n","0 | 0 | #PyCharm Community Edition and Professional Edition Explained: Licenses and More https://t.co/hdYXBtjo5V\n","0 | 0 | @PacktPub https://t.co/0xceRyfctY\n","0 | 0 | @tjholowaychuk Indeed! Ashamed of my old php code but also reason I got better. Have to stay hungry and curious, re… https://t.co/bvFJXrhnH8\n","0 | 0 | @_ericelliott @marlysson10 Thanks, good reminder to start my day with 20-30 min code / design book study.\n","0 | 0 | @Transition @kscottz Thanks. Keep practicing!\n","0 | 0 | Mike Driscoll: PyDev of the Week: Katherine Scott - ⏎ https://t.co/G8DeScYCEv -> \"if I can dream it up I can code it\" == why we love #Python\n","0 | 0 | Stein Magnus Jodal: Bringing the Mopidy music server to the browser https://t.co/r8R6hdRsuk\n","0 | 0 | Mauveweb: Fun and Games in #Python (Pycon PL Keynote) https://t.co/azngbasyAe\n","0 | 0 | @WinnieDaPooh83 @RealPython Oh yeah wanna try this one out. Maybe a popup to forcefully take breaks ;)\n","0 | 0 | https://t.co/IPAKBbBWiU\n","0 | 0 | @Pybonacci @PacktPub good one! - estamos muy pendientes eh ;)\n","0 | 0 | Awesome: Do your research online; create offline. https://t.co/VzKC2bSsX0\n","0 | 0 | @steven_braham Ok dank, goed te weten, welk hoofdstuk ben je begonnen? Het is idd nogal een dik boek\n","0 | 0 | @steven_braham thanks I will give it a try! :)\n","0 | 0 | @steven_braham Bit lengthy but you reckon worth the read then ... I did like soft skills a lot, hope it's not 'oude… https://t.co/vdRSR1Ssf6\n","0 | 0 | @mohhinder @bbelderbos Might need to give it another spin then ;)\n","0 | 0 | @mohhinder @bbelderbos I add most manually via the email notification. Did you get around the captcha to automate this further?\n","0 | 0 | @mohhinder @bbelderbos @PacktPub via my own Twitter account, PyBites only Python of course :)\n","0 | 0 | @bbelderbos @PacktPub @mohhinder here you go :)\n","0 | 0 | @mohhinder Good ones, will add. Thanks\n","0 | 0 | @Dan_Jeffries1 @mohhinder talking about math, found this article\n","0 | 0 | @python_tip Python is so elegant :)\n","0 | 0 | @aeroaks @techmoneykids oops too caught up making a banner ;) ⏎ Her you go: https://t.co/9Rb7wdgSuZ\n","0 | 0 | @EA1HET @bbelderbos anything specific regarding Flask?\n","0 | 0 | @hannelita Interesting, bookmarked some links, thanks\n","0 | 0 | Check out aosabook chapter 20 if you want to learn more about #SQLAlchemy\n","0 | 0 | @pythonbytes We definitely like Pelican :)\n","0 | 0 | Eradicating Non-Determinism in Tests ➙ https://t.co/vu21k8OtaT\n","0 | 0 | Semaphore Community: Testing Python Applications with Pytest https://t.co/c0ErzApiu0\n","0 | 0 | New on PyBites: #Python Twitter digest 2017 week 31 https://t.co/wXpkNGVBot\n","0 | 0 | @steven_braham @mosenturm Cool what are you building?\n","0 | 0 | @steven_braham @mosenturm To heroku?\n","0 | 0 | PyCharm: Using Docker Compose on Windows in PyCharm https://t.co/5fRCAkndSi\n","0 | 0 | Continuum Analytics News: What’s New with Anaconda in 2017? https://t.co/HxWogmATZA\n","0 | 0 | Anwesha Das: Developers, it's License but it's easy https://t.co/mx9XH3tovz\n","0 | 0 | Amjith Ramanujam: FuzzyFinder - in 10 lines of Python https://t.co/Po2cgy19We\n","0 | 0 | cookiecutter-simple-django - A cookiecutter template for creating reusable #Django projects quickly - thanks @mohhinder\n","0 | 0 | Peter Bengtsson: Find static files defined in django-pipeline but not found https://t.co/1s7t5gIigN\n","0 | 0 | Will Kahn-Greene: Soloists: code review on a solo project https://t.co/QhENJrTYdm\n","0 | 0 | Doug Hellmann: hmac — Cryptographic Message Signing and Verification — PyMOTW 3 https://t.co/YyGurvyh9m\n","0 | 0 | PyBites has a new project page: https://t.co/s2HIcgKVle\n","0 | 0 | from @PyBites import newsletter - https://t.co/ml4U4yEqHF - #Python #Articles #Challenges #News\n","0 | 0 | Our first #django app: https://t.co/qMU0y7UMd7 - let's wrap an article around it ...\n","0 | 0 | @bboe Cool, already getting PR submissions, we are having a play this weekend, the docs are great, thanks for building this.\n","0 | 0 | Nice, tomorrow with breakfast :) https://t.co/gb0Ji3RfaF\n","0 | 0 | @techmoneykids Can't wait :)\n","0 | 0 | @mohhinder Thanks for the kind words Martin\n","0 | 0 | @heroes_bot you're the coolest bot so far :)\n","0 | 0 | @mohhinder Using pycharm? Still need to give it a serious go, too used to Vim and tweaking vimrc with flake8 etc\n","0 | 0 | @mohhinder @babetoduarte curious too now :)\n","0 | 0 | @mohhinder ah I see what you mean now, yeah the namespace import is pretty neat, no?\n","0 | 0 | @haxor ... ah and I want to read your book again as well, it taught me a lot, thanks for writing it.\n","0 | 0 | @haxor Cool, thanks for reminding me to get that book. The other two O'Reilly books I have at close reach are Fluen… https://t.co/uU8Ye9Mp5N\n","0 | 0 | @mohhinder Thanks for updating the PR, will merge now\n","0 | 0 | @mohhinder Thanks, glad it was helpful\n","0 | 0 | Free ebook today: Mastering #Python Design Patterns ⏎ https://t.co/t2aLcaALdy ⏎ ⏎ Thanks @PacktPub ⏎ ⏎ Notification script: ⏎ https://t.co/4YErFZvrKm\n","0 | 0 | @mohhinder Cool! Challenges don't expire :) ⏎ ⏎ Build something cool and we will update the review post.\n","0 | 0 | From Script to Project part 1. - Building a Karma Bot with #Python and the #Slack API - https://t.co/GKpve6hH1J\n","0 | 0 | New @lynda course: #Python Projects - https://t.co/tC4Dx6FACn\n","0 | 0 | @Mooredvdcoll ok thanks, will look into it\n","0 | 0 | If you enjoy our code challenges feel free to submit ideas here: https://t.co/vpEQb5lAIG\n","0 | 0 | @Mooredvdcoll Cool, I always seeing it with pip install flask but have not looked in detail yet\n","0 | 0 | @ahnee3773 Woohoo! How are you progressing with this? PyBites is built with Pelican running on github! Good luck! - Julian\n","0 | 0 | @techmoneykids @anthonypjshaw @bbelderbos @dbader_org Indeed!\n","0 | 0 | @anthonypjshaw @techmoneykids @bbelderbos @dbader_org That's cool, gonna try it\n","0 | 0 | @techmoneykids @bbelderbos @anthonypjshaw @dbader_org LOL, we can set the geo location on our tweets, trying it now (Spain == Bob)\n","0 | 0 | @abbyleighanneco cool thanks!\n","0 | 0 | @abbyleighanneco ok http://127.0.0.1:8080 - index.html loads, isValidZip() validation works but not getting anything for valid zips\n","0 | 0 | @abbyleighanneco var weather = xyz that is ... (might need to update readme). sorry new to JS deploy I ended up np… https://t.co/dpxMfI2Lu3\n","0 | 0 | @abbyleighanneco cool. hi, Bob here (sorry we share this account). I needed to create a config file - just with this right? var key = xyz\n","0 | 0 | @abbyleighanneco Awesome! Is the code on github or anything like that??\n","0 | 0 | @abbyleighanneco Open weather api?\n","0 | 0 | Still overwhelmed by the amount of #PyCon2017 talks? Here is a good filter to apply ... https://t.co/ZO9MMAWkLs\n","0 | 0 | @mohhinder thanks!\n","0 | 0 | Why we believe in doing code challenges ... https://t.co/Xpwe36vlIt\n","0 | 0 | @heroes_bot thank you @heroes_bot :)\n","0 | 0 | Wow really cool and all that in few LOC https://t.co/C9bNrl0yxK\n","0 | 0 | @Mooredvdcoll Thanks\n","0 | 0 | @wonderfulboyx Congrats. Will review / feature tomorrow. Nice you joined our challenges :)\n","0 | 0 | @treyhunner this poster :) https://t.co/F0cyNCKwg0\n","0 | 0 | @PacktPub @Pybonacci Nice, will retweet this promo\n","0 | 0 | @treyhunner @CurrentTime Thanks will try that one\n","0 | 0 | @treyhunner @CurrentTime Cool, building bots is fun. Did you see the poster at Pycon? Do you run it as a unix cronj… https://t.co/wGfxk69AoT\n","0 | 0 | @mohhinder good to hear, hope you learned a few new things\n","0 | 0 | @InformIT @raymondh Excellent course, highly recommended\n","0 | 0 | Our new #Python Code Challenge is up, wow #21 already: Electricity Cost Calculation App - https://t.co/3dshs4PgeP\n","0 | 0 | @techmoneykids dude you're going strong lol\n","0 | 0 | @techmoneykids you like that cat picture?\n","0 | 0 | @jiffyclub Saw that one, awesome\n","0 | 0 | @mohhinder I missed a talk for that one ;)\n","0 | 0 | @mohhinder I hope it is useful in this format. Enjoy\n","0 | 0 | @mohhinder Thanks bit rushed as I was at pycon. Click is neat yes :)\n","0 | 0 | Code Challenge 19 - Post to Your Favorite API - Review https://t.co/QKVTxP5vho\n","0 | 0 | @amjithr Awesome, thanks\n","0 | 0 | @datapythonista Enjoy! Greetings from pycon portland :)\n","0 | 0 | @nkantar That's awesome\n","0 | 0 | @nkantar Me too haha, enjoy\n","0 | 0 | @TheAhmedSherif thanks for the shout out, hope this is useful\n","0 | 0 | @MPeucker hope you like it, thanks for signing up\n","0 | 0 | @nkantar it was paid swag, not part of the free bag I believe\n","0 | 0 | @nkantar It was part of the sign up package, not sure if you can still buy them separately, they did have a lot this morning ...\n","0 | 0 | @mohhinder @python_tip For the HW profiler challenge? ;)\n","0 | 0 | Wow: Sorting 2 Tons of Lego, The software Side - https://t.co/ENk92Gvd7B\n","0 | 0 | @audioholyx lol\n","0 | 0 | Our weekly #python twitter digest is up - https://t.co/Zp56XtNkjQ\n","0 | 0 | @techmoneykids @bbelderbos Good work mate, taking them in piece by piece\n","0 | 0 | @dbader_org Thanks Dan :)\n","0 | 0 | @importpython Thanks, surely will. It's fun and very rewardig! You too with your great newsletter, it's nice to get this weekly digest.\n","0 | 0 | @Yes_I_Know_IT @python_tip Thanks, good to know\n","0 | 0 | @audioholyx Nice to hear. Keep us posted :)\n","0 | 0 | @audioholyx Thanks. Ideas, feedback welcome. Are you doing the 100days challenge as well?\n","0 | 0 | Mike Driscoll: PyDev of the Week: Paweł Piotr Przeradowski https://t.co/MId9ivX7pp #python\n","0 | 0 | @ZurykMalkin cool, what are you building?\n","0 | 0 | from @PyBites import newsletter - https://t.co/DNqzR6CqHp - #python #Articles #Challenges #News\n","0 | 0 | PyBites: Twitter digest 2017 week 14 https://t.co/U5nMD1LfDz #python\n","0 | 0 | Weekly Python StackOverflow Report: (lxviii) stackoverflow python report https://t.co/MORAPbkNbN #python\n","0 | 0 | @gwuah_ haha good point, how do you keep up with JS?!\n","0 | 0 | @python_tip maybe you can link to it here? https://t.co/5Q6P5E3CtR - just used it to check before submitting. thanks\n","0 | 0 | @rkarabut Ah great idea! Will do the same in the AM. I wonder if they've pinched anything else. Thx for catching th… https://t.co/boehqd6lYd\n","0 | 0 | @rkarabut Oh wow! That's crazy! I wonder why they'd bother tbh. Might need to look into this tomorrow. Worst case,… https://t.co/yJwZCIeIPR\n","0 | 0 | Wow: solver for the eight queens puzzle with itertools permutations - https://t.co/nH8f4nsDiH\n","0 | 0 | Who joins us in our #code challenges? ⏎ ⏎ We are starting to get a nice set of exercises to hone your #python skills: ⏎ ⏎ https://t.co/nugm84MhkB\n","0 | 0 | PyBites – Twitter digest 2017 week 12 - some cool #python stuff we picked up this week https://t.co/iLC1A6c7k0\n","0 | 0 | PyBites Code Challenge 11 - Generators for Fun and Profit - Review - click around @pybites: each #theme its color :) https://t.co/1RxpGlhI2s\n","0 | 0 | PyBites – Simple API Part 2 - Building a Deep Work Logger with Flask, Slack and Google Docs https://t.co/liojgkJkfd\n","0 | 0 | next(PyBites CodeChallenge) ... tictactoe ... stay tuned. Good weekend\n","0 | 0 | What #python project will you be working on this weekend?\n","0 | 0 | Nice project: Feed2tweet 1.0, tool to post RSS feeds to Twitter, released https://t.co/fjpk1lM2oP #python\n","0 | 0 | @ArtSolopov @python_tip seriously? what version? cannot reproduce that in 2 nor 3 :)\n","0 | 0 | Very nice #Data Analysis: How to mine newsfeed data and extract interactive insights in #Python - https://t.co/hkXrQcZRBd\n","0 | 0 | EuroPython 2017: Welcome our new Logo - nice logo https://t.co/eTK0yGfUm3\n","0 | 0 | New PyBites article: Module of the Week - Requests-cache for Repeated API Calls - https://t.co/ATSDpW48q3 #python #APIs\n","0 | 0 | @RealPython thanks for the RT, btw enjoying your excellent tutorials on web/db/flask, added a link to our resources page.\n","0 | 0 | PyBites weekly #python news digest is out: https://t.co/YnrFElKHDc\n","0 | 0 | PyBites – 5 min guide to PEP8 - for .vimrc: autocmd FileType python map <buffer> ,f :call Flake8()<CR> #flake8 #vim https://t.co/8LoAzqjPEl\n","0 | 0 | @Pybonacci +1: speed, power, vimrc ... nmap comma + f para checkear flake8 :)\n","0 | 0 | Nice trick, similarly we use shell shortcut $_ - it all saves time! https://t.co/uhUUOs2Baq\n","0 | 0 | @dbader_org thanks for this Dan, it inspired us to start writing some context managers in our next challenge https://t.co/roiKPq21eg\n","0 | 0 | PyBites of the Week - https://t.co/jsZGCeE5qR\n","0 | 0 | @squeekyhoho Wow 400k! Certainly a feat! Go npm!\n","0 | 0 | @TalkPython will keep an eye :) https://t.co/FnBkf0cPGo (ironically started with requests/bs4, but could use stdlib, batteries included :) )\n","0 | 0 | @richardburcher Flask makes building APIs pretty easy as well. Had some fun with it yesterday.\n","0 | 0 | Hi, my name is PyBites. I've been writing Python for 0.2 years and I (will) never remember diff between re group vs groups on match object\n","0 | 0 | @richardburcher nice one mate! How great does it feel? More to it than you'd think! Looking forward to diving into more #flask myself! - JS\n","0 | 0 | @richardburcher what did you build?\n","0 | 0 | To create (subclass) your own exceptions or not ... https://t.co/6eRRD55tqo\n","0 | 0 | @dbader_org great video, do you see enough use cases for staticmethod vs regular function in module? See note in fluent python.\n","0 | 0 | Django Forms https://t.co/6nfBl6wWMx #python\n","0 | 0 | Twitter digest 2017 week 07 https://t.co/BY4G78jLwe #python\n","0 | 0 | Twitter digest 2017 week 07 https://t.co/BY4G78jLwe #python\n","0 | 0 | @bbelderbos @raymondh @techmoneykids we get 1st of March - https://t.co/ZnfBIE27Ih - pretty soon :)\n","0 | 0 | How to Order Dict Output in Python https://t.co/nq4FR9F5PX #python\n","0 | 0 | The definitive guide on how to use static, class or abstract methods in #Python https://t.co/n8imiKdlqv\n","0 | 0 | #99 Morepath: Super Powered Python Web Framework https://t.co/3xPnSAjqBB #python\n","0 | 0 | PyCaribbean Chat https://t.co/FWi67PXLuF #python\n","0 | 0 | #13 Python making the move to GitHub and Dropbox is stepping back from Pyston https://t.co/Z4iGIQjbZv #python\n","0 | 0 | Writing Clean Python With Namedtuples https://t.co/OUx89PN8mL #python\n","0 | 0 | Shelve It! https://t.co/wwcjvKbPJW #python\n","0 | 0 | PyBites of the Week - https://t.co/TwyRXizqSA\n","0 | 0 | Twitter digest 2017 week 06 https://t.co/6miYlYGGb1 #python\n","0 | 0 | Code Challenge 05 - Twitter data analysis Part 2: similar tweeters - review https://t.co/JVmXtTPoim #python\n","0 | 0 | Twitter digest 2017 week 06 https://t.co/6miYlYGGb1 #python\n","0 | 0 | https://t.co/t2aLcaSm56 free #pandas ebook today!\n","0 | 0 | https://t.co/pw64b7E6m2 think python 2nd ed (py3)\n","0 | 0 | @raymondh cool ... I get 2017-02-25 17:52:34 - fun to see the different replies. are we allowed to post our methods? interested to see ...\n","0 | 0 | #12 Expanding your Python mental model and serving millions of requests per second with Python https://t.co/gssoadNjIG #python\n","0 | 0 | Free @PacktPub ebook: #Python 3 Text Processing with NLTK 3 Cookbook https://t.co/t2aLcaALdy - might be useful for this week's challenge :)\n","0 | 0 | Nice article @SuConant - bookmarked a couple of courses https://t.co/gRx0wzCe3P\n","0 | 0 | From beginner to pro: Python books, videos and resources https://t.co/8bpGOQ13pz #python\n","0 | 0 | PyBites of the Week - https://t.co/pthMv8UBkn\n","0 | 0 | Twitter digest 2017 week 05 https://t.co/S8EhXDYaRP #python\n","0 | 0 | Twitter digest 2017 week 05 https://t.co/S8EhXDYaRP #python\n","0 | 0 | python tricks: https://t.co/MTei4wkOqe\n","0 | 0 | Python Weekly - Issue 280 - https://t.co/8MTwN2DKTV\n","0 | 0 | Send Advanced Emails with Python MIME Submodules - https://t.co/qm33tgrkTn\n","0 | 0 | PyTennessee Chat https://t.co/q7nePuTgP9 #python\n","0 | 0 | Python Tricks book review https://t.co/3QyKlVzpg6 #python\n","0 | 0 | MySQL for #Python - free #packt ebook today - https://t.co/t2aLcaALdy\n","0 | 0 | Why Learn Python? Here Are 8 Data-Driven Reasons https://t.co/a1M0ztYp4L #python\n","0 | 0 | Python Tricks book review https://t.co/3QyKlVzpg6 #python\n","0 | 0 | PyBites of the Week - https://t.co/DFTz3e20KA\n","0 | 0 | Code Challenge 04 - Twitter data analysis Part 1: get the data https://t.co/8dRJyFKTey #python\n","0 | 0 | Twitter digest 2017 week 04 https://t.co/L3njBuBats #python\n","0 | 0 | Code Challenge 03 - PyBites blog tag analysis - Review https://t.co/xvcLQBbvup #python\n","0 | 0 | Send Emails with Python smtplib https://t.co/FlXEhuosuY\n","0 | 0 | “Understanding the underscore( _ ) of Python” by @mingrammer https://t.co/zgiSGBPd3s\n","0 | 0 | why you should (tech) blog: a. meet and learn from other developers, b. share knowledge with the wider community, c. refer back to own notes\n","0 | 0 | Code Challenge 03 - PyBites blog tag analysis - Review https://t.co/wKHxFsXTtm #python\n","0 | 0 | #96 Exploring Awesome Python https://t.co/iYz6nWnHRp #python\n","0 | 0 | Awesome: pelican-ipynb - Pelican plugin for blogging with #jupyter / IPython Notebooks\n","0 | 0 | PyBites of the Week - https://t.co/J6wyRMM1U0\n","0 | 0 | Code Challenge 03 - PyBites blog tag analysis https://t.co/LJ1px8rT88 #python\n","0 | 0 | Twitter digest 2017 week 03 https://t.co/msNAGxpC4b #python\n","0 | 0 | Imgur Post - 20 years of Moore's law, wow https://t.co/NvXgMlbBQu\n","0 | 0 | Python Iteration https://t.co/lrP0hVoaWX #python\n"]},{"name":"stdout","output_type":"stream","text":["0 | 0 | #95 Grumpy: Running Python on Go https://t.co/LGQl1HJfZM #python\n","0 | 0 | Errors should never pass silently https://t.co/Efy2AIQlzY #python\n","0 | 0 | Python 3.5.3 and 3.4.6 are now available https://t.co/pUp21JKnk9 #python\n","0 | 0 | Assert Statements in Python https://t.co/Lx6l0AkanQ #python\n","0 | 0 | I just signed up for Hacker Newsletter so I can keep up with all the great articles on Hacker News. https://t.co/OVNcVE2K0m\n","0 | 0 | Teaching Python & Python Tutor https://t.co/fq1X2KyJIS #python\n","0 | 0 | Python 3.5.3 and 3.4.6 are now available https://t.co/pUp21K1YbH #python\n","0 | 0 | Code Challenge 02 - Word Values Part II - a simple game https://t.co/BzKQg8KC1L #python\n","0 | 0 | PyBites of the Week - https://t.co/jhwwHWcxZt\n","0 | 0 | PyBites of the Week - https://t.co/31TdXLG8UT\n","0 | 0 | Check out this cool episode: https://t.co/VtXiXwY8aA - interesting episode about SQLAlchemy https://t.co/CMUzapsLqG\n","0 | 0 | Vlad's blog – What every Python project should have https://t.co/Yfe1rS1tHh\n","0 | 0 | cookiecutter: utility that creates projects from cookiecutters (project templates). E.g. Python package projects https://t.co/EMxC7CHur0\n","0 | 0 | Code Challenge 01 - Word Values Part I - Review https://t.co/ymC1HcbaLt #python\n","0 | 0 | Twitter digest 2017 week 02 https://t.co/5TsAOp6Jcx #python\n","0 | 0 | #94 Guarenteed packages via Conda and Conda-Forge https://t.co/6pKEQ9t89J #python\n","0 | 0 | Create a Simple Web Scraper with BeautifulSoup4 https://t.co/PY4JSvWIZw #python\n","0 | 0 | Comprehending Python’s Comprehensions https://t.co/we9hO354uv #python\n","0 | 0 | #94 Guarenteed packages via Conda and Conda-Forge https://t.co/6pKEQ9t89J #python\n","0 | 0 | https://t.co/s5rEdcKZin talk about #data and #nlp, so cool we can watch all #pycon videos online, such a great way to learn\n","0 | 0 | @kennethreitz same feeling yesterday :)\n","0 | 0 | Iterators https://t.co/n3MXkT0Gr3 #python\n","0 | 0 | Code Challenge 01 - Word Values Part I https://t.co/h4N81Ll6ZC #python\n","0 | 0 | Beautiful, idiomatic Python https://t.co/Gft5OaBkon #python\n","0 | 0 | refactor ugly switch statement in #python https://t.co/2Plq0XHVAu\n","0 | 0 | PyBites of the Week - https://t.co/Lynq8vE7Tb\n","0 | 0 | @Duvancarrez we're a new blog rather. We added challenges as we think they are a fun and great way to learn more Python.\n","0 | 0 | Twitter digest 2017 week 01 https://t.co/lRZrfmB9QN #python\n","0 | 0 | https://t.co/WZ4lad2oJv - go running python\n","0 | 0 | Twitter digest 2017 week 01 https://t.co/lRZrfmB9QN #python\n","0 | 0 | Code Challenge #01 - code review https://t.co/UjR3G68eSq #python\n","0 | 0 | https://t.co/szO1tTdMre good explanation of iterators and iterables\n","0 | 0 | Python 3.5.3rc1 and Python 3.4.6rc1 are now available https://t.co/8XP5CWH6XF #python\n","0 | 0 | #93 Spreading Python through the sciences with Software Carpentry https://t.co/38EBc45KL9 #python\n","0 | 0 | A great book that makes algorithms accessible https://t.co/2tkf4ZWiJA #python\n","0 | 0 | interesting #python #dict https://t.co/BTXxPWNYVc https://t.co/9d1RgcrhXK\n","0 | 0 | @_egonschiele ML, more confident tackling it after your book, maybe idea for part II? (Applying algorithms to ML problems)\n","0 | 0 | Python 3.5.3rc1 and Python 3.4.6rc1 are now available https://t.co/8XP5CWH6XF #python\n","0 | 0 | #python #excel https://t.co/lGuSaOFaio\n","0 | 0 | 3.6 new features https://t.co/6atEam0H9i #python\n","0 | 0 | @Pybonacci violaciones mas dramaticas?\n","0 | 0 | Don't Let Indentation Catch You Out https://t.co/u2iR5XPKXS #python\n","0 | 0 | 3 best #python books https://t.co/fDYkPZ07S7\n","0 | 0 | #92 Bonus: Python Bytes Crossover: Python 3.6 is going to be awesome, Kite: your friendly co-developing AI https://t.co/0gazCa1EpZ #python\n","0 | 0 | Automate Tweeting: how to build a Twitterbot https://t.co/y75ZCLBJaB #python\n","0 | 0 | The Difference Between “is” and “==” in Python https://t.co/6HCZugHkQS #python\n","0 | 0 | #91 Top 10 Data Science Stories of 2016 https://t.co/Aao9ZJFLW8 #python\n","0 | 0 | one place for all #python videos, awesome - https://t.co/QgxtrlNtwW\n","0 | 0 | #vim #python environment https://t.co/WFzvrdQX5j\n","0 | 0 | Quick Automate the Boring Stuff Review https://t.co/XI8EHWX4Ks - great #book to start learning #python #pybites\n","0 | 0 | Get a weekly digest from a Pelican blog https://t.co/uPTtW5AYKh #python #pelican #blog\n","0 | 0 | 2016 py articles and useful books https://t.co/apNLDseUA1 #python #pybooks #tips\n","0 | 0 | The Beauty of Python Virtualenvs https://t.co/JI0E2vA1ub #python #virtualenv\n","0 | 0 | Read the stdlib: deque https://t.co/l0q89ffPM5 #python #datatypes #deque\n"]}],"source":"excl_rts = [tweet for tweet in tweets if not tweet.text.startswith('RT')]\ntop_10 = sorted(excl_rts, key=lambda tw: (tw.likes + tw.rts)/2, reverse=True)[:10]\n\nfmt = '{likes:<5} | {rts: <5} | {text}'\nprint(fmt.format(likes='❤', rts='♺', text='✎'))\nprint('-'*100)\nfor tw in top_10:\n print(fmt.format(likes=tw.likes, rts=tw.rts, text=tw.text.replace('\\n', ' ⏎ ')))"},{"cell_type":"markdown","metadata":{},"source":["What are our common hashtags and mentions? "]},{"cell_type":"code","execution_count":14,"metadata":{},"outputs":[{"data":{"text/plain":["[('#python', 908),\n"," ('#100daysofcode', 147),\n"," ('#django', 71),\n"," ('#flask', 67),\n"," ('#news', 28),\n"," ('#api', 24),\n"," ('#pandas', 21),\n"," ('#challenges', 20),\n"," ('#pycon2017', 20),\n"," ('#articles', 19),\n"," ('#jupyter', 18),\n"," ('#packtpublishing', 14),\n"," ('#programming', 12),\n"," ('#vim', 12),\n"," ('#code', 12),\n"," ('#pytest', 11),\n"," ('#machinelearning', 11),\n"," ('#python3', 11),\n"," ('#tensorflow', 11),\n"," ('#docker', 10)]"]},"execution_count":14,"metadata":{},"output_type":"execute_result"}],"source":"hashtag = re.compile(r'#[-_A-Za-z0-9]+')\nmention = re.compile(r'@[-_A-Za-z0-9]+')\n\nall_tweets = ' '.join([tw.text.lower() for tw in tweets])\nall_tweets_excl_rt = ' '.join([tw.text.lower() for tw in tweets if not tw.text.startswith('RT')])\n\nhashtags = hashtag.findall(all_tweets)\ncnt = Counter(hashtags)\ncnt.most_common(20)"},{"cell_type":"markdown","metadata":{},"source":["❤ #Python ❤ #100DaysOfCode ❤"]},{"cell_type":"code","execution_count":15,"metadata":{},"outputs":[{"data":{"text/plain":["[('@python_tip', 173),\n"," ('@pybites', 158),\n"," ('@packtpub', 95),\n"," ('@talkpython', 94),\n"," ('@dbader_org', 92),\n"," ('@realpython', 77),\n"," ('@bbelderbos', 77),\n"," ('@techmoneykids', 66),\n"," ('@pythonbytes', 57),\n"," ('@fullstackpython', 53),\n"," ('@mohhinder', 51),\n"," ('@brianokken', 38),\n"," ('@anthonypjshaw', 33),\n"," ('@robhimself1982', 32),\n"," ('@mkennedy', 30)]"]},"execution_count":15,"metadata":{},"output_type":"execute_result"}],"source":"mentions = mention.findall(all_tweets)\ncnt = Counter(mentions)\ncnt.most_common(15)"},{"cell_type":"code","execution_count":16,"metadata":{},"outputs":[{"data":{"text/plain":["[('@packtpub', 54),\n"," ('@techmoneykids', 50),\n"," ('@mohhinder', 47),\n"," ('@pybites', 36),\n"," ('@python_tip', 35),\n"," ('@dbader_org', 33),\n"," ('@bbelderbos', 30),\n"," ('@anthonypjshaw', 17),\n"," ('@lynda', 16),\n"," ('@realpython', 16),\n"," ('@pybonacci', 14),\n"," ('@robhimself1982', 13),\n"," ('@talkpython', 13),\n"," ('@ferrorodolfo', 12),\n"," ('@pythonbytes', 10)]"]},"execution_count":16,"metadata":{},"output_type":"execute_result"}],"source":"mentions = mention.findall(all_tweets_excl_rt)\ncnt = Counter(mentions)\ncnt.most_common(15)"},{"cell_type":"code","execution_count":null,"metadata":{},"outputs":[],"source":"# !pip install wordcloud\n# just for demo: you can run shell commands with ! \n# this dependency you should already have after pip install -r requirements.txt"},{"cell_type":"code","execution_count":17,"metadata":{},"outputs":[],"source":"all_tweets_excl_rts_mentions = ' '.join([tw.text.lower() for tw in tweets \n if not tw.text.startswith('RT') and not tw.text.startswith('@')])"},{"cell_type":"markdown","metadata":{},"source":["Andreas Mueller's [wordcloud](https://github.com/amueller/word_cloud) is awesome, you just feed it a text (here: all our concatenated tweets) and a mask image and it creates a word cloud on top of it:"]},{"cell_type":"code","execution_count":19,"metadata":{},"outputs":[{"data":{"text/plain":[""]},"execution_count":19,"metadata":{},"output_type":"execute_result"}],"source":"pb_mask = np.array(Image.open(\"pybites.png\"))\nstopwords = set(STOPWORDS)\n\nstopwords.add('co')\nstopwords.add('https')\n\nwc = WordCloud(background_color=\"white\", max_words=2000, mask=pb_mask,\n stopwords=stopwords)\n\nwc.generate(all_tweets_excl_rts_mentions)"},{"cell_type":"code","execution_count":21,"metadata":{},"outputs":[{"data":{"text/plain":["(-0.5, 2499.5, 2499.5, -0.5)"]},"execution_count":21,"metadata":{},"output_type":"execute_result"},{"data":{"image/png":"iVBORw0KGgoAAAANSUhEUgAAA2oAAANSCAYAAAAUAj3LAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvNQv5yAAAIABJREFUeJzs3deTpFea3/fvOa9Nb8q3RwMYYAAMxuzsari7XFqRUsgGQ3+gLhShS/GCumCIEskQSe3u7Jgdgx7Y9l2+sir9687RxVtdaAANoAH0ADmY3ydmoruz0rz5VqEyf3me8zzGe4+IiIiIiIisDvtNH4CIiIiIiIh8lIKaiIiIiIjIilFQExERERERWTEKaiIiIiIiIitGQU1ERERERGTFKKiJiIiIiIisGAU1ERERERGRFaOgJiIiIiIismIU1ERERERERFZM+E0fwOfw3/QBiIiIiIiIPCPzvO5IK2oiIiIiIiIrRkFNRERERERkxSioiYiIiIiIrBgFNRERERERkRWjoCYiIiIiIrJiFNRERERERERWjIKaiIiIiIjIilFQExERERERWTEKaiIiIiIiIitGQU1ERERERGTFKKiJiIiIiIisGAU1ERERERGRFaOgJiIiIiIismIU1ERERERERFaMgpqIiIiIiMiKUVATERERERFZMQpqIiIiIiIiK0ZBTUREREREZMUoqImIiIiIiKwYBTUREREREZEVo6AmIiIiIiKyYhTUREREREREVoyCmoiIiIiIyIpRUBMREREREVkxCmoiIiIiIiIrRkFNRERERERkxSioiYiIiIiIrBgFNRERERERkRWjoCYiIiIiIrJiFNRERERERERWjIKaiIiIiIjIilFQExERERERWTEKaiIiIiIiIitGQU1ERERERGTFKKiJiIiIiIisGAU1ERERERGRFaOgJiIiIiIismIU1ERERERERFaMgpqIiIiIiMiKUVATERERERFZMQpqIiIiIiIiK0ZBTUREREREZMUoqImIiIiIiKwYBTUREREREZEVo6AmIiIiIiKyYhTUREREREREVoyCmoiIiIiIyIpRUBMREREREVkxCmoiIiIiIiIrRkFNRERERERkxSioiYiIiIiIrBgFNRERERERkRWjoCYiIiIiIrJiFNRERERERERWjIKaiIiIiIjIilFQExERERERWTEKaiIiIiIiIitGQU1ERERERGTFKKiJiIiIiIisGAU1ERERERGRFaOgJiIiIiIismIU1ERERERERFaMgpqIiIiIiMiKUVATERERERFZMQpqIiIiIiIiK0ZBTUREREREZMUoqImIiIiIiKwYBTUREREREZEVo6AmIiIiIiKyYhTUREREREREVoyCmoiIiIiIyIpRUBMREREREVkxCmoiIiIiIiIrRkFNRERERERkxSioiYiIiIiIrBgFNRERERERkRWjoCYiIiIiIrJiFNRERERERERWjIKaiIiIiIjIilFQExERERERWTEKaiIiIiIiIitGQU1ERERERGTFKKiJiIiIiIisGAU1ERERERGRFaOgJiIiIiIismIU1ERERERERFaMgpqIiIiIiMiKUVATERERERFZMQpqIiIiIiIiK0ZBTUREREREZMUoqImIiIiIiKwYBTUREREREZEVo6AmIiIiIiKyYhTUREREREREVoyCmoiIiIiIyIpRUBMREREREVkxCmoiIiIiIiIrRkFNRERERERkxSioiYiIiIiIrBgFNRERERERkRWjoCYiIiIiIrJiFNRERERERERWjIKaiIiIiIjIilFQExH5I1AWFVXlvunDEBERkWcUftMHICIiX01VOR7dOyZJI4qiIm3EAEzHCxrNmMUiZzpe0mwlpI2YKA5YzHPiOMRYw3KRs7XTJ0mjb/iZiIiIyGMKaiIif+CKvOSDd/fp9ZtkWYk1hrKqyBYF/WGLk+MprXZKUVTMpxnOO5bzgiSNSBoRew9HtDupgpqIiMgKMd77b/oYPstKH5yIyCrw3jObLgmCgLKssMbgzn+3h2HA/qMR/WGbJI0oy4owDKgqh3eeKA443BszWG/T7qTf8DMRERH5g2ee2x0pqImIfLs9/j1vzNNfOz7v6yIiIvLMFNRERGS1OOdw7sPQ573HGIOrHGXlCMOAPC+pKkeaRhhjsPbD63nvCQKrwCgiIn/IntuLmPaoiYh8A1zl6mASBp9+HVeXJwZhwGw8J22lBMFHm/UuZxn79464/OIWjz44YPPaGmkz+ch1vPdUZUUQBp+5qvZ51/k8D+6f8MF7BzQaEVEcUpWOVjthMl6SpCGXLg85OhxTnHeg7HRSrLU457CBpdVK2NrufanHFhER+bZRUBMR+T3LFjn3f/eIdr9J3Iwp84rD+8cs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\n","text/plain":[""]},"metadata":{},"output_type":"display_data"}],"source":"plt.figure(figsize=(15, 15))\nplt.imshow(wc, interpolation=\"bilinear\")\nplt.margins(x=0, y=0)\nplt.axis(\"off\")"},{"cell_type":"markdown","metadata":{},"source":["### Second and third day - practice, practice, practice:"]},{"cell_type":"markdown","metadata":{},"source":["We covered Twitter data analysis quite extensively on our blog. Below I am listing a combination of tools and challenges you can work on. As they are not small projects I bundled day 2 and 3 to focus on getting one working."]},{"cell_type":"markdown","metadata":{},"source":["- (__PyBites preferred__) [How we Automated our 100DaysOfCode Daily Tweet](https://pybit.es/100days-autotweet.html) - seriously: automate this task, it makes your life easier freeing you up to do more coding (it's not only the tweet, Twitter is a distraction everytime you go there ...) - the daily tweet re-enforces commitment to completing the _#100DaysOfCode_! \n"," - Related article: [Automate Tweeting: how to build a Twitterbot](https://pybit.es/automate-twitter.html) - nice extension to learn how to POST to the Twitter API\n","\n","- 3 part code challenge: \n"," - [04 - Twitter data analysis Part 1: Getting Data](https://codechalleng.es/challenges/4/)\n"," - [05 - Twitter data analysis Part 2: Similar Tweeters](https://codechalleng.es/challenges/5/)\n"," - [07 - Twitter Sentiment Analysis](https://codechalleng.es/challenges/7/) (using a cool module called _TextBlob_)\n","\n","- You like the testing part? Maybe you can try to mock Twitter API calls, see [Parsing Twitter Geo Data and Mocking API Calls by Example](https://pybit.es/twitter-api-geodata-mocking.html)\n","\n","- You could also combine this effort with the [Slack API](https://api.slack.com), posting to a channel each time your domain is mentioned, see [here](https://github.com/pybites/100DaysOfCode/blob/master/020/domain_mentions.py) (a tool we still use).\n","\n","- Or manually draw stats from a downloaded Twitter archive, see [here](https://github.com/pybites/100DaysOfCode/tree/master/086)\n","\n","- One final option: build a small web app around Twitter data, for example: [Building a Simple Web App With Bottle, SQLAlchemy, and the Twitter API](https://realpython.com/blog/python/building-a-simple-web-app-with-bottle-sqlalchemy-twitter-api/) (here I learned about _Cursor_ as efficient/fast way to retrieve Twitter data). \n","\n","- Another Twitter data related project ..."]},{"cell_type":"markdown","metadata":{},"source":["Have fun and remember, keep calm and code in Python!"]}],"nbformat":4,"nbformat_minor":2,"metadata":{"language_info":{"name":"python","codemirror_mode":{"name":"ipython","version":3}},"orig_nbformat":2,"file_extension":".py","mimetype":"text/x-python","name":"python","npconvert_exporter":"python","pygments_lexer":"ipython3","version":3}} \ No newline at end of file diff --git a/days/58-60-twitter-api/wordcloud-image.png b/days/58-60-twitter-api/wordcloud-image.png new file mode 100644 index 00000000..a0c2ac0e Binary files /dev/null and b/days/58-60-twitter-api/wordcloud-image.png differ diff --git a/days/61-63-github-api/README.md b/days/61-63-github-api/README.md new file mode 100644 index 00000000..8b008dfa --- /dev/null +++ b/days/61-63-github-api/README.md @@ -0,0 +1,21 @@ +# Using Python + Github API + +In this lesson I will show you how to use [PyGithub](https://github.com/PyGithub/PyGithub) to retrieve public data from Github profiles and how to automatically create [a gist](https://help.github.com/en/articles/creating-gists). + +## Day 1: Exploring the PyGithub module + +Today you watch the videos, the accompanying notebook is [here](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/61-63-github-api/github-api.ipynb). + +## Day 2 and 3: Practice + +Now you got the basics down, it's time to start using the Github API with Python yourself, some ideas for projects to work on you can find [in my notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/61-63-github-api/github-api.ipynb). + +You can use PyGithub or any other wrapper module, as long as you use Python :) + +## Time to share what you've accomplished! + +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. + +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). diff --git a/days/61-63-github-api/images/token1.png b/days/61-63-github-api/images/token1.png index 21ee23bf..d903dd99 100644 Binary files a/days/61-63-github-api/images/token1.png and b/days/61-63-github-api/images/token1.png differ diff --git a/days/61-63-github-api/images/token2.png b/days/61-63-github-api/images/token2.png index 77c8d3cb..95bbf6f1 100644 Binary files a/days/61-63-github-api/images/token2.png and b/days/61-63-github-api/images/token2.png differ diff --git a/days/61-63-github-api/images/token3.png b/days/61-63-github-api/images/token3.png index f67e6037..cc121431 100644 Binary files a/days/61-63-github-api/images/token3.png and b/days/61-63-github-api/images/token3.png differ diff --git a/days/67-69-pyperclip/README.md b/days/67-69-pyperclip/README.md index 7964f5cd..8fdaf378 100644 --- a/days/67-69-pyperclip/README.md +++ b/days/67-69-pyperclip/README.md @@ -7,7 +7,7 @@ It's a wonderful tool for copying and pasting to the clipboard using your Python ## Day N: Pyperclip usage and an Affiliate script -Get your environment setup and learn how to use Pyperclip with the setup and usage videos. +Get your environment setup and learn how to use Pyperclip with the setup and usage videos. Note to **Linux** users: You likely need to install `xclip` to get `Pyperclip` to work on your system, [more info here](https://github.com/talkpython/100daysofcode-with-python-course/issues/46). Once done, move onto *Generate affiliate links with Pyperclip* to see a solid use case for Pyperclip (something we use ourselves!). @@ -38,4 +38,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).* diff --git a/days/73-75-selenium/README.md b/days/73-75-selenium/README.md new file mode 100644 index 00000000..d2c83287 --- /dev/null +++ b/days/73-75-selenium/README.md @@ -0,0 +1,23 @@ +# Using Python Selenium to Automate Tasks + +[Selenium](https://selenium-python.readthedocs.io) is a great tool to write functional/acceptance tests and automation scripts that require interaction with a webpage. In today's lesson you learn how to effectively do this. + +First we will get Selenium running and look at two use cases. Then we have you code 1 or 2 scripts using Selenium. + +## Day 1: Selenium by Example + +Today you watch the videos. You can follow along with my notebook [here](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/73-75-selenium/python-selenium.ipynb). + +## Day 2 and 3: Practice time! + +Now it's your turn. The goal is to have you get your hands dirty using Python Selenium. + +Try to complete [PyBites Code Challenge 32 - Test a Simple Django App With Selenium ](https://pybit.es/articles/codechallenge32/) and PR your work. [My notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/73-75-selenium/python-selenium.ipynb) has some more pointers as well. + +## Time to share what you've accomplished! + +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. + +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). diff --git a/days/73-75-selenium/images/banner1.png b/days/73-75-selenium/images/banner1.png index 0323cb88..5bf93cd1 100644 Binary files a/days/73-75-selenium/images/banner1.png and b/days/73-75-selenium/images/banner1.png differ diff --git a/days/73-75-selenium/images/banner2.png b/days/73-75-selenium/images/banner2.png index 003c5d61..f2a2369b 100644 Binary files a/days/73-75-selenium/images/banner2.png and b/days/73-75-selenium/images/banner2.png differ diff --git a/days/73-75-selenium/images/banner3.png b/days/73-75-selenium/images/banner3.png index 987da61a..ac35fc16 100644 Binary files a/days/73-75-selenium/images/banner3.png and b/days/73-75-selenium/images/banner3.png differ diff --git a/days/73-75-selenium/images/banner4.png b/days/73-75-selenium/images/banner4.png index 87c4c16f..f57bbeef 100644 Binary files a/days/73-75-selenium/images/banner4.png and b/days/73-75-selenium/images/banner4.png differ diff --git a/days/73-75-selenium/images/banner5.png b/days/73-75-selenium/images/banner5.png index c0ec51bb..1623b8a2 100644 Binary files a/days/73-75-selenium/images/banner5.png and b/days/73-75-selenium/images/banner5.png differ diff --git a/days/73-75-selenium/images/packt1.png b/days/73-75-selenium/images/packt1.png index 69ac37ae..92d12720 100644 Binary files a/days/73-75-selenium/images/packt1.png and b/days/73-75-selenium/images/packt1.png differ diff --git a/days/73-75-selenium/images/packt2.png b/days/73-75-selenium/images/packt2.png index ced9742a..93a194ad 100644 Binary files a/days/73-75-selenium/images/packt2.png and b/days/73-75-selenium/images/packt2.png differ diff --git a/days/73-75-selenium/images/packt3.png b/days/73-75-selenium/images/packt3.png index d3544e4f..b40530ce 100644 Binary files a/days/73-75-selenium/images/packt3.png and b/days/73-75-selenium/images/packt3.png differ diff --git a/days/73-75-selenium/images/packt4.png b/days/73-75-selenium/images/packt4.png index aa1c5593..ebd86a8b 100644 Binary files a/days/73-75-selenium/images/packt4.png and b/days/73-75-selenium/images/packt4.png differ diff --git a/days/82-84-dataviz-plotly/README.md b/days/82-84-dataviz-plotly/README.md new file mode 100644 index 00000000..5934ff04 --- /dev/null +++ b/days/82-84-dataviz-plotly/README.md @@ -0,0 +1,37 @@ +# Data Vizualization with Plotly + +[Plotly](https://plot.ly/python/) is a data visualization library that lets you create beautiful graphs and is easy to use. + +In this lesson we use it to analyze some PyBites blog feed data. + +## Day 1: Getting the data + +Today you watch the videos. You can follow along with the examples [using my notebook](https://github.com/talkpython/100daysofcode-with-python-course/blob/master/days/82-84-dataviz-plotly/data-viz.ipynb). + +We use `feedparser` and `collections.Counter` to prepare PyBites feed data, then use `plotly` to look at: + +1. how often we post, +2. what categories we post most often in, +3. and what tags we commonly use on our posts. + +At the end of today's lesson, I provide some additional links to data viz work we've done on our PyBites blog. + +## Day 2 and 3: Roll your own! + +With the materials provided try to get your hands on an interesting data set, be it your own or another source like [Kaggle](https://www.kaggle.com). + +It should not be that hard, data is everywhere! You probably need some parsing and data cleaning, not the most fun part, but an important skill to have. + +Pick one of many data viz libraries and create some cool visualizations and share them with us on Twitter. + +Lack inspiration? [Randy Olson](https://twitter.com/randal_olson) tends to tweet really cool [#dataviz stuff](https://twitter.com/hashtag/dataviz?src=hash), however remember to start simple, data viz alone could fill a 100 Days of Code :) + +Enjoy and remember: keep calm and code in Python! + +## Time to share what you've accomplished! + +Be sure to share your last couple of days work on Twitter or Facebook. Use the hashtag **#100DaysOfCode**. + +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). diff --git a/days/82-84-dataviz-plotly/images/plot1.png b/days/82-84-dataviz-plotly/images/plot1.png index bd47493e..924cddcc 100644 Binary files a/days/82-84-dataviz-plotly/images/plot1.png and b/days/82-84-dataviz-plotly/images/plot1.png differ diff --git a/days/82-84-dataviz-plotly/images/plot2.png b/days/82-84-dataviz-plotly/images/plot2.png index 958f01b1..bdfc729f 100644 Binary files a/days/82-84-dataviz-plotly/images/plot2.png and b/days/82-84-dataviz-plotly/images/plot2.png differ diff --git a/days/82-84-dataviz-plotly/images/plot3.png b/days/82-84-dataviz-plotly/images/plot3.png index 83d49c86..f455eef4 100644 Binary files a/days/82-84-dataviz-plotly/images/plot3.png and b/days/82-84-dataviz-plotly/images/plot3.png differ diff --git a/days/85-87-full-stack-easy/readme_resources/code.png b/days/85-87-full-stack-easy/readme_resources/code.png index 30bfb177..d87fdbe5 100644 Binary files a/days/85-87-full-stack-easy/readme_resources/code.png and b/days/85-87-full-stack-easy/readme_resources/code.png differ diff --git a/days/85-87-full-stack-easy/readme_resources/edit-ui.png b/days/85-87-full-stack-easy/readme_resources/edit-ui.png index 35a1414b..9e1384e6 100644 Binary files a/days/85-87-full-stack-easy/readme_resources/edit-ui.png and b/days/85-87-full-stack-easy/readme_resources/edit-ui.png differ diff --git a/days/85-87-full-stack-easy/readme_resources/pub.png b/days/85-87-full-stack-easy/readme_resources/pub.png index 3c93212a..6f538d07 100644 Binary files a/days/85-87-full-stack-easy/readme_resources/pub.png and b/days/85-87-full-stack-easy/readme_resources/pub.png differ diff --git a/days/85-87-full-stack-easy/readme_resources/register.png b/days/85-87-full-stack-easy/readme_resources/register.png index 5bdf206b..2640517c 100644 Binary files a/days/85-87-full-stack-easy/readme_resources/register.png and b/days/85-87-full-stack-easy/readme_resources/register.png differ diff --git a/days/85-87-full-stack-easy/readme_resources/tables.png b/days/85-87-full-stack-easy/readme_resources/tables.png index 396e4c60..d60d0688 100644 Binary files a/days/85-87-full-stack-easy/readme_resources/tables.png and b/days/85-87-full-stack-easy/readme_resources/tables.png differ diff --git a/days/94-96-guis/demos/final_search_app/api.py b/days/94-96-guis/demos/final_search_app/api.py index 87f4b044..5f141cc8 100644 --- a/days/94-96-guis/demos/final_search_app/api.py +++ b/days/94-96-guis/demos/final_search_app/api.py @@ -8,17 +8,17 @@ def find_movie_by_keyword(keyword: str) -> List[Movie]: - url = f'http://movie_service.talkpython.fm/api/search/{keyword}' + url = f'https://movieservice.talkpython.fm/api/search/{keyword}' return __get_results(url) def find_movie_by_director(director_name: str) -> List[Movie]: - url = f'http://movie_service.talkpython.fm/api/director/{director_name}' + url = f'https://movieservice.talkpython.fm/api/director/{director_name}' return __get_results(url) def find_movie_by_imdb_code(imdb_code: str) -> List[Movie]: - url = f'http://movie_service.talkpython.fm/api/movie/{imdb_code}' + url = f'https://movieservice.talkpython.fm/api/movie/{imdb_code}' resp = requests.get(url) resp.raise_for_status() result = resp.json() 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') diff --git a/days/94-96-guis/demos/starter_search_app/api.py b/days/94-96-guis/demos/starter_search_app/api.py index 87f4b044..5f141cc8 100644 --- a/days/94-96-guis/demos/starter_search_app/api.py +++ b/days/94-96-guis/demos/starter_search_app/api.py @@ -8,17 +8,17 @@ def find_movie_by_keyword(keyword: str) -> List[Movie]: - url = f'http://movie_service.talkpython.fm/api/search/{keyword}' + url = f'https://movieservice.talkpython.fm/api/search/{keyword}' return __get_results(url) def find_movie_by_director(director_name: str) -> List[Movie]: - url = f'http://movie_service.talkpython.fm/api/director/{director_name}' + url = f'https://movieservice.talkpython.fm/api/director/{director_name}' return __get_results(url) def find_movie_by_imdb_code(imdb_code: str) -> List[Movie]: - url = f'http://movie_service.talkpython.fm/api/movie/{imdb_code}' + url = f'https://movieservice.talkpython.fm/api/movie/{imdb_code}' resp = requests.get(url) resp.raise_for_status() result = resp.json() diff --git a/days/94-96-guis/readme_resources/app.png b/days/94-96-guis/readme_resources/app.png index 0cacb0df..52eb777d 100644 Binary files a/days/94-96-guis/readme_resources/app.png and b/days/94-96-guis/readme_resources/app.png differ diff --git a/readme_resources/100days-course-flow.png b/readme_resources/100days-course-flow.png index 59f658a9..a4eaabfd 100644 Binary files a/readme_resources/100days-course-flow.png and b/readme_resources/100days-course-flow.png differ diff --git a/readme_resources/100days-course.png b/readme_resources/100days-course.png index 17621c6e..894665ab 100644 Binary files a/readme_resources/100days-course.png and b/readme_resources/100days-course.png differ 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 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..60a94587 --- /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 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 +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..9aecc560 --- /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 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 mock an object. +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.mock, import patch. +01:10 I actually need to import to random module +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. +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 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 +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..5b446aa5 --- /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 via a script +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.