Lazuli

らずり

Modern development with Google Apps Script

Google Apps Script(以下、gas)で今っぽいモダン環境で開発出来たから書いておく。

背景

以前、会社の業務時間を管理する Slack ボットを作った(ネタ元は宮本さん)。日報が Google Drive で管理されていることもあって gas で作られている。

作って運用してみたら社内で結構好評で徐々に利用者が増えていった。
そうなるとトラブルがあったときに対応出来るような作りにしておきたい。ただ、雑なパクリだったから謎構成になってしまったし、QUnit という一昔前のテスティングフレームワークを使っていたりで、何か手を入れるとしても触りたくない気持ちしかなかった。
gas のデメリットを解消しつつ良い感じに作り直せないかなーとやってみた。

モダンな JavaScript とは

以下の要件で書けるようにした。

  • ES2015 で書く
  • mocha でテストを回す
  • ESLint で構文チェックする
  • Yarn でパッケージ管理する
  • node-google-apps-script でデプロイ

ES2015 で書く

browserify でトランスパイル出来るようにした。とはいえ、gas は独自の JavaScript 仕様なため少し工夫をする必要がある。

export default が使えない

export default な構文を普通にトランスパイルしてもエラーで動かせない。
babel-plugin-transform-es3-member-expression-literalsbabel-plugin-transform-es3-property-literals というプラグインを追加する必要がある。
これがあればトランスパイルしてもエラーが出ずに実行出来る。

.babelrc

{
  "plugins": [
    "transform-es3-member-expression-literals",
    "transform-es3-property-literals"
  ]
}
gas のクラスが無い

当然ながらローカルに gas のクラスが無いから、トランスパイル時に参照出来なくてエラーになる。
これを解決するには gasify というプラグインが必要。便利。

便利関数が微妙に使えない

確認出来た限りだと find と引数展開は使用出来なかった(gas がエラーを吐く)。もしかしたら、これもプラグインで解決出来るのかもしらんが、調べる気にならなかった。
愚直に forEach を使ってやった。forEach は使えた。

mocha でテストを回す

テストで問題になるのも gas のクラス達。
ネットを彷徨うと様々な人がテストで困っている様子。
解決案は以下のようなものが見つかる。

  • テスト用の gas スクリプトを作って、gas 上で回す
  • Sinon.JS でモックする
  • gas-local というモックツールを使ってテストする
  • 自作モックを使う
テスト用の gas スクリプトを作って、gas 上で回す

CI サービスが使えないし諦め。

Sinon.JS でモックする

さすが簡単にモックは作れる。問題は、実在するクラスがないとモックを使用出来ないということだ。
UrlFetchApp をモックするには UrlFetchApp のクラスが用意されていないといけない。
モックを作って、テスト用のクラスも作ってとだるいので諦めた。

gas-local を使う

ES2015 では動かせなかった。諦め。
たぶん頑張れば使えるんだと思う。

自作モックを使う

gas-local のやり方見てたら自分でモック作ればいいじゃんねと気付いた。
やってみた。

// setup.js
import SpreadsheetApp from './mock/SpreadsheetApp';

global.SpreadsheetApp = SpreadsheetApp;
// SpreadSheetApp.js
import Spreadsheet from './Spreadsheet';

export default {
  openById() => (Spreadsheet),
};
// SpreadSheet.js
export default {
  // do something...
};

利用する gas の API を適当に定義すれば問題なくテストに使える。
少々めんどくさいが、うまく動くので良い。

ESLint で構文チェックする

Airbnb設定を利用した。
ちょっと厳しいところもあるので適当に緩めて。

ESLint を実行したときも勿論 gas のクラスは存在しないためエラーになる。
eslint-plugin-googleappsscriptプラグインとして読み込んでいれば良しなにしてくれる。

{
  "extends": "airbnb",
  "plugins": [
    "googleappsscript"
  ],
  "env": {
    "googleappsscript/googleappsscript": true
  },
  ....
}

ESLint は CI で回すのも便利だけど、git のフックを使うともっと良い。

# .git/hooks/pre-commit
#! /bin/sh
git diff --cached --name-only --diff-filter=AM | grep '\.js$' | xargs eslint

とやっておくだけで、コミット時に自動で ESLint が走って、エラーだとコミットが中断される。

Yarn でパッケージ管理する

npm と互換があるから使うのに何も困らなかった。

yarn add package_name
yarn add package_name --dev
yarn install

