12月2009

[本] C言語によるオブジェクト指向プログラミング入門

パソコンの本棚の前をうろついていると、こんな本を見つけました。

C言語によるオブジェクト指向プログラミング入門 C言語によるオブジェクト指向プログラミング入門

翔泳社 2009-12-15
売り上げランキング : 34090

Amazonで詳しく見る by G-Tools

書籍名の通り、C言語でオブジェクト指向っぽくソースコードを書くテクニックを学ぶことができます。はじめは、C言語でのライブラリ作成の導入から始まり、オブジェクト指向を学びつつ、C言語でオブジェクト指向を実現するテクニックを知ることができます。C言語中級者〜上級者向けの本です。

C言語でオブジェクト指向とは、どういういことか。ちょっと長いサンプルですが、例えばこういことです。

obj_sample.c

String クラス的なものを作成する例となりますが、関数宣言だけ取り出してみます。

// インスタンス作成
String StringCreate();
String StringCreateWithCString( const char *s );

// インスタンス破棄
void StringRelease( String string );

// アクセサ
int StringLength( String string );
const char * StringCString( String string );
char StringCharacterAt( String string, int index );

// メソッド
String StringAppend( String aString, String bString );
String StringSubstring( String aString, int start, int count );

オブジェクト指向がどんなものか知っている方はピンとくるでしょう。こういうコードをC言語で書けるようにするためのテクニックが、この本に書かれています。もちろん、これだけではなく、継承などのオブジェクト指向必須とも思われる機能についての実装例もあります。

ところで、なぜ、わざわざC言語でオブジェクト指向をやる必要があるのか。その理由は、人それぞれだと思います。Cじゃなくて、C++でやればいいと思うなら、そうすればいいわけです。Cでなければならない場面が出てきたときに、このような実装の仕方を知っていれば、オブジェクト指向的な設計に慣れてしまったとしても、それをC上で実装できる可能性が見えてきます。C言語が好きな人、C++が嫌いな人、C言語を一通り学習して物足りない方、そんな方々にお勧めできる本です。

ちなみに、このブログの読者の一部はすでに気がついていると思われますが、これを本気でやってしまったのが、あの Core Foundation です。Core Foundation のソースコードは公開されているはずなので、この本を読み終えた後に、 Core Foundation を見るといいかもしれません。ソースコードは敷居が高すぎるかもしれませんので、こちらのサイトを見るのもいいでしょう。

CoreFoundation の秘密 | HMDT Programming Tips

Instruments すごい

Xcode付属の、アプリケーションのさまざまなパフォーマンスを計測する Instruments というアプリケーションがありますが、今日メモリリークを確かめるために使ったら、優秀すぎて驚きました。以前はマシンスペック的に敬遠していたのですが、iMacになったので、Instruments をばんばん活用していきたいですね。今回は、メモリリークの調査が目的なので、Leaks と ObjectAlloc を計測してます。

ちなみに、 Xcodeでデバックするときに、パフォーマンスツールを使って実行をすれば、Instruments を立ち上げることができます。今回は、Leaks で立ち上げています。

Instruments - Leaks

このように、リアルタイムでリークを検出していき、グラフにしてくれます。とてもありがたいのが、Responsible の項目で、誰がどこでリークさせたかを教えてくれます。これを見ると、明らかに PixivBrowser の [PixivConnection loadPage] が怪しいとすぐにわかりますね。さらに、NSURLConnection が多く見えるので、NSURLConnection の解放し忘れというのも、すぐに推測できます。関係ないですが、 CFNetwork が C++ ってこともわかりますね。

Instruments - Source

下のボタンで、表示方法をいくつか切り替えられるようで、適当にいじっていると、Drop Source File とか出てきたので、適当に、リークしていた PixivConnection のソースファイルをドラッグしてみたところ、リーク場所ハイライトしてくれて、しかもどれくらいリークしたかも教えてくれました。大変便利ですね。

Instruments は、この他にも様々なものを計測できるので、アプリケーションの改善には欠かせないツールとなるでしょうね。

Objective-C Blocks を使ってみる 2

前回は、簡単にブロックを使ってみましたが、今回はCocoaでブロックが使われているAPIを探してみました。メソッド名にBlockがあるのを検索しただけなので、あまり拾えてないかもしれませんが、Cocoa内では、主に列挙やコールバックのAPIにブロックが使われているようです。もちろん、NSBlockOperationといったGCDのタスクを表すためが本命だと思われますが、こちらは後で触れたいと思いますので、その他のブロックの使われ方を見てみようと思います。

1. CFRunLoopPerformBlock
ブロックを RunLoop で実行させる関数が用意されているようです。直接使うことは、あまりなさそうですが、、

