1.1 Building a String from Parts
1.2 Substituting Variables into Strings
1.3 Substituting Variables into an Existing String
1.4 Reversing a String by Words or Characters
1.5 Representing Unprintable Characters
1.6 Converting Between Characters and Values
1.7 Converting Between Strings and Symbols
1.8 Processing a String One Character at a Time
1.9 Processing a String One Word at a Time
1.10 Changing the Case of a String
1.11 Managing Whitespace
1.12 Testing Whether an Object Is String-Like
1.13 Getting the Parts of a String You Want
1.14 Handling International Encodings
1.15 Word-Wrapping Lines of Text
1.16 Generating a Sucession of Strings
1.17 Mat hing Strings with Regular Expressions
1.18 Replacing Multiple Patterns in a Single Pass
1.19 Validating an Email Address
1.20 Classifying Text with a Bayesian Analyzer
2 Numbers
2.1 Parsing a Number from a String
2.2 Comparing Floating-Point Numbers
2.3 Representing Numbers to Arbitrary Precision
2.4 Representing Rational Numbers
2.5 Generating Random Numbers
2.6 Converting Between Numeri Bases
2.7 Taking Logarithms
2.8 Finding Mean, Median, and Mode
2.9 Converting Between Degrees and Radians
2.10 Multiplying Matri es
2.11 Solving a System of Linear Equations
2.12 Using Complex Numbers
2.13 Simulating a Sub lass of Fixnum
2.14 Doing Math with Roman Numbers
2.15 Generating a Sequence of Numbers
2.16 Generating Prime Numbers
2.17 Che king a Credit Card Che ksum
3 Date and Time
3.1 Finding Today's Date
3.2 Parsing Dates, Precisely or Fuzzily
3.3 Printing a Date
3.4 Iterating Over Dates
3.5 Doing Date Arithmeti
3.6 Counting the Days Since an Arbitrary Date
3.7 Converting Between Time Zones
3.8 Che king Whether Daylight Saving Time Is in Effect
3.9 Converting Between Time and DateTime Obje ts
3.10 Finding the Day of the Week
3.11 Handling Commer ial Dates
3.12 Running a Code Blo k Periodi ally
3.13 Waiting a Certain Amount of Time
3.14 Adding a Timeout to a Long-Running Operation
4 Arrays
4.1 Iterating Over an Array
4.2 Rearranging Values Without Using Temporary Variables
4.3 Stripping Dupli ate Elements from an Array
4.4 Reversing an Array
4.5 Sorting an Array
4.6 Ignoring Case When Sorting Strings
4.7 Making Sure a Sorted Array Stays Sorted
4.8 Summing the Items of an Array
4.9 Sorting an Array by Frequen y of Appearance
4.10 Shuffling an Array
4.11 Getting the N Smallest Items of an Array
4.12 Building Up a Hash Using Injection
4.13 Extra ting Portions of Arrays
4.14 Computing Set Operations on Arrays
4.15 Partitioning or Classifying a Set
5 Hashes
5.1 Using Symbols as Hash Keys
5.2 Creating a Hash with a Default Value
5.3 Adding Elements to a Hash
5.4 Removing Elements from a Hash
5.5 Using an Array or Other Modifiable Object as a Hash Key
5.6 Keeping Multiple Values for the Same Hash Key
5.7 Iterating Over a Hash
5.8 Iterating Over a Hash in Insertion Order
5.9 Printing a Hash
5.10 Inverting a Hash
5.11 Choosing Randomly from a Weighted List
5.12 Building a Histogram
5.13 Remapping the Keys and Values of a Hash
5.14 Extra ting Portions of Hashes
5.15 Sear hing a Hash with Regular Expressions
6 Files and Directories
6.1 Che king to See If a File Exists
6.2 Che king Your Acess to a File
6.3 Changing the Permissions on a File
6.4 Seeing When a File Was Last Used Problem
6.5 Listing a Dire tory
6.6 Reading the Contents of a File
6.7 Writing to a File
6.8 Writing to a Temporary File
6.9 Pi king a Random Line from a File
6.10 Comparing Two Files
6.11 Performing Random A ess on "Read-Once" Input Streams
6.12 Walking a Directory Tree
6.13 Lo king a File
6.14 Ba king Up to Versioned Filenames
6.15 Pretending a String Is a File
6.16 Redire ting Standard Input or Output
6.17 Pro essing a Binary File
6.18 Deleting a File
6.19 Trun ating a File
6.20 Finding the Files You Want
6.21 Finding and Changing the Current Working Directory
7 Code Blocks and Iteration
7.1 Creating and Invoking a Block
7.2 Writing a Method That Acepts a Block
7.3 Binding a Block Argument to a Variable
7.4 Blocks as Closures: Using Outside Variables Within a Code Block
7.5 Writing an Iterator Over a Data Structure
7.6 Changing the Way an Obje t Iterates
7.7 Writing Block Methods That Classify or Collect
7.8 Stopping an Iteration
7.9 Looping Through Multiple Iterables in Parallel
7.10 Hiding Setup and Cleanup in a Blo k Method
7.11 Coupling Systems Loosely with Callbacks
8 Objects and Classes8
8.1 Managing Instance Data
8.2 Managing Class Data
8.3 Checking Class or Module Membership
8.4 Writing an Inherited Class
8.5 Overloading Methods
8.6 Validating and Modifying Attribute Values
8.7 Defining a Virtual Attribute
8.8 Delegating Method Calls to Another Object
8.9 Converting and Coercing Objects to Different Types
8.10 Getting a Human-Readable Printout of Any Object
8.11 Acepting or Passing a Variable Number of Arguments
8.12 Simulating Keyword Arguments
8.13 Calling a Superclass's Method
8.14 Creating an Abstract Method
8.15 Freezing an Object to Prevent Changes
8.16 Making a Copy of an Object
8.17 Declaring Constants
8.18 Implementing Class and Singleton Methods
8.19 Controlling Acess by Making Methods Private
9 Modules and Namespa es
9.1 Simulating Multiple Inheritan e with Mixins
9.2 Extending Spe ifi Obje ts with Modules
9.3 Mixing in Class Methods
9.4 Implementing Enumerable: Write One Method, Get 22 Free
9.5 Avoiding Naming Collisions with Namespaces
9.6 Automati ally Loading Libraries as Needed
9.7 In luding Namespaces
9.8 Initializing Instance Variables Defined by a Module
9.9 Automati ally Initializing Mixed-In Modules
10 Reflection and Metaprogramming
10.1 Finding an Object's Class and Superclass
10.2 Listing an Object's Methods
10.3 Listing Methods Unique to an Object
10.4 Getting a Reference to a Method
10.5 Fixing Bugs in Someone Else's Class
10.6 Listening for Changes to a Class
10.7 Che king Whether an Object Has Necessary Attributes
10.8 Responding to Calls to Undefined Methods
10.9 Automati ally Initializing Instance Variables
10.10 Avoiding Boilerplate Code with Metaprogramming
10.11 Metaprogramming with String Evaluations
10.12 Evaluating Code in an Earlier Context
10.13 Undefining a Method
10.14 Aliasing Methods
10.15 Doing Aspe t-Oriented Programming
10.16 Enforcing Software Contracts
11 XML and HTML
11.1 Che king XML Well-Formedness
11.2 Extracting Data from a Document's Tree Structure
11.3 Extracting Data While Parsing a Document
11.4 Navigating a Document with XPath
11.5 Parsing Invalid Markup ..
11.6 Converting an XML Document intoca Hash
11.7 Validating an XML Document
11.8 Substituting XML Entities
11.9 Creating and Modifying XML Documents
11.10 Compressing Whitespace in an XML Document
11.11 Guessing a Do ument's Encoding
11.12 Converting from One En oding to Another
11.13 Extracting All the URLs from an HTML Document
11.14 Transforming Plain Text to HTML
11.15 Converting HTML Do uments from the Web into Text
11.16 A Simple Feed Aggregator
12 Graphi s and Other File Formats
12.1 Thumbnailing Images
12.2 Adding Text to an Image
12.3 Converting One Image Format to Another
12.4 Graphing Data
12.5 Adding Graphical Context with Sparklines
12.6 Strongly En rypting Data
12.7 Parsing Comma-Separated Data
12.8 Parsing Not-Quite-Comma-Separated Data
12.9 Generating and Parsing Ex el Spreadsheets
12.10 Compressing and Archiving Files with Gzip and Tar
12.11 Reading and Writing ZIP Files
12.12 Reading and Writing Configuration Files
12.13 Generating PDF Files
12.14 Representing Data as MIDI Musi
13 Databases and Persistence
13.1 Serializing Data with YAML
13.2 Serializing Data with Marshal
13.3 Persisting Objects with Madeleine
13.4 Indexing Unstructured Text with SimpleSear h
13.5 Indexing Structured Text with Ferret
13.6 Using Berkeley DB Databases
13.7 Controlling MySQL on Unix
13.8 Finding the Number of Rows Returned by a Query
13.9 Talking Dire tly to a MySQL Database
13.10 Talking Directly to a PostgreSQL Database
13.11 Using Object Relational Mapping with A tiveRecord
13.12 Using Object Relational Mapping with Og
13.13 Building Queries Programmati ally
13.14 Validating Data with A tiveRecord
13.15 Preventing SQL Injection Attacks
13.16 Using Transactions in A tiveRecord
13.17 Adding Hooks to Table Events
13.18 Adding Taggability with a Database Mixin
14 Internet Services
14.1 Grabbing the Contents of a Web Page
14.2 Making an HTTPS Web Request
14.3 Customizing HTTP Request Headers
14.4 Performing DNS Queries
14.5 Sending Mail
14.6 Reading Mail with IMAP
14.7 Reading Mail with POP3
14.8 Being an FTP Client
14.9 Being a Telnet Client
14.10 Being an SSH Client
14.11 Copying a File to Another Ma hine
14.12 Being a BitTorrent Client
14.13 Pinging a Ma hine
14.14 Writing an Internet Server
14.15 Parsing URLs
14.16 Writing a CGI Script
14.17 Setting Cookies and Other HTTP Response Headers
14.18 Handling File Uploadscvia CGI
14.19 Running Servlets with WEBri k
14.20 A Real-World HTTP Client
15 Web Development: Ruby on Rails
15.1 Writing a Simple Rails Application to Show System Status
15.2 Passing Data from the Controller to the View
15.3 Creating a Layout for Your Header and Footer
15.4 Redire ting to a Different Location
15.5 Displaying Templates with Render
15.6 Integrating a Database with Your Rails Application
15.7 Understanding Pluralization Rules
15.8 Creating a Login System
15.9 Storing Hashed User Passwords in the Database
15.10 Escaping HTML and JavaS ript for Display
15.11 Setting and Retrieving Session Information
15.12 Setting and Retrieving Cookies
15.13 Extra ting Code into Helper Fun tions
15.14 Refa toring the View into Partial Snippets of Views
15.15 Adding DHTML Effe ts with script.aculo.us
15.16 Generating Forms for Manipulating Model Objects
15.17 Creating an Ajax Form
15.18 Exposing Web Services on Your Web Site
15.19 Sending Mail with Rails
15.20 Automati ally Sending Error Messages to Your Email
15.21 Do umenting Your Web Site
15.22 Unit Testing Your Web Site
15.23 Using breakpoint in Your Web Application
16 Web Services and Distributed Programming
16.1 Sear hing for Books on Amazon
16.2 Finding Photos on Fli kr
16.3 Writing an XML-RPC Client
16.4 Writing a SOAP Client
16.5 Writing a SOAP Server
16.6 Sear hing the Web with Google's SOAP Service
16.7 Using a WSDL File to Make SOAP Calls Easier
16.8 Charging a Credit Card
16.9 Finding the Cost to Ship Pa kages via UPS or FedEx
16.10 Sharing a Hash Between Any Number of Computers
16.11 Implementing a Distributed Queue
16.12 Creating a Shared "Whiteboard"
16.13 Securing DRb Services with Acess Control Lists
16.14 Automati ally Dis overing DRb Services with Rinda
16.15 Proxying Objects That Can't Be Distributed
16.16 Storing Data on Distributed RAM with MemCached
16.17 Caching Expensive Results with MemCached
16.18 A Remote-Controlled Jukebox
17 Testing, Debugging, Optimizing, and Documenting
17.1 Running Code Only in Debug Mode
17.2 Raising an Exception
17.3 Handling an Exception
17.4 Rerunning After an Exception
17.5 Adding Logging to Your Appli ation
17.6 Creating and Understanding Tracebacks
17.7 Writing Unit Tests
17.8 Running Unit Tests
17.9 Testing Code That Uses External Resources
17.10 Using breakpoint to Inspect and Change the State of Your Appli ation
17.11 Do umenting Your Application
17.12 Profiling Your Application
17.13 Ben hmarking Competing Solutions
17.14 Running Multiple Analysis Tools at Once
17.15 Who's Calling That Method? A Call Graph Analyzer
18 Pa kaging and Distributing Software
18.1 Finding Libraries by Querying Gem Respositories
18.2 Installing and Using a Gem
18.3 Requiring a Specifi Version of a Gem
18.4 Uninstalling a Gem
18.5 Reading Documentation for Installed Gems
18.6 Packaging Your Codecas a Gem
18.7 Distributing Your Gems
18.8 Installing and Creating Standalone Packages with setup.rb
19 Automating Tasks with Rake
19.1 Automati ally Running Unit Tests
19.2 Automati ally Generating Documentation
19.3 Cleaning Up Generated Files
19.4 Automati ally Building a Gem
19.5 Gathering Statistics About Your Code
19.6 Publishing Your Documentation
19.7 Running Multiple Tasks in Parallel
19.8 A Generi Proje t Rakefile
20 Multitasking and Multithreading
20.1 Running a Daemon Pro ess on Unix
20.2 Creating a Windows Service
20.3 Doing Two Things at On e with Threads
20.4 Synchronizing Acess to an Object
20.5 Terminating a Thread
20.6 Running a Code Block on Many Objects Simultaneously
20.7 Limiting Multithreading with a Thread Pool
20.8 Driving an External Process with popen
20.9 Capturing the Output and Error Streams from a Unix Shell Command
20.10 Controlling a Process on Another Machine
20.11 Avoiding Deadlock
21 User Interface
21.1
21.2 Getting Input One Line at a Time
21.3 Getting Input One Character at a Time
21.4 Parsing Command-Line Arguments
21.5 Testing Whether a Program Is Running Intera tively
21.6 Setting Up and Tearing Down a Curses Program
21.7 Clearing the S reen
21.8 Determining Terminal Size
21.9 Changing Text Color
21.10 Reading a Password
21.11 Allowing Input Editing with Readline
21.12 Making Your Keyboard Lights Blink
21.13 Creating a GUI Appli ation with Tk
21.14 Creating a GUI Appli ation with wxRuby
21.15 Creating a GUI Appli ation with Ruby/GTK
21.16 Creating a Ma OS X Appli ation with RubyCo oa
21.17 Using AppleS ript to Get User Input
22 Extending Ruby with Other Languages
22.1 Writing a C Extension for Ruby
22.2 Using a C Library from Ruby
22.3 Calling a C Library Through SWIG
22.4 Writing Inline C in Your Ruby Code
22.5 Using Java Libraries with JRuby
23 System Administration
23.1 Scripting an External Program
23.2 Managing Windows Services
23.3 Running Code as Another User
23.4 Running Periodi Tasks Without roncorcat
23.5 Deleting Files That Match a Regular Expression
23.6 Renaming Files in Bulk
23.7 Finding Duplicate Files
23.8 Automating Backups
23.9 Normalizing Ownership and Permissions in User Directories
23.10 Killing All Processes for a Given User
Index ...