あとprogress_displayのバーが伸びるのをボーッと見続けながらときに感動ときに興奮 出来たりする人はドモホルンリンクルの仕事が向いてるような気がしますが面接でそれ をウリにしたら採用されるでしょうか場合によっては職務経歴書.sxwを印刷す(以下略)
ソースがサルベージできたので置いておきます。ライセンスはNYSLで。 部品取りに使ってください。つか、部品しか入ってないんですけど。 coroutine_gba.zip スタックサイズを変更する際は coroutine.S の該当箇所も直しておいてください。 ( C で宣言したenum定数を gas から参照する方法が分からなかったらしい)エミュレータで気軽にメモリの中身が見られるから、0xffで埋めておいて各スタックが 積まれていく様子を眺めたりすると、デフラグ好きの人にはかなりエキサイティングな んじゃないでしょーか。add r1, r1, #(12 + 40 * 3) ~~~~~~
セーフモードで起動しファイナルデータでサルベージしてたら、サルベージが終わった ら、元のデータディスクに上書きで戻してたら、時間かかるからちょっと仮眠をとって たら、バンバン音がするから、起きてたら、目が覚めてたら、また昨日と同じ状況が発 生していて、サルベージ用にIDE-USBで繋いでいたドライブのファイルまで消されてた。 色々酷くて、自分でも笑ってしまったよ。 昨日書いた、消された状況推測の外しっぷりとか サルベージしたデータをすぐに上書きで戻したこととか またすぐ消えたこととか。消えたサルベージをサルベージするためのディスクを用意しないと。あと、まっさらな Windowsをインストールするためのディスクも必要だなあ。面倒だからと手抜きしてセー フモードで甘んじた俺が悪い。 欲をいえば、Linux上でNTFSのMFTを解析して消えたファイルを抽出できるような何かが ほしいところ。無いかなあ。無いか。
テレビ報道で映ったパッケージに超・見覚えがあったのだった。野菜や生鮮食品とかは 製造者の名前つきでやってくるからまだいいけど(いいのか)、加工食品は生協だから といって信用出来るとは限らないということか。でもねでもね、俺が口にしたのは牛の 味だったように思うよ。
他人のソースを見ていて思ったのだけど 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は全く関係ありませんでした。
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時間耐久エヴァホーダイだぞ。まあ思っただけだけど。
http://www.youtube.com/watch?v=Hsiwvbxu0uQ http://www.shmup-dev.com/forum/index.php?topic=1167.0 動画見てもどんなゲームなのかさっぱり分からないが、実際にやってみても全く分から ない!敵をロックして名前を入力することでハッキングして幸福にするゲームらしい。 画面がモーレツにケバケバしく、ウェインキャットを彷彿とさせる。音楽もひたすらルー プで洗脳性があり、ある意味ビデオドラッグなのかもしれないと思った。
結局スタックサイズは{r4-lr}で44*3=132バイトにした。*3にしたのはなんとなく。 作ってて思ったのは、呼び出し側からすれば「関数へ飛んだと思っていたらいつのまに か戻っていた」気分だろうなーってことと、C文法で直接挙動を書くのはすげー楽だし 馴染む、実に!馴染むぞォーー!!! あとステート飛ばすのはco_exit_toでやった。関数分割自体はそういうもんだと思うし。 擬似タスクでコード直書きしたときとか、スクリプトで書いてたときも分割してた。
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コマ表示するだけでめんどい。 データ作っている間は、足元の地形に合わせてつま先→膝→腰とフィードバック出来る ようにしたら面白そうじゃん?とか妄想していたけど、コーディングしながらどんどん やる気が萎んでいった。
満遍なく恥ずかしいから読まなくていいよ。 最初はごく単純な、上から下に流れるだけのスクリプト。……だったのが、やはりループは必要だろうということでGOTO〜FORへと進化。HELI_1_A: ROTA 64 SPDA 16 WAIT 14 SPDR -1 WAIT SPDR -1 : AIM SHOT 0, 8IFがFIで終わるなら、FORをROFで終わらせたっていいじゃないか。 つーか分岐にすれば汎用的じゃね?ということで、ついでに簡単な計算も出来るよう にする。あとループのネストとかサブルーチン用にスタックを設けたような気がする。HELI_1_A: ROTA 64 SPDA 16 WAIT 14 FOR 10 SPDR -1 WAIT ROF AIM SHOT 0, 8 :逆に見通し悪くなったような……。でも自機との距離によって挙動を変えるヘリを作る にはこうするしか無かったんだ(と思う、このサンプルだとそこまでやってないけど)。 しかし、ここらへんまで来て、Cで直接書いたほうが早かったような気がして、いや 直接書いたらえらいめんどかったからこうしてたはず、って何がめんどかったんだっ け、あーそうだWAITだ。ただ待つだけの記述がえらい面倒だったんだよ。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 :なんだこれは。ちょっと反省した。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++; }
Windows95の時代あたりにGDIとかで作られたリアルタイム系ゲームを見ていると40fps の物が多いような気がした。なんで40fpsなんだろう?30fpsじゃいけなかったんだろう か。60/1.5では中途半端だと思うんだけど……。
一ヶ月何も書かないとか普通になりつつある。いかんよ。