これだけ使えればだいたい事は足りる。
なにより yarn.lock でバージョンを固定出来るのが良い。npm shrinkwrap は嫌な思い出しかない。

node-google-apps-script でデプロイ

node-google-apps-scriptGoogle 製のデプロイツール(といっても API を使ってアップロードするだけだが)。

gapps upload

とやるだけでアップロードしてくれる。
設定は API キー作って認証情報登録してアップロード先を指定するだけ。詳しくは README とか見て。
アプリケーションの公開までやってくれると最高なんだが、そこは手動でやらねばならん。微妙に使いづらい。
それでも自分でアップロードするのと比べると断然ラクなんだけど。

最近読んだ本

読み中も含む。

暗号解読〈上〉 (新潮文庫)

暗号解読〈上〉 (新潮文庫)

サイモン・シンの本は面白いものが多い。これは暗号技術がどう発展していったか、古代ギリシャの初歩的な暗号からエニグマまでの歴史を逸話混じりに書かれている。ぐんぐん読めた。
下巻もあるそうだがまだ読んでいない。


ヒエログリフを書こう!

ヒエログリフを書こう!

暗号解読に感化されて、古代文字読み書き出来たら楽しそうという判断で買った。挿絵がかわいい。
かなり噛み砕いて書かれているから分かりやすいけど、分かりにくい。
古代文字とはそういうものだろう。


面白くて眠れなくなる元素

面白くて眠れなくなる元素

残念ながらそれほどだった。まあ眠くなる話だった。他の眠れなくなるシリーズも気になってるけどどうなんだろう?
化学話は俺には向いてないかもしれない。


インターネットルーティング入門 第3版 (ネットワーキング入門)

インターネットルーティング入門 第3版 (ネットワーキング入門)

読み中。雑な知識でインターネットしてるからちゃんと知ろうということで買った。
硬派な内容で、雰囲気で理解してた俺には難しいところもあるが、読めないことはない。


高速スケーラブル検索エンジン ElasticSearch Server (アスキー書籍)

高速スケーラブル検索エンジン ElasticSearch Server (アスキー書籍)

Elasticsearch を使う機会があったから買った。
本の内容は現行バージョンよりだいぶ古いけど基本的な API の使い方は変わらないので支障はなかった。参考になった。
これ読んだ後に本家ドキュメント読むと理解が違う。

という本を読んだ。
入浴施設の設計思想とか載ってるかなーと思ったけど期待した内容はほぼなかった。
ヨーロッパの入浴の歴史や、平安時代から続く温泉の歴史あたりは面白かった。

資料本ということで中盤以降はずっと様々な入浴施設の写真と設計図が紹介されている。
90年出版だったかな、27年前だしいくらかの施設は既になくなっているかもしれないが、残っている所もあるだろうし良さげな所へは行ってみたい。

本状況

10年戦えるデータ分析入門は読み終わった。分かりやすかったし面白かった。

くだんの本の最後で、統計学の初学として「マンガでわかる統計学」が良いぞと書いてあったから今はそれ買って読んでる。漫画か〜となりがちだけど文章より漫画のほうがサクサク読めるのは確かだし、先入観を持たずに読んでみようという感じで買った。
確かにちゃんと統計学の基礎を始めるという内容で出だしは良い。

あと、平民新聞で軽く紹介されてた「流星ひとつ」というのも買った。

「流星ひとつ」一杯目の火酒まで読んだ。引退して収入もなくなったら大変でしょ?と聞かれた藤圭子は軽く「別に」と答える。沢木「そうかな」藤「そうだよ。だって……確かに、いままで、贅沢はしてきたよ。だけど、それはそれ、そういうこともありました、そういう時代もありました、ていうだけのことだよ。やっぱり、あたしは、家でご飯と漬け物を食べるのがいちばん好きだし、親子丼とかカツ丼とか、御飯の上に何かがのっかっている簡単なものが好物だし、服だって、セーターとシャツとズボンがあれば、それでいいし……自信があるんだ、あたし」最後の、自信があるんだってところがいいな。この章のハイライトは、注文した酒がようやく届いて、「初めまして!」と乾杯しようとする藤圭子に対して沢木が「実は、あなたに会ったのは初めてじゃないんですよ」と打ち明ける場面だろう。ここからインタビュアーとインタビュイーが入れ替わるように、藤は沢木の語りに惹き込まれていく。全然おぼえてない、どこで?と不思議がる藤圭子に対し、「当然だけどね、わからなくて」と答える沢木は、五年前に、(後に深夜特急としてまとめられる事になる旅の最終地点)パリで出会った一人の少女の話をする。

