You are previewing Head First Python.

Head First Python

Cover of Head First Python by Paul Barry Published by O'Reilly Media, Inc.
  1. Head First Python
  2. Dedication
  3. SPECIAL OFFER: Upgrade this ebook with O’Reilly
  4. A Note Regarding Supplemental Files
  5. Advance Praise for Head First Python
  6. Praise for other Head First books
  7. Author of Head First Python
  8. How to use This Book: Intro
    1. Who is this book for?
      1. Who should probably back away from this book?
    2. We know what you’re thinking
    3. We know what your brain is thinking
    4. Metacognition: thinking about thinking
    5. Here’s what WE did
    6. Here’s what YOU can do to bend your brain into submission
    7. Read Me
    8. The technical review team
    9. Acknowledgments
    10. Safari® Books Online
  9. 1. Meet Python: Everyone loves lists
    1. What’s to like about Python?
    2. Install Python 3
    3. Use IDLE to help learn Python
    4. Work effectively with IDLE
      1. TAB completion
      2. Recall code statements
      3. Edit recalled code
      4. Adjust IDLE’s preferences
    5. Deal with complex data
    6. Create simple Python lists
    7. Lists are like arrays
      1. Access list data using the square bracket notation
    8. Add more data to your list
    9. Work with your list data
      1. It’s time to iterate
    10. For loops work with lists of any size
    11. Store lists within lists
    12. Check a list for a list
    13. Complex data is hard to process
    14. Handle many levels of nested lists
    15. Don’t repeat code; create a function
    16. Create a function in Python
      1. What does your function need to do?
    17. Recursion to the rescue!
      1. What a great start!
    18. Your Python Toolbox
  10. 2. Sharing your Code: Modules of functions
    1. It’s too good not to share
    2. Turn your function into a module
    3. Modules are everywhere
    4. Comment your code
    5. Prepare your distribution
    6. Build your distribution
    7. A quick review of your distribution
    8. Import a module to use it
    9. Python’s modules implement namespaces
    10. Register with the PyPI website
    11. Upload your code to PyPI
    12. Welcome to the PyPI community
    13. With success comes responsibility
      1. Requests for change are inevitable
    14. Life’s full of choices
    15. Control behavior with an extra argument
      1. Take your function to the next level
    16. Before your write new code, think BIF
      1. The range() BIF iterates a fixed number of times
    17. Python tries its best to run your code
    18. Trace your code
    19. Work out what’s wrong
    20. Update PyPI with your new code
    21. You’ve changed your API
    22. Use optional arguments
    23. Your module supports both APIs
    24. Your API is still not right
    25. Your module’s reputation is restored
      1. Your Python skills are starting to build
    26. Your Python Toolbox
  11. 3. Files and Exceptions: Dealing with errors
    1. Data is external to your program
    2. It’s all lines of text
    3. Take a closer look at the data
    4. Know your data
    5. Know your methods and ask for help
    6. Know your data (better)
      1. The case of the missing colon
    7. Two very different approaches
    8. Add extra logic
    9. Handle exceptions
    10. Try first, then recover
      1. The try/except mechanism
    11. Identify the code to protect
    12. Take a pass on the error
    13. What about other errors?
      1. Handling missing files
    14. Add more error-checking code...
    15. ...Or add another level of exception handling
    16. So, which approach is best?
      1. Complexity is rarely a good thing
    17. You’re done...except for one small thing
    18. Be specific with your exceptions
    19. Your Python Toolbox
  12. 4. Persistence: Saving data to files
    1. Programs produce data
    2. Open your file in write mode
    3. Files are left open after an exception!
    4. Extend try with finally
    5. Knowing the type of error is not enough
    6. Use with to work with files
    7. Default formats are unsuitable for files
    8. Why not modify print_lol()?
    9. Pickle your data
    10. Save with dump and restore with load
      1. What if something goes wrong?
    11. Generic file I/O with pickle is the way to go!
    12. Your Python Toolbox
  13. 5. Comprehending data: Work that data!
    1. Coach Kelly needs your help
    2. Sort in one of two ways
    3. The trouble with time
    4. Comprehending lists
      1. The beauty of list comprehensions
    5. Iterate to remove duplicates
    6. Remove duplicates with sets
    7. Your Python Toolbox
  14. 6. Custom data Objects: Bundling code with data
    1. Coach Kelly is back (with a new file format)
    2. Use a dictionary to associate data
    3. Bundle your code and its data in a class
    4. Define a class
    5. Use class to define classes
      1. Creating object instances
    6. The importance of self
    7. Every method’s first argument is self
    8. Inherit from Python’s built-in list
    9. Coach Kelly is impressed
    10. Your Python Toolbox
  15. 7. Web Development: Putting it all together
    1. It’s good to share
      1. You’re a victim of your own success
    2. You can put your program on the Web
      1. A “webapp” is what you want
    3. What does your webapp need to do?
    4. Design your webapp with MVC
    5. Model your data
    6. View your interface
      1. YATE: Yet Another Template Engine
    7. Control your code
    8. CGI lets your web server run programs
    9. Display the list of athletes
    10. The dreaded 404 error!
    11. Create another CGI script
      1. But how do you know which athlete is selected?
    12. Enable CGI tracking to help with errors
    13. A small change can make all the difference
      1. It’s a small change, but it’s an important one
    14. Your webapp’s a hit!
    15. Your Python Toolbox
  16. 8. Mobile app Development: Small devices
    1. The world is getting smaller
      1. There’s more than just desktop computers out there
    2. Coach Kelly is on Android
      1. Run Python on the coach’s smartphone
    3. Don’t worry about Python 2
    4. Set up your development environment
      1. Download the Software Development Kit (SDK)
    5. Configure the SDK and emulator
      1. Add an Android platform
      2. Create a new Android Virtual Device (AVD)
    6. Install and configure Android Scripting
    7. Add Python to your SL4A installation
    8. Test Python on Android
      1. Take your Android emulator for a spin
    9. Define your app’s requirements
    10. The SL4A Android API
    11. Select from a list on Android
    12. The athlete’s data CGI script
      1. The complete Android app, so far
    13. The data appears to have changed type
    14. JSON can’t handle your custom datatypes
    15. Run your app on a real phone
      1. Step 1: Prepare your computer
      2. Step 2: Install AndFTP on your Android phone
    16. Configure AndFTP
    17. The coach is thrilled with his app
      1. Welcome to the future!
    18. Your Python Toolbox
  17. 9. Manage Your data: Handling input
    1. Your athlete times app has gone national
    2. Use a form or dialog to accept input
    3. Create an HTML form template
    4. The data is delivered to your CGI script
    5. Ask for input on your Android phone
    6. It’s time to update your server data
    7. Avoid race conditions
    8. You need a better data storage mechanism
    9. Use a database management system
    10. Python includes SQLite
    11. Exploit Python’s database API
    12. The database API as Python code
    13. A little database design goes a long way
    14. Define your database schema
    15. What does the data look like?
    16. Transfer the data from your pickle to SQLite
    17. What ID is assigned to which athlete?
    18. Insert your timing data
    19. SQLite data management tools
    20. Integrate SQLite with your existing webapp
    21. You still need the list of names
    22. Get an athlete’s details based on ID
    23. You need to amend your Android app, too
    24. Update your SQLite-based athlete data
    25. The NUAC is over the moon!
    26. Your Python Toolbox
  18. 10. Scaling your Webapp: Getting real
    1. There are whale sightings everywhere
    2. The HFWWG needs to automate
    3. Build your webapp with Google App Engine
    4. Download and install App Engine
      1. GAE uses Python 2.5
    5. Make sure App Engine is working
    6. App Engine uses the MVC pattern
    7. Model your data with App Engine
    8. What good is a model without a view?
      1. App Engine templates in an instant
    9. Use templates in App Engine
    10. Django’s form validation framework
    11. Check your form
    12. Controlling your App Engine webapp
      1. Improve the look of your form
    13. Restrict input by providing options
    14. Meet the “blank screen of death”
    15. Process the POST within your webapp
      1. App Engine handles requests as well as responses
    16. Put your data in the datastore
    17. Don’t break the “robustness principle”
    18. Accept almost any date and time
      1. There is a third option
      2. Use “db.StringProperty()” for dates and times
    19. It looks like you’re not quite done yet
    20. Sometimes, the tiniest change can make all the difference...
    21. Capture your user’s Google ID, too
    22. Deploy your webapp to Google’s cloud
    23. Your HFWWG webapp is deployed!
    24. Your Python Toolbox
  19. 11. Dealing with Complexity: Data wrangling
    1. What’s a good time goal for the next race?
    2. So... what’s the problem?
    3. Start with the data
      1. Take another look at the data
    4. Store each time as a dictionary
    5. Dissect the prediction code
    6. Get input from your user
      1. Use input() for input
    7. Getting input raises an issue...
    8. If it’s not in the dictionary, it can’t be found
    9. Search for the closest match
    10. The trouble is with time
    11. The time-to-seconds-to-time module
    12. The trouble is still with time...
    13. Port to Android
    14. Your Android app is a bunch of dialogs
      1. Get your Android app code ready
    15. Put your app together...
    16. Your app’s a wrap!
      1. And there’s no stopping you!
    17. Your Python Toolbox
    18. It’s time to go...
      1. This is just the beginning
  20. A. Leftovers: The Top Ten Things (we didn’t cover)
    1. #1: Using a “professional” IDE
    2. #2: Coping with scoping
    3. #3: Testing
    4. #4: Advanced language features
    5. #5: Regular expressions
    6. #6: More on web frameworks
    7. #7: Object relational mappers and NoSQL
      1. There’s NoSQL, too
    8. #8: Programming GUIs
    9. #9: Stuff to avoid
    10. #10: Other books
  21. Index
  22. About the Author
  23. SPECIAL OFFER: Upgrade this ebook with O’Reilly
  24. Copyright

