忍者ブログ
[PR]
×

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



2025/04/16 21:46 |
PHP5.5 PECL::BitSet
PECLに置いてあったBitSet
日本語はおろか英語ドキュメントすらもまったく見つからず、ソースとテストコードくらいしかないみたい。
よくわからないので使ってみます。
<?php
	$bitset = new BitSet();
	$bitset->set(1);
	print($bitset); // 0100000000000000000000000000000000000000000000000000000000000000
おっと、これ、もしかしてビット演算を簡単にやってくれる便利クラスじゃね?

<?php
	$bitset = new BitSet();
	$bitset->set(1);
	$bitset->set(3);
	$bitset->set(5);
	print($bitset);   // 0101010000000000000000000000000000000000000000000000000000000000
	$bitset->set(64); // Uncaught exception 'OutOfRangeException'
	$bitset->set(0);  // 全部1になる
	print($bitset);   // 1111111111111111111111111111111111111111111111111111111111111111
	$bitset->clear(); // クリア
	print($bitset);   // 0000000000000000000000000000000000000000000000000000000000000000
2進数じゃなくてただのフラグじゃねーか!
64桁も取ってるのに、たったの64ビットしかフラグ管理できません。
役に立たなすぎる。
あと0ビット目だけを操作する方法がありません。

<?php
	$bitset = new BitSet(8); // 8桁に設定
	$bitset->set(1);$bitset->set(2);$bitset->set(3); // メソッドチェーン非対応 01110000
	$bitset2 = BitSet::fromArray([1, 3, 5, 7]); // 01010101
	
	$bitset->andOp($bitset2);    // AND 01010000
	$bitset->orOp($bitset2);     // OR 01110101
	$bitset->xorOp($bitset2);    // XOR 00100101
	$bitset->andNotOp($bitset2); // $bitsetは1、$bitset2は0のときに1 00100000
	
	var_dump($bitset->size());        // BitSetの桁数。 8
	var_dump($bitset->length());      // BitSetを表せる最小桁数? 01010000なら4
	var_dump($bitset->cardinality()); // 1が立ってる数。 
	var_dump($bitset->isEmpty());     // 全て0のときだけtrue
	var_dump($bitset->get(1));        // 引数桁が1ならtrue
andOp()やorOp()など一見便利そうなのですが、どれも返り値がNULLでメソッドチェーン非対応のため、とても使いにくいです。
ビット管理がしたいからといって、正直わざわざBitSetを使うメリットは全く感じられませんでした。
PR


2014/04/25 23:46 | Comments(0) | PHP
買ったものリスト 2014/04/20

斑鳩の実績を200にする本
☆☆☆☆☆

タイトルだけで迷わず買った。

中身は文字通りの攻略本。
高みの高み、世界の頂点を目指すものではなく、あくまで実績を取得することが目的のため、Chapter4下りなどの難関は最初から諦めた構成になっています。
潔い。
図解入りで攻略もわかりやすいです。
あと表紙がきれい。

私自身は結局Chapter3と4のランクAが取れないままの160/200で終わっています。
今からまたやりはじめるかなあ。


カガクチョップ1 カヅホ
☆☆☆☆

アホの子が増えた。
やすなレベルが一人と、やすなの半分くらいがひとりと、頭はいいのに激しくずれてる発明家が一人。
この作者のコミックは相変わらず登場人物が最少人数構成だ。
力関係が必ずしも一方通行とは限らないのがちょっと楽しいかも。


きものなでしこ3 八色
☆☆☆

あれ、終わり?
いきなりの新キャラ投入、さらにほとんど出番無し、
そして結局ほとんど着物出番無し。
実に清々しいまでの打ち切りっぷりだ。
やはり進行が遅すぎたのが原因か?



じょしらく5 ヤス
じょしらく6
☆☆☆

まあそれなりに面白くてそれなりに終わった。
全体的にいいかげんでキツいネタですら緩い感じだったはずなのに、終盤のアセンションとか大丈夫なのかあれ。



2014/04/20 18:09 | Comments(0) | 買ったもの
デッドアイランド リップタイド 3日目
前回の続き。

ここらで自由行動が可能になり、サブクエストも受けられるようになります。
チママンダから、難破船から使えそうな物を探してきてくれ。
ゾーイから、ケーブルとバッテリーを持ってこい。
ハーロウから、ボートを入手する方法を探すメインクエスト。
ヘンダーソンに行くためにはボートを使う必要があり、まだ使えるボートを見つけるためにハライ村まで出かけることになりました。