2. completionBlock
CATransaction の処理が終了したときに呼ばれる、コールバック的な使われ方です。NSOperationにも同じものがあります。

3. enumerate ….
NSArrayのenumerateObjectsUsingBlock:など、列挙できるクラスには、たいていこのようなメソッドが用意されました。実は、これはブロックでできるようになっただけであって、あんまり嬉しいことはなさそうですが、もうひとつの列挙オプションが指定できるenumerateObjectsWithOptions:usingBlock:の方を使用して、オプションに NSEnumerationConcurrent のフラグを渡すと、並列処理で列挙してくれるようになります。.NETで言えば、Parallel.Forですね。

4. expressionForBlock:arguments:
NSExpression を作成するときに、ブロックで作成できるようになったようですが、NSExpression自体あまり知らないクラスなので、よくわかりません。

ざっと、眺めた感じ、NSOperationなどを除くと、これくらいのメソッドしか発見できませんでした。こうしてみると、コールバックや、並列処理するためのタスクを表す用途でブロックは使われるようです。

最後に、enumerateObjectsWithOptions:usingBlock:を実践して終わろうと思います。

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

	NSMutableArray *array = [NSMutableArray array];
	for ( int i = 0; i < 100; i++ ) {
		[array addObject:[NSNumber numberWithInt:i]];
	}

	void (^block)(id,NSUInteger,BOOL*) = ^( id obj, NSUInteger idx, BOOL *stop ) {
		NSLog( @"%@", obj );
	};

	[array enumerateObjectsUsingBlock:block];
	[array enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock:block];

    [pool drain];
    return 0;
}

オプションがない方は直列に実行され、オプションがある方は、並列に実行されることが実行結果からわかります。興味のある方は、実行してみましょう。

iMac 21.5 inch の使用感

iMac 21.5 inch の上位モデルを購入し、使用し始めてから2週間くらい経ったと思いますが、そろそろ使用感でもレポートしてみようかと思います。

まず、21.5 inch のスペックから。

プロセッサ:Intel Core 2 Duo 3.06 GHz
メモリ:4 GB
グラフィクス:ATI Radeon HD 4670 VRAM 256MB
HDD: 1TB

ざっとこんな感じのスペックで、ほとんどの人は満足できるスペックとなっています。

1. 本体とか
非常にスリムな一体型デスクトップは、大変素晴らしいものです。コードは電源プラグしかないので、机の上がすっきり保つことができます。USBの挿入口がモニタの裏面にしかないのが若干不便かもしれませんが、iMacなら仕方のないことだと思います。

2. キーボード、マウス
キーボード、マウス、ともにワイヤレスで、コードがなくなるので、机をすっきりと保つことができます。キーボードが薄いので、ちょっと打ちづらいと感じる方もいるかもしれませんが、すぐに慣れるかと思います。マウスは、マルチタッチ機能付きの Magic Mouse ですが、ホイールなどの隙間がないので、ゴミが溜まらなくて良さそうです。このマルチタッチ機能は、あまり使う場面はまだなさそうなのですが、ブラウザの戻るや進むの動作など、カーソルやキーボードで操作するよりも、若干楽に操作できるアクションは覚えておくと便利です。ただ、このペースで使っていると、数カ月に一回は電池を交換する必要がありそうなので、そこはちょっと残念です。

3. ディスプレイ
少なくとも、普通の人の目には美しいディスプレイに見えます。どの方向から見ても、だいたい同じ色に発色してくれるのが良いです。21.5inchは解像度がフルHDサイズと同じ、1920×1080です。個人的には、もう少し広く使いたかったので、27inchを買っても良かったかもしれないと思いました。この解像度だと、ウインドウを二枚並べることもできますが、しっかりと配置しなければ二枚並ばないので、もう少し広かったらと思ったりします。

4. Snow Leopard
起動はボタンを押してから30秒くらい、終了は10秒以内で即座に終了してくれます。非常に高速です。ちょっと気になった点としては、Dockのアイコンを長押ししたときのメニューが、アプリケーションのメニューではなくなった点です。私はよくこのメニューを使っていたので、異なるメニューになってしまったのは、少し残念です。アプリケーションメニューは右クリックすると出るようになったので、ctrlキーを押しながらクリックしなければならなくなったので、多少面倒になってしまいました。

5. 性能
少なくとも、開発マシンとしては、十分すぎる性能です。メモリ4GBもありますが、開発だけでは全部使うことはないでしょう。他には、Photoshopも軽快に動作してくれますが、動画を再生しながらドローしていると、極稀にひっかかる感じがするときもあります。今のところ、スピードに不満を感じるところはありません。