本記事は、EmbulkのInputとOutputに対応するPluginをRubyで作成する手順を解説します。対象としてはDialogflowです。Botを使って家計簿を管理しているのですが、訳あってDialogflowのプロジェクトを移行しないといけなくなりました。今回の記事では体系的にPluginを作る方法を解説するため、Dialogflowに限らずあらゆるPluginで使える知識を習得できるのではないかと思います。Dialogflowを使ったアプリケーションはいくつも開発していますが、一つのサンプルは以前に記事にしましたので興味がある人はご覧ください。www.1915keke.comそれでは、やっていきましょう。アジェンダ本記事のアジェンダは以下の通りです。ユースケースを考えるデザイン思考的な考えにはなりますが、想定するユーザーの痛みを解決するものでしょうか。実際、他の解決手段があるのかを考えなければなりません。自分のDialogflowは他のアイデアによって解決できるでしょうか。現段階では手作業しかありません。Pluginによって、同じような問題に直面している人のためになれるかもしれません。自分のユースケースとしてはDialogflowのプロジェクト移行にあります。Project移行はInputとOutputがセットになっています。Outputを他のファイル出力にすることによって、バックアップを取ることも可能になり、さらなるアプリケーションに期待できます。Tokenが必要になります。Tokenが必要です。Tokenを取得できないので作成する必要があります。Name(Dialogflow)が必要になります。自分が作りたいものに対して、何が必要なのかを考える必要があります。APIを有効化することが必要となってきます。Configure方法を考えるこの項目を設けましたが、つまるところ、YAML設計というものです。実際はドメイン構造になっているので、慣れしたんだオブジェクト指向を考えれば良いでしょう。今回はaccess_tokenproject_idagent_nameしか必要ないのであまり考える必要がありません。GCPを使用するプラグインは、いくつもあるので、以下のようなPluginが参考になります。Pluginは以下のようなConfigをする必要があります。stdout}特にParserがハッシュになっていることがわかります。必要に応じて、設計をする必要があります。Schemaを設計するSchemaとはEmbulkのプロトコルのようなものです。やりたいことを理解することが何よりも大事です。プロトコルとしてあることによって、簡単にいうとInputからOutputへ入力から出力をすることができます。安全に、そして簡単に受け渡すにはリレーショナルデータベースのようにスキーマを設計する必要性があります。APIを使用するので、まずその理解が必要です。API仕様は以下のサイトにあります。APIに対してのメソッドなのでAPIを使わないアプリケーションの場合は、飛ばしてもらって構いません。API使用を公式ドキュメントで知るだけでもいいですが、手を動かして探ってみます。IDなどが必要なので、以下のように確認します。Projectとして紐づいています。構造としては以下のようになっています。SQLなど他のGCPサービスにアクセスするように、以下のようにサービスアカウントを作成して、JSONの秘密鍵を取得します。環境変数GOOGLE_APPLICATION_CREDENTIALSをそのファイルのパスにします。'./old_private_key.json'などとしました。次に、以下のようなcURLを実行できるようになります。"https://dialogflow.googleapis.com/v2/projects/[YOUR_PROJECT_ID]/agent/intents"レスポンスは以下のようになります。0.3}これによってAPIを叩けるということが確認できました。ExportとImportを確認するdialogflow.com本記事では、上記のAPIを使ってプロジェクトを移行していきます。Pluginの作成手順を解説します。Projectの作成まず、最初にProjectを作成しましょう。newコマンドで作成をすることができます。<name>ここの<type>はどの言語で、何をするかを定義します。選択肢としては以下のものがあります。csvこちらは、Output作成するときも使用するので、再度そのときはご参照ください。今回はRubyでInputを作成するので、以下のようにしましょう。dialogflowこのように作成したPluginの名前はembulk-<typeの`言語-`の接頭語を取ったもの>-<name>になります。今回の場合はembulk-input-dialogflowとなります。shellを使っているので以下のコマンドです。dialogflowなぜ、このようなことをしないといけないのかはDigdagと一緒の理由なので、知りたければ以下のリンクをご覧ください。github.com先ほどのコマンドの結果は以下の通りです。commandなので、手順に従います。installここで問題があります。embulk-input-dialogflow.gemspecに書かれている依存関係でembulkに対して以下のように記述されています。Gemfile.と「Gemが存在しないよ」と出ます。実際にembulkのGemについて確認します。rubygems.orgするとどう考えても0.9以上のバージョンは存在しません。installすると成功します。以下のコマンドを実行してBuildします。ここのステップはGemを公開するときだけでいいのですが、やっておきます。rakeこのようにして、ひとまず準備はできました。テストをできる環境にする開発中はGemを公開しないと思います。テストをしながら、開発を進めたいものです。path/to/your/plugin/libに指定することによってテストをすることができます。config.ymlでテストをします。stdoutのようなファイルを作って、試してみます。ここでout.typeのstdoutは標準出力です。ついでにconfig.ymlをサンプルとして公開しない場合は.gitignoreにconfig.yml`を追加しておきましょう。.gitignore公開すると、手助けになるケースが多いのでconfig.sample.ymlなどと名前をつけてGit管理した方がいいのではないかと個人的には思います。Keyなど)が事前に必要かをすでに考えているかと思います。以下の箇所が設定に関する箇所です。...endまず、設計した通りに指定します。デフォルト値を設定しなければ、値が設定されないとエラーになります。今回は以下のようにしました。required}また、これをREADME.mdに記述します。|今回ではInputPluginをオーバーライドしていますが、特にすることがなければ何もする必要はありません。task["project_name"]endすると、インスタンス変数に代入すると便利に値を扱えます。ここのtask["hoge"]は、以下のように、先ほどのtask定義で定義したものを参照しているのです。...endそしてaccess_tokenとproject_nameがどちらもconfig.ymlで読まれることを確認します。実際はテスト駆動開発で実践していくべきですが、今回はやりません。stdoutそして、ドライランpreviewをしてみます。config.ymlエラーが出ないことを確認します。次に何をしないといけない(=Pluginの挙動)を決めます。Schemaを定義する初期コードでは、以下のような箇所でスキーマを定義をしています。:double),]ここを設計通りに実装していきます。前提知識として、Embulkのスキーマで使える型は、以下の表の通りです。Clientが必要なので、今回はFaradayを使って行こうと思います。github.com選定理由としては、4年ほど前にインターンシップで使用していたのと、実装が簡単そうだからです。.gemspecに以下の一行を追加してください。runの中に押し込めてしまいます。簡略化のために以下のように実装しました。end実際にドライランをしてみると、結果がわかります。実装編(Output)定義したスキーマを通してInputからOutputへ受け渡すことができます。Inputは先ほどの2章で設定をできたので、今回はOutputを作成しましょう。今回は公開していないInputとともにOutputを開発していきます。新しいProjectを作成してきます。dialogflowあとは、Inputを作成したときと同様なので省略します。Inputから値を取得するInputがDialogflowから取得してきたレコードを受け取ります。recordが取得をしています。確認してみたければ、以下のようにしてください。endpageによって取得をすることができます。実行するには、InputもOutputもどちらも公開はしていないローカルプラグインなので、以下のようにします。config.ymlここでErrorなく出力をできれば開発できる環境にあります。Pluginと全く同じです。省略させれいただきます。事前にDialogflowでAgentを作成します。Pluginを実行します。config.ymlDialogflowで対応しなければならない相当するcurlは以下のものです。}"これをRubyを使って実装すればいい話です。今回は本質的ではないので解説しませんが、いつものクライアントであることを意識すれば何も問題ではないかなと思います。まとめEmbulk上でDialogflowのあるProjectのAgentを別ProjectにAgentに移行する機会はあまりないので、対して価値のないPluginになりました。Pluginをより詳しく知ることができたので、今回は非常によい練習課題になったのではないかなと思っています。ありがとうございました。私は、いくつか家内サービスを運用しています。C...2018-12-23Concourseで継続的デリバリー。»プロフィール学生エンジニア。忘れてしまうので備忘録です。flaskでServerlessにホストするTelepresence概論スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。