HMDT Journal
April, 2007
Apr 24
シイラ2.0の新機能(2) - 黒パネル
今日のシイラ2.0新機能紹介は、黒パネル。AppleのiLifeなどで使われている、黒い半透明のユーティリティパネルだ。これに、ブックマークや履歴を表示するようにした。

シイラ1.0では、ブックマークはサイドバーに表示していた。これは、画面の狭いマシンだと使いにくい。それに代わるブックマーク表示領域を、ああでもないこうでもない、と長く議論重ねた結果、たどりついたのが半透明フローティングパネルを使おう、という結論。作るの大変だったけどね。
黒パネルの利点は、ブラウザウィンドウに重なっても邪魔にならないところだね。後ろが透けて見えるだけで、プレッシャーは大きく減る。

他にも、ブラウザウィンドウを表示していなくても、黒パネル単独で存在できる、っていうのもいいところだ。
黒パネルは、ブックマーク、履歴、ダウンロード、RSSで使われているよ。また、これに関するソースコードを集めたものを、HMBlkAppKitとしてフレームワークを公開している。開発者で興味ある人は、そちらもどうぞ。
Apr 23
ものすごく間があいたけど、シイラ2.0をリリース。1.xから比べると、山のような新機能を搭載して、完全に新しくなったシイラだ。

とにかく、たくさんの機能があるので、新機能の紹介のページは現在作成中。その間に使ってみてくださいな。
ただ、こっちのHMDTの方でも、少しずつ紹介していこうと思う。まずは、PageDockから。
シイラ2.0の新機能(1) - PageDock
PageDockは、従来のタブに代わる新しい複数ページの管理方法。ブラウザの下の方に、Webページのサムネイルつきでずらっと並ぶ。Mac OS XのDockに似ているからPageDockだ。たくさんページを開いても、内容が一目瞭然で分かるぜ。

ページの読み込み状況も、PageDockで表示する。まるで、水が満たされていくように、読み込み状況が進行する。
もちろん、従来のタブもサポートしている。環境設定で切り替えることができるよ。