How to use This Book: Intro

image with no caption

In this section, we answer the burning question: “So why DID they put that in a Python book?”

Who is this book for?

If you can answer “yes” to all of these:

  1. Do you already know how to program in another programming language?

  2. Do you wish you had the know-how to program Python, add it to your list of tools, and make it do new things?

  3. Do you prefer actually doing things and applying the stuff you learn over listening to someone in a lecture rattle on for hours on end?

this book is for you.

Who should probably back away from this book?

If you can answer “yes” to any of these:

  1. Do you already know most of what you need to know to program with Python?

  2. Are you looking for a reference book to Python, one that covers all the details in excruciating detail?

  3. Would you rather have your toenails pulled out by 15 screaming monkeys than learn something new? Do you believe a Python book should cover everything and if it bores the reader to tears in the process then so much the better?

this book is not for you.

image with no caption

We know what you’re thinking

“How can this be a serious Python book?”

“What’s with all the graphics?”

“Can I actually learn it this way?”

We know what your brain is thinking

Your brain craves novelty. It’s always searching, scanning, waiting for something unusual. It was built that way, and it helps you stay alive.

So what does your brain do with all the routine, ordinary, normal things you encounter? Everything it can to stop them from interfering with the brain’s real job—recording things that matter. It doesn’t bother saving the boring things; they never make it past the “this is obviously not important” filter.

