なんか書いていこうぜー .com

Let's write something good

weekly-4th

2016-01-31
  • Share on Facebook
  • Tweet
  • Add to Pocket

2016年第4週目

さて、突然ながらあまりに何も書かないので、rebuild.fm#127 Aftershow でやってた週報的なものを続く限り書いてみようかと思った次第。

先週は風邪ひいて体調悪かったので、なんもしてない。

Ruby

各種気になる repositories の git history が見れるように環境を少し整えた。

いろいろ試した結果、vim の fugitive + gitv で git log しながら詳細を水平分割でみていくかたちが一番見やすかった。

JavaScript

protractor で悩んでいた、confirm の OK ボタンを押すのを諦めて、次の作業に移った。 画面遷移を伴う動作のため、react-router を設定し直してみたが、以前発生していたエラーがでなくなっている気がする。。。 気のせいかもしれないが、このまま進めよう。ここからが難しい処理になってくるはず。

読書

入門コンピュータ科学を第一章読み終えた。

英語

English Journal 2016年 2月号の最初のインタビューを聴き流し + トランスクリプトを読むのをちまちまと。 最初のインタビュー、新しく出てきた単語がまだ頭に入ってきてないが、音は以前より聴き取れるようになった気がする。

Electronアプリ開発に protractor 入れた話

2016-01-06
  • Share on Facebook
  • Tweet
  • Add to Pocket

趣味で Electron アプリを少しずつ作成しているのであるが、JavaScript のテストをまともに書ききったことがないため、導入してみようと思い、E2E のツールとしてprotractor を導入したので、メモ。

protractor とは

AngularJS の end to end testing tool として生まれているが、AngularJS を使っていなくても導入できる。 AngularJS を使っている場合は、{hoge} みたいな画面に bind している値を取得できて便利らしい。

導入すると一緒にインストールされる webdriver-manager を使ってブラウザを動作させてテストを実行する。

導入

https://angular.github.io/protractor/#/tutorial を見ながら導入する。

$ npm i --save-dev protractor
$ ./node_modules/.bin/webdriver-manager update

project の直下に conf.js を作成し、ここにend to end test の設定を書き、 protractor conf.js してテストを流す。

$ protractor conf.js

conf.js にいろいろと設定を書いておき、この設定にそってテストが実行される。設定の書き方は Configuration File Reference を見ながら書く。

