5月2007

ニコニコ動画のコメントをダウンロード

動画にコメントを付けられるサービスで有名なニコニコ動画ですが、以前からコメントのデータには少々興味があり、分析してみると面白いのではないかと考えています。そのためには、まずコメントのデータをダウンロードしなければならないのですが、いろいろ調べた結果、HTTP通信で取得できることがわかりました。

具体的には、動画のURLを”http://www.nicovideo.jp/watch/sm******”とすると、まず、”http://www.nicovideo.jp/getflv?v=sm******”を開きます。すると、メッセージ用のスレッドIDとメッセージサーバーのURLを取得することができます。それぞれ、thread_idとmsの値がそれです。

次に、メッセージサーバーにHTTPリクエストをしますが、POSTメソッドを使用し、次のような書式のxmlを”http://msg**.nicovideo.jp/api/”に送信します。

07/12/08くらいにメッセージサーバーのURLが変更されたようです。詳しくは「メッセージサーバのURLが変更されたようです」をご覧ださい。

<thread thread="**********" version="20061206" res_from="***" >

*のところは任意の値です。サーバーのアドレス、threadの値はthread_idなので、上のところで取得した値を入れてリクエストします。res_fromは、取得するレス数を指定します。仕様がよくわからないのですが、-1から-1000まで有効で、指定した値の符号を取った分のレスが取得できます。無効な値だと、250取得されます。

既にコメントを取得できるGetNicoNicomentというソフトがありますが、ダウンロードから分析をひとつのソフトでやりたいのと、なぜか昨日まで使えたのに、今日はまったくコメントを取得することができないので、ダウンローダーを試作してみました。

開発はCocoaです。NSMutableURLRequestがリクエストに関しては面倒みてくれるので、簡単に作成できました。

NSMutableURLRequest *theRequest = [[[NSMutableURLRequest alloc] initWithURL:@"http://msg**.nicovideo.jp/api/"] autorelease];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPBody:[[NSString stringWithString:@"<thread thread="**********" version="20061206" res_from="-500" />"] dataUsingEncoding:NSShiftJISStringEncoding]];

これで作成したURLを、NSURLDownloadやNSURLConnectionを渡せば、ダウンロードすることができます。

試作機:
ダウンローダ

URLを指定するときにシートダイアログを使ってしまっているので、テキストエディタにしか見えませんが一応ダウンローダーです。コメントは上のようなXML形式で取得されます。さすがに2chとは時代が違うので、フォーマットがしっかりしてますね。

ところで、res_fromの属性にいろいろな値を入れて試してはいるのですが、どうも最高1000レスまでしかコメントを取得することができません。もしかしたら、もっと他の属性があったりするのかもしれませんが、仕様は公開されていないので不明です。やはりコメントは全てダウンロードできないとデータとしては不十分なので、その方法が知りたいです。このまま探しても見つからないのなら、GetNicoNicomentのパケットでもモニターしみるつもりです。

