_なにやら深海さん新作ムービーのパイロット版が公開されたらしい.秒速5センチメートル.全体45秒でまともにアニメしてる部分は30秒くらいなんだけど,なんだ.短い.もうちょっと見せてくれよと思わなくもないけどこういうのはやっぱり30秒くらいが相場なのかな.60秒版とかないかな.
_カメラワークとか背景とか色々相変わらずの深海ムービー.人物も全然変わってないような気もするけど,変わってないだけに安心できる.とはいえ,ほしのこえあたりと比べるとなんとなく綺麗になったような気はするなあ.具体的にどこがどうなったかというとよくわかんないけど.タイトルが桃色なあたりは色々凄いのだが,なんかあるのだろうか.いや,どう見ても適切な表現は桜色なんだろうと思うけど.
_よーし楽しみにしちゃうぞー.実際に見られるのは一年後くらいな気がするけど.
_私の育った家にある電子レンジは、オーブンとの一体型のものだった.そのお陰で私は中学ごろまでずっと電子レンジとオーブンの区別がついていなかった.どちらだろうが同じものを示していたのである意味当然の混同ではあるが,しかし中学になっても区別できなかったのはぶっちゃけ恥である.だから何ということはないが.
_Civilziationモード.Princeだとちょっとしたミスですぐ勝ちが見えなくなる.序盤にきちんとThe Oracleを建ててGreat ProphetでCivil Serviceを取るところまでできて,さらにお隣を食えてようやくとんとんといったところ.PhilosophicalでもないのにGreat ProphetでCivil Serviceを狙うのはやめた方がいいのかもしれない.The OracleでConfucianismが取れなかったりしても不味いし,そこからGreat Prophetが誕生するまでにも結構かかる.Philosophicalな指導者を選んで良いならそれなりに安定はするのだけど,あんまり指導者特性にべったりなのもなんだかなぁと思うのだよ.Masonryが遅れるのも実はよろしくないのかもしれないが,実は本当の問題はぶっちゃけそのあとの外交なんじゃないかって話はある.
_で,負けが込むと嫌になるのでNobleに落としたりするのだが,Nobleだと普通に勝ってしまうので面白くない.というか,難易度落とすと技術の開発スピードがかなり違うので色々調子が狂う.Animal Husbandry取ってからHinduismが取れるってどういうことよ? ありえなーい.しかしPrince卒業してからPrinceに戻るとコレに似た感想を抱くんだろうな.多分.
_それにしてもマルチプレイのレポートが面白い.非常に面白い.マルチプレイのためだけに日本語版を買ってこようかと思うくらい面白い.しかし,マルチプレイなんか始めたら時間が無くなって大変なことになるのは色々目に見えているのでそれもどうかなという気はしないでもない.ついでに日本語版9000円とか値札がついていて,シングルプレイなら英語版で困っていないだけにちょっと割高感があるのも難点.微妙だ.
_携帯電話にも1GBものストレージが積まれるようになっているらしい.もはや携帯電話ではない気もする.携帯端末のほうが適切だろうたぶん.そのうちソフトウェアで電話実装してくれないかな.マイクとかスピーカーとかをUSBあたりにさっくり入れてモバイルPCのソフトウェアで電話.つまり何が言いたいかというと携帯電話のUIが気に入らない.単に慣れてないだけだけどさ.
_C++.VARIANT_BOOLなる型があり,一体何なのかと思いMSDNを参照するにも載っていない.VARIANTやBSTRにはwarpであるCComVariantやCComBSTRがあるので同じ命名規則だろうと思いCComVariantBoolを探してみるが,ない.一体なんなんだお前は.とにかくどういう扱いをどうしていいのかわからない.何かを参照する型だったりするとリソースリークとかするから嫌だしなんとかして使い方を知りたいのだが,イマイチぱっとしないのだ.仕方ないのでヘッダを漁ってみたらshortのtypedefだった.これは一体どういうことだおい.
_Civilization.近くに石材があったので偉人でCivil Serviceコースではなく,Masonryを取ってThe Pyramidsを建設する方向で進んでみる.が,建てるのが遅かったのかGreat Engineerが誕生する前にThe Great Libraryが建ってしまい,Great Scientistしか誕生しなくなった.まあもともとGreat EngineerはThe Great Libraryを建てるために消費する予定だったんだから,普通に建ったのなら問題はないんだけど.
_で,ゲーム初期からビスマルクとエリザベスと仲良くしていて,更に違う大陸に一人で居たカイラスとも自然と仲良くなったら,最終的にはこの3文明と自分しか残らず,しかもすべての文明と相互防衛条約を結ぶはめになった.その上残念なことにウチのマンサムサくんはスコアも軍事力も2位で,ビスマルクにスコアで1000点ほど,軍事力にいたっては3倍ほど優越されていてちょっと困った.なんとかビスマルクが宇宙船を完成させる前に宇宙船飛ばして勝利はしたが,まったく恐ろしいことである.Princeくらい余裕で後半独走できないとMonarchはやっぱり無理だよなあ.
_Cilivization.指導者をランダムで始めたらみんなの人気者モンテズマくんだった.まあAIにモンテが居ないのが確実なのはある意味アリなのかもしれないとは思うが,しかしAggressive/Spiritualってどうしろと.ついでにUUがジャガー.
_等と思いつつ続けてみたが,初期土地はかなり良かったっぽい.銅はなかったが馬があったのでHorseback Ridingを取ってHorse Archerを作ることにする.まあ別に鉄がなくてもジャガーだし,Iron Working取ってジャガーでも良かったんだけど,その辺はそれである.ジャガーが鉄ナシで生産できることをすっかり忘れていた.ていうか,鉄なしで生産できたところでAxeと同等のStrengthでvs Meleeもついてないのにどうやって使えばいいんだ.
_配置はとりあえず東にカパック,南にチンギスハン,北にイザベラで中央に自分の4文明.とりあえずStonehengeとThe Oracleがあっさり両方取れたので,Great Prophetも結構早く誕生してCivil Serviceのおまけつき.このパターン強いなあ.で,そろそろHorse Archerもそろってきたし,結局鉄を見つけてAxeやJaguerもそれなりに揃えたし,どっか攻めたいのだが敵が決まらない.とりあえずうっとうしいのはイザベラなのだが,チンギスハンの戦争好きを考えるにイザベラと戦争中背後を強襲される可能性が高い.よってカッパックとチンギスを争わせて,とか考えたのだが結局うまく行かなかった.仕方がないのでとりあえず都市が近くてうっとうしいイザベラと戦争したが,結局イザベラが地図から消えるまで背後を襲う奴は居なかった.いやなんだ,Jaguerってコスト安いんじゃん.Jaguerなんてとずっと思っていたがこれはこれで使えるのかもしれないと思う戦争だった.
_で,結局イザベラを食ってからは世界も平和で,後半は軍事力も技術もトップで独走してしまった.1980年に宇宙船打ち上げて終了.Jaguerは酷いUUだと思っていたがそれなりに使えるということと,モンテズマだとチンギス等の交戦的な指導者とは暗黙の外交ボーナスが付くらしいということがわかった.Spiritualはゲームを通して建てまくるTemplesの倍速建設もさることながら,気軽に革命を起こせるのはそれなりに使いやすい.Aggressiveはどーしろというのか良くわからない志向だが,実のところBarracks半額は結構でかいのかもしれないと思った.まあ積極的に選びたくはないけど,これはこれでそれなりなのかな.Barracksは戦争しなくても維持費のかからないPowerとしては使えるのだし.てか,今にして思うにもしかしてMedicを作るべきだったんだろうか.
_Monarchをやってみたいが,今回も独走とはいえ土地良かったし,微妙なところだ.
_XMLってのはなんだか色々ごてごてしていてどうも気に入らないのだが,実際流行ってはいるし多少のごてごてはマシンスペックでカバーする時代であるからにして,まあその辺どうこう言っても仕方がない.でまあ私もぼちぼち使ってみるかという感じでMSXMLをここ最近触ってみたりとかはしているのだが,なんとも.確かに便利は便利のような気はするのだが,C++で使おうとするとXMLよりもオートメーションの関係の知識がなくて色々苦労する.まあこういうのはスクリプト言語とかPerlとかそのあたりでやるべきな気がするのだけど,C++でなんとかしたいこともあるのである.
_で,このMSXML,VBScriptとかなんとかそのあたりのスクリプト言語とかからちゃんと使えるようになっているのだが,お陰でC++から使おうとすると色々苦労する.というのはBSTRだとかVARIANTだとか,VARIANT_BOOLだとかを扱うのが激しくめんどくさいのである.まあ,このあたりはATLがCComBSTRとかCComVariantとかでちゃんとwrapしてくれていて,スクリプト言語的に使えるようになっているのでいいのだが,問題はプロパティである.C++にはそもそもプロパティという概念がないので,スクリプト言語側からはプロパティとして扱えるようになっているものがすべてget_XXX()だのput_XXX()だのという関数呼び出しになっている.そのことそのものはまあ良い.問題はget_XXX()まで戻り値がHRESULTになっていて,取得したい値ではないということだ.どういうことかというと,こういうことをしなきゃならないということである.
VARIANT_BOOL as; doc->get_async(&as); if (as) { // codes }
_これは如何ともしがたい.スクリプト言語的にこう書きたいのである.
if (doc->async) { // codes }
_そこで色々試行した挙句,こんなものが出来上がった.
namespace XMLUtil { template <class T> struct RT { typedef typename T R; }; template <class T> struct RT<T *> { typedef CComPtr<typename T> R; }; template < > struct RT<BSTR> { typedef CComBSTR R; }; template < > struct RT<VARIANT> { typedef CComVariant R; }; template <class T, class R> typename RT<R>::R getter(T *p, HRESULT (__stdcall T::*f)(R *)) { RT<R>::R r; HRESULT hr = (p->*f)(&r); if (FAILED(hr)) { // throw XMLUtilException(hr); return RT<R>::R(0); } return r; } template <class T, class R> typename RT<R>::R getter(CComPtr<T> p, HRESULT (__stdcall T::*f)(R *)) { return getter(p.p, f); } }
_とりあえず,get_XXX()そのものが失敗したときは例外を投げるかnull valueを返すかに関しては議論の余地がある.まあ実際に使うなら例外でいいとは思うが,とりあえずということでこいつはnull valueを返す実装にしてある.で,こいつはどうやって使うのか? こうである.
if (XMLUtil::getter(doc, IXMLDOMDocument::get_async)) { // codes }
_うわーきったねえ構文.大体インターフェイス名を逐一書かなきゃならないのはどうかと.あるいはこんな風に使う.
// before long l; er->get_line(&l); long lp; er->get_linepos(&lp); long ec; er->get_errorCode(&ec); CComBSTR url; er->get_url(&url); CComBSTR rsn; er->get_reason(&rsn); // after using XMLUtil::getter const long l = getter(er, IXMLDOMParseError::get_line); const long lp = getter(er, IXMLDOMParseError::get_linepos); const long ec = getter(er, IXMLDOMParseError::get_errorCode); const CComBSTR url = getter(er, IXMLDOMParseError::get_url); const CComBSTR rsn = getter(er, IXMLDOMParseError::get_reason);
_うわーきったねえ略.どっちがマシか悩むなあ.まあ初期化構文になったのでconstを付けられるのはそれなりの利点っちゃ利点ではあるが,しかしここまで構文むちゃくちゃにしてまでやることかというと疑問が湧く.おまけ.
// before CComPtr<IXMLDOMParseError> xml_error; doc->get_parseError(&xml_error); long ec; xml_error->get_errorCode(&ec); if (code) { // codes } // after using XMLUtil::getter; if (getter(getter(doc, IXMLDOMDocument::get_parseError), IXMLDOMParseError::get_errorCode)) { // codes }
_やりすぎ.
_まったく,素直にこう書かせて欲しいものだ.
if (doc->parseError->errorCode) { // codes }
_ちなみに勢い余ってputterの方も作ってしまった.
namespace XMLUtil { template <class T, class R> class AS { T *p; HRESULT (__stdcall T::*f)(R); AS(T *p_, HRESULT (__stdcall T::*f_)(R)) : p(p_), f(f_) {} public: ~AS() {} HRESULT operator=(R r) { return (p->*f)(r); } static AS<T, R> putter(T *p, HRESULT (__stdcall T::*f)(R)) { return AS<T, R>(p, f); } }; template <class T, class R> AS<T, R> putter(T *p, HRESULT (__stdcall T::*f)(R)) { return AS<T, R>::putter(p, f); } template <class T, class R> AS<T, R> putter(CComPtr<T> p, HRESULT (__stdcall T::*f)(R)) { return AS<T, R>::putter(p.p, f); } }
_こんな感じになる.
// before doc->put_async(VARIANT_FALSE); // after XMLUtil::putter(doc, IXMLDOMDocument::put_async) = VARIANT_FALSE;
// before atn->put_text(CComBSTR("test string")); // after XMLUtil::putter(atn, IXMLDOMNode::put_text) = CComBSTR("test string");
_どう見ても元のままのほうが遥かにマシです.本当にありがとうございました.
_で,散々騒いできたが,一応Visual C++のMicrosoft固有拡張を使えばIXXXPtrという名前のスマートポインタ型でプロパティ構文が使用可能である.私が散々こう書きたいと言っていた構文が本当に通る.代入の方もdoc->async = VARIANT_FALSE;とかで通る.おそらく__declspec(property)を使っている.managed C++でも__propertyキーワードがある.Microsoft固有ってところにどうも反感を覚えるが,結局COMっていうかそれ以前のWindowsな時点でMicrosoftの掌の上なのだからぐちぐち言うより便利な方使ったほうが結局のところ幸せなのかもしらん.大体騒いでる中でも既に__stdcallとか出てる時点で移植性に関しては略.というか,要するにMicrosoftの付けた付加価値という奴であろう.ついでに_bstr_tとか_variant_tとかもあるがこのあたりはCComBSTRとかCComVariantと何が違うのか良くわからん.しかしCompiler COM Supportとかいう項目の中に入っていてMicrosoft Specificで囲まれているあたり色々アレである.もちろんATLもMicorosoft品だろって言ったらその通りだけども.
_実際のところプロキシオブジェクトを使えば,つまり勢い余ってputterの方でやったような方法を使えば,標準C++の範囲内でプロパティ構文を作れるような気はするが,その場合自分でIXMLなんたらを全部wrapしなきゃならないことになる.ぶっちゃけやりたくない.構文は綺麗になるけどさ.あと実際にやってみてはいないので本当にできるかどうかは分からない.templateでがっつり汎用な感じで作ったら意外とできたりしないだろうか.世の中そんなに甘くないか.
_ところでMSXMLでXHTMLがパースできないってのは一体どういうことなのかねMicrosoftさんよ.
_最近はスズメもハトよろしく人間慣れしてきたのか,2m先くらいなら平気で降り立つ.もっとも近づくとすぐに逃げるあたり人間の射程距離を良くわかっておられる.カラスあたりはあれだけでかいと,近づかれるだにむしろこっちが怖い.
_カタン.激しく熱かった.土を産出する土地が3つ1列に固まっていて,しかも2,3,4という怪しい資源の偏りは色々ポイントだった.中盤トップに躍り出たプレイヤーに対し,周りを煽りまくって集中攻撃したところ,そのトップは頭を抑えられたままあがれず,残りの三人もいつあがってもおかしくないという超煮詰まりまくった盤面になった.チャンスカード25枚をすべて引いたにも関わらず誰もあがらないとか,色々凄い.最後の最後まで中盤トップに躍り出たプレイヤーを攻撃対象として煽り続け,その隙に自分が勝利.もし中盤トップに躍り出たプレイヤーに攻撃が集中しなかったらそのまま中途半端な盤面でゲームは終了していたと思われるだけに,この辺の交渉術もカタンの醍醐味であろう.一応私が勝利したとはいえ,本当に誰が勝ってもおかしくない盤面だった.別に負けても楽しかったと言える勝負だっただろうと思う.またやりたいところである.とりあえず,中盤に目立ってトップに躍り出るのは激しくマズい.
_いつもスズメやハトがいる場所に今日はどちらもいなかった.カラスもいない.日が沈みかけていたので時間的にみんな帰っちゃったあとだったのだろう.
_ゴールドベルク変奏曲.見事なファンタジー.さすが五代さんと言ったところ.しかしこれを20になる前に書いてるっていうんだから色々凄いというかまあ羨ましい限りである.ていうか要するにこういうファンタジーにしたかったわけなんだよ.安易に火星とか言うからいけなかったんだ.火星とか言ってる割に全然Scienceじゃなかったあたりはそういうことだったのである.とか言い訳してもしゃーないのだが.
_五代さんの作品は遥かなる波涛の呼び声とはじまりの骨の物語を過去に読んでるが,しかしまあ随分と昔のことなのですっかり忘れてしまっている.はじまりの骨は実は読んだ当時はさっぱりわかんなかった.今読めば楽しめるんじゃなかろうかとは思う.波涛は当時随分楽しんで読んだ.内容は殆ど忘れているが,あのキャラクターたちのかっこよさには大いに惚れたもんである.今読むとまた色々違って見えるんだろうけど.かのシアの名はこの波涛のキャラクターからとっている.いや,かのシアの名って言われてもわかんねーよ.
_骨碑使いも文庫版で3冊そろったら買ってきますかね.
_カシスの原液をなんだかんだって奪ってきたのでここ最近ぼちぼち飲んでいた.今回はちゃんとジュース系があったので色々試せた.カシスグレープ,カシスオレンジ,カシスミルク,カシスアップルあたり.パッケージにはウーロン茶と混ぜて,みたいなことが書いてあるんだが本当に美味しいんだろうか.ちょっと試してみるか.
_フィードバック系の機能は付けようと思いつつぼちぼち作業はしているのだが,なんというか,要求仕様が決まらないのでさっぱり作業が進まない.XMLパーサを通してだけ読み書きすればXHTMLとしてはともかくXMLとしては絶対に正則なのでその点は安心できるのだが,現時点で使ってる更新スクリプトがテキスト処理なのでその辺の不整合もある.あと表示する場所やデザインも悩みどころで,毎回の記事の下にコメントとトラックバックを付け足すとどうもごてごてしちゃって見づらいのでその辺どうしようかなあと悩んだまま色々決まらない.あまり色々気にせずてきとーにほいほいと実装してしまえばとりあえずモノはできそうなんだが,現時点で稼動しているシステムだし,しばらくは使うだろうから安易な実装したくないなあというのもあって微妙である.だが悩みすぎ.まああとは単純にやる気の問題とかもあるけど.