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

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がはかれるとすぐに容量いっぱいになってしまいますが。。。)

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枚目で音がでました。

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

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からたどることができます。

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)))

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

マクロ機能(キーボードマクロ)

秀丸エディタの話を読んでふと気がついた事がありました。vimにもマクロ機能があるのかどうかいろいろ調べてみると、さすがは高機能エディタ。やはり存在していました。

  • マクロ記録の開始
  • q[任意の小文字アルファベット]

    下部に「記録中」と表示されます。ここからマクロ化したい操作を行います。新しく記録する場合にはこちらを使います。

    q[任意の大文字アルファベット]

    下部に「記録中」と表示されます。既に記録されているアルファベットを選択した場合は追加ということになります。

  • マクロ記録の終了
  • q

    下部に表示されていた「記録中」の表示が消えて、記録を終了させます。

  • マクロ実行
  • @[マクロを記録したアルファベット]

    記録したマクロを実行します。

2,3文字の操作の繰り返しであればドット(.)を使ってもよいのですが、より複雑な操作や数十回以上同じ操作を繰り返すのであれば、こちらの方が便利です。

実用的な例ではありませんが、たとえば

aaa
aaa
aaa
aaa

という文字が1000行にわたって書きたい場合は、以下の操作でマクロを記録します。

q[任意のアルファベット]iaaa[ENTER][ESC]q

そして、以下のコマンドを実行します。

999@[記録したアルファベット]

するとaaaとかかれた行が1000行作ることができます。こういった普段何気ない操作でも、応用すれば作業の効率化を図ることができる一つの手段になります。

今はこんな単純な例しかあげられませんが、今後はより実践的な例を挙げて説明したいと思います。

ML4.0でiTunesサーバ

こんにちはyosuzukiです。前回に続いてiPod関連の話。我が家のSambaサーバも要領オーバー気味なので、ML3.0からML4.0へアップグレードもかねてディスク320GB増設しました。今はディスクが安いですね、IDE320GB(Seagate)がツクモで11000円でした。

容量が増えたので、iTunesサーバも追加してみました。我が家の3台のノートPCに分散されている大きなファイルたち(.m4a,.m4v)をiTunesサーバへ一元管理するのです。これでノートPCのディスクも余裕が出るというものです。

さて、LinuxにてiTunesサーバを立てるには今はdaapのみが必要。最新のmt-daapにはmDNS機能が入っているのでBonjour用のソフトは特に必要ないようです。

必要なファイルと手順は以下の通り。

■ ダウンロード

OSはML4.0でmlupdaterかけて最新状態です

