2009年12月24日木曜日

Intel DP55WB + Intel Core i7-860 で debian/ubuntu (予定)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
卒論・修論用の計算用PCとして、流行りの Core i7機を入れました。下調べはしていたのですが、blogには書いてなかったなと思って書き起こしておきます。

気になったのはネットワーク周り。

マザーボード:Intel DP55WB
http://www.intel.com/cd/channel/reseller/ijkk/jpn/430580.htm
NICは 82578DC
http://www.jp.kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.31
というわけでカーネルのバージョンが新しくないと対応しない模様です。

Debianの場合、
lennyは2.6.26ということで無理そう。
squeeze/lenny-backports でも 2.6.30ということで惜しい。
sidは早くも 2.6.32 みたいなので、現時点ではsidということになるのでしょうか。
ちょっとハードル高いかな……

一方、Ubuntuのほうは、Karmic (9.10) から対応できそうに見えます。不具合が出るという記事も見かけるんですが、このPCではデスクトップ環境は起動しないはずなのでX周りのトラブルは踏まない…はず?

というわけで今期の計算機には ubuntu 9.10 + server CD で最小インストールを試みるということで。

2009年12月1日火曜日

print/cups-base の更新がうまくいかない…

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
portupgrade -a をちょっとやってみたのですが、 print/cups-base のアップグレード (cups-base-1.3.9_3 から 1.4.2 へ)に失敗してしまいました。


cc -L../cgi-bin -L../cups -L../filter -L../ppdc -L../scheduler -L/usr/local/lib/ -L/usr/local/lib -Wl,-R/usr/local/lib -pie -fPIE -Wall -Wno-format-y2k -fPIC -Os -g -fstack-protector -o cupsd auth.o banners.o cert.o classes.o client.o conf.o dirsvc.o env.o main.o ipp.o listen.o job.o log.o network.o policy.o printers.o process.o quotas.o removefile.o select.o server.o statbuf.o subscriptions.o sysman.o -L. -lcupsmime \
-lz -L/usr/local/lib -lgnutls -lldap -lpam \
-lpaper -L/usr/local/lib -ldbus-1 -lcups -L/usr/local/lib -lgnutls -pthread -lm -lcrypt \

client.o(.text+0x233a): In function `encrypt_client':
/usr/ports/print/cups-base/work/cups-1.4.2/scheduler/client.c:3217: undefined reference to `_httpReadGNUTLS'
client.o(.text+0x234e):/usr/ports/print/cups-base/work/cups-1.4.2/scheduler/client.c:3218: undefined reference to `_httpWriteGNUTLS'
gmake[1]: *** [cupsd] エラー 1
gmake[1]: ディレクトリ `/usr/ports/print/cups-base/work/cups-1.4.2/scheduler' から出ます
gmake: *** [all] エラー 1
*** Error code 1

Stop in /usr/ports/print/cups-base.
*** Error code 1

Stop in /usr/ports/print/cups-base.
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portupgrade20091130-71145-r2vh1l-0 env UPGRADE_TOOL=portupgrade UPGRADE_PORT=cups-base-1.3.9_3 UPGRADE_PORT_VER=1.3.9_3 make
** Fix the problem and try again.
** Listing the failed packages (-:ignored / *:skipped / !:failed)
! print/cups-base (cups-base-1.3.9_3) (linker error)


他にも同様の問題が報告されていたり、既にsend-prされている(ports/141014)みたいなので、しばらく動向を見守るなり、対策が思いつく方はcommitしてみて下さい。どうもDBUSへの対応を切るといいみたいなんですが、それはgnomeで使うときに問題にならないんだろうか……?

で、終わっとく予定だったんですが、ついかっとなって調べた。正直おなかが空いている。

引っかかっている原因は、どうも
/usr/ports/print/cups-base/work/cups-1.4.2/cups/http.c
のコンパイルが行われていないせいなのではないか? という気がします。

というのは、上記ソースに _httpReadGNUTLS() が含まれているのですが、
/usr/ports/print/cups-base/ で make して止まったとき、
/usr/ports/print/cups-base/work/cups-1.4.2/cups/lib*
には _httpReadGNUTLS() が含まれていないのです。だからリンク時エラーが出てるんですね。

で、script を使って make 時のログを見てみたんですが、どうも http.c がコンパイルされていないようなんです。(何故?)

エラーで止まった状態で
/usr/ports/print/cups-base/work/cups-1.4.2/cups
まで下がり、 make testhttp を実行した後だと、
# grep _httpReadGNUTLS lib*
Binary file libcups.a matches
で無事 _httpReadGNUTLS() が含まれるようになります。このときのログにはちゃんと、

echo Compiling http.c...
Compiling http.c...
cc -Wall -Wno-format-y2k -fPIC -Os -g -fstack-protector -I.. -D_CUPS_SOURCE -I/
usr/local/include/avahi-compat-libdns_sd/ -I/usr/local/include -I/usr/local/incl
ude/avahi-compat-libdns_sd/ -O2 -fno-strict-aliasing -pipe -DLDAP_DEPRECATED -I
/usr/local/include/dbus-1.0 -I/usr/local/include/dbus-1.0/include -DDBUS_API_S
UBJECT_TO_CHANGE -I/usr/local/include -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
-D_THREAD_SAFE -D_REENTRANT -c http.c
echo Compiling http-addr.c...
Compiling http-addr.c...
cc -Wall -Wno-format-y2k -fPIC -Os -g -fstack-protector -I.. -D_CUPS_SOURCE -I/
usr/local/include/avahi-compat-libdns_sd/ -I/usr/local/include -I/usr/local/incl
ude/avahi-compat-libdns_sd/ -O2 -fno-strict-aliasing -pipe -DLDAP_DEPRECATED -I
/usr/local/include/dbus-1.0 -I/usr/local/include/dbus-1.0/include -DDBUS_API_S
UBJECT_TO_CHANGE -I/usr/local/include -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
-D_THREAD_SAFE -D_REENTRANT -c http-addr.c

といったようなログが残っています。ところが、ports で make したときにはこれが無い。

多分Makefileの違いなのだろうと思うんですが……なんでだろう?

