No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 48 | 49 | 50 |...| 57 | 58 | 59 || Next»

区間が重なるか?

数直線上に一定周期で一定幅を持つ区間が並んでいると.そんなのを二つ持ってきたときに何処かに重なる部分がありますかという問題を解きたい.当初あほな私は for 文を繰り返し幅の lcm 文にいたるまでぶん回していたのだが... よく考えたら gcd の分だけできるだけ近づけて考えれば一発でいいじゃんと.いやぁ,あほだった.

ICPCの問題を久々に

ある期間内に存在する指定した曜日と日にちをもつ日の数を数えたり,グラフ上を巡回するアリ全部に対して情報伝達可能かどうかをしらべたり.そんな問題を解いたわけだが... コーディングが遅くなっているような... 最近この手のプログラムかいとらんかったからなぁ.いや,むしろ日付問題が苦手なだけだだろうか? まあ,そんなことはどうでもよいのでさっさといやらしい入力を作るか.

永夜抄のデータ解析

友人がリプレイファイルの解析をやっていたのでデータファイルの解析をやってみた.結論としてはブロックに切ってスクランブルしてマスクでXORして,LZで圧縮かけて(アドレス13bit, 長さ4bit, 絶対アドレス(開始オフセット1)),全部をがしゃんとくっつけて最後にファイル名とアドレスと展開後のサイズの情報をまとめてLZかけてスクランブルしてくっつけてあると.んで,先頭には識別文字4つとファイル情報のエントリ数,アドレス,展開後のサイズがスクランブルされて格納されていると.

いやぁ,結構手間がかかってるもんだなぁと関心しつつ,ここまでやらなきゃだめなのかと思ったり.あと,LZのパラメータが何でこの数字になっているのかよくわからない.バイト境界になるようにアドレスと長さのビットを割り振って,さらにフラグを8つまとめて置いておくほうが展開が速いと思うのだが... そこまで速度はいらないのかな.むしろビットストリームのほうがぱっと見で元データがわからないからいいのかも.

どうでもいいけど,何でこの永夜抄のアーカイブに妖々夢のPhantasm出現時に表示される画像データが入っているのだろう?

C言語のmain関数を変数として定義

なんとなく思いついたのでやってみた.C 言語で書いたプログラムの(ブートストラップ後の)エントリポイントは main 関数なわけだけど,アセンブラレベルでは結局のところ call main して main というラベルにとんでいるだけ.ということは,main は別にC言語の関数ではなく変数でもよい(main というラベルが作られる).これを実証するコードは以下のとおり.

こいつは HelloWorld を表示するが,main は関数でなく変数である.

#include <stdio.h>
 
int f()
{
	printf("HelloWorld!\n");
	return 0;
}
 
int main[] = {0xB8909090, (int)f, 0x9090E0FF};
 
/*
int main  = 0xB8909090;
int main2 = (int)f;
int main3 = 0x9090E0FF;
 */
/*
struct main {
	int m1;	int m2;	int m3;
} main = {0xB8909090, (int)f, 0x9090E0FF};
 */

main の定義をコメントアウトしている形(構造体,複数個の連続した変数)にしても動く.原理としては main というラベルに飛ばされてくるので,そこに関数本体である f へのジャンプを行うマシン語を埋め込んで f へジャンプさせる.ジャンプのコードはi386で

90             NOP
90             NOP
90             NOP
B8 XXXXXXXX    MOVE EAX, f
FF E0          JMP EAX
90             NOP
90             NOP

とかけるので,これらのマシン後が実行されるように main 変数に値を入れている.

ついでに C++ 版も.

#include <cstdio>
struct main {
	int ins[5];
	static int f() {
		puts("HelloWorld!");
		return 0;
	}
} main = {0xB8909090, (int)(main::f), 0xE0FF};

PHPのあっぷろーだ

とある事情でアップローダが必要になったので,ついでだからと PHP の勉強のためにゼロから組んでみた.とにかくファイルをあげるだけでいいので名前を「あげるだけ」にしつつ適当に組んだはいいが,PHPはデバッグがしにくいことに後で気づき,実際デバッグに時間をむちゃくちゃとられた.とにかくセミコロン忘れて何も表示されないとかいうのがやたらと... ああ,面倒だ.とりあえずアップと削除ができるようになったから一段落.どっかにやっちゃう可能性が高いのでソースを置いておこう.

DirectX + LayeredWindow

WS_EX_LAYERED を指定して透明色を指定した上でその指定職を背景にしてDirect3Dで描画するとうまく背景をすかしたDirect3Dができるだろう,と考えて実験してみた.面倒なのでテスト用のソースは人からもらっといていろいろやってみたら,なぜかウィンドウの一部を画面外にするとうまくいくことを発見.何かのバグなのかなぁとか思ったりするけど面白い現象ではある.何とかうまくできないかなぁ,面白いねたになりそうな.

«Prev || 1 | 2 | 3 |...| 48 | 49 | 50 |...| 57 | 58 | 59 || Next»
Search
Feeds

Page Top