2008年5月10日土曜日

ubuntuでもNTFSの圧縮フォルダ機能を

WindowsのNTFSはよく出来ていて、銀行のATMのHDDなんかもNTFSが使われたり、世界中で一番使われているファイルシステムなわけで信頼性が高かったりします。そのぶん読み書きがあまり速くなく、断片化もしやすいといた欠点もありますけどね。

 で、NTFSの便利な機能として、透過的に扱えるフォルダの圧縮機能があります。2chの過去ログを圧縮するなど用途によってはこの圧縮機能は便利なのですが、残念ながらubuntuの標準ファイルシステムである ext3 には圧縮機能がありません。
 まーいまどき500GBのHDDが七千円で買えちゃうんですから、ストレージ買えってことになっちゃうのかもしれませんが、でもねえ、4Gもの過去ログが半分のサイズになんかNTFSでなっているのをみると、ubuntuでもやりたくなるわけで・・・

ということで以下実験メモ。
残念ながらlinuxではあまり圧縮ファイルシステムは不毛なようです。ROMなど組み込み系で使用を前途にした読取専用ファイルシステムは結構あるんですけどねえ。
 色々調べた結果、こちらの記事を参考に FUSE を利用した LZOlayer ファイルシステム を試用してみることにしました。といってもやっていることはそのままなんですけどねw
LZOlayerFS の特徴はFUSE を利用したユーザランドで動く透過的な圧縮ファイルシステムです。圧縮アルゴリズムに lzo を採用し、高速な圧縮速度で通常のファイルシステムと違和感なく扱えます。
 lzo の圧縮速度についてはこちらのレポートが参考になります。

導入手順

LZOlayerFSをダウンロードし、ビルドします。あらかじめ開発環境と必要なライブラリを導入しておいて下さい。少なくてもfuse,zlib,lzo(liblzo2-dev) のライブラリが必要です。私の環境ではなぜか全部入っていましたw
wget http://north.one.pl/~kazik/pub/LZOlayer/LZOlayer_fs-20060306.tar.gz
tar zxvf LZOlayer_fs-20060306.tar.gz
cd LZOlayer_fs-20060306
make
sudo cp lzo_fs /usr/local/bin/
なのですが、そのままではエラーが出てコンパイルが通りませんので以下のように修正。

--- LZOlayer_fs.c.org
+++ LZOlayer_fs.c
@@ -7,13 +7,13 @@
Use it at your OWN RISK
Absolutely NO WARANTY
*/
+#define _LARGEFILE64_SOURCE
#define FUSE_USE_VERSION 22
#include <fuse.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
-#define __USE_LARGEFILE64
#include <fcntl.h>
#include <dirent.h>
#include <sys/types.h>
@@ -31,7 +31,7 @@
#define max_packets 2048
off_t block_size = 131072;
#define __LZOlayer_DEBUG 0
-#define VERSION "20060202-2"
+#define VERSION "20060306"

static char *srcPath;
static int zlibCompression = 0;
これで一応make通りました。出来た lzo_fs を~/bin なり /usr/local/bin なりにコピーしておいて下さい。

マウントしてみる

さっそく実験です。
まずはマウントポイントと、実際に圧縮されたファイルを格納するディレクトリを作成しておきます。
mkdir ~/lzo ~/lzo_compressed
さっそくマウント
lzo_fs ~/lzo_compressed ~/lzo -s

テスト

圧縮ディレクトリに2chのdatファイルを ~/lzo ディレクトリにコピーしてみます。datファイルのサイズは244Kバイト。
stat -c %s lzo/1208334590.dat
244031
stat -c %s lzo_compressed/1208334590.dat
112651
テキストファイルなので約半分に圧縮されてディスク上に格納されています。

アウンマウント

アウンマウントは、
fusermount -u ~/lzo


実際に使ってみて、普通に使えました。違和感なく。便利ですね。
ただ使用実績がないので信頼性は?ですけど。
大量のログファイルにHDDを占有されている人には一考の価値ありかも。

2008年4月27日日曜日

ubuntu 8.04 hardy アップデートメモ

LTS版であるubuntu 8.04 がついにリリースされました。
本当はLTS版なのでクリーンインストールするつもりだったのですが、事情により7.10からアップデートしました。
で、ま、あいかわらずアップデートに失敗しましたorz いやま、6.06からアップデートしまくりの上に、サーバーいろいろ入れてさらにスクリプトもいろいろいじっているので、失敗して当然なのですけどねorz
 とりあえず、do-release-upgrade -d , apt-get install -f , dpkg-reconfigure -a などのコマンドを駆使してなんとかアップデート完了。げっそり。