How does your brain know what’s important? Suppose you’re out for a day hike and a tiger jumps in front of you, what happens inside your head and body?

Neurons fire. Emotions crank up. Chemicals surge.

And that’s how your brain knows...

image with no caption

This must be important! Don’t forget it!

But imagine you’re at home, or in a library. It’s a safe, warm, tiger-free zone. You’re studying. Getting ready for an exam. Or trying to learn some tough technical topic your boss thinks will take a week, ten days at the most.

Just one problem. Your brain’s trying to do you a big favor. It’s trying to make sure that this obviously non-important content doesn’t clutter up scarce resources. Resources that are better spent storing the really big things. Like tigers. Like the danger of fire. Like how you should never have posted those “party” photos on your Facebook page. And there’s no simple way to tell your brain, “Hey brain, thank you very much, but no matter how dull this book is, and how little I’m registering on the emotional Richter scale right now, I really do want you to keep this stuff around.”

image with no caption

Metacognition: thinking about thinking

If you really want to learn, and you want to learn more quickly and more deeply, pay attention to how you pay attention. Think about how you think. Learn how you learn.

Most of us did not take courses on metacognition or learning theory when we were growing up. We were expected to learn, but rarely taught to learn.

But we assume that if you’re holding this book, you really want to learn how to design user-friendly websites. And you probably don’t want to spend a lot of time. If you want to use what you read in this book, you need to remember what you read. And for that, you’ve got to understand it. To get the most from this book, or any book or learning experience, take responsibility for your brain. Your brain on this content.