■手順

  • libid3tag
  • # tar zxvf /tmp/libid3tag-0.15.1b.tar.gz -C /usr/local/src
    # cd /usr/local/src/libid3tag-0.15.1b
    # ./configure
    # make
    # make install

    # vi /etc/ld.so.conf
    include ld.so.conf.d/*.conf
    /usr/local/lib ←追加
    # ldconfig
  • mt-daapd
  • # cd /usr/loca/src
    # tar zxvf /tmp/mt-daapd-0.2.4.tar.gz -C /usr/local/src
    # cd /usr/local/src/mt-daapd-0.2.4/src
    # patch -p1 < /tmp/mt-daapd-0.2.4-cp932.patch
    patching file src/db-gdbm.c
    patching file src/mp3-scanner.c
    patching file src/parser.c
    # ./configure
    # make
    # make install

    # cp /usr/local/src/mt-daapd-0.2.4/contrib/mt-daapd.conf /etc/
    # vi /etc/mt-daapd.conf

    以下、適宜変更します。

    web_root      /usr/local/share/mt-daapd/admin-root
    mp3_dir       /back/iTunes
    servername    iTunes-Yosuzuki
    runas         yosuzuki
    extensions    .mp3,.m4a,.m4p,.m4v

    # cp /usr/local/src/mt-daapd-0.2.4/contrib/mt-daapd /etc/init.d/

    以下のように変更してます。

    # diff -u /etc/init.d/mt-daapd /usr/local/src/mt-daapd-0.2.4/contrib/mt-daapd
    ----------------------------------------------------------------------
    --- /etc/init.d/mt-daapd        2006-09-25 00:28:29.000000000 +0900
    +++ ./mt-daapd  2004-04-07 06:27:59.000000000 +0900
    @@ -3,18 +3,18 @@
    # chkconfig: 2345 85 15
    # description: mt-daapd is a multi-threaded DAAP server for iTunes
    # processname: mt-daapd
    -# pidfile: /var/run/mt-daapd.pid
    +# pidfile: /var/run/mt-daapd
    #

    # source function library
    . /etc/init.d/functions
    -[ -e /etc/mt-daapd.conf ]
    +[ -e /etc/daapd.conf ]

    RETVAL=0

    start() {
            echo -n $"Starting DAAP server: "
    -       daemon /usr/local/sbin/mt-daapd
    +       daemon mt-daapd
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mt-daapd
    @@ -23,8 +23,8 @@
    stop() {
            echo -n $"Shutting down DAAP server: "
            # This is broken.
    -       #killall -INT mt-daapd
    -       killproc mt-daapd
    +       killall -INT mt-daapd
    +#      killproc mt-daapd
            RETVAL=$?

            echo
    ----------------------------------------------------------------------
    # service mt-daapd start
    # chkconfig mt-daapd on

Itunesserver01
これで我が家にiTunesサーバ on ML4.0が出来ました。Pen31G/mem512MBの6年物の自作マシンでsmbと共に快適に動作しております。

Lotus Notes Domino 7 on MIRACLE LINUX

非技術系blog担当のtonokiですが、今回は少し技術的なことを書いてみます。
本当はblogじゃ無くてFAQとして公開するべきですが、blogのネタが無いんで。。。ほほほ

最近IBMさんには、AsianuxへのIBMソフトウェアの対応をアナウンスしていただいておりま

す関係で、ユーザー事例第一号?となるべくDomino on MIRACLE LINUXです。

NotesクライアントもLinux対応版がリリースされていますので、AAAプロジェクト絡みでも

Dominoは良さそうです。

材料は以下をご用意ください。
・サーバー(32bit版 MIRACLE LINUX V4.0 がインストールできるもの)
・MIRACLE LINUX V4.0 - Asianux Inside(32bit版)
・Lotus Domino 7.01 for Linux(c88r9na.tar)
・ランゲージパック(C90TKJA.tar)
・ホットフィックス(C90D4NA.tar)

英語版をインストールしてから、ランゲージパックを追加してもいいのですが、日本国内で

しか利用しませんので、ランゲージパックのインストーラーを利用してone time setupします。

では、インストール作業に入っていきます。

1.サーバーにML40をインストールします。

  パッケージ選択は「すべて」が吉でしょう。

2.ML40のインストールが終わりましたら、X-Windowを利用したGUIモードでログインして、

lotusユーザとlotusグループを作成します。

  # groupadd lotus
  # useradd -g lotus -G wheel lotus

3.Lotus Domino 7.01 for Linux(c88r9na.tar)とランゲージパック(C90TKJA.tar)を

展開します。

  # tar xf c88r9na.tar
  # tar xf C90TKJA.tar

4.インストール先のディレクトリを作成しパーミッションを変更しておきます。

  # mkdir /opt/ibm
  # chmod 777 /opt/ibm

5.rootユーザで、ランゲージパックのGUIインストーラ-を起動します。

  # cd C90TKJA
  # ./LNKDomLP701_GUI

 InstallShieldが起動します。

6.英語版DominoServerのインストール

 ウィザードで使用する言語で「日本語」を選択しインストールを進めていくと

「英語版DominoServer」をインストールするか聞かれるので「はい」選択します。

7.インストール先ディレクトリの選択
 データディレクトリはデフォルトで空欄なので「修正」ボタンを押して、l今回はotusユーザ

ホームディレクトリ内のnotesdataというディレクトリを指定します。(場所は任意です。)


8.ランゲージパックのインストールタイプ選択
 追加と置き換えではファイル構成などが違います。ここでは「置き換え」を選択します。


9.インストールするランゲージパックで「日本語」にチェックを入れます。


10.英語版のインストーラーの場所を聞かれますので、最初に展開したディレクトリ

/root/linux/dominoを指定します。


11.以下の画面が表示されればインストールは終了です。



12.Dominoサーバの設定前にホットフィックスを適用します。
   ホットフィックスのアーカイブ展開先がlinuxなので、先ほどの英語版Dominoの

ディレクトリ名を変更してから、ホットフィックスを展開します。
   # cd
   # mv linux linux_701e
   # tar xf C90D4NA.tar
   # cd linux/domino
   ホットフィックスのインストールスクリプトはdominoのバイナリが/opt/lotusに有ることを

前提に動作するので、環境変数に現在のディレクトリを与えてinstallスクリプトを起動します。
   # NUI_NOTESDIR=/opt/ibm/lotus ./install
   [tab]キーを押しながらインストールを進めてください。

13.次にDominoサーバの設定に移ります。
   rootユーザでログインしている場合は、lotusユーザがX-Windowを表示できるように

以下のコマンドを実行します。
   # xhost +localhost
   lotusユーザになりDominoサーバをリモートセットアップ状態で起動します。
   # su - lotus
   $ cd /home/lotus/notesdata
   $ /opt/ibm/lotus/bin/server -listen &

   次にGUIのリモートセットアッププログラムを起動します。
   $ /opt/ibm/lotus/bin/server -remote

14.接続先のサーバを聞かれますので、localhostを指定します。


 あとは皆さんご存知の通りの設定画面ですので、画面の案内にしたがって設定を

進めてください。

15.設定が完了するとlistenモードのサーバを停止するか聞かれますので、

[はい]を押して停止します。


16.Dominoサーバの起動はlotusユーザで行います。

   # su - lotus

   notesdataディレクトリに移動してserverを起動します。

   # cd /home/lotus/notesdata

   # /opt/ibm/lotus/bin/server

17.サーバが起動できたら、WebAdminに接続してみましょう。
   WebAdminを利用するブラウザにはjreプラグインがあると幸せなので、

以下のコマンドを実行してプラグインをインストールします。
   # cd /usr/lib/firefox-1.0.8/plugins/
   # ln -s /usr/java/jdk1.5.0_04/jre/plugin/i386/ns7/libjavaplugin_oji.so
    http://localhost/webadmin.nsfに接続して設定時に設定した管理者アカウントで

ログインしてください。



次回は、Linux版のNotesクライアントの設定方法などご紹介できればと思います。
(よっしゃ!次のネタは困らないぞ。)

Bashプチ拡張(とまではいきませんでしたが)

前回Altキー使ってますか?でBashのキーバインドを紹介しましたが、他に自分が欲しいと思った機能がBashに実装されていないようなので今回はちょっとそのコードを覗いて見てみようと思います。(注: 私は業務でコードを書くことは無い素人なので、その辺をまず理解して読んでください)

その前にまず前回の紹介が締切間際だったということもあり、良い例が思いつかずうまく説明できていなかったのでおさらいを兼ねて改めて紹介することにします。

Bashでは[Alt-.]を一回押すと直前のコマンドの最後の引数が入力できます。もう一度押すと更にその前のコマンドの最後の引数に変わります。この機能を使う場面はいくつもありますが、例としてMIRACLE LINUX V4.0のDeveloper CDからctagsパッケージをインストールする作業を考えてみましょう。

  1. まずマウントします。
  2. # mount /mnt/cdrom
  3. そしてマウントした中身を確認するでしょう。このとき『ls [Alt-.]』とすれば以下を入力したことになります。
  4. # ls /mnt/cdrom
  5. インストールはTab補完も使い『rpm -ivh [Alt-.]/A[Tab]/R[Tab]ctag[Tab]』とすれば以下を入力したことになります。
  6. # rpm -ivh /mnt/cdrom/Asianux/RPMS/ctags-5.5.4-1.i386.rpm

    この例では直前のコマンドのみでしたが、このような場面に役立ちます。

復習が終わったところで私が欲しいと思う機能を書きます。それは[Alt-.]と反対の最初の文字列つまりコマンドにあたる部分を入力できるキーバインドです。もちろん押す度に履歴を遡る機能も付けて。なので[Alt-.]とは貼り付ける文字列が先頭なのか最後なのかの違いになります。

その機能を念頭に入れコードを見てみます。bashのソースを展開し以下の様に検索してみると

# grep -ir "meta-\." *
lib/readline/emacs_keymap.c:  { ISFUNC, rl_yank_last_arg},    /* Meta-. */

