Visual Studio 2005を買いました。Academic Editionなのですが、今のところ学生証を送れとか言われません。アクティベーションもなかったように思いますが、何日か経ったら言われるのかなあ?
榮樂氏より、新治村はかすみがうら市ではなく、土浦市との指摘がありました。ご指摘にあわせ 2006年5月20日の日記は訂正しました。ありがとうございます。
フリーフォントの中でIPAゴシックは、抜群の品質なのですが、ビットマップフォント部分(9と12ポイント以外入ってない?)に弱点があって、どうも画面表示には適していないように思います。
ああ、アンチエイリアスなんていうボロボロの文字をボケさせて誤魔化す(MacとかMacとかMac)品質放棄技術はやめてください。ディスプレイのような低解像度だとうっとおしいです。
現在Linux上でMSゴシックを使っていますが、それに代わる画面表示用フォントは無いものかと探してみました。ビットマップフォントの有無ってなかなか書いていないので、唯一情報が得られ、値段も手頃だったNECのFontAvenueとCanonのFontGalleryを購入しました。
ところが使ってみると、一部で異常に字が小さくなったり、ポイント数の大きい字が崩れるなど、あまり芳しくありません。オープンソースには全く縁の無いはずのMSゴシックがもっとも綺麗に表示されるあたりが皮肉ですね。
開発者たちはフリーフォントなんて使ってなくてMSゴシックでデバッグしているとしか思えません。そんな邪推もしたくなるような結果です。
やはりMSゴシックを超えるものは無いのかなあ…。
常総市にあるきぬの湯に行きました。一回も行ったことないのに現地集合は厳しいっす。でも見たことあるような建物だったような気もします。これが既視感?
走っているときに青看板を見ていると、相次ぐ合併のせいか見慣れない地名が増えたなあと思いました。そういえば新しい市はなぜに平仮名?愚民は漢字も読めないとでも言いたいのか。以下、ひらがなの街の例。
データは都道府県市区町村からのものです。
筑波市、常陸那珂市、霞ヶ浦市、と書くことに何の問題が?ああ、つくばみらい市はどう書いても終わってるので、大人しく伊奈市に変更すべきだと思います。
夜はダーツの予定でしたが、取りやめて結城邸で飲み会をしました。ストリングチーズを齧って食ったら、そんなの邪道だって。ど、どう食べたって良いじゃないですか。
雨だったので車で研究学園まで行って、電車に乗り、ドコモミーティングへ向かいました。帰りはせっかく区間快速を待って乗ったのに、寝過ごしてつくば駅まで行っちゃって、向かいに居た区間快速で戻る羽目に。ああ、時間無駄にしたわー…。
TXは秋葉原で区間快速を待つより目の前の快速に乗ってつくば駅に行き、区間快速で1駅戻る方がスムーズかもしれません。でも完全にキセル行為なので、やらないほうが身のためかな。
帰りに研究室に寄ったら、川崎君が、Wine上でGyaoを見るんだと言って頑張っていました。果たして成功したのでしょうか?
セミナーで発表しました。結構あっさり終わってしまって、つくづくドコモへの出張で頑張っておいて良かったと思いました。
研究室内のネットワークをどうするかなど話し合いましたがあまりまとまりませんでした。以下、覚えている限りの議事録です。
研究室のゼミの後に、明日のシス情セミナーの発表練習を行いました。ドコモへ出張したとき、発表会で使った資料をかなり流用したので、それなりにまとまっております。勢いでそのネタを研究会に発表することになりました。う、頑張らねば。
研究室にあるマシン(IDE HDD 2台)でRAID 0を構成して測ったら、なんと書き込み64MB/s〜72MB/sという脅威の性能を発揮しております。
我が家のサーバの場合はUSB接続だから遅いのと、妙にCPUを食うのが気になるけど、廉価RAIDだしこんなもんかな?次回作では複数のUSBカードを使うことや、外付けSATA接続などが良さそうですね。
Xenepicは昨日の発見した引数のままで今日もログイン可能なようです。HanGameアカウントのパスワードに関係の無い数値なので、この数字が漏れたら一巻の終わりじゃね??うへーうへーうへー…。
榮樂氏に「benchってナニ?」って突っ込まれたので、補足。benchはwrite速度を測るプログラムです。Linux 2.6専用と書いてあるのは、2.4系のDirect I/O(O_DIRECT)のアライメント制限を考えて書いていないからです。
一応、手元のLinux 2.4で試したら ext2はOKなのにext3でコケるからおかしいと思ったら、どこかのMLでカーネルのバグなんじゃね?という記述が見受けられました。
ホントかいなと思ってカーネルのコード見たら、fs/ext3/inode.cではstruct address_space_operationsのdirect_IOメンバに値を入れないため、O_DIRECTを指定して読み書きしようとした時点で失敗しEINVALが返ります。
バグというより、元々ext3はO_DIRECT使っちゃ駄目みたい…。なぜかはわかりませんけど。
benchのソースコードを下に貼っておきました。ヘッダや、エラー処理は省略しております。
int main(int argc, char *argv[])
{
int fd;
size_t size, bufsize, wsize, pos;
unsigned char *lpalignbuf;
struct timeval tv_start, tv_end, tv_past;
char *lpc;
size_t i;
if (argc < 4) {
printf("usage: \nbench filename size bufsize\n");
return 0;
}
//サイズを得る
size = strtol(argv[2], &lpc, 10);
bufsize = strtol(argv[3], &lpc, 10);
//Direct I/Oモードでファイルを開く
fd = open(argv[1], O_RDWR | O_DIRECT);
lseek(fd, 0, SEEK_CUR);
//アラインメントをそろえたバッファを生成、乱数で埋める
posix_memalign((void **)&lpalignbuf, 512, bufsize);
for (i = 0; i < bufsize; i++)
lpalignbuf[i] = rand() % 256;
//測定を開始する
gettimeofday(&tv_start, NULL);
//乱数を書き込む
for (pos = 0; pos < size; ) {
//書き込むサイズ
if (size - pos < bufsize)
wsize = size - pos;
else
wsize = bufsize;
//書き込む
write(fd, lpalignbuf, wsize);
pos += wsize;
}
free(lpalignbuf);
close(fd);
//測定を終了する
gettimeofday(&tv_end, NULL);
tv_past.tv_sec = tv_end.tv_sec - tv_start.tv_sec;
tv_past.tv_usec = tv_end.tv_usec - tv_start.tv_usec;
while (tv_past.tv_usec < 0) {
tv_past.tv_usec += 1000000;
tv_past.tv_sec -= 1;
}
//結果表示する
printf("time: %13d.%6d[sec]\n"
"speed: %f[MB/s]\n",
tv_past.tv_sec, tv_past.tv_usec,
(double)size * 1000000 / (tv_past.tv_sec * 1000000 +
tv_past.tv_usec) / 1000000);
return 0;
}
5/9のスクリプトをシェルスクリプトにして、検索結果リストのムービーを保存できるようにしました。その際再生ページのタイトルをファイル名に使います。ファイル名がIDだとまるで意味がわからなくなるので。
落とした .flvファイルのプレーヤは Media Player Classicとffdshowのコンビが良いです。拡大縮小も、シークも自由自在です。たまに再生開始時に数秒固まりますけど、落ちたりはしないようです。
Xenepic online(運営はHanGame)というゲームを始めてみたのですが、Ragnarok Onlineのパクリというか…。まあそのおかげで取っ付きやすいですけどね。ただ起動しただけではだめで、IEでいちいちHanGameにログインしないと遊べないようになっています。非常に面倒くさいです。
どうやって普通の起動と区別しているのか、下のプログラムをXenepicと入れ替えて引数を調べたら、変な数値とHangame IDを指定して起動していました。ちなみにその引数を渡すだけで普通にログインできます。作りがいい加減ですね…。
数値はパスワードのハッシュかと思ったのですが、パスワードを変えても不変でした。日付とか時間か?
#include <stdio.h>
int main(int argc, char *argv[])
{
for (int i = 0; i < argc && argv[i] != NULL; i++) {
printf("%d: %s\n", i, argv[i]);
}
getchar();
}
昨日作成したRAID0+1の書き込み性能を測定しました。
やはり3台もつないでミラーリングするとかなり遅いです。
$ ./bench ./a 102400000 262144 loop: 391 time: 4.812052[sec] speed: 21.279903[MB/s]
速度の見積もりはUSBバス帯域を480Mbpsの7割とし、データがストライピングで完全に三等分になったとして、
336/3*2=224Mbps=28MB/sです。
見積もりと実測値がかなり離れているので他にオーバヘッドがあるのかもしれませんが、不正確を承知でもう2台追加した場合を計算すると、
336/5*3=201.6Mbps=25.2MB/sです。
このようにバスに余裕がない状態でミラーリングすると、ディスクを増やしただけ書き込み速度が下がります。
ちなみに RAID0のみならディスクを増やしても速度が落ちる心配はありません。バスの飽和まで速度が上がるはずです。まあ、あまり増やしても分散書き込みの処理のオーバヘッドが増えるだけですけどね…。
外付けUSB HDDでSoftware RAIDを構築する全ての方へ。
※私自身よくわかってないので、間違いなどあるかもしれません。ご指摘は大歓迎です。
LinuxではUSB Mass Storage(USB HDDやUSBフラッシュメモリ)をSCSIエミュレーションによりあたかもSCSIデバイス(sda, sdb, ...)であるかのように扱います。ところがどのSCSIデバイスに割り当てられるかが不明瞭で、ただ差し直しただけで対応が入れ替わったりします。/dev/sdaがどのデバイスと関連付けられるかは、やってみるまでわからず、これではとてもRAIDを構築できそうにありません。
USBデバイスを固定する(?)方法としてudevがあります。scsiバス上にある(エミュレーションなのでそう見える)「○○社」製のデバイスなら、usbhdaに割り当てる、などの設定が可能です。区別に使える情報はudevinfoというプログラムで得ることができます(udev使うなら /sys以下の情報(sysfs)が必要かも)。
# aptitude install udev # udevinfo -a -p /sys/block/hda (... 略 ...) follow the class device's "device" looking at the device chain at '/sys/devices/pci0000:00/0000:00:1f.1/ide0/0.0': BUS="ide" ID="0.0" DRIVER="ide-disk" SYSFS{drivename}="hda" SYSFS{media}="disk" SYSFS{modalias}="ide:m-disk"
たとえば ○○社製のhogehogeという名前のHDDが一台だけある、という環境でしたら、以下のように書くことができます。/etc/udev/rules.d/ 以下に .rulesで終わる名前のファイルを適当に作ります。例ではlocal.rulesとしています。
モデル名は大抵スペースが入っているので、udevinfoで確認することをお勧めします。
BUS="scsi", SYSFS{model}="hogehoge ", NAME="sda%n", SYMLINK="usbhda%n"
NAMEならデバイスファイルが、SYMLINKならデバイスファイルではなくシンボリックリンクが作られます。%kという文字列を指定すると、カーネルが作成したデバイス名(sdaとかですね)に置換されます。詳しくはudevのドキュメントを見てください。
ところがこれで解決しない場合があります。私のように同じメーカーの同じ製品を2台使っている場合です。USBの機器にはシリアル番号を提供するものもあり(私の所持するIO-DATA製の外付けディスクなどがそう)ますが、SCSIエミュレーションのデバイスが提供してくる情報からは得られず、全く区別がつきません。
そこでLinux 2.6で最近登場した ubを使います。カーネルをリコンパイルしてubを有効にします。そのさいusb-storageドライバとSCSIエミュレーションによる方法は勝手に無効化されます。たぶん…。
私の環境ではカーネル構築だけDebian流にやってません、ご容赦ください。
# cd /usr/src/linux # make menuconfig (Device Drivers -> Block devices -> Low Performance USB Block driver) (.configならCONFIG_BLK_DEV_UB = yにする)
再起動すると /devの下にubaとかubbというブロックデバイスができていると思います。このデバイスに対してudevinfoするとIDという項目があると思います。これはおそらくUSBバス上の物理的なポートの位置ではないかと思います。
# udevinfo -a -p /sys/block/uba (... 略 ...) follow the class device's "device" looking at the device chain at '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-1/1-1:1.0': BUS="usb" ID="1-1:1.0" DRIVER="ub" SYSFS{bAlternateSetting}=" 0" (... 略 ...)
差し替えたり、抜いてみたりして観察してみた限り、IDは私の環境では同じポートに接続する限り不変な値のようです。この性質を利用して区別します。
先ほどのlocal.rulesに対して、以下のように書きました。
BUS="usb", ID="1-1:1.0", NAME="usb1-1_hd%n" BUS="usb", ID="1-2:1.0", NAME="usb1-2_hd%n" BUS="usb", ID="1-3:1.0", NAME="usb1-3_hd%n" BUS="usb", ID="1-4:1.0", NAME="usb1-4_hd%n" BUS="usb", ID="1-5:1.0", NAME="usb1-5_hd%n" BUS="usb", ID="1-6:1.0", NAME="usb1-6_hd%n"
これでmount /dev/usb1-1_hd1 /mnt/usb1-1-1などとすると、ポート1に接続されているデバイスの先頭パーティションをマウントできます。
肝心のポート1がどれなのかは、実際に機器を接続してudevinfoをして調べます。私にはIDを調べるうまい方法がわかりませんでした。ごめんなさい。
外付けUSB HDDでSoftware RAIDを構築する全ての方へ。
※しつこいですが私自身よくわかってないので、間違いなどあるかもしれません。ご指摘は大歓迎です。
Software RAIDについては、先日(2006年5月7日参照)紹介したので mdadmの使い方、cat /proc/mdstatの意味など基本的なことはそちらを見ていただくとしましょう。
さて、当方の環境ですが /homeを担っていたhda7とUSB HDD 3台でRAID 0+1を構築し、/homeにマウントしようと思います。容量は160GB(RAID1)+160GB(RAID1) のストライピング(RAID0) で320GBとなります。信頼性と容量が今までの倍になるわけです。そのぶんHDDが4倍ですが…。
まずはRAID1を2つ作成します。RAID1をいきなり作ってしまうと、ディスクの同期処理が始まり何もできなくなるので、いったん縮退モードで作成してデータのコピーを済ませ、その後ディスクを追加します。
# mdadm --create /dev/md0 -l1 -n2 missing /dev/usb1-1_hd # mdadm --create /dev/md1 -l1 -n2 missing /dev/usb1-3_hd
次に2つのRAID1をまとめるRAID0アレイを作成します。この構成はRAID1+0と呼ぶのかもしれませんが、ここでは一貫してRAID0+1と呼びます。
RAIDを作成するときデバイスファイルがないと言われたら、-aを付けてください。
# mdadm --create /dev/md3 -a -l0 -n2 /dev/md0 /dev/md1
間違ってmd2ではなくmd3にしてしまいましたがそのままいきます…。/proc/mdstatを見て作成されたかどうか確認します。確認したらmd3をreiserfsでフォーマットします。
# cat /proc/mdstat Personalities : [linear] [raid0] [raid1] [raid5] [raid4] [raid6] md3 : active raid0 md0[0] md1[1] 317127104 blocks 64k chunks md1 : active raid1 ubc[1] 156290816 blocks [2/1] [_U] md0 : active raid1 uba[1] 160836416 blocks [2/1] [_U] unused devices: <none> # mkreiserfs /dev/md3 (... 略 ...)
ブート時に自動的に構成されるように /etc/mdadm/ にある mdadm.confにRAID構成の設定を保存します。
# cd /etc/mdadm # echo DEVICE /dev/usb* /dev/md* > mdadm.conf # mdadm --detail --scan >> mdadm.conf # cat mdadm.conf DEVICE /dev/usb1-1_hd /dev/usb1-2_hd /dev/usb1-3_hd /dev/md0 /dev/md1 /dev/md3 ARRAY /dev/md3 level=raid0 num-devices=2 UUID=bxxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxx2 devices=/dev/md0,/dev/md1 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=0xxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxx9 devices=/dev/usb1-3_hd ARRAY /dev/md0 level=raid1 num-devices=2 UUID=9xxxxxxx:xxxxxxxx:xxxxxxxx:xxxxxxx7 devices=/dev/usb1-1_hd
catした結果を見るとmd3, md1, md0の順番でスキャンされています。このままで良いはずなのですが、私の環境では md3の設定を一番後ろに書かないと、起動時にコケてしまいます。md3がmd0とmd1に依存しているからかなあ?よくわかりません。
データをコピーして、再起動したらディスクを追加します。同期処理にしばらくかかるので放置しておきましょう。
# mdadm --manage /dev/md0 -a /dev/usb1-2_hd # mdadm --manage /dev/md1 -a /dev/hda7
mdadm.confの設定を更新するのもお忘れなく。あとはfstabを修正して再起動してみて、動作を確認したら終わりです。
大下さんとジョイ本へ買い物に行きました。教育実習に使う教材を作るためだそうで、製本テープや、画用紙だとかを買っていました。真面目にがんばってるなあ。
RAID5を構築する準備をしようと思い、USB接続のハードディスクを2台と、1つのバスに3台つなぐのはちょっと心細いから、USB 2.0のカードも買いました。
家に戻って「早速増設じゃー」とケースを開けたら、空きスロットが PCIバスじゃなくてAGPバスだった…。せっかく買ったのに使えないよorz
空きスロット=PCIバス?という思い込みで確認し忘れました。安い拡張カードだったのが命拾いですね。次回作サーバへの準備ということにしておきましょう。
中身はI/O製がHGSTの160GBでBuffalo製がWDの160GBでした。そんなことより、Buffaloの電源に台湾製のしょぼいコンデンサが刺さってます。HDDの近くで結構熱くなるし、まさか連続運用半年でアボーンなんて設計じゃないよね…?
榮樂氏の代わりとして臨時TAに行きました。Coinsはリプレースの影響で未だに超不安定らしいですよ。Macなんかにするから…なんてね。普段はたった一時間で2〜3台止まって当たり前だとか。今日は技官さんが今朝リブートしたからきっと大丈夫だよ、なんて言っていたおかげか特に問題ありませんでした。
自分は2学期にTAの予定ですが、はっきり言ってこんなシステム上でやりたくないぞ。
塚原氏と晩御飯食べに行きました。土浦の李厨房には学生割引がありますが、K'sの奥にある李厨房はどうだったろう?今度行った時に聞いてみようか。
走ると白煙が上がるらしい塚田氏の車、とうとう修理することにしたそうです。今日、塚田氏が修理屋さんに預けに行くというので榮樂氏とともについて行きました。代車はRAV4でした。毎回違う車が出てきてつくづく面白いお店だと思います。
乗ってみて感じたのは RAV4の加速がかなりイイ!ということです。我が家のFTOと同格の2000ccなのにこうも違うのは、以下の違いがあるからです。
これは馬力(仕事率)=トルク(力)×回転数(速度)という関係を考えるとわかりやすくなります。
式を見ると、高回転エンジンなら馬力が上がることがわかるかと思います。さらに同じトルクなら、低回転域で出すより高回転域で出した方がより最大馬力が稼げるわけです。
スポーツカーと呼ばれる車ならば、上記の最大馬力を稼ぐ設計をするはずです。
一方、街乗りに使う車はブン回すと燃費が悪い、うるさいなど悪影響が多いため高回転域は不要です。そのため低い回転数で良い「加速」を得る必要があります。そのための工夫点はエンジン設計者にしかわかりませんが、とにかく高回転域を犠牲にしてでも、低回転域でのトルクを稼ぐ設計にします。
セダン、ミニバン、SUVなど便利な車は、トルク重視の設計をするはずです。
これを逆転させてしまうと、初めだけ速いけど伸びが悪くて遅いスポーツカーや、思い切り回してナンボのモタモタセダンなどになってしまいます。これはきっと物好き以外には売れないでしょう。
ドコモの二次面接に向かいました。会場がなんとキャピトル東急という驚愕の高級ホテル。ホテルを目の前にして「これが二次面接の会場とはご立派だなあ」と感心しつつ控え室に居た人と話していたら……ハイ、ナニ、なんだって?
こ れ が 最 終 面 接 ?
おいいいいいい、そんなの聞いてねえよ!
思えば、人事の人「次の面接に進んでいただきたくご連絡を」としか言っていませんでした。それを早合点してじゃあもう一回あるんだと思ったのが悪かったです。うう、でも最終なら最終って言って欲しかったよ。
最終でもどんどん落とすと噂のドコモなのに、相当しどろもどろになってしまい、今日の面接は自分が面接官でも絶対落とすわーって思いましたね。向こうも呆れている感じでしたね。さよならドコモ。
近藤君と志村君が香辛飯屋の挑戦カレーに挑みましたが、残念ながら負けました。前見たやつと違って、野菜が入っているところがうっとおしいようです。
会計時に「割引券は一枚につき一品の値引き」と言われました。えぇ、そんなの知らないよ。チラシが一枚しかなくて本来なら2個目の挑戦カレーが値引きされないはずが、哀れに思ったのか店員さんが適当にごまかし安くしてくれました。
チラシはカラーコピーして構わないので、今度誰かやるなら頼む数だけチラシを揃えましょう。
車から加給音のような変な音がします。無論、ターボなんぞないので、エンジンのどこかが詰まって鳴っているのかもしれない。また壊れたのか…!
YouTubeのムービーURLを生成するスクリプトを書いてみました。
検索ワード(URLのword= 以降の所)を変えると検索結果も変わります。ただし、URLを生成するためにムービーを表示するページを一々読み込んでは解析して…と、やっているため結果が出るのが非常に遅いです。検索結果が多いと、数分かかるかも。イライラしてリロード連打しないでね。
時間が経つとユニークIDが失効して、ダウンロードできなくなります。そのときはリロードして新しいURLを生成してください。
< | 2006 | > | ||||
<< | < | 05 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | - | - | - |
合計:
本日: