‘開発ネタ’ カテゴリーのアーカイブ

2012.7.1 DSAI を再起動させたいなぁ、という話

社畜人生が開幕して、しばらくは Visual Basic とか書かされてました……。

気持ち悪い言語だなー、と思わなかったと言えば嘘ですが(;´∀`)
年に1つくらいは新しい言語を習得するのは、まぁ悪くないとは思います。
マクロなんか使ったことないけど、Excel VBA に転化して生きてくる技術なのかしら?

配属後は、若年層からは忌み嫌われる COBOL を扱う羽目になりそうですが
まぁぼちぼち生きていければなぁ……、といった感じ。

Sub Function func(ByVal str as String) as Integer
	dim i as Integer
	If String.tryParase(str, i) Then
		Return i
	ElseIf
		Return -1
	End If
End Sub

↑<てきとーに書いた、文字列を数値に変換する関数>
言語にはそれぞれ良さがあって、活かすのはコード書く側とは言うけど
エラい冗長なコードになるし、その割に可読性悪いし、三項演算子使えないし(IIF関数とかあるんすねー)……。
個人的には苦手だなぁ(;´∀`)

まぁ、そんな感じで社畜人生の中でまともなコードを書ける機会って案外なさそうなんで。
そもそもコードなんて趣味で書けばいいや、というスタンスなのは今も昔も変わらないのは変わらんのですがー。

php なんかは存在が軽い言語なんで暇ときでもサクっと書けるんですが、
C++ で開発しようと思うと上手い具合に時間を用意しないと難しいですよねー。
ぼちぼち、なんか考えていかないとなー、ってことで DSAI がそのうち再起動するかも、という予定。

冬コミに向けて動きたいのであれば自分自身のスケジューリングをせんとなー(;´∀`)

2012.7.1 VMware と BootCamp で Windows のライセンスが衝突した

VMware ver.2 を ver.4 にアップデート、
ついでに Windows 7 も再インストール、とやったのが 3月中旬。

以降、Windows 7 から「ライセンスキーが無効だぞオラァ!」と、どやされる日々が続き
持ってる2つのキーを入れ替えつつ誤魔化してたんですけど。

いい加減めんどくさくてなってきたので、Google先生に原因を聞いて見ると、

Boot Camp環境にインストールしたWindows7をVMware Fusionからも起動した場合のWindowsライセンス警告をfix – ham68616dのメモ

といった症状らしい。うっかり VMware 側からライセンスの認証を行うと、
VMware と BootCamp で二重にアカウントが計上されるとのこと。
もしや MSDN AA 経由で取得した OS のライセンスが凍結されたのかと思ったのですが、
流石にそんなことは無かった(;´∀`)

リンク先にあるように、以下の手順で解決。

  • Windows のレジストリを修正
    (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\vmrawdsk\Parametersの、”windir”キーの値を、”C:\windows”に)
  • vmxファイルを修正
    (Library/Application Support/VMware Fusion/Virtual Machines/***/***.vmwarevm を右クリでパッケージ展開、ファイル末尾に SMBIOS.reflectHost = “TRUE” を追記)
  • VMware tools を再インスコ

2012.1.18 冬コミお疲れ様でした の2

冬コミお疲れ様でした、
ということでこっちは業務連絡ような。

まずは業務連絡から、
冬コミで頒布した「AIに『ダブルスポイラー』をプレイさせる本」ですが、
余った分を大須マニアックス様にて委託して頂くことになりました。
これは有難い……。
相当にニッチな本ですが、もしご興味があればどうぞよろしくお願いします。

