2012年8月25日土曜日

iphone_dev_jp東京 mac/iphone Hackathonに参加してきた

使えるライブラリを作ろう!というハッカソンに参加してきました。

個人的に家計簿アプリを作っていてNSDateがかなりいけていない(面倒なのが多い)のでそれを楽にするものを作りました。

https://github.com/yanamura3/NSDateHelper

実装自体は自分のソースコードからライブラリ化したいものをひっぱってくるだけだったのでほぼ一瞬で終わってしまい、大半はKiwi使ってテスト書いてました。

できたものはライブラリというかカテゴリになってしまいましたが。

問題はカテゴリを組み込むのにgitsubmoduleやcocoapodsだと2つファイル読みこめばいいだけなのに無駄にプロジェクトファイル毎取り込まなければいけないのがなんだなぁと。この辺りもなにかうまいやりかたを考えていく必要がありそうです。

結構時間があまったのでOCMockitoというモックライブラリで足りない機能があったので追加してみました。

https://github.com/yanamura3/OCMockito

追加したのはスタブのメソッドが呼ばれた際に指定したblocksを呼ぶことができるようにする拡張で、

[given([mock somemethod]) answer:^{ /** 処理 */ } ]

と書けば somemethodが呼ばれるとanswerに渡したblocksが実行されます。

NSProxyのforwardInvocationの勉強にもなったので結構役に立ちました。


最後は発表があったのですが、あまりにもやったことが地味すぎたので
今度ハッカソンに参加するときはもうちょい見た目にインパクトあるものを考えて参加しようと思いました・・・


Togetter
http://togetter.com/li/361912

中島さんの問題

中島聡さんのブログにでていたザッカーバーグの面接試験解いてみました。

問題その1
http://satoshi.blogs.com/life/2012/08/block.html

回答
https://github.com/yanamura3/HTTPLoader

GCDを使って同期リクエストをラップして非同期に見せかけるという一番シンプル(実装の少なくて済む)なやり方で実装で実装しました。
問題としてはキャンセルはできないのでキャンセルもしたい場合は別のやり方のほうがいいです。


問題その2
http://satoshi.blogs.com/life/2012/08/zack2.html

回答
https://gist.github.com/3426890

これはretainカウントを別の用途に使うといった発想でおもしろいやり方だなぁと思いましたが、複数人でやるようなプロジェクトでこういう一見わからない実装を入れると間違った使い方がひょいと混入しそうで怖い感じがします。

2012年8月22日水曜日

【Ruby最低限の知識編】Ruby素人が「たのしい開発スタートアップRuby」を実践

結構ざっくりとした説明しか書かれていませんが、他の言語を使ったことがあると用意に理解できると思うので、短い割にちょうど良い程度の説明の仕方だなと思いました。
ただこれまで経験したことのないものがポンとでてくるとちょっと理解に苦しみましたがそこはちゃんとした言語の本を読んで、ここではこんなもんかとさらっと流すほうがいいかなと。

以下感想。

・変数を使う
 いたって普通
・四則演算
 いたって普通
・すべてがオブジェクト
 Java,C系統のようなプリミティブはない。動的型付けだとそうですよね
・文字列
 ' ' or " "
   + で連結できて楽
 #{ } で囲めば文字列の中に変数の値とかをぶっこめる
・メソッド呼び出し
 オブジェクト.メソッド Java、C#とかと同じ
 BOOLを返すメソッドは最後に ? をつける。いままではisとかhasのプレフィックスつけてたので新鮮。言語としてお作法が決まっているのはいいこと。
 メソッド() の()は略していいようだ(ただし()なしで解釈できる場合に限る・・)
・配列
 [] の中に型とか気にせずにつっこめる
 +で配列もつなげれる
 ーで差分をとれる
 * で繰り返しができたり
・ハッシュ
 { key => value , , }
・シンボル
 軽く理解に苦しむ。
 keyに文字列よりはシンボルを使うようだ、書き方がJSONっぽい
・コメント
 #
・真偽
 true, false, nil
・条件分岐
 ここはちょっと気持ち悪い、なぜこうしたし。
 elsifをタイポしそうだ・・
   switchではない

 if
   elsif
   else
   end

 case
   when
   when
 else
   end

   ifの1行での記載は他の言語でもみたことないしかなり読みづらい。これ嫌い。
 でもifを前にもってきても{}つけないから余計見づらいのか、なんなのか。
 だいたい1行で書く系は可読性犠牲にしているのでしょうがないか。