以下個人的メモ

  • フォントがくっきりはっきりになった。
  • アプリの起動速度はあんまり変わらない。
  • firefox3が2と比べて早くなった気がしない。
    使いたい拡張機能が使えなかたので、firefox3を削除してfirefox2に戻した。自動スクロール機能の挙動がおかしかったのも替える理由。
  • emacs23でIPAフォントが細くなった。VLゴシックに変更した。
  • システム管理の中にあったフォルダの共有がなくなっている。不便かも?
  • きびきび感は上った。かも。
    これはプロセススケジューラがCFSに変ったせいかもしれない。
  • うちの鈍足PCではpreloadは効果ないので削除。7.10でも効果なかった。
  • ログイン画面がはみ出していた。xorg.confで仮想画面で大きい値になっていたのを修正した。
  • gnome-vfsからgvfsにgnomeの仮想ファイルシステムが変更になったせいで、Nautilusでfonts:///などが使えなくなった。
  • 同じくNautilusでsmb://が表示されない。直接アドレスを指定すれば接続する。動いてないみたい。
    smbclientでマウントして使っているから別にいいけど。
    • アップデートがきて解決。
  • アイコンテーマを変えてもフォルダのアイコンが変更されなくなった。
    いやんな感じ。スーケーラブルな画像データじゃないと変更されないとか?
  • locate が、slocate から mlocate に変更になった。mlocate の方が軽量だ。
  • ntfs-3g がsetuidしてもマウント出来ない。sudo すればいいだけだけど・・・

2008/05/09追記:

 しばらくして気付いたのだけれども、ファイルアクセスが速くなっている。
 たとえばNautilusを開いたときの速度が速くなった。
 あとは du でディレクトリ容量を表示するのが一瞬になった。前はごりごりHDDランプが点滅していちいちディレクトリ以下を見に行ってた。

  • GVFS はGNOME-VFSに代って導入されたユーザーランドで動く、新しい仮想ファイルシステム
    以前の機能がまだ未対応な部分も多いが順次切り替わっていくでしょう。GVFSになるとユーザのホームディレクトリに .gvfs/ ディレクトリが作られ、マウントポイントになる。
    試しにNautilusで適当にネットワークフォルダを見に行くと、自動的に ~/.gvfs/ 以下にマウントされている。

2008年4月6日日曜日

PuTTYでEmacsを256色で表示する。

puttyでemacsを使っていると、8色表示しかできていない。これだとさすがに色分け表示がきついので256色表示を出来るようにしてみた。
以下導入メモ。

PuTTY側

terminfo で xterm-256color を使う。
puttyは256色表示できるので、まず、puttyの設定を行う。
まず、
xterm 256色モードを使うことを許可する
にチェックを入れる。
次に、端末のタイプを表す文字列に、
xterm-256color
と指定する。

ubuntu側

xterm-256colorの設定を入れる。
sudo apt-get install ncurses-term



これで、emacs -nw として起動してcolor-themeなどから好きな色を選べばOK.

2008年3月16日日曜日

Ubuntuのpolipoでデイスクキャッシュサイズを制限する

えー、なんか polipo が大人気なようで。紹介した身としてとてもうれしい。
でもなんかpolipo入れればネットが速くなる魔法のソフトのような理解をしている方もいるみたい。polipoはあくまでもproxyサーバーなので。そこのとこをひとつよろしくね。

さて、MacユーザやWindowsユーザの苦労を尻目に快適に動いている我等が ubuntu でのpolipoなのですが、先日ニコニコ動画を連続視聴していましたら、急にストリームが受信できなくなって、なんでかなーと調べたら、polipoのキャッシュを保存してあるHDDのパーティションの使用率が100%になっていました。(^_^;)
 いやあ、あせったあせった。
 polipo にはディスクキャッシュのサイズを指定する設定がないみたい。そんなわけでディスクキャッシュを切り詰める、polipo_trimcache というツールがあるので、さくっと落として利用。

インストール

