7月2007

久々にプログラミングに没頭

最近あまり暇がなかったり、そもそもプログラミングのドキュメントを読んでばかりで実際にやっていなかったのですが、今日は久々に没頭しました。といっても、数時間程度ですが。

いつになく順調にコードを書けていますが、ずらっとエディタに並んでいるクラスを見ると、少し機能を分割し過ぎではないかと心配になってきます。それでも、今のところ目立っておかしなコードは書いていないと思うので、モチベーションも一定水準を保っています。

やはり慌てずに綺麗なコードを書くように心がけた方が、後が楽という以前に、コーディングしてても楽しくなるものです。このままの調子でアプリケーションを完成に持って行ければいいですね。

おすすめの本 – 1

ブログのデザインをゆっくりと変更していますが、なかなかいい手段が見つからなくて苦戦しています。アーカイブや検索結果の表示に関しては、ましなレベルになってきましたが、今度はブログのエントリを表示する幅がもう少しあったほうがいいのではないかと検討中です。

さて、この前までサイドバーには面白そうなamazonのライブリンクを表示してましたが、しょせんは自動的に配信されているものなので、なんとなく意味がない気がしてきました。そういうわけで、おすすめの本をサイドバーに載っけることにしました。というわけで、まずは上から二番目のObjective-Cの本を紹介します。ちなみに、サイドバーはトップページにしか表示されていませんが、これもどうするか検討中です。何か不自由な点があったら、ぜひコメントください。

Objective-C Mac OS Xプログラミング Objective-C Mac OS Xプログラミング
荻原 剛志

ソフトバンククリエイティブ 2006-04-07
売り上げランキング : 72457
おすすめ平均

Amazonで詳しく見る by G-Tools

Objective-Cでプログラミングしたいと思っている人はもちろん、それ以外のオブジェクト指向というものを深く理解したい人にお勧めできる本です。特に、Objective-Cに感心のある人は、一度覗いてみる価値はあります。ただし、プログラミングをある程度したことのある人でないと読むことすら厳しいので、そうでない人にはお勧めできません。

内容は、Objective-Cのオブジェクトの仕組みが前半部に載っており、非常に読み応えがあります。後半部はCocoaのFundationフレームワークを中心に、Objective-Cと絡めた簡単な説明が載っています。

実は、この本と同等またはそれ以上のことが書かれているドキュメントがWEB上に存在します。

ADC Home > Documentation > 日本語翻訳 > Objective-C プログラミング言語

ここを読んでしまえば、特にこの本が必要という訳ではありませんが、見てもらえば分かる通り、リンク先のAppleのドキュメントは特に難しいです。そのドキュメントで理解するのなら、まだこちらの本のが分かりやすいと思いました。また、目も画面よりは紙のが疲れません。

この本の一番の問題は値段にあるでしょう。なんと4000円以上します。私もこの本は立ち読みで済ましてしまうか躊躇したのですが、思い切って購入しました。一読したときにObjective-Cについて理解がかなり深まったことと、今でもたまに役立つこともあるので、この値段を払う価値はあると思います。

ブログデザイン変更中…

昨日からブログのデザインを操作しています。一番改善したいのは、過去のページにアクセスしにくいころ。

とりあえず、タイミングが悪いと変な表示になるかもしれませんが、そういう場合はすぐに修正されると思うので、少し経ってから更新していただければ大丈夫なはずです。

作業状況:
19:00
ネガティブな意見が多いはてなスターをなんとなく設置

22:00
wordpressの仕様上、トップページで表示するエントリの数と、検索結果や月別アーカイブで1ページに表示するエントリ数は同じでなくてはならないので、調整が難しい。とりあえず、エントリを5表示するように変えてみた。

フレームワーク

フレームワークと聞くと、MacではCocoa、Windowsでは.NET Frameworkをフレームワークと呼ぶのは微妙なところですが、少なくともMFCなど、そういうものを想像されるかと思います。そして、オブジェクト指向プログミラングでアプリケーションを開発しようとすると、たいていなんらかのフレームワークを用いることが多いと思われます。

またもCocoa基礎ガイドからの引用ですが、フレームワークを用いたプログラミング方法について端的に表した一文がありました。

ライブラリコードを自分のプログラムに組み込むのではなく、自分のプログラムコードをフレームワークに組み込むのです。

Cocoa基礎ガイド > Cocoaプログラムへの動作の追加から引用。(PDFはP93)

実際にオブジェクト指向で作られているフレームワークを使ったことの無い人には想像しにくいと思うのですが、要するに、アプリケーションのテンプレートが用意されていて、それを改変するようにプログラミングしていって、アプリケーションを開発していきます。

少し話はそれますが、この状況はAppleのiLifeのアプリケーション郡と似ています。iLifeのアプリケーションは、たいていAppleが用意したすばらしいテンプレートや素材を元に、DVDディスク,音楽,映像,WEBサイトなどを作っていくようになっています。もちろん、そういうテンプレートの融通の利かなさに絶望感を抱くものもありますが、少なくともiLifeにはそれに関してのハズレは無いと思います。特にテンプレートが強制されるiDVDは最初は使えないと思ったものの、意外なところまでテンプレートを改変できたりして、驚いたというより、簡単にいい感じのエフェクトになったりして、使ってて面白いといった経験もあります。ヘルプファイルに、テンプレートを使用したくないときのこともきちんと書かれているのは気が利くところです。もちろん、一番シンプルなテンプレートを選んで…という解答でしたが。

結局何かと言えば、フレームワークを使ってプログラミングをする人は、上の引用部分で挙げたような、「フレームワークを使ってプログラミングをするのではなく、フレームワークに組み込んでプログラミングするということ」を念頭に置いてプログラミングすることです。これを実践するには、どうしてもフレームワークについての深い理解が必要になってきます。オブジェクト指向プログラミングの行き着く先は、フレームワークでプログラミングをするということが多くなると思うので、まずはフレームワークへの理解が、アプリケーション作成への一歩となるのではないかと思います。もちろん、基本的なプログラミングができることが前提の話ですが。そういうわけで、私もCocoa基礎ガイドをじっくり読んでいます。

そしてもひとつ、ライブラリ開発者の視点から見てみると、アプリケーションのテンプレートを提供すると言ってもいい、ライブラリの設計が非常に重要になってくるということです。ActiveBasicのライブラリは.NET Frameworkと同じようになるように開発を進めているのですが、正直な話、.NET Frameworkがいいと思ったことはありません。これは.NETでプログラミングしたことがないことに加え、まだ.NETの全容をつかめていないからというのが原因なのかもしれませんが、そもそも複雑過ぎて把握するのが難しいです。というか、MSDN探してもCocoa基礎ガイドに相当するものが見つからないので、そういうものがあるのならば、どなたか報告してくれたらありがたいです。

そういえわけで、.NETいい噂はあまり聞かないので、それに沿ってActiveBasicのライブラリを作成していることについては、少々不安になってきます。さらに、おそらく今後.NETと同じにできないところも出てくる可能性は高いです。そう考えると、いっそのこと完全に独自のライブラリを作ってしまおうという考えもなくはないのですが、なぜかここで思考停止します。おそらく、.NETより優れるライブラリを作れるわけがないとか、そんなことを無意識に考えているのかもしれません。とまあ、常々.NETに対するこんな疑念が尽きません。本格的に再参戦する来年までには、暇な時間を割いて結論を出したいところです。

自分のブログを見てると毎回ついつい長文になっているので、これはこれでどうなのかと思いつつ、今日は特に長文になってしまったしだいです。

指定イニシャライザ

Cocoa基礎ガイド>Cocoaオブジェクト>オブジェクトの作成 (apple developer connection)

Objective-Cは、名前から見てもオブジェクト指向言語ということが伺えますが、実は、オブジェクト指向でよく見かけるコンストラクタ,デストラクタの仕組みはありません。ただし、Cocoaを使う場合には、Cocoaがそれとほぼ同様の仕組みを、全てのオブジェクトのルートクラスであるNSObjectで実装しているので、コンストラクタとデストラクタはあると言ってよいでしょう。

上記のリンク先では、それらをイニシャライザ,deallocメソッドと呼んでいるようです。deallocメソッドは、オブジェクトが破棄するときに呼ばれるような仕組みになっていますが、イニシャライザは自分でメソッドを実行しなければなりません。一般的に、このようにしてオブジェクトを生成し、イニシャライザを呼び出します。

NSObject *object = [[ClassName alloc] init];

イニシャライザのメソッドは、必ず”init”というわけではなく、”initWithString”などの”init…”から始まるメソッドから好きな初期化方法を選んで初期化することが出来ます。オーバーロードのようなものです。

普通、Cocoaのライブラリでは指定イニシャライザというものがあり、クラスに複数のイニシャライザがあった場合、全てのイニシャライザの元になっているイニシャライザがあります。簡単にコードを書けば、こんなものです。

- (id)initWithName:(NSString *)name number:(int)num
{
    if( (self = [super init]) != nil )
    {
        //初期化
        myName = name;
        number = num;
    }
    return self;
}

- (id)initWithName:(NSString *)name
{
    if( (self = [self initWithName:name number:0]) != nil )
    {
    }
    return self;
}

- (id)init
{
    if( (self = [self initWithName:@"default" number:0]) != nil )
    {
    }
    return self;
}

クラスにいくつかのイニシャライザが存在した場合、最終的にはひとつのイニシャライザが呼ばれるようになっており、大部分の初期化はそのメソッドで行われます。この例では、”initWithName:number:”が指定イニシャライザになります。

さて、ここから本題なのですが、上記リンク先にところに、このような記述があります。以下、それの引用です。

サブクラスを定義するときは、スーパークラスの指定イニシャライザを識別し、サブクラスの指定イニシャライザの中でメッセージをsuperに送ってスーパークラスの指定イニシャライザを呼び出せる必要があります。.また、継承したイニシャライザについても何らかの方法で確実に対応しておく必要があります。そして、必要と思われる簡易イニシャライザをいくつでも提供できます。クラスのイニシャライザの設計時には、指定イニシャライザどうしがsuperへメッセージを送ることで互いに結び付いており、他のイニシャライザがselfへメッセージを送ることでそのクラスの指定イニシャライザに結び付いていることに注意してください。

要するに、サブクラスを作成したときにも、Cocoaと同じように指定イニシャライザを作って、他の独自で定義したイニシャライザはそれを使って初期化しろ、ということです。イニシャライザの大部分の処理は、指定イニシャライザにまとめろということですね。

結構適当にイニシャライザを定義したりしてると、次のようなコードになってしまうこともよくあります。

- (id)initWithName:(NSString *)name number:(int)num;
{
    if( (self = [super init]) != nil )
    {
        //初期化
        myName = name;
        number = num;
    }
    return self;
}

- (id)initWithName:(NSString *)name
{
    if( (self = [super init]) != nil )
    {
        //初期化
        myName = name;
        number = 0;
    }
    return self;
}

- (id)init
   if( (self = [super init]) != nil )
    {
        //初期化
        myName = @"default";
        number = 0;
    }
    return self;
}

あんまり初期化処理が多い場合は、さすがに指定イニシャライザを作って同じようなことをしますが、これくらいのインスタンス変数の初期化だと、ついこのようなコードを書いてしまうときがあります。

これが問題になるというわけではありませんが、後々のことを考えたり、コードの綺麗さで言ってみたら前者のが有利です。ここまで呼んでいる人は既にわかっていると思いますが、ひとつのメソッドに初期化処理がまとまっていたほうが、そこだけ見れば初期化で何をしてるかわかりますし、コードを修正するときにも楽ですし、いろいろと楽になります。

ところで、もう一度引用部分を見てみましょう。ひとつよくわからないところがあります。

サブクラスを定義するときは、スーパークラスの指定イニシャライザを識別し、サブクラスの指定イニシャライザの中でメッセージをsuperに送ってスーパークラスの指定イニシャライザを呼び出せる必要があります。…

サブクラスのイニシャライザでは、どうやらスーパークラスの指定イニシャライザを呼んだ方がいいということなのですが、これがよくわかりません。動作上問題ないのもそうですが、コード的に見ても何がいけないのかよく理解できません。もしあるとすれば、クラスのイニシャライザをルートクラスへとたどって見たいときに、指定イニシャライザだけを見て理解が速まるとか、そんなとこでしょうか?

とまあ、こんな感じでCocoa基礎ガイドには、Cocoaだけではなく、それ以外でも使えそうな考え方がたくさん載っていて、非常に役に立ちます。まだこの前読んだところから進めてないので、ゆっくりと確実に読んでいこうと思います。

Dashboard Widget が面白い

1週間くらい前から草稿にDateTimeクラスの紹介があるのですが、CP4ではうまく動かないメソッドがいくつかあるので、それらをどうするのか考え中です。関係ありませんが、今日はDashboard Widgetにはまっています。

Dashboard

Mac OS X 10.4で搭載されたDashboardですが、その頃はまだウィジェットが普及していなかったので知らない方も多かったと思いますが、最近はYahoo!ウィジェットや、Vistaのガジェットのなどで、だんだん普及してきたと思われるので、どんなものかはわかる方も多いと思います。

さて、Vistaのガジェットを知っている方は結構いると思うので、それとDashboardを比較して簡単に説明すると、上の画像を見ても分かる通り、デスクトップ上に表示されている訳ではありません。ガジェットは、サイドバーやデスクトップ上に置いて使いますが、Dashboard-ウィジェットは、デスクトップから独立したレイヤーに配置されます。普段は表示されていなくて、F12キーや、マウスの中央ボタンをクリックするとデスクトップの上に表示されます。つまり、デスクトップに被さるような感じでパッと表示されるのです。そして、適当なところをクリックしたり、F12キーを押すと、Dashboardからデスクトップ画面に戻れます。この動作は実に軽快で、逆に、これが重かったりしたらDashboardの利用価値はないと言ってもいいでしょう。より詳しいDashboardの説明は、Appleのサイトでご覧になれます。

Mac OS Xは基本的にあまり自分でデスクトップをカスタマイズするって感じのものではないのですが、このDashboardの空間は自分で自由に配置できるので、まさに自分の空間です。Leopardでは、自由にWEBからクリップを作成でき、それを配置できるので、さらにいろいろなことができそうで楽しみでもあります。

ひとつ、実用的で面白いウィジェットを紹介します。
Minutes

nitram+nuncaで公開されているMinutesです。これはかなりすばらしいウィジェットで、とても気に入っています。上のリンクから説明を見てもらえば速いのですが、単純なアラーム用途から、ファイルを開く動作を組み合わせたりすれば、もっと複雑な動作をさせることも可能になるかもしれません。

このウィジェットの魅力は、インターフェースと簡素さ、さらに動かす面白さです。時間を設定する時、円の接している三角形のマークをドラッグして、円の回りを回すのですが、これがなぜか面白いし、直感的な動作であり、すごく気に入っています。

インストールしたことのない人は、ぜひ一度試してみましょう。OS Xのユーザーならば、Safariからダウンロードし、ウィジェットの動作の確認することは、いとも簡単な動作だということは周知の事実かと思います。これもDashboardのいいところです。

Safari for Windowsが出たということは、もしかしたらDashboard for Windowsなんて物が出るかもしれないので、そのときはwindowsユーザーの方にもぜひ、このminutesを試してもらいたいです。ただ、Dashboard-ウィジェットは、javascriptからOS X独自の機能や、Cocoaも呼び出せるので、windows版が出ることは考えにくいのですが…

Minutesのように、インターフェースが美しく、かつ簡素であり、期待通り、またはそれ以上の動作をもたらしてくれるアプリケーションはすばらしいどころか、使っているうちに楽しくなってきます。私もこんなアプリケーションを作れるようになりたいと思います。

Macには、このような使っていて面白いというアプリケーションが、Windowsより多いような気がするので、そこもまたMacの魅力であるのかもしれません。

Cocoa基礎ガイド – 1

Cocoa基礎ガイドをpdfで、70ページくらい読みましたが、視力が落ちた気がしないでも無いのが悲しいところです。しかし、思った通り、かなり良いドキュメントで、このまま全て読んでしまおうと思います。

途中pdfで62ページに、オブジェクトの確保,解放についてのポリシーがありました。Cocoaプログラミングをする上では、必ず知っておかなければならないことです。

Cocoaオブジェクトのライフサイクル

オブジェクトを割り当てて初期化する([[MyClass alloc] init]など)ことによってオブジェクトを作成した場合は、オブジェクトを所有することになり、オブジェクトを解放する責任がある。この規則は、NSObjectの簡易メソッドであるnewを使用する場合にも当てはまる。

オブジェクトをコピーした場合には、コピーオブジェクトを所有することになり、コピーオブジェクトを解放する責任がある。

オブジェクトを保持した場合は、オブジェクトに対して部分的な所有権を持つことになり、不要になった時点で解放する必要がある。

あまり載せると転載になってしまうので、この辺にしておきますが、すべてのポリシーを見ることで、Cocoaのオブジェクトの管理について理解できることでしょう。

ところで、小さな歴史のところで、興味深い文章を見つけました。

アップルが1997年にNeXT Software(当時の社名)を買収したとき、OpenStepはYellow Boxになり、(Rhapsody としても知られる)Mac OS X ServerとWindowsに組み込まれました。その後、Mac OS X戦略の展開に伴い、最終的に「Cocoa」という名前に変更されました。