・繰り返し処理とイテレーション
 for文によるfor eachの書き方はC#,Objective-Cとかと同じ。

 each do ブロック end でなんぞこれ・・・
 each { | | 処理 } のほうが初見では理解できた。eachの引数に{}渡して毎回{}内が実行されるんだろうなと。
 
 ブロックをObjective-Cのblocksと同じと考えることで理解。
 Objective-Cだと ^(引数) { 処理 } なので
 rubyは | 引数 | 処理 ってことなんすね、たぶん。

2012年8月21日火曜日

【Rubyインストール編】Ruby素人が「たのしい開発スタートアップRuby」を実践

まずはインストール

環境:Mac OS X 10.7.4


$ ruby -v

ruby 1.8.7 (2011-12-28 patchlevel 357) [universal-darwin11.0]


Homebrewを使ってやってみます

$ brew install ruby
Warning: It appears you have MacPorts or Fink installed.
Software installed with other package managers causes known problems for
Homebrew. If a formula fails to build, uninstall MacPorts/Fink and try again.
==> Installing ruby dependency: readline
==> Downloading http://ftpmirror.gnu.org/readline/readline-6.2.tar.gz
######################################################################## 100.0%
==> Downloading patches
######################################################################## 100.0%
######################################################################## 100.0%
==> Patching
patching file vi_mode.c
patching file callback.c
patching file support/shobj-conf
patching file patchlevel
==> ./configure --prefix=/usr/local/Cellar/readline/6.2.2 --mandir=/usr/local/Cellar/readline/6.2.2
==> make install
==> Caveats
This formula is keg-only, so it was not symlinked into /usr/local.

OS X provides the BSD libedit library, which shadows libreadline.
In order to prevent conflicts when programs look for libreadline we are
defaulting this GNU Readline installation to keg-only.

Generally there are no consequences of this for you.
If you build your own software and it requires this formula, you'll need
to add its lib & include paths to your build variables:

    LDFLAGS  -L/usr/local/Cellar/readline/6.2.2/lib
    CPPFLAGS -I/usr/local/Cellar/readline/6.2.2/include
==> Summary
/usr/local/Cellar/readline/6.2.2: 30 files, 1.6M, built in 25 seconds
==> Installing ruby dependency: gdbm
==> Downloading http://ftpmirror.gnu.org/gdbm/gdbm-1.10.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/gdbm/1.10 --mandir=/usr/local/Cellar/gdbm/1.10/share/man
==> make install
/usr/local/Cellar/gdbm/1.10: 10 files, 224K, built in 11 seconds
==> Installing ruby dependency: libyaml
==> Downloading http://pyyaml.org/download/libyaml/yaml-0.1.4.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/libyaml/0.1.4
==> make install
/usr/local/Cellar/libyaml/0.1.4: 7 files, 328K, built in 10 seconds
==> Installing ruby
==> Downloading http://ftp.ruby-lang.org/pub/ruby/1.9/ruby-1.9.3-p194.tar.gz
######################################################################## 100.0%
==> ./configure --prefix=/usr/local/Cellar/ruby/1.9.3-p194 --enable-shared
==> make
==> make install
==> Caveats
NOTE: By default, gem installed binaries will be placed into:
  /usr/local/Cellar/ruby/1.9.3-p194/bin

You may want to add this to your PATH.
==> Summary
/usr/local/Cellar/ruby/1.9.3-p194: 14688 files, 74M, built in 4.3 minutes

うまくいったっぽい。
念のため確認してみると


$ ruby -v
ruby 1.8.7 (2011-12-28 patchlevel 357) [universal-darwin11.0]

変わってない。。。だと。。。

以下本には書いていないこと。

$ which ruby
/usr/bin/ruby

/usr/bin/rubyのほうを見に行ってます。
ログをよくみると



NOTE: By default, gem installed binaries will be placed into:
  /usr/local/Cellar/ruby/1.9.3-p194/bin

You may want to add this to your PATH.

こっちにパスを張りやがれと書いてあるのでパスを追加します。
以下bashの例。

$ emacs .bash_profile

export PATH=/usr/local/Cellar/ruby/1.9.3-p194/bin:$PATH

$ source .bash_profile

$ echo $PATH

でちゃんとPATHが通ってるか確認

$ ruby -v

ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11.4.0]

これでOK。

2012年8月20日月曜日

Objective-Cのシングルトンパターン

Objective-Cのシングルトンの実装ですが、
GCDにdispatch_onceという便利なのがあるので、これを利用するとすっきり書けますし、dispatch_onceだとXcodeによる補完が強力なので書くのも速いです。
http://stackoverflow.com/questions/7568935/how-do-i-implement-an-objective-c-singleton-that-is-compatible-with-arc


