[Top] > [Records February, 2006]

Platitudinous Records February, 2006

【<旧日記】【一覧】【新日記>】

● Feb. 1, 2006 (Wed.)

_うげ日付変わってる.酷い話だ.突然だけどoddとevenがわからん.半と丁もどっちがどっちなのかわからない.偶数は2で割り切れて奇数は1で割り切れない.これはいい.しかしoddとevenに半か丁,こいつらがどーしてもおぼわらない.何故だ.何故なんだ.半は半端の略で丁は丁度の略か? そうすると半が奇数で丁が偶数か? 合っていたようだ.ついでにoddが普通ではない,変わった,半端な,で,evenが等しいとかなめらかとか平行平坦とかそういった意味らしい.したがってoddが奇数でevenが偶数.問題は,だ.問題はだよ,2とか4とか6とかって半端だよね.5とか9とかあたりはなんか丁度じゃん,という自分の感覚だ.何でこういう感覚してるんだろ.でも256より255の方が丁度だと思わないか.256だと8bit unsignedに収まらないじゃん.15とか下位4bitが1でそれ以外0で丁度じゃん.16とかひとつしかbit立ってなくて半端じゃん.それに偶数は中央がないじゃん.うーん.おかしいなあ.bitどうこうの感覚はもちろん最近の感覚だが,奇数が丁度で偶数が半端だというこの辺の感覚は小学生の頃からおかしかったんでなんとも言えんのだけど.あの頃は本気と書いてマジと読む勢いで奇数が丁だと主張していた.未だにあの頃のを引きずっているんだろうか.おかしい.と思ったらうわー.前にも似たようなこと言ってるじゃん.ヤバイ.マジで治らないかも.もうね,とにかく毎回,アレ,そういやこの前間違ってたから覚え直したんだっけ,どうだっけ,とかなるわけで,激しく困っているのである.

_えーと,句点がマルで読点がテンだっけ……? commaとperiodは間違ってないんだけどなあ.

● Feb. 2, 2006 (Thu.)

_突然Civilizationがやりたくなる.で,開始後30分で開拓者が蛮族に襲われたのであっさり終了.弱っ! 開拓者は当然護衛をつけるのがセオリーなのだが,要するにめんどくさいのだ.色々.ちゃっちゃかリタイアして歴史を見るに,土地は悪くなさそうだったんだけど.最後までやり通すのにはかなりの根性が必要なのが難点だ.

_2戦目.技術で遅れをとりまくり.とりあえず隣国からは脅されまくる毎日だがとりあえず従っておく.戦争の何がいけないって,めんどいのだ.要するに.まああんまり争いごとが好きじゃないってのもあるんだけど,都市奪ったところで管理大変だし戦争してると外交評価がいつの間にか底辺だったりとか色々あってどうも好きになれない.やるなら紀元前の領土争いのうちに一気にやってしまうのが良さそうか.ただまあ,実のところ全く戦争せずに勝利をということになるとそれはそれでそれなりに難しいのだけど.大抵なんか言いがかりつけられて宣戦布告されるんだよねえ.こっちから宣戦したわけでもないのに外交評価酷くなってるし.なんとも.

_Civilization IVの日本語化まだー?

● Feb. 3, 2006 (Fri.)

_もう数が丁度だとか半端だとかという理由で半か丁とかoddかevenかというのを覚えるのは私には無理だ.前にも言ったが,奇数だから半端で偶数だから丁度という感覚が全くない.奇数であるか偶数であるかに関係なく,時には数そのものに関係なく,数は半端になったり丁度になったりするのだ.したがって,これ以外の方法でなんとか半か丁かを覚える方法を開発せねばならない.というか,半は半分にできるから半なのだと覚えていた現実.つまりそれの逆だと認識すべしということで,えーと.なんか色々ダメじゃん.

_まあこんな風に騒いでるとなんだかんだって覚えちゃうんだけどさ.しかし毎回いちいち考えないと正しいのが出てこないのが,なんとも.

● Feb. 4, 2006 (Sat.)