今回は、わりと序盤から複数種類の敵が出てきます。
いつものインフェクテッドとウォーカーの他、サグとスーサイダー、フローターが特に解説もなく最初から登場します。
一部の場所ではブッチャーまで現れるので、前作未経験者はわりと大変です。
まあそんな変わり者がそうそう居るとは思えませんが。

また、新たな敵としてドロウナーが追加されました。
海岸や水没したジャングルには水死体がたくさん転がっているのですが、ドロウナーはそいつらに擬態しています。
うっかり近付くと、いきなり飛び起きて襲いかかってくるという厄介な敵です。
そして最大の問題点として、こいつら倒しても何も落としません。

近くのバンガロー(全滅)でバッテリーを入手、さらに進んだ先にあるマタカ村でケーブルを入手。
ゾーイに渡すと、今度はスーサイダーミートを持ってきてくれ、地雷が作れるかも、ということです。
最初に遭難していたあたりで食料、包帯、水を発見してチママンダに持っていく。
チママンダからは以後無限クエスト、缶詰を持ってきてくれ、を受けることができるようになります。

マタカ村ではスタンリーがゾンビに襲われていたので撃破して助けた。
近くにいた映画監督のデイブから、カメラを取ってきてくれ。
近くにあった撮影所に入ります。
タイトルは"DEADZONE"。
いやあ、今回の撮影にぴったりの雰囲気じゃね。監督逃げてる場合じゃないだろ。
他の撮影クルーは見事に全滅しており、演出ではない本物のゾンビとなって襲いかかってきました。
カメラを回収してデイブに渡すと、映画が台無しだとか言ってきます。
映画どころじゃない素材が眼前に色々あるだろうに。

近くのツリーハウスでミーガンが助けを求めていたのでゾンビを倒して救出。
子供が怯えてる、とか言ってましたが特にそこまで連れて行くイベントとかはない模様。

セーフハウスの近くでブライアンを救助。
お金をくれただけで特に何も無し。
隣にあったデッドゾーン、「ジェームス・ニシラのバンガロー」に入ると、
「ジェームス“キラー”ニシラを倒せ」と言ってきました。
どうやらデッドゾーンはサイドクエストで戦える中ボスのようなもののようです。
現れたのは"キラー"。
サグをそのままパワーアップさせたような個体で、動きは鈍重、しかし攻撃力と耐久力は非常に高く、ノックバックもしません。
おまけに攻撃を喰らうと体力回復までしてしまうという強敵で、近接攻撃を挑むと非常に危険です。

まあ要するに、逃げながらフレアガン撃ってれば楽勝ってことです。

倒すと少し強力な武器をもらえます。
まあ、レベルが上がるとすぐにもっと強い武器が現れるので、どんどん使い倒してしまいましょう。


デッドアイランド ZOTY脱出記



2014/04/18 23:30 | Comments(0) | ゲーム
PHP5.6.0 「第17回オフラインリアルタイムどう書くの参考問題」をPHPで解く
http://nabetani.sakura.ne.jp/hena/ord17scheherazade/
http://qiita.com/Nabetani/items/dabe8ec57e0313229552