wget http://ely.ath.cx/~piranha/software/polipo_trimcache/polipo_trimcache-0.2.py
sudo mv polipo_trimcache-0.2.py /usr/local/bin
cd /usr/local/bin
sudo ln -s polipo_trimcache-0.2.py polipo_trimcache
polipo_trimcache は/usr/local/bin に放り込みました。~/bin に入れてそこからリンクを貼ってもいいかもしれません。

使い方

sudo polipo_trimcache /var/cache/polipo 1000M
のように使います。上の例は、サイズを1Gに指定しています。

 それで、後は上のコマンドを定期的にシェルスクリプトで動かせばいいわけですが、今回のように動画連続視聴でキャッシュいっぱいとか、いつハードディスクが満杯になるかわかりません。
 いろいろ考えたんですが、 quota 使うとか、dfを10秒ごとに回して使用量をチェックするとか。

 んでまあ、ファイルのイベントを通知する inotify を利用することにしました。
 キャッシュディレクトリを監視し、新規にファイルが作られたら、HDDの空き容量をチェックして、指定した閾値以上になったら polipo_trimcache を実行します。
 事前に polipo_trimcache と inotify が必要なので入れておきます。
sudo apt-get install inotify-tools
入れたら以下のスクリプトを polipo-diskcache-check.sh として保存します。実行属性を付けてね。

#!/bin/sh
# last updated : 2008/03/19 02:44:25 JST
# $Id: polipo-diskcache-check.sh,v 1.2 2008/03/18 18:04:30 yama Exp $
# polipo のキャッシュのあるパーティションの使用率が指定した
# パーセントを越えるとキャッシュを指定したサイズまで削除する。
#

# 設定
# キャッシュのあるディレクトリを指定する。
CacheDir="/var/cache/polipo"
# キャッシュのあるパーティションの使用割合(パーセントで指定する)
LimitDiskSize=84
# 指定サイズまで切り詰める。
CacheSize="1200M"
# polipo_trimcach の指定。
polipo_trimcache='/usr/local/bin/polipo_trimcache'
#---------------------------------------------------

#echo "初期値は、" $LimitDiskSize "%です。"
while inotifywait -q -q -r -e create $CacheDir ; do
AB=`df --sync /var | awk '/^\/dev/{sub(/\%/,"", $5);print $5}'`
if [ $AB -gt $LimitDiskSize ]; then
nice -n 15 $polipo_trimcache $CacheDir $CacheSize &> /dev/null
fi
done


 あとはこいつを実行すれば、キャッシュがHDDを圧迫しそうになったら自動的にお掃除してくれます。
 /etc/init.d/polipo を修正して同時に起動するようにしておくと楽でしょう。

2008/03/19 追記:

 具体的には、/etc/init.d/polipo の40行目あたり、

case "$1" in
start)
echo -n "Starting $DESC: "
$PPCTL start

の下に
polipo-diskcache-check.sh &
と追記。
45行目あたり、

stop)
echo -n "Stopping $DESC: "
$PPCTL stop
の下に
killall polipo-diskcache-check.sh inotifywait
を追記します。
 後は、
sudo /etc/init.d/polipo restart
としてpolipoを再起動し、
ps aux | grep polipo
と、psコマンドでちゃんと動いているか確認してみてください。

 いやあ便利べんり。ubuntu 最高。

2008年3月12日水曜日

Emacsから印刷する

前回を踏まえてEmacsから印刷してみます。
~/.emacsに以下を追記します。
;;;====================================
;;;; print - 印刷設定
;;;====================================
;;; Postscript で印刷
(setq my-print-command-format "nkf -e | e2ps -a4 -p | lpr")
(defun my-print-region (begin end)
(interactive "r")
(shell-command-on-region begin end my-print-command-format))
(defun my-print-buffer ()
(interactive)
(my-print-region (point-min) (point-max)))
これだけ。

あとは、M-x my-print-buffer でカレントバッファがプリントアウトされます。印刷範囲を指定したい時は、範囲選択をしてから、 M-x my-print-region です。

2008年3月11日火曜日

ubuntuでコマンドラインから印刷する

 GUI環境がこれだけ整っている今に、わざわざCLI環境から印刷を積極的に行なう、少くともデスクトップユーザー的にはあまりない話なのですが、ちょっと気になったので調べてみました。

 まず、印刷は lpr コマンドを通して行なわれます。例えば、hoge.txt を印刷したいときは、
