しるてく

技術的な話をします

easymockからstubcellへ移行してみた


「チーム開発に役立つstubcell」ってタイトルでCodeGrid 2周年パーティでLTしてきた。 - from scratch

今までAPIのモック作るのにCyberAgent/node-easymock · GitHubを使っていたんだけど、最近メンテされていないっぽいし、

easymock is so simple, but it depends on sqlite3, and could not write comment in JSON file and could not validate json.

ってやつに感動してstubcellに移行した。

移行手順

installしてentry.yaml書いて終わり。簡単!

$ npm install --save-dev grunt-stubcell
$ vi Gruntfile.coffee # edit gruntfile
$ mv easymock mock # easymockって名前でディレクトリ作ってたので変えとく
$ cd mock
$ touch entry.yaml
# easymockのコメントをアレする
$ find . -type f -name '*.json' | xargs perl -i -pe 's{^(<|>)}{//}'
# entry.yamlをカキカキ
$ find . -type f -name '*.json' | perl -i -ne 'if ( /^.(.*)_(.*).json$/ ) { my ($url, $method) = ($1, uc($2)); print << "EOM"
-
  request:
    url: $url
    method: $method
  response:
    status: 200
    file: $_
EOM
}' > entry.yaml
# あとは手作業で:id周りを変換しまくる

雑感

良かった

  • README読むだけでさくっと動いた。楽ちん
  • 適当ワンライナーで簡単に移植できた
  • queryでJSON出し分けできるのステキ
    • looseCompare: true

気になる

  • entry.yamlいちいち書くのだるそう。easymockで不要だっただけに気になる
  • READMEだけじゃrecordがなにか良くわからんかったのであとで読む
    • 勝手にjson作られるやつがそう?timestampみたいなレスポンスに無関係のクエリがファイル名に入った状態で生成されるので悩ましかった
  • 流れるログだけだと、結局どのファイルの中身を返したのか分からないのでルーティングの確認が面倒?
    • devtool見ろや、でもいいけど
  • ドキュメント自動生成とかはなさそう?
    • 直接ファイルみても良いけど、仕様として使うなら一覧できると嬉しそう
  • 変数とか使って楽ちんにリクエストによってレスポンス変えたい、とかは無理そう

jsxをちょこっと触ったので今の感想書いとく

最近Photoshopで画像をバババッってしたくてJSX入門した。

  • 基本的にjavascriptだけど、変数宣言とif/else, forだけ使えれば十分っぽい
  • Adobe ExtendScript Toolkit ってやつ使うとデバッグが楽
    • ただ、エディタとして貧弱
    • ESTKでファイルを開きつつ好きなエディタで書いて保存すると、ESTK側で勝手に「変更加わってるけど最新にする?」って聞いてくるので、YES押して再生ボタンをポチるのが楽っぽい
  • とりあえずこれさえあれば、大体のことは分かる
  • 書き出し系のスクリプトの場合、いろいろ弄くるのでとりあえずdoc.duplicate()して一時ドキュメントであれこれしてtmp_doc.close(SaveOptions.DONOTSAVECHANGES);するのがお手軽で良い
  • レイヤーをいじくるときは、underscore.jsが使えると大分幸せっぽいけど依存増やすの面倒だなあっていうのが悩みどころ
  • layers.getByName('hoge')ってやつ、hogeって名前のレイヤが無いとエラー吐いて落ちるので、あるかないか分からないやつ取ってくるときは、独自でループ回すのが面倒


慣れてくれば、いろんな作業を書き捨てでサクッと書けて便利そうだなあ、という印象でした。

一括置換するやつ

初学者に毎回案内するの面倒なので、ぺろっとブログ貼るだけで解決したいの巻。
質問とか問題があれば随時更新して最終的にはURL貼るだけで解決したい。

ファイル内の文言の一括置換

find . -type f -name '*' | xargs perl -i -pe 's/before/after/g'

ファイル名の一括置換

rename 's/before/after/' **/*

zshで{a..z}みたいなことがしたい

bashだと{0..9}とか{a..z}とか出来るんだけど、zshだと{a..z}ができない。
setopt bracecclしてやるとできるようになる。

~$ echo {a..z}
{a..z}
~$ echo {a-z}
{a-z}
~$ setopt braceccl
~$ echo {a-z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

ui.routerとdecorator

書いてみたけど使うか分からないのでメモるだけメモっとく。

ui-viewのautoscrollのスクロール位置を固定する

https://github.com/angular-ui/ui-router/wiki/Quick-Reference#autoscroll

ui.routerではui-viewが切り替わった時にautoscrollって属性をつけてあげないとスクロールしてくれない。
$uiViewScrollでは、viewの要素と関係ない位置にスクロールできないので、decoratorでごにょごにょしてやる。
具体例として、ヘッダーをfixedで表示しているとautoscrollを指定したときにそのui-viewの上部にスクロールしてしまうので上のほうがヘッダーに隠れてしまうので、強制的に一番上までスクロールさせたい。

app.config ['$provide', ($provide) ->
  $provide.decorator '$uiViewScroll', () ->
    (uiViewElement) ->window.scrollTo(0, 0)
]

$state.goのreloadを常にtrueにしてやる

同じstateに移動できないのやだなーみたいなとき。

app.config ['$provide', ($provide) ->
  $provide.decorator '$state', ($delegate) ->
    state = $delegate
    state.superGo = state.go
    state.go = (to, params, options) ->
      options = options || {}
      if angular.isUndefined options.reload
        options.reload = true
      this.superGo(to, params, options)

    return $delegate
]

javascriptのreplaceでまとめて置換する

たとえば、

/path/to/:category/:typeみたいなのがあったときに{ category: 'hoge', type: 'fuga' }をわたしてあげると/path/to/hoge/fugaにして欲しいなってとき。

replaceの引数にfuctionが使えるので、

  var path = '/path/to/:category/:type'
  var params = {
    category: 'hoge',
    type: 'fuga'
  }
  path = path.replace(/\:([^\/]*)/g, function(all, group) { return params[group]; });

みたいなことができる。


backboneを使っていてのっぴきならない理由で/path/to?category=hoge&type=fugaのようにparamsを使えない時に/path/to/hoge/fugaさせるために使った。

    fetch: function(options) {
      options = options ? _.clone(options) : {};
      var data = options.data;
      delete options.data;

      this.url = this.url_tmpl;
      if (data) {
        this.url = this.url.replace(/\:([^\/]*)/g, function(all, group) { return data[group]; });
      }
      return Backbone.Collection.prototype.fetch.call(this, options);
    },

AngularJSでhover

スマホサイト作っていると、擬似クラスの:hoverが使い物にならなかったりして、何らかの対応*1が必要だったりするんだけど、angularでどうしようかなと思ってng-mouseenterとか使おうかdirective書こうかみたいなこと悩んでいたら、ng-clickの仕組みでタップ時にng-click-activeっていうクラスがつくの発見してアンギュラーは偉大だって思った。という感動を記録に残しておく。