MIRACLE
メールサービス申込 ユーザー登録 パートナー情報
お問い合わせ FAQ サイトマップ
MIRACLE LINUXの特長 製品紹介 サービス案内 購入 サポート 技術フォーラム

プロフィール

コアテクノロジー部

ミラクル・リナックスのOS開発やサポートを担う、技術部の精鋭陣が交代で担当します。

ミラクル関連リンク

採用情報

サイト検索

2008年5月

        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

« 2006年9月 | メイン | 2006年11月 »

OpenLDAPのindex

こんにちは。秋からミラクルに引っ越してきましたanaitoです。

今日は、OpenLDAPのチューニングについて書きたいと思います。まずは基本的なところからということでindexについて設定して行きたいと思います。(そもそもそんなに迷うほど設定項目は多く無いのですけどね)

OpenLDAPも最近ではMTA連携だったりSamba連携だったりと情報が溢れており導入ハードルも下がっているのではないでしょうか?しかし、自宅サーバにありがちな人の設定をコピ&ペーストではいざという時に困ったりするのでキチンと理解しつつindexを設定出来るように順に説明して行きたいと思います。

まずはログをファイルに出力するようにしましょう。標準出力に出してもいいのですが出力も多いのでファイルの方が追いやすいでしょう。
OpenLDAPはdefaultはファシリティlocal4を使いますので/etc/syslog.confに以下を追加します。

local4.* /var/log/ldap.log

※一応丁寧にファイルを作成して再起動

# touch /var/log/ldap.log; chown ldap:ldap /var/log/ldap.log
# service syslog restart

次にslapdのloglevelを設定します。/etc/openldap/slapd.confにloglevelディレクティブを追加します。デフォルトは256ですが「検索フィルタ処理」の32も出力させたいので

loglevel    288

とします。余談ですがパフォーマンスを考えた場合、最終的にはloglevel 0(ゼロ)とした方が良いですね。ログが出力されないので一番速いです。注意としてはコメントアウトはダメです。defaultの256が生きてしまいます。例えファイル出力しなくても負荷がありますので必ず明示的に指定して下さい。(あくまでパフォーマンス第一に考えた場合です。ログがなければ当然困ることもありますよん)

# service ldap restart

あとは自分が使いたいサービスを動かしてみてログからindex対象を拾います。

例えば

# ldapsearch -x -b "dc=example,dc=com"

あたりだと以下のようなログが出力されます。(※バックエンドDBによって違いがあります)

slapd[2416]: conn=0 op=1 SRCH base="dc=example,dc=com" scope=2 deref=0 filter="(objectClass=*)"
slapd[2416]:  AND
slapd[2416]:  DN SUBTREE
slapd[2416]:  OR
slapd[2416]:  EQUALITY
slapd[2416]:  PRESENT
slapd[2416]: => test_filter
slapd[2416]:     PRESENT
slapd[2416]: <= test_filter 6
- snip -
slapd[2416]: conn=0 op=1 SEARCH RESULT tag=101 err=0 nentries=18 text=

K&Rやった人にはなつかしいポーランド記法です。
そうするとアスタリスクを用いたフィルタはPRESENT(存在)で検索している事が分かります。その前のEQUALITYは暗黙的に(ObjectClass=NULL)のfilterが入っているため出力されています。(この辺りまでログ出力させるにはloglevel -1でどうぞ)つまり

(dc=example,dc=comのサブツリー検索) AND { (ObjectClass=NULL) OR (ObjectClass=*)}

ということで導き出されるindexは

index objectClass   pres,eq

ということになります。

次はauthconfigコマンドでユーザ認証にldapを追加するとsuなんかした時にこんなのが出てきます。

slapd[2416]: conn=2 op=1 SRCH base="dc=example,dc=com" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=root))"
slapd[2416]:  AND
slapd[2416]:  DN SUBTREE
slapd[2416]:  OR
slapd[2416]:  EQUALITY
slapd[2416]:  AND
slapd[2416]:  EQUALITY
slapd[2416]:  EQUALITY
slapd[2416]: conn=2 op=1 SEARCH RESULT tag=101 err=0 nentries=0 text=

この場合、ORの後のEQUALITYは前回と同様でプラスその後ろということで

index objectClass, uid    eq

となります。

さらに、ThunderbirdのLDAPアドレス帳を使った場合を見てみましょう。

slapd[2344]: conn=5 op=1 SRCH base="ou=users,dc=example,dc=com" scope=2 deref=0 filter="(|(mail=*test*)(cn=*test*)(givenName=*test*)(sn=*test*))"
slapd[2344]:      AND
slapd[2344]:      DN SUBTREE
slapd[2344]:      OR
slapd[2344]:      EQUALITY
slapd[2344]:      OR
slapd[2344]:      SUBSTRINGS
slapd[2344]:      SUBSTRINGS
slapd[2344]:      SUBSTRINGS
slapd[2344]:      SUBSTRINGS
slapd[2344]: => test_filter
slapd[2344]:     OR
slapd[2344]: => test_filter_or
slapd[2344]: => test_filter
slapd[2344]:     SUBSTRINGS
slapd[2344]: begin test_substrings_filter
slapd[2344]: end test_substrings_filter 1
slapd[2344]: <= test_filter 5
slapd[2344]: => test_filter
- snip -
slapd[2344]: conn=5 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=

メールアドレスをtestで検索した場合4つの属性でSUBSTRINGS(部分文字列)検索をしていることがわかります。

この場合のindexは

index   mail, cn, givenName, surname    sub
index   objectClass                           eq

ということになります。

主立った3パターンを試してみましたが如何でしょうか?イメージ出来ましたでしょうか?

最後に・・・
パフォーマンスを考えれば使わないindexは張らない方が良いでしょう。indexは参照には有効ですが更新には足かせとなります。特にSUBSTRINGSはindexが大きくなりますので気をつけて下さい。あとは

index objectClass    eq

は指定した方が良いでしょうね。次はチューニング結果を試すためのツールなんかを紹介出来ればいいと思っています。

LX-2010にMIRACLE LINUX V4.0をインストール

先日、x86組み込み用CPUボード LX-2010にMIRACLE LINUX V4.0(ML40)をインストールしたのですが、その時のことをblogに書きたいと思います。先ずは、ボードのご紹介から。

  • CPU: AMD Geode LX700
  • memory:256MB
  • CFカード:1GB
  • 多少スペックが異なるかもしれませんが、詳細はこちらです。http://www.innotech.co.jp/products/product_list/board/cpubord/amd.html

インストールの開始前に行わなければならないのは、周辺ハード(ディスプレイ/キーボード/マウスなど)の準備です。幸い、USBポートが4つもついているため、キーボード/マウス/CDドライブ/FDドライブはUSB接続にしたので、それほど大変ではありませんでした。周辺機器の準備が完了後、早速CDからインストールを開始、インストーラの起動まではうまくいったのですが、ML40での起動までに3つの問題(3 step)に遭遇しました。

  • 非サポートマシンへのインストールという表示後、インストールが先に進めない
  • 上記問題解決後、CFカードの容量不足のためインストールができない
  • さらに上記問題解決後、kernelパッケージのみインストールされずgrub.confの作成に失敗し、起動されない

