2月2007

Parallels

Parallelsという仮想OSを動かすソフトをご存知でしょうか?このソフトを使うと、Intel MacでWindowsを動作させることができます。しかし、このソフトはそれだけではありません。Coherenceモードという、とんでもない機能があるのです。動画はBGM付きですので、特にびっくりする音ではありませんが、注意しましょう。

なんと、このCoherenceモードでは、Mac上でWindowsのソフトが動いているような感じにすることができます。もう、ほとんどMac上でWindowsのソフトを動かしているような感じですね。

さて、Leoperdのトップシークレットが気になりますが、こんな機能載せてきたり来ますかね?どうでしょうか。まあ、私のiBookはPowerPC G4なんで関係ないですけど…

http://www.parallels.com/

ActiveBasicに不足しているもの

一言で片付けようとすれば、「言語思想」がいいでしょうか。「アイデンティティー」でも良いかもしれません。

前回のミーティングの時に議題として考えていたものの一つですが、そのとき今回の会議では必要ないと思い、議題に挙げませんでしたが、やはり挙げとくべきだったと今更後悔しています。その議題はこうです。

“ABコンセプト!!(重要)”

たしか、1回目の開発者ミーティング後少し経ってから、2回目のミーティング終了して3日後くらいまで、デスクトップ上の第二回ミーティング議題を一覧にしていたスティッキーズに書き込んでいました。2回目ミーティングで最重要課題として挙げていたのは間違いありません。8つくらいあった議題で、これだけ赤色、なおかつ(重要)とまで自分で書いていました。

ここまで書いておきながら、なぜ2回目のミーティングの議題に挙げなかったか。たぶん、具体的な話から始まって、.NETをコピーするようなことはあらかじめ決まっていたので、今更これを提案するのはバカバカしくなってしまったのかと思います。

そして今更なぜこれなのかと言えば、つい最近大きな仕様変更の提案が出されたからです。いろいろ考えたのですが、やはり言語思想とでも言うべきでしょうか、結局のところActiveBasicをどんな言語にしたいのか、いや、もう言語というのはやめましょうか。ActiveBasicという開発環境は何を目指すのか。それがわからないと答えが出せないような気がするのです。

今までいくつもの仕様提案が出されてきましたが、それは明らかに言語として最低レベルの標準のものだったのかもしれません。だからすんなりと言語仕様に追加できました。しかし、今のActiveBasicはかなり十分な仕様を持っています。これ以上は、ActiveBasicをどんな開発環境を目指しているのか、それをはっきりとさせないと、決めようがない気がします。

みなさんは、ActiveBasicをどのような開発環境として捉えているでしょうか?また、ActiveBasicらしさというのは一体なんでしょうか?どこからどこまでがActiveBasicなのでしょう?どうしていけばActiveBasicなのでしょう?

元々は、というより今も山本さんが開発されている言語ですので、開発メンバーとしてもここまでは少々突っ込み過ぎな気がしますが、今こそ言っておくべきことなような気がして、ここにまとめました。

最後に、私もまだまだ若いので、短い経験を元に思っているのもですが、コンセプトやそれに準ずる何か、表現したいもの、訴えたい物が一貫している作品やらなんかは、すばらしい出来になっていることが多いです。それを見ることが出来なかった作品は、自分の目が節穴なのか、またはたいしたものではなかったということになるのでしょう。

デザイン変更することにしました

ブログのデザインを変更することにしました。
以前のも悪くはなかったのですが、どうしてもコードを表示したときにうまく表示できなかったので変更です。

white-space:preが設定されていないタグでも、エディットしているときの改行は有効になるので、preをやってしまうと2行分の改行がされてしまうようです。preをなくすと、今度はスペースがなくなってしまうのではずすわけにはいきません。

結局white-space:preでスタイルシートを使ってやるより、preタグを使ってコードは書くべきなんでしょうかね。

まあデフォルトで被っていたので、ちょうどいいかもしれません。これも一応デフォルトで用意されているもののひとつなので、暇があったらまた他のテーマファイルに変更するかもしれません。

ガベージコレクション

さてさて、最近ガベージコレクションがかなり重要になってきそうな感じで、いろいろと調べようと思っています。今春リリース予定のLeoperdに搭載されるObjective-C2.0が、ちょうどガベージコレクションを搭載するとのことで、どんな感じになっている調べてみました。