こんな紹介。面白そうで買った。

それと、寿司を作ってみたくて寿司大全なるものも買った。はてブで話題になってたやつ。結構分厚い。
ひと通り読んでみて軽い気持ちで握れそうだったらやってみる。

そういえば本の消化活動してるしと amakan に登録してみたけど、流星や大全あたり載っていなくて残念だった。


マンガでわかる統計学

マンガでわかる統計学

流星ひとつ

流星ひとつ

すしの技術大全

すしの技術大全

wish list にとにかく突っ込んでいた本が溜まってきたから消化活動することにした。
最近は「杏のふむふむ」って本を読んだ。なんてことないエッセイで、どっかで連載してたのを本にまとめたという背景らしい。本屋で立ち読みしたときに文章がうまくて惹かれたから突っ込んだとかそんなような理由だった気がする。
杏という方には特に思い入れもなく、エッセイだから個人の話で何も俺の役には立たないけど日常が淡々と書かれた読み物は面白い。やっぱり文章が上手くてユーモアもあって読みやすかった。サクッと読み終わった。

いまは「10年戦えるデータ分析入門」を読んでる。まだ序盤で分析らしいことは何もしてない。


杏のふむふむ (ちくま文庫)

杏のふむふむ (ちくま文庫)

10年戦えるデータ分析入門 SQLを武器にデータ活用時代を生き抜く (Informatics &IDEA)

10年戦えるデータ分析入門 SQLを武器にデータ活用時代を生き抜く (Informatics &IDEA)

ロジカルシンキングを読んだ

ロジカル・シンキング―論理的な思考と構成のスキル (Best solution)

ロジカル・シンキング―論理的な思考と構成のスキル (Best solution)

どうしたら論理的な思考になるか、注意すべき点や手法が書かれてた。
プレゼン頑張るような職業の人はこういうことをやっているんだなー。
面白かった。

初めて Kindle for Mac 使って読んだけどハイライトも検索もしやすいし良かった。
こういった類の本はタブレットよりこっちのほうが良さそう。

積極的に可愛い LGTM をしていく

背景

いまの会社では pullreq してコードレビューしあう開発体制になっている。コードレビューして問題なければ LGTM とかやる。
ところが最近、可愛い LGTM 画像が貼られるとコードレビューが通った時の嬉しさ(主に俺の)だとかやる気具合(主に俺の)に良い影響を与えることが分かってきた。
ということは、積極的に可愛い LGTM が出来る環境を整えてやれば仕事の効率が飛躍的に伸びるかもしれない(主に俺の)。

f:id:app2641:20151104224101p:plain

LKTM

LGTM 用の画像というと LGTM.in ってサイトが有名なんだけど治安が悪くなってて全然使えないから自分用の LGTM 画像置き場を作ることにした。

LKTM

Looks Kawaii To Me の略。俺の造語。
ここに良い感じの画像を溜めて LGTM していく作戦。

画像に LGTM の文字を突っ込むのは ImageMagick 使ってやれば簡単に出来るので適当にプログラム書いて TumblrAPI でアップロードするようにしてやればいい。

github.com

説明なんも書いてないけど API のトークンを config/application.yml に書いてやって

$ bin/lktm.rb "path_to_image"

とかやると LGTM された画像が Tumblr にアップロードされる。

LTTM

GitHub で LGTM 画像を挿入するには LTTM という Chrome 拡張がめっちゃ便利。
寿司ゆきとか tiqav 画像を簡単に貼り付けられる。

chrome.google.com

ありがたいことに LTTM はソースコードGitHub で公開されているのでこれを fork して LKTM の画像が拾えるようにした。

github.com

ソースをビルドしてデベロッパーモードで Chrome に読み込ませる。
GitHub のテキストエリアで !k と打つと LKTM 画像がプレビューされて挿入出来るようになっている。
これで晴れて最高の LGTM をすることが可能になった。仕事の質もぐんぐん上がるはず。
動作は以下のようになっている。最高。

f:id:app2641:20151104225448g:plain

めんどくさい問題

問題があって、HTTPSGitHub から HTTP の Tumblr へは Chrome のセキュリティ上、通常はアクセス出来ない。
別途ツールバーのところに出る盾アイコンをクリックして Tumblr にアクセス出来るようにしてあげなければならない。

f:id:app2641:20151104233144p:plain

これが毎度やらなければならなくて、めんどくさい。
Chrome 拡張側で回避出来る方法があったら誰か教えておくれ。