Ruby data processing: using map, reduce, and select 1st edition jay godse 2024 scribd download

Page 1


Visit to download the full and correct content document: https://textbookfull.com/product/ruby-data-processing-using-map-reduce-and-select-1 st-edition-jay-godse/

More products digital (pdf, epub, mobi) instant download maybe you interests ...

Biota

Grow 2C gather 2C cook Loucas

https://textbookfull.com/product/biota-grow-2c-gather-2c-cookloucas/

Earth Systems Data Processing and Visualization Using MATLAB Zekâi ■en

https://textbookfull.com/product/earth-systems-data-processingand-visualization-using-matlab-zekai-sen/

Practical Data Science Cookbook Data pre processing analysis and visualization using R and Python Prabhanjan Tattar

https://textbookfull.com/product/practical-data-science-cookbookdata-pre-processing-analysis-and-visualization-using-r-andpython-prabhanjan-tattar/

Python Data Analysis: Perform data collection, data processing, wrangling, visualization, and model building using Python 3rd Edition Avinash Navlani

https://textbookfull.com/product/python-data-analysis-performdata-collection-data-processing-wrangling-visualization-andmodel-building-using-python-3rd-edition-avinash-navlani/

Practical object-oriented design: an agile primer using Ruby Second Edition Metz

https://textbookfull.com/product/practical-object-orienteddesign-an-agile-primer-using-ruby-second-edition-metz/

Data Processing with Optimus: Supercharge big data preparation tasks for analytics and machine learning with Optimus using Dask and PySpark Leon

https://textbookfull.com/product/data-processing-with-optimussupercharge-big-data-preparation-tasks-for-analytics-and-machinelearning-with-optimus-using-dask-and-pyspark-leon/

Scientific Data Analysis using Jython Scripting and Java Advanced Information and Knowledge Processing 2010th Edition Chekanov Sergei V

https://textbookfull.com/product/scientific-data-analysis-usingjython-scripting-and-java-advanced-information-and-knowledgeprocessing-2010th-edition-chekanov-sergei-v/

A Common Sense Guide to Data Structures and Algorithms 1st Edition Jay Wengrow

https://textbookfull.com/product/a-common-sense-guide-to-datastructures-and-algorithms-1st-edition-jay-wengrow/ Processing Big Data with Azure HDInsight: Building Real-World Big Data Systems on Azure HDInsight Using the Hadoop Ecosystem 1st Edition Vinit Yadav (Auth.)

https://textbookfull.com/product/processing-big-data-with-azurehdinsight-building-real-world-big-data-systems-on-azurehdinsight-using-the-hadoop-ecosystem-1st-edition-vinit-yadavauth/

Ruby Data Processing

Using Map, Reduce, and Select

Jay Godse

Ruby Data Processing Using

Map, Reduce, and Select

Jay Godse

Ruby Data Processing: Using Map, Reduce, and Select

ISBN-13 (pbk): 978-1-4842-3473-0

https://doi.org/10.1007/978-1-4842-3474-7

Library of Congress Control Number: 2018934400

Copyright © 2018 by Jay Godse

ISBN-13 (electronic): 978-1-4842-3474-7

This work is subject to copyright. All rights are reserved by the Publisher, whether the whole or part of the material is concerned, specifically the rights of translation, reprinting, reuse of illustrations, recitation, broadcasting, reproduction on microfilms or in any other physical way, and transmission or information storage and retrieval, electronic adaptation, computer software, or by similar or dissimilar methodology now known or hereafter developed.

Trademarked names, logos, and images may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, logo, or image we use the names, logos, and images only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark.

The use in this publication of trade names, trademarks, service marks, and similar terms, even if they are not identified as such, is not to be taken as an expression of opinion as to whether or not they are subject to proprietary rights.

While the advice and information in this book are believed to be true and accurate at the date of publication, neither the authors nor the editors nor the publisher can accept any legal responsibility for any errors or omissions that may be made. The publisher makes no warranty, express or implied, with respect to the material contained herein.

Managing Director, Apress Media LLC: Welmoed Spahr

Acquisitions Editor: Steve Anglin

Development Editor: Matthew Moodie

Coordinating Editor: Mark Powers

Cover designed by eStudioCalamar

Cover image designed by Freepik (www.freepik.com)

Distributed to the book trade worldwide by Springer Science+Business Media New York, 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax (201) 348-4505, email orders-ny@springer-sbm.com, or visit www.springeronline.com. Apress Media, LLC is a California LLC and the sole member (owner) is Springer Science + Business Media Finance Inc (SSBM Finance Inc). SSBM Finance Inc is a Delaware corporation.

For information on translations, please email editorial@apress.com; for reprint, paperback, or audio rights, please email bookpermissions@springernature.com.

Apress titles may be purchased in bulk for academic, corporate, or promotional use. eBook versions and licenses are also available for most titles. For more information, reference our Print and eBook Bulk Sales web page at http://www.apress.com/bulk-sales.

Any source code or other supplementary material referenced by the author in this book is available to readers on GitHub via the book's product page, located at www.apress.com/9781484234730.

For more detailed information, please visit http://www.apress.com/source-code.

Printed on acid-free paper

