2013年9月29日日曜日

キャプチャが取りあえず動くレベルになった(自分用メモ)

ここまでで、できたことわかったことのメモ

videoInput は、ver.1991でないとVHScrCapから正常に取得できないので、このバージョンを使用。
(ソースはあるので差分をとれば原因はわかると思うけど、めんどくさいので後回し^^;;;)

VHScrCap
微妙に使いにくいのと、demoモードでしか動かせないので、不特定多数に使わせるには無理があるw
COMをC++から操作してキャプチャ位置を設定するが、demoモードでは設定が保存されない、キャプチャ画像に横線が10本入る、という制限あり。自分用に使うには、そんな制限は乗り越えられるんだけど。。。

アプリ本体
OpenGLにテクスチャを貼り付けて拡大縮小の負担軽減(videoInputでの実装の移管)。

とりあえず動くレベルでclient.exeのゲーム画面をキャプチャするアプリの作成は完了。

追記:
VHScrCapでのdemoモード起動の条件がいまいちわからない。
OpenGLの命令を発行しただけでdemoモードに移行してしまう。
これって、VHScrCapによってプロセスに何か仕込まれているんじゃ、と疑っている。

今までは、client.exeに攻撃する側だったのですが、逆に攻撃される側になってるwww
攻撃される側になって、その防御ってどうすればいいんだろう、と悩んでしまいます。
防御したとして、攻撃した側が誰なのか?調べるのが難しいよね。DLL仕込まれたとして、そのDLLを誰が仕込んだか、なんてわかりゃしない><

追記:
画像一応付けてみます。分かりにくいですが、右下の画面は別モニタのキャプチャ画像です。
ほぼイメージ通りw
アプリ開発は、最初のイメージを如何に正確に描けるか、が重要ですね。

OpenGLのテクスチャを使っているので、拡大縮小はGPUまかせ。といっても負荷制御なし(FPS制限なし)にするとCPUパワー全部使ってしまいます。

今のところの問題は、この拡大縮小をしたときに限って、VHScrCapのdemoモード炸裂で横線が入ってしまいます><
拡大縮小しなければOK。

次のステップとして
(1) この子画面上でのマウス操作/キーボード操作をclient.exeに送りつける
(2) 通常画面と子画面(とuoclistのダイアログ)の位置のスワップ
でひとまずの完成を予定しますが、(2)を様々な条件に対応させるのは難儀だろうな。。。

この辺ができれば、2垢のみならず1垢であっても子画面で操作できて便利になると考えてます。画面サイズを大きくしたいっていうニーズはよく聞きますが、ウィンドウサイズを縮小ってのも欲しいよね。

画像のキャプチャについては、ここまでできたところで自動的にできているようなもの。(面倒だから無圧縮bmpでいいよね^^;;;)
動画キャプチャについても、フォーマットについて何も考えなければ(無圧縮avi ^^;;;)できたも同然なのですが、そもそも(自分にとって)需要があるか?という疑問があるので当分は手をつけない予定。

とここまでやってみて、これらの技術、5年前には完成していたんですよね。めんどくさそうだから手を付けなかっただけで。今これに手を付けている=新パブ入ってもやり込むほどの魅力がなかった、ってことだったり。。。

2013年9月25日水曜日

videoInput

カメラ画像をウィンドウ表示させるのに、むかーしvideoInput使ったなぁ、と昔作ったサンプルを探し出してきました。

ががが、ソースからビルドするとVHScrCapとの組み合わせで、なぜか最初の1フレームだけ表示して止まってしまう><
一緒にバイナリが残っていたので、そっちを実行するとちゃんと動画表示するし。。。

残念なことに、その動作するバージョンをビルドしたときのvideoInputのソースコード、失くしました。とういうか、ハードディスクがクラッシュしたことがあって、消えちゃったんですね。

どこかいじった記憶があるのですが思い出せません。どこをどういじっても、なぜか1フレーム目で止まる。

