<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>凹みTips</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/" />
    <link rel="self" type="application/atom+xml" href="http://www.hecomi.com/atom.xml" />
    <id>tag:www.hecomi.com,2007-10-24://1</id>
    <updated>2010-03-16T05:03:19Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.13</generator>

<entry>
    <title>画面内に自由につぶやける</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2010/03/post-8.html" />
    <id>tag:www.hecomi.com,2010://1.115</id>

    <published>2010-03-16T04:56:44Z</published>
    <updated>2010-03-16T05:03:19Z</updated>

    <summary>twitter+αというイメージで作成した、PHP+JavaScriptの作品紹...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[twitter+αというイメージで作成した、PHP+JavaScriptの作品紹介です。画面内のどこにでも、色を指定して短文をつぶやくことができます。大きさは時系列順になっており、古くなるほど小さく、薄く変化します。パスワードは「１２３４」となってますので、お試しください。<br /><br /><div align="center"><b>→<a href="http://hecomi.com/murmur/index.php5">murmur</a></b><br /></div><br /><span class="mt-enclosure mt-enclosure-image" style="display: inline; text-align: center; width: 100%;"><img alt="murmur.png" src="http://www.hecomi.com/pic/murmur.png" class="mt-image-none" style="width: 400px;" /></span><br /> <div><br /></div>
]]>
        
    </content>
</entry>