About the Author

Jay Godse is an active software and web applications developer with expertise in Ruby, Rails, various databases, and Ansible. He also is active on Stack Overflow as an active contributor. He graduated with an engineering degree and then went to work as a digital circuit designer. After a year of that, he switched to software development, and he has been there ever since in some form. His early work was mostly real-time telecommunication device control and provisioning using languages such as C and Protel. He then transitioned into designing distributed computing systems using languages such as C++. After that, he moved into web applications. Along the way, he did stints as a software development manager and a software architect. But for the last nine years, he has written web applications in Ruby and DevOps applications in Ansible and Powershell.

About the Technical Reviewer

Massimo Nardone has more than 24 years of experience in security, web/mobile development, cloud, and IT architecture. His true IT passions are security and Android.

He has been programming and teaching how to program with Android, Perl, PHP, Java, VB, Python, C/C++, and MySQL for more than 20 years.

He holds a Master of Science in Computing Science from the University of Salerno, Italy.

He has worked as a project manager, software engineer, research engineer, chief security architect, information security manager, PCI/SCADA auditor, and senior lead IT security/cloud/SCADA architect for many years.

Technical skills include security, Android, cloud, Java, MySQL, Drupal, Cobol, Perl, web and mobile development, MongoDB, D3, Joomla, Couchbase, C/C++, WebGL, Python, Pro Rails, Django CMS, Jekyll, Scratch, and more.

He worked as visiting lecturer and supervisor for exercises at the Networking Laboratory of the Helsinki University of Technology (Aalto University). He holds four international patents (PKI, SIP, SAML, and Proxy areas).

He currently works as chief information security officer (CISO) for Cargotec Oyj and is member of ISACA Finland Chapter Board.

Massimo has reviewed more than 45 IT books for different publishers, and in addition to reviewing this book he is also the coauthor of Pro Android Games (Apress, 2015).

Acknowledgments

I would like to acknowledge a few people who helped make me a better programmer and a better writer. Thanks go to Kevin Szabo and Ronnie Taylor, both of whom helped me be a better programmer, and to Christina Hardy, who helped me to become a better writer. And thanks also go to Mark Powers and the publication team at Apress who helped produce this book.

Introduction

I wrote mostly reactive software for many years, but there was always a user interface or reporting component that had string manipulation, data synthesis, or data formatting. Since I was not trained as a computer scientist, I did not learn of higher-order functions such as map(), reduce(), and select() that were found in languages like Lisp or Smalltalk. Also, Ruby, Python, C++, and JavaScript were not around when I was in school. As a result, I struggled with cumbersome, error-prone imperative code for some tasks.

A few years after learning Ruby, but while still using the imperative programming style for data processing, I discovered the Ruby Enumerable library and started using its higher-order functions, such as map(), reduce(), and select(). What happened to my data-processing code?

• Code became more straightforward because dataprocessing tasks could be expressed with a cascading pipeline of map, reduce, and select stages. Each stage in the pipeline was simple to develop and debug.

• Code volume was reduced by half.

• Code was naturally more robust, and debugging took much less time.

• By thinking of solutions in terms of map, reduce, and select, I was able to envision and solve more complex problems.

However, I couldn’t find any but the most trivial examples of how to use these functions to solve data-processing problems. It took me a lot

of time-consuming trial and error with map, reduce, and select to solve these kinds of problems.

I decided to write this book to

• codify my learning and help you understand it more quickly and effectively than I did; and

• show you my problem-solving approaches to help you solve your data-processing problems.

I’ll also admit that I was forced to learn many of the programming nuances of these functions as I wrote the examples.

Who This Book Can Help

This book can help those who

• want to become more skilled in writing data-processing code by becoming more fluent in using map, reduce and select;

• are willing to type in all the code in the examples and run the code using the irb Ruby command line and a text editor;

• are willing to carefully read and try the examples in this book and to reflect and ponder the outputs, and even tweak the programs independently to try to understand what is happening;

• are open to learning a different way to approach dataprocessing problems; and

• are willing to try failed approaches to learn the nuances of these functions.

Who This Book Might Not Help

This book might not help you if you want

• recipes for standard problems via a cookbook; or

• a reference for data-processing solutions.

Prerequisites

You should be familiar with some Ruby programming or at least some programming in another language. If you don’t know Ruby, search out the book Learn Ruby the Hard Way1 and go through it as prescribed by its author, Zed Shaw.

If you are fluent with Python, you might benefit from this book if you go slowly and look up Ruby information online as you move through this book.

An internet connection helps if you want to search for online help using Google, Bing, or another search engine.

You should have a computer with Ruby 2.2.x installed. Windows works, as do Linux and Mac OSX.

You should have a good syntax-highlighting text editor. I recommend Notepad++ on Windows or gedit on Linux or Macintosh, both of which are free. Sublime works on Windows, Linux, or Macintosh and is slightly better, but costs about $70 at the time of this writing.

1http://learnrubythehardway.org/book/

CHAPTER 1

Basic Ruby

This section will acquaint or refresh you with basic ways to use the Ruby command line, as well as some relevant Ruby coding.

If you are comfortable programming in Ruby and understand the Ruby Enumerable Library reasonably well, you can skip this section.

The Command Line

After you install Ruby, you can fire up the interactive command line in Windows, Linux, or Mac OSX. I’m using Windows.

C:\> irb

irb(main):001:0>

For brevity, I won’t write the full irb prompt every time.

You can execute Ruby statements line by line. The value returned by each expression is preceded by ⇒.

irb> a = 4

=> 4

irb> a

=> 4

irb> a + 7

=> 11

© Jay Godse 2018 J. Godse, Ruby Data Processing, https://doi.org/10.1007/978-1-4842-3474-7_1

Chapter 1 BasiC r uBy

You can choose to put multiple statements on one line, separated by a semicolon.

irb> list = ["one", "two","three"];1

=>1

irb> list

=>["one", "two", "three"]

You can also have a statement that spans multiple lines.

irb> [2,3,4,5].each do |n|

irb> if n%2==0

irb> puts "even"

irb> else

irb> puts "odd"

irb> end

irb> end

=> "even"

=> "odd"

=> "even"

=> "odd"

You can put the code into a file called sample.rb, located in the same directory or folder from which you ran irb.

1 [2,3,4,5].each do |n|

2 if n%2 == 0

3 puts "even"

4 else

5 puts "odd"

6 end

7 end

Then, with irb:

irb> load "sample.rb"

irb> end

=> "even"

=> "odd"

=> "even"

=> "odd"

irb>

You could also copy the code block from your text editor and paste it directly into your command line and get the same result, as long as you use only spaces for indentation. (Using tabs for indentation will work fine if you load the file from the command prompt, but if you paste tabs directly into irb, it will generate errors).

You can either type the code samples from this book into irb directly or type them into a text editor and then load the file as just shown.

Object Scope

When you are in a Ruby program, the general method of executing a method f on an object obj is as follows: obj.f

That is true whether you are in a Ruby program or the command line. When code is in the main program file, or in the irb command-line interpreter, there is an implied context for many functions, such as puts. That is why you can do this: puts "Hello world"

You don’t need to specify a class to qualify puts, because puts is a method of the underlying context object.

String

Strings are basic constructs in all languages. Let’s look at a few basic operations used in this book. Try them out on the irb command line for yourself.

length or size

This yields the size of the string. downcase

This converts all letters to lowercase. upcase

This converts all letters to uppercase. capitalize

This capitalizes the first letter of a string. split()

This searches a substring for the argument string and splits the string into a array comprising substrings on both sides of the split argument, while the substring of the split argument is discarded. If there are no matches, an array is returned with the whole string:

irb> base_string = "abc def ghi"

irb> base_string.split(" ")

=> ["abc","def","ghi"]

irb> base_string.split(" ")

=> ["abc def","ghi"]

irb> base_string.split(" d")

=> ["abc","ef ghi"]

irb> base_string.split("efghi")

=> ["abc def ghi"]

This joins each element of an array of strings with the string in the join argument as the separator.

irb> stringlist = ["This", "is", "a", "sentence"]

irb> stringlist.join(" ")

=> "This is a sentence"

irb> stringlist.join(",")

=> "This,is,a,sentence"

irb> stringlist.join(" A SPACE ")

=> "This A SPACE is A SPACE a A SPACE sentence"

string interpolation

This lets you define a string template with parameters. The string #{} gives you a place to put a variable.

irb> first = "Jack"; last = "Black"

irb> full_name = "#{first} #{last}"

=> "Jack Black"

This is especially useful for iterating over a list:

irb> smith_brothers = ["Terry", "Jerry", "Harry"]

irb> smith_brothers.each{|brother| puts "#{brother} Smith"}

Terry Smith

Jerry Smith

Harry Smith

=> ["Terry", "Jerry", "Harry"]

C/C++ programmers will recognize string interpolation as being similar to the sprintf function in the C standard library.

Chapter 1 BasiC r uBy

Array

Arrays in Ruby are like arrays in other languages. They are a collection of things indexed by a whole number (e.g., 0,1,2,…). In Ruby, an array can contain any Ruby object at an index. Array indices in Ruby start at 0. Arrays implement the Ruby Enumerable interface, so they will have key methods such as each, map, reduce, select, and others.

Special Methods

compact()

This method on an array gets rid of nil members. For example:

irb> [1,nil,2,nil,nil,3,nil,[]].compact => [1,2,3,[]]

flatten()

This method gets rid of inner arrays to an arbitrary depth. It is often useful when dealing with nested map and reduce statements. For example:

irb> [[1,[2,3]],4,[5,6]].flatten => [1,2,3,4,5,6]

push()

This method pushes an element onto the end of an array and returns a new array. For example:

irb> [1,2,3,4,5].push(666)

=> [1,2,3,4,5,666]

This method removes the last element of an array and returns that element and returns a new array.

For example:

irb> the_array = [1,2,3,4,5]

irb> tail = the_array.pop

irb> tail

=> 5

irb> the_array

=> [1, 2, 3, 4]

unshift()

This method pushes an element onto the beginning of an array and returns a new array. For example:

irb> the_array = [1,2,3,4,5]

irb> the_array.unshift(666)

=> [666, 1, 2, 3, 4, 5]