一つ目の問題は、ML40のanacondaインストーラの内部処理で、マシンアーキテクチャがi386である場合は、非サポートマシンとして扱い、インストールを終了させる処理を行っています。ただし、i386アーキテクチャであっても特段問題はないはずなので、ここの判定処理をとばすようにanacondaに手をいれることにしましました。

二つ目の問題は、CFカードの容量不足です。さらに容量の大きいCFカードがあれば、素直に変えればいいのですが、あいにく1GBのCFカードしかありませんでした。ただ、容量不足といっても、ML40の最小構成を選択するば、パッケージ自体をインストールするだけの容量は十分にあります。では、なぜ容量不足でインストールが先に進めないかというとML40 anacondaではパッケージのインストールに必要となる容量+500MBの空き領域がなければ、インストールを終了させる仕様となっているからです。これも必須ではないので、この判定もとばすようにanacondaにさらに手をいれることにしました。

そして、1,2の修正後アップデートディスクを作成してインストールを開始したのですが、インストールの終盤で三つ目のトラブルに遭遇しました。この問題もkernelパッケージをanaconda上で強制的にインストールさせてしまえば、解決するとは思ったのですが、インストールを最初からやり直すには時間がかかるので(スペックの関係から最小構成インストールでも結構時間がかかりました。)、rescueモードで起動後に下記の処理を実施しました。

  • usbメモリからkernelパッケージを取得
  • --ignorearchオプションを追加してkernelをインストール(rpm -ihv --ignorearch kernel-2.6.9-11.19AX.i686.rpm)
  • /boot/grub/grub.confを作成
  • grub-installを実施

上記の作業完了後、見事にML40で起動しました。容量も500MB近く空いているので軽いアプリならばインストールして動作させられると思います。(大量のlogがはかれるとすぐに容量いっぱいになってしまいますが。。。)

すべての道はUNIXに通ず?

こんにちは。二卵性双生児(男女)AB 型というなかなかレアな出生歴を持つ kyagiです。カードダースのキャラだったらプレミアものになっていたかもしれません。現実の人生は平凡そのものを歩んでいます。

最近シェルスクリプト内でのラッパ化(wrapper)を行う機会があったのですがそこでちょっとした落し穴にハマッてしまいました。今回はその落し穴についてのお話と最後に小咄をひとつ。

現在のコマンドを表示かつ終了ステータスのチェックを行うために下記のようなexecute() というラッパ関数を作成したのですが、これだと実行するコマンドラインにパイプ「|」やリダイレクト「>」がまじるとエラーになってしまいます。

#!/bin/sh

execute ()
{
        echo "Executing $command"
        $command
        if [ $? -ne 0 ]; then
                echo "ERROR: $command"
                exit 1
        fi
}

# OK
command='ls'
execute

# NG
command='ls -l | awk "{print $NF}"'
execute

# NG
command='echo "hello" >> outputfile'
execute

どうしたものかと 30分考えた挙句、 bash の eval という機能を思いだしました。evalは受け取った引数を結合してコマンドラインとして実行してくれます。すると、これがどうやらビンゴ!だったみたいでうまくいくようになりました。

$ diff a.sh b.sh
6c6
<       $command
---
>       eval $command
[kyagi@dhcp-0234 labo]$

ラッパ化の話はこれで終わりですが最後に雑談系の小咄をもうひとつ。

UNIXにみる世代間の断絶という興味深い記事がありますが、ふと世代別でプログラムの書き方はどう異なってくるのかと思いました。ここではkyagiが独断と偏見のもとシェルスクリプトのループ(0から9までを出力する)の書き方を、世代別でカテゴリ化してみます。

・旧人類(古き良き expr を使う)

$ i=0; while [ $i -lt 10 ]; do echo $i; i=`expr $i + 1`; done

・新人類と旧人類の中間(expr から let に移行)

$ i=0; while [ $i -lt 10 ]; do echo $i; let i=$i+1; done

・新人類(算術式展開を使う)

$ for ((i=0;i<10;i++)); do echo $i; done

・変人(タイプ数が少ないのがイチバン!)

$ for i in `seq 0 9`; do echo $i;done

いかがだったでしょうか。

上司や同僚の世代やTPOにあわせて書き方を変えてみると、世代間のギャップを埋めるのに役立つかもしれません。:-)

自宅サーバクラッシュ

そろそろ入社半年を迎えるmamanoです。少しずつ仕事にも慣れてきました。

雑談ですが、半年くらい稼働していた自宅のサーバがクラッシュしてしまいました。マシンはMac mini(PowerPC)で、Debian GNU/Linux 3.1(sarge)をインストールしていました。ちょうど以下のようなページが流れていたころです。

  • Installing Debian GNU/Linux on macmini
  • http://sowerbutts.com/linux-mac-mini/

  • 日経Linux1月号
  • http://itpro.nikkeibp.co.jp/linux/backnum/newest_mokuji_01.shtml

ここでちょっと簡単なPCの使用経歴を紹介したいと思います。サーバを初めて立ち上げたのはおよそ3年くらい前で、LAPPでブログを立ち上げて個人的に書いてました。といってもメモ代わりに使っていただけです(今は落ちています)。ブログのツールに不満があれば修正も加えていましたし、簡単な機能追加もしてました。特にいろいろ覚えたのはJavascriptで、まだAjaxだのweb2.0だの騒がれている前からガリガリ書いてたこともありました。自分のやりたいことを自由にやっていたのでなかなか楽しかったですね。Javascriptに関する情報が少なかったものの、それほど難しいと感じなかったので取っ付きやすかったのかもしれません。

このmac miniは自宅のデスクトップマシンとして活動しています。

最近の北京のタクシー事情

Asianuxの開発ミーティングに参加するため、久しぶりに北京を訪問しました。この前の出張が中国の旧正月前(1月末頃)なので、半年以上間隔が空いています。

初めて北京を訪れたのが2003年11月でした。その頃の北京のタクシーは、ほとんどがシトロエン(フランスの自動車メーカ)の赤い車でした。

061020_08450003_1

図1:シトロエン車。
シトロエンの中では結構まともな方です










シトロエン車の中には年季の入ったもの(日本の感覚なら廃車にしても良いほどの古さ)が数多くあり、車内の座席空間も狭く、かつドアを占めても隙間があったりします。
北京の冬は零下でとても寒く、冬にそんなタクシーに乗ると、隙間から冷たい風が入ってきて、体を震わせながら移動するという羽目になってしまいます。
そんな北京のタクシーに乗っていると、日本や韓国のタクシーの乗り心地の良さに素直に感動したりします。

去年ぐらい(?)から現代(ヒュンダイ:韓国の自動車メーカ)製の車が大量に導入され、北京のタクシー事情が様変わりしました。

061020_08450002

図2:現代車。
タクシーに乗るために手をあげ、止まった車が現代車だったりすると、
「今日の俺はついている」と思ったりしました。









乗り心地はいままでのシトロエンと比べ物にならないほど良くなり、「これで同じ値段ってありえない!」と思っていたりしていました。

