- 投稿日:2020-04-06T23:47:24+09:00
【node.js】bookshelfとknexを使ってCRUD操作
expressを使ったbookshelfの操作方法について書かれております。
Bookshelfとは
SQLを使わずデータベースを使うことができるORM
Bookshelfは、 Knex SQLクエリビルダー上に構築されたNode.js用のJavaScript ORMです。 Promiseベースのコールバックインターフェイスと従来のコールバックインターフェイスの両方、トランザクションサポート、eager / nested-eagerリレーションのロード、ポリモーフィックな関連付け、1対1、1対多、および多対多のリレーションのサポートを備えています。
PostgreSQL、MySQL、SQLite3で動作するように設計されています。knexとは
Bookshelfは、内部で「クエリービルダー」と呼ばれるknexモジュールを利用しています。ですから、インストールの際には、まずknexを入れておく必要があります。
良く分からないけど、Bookshelfを使う際にはついてくる物らしい。。。
モジュールのインストール
npm install --save knexnpm install --save bookshelfBookshelfの初期設定
var knex = require('knex')({ client: 'mysql', connection: { host : '127.0.0.1', user : 'root', password: '', database: 'データベース名', charset : 'utf8' } }); var Bookshelf = require('bookshelf')(knex); var Mydata = Bookshelf.Model.extend({ tableName: 'Mydata(テーブル名)' });上記のコードで行っている事は、
knexのロード、
knexの初期設定、
Bookshelfのロード、
モデルの作成モデルとは?
テーブルにアクセスするオブジェクトです。
これを使って、テーブルのデータをCRUD操作します。モデルの項目追加
hasTimestamps:true タイムスタンプのデータをレコードに追加する user: function() {return this.belongsTo(テーブル名) 他のテーブルの値を取得可能にする これでBookshelfの初期設定は完了しました。
いよいよ、CRUD操作をしていきます。Bookshelfのメソッド
Bookshelfで操作する際に使用するメソッドです。使いながら覚えていきましょう。
fetchAll 全てのレコードを取得する物 then データベースアクセス完了後の処理をコールバック関数として設定します。 catch thenを実行した時にエラーが発生した時の処理です。 save オブジェクトの引数をテーブルに保存する処理をします。 where 検索する対象に条件を設定して絞り込む fetch 最初の一つだけレコードを取り出す。 fetchPage 得られたページ番号を元にレコードを取り出します。 orderBy レコードを並べ変える。 query 複数項目をチェックすする レコードを取り出す
全レコードを取り出す
new Mydata().fetchAll().then((collection) => { -----取得できた場合の処理----- }).catch((err) => { -----エラー発生時の処理----- });レコードを保存する
新しいレコードの追加をしていきます。
router.post('/add', (req, res, next) => { new Mydata(req.body).save().then((model) => { ー追加した後の操作ー }); });検索
router.post('/', (req, res, next) => { nex Mydata().where('id', '=', req.body.fstr).fetch().then((collection) => { 取得後の操作 } }レコードを並べかえる
router.get('/:page', (req, res, next) => { nex Message().orderBy('created_at', 'DESC').fetchAll().then((collection) => { 取得後の操作 }); })orderByについて
第一引数にフィールド名、第二引数には「ABC」「DESC」の何かを指定します。
(DESCなら降順、ABCなら逆順)複数項目をチェックする
router.post('/', (req, res, next) => { var nm = req.body.name; var pw = req.body.password; Mydata.query({where: {name: nm}, andWhere: {password: pw}}) .fetch() .then((model) => { 取得後の操作 }) })関数query()に関して
where:{name: nm} nameの値が変数nmである andWhere:{password: pw} それに加えて、passwordの値が変数pwである ページネーション
Bookshelfを使う事で、ページネーションも使えるようになります。
router.get('/:page', (req, res, next) => { var pg = req.params.page; pg *= 1; if(pg < 1){pg = 1; } new MyData().fetchPage({page:pg, pageSize:3}).then((collection) => { 取得した後の操作 }) .catch((err) => { エラーを取得した後の操作 } }関数.fetchPageに関して
page 現在のページ番号 pageCount ページ数(最後のページのページ番号) pageSize 1ページ辺りのレコード数 rawCount レコードの総数 参考
node.js超入門第2版
Bookshelfとは
https://bookshelfjs.org/paginationプラグイン
https://github.com/bookshelf/bookshelf/wiki/Plugin:-Pagination
- 投稿日:2020-04-06T17:14:00+09:00
Azure QnA Makerを使ってローカルで動くQ&A ChatBotを作ってみた
前提
- ローカルにNode.js環境があること(ない人はNode.jsをインストールしておいてください)
概要
QnA Makerとは、公式に下記のように定義されています。
データに自然な会話レイヤーを簡単に作成するクラウドベースの自然言語処理 (NLP) サービスです。 これは、特定の自然言語入力に対して、カスタム ナレッジ ベース (KB) の情報から最も適切な回答を見つけるのに使用できます。
要は、Q&Aを事前に登録しておくと、ユーザーの質問に対してAPIコールによりベストな回答を選んで返してくれるというものです。日本語に対応しているのでQ&A Chatbotを作成することに適しています。
この記事では、Azure QnA Makerを使ってローカルで動くChatBotを作成し、Emulatorを使って実際にBotと会話することをゴールとしています。
以下の手順でローカルにBotを構築していきます。この回でコーディングは特にしませんが、Botアプリで利用する言語はNode.jsです。
- 1. QnA Maker ServiceとKnowledge baseの構築
- 2. ローカルでBotアプリを構築
- 3. Bot Framework EmulatorをインストールしてBotに接続
- 4. リソースの後片付け(お金がかからないように)
下記についてはこの記事で説明しないのでご注意ください。
- Botアプリのロジックについて
- 生成されるAzureリソースの役割について
1. QnA Maker ServiceとKnowledge base(KB)の構築
QnA Portalにログインして、「Create a Knowledge base」を押下。
基本は、遷移先のページに書いてあるSTEP通りに進めていきます。
※画面は見切れてるけどSTEP4まであるよ。STEP1 Create a QnA service in Microsoft Azure.
「Create a QnA service」を押下すると、AzureのQnA Maker作成画面に遷移します。そこで下記のように入力し、作成をクリック。
価格レベルはF0とFを選択すれば無料になります。僕の場合は無料枠を既に使ってしまったので、S0とBを選択しました。
とはいえお金がかかるのは嫌なので、このチュートリアル後にすぐに消そうと思います。記事の後半でそのことに触れているのでお金かかる怖いやりたくないって思う人も不安がらなくて大丈夫です。しばらくすると、「デプロイが完了しました」と画面に表示されます。先ほど指定したリソースグループをみると下記のようにいくつかのリソースが作られていることが分かります。成功です。
STEP2 Connect your QnA service to your KB.
QnA Portalに戻って「Refresh」すると、Azure QnA Service欄で先ほど作ったリソースが選べるようになります。
日本語のQnAを作りたいのでLanguageはJapaneseにします。
STEP3 Name your KB.
STEP4 Populate your KB.
KBにQnAを登録します。QnAが記載されたページのURLを指定してもいいんですが、実用的な側面を考えて今回はTSVファイルを指定することにします。使うTSVファイルは手抜きですがこんな感じでいきます。
「+ Add file」を押下し、作成したTSVファイルを指定しましょう。
Chit-chatはなくてもいいですが、愛着のあるBotを作成したいのでひとまずFriendlyを選択します。
STEP5 Create your KB
「Create your KB」を押下してKBを作成しましょう。完了すると、今回作成されたKnowledge baseのEDIT画面に遷移します。
先ほど作成したTSVファイルの内容と、Chit-chatで指定したFriendlyなQnAが登録されているのが分かります。
右上の「Save and train」を押下して学習を行い、「Publish」タブの「Publish」を押下してエンドポイントを発行します。エンドポイントは後程使います(SETTINGタブからいつでも見れるので、画面をそのままにしておく必要はありません)。
KBの構築は以上になります。2. ローカルでBotアプリを構築
ソースコードはSampleとして提供されているものを使用します(1から書くとめちゃくちゃ大変)。
1. BotBuilder-Samplesリポジトリをクローン
実際に利用するソースはQnAの呼び出しまで提供してくれている下記のSampleになります。
https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/11.qnamaker2. KBへの接続情報を記述
QnA Maker Portal画面を開き、作ったKBのSETTINGタブの「Deployment details」を参照しながら、
.env
ファイルに下記のように記述します。MicrosoftAppId= MicrosoftAppPassword= QnAKnowledgebaseId=[POST /knowledgebases/{この部分}/generateAnswer] QnAEndpointKey=[Authorization: EndpointKey {この部分}] QnAEndpointHostName=[Host: {この部分}]3. パッケージのインストール
TerminalやCMDなどで
11.qnamaker
ディレクリに移動し、npm install
コマンドを実行します。4. Botの起動
続いて
npm start
でBotを起動します。3. Bot Framework EmulatorをインストールしてBotに接続
このページからご自身の環境に合わせたAssetsをダウンロードし、インストールします。
Bot Framework Emulatorとは、主にローカルでチャットクライアントとして動作するテスト用のデスクトップアプリ(ツール)です。
Emulatorを立ち上げると、Visual Studio Codeを触っている人には見慣れた画面が現れます。Microsoft製品なので当然ですが。
「Open Bot」を押下し、Bot URLに
http://localhost:3978/api/messages
と入力して「Connect」をクリックすると、EmulatorからローカルのBotにアクセスできるようになります。
試しに「Qiitaとは」などとBotに話しかけてみましょう。期待通りに返してくれるはずです。
また、「こんにちは」などと話しかけると、Friendlyに応答してくれます。
4. リソースの後片付け(お金がかからないように)
無料枠で構築した人は特にお金はかからないのでそのまま放置しても大丈夫です。
Azureのリソースグループ画面へ移動し、今回構築したすべてのリソースにチェックをつけ、削除ボタンを押します。
確認のための質問がありますが「はい」を入力して削除してしまいましょう。
おわりに
AzureのQnA Makerを使ってかなり簡単に機械学習を用いたQ&A Chatbotを作ることができました。
KBにいろいろなQnAを登録することで、いい感じに表記ゆれを吸収し、目的の回答を得ることができるので是非試してみてください。ただ正直Microsoftのドキュメントが分かりにくい…
なのでこのような記事を書きましたが、もっとQiitaにChatbot系の記事が増えると嬉しい限りです。
- 投稿日:2020-04-06T17:14:00+09:00
Azure QnA Makerを使ってローカルで動くChatBotを作ってみた
前提
- ローカルにNode.js環境があること(ない人はNode.jsをインストールしておいてください)
概要
Azure QnA Makerを使ってローカルで動くChatBotを作成し、Emulatorを使って実際にBotと会話することをゴールとしています。
以下の手順でローカルにBotを構築していきます。この回でコーディングは特にしませんが、Botアプリで利用する言語はNode.jsです。
- 1. QnA Maker ServiceとKnowledge baseの構築
- 2. ローカルでBotアプリを構築
- 3. Bot Framework EmulatorをインストールしてBotに接続
- 4. リソースの後片付け(お金がかからないように)
下記についてはこの記事で説明しないのでご注意ください。
- Botアプリのロジックについて
- 生成されるAzureリソースの役割について
1. QnA Maker ServiceとKnowledge base(KB)の構築
QnA Portalにログインして、「Create a Knowledge base」を押下。
基本は、遷移先のページに書いてあるSTEP通りに進めていきます。
※画面は見切れてるけどSTEP4まであるよ。STEP1 Create a QnA service in Microsoft Azure.
「Create a QnA service」を押下すると、AzureのQnA Maker作成画面に遷移します。そこで下記のように入力し、作成をクリック。
価格レベルはF0とFを選択すれば無料になります。僕の場合は無料枠を既に使ってしまったので、S0とBを選択しました。
とはいえお金がかかるのは嫌なので、このチュートリアル後にすぐに消そうと思います。記事の後半でそのことに触れているのでお金かかる怖いやりたくないって思う人も不安がらなくて大丈夫です。しばらくすると、「デプロイが完了しました」と画面に表示されます。先ほど指定したリソースグループをみると下記のようにいくつかのリソースが作られていることが分かります。成功です。
STEP2 Connect your QnA service to your KB.
QnA Portalに戻って「Refresh」すると、Azure QnA Service欄で先ほど作ったリソースが選べるようになります。
日本語のQnAを作りたいのでLanguageはJapaneseにします。
STEP3 Name your KB.
STEP4 Populate your KB.
KBにQnAを登録します。QnAが記載されたページのURLを指定してもいいんですが、実用的な側面を考えて今回はTSVファイルを指定することにします。使うTSVファイルは手抜きですがこんな感じでいきます。
「+ Add file」を押下し、作成したTSVファイルを指定しましょう。
Chit-chatはなくてもいいですが、愛着のあるBotを作成したいのでひとまずFriendlyを選択します。
STEP5 Create your KB
「Create your KB」を押下してKBを作成しましょう。完了すると、今回作成されたKnowledge baseのEDIT画面に遷移します。
先ほど作成したTSVファイルの内容と、Chit-chatで指定したFriendlyなQnAが登録されているのが分かります。
右上の「Save and train」を押下して学習を行い、「Publish」タブの「Publish」を押下してエンドポイントを発行します。エンドポイントは後程使います(SETTINGタブからいつでも見れるので、画面をそのままにしておく必要はありません)。
KBの構築は以上になります。2. ローカルでBotアプリを構築
ソースコードはSampleとして提供されているものを使用します(1から書くとめちゃくちゃ大変)。
1. BotBuilder-Samplesリポジトリをクローン
実際に利用するソースはQnAの呼び出しまで提供してくれている下記のSampleになります。
https://github.com/microsoft/BotBuilder-Samples/tree/master/samples/javascript_nodejs/11.qnamaker2. KBへの接続情報を記述
QnA Maker Portal画面を開き、作ったKBのSETTINGタブの「Deployment details」を参照しながら、
.env
ファイルに下記のように記述します。MicrosoftAppId= MicrosoftAppPassword= QnAKnowledgebaseId=[POST /knowledgebases/{この部分}/generateAnswer] QnAEndpointKey=[Authorization: EndpointKey {この部分}] QnAEndpointHostName=[Host: {この部分}]3. パッケージのインストール
TerminalやCMDなどで
11.qnamaker
ディレクリに移動し、npm install
コマンドを実行します。4. Botの起動
続いて
npm start
でBotを起動します。3. Bot Framework EmulatorをインストールしてBotに接続
このページからご自身の環境に合わせたAssetsをダウンロードし、インストールします。
Bot Framework Emulatorとは、主にローカルでチャットクライアントとして動作するテスト用のデスクトップアプリ(ツール)です。
Emulatorを立ち上げると、Visual Studio Codeを触っている人には見慣れた画面が現れます。Microsoft製品なので当然ですが。
「Open Bot」を押下し、Bot URLに
http://localhost:3978/api/messages
と入力して「Connect」をクリックすると、EmulatorからローカルのBotにアクセスできるようになります。
試しに「Qiitaとは」などとBotに話しかけてみましょう。期待通りに返してくれるはずです。
また、「こんにちは」などと話しかけると、Friendlyに応答してくれます。
4. リソースの後片付け(お金がかからないように)
無料枠で構築した人は特にお金はかからないのでそのまま放置しても大丈夫です。
Azureのリソースグループ画面へ移動し、今回構築したすべてのリソースにチェックをつけ、削除ボタンを押します。
確認のための質問がありますが「はい」を入力して削除してしまいましょう。
おわりに
AzureのQnA Makerとを使えばかなり簡単に機械学習を用いたQnA Chatbotを作ることができました。
KBにいろいろなQnAを登録することで、いい感じに表記ゆれを吸収し、目的の回答を得ることができるので是非試してみてください。ただ正直Microsoftのドキュメントが分かりにくい…
なのでこのような記事を書きましたが、もっとQiitaにChatbot系の記事が増えると嬉しい限りです。
- 投稿日:2020-04-06T16:16:20+09:00
macOS環境構築雑多メモ
macの最近の環境構築。winもほぼ変わらないと思うのでURL見つけておこう。
- homebrew
- git
- nodebrew
- npm
インストール内容
homebrew
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" ... ==> The Xcode Command Line Tools will be installed. Press RETURN to continue or any other key to abortRETURNしてpassword入力
Already up-to-date. ==> Installation successful!git
$ brew install git参考にしたサイト
https://qiita.com/micheleno13/items/133aee005ae37c28960enodebrew
$ brew install nodebrew参考にしたサイト
https://qiita.com/mame_daifuku/items/373daf5f49ee585ea498
- 投稿日:2020-04-06T04:41:23+09:00
Serverless Components はオレたちの未来を劇的にスケールさせるか
Serverless.inc 社より、Serverless Components がついに GA されました。
近年のアプリケーション開発では、いくつかの SaaS を組み合わせることで超高速に開発を行うことができます。例えば「認証は Auth0、ホスティングは Netlify、バックエンド API は AWS Lambda を使用する」といった具合です。このように複数のサービスを組み合わせることで、Undifferentiated Heavy Lifting な作業を排除できます。開発者は価値を生み出すビジネスロジックにのみ集中できるようになるのです。
以下はサーバレスアーキテクチャの例です。複数の SaaS を組み合わせて構築しています。
SaaS を組み合わせるだけで、一定の機能群を作り上げることができる時代になりました。しかし、それにしても複雑な管理は残ります。アプリケーション開発者は複数のサービスを手作業で組み合わせなければならず、構築と構成管理に一定の複雑度を残してしまいます。
そこで、Serverless Components です。
Serverless Components は、全てのクラウドベンダー、 SaaS ベンダーに対してインフラとアプリをプロビジョニングします。すでに提供されているコンポーネントを組み合わせるだけで即座にアプリケーションを構築できます。
従来 Serverless Framework は function と event は簡単に定義できていましたが、インフラリソースをプロビジョニングするためにはどうしても Cloudformation を定義する必要がありました。
また、プロビジョニングできる対象も AWS や GCP などの特定のクラウドベンダーのサービスにしか対応しておらず、Auth0 などを使用する場合は自前で構成管理をする必要がありました。Serverless Components なら様々な SaaS に対応できます。コンポーネント
Serverless Component は React のコンポーネントと同じ構造に基づいています。個々のコンポーネントを参照したり、複数のコンポーネントを同時に作成できます。
先の例をコンポーネントを使用して構築すると以下のように分解ができます。もちろん、より小さくコンポーネントを分割することもできます。ここでは最小の意味のある単位で分割した場合を図示しています。
サーバレスコンポーネントは、高次のユースケース(ウェブサイト、ブログ、請求システムなど)を中心に構築されています。関係のない低レベルなインフラの詳細は抽象化され、代わりに単純な構成が提供されます。例えば、S3 の静的サイト公開設定や、ログ記録、暗号化設定などはユースケースに対しては意識する必要はありません。事前に設定済みのコンポーネントを使用すれば良いのです。
これはソフトウェア開発における基本的な考え方 関心の分離 (Separation of Concerns: SoC) に基づいていますね。確かに Infrastructure as Code をやっていると、インフラリソースの細部まで理解して構築する必要があり、多大な学習コストを要していました。
ServerlessComponents を使用したウェブサイト
さて、まずは最もシンプルなアプリケーションを Serverless Component を使用して構築してみましょう。
ここでは、GitHub のリポジトリでも例としてあげている サーバレスウェブサイト を構築することにします。今回構築するウェブサイトは、AWS S3 でホストされます。無料の AWS ACM SSL 証明書で保護された AWS Route 53 のカスタムドメインでアクセスします。さらに、静的コンテンツは、AWS Cloudfront を使用して迅速かつグローバルに配信されます。
従来このような構成を実現する場合、ServerlessFramework に直接 Cloudformation を書き下し、各リソース間の詳細な設定と依存関係を意識する必要がありました。数百行の Cloudformation のテンプレートが必要でしょう。
Serverless Components を使用する場合はこれだけです。
component: website name: website inputs: src: src: ./src hook: npm run build dist: ./dist domain: geeawa.ga驚異的なほど、シンプルです。
component: website
として、website コンポーネントを使用することを宣言し、そのコンポーネントに渡す設定値をinput:
にて指定しています。ただ、それだけです。Serverless Components を使用してウェブサイトを構築する
実際に website コンポーネントを使用してこの構成を作ってみましょう。
Install
まずは最新バージョンの Serverless Framework をインストールします。
$ npm install -g serverlessCreate
サンプルとして、以下のようにテンプレート URL を指定して構築します。
$ serverless create --template-url https://github.com/serverless/components/tree/master/templates/website $ cd website次に、
.env
ファイルを使用して AWS アクセスキーの情報を記載しましょう。.env
ファイルはwebsite
のルートディレクトリに作成します。AWS_ACCESS_KEY_ID=XXX AWS_SECRET_ACCESS_KEY=XXXディレクトリ構成は以下のようになっているはずです。
|- src |- index.html |- serverless.yml |- .envDeploy
あとはデプロイをするだけです。
$ serverless deploy
デプロイが完了すると以下のようにウェブサイトの URL が発行されます。Cloudfront へ配信が完全に完了するまでに少し時間がかかることに注意してください。
serverless ⚡ framework Action: "deploy" - Stage: "dev" - App: "landing-page" - Instance: "landing-page" bucket: website-089y5jm bucketUrl: http://website-089y5jm.s3-website-us-east-1.amazonaws.com url: https://d2u9prrumf2g64.cloudfront.net domain: https://www.geeawa.ga以下のようなサイトがデプロイされています。
Dev Mode
さらに興味深い機能として Dev Mode があります。開発中にソースディレクトリの変更を監視し、保存すると即座にデプロイできます。
Remove
作成されたインフラを破棄する場合は、serverless.yml ファイルが含まれているディレクトリで次のコマンドを実行するだけです。
$ serverless removeコンポーネントを自作する
コンポーネントを自作するためには以下の2つのファイルが必要です。
- serverless.component.yml: ServerlessComponent の定義を記入します。
- serverelss.js: ServerlessComponent のコード(実装)を記述します。
serverless.component.yml
コンポーネントをサーバーレスレジストリ内で利用できるようにするためには
serverless.component.yml
を作成する必要があります。# serverless.component.yml name: express # 必須 コンポーネント名 version: 0.0.4 # 必須 バージョン author: eahefnawy # 必須 著者 org: serverlessinc # 必須 開発組織名 description: Deploys Serverless Express.js Apps # 任意 説明 keywords: aws, serverless, express # 任意 registry.serverless.comで検索するときに引っかかるキーワード repo: https://github.com/owner/project # 任意 ソースコードのリポジトリURL license: MIT # 任意 ライセンス main: ./src # 任意 コンポーネントのソースコードが格納されているディレクトリserverless.js
serverless.js
には以下のように実装していきます。React の思想にインスパイアされており、Component
を継承したつくりになっています。deploy
,remove
などの Function を書いていくことになります。// serverless.js const { Component } = require("@serverless/core"); class MyBlog extends Component { async deploy(inputs) { console.log("Deploying a serverless blog"); // --debug モードで実行するとログが出力されます。 this.state.url = outputs.url; // stateに保存する return outputs; } } module.exports = MyBlog;
deploy()
は必ず書く必要があります。deploy()
は、コンポーネントが何らかのクラウドリソースを作成するためのロジックが存在する場所です。serverless deploy
コマンドを実行すると、常にdeploy()
メソッドが呼び出されます。このクラスに他のメソッドを追加することもできます。
remove()
ではサーバレスコンポーネントが作成したクラウドリソースを全て削除します。他にもメソッドはいくつでも追加できます。コンポーネントを追加機能付きでプロビジョニングしたい場合などに拡張できる作りになっています。
Serverless Components は
test()
,logs()
,metrics()
機能を備えたコンポーネント、またはデータベースコンポーネントの初期値を確立するためのコンポーネントseed()
の開発に着手しているようです。メソッド以外の
deploy()
メソッドはすべてオプションです。すべてのメソッドは、inputs
個別の引数ではなく単一のオブジェクトを取り、単一のオブジェクトoutputs
を返します。まとめ
クラウドや SaaS ベンダーのリソースを統一的に管理し、再利用可能にするプラットフォームが Serverless Components です。
現在公式が提供しているコンポーネントは 67 種類(2020/04/06 現在)です。
まずは AWS や Kubernates 関連がラインナップし始めています。急激に拡大しています。もう 本当に必要なものだけを実装し、組み合わせるだけ という開発スタイルに変わりはじめています。これこそがクラウドテクノロジーの目指していたところかもしれません。さらなる発展が楽しみですね。