20200118のNode.jsに関する記事は7件です。

CentOS 8にNode.js 10をインストール(AppStream)

はじめに

Application Stream(AppStream)を利用してCentOS8にNode.js 10をインストール
参考:RHEL8のパッケージ構成 - BaseOSとApplication Stream - 赤帽エンジニアブログ

サポート

本手法で導入した場合、Red Hat Enterprise Linux 8 Application Streams Life Cycle - Red Hat Customer Portalより、2021-04がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

LOG

インストール

# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

# yum install -y @nodejs:10
... 略

各種確認

# which node
/usr/bin/node

# node -v
v10.16.3

# yum module info nodejs:10
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:01:24 ago on Sat Jan 18 08:05:14 2020.
Name             : nodejs
Stream           : 10 [d][e][a]
Version          : 8000020191007212731
Context          : 55190bc5
Architecture     : x86_64
Profiles         : common [d] [i], development, minimal, s2i
Default profiles : common
Repo             : AppStream
Summary          : Javascript runtime
Description      : Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
Artifacts        : nodejs-1:10.16.3-2.module_el8.0.0+186+542b25fc.src
                 : nodejs-1:10.16.3-2.module_el8.0.0+186+542b25fc.x86_64
                 : nodejs-debuginfo-1:10.16.3-2.module_el8.0.0+186+542b25fc.x86_64
                 : nodejs-debugsource-1:10.16.3-2.module_el8.0.0+186+542b25fc.x86_64
                 : nodejs-devel-1:10.16.3-2.module_el8.0.0+186+542b25fc.x86_64
                 : nodejs-devel-debuginfo-1:10.16.3-2.module_el8.0.0+186+542b25fc.x86_64
                 : nodejs-docs-1:10.16.3-2.module_el8.0.0+186+542b25fc.noarch
                 : nodejs-nodemon-0:1.18.3-1.module_el8.0.0+14+a5a48e73.noarch
                 : nodejs-nodemon-0:1.18.3-1.module_el8.0.0+14+a5a48e73.src
                 : nodejs-packaging-0:17-3.module_el8.0.0+186+542b25fc.noarch
                 : nodejs-packaging-0:17-3.module_el8.0.0+186+542b25fc.src
                 : npm-1:6.9.0-1.10.16.3.2.module_el8.0.0+186+542b25fc.x86_64

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctive
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CentOS 8にNode.js 12をインストール(AppStream)

はじめに

Application Stream(AppStream)を利用してCentOS8にNode.js 12をインストール
参考:RHEL8のパッケージ構成 - BaseOSとApplication Stream - 赤帽エンジニアブログ

サポート

本手法で導入した場合、Red Hat Enterprise Linux 8 Application Streams Life Cycle - Red Hat Customer Portalより、2021-11がEOLだと思われる。
それ以降に報告された脆弱性や不具合への対応は実施されない可能性がある。

LOG

インストール

# cat /etc/redhat-release
CentOS Linux release 8.1.1911 (Core)

# yum install -y @nodejs:12/common
... 略

各種確認

# which node
/usr/bin/node

# node -v
v12.4.0

# yum module info nodejs:12
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 0:09:35 ago on Sat Jan 18 07:24:40 2020.
Name         : nodejs
Stream       : 12 [e] [a]
Version      : 8010020191122190621
Context      : cdc1202b
Architecture : x86_64
Profiles     : common [i], development, minimal, s2i
Repo         : AppStream
Summary      : Javascript runtime
Description  : Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.
Artifacts    : nodejs-1:12.4.0-2.module_el8.1.0+251+8afea200.src
             : nodejs-1:12.4.0-2.module_el8.1.0+251+8afea200.x86_64
             : nodejs-debuginfo-1:12.4.0-2.module_el8.1.0+251+8afea200.x86_64
             : nodejs-debugsource-1:12.4.0-2.module_el8.1.0+251+8afea200.x86_64
             : nodejs-devel-1:12.4.0-2.module_el8.1.0+251+8afea200.x86_64
             : nodejs-devel-debuginfo-1:12.4.0-2.module_el8.1.0+251+8afea200.x86_64
             : nodejs-docs-1:12.4.0-2.module_el8.1.0+251+8afea200.noarch
             : nodejs-nodemon-0:1.18.3-1.module_el8.1.0+251+8afea200.noarch
             : nodejs-nodemon-0:1.18.3-1.module_el8.1.0+251+8afea200.src
             : nodejs-packaging-0:17-3.module_el8.1.0+251+8afea200.noarch
             : nodejs-packaging-0:17-3.module_el8.1.0+251+8afea200.src
             : npm-1:6.9.0-1.12.4.0.2.module_el8.1.0+251+8afea200.x86_64

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled, [a]ctive
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Express で簡単な WebAPI を作成