The trick is to get your brain to see the new material you’re learning as Really Important. Crucial to your well-being. As important as a tiger. Otherwise, you’re in for a constant battle, with your brain doing its best to keep the new content from sticking.

image with no caption

So just how DO you get your brain to treat programming like it was a hungry tiger?

There’s the slow, tedious way, or the faster, more effective way. The slow way is about sheer repetition. You obviously know that you are able to learn and remember even the dullest of topics if you keep pounding the same thing into your brain. With enough repetition, your brain says, “This doesn’t feel important to him, but he keeps looking at the same thing over and over and over, so I suppose it must be.”

The faster way is to do anything that increases brain activity, especially different types of brain activity. The things on the previous page are a big part of the solution, and they’re all things that have been proven to help your brain work in your favor. For example, studies show that putting words within the pictures they describe (as opposed to somewhere else in the page, like a caption or in the body text) causes your brain to try to makes sense of how the words and picture relate, and this causes more neurons to fire. More neurons firing = more chances for your brain to get that this is something worth paying attention to, and possibly recording.

A conversational style helps because people tend to pay more attention when they perceive that they’re in a conversation, since they’re expected to follow along and hold up their end. The amazing thing is, your brain doesn’t necessarily care that the “conversation” is between you and a book! On the other hand, if the writing style is formal and dry, your brain perceives it the same way you experience being lectured to while sitting in a roomful of passive attendees. No need to stay awake.

But pictures and conversational style are just the beginning...

Here’s what WE did

We used pictures, because your brain is tuned for visuals, not text. As far as your brain’s concerned, a picture really is worth a thousand words. And when text and pictures work together, we embedded the text in the pictures because your brain works more effectively when the text is within the thing the text refers to, as opposed to in a caption or buried in the text somewhere.

We used redundancy, saying the same thing in different ways and with different media types, and multiple senses, to increase the chance that the content gets coded into more than one area of your brain.

We used concepts and pictures in unexpected ways because your brain is tuned for novelty, and we used pictures and ideas with at least some emotional content, because your brain is tuned to pay attention to the biochemistry of emotions. That which causes you to feel something is more likely to be remembered, even if that feeling is nothing more than a little humor, surprise, or interest.

We used a personalized, conversational style, because your brain is tuned to pay more attention when it believes you’re in a conversation than if it thinks you’re passively listening to a presentation. Your brain does this even when you’re reading.

We included more than 80 activities, because your brain is tuned to learn and remember more when you do things than when you read about things. And we made the exercises challenging-yet-do-able, because that’s what most people prefer.

We used multiple learning styles, because you might prefer step-by-step procedures, while someone else wants to understand the big picture first, and someone else just wants to see an example. But regardless of your own learning preference, everyone benefits from seeing the same content represented in multiple ways.

We include content for both sides of your brain, because the more of your brain you engage, the more likely you are to learn and remember, and the longer you can stay focused. Since working one side of the brain often means giving the other side a chance to rest, you can be more productive at learning for a longer period of time.

And we included stories and exercises that present more than one point of view, because your brain is tuned to learn more deeply when it’s forced to make evaluations and judgments.

We included challenges, with exercises, and by asking questions that don’t always have a straight answer, because your brain is tuned to learn and remember when it has to work at something. Think about it—you can’t get your body in shape just by watching people at the gym. But we did our best to make sure that when you’re working hard, it’s on the right things. That you’re not spending one extra dendrite processing a hard-to-understand example, or parsing difficult, jargon-laden, or overly terse text.

We used people. In stories, examples, pictures, etc., because, well, because you’re a person. And your brain pays more attention to people than it does to things.

Here’s what YOU can do to bend your brain into submission

So, we did our part. The rest is up to you. These tips are a starting point; listen to your brain and figure out what works for you and what doesn’t. Try new things.

image with no caption

