100% found this document useful (4 votes)
32 views

Full Download Learning Reactive Programming with Java 8 1st Edition Nickolay Tsvetinov PDF DOCX

Nickolay

Uploaded by

kutalmrert
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
100% found this document useful (4 votes)
32 views

Full Download Learning Reactive Programming with Java 8 1st Edition Nickolay Tsvetinov PDF DOCX

Nickolay

Uploaded by

kutalmrert
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 38

Download Full ebookname - Read Now at ebookname.

com

Learning Reactive Programming with Java 8 1st


Edition Nickolay Tsvetinov

https://ebookname.com/product/learning-reactive-programming-
with-java-8-1st-edition-nickolay-tsvetinov/

OR CLICK BUTTON

DOWLOAD EBOOK

Discover More Ebook - Explore Now at ebookname.com


Instant digital products (PDF, ePub, MOBI) available
Download now and explore formats that suit you...

Pro Java 8 Programming 3rd Edition Terrill Brett Spell

https://ebookname.com/product/pro-java-8-programming-3rd-edition-
terrill-brett-spell/

ebookname.com

Functional Reactive Programming 1st Edition Stephen


Blackheath

https://ebookname.com/product/functional-reactive-programming-1st-
edition-stephen-blackheath/

ebookname.com

Practical Database Programming with Java 1st Edition Ying


Bai

https://ebookname.com/product/practical-database-programming-with-
java-1st-edition-ying-bai/

ebookname.com

Themes in Speculative Psychology Nehemiah Jordan

https://ebookname.com/product/themes-in-speculative-psychology-
nehemiah-jordan/

ebookname.com
Prelude to the Monsoon Assignment in Sumatra G. F. Jacobs

https://ebookname.com/product/prelude-to-the-monsoon-assignment-in-
sumatra-g-f-jacobs/

ebookname.com

C21 Communicating in the 21st century 3rd Edition Baden


Eunson

https://ebookname.com/product/c21-communicating-in-the-21st-
century-3rd-edition-baden-eunson/

ebookname.com

Student Centered Coaching A Guide for K 8 Coaches and


Principals 1st Edition Diane Sweeney

https://ebookname.com/product/student-centered-coaching-a-guide-
for-k-8-coaches-and-principals-1st-edition-diane-sweeney/

ebookname.com

The Law of Obligations Connections and Boundaries 2nd


Edition Andrew Robertson

https://ebookname.com/product/the-law-of-obligations-connections-and-
boundaries-2nd-edition-andrew-robertson/

ebookname.com

Deviant Burial in the Archaeological Record 1st Edition


Eileen M. Murphy

https://ebookname.com/product/deviant-burial-in-the-archaeological-
record-1st-edition-eileen-m-murphy/

ebookname.com
Thermoelectric Skutterudites 1st Edition Ctirad Uher

https://ebookname.com/product/thermoelectric-skutterudites-1st-
edition-ctirad-uher/