結局は、ほとんどドキュメントが見つからず、というか英語の記事は見落としているのかもしれませんが、おそらくあまり深いところまでは書かれていないでしょう。Objective-Cには、デストラクタみたいな文法的な物はありませんが、ルートクラスのNSObjectにdeallocがその機能として実装されているので、あるといってよいでしょう。ガベージコレクションが実装されるということは、そのdeallocが呼ばれるタイミングがわかりません。従って、Finalizeなどの何かの処置をとるのだと思い、それをObjective-C 2.0ではどのようにしているのか調べたかったのです。

Objective-Cにとって、ガベージコレクションは非常にうれしいものです。なぜなら、Objective-Cは全てのオブジェクトをポインタでしか扱わないからです。かならず下のようにして、alloc,init、解放にrelease、そして、複数のオブジェクトから参照するにはretainなど、メモリ管理の負担がかなり多いのです。

//id型はインスタンスを示すポインタです。

id object = [[NSObject alloc] init]; //生成,初期化
//何らかの処理
[object release]; //解放

//他のオブジェクトで保持したいとき
- (void)setObject:(id)obj
{
	//objに渡されたオブジェクトを保持する
	object = [obj retain];
}

一応負担軽減のために、NSAutoreleasePoolというものがあり、CocoaではNSAutorelesePoolが勝手に作られているので、オブジェクトにautoreleaseを送るだけでメソッドが終了したときに自動で解放されますが、ガベージコレクションほど使える物ではありません。結局autoreleaseも参照カウンタを使っているので、他のオブジェクトで保持したい場合は、retainする必要があります。

//こうすると、GUIに制御が戻ったときに自動解放される。
NSObject *object = [[[NSObject alloc] init] autorelease];

これはこれで、ポインタだけでやっているぶん、簡潔でいいのですが、やはりバグを誘発しやすいことは確かです。以前の生成と解放の記事で戸惑った通り、既に生成されているデフォルトのインスタンスオブジェクトを取得して操作する物や、オブジェクトの初期化方法によっては、自動的に解放されるものもあります。これらを間違えて解放したりすると、当然実行時にエラーになるわけです。ただ、Cocoaの命名規則は非常に優れているので、慣れてくればメソッド名で見分けは付くはずですが、それでもミスというのはするものです。

ということで、Objective-Cにガベージコレクションが搭載されることにより、かなりの負担を軽減することが出来ます。しかし、もちろんガベージコレクションにしたところでのデメリットがあります。既に分かる通り、パフォーマンスが落ちないかどうか。

この点に関しては、Appleは「心配するな、Xcode3.0はこれで作ってあるんだから。」と書いてありますが、実際どうかわかりません。しかし、Objective-Cはそれ以前に、既に動的すぎる言語にしている為に、メソッドの呼び出しが通常の関数の2-3倍となっているらしいです。ですから、高速な動作が必要な場合は下位互換のC言語で作ることが推奨されています。現に、Core FundationのCore Image,Core DataなどはC言語で作られています。インターフェースもC言語なのでObjective-Cとハイブリットで扱います。

これと同じように、ガベージコレクションを搭載しても事情はあまり変わりません。今までの参照カウント方式は引き続き使えるので、高速に動作させたい場合は今までの通り、楽したいならガベージコレクションを使えばよいことです。さらに言えば、もっと高速にしたい場合C言語を使えという訳です。

プログラミング言語というのは、開発者の負担を減らすことが目的だと思います。そうでなければ、アセンブリを使っていればよいことです。ですから、実行時にパフォーマンスを落とすようなことがあっても、それはそれで正統な方向へ進んでいると思います。

参考:Leopard Developer Tools Overview

ActiveBasic5.0CP版は用法・用量を守って正しくお使いください。

長らくリリースされ続けているActiveBasic 5.0 CP3ですが、正式リリースでないことを頭に入れて使いましょう。

今後仕様変更があることは大いに予想できます。CP4や正式版でコンパイルが通らなくなるかもしれません。

というのは軽い冗談ですが、そんなこともあるかもしれませんので、注意してください。

IAsyncResult把握

つい最近まで謎だったIAsyncResultをだいたい把握しました。インターフェースなので、使い方は見ればわかるのですが、実際中身はどうなっているのだろうということです。

IAsyncResultの中身はほとんどWaitHandleという認識で大丈夫でしょう。で、そのWaitHandleがどうも、シグナルがどうとか意味不明なことを言っていたと思いましたら、あったんですね、そういえばイベントオブジェクトというAPIが。

Win32APIのCreateEventで検索すれば、だいたいWaitHandleの意味がわかってきます。必ずしもCreateEventを使えという訳ではないと思うのですが、私がやろうと思っていたIOのところは、間違いなくこれを使っているはずです。

とまあ、とりあえずイベントオブジェクトが使えることがわかっただけでも十分です。

シートダイアログ

