日記帳

プログラミングのことをつぶやく日記です。

git-update を導入した

sue445.hatenablog.com

この記事をみて git-update コマンドを置いたら便利そうだなーと思って導入した。 git-update コマンドは、作業中のブランチをmasterブランチの先端に向ける認識。 よく何をどこにしまったか忘れるのでmemo.

環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G1408

$ git --version
git version 2.19.0

導入ログ

cd /usr/local/bin # PATHが通っているので、ここにコマンドをおくぞ
vi git-update # 記事のソースをぺたり
chmod a+x git-update # 権限を全てのユーザー実行可能へ
git-update

/usr/local/binエイリアス張って、リポジトリ管理しろよって感じだが、自作コマンドが全くないので今はこの運用。管理する必要が出てきたらリポジトリで管理する。最初から気合を入れてはいけない。

GMOあおぞら銀行の残高を自動取得するスクリプトを組んだ

課題

給与受け取り口座がGMOあおぞら銀行に変更になった。マネーフォワードが対応してなくて、残高確認のために、毎回GMOあおぞら銀行のページを徘徊するのは煩わしい。自動化して毎日チェックできないものか。

解決策

もっとも理想的なのはマネーフォワードがGMOあおぞら銀行に対応することである。しかし実装予定の予告も出ていないので、神に祈るしかない。無神論者は神に祈る習慣はないので自分でなんとかすることにする。

労力が少なく具体的な解決策を一つあげるとすれば、スクリプトを書いてcronで毎日流して通知する形がいいのではないか。なのでPuppeteerの練習も兼ねてNode.jsでやってみる。

「Puppeteer入門 スクレイピング+Web操作自動処理プログラミング」を購入して、少し練習して挑戦してみた。

Puppeteer入門 スクレイピング+Web操作自動処理プログラミング

Puppeteer入門 スクレイピング+Web操作自動処理プログラミング

具体的な解決策として Puppeteer を用いて自動ログインしてみる

最初に完成したコードを記載しておく。

Puppeteer_practice/aozora_login.js at master · ryuchan00/Puppeteer_practice

まずはPuppeteerのインストールから始める。

npm install puppeteer

次はPuppeteerの読み込みをする。

const puppeteer = require('puppeteer');

ユーザーIDとパスワードの取り扱い

迷ったのが、ユーザーIDとパスワードをどこから取得するかだ。思いつくだけでも以下の場所から取得できそうだ。

この中で選択するのであれば、ソースコードを公開する時に安全で環境によって値を変更できる「環境変数」で保持した方が良さそうだ。dotenvというライブラリを使えば.envファイルに書いたものを環境変数として扱ってくれるらしい。

qiita.com

### dotenvのインストール
npm install dotenv

dotenvの読み込み

require('dotenv').config();

const USER_ID = process.env.AOZORA_USER_ID;
const PASSWORD = process.env.AOZORA_PASSWORD;

.envファイルの中身

AOZORA_USER_ID="aaaaa"
AOZORA_PASSWORD="bbbbb'

環境変数AOZORA_USER_IDにはユーザーIDを、AOZORA_PASSWORDにはパスワードを入れる。

GMOあおぞら銀行のページまで自動で遷移する

すでにユーザーIDとパスワードを用意してしまったが、まずは自動でGMOあおぞら銀行のログインページまで遷移してみることにする。最初の歩幅を縮めて一つ一つ確認していこう。初めて使うツールならなおさらだ。ログインページまで自動でたどり着くには、ブラウザの新しいページを開いて、gotoメソッドで遷移先のURLを引数として与えてあげる。node aozora_login.jsで実際に実行して確認していく。ログインページが開ければOKだ。

(async() => {
// Puppeteerの起動
    const browser = await puppeteer.launch({
        headless: false,
        slowMo: 50,
    });

    // 新しいからのページを開く
    const page = await browser.newPage();

    // view portの設定
    await page.setViewport({
        width: 1200,
        height: 800,
    });

    // GMOあおぞら銀行のログインページまで移動する
    await page.goto('https://sso.gmo-aozora.com/b2c/login');
})();

自動ログインしてみる

ログインするためにはユーザーIDとパスワードをフォームに入力する。こうやって日本語で書いたら何を当たり前なこと的なことを書いているが、実際にコードで表現すると以下のようになる。typeメソッドで各フォームに入力していく。要素はユーザーIDはname="username"、パスワードはname="password"を指定する。(余談だが、もしPOSTメソッドにて実行するのであれば、トークンが必要なのだった。)ログインボタンをクリックするためにはclickメソッドを使用する。これで会員トップページまでたどり着ける。

    // ユーザーIDを入力する
    await page.type('input[name="username"]', USER_ID);
    // パスワードを入力する
    await page.type('input[name="password"]', PASSWORD);

    // ログインボタンをクリックする
    await page.click('button[type="submit"]');

会員ページトップの残高情報を取得してみる

残高の情報をコンソールに表示できるようにしてみる。まず残高の情報が表示されるまで、スクリプトを中断させる必要がある。waitForメソッドを用いて6秒待つことにする。それ以下だと先にスクリプトが残高の要素を取得しようとして失敗することがある。残高の要素はamountクラスのspanタグの要素である。evaluateメソッドを使用して、定数amountに残高の数値を代入する。これでCUIで残高を表示することができた。最後にブラウザを終了するようにすれば完璧だ。

    await page.waitFor(6000);

    // 要素の取得
    const amount = await page.evaluate((selector) => {
        // evaluate関数に渡す第一引数のfunctionは、
        // 第二引数として渡したパラメータをselectorに引き継いでブラウザ内で実行する
        return document.querySelector(selector).textContent;

    }, 'span.amount span');

    console.log('残高:' + amount);

    // ブラウザの終了
    await browser.close();

これから

これをChrome extensionに移植してマネーフォワードのページを開いた時にGMOあおぞら銀行の情報も追加してあげたい。できるだろうか。年末にやってみる。

電気通信大学 先端工学基礎課程 に合格した

先日、電気通信大学 先端工学基礎課程 AO入試に合格しました。来年4月より大学1年生です。

約5ヶ月前に受験を決めて、運よく合格することができました。応援してくださった皆様、本当にありがとうございました。

leokun0210.hatenablog.com

もし社会人で受験したいけど情報が欲しいという方がいたら、よければ参考にしてください。ただし記事の内容が来年以降も当てはまらない可能性もあるのであくまで参考情報の一つとしてお考えください。

動機

上記の受験を決意をするときのエントリーを言及した「自分のキャリアに幅を持たせる」側面が強いです。面接の時にもお話ししたのですが、IT業界はIPAの調査によれば人材の質・量共に不足気味です。(この辺の根拠はIT人材白書2018を見てね)そうなると他の業界から優秀な人材が多く人が流れてきます。今の自分のように大学の専攻はコンピューターサイエンス(以下CS)以外に人も今以上に多くなってくるでしょう。そうなると1つのポジションの競争率が高くなります。業務に関してほぼ同等の能力を有する場合は、理数系の知識に基づいたロジカルな論理的思考力のバックグラウンドを持つ人材、つまりはCSの知識の方が有利ではないかという推測して入学を決意しました。面接でもこれを掘り下げたことを言いました。

試験の内容

1日目は、数学・物理化学・英語の3教科合わせて120分の総合問題を解きました。

2日目は、今まで数学・物理を学んだかのアンケートと数学Ⅱまでのテスト、あとは志望動機などを聞くための集団面接と個人面接がありました。

やったこと

総合問題対策

5ヶ月という期間でフルタイムで働きながら4教科を勉強するのは時間が足りないです。ネットでは、社会人は総合問題の点数はそこまで重視されないとの書き込みを見つけたので、数学と英語に絞って勉強しました。物理化学は余裕があったらやるぐらいの気持ちでした。

英語

上記の教材を1週しました。実際の出来は半分以上は確実に取れたかなという印象でした。

数学

  • 白チャート数ⅠA
  • 白チャート数ⅡB
  • 白チャート数Ⅲ

微分積分三角関数、行列を中心にやりました。過去問で出題されない範囲の傾向がわかるので、過去3年間で一問も出題されていない単元は手をつけませんでした。総合問題の出来は正直あんまりできませんでした。ただ、2日目の数学のテストは7割ぐらいはできたと思っています。

物理化学

  • チャート式物理基礎
  • チャート式化学基礎

これらを少しだけやっただけでした。正直勉強時間がなかったので、ほぼ捨て科目でした。

集団面接で総合問題の出来について聞かれるのですが、社会人の得点はそこまで高くない印象でした。6人と一緒に面談したのですが、勉強期間が1ヶ月未満の人もいました。ただなぜ得点が低いのか、入学後のフォローはどうするかを聞かれます。

面接対策

社会人は面接の比重の方が大きいと思ったので、面接の根幹になるであろう志望動機は3~4日かけて作成しました。志望動機は、「なぜ大学を志望したのか」「なぜ電気通信大学なのか」「なぜ先端工学基礎課程なのか」の3つを一本の繋がる線にして書きました。規定文字数が800文字程度でしたが、草案は1400文字ほど書いてそれから削る作業をしました。特に苦労した箇所が「なぜ電気通信大学か」でした。これは電気通信大学はどのような人材を輩出する目的があり、他の大学とどのように違うのかを調査して書きました。パンフレットは何回も読み返した記憶があります。

推薦書は会社の方に書いていただきました。本当にありがとうございました。

実際は集団面接では、志望動機、総合問題の感想などが聞かれました。個人面接では、集団面接の掘り下げと共に勤務状況や通学距離などが聞かれます。ちなみに1日目はいたのに2日目の面接に来ない人が数人いました。

試験の時に注意した方がいいところ

数学は最低でも数Ⅱまでは力を入れておく

試験2日目は、面接のみだと思っていましたが、数Ⅱまでの基礎的な問題を1時間解きました。おそらく社会人受験者の評価資料に使うのではと思いました。社会人受験者は、高校卒業から時間が経過しており、総合問題を解答するには厳しい人もいるので、別途基礎学力の調査が必要なのかなと思いました。

2日目の面接は、集団面接から個人面接まで2~4時間ぐらい待たされる

集団面接は午前中に終わるのですが、個人面接になると、人数が60人前後おり、一人当たり10分以上面接するので、かなり待たされます。自分は4時間ぐらい待ちました。待ち教室は結構寒いので防寒対策はしっかりした方がいいでしょう。

面接では機転が効くかの質問もされる

集団面接で、「日本の文化を一つあげて、どうのように外国人に説明しますか」と聞かれました。結構不意打ち気味だったので焦りました。答えるのに難儀している受験者もいました。受験前は新聞の1面に軽く目を通すぐらいはした方がいいかなと思いました。

何を実社会に活用できるか

大学に行く目的は情報理工系の知識の専門性を高めることです。1~2年生の間は数学や物理の基礎を学んで出来ることを増やすフェイズ、3~4年生は専門性をグッと引き上げるフェイズと分けて捉えています。専門性を高めて、会社の人材層を厚くするのが自分の役割だと考えています。やや抽象的な表現にしたのは、まだ実際に講義を受けるのは未来の話なため、どの技術領域の専門性を引き上げるかの明言が難しいためです。ただこういうスタンスで会社に貢献するつもりは変わりありません。

Hubotを通してSlackとスプレッドシートを連携してルーレットを作る

Hubotを通してSlackとスプレッドシートを連携する

GMOペパボ Advent Calendar 2018の1日目の記事です。

Slackにてルーレットをして人にメンションを飛ばせるBotを作成しました。完成イメージは↓↓↓

f:id:leokun0210:20181125231832g:plain

こんな感じで、スプレッドシートに前回の当選者を残しながらランダムで人を指定するシステムです。2019年が間近に迫っているのに今更感が否めませんが、お付き合いください。

f:id:leokun0210:20181201170601p:plain

この記事の対象者

目的

Slackとスプレッドシートを連携しようと思ったきっかけは、所属しているチームにて毎週行われるチームミーティングでは、KPTを用いた「ふりかえり」を行っていて、ファシリテーターを決める必要があります。ファシリテーターは毎回違う人を選びます。過去3、4回ぐらい前にファシリテーターになった人までは、ファシリテーターの候補から外していました。しかし、3、4週前のこととなると忘れていることが多く、覚えていない時もあります。したがって、過去3回までにファシリテーターを担当した人以外をランダムに選ぶようなルーレットを作りたいと思いました。チームミーティングの出席者が様々な事情で変動することがあり、エンジニア以外にも人数の編集しやすく、使いやすいスプレッドシートという媒体を使用して、Slackを通じてランダムでファシリテーターを指名したいと思いました。 この記事を書いた目的は、Hubotとスプレッドシートの連携の記事の多くは、完成したコードがバーンと公開されていて、仕組みを追いながら理解することができないからです。ただコピペして運用するぶんには問題ありませんが、一応エンジニアなので仕組みを理解しつつやっていきたいという気持ちがあります。ですので、初めから順を追って作成します。

要件

  • SlackのBotに対して、 ルーレット とメンションしたら、あらかじめ指定した候補者の中から1名をランダムで選択して、その人に対してメンションする。
  • 過去3回までのルーレットの当選者は、選ばれる候補者の中から外れる。
  • 候補者のリストは、スプレッドシートで管理する。

この3つの要件を満たすように作っていきましよう。

開発順序

  1. SlackとHubotを連携させる。
  2. Hubotで、Slackからのリクエストを処理できるようにする。
  3. スプレッドシートから、Hubotに対して、候補者のリストから1名をランダムに選択して、レスポンスしてあげる。
  4. HubotをHerokuへデプロイする

Hubot編

Slack側の設定

Slack App ディレクトリでHubotと検索して、アプリをワークスペースに追加します。

アプリを Slack に追加する | アプリおよびインテグレーション | Slack App ディレクトリ

「設定を追加」を選択して、Hubotの名前を入力してHubotインテグレーションを使いします。ここでは名前を「roulette」とします。

f:id:leokun0210:20181201185423p:plain

次に追加したHubotのインテグレーションの設定を変更します。APIトークンはHubotのプロセスを立ち上げるときに必要です。

f:id:leokun0210:20181204114334p:plain

Hubtoの設定

Hubotのチュートリアルの通りやっていきましょう。

Getting Started With Hubot | HUBOT

まずHubotを動かすためのパッケージをインストールします。ここでは npm については触れません。必要なパッケージは yogenerator-hubot です。

$ npm install -g yo generator-hubot

次にHubotの雛形を作成します。このときメールアドレスやHubotの名前も要求されますが、全てEnterでも構いません。このタイミングでリポジトリを作りたい人は git init をするのを忘れずに。

$ mkdir hubot-roulette
$ cd hubot-roulette
$ yo hubot

bin/hubot Hubotのプロセスを立ち上げてローカルでHubotが動くことを確認します。 hubot-roulette ping でHubotから PONG とレスポンスがあれば疎通確認は完了です。

$ bin/hubot
# 色々メッセージが出るけど動作するので無視する
hubot-roulette> hubot-roulette ping
hubot-roulette> PONG

次はHubotで簡単なスクリプトを書いて、Hello,Worldしてみます。 scripts/hello.coffee を作成します。JavaScriptでも可能ですが、今回はCoffeeScriptで書いてみます。これで、 hello と呼びかければ world と返ってきます。

$ touch scripts/hello.coffee
module.exports = (robot) ->
  robot.respond /hello/i, (msg) ->
    msg.send 'world'
$ bin/hubot
hubot-roulette> hubot-roulette hello
hubot-roulette> world

次にSlackとの連携をやってしまいます。 hubot-slack というSlackとHubotのアダプターのパッケージがあるのでインストールします。そして環境変数 HUBOT_SLACK_TOKEN にSlackの設定時に取得したAPIトークンを代入します。プロセスが起動したら、 roulette アカウントに対してDMを送信します。まずは ping を送信して疎通を確認します。次に hello と送信して world が返ってくるか確認します。

$ npm install hubot-slack
# Slackのプロセスが起動
$ HUBOT_SLACK_TOKEN="Slackで取得したAPIトークン" ./bin/hubot --adapter slack

f:id:leokun0210:20181201201345p:plain
Hubotとの会話

APIとの通信

スプレッドシートは、WebAPIを作成する機能があり、Hubotとのやり取りはhttpリクエストを通じて行います。まずは実際にスプレッドシートAPIを作成するより、スタブサーバーを立ててHubot側の動作を確認することを優先しましょう。npmでjsonから簡単にスタブサーバーを立てることのできるパッケージ json-server をインストールします。

$ npm install -g json-server
$ touch user.json

user.jsonの中身は以下の通りです。 GET "localhost:3000/users" のエンドポイントを作り、 "a" という文字列が返ってくることを期待します。

{
  "users": [
    "a"
  ]
}
# スタブサーバーを立ち上げる
$ json-server  --watch user.json

  \{^_^}/ hi!

  Loading user.json
  Done

  Resources
  http://localhost:3000/users

  Home
  http://localhost:3000

  Type s + enter at any time to create a snapshot of the database
  Watching...
# 期待通り"a"が返ってきた
$ curl -X GET "http://localhost:3000/users"
[
  "a"
]%

Hubotのスクリプトから、このスタブサーバーのエンドポイントへリクエストします。JavaSriptのHTTPクライアントを使用します。

CoffeeScript Cookbook » Basic HTTP Client

http = require 'http'

module.exports = (robot) ->
  robot.respond /hello/i, (msg) ->
    # port番号3000を指定するのを忘れずに
    http.get {host: 'localhost', port: 3000, path: '/users'}, (res) ->
      if res.statusCode is 200
        body = ''
        res.setEncoding 'utf8'
        res.on 'data', (chunk) ->
          # レスポンスのデータをbodyにまとめる
          body += chunk
        res.on 'end', ->
          # レスポンスのJSON形式のデータをパースする
          obj = JSON.parse(body)
          msg.send obj
      else
        console.log "error: #{res.statusCode}"
# きちんと"a"が取得できており、GETリクエストが成功したことがわかる
$ bin/hubot
hubot-roulette> hubot-roulette hello
hubot-roulette> a

GoogleAppsScript編

次はスプレッドシートAPIを作ります。新規のスプレッドシートを作成しましょう。 ツール>スクリプトエディタ でエディタを起動します。まずやることはスタブサーバーと同じで、単純なレスポンスを返せるようにすることです。 doGet 関数を定義して単純なJSONが返せるようにしましょう。

// GETリクエストに対する処理
function doGet(e) {
  // API形式で出力できるように準備をする
  var output = ContentService.createTextOutput();
  // JSONで出力する
  output.setMimeType(ContentService.MimeType.JSON);
  // JSON 文字列に変換
  payload = JSON.stringify({"user": "a"});
  // ContentServiceインスタンスに出力するJSONをセットする
  output.setContent(payload);
  return output;
}

このあとAPIとして公開するようにします。 公開>ウェブアプリケーションとして導入 を選択して実行ユーザーを 全員(匿名ユーザーを含む) にします。URLを取得できるので curl にて確認します。リダイレクトに追従できるように -L を付けます。

$ curl -L https://script.google.com/macros/s/[APIのID]/exec
["a"]% 

続いてはスプレッドシートから値をとってみます。A1にbと入力して、この値を返すAPIを作ります。 getValue 関数を新たに作成して、その中でA1の値を取得します。

f:id:leokun0210:20181201211634p:plain
A1にbと入力してね

// GETリクエストに対する処理
function doGet(e) {
  // API形式で出力できるように準備をする
  var output = ContentService.createTextOutput();
  // JSONで出力する
  output.setMimeType(ContentService.MimeType.JSON);
  var value = getValue();
  // JSON 文字列に変換
  payload = JSON.stringify({"user": value});
  // ContentServiceインスタンスに出力するJSONをセットする
  output.setContent(payload);
  return output;
}

function getValue() {
  // スプレッドシートID
  var id = 'シートのIDを入れる';
  var ss = SpreadsheetApp.openById(id);
  // シート名
  var sheet = ss.getSheetByName("シート1");
  // セルの値を取得する
  // sheet.getRange({行番号},{列番号})でセルの範囲を指定して、.getValueで値を取得する
  // この場合はA1を取得する
  var value = sheet.getRange(1, 1).getValue();
  return value;
}
# A1セルに入れていたものが返ってきた
$ curl -L https://script.google.com/macros/s/[APIのID]/exec
{"user":"b"}% 

ここまでくればあと一息です。あとは書き込む方法さえ知ってしまえば、冒頭のルーレットを作る上で必要なことはだいたい網羅できます。 getValue 関数の中に以下のコードを追加します。そうすると実行時の時刻がB1のセルに書き込まれます。

  // 実行した時刻をB1に書き込む
  sheet.getRange(1, 2).setValue(new Date());

f:id:leokun0210:20181201213538p:plain

続いてルーレットを作っていきます。ルーレットは、A2にカンマ区切りで候補者の名前を入れます。これはSlackのメンションするときに使うので、Slackのアカウント名です。A3からA5までは、それぞれ1~3回前のルーレットで当選した人が記録されています。この人たちは、集中して当選しないようにルーレットの抽選候補者から除外します。文字数が多くなってしまうので、個々の解説はできませんが、今までやってことを全て合わせた集合がルーレットという機能です。

f:id:leokun0210:20181201214425p:plain

// GETリクエストに対する処理
function doGet(e) {
  // API形式で出力できるように準備をする
  var output = ContentService.createTextOutput();
  // JSONで出力する
  output.setMimeType(ContentService.MimeType.JSON);
  
  // スプレッドシートID
  var id = 'シートのIDを入れる';
  var ss = SpreadsheetApp.openById(id);
  // シート名
  var sheet = ss.getSheetByName("シート1");
  // ルーレットの候補になるセルの値を取得する
  var values = sheet.getRange(2, 1).getValues();
  var resArray = values.toString().split(",");
  // 過去3回まで選ばれたものは、再度選ばれないように候補から外す
  var exclude = [];
  
  for (i = 0; i < 3; i++) {
    var x = i + 2;
    if (sheet.getRange(2, x).getValue() != '') {
      exclude[i] = sheet.getRange(2, x).getValue();
    }
  }

  if (exclude.length < resArray.length) {
    exclude.forEach(function(element) {
      resArray = arrayDelete(resArray, element);
    });
  }
  
  var target = resArray[Math.floor(Math.random() * resArray.length)];
  sheet.getRange(2, 2).setValue(target);
  if (exclude[0] !== undefined) {
    sheet.getRange(2, 3).setValue(exclude[0]);
  }
  if (exclude[1] !== undefined) {
    sheet.getRange(2, 4).setValue(exclude[1]);
  }
  
  var res = {};
  res['user'] = target;
  Logger.log(res);
  Logger.log(target);
  payload = JSON.stringify(res);
  output.setContent(payload);
  return output;
}

// valueの要素と一致したものを削除する
function arrayDelete(array, value) {
    for(i = 0; i < array.length; i++){
    if(array[i] === value){
      //spliceメソッドで要素を削除
      array.splice(i, 1);
    }
  }
  return array;
}
# 予想した返しができている
$ curl -L https://script.google.com/macros/s/[APIのID]/exec
{"user":"山根"}% 

f:id:leokun0210:20181201215110p:plain
B2に今回の当選者が入っている

ここまでできたら、実際にHubotのスクリプトでこのAPIを実行してみましょう。スプレッドシートで作成したAPIのURLは、リダイレクトしてGoogleAppsScriptを実行します。なのでリダイレクトしても追従できるように follow-redirects というパッケージをインストールします。package.jsonに追加するので -g オプションは付けません。 scripts/roulette.coffeeスクリプトを書きます。

$ npm install follow-redirects
$ touch scripts/roulette.coffee

スプレッドシートAPIのURLは漏れないに越したことはないので、環境変数から取得できるようにします。 API_URL という名前にします。

http = require 'follow-redirects'
# スプレッドシートはhttpsなので注意する
http = http.https

# 環境変数を取得
url = process.env.API_URL

module.exports = (robot) ->
  robot.respond /ルーレット/i, (msg) ->
    http.get
      host: 'script.google.com'
      path: url
    , (res) ->
      if res.statusCode is 200
        body = ''
        res.setEncoding 'utf8'
        res.on 'data', (chunk) ->
          body += chunk
        res.on 'end', ->
          obj = JSON.parse(body)
          # APIからのレスポンスを@を先頭に付けてSlackへ返す
          # レスポンスの例 {"user":"山根"}
          msg.send '@' + obj.user.toString()
      else
        console.log "error: #{res.statusCode}"
$ HUBOT_SLACK_TOKEN="Slackで取得したAPIトークン" API_URL=/macros/s/[APIのID]/exec ./bin/hubot --adapter slack

これでSlackのrouletteに「ルーレット」と呟いてみます。するときちんと抽選結果が返ってきています。

f:id:leokun0210:20181201220547p:plain
やったー🎉

このHubotをチャンネルに招待するために、 /invite @roulette を実行します。そして @roulette ルーレット とメンションを飛ばすと先ほどと同じ結果が得られます。

f:id:leokun0210:20181201220844p:plain

実運用

PCを常時起動している人だったら、ずっとHubotプロセスを実行して入ればいいのですが、そうはいかないのでHubotをHerokuへデプロイします。デプロイする前に、Hubotの雛形を作ったときのpackage.jsonのnode.jsのバージョン指定が 0.10.x になっているので適当なものに修正します。

  "engines": {
    "node": "10.10.0"
  }

Herokuへデプロイするための準備も含めて行います。

$ heroku login
$ heroku create [your-bot-name]
# Hubotにはredisが必要
$ heroku addons:create redistogo:nano
$ heroku config:set HUBOT_SLACK_TOKEN=[your-slack-token] --app [your-bot-name]
$ heroku config:set API_URL=[your-api_url] --app [your-bot-name]
$ heroku git:remote -a [your-app-name]
$ git push heroku master

これでHerokuでHubotが動きます。

実際に運用してみての感想

まだ1回しか運用していませんが、誰が前回のファシレーテータかを思い出す必要がなく、ファシリテーター決めも30秒から1秒くらいになったので煩わしさが解消されたかなーと思っています。ここまで書くのに疲れたのでもう休みます。

参考記事

hubotスクリプトの書き方とサンプル集 | mitc

Google Spreadsheet を簡易 Webサーバーとして動かして、手軽にWebHookを受け取る方法 - Qiita

JSON.stringify() - JavaScript | MDN

GASでGoogleスプレッドシートのセルの値、行数や列数を取得したり、セルに値を入力したりする基本 (1/2):Excel VBAプログラマーのためのGoogle Apps Script入門(2) - @IT

herokuでhubot立ててみたらカンタンだった - Qiita

HubotをHerokuでSlackに繋げるまで - Qiita

配列からランダムに値をとりだす。 - Qiita

CoffeeScript Cookbook » Basic HTTP Client

JSON Server使いこなし - モックサーバーの起動とリソース処理 | CodeGrid

typicode/json-server: Get a full fake REST API with zero coding in less than 30 seconds (seriously)

CoffeeScriptを書いた

最終的に、以下の条件を満たしたHubotのルーレットBotを作成したい。

  • 呼びかけるとスプレッドシートか何かに記録されているいくつかのワードの中から一つを返す。
  • 過去3回まで返したワードを記録して、それらは返答候補のワードから外す。

Hubotで任意の応答をさせるにはCoffeeScriptが必要だった

昨日の続きで、Hubotに任意の返事をさせるにはCofeeScriptが必要だ。3年ぶりに書くので記法を全く覚えたいない。とりあえず"Hello,World"試して、基本的な書き方を確認した後、適当にサンプルコードを拾って試した。

CoffeeScriptの練習 - Qiita

次に任意のワードで呼びかけられた時に、返答するようにした

あるワードで呼びかけられた時に返答をするようにした。

module.exports = (robot) ->
    robot.respond /こんにちは/i, (msg) ->
          msg.send 'Hello'

Node.jsで作られたフレームワーク——HubotでTwitterのBotがお手軽に〈Node.jsシリーズ vol.8〉 - Tech Blog - Recruit Lifestyle Engineer

CoffeeScriptでGETリクエストを処理してみる

こんな感じでCoffeeScriptGoogleへGETしてみてそのステータスコードをコンソールに表示してみる。

http = require 'http'

http.get { host: 'www.google.com' }, (res) ->
    console.log res.statusCode

CoffeeScript Cookbook » Basic HTTP Client

今までのやったことを組み合わせて、特定のワードで呼びかけられた時に、GoogleへGETリクエストした時のステータスコードを返却してみるようにする。

http = require 'http'

module.exports = (robot) ->
  robot.respond /GET/i, (msg) ->
    array = [
    ]
    http.get {host: 'www.google.com'}, (res) ->
      code = res.statusCode
      console.log(code)
      msg.send code.toString()

f:id:leokun0210:20181123134545p:plain

高校の友人が結婚する

また高校時代の友人が結婚する。ここのところ結婚ラッシュだ。たまには参加しなきゃとは思いつつも予定が被るのであった。

プログラミング欲が少しだけ戻ってきた

今までプライベートでプログラミングできなかった反動か、少しだけプログラミング欲が戻ってきた。勉強しようという気持ちでやるのではなく、今の生活を便利に面白くしようというモチベーションでやっていきたいと思う。勉強しなくてはいけないの強迫観念に追われると精神的に疲れる。

自作キーボードに興味が出た

USの分割キーボードが欲しいけど、既製品だとビビッとくるのがなかったり、取り扱い終了でメルカリに張り付かなきゃいけないから、自作キーボードがいいのではという気がしてきた。Mint60というキーボードを見つけたけど、必要なっものを一式揃えたら3万円ぐらいかかってうーんという気持ちになっている。

Mint60のご紹介 - ゆかりメモ