kaeruspoon

かえるキーワード独立の断念

ここ最近、かえるキーワードを別アプリとして分離する作業をやってきたのだけど、WebAPIで機能を提供するのは遅すぎて実用性にかけるため、計画を断念しました。このトップページの表示だけでも20秒以上かかってしまっていたくらい。
というわけで内部的なかえるキーワード機能を復活させました。

肋骨が痛い

先日の土曜日に自転車で江ノ島にいったのですが、実は家を出てすぐに落車をしました。そんなにスピードが出てなかったのでちょっとすりむいたくらいで済んでいたのですが、徐々に肋骨が痛くなってきました。最初は大きく伸びをするとちょっと痛い、という感じだったのだけど、今はもうふつうにしているだけでずきずき痛むし、くしゃみをしたら顔をしかめそうになるくらい痛いです。なんてことだ。ヒビでも入ってなきゃいいけど。とりあえず、週末は病院にいってみよう。

Objective-Cを使ってみる

ひょんなことからObjective-Cの勉強をちょっとしてみた。
最初はMacがないと使えないと思っていたのだけど、gccでコンパイルできることがわかった。すばらしい。

sudo aptitude install gobjc

環境構築はこれでOK。あとはgccかけるときに-lobjcをつけてあげます。

gcc test.m -lobjc

こんな感じ。Objective-Cのファイル名の拡張子はmだそうです。

Objective-Cは基本的にC言語みたいです。変な記法でオブジェクトが使えるようになったC言語。
たとえばRuby

class Tsukasa < Oishi
  def say
    puts "hello, world!"
  end
end
a = Tsukasa.net
a.say

というようなコードがあったとき、Objective-Cでは

#import <stdio.h>
#import <objc/Object.h>

@interface Tsukasa : Oishi
- (void)say;
@end

@implementation Tsukasa
- (void)say {
  printf("hello, world!\n");
}
@end

int main(void) {
  id a = [Tsukasa new];
  [a say];
}

と書きます。同じクラスを2回書いているように見えますが、@interfaceのところはクラスの宣言で、@implementationでメソッドを実際に定義します。メソッド名の前のカッコは返り値で、その前の「-(マイナス)」はインスタンスメソッドであることを示しています。クラスメソッドのときは「+(プラス)」を使います。
実際にメソッドを呼び出すとははかぎ括弧で指定します。最初にレシーバを書いて、次にメソッドと引数が続きます。
idというのはインスタンスを表しているObjective-Cの型で、基本的にはvoid*みたいなものだそう。だから、

  Tsukasa * a = [Tsukasa new];

と書いてもOKなのです。
書き方がちょっと変だけど、C++よりはとっつきやすそうです。もっといろいろ勉強してみよう。

今朝のObjective-Cの勉強

朝早く起きて、Objective-Cの勉強をちょっとしました。

今日覚えたこと。
1.インスタンス変数とself
インスタンス変数は@interfaceディレクティブで指定してあげます。

@interface Test : Object
{
        int     prt_attr;
@public
        int     open;
@private
        int     num;
        char *  name;
}

@public,@protected,@privateディレクティブで公開範囲を指定します。何も指定していないときは@protectedが選択されます。
メソッド内でインスタンス自体にアクセスしたいときはselfを使います。

  self->num = 3;

注意が必要なのが、@publicなインスタンス変数を外部から利用するとき。id型の変数からは@publicなインスタンス変数を参照できません。

  id obj = [Test new];
  obj->open = 3; // これはNG

そのときは

  Test * obj = [Test new];
  obj->open = 3; // これはOK

というように静的な型としてコンパイラが確認できるようにしてあげます。

2.メソッドのラベル
メソッドにはラベルをつけることができます。同じメソッド名でもラベルが異なれば別のものとして扱われます。

  - (void)method:(int)num andName:(char*)name {
    printf("lavel on\n");
  }
  - (void)method:(int)num :(char*)name {
    printf("lavel off\n");
  }
......
  [obj method:1:"test"];
  [obj method:1 andName:"tsukasa"];

とすれば、

lavel off
label on

となります。引数の間にラベルを置くみたいです。最初は引数それぞれにラベルをつけられるのかと思っていました。引数が3つあれば

- (void)method:(int)num andName:(char*)name andAge:(int)age;

というふうに書けます。

3.指定イニシャライザ
インスタンスを生成するときに初期値も指定してあげたいときがよくあります。そんなときに使うのが指定イニシャライザ。Objective-Cでは、newクラスメソッドで[Class alloc init]とメッセージを投げているので、initメソッドをオーバーライドすればよさそうですが、こいつは引数を受け取れません。そこで、

  - (id)init {
          [super init];
          return [self initWith:1 :"oishi"];
  }

  - (id)initWith:(int)num :(char*)name{
          self->num = num;
          self->name = name;
          return self;
  }

というように、initメソッドから引数を受け取る指定イニシャライザを呼んであげます。慣例的に、指定イニシャライザはinitWithで始まるメソッド名にするようです。main()で実際にこれを利用するときは、