さて、今回の訪問で驚いたのは、タクシー料金が大きく様変わりしていたことでした。いままでは、1.2元/km、1.6元/km、2.0元/kmの3種類のタクシーがあり、一番多いのが1.6元/km車で、次に1.2元/km車、2.0元/km車だったのですが、ほとんどが2.0元/km車になっていました。

061020_08310001_3

図3:タクシーに張られてある値段のラベル。
個人的にこの車は1.6元/kmが妥当かと。。。









車のグレードは同じで、値段だけが上がっていたという状況です。「えぇ~、こんな車も2.0元/kmなの?」と思う車まであります。現代製のが2.0元/kmならまだ納得もできるのですが、シトロエンも同じ値段っていうのはどうにも納得できません。

東京のように電車/地下鉄が発達していない北京では、タクシーはなくてはならない交通手段です。2008年北京オリンピックでは世界から多くの外国人が訪問するはずでそれに向けて、今後もいろいろ変化(現代車の導入、値段アップもその一つと思われます)があるのでしょうね。

ML4.0サーバをジュークボックス計画

どもyosuzukiです。まだまだ我が家のiTunes + Linuxでやることがあったので今回もそれ関係です。

今回は、せっかく前回の「ML4.0でiTunesサーバ」にしたので、Miracleサーバ上に集まった.mp3,.m4a,wmaをLinux上で聞きたい。これが出来れば、我が家のMiracleがファイルサーバ兼、iTunesサーバ兼、ジュークボックスになる。

我が家の3台のPCたちは、定期的にローカルのファイルをMiracleサーバに差分バックアップしてます。当然、各PCにたまった音楽ファイルもファイルサーバの一箇所に保存されて行きます。まぁ、iTunesサーバごしに各PC(Windows/Mac)から音楽を聞けばいいのですが、ほぼ常時起動のMiracleサーバをジュークボックスとして使わない手はないと考えてのです。

とりあえず今回までのところは、Miracleサーバ(ML4.0SP1)で音楽ファイルをiTunesライクに聞くとこまでやってみました。使用したソース、バイナリは以下の通り。バージョン選択は厄介ですが、インストールは特に難しいところはないので手順は省きます。

#MiracleはRHEL互換なので、、、問題なく動きます。

さて、gtkpodですが慣れるまで使い勝手が悪いですが、iTunesとほぼ同じことが出来そうです。以下、J-POP用のプレイリストからアーティストを選択し、XmmsでRandom再生中。(文字コードもほぼOK)

Gtkpod01_1

ちなみにPodcastは現状は厳しそうなので、とりあえずパス。

本当は、使っていないiPod nanoを指してgtkpodで曲の同期などを行いたかったのですが、我が家のPen3マシンはUSB1.0なので、そうもそもマウントできず。USB2.0のボードを追加して次回チャレンジします。多分問題ない。

※実はこの作業をやるのに一番大変だったのは、音を出すとこまでだったりします。古い自作マシンなので我が家に転がってたSoundカードの3枚目で音がでました。

会社の周辺事情?

最近、会社のあるビルの前で「ザ・たっち」の二人がメキシカンな格好で撮影(と思われる…)をしていました。でもカメラがありません。なぜ??(後半へつづく。)

この付近はヴィータイタリアというイタリア風の町並みを目指した一角な為、よく撮影に使われているようです。結構頻繁に撮影風景を目にします。しかし、ミーハーに思われるのが嫌なので近づいて見たりは絶対にしません。いつも遠くから一別するだけなので有名人を直接目にする事はほとんどありませんでした。撮影されたモノをメディアを通じて目にする事もほとんど無く(気がつかないだけ?)TVCMで、何度かバックに使われているのを目にした程度です。
(伊東美咲さんの出ている車のCMの最後に走り去る場面のバックとか、黒木瞳さんの出ている車のCMのバックとか。。そんなのばっかりだ。)
隣にWINSがあるので、競馬番組のご一行を目にした事はありますが、これは単にテレビ局から近いから?なのでしょうね。

で、最初の「ザ・たっち」の二人は何をしていたかがよく分からないまま、あくまで遠巻きに見ていたのですが、つい最近、病院の待合室で何気なくテレビを見ていたら、日テレの朝の「ラジかる!!」のなかで、おそらくお天気カメラからの映像のなかにいる「ザ・たっち」の二人が写っていました。見た瞬間、「あ、これだったのか。。」と思った次第です。さすがにこの時間の番組は普段見ないからなぁ。そういえばちょうど11時前くらい。なんだ、結局は日テレに近いのが理由だったのか。。

ちょっと前までは汐留とはいいつつも人通りは隣のWINSへ行くと思われる方々ばかりでいかにも「新橋」だったのですが、近頃はだいぶ人通りも増え、道行く方々の雰囲気も「汐留」な感じに変わってきたようです。

あとはビル横のJR高架の工事が終われば最高かな…と思えるのですが、いつ終わる事やら。

Notes Client on MIRACLE LINUX V4.0

さて、今回は前回の続きでLinux版NotesClientをMIRACLE LINUX上でセットアップする方法を案内します。

用意するもの
・MIRACLE LINUX V4.0(32bit版)がインストールされてマシン
・Linux版NotesClient英語版(C93D1NA.zip)

下準備
RedHatやCentOSの場合も同様ですが、mozillaパッケージが無いとインストーラーが先に進めませんので
先にインストールしておきましょう。 インストールされているか確認するには、以下のコマンドがよいでしょう。

   # rpm -q mozilla
mozilla-1.7.12-.xxxx(インストールされていると、このようにバージョンが表示されます。)

MIRACLE LINUX V4.0の場合はmozillaの代わりにfirefoxを入れてありますが、
インストーラーの頭が固くて「mozillaのバージョンが確認できません!」とか言います。
仕方が無いので設定ファイルのみ含んだダミーパッケージを作成しましたので、ご利用ください。

http://ftp.miraclelinux.com/uploaddata/mozilla/mozilla-1.7.13-dumy.2AX.i386.rpm

RedHatやCentOSを利用している方で、mozillaが入ってない場合はCD-ROMやネットから探して、
インストールしてください。CD-ROMの場合は、1枚目の場合が多いです。

mozillaの前にdesktop-file-utilsをインストールします。
    # rpm -ivh desktop-file-utils-0.9-2.i386.rpm

次にmozillaをインストールします。(実際は1行です。もちろんバラバラに入れてもかまいません)
    # rpm -ivh mozilla-1.7.12-1.4.2.centos4.i386.rpm mozilla-nspr-1.7.12-1.4.2.centos4.i386.rpm mozilla-nss-1.7.12-1.4.2.centos4.i386.rpm


ここから実際のインストール手順です。
以下rootユーザ以外の一般ユーザで実行します。
1.アーカイブの展開
 まずはC93D1NA.zipを展開します。
  $ unzip C93D1NA.zip
  さらに展開されたなかのPersonality.zipをpluginだけ展開します。
  $ unzip Personality.zip -d plugin