cat hoge.txt | lpr
などとするわけですね。
 それでまあ日本語の場合、lprに渡す前に postscript に変換して渡さないといけないんですが、この変換ツールがいろいろあり、なかなか大変でした。
 ちなみに以下のコマンドを試すにあたっていろいろいじった環境でテストしたので他の方でうまくいかないかもしれません。プリンタは、 cups-PDF を入れてPDFに出力されたものをadobeの acrobatreader で確認しました。また事前に、
sudo apt-get install gs-cjk-resource cmap-adobe-japan1
して、
sudo dpkg-reconfigure cmap-adobe-japan1
を実行し、全てにチェックを入れてあります。

試した変換コマンド

  • a2ps
  • a2psj
  • u2ps
  • paps
  • e2ps
 ざっと試してみただけでこれだけありました。
 まず、 a2ps ですが、定番です。がこいつは日本語には対応していません。少くても ubuntu では。機能は豊富なんですが。
 次に a2psj は perl で書かれたスクリプトですが、UTF-8には対応していません。euc-jpならOKで綺麗に印刷できましたが、枠線が出ます。
 u2ps は、GNOME のライブラリを用いるタイプで、こいつはとっても綺麗に変換してくれました。名前の通りUTF-8対応です。ですが機能が貧弱で余計な枠線が表示され、消す方法がわかりませんでした。
 paps は画像データとして変換してしまうので、ファイルサイズも大きくなり、またPDFで文字選択ができないなど、お話にもなりませんでした。
 最後に e2ps ですが、名前の通りeuc-jp対応の変換ツールですが、こいつはばっちりでした。そして機能も申し分なく、u2psのような余計な枠線も出ませんでした。

 いろいろ試した結果、どれも帯に短かし、襷に長しでした。u2psは唯一utf-8対応ですが、機能は貧弱すぎでしたし、a2psjは枠線出るし、a2psは日本語無理だし・・・

 最終的には、
nkf -e hoge.txt | e2ps | lpr
のような形になりました。
 これでコマンドラインから綺麗な日本語文書を印刷する環境が整いました。
 コマンドラインから印刷できると、自動でPDFファイルを生成し、メールで送信するとか、いろいろ自動処理するのに都合がいいので、お試しあれ。

2008年3月4日火曜日

Emacsからrubyのドキュメントを閲覧する

疲れた。そもそもrubyのリファレンスをEmacsから見たいだけなのに、なぜにどうしてこうも苦労しないといけないのか。

とりあえず、いろいろごちゃごちゃやってしまったんだけど、忘れないようにメモ。

インストールメモ


手順1

ここから基本セット+リファレンスを落とす。
wget http://i.loveruby.net/archive/refe/refe-0.8.0-withdoc.tar.gz
tar zxvf refe-0.8.0-withdoc.tar.gz
cd refe-0.8.0-withdoc/refe-0.8.0
ruby setup.rb config
ruby setup.rb setup
sudo ruby setup.rb install


これでrubyのリファレンスを閲覧するためのrefeリファレンスがインストールされる。

手順2

次にEmacsで見るための rrse.el を入れる。
rrseはここから落としてくる。
wget http://www.kmc.gr.jp/~ohai/rrse/rrse-0.3.tar.gz
tar zxvf rrse-0.3.tar.gz
cd rrse-0.3
sudo cp rrse-* /usr/local/bin
cp rrse.el ~/.lisp
rrse-refe-listdescs, rrse-ri-listdescs, rrse-merga-tables, rrse-make-table は/usr/local/bin にコピー。rrse.el は~/.lisp に放り込む。
そしてデータベースを作成する。
rrse-make-table --refe
~/.rrse/ 以下にデータベースが作成される。

手順3

後は~/.emacsに以下を追記する。
;;;====================================
;;;; rrse - ruby マニュアル
;;;====================================
;;; ruby マニュアルReFeをEmacsから閲覧する。
(load "rrse")
(rrse-setup)

(add-hook 'ruby-mode-hook
'(lambda ()
(define-key ruby-mode-map [f1] 'rrse-help)))


これで準備完了。
後は、Emacsでなにか適当にrubyファイルを開いてruby-modeで、メソッドの上にカーソルを持っていけば、ミニバッファに簡単なリファレンスが表示される。
 詳しい情報は、その状態で、M-x rrse-help あるいは、F1 キーを押せば詳しいリファレンスが表示される。

globメソッドの上にカーソルを持っていくと、ちゃんとミニバッファに簡易な要約と、rrse-helpで詳しい情報が表示されている。