固定長データのalloc/freeを大量に行うことを考える。普通に考えるとmalloc/freeを使うことになるが、別の長さのmalloc/freeが頻繁に乱入してくると、穴がたくさんできてメモリの利用効率が徐々に下がっていく。2GB(あるいは3GBや4GB)の壁を感じるようになると、この効率悪化というのはけっこう大きくなってくる気がする。 Linuxのカーネルには固定長データを効率良くalloc/freeするためにslabというのがある。ちなみに最近はprocpsにslabtopというコマンドが入っていて、観察することができる。おれ的にはiotopが欲しい。できればプロセス毎に出しているI/Oを観察したい。しかしカーネルのバッファを使うI/Oを出す限りはそんな情報は取れないはずなんで、ないんだ。vmstatとiostatで我慢している。fstop(dfのtop)と思ったけど、そんなのだったらwatchコマンドで「watch df」で十分だったりするよなぁ。 …そんな余談は置いといて、このslabはユーザレベルのライブラリとかあると使う人がいるかもしれない。 似たような要求に答える可能性がないわけでもないのがobstackだ。これは効率良く、高速に固定長(とも限らないが)データのalloc/freeをするのだが、スタック形式になっており、最後にallocしたものからfreeする必要がある。飛び越えてfreeしようとすると、後ろにあるやつまでまとめてfreeされてしまったような気がする。これだと普通にスタック使ったほうがよくないか?? 処理の流れと独立してスタックにできるというのと、サイズの制限を受けないのがメリットとしてはあると思う。順番が保証されるので穴はできない*はず*だ。実際、スタックって形式はかなり効率が良いんだよね。 それから、知られているのか知られていないのかよくわからないが、gtk系の基本ライブラリ、glibにはgcacheというのがあって、これがけっこう便利そうだったりする。alloc/freeとはちょっと違うけれど。 で、唐突な結論としてはユーザは富豪的に書け、と。オレこれから大きめにmallocして、freeとかしないようにするから! ダメになったらGCのライブラリ使えばいいだけだから! 2GB(3GBや4GB)が壁になるようなら、すぐに64bitのマシンを使って下さい、と。
Category: GNU/Linux
例えばgrepはヒットしたのが前から表示される。長いファイルだと非常に時間がかかるわけだ。つながった巨大なログを見るときとか、最後が知りたいのに、最後に表示される。そして時間がかかる。1GBくらいのテキストのログを考えてみると、毎度毎度最後のほうが知りたくてgrepをかけるのはまさに無謀というものだ。 このような要求だと、lvで末尾まで見てから検索をかけるのが一番速いだろう。lessは遅いけど、lvなら速い。 しかしながら、いちいちlvを使うわけじゃなくてgrepを使ってしまう人も多いだろう。上げて末尾に行って検索、って操作が面倒だから。 というわけで、末尾から表示する、全部読まずにgrepというのが欲しいなぁ。たぶん、作るのは難しくないだろう。tailとheadとgrepを組み合わせてシェルスクリプトにする…とexecがネックになるか(笑)。いっちょPythonで書こうかなと思った(本当に書くかどうかはわからない)。 この作業って、最速はどういうコードなんだろうと思う。後ろのほうからmmapしてって少しずつregexpでマッチングをかけると速いかもしれない。 …こんなの、大したパズルじゃないよなぁ。
Fedora Core 3(FC3)を使ってて、なにげに普通にボタンを押しても外部ディスプレイには出ずに、/var/log/Xorg.0.logに以下のようなログが残るだけだったのだけど、
(WW) I810(0): Detected possible lid operation, fixing up. (II) I810(0): Display plane A is enabled and connected to Pipe A. (II) I810(0): Display plane B is disabled and connected to Pipe B. (II) I810(0): Enabling plane A. (II) I810(0): Display plane A is now enabled and connected to Pipe A. (II) I810(0): Display plane B is now disabled and connected to Pipe B. (II) I810(0): PIPEACONF is 0x80000000 (II) I810(0): PIPEBCONF is 0x80000000 (II) I810(0): Mode bandwidth is 47 Mpixel/s (II) I810(0): maxBandwidth is 640 Mbyte/s, pipe bandwidths are 252 Mbyte/s, 0 Mbyte/s (II) I810(0): LFP compensation mode: 0x6
i810switch(cwru.edu)を使ったら外部にも出せるようになった。Fedora ExtraのStableにあるので、/etc/yum.repos.d/fedora-stable.repoにでも以下のように書いて、
[fedora-stable] name=Fedora.us Extras (Stable) baseurl=http://fedora.quicknet.nl/fedora/fedora/2/$basearch/RPMS.stable http://mirrors.usc.edu/pub/linux/fedora/fedora/fedora/2/$basearch/RPMS.stable http://fedora.mirror.sdv.fr/fedora/fedora/$releasever/2/RPMS.stable http://download.fedora.us/fedora/fedora/$releasever/2/RPMS.stable enabled=0
yum –enablerepo=fedora-stable install i810switchでインストールできる。そんで、i810switch crt onで外部に出る。私の環境ではなぜかlcdはoffにできなかった。FC3にする前は普通にできてたのに。 この中のi810rotateをACPIでLIDだっけ? ボタンに関連づければいいのか…なんかめんどくさいなぁ。
Excelでいう「データ(D)」-「外部データの取り込み(D)」-「データの取り込み(D)」。以前はAlt-DDTと呼んでいたが今となってはAlt-DDDの操作。 基本的には計算類をだいたい済ませた状態でデータをテキストにしてExcel等に取り込んでグラフにしたり…という使い方をしている。XMLどころかCSVですらない原始的な形式であることが多い(CSVは思った以上に操作がしにくいのだ)。 OpenOffice.orgではどうやるか。「データ(D)」のメニューからは行けず、しばらくさまよった。「挿入(I)」-「表(S)…」で、「ファイルから作成(F)」を選ぶ。Alt-ISFだ。覚えにくい…Excelと違って、新たに表を作らなければならないみたいな感じ? まあでも、悪くないね。
util-linuxにrenameコマンドが入ってたんですね。DOS時代における、
A:\> ren *.DOC *.TXT
みたいなことができます。ちなみに、上記と同じ指定は、以下のようになります。
# rename .DOC .TXT *.DOC
自分はこの手のことをやるときは、いつもforで回してました。
# for i in *.DOC ; do echo mv $i ${i%%.DOC}.TXT ; done # for i in *.DOC ; do mv $i ${i%%.DOC}.TXT ; done
不安なので、一度echoをつけといて目視で確認してからechoを削除するか、シェルスクリプトにもなるので後ろに「| sh」をつけて実行させるか。後ろに「| sh」をつける場合はクオートに気をつける必要があります。
initrdってKernel 2.6から(?)フォーマットが変わったんですね。いつの間に? ext2からcpioになってるよ。でもext2でも受け入れてくれるみたいだ(たぶん)。 pxeブート+nfsrootで上げるときの問題だけど、/をマウントするときにネットワークが有効じゃなきゃいけないから、カーネルが上がったときにDHCPで設定を取ってくることになる。IPAPPENDと書けば、pxeのときにもらったIPアドレスを使って、カーネルのパラメータでIPアドレスその他が渡されるから、改めてDHCPで取ってくる必要は本来はないんだけど。 でもこのカーネルレベルのIP-Configって、NICのドライバをモジュールにしてるとダメなのね。だからカーネルをコンパイルするときに、必要そうなNICのドライバは組み込みにしとかなきゃいけない。モジュール対応パッチというのをMLのアーカイブで見つけたけど、却下されていた。「モジュールが読める環境(initrd内)があるなら、そこでユーザレベルのDHCPクライアント使えばいいじゃん」てなもんだ。そりゃそうだ。 でも普通のmkinitrdではそんなinitrdを作ってくれない。initrd内にdhclientやpumpを入れれば恐らく問題はないと思う。ていうか最小構成はinitrdだけでいい。DHCPでIPアドレスもらってsshd上げときゃそれで済むんならinitrdのみでも問題ない話な気がする。initrdの中にgccとdistccdを押し込めとけば、DHCPとtftpのサーバを立てるだけで、一時的にコンパイルの子機を増やすのも楽になるなぁ。これは20MBもあれば十分かな。20MBあればXも上がる気がする。initrdの限界はramsizeだと思うけど、initrdの容量制限がどのくらいかは気にしとこう。 initのnashのスクリプトの最後のほうでswitchrootとかしないで、sshdとdistccdだけ上げてからコンソール用の/bin/shでも上げとくがいいじゃないかな。 そう、NFSと言えばnfsrootも問題で、nfsroot対応のカーネルにしなきゃいけない。しょうがないので、Fedora Core 3だとkernel-2.6.specをいじってリビルドすることになる。
元からあったような気がするんだけどね。見つからないんだよね。末尾の空白を除去するやつ。困って書いてしまった。
(defun my-delete-space-region (start end) "delete tailspace" (interactive "*r") (save-excursion (save-restriction (narrow-to-region end start) (goto-char (point-min)) (while (not (eobp)) (end-of-line) (delete-horizontal-space) (forward-line 1)) )) ) (defun my-delete-space-buffer () "delete tailspace" (interactive) (save-excursion (save-restriction (goto-char 0) (while (not (eobp)) (end-of-line) (delete-horizontal-space) (forward-line 1)) )) )
あまりきれいじゃないかも。
ramfsはdfに現れない。スワップされない。というわけで私はあんまり使ってません。一方でtmpfsというのもあります。2つある理由はわからないし、住み分けができているかどうかはわかりません。 tmpfsはdfに現れるし、メモリが足りなくなればスワップしてくれるということなので、日常的に/tmpとして使っています。デフォルトは実装メモリの半分(?)。 サイズはオプションsize=で変更可能で、動作中でもサイズの変更は可能だ。/tmpにtmpfsがマウントされてれば、
# mount -o remount,size=1G /tmp
とかね。動作中にサイズを変えても、置いてあるファイルは消えない。実装メモリよりも大きく設定することができるし、メモリ+スワップの容量よりも大きくすることもできる。やってみたら、メモリどころか、ディスク容量よりもはるかに大きいサイズにもできた(が、たぶん最後までは動作しないだろうな)。 じゃあ置いてあるファイルの容量よりも小さいサイズに変更してみたら、どうなるのか? 正しく「mount: /tmp not mounted already, or bad option」ではねられた。 なるほど。
ある日突然、Fedora Core 3のGNOMEで画像が開けなくなった。壁紙の変更もできない。 gthumbでもjpegが表示できていない。eogでも画像を開けない。prelinkとかのせいかなと思っていたんだけど、違うようだ。nautilusでもpngやjpegが画像として認識されていなかった。 どうもmime typeのテーブルが壊れたので画像として扱ってくれないっぽいので、試しに
# sudo update-mime-database /usr/share/mime
してみたら直った。再起動やログアウト/ログインの必要はない。
monoを入れようとダウンロードページ(mono-project.com)を見たら、yumでリポジトリを追加すれば入れられるらしい。 というわけで、
# cat /etc/yum.repos.d/mono.repo [mono] name=Mono baseurl=http://www.go-mono.com/archive/1.0.6/fedora-3-i386/ enabled=0 gpgcheck=0
このディレクトリ構成はどうなのかという話もあるけど、それは置いといて、
# yum --enablerepo mono install mono-core
とやったがうまくいかない。libicuucとかが必要らしい。しかしlibicuucはmonoのリポジトリにはない。調べたら、yum的にはdagのリポジトリにあるらしい。
# cat /etc/yum.repos.d/dag.repo [dag] name=Dag RPM Repository for Fedora Core baseurl=http://dag.freshrpms.net/fedora/$releasever/en/$basearch/dag/ http://dag.atrpms.net/fedora/$releasever/en/$basearch/dag/ http://ftp.heanet.ie/pub/freshrpms/pub/dag/fedora/$releasever/en/$basearch/dag/ enabled=0
# yum --enablerepo mono --enablerepo dag install mono-core
無事入りました。Apache HTTP Serverのモジュールmod_monoなんてのもあるらしい。しばらく遊べるかも。