しかたないので、videoInputはOpenCVに統合されたっけ?とOpenCVのカメラチャプチャのサンプルをビルドしてみたら、、、

う ご い た

うーん、なにがいけないんだろ。

追記:
どうやら、昔もOpenCVからvideoInputを引っ張ってきたようだな、こりゃ。
videoInputのソースが残ってない、ってのはそういうことなんだろうと思う。(videoInputのソースをいじった記憶もあるんだけどね)

2013年9月23日月曜日

進撃の巨人(アニメ)

半年分撮りためておいた進撃の巨人を一気に見てみました。(別作業しながらで、数話抜けていましたが)

感想。

(最初の頃) 世界観が細かいところまで設定されていて、面白いと思った。SFとしてみてみよう。
(エレンが巨人の体内からでてくるところ) 出てきてみたら食いちぎられた腕が復活しているところで「あれれ?」と思った。
(エレン巨人化) この作品はファンタジーなんだと思うことにしよう。そうしないと割り切れない。
(女型の巨人登場) こいつは、エレンの巨人とは別物と考えていいんだよね???
(スパイがいるお) まさか、これまでの登場人物の中にいるってことはないよね?結局、巨人って人が生み出せる兵器(エレンの他にも出せる人がいる)なのね。(エレンの価値暴落)
(女型の巨人の正体発覚) え???そういうことなの???伏線ってちゃんと書かれていた???流し見&数話抜けなので見落としたのかもしれないけど、ちゃんと書かれていないと謎解きものとしてはルール違反だよ???

回が進むごとに、こちらが想定していた希望する展開から少しづつずれていくって感じです。
全体的に、いろいろな要素を詰め込みすぎですね。キャラを見せたいのか、ストーリー展開を見せたいのか、不条理のない世界観を見せたいのか。

追記:
リヴァイ、誰かに似ている、どこかで見たことがある、のだが、どうしても思い出せません><
 ・細目、白目がち
 ・背が小さい
 ・坊ちゃん刈り
うーん、どこで見たんだろうか?アニメ?漫画?ゲーム?

UO ログイン画面時のCPU負荷

UO ログイン画面時のCPU負荷が高い(=スリープ入れずにループ回してる)のが気になったので直してみました。
デバッグ起動時に、ブレークポイントを仕掛け、ブレークかかったらSleep(1)する、っていう単純な実装にしてみました。

これって、むかーしのパブリッシュで修正されたはずだと思っていましたが、、、バグ復活させんなよ><

2013年9月22日日曜日

uoclist 2垢起動対応ほか(0.7.2.10)

2垢で起動できるように変更しました。
どういう実装にするか悩みましたが、

いまどき3垢、4垢、…なんて持っている人はごく少数だよね^^;;;

ってことで、2垢起動までは可能なようにしました。

実装に関しては、もともとdllをディレイロードするようにしていたので、dllをパス指定でLoadLibrary()する方法にしました。(だから、dllのコピーを2つ用意しています)

また、client.exeをCreateProcess()したときに、SetWindowPos()にブレークポイントを仕掛けた上でデバッガ起動するようにし、SetWindowPos()が実行されたときに引数を書き換え、モニタ左上隅にclient.exeのウィンドウの左上隅がくるようにウィンドウ位置を固定してしまっています。

ウィンドウの位置をいろいろいじりながらの開発で、バグを多数発見><
そちらの修正の方が手間取りました。

まだまだバグも多いでしょうけど、とりあえずファーストステップはクリアか???

2013年9月18日水曜日

要するにこういうことがしたいのねん

イメージとしてはこんな感じのが欲しいなぁ。

セカンダリモニタに2個目のUO起動し、VHScrCapでキャプチャ
KmPlayerでカメラデバイス指定して縮小表示



これを実現するには、ファーストステップとしてuoclistに以下の機能を付ける必要がある。

・マルチクライアント対応
・ウィンドウ位置をクライアント間でスワップ可能にする