<entry>
    <title>JavaScriptによる色空間</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2008/11/javascript-1.html" />
    <id>tag:www.hecomi.com,2008://1.83</id>

    <published>2008-11-29T16:17:15Z</published>
    <updated>2008-12-05T18:33:28Z</updated>

    <summary>ペイントでパレットにない色を作成するとき開く画面がありますよね。カラフルなあれで...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[ペイントでパレットにない色を作成するとき開く画面がありますよね。カラフルなあれです。カラーピッカーって言うらしいですが...、あれをJavaScriptを使って再現しようと思います。使う知識はHSVとRGBについての知識で、RGBは文字通りRed、Blue、Greenですが、HSVとは何でしょう？僕も初めて知ったのですが、Hue、Saturation、Valueの頭文字で、それぞれ色相、彩度、明度のことらしいです。ペイントで使っているのはHSVとはちょっとばかし違うようですが、まぁ細かいことは気にせずやっていきたいと思います。さてさて問題なのはペイントではHSVで色を表していますが、HTMLではRGB（１６進数で例えば#FF0000は赤）でしか表せない点ですね。よってHSVからRGBへと変換しなければなりません。そこでまずはHSVについてお勉強しましょう。<br />
<div align="center">
<img alt="錯体のHSV色空間" src="http://upload.wikimedia.org/wikipedia/commons/thumb/f/f1/HSV_cone.jpg/300px-HSV_cone.jpg" class="thumbimage" border="0" width="300" height="225" /><br />
図1  錯体のHSV色空間<br />
（<a href="http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93" target="_blank">Wikipedia: HSV色空間</a>より抜粋）<br /><br /></div><br />

HSVはそれぞれ以下のように定義します。<br /><blockquote>H: 0～360<br />S: 0.0～1.0<br />V: 0.0～1.0<br /></blockquote>Hについては図を見ての通りぐるっと一周３６０度です。その他は0～１の範囲にあるパラメータとします。さて、しかしながらこのHが曲者でして...、Hは色相ですのでペイントでやってみると、たとえば左上の点から上に沿って右に進ませていくっていう操作に当たります。このときRGBをじっくり観察してみると、<br /><blockquote>R　⇒　Y　⇒　G　⇒　C　⇒　B　⇒　M<br /></blockquote>（Y：Yellow、C：Cyan、M：Magenta）と移り変わります。要は、まずRを255に保ったままGが0から255へ変化、後Gを255に保ったままRが255から0へ変化...（以下略）と動きます。プログラムし辛い...、ヤダヤダ。と思っているところにWikipedia様が登場です。<br /><br /><br />

<p><img class="tex" alt="H_i = \lfloor { H \over 60 } \rfloor mod 6 " src="http://upload.wikimedia.org/math/5/3/b/53b924cf03e01ff160c063a8c7f03591.png" /></p>
<p><img class="tex" alt="f = { H \over 60 } - H_i" src="http://upload.wikimedia.org/math/1/a/f/1af38150905e58240f0eee44a4baa489.png" /></p>
<p><img class="tex" alt="p = V ( 1 - S ) \," src="http://upload.wikimedia.org/math/7/e/1/7e135ddff08e555e9421f1652f189b75.png" /></p>
<p><img class="tex" alt="q = V ( 1 - f S ) \," src="http://upload.wikimedia.org/math/d/2/b/d2bc5011cda7ea0f9c93f8475121052b.png" /></p>
<p><img class="tex" alt="t = V ( 1 -  ( 1 - f ) S ) \," src="http://upload.wikimedia.org/math/5/e/c/5ec4405db6475fc90524189b26bf00a6.png" /></p>
<p><img class="tex" alt="\mbox{if } H_i = 0 \rightarrow R = V, G = t, B = p \," src="http://upload.wikimedia.org/math/1/0/f/10fab17657e820f981311562edb3a5e4.png" /></p>
<p><img class="tex" alt="\mbox{if } H_i = 1 \rightarrow R = q, G = V, B = p \," src="http://upload.wikimedia.org/math/f/c/6/fc6f0d75b7aec7c12b3c2b9619ce5e46.png" /></p>
<p><img class="tex" alt="\mbox{if } H_i = 2 \rightarrow R = p, G = V, B = t \," src="http://upload.wikimedia.org/math/f/3/7/f37aeb26bdde1af310a45fc5016bf892.png" /></p>
<p><img class="tex" alt="\mbox{if } H_i = 3 \rightarrow R = p, G = q, B = V \," src="http://upload.wikimedia.org/math/5/4/7/5476d5e46fa5f95728ecf06b379e7ddb.png" /></p>
<p><img class="tex" alt="\mbox{if } H_i = 4 \rightarrow R = t, G = p, B = V \," src="http://upload.wikimedia.org/math/2/b/6/2b6df392b0ba1fb551174324da7ad250.png" /></p>
<p><img class="tex" alt="\mbox{if } H_i = 5 \rightarrow R = V, G = p, B = q \," src="http://upload.wikimedia.org/math/e/d/2/ed2cf15425f023f7a68c9a98fb55a183.png" /></p><p>（<a href="http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93" target="_blank">Wikipedia: HSV色空間</a>より抜粋）</p><p><br /></p><p>なんと！こんな便利な変換式があるんですね。この計算のミソは、はじめにHiを60で割ってあげるところにあります。すると0～6（0/60～360/60）になるのですが、この値をガウス記号（床関数、floor）で切り捨ててあげちゃうんです。つまり、0、1、2、3、4、5のどれかにしちゃうというわけですが...、すると、この数字がそれぞれRYGCBMのどれかに当たることになります！なるほど、これで場合分けをすればいいのか...。ちなみにmod6（６で割ったときの余り）を求めているのは、色相が0～360ではない角度（１０００度とか）になった場合を考慮してのものです。さてさて、この数字による場合分けを行ってしまえばめでたくHMKをRGBに変換することができるので、以下にソースを示します。</p>
<pre name="code" class="js">// HSVtoRGB変換
function HSVtoRGB(H, S, V) {
    var ret = [0, 0, 0];

    // 引数チェック
    if(S &lt; 0 || S &gt; 1 || V &lt; 0 || V &gt; 1) return ret;
    var Hi = Math.floor(H/60) % 6;
    var f  = (H/60) - Hi;

    // RGB
    V = V * 255;
    var p = Math.round(V * (1 - S));
    var q = Math.round(V * (1 - f*S));
    var t = Math.round(V * (1 - (1 - f)*S));

    V = Math.round(V);

    // 色相による場合わけ
    switch(Hi) {
        case 0: ret = [V, t, p]; break;
        case 1: ret = [q, V, p]; break;
        case 2: ret = [p, V, t]; break;
        case 3: ret = [p, q, V]; break;
        case 4: ret = [t, p, V]; break;
        case 5: ret = [V, p, q]; break;
    }
    return ret;
}
</pre>
こんな感じで配列でRGBを返します。どうせならペイントみたいなインターフェースを作ってしまいましょう。これを頭に#をつけた１６進数コードであらわされたRGBの文字列に変換する関数を付け加えます。<br />
<pre name="code" class="js">function RGBto16(RGB) {
     var R = (RGB[0] &lt; 16) ? "0" + RGB[0].toString(16): RGB[0].toString(16);
    var G = (RGB[1] &lt; 16) ? "0" + RGB[1].toString(16): RGB[1].toString(16);
    var B = (RGB[2] &lt; 16) ? "0" + RGB[2].toString(16): RGB[2].toString(16);
    return ("#" + R + G + B);
}

function getClr(H, S, V) {
    return RGBto16(HSVtoRGB(H,S,V));
}
</pre>
ここでtoString()を使いましたが、これは与えた引数を基数とした数字を返してくれます。16なので16進数のコードが返ってくるわけです。んー、便利。また、3項演算子を用いて、もし、15=fのように16進数に直した時1文字になってしまうとき、頭に0をつけて2文字にするようにします。この関数とHSVtoRGB()をまとめてやってくれるgetClr()を定義しました。この関数を使って色を設定します。表示部は以下のようになります。<br />
<pre name="code" class="xml"><style type="text/css">
.color_table {
    font-size: 12px;
    line-height: 8px;
    cursor: default;
}
</style>
<table class="color_table" border="0" cellpadding="0" cellspacing="0">
<script type="text/javascript">
for(j=1; j&gt;=0; j-=dj) {
    document.write("&lt;tr&gt;");
    for(i=0; i&lt;360; i+=di) { 
        document.write('&lt;td bgcolor="' + getClr(i,j,(2+j)/3) + '"&gt;&amp;nbsp;&lt;/td&gt;');
    }
    document.write("&lt;/tr&gt;");
}
</script>
</table>
</pre>

これを書くと下のようになります。<br />
<blockquote>
<script type="text/javascript">
// パラメータ
di = 6;		// 横の刻み（0～360）
dj = 0.04;	// 縦の刻み（0～1）

// HSVtoRGB変換
function HSVtoRGB(H, S, V) {
	var ret = [0, 0, 0];

	// 引数チェック
	if(S < 0 || S > 1 || V < 0 || V > 1) return ret;
	var Hi = Math.floor(H/60) % 6;
	var f  = (H/60) - Hi;

	// RGB
	V = V * 255;
	var p = Math.round(V * (1 - S));
	var q = Math.round(V * (1 - f*S));
	var t = Math.round(V * (1 - (1 - f)*S));

	V = Math.round(V);

	// 色相による場合わけ
	switch(Hi) {
		case 0: ret = [V, t, p]; break;
		case 1: ret = [q, V, p]; break;
		case 2: ret = [p, V, t]; break;
		case 3: ret = [p, q, V]; break;
		case 4: ret = [t, p, V]; break;
		case 5: ret = [V, p, q]; break;
	}
	return ret;
}

// 16進数変換
function RGBto16(RGB) {
 	var R = (RGB[0] < 16) ? "0" + RGB[0].toString(16): RGB[0].toString(16);
	var G = (RGB[1] < 16) ? "0" + RGB[1].toString(16): RGB[1].toString(16);
	var B = (RGB[2] < 16) ? "0" + RGB[2].toString(16): RGB[2].toString(16);
	return ("#" + R + G + B);
}

// まとめ
function getClr(H, S, V) {
	return RGBto16(HSVtoRGB(H,S,V));
}

// カラーコード取得用グローバル変数
_H = 0;
_S = 0;
// VBar変更
function changeVBar(H, S) {
	_H = H; _S = S;
	id=0;
	for(j=1; j>=0; j-=dj) {
		document.getElementById("b_"+ id).bgColor = getClr(H,S,j);
		id++;
	}
}

// カラーコード取得
function setClr(V) {
	with(document.getElementById("clrCode")) {
		bgColor = getClr(_H, _S, V);
		style.color = getClr(_H, 0, 1 - V);
		innerHTML = getClr(_H, _S, V);
	}
}
</script>
<style type="text/css">
.color_table {
	font-size: 12px;
	line-height: 8px;
	cursor: default;
}

.VBar {
	font-size: 40px;
}
</style>

<table class="color_table" border="0" cellpadding="0" cellspacing="0">
<script type="text/javascript">
for(j=1; j>=0; j-=dj) {
    document.write('<tr>');
    for(i=0; i<360; i+=di) { 
		document.write('<td bgcolor="' + getClr(i,j,(2+j)/3) + '">&nbsp;</td>');
    }
    document.write("</tr>");
}
</script>
</table>
</blockquote>
ちなみに、上の例ではペイントに合わせるため、getClrの第3引数を(2+j)/3としました。もし、ここが1だった場合は下はグレーではなく真白になります。<br />さて、それではペイントライクなカラーピッカーの完成版のソースコードとサンプルを示します。<br />
<pre name="code" class="js">// パラメータ
di = 6;        // 横の刻み（0～360）
dj = 0.04;    // 縦の刻み（0～1）

// HSVtoRGB変換
function HSVtoRGB(H, S, V) {
    var ret = [0, 0, 0];

    // 引数チェック
    if(S &lt; 0 || S &gt; 1 || V &lt; 0 || V &gt; 1) return ret;
    var Hi = Math.floor(H/60) % 6;
    var f  = (H/60) - Hi;

    // RGB
    V = V * 255;
    var p = Math.round(V * (1 - S));
    var q = Math.round(V * (1 - f*S));
    var t = Math.round(V * (1 - (1 - f)*S));

    V = Math.round(V);

    // 色相による場合わけ
    switch(Hi) {
        case 0: ret = [V, t, p]; break;
        case 1: ret = [q, V, p]; break;
        case 2: ret = [p, V, t]; break;
        case 3: ret = [p, q, V]; break;
        case 4: ret = [t, p, V]; break;
        case 5: ret = [V, p, q]; break;
    }
    return ret;
}

// 16進数変換
function RGBto16(RGB) {
    var R = (RGB[0] &lt; 16) ? "0" + RGB[0].toString(16): RGB[0].toString(16);
    var G = (RGB[1] &lt; 16) ? "0" + RGB[1].toString(16): RGB[1].toString(16);
    var B = (RGB[2] &lt; 16) ? "0" + RGB[2].toString(16): RGB[2].toString(16);
    return ("#" + R + G + B);
}

// まとめ
function getClr(H, S, V) {
    return RGBto16(HSVtoRGB(H,S,V));
}

// カラーコード取得用グローバル変数
_H = 0;
_S = 0;
// VBar変更
function changeVBar(H, S) {
    _H = H; _S = S;
    id=0;
    for(j=1; j&gt;=0; j-=dj) {
        document.getElementById("b_"+ id).bgColor = getClr(H,S,j);
        id++;
    }
}

// カラーコード取得
function setClr(V) {
    with(document.getElementById("gtnClr")) {
        bgColor = getClr(_H, _S, V);
        style.color = getClr(_H, 0, 1 - V);
        innerHTML = getClr(_H, _S, V);
    }
}

</pre>
<pre name="code" class="xml"><style type="text/css">
.color_table {
    font-size: 12px;
    line-height: 8px;
    cursor: default;
}

.VBar {
    font-size: 40px;
}
</style>
<table border="1" cellpadding="5" cellspacing="0">
    <tbody><tr><td>
&lt;table class="color_table" border="0" cellpadding="0" cellspacing="0"&gt;
&lt;script type="text/javascript"&gt;
for(j=1; j&gt;=0; j-=dj) {
    document.write("&lt;tr&gt;");
    for(i=0; i&lt;360; i+=di) { 
        document.write('&lt;td onclick="changeVBar(' + i + ',' + j + ')" bgcolor="' + getClr(i,j,1) + '"&gt;&nbsp;&lt;/td&gt;');
    }
    document.write("&lt;/tr&gt;");
}
&lt;/script&gt;
&lt;/table&gt;
    </td><td>
&lt;table class="color_table VBar" border="0" cellpadding="0" cellspacing="0"&gt;
&lt;script type="text/javascript"&gt;
id = 0;
for(j=1; j&gt;=0; j-=dj) {
    document.write('&lt;tr&gt;');
    document.write('&lt;td id="b_' + id + '" onclick="setClr(' + j + ')" bgcolor="' + getClr(0,1,j) + '"&gt;&nbsp;&lt;/td&gt;');
    document.write("&lt;/tr&gt;");
    id++;
}
&lt;/script&gt;
&lt;/table&gt;
    </td></tr>
    <tr><td colspan="2" id="gtnClr" align="center" bgcolor="#ffffff">color</td></tr>
</tbody></table>
</pre>

<br />sample:<br />
<blockquote>
<table border="1" cellpadding="5" cellspacing="0">
	<tbody><tr><td>
<table class="color_table" border="0" cellpadding="0" cellspacing="0">
<script type="text/javascript">
for(j=1; j>=0; j-=dj) {
	document.write('<tr>');
	for(i=0; i<360; i+=di) {  
		document.write('<td bgcolor="' + getClr(i,j,1) + '" onclick="changeVBar(' + i + ',' + j + ')">&nbsp;</td>');
	}
	document.write("</tr>");
}
</script>
</table>
	</td><td>
<table class="color_table VBar" border="0" cellpadding="0" cellspacing="0">
<script type="text/javascript">
id = 0;
for(j=1; j>=0; j-=dj) {
	document.write('<tr>');
	document.write('<td bgcolor="' + getClr(0,1,j) + '" id="b_' + id + '" onclick="setClr(' + j + ')">&nbsp;</td>');
	document.write("</tr>");
	id++;
}
</script>
</table>
	</td></tr>
	<tr><td colspan="2" id="clrCode" align="center" bgcolor="#ffffff">color</td></tr>
</tbody></table>
</blockquote>
①でかい領域のどこかをクリック<br />②縦長の領域のどこかをクリック<br /><br />って感じです。個人的には満足です。<br />しかしながら世の中は広いようで...、ライブラリを使ったりしてちょーすごいカラーピッカーもあります。<br /><br />球体版（Color Sphere）:<br /><a href="http://www.colorjack.com/software/dhtml+color+sphere.html">http://www.colorjack.com/software/dhtml+color+sphere.html</a><br /><br />
Saiみたいなやつ（JQuery color picker）:<br /><a href="http://acko.net/dev/farbtastic">http://acko.net/dev/farbtastic</a><br /><br />他にもYahoo!UIとかにもありましたし、フォトショライクなものもありました。ムムム、勉強しないと最先端にはなかなか追いつけませんね。<br />]]>
        
    </content>
</entry>

<entry>
    <title>javascriptによる人間工学シミュレーション</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2008/11/-prototype.html" />
    <id>tag:www.hecomi.com,2008://1.77</id>

    <published>2008-11-09T16:11:21Z</published>
    <updated>2008-11-10T05:54:28Z</updated>

    <summary>なぞと大層なタイトルをつけてみましたが、やったことはコレです。 prototyp...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="Ajax" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[なぞと大層なタイトルをつけてみましたが、やったことはコレです。<br /><br />
<blockquote><iframe src="http://hecomi.com/samples/he.html" width="100%" height="400"></iframe></blockquote><br /><br />
prototype.jsによってjavascriptでクラスを実現し、道を歩く人の簡単なAIを作成しました。prototype.jsを用いてクラスを作成するには、<br /><blockquote>var Human = Class.create();<br /></blockquote>このように記述します。クラスの定義については、<br /><blockquote>Human.prototype = {<br />&nbsp;initialize: function(obj,x,y,vx,vy) {<br />～<br />&nbsp;},<br />&nbsp;move: function() {<br />～<br />&nbsp;}<br />};<br /></blockquote>こんな感じです。initializeがコンストラクタで、この中にフィールドを入れます。メソッドはprototypeの中に放り込んでやればおｋです。他にも記述の仕方はありますが、僕の場合は面倒くさいんでこれで統一しています。ちなみにプログラム自体は、場合分け処理が適当なので見ての通りうまく避けてくれませんｗ。誰かうまい処理考えてくれないかなー...。以下全ソースです。<br /><blockquote>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"&gt;<br />&lt;html lang="ja"&gt;<br />&lt;head&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html;"&gt;<br />&lt;meta http-equiv="content-script-type" content="text/JavaScript"&gt;<br />&lt;title&gt;人間工学シミュレーション&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=Shift-JIS"&gt;<br />&lt;style type="text/css"&gt;&lt;!--<br />* {<br />&nbsp;margin: 0;<br />&nbsp;padding: 0;<br />}<br />.street {<br />&nbsp;background-color: #ccc;<br />&nbsp;position: absolute;<br />}<br />.human {<br />&nbsp;position: absolute;<br />&nbsp;font-size: 16px;<br />&nbsp;line-height: 16px;<br />&nbsp;margin-left: -8px;<br />&nbsp;margin-top: -8px;<br />}<br />.human2 {<br />&nbsp;color: #f00;<br />}<br />#area{<br />background-color: #000;<br />}<br />--&gt;&lt;/style&gt;<br />&lt;script type="text/javascript" src="pt.js"&gt;&lt;/script&gt;<br />&lt;script type="text/javascript"&gt;<br />// ---------- 初期設定 ----------<br />// ウインドウサイズと道幅<br />var WinSizeW = 360, WinSizeH = 360;<br />var StreetW = WinSizeH/2;<br />var StreetL = (WinSizeW - StreetW)/2;<br />var StreetR = StreetL + StreetW;<br /><br />// 描画間隔(ms)<br />var t = 10;<br /><br />// 速度幅<br />var vy = 5;<br />var vx = 0;<br /><br />// 人<br />var num = 8; // 人数<br />var size = 8;<br />var human = Array(num);<br />var human2 = Array(num);<br /><br />// ---------- 初期化 ----------<br />// 初期化関数<br />function init() {<br />&nbsp;createStreet(); // 道の描画<br />&nbsp;for(i=0; i&lt;num; i++) {<br />&nbsp; var left = StreetL + Math.floor(StreetW * Math.random());<br />&nbsp; var vx0 = Math.floor(vx * Math.random());<br />&nbsp; var vy0 = Math.floor(1 + vy * Math.random());<br />&nbsp; human[i] = new Human($('human_p' + i), left, 0, vx0, vy0);<br />&nbsp; human[i].move();<br /><br />&nbsp; left = StreetL + Math.floor(StreetW * Math.random());<br />&nbsp; vx0 = Math.floor(vx * Math.random());<br />&nbsp; vy0 = Math.floor(1 + vy * Math.random());<br />&nbsp; human2[i] = new Human($('human_m' + i), left, WinSizeH, vx0, -vy0);<br />&nbsp; human2[i].move();<br />&nbsp;}<br /><br />&nbsp;// タイマーの実行<br />&nbsp;Timer();<br />}<br /><br />// 道の生成<br />function createStreet() {<br />&nbsp;var vertical = $('vertical');<br />&nbsp;Element.setStyle(vertical,<br />&nbsp;{<br />&nbsp; 'left' : StreetL+ "px",<br />&nbsp; 'top' : 0 + "px",<br />&nbsp; 'width' : StreetW + "px",<br />&nbsp; 'height': WinSizeH + "px"<br />&nbsp;});<br />}<br /><br />// humanクラス<br />var Human = Class.create();<br /><br />// クラスの中身<br />Human.prototype = {<br />&nbsp;initialize: function(obj,x,y,vx,vy) { // コンストラクタ（ここでメンバ変数も指定）<br />&nbsp; this.obj = obj;<br />&nbsp; this.x = x;<br />&nbsp; this.y = y;<br />&nbsp; this.vx = vx;<br />&nbsp; this.vy = vy;<br />&nbsp; Element.setStyle(this.obj, // 実際の移動 / 体裁整え<br />&nbsp; {<br />&nbsp;&nbsp; 'left': x + "px",<br />&nbsp;&nbsp; 'top' : y + "px",<br />&nbsp;&nbsp; 'font-size': size + "px",<br />&nbsp;&nbsp; 'line-height': size + "px"<br />&nbsp; });<br />&nbsp;},<br />&nbsp;move: function() { // 移動の記述<br />&nbsp; if(this.y &gt; WinSizeH || this.y &lt; 0) { // 下から出たら<br />&nbsp;&nbsp; var left = StreetL + Math.floor(StreetW * Math.random()); // 開始位置指定<br />&nbsp;&nbsp; var tb = this.vy / Math.abs(this.vy); // 進んでた向き<br />&nbsp;&nbsp; var vx0 = Math.floor(vx * Math.random()); // 初速度<br />&nbsp;&nbsp; var vy0 = tb * Math.floor(1 + vy * Math.random()); // 初速度<br />&nbsp;&nbsp; if(tb&gt;0) this.y = 0; // 上に戻す<br />&nbsp;&nbsp; else this.y = WinSizeH; // 下に戻す<br />&nbsp;&nbsp; this.x = left; // 初期位置に持っていく<br />&nbsp;&nbsp; this.vx = vx0; // 初速度指定<br />&nbsp;&nbsp; this.vy = vy0; // 初速度指定<br />&nbsp; }<br />&nbsp; if(this.x &lt; StreetL) { // 道の外に出たら<br />&nbsp;&nbsp; this.vx = -this.vx; // 速度逆<br />&nbsp;&nbsp; this.x += size;<br />&nbsp; } else if(this.x &gt; StreetR) {<br />&nbsp;&nbsp; this.vx = -this.vx;<br />&nbsp;&nbsp; this.x -= size;<br />&nbsp; }<br />&nbsp; this.x += this.vx; // 進む<br />&nbsp; this.y += this.vy; // 進む<br />&nbsp; this.vx = 0;&nbsp; // 速度初期化<br />&nbsp; Element.setStyle(this.obj, // 実際の移動<br />&nbsp; {<br />&nbsp;&nbsp; 'left': this.x + "px",<br />&nbsp;&nbsp; 'top' : this.y + "px"<br />&nbsp; });<br />&nbsp;},<br />&nbsp;// --------- ここが衝突判定 ---------<br />&nbsp;// this: 自分　　　obj: 相手<br />&nbsp;conflict: function( obj ) {<br />&nbsp;// --------- ここから判断の記述 ---------<br />&nbsp; var tb = this.vy / Math.abs(this.vy);<br />&nbsp; var lx = (obj.x - this.x); // x方向距離<br />&nbsp; var ly = tb*(obj.y - this.y); // y方向距離<br />&nbsp; var lf = tb*((obj.y + 10*obj.vy) - (this.y + 10*this.vy)); // 10時間後の距離<br /><br />&nbsp; if(<br />&nbsp;&nbsp; ly &gt; 0 &amp;&amp;&nbsp;&nbsp; // 後ろにいて<br />&nbsp;&nbsp; Math.abs(lx) &lt; 3*size &amp;&amp; // かつ3人分の幅の中に入っていて<br />&nbsp;&nbsp; lf &lt; 0&nbsp;&nbsp;&nbsp; // 10時間後抜かしてるとき時<br />&nbsp; ) {<br />&nbsp;&nbsp; var lr = this.x - obj.x;&nbsp; // 右か左かの符号用<br />&nbsp;&nbsp; if(!lr) lr = 0.5 - Math.random() // 真ん中だったらどっちか<br />&nbsp;&nbsp; lr = lr / Math.abs(lr);&nbsp;&nbsp; // 1か-1にする<br />&nbsp;&nbsp; var to = obj.x + lr*3*size;&nbsp; // 抜かす際の移動幅<br />&nbsp;&nbsp; this.vx += Math.floor((to - this.x)/3 + 0.5); // 3時間後に抜かす速度<br />&nbsp; }<br />&nbsp;// ------------- ここまで -------------<br />&nbsp;}<br />};<br /><br />// 画面更新関数<br />function winDraw() {<br />&nbsp;for(i=0; i&lt;num; i++) {<br />&nbsp; for(j=0; j&lt;num; j++) {<br />&nbsp;&nbsp; if(i!=j) human[i].conflict(human[j]);<br />&nbsp;&nbsp; if(i!=j) human[i].conflict(human2[j]);<br />&nbsp;&nbsp; if(i!=j) human2[i].conflict(human[j]);<br />&nbsp;&nbsp; if(i!=j) human2[i].conflict(human2[j]);<br />&nbsp; }<br />&nbsp;}<br />&nbsp;for(i=0; i&lt;num; i++) {<br />&nbsp; human[i].move();<br />&nbsp; human2[i].move();<br />&nbsp;}<br />}<br /><br />// タイマー<br />function Timer() {<br />&nbsp;winDraw();<br />&nbsp;setTimeout("Timer()", t);<br />}<br />--&gt;&lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />&lt;div id="area"&gt;<br />&lt;div id="vertical" class="street"&gt;&lt;/div&gt;<br />&lt;script type="text/javascript"&gt;<br />for(i=0; i&lt;num; i++) {<br />&nbsp;document.write('&lt;div id="human_p' + i + '" class="human"&gt;●&lt;/div&gt;');<br />&nbsp;document.write('&lt;div id="human_m' + i + '" class="human human2"&gt;●&lt;/div&gt;');<br />}<br />&lt;/script&gt;<br />&lt;/div&gt;<br />&lt;/body&gt;<br />&lt;script type="text/javascript"&gt;init();&lt;/script&gt;<br />&lt;/html&gt;<br /></blockquote><br />
]]>
        
    </content>