_駅に着いたら丁度目的地方向へ行く電車が出発したところだった.要するに乗り遅れたのだが,別段急ぐ用事でもなかったので次の電車をおとなしく待つ.次は約10分後.冷たい風が吹く駅構内をぶらぶらするのも悪くはない.ゆっくりと駅に向かってくる貨物列車.本当にゆっくりだ.確かに飛び乗れそうである.もっとも本気でやろうとすると少し早いかなとは感じるが,でも,正直無理ではないと思う.多分,できる.

_と思ったら,駅で止まった.赤色に光る信号が見える.なるほど,道理でゆっくりなわけだ.8両の貨物列車,全部ガソリンタンク.車両連結部あたりはどうなってるのか良くわからない.良くこんな構造で外れないなとは思ったりするが,多分はずそうと思うとかなり苦労するのだろうと思う.そうこうしているうちに目的の電車が到着する時間.街灯用の小さな風力発電機はどこだったか.風発も悪くないと思うんだけど流行らないかな.どちらかというと太陽発の時代なのか.

_最近妙に値上がってるよなガソリン.

● Feb. 5, 2006 (Sun.)

_ぬはっ.ちょ,おま,こんな絵描けたの! おっと,以下ほぼ完璧に私信なのでそのように.

_あーこんな格好にこんな表情するんだろうなぁー.わかるなあ.私がそんなこと言っててどうするんだってのは大変あるのだけどそれはよい.本人に関しては特に問題はなくて,年齢に関しても雰囲気としてはこんなんじゃないかなと.服装も良いの描いてくれて正直感動.ポイント高いのは表情だけど.手入れされてるのかされてないのか良く分からないこの髪なんかばっちりで,首のあたりのハネがきっとチャームポイント.いや無理にハネさせると多分色々マズそうだけどそれはともかく自然に.杖も杖そのものとしては良いのだけど,ただ本人の物ではなさそう.誰かに預けられたものだという雰囲気はあるけど,杖を彼女に預けるような人物を考慮するに,その人もまたこんな杖は持ってなさそう.ということはもしや奪ったものか.それならわかる.

_で,本人の物は出来ればもう少し有機的な物がいいな.ぶっちゃけ木の枝削って作りました,みたいな.

● Feb. 6, 2006 (Mon.)

_ときどきconst変数の初期化のために無名関数を使いたくなるときがある.C++も無名関数構文くらい作ってくれてもいいと思うのだけど.何が言いたいのかというと,たとえばこんなコードのことである.

SYSTEMTIME st;
GetLocalTime(&st);
/* const */ FILETIME tm;
SystemTimeToFileTime(&st, &tm);
// tmを使用

_変数stはもう必要がない.変数tmは今後変更されたくないのでconstにしたい.しかし関数引数での初期化になるので,何らかの関数を書いてやらなければ初期化の構文では使用できない.無名関数が使用できればもっと楽なのに.例えばこんな風に.

// もちろん現行C++では不正だ
const FILETIME tm = FILETIME () {
	SYSTEMTIME st;
	GetLocalTime(&st);
	FILETIME tm;
	SystemTimeToFileTime(&st, &tm);
	return tm;
}

_まあやっていることは同じな上にNRVO最適化がかからないとFILETIME構造体コピーが発生する分効率は悪化するわけだが…….まっとうなC++としてはFILETIME構造体がきちんとメンバ関数を持つべきであるし,そうでなければFILETIMEやSYSTEMTIMEをwrapしたclassを書くべきだ,ということになるのだろうけど.しかしぶっちゃけめんどくさいのだ.せめて内部関数が書けるだけでも大分違うと思うのだけど.内部クラス内の関数で代用できないこともないが――

struct f { static FILETIME get_local_filetime() {
	SYSTEMTIME st;
	GetLocalTime(&st);
	FILETIME tm;
	SystemTimeToFileTime(&st, &tm);
	return tm;
}};
const FILETIME tm = f::get_local_filetime();

――ハッキリ言ってめちゃくちゃカッコ悪い.