lib/readline/emacs_keymap.cというファイルでキーバインドの定義をしているようです。Emacsのキーバインドに合わせているのでこのファイル名は納得ですね。このファイルの中身はキーバインドのリストになっており、rl_yank_last_argが[Alt-.]の機能を提供する関数のようです(名前からしてそんな感じですね)。

また前後では

(rl_command_func_t *)0x0

となっているのがいくつか見受けられますがこれは未割り当てのようです。そこで[Alt-.]が最後の引数であれば、最初の文字列はキー配列から[Alt-,]に割り当てればルック&フィール的にも良いと思います。実際、[Alt-,]は未割り当てのようですし。

{ ISFUNC, (rl_command_func_t *)0x0 },   /* Meta-, */

次にこの rl_yank_last_arg関数の定義にジャンプしてみると

rl_yank_last_arg (count, key)

と仮引数を2つ持つ関数であり、戻り値が

rl_yank_nth_arg_internal ('$', key, history_skip);

と仮引数に何やら'$'だのhistory_skipだのそれらしき処理をしていることが伺えます。

ここで一旦 emacs_keymap.cに戻り「yank」で検索して見ましょう。すると以下のリストが得られます。

{ ISFUNC, rl_yank },              /* Control-y */
{ ISFUNC, rl_yank_nth_arg },      /* Meta-Control-y */
{ ISFUNC, rl_yank_last_arg},      /* Meta-. */
{ ISFUNC, rl_yank_last_arg },     /* Meta-_ */
{ ISFUNC, rl_yank_pop },          /* Meta-y */

[Ctrl-y]はご存じの通り単純にyankです。[Alt-y]は無反応なので動作からは良く分かりません。[Alt-_]は[Alt-.]と同じrl_yank_last_arg関数が設定されているので[Alt-.]と同等のようです。実際確かめて見ると[Alt-.]と同じ動きをしています。ただ『_』は[Shift]キーも必要となるので私は[Alt-.]でいきます。

