Macintosh Developer Online (MDOnline)


2001年9月14日発行号 - Mailのバグが顕在化



また、学研のGetNaviから取材を受けました。今月発売号で談話の形で話が出るみたいです。この前に1時間ほど話をしてきましたが、ライターをずっとやっていると取材→執筆と言うのが当たり前でやってきているだけに、原稿をかかなくっていいのってこんなに楽なんかいな(笑)、と思ってしまいました。もちろん、ギャラは少ないですけど…。今回は、Macintoshのデザインについて語ってほしいということだったのですが、そういうネタだったら大谷さんじゃないのかと内心思いつつも、まあいいかってことで、話をしてきました。で、原稿を見ていないのでどうなっているのか分からないのですが、いちおうこれまでの変遷を話してきたものの、落ちとして持ってきたいのは、今後Macintoshのデザインはどうなるのかと言った話のようでした。まあ、難しい結論ですけど、地味で無難なスタイルだけど、ディテールにこだわりを持ったものでいくでしょう、などと話をしながらも、保険で(笑)iMacについては遊んでくるかも知れませんね〜なんてことにしてしまいました。まあ、無難な答えではないかなと…。一連の話をしながら、実はすっかりCubeのことを忘れてしまっていて、逆に質問をされてしまいましたけど、すっかり気持ちの上ではないものにしてしまっていることに気付いてしまいました(あはは…)。で、一般の人たちって、Cobalt Qubeなんてものの存在自体を御存じなかったらしく、それはそれで話題になったかもしれません。ま、だけど、製品のデザイン関連の特集だそうですが、パソコン関連はMacintoshでそれなりにページを取っているそうです。そういう見方ではまだまだMacintoshも存在感は十分にあるみたいですね。
明日は祝日ですが、この土日月については、少し積み残しがあるので、発行を行います。
(新居雅行 msyk@mdonline.jp


Mac OS XのMailは日本語の件名のエンコード処理にバグ、メーリングリストで問題

Mac OS Xに付属の電子メールソフトMailは、機能的にも十分なので、すでに使っている人も多いかもしれない。しかしながら、Mailで件名(Subject)に日本語の文字列を記述した場合、そこでのデータ変換処理に問題があることが判明している。ただ、その結果、件名が送信先で見えないという症状が出ているわけではないものの、いくつかの問題を引き起こしている。1つは、fmlのような高機能なメーリングリストサーバソフトを経由してメール配信を行う場合、受信して配信するメールにおいて件名をきちんと表示されなくなるという点だ。fmlは単にメールをそのままたくさんのアドレスに転送するのではなく、内容を取り出し、たとえば件名にメーリングリスト名や番号などを付加するなどの処理を行う。そこで、データ構造の解釈が厳密なために、正しく変換されていないMailによるメールの件名が文字化けなどの結果となって配信されてしまうのである。fml関連のメーリングリストで、そのことが詳細に報告されている。

◇Re: apple mail利用時にサブジェクトが文字化けする
 http://mikoto.sapporo.iij.ad.jp/~fukachan/mlarchives/fml-help/msg00853.html

こうした結果となる原理についてもこの機会に解説しておこう。何気なく使っている電子メールであるが、送受信時にはさまざまな変換処理が行われる。件名に限って言えば、次のような変換処理を行う。まず、電子メールソフトで入力した日本語の件名は、通常はJISコードでの表現にまず変換される。そのJISコード変換の結果を、さらにbase64という手法でコード化する。base64は1バイト文字のアルファベットと数字および一部の記号だけで構成されるものである。ここで、メールソフトでメールのソース、つまり実際に送られてきたメールそのものが参照できるのなら、Subject: で始まる行を見てほしい。日本語の部分で、「=?iso-2022-jp?B?」とあり、続けて暗号のような記号が並んでいるが、これは以後のテキストは“JISコードで記述した文字列”を“base64”でエンコードしたということを示している。そして、受信側では逆に、base64のエンコード結果からデコードを行い、たとえばJISコードでの文字列を得る。それをさらに、UNICODEとかShift-JISコードなどアプリケーションで必要な形式のコードに変換をして、利用者に見せるという具合だ。もっとも、こうした手法は原則であって、メールソフトごとにやり方が違う。たとえば、1バイトで表現できるコードをbase64の中に入れるのか入れないのかなどなど、実は処理がまちまちだったりする。さらに、base64以外にQuotedPrintableというエンコード方式がある。「=?iso-20220-jp?Q?」で始まり、=に続いて文字コードを16進表現で示す形式となる。base64をサポートしていないということはないのだが、QuotedPrintableをサポートしていないメールソフトがいくらかあるようで、メーリングリストにこの形式で流すと「文字化けして読めません」と言われることもよくある。たった1行の件名でも、こうした複雑な処理をメールの送受信で行っているのである。
Mac OS XのMailは、JISコードの文字列をbase64でのエンコードを行うものの、エンコード結果が正しく行われていない模様だ。Mailでのエンコード結果から解釈すると、余分なコードが入っていたり、あるいは必要なコードが抜けていたりといったことが見られるのは、前記のメーリングリストの文書で詳しく解説されている。ところが、クライアントで使う電子メールソフトの場合、不要なコードの無視などを行うとすると、正しく行われていないエンコード結果の件名でも、結果的に正しく表示されてしまうということにもつながる。そのため、問題が重要視されないということにもつながるかもしれない。fmlのようなサーバで稼動するソフトウエアでの問題が表面化しているが、結果的にはMac OS X利用者だけでなく、Windowsを含む多くのユーザに対して「文字化け」をさせる結果になっている。fmlの改良で対処するということにも着手しているが、やはりMailの動作を正しくするということが望まれるところだ。
なお、Mac OS Xにも含まれるfetchmailによってデコードを行う場合も、Mailから送られたメールについては同様にデコード時におかしな文字列が混在してしまう。fetchmailはUNIX系OSでは一般的に含まれているコマンドで、メールをPOPサーバなどからダウンロードするためのものだ。「no mimedecode」というオプションを利用してデコードを別のプロセスに任せることになるだろう。

base64:アルファベットの大文字小文字、数字、スラッシュ、プラスの64種類のキャラクタを用いてエンコードする方法。元の文字列などから3バイト取り出すと24ビットであるが、それを4つに分割する。すると、6ビットのデータが4つ得られる。その1つ1つについて、64種類のキャラクタのいずれかを割り当てることで、たとえば漢字を含む文字列なども64種類の1バイト文字だけの文字列になる。受信した側は逆の処理を行って、元の文字列を得ることができる。件名のエンコードだけでなく、添付ファイルのエンコードにも広く使われている方式である。

カテゴリ:電子メール


QuickSilver Power Mac G4で使うメモリはCL 3でもCL 2でもOK

QuickSilverタイプのPower Mac G4では、PC133タイプのDIMMをメモリとして使うが、CL(CAL Latency)はいくつのものが利用できるのかという問いに対する回答がTechnical Q&Aに掲載された。出荷時に搭載されているメモリはCL 3であるが、Uni-Nモジュール(内蔵のメモリコントローラ)はCL 2とCL 3のいずれでも使えることが記載されている。

関連リンク:QA1071: SDRAM, CAS Latency for the "Quicksilver" PowerMacG4s
カテゴリ:Technical Q&A, Power Mac


スクリプト機能拡張の作成方法の文書が更新、Mach-Oベースの機能拡張の作成方法を追加

PowerPCネイティブなスクリプト機能拡張の作成方法に関する文書が更新された。もともとは、1999年に公開されているが、当時はMac OS 8/9向けに、CFMベースでのスクリプト機能拡張を作成する方法だけが掲載された。改定により、Mac OS Xで利用するMach-Oベースのスクリプト機能拡張ファイルを作成する方法が記載されている。プログラム上でのいくつかのヒントも掲載されているが、Core FoundationのBundle等についての知識が必要になるだろう。

関連リンク:TN1164: Native Scripting Additions
カテゴリ:Technote, AppleScript


AppleEventのディスパッチテーブルをアプリケーション内で初期化する方法

アプリケーションの中にあるCarbon化したスクリプト機能拡張の呼び出しができないという点に対する回答がTechnical Q&Aに掲載された。イベントに対応するテーブルは、Mac OS Xではシステムが用意したテーブルを共有するのではなく、アプリケーションごとに持つことになる。しかしながら、パフォーマンス上の理由で、その都度初期化はされない。AppleScriptの初期化をOpenDefaultComponentを使って行えばできなくはないのだが、オーバーヘッドが大きい。ディスパッチテーブルの初期化はkASAppleScriptSuite/kGetAEUTイベントを受け付けたときに行われるので、アプリケーションにこのイベントに対応するハンドラを記述し、自分でイベントを送るという方法がいちばん適した方法である。この方法を行うためのサンプルプログラムも掲載されている。

関連リンク:QA1070: Loading Scripting Additions without initializing AppleScript in Mac OS X
カテゴリ:Technote, AppleScript