正直日記



2007/06/28

_ デフラグ大好き人間
あとprogress_displayのバーが伸びるのをボーッと見続けながらときに感動ときに興奮
出来たりする人はドモホルンリンクルの仕事が向いてるような気がしますが面接でそれ
をウリにしたら採用されるでしょうか場合によっては職務経歴書.sxwを印刷す(以下略)
_ コルーチンみたいな(4)
ソースがサルベージできたので置いておきます。ライセンスはNYSLで。
部品取りに使ってください。つか、部品しか入ってないんですけど。

coroutine_gba.zip

スタックサイズを変更する際は coroutine.S の該当箇所も直しておいてください。
( C で宣言したenum定数を gas から参照する方法が分からなかったらしい)

  add r1, r1, #(12 + 40 * 3)
                     ~~~~~~
エミュレータで気軽にメモリの中身が見られるから、0xffで埋めておいて各スタックが 積まれていく様子を眺めたりすると、デフラグ好きの人にはかなりエキサイティングな んじゃないでしょーか。

2007/06/26

_ 脅威が消えたのは良かったが
俺のしょっぱさは永遠に人々の胸に刻まれることとなってしまった。まあいいか。
_ やっほー原因分かったよ
C:\WINDOWS\SVCHOST.EXE  (24,576 bytes) なるファイルが出来てた。いつのまに。
見てみると……



"レースゲーム"  "MFC アプリケーション" のショボさが泣ける。
あーそういえば知人から送られてきたレースゲームを実行したような覚えがある。



うう、当たりっぽい。.cppのあるディレクトリが根こそぎやられていた。
オンラインスキャンでは引っかからなかったよ。間に合わなかった。

2007/06/25

_ なんでやねん
セーフモードで起動しファイナルデータでサルベージしてたら、サルベージが終わった
ら、元のデータディスクに上書きで戻してたら、時間かかるからちょっと仮眠をとって
たら、バンバン音がするから、起きてたら、目が覚めてたら、また昨日と同じ状況が発
生していて、サルベージ用にIDE-USBで繋いでいたドライブのファイルまで消されてた。

色々酷くて、自分でも笑ってしまったよ。

昨日書いた、消された状況推測の外しっぷりとか
サルベージしたデータをすぐに上書きで戻したこととか
またすぐ消えたこととか。



消えたサルベージをサルベージするためのディスクを用意しないと。あと、まっさらな
Windowsをインストールするためのディスクも必要だなあ。面倒だからと手抜きしてセー
フモードで甘んじた俺が悪い。

欲をいえば、Linux上でNTFSのMFTを解析して消えたファイルを抽出できるような何かが
ほしいところ。無いかなあ。無いか。

2007/06/24

_ 豚の味がするらしい牛肉コロッケ、実は食べてたから今日は、アブラ記念日
テレビ報道で映ったパッケージに超・見覚えがあったのだった。野菜や生鮮食品とかは
製造者の名前つきでやってくるからまだいいけど(いいのか)、加工食品は生協だから
といって信用出来るとは限らないということか。でもねでもね、俺が口にしたのは牛の
味だったように思うよ。
_ 今さらAS2.0
他人のソースを見ていて思ったのだけど

while (1) {
  if (hoge == nantoka) {
    break;
  } else {
    var hoge = nantoka;
  }
}

みたいな構文が合法らしいFlash MXのAS2はなんか凄い気がする。狐につままれた気分
というか。mtasc/heXaではコンパイルエラーが出た。

VC6の、for構文内で宣言した変数のスコープが外まで突き抜けるのと似たようなものか
しら。
_ き、き、きえええええええ