+ (MyClass *)sharedInstance
{
    static MyClass *sharedInstance = nil;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        sharedInstance = [[MyClass alloc] init];
        // Do any other initialisation stuff here
    });
    return sharedInstance;
}

2012年8月13日月曜日

Objective-Cでprivateなインスタンス変数を外部から変更したり参照する方法

UnitTestなどでテスト対象のクラスのprivateな変数(属性)を参照したり変更したりしたい場合があります。
テストのためにアクセッサを追加したりするのはちょっとあれなので何かいい方法がないか調べてみたらObjective-Cだとテストフレームワークの力を借りるまでもなくあっさりできますね・・

Objective-CのKey Value Codingを利用します。

これはざっくり言うとアクセッサーを用意しなくても、
 setValue: forKeyとvalueForKeyを使えば、名前(Key)でクラスの変数にアクセスできるという代物です。

テスト対象はこのPersonというクラス。(メソッド名がひどいのは無視しましょう)


@interface Person : NSObject
{
@private
    NSString* name;
}

- (NSString*)getName;
@end

@implementation Person

- (NSString*)getName {
    return name;
}

@end

テストコードはこのようになります。

- (void)testName {
    Person * person = [[Person alloc] init];
    
    [person setValue:@"Taro" forKey:@"name"];
    
    GHAssertEqualStrings(@"Taro", [person getName], @"not equeal name");
}


2012年8月6日月曜日

Xcode : TODO, FIXMEなどの記述

TODO, FIXMEなどのコメントを以下のようなフォーマットでつけると
control + 6 でのメソッド一覧の表示の際に#pragma markと同様に簡単に見つけられるようになります。(参考

// TODO: "comment"
// FIXME: "comment"
// !!!: "comment"
// ???: "comment"
// MARK: "comment"

Xcode4.4以前はメソッドのなかに記載しても表示されませんでしたが、Xcode4.4以降だとメソッドの中に記載しても表示されるようになったのでTODOなどが使いやすくなりました。

2012年8月5日日曜日

Xcode : #pragma markで見出しをつける

プログラム上でたまに見かける #pragma mark ***  の使い方です。(参考)

#pragma mark を使うことでコードをXcodeで見やすくすることができます。
C#知ってる人はC#のpragma regionと似たような感じに使うことができます。(begin-endはいらない)

・書き方
*** のところに何か文字列を記載します。

#pragma mark ***

例:hogeとつけてみる



"control + 6" でメソッド一覧を表示すると
図のようにpragma markでつけたhogeという文字列が一覧に表示されるようになります。



追記:

#pragma mark - ***

とハイフンをつけることで区切り線を出すことができるので更に見やすくすることができます。

たくさんメソッドがある場合などに探しやすくするのによいと思います。



LL Decade に参加してきた

毎年行われているLLのイベント LL Decadeに参加してきました。

昨年も参加しましたが、昨年はJavascript一色な感じでしたが、今年はバランスがよかったです。

スピーカー陣は@miyagawa,@matzはじめ日本のそうそうたるメンバーが一同に介しとても豪華でした。

特に印象に残ったのが@miyagawaさんの基調講演で、WSGIなど他言語で実装されたよいものをそれ以外の言語にポーティングして取り込むという言語間での交流が増えてきていているというところで、確かにObj-CをやっていてもRubyなどのやり方を取り込んだりしているものがよく見られるのでなるほどと感じるとともに、そういうところはOSSとしてはじめるにはとっつきやすいところなのかなと。
複数の言語が使える人をpolyglotというらしいです、複数の言語を使うことで他言語のよいところや悪いところを知るのによいきっかけができるので、2年に一つくらいは新しい言語に挑戦したほうがよさそうです。

@matzさんの講演ではruby2.0がいよいよruby生誕20周年にあわせてリリースされる予定だそうです。(20年だからだしちゃおうかくらいのノリのようです)
キーワード引数が使えるようになるらしいので楽しみです。
mrubyという組み込み向けのrubyも開発が着々と進められているようで、元組み込みエンジニアとしてはどうなのか結構気になるところです。
まだフットプリントが600kくらいあるそうなのとソフトリアルタイムを実現するためのGCの改善などが課題としてあるみたいです。

Underscore.m

_.m

javascriptのライブラリのUnderscore.jsをObjective-Cへポーティングしたもの。

CocoaControl

CocoaControl

いろいろなカスタムUIコントローラの部品が登録されていて便利そう。