Table of Contents
Introduction
Hour 1: Developing for Google TV and the 10-Foot User Experience 1
Google TV UI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
TV as a Device . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . . . 3
Google TV Apps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
10-Foot User Experience . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Hour 2: Optimizing Web Pages for Google TV 15
Displaying Content on TV Screens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Playing Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Displaying Text and Color . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Navigating the Big Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Hour 3: Using Google’s Video Templates 31
Google Video Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Examining the Template Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Understanding the JavaScript for Template 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Using Templates to Show Your Own Videos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Retrieving Videos Using AJAX . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Q&A . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Hour 4: HTML5 and jQuery UI Library for Google TV 45
Video Properties and Controls . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Adding Video Controls. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
Adding Some Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Using the jQuery GTV UI Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Workshop . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Exercises . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Hour 5: Using the Google TV Closure UI Library 61
Using Closure for Google TV Web Apps . . . . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . 61
Using the Library to Create an HTML Page . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 63
Buttons, Lightboxes, and Other Components . . . . . . . . . . . . . . . . . . . . . . . . . . 66
Summary . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Exercises . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Hour 6: Creating a Video Sitemap 83
Searching on Google TV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Sitemaps and Google Webmaster Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Adding Details to Video Sitemaps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Tags That Provide Additional Info on Google TV . . . . . . . . . . . . . . . . . . . . . . 87
Summary . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Hour 7: Android and Google TV 95
Android, the Google TV Operating System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Understanding the Development Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
Testing Your Apps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Setting Up an Android Project in Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Exercises . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Hour 8: Using Android Layouts for Your Google TV App 113
Layout Basics with LinearLayout . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 113
Laying Out Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
FrameLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
RelativeLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Hour 9: Optimizing UI Components for Google TV 129
Form Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Using ImageViews . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Using VideoViews . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Putting Button Overlays on a Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
Summary . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Hour 10: Organizing Google TV Apps Using the ActionBar 149
Implementing an ActionBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Adding Tabs . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Adding ActionItems and MenuItems . . . . . . . . . . . . . . . . . . . . . . . . 153
Using the LeftNavBar Library . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Putting It All Together . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Exercises . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Hour 11: Understanding Activities and Fragments in a Complex App 163
Understanding the Activity Life Cycle . . . . . . . . . . . . . . . . . . . . . . . . . 163
Understanding Fragments . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Swapping Fragments in an Activity . . . . . . . . . . . . . . . . . . . . . . . . 166
Using Fragments with ActionBar . . .. . . . . . . . . . . . . . . . . . . . . . . . 174
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Hour 12: Using Specialized Fragments 181
DialogFragments. . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
ListFragments . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Grids and Galleries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Hour 13: Handling D-Pad and Key Events 195
Designing for the D-Pad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Controlling Focus . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . 197
Programming D-Pad Key Events . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 199
Summary . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Q&A . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Hour 14: Accessing Remote Content for a Google TV App 207
Displaying Remote Images and Videos. . . . . . . . . . . . . . . . . . . . . . . 207
Fetching Remote Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Using and Parsing JSON Formatted Data . . . . .. . . . . . . . . . . . . . . 215
Putting the Pieces Together in the App . . . . . . . . . . . . . . . . . . . . . . . . 218
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Workshop . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Hour 15: Storing Data with SQLite 225
Organizing a Database with Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Managing Data with SQLiteOpenHelper . . . . . . . . . . . . . . . . . . . . . . . . 226
Adding, Deleting, and Updating Data. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Querying Data and Using Cursors . . . . .. . . . . . . . . . . . . . . . . .. . . . . . . . . 231
Using a Database in the App . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Summary . . . . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . . 237
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Hour 16: Creating a Content Provider 239
Using a URI for Data Retrieval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Building a ContentProvider . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Using PhotoProvider in Our App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Requesting a File from a ContentProvider . . . . . . . . . . . . . . . . . . . . . . . . . . 249
Summary . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Hour 17: Using Loaders and CursorLoaders 257
How Loaders Work . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Loader Classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Loader States and LoaderManager.Callbacks . . . . . . . . . . . . . . . . . . . . . . 258
Adding Loaders to ImageViewFragment . . . . . . . . . . . . . . . . . . . . . . . . 260
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Hour 18: Developing a Complete App 269
Determining What the App Will Do . . . . . .. . . . . . . . . . . 269
Developing the GridFragment . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Enhancing the Activity Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Adding the ActionBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Exercises . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Hour 19: Mastering the Android Manifest File 289
Android Manifest Basics . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Understanding Intents . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Adding Google TV Specifics to the Manifest File . . . . . . . . . . . . . 294
Publishing Your App . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Hour 20: Using the Channel Listing Provider 301
Getting Data from the Channel Listing Provider . . . . .. . . . . . . . . 301
Listing All Channels . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Changing the Channel . . . . . . . . . . . . . . . . . . . . . . . . . . . 307
Understanding Audio Focus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Q&A . . . . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Hour 21: Using Second Screen Apps with Google TV 315
How Second Screen Apps Are Used . . . . . . . . . . . . . . . . . . . . . . 315
Types of Second Screen Apps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
User Interaction with Second Screen Apps . . . . .. . . . . . . . . . . . . . . . . . 316
Connecting a TV with a Second Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Hour 22: Examining an Example Second Screen App 325
Preparing the Blackjack Second Screen App . . . . . . .. . . . . . . . . . . . . . . 325
Running the Blackjack App . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Exploring the Blackjack App Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Exploring the Anymote Library Code . . . . . . . . .. . . . . . . . . . . . . . . . . . . . . 332
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Q&A . . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Hour 23: Developing Second Screen Apps 337
Flinging a URL . . . . . . . .. . . . . . . . . . . . . . . . . . . . .. . . . . . . . 337
Sending KeyEvents to the TV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Sending Mouse Events to the TV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Workshop . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Exercises . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Hour 24: Working with Anymote and Pairing Protocols 353
The Anymote Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Pairing Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Using Anymote and Pairing in a Chrome Extension . . . . . . . . . . . . . . . . . . . 360
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Q&A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Workshop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Index 367