Google Apps ScriptでSlack botを作った

1泊2日で山登りをしてきたので、それをネタにしたSlack botを作った。既にそのSlackチームには複数botが存在しており、ちょっとした事情もあってか、それらはAzure上で動いているものが多い。

個人的にAzureを使いたくなかったのと、AWSの無料枠を使うのももったいないし、GCPは大きすぎるし、Firebaseは無料プランだと外にリクエストを投げられない、といろいろ考えた結果Google Apps Scriptで作成した。

完成品はこちら。

github.com

# Google Apps Script (以下、GAS)

Googleが提供しているJavaScriptっぽい何かで書いたプログラムを実行できるサービス。Googleアカウントがあれば誰でもGoogleドライブ上で作成することができ、Googleの各種サービス(SpreadsheetやGmailなど)と連携もできるので、Excelのマクロのように扱うこともできる。また、手動だけでなく、時間や外部からのリクエストなどをトリガーにして実行もできる。

以前もこんなのを作ったことがあった。

inaab.hatenablog.com

# API概要

Outgoing/Incoming Webhooksを使うのが、Slack botを作る上で一番手っ取り早い。しかし、Outgoing Webhook では文頭のトリガーワードを指定することしかできず、文中に含まれる言葉に反応することができない。今回作成したbotも、文中に含まれる単語に応答したかったため、Events APIを使用した。

qiita.com

処理フローは

  1. リクエストを受け取る
  2. トリガー一覧が書かれたSpreadsheetから、トリガーにマッチするかチェックする
  3. マッチしたトリガーに対応するレスポンスをpostする

という単純なもので、変なことをしなければわりとさくっと実装できる。

# しんどかった部分

今回、Slackとの連携やトリガー検索のためにSpreadsheetと連携のために、トークンやIDを保持する必要があったが、何を思ったのかライブラリ化してしまった。実際にはPropertiesServiceという、プロジェクトのプロパティに環境変数のように追加できる機能があるのでそちらを使うべきだった。

GASでは他に作成したGASプロジェクトをライブラリとして導入できる。Underscore.jsのライブラリなんかもあったりする。公開範囲は自分で設定できるため、自分だけに公開にするとコードを完全に分離することができる。もともとGithubとかでバージョン管理しようと考えていたため、トークンやIDの部分を含まれないようにこの構成になった。

もちろんローカルで実行する際には、何かしらでモックする必要があり、単純にそれ用のコードをかいてrequireしても動かすことはできない。というのも、JavaScriptっぽい何かであって、ブラウザ/nodeのどちらとも異なっており、GASではトップレベルに書いた関数を実行する方式だからである。そういうわけで、ブラウザでも実行できず、nodeのrequireも使うこともできない。

browserifyと、それで生成したものを実行できるように変更してくれるgasifyを利用して、グローバル環境をglobalに入るようにしているため、別途tryRequireという関数を実装した。

module.exports = function tryRequire(modulePath, moduleName) {
  if (global[moduleName]) {
    return global[moduleName];
  } else {
    return require(modulePath);
  }
}

ライブラリを使用している箇所で、globalにこいつを先に読み込み、この関数でrequireする。

global.tryRequire = require('./try_require.js');
const Token = require('./token.js', 'Token');

この解消に一番時間がかかったし、しんどかった。

# 感想

Web系の開発は結構用意するものが多いせいでしんどいイメージがあったけれど、これくらいだったらある程度は楽に作れるように感じた。これが単純なbotだったから良かったものの、これより大きいものをやろうとするとさすがにしんどすぎるのでやらないと思う。

今度個人で何かフロントエンドを実装することになったら、Elmが楽しそうな感じがしてるのでそっちでなんとかやる。


ニューアルバムでたぞ

youtu.be

IT系の開発職インターンに必要と感じたこと

先日インターンの講師をしたので、そのときに感じたことを記した怪文書

本記事では業務を実際に行うものではなく、講義やハッカソンで行うものを主対象としている。

ターゲットの設定

メインターゲットととなる学生を明確に設定しなければいけない。これが出来ていない状態で行うと、内容と学生のレベル感が噛み合わず、お互いに損することになってしまう。

簡単に以下2つを考えてみる。

  • どのくらいの技術レベルなのか
  • 参加する学生は何を目的として参加するのか

技術レベル