OS Xにはシート状のダイアログがあり、ウィンドウとくっついていて見失わず、見た目も良くてなかなかいいインターフェースです。今日は、それをCocoaで作成するのにちょっと苦戦しました。
sheet.png
これを作るには、まずInterface Builderでシートになるパネルを作成します。パレットのウィンドウの項目からパネルをドラックして作成しましょう。あとは普通のウィンドウと同じようにコントロールを配置したり、ウィンドウのイベント処理のクラスを作ったりします。

そしてコーディングですが、NSOpenPanelをシートで表示したことのある人は簡単です。まず、それと同じように- beginSheet:modalForWindw:modalDelegate:didEndSelector:returnCode:contextInfo:を使い、シートを表示するコードを書きます。

[NSApp beginSheet:inputPanel
   modalForWindow:appWindow
	modalDelegate:self didEndSelector:@selector(inputPanelDidEnd:returnCode:contextInfo:)
	  contextInfo:nil];

inputPanelは表示するパネル、appWindowは親ウィンドウです。ウィンドウもアウトレット接続できるので、簡単に取得できます。

デリゲートはひとまず置いといて、先にパネルの方を実装しましょう。上の画像の例では、CancelとOKボタンがあるので、それぞれのイベントを作ります。とりあえず、シートを閉じる例です。

- (IBAction)cancel:(id)sender
{
	[inputPanel close];
	[NSApp endSheet:inputPanel returnCode:NSCancelButton];
}

- endSheet:を使えばシートは終了するのですが、シートが閉じないので注意が必要です。私はここではまりました。returnCodeはデリゲートのところで取得できる値なので、自由に設定しましょう。ちなみに型はintです。

そして、- endSheet:をやったとき、さっきのデリゲートが呼ばれます。

- (void)inputPanelDidEnd:(id)panel returnCode:(int)returnCode contextInfo:(void *)contextInfo
{
	if (returnCode == NSOKButton) {
		NSLog(@"OK");
	} else {
		NSLog(@"Cancel");
	}
}

とりあえず、サンプルなのでこんなものです。今回は、cancelボタンのアクションでシートにcloseをしていますが、ここのpanelから閉じることも可能です。NSOpenPanelではNSOpenPanelが閉じてくれるようなので、それに合わせました。また、ここで例えば今回のシートのような、コントロールの値を取得したい場合は、NSOpenPanelのようにNSPanelから継承したクラスを作成して、ここのpanelから値を取得できるようにすればOKです。

簡単な概要的な説明になってしまったので、後で機会があればちゃんと書こうと思います。ちなみに、NSPanelのウィンドウは、通常のウィンドウと違い、closeしてもreleaseされません。また、通常のウィンドウでもsetReleasedWhenClosed:NOとすることで、解放されないようにできます。これで、何回シートを閉じても呼び出すことが可能になる訳です。

Wiiはお茶の間にインターネットを普及させる

去年の12月にWiiについての記事を書きました。(Wiiが画期的だったのはインターフェースだけではない)そのときに、Wii connectについてはまたの機会と書きましたが、今そのことを書こうと思います。

さて、あの時はWiiについて詳しく知らなかったので、Wii connectで済ませてしまいましたが、Wii全体のインターネット関連についてです。

やはり注目は、Wiiチャンネル。あれは写真チャンネルなど、オフラインのものもありますが、ブラウザ、天気予報などのネットメインのコンテンツになると思われます。どれも見た感じは完成度は既に高めな印象を受けてしまうのはなぜでしょう。特に、あまりハイスペックでないのにも関わらず、写真チャンネルの画像処理はなかなか驚くものがあります。実際に見たことはありませんけど…

天気予報、ニュースなど、手軽に情報にアクセスできるもの、また、最近出てきた投票チャンネルなど、実用的なものからお遊びまで、今後さまざまな物が出てきそうです。そのうち、意外な使い道のチャンネルが出てきたりしそうで、結構期待しています。

インターネットチャンネルは、Operaブラウザです。PCとは違い、やはりかなり簡素化されたインターフェースになっています。ネットを閲覧する上で必要なFlashなどは一通り揃っており、Ajaxとかも普通に動くらしいです。

それを利用して数日前登場したのが、はてなRimoですね。まだまだチューニングが必要な感じがありますが、方向としてはかなりいいと思います。こういう風に、今後もWii対応のコンテンツが増えてくると、さらに面白いことになるのではないでしょうか?WiiリモコンもJavascriptか何かで使えるみたいなんで、ブラウザ上でゲームも作れそうですね。

