忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2025/08/05 18:36 |
Zend Framework2.1.3 Zend\Stdlib\ArrayStack
Zend\Stdlib\ArrayStackは、ArrayObjectをスタックとして扱えるようになるクラスです。
中身はArrayObjectをextendsしており、変更されているメソッドはただひとつgetIterator()だけです。


<?php
	header('Content-type: text/html; charset=UTF-8');
	require_once('path/to/channel/vendor/autoload.php');
	use Zend\Stdlib\ArrayStack;
	
	$arrayStack = new ArrayStack();
	$arrayObject = new \ArrayObject();
	
	for($i=0;$i<5;$i++){
		$arrayStack->append('val:' . $i);
		$arrayObject->append('val:' . $i);
	}
	
	// ArrayObject
	print('ArrayObject');
	foreach($arrayObject as $key=>$val){
		print('key:' . $key . ' val:' . $val);
	}
	// ArrayStack
	print('ArrayStack');
	foreach($arrayStack as $key=>$val){
		print('key:' . $key . ' val:' . $val);
	}

出力はこんな。
	ArrayObject
	key:0 val:val:0
	key:1 val:val:1
	key:2 val:val:2
	key:3 val:val:3
	key:4 val:val:4
	ArrayStack
	key:0 val:val:4
	key:1 val:val:3
	key:2 val:val:2
	key:3 val:val:1
	key:4 val:val:0

FIFOのキューがFILOのスタックになり、出力が逆になりました。
はい、これだけのクラスです。

ちなみに、extendsしているArrayObjectはPHPコアの\ArrayObjectであり、Zend\Stdlib\ArrayObjectではありません。

せっかく自前で実装したZend\Stdlib\ArrayObjectを使用していないのは何故なのでしょうかね。


PR


2013/04/05 23:46 | Comments(0) | PHP
Zend Framework2.1.4 Zend\Stdlib\ArrayObject
Zend Framework2.1.3のZend\Stdlib\ArrayObjectはクラスの中身が普通に書いてあったのですが、2.1.4にアップデートしてみたら中身がごっそり変わってました。

Zend\Stdlib\ArrayObject.phpの中身がたったこれだけに。
<?php
	namespace Zend\Stdlib;
	if (version_compare(PHP_VERSION, '5.3.4', 'lt')) {
	    class_alias('Zend\Stdlib\ArrayObject\PhpLegacyCompatibility', 'Zend\Stdlib\AbstractArrayObject');
	} else {
	    class_alias('Zend\Stdlib\ArrayObject\PhpReferenceCompatibility', 'Zend\Stdlib\AbstractArrayObject');
	}
	class ArrayObject extends AbstractArrayObject{}

PHPのバージョンが5.3.4以降であればPhpReferenceCompatibilityを、それより前であればPhpLegacyCompatibilityをZend\Stdlib\AbstractArrayObjectと定義しています。
で、直後にZend\Stdlib\AbstractArrayObjectをextendsしただけのダミーのZend\Stdlib\ArrayObjectを作っています。

この結果、PHP5.3.4以降であればnew Zend\Stdlib\ArrayObjectの親クラスとしてPhpReferenceCompatibilityが、それより前であればPhpLegacyCompatibilityが設定されます。
複数の子クラスを作って必要に応じて選択するっていうのはStrategyパターンなんかがありますが、複数の親クラスから選択するのは何パターンって言うのですかね?

さてその中身はというと、PhpReferenceCompatibilityは、前回と同じくZend Frameworkで実装されたものです。
そしてPhpLegacyCompatibilityは単に\ArrayObjectを呼んでるだけでした。

<?php
	namespace Zend\Stdlib\ArrayObject;
	use ArrayObject as PhpArrayObject;
	abstract class PhpLegacyCompatibility extends PhpArrayObject{
	    public function __construct($input = array(), $flags = self::STD_PROP_LIST, $iteratorClass = 'ArrayIterator'){
	        parent::__construct($input, $flags, $iteratorClass);
	    }
	}

