ログインとログオンは同じ意味。じゃあ、ロックオンとロックインは同じ?
Yahoo!辞書−プログレッシブ英和中辞典
http://dic.yahoo.co.jp/bin/dsearch?index=l-002087&p=lock ...
lock in は閉じこめるって意味なのね。
意味は全然違うけど、やっぱり発音としてはロックオンの方がかっこいいな。ロックオンレーザーとかのイメージがあるからかな。ログオンとログインだったらログインの方が発音しやすいしかっこいいけど。
ロックといえば、データベースのテーブルをロックするときに、デバッグメッセージとして "We will Rock You" って出力してたこともあったな。意味不明だけど、意図は通じてた。「R と L の発音の区別もできないくせに」と密かに自分で自分につっこみを入れたのも覚えてる。
Yahoo!辞書−プログレッシブ英和中辞典
http://dic.yahoo.co.jp/bin/dsearch?index=l-002087&p=lock ...
lock... in/lock in...
(1) ⇒〔他〕2
(2) 〈人を〉(うっかり)部屋に閉じ込める,部屋から出られなくする.
2 [III〔名〕(〔副〕)]〈物を〉(錠を掛けて)しまい込む;秘蔵する《away, up》;〈人などを〉(部屋・独房などに)閉じ込める《in, up, away/in, into...》(幽閉の意を強く出すにはupを用いる);…を(胸などに)しまい込む《up》
・ 〜 up [away] documents
(金庫などに)書類をしまう
・ The bus was 〜ed up in snow.
バスは雪に閉じ込められた.
lock in は閉じこめるって意味なのね。
lock on
(1) (…に)連結する《to...》.
(2) 〈ミサイル・レーダーなどが〉(…を)自動追跡する《to...》.
意味は全然違うけど、やっぱり発音としてはロックオンの方がかっこいいな。ロックオンレーザーとかのイメージがあるからかな。ログオンとログインだったらログインの方が発音しやすいしかっこいいけど。
ロックといえば、データベースのテーブルをロックするときに、デバッグメッセージとして "We will Rock You" って出力してたこともあったな。意味不明だけど、意図は通じてた。「R と L の発音の区別もできないくせに」と密かに自分で自分につっこみを入れたのも覚えてる。
日付を表現する文字列をパースして DateTime 構造体を作ってくれる DateTime.Parse()と DateTime.ParseExact() について。
書式が決まってるんだったら、速度が速くて厳密な ParseExact() 使えとのこと。あー、私はずっと Parse() 使ってたよ。
Figures
http://www.microsoft.com/japan/msdn/msdnmag/issues/05/03/Cul ...
多機能な CultureInfo クラスを利用して .NET の世界を身近なものにする から。
http://d.hatena.ne.jp/atsushieno/20050625/p1
書式が決まってるんだったら、速度が速くて厳密な ParseExact() 使えとのこと。あー、私はずっと Parse() 使ってたよ。
Figures
http://www.microsoft.com/japan/msdn/msdnmag/issues/05/03/Cul ...
Parse と ParseExact の比較
文字列を解析するためのメソッドとして、Parse と ParseExact の 2 つが用意されています。Parse メソッドの機能は COM に根差しており (COM 自体は旧バージョンの Visual Basic に根差しています)、処理コストの程度にかかわらず文字列から日付への変換が行われました。不適切な文字列解析を行うことのリスクは、処理に悪影響が伴うことにあります。この悪影響の 1 つは、dd/mm/yy や mm/dd/yy の日付書式を指定する場合に明らかとなります。Microsoft .NET Framework に用意されている DateTime.Parse メソッドは、以前のメソッドとほぼ同じ目的に使用されますが、残念なことに以前と同じ問題をいくつか抱えています。余分なチェックが行われるため処理に時間がかかり、正しく検出されない新しい書式は今後も常にいくつか存在します。覚えているかもしれませんが、こうした動作を "邪悪な日付解析" と侮蔑的に呼ぶことがありました。
一方、DateTime.ParseExact メソッドは、DateTimeFormatInfo オブジェクトで指定された正しい書式を受け取り、その書式を使用して処理を行うだけです。書式に一致しないデータが処理されることはありません。また、余分なスペースを許容するかどうかを巡る興味深い議論がマイクロソフト社内で行われています。簡単に言うと、ParseExact メソッドの目的は、"書式があり、その書式が設定された文字列がある場合に、解析を実行する" という流れに沿っています。ParseExact を使用することで処理速度が高速化され、セマンティックとしてもより正確になります。そのため、DateTime.Parse メソッドの柔軟性が不必要な場合には ParseExact メソッドを使用することを強く推奨します。
多機能な CultureInfo クラスを利用して .NET の世界を身近なものにする から。
http://d.hatena.ne.jp/atsushieno/20050625/p1
ユーザレベルでの crontab のバックアップってどうするのがいいんだろう? /var/cron/tabs/USER_NAME をバックアップすればいいのかな? 一応コマンドでやるか。
~/etc に一日一回 crontab の中身をダンプする。
date コマンドの引数の % の前に \ をつけているのは、crontab の場合 % を \% にエスケープする必要があるため。
Manpage of CRONTAB
http://www.linux.or.jp/JM/html/cron/man5/crontab.5.html
ホームディレクトリは ~/tmp を除き丸ごとバックアップ。暗号化して他のマシンに転送。
~/etc に一日一回 crontab の中身をダンプする。
# crontab backup
8 0 * * * crontab -l >$HOME/etc/crontab_backup_`date +\%a`
date コマンドの引数の % の前に \ をつけているのは、crontab の場合 % を \% にエスケープする必要があるため。
Manpage of CRONTAB
http://www.linux.or.jp/JM/html/cron/man5/crontab.5.html
「第 6」フィールド (行の残りの部分) には実行されるコマンドを指定する。その行のコマンド部 (改行文字または % 文字まで) が /bin/sh (またはその crontab ファイルの SHELL 環境変数で指定されたシェル) によって実行される。コマンド中にパーセント記号 (%) がバックスラッシュ (\) によってエスケープされずに置かれていると、改行文字に置き換えられ、最初に現れた % 以降の全てのデータは標準入力としてコマンドに送られる。
ホームディレクトリは ~/tmp を除き丸ごとバックアップ。暗号化して他のマシンに転送。
Intel の Hyper-Threading (ハイパースレッディング) などのをはじめとする Simultaneous Multi Threading (サイマルテイニアス マルチスレッディング) 技術の概要。
「今時ハイパースレッディング? ふつーデュアルコアでしょう」と言われるかもしれないけど、サーバ向けプロセッサの intel XEON はデュアルコアのモデルがまだ出ていなくて、ハイパースレッディング対応モデルしかないんだもん。AMD はサーバ向けプロセッサ Opteron もデュアルコアになってるのにね。そもそもハイパースレッディングとデュアルコアって目的が違う技術だ。
スレッドは「命令」に分解されて「実行ユニット」で実行される。ほとんどの CPU には複数の実行ユニットが入っているので、1スレッドの中で依存しない命令レベルでは並列実行できる。しかし、複数の実行ユニットがあっても依存しあう命令同士だと並列実行できない。並列実行できないと CPU の処理能力を100%発揮できない。
ただし、いくつか条件がある。
実行待ちになっている複数のスレッドがある場合のみ有効。
実行するスレッドがない場合は、結局実行ユニットが遊んでしまうめ。
複数のスレッドが同じ実行ユニットを取り合うような状況では効果がない。
CPU が複数あるように見せかけているだけで、実行ユニットの総数は変わらないため。
http://www-6.ibm.com/jp/servers/eserver/iseries/seminar/eSto ...
ANGIE WORKSHOP - Hyper-Threadingの実像
http://www.mnet.ne.jp/~angie/exp/hyper-threading.html
[news] Hyper-Threading 関連
http://mcn.oops.jp/glossary/cpu/ht.htm
News:ハイパースレッディング――その仕組みと未来図(2/2)
http://www.itmedia.co.jp/news/0202/13/hyper_m2.html
@IT:解説:Hyper-ThreadingテクノロジはPCに革命を起こすか? 1. HTテクノロジの仕組みと効果
http://www.atmarkit.co.jp/fsys/kaisetsu/013ht_pentium4/ht_pe ...
【特集】ついに投入される新テクノロジ - HyperThreadingに迫る- (8) SMTの狙いと効果のあるケース、無いケース (MYCOM PC WEB)
http://pcweb.mycom.co.jp/special/2002/ht/007.html
「今時ハイパースレッディング? ふつーデュアルコアでしょう」と言われるかもしれないけど、サーバ向けプロセッサの intel XEON はデュアルコアのモデルがまだ出ていなくて、ハイパースレッディング対応モデルしかないんだもん。AMD はサーバ向けプロセッサ Opteron もデュアルコアになってるのにね。そもそもハイパースレッディングとデュアルコアって目的が違う技術だ。
- 前提
普通の CPU は、1スレッドしか同時実行できない。複数のスレッドを同時実行するには、CPU を複数用意しなければならない。スレッドは「命令」に分解されて「実行ユニット」で実行される。ほとんどの CPU には複数の実行ユニットが入っているので、1スレッドの中で依存しない命令レベルでは並列実行できる。しかし、複数の実行ユニットがあっても依存しあう命令同士だと並列実行できない。並列実行できないと CPU の処理能力を100%発揮できない。
- SMT - Simultaneous Multi Threading
そこで SMT を使う。SMT だと CPU が複数あるように OS に見せかけることができる。OS は複数のスレッドを同時実行できる。すると、遊んでいる実行ユニットの数を減らせるため、単位時間あたりに同時実行できる処理の数が増える。ただし、いくつか条件がある。
実行待ちになっている複数のスレッドがある場合のみ有効。
実行するスレッドがない場合は、結局実行ユニットが遊んでしまうめ。
複数のスレッドが同じ実行ユニットを取り合うような状況では効果がない。
CPU が複数あるように見せかけているだけで、実行ユニットの総数は変わらないため。
- 参考
IBM iSeriesスペシャリストが教える V5ちょっと、イイ話 第14回 - Japanhttp://www-6.ibm.com/jp/servers/eserver/iseries/seminar/eSto ...
ANGIE WORKSHOP - Hyper-Threadingの実像
http://www.mnet.ne.jp/~angie/exp/hyper-threading.html
[news] Hyper-Threading 関連
http://mcn.oops.jp/glossary/cpu/ht.htm
News:ハイパースレッディング――その仕組みと未来図(2/2)
http://www.itmedia.co.jp/news/0202/13/hyper_m2.html
@IT:解説:Hyper-ThreadingテクノロジはPCに革命を起こすか? 1. HTテクノロジの仕組みと効果
http://www.atmarkit.co.jp/fsys/kaisetsu/013ht_pentium4/ht_pe ...
【特集】ついに投入される新テクノロジ - HyperThreadingに迫る- (8) SMTの狙いと効果のあるケース、無いケース (MYCOM PC WEB)
http://pcweb.mycom.co.jp/special/2002/ht/007.html
939pin Athlon64のデュアルコアをマダー?と待つスレ part9
http://pc7.2ch.net/test/read.cgi/jisaku/1116692335/557
r アってなに? とおもってよく見たら、ファイナルファンタジーなどで使われてる指のカーソルを表現しているのね。上記はロマンシングサガのガラハドのイベントのメッセージだけど。ずーっと見続けると指に見えてくる。「でつ」がスヌーピーに見えるってやつと同じ感覚。
http://pc7.2ch.net/test/read.cgi/jisaku/1116692335/557
557 :Socket774 [sage] :2005/06/01(水) 09:18:25 ID:JebIPmEN
>>539
ころしてでも、うばいとる
rアゆずってくれ、たのむ!
そう、かんけいないね
r アってなに? とおもってよく見たら、ファイナルファンタジーなどで使われてる指のカーソルを表現しているのね。上記はロマンシングサガのガラハドのイベントのメッセージだけど。ずーっと見続けると指に見えてくる。「でつ」がスヌーピーに見えるってやつと同じ感覚。
xyzzy では CTRL + X CTRL + Q でバッファの書き込み禁止を設定解除できる。トグル動作。
xyzzy がなんらかの理由で異常終了し、さっきまで編集してたファイルを開いて編集しようとしたとき、以下の警告が出て身動きできなくなったときはこれ。
書き込み禁止状態になると、バッファの下部にあるファイル名やモードを表示している黒いバーの部分に % 記号が表示されて書き込み禁止モードになっていることがわかる。でも、% じゃわかりにくいよね。「書き込み禁止」っていう文言を常に出してくれた方がわかりやすいけど、Emacs の伝統なのかな、これ。
間違って書き込み禁止にしてしまったときにはちょっとパニックになったりする。解除方法を知らない時は途方に暮れた。xyzzy を終了して再起動しても設定が残ったままになるし。そもそも滅多に使う機能じゃないので、解除方法なんて覚えられない。うろ覚えのまま「CTRL + X Q」なんて Q に CTRL を付けるのを忘れて入力して「解除できないよ!?」と焦ったりとか。冷静に Google で解除方法を探せばいいんだけどね。
xyzzy がなんらかの理由で異常終了し、さっきまで編集してたファイルを開いて編集しようとしたとき、以下の警告が出て身動きできなくなったときはこれ。
書き込み禁止状態になると、バッファの下部にあるファイル名やモードを表示している黒いバーの部分に % 記号が表示されて書き込み禁止モードになっていることがわかる。でも、% じゃわかりにくいよね。「書き込み禁止」っていう文言を常に出してくれた方がわかりやすいけど、Emacs の伝統なのかな、これ。
書込み禁止バッファです
間違って書き込み禁止にしてしまったときにはちょっとパニックになったりする。解除方法を知らない時は途方に暮れた。xyzzy を終了して再起動しても設定が残ったままになるし。そもそも滅多に使う機能じゃないので、解除方法なんて覚えられない。うろ覚えのまま「CTRL + X Q」なんて Q に CTRL を付けるのを忘れて入力して「解除できないよ!?」と焦ったりとか。冷静に Google で解除方法を探せばいいんだけどね。
Athlon64 マシンを自作したのでメモ。
メモリはドスパラ宇都宮店で 1GB の DDR400 を2本購入してきた。Team とかいうロゴ付きで両面実装。バルクなので合計18800円で購入できた。メモリも安くなったね。まずは初期不良がないかどうかの確認もかねて仮組みしてみる。
マザーボード ASUS A8V-E DELUXE /NW に CPU Athlon64 3000+ (Socket939 Venice コア) を取り付ける。CPU をブリスターパッケージから取り出す。これが Socket939 かー。ほんとに939本も CPU からピンが生えてるのかな。数えてみる気はないけど。最近の AMD の CPU はみんなコアがヒートスプレッダで保護されてていいね。昔は手荒に扱うとコアが欠ける心配があったらしい。
CPU をどちらに向けたらいいかをマニュアルで確認して、マザーのソケットに CPU を乗せ、レバーを倒す。OK。次はリテールの CPU ファンを取り付ける。ん? なんかマニュアルがわかりにくいぞ。えーと、どっちを向けたらいいんだ? もう一度マニュアルをよく読む。リテールファンの固定レバーが A8V-E マザーボードのチップセットのヒートシンクの反対側になるようにすればいいのか。よし、固定された。ファンのヒートシンク部分に熱伝導シールが貼ってあったので、グリスは塗らなかった。
次はメモリを取り付ける。
メモリスロットは4つある。普通ならスロット1から順に使用するところだが、デュアルチャネルなのでそうなるようにメモリを取り付ける。スロットは CPU に近い側から青、黒、青、黒と並んでいる。今回は 1GB のモジュールを2本差しするので、青のスロットだけにメモリを取り付けた。
続いてビデオカードの取り付け。
PCI-Express 対応の MSI NX6600-TD128ESP だ。PCI-Express 16X の端子は初めて見たけど、ちっちゃいね。これも挿すだけ。小さなプラスチックのギミックはイジェクタかな?
あとは電源周り。CPU ファンのケーブルと、4ピンの ATX の端子、そして20ピンの ATX 電源ケーブルを取り付ける。マザーボード側の ATX 電源端子は24ピンで、電源ユニットのピンは20ピンしかないけど大丈夫。
マザーボードの電源スイッチピンはまだケースの電源投入ボタンにつながっていないので、ジャンパをショートさせて電源を投入した。あ、エラーがでたときのビープ音を聞くために、スピーカーをつないでおけばよかったな。と思ったけど、無事起動。
うん、CPU も 2GB のメモリもビデオカードも無事認識されてる。デュアルチャネルも OK だね。よしよし。
あとはケースにマザーを取り付けて、ハードディスクをつけて OS をインストールするだけ。トラブルがなくてよかった。今回は性能よりも安定性重視で行くと決めたので、滑り出しは上々だね。世の中はデュアルコアの Athlon64 X2 関連の祭りが始まっているようだけど、値段を考えると手が出ないし、私はマイペースで行くとするよ。
背面端子もこんなに増えちゃって。以前の ASUS CUWE だとこのくらいだった。
PS/2 マウス
PS/2 キーボード
シリアルポート
パラレルポート
USB 1.1 が2つ
オンボードビデオの D-SUB 15端子
でも今ではこんなに増えた。
PS/2 マウス
PS/2 キーボード
USB 2.0 が4つ
IEEE1394
パラレルポート
イーサネットの RJ-45
同軸デジタル音声出力
光デジタル音声出力
サラウンド対応のラインアウトとラインインで合計6つ
あれ? となるとケース用の I/O パネルが合わないな。マザーボードのには薄めの I/O パネルが同梱されてたけど、これだけじゃケースに取り付けられないよ。私のケースが古いからいけないのかな? K6-2 300MHz のマシンから流用したケースだし、しかたないかな。I/O パネルはそのうち買いに行こう。
- 自作 PC 用の部品がそろった
2005-05-31 の「新しいプライベート用 PC の部品を発注」でツクモのネットショップに発注したパーツ類が届いた。所要日数は2日。私にとっては十分な早さだった。届いたのは CPU とマザーボードとビデオカード。結構大きめの段ボール箱に入っている。クッションは透明な小袋が連なっているタイプ。これ捨てるの大変だな。メモリはドスパラ宇都宮店で 1GB の DDR400 を2本購入してきた。Team とかいうロゴ付きで両面実装。バルクなので合計18800円で購入できた。メモリも安くなったね。まずは初期不良がないかどうかの確認もかねて仮組みしてみる。
- パーツの仮組
まずはケースには取り付けずにとりあえず組んで電源が入るかどうかをチェックする。マザーボード ASUS A8V-E DELUXE /NW に CPU Athlon64 3000+ (Socket939 Venice コア) を取り付ける。CPU をブリスターパッケージから取り出す。これが Socket939 かー。ほんとに939本も CPU からピンが生えてるのかな。数えてみる気はないけど。最近の AMD の CPU はみんなコアがヒートスプレッダで保護されてていいね。昔は手荒に扱うとコアが欠ける心配があったらしい。
CPU をどちらに向けたらいいかをマニュアルで確認して、マザーのソケットに CPU を乗せ、レバーを倒す。OK。次はリテールの CPU ファンを取り付ける。ん? なんかマニュアルがわかりにくいぞ。えーと、どっちを向けたらいいんだ? もう一度マニュアルをよく読む。リテールファンの固定レバーが A8V-E マザーボードのチップセットのヒートシンクの反対側になるようにすればいいのか。よし、固定された。ファンのヒートシンク部分に熱伝導シールが貼ってあったので、グリスは塗らなかった。
次はメモリを取り付ける。
メモリスロットは4つある。普通ならスロット1から順に使用するところだが、デュアルチャネルなのでそうなるようにメモリを取り付ける。スロットは CPU に近い側から青、黒、青、黒と並んでいる。今回は 1GB のモジュールを2本差しするので、青のスロットだけにメモリを取り付けた。
続いてビデオカードの取り付け。
PCI-Express 対応の MSI NX6600-TD128ESP だ。PCI-Express 16X の端子は初めて見たけど、ちっちゃいね。これも挿すだけ。小さなプラスチックのギミックはイジェクタかな?
あとは電源周り。CPU ファンのケーブルと、4ピンの ATX の端子、そして20ピンの ATX 電源ケーブルを取り付ける。マザーボード側の ATX 電源端子は24ピンで、電源ユニットのピンは20ピンしかないけど大丈夫。
- 電源投入
ディスプレイケーブル、キーボード、マウスをつなぎ、電源ユニットのスイッチを入れる。マザーボードの電源スイッチピンはまだケースの電源投入ボタンにつながっていないので、ジャンパをショートさせて電源を投入した。あ、エラーがでたときのビープ音を聞くために、スピーカーをつないでおけばよかったな。と思ったけど、無事起動。
うん、CPU も 2GB のメモリもビデオカードも無事認識されてる。デュアルチャネルも OK だね。よしよし。
あとはケースにマザーを取り付けて、ハードディスクをつけて OS をインストールするだけ。トラブルがなくてよかった。今回は性能よりも安定性重視で行くと決めたので、滑り出しは上々だね。世の中はデュアルコアの Athlon64 X2 関連の祭りが始まっているようだけど、値段を考えると手が出ないし、私はマイペースで行くとするよ。
- 背面端子が増えたのでケースの I/O パネルが合わない
マザーボードにいろんなものがオンボードになってるから、拡張カードが減ってすっきりしたな。以前使っていた ASUS CUWE だったら、ネットワークカードとサウンドカードと USB 2.0 のカードを別途挿すところだ。統合されるっていいことだね。背面端子もこんなに増えちゃって。以前の ASUS CUWE だとこのくらいだった。
PS/2 マウス
PS/2 キーボード
シリアルポート
パラレルポート
USB 1.1 が2つ
オンボードビデオの D-SUB 15端子
でも今ではこんなに増えた。
PS/2 マウス
PS/2 キーボード
USB 2.0 が4つ
IEEE1394
パラレルポート
イーサネットの RJ-45
同軸デジタル音声出力
光デジタル音声出力
サラウンド対応のラインアウトとラインインで合計6つ
あれ? となるとケース用の I/O パネルが合わないな。マザーボードのには薄めの I/O パネルが同梱されてたけど、これだけじゃケースに取り付けられないよ。私のケースが古いからいけないのかな? K6-2 300MHz のマシンから流用したケースだし、しかたないかな。I/O パネルはそのうち買いに行こう。
NUnit 2.2 には、テストコードを記述したプロジェクトの DLL が更新されたことを自動検出する機能が付いている。
2005-06-08 に書いた「NUnit を使った開発とテスト」では、デバッグ実行時に NUnit GUI が自動起動するように設定した。そういう設定でもいいんだけど、遅さが気になる。デバッグ実行する度に NUnit GUI が起動され、デバッグ実行を終える度に NUnit GUI が終了するという動きになるからだ。私の開発環境は 1.7GHz の Willamette Celeron という遅い CPU と、512MB という少ないメモリしか積んでいないので辛い。
毎回自動起動するよりは、NUnit GUI をあらかじめ別途立ち上げておき、Visual Studio .NET 2003 で CTRL + SHIFT + B でプロジェクトをリビルドし、その後既に起動済みの NUnit GUI の RUN ボタンを押して Unit Test を実行する方がストレス無く開発できる。
テストを実行するためのハードルは極力下げておくべき。ストレス無くテストできるようにしておかないと、テストをしなくなることにつながるからね。
- NUnit GUI の Assembly Reload オプション
NUnit GUI の メニューの Tools の Options にある以下のオプションにチェックが付いていれば、テストコードをコンパイルした DLL が更新されたことを NUnit が検出して自動的にリロードしてくれる。たぶんデフォルトで付いてたと思う。Assembly Reload
□ Reload before each test run
□ Reload when test assembly changes
2005-06-08 に書いた「NUnit を使った開発とテスト」では、デバッグ実行時に NUnit GUI が自動起動するように設定した。そういう設定でもいいんだけど、遅さが気になる。デバッグ実行する度に NUnit GUI が起動され、デバッグ実行を終える度に NUnit GUI が終了するという動きになるからだ。私の開発環境は 1.7GHz の Willamette Celeron という遅い CPU と、512MB という少ないメモリしか積んでいないので辛い。
毎回自動起動するよりは、NUnit GUI をあらかじめ別途立ち上げておき、Visual Studio .NET 2003 で CTRL + SHIFT + B でプロジェクトをリビルドし、その後既に起動済みの NUnit GUI の RUN ボタンを押して Unit Test を実行する方がストレス無く開発できる。
テストを実行するためのハードルは極力下げておくべき。ストレス無くテストできるようにしておかないと、テストをしなくなることにつながるからね。
Delphi 5 + Indy 9.0.0.10 で発生するバグを一つ発見。
Content-Type を multipart/form-data にして POST すると、最後のパートに余計な CRLF が付いてしまう。送信するときに付いているのか、Request オブジェクトを作成しているときに付いているのかなどは、ソースがないので不明。
最後にダミーのデータを付けることで対処。
追記。当メモは Indy が No data to read エラーを出すという件の回避方法でもあるはず。
Content-Type を multipart/form-data にして POST すると、最後のパートに余計な CRLF が付いてしまう。送信するときに付いているのか、Request オブジェクトを作成しているときに付いているのかなどは、ソースがないので不明。
最後にダミーのデータを付けることで対処。
request.AddFile(SearchRec.Name, target_file_path, 'application/octet-stream');
// 最後のパートに余計な CRLF が付くという Indy 9.0.0.10 のバグ回避
request.AddFormField('dummy', 'str');
追記。当メモは Indy が No data to read エラーを出すという件の回避方法でもあるはず。
C# でクラスライブラリを開発することになった。テスティングフレームワークである NUnit を使ってテストコードを書きながら開発したい。
NUnit というフレームワークに則ってテストできる。
上記二点がテスティングフレームワークを使う理由。
「テストコードを使って、自動的にテストができる」というのは、テスティングフレームワークの利点ではない。「コードをテストするためのコード」すなわちテストコードを書いてテストするというのは、プログラマなら無意識にやってるはず。
テスティングフレームワークは、テストコードの書き方とテスト結果の出力形式を規定してくれるだけ。些細なことに思えるかもしれないが、この規定するということは重要なことだ。テスティングフレームワークを使わずに独自のルールに則って書かれたテストコードは、テスティングフレームワークのルールに則って書かれたテストコードに比べると、書いた人以外には理解しにくい。テスト結果の出力形式についても同様。
テスティングフレームワークを使って書かれたテストコードは、その構造についてある程度予想がつく。テスト結果の出力についても、どこに注意を向ければよいかわかる。ルールに則って書かれてるんだから当たり前。それがテスティングフレームワークを使う理由だ。もちろん、テスティングフレームワークが提供する便利な機能を利用するのも理由の一つではある。
たとえば、ASP.NET を使わなくてもウェブアプリケーションは書ける。でも、ASP.NET を使うとフレームワークに則ったウェブアプリケーションを書ける。その結果、アプリケーションは共通の基盤に則った構造を持ち、構造と出力形式について予想が付く。
NUnit - Home
http://nunit.org/
ダウンロードページから NUnit-2.2.0.msi http://www.nunit.org/downloads/NUnit-2.2.0.msi をダウンロード。Next 連打でインストール完了。
テストコードを書く。
ここで NUnit でテストを実行。テストが失敗することを確認する。実装がないので、すべてのテストが失敗するはず。
適宜 NUnit でテストを実行しながら実装コードを書く。
全部のテストが成功すれば完了。
テストコードを記述したクラスから、実装コードを記述したクラスを「プロジェクト参照」で参照する。
ソリューションエクスプローラ上にある、テストコードを記述したクラスの「参照設定」を右クリックして「参照の追加」を選択。「プロジェクト」タブから実装コードを記述したクラスを選択する。
テストコードを記述したクラスから、NUnit の DLL を参照する。
ソリューションエクスプローラ上にある、テストコードを記述したクラスの「参照設定」を右クリックして「参照の追加」を選択。「.NET」タブから nunit.framework を選択する。
テストコードを記述したクラスで using NUnit.Framework; を追加しておく。
実装コードを記述したクラスと、テストコードを記述したクラスの名前空間は同じものにしておく。
いちおうこれで準備完了。
ソリューションエクスプローラから、テストコードを記述したプロジェクトのプロパティを開く。
構成プロパティのデバッグの開始動作のデバッグモードを「プロジェクト」から「プログラム」に変更して適用ボタンを押す。
デバッグモードが「プログラム」になると、スタートアプリケーションのパスを指定できるようになるので、NUnit GUI のパスを指定する。私は以下をコピー & ペーストした。
あとはテストコードを記述したプロジェクトを「スタートアッププロジェクト」に指定してデバッグ実行すると、自動的に NUnit GUI が立ち上がる。ただ、立ち上がるだけで自動的にテストを実行してはくれないみたい。自動的にやる方法はあると思うけど調べてない。
2005年06月15日追記。自動起動するように設定するよりも、NUnit GUI あらかじめ起動しておく方が私に合っていることに気づいた。2005-06-15 の「NUnit はテストコードの更新を自動検出してくれる」を参照。
[Test] 属性を付けたメソッドは、テストメソッドとして NUnit に認識される。
[Test] 属性を付けたメソッド中で NUnit.Framework.Assert() を使って値をテストする。
- NUnit を使うと何がいいのか
テストの結果を可視化しやすい。NUnit というフレームワークに則ってテストできる。
上記二点がテスティングフレームワークを使う理由。
「テストコードを使って、自動的にテストができる」というのは、テスティングフレームワークの利点ではない。「コードをテストするためのコード」すなわちテストコードを書いてテストするというのは、プログラマなら無意識にやってるはず。
テスティングフレームワークは、テストコードの書き方とテスト結果の出力形式を規定してくれるだけ。些細なことに思えるかもしれないが、この規定するということは重要なことだ。テスティングフレームワークを使わずに独自のルールに則って書かれたテストコードは、テスティングフレームワークのルールに則って書かれたテストコードに比べると、書いた人以外には理解しにくい。テスト結果の出力形式についても同様。
テスティングフレームワークを使って書かれたテストコードは、その構造についてある程度予想がつく。テスト結果の出力についても、どこに注意を向ければよいかわかる。ルールに則って書かれてるんだから当たり前。それがテスティングフレームワークを使う理由だ。もちろん、テスティングフレームワークが提供する便利な機能を利用するのも理由の一つではある。
たとえば、ASP.NET を使わなくてもウェブアプリケーションは書ける。でも、ASP.NET を使うとフレームワークに則ったウェブアプリケーションを書ける。その結果、アプリケーションは共通の基盤に則った構造を持ち、構造と出力形式について予想が付く。
- NUnit のインストール
NUnit のインストールは超簡単。NUnit - Home
http://nunit.org/
ダウンロードページから NUnit-2.2.0.msi http://www.nunit.org/downloads/NUnit-2.2.0.msi をダウンロード。Next 連打でインストール完了。
- NUnit の使い方の概要
NUnit がやってくれるのは、ルールに則って書かれたテストコードを実行してその結果を表示してくれることだけ。テストコードは NUnit が自動生成してくれるわけじゃないので、自分で書く必要がある。NUnit を使ったテストしながらの開発は、以下のような流れで進む。テストコードを書く。
ここで NUnit でテストを実行。テストが失敗することを確認する。実装がないので、すべてのテストが失敗するはず。
適宜 NUnit でテストを実行しながら実装コードを書く。
全部のテストが成功すれば完了。
- NUnit の使い方の具体例
実装コード用のクラスとは別に、テストコードを記述したクラスを用意する。テストコードを記述したクラスから、実装コードを記述したクラスを「プロジェクト参照」で参照する。
ソリューションエクスプローラ上にある、テストコードを記述したクラスの「参照設定」を右クリックして「参照の追加」を選択。「プロジェクト」タブから実装コードを記述したクラスを選択する。
テストコードを記述したクラスから、NUnit の DLL を参照する。
ソリューションエクスプローラ上にある、テストコードを記述したクラスの「参照設定」を右クリックして「参照の追加」を選択。「.NET」タブから nunit.framework を選択する。
テストコードを記述したクラスで using NUnit.Framework; を追加しておく。
実装コードを記述したクラスと、テストコードを記述したクラスの名前空間は同じものにしておく。
いちおうこれで準備完了。
- NUnit GUI の自動起動
デバッグ実行時に NUnit GUI が起動するように設定する。これをやらなくても NUnit を使うことはできるけど、やっておいた方が便利。ソリューションエクスプローラから、テストコードを記述したプロジェクトのプロパティを開く。
構成プロパティのデバッグの開始動作のデバッグモードを「プロジェクト」から「プログラム」に変更して適用ボタンを押す。
デバッグモードが「プログラム」になると、スタートアプリケーションのパスを指定できるようになるので、NUnit GUI のパスを指定する。私は以下をコピー & ペーストした。
C:\Program Files\NUnit 2.2\bin\nunit-gui.exe
あとはテストコードを記述したプロジェクトを「スタートアッププロジェクト」に指定してデバッグ実行すると、自動的に NUnit GUI が立ち上がる。ただ、立ち上がるだけで自動的にテストを実行してはくれないみたい。自動的にやる方法はあると思うけど調べてない。
2005年06月15日追記。自動起動するように設定するよりも、NUnit GUI あらかじめ起動しておく方が私に合っていることに気づいた。2005-06-15 の「NUnit はテストコードの更新を自動検出してくれる」を参照。
- NUnit 用のテストコードの書き方の概要
[TestFixture] 属性を付けたクラスは、テストクラスとして NUnit に認識される。[Test] 属性を付けたメソッドは、テストメソッドとして NUnit に認識される。
[Test] 属性を付けたメソッド中で NUnit.Framework.Assert() を使って値をテストする。
スタパ齋藤は物欲番長で、ちょっとだけイカれた文章を書くナイスなライター。ファミ通のゲーム帝国とか書いてた人。そのスタパらしさがあふれた一文を見つけたのでメモ。
予想以上に快適!! UXGAデュアルディスプレイ ケータイWatch スタパトロニクス
http://k-tai.impress.co.jp/cda/article/stapa/17044.html
この「(略) もあるが、そーゆーのは高いが、でも欲しいが、ともかく、」のくだりがスタパらしくて好き。これだけの曖昧接続の「が」を日本語の定石を無視したコンボでたたき込み、かつ物欲番長ぶりを表現しているのが素晴らしい。
予想以上に快適!! UXGAデュアルディスプレイ ケータイWatch スタパトロニクス
http://k-tai.impress.co.jp/cda/article/stapa/17044.html
ウィンドウを物理的に分割するディスプレイ額縁は、何しろ表示を見にくくする。邪魔以外の何者でもない。この問題がない特殊な製品(ゲーム向けトリプルディスプレイみたいなもの)もあるが、そーゆーのは高いが、でも欲しいが、ともかく、マルチディスプレイ環境はデスクトップ領域こそ広大ではあるが、大雑把に言えば“個々のウィンドウは個々のディスプレイ上に収まるように表示させるのが現実的”というコトだ。
この「(略) もあるが、そーゆーのは高いが、でも欲しいが、ともかく、」のくだりがスタパらしくて好き。これだけの曖昧接続の「が」を日本語の定石を無視したコンボでたたき込み、かつ物欲番長ぶりを表現しているのが素晴らしい。
三国志大戦が面白い。三国志大戦は 2005-03-21 の「セガの三国志大戦のチュートリアルをプレイ」などで書いた、トレーディングカードを使ったネットワーク対戦型シミュレーションゲーム。
10品の雑号将軍に昇格する頃くらいまで使っていたデッキ。
UC 甘寧 武力8知力6 呉 コスト2.5 弓兵 強化戦法
UC 曹仁 武力6知力4 魏 コスト1.5 騎兵 神速戦法
UC 陳到 武力5知力3 蜀 コスト1.5 槍兵 復活 大車輪戦法
C 張任 武力6知力6 他 コスト1.5 弓兵 伏兵 強化戦法
C 張梁 武力5知力1 他 コスト1 歩兵 黄巾の群れ
弱点はいろいろある。いくつか列挙。
勢力が多く、士気ゲージ最大値が6になっている。
魏、呉、蜀に他勢力と、全勢力が混在する多国籍軍となっている。このため、士気ゲージの最大値が6に制限され、士気を貯めておいて一気に計略を発動するという使い方ができず、戦術が単調になる。計略同士の連携も使いにくい。この結果、このデッキが得意とする戦術は、とにかくどんどん出撃させて敵を各個撃破するというダラダラしたものになってしまった。私のプレイングスキルや戦術の成長を遅らせた一因がここにあると思う。
全体強化系計略がない。
号令系の計略を持つ武将がいないので、計略は単発で使用することになる。そのため、士気ゲージが貯まったらとりあえず計略を使うという愚直な使い方をしていた。
敵弱体化系計略がない。
SR 賈ク (かく。euc-jp だと漢字出ない。) の離間の計や、UC 司馬懿 (しばい) の雲散霧消の計など、敵を弱体化させる計略がない。そのため、敵の全体強化系計略への有効な対策がない。
SR 呂布などの高武力武将への効果的な対抗策がない。
ダメージ系計略がないし敵弱体化系計略もないので、呂布に天下無双を使われたりしたら手が付けられない。
UC 曹仁は遊撃担当。開幕時に自陣最前列の左端または右端に配置。開幕と同時にそのまま真っ直ぐ敵城めがけて特攻。とりあえず一回攻城できれば良しとしていた。
今思うと、開幕の UC 曹仁の特攻もよくやったなあという感じ。知力によって攻城準備に要する時間が左右される(未確認)ため、知力4の曹仁にはあまり適さない任務だ。一撃離脱の攻城を狙うのであれば、伏兵の特殊能力を持った武将などに担当させた方がよかったかも。というか、騎兵のダッシュオーラを有効活用できてないよな。UC 曹仁はこのデッキの主力攻撃部隊なんだから、もっと戦場を駆け回って騎兵の強みを生かした方が良い。
UC 陳到は C 満寵とのトレードで手に入れた。ただ、槍兵の有効な使い方を知らなかったので、まったく活用できていなかった。槍兵は槍オーラを最大限に活用することが勝利の鍵。しかし、その頃の私は突撃中の騎兵を迎撃することくらいしか知らなかった。全く猫に小判だ。槍兵はとにかく無敵の槍オーラだけを敵部隊に当てること。オーラを消されないように、混戦は避ける。
C 張任はチュートリアルが終わって最初に引いたカード。今でも使っている。伏兵の能力を持っているが、その使い方は今でも悩みどころ。また、当時の私は弓兵が接近戦になったときは武力にマイナス修正がかかることを知らなかった。これはオフィシャルサイトにも書いてあることなのにね。
C 張梁はコストあわせだが、コスト1で武力5は非常にコストパフォーマンスが高い。兵種は歩兵なので騎兵・槍兵・弓兵の三すくみの法則を受けない。積極的に混戦を狙うべき武将だが、当時の私は高武力槍兵などにこいつをぶつけると、武力差のためにすぐに撤退するんじゃないかと思っていて、積極的に混戦を作ろうとしていなかった。ダメじゃん。
UC 司馬懿 (しばい) のカード裏面には、以下のように書かれていた。
至言だと思う。SR (スーパーレア) や R (レア) 中心のデッキでも、考えていないプレイヤーでは勝てない。逆に言うと、UC (アンコモン) や C (コモン) だけのデッキでも、戦い方次第で SR や R が入ったデッキに勝てるはず。今の私はそのための戦略と戦術を考えている。
- 10品の雑号将軍になる頃くらいまで使っていたデッキ
三国志大戦を始めるときは、必要なものが一式入ったスターターパックを購入する。私のスターターパックは 2005-03-21 で書いたとおり呉スターターだった。呉のスターターの主力は UC 甘寧 (アンコモン かんねい) だ。そのため、かなり後になるまで UC 甘寧をデッキに入れていた。私が弓兵好きである理由はここにあると思う。10品の雑号将軍に昇格する頃くらいまで使っていたデッキ。
UC 甘寧 武力8知力6 呉 コスト2.5 弓兵 強化戦法
UC 曹仁 武力6知力4 魏 コスト1.5 騎兵 神速戦法
UC 陳到 武力5知力3 蜀 コスト1.5 槍兵 復活 大車輪戦法
C 張任 武力6知力6 他 コスト1.5 弓兵 伏兵 強化戦法
C 張梁 武力5知力1 他 コスト1 歩兵 黄巾の群れ
- デッキ考察
全体としては弓型のバランスデッキ。武力合計値30となかなか。弱点はいろいろある。いくつか列挙。
勢力が多く、士気ゲージ最大値が6になっている。
魏、呉、蜀に他勢力と、全勢力が混在する多国籍軍となっている。このため、士気ゲージの最大値が6に制限され、士気を貯めておいて一気に計略を発動するという使い方ができず、戦術が単調になる。計略同士の連携も使いにくい。この結果、このデッキが得意とする戦術は、とにかくどんどん出撃させて敵を各個撃破するというダラダラしたものになってしまった。私のプレイングスキルや戦術の成長を遅らせた一因がここにあると思う。
全体強化系計略がない。
号令系の計略を持つ武将がいないので、計略は単発で使用することになる。そのため、士気ゲージが貯まったらとりあえず計略を使うという愚直な使い方をしていた。
敵弱体化系計略がない。
SR 賈ク (かく。euc-jp だと漢字出ない。) の離間の計や、UC 司馬懿 (しばい) の雲散霧消の計など、敵を弱体化させる計略がない。そのため、敵の全体強化系計略への有効な対策がない。
SR 呂布などの高武力武将への効果的な対抗策がない。
ダメージ系計略がないし敵弱体化系計略もないので、呂布に天下無双を使われたりしたら手が付けられない。
- 各武将の役割
UC 甘寧は最初の頃は天元に配置していたが、経験を積んでからは UC 陳到の後方支援を担当させるようになった。UC 甘寧と UC 陳到のコンビで敵の主力武将を潰し、そのまま二隊で攻城に入るとか、UC 陳到を攻城させて UC 甘寧が後方支援するとかしていた。UC 甘寧はコスト2.5と性能に比べてちょっとコスト高。しかし、他にろくな武将がいなかったし、何より三国無双で顔なじみだし、撤退したときの負け台詞「ちくしょうめぇ!」が好きだったこともあり、ずっと使っていた。UC 曹仁は遊撃担当。開幕時に自陣最前列の左端または右端に配置。開幕と同時にそのまま真っ直ぐ敵城めがけて特攻。とりあえず一回攻城できれば良しとしていた。
今思うと、開幕の UC 曹仁の特攻もよくやったなあという感じ。知力によって攻城準備に要する時間が左右される(未確認)ため、知力4の曹仁にはあまり適さない任務だ。一撃離脱の攻城を狙うのであれば、伏兵の特殊能力を持った武将などに担当させた方がよかったかも。というか、騎兵のダッシュオーラを有効活用できてないよな。UC 曹仁はこのデッキの主力攻撃部隊なんだから、もっと戦場を駆け回って騎兵の強みを生かした方が良い。
UC 陳到は C 満寵とのトレードで手に入れた。ただ、槍兵の有効な使い方を知らなかったので、まったく活用できていなかった。槍兵は槍オーラを最大限に活用することが勝利の鍵。しかし、その頃の私は突撃中の騎兵を迎撃することくらいしか知らなかった。全く猫に小判だ。槍兵はとにかく無敵の槍オーラだけを敵部隊に当てること。オーラを消されないように、混戦は避ける。
C 張任はチュートリアルが終わって最初に引いたカード。今でも使っている。伏兵の能力を持っているが、その使い方は今でも悩みどころ。また、当時の私は弓兵が接近戦になったときは武力にマイナス修正がかかることを知らなかった。これはオフィシャルサイトにも書いてあることなのにね。
C 張梁はコストあわせだが、コスト1で武力5は非常にコストパフォーマンスが高い。兵種は歩兵なので騎兵・槍兵・弓兵の三すくみの法則を受けない。積極的に混戦を狙うべき武将だが、当時の私は高武力槍兵などにこいつをぶつけると、武力差のためにすぐに撤退するんじゃないかと思っていて、積極的に混戦を作ろうとしていなかった。ダメじゃん。
- 武将の特性を知り、戦略と戦術を考えろ
とにかく、当時の私は基本が分かっていないという感じ。で、友達のプレイを見たりウェブを見たりして、戦略や戦術について学ぶようになった。そして、自分の至らなさを痛感した。これじゃ勝てるわけがない、と。UC 司馬懿 (しばい) のカード裏面には、以下のように書かれていた。
「多く考えた者が勝つ。たったそれだけのことだ」
至言だと思う。SR (スーパーレア) や R (レア) 中心のデッキでも、考えていないプレイヤーでは勝てない。逆に言うと、UC (アンコモン) や C (コモン) だけのデッキでも、戦い方次第で SR や R が入ったデッキに勝てるはず。今の私はそのための戦略と戦術を考えている。
ASP.NET の DataGrid で行番号をデータバインドで表示する方法。
行番号を取得できるプロパティがありそうなものだけど、見つけられなかった。ItemIndex が使えるかなと思ったが、0 から始まるのでそのままでは使えない。仕方がないので、以下のような場当たり的なコードを書いた。うーん、美しくないよなあ。
上記コードを書いて心を痛めていたところ、心優しい後輩が int.Parse() を使わずに直接キャストしても問題ないと教えてくれた。確かにこのパターンならキャストエラーが出ることなんてあり得ないので、直接キャストすればいい。おかげでコードがちょっとだけ短くなった。
つまり、私は C# のキャストやボクシング・アンボクシングについて理解してないってこと? 調べなきゃ。
調べなきゃ、と思ってたらまた別の心優しい後輩が教えてくれた。
コンテナに直でアクセスするという方法。DataBinder.Eval を使うと型を解決するためのリフレクションが発生するので速度的に不利になるとのこと。なるほど、そういうものなのか。今回の案件では件数がごく少ないのであんまり変わらないだろうけど。
さらに試したら以下で十分な模様。最初に比べるとずいぶん短くなったなー。
行番号を取得できるプロパティがありそうなものだけど、見つけられなかった。ItemIndex が使えるかなと思ったが、0 から始まるのでそのままでは使えない。仕方がないので、以下のような場当たり的なコードを書いた。うーん、美しくないよなあ。
<asp:TemplateColumn HeaderText="行">
<ItemTemplate>
<asp:Label id=Label1 runat="server" Text='<%# int.Parse(DataBinder.Eval(Container, "ItemIndex").ToString()) + 1 %>'></asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
上記コードを書いて心を痛めていたところ、心優しい後輩が int.Parse() を使わずに直接キャストしても問題ないと教えてくれた。確かにこのパターンならキャストエラーが出ることなんてあり得ないので、直接キャストすればいい。おかげでコードがちょっとだけ短くなった。
<asp:Label id=Label1 runat="server" Text='<%# ((int) DataBinder.Eval(Container, "ItemIndex")) + 1 %>'>
つまり、私は C# のキャストやボクシング・アンボクシングについて理解してないってこと? 調べなきゃ。
調べなきゃ、と思ってたらまた別の心優しい後輩が教えてくれた。
<asp:Label id=Label1 runat="server" Text="<%# (Container.ItemIndex + 1).ToString() %>">
コンテナに直でアクセスするという方法。DataBinder.Eval を使うと型を解決するためのリフレクションが発生するので速度的に不利になるとのこと。なるほど、そういうものなのか。今回の案件では件数がごく少ないのであんまり変わらないだろうけど。
さらに試したら以下で十分な模様。最初に比べるとずいぶん短くなったなー。
<asp:Label id=Label1 runat="server" Text="<%# Container.ItemIndex + 1 %>">