_え,boost::lambda? 冗談だろ? いやいや,そりゃアレは大変スゴいしよく頑張っていることに間違いはないし賞賛に値するが,そもそもboost::lambdaで目的が達成できるのかどうかすら調べる気にならないくらいにはとんでもない.仮に可能だとしても,あそこまでしてconstにしたいならまだこうやったほうがマシである.

FILETIME tm1;
{
	SYSTEMTIME st;
	GetLocalTime(&st);
	SystemTimeToFileTime(&st, &tm1);
}
const FILETIME tm(tm1);

_というか,これでせめてtm1がスコープアウトしてくれさえすればいいんだけど.しかしこれでうまくtm1がスコープアウトする構文こそが無名関数そのものだ,とかいう話も.いや,こういう目的だと単純に変数のconst昇格構文があればいいのか? 昇格なんだか降格なんだかわからんが.

_別にconst宣言しなくたってプログラマが書き込みしなきゃ何の問題もないことなんだけどねえ.

● Feb. 7, 2006 (Tue.)

_MP3ファイルの再生にはずっとWyvernを使っていたのだけど,どうも一次配布がなくなってしまってから随分経つのでそろそろ乗り換えを検討.気に入ってたんだけどなあ.Dynamoは試してみたけど,なんとも合わず.あとはまあ,Ogg Vorbisとか生Waveとかも再生したいな,というのも.Windows標準は標準であることにそれなりの価値があるので,Media Playerも候補ではあったんだけど,どーしてもこれが使いづらい.ムービー系は全部Media Playerで済ませているのだけど,BGM系は上手く合うスキンが無いのだ.映像表示部分がない奴を選んでしまうとムービー系の再生時に困るし,ある奴を選んでいると音楽だけのときに視覚エフェクトだかなんだか鬱陶しいのが表示されて嫌なのである.大抵の音楽ファイル形式は全部再生可能なように取り計らってくれるのでファイル形式関係の問題はあまりないし,これに慣れておくといちいちアプリケーションのインストールをしなくても環境が変わったときにそのまま使えるというのが非常に魅力なのだけど,どうもダメだ.あと生Wave再生のときに最初がおかしい.致命的だろそれ.

_で,foobar2000.全くいいセンスしてる名前ですね! 日本だとさながらhoge2kってところか.その辺はともかく,このシンプルさは実によろしい.まあインターフェースのシンプルさに関してはWyvernが一枚上なのだけど,これのいいところはファイル形式がMP3に限らないことだ.ファイル関連付けツールも用意されているしプラグインを使えば色々なファイル形式に対応してくれるらしい.とりあえず手元にあるOgg Vorbis,Monkey's Audio,Wave,MP3は全部ごちゃまぜで再生できるようになったのでかなり満足である.というかこれを期にMP3ファイルをごっそりOgg Vorbisに変換してもいいかもしれないな.

_えーと,エンコーダーどこだっけ.

● Feb. 8, 2006 (Wed.)

_結局我慢できなくなってCivilization IVの体験版げっつ.なにやらポリゴン化されたようだ.まあポリゴン黎明期はなんか見た目はなんとなくかっこよくなったけどどこに何が書いてあるのかわかんないし操作できないしナニコレ,という印象があったんだが,最近はなんだかんだと使い方を心得てきたようで,かなり使いやすい.Ysのポリゴン化のときも似たような心配をしたけど杞憂で終わってくれたし,いまどきはそう心配することでもないのかな.

_汚職と浪費は大分エレガントになったみたいだが,なにせ体験版は100ターンの制限があるのでせいぜい作れても数都市.都市数が多くなるとそれなりの圧力がかかるのだというがそこまで体験するには尺が足りない.市民の不満管理もなんだか心持ち小さくなった.その分健康管理が増えてとんとんといったところか.

_宗教というフィーチャーが新たに導入されたようだが,思っていたより宗教の創始が早い.めちゃくちゃ早い.開始後数ターンでごそごそっと古代宗教は創始されてしまう.しかし同時代上には資源採取のための地形改善用技術もあり,どちらを選択するか悩みどころっぽい.初期土地によっては敢えて宗教を無視して地形改善と進むべきな場面もあるのだろうか.