参考にしたサイト:
モ(以下略
よしゆきのblog

Mac OS Xのペイント系ソフト

最近ActiveBasicの話題が少ないですが、おそらく6月に入ったらActiveBasicの話ばかりすると思うので、ActiveBasic目的の方はもう少し待ってください。

さて、今回はOS Xのペイント系ソフトの話です。さまざまなアプリケーションが標準で揃っているOS Xなのですが、なぜかペイント系のソフトは入っていません。それどころか、OS Xのペイント系のソフトを探しても、なかなか見つかりません。

とりあえず、フリーで見つけたのはSeashoreとか、そんなもんで数が非常に少ないです。

なぜ少ないのかなーと考えると、やはりMacを購入するだけの物好きな人は、AdobeとかのPhotoshopやIllustratorなどの製品のものを持っている人が多いのでしょうか?勝手な想像ですが、、

とりあえず、開発の観点から見れば、Cocoaではあらゆる線を描くNSBezierPathクラスなど、結構グラフィック系も充実している印象を受けます。適当なソフトがないならば、作ってしまいたいとは思うのですが、なかなか時間がないのと、技術も足りませんね。

Exposé

Mac OS Xには、Dockと呼ばれるWindowsのタスクバー的な役割も兼ねたランチャーがありますが、アプリケーションを切り替える手段は、これ以外にもいくつか存在します。ひとつは、cmd+tabです。これはWindowsのAlt+Tabと変わりありません。そして、もうひとつは今回紹介するExposéです。

ExposéはOS X10.4 Tigerから備わった機能で、比較的新しいものです。簡単にどんな機能かを説明すると、画面上のウィンドウを重ならないように並べて、その状態で選択すると、そのウィンドウが最前面にされるというものです。

通常画面:
画面

↓ F9キーでExposé ↓

Exposé

Exposéは通常F9-F11キーに割り当てられています。それぞれ動作が異なり、F9キーは画面上のウィンドウ全てを並べ、F10キーはアクティブなアプリケーションのウィンドウを並べ、そしてF11キーは全てのウィンドウを画面端に追いやって、デスクトップが見えるようにします。

F10でアクティブなアプリケーションのウィンドウを並べる:
Exposé

F11でデスクトップを表示する:
Exposé

並べられた状態のウィンドウをクリックすると、もちろんそのウィンドウが最前面に表示されるのですが、何かをドラッグしているときには、ドロップしたいウィンドウ上で1秒くらい待っていると、勝手にウィンドウが選択されるので、何かをドラッグ&ドロップするときにも使えます。

OS Xを使った後に、Windowsでない機能でつい使ってしまいそうになるのは、このExposéです。それほど便利な機能なのです。ところで、上の画面で、立ち上がっているアプリケーションより実際表示されているウィンドウが少ないのは、「隠す」という機能を使っているためです。画面が散らかることが無く、これもWindowsにも欲しい機能ですが、残念ながらタスクバーを採用しているWindowsでは「隠す」があっても意味が無いでしょう。

ちなみに、「隠す」については以前ブログで多少説明しています。
http://d.hatena.ne.jp/OverTaker/20060928/1159461929

ついでに、YouTubeに上がっているExposéの動画と、Appleへのリンクを貼っておきます。
YouTube – Mac OS X Tiger’s Exposé
アップル – Mac OS X – Exposé

IE7は入れない方がいいです

うちの家族共用のデスクトップPCはWindowsなのですが、この前とりあえずIE7をインストールしてみました。特にIE7がいいというわけでもなかったのですが、どこが変わったのか調べたくて、インストールしたわけです。

何の問題もなく無事インストール終了し、その後も順調にIE7を使っていました。ActiveXの許可をいくらやっても、上に警告が出まくる意味不明な挙動とか、結構問題はありますが、さすがに今日のバグは話になりません。

今まで自分のユーザーでしかログオンしてないかったので気づきませんでしたが、他のユーザーでログオンしてIE7を使ってみたところ、ページ上の検索ボックスにテキストを入力しようとすると、確実にIE7が強制終了してしまうのです。再起動しても直る様子はありません。

さすがにこれでは使い物にならないので、デフォルトのブラウザをOperaに変更しました。

Safari+Dashboard

Mac OS X10.4にはDashboardというウィジェット環境を提供するアプリケーションがありますが、ウィジェットというのはHTML+CSS+Javascriptで作られるのが普通です。よって、ブラウザとは多少関係があるわけですが、OS X10.5 Leopardでは、さらにブラウザと連携させた機能が追加される予定です。

アップル – Mac OS X – Leopard 先行プレビュー – Dashboard

その機能とは、SafariのWEB Clipです。WEBページの好きな部分を切り取って、それをウィジェットにしてしまう機能です。あまり凄い印象は受けない地味な機能かと思う方もいると思いますが、私はこの機能にかなり期待しています。

まず、簡単に思いつく使い方は、WEBページのニュースが表示されているページの部分を切り取って、ウィジェットとして表示させたりするような使い方です。例えば、Hatenaの注目の記事なんかの部分を切り取れば、従来のような面倒な方法でウィジェットを作成することなく、簡単にウィジェットとしてDashboardに表示できるでしょう。

次に思いつくのは、ちょっとしてWEBアプリを切り取ることです。例えば、私は日本語URLを変換するウィジェットが欲しいのですが、わざわざウィジェットを作るほどでもありません。そんなとき、このようなURL変換サービスのページを切り取って、ウィジェットとしてしまえば、ウィジェットを作ることなく、URL変換のウィジェットとして使えるようになります。
日本語JPドメインのPunycode変換・逆変換

最近はブラウザでいろいろなことができるようになっているので、このようにWEBアプリを他の場所で活用できるようにするのは、なかなかすばらしいアイデアかと思います。iPhoneも、Safariをほとんどそのまま搭載していて、WEBアプリを動かせるようにしたり、WEBアプリに特化したものを積んだりしているので、iPhoneはWEBアプリで機能を補うのでしょうか?

Leopardの発売は10月に延期されてしまった残念ですが、それだけ楽しみを感じられる期間が増えたと思えば、そう残念なことでもありません。6月のWWDCで今度は何が発表されるのか。それも楽しみです。

基本型をオブジェクトとして扱う

最近の非公開ABでは、Long型などの一部の基本型が、オブジェクトとして振る舞うことができるようになっています。つまり、以前問題にしていた、ArrayListにLong型などの数値を入れられるようになったわけです。

それとともにいくつか便利になっています。例えば、Long型に対してToString()が使えるので、簡単に数値を文字列として出力することができます。

Dim s = New String("string")
MessageBox(0, s.Length.ToString(), "文字数", MB_OK)

連続的にメソッドを実行できる記法も以前導入されましたし、なかなか書き味が良くなってきましたね。

WEB上の動画を小さく表示する方法(Mac OS X 10.4 later)

最近はWEB上でflv形式の動画を見る機会が増えてきましたが、動画を見るのはなかなか時間がかかったりするので、どうでも良さそうな動画は、他の作業をしながら見たい場合もあります。そういう場合、ちょっと動画のサイズが大きくて、ちょっと邪魔だったりもしますよね。

そんなわけで、今日は動画を小さく表示する方法を発見したので紹介します。

1.Quartz Debugを起動します。これは、OS X標準ではインストールされていませんが、付属のCDの開発ツール(Xcode)をインストールするとついでに付いてきます。どこにインストールされているのかはよく知らないので、Spotlightで検索して起動するのがよいでしょう。

spotlight

2.Quartz Debugを起動したらメニューからTools > Show User Interface Resolutionを選択します。すると、次のようなウィンドウが表示されます。

resolution

3.User Interface Resolutionで値を適当に変えて、ブラウザを起動しましょう。ウィンドウの解像度が変更されて起動するはずです。下の画像は、0.67くらいです。

firefox

いくつか補足事項があります。Safariでは画面が乱れるのでfirefoxあたりがお勧めです。ただfirefoxでも、上の画像でもわかるとおり、メニューバーが乱れたり、いろいろ描画に問題が出てくるところもあります。Quartz Debugに関しては適当にググって下さい。

4.このまま目的の動画のページまで行って再生します。普通の動画ではQuartz Debugで小さくすることはできないのですが、なぜかflv形式だと小さく表示できるようなので、ぜひ試してみてください。

ニコニコ動画を小さく表示してみる:
ニコニコ動画 -- 縮小表示

通常の大きさと比較:
比較

便利と言えば便利かもしれませんが、ちょっと小さくするためにやるのが面倒といえば面倒です。Quartz Debugが何かに使えないかと、それと動画を見てて思いつきました。実用的かは微妙なところですが、覚えておいて損は無いでしょう。

ちなみに、拡大して表示する方法はこちらです。
簡単に動画を拡大して見る方法

Haskellをインストール

というわけで、今日は早速Haskellのインストールに取りかかりました。Haskellと言っても、いろいろ種類がありますが、昨日紹介した本が使っていて、もっともポピュラーと言われている”Glasgow Haskell Compiler”をMac OS Xにインストールすることにしました。

本には、Windowsでのインストールの仕方と、Linuxのやり方が書いてありましたが、残念なことにMac OS Xのインストールの仕方が書かれていなかったので、自力で頑張ってみました。CUIの操作は苦手なんです…

せっかくなので、私のMac OS X10.4.9(PPC)でインストールできた方法を簡単に紹介します。ただし、私はそれほどこれらの操作に詳しくないので、何か間違っていることもあるかもしれないので、注意してください。

1.まず、本体のバイナリをダウンロードします。
GHC: Download version 6.6.1

2.次に、ダウンロードしたファイルを解凍し、インストールします。
インストールには、特に変わったコマンドを打ちません。ちなみに、私はCUIの扱いに慣れていないので、これが何をしているのかは、よくわかってないところがあります。解凍してできたディレクトリに移動して、以下のコマンドを打ち込みました。

$cd ghc-6.6.1
$./configure
$make
$sudo make install

3.このままインストールし、無事に動けば問題ないのですが、私の場合、いくつかのファイルが足りないので動作しませんでした。そこで、”libreadline”というものと、”GNUreadline.framework”を入れました。例えば、libreadlineが足りない場合、gchを実行したときに、次のようなメッセージが表示されます。

dyld: Library not loaded: /usr/local/lib/libreadline.5.1.dylib
  Referenced from: /usr/local/lib/ghc-6.6.1/ghc-6.6.1
  Reason: image not found
Trace/BPT trap

libreadlineは、X86OSGhc GHC – Tracのページに置いてあります。これを、/usr/local/lib/の中にコピーすればOKです。usr/local/libは、デフォルトだと書き込む権限がユーザにはありませんので、権限を変更してコピーしましょう。

一方、GNUreadline.frameworkというのはhets: libraries for Macintoshにあります。こちらから、GNUreadline.frameworkと GMP.frameworkをダウンロードし、/Library/Frameworksの中にコピーしましょう。詳しく調べていなので、これが何なのか分かりませんし、両方必要なのかもわかりませんが、とりあえずこれをコピーして動きました。

/usr/local/bin/ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.6.1

正しく動作できれば、上のようにきちんとバージョンが表示できます。

とりあえず、今日はインストールだけで終了です。これからHaskellの記事を書くことが多くなるかもしれないので、ブログのカテゴリにHaskellを追加してみようと思います。

Haskell

今日は本を買ってしまいました。本当は立ち読みで済ませたいのですが、近くの本屋に全然置いていない本なので、しょうがなく買いました。

4797336021 ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門
青木 峰郎 山下 伸夫
ソフトバンククリエイティブ 2006-06-01

by G-Tools

数ヶ月前からHaskellのような関数型言語に興味があり、私にぴったりそうな本がこれでした。やはりHaskellの本は数が少ないようで、これとあともう一つくらいしか和書ではないようです。2800円の割には、少々薄いかなーと思う本の厚さですが、中身をぱらぱら見てみる限り、かなり充実していると思います。

まだ全然読んでないので、早く読みたいところですが、その前に片付けておかなければならないことがあったり、そればっかり読んでいる暇もないので、暇を見つけたときにちょくちょく読んで行きたいと思います。

追記:Amazonアソシエイトのライブリンクで、いいキーワードが思いついたので、しばらく掲載してみようと思います。割とまともな本が自動配信されていると思います…

id型

Objective-Cでは、オブジェクトポインタを表すidというデータ型が存在します。全てのオブジェクトはid型で表せることは、以前ちらほら説明したかと思いますが、実はこの逆で、全てのオブジェクトはid型で成っています。id型は多少コンパイラやエディタに特別扱いされている型ですが、基本的にはヘッダで定義されている普通のデータ型です。そのid型の中身を今回は紹介することにします。が、id型は非常に奥が深いので、今回はその外観だけに留めておきましょう。

id型は、このように定義されています。

typedef struct objc_object *id;

objc_objectという構造体のポインタがid型として定義されているようです。つまり、オブジェクトはobjc_objectという構造体で成り立っていることがわかります。では、そのobjc_object構造体も見てみましょう。

struct objc_object
{
   struct objc_class *isa;
/* …インスタンス変数の値を含む可変長データ … */
};

objc_class構造体のポインタを表すisaメンバが定義されています。では、さらにobjc_class構造体の中を見てみましょう。

struct objc_class
{
struct objc_class* isa;
struct objc_class* super_class;
const char* name;
long version;
long info;
long instance_size;
struct objc_ivar_list* ivars;
struct objc_method_list** methodLists;
struct objc_cache* cache;
struct objc_protocol_list* protocols;
};

ここでいよいよid型の正体が明らかになってきます。だいたいのものが名前から何を表しているのか分かるかと思います。スーパークラスへのポインタがあったり、インスタンス変数やメソッドのリストなどがあって、いかにもオブジェクトを構成しているといった感じが漂っています。Objective-C的なものは、メタクラスとキャッシュそれとプロトコルリストあたりでしょうか。私もまだ詳しくは調べていません。

ここまで書いといて何かあれな気がしますが、詳細はobjc_class Objective-Cプログラミング言語に詳しく載っています。興味がある方はそちらをご覧下さい。

ついでに見てもらうと、このページの目次からたどることで、Objective-Cの様々なところが見えてきます。中には、Class_addMethods関数という、直接クラスをいじれるようなものがあって、非常に興味深いです。ぜひ試したくなるようなものがたくさんあります。

ちなみに、下リンク先のコラムは非常にお勧めです。これらを応用して何ができるのかまで書かれています。Objective-Cに興味をもったらぜひ読むべきでしょう。
ダイナミックObjective-C