N予備校 プログラミングコース 第21回
あなたは2019年の目標って立てましたか?
どんな目標を立てたか覚えていますか?
私は2018年末に2019年の目標を立てました。
その一つにプログラミングを学び仕事として使えるようにすることをあげました。
そして、思い立ったが吉日と「N予備校のプログラミングコース」を申し込みました。
そして受講と同時に自身の振替と、これから始めようと考えている人の参考になればとブログを書き始めました。
今回ブログの移設にともない、再度そのブログを読み返しながら、今思うことを加えて記載していきたいと思います。
また私が受講したのは【2018年度】で、現在公開されている【2019年度】との違いについても書いていきたいと思います。
このブログは、初心者が学びながら書いているため、間違っている場合があります。
分かり次第修正していくつもりです。
そのあたりも含め楽しんでいただければと思います。
最後に進めていてわからなかったところや気になったところをまとめています。
プログラミング入門 webアプリコース 第21回
前回、ボットプログラムとそのプログラムを動作させるためのプログラムを作成しました。
今回は、ボットプログラムをSlackで動作させることができるようにします。
- 今回の内容まとめ(第3章 08)
・Slackとボットプログラムの連携について
-
今回の目標
Slackで動作させるボットプログラムを作成します。
- 今回新しく扱っているコマンド等
・espond関数
・match関数
・trim関数
・join関数
Slackとボットプログラムの連携について
Slackでボットを動作させるためのプログラムを作成します。
前回学んだGRUDの概念から、今回は以下のようにプログラムを作成します。
C(create):TODOを作成
R(Read):TODOの一覧表示
R(Read):完了したTODOの一覧表示
U(update):TODOを完了にする
D(delete):TODOを消す
todoコマンドの実装
今回作成するのに使用する関数が、respond関数、match関数、trim関数です。respond関数はhear関数とは異なり、ボットの名前が一緒に呼び出された時のみ反応する関数です。
trim関数
文字列の両端の空白を取り除いた文字列を取得する関数で、今回はそれをtaskという名前に設定しています。
robot.respond(/todo (.+)/i, (msg) => {
const task = msg.match.trim();
todo.todo(task);
msg.send(‘追加しました: ‘ + task);
1行目の「/todo (.+)/i」の部分では 、todoで始まりその後に1つのスペースを置いてなんらかの文字列が記述されたときに応答するように設定しています。
ここで、「 . 」は改行以外のどの1文字でもいいという意味で、「+」は直前の文字の1回以上の繰り返しを認識するという意味です。
これにより、「aaa」でも「あいうえお」でも認識します。また「/i」 を加えることで、大文字でも小文字でも認識してくれるようになります。
以上で、「todo ○○を買う」などにも反応するようになります。
2行目の、matchでは、1番目の文字、ここでは先ほど設定した「.+」の部分を文字列として呼び出しています。
0番目にすると、文字列全体が呼び出されます。
例えば、「Hubot-todo todo ○○を買う」と話しかけた場合、1では「○○を買う」、0では「Hubot-todo todo ○○を買う」を呼び出します。
さらに、trim関数により文字列の両端の空白を取り除いた文字列を取得します。
今回は、その内容をtaskという変数にしています。
3行目で、todo関数の変数にtaskを適用し
4行目で、send関数を使って「追加しました: task」と発言させています。
これでTODOの設計が完了します。
TODOの動作確認
TODOが正常に動くかをボットを起動して確認します。
まず、以下のコマンドでボットを起動します。
bin/hubot
続いて、TODOが動作するかを確認します。
○○ todo ××を買う(○○にはボットの名前が入ります)
上記のようにコマンドを打ち込むと、次のように表示されれば成功です。
○○> 追加しました: ××を買う
doneコマンドとdelコマンドの実装
todoコマンドと同じように、doneコマンドとdelコマンドを作成します。
robot.respond(/done (.+)/i, (msg) => {
const task =msg.match.trim();
todo.done(task);
msg.send(‘完了にしました: ‘ + task);
});
robot.respond(/del (.+)/i, (msg) => {
const task = msg.match.trim();
todo.del(task);
msg.send(‘削除しました: ‘ + task);
});
1行目、6行目の「/done (.+)/i」「/del (.+)/i」の部分では 、それぞれdoneまたはdelで始まりその後に1つのスペースを置いてなんらかの文字列が記述されたときに応答するように設定しています。
2行目、7行目のmatchでは、1番目の文字、ここでは先ほど設定した「.+」の部分を文字列として呼び出しています。
さらに、trim関数により文字列の両端の空白を取り除いた文字列を取得します。
3行目、8行目で、done関数またはdel関数のの変数にtaskを適用し
4行目、9行目で、send関数を使って「完了しました: task」「削除しました:task」と発言させています。
donelistコマンドとlistコマンドの実装
続いて、donelistとlistを実装します。ここで新たに出てくるのがjoin関数です。
join関数
配列のすべての要素を与えられた文字列でつないで一つの文字列にする関数
この関数を用いて、作成したdonelistとlistが以下になります。
robot.respond(/list/i, (msg) => {
msg.send(todo.list().join(‘\n’));
});
robot.respond(/donelist/i, (msg) => {
msg.send(todo.donelist().join(‘\n’));
});
2、5行目で、join関数を用いて今回は改行を表す\nを加えることで、TODOの一覧が改行されて表示されます。
以上で作成したプログラムをslackで動作させると、
○○ todo ××を買う
○○ todo △△を買う
○○ list
○○ done △△を買う
○○ donelist
○○ del △△を買う
○○ donelist
以上のようにボットに話しかけると
追加しました: ××を買う
追加しました: △△を買う
××を買う
△△を買う
完了にしました: △△を買う
△△を買う
削除しました: △△を買う
donelist
のようにボットが返答してくれます。
今回はSlackで動作させるボットプログラムを作成しました。
次回はボットを再起動した際にタスクが失われないような設定について学びます。