スクショを送られてきた時にデバッグを楽にするライブラリを作った

By | 2014年9月3日

バグってんだけど…これちょっとおかしい…デザインくずれてんだけど…
といわれてスクショだけ送られてきたことが一度はあるかと思います。
(まぁどういう状況なのか見た目から推測できるので無いよりもマシだけども…)

さて、スクショだけを送られてきてバグってるといわれた時に何が困るでしょうか。

それは情報が足りずにデバッグを始める前に情報集めをしないといけないことです。
当然ユーザーのための画面にエンジニアが必要な情報が出ていることはまずないでしょう。

個人的にはこの情報を集めるのがクソめんどくさい!!!!!1

送ってきたユーザーはだれ?
デザインが崩れているデータはどれ?
自社で API も開発してる場合は原因はサーバーサイド?それともクライアントサイド?

スクショを撮った時に表示されてる UIViewController からなら上記のような疑問を解決するのは容易なのに…と思いながら、それらを特定するための情報を集めるところからはじまります。

リクエスト先の API が自社の場合だと Access Tokenと Request Parameter が分かれば、
実際にリクエストを送り原因がサーバーサイドなのかクライアントサイドなのかを特定することができて便利ですね。
(Access Token を出力する場合はセキュリティ上、注意が必要なので自己責任でやってください)

また UIWebView を使用している Application だと特定の WebStorage や Cookie が見れたらデバッグが捗るかもしれません。

デバッグに必要な情報は画面(UIViewController)毎に異なります。

前置きが長くなりましたが、デバッグに必要な情報を揃えてるプロセスがそもそも無駄だなと常々思っていました。

それを解決する方法を思いついたのでライブラリにして公開しました。

dealforest/DFTDebugScreenshot

方法はシンプルでデバッグ情報がほしい UIViewController に - (id)dft_debugObjectForDebugScreenshot
を定義し、デバッグに必要なオブジェクトを返すようにしておけばスクショを撮った際に、そのオブジェクトの description した結果が画像として出力されます。

demo

CocoaPods にも公開しているのですぐに使えます。

長くなってきたので、ライブラリの詳細については別エントリーにしようと思います。

yidev 第16回勉強会 で発表する予定なので、この辺りのことをまとめて話せればと思ってます。
もし他で話す機会があれば話そうかなと思います。

ではでは。

おまけ

Homebrew や PromiseKit で有名な Max Howell(@mxcl) 氏に公開してすぐにスターをつけてくれたのでやる気に満ち溢れています。

Posted in ios

Peco & ec2list で快適にEC2インスタンスにSSHする

By | 2014年7月1日

AWSのAPIをカジュアルに」の 24 ページ目に”Unix的な小道具を作る”とあるのですが、これがとても便利そうでした。
何をするのかというと EC2 インスタンスの一覧を取得し、選択したホストに SSH します。
というわけでさっそく Zsh に設定してみました。

事前準備

IAM Management Console」に登録して API へのアクセスキーを発行し、~/.aws/config に保存しておきます。
ここで Policy の設定をミスっていて API にアクセスできなかったので確認しておくと変にはまらないかと思います。

Peco をインストール

Homebrew を使っている場合

$ brew tap peco/peco
$ brew install peco

Go の環境がある場合

$ go get github.com/peco/peco/cmd/peco

ec2list をインストール

$ gem install ec2list

(※) ec2list は memoize しているので毎回リクエストが発生するわけではありません。

$ ec2list

これで一覧が表示されていれば成功です。
default 以外の profile を使用する場合は以後、 s/ec2list/ec2list –profile [profile名]/ で置換してください。
エラーがでる場合は Policy の設定がおかしいか、~/.aws/config の設定がおかしいかだと思います。

Zsh の設定

$ ec2list | peco | cut -f 3 | xargs -o -n 1 ssh

このコマンドで選択したホストに SSH ができれば成功です。
毎回これを実行するのもめんどくさいので alias か、もしくは keybind を設定しておけば幸せになれるかと思います。

alias

[~/.zshrc]
 
alias peco-ec2ssh="ec2list | peco | cut -f 3 | xargs -o -n 1 ssh"

keybind

[~.zshrc]
 
function peco-ec2ssh() {
  echo "Fetching ec2 hosts..."
  local selected_host=$(ec2list | peco | cut -f 3)
  if [ -n "${selected_host}" ]; then
    BUFFER="ssh ${selected_host}"
    zle accept-line
  fi
  zle clear-screen
}
zle -N peco-ec2ssh
 
bindkey '^q' peco-ec2ssh

これで ^q を押せば SSH できるようになりました。
便利ですね。

Peco と ec2list の組み合わせでやりましたが、ec2ssh‘$ grep -E ‘^Host[[:space:]]+[^*]‘ ~/.ssh/config | peco | awk "{print \$2}" | xargs -o -n 1 ssh’ の組み合わせでもいいと思います。

ではでは。

yidev@恵比寿勉強会 で chisel について発表してきた (動画付き)

By | 2014年4月27日

