Full Ebook of Azure Bot Service Succinctly 1St Edition Ed Freitas Online PDF All Chapter

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 69

Azure Bot Service Succinctly 1st

Edition Ed Freitas
Visit to download the full and correct content document:
https://ebookmeta.com/product/azure-bot-service-succinctly-1st-edition-ed-freitas/
More products digital (pdf, epub, mobi) instant
download maybe you interests ...

Razor Components Succinctly 1st Edition Ed Freitas

https://ebookmeta.com/product/razor-components-succinctly-1st-
edition-ed-freitas/

Developing Bots with QnA Maker Service: Integration


with Azure Bot Service and Microsoft Bot Framework 1st
Edition Kasam Shaikh

https://ebookmeta.com/product/developing-bots-with-qna-maker-
service-integration-with-azure-bot-service-and-microsoft-bot-
framework-1st-edition-kasam-shaikh/

Azure Virtual Desktop Succinctly 1st Edition Marco


Moioli

https://ebookmeta.com/product/azure-virtual-desktop-
succinctly-1st-edition-marco-moioli/

Azure Durable Functions Succinctly 1st Edition Massimo


Bonanni

https://ebookmeta.com/product/azure-durable-functions-
succinctly-1st-edition-massimo-bonanni/
Microsoft Azure for Java Developers: Deploying Java
Applications through Azure WebApp, Azure Kubernetes
Service, Azure Functions, and Azure Spring Cloud 1st
Edition Abhishek Mishra
https://ebookmeta.com/product/microsoft-azure-for-java-
developers-deploying-java-applications-through-azure-webapp-
azure-kubernetes-service-azure-functions-and-azure-spring-
cloud-1st-edition-abhishek-mishra/

Introducing Azure Kubernetes Service: A Practical Guide


to Container Orchestration 1st Edition Steve Buchanan

https://ebookmeta.com/product/introducing-azure-kubernetes-
service-a-practical-guide-to-container-orchestration-1st-edition-
steve-buchanan-2/

Introducing Azure Kubernetes Service: A Practical Guide


To Container Orchestration 1st Edition Steve Buchanan

https://ebookmeta.com/product/introducing-azure-kubernetes-
service-a-practical-guide-to-container-orchestration-1st-edition-
steve-buchanan/

Integrating Serverless Architecture: Using Azure


Functions, Cosmos DB, and SignalR Service 1st Edition
Rami Vemula

https://ebookmeta.com/product/integrating-serverless-
architecture-using-azure-functions-cosmos-db-and-signalr-
service-1st-edition-rami-vemula-2/

Integrating Serverless Architecture: Using Azure


Functions, Cosmos DB, and SignalR Service 1st Edition
Rami Vemula

https://ebookmeta.com/product/integrating-serverless-
architecture-using-azure-functions-cosmos-db-and-signalr-
service-1st-edition-rami-vemula/
Azure Bot Service
Succinctly
By
Ed Freitas
Foreword by Daniel Jebaraj
Copyright © 2023 by Syncfusion, Inc.

2501 Aerial Center Parkway


Suite 200
Morrisville, NC 27560
USA
All rights reserved.

ISBN: 978-1-64200-227-0

Important licensing information. Please read.

This book is available for free download from www.syncfusion.com on completion of a


registration form.

If you obtained this book from any other source, please register and download a free copy from
www.syncfusion.com.

This book is licensed for reading only if obtained from www.syncfusion.com.

This book is licensed strictly for personal or educational use.

Redistribution in any form is prohibited.

The authors and copyright holders provide absolutely no warranty for any information provided.

The authors and copyright holders shall not be liable for any claim, damages, or any other
liability arising from, out of, or in connection with the information in this book.

Please do not use this book if the listed terms are unacceptable.

Use shall constitute acceptance of the terms listed.

SYNCFUSION, SUCCINCTLY, DELIVER INNOVATION WITH EASE, ESSENTIAL, and .NET


ESSENTIALS are the registered trademarks of Syncfusion, Inc.

Technical Reviewer: James McCaffrey


Copy Editor: Courtney Wright
Acquisitions Coordinator: Tres Watkins, VP of content, Syncfusion, Inc.
Proofreader: Graham High, senior content producer, Syncfusion, Inc.

3
Table of Contents

The Story Behind the Succinctly Series of Books ................................................................. 7

About the Author ..................................................................................................................... 9

Acknowledgments ..................................................................................................................10

Introduction .............................................................................................................................11

Chapter 1 Getting Started ......................................................................................................12

Overview ..............................................................................................................................12

Bot Framework Composer intro ............................................................................................12

Installing Node.js ..................................................................................................................12

Installing .NET Core SDK .....................................................................................................17

Installing Composer ..............................................................................................................17

Chapter 2 Composer Bot Basics...........................................................................................20

Overview ..............................................................................................................................20

Composer UI ........................................................................................................................20

Zipcodebase.........................................................................................................................21

Creating an empty bot ..........................................................................................................23

First-time bot execution ........................................................................................................26

Adding a dialog.....................................................................................................................28

Summary ..............................................................................................................................31

Chapter 3 Expanding the Bot ................................................................................................32

Overview ..............................................................................................................................32

Executing the dialog from a trigger .......................................................................................32

Requesting user input...........................................................................................................36

Output format .......................................................................................................................38

Input validation .....................................................................................................................38

4
Default zip value ...................................................................................................................41

Summary ..............................................................................................................................41

Chapter 4 Working with the API ............................................................................................42

Overview ..............................................................................................................................42

Getting the API key ..............................................................................................................42

HTTP request .......................................................................................................................42

HTTP status code.................................................................................................................45

Creating a branch .................................................................................................................45

Querying the API ..................................................................................................................48

First assignment ...................................................................................................................49

Other assignments ...............................................................................................................51

Summary ..............................................................................................................................54

Chapter 5 Finalizing the Bot ..................................................................................................55

Overview ..............................................................................................................................55

API results as a response .....................................................................................................56

First execution ......................................................................................................................57

Different status code branch .................................................................................................59

Adding a package.................................................................................................................60

Interrupting the conversation ................................................................................................62

Adding a CancelDialog .........................................................................................................64

Enabling interruptions ...........................................................................................................65

Testing interruptions .............................................................................................................66

Nicer output ..........................................................................................................................67

Summary ..............................................................................................................................69

Chapter 6 Bot Code Structure ...............................................................................................70

Overview ..............................................................................................................................70

5
Locating the project ..............................................................................................................70

Project folder structure .........................................................................................................70

ZipcodeBot dialog.................................................................................................................74

The get_zip dialog ................................................................................................................77

appsettings.json ...................................................................................................................81

Summary ..............................................................................................................................83