ebookname.com
Table of Contents
Learning Reactive Programming with Java 8
Credits
About the Author
About the Reviewers
www.PacktPub.com
Support files, eBooks, discount offers, and more
Why subscribe?
Free access for Packt account holders
Preface
What this book covers
What you need for this book
Who this book is for
Conventions
Reader feedback
Customer support
Downloading the example code
Errata
Piracy
Questions
1. An Introduction to Reactive Programming
What is reactive programming?
Why should we be reactive?
Introducing RxJava
Downloading and setting up RxJava
Comparing the iterator pattern and the RxJava Observable
Implementing the reactive sum
Summary
2. Using the Functional Constructions of Java 8
Lambdas in Java 8
Introducing the new syntax and semantics
Functional interfaces in Java 8 and RxJava
Implementing the reactive sum example with lambdas
Pure functions and higher order functions
Pure functions
Higher order functions
RxJava and functional programming
Summary
3. Creating and Connecting Observables, Observers, and Subjects
The Observable.from method
The Observable.just method
Other Observable factory methods
The Observable.create method
Subscribing and unsubscribing
Hot and cold Observable instances
The ConnectableObservable class
The Subject instances
Summary
4. Transforming, Filtering, and Accumulating Your Data
Observable transformations
Transformations with the various flatMap operators
Grouping items
Additional useful transformation operators
Filtering data
Accumulating data
Summary
5. Combinators, Conditionals, and Error Handling
Combining the Observable instances
The zip operator
The combineLatest operator
The merge operator
The concat operator
The conditional operators
The amb operator
The takeUntil(), takeWhile(), skipUntil(), and skipWhile()
conditional operators
The defaultIfEmpty( ) operator
Handling errors
The return and resume operators
The retrying technique
An HTTP client example
Summary
6. Using Concurrency and Parallelism with Schedulers
RxJava's schedulers
Debugging Observables and their schedulers
The interval Observable and its default scheduler
Types of schedulers
The Schedulers.immediate scheduler
The Schedulers.trampoline scheduler
The Schedulers.newThread scheduler
The Schedulers.computation scheduler
The Schedulers.io scheduler
The Schedulers.from(Executor) method
Combining Observables and schedulers
The Observable<T> subscribeOn(Scheduler) method
The Observable<T> observeOn(Scheduler) operator
Parallelism
Buffering, throttling, and debouncing
Throttling
Debouncing
The buffer and window operators
The backpressure operators
Summary
7. Testing Your RxJava Application
Testing using simple subscription
The BlockingObservable class
The aggregate operators and the BlockingObservable class
Testing with the aggregate operators and the BlockingObservable
class
Using the TestSubscriber class for in-depth testing
Testing asynchronous Observable instances with the help of the
TestScheduler class
Summary
8. Resource Management and Extending RxJava
Resource management
Introducing the Observable.using method
Caching data with Observable.cache
Creating custom operators with lift
Composing multiple operators with the Observable.compose
operator
Summary
Index
Learning Reactive
Programming with Java 8
Learning Reactive
Programming with Java 8
Copyright © 2015 Packt Publishing

All rights reserved. No part of this book may be reproduced, stored in


a retrieval system, or transmitted in any form or by any means,
without the prior written permission of the publisher, except in the
case of brief quotations embedded in critical articles or reviews.

Every effort has been made in the preparation of this book to ensure
the accuracy of the information presented. However, the information
contained in this book is sold without warranty, either express or
implied. Neither the author, nor Packt Publishing, and its dealers and
distributors will be held liable for any damages caused or alleged to
be caused directly or indirectly by this book.

Packt Publishing has endeavored to provide trademark information


about all of the companies and products mentioned in this book by
the appropriate use of capitals. However, Packt Publishing cannot
guarantee the accuracy of this information.

First published: June 2015

Production reference: 1170615

Published by Packt Publishing Ltd.

Livery Place

35 Livery Street

Birmingham B3 2PB, UK.

ISBN 978-1-78528-872-2
www.packtpub.com
Credits
Author

Nickolay Tsvetinov

Reviewers

Samuel Gruetter

Dávid Karnok

Timo Tuominen

Shixiong Zhu

Commissioning Editor

Veena Pagare

Acquisition Editor

Larrisa Pinto

Content Development Editor

Adrian Raposo

Technical Editor

Abhishek R. Kotian

Copy Editors

Brandt D'mello

Neha Vyas
Project Coordinator

Sanchita Mandal

Proofreader

Safis Editing

Indexer

Mariammal Chettiyar

Production Coordinator

Conidon Miranda

Cover Work