これ、結構難しい><
uoclistってシングルクライアント専用に作りこんでいる(手抜きでグローバル変数使いまくってる)ので、変に手を出してバグるのが怖いからuoclistを複数起動することになる。
タスクバーにズラズラっとアイコンが並ぶのは美しくない。。。

追記:
exeだけでなくdllも複数対応が必要っす><
dllのshare領域で共有しているから。
手っ取り早い方法としては、
exe間の情報共有機能をつける、client.exeにhook済みのマークを書き込んでおく、dllは起動数分の複数イメージを用意
でしょか。うーむ。。。

仮想ディスプレイドライバ

調べてみたらあるじゃん^^
ジャンル的には仮想ディスプレイドライバ、っていうのか。
ちょっと検索するとZoneScreenがひっかかったので試用してみたけど、プロパティを見るとちゃんとモニタが増えますね^^

こんなのはどう???

(1) プライマリモニタに1個目のUOを表示
(2) 2個目のUOを起動して、仮想ディスプレイドライバで増やしたセカンダリ(サード、…)モニタに表示
(3) 2個目のUOのゲーム画面をキャプチャして、プライマリ画面にウィンドウ表示(縮小して表示)
(4) (3)のウィンドウをプライマリモニタ上でアクティブにすると、マウス操作、キーボード操作を(2)の2個目のUOに送りつける

要するに、2垢で起動したときに2垢目のUOへの画面切り替え、操作をいかにして楽にするかってことです。
僕の環境だと、1モニタでやっているので、どうしても切り替えが面倒。マクロがそれなりに機能すると、2垢目のUOへの操作はラフで構わないんだよなぁ。

ということで、まずは目的にぴったり合いそうな仮想ディスプレイドライバをまずは探してみます。

追記:
ごめんなさい。眠気でボケていたようです。
なにもグラボのアクセラレータが効かない仮想ディスプレイドライバでやる必要はなく、
デスクトップPCならセカンダリモニタが普通に使えるので、
「1つのモニタに2つのモニタ出力を接続すればよい」
だけのことですね。ノートだと厳しいので仮想ディスプレイドライバを使うしかないですが。
モニタに複数の入力端子があったことをすっかり忘れてました^^;;;

Windows7ネイティブモード

前々から気になっていたのですが、uoclistをWindows7(32bit/64bit)で動かすとどういうことが起きるか、やってみました。(VirtualBoxを使用)

(1) とりあえず動く?
(2) ウィンドウがちらつく(描画処理関係がXPと違う)
(3) フォント指定をしない場合、デフォルトのメイリオを使ってしまってウィンドウサイズがでかくなる
(4) 64bitの場合、CreateProcess()で起動したプロセス(client.exe)を終了させることができない

仕事ではWin7を使ってますが、Win7のUIはどうも好きになれないなぁ。XPのLuna好きだし。

もうひとつ、気になっていたのが、Windows7ネイティブモードでの起動。manifestをちょっといじってみたのですが、Vistaモードでしか動かない><
client.exeもVistaモードでの実行ですね。

で、本題の調査は、VirtualBox等を使っての仮想OS上UO起動に僕のPCがどれだけ耐えれるか。
結果、僕のPCじゃ無理><
クライアントを多重起動したほうがやっぱりパフォーマンスがいいわ。

仮想OSでなくて汎用的に使える仮想モニタってあるのか、調べてみたい。
仕組み的には仮想モニタのデバイスドライバを作成すればいいだけだと思うんだけど。

2013年9月16日月曜日

ログインオンライン

16周年記念アイテムをもらうために、全キャラのログインログアウトをしました。
一応2垢がアクティブになっていて、
(25*7+2*1)+(25*6+2*1)=177+152=329キャラw
おぉっと、数日前に作成したのが40キャラほどいたっけ。

結局2時間近くかかりました><

このためにuoclistの準備を進めていたのですが、、、

2013年9月14日土曜日

UOキャプチャ動画の作成方法

