追記

you know something? Use it for myself.

F1 | FreeBSD | GAE | Mac | Merb | TextMate | emacsen | gentoo | google | hatena | human | lego | osx | plagger | programing | rails | ruby | society | tDiary | twitter | wiki

2009/11/27 (Fri)

[osx] iSCSI でラクラク共有

またもや 3ヶ月ぶりの更新です。最早通例となりつつあるようです(笑)。先のポストで「そう。何か楽しいんですよね。つぶやき。」とは申し上げたものの、tweets ばかりしていると、文章力が落ちてしまうような気がしました。「ネットへの発信」ということであれば、できるだけブログへのポストを優先するようなスタイルの方が良いのかも知れませんね。

さて、閑話休題。過日 twitter に ubuntu について、たっぷり(笑)愚痴りましたが、

Ubuntu勘弁してくれ、其の壱

Ubuntu勘弁してくれ、其の弐

Ubuntu勘弁してくれ、其の三

Ubuntu勘弁してくれ、其の四

Ubuntu勘弁してくれ、其の五

其の壱〜五くらいまでかな > Ubuntu愚痴

我が家の ThinkPad X200 と Ubuntu 9.04 との相性はあまり良くないらしく、上記のように色々とトラブルが頻発しました。

正直申し上げて、Linux を使用する最大の理由は、とにかく落ちないコト。Windows のように理不尽なまで不安定にならないコト。このためだけに、あらゆるモノをトレードオフしている訳ですから、このデッドラインを越えるのであれば、「とても使えない」という結論に辿り着いてしまいます。

結局、手間は掛かるものの、過去の経験的には Gentoo と FreeBSD が一番安定していました。私のケースではありますが、少なくとも上記の愚痴に述べられているような症状はまったく発生しませんでした。

ということで、一念発起。脱 Ubuntu、歓迎 Gentoo で所有機種すべての換装作業を始め、現在も継続中です(Gentoo は何かを試すにも全部ビルドなので、大変です)。ちなみに、FreeBSD はとてもお気に入りなのですが、「専用のFlash が無い」と「ラップトップのサスペンド・レジュームがまったく不可能」の二点であえなく落選です。ZFS を使うこともできて、イイ OS なんですけどね。サーバ以外の用途で使うには、いささか....

さて、我が家には PowerBookG4 と iBookG4 という古参の猛者がいまだに現役でいます。Ubuntu でも問題だったのですが、netatalk をどうするか。2.0.4 以降は文字コード問題に対処済みなのですが、このバージョンのパッケージが有るディストリビューションって、意外と少ないのです。Ubuntu は beta2 という何とも中途半端なバージョンが最新。これがまた接続すらできない。過去、遭遇したことも無いようなトラブルから始めちゃってくれます。Gentoo も 2.0.3 以降、かなり長期間メンテナンスが放置されているようです...Linux 的には netatalk は鬼門のようです。

Gentoo Bug 279057 - net-fs/netatalk-2.0.4 version bump new ebuild

この点では、FreeBSD の ports の追随は比較的早いので、サーバはこちらでも良いかな?とも思うのですが、メンテナンスの手間を考えると、サーバもデスクトップも同一 OS で行きたいのが心情であります。何か代替方法は無いものか、と考えあぐねいていると、iSCSI が引っ掛かりました。

ターゲット側の設定も楽チン。イニシエータ側も OSX であれば、globalSAN という至極便利な無料ソフトがありますので、とても簡単。サーバ側でバックアップなどの管理を実施するにも、HFS+ であれば、Linux でマウントできますから、こちらも問題無し。

ISCSI - Gentoo Linux Wiki

Hfsplus - Gentoo Linux Wiki

上記の記事に従って設定。試しに切った LVM に PowerBookG4 から接続してみましたが、あっさり成功。我が家の貧弱な LAN 環境(有線:100Mbps, 無線:11g)でも、ストレス無く利用できました。afpd よりも早い感じがしました。スゴい!

この手法ですと文字コード問題が残りますが、「設定や仕組みのシンプルさ」は、私の場合、日本語ファイル名はほとんど有りませんので、十分トレードオフに値すると思っています。ぜひ、お試しあれ!



2009/08/19 (Wed)

[twitter] twitter の RSS をトップに

何とも 3ヶ月ぶりの更新です。忙しくなると、いよいよ更新が滞ってしまいます。

私がずぼらだから? それもあります。しかし、やはり読んでいただくことを考えると、1ポスト当たり最低でも 1時間弱の時間を掛けていますので、それも大きな要因かな? とも思っています(なので、質を維持しつつも、毎日更新されている方のコトは本当に尊敬してしまいます)。

そんな折、ふとした拍子で始めた twitter。なぜか、こちらはほぼ毎日、順調に更新することができています。一体この差は何だろう? と考えるに、やはり字数なのでしょう。

私は毎回、制限の 140文字をほぼ使い切っています。頭の中に浮かんだ内容をでき得る限り正確に伝えたい、という願いのためですが、所詮 140文字では限界がありますから、圧縮にも時間を掛けています。とは申せ、たかが 140文字。できることは限られていますから、時間を掛ける、とは言っても、大抵は数分以内で収まります。

片や、ブログの文章でも圧縮は行ないます。ただ、こちらの方は、どちらかと言うと、より分かりやすい文脈を維持するための手法であり、前後の文章の統合や表現の繰り返しの回避などなど、納得が行く表現を模索し始めれば、際限はまったくありません。

恐らく、この差なのだろうなぁ、と思っています。それぞれの用途がありますので、どちらに優位性がある、と断言することはできませんが、少なくとも私にとっては、日常的には、マイクロブログの方が性に合っているようです。近々、スマートフォンを購入する予定ですので、そうなれば尚更でしょう。

最後に、私の twitter を転載させていただきます。

とここまで2つの呟き。140文字の縛りが結構イイ。ブログだとダラダラ。でもこちらではそうは行かない。一球入魂。伝えたい内容をギュっと圧縮するプロセスは意外と心地良い。何か楽しくなってきた。』

そう。何か楽しいんですよね。つぶやき。



2009/05/21 (Thu)

[rails] これは便利!

いささか乗り遅れた話題かも知れませんが....

Rails2.3のApplication Templateを使ってRspecやI18nの設定を自動化 - func09

プロジェクトを作成する。プラグインをインストールする。git レポジトリを作る。などなど。

最近の Framework は皆、大体同様の前段取りが必要で、しかし、インストールすべきプラグインやデータベースの設定など、微妙に差異があって完全には汎用化できない部分もあって、ある程度までは script を組んではみるものの、細かいところは面倒なので、結局手作業有り。

みたいな、私はそんな状況でしたので、標準で自動化手段が用意されている、というのは非常にありがたいことです。素晴しい。

それから....

ぺたぺた :: FreeBSDにRuby on Railsを入れる

FreeBSD で、rails コマンドを使用して、