フォルダー構造

$ tree
.
├── app.js
└── routes
    └── index.js
app.js
//-------------------------------------------------------------------------
//  app.js
//
//                  Jan/18/2020
//-------------------------------------------------------------------------
var express = require('express')
var routes = require('./routes')
var bodyParser = require("body-parser")
var cfenv = require('cfenv')

var app = express()
app.use(bodyParser.urlencoded({ extended: true }))
app.use(bodyParser.json())

app.use(express.static(__dirname + '/public'))

var appEnv = cfenv.getAppEnv()

app.post('/post_test',routes.post_test)

app.listen(appEnv.port, '0.0.0.0', function() {
  console.log("server starting on " + appEnv.url)
})

//-------------------------------------------------------------------------
routes/index.js
// -----------------------------------------------------------------------
/*
    routes/index.js

                        Jan/18/2020
*/
// -----------------------------------------------------------------------
exports.post_test = function(req,res)
{
    var aa = 0
    var bb = 0

    if (req.body.aa) {
        aa = parseInt(req.body.aa,10)
        }

    if (req.body.bb) {
        bb = parseInt(req.body.bb,10)
        }

    var dict_aa = {}
    dict_aa["aa"] = aa
    dict_aa["bb"] = bb
    dict_aa["sum"] = aa + bb
    dict_aa["diff"] = aa - bb

    var str_out = JSON.stringify(dict_aa)

    res.send(str_out)
}

// -----------------------------------------------------------------------

サーバーの起動

$ node app.js 
server starting on http://localhost:3000

テストスクリプト

#
URL=http://localhost:3000/post_test
#
curl -X POST -d aa="12" -d bb="45" $URL
#
echo
#
curl -X POST -H "Content-Type: application/json" \
    -d '{"aa":"32", "bb":"41"}'  $URL
#
echo
#
curl -X POST -H "Content-Type: application/json" \
    -d@in01.json $URL
#
echo
#
in01.json
{"aa":"52", "bb":"84"}

実行結果

$ ./go_test.sh 
{"aa":12,"bb":45,"sum":57,"diff":-33}
{"aa":32,"bb":41,"sum":73,"diff":-9}
{"aa":52,"bb":84,"sum":136,"diff":-32}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Nuxt を winser でサービス化する

Nuxt で作成したアプリケーションを WinSer でWindowsサービス化しようとしたらいろいろはまったので備忘録として対処を残しておく。

背景

nodejs で作成したアプリケーションを Windows環境でサービス化するためのツールとして、 WinSer がある。
start コマンドとして「node index.js」のように node.exe を直接叩く場合は特に設定をする必要はないが、 NuxtJS のような専用の起動コマンドが存在するような場合に、npm や yarn からは起動できてもWindowsサービスとして起動できないということが発生する。

対策

WinSer (で使用される nssm)は絶対パスか、パスが通ったコマンド出なければ実行できない(ように見える)。また「.cmd」拡張子のファイルは拡張子込みで記述する必要がある。

1. WinSer をインストールする

npm に上がっている WinSer はバグっているので修正されたものを拾う。

yarn add winser "git+https://github.com/LiberisLabs/winser.git"   

2. パスを通す

yarn へのパスを通す。
以下がもしないなら、サービスを実行するユーザーの環境変数の Path に追加する。そのユーザーで yarn をグローバルインストールしてあることが前提。

C:\Users\<username>\AppData\Roaming\npm