そして、Wiiの一番の強みは、手軽さに尽きます。完全に電源は切らないので、起動は一瞬らしいですし、インターフェースも誰でも使える設計です。値段も2万切ってもいいんじゃないかと思いますが、とりあえず2万5千円とお手頃。デザインもテレビの隣に置いても気にならない。

これだけ簡単手軽にWEB2.0のプラットフォームを用意できているものはWii以外に見当たりませんし、それだけではなく、Wii独自の要素も十分あります。

というわけで、MSのXbox Liveだとか、PS3、デジタル放送、インターネット見れるテレビなんてものは、全部Wiiに持ってがれちゃいそうですね。Apple TVがどこまで考えているか知りませんが、それ以上ですね。

今後もWiiの動向に目が離せません。

WX320Kが欲しくなってきました

どこからともなく評判いいと聞こえてくるWX320K。評判いいとだけ聞いて、何がいいのかはあまり聞きませんが、いろいろブログを見て回った限り、全体的に完成度が高まったということでしょう。

私が機能追加でいいと思ったのは、Java(MIDP-2.0)搭載,RSSリーダー,本体メモリ16MBに増量,W-OAM対応、とこんな感じです。欲しい機能は、Bluetooth,ベル打ち入力です。まあ、Bluetoothはあったほうがいい程度ですが、ベル打ちはぜひ対応してほしかったです…

これらの追加された機能で特に注目したいのが、Javaです。昔Docomoを使っていた頃、Javaで何かしようと、特にネットと連携してやりたかったのですが、残念ながらDocomoのアプリケーションは、指定したサーバーひとつとしか通信できない制約がありました。しかし、Wiilcomが採用しているJavaは、デフォルトの接続先(AIR-EDGE)ではできませんが、通信をPCのモバイル接続(というかプロバイダ変更?)にしてやれば、アプリケーションからどこにでも接続できるようです。

つまり、自由にアプリケーションからネットに接続できるのです。これにより、重くて気に入らない標準ブラウザではなく、自作で軽くしたブラウザなんかも開発可能です。Docomoなんかのアプリケーションは、中継サーバーを使って対応していますね。あれはあれで、中継サーバーである程度圧縮とかして、軽くする工夫がなされてると思いますが、個人でやる分には、中継サーバーなんて作っていられません。フルブラウザじゃなくも、標準のRSSリーダーが気に入らなければ自作できますし、2chブラウザとかも作れますね。ところで、内部メモリ16MBは自由にアプリケーションから使用できるんでしょうかね?

まあ、他にも結構完成度の高い端末に仕上がってそうなので、それだけでも魅力的です。ぜひ機種変更したいのですが、問題が値段。19800円はいくらなんでも高いです。せめて10000円切ってほしいです。さらに、ハイエンドモデルが春頃に出ないかと心配です。でも、完成度は低いと予想できるので、WX320Kといい勝負になるかもしれないですけどね。

ちなみに、接続先変更した場合、リアルインターネットプラスなどのパケット定額の、定額の対象になるので、パケット代で心配することはありません。ただし、別途でプロバイダとの契約が必要になりますので、料金が必要になります。普通は自分が契約しているプロバイダにモバイル接続サービスがあるので、ADSLなどで契約している場合、追加月数百円で接続できるようになります。

簡単に動画を拡大して見る方法

最初に断っておきますが、Mac OS Xで動画を拡大して見る方法です。

最近WEBなどで動画を良く目にするようになったと思います。YouTubeは拡大してみるボタンがあるものの、動画を見てる途中で変更できなかったり、そもそも動画を拡大できないやつもあります。

そんなわけで、OS X標準の拡大機能をオンにします。デフォルトでもオンだった気がしないでもないですが、システム環境設定のマウスのところで設定することが出来ます。一番下のところにチェックを入れると有効にできます。トラックパッドの設定のところにも同様の項目があります。
mouse.png

この機能をオンにすることで、スクリーンの拡大が自由自在に行えます。この機能を使って、ちょうどいい大きさに動画を拡大するわけです。拡大はかなりの倍率までできるので、特に困らないと思います。

拡大が終わった後、忘れてはならないことがあります。それは、カーソルが邪魔になるということです。しかし、これは簡単に非表示にすることができます。キーボードのカーソルキーを適当に押すと、カーソルが消えるのです。これでカーソルが動画の上で表示されることなく見ることが出来ます。

当たり前ですが、動画の解像度はそのままなので、拡大すればするほど粗くなります。そんなわけで、私は普通の大きさで見ることが多いのですが、忘れ去られているけど意外と使える機能なので、紹介してみました。

ちなみに、フルスクリーン表示の時にもControl+スクロールで拡大できたり、ほとんどの場所で使えるので、よく見えない時はぜひ活用しましょう。