ESM アジャイル事業部 開発者ブログ

永和システムマネジメント アジャイル事業部の開発者ブログです。

Google Apps Script で esa.io の記事を更新する

こんばんは。 @hrysd です。

弊事業部には @takkanm が管理しているアカウントリストというスプレッドシートがあります。 これには、メンバーが各サービスで使用しているアカウント名等が集約されていて新しいメンバーが増えた時なんかに更新されています。

スプレッドシートどこにあるの問題

スプレッドシートの URL を覚えていないので、どこにあるのか全く見当がつかないという理由から、 日常的に使用している esa.io に貼り付てみました。

f:id:hrysd:20160729185145p:plain

これだとスプレッドシートの内容で検索する事が出来ないため、Google Apps Script を使用してスプレッドシートの中身と記事の更新を連動させたいと思います。

Google Apps Script を書く

スプレッドシートを開きツールバーツール > スクリプト エディタ を開く事で Web 上から編集を行う事も出来ますが、npm のモジュールを使用したい等の理由から手元のTerminalで作成していきます。

$ mkdir post_to_esa && cd post_to_esa
$ npm init -y
$ npm install -D browserify gasify
$ npm install -S markdown-table

実際に記述したコードが以下になります。 内容としてはスプレッドシートをマークダウン形式のテーブルに変換して、esa.io の記事を更新するというものです。(POST_ID と ACCESS_TOKEN をベタに書いているけど、うまい方法がわからなかった...)

var table = require('markdown-table');

var POST_ID = 12345;
var ACCESS_TOKEN = 'ACCESS_TOKEN';

global.myFunction = function() {
  var sheet  = SpreadsheetApp.getActive().getSheetByName('シート1');
  var rows   = sheet.getDataRange().getValues();

  var stringifiedPayload = JSON.stringify({
    post: {
      name:       'アカウントリスト',
      body_md:    table(rows),
      tags:       [],
      category:   '',
      wip:        false,
      message:    '情報量が増えました',
      updated_by: 'esa_bot'
    }
  })

  UrlFetchApp.fetch(
    'https://api.esa.io/v1/teams/esminc/posts/POST_ID?access_token=ACCESS_TOKEN',
    {
      method:      'PUT',
      contentType: 'application/json',
      payload:     stringifiedPayload
    }
  );
}

これをコンパイルし、中身をスクリプトエディタに貼り付けます。

$ $(npm bin)/browserify main.js -p gasify -o bundle.gs

スプレッドシート更新のタイミングでスクリプトが動くようにする

スクリプトエディタを開き、ツールバーリソース > 現在のプロジェクトのトリガー より設定していきます。 今回は、更新時にスクリプトが呼ばれるようにしたました。

f:id:hrysd:20160729185351p:plain

結果

スプレッドシートを更新する事で自動的に esa.io の記事も更新されるようなりました。(モザイク処理には Pixelmator を使用)

f:id:hrysd:20160729185313p:plain

最後に

Google Apps Script を使う事で簡単にサービス間での連携を行う事ができました。生成物をコピーアンドペーストしている箇所がいけてない感が強いので、スクリプトをローカルで管理できる soundTricker/gas-manager みたいなのも試してみたいです。

参考

36期開発環境変更点ふりかえり

takkanmです。 弊社では8月から新しい期となるため、これを機会にこの一年自分の開発環境で変更してみたものについて、これまでの変遷を含めふりかえりたいと思います。 (多分読まれているみなさんにとって弊社の期が変わるタイミングなんて関係ないと思いますが、4月ぐらいに書こうと思っていたネタを放置しすぎてここまできてしまったため、無理やりこじつけた次第です。お付き合いください。)

Editor(before: Vim, after: Atom)

まずはエディタです。

大学生の後半から2015年の7月ぐらい(およそ10年)までVimを使用しておりました。(なお、大学で購入したWindowsノートPCに何故かすでにXkeymacsとMedowが入っており、メーラとしてWanderLustを使わされるということがあったため、それまではEmacsを使用)

それをなんの契機があったのか急にAtomに変えてみました。多分、10年使ってみたしモダンなエディタを使ってみるかという軽い気持ちからだったと思います。

モードとテキストオブジェクトがあるVimからモードがないAtomへの変更は、最初はかなり戸惑いがありました。 まずは、ショートカットキーやVimでできてたあの操作はできるのかがよくわからなかったので、Idobataにある弊社AtomルームでAtomユーザにどうするの?というのを聞いたりし、ノウハウを貯めていきました。また、第一回社内Atomユーザ現状確認会をし、みんなが使っているプラグインや困っていることなどを共有していったところ、一日Atomで過ごしても仕事ができるようになっていきました。

操作性に関しては、今でもVimの方が速いのではということを思う時がたまにあります。これはテキストオブジェクトでパッと操作できたり、Uniteの存在がVimにはあるというのが影響しているかもしれません。実際、マージのコンフリクト解消や書き捨てのコードを書くときなどは、Vimでパッとやってしまうことが多いです。

また、余談になりますが最近技術評論社から出版された、Atom実践入門はこれからAtomを始めてみようという人や、Atomを使っているけど使いこなせていないと感じている人にオススメの本でした。細かいキーの操作からカスタマイズの方法まで網羅されているのが特徴です。何より良かったところは、各操作に対してどういうコマンド名かが書かれているため知らなかった操作を知った場合、その操作を特定の使いやすいショートカットキーに自分で割り当てるというのが簡単にできます。

Shell(before: Zsh, after: fish)

以前はZshを使っていました。しかし、数年前弊社がまだ上野にオフィスを構えている時にあったいつぞやのAsakusa.rbのミートアップで@lchinさんがfishの存在を教えてくれて、そこからずっとfishが気になる存在となりました。

そして昨年の11月にid:yoshioriの人がZshからFishにしたという記事を書いてくれたので、乗り換えてみることを決意しました。決意したといっても実際乗り換えれたのは今年に入ってからになってしまいました。

パッケージマネージャですが、oh-my-fishではなく、fishermanを使っています。実は、最初はoh-my-fishを使っていたのですが、Twitterでoh-my-fishを使っていることを言っていたら、fishermanの中の人からおすすめいただいたので、乗り換えることにしました。fishermanはoh-my-fishのプラグインを読み込むこともできるので、すごく設定が楽でした。

fish の特徴ですが、強力な補完だと思います。1文字打つだけで過去に入力したコマンドから一致するものを補完候補として表示してくれます。また、履歴の検索も何文字か入力して上キーを押すだけで簡単にたどれます。ただし、この履歴の補完は、zsh の history-incremental-pattern-search-backward に慣れている人にとっては戸惑いを感じるかもしれません。わたしも最初は慣れず、peco を入れて似たようなインクリメンタル補完を実現してそちらを多用していましたが、慣れてくるとこちらの方が速いかもという気分になってきました。

Keyboard(before: Happy Hacking Keyboard, after: Kinesis Contoured Keyboard)

わたしは大学の時代に使っていたHappy Hacking Keyboard Liteを含めて10年ほどHappy Hacking Keyboardを使用していました。 何故Happy Hacking Keyboardを選んだのかというと大学時代に購入した本にHappy Hacking Keyboard設計思想やキーボードに対するこだわりが書かれており、それに惚れ込んだためというのがあります。また、社会人になってからHappy Hacking Keyboard Professional2を購入して、その打鍵感の心地よさも気に入ってました。

しかし今年に入り、肘に謎の痛みを感じるようになり、なんとなくエルゴノミクスキーボードのKinesis Contoured Keyboardを使用することにしました。弊社にはこのキーボードを使用する人が昔は多く在籍しており、数年前に借りて試してみたことがありました。この時はすぐに挫折してしまいました。今回は、理由が承認されれば開発に必要となる周辺機器を自由に購入できる部署の制度を利用し、購入していただきました。

やはり、購入して使い出した直後は目に見えるぐらいキーが打てず大変でしたが、頑張って1週間程度使っていったところで慣れてきました。このキーボードを使い出して感じたのは、いかに今まで親指を遊ばせていたかということです。Kinesis Contoured Keyboardの親指部分には各6つのキーが用意され、親指をいろんなことに使えます。慣れるまでは、今までキーを打つ時に使っていなかった筋肉を使うので手が疲れましたが、慣れてくるとこのキーがないと不便に感じるぐらいになってきました。

なお、この記事を書いている最中に個人で購入したErgoDox EZが届いたため、そちらを使いこの章を書いています。ErgoDox EZですが、Kinesis Contoured Keyboardより腕を開いてキーを入力できるのが良いのですが、キーがフラットなためKinesis Contoured Keyboardのお椀型が懐かしくなってきます。しばらく、使い込んでみようと思います。

最後に

今年はいろいろドラスティックに開発環境を変更した一年でした。慣れ親しんだ環境から別の環境に移行するのは大変ですが、新しいことを知ったりすることができるので、面白さもあります。今後も定期的に見直して、より快適な環境を目指していこうと思っています。

余談 IME

10年近く使っていたSKKを捨てて、Macの標準IMEのライブ変換も使うようになっていました。

事業部メンバーおすすめエイリアス in 2016 夏

初めまして。アジャイル事業部新人の @junk0612 です。 今回はエイリアスの話をします。

長いターミナル生活、みなさん少しでもタイプ数を減らそうと日々努力なさっていることと思います。 タイプ数の削減に一番簡単に効果をあげられるのがエイリアスですよね。

そこで、事業部のメンバーがよく使うエイリアス、おすすめエイリアスをまとめてご紹介します。 もし気になるものがありましたら、ぜひ日々の生活にお役立てください。

おすすめエイリアス

アジャイル事業部では、ほとんどのプロジェクトで Ruby on Rails を使用している関係上、 bundler 系、git 系のエイリアスを設定している方は非常に多かったです。

alias be='bundle exec'
alias bi='bundle install'
alias bo='bundle open'
alias bu='bundle update'

ド鉄板 (というか、もはや設定していない人は希少であろう) エイリアスQwerty 配列でも Dvorak 配列でもそれほど打ちづらいわけでもないにもかかわらず設定されているあたりに、 「いつも使うコマンドに3文字なんて打ちたくない」というプログラマーの美徳が伺えます。

alias g='git'

.gitconfigにはcheckoutcommitgrepなど、 みなさん思い思いのサブコマンドエイリアスを設定していました (自分は以前使っていた Oh My Zsh の影響で、.gitconfigではなく.zshrcにサブコマンド込みのエイリアスを設定しています) 。

git 周りではありますが、ghqhub といったツールを組み合わせて利用している方も多く、こんなエイリアスを教えていただきました。

# from @takkanm
alias ho='hub browse'

# from @koic
alias ghqhub='hub browse $(ghq list | peco | cut -d "/" -f 2,3)'
alias ghqlist='cd $(ghq list -p | peco)'

# from @hibariya
# (fish only)
function repo
  ghq list -p | peco | read there
  cd $there
end

また、普段利用するエディタにオプションをつけたりコマンドを短くする目的でエイリアスを設定している方も多いです。

# from @takkanm
alias v='vim'

# from @koic
alias emacs='emacsclient -nw -a ""'

# from @hidenba
# (Mac OS X only)
alias emacs="/Applications/Emacs.app/Contents/MacOS/Emacs -nw"

そのほか、教えていただいたものをまるっとご紹介 (ここが一番使えるかも?) 。