結果として、PHP5.3.4より前であればPHPデフォルトの\ArrayObjectを、5.3.4以降であればZend Frameworkで実装したPhpReferenceCompatibilityを使うということで、何故か新しいバージョンの方にバグが入ってしまっているようです。
そして適当にさわってたら逆にZend\Stdlib\ArrayObjectのバグっぽいものを見つけました。
<?php
	header('Content-type: text/html; charset=UTF-8');
	require_once('path/to/channel/vendor/autoload.php');
	
	// Zend\Stdlib\ArrayObject
	$arrayobject = new Zend\Stdlib\ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS | ArrayObject::STD_PROP_LIST);
	$arrayobject['a'] = 'aa';
	$arrayobject->b = 'bb';
	print($arrayobject->a);  // NULL
	print($arrayobject->['b']);  // NULL
	foreach($arrayobject as $key=>$val){
		print($key); // aのみ
	}
	
	// \ArrayObject
	$default = new \ArrayObject(array(), \ArrayObject::ARRAY_AS_PROPS | \ArrayObject::STD_PROP_LIST);
	$default['a'] = 'aa';
	$default->b = 'bb';
	print($default->a);  // aa
	print($default->['b']);  // bb
	foreach($default as $key=>$val){
		print($key); // a,b両方
	}
ArrayObject::ARRAY_AS_PROPSは配列にプロパティでアクセスできるよというフラグです。
ArrayObject::STD_PROP_LISTはプロパティにforeachでアクセスできるよというフラグです。
つまり合わさるとforeachでプロパティと配列が両方出てくることになるはずなのですが、Zend\Stdlib\ArrayObjectでは配列の方しか出ません。
たぶんPhpReferenceCompatibility::__set($key, $value)にif($this->flag == self::ARRAY_AS_PROPS)って書いてるせいで足し算できてません。

まあSTD_PROP_LIST自体もおかしいんじゃねという話もあるので、実のところいったい何が正解なのかよくわからないんですけどね。






2013/04/03 23:07 | Comments(0) | PHP
Zend Framework2.1.3 Zend\Stdlib\ArrayObject
Zend\Stdlib\ArrayObjectはデフォルトの\ArrayObjectを置き換えます。
デフォルトの\ArrayObjectには多次元配列を削除できないバグがあるからそれをどうにかするよ、って言ってるっぽいんですがよくわかりません。
使ってみましょう。
<?php
	header('Content-type: text/html; charset=UTF-8');
	require_once('path/to/channel/vendor/autoload.php');
	use Zend\Stdlib\ArrayObject;
	
	// Zend\Stdlib\ArrayObject
	$arrayobject = new ArrayObject();
	$arrayobject->append(array('a'));
	$arrayobject->append(array('b'));
	foreach($arrayobject as $key=>$val){
		// ループ内で自分自身を削除できる
		unset($arrayobject[$key]);
	}
	
	// \ArrayObject
	$default = new \ArrayObject();
	$default->append(array('a'));
	$default->append(array('b'));
	foreach($default as $key=>$val){
		// ここでArray was modified outside object and internal position is no longer valid
		unset($default[$key]);
	}

Zend\Stdlib\ArrayObjectは、配列のようにループ内で自分を削除することができます。
\ArrayObjectも実は削除はできているのですが、でもそこでNoticeが発生しています。
これが修正したというバグなのでしょうか?

なお、Zend\Stdlib\ArrayObjectはPHPで実装されているだけあってデフォルトの\ArrayObjectよりは動作が遅めです。
まあ10万件のappendが0.04秒から0.08秒になる程度なのでそこまで影響はないでしょう。
それ以上増やすと速度より先にメモリ不足で落ちます。


と、ここまで書いたところで気がついたのですが、最初から開発経緯を見とけよって話です。
<?php
	// Zend\Stdlib\ArrayObject
	$arrayobject = new Zend\Stdlib\ArrayObject(array(), ArrayObject::ARRAY_AS_PROPS | ArrayObject::STD_PROP_LIST);
	$arrayobject['foo'] = array('bar'=>'baz');
	unset($arrayobject['foo']['bar']);
	var_dump($arrayobject['foo']);  // array(0) { }  // 消えている
	
	// \ArrayObject
	$default = new \ArrayObject(array(), \ArrayObject::ARRAY_AS_PROPS | \ArrayObject::STD_PROP_LIST);
	$default['foo'] = array('bar'=>'baz');
	unset($default['foo']['bar']);  // Notice: Indirect modification of overloaded element of ArrayObject has no effectが発生
	var_dump($default['foo']);  // array(1) { ["bar"]=> string(3) "baz" } // 消えてない

