Cobalt Users Conference2002/Summer

Windowsマシン
Windowsマシン、Unix
UnixマシンとマシンとCobalt
Cobaltの違いの違い
Windows

一般的なUnix

Cobaltディスプレイおよびキーボード要

不 要（接続可）不 要（ LCDコン
ソールあり ）

操 作の手段GUI（ ウィンドウシス
テ ム）

CUI（ コマンドラ GUI（ LCDコ ン
インインター
ソールおよびWebブラウザ）フェース）

遠 隔メンテナンス不可

可 （ CUI）

Ｓａｕｓａｌｉｔ
ｏで遊ぼう!

☆ Cobalt Appliance
Programming入門☆
Programming入門
☆
2002年
2002
年 9月 8日
NTT DoCoMo Kansai,Inc.
Masahiro Watanabe

Sausalitoとはなにか
Sausalitoとはなにか
Sausalitoとは、Cobalt Serverのソフトウェアに一貫した操作性を与えるために開発された、新アーキテクチャである。
従来のCobalt

Sausalito

管理画面の 構成

画面ごとに PerlのCGIで作 成

XMLを 使っ て自動生成 さ れ たメ ニ ュ ーと、PHPの UIFCライブラリ を利 用
して作 成し た画 面から 構成

管理画面の 認 証 方
法HTTP のBASIC 認証を利用

Sausalito内 の独 自 認 証を利 用（ ユ ー ザ
権限ごとに メニュー構 成を 変更 することが可 能）

国際版対応

各国版毎に Perlの表示される メッセージ をString フ ァ イ
ソース を書 き換 え
ルと し て独 立さ せ、String フ ァ イてリリース
ルを言語毎 に用 意することにより対応（ ソ ー スは 各国語版同一）

システムリソースへのアクセス

Perl にてアクセス

サーバ 管理用 デーモン（CCE) 経由 でアクセス

Sausalitoの特長（
Sausalitoの特長（つづき）
４）サードパーティのアプリケーション においてもSausalitoのユーザ認証の利用が可能–

サードパーティのアプリケーションにおいても、Navigation ManagerおよびUIFCを用いることにより、Sausalitoのユーザ認証を利用可能（独自の認証機構を準備する必要がない）

５）Sausalito対応機種間でのアプリケーション の移植が容易–

ハードウェアやシステム情報へのアクセス用のAPI（CCE）が提供されていることにより、機種間のアプリケーションの移植が従来に比べ容易であると思われる。

可 （ GUI）

Cobalt ServerはUNIXの省スペース性と、Webブラウザを使ったGUIでの簡易な操作を兼ね備えたServer Applianceである。

Sausalitoの特長
Sausalitoの特長
１）柔軟な機能拡張が可能– XMLを用いたメニュー自動生成処理（NavigationManager）により、メニューツリーへのメニュー追加が他の既存のメニューに影響を与えずに可能

２）各国語版パッチリリースに要する期間の短縮および信頼性の向上– 各国語版間でソースが共通であるため、シンプルなバージョン管理が可能

３）ユーザインターフェースのLook＆Feelの統一性の保持が可能– ユーザインターフェース用API（UIFC ）が公開されている
ため、サードパーティのアプリケーション においてもCobaltオリジナル機能と同一のLook＆Feelを実現可能