UOの画面をキャプチャして動画を作成する方法ですが、
僕が休止する前(4,5年くらい前)での僕的決定版が以下の方法です。

(1) Hmelyoff LabsのVHScrCap(DirectXフィルタ)をインストールする
(2) VHScrCapのキャプチャ位置を設定する
(3) おまけとしてついてくる動画保存ソフト、もしくは(DirectXフィルタなのだから)KmPlayerやVirtualDubで保存する

当時の話なのでWindowsXP(32bit)での動作なのですが、僕の持っているノートPC(core2duo 2GHz, 2Gメモリ, オンメモリ(?)のグラボ, WindowsXP)でキャプチャして作成した動画(無圧縮)のアップロード例を添付します。(アップロード時にだいぶ圧縮されちゃっています)

こちら

PC環境、Youtubeでのデータフローを考えて圧縮をいれないと、きれいな画質でアップロードできませんね、むしろそっちが重要なファクターということですか。
この方法ですが、WindowsVistaからGDI周りの実装が変更されたので、今どきのPCでのベストな方法なのかはよくわかりません。

で、VHScrCapとかは全部ソース付きで公開されていたので、UO専用にしたてることもできます。Hmelyoff Labs(たしかロシアの会社)、今はWebにまともにアクセスできないのですがどうしちゃったんでしょう><

以上、Razorのような動画キャプチャ機能、RPVでなくてもよければ追加するのは難しくないよね、って言いたかっただけですw



親知らずを抜いた

歯医者に長らく行ってない間に、親知らずが割れました。
その後、3ヶ月ほど歯医者に通って周辺を直し、今日やっと引っこ抜いてくれました^^;;;
麻酔で唇がいうことを聞かず、飲み物を口に含んでも閉じていられない><

uoclistの方は、起動時のバージョン判定に不具合があったので修正しました。
いきなりclient.exeのバージョンの子番号が11に上がるのは想定外でした><

追記: あぁぁx,時刻表示だけ修正が必要だ。。。どうも集中できずに間違えてしまった。
うーむ、整理すると、今、US,EUでは夏時間で+1, AUSでは冬だから+0, 北半球が冬に入るとAUSでは+1ってことかい???

2013年9月12日木曜日

JST -> ???

BOTを回していて、公表されている海外シャードのメンテ時間とその日本標準時の情報にズレがあることに気づきました。
要するに、サマータイムでずれているんですね><
なので、JSTを海外シャードの現地時間に直すコードを書きたくなったのですが、これがまた面倒そう。。。

→いつからいつまでが夏時間なのかを知る必要がある
→夏時間は年ごとに違う場合がある(DynamicDST)
→WindowsUpdateを適用していればWindowsがレジストリに保持する夏時間情報が更新される(?)
→SetTimeZoneInformation()/GetTimeZoneInformation()を使え
→SOFTWARE\Microsoft\Windows NT\CurrentVersion\TimeZonesの下のTZIを構造体にぶち込め
ということみたいで、単純に略称の英字3文字を入力として変換できるようなものではないようです><

2013年9月9日月曜日

バグってたから直したw

帰ってきてみたらBOTが中断してました。100回以上ログインすると不正終了します><
こっそり修正0.7.2.5

2013年9月8日日曜日

スプラッシュ画面のスキップ

Razorでおなじみのこの機能、追加してみました。(Version 0.7.2.4)
Debug起動時に有効です。
実装して初めて動かしてみたとき、思わず笑ってしまいましたよwww
あれ?これでいいの?って。今までの待機時間は何だったの^^;;;


このような変更(RazorやEUOでやっていることのハック)ですが、実は難儀な解析作業をしているわけではありません。
やり方さえ知ってしまえば、なんだそんなことか、と拍子抜けするかもしれません。
今回のスプラッシュ画面のスキップの解析を手順的に説明すると、

① Gumpをスプラッシュ画面の表示に使っている(しかも、アカウントの拡張パックの有無によって異なる)ので、client.exeのバイナリーのどこかにそのGumpIDがハードコーディングされているはず、と目星をつける。