_地形改善は種類が一気に増えて,それぞれの改善用に技術が必要になった.序盤の技術選択はそれなりにシビアか.旧作まではとりあえず道路道路灌漑灌漑といった感じだったが今回はそうもいかないようである.特殊資源を採集するためにも改善が必要だし,商業生産用の改善なんか成長するようになった.驚きである.道路はもちろん今までどおり移動の高速化と交易ルート用.ただ今回は宗教の伝播にもかかわってくるようで,まあ役割分担としてはエレガントになったというところか.そうそう,鉄道が無限移動ではなく10倍速になったらしい.体験版では制限のためそこまで確認はできてないが,無限移動はいろいろやりすぎだったと思うんだよね正直.

_あと文化圏がさらにシビアに.敵の都心部1スクエアを残して周りをほぼ囲ってしまうというようなことも可能になった.地形にカーソルを当てるとどの文化がどの程度影響があるのか表示されるし,国境線は逐一揺れ動く.遠くの都市でも文化差があればあっさり転向するし,都市の防衛ボーナスも文化によって計算されるとなるとかなり大変な話だ.個人的にうれしいのは相手の文化圏にユニットが踏み込むことは戦争行為である,ということ.前作までは敵ユニットは自領土内を闊歩するのに,こっちが踏み込むと戦争戦争という良くわからないシステムだったのが改善された.国境に更新があるとユニットは自然に追い出されるし,相互通行条約を結んでユニットを敵領内に入れてから宣戦しても,宣戦した時点で一度追い出されるのだという.この辺はかなり洗練されたと思う.まあ,なんだ.その分やたらみんなして相互通行条約を結んでくれと言い寄ってくるわけだが.

_つーか文化爆弾笑った.

_このゲームのいいところはシリーズが進むにつれてちゃんと洗練されていくところだ.前のほうが良かった,ということが殆どない.まあとはいえ一部のフィーチャーを抜き出して,たとえばIIIは七不思議ムービーがなくなって寂しい,IIのムービー良かったのに,というような面はないとはいえないが,全体としてはIIをやるくらいならIIIをやりたいし,IIIをやるくらいならIVをやりたい,と思える出来になっている.上に上げた以外にも生産システムや偉人システム等もかなり洗練されたようで実に楽しみである.

_心配なのはやっぱり資源だろうか.鉄がなかったらリセットしたほうが,なんて話を見るにそういうのはちょっとどうかと.リセットしなくても戦略の取りようでなんとか切り抜けられるといいのだけど.III時代はウランやアルミがなくて宇宙開発戦争に参加できないとか悲しい話があったんだが,今回は大丈夫なんだろうな.そいや,特定資源を持ってると対応する建設物の建築スピードが二倍,とかいうルールがあったな.こういったあたりで資源取得の有利性を確保しているのだろうか.

_あと戦争に関しては良くわからなくなった.ユニットごとに相性が設定され,こいつを覚えないことには戦争できなさそうである.さすがに100ターン制限で戦争となるとかなりきついものがあってあまり戦闘は試せていないが,ちゃんと楽しめる出来になっていればいいのだけど.

● Feb. 9, 2006 (Thu.)

_確かにopendir/readdirはほしいな.C++的にはdirectory iteratorか.まさにそれがboost::filesystemで実際良く出来てるように見えるのだが,使おうとするとなんか抵抗があるのは識別子が長いからだろうか.ファイル名を直接指定してそれを扱う分にはあまり困らないのだが,ディレクトリやパス名を扱おうとすると突然泣かなきゃならないのがWindowsである.可能な限りディレクトリ操作を避けようとしてきた私の行動理由がこれで明確になった.さっくり作っておくべきだろうか.しかしワイルドカードを渡さなきゃならないのは致命的だと思うんだ.あれ,似たようなことを言っている人がいたような.