\ArrayObjectは、配列を突っ込んだときは配列内の値を消せないよ、という話だったようです。





2013/04/01 23:52 | Comments(0) | PHP
買ったものリスト 2013/03/31
GoWジャッジメント、ストーリーモードクリア。
GoW本編より前、Eデイの頃の話がメインで、もうひとつGoW3でベアードとコールが離れていたときに何をやっていたか、が描かれます。
マーカスの出番は少し無線が聞こえるくらいで、ほぼ本編とは関係ない内容です。
操作方法がこれまでのシリーズと変わっているのですが、慣れてみるとけっこう操作しやすくて快適です。
話のノリやプレイ感覚自体は本編とかわりありませんが、とにかく最大の難点としてシナリオが短いです。
GoW本編の2チャプター分くらいしかない気がします。
少々残念。

マルチはGoW1のころのショットガン無双に近い感覚になっています。
狭い道が多いマップデザインがそれに拍車をかけ、ライフル系はなかなか活躍しにくい状態です。
特に今回は出撃時にはショットガンとライフルどちらかしか持って行けないので、大抵がショットガンになっています。
まあこの感覚もわりと好きなのでいいのですが、多少はライフルが役立つような見通しのよいマップもほしいものです。
あと対戦マップが4種類しかないというのは少なすぎるのでどうにかしてほしいものです。

まあ色々言いましたが、コレクション要素は相変わらず盛りだくさんで、価格分は十分に遊べる名作です。


CAVE シューティングコレクション
☆☆☆☆☆

ケイブがこれまでXBOX360で発売してきた10本のSTG、それらを詰め合わせ、サントラや攻略DVDもありったけ山盛りに付けた究極版。


大きな箱でコレクション感抜群です。
しかし1本辺り2000円強なので非常に安いのですが、2万円越えという価格そのものに少々躊躇ってしまいますね。


で、既に10本全部持ってるわけだがどうすんだこれ。



EXP SOUND BOX 2011
☆☆☆☆☆

XBOX360「円卓の生徒」初回版にはおまけでサントラが付いてくるのですが、"伝説の戦い"など未収録曲が幾つか存在する不完全版です。
その完全版がこちらに収録されているときいて、それだけのために購入。
なので他作品の曲は全く聴いてないです。

円卓の曲ははっきりいって神です。
神曲を上げろといわれてぱっと思いつくのがレイフォース、シルバーガン、エスカトス、アクスレイ、東方、悪魔城ドラキュラ(SFC)、初代聖剣伝説、そして円卓の生徒といったところでしょうか。
そんなわけで買ったのは実はだいぶ前ですが、最近はずっと延々これらのローテーションです。あとGlobe。


箱入りアーケード娘 CompleteMIX + APPEND dropouters
Download:Sisters 5
☆☆☆☆

表紙を見た瞬間脊髄反射で購入。
なにしろライトニングさんですから買わないわけにはいきません。
箱入りはXBLAの、シスターズはインディーズやPSN、AndroidとiPhoneアプリの紹介などがされています。
箱入りはわりと読み応えがあったのですが、シスターズの方が少々どうでもよさげな紹介されっぷりなものがあって微妙なのがぱらぱらと。
Webから動画でダウンロード攻略を閲覧可能らしく盛りだくさんです。
まだ見てませんが。

あ、ジミー・ライトニングさんですよ。

ファンタジーゾーン攻略本 dropouters
☆☆☆☆

同じサークルの作品で、全力で明後日の方向に突き進んでる様が気に入ったのでついでに購入。
ファンタジーゾーン単品でもアーケード版、マークIII版、ファミコン版、PS2版など多種類を攻略しており、さらにファンタジーゾーン2、スーパーファンタジーゾーン、あとオパオパとかいう聞いたことないアクションまで多くの作品が出てきます。
正直ほとんど知らない。
あと巻末には意味のわからない擬人化漫画が掲載されていました。
なんなんだこれは。



2013/03/31 21:40 | Comments(0) | 買ったもの
今週の実績 2013/03/31
2013/03/28の実績

Gears of War: Judgment

プライド 5
最初のメダルを装備した

ネバー ギブアップ 10
20 以上の機密情報を開示してクリアした