2.setuplinux.binの入れ替え
 C93D1NA.zipから展開されたsetuplinux.binに実行権限をつけて先ほどのplugin以下の所定の位置にコピーします。
  $ chmod 777 setuplinux.bin
  [以下実際は一行です。]
  $ mv setuplinux.bin plugin/updateSite/features/com.ibm.workplace.notesinstall.linux.feature_7.0.1.0000-0900/bin/linux/

3.インストールディレクトリの作成
  ※インストール先をユーザーのホームディレクトリにする場合はこの作業は不要です。

rootユーザーで以下を実行します。
  # mkdir /opt/IBM
  # chmod 777 /opt/IBM

4.インストーラーの起動
  インストールスクリプトsetup_wct_platform.binに実行権限を付与します。
  $ chmod 777 plugin/setup_wct_platform.bin
  インストールスクリプトを実行します。
 $ plugin/setup_wct_platform.bin
  ここでGUIのインストールウィザードが起動します。

この後はGUIの画面の指示通り進めて行くだけで、デスクトップにNotesクライアントのアイコンができます。

今のところ日本語版や日本語化キットは出ていませんが、
メニュー以外はほとんど日本語で表示されますので、
実際の利用には問題ないのではないでしょうか。<あまりにも初物すぎますが。。。

Notes_1

※今回のパーミッションの変更はドキュメント通りです。そのまま777がいいかどうかは疑問です。

追加の画面ショットです。IBM Workplace Managed Clientです。というかEclipseなのかも。

Notes1

ポストモーテム

こんにちは、shigeonsdです。

8月末で弊社の Q1 が終了し 9 月から Q2 が始まりました。かなり遅かったのですが 9/27 に、プロジェクトの総括をしました。総括というと大仰な印象を与えてしまいますが、要はそのプロジェクトの中で、

  • 良かったこと
  • 悪かったこと
  • 改善すべきこと

の3点を洗い出し、今後のプロジェクト運営のために「振返り」をやろう、ただそれだけのことです。

ポストモーテムの準備

このポストモーテムには、プロジェクトマネージャ(PM)である私、プロジェクトに参加したメンバ3名、プロジェクトの運営に興味がある有志があつまりました。プロジェクトマネージャとメンバには事前に自分が参加したプロジェクトについて前述の 3 点をまとめました。

ポストモーテム開催

この会の目的は、「良かったこと」、「悪かったこと」を整理することで、それらが起った必然性を明らかにし、今後のプロジェクト運営の「改善すべきこと」を導き出すことです。決して失敗の原因から犯人探しをすることではありません。これを会の冒頭で参加者に伝えた上で、参加者がそれぞれ事前にまとめた内容を発表しました。

  • 良かったこと
    • 単体テスト/インターフェーステスト/総合テスト の各フェーズが実行され、全バージョンで見られたNECによるバグの指摘がほぼなくなった。特に各テストのスクリプト化は他の開発案件にも応用できる部分と考える
    • テストファーストを採用することでゴールが明らかだった
    • マネージャと実装者を分離し役割分担が明確だった
    • ペアプログラミングを実践した
  • 悪かったこと
    • 仕事の進め方が、場当たり的であった
    • リスクマネジメントが不十分だった
    • 開発者が育っていない
  • 改善すべき事
    • お客様の要求があるようなソフトウェアに関してはきっちりとしたフローでやらなければいけない
    • PM方法論の導入
    • TQMの実践
    • 領域依存の知識教育方法論
  • 第三者からの意見
    • バグデータベースは宝の山。同じ過ちを繰り返さないための答えがこにある!
    • 仕様がちゃんと fix 出来ていない状態では顧客のニーズに 100%マッチした成果物を作ることはできない
    • 個々のプロジェクトが終わったときにポストモーテムを実施する

ほかにもいろいろな事が挙げられたのですが、全体をみると開発プロセスが共有出来ていないことによって問題が発生しているように感じられました。そこで次のプロジェクトでは、以下の 2 点の改善に取り組むことにしました。

  1. 標準開発プロセスの確立
  2. バグデータベース整備

また、メンバそれぞれにも自分が取り組む課題を設定してもらいました。

ポストモーテムのポストモーテム

この「ポストモーテム」という習慣は簡単なようでなかなか実践されていることは少ないのではないでしょうか? 本来であれば、プロジェクトの終結フェーズで「振返り」をするべきですが、私自身、あるプロジェクトの終結時期は次のプロジェクトの立ち上げの時期と重複したりして、なかなかポストモーテムを実践できていませんでした。

個人が頭のなかだけで考えるのではなく、整理し、プロジェクト関係者全員で振返ることで多くのことを学ぶことができました。また、良かった点、悪かった点の認識を共有することができたように思います。改善点も挙げられましたので、今後のプロジェクトでの課題も明確になりました。

プロジェクト終結フェーズで必ず振返るという習慣を当たり前のこととして組織に根付かせていきたいと考えています。

EUC-JP と Shift_JIS

弊社ブログユメのチカラ で、MySQL で ujis の 0x5C が sjis の 0x815F に変換されてしまう問題 が取り上げられていましたので、なぜ、そのような変換が行なわれるのか、そしてそのような実装が間違いとは言いきれない事を話たいと思います。

MySQL での ujis と sjis は、それぞれ、IANA で定義されている EUC-JP と Shift_JIS に相当します。

まずは、それぞれの定義を見てみましょう。

EUC-JP の定義

Name: Extended_UNIX_Code_Packed_Format_for_Japanese
MIBenum: 18
Source: Standardized by OSF, UNIX International, and UNIX Systems
        Laboratories Pacific.  Uses ISO 2022 rules to select
               code set 0: US-ASCII (a single 7-bit byte set)
               code set 1: JIS X0208-1990 (a double 8-bit byte set)
                           restricted to A0-FF in both bytes
               code set 2: Half Width Katakana (a single 7-bit byte set)
                           requiring SS2 as the character prefix
               code set 3: JIS X0212-1990 (a double 7-bit byte set)
                           restricted to A0-FF in both bytes
                           requiring SS3 as the character prefix
Alias: csEUCPkdFmtJapanese
Alias: EUC-JP  (preferred MIME name)

Shift_JIS の定義

Name: Shift_JIS  (preferred MIME name)
MIBenum: 17
Source: This charset is an extension of csHalfWidthKatakana by
        adding graphic characters in JIS X 0208.  The CCS's are
        JIS X0201:1997 and JIS X0208:1997.  The
        complete definition is shown in Appendix 1 of JIS
        X0208:1997.
        This charset can be used for the top-level media type "text".
Alias: MS_Kanji
Alias: csShiftJIS

ここで注目すべき点としては、0x00~0x7F の部分で、EUC-JP は US-ASCII、Shift_JIS は JIS X 0201 ラテン文字 (ローマ文字) となる点です。

MySQL での文字コード変換は、Unicode 経由での変換となっていますので、IANA の定義にしたがって、EUC-JP と Unicode、Shift_JIS と Unicode の対応関係を表にすると次の様になります。(問題になるコードポイントのみピックアップ)