最後に[Alt-Ctrl-y]ですが、動作から直前のコマンドの第一引数(通常オプションの位置)を貼り付けるようです。ただ動作は[Alt-.]のように押す度に履歴を遡るのではなく、押す度に直前の第一引数が追加されていきます。

この rl_yank_nth_arg関数を追ってみると

rl_yank_nth_arg (count, ignore)

戻り値が

rl_yank_nth_arg_internal (count, ignore, 0);

と rl_yank_last_argと同じ rl_yank_nth_arg_internalという関数の処理が返されるようです。第3引数が0となっており、一方[Alt-.]の方はhistory_skipとなっていますが、これがキーを押す度に貼り付けるのか履歴を遡るのかの違いでしょうか。

そこでrl_yank_nth_arg_internal関数に適切な引数を設定してやれば、あとはrl_yank_nth_arg_internalがうまく処理してくれるのではと期待しましたが、その先を追ってみるとどうやら'$'など予め決まった引数の処理のみしか定義されていないようでした。

なのでもっとしっかり読んでいく必要があるようです、と言ったところで時間が来てしまいました。機会があればこの機能を実現したいところです。また以下の機能も盛り込み楽をしようと目論んでいたりします。

  • [Alt-.]や今回の[Alt-,]に対するトグルバック
  • 例えば[Alt-.]で3つ前の最後の引数を得たく連打していたら4回押してしまったら戻れません。一旦削除してやり直しです。これに対して[Ctrl-p]でコマンドの履歴を遡ったとき行き過ぎても[Ctrl-n]で戻れます。これと同じ機能を追加できれば便利です。

  • 現在入力中のコマンドラインで直前に入力したフレーズの張り付け
  • バックアップをとるときブレース展開を使い

    # cp /etc/samba/smb.conf{,.org}

    としたり、オリジナルに戻すとき

    # mv /etc/X11/xorg.conf{.org,}

    などとしますが、疲れているときなどはどちらが先に展開されるかなんて考えたくなくなります。そんなときこの機能が視覚的で分かり易く役に立つでしょう。

Webページの文字化けデバッグ

こんにちは、moriyama です。

みなさんは、Web アプリケーションなどで Web ページが文字化けする時に、どのようにしてデバッ>グしているでしょうか?

HTTP の Content-Type ヘッダーや HTML の meta タグの指定が実際と食い違って文字化けしているという事がありますので、今回は、それらの確認方法を紹介したいと思います。

まず、HTTP、XML、HTML での文字コードの指定のおさらいをしておきましょう。

W3C Architecture domain の「文字符号化」のページからの引用です。

符号化の宣言

どのような XML あるいは (X)HTML 文書でも、文字符号化が明確にラベル付けされていることは極めて重要です。これは以下のような方法で行なうことができます:

  • HTTP の Content-Type ヘッダで 'charset' パラメータを使ってください。例:
    Content-Type: text/html; charset=EUC-JP
  • XML の場合、文書の最初にXML 宣言内の encoding 疑似属性を使うか、実体の最初にテキスト宣言を使ってください。例:
    <?xml version="1.0" encoding="iso-8859-1" ?>
  • HTML の場合、<head> 内で <meta> タグを使います。 例:
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" >

    XHTML の場合、最後にスラッシュが必要です:

    <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />

私は、以前、telnet で 80 番ポートを指定して Web サーバーに接続し、直接 HTTP コマンドを叩いて HTTP のヘッダーを確認するなどしていました。

さすがにこの方法は、面倒なので wget コマンドを使って次のようにして HTTP ヘッダーとコンテンツ内の文字コードが食い違っていないか確認するようにしています。

HTTP の Content-Type ヘッダーの確認
$ wget -S -O/dev/null http://www.miraclelinux.com/ 2>&1 | grep -i content-type
Content-Type: text/html
XML / XHTML の encoding 指定の確認
$ wget -O- http://blog.miraclelinux.com/ctd/index.rdf 2> /dev/null | grep 'xml.*encoding'
<?xml version="1.0" encoding="utf-8"?>
HTML / XHTML の meta タグでの指定の確認
$ wget -O- http://www.miraclelinux.com/ 2> /dev/null | grep -i '<meta.*content-type'
<meta http-equiv="content-type" content="text/html;charset=Shift_JIS">

ここで注意しなければならないのは、charset や encoding に指定できる名前は IANA に登録されているキャラクタセット名だけであるという点です。Shift-JIS や CP932、EUC_JP などといった登録されていない名前を指定した場合は、Web ブラウザが解釈できずに文字化けの原因となりますのでご注意下さい。

そして、コンテンツ自身の文字コードも上記の指定と一致している事を確認しておきましょう。

新しめの nkf であれば --guess オプションで文字コードの推定が出来ますので、次のようにして確認する事ができます。

$ wget -O- http://www.miraclelinux.com/ 2> /dev/null | nkf --guess
Shift_JIS