Local System アカウントで実行するなら、システム環境変数に追加する。

3. package.json に winser 要のタスクを追記する

package.json
  "scripts": {
    "dev": "nuxt",
    "build": "nuxt build",
    "start": "nuxt start",
    "generate": "nuxt generate",
    "install-service": "winser -i -a --startcmd \"yarn.cmd nuxt start\" --set \"ObjectName .\\appuser password\"",
    "uninstall-service": "winser -r -x"
  }

WinSer は標準では start をもとにサービスを作成するが、それでは動かないため --startcmd で start の代わりの実行コマンドを記述する。さらに、 --set で実行ユーザーとパスワードを指定する(Local System で実行するなら不要)。
やっていることは nuxt.cmd を叩いているだけだが、直接見つけられないため、yarn を叩くことで
nuxt.cmd を見つけている。

サービス化した場合、サービスの起動停止を自動化したくなる。UACを無効化したくなるが、その必要はなく、特定ユーザーにサービスに係る権限を与える方法はこの辺りを参照する。

参考

WinserでNode.jsのサーバーをサービス化してみる
NSSM
WinSer

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Node.js の基礎とそのフレームワーク Express

Node.js とは何なのか

Node.js とは、簡単にいうと JavaScript をサーバーサイドで実行させてくれる存在です。フロントエンドも、バックエンドも1つの言語で実行でき、WEBサービス、スマートフォンアプリ、IoT関連の開発にも使用することができるみたいです。

インストール

まず Node.jsをインストールしていない人は、[Node.js公式サイト](https://nodejs.org/en/) から、LTS版をダウンロードしてインストール。

『node』 でJavaScriptを実行させる

コマンドラインでindex.jsが格納されているフォルダにpwdで移動し、そのフォルダ内のindex.jsを実行する。

node index.js

nodeだけでEnter押すと、JavaScriptコンソールで色々なコードを試せるようになるみたい。やめるときは .exit と入力するか、control + C を2回押すと終了します。

Node.js のいろんなAPI

Node.jsには様々な機能があり、その一覧が公式サイトのdocumentationで見れます。
https://nodejs.org/dist/latest-v12.x/docs/api/

APIの1つ。 『File System』

FileSystemは、ローカルファイルとかにアクセスすることができるAPI。

今回は、Node.js の File System を使用して、ローカルファイルのコピーを使用します。

FileSystemを読み込む

qiita.js
//jshint esversion:6

const fs = require("fs");

※ const とは、var のようなもの。しかし、var が後から変更できるのに対して、constは後から変更できることができず、一度データを格納(代入?)するとずっとそのまま。

※コメントがないと、"const" is available in ES6 というエラーメッセージが出てきますが、コメントで//jshint esversion:6と記載することでエラーメッセージを回避することができます。

ファイルのコピーを作成する

qiita.js
//jshint esversion:6

const fs = require("fs");

fs.copyFileSync("file.txt","copyfile.txt");

//fs.copyFileSync("コピーするファイル","コピーされたもののファイル名");

※ file.txtのコピーを作成して、copyfile.txtを作成します。って意味。 ちなみに、すでにcopyfile.txtという名前のファイルが存在していた場合、上書き保存されるので注意。

コマンドラインで、実行する

node qiita.js

※今回は、qiita.js というファイルにJavaScriptコードを記載していたので、そのファイルをコマンドライン上で実行する。

Expressフレームワーク

node.js をより使いやすくしたのがExpress フレームワークらしい。めっちゃざっくりだけど。

Expressのインストール

スクリーンショット 2020-01-17 21.49.43.png

retrieved from Express.jp 公式サイト
https://expressjs.com/ja/starter/installing.html

最後のところは『 npm install express 』だけでOKみたい。

Express をjsファイルで使用できるようにする

requireでExpressをロードし使用できるようにします。ついでにexpress()もappに格納します。

qiita.js
const express = require("express");

const app = express();

Expressでサーバーを作成する

ここが割と理解に苦しんだところ。

手順

========================
(JavaScript上)
1.まずExpressをロード
2.アクセスされた時のRespondを考える(ページ別)
3.listenでサーバーを指定
(コマンドラインにて)
4.node server.js で実行
(ブラウザ上にて)
5.http://localhost:3000/と入力し、サーバーに接続
6.respondの処理が実行される
(コマンドラインにて)
7.control + C で終了する

========================

これが一応の流れで、下記が実際のコード。

server.js
// jshint esversion:6

// expressをロード
const express = require("express");
const app = express();

// localhost:3000 にアクセスされた時のRespond
app.get("/",function(request, respond){
  //ここでconsole.log(request);とするとrequestの内容みれる
  respond.send("Hello World");
});


// localhost:3000/profile にアクセスされた時のRespond
app.get("/profile", function(request, respond){
  respond.send("My name is Kibinag0. I'm from Japan.");
});

//listenで待ち受け状態にする
 app.listen(3000, function(){
   console.log("Server started on port 3000");
 });


・Request

ブラウザ?からサーバーにリクエストされる情報。

・Respond

 サーバーにリクエストが来た時に、反応して実行する処理。

ちなみにサーバーにはスレッドモデル(Apache等)とイベントループ(Node.js等 シングルスレッドともいう)という種類があり、それぞれの違いはこちらが分かりやすかったため、参照。
https://dotinstall.com/lessons/basic_nodejs/26202

・listen()

listenで待ち受け状態にする。このlistenがあることによってrequestを受け取ることができるようになる。

『res.sendFile』を使用してHTMLファイルでRespondする

今までは、"Hello world"とかいう文字列でRespondしていましたが、今回はres.sendFileを使用してHTMLファイルでRespondします。

server.js
// リクエストがあったら、index.htmlファイルをrespondする
app.get("/", function(req, res){

  res.sendFile(__dirname + "/index.html");

});

(__dirname + "/index.html")は、dirnameをちゃんと取得して、そのindex.htmlがどのディレクトリに格納されているのかを教えてあげる必要があるんですね。

body-parserを使用してformデータを取得する

HTMLファイルでFormを使用して、ユーザーにデータを入力してもらう。そして、そのデータを使用して何か処理を行う場合の方法です。

事前にbody-parserをインストール

npm install body-parser

HTMLでフォームを作成

index.html
  <h1>Calculator</h1>
  <form class="" action="/" method="post">
    <input type="text" name="num1" placeholder="First Number">
    <input type="text" name="num2" placeholder="Second Number">
    <button type="submit" name="submit">Calculate</button>
  </form>

このフォームをサーバー側で

calculator.js
// jshint esversion:6

// ロードする
const express = require("express");
const bodyParser = require("body-parser");
const app = express();

// body-parserの使用
app.use(bodyParser.urlencoded({extended: true}));

// index.html でrespondする
app.get("/",function(req,res){
  res.sendFile(__dirname + "/index.html");
});


// index.htmlのフォームでpostされた部分
app.post("/",function(req, res){

 // bodyの中のnum1, num2を取得する
  var num1 = Number(req.body.num1);
  var num2 = Number(req.body.num2);

  var result = num1 + num2;

  res.send("The result of the calculation is " + result);
});

app.listen(3000);



Udemy AngelaさんのWEB DEVELOPMENT COURSE 『206. Processing Post requests with body-parser』より

サーバー更新自動化『nodemon』のすすめ

ちなみに、上記だとserver.jsファイルを更新するたびにコマンドラインでサーバー終了して、もう一回立ち上げることになります。それって結構めんどくさいですよね。

そんな人のために、Udemy講師のAngelaさんが役立つツールnodemonを教えてくれました。
Angelaさんの講義はこちら→ Udemy Bootcamp web development

nodemonを使うと、server.jsファイルを上書き保存するたびに検知してくれて、自動でサーバーを更新し、反映させてくれる優れものです。

https://nodemon.io/

インストール

インストールの仕方はコマンドラインで

npm install -g nodemon

と記載するだけ。

※permission error が出たら

sudo npm install nodemon -g

で対応。

使い方

nodemon server.js

とコマンドラインで記載すると、server.jsファイルの更新を自動反映してくれます。

以上 Node.jsとExpress。
結構難しいかったので、追加、修正を随時していきます。。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初めての Azure Bot Service - Sample code と local test 編 -

はじめに

今回は Azure Bot Service を使用して連続した対話に対応できる Bot を作成します.
Azure Bot Service を初めて使用する人を(できる限り)想定してます.
(熟練の方々からしたら退屈するかと思います.)

また,今回は Bot の sample を local test するところまでで
Azure への Deploy については次回行います.

(訂正や指摘などあれば,温かく教えていただけると助かります.)

私の開発環境

  • PC : surface laptop2 (windows 10)
  • Editor : VS Code

PC に関しては何でも大丈夫です.
Editor に関しては 本記事を参考にされる場合は VS Code をご使用ください.
(後程お話しますが, Azure への deploy 時に VS Code の Extension を使用しています)

Azure Bot Service の概要

Azure Bot Service とは,Microsoft 社のクラウドサービスである Azure のサービスの1つです.
公式の document は以下をご参考ください.

Azure Bot Service のリソースを作成すると,セットで Azure App Service のリソースが作成されます.App Service とは同じく Azure のサービスの 1 つで,Web Application を作成することの出来るサービスです.

Bot の基本

まずは,Bot が初めての方,Auzre Bot Service に初めて触れる方のためにいくつかの用語や実装法の紹介をします.

専門用語

Azure Bot Service を使用する上で参考になる用語をいくつか先にご紹介しておきます.

  • channel
    • Bot への通話手段.窓口のようなイメージ.
    • User は channel を通じて Bot App と会話をします.
    • Teams や LINE, Slack,Web chat などがあります.
    • channel によって仕様が異なるため,実際の Bot 開発では channel が何かも大事.
  • connecter
    • channel と Bot アプリを繋ぐ.
    • 実は Azure Bot Service の実態はこの部分(だと思われる)
  • Bot App
    • 実際に処理を行う部分.
    • 実態としては,一般的な Web App と変わらない
    • Azure Bot Service の場合は App Service に相当します

bot archtecture.png

ご存知の方もいらっしゃるかもしれませんが,Azure Bot Service 自体は Bot Application ではありません.channel を通してきたメッセージを Bot へと伝える connecterの役割を担っています.

Bot の実装方法

Bot アプリを作成する場合,Line や Slack などの channel ではなく,実装の観点で話すと2つの実装方法があります.

  • function 型
    • AWS lambda や Azure Function などの Serverless Function を活用した場合
    • 非常にシンプルな作り
    • Function を使用した回数だけ課金対象になるので使用頻度によっては非常に安価
  • Server 型
    • 今回のAzure Bot Service(厳密には Web App Service)のような場合
    • serverを起動している間機能する
    • State(変数の値など)を保持することができる

Azure Bot Service を使用した場合は,下の server 型になります.

function 型では リクエスト(Bot の場合は Bot への呼びかけ)が発生する度に function が実行されます.一方,server 型では server が起動している間のみ応答を返します. これらの特性の大きな違い(の 1 つ)は server側で変数の値などを保持してステートフルな会話が可能なことです.

ステートフルな会話とは簡単に言うと一連の流れを記憶した状態で会話ができるということです.
Serverless Function であれば,基本的には 「1 Question : 1 Answer」 であるのに対して,ステートフルな実装であれば「 n Question : m Answer」と複数の情報から返答を返すことができます.
とりあえずここでは,ざっくりと下図のようなイメージだけで大丈夫です.
(私も厳密な定義は微妙です(笑))

state-full bot.png

sample の実行

それでは実際に sample を動かしつつ確認していきます.

sample コードの取得

以下の Github から sample コードを取得します.

Azure Bot Service の sample Code (Github)

今回は連続した会話フローのsample (Node.js版) を使用します.
先ほど取得したコードのうち,以下の directory を開いてください.

/BotBuilder-Samples/samples/javascript_nodejs/05.multi-turn-prompt/

少しコードを見てみましょう.
プログラムを実行すると index.js が実行されます.
まずは index.js をみてみます.一部抜粋したものを記載しておきます.

index.js
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
const restify = require('restify');
const path = require('path');

// Import required bot services.
// See https://aka.ms/bot-services to learn more about the different parts of a bot.
const { BotFrameworkAdapter, ConversationState, MemoryStorage, UserState } = require('botbuilder');

// Import our custom bot class that provides a turn handling function.
const { DialogBot } = require('./bots/dialogBot');
const { UserProfileDialog } = require('./dialogs/userProfileDialog');

// Read environment variables from .env file
const ENV_FILE = path.join(__dirname, '.env');
require('dotenv').config({ path: ENV_FILE });

/**********
  中略
**********/

// Define the state store for your bot.
// See https://aka.ms/about-bot-state to learn more about using MemoryStorage.
// A bot requires a state storage system to persist the dialog and user state between messages.
const memoryStorage = new MemoryStorage();

// Create conversation state with in-memory storage provider.
const conversationState = new ConversationState(memoryStorage);
const userState = new UserState(memoryStorage);

// Create the main dialog.
const dialog = new UserProfileDialog(userState);
const bot = new DialogBot(conversationState, userState, dialog);

// Create HTTP server.
const server = restify.createServer();
server.listen(process.env.port || process.env.PORT || 3978, function() {
    console.log(`\n${ server.name } listening to ${ server.url }.`);
    console.log('\nGet Bot Framework Emulator: https://aka.ms/botframework-emulator');
    console.log('\nTo talk to your bot, open the emulator select "Open Bot"');
});

// Listen for incoming requests.
server.post('/api/messages', (req, res) => {
    adapter.processActivity(req, res, async (context) => {
        // Route the message to the bot's main handler.
        await bot.run(context);
    });
});

前半部分では必要な module を import したり,
sample プログラムの別の js ファイルでインスタンスを作成しています.

HTTP server を create しているところでは,PORT の設定なんかもしていますね.

また,最後の部分で post する際のエンドポイントを設定しています.
今回はしませんが,Proactive なメッセージ(push 通知など)を実装する際には,
同様の方法で Proactive 用のエンドポイントを用意することもあります.

続いて,実際の会話フローの制御をしているプログラムを確認しましょう.
/dialogs/userProfileDialog.js を開いてください.一部抜粋したものを記載しておきます.

userProfileDialog.js
constructor(userState) {
        super('userProfileDialog');

        this.userProfile = userState.createProperty(USER_PROFILE);

        // 典型的な会話のパターンを用意してくれている
        this.addDialog(new TextPrompt(NAME_PROMPT));
        this.addDialog(new ChoicePrompt(CHOICE_PROMPT));
        this.addDialog(new ConfirmPrompt(CONFIRM_PROMPT));
        this.addDialog(new NumberPrompt(NUMBER_PROMPT, this.agePromptValidator));

        // ここで連続する会話を追加している
        this.addDialog(new WaterfallDialog(WATERFALL_DIALOG, [
            this.transportStep.bind(this),
            this.nameStep.bind(this),
            this.nameConfirmStep.bind(this),
            this.ageStep.bind(this),
            this.confirmStep.bind(this),
            this.summaryStep.bind(this)
        ]));

        this.initialDialogId = WATERFALL_DIALOG;
    }

TextPromptNumberPrompt はその名の通り,テキストや数値入力などの典型的な会話のパターンを実装するために用意されています.

そして,抜粋した code の後半部分にあるWatarfallDialog に様々な dialo を add することで,add した dialog が一連の会話として扱われます.ここで add されている dialog は抜粋部分より後ろの sample code で上記の Prompt を継承して実装されたものです.

local test

まずは Azure に deploy(ざっくり言うとプログラムを Azure 上で動作させる) せずに,local で動作テストできるようにします.以下のリンクより Bot Framework Emulator の exe ファイルを取得して実行します.

Bot Framework Emulator

ちょっと分かりにくいですが,ページ中頃にある以下の画像ようなファイル群から自分に適したものを入手してください.

BotEmulator_download.png

上 4 つのどれかで大丈夫なはずです.

Bot Framework Emulator が起動できること(アプリが実行できて window が開くこと)を確認したら,sample program のある場所で command prompt やら Power Shell やらのコマンドツールを開きましょう.何かしらのコマンドツールを開けたら,npm installnpm startを実行してください.

すると,以下のような画面になります.

npm start.jpg

この画面になり,Bot App が Listen 状態になったことを確認したら,
先ほどの Bot Framework Emulator を実行してOpen Botを押してください.
そして,URL の欄にhttp://lovalhost:3978/api/messages と入力します.
これは sample code で index.js の最後に書かれている server.post のエンドポイントです.
このポイントに http post リクエストを送ることで Bot と会話します.

Bot Emulator OpenURL.png

こんな感じですね!入力したら Connect してください.

無事にsample を実行できたら,何か話しかけてみましょう.
下の gif のように会話ができると思います.

Bot-Framework-Emulator-2020-01-17-11-37-53_Trim.gif

ちなみに,Bot を停止させたい時は shell の画面で ctr+c を押してください.

次の内容

少し長くなりそうなので今回はここまでで終了とします.
もう1回くらいは書こうと思うので,予定している内容を書いておきます.

  • Dialog の分岐
    • 今回は決まった会話内容でしたが,次回はもう少し複雑に会話を分岐させます.
  • Azure への Deploy
    • 今回は localtest で終わりましたが,次回は実際に Azure に Deploy します.
  • channel の設定
    • とりあえず Teams との連携でも目指します.

(よくよく考えたら今回まだ Azure Bot Service 使ってない説)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

nodenvを使ったNode.jsのインストール手順

はじめに

これまではNode.jsのバージョン管理ツールとして、
nodebrewを使っていたのですが、
ディレクトリごとにNode.jsのバージョンを分けたくなったので、
nodenvのインストール手順を記録として残します。

nodenvはこちらから。
今回参考にしたQiitaの記事はこちらから(ありがとうございます)。

詳しくは調べてませんが、pyenvと同様の管理方法ができるらしいですね。

今回はHomebrewを使ってnodenvを入れていきます。

環境

  • MacBook Air (Retina 13-inch 2018)
    • OS
      • macOS Mojave バージョン 10.14.6
    • メモリ
      • 16GB
    • シェル
      • bash

手順

前提

$はターミナルでの入力を示します。

$ ls

や、

$ cd

などの表記とします。

nodenv のインストール手順

Homebrewからnodenvを入れます。
(コマンドをディレクトリはどこでもいいです...)

$ brew install nodenv

インストールが完了したら.bash_profileexport PATH="$HOME/.nodenv/bin:$PATH"eval "$(nodenv init -)"を追記します。

$ echo 'export PATH="$HOME/.nodenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(nodenv init -)" '>> .bash_profile

またはエディタを使って追記します。

 $ vim ~/.bash_profile
 export PATH="$HOME/.nodenv/bin:$PATH"
 eval "$(nodenv init -)"

一応シェルは再起動します。

$ exec $SHELL -l

動作するかテストします。

$ nodenv -v
nodenv [バージョン]
$

とバージョン番号が表示されれば、
インストール完了です。

Node.jsのインストール

バージョンを確認するならnodenv install -lとします。

$ nodenv install -l

インストール自体はnodenv install [バージョン]で完了します。

$ nodenv install [バージョン]

インストールしているNode.jsのバージョンの確認。
$ nodenv versions

全体で使う場合はglobalでバージョンを指定します。
特定のディレクトリで使う場合はlocalでバージョンを指定します。

$ nodenv global [バージョン]

$ node local [バージョン]

最後にnode -v でバージョンを確認します。

$ node -v
v[バージョン番号]
$

もしバージョンがインストールしたものと違った場合は補足を確認してください。

補足

$ nodenvが使えない場合や、
nodeのバージョンがインストールしたものにならない場合は、
node-buildを入れたほうがいいのかもしれません。

$ git clone git:://github.com/nodenv/node-build.git ~/.nodenv/plugins/node-build

終わりに

nodeenvと打ち間違いが無いようお気をつけください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む