Вы находитесь на странице: 1из 42

The Definitive Guide to AdonisJs:

Building Node.js Applications with


JavaScript Christopher Pitt
Visit to download the full and correct content document:
https://textbookfull.com/product/the-definitive-guide-to-adonisjs-building-node-js-appli
cations-with-javascript-christopher-pitt/
More products digital (pdf, epub, mobi) instant
download maybe you interests ...

The Definitive Guide to JSF in Java EE 8: Building Web


Applications with JavaServer Faces Bauke Scholtz

https://textbookfull.com/product/the-definitive-guide-to-jsf-in-
java-ee-8-building-web-applications-with-javaserver-faces-bauke-
scholtz/

Ultimate Node.js for Cross-Platform App Development:


Learn to Build Robust, Scalable, and Performant Server-
Side JavaScript Applications with Node.js (English
Edition) Kumar
https://textbookfull.com/product/ultimate-node-js-for-cross-
platform-app-development-learn-to-build-robust-scalable-and-
performant-server-side-javascript-applications-with-node-js-
english-edition-kumar/

JavaScript The Definitive Guide 7th Edition David


Flanagan

https://textbookfull.com/product/javascript-the-definitive-
guide-7th-edition-david-flanagan/

Building web and mobile ArcGIS Server applications with


JavaScript Lewin

https://textbookfull.com/product/building-web-and-mobile-arcgis-
server-applications-with-javascript-lewin/
Guide to Scientific Computing in C Pitt-Francis

https://textbookfull.com/product/guide-to-scientific-computing-
in-c-pitt-francis/

Understanding ECMAScript 6 The definitive guide for


Javascript developers 1st Edition Nicholas C. Zakas

https://textbookfull.com/product/understanding-ecmascript-6-the-
definitive-guide-for-javascript-developers-1st-edition-nicholas-
c-zakas/

Practical Bot Development: Designing and Building Bots


with Node.js and Microsoft Bot Framework Szymon Rozga

https://textbookfull.com/product/practical-bot-development-
designing-and-building-bots-with-node-js-and-microsoft-bot-
framework-szymon-rozga/

Pentesting Azure Applications The Definitive Guide to


Testing and Securing Deployments 1st Edition Matt
Burrough

https://textbookfull.com/product/pentesting-azure-applications-
the-definitive-guide-to-testing-and-securing-deployments-1st-
edition-matt-burrough/

Guide to Scientific Computing in C 2nd Edition Joe


Pitt-Francis

https://textbookfull.com/product/guide-to-scientific-computing-
in-c-2nd-edition-joe-pitt-francis/
The Definitive
Guide to AdonisJs
Building Node.js Applications with JavaScript

Christopher Pitt
The Definitive Guide to
AdonisJs
Building Node.js Applications
with JavaScript

Christopher Pitt
The Definitive Guide to AdonisJs: Building Node.js Applications with JavaScript
Christopher Pitt
Cape Town, Western Cape, South Africa

ISBN-13 (pbk): 978-1-4842-3389-4 ISBN-13 (electronic): 978-1-4842-3390-0


https://doi.org/10.1007/978-1-4842-3390-0
Library of Congress Control Number: 2018937100

Copyright © 2018 by Christopher Pitt


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, e-mail
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 e-mail 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 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/9781484233894. For more
detailed information, please visit www.apress.com/source-code.
Printed on acid-free paper
Table of Contents
About the Author����������������������������������������������������������������������������������������������������� ix

Acknowledgments��������������������������������������������������������������������������������������������������� xi
Introduction����������������������������������������������������������������������������������������������������������� xiii

Chapter 1: Getting Started���������������������������������������������������������������������������������������� 1


Installing Node.js��������������������������������������������������������������������������������������������������������������������������� 1
Installing the AdonisJs Command-Line Tool��������������������������������������������������������������������������������� 3
Creating a New Application����������������������������������������������������������������������������������������������������������� 3
Serving the Application����������������������������������������������������������������������������������������������������������������� 4
Exploring the Code������������������������������������������������������������������������������������������������������������������������ 5
Summary������������������������������������������������������������������������������������������������������������������������������������ 10

Chapter 2: Routing�������������������������������������������������������������������������������������������������� 11
What Are Routes?������������������������������������������������������������������������������������������������������������������������ 11
Planning Routes�������������������������������������������������������������������������������������������������������������������������� 12
Defining Routes��������������������������������������������������������������������������������������������������������������������������� 14
Testing Routes���������������������������������������������������������������������������������������������������������������������������� 15
Defining Route Parameters��������������������������������������������������������������������������������������������������������� 20
Summary������������������������������������������������������������������������������������������������������������������������������������ 26

Chapter 3: Views���������������������������������������������������������������������������������������������������� 27
Creating Views���������������������������������������������������������������������������������������������������������������������������� 27
Registering the View Provider����������������������������������������������������������������������������������������������� 28
Creating Layouts������������������������������������������������������������������������������������������������������������������������� 29
Learning Template Syntax����������������������������������������������������������������������������������������������������������� 34
Interpolation�������������������������������������������������������������������������������������������������������������������������� 35

iii
Table of Contents

Conditionals��������������������������������������������������������������������������������������������������������������������������� 36
Loops������������������������������������������������������������������������������������������������������������������������������������� 37
Partials���������������������������������������������������������������������������������������������������������������������������������� 38
Yield��������������������������������������������������������������������������������������������������������������������������������������� 38
Functions������������������������������������������������������������������������������������������������������������������������������� 39
Summary������������������������������������������������������������������������������������������������������������������������������������ 40

Chapter 4: Requests����������������������������������������������������������������������������������������������� 41
Updating Tests����������������������������������������������������������������������������������������������������������������������������� 41
Understanding Requests������������������������������������������������������������������������������������������������������������� 47
Getting Parameters���������������������������������������������������������������������������������������������������������������� 49
Getting Headers and Cookies������������������������������������������������������������������������������������������������ 50
Getting “accepts” and “language”���������������������������������������������������������������������������������������� 50
Finding Out More������������������������������������������������������������������������������������������������������������������� 51
Responding to POST, PUT, PATCH, and DELETE���������������������������������������������������������������������� 51
Summary������������������������������������������������������������������������������������������������������������������������������� 59

Chapter 5: Responses��������������������������������������������������������������������������������������������� 61
Sending Simple Responses�������������������������������������������������������������������������������������������������������� 61
Sending JSON Responses����������������������������������������������������������������������������������������������������������� 62
Working with Cookies����������������������������������������������������������������������������������������������������������������� 64
Redirecting Users������������������������������������������������������������������������������������������������������������������������ 64
Responding with Attachments���������������������������������������������������������������������������������������������������� 66
Extending with Macros��������������������������������������������������������������������������������������������������������������� 66
Summary������������������������������������������������������������������������������������������������������������������������������������ 70

Chapter 6: Generators��������������������������������������������������������������������������������������������� 71
Arrays: Where It All Began����������������������������������������������������������������������������������������������������������� 71
Then Came Iterators�������������������������������������������������������������������������������������������������������������������� 72
Generators���������������������������������������������������������������������������������������������������������������������������������� 75
Cooperative Multitasking������������������������������������������������������������������������������������������������������������ 76
Summary������������������������������������������������������������������������������������������������������������������������������������ 79

iv
Table of Contents

Chapter 7: Promises����������������������������������������������������������������������������������������������� 81
Reacting to Events���������������������������������������������������������������������������������������������������������������������� 81
Entering Callback Hell����������������������������������������������������������������������������������������������������������������� 82
Understanding Promises������������������������������������������������������������������������������������������������������������� 83
Using Promises with Coroutines������������������������������������������������������������������������������������������������� 84
Making Promises������������������������������������������������������������������������������������������������������������������������ 86
Bringing It Back to AdonisJs������������������������������������������������������������������������������������������������������� 88
Summary������������������������������������������������������������������������������������������������������������������������������������ 89

Chapter 8: Controllers and Middleware������������������������������������������������������������������ 91


Making Controllers���������������������������������������������������������������������������������������������������������������������� 91
Reusing Code������������������������������������������������������������������������������������������������������������������������������ 96
Using Middleware����������������������������������������������������������������������������������������������������������������������� 97
Summary���������������������������������������������������������������������������������������������������������������������������������� 101

Chapter 9: Databases������������������������������������������������������������������������������������������� 103


Installing Lucid�������������������������������������������������������������������������������������������������������������������������� 103
Making Migrations�������������������������������������������������������������������������������������������������������������������� 107
Seeding the Database��������������������������������������������������������������������������������������������������������������� 111
Working with Routes and the Database������������������������������������������������������������������������������������ 115
Showing Products��������������������������������������������������������������������������������������������������������������������� 116
Making Models�������������������������������������������������������������������������������������������������������������������������� 118
Registering Customers�������������������������������������������������������������������������������������������������������������� 121
Authenticating Customers��������������������������������������������������������������������������������������������������������� 125
Summary���������������������������������������������������������������������������������������������������������������������������������� 127

Chapter 10: Validation and Errors������������������������������������������������������������������������ 129


Installing Validation������������������������������������������������������������������������������������������������������������������� 129
Reusing Validation��������������������������������������������������������������������������������������������������������������������� 133
Displaying Custom Error Pages������������������������������������������������������������������������������������������������� 140
Creating Custom Exceptions����������������������������������������������������������������������������������������������������� 144
Summary���������������������������������������������������������������������������������������������������������������������������������� 146

v
Table of Contents

Chapter 11: Sessions�������������������������������������������������������������������������������������������� 147


Making the Dashboard�������������������������������������������������������������������������������������������������������������� 147
Creating the Customer Session������������������������������������������������������������������������������������������������� 154
Logging Customers Out������������������������������������������������������������������������������������������������������������� 158
Summary���������������������������������������������������������������������������������������������������������������������������������� 161

Chapter 12: Security��������������������������������������������������������������������������������������������� 163


Recap���������������������������������������������������������������������������������������������������������������������������������������� 163
Creating More Middleware�������������������������������������������������������������������������������������������������������� 164
Securing Forms������������������������������������������������������������������������������������������������������������������������� 168
Encrypting Values��������������������������������������������������������������������������������������������������������������������� 171
Summary���������������������������������������������������������������������������������������������������������������������������������� 172

Chapter 13: Front-End Tools��������������������������������������������������������������������������������� 173


Installing Mix����������������������������������������������������������������������������������������������������������������������������� 173
Installing Bootstrap (Sass)�������������������������������������������������������������������������������������������������������� 177
Installing React������������������������������������������������������������������������������������������������������������������������� 179
Summary���������������������������������������������������������������������������������������������������������������������������������� 182

Chapter 14: WebSockets��������������������������������������������������������������������������������������� 183


Installing Socket.io�������������������������������������������������������������������������������������������������������������������� 183
Building a React Shopping Cart������������������������������������������������������������������������������������������������ 189
Connecting the UI���������������������������������������������������������������������������������������������������������������������� 197
Creating Orders������������������������������������������������������������������������������������������������������������������������� 201
Summary���������������������������������������������������������������������������������������������������������������������������������� 205

Chapter 15: Deployment�������������������������������������������������������������������������������������� 207


Setting Up DigitalOcean������������������������������������������������������������������������������������������������������������ 208
Setting Up Forge����������������������������������������������������������������������������������������������������������������������� 209
Getting a Domain���������������������������������������������������������������������������������������������������������������������� 211
Adding the Domain Name in Forge������������������������������������������������������������������������������������������� 213
Setting Up DNS Servers������������������������������������������������������������������������������������������������������������ 215
Adding a Server Daemon���������������������������������������������������������������������������������������������������������� 216

vi
Table of Contents

Serving on Port 80�������������������������������������������������������������������������������������������������������������������� 220


Setting Up an SSL Certificate���������������������������������������������������������������������������������������������������� 221
Summary���������������������������������������������������������������������������������������������������������������������������������� 222

Chapter 16: Finishing Touches����������������������������������������������������������������������������� 223


Sending E-mail�������������������������������������������������������������������������������������������������������������������������� 223
Connecting to Stripe����������������������������������������������������������������������������������������������������������������� 230
Enabling CORS Requests���������������������������������������������������������������������������������������������������������� 238
Summary���������������������������������������������������������������������������������������������������������������������������������� 243

Index��������������������������������������������������������������������������������������������������������������������� 245

vii
About the Author
Christopher Pitt is a developer and writer working at Over. He usually works on
application architecture, though sometimes you’ll find him building compilers or robots.
He is also the author of several web development books and is a contributor on various
open source projects such as AdonisJs.

ix
Acknowledgments
Many people helped to make this book a reality. I’d like to thank them, in no
particular order.
Harminder and the rest of the core team have written some beautiful software.
I am continually amazed by how beautiful AdonisJs code can look. I enjoy JavaScript,
and it seems particularly suited to a framework like this. Harminder also gave insightful
technical feedback for this book.
Taylor began a wonder with Laravel. It’s clear that much of AdonisJs is inspired by
Laravel, and with good reason. Laravel kept me engaged in PHP, and AdonisJs will keep
me engaged in server-side JavaScript.
Mark, the coordinating editor, was fantastic to work with. He never got in the way
and was always helpful. That’s uncommon in his line of work. Matt, the development
editor, was similarly helpful and let me set the vision for this project, unencumbered.
These folks are a credit to Apress.
Matt, the writer, is an inspiration to me. He wrote what I consider to be the best
Laravel book on the market. Throughout this book, I sought to emulate his wisdom and
skill.
Bruno, Christian, and Wayne are good friends and supporters of my work. I miss
writing for Bruno. I miss having coffee with Christian. I will miss taking walks with
Wayne.
Liz, my love, has given me space and coffee in abundance. She is the inspiration
for the sample application, and though she finds me altogether strange, she loves me
effortlessly.

xi
Introduction
This book is designed to teach you how to use AdonisJs. To get the most out of it, you
should have a firm grasp of modern JavaScript and some knowledge of how to work with
relational databases and the command line.
I explain new and interesting bits of syntax, but this book isn’t primarily about
teaching you how to use JavaScript. It’s about teaching you how to build real applications
by using AdonisJs.
The application we’re going to build is called Threadbear. It’s a play on words,
meant to conjure up thoughts of patchy, knitted teddy bears. We’re going to make an
application through which sellers can register and upload their knitted patterns and
products. Customers will then be able to register and purchase these things.
We’re not going to focus much on design. Instead, we’re going to focus on the
mechanics of commerce applications. Beyond adding a CSS framework, everything is as
the good browser vendors intended. That said, I welcome you to add your own style to
the application
We’ll create a secure registration and login system. We’ll add profile and product
management. We’ll connect the front end to the back end by using WebSockets and
the Fetch API. We’ll design a shopping cart in React and we’ll package static files with a
custom build chain. Finally, we’ll learn how to deploy the application to a virtual server,
and install custom domains and SSL certificates.
It is my hope that by the time you are finished reading this book, you’ll know all you
need to know in order to build your online business.