これらの情報を元に、間違った指定がなされている場合は、それぞれの情報を出力している場所を特定し適切に修正していきます。

シェルで名前なしパイプの作り方

さとうふみやす です。またブログ当番の日が来てしまいました。 筆の遅い私にこうも頻繁に記事を書かせるのは酷というものです。 …などと文句を言いつつ本題に入ります。今回も技術ネタです。

あるプロジェクトで Xdialog を利用したシェルスクリプトを作成することになりました。 ここで問題が一つ。 ふつうのシェルは任意の名前なしパイプを作成できません。 もちろん | 構文がありますが、あまり汎用性が高くありません。 このため、Xdialog のような標準入出力で IPC を行なうプログラムをシェルで扱うのは多少の困難を伴います。

続きを読む "シェルで名前なしパイプの作り方" »

Emacs global-set-keyとverilog-mode

こんにちは、tshojiです。前回はサーバールームの管理のことをお話しましたが、今回は進捗があまりない(段ボールの整理くらい^^;;)のでEmacsのキー設定とverilog-modeについてお話することにします。

まずはEmacsのmode問わず、キーにマクロを当てるglobal-set-keyを紹介します。Emacsの設定は通常ホームの.emacsファイルに記述します。

私はよくファンクションキーに割り当てたりしています。例えば、F1にshellやF2,F3,F4にキーマクロ記憶、停止、再生などです。実際に書くと下記のようになります。