{% gist a58824ebbfadee1c788b #file-conf-js %}

L2-7 は、power-assert を使うために、babel-plugin-espower を噛ませる設定。

L10 の chromedriver は、protractor を導入した際に一緒にインストールされたものを指定する。 L11 は、./node_modules/.bin/webdriver-manager start した際にコンソールに出力されるアドレスを記載する。

L14-16 に実行する end to end test のパターンを記載する。流しやすいように e2e というディレクトリを作成してそこにテストを配置した。 L17-24 で、Electron 用の設定を記載している。browserName には chrome を、chromeOptionsbinary には electron-prebuilt のバイナリのパスを指定している。

ここがあまり調べても載ってなかったのだが、argsapp= として、Electron の entry point になっているjs を指定する必要がある。 これがないと、blank のElectron のページが立ち上がって終わる…

L26 の browser.ignoreSynchronization = true; は非AngularJS なアプリで protractor を利用する際に必要とのこと。参照: stackoverflow

{% gist 99c2337c1d611b322356 #file-showhome-e2e-js %}

browser.get(url) みたいなもので希望するページを指定できたりするが、Electron の場合、起動時に開いているページについて特に指定しなくてもOKっぽい。トップページの class=“title” に “こんにちは” とあればテストが通る。

大事なこと

Electron アプリの場合、argsapp=entry point の js が必要です。

※ GitHub のソース検索すると、http://localhost:8000 と書いてあるソースが多いが、それでは動かなかった…ここに到達するのに時間かかった。using-selenium-and-webdriver.md3. Connect to chrome driver のコメント見て気がついた…

arch の kernel を update したとき

2015-08-04
  • Share on Facebook
  • Tweet
  • Add to Pocket

MBA を Arch Linux 機にしているのであるが、kernel が update するたびに、wifi が動作しなくなってしまう。

仮に今は、yaourt broadcom-wl-dkmsyaourt mba6x_bl-dkms を再インストールして回避してる。 実際はもっとよい(というか正しい)対処法があるのだろうけど、これをやると module をビルドして depmod コマンドを内部で発行してくれているみたいなので、動作するようになってる。

ここらへんは何読んだらわかるようになるんだろう…?

active_decorator の spec でハマった話

2015-07-30
  • Share on Facebook
  • Tweet
  • Add to Pocket

今日、app/modelsに配置されているただの class で表示用のメソッドがごにょごにょ生えているのを ActiveDecorator に移動させてはどうかと指摘をいただいたので、移動させた。 spec が 1 件だけあったので、これも Decorator のテストに書き換えようとして、ハマった。

まとめ(先に)

  • Thank you, @flada_auxv san!
  • ActiveDecorator のテストをするとき、Controllerインスタンスから view_context を生成すると思うけど、ApplicationControlle#request を設定しておくと、URL使うテストでハマらない。

コード例と現象

まずは、例とするコード(若干適当なところが…)

class GroupSummary
  def initialize(group, total_count, failure_count)
    @group         = group
    @total_count   = total_count.to_i
    @failure_count = failure_count.to_i
  end
end

module GroupSummaryDecorator
  # NOTE これがポイント
  def summary_url
    group_summary_url(@group)
  end

  # こいつらはテストしても期待通りに動く
  def success_count
    @total_count - @failure_count
  end
end

describe GroupSummaryDecorator do
  let(:group) { FactoryGirl.create(:group) }
  let(:group_summary) { GroupSummary.new(group, 0, 0) }

  before do
    ActiveDecorator::ViewContext.push ApplicationController.new.view_context
  end

  after do
    ActiveDecorator::ViewContext.pop
  end

  describe '#summary_url' do
    before do
      ActiveDecorator::Decorator.instance.decorate group_summary
    end

    specify do
      expect(group_summary.summary_url).to eq 'http://localhost:3000/groups/1000'
    end
  end
end

bundle exec rspec spec/decorators/group_summary_decorator_spec.rb
# => NoMethodError: undefined method `group_summary_url` for #<GroupSummary:0x00000000>

ActiveDecorator::ViewContext に ApplicationController インスタンスの view_context を push しているにもかかわらず NoMethodError が出る。 Decorator のメソッドはみつかっているものの、その中の url_for なパスがないって言われる。

調べてみた

ググッてみると、以下の記事をみつけた。

Testing Draper decorators with real helpers, including URL helpers.

hoge_path、fuga_url のような Decorator内で url_for なメソッドを使いたい場合は、view_context のレシーバとなる Controller のインスタンスに request を設定しなければならない様子。

これは ActiveDecoratorが、ここで method_missing を利用して view_context にある同メソッドを呼び出すと思うのですが、ここで actionpack/lib/action_controller/metal/url_for.rb で上書きされている url_optionsurl_for で利用しており、その影響で request が空だとうまく URL が作成できないため(らしい)。

ActionDispatch::TestRequest という便利なものが用意されているので、これを ApplicationController#request に代入してやるとうまいこと URL が作られた。

describe GroupSummaryDecorator do
  let(:group) { FactoryGirl.create(:group) }
  let(:group_summary) { GroupSummary.new(group, 0, 0) }

  before do
    controller = ApplicationController.new
    controller.request = ActionDispatch::TestRequest.new

    ActiveDecorator::ViewContext.push controller.view_context
  end
  ------
end

bundle exec rspec spec/decorators/group_summary_decorator_spec.rb
# => passed

※ URL の port がうまく設定されず困っていたが、このTestRequestのリファレンスみると、‘HTTP_HOST’ に対してホスト名とポートをくっつけたものを渡せば反映されるっぽいので、反映したらうまくポートも反映されたのであった。

関西Ruby会議06に参加してLTしてきた

2015-07-12
  • Share on Facebook
  • Tweet
  • Add to Pocket

CFP だして LT 通ったので、夜な夜なせっせこアプリを作っていたのだけれど間に合わず、当日本番までに動くものを用意できなかったので、ハマったところを挙げてスライド作ってみた。

前日最終ということで脳内練習したら時間余ったので、急遽5枚くらい追加したのであるが、ド緊張でスピードが出ず全く到達しなかったemoji-sob

発表時 poltergeist のくだりで、「ポルターガイストのくせに、モノが動かずに(エラーメッセージの)文字列だけが返ってくる」と話したのであるが、この部分はそもそもポルターガイストは何もしていないのに物体が勝手に動いたりする現象なのに、モノが動かないのはポルターガイスト現象って… という意味を掛けた感じだったのであるが、懇親会で会話したところ「めんどくせぇ!」と一蹴されたのであった。

伝わらなかったらしい。emoji-sweat_drops

※スライドにも書いてあるけど、2.0.0 でモノが動くようになっているので安心してご利用ください。emoji-smile

本番で時間が足りなかったので到達してないのであるが、まとめとして「涙の数だけ強くなれるよ…」というのを入れていて、この部分で「アスファルトに咲く花ではないけど」という岡本真夜的な雰囲気を醸し出す枕詞をつける予定だったので、到達しなかったのが非常に残念であった。

さすがにここはわかってもらえたはず…

会自体は平和な雰囲気で進んでいき、基調講演であるMatzのRuby開発の変遷の話や、ささださんのキーワード引数の話、スポンサーLT、CFPから採択された発表、LTなどなど、あっという間に時間が過ぎていった感じがした。

今回の関西Ruby会議は、実装や業務で投入したものの話が多く、非常に勉強になるものが多かったと思った。ささださんの発表でキーワード引数をブロック引数にも使えることを初めて知った。emoji-memo

なんかスライドまとまってた関西Ruby会議06 スライドまとめ #kanrk06のでリンク貼っておきます。

何ヶ月前から準備をしていたスタッフのみなさん、当日スタッフのみなさん、基調講演のMatzとささださん、発表者のみなさん、スポンサー各位、参加者のみなさんお疲れ様でした。ありがとうございましたemoji-bow

※スタッフのみなさんはまだ終わっていないのは存じあげておりますが一旦の区切りとして。