Cut this out and stick it on your refrigerator.

  1. Slow down. The more you understand, the less you have to memorize.

    Don’t just read. Stop and think. When the book asks you a question, don’t just skip to the answer. Imagine that someone really is asking the question. The more deeply you force your brain to think, the better chance you have of learning and remembering.

  2. Do the exercises. Write your own notes.

    We put them in, but if we did them for you, that would be like having someone else do your workouts for you. And don’t just look at the exercises. Use a pencil. There’s plenty of evidence that physical activity while learning can increase the learning.

  3. Read the “There are No Dumb Questions.”

    That means all of them. They’re not optional sidebars, they’re part of the core content! Don’t skip them.

  4. Make this the last thing you read before bed. Or at least the last challenging thing.

    Part of the learning (especially the transfer to long-term memory) happens after you put the book down. Your brain needs time on its own, to do more processing. If you put in something new during that processing time, some of what you just learned will be lost.

  5. Talk about it. Out loud.

    Speaking activates a different part of the brain. If you’re trying to understand something, or increase your chance of remembering it later, say it out loud. Better still, try to explain it out loud to someone else. You’ll learn more quickly, and you might uncover ideas you hadn’t known were there when you were reading about it.

  6. Drink water. Lots of it.

    Your brain works best in a nice bath of fluid. Dehydration (which can happen before you ever feel thirsty) decreases cognitive function.

  7. Listen to your brain.

    Pay attention to whether your brain is getting overloaded. If you find yourself starting to skim the surface or forget what you just read, it’s time for a break. Once you go past a certain point, you won’t learn faster by trying to shove more in, and you might even hurt the process.

  8. Feel something.

    Your brain needs to know that this matters. Get involved with the stories. Make up your own captions for the photos. Groaning over a bad joke is still better than feeling nothing at all.

  9. Write a lot of code!

    There’s only one way to learn to program: writing a lot of code. And that’s what you’re going to do throughout this book. Coding is a skill, and the only way to get good at it is to practice. We’re going to give you a lot of practice: every chapter has exercises that pose a problem for you to solve. Don’t just skip over them—a lot of the learning happens when you solve the exercises. We included a solution to each exercise—don’t be afraid to peek at the solution if you get stuck! (It’s easy to get snagged on something small.) But try to solve the problem before you look at the solution. And definitely get it working before you move on to the next part of the book.

Read Me

This is a learning experience, not a reference book. We deliberately stripped out everything that might get in the way of learning whatever it is we’re working on at that point in the book. And the first time through, you need to begin at the beginning, because the book makes assumptions about what you’ve already seen and learned.

This book is designed to get you up to speed with Python as quickly as possible.

As you need to know stuff, we teach it. So you won’t find long lists of technical material, no tables of Python’s operators, not its operator precedence rules. We don’t cover everything, but we’ve worked really hard to cover the essential material as well as we can, so that you can get Python into your brain quickly and have it stay there. The only assumption we make is that you already know how to program in some other programming language.

This book targets Python 3

We use Release 3 of the Python programming language in this book, and we cover how to get and install Python 3 in the first chapter. That said, we don’t completely ignore Release 2, as you’ll discover in Chapter 8 through Chapter 11. But trust us, by then you’ll be so happy using Python, you won’t notice that the technologies you’re programming are running Python 2.

We put Python to work for you right away.

We get you doing useful stuff in Chapter 1 and build from there. There’s no hanging around, because we want you to be productive with Python right away.

The activities are NOT optional.

The exercises and activities are not add-ons; they’re part of the core content of the book. Some of them are to help with memory, some are for understanding, and some will help you apply what you’ve learned. Don’t skip the exercises.

The redundancy is intentional and important.

One distinct difference in a Head First book is that we want you to really get it. And we want you to finish the book remembering what you’ve learned. Most reference books don’t have retention and recall as a goal, but this book is about learning, so you’ll see some of the same concepts come up more than once.

The examples are as lean as possible.

Our readers tell us that it’s frustrating to wade through 200 lines of an example looking for the two lines they need to understand. Most examples in this book are shown within the smallest possible context, so that the part you’re trying to learn is clear and simple. Don’t expect all of the examples to be robust, or even complete—they are written specifically for learning, and aren’t always fully functional.

We’ve placed a lot of the code examples on the Web so you can copy and paste them as needed. You’ll find them at two locations:

The Brain Power exercises don’t have answers.

For some of them, there is no right answer, and for others, part of the learning experience of the Brain Power activities is for you to decide if and when your answers are right. In some of the Brain Power exercises, you will find hints to point you in the right direction.

The technical review team

image with no caption

David Griffiths

image with no caption

Phil Hartley

image with no caption

Jeremy Jones

Technical Reviewers:

