Full download Full-Stack Web Development with Go: Build your web applications quickly using the Go programming language and Vue.js 1st Edition Nanik Tolaram pdf docx
Full download Full-Stack Web Development with Go: Build your web applications quickly using the Go programming language and Vue.js 1st Edition Nanik Tolaram pdf docx
com
https://textbookfull.com/product/full-stack-web-development-
with-go-build-your-web-applications-quickly-using-the-go-
programming-language-and-vue-js-1st-edition-nanik-tolaram/
OR CLICK BUTTON
DOWNLOAD NOW
https://textbookfull.com/product/let-s-go-learn-to-build-professional-
web-applications-with-go-alex-edwards/
textboxfull.com
https://textbookfull.com/product/let-s-go-learn-to-build-professional-
web-applications-with-go-alex-edwards-2/
textboxfull.com
https://textbookfull.com/product/go-web-programming-1st-edition-sau-
sheong-chang/
textboxfull.com
Mastering Full Stack React Web Development 1st Edition
Tomasz Dyl
https://textbookfull.com/product/mastering-full-stack-react-web-
development-1st-edition-tomasz-dyl/
textboxfull.com
Pro MERN Stack: Full Stack Web App Development with Mongo,
Express, React, and Node Vasan Subramanian
https://textbookfull.com/product/pro-mern-stack-full-stack-web-app-
development-with-mongo-express-react-and-node-vasan-subramanian/
textboxfull.com
Pro MERN Stack: Full Stack Web App Development with Mongo,
Express, React, and Node 2nd Edition Vasan Subramanian
https://textbookfull.com/product/pro-mern-stack-full-stack-web-app-
development-with-mongo-express-react-and-node-2nd-edition-vasan-
subramanian/
textboxfull.com
Full-Stack Web Development
with Go
Nanik Tolaram
Nick Glynn
BIRMINGHAM—MUMBAI
Full-Stack Web Development with Go
Copyright © 2023 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 authors, nor Packt Publishing or its dealers and distributors, will be held liable
for any damages caused or alleged to have been 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.
ISBN 978-1-80323-419-9
www.packtpub.com
To my dearest Mum, who always supported me in pursuing my dreams and encouraged me to keep on
going no matter what life brought.
To my late Dad, who stood by me and encouraged me to write my very first book when I was
17 years old.
To my beautiful wife and best friend, for allowing me the time to write the book and supporting me in
every step of our life.
To both my sons, Rahul and Manav, for allowing me to spend time in front of the computer on
weekends to chase my dream and passion. Last but not least, to God, for giving me this life and the
opportunity to be where I am in this world.
– Nanik Tolaram
I would like to thank my family for their love; my beautiful daughter Inara, for always being there
to brighten my day; and my beautiful partner Kate, for all her support in my business efforts and in
writing this book.
– Nick Glynn
Contributors
I want to thank the Packt team – Feza Shaikh, Bhavya Rao, Manthan Patel, and Mark D’Souza – for
their guidance and patience in helping us complete the book.
Nick Glynn is the founder and current chief product officer of FeeWise, a US payments and finance
platform.
He has previously worked in CTO, senior, and principal engineering roles developing products, training,
and consulting for companies such as Intel, Qualcomm, Hewlett Packard, L3, and many more.
With a broad range of experience from board bring-up, Linux driver development, and systems
development up through to building and deploying platforms that power investment and financial
institutions, Nick is always looking to build pragmatic solutions to real-world problems.
Nick also continues his independent efforts as a trainer and consultant, delivering courses and expertise
globally through his company Curiola (www.curiola.com).
About the reviewers
Pablo David Garaguso was born in Mar del Plata, Argentina. He graduated with two degrees in
computer sciences and enterprise systems from CAECE University and later on received an MBA
from CEMA University in Buenos Aires, Argentina. He has worked as an attached professor, project
leader, and international manager, and currently occupies a position as a solutions architect in R&D
for FamilySearch Int. Europe. Based in Finland, he has published a variety of books according to his
many interests, from novels and fiction to software engineering. His latest book, Vue 3 Applications
and Design Patterns, will be published by Packt in 2023.
Suraj Bobade is an experienced software professional, currently located in Pune, India. He completed
a B.Tech in computer science from Walchand College of Engineering, Sangli.
He is passionate about software development with a keen interest in product management. He builds
user-first feature-rich products while driving critical software and product design decisions.
Go has been his go-to choice for building the microservice backend and prototypes. Considering the
simplicity and increasing adoption by the open source community, Suraj is optimistic that readers of
this book will learn in-demand skills.
Tan Quach is an experienced software engineer with a career spanning over 25 years and exotic locations
such as London, Canada, Bermuda, and Spain. He has worked with a wide variety of languages and
technologies for companies such as Deutsche Bank, Merrill Lynch, and Progress Software, and loves
diving deep into experimenting with new ones.
Tan’s first foray into Go began in 2017 with a proof-of-concept application built over a weekend and
productionized and released 3 weeks later. Since then, Go has been his language of choice when
starting any project.
When he can be torn away from the keyboard, Tan enjoys cooking meat over hot coals and open
flames and making his own charcuterie.
Nima Yahyazadeh is a Software Architect focused on developing solutions for startups. He has years
of experience developing distributed and cloud-native solutions. He has worked at medium to large
corporations such as Amazon Web Services, Intel, and Appian. He is currently the founder and CEO
of a consulting company, Lenzo LLC, that has helped more than five startups to architect, develop, and
deliver exciting features to their customers. He is passionate about AWS, Kubernetes, Elasticsearch,
Kafka, and Golang.
Table of Contents
Prefacexi
2
Application Logging 23
Technical requirements 23 Writing log messages to the
Exploring Go standard logging 23 logging server 30
Using golog 26 Configuring multiple outputs 33
Local logging 29 Summary36
3
Application Metrics and Tracing 37
Technical requirements 37 The OpenTelemetry APIs and SDK 39
Understanding OpenTelemetry 38 Tracing applications 40
viii Table of Contents
5
Securing the Backend and Middleware 85
Technical requirements 85 Adding cookies and sessions 92
Adding authentication 86 Cookies and session handling 92
Creating our dummy user 88 Storing session information 95
Authenticating a user 89 Using Redis for a session 95
6
Moving to API-First 99
Technical requirements 99 Exposing our REST API 102
Structuring an application 100 Cross-Origin Resource Sharing (CORS) 104
Defining packages 100 JSON middleware 105
Session middleware 107
Table of Contents ix
8
Frontend Libraries 135
Technical requirements 135 Setting up Buefy 141
Understanding Vuetify 136 UI components 142
Setting up Vuetify 136 Validating data entry with Vuelidate 143
Using UI components 137 Better input handling with Cleave.JS 148
Understanding Buefy 139 Summary150
Bulma sample 140
9
Tailwind, Middleware, and CORS 151
Technical requirements 151 Introducing Tailwind 151
x Table of Contents
Creating a new Tailwind and Vite project 153 CORS for secure applications 163
Consuming your Golang APIs 156 Creating Vue middleware 166
Summary168
10
Session Management 169
Technical requirements 169 Navigation guards 179
Session management and JWTs 169 Defaults and error pages 182
What’s a JWT? 170 Summary182
(Re)introducing Vue Router 178
12
Building Continuous Integration 199
Technical requirements 199 Dockerfile210
Importance of CI 200 GitHub Packages 210
Setting up GitHub 200 Publishing to GitHub Packages 212
GitHub Actions 204 Pulling from GitHub Packages 216
13
Dockerizing an Application 219
Technical requirements 219 Running images as containers 227
Installing Docker 219 Building and packaging images 229
Using Docker 221 Docker Compose 233
Docker images 222 Summary235
14
Cloud Deployment 237
Technical requirements 237 The init command 245
AWS refresher 238 The plan command 247
The destroy command 250
Amazon Elastic Compute Cloud 239
Virtual Private Cloud 240 Coding in Terraform 252
Database storage 241 Providers252
Elastic Container Service 242
AWS tools 242
Terraform examples 254
Pulling from GitHub Packages 255
Understanding and using Terraform 243 AWS EC2 setup 257
What is Terraform? 244 Deploying to ECS with a load balancer 261
Installing Terraform 244
Summary269
Terraform basic commands 245
Index271
Chapter 7, Frontend Frameworks, discusses the state of web development, introduces the React and
Vue frameworks, and sees us employ them to create a simple app that's similar to our previous one.
Chapter 8, Frontend Libraries, examines how to leverage tools and libraries to help us, as full stack
developers, work fast!
Chapter 9, Tailwind, Middleware, and CORS, has us securing our app and getting it talking to our
Go-powered backend.
Chapter 10, Session Management, focuses on session management while introducing state management
with Vuex and how to structure apps based on user permissions.
Chapter 11, Feature Flags, introduces feature flags (sometimes called feature toggles) as a technique
deployed to enable/disable certain features of the application as required, depending on a given
condition. For example, if a newly deployed application containing a new feature has a bug and we
know it will take time for the bug to be fixed, the decision can be made to turn off the feature without
deploying any new code to do so.
Chapter 12, Building Continuous Integration, notes that while building applications is a big part of the
puzzle, we need to be sure that what the team builds can be validated and tested properly. This is where
continuous integration comes in. Having a proper continuous integration process is super important
to ensure that everything deployed to production has been tested, verified, and checked securely.
Chapter 13, Dockerizing an Application, notes that while developing an application is one side of the coin,
the other side is to make sure that it can be deployed and used by our end user. To make deployment
simpler, we can package applications such that they can be run inside a container. Operationally, this
allows applications to be deployed in the cloud from anywhere.
Chapter 14, Cloud Deployment, shows how deploying applications to a cloud environment is the last
step in delivering features for the end user to use. Cloud deployment is complex and sometimes quite
specific to particular cloud vendors. In this chapter, we will focus on deploying applications into the
AWS cloud infrastructure.
If you are using the digital version of this book, we advise you to type the code yourself or access
the code from the book’s GitHub repository (a link is available in the next section). Doing so will
help you avoid any potential errors related to the copying and pasting of code.
Conventions used
There are a number of text conventions used throughout this book.
Code in text: Indicates code words in text, database table names, folder names, filenames, file
extensions, pathnames, dummy URLs, user input, and Twitter handles. Here is an example: “We call
next.ServerHTTP(http.ResponseWriter, *http.Request) to continue and indicate
successful handling of a request.”
A block of code is set as follows:
go func() {
...
s.SetAttributes(attribute.String(“sleep”, “done”))
s.SetAttributes(attribute.String(“go func”, “1”))
...
}()
Bold: Indicates a new term, an important word, or words that you see onscreen. For instance, words in
menus or dialog boxes appear in bold. Here is an example: “You will get a Login unsuccessful message.”
xvi Preface
Get in touch
Feedback from our readers is always welcome.
General feedback: If you have questions about any aspect of this book, email us at customercare@
packtpub.com and mention the book title in the subject of your message.
Errata: Although we have taken every care to ensure the accuracy of our content, mistakes do happen.
If you have found a mistake in this book, we would be grateful if you would report this to us. Please
visit www.packtpub.com/support/errata and fill in the form.
Piracy: If you come across any illegal copies of our works in any form on the internet, we would
be grateful if you would provide us with the location address or website name. Please contact us at
[email protected] with a link to the material.
If you are interested in becoming an author: If there is a topic that you have expertise in and you
are interested in either writing or contributing to a book, please visit authors.packtpub.com.
https://packt.link/free-ebook/9781803234199
In Part 1, we will build the backend components for our sample application. We will build the database
with the models for the Go backend of our application. We will also build secure REST API endpoints
that will have logging and tracing functionalities.
This part includes the following chapters:
• Creating an exercise
• Creating a workout plan
• Logging in to the system
We will also explore tools that will help in automatic code generation based on SQL queries, which reduces
the amount of database-related code that needs to be written to a large extent. Readers will learn to use
the tool to also auto-generate all the relevant CRUD operations without writing a single line of Go code.
In this chapter, we’ll be covering the following:
• Installing Docker
• Setting up Postgres
• Designing the database
4 Building the Database and Model
• Installing sqlc
• Using sqlc
• Setting up the database
• Generating CRUD with sqlc
• Building the makefile
Technical requirements
In this book, we will be using version 1.16 of the Go programming language, but you are free to use
later versions of Go, as the code will work without any changes. To make it easy, all the relevant files
explained in this chapter can be checked out at https://github.com/PacktPublishing/
Full-Stack-Web-Development-with-Go/tree/main/Chapter01. To work on the
sample code in this chapter, make sure you change the directory to Chapter 1 – Full-Stack-
Web-Development-with-Go/chapter1. If you are using Windows as a development machine,
use WSL2 to perform all the different operations explained in this chapter.
Installing Docker
In this book, we will be using Docker to do things such as running databases and executing database
tools, among others. You can install either Docker Desktop or Docker Engine. To understand more
about the difference between Docker Desktop and Engine, visit the following link: https://
docs.docker.com/desktop/linux/install/#differences-between-docker-
desktop-for-linux-and-docker-engine. The authors use Docker Engine in Linux and
Docker Desktop for Mac.
If you are installing Docker Desktop on your local machine, the following are the links for the different
operating systems:
• Windows – https://docs.docker.com/desktop/windows/install/
• Linux – https://docs.docker.com/desktop/linux/install/
• macOS – https://docs.docker.com/desktop/mac/install/
If you want to install Docker binaries, you can follow the following guide: https://docs.docker.
com/engine/install/binaries/.
Setting up Postgres 5
Setting up Postgres
The database we chose for the sample application is Postgres; we chose Postgres over other databases
because of the wide variety of open source tools available for building, configuring, and maintaining
Postgres. Postgres has been open source from version 1 since 1989 and it is used by big tech startups
worldwide. The project has a lot of community support in terms of tools and utilities, which makes it
easier to manage and maintain. The database is suitable for small all the way to big replicated data stores.
The easiest way to run it locally is to run it as a Docker container. First, use the following command
to run Postgres:
The command will run postgres on port 5432; if by any chance you have other applications or
other Postgres instances listening to this port, the command will fail. If you need to run Postgres on a
different port, change the -p parameter (for example, -p 5555:5432) to a different port number.
If successful, you will see the container ID printed out. The ID will differ from what is shown here:
f7bdfb7d2c10c5f0c9227c9b0a720f21d3c7fa65907eb-
0c546b8f20f12621102
Check whether Postgres is up and running by using docker ps. The next thing to do is use the
psql-client tool to connect to Postgres to test it out. A list of the different Postgres client tools
available on different platforms can be found here: https://wiki.postgresql.org/wiki/
PostgreSQL_Clients.
We will use the standard postgres psql tool using Docker. Open another terminal and use the
following Docker command to run psql:
What we are doing is executing the psql command inside the running Postgres container. You will
see output such as the following, indicating that it has successfully connected to the Postgres database:
postgres=#
6 Building the Database and Model
On a successful connection, you will see the following output. Note that the warning message mentions
server major version 14 – this is to indicate that the server version is newer than the current psql
version as per the documentation (https://www.postgresql.org/docs/12/app-psql.
html). The psql client will work without any problem with the Postgres server:
With this, you have completed the local setup of Postgres and are now ready to start looking into
designing the database.
Looking at these functionalities, we will look at designing a database structure that will look like the
following entity relationship diagram:
Let’s drill further into each table to understand the data that they contain:
The trade-off we are making to store images in the database is to simplify the design; in reality, this
might not be suitable for bigger images and production. Now that we have defined the database
structure and understand what kind of data it will store, we need to look at how to implement it. One
of the major criteria that we want to focus on is to completely separate writing SQL from the code;
this way, we have a clear separation between the two, which will allow higher maintainability.
Installing sqlc
We have defined the database structure so now it’s time to talk a bit more about the tool that we are
going to be using called sqlc. sqlc is an open source tool that generates type-safe code from SQL; this
allows developers to focus on writing SQL and leave the Go code to sqlc. This reduces the development
time, as sqlc takes care of the mundane coding of queries and types.
The tool is available at https://github.com/kyleconroy/sqlc. The tool helps developers
focus on writing the SQL code that is needed for the application and it will generate all the relevant code
needed for the application. This way, developers will be using pure Go code for database operations.
The separation is clean and easily trackable.
The following diagram shows the flow that developers normally adopt when using the tool at a high level.
All SQL code will be written in .sql files, which will be read and converted by the sqlc tool into the
different Go code.
10 Building the Database and Model
go install github.com/kyleconroy/sqlc/cmd/sqlc@latest
Make sure your path includes the GOPATH/bin directory – for example, in our case, our path looks
like the following:
…:/snap/bin:/home/nanik/goroot/go1.16.15/go/bin:/home/nanik/go/
bin
If you don’t have GOPATH as part of the PATH environment variable, then you can use the following
command to run sqlc:
$GOPATH/bin/sqlc
Usage:
sqlc [command]
Available Commands:
compile Statically check SQL for syntax and type
errors
completion Generate the autocompletion script for the
specified shell
generate Generate Go code from SQL
help Help about any command
init Create an empty sqlc.yaml settings file
upload Upload the schema, queries, and configuration
for this project
version Print the sqlc version number
Flags:
-x, --experimental enable experimental features (default:
false)
-f, --file string specify an alternate config file
(default: sqlc.yaml)
-h, --help help for sqlc
*
Dal giorno che la vecchia gli aveva restituito i doni, il muto non si era
mai trovato da solo a sola con la fanciulla; poichè la fanciulla aveva
saputo trovar modo di sfuggirlo — come sfuggiva Giuseppe, di cui
era seriamente innamorata.
Dacchè Bastiano aveva fatto ritorno all’Avru, si era notato un
cambiamento nelle sue abitudini. Non scherzava più nè rideva come
prima; sedeva in un canto del piazzale, e lavorava tranquillamente
non preoccupandosi di nulla — neppure delle insidie che potevano
venirgli tese come bandito. Ma da questo lato aveva sempre una
misteriosa sorvegliante: Gavina — la quale, quantunque in
apparenza distratta, non dimenticava mai di volgere uno sguardo
all’ingiro, per far la guardia al suo protetto.
Una sera, mentre le donne erano raccolte nello stazzo, la moglie di
Anton Stefano aveva trovato modo di appiccar discorso con
Giuseppe, e lo aveva tratto seco, per la piccola viottola che
conduceva all’ovile, poco distante.
Giuseppe quella sera era molto preoccupato; e la futura suocera ben
sapeva il motivo della sua inquietudine.
— Cos’hai, Giuseppe? — le disse, fingendo un’aria distratta.
— Sono annoiato.
— Un po’ di pazienza, figliuolo mio! Le cose si appianeranno.
— Temo che la Gavina non mi voglia bene!
— Timori sciocchi! la Gavina non pensa che a te — e te ne darei le
prove più convincenti, se delicatezza di madre non mi consigliasse di
tacere.
— Quel muto che non vuol abbandonare lo stazzo m’indispone...
m’irrita!
— Che vuoi? è un povero bandito che tutti siamo in dovere di
proteggere.
— Mancano forse altri stazzi in Gallura? Perchè lo abbiamo sempre
fra i piedi?
— Pazienza, figliuolo! Bastiano finirà per andarsene.
— Pare però che ne dimostri poca voglia.
— Si stancherà di venirvi.
— E... se non si stancasse?
— Allora si troverà il modo di farlo stancare.
La suocera pronunciò queste parole con un tono così secco, che
Giuseppe si fermò di botto, e la fissò in volto.
— E qual modo?
La suocera lanciò un’occhiata al nipote, e si strinse nelle spalle.
Giuseppe capì — o credette capire. Capiva che non bisognava render
la suocera responsabile di certi avvenimenti.
Camminarono insieme per un buon tratto di strada ma senza
discorrere. Quel silenzio non faceva che far maturare nel cervello di
Giuseppe l’idea che vi era stata gettata, come a caso, dalla futura
suocera. L’eco delle ultime parole della vecchia non si era perduto
nello spazio: si ripercuoteva ancora nelle orecchie dell’amante.
Giuseppe era sopra pensiero. Grosse goccie di sudore grondavano
dalla sua fronte: ed egli le asciugava col fazzoletto. La vecchia finse
di far cadere ad arte il discorso sopra ad altri argomenti — ma
Giuseppe non sentiva; esso andava ruminando quella idea, quasi
rivoltandola da tutte le parti, come per trovarvi il lato più comodo
per realizzarla.
Dopo un lungo silenzio, la vecchia domandò a Giuseppe se nelle sue
terre di Bortigiadas aveva seminato molto grano, e Giuseppe, che
non sentiva nulla, le rispose cupo, con altra domanda.
— Ditemi... il muto ha proprio giurato di non offendere la vostra
famiglia?
— Sì — rispose la vecchia; e siccome capì che il pensiero di Giuseppe
non era uno scrupolo di coscienza, riprese: — però i parenti del
muto non richiesero da noi un ugual giuramento.
— E come mai hanno potuto omettere una formalità così
importante?
— Ma!... chi lo sa?
Continuarono a passeggiare, fecero ritorno a casa ma non
pronunciarono nessun’altra parola sul muto.
Avevano detto abbastanza — e forse Giuseppe credette capire più di
quanto la vecchia aveva voluto dirgli. Il geloso cugino pensava per
proprio conto, ma voleva creare un pretesto per mettere in pace gli
scrupoli della coscienza.
XII.
Si rompe ogni indugio
XIII.
Vendetta
· · · · · · · · · · · · · · · ·
A passi lenti, chiuso ne’ suoi pensieri camminava per ore ed ore,
senza sapere ove andasse.
Si aggirava inquieto intorno allo stazzo dell’Avru; ma finiva per
ritornare ad uno speco, chiuso fra tre massi di granito, per poter
fissare il pallido lume che vedeva sfavillare laggiù, in mezzo alle
tenebre: stella funesta che annunciava una vendetta — punto
luminoso che pareva additasse una vittima da colpire.
Dal giorno che Anton Stefano lo aveva coperto d’insulti; dal giorno
che Giuseppe gli aveva spezzato il calcio del fucile, facendogli fuoco
addosso, Bastiano non aveva più voluto metter piede in alcuno
stazzo: nè in quello dell’Avru, nè in altri.
— Ormai son solo! — ei pensava — Non ho più sposa, non ho più
amici, non ho più parenti. La sposa si è tolta dalle orecchie i miei
orecchini per dirmi che tutto era finito; l’amico mi ha scacciato dalla
sua casa come un cane; i parenti han fatto lega co’ miei nemici per
perdermi. Han tutti congiurato la mia morte, dunque son solo!
E da quel giorno il muto aveva giurato odio alla sposa, agli amici, e
più di tutti ai parenti: — ai parenti che gli avevano strappato il
giuramento di non recare offesa alla famiglia di Anton Stefano, senza
reclamare ugual giuramento dalla parte avversa. L’omissione di
questa formalità poteva nascondere un perfido disegno, e riuscirgli
fatale. Era mai presumibile che i parenti avessero dimenticata una
promessa che garantiva la sua vita? O piuttosto, nell’ometterla, non
avevano essi cercato un mezzo più facile di disfarsi di lui, perchè
stanchi di sopportarlo? Eppure erano stati loro la causa prima d’ogni
sua sventura! Cieco strumento dei Vasa nell’odio che nutrivano per i
Mamia, per essi si era macchiato di sangue umano. Ecco la
ricompensa che gli davano.
Rabbia, dispetto, vendetta: — erano questi i sentimenti che si
combattevano nell’anima del muto nella notte che precedette l’alba
del 6 luglio!
Chi aveva potuto armare il braccio del suo rivale? Anton Stefano e
sua moglie! — così ragionava Bastiano. — Essi soli avevano
congiurato la sua morte. Mancava loro un braccio punitore — e lo
avevano trovato in Giuseppe, a cui si concedeva la mano di Gavina in
premio d’un assassinio. « — E i miei parenti plaudirono alla trama
infernale! Dopo aver approfittato della mia generosità, mi gettano
ora in un canto, come uno strumento inservibile. E mi sta bene!»
E Gavina?
Al pensiero della figlia di Anton Stefano le smanie del muto parevano
calmarsi; egli dimenticava gli odii, le vendette e i rancori, per non
pensare che a lei. Richiamava alla mente il giorno felice in cui Gavina
gli sedeva al fianco sotto l’ombra del cespuglio spinoso, e al ricordo
di quel braccio nudo, sul quale aveva impresso un bacio ardente,
sentiva il sangue affluirgli al cuore.
Ad un tratto i suoi pensieri presero un altro indirizzo. Gli pareva di
veder Giuseppe, più fortunato di lui, stringersi al petto la bella cugina
per baciarla in bocca. Allora digrignava i denti; levava al cielo i due
pugni minacciosi, e si dava a correre come un disperato, volendo
quasi fuggire quella visione infernale, che lo perseguitava dovunque.
Il suo odio, come i suoi pensieri, si scatenavano allora contro i due
vecchi, che riteneva unica causa della sua infelicità.
— Se Anton Stefano avesse voluto, Gavina sarebbe stata mia! Fu lui
che si lasciò dominare dalla moglie; da colei che mi ha preso a
gabbo: che mi ha restituito i doni, e che ha concesso la propria figlia
al primo venuto, a patto che mi uccidesse! Su lei sola, dunque,
dovrebbe ricadere tutta la mia collera; ma io non sarò così vile da
macchiarmi del sangue di una femminuccia. Voglio colpirla, sì, nel
cuore, ma in modo ch’essa viva per poter conoscere la mano che l’ha
colpita. Le nozze di Gavina hanno da essere lugubri: il giorno
dell’abbraccio non dev’essere per alcuno un giorno di gioia —
dev’essere per tutti un giorno di lutto!
E così pensando gettava uno sguardo terribile sullo stazzo; perocchè
in mezzo alle tenebre che regnavano nella sua mente, egli non
vedeva che quel lume lontano che altri forse avrebbe scambiato con
gli astri del firmamento — non però lui che ben sapeva discernere le
stelle del cielo dai fuochi della terra!
Erano stati per lui due giorni di agonia, quelli che precedettero
quell’alba funesta! Bastiano vedeva tutto fosco; il cielo gli si
presentava sotto un diverso aspetto, la terra aveva per lui nuovi
linguaggi: la natura, invece di dargli calma, pareva volesse
suggerirgli pensieri sinistri. Il giorno prima aveva errato nella foresta
dell’inferno — e forse l’Inferno aveva soffiato nella sua anima.
Tutto gli parlava di morte.
Strane paure, di cui non sapeva darsi ragione, gli si addensavano in
cuore. Gli pareva che ogni cespuglio, ogni crepaccio nascondessero
una creatura umana; che la stessa solitudine fosse popolata di
lugubri fantasmi.
Tutto, a lui d’intorno aveva vita — tutto aveva una parola.
Quando attraversava qualche gola i grossi macigni gli apparivano
come giganti minacciosi che aspettassero un soffio di vento per
piombargli addosso — quando poneva il piede sulle pianticelle
vermiglie che crescono a grappoletti sul muschio o sui licheni del
granito, gli pareva di calpestare sangue aggrumato [25]; quando
s’internava nelle foreste dei sugheri, trasaliva dinanzi ai tronchi rossi
degli alberi a cui era stata tolta la corteccia. Avrebbe giurato che
quelle quercie insanguinate storcessero le braccia per dolersi delle
loro piaghe — oppure che gridassero vendetta contro gli uomini che
le avevano assassinate.
E pensava raccapricciando:
— Dovunque passa, il Gallurese lascia traccia di sangue, — anche sui
graniti e sulle piante!
*
Il lumicino si era spento, e lo stazzo dell’Avru era immerso nelle
tenebre. Tutta la famiglia di Anton Stefano riposava — ma il muto
vegliava per loro.
Accovacciato nello speco, ed in preda ad un tremito nervoso,
Bastiano passò la notte a guardare le stelle, finchè le vide sparire ad
una ad una.
I primi bagliori del giorno nascente cominciarono a tingere le creste
dei monti d’un color scialbo.
Bastiano era stanco, pallido, intirizzito, ma non staccava gli occhi
dalle casette dell’Avru, che cominciavano a rischiararsi a poco a
poco.
Ad un tratto la porta dello stazzo si schiuse, e un uomo comparve
sulla soglia.
Era il pastore Anton Stefano che aveva lasciato le coltri per esplorare
il tempo. Era l’ora in cui le sue cure lo chiamavano alla campagna e il
muto lo sapeva, perchè pratico delle abitudini di quella famiglia.
Al disotto dello speco che serviva di vedetta a Bastiano era un
sentiero che conduceva ad un chiuso. Per di là doveva passare il
povero vecchio.
Un’ora dopo il sole gettava i suoi sprazzi luminosi sulla campagna,
che pareva destarsi alla vita.
Anton Stefano accese la pipa, montò sulla sua cavalla, s’incamminò,
passo passo, per la viottola che rasentava la collina.
Il muto fremette. La vista di quell’uomo produsse in lui un effetto
singolare. Mentre da un canto sentì riaccendersi nell’anima l’ira e la
vendetta, dall’altra gli tornarono in mente l’affetto e la generosità di
quel vecchio pastore, che un dì lo aveva raccolto, protetto,
alimentato....
Un velo di sangue offuscò la sua ragione, e sentì mancarsi. Aveva un
tremito alle mani, ed un cupo ronzìo alle orecchie.
Aveva sempre colpito le sue vittime con freddo coraggio... e questa
volta si sentiva pusillanime.
Chiuse gli occhi spaventato di sè stesso — sperando quasi che il
pastore potesse salvarsi oltrepassando la mèta. Li riaprì lentamente
dopo alcuni minuti... e guardò.
Anton Stefano trovavasi sotto di lui — a tiro del suo fucile.
Bastiano era pallido, tremante.
Gli parve che uno spirito infernale fosse entrato nel suo corpo, e che
operasse nel suo spirito indipendentemente dalla volontà.
Egli guardava a sè dinanzi, come inebetito, non opponendo alcuna
resistenza alla forza misteriosa che ridestava i suoi istinti di belva.
Il fucile passò dalle sue ginocchia alle sue mani; ne montò il grilletto,
lo spianò, puntò... e chiuse nuovamente gli occhi, quasi sperando
che il colpo andasse a vuoto.
Si udì una detonazione.
Anton Stefano ebbe appena il tempo di girare la testa per sapere
dond’era partito il colpo. Vide il suo feritore lassù, in piedi fra due
cespugli, con gli occhi e la bocca spalancati.
Mandò un grido acuto, portando la mano destra al petto... Barcollò,
si contorse, tentò afferrarsi alla criniera della cavalla, ma cadde a
terra gridando aiuto per due volte.
Il muto, svelto come un capriolo, era sparito fra i macigni ed i
lentischi.
*
Allo sparo dell’arma ed alle grida del ferito, le donne, Giuseppe ed i
servi, uscirono dallo stazzo. Essi presentirono l’accaduto quando
videro la cavalla di Anton Stefano che tornava sola dall’Avru. La
povera bestia era tornata indietro, quasi ad annunziare alla famiglia
la disgrazia toccata al suo padrone.
In un baleno si recarono tutti presso al caduto, che si contorceva,
tentando invano di puntellare una mano a terra per rizzarsi.
Furono pianti, urli, grida che straziavano l’anima.
Il vecchio fu sollevato alquanto. Aveva il viso color della cera, l’occhio
vitreo, le labbra insanguinate. Volse intorno gli occhi, stranamente
spalancati, cercando quasi di darsi ragione dell’accaduto.
— Chi ti ha colpito? Parla! parla! — gli chiedevano con ansiosa
premura i servi!
— Il muto, non è vero? — esclamarono insieme Giuseppe ed i
pastori, già resi feroci dal pensiero della vendetta. E avvicinarono
con avidità le loro orecchie alla bocca del morente per raccogliere
coll’ultimo respiro il nome dell’uccisore.
Il vecchio volse in giro gli occhi vitrei, e li fissò a lungo sul volto della
moglie. Finalmente con un supremo sforzo pronunciò queste parole:
— Date uno scudo a San Gavino... Mi ha ucciso il muto... Dovevamo
prevederlo!
Non disse altro.
La scena che accadde in seguito è più facile immaginarla che
descriverla. Le figlie, la moglie, le serve urlavano disperatamente
strappandosi i capelli e assistettero raccapricciando ad un’agonia
straziante che durò due ore.
Uno dei più rispettabili pastori della Gallura, caro a tutti per bontà di
cuore, per nobiltà di carattere e per onestà di costumi, era stato
tolto dal mondo. Lo stesso Pietro Vasa, quando apprese l’accaduto,
esclamò con risentimento:
— Per compensare la morte di Anton Stefano non basterebbe
l’uccisione di diciotto uomini!
PARTE QUARTA
FINALE
I.
Sulla china del monte
· · · · · · · · · · · · · · · ·
*
Appena scomparso il muto tre uomini uscirono da uno dei crepaci di
granito che sono alle falde di Cucurenza. Erano tutti armati di fucile,
e col cappuccio tirato sugli occhi.
Ciascuno di essi — il giorno prima — era partito da un punto diverso:
da Bortigiadas, da Aggius e dalla Trinità di Agultu. Si erano trovati
insieme la mattina seguente: verso sera avevano attraversato le
vallate di Conchedda e di Chiligheddu, tra Muntlju di li Culzi, e il rio
Pirastro, e la vista di Bastiano li aveva colpiti in un modo singolare,
tanto che, istintivamente sentirono il bisogno di celarsi, per non
essere veduti. Si sarebbe detto che l’improvvisa comparsa del muto,
rispondesse, a completare un piano da lungo tempo meditato.
Fra quei tre uomini furono scambiate a voce bassa le seguenti
parole, che io riporto fedelmente, lasciando al lettore, la cura di
decifrarne il misterioso significato, a me ignoto:
— Pare proprio il destino — disse l’uno.
— Oppure il diavolo — soggiunse l’altro.
— Dunque?... esclamò il terzo con l’impazienza di chi vuol troncare
ogni chiacchera per venire ad una conclusione.
— Dunque è intesa.
— A quando?
— A domani, se non avrò intoppi.
— Dove?
— Non lo so. Forse alla Trinità — forse allo Stagnone — forse a Littu
di Zòccaru!
— Come?
— Ciò mi riguarda.
— È giusto. Dove hai attinto le informazioni necessarie?
— A Tempio.
— Perchè non ad Aggius?
— Perchè in Aggius le nevi si sciolgono molto prima che a Tempio.
— E vuol dire?...
— Che ad Aggius fa più caldo di Tempio.
— Ho capito. Io per tanto ritornerò in paese.
— Ad Aggius?
— Sì. Ditemi però: nel caso... chi di voi mi avviserà?
— Io no, perchè sono incaricato di recarmi sotto Castel Doria per
riferire sul mio operato.
— Allora sarò io — disse il secondo. — Domani dovrò trovarmi sul
monte della Crocetta, dove ho un appuntamento con un aggese.
— Ti aspetterò in paese.
— Dimenticate ch’io sono un fuoruscito?
— Come farai dunque?
— Aggius è alle falde della Crocetta.
— Ebbene?
Quest’uomo allora abbassando la voce, come se temesse che i
graniti di Cucurenza gli facessero la spia, spiegò il suo disegno.
— Ben trovata!
— Siamo dunque d’accordo.
— Una pietra nel pozzo.
E i tre uomini si separarono. Due di essi fecero il giro del monte da
parti opposte; il terzo tornò indietro, e a passi frettolosi prese la
direzione d’Aggius.
II.
Il Gran Tamburo
*
Attorno a pochi tizzi che fumavano crepitanti sul focolare d’una
casetta, posta all’estremità superiore del villaggio, stavano raccolte
parecchie persone, componenti una famiglia.
La padrona di casa, piuttosto giovine e alquanto malaticcia, era già a
letto, insieme coi suoi due bambini; la vecchia nonna, settantenne, si
riscaldava dinanzi al fuoco; ed il capo della famiglia — un uomo sui
trent’anni, dalla barba nera e dai capelli lunghi — era in piedi vicino
a un cassettone antico, intento a ripulire le canne del suo fucile;
perchè la ruggine non le danneggiasse. — I buoni aggesi non
potevano dimenticare il loro fucile: era l’arma favorita, e sapevano
che bisognava accarezzarla ogni tanto, per rendersela amica. Erano
tali gli odi d’allora, che quasi si diffidava del proprio fucile!
Il tuono brontolava lontano; e la vecchia, ch’era seduta in un canto,
co’ piedi sopra la cenere e col corpo chino sulle brace, non faceva
che recar la scarna mano alla fronte, per farvi replicatamante il
segno della croce, invocando ad ogni istante santa Barbara.
In quella famiglia notavasi come un’inquietezza paurosa. Non si
osava parlare per timore di provocare il temporale.
Il capo della famiglia cercava infondere coraggio agli altri; egli si
provava a sgridare le donne ed i bambini: ma in fondo era più
impressionato di tutti. I suoi movimenti nervosi tradivano l’interna
inquietudine, da cui pareva dominato.
I tuoni si facevano sempre più forti, e brontolavano sempre, come
impazienti, ringhiosi. Il temporale si avvicinava. I lampi fendevano di
tanto in tanto le nubi che si addensavano sul villaggio, e mettevano
in mostra le punte aguzze della Crocetta, del Fraìle e di Tumeusoza,
le quali apparivano improvvisamente sul nero fondo del cielo, tinti
dal colore del sangue.
E la vecchia fremeva, rosariando, accoccolata sulla cenere. Si faceva
piccina piccina — quasi sperando di sottrarsi all’ira celeste, col
raggomitolarsi.
L’uomo dalla barba nera e dai capelli lunghi continuava a sfregare le
canne del suo fucile con uno straccio intinto d’olio, e chiudeva gli
occhi quando i lampi listavano di fuoco le fessure della porta e delle
due finestre. La moglie con voce tremante rassicurava i bambini, i
quali avevano cacciato la testa sotto le coltri ed i guanciali.
Il vento che ululava al di fuori pareva il gemito di un sofferente che
chiedesse ospitalità per la notte. La fiammella della lucerna ad olio
serpeggiava, mossa dall’aria che penetrava dalle fessure delle
imposte; e tutti la fissavano; temendo che si spegnesse.
All’urlo del vento si frammischiava quello del tuono, che muggiva con
maggior insistenza.
— Santa Barbara! — ripeteva la vecchia, scuotendo le pallottoline del
suo rosario.
— Volete finirla, nonna? — aveva esclamato l’uomo dalla barba nera,
impazientito. — I vostri guaiti non fanno che maggiormente
spaventare mia moglie e i bambini. Lasciate che gli elementi urlino.
Avete forse paura del tuono?
— Del tuono? — ripetè la vecchia; e lasciò uscire dalle labbra un
gemito lungo. Voleva ancora parlare, ma le tremavano le mascelle
come a persona colta dai brividi della terzana. Ella piantò i suoi occhi
negli occhi dell’uomo barbuto, continuò a fissarlo, senza aprir bocca.
— Ebbene?... e che volete dirmi, adesso? Avete forse sonno?
La vecchia, senza rispondere alla domanda del genero mormorò
tutta tremante con un filo di voce:
— Non è il tuono!
— Sarà il vento.
— Non è il vento!
— Allora sarà il cane che ulula.
— Non è il cane, non è il vento, non è il tuono!
Alla strana esclamazione la moglie ed il marito fissarono la vecchia
con curiosa sorpresa; e quest’ultimo, ristando dal lavoro esclamò
impazientito.
— E che cosa è dunque?
— Tendete l’orecchio e ascoltate — ripetè la vecchia
raggomitolandosi, e tirandosi i due lembi della gonnella sul petto,
come per nascondervisi.
Tutti tesero l’orecchio e stettero attenti.
L’urlo prolungato, lamentoso, si fece udire più distinto.
— È il vento che soffia fra le punte di Tumeusoza e del Fraìle — disse
l’uomo alzando le spalle e rimettendosi al lavoro.
— V’ingannate tutti! — esclamò allora la vecchia, con forza e a bassa
voce — è il gran tamburo!!
— Il Gran tamburo?! ripetè l’uomo vivamente, non potendo celare un
movimento di soddisfazione. — Ne siete proprio sicura?
— Sì: è l’avviso misterioso che parte dai graniti maledetti. Non è il
vento che fischia sul monte Crocetta — è lo spirito delle tenebre che
vorrebbe abbattere lassù la croce di ferro!
Tutti tacquero. Benchè sapessero che la vecchia era molto
superstiziosa, pure le sue parole, in quell’ora, con quella tempesta,
produssero su loro uno strano effetto.
— Pregate — proseguì la vecchia — pregate, perchè l’ira celeste
pesa sul nostro villaggio; pregate per l’anima di un disgraziato
colpito da morte violenta. Noi siamo piccoli, ma la misericordia di Dio
è grande; i giusti sono pochi, ma i nostri peccati sono molti!
L’uomo dalla barba nera si strinse nelle spalle, ma sentivasi in preda
ad un’inquietitudine che non riusciva a dominare. Camminava da un
capo all’altro della stanza, e gettava frequenti occhiate alla porta
come se aspettasse o temesse qualcuno.
I tuoni si facevano sempre più spessi — la vecchia pregava a voce
alta.
— Pare che il temporale stia per iscoppiare.
La vecchia prese la parola, interrompendo un’Ave Maria:
— Il temporale è scoppiato. Non sentite le misteriose parole che
volano per l’aria? Ascoltate o peccatori.
Si fece nuovamente silenzio.
Non si udiva nulla, al difuori di quel brontolìo cupo lontano,
continuato.
— Ebbene? è il tuono! — disse la donna ch’era a letto.
Non è tuono — continuò solennemente la vecchia. — Sono le parole
del diavolo: — Aggius meu, Aggius meu, e candu sarà la dì chi ti
zz’aggiu a pultà in buleu?
Nessuno rispose alla vecchia, la quale riprese la recita dell’Ave Maria,
dal punto ove l’aveva interrotta.
Dopo un breve silenzio, la moglie dell’uomo barbuto esclamò, quasi
parlando a sè stessa:
— Dove sarà Francesco? Voglia Iddio che il temporale non l’abbia
colto in cammino!
— Via le paure! — rispose l’uomo dalla barba nera. — Francesco non
è più un bambino: egli si sarà fermato allo stazzo. A tredici anni si ha
abbastanza giudizio per non mettersi in viaggio con simile tempo!
Mezz’ora dopo, il temporale irrompeva. L’acqua cadeva a scrosci sul
tetto della casa; e il forte scoppio d’un tuono atterrì le due donne e i
bambini i quali mandarono acute grida.
Allo stesso tempo fu picchiato replicatamente alla porta.
L’uomo dalla barba nera, impallidì.
— Non aprire, non aprire! — gridò la moglie spaventata, ponendosi a
sedere sul letto, e stendendo le braccia verso il marito.
— Misericordia di noi! — urlò la vecchia.
Si tornò a picchiare con più forza e con più insistenza.
— Aprite! aprite! — gridò una voce al di fuori.
— È Francesco! — esclamarono tutti in coro; e l’uomo andò a
togliere la spranga, dall’uscio, e fece entrare Francesco, e rinchiuse
prestamente la porta.
Un giovinetto sui tredici anni entrò nella stanza tutto smarrito,
bagnato dalla pioggia e dal sudore. Egli ansava, poichè era venuto di
corsa.
— Perchè metterti in viaggio con questo tempo?
Il fanciullo aveva il respiro affannoso, e non potè subito rispondere al
fratello maggiore.
— Ebbene?
— Il temporale mi colse in cammino, a un ora e mezza da Aggius —
rispose Francesco dopo alcuni minuti.
— E perchè non affrettare il passo per rifugiarti nello stazzo?
Il fanciullo non rispondeva.
— Tu mi sembri agitato. Che hai?
— Ho veduto... il diavolo!
— Il diavolo!? — esclamarono in coro le donne e l’uomo dalla barba
nera; e la vecchia cacciò un urlo, celando la faccia tra le mani.
— Chi ti ha messo in testa simili corbellerie? — gli domandò il
fratello.
— No, vi dico — era proprio lui — il diavolo in carne ed ossa!
— Raccontaci un po’....
— Taci, taci! — gridò la vecchia.
— Finitela, nonna! pare che questa sia la notte del diavolo!
E il fanciullo, tutto tremante, raccontò l’accaduto nel modo seguente:
« — Io m’incamminavo verso lo stazzo di Bonaita quando,
oltrepassato appena il rio Turrali, sentii delle pedate dietro di me; mi
volsi, e vidi un uomo lungo lungo, col cappuccio sul viso e col fucile
sotto il braccio. Mi parve che egli venisse dalle falde del monte della
Crocetta. Allora affrettai il passo per isfuggirlo, ma egli raddoppiò il
suo, come se volesse raggiungermi. Spaventato della solitudine in
cui mi trovavo, mi diedi a correre; ma quell’uomo mi gridò per due
volte;
« — Fermati!
«Mi sentii tremare le ginocchia; la paura mi aveva inchiodato lì, nè
potei muovermi. L’uomo non tardò a raggiungermi.
«Io abbassai gli occhi, nè osai guardarlo in faccia.
« — Dove vai? mi domandò.
« — Vado allo stazzo — risposi.
« — Sei aggese?
« — Sì.
« — Ebbene; torna in Aggius. Dirai al paese che il Diavolo ha portato
via il corpo e l’anima di uno scellerato.
«Ciò detto quell’uomo scomparve.
— Non l’hai tu ravvisato? — domandò l’uomo dalla barba nera al
fanciullo.
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.
textbookfull.com