2006-07-11
目次
「Wonderful Server Life」 第10回 田畑 英和
これまでMac OS X Serverのインストールや初期設定について解説してきましたが、今回は初期設定についての補足です。前回は初期設定を自動化する方法をご紹介しましたが、初期設定のデータの扱いで注意が必要な部分があります。
どのような注意が必要かといいますと、設定情報に日本語のデータが含まれた場合に注意が必要になります。サーバの自動設定の流れをまとめますと以下のような流れになります。
・サーバの自動設定手順
1)サーバ機とは別のMac上で「サーバアシスタント」を起動
2)「サーバアシスタント」でサーバの設定情報を入力して保存
3)サーバをインストール
4)あらかじめ保存しておいた設定情報をもとにサーバを自動設定
※3)を1)2)の前に行うこともできます。
このとき手順2)で保存するサーバの設定情報ですが、設定情報に日本語のパラメータが含まれていた場合、手順4)の自動設定で正常に認識されなくなります。しかし、日本語のパラメータが含まれていた場合でも自動設定は実行されますので、問題点に気付きにくいという欠点があります。あくまでも、日本語のパラメータが含まれていた部分の設定だけが無視され、それ以外の設定は正常に扱われます。
具体的にどのような設定で日本語のパラメータが含まれることになるかですが、実際に保存した設定情報を見てみることにしましょう。自動設定のための設定情報はXML形式で保存され以下のような形式になっています。
・日本語が含まれる設定情報(一部のみ抜粋)
このようにパラメータの一部に日本語が含まれていますが、この例ではキーボード(ことえり)とネットワークインターフェイス(内蔵 Ethernet)の設定で日本語のパラメータが使用されています。日本語のパラメータが設定情報に含まれたままサーバの自動設定を行ってしまいますと、該当する部分の設定が無視された状態でサーバを設定してしまうことになります。つまり一部の設定が抜け落ちた状態になってしまいます。
キーボードの設定などはあとから改めて設定することもできてしまいますが、ネットワークインターフェイスの設定に失敗してしまいますと大変なことになります。リモートでサーバを管理しているような場合には、サーバへのネットワーク接続ができなくなってしまいますので、注意が必要です。
ではどのようにすればこの問題を解消できるかですが、設定情報には日本語のパラメータを含まないようにする必要があります。例えばネットワークインターフェイスの設定をするときには、インターフェイスを追加するさいに、デフォルトではポート名が「内蔵 Ethernet」となりますが、ここを手動で書き換えて「Built-in Ethernet」と設定します。このように手動で設定できるパラメータの場合には日本語を使用しないといった対策が必要になります。
しかし、キーボード設定などはパラメータを手入力するわけではなく、画面上に表示されるリストから選択するだけですので、どうしても自動的に日本語のパラメータが設定されてしまいます。この場合は対策としては2つの方法があります。
1つ目はとりあえず日本語のまま設定してしまって、設定情報を保存した後に日本語のパラメータを直接書き換えてしまう方法があります。キーボートの設定の場合は「ことえり」を使用する場合「Kotoeri」とパラメータを書き換えます。
この方法はちょっと手間がかかりますが、もう1つの方法として言語環境を「English」に変更して「サーバアシスタント」を起動して設定するという方法があります。こうしておけば最初から英語のパラメータが設定情報に保存されます。ただし「サーバアシスタント」の画面上の表示もすべて英語になってしまいます。言語環境の「English」への変更ですが、「サーバアシスタント」を起動するマシン上の言語環境を変更してください。「サーバアシスタント」で設定を行うときに言語の設定を行いますが、こちらはこれから設定をおこなうサーバ上で使用する言語の設定になりますので、勘違いしないよう注意が必要です。
あるいは、キーボードの設定であれば後から設定してしまえばよいので、とりあえず日本語のまま設定を実行してしまってもよいでしょう。そもそもサーバの管理をリモートで行う場合には、サーバ側のキーボードの設定などは直接影響しないことになります。ちなみに、言語環境を「English」にして設定情報を保存した場合には以下のようなデータが保存されます。
・英語環境で保存した設定情報(一部のみ抜粋)
さて、インストールおよび初期設定の解説はそろそろ終わりにしたいと思います。インストールでは新規インストール以外にも、以前のバージョンからのアップデートなどもありますが、そろそろ次の話題にうつっていきましょう。次回は初期設定が完了した直後に必要となる作業について解説する予定です。
つづく
小池邦人のCarbon API 徒然草(2006/07/07)
〜 アプリケーションのUniversal Binary化(その11) 〜
今回は、前回紹介した幾つかのトピックスのうち、画像フィルタ処理などに活用することができるvImage.frameworkのルーチンを、例題を示しながら解説してみます。PowerPCのAltiVecコードをIntel CPUのSSE/SSE2コードに変換する作業とは直接関係ありませんが、vImageルーチン(API)を使うことは処理速度の向上において重要なテクニックです。
前回も紹介しましたが、vImage.frameworkの詳細については、以下のドキュメントを参照してください。
「Optimizing Image Processing With vImage」「vImage.pdf」(PDF 366ページ)
http://developer.apple.com/documentation/Performance/Conceptual/vImage/index.html
ドキュメントのタイトル通り、vImage.frameworkは各種画像処理に関係するルーチンを提供しています。各ルーチンはPowerPC版であればAltiVecコードを、Intel CPU版であればSSE/SSE2コードを最大限用いることで最適化されています。よって、vImage.frameworkを上手に活用すれば、かなり特殊なケースを除き、自分自身でAltiVecやSSE/SSE2を使うことなく多くの画像処理を高速化することが可能となります。
vImage.frameworkには200近いルーチンが存在しているのですが、それぞれのルーチンは用途別に以下の7つのグループに分類されています。
(1)Convolution
(2)Morphological Operations
(3)Geometric Operations
(4)Histogram Operations
(5)Alpha Compositing Operations
(6)ImageTransformation Operations
(7)Conversion Operations
Convolutionは畳み込み演算のことでして、ぼかし、シャープネス、エッジ強調といった画像に対して各種フィルタ処理を実行できます。入力画像の全ピクセルに対し、そのピクセルを中心としたピクセル領域(3×3とか5×5など)とカーネル係数との掛け合わせを行います。Morphological Operationsは、グレースケール画像に対し画像の細線化や膨らまし処理を実行します。
Geometric Operationsは、画像領域に対してAffine変換を実行することで、画像の回転、反転、歪みなどを実現します。Histogram Operationsでは、ヒストグラム処理により、階調やコントラストなどを制御することが可能です。
Alpha Compositing Operationsはα値(透明度)による画像合成を行い、ImageTransformation Operationsでは画像のガンマ値調整などが行えます。最後のConversion Operationsは、画像タイプの各種変換(ARGBからグレースケールなど)に利用します。
vImageルーチンが画像に対してどのような効果を発揮するのか?また、どのようなソースコードを記述をすれば最適なのかは、Developerフォルダの以下の場所に「Tableau」というサンプル(Xcodeプロジェクト)がありますので、これを参照してください。vImageルーチンによる画像処理の速度と、その効果を一通り確認することが可能です。
/Developer/Examples/Accelerate/vImage/Tableau
vImageで利用できる画像タイプは以下の4種類です。
typedef uint8_t Pixel_8; // 1ピクセル8bitのグレースケール
typedef float Pixel_F; // 1ピクセル1浮動小数点値のグレースケール
typedef uint8_t Pixel_8888[4]; // 1ピクセル4*8bitのARGBカラー
typedef float Pixel_FFFF[4]; // 1ピクセル4浮動小数点値のARGBカラー
また、vImageルーチンで利用する画像バッファはvImage_Buffer構造体として以下のように定義されています。vImagePixelCountとsize_tは、両方ともunsigned longです。
typedef struct vImage_Buffer
{
void *data; // 画像バッファの先頭ポインタ
vImagePixelCount height; // 画像バッファの高さ(ピクセル数)
vImagePixelCount width; // 画像バッファの幅(ピクセル数)
size_t rowBytes; // 画像バッファの幅(バイト数)
} vImage_Buffer;
以下に、vImage_Buffer用メモリ領域を確保するルーチンと解放する簡単なルーチンを紹介しておきます。ちなみに、ルーチン内のmalloc()とfree()は、NewPtr()とDisposePtr()に差し替えても問題ありません。
OSErr newImageBuffer( vImage_Buffer *buf,long hh,long ww,size_t psize )
{
short err=1;
size_t row;
row=ww*psize; // ARGB画像ならpsizeは4となる
row=(row+15)/16*16; // 最適化のためrowBytesを16の倍数に合わせる
buf->height=hh;
buf->width=ww;
buf->rowBytes=row;
if( buf->data=malloc( row*hh ) ) // 画像バッファ用のメモリ領域を確保
err=noErr;
return( err );
}
void disposeImageBuffer( vImage_Buffer *buf )
{
if( buf && buf->data )
free( buf->data ); // 画像バッファ用のメモリ領域を破棄
}
以下のsharpnessCGImage()は、フルカラーバッファ(ARGB)に保存されたグレースケール画像を浮動小数点グレースケール画像まで変換し、シャープネスを調整してから、再度フルカラーバッファに戻すサンプルルーチンです。各バッファのメモリ領域やRowByte値は処理する直前にvImage_Bufferに確保し、そのポインタの配列を引数で渡しています。
typedef vImage_Buffer * vImage_Buffer_Ptr;
void sharpnessCGImage( long val,vImage_Buffer_Ptr buf[] )
{
float flev,k[9],f=255.0;
long i;
flev=(float)val;
flev/=100;
for( i=0;i<9;i++ ) // カーネル用3x3マトリックスを作成
k[i]=-flev;
k[4]=1.0+flev*8.0;
vImageConvert_ARGB8888toPlanar8( buf[0],buf[1],buf[1],buf[1],buf[1],0 );
vImageConvert_Planar8toPlanarF( &buf[1],buf[2],255.0,0.0,0 );
vImageConvolve_PlanarF( buf[2],buf[3],NULL,0,0,k,3,3,f,kvImageCopyInPlace );
vImageConvert_PlanarFtoPlanar8 ( buf[3],buf[1],255.0,0.0,0 );
vImageConvert_Planar8toARGB8888( buf[1],buf[1],buf[1],buf[1],buf[0],0 );
}
vImageのルーチンはすべてスレッド・セーフですので、目的の画像処理ルーチンをマルチプロセッサに対応させれば、処理をさらに高速化することが可能です。具体的に言えば、ある画像の矩形領域をプロセッサ数(2つなら上下半分)に分けて、それぞれに対して別スレッドでvImagekルーチンを用います。そうすれば、単純計算で2倍(実際はもう少し遅くなりますが)の処理速度を得ることができるわけです。
次回は、本格的にAltiVecからSSE/SSE2コードへの変換作業の話となります。幾つかの例題を取り上げて、やっかいなコード変換作業について解説する予定です。
つづく
SqueakではじめるSmalltalk入門 第65回 鷲見 正人
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今は、簡単なGUIビルダを構築することを目指して、そのために必要なテクニックや知識を整理しているところです。
前回は「fromUser」というメッセージを、座標や矩形を表現するクラスに送信することで、直後のマウス操作から情報をオブジェクトとして情報を引き出すことが可能であることを確認しました。たとえば、RectangleクラスにfromUserメッセージを送れば、「Rectangle class >> #formUser」というメソッドが起動し、直前のマウスドラッグ操作で描いた矩形の座標を得ることができます。この方法で、位置や大きさをあらかじめ指定して、新しいウィジェットを設置する操作が実現できそうです。さっそく試してみましょう。
| field |
field := PluggableTextMorph new.
field editString: ''.
field bounds: Rectangle fromUser.
field openInWorld
とりあえず、このスクリプトの全体を選択し、do it(cmd + D)で実行してみてください。マウスポインタが十字(クロスヘア)に変化するので、画面の任意の位置でドラッグして矩形を描くと、ぴったりその位置にテキスト編集用のフィールドが現れます。
[fig.A,B]Rectangle fromUserの位置にテキストフィールドを生成
念のため、スクリプトの内容を順を追って解説してみましょう。まず最初は、テンポラリ変数「field」の宣言文。続けて、PluggableTextMorphのインスタンス(a PluggableTextMorph)を作り、その変数「field」に束縛しています。
fieldに束縛されたa PluggableTextMorphの初期化のために、メッセージ「editString: ''」を送った後、くだんのRectangle fromUserを使って得た矩形情報(a Rectangle)をパラメータに添えて、#bounds:というメソッドを起動しています。この#bounds:メソッドはMorphに定義されていて、モーフの位置と大きさを一発で決めることができます。つまり、
| morph |
morph := Morph new.
morph bounds: (100@100 extent: 100@100).
morph openInWorld
は、
| morph |
morph := Morph new.
morph position: 100@100.
morph extent: 100@100.
morph openInWorld
と同じことをします。
位置と大きさを決められたa PluggableTextMorphは、最後にopenInWorldメッセージを受け取って、我々の前にその姿を現わします。ただ、実際のシステムウインドウに埋め込む作業には、#add:frame:を起動するだけでよいので、#bounds:以下は、軽く流していただいて結構です。
さて、このように単に作られただけのテキストフィールド(a PluggableTextMorph)は、テキストの入力などの基本的な機能こそ正常ですが、モデルに依存する黄ボタンメニューを出すことができません。第62回のときは“魂”を欠いた状態などと抽象的に表現していましたが、実装的には、どんなことが起こっているのかを探ってみることにします。
とりあえずは、黄ボタンメニューを出すことだけを考えてみます。まず手始めに、手本となったワークスペースでテキストフィールドを作っているときのメッセージをそのまま真似てみることにしましょう。
PluggableTextMorphを選択して、cmd + shift + Nとタイプすると、そのクラスを含むメソッドの一覧をブラウズできるので、その中から、StringHolder >> #openAsMorphLabel:inWorld:というメソッドを探して定義を見ると、次のようなワークスペースのウインドウを構築する記述が見つかります(改行の位置はわかりやすいように変えました)。
window
addMorph: (
PluggableTextMorph
on: self
text: #contents
accept: #acceptContents:
readSelection: nil
menu: #codePaneMenu:shifted:)
frame: (0@0 corner: 1@1).
ここで、#on:text:accept:readSelection:menu:を起動する際に添えられているパラメータを、そのまま真似ればよいのですが、他のパラメータと違い、第一パラメータのselfだけは文脈に依存する擬変数なので、別のものに置き換えなければいけません。
ワークスペースが作られるときの文脈では、このメソッド(StringHolder >>#openAsMorphLabel:inWorld:)を起動したワークスペースのインスタンス(a Workspace)がselfに束縛されていることになりますから、このことを考慮して、冒頭のスクリプトを書き換えると次のようになります。
| field |
field := PluggableTextMorph
on: Workspace new
text: #contents
accept: #acceptContents:
readSelection: nil
menu: #codePaneMenu:shifted:.
field bounds: Rectangle fromUser.
field openInWorld
改めてスクリプト全体を選択してdo it(cmd + D)すると、今度のテキストフィールドは、黄ボタンメニューも使えるようになっていることが確認できるはずです。
[fig.C]黄ボタンメニューをポップアップさせたところ
じつは、セレクタのキーワードから想像できるように、黄ボタンメニューを出すだけなら、最初と最後のパラメータだけをきちんと渡せば、あとはnilでも目的を果たすことができます。
| field |
field := PluggableTextMorph
on: Workspace new
text: nil
accept: nil
readSelection: nil
menu: #codePaneMenu:shifted:.
field bounds: Rectangle fromUser.
field openInWorld
このことを手がかりに、次回、黄ボタンメニューがどのように呼び出されているのかを、もう少し掘り下げて調べてみることにします。
バックナンバー:
ニュース・解説
今週の解説担当:木下 誠
----------------------------------------------------------------------
日本語訳「Cocoa基礎ガイド」
----------------------------------------------------------------------
開発者に対してCocoaの基礎的なオーバービューを与えるドキュメント、「Cocoa Fundamentals Guide」の日本語訳が公開されていました。タイトルは、「Cocoa基礎ガイド」となっています。
Cocoaの設計思想や歴史から始まり、XcodeとInterface Builderといった開発環境の話や、ターゲット・アクションやバインディングのような高度な話まで、幅広くカバーしているドキュメントです。初学者の方はもちろん、既にCocoaをバリバリ使っている方も、一読すると新しい発見がありそうです。
Cooca基礎ガイド
http://developer.apple.com/jp/documentation/Cocoa/Conceptual/CocoaFundamentals/index.html
----------------------------------------------------------------------
教育機関向けiMacの発表とDeveloper Note
----------------------------------------------------------------------
7月6日に、突如「17-inch iMac for educaion/1.83GHz」が発表されました。eMacの後継となる、教育機関のみに販売される、低価格モデルです。
そのモデルの、Developer Noteも公開されました。GPUはIntel GMA950、光学ドライブはComboドライブとなっており、低価格化が計られているようです。
17-inch iMac for Education Developer Note
http://developer.apple.com/documentation/HardwareDrivers/Conceptual/iMac_17inchEdu/index.html
----------------------------------------------------------------------
Cocoaセミナー中級編開催
----------------------------------------------------------------------
アップルから、5月に行われたCocoaセミナー初級編に引き続き、「Coocaセミナー中級編」を開催する事が発表されました。7月11日と、8月1日の、13:00から17:00の開催となります。ADCに登録している方なら、参加できます。Onlineの方も含みます。講師は、私木下が担当します。
中級編では、実用的なアプリケーション作成を始める手がかりとなるように、できるだけたくさんのCocoaのクラスを使う事を目標とします。具体的には、NSDocument、NSTextView、NSTextField、NSXMLDocument、NSXMLNode、NSArray、NSSplitView、NSTabView、NSTableView、NSOutlineViewといったクラスが登場します。興味のある方は、ぜひご登録ください。
Cocoaセミナー中級編
http://developer.apple.com/jp/briefing/cocoa2/
◇MOSAからのお知らせと編集後記は割愛します◇