レベル 20 10
レベル 20 に到達した

シューティング スター 20
難易度ノーマル以上でスター 75 個を獲得した

2013/03/27の実績

Gears of War: Judgment

未来 10
「顛末」の予告編を見た

パーティー ピープル 10
4 人協力プレイでいずれかのセクションをプレイした

2013/03/26の実績

Gears of War: Judgment

仲間 10
「顛末」をクリアした

臨戦態勢 20
オニキス メダルを 1 つ獲得した

2013/03/25の実績

Gears of War: Judgment

そこに終わりはない 10
「裁判所」をクリアした

決意 10
難易度カジュアル以上でストーリーモードをクリアした

鋼鉄の神経 10
難易度ノーマル以上でストーリーモードをクリアした

命令したはずだ 10
「ダウンタウン」をクリアした

レベル 10 10
レベル 10 に到達した

ライジング スター 10
難易度カジュアル以上でスター 50 個を獲得した

街の奪還 10
「オニキス ポイント」をクリアした

締めくくり 20
「顛末」をアンロックした

哀悼の意 10
ストーリーモードで COG タグを 10 個手に入れた

本物の戦争 10
「シーホース ヒルズ」をクリアした

オープンアーム 10
「士官学校」をクリアした

2013/03/24の実績

Gears of War: Judgment

レベル 5 5
レベル 5 に到達した

カーンと呼ばれるもの 10
「博物館」をクリアした

リボン マスター 10
いずれかのセクションで 3 個の異なるリボンを入手した

受けて立つ 5
最初の機密情報を開示してクリアした




2013/03/31 21:23 | Comments(0) | 実績
PHP5.4.4 イテレータ関数
イテレータに対して何かする関数があったので使ってみる。
<?php
	// 適当なサンプル
	Class Sample implements IteratorAggregate{
		private $hide = array( 'hide1', 'hide2' );
		private $show = array( 'show1', 'show2' );
		/**
		* @Override
		* イテレータを取得する
		* @return ArrayIterator $this->showのイテレータ
		*/
		public function getIterator(){
			return new ArrayIterator($this->show);
		}
	}
	$sample = new Sample();
	
	// イテレータから配列にする array ( 0 => 'show1', 1 => 'show2' )
	$array = iterator_to_array($sample);
	var_export($array);
	
	// これと同じ
	$array = array();
	foreach($sample as $key=>$val){
		$array[$key] = $val;
	}
	
	// オブジェクトのカウントはCountableを実装しないと正しくない →1になる
	print(count($sample));
	
	// 要素数を正しく取得できる →2
	print(iterator_count($sample));
	
	// 全要素でcallbackFunctionをコール…のつもりだったのだが何故か両方ともshow1になる
	iterator_apply($sample->getIterator(), 'callbackFunction', array($sample->getIterator()));
	
	// 一度イテレータを変数に取り出さないと何故かうまく動かない
	$iterator =  $sample->getIterator();
	iterator_apply($iterator, 'callbackFunction', array($iterator));
	
	/**
	* イテレータの現在値をprintするだけ。
	* @param Iterator イテレータ
	* @return boolean true
	*/
	function callbackFunction(Iterator $value){
		print($value->current());
		return true;
	}
iterator_to_array()はイテレータから配列に変換する、iterator_count()はイテレータの要素数を数えるという関数です。
正直count()のデフォルトがiterator_count()でいい気がするのですがどうでしょう。

iterator_apply()はイテレータの全要素に対してユーザ関数を適用するというもので、array_walk()と似たようなものです。
ただなんか与える引数がめんどくさいんですよね。
ノートにも書かれていますが、第一引数のイテレータはループに使うだけで中身は無視されます。
単純に第三引数をなくして第一引数にするとかでは駄目だったのでしょうか。


2013/03/27 22:34 | Comments(0) | PHP
Minecraft1.4.7 Applied Energistics RV.9F その1 クォーツ
既にWikiに完成度の高いチュートリアルがあるので完璧に不要なのですが、素晴らしく便利だったので自分で使うために紹介。
http://www26.atwiki.jp/minecraft/pages/970.html
http://www26.atwiki.jp/minecraft/pages/973.html

Wikiにはデータ化して云々とかありますが気にしなくていいです。
チェストMODのすごいやつと思っておけば大丈夫です。
それではさっそく使っていきましょう。