追記:とりあえず解決? Makefileのほうで置き換えをしていたようです。こんな感じになおすとmakeが通るようになりました。


# diff -u print/cups-base/Makefile.orig print/cups-base/Makefile
--- print/cups-base/Makefile.orig 2009-12-01 22:53:29.000000000 +0900
+++ print/cups-base/Makefile 2009-12-01 22:56:09.000000000 +0900
@@ -261,7 +261,7 @@
${WRKSRC}/Makefile
.else
@${REINPLACE_CMD} \
- -e 's|cups filter backend|backend|' \
+ -e 's|cups filter backend|cups backend|' \
-e 's|$$.INSTALL_SCRIPT. cups-config|echo skip: cups-config|' \
-e 's|/usr/share|${PREFIX}/share|g' \
-e 's|installhdrs$$||' \


本家にも報告しておいたけど、合ってるのかな……?

2009年10月9日金曜日

page fault while in kernel mode ??

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

ハードディスクの全セクタ検査をやっている間、VMware Workstation で実験環境を作ってみたのですが、gmirrorしたディスクの上でzfsを動かすと、何故かリブートの度に gm0 のrebuildが走ってしまい、起動時にzfsプロセスがpage fault を起こす、という、GEOMなのかzfsなのかVMware Workstationなのか原因がはっきりしないトラブルに見舞われました。とりあえず記録。あやしいことをやっていることは確かなのです(^^;

環境:VMware Workstation 6.5.3 build-185404
ホストOS: Microsoft Windows Server 'Longhorn' Business 6.0.6002, Service Pack 2 (32bit)
ゲストOS: FreeBSD/amd64 8.0-RC1 (64bit)

やったこと:
仮想メモリ1536MBの仮想PCを作成。それに30GBの仮想ドライブを2台(da0, da1)作成し接続。
うち1台(da0)にFreeBSD/amd64 を "User" インストールする。
ただし、OSのインストールには10GB程度しか使わず、残り20GBは空けておく。
OSインストール終了後、FreeBSD ハンドブックを参考にしてgmirrorでミラーリングする。
(zfsを使うよう /boot/loader.conf や /etc/rc.conf を書き換えておく。)
ミラーリング出来たら、空き容量のある mirror/gm0s1 に見えるので、
# gpart add -b xxxxx -s xxxxxx -t freebsd-zfs
で空いてる部分を mirror/gm0s1g として作成する。
この mirror/gm0s1g を使って、zfsの領域を作成、適宜マウントする。
# zpool create tank mirror/gm0s1g
# zfs create tank/home
# zfs create tank/export
# zfs create tank/ulocal
# mkdir /home /export
# zfs set mountpoint=/home tank/home
# zfs set mountpoint=/export tank/export
# zfs set mountpoint=/usr/local tank/ulocal
# zfs set mountpoint=none tank

このあたりはいろいろなサイトに載っている普通の手順かと思います。
が、どういう訳かここで再起動すると、上記スクリーンショットのようなFatal errorが起きます。原因はよく分かりません。さて、実機でも同様なことが起こるのでしょうか……?

2009年10月8日木曜日

結局HDD障害だったようです。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
先日からatacontrolでRAID1が構築出来なかった件ですが、その後 gmirror に乗り換えてみたところ……


ad16: FAILURE - READ_DMA status=51 error=40 LBA=93492224
GEOM_MIRROR: Request failed (error=5). ad16[READ(offset=47868018688, length=131072)]
GEOM_MIRROR: Synchronization request failed (error=5). mirror/gm0[READ(offset=47868018688, length=131072)]

というわけで、どうやらHDD障害だったようです。

カーネルパニックを起こしたatacontrolと違い、こんなエラーがあってもmirrorを続けるgmirrorはすごいですね。しかしこれでは使えない。エラーがあると思われる領域は /usr にあり、/usr/src を展開しようとしたら、その作業が止まってしまいました。

ディスクがエラーで使えないと分かったら即座にOfflineにするatacontrolの振る舞いも理解出来るんですが、まさかその使えないディスクを元にして懸命にrebuildしてたとは思わなかったようです。

mhddでチェックしたところ、当該部分はUNCとしてXがついてました。ただ、mhddがError:として返してきた位置は 93492434 なんですが、atacontrolのときやgmirrorのときに返された値とは若干ずれてます。やはりHDDとしてダメだったというこなのでしょう。ディスク障害に備えて新品のHDDで環境を構築しようとしたら、その前段階でコケるとは。

ところでmhddのフルスキャン、1TBのディスクをチェックするのに3時間弱かかります。で、とりあえずチェックしないといけないHDDは3本。これは……また帰りが遅くなりそうです。

2009年10月7日水曜日

atacontrolでRAID1を作り直す→失敗してデータ消失?

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
先日PCを新調しました。
Intel Core i7-860 + GIGABYTE GA-P55-UD3R という新しめのハードに、FreeBSD/amd64 8.0-RC1 という挑戦的な仕様です。(dmesgは後日。)

で、実験がてら、ICH10Rの機能でRAID1を組み、一端FreeBSDをインストール。その後、ケーブルを抜いてみてRAID1をDEGRADEさせ、そこから復旧させようと思ったのですが……

ar0: WARNING - mirror protection lost. RAID1 array in DEGRADED mode
ar0: 953867MB status: DEGRADED
ar0: disk0 READY (master) using ad16 at ata8-master
ar0: disk1 DOWN no device found for this subdisk

起動時にこんな感じにメッセージが出ると、RAID1がおかしくなっている証拠。

# atacontrol status ar0
ar0: ATA RAID1 status: DEGRADED
subdisks:
0 ad16 ONLINE
1 ---- MISSING (←実際の障害の内容でここは書き換わると思います。)
# atacontrol list (ダメになったディスクがどのataチャンネルにあったか見る。)
ATA channel 9:
Master: no device present (抜いたディスクは本来ここにあった。)
Slave: no device present
# atacontrol detach ata9 (この例ではata9になる。) 
電源を切ってディスク交換。ホットスワップでもいいのかな?
# atacontrol attach ata9 (必要ないかも?)
Master: ad18 SATA revision 2.x
Slave: no device present
# atacontrol status ar0
ar0: ATA RAID1 status: DEGRADED
subdisks:
0 ad16 ONLINE
1 ---- MISSING (ないことになっている)
# atacontrol addspare ar0 ad18
# atacontrol status ar0
ar0: ATA RAID1 status: DEGRADED
subdisks:
0 ad16 ONLINE
1 ad18 SPARE  (スペア扱いになる)
# atacontrol rebuild ar0 (指示出しだけなので一瞬で終わる。)
# atacontrol status ar0
ar0: ATA RAID1 status: REBUILDING 0% completed
subdisks:
0 ad16 ONLINE
1 ad18 SPARE

この処理をマルチユーザモードでやっており、リビルド作業をインターネット経由で行っていました。リビルドコマンドを投入した後、viでちょっとしたスクリプトを書いていたところ、ファイルをセーブしたところでフリーズ。

コンソール画面を見ると、

......
g_vfs_done():ar0s1a[WRITE(offset=1348632576, length=16384)]error = 5
g_vfs_done():ar0s1a[WRITE(offset=1348698112, length=16384)]error = 5
g_vfs_done():ar0s1a[WRITE(offset=1541259264, length=16384)]error = 5
g_vfs_done():ar0s1a[WRITE(offset=2311831552, length=16384)]error = 5
g_vfs_done():ar0s1a[WRITE(offset=2697117696, length=16384)]error = 5
g_vfs_done():ar0s1a[WRITE(offset=3082403840, length=16384)]error = 5
panic: initiate_write_inodeblock_ufs2: already started
g_vfs_done():cpuid = 0
ar0s1d[WRITE(offset=65536, length=2048)]Uptime: error = 5
47m24s
Cannot dump. Device not defined or unavailable.
Automatic reboot in 15 seconds - press a key on the console to about

落ちてました。リビルドはシングルユーザモードでやったほうがいいということでしょうか。

で、もう一度RAID1を構成しなおしOSを入れ、今度はシングルユーザモードで試してみました。

# zfs umount -a   (zfsのほうからマウント解除)
# umount -a     (ufsのほうをマウント解除)
# atacontrol detach ata9
# atacontrol attach ata9 (意図的にDEGRADEさせる)
# atacontrol addspare ar0 ad18
# atacontrol rebuild ar0
(とここまでは手順通り)
# echo "ttt" >> /test.txt
# echo "ttt" >> /test.txt   つい魔が差してやってしまった。
# echo "ttt" >> /test.txt
# sync
# atacontrol status ar0
ar0; ATA RAID1 status: REBUILDING 1% completed
subdisks:
0 ad16 ONLINE
1 ad18 SPARE
# (放置後数分経過)
ad16: FAILURE - READ_DMA status=51 error=40 LBA=93492352
ar0: FAILURE - RAID1 array broken
ad18: WARNING - WRITE_DMA taskqueue timeout - completing request directly
atacontrol: read: Input/Output error
WARNING - WRITE_DMA48 freeing taskqueue zombie request
リビルドに失敗してBROKEN扱いです……

なお、困ったことに、こうなってから再起動した後で、BIOSのRAID調整メニューから見たときドライブが Offline Member になっていると、RAID1は破損。リビルドは絶望的なようです。再マウントしてデータを取り出せるかどうかは分かりません。あまりに危険な状況なので、もし試される場合はお手元の余りHDDでお試し下さい。

次こそは悪戯せずにrebuildに挑戦…と思いましたが、台風が近いので帰ることにします。

2009年10月6日火曜日

続:FreeBSDのdump -Lってzfsに対応してますか?

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
昨晩書いた話の続きなんですが、一晩よく寝て改めて確認してみたら、いくつか勘違いしていることに気づきました。話を整理しましょう。

まず、dumpは伝統的に ファイルシステム単位でバックアップするものであり、tarやrsyncなどのようなファイル単位でのバックアップツールではないこと。
よって、ファイルシステムが異なる場合は、それに対応するダンプ用のコマンドを用いるのが適切であること。例えばSolarisであればufsdump/ufsrestoreという名前になっている。

zfs send は snapshotをダンプするコマンドであること。よってdump -Lとは扱いが異なる(バックアップ前に手動でsnapshotを作る作業が必要?)。dumpと同様に標準出力やファイルへの書き込みが可能なので、バックアップ先のファイルシステムは問わない。ただしFreeBSD 8.0RC1のマニュアルには
The format of the stream is evolving. No backwards compatibility is
guaranteed. You may not be able to receive your streams on future
versions of ZFS.
などと書いてあるのでOSのメジャーアップデートの際は気をつけましょう。

実際のところ、FreeBSDのdumpはzfsに対応していません。FreeBSD/amd64 8.0-RC1で実行しようとすると。

# df /home
Filesystem 1K-blocks Used Avail Capacity Mounted on
zfstank/home 850525952 58368 850467584 0% /home
basil# dump -0aLu -f /backup/home-amd64-091006.zfsdump /home
DUMP: WARNING: Cannot use -L on an unmounted filesystem.
dump: /home: unknown file system
という結果となりました。そりゃ、そうか。素直に zfs sendを使いましょう。

何故dumpにこだわるのかというと、FreeBSDにはchflags (Linuxで言うとchattr)で調整できる拡張ファイル属性があり、これがバックアップ作業に影響することがあるため。例えばrsyncなどでうまく処理出来なかったりします。

というわけで、先日のエントリで無知を晒したわけですが、いつものことなので気にしない分からなくなったらとりあえず寝てから整理する、というのは重要ですね、ということで。

debian/ubuntuでは dump パッケージを導入します。それでも ext2/3 までの対応で、snapshotを取ってダンプする機能があるようには見えませんでした。FreeBSD dump でufs2をダンプしたものを Linux restore でext2/3に移動出来るかは分かりません。他のファイルシステムについては、ext4についてはdump/restore可xfsはxfsdump/xfsrestoreがある、btrfsはよく分かりません。開発中?

2009年10月5日月曜日

FreeBSD の dump -L ってzfsに対応してますか?

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
職場PCを新調する機会があり、HDDを増設し、FreeBSD 8.0-RC1 を導入しました。

もののついでに、ちょっとバックアップ体制について見直したのですが、最近は dump(8) に -L オプションなるものがついていて、これを実行すると、丁寧にも一端スナップショットを取得してからdumpする、という振る舞いを見せます。つまりシングルユーザモードに落ちなくても稼働中にdumpが出来るというわけです。これはかなり便利。

ところが、このスナップショットを取得する部分が、ファイルシステムが巨大(100GB以上?)になると途端に処理が重くなります。どうも、ufs2のスナップショットを取得する /sbin/mksnap_ffs に原因があるようです。

http://www.freebsd.org/cgi/query-pr.cgi?pr=111782
600GBくらいのファイルシステムを-Lでダンプしようとするとおかしくなる?(6.x系列)
mksnap_ffs time
シリンダグループの数が多すぎると遅くなる、らしい。

そこで、最近流行の zfs に乗り換えれば、もしかしたらスナップショットの取得も早くなり、dumpも気軽に出来るのかな、と思ったのですが、ここでふと疑問。dumpオプションの-Lは zfs に対応しているのでしょうか?

(バックアップ元のファイルシステムが zfs であるときに、バックアップ先のHDDもzfsにして、zfs send/receive を使うのが筋としては適切、というのは分かるのですが、バックアップ先のHDDがzfsではない、とか、実は未だにテープを愛用している、とか、dump系のシェルスクリプトを書き直すのがちょっとなあ……等といった状況を想定しています。)

dump(8) は -L オプションが実行されると、スナップショットを取得するコマンドを用いるのですが、コードを見ると……
http://www.freebsd.org/cgi/cvsweb.cgi/src/sbin/dump/main.c?rev=1.67.2.1;content-type=text%2Fplain

char snapname[BUFSIZ], snapcmd[BUFSIZ];

snprintf(snapname, sizeof snapname, "%s/.snap", mntpt);
if ((stat(snapname, &sb) < 0) || !S_ISDIR(sb.st_mode)) {
msg("WARNING: %s %s\n",
"-L requested but snapshot location",
snapname);
msg(" %s: %s\n",
"is not a directory",
"dump downgraded, -L ignored");
snapdump = 0;
} else {
snprintf(snapname, sizeof snapname,
"%s/.snap/dump_snapshot", mntpt);
snprintf(snapcmd, sizeof snapcmd, "%s %s %s",
_PATH_MKSNAP_FFS, mntpt, snapname);
unlink(snapname);
if (system(snapcmd) != 0)
errx(X_STARTUP, "Cannot create %s: %s\n",
snapname, strerror(errno));
if ((diskfd = open(snapname, O_RDONLY)) < 0) {
unlink(snapname);
errx(X_STARTUP, "Cannot open %s: %s\n",
snapname, strerror(errno));
}
unlink(snapname);
if (fstat(diskfd, &sb) != 0)
err(X_STARTUP, "%s: stat", snapname);
spcl.c_date = _time_to_time64(sb.st_mtime);
}

ここでスナップショットを取得するコマンドが _PATH_MKSNAP_FFSとして定義されているようです。これ、どこにあるのかというと…
http://www.freebsd.org/cgi/cvsweb.cgi/src/include/paths.h?rev=1.28.2.1;content-type=text%2Fplain

#define _PATH_MKSNAP_FFS "/sbin/mksnap_ffs"

これ。で、このソースを見ると、
http://www.freebsd.org/cgi/cvsweb.cgi/src/sbin/mksnap_ffs/mksnap_ffs.c?rev=1.10.2.1;content-type=text%2Fplain

読み切れませんでしたorz

とりあえず、zfsだからといって zfs snapshot を使っているようにも見えず、正直よく分からないのですが、さて、zfsのファイルシステムを dump -L でダンプすることは出来るのでしょうか? それとも、zfsだと実はわざわざスナップショットを取る必要がない、とか?

追記:後日談を書きました。

2009年9月16日水曜日

電子情報通信学会関連研究会の話題を気軽にtwitterで語るために

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
twitterのハッシュタグになりそうな名前を提案してみようという企み。使われるかどうかはまあ、おいといて。「信学会」で検索するのが早いとは思うのですが……
(参考: http://www.ieice.org/eng/event_e.html )

#IEICE_GC 総合大会。IEICE General Conference
#IEICE_SC ソサイエティ大会。IEICE Society Conference
#IEICE_WBS たとえばとして、私がよく行くワイドバンドシステム研究会の例。IEICEの各種研究会は基本的に略記を持つので後ろにそれをつければいい、はず。

twitterのような、発言鮮度?がはっきりしてるツールでは、ハッシュタグに2009とかつける必要はないのかな、と思います。長くなるし2文字か4文字かでまたぶれそうだし。

多分ソサイエティごとに話を切り分けたくなると思うんですが、そこは敢えてハッシュタグを_GCAとかで分けるのではなく、発言中にA-nnとかB-mmなどとして混ぜるほうがよろしいかと思います。大会の話題はなるべく大きく盛り上がるのが大事かなと。

諸般の事情でソサイエティ大会に参加出来ない代わりに、そんなことを思いついたのですが、いかがでしょう?

多分、情報処理学会や電気学会などでも、同様にタグを整理することは出来ると思いますが、私はあまり参加してないので、もう少し詳しい方にお願いしたいです。

ちなみに、個人的にこれどうなの?というのが一つあって……
●平成xx年度 電気・情報関連学会中国支部第n回連合大会
CDや冊子の表紙などを見ると、"rentai20xx" とかが英字略称みたいです。も、もうちょっと何とかならなかったのか……?

(なお、元からさほど発言数が多くない、という本質的な問題については棚上げということで。)

2009年7月21日火曜日

オープンラボ岡山に行きそびれまして…

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
オープンラボ岡山の話を少々。行きそびれてしまいましたので、ちょっとインターネットで後日談などを収集してみようかと思います。とはいえ検索しただけなのですが…

■公式ページはこちら。
http://openlab.okaya.ma/
毎月開催になったようです。次回は8月8日(土)とのこと。
■オープンラボ岡山1回目終了(T-1000さん)
http://hobby.txt-nifty.com/t1000/2009/07/post-1e47.html
参加者は15人とのこと。メタ的な会合としては順調な滑り出しかと思います。
■オープンラボ岡山に行ってきた。(英吉さん)
http://d.hatena.ne.jp/LuckOfWise/20090721/1248183282
Androidをお使いみたいです。実機デモがおもしろそうですね。

オープンセミナーと違い、広く人が集まり、それが広くまたネットで話題になる、というものとは少々違った趣のようなので、興味があれば何より参加したほうがいいみたいです。

2009年7月10日金曜日

『オープンラボ岡山』始動とのこと。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
『オープンラボ岡山』というイベントが開催されるようです。以下抜粋。

オープンラボ岡山とは、岡山周辺の技術者のための勉強会プラットフォームとして、勉強会や読書会の場を提供するための組織です。
勉強会や読書会を開催したい方、参加したい方が簡単に集まることの出来る場にしたいと考えています。
運営委員は全員ボランティアで、それぞれが勉強会や読書会の主催者でもあります。
興味のある方は是非とも一緒にやりましょう。
現在勉強会などで動いている方が中心となって話をされるようですね。岡山近郊にいらっしゃる方で、オープンソースおよび周辺技術に興味があるかたは是非参加されてみてはと思います。

個人的にちょこっと調べたんですが、Windows関連の勉強会なども、岡山では開かれているみたいなので、こういうとことで緩く連携出来ればよろしいのではないでしょうか。勉強会全部に参加する時間はないんだけど……なんて人にも、うってつけなのかもしれません。

第一回は2009年7月18日(土)13:00-18:00で、
会場は下図にある『きらめきプラザ』です。岡山市中心部に近いですね


より大きな地図で ちょっと人に見せるときに使う地図 を表示

2009年6月8日月曜日

オープンセミナー2009@岡山に参加

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
先週のことなのですが、オープンセミナー2009@岡山のライトニングトークに出させていただきました。

情報通信工学科の演習室で Debian GNU/Linux が動いている3つ(くらい)の理由』とまあ、なんだかblogの記事みたいなタイトルなのですが、後から公開資料を読んでも分かるように作りました(プレゼンの絞り込みが間に合わなかった)ので、ご笑覧いただければ幸いです。演習室ひとつとっても、結構喋る内容があるもんなんだな、と、改めて確認出来たことが私にとっては大きな成果でした。

実はLT自体初めてで、5分というのは大変難しいものだなと思いました。次回があるのかどうか分かりませんが、次はもうちょっと内容を絞り込んで臨みたいと思います。

参加いただいた皆様、開催にあたり活動された皆様、お世話になりました。
またよろしくお願いします。

2009年5月14日木曜日

Lingrの話

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Lingr という、リアルタイムチャットを提供するサービスがあります、が、近々終了することになりました。実は職場関係のコミュニケーションツールに使ってみようかな、と思っていた矢先の出来事で、残念だなあと思うことしきり。間もなく終わってしまうサービスの利用例を今更書くのもどうかと思ったのですが、いずれどこかで復活してくれることを願い、ちょっと書いてみようと思います。

私はプライベートモードの部屋を作り、例えばこんなふうに使ってました。

●同じPCサーバを使っているユーザとの会話
同じサーバにログインしているユーザからメールが来て相談に乗っていたとき、サーバ上で talk を使おうとしたのですが、相手が大変やりづらそうだったのでLingrで部屋を作り、URLだけ talk で投げました。リアルタイムでの応答と、様々な試行(なにせテキストなんでターミナルから動作結果をコピペするだけで済む)が大変円滑に出来、感動したのを覚えています。しかも後から過去ログを確認出来るところが、作業記録などを起こすときに便利でした。

●メッセンジャーアプリの利用度がばらばらな人々との話し合い

SNSの知り合いなどと、急遽リアルタイムで話し合いをすることになった際に、自分や相手がメッセンジャーを使えない/メッセンジャーサービスがバラバラ、という状況のときに重宝しました。これも、特定メンバーにアナウンスメッセージを送りURL一つで参加してもらえること、メンバーが多様な環境にあってもWWWにさえアクセス出来ればなんとかなること、話し合いが数日にわたっても簡単に前回のおさらいが出来ること、インターフェースがわかりやすく初見でも使いやすいと好評だった(ただし英語アレルギーな人はちょっと戸惑っていた)ことなどが良かったです。

これらとは別に、私のようにプライベートな使い方ではなく、技術談義や、勉強会実況などに使っている例があったかと思います。

結局のところ、私が特にLingrで便利に思っていたのは、
  1. チャットルームへのアクセスのしやすさ(URL一つでOK)
  2. 過去ログの見やすさ、たどりやすさ(これもURLの構成が秀逸)
  3. チャット参加の容易さ(ブラウザ1つでOK、アカウント不要)
  4. 容易に作成出来るチャットルーム(プライベート化など適宜アクセスコントロール出来る)
  5. リアルタイム性を損なわない、ライブ感のあふれるインターフェースと動き
といった部分。確かに個々の要素に注目すれば、IRCやメッセンジャー、BBS、ときにtwitterのような見え方もするのですが、実際に使ってみると、これらが融合したことによる便利さが際立っていたサービスだったと思います。(気軽さ、アプリケーションとしての利用のしやすさが優れていたからこそ、あやしい使われ方をするようになっちゃったのかもしれません。)

テキストベースでリアルタイムコミュニケーションを図るためのツールとして、そしてそれを簡素な形でアーカイブし公開するサービスとして、傑出した出来だったと思います。いずれ、独自にイントラネットで使えるサーバソフトとして、あるいは、例えばOpenPNEやCMSなどに組み込み可能なサービスとして提供されたりしたらうれしいですね。

2009年5月12日火曜日

Optionsの怪

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
FreeBSD portsからアプリケーションをインストールしようとして、時折困ることがあります。というのは『make時のオプションの意味がわからない』こと。インストールしようとするアプリケーションの知識が中途半端な時『何故このオプションがあるのだろう?』というのが分からなかったりするのです。

そんな状態でports使ってアプリケーション入れたら危険だろう、とか、いろいろあることは分かっているのですが……

例えばsubversionだとこんな感じ。

│ Options for subversion 1.6.2  │
│ ┌────────────────────────────────┐ │
│ │ [ ] MOD_DAV_SVN mod_dav_svn module for Apache 2.X │ │
│ │ [ ] APACHE2_APR Use APR from Apache 2.X │ │
│ │ [ ] MOD_DONTDOTHAT mod_dontdothat for Apache 2.X │ │
│ │ [X] NEON WebDAV/Delta-V repo access module (neon) │ │
│ │ [ ] SERF WebDAV/Delta-V repo access module (serf) │ │
│ │ [ ] SASL SASL2 authorization support │ │
│ │ [X] BDB db4 repository backend │ │
│ │ [ ] ASVN Build and install Archive SVN (asvn) │ │
│ │ [ ] MAINTAINER_DEBUG Build debug version │ │
│ │ [ ] SVNSERVE_WRAPPER Enable svnserve wrapper │ │
│ │ [ ] STATIC Build static version (no shared libs) │ │
│ │ [X] BOOK Install the Subversion Book │ │

これ"だけ"を見て全部のオプションが何を意図していて、何故必要か分かりますか?

こういうときは、Makefile をきちんと読んで、オプションの有無でmakeがどのような動きをするのかを追いかける、というのが、多分正しい手順なんだろうと思います。が、時々これがきついなあと思うことがあるのです。歳だから?とか言わない。

make configの画面だけ切り出して、wikiみたいなところでオプションの解説してくれるようなサービスとかがあったら面白いのかなあ。どうなのかなあ。portsメンテナさんの仕事が増えるだけでしょうか。

ぱっと見でオプションが多くなる理由は、多分なんですが、
・関連するアプリと連携を取る必要があると増える
・OS固有の環境に合わせようとすると増える
・portsメンテナのサービス精神で増える?
みたいなところがあるのかな、と思っています。このあたり、他のOSではどういうふうに対処してるんでしょう。binary packageになってしまっているから、この辺の問題はあまり見えなくなっちゃってるんでしょうかね。

たまにはこういう雑感を書いてみるのもいいかと思い、メモしてみる次第です。

2009年5月11日月曜日

オープンセミナー2009@岡山

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
オープンセミナー2009@岡山、なるオープンソース&コミュニティ関係のイベントが開催されます。土曜日です。

オープンセミナー2009@岡山 http://os2009.okaya.ma/
日時
2009年5月30日 10:00 - 17:00(11:45から13:00は昼食会)

開催場所
岡山県立大学学部共通棟(南)8206室


内容はまだ未定の部分もいくつかありますが、基本的に講師陣のカラーがよく出ている内容となっている様子。午前中はライトニングトーク9本、後半は50分モノの講演会が4本と、なかなかの分量があるようです。詳しくはプログラムを参照してみて下さい。

中四国圏でオープンソース界隈のイベントに興味のある方、学生社会人問わず、是非ご参加下さいませ。JR最寄り駅から徒歩3分という好立地。高速道路のICもとても近いのでお車での来場もOK。ただしおやつは持参が望ましいと思います。


より大きな地図で ちょっと人に見せるときに使う地図 を表示

2009年4月24日金曜日

portupgradeがダメなときは基本に戻ろうという話。

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
忘れそうになるのでとりあえずメモ。

FreeBSD portsにある rtorrent を portupgrade で更新しようと思ったのですが、net/xmlrpc-c-devel のコンパイルに失敗しているようで……

cc -o xmlrpc xmlrpc.o srcdir/tools/lib/dumpvalue.o /usr/ports/net/xmlrpc-c-devel/work/xmlrpc-c-1.18.00/lib/util/casprintf.o /usr/ports/net/xmlrpc-c-devel/work/xmlrpc-c-1.18.00/lib/util/cmdline_parser.o /usr/ports/net/xmlrpc-c-devel/work/xmlrpc-c-1.18.00/lib/util/getoptx.o /usr/ports/net/xmlrpc-c-devel/work/xmlrpc-c-1.18.00/lib/util/stripcaseeq.o /usr/ports/net/xmlrpc-c-devel/work/xmlrpc-c-1.18.00/lib/util/string_parser.o -Lblddir/src -Lblddir/lib/libutil -lxmlrpc_client -lxmlrpc -lxmlrpc_util -L/usr/local/lib -lwwwxml -lxmltok -lxmlparse -lwwwzip -lwwwssl -lwwwinit -lwwwapp -lwwwhtml -lwwwtelnet -lwwwnews -lwwwhttp -lwwwmime -lwwwgopher -lwwwftp -lwwwfile -lwwwdir -lwwwcache -lwwwstream -lwwwmux -lwwwtrans -lwwwcore -lwwwutils -lmd5 -lz -L/usr/lib -lssl -lcrypto -L/usr/local/lib -lcurl -rpath=/usr/lib:/usr/local/lib -L/usr/local/lib -L/usr/local/lib -lidn -lssh2 -lssl -lcrypto -lz -L/usr/ports/net/xmlrpc-c-devel/work/xmlrpc-c-1.18.00/lib/expat/xmlparse -lxmlrpc_xmlparse -L/usr/ports/net/xmlrpc-c-devel/work/xmlrpc-c-1.18.00/lib/expat/xmltok -lxmlrpc_xmltok
/usr/bin/ld: warning: libxmlrpc.so.14, needed by blddir/src/libxmlrpc_client.so, may conflict with libxmlrpc.so.3
blddir/src/libxmlrpc.so: undefined reference to `xmlrpc_XML_GetErrorString'
gmake[2]: *** [xmlrpc] エラー 1
gmake[2]: ディレクトリ `/usr/ports/net/xmlrpc-c-devel/work/xmlrpc-c-1.18.00/tools/xmlrpc' から出ます
gmake[1]: *** [xmlrpc/all] エラー 2
gmake[1]: ディレクトリ `/usr/ports/net/xmlrpc-c-devel/work/xmlrpc-c-1.18.00/tools' から出ます
gmake: *** [tools/all] エラー 2

こんな感じで止まります。ちなみに構築環境とMakefileのリビジョンは以下の通り。

# uname -mirs
FreeBSD 7.1-RELEASE-p5 i386 GENERIC
# grep '$FreeBSD:' Makefile
# $FreeBSD: ports/net/xmlrpc-c-devel/Makefile,v 1.38 2009/04/10 18:12:05 chinsan Exp $

ログを見てみると、既に入っている過去バージョンの libxmlrpc.so.3 が衝突している様子。(ldの優先順位が悪いんじゃあ…?) portupgrade は upgrade するときに対象をアンインストールせずに build するようです(?)。

で、ちょっと基本に立ち返ってみたら、あっさり解決しました。

# cd net/xmlrpc-c-devel
# make deinstall
(ここで依存しているパッケージの一覧が警告として出ます。)
# make
(今度はエラーなくbuild出来たようです)
# make install

その後、改めて portupgrade -rf rtorrent を実行すると、今度はうまくいきました。

buildするときに過去のパッケージがあると不都合が起きる、というのは意外だったのですが、こういうものなのでしょうか。ちょっと原因がはっきりしないので、エラーとして報告するのもどうかと思い、とりあえず書いておく次第です。

2009年3月25日水曜日

chrome + rep2 -> bad request?

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Digest認証をかけている自宅サーバのrep2に対して chrome からアクセスすると、
Digest認証は通るみたいなんですが、rep2の認証を終えたあとに、bad requestになってしまいます。
accessとerrorのログはこんな感じ。

[Wed Mar 18 06:14:20 2009] [error] [client 127.0.0.1] Digest: uri mismatch - </~pppppp/rep2/> does not match request-uri </~pppppp/rep2/?guid=ON>, referer: http://localhost:8931/~pppppp/rep2/

localhost - - [18/Mar/2009:06:14:20 +0900] "POST /~pppppp/rep2/?guid=ON HTTP/1.1" 401 401 "http://localhost:8931/~pppppp/rep2/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19"
localhost - p2user [18/Mar/2009:06:14:20 +0900] "POST /~pppppp/rep2/?guid=ON HTTP/1.1" 400 226 "http://localhost:831/~pppppp/rep2/" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.19 (KHTML, like Gecko) Chrome/1.0.154.48 Safari/525.19"

(ログに> < で括られてるのが入るとblogに転載し辛いなあ…)

digest bad request で検索すると……
ただし、IE6 では Digest 認証を使って foo.cgi?FOO=BAR のような URL にリクエストすると、 誤ったリクエストを送ってしまうバグがあります。 以下の URL は Mozilla や FireFox では正しく閲覧できますが、IE6 だと正しいユーザ名・パスワードを送信しても、 400 Bad Request になってしまいます (Windows XP SP2 + IE6 で確認)。

なお、IE7 ではこのバグは修正されています。

http://x68000.q-e-d.net/~68user/net/http-auth-2.html

これかな?確かにIE7なら問題なく表示できたので、同じような設定をchromeに対して設定してみると・・・?


#(.htaccess に以下の文を追加)
BrowserMatch "Chrome" AuthDigestEnableQueryStringHack=On


正しく表示されるようになりました。めでたしめでたし。

余談:そこで検索キーワードにchromeを入れなかったのが悪い。
http://blog.recyclebin.jp/archives/239
http://blog.makotokw.com/2008/09/08/google_chromedigest/
http://groups.google.com/group/google-chrome-help-jp-report-a-bug/browse_thread/thread/fe1280ecd27db0b0?pli=1


なぬ、--new-httpオプションとな?

2009年3月11日水曜日

unixbench 4.1.0 で Shell Scripts の結果がおかしくなる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Core i7搭載のPC ( パソコン工房 WS7000L ) が届いたので、計算用に Debian(lenny) の amd64 版をインストールしてみました。もともとUbuntuの動作確認がとれているものなのですが、流石最新版、あっけなくインストール終了、問題なく稼働中。

ところが、ちょっと計算速度でも見てみようかと思い unixbench をコンパイルして実行させたところ、Shell Scripts の結果がおかしい。infなどという値になります。(このへんちょっとうろ覚え。)

調べてみると、どうも pgms/tst.sh のシェルスクリプトで sort +1 という古いオプションを利用しているせいらしく。logを見ると +1 : No such file or directory ってそりゃそうですねえ。ここは sort -k 2 にしておくのがよさそう。

というわけで修正をしてみました。
ついでに、すぐ make & Run できるよう Makefile のデフォルトを調整して。
あと Run の環境変数は C にしておくと、もしかしたら想定の動きなのかなー?と思ったので足してみた次第。LANG=C ./Run が正しいのかもしれません。

あとはコンパイラが警告を出しているのがちょっと気になるんだけど、まあとりあえずってことで。


diff -urN unixbench-4.1.0.orig/Makefile unixbench-4.1.0/Makefile
--- unixbench-4.1.0.orig/Makefile 1999-07-29 07:05:02.000000000 +0900
+++ unixbench-4.1.0/Makefile 2009-03-11 23:36:15.000000000 +0900
@@ -44,10 +44,10 @@
# -m386 -malign-loops=1 -malign-jumps=1 -malign-functions=1

## For Solaris 2, or general-purpose GCC 2.7.x
-OPTON = -O2 -fomit-frame-pointer -fforce-addr -fforce-mem -ffast-math -Wall
+# OPTON = -O2 -fomit-frame-pointer -fforce-addr -fforce-mem -ffast-math -Wall

## Very generic
-#OPTON = -O
+OPTON = -O

## For Digital Unix v4.x, with DEC cc v5.x
#OPTON = -O4
diff -urN unixbench-4.1.0.orig/Run unixbench-4.1.0/Run
--- unixbench-4.1.0.orig/Run 1999-07-29 07:04:47.000000000 +0900
+++ unixbench-4.1.0/Run 2009-03-11 23:34:26.000000000 +0900
@@ -1,6 +1,7 @@
#! /bin/sh
#
#################### set your defaults here ##############
+LANG=C ; export LANG
#FLAVOR= # flavor of UNIX: if not determined by script: SysV or BSD
FULL_SUITE="dhry2reg whetstone-double syscall pipe context1 spawn execl \
fstime fsbuffer fsdisk shell short int long float double arithoh \
diff -urN unixbench-4.1.0.orig/pgms/tst.sh unixbench-4.1.0/pgms/tst.sh
--- unixbench-4.1.0.orig/pgms/tst.sh 1995-11-28 02:07:03.000000000 +0900
+++ unixbench-4.1.0/pgms/tst.sh 2009-03-11 23:35:22.000000000 +0900
@@ -15,6 +15,6 @@
###############################################################################
ID="@(#)tst.sh:3.4 -- 5/15/91 19:30:24";
sort >sort.$$ -od sort.$$ | sort -n +1 > od.$$
+od sort.$$ | sort -n -k 2 > od.$$
grep the sort.$$ | tee grep.$$ | wc > wc.$$
rm sort.$$ grep.$$ od.$$ wc.$$


お手元の sort コマンドが + オプションを受け付けないときにどうぞ。お急ぎのかたは pgms/tst.sh だけ直せばOK。
sort --version してみて 6.10 だとダメなようです。
FreeBSDの sort は 5.3.0-20040812-FreeBSD というわけでちょっと古く、+ オプションへの対応が残っていたみたいですね。

ベンチマーク結果は後ほど。

追記、_POSIX2_VERSION=199209 のようにPOSIX準拠のための変数を定めておくのもひとつの方法のようです。unixbenchは古いプログラムなので、こういうところに気を遣うものなんですね。

追記2 いま times のログを見たら warning だの Bad address だのが出ていて、もしかしたらもうちょっと修正しないといけないのかも……? そのうち大幅書き直しかもしれません。

2009年3月6日金曜日

FreeBSDをbittorrentでダウンロードする話(今更?)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
FreeBSD bittorrent で検索しても最近の話があまり上位に出てこないので、ちょっとだけ。
FreeBSD 7.1-RELEASE と 6.4-RELEASE についてですが、現在のところ正式に bittorrent でダウンロード出来るような体制が出来ています。

BitTorrent

7.1-RELEASE ISOs are available via BitTorrent. A collection of torrent files to download the images is available at:

http://torrents.freebsd.org:8080

http://www.freebsd.org/releases/7.1R/announce.html

FreeBSDでの詳しいダウンロード方法などについては otsune さんが書かれた記事が参考になりますね。
http://www.otsune.com/bsd/ports/bittorrent.html

個人的にハマった経験から、 portsで新しいアプリケーションに追従させる予定があるのなら、OSインストール時にpackagesを使わないほうがよいだろう、と思います。特にX関連。OSがリリースされた時のpackagesは、最新のportsからはだいぶ離れてしまっているので、整合性を取りづらてあまりいい思い出がないのです……

というわけで、全ファイルダウンロードするよりは -bootonly を焼いて基本ファイルのみをネットワークインストール、か、disk1だけで充分なのかもしれません。

2009年2月28日土曜日

設定ファイルをrcsで管理するための細かい話

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

個人で使っているFreeBSD機において、/etcや/usr/local/etc などにある設定ファイルの変更履歴をrcsで記録するための、ざっくりとしたメモです。setenv RCSINIT -zLTは忘れないようにしたい。あとemacs。お好みでvim+rcs-menu.vimなど。

新しい設定を書き起こすとき

設定ファイルのパーミッションに厳しいプログラムを使うことがあったのですが、rcsやcvsなどではファイルのパーミッションを保存しておくのが難しいのです。しかもどんな設定にすればいいのか忘れやすい。そこで、rcsでファイルを初めてチェックインするときに、log ではなく、description という、ファイルの説明メッセージを書く部分にメモします。意図が違うとかはまあおいといて、どうすればいいかというと……( /usr/local/etc/target.conf を例にする。)

# cd /usr/local/etc/
# mkdir RCS (ない場合は作るべき。後述。)
# ls -l target.conf | ci -i -l target.conf (これでパーミッション情報をメモする。)
# rcs -U target.conf

わざわざRCSディレクトリを作るのは、 find / -not -path '/usr/home/*' -name RCS -type d で探しやすくするため。

ファイルを変更した際には ci -l でチェックインします。-lを忘れるとチェックインしたときにファイルが消えてしまうので注意。

ls の引数と ci の引数に同じファイル名を二度打ちしないといけないところがいまいちかも。
パイプなど使わなくても、ci -i 時のインタラクティブ入力で、ls -lの結果をターミナル窓でコピペしてもOK。情報を残しておくということが重要なのだろうと思います。

何故cvs, subversion, gitではなく rcs なのか?

  • FreeBSDに標準で入っているから
  • 単に使い慣れているから
  • パスワード系のファイルも取り扱う /etc の下を丸ごとリポジトリにコピーしてしまうのはあまりよくないかなと思ったから(多分対処法はある……んじゃないかな?)

rootのままチェックインだのなんだのすることに対する抵抗感はsudoなどで払拭できるか?(未確認)

バックアップは?

設定ファイルが散逸してしまうことは間違いないので、RCSディレクトリをこまめに探しておいて保存するしかないかも?

複数台の設定を管理するノウハウはまた別にあると思いますが、それはまた別の機会に。



追記:linuxでお使いの場合は rcs を導入すれば同じような対応でOKのはず。例えば debian 系 ( ubuntu など ) であれば apt-get install rcs すればよいです。

2009年2月23日月曜日

続・はてブのはてブの果て

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

まさかこの記事の続きを書くことになろうとは思わなかったのですが……

数ヶ月前にちょっとした思いつきで『はてブのはてブ』を試してみたことをちょこっと書いたのですが、どうもこれは『メタブックマーク』と呼ばれるテクニックのようです。
そんでもってさらに、これの度を超した使い方というのが……

いったい何事?こんなの初めて見た。

ファンタスティック・はてぶタワー
http://d.hatena.ne.jp/next49/20090223/p1

多層構造っぽく見えることから、はてブ界隈の利用者の一部が上だの下だのと大騒ぎしているようですが、なんだか素朴に、情報が散逸しやすい煩雑な機能になっているなあという感想を抱いたのでした。


このあいだ、URLの正規化に関する記事を読んだのですが、もしかしたらこういう多層化はURLの正規化と搦めれば解消できる問題なんでしょうか。そこまでしていいものなのかどうか、よく分かりませんけど……