Conidon Miranda
About the Author
Nickolay Tsvetinov is a professional all-round web developer at
TransportAPI—Britain's first comprehensive open platform for
transport solutions. During his career as a software developer, he
experienced both good and bad and played with most of the popular
programming languages—from C and Java to Ruby and JavaScript.
For the last 3-4 years, he's been creating and maintaining single-
page applications (SPA) and the backend API architectures that
serve them. He is a fan of open source software, Rails, Vim, Sinatra,
Ember.js, Node.js, and Nintendo. He was an unsuccessful musician
and poet, but he is a successful husband and father. His area of
interest and expertise includes the declarative/functional and
reactive programming that resulted in the creation of ProAct.js
(http://proactjs.com), which is a library that augments the JavaScript
language and turns it into a reactive language.

First of all, I want to thank my wife, Tanya. I wrote this book


because she told me that I was capable of doing this. She was
with me all these months; I worked late at night and on
weekends, but she didn't mind that. She also helped me with the
content of this book. Thank you, Tanya; I love you and I dedicate
this book to you. I want to thank my baby girl, Dalia. She is the
one who makes me learn and do new things. One day, I want her
to be proud of me—she is my sun. I want to thank my colleagues
from TransportAPI, especially Dave, who helped me with my
English, and Jonathan and Martin, who gave me the courage to
finish the book.

I want to thank Astea Solutions, as they gave me space to write,


as well as my parents, Georgi and Dimana, who did the same for
me on weekends. Finally, I want to thank all my friends who
supported me—Simeon, Rosen, Deyan, Pavel, my sister, Marina,
and many more.
Thank you!
About the Reviewers
Samuel Gruetter holds a BSc degree in computer science from
École Polytechnique Fédérale de Lausanne (EPFL), Switzerland. As
a student assistant and member of the Scala team at EPFL, he
developed RxScala, which is a Scala adaptor for the RxJava
Reactive Extensions library. In this way, he contributed to RxJava.
He was also a teaching assistant for the Principles of Reactive
Programming massive open online course on Coursera, which is the
first online course on reactive programming.

Dávid Karnok is a research assistant and PhD student at the


Research Laboratory on Engineering and Management Intelligence
of the Institute for Computer Science and Control of the Hungarian
Academy of Sciences.

He has been working with Java and related core technologies since
2005 to bring Java's benefits to manufacturing and logistic
companies.

He was the first to port Microsoft's Rx.NET framework to Java back


in 2010; however, the concept was so ahead of its time that his
library didn't catch much attention until Netflix came out with the
independent RxJava port in 2013. He joined the project not much
later and is a core collaborator and has contributed to about 30
percent of the code in the library over the years. With several years
of reactive programming experience and as a core developer of
RxJava, he frequently answers questions about the library on Stack
Overflow, where he reviews pull requests on the RxJava GitHub
project page and posts bug fixes and enhancements on a regular
basis.

Timo Tuominen develops large-scale software projects from


conception to completion for clients, including major telcos and
device manufacturers. As the technical lead, he has created dozens
of products and services both for consumer and business use.
Working with Futurice, he started using RxJava in 2013 and
designed one of the first pure RxJava architectures on Android. His
novel approach was a result of the uncompromising functional
reactive programming principles that he applied to an existing
platform. Several apps and thousands of code commits later, he is
now convinced that RxJava and FRP represent a new and better
way to build software.

I would like to dedicate this book to everyone who has put up


with my RxJava innovations.

Shixiong Zhu is an RxJava committer and also maintains the


RxScala project. He received his master's of science degree in
computer science from Peking University, China. After that, he joined
MicroStrategy and worked on several big data projects. He has also
worked on the infrastructure team at Xiaomi. Currently, he is living in
Beijing and working on the Apache Spark project, which is a fast and
general platform for large-scale data processing.
www.PacktPub.com
Support files, eBooks, discount
offers, and more
For support files and downloads related to your book, please visit
www.PacktPub.com.

Did you know that Packt offers eBook versions of every book
published, with PDF and ePub files available? You can upgrade to
the eBook version at www.PacktPub.com and as a print book
customer, you are entitled to a discount on the eBook copy. Get in
touch with us at <service@packtpub.com> for more details.

At www.PacktPub.com, you can also read a collection of free


technical articles, sign up for a range of free newsletters and receive
exclusive discounts and offers on Packt books and eBooks.

https://www2.packtpub.com/books/subscription/packtlib

Do you need instant solutions to your IT questions? PacktLib is


Packt's online digital book library. Here, you can search, access, and
read Packt's entire library of books.

Why subscribe?
Fully searchable across every book published by Packt
Copy and paste, print, and bookmark content
On demand and accessible via a web browser
Free access for Packt account holders
If you have an account with Packt at www.PacktPub.com, you can
use this to access PacktLib today and view 9 entirely free books.
Simply use your login credentials for immediate access.
Preface
Reactive programming has been around for decades. There has
been a few implementations of reactive programming from the time
Smalltalk was a young language. However, it has only become
popular recently and it is now becoming a trend. Why now you ask?
Because it is good for writing fast, real-time applications and current
technologies and the Web demand this.

I got involved in it back in 2008, when the team I was part of was
developing a multimedia book creator called Sophie 2. It had to be
fast and responsive so we created a framework called Prolib, which
provided objects with properties which could depend on each other
(in other words, we implemented bindings for Swing and much more
—transformations, filtering, and so on). It felt natural to wire the
model data to the GUI like this.

Of course, this was far away from the functional-like approach that
comes with RX. In 2010, Microsoft released RX and, after that,
Netflix ported it to Java—RxJava. However, Netflix released RxJava
to the open source community and the project became a huge
success. Many other languages have their port of RX and many
alternatives to it. Now, you can code using reactive programming on
your Java backend and wire it to your RxJava's frontend.

This book tries to explain to you what reactive programming is all


about and how to use it with RxJava. It has many small examples
and it explains concepts and API details in small steps. After reading
this book, you will have an idea of RxJava, functional programming,
and the reactive paradigm.
What this book covers
Chapter 1, An Introduction to Reactive Programming, will introduce
you to the concept of reactive programming and will tell you why you
should learn about it. This chapter contains examples that
demonstrate how RxJava incorporates the reactive programming
concept.

Chapter 2, Using the Functional Constructions of Java 8, will teach


you how to use the new lambda constructions of Java 8. It will
explain some functional programming concepts and will show you
how to use them with RxJava in your reactive programs.

Chapter 3, Creating and Connecting Observables, Observers, and


Subjects, will show you the basic building blocks of the RxJava
library called the Observables. You will learn the difference between
'hot' and 'cold' Observables and how to subscribe to and
unsubscribe from them using a subscription instance.

Chapter 4, Transforming, Filtering, and Accumulating Your Data, will


walk you through the basic reactive operators, which you will learn
how to use to achieve step-by-step computations. This chapter will
give you an idea of how to transform the events the Observables
emit, how to filter only the data we need, and how to group,
accumulate, and process it.

Chapter 5, Combinators, Conditionals, and Error Handling, will


present you with more complex reactive operators, which will allow
you to master observable chaining. You will learn about the
combining and conditional operators and how the Observables
interact with each other. This chapter demonstrates the different
approaches to error handling.

Chapter 6, Using Concurrency and Parallelism with Schedulers, will


guide you through the process of writing concurrent and parallel
programs with RxJava. This will be accomplished by the RxJava
Schedulers. The types of Schedulers will be introduced and you will
come to know when and why to use each one of them. This chapter
will present you with a mechanism that will show you how to avoid
and apply backpressure.

Chapter 7, Testing Your RxJava Application, will show you how to


unit test your RxJava applications.

Chapter 8, Resource Management and Extending RxJava, will teach


you how to manage the resources used as data sources by your
RxJava applications. We will write our own Observable operators
here.
What you need for this book
In order to run the examples, you will need:

Java 8 installed, which you can download from Oracle's site


http://www.oracle.com/technetwork/java/javase/downloads/jdk8-
downloads-2133151.html
Gradle to build the project—2.x, which you can download from
https://gradle.org/downloads
Eclipse to open the project. You will also need the Gradle plugin
for Eclipse, which can be downloaded from the Eclipse
MarketPlace. Of course, you can use Gradle from the command
line and go through the code with Vim or any other arbitrary text
editor
Who this book is for
If you are a Java developer who knows how to write software and
would like to learn how to apply your existing skills to reactive
programming, this book is for you.

This book can be helpful to anybody no matter if they are beginners,


advanced programmers, or even experts. You don't need to have
any experience with either Java 8's lambdas and streams or with
RxJava.
Conventions
In this book, you will find a number of text styles that distinguish
between different kinds of information. Here are some examples of
these styles and an explanation of their meaning.

Code words in text, database table names, folder names, filenames,


file extensions, pathnames, dummy URLs, user input, and Twitter
handles are shown as follows: "We can include other contexts
through the use of the include directive."

A block of code is set as follows:

Observable
.just('R', 'x', 'J', 'a', 'v', 'a')
.subscribe(
System.out::print,
System.err::println,
System.out::println
);

When we wish to draw your attention to a particular part of a code


block, the relevant lines or items are set in bold:

Observable<Object> obs = Observable


.interval(40L, TimeUnit.MILLISECONDS)
.switchMap(v ->
Observable
.timer(0L, 10L, TimeUnit.MILLISECONDS)
.map(u -> "Observable <" + (v + 1) + "> : "
+ (v + u)))
);
subscribePrint(obs, "switchMap");