Apr 22
CoreDataで、複数プロセスから同じファイルをいじるテスト中。
2つのプロセスを立ち上げて、同じファイルをもとにした永続スタックをそれぞれ作成。この場合、片方のプロセスがデータを変更して保存すると、もう片方ではそれを反映する必要がある。
まず、データを保存したぜ、ということを通知する必要がある。これは、プロセスをまたいでいる場合、通知する手段は提供されていない。同一プロセスなら、NSManagedObjectContextDidSaveNotificationを使えばいけるみたいだけど。NSDistributedNotificationCenterなどを使って、別の方向からアプローチする。
次に、永続スタックの更新。これは、いままでの変更を無視するかマージするかで、変わってくる。簡単なのは、いままでの変更は無視して、ファイルのデータを反映させてしまうこと。これには、NSManagedObjectContextのresetを呼べばいい。
ただし、resetを呼ぶと、そのコンテキストとバインディングしているNSArrayControllerやNSTreeControllerもリセットされてしまう。そこで、コントローラのprepareContentを呼んでやる。これでバッチリだ。
prepareContentって、いままで使い道が分からなかったけど、こういうときに呼んでやればいいわけね。
Apr 19
昨日は、手持ちのソフトのテストのために、アップルのコンパティビリティラボに行ってきた。このラボは、ソフトの互換性を試すために、いままで発売されたMacおよび関連製品を集めてあるところ。最新のMacProから初代PowerMacまでそろっている。スパルタカスとかもあったし。
MacPro、iMac、Mac miniを引っ張りだしてきてテスト。GPUの違いで、微妙にOpenGLの挙動が違うような気がするー。でもよく分かんねー。
このラボにいくと、いつも感心するのがリストアHDD。
テストするときは、いろんなソフトをインストールするんだけど、開発途中のものだから、帰るときには全部消していかないといけない。また、次に使う人のためにも、システムを初期状態に戻してやらないといけない。それにはOSの再インストールをすれば簡単だけど、いちいちそんなに時間もかけてられない。
そこで登場するのが、リストアHDD。これをつないで、そのHDDからシステムを起動してやると、自動的にマシンのHDDをリストアしてくれるというものだ。これ、便利ー。この考え方を拡張して、自分の好きな状態のシステムをHDDに保存しておいて、いつでもリストアかけられたらいいのに。
そういうツールはあるのかな?もう、すでにありそうだよな。
Apr 16
Cocoaセミナー、今期もやります。初級が4/24、中級が4/27、上級が5/15っす。興味ある方は、お早めにお申し込みを。各社、新人君たちが入ってきている季節でしょうが、新人研修にぴったりの内容です。
内容は、いままでやってきたものと同じです。リピートセミナーです。もう一年ぐらいやってますな。
長くセミナーやっていますが、どういった方にお勧めなのか、代表的なアンケートの感想から紹介すると。
『手順を操作しながら説明するので、分かりやすかった』
Cocoaプログラミングでは、XcodeとInterface Builderを酷使することになるわけで。特に、Inteface Builderの操作は、D&Dを多用する直感的なものなので文章で説明すると分かりにくい。そこのところを、正面の大きいプロジェクタで操作しながら演習を進めていくので、操作手順はバッチリだ。
『事前に資料が配布されるので、予習できるのが良かった』
セミナーで使う資料は、すべて事前に配布する。というか、Appleのサイトから誰でもダウンロードできるし、過去のセミナーのビデオもある。というわけで、やる気のある方は、予習しておくことができる。それからセミナーに参加すればバッチリだ。
でも、逆に言えば、
『配布された資料通りの内容なので、セミナーに参加する意味が無かった』
っていう方もいる。セミナーでは、資料の内容しかやらんです。だから、自分で資料を読んで理解できる方は、セミナーに参加しなくとも大丈夫。どんどん自分でプログラミング進めたってください。
あと、
『いろんな質問とその解答が聞けて楽しかった』
というのもある。このセミナーは、演習の時間と同時に、質問の時間もたっぷりとってある。セミナーの内容に関するものだけでなく、Cocoaに関する事や、Macに関する事や、プログラミング全般に関する事など、なんでも質問オッケー。ちなみに、セミナーで質問するとよくある、「その質問は調べまして、後日解答します」ってのをやったことないね!いや、一回あったかな。一回しかないね!
質問がたくさん出るかどうかは、その回による。たくさん質問が出る回は、会場の雰囲気がなごむね。ということで、参加される方は、せっかく会場まで足を運ぶんだから、気になった事はすべて質問してくださいな。
そういや、セミナーの続編としてLeopard編をやるという話があったけど、来期ではなくなったかな。
Apr 15
一月ほど前のCocoa勉強会で、きりかノートの木村さんの発表にあったSparkle。ずっと気になっていた。いや、勉強会には行けなかったんだけど、公開されているスライドを読んだりして。
Sparkleは、ソフトウェアのアップデート通知を実現するフレームワーク。Appcastingっていう仕組みを使う。これは、Podcastingと似たようなもので、ソフトウェアの更新情報を、RSSとして配信する。それを読みにいって、更新されたらダウンロードしてインストールするっていうもの。いろんなアプリケーションで使われているので、目にした事のある人も多いはず。
これを組み込んでみた。もちろん、シイラに。すると、おぉ、ちゃんと更新からインストールまで実現できてる。これで、2.0からはアップデートも完璧だ。
Sparkleに関しては、上記のきりかノートさん、またはitoke's Labさんとかが、参考に。
シイラの2.0は、あと一週間くらいで出ます。たぶん。
Apr 14
新作の本『楽しいCocoa』の初校ゲラが上がった、と編集さんから連絡が入る。
初校は、ただの原稿だったものがレイアウトされてくるので、いつも楽しみ。
そういや、この本でのLeopard対応は、完全になくなったな。一応、Leopardが四月ぐらいに発売されたときのために、Objective-C 2.0とかのことも書いていたんだけど、その辺はバッサリ削除だな。あー、はっきりしてよかった。
Apr 13
Leopard発売延期。必死こいてLeopard対応を進めていたけど、いきなりはしご外されて、怒り心頭というか、正直ほっとしたというか。今年のWWDCは、どんどん目玉が無くなっていくような。
ジョブズなら、10月も春にしてくれるに違いない。
会社の方は、今度は社労士さんと打ち合わせ。雇用契約やら保険やら年金やらについて、いろいろとお話。
いろいろ会社と関係ない話も聞いたんだけど、いま一番のホットトピックは、例の離婚しても年金半分もらえる制度(『離婚時の厚生年金の分割制度について』)らしい。年配の女性から、「いくらもらえるのか?」という問い合わせが殺到しているそうな。逆に、年配の男性からの、「いくら取られるのか?」という問い合わせもあるって。
具体的な金額は、社会保険事務所に行くと教えてもらえるそうなので、気になる人はGO!
Apr 12
前に一緒に仕事をしたよしみか、エルゴソフトさんから、egword Universal 2の製品サンプルをいただく。ありがとうございます。ありがたく使わせていただきます。
egword Universalは、初代から愛用中。近日発売になる『楽しいCocoa』も、全部これで原稿書きましたぜ。
原稿書くだけならテキストエディタでもいいんだけど、本にするとなると太字や等幅文字といったフォントの指定もしたい。TeXを使う根性もないので、さっくりワープロソフトを使ってます。
インストールしてあるワープロソフトは3つ。egwordとWordとPages。Wordは、生理的にあわないので使わない。単なる好き嫌いの問題です。Pagesは、楽に使えるんだけど、日本語が変なところで改行されたり、表を編集するときの挙動が怪しかったりするので、ちょっと敬遠。egwordが安心して使えます。
というわけで、egword Universal 2をインストール。
最初に、名前や住所といった登録情報を入力する。。。うん?データはアドレスブックから引っ張ってくるんだけど、入力画面ではアパート/マンション名が表示されていないのに、確認画面では表示されている!バグか?バグなのか?バグみたいのがありましたよー。
バグレポート終了。ふぅ。
で、egword起動。大変素早い。
起動すると、見慣れた画面。一見、どこも変わっていないように見える。あ、ツールバーに一つボタンが増えているな。この姿勢は、バージョンアップするたびに外見をガラッと変えないと気が済まない、Appleとは対象的だね。
使い勝手もおなじみの軽快さ。ま、これから使い込んでいって、バージョンアップした機能を楽しんでいきますよ。でも、先月までガリガリ原稿書いていたところだから、当分書きたくないかも。
Apr 11
会社の登記簿謄本来た。あれすか。履歴事項全部証明書っていうんですか。「全部証明書」って、何か小学生の作った言葉みたい。
税理士さんとも打ち合わせ。会計や簿記の言葉は、エンジニア稼業しかやったことがないので、まったく馴染みがない。頭がクラクラしてくる。漢字多すぎ。
会計ソフトの操作に付いて説明を受けていたら、「じゃ、ちょっとさっきのインターネット開いてください」と言われて、しばし固まる。少し考えた後、「あぁ、ブラウザのことですね」と言ったら、「ブラウザっていうんですか」と言われる。おぉ、カルチャーの違いだ。
そういえば、業務の説明をするときに、「Webブラウザとかも作ってます」って言ったら、非常に腑に落ちない顔していたな。ブラウザが通じていなかったわけね。「インターネット作ってます」って言えば通じたのかも。
Apr 8
GUIを持つシステムでよく使われるインタフェースに、「マウスがそのエリアに入ってきたら表示を変える」ってものがある。表示を変更する事で、その領域がクリックやドラッグで操作できる事を示すわけだね。このインタフェース、Windowsではよく見かけるけど、Macではそれほど頻繁には見ない。ウィンドウの左上の3つ並んだボタンぐらいか。最近は、Safariのブックマークバーや、Mailのツールバーボタンなど、Appleアプリケーションにもジワジワ取り入れられている。
プログラムでこの手のボタンを実現するには、その領域にマウスが入った/出た、というイベントを知る必要がある。Cocoaでは、デフォルトではこれは送られてこない。有効化するには、setShowsBorderOnlyWhileMouseInside:っていうメソッドを呼ぶ必要がある。これにYESを渡す事で、mouseEntered:、mouseExited:っていうメソッドが呼ばれるようになる。
で、これを使ってマウスオーバーで表示が変わるボタンを作っていたんだけど、うまく動くときと動かない時がある。なぜじゃー、と調べていたんだけど、どうやらこのメソッド、ウィンドウが設定されている状態で呼ばないと駄目らしい。つまり、ボタンを作って、addSubview:でどっかのビューに入れてやってウィンドウと関連づけてから、呼ぶ必要がある。そういうことか。そこで、viewDidMoveToWindow:の中で呼ぶようにしてやった。これなら、オッケー。
ということは、マウストラックの管理はNSWindowでやられているということなんだろーか?
ちなみに、Cocoaではふとしたはずみでビューとウィンドウの関連が切れることがある。たとえば、タブ。NSTabViewを使っていると、表示されていないタブ上にあるビューは、ウィンドウとの関連が切れている。表示するときに、あらためてウィンドウが設定される。
これは、背面にあるタブのビューを切り離す事で、リサイズなどのパフォーマンスを上げているんだと思う。便利なんだけど、知らないとハマることがある。
Apr 4
Mac OS Xでは、フレームワークにインストールパス(またはインストールネーム)っていうものがある。そのフレームワークがどこにインストールされているかを示すものだ。アプリケーションにフレームワークをリンクすると、そのパスが記憶されて、起動時にそこに探しにいくことになる。たとえば、Cocoaのインストールパスは、「/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa」ってことになる。
フレームワークがシステムの決まった場所にあればいい。そうじゃなくて、アプリケーションの中に埋め込みたい場合は?インストールパスに「@executable_path」を使う。これを使うと、実行ファイルからの相対パスで探しにいく。たとえば、「@executable_path/../Frameworks/Growl.framework/Versions/A/Growl」としておくと、アプリケーションパッケージの中の、Frameworksフォルダに入れておける。
ここまではいい。では、次の問題。フレームワークをプラグインの中に埋め込みたい場合は?もっと具体的に言うと、Dashboardのウィジェットで、プラグインの中にGrowlフレームワークを埋め込みたいんだけど、どうすればいい?この場合、実行ファイルはウィジェットを実行するDockになるので、@executable_pathでは探しにいけない。
そこでTigerから登場したのが、「@loader_path」。これを使うと、バンドルを読み込んだ位置から探してくれる。これを使えばオッケーだ。
でも、インストールパスを設定するには、コンパイルする必要がある。ソースコードが公開されていない、既存のフレームワークではどうすればいい?そんなときに使うのが、「install_name_tool」コマンド。これを使えば、インストールパスを変更することができる。ただし制限があって、短い名前にしか変更することができないらしい。@executable_pathから@loader_pathへの変更は、うまいことに、オッケー。逆はできない。一方通行かよ。
ということを、この間ウィジェット作ったときに調べ回った。同じ問題に遭遇していた人は多かったようで、Cocoabuilderでのここの議論がその解答をのせていた。あと、myb designさんも、同じ問題だったようで。やっぱり、みんな同じところでひっかかるのね。
Apr 2
ご報告。
2007年の4月2日から、HMDTは会社になります。HMDT株式会社っす。エイプリルフールじゃないよ。
これで肩書きが、いままでフリーランスプログラマだったのが、代表取締役社長になるぜ。社長と呼んでくれ。CEOでもいいよ。
会社になったのを機に、若干名の社員を加える予定。これからは開発能力がグンと上がるので、一緒にお仕事をしようという方、Macでの開発案件を抱えている方、mkino@hmdt.jpまでメールお知らせください。
当面は、メインのプロダクトであるシイラに注力。
会社の作り方は、簡単でした。
最初は自分でやろうと思って、いろいろ調べた。やらなきゃいけないことは分かったけど、いざやろうとすると、細かいところが分からん。そして、めんどくせー。
という訳で、素直に司法書士の方に頼んじゃいました。頼むと決めちゃえば、若干のヒアリングだけやって、後は自動的にポンポンポンっと。基本的に、お任せでおしまい。
知り合いには全部自分でやったという人もいたけど、今思うとすげー。
きりかノートさんの「サヨナラInputManager?」で、LeopardではInputManagerがふさがれるらしい、ということを知る。
InputManagerは、きりかノートさんのとこにあるように、もともとはテキスト入力を行うためのもの。でもその用途では誰も使っていなくて、そこに置いたバンドルが自動的に読み込まれる事を利用して、アプリケーションをハックするのに使われている。SafariStandとかが、これを利用している。ハックするには便利だし、有用なプラグインもたくさんあるけど、何でも読み込んじゃうからセキュリティホールになると言われ続けていた。
Leopardでは、そんなInputManagerをふさぐ、またはデフォルトではオフにしてダイアログを表示して有効化するかどうか問い合わせる、ことになるらしい。まず、もともとの役目であるテキスト入力システムの追加は、InputManagerでやるのではなく、別のパスが用意されるんでしょう。それよりも問題は、多くのSIMBL系プラグインが使えなくなる事。Appleが意図的にこれを潰そうとしているのかどうかは、知らない。まぁ、アプリケーション開発者の立場から潰したくなる気持ちは分からんでもないけど。プラグイン開発者はもちろん困るし、ユーザも便利なプラグインが使えなくなると困る。
名目がセキュリティホールを潰すという事ならば、InputManagerは何でも自動的に読み込んでしまうのが問題なんでしょ。なら、ユーザが明示的にプラグイン(というかバンドル)を読み込めるような機構を作るべきじゃないかな。バンドルの動的な読み込みが、CocoaというかObjective-Cの面白いところだし。

