Cover image for iOS 5 Programming Cookbook

Book description

Now you can overcome the vexing, real-life issues you confront when creating apps for the iPhone, iPad, or iPod Touch. By making use of more than 100 new recipes in this updated cookbook, you’ll quickly learn the steps necessary for writing complete iOS apps, whether they’re as simple as a music player or feature a complex mix of animations, graphics, multimedia, a database, and iCloud storage. If you’re comfortable with iOS SDK, this cookbook will teach you how to use hundreds of iOS techniques. Each recipe provides a clear solution with sample code that you can use right away.

Table of Contents

  1. iOS 5 Programming Cookbook
    1. SPECIAL OFFER: Upgrade this ebook with O’Reilly
    2. A Note Regarding Supplemental Files
    3. Preface
      1. Audience
      2. Organization of This Book
      3. Additional Resources
      4. Conventions Used in This Book
      5. Using Code Examples
      6. We’d Like to Hear from You
      7. Safari® Books Online
      8. Acknowledgments
    4. 1. The Basics
      1. 1.0. Introduction
      2. 1.1. Creating a Simple iOS App in Xcode
        1. Problem
        2. Solution
        3. Discussion
      3. 1.2. Understanding Interface Builder
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      4. 1.3. Compiling iOS Apps
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 1.4. Running iOS Apps on the Simulator
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      6. 1.5. Running iOS Apps on iOS Devices
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      7. 1.6. Packaging iOS Apps for Distribution
        1. Problem
        2. Solution
        3. Discussion
      8. 1.7. Declaring Variables in Objective-C
        1. Problem
        2. Solution
        3. Discussion
      9. 1.8. Allocating and Making Use of Strings
        1. Problem
        2. Solution
        3. Discussion
      10. 1.9. Comparing Values in Objective-C with an If Statement
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      11. 1.10. Implementing Loops with For Statements
        1. Problem
        2. Solution
        3. Discussion
      12. 1.11. Implementing While Loops
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      13. 1.12. Creating Custom Classes
        1. Problem
        2. Solution
        3. Discussion
      14. 1.13. Defining Functionality for Classes
        1. Problem
        2. Solution
        3. Discussion
      15. 1.14. Defining Two or More Methods with the Same Name
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      16. 1.15. Allocating and Initializing Objects
        1. Problem
        2. Solution
        3. Discussion
      17. 1.16. Adding Properties to Classes
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      18. 1.17. Moving From Manual Reference Counting to Automatic Reference Counting
        1. Problem
        2. Solution
        3. Discussion
      19. 1.18. Typecasting with Automatic Reference Counting
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      20. 1.19. Delegating Tasks with Protocols
        1. Problem
        2. Solution
        3. Discussion
      21. 1.20. Determining Whether Instance or Class Methods Are Available
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      22. 1.21. Determining Whether a Class Is Available at Runtime
        1. Problem
        2. Solution
        3. Discussion
      23. 1.22. Allocating and Making Use of Numbers
        1. Problem
        2. Solution
        3. Discussion
      24. 1.23. Allocating and Making Use of Arrays
        1. Problem
        2. Solution
        3. Discussion
      25. 1.24. Allocating and Making Use of Dictionaries
        1. Problem
        2. Solution
        3. Discussion
      26. 1.25. Allocating and Making Use of Sets
        1. Problem
        2. Solution
        3. Discussion
      27. 1.26. Creating Bundles
        1. Problem
        2. Solution
        3. Discussion
      28. 1.27. Loading Data From the Main Bundle
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      29. 1.28. Loading Data From Other Bundles
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      30. 1.29. Sending Notifications with NSNotificationCenter
        1. Problem
        2. Solution
        3. Discussion
      31. 1.30. Listening for Notifications Sent From NSNotificationCenter
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
    5. 2. Implementing Controllers and Views
      1. 2.0. Introduction
      2. 2.1. Displaying Alerts with UIAlertView
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      3. 2.2. Creating and Using Switches with UISwitch
        1. Problem
        2. Solution
        3. Discussion
      4. 2.3. Picking Values with UIPickerView
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 2.4. Picking the Date and Time with UIDatePicker
        1. Problem
        2. Solution
        3. Discussion
      6. 2.5. Implementing Range Pickers with UISlider
        1. Problem
        2. Solution
        3. Discussion
      7. 2.6. Grouping Compact Options with UISegmentedControl
        1. Problem
        2. Solution
        3. Discussion
      8. 2.7. Presenting and Managing Views with UIViewController
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      9. 2.8. Implementing Navigation with UINavigationController
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      10. 2.9. Manipulating a Navigation Controller’s Array of View Controllers
        1. Problem
        2. Solution
        3. Discussion
      11. 2.10. Displaying an Image on a Navigation Bar
        1. Problem
        2. Solution
        3. Discussion
      12. 2.11. Adding Buttons to Navigation Bars Using UIBarButtonItem
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      13. 2.12. Presenting Multiple View Controllers with UITabBarController
        1. Problem
        2. Solution
        3. Discussion
      14. 2.13. Displaying Static Text with UILabel
        1. Problem
        2. Solution
        3. Discussion
      15. 2.14. Accepting User Text Input with UITextField
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      16. 2.15. Displaying Long Lines of Text with UITextView
        1. Problem
        2. Solution
        3. Discussion
      17. 2.16. Adding Buttons to the User Interface with UIButton
        1. Problem
        2. Solution
        3. Discussion
      18. 2.17. Displaying Images with UIImageView
        1. Problem
        2. Solution
        3. Discussion
      19. 2.18. Creating Scrollable Content with UIScrollView
        1. Problem
        2. Solution
        3. Discussion
      20. 2.19. Loading Web Pages with UIWebView
        1. Problem
        2. Solution
        3. Discussion
      21. 2.20. Presenting Master-Detail Views with UISplitViewController
        1. Problem
        2. Solution
        3. Discussion
      22. 2.21. Enabling Paging with UIPageViewController
        1. Problem
        2. Solution
        3. Discussion
      23. 2.22. Displaying Popovers with UIPopoverController
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      24. 2.23. Displaying Progress with UIProgressView
        1. Problem
        2. Solution
        3. Discussion
      25. 2.24. Listening and Reacting to Keyboard Notifications
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
    6. 3. Constructing and Using Table Views
      1. 3.0. Introduction
      2. 3.1. Instantiating a Table View
        1. Problem
        2. Solution
        3. Discussion
      3. 3.2. Assigning a Delegate to a Table View
        1. Problem
        2. Solution
        3. Discussion
      4. 3.3. Populating a Table View with Data
        1. Problem
        2. Solution
        3. Discussion
      5. 3.4. Receiving and Handling Table View Events
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      6. 3.5. Using Different Types of Accessories in a Table View Cell
        1. Problem
        2. Solution
        3. Discussion
      7. 3.6. Creating Custom Table View Cell Accessories
        1. Problem
        2. Solution
        3. Discussion
      8. 3.7. Displaying Hierarchical Data in Table Views
        1. Problem
        2. Solution
        3. Discussion
      9. 3.8. Enabling Swipe Deletion of Table View Cells
        1. Problem
        2. Solution
        3. Discussion
      10. 3.9. Constructing Headers and Footers in Table Views
        1. Problem
        2. Solution
        3. Discussion
      11. 3.10. Displaying Context Menus on Table Views Cells
        1. Problem
        2. Solution
        3. Discussion
      12. 3.11. Moving Cells and Sections in Table Views
        1. Problem
        2. Solution
        3. Discussion
      13. 3.12. Deleting Cells and Sections From Table Views
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
    7. 4. Storyboards
      1. 4.0. Introduction
      2. 4.1. Creating a Project with Storyboards
        1. Problem
        2. Solution
        3. Discussion
      3. 4.2. Adding a Navigation Controller to a Storyboard
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      4. 4.3. Passing Data From One Screen to Another
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 4.4. Adding a Storyboard to an Existing Project
        1. Problem
        2. Solution
        3. Discussion
    8. 5. Concurrency
      1. 5.0. Introduction
      2. 5.1. Constructing Block Objects
        1. Problem
        2. Solution
        3. Discussion
      3. 5.2. Accessing Variables in Block Objects
        1. Problem
        2. Solution
        3. Discussion
      4. 5.3. Invoking Block Objects
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 5.4. Dispatching Tasks to Grand Central Dispatch
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      6. 5.5. Performing UI-Related Tasks with GCD
        1. Problem
        2. Solution
        3. Discussion
      7. 5.6. Performing Non-UI Related Tasks Synchronously with GCD
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      8. 5.7. Performing Non-UI Related Tasks Asynchronously with GCD
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      9. 5.8. Performing Tasks After a Delay with GCD
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      10. 5.9. Performing a Task Only Once with GCD
        1. Problem
        2. Solution
        3. Discussion
      11. 5.10. Grouping Tasks Together with GCD
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      12. 5.11. Constructing Your Own Dispatch Queues with GCD
        1. Problem
        2. Solution
        3. Discussion
      13. 5.12. Running Tasks Synchronously with Operations
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      14. 5.13. Running Tasks Asynchronously with Operations
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      15. 5.14. Creating Dependency Between Operations
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      16. 5.15. Creating Timers
        1. Problem
        2. Solution
        3. Discussion
      17. 5.16. Creating Concurrency with Threads
        1. Problem
        2. Solution
        3. Discussion
      18. 5.17. Invoking Background Methods
        1. Problem
        2. Solution
        3. Discussion
      19. 5.18. Exiting Threads and Timers
        1. Problem
        2. Solution
        3. Discussion
    9. 6. Core Location and Maps
      1. 6.0. Introduction
      2. 6.1. Creating a Map View
        1. Problem
        2. Solution
        3. Discussion
      3. 6.2. Handling the Events of a Map View
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      4. 6.3. Pinpointing the Location of a Device
        1. Problem
        2. Solution
        3. Discussion
      5. 6.4. Displaying Pins on a Map View
        1. Problem
        2. Solution
        3. Discussion
      6. 6.5. Displaying Pins with Different Colors on a Map View
        1. Problem
        2. Solution
        3. Discussion
      7. 6.6. Displaying Custom Pins on a Map View
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      8. 6.7. Converting Meaningful Addresses to Longitude and Latitude
        1. Problem
        2. Solution
        3. Discussion
      9. 6.8. Converting Longitude and Latitude to a Meaningful Address
        1. Problem
        2. Solution
        3. Discussion
    10. 7. Implementing Gesture Recognizers
      1. 7.0. Introduction
      2. 7.1. Detecting Swipe Gestures
        1. Problem
        2. Solution
        3. Discussion
      3. 7.2. Detecting Rotation Gestures
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      4. 7.3. Detecting Panning and Dragging Gestures
        1. Problem
        2. Solution
        3. Discussion
      5. 7.4. Detecting Long Press Gestures
        1. Problem
        2. Solution
        3. Discussion
      6. 7.5. Detecting Tap Gestures
        1. Problem
        2. Solution
        3. Discussion
      7. 7.6. Detecting Pinch Gestures
        1. Problem
        2. Solution
        3. Discussion
    11. 8. Networking, JSON, XML, and Twitter
      1. 8.0. Introduction
      2. 8.1. Downloading Asynchronously with NSURLConnection
        1. Problem
        2. Solution
        3. Discussion
      3. 8.2. Handling Timeouts in Asynchronous Connections
        1. Problem
        2. Solution
        3. Discussion
      4. 8.3. Downloading Synchronously with NSURLConnection
        1. Problem
        2. Solution
        3. Discussion
      5. 8.4. Modifying a URL Request with NSMutableURLRequest
        1. Problem
        2. Solution
        3. Discussion
      6. 8.5. Sending HTTP GET Requests with NSURLConnection
        1. Problem
        2. Solution
        3. Discussion
      7. 8.6. Sending HTTP POST Requests with NSURLConnection
        1. Problem
        2. Solution
        3. Discussion
      8. 8.7. Sending HTTP DELETE Requests with NSURLConnection
        1. Problem
        2. Solution
        3. Discussion
      9. 8.8. Sending HTTP PUT Requests with NSURLConnection
        1. Problem
        2. Solution
        3. Discussion
      10. 8.9. Serializing Arrays and Dictionaries into JSON
        1. Problem
        2. Solution
        3. Discussion
      11. 8.10. Deserializing JSON into Arrays and Dictionaries
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      12. 8.11. Integrating Twitter Functionality into Your Apps
        1. Problem
        2. Solution
        3. Discussion
      13. 8.12. Parsing XML with NSXMLParser
        1. Problem
        2. Solution
        3. Discussion
    12. 9. Audio and Video
      1. 9.0. Introduction
      2. 9.1. Playing Audio Files
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      3. 9.2. Handling Interruptions While Playing Audio
        1. Problem
        2. Solution
        3. Discussion
      4. 9.3. Recording Audio
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 9.4. Handling Interruptions While Recording Audio
        1. Problem
        2. Solution
        3. Discussion
      6. 9.5. Playing Audio Over Other Active Sounds
        1. Problem
        2. Solution
        3. Discussion
      7. 9.6. Playing Video Files
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      8. 9.7. Capturing Thumbnails From a Video File
        1. Problem
        2. Solution
        3. Discussion
      9. 9.8. Accessing the Music Library
        1. Problem
        2. Solution
        3. Discussion
    13. 10. Address Book
      1. 10.0. Introduction
      2. 10.1. Retrieving a Reference to an Address Book
        1. Problem
        2. Solution
        3. Discussion
      3. 10.2. Retrieving All the People in the Address Book
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      4. 10.3. Retrieving Properties of Address Book Entries
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 10.4. Inserting a Person Entry into the Address Book
        1. Problem
        2. Solution
        3. Discussion
      6. 10.5. Inserting a Group Entry into the Address Book
        1. Problem
        2. Solution
        3. Discussion
      7. 10.6. Adding Persons to Groups
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      8. 10.7. Searching the Address Book
        1. Problem
        2. Solution
        3. Discussion
      9. 10.8. Retrieving and Setting a Person’s Address Book Image
        1. Problem
        2. Solution
        3. Discussion
    14. 11. Camera and the Photo Library
      1. 11.0. Introduction
      2. 11.1. Detecting and Probing the Camera
        1. Problem
        2. Solution
        3. Discussion
      3. 11.2. Taking Photos with the Camera
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      4. 11.3. Taking Videos with the Camera
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 11.4. Storing Photos in the Photo Library
        1. Problem
        2. Solution
        3. Discussion
      6. 11.5. Storing Videos in the Photo Library
        1. Problem
        2. Solution
        3. Discussion
      7. 11.6. Retrieving Photos and Videos From the Photo Library
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      8. 11.7. Retrieving Assets From the Assets Library
        1. Problem
        2. Solution
        3. Discussion
      9. 11.8. Editing Videos on an iOS Device
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
    15. 12. Multitasking
      1. 12.0. Introduction
      2. 12.1. Detecting the Availability of Multitasking
        1. Problem
        2. Solution
        3. Discussion
      3. 12.2. Completing a Long-Running Task in the Background
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      4. 12.3. Receiving Local Notifications in the Background
        1. Problem
        2. Solution
        3. Discussion
      5. 12.4. Playing Audio in the Background
        1. Problem
        2. Solution
        3. Discussion
      6. 12.5. Handling Location Changes in the Background
        1. Problem
        2. Solution
        3. Discussion
      7. 12.6. Saving and Loading the State of Multitasking iOS Apps
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      8. 12.7. Handling Network Connections in the Background
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      9. 12.8. Handling Notifications Delivered to a Waking App
        1. Problem
        2. Solution
        3. Discussion
      10. 12.9. Responding to Changes in App Settings
        1. Problem
        2. Solution
        3. Discussion
      11. 12.10. Opting Out of Multitasking
        1. Problem
        2. Solution
        3. Discussion
    16. 13. Core Data
      1. 13.0. Introduction
      2. 13.1. Creating a Core Data Model with Xcode
        1. Problem
        2. Solution
        3. Discussion
      3. 13.2. Generating Class Files for Core Data Entities
        1. Problem
        2. Solution
        3. Discussion
      4. 13.3. Creating and Saving Data Using Core Data
        1. Problem
        2. Solution
        3. Discussion
      5. 13.4. Reading Data From Core Data
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      6. 13.5. Deleting Data From Core Data
        1. Problem
        2. Solution
        3. Discussion
      7. 13.6. Sorting Data in Core Data
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      8. 13.7. Boosting Data Access in Table Views
        1. Problem
        2. Solution
        3. Discussion
      9. 13.8. Implementing Relationships in Core Data
        1. Problem
        2. Solution
        3. Discussion
    17. 14. Dates, Calendars, and Events
      1. 14.0. Introduction
      2. 14.1. Retrieving the List of Calendars
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      3. 14.2. Adding Events to Calendars
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      4. 14.3. Accessing the Contents of Calendars
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 14.4. Removing Events From Calendars
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      6. 14.5. Adding Recurring Events to Calendars
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      7. 14.6. Retrieving the Attendees of an Event
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      8. 14.7. Adding Alarms to Calendars
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      9. 14.8. Handling Event Changed Notifications
        1. Problem
        2. Solution
        3. Discussion
      10. 14.9. Presenting Event View Controllers
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      11. 14.10. Presenting Event Edit View Controllers
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
    18. 15. Graphics and Animations
      1. 15.0. Introduction
      2. 15.1. Enumerating and Loading Fonts
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      3. 15.2. Drawing Text
        1. Problem
        2. Solution
        3. Discussion
      4. 15.3. Constructing, Setting, and Using Colors
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 15.4. Drawing Images
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      6. 15.5. Drawing Lines
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      7. 15.6. Constructing Paths
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      8. 15.7. Drawing Rectangles
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      9. 15.8. Adding Shadows to Shapes
        1. Problem
        2. Solution
        3. Discussion
      10. 15.9. Drawing Gradients
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      11. 15.10. Displacing Shapes Drawn on Graphic Contexts
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      12. 15.11. Scaling Shapes Drawn on Graphic Contexts
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      13. 15.12. Rotating Shapes Drawn on Graphic Contexts
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      14. 15.13. Animating and Moving Views
        1. Problem
        2. Solution
        3. Discussion
      15. 15.14. Animating and Scaling Views
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      16. 15.15. Animating and Rotating Views
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
    19. 16. Core Motion
      1. 16.0. Introduction
      2. 16.1. Detecting the Availability of an Accelerometer
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      3. 16.2. Detecting the Availability of a Gyroscope
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      4. 16.3. Retrieving Accelerometer Data
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 16.4. Detecting Shakes on an iOS Device
        1. Problem
        2. Solution
        3. Discussion
      6. 16.5. Retrieving Gyroscope Data
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
    20. 17. iCloud
      1. 17.0. Introduction
      2. 17.1. Setting Up Your App for iCloud
        1. Problem
        2. Solution
        3. Discussion
      3. 17.2. Storing and Synchronizing Dictionaries in iCloud
        1. Problem
        2. Solution
        3. Discussion
      4. 17.3. Creating and Managing Folders for Apps in iCloud
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      5. 17.4. Searching for Files and Folders in iCloud
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      6. 17.5. Storing User Documents in iCloud
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      7. 17.6. Managing the State of Documents in iCloud
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
      8. 17.7. Handling Conflicts in iCloud Documents
        1. Problem
        2. Solution
        3. Discussion
        4. See Also
    21. Index
    22. About the Author
    23. Colophon
    24. SPECIAL OFFER: Upgrade this ebook with O’Reilly