_で,さっくり作ろうとしたが美しくない.そもそもワイルドカードが必要なせいでiteration開始時に渡されるパス名が区切り記号で終わっているのか終わっていないのかワイルドカードはつけるべきなのかべきでないのかわからないのでそんなことまで調べなければいけない.が,とてつもなくばかばかしい.ついでにiteratorにするとハンドルのcloseに難があってダメくさい.デストラクタにFindClose()書いておけばいいやーとか適当なことを考えていたらAccess Violation.もうね,やめてくれと.まさか参照カウントしないと後置インクリメント演算子が書けないのか? なんていうか,おとなしくboost::filesysytem使ってろってことか.

● Feb. 10, 2006 (Fri.)

_うひゃひゃひゃひゃ.やっちまった.ろくに英語読めないのにまた英語版Civilization.もちろんIV.

_色々エレガントになったなー.難易度ChieftainのマップサイズTinyでとりあえずやってみる.一応下から二番目だけど,IVから難易度分割数が増えたのか,III時代まではChieftainは一番簡単な難易度だったような記憶が.

_かなり領土に関する取り扱いがハッキリしてて気分がいい.Open Bordersを結ぶとなにやら敵Unitがいっぱい入ってくるが,それでも生産妨害をしたりはしないし,突然戦争になっても一旦は外に追い出されるはずなのでその点はいろいろ安心できる.ついでに,なんか文化攻撃ができるようになった.III時代から不可能ではなかったんだけど,今回は各々のスクエアに文化度数が設定されているのがちゃんと見えて,Cultual Bordersの移動範囲が予測できるのが嬉しい.Great Artistで+4000 Culture Pointsとかめっちゃ笑える.一発でその都市周辺の文化境界が広がるのが見えるのだ.文化爆弾などと呼ばれているらしい.もっとも定住させちゃうんだけどね.

_で,そのまま文化プレイしてたらなにやら文化勝利してしまう.宇宙船パーツ作ってたのになあ.しかも蛮族や野生動物相手以外には一切戦争していない.ちょっと難易度が低すぎたかもしれない.

_と思って調子に乗って二段階上げてNobleにしたらかなりキツい.というか都市建てすぎたのかも.Maintenanceがかかるかかる.これが汚職の替わりって奴か,なるほど.というかGreat Prophetが出てこないせいでShrineが建てられない.これが財源難の最大原因な気がする.前のプレイでは財源0%分配でもちゃんと回っていたのに.いや0%で回る方がおかしい気はする.

_あと健康と幸福が地味に効いている.前のプレイではばんばん不健康建築物を建てていても大して問題なかったのでこんなもんかと思っていたのだが,このレベルだとそうも言ってられないらしい.ゲーム全体を通して地味だが確実に圧力が掛かってくる.あとは専門家のこともきちっと考えていかないと高難易度では厳しそうか.

_まだ軍事戦争は一切していないが,遠くの大陸でふたつほど成長しまくっているライバル文明があるようで,正直このままやって勝てるかどうかは怪しい.島に都市を派遣したが他にもじゃんじゃかやってきて現在激しい文化戦争である.文化爆弾をなんとかしないとダメか? このまま軍事戦争に持っていかれると激しく不利だ.

_というか,外交が英語で何言ってるのかわっかんないのが大変困る.

● Feb. 11, 2006 (Sat.)

_CivIV.うーんダメ.結局外交が上手く行かず戦争開始,ろくに軍のない状態では抵抗ままならず投了.

_同じ設定で再度開始.で,結局どこぞに宇宙船発射されて負け.途中から技術で完全に遅れを取って以来巻き返す手段がさっぱり.まあ結局戦争は全くしてないんだけど,軍に関してもほぼ最下位状態で全然ダメ.なんというか,平和的な勝利を目指すのであればどこかとちゃんと友好関係を結んでお互いに成長していかないとダメっぽい.そうじゃないと,遠くの大陸で2文明が手に手を取り合ってがんがん技術開発していくのにソロで追いかけていけるわけがない.かろうじて3位に位置できていたのはほぼ軍を捨てて内政に走ったからなのであって,ちょっとどこかに小突かれたらそれでおしまいという危うい状態だったのだからその時点でもうダメだろう.

_あとは地形改善の効果をちゃんと覚えなきゃ.

● Feb. 12, 2006 (Sun.)