undefined method `camelize' for "app":String

というエラーが出る場合の対処方法が、こちらには掲載されています。

ruby-iconv が足りないそうです....はぁ、そうなんですか....



2009/04/25 (Sat)

[society] 分かるなぁ〜(シミジミ 16:37

なぜ学力は低下したのか - Life like a clown

分かるなぁ〜。私も親族に無関心あるいはプレッシャーを掛けられることはあっても、褒められたことは皆無に近かったので、ツラい・しんどい思いをしている子どもたちの気持ちって、すごくよく分かります。

なので、ウチの子に限らず、父兄参加みたいな場で他所のお子さんと接する時も常に、褒めちぎるよう、心掛けています。一人一人の子どもの、それぞれの日常の境遇は分かりませんが、例え他人でも、例え一時でも、褒めてもらうことができた、という経験は子どもにとって嬉しいこと、だと思うからです。

“「いくら学力(学歴)が高くても」「学校の勉強だけできても」がどんだけ子供を無気力にさせてるか少しは考えろ”

ゆとりが良いの悪いの、などなど、手法を論ずることも大事ではありますが、基準となる理念あるいは指向といった類をしっかり確立しておかねば、その手法の是非自体も検討することさえできない、と私は思います。

結局のところ、社会と教育という非常に重要な関係性に一貫性を欠いている、ということなのでしょう。そして、その矛盾を日常的に子どもたちへ押し付けていることに、お子さんがいらっしゃる・いらっしゃらないにかかわらず、多くの大人たちが気づくべきなのでしょうね。

幼年期の終り ではありませんが、子どもたちが存在しない社会など存在することが可能でしょうか。

未来を感じることができるから社会に活力が出てくる。そして、その未来を形づくるのは子どもたち。そういう世代の存在を感じ取ることができる能力、大切にする気持ちが、日本人には欠落してきているように思うのは、私だけでしょうか。

まぁ、難しい話は後にしても、ぜひ、世の大人のかたがたには、まず子どもを褒める、ということから真剣に考えてみて欲しいですね。

あっ、ちなみに、嬉しそうな顔を見ると、こっちが癒される特典が付いてきますよ(w



2009/04/24 (Fri)

[FreeBSD] distcc 手仕舞い編

以前掲載させていただきました ZFS root の一連の手順をスクリプト化したスクリプトですが、distcc の tmpfs 問題を受けて修正を入れました。

使用されている方もいらっしゃらないとは思いますが、備忘録代わりとして再掲させていただきます。

#!/bin/sh -x
#
# zfs.sh - ZFS root installation for FreeBSD.
#
# Usage: Please boot single user mode, type below and do.
#   mount -w /
#   mkdir -p ${path}  # that will include this script.
#   mount /dev/da[0-9]s1d ${path}
#   sh -x ${path}/zfs.sh
#

# ------------------------------------------------------------------------- #
#  Initialize.
# ------------------------------------------------------------------------- #

# to set basic information of your machine, for example "Drive Letter",
# sourced by CPU name.
cpu_name=`dmesg|egrep -i 'CPU:'`

# Please change "Opteron or Pentium" to CPU name of your machine,
# and set "tank", "bootdir" and "datank" to Drive Letter of your machine.
case ${cpu_name} in
    *Opteron*)
        pools='tank=/dev/ad4s1d datank=/dev/ad6'
        bootdir='/dev/ad4s1a'
        datanks="xxxxxxxxxx"  # for second drive.
        defaultrouter='defaultrouter="xxx.xxx.xxx.xxx"'
        hostname='melchior'
        ifconfig='ifconfig_bge0="inet xxx.xxx.xxx.xxx  netmask 255.255.255.0"'
        keymap='us.iso'
        ;;
    *Pentium*)
        pools='tank=/dev/ad0s1d'
        bootdir='/dev/ad0s1a'
        hostname='xxxxxxxxxx'
        ifconfig='ifconfig_fxp0="DHCP"'
        keymap='us.pc-ctrl'
        ;;
    *)
        pools='tank=/dev/ad8s1d'
        bootdir='/dev/ad8s1a'
        hostname='xxxxxxxxxx'
        ifconfig='ifconfig_em0="DHCP"'
        keymap='us.pc-ctrl'
esac

# Please change tank's names, if you want.
tanks="home tmp usr var"

# Please add or delete configuration lines, if you want.
rc_conf="# $Id$\n\
${defaultrouter}\n\
${ifconfig}\n\
check_quotas=\"NO\"\n\
hostname=\"${hostname}.localhost\"\n\
keymap=\"${keymap}\"\n\
keyrate=\"fast\"\n\
ntpdate_enable=\"YES\"\n\
ntpdate_flags=\"ntp.jst.mfeed.ad.jp\"\n\
zfs_enable=\"YES\""

rc_local='# $Id$\n\
mount -w -t tmpfs none /var/tmp'

loader_conf='# $Id$\n\
zfs_load="YES"\n\
vfs.root.mountfrom="zfs:tank/bsdroot"\n\
tmpfs_load="YES"' # not required, if you want.

# ------------------------------------------------------------------------- #
#  Functions.
# ------------------------------------------------------------------------- #

rcsDO() {
    if [ -e $1 ]; then
        ci -l $1
    fi

    echo -e $2 >> $1

    if [ -e $1,v ]; then
        rcsdiff $1 | less
        ci -l -m"$3" $1
    else
        ci -l $1
    fi
}

poolsDO() {
    for i in ${pools}; do
        `echo ${i} | sed -e "s/^\(.*\)=\(.*\)$/$1/"`;
    done
}

tanksDO() {
    for i in ${pools}; do
        pool=`echo ${i} | sed -e "s/^\(.*\)=\(.*\)$/\1/"`;
        for j in `eval echo '${'${pool}'s}'`; do
            zfs create ${pool}/${j}
        done
    done
}

# ------------------------------------------------------------------------- #
#  Installation.
# ------------------------------------------------------------------------- #

poolsDO 'zpool create \1 \2'
poolsDO 'zfs set mountpoint=none \1'

zfs create tank/bsdroot
tanksDO

zfs set mountpoint=/tank tank/bsdroot
for i in ${tanks}; do
    zfs set mountpoint=/tank/${i} tank/${i}
done

df -h
zfs list

rcsDO /etc/rc.conf ${rc_conf} 'added settings.'

find -x / | cpio -pmd /tank

rm -rf /tank/boot
mkdir /tank/bootdir
cd /tank
ln -s bootdir/boot boot

rcsDO /boot/loader.conf ${loader_conf} 'added zfs and tmpfs.'

ci -l /tank/etc/fstab
cp /tank/etc/fstab /tank/etc/fstab.bak
echo '# $Id$' > /tank/etc/fstab
sed -e "s/^\(${bootdir}.*\/\)/\1bootdir/" /tank/etc/fstab.bak >> /tank/etc/fstab
# tmpfs is not required, if you want.
# echo 'tmpfs  /tmp      tmpfs  rw,mode=1777  0  0' >> /tank/etc/fstab
# echo 'tmpfs  /var/tmp  tmpfs  rw,mode=1777  0  0' >> /tank/etc/fstab
rcsdiff /tank/etc/fstab | less
ci -l -m"modified ${bootdir}." /tank/etc/fstab  # and added tmpfs.

rcsDO /tank/etc/rc.local ${rc_local}

for i in ${tanks}; do
    zfs set mountpoint=/${i} tank/${i}
done

cd /
zfs set mountpoint=legacy tank/bsdroot

# ------------------------------------------------------------------------- #
#  The End.
# ------------------------------------------------------------------------- #
# Congratulations. your ZFS settings was done.
# Please type below, do and reboot your machine.
# umount ${path}  # that includes this script.
# reboot

exit 0

2009/04/23 (Thu)

[FreeBSD] distcc その後の大逆転 01:02

こんな ML の痕跡を発見しまして、

もしや?!と思い立って、再度 distccを試してみたところ....おお〜! distccmon-text が distributed address を表示してるぅ〜(号涙

ということで、アッサリ上手く行っちまいやがりました。今回の一連の騒動は、/tmp にマウントしていた tmpfs に原因があった、と思われます。tmpfs を umount したら、上述の通りです。

ちなみに、試した組み合わせをまとめさせていただきますと、最終的に下記の通りとなります。


● i386/7.1-release

成否tmpfs の有無distccgcc
XO2.18.3_104.2.1 20070719
OX
XO3.1 (野良ビルド)

● amd64/7.1-release

成否tmpfs の有無distccgcc
XO2.18.3_104.2.1 20070719
OX
XO3.1 (野良ビルド)

● amd64/8.0-current

成否tmpfs の有無distccgcc
XX2.18.3_104.2.1 20070719
XX3.1 (野良ビルド)
XX4.3.4 20090405


前回は tmpfs を使用していない 8.0-current で失敗しておりましたので、早期発見に繋がりませんでした(8.0-current を常用しようと思っておりましたが、こういう細かいところにまだまだ不具合が在るところがやはり current の成せる技なのか、と思いました)。

やはり、伸縮するディスク、という性質が、それを想定していないコードとの間に問題を発生させているのでしょうか。OS 絡みのコードにはあまり詳しくありませんので、子細はちょっと不明ではありますが、それにしても、さすが extra experimental feature、してやられました。

ただ、私の環境で time を取ったところでは、一時ファイルの収容先を tmpfs に変更するだけで、平均 3割前後のコンパイル時間の短縮に貢献しておりましたので、いささか残念ではあります。

さぁ、これで足の遅いラップトップにもガンガンにインストールできるようになりました。いよいよ swap の ZFS 化と、もろもろの設定、と行きたいところです。

が、しかし、buildworld では distcc が発動しませんでした。さらにしかし、buildworld こそ、distcc を使わねばならない工程ですから、せっかく稼働するところまで辿り着きましたので、調査継続です。



2009/04/22 (Wed)

[FreeBSD] distcc その後の顛末....

どうも「クライアントとサーバ間で通信はできている」しかし「サーバ側でのコンパイルに失敗している」という感じのようです。

によると、distccd では、

  1. DOTI という、いわゆるシリアライズ化(と思われる)されて distcc から送信されてくるソースを受信してコンパイル
  2. コンパイル後は、DOTO という、こちらもいわゆるシリアライズ化(と思われる)形式でバイナリを distcc に返信

という流れのようです。そこで、

distccd_flags="(snip) --verbose"

フラグを付けて詳細なログを取得。すると....

(snip)
Apr 21 17:39:21 xxx distccd[5986]: (dcc_r_token_int) got DOTI00027efd
Apr 21 17:39:21 xxx distccd[5986]: (dcc_r_file) received 163581 bytes to file /tmp/distccd_d3708639.i
Apr 21 17:39:21 xxx distccd[5986]: (dcc_r_file_timed) 163581 bytes received in 0.003290s, rate 48555kB/s
Apr 21 17:39:21 xxx distccd[5986]: (dcc_set_input) changed input from "nkf.c" to "/tmp/distccd_d3708639.i"
Apr 21 17:39:21 xxx distccd[5986]: (dcc_set_input) command after: /usr/bin/gcc -O2 -fno-strict-aliasing -pipe -m32 -march=pentium3m -march=pentium3m -c /tmp/distccd_d3708639.i -o nkf.o
Apr 21 17:39:21 xxx distccd[5986]: (dcc_set_output) changed output from "nkf.o" to "/tmp/distccd_d0fc8639.o"
Apr 21 17:39:21 xxx distccd[5986]: (dcc_set_output) command after: /usr/bin/gcc -O2 -fno-strict-aliasing -pipe -m32 -march=pentium3m -march=pentium3m -c /tmp/distccd_d3708639.i -o /tmp/distccd_d0fc8639.o
Apr 21 17:39:21 xxx distccd[5986]: (dcc_spawn_child) forking to execute: /usr/bin/gcc -O2 -fno-strict-aliasing -pipe -m32 -march=pentium3m -march=pentium3m -c /tmp/distccd_d3708639.i -o /tmp/distccd_d0fc8639.o
Apr 21 17:39:21 xxx distccd[5986]: (dcc_spawn_child) child started as pid7791
Apr 21 17:39:21 xxx distccd[7791]: (dcc_increment_safeguard) setting safeguard: _DISTCC_SAFEGUARD=1
Apr 21 17:39:21 xxx distccd[5986]: (dcc_collect_child) cc child 7791 terminated with status 0x100
(snip)

多分、この部分が当該箇所なのでしょう。

Apr 21 17:39:21 xxx distccd[5986]: (dcc_r_token_int) got DOTI00027efd
Apr 21 17:39:21 xxx distccd[5986]: (dcc_r_file) received 163581 bytes to file /tmp/distccd_d3708639.i

まず、ここで nkf.c のソースを受信。一時ファイル化しているようです。

Apr 21 17:39:21 xxx distccd[5986]: (dcc_set_input) changed input from "nkf.c" to "/tmp/distccd_d3708639.i"
Apr 21 17:39:21 xxx distccd[5986]: (dcc_set_input) command after: /usr/bin/gcc -O2 -fno-strict-aliasing -pipe -m32 -march=pentium3m -march=pentium3m -c /tmp/distccd_d3708639.i -o nkf.o

次に、nkf.c を保存した一時ファイル名に変更。コマンド列の nkf.c も当該ファイル名に置換。出力先である nkf.o についても同様の措置を行なった後、

Apr 21 17:39:21 xxx distccd[5986]: (dcc_spawn_child) forking to execute: /usr/bin/gcc -O2 -fno-strict-aliasing -pipe -m32 -march=pentium3m -march=pentium3m -c /tmp/distccd_d3708639.i -o /tmp/distccd_d0fc8639.o
Apr 21 17:39:21 xxx distccd[5986]: (dcc_spawn_child) child started as pid7791

さぁ、コンパイル!と行きたいところなのですが、

Apr 21 17:39:21 xxx distccd[7791]: (dcc_increment_safeguard) setting safeguard: _DISTCC_SAFEGUARD=1
Apr 21 17:39:21 xxx distccd[5986]: (dcc_collect_child) cc child 7791 terminated with status 0x100

あえなく失敗。思うに、この

/tmp/distccd_d3708639.i

という一時ファイルの中身がおかしいのではないか? と、

export DISTCC_SAVE_TEMPS=1 (or setenv DISTCC_SAVE_TEMPS 1)

で発掘してみると....ビンゴでした。何とバイナリファイルのまま。多分、ここでは、テキストファイルでの nkf.c が再現できていなくてはダメだと思うのですね。

試しに、以下の 7種類の組み合わせで確認してみましたが、すべて同じ結果になりました。

  • 7.1-release/i386 + distcc 2.18.3_10 + gcc42
  • 7.1-release/i386 + distcc 3.1 (野良ビルド) + gcc42
  • 7.1-release/amd64 + distcc 2.18.3_10 + gcc42
  • 7.1-release/amd64 + distcc 3.1 (野良ビルド) + gcc42
  • 8.0-current/amd64 + distcc 2.18.3_10 + gcc42
  • 8.0-current/amd64 + distcc 3.1 (野良ビルド) + gcc42
  • 8.0-current/amd64 + distcc 3.1 (野良ビルド) + gcc43

こうなると、distcc 本体の問題だと思われるのですが、linux の方では同様の障害が発生している様子ではありませんので、FreeBSD と distcc の組み合わせの問題、ということになるのでしょう。

であれば、ここからはデバッガで追うことになりますが、そこまで手間を掛けなくとも、package でインストールしておいて、アップデートされたものから順次 ports で少しずつビルド、という手もありますので、今回はここまでにしようと思います(buildworld で使うことができないのはイタいですが)。

ちなみに、どの BSD でも同様ですが、ソースを弄ることを前提にしつつも、バイナリパッケージによる手っ取り早感、というのは、linux のディストリには無い魅力ですね。

[追伸]

一応、7.2 と 7.1 のタグが打たれていますが、最終更新が 7.1 のリリース前、昨年の 8月ですからね。仮に 7.0 まで動いていたとしても、7.1 以降で動作する、ということにはなりませんね。この問題が解決できないから 8ヶ月も放置されている、と邪推していますが、FreeBSD では distcc の需要って、あんまり無いんでしょうか?


copyright©2002-2009 AYU All Rights Reserved.