トップ 最新 追記
RSS feed

ただのにっき


2018-03-16(金) [長年日記]

GASとSlackで繰り返し作業用のリマインダを作っている

こないだ作ったSlackボットに味をしめて、以前から欲しかったリマインダを作っている。とりあえず動くようになったレベルだけど、便利すぎて鼻血が出るわ*1。サーバレスアーキテクチャ万歳!

Slackがデフォルトで提供してるリマインダは、メッセージに選択肢が追加されてて「何時間延長するか」が選べるようになっている。これすごく便利なんだけど、選択肢がお仕着せで、目的の延長時間がない場合はまったく役に立たない(と思う。おれの知らない機能があるかも知れないが)。これを、内容に合わせて選択肢も指定できると再設定の手間がなくなっていいと思うんだよね。

たとえば(はい、ここからたとえがちょっとアレになりますよ)、モバマスのぷちレッスンは寝てる間に10時間、起きてる間に10時間と3時間のコースを組み合わせるといい感じになるんだけど、この「10時間」や「3時間」が延長の選択肢にあるといいわけよ。

で、こんな感じのを作ってる。指定した時間になったらSlackにこういうInteractive Messageを投げてくれて:

モバマス(ぷち) / Hou much time would you like to extend? / 10hours / 3hours

「10hours」を押したら10時間後にまた同じリマインダをくれる:

ok, notice you again after 10hours

スプレッドシートに行を足すだけで、別のリマインダを増やせる。もちろん選択肢も個別に設定できる*2。そうそう、ソシャゲだけじゃなくて、ポモドーロタイマーなんかにも使えるかもね(←取ってつけた感)。

コードは(Chrome拡張経由で)GitHubに置いてあるけど、まだドキュメントがないので使えないでしょう。というか、SlackAppのIncomingWebhook経由だとユーザ名やアイコンを指定しても無視されるんだけど、どうすればいいんだろう? postMessageメソッドを使うようにしないといかんのだろうか。このへんをなんとかしたい。見た目重要。(2018-03-20追記)ドキュメント書いた。あと、SlackAppの表示名やアイコンはアプリ自身(オーナー)が指定したものだけが使われるようだ。ユーザサイドでも表示名を変更できるようにはなっているけど、反映されないし、アイコンは設定すらできない。

Tags: gas

*1 今年は花粉症がひどくてわりと本当に鼻血が出る。

*2 たとえばいまやってるアイドルLIVEロワイヤルだと「100min」「80min」「60min」「40min」と4つの選択肢を設定してる。自然回復派にはかなり有用だと思う。


2018-03-13(火) [長年日記]

(自分で書いた)誤ったHTTPヘッダのせいで苦労した話

わさますのコミュニケーション基盤であるmassr、いまはHerokuで動かしているんだけど、長年の運用でMongoDBの容量も増えてきてコスト的にも厳しい感じになってきたので、VPSでも借りて引っ越そうという算段をしている。とりあえずGCE(Google Compute Engine)の無料枠でためそうかという流れに。

Dockerを使ってmassr本体とMongoDB、Memcachedはそれぞれ別のコンテナに入れ、reverse proxyとしてフロントに立てたnginxにhttpsをさばいてもらうという、(たぶん)昨今ではオーソドックスな構成。

で、普通に会話するくらいのところまでは問題なく動いたんだけど、フォームを経由しないLikeなんかの動作が403を返して失敗する。使い慣れないDocker上でいろいろ調べると、Rack::Csrfが403を返している。CSRFトークンが渡ってきてない。

ブラウザ上のjQuery*1はちゃんとHTTPヘッダにトークンを乗せている。でもmassrには渡ってきてない。てことは途中のnginxが怪しい?

調査過程はすっ飛ばして、結論から言えば犯人はこれである:

-   xhr.setRequestHeader('X_CSRF_TOKEN', token);
+   xhr.setRequestHeader('X-CSRF-TOKEN', token);

こんなHTTPヘッダ、nginxが取り次いでくれるわけがない。おそらくはる~~~か昔、jQueryでAjaxをやるにあたって参考にした(いまはもう見つけられない古い)サイトからのコピペが原因だ。まぁ、HTTPヘッダなのに「_」区切りになってる時点で気づくべきだったのだ。自分が悪い。

これがなんで今まで動いていたかというと、まず(これは想像だけど)Herokuはこの手のおかしなHTTPヘッダもアプリまでちゃんと運んでくれている。で、さらに、Rack::Csrfにこんなコードがある:

def self.rackified_header
  "HTTP_#{@@header.gsub('-', '_').upcase}"
end

このミドルウェアでは内部的に「_」を区切りに使うので、HTTPヘッダの区切りを強制的に「-」から「_」に変えているんだな。で、結果として誤ったヘッダはそのまま(変換されることなく)内部表現として扱われると。

よかれと思って書かれたコードの連鎖で本来の問題が隠れてしまうの、つらいですね……。

*1 設計が古いのでいまだにjQueryを使っている。React移植用のブランチは基本機能が動いたあたりでしばらく止まったままだ(白目)。


2018-03-11(日) [長年日記]

ミリシタイベント プラチナスターシアター「星屑のシンフォニア」(ミルキーウェイ)

32193pt 43003位

36,000ptまで行けそうになかったので最終日は軽く流しておいたら、ちょっと危ない感じのランクになってしまった。セーフだけど。終盤伸びたのかな。怖い怖い。

コミュで天空騎士団の精鋭部隊に笑ってしまった。グリマス終了まで約1週間になって、「おれたちのミリオン」がミリシタに復活しつつある感(笑)。あと、黒井社長が美希にアプローチすると、いまだにちょっと胸騒ぎがしてしまう自分の心理が面白い(SPなんてもう10年も前の記憶である)。

THE IDOLM@STER LIVE THE@TER HARMONY 09 アイドルマスター ミリオンライブ!
ミルキーウェイ
ランティス
¥2,064


トップ 最新 追記
RSS feed