Test * obj = [[Test alloc] initWithNum:5 :"tsukasa"];

みたいな感じで呼びます。そのままですね。

4.ガベージコレクション
Objective-Cにはガベージコレクションなどありません。まさにC言語です。インスタンス生成で確保したメモリを開放するときはfreeインスタンスメソッドを呼んであげます。

  [obj free];

これ、忘れそうですね。Rubyとかに慣れている身としては。注意が必要です。

5.クラスオブジェクト
Objective-Cではクラス自体をオブジェクトとして利用することができます。クラスオブジェクトを引き出すときはclassメソッドを使います。型はClassとなります。

  Class c_obj = [Test class];
  id obj => [c_obj new];


6.セレクタ
Objective-Cではメッセージのやりとりにセレクタというものを使って実際のメソッドを特定しているようです。
セレクタを使えば実行中に呼び出したいメソッドを動的に選択することができるようになります。C言語の関数へのポインタみたいですね。セレクタを取得するには@selectorディレクティブを使います。返される型はSEL型です。

  SEL call_m = @selector(openMethod);
  [Test perform:call_m];

performメソッドはセレクタを受け取って、それが示すメソッドを実行します。

7.メソッドへのポインタ
メソッドへのポインタを取得することができます。取得したそれはC言語の関数へのポインタと同じように使うことができます。メソッドへのポインタを取得するには、instanceMethodForクラスメソッド、またはmethodForインスタンスメソッドを使います。これらはメソッドへのポインタをIMP型として返します。

  id obj = [Test new];
  SEL method_sel = @selector(method);
  IMP func = [obj methodFor:method_sel];
  func(obj, method);

メソッドへのポインタの第一引数にオブジェクト、第二引数にメソッドのセレクタ、それ以降に通常の引数を指定します。

8.プロトコル
JavaのインターフェースのようなものがObjective-Cにもあって、プロトコルと呼ばれています。

@protocol Tsukasa
- (void)oishi;
@end

@interface Test : Object <Tsukasa>
@end

というように、プロトコルを採用するクラスの宣言で <>内に指定してあげます。プロトコルが採用されたクラスでは必ずそのメソッドを実装しなければなりません。

Macで遊ぶ一日

今日は会社に来て、一日中Macで遊んでました(つまり仕事ではない)。
iPhoneアプリの開発を初めてしたけど、結構大変でした。どこから手をつけていいのかよくわからないもの。
それでも、とりあえず検索窓ととあるWebAPIからXMLデータを取得するところくらいはできました。まだまだ前知識が足りません。XCodeやInterfceBuilderの使い方がまだいまいちです。
でもMacは触っていて気持ちがいいですね。ますます欲しくなってきた。

Sony がけっこう好き

SONY ウォークマン Aシリーズ ワンセグ内蔵 8GB ブラック NW-A918B

iPodよりもこれが欲しかったりする。

ぼくはけっこうSony製品が好きで、使っているPCもVAIOだったりします。正直、VAIO以外のPCを使う気が全然しません。だってカッコ悪すぎるんだもの。変な家電っぽいし、他のメーカーのPC。VAIO以外で許せるのはMacくらいです。

livedoorさんの社内勉強会Megatechに参加してきました

livedoorさんの社内勉強会Megatechに参加してきました。とても楽しかったです。当初予定してなかった懇親会にも急遽参加させていただいた。勉強会に参加したら、懇親会にも参加しないともったいないなあと実感した今日この頃でした。
勉強会の内容では、特にMySQLのパフォーマンスチューニングのお話が興味深かった。プレゼン資料がweb公開されるかもしれないというお話だったので期待していようと思います。

ステラ・リーベックになる

ステラ賞というものがアメリカにはあるのだけど、その賞が作られるもととなった事故はステラ・リーベックというおばあちゃんが足にマクドのコーヒーをこぼして大火傷をしたというものです。
今朝のぼくはそのステラばーさんと同じことをしてしまいました(マクドじゃなくて自宅のコーヒーだけど)。おかげでふとももに火傷が。すぐに病院にいって治療してもらったけど歩くのが一苦労です。とほほ。

ダメな一日

今日は何もしない一日だった。朝起きてから夕方まで、ぼうっとしながら自分の昔の小説を読んでいたりしました。腹が減ってきたなと思ったら夕方の6時を過ぎていたのでびっくりした。休日はひきこもって過ごしていた昔のぼくみたいだ。今日は一日勉強にあてる予定だったのに。今日した有意義なことは、人間失格を読んだことと洗濯をしたことくらい。
今はユルさんが実家に帰っているので実につまらない。ひとりだと何もすることがないのだ。困ったものである。

VAIOの新型typeZがいい

type Z | 製品情報 | 個人向け | VAIOパーソナルコンピューター | ソニー

今までVAIOのtypeSがプログラマにも最適な感じの製品でしたけど、今回のモデルチェンジで軟弱者に成り下がっています。
代わってそのポジションにのし上がってきたのがtypeZ。これ、すごくいいな。買ってすぐにUbuntuをインストールしたい。