2006-02-14
目次
「WebObjects Dev Report」 第39回 田畑 英和
前回に引き続き「ビジネスマッチングシステム」で実際に使用している、小ワザをいくつか紹介いたします。
■テーブルの背景色
テーブルを表示するとき、各行を識別しやすくするために1行ずつ交互に背景色を変更するような場合があります。あらかじめ静的なHTMLでテーブルを組めるような場合はよいのですが、WORepetitionを用いてテーブルを動的に生成するような場合はあらかじめ行の背景色を静的に指定しておくことはできません。つまり背景色も動的に指定する必要があるわけです。
そこでまず、1、3、5…のような奇数行の背景色と、2、4、6…のような偶数行の背景色を返すメソッドを用意しておきます。
・背景色を返すメソッド
public static final String oddLine = "oddLine";
public static final String evenLine = "evenLine";
private boolean rowFlag;
public String lineClass() {
rowFlag = !rowFlag;
if(rowFlag) {
return oddLine;
} else {
return evenLine;
}
}
ここでは、boolean型のrowFlagを用いて奇数 > 偶数 > 奇数といった状態を交互に表現し、状態に応じて異なる背景色をreturnするようにしています。
実際にテーブルの各行の背景色を指定する方法ですが、WebObjects Builder上でWORepetitionで繰り返しているテーブルの行を選択して、Inspectorの左下の「Make Dynamic」ボタンをクリックします。
すると<TR>タグがWOGenericContainerに変化しますので、ここにlineClassメソッドをバインドします。バインド先ですが、今回はCSSを利用して行の背景色を指定していますので”class” Attributeを追加してlineClassメソッドをバインドします。背景色はCSSで次のように指定してあります。
・CSSで指定した背景色
.oddLine { font-size:11pt; background-color:white; }
.evenLine { font-size:11pt; background-color:#DDD; }
lineClassメソッドを実装する場所ですが、セッションを用いた処理の場合はSession.javaを利用することができます。DirectActionを用いてセッションが存在しない場合は、テーブルを表示するコンポーネントで実装することができます。
■シリアライズデータの変換
ArrayやDictionary形式のデータは文字列と相互変換することができます。例えばつぎのような文字列はArrayを文字列に変換したものです。
・文字列に変換したArrayデータ
( “0″, “1″, “2″, “3″ )
NSPropertyListSerializationクラスを用いればこういったデータの変換が実現できます。ここでは、文字列をArrayに変換する方法をご紹介します。
・文字列からArrayへの変換
public NSArray values() {
return NSPropertyListSerialization.arrayForString(
levelValues());
}
まず、levelValues()は文字列に変換されているデータを返すメソッドです。その文字列をスタティックメソッドarrayForStringで処理するとNSArrayに変換されたデータを取得することができます。
NSPropertyListSerializationでは他にも変換用のメソッドが提供されており、文字列からDictionaryに変換するにはdictionaryForStringメソッドを用います。
■文字列からNSTimestampへの変換
文字列から日時データ(NSTimestamp)を生成する方法を紹介します。例えば次のような文字列があったとしましょう。
・文字列で表現された日時
“1973/12/12″
NSTimestampFormatterクラスを利用すればこのような文字列をNSTimestampに変換することができます。変換のコードは次のようになります。
・文字列からNSTimestampへの変換
まずNSTimestampFormatterクラスを用いて文字列の書式(“%Y/%m/%d”)を指定します。そしてparseObjectメソッドを使って文字列をNSTimestampへと変換します。
String dateString = "1973/12/12";
NSTimestampFormatter dateFormatter =
new NSTimestampFormatter("%Y/%m/%d");
NSTimestamp date =
(NSTimestamp)dateFormatter.parseObject(dateString);
■NSTimestampから文字列への変換
それでは最後にさきほどとは逆のパターンを紹介しましょう。NSTimestampのデータを文字列に変換する方法です。ここでは年、月、日をそれぞれバラバラに文字列へと変換する方法を紹介します。まずコードですが次のようになります。dateはNSTimestampのデータとします。
・NSTimestampから文字列への変換
NSTimestampFormatter yearFormatter =
new NSTimestampFormatter("%Y");
NSTimestampFormatter monthFormatter =
new NSTimestampFormatter("%m");
NSTimestampFormatter dayFormatter =
new NSTimestampFormatter("%d");
String year = yearFormatter.format(date);
String month = monthFormatter.format(date);
String day = dayFormatter.format(date);
今度はNSTimestampFormatterのformatメソッドを使ってNSTimestampを文字列に変換しています。このように処理すればNSTimestampを年、月、日ごとに文字列へと変換することができます。
藤本裕之のプログラミング夜話 #85
前回はInterface Builderの(つうかCocoaの、だな)「One shot」という表現に対する文句で終わったわけだが、あとでふと、あの「shot」はつまり「スクリーンショット」とかいうときの「shot」であるのだな、と気付いた。辞書をあたってみると「shot」には写真とか映画の一場面という意味があるので、Cocoaいうところの「One shot」はなんちうか「長い映画の一場面にしか出てこない登場人物」みたいなニュアンスなのかな、と思う。…これでどんだけ解りやすくなったかは疑問だが。
新しい話題に移る。NSWindowのインスペクタで「One shot」の次にあるチェックボックスは「Utility window (panel only)」、その下にある「Non activating panel (panel only)」と共に、世に名高いpanel onlyコンビを組んでいるわけだが(別に名高くないか)、こいつらの意味と役割を見ていこう。まず言わずもがなのことをわざわざ書いて字数稼ぎをしておくと、こいつらのいう「panel」とはNSWindowのサブクラスであるNSPanel(およびそのサブクラス、というのが正確だがいちいち面倒なのでこれ以降はNSPanelだけで済ませる。神経質な人はこの文章に対して「s/NSPanel/NSPanel(およびそのサブクラス)/」を実行してから読むとよろしい)のことである。
では百聞は一見に如かず、Interface Builderを起動してテキトーなnibファイルを開き、NSPanelのインスタンスを一個作ってみよう。作った当初はタイトルバーの文字が「Panel」となっているだけ、他の部分はNSWindowと変わらない。ただインスペクタにある panel onlyコンビが両方とも設定可能になっている。まずは上の「Utility window (panel only)」をONにしてみる、と、タイトルバーが細くなりタイトルの文字も小さくなったはずである。
それだけぢゃない、今作ったNSPanelのこのスイッチをオンにしておき、ついでに「Visible at launch time」もオンにする。もう一個、これはNSWindowを作って同じように「Visible at launch time」をオンにし、command+Rを押して「Test interface」を実行してみて欲しい。ほらね。このスイッチをオンにされたパネルは自動的にフローティング・ウィンドウになって普通のNSWindowに隠されないのである。というわけで、つまりはこれが Utility Window なんだが、ではこれと同じやつを身近で探してみよう。
この原稿を書いているJeditではフォントパネル、それから文字色を選ぶ時に出てくる「カラーパネル」がそうである。他には入力メニューから選べる(選ぶためにはシステム環境設定の「言語環境」でそいつをオンにしておく必要があるが)「キーボードビューア」、「文字パレット」など…。とにかくこのチェックボックスはウィンドウの形状・レヴェルが変わるという珍しくも解りやすいスイッチであることが解った。
次なるはコンビのもう一方、「Non activating panel (panel only)」。これの意味するところは読んで字のごとし…Activateされないパネルなんだよ、と言うと解ったような気がするが、これがなかなか難しいのだ。
こちらもまずは実験と行こう。さっき作ったパネルの「Utility window(panel only)」を外し、「Non activating panel (panel only)」がオンになってるNSPanel(でもUtility Windowぢゃないから見た目は変わらない)と「Non activating panel (panel only)」がオンになってない(つうかできないんだけど)だけで後のスイッチは全部パネルと同じ普通のNSWindowを作る。あ、最初から2つのウィンドウが見えていないと実験にならないので「Visible at launch time」はオンのままね。
で、問題はこっから。騙されたと思ってそれぞれのウィンドウに一個ずつNSTextFieldを配置してほしい。ご存知のように、ウィンドウに唯一のNSTextFieldは、そのウィンドウがActivateされるとハイライトされる。つまりこれが「ウィンドウがActivateされたかどうかのインディケータになるわけね。ではいよいよ…というところでちょうど時間となりました、ぢゃない、ちょうど字数が尽きました。ではこの実験については次回ということで、よろしく。
(2006_02_09)
高橋真人の「プログラミング指南」第83回
〜Perlについて(29)〜
こんにちは、高橋真人です。
前回の記事までの連載でファイルを開いて処理する基本についての説明を行いました。さて私が最初にPerlを使ったころ、Perlの使い方はこのような形でのテキスト処理が中心でした。
MacPerlの場合、標準出力へのプリントは専用のウインドウを開いて表示してくれますので、あえて新規ファイルを作って書き出さなくても、出力ウインドウのテキストをコピーしてエディタに張り付ければ用は足りたのです。
何度かお話ししてきたようにMacPerlでは簡単にドロップレットが作成できましたから、目の前に処理したいテキストファイルがある時には、MacPerlを起動してスクリプトを書き、それをドロップレット形式で保存するだけで準備は完了でした。あとはテキストファイルをドロップしては、出力ウインドウに表示される結果を見ながら、少しずつスクリプトを目的の形に近づけていけばよかったのです。
ところでUNIXの世界では、すべてのファイルはテキストファイルであることになっていますから、テキスト処理というものはファイル処理の中心となります。もちろんテキストと言ってもすべてが可視文字とは限りませんし、画像ファイルなどは当然バイナリデータです。
しかし私自身、最近ではネットワークプログラミングなども手がけるようになって改めて、UNIXという文化がテキストというものを常にベースにしてきたことを認識しました。
昨今のビジネス絡みのシステムでも、必ずしもUNIXばかりではないにも関わらず、テキストのメリットが再認識されています。XMLなどは正にその典型的な例でしょう。MicrosoftがOfficeのデータ形式をXMLにするなどと言っていますが、Windowsが主流と思われている世界でも結局はテキストに回帰したわけですから、その意味でもUNIXの考え方は正しかったのだなと思います。
ところでUNIXには「Keep it simple, Stupid」、略してKISSという流儀があります。日本語にすれば、「シンプルにしとけよ、バカもん」とでもなるのでしょうか。このKISSという考え方は、ツールを作る上での指標となっています。
UNIXのプログラミング入門書としてお薦めできる本に「Linuxプログラミング〜例題で学ぶUNIXプログラミング環境のすべて〜(改訂第2版、ソフトバンク刊)」という本がありますが、この本はC言語によるUNIXプログラミングの入門書で全715ページという労作ですが、第1章で導入と併せてUNIXの哲学についても解説していますが、その次の第2章でいきなりシェルプログラミングが80ページ余にわたって解説されています。
シェルプログラミングというのは、シェルスクリプティングとも言い、手作業で行う処理をまとめて自動化するための仕組みです。実体はただのテキストファイルですが、コマンドラインに打ち込むコマンドを羅列したり、条件による分岐や繰り返し処理なども加えることが可能で、これをシェルが解釈することで実行ファイルのように動かすことができるのです。
MS-DOSをご存知の方なら、「バッチファイルのようなもの」と考えていただければそんなに違わないと思います。
で、何でUNIXのプログラミング入門書(この本も他のUNIXプログラミング入門書とたがわずCでプログラミングを書くことが前提)であえてこんなにページを割いてシェルスクリプティングの解説をしているかと言えば、UNIXでは「車輪の再発明をするな」ということが言われるからです。つまり、「既にあるものはそれを利用せよ。なければ作れ」ということです。
しかし、作る場合には決して複雑なものを作るのではなく、極力単純にせよ、と。そうすればバグも発生しにくくなるというわけです。つまり、KISSの発想には「単機能の仕組みを作って、それらを組み合わせて使え」ということが含まれているのです。
この思想を実践するための一つとしてUNIXには極めて単機能なソフトがたくさんコマンドとして用意されています。例えばheadなどというコマンドは、指定したファイルの先頭の10行だけを標準出力に表示するだけの機能です。オプションもないことはないのですが、単にデフォルトの10行を変更できるだけなのです。
こんな単機能のコマンドがいったい何の役に立つのかと思われる方もおいででしょう。しかし、一つ一つは単純な機能でもそれらを組み合わせたり、シェルスクリプトによって制御することで、何倍もの効果を生み出すことになるのです。
例えばあるディレクトリに数百単位のテキストファイルがあり、それぞれのファイル名は単に通番が付いているだけだったような場合、それらをいちいち開いて中身を確認するのはかなり大変です。こんなときに、シェルスクリプトでディレクトリ内のすべてのファイルに対してheadコマンドを実行すれば、簡単な一覧リストを作ることができます。
このように、UNIXには標準でシンプルなテキスト処理のコマンドがたくさん備わっているわけで、そういった文化の中から生まれてきたPerlだけにそれなりの「必然性」を持っているのです。つまり、Perlにおいてもテキスト処理の機能はある意味中心であると考えることもできるわけです。
ところで、これらテキスト処理において「行」という概念はとても重要です。多くのテキスト処理コマンド(これをよく「テキストフィルタ」と呼びます)の処理対象は概して「行指向のテキスト」であることがほとんどです。
で、Perlにおいても行指向のテキストが極めてオーソドックスに処理できることは今までも見てきた通りです。しかし、「やり方はいくつもある」はPerlの文化ですから、当然行指向のテキスト処理にももっと別のやり方があります。
以前、<>というファイルから1行読み込んでくる演算子に関して、リストコンテキストで使用すると「すべての行を項目としたリストを返す」ということを説明したことがありました。
次回に紹介するやり方はこのケースでの処理となります。map、grep、foreachといった演算子を使ってファイルの各行を処理する方法を見てみたいと思います。
ニュース・解説
今週の解説担当:小池邦人
● Carbon ドキュメント & サンプル & SDK ナビゲーション(2005/02/10)
【開発環境】
「DTK Exchange Program」で予約しておいたIntel Core Duo版 iMacがついに到着しました! このマシンはスゴク良いですね。設置スペースは液晶モニターと同等だし、液晶画面のクオリティも十分です。それから、とても静かなのにビックリ! ファンが回っているのにうちのオールドCubeより静かです(笑)。内蔵のビデオカメラは、ビデオ関連ソフトの動作確認に重宝しますし、付属のFront Rowを初めて操作してみましたが、ちょっとだけ未来を感じさせてくれました。
そして、整数処理が中心でマルチスレッドに対応したコードの実行は、G5版より本当に2倍ぐらい高速です(浮動小数点処理はそうでもない…)。CPUのキャッシュサイズが大きいのが利いてるかもしれませんが、Xcodeのコンパイル&リンク処理も高速です。まったく同じプロジェクトで比較してみると(PPC用のMake)…
2GHz Dual PowerMac G5
・MWC v9.6 30秒
・Xcode 2.2 21秒
1.83GHz Core Duo iMac
・Xcode 2.2 12秒
将来的には、ほとんどのアプリケーションがUniversal Binary化されることを考えれば、G5版よりこちらのiMacを購入されることをお勧めします。デベロッパの方なら、なおさらですね。MacBook Proの販売開始も近いようで、こちらも大変楽しみです。
【テクニカルドキュメント】
前回から2月10日の期間中、Apple社のDocumentationサイトには数多くのドキュメントが登録されました。ただし、大部分は今までの内容のマイナーチェンジです。今回は、その中で初版と内容が大幅変更になったドキュメントだけをピックアップしました。そのうち、「CFNetwork Programming Guide」は、日本語訳の要望が強いのではないでしょうか? デベロッパ向け読み物も2つ登録されています。「Optimizing Your Application with System Trace in Shark 4」については、前号の木下さんの記事も参照してください。
「CFNetwork Programming Guide」(PDFあり)
「CFNetwork Reference」(初版)
「Segmented Controls Programming Guide for Cocoa」(PDFあり)
「Universal Access Reference」(初版)
http://developer.apple.com/documentation/index-rev-date.html
「imeem Finds a Creative Solution for Cross-Platform Development」(読み物)
http://developer.apple.com/business/macmarket/imeem.html
「Optimizing Your Application with System Trace in Shark 4」(読み物)
http://developer.apple.com/tools/performance/optimizingwithsystemtrace.html
前回から2月10日の期間中、新規テクニカルノートはひとつだけ登録され、新規テクニカルQ&Aの方は2つ登録されました。TN2163については、前号の木下さんの記事も参考にしてみてください。
TN2163「Building Universal I/O Kit Drivers」(初版)
http://developer.apple.com/technicalnotes/index-rev-date.html
QA1463「Integrating the QuickTime for Windows 7.0.3 Installer into your
Application Installer」(初版)
QA1459「QuickTime Audio – Easy Frequency Level Metering with MovieAudio
APIs」(初版)
http://developer.apple.com/technicalqas/index-rev-date.html
【サンプルソースコード】
前回から2月10日期間中、Apple社のSample Codeサイトには、新しいサンプルソースコードが4つ登録されました。「CheckExecutableArchitecture」は、アプリケーションの実行環境(CPUの種類など)をチェックするためのサンプルソースコードです。
「CheckExecutableArchitecture」(Core Foundation関連)(初版)
「CDROMSample」(CD-ROM関連)
「ExtractMovieAudioToAIFF」(QuickTime関連)(初版)
「SillyFrequencyLevels 」(QuickTime関連)(初版)
http://developer.apple.com/samplecode/index-rev-date.html
【デベロップメント SDK】
前回から2月10日の期間中、Apple社のSDKサイトには新しいSDKがひとつだけ登録されました。また、CHUDの最新バージョンv4.3.2も登録されています。
「FireWire SDK 21 for Mac OS X」
http://developer.apple.com/sdk/
「Computer Hardware Understanding Development (CHUD) Tools Version 4.3.2」
http://developer.apple.com/tools/download/
MOSAからのお知らせと編集後記は割愛します