2014/4/26 #yidev @恵比寿勉強会 で発表させてもらいました。
facebook/chisel を使えば LLDB からのデバックがこんなに快適になるよ!といった内容です。
好評なようでよかったです。

chisel は LLDB に Python のスクリプトを実行する仕組みがあるので、それを利用した便利なコマンド集です。
LLDB Python Refarence にその辺りは詳しくのっています。
発表に伴い資料だけだといまいち魅力が伝わらないのがもったいないとのことなので、デモ動画を作成しました



初めて動画を作ったのでどうしたらいいかイマイチわかりませんでしたので、誰かその辺り教えてくれたら嬉しいです。

このデモのサンプルを github にあげているのでもしよければそっちでも動かして確認してみてください。
実際、自分のプロダクトでいきなり使えるので、そんな必要ないとは思いますが…

また、今回発表の場をあたえていただいた @takayama さんありがとうございました。運営ご苦労さまです。

Posted in ios

Capistrano3 で Unicorn の再起動に失敗したのを対応したメモ

By | 2014年2月15日

たまにデプロイした際に Unicorn の再起動で失敗することがありました。
調べてみると「Capistrano によるデプロイ時に Unicorn の再起動に失敗することがある問題への対処」に書かれているのと同じ原因でした。

Unicorn の再起動時に、 Gemfile に新たに追加された gem を Bundler が読み込めていないことがわかった。 だから require している箇所で LoadError が発生Pする。 新しくなった Gemfile を Bundler がうまくロードできていないようだ。

元記事では Capistrano2 で run に環境変数を設定したものを文字列で渡して起動させているのですが、 ‘capistrano-bundler’ や ‘capistrano-rbenv’ を使っているので文字列で指定せずに環境変数を指定するやり方を調べてみました。

Capistrano3 の設定は「unicorn + rails 用 Capistrano 3 の設定ファイル」を使っています。

More Expressive Command Language」 によると with を使えばできるみたいです。以下が diff です。

# lib/capistrano/tasks/unicorn.cap
 
   def start_unicorn
      within current_path do
 -      execute :bundle, :exec, :unicorn, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D";
 +      with bundle_gemfile: "#{current_path}/Gemfile"; do
 +        execute :bundle, :exec, :unicorn, "-c #{fetch(:unicorn_config)} -E #{fetch(:rails_env)} -D";
 +      end
      end
    end

これでめでたく再起動に失敗することがなくなりました。

起動時に環境変数を指定するだけでなく、Unicorn の設定ファイルで BUNDLE_GEMFILE の環境変数を指定して解決する方法もあります。「Tips for using Unicorn with Sandbox installation tools」の ‘BUNDLE_GEMFILE for Capistrano users’ にかかれています。

# unicorn.rb
 
before_exec do |server|
 ENV['BUNDLE_GEMFILE'] = '/path/to/app/current/Gemfile';
end

#confwd で CocoaPods の Plugin の作り方について LT してきた

By | 2014年2月11日

少し遅れましたが「Conference With Developers 2」で LT をさせてもらいました。

@ninjinkun さんが発表していた「GitHub活動を通して個人のキャリアを積みつつ仕事の成果を出す方法」の中にGitHub チャンスというフレーズがあります。
便利なライブラリや意外にもこういう普段使ってるようなエコシステムの中にも GitHub チャンスは埋もれているので気軽に作って公開することでチャンスを生かせるかもしれませんね。
個人的には CocoaPods の Plugin は本家に取り入れられる可能性もあるので結構チャンスが埋もれてるのではないかと思っています。

また運営者の方々はこのような素敵なイベントを開催していただきありがとうございました。次回も参加したいと思います。

と、ここまでは感想なのですが、LT の中で CocoaPods Plugin の作り方の詳細 は blog に書くと言ってしまってましたが 以下がそれです。

この記事を書いた時の各 gem の version です。

gem の作り方ですが「君がOpsでもRubyで書いたライブラリはGemで配ろう」がとてもまとまっていてわかりやすいです。

plugin を作る際に参考になるのが cocoapods-try-release-fixcocoapods-0.29.0/lib/cocoapods/command 以下のコードが分かりやすいです。コード量も少ないので読めばある程度理解できるかと思います。

重要になってくるのが pod コマンドを実行した時の処理の流れです。

1. プラグイン読み込み(lib/cocoapods_plugin.rb が require される)
2. 該当するコマンドの instance を作成
3. 作成した instance の validate! を実行
4. 作成した instance の run
(claid-0.4.0/lib/claide/command.rb 参照)

これさえ把握できていれば後は簡単です。
サンプル用に引数を出力する echo コマンドを作ってみました。

$ git clone git://github.com/dealforest/sandbox.git
$ cd sandbox/cocoapods-echo
$ rake install
$ pod echo hogehoge
hogehoge
$ pod echo --test hogehoge
test

bundle gem cocoapods-echo を実行した後の diff です。
説明については GitHub 上にしておいたので分からない場合はコメントをもらえればレスします。

clone してきて rake install をしてもらえれば pod echo を実行できます。

ではでは。