爆速でプリントデバッグするCryingを作ったよ -裏-

By | 2014年12月19日

どういうフローで行き着いたかを聞かれることがあったので、iOS アドベントカレンダー19日目-裏-ということでまとめてみました。

本エントリー
爆速でプリントデバッグするライブラリを作ったよ

Swift 熱があがった

この発表を聞き質問して、なんとなく理解が深まった気がして何かできるのではないかと錯覚を起こしたのがきっかけ。

動機

本エントリーより

println から debugPrintln に書き換えたり、メソッドチェーンの途中で println を挟むのってめんどくさくないですか?

思考フロー

ruby の tapp を知っていたので、それっぽいことをどうやって Swfit で実現すればいいんだろうと思いながら、Array 等から定義へジャンプすると Swift の基本となる関数等の定義が書かれているファイルがあるので、それを読んでなんかいけそうな class とかあったりしないかなと調べ始めました。

AnyObject を拡張すれば…

コンパイルエラーで怒られてしまいます。
Optional と NSObject の拡張はできたけど、Swift のインスタンスだと使えないとか…

Protocol を拡張すれば…

Protocol を拡張したところで、実装がないから無意味。
そもそも Swift で Protocol を拡張できるかどうかは知らない。

全てのクラスを拡張すれば…

これは気合いでどうにかするパターン。
Swift で定義されてるだけならまだどうにか…なる…か…
Swift で書かれたライブラリで定義されてるインスタンスには使えないので、そんなの全てに対応するとか無理。

つまるところ基底クラスのない世界にうちひしがれた

暗礁に乗り上げ NSHipster を徘徊する

というわけで絶望にうちひしがれながら、なんか他の機能でどうにかできないかなと徘徊してると 「Swift Operators 」にいきつきました。

これを見てる時に、一つの疑問がわきました。

prefix や suffix に演算子をつけた状態でもメソッド呼び出しができるのか?

var i:Int = 0
i++.description;

これがきっかけで、演算子として tapp 的なものを新しく定義してやれば実現できるということにいきつきました。

実装

たいしたことしていないのでソースコードをみてください。

TODO

スタックトレースの結果がきたない

[2014-12-19 05:08:45 +0900] hoge
    at _TFFC11CryingTests25CryingCallPoftfixTestCase20testCallPostfixValueFS0_FT_T_u_KT_GSqPSs9AnyObject__ L:89

NSThread.callStackSymbols() を使って表示するようにしてるんですけど、これがとても見にくい。
(lldb) backtrace だとファイル名と行数がとれてるんだけど、これをどうすれば取れるかがイマイチ分かってない。

せめて addr2line 的なことがしたい。

Building assert() in Swift, Part 2: FILE and LINE」とあるけど、演算子だと引数が決められているのでダメ。

C言語の execinfo.h の backtrace でも結果は変わらない。
おそらく callStackSymbols の内部でも同じものを呼んでるのではないかという推測。

だれか分かる人教えてください。

まとめ

演算子を定義することにより、規定クラスがない世界でも生きていける。
とはいえ演算子を定義したりオーバーロードしたりしすぎると、副作用もあるのでご利用は計画的に。

iOSアプリ開発に必要な証明書をXcodeから自動で作成してみた

By | 2014年12月10日

Request Certificates with Xcode

Xcode is the easiest way to request certificates. Connect your device to your Mac and click Use for Development in Xcode's Organizer window. Sign in with the Apple ID associated with your iOS Developer Program membership and Xcode will automatically generate your certificates.

とあるので、手動では何度かやってるので Xcode から証明書を自動で作成してみました。

手動のやり方は「よく分かる!iOS アプリ開発に必要な証明書ファイルの作成方法 | アドカレ2013 : SP #4」をみると分かりやすいかと思います。

iOS Developer Program に加入し、Activate までは済ませた状態とします。

Development 証明書

General > Identity > Team を設定すれば iOS Development:~ が作成された。

※ もしかしたら Team の下にある Fix-issue を押す必要があるかもしれません。

Production 証明書

Archive を実行し、その後に Validation を実行すれば iOS Distribution:~ が作成された。

※ もしからしたら Archive だけで作成されているのかもしれません。

昔、証明書を作ったときは iPhone Development:~ みたいな名前になって気がするけど、時がたって変わったのかそれとも Xcode から作成したため名前が変わったのかは分からないんです。。。

まとめ

端末をつなげて実行すれば自動で Devices の登録もしてくれるので、 Activate さえ済ましていれば Xcode から離れずに実機で動かすまでが簡単にできるようになっていましたとさ。

とりあえず試したいって人にはいいかも

Posted in ios

横浜へなちょこiOS勉強会で「iOS エンジニアのための LLVM Optimiazation」について発表してきました

By | 2014年11月30日

先日いいお肉の日に「横浜へなちょこiOS勉強会#34.1」で発表させていただきました。

当日の資料です

話す内容を前日に変えたんで急ピッチでつくりました。
やるもんじゃないですねw

各Pass が何をしているかまで調べたかったんですけど、時間がなくて断念。
モチベーションがもてば近々どっかでまとめます。

他の発表者の内容もとても楽しかったです。
@kitasuke さんの Watchkit の devforum の話はとても参考になり質疑応答の時間がとても濃くてよかった。
@es_kumagai さんの発表は「Swift – 値付き enum 入門 〜 そして伝説へ 〜」ということもあり本当にやばかったです。
Swift のふわふわしていた Optional がわかった気がする。近々資料が公開されるみたいなので、それが待ち遠しいですね。