Chapter 7 Publishing the Bot ................................................................................................84

Overview ..............................................................................................................................84

Prerequisites ........................................................................................................................84

Azure Portal .........................................................................................................................84

Resource provider registration..............................................................................................85

Deploying from Composer ....................................................................................................86

Checking Azure resources ...................................................................................................92

Publishing.............................................................................................................................93

Testing the Azure bot ...........................................................................................................94

Closing thoughts...................................................................................................................96

6
The Story Behind the Succinctly Series
of Books
Daniel Jebaraj, CEO
Syncfusion, Inc.

S taying on the cutting edge


As many of you may know, Syncfusion is a provider of software components for the
Microsoft platform. This puts us in the exciting but challenging position of always
being on the cutting edge.

Whenever platforms or tools are shipping out of Microsoft, which seems to be about
every other week these days, we have to educate ourselves, quickly.

Information is plentiful but harder to digest


In reality, this translates into a lot of book orders, blog searches, and Twitter scans.

While more information is becoming available on the internet and more and more books are
being published, even on topics that are relatively new, one aspect that continues to inhibit us is
the inability to find concise technology overview books.

We are usually faced with two options: read several 500+ page books or scour the web for
relevant blog posts and other articles. Just as everyone else who has a job to do and customers
to serve, we find this quite frustrating.

The Succinctly series


This frustration translated into a deep desire to produce a series of concise technical books that
would be targeted at developers working on the Microsoft platform.

We firmly believe, given the background knowledge such developers have, that most topics can
be translated into books that are between 50 and 100 pages.

This is exactly what we resolved to accomplish with the Succinctly series. Isn’t everything
wonderful born out of a deep desire to change things for the better?

The best authors, the best content


Each author was carefully chosen from a pool of talented experts who shared our vision. The
book you now hold in your hands, and the others available in this series, are a result of the
authors’ tireless work. You will find original content that is guaranteed to get you up and running
in about the time it takes to drink a few cups of coffee.

7
Free forever
Syncfusion will be working to produce books on several topics. The books will always be free.
Any updates we publish will also be free.

Free? What is the catch?


There is no catch here. Syncfusion has a vested interest in this effort.

As a component vendor, our unique claim has always been that we offer deeper and broader
frameworks than anyone else on the market. Developer education greatly helps us market and
sell against competing vendors who promise to “enable AJAX support with one click,” or “turn
the moon to cheese!”

Let us know what you think


If you have any topics of interest, thoughts, or feedback, please feel free to send them to us at
succinctly-series@syncfusion.com.

We sincerely hope you enjoy reading this book and that it helps you better understand the topic
of study. Thank you for reading.

Please follow us on Twitter and “Like” us on Facebook to help us spread the


word about the Succinctly series!

8
About the Author

Ed Freitas is a consultant on business process automation and a software developer focused on


customer success.

He likes technology and enjoys hacking, learning, playing soccer, running, traveling, and being
around his family.

Ed is available at https://edfreitas.me.

9
Acknowledgments

A huge thank you to the fantastic Syncfusion team that helped this book become a reality—
especially Jacqueline Bieringer, Tres Watkins, and Graham High.

The manuscript manager and technical editor thoroughly reviewed the book's organization,
code quality, and overall accuracy—Graham High from Syncfusion and James McCaffrey from
Microsoft Research. Thank you all.

I dedicate this book to Chelin and Puntico—may both your journeys be blessed.

10
Introduction

Microsoft describes Azure Bot Service as a comprehensive development environment that runs
on Microsoft Azure, created for designing and building enterprise-grade, conversational AI.

Azure Bot Service allows you to keep control of your data and simultaneously build multilingual
conversational bots for different business scenarios, such as customer support, employee
productivity, and sales.

Azure Bot Service delivers a comprehensive development experience by providing a visual


canvas called Bot Framework Composer, based on an extensible open-source tool set,
providing world-class conversational AI with high-quality natural language, speech, and other
Cognitive Services capabilities.

When using Azure Bot Service, you keep control of your data while securely connecting to
popular channels such as Skype, Microsoft Teams, Messenger, telephony, and many others.

One of the critical characteristics of Azure Bot Service is that it is easy to get started.
Furthermore, it comes with many prebuilt dialogs, components, and language models that
empower you to create sophisticated conversational designs that include interruption handling,
context switching, and cancellations in different languages and formats.

Azure Bot Service includes enterprise-grade security, high availability, compliance, and
manageability backed by Azure's core services by being part of Azure.

Another aspect of Azure Bot Service is that after you create a conversational bot, you will
deploy it to multiple channels with minimal or no changes, enabling your organization to have a
real-world, everyday platform experience.

Azure Bot Service is an exciting technology that allows you to create a bot with little or no code.
At the same time, you could create a bot using code with some of the most popular
programming languages, such as JavaScript, Python, and C#.

Throughout this book, we will take a low-code/no-code approach to develop bots with the Azure
Bot Service, explore some of the critical features of Bot Framework Composer, and see how to
deploy to Azure and some channels.

So, without further ado, let's explore what this promising technology has to offer.

11
Chapter 1 Getting Started

Overview
As is the case with other frameworks, services, and technologies, before we can use them, we
need to go through a process where we sign up for the services and install the required tools.
That's what we are going to cover throughout this chapter.

Bot Framework Composer intro


The Bot Framework Composer is an open-source integrated development environment (IDE)
built on top of the Bot Framework SDK, which provides an extensible SDK and tools to build,
test, deploy, and manage intelligent bots.

In contrast, the Bot Framework Composer provides a robust visual authoring canvas enabling
dialogs, language-understanding models, QnAMaker knowledge bases, and language
generation responses used to create conversational bots.