</entry>

<entry>
    <title>JavaScriptによるあみだくじ</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2008/10/javascript.html" />
    <id>tag:www.hecomi.com,2008://1.70</id>

    <published>2008-10-18T19:35:55Z</published>
    <updated>2009-02-03T05:47:28Z</updated>

    <summary>学校がしばらく忙しく、更新できていません...。更新したいと常々思っているのです...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[学校がしばらく忙しく、更新できていません...。更新したいと常々思っているのですが...、残念。<br />今日のバイトの空き時間を使って、あみだくじを作ってみました。<br />
<style type="text/css">
span.amida {
 font-family: ＭＳ ゴシック;
 font-size: 12px;
 font-weight: bold;
 line-height: 12px;
}
</style>
<script type="text/javascript">
function makeAmida(num, len){
 if(num > 20) alert("20人以下でお願いします。")
 var a = new Array(len);
 for(i=0; i<len; i++) { // 縦
  a[i] = new Array(num);
  for(j=0; j<2*num-1; j++) { // 横
   if (j%2) { // 偶数番目は２通り
    if(a[i][j-1] == "┣") a[i][j] = "━";
    else a[i][j] = "　";
   } else { // 奇数番目は最初、最後を場合分け
    if(a[i][j-1] == "━") a[i][j] = "┫";
    else {
     if(j==2*(num-1)) a[i][j] = "┃";
     else a[i][j] = (Math.floor(Math.random()*2))? "┃" : "┣";
    }
   }
  }
 }
 return a;
}

function writeAmida(matrix) {
 var nums = new Array("①","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩","⑪","⑫","⑬","⑭","⑮","⑯","⑰","⑱","⑲","⑳");
 document.write("<br / / / / / / / / />");
 for(i=0; i<matrix.length; i++) {
  for(j=0; j<matrix[0].length; j++) {
   document.write('<span class="amida" id="amida' + i + "l" + j + '">');
   document.write(matrix[i][j]);
   document.write('</span>');
  }
  document.write("<br / / / />");
 }
 for(i=0; i<(matrix[0].length+1)/2; i++) {
  document.write('<span class="amida" id="num' + i + '">');
  document.write(nums[i]);
  document.write('　</span>');
 }
}

function traceAmida(matrix,i,i2,j,j2,step) {
 pre_i = i; pre_j = j;
 // n:人数　matrix[0].length: 2n-1　行列から人数を逆算⇒あみだの開始位置は偶数番目
 if(i==0 && j==0 && step==0) {
  pre_i = -1;
  j = 2*Math.floor(Math.random()*(matrix[0].length+1)/2); // 最初は開始位置ランダム
 }
 else {
  if(matrix[i][j] == "━") j += (j - j2);
  else if(matrix[i][j] == "┫") {
   if(i-i2) j--; // 下向きに速度を持っていたら左
   else i++; // 横向きだったら下へ
  }
  else if(matrix[i][j] == "┣") {
   if(i-i2) j++; // 下向きに速度を持っていたら右
   else i++; // 横向きだったら下へ
  }
  else i++; // ┃
 }
 if(!(i==matrix.length)) {
  document.getElementById("amida" + i + "l" + j).style.color = (step)? "#f00" : "#ff0";
  step++;
  setTimeout(function(){ traceAmida(matrix, i, pre_i, j, pre_j, step) }, 50);
 } else {
  document.getElementById("num" + (j/2)).style.color = "#00f";
 }
}
</script>
<blockquote>
<script type="text/javascript">
var a = makeAmida(15,30);
writeAmida(a);
</script>
<br />
<input value="開始" onclick="traceAmida(a,0,0,0,0,0);" type="button" />
</blockquote> 
開始を押すとランダムな開始位置よりアミダを辿って下の番号に到達します。ソースは相当汚いですが、動けばいいや的なノリで組みました...、ご助言頂ければありがたいです。<br /><br /><blockquote><p>function makeAmida(num, len){<br />&nbsp;if(num &gt; 20) alert("20人以下でお願いします。")<br />&nbsp;var a = new Array(len);<br />&nbsp;for(i=0; i&lt;len; i++) { // 縦<br />&nbsp;&nbsp;a[i] = new Array(num);<br />&nbsp;&nbsp;for(j=0; j&lt;2*num-1; j++) { // 横<br />
&nbsp;&nbsp;&nbsp;if (j%2) { // 偶数番目は２通り<br />&nbsp;&nbsp;&nbsp;&nbsp;if(a[i][j-1] == "┣") a[i][j] = "━";<br />&nbsp;&nbsp;&nbsp;&nbsp;else a[i][j] = "　";<br />&nbsp;&nbsp;&nbsp;} else { // 奇数番目は最初、最後を場合分け<br />&nbsp;&nbsp;&nbsp;&nbsp;if(a[i][j-1] == "━") a[i][j] = "┫";<br />
&nbsp;&nbsp;&nbsp;&nbsp;else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(j==2*(num-1)) a[i][j] = "┃";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else a[i][j] = (Math.floor(Math.random()*2))? "┃" : "┣";<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;}<br />&nbsp;}<br />&nbsp;return a;<br />}</p>
<p>function writeAmida(matrix) {<br />&nbsp;var nums = new Array("①","②","③","④","⑤","⑥","⑦","⑧","⑨","⑩","⑪","⑫","⑬","⑭","⑮","⑯","⑰","⑱","⑲","⑳");<br />
&nbsp;document.write("&lt;br /&gt;");<br />&nbsp;for(i=0; i&lt;matrix.length; i++) {<br />&nbsp;&nbsp;for(j=0; j&lt;matrix[0].length; j++) {<br />&nbsp;&nbsp;&nbsp;document.write('&lt;span class="amida" id="amida' + i + "l" + j + '"&gt;');<br />
&nbsp;&nbsp;&nbsp;document.write(matrix[i][j]);<br />&nbsp;&nbsp;&nbsp;document.write('&lt;/span&gt;');<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;document.write("&lt;br /&gt;");<br />&nbsp;}<br />&nbsp;for(i=0; i&lt;(matrix[0].length+1)/2; i++) {<br />&nbsp;&nbsp;document.write('&lt;span class="amida" id="num' + i + '"&gt;');<br />
&nbsp;&nbsp;document.write(nums[i]);<br />&nbsp;&nbsp;document.write('　&lt;/span&gt;');<br />&nbsp;}<br />}</p>
<p>function traceAmida(matrix,i,i2,j,j2,step) {<br />&nbsp;pre_i = i; pre_j = j;<br />&nbsp;// n:人数　matrix[0].length: 2n-1　行列から人数を逆算⇒あみだの開始位置は偶数番目<br />&nbsp;if(i==0 &amp;&amp; j==0 &amp;&amp; step==0) {<br />&nbsp;&nbsp;pre_i = -1;<br />&nbsp;&nbsp;j = 2*Math.floor(Math.random()*(matrix[0].length+1)/2); // 最初は開始位置ランダム<br />
&nbsp;}<br />&nbsp;else {<br />&nbsp;&nbsp;if(matrix[i][j] == "━") j += (j - j2); <br />&nbsp;&nbsp;else if(matrix[i][j] == "┫") {<br />&nbsp;&nbsp;&nbsp;if(i-i2) j--; // 下向きに速度を持っていたら左<br />&nbsp;&nbsp;&nbsp;else i++; // 横向きだったら下へ<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else if(matrix[i][j] == "┣") {<br />
&nbsp;&nbsp;&nbsp;if(i-i2) j++; // 下向きに速度を持っていたら右<br />&nbsp;&nbsp;&nbsp;else i++; // 横向きだったら下へ<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;else i++; // ┃<br />&nbsp;}<br />&nbsp;if(!(i==matrix.length)) {<br />&nbsp;&nbsp;document.getElementById("amida" + i + "l" + j).style.color = (step)? "f00" : "ff0";<br />
&nbsp;&nbsp;step++;<br />&nbsp;&nbsp;setTimeout(function(){ traceAmida(matrix, i, pre_i, j, pre_j, step) }, 50);<br />&nbsp;} else {<br />&nbsp;&nbsp;document.getElementById("num" + (j/2)).style.color = "#00f";<br />&nbsp;}<br />}</p>// numに人数、lenに縦の長さ。これを実行すればOK。<br />
<p>function amida(num, len){<br />&nbsp;var a = makeAmida(num, len);<br />&nbsp;writeAmida(a);<br />&nbsp;traceAmida(a,0,0,0,0,0);<br />}</p></blockquote>
<br />といった感じです。参考になれば幸いです。あ、アミダの表示する領域はフォントをMS P ゴシックのようにPのついたものにしないで下さい。これはPのついたフォントが見栄えがいいように文字ごとに横幅を調整しているからです。横幅一定のMS ゴシックのようにPのついてないものを使用すればサンプルのようになります。<br /><br />[090203] スパムが多いので一時的にコメント不可にします。<br />]]>
        
    </content>