(global-set-key [f1] 'shell)
(global-set-key [f2] 'start-kbd-macro)
(global-set-key [f3] 'end-kbd-macro)
(global-set-key [f4] 'call-last-kbd-macro)

M-x describe-binding やM-x describe-function、M-x describe-key を使うと設定しやすいかと思います。

次にVerilog-HDLをEmacsで調べやすく、書きやすくするverilog-modeの紹介です。verilog-modeはc-modeと同じように予約語を色分け表示してくれたりします。但し、verilog-modeはc-modeのように標準で入っていないので、ダウンロードする必要があります。verilog-modeはverilog.comのサイトからダウンロードすることができます。

キーワードのmoduleやinput、outputが色分けで表示されるので大変便利です。他にもVHDLスキーな方はVHDL-modeや、もっと抽象度の高いSystemC使いの方はSystemC-modeもあるのでググってみてはいかがでしょうか。

Emacsの話題はもっと詳しいサイトがたくさんあるので、調べながら自分用に色々とカスタマイズするといいと思います。

秀丸になりたーい

実は私はつい半年前まで、まったく Linux を利用したことがありませんでした。学校でも研究室が窓系 OS だったため、UNIX にすら触る機会がなく、純粋培養の窓ユーザーとしてコンピュータ歴 10 年です。

そんな私なので、初めて vi を起動したとき、画面の前でフリーズしてしまいました(直観的に何もできない !)。今では大分慣れましたが、やはり今でもエディタは「秀丸」がベストと思っています。

というわけで、手間をかけずに vi をどれだけ「秀丸」に近づけるか色々試した結果、以下のようにしています。

■ taglist.vim

taglist.vim というアドオンを使っています。

このアドオンを使うと、このように左側に関数や変数一覧が出てきます。

Vim_1

■ grep.vim

grep.vim というグレップのアドオンも入れています。

ちなみに、.vimrcで以下のように設定し、自分なりに秀丸っぽくしています。

nnoremap <silent> <F1>  :help taglist<CR>
nnoremap <F3>           :Rgrep -i
nnoremap <silent> <F5>  :copen<CR>
nnoremap <silent> <F6>  :cclose<CR>
nnoremap <silent> <F9>  :TlistHighlightTag<CR>
nnoremap <silent> <F10> :set number<CR>:TlistOpen<CR>
nnoremap <silent> <F11> :TlistClose<CR>:set nonumber<CR>

まだまだ他にも便利ツールを日々探し中です。何かないかなー ???

Altキー使ってますか?

こんにちは、okapです。2度目の登場になります。みなさんがAltキーを使用する場面はどういった時でしょうか。X上のアクティブウィンドウの切替えの[Alt-Tab]とかでしょうか。そこで今回は意外と知られていない(?)Altキーの便利な機能をご紹介したいと思います。

1. ウィンドウの移動

これは昔からのFAQですが、ウィンドウをマウスで移動する場合タイトルバーを摘んで行いますがX上ではAltキーを押しながらならそのウィンドウのどこを摘んでも移動が可能です。

2. Firefoxのタブブラウジング

次にご紹介するのはFirefoxにおけるタブブラウジングに関する機能です。例えばGoogleバーから検索するときその結果を新規タブで表示させたい場合、一旦空の新規タブを開いてから検索していませんか? そういう方はGoogleバーから検索する際Altキーを付けて[Alt-Enter]として見てください。検索結果が新規タブに表示されるようになったと思います。

この機能はGoogleバーに限らずロケーションバーでも可能です。ちなみにGoogleバーへのジャンプは[Ctrl-J]、ロケーションバーへは[Ctrl-L]で行えます。また、マウスでリンク先を新規タブで開きたいときは[Ctrl-クリック]もしくは[中クリック]で可能です。さらに余談になりますがロケーションバーなんて使わないよという方はFirefoxのクイックサーチ機能を調べて見てください。すごく便利です。

3. Bash上での操作 [Alt-.]

さてここからが本題です。ここではBash上でのAltキーに関する便利な機能をご紹介します。例えば興味を持ったディレクトリに移動しようとして勢いよくTab補完した結果

$ cd /proc/sys/kernel/sysrq
bash: cd: /proc/sys/kernel/sysrq: ディレクトリではありません

と怒られ慌てて

$ less /proc/sys/kernel/sysrq

としたという経験はないでしょうか。このとき対象ファイルを再度入力しているでしょうか?この場合lessに続けて[Alt-.]を一度だけ押すと直前のコマンドの最後の引数が補完されます。直前のコマンドの最後の引数なら「!$」や「$_」を使用している方もいるかと思いますが、では/proc/sys/kernel/sysrqの一つ上のディレクトリに移動する場合はどうでしょう?「!$」や「$_」では対応できませんね。ですが[Alt-.]であれば最後の引数である対象パスがビジュアル的に表示されますのでそれに続けて[Alt-Backsapce]を押して最後のフレーズ「sysrq」を削除すれば完了です。

$ cd /proc/sys/kernel/

このよに最後の引数が表示されるのでこれに対して編集ができるのが[Alt-.]の利点です。

次に、直前ではなく3つ前のコマンドの最後の引数を使用したい場合どうでしょう?

$ ls !-3:$
ls /proc/sys/kernel/sysrq

とすれば可能でしょうが、4〜5つ前といったaboutなときは向きませんね。しかも記号ばかりで打ち難いです。そこで先程ご紹介した[Alt-.]を数回続けて押してみてください。[Alt-.]を一回押すごとに一つ前の最後の引数が現れ、更にもう一度押すともう一つ前の最後の引数が現れてくれます。


$ less /proc/sys/kernel/sysrq
             ↓
$ less /proc/sys/kernel/
             ↓
$ less /proc/sys/kernel/sysrq

といった具合に。このように[Alt-.]は最後の引数を遡って表示できるので大変便利です。是非使ってみてください。一ヶ月後にはこの機能が手放せなくなっていることでしょう。ただAltキーを多用することになるとJISキーボードの方はAltキーのポジションに悩まされるのではないでしょうか。実に微妙な位置に存在しているのでどの指で押してよいか迷います。私の場合はUSキーボードを使用しているので両Altキーがスペースキーの両サイドに配置されており、親指Shiftならぬ親指Altといった感じで押し易いです。まあLinuxでは使用しない「無変換」や「前変換」をAltキーとして割り当ててしまえば問題ないと思いますが。

最後になりますが、その他のキーコンビネーションはbashのオンラインマニュアルをご覧下さい。ご自分の求めている機能も見つかるかも知れません。なお今回の[Alt-.]は「M-\.」で検索可能です。

¡Hasta luego!

GRUB と USB 接続 FDD とブート FD

さとうふみやす です。 雑談にしようかと思ったのですが、起承転結が思いつかなかったので技術ネタ。 USB フロッピーディスクドライブを利用したときの GRUB ブートフロッピーディスクの作成方法を書きます。 MBR に stage1 を、その後ろに stage2 を入れる方法ではなく、 MBR に stage1 を、ファイルシステムの中に stage2 を入れる手順です。 ブートローダーが壊れたシステムに対してはもちろん便利ですが、 フロッピーディスクのファイルシステム内に memtest86memtest86+, BusyBox の静的リンクバイナリを入れておけば、 様々な場面で役に立ちますよ。 以上でピンと来ない方は、ここでさようなら…。

以下は MIRACLE LINUX V4.0 での手順ですが、ほかの Linux でも同様です。

まずは USB 接続のフロッピーディスクドライブをマシンに接続します。 するとカーネルが認識し、dmesg(8) で確認すると次のようなメッセージが見られます:

usb 3-2: new full speed USB device using address 2
Initializing USB Mass Storage driver...
scsi3 : SCSI emulation for USB Mass Storage devices
  Vendor: MATSHITA  Model: FDD CF-VFDU03     Rev: 1026
  Type:   Direct-Access                      ANSI SCSI revision: 02
Attached scsi removable disk sdb at scsi3, channel 0, id 0, lun 0
Attached scsi generic sg2 at scsi3, channel 0, id 0, lun 0,  type 0
USB Mass Storage device found at 2
usbcore: registered new driver usb-storage
USB Mass Storage support registered.
SCSI device sdb: 2880 512-byte hdwr sectors (1 MB)
sdb: Write Protect is off
sdb: Mode Sense: 00 46 94 00
sdb: assuming drive cache: write through
SCSI device sdb: 2880 512-byte hdwr sectors (1 MB)
sdb: Write Protect is off
sdb: Mode Sense: 00 46 94 00
sdb: assuming drive cache: write through
 sdb: unknown partition table

この場合、フロッピードライブは /dev/sdb として認識されました。 それではドライブにフロッピーディスクを入れ、フォーマットします。 Linux だけでなく Windows システムでの利用も考慮すると、 ファイルシステムは VFAT がよいでしょう。 パーティションは必要ないので、デバイスまるごとフォーマットします。 デバイス名を間違えると悲惨なこと (ハードディスク内のファイルシステムが上書き) になるので、くれぐれも慎重に!

# mkfs -t vfat -v -I /dev/sdb
mkfs.vfat 2.8 (28 Feb 2001)
/dev/sdb has 1 head and 3 sectors per track,
logical sector size is 512,
using 0xf8 media descriptor, with 2880 sectors;
file system has 2 12-bit FATs and 4 sectors per cluster.
FAT size is 3 sectors, and provides 710 clusters.
Root directory contains 512 slots.
Volume ID is 44db30c4, no volume label.

次にフロッピーディスク内のファイルシステムをマウントし、 その中に GRUB の stage1, stage2 ブートローダーに入れ、 アンマウントします。

# mount /dev/sda /media/floppy
# mkdir -p /media/floppy/boot/grub
# cp -p /usr/share/grub/i386-asianux/stage? /media/floppy/boot/grub
# umount /media/floppy

stage1 は MBR に入れるのでファイルシステムにも置いておく必要はないと思うのですが、 それがない場合にこの後に実行する GRUB の操作方法を知らないので、今回は深く追求しません。 (ごめんなさい。知っている方、コメントください)

次に grub(8) を起動します。

# grub
Probing devices to guess BIOS drives. This may take a long time.

    GNU GRUB  version 0.95  (640K lower / 3072K upper memory)

 [ Minimal BASH-like line editing is supported.  For the first word, TAB
   lists possible command completions.  Anywhere else TAB lists the possible
   completions of a device/filename.]
grub> 

grub(8) に対し、 /dev/sdb が (BIOS から見たときに?) (fd0) であること、 GRUB の stage2 (あるいは stage1_5) や grub.conf (menu.lst) などがあるファイルシステムが (fd0) であることを教えてから、 フロッピーディスクの MBR に stage1 を書き込みます:

grub> device (fd0) /dev/sdb
device (fd0) /dev/sdb
grub> root (fd0)
root (fd0)
 Filesystem type is fat, using whole disk
grub> setup (fd0)
setup (fd0)
 Checking if "/boot/grub/stage1" exists... yes
 Checking if "/boot/grub/stage2" exists... yes
 Checking if "/boot/grub/fat_stage1_5" exists... no
 Running "install /boot/grub/stage1 (fd0) /boot/grub/stage2 p /boot/grub/grub.conf "... succeeded
Done.

これで完成! マシンを再起動しましょう。 BIOS の POST が完了後、フロッピーディスクがアクセスされているでしょうか? その後、GRUB Loading stage2... と表示され、 GRUB のプロンプト grub> まで表示されれば成功です。

以上は USB フロッピーディスクドライブ向けの解説でしたが、 ふつうのフロッピードライブでもほぼ同じ手順で作成できます。 また、それぞれの手順で作成したフロッピーディスクは相互に流用可能です。

ML30へATOK for Linuxをインストールする

MIRACLE LINUX V4.0 (ML40) では scim と Anthy の組み合わせにより日本語入力の操作性が向上していますが、MIRACLE LINUX V3.0 (ML30) では canna と iiimf しか選択できないので、日本語入力環境に物足りなさを感じているユーザさんも多いと思われます。

ここでは、ML30 x86版で ATOK for Linux を導入する手順を紹介します。

なお、ML30でATOK for Linuxの動作を保障するわけではないので、ご了承ください。

  1. ML30 に標準で含まれている IIIMF 関連パッケージを削除します。

      # rpm -qa | grep iiimf | xargs rpm -e
  2. gtk2 パッケージをセキュリティアップデートで更新している場合、"/usr/bin/gtk-query-immodules-2.0" ファイルが "/usr/bin/gtk-query-immodules-2.0-32" ファイルに変更されているので、元のファイル名に対しシンボリックリンクをはります。

      # ln -s /usr/bin/gtk-query-immodules-2.0-32 /usr/bin/gtk-query-immodules-2.0
  3. ATOK for Linux の CD-ROM をマウントし、bin/setupatok スクリプトを実行します。以下の例では、/dev/cdrom を /mnt/cdrom にマウントすると仮定しています。

      # mount /dev/cdrom /mnt/cdrom
      # /mnt/cdrom/bin/setupatok
  4. インストールスクリプトで、「IIIMF をインストールする」を選択します。

  5. ATOK for Linux のインストールが成功したら、こちらからダウンロードできる "atok_xinput.patch" を以下のコマンドで適用します。

    atok_xinput.patchをダウンロード

      # patch -p0 < atok_xinput.patch
  6. atok サービスを起動します。

      # service atokx2 start
  7. X セッションを一旦閉じ、再度始めます。X の起動後、入力パレットが画面右下に表示されているはずです。

なお、ML30 では GTK+ のバージョン 2.2.4 が搭載されているため (パッケージ名 gtk2)、ATOK を動作させるのに GTK+ のアップデートは必要ありません。

feedpath tags:   generated by feedpath

vim: ed コマンドを使う

こんにちは。 転職して 2 ヶ月になる kyagi です。梅雨も明けていよいよ本格的な夏到来ですね。弊社の技術部は私服で勤務オーケーなので、このごろはgraniphでまとめ買いしたTシャツを着て通勤しています。

vi の使用法が好評を博しているということで、私も一席。ネタは「vi で ed コマンドを使う」です。

さっそくはじめましょう。

shell, perl スクリプトを書いている時に、ある範囲の行をコメントアウトしたくなる時がありませんか?そんなときいちいち、移動と削除を繰り返し入力するのは面倒くさいですよね。この操作を楽チンに実現する方法をお伝えします。

ed の基本的な構文は「ある範囲の行(パターン)」を「なになにする(アクション)」というものです。まず set nu で行番号を表示します。

:set nu

コメントアウトする部分を特定した後、置換を実行します。例えば 20 行目から 30 行目をコメントアウトしたいなら以下を実行します。

:20,30s/^/#/

元の状態に戻す(コメントを付けていない状態)には以下を実行します。

:20,30s/^#//

この「ある範囲の行(パターン)」を「なになにする(アクション)」という考え方は ed だけでなく sed, awk といった言語を理解するキモであり、 perl でのフィルタ作成にも通じるものです 。「ある範囲の行」というのを、ここでは 20-30 行目という具体的な行数をあげていますが、正規表現 を使用してパターンとして指定することも可能です。

前回の「ですくとっぷLinux」で弊社岡野が /etc/ssh/sshd_config に対して行った編集をed を使ってスクリプト化することも可能です。

このような ed スクリプトがもっとも真価を発揮するのは大量のファイルに変更を加えたい場合です。

たとえば CVS の最初のチェックインに際してすべての C ソースの末尾に $Id$ キーワードなどを挿入するような ed スクリプト(add_cvs_keyword.sh) を作成し、find などと組み合わせると何百とあるソースすべての一括編集が可能となります。

find . -name "*.[ch]" -exec add_cvs_keyword.sh {} \;

他にも html ソース内の用語の一括置換(たとえばメールアドレスや社名の変更)など、いろいろな場面で活用できると思います。ただし、webmaster のみなさん、試す前にバックアップとテストは忘れないでくださいね。:-)

RPM APIから見たRPMの動き

つい前まで、RPMのAPIと格闘していた新人mamanoです。入社してもうすぐ4ヶ月目になろうとしています。作業はまだまだ慣れていない状態が続いていますが、会社の雰囲気にはすっかり慣れました。

RPM API、C言語と約1ヶ月ほど格闘していたので、学んだことを少し披露していきたいと思います。RPMはデータベース管理されており、各RPMコマンドをたたくとRPMのデータベースにアクセスすることになります。インストールや、アップデートなどを行うときは同様に、トランザクションを生成し、作業を行います。

APIから見た、簡単な流れとしては

  1. データベースを開く...rpmdbOpen()
  2. トランザクションを生成...rpmtsCreate()
  3. トランザクションを先ほど開いたデータベースに割り当てる...rpmtsOpenDB()
  4. 各処理を実行(今回は省略)
  5. トランザクション開放...rpmtsFree()
  6. データベースを閉じるrpmdbClose()

以上のように、一般的なDBと同じ手順で実行しています。また、実際にパッケージをインストールする場合、依存関係の解決をしなければいけません。処理はトランザクションの中で行われますので、トランザクションを生成した後「rpmtsCheck()」によって依存問題を探します。問題があれば「rpmtsProbs()」によって問題を取り出すことができます。

APIを学習していくと、RPMコマンドを実行して、警告や、エラーを出力した時、どの処理タイミングで吐いたのか分かるようになってきます。詳しい内容はRPM API Document 4.4.2を参照してください。

もうすぐドキュメント作成の作業も始まるので、次回も(できたら)rpmについて解説していきたいと思います。でも本当は雑談を書きたいけど仕事を覚えるのに精一杯で、心の余裕がないんですけどね(汗)。

Linuxの成長と、ミラクルのそれ

こんにちは。SC担当のyosuzukiです。

先週の金曜日にOracleパートナー様向けにLinux市場動向などを紹介するセミナーを行いま