目が覚めたらsvchost.exeのエラーダイアログと共にcleanmgr.exeががっつり動いていて、
データディスクの空き容量が15GiBほど増えていた。何が消えたのかと確認したら以下の
フォルダの中身がごっそり消えていた。

 MyProject/AGB/Project/*
  (GBAプログラムのソースとか)

 Web/Archives/*
  (webでダウンロードしたzip・rarとか、最近は仕分けがめんどくてjpgとかmp3とか
  なんでもここに保存していた)

なんか凄く人為的なものを感じるんだけど……俺にとって消えたら困るものに限って消
えてるようだ。すぐさま電源を落として(ういんどうずユーザは気軽に電源を切ります)
うぶんつOSをLiveCDで立ち上げる。NTFSパーティションをマウント。

  $ id
  uid=999(ubuntu)

  $ sudo mkdir /mnt/winxp
  $ sudo mount -t ntfs /dev/hda1 /mnt/winxp -o uid=999,iocharset=utf8

システムドライブを見て何が起こったのか推測。

 ・/WINDOWSフォルダに以下のファイルが出来ていて、ドライブの空き容量がほぼ0。
     /WINDOWS/fff_0_0.dat (1073741824 バイト)
     /WINDOWS/fff_0_1.dat (1073741824 バイト)
     /WINDOWS/fff_0_2.dat (84934656 バイト)
     /WINDOWS/setupact.log

 ・setupact.logの中身は最後にWindowsをインストールした時点と比べて、以下の内容が
   増えているだけ。
     BITSINST 2007-02-19 20:43:02  Success  BITSINST execution has finished. Error code is 0x0.
      Warning     Uninstall: Failed to retrieve registry entries
      Warning     Uninstall: Failed to retrieve registry entries
      Warning     Uninstall: Failed to retrieve registry entries
      ...
      (同じ行が延々と続く)

  ・ドライブ中で、一番タイムスタンプの新しいフォルダは /WINDOWS/prefetch

  ・その中に、寝ている間に出来たらしいバイナリは古い順に
      DEFRAG.EXE-hoge.pf
      DFRGNTFS.EXE-hoge.pf
      CLEANMGR.EXE-hoge.pf
      TASKMGR.EXE-hoge.pf (←これは起きてから慌ててCtrl-Shift-Escで出した)

  ・寝る前にFFFTPで大きめのファイルをアップロードしてた気がする

つまりこれらの情報をまとめて推測すると、FFFTPがなんらかの原因で異常になり、延々
とシステムフォルダにfff_0_*.datなるダンプを吐きつづけた結果、空き容量がなくなっ
たのでdefragとcleanmgrが起動し、Cドライブから順々にパーティションをナメていき、
たまたま過去にシステム関係のアップデートファイルか何かをダウンロードしたことが
ある(とは思わないんだけどなあ少なくともAGBの方は)、件のフォルダの中身をごっそ
り消した……と?

なんらかのトロイを踏んだかと思った、怪しいのは先日ここに書いたBlumenmachtくらい
しか思い付かなかった、そんなものを俺は紹介したのか、と青くなっていたので、原因
らしきものが判明しつつあるらしいと多少気分が良くなったものの、またファイナルデー
タ先生の世話になるのかと思うと、やっぱり憂鬱だ。

しっかし、Windowsのダメっぷりも大概だけど、俺の厨房っぷりも相当なもんだなあ。
まいった。完全に。

追記:ffftpは全く関係ありませんでした。

tekezo > コルーチンwktkしてましたが、それどころじゃなくなりましたね。 御愁傷様です。  (2007/06/24 21:37:06)
> どもですヽ(´ー`)ノ ファイルは消えたてホヤホヤなので復活出来るかもしれないっす。コルーチンの需要あるなら、復活できたらアップしようと思います。(『俺実装』ですが……)  (2007/06/24 22:53:52)
sato_tiff > ncftp つかいましょーよ  (2007/06/26 00:06:50)
> ffftpがいいんだもん。  (2007/06/26 11:30:14)

2007/06/21

_ wiiで動画を垂れ流す
wiiとRimoの相性がかなり強まってるのだが、wii版Rimoは動画のシークが出来ないのが
難だなあと思う。

そんなRimoに刺激され、キャプっておいた動画をLAN経由してwiiで見られたらおもろい
かと思い、視聴環境を作ってみた。



まずはffmpegを使ってSorenson H.263(flv1)でエンコしDBに登録する。ffmpegのオプショ
ンは下記のようにした。

  -ac 1 -ab 48 -ar 22050 -sameq -r 15 -aspect 16:9 -s 356x200 

-bが効かんようなので-sameqを指定した。元ソースによるけど 800Kbpsくらいになってる
かな。解像度が低いのでジャギジャギするけど解像度を上げるとコマ落ちするので諦めた。
ジャギは見てるうちに気にならなくなる。

で、それを取り合えずのJW FLV Playerで見る。スタイルシートで800x450を指定すると
ほぼピッタリ収まる。動画サイズがでかいので最後まで見られるか不安だったけど、通
して見る分には平気なようだ。シークしようとすると高確率で止まってしまう(続きが
見られなくなる)のだ。

かなりうまくいったので、プレイリストを垂れ流せるFLVプレイヤを作ろうと思ったよ。
そしたら24時間耐久エヴァホーダイだぞ。まあ思っただけだけど。

2007/06/19

_ タブ全消しでーす
Firefoxはブックマークのフォルダを中クリック(あるいは右クリック→Open All in 
Tabs)すると、今まで開いていた数十のタブを無かったことにしてくれるので異常。

古いタブを消して新しいタブを開いている間重たくなるので、その隙にkillして再起動
→Restore Sessionすればいいものの困る。古いタブはそのままに新しいのを開いてく
れればいいのに。
_ コルーチンみたいな(3)
ふおおおおお、libpclのソースを見てみたら、co_exit_toの動作が俺の想像するものと
違ってた。co_resume_toとでもしておくか……。

2007/06/18

_ Blumenmacht がヤバい
http://www.youtube.com/watch?v=Hsiwvbxu0uQ


http://www.shmup-dev.com/forum/index.php?topic=1167.0

動画見てもどんなゲームなのかさっぱり分からないが、実際にやってみても全く分から
ない!敵をロックして名前を入力することでハッキングして幸福にするゲームらしい。

画面がモーレツにケバケバしく、ウェインキャットを彷彿とさせる。音楽もひたすらルー
プで洗脳性があり、ある意味ビデオドラッグなのかもしれないと思った。
_ コルーチンみたいな(2)
結局スタックサイズは{r4-lr}で44*3=132バイトにした。*3にしたのはなんとなく。

作ってて思ったのは、呼び出し側からすれば「関数へ飛んだと思っていたらいつのまに
か戻っていた」気分だろうなーってことと、C文法で直接挙動を書くのはすげー楽だし
馴染む、実に!馴染むぞォーー!!!

あとステート飛ばすのはco_exit_toでやった。関数分割自体はそういうもんだと思うし。
擬似タスクでコード直書きしたときとか、スクリプトで書いてたときも分割してた。

2007/06/16

_ コルーチンみたいな
http://shinh.skr.jp/m/?date=20070612#p02

こる〜ちんは一応考えていたものの、名前の割には全然小さくないなーと思って敬遠し
てた。スタック馬鹿食いというイメージがあって、えーとARMだとr0-r12,lrを都度保存
してsp切り替えってやるんだと思うけど子ルーチン一つにつき56バイトかよ!おまけに
使ってるかも分からないレジスタまで保存して!そのうえ個別にスタック領域を用意し
てやらないといけないし。

などと言い訳して全然やってなかった。
でも突っ込みが入ったのでやってみる。

とりあえず、使ってないレジスタがあったらいいなーくらいの気持ちで、自分のプロジ
ェクトをobjdumpして.text(thumbステート)と.iwram(ARMステート)それぞれの、dst
レジスタを抽出してみた。

 --- arm ---   --- thumb ---
 r0 = 604      r0 = 2479
 r1 = 648      r1 = 2248
 r2 = 629      r2 = 2542
 r3 = 1193     r3 = 2984
 r4 = 93       r4 = 1460
 r5 = 91       r5 = 1042
 r6 = 56       r6 = 965
 r7 = 28       r7 = 721
 r8 = 26       r8 = 116
 r9 = 18       r9 = 60
 sl = 20       sl = 92
 fp = 13       fp = 41
 ip = 316      ip = 63
 sp = 23       sp = 70
 lr = 153      lr = 15
 pc = 3        pc = 2

うう、満遍なく使われてる。thumbはハイレジスタを全く使ってないだろうと思ってい
たら意外と使ってた。コンパイラがarm-elf-gccなので、arm-eabi-gccだとまた違った
結果が出るんだと思う。

次にスタックサイズを見積もろうと、checkstack.agb.plを使ってみたものの、よく考
えたらコルーチン内で関数を極力呼ばないようにすればいいだけのことなので、あまり
意味が無かったという。

全然関係ないけどcheckstack.agb.plはthumbに対応してなかったので、修正してアップ
し直した。

コルーチンの実装はまた明日!
_ モーション補間みたいな
絵だけは綺麗だと評判の2Dアクションゲーム(仮に、某OSとする)をやっていたのだが
なんかもうタイトル画面からしてガクガクして見えるような。テレビのせいかも分から
んけど。

でキャプってコマ送りで見てたりするんだけど、頂点変形だけで処理してそうなパーツ、
具体的には妖精の女王の羽とかのコマ数が明らかに少なかったりして、滑らかアニメな
んだろうと思っていたら意外と滑らかじゃなかったという印象を受けた。(勝手に期待
を膨らませて、実物と妄想とのギャップに落胆するのは、オタのありがちな悪い癖なの
でやめましょう)

えーと要は、中割りを補間できるところはしたらいいんじゃない?ってことで、実際に
やってみることにした。

人体をパーツに分けてそれぞれボーンを仕込み、位置・角度・長さそれぞれを線形補間
してアフィン変換で……



まずは簡単そうな真正面を作ってみた。

つーか俺が間違ってた。

  

ライトフックみたいな奥行きのあるモーションを考えて、キーフレーム毎にスプライト
一個一個手付けでボーンを仕込むようにしたんだけど、すげーめんどい。補間とか以前
に、1コマ表示するだけでめんどい。

データ作っている間は、足元の地形に合わせてつま先→膝→腰とフィードバック出来る
ようにしたら面白そうじゃん?とか妄想していたけど、コーディングしながらどんどん
やる気が萎んでいった。

2007/06/11

_ 俺スクリプトから俺VMへ
満遍なく恥ずかしいから読まなくていいよ。

最初はごく単純な、上から下に流れるだけのスクリプト。
HELI_1_A:
 ROTA 64
 SPDA 16
 WAIT 14
 SPDR -1
 WAIT
 SPDR -1
 :
 AIM
 SHOT 0, 8
……だったのが、やはりループは必要だろうということでGOTO〜FORへと進化。
HELI_1_A:
  ROTA 64
  SPDA 16
  WAIT 14
  FOR 10
    SPDR -1
    WAIT
  ROF
  AIM
  SHOT 0, 8
   :
IFがFIで終わるなら、FORをROFで終わらせたっていいじゃないか。 つーか分岐にすれば汎用的じゃね?ということで、ついでに簡単な計算も出来るよう にする。あとループのネストとかサブルーチン用にスタックを設けたような気がする。
HELI_1_A:
  ROTA 64
  SPDA 16
  WAIT 14
  PUSH a, 10
_1:
  SPDR -1
  WAIT
  SUB  a, 1
  JNE  _1
  POP  a
  AIM
  SHOT 0, 8
   :
逆に見通し悪くなったような……。でも自機との距離によって挙動を変えるヘリを作る にはこうするしか無かったんだ(と思う、このサンプルだとそこまでやってないけど)。 しかし、ここらへんまで来て、Cで直接書いたほうが早かったような気がして、いや 直接書いたらえらいめんどかったからこうしてたはず、って何がめんどかったんだっ け、あーそうだWAITだ。ただ待つだけの記述がえらい面倒だったんだよ。
void Heli_1_A(ENEMY* en) {
  if (en->cnt == 0) {
    en->dir = 64;
    en->spd = 16;
  } else
  if (en->cnt < 14) {
    /* nope */
  } else
  if (en->cnt >= 14
      && en->cnt < (14+10)) {
    en->spd--;
  } else {
    Shot(en, 0, 8, Aim(en, myship));
    en->proc = Heli_1_B;
  }
  en->cnt++;
}
なんだこれは。ちょっと反省した。
void Heli_1_A(ENEMY* en) {
  if (en->cnt > 14) {
    en->proc = Heli_1_B;
    en->cnt = 0;
  }
  en->cnt++;
}
void Heli_1_B(ENEMY* en) {
  if (en->cnt < 10) {
    en->spd--;
  } else {
    en->proc = Heli_1_C;
    Shot(en, 0, 8, Aim(en, myship));
  }
  en->cnt++;
}
まだ反省できそうな気がするものの心が折れ折れなので、俺は逃げた。 で、スクリプトの話に戻るけど……(続く)
_ 40fpsがなぞい
Windows95の時代あたりにGDIとかで作られたリアルタイム系ゲームを見ていると40fps
の物が多いような気がした。なんで40fpsなんだろう?30fpsじゃいけなかったんだろう
か。60/1.5では中途半端だと思うんだけど……。
_ あー
一ヶ月何も書かないとか普通になりつつある。いかんよ。

> いっそのこと買った青年コミックの記録をつけるのはどうだろう  (2007/06/11 03:00:13)
> 成年、か  (2007/06/11 03:00:33)
> GBA homebrewとかその周辺の話題に特化しちゃったのがまずかったよねー。  (2007/06/11 04:15:36)
> 1000(msec)/40(fps)=25(msec)丁度になるからじゃないでしょうか?>40fps  (2007/06/11 18:49:14)
> ああ、タイマー絡みですか。実は50fpsの物も多いなと思ってた所なんですが、こちらも1000/50=20で割り切れますね。なるほど、納得です。  (2007/06/11 22:42:25)

最新
2010 | 01 04
2009 | 01 02 03 04 05 06 07 09 10 11 12
2008 | 01 02 03 04 05 06 07 08 09 10 11 12
2007 | 02 03 04 05 06 07 08 10 11 12
2006 | 01 02 03 04 05 06 07 08 09 10 11 12
2005 | 01 02 03 04 05 06 07 08 09 10 11 12