11/22 (木)
Emacs で複数ファイルの文字列置換を行う
Emacs のバッファ内の文字列の置換は M-x replace-string だが、 指定した複数のファイル内の文字列の書き換えがやりたいのメモ。
ソースコードの場合にはタグ機能を使いはじめに etags でタグファイルを作っておき、 M-x tags-query-replace をかけると 逐次的に置換が可能になる。
> find . -name "*.cpp" -or -name "*.[ch]" | etags -
ただ置換対象ファイルがソースファイルでない場合や、 置換だけを行いなくて etags のタグ処理に時間が取られるのが面倒な場合には、 以下のような Perl スクリプトでダミータグファイルを作成すればよい。
#! /usr/bin/perl while (<>) { chop; print "\f\n"; print $_ . ",1\n"; }
11/19 (月)
[Linux] Linux の NIS 設定のメモ
NIS サーバでアカウント & グループを管理しているが、 特定の (Linux 2.6 系) クライアントマシンだけグループ設定を上書きする場合のメモ。
パスワード場合
まずパスワードを上書きしたい場合は簡単。 nsswitch.conf の設定を files → nis としておけば クライアント側の設定が優先されるので、 ドメイン一般ではログインシェルが tcsh だが 特定クライアントでは bash にできる。
nminoru:x:500:100:NAKAMURA Minoru:/home/nminoru:/bin/tcsh
passwd: files nis
nminoru:x:500:500:NAKAMURA Minoru:/home/nminoru:/bin/bash
グループ設定 (失敗例)
しかしグループ設定の場合はうまくいかない。
サーバ側で vtune グループに nminoru、foo、moo の3人が参加しているが、
特定のクライアントでは vtune グループを nminoru、poo の二人にしたい場合、
以下のように書くと
vtune:x:1000:nminoru,foo,moo
group: files nis
vtune:x:1000:nminoru,poo
vtune グループはローカルな設定で上書きされずに、 OR 論理で条件が合成された nminoru、foo、moo、poo の4人が所属していることになる。 南無三。
グループ設定 (成功例)
結構悩んだのだが、
次のようにやるとうまくいく。
まず nsswitch.conf で compat を指定する。
group: compat
まず compat 指定をすると /etc/group の中に "+:::" が必要になる。
この後で "-vtune:::" を指定すると vtune グループの設定がいったん消去されるので、
もう一度 vtune グループ設定を記述する。
+::: -vtune::: vtune:x:1000:nminoru,poo
これで特定クライアントマシンでは vtune は nminoru と poo だけになるのだが、 これで本当にいいのかしら?
11/12 (月)
[CPU] IA-64 に Resource Utilization Counter (RUC) が追加
Intel の鬼ッ子 IA-64 CPU だが、 忘れられたようにひっそりと Montecito の後継チップ Montvale が発表されている。 フロントバスの周波数が 400MHz → 667MHz、 最大周波数が 1.6GHz → 1.66GHz、 キャッシュ容量の増加など地味な変更が多いが、 一部だけ IA-64 命令の拡張がなされたようだ (PDF)。
その中に Resource Utilization Counter (RUC; AR45) というアプリケーションレジスタが追加されている。 もともと IA-64 には Interval Timer Clock (ITC; AR44) があり、 システムバスクロックを分周して プロセッサのクロックに対して 1/1 〜 1/4 ぐらいのサイクルでカウントアップしていた。 一方、RUC は i386 の TSC のようにプロセッササイクルと同じタイミングでカウントアップする。
もう一つ ITC と RUC の違いがある。 ITC が物理的なシステムクロックに同期してカウントアップする Real Time に即したカウンタだったのに対して、 RUC は (hyper-threading を使っている場合) 論理 CPU の消費クロックにリニアにカウントアップする Virtual Time に即したカウンタになっている。 仮想化ソフトは RUC を virtual processor が active な間だけアップするカウンタとして使うことを推奨しているようだ (RUC は OS が書き換えないようにする)。
仮想化環境が整うようになって real clock/timer と virtual clock/timer の両方を持つことの利点に気づいたわけだけど、 メインフレームは昔から揃っていたわけで、 これも歴史が繰り返す例なのね。
11/10 (土)
[Food] KOHINOOR (コイヌール)@元住吉
会社に出勤時(休日は昼から)に 水産ビルの地下にインド料理の店ができていたのに気付く。
Jaipur (ジャイプール) (2006年11月26日の日記) が 出来たのは去年の後半だったが、 こんな小さな町にインド料理店が二軒もできるとはナンだかあれだ 二匹目の泥鰌狙いなんだろうか? と思いながら入ってみる。
ランチは2種類のカレー、ナン、サフランライス、飲み物がついて950円。 ナンはおかわりが可能。
お味のほうは… いまいち。 Jaipur に行った方が…。
[Prog] Bin endian の罠
最近、HP-UX 11i for IA-64 と IA-64/Linux をいったり来たりしながらプログラムをしている (マシンが足らないのでリブートして切り替えているのね)。
二つの OS は同じ IA-64 でもバイトオーダーに違いがあり、 前者が big endian で後者が little endian になっている。 両者で動くプログラムを書くときにはバイトオーダーに注意が必要なのだが、 メモリ上のデータのバイトオーダーにばかり気にして、 bin endian と little endian で 関数引数のレジスタフォーマットが違うということに気付かなくて ドツボにはまってしまった。
関数の引数が(マシンレジスタサイズ以下の)整数型だった場合には レジスタで引数渡しがされるが、 関数引数が構造体の場合もそのサイズがマシンレジスタサイズ以下に納まれば レジスタ渡しがなされる。 64 ビット CPU の場合、8 バイトまでの構造体は引数で渡されることになる。 問題は 8 バイト未満の構造体が渡される場合だ。
test1.c は 32 ビット(4バイト)の構造体 TYPE を引数渡しして、 test2.c で無理やり uint64_t 型にキャストしてその内容を読んでいる。
#include <stdint.h> typedef struct { uint16_t hi; uint16_t low; } TYPE; extern void print_u32(TYPE data); int main(int argc, char** argv) { TYPE d; d.hi = 0x0123; d.low = 0x4567; print_u32(d); return 0; }
#include <stdio.h> #include <stdint.h> void print_u32(uint64_t data) { printf("%016lx\n", data); }
この結果は little-endian では 0000000045670123 になる。 0123 と 4567 が引っくり返っているのは little-endian の構造体の格納方式の問題だ。
一方、big-endian では 0000000001234567 にならずに 0x01234500000000 になる。 集合型は MSB の方から詰めてゆくというルールがそうさせている。 この違いを忘れて下のようなデータ型のラッパークラスを作ってしまい、 アセンブラ関数が全滅してしまったよ…
typedef uint32_t ProjectUint32;
class ProjectUint32 { private: uint32_t data; public: // ... };
11/8 (木)
[Food] 花咲酒蔵 ウメ子の家@渋谷 (ぐるなび)
会社の同期(山村氏、松原氏、後藤氏、大内氏)で少し早い忘年会(?)を開催。
前回の集まった時からまた一人退社して 同期が6人いたうちでFに残っているのが半分に、 研究所勤めなのは一人だけになりますた。 時が経つのは早いものよ。
11/3 (土)
Real UNIX Magazine Day (公式)
なんか日記に各タイミングを逃してしまったが(これを書いているのは19日)、 撮った写真を貼り付けておく。
会場に持ち込まれたビンテージ品。
会場で UNIX MAGAZINE Classic with DVDを購入。
11/2 (金)
Virus Buster の年間使用料が値上がり
自宅パソコンのウィルスソフトには TrendMicro の Virus Buster を使っていたのだが、 年会費という形でこれまで 3,150円/年を払っていたのが、 2007年1月16日より4,725円/年に変更になっていたのに今頃になって気づく。 次回の支払いから約5千円の出費だ。
値段が上がった替わりに3台のPCにまでインストールが可能になっているので、 2台以上 Windows パソコンを持っていればお徳なのだが、 生憎 Windows が動いているデスクトップパソコンは1台で、 ノートパソコンには別のウィルスソフトがインストールされている。
Windows 2000 に対応するのは Virus Buster 2007 までで、 VB 2007 のサポートは VB 2009 が出る頃には終わると思われる。
さて、どうしよう。 乗り換えるか?