_激しく遅くなったけど私信.こんなところでするなよって? ある意味リンクしてしまって私信じゃなくするのは手だけど.

_ローブとか肩掛けとかはそんなに拘らなくてもいーんじゃないかと思います.というか,このくらいの方がむしろガキっぽくて良さげな感じ.不健康そうな肌の色はいろいろポイント高いんですが,銀髪は難しそうですね.銀髪なんか背景があってこそ映えるので白地だとやりづらいかもしれません.というか銀髪銀髪言ってるけどぶっちゃけ白髪なので.杖の先の宝石らしきものはなんか輝いていてびっくり.ただ絵としては綺麗なんだけど彼女が持つにはやっぱり違和感が.何のための杖なんだろうなあ,これ.むしろ何かの鍵か.

_あとAAはあんまり似てないと思うます.だが言いたいことは分からんでもない.

● Feb. 13, 2006 (Mon.)

_はいはい怪しいキャスト作らないようにね.

#include <iostream>

template <typename R, typename T> R memory_cast(T t) {
	union convert { T t; R r; };
	convert c;
	c.t = t;
	return c.r;
}

int main() {
	std::cout << memory_cast<float>(0x41200000UL)  << std::endl;
	std::cout << memory_cast<float>(0x3ecccccdUL)  << std::endl;
	std::cout << memory_cast<float>(0x3eaaaaabUL)  << std::endl;
	std::cout << std::hex;
	std::cout << memory_cast<unsigned long>(10.0f) << std::endl;
	std::cout << memory_cast<unsigned long>( 0.4f) << std::endl;
	std::cout << memory_cast<unsigned long>( 0.3f) << std::endl;
	return 0;
}

_何に使うんだこんなもん.

_ただ,再解釈キャストすらできないけどメモリの内容を見たいとかいう場合にはこういうちょっとした強引なことをしないとなわけで.しかしそんな場面って何よって話はある.ただサイズ間違えると怪しいことになるので,sizeofが等しくなるかどうか確認するASSERTは入れたほうが良いのかもしんない.ついでにconstとかつけるとコンパイルエラーに.まあいずれにせよよろしいコードではないですな.

● Feb. 14, 2006 (Tue.)

_だんだんリストが長くなってきた.なんとかしたいとは思うんだけど内容に合わないタグ付けのおかげでどれが何の話題なのかさっぱり.カテゴリ分けして整理すれば色々便利になるとは思うのだけど,それやろうと思ったら全部読み直した上にカテゴリ分けしなくちゃならないわけで,それはそれでどうなのかと.一部だけ抜き出してダイジェストってのがいいのかねえ.大したこと喋ってるわけでもないんだし.とはいえ,いずれにせよそんなことをしようとしたらとんでもない労力がかかるわけで.毎日ちゃんとカテゴリ分けしておけばあとからまとめてやることもなかったんだよ,というのは確かだと思うのだけど,そういうのって結局殆ど全部が「その他」ってオチになるんだよね,大抵.

● Feb. 15, 2006 (Wed.)

_CivIV.なんとかNobleで勝てるようになってきたが,かなり厳しい.Powerがさっぱり上がらない上に技術で遅れをとりがち.Scoreは大抵2位.どうもトップには立てないらしい.意外と時間経過によるScore勝利って難しいんじゃないだろうか.宇宙船を打ち上げてさえしまえばとりあえず勝ちな宇宙船勝利は別にScoreが低かろうがPowerが低かろうがなんとかなるけど,Score勝利っていうとどうなんだろ.むしろ軍事で圧倒してなんとかしろってことなんだろうか.どうもプレイスタイルが内政に偏りがちでいけない.

_外交はわかってきたようなわからないような.まあある程度技術交換とかしないとどうあっても軍事も技術も同時にトップ独走というわけにはいかないので,できるだけ仲の良いお隣さんは居るに越したことはない.とはいえFriendly評価でもあんまり助けてくれないんだけど.