New terms and important words are shown in bold. Words that you
see on the screen, for example, in menus or dialog boxes, appear in
the text like this: "Interfaces of this type are called functional
interfaces."
Note
Warnings or important notes appear in a box like this.

Tip
Tips and tricks appear like this.
Reader feedback
Feedback from our readers is always welcome. Let us know what
you think about this book—what you liked or disliked. Reader
feedback is important for us as it helps us develop titles that you will
really get the most out of.

To send us general feedback, simply e-mail


<feedback@packtpub.com>, and mention the book's title in the subject
of your message.

If there is a topic that you have expertise in and you are interested in
either writing or contributing to a book, see our author guide at
www.packtpub.com/authors.
Customer support
Now that you are the proud owner of a Packt book, we have a
number of things to help you to get the most from your purchase.

Downloading the example code


You can download the example code files from your account at
http://www.packtpub.com for all the Packt Publishing books you have
purchased. If you purchased this book elsewhere, you can visit
http://www.packtpub.com/support and register to have the files e-
mailed directly to you.

Errata
Although we have taken every care to ensure the accuracy of our
content, mistakes do happen. If you find a mistake in one of our
books—maybe a mistake in the text or the code—we would be
grateful if you could report this to us. By doing so, you can save
other readers from frustration and help us improve subsequent
versions of this book. If you find any errata, please report them by
visiting http://www.packtpub.com/submit-errata, selecting your book,
clicking on the Errata Submission Form link, and entering the
details of your errata. Once your errata are verified, your submission
will be accepted and the errata will be uploaded to our website or
added to any list of existing errata under the Errata section of that
title.