shift

This method removes the first element of an array and returns that element and modifies the old array.

For example:

irb> the_array = [1,2,3,4,5]

irb> head = the_array.shift

irb> head

=> 1

irb> the_array

=> [2, 3, 4, 5]

Chapter 1 BasiC r uBy

Hash

Another term for hash is an “associative array,” or even a “dictionary”, Hashes are indexed by a key object, and there is a value (another object) for each key object.

irb> newhash = Hash.new => {}

irb> newhash2 = {} => {}

These are two ways of creating a new hash. The key of a hash can be any object or symbol.

irb> newhash = {key1: "some_value", key2: 2}

=> {:key1=> "some_value", :key2=>2}

irb> newhash2 = {}

irb> newhash2[:key1] = "key1_symbol"

irb> newhash2["key1"] = "key3_string"

irb> newhash2[3] = 3

irb> newhash2[:key4] = [4,"44"]

irb> newhash2[[3,"33"]] = "wow"

irb> newhash2

=> {:key1=>"key1_symbol", "key2"=>"key2_string", 2=>1, :key4=>[4,"44"], [3,"33]=\ "wow" }

The key can be any object, including symbols, strings, numbers, hashes, arrays, or anything. When iterating through a hash using each or map, it emits a single array with the key as the first element and the value as the second element, or it can emit two elements, which are the key and the value. (Note that inspect is how you can inspect the content of any object).

irb> newhash = {a: 1, b: 2, c: 3}

irb> newhash.each{|e| puts e.inspect}

[:a, 1]

[:b, 2]

[:c, 3]

=> {:a => 1, :b => 2, :c => 3}

irb> newhash.map{|key, value| "The key is #{key} and the value is #{value}"}

=> ["The key is a and the value is 1", "The key is b and the value is 2", "The key is c and the value is 3"]

Block-passing Syntax

Ruby is one of many languages that allow lexical closures, otherwise known (kind of) as anonymous functions or blocks. These functions are dynamically created. The function can take the form of a defined function. For example:

irb> def plus_two(a,b)

irb> a + b + 2

irb> end

irb> plus_two(3,4)

=> 9

Or, you could define it as follows:

irb> plus_two = ->(a,b) do

irb> a + b + 2

irb> end

Chapter 1 BasiC r uBy

Or, you could define it this way:

irb> plus_three = ->(a,b){a + b + 3}

irb> plus_three.call(5,7)

=> 15

Now, anonymous functions or blocks can be passed to other functions as parameters. A function that takes a function (defined or anonymous) as a parameter will optionally execute the function in its program flow. Suppose there is a function called printit() defined as follows:

irb> printit = ->(a) do irb> puts a.inspect irb> end

Now, suppose you want to print each element of a range. You will call each on the array, which will run the block passed to each for each element of the array.

irb> (1..5).each(&printit) 1 2 3 4 5 => (1..5)

You could also pass an actual block of code to run. The block is surrounded by do and end or { and }. Objects between the vertical bars are optionally passed to the block (depending on the definition of the block), and they are used by the block to execute. The return value of a block is the value of the last expression in the block.

irb> (1..5).each do |num| irb> puts num.inspect irb> end

Chapter 1 BasiC r uBy

You will get the same output as earlier. Ditto for the following: irb> (1..5).each{|num| puts num.inspect }

In Ruby, map, reduce, and select all take a code block as a parameter, and the code block is executed as defined by the function. In this book, I will use the do-end syntax most often, and sometimes the { } syntax.

Reading from Files

A common operation in data processing is reading from files and writing to files. Suppose you have names.txt, which looks like this:

1,John

2,Jack

3,Jim

4,Jared

5,John

To read it, you would do the following:

irb> names = File.open("names.txt").read

Now, on some computers, new lines are split by a carriage return (“\n”), and on other computers lines are split by a line feed and a carriage return (“\r\n”).

If you want to split this file into rows, you would do the following:

irb> names.split("\n")

That could yield

=>["1,John\r", "2,Jack\r", "3,Jim\r", "4,Jared\r", "5,John\r"] or

=>["1,John", "2,Jack", "3,Jim", "4,Jared", "5,John"]

Chapter 1 BasiC r uBy

To ensure consistency, use the chomp method, which removes whitespace characters if they exist. For example:

irb> "John\r".chomp => "John"

irb> "John".chomp => "John"

So, for our array, just to ensure that we don’t pick up stray line feeds, we do the following:

irb> names.split("\n").map{|row| row.chomp} =>["1,John", "2,Jack", "3,Jim", "4,Jared", "5,John"]

I assume that the examples in this book don’t use “\r\n”, but rather just “\n”. If that doesn’t work on your operating system, use the chomp() method as shown before working with the array.

CHAPTER 2

Function Overview and Simple Examples

The Ruby library includes the module Enumerable. This library contains map(), reduce(), select(), and other functions. This section will outline the syntax and meanings of the different parts of code that use these three functions.

If you can get through this section comfortably, both typing the code into irb and understanding the results, then you will be in a good position to deepen your understanding with the complex examples and reverse engineering that follow in the next chapters.

Map

This function of the Ruby Enumerable library is simple but profound. The map() method is applied to an array or a hash. The job of map() is to apply a function or block to each member of the array and return a new array. So, when you see def f(x) x*x end

© Jay Godse 2018 J. Godse, Ruby Data Processing, https://doi.org/10.1007/978-1-4842-3474-7_2

Chapter 2 FunCtion overview and Simple exampleS

output_array =

[1,2,3,4,5].map do |number| f(number) end

you read, for each number in [1,2,3,4,5] apply f(x) to return the array [f(1), f(2), f(3), f(4), f(5)]. In this case, the answer is [1,4,9,16,25].

One could encode it in traditional imperative programming as follows:

output_array = [] for number in 1..5

output_array.push( f(number) ) end

Using map, for example:

output_array = [1,2,3,4,5].map do |number| number*number end

Or, you could encode it as follows:

output_array = [1,2,3,4,5].map{|element| element*element}

[1,2,3,4,5] is the array. The function (or block) to be applied to each element is {|element| element*element }.

With the { } syntax, or the do-end syntax, the object in the vertical bars (represented by element) is the element of the array currently being acted upon by the block, and the last object in any function or block is the return value, so element*element is returned. The net result is the following: [1,4,9,16,25]

Chapter 2 FunCtion overview and Simple exampleS

Suppose you wanted to provide data to a graphing program that plotted the square of the value.

[1,2,3,4,5].map{|element| [element, element*element]}

In this case, each “point” is a tuple (array) with an element and its square. This returns the following:

[[1,1],[2,4],[3,9],[4,16],[5,25]]

The difference is that the block returns an array each time with the number and its square, so the result is an array of arrays.

Since map returns an array, you can cascade map calls. For example, you could have a map block square each element, and then a second map block add 100. For example:

[1,2,3,4,5].map do |number| number*number end.map do |square| square + 100 end

=> [101, 104, 109, 116, 125]

A number of the more complex operations can be solved by cascading with map calls.

Reduce

This function of the Ruby Enumerable library is more complex than map() and is quite powerful. The method is applied to a collection (for example, an array or a hash). The job of reduce() is to apply a function cumulatively to each member of the collection and then return an object (which could be an array, a single value, a hash, or anything).

For example:

[1,2,3,4,5].reduce(0, :+)

This is like saying for each member of the list, add (:+) the member to memo and save the memo for the next element. The initial value of memo is 0 (the first parameter). Another way to code it is as follows: memo = 0

[1,2,3,4,5].each{|element| memo = memo.+(element)}

Or, you can pass reduce a block of code to run. The block comes after the closing parenthesis and is surrounded by a do-end construct, or a {} construct. The emitted variables are always the memo first and the element second. (In this case, the initial value of memo is 33).

[1,2,3,4,5].reduce(33) do |memo, element| memo.+(element) end memo => 48

(You don’t have to call them “memo” or “element,” but that is how they behave). After each iteration, the memo takes the value of the last object in the block. For example:

[1,2,3,4,5].reduce(33) do |memo, element| memo.+(element) 77.7 end => 77.7

This returned 77.7, because that was the last object in the block. Chapter 2 FunCtion overview and Simple exampleS

Chapter 2 FunCtion overview and Simple exampleS

Another thing to remember is that the memo returned by the block has to be of the same class as the memo emitted by the reduce function. For example, when you are using reduce() to build a Hash object, you must return the whole Hash object:

[1,2,3,4,5].reduce({}) do |memo, element| memo[element] = element.to_s end

IndexError: index 2 out of string

There is an error because the first run of the iteration returned memo[element], which is a String class, but the input expects it to be a Hash. To correct it, make sure that the memo of class Hash is explicitly the last object returned, as follows:

[1,2,3,4,5].reduce({}) do |memo, element| memo[element] = element.to_s memo end

=> {1=>"1", 2=>"2", 3=>"3", 4=>"4", 5=>"5"}

This worked because memo is a Hash class and was returned every time. You can think of the reduce operation as operating on each element and saving some kind of memo to carry forward to the operation on the next element. In the preceding example, where you calculate the sum of five numbers,

[1,2,3,4,5].reduce(0,:+) or

[1,2,3,4,5].reduce(0) do |memo, element| memo + element end

Another random document with no related content on Scribd:

tics, 396

Sheif, 347

Sheikh, the, 380

Shemar, 283

Shiel, Lady, 154

Shiraz, 218 climate, 224 famine at, 253 game at, 221 gardens of, 223 ladies, 219 lambs, 220 pipe-clay, 334 priest, 140 unhealthiness, 224 water, 241 wine, 229 women, intrigues of the, 276

Shirazi, gaiety of the, 219

Shirts, 317

Shitūr Gūlū, 226

Shoemakers, 190

Shoes, 321

Shooting antelope, 88 from the saddle, 84

Shopkeepers, 189

Shrine at Kūm, 387 of a saint, 362

Shulwar, 321

Shūr ab, 387

Shūrgistan, 261

Shushan, the palace, 109

Sick-leave, 207

Sick-room, a Persian, 244

Signs of wealth of Imād-u-Dowlet, 112

Silence of young married women, strange, 132

Silver doors, 196

Singers, Persian, 114

Sinsin, 386

Sir A. Kemball, 208

H. Rawlinson, 109

F. Goldsmid, 56, 157

Oliver St. John, 350

Sitting, mode of, 318

Skilled house-decorators, 164

Slavery in Persia, 326

Sleepers in mosques, 197

Smoking, 31

Snakes, 307 superstition as to, 306

Snipe, 116 double, 107

Snow-chair, 272 in Turkey, 213

Socks, 321

Soh, 384

Souhāli, 326

Soup Gework, 143

Spears, 179

Spurious cavalry officer, 73

Staff, health of the, 296

Stages, list of, 411

Stanley, the traveller, 224

Steamer, Caspian, 211

Steelyards, 221

Stone doors, 142 mortars, huge, 360

Storing wine, 58

Story, Persian, 285

Story-teller, 44

Straw, cut, its uses, 175

Stripped, I am, 263

Students, cells of, 197

Studs of horses, 89

Substitute for bells, 139

Successful Armenians, 143

Suez, 342

Suffid Rūd, 400

Suicide of a scorpion, 249

Suleiman Mirza, 90

Summer palace, 372

Sunset gun, 284

Sunstroke, dangers of, 375

Supposed lioness, 35

Surmeh, 260

Susmani girls, 114

Susmanis, 108

Swamp, shooting in a, 117

Swollen eyes, 213

Syudabad Pass, 101

Syud at Kasvin, 208 Houssein, 71

Syuds, dress of, 320

Hassan and Houssein, 153 the three, their fate, 156

T⸺, Mr., 27

Tabriz maund, 220

Tager, 188

Takhtrowan, 368

Taking quinine, 398

Talár, 57

Talisman, 290

Talking lark, 94

Tame pigs, 302

Tame gazelle, 167 lion, 306 partridges, 308

Tanks, 198

Tannūr or oven, 335

Tarantass, 12

Tarantulas, 248

Tattooing, 323

Tax-man at Dehbeed, 133

Tax of turkeys, 144

Taylor, Consul, 212

Taziana, the, 380

Tazzia, 279

Tazzias, dervishes at, 281

T-cloths, marks on, 194

Teachers of religion and law, 338

Teetotaler, a, 380

Teheran, 28, 372 races, 214

Teleet, 136

Telega, 11

Telegraph office, 198 flight of Baabi women to, 154

Telegraph poles, wooden, 80

Temple at Kangawar, 107

Tenets of Baabis, 339

Tent for Tazzia, 280 pitching, 399

Tents, 107

“The Sticks,” 377

Thief-catching, 85

Thieves, gang of, 269

Thorns in feet, 267

Tiflis, 14, 17

“Tiger’s boy,” 341

Tiled dome, 196 halls, 197 mosque, 197

Tile inscription, 177 work gates, 372

Titles, 38, 289

Tobeh, 388

Toffee, expensive, 80

Token, custom of the, 250

Tomb of Cyrus, 355 Esther and Mordecai, 75 Hafiz, 279 Saadi, 278

Tombs of the Kings, 119

Tombstone bridges, 163

Toolahs, 306

Trade credits, 188 in Teheran, 373

Traders, economy of, 172

Trades, 197

Traffic in drink in Julfa, 141

Transit of Venus, 331

Trap-horses, 352

Travellers’ law, 132

Travelling in Persia, 413 when ill, 208

Treasure finding, 76 of Darius, 78

trove in Julfa, 361

Trebizonde, 212 to Teheran, 213

Trees, sacred, 364

Tsaritzin, 406

Tumbakū, 30

Tūmbūn, 324

Turkeys, 375 in Julfa, 144

Turkish barber, 6 chibouques, 6 coffee-houses, 6 saddle, 7 use of, 24

Turkomanchai, 27

Turkoman horses, 104

Uncleanliness of Armenians, 316

Ungrateful baker, an, 183

Uniform, I appear in, 48 in Russia, 15

Unleavened bread, 335

Unripe fruit, eating of, 168

Ussher on the Meana bug, 217 tomb of Cyrus, 355

Ussher’s description of Persepolis, 217

Usury, 192

Utū-Kesh, 191, 333

Vaccination, 363

Vails, 68

Valliāt, 366

Valley of Yezdikhast, 261

Value of land, 175

Van cats, 305

Variable climate, 339

Varieties of kabob, 297

Vassilliardes, M., 401

Vegetables, 170, 300

Vegetation near Caspian, 400

Veil, the, 325

Venus, transit of, 331

Vienna, stay in, 4

Virgin, Pass of the, 350

Virtuoso, story of a, 37

Visit to Baabis, 201 Imād-u-Dowlet, 112

Visits, Persian, 28

Viticulture, 310

Volga, the, 405

W , Mr., 133

Wages of servants, 67

Walker’s road, 350

Walling up alive, wholesale, 203

Walton, Mr. H. V., 137, 167

Want of roads, 248

Washerman, the, 333

Watch-dogs, 306

Watch-towers, 177

Water-fowl, 301

Water-melons, 169

Water of Shiraz, 241

Water-pipes, 29

Wedding of Kasim, 282

We find treasure, 80

Weighing, 221 corn, 192

Weights, 220

Well of death, the, 275

Wheat, 174

White eunuch, 39

Wholesale and retail, 188

walling up alive, 203

Wild asparagus, 168 ass, the, 308 ducks, 176 flowers, 173 geese, 116 pig, 177 sow, 178

Wine, Cholar, 229 cost of, 234 jars, 230

Kerman, 235 Kishmish, 159 making, 232 mode of packing, 236 purity of, 235 sellers, Armenian, 142 Shiraz, 229 varieties of, 235

Winter room, my, 206

Wisdom of a judge, 184

Women, bastinadoed, 122 costume of, 323 educated, 339 execution of two, 122 hair of, 323 head-dress of, 131 of Shiraz, intrigues of, 276 out-door dress of, 325

Women, sentimentality of, 339

Woodcut, Persian facsimile, 287

Wrestling, 98

X , Mr., 330

Yabū, 107, 348

Yakhjal, 240

Yapunjah, 319

Yari Khan, 78

Yarns, 329

Yezd, 162 marble, 114, 276

nammads, 152

Yezdikhast, 261, 357

Yezeed, 283

Yezeedis, 126

Young pigs, 178

Zalābi, 284

Zambūreks, 52

Zangi, Spring of, 241

Zenda Rūd, 135, 193

Zerejumah, 317

Zergūn, 260, 354

Zil-es-Sultan, 146, 154, 203, 205, 365 accident to, 255 and his dogs, 366 and the bear, 227 boat of, 248 character of, 366 conversation with, 155 dress of, 257 his kalāat, 258 illnesses of, 149 petition to, 155 politeness of, 366 procession of, 256 prospects of, 199 rudeness of, 367

Zinjan, 154, 272

Zoban-i-Gūngishk, 359

Zoological Gardens, 35

THE END.

WARD, LOCK AND CO., LONDON AND NEW YORK.

BY THE SAME AUTHOR.

PERSIA AS IT IS.

B S M P L

C.

“Qualified by residence, knowledge, and popularity, Dr. Wills draws for us a most interesting picture of the Persians, their outer and inner life. This book is utterly unaffected and full of keen observation.”— The Spectator.

“Dr. Wills has done most acceptable work in giving us a second volume of life and manners in Persia.”—The Academy.

“These bright sketches of Persian life form a worthy continuation of the preceding volume, and augur a successful career in the paths already trodden.”—The Athenæum.

JOHN SQUIRE’S SECRET.

“The narrative is always bright. Whether the author is describing a dinner-party in Shiraz, or a Fourth of June at Eton, he is always readable; there is no doubt that he has written an amusing and ingenious story.”—St. James’s Gazette.

“There is delightful easy-going reading in Mr. C. J. Wills’ new novel.... Interesting sketches drawn from sporting and fashionable life, ... a pretty love story such as one finds in a comedy of manners, and all these elements are blended with a skill that is none the less praiseworthy because it nowhere shows traces of effort.... Sure to be widely read.”—Scotsman.

“A rollicking story.... Mr. Wills’ undeniable vivacity.”—The Times.

THE PIT TOWN CORONET.

Cheap Edition, 2s. 6d. Cloth. Just out.

“The characters are all alive, the conversations are exceedingly bright and natural; there is in the novel a genuine vein of somewhat pungent humour, and the style has for the most part both vigour and accuracy.”—Spectator.

“‘The Pit Town Coronet’ is the best of a batch of novels now lying before us.”—World.

“There is no denying the author’s power any more than his gift of humour. The village scenes are inimitable, and so is Mrs. Dodd, the masterful parson’s wife—her Dorcas Meeting is exquisitely droll.... An exciting story.”—Academy.

“‘The Pit Town Coronet’ is both interesting and well written.”— Athenæum.

THE GREAT DORÉMI.

“Ingenious, fanciful, and even fascinating.”—Sunday Times.

“A captivating romance.”—Evening News.

“The incidents are humorously described, and the music is tempered with melodrama—love, jealousy, and suicide.”—St. James’s Gazette.

“The interest is sustained from cover to cover.”—Vanity Fair

I C W F. C. PHILIPS.

1. THE SCUDAMORES.

2. THE FATAL PHRYNE; , L’ O.

3. SIBYL ROSS’S MARRIAGE.

4. A MAIDEN FAIR TO SEE.

Illustrated by G. A. STOREY, A.R.A.

JARDYNE’S WIFE.

A Novel in 3 Vols., price 31s. 6d. B C. J. WILLS. Now Ready.

Important

Illustrated Works by the Editor of the “Minerva Library.”

Royal 8vo, 980 pages, cloth gilt. Price 7s. 6d.

THE WORLD’S INHABITANTS.

A popular account of the Races and Peoples of the world on a geographical basis, with pithy accounts of the past history of each important race or country.

WITH NEARLY NINE HUNDRED ILLUSTRATIONS.

“Popular, but at the same time astonishingly accurate. Many subjects not generally mastered by any but specialists find intelligent treatment.”—Scottish Leader.

“In every way both amusing and instructive.”—Graphic.

“Not only full of instruction for the general reader, but replete with valuable facts for the anthropologist, the sociologist, and the historian.”—Manchester Examiner.

“It, or its method, should certainly be studied by students of geography.”—Athenæum.

Uniform with the above, 988 pages, royal 8vo. Price 7s. 6d.

THE WORLD’S RELIGIONS.

Being a popular account of Religions Ancient and Modern.

WITH UPWARDS OF THREE HUNDRED ILLUSTRATIONS.

“No less surprising a monument of industry and research than its predecessor Cannot be too highly praised for its compendiousness and completeness.”—Daily Telegraph.

“A work of enormous research.... Distinguished by absolute impartiality and judicious selection.”—Echo.

“The reader’s attention is held from beginning to end.”—London Quarterly Review.

“Very valuable as a book of reference.”—Spectator.

“It is wonderful how well and accurately Mr. Bettany has done his work.”—British Weekly.

“A library in itself.”—Christian Age.

AN INEXPENSIVE LIBRARY OF INDISPENSABLE BOOKS.

THE MINERVA LIBRARY OF FAMOUS BOOKS.

An Illustrated Series of first-class Books, averaging from 400 to 600 pages, strongly and attractively bound in cloth, PRICE TWO SHILLINGS EACH VOLUME, WITH CUT OR UNCUT EDGES.

In Half-Calf or Half-Morocco, Price Five Shillings each Volume.

The Design and Plan of the MINERVA LIBRARY OF FAMOUS BOOKS have been amply justified by the remarkable favour with which it has been received by the press and the public. The design is to provide at the lowest possible cost books which every intelligent reader will wish to possess in a form readable, attractive, and lasting. The issue at monthly intervals, not so frequent as to distract, not so intermittent as to lose the advantage of regularity, enables readers to add to their library at an almost imperceptible cost. Thus for about one pound a year, every man may form a library which will afford an ever-increasing source of gratification and cultivation to himself and his family. There is no doubt, as in buying the novelties of the day, as to whether the new volume will prove to be of permanent value and interest. It will have already stood the test of time and of good critics, though frequently it may have been unattainable except at a heavy cost. T M L includes only works of widespread popularity, which have proved themselves worthy of a permanent place in literature.

Variety is studied in the selection of books, so that all classes of the best literature of all nations may be represented. The adoption of the name “Minerva” is justified by the abundant wisdom, thought, and imaginative and inventive power which the books will be found to contain.

Each volume contains an introduction by the Editor, in which a biography of the author, or critical or explanatory notes, place the reader in sympathy with the author and his work. In some of the books additional elucidations and illustrations of the text are given, and in others side-notes indicate the subjects of the paragraphs.

The number of separate Plates as well as illustrations in the text forms a marked feature of the series. As far as possible an authentic portrait of every author is given. An inspection of the books only is needed to make their attractiveness evident.

Every Englishman who reads and thinks, and wishes to possess the BEST BOOKS, should have every book in the Minerva Library.

The Youth beginning to form a Library of books for lifelong companionship cannot do better than subscribe to the Minerva Library.

Schools, Mechanics, and Village Libraries, and literary institutions of all kinds, should provide themselves with a number of copies of this inexpensive library of indispensable books.

The Artisan and the Shop Assistant will find their means and opportunities consulted in this series. They cannot buy the best books in the English language in a better and cheaper form combined.

Naturally every Englishman wants to possess the choice works of the greatest Englishmen; and to complete his ideas as a citizen of the world, he needs a selection of the greatest writings of the geniuses of other countries. Both these wants it is the object of the Minerva Library to supply.

Volume I.—Ninth Edition.

CHARLES DARWIN’S JOURNAL During the Voyage of H.M.S.

“Beagle” round the World. With a Biographical Introduction by the Editor, Portrait of Darwin, and Illustrations.

“‘The Minerva Library,’ the new venture of Messrs. Ward, Lock & Co. has made an excellent start.... No better volumes could be chosen for popular reading of a healthy sort than ‘Darwin’s Journal of Researches during the Voyage of the Beagle,’ and ‘Borrow’s Bible in Spain.’ The paper is good, the type is tolerable, the binding is in excellent taste, and the price is extremely low.”—Athenæum.

Volume II.—Fourth Edition.

THE INGOLDSBY LEGENDS. With a Critical Introduction by the Editor, Portrait of the Author, and reproductions of the celebrated Illustrations by P and C.

“This series, which is edited by Mr. G T. Bettany, is neatly bound, well illustrated, and nicely printed.”—Graphic.

“The determination of the publishers of the ‘Minerva Library’ to render the series attractive and representative of English literature of all kinds, is strikingly displayed in this volume.... The book is well printed and bound, and will be eagerly welcomed by all desiring to obtain at a small cost a good edition of the works of the famous humourist.”—Liverpool Courier.

Volume III.—Third Edition.

BORROW’S BIBLE IN SPAIN: The Journeys, Adventures, and Imprisonments of an Englishman, in an attempt to circulate the Scriptures in the Peninsula. By G B, Author of “The Gipsies of Spain.” With a Biographical Introduction by the Editor, and Illustrations.

“Lovers of good literature and cheap may be commended to the ‘Minerva Library’ Edition of ‘The Bible in Spain,’ edited by Mr. G. T.

Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.