Sausalito版
Sausalito版Cobalt Server• Sausalitoアーキテクチャを採用しているCobalt
Serverは以下のとおり– Sun Cobalt Qube3– NTT DoCoMo MMQUBE2 (OEM版Qube3)– Sun Cobalt Qube3 Plus
– Sun Cobalt RaQ550– SunCobalt Control Station(2002年9月現在）
備考：
Sun Cobalt XTRは部分的にSausalitoが使われている。

1

Sausalitoの画面構成（
Sausalitoの画面構成（ログイン画面）

Sausalitoの画面構成（
Sausalitoの画面構成（ログイン後）

test.cobalt* qube.org※ この画面はMMQUBE2のものである。

※ この画面はMMQUBE2のものである。

Sausalito対応アプリケーション作成の準備
Sausalito
対応アプリケーション作成の準備

Sausalito対応アプリケーション作成の準備
Sausalito
対応アプリケーション作成の準備

用意するもの• あるとうれしい予備知識（なくても可？）– Sausalitoアーキテクチャのサーバ• 管理者権限が必要– IE5以上が動作するPC– Telnetクライアントフト• TeraTerm (フリーウェア)がおすすめ– FTPクライアントソフト• FFFTP(フリーウェア)がおすすめ– tar,gzip,rpmに対応した圧縮・解凍ソフト• ExpLzh(シェアウェア)+tar32.dllがおすすめ– TelnetおよびShellを使ったことがある– htmlのソースを見たり書いたことがある– xmlについて知っている– rpmのSPEC ファイルを書いたことがある– Perl、PHP、Awkのソースを見たことがある– EUC 、SJISコードとは何のことか 知っている– vi、moreを使ったことがある– ‘/’ と書いてrootと読める– テキストエディタ• 秀丸(シェアウェア)がおすすめ

SausalitoのデSausalitoのディレクトリ構成（後で使うよ）/usr/

share/locale/ja/LC_MESSAGES/***.mo・・・

sausalito/

本日のお題

Stringファイル

en/LC_MESSAGES/***.moconstructor/***.pldestructor/***.plhandler/***.pl課題１）Sausalitoメニューに HelloWorld ア
プリを追加する

CCE関連ファイル（今回は作成しない）

schema/***.schema

ui/

menu/

***.xmlmenu定義ファイル

web/***.ｐｈｐ,html,pl

CGIファイルstyle/***.xml

Styleファイル

課題２）Sausalitoのメッセージを大阪弁に変更
する

conf/
bin/
・・・

libPhp/Sausalitoシステムディレクトリ
（ユーザは直接使用しない）

lib/

2

課題１：メニュー追加
Sausalitoメニューに HelloWorld アプリを追加しよう

STEP１
STEP
１：メニューの構造を探ってみる/usr/sausalito/ui/menuの下を覗く[admin admin]$ c d /usr/sausalito/ui/menu[admin menu]$ ls -F
VM/ base/ ioffice/ live/ palette/[admin menu]$ c d base[admin base]$ ls -F
addressbook / carmel/ firewall/ network/ telnet/ wizard/ am/
dhcpd/
ftp/
power/
time/
workgroup/
apache/disk/
import/ quotastats / user/
appleshare / dns /
ldap/
snmp/
webmail/ backup/
email/
maillist / swupdate/ webstats / cache/fileshare/ multidrop/ system/
winshare/[admin base]$ c d am[admin am]$ ls -F
amSettings.xml amStatus.xml monitor.xml monitorLight.xml

STEP２STEP２：ｘｍｌ
ファイルの構造を推測する①既存のｘｍｌ
ファイルを見てみる
ソース１：monitor.xml<item id=" base_monitor"label="[[base -am.activeMonitor]]"description=“[[base-am.activeMonitor_help]]” ><parent id=" base_administration" order="80"/></item>

ソース２：amStatus.xml<item id=" base_amStatus "label="[[base -am.amStatusMenuName]]"description="[[base -am.amStatusMenuDesc ]]"url=“/base/am/amStatus.php ” ><parent id=" base_monitor" order="10"/></item>STEP２
STEP
２：続き②ｘｍｌ
ファイルの構造を推測する(id属性）– item エレメントのid 属性は自分自身のI Dを指しているらしい。
– parentエレメントのid属性は自分の親のIDを指しているらしい。
base_administration
base_monitor

base_amStatus

STEP２
STEP
２：続き③ｘｍｌ
ファイルの構造を推測する(order属性）– parentエレメントのorder属性は同じ親に属しているものの間の順序を指しているらしい。
monitor.xmlの parentエレメントのorder属性を80から２５に変更してみる

STEP２
STEP
２：続き④ｘｍｌ
ファイルの構造を推測する(label,description属性）
monitor.xmlのitemエレメントのlabel description属性を右のように書き換えてみる<item id="base_monitor"label="base_monitorのLabelだよ"description="base_monitorのdescriptionだよ"><parent id="base_administration" order="80"/></item>

メニュータイトル とアクティブヘルプが書き換わった！
アクティブモニタのメニューの場所が移動した。
注意：自分 で試す場合、ファイルを書き換えるときは、元のファイルを必ずバックアップしてから行うこと！

注意：自分 で試す場合、ファイルを書き換えるときは、元のファイルを必ずバックアップしてから行うこと！

3

STEP2:続き
STEP2:
続き

STEP2:まとめ
STEP2:
まとめ• xmlファイルの構造⑤ｘｍｌ
ファイルの構造を推測する(url属性）
amStatus.xml ファイルのitemエレメントのURL属性のURLを左上のロゴのビットマップのURLに書き換えてみる。
※URLのドキュメントルートは /usr/sausalito/ui/webである。
amStatus.xml<item id="base_amStatus "label="[[base-am.amStatusMenuName]]"description="[[base-am.amStatusMenuDesc]]"url="/libImage/topLogo.gif “ ><parent id="base_monitor" order="10"/></item>エレメント 属性

意味

item

id

自分自身のメニュー項目ID （すべてのメニュー項目でユニークである必要がある）

item

label

メニュー に表示される文字列（日本語も使用可。S-JISで指定する必要がある。）

item

description

アクティブヘルプに表示される文字列（日本語も使用可。S-JISで指定する必要がある。
）

item

url

メニュー 項目クリック時に表示されるURL

parentid

自分がぶら下がるメニュー項目IDparentorder

メニュー の並び（小さいほど上または、左に表示される。
）

amStatus.xml

クリックすると、ロゴが表示された！

注意：自分 で試す場合、ファイルを書き換えるときは、元のファイルを必ずバックアップしてから行うこと！

STEP3:メニューツリーを確認する
STEP3:メニューツリーを確認する
管理者ログイン時のメニューツリーを知る• メニューツリーのTOPはrootである。
root① ② ③ ④

<item id=" base_amStatus "label="[[base -am.amStatusMenuName]]"description="[[base -am.amStatusMenuDesc ]]"url=“/base/am/amStatus.php ” ><parent id=" base_monitor" order="10"/></item>STEP4:課題のSTEP4:
課題のHello
Helloメニューをチメニューをチェックする• Hello メニューは「プログラム」タブの中にある。
– base_programsの子メニューとなる• HelloWorldメニューは「Hello 」メニューの中にある– HelloメニューのIDの子メニューとなる。

⑤ ⑥ ⑦root• HelloWorldアプリケーション は「HelloWorld 」メニューから呼び出される。

①base_administration②base_software③base_programs④base_personalProfile⑤base_updateLight

base_programs
base_hello
base_helloWorld⑥base_monitorLight⑦base_logout

STEP5:Helloメニューを作成する
STEP5:Hello
メニューを作成する• これまでの情報を用いて、Helloメニューを作成する
hello.xml<item id=" base_hello"label=“Hello"
description=“Helloメニューです。” ><parent id=" base_administration" order=“21"/></item>helloworld.xml<item id=" base_helloWorld"label=“HelloWorld”
description=“HelloWorldアプリケーションです。"
url=“hello/hello.htm” ><parent id=" base_hello" order="10"/></item>STEP5:続き
STEP5:続き• どこにXMLファイルを置くか？
– Sausalitoは/usr/sausalito/ui/menuの下のフォルダを再帰的に探索する。

– アプリごとにｘｍｌ
ファイル配置のためのディレクト
リを分けることが望ましい。
• 今回は、ui/menuの下に、helloというディレクトリを作成し、その中に配置する。
注意：Sausalitoは、シンボリックリンクのディレクトリは探索しないため、実体のディレクトリ内に入れる必要がある

4

STEP6:hello.htmを作成する
STEP6:hello.htm
を作成する

課題１：完成！

• メニューからリンクされるHTMLファイルを作成する
hello.htm<HTML><body>
Hello World アプリケーションの出力です。
</body></html>HTMLファイルの配置場所は/usr/sausalito/ui/web/hello /課題２：メッセージの書き換え

STEP1:メッセージのありSTEP1:メッセージのありかを探す

課題２）Sausalitoのメッセージを大阪弁に変更しよう• /usr/share/locale/ja/LC_MESSAGES/の下を覗く– 電源切断手順画面を大阪弁に変更する

admin admin]$ c d /usr/share/locale/ja/LC_MESSAGES/[admin LC_MESSAGES]$ ls
base-fileshare.mo base-sys.mo base-firewall.mobase-system.mobase-ftp.mo base-telnet.mobase-import.mobase-time.mo base-lcd.mobase -user.mo base-ldap.mo base-webmail.mo
adamnet.mo base-maillist.mo base-webstats.mo base-addressbook.mo base-memory.mobase-winnetwork.mo base-am.mobase-modem.mobase-winshare.mo base-apache.mobase-multidrop.mo base -wizard.mo base-appleshare.mo base-network.mo base-workgroup.mobase-backup.mognupg.mobase-cache.mo base -power.mopalette.mobase-carmel.mobase-power.mo.org sharutils.mo base-cce.mo base-quotastats.mo swatch.mo base-dhclient.mobase-sauce -basic.mo tar.mo base -dhcpd.mo base-services.motextutils.mo base-disk.mobase-snmp.mo trueBlue.mo base-dns.mo base-ssl.mo util-linux.mo base-email.mo base-swupdate.mo[admin LC_MESSAGES]$• *.moというファイルが多数存在する。
• これらはStringファイルと呼ばれるものである。

STEP2:StringファイルとSTEP2:Stringファイルとは• Stringファイルとは、文字列にタグ(ID) をつけて格納したもの。
• Stringソースファイル(*.po)から生成される。
• 国際化ライブラリにて使用される。
Stringソースファイル(*.po)decodeencode

msgfmtコマンド

msgunfmtコマンド

Stringファイル(*.mo)

STEP3:Stringソースファイルの書式
STEP3:String
ソースファイルの書式
msgid “ユニークなID1”
msgstr “メッセージ1”(空行)
msgid “ユニークなID2”
msgstr “メッセージ2”(空行)
・・・・・・
msgid “ユニークなIDn”
msgstr “メッセージn”

msgid: メッセージのI Dをあらわす
msgstr: メッセージの文字列。日本語可。文字コードはS-JISを使用する。

5

STEP4:msgfmt,msgunfmt の使い方

STEP5:*mo ファイルから* popoフ
ファイルを作成• ｍｓｇｆｍｔコマンド

• Ｓｔ
ｒｉｎｇ
ファイルから、Ｓｔｒｉｎｇ
ソースファイルを作成する

書式：msgfmt xxx.po ［-o xxx.mo ]– Stringソースファイル xxx.po から、Stringファイルxxx.mo を生成する。-oオプションが無指定の場合はmessage というファイル名のファイルに出力する。

• msgunfmtコマンド
書式：
msgunfmt xxx.mo [ -o xxx.po]– Stringファイル xxx.moから、Stringファイル xxx.poを生成する。-oオプションが無指定の場合は、標準出力に出力する。

[root LC_MESSAGES]# msgunfmt base-power.mo -o /tmp/base -power.po[root LC_MESSAGES]# head /tmp/base-power.po
msgid "askRebootConfirmation"
msgstr "サーバを再起動してよろしいですか？"msgid "power"
msgstr "電源"msgid "powerHelp"
msgstr "サーバを再起動できます。"
msgid "reboot“・・・・・

STEP6:* popoフ
ファイルをＰＣに転送する

STEP7:*.po
STEP7:*.
poファイルを編集する
ファイルを編集する– STEP5で生成したbase-power.poをFFFTPを利用してＰＣに転送する。

– msgunfmtコマンドで生成された *.poファイル
は、文字列が長い場合８０文字で改行されているため、文字列 を一本にする。

• ASCIIモードで転送する。
• 文字コードは、変換しない。

STEP7:続き（
STEP7:続き（関西人用）

STEP7:続き（
STEP7:続き（関西人以外用）• 文字列をチェックし、変な日本語をすべて大阪弁に書き換える。

• インターネット上の大阪弁変換フィルタ等を用いて、メッセージを大阪弁に変換する。
例：http://www.yorosiku.net/yan/imode/iosaka.htmlを用いる。

編集が完了したら、base-power-osaka.poというファイル名で保存する。

編集が完了したら、base-power-osaka.poというファイル名で保存する。

6

STEP8:編集後のSTEP8:
編集後の** .popoフ
ファイルをアップする。

STEP9:*.mo ファイルを作成し入替える– 編集後のbase-power-osaka.poファイルをサーバにＦＴＰする。

• 書き換えた、base-power-osaka.poファイルを元に、base-power.mo ファイルを作成し、元のファイルと入替えを行う。

・ASCIIモードで転送する。
・文字コードは、変換しない。

[root /tmp]# msgfmt base-power- osaka.po -o base-power.mo[root /tmp]# cd / usr/share/locale/ja/LC_MESSAGES /[root LC_MESSAGES]# mv base-power.mo base-power.mo.org[root LC_MESSAGES]# cp /tmp/base-power.mo .
[root LC_MESSAGES]#

注意：自分 で試す場合、ファイルを書き換えるときは、元のファイルを必ずバックアップしてから行うこと！

課題２：完成！

おまけ１：メニュ内でString内でStringファイルを使う
ファイルを使う
hello.po
msgid "hellogroup"
msgstr "Hello でっせ"msgid "helloworldgroup "msgstr "HelloWorldどすえ"/usr/share/locale/ja/
LC_MESSAGES/hello.mo*.moファイル名

hello.xml

msgid<item id="base_hello" label="[[hello.hellogroup]]"description="HelloWorldメニューです" type="monitorOn" ><parent id=" base_programs" order="21"/></item>helloworld.xml<item id=“base_hello_helloApp ” label=“[[hello.helloworldgroup]]”description=“HelloWorld でっせ。よろしゅうたのむわ”
url="/hello/ hello.htm " ><parent id=" base_hello" order="21"/></item>おまけ１：出力結果

おまけ２：日本語文字が化ける場合? S-JIS漢字中に含まれる0x5c(¥ )キャラクター
コードをエスケープすることにより回避する。
? enadd.pl：漢字中に0ｘ5cが含まれている場合、その前に0x5cを挿入する。（msgfmtの前に使用)? endel.pl：漢字中に0ｘ5cが2回連続して含まれている場合、0x5cをひとつ削る。（msgunfmtの後に使用)
enadd.pl

endel.pl#!/usr/bin/perl
while(<>){
s/¥¥ /¥ ¥¥¥ /g;
print;}#!/usr/bin/perl
while(<>){
s/¥¥¥ ¥ /¥¥ /g;
print;}

7おまけ３：メニューツリーのroot
メニューツリーのrootを変える
を変える

おまけ３：結果• ログイン後特定のメニューをrootにして、Navigation Managerを立ち上げる
http://サーバ:444/ login.php?target =/nav/cList.php%3Froot=メニュー
ID %3FCommFrame=追加スクリプト
例:http://192.168.0.30:444/login.php?
target=/nav/cList.php%3Froot=base_administration

8