xiii
CHAPTER 1

Getting Started
Deciding where to start is often the hardest part, don’t you find? In this chapter, we’re
going to get our development tools set up. We’re also going to create a new AdonisJs
application. We’ll finish up by taking a look at the folders of our application and making
a few small customizations.

Note Complex and exhaustive installation instructions are one of the easiest
ways to age a book. I’m not going to belabor the steps for every operating system
and configuration. I’m guessing you know enough about Google to find the help
you need. If you get stuck, ask me for help on Twitter (https://twitter.com/
assertchris) or e-mail (cgpitt@gmail.com).

I nstalling Node.js
As the name implies, AdonisJs is a JavaScript framework. There have been a few
runtimes for JavaScript on the server, but the clear winner is Node.js (https://nodejs.
org/en). You can see what the Node.js web site looks like in Figure 1-1. The latest version
of AdonisJs requires Node 8.0 or newer. That’s because it uses new language features to
make writing code easier and more expressive. We’ll learn about those later.
Node.js is relatively painless to install, despite its size and intricacy. On macOS, you
can run the following:

brew install node

And on Debian or Ubuntu, you can run this:

apt-get install node

1
© Christopher Pitt 2018
C. Pitt, The Definitive Guide to AdonisJs, https://doi.org/10.1007/978-1-4842-3390-0_1
Chapter 1 Getting Started

Note Alternatively, you can install Node.js from a binary at https://nodejs.


org/en/download. There are installers for Windows, so you don’t have to use
macOS or Debian if you don’t want to.

You can check that Node.js is correctly installed by running the following:

node -v
npm -v

Figure 1-1. The Node.js web site

2
Chapter 1 Getting Started

Installing the AdonisJs Command-Line Tool


Setting up a new AdonisJs application requires quite a few steps. Fortunately, there’s a
tool to perform all of those steps for us. We need to install that tool, which also will help
us to create all future AdonisJs applications:

npm install --global @adonisjs/cli

This installs the command-line tool globally, which means we’ll be able to use it
from anywhere on our system. Similarly to the way we check Node.js, we can check to
see whether this tool has been successfully installed by running the following:

adonis --help

This also gives as a sneak peek at the kinds of things we can start to do to an
application. Various commands are available, from creating and running applications to
adding new functionality in existing applications.
For now, we’re just going to create a new AdonisJs application.

Creating a New Application


If you read through the output of that help command, you may have noticed the new
command. It’s what we’re going to use to create a new application:

adonis new threadbear

It’ll take a minute or two to fully install and configure the new application. The
only step I want to talk about for the moment is “generated unique APP_KEY.” AdonisJs
applications have an .env configuration file, which we can use to store sensitive
configuration variables. One of these is called APP_KEY, which is a private key unique to
the application.
Whenever text is encrypted or hashed, this value is used to seed the operation. The
same password, when hashed in two applications (with different APP_KEY values), will
result in different hashes. This is important to know because at times you might need to
compare hashes or decrypt values that have been generated using a different APP_KEY
than the one the command-line tool just made for you.

3
Chapter 1 Getting Started

Note It’s possible to reuse an APP_KEY in multiple applications, but it’s definitely
not recommended. Sharing an APP_KEY should be done only in exceptional
situations and for a limited amount of time. If you reuse keys, you’re increasing the
likelihood that all the applications reusing the key are compromised at the same time.

S
 erving the Application
Now that we’ve created an application, we need a way to view it in the browser. Some
server-side languages use third-party web servers (such as Nginx or Apache) as a kind of
load balancer. PHP and Perl are examples of this.
Things work a bit differently with server-side JavaScript. The foundational example
of how to use Node.js (https://nodejs.org/en/docs/guides/getting-started-guide)
demonstrates how we can make our own HTTP server:

const http = require("http")

const hostname = "127.0.0.1"


const port = 3333

const server = http.createServer((req, res) => {


    res.statusCode = 200
    res.setHeader("Content-Type", "text/plain")
    res.end("hello world")
})

server.listen(port, hostname, () => {


    // server is now running
})

This is quite similar to what AdonisJs does under the hood. This means our server(s)
need to keep the Node.js HTTP script running as what is usually referred to as a daemon.
We’ll unpack that later, but for now we’ll need to make sure adonis serve is running
while we code.
As the message when we run adonis serve --dev says, we can see the new application
by loading 127.0.0.1:3333 in a web browser. We can see what this looks like in Figure 1-2.

4
Chapter 1 Getting Started

Figure 1-2. A new AdonisJs application

E xploring the Code


New AdonisJs applications are as slim as the repository’s name on which they are based.1
They look something like this:

threadbear
↳ node_modules
↳ public
↳ start
↳ .env
↳ .env.example
↳ .gitignore

1
https://github.com/adonisjs/adonis-slim-app

5
Chapter 1 Getting Started

↳ ace
↳ package.json
↳ server.js

As usual, NPM (or Node Package Manager) dependencies are stored in the node_
modules folder. When we run adonis serve --dev, it’s doing little more than running
node server.js.
Static files, such as client-side stylesheets and scripts, are usually placed in the
public folder. More complex applications tend to have build chains, which take source
stylesheets and scripts and combine/compress them into smaller production versions.
AdonisJs favors convention over configuration. This means that it is designed to be
useful out of the box. Sometimes we might need to deviate from the standard configuration.
In new applications, we can do that by customizing the files in the start folder.
Let’s make a few customizations to the application. We’re going to learn about routes
in a while, but we’ll add one in the meantime. The starting routes file resembles Listing 1-1.

Listing 1-1. This is from threadbear/start/routes.js

"use strict"

const Route = use("Route")

Route.get("/", ({ request }) => {


    return "...some html"
})

See that Route.get? We’re going to add another, as shown in Listing 1-2.

Listing 1-2. This is from threadbear/start/routes.js

Route.get("/register", () => {
    return "...form for customers to make new profiles"
})

For now, restart the serve command and go to the address you see in the terminal
window. We can see the text we entered: text that we’re returning from the route, matching
the /register path we specified.
Larger applications require more files than just the ones we have currently. You may
remember that the adonis --help command suggested quite a few make commands.

6
Chapter 2 Routing

      "/login",
      "GET /login",
      done,
    )
  })
})

We begin by importing the assertions and HTTP libraries via require statements. We
also import the dotenv library and immediately call the config method. This loads all
the environment variables in our .env file so we can build a URL from the HOST and PORT
variables.
We follow this up by creating the shouldBeOk and shouldHaveMessage helper
functions. The first checks whether a request to an address returns a response with a 200
status code. This would indicate that the request returned successfully, which tells us
that the route is defined.
The shouldHaveMessage function tells us whether a request to an address returns a
message we expect. We’ve defined our routes to return simple messages that describe
their method and path, so we can use shouldHaveMessage to make sure the requests
match the messages we expect them to.
We’ve also defined our first set of tests using the describe and it functions. Mocha
provides these for us, so we don’t have to import them. We can duplicate these tests for
each route, as demonstrated in Listing 2-4.

Listing 2-4. This is from threadbear/test/routes.js