_Powerが上がらないのが問題だなあ.一度超絶戦争プレイをやってみたほうがいいのかもしれない.領土勝利あたりを狙って.征服勝利もアリだけど,普通にやっていれば征服勝利を取る前に領土勝利で終わるだろう.Nobleで文化勝利は正直かなりキツいと思うな.外交勝利も甘くなかろうし.でも文化勝利はちょっとやってみたい.

● Feb. 16, 2006 (Thu.)

_FindFirstFile()/FindNextFile() APIを用いてエレガントなdirectory iteratorを実装することは簡単ではないということがわかった.というかぶっちゃけ無理だろ.その理由はAPIが返すハンドルが内部状態を持ち,その上ディープコピーができないことにある.iteratorは任意にコピーできるべきであるが,その内部状態であるハンドルをコピーできないためiteratorのコピーができない.もちろんハンドル値そのものをコピーするように実装することは難しくないし,その場合でも適切なFindClose()呼び出しは参照カウントすれば可能ではあるが,そのように実装されたdirectory iteratorを以下のように使った場合,意図しない結果が得られる.

directory_iterator a(directory_iterator(".\\")); // 一つ目のファイルを示す
directory_iterator b(a);                         // 一つ目のファイルを示す

++a; // aは二つ目のファイルを示すようになった

++b; // bは二つ目のファイルを示すと期待されるが,
     // 実際には三つ目のファイルを示している.
     // bはaと同じハンドルを持っており,
     // そのハンドルはaのインクリメント呼び出しにおいて
     // 内部状態が更新されているからである.

_これを解決するためには,APIハンドルをディープコピーできなければならない.しかし私の知る限りではこのハンドルを複製するAPIは用意されていない.DuplicateHandle() APIはこれをサポートしない.従って手動でディープコピーを行うために,各々のiteratorは内部で何回のFindNextFile()を呼び出したかをカウントしておき,コピーの際には新たにFindFirstFile()で別のハンドルを取得した後,コピー元のカウント回数だけFindNextFile()を呼び出さなければならない.しかしながら一般的にこのコピーが発生する場面はiteratorの初期化かインクリメントの際であり,コピー元もしくはコピー先は殆どの場合参照されることなく破棄される.これを解決するためには参照カウントとcopy-on-writeの実装が考えられるが,滅多に起こらないであろう本物のcopyのためにFirst呼び出し用の引数文字列とNextの呼び出し回数を内部に保持しておかなければならない.ハッキリ言ってもはや泥沼である.やりたくない.

_カレントディレクトリのファイル一覧を保持したメモリブロックを返したほうがよっぽどマシじゃないのか.コレ.

_なおopendir()/readdir()/closedir()をwrapする際においても同様の問題が発生するが,こちらの場合にはseekdir()/telldir()がサポートされるだけにまだマシである.マジでなんとかしてくれMicrosoft.

_で,ちったあエレガントになっているはずのC#,というか.NET Frameworkはどうやってるのかと思えば,DirectoryクラスやDirectoryInfoクラスのGetFiles()メソッドでファイル一覧を取得するようになっているようだ.どうやら.NET Framework開発者も私と同じ結論に達したらしい.そりゃ,wrap元がコレじゃあそういう実装が一番マシだわな…….ついでにGetDirectorys()なんてもある.まあFileInfoクラスとかPathクラスとかがあるあたり,便利にはなったが元がエレガントではないのでエレガントになりきれなかったという感じか.なんていうか,.NET Framework開発者も苦労したんだろうなと.

● Feb. 25, 2006 (Sat.)

_boost::shared_ptr便利だなあ.とかいって使っているとどんどんC++がJava styleになっていく.なんというかC++でdynamic_castを使い始めると激しく負けた気分になるのだがこれは一体どういうことなのか.RTTIのコストがどれくらいなのかという問題だが,実際のところはそれほど気にするほどのものではないはず.どうせJavaやC#といった言語であればRTTIをしないという選択肢がそもそも無いのであって,そういう意味ではC++だからってRTTIを避ける理由はあまりないのだけど.でもC++でdynamic_castすると負けた気分になる人結構いるよね?


【<旧日記】【一覧】【新日記>】
[Top] > [Records February, 2006]
管理者:Wayne mail address