ということなので「第59回 Cocoa勉強会関西 – iOS/Macアプリ開発勉強会」に行けば、伝説の講義が聞けるみたいです。

主催者の @haranicle さん、おつかれさまでした。

懇親会(一心)の馬肉がうますぎてやばかったので、またいきたい。

ではでは

Posted in ios

MacBook Pro のセットアップ

By | 2014年11月10日

設定がいつもわからなくなのでメモってみた。

真っ先にすること

  • Xcode を App Store からインストール
    • MavericksでCommand Line Tools for Xcodeをインストールする
    • Dropbox をインストール
    • homebrew のインストール
      ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
      brew install ack chisel class-dump coreutils colordiff ctags findutils git gnu-sed hub keychain libxml2 readline reattach-to-user-namespace the_silver_searcher tig tmux tree vim watch wget xctool zsh

    OS の設定

    起動シェルを /usr/local/bin/zsh に変更

    * スリープするとすぐにロックするようにする

    * 修飾キーの変更 (fn キーは Karabiner で変更)

    * 三本指のスワイプでページ(コンテンツ)移動。
    * 四本指の左右スワイプでデスクトップ移動。

    * Dock の設定

    * Keyboard の設定

    Software の設定

    • Google IME
    • Google Chrome
    • Karabiner
    • iStat Menus 5
    • Google Drive
    • iTerm 2
    • BetterTouchTool
    • CotEditor
    • Firefox

    iTerm2 の設定

    * 画面サイズをいい感じにして Appearance の設定

    Karabiner の設定



    private.xml

    <?xml version="1.0"?>
    <root>
        <appdef>
            <appname>SLACK</appname>
            <equal>com.tinyspeck.slackmacgap</equal>
        </appdef>
        <item>
            <name>For Slack CTRL+N=move next channel, CTRL+P=move previous channel</name>
            <identifier>private.app_slack_move_channel_with_ctrln_ctrlp</identifier>
            <only>SLACK</only>
            <autogen>__KeyToKey__ KeyCode::N, ModifierFlag::CONTROL_L, KeyCode::CURSOR_DOWN, ModifierFlag::OPTION_L</autogen>
            <autogen>__KeyToKey__ KeyCode::P, ModifierFlag::CONTROL_L, KeyCode::CURSOR_UP, ModifierFlag::OPTION_L</autogen>
        </item>
        <item>
            <name>For Slack CTRL+TAB=move unread channel</name>
            <identifier>private.app_slack_move_channel_with_ctrl_tab</identifier>
            <only>SLACK</only>
            <autogen>__KeyToKey__ KeyCode::TAB, ModifierFlag::CONTROL_L, ModifierFlag::SHIFT_L, KeyCode::CURSOR_UP, ModifierFlag::OPTION_L, ModifierFlag::SHIFT_L</autogen>
            <autogen>__KeyToKey__ KeyCode::TAB, ModifierFlag::CONTROL_L, KeyCode::CURSOR_DOWN, ModifierFlag::OPTION_L, ModifierFlag::SHIFT_L</autogen>
        </item>
    </root>

    BetterTouchTool の設定


    開発環境の構築

    dotfile

    cd ~
    git clone git://github.com/dealforest/dotfile.git --recursive
    cd dotfile
    ./dotsetup.sh

    ruby

    cd ~
    git clone https://github.com/sstephenson/rbenv.git .rbenv
    mkdir -p ~/.rbenv/plugins
    cd ~/.rbenv/plugins
    git clone https://github.com/sstephenson/ruby-build.git
    git clone https://github.com/sstephenson/rbenv-default-gems.git
    cd ~/.rbenv
    echo "bundler
    pry
    cocoapods
    cocoapods-browser
    robocop
    tmuxinator
    cupertino" > default-gems
     
    export PATH="$HOME/.rbenv/bin:$PATH"
    eval "$(rbenv init -)"
     
    rbenv install 2.1.4
    rbenv global  2.1.4
    rbenv rehash
     
    ruby -v

    perl

    git clone git://github.com/tokuhirom/plenv.git ~/.plenv
    mkdir -p ~/.plenv/plugins
    cd ~/.plenv/plugins
    git clone git://github.com/tokuhirom/Perl-Build.git perl-build
     
    export PATH="$HOME/.plenv/bin:$PATH"
    eval "$(plenv init -)"
     
    plenv install 5.20.1
    plenv global 5.20.1
    plenv install-cpanm
     
    perl -v

    golang

    brew install go
    go get github.com/motemen/ghq
    go get github.com/peco/peco/cmd/peco
Posted in mac

プロジェクト毎に Xcode のバージョンを指定する方法

By | 2014年11月6日

ソースコードに書く方法でもいいんですけど、他にうまいことできないかなと思って少し調べてみました。
どうやら Run Script でも同じようなことができそうです。

Xcode Run Script Build Phase debugging」をみて知ったのですが、echo "error: ***" とするとビルドを失敗させることができるみたいです。
ほかにも warnings や note といったものがあるようです。

ただ shell や bash だと意図した挙動になるのですが、他の言語だとビルドエラーにならないです。

ここで重要になってくるのが Run Script の実行する順番です。
Compile Sources の前に実行するようにしないと、一度目のビルドは通ってしまうので気をつけないといけません。

gist にサンプルがあるのでどうぞ。