Composer (the term I'll be using going forward) is a desktop application for Windows, macOS,
and Linux.

Installing Node.js
Before installing Composer, you need to have Node.js and npm installed—this is a mandatory
requirement for the use of Composer.

I'm using a Windows machine, so the following steps are specific to Windows. Let's get Node.js
installed.

12
Figure 1-a: Node.js Website
Click the button on the left to install the the Long Term Support (LTS) version of Node.js, which
is recommended for most users.

If you already have a version of Node.js installed on your system that’s older than the suggested
LTS version downloadable from the website, download the current and most up-to-date version.

Once the Node.js installer has downloaded, execute it, and you should see a screen similar to
the following one.

Figure 2-b: Node.js Installer – Welcome Screen

13
To continue with the process, click Next. You should see a screen similar to the following one.

Figure 3-c: Node.js Installer – End-User License Agreement Screen

To continue, select the I accept the terms in the License Agreement option and then click
Next. After that, you should see the following.

Figure 4-d: Node.js Installer – Destination Folder Screen

I will leave the default installation folder, but you are free to change it to another location. Click
Next to continue.

14
Figure 5-e: Node.js Installer – Custom Setup Screen
After that, you should see the following.

Figure 6-f: Node.js Installer – Tools for Native Modules


Here we are asked to automatically install the necessary tools that some npm modules might
require for compilation. There’s no harm in having these tools installed, so I recommend clicking
the option to install them. Then, click Next to continue.

15
Figure 7-g: Node.js Installer – Ready to install Node.js Screen

Finally, we are ready to install Node.js—click the Install button to begin the installation process.
You'll see the installation taking place, and once it’s complete, you'll see a screen similar to the
following one.

Figure 8-h: Node.js Installer – Completed the Node.js Setup Wizard Screen

16
Awesome—click Finish to close the installer, and Node.js should be ready and good to go.

Installing .NET Core SDK


For C# template support, Composer requires having .NET Core SDK installed. In that case,
you'll need to install .NET Core SDK 3.1 or later if you plan to build bots with C#.

Installing Composer
I'm using Windows, so I'm going to use the Composer installer for Windows. Here are the
installers for macOS and Linux. Composer is an open-source tool hosted on GitHub.

Once you’ve downloaded Composer, execute the installer—this will display a screen similar to
the following one.

Figure 9-i: Composer Installer – Choose Installation Options Screen


You may choose to install the software by selecting Anyone who uses this computer (all
users) or selecting Only for me. I usually pick and recommend the first option; however, feel
free to choose the second option. Then, click Next to continue.

Next, we need to choose the Destination folder. I usually suggest leaving the default
installation path.

17
Figure 10-j: Composer Installer – Choose Install Location Screen
You may specify a different installation path if you wish. Once you’re done, click Install—the
installation process will start, and in most cases, will take less than a minute to complete. Before
finalizing the setup process, you can choose to run Composer.

In some cases, there are available updates that you can choose to install immediately or later.

Figure 11-k: Composer – New update available


I recommend installing the latest updates, which I will do by selecting the first option and then
clicking Okay. You can choose the second option or click Cancel.
Composer will restart after installing any updates, and the installer with the latest updates will
execute again.

After installing the updates, you can choose to run Composer before closing the installer. The
main Composer screen looks as follows.

18
Figure 12-l: Composer – Main Screen

Excellent—we are now ready to start developing bots with Composer, which we will do in the
next chapter.

19
Chapter 2 Composer Bot Basics

Overview
In the preceding chapter, we explored how to install Node.js and Composer and saw how
straightforward that process was.

In this chapter, we will use Composer to create a zip code bot using a third-party API, which will
give us some insights about zip code locations.

You might find some similarities between the steps and scenarios involved and those available
in the Composer documentation quickstart and tutorials (to maintain consistency with the official
docs); however, we'll dive deeper into details than those resources do.

This will be an exciting and fun project—so without further ado, let's get started.

Composer UI
First, let's get acquainted with the Composer UI to understand which components make up this
product's user interface.

Figure 2-a: Composer's Main Screen (Source: Microsoft)

20
The Composer UI components highlighted in the preceding figure are the ones that we will be
primarily using throughout this book. These elements make up the following four main sections,
most commonly known as panes:

• The navigation pane: This is the main section that contains Composer's main options
and features.
• The bot explorer: This section displays the elements that make up your bot projects,
such as dialogs, triggers, intents, and other bot-specific items.
• The authoring canvas: This section is where the bot's logic resides, and it contains all
the actions associated with a selected trigger.
• The properties pane: This area is where you can set the properties for specific actions,
such as sending or receiving an external request, or requesting input from the user.

There is also a title bar containing the application's name and a menu bar that you can use to
start the execution of a bot, access your account settings, or view application alerts.

As you can see, the UI is self-descriptive and easy to navigate.

Zipcodebase
To create our zip code bot, we first need to sign up for an external third-party API called
Zipcodebase that will give us access to a database of zip code information worldwide.

Note: We'll be using the Zipcodebase service; however, this is independent of


Composer, and you could use any other zip code API or service provider.

Figure 2-b: Zipcodebase Website

21
To get started, click either the FREE PLAN or the REGISTER button—this will take you to a
screen similar to the following one.

Figure 2-c: Zipcodebase Website – Choosing a Subscription

Make sure the free plan is selected and then scroll to the bottom of the page to fill in the details
requested.

Figure 2-d: Zipcodebase Website – Creating a Profile


After you have registered for the service, you might be prompted to verify your email. Check
your email and verify it so you can start to use the service.
After verifying your email address, log in to Zipcodebase to get your API key. You should see
the following.

22
Figure 2-e: Zipcodebase Dashboard – API Key

Make sure you copy the API key to the clipboard.

We are now ready to create an empty bot using Composer.

Creating an empty bot


We are going to develop our zip code bot from scratch. Open Composer and click + Create
new.

Figure 2-f: Composer Main Screen – Create new Button

A screen similar to the following one will appear. Here you can select the bot template to use.

23
Figure 2-g: Composer – Select a template Screen
Let's select the Empty Bot template for C# and then click Next. After doing that, you will see a
screen similar to the following one.

Figure 2-h: Composer – Create a bot project Screen

24
I've called the project ZipcodeBot, set the Runtime type to Azure Web App (you can also
choose Azure Functions), and set the location to a local folder on my machine (feel free to
select a different folder). After you’ve specified these fields, click Create.

Composer will download the bot template, build the runtime, and merge packages—this might
take a few seconds or up to a couple of minutes. Afterward, you will see the created bot.

Figure 2-i: Composer – ZipcodeBot Created

Here we can see that we have an empty bot with a dialog called ZipcodeBot, and under that,
there are two triggers (indicated by lightning icons): one called Greeting and another called
Unknown intent.

The Greeting intent executes when the user connects to the bot, sending the user a greeting.
On the other hand, the Unknown intent runs when the user sends a message, or the bot
cannot recognize the user's request. In that case, the bot responds to the user, indicating that it
cannot understand the user request.

To start giving our bot some personality, the first thing we need to do is change the Greeting
intent. To do that, let's click the Greeting intent under ZipcodeBot, and then click the Send a
response action.

Figure 2-j: Composer – Send a response Action Selected

Then, in the properties pane, find the Bot responses section and choose Welcome to your
bot. After doing that, you'll be able to edit the intended response.

25
Figure 2-k: Composer – Editing a Bot Response

I'll type the following message: Welcome to ZipcodeBot. Please type the word 'zip' to start.
However, you can customize this to your taste.

First-time bot execution


Let's run our bot for the first time. To do that, click the Start bot button found just below the
menu bar.