</entry>

<entry>
    <title>ボールの衝突判定（ActionScript3.0）</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2008/06/actionscript30.html" />
    <id>tag:www.hecomi.com,2008://1.41</id>

    <published>2008-06-04T16:07:26Z</published>
    <updated>2008-11-12T16:57:45Z</updated>

    <summary>前回（ボールの放り投げ）を発展させて、複数のボールに対しての衝突シミュレーション...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="ActionScript3.0" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="FLASH" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[前回（<a href="http://www.hecomi.com/2008/05/post-7.html">ボールの放り投げ</a>）を発展させて、複数のボールに対しての衝突シミュレーションを作ってみました。<br />サンプル:<br /><embed src="http://www.hecomi.com/flash/080530_1.swf" type="application/x-shockwave-flash" bgcolor="#ffffff" pluginspage="http://www.adobe.com/go/getflashplayer_jp" height="400" width="400"><br /><hr><embed src="http://www.hecomi.com/flash/080530_2.swf" type="application/x-shockwave-flash" bgcolor="#ffffff" pluginspage="http://www.adobe.com/go/getflashplayer_jp" height="400" width="400"><br /><br />↑１個つかんで投げるとエネルギーが増えて面白いです。<br />まずは、準備としてクラスを2つ用意します。<br /><br /><blockquote>// Ball.as<br />package {<br />&nbsp;&nbsp;&nbsp; import flash.display.Sprite;<br />&nbsp;&nbsp;&nbsp; import flash.events.*;<br />&nbsp;&nbsp;&nbsp; import flash.geom.Point;<br />&nbsp;&nbsp;&nbsp; class Ball extends Sprite {<br />&nbsp;&nbsp;&nbsp; 　～<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></blockquote><blockquote>// Test01.as<br />package {<br />&nbsp;&nbsp;&nbsp; import flash.display.*;<br />&nbsp;&nbsp;&nbsp; import flash.events.Event;<br />&nbsp;&nbsp;&nbsp; import Ball;<br />&nbsp;&nbsp;&nbsp; public class Test01 extends MovieClip {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  ～<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></blockquote>こんな感じです。Text01.asを適当な.flaファイルのドキュメントクラスに設定し、コンパイルすれば自分で定義したBallクラスを自由に扱えるようになります。Ball.asの全ソースは以下のようになります。<br /><blockquote>// Ball.as<br />package {<br />&nbsp;&nbsp;&nbsp; import flash.display.Sprite;<br />&nbsp;&nbsp;&nbsp; import flash.events.*;<br />&nbsp;&nbsp;&nbsp; import flash.geom.Point;<br />&nbsp;&nbsp;&nbsp; class Ball extends Sprite {<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // パラメータ<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var sw:Boolean = false;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var click_x:int = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var click_y:int = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var mouseX_bef:int;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var mouseY_bef:int;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public var v_x:Number = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public var v_y:Number = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var rub:Number = 1.05; // 摩擦<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var ela:Number = 0.80; // 弾性率<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var a_x:Number = 0.0; // 重力x<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var a_y:Number = 0.2; // 重力y<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var v_x_0:Number = 2.0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var v_y_0:Number = 2.0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var container:*;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var limitX:int;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var limitY:int;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private var color:int;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // construct <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; public function Ball(con:*, scale:int, col=0xFF0000):void {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; container = con;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; limitX = con.width-scale*2;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; limitY = con.height-scale*2;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; color = col;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var g = this.graphics;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.beginFill (col, 1.0);&nbsp;&nbsp;&nbsp; // 面のスタイル設定<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; g.drawCircle&nbsp; (scale, scale, scale);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; x = limitX * Math.random();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; y = limitY * Math.random();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_x = v_x_0 * Math.random();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_y = v_y_0 * Math.random();<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; container.addChild(this);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // イベントリスナー<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; addEventListener(MouseEvent.MOUSE_DOWN, switchOn);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; container.addEventListener(MouseEvent.MOUSE_UP, switchOff);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; container.addEventListener(MouseEvent.MOUSE_MOVE, moveBall);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; container.addEventListener(Event.ENTER_FRAME, throwBall);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // マウスダウンするとスイッチON＆ズレ分取得<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private function switchOn(event:MouseEvent):void {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sw = true;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; click_x = event.stageX - x;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; click_y = event.stageY - y;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // マウスアップするとスイッチ<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private function switchOff(event:MouseEvent):void {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; sw = false;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // ボールを移動する＆速度指定<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private function moveBall(event:MouseEvent):void {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(sw) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; x = container.mouseX - click_x;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; y = container.mouseY - click_y;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_x&nbsp; = container.mouseX - mouseX_bef;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_y = container.mouseY - mouseY_bef;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mouseX_bef = container.mouseX;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mouseY_bef = container.mouseY;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // ボールを投げる<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; private function throwBall(event:Event):void {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!sw) { // 捕まえられたら止まる<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 例外対策<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!v_x) v_x = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(!v_y) v_y = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 画面外に行かないように<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(x &lt; 0) x = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(x &gt; limitX) x = limitX;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(y &lt; 0) y = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(y &gt; limitY) y = limitY;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 端っこで跳ね返る<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((x + v_x) &lt; 0 || (x + v_x) &gt; limitX) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_x = -v_x/ela;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((y + v_y) &lt; 0 || (y + v_y) &gt; limitY) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_y = -v_y/ela;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 摩擦<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_x = v_x/rub;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_y = v_y/rub;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 重力<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(x &lt; stage.stageWidth - width*2) v_x += a_x;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(y &lt; stage.stageHeight - width*2) v_y += a_y;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 移動<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; x += v_x<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; y += v_y;<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 衝突判定<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; function crash(obj:Ball):void {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var o_slf:Point = new Point(x, y);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var o_obj:Point = new Point(obj.x, obj.y);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if( Point.distance(o_slf, o_obj) &lt; (width/2 + obj.width/2) )&nbsp; {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 中心方向とx軸との成す角を求める<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var c_x:Number = obj.x - x;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var c_y:Number = obj.y - y;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var theta:Number = Math.atan(Math.abs(c_y/c_x));<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 重なりを無くす<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var c_len:Number = Math.sqrt(c_x*c_x + c_y*c_y);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var len:Number = (width/2 + obj.width/2) - Point.distance(o_slf, o_obj);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(c_len) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; obj.x += len*c_x/c_len;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; obj.y += len*c_y/c_len;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // ベクトルをθ回転する<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var v_u:Number = v_x*Math.cos(theta) - v_y*Math.sin(theta);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var v_v:Number = v_x*Math.sin(theta) + v_y*Math.cos(theta);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var obj_v_u:Number = obj.v_x*Math.cos(theta) - obj.v_y*Math.sin(theta);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var obj_v_v:Number = obj.v_x*Math.sin(theta) + obj.v_y*Math.cos(theta);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // u方向のみ運動量保存則を適用（質量が同じと仮定し速度交換）<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; var tmp:Number = v_u/ela;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_u = obj_v_u/ela;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; obj_v_u = tmp;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // ベクトルを -θ回転する<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_x = v_u*Math.cos(theta) + v_v*Math.sin(theta);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_y = -v_u*Math.sin(theta) + v_v*Math.cos(theta);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; obj.v_x = obj_v_u*Math.cos(theta) + obj_v_v*Math.sin(theta);<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; obj.v_y = -obj_v_u*Math.sin(theta) + obj_v_v*Math.cos(theta);<br /><br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br /></blockquote>長くてすみません（汗）。基本的にはこの間と大差ありません。ただしコンストラクタにより引数で与えられたステージやコンテナに自身を追加するようになってるところと、衝突判定がついたところが大きな違いです。それでは衝突判定について説明します。<br /><br /><span class="mt-enclosure mt-enclosure-image"><img alt="080605_1.png" src="http://www.hecomi.com/2008/06/05/080605_1.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="245" width="266" /></span><div align="center">fig.1&nbsp; 衝突判定の説明図<br /> </div><div><br />fig.1を見てください。ボールとボールとの距離はc_lenで与えられます。これは、それぞれの中心座標をポイントとして、Point.distance()メソッドを使用したり、自身のxと対象となるオブジェクトのxの差であるc_xと同様に求めたc_yの２乗の和のルートを取ったりして取得することが出来ます。Ball.as中には２つの表記方法を用いてみましたので参考にしてください。さて、衝突判定は<br /><blockquote>if( Point.distance(o_slf, o_obj) &lt; (width/2 + obj.width/2) )<br /></blockquote>このようにして、中心間の距離が、それぞれの半径の和よりも小さいかどうかで判定出来ます。では衝突後の運動はどのように記述すればいいのでしょうか。高校で"運動量保存則"は習ったでしょうか？質量と速度の積を運動量と呼びますが、２つの物体の衝突に関して運動量の総量は変化しない、といった法則です。<br /><blockquote>m1*v1 + m2*v2 = m1*v1' + m2 + v2'<br /></blockquote>こんな感じです。今回は衝突する２つの物体の質量は同じ、と仮定しましたので<br /><blockquote>v1 + v2 = v1' + v2'<br /></blockquote>こんな風にかけます。ただしこれでは２変数（衝突後の自身の速度と相手の速度）が分かりませんので、もう１つ何かしらの式が必要です。これには、エネルギー保存の法則の式などが適用できますが、今回は衝突係数=1を用いた式で行いたいと思います。すなわち、壁にボールを投げると同じ速度で跳ね返ってくるのと同じように、ボールが衝突した後は、衝突する前に向かい合っていたスピードで遠ざかっていくという考え方です。これは、<br /><blockquote>v2 - v1 = -(v2' - v1')<br /></blockquote>このような式で書くことが出来ます。これらの連立方程式を解くと<br /><blockquote>v1' = v2<br />v2' = v1<br /></blockquote></div><div style="opacity: 0;" id="FluJE_quick_lookup"><span>Quick Lookup:</span><input id="FluJE_quick_lookup_input" /></div>という速度交換の式が成り立ちます。これを用いて衝突後のプログラムを書いていきましょう。ビリヤードのように、ボールの右端に当てれば左のほうへ飛んでいく、といった様子を再現します。そこで、座標軸の回転を使って一度x,yをu,vという座標に変換して運動量保存則を適用する、といったことをします。<br /><br /><span class="mt-enclosure mt-enclosure-image"><img alt="080605_2.png" src="http://www.hecomi.com/2008/06/05/080605_2.png" class="mt-image-center" style="margin: 0pt auto 20px; text-align: center; display: block;" height="198" width="188" /></span><div align="center">fig2.&nbsp; 衝突時の運動量保存則<br /></div><br />衝突方向をu軸、反射方向をv軸として運動量保存則を適用します。これには先ほど求めたc_xとc_yを使ってθを求めます。<br /><blockquote>θ = atan(c_y/c_x)<br /></blockquote>このように、アークタンジェント（タンジェントの逆数）を使って角度を求めます。ActionScriptでは、<br /><blockquote>theta = Math.atan(Math.abs(c_y/c_x));<br /></blockquote>と、Mathクラスのメソッドを利用します。さて座標軸の回転ですが、これには数Cの知識が必要で、回転行列を用いて計算します。回転行列とは、<br /><blockquote>cosθ&nbsp;&nbsp; -sinθ<br />sinθ&nbsp;&nbsp;  cosθ<br /></blockquote>の2*2行列ですが、虚数の掛け算が回転という知識を持っていれば簡単に導けます。<br /><blockquote>X+i*Y = (x+i*y)*(cosθ + i*sinθ)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;  &nbsp; = (x*cosθ - y*sinθ) + i*(x*sinθ + y*cosθ)<br />∴X = x*cosθ - y*sinθ<br />&nbsp;&nbsp; Y = x*sinθ + y*cosθ</blockquote><div>といった感じです。これより、座標の回転⇒衝突方向についての運動量保存則⇒座標を元に戻すといった３つの作業を行うことによって衝突を記述できます。<br /><blockquote>// ベクトルをθ回転する<br />var v_u:Number = v_x*Math.cos(theta) - v_y*Math.sin(theta);<br />var v_v:Number = v_x*Math.sin(theta) + v_y*Math.cos(theta);<br />var obj_v_u:Number = obj.v_x*Math.cos(theta) - obj.v_y*Math.sin(theta);<br />var obj_v_v:Number = obj.v_x*Math.sin(theta) + obj.v_y*Math.cos(theta);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />// u方向のみ運動量保存則を適用（質量が同じと仮定し速度交換）<br />var tmp:Number = v_u/ela;<br />v_u = obj_v_u/ela;<br />obj_v_u = tmp;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />// ベクトルを -θ回転する<br />v_x = v_u*Math.cos(theta) + v_v*Math.sin(theta);<br />v_y = -v_u*Math.sin(theta) + v_v*Math.cos(theta);<br />obj.v_x = obj_v_u*Math.cos(theta) + obj_v_v*Math.sin(theta);<br />obj.v_y = -obj_v_u*Math.sin(theta) + obj_v_v*Math.cos(theta);<br /></blockquote>いかがでしょうか。これを応用して作ったのが今回のサンプルです。for文で指定個数のBallインスタンスを作成し、enterFrameHandlerで衝突判定を行っています。衝突判定には、<br /><blockquote>for(var m:int=0; m&lt;ball_num; m++) {<br />&nbsp;&nbsp;&nbsp; for(var n:int=m+1; n&lt;ball_num; n++) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ball_mc[m].crash(ball_mc[n]);<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></blockquote>このように、ボールの個数の約２乗の半分回（<font style="font-size: 0.8em;">n</font>C<font style="font-size: 0.8em;">2</font>）だけ判定しています。なので200個とかやると激重です...。どなたかいい判定方法知っていたら教えてください。<br />...ちなみに、座標の回転をしなくてもx軸方向、y軸方向それぞれについて運動量保存則を適用しても記述できます。<br /><blockquote>var tmp:Number;<br />tmp = v_x;<br />v_x = obj.v_x;<br />obj.v_x = tmp;<br /><br />tmp = v_y;<br />v_y = obj.v_y;<br />obj.v_y = tmp;<br /></blockquote>が、これだと挙動がおかしくなります（例えば少しずらして正面衝突しても、普通に跳ね返るだけです）。試してみてください。<br />長くなりましたが、今回は以上です。<br /></div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>PHPにおけるプログレスバーの実現2</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2008/05/php2.html" />
    <id>tag:www.hecomi.com,2008://1.37</id>

    <published>2008-05-25T15:27:28Z</published>
    <updated>2008-05-29T10:35:54Z</updated>

    <summary>再び、競馬の解析のPHP作成を再開しました。前はサイアーラインから色分けした血統...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="競馬解析" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[再び、競馬の解析のPHP作成を再開しました。前はサイアーラインから色分けした血統表を作成、ってところまで作ったので、とりあえず保留。これからはオッズと着順の関係を条件ごとに検索できるシステムをちょくちょく作っていきたいと思っています。今はURL指定すれば自動で10000件くらいのレースのデータを取って来れるようにはなりました。次は取ってきたデータを解析するところを作っていきます。<br />話は変わってこのブログで一番アクセスが多いのがPHPのプログレスバー関連の話なので、ｇｄｇｄだった前回の説明を補足、簡略化する意味で再び解説していきたいと思います。<br /><br /><u><b>プログレスバー？</b></u><br />競馬の解析をする際、情報はネットからスクレイピング（必要な部分だけ抽出してくること: <a href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%AF%A5%EC%A5%A4%A5%D4%A5%F3%A5%B0">はてなダイアリー</a>）していますが、単純にウェブサイトを読み込む時間が必要なので、如何にブロードバンド時代と云えど100ページとか読み込むには相当な時間がかかります。しかもPHP側で特に何もしないと、果たして動いているのか動いていないのか分からないです（もしかしたらエラーが起きているかもしれない…）。そこでWindowsなどでファイルを移動するときに移動状況を表してくれる”アレ”がPHPでも使えたら便利じゃないか！まさにその”アレ”こそ、プログレスバーなのです。<br /><br /><u><b>タイムアウトするんだけど？</b></u><br />長い処理をするとタイムアウトしてしまうので、それを防がないとなりません。<br /><blockquote>set_time_limit(0); <br /></blockquote>こんな記述を冒頭に入れてあげましょう。<br /><br /><br /><u><b>PHPの知識だけでできるの？<br /></b></u>PHPの知識を持ってらっしゃる方は、大体HTMLの知識も持っていらっしゃると思います。プログレスバーは、PHP+JavaScriptで実現するのです。つまり、<br />&nbsp;&nbsp;&nbsp; PHPでJavaScriptの関数を呼出　⇒　JavaScriptでプログレスバーを動かす<br />といったことをやるわけです。それではPHPからどのようにして、JavaScriptを動かせば良いのでしょうか？<br /><br /><u><b>JavaScriptの準備<br /></b></u>簡単のために、まずはテキストが表示される例を作成してみましょう。HTML側には以下のような記述をしてください。<br /><blockquote>&lt;span id="msg"&gt;&lt;/span&gt;<br />&lt;script type="text/javascript"&gt;<br />function changeMsg(msg) {<br />&nbsp;&nbsp;&nbsp; document.getElementById("msg").innerHTML = msg;<br />}<br />&lt;/script&gt;<br /></blockquote>このchangeMsg()関数をPHPから呼び出し、&lt;span&gt;タグの中身を書き換えるわけです。<br /><br /><u><b>バッファについて</b></u><br />PHP側の記述を紹介する前に、「バッファ」について学んでおきましょう。バッファとはパソコンが処理をする際にそのデータを一時的に蓄えておくところのことです（<a href="http://support.microsoft.com/kb/878958/ja">パソコン用語 - バッファとは</a>）。PHPで意識しなければならないバッファは2種類あります。1つ目はサーバー側のバッファで、PHPで処理しているデータを向こうが処理が完了するまでためている、なんてことがあったら処理が完了するまで途中経過のデータが見れないことになってしまいます。2つ目はブラウザ側のバッファです。読み込みが遅くて画面が真っ白だから、もうや～めた、と思って中止ボタンを押すと、途中まで表示された！なんて例を挙げてみると分かりやすいのではないでしょうか。これらを吐き出させるためにPHPで次の2行を記述しなければなりません。<br /><blockquote>ob_flush();<br />flush();<br /></blockquote>バッファをフラッシュ（水をどっと流す）してあげる記述です。<br /><br /><u><b>PHPからJavaScriptを呼び出す！</b></u><br />いよいよここまで来ましたね。さぁ、どうするんだ！といった感じですが、実は至って簡単なのです。<br /><blockquote>$com = "表示したい内容"<br />echo '&lt;script type="text/javascript"&gt;changeMsg("' . $com . '")&lt;/script&gt;';<br /></blockquote><div style="opacity: 0;" id="FluJE_quick_lookup"><span>Quick Lookup:</span><input id="FluJE_quick_lookup_input" /></div>これだけです。ボブ風にいうと（ボブ知らなかったらすみませんｗｗ）、ほら、簡単でしょう？と言った感じですね。そして、お友達も書いてあげましょう、といった感じで、<br /><blockquote>sleep(1); // 重い処理する場所<br />$com = $i . "/" . $total; // $i: 処理中のデータ番号　$total: データ総数<br />echo '&lt;script type="text/javascript"&gt;changeMsg("' . $com . '")&lt;/script&gt;';<br />ob_flush();<br />flush();<br /></blockquote>こんな風にしちゃえばOKです。いかがでしょうか？思ったよりも簡単ですよね。具体例を挙げると、<br /><blockquote>$i=1;<br />foreach($url as $urls) {<br />&nbsp;&nbsp;&nbsp; getDataFromURL($url); <br />&nbsp;&nbsp;&nbsp; // （$urlのページからデータを取ってくる自分で定義した関数）<br />&nbsp;&nbsp;&nbsp; $com = $i . "/" . count($datas);<br />&nbsp;&nbsp;&nbsp; echo '&lt;script type="text/javascript"&gt;changeMsg("' . $com . '")&lt;/script&gt;';<br />&nbsp;&nbsp;&nbsp; ob_flush();<br />&nbsp;&nbsp;&nbsp; flush();<br />}<br /></blockquote><br />こんな感じです。<br /><br />プログレスバーに応用したい場合は、JavaScript側で工夫さえすればPHPで何もする必要はありません。<a href="http://www.hecomi.com/2007/11/php.html">PHPにおけるプログレスバーの実現</a>でプログレスバーを動かすサンプルを置いてあるのでぜひそちらも見てみてください。]]>
        
    </content>
</entry>

<entry>
    <title>ボールの放り投げ</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2008/05/post-7.html" />
    <id>tag:www.hecomi.com,2008://1.35</id>

    <published>2008-05-22T16:32:02Z</published>
    <updated>2008-05-22T18:47:17Z</updated>

    <summary>ActionScript3.0始めました。今日はボールの放り投げについてのソース...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="ActionScript3.0" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="FLASH" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="as30" label="AS3.0" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[ActionScript3.0始めました。今日はボールの放り投げについてのソースを書いてみました。ステージ内でボールをクリックするとドラッグ出来ます。そのまま放り投げたとき、ステージの端で跳ね返る運動を書いてみました。<br />サンプル:<br />
<embed src="http://www.hecomi.com/flash/080522_2.swf" type="application/x-shockwave-flash" bgcolor="#ffffff" pluginspage="http://www.adobe.com/go/getflashplayer_jp" height="320" width="450">
<br /><blockquote>// イベントリスナー<br />my_ball.addEventListener(MouseEvent.MOUSE_DOWN, switchOn);<br />stage.addEventListener(MouseEvent.MOUSE_UP, switchOff);<br />stage.addEventListener(MouseEvent.MOUSE_MOVE, moveBox);<br />stage.addEventListener(Event.ENTER_FRAME, throwBox);<br /><br />// パラメータ<br />var sw:Boolean = false;<br />var click_x:int = 0;<br />var click_y:int = 0;<br />var mouseX_bef:int;<br />var mouseY_bef:int;<br />var v_x:Number = 0;<br />var v_y:Number = 0;<br />var rub:Number = 1.01; // 摩擦<br />var ela:Number = 1.2; //弾性率<br />var limitX:int = stage.stageWidth - my_ball.width;<br />var limitY:int = stage.stageHeight - my_ball.height;<br /><br />// マウスダウンするとスイッチON＆ズレ分取得<br />function switchOn(event:MouseEvent):void {<br />&nbsp;&nbsp;&nbsp; sw = true;<br />&nbsp;&nbsp;&nbsp; click_x = event.stageX - my_ball.x;<br />&nbsp;&nbsp;&nbsp; click_y = event.stageY - my_ball.y;<br />}<br /><br />// マウスアップするとスイッチ<br />function switchOff(event:MouseEvent):void {<br />&nbsp;&nbsp;&nbsp; sw = false;<br />}<br /><br />// ボックスを移動する＆速度指定<br />function moveBox(event:MouseEvent):void {<br />&nbsp;&nbsp;&nbsp; if(sw) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; my_ball.x = stage.mouseX - click_x;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; my_ball.y = stage.mouseY - click_y;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_x&nbsp; = stage.mouseX - mouseX_bef;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_y = stage.mouseY - mouseY_bef;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mouseX_bef = stage.mouseX;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; mouseY_bef = stage.mouseY;<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br />// ボールを投げる<br />function throwBox(event:Event):void {<br />&nbsp;&nbsp;&nbsp; if(!sw) { // 捕まえられたら止まる<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 画面外に行かないように<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(my_ball.x &lt; 0) my_ball.x = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(my_ball.x &gt; limitX) my_ball.x = limitX;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(my_ball.y &lt; 0) my_ball.y = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(my_ball.y &gt; limitY) my_ball.y = limitY;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 端っこで跳ね返る<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((my_ball.x + v_x) &lt; 0 || (my_ball.x + v_x) &gt; limitX) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_x = -v_x/ela;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if((my_ball.y + v_y) &lt; 0 || (my_ball.y + v_y) &gt; limitY) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_y = -v_y/ela;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 摩擦<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_x = v_x/rub;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; v_y = v_y/rub;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 移動<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; my_ball.x += v_x<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; my_ball.y += v_y;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // 動き続けないように<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(Math.abs(v_x) &lt; 0.01) v_x = 0;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if(Math.abs(v_y) &lt; 0.01) v_y = 0;<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></blockquote><br /><br />ちなみに、改良するとこんなんなります。
<embed src="http://www.hecomi.com/flash/080522_3.swf" type="application/x-shockwave-flash" bgcolor="#ffffff" pluginspage="http://www.adobe.com/go/getflashplayer_jp" height="320" width="450">
<div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>checkboxのリセット</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2008/05/checkbox.html" />
    <id>tag:www.hecomi.com,2008://1.34</id>

    <published>2008-05-19T16:55:04Z</published>
    <updated>2008-05-20T12:13:09Z</updated>

    <summary>PHPなどでチェックボックスを配列として受け取るときは、nameの後ろに[]を付...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[PHPなどでチェックボックスを配列として受け取るときは、nameの後ろに[]を付ければＯＫです。しかし、JavaScriptを使ってそんなチェックボックスを全部リセットしたい！もしくは全部チェックしたい！って場面に出くわしたことはないでしょうか。nameが全部同じだからどうやって判別したらいいんだろう・・・？そんな時は、全部の要素を調べてしまうという方法があります。<br /><blockquote>&lt;form action="./hoge.php" method="POST" name="hoge"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type="checkbox" name="chk[]" value="1" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type="text" name="text1" value="凸" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type="checkbox" name="chk[]" value="2" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type="text" name="text2" value="凹" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type="checkbox" name="chk[]" value="3" /&gt;<br />&lt;/form&gt;<br /><br />-----------(preview)-----------<form contenteditable="false" action="./hoge.php" method="post" name="hoge">
    <input name="chk[]" value="1" type="checkbox" />
    <input name="text1" value="凸" type="text" />
    <input name="chk[]" value="2" type="checkbox" />
    <input name="text2" value="凹" type="text" />
    <input name="chk[]" value="3" type="checkbox" />
</form></blockquote>こんな風にタグが並んでいるときに、チェックボックスだけ選択してチェックをいれるためには、<br /><blockquote>document.[form名].elements.length<br /></blockquote>を使います。これはform内にある要素の数を数えてくれます。上の例でいえば5となります。では、早速すべてのチェックボックスをチェックするスクリプトを書いてみましょう。<br /><blockquote>&lt;script type="text/javascript"&gt;<br />&nbsp;&nbsp;&nbsp; function chkAllChkbox() {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; for(i=0;i&lt;document.hoge.elements.length;i++) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &nbsp;  if(document.hoge.elements[i].name == "chk[]") {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &nbsp;&nbsp; document.hoge.elements[i].checked = true;<br />&nbsp;&nbsp;&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;  }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&lt;/script&gt;<br />&lt;input type="button" onClick="chkAllChkbox()" value="check" /&gt;<br /><br />-----------(preview)-----------<br /><script type="text/javascript">
    function chkAllChkbox() {
        for(i=0;i<document.hoge.elements.length;i++) {
           if(document.hoge.elements[i].name == "chk[]") {
                document.hoge.elements[i].checked = true;
           }
        }
    }
</script>
<input onclick="chkAllChkbox()" value="check" type="button" /></blockquote>
いかがでしょうか。なお、checkboxの数を<br /><blockquote>document.[form名].elements['checkboxの名前'].length<br /></blockquote>で調べることもできます。覚えておくと便利？これを使ってradioボタンみたいなことを実現してみましょう。checkboxに更にＩＤを加えます。上とは違ってgetElementByIdを使ってcheckedを調べています。<br /><br /><blockquote>&lt;script type="text/javascript"&gt;<br />&nbsp;&nbsp;&nbsp; function unchkOthers(num) {<br />&nbsp;&nbsp; &nbsp;&nbsp; &nbsp; for(i=1;i&lt;=document.hoge2.elements['chk[]'].length;i++) {<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; document.getElementById('chk' + i).checked = false;<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; document.getElementById('chk' + num).checked = true;<br />&nbsp;&nbsp;&nbsp; }<br />&lt;/script&gt;<br /><br />&lt;form action="./hoge.php" method="POST" name="hoge2"&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type="checkbox" name="chk[]" value="1" id="chk1" onClick="unchkOthers(1)" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type="checkbox" name="chk[]" value="2" id="chk2" onClick="unchkOthers(2)" /&gt;<br />&nbsp;&nbsp;&nbsp; &lt;input type="checkbox" name="chk[]" value="3" id="chk3" onClick="unchkOthers(3)" /&gt;<br />&lt;/form&gt;<br /><br />-----------(preview)-----------<br /><script type="text/javascript">
    function unchkOthers(num) {
        for(i=1;i<=document.hoge2.elements['chk[]'].length;i++) {
            document.getElementById('chk' + i).checked = false;
        }
       document.getElementById('chk' + num).checked = true;
    }
</script>

<form contenteditable="false" action="./hoge.php" method="post" name="hoge2">
    <input name="chk[]" value="1" id="chk1" onclick="unchkOthers(1)" type="checkbox" />
    <input name="chk[]" value="2" id="chk2" onclick="unchkOthers(2)" type="checkbox" />
    <input name="chk[]" value="3" id="chk3" onclick="unchkOthers(3)" type="checkbox" />
</form>
</blockquote>getElementByIdとはその名の通りＩＤから要素を判別することができます。是非使ってみてくださいね。<br />
<br /><br /><div style="opacity: 0;" id="FluJE_quick_lookup"><span>Quick Lookup:</span><input id="FluJE_quick_lookup_input" /></div>]]>
        
    </content>
</entry>

<entry>
    <title>ドレミファソラシのMP3データ</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2008/05/mp3.html" />
    <id>tag:www.hecomi.com,2008://1.29</id>

    <published>2008-04-30T17:33:19Z</published>
    <updated>2008-04-30T17:39:05Z</updated>

    <summary>FLASHでマウスオーバーするとポロロンってなるようにしたかったので、ドレミのW...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="FLASH" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[FLASHでマウスオーバーするとポロロンってなるようにしたかったので、ドレミのWAVかMP3のデータを探したのですがなかなかなかったので作ってみました。手順は、<br />１、MuseでMIDIファイルを作成<br />２、Timidi95でWAVに変換<br />３、Lame Ivy Frontend EncoderでMP3に変換<br />といった面倒くさい手順を経て完成しました。ビットレートは48kでファイルサイズは1個当たり約6KB程度です。ちなみに著作権フリーなので適当に扱ってください。ダウンロードは下をクリックです。<div align="center"><span class="mt-enclosure mt-enclosure-file"><br /><a href="http://www.hecomi.com/drmfslc.zip">drmfslc.zip</a></span></div>]]>
        
    </content>
</entry>

<entry>
    <title>シンボルの置換</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2008/04/post-6.html" />
    <id>tag:www.hecomi.com,2008://1.26</id>

    <published>2008-04-24T13:28:11Z</published>
    <updated>2008-04-24T13:57:37Z</updated>

    <summary>ニュースリリースを管理するシステムを作っていたのですが、®や©などを上付きにする...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[ニュースリリースを管理するシステムを作っていたのですが、®や©などを上付きにするために、<br /><blockquote>&lt;span class="sup"&gt;&amp;copy;&lt;/span&gt;<br /></blockquote>などとクライアントに入力していただくのは少々難があります。そのために、<br /><blockquote>&lt;input type="button" onClick='forms[0].text.value="&lt;span class=\"sup\""&gt;&amp;copy;&lt;/span&gt;'&gt;<br /></blockquote>のようにボタンを実装してみたのですが、どうにもtextareaに入力される文章が多くてうざったいです。また、このようにして挿入した文章をSQLなどのデータベースに保存すると、magic_quote_gpcがONになっていた場合、'や"の前にバックスラッシュが挿入されてしまいます。それを除去するために、stripslashes()関数を使うのも面倒くさいですので、どうにかできないと考えてみました。<br />そこで、他の方々もやっていると思われますが、入力される文字を、<br /><blockquote>[symbol:COPY]<br /></blockquote>のように勝手に自分で定義し、後で<br /><blockquote>str_replace("[symbol:COPY]","&lt;span class=\"sup\"&gt;&amp;copy;&lt;/span&gt;",$string);<br /></blockquote>のように置換してしまおう、という作戦に出ました。このようにすれば他にもシンボルを配列で定義し、<br /><blockquote>$symbols = array(<br />&nbsp;&nbsp;&nbsp; "COPY" =&gt; "&lt;span class=\"sup\"&gt;&amp;copy;&lt;/span&gt;",<br />&nbsp;&nbsp;&nbsp; "REG" =&gt; "&lt;span class=\"sup\"&gt;&amp;reg;&lt;/span&gt;",<br />&nbsp;&nbsp;&nbsp; ...<br />)<br />while( list($key,$val) = each($symbols) ) {<br />&nbsp;&nbsp;&nbsp; str_replace("[symbol:". $key ."]",$val,$string);<br />}<br /></blockquote>とまとめることもできます。<br /><br />次に、リンクも同様に置換してしまおうと思い、<br /><blockquote>[link:題名:URL] =&gt; &lt;a href="URL"&gt;題名&lt;/a&gt;<br /></blockquote>と定義しました。そして変換時に正規表現を使おうと思い、初めはereg_replace()を使ってみました。しかしながらどんなにやってもエラーが出るため、調べてみると日本語用にmb_ereg_replace()があることを発見（知ってろよって感じですが…（汗））。preg_replace()もありますがmb_ereg_replace()の方が個人的に表記が簡単かと思い、こちらを使用しました。<br /><blockquote>mb_ereg_replace("\[link:(.*?):(.*?)\]", "&lt;a href=\"\\2\"&gt;\\1&lt;/a&gt;", $string);<br /></blockquote>これで万事解決ですが、もっといい方法とかありましたら教えてください。<br /><div style="opacity: 0;" id="FluJE_quick_lookup"><br /><span></span><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>phpCollabの設置と日本語化</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2008/01/phpcollab.html" />
    <id>tag:www.hecomi.com,2008://1.22</id>

    <published>2008-01-05T09:59:40Z</published>
    <updated>2008-01-05T10:52:46Z</updated>

    <summary>現在、Web制作の仕事で、プロジェクトのスケジュール管理が重要になっています。な...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Tools" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[現在、Web制作の仕事で、プロジェクトのスケジュール管理が重要になっています。なんとかしないと、とはじめはExcelでスケジュールを作っていたのですが、これだとExcelデータの交換にも時間がかかりますし、何より煩雑、面倒い。さらに、どうやってスケジュール管理していいのか分らない…、ということで、いろいろネットを探していたところ、<a href="http://www.php-collab.com/blog/">phpCollab</a>というものを発見。簡単にいえばプロジェクトの進行管理をしてくれるようなブラウザベースの管理システムです。詳しくは、<a href="http://journal.mycom.co.jp/column/yetanother/061/">マイコミジャーナル</a>の記事を参照してください。早速使ってみましょう、と思って、<a href="http://sourceforge.net/project/showfiles.php?group_id=46510&amp;package_id=53022&amp;release_id=332252">phpcollab-2.5 rc 3</a>のバージョンをダウンロード。初期設定については、phpcollab-2.5\docs\install.txtに、<br /><blockquote># Install (only for first install, not for update)<br />- Extract in one folder, "phpcollab" for example (with Xoops integration, extract as "phpcollab" in modules folder)<br />- Unix/Linux: rename "includes/settings_blank.php" to "includes/settings.php"<br />- Unix/Linux: chmod 777 + chown apache "includes/settings.php" file, "files" folder and "logos_clients" folder<br />- Create a new MySql, PostgreSQL or Sql Server database "phpcollab" or use existing database<br />- Start at installation/setup.php<br />- Set all parameters<br />- Delete installation/setup.php file after successfull install<br />- Login at index.php<br />- With Xoops integration, go to admin, edit settings and set Xoops integration to "true" and set full path to your Xoops folder<br />- Avanced users can edit generated file includes/settings.php<br /></blockquote>と書いてあります。これを自分なりに追加・解釈して読むと、<br /><blockquote>①ダウンロードしたファイルを解凍<br />②includes/settings_blank.phpの_blankを消して、includes/settings.phpにする。<br />③アップロードする<br />④includes/settings.phpのパーミッションを777にする。<br />⑤installation/setup.phpにアクセス。<br />⑥各種設定（詳しくは<a href="http://journal.mycom.co.jp/column/yetanother/061/">マイコミジャーナル</a>参照）<br />⑦installation/setup.phpを削除。<br />⑧index.phpにアクセスして使い放題<br /></blockquote>といった感じです。ただし、マイコミジャーナルの記事にも書いてあるとおり、notificationメール（プロジェクトが変更されたときなどに送信されるメール）と、ガントチャート（プロジェクト作成&gt;タスク作成　とするとプロジェクトの画面に現れます）において文字化けします。特にガントチャートについてはこのシステムの目玉なので、文字化けは痛い…、ということで何とかしたい！と思いますが、これは…<a href="http://journal.mycom.co.jp/column/yetanother/061/">マイコミジャーナル</a>参照。さーせんｗ。ただし2点だけ補足。efontからダウンロードできるさざなみフォントは、tar.bz2という拡張子がついていますので、+Lhacaか何かで解凍してください。あと絶対パスという言葉が出てきますが、これは/home/～のように始まるパスです。lolipopなら、/home/sites/lolipop.jp/users/*****-*****/web/（ここで自分のルートフォルダ)php/phpcollab/includes/fonts/といった感じになります。次にメールについてですが、残念ながらマイコミジャーナルの記事では文字化け治らなかったので…、includes/phpmailer/class.phpmailer.phpの中の、437行目付近で<br /><br /><blockquote>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($this-&gt;Sender != "" &amp;&amp; strlen(ini_get("safe_mode"))&lt; 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { (略)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rt = @mail($to, $this-&gt;EncodeHeader($this-&gt;Subject), $body, <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $header, $params);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rt = @mb_send_mail($to, $this-&gt;EncodeHeader($this-&gt;Subject), $body, $header);<br /></blockquote>となっている箇所があるので、<br /><blockquote>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($this-&gt;Sender != "" &amp;&amp; strlen(ini_get("safe_mode"))&lt; 1)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { (略)<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @mb_language("ja");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @mb_internal_encoding("UTF-8");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rt = @mb_send_mail($to, $this-&gt;EncodeHeader($this-&gt;Subject), $body, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $header, $params);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @mb_language("ja");<br />&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; @mb_internal_encoding("UTF-8");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $rt = @mb_send_mail($to, $this-&gt;EncodeHeader($this-&gt;Subject), $body, $header);<br /></blockquote>といった感じに変更してください。するとしっかりと日本語でメールが送られてくるはずです。実際phpCollabまだ使い始めなんでその威力はわからないですが、最初触れた感じは、結構使いやすそうです。みなさんも是非試してみてください。<br />]]>
        
    </content>
</entry>

<entry>
    <title>ブロック要素 - はみ出しの追従</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2007/12/post-5.html" />
    <id>tag:www.hecomi.com,2007://1.21</id>

    <published>2007-12-16T17:09:28Z</published>
    <updated>2007-12-16T17:42:52Z</updated>

    <summary>ブロック要素を入れ子にして、外側のブロック要素で枠線を指定しているとき、内側のブ...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="CSS" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[ブロック要素を入れ子にして、外側のブロック要素で枠線を指定しているとき、内側のブロック要素が長くなってくると、FireFoxでは枠線が追従しないことがあります。…これで2時間くらい悩んでました。そこでググってみたところ、<a href="http://www.htmq.com/style/overflow.shtml">HTMLクイックリファレンス様</a>のページにてCSSのoverflowを発見。『overflow…はみ出た内容の表示方法を指定する<strong></strong>』だそうです。<br /><blockquote>visible: これで指定するとFireFoxではみ出ました。<br />auto: これに直すと追従。<br /></blockquote>ってな感じです。IEだと標準で追従するようです。詳しくはリンク先を参照してください。あー…知らないことまだまだたくさんあるなぁ…。<br />]]>
        
    </content>
</entry>

<entry>
    <title>PHPにおけるプログレスバーの実現</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2007/11/php.html" />
    <id>tag:www.hecomi.com,2007://1.20</id>

    <published>2007-11-24T16:17:09Z</published>
    <updated>2008-06-30T07:22:19Z</updated>

    <summary>プログレスバーとは作業の進行状況をバーの長さで表示してくれるアレです。ファイルの...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="JavaScript" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[プログレスバーとは作業の進行状況をバーの長さで表示してくれるアレです。ファイルのコピーとかする時よく見かけますよね。あれをＰＨＰで実現しようと四苦八苦した結果をまとめておきたいと思います。<br /><br />（別のまとめも作りました：<a href="http://www.hecomi.com/2008/05/php2.html">PHPにおけるプログレスバーの実現2</a>）<br /><br />用意するＨＴＭＬは、<br /><blockquote>
 
<style type="text/css">
#p_bar ,#p_bar2 {background: #565656; font-size: 3mm; width: 0; padding: 0; margin: 0; border-spacing: 0;}
#i_p_bar, #i_p_bar2 {color: #ffffff; text-align: right;}
#out_bar, #out_bar2 {background: #cfcfcf; width: 300px; border: 1px #565656 solid; padding: 0; margin: 0; border-spacing: 0;}
.under_p_bar {color: #565656; font-size: 3mm;}
</style>

<table id="out_bar" width="300">
<tbody><tr><td>

<table id="p_bar">
<tbody><tr><td id="i_p_bar">&nbsp;</td></tr>
</tbody></table>

</td></tr>
</tbody></table>
<span id="msg" class="under_p_bar">Wait a minute ...</span><br /></blockquote>こんなです。ソースは、<br /><blockquote>&lt;style type="text/css"&gt;<br />#p_bar {background: #565656; font-size: 3mm; width: 0; padding: 0; margin: 0; border-spacing: 0;}<br />#i_p_bar {color: #ffffff; text-align: right;}<br />#out_bar {background: #cfcfcf; width: 300px; border: 1px #565656 solid; padding: 0; margin: 0; border-spacing: 0;}<br />.under_p_bar {color: #565656; font-size: 3mm;}<br />&lt;/style&gt;<br /><br />&lt;table id="out_bar" width="300"&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;<br /><br />&lt;table id="p_bar"&gt;<br />&lt;tbody&gt;&lt;tr&gt;&lt;td id="i_p_bar"&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;<br />&lt;/tbody&gt;&lt;/table&gt;<br /><br />&lt;/td&gt;&lt;/tr&gt;<br />&lt;/tbody&gt;&lt;/table&gt;<br />&lt;span id="msg" class="under_p_bar"&gt;Wait a minute ...&lt;/span&gt;<br />&lt;span id="rest" class="under_p_bar"&gt;&lt;/span&gt;<br /><br /></blockquote>こんな感じで書けますね。まぁデザイン等はお好みで。次にＪａｖａＳｃｒｉｐｔ部分は、<br /><blockquote><br />// メッセージを変える<br />function changeMsg(msg) {<br />&nbsp;&nbsp;&nbsp; $('msg').innerHTML =msg;<br />}<br /><br />// プログレスバーを動かす<br />function setProgress(i ,all) {<br />&nbsp;&nbsp;&nbsp; Element.setStyle($('p_bar'), {'width': ((i/all)*300)+'px'});<br />&nbsp;&nbsp;&nbsp; $('i_p_bar').innerHTML = Math.round(100*(i/all))+"%";<br />&nbsp;&nbsp;&nbsp; $('rest').innerHTML = i + "/" + all + "件を処理完了";<br />}<br /><br /></blockquote>こんなになってます…、あ、ちなみに<a href="http://www.prototypejs.org/">prototype.js</a>使ってます。まぁ見ての通りchangeMsg()ではidがmsgのspanの中身を変える関数、setProgressではプログレスバーの横幅を変更、処理状況をidがrestのspanに書きだしています。んじゃぁ、この関数をどうやって実行するのか、ですが、これはＰＨＰ側で行います。<br /><blockquote>echo "&lt;script type=\"text/javascript\"&gt;changeMsg(\"解析開始...\")&lt;/script&gt;\n";<br />ob_flush();<br />
flush();<br /></blockquote>こんな感じでです。flush()ってのはバッファをフラッシュしているらしいです。バッファ？フラッシュ？良く分かんないですがｗなんか、ob_flush()とflush()を両方コールすることでで向こう側にある処理途中の情報も送信してくれて（普通は処理し終わってから全部こっちに送ってくれるのかな？）ブラウザに表示してくれる、と解釈してます。まぁ動けばよし！ということで…。知ってる人いたら教えてください。そいでもって、プログレスバーを進めるには、<br /><blockquote>echo "&lt;script type=\"text/javascript\"&gt;setProgress(".$i.",".$this-&gt;cntData. ")&lt;/script&gt;\n";<br /></blockquote>こんな感じで行います。あ、ちなみに$this-&gt;cntDataには解析するデータ総数、$iには解析中のデータの番号を格納しています。こんな感じにすることでプログレスバーが実現できちゃいます。もうちょい詳しく書くと、<br /><blockquote>$i=0; $all = count($data);<br />foreach($data) {<br />&nbsp;&nbsp;&nbsp; sleep(1); //ここが重い処理をする場所。<br /><br />&nbsp;&nbsp;&nbsp; echo "&lt;script type=\"text/javascript\"&gt;setProgress(".$i.",".$all. ")&lt;/script&gt;\n";<br />&nbsp;&nbsp;&nbsp; ob_flush();<br />&nbsp;&nbsp;&nbsp; flush();<br />&nbsp;&nbsp;&nbsp; $i++;<br />}<br /></blockquote>こんな感じですかね。実装すると<br /><blockquote>



<table id="out_bar2" width="300">

<tbody><tr><td>

<table id="p_bar2">
<tbody><tr><td id="i_p_bar2">&nbsp;</td></tr>
</tbody></table></td></tr></tbody>
</table>

<span id="msg2" class="under_p_bar">Wait a minute ...</span>
<span id="rest2" class="under_p_bar"></span>
<script type="text/javascript">
function setProgress(i ,all) {
	Element.setStyle($('p_bar2'), {'width': ((i/all)*300)+'px'});
	$('i_p_bar2').innerHTML = Math.round(100*(i/all))+"%";
	$('rest2').innerHTML = i + "/" + all + "件を処理完了";
}
i=0;
testProgressBar();
function testProgressBar() {
	if(i>=100) i=0;
	i++;
	setProgress(i,100);
	setTimeout(testProgressBar, 100);
}
  </script>
<br />
</blockquote>こんな感じになります。流れとしては、<br />① 重い処理をする<br />② 画面にプログレスバーを進めるJavaScriptを書き出す。<br />③ flushしないと画面に反映されないので、ob_flush()とflush()をする。<br />という感じです。例が分かりにくかったかもしれませんが参考になれば幸いです。<br />]]>
        
    </content>
</entry>

<entry>
    <title>IE6 standalone in Windows Vista</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2007/11/ie6-standalone-in-windows-vist.html" />
    <id>tag:www.hecomi.com,2007://1.19</id>

    <published>2007-11-24T16:02:21Z</published>
    <updated>2007-11-24T16:15:14Z</updated>

    <summary>競馬の解析の方は若干離れてました。今は、とある紹介で企業から頂いたサイト作りの仕...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="Tools" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[競馬の解析の方は若干離れてました。今は、とある紹介で企業から頂いたサイト作りの仕事に専念してます。<br /><br />その際、<em>CrossBrowser</em>に対応するよう努めているのですが、今日バイト先のＰＣから見たらレイアウトが崩れてました。なぜに！？と思ったのですが、そのＰＣに入っていたのはＩＥ６。うちのvistaに入っているのはＩＥ7と狐だけなので気づきませんでした。これはヤバイな、と思って家に帰ってきてから昔動かしたことのあるIE6 standaloneを起動しましたが動きません。…なぜ、と思ったのですが、昔動かしていたのは今はセーフモードでしか起動しなくなったXPの方のパソコンでした。あー、なぜー、と思って調べてみると<a href="http://tredosoft.com/IE6_For_Vista_Part_1">Internet Explorer 6 in Windows Vista (IE6) - part 1</a>なる記事を発見。苦手な英語も狐のアドオン<a href="https://addons.mozilla.org/ja/firefox/addon/1171">Dictionary Tooltip</a>の力を借りて何とか読みました。簡単に最後の部分を訳すと<br /><blockquote>ＨＴＭＬとＣＳＳは成功したけどＪａｖａＳｃｒｉｐｔはまだダメヨ。<br /></blockquote>ってことらしいです。なんかごちゃごちゃいじらなきゃいけないみたいなんで、自分には無理！とあきらめました。仕方ないのでＸＰが入ってるノートＰＣを併用して確認して作業していきたいと思います…、無念。<br />]]>
        
    </content>
</entry>

<entry>
    <title>配列関数</title>
    <link rel="alternate" type="text/html" href="http://www.hecomi.com/2007/11/post-4.html" />
    <id>tag:www.hecomi.com,2007://1.17</id>

    <published>2007-11-10T16:23:25Z</published>
    <updated>2007-11-10T16:47:53Z</updated>

    <summary>今日は競馬解析プログラムを作ってて使えると思った配列関数の紹介です。全部は紹介し...</summary>
    <author>
        <name>凹</name>
        <uri>http://hecomi.com/</uri>
    </author>
    
        <category term="PHP" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="配列関数" label="配列関数" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="ja" xml:base="http://www.hecomi.com/">
        <![CDATA[今日は競馬解析プログラムを作ってて使えると思った配列関数の紹介です。全部は紹介しきれない上に分かってないのも多いので、<a href="http://www.php.net/manual/ja/ref.array.php">PHP</a>のサイトの方を見て頂いた方がいいかも・・・。<br /><br />1. list()<br />
配列を変数に分解できる関数です。<br />
<blockquote>$fruit = array("apple", "banana");<br />
$list($fruit1, $fruit2) = $fruit;<br />
</blockquote>
なんて感じで分解できます。これを利用してよく使われるのがeach()との組み合わせで、<br />
<blockquote>$fruit = array(<br />
&nbsp;&nbsp;&nbsp; "佐藤" =&gt; "先生",<br />
&nbsp;&nbsp;&nbsp; "鈴木" =&gt; "友達",<br />
&nbsp;&nbsp;&nbsp; "伊藤" =&gt; "上司"<br />
);<br />
while(list($name, $rel) = each($fruit)) {<br />
&nbsp;&nbsp;&nbsp; echo $name . "は僕の" . $rel . "です。&lt;br /&gt;\n";<br />
}<br />
  <br />
/* 出力<br />
&nbsp;&nbsp;&nbsp; 佐藤は僕の先生です。<br />
&nbsp;&nbsp;&nbsp; 鈴木は僕の友達です。<br />
&nbsp;&nbsp;&nbsp; 伊藤は僕の上司です。<br />
*/<br />
</blockquote>
てな感じになります。each()はキーとその値を分けてくれる関数です。なお、この状態でもう一度実行しても<br />
<blockquote>while(list($name, $rel) = each($fruit)) {<br />

&nbsp;&nbsp;&nbsp; echo $name . "は僕の" . $rel . "です。&lt;br /&gt;\n";<br />

}<br />
/* 出力<br />
&nbsp;&nbsp;&nbsp; <br />
*/<br />
</blockquote>
となってしまいます。これは配列の内部にポインタってものがあって、今どこを参照しているか記憶しているものです。これを最初に戻してあげるために、<br />
<blockquote>reset($fruit);<br />
</blockquote>
をしてあげてからwhileを実行しないと動作しませんので注意してください（僕はこれで生じたエラーで1時間悩みましたｗ）<br /><br />2. array_count_values()<br />重複した項目をカウントしてくれる関数です。うちの競馬解析では<br /><blockquote>// 重複度合を調べる<br />$chk_cross = array_count_values($this-&gt;horse);<br /></blockquote>こんな感じで、クロス（同じ祖先を重複して持つ）を調べています。$this-&gt;horseは配列で馬の名前が格納されてます。最初はこの重複を、<br /><blockquote>$i=0;<br />foreach($this-&gt;horse as $hname) {<br />&nbsp;&nbsp;&nbsp; $chk_cross[$this-&gt;horse[$i]]++;<br />&nbsp;&nbsp;&nbsp; $i++;<br />}<br /></blockquote>で調べてたんですが、マニュアル見てたら見っけました。やっぱ欲しい関数って結構あるもんなんですね。<br /><br />紹介と言いつつ2つしか書いてませんがｗ、あとはarray_search()くらいですかね、使ったのは。配列は結構いろんな場面で使うので、ざっとマニュアルに目を通しておくと面白いですよ。<br />]]>
        
    </content>
</entry>

</feed>