Yellow Boxの話はたびたび聞いたこともありましたが、こんなところから見つかるとは思いませんでした。こういう文章を見てしまうと、やはりCocoa for Windowsが出てもおかしくはないと思ってしまうわけです。

ニコニコ動画 マイメモリー過去

マイメモリー【過去】をリリースしました
やっとこの機能が追加されました。というわけで、さっそくPOSTリクエストをパケットキャプチャして調べてみました。

すると、どうやらPOSTリクエストのXMLに、属性が2つ新たに追加されています。上記ニコニコの開発ブログの、陰陽師の下の動画のコメントをリクエストする様子です。

<thread user_id="******" when="0" waybackkey="0" res_from="-500" version="20061206" thread="1183717949" />

以前と比べて、whenとwaybackkeyという属性が追加されたようです。
whenの属性の方は、時間を指定すればそのときのコメントを取得できるのではないかと考えますが、実際時間を指定してみても、正しく取得できませんでした。resultcodeで4が返されます。これは私のアカウントが有料会員ではないということが影響しているのかもしれませんが、わかりません。waybackkeyの方は、見当が付きません。

というわけで、有料会員の方いらしゃったら、ぜひパケットキャプチャでもして、実際に過去のメッセージへアクセスするときはどうしているのか、というのを調べていただきたいですね。まあ、近いうちに同じようなことを考えている人が、検証してくれるかとは思っていますが、、

Cocoa基礎ガイド

http://developer.apple.com/jp/documentation/japanese.html

Appleが公開しているデベロッパ向けのドキュメントのほとんどが英語で、日本語訳されているのは、上のURL先のドキュメントのみです。しかし、どれも非常にすばらしいドキュメントで、すべて読みたいくらいです。

今日は少し余裕があるので、Cocoa基礎ガイドを読もうと思っているのですが、pdfにして230ページくらい。このまま本にできるくらいの量です。パソコンだと紙ほどは読みやすくないので、印刷しようかと思ったのですが、家庭用の印刷機では、そんなに何百枚も印刷する気にもなれないので、しょうがなくパソコンで読もうと思います。

コメントから字幕は抽出できるはず

最近ニコニコ動画の話題が多いので、今年はとてもやってられそうにないHaskellのタグを消して、ニコニコ動画にしようか迷っているところです。

ちょっと前から思っていることですが、ニコニコ動画の字幕系のコメントは、抽出できるのではないかと考えています。ここで私の言う字幕というのは、BGMになっている曲の情報を下に固定表示するコメントをしたり、曲の空耳を含めた歌詞を下に固定表示したりするコメントのことです。

ニコニコ動画は、ご存知の通り一定のコメント数が溜まったら、古いコメントから消えてしまいます。どう考えても動画がコメントで埋め尽くされないようにする仕組みですが、良質なコメントが消えてしまうという弊害もあります。だから、これの対策にコメントの保存機能が追加されたのかと思いますが、このコメントが消えてしまうということを逆手に取り、良質な字幕系のコメントを抽出することができるのではないかと考えています。

どういうことかと言えば、あるコメントが消えてしまったとしても、その場所には、また同じようなコメントが付くことが多いはずです。つまり、同じ時間の場所に、同じようなコメントが付きやすいという性質があるはずです。特に、字幕系のコメントは、同じ場所で同じコメントが書かれることが多いと考えられます。

したがって、コメントが消えた数が多いほど、すなわちコメントが多いほど、字幕のコメントは、同じ時間に、ほぼ同じ文字列で投稿され、集積されていくことになります。もう見えてくると思いますが、動画に投稿されている全てのコメントを見ることができるのなら、わずかな時間の間に、ほぼ同じ文字列があったのなら、それは字幕として抽出することが可能ではないかということです。特に字幕には、コメントのデータにshitaという属性も付くので、他のコメントと見分けやすいはずです。

というわけなのですが、残念ながら、今のニコニコ動画は、最大で最新1000件までのコメントしかダウンロードすることができません。有料会員限定の機能になる予定の、時間を遡ってコメントを再生する機能が追加されれば、おそらく以前のコメントをダウンロードすることができるようになるはずです。そうすれば、これらの字幕抽出などが可能になるかもしれません。

これが有料会員限定しかダウンロードできないような仕様になっていたら、有料会員になるかどうか迷ってしまいますね、、、せっかくコメントが売りのニコニコ動画なのだから、コメントは全て無料でオープンにしてもらいたいですね。