技術レベルに関しては、「授業でC言語をやったことがあります」という学生と、「今こういうのを作っています」という学生だったら、おそらく後者のほうが技術を知っている可能性が高い。ここでどちらを選ぶかによって、当然インターンで実施する内容も変わってくる。前者であれば講義形式やハンズオンで一つのWebサービスを作るでもいいし、後者であればそれに加えてハッカソン形式でも問題ない。対象のレベルに合わせて選択肢が増えるだけである。

ここで注意したいのが、必ずしも後者のほうが良いわけではないということで、場合によっては前者のほうが良いこともある。

学生で興味を持って自分で何かを作る人は、最新の技術を使いたいとか技術レベルが高い企業で自分のレベルも上げていきたいと考える人が多い。そういった学生が興味を持ちづらい業界だったり、そもそもの企業知名度が低かったりすると、技術レベルが高い学生というのは集まりづらい。その状態でハッカソンをやったところで、結局ゴタゴタしたまま終わってしまうことが多く、学生からも自分には難しいかもと思わせてしまい、印象もあまり良くない。

講義やハンズオン形式であれば、あまり技術習得度の高くない学生でもある程度のものは完成するので、インターン参加後の印象も悪くない。また、企業側としても参加前の状態からどの程度理解して実践できるようになったかを見て、その学生の理解力や読解力などの基本的なスキルを見ることができる。

実際のところ、新卒に即戦力を求めてはいけないと思っているので、入社後の成長に寄与する読解力を見るのは間違いではないと個人的には考えている。

参加目的

技術習得度の話と少しかぶる部分もあるが、以下のようなことが考えられる。

  1. 就活を有利に進めるため
  2. 会社の雰囲気を知るため
  3. 実際の業務を体験するため
  4. 技術習得のため

それぞれは独立しているわけではなく、複数あるいは全ての場合すらある。

就活を有利に進めるため、会社の雰囲気を知るため

はじめの2つに関しては、就活を有利に進めるためなんてのはどうせどの学生も考えているだろうし、会社の雰囲気を知るために来るのはお互いにとって良い効果があるので、特記することはない。

実際の業務を体験するため

業務を体験することができるインターンはあるものの、昨今のコンプライアンスとか諸々を考えるとそこまで数は多くなく、そのインターンに参加する学生には既にある程度の実装をできることが求められるため狭き門となる。企業側にとっても、ターゲットが技術習得度の高い学生かつそのような学生にとって魅力度の高い企業でなければ実施自体が難しくなる。実施にあたって一時的に現場へ新人が配属されるのと同じ状況になる上、各学生に対して適切な課題を考える必要もある。

そのあたりの調整がうまくできれば、学生満足度も高く、企業側にとってもいい感じに採用に役立てられるんじゃないだろうか。

担当したのがこれ系のインターンじゃないのでわからない

技術習得のため

技術習得のために来る学生は、必ずしも技術レベルで述べた技術習得度の高い学生とは限らない。大学の授業でしかプログラミングをしたことがない学生が、業務で必要とされる技術を習得するための足がかりにすることだってあるだろうし、もともと個人で制作をしていた学生が、個人では触れる機会が少ないものを知るために来ることもあるだろう。

少しかぶる部分があるとしたのはこの部分で、学生がインターン参加を検討する段階で自分の目的と合致するかを考えるためである。このインターンは何を売りにしているのか、どのような技術を使うのかなど、学生の参加目的とのミスマッチを防ぐ必要がある。

企業側がこれを怠り、とりあえず優秀そうな学生に声をかけて参加させて実際の内容とのミスマッチが起きていたら、学生にとっては、お金が貰えたけどあまり良くなかった、あるいはただ時間を浪費しただけになってしまう。結局学生が入社することもなくただ社内のリソースを割いただけで終わる。

ターゲット設定と同様に、明確なインターンの「売り」を設定するべきである。

まとめ


これを聴いてた。

youtu.be

Barocco MD600を買った

研修でそれまで使用していたPCがあまりにアレだったので、配属後にどうなるかひやひやしてたのとは裏腹にiMacが支給された。そこまでスペックが良いとは言えないけれど、それまでのPCよりもはるかには良くなった。

一月ほどiMacに付属していたMagic KeyboardとMagic Trackpad 2を使ったけれど、どうにもキーストロークが浅すぎて指が痛くなってしまう。適当に調べて見た感じ、家のX1 Carbonのキーボードとはストロークが1mmほど違うらしいので、それと同じ感覚で入力していれば痛くなるのも当然といえば当然。

家にあるHHKB Lite2でもよかったのだけれど、前の席に座ってる上司の机の上にHHKB Professionalが使われずに放置されていて、その眼の前で使うのもどうかと思ってBaroccoを買った。

