まだMacBookは届きませんが、スムーズに開発に入れるように Linuxでも環境を整えておく。といっても、Debian系なら
# apt-get install gobjc libgnustep-gui-dev
で、だいたいの下準備が整うようです。
試しにこんなソースを用意。ファイル名はsample1.m。
#include <Foundation/NSObject.h> #include <stdio.h> @interface Test1 : NSObject { int x; } - (id)init; - (void)print; @end @implementation Test1 - (id)init { self = [super init]; x = 1; return self; } - (void)print { printf("Test1: %d\n", x); } @end int main() { Test1 *t1 = [Test1 new]; /* 動的結合 */ SEL printsel = @selector(print); if ([t1 respondsToSelector: printsel]) { [t1 performSelector: printsel]; } [t1 release]; }
コンパイルはこんな感じでいいのかな。おー一応動くぞ。
% gcc -I/usr/include/GNUstep -lgnustep-base sample1.m % ./a.out (実行) Test1: 1 (結果)
C++だと、ランタイム実行時に、メソッドの有る無しを調べてから実行、 なんてのは相当トリッキーなコードを書かないとできないですな。 これが柔軟なGUI構築につながっていくわけですね。
valgrindで調べてみるとメモリリークしまくりなのですが(汗;) どこ間違ってるのかなあ....単純にvalgrindが対応してないとかなら いいんだけども。
% valgrind --num-callers=8 --leak-check=summary \ --show-reachable=yes ./a.out LEAK SUMMARY: definitely lost: 5,840 bytes in 365 blocks. possibly lost: 2,928 bytes in 71 blocks. still reachable: 354,419 bytes in 6,308 blocks. suppressed: 0 bytes in 0 blocks.
メモリ管理はObjective-C 1.0と2.0でも違うらしいので、 良く調べないとひどい目にあいそう。
/usr/include/GNUstep/Foundationを見る限り、iPhone SDK本に出てくるような基本的なフレームワークは全て備わっているように 見えます。手打ちでお勉強するには十分なのかな。
本はとりあえず「iPhoneアプリケーションプログラミング」を買ってきました。
iPhoneアプリケーションプログラミング 技術評論社 ¥ 3,360 |
書評で「図表による効果的な説明が行われていない」とか書いてあるけど、 ざっとみた感じC++,Javaでの開発経験者向けですね。
網羅的に様々な分野に触れていて良い本だと思ったんだがな..... 読んでみるとかなり酷かったので紹介します。
iPhoneアプリケーションプログラミング 技術評論社 ¥ 3,360 |
もうタイピングしてるだけでウンザリするわけだが、 どの程度酷いか理解してもらうために少し引用してみる。
「まず、この@propertyによる宣言は必須となりますが、インスタンス 変数を{aka '定義'}}するかしないか、メソッドを自分で書くのかどうか、 @synthesizeを書くのかどうかという点については、 状況によって変わります。 」
しかし どのような状況で変わるのかまったく説明がない。 あるとすれば以下の項目だろうか。
「プロパティageについてまず見てみましょう。オプションが何もないので ゲッタやセッタは指定されておらず、読み書き可能で、代入時はそのまま 代入されます。この場合、@synthesizeディレクティブを実装部記述 することで、同名のインスタンス変数ageに対しての代入や参照を行う ゲッタやセッタを背後で自動的に作り上げてプロパティとして機能する ようにします。 つまり、@synthesizeは文字通りメソッドを合成するということで実装部に記述します。整数データの場合は、単なる代入で多くの場合は問題ないでしょう。 」
いやいや、それまっったく説明になってないでしょう。「状況によって変わります=単なる代入で多くの場合は問題ないでしょう」。なに言ってるのかわかってますか?
次はもっとひどい。
「サンプルプログラムではnonatomicが付けられたプロパティがよく 見られます。これを書かないようにする必要があるのは複数のスレッド から書き込みが行われるようなプロパティです。書き込みが同時に発生 しないような場合は nonatomicと書いておく方が 良いでしょう。 」
この「新居雅行」という筆者にとって、どうもプログラミング言語というものが 「ああ、星が綺麗だな」とか「溶岩が吹き出ている」といった 現象として見えている ようだ。でもApple][やVIC-1001の頃から30年くらいコンピュータを学んできた程度の青二才に 言わせてもらえれば、
仕様とは、Aという入力があれば必ず(バグを除き)f(A)という出力が 得られるもの。言い換えれば 思想 とも言うべきものだ。 ま、単なる素人には、状況や場面に応じて「ああ、書式が違うんだな」という 把握の仕方はありかもしれんけどさ、 そうなってしまう理由 、つまり必然があるのが プログラミング言語なんですよ。それを伝えるのが プロ の物書きとしての 義務なんじゃないの?
全体的に「あれもあります〜」「これもあります〜」「こういう可能性があります〜」と いう文体から、 実は全く内部構造を理解しないで本を書いている というのが伺えるけどね。
「続いて、familyNameとgivenNameの場合を見てみます。ageと違って retainという記述があります。このretainについては次の節で説明 しますが、こちらは基本型ではなく、オブジェクトへの参照がプロパティ です。オブジェクトを引数に取るメソッドについては、 原則 としてこの ように代入時の動作を既定するオプションとしてretainを宣言するか、 あるいはcopyによってオブジェクトそのもののコピーを記録することを 行います。単なる参照の代入では、オブジェクトの開放との兼ね合いに 問題が出る 可能性があるので、 」
真面目な話、 この人の文章を初心者が読んだら混乱するだけ だぞ。 そういう意味ではAmazonの書評は全く正しいな。これは確かに初心者向けじゃない (むろん玄人向けでもないが)。 プロパティにしても、これは他言語からの概念で、オブジェクト指向含めて周辺的な知識を 網羅的に持っている人間には何が言いたいかわかるだろうけど、そんな人は読む必要もないだろ。
ちなみに手元のLinux gccには@propertyが無かったし(え?)言語仕様も知らないで(え?) propertyの説明を書いてみる。当然間違ってるだろう(笑)。
ここまでが導入。
以上がプロパティの仕様。
結局のところ「ただ単に文字列を内部でコピーして保持するセッタ」を「Cでオブジェクト指向っぽっく書く」と、以下のようなコードになるだろう。これを@property(copy)と@synthesizeで終わらせてしまえるのだから、メンバ変数が多くなればなるほどObjective-Cが有利なのは疑いない。 エラー処理がほとんどないのと、スレッドセーフの手段がグローバルロックなのは手抜きである。申し訳ない。
static CRITICAL_SECTION lock_; void setFamilyName(id obj, char *newname) { int len; char *tmp; if (obj == NULL || newname == NULL) return; ENTER_CRITICAL_SECTION(lock_); len = strlen(newname); tmp = (char *)malloc(len + 1); if (tmp == NULL) { LEAVE_CRITICAL_SECTION(lock_); return; } strcpy(tmp, newname); if (obj->name != NULL) { free(obj->name); } obj->name = tmp; LEAVE_CRITICAL_SECTION(lock_); return; }
まあ正確性に関してはマジ墓穴というか
という感じで赤面状態なわけだが、久々に高い本で腹が立ったので書いてみた。
もちろん千葉に行くからには、 前回お盆休みで食えなかった梅の家攻略 が目標に上がっていたのは言うまでもない。しかし・・・
でもコレを食わずに帰れるか!ということで30分待ちをこなして注文してみました「ラーメン+薬味」
感想:「う〜ん」 竹岡式を 好きな人は気を悪くしないで欲しいんだが、 なんというか素朴な味 やねえ。濃い醤油味。 チャーシュー煮汁を割っただけの出汁。そこへ玉ねぎの甘みがくる。
俺は正直もういいやと思っていたんだが、同行したtoga氏が絶賛して いたので、何か琴線に触れるものがあったんだろう。 ご馳走さまでした。暑い店内で小気味良く働いているお母さんたちに感謝を。
最近はアマゾンアフィリエイトの注文レポートに何か追加されていると、 「まだ読んでる人もいるんだな」と思って なんとなく日記を書くという自堕落になっております。
シルバーウィーク初日の19日。近所のオートバックスでオイル交換をし、軽く洗車もした。少しドライブしたくなったので、夕方から某所へ出発し、ともりん先生に往年のCCDスキャン型GT-8300UFを譲渡。
4年以上寝かせていた機体なのに、何の問題もなくvistaで動いた。拍子抜け。一応ポジフィルムのスキャンもできた。どうも背景真っ暗だと誤認識するみたいだけども。まあタダだから文句いうな!(ぉ
このまま帰っても面白くないなーと思い、何の準備もなく東名高速に乗る。そしてほどなく後悔することになる(まあお約束)
ええーっ?!高波ってなんだよ。そういや台風が近づいていたって言ってたなあ。手前の日本平PAで閉じ込められること数時間。特別予定があるわけじゃないので、夕食はPA内部の駿河亭で「かきあげ蕎麦+紅白丼」と相成った。 蕎麦はノビノビだったけど、桜えびとしらすのミニ丼はおいしかった。
このまま名古屋を超えるのは無理だな と判断。俺は車載クラスタにはなれない.....。はみんぐばぁど氏にもなれない(笑) で、「適当に降りれば街があるだろう」という 典型的ダメ都会っ子 の発想により相良牧ノ原ICで降りる。人は同じ過ちを繰り返す。
道路は整備されているのに、街頭一つない曲がりくねったワインディングロード。でも金谷駅(?)近くの山中から町並みが見えたときは思わず感動。これは奇麗だった。
場所は島田市。金谷はSL運行で有名な大井川鉄道の始点として有名らしい。 もちろん初めて知ったことだ(笑)周囲が鉄だらけなのに、 鉄道に全く染まらない俺何者。ここは観光地でも何でもない ようなので、一般道で浜松市を目指す。
偶然浜名湖立体花博というものが やっていたようだが、 華麗にスルーする俺 。 だって高いんだもん!なので隣のガーデンパークにいく。 公園は、ヨーロッパ調の庭園を広くした感じ。子供を遊ばせるにはちょうど良いのではないか。木陰にベンチがぽつんと置いてあったので、徹夜の睡眠不足を少し癒す。
ここでiPhoneアプリのAutoStichに初挑戦。公園内部の橋を中心に数枚つなげてみる。
元の写真の画質がアレなのだが、操作性は大変快適だった。本当にぺたぺた並べて行くだけで簡単につくれる。
まるで海上を浮くように走ることができる架橋は最高でした。弁天島周辺も奇麗だねえ。でもお昼近くになってきて観光客が増え、気軽に駐車できなくなってきたので、湖畔を南からぐるっと北へ回って、猪鼻湖周辺へ。 マリンスポーツの若者が風光明媚な景色をカッ飛ぶのは、まあそれはそれでよいでしょう。この晴天下ではDQNさえもが煌めいて見える。
この勝美というお店。店内がガラスばりになっていて絶景を眺めながら うなぎを食べられる。しかし味の方は..... うーん雰囲気補正!雰囲気補正! と唱えることで乗り切ったくらい。これで3500円はひど過ぎる。皮はビランと堅く身は味もしない水っぽいお味。タレはべっしゃり甘い。もしかしたら5000円の方を注文すれば違ったのか?いやそれはない。 なぜならこれは 焼いてるやつの技術の問題 だからだ。
連休中の日曜日ということで、店内はごった返し、店員さんもてんてこまいだった。厨房もおしなべて知るべし。ネットを見ても、ここまで酷評してるのはわずかなので、観光地に観光時期に行ってはいけなかった、というだけだろう。
まあ、これなら、浜松駅でも買える、浜名湖養魚漁協直営店のおみやげの方が10倍うまいんでオススメ。こちらは親に持って行った。
クマさんのPCにメモリ増設....もう忘れた....チップセットはi845Gかなあ....悪名高いSocket478 Celeron(not D)だった気がする.....
_ 通りすがりのあいあん [お疲れ様でした。 >素朴な味 実はこれが曲者でまた食いたくなるんだなあ。]
_ はみんぐばあど [うーん、竹岡ラーメンの魅力は、「肉」だと思うけどなぁ。にくぅぅって感じの豚。]