To view the previously submitted errata, go to


https://www.packtpub.com/books/content/support and enter the
name of the book in the search field. The required information will
appear under the Errata section.

Piracy
Random documents with unrelated
content Scribd suggests to you:
1.E.4. Do not unlink or detach or remove the full Project
Gutenberg™ License terms from this work, or any files
containing a part of this work or any other work associated with
Project Gutenberg™.

1.E.5. Do not copy, display, perform, distribute or redistribute


this electronic work, or any part of this electronic work, without
prominently displaying the sentence set forth in paragraph 1.E.1
with active links or immediate access to the full terms of the
Project Gutenberg™ License.

1.E.6. You may convert to and distribute this work in any binary,
compressed, marked up, nonproprietary or proprietary form,
including any word processing or hypertext form. However, if
you provide access to or distribute copies of a Project
Gutenberg™ work in a format other than “Plain Vanilla ASCII” or
other format used in the official version posted on the official
Project Gutenberg™ website (www.gutenberg.org), you must,
at no additional cost, fee or expense to the user, provide a copy,
a means of exporting a copy, or a means of obtaining a copy
upon request, of the work in its original “Plain Vanilla ASCII” or
other form. Any alternate format must include the full Project
Gutenberg™ License as specified in paragraph 1.E.1.

1.E.7. Do not charge a fee for access to, viewing, displaying,


performing, copying or distributing any Project Gutenberg™
works unless you comply with paragraph 1.E.8 or 1.E.9.

1.E.8. You may charge a reasonable fee for copies of or


providing access to or distributing Project Gutenberg™
electronic works provided that:

• You pay a royalty fee of 20% of the gross profits you


derive from the use of Project Gutenberg™ works
calculated using the method you already use to calculate
your applicable taxes. The fee is owed to the owner of the
Project Gutenberg™ trademark, but he has agreed to
donate royalties under this paragraph to the Project
Gutenberg Literary Archive Foundation. Royalty payments
must be paid within 60 days following each date on which
you prepare (or are legally required to prepare) your
periodic tax returns. Royalty payments should be clearly
marked as such and sent to the Project Gutenberg Literary
Archive Foundation at the address specified in Section 4,
“Information about donations to the Project Gutenberg
Literary Archive Foundation.”

• You provide a full refund of any money paid by a user


who notifies you in writing (or by e-mail) within 30 days of
receipt that s/he does not agree to the terms of the full
Project Gutenberg™ License. You must require such a user
to return or destroy all copies of the works possessed in a
physical medium and discontinue all use of and all access
to other copies of Project Gutenberg™ works.

• You provide, in accordance with paragraph 1.F.3, a full


refund of any money paid for a work or a replacement
copy, if a defect in the electronic work is discovered and
reported to you within 90 days of receipt of the work.

• You comply with all other terms of this agreement for free
distribution of Project Gutenberg™ works.

1.E.9. If you wish to charge a fee or distribute a Project


Gutenberg™ electronic work or group of works on different
terms than are set forth in this agreement, you must obtain
permission in writing from the Project Gutenberg Literary
Archive Foundation, the manager of the Project Gutenberg™
trademark. Contact the Foundation as set forth in Section 3
below.

1.F.
1.F.1. Project Gutenberg volunteers and employees expend
considerable effort to identify, do copyright research on,
transcribe and proofread works not protected by U.S. copyright
law in creating the Project Gutenberg™ collection. Despite these
efforts, Project Gutenberg™ electronic works, and the medium
on which they may be stored, may contain “Defects,” such as,
but not limited to, incomplete, inaccurate or corrupt data,
transcription errors, a copyright or other intellectual property
infringement, a defective or damaged disk or other medium, a
computer virus, or computer codes that damage or cannot be
read by your equipment.

1.F.2. LIMITED WARRANTY, DISCLAIMER OF DAMAGES - Except


for the “Right of Replacement or Refund” described in
paragraph 1.F.3, the Project Gutenberg Literary Archive
Foundation, the owner of the Project Gutenberg™ trademark,
and any other party distributing a Project Gutenberg™ electronic
work under this agreement, disclaim all liability to you for
damages, costs and expenses, including legal fees. YOU AGREE
THAT YOU HAVE NO REMEDIES FOR NEGLIGENCE, STRICT
LIABILITY, BREACH OF WARRANTY OR BREACH OF CONTRACT
EXCEPT THOSE PROVIDED IN PARAGRAPH 1.F.3. YOU AGREE
THAT THE FOUNDATION, THE TRADEMARK OWNER, AND ANY
DISTRIBUTOR UNDER THIS AGREEMENT WILL NOT BE LIABLE
TO YOU FOR ACTUAL, DIRECT, INDIRECT, CONSEQUENTIAL,
PUNITIVE OR INCIDENTAL DAMAGES EVEN IF YOU GIVE
NOTICE OF THE POSSIBILITY OF SUCH DAMAGE.

1.F.3. LIMITED RIGHT OF REPLACEMENT OR REFUND - If you


discover a defect in this electronic work within 90 days of
receiving it, you can receive a refund of the money (if any) you
paid for it by sending a written explanation to the person you
received the work from. If you received the work on a physical
medium, you must return the medium with your written
explanation. The person or entity that provided you with the
defective work may elect to provide a replacement copy in lieu
of a refund. If you received the work electronically, the person
or entity providing it to you may choose to give you a second
opportunity to receive the work electronically in lieu of a refund.
If the second copy is also defective, you may demand a refund
in writing without further opportunities to fix the problem.

1.F.4. Except for the limited right of replacement or refund set


forth in paragraph 1.F.3, this work is provided to you ‘AS-IS’,
WITH NO OTHER WARRANTIES OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
MERCHANTABILITY OR FITNESS FOR ANY PURPOSE.

1.F.5. Some states do not allow disclaimers of certain implied


warranties or the exclusion or limitation of certain types of
damages. If any disclaimer or limitation set forth in this
agreement violates the law of the state applicable to this
agreement, the agreement shall be interpreted to make the
maximum disclaimer or limitation permitted by the applicable
state law. The invalidity or unenforceability of any provision of
this agreement shall not void the remaining provisions.

1.F.6. INDEMNITY - You agree to indemnify and hold the


Foundation, the trademark owner, any agent or employee of the
Foundation, anyone providing copies of Project Gutenberg™
electronic works in accordance with this agreement, and any
volunteers associated with the production, promotion and
distribution of Project Gutenberg™ electronic works, harmless
from all liability, costs and expenses, including legal fees, that
arise directly or indirectly from any of the following which you
do or cause to occur: (a) distribution of this or any Project
Gutenberg™ work, (b) alteration, modification, or additions or
deletions to any Project Gutenberg™ work, and (c) any Defect
you cause.
Section 2. Information about the Mission
of Project Gutenberg™
Project Gutenberg™ is synonymous with the free distribution of
electronic works in formats readable by the widest variety of
computers including obsolete, old, middle-aged and new
computers. It exists because of the efforts of hundreds of
volunteers and donations from people in all walks of life.

Volunteers and financial support to provide volunteers with the


assistance they need are critical to reaching Project
Gutenberg™’s goals and ensuring that the Project Gutenberg™
collection will remain freely available for generations to come. In
2001, the Project Gutenberg Literary Archive Foundation was
created to provide a secure and permanent future for Project
Gutenberg™ and future generations. To learn more about the
Project Gutenberg Literary Archive Foundation and how your
efforts and donations can help, see Sections 3 and 4 and the
Foundation information page at www.gutenberg.org.

Section 3. Information about the Project


Gutenberg Literary Archive Foundation
The Project Gutenberg Literary Archive Foundation is a non-
profit 501(c)(3) educational corporation organized under the
laws of the state of Mississippi and granted tax exempt status
by the Internal Revenue Service. The Foundation’s EIN or
federal tax identification number is 64-6221541. Contributions
to the Project Gutenberg Literary Archive Foundation are tax
deductible to the full extent permitted by U.S. federal laws and
your state’s laws.

The Foundation’s business office is located at 809 North 1500


West, Salt Lake City, UT 84116, (801) 596-1887. Email contact
links and up to date contact information can be found at the
Foundation’s website and official page at
www.gutenberg.org/contact

Section 4. Information about Donations to


the Project Gutenberg Literary Archive
Foundation
Project Gutenberg™ depends upon and cannot survive without
widespread public support and donations to carry out its mission
of increasing the number of public domain and licensed works
that can be freely distributed in machine-readable form
accessible by the widest array of equipment including outdated
equipment. Many small donations ($1 to $5,000) are particularly
important to maintaining tax exempt status with the IRS.

The Foundation is committed to complying with the laws


regulating charities and charitable donations in all 50 states of
the United States. Compliance requirements are not uniform
and it takes a considerable effort, much paperwork and many
fees to meet and keep up with these requirements. We do not
solicit donations in locations where we have not received written
confirmation of compliance. To SEND DONATIONS or determine
the status of compliance for any particular state visit
www.gutenberg.org/donate.

While we cannot and do not solicit contributions from states


where we have not met the solicitation requirements, we know
of no prohibition against accepting unsolicited donations from
donors in such states who approach us with offers to donate.

International donations are gratefully accepted, but we cannot


make any statements concerning tax treatment of donations
received from outside the United States. U.S. laws alone swamp
our small staff.
Please check the Project Gutenberg web pages for current
donation methods and addresses. Donations are accepted in a
number of other ways including checks, online payments and
credit card donations. To donate, please visit:
www.gutenberg.org/donate.

Section 5. General Information About


Project Gutenberg™ electronic works
Professor Michael S. Hart was the originator of the Project
Gutenberg™ concept of a library of electronic works that could
be freely shared with anyone. For forty years, he produced and
distributed Project Gutenberg™ eBooks with only a loose
network of volunteer support.

Project Gutenberg™ eBooks are often created from several


printed editions, all of which are confirmed as not protected by
copyright in the U.S. unless a copyright notice is included. Thus,
we do not necessarily keep eBooks in compliance with any
particular paper edition.

Most people start at our website which has the main PG search
facility: www.gutenberg.org.

This website includes information about Project Gutenberg™,


including how to make donations to the Project Gutenberg
Literary Archive Foundation, how to help produce our new
eBooks, and how to subscribe to our email newsletter to hear
about new eBooks.
Welcome to our website – the ideal destination for book lovers and
knowledge seekers. With a mission to inspire endlessly, we offer a
vast collection of books, ranging from classic literary works to
specialized publications, self-development books, and children's
literature. Each book is a new journey of discovery, expanding
knowledge and enriching the soul of the reade

Our website is not just a platform for buying books, but a bridge
connecting readers to the timeless values of culture and wisdom. With
an elegant, user-friendly interface and an intelligent search system,
we are committed to providing a quick and convenient shopping
experience. Additionally, our special promotions and home delivery
services ensure that you save time and fully enjoy the joy of reading.

Let us accompany you on the journey of exploring knowledge and


personal growth!

ebookname.com

You might also like