f:id:Inaab:20180917204645j:plain

日本語配列なんですねって聞かれたけど、変換/無変換キーで日本語入力のon/offを切り替えたいとか、日本語配列に慣れていてわざわざ英語配列を使う必要もないので、いつもどおり日本語配列を買った。

ちょうど割れる部分のキーについては、変な運指をしていないので問題なし。

キーボードだけで配列を変更でき、Windows専用のアプリケーションでしか変更できないとか、めちゃくちゃ面倒な設定ファイルを書く必要がないのはとても良い。一方で一度わからなくなったら、そのレイヤーのカスタマイズをすべて消さなければいけないので、めちゃくちゃカスタマイズする人には向かないと思う。

自分の場合、

  • 共通:CapsLockをCtrlに変更、Fnを左下の位置に移動
  • レイヤー1(Linux):共通変更のみ
  • レイヤー2(Mac):共通変更+OptionとWinキーの位置交換

だけ変更した。家で使う分には今の所問題がないので、たぶんこれ以上の変更は無いと思う。

初めてのメカニカルキーボードで軸をどうするか悩んで、いろいろとビックカメラで試し打ちをした。

さすがに青はうるさすぎるし、黒は重すぎて途中で疲れそうになったのでやめた。消去法的に赤か茶だけど、クリック感は別に求めていないし、正直なところあまり区別がつかなかったし、会社で使うことを考えると静かな方がよかったので静音赤軸にした。それでもMagic Keyboardよりもうるさいけれど、一応許容される範囲かと。

打鍵感もいいし、肩が丸まらないので結構満足。左右をつなぐケーブルが若干短いので、いい感じのノートパソコン台+マウス or ワイヤレストラックパッドがないとちょっと扱いづらい雰囲気があるので、そこは追々揃えていくということで。


youtu.be

昔に思いを馳せて

この記事を呼んで、ふと私が初めてパソコンに触れた頃のことを思い出した。

time-space.kddi.com

インターネット古参、老人会の人に言わせればまだまだ新参ではあるが、つらつらと思い出を書いていこうと思う。


初めて触れたのはおそらく小学3年生くらいの時期で、2002年か2003年のことであるから、今からかれこれ15年も前のことになる。当時実家にあったのはWindows 98が搭載されたノートPCであった。その当時ですらやや性能も悪く、ボンバーマンのオンラインゲームのページを開いただけでIEが応答なし、強制終了するしかなくなったことは、今でもはっきりと思い出される。

所属していたバスケ部の活動予定表が印刷されて配布されており、所属している誰かがボランティアで作成していたが、いつしか自分が作るようになっていた。Excelで作成されており、表計算以外に使うなと言う意味で今となっては怒られることかもしれない。

いつから始めたのかはわからないが、当時小学3,4年の私が作ったことで親は褒めてくれたし、他の保護者からも凄いねと言われるのが無性に嬉しかったことを覚えている。その経験があったからこそ、今の自分に繋がっているのは間違いがないだろう。


先に紹介した記事にもあるように、ちょうどインターネット常時接続が出始めた時期だった。実家ではケーブルテレビに加入しており、その恩恵を得られていたことも大きい。まだ従量制の家庭も多かったし、電話が来たら回線が切れる家庭もあったので、当時から比較的快適なインターネット生活を送れていた。

いわゆるFLASH黄金世代が終わりかかっていた時期なので、友人といろいろなものを見ては腹を抱えて笑う、あるいはドッキリ系でビビっていた。

私が親だとしたらあまり見せたくないな〜と思うコンテンツもあるが、今のインターネットよりはなんだかんだマシなのかもと思ってしまう。


ところで皆さんはッパえもん赤い部屋が公開されているYahoo! ジオシティーズをご存知だろうか。

当時無料でWebページを公開できる場所で、かつ過度な広告が無い場所として人気であった。今でこそ無料で広告が少ない(あるいは広告そのものがない)レンタルサーバは多いものの、尋常じゃない広告が表示されたり、開設には審査が必要だったり、大学生が勉強のために公開したサーバが一瞬で定員に達したりとそういう時代だった。

ジオシティーズはページ上部などにバナー広告がはいるだけで、レイアウトが崩れるようなことはなかったし、HTMLを知らなくてもそれっぽくページを作れるし、と自分もお世話になったことがある。

今でもサービスは継続しているが、果たして利用者はどれくらいいるのか疑問ではある。


時は少し飛んでガラケー全盛期。中学2年生になりケータイを手に入れた私は、当時の流行りであった前略プロフィールを作成していた。なんとなく色々入力するの恥ずかしかったので、あまりプロフィール自体は入力していなかったものの、「リアル」と呼ばれる日記投稿システム*1や友人のプロフィールへのリンク集、誰でも投稿できるゲストブックなどは作っていた。

curazy.com

前略プロフィールに関して、今でも鮮明に思い出されることが一つある。

私の中学校は少し「荒れていた」ので、いわゆる不良も多かった。野球部が集団で下校しているとき、校門から見えない位置に曲がった瞬間に全員がタバコを吸い出すのを目撃したこともあったし、先生に掴みかかっていく人間もいた。それでも同学年の生徒同士では表立って衝突はなかったので、極端な騒ぎにはならなかったが。

もちろん、男子だけでなく同じようなマインドの女子もたくさんいた。

「リアル」で鍵をかけて一部の人間の悪口を言う、ゲストブックに喧嘩腰で書き込む。まとまっていないだけである種の裏サイト化していた。ゲストブックに「調子に飲んなよブス」と書き込まれれば、「お前ネットでしか言えねーのかよ」と書き込み、「じゃあx時にxx(近所のスーパー)にこいや」となる。「なんでxx(近所のスーパー)にこねえんだよ」「は?お前がこなかったんだろうが」と傍目に見ればアホみたいな会話をインターネット上で繰り広げているわけである。

自分が同じことをやっていないからこそ笑い話にしているが、当の本人たちからしたら黒歴史にほかならないだろう。田舎の人々は結婚も子供ができるのも早いので、ほとんどが結婚して子供もいるのだろうけど、彼女たちのいい思い出になっているのだろうか。

私はべつのことで黒歴史のようなものがあるので、今でも思い返すと頭を抱えてしまう。


単純にいくつか書いてみたけれど、インターネットのリソース、たとえばWebサーバとかは簡単に利用できるようになっていい時代になったと思う。少しコマンドを叩けばGithub Pagesなんかでホスティングできるし、Jekyllのようなツールもたくさんあるし。

一方で、インターネットの利用方法で強く咎められる時代になってしまったとも思う。一般に普及して誰もが利用できるようになったことで、リテラシーがなくても使えるようになった。ネチケット()と笑われることもあるだろうが、今こそ必要な時代になってきていると感じる。小さな悪意を持って行動すれば、小さな悪意の群れが大きな悪意となって襲い掛かってくるし、そもそも小さな善意や正義感が集まって牙を向いてくることも往々にしてありえる。

なにはともあれ、もっと人に優しいインターネットになってほしい。


勢いに任せて書いていったら、長いだけで中身が無いエントリを書いてしまった……。

youtu.be

*1:今で言うとTwitterが利用感覚的に近い

良い雰囲気のなんかを作りたい

なんやかんやあってブログを書こうと思って、この土日やってたAndroid系の話を書こうか、それとも最近の業務ででたバリデーションについて書こうか、どうしようかと悩んでいた。 結局前者はまだ記事にするには区切りが良くないし、後者は実際に調べてコードを書いてとなったあたりでどうにも面倒になってしまった。

もう書かなくていいか〜と思って、先日レンタル落ちで購入したSteins;Gateを見てピンときたので、それについて書く。

www.amazon.co.jp


人の心に残るものを作りたい、と常々考えていた。それは例えば日頃利用するアプリケーションなどではなく、どちらかというと絵や音楽、ゲームなどの創作活動の分野。もちろん、何か圧倒的な体験を提供できるアプリなどであれば、人の心に残る、感動させることもできるだろうが、あくまで個人的な思いとしてである。

言ってしまえば、ただの憧れであり、ワナビーのようなもの。

そもそも幼少期から「我が家ではそういうのができる人間はいない」などと家族内で会話されていたこともあり、自分もそれに取り組もうという気持ちがあまりなかった。 一時やっていた時期もあったが、それを続けられるだけの気力がなく続かなかった。

そんな中で出会った、魔王物語物語 *1というゲーム。

playism.jp

RPGツクールという、悪く言えばよくあるツールで、フリー音源も使いつつ(もちろんフリーじゃないのもある)作られたこのゲームで、甚く感動した。ストーリー、システム、音楽、どれも良い。

超美麗なグラフィックもなく、至極壮大な音楽もなく、物語の魅せ方で人を感動させる。

自分もそんなものを作りたいと思った。


それからどうなったかというと、途中ゲームプログラムを書いていた時期もあったが、その夢には辿り着かなかった。

一朝一夕ではできないとわかっているが、自分だけではモチベーションが保てなかった。正確には自分だけではなかったものの、モチベーションを保つには至らなかった。

最近、創作活動をしている友人や同期をみて、さらにSteins:Gateをみて、久しぶりに色々と考えたけど、さーてどうすっかな。


とりあえずみんなADAM atを聴いてくれ。

youtu.be

やっていきに対するやっていき

5月の2週目も終わり、いよいよ新卒研修も佳境に入ってきた。

実際のところは5月では終わらず、この先しばらく研修は続くが、5月末(6月1日)が一旦の区切りとなるため、ここ最近の研修内容もだいぶ激しくなってきた。業務時間の作業のギリギリ感は凄いし、残業する同期も多々現れ始めた。

その中で自分は「絶対に残業しない」という鋼の意思を持って取り組んでいる。

なぜ残業をしないようにしているかは、「特別な理由がなければ残業をするやつは無能」という理論に基づいているのもあるし、自分のやっていき時間を確保するためでもある。3月から継続して自炊をしており、残業なしで7時半に帰宅してから家事、入浴などをしていると9時前になってしまう。とてもじゃないが残業なんてしてられない。

あまり大きな声で言いたくないが、今の会社にずっといるつもりはないし、密かな野望もある。その野望を叶えるためにもできるだけ時間は確保したい。

残業しないで時間を確保できたとして、実際に家で作業できているかとなると、それはそれでまた微妙な状態になっているのが現実。先に話したように業務時間内ではギリギリの戦いをしている。加えて朝は通勤ラッシュに揉まれないものの、片道45分ほどそれなりに混雑した電車に乗っている。したがって体力がないもやしは、家に帰ってきてから作業する気が起きない。

ここでタイトルの話になる。

家に帰って来てからやっていくためには何が必要か。もちろん体力である。体力をつけるには何をすればよいか。体を動かすしかないだろう。つまり、やっていきのためのやっていきは、体力をつけるための運動習慣であり、筋トレであり、質の良い睡眠なのである。

というわけで、明日からやっていく。

もしやってなかったら木の下に埋めてもらっても構わないよ!


記事を書きながら聴いてたやつ。

youtu.be

入社してからひと月過ごしてみて

4月に入社してから1ヶ月経ったので、なんか書きたくなった。とはいえ、書くこともなかったのでこんなタイトルになってしまった。書いている内容も脈絡がないのは許して。

最近はというと、会社でコードを書くわけでもなく、先日から作っていたアプリもとある事情により制作が途中で終了したため、コードを書く時間がめっきり減ってしまった。技術職で入社したものの、しばらくは技術職であってもビジネス研修が行われるため、書くことがなくなった。別のアプリ開発をしようと思っても、どうにもいいアイデアが浮かんでこない。

こんなアプリとか面白くない?というのがあったら教えてほしい。どうしても思いつかない&アイデア提供がないなら、今までプログラムに使っていた時間をサンスクリット語の勉強に充てようと思う。

それはそれとして、毎日決まった時間に通勤する、ひいては毎日規則正しい生活をすることは精神衛生にも良いと感じ始めている。院生のときから感じていたけれど、昼頃に起きるとそれだけで一日を無駄にしてしまったように感じる。それよりも毎日規則正しい生活をしていれば、そのようなある種の罪悪感を感じなくなるのが自分には大きかった。多少友人たちと活動時間が合わなくなったのが残念なところではあるが……。

そんなことを考えながら、毎日決まった時間に出勤して研修を受けていたら1ヶ月が経過し、月末に初任給が振り込まれてしまった。今まで比較的贅沢な生活をしていなかった人間が、20万以上の大金を手に入れてしまい、多少気が強くなってしまったのがこのGW前半。気が強くなって食べに行ったのが、15貫1800円のお寿司だったというのがそれもまた悲しい話でもある。それでも来月また食べに行きたい。

sushi-takahashi.com

あとは割としっかりした冷蔵庫、レンジ台やダイニングワゴンのようなものを買う予定があるけど、冷蔵庫はさすがに一括で買うと10万くらい吹き飛ぶので、金利0円キャンペーンを利用して分割で買う。残りはどちらも1万円弱で探しているので、そこまでお金は飛ばないかなあという感じ。

今ならお金があるので、各所からの良いやっていき情報をキャッチしてやっていきたい。


またまとまりのない記事を書いてしまった。

ついでに最近聴いているやつをせっかくだから宣伝しておく。

youtu.be