② OllyDbgでGumpIDをバイナリーサーチして怪しい箇所を探しだす。

③ そのあやしい箇所とそれを呼び出しているコードの周辺をよく眺める

④ Razor経由で実行したときのclient.exeをOllydbgでアタッチし、メモリをbackupとしてファイルに保存する。

⑤ Razorを使用しないで実行したときのclient.exeをOllydbgでアタッチし、④のbackupファイルをロードする。

⑥ ③の怪しい箇所において、④と⑤の相違をOllydbgが赤字で指摘してくれるので、そのコード修正でどういう動作になるかを考察して、メモリ書換のコードを作成する。今回の場合、赤字のとおりに変更しただけw

Razorという現在も動作するお手本があるので、そのコピー作業をするだけです。
ただ、Razorにてこっそり実装されている機能が多いので、それを見ぬくセンスは必要ですね。

2013年9月7日土曜日

EasyUO、目をつけられる???

Pub83用のアドレス確認のため、OllyDbgでClient7.0.32のバイナリーを覗いていたのですが、、、


あらら、EUOX.exe, OpenEUO.exeの文字列をプロセスリストの中から探されちゃってるみたい^^;;;
このバージョンのClient.exeからかなぁ???
追記:) 調べてみたら、かなり前からこのコード入っていたのねwww

この手の対策、ハックされる側が圧倒的な不利なので(対策を回避する方が簡単にできるから)、やらないものだと思っていたのですけどね。ちょこっとEasyUOのサイト、フォーラムを覗いてみましたが、まだ落ち着いてない模様。

2013年9月6日金曜日

16周年

pub83がTCに入ったようですね。
僕は未だにクライアントのパッチ当ててないのですけどね。。。
クエストとか面白そうだったら(というか、時間勝負/期間限定アイテムが貰えるクエストだったら)週末にでもパッチ当ててみます。

で、ログインでキャラごと16周年プレゼントがきましたか。
今は、各シャードごとにキャラのスロットを1つは開けておいて、もし転送したくなっても大丈夫
な運用をしているのですが、年末までは全部のキャラスロットを埋めておきますか。
その前に転送したいなぁ。UOストアのセールはまだかなぁ。。。

新規に作成する25シャードの25キャラ分の名前をつけるのに困りますな。今回は何にちなんで名前をつけていこうか^^

2013年9月1日日曜日

やっと普通の生活に戻れる???

今までが異常でした。
撮りためたアニメとか整理してます。

DVDとか借りっぱなしで3ヶ月とかw
今日、やっと借りていたトーチウッドを見終えてTSUTAYAに返せる。。。
TSUTAYAのDVDレンタル、借りっぱなしでも特に催促とかされないのがいいのか悪いのか^^;;;

日本語モードと英語モード

client.exeの設定ファイルを見直していて、気づいた><
client.exeの設定をJPNにするか、ENUにするかで、見に行く設定ファイルのフォルダーが違うんだった。。。
そういえば、僕もFreeShardに遊びに行ったときに設定フォルダーのdefine値を変更した覚えがある。

英語モードでやっている方、いましたらごめんなさい。

追記:
ということで修正。

uoclist ver0.7.2.0

更新してみた。

client.exeをデバッガ起動する仕組み"だけ"追加しておいたので、あとあと機能を追加したい。
client.exeの起動時のスプラッシュ、省略したいよね。。。デバッガ起動にしたのでその辺の修正をしたいなぁ。
デバッガAPI、CONTEXT構造体って32bit/64bitをOSによって切り替えないと駄目かもしれない。僕は32bitOSしかテストできる環境がないので64bitはごめんなさい><

あとは表示更新とかパラメタ調整とか。

追記: さっそくバグが>< UO 2Dクライアントのインストールフォルダを記録しているレジストリ位置、新規インストールするとElectronic Artsの下に入るのね。