そして以下は、会場で頂いた幾つかの疑問や意見への現状での回答。
会場では結構リップサービスしてたと思うんですがそこら辺は勘弁して下さい(;´∀`)

> ソースコードの公開はしないの?

前向きに考えてはいるんですが、現状コードが汚すぎて無理っすという感じ。もし公開するにしても、もうちょい(?)コードクリーニングしてからでしょう。少なくとも特殊ライブラリを使ってる部分は平易に直さないなぁといったところ。マニュアル作るのもめどいし結構辛いなこれ……。

> 動画は公開しないの?

2011年12月30日時点で、東方Projectのプレイ動画のweb上での公開はまだアウトの状態なんでちょっと無理ですね。リプレイの配布なら可能なんですが、よほど特殊なリプレイでもない限りちょっと有難味がないような……。

> 未来予測とか学習とか

機械学習についてはSVM使って光学文字認識を軽く実装した程度の知識ですが、もしパターン構築の方向に進むならアプローチとしては王道ですね、といった感じ。
未来予測については、これから精度向上をするにあたって手を付けたい方向性の1つですね。オプティカルフローみたいなので、画面内の弾幕のベクトルを取得してー、みたいなことが出来れば色々と応用が効きそうですが果たして……。

2011.2.21 Canvas を使ってなんか作ってみた

ここんとこですが、なにか作りたいぞ欲求がわりかし高まっていまして。クソゲーを産出するのは Flash が常道なんでしょうけど、Flash の開発環境用意するって実際問題面倒ですし、お手軽に出来そうなモノとして Canvas をさわってみました

Canvas ってのは HTML5 で策定された html 上で図やらを表現する技術でして、Javascript なんかと連動することでうまい具合に頑張れば Flash を使わずにリッチコンテンツが提供出来るってことで、流行っているような技術みたいなものです。そーいえば FIrefox の 4 はいつになったらリリースされるのでしょうか?

さて、そんなワケで Canvas ってどんなもんかな、ってところも含めて軽くさわってなんか作ってみました、いわゆるサンプルプログラム、というのもおこがましい……

http://trr.sakura.ne.jp/php-test/110221.php

こういったアクションっぽいゲームっぽい、のコードを書くのって実は今迄経験がなくて、若干悪戦苦闘しつつジャンプの処理やらマップチップとの当たり判定の処理なんかをサクサクっと書いてこんな感じです。意外にまともに動いてくれます。

さて、どうしようかなー

2011.2.18 先日のちょっとした補足、キャラの名前間違ってたらごめんなさい

先日のアレですが、こんな感じで html が生成されます

http://trr.sakura.ne.jp/php-test/110217.php

ウンコなぺちぱーはこの世にソースコードを公開するなんて許されざる風潮を感じないでもないですが、まぁ大したことはやってないんで以下のような感じです。入力をなんとかして、配列をデータベースに格納すればもうちょい実用的ななにかになる可能性を感じないでもないけど、まぁ個人の道楽の為にコードなんて書いてなんぼなので(^o^)

よく分からない人に軽く補足しておくと、まぁ下記のコードの 49行目の $rank と、69行目の $rankNotes を追加していくだけで、以降は勝手に表を生成してくれるという話です。多少手間はかかってますが便利でしょ

// 表のタイトル
echo "<h2>【東方キャラソート 〜結果推移を php で可視化してみる〜】</h2>";
// 作品とキャラの対応を定義
function getTitleName($id) {
	$title = array(
		array(1,2,3,4,5,6,7,8,9), array(10,11,12,13,14,15,16,17,18,19,20), array(21,22,23,24,25,26,27,28,29),
		array(30,31,32,33,34,35), array(36,37,38,39,40,41,42,43), array(44,45,46,47,48,49,50,51),
		array(52,53,54,55,56,57,58), array(59), array(60,61), array(62), array(63,64), array(65,66,67),
		array(68,69), array(70), array(71,72), array(73), array(74,75,76));
	for($n=0;$n<count($title);$n++) {
		if(in_array($id,$title[$n])) break;
	}
	switch ($n) {
		case 0 : $col = "#A44"; $str = "東方紅魔郷"; break;
		case 1 : $col = "#88C"; $str = "東方妖々夢"; break;
		case 2 : $col = "#A4A"; $str = "東方永夜抄"; break;
		case 3 : $col = "#E88"; $str = "東方花映塚"; break;
		case 4 : $col = "#4A4"; $str = "東方風神録"; break;
		case 5 : $col = "#C60"; $str = "東方地霊殿"; break;
		case 6 : $col = "#28F"; $str = "東方星蓮船"; break;
		case 7 : $col = "#86F"; $str = "東方萃夢想"; break;
		case 8 : $col = "#C44"; $str = "東方緋想天"; break;
		case 9 : $col = "#888"; $str = "ダブルスポイラー"; break;
		case 11 : $col = "#CA4"; $str = "東方三月精"; break;
		case 12 : $col = "#888"; $str = "秘封倶楽部"; break;
		case 13 : $col = "#888"; $str = "東方求聞史紀"; break;
		case 14 : $col = "#888"; $str = "東方香霖堂"; break;
		case 15 : $col = "#C22"; $str = "東方茨歌仙"; break;
		case 16 : $col = "#888"; $str = "東方儚月抄"; break;
		default : $col = "#888"; $str = ""; break;
	}
	return "<span class='title' style='color:" . $col . ";'>" . $str ."</span>";
}
// キャラの名前を定義
$name = array( "ダミー",
	"ルーミア", "大妖精", "チルノ", "紅 美鈴", "小悪魔", "パチュリー・K", "十六夜 咲夜", "レミリア・S", "フランドール・S", "レティ・W",
	"橙", "アリス・M", "リリーホワイト", "リリカ・P", "メルラン・P", "ルナサ・P", "魂魄 妖夢", "西行寺 幽々子", "八雲 藍", "八雲 紫",
	"リグル・N", "ミスティア・L", "上白沢 慧音", "因幡 てゐ", "鈴仙・U・イナバ", "八意永琳", "蓬莱山 輝夜", "上白沢 慧音", "藤原 妹紅", "リリーブラック",
	"メディスン・M", "射命丸 文", "風見 幽香", "小野塚 小町", "四季 映姫・Y", "秋 静葉", "秋 穣子", "鍵山 雛", "河城 にとり", "犬走 椛",
	"守谷 早苗", "八坂 神奈子", "洩矢 諏訪子", "キスメ", "黒谷 ヤマメ", "水橋 パルスィ", "星熊 勇儀", "古明地 さとり", "火焔猫 燐", "霊烏路 空",
	"古明地 こいし", "ナズーリン", "多々良 小傘", "雲居 一輪", "村紗 水蜜", "寅丸 星", "聖 白蓮", "封獣 ぬえ", "伊吹 萃香", "永江 衣玖",
	"比那名居 天子", "姫海棠 はたて", "博麗 霊夢", "霧雨 魔理沙", "サニーミルク", "ルナチャイルド", "スターサファイア", "宇佐美 蓮子", "マエリベリー・H", "稗田 阿求",
	"森近 霖之助", "名無しの本読み妖怪", "茨木 華扇", "綿月 豊姫", "綿月 依姫", "レイセン2号");
// 画像が存在するキャラ
$imageExist = array(
	1,2,3,4,5,6,7,8,9,10,11,12,14,17,18,19,20,22,23,24,25,26,28,29,31,32,33,34,35,37,38,39,40,
	41,42,43,45,46,47,48,49,50,51,52,54,55,56,57,58,59,61,63,64,66,68,70,71,72,73,74);
// ランキング結果は取り敢えずここに格納
$rank = array(
	// 結果 1つ目
	array( 23,  8, 22, 48, 52, 59, 39, 33, 35, 19, 56, 46, 43, 51, 70, 41, 61, 20,  6,  4,
		   29,  1, 24, 12,  3,  2, 34, 45, 47, 49, 50, 71, 17,  7, 11,  9, 25, 26, 64, 63,
		   38, 40, 32, 18, 37, 42, 36, 31, 27,  5, 10, 14, 57, 58, 66, 65, 55, 44, 53, 54,
		   16, 21, 15, 13, 75, 74, 76, 60, 67, 69, 68 ),
	// 結果 2つ目
	array( 23, 56,  8, 22, 39, 19, 52, 48, 33, 46, 51, 20, 59, 35, 29, 70, 45, 24, 71, 47,
		   68,12,43,10,1,4,6,37,40,41,11,17,26,34,50,61,9,64,66,18,
		   7,3,63,2,49,32,72,69,36,25,38,58,53,57,31,5,55,54,14,16,
		   27,42,21,65,13,60,44,75,74,76,15,67 ),
	array( 56, 23, 22, 66, 45, 73, 58, 39,  8, 19, 46, 52, 48, 51, 43, 49, 55, 68, 72, 70,
		   50,1,31,59,24,35,32,9,33,4,41,6,29,10,12,11,20,25,26,47,
		   61,54,57,62,69,26,65,71,34,7,63,64,40,3,2,14,17,38,21,42,
		   18,16,15,13,74,30,60,5,44,53,67,75,76,36,37 )
);
// ランキングの個数をここで定義
define("RANKDATASIZE", count($rank));
define("CHARADATASIZE", count($rank[RANKDATASIZE-1]));
// ランキングの集計日時はここ
$rankNotes = array( "2009年11月08日", "2010年02月01日", "2011年02月14日" );
// キャラのランク上下によって出力される前回の結果との差分、を関数で定義して出力
function rankChangeText($rank,$i,$j) {
	if ($j!=0) {
		// $iは現在のランク位置、取得した$nは過去のランク位置、$rank[$j][$i]はキャラのID
		for($n=0;$n<count($rank[$j-1]);$n++) {
			if ( $rank[$j-1][$n] == $rank[$j][$i] ) break;
		}
		if ( $n-$i > 0 ) return "<span class='rankChange' style='color:#F44;'>(+" . ($n-$i) . ")</span>";
		if ( $n-$i < 0 ) return "<span class='rankChange' style='color:#44F;'>(" . ($n-$i) . ")</span>";
	} return "<span class='rankChange' style='color:#888;'>(0)</span>";
}
/*ここからテーブル要素*/
echo "<table border='0' cellspacing='0' cellpadding='0'><tbody>\n";
echo "<tr class='tr_head'><td class='td_head'>No.</td>";
for ( $i=0;$i<RANKDATASIZE;$i++ ) {
	echo "<td class='rank_notes' colspan='3'>" . $rankNotes[$i] . "</td>";
}
/* ↑ ヘッダ ↓ 要素 */
for ( $i=0; $i<CHARADATASIZE; $i++ ) {
	echo "<tr><td class='td_head td_head_element'>" . ($i+1) . "</td>";
	for ( $j=0; $j<RANKDATASIZE; $j++ ) {
		if ( $i < count($rank[$j]) ) {
			// 画像を表示、三項演算子で画像がないキャラは 00.png を表示
			echo "<td class='td_image'><img src='img2/" . (in_array($rank[$j][$i],$imageExist)?sprintf("%02d", $rank[$j][$i]):sprintf("00")) . ".png' style='float:left;' width='32px' height='32px'></td>";
			// ランキング上下、キャラクター名、作品名 を表示
			echo "<td class='td_change'>" . rankChangeText($rank,$i,$j) . "</td><td class='td_name'>" . $name[$rank[$j][$i]] . "<br />" . getTitleName($rank[$j][$i]) ."</td>\n";
		} else {
			// キャラが存在しない場合は空要素を挿入
			echo "<td class='td_none'colspan='3'></td>";
		}
	}
	echo "</tr>";
}
echo "</tbody></table>";

ついでにスタイルシートが以下、すごいどうでもいいね!!

table, tr, td, tbody, p, img {
	margin : 0px;
	padding : 0px;
}
table {
	font-size : 0.8em;
	border: 1px solid #DDF;
	border-width: 0px 2px;
}
td {
	border: 1px solid #EEF;
	border-width: 0px 0px 1px 0px;
	padding: 2px;
	vertical-align: middle;
}
tr {
	background-color: #FCFCFF;
}
.td_head {
	width: 1em;
	paddin-right : 0.5em;
}
.td_head_element {
	text-align: right;
}
.td_image {}
.td_change {
	width: 2em;
	text-align: center;
}
.td_name {
	width: 9em;
}
.td_none {}
.rank_notes {
	text-indent: 1em;
}
.tr_head {
	background-color: #DDF;
}
span.rankChange {
	font-size	: 0.8em;
}
span.title {
	font-size: 0.8em;
	font-weight: bold;
	margin-left: 1em;
}