EUC-JP と Unicode の対応表
EUC-JPUnicode
0x5C REVERSE SOLIDUS U+005C REVERSE SOLIDUS
0x7E TILDE U+007E TILDE
0xA1C0 REVERSE SOLIDUS U+FF3C FULLWIDTH REVERSE SOLIDUS
0xA1EF YEN SIGN U+00A5 YEN SIGN
0xA1B1 OVERLINE U+203E OVERLINE
Shift_JIS と Unicode の対応表
Shift_JISUnicode
0x5C YEN SIGN U+00A5 YEN SIGN
0x7E OVERLINE U+203E OVERLINE
0x815F REVERSE SOLIDUS U+005C REVERSE SOLIDUS
0x818F YEN SIGN U+FFE5 FULLWIDTH YEN SIGN
0x8150 OVERLINE U+FFE3 FULLWIDTH MACRON (JIS規格参照)

この対応表を使って、EUC-JP の 0x5C を Shift_JIS に変換すると、どうなるか見てみましょう。

EUC-JP (ujis)UnicodeShift_JIS (sjis)
0x5C U+005C 0x815F

EUC-JP の REVERSE SOLIDUS (0x5C) が Shift_JIS の REVERSE SOLIDUS (0x815F) に変換されています。これは、MySQL で ujis の 0x5C が sjis の 0x815F に変換される動作と同じですね。

MySQL の変換は、利用者からしてみれば不具合でしかないわけですが、上記のように IANA の定義に従ってまじめに実装を行なった結果だと分かるかと思います。

ただし、MySQL では Shift_JIS (sjis) の 0x5C YEN SIGN を EUC-JP (ujis) の 0xA1EF YEN SIGN に変換せずに、0x5C REVERSE SOLIDUS に変換しているので、規格に厳密に実装しているわけでも無さそうです。

なぜ、そのような実装になるのか思い当たるフシはありますが、ここでは省略させてもらいます。

mysql> SELECT HEX(CONVERT( _sjis 0x5C using ucs2 ));
+---------------------------------------+
| HEX(CONVERT( _sjis 0x5C using ucs2 )) |
+---------------------------------------+
| 005C                                  |
+---------------------------------------+
1 row in set (0.00 sec)

EUC-JP、Shift_JIS の実装に関しては、伊藤隆幸さんのホームページの 従来の文字コードとUnicodeの対応に関する諸問題 > 6. ASCIIとJIS X 0201ローマ文字 で説明されているように、JIS X 0208や JIS X 0212 はなるべく FULLWIDTH に追いやってしまうという事にすれば、今回のような文字化けを回避可能となります。

cp932 と eucjpms (eucJP-ms) に関しては、JIS X 0208 や JIS X 0212 を FULLWIDTH に追いやってしまう事に加えて、JIS X 0201 ラテン文字を Unicode の U+0000~U+007F のコードポイントに対応付けするという事をして、Unicode 以前の US-ASCII と JIS X 0201 ラテン文字の扱いと同じ解釈で処理が行なえるようになっています。

規格遵守をしようと思って実装を行なうと、実際には利用者にとっては使えないものを作ってしまうという不幸をなくす為にも、規格遵守した時に矛盾が生じないように規格の改正などが必要かもしれません。

不定期Wine談義(2) : AsianuxでWineをセットアップする

こんにちは、rkです。性凝りもなくWineの話を書こうと思います。

前回は手を動かさないネタだったので、今回は手を動かすネタを紹介します。ずばり、インストール&セットアップです。とはいっても、今回は時間がないので駆け足です(すみません)。

AsianuxでWineを動かす方法には、Fedora Core 3用のRPMを使用する方法と、自前でコンパイルする方法がありますが、前者ではWine以外にも多くのソフトウェアを追加しなければならないのと、次回以降に予定しているネタに使うデータがとれないため、ここでは自前でコンパイルする方法を紹介します。

●ソースコードの取得

www.winhq.orgの左のサイドバーの[Get Wine Now]からたどってソースコードをGetしてください。このBlogを書き始めたところ、ちょうど0.9.23という新しいバージョンが出たようですが、いまいち安定していないようです。当面0.9.22以前を利用することをおすすめします。

●コンパイルとインストール

ソースコードをGetしたら、下記の要領でコンパイル&インストールします。バージョン0.9.22に関してはAsianuxでのコンパイルで特に問題は発生しませんので、ごく真っ当な手順になります。また、コンパイルするときに、scriptコマンドなどでコンパイル中のログをとっておくことをおすすめします。

# tar jxf wine-0.9.22.tar.bz2 -C /usr/local/src
# cd /usr/local/src/wine-0.9.22
# script build.log
スクリプトを開始しました、ファイルは build.log です
# ./configure && make && make install
# exit
exit
スクリプトを終了しました、ファイルは build.log です

●セットアップ

インストールしてまず始めにセットアップするにはwinecfgコマンドを実行します。これは一般ユーザーで実行します。

$ winecfg
wine: creating configuration directory '/home/kamei/.wine'...
Failed to open the service control manager.
fixme:ole:ITypeInfo_fnRelease destroy child objects
wine: '/home/kamei/.wine' created successfully.

次のような設定画面が出たら初期の自動セットアップが終わったことになります。

Winecfgpanel_1

●ソフトウェアのインストール

ソフトウェアをインストールするには、単純に

$ wine <インストーラのexeファイル>

とするだけです。デスクトップにアイコンを作る類のアプリケーションではちゃんとアイコンがあらわれます。例えば次のようになります。

Winehidemaru

今回は非常に短くなってしまいましたが、次回はもう少し掘り下げたネタが書ければなと思います。

スピンロックその6

月イチ更新と化したこのスピンロック連載、おそらく固定読者はいないと思いますが細々と続けてみます。
前回の最後に「次は(c)のケースだ」などと予告しましたが、(b)のケースとあまり変わり映えしないので思い切って省略します。ふりかえれば、その2でロック取得を追い始めて以来早くも3か月経ってしまいました。いい加減にロックを解放しなきゃどんなシステムも止まるわな、てなわけではありませんが話題を spin_unlock() に移します。
その2で確認したタスク・スケジューラの task_rq_lock() に対応する解放処理は、その名も task_rq_unlock() です。

kernel/sched.c

static inline void task_rq_unlock(runqueue_t *rq, unsigned long *flags)
        __releases(rq->lock)
{
        spin_unlock_irqrestore(&rq->lock, *flags);
}

関数のインタフェース宣言行と処理本体との間に見慣れない行がありますね。これはロックの取得・解放の数をカウントするツールのためのマクロだそうです([linux-pm] __releases and __acquires macros in compiler.h)。定義からしても通常のビルドでは消えますね。

#ifdef __CHECKER__
# define __acquires(x)  __attribute__((context(0,1)))
# define __releases(x)  __attribute__((context(1,0)))
#else
# define __acquires(x)
# define __releases(x)
#endif

さて task_rq_unlock() の実体は spin_unlock_irqrestore() であることが分りましたが、これもまたマクロです。

include/linux/spinlock.h

#define spin_unlock_irqrestore(lock, flags) \
                                        _spin_unlock_irqrestore(lock, flags)

この _spin_unlock_irqrestore() の定義は Uni-Processor と SMP とで異なります。
まずは簡単そうな UP から見ていきましょう。

include/linux/spinlock_api_up.h

#define _spin_unlock_irqrestore(lock, flags) __UNLOCK_IRQRESTORE(lock, flags)
#define __UNLOCK_IRQRESTORE(lock, flags) \
  do { local_irq_restore(flags); __UNLOCK(lock); } while (0)

この local_irq_restore() は割り込みの回復ですが、これは後回しにして、実体と思われる__UNLOCK() から先に確認しましょう。

include/linux/spinlock_api_up.h

#define __UNLOCK(lock) \
  do { preempt_enable(); __release(lock); (void)(lock); } while (0)

この preempt_enable() は include/linux/preempt.h で定義されていますが、これはマクロが続く分かりにくい構造なので、諦めて gcc に展開させることにします。
次のような C 言語ソースファイル a.c を準備。

#include <linux/preempt.h>
preempt_enable();

カーネルのソースツリーの include ディレクトリを -I で指定した cc -E でプリプロセッサに掛けます。

$ cc -E -I ./linux-2.6.16.18/include a.c
[関係ないところは省略]
do { } while (0);
$

空っぽになるんですね。
次に CONFIG_PREEMPT を define してコンパイルすると、

$ cc -E -I ./linux-2.6.16.18/include -DCONFIG_PREEMPT a.c
[関係ないところは省略]
do { do { barrier(); do { (current_thread_info()->preempt_count) -= (1); } while (0); } while (0); barrier(); do { if (unlikely(test_thread_flag(TIF_NEED_RESCHED))) preempt_schedule(); } while (0); } while (0);
$

あまりに読みにくい。。。 indent コマンドで整形してみますか。

$ cc -E -I ./linux-2.6.16.18/include -DCONFIG_PREEMPT a.c | indent
[関係ないところは省略]
do
  {
    do
      {
        barrier ();
        do
          {
            (current_thread_info ()->preempt_count) -= (1);
          }
        while (0);
      }
    while (0);
    barrier ();
    do
      {
        if (unlikely (test_thread_flag (TIF_NEED_RESCHED)))
          preempt_schedule ();
      }
    while (0);
  }
while (0);
$

余計な do {} while() を削ると、つまりこーゆーことですね。

barrier ();
(current_thread_info ()->preempt_count) -= (1);
barrier ();
if (unlikely (test_thread_flag (TIF_NEED_RESCHED)))
  preempt_schedule ();

タスク毎の preempt_count というカウンタから1を引いています。その前後にはメモリバリアですね。最後は、もしも休止すべきタスクならば、ここで休止させると。
なんだかタスク・スケジューラの方に脱線しそうなので、ここで一旦休憩です。

切りがいいので今回はここまでとさせてください。

中国の携帯電話

またまた中国についてのお話です。

ここ中国でも例に漏れず、携帯電話はかなり普及しています。加入件数は、日本の総人口の3倍を軽く超えているそうです。当然それに近い台数が出回っているわけで、これなら薄利多売でも採算が合いそう。と、思いきや、ここ中国の携帯電話の価格は日本のそれに比べると非常に高いです。日本の場合はキャリアと端末が固定されており、これにより、携帯サービス会社から販売店への奨励金等々があるため安い価格で販売できるわけです。そう言ったことを考えると、中国での携帯電話価格が特別高い価格帯にある訳ではなく、日本が他と比べると安いと言えるでしょう。

実際に、中国で携帯電話を購入すると、端末とSIMカードを購入することになります。このSIMカードというのは、日本でもFOMAで使われているFOMAカード。VorderPhoneのUSIMカードと同じものをイメージしてもらえばいいです。親指の爪大の小さなカードに電話番号の情報等が入っており、このSIMカードを端末に刺して使うことになります。つまり、端末を買い換えてもSIMカードを差し替えればそのままの電話番号で継続利用していくことができます。先に述べたとおり、キャリアと端末が固定されていない(SIMフリーと呼ばれる)ため、このようなことが可能です。日本では、VorderPhoneの端末にFOMAカードを刺して使う。ということは出来ませんが、こういったことも可能です。

また、日本で販売されている国際ローミング対応の端末を中国等に持ってきて、中国のSIMカードを入れても動作しません。これがSIMロックと言われるもので固定されているキャリア以外のSIMカードは利用できなくなっているわけです。逆に、海外で購入した3G対応の端末を日本に持ってきた場合はFOMAやVorderPhoneのSIMカードを利用することができるわけで、安いローカル通話の料金(ローミング費用がかからない)での通話利用ができるということです。

北京のSIMカードには、通話料先払いのプリペイド式のものと後払いのポストペイド式のものが存在します。プリペイド式のものは基本料金もない(チャージ後の有効利用期間がある)ため、時々中国に出張に行く。という人に向きます。ポストペイド式のものについては、月50元ほどの基本料金が発生します。私の場合は、会社用としてプリペイド式の携帯と個人用のポストペイド式の携帯の2つを持ち歩いています。

私は中国に来てから数台端末を買い換えてきましたが、現在メインで使用している端末はNOKIA E61(簡体中文版)という端末です。これは3G携帯であり、中国のようなGSM圏はもちろん、日本のようなW-CDMA圏でも利用できます。中国の大陸部では3G携帯の販売認可はまだ下りない(これには理由がありますがあえて伏せておきましょう)ため、香港の友人に頼んで購入してもらったものです。CDMA圏での利用はできませんが、韓国、ソウルの一部ではW-CDMAサービスが存在するというような噂を聞きました。実際、使ってみるとソウルでもがっちり電波を掴んでいたので、ミラクルのような日中韓の出張が多いような人間にとっては非常に便利です。

中国滞在が長くなったので、日本での携帯はずいぶん前に解約をしました。ただし、これだと日本に帰国した際に携帯がない状態となり非常に不便です。なので、中国移動の国際ローミングサービスを申し込みました(前述したプリペイド式でのサービス利用は不可)。日本、韓国ともにローミングサービスのエリアに入っているので利用可能です。国際ローミングの申し込みは、中国移動のオフィスに行ってデポジットを払う必要があります。私が申し込んだ時(1年くらい前かな?)は3000元のデポジットを支払いましたが、今は1000元程度でいいようなことを言っていました。

国際ローミングを使ってみて便利だと感じたのはSMSのやり取りです。日本にいながらにして、中文SMSのやり取りを普通に行えます(料金は若干高いですが許容範囲です)。中国にいる発信側は、私がどの国にいるのかなんて意識する必要なく、いつもの電話番号に向けて発信すればいいだけです。不便な点は、日本の同僚・友人が日本にいる私に向けて電話発信する際に、いちいち国際電話をかけなければならないことです。これを解決するのに、私は Skype を利用しています。Skype In で電話番号を一つ買い、さらに Skype の通話転送機能を使って携帯電話に転送をします。こうすると:

  1. 日本の同僚・友人が 050 で始まる Skype In の私の番号に電話する →
  2. Skype へ転送 →
  3. この時、私がPCの前にいれば Skype でそのまま通話。いなければ →
  4. 携帯電話に転送 →
  5. ローミングを使って携帯に届く。

という感じになるわけです。つまり、国際電話をする必要はありません。1秒~2秒程度の会話のタイムラグが発生しますが、十分に使えています。

NFSインストール

今日は、Linux初級編として、ネットワークインストールについて書きます。

インストールの方法もいろいろあります。一般的なのが、CDメディアからのインストールです。その他にも、

  • HDDからインストール
  • ネットワークインストール(FTP, NFS, HTTP)

などあります。

今日はその中で、NFSを使ったネットワークインストールを紹介します。

まず、準備する物が、下記になります。

  • インストール対象マシン
  • インストールのCDメディア
  • NFSサーバ

次にNFSサーバの設定を行います。

インストールCDはML40、公開ディレクトリは "nfs/ML40"とします。

  1. 公開用のディレクトリを作成。
  2. #mkdir -p /nfs/ML40
  3. インストールCDメディア(1 of 2 )の内容をNFSの公開ディレクトリにコピー
    • 1枚目CDを挿入後、mountを実施。
    • #mount /mnt/cdrom
    • 公開ディレクトリにコピー
    • #cp /mnt/cdrom/* /nfs/ML40/.
    • コピー終了後、2枚目のCDを挿入し上記作業を実施。
      上書きしますかと聞かれるので、上書きしてください。
  4. NFSの起動
    • /etc/exportに公開ディレクトリを書く。
      IPとNETMASKは自分の環境にあわせてください。
      /nfs/ML40    10.1.0.0/255.255.0.0(ro)
    • portmap / nfs の順に起動する。
    • #service portmap start
      #service nfs start

これで、NFSサーバ設定が終了です。

次に対象マシンにインストールCDを挿入して、起動します。

CDーROMのブートイメージが立ち上がったところで、"linux askmethod"を入力してエンターを押すと「インストール方法(Installation Method)」が表示されます。

boot: linux askmethod

インストール方法(Installation Method)」の画面で、「NFSイメージ」を選択するとTCP/IPを設定する画面が表示されます。自分の環境にあわせて、DHCPを選ぶか、固定IPと必要な情報を設定してください。

TCP/IPの設定が正しく構成できれば、NFSの設定画面が立ち上がってきます。ここで、先ほど作成したNFSサーバのIPと公開ディレクトリ(/nfs/ML40)を設定してください。

ディレクトリのマウントに成功すると、インストールが始まります。NFSインストールするとCDメディアの取り換えがないため、手間が省けます。

Emacs *scratch*

こんにちは、tshojiです。前回から続きましてEmacsネタです。
前回はverilog-modeを扱っていましたので、Emacs上で簡単に式を評価する方法を紹介します。

*scratch*バッファはEmacs Lispを簡単に評価できるバッファです。
実際は [Meta-x] lisp-interaction-mode とすることで *scratch*バッファ以外でも
使用することができます。

例えば、電卓変わりに使用することはよく知られています。

式の最後で[Ctrl]+[j]キーを押すことで式の結果が出力されます。
( 「>」から始まる行は表示される結果、「;;」から始まる行はコメントを表しています )

----------------------------------------------
;; 1 + 2の結果は?
( + 1 2 )
> 3
----------------------------------------------
;; 変数に値をセットする
( setq x 100 )
> 100
----------------------------------------------
;; 変数の値の確認
x
> 100
----------------------------------------------
;; ( 20 + 30 + 50 ) * 100 / 200
;; 変数を使ってわかりやすく

( setq a ( + 20 30 50 ) )
> 100

( setq b ( * a 100 ) )
> 10000

( setq c ( / b 200 ) )
> 50

c
> 50
----------------------------------------------
;; 日本語でも問題なし
( setq ほげほげ ( * 100 50 ) )
> 5000

ほげほげ
> 5000
----------------------------------------------
;; 「日本語+英数記号」の関数とか
( defun かんすう*100 (n)
   ( * n 100 )
)

> かんすう*100