# from @koic 「Mac OS X を使っていて使いづらいと思って変えた」
alias date='gdate'
alias tac='gtac'

# from @koic 「べんり」
alias less='less --no-init --quit-if-one-screen' # Thanks to http://qiita.com/hatchinee/items/586fb1c4915e2bb5c03b

# from @kunitoo 「linux(gnome) を使っていて Mac に寄せようとした」
alias open='gnome-open'

# from @emattsan 「こんなの設定してた」
# (Mac OS X only)
alias xcode='open -a /Applications/Xcode.app/Contents/MacOS/Xcode'

# from @hibariya 「Dvorak になってだいたい良くなったけど ls -l は打ちづらくなった」
# (fish only)
abbr -a ll='ls -lh'

# from @hibariya 「e \^accomplish みたいな感じでターミナルで英和/和英辞書をひきたい (辞書は英辞郎)」
# (fish only)
function e
  echo $argv | sed -e 's/[\^\$]//g' | read word
  grep --regexp=$argv ~/data/eijiro.utf8.txt | sed -e "s/$argv/\\x1b[36m\\x1b[1m$word\\x1b[0m/g" | eval $PAGER
end

# from @hibariya 「さいきんよく更新してる git 管理下のファイルを開きたい」
# (fish only)
function vimr
  git ls-files | xargs ls -At | peco | read that
  vim $that
end

# from @hibariya 「fish で Ctrl + r をやりたい」
# (fish only)
function peco_select_history
  if set -q $argv
    history | peco | read cmd
  else
    history | peco --query $argv | read cmd
  end

  commandline $cmd
end

# from @hidenba 「こんな感じで書かれていたわ」
# (zsh only)
alias -g G='| grep'

いかがでしたでしょうか。 皆さんも是非、お気に入りのエイリアスを探してみてください。 それでは!

Ruby 2.4.0-(dev|preview1) で Symbol not found: _rb_cFixnum が起きたときの対処

@koic です。 昨日、Ruby 2.4.0-preview1 がリリースされた時事ネタということで、Ruby 2.4.0 にまつわる TIL です。

Ruby 2.4.0 で Fixnum と Bignum が Integer に統合されます。この変更によりネイティブビルドを要した gem の実行時に Symbol not found: _rb_cFixnum あるいは Symbol not found: _rb_cBignum といったエラーが出た場合の対処です。

Ruby 2.4.0-dev or preview1 の環境にして前述のエラーが起きる gem を gem pristine などでネイティブビルドし直すことで解決します。

bundle exec rails c などで、これらのエラーが起きたときご活用ください。

Nginx のリクエスト制限を burst と nodelay で柔軟に設定する

Nginx では ngx_http_limit_req_module を使ってサーバが処理するリクエストの数を制限できます。例えば、同じ $request_filename へのリクエストを1秒に1回に制限する場合は次のようになります。

http {
  limit_req_zone $request_filename zone=foo:10m rate=1r/s;

  # (省略)

  server {
    # (省略)

    location / {
      # limit_req_zone で設定した上限 (1r/s) を超えたリクエストには503が返される
      limit_req zone=foo;
    }
  }
}

この設定では、1秒以内に2回以上のリクエストがあるとサーバは即座に503を返します。 しかし現実的には、一時的なリクエストの増加は許容したいことがあります。 そのためには burstnodelay を使います。

limit_req zone=foo burst=10 nodelay;

burst を指定すると、上限を超えたリクエストは burst に指定した数だけキューイングされ、リクエスト数が burst を超えたときだけ503が返されるようになります。 nodelay は処理を遅延させないためのオプションです。burst だけが指定された場合、キューイングされたリクエストの処理は rate の上限を超えないように遅延されます。一時的なリクエストの増加を許容したいときにこの遅延は不要ですので nodelay を指定します。

Rails のリポジトリにはレポート用の再現コードテンプレートがある

わたしが参加しているプロジェクトでは、今 Rails 5.0.0.rc1 で開発をしています。