David Griffiths is the author of Head First Rails and the coauthor of Head First Programming. He began programming at age 12, when he saw a documentary on the work of Seymour Papert. At age 15, he wrote an implementation of Papert’s computer language LOGO. After studying Pure Mathematics at University, he began writing code for computers and magazine articles for humans. He’s worked as an agile coach, a developer, and a garage attendant, but not in that order. He can write code in over 10 languages and prose in just one, and when not writing, coding, or coaching, he spends much of his spare time traveling with his lovely wife—and fellow Head First author—Dawn.

Phil Hartley has a degree in Computer Science from Edinburgh, Scotland. Having spent more than 30 years in the IT industry with specific expertise in OOP, he is now teaching full time at the University of Advancing Technology in Tempe, AZ. In his spare time, Phil is a raving NFL fanatic

Jeremy Jones is coauthor of Python for Unix and Linux System Administration. He has been actively using Python since 2001. He has been a developer, system administrator, quality assurance engineer, and tech support analyst. They all have their rewards and challenges, but his most challenging and rewarding job has been husband and father.


My editor:

Brian Sawyer was Head First Python’s editor. When not editing books, Brian likes to run marathons in his spare time. This turns out to be the perfect training for working on another book with me (our second together). O’Reilly and Head First are lucky to have someone of Brian’s caliber working to make this and other books the best they can be.

image with no caption

The O’Reilly team:

Karen Shaner provided administrative support and very capably coordinated the techical review process, responding quickly to my many queries and requests for help. There’s also the back-room gang to thank—the O’Reilly Production Team—who guided this book through its final stages and turned my InDesign files into the beautiful thing you’re holding in your hands right now (or maybe you’re on an iPad, Android tablet, or reading on your PC—that’s cool, too).

And thanks to the other Head First authors who, via Twitter, offered cheers, suggestions, and encouragement throughout the entire writing process. You might not think 140 characters make a big difference, but they really do.

I am also grateful to Bert Bates who, together with Kathy Sierra, created this series of books with their wonderful Head First Java. At the start of this book, Bert took the time to set the tone with a marathon 90-minute phone call, which stretched my thinking on what I wanted to do to the limit and pushed me to write a better book. Now, some nine months after the phone call, I’m pretty sure I’ve recovered from the mind-bending Bert put me through.

Friends and colleagues:

My thanks again to Nigel Whyte, Head of Department, Computing and Networking at The Institute of Technology, Carlow, for supporting my involvement in yet another book (especially so soon after the last one).

My students (those enrolled on 3rd Year Games Development and 4th Year Software Engineering) have been exposed to this material in various forms over the last 18 months. Their positive reaction to Python and the approach I take with my classes helped inform the structure and eventual content of this book. (And yes, folks, some of this is on your final).


My family, Deirdre, Joseph, Aaron, and Aideen had to, once more, bear the grunts and groans, huffs and puffs, and more than a few roars on more than one occasion (although, to be honest, not as often they did with Head First Programming). After the last book, I promised I wouldn’t start another one “for a while.” It turned out “a while” was no more than a few weeks, and I’ll be forever grateful that they didn’t gang up and throw me out of the house for breaking my promise. Without their support, and especially the ongoing love and support of my wife, Deirdre, this book would not have seen the light of day.

The without-whom list:

My technical review team did an excellent job of keeping me straight and making sure what I covered was spot on. They confirmed when my material was working, challenged me when it wasn’t and not only pointed out when stuff was wrong, but provided suggestions on how to fix it. This is especially true of David Griffiths, my co-conspirator on Head First Programming, whose technical review comments went above and beyond the call of duty. David’s name might not be on the cover of this book, but a lot of his ideas and suggestions grace its pages, and I was thrilled and will forever remain grateful that he approached his role as tech reviewer on Head First Python with such gusto.

Safari® Books Online

image with no caption

Safari Books Online is an on-demand digital library that lets you easily search over 7,500 technology and creative reference books and videos to find the answers you need quickly.

With a subscription, you can read any page and watch any video from our library online. Read books on your cell phone and mobile devices. Access new titles before they are available for print, and get exclusive access to manuscripts in development and post feedback for the authors. Copy and paste code samples, organize your favorites, download chapters, bookmark key sections, create notes, print out pages, and benefit from tons of other time-saving features.

O’Reilly Media has uploaded this book to the Safari Books Online service. To have full digital access to this book and others on similar topics from O’Reilly and other publishers, sign up for free at

The best content for your career. Discover unlimited learning on demand for around $1/day.