まずはクォーツです。
本MODを導入すると世界にクォーツクリスタル鉱石が生成されます。

壊すとクォーツクリスタルおよびクォーツの粉をドロップします。
両者は1:4の割合で粉砕、圧縮の相互変換が可能です。
生成率が低めのわりに相当な量を要求されるので、とにかくひたすらがんばって集めましょう。
なお、クォーツからは各種ツールが作れますが、もったいなさすぎるので作らないように。

一番最初に作るのはMEコントローラです。
クォーツの粉を精錬してシリコン(Silicon)。
クォーツナイフ(Quarts Cutting Knife)は木の棒*2、クォーツクリスタル*2、鉄インゴット。


クォーツナイフ、ダイヤモンド、シリコン、レッドストーン*2で上級プロセッサアセンブリ(Advanced Processor Assembly)。
上級プロセッサアセンブリを焼くとME上級プロセッサ(ME Advanced Processor)。
ME上級プロセッサ、クォーツクリスタル*4、鉄インゴット*4でMEコントローラ(ME Controller)。


MEコントローラはAEのネットワークを一元管理する中央ターミナルで、ネットワーク内に必ずひとつ必要です。
ふたつ以上置くと喧嘩して落ちます。
コントローラを設置してクリックするとGUIが開きます。


現在ネットワーク内にME関連の機材がどれだけ設置されているか、どれだけのエネルギーを消費しているかを表示しています。
AEのネットワーク維持には電力が必要です。
IndustrialCraftのEUかBuildCraftのMJが使えるので、ソーラーや原発から引いてきておきましょう。

それでは次にMEチェストを作ります。
クォーツナイフ、金インゴット、シリコン、レッドストーン*2で基本プロセッサアセンブリ(Basic Processor Assembly)。
それを焼くとME基本プロセッサ(ME Basic Processor)。
ME基本プロセッサ、クォーツクリスタル*2、レッドストーン*2、鉄インゴット*4で配列変換器(Conversion Matrix)。
配列変換器、チェスト、ガラス*2、鉄インゴット*5でMEチェスト(ME Chest)。


MEチェストは実はただの筐体で、そのままでは中身を入れられません。
ストレージが必要です。
ME基本プロセッサ、クォーツクリスタル*4、レッドストーン*4でストレージセル(Storage Cell)。
ストレージセル、ガラス*2、レッドストーン*3、鉄インゴット*3でME1kストレージ(ME 1k Storage)。


これひとつで1024バイトの記憶容量を持つストレージです。
これをMEチェストの右上に設置することで、MEチェスト内にアイテムを保存することができるようになります。


ポイントとしては個数ではなくバイト数なので、一種類だけのアイテムであれば100スタック以上詰め込めます。
種類を増やすとアイテム情報に記憶容量を奪われるので、一種類だけ入れたときより記憶容量は減ってしまいます。
といってもSSを見ればわかるとおり、軽く数千個のアイテムを突っ込んでおけるレベルなので、当面は気にする必要は無いでしょう。


マインクラフト1.4のまとめ



2013/03/25 23:59 | Comments(0) | └minecraft
買ったものリスト 2013/03/24
ドラクエ7、トゥーラ大会まで到達。

2回目の全滅は過去魔王。
パーティが盗賊とか笑わせ師とかだったのもあるが、正直全滅イベントかと思った。
あとガボをホイミスライムにするという戦略的欠陥を抱えていた。

それにしてもどうしてレブレサックを滅ぼせないんですかねえ。



ソード・ワールド2.0リプレイfrom USA7 蒼天騒乱―ライオットスカイ― ベーテ・有理・黒崎
ソード・ワールド2.0リプレイfrom USA8 双剣相剋―デュアルブラッド―
☆☆☆☆

いやあ属性付けすぎだろ。
いつのまにかすっかり日本に染まってやがる。
それでも相変わらずの戦闘バランスで、萌えと燃えをなかなかに両立させている良シリーズです。
正直最近のSW2.0でまともに読めるのってベーテと秋田みやびくらいしかいないんだよねえ。


ソード・ワールド2.0リプレイ 七剣刃クロニクル1 秋田 みやび
☆☆☆☆