( かんすう*100 2 )
> 200
----------------------------------------------
;; 16進数もつかえる
( setq hex ( + #x10 #x10 ) )
> 32  ;; でもこれは10進数...

( format "%x" hex )
> "20" ;; 2進のときは %b, 8進のときは %o, 10進のときは %d

( string-to-int ( format "%x" hex ) )
> 20   ;; これで文字列"20"が数値になりましたが、この数値は10進数なので注意です。
        ;; 単純に文字列を変換しているだけです。

----------------------------------------------
;; 演算で定数を得る
(*)
> 1

(+)
> 0
----------------------------------------------

以上が*scratch*バッファの簡単な説明になります。実際にはEmacs Lispのドキュメントを
見ると、できることが広がります。
Emacsのヘルプやドキュメントは F10 h r や Menuからたどることができます。

X のコアダンプ

本日は時間の関係で、「Linux 一口メモ」にさせていただきます。

アプリケーションがクラッシュした際、どのように原因を調査しますか?
吐き出されたコアダンプを gdb 等を用いてデバッグ方もいると思います。
しかし、X Window がクラッシュした場合、そのままではコアダンプを吐かないため、以下の設定をする必要があります。

1. /etc/X11/xorg.conf に以下を追加する。
------------------------------------------------------------
Section "ServerFlags"
    Option "NoTrapSignals"
EndSection
------------------------------------------------------------
2. root で実行 (必須)
3. SEGV が発生すると core.$$ を吐くようになります。

ビルの世界ラインキング

個人的には、アメリカ、ヨーロッパ、アジアが全部好きですが、アジアの文化は互いに関係があり馴染み易いのでアジアにはより興味を持っています。

最近、度々新聞に出るのですが、今月か来月中にJRの新幹線の開通式が台湾で行なわれるという報道です。日本の新幹線技術の最初の輸出のため、注目度が高いですね。

私は台湾に行ったら、ほぼ毎回ある場所に行きます。台北101という世界で最高のビルが台北市内にあるのが御存じでしょうか。世界最高ですね。そのすぐ隣に台北の世界貿易センタービルがあります。幸いこのセンタービルは6、7階ぐらいの高さしかないので、飛行機はまず、突っこまないでしょう。そういう意味では101の方が危ないかもしれません。

自前の写真が見つからないので、このリンクで見てみて下さい。

全体は金属でできています。また、101階はあるのですが、5階まで一般解放されて有名なブランド店などが開店し、大きなショッピング・モールとなっています。全体的にどちらかと言えば、六本木ヒルズと同じような感じですが、もうちょっと空間的には広いです。

世界1だから、2位はどこだというランキング好きな人は次のリンクを見れば満足できるでしょう。そうじゃなかったらごめんなさい。

国別に何本あるか探しましょう。そして earth.google.comで実物(?)を見ることも面白いかも。

ベアボーン購入

yoishiです。
個人でベアボーン購入しました。
AOpen社のminiPCです。確か購入価格は39,800円。
なんて偉そうに言っても、実はPC自作初心者で、ベアボーンって言葉すらよく知りませんでした。
じゃあ、何で購入したかというと某PC-OOccessのメルマガ見ていて、「安い静音PCがある!」と思ったからでした。そう、ベアボーン=ホワイトボックスみたいな無名ブランドPCだと思ったのです。僕がショップサイトを見た時点で限定40台中残り2台状態でした。それから軽くスペックなどを見ている間に、それが残り1台に変わってました。それを見た瞬間に、もう訳も分からず購入手続きに入ったのでした。オンラインでの銀行振り込み手続きまで一気に処理した後、再度ゆっくりスペックを見てみると・・・あれ?「※本製品にCPU、メモリ、HDDは付属いたしません。」?
ベアボーンって、これが当然なんですね。ああほんとに知らなかった。ざっと見ると、対応CPUは3万円以上、メモリは1万円以上、HDDも2万円以上?一気に10万越えですか。そういえばディスプレイとマウス、キーボードも。。。完成は3か月後かな。。。
ひとつ疑問はHDDも付いていないのにWindowsXPが付属していたことです。 何故?どうせLinux機なのにー。

CIOのためのIT内部統制実践セミナー

今日開催されていた無料セミナー「CIOのためのIT内部統制実践セミナー」に出席してきました。

日本コンピュウェア株式会社主催のセミナーだったので、基本的には同社の製品であるChangepointの紹介だったのですが、基調講演である「内部統制の時代のITガバナンス実践構築方」を始め参考になりました。

これまで、CIOとは社内ITシステムの責任者+アルファという認識を持っていたのですが、最近では社内ITシステムと経営や各部門の戦略との密接な係わり合いが認識されつつあるようで、社内ITシステム自体の管理に加え、ITシステムの側面から業務フローやプロジェクト管理、リソース管理などの領域にも踏み込み、ビジネスとITをブリッジする役割が主になってきているようです。

同時に、最近は日本版SOX法やコンプライアンスなど、法整備の観点でも社内システムの重要性が見直されていますから、業務/承認フローの策定とそれに関わるドキュメントの作成、監査なども行う必要があります。

上記のような要件を満たすITシステムを実現するメカニズムを確立することを「ITガバナンス」というわけですが、現在はちょうど過去の「単機能の集合」のシステムから、「ITガバナンス的な(?)」のシステムへ移行する過渡期にあるように思います。一般的にユーザが1万人でも、社内ITシステム部門はせいぜい10~20人程度でしょうから、セミナーを聞きながらCIO含め社内ITシステム部門の方々の苦労が目に浮かぶようでした。

今回のセミナーの目玉であったChangepointですが、ITガバナンスに必要な各機能を持ち、それら統合管理できるツールで、インターフェース、機能ともに洗練されているように見えました。すでに世界中の500社以上で利用されているようです。まだまだExcelやWordを利用して社内情報の管理をしている会社が多いのではと思うのですが、今後はこういったソリューションの必要性も高まってきそうです。

翻って、オープンソースの世界では、上記のような社内業務に関わるツールがあまり存在しないように思います。プロジェクト/リソース管理ツールはいくつか存在しますが、まだ実用に耐えうるものは数少ないですし、統合管理ともなれば皆無だと思います。
開発者が興味を持ちにくい分野であることも1つの原因なのでしょうが、今後、Linux/オープンソースの組み合わせを社内システムにも広げていくためには、こういった社内システム向けの"キラーアプリ"の存在が欠かせないだろうと感じました。

最後に、1つ面白かったのはMicrosoft社でもプロジェクト管理にChangepoint利用しているとのこと。MS Projectじゃないんですね。

emacs プチ拡張(タグジャンプ)

こんにちは。動物占いでチータと出た結果にどうも納得がいかないkyagi です。

さて、以前弊社ブログではソースコードをもっと早く便利に読む方法として関数や変数に一発でジャンプできる「タグジャンプ」機能を紹介しました。ただエディタとしてviのみの紹介にとどまっていたため、今回はそのemacs版を紹介いたします。

ただ設定ファイルの書き方を紹介しても面白くないと思いますので、今回はkyagiの思考のプロセスを追いつつ、emacs-lisp プログラミングにも突入していきます。

まず、前回までのおさらいです。カーネルソースのタグテーブルを作成するには

$ cd /usr/src/linux
$ make TAGS

とするのでした。

emacs の基本的な設定としてはこの後に設定ファイルである $HOME/.emacs に

(setq tags-file-name "/usr/src/linux/TAGS")

と追記して起動し、 「M-.」 でタグジャンプ機能を起動すれば基本的にはOKです。

しかし、このままだとタグからタグへ移動する際にそれぞれ 「C-u M-.」や「 M-*」と打たなくてはならず、ちょいエロ、じゃなくてちょいめんどくさいです。今回はこれをもっと便利にしていこうという試みです。

まず指がどうしてもついていかない「M-*」を改良します。この機能を実現している関数を「M-x help c」で探すと「M-*」 は 「pop-tag-mark」という関数であることが判明しました。前のタグに戻る機能なのでb=backを割り当てるために.emacsには次のように追記します。

(global-set-key "\M-b" 'pop-tag-mark)

次のタグ候補にジャンプする「C-u M-.」ですが、これはキーバインドに手間がかかりすぎです。「C-u」 は global-universe な引数なので「M-x help c C-u」とした時点でヘルプはあてになりません。

ここで、前のタグに戻るのが 「pop-tag-mark」 なら次のタグにジャンプするには「push-tag-mark」 というものがあるのでは思い、「M-x help f push-」の後にタブで補完しようとしても、それらしいものが見当たりません。どうやら見当違いだったみたいです。

「M-x help c」で 「M-. 」は 「find-tag」となっています。「M-x help f」 で「find-tag」 を検索し、etags のリンクをたどって、「M-.」 の本家 「find-tag」 の定義を見てみてみることにしました。

061002_02a

関数の説明を見てみると

--------------------------------------------------------------------------------
If second arg NEXT-P is t (interactively, with prefix arg), search for
another tag that matches the last tagname or regexp used.  When there are
--------------------------------------------------------------------------------

という記述が見つかりました。どうやら第2引数の NEXT-P の値が t(true)ならば次のタグ候補にジャンプするようです。

ここで 「find-tag」 の第一引数に指定しているのは現在検索しているタグ候補です。これが格納されている変数を知りたかったので、「M-x describe-variable」 とした後にタブ補完して自動的にウィンドウを分割した後に

061002_01a

「C-x o」で移動し、「tag」という文字列で検索すると last-tag がみつかりました。こいつでビンゴ!です。

061002_03a

lispでは t は nil 以外ならなんでもいいので(厳密にいうと違うかもしれませんが)、ここでは 「1」 をあたえてn(next)というキーバインドにして、設定ファイルに書くことにします。

(global-set-key "\M-n" '(lambda () (find-tag last-tag 1)))

これで 「C-x C-e」でS式を評価した後に「M-n」を呼び出したものの動作しません。5 分間考えたあとに、(interactive)を忘れているのに気づきました。

(global-set-key "\M-n" '(lambda () (interactive) (find-tag last-tag 1)))

これで準備完了です。以前よりずっと快適にタグジャンプができるようになりました。:-)