10進数の数値を別の進数になおしたら、その数が回文数になることがある。
そうなる場合の基数を列挙せよ。
ちょっと考えただけで計算量が凄いことになりそうだが大丈夫だろうか。
<?php

	class SCHEHERAZADE{
	
		/**
		* 回文基数
		* @param String 「17301」みたいな文字列
		* @return String 「5,38,100,218,236,5766,17300」みたいな文字列
		*/
		public function get($input){
			$input = (int)$input;
			$ret = [];
			
			// 2からinput-1進数
			for($i=2;$i<$input;$i++){
				// 進数表現を取得
				$arr = $this->baseConvert($input, $i);
				// 逆順と等しければ回文
				if($arr === array_reverse($arr)){
					$ret[] = $i;
				}
			}
			// 答えがなければ-
			return $ret ? implode(',', $ret) : '-';
		}
		
		/**
		* $base進数を求める
		* @param int 元の数
		* @param int 基数
		* @return array ex:数字が1001、基数が25のとき、[1, 15 ,1]
		*/
		function baseConvert($num, $base){
			$result = [];
			while($num > 0){
				$result[] = $num % $base;
				$num = floor($num / $base);
			}
			return $result;
		}
	}
	
	// 以下はテスト
	$test = [
		['17301', '5,38,100,218,236,5766,17300'],
		['2', '-'],
		['1', '-'],
		['3', '2'],
		['4', '3'],
		['5', '2,4'],
		['6', '5'],
		['10', '3,4,9'],
		['101', '10,100'],
		['1001', '10,25,76,90,142,1000'],
		['10001', '10,24,30,42,80,100,136,10000'],
		['1212', '22,100,201,302,403,605,1211'],
		['123412', '62,100,205,215,30852,61705,123411'],
		['5179', '5178'],
		['4919', '4918'],
		['5791', '5790'],
		['5498', '2748,5497'],
		['453', '150,452'],
		['134', '66,133'],
		['8489', '27,652,8488'],
		['1234', '22,616,1233'],
		['5497', '41,238,5496'],
		['4763', '19,35,432,4762'],
		['3974', '17,27,1986,3973'],
		['3521', '44,55,502,3520'],
		['5513', '20,38,53,148,5512'],
		['8042', '23,29,60,4020,8041'],
		['7442', '37,60,121,3720,7441'],
		['4857', '25,1618,4856'],
		['22843', '49,69,91,141,430,22842'],
		['194823', '84,121,21646,64940,194822'],
		['435697', '160,169,235,626,1822,435696'],
		['142', '3,7,70,141'],
		['886', '5,14,442,885'],
		['3102', '7,65,93,140,281,516,1033,1550,3101'],
		['17326', '11,28,99,105,8662,17325'],
		['32982', '13,72,238,477,716,1433,5496,10993,16490,32981'],
		['36', '5,8,11,17,35'],
		['37', '6,36'],
		['251', '8,250'],
		['252', '5,10,17,20,27,35,41,62,83,125,251'],
		['253', '12,14,22,252'],
		['6643', '2,3,9,81,90,510,948,6642'],
		['5040', '71,79,83,89,104,111,119,125,139,143,167,179,209,239,251,279,314,335,359,419,503,559,629,719,839,1007,1259,1679,2519,5039'],
		['9240', '23,38,62,104,109,119,131,139,153,164,167,209,219,230,263,279,307,329,384,419,439,461,615,659,769,839,923,1154,1319,1539,1847,2309,3079,4619,9239'],
	];

	$scheherazade = new SCHEHERAZADE();
	foreach($test as $key=>$data){
		$answer = $scheherazade->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
わりと大丈夫だった。
作成30分、実行0.2秒。
まあ高速化とかは何も考えてないけど充分でしょう。


2014/04/14 23:19 | Comments(0) | PHP
買ったものリスト 2014/04/13
画像のアップ容量がないから、どこかブログ引っ越そうかなあ。


殺戮にいたる病 我孫子 武丸
☆☆☆☆☆

いまさら読んだ。
あの二人が違うってのはわりと早いうちに見当がついたのですが、ではだったらどうなのかというところに思い至りませんでした。
そしてあの最後。
見事にしてやられました。

欠点としては、姉妹の造詣がいまいち薄いってところでしょうか。
どうしてそんなに惹かれたんだとかよくわからなかった。
あと彼が不憫すぎる。
しかし登場人物の中で雅子が一番気持ち悪かった。


ディアボロのスープ4 岡崎 純平


せっかくの傑作だったというのにいきなり打ち切り。
どういうことだファック。
あまりにひどいので編集部に抗議の☆
第4巻の見所は、テンマが「女の子の手…にぎって…くわえて…なめちゃった…」
いや、嘘は言ってないな、確かに。


キルミーベイベー6 カヅホ
☆☆☆☆

相変わらずのほのぼの殺伐4コマ。
超珍しくやすなとソーニャのクラスメイトが出てきます。
後ろ姿だけですが。


かくげいぶ2 IKa
☆☆☆

大人になっても幼女。
後半は想像を超えたいい展開に。
でも展開が急すぎてもう終わっちゃうのか、と感じてしまう。



がっこうぐらし3 海法 紀光
☆☆☆

え、どうなるんだこれ。
いつかやるとは思っていたけど思ったより早い。
次が早く読みたい。
それにしてもあのマニュアルは何なんですかね。
想定済にしては自らも被害にあってるしどうなってんだ。


2014/04/13 20:07 | Comments(0) | 買ったもの
PHP5.6の新機能
いつのまにかPHP5.6への移行ガイドができていたので、新機能を斜め読みしてみます。

■ Constant scalar expressions

オブジェクト定数に表現が使えるようになりました。
<?php
	const A = 1;
	
	class HOGE{
		const B = A + 100; // 101
		const C = self::B + 10; // 111
		const D = intval(1); // Parse error: syntax error
	}
ただし変数/メソッド呼び出しはできない模様。
どうせならそこまで対応してほしかったところ。

■ Variadic functions via ...

関数の引数に可変長引数が使えるようになりました。
これまでも可変長引数はfunc_get_args()で使えましたが、こいつは引数に明記されないからわかりにくいし、IDEにも捉えてもらえませんでした。
<?php
	function hoge($arg1, $arg2, ...$args){}
	
	hoge(1, 2);          // $args = []
	hoge(1, 2, 3, 4, 5); // $args = [3, 4, 5]
固定の引数に入りきらない部分が、可変長引数に配列で入ってきます。
これは便利。

■ Argument unpacking via ...

関数の呼び出しにも...が使えるようになりました。
<?php
	function fuga(...$args){}
	
	fuga(1, [2, 3]);         // $args = [1, [2, 3]]
	fuga(1, ...[2, 3]);      // $args = [1, 2, 3]
	fuga(...[1], ...[2, 3]); // $args = [1, 2, 3]
配列を...付きで渡すと、引数を展開してから渡してくれます。
こちらはいったいどういうメリットがあるのかよくわかりません。

■ Exponentiation via **

累乗演算子です。

■ use function and use const

関数や定数を use 文でインポートできるようになりました。
<?php
	namespace HOGE{
		const FUGA = 1;
		function foo(){return __FUNCTION__;}
	}

	namespace{
		use const HOGE\FUGA;
		use function HOGE\foo;
		
		echo FUGA;  // 1
		echo foo(); // HOGE\foo
	}

http://www.php.net/manual/ja/language.namespaces.faq.php#language.namespaces.faq.nofuncconstantuse
> 関数や定数は use 文でインポートできない

お、おう。

■ phpdbg

デバッガとしてphpdbgが同梱されます。
ブレークポイントやステップ実行などの強力なデバッグ機能が使用可能です。
が、今のところコマンドラインツールしかないみたいなので、Eclipseのデバッグウィンドウみたいに扱えるIDEの出現が望まれるところ。
ひとつ見つけたのですが日本語ではないのでよくわかりません。

■ Default character encoding

デフォルトの文字コードがようやくUTF-8になりました。

■ php://input is reusable

いまいち意味がよくわかりませんが、php://inputを何度呼び出してもメモリを食いつぶさなくなったってこと?

■ Large file uploads

2ギガバイト以上のファイルをアップロードできるようになりました。
まあ普通はそんなのupload_max_filesizeで止めますが。

■ GMP supports operator overloading

GMPの演算子オーバーロードです。

■ hash_equals() for timing attack safe string comparison

hash_equals()関数のマニュアルはまだ無いようです。
ソースを見ると、どうもふたつの文字列が同じものかを調べてる、つまり===にしか見えないのですが、いったい何の機能があるのでしょう。

どうやらタイミング攻撃を防ぐもののようです。

100文字のパスワードをチェックする機構があったとして、
===は「文字列の長さが違うからすぐにエラーを返す」ときと「1文字目が違うからエラーを返す」ときと「100文字目が違うからエラーを返す」ときで処理にかかる時間がほんのわずかに違います。
その時間の違いからパスワードが何文字か推定できて、何文字目が違うか推定できて、結果として全探索より遙かに少ない回数で正解パスワードまで辿り着けてしまうということらしいです。
正直そんなの可能なのか?と思えるのですが、実際やってみた人が現れ、情報セキュリティスペシャリストの問題にも出てくるくらいになっています。

そこでhash_equals()は、途中の文字が違っても最後まで比較を行うことで、実行にかかる時間を一定にするようにしています。
でも文字列長が違ったら即座にFALSEを返してるように見えるんだがどうだろう。

■ gost-crypto hash algorithm

RFC4357で定義されているGOSTというアルゴリズムに対応したということですが、GOSTが何なのかよくわかりません。

■ SSL/TLS improvements

[SSLの機能](http://www.php.net/manual/ja/migration56.openssl.php)が色々追加になりました。
よくわかりませんが。


ついでに廃止となった機能

■ Calls from incompatible context

インスタンス内でstaticでないメソッドをstatic呼び出しするとE_DEPRECATEDが発生します。
<?php
	class A {
		public function foo() {}
	}
	class B {
		public function bar() { A::foo(); }
	}
	(new B)->bar(); // Deprecated: Non-static method A::foo() should not be called statically
	A::foo(); // Strict Standards: Non-static method A::foo() should not be called statically
どうして違うエラーになってるのかさっぱりだ。

■ $HTTP_RAW_POST_DATA and always_populate_raw_post_data

always_populate_raw_post_dataを有効にするとE_DEPRECATEDが発生します。
かわりに php://input を使えということらしいです。


正直、これは是非とも5.6に上げなければ、というような機能はあまりないように思えます。
一番魅力的なのはphpdbgだと思いますが、これはPHP5.4以降個別に入れられたりします。
まあChangeLogにはFixedがたくさん並んでいて、完成度を高める方向に向かっていると考えるといいことなのではないでしょうか。


2014/04/11 23:06 | Comments(0) | PHP
PHP5.6.0 「第17回オフラインリアルタイムどう書くの問題」をPHPで解く
http://nabetani.sakura.ne.jp/hena/ord17foldcut/
http://qiita.com/Nabetani/items/ebd9d7deb30c57447806

折って切る、何処かで見たと思ったら第18回の参考問題に似ている。
なので同じように考えれば解けるかな?
<?php

	class FOLDCUT{
	
		/**
		* 折って切る
		* @param String 「RRTRB-bl」みたいな文字列
		* @return int 「6」みたいな数値
		*/
		public function get($input){
			// 入力値を分解
			$input = explode('-', $input);
			$loop = str_split(strrev($input[0]), 1);
			
			// 初期値を作成
			switch($input[1]){
				case 'tl': $data = ['01', '11']; break;
				case 'tr': $data = ['10', '11']; break;
				case 'bl': $data = ['11', '01']; break;
				case 'br': $data = ['11', '10']; break;
			}
			
			// 展開する
			foreach($loop as $key=>$val){
				$data = $this->{'extract'.$val}($data);
			}
			
			// 穴を数えて返す
			$count = $rowflg = $colflg = 0;
			$collen = strlen($data[0]);
			foreach($data as $row=>$line){
				// 穴は必ず2*2になるので、右上でカウントしたら下の行は飛ばす
				if($rowflg){ $rowflg=0;continue; }
				$colflg = 0;
				for($col=0;$col<$collen;$col++){
					// 空があった
					if(!$line[$col]){
						// 最上段/最下段は穴にならない
						if(!$row || !isset($data[$row+1])){
							$rowflg++;
							continue;
						}
						// 次が1であればカウント
						if($colflg && isset($line[$col+1]) && $line[$col+1]){
							$count++;
							$rowflg++;
							continue;
						}
					// 空がなかった
					}else{
						$colflg++;
					}
				}
			}
			return $count;
		}
		
		// 右半分を手前に折って、左半分に重ねる
		private function extractR($data){
			return array_map(function($val){
				return $val . strrev($val);
			}, $data);
		}
		
		// 左半分を手前に折って、右半分に重ねる
		private function extractL($data){
			return array_map(function($val){
				return strrev($val) . $val;
			}, $data);
		}
		
		// 上半分を手前に折って、下半分に重ねる
		private function extractT($data){
			return array_merge(array_reverse($data), $data);
		}
		
		// 下半分を手前に折って、上半分に重ねる
		private function extractB($data){
			return array_merge($data, array_reverse($data));
		}
		
	}
	
	// 以下はテスト
	$test = [
		['RRTRB-bl', '6'],
		['R-tr', '0'],
		['L-br', '0'],
		['T-tl', '0'],
		['B-tl', '0'],
		['BL-br', '0'],
		['LB-tl', '0'],
		['RL-tl', '0'],
		['BL-tl', '0'],
		['TL-bl', '0'],
		['RT-tr', '1'],
		['TRB-tl', '0'],
		['TRL-bl', '0'],
		['TRB-br', '2'],
		['LLB-bl', '2'],
		['RTL-tr', '1'],
		['LBB-tr', '0'],
		['TLL-tl', '2'],
		['RLRR-tr', '0'],
		['BBTL-tl', '4'],
		['TBBT-tr', '0'],
		['LLBR-tl', '0'],
		['LBRT-tl', '2'],
		['RLBL-bl', '4'],
		['BRRL-br', '3'],
		['TBBTL-tl', '8'],
		['TLBBT-br', '0'],
		['LRBLL-br', '7'],
		['TRRTT-br', '6'],
		['BBBLB-br', '0'],
		['RTTTR-tl', '4'],
		['BBLLL-br', '6'],
		['RRLLTR-tr', '16'],
		['TTRBLB-br', '8'],
		['LRBRBR-bl', '14'],
		['RBBLRL-tl', '8'],
		['RTRLTB-tl', '12'],
		['LBLRTR-tl', '14'],
		['RRLTRL-tl', '16'],
		['TBLTRR-br', '12'],
		['TTTRLTT-bl', '30'],
		['TBBRTBL-tr', '15'],
		['TRTRTLL-tr', '28'],
		['TLLRTRB-tr', '24'],
		['RLLBRLB-tr', '15'],
		['LTLRRBT-tr', '32'],
		['RBBRBLT-br', '21'],
		['LLRLRLR-tr', '0'],
	];

	$foldcut = new FOLDCUT();
	foreach($test as $key=>$data){
		$answer = $foldcut->get($data[0]);
		if($answer !== (int)$data[1]){
			print('えらー');
		}
	}
解けませんでした。
展開図を作るところまでは同じなので一瞬だったのですが、そこから穴の数をどうやって数えるのかというところで詰まった。
結局今回の展開図の特徴を用いた超力業で解きました。
かかった時間は1.5時間くらい。

絶対なんかもっとまともな数え方があるはず。
というか図にせずに計算する方法があるはず。


2014/04/07 23:05 | Comments(0) | PHP
買ったものリスト 2014/04/06
土曜日、遠出しようとしたら雨が降ってきたので帰ってきたら晴れた。
日曜日、遠出しようとしたら雨が降ってきたので帰ってきたら晴れた。
どういうことだ。


GoPro サクションカップマウントAUCMT-302

アドベンチャースクリーンに貼ったら振動が目立つ…うごごご。
物としてはいわゆる吸盤で、バイクや車の適当な面にぺたりこと貼り付けるだけの簡単なもの。
それで240キロでぶっ飛ばしても剥がれないというから驚きだ。
まあセローじゃそんなにスピード出ませんが。
むしろ振動が問題だ。


マグダラで眠れ5 支倉 凍砂
☆☆☆☆

いやあ、相変わらずすばらしい文章を書く人だ。
とても同一人物とは思えませんな。


プチプチたんたんプチたんたん1 氏家 卜全
☆☆☆

ふつう。
実に普通。
この作者にしては非常に薄味。
生徒会とか思春期とかが少年誌としておかしいだけではあるのだが、そっちレベルを求めると物足りないかもしれない。
まあこの手の温い話も嫌いではないのでまあよし。


ただいま独身中3 辻 灯子
☆☆☆

え?終わり?
なんかこうやきもきする終わり方だ。


それゆけ! 宇宙戦艦ヤマモト・ヨーコ 【opt.PLUS】 庄司 卓
☆☆

千里多めのおまけシナリオ。
担当に無理矢理書かされたとか言うだけあってやる気がないというかオチが投げっぱである。
本編ではよくあった、それからどうした、それはどういうことだった、という話がないんですよね。
あとページが足りないのを埋めるためか、イラストレータによるTA29のガレキ製作記が35ページも載ってます。
正直そんなのいらん。
話そのものはもちろん悪くないので、ちゃんと一冊分できあがってから出して欲しかったですね。



2014/04/06 20:19 | Comments(0) | 買ったもの
なりせなるてず 「PHPでXMLをパースして中身全てを連想配列にする」の感想
http://ichiy.hatenablog.com/entry/2014/03/28/203340

いや、SimpleXMLElementのままのほうが扱いやすいだろ。
というのはともかく、xml2arr()が無駄にややこしいので簡略化してみます。
public static function xml2arr($xmlobj){
    $arr = array();
    if (is_object($xmlobj))
    {
      $xmlobj = get_object_vars($xmlobj);
    }
    else
    {
      $xmlobj = $xmlobj;
    }

    foreach ($xmlobj as $key => $val)
    {
      if (is_object($xmlobj[$key]))
      {
        $arr[$key] = self::xml2arr($val);
      }
      else if (is_array($val))
      {
        foreach($val as $k => $v)
        {
          if (is_object($v) || is_array($v))
          {
            $arr[$key][$k] = self::xml2arr($v);
          }
          else
          {
            $arr[$key][$k] = $v;
          }
        }
      }
      else
      {
        $arr[$key] = $val;
      }
    }
    return $arr;
  }

  public static function xml2arr2($xmlobj){
    return json_decode(json_encode($xmlobj), true);
  }
1行で終わりました。
出力は全く同じです。
属性と要素を両方指定したら属性が無視されるところまで同じです。

ちなみにこれ、実はマニュアルのコメントに記載されています。

PHPでちょっとやりたいことってのはだいたい誰かが先にやっているから、先にそういうのを探してみるのがよいでしょう。

どうでもいいけどこのページ、<scirpt defer>の指定がおかしいせいで正常に動いていませんね。


2014/04/04 22:38 | Comments(0) | PHP
デッドアイランド リップタイド 2日目
前回の続き。


気がつくと砂浜で倒れており、ハーロウとウェインのふたりに助け起こされました。
そこはパラナイという島。
青い空が見えていいところかと思いきや、既にパラナイも感染者に乗っ取られてしまっているようです。なんてこった。
二人は他の生存者を捜すということで、とりあえず教えてもらったセーフハウスに移動します。
ハーディは行方不明のままです。
他のプレイヤーキャラクターの姿は全くに見えませんが、どうやら一緒にいる扱いのようです。

パラナイはやはり風光明媚な美しい島です。
南と東にマリーナと集落があり、西にはちょっとした丘が、そして中央から北側にかけて、マップの半分くらいは低地のジャングルが占めています。
所々にある展望台やツリーハウスからの景色は素晴らしいものがあります。
こんなときでさえなければ素晴らしい場所なのに、残念ながらやっぱり至る所に死体やゾンビが転がっています。

パラナイはバノイほど開拓されておらず、未舗装の道が数本ある以外は車の通れない場所が多いです。
また先日の嵐のため、ジャングルのほとんどは水没してしまい、歩くのが困難です。
車道がほとんど無いのが厄介で、歩いてゾンビの中を突っ切って進まなくてはならない場面が多いです。
マップ自体は東西1キロも無い程度で前作より狭いと思われますが、移動手段がないため体感的に広く感じます。
まあ、今後もっと広いところに進んだりすることができるでしょう。たぶん。

セーフハウスことパラダイスキャンプまで辿り着くと、いきなり生存者がゾンビに襲われていました。
全然セーフじゃないではないか。
襲われたキャラは、HPがしっかり減っています。
急いで助けないと死んでしまってゲームオーバーになる模様。
死んだキャラは減ってそのままマルチシナリオ、なんて展開にはさすがにならないようです。残念。

襲われたキャラをぶん殴ってゾンビを剥がします。
味方NPCには当たり判定がないので、適当に殴ってるだけでゾンビを引きはがすことができます。
全力でゾンビ共を撃退し、全員を助けることに成功しました。

一区切り付いたと思ったら、ゾンビ共は後から後からやってきます。
フレアガンをもらい、仕方なくキャンプに繋がる橋を爆破して落としました。
これでしばらくはどうにかなるでしょう。

このフレアガン、おもちゃみたいな見た目で、弾も単発ですが、他に銃器のない序盤はかなり役に立ちます。
弾薬はセーフハウスに固定で置いてありいくらでも手に入るので、スーサイダーなどの厄介な敵に使っていきましょう。
でもフレアガンと言ったら作家先生の最強武器だよな。

無事ゾンビ共を撃退後、ハーロウたちがハーディを見つけて戻ってきました。
ハーディが言うには、セルポはゾンビを生物兵器として扱おうとしている、この島はもうすぐ爆撃される、ヘンダーソンの町まで行けば助かるかもしれない。
なんてこった。
といってもハーディも先日まで敵対していた間柄。
全面的に信じたわけではありませんが、ヘンダーソンに行くという思惑は一致しているので、とりあえずそこまでは協力体制を敷くことになりました。


デッドアイランド ZOTY脱出記


2014/03/31 23:49 | Comments(0) | ゲーム

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