ということでそのもう一人、新米女神の勇者たちの著者秋田みやびによる新シリーズ。
今のところはとりあえず顔見せ段階ですが、さっそく今後も活躍しそうなキャラが幾人も登場しています。
この人はNPCを魅せるのが上手いですね。
んでAmazon張ろうとしたら早くも2巻出てますね。
買いに行かねば。


Gears of War: Judgment XBOX360 マイクロソフト
☆☆☆☆☆

正式名称長げーよ。
とりあえずノーマルでプレイ、現在逆ノルマンディー上陸作戦が終了したところ。
今回は本編よりずっと前、Eデイのころの話です。
開発会社も主人公も操作方法も変わっていますが、やってることは相変わらずのGoWでひと安心。
やはりGoWは面白いのう。
それにしても長い戦争で技術レベルも敵の戦力も下がってるんですかね。
過去の話なのに見たことないローカストがいっぱいいるよ!


ギンガフォース XBOX360 キュート

ということでせっかく買ったのに全く手を付けられていないギンガフォースどうしたものか。
一応エスカトスの精神的続編ということでプレイしたいのは山々なのだが暇がなっしんぐ。
あー一生引き籠もって生きていきたい。



2013/03/24 19:40 | Comments(0) | 買ったもの
Zend Framework2.1.3 Zend\Stdlib\DateTime
Zend\Stdlib\DateTimeはPHPデフォルトのDateTimeクラスの拡張です。

追加されるメソッドはただひとつ、createFromISO8601()だけです。
<?php
	header('Content-type: text/html; charset=UTF-8');
	require_once('path/to/channel/vendor/autoload.php');
	use Zend\Stdlib\DateTime;
	
	// 'Y-m-d\TH:i:sO'形式のデータ
	$str = '2013-01-01T10:00:00+0900';
	
	$datetime = DateTime::createFromISO8601($str, new \DateTimeZone('Asia/Tokyo'));
	$datetimeDefault = \DateTime::createFromFormat(\DateTime::ISO8601, $str, new \DateTimeZone('Asia/Tokyo'));

$datetimeDefaultのほうはデフォルトのDateTimeを使ったもので、このふたつは全く同じ値になります。

違いはというと、DateTime::ISO8601のフォーマットは'Y-m-d\TH:i:sO'なのですが、それとは微妙に違う'Y-m-d\TH:i:s.uO'形式のデータを与えた場合にも正常にパースするようになります。
ってどうでもよすぎる。
一体なんのために存在するんだ、これ。


全然関係ないが忍者ブログの編集画面が変化して死ぬほど使いづらくなった。



2013/03/22 23:43 | Comments(0) | PHP
Minecraft1.4.7 ArsMagica 5.37.006 その4 エッセンスアイテム
前回空気中のエッセンスを用いてアイテムを錬金しました。
今回はこのエッセンスを固着してアイテム化していきます。

神秘の混合物(Arcane Compound)はネザーラック*2、焼石*2、グロウストーンダスト*2、レッドストーン*2。
それを焼くと神秘の灰(Arcane Ash)。


この灰は今後たくさん要求されるのでまとめて作っておきましょう。
ダイヤモンド、神秘の灰、黒曜石*2、木材*5でエッセンス精製装置(Essence Refiner)。
設置すると壮絶に格好いいインベントリが開きます。


中央に神秘の灰を、周囲に規定のアイテムを入れることで動作し、エッセンスをアイテム化してくれます。
エッセンスアイテムは一部の強力な魔法を唱えるのに必要となります。
詳しいレシピはWikiを参照。

さて、他にもエッセンスを消費して何かする機器が幾つかあるので作ってみます。
魔術竈(Calefactor)はVinteumの粉、レッドストーン、ラピスラズリ*2、焼石*4。
神秘の再構成器(Arcane Reconstructor)はダイヤモンド、紫染料*2、焼石*5。


魔術竈は燃料のかわりにエッセンスで焼いてくれる、すなわち燃料不要のかまどです。
神秘の再構成器は武器防具を修理してくれる、金床の上位機種です。
アイテムやモブをどんどん生贄に捧げ、便利な魔道ライフを送りましょう。



マインクラフト1.4のまとめ


2013/03/20 21:13 | Comments(0) | PHP

<<前のページ | HOME | 次のページ>>
忍者ブログ[PR]