Figure 2-l: Composer (Start bot Button)

Once the bot has successfully executed, you will see a dialog dropdown similar to the following.

Figure 2-m: Composer – Local bot runtime manager

Next, let's click the Open Web Chat option highlighted in Figure 2-m. After doing that, you will
see the web chat to interact with the bot.

26
Figure 2-n: Composer – ZipcodeBot Web Chat

To test the bot, type the word zip, which will cause the bot to respond with the following
message.

Figure 2-o: Composer – ZipcodeBot Web Chat – Response


As expected, the bot responds that it doesn't understand the intent provided because we
haven't programmed this logic yet.

Now that we have executed the bot for the first time, let's stop its execution, which you can do
by clicking on the stop icon highlighted in the following figure.

27
Figure 2-p: Composer – Stop Bot Icon
Clicking that will stop the execution of the bot and make it inactive until it executes again.

Adding a dialog
Bots consist of various components, and some of the most important are dialogs. In other
words, most bots are structured as a sequence of dialogs.

A dialog includes specific bot functionality, such as asking the user for a response, sending a
reply, or making a request to an API.

Let's create a dialog that can get a zip code from the user. Within Composer's bot explorer
pane, select the ZipcodeBot top-level element. Next, click the ellipsis (…), and then the + Add
a dialog menu item.

Figure 2-q: Composer – Add a dialog Menu Item


The Create a dialog window will appear. Here we can enter a name and description. I'll call this
dialog get_zip, but you can call it something else.

28
Figure 2-r: Composer – Create a dialog Window

After entering those values, click OK. After that, you will see the get_zip dialog within the bot
explorer pane.

Figure 2-s: Composer – Bot Explorer – get_zip Dialog


To continue, click BeginDialog, and then go to the authoring canvas to the right of the bot
explorer.

29
Figure 2-t: Composer – Authoring Canvas – BeginDialog

Under BeginDialog, click the + button and click on the Send a response menu item in the
authoring canvas.

Figure 2-u: Composer – BeginDialog – Send a response


Under Bot responses, let's type the following text: Let's check a zip code. What we have
done is created a dialog called get_zip, and this dialog has a trigger called BeginDialog, and
this trigger has an action called Send a response—which we can visualize as follows.

30
Figure 2-v: Dialog – Trigger – Action

The action, in this case, is the response that is sent to users when the get_zip dialog activates.

Tip: To be able to test this new dialog, it is necessary to have a trigger in


ZipcodeBot—this will allow you to start the get_zip dialog.

Summary
We have taken the initial steps to create a bot, added some basic functionality, and explored
Composer's UI characteristics throughout this chapter.
The cool thing is that nothing we have done and looked at has involved writing any code so far.

In the following chapter, we will continue to expand the bot's functionality by initially executing
this dialog from a trigger.

31
Chapter 3 Expanding the Bot

Overview
Conversational flows within bots are composed of different dialogs, which are connected one to
the other.

In the previous chapter, we created the basics of our ZipcodeBot and added a new dialog. To
be able to use that dialog, we need to invoke it. To do that, we need to start that dialog from a
trigger.

So, we need to connect the get_zip dialog to the ZipcodeBot dialog—the bot's main dialog. To
understand this better, let's look at the following figure.

Figure 3-a: ZipcodeBot (Main) Dialog to get_zip Dialog Relationship

Executing the dialog from a trigger


Let's link the get_zip dialog to the bot's main dialog—ZipcodeBot. To do that, click the main
dialog. Under Recognizer/Dispatch type, click Change—as seen in the properties pane in the
following figure.

Figure 3-b: Composer – Properties Pane – Recognizer/Dispatch type – Change

32
A window will appear, which will allow us to choose a recognizer type. Click the Regular
expression option and then click Done.

Figure 3-c: Choose a recognizer type Window

Next, click the ZipcodeBot dialog, click on the ellipsis (…), and click the + Add new trigger
menu item.

Figure 3-d: Composer – ZipcodeBot – Add new trigger

33
Once those actions have occurred, an input dialog will appear, requesting the following info:
trigger type, trigger name, and regEx pattern.

Figure 3-e: Create a trigger Dialog

For the type of trigger, we can leave the default value, which is Intent recognized. I will call the
name of the trigger zip and use zip as the value of the regEx pattern. Next, click Submit.

The zip trigger will appear under Unknown intent in bot explorer. We can see that as follows.

Figure 3-f: Composer – zip Trigger

Let’s recap what we've just done. The zip trigger instructs the ZipcodeBot to look for the word
zip in any incoming message. To do that, we use regular expressions (also known as regEx).

34
Next, with the zip trigger selected, in the authoring canvas, click + > Dialog management >
Begin a new dialog.

Figure 3-g: Composer – Dialog management – Begin a new dialog

Once the dialog appears, click the Dialog name dropdown and choose the get_zip option from
the Dialog name on the properties pane.

Figure 3-h: Composer – Dialog name – get_zip


We have just created a trigger and indicated that our ZipcodeBot could recognize regular
expressions, using the word zip as the trigger.

35
Requesting user input
For the ZipcodeBot to get the relevant information regarding a zip code, the bot needs to
request the user to enter the zip code, and for that, we need to use a Text input action.

Under the get_zip dialog within bot explorer, select BeginDialog and then click + under Begin
a new dialog in the authoring canvas.

Figure 3-i: Composer – get_zip – BeginDialog


Next, click the Ask a question menu item and then Text.

Figure 3-j: Composer – get_zip – BeginDialog – Ask a question – Text


We are prompted to enter the Prompt for text followed by the User input.

36
Figure 3-k: Composer – get_zip – BeginDialog – Prompt for text

Under Bot response, we can enter the following text: Please enter a zip code to continue.
With that done, select the User input (Text) action. Under User input, enter user.zip within the
Property box.

Figure 3-l: Composer – get_zip – BeginDialog – User input

37
Output format
Now that we have specified the user input, we need to indicate the output format. To do that,
click the Output format box then enter the value trim(this.value) in the field.

The trim function is a prebuilt expression that removes leading and trailing spaces from a
value, and this is useful in case the user enters the zip code with a leading or trailing space.

Figure 3-m: Composer – get_zip – BeginDialog – User input – Output format

Input validation
We have managed to gather the user's input and set the output format at this stage. So far, so
good. Nevertheless, we need to ensure that the user's data is valid—an action known as input
validation.

As the user will be entering a zip code, we should at least confirm that the zip code provided is a
valid one. To do that, we can check if the zip code supplied is a valid U.S. zip code.

The Zipcodebase API is valid for multiple countries, and that's a lot of zip code country formats
to validate, so let's limit the input validation to U.S. zip codes only.

If the user indicates a U.S. zip code with fewer than five characters or more than five characters,
the input validation would be invalid. Otherwise, it would be valid.

Let's get that sorted. In the authoring canvas, click Other in the properties pane. Expand the
Recognizers section, click Add alternative, and enter the text shown in the following figure.

38
Figure 3-n: Composer – get_zip – BeginDialog – User input (Text) – Other – Unrecognized prompt
The text value is as follows: Apologies, I cannot understand '${this.value}'. Please specify a
5 digit zip code in US format i.e.12345.

That's the text response that the bot will return if the user input is not understood.

Next, we need to specify the validation rule to check whether the zip code entered is valid or
not. Click the Validation section, then under Validation Rules click Add new > Write an
expression.

Figure 3-o: Composer – get_zip – BeginDialog – User input (Text) – Other – Validation Rules

Enter the expression length(this.value) == 5, which will ensure that the zip code value is five
characters long.

39
Figure 3-p: Composer – (get_zip – BeginDialog – User input (Text) – Other – Validation Rules

We also want to add a response that the bot can send back to the user if the zip code length is
different than five characters. We can do this by clicking Add alternative under Invalid prompt.

Figure 3-q: Invalid prompt – Add alternative


Enter the following text: The zip code '${this.value}' is not valid. Please enter a zip code
that is 5 digits long.

Figure 3-r: Invalid prompt – Text response

40
Default zip value
Although it is not strictly necessary, it’s also possible to add a default value for the zip code that
the bot can return.

To do that, click Prompt configurations, and under Default value, enter a valid U.S. zip code.
I'm going to enter 33165, but you may choose another.

Figure 3-s: Composer – get_zip – BeginDialog – User input (Text) – Other – Prompt Configurations

Summary
We have set the bot up so that whenever a user enters the message zip, the bot will respond
and request the user to indicate the zip code. If that value is valid, then it will be stored in the
user.zip variable.

If the value is not a valid zip code (not equal to five characters), the bot sends an error message
back to the user.

Next, we are going to explore how to make a call to the Zipcodebase API.

41
Chapter 4 Working with the API

Overview
So far, we have created the bot with enough functionality to ask the user for a zip code and
send a reply in case the user's input is not adequate.
However, if the user's feedback is correct and the zip code valid, we cannot process it. That's
what we are going to do throughout this chapter.

Getting the API key


To retrieve the data and information related to the zip code, we need to invoke the Zipcodebase
API.

To use Zipcodebase, we need to call the API using an API key. Switching back to the
Zipcodebase web page, let's copy the value under API Key from the Dashboard.

Figure 4-a: Zipcodebase Dashboard with API Key

HTTP request
Going back to Composer, in the bot explorer, make sure that the BeginDialog is selected. Then
below all the existing actions added, click + > Access external resources > Send an HTTP
request.

42
Figure 4-b: Composer – BeginDialog – Access external resources – Send an HTTP request Menu Item

The following details are visible in the properties pane. Select the GET option under the HTTP
method.

Figure 4-c: Composer – BeginDialog – Send an HTTP request – HTTP method


At this stage, we need to get the API URL, which we can get from the Zipcodebase website as
highlighted in the following figure.

43
Figure 4-d: Zipcodebase – API URL

The following is the Composer-compatible version of the URL, because the user.zip variable
contains the zip code submitted by the user.

https://app.zipcodebase.com/api/v1/search?codes=${user.zip}

Next, we need to add the API key to the URL and the country code. So let's copy the API Key
value from the Zipcodebase website to add it to the URL.

Figure 4-e: Zipcodebase Website API Key Value

In the following URL, replace API_KEY_VALUE_GOES_HERE with the value of your API key copied
from the Zipcodebase website.

https://app.zipcodebase.com/api/v1/search?apikey=API_KEY_VALUE_GOES_HERE&code
s=${user.zip}&country=US

Enter the URL into the Url field within the properties pane of Composer, as shown in the
following figure.

Figure 4-f: Composer – BeginDialog – Send an HTTP request – Url

When the bot performs the HTTP request, the response must be stored somewhere—in a
variable assigned to the Result property.

44
We will store the result within the dialog.api_response variable. The dialog is a scope that
retains its properties for the duration of a dialog, in this case, BeginDialog.

Tip: To understand how properties and variable scopes work, I suggest looking at
the official documentation.

Figure 4-g: Composer – BeginDialog – Send an HTTP request – Result property


Next, we need to set the Response type value to json.

Figure 4-h: Composer – BeginDialog – Send an HTTP request – Response type

HTTP status code


When working with HTTP requests, status codes are essential. Status codes indicate whether
the request was successful or not.

Therefore, the bot must determine whether the response was successful before sending a
response to the user.

A status code with a value of 200 indicates that the response obtained from the API was
successful. A status code with a different value would suggest a problem accessing the API—in
a situation like this, we need to create a branch.

Creating a branch
To create a branch—which in programming would be the equivalent of using an if-else
condition—we need to go back to the authoring canvas and click + under Send an HTTP
request. Then, click Create a condition > Branch: If/else.

45
Another random document with
no related content on Scribd:
No. 1. No. 2. No. 3.

NET PRICES: 5 Foot $12.00. 6 Foot $14.40. 7 Foot $16.80.


For either Round, Square or Octagon.
No. 1 includes all above the Shingles. (See page 73.)
There is no shoddy work about these Finials. They are heavy,
substantially made and zinc coated.
SHIPPING DEPARTMENT

COOPERS CROOKS.

(Patented August 20th, 1889.)


Complete and in Sections. Fixed and Adjustable.
The most Perfect Machine-made Elbow ever manufactured.
First-class Finish.—Each piece is a perfect section of a curved tube.
A Convenience.—The sections can be put together to form any angle.
Durable and Strong.—The finished elbows are redipped after being locked
and riveted.
Quality.—Both Retinned and Galvanized.
Perfect in fitting, uniform in size and quality. Just what the practical tinsmith
should use for conductors and vent pipes.

ADJUSTABLE. FIXED. IN SECTIONS.


Size. Tin. Galv’d. Size. Tin. Galv’d. Size. Tin.
3 inch $1.55 $2.00 3 inch $2.00 $2.00 3 inch $1.45
4 inch 2.80 3.90 4 inch 3.90 3.90 4 inch 2.50
Discount..........................

MANUFACTURED ONLY BY
THE NATIONAL SHEET METAL ROOFING CO.
510 to 520 East 20th Street, New York.
WEIGHTS.
Our goods weigh, when boxed ready for shipment, as follows:

14 × 20, No. 1, Standard 84 lbs.


10 × 14, “ “ 92 “
7 × 10, “ “ 89 “
14 × 20, No. 2, Steel 83 “
10 × 14, “ “ 89 “
14 × 20, No. 3, M. F. 100 “
10 × 14, “ “ 108 “
7 × 10, “ “ 108 “
14 × 20, No. 4, Galvanized 104½ “
10 × 14, “ “ 109½ “
7 × 10, “ “ 109½ “
Queen Anne, No. 6, Standard 121½ “
“ “ “ Galvanized 144 “
Broad Rib, No. 8, Standard 88 “
“ “ “ Steel 87 “
50 ft. Climax Ridge Coping, Tin 56½ “
50 ft. “ “ “ Galvanized 71 “
50 ft. Hip, Tin 38 “
50 ft. “ Galvanized 43 “
50 ft. Valley, Tin 45½ “
50 ft. “ Galvanized 53 “
50 ft. Gable, Tin 12½ “
50 ft. “ Galvanized 15½ “
HOW METAL SHINGLES ARE MADE.
Shingles made from wood have been common all over the world
for ages. Their particular form has remained unchanged because
many years’ experience has proven it to be the most durable and
surest safe-guard against storms. What is true of wood for roof
covering is equally true of metal for the same purpose. The first
metal roofing made in America was tin sheets, laid shingle fashion,
the overlapped edges of which covered the nail heads which were
used to fasten them to the roof boards. Many of these old-fashioned
metal (tin plate) roofs are yet in existence that were covered over
one hundred years ago. The writer covered several houses in 1849
in this manner, which are in good condition now. The reason why this
style of metal roofing was not common was its expense. On page 16
we give reasons why it would be more durable than the ordinary
mode of laying tin roofing.
The use of Walter’s and Cooper’s patent in constructing metal
shingles does away with the expense, which was a great drawback
to their use, and leaves no excuse for the use of cheap, combustible
material.
The National Sheet Metal Roofing Co., of New York City, have for
the past eight years been manufacturing these shingles, and their
use on a vast number of public and private buildings in all parts of
the United States and Canada attest their superiority. Thinking that
our readers would be pleased to see the process of making these
shingles, we illustrate on pages 65 and 75 views taken from
photographs of their paint and store room. The process requires two
press operations for each shingle, and each press averages a turn
out of 4,000 square feet (which is 40 squares) per day. The dies
which give shape and form the corrugations of the shingles are faced
with polished steel, which leaves no abrasions where they come in
contact with the metal. During the past year they have added four
new presses to this department to meet the requirements of the
increased demand for their goods. They spare no pains to make
their shingles as perfect as the best machinery can make them. All
their shingles are carefully inspected before they are boxed and sent
to the store room, from which they are shipped to all parts of the
country. The machinery room in which the presses are located is 37
feet wide by 80 feet long, the painting department is 80 × 55 feet,
and the store room the same size. We give these figures that you
may form an opinion of the space required to manufacture and
handle their goods.
The process of painting is first dipping the shingles in a vat of pure
linseed oil and oxide of iron paint with just enough turpentine to
assist in drying. They are then set on edge and left to drain, after
which they are gone over with a brush and set in racks to dry, which
requires several days, according to the humidity of the atmosphere.
They are all air dried, no artificial heat being used. Their customers
are cordially invited to call at any time and see the process of
manufacturing.

“Why don’t you mend your roof my man?”


He drew him closer to the wall,
And answered with a lazy drawl:
“When ’t rains so hard I never can.”

“Why don’t you mend it when it’s fair?”


“Oh, then it doesn’t need repair!”
He blandly said
As he turned his head
And shook the raindrops from his hair.

From The Metal Worker.


Walter’s Patent Standard Shingles.

Cooper’s Patent Queen Anne Metallic


Shingles.
PUBLIC BUILDINGS ON WHICH THE
ABOVE METAL SHINGLES ARE USED.
RELIGIOUS INSTITUTIONS.
Independent Pres. Church, Savannah, Ga.
South-West Pres. Church, Omaha, Neb.
Methodist Church, Stony Point, N. Y.
Methodist Church, Graniteville, Conn.
Methodist Church, Broad River, Conn.
Asbury Methodist Church, Providence, R. I.
Second Methodist Church, Kingston, N. Y.
Pisgah Methodist Church, Pisgah, Md.
Methodist Church, Thomasville, Ga.
Elm St. Methodist Church, Nashville, Tenn.
East Nashville Methodist Church, Nashville, Tenn.
Methodist Church, Manheim, Pa.
Roman Catholic Church, Trinidad, Col.
Roman Catholic Church, Albuquerque, New Mexico.
German Evangelical Church, New Harmony, Ind.
Holy Apostles’ P. E. Church, St. Clair, Pa.
R. C. Church of St. Cecelia, N. Y. City.
R. C. Apostolic Church, Toronto, Ont.
St. Patrick’s R. C. Cathedral, Ottawa, Canada.
Baptist Church, Tura, India.
Winthrop St. Baptist Church, Taunton, Mass.
Second Baptist Church, Lawrence, Mass.
Berkeley Ave. Bap. Church, Berkeley, Va.
Baptist Church, Danbury, Conn.
Colored Baptist Church, Augusta, Ga.
Christ Episcopal Church, Richmond, Va.
St. John’s Epis. Church, Richmond, Va.
Christ Episcopal Church, Port Tobacco, Md.
St. Clement’s Episcopal Church, Chicago, Ill.
Mission Church, Aintab, Turkey.
Mission Church, Kiota, Japan.
Bethany Chapel, Troy, N. Y.
Colonial Beach Chapel, Va.
Plymouth Church, Charleston, S. C.
M. E. Church, McMinville, Tenn.
First M. E. Church, Jackson, Mich.
Christian Church, Little Rock, Ark.
Second Baptist Church, Little Rock, Ark.
First Pres. Church, Gainesville, Fla.
M. E. Church, Beatrice, Neb.
Round Hill Church, Va.
St. Paul Lutheran Church, Lititz, Pa.
Salvation Army Barracks, South Norwalk, Conn.
Methodist Church, Salt Lake City.
Christian Church, Belton, Texas.
Salvation Army Barracks, Matteawan, N. Y.
First Cong. Church, Daytona, Fla.
Jewish Synagogue, Brunswick, Ga.

RAILROADS.
Savannah, Florida and Western R. R.
North-Eastern R. R. of South Carolina.
Western and North Carolina R. R.
New York, Susquehanna and Western R. R.
Chesapeake and Ohio R. R.
Florida Railway & Navigation Company.
South Florida Railway.
Virginia Midland Railway.
Richmond and Danville R. R.
Newport News and Mississippi Valley R. R.
Chicago and Evanston R. R.
Jacksonville, Tampa and Key West R. R.
Interstate Rapid Transit Co., Kansas City, Mo.
Kansas City Cable Railway, Kansas City, Mo.
Union Passenger Railroad Co., Richmond, Va.
Franklin Avenue Line, St. Louis, Mo.
West Nashville Railroad Depot, West Nashville, Tenn.
St. Johns and Halifax R. R.
Maryland Central R. R.
Cornwall and Lebanon R. R. Co.
EDUCATIONAL INSTITUTIONS.
DePaw College, Greencastle, Ind.
Mississippi Industrial Institute and College, Columbus, Miss.
St. John’s College, Tremont, N. Y.
Las Vegas College, Las Vegas, New Mexico.
Loyola College, Collington, Md.
Woodstock College, Woodstock, Md.
Medical College, Nashville, Tenn.
Dayel College, Sparta, Tenn.
Dakota University, Mitchell, Dakota.
Public School, Richfield Springs, N. Y.
Public School, Greenville, Ky.
Public School, McCook, Neb.
Public School, Dodge City, Kansas.
Public School, Marion, Ill.
Public School, Elizabeth, Pa.
Public School, Freeport, Ill.
Public School, Paw Paw, Ill.
Public School, Hutchinson, Minn.
Thirteenth District School, Nashville, Tenn.
Tenth District School, Nashville, Tenn.
Thirteenth Ward Grammar School, Nashville, Tenn.
Fogg High School, Nashville, Tenn.
Caldwell High School, Nashville, Tenn.
Tampa High School, Tampa, Fla.
Public School, Forward Township, Allegheny Co., Pa.
Tarbox School, Nashville, Tenn.
Searight School, Nashville, Tenn.
Niagara Falls Museum, Niag. Falls, N. Y.

Hotels and State and County Buildings.


Florida State Capitol, Tallahassee, Fla.
Washtenaw County Jail, Ann Arbor, Mich.
Bristol County House of Correction, New Bedford, Mass.
Government Penitentiary, Kingston, Ont.
Main Street Central Police Station, Charleston, S. C.
United States Soldiers’ Home, Leavenworth, Kansas.
Wm. Houston Home, Charleston, S. C.
Deaf and Dumb Institute, Jacksonville, Ill.
Insane Asylum, Fort Steilacoom, Wash. Terr.
United States Marine Barracks, Pensacola, Fla.
Colorado State Insane Asylum, Pueblo, Col.
Asylum for Feeble Minded, Beatrice, Neb.
Tenn. Insane Asylum, Nashville, Tenn.
County Asylum, Sparta, Tenn.
City Hospital, Charleston, S. C.
Towers of Minneapolis Exhibition Building, Minneapolis, Minn.
Horticultural Hall, World’s Exposition, New Orleans, La.
Plymount County Agricultural Society Building, Brockton, Mass.
Public Library, Coldwater, Mich.
Fair Association Buildings, St. Louis, Mo.
Grand Army of the Republic Hall, Janesville, Iowa.
Caledonian Rink, Ottawa, Canada.
Park Building, West Nashville, Tenn.
Concordia Association Building, Little Rock, Ark.
U. S. Commissioners’ Building, Salt Lake City, Utah.
Board of Trade Bldg., Little Rock, Ark.
Exchange Building, West Nashville, Tenn.
Lyons Water Works Buildings, Lyons, N. Y.
Water Works Buildings, Battle Creek, Mich.
City Water Works Buildings, Ottawa, Canada.
Barclay St. Ferry House, New York City.
Oakland Mills, Taunton, Mass.
I. O. O. F. Building, Port Clinton, Ohio.
I. O. O. F. Building, Savannah, Ga.
Masonic Temple, Savannah, Ga.
Masonic Temple, Daytona, Fla.
Union County Court House, Union, S. C.
Ford County Court House, Dodge City, Kansas.
Ontonogan County Building, Houghton, Mich.
Court House, Jonesborough, Ark.
Hamilton County Court House, Texas.
Menard County Court House, Texas.
H. I. Kimball Hotel, Atlanta, Ga.
Burlington Hotel, Burlington, Vermont.
Fayetteville Hotel, Fayetteville, N. C.
Mitchell Hotel, Thomasville, Ga.
Arlington Hotel, Augusta, Ga.
Summerville Hotel, Augusta, Ga.
Cottage Hotel, Nunda, N. Y.
City Hotel, Beatrice, Neb.
Opera House, Junction City, Kansas.
Grand Opera House, St. Louis, Mo.
Overland Casino, Nashville, Tenn.
Opera House, Tavares, Fla.
North River Steamboat Co., Haverstraw, N. Y.
New Central Station, Charleston, S. C.
Lower Station House Stables, Charleston, S. C.
Mechanics’ Union Hall, No. 1, Charleston, S. C.
Oneida County Asylum, Rome, N. Y.
Wheeler Elevator, Buffalo, N. Y.
Ontario Elevator, Buffalo, N. Y.
A. W. Stevens & Son, Auburn, N. Y.
City Buildings, Taunton, Mass.
I. O. U. W. Hall, New Harmony, Ind.
Opera House, New Harmony, Ind.
INSIDE CONSTRUCTION.
By this we do not mean the arrangement or size of rooms, they
may be large or very small, and in either instance lack the
conveniences which may always be provided for by good
construction. Even a small house can have transoms over all the
doors which open into a hall, proper ventilating flues for all rooms,
and a kitchen that will be comfortable in all seasons, (see articles
under the head of “Ventilation” and “The Kitchen.”) These are
essential; all dwellings, large or small, should have them. The
windows and doors should be arranged to suit the furniture to be
used. You have doubtless seen rooms with windows on two sides, a
door and fire-place on the other. This arrangement makes it
impossible for the room to contain an ordinary size bedstead, without
placing it before a window or some other opening. Study these
things when getting up plans for your house.
The dining room should be light and roomy, fronting the East if
possible, as the morning sun is always desirable, and adds much to
the cheerfulness of the family. The kitchen should not connect
directly with the dining-room. Construct a passage-way, well
ventilated, between the two rooms; this will prevent unsavory odors
entering the dining-room. The space at each end of the passage can
be utilized for the kitchen closets. Arrange your rooms so that you
will not be compelled to pass through one room to get to another. Do
not disfigure the walls by driving nails or hooks into the plastering for
the purpose of hanging pictures, but fasten a neat gilt moulding to
the side walls all around the room, about one foot from the ceiling.
The moulding should be about one and one-half or two inches wide,
with a groove on its upper side. Hooks shaped as an S can be
placed at any point on this moulding, and the pictures are to be hung
to these hooks. This arrangement is somewhat expensive, but it is
the only proper way in which pictures can be hung.
Closets.—No house is complete without ample closets. Every lady
knows that clothing and wraps cannot be stored away in drawers,
and look well when wanted for use. As closets are expensive we
suggest for small houses, that a room be constructed from four to six
feet wide, and from ten to fifteen feet long, with a window at one end.
Make shelves on one side, and place suitable clothes hooks on the
other. In such a room the entire wardrobe and family linen can be
properly stored. If you desire a moth-proof room, the ceiling, walls
and shelves should be made of red cedar. We suggest this clothes
room because of its cheapness. Each bedroom of large houses
should be provided with a clothes closet, which should be lined with
red cedar for the reasons above stated.
Don’t forget to have windows and all outside doors fitted up with
light sash and frames covered with woven wire cloth. This material is
very cheap, and can be purchased at any house-furnishing goods
store. Its use prevents mosquitoes and flies from entering the house.
Freedom from these summer pests will amply repay you for the
expense. During the late fall, winter and spring months, the sash and
frames can be removed; they should be stored in some perfectly dry
place, such as a garret, never in a cellar. Speaking of pests reminds
us of another kind that breed in cracks and crevices found in most
kitchens, which might lead a thoughtful man to suppose that the
builder, in his kindness of heart, provided these little hiding places for
just such creatures. If you don’t want them, see that there are no
cracks left between the wood-work and plastering, or in any part of
the floor or walls of the kitchen. Fill with cement (Plaster of Paris is
good) all cracks caused by shrinkage of wood-work after the walls
are completed and are thoroughly dry.
SHEET METAL WORK FOR PUBLIC
AND PRIVATE BUILDINGS.
GUTTERS, VALLEYS AND DOWN PIPES.
These things are very closely related to the roof, and like it should
be of the best material.
A tin gutter hung at the eaves has the advantage of being cheap; if
made of good material and put up with good fastenings is durable,
and suitable for cheap houses and some portions of expensive ones.
In all cases where the fastenings are to hang from the roof, the
gutter should be put up before the roof covering is put on, so the
fastenings can be secured to the roof boards instead of on top of the
tin, slate or wood shingles. If the fastenings are nailed on top of the
roof covering, the nails soon become loose, and the gutter sags. The
tinsmith will charge no more for doing his work before the roofers
commence, but it may delay you a day. Paint the gutter inside as
well as out, and see that it has sufficient fall to clear itself of water. If
you prefer the gutter on the roof near the eaves, let the sheets of
which it is made be of sufficient width to extend far enough up under
the roof covering to prevent water (when the gutter is full) from
overflowing at the back instead of over at the front; this is a common
error. In every instance let this top gutter be outside the wall line, so
in case of leakage the “drip” is outside the walls. Gutters of this kind,
and all gutters that are soldered and firmly fastened to roof boards
(not hanging gutters), are liable to crack by expansion and
contraction of the metal; we therefore say, never put a gutter inside
the wall lines if they can be put outside. Valleys formed by the joining
of two roofs at an angle are usually steep enough to allow the metal
sheets to lap on each other and shed water without soldering. Such
sheets are usually made twenty-eight inches long. Their shortness
prevents cracking from expansion and contraction even if nailed to
roof boards. Remember that all trash or dirt that settles on the roof
eventually finds its way into the valleys, gutters and down pipes, and
in a manner scours their surface; for this reason they receive several
fold more wear than the same amount of exposed surface of the
roof, consequently, should be of better material. Few people are
aware of the amount of dirt and sand which is carried by the wind
and deposited on their house-tops; for this reason, if the water is
used for drinking or cooking purposes, the first water that flows from
the roof during a rain storm should not be allowed to flow into the
cistern.
It is always best to have good sized down pipes. As a rule, for
down pipes from hanging gutters, let the circumference of the pipe
equal the girt of the gutter, and the gutter should be large enough to
convey the water which falls on the roof during the heaviest storms.
Use only curved elbows where a turn in the pipe is to be made, and
at the foot or discharge end. Curved elbows are now made by
machinery; they are stronger, more durable and cost no more than
the common hand-made acute kind.
We have spoken of good material; but what is good material when
Tin Plate is spoken of? The quality of Tin Plate depends on its
toughness, and the weight of Tin or Terne coating on its surface. The
first is easily determined by bending back and forth with the hand,
the latter is not, unless handled by an expert. The following test will
determine the difference, provided you have different qualities. If the
qualities are the same, or nearly so, the difference will not be
distinguishable.
Take two pieces of different quality of Tin or Terne plates, say two
inches square, grease one side with any kind of animal fat; then with
a pair of plyers, hold them separately over a gas or candle jet with
one corner obliquely downward, and the amount of fusible metal
which flows from them will determine the difference between good
and common.
TESTIMONIALS.
St. Louis, Mo., April 26th, 1888.
Gentlemen:—We have used your Walter’s Metal Shingles
on the most prominent buildings of our city, all of which have
given universal satisfaction both in appearance and durability.
As for us, we can say we give them the preference above all
others knowing that when once up there is none its equal.
Yours truly,
MESKER BROS.

Augusta, Ga., April 30th, 1888.


Gentlemen:—I have in the past six years used and carefully
compared all the leading makes of Patent Metallic Shingles,
and I unhesitatingly pronounce your Walter’s Patent the best
shingle on the market. They are simple, and easy to put on,
and for a handsome, light and durable roof they are without a
parallel. I have used them on many public as well as private
buildings in this city, and they have in all instances given the
highest possible satisfaction, which has won me the esteem
and confidence of the public.
Yours truly,
DAVID SLUSKY.

Las Vegas College, Las Vegas, N. M., April 29th, 1888.


Gentlemen:—I am glad to inform you that we are very well
satisfied with the Walter’s Metal Shingles with which the new
stone addition of our college is covered. It is about three
years since the roof was laid, and your shingles are keeping
yet a very neat and nice appearance, defying bravely the
eating and inclemency of the weather.
Yours truly,
C. M. CAPILUPI, S. J.

Office of Superintendent, DePaw University, Green


Castle, Ind., April 30th, 1888.
Gentlemen:—We beg to say that your Walter’s Shingles
with which our college buildings are covered are very
satisfactory.
E. T. CHAFFEE, Sup’t.

Colorado State Insane Asylum, Pueblo, Col., April


27th, 1888.
Gentlemen:—I wish to say that the Walter’s Patent Metallic
Shingles, with which our buildings are covered, we believe to
be superior to anything heretofore introduced in the West in
that line.
Yours truly,
P. R. THOMBS, Sup’t.

Daytona, Fla., April 27th, 1888.

You might also like