hirakiucの日記

いろいろ

Developer CenterはSafariで見た方がいいらしい

Developer CenterにあるProvisioning Profileを更新する画面を使おうとしてると、どうしても画面が進まなくなる事があった。

よく観察してみると、どうやらchrome on macで操作しているとjavascriptのエラーが出ていて動いてくれていなかった。

数時間悩んだ挙げ句、safari on macを使ってみるとすんなり動いた。

appleのサービスを使うときは、safariを使った方がいいらしい。

rails3 + rspec + helper method

まだ疑問に思っている程度の事。

rails3の複数のhelperに同じ名前のメソッドを作るとrspecできちんとテストできない様子。

以下のコードは実際に試したコードとは異なる名前なので、動作が異なるかもしれない。

ただ、このような状況が発生している事は残しておきたい。

例 ) こんな構成になっているとき。

# app/helper/top_helper.rb

module TopHelper
  def my_helper_method
    "top helper method"
  end
end

# app/helper/second_helper.rb
module SecondHelper
  def my_helper_method
    "second helper method"
  end
end
rspec
# spec/helpers/top_helper_spec.rb

require 'rspec_helper'
describe TopHelper do
  describe :my_helper_method do
    it { expect(helper.my_helper_method).to eq("top helper method") }
  end
end

これで動かしてみるとrspecがfailedな状態になる。

表示されるスタックトレースを見ると、どうやらSecondHelperの方が呼ばれている様子。


helper毎にmodule名が違うんだから、同じ名前のメソッド名つけてもきちんと使い分けてほしい。

まだ勉強不足でどこが原因なのか調べきれてないので、とりあえず状況をメモしてみた。

git pre-pushで ユーザの入力を受け付ける方法

https://raw.github.com/git/git/master/Documentation/RelNotes/1.8.2.txt

git 1.8.2からpre-push hookが追加されたので、早速使ってみた。

このとき、ユーザからの入力を受け付けるところで少し工夫が必要だったのでメモ。

ユーザからの入力が拾えない?

ユーザに yes/no ? と確認してから動作するようなスクリプトを書いたのだけど、単純に $stdin.gets とすると入力待ちしてくれない様子。

また、pre-pushは $stdinからはpushされる対象の情報が渡ってくるとのこと。

# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
#   <local ref> <local sha1> <remote ref> <remote sha1>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).
解決方法

https://gist.github.com/ebihara/5948590#file-pre-push-py-L10

こちらの10行目が解決方法になってた。

まずスクリプトの先頭で $stdinから拾えるだけ入力を拾ってきておく。

その後は、$stdinを open("/dev/tty") で置き換えて利用。

これで解決できた。

今日の発見

Expecta

AFNetworkingのtestcaseをチラ見してて気がついたもの。

SenTestCaseで使ってるmatcherがさくっと書けてしまう優れもの。

petejkim/expecta - github.com

expect(@"foo").to.equal(@"foo"); // `to` is a syntatic sugar and can be safely omitted.
expect(foo).notTo.equal(1);
expect([bar isBar]).to.equal(YES);
expect(baz).to.equal(3.14159);

非同期テストもシンプルに書けるぽい。

expect(対象).will.to.equal(期待するもの);

とか。

実際の例はAFNetworkingのtestcaseから。

# https://github.com/AFNetworking/AFNetworking/blob/master/Tests/AFHTTPClientTests.m
- (void)testPostWithParameters {
    __block id blockResponseObject = nil;
    [self.client postPath:@"/post" parameters:@{ @"key": @"value" } success:^(AFHTTPRequestOperation *operation, id responseObject) {
        blockResponseObject = responseObject;
    } failure:nil];
    
    expect([self.client.operationQueue operationCount]).will.equal(0);
    expect(blockResponseObject).notTo.beNil();
    expect(blockResponseObject).to.beKindOf([NSData class]);
    
    NSError *error = nil;
    NSDictionary *responseDictionary = [NSJSONSerialization JSONObjectWithData:blockResponseObject options:0 error:&error];
    expect(responseDictionary[@"form"]).to.equal(@{ @"key": @"value" });
}

httpbin

通信ライブラリとかのテストケースで使えそうなもの。

httpbin

いろいろとテストで使えそうな予感。

ローカルで動いてないと嫌な人はここからインストールするとかで使えそうな雰囲気。

kennethreitz/httpbin - github.com

bundle と mecab-ruby

mecab, mecab-ipadicはcheckinstallで入れたんだけど、mecab-rubyがいい感じに動いてくれなかった。

試行錯誤した結果、こんな風にGemfileを書いたらうまいこといった。

source "https://rubygems.org"

# gem "rails"
gem 'mecab-ruby', :github => 'hotchpotch/mecab-ruby-gem'

あとデフォルトでinstallするとMeCab.soがロードできなかったので、環境変数を設定

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64

これで動くようにはできた。

rubyのJSON.parseでhashキーをsymbolにしてもらう方法

Ruby JSON parse changes Hash keys

  • ruby 1.9.3p393
    • json (1.8.0)
$ pry
[1] pry(main)> require 'json'
=> true

# hashをjsonへ変換
[2] pry(main)> json = {:key_a => "value2", :key_b => "value3"}.to_json
=> "{\"key_a\":\"value2\",\"key_b\":\"value3\"}"

# 普通にparseしてもらうと keyはString
[3] pry(main)> p JSON.parse(json)
{"key_a"=>"value2", "key_b"=>"value3"}
=> {"key_a"=>"value2", "key_b"=>"value3"}

# optionを指定すると、keyをSymbolにしてくれる
[4] pry(main)> p JSON.parse(json, {:symbolize_names => true})
{:key_a=>"value2", :key_b=>"value3"}
=> {:key_a=>"value2", :key_b=>"value3"}