describe("POST /login", () => {


  it("should have the correct status (200)", done => {
    shouldBeOk("POST", "/login", done)
  })

  it("should have the correct message", done => {


    shouldHaveMessage(
      "POST",
      "/login",
      "POST /login",
      done,
    )

18
Another random document with
no related content on Scribd:
"'Mitä se sinuun kuuluu?'

"'Se kuuluu kyllä minuun, olkaa hyvä, kysyn nöyrimmästi! — Mitä


huvia tuottaisi armolliselle herralle saattaa meidät onnettomiksi?'

"'Mitäkö? Sitä, etten voi sietää sinua, kelvoton heittiö. Mikä ei ole
minun, ei myöskään ole sinun! Ymmärrätkö.'

"'Ymmärrän, junkkari!" huusin leimahtaen; "nyt vasta ymmärränkin


aivan hyvin. Mutta varokaa itseänne! Olen rehellinen, rauhaa
rakastava mies, joka mukaudun moniin asioihin; mutta jos joku
raatelee liiaksi sieluani, silloin kyllä on tapani osottaa, ettei
käsivarteni ole pajupuusta. On kai junkkarikin ymmärtänyt?'

"Siten vastasin vasten kasvoja ja viskasin turkin yltäni. Vihan


valtaamana huusi junkkari:

"'Senkin hirtehinen! Olisipa minulla nyt vaan keppi kädessä, niin


hakkaisin luusi kappaleiksi.'

"'Minulla on kyllä, oikea solmuniekka', vastasin ojentaen samalla


kepinkalikkaa; 'tässä on, junkkarini, ottakaa se, lyökää, jos
uskallatte!'

"'Koirani repikööt sinut, talonpoikaisroisto!' huusi hän ja alkoi


viheltää ja houkutella koiria nimeltään, jotka pitkin loikkauksin
syöksyivät esiin.

"Julia hätääntyi; rauhotin häntä ja pyysin olemaan aivan peloton.

"'Hei! Usuu! Kiinni!' yllytti junkkari koiria päälleni; haukkuen ne


kävivät kimppuuni. Mutta kun ne olivat aivan lähelläni, huusin minä
niitä ystävällisesti nimeltään. Heti tunsivat ne minut; liehitellen
tunkeilivat ne ympärilleni, vinkuen ikäänkuin pahoillaan siitä, että
olivat silmänräpäyksenkään pitäneet minua vihollisenaan. Yksi
kyyristyi jalkoihini, toinen hyväili kättäni ja kolmas juoksenteli iloisena
ympärilläni.

"'Näettekös, junkkari', sanoin hymyillen, 'koirilla on parempi sydän


kuin teillä. Hävetkää! Entäpä, jos minä nyt tekisin sen, mitä te aijoitte
tehdä? Jos yllyttäisin omat koiranne päällenne? Sillä ne ovat
kerrassaan viisaita eläimiä, eivätkä unohda koskaan sitä kuka niille
on tehnyt jotain hyvää ja kuka pahaa. Nehän tietävät varsin hyvin
saaneensa minulta yhtä monta leivänpalaa kuin junkkarilta samaan
aikaan kepin lyöntejä, Koetetaanpas! Us kiinni!' huusin koirille
osottaen herraa, joka kauhistuneena hyppäsi aidalle, kun koirat
syöksyivät häntä kohden. Rauhoitin eläimiä; sitten kysyin nauraen:
'No, uskotteko nyt minua, junkkari? Suotta olette sinne kiivenneet,
sillä jos tahdon, tuovat koirat teidät vaikka kirkontornista alas. En
tahdo kumminkaan piinata junkkaria, antaa vaan pienen opetuksen.
Ja nyt: Hyvää yötä! Neuvon vielä olemaan tähtäämättä minua
tulevaisuudessa aseilla, sillä jokainen laukaus voi kimmota itseenne
takaisin. — Hyvää yötä, Julia!'

"Sitte menin kotiin; kaukaa kuulin junkkarin pauhaavan, kuinka


hän minulle kostaisi, nyt oli hänellä kaksikin kaunaa hampaansa
kolossa minua vastaan. Tahdon tunnustaa: kun vereni tuli
rauhallisemmaksi, tuntui minusta tuo pilantekoni pahalta, sillä
köyhän ihmisen ei ole hyvä tehdä pilaa suuresta herrasta. Mutta se
nyt oli kerta tapahtunut. Rakas junkkarini ei antanutkaan kauvan
odottaa lupauksensa täyttämistä. Hän osasi saattaa minut sellaiseen
maineeseen, etten minä osannut ryhtyä mihinkään toimeen, että olin
tyhjäntoimittaja, taivastella, joka oli välttämättä pistettävä
sotilastakkiin. Päätettiinkin vangita minut tätä tarkoitusta varten.
Uskomattoman paljon minua vainottiin; mutta minulle jäi sentään
vielä aikaa kylliksi kätkeytyä heiniin. He nuuskivat koko talon
läpeensä, tuvan, kamarit ja ullakon! Kuulin heidän askeleensa,
heidän puheensa enkä uskaltanut hengittääkään kätköpaikassani,
pelosta, että se voisi minut ilmaista. Kun he olivat kaikkialta etsineet,
poistuivat he tyhjin käsin.

"'Sanoinhan jo, ettei hän enää tänään ole ollut täällä!' puheli
suojapaikkani kelpo vanhus.

"Nyt menivät ihmiset piilopaikkani ohitse. Eräs heinähankolla


varustettu mies huudahti nauraen: 'Eihän hän vaan liene täällä?' ja
pisti samalla heiniin, juuri pääni yläpuolelle. Vereni jähmettyi, kadotin
tajuntani. Kun taas tulin tuntoihini, vallitsi hiljaisuus ympärilläni; he
olivat menneet pois. En minä itseni tähden pelännyt sotamieheksi
tulemista, se tapahtui Julia raukan tähden. 'Kuinka hänen kävisi —
ajattelin — jos meidät ainaiseksi erotettaisiin toisistamme? Hänen
heikko sydämensä murtuisi tuskasta ja minun pitäisi hävittää se,
minkä tähden mielelläni uhraisin elämäni!' Yömyöhällä ryömin
heinistä, heitin turkin ylleni, asetin repun olalleni ja otin jäähyväiset
talonisännältä.

"'En tiedä, koska taas näemme toisemme', sanoin hänelle, 'jos


näette Juliaa, niin sanokaa hänelle sydämelliset terveiseni, olkoon
hän minusta huoleton, kun päiväni paranevat, niin palajan taas tänne
takaisin. Kiitos teille kaikesta hyvyydestänne, rakas ystävä, Jumala
siunatkoon teitä siitä!' Ojensimme toisillemme kätemme, sitten menin
minä.

"Kuka tuleekaan minua vastaan ensiaskelilla? Julia!

"'Minne kyyhkyseni?' kysyin.


"'Sinun luoksesi — mutta mihin aijot sinä, Peter?'

"'Niin, jospa tietäisin mihin! Tänne en voi jäädä. Sillä he


vangitseisivat minut ja pistäisivät minut sotamiehiksi.'

"Kuulin siitä. Taivaallinen isä! Eläessäni en ole niin paljon kärsinyt


kuin noina lyhyinä hetkinä. Näin, kuinka ihmiset menivät etsimään
sinua. Oi, sydämeni vapisi kuin olisi se ollut pakahtumaisillaan. Olisin
mielelläni itkenyt, mutta en voinut. Oh, kuinka on katkeraa, kun ei
ihminen voi edes itkeä. Näin, kuinka he sinua hakivat ja hakivat ja
kun he palasivat, vapisin kuin kuumeessa. Sinua en nähnyt
joukossa, mutta silmissäni kimmelsi niin ja pelkäsin niin kovasti, että
en itsekään sitä voisi uskoa. Juoksin ulos ja kysyin joltakin, olivatko
he vanginneet sinut; hän sanoi: ei vielä. Vasta sitten rauhoituin minä.

"'Suloinen olento, enkeli!' huudahdin minä syleillen häntä, 'kuinka


palkitsisin sinulle rakkautesi!'

"'Rakasta minua, niinkuin minä sinua rakastan ja olen palkittu


kylliksi', vastasi hän. 'En tarvitse mitään muuta maailmassa kuin
sinun rakkautesi, sinun sydämesi.'

"'Rangaiskoon minua taivas, jos joskus ajattelenkaan jotakin


toista, kuin sinua, helmien helmeä!'

"'Älä sano niin, Peter, tiedänhän sen sanomattasikin… Mutta mihin


aijot nyt?'

"'Sanoinhan jo sinulle, etten tiedä sitä itsekään, tiedän vaan, että


minun täytyy täältä poistua.'

"'Tahdotko siis jättää minut?'


"'Älyäthän itsekin, että meidän täytyy erota; vähintään joksikin
aikaa, sillä täällä en ole silmänräpäystäkään turvassa.'

"'Se on tosi, se on tosi… Jumala. Minä tulen mukaasi.'

"'Mitä johtuukaan mieleesi?'

"'Siten jäämme yhteen. Tai olenko ehkä kuormaksi sinulle?'

"'Minulleko kuormaksi? — Kuinka voit noin puhua?'

"'No sitten lähdemme yhdessä.'

"'Kuulehan, lapsukaiseni', sanoin, hilliten itseni, 'kuulehan! Sinä


tiedät kuinka epävakainen on tieni, niin etten tiedä, mihin tänään
pääni kallistaisin. Päivät käyvät yhä koleammiksi. Rahaa ei minulla
ole; ainoastaan leipäkannikan puolisko, joka on repussani,
syötäväksi, enkä edes tiedä mistä toista ottaa.'

"Julia ei antanut minun jatkaa puhettani. Hän sanoi olevansa


valmis minun kanssani näkemään nälkää, kärsimään kylmää, vaivoja
ja vastuksia kuten minäkin, hän sanoi, että helppo olisi onnessa
rakastaa toisiaan, vaan kurjuus oli rakkauden opetuskivi. Nyt olisi
paras tilaisuus näyttää, kuinka uskollinen hän tahtoi olla, enkä minä
saisi häntä ollenkaan rakastaa, jos kieltäisin häneltä tämän
koenäytteen. Turhia olivat kaikki sanat; hän pysyi päätöksessään
seurata minua. Ja niin lähdimme me yhdessä.

"Mutta oi! Kylän lopussa kohtasimme me oikeudenpalvelijan


vaimon! Oli pimeä yö ja oikeudenpalvelijan vaimo oli jo ijäkäs. Mutta
vanhat vaimot ovat kissojen kaltaisia: he näkevät pimeässä. Hän
tunsi Julian ja kysyi:
"'Minnepä, tyttönen, noin yksissä?' ja naurahti lisäksi pilkallisesti.
'Kuinka turmeltunut on nuoriso nykyaikaan, herra Jesus, älä unohda
minua!'

"'Älä katso taaksesi', kuiskasin Julialle, 'näytät siltä kuin et olisi


kuullut mitään ja ikäänkuin ei asia sinua liikuttaisikaan. Kenties
luulee hän erehtyneensä. Tiedäthän, millaisia kielikelloja vanhat
ovat; aamulla tietävät kaikki että hän näki sinut erään nuoren miehen
kanssa ja silloin ei siitä ole meille mitään vahinkoa, sillä
tiedetäänhän, ettei se voinut olla kukaan muu kuin minä. Meitä
tullaan ajamaan takaa.'

"Nopeasti astelimme me siksi, kunnes vihdoin olimme melkoisen


matkan päässä kylästä. Suurella tiellä katselimme varovasti
ympärillemme, sillä pelkäsimme kohtaavamme vielä vaarallisempia
kuin tuo vanhus. Astelimme nyt vasemmalle maissipeltojen yli,
toivoen voivamme yöpyä johonkin yksinäiseen taloon; mutta yön
pimeydessä harhailimme me niin eksyksiin, ettemme enää kuulleet
kaukaisintakaan koiran haukuntaa, mikä olisi voinut olla
oppaanamme.

"Väsyneinä laskeusimme tieojaan, jossa pian nukuimmekin.


Turkkini oli jotenkin leveä, se suojeli meitä molempia; Julia painautui
rinnalleni, ettei paleltuisi. Siten nukuimme makeasti ja suloisesti
aivankuin olisimme levänneet silkkipatjoilla… Hm! Saduissa
puhutaan lumouksesta ja tenhosta. Mutta sitä ei löydy yksin
saduissa! On olemassa lumous, ja sen nimi on rakkaus. Eikö niin,
Panni tyttöseni?"

Panni oli niin syventynyt kertomukseen, ettei hän kuullut ollenkaan


vanhuksen puhuttelua. Hänen edestään vastasi Ferko innoissaan:
"Se on totta. Ei mitään muuta!"

Onnesta kukkuroillaan katseli hän pikku rakastansa, joka näytti


hänestä nyt vielä kauniimmalta kuin muutoin. Ja todella hän olikin
komea tyttö, punaisine pikku suineen ja sinisine, suurine silmineen.

Mestari Peter kertoi edelleen:

"Minä heräsin ensiksi, Julia nukkui vielä hetkisen. Pysyin


liikkumatonna, ettei hän heräisi. Rinnallani lepäsi hänen päänsä niin
kauniina, niin suloisena kuin olisi sen itse taivaanherra siihen
asettanut, Vihdoin aukaisi hän silmänsä, katsoi hämmentyneenä
minuun ja punastui. No, siihen nyt ei ollut mitään syytä! Minä
käyttäydyin hurskaasti kuin olisin viettänyt yöni alttarin ääressä,
pyhän neitsyen kuvan edessä. Mutta eihän ollut mikään ihme, että
hän hiukan häpesi, sillä päivää aikaisemmin samaan aikaan ei hän
olisi uskaltanut ajatellakaan, että hän täten tulisi viettämään yönsä.
Me nousimme ylös ja neuvottelimme, minne nyt menisimme ja
tulimme siihen päätökseen, että oli samantekevä minne, sillä hyviä
ihmisiähän ei olisi missään. Julian isä tosin eli, mutta hän ei voinut
sietää tytärtään, koska tämän elämä oli maksanut äitinsä hengen;
tämä kuoli antaessaan elämän tyttärelleen, ja siksi vieroi isä niin
tytärtään, että lähetti hänet jo lapsuusvuosina vieraiden palvelukseen
ja siitä asti oli tuskin ollenkaan välittänyt hänestä. Emme siis voineet
sinne yrittää löytääksemme asuinsijan hänen luonaan.

"Päätimme siis, että olisi samantekevä minne asti kulkisimme,


kunhan löytäisimme sopivan palveluspaikan.

"Iltaan saakka kuljimme me talosta taloon kysellen kaikkialla, eikö


palvelusväkeä olisi tarvis Kaikkialla vastattiin samalla tavoin: ei, ja
useimmiten tarkasteltiin meitä karsain katsein, josta ymmärsimme,
että meidän pitäisi mitä pikemmin laputtaa tiehemme. Ja me
menimmekin tiehemme, surullisina, pettyneinä! Ei ollut vielä niin
myöhä, mutta syksyinen aika varhaisine iltapimeineen, kun
saavuimme viimeiseen taloon. Kaukana ja yksinäisenä sijaitsi se
pustalla. Pustan toista sivua rajoitti korkea metsikkö, toista
kaislaakasvava lammikko. Talon keskellä sijaitsevasta tallista loimusi
meitä vastaan avoimesta ovesta roihuava valkea. Takapuolelta,
lammasnavetasta kuului karjan kellojen kilinä. Muuten oli aivan
hiljaista. Astuimme sisään talliin, missä liekehti kirkas tuli. Noin
seitsemisen ihmistä oli siellä. Vanha talonisäntä, hänen kaksi
poikaansa, tytär ja kaksi tai kolme betyaria [hevosrosvo,
pustanryöväri]. Isännän nuorin poika piti tulta vireillä; juuri meidän
astuessamme sisään, heitti hän taas tukun olkia tuleen. Hetkiseksi
pimeni paikka, sitten leimahti tuli äkkiä kirkkaasti ja valaisi koko tallin.
Me näimme tulen ympärille asettuneet ihmiset, savustuneet hirret,
joilla oli viikatteita, varstoja, sirppejä ja muita senlaatuisia.
Keskiseinällä oli kaappi, jonka päällä oli puinen vesiastia, johon oli
pistetty ruoko. Oikealla söivät hevoset soimista, vasemmalla makasi
muutamia lehmiä lattialla, niiden vieressä valkoinen susikoira, joka
haukkui meitä sisään astuessamme.

"'Hiljaa, Csiba!' huusi tyttö, ja koira vaikeni.

"'Jumalan terveeksi Hyvää iltaa!' sanoin minä nostaen hattuani.

"'Tervetuloa!' vastasi vanhus.

"'Etsimme majapaikkaa, olisiko mahdollista', sanoin taas ja vedin


lähemmäksi Juliaa, joka oli pysähtynyt kynnykselle.

"'Jos vaan tahdot tyytyä, on se kyllä mahdollista', huomautti


vanhus ystävällisesti. 'Minne matka, poikaseni? Mutta tulkaahan
lähemmäksi tulta, että näkisin, onko pikku tyttö enemmän viluinen
kuin nälkäinen.'

"Me istuuduimme ja minä kerroin, mikä meidät oli tänne tuonut;


sanoin kaiken muun suoraan, paitsi yhtä: että Julia oli rakastettuni.
Sanoin hänen olevan sisareni.

"'Älä nuku Michel!' huudahti vanhus nuorimmalle pojalleen, kun


olin lopettanut kertomukseni. 'Älä nuku, poikaseni, muutoin kirvelee
kylmä nenääsi ja korviasi herätessäsi. Jos nukut, nukkuu tulikin!
Pane lisää!'

"Michel totteli käskyä, mutta kiireessään heitti hän niin suuren


tukon heiniä tuleen, että se olisi melkein sammunut, ellei joku olisi
tuonut heinähankoa väliin ja puhaltaen virittänyt sitä. Nyt leimahti se
yhä mahtavampana ylös! Vihdoin tarkastelin betyareja; eräs oli noin
kolmenkymmenen, toinen tuskin kahdenkymmenen vanha.

"'Kerro nyt edelleen, veliseni', sanoi vanha talonisäntä nuorimmalle


niistä; 'kerro vaan edelleen. Kuunnelkaamme! — Pysähdyit isäsi
kuolemaan.'

"'Siis isäraukkani kuoli; levätköön hän rauhassa. Hän kuoli, ja tuli


kysymys: kuinka hänet haudattaisiin? Sillä meillä ei ollut ainoatakaan
lautaa ruumisarkuksi, vielä vähemmän rahaa siihen. Ei jäänyt siis
mitään muuta keinoa jälelle kuin varastaa tarpeet. Tuolla,
herraskartanon luona oli jo vuodenpäivät maannut lautaläjä. Hän ei
ollenkaan tarvitse niitä, ajattelin minä, ja tuskin huomaakaan jos otan
sieltä yhden tai pari lautaa. Menin sinne, ja äitini vartioidessa
kuollutta, varastin minä ruumisarkun laudat, jotka sitten itse naulailin
yhteen, sillä puusepällekin olisi pitänyt olla maksu siitä. Seuraavana
päivänä asetimme rakkaan isäni ruumiin siihen, päivää myöhemmin
löimme naulat kiinni ja kannoimme sen ulos. Juuri kun aijoimme
jättää talon, tuli herra, tarkasteli arkkua joka puolelta ja käski sitten
avata.'

"'Mutta sehän on jo naulattu kiinni', sanoin pelokkaasti, sillä


omaatuntoani painoi.

"'Samantekevä', arveli hän, 'avaa!'

"Puheestamme ei välitetty, meidän täytyi avata arkku, ja herra


katseli sitä sisäpuolelta, mistä hän vihdoin löysi sen, mitä etsi. Hän
huudahti:

"'Laudat kuuluvat minulle, täällä on merkki!'

"Sitten meni hän pois. Tuskin oli hautaus ohitse, kun minut vietiin
kuulusteltavaksi; kieltäminen olisi ollut turhaa, minut tuomittiin
varkaaksi. Puoli vuotta vankeutta ja viisikolmatta paria raippoja tuli
osakseni. Kun pääsin vankeudesta, makasi äitiraukkanikin jo siellä,
missä isäkin oli.

"Tässä alkoi nuorukainen katkerasti nyyhkiä. Lyhyen vaitiolon


jälkeen kuivasi hän kyynelet silmistään ja jatkoi:

"'Jumala tietää kuinka vanha vaimo kuoli? Kenties nälkään. Sillä


hänellä ei ollut ainoatakaan muuta koko maailmassa. Nythän on
samantekevä, ajattelin minä, viisi rehellisyydestä! Mutta ei
kartanonherrankaan pitäisi päästä aivan ilman mitään! Ajoin hänen
pihastaan viisikymmentä härkää, yhden joka kepinlyönnistä.
Fehertòssa möimme eräälle teurastajalle, jonka oli tapana ostaa
nautakarjaa ilman passia; hän rikastui siten. Mutta he ajoivat takaa
karjan varasta ja pakottivat minut pakenemaan Theissin yli. Näiden
kelpo ihmisten kera yhdyin Revberer pustalla ja nyt aijomme
yhdessä Bakonyhin. Sanon teille, siellä on vielä jotain saatavaa
köyhille pojille, (maantierosvoille), jolleivät he ole liian hitaita.'

"'Se on totta', sanoi vanha talonisäntä; 'ja on siellä sekin hyvä, että
kuuluisa Vessprimerin hirsipuu on aivan lähellä. Säälin sinua
sydämestäni rakas veliseni, sillä jos jossakin pesisivät varikset
pääkalloosi, niin et toki itse ollut syyllisyyteesi alkusyy. Mutta
samantekevä. Lusikoi vaan soppaasi. — Hm, ne viisaat lainsäätäjät!
Rikas ja köyhä ovat heille yhdenvertaiset, mutta on siitä suurikin apu!
Helppo on rikkaan olla varastamatta; mutta kuolkoonpas hänen
isänsä ja puuttukoonpas häneltä laudat arkuksi, silloin olisi hauska
nähdä mitä hän tekee, jos hänellä on sydän rinnassaan. Ja sitten
huutavat he vielä köyhän jälkeen: Lyökää häntä! Hirttäkää hänet!
Hän on varas, lurjus! — Nouse ylös tyttöseni Vicga! Tuo
juustonkimpale tänne! Syökäämme, se on parasta.'

"Vicza toi kauniissa pikkuastiassa, mitä oli vaadittu, ja toi lisäksi


leipääkin ja me kävimme siihen urhoollisesti käsiksi. Ruuan jälkeen
otti vanhus tamburiinin naulasta ja soitteli sillä niin kauniita
laulunpäitä, että aivan teki sydämelle kipeää. — Tuli riittyi, liekki
lieskahti enää vaan silloin tällöin; vanhus soitteli, me kuuntelimme
hartaasti… Äkkiä kuulimme aseiden kalsketta, ja kun hypähdimme
pystyyn, seisoi ovella aseellisia miehiä. —

"'Siinäpäs olet vihdoinkin!' huusi muuan tarttuen minuun. 'Ja nuo


toiset, mitä lintuja he ovat? Ottakaa heidät kiinni!'

"Kahden betyarin onnistui pujahtaa pakoon ja kadota pimeään,


kolmas saatiin kiinni, ja hänet sidottiin kuten minutkin. Hän oli juuri
sama, joka äsken kertoi elämäntarinansa, nuorin kaikista.
"Julia, poloinen, seisoi hämmentyneenä ja hädissään. Kuten ajettu
metsänotus, aikoi hän ryhtyä puolustautumaan.

"'Jätä toki, sydänkäpyseni!' huusin hänelle. 'Onhan se kuitenkin


turhaa.'

"Mutta hän ei antanut perään, ennenkuin muuan sotamies antoi


hänelle kovan sysäyksen, niin että hän vaipui maahan. Minusta
tuntui, kuin olisi puukko pistetty sydämeeni! Jos olisin ollut vapaa,
olisin miehen paiskannut mäsäksi lattiaan. Mutta minä olin köysissä
enkä voinut liikahtaakaan. Kyynelet pursuivat silmiini, vaahto
huulilleni! — Meidän täytyi pois. Pyysin heitä odottamaan vielä vain
hetkisen, kunnes Julia heräisi tainnoksistaan, jotta voisin sanoa
hänelle jäähyväiset, mutta he eivät suostuneet. He veivät minut pois,
veivät yhdessä tuon pojan kanssa, joka varasti puita ruumisarkuksi
ja oli Ladislaus Horgay nimeltään…

"Siten tehtiin minusta sotamies ja Horgaysta myös minun


mukanani, koskei meillä ollut mitään passia. Seuraavina päivinä
marssimme ulkomaille Napoleonia vastassa seisovaan
sotajoukkoon. Kahden kuukauden perästä olin jo onnellisesti
sivuuttanut ensimäisen taistelun. Horgay, josta oli tullut kelpo toveri
minulle, säästi somia summia. Ei ainoatakaan helleriä menettänyt
hän turhaan, vaan lähetti kaikki kotikylänsä kirkkoherralle pyynnöllä,
että niillä pystytettäisiin muistokivet hänen vanhempiensa haudoille,
jotta hän löytäisi paikat, kun hän kerran palaisi kotiin. Mutta turhaan
toivoi kelpo poika, sillä hän kaatui pian sen jälkeen taistelussa.
Sivultani ammuttiin hänet hevosen selästä ja minä kysyin tuskan
liikuttamana kuolevalta:

"'Mitkä terveiset vien kotipuoleesi, rakas toveri, jos jään eloon?'


"'Kotiinko?' sanoi hän. 'Ei minulla ole mitään kotipaikkaa. Minulla
oli vaan isä ja äiti, ja he ovat kuolleet ja nyt menen minäkin sinne,
missä he ovat. Kuinka onnellinen olenkaan elämästä vapautuessa.'

"Sitten kuoli hän.

"Olin taas yksin. Ladislaus raukan kanssa voin joinakin hetkinä


puhella Juliastani, nyt ei minulla ollut enää sitäkään. En saanut
mitään tietoa hänestä. Tosin olin kirjottanut hänelle yhden kirjeen,
mutta en saanut mitään vastausta, sillä me olimme milloin siellä,
milloin täällä. Ajattelin ja mietiskelin usein öisin istuessani
leirivalkean ääressä: Mitä on tytöstä tullut? Eikö hän ole kuollut. Ja
ellei hän ole kuollut, eikö hän ehkä ole naimisissa? Rakastaako hän
minua vielä, rakastaako hän minua sitten, kun palaan takaisin kotiin?
— Murhe syöpyi sydämeeni ajatellessani hänen ehkä kuolleen tai
rakastavan toista, ja usein karkasi tuska niin kiivaana kimppuuni, että
rukoilin taistelun edellä: 'Armollinen Jumala, ota elämäni!'

"Mutta aika riensi ja huuhtoi palan palalta murhettani niinkuin


aallot rantaturvetta. Ja vuosien kuluttua en tuntenut enää mitään
tuskaa, vaan jonkullainen suloinen tunne vetäytyi sydämeeni.
Hitaasti kuihtuva toivo on ihmisrinnassa kauniin, nuoren tytön
kaltainen pää seppelöitynä muistojen valkoisilla ruusuilla.

"Neljä vuotta olin sotamiehenä, sitten sain eron. Vasen käteni oli
ammuttu läpi, en kelvannut enää sotamieheksi. Sota-aikaan karttuu
muutamille enemmän rahaa kuin muulloin; minäkin olin raapinut
kokoon suunnilleen viisisataa guldenia. Huoleti voin siis palata kotiin
tarvitsematta peljätä nälkään nääntymistä, niinkuin moni muu jota
painoi sodan kurjuus. Ensi ajatukseni oli Julia; mutta ajatus oli
melkein välinpitämätön. Surra — olin surrut kylliksi; iloita — ei ollut
mitään syytä iloon, sillä en tiennyt mikä minua odotti kotona.
"Kaikkein ensiksi menin siihen kylään, missä olimme palvelleet
yhdessä; mutta sieltä en voinut saada minkäänlaista tietoa, hän ei
ollut tullut sinne takaisin. Etsin senjälkeen sen talon, josta minut oli
viety väkipakolla sotamieheksi. Oli kaunis kesäilta, kun taas katselin
kaukaa tuota viidakon ja kaislalammikon välillä sijaitsevaa taloa.
Tätä katsellessani pamppaili sydämeni kuin sellainen kellolaitos, joka
kauvan seisottuaan on taas äkkiä ruvennut käymään. Jokainen
verenpisara syöksyi kasvoihini ja sieltä taas takaisin sydämeen,
aivankuin jokin rauhaton lapsi. Aloin pelätä, toivoa! Mitähän, jos hän
on kuollut… Jospa hän elää… Jos on mennyt naimisiin… Entäpä,
jos hän nyt vielä odottaa minua!…

"Huomasin sillä välin jo saapuneeni majan luo, mutta jalkani


vapisivat niin, että tuskin voin pysyttäytyä pystyssä. Kun astuin
kynnykselle, kietoutui joku takaapäin kaulaani ja huusi:

"'Peter, Peter, rakas Peter! Rakastatko minua vielä?'

"Se ei ollut kukaan muu kuin Julia!

"Hän oli kastelemassa kasviksia puutarhassa huomatessaan


minut ja juoksi luokseni. Hänen silmänsä epäilivät, mutta sydän
sanoi, että hänen edessään olin minä… Mitä jo sanoin! Hän
heittäytyi kaulaani, minäkin syleilin häntä, ja päät yhdessä itkimme
me kauvan — hiljaa, huojentavasti! Kuinka suloiset ovatkaan
ilonkyyneleet!

"Tänä yönä emme ollenkaan nukkuneet; me puhelimme. Minun


täytyi kertoa kaikki, mitä minulle oli tämän neljän vuoden aikana
tapahtunut. Kun mainitsin kuulasta, joka lävisti käteni, huudahti Julia
tuskaisesti, kalpeni ja tarttui omaan käteensä; minulle ei haavani
voinut tuottaa niin paljon tuskaa kuin hänelle. — Sitten kertoi hän
kuinka hänelle oli käynyt. Kelpo vanhus otti hänet taloonsa sanoen,
että missä neljä tulisi ravituksi, siellä ei viidennenkään tarvitsisi
kuolla nälkään. Mutta vanhus kuoli pian, tytär meni naimisiin, ja niin
jäi taloon vaan kolme: vanhuksen molemmat pojat ja hän. Vanhempi
olisi tahtonut naida hänet ja ahdisti häntä siihen saakka
tarjouksillaan, kunnes hän ilmoitti, että se, joka oli tullut sinne hänen
mukanaan, ei ollut hänen veljensä, vaan sulhasensa ja ettei hän
tahtonut kuulua kenellekään muulle kuin hänelle. Kelpo nuorukainen
ei puhunut siitä lähtein enää sanaakaan asiasta; mutta öisin kuuli
hän hänen usein katkerasti huokaavan. Mielellään olisi hän
lohduttanut häntä, mutta sehän olisi ollut turhaa. Päivisin oli hän
iloinenkin, ainakin näytti olevan. Edellisenä syksynä oli hän kuollut
keuhkotautiin ja testamenteerannut Julialle koko omaisuutensa ja
pyytänyt häntä pitämään huolta veljestään Michelistä. Näin päätti
Julia:

"'Puolet tästä omaisuudesta kuuluu minulle, tahdotko jakaa sen


kanssani,
Peter?'

"'En', sanoin minä, 'jättäkäämme se pikku Michelille. Mutta


tahdotko sinä jakaa minun omaisuuteni kanssani?'

"'Oletko sinä säästänyt?'

"'Kyllä, voidaksemme panna alkuun kunnollisen talouden.'

"'Meidän ei siis tarvitse koskaan erota?'

"Ei, rakas lapsi, ei koskaan!"


"Kolme viikkoa myöhemmin riisui hän parton [tyttöjen päähine]
päästään ja asetti hipin sijalle ja oli nimeltään rouva Peter Pergö,
samoinkuin tänäänkin.

"Poissaollessani olivat hänen kasvonsa hiukan surkastuneet,


mutta vaimokseni tultuaan kukoisti hän päivä päivältä yhä enemmän
ja tuli yhä kauniimmaksi. Minusta ainakin näytti, että hän rouvana
ollessaan oli vielä kauniimpi kuin tyttövuosinaan. Mutta sanonpa
teille enemmänkin, vaikkakin sille nauraisitte! Hän on nyt
kuusikymmenvuotias ja kumminkin näyttää hän minusta
kauniimmalta kuin kaikki ne tytöt, joita olen nähnyt ja näen.

"Jokainen mustalainenkin kehuu hevostaan", ajatteli Ferko ja


katseli Pannia, joka taas hänen mielestään näytti auringon alla
vaeltavaisista kauneimmalta; ja siinä asiassa oli vähän perääkin,
vaikkei se ollut aivan niin kuin hän luuli.

"Me perustimme talouden", jatkoi vanhus, "joka menestyi kelpo


lailla. Michel oli kerran tyytyväinen, hän meni naimisiin myöhemmin
ja me asetuimme sitten asumaan tähän kylään, ostimme talon ja
näimme omaisuutemme enenevän. Minun pitäessä huolta
taloudesta, kasvatti vaimoni ainoata poikaamme. Eikä hän turhaan
olekaan niin paljon huolehtinut hänen kasvatuksestaan, sillä pojasta
tuli kunnon mies. Niin, teidän isänne, rakkaat lapset, on kiireestä
kantapäähän kunnon mies, ehkä vielä parempi talonisäntä kuin minä
olin, hän on ymmärtänyt kartuttaa saatua omaisuuttaan."

En tiedä, tahtoiko vanhus vielä jatkaa kertomista vai ei? —


Samassa palasivat pienokaisten vanhemmat ja mummo
tappajaiskeitolta. — Pikku tyttönen oli jo aikoja sitte nukahtanut
isoisän syliin, hänen sisarensa, Katri, kantoi hänet vuoteeseen.
Pikku Peter oli sitävastoin vielä aika reipas ja meni heti kysymään,
mitä tuomisia hänelle tuotiin. Palvelijat menivät levolle, toinen
kyökkiin, toinen talliin. Kun he astuivat ulos tuvasta, tarttui Ferko
Pannin käteen ja kuiskasi:

"Sanohan, rakas Panni! Jos minut vietäisiin sotamieheksi, kuten


vanha isäntä, odottaisitko sinäkin minua neljä vuotta? Sanohan
suoraan se!"

"Kyllä, totisesti odottaisin minä sinua", vastasi tyttö; "en odottaisi


sinua ainoastaan neljää vuotta, vaan viimeiseen hengenvetooni
saakka."

"Suloinen pikku tyttöni!" huudahti Ferko ja asteli laulaen talliin…

Sisällä tuvassa kertoi vanhus lapsilleen, että vanha kerjäläisparka


oli pyytänyt yösijaa, voitaisiinhan toki hänelle valmistaa vuode uunin
luo, johon hänen miniänsä oli heti valmis.

"Mutta sanohan, isoisä", sanoi äkkiä pikku Katri, "kuinka on käynyt


sitten tuon pahan junkkarin, joka teki niin paljon pahaa isoisälleni ja
isoäidilleni?"

"Tottapuhuen en tiedä sitä!" vastasi vanhus. "Sillä en ole ajatellut


häntä sen enempää."

"Minä tiedän, mitä hänestä on tullut", sanoi kerjäläisvanhus.

"Tekö tiedätte? kysyi mestari Peter hämmästyneenä.

"Niin, minä tiedän sen. Isänsä kuoleman jälkeen eli hän kuin
viimeistä päivää ja joutui vihdoin niin pitkälle, että hän nyt ryysyisenä
kerjäläisenä ja paljain päin, jalat kiedottuina olkiin kenkien sijasta,
seisoo edessänne, katuen tekojaan nyt, kun katumus on liian
myöhäistä!"

Ukkovaari astui hämmästyneenä takaperin; säälien katseli hän


miestä, joka oli suuresta herrasta alentunut kurjaksi kerjäläiseksi ja
jupisi hiljaa itsekseen: "Jumala, kuinka suuri on sinun voimasi ja
vanhurskautesi!"
*** END OF THE PROJECT GUTENBERG EBOOK PAPURIKKO-
VALAKKA. UKKOVAARI ***

Updated editions will replace the previous one—the old editions will
be renamed.

Creating the works from print editions not protected by U.S.


copyright law means that no one owns a United States copyright in
these works, so the Foundation (and you!) can copy and distribute it
in the United States without permission and without paying copyright
royalties. Special rules, set forth in the General Terms of Use part of
this license, apply to copying and distributing Project Gutenberg™
electronic works to protect the PROJECT GUTENBERG™ concept
and trademark. Project Gutenberg is a registered trademark, and
may not be used if you charge for an eBook, except by following the
terms of the trademark license, including paying royalties for use of
the Project Gutenberg trademark. If you do not charge anything for
copies of this eBook, complying with the trademark license is very
easy. You may use this eBook for nearly any purpose such as
creation of derivative works, reports, performances and research.
Project Gutenberg eBooks may be modified and printed and given
away—you may do practically ANYTHING in the United States with
eBooks not protected by U.S. copyright law. Redistribution is subject
to the trademark license, especially commercial redistribution.

START: FULL LICENSE


THE FULL PROJECT GUTENBERG LICENSE

Вам также может понравиться