先日コードを書いている時、気になる挙動があり、Issue をあげました。 Issue には再現させるためのコード片を記載していました。

この時、コメントで反応を頂いて知ったのですが、Rails には各コンポーネントごとにファイル単体で実行して確認するための再現コードのテンプレートが用意されているのですね。history を見ると 2013 年ごろからあるようですが、わたしは今回初めて気付きました。

中を読んでみると、bundler/inline が使われており、そのコードを Ruby で実行するだけで発生しているバージョンのライブラリがインストールされるようになっています。セットアップとテストを書けば、何をしているのか、何を期待しているのかがわかるようになっていました。

このテンプレートに沿って再現コードをあげれば、事象が発生している環境を揃えるのも実行も簡単だし、意図も伝わりやすくとても良いなぁと思いました。

Rails の気になる挙動に気づいたけど、英語が苦手でレポートを上げるのに躊躇しちゃうような人(例:わたし)には、とても便利なテンプレートだと思います。

絶対パス、相対パス、そしてキーワードによる移動

koic です。こんにちは。

@b4b4r07 さんによるプロダクトである enhancd のユーザー体験が素晴らしいということで、今日はターミナル生活中のディレクトリ移動についての話です。

今回取り上げる enhancd は執筆時点 (2016年5月20日) で、bash / zsh / fish に対応しているため、ツールとの相性次第で多くのターミナル生活者が恩恵を受けることができます。

絶対パス相対パスによる移動への不満点と、それらの解決となるキーワードでの移動といった流れで話を進めます。

絶対パスによる移動

どのパスにいても、絶対パスを入力すれば一発で移動ができる反面、ディレクトリが深い場合は入力が面倒です。

cd /path/to/dir

そして、だいたい目的のディレクトリは深いです。 Ctrl+r で履歴から移動すれば入力の手間は減りますが、cd コマンド以外も履歴の探索対象となる点がいま一歩です。

相対パスによる移動

いまいるパスからの相対分のみ入力すれば移動できるため相対位置が近ければ入力が少ない反面、相対位置が遠いと移動先のパスの入力を考えるのが面倒です。

cd ../to/dir

隣のディレクトリであれば、../path で済みますがそれ以上になると ../../path などと書くことになりツリー構造を頭に浮かべるのが思いのほか疲れます。 tab 補完で頑張ることはできますが、ディレクトリ内のすべてのディレクトリから何度も選択していくのが大変です。

そしてキーワードによるパス移動

「そこで enhancd ですよ!」とここで素敵なツールの紹介です。

もし、以前 /path/to/dir に移動したことがあれば以下のように 移動先のパスのキーワード を入力すれば どこのパスにいても瞬時に移動 できます。

cd dir # どこのディレクトリにいても /path/to/dir ディレクトリに移動できる。複数の候補がある場合は peco などでフィルタリング。

絶対パス移動への不満である長い入力への手間、相対パス移動への不満であるディレクトリツリーの脳内組み立てが解決されました。

一度移動したことのあるディレクトリへの移動に手間を掛けない。『達人プログラマー』にも Don't Repeat Yourself とありますね。

早く導入すると、それだけ早く人生の無駄時間が減る

キーワードでの移動は、絶対パス相対パスに背反するものではなく、むしろ絶対パス相対パスによる移動を背景にしています。

移動履歴のあるパスは ~/.enhancd ディレクトリ内のファイルに保存されてキーワードの探索対象になります。つまり、早く導入すればするほど補完できる機会が増えますので、使ったことのない読者の方は一度お試し頂くと良いと思います。

インストールもとても簡単。私自身、毎日のディレクトリ移動時間をかなり削減する実感を体感できたライフチェンジングなイチオシツールです。

作者による Qiita 記事やプロダクトの README.md がとても丁寧に記されているため、詳しくはそちらをご参照下さい。