元税理士受験生、プログラミングをする

1990年生まれド文系プログラマーの軌跡

ガンダムNTを観に行った

ガンダムNTを観に行った

結構よかった。作品に対して考察とか書くタイプではないので、よかった点とイマイチな点を列挙。

よかった点

  • 戦闘シーンに歌が流れるのがいい、サンダーボルトみたいな演出で好き。
  • ジェスタがかっこよかった。主役機もそうだけど、脇を固める量産機のデザインも観てしまう。
  • UCからのゲストが素直に嬉しかった。誰かとは言わないけど、観れば分かる。
  • フェネックスのデザインが好き。

イマイチな点

  • 同じ回想シーンを2、3回見せられる。ストーリーとしては、伏線を張って回収するタイプの作品なので仕方とはいえ尺の短い劇場版でやられるとちょっとくどい。
  • 主人公が印象に残りづらい。ユニークな発言が少なくて、あんまり印象に残らなかった。良くも悪くも印象に残るのって大切だと思った。ライバルキャラの方が印象に残った人もいるかも。
  • 頻繁に時系列が前後するシーンが入るから、頭の整理が追いつかないこともある。

Amazonで配信されるようになったらもう一度見直してみたい。多分2回目だと結構理解できるようになっているはず。

PayPayで家族のPCを買った。

井ノ頭通りビックカメラに行って、家族のPC購入に連れ添った。基本ネットサーフィンしかしないので、Surface Proを進めたのだが、なぜか一体型デスクトップにこだわったため、そちらを購入した。正直場所もとるし、気軽にリビング以外から移動できないのでやめた方がいい、タブレットPCだと外部ディスプレイに繋げば画面の大きさは解消できると念を押したのだが結局却下に。こういうのって「自分で選んだ」という感覚を得ることが大切なのか。ともあれPayPayで支払って、キャッシュバックを受けた。普段はあんまり人が多くないビックカメラらしいが、結構混雑していた。

メルカリ 希代のスタートアップ、野心と焦りと挑戦の5年間 を読んだ

感想、要約、メモ書き

  • マイクロサービス化したら、国際間の文化の違いによりプロダクトを作り直す場合も、活用できることが多い。
  • メルカリを売り買いするアプリではなく、売るアプリとして売り出したのは、自分がメルカリを始める理由になっているから共感できる。
  • メルカリは主軸に置きたいのはアメリカだということを知らなかった。
  • アプリはダウンロード数が増えても継続して使用しないユーザーだと意味がない。

zshrcとgitconfigを家用と会社用に分けた

家と会社のPCの環境の差異によって、zshrcがエラーを吐くようになったので、分割した。

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

先日、電気通信大学 先端工学基礎課程 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)

ファンタスティックビーストを観に行った

ようやくルーレットを作った

何かで使えそうだなと思いslackで動くルーレットを作った。過去何回かの結果を参照して、集中して当たることを避けるようにした。GoogleAppScriptをほとんど触ったことがないので、ちょっと苦労した。特にJSONの吐き出し方とか。

f:id:leokun0210:20181125231832g:plain

趣味でAWSを学習し始めた。

UdemyでブラックフライデーセールをしていたからAWS入門講座を買ってみた。目標は特にないのでだらだらやっていきたい。

ファンタスティックビースト2を観に行った。

1作目の話をかなり忘れていて、登場人物の関係がよくわからなかった。作風は覚えていて、結構明るい雰囲気だと思ったが、今作は8割ぐらいは暗い雰囲気だった。ダークファンタジーは好きなので個人的にはクライマックスのシーンは好き。ただ8:30からの回でかなり眠い上に、上映時間が2時間超えてたと思うので、中盤が全く頭に入ってこなかった。あと登場人物が多いように感じて名前を覚えるのが厳しかった。ネット配信が始まったら、もう1回見るつもり。

母親へロボット掃除機を買った

誕生日プレゼントにLOZAYI製のロボット掃除機を買った。要はルンバの安い奴だ。とても怪しい中国訛りの日本語で喋るので不安を覚えたが機能としては問題なく、母親への掃除の負担が減っている気がする。

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のご紹介 - ゆかりメモ