忍者ブログ
[PR]
×

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



2025/05/20 09:36 |
デッドアイランド リップタイド 1日目
ゾンビ蔓延るバノイからどうにかこうにか脱出したサム・Bと仲間たち。
しかし、軍の船に救助されたのも束の間、彼らの運命を翻弄するかのような荒波が船を襲う。
逃れられぬアウトブレイクの脅威にまたも飲み込まれる主人公たち…



riptideは荒波、潮流といった意味です。
船を襲った波をしめしているのでしょうか。
それとも彼らの運命なのか。

早速プレイ開始。
今回はADF兵士のジョンというキャラがプレイヤーキャラクターに追加されているようです。
しかしとりあえず、前回使ったサム・Bでスタートします。
キャラセレクトのときにプレイヤーが喋りますが、思ったより長い上にキャラの心情を話してくれるので聴いておくとよいでしょう。

何故かオープニングの独白はプルナ。
どうやら前作、バノイで助けようと頑張った彼らは誰も助からなかったらしいです。
ええーなんてこった。
なおシナリオ上当然ですが、DLCライダーホワイトについての情報は知らないようです。

主人公たちが脱出したヘリは燃料切れ寸前に軍の船に着艦します。
しかし外に出た瞬間拘束されました。
まあさすがに仕方ないとは思うが強圧的すぎないかね。

拘束を主導したのはサミュエル・ハーディ中佐。
こちらは任務に忠実なだけで比較的まともなようです。
次いで現れた民間人フランク・セルポ。
彼に向かってケビンが言い放ちます。
「母をも売り飛ばすような糞野郎だ」
実際ハーディより権力を持っているようで、軍人相手に平然と命令を飛ばしています。
拘束に抵抗して暴れるイェレマが兵士に噛みつきました。あーあ。
その後免疫者4人は薬を盛られ、船に閉じ込められてしまいます。

同室にいたのはジョン。
彼は元兵士で、軍は元々救出活動をしていたがあの民間人がやってきてから活動を停止し、海域を封鎖しているだけになっているそうです。
セルポ、奴が黒幕か、あるいはその一端か。

次に気がつくとサム・B一人になっていました。
いきなり嵐で船が大破した、隔壁を全部開けるからどうにかしろだとかなんとか。展開早いなおい。
船の中なので画面が揺れてて酔う。これはやばい。

船はチュートリアルなので、ガイドのとおりに動いていれば問題ありません。
しゃがみやジャンプ、武器の使い方などを説明してくれます。
さて脱出ルートを探していると、床に血の跡が。
あー、やっぱり既に感染してるのか。
武器、頼りないバールを見つけて進みます。
やはり船内は感染者だらけになっていました。
倒しながらどうにか甲板まで脱出。
あたりはひどい嵐です。
セルポはとっとと一人でヘリで逃げ出しやがりました。
ハーディと彼の部下たちと共同戦線でゾンビたちと戦います。
部下共平然とゾンビと接近戦しやがるんだが大丈夫か奴ら。

船ではわりと簡単に銃が手に入りますが、船はチュートリアルなので外に出たら全アイテムロストします。
なので銃もどんどん使っていきましょう。
船長も既にゾンビ化しており、船は無軌道に突っ走っています。
ブリッジに乗り込み碇を降ろそうとしましたが、時既に遅く船は岩山に激突、皆投げ出されてしまいました。
なんてこった。


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



PR


2014/02/21 19:57 | Comments(0) | ゲーム
XAMPP環境にPHP5.6.0alphaをインストール
LinuxにPHP5.6入れてる人ってのは既にいっぱいいますが、Windowsでやってる人はいないだろうから備忘録。

XAMPPはWindows上に一括でPHP環境を設置できてとても便利ですが、欠点としては最初からPHPバージョンが決まっているところです。
PHP5.6.0のα版を試したいんだよ、とか思ってもα版なんて普通は用意しません。
なので人力で入れてみましょう。

実はXAMPPはApacheとかPHPとかその他関連ソフトウェアをまとめてインストールしてくれるというだけなので、PHPを最新版にしたければ単にPHPを差し替えればいいです。

まずWindows版PHP公式から、欲しいバージョンのPHPを拾ってきます。
今回は5.6が試したかったので「PHP 5.6 (5.6.0alpha2) VC11 x86 Thread Safe」です。

XAMPPディレクトリにあるphpディレクトリの名前を適当に変えます。

解凍したPHPを今まであったphpディレクトリの場所に持ってきます。

これでPHPの入れ替え完了です。
Apacheを起動してphpinfo()を試してみましょう。
簡単ですね。

しかしデフォルトのPHPは本当に最低限のものしか入ってない状態です。
XAMPPがよしなにやってくれていたPHPの設定はありません。
なにしろmb_convert_encoding()すら無いので実用に耐えません。
というかphp.iniがありません。

php.iniを作りましょう。
まず「php.ini-development」をコピーして「php.ini」に改名します。
その後でXAMPPに入っていたphp.iniの項目をコピーしていくとよいでしょう。
不要な項目が多々あるので、まるごと上書きはやめときましょう。

最低限設定すべきところは
include_path
extension_dir
error_log
upload_tmp_dir
date.timezone
session.save_path
mbstring.**
あたりでしょうか。

あとはextensionから、必要なモジュールを有効にしましょう。
php_mbstring、php_pdo_mysql、php_mysqli、php_curlあたりは最低限で、それ以外は必要に応じてというかんじでしょう。

あとはApacheを再起動すれば終了。
これでPHP5.6.0が使えるようになりました。


2014/02/17 21:52 | Comments(0) | PHP
買ったものリスト 2014/02/16
ツーリングセローを買いました。

実はバイクを買うために引っ越したので、ようやく念願叶ったというかんじです。
にしても納車日がこの記録的大雪。
私が一体何をした。


ショーエイ(SHOEI) HORNET-DS PINLOCK ライトシルバー

Amazonってバイクまで売ってるんですね。
さすがに原付がほとんどで、あまりごついのは売ってないみたいですが。
いったいどうやって送付するんだろう?

近所のバイク用品店(ナップス)で適当に用具を買い揃えました。
DT50に乗ってたころは5000円とかの安物ヘルメットで済ましていたのですが、さすがにセローでそんなわけにはいかないだろうとちゃんとしたメットにしました。
アライの似たようなモデルも試してみたのですが、アライの方は頭が痛かったのでこちらにしました。
さすがに高いだけあって被り心地とかだいぶ違う、というか超軽い。
まだ一回付けただけでオフロードにも行ってないので、今後不満とかも出てくるかもしれませんが、今のところはまあ文句ないです。


ばくおん!! 1 おりもと みまな
ばくおん!! 2
ばくおん!! 3
ばくおん!! 4
☆☆☆☆

ナップスに何故か置いてあったのでついうっかり買ってしまいました。
タイトルはもちろんあれのパクリですが、中身は全然特に関係ない……と思います。
よく考えたらけいおん読んだことがなかった。
バイク乗りあるあるみたいなかんじです。
絵が上手いので安心して読めます。

ただバイクの美的感覚についてはよくわかりませんでした。
GSX750Fが知る限り最も醜いとか言ってますが、特に悪いとも思えません。
珍走が乗ってるビッグスクーターのほうが酷いだろ。

あ、でも確かにこれは完全にアウト。


2014/02/16 20:36 | Comments(0) | 買ったもの
今週の実績 2014/02/16

2014/02/16の実績

Guardian Heroes

天を統べる神 20
ストーリーモードで天上神を倒した

World of Tanks

エリート ステータス 5
戦車を完全研究した

ジュニア 10
Tier III 戦車を完全研究した

新しいおもちゃ 5
タンクのアップグレードを獲得した

2014/02/12の実績

Sacred Citadel

さわるな危険 10
戦闘中にすべての攻撃をかわした

2014/02/03の実績

World of Tanks

勝利 10
最初の戦闘で生き残り、勝利した

操縦手の育成 10
訓練を完了した

2014/01/13の実績

地球防衛軍4

フォートレス・ハンター 15
四足歩行要塞を12機破壊する

キャリアー・ハンター 15
キャリアーを500機撃墜する

グレート・ハンター 15
グレーター・ワイルド・ドラゴンを20体倒す

メディック 10
協力プレイ時に、他プレイヤーを回復した

Normal全ステージクリア(エアレイダー) 15
エアレイダーで難易度Normalの全ステージをクリア

Inferno全ステージクリア(エアレイダー) 50
エアレイダーで難易度Infernoの全ステージをクリア

Inferno全ステージクリア(レンジャー) 50
レンジャーで難易度Infernoの全ステージをクリア

Hardest全ステージクリア(レンジャー) 30
レンジャーで難易度Hardestの全ステージをクリア

Inferno全ステージクリア(ウイングダイバー) 50
ウイングダイバーで難易度Infernoの全ステージをクリア

Inferno全ステージクリア(フェンサー) 50
フェンサーで難易度Infernoの全ステージをクリア

ブレイン・ハンター 15
ブレインを6機撃墜する

Hardest全ステージクリア(フェンサー) 30
フェンサーで難易度Hardestの全ステージをクリア

Hard全ステージクリア(フェンサー) 20
フェンサーで難易度Hardの全ステージをクリア

Normal全ステージクリア(フェンサー) 15
フェンサーで難易度Normalの全ステージをクリア

Hard全ステージクリア(レンジャー) 20
レンジャーで難易度Hardの全ステージをクリア

Normal全ステージクリア(レンジャー) 15
レンジャーで難易度Normalの全ステージをクリア

2014/01/12の実績

地球防衛軍4

Hardest全ステージクリア(エアレイダー) 30
エアレイダーで難易度Hardestの全ステージをクリア

Hard全ステージクリア(エアレイダー) 20
エアレイダーで難易度Hardの全ステージをクリア

2014/01/07の実績

地球防衛軍4

アルゴ・ハンター 15
アルゴを20隻撃破する


2014/02/16 18:48 | Comments(0) | 実績
PHP5.6.0 「第18回オフラインリアルタイムどう書くの問題」をPHPで解く
http://nabetani.sakura.ne.jp/hena/ord18notfork/
http://qiita.com/Nabetani/items/ad47666c2f2f44ada1e7

レジに並ぶ問題。

出遅れたので、せっかくだから無駄に頑張った実装をしてみる。
<?php
	
	class NOTFORK{
		/**
		* スーパーのレジ
		* @param String 「42873x.3.」みたいな文字列
		* @return String 「0,4,2,0,0」みたいな文字列
		*/
		public function get($input){
			
			// 処理できる人数
			$a = array(2, 7, 3, 5, 2);
			
			// 処理実行
			$registerList = new RegisterList($a);
			for($i=0;$i<strlen($input);$i++){
				if($input[$i] === '.'){
					// .はレジ処理
					$registerList->pop();
				}elseif($input[$i] === 'x'){
					// xは困ったちゃん
					$registerList->pushLocked();
				}else{
					// その他は数値
					$registerList->push((int)$input[$i]);
				}
			}
			
			// 返却
			return implode(',', $registerList->countCustomers());
		}
	}
	
	class RegisterList{
		// レジのリスト
		private $registers = array();
		
		/**
		* コンストラクタ
		* @param array 処理できる人数の配列
		*/
		public function __construct($numbers){
			foreach($numbers as $key=>$val){
				$this->registers[] = new Register($val);
			}
		}
		
		/**
		* レジに並ぶ
		* @param int 人数
		*/
		public function push($count){
			$this->registers[$this->getLowestRegister()]->push($count);
		}
		
		/**
		* 終わらない人が並ぶ
		*/
		public function pushLocked(){
			$this->registers[$this->getLowestRegister()]->pushLocked();
		}
		
		/**
		* 全レジを処理する
		*/
		public function pop(){
			foreach($this->registers as $key=>$val){
				$val->pop();
			}
		}
		
		/**
		* 並んでいる人が一番少ないレジを取得
		* 同人数の場合は若いレジ
		* @return int 少ないレジのキー
		*/
		private function getLowestRegister(){
			$nowCount = $this->registers[0]->countCustomers();
			$lowest = 0;
			foreach($this->registers as $key=>$val){
				if($nowCount > $val->countCustomers()){
					$nowCount = $val->countCustomers();
					$lowest = $key;
				}
			}
			return $lowest;
		}
		
		/**
		* 全レジの人数を取得
		* @return array 人数の配列
		*/
		public function countCustomers(){
			$ret = [];
			foreach($this->registers as $key=>$val){
				$ret[] = $val->countCustomers();
			}
			return $ret;
		}
	}
	
	class Register{
		// 終わらない人が一番手前に並んでる
		private $isLocked = false;
		// 一回のレジで処理できる人数
		private $number = 1;
		// 並んでる人のリスト
		private $customers = [];
		
		/**
		* コンストラクタ
		* @param int 一回で処理できる人数
		*/
		public function __construct($number){
			$this->number = $number;
		}
		
		/**
		* ロック状態か
		* @return ロックされていればtrue
		*/
		private function isLocked(){
			return $this->isLocked;
		}
		
		/**
		* 並んでいる人数を取得
		* @return 並んでいる人数
		*/
		public function countCustomers(){
			return count($this->customers);
		}
		
		/**
		* 並ぶ
		* @param int 並ぶ人数
		*/
		public function push($count = 1){
			for($i=0;$i<$count;$i++){
				$this->customers[] = new Customer();
			}
		}
		
		/**
		* 終わらない人が並ぶ
		*/
		public function pushLocked(){
			$this->customers[] = new LockedCustomer();
		}
		
		/**
		* レジを処理する
		*/
		public function pop(){
			if($this->isLocked()){ return false; }
			for($i=0;$i<$this->number;$i++){
				if($this->countCustomers() > 0){
					if($this->customers[0]->isLocked()){
						$this->isLocked = true;
						return;
					}else{
						array_shift($this->customers);
					}
				}
			}
		}
		
	}
	class Customer{
		const isLocked = false;
		public function isLocked(){
			return static::isLocked;
		}
	}
	class LockedCustomer extends Customer{
		const isLocked = true;
	}
	
	// 以下はテスト
	$test = [
		['42873x.3.', '0,4,2,0,0'],
		['1', '1,0,0,0,0'],
		['.', '0,0,0,0,0'],
		['x', '1,0,0,0,0'],
		['31.', '1,0,0,0,0'],
		['3x.', '1,1,0,0,0'],
		['99569x', '9,9,6,6,9'],
		['99569x33', '9,9,9,9,9'],
		['99569x33.', '7,2,6,4,7'],
		['99569x33..', '5,0,4,0,5'],
		['12345x3333.', '4,0,3,2,3'],
		['54321x3333.', '3,0,3,0,4'],
		['51423x3333.', '3,4,4,0,4'],
		['12x34x.', '1,0,1,0,2'],
		['987x654x.32', '7,6,4,10,5'],
		['99999999999x99999999.......9.', '20,10,12,5,20'],
		['997', '9,9,7,0,0'],
		['.3.9', '1,9,0,0,0'],
		['832.6', '6,6,0,0,0'],
		['.5.568', '3,5,6,8,0'],
		['475..48', '4,8,0,0,0'],
		['7.2..469', '1,4,6,9,0'],
		['574x315.3', '3,3,1,7,1'],
		['5.2893.x98', '10,9,5,4,1'],
		['279.6xxx..4', '2,1,4,1,1'],
		['1.1.39..93.x', '7,1,0,0,0'],
		['7677749325927', '16,12,17,18,12'],
		['x6235.87.56.9.', '7,2,0,0,0'],
		['4.1168.6.197.6.', '0,0,3,0,0'],
		['2.8.547.25..19.6', '6,2,0,0,0'],
		['.5.3x82x32.1829..', '5,0,5,0,7'],
		['x.1816..36.24.429.', '1,0,0,0,7'],
		['79.2.6.81x..26x31.1', '1,0,2,1,1'],
		['574296x6538984..5974', '14,13,10,15,14'],
		['99.6244.4376636..72.6', '5,6,0,0,3'],
		['1659.486x5637168278123', '17,16,16,18,17'],
		['.5.17797.x626x5x9457.3.', '14,0,3,5,8'],
		['..58624.85623..4.7..23.x', '1,1,0,0,0'],
		['716.463.9.x.8..4.15.738x4', '7,3,5,8,1'],
		['22xx.191.96469472.7232377.', '10,11,18,12,9'],
		['24..4...343......4.41.6...2', '2,0,0,0,0'],
		['32732.474x153.866..4x29.2573', '7,5,7,8,5'],
		['786.1267x9937.17.15448.1x33.4', '4,4,8,4,10'],
		['671714849.149.686852.178.895x3', '13,16,13,10,12'],
		['86x.47.517..29621.61x937..xx935', '7,11,8,8,10'],
		['.2233.78x.94.x59511.5.86x3.x714.', '4,6,10,8,8'],
		['.793...218.687x415x13.1...x58576x', '8,11,8,6,9'],
		['6.6x37.3x51x932.72x4x33.9363.x7761', '15,13,15,12,15'],
		['6..4.x187..681.2x.2.713276.669x.252', '6,7,8,6,5'],
		['.6.xx64..5146x897231.x.21265392x9775', '19,17,19,20,17'],
		['334.85413.263314.x.6293921x3.6357647x', '14,14,12,16,10'],
		['4.1..9..513.266..5999769852.2.38x79.x7', '12,10,13,6,10'],
	];

	$notfork = new NOTFORK();
	foreach($test as $key=>$data){
		$answer = $notfork->get($data[0]);
		if($answer !== $data[1]){
			print('えらー');
		}
	}
使い回す予定があるならともかく、書き捨てるプログラムでこんなことやっても意味はないのですが。
これでも1時間半で終わったので、普通に書けばもっと簡単だと思われます。


2014/02/14 23:32 | Comments(0) | PHP
Dust: An Elysian Tail Chapter13
前回の続き。

さてついに、銀血の民を引き連れてガイウス将軍の軍隊と決戦です。

ここ、敵味方多人数が入り乱れての大乱戦になるのですが、誰が敵か見分けがつかなくなるので正直味方邪魔。
ただ戦力が少ないとか言っておきながらここの味方は無限湧きっぽいので、高みの見物でも大丈夫っぽい。

さて、ここでガイウス軍の秘密兵器が登場。
その名もヘリコプター。
いやいやいやいやこれまで完全に純ファンタジー世界だったのにいきなり現代戦過ぎやしませんかね。

しばらく進むと、兵士の一人が脱出路を用意してくれます。
なんでも、ここから先に進むともう戻ってこれないぞということらしい。
なんてこった。
と思いきやその先からも普通に戻れました。

そこを超えると今度はガイウス軍のさらなる秘密兵器、今度は大砲の登場です。
ヘリよりはましとはいえ相変わらず浮いてるな。
しかしもはやダストの敵ではありません。
蹴散らしてついにガイウスと対面。

ガイウスはダストのことをカシウスと呼び、こちらに戻るように言ってきます。
しかしダストはそれを蹴散らし、ガイウスに最後の戦いを挑みます。

ダスト「ジンは死んだ。カシウスも。二人の魂は俺の中で生き続け、あの運命の戦いを永遠にくりかえしている」
ダスト「俺は正義の化身。おまえの理解できない力によってこの世に召喚されたもの」
ダスト「吹け、浄化の風よ。この世から邪悪な魂を洗い流せ」
ダスト「俺はダスト。おまえの戦いはここで終わる。」
フードから初めて見えるダストの顔。
格好良すぎる。

ガイウスはスーパーアーマーを持っており、コンボの最中にすらこちらの攻撃を弾き返すことがあります。
またこちらを3発程度で殺しきるほどの攻撃力を誇ります。
しかし攻撃は単発で、また攻撃に移るのも遅いので避けるのは容易。
あとジャンプするとガイウスもジャンプしてくるので、そこを斬り倒せば楽勝です。

HPを削りきると無敵になり、壁際に逃げます。
そこを斬ると壁を突き破って落下。
どこのベルガーだよ。

ガイウス「カシウス、無謀だ!私とおまえでは、力の差がありすぎる」
お?どうやら遊ばれていたみたいです。
さすがにラスボスがあんなしょっぱい攻撃パターンじゃないよな。

ダスト「俺はカシウスじゃない!」
ガイウス「おまえと俺は、肩をならべ戦った仲だ!」
ダスト「だが、今は違う。俺はおまえの仲間でも、友人でもない。俺と剣を交えるか、降伏するか、ふたつにひとつだ」

本気を出したガイウス。
暗黒球を撃ち出す危険な魔法を繰り出してきます。
また敵の増援としてヘリが出てくるので、非常に厳しい戦いを強いられます。
味方の銀血の民も現れますが、正直邪魔以外の何者でもない。
どうせ最後なので回復アイテムも惜しみなく使用しましょう。

HPを削りきると地面が落ちて第三形態。
攻撃パターンはほぼ同じですが、味方の増援が居なくなり、敵の増援として敵兵士がやってきます。

HPを削りきるとさらに地面が落ちて最終形態。
最後はタイマン、マグマの上に突き出た柱の上での戦いです。
つまり落ちるな危険。
そのくせガイウスは二段ジャンプどころか無限段ジャンプを持っており、絶対に落ちることがありません。ずるい。
ここはかなりの難関ですが、どうにかガイウスのHPを削りきり、ついに撃破!

したと思った瞬間マグマが爆発し、地面に叩きつけられるダスト。
ずっと目深に被っていたフードが外れ、再び素顔が露わになります。

崖にしがみついているガイウス。
うつ伏せに這いながら近付くダスト。

ガイウス「カシウスは死んだ。我々が愛した世界と共に」
一度はダストの手を取るものの、そのまま落ちていくことを選択したガイウス。
仰向けになり、空を見上げるダスト。
視界の端に映るジンジャーとフィジット。

ダストを助けに来るフィジット。
だがダストは優しく諭します。
ダスト「生命の糸に呼ばれたときは…」
フィジット「さよなら…ダスト」
マグマに呑まれるダスト。
アーラの剣が何がしかの力を使い、そして光が消える。

グレイアイ「ダストの犠牲によって我々は平和を勝ち取った。これからは温血の民と共に繁栄していくことだろう」
光の消えたはずのアーラの剣が浮き上がり…

For My Dearest Elizabeth


XBLAとはとても思えない美しいグラフィック、軽快なアクション、暗く熱いストーリーと、価格以上にとても満足できる作品でした。
惜しくらむはガイウス将軍の動機が全く出てこなかったので、一体何が彼をそこまで駆り立てていたのかがさっぱりわからなかったところ。
銀血の民を虐殺し続けている以外は会話も通じたし狂信的な感じもしなかったので、もしかしたら世界を守るためにやらなければならなかったのではないかなんて妄想もありではないか。
あと、さらにその上の王についてもほんのわずかしか話がなく、王はガイウス将軍の行動を咎めていなかった、つまりは推進していたのではないか、将軍一人倒しても実は全く情勢は変わってないのではないかなんて展開もあるかもしれません。
そこらへんの話も含めた後日談や続編が是非ほしいところです。

まああれだ、XBLAがプレイできる環境であればとりあえず買え。
最初プレイに慣れるまでが少々きついですが、慣れさえすれば素晴らしいファンタジーが待っています。


Dust: An Elysian Tailのまとめ




2014/02/10 23:27 | Comments(0) | ゲーム
買ったものリスト 2014/02/09
最近暇が無くて記事のストックが尽きてきたので、平日の更新は不定期に休んだりします。


ニンジャスレイヤー 荒野の三忍 ブラッドレー・ボンド
ニンジャスレイヤー 聖なるヌンチャク
☆☆☆☆☆

異次元ニンジャ活劇、第二部キョート編はまだまだ続くよ。
分厚いのにノリが軽くてさくさく読み進められるのもポイントかね。
まあ毎回新しい敵ニンジャが出て死ぬパターンだけはほぼ変わらないけど致し方なし。

そしてガンドー死んじゃったのか?
まあ味方サイドに今まで全く被害がなかったのがおかしいといえばおかしいが、いいキャラだっただけに残念。


巨悪学園1 長沢克泰うどん
巨悪学園2
☆☆☆☆

バカだ。
実にバカだ。
なんつうか中身は何もないんだが、勢いと濃さだけは何にも負けない。
ただ本は分厚いんだけど、巻の半分近くはネーム、つまり本編の下書きです。
批判が来たのか2巻では「ネーム部分はサービスだ、あってもなくても価格は変わらない」とか言ってました。
価格はどうでもいいんだけど、こんなに分厚いのか、と思って読み始めたら半分で終わってしまったときのがっくり感はやはりあるのでちょっと残念。
まあその点だけ注意していれば、元は十分に取れる面白さなので買って損はないです。


ベン・トー 11 サバの味噌煮弁当【極み】290円 アサウラ
☆☆☆

最後の展開はないんじゃないか。
伏線があればまあいいんだけど、前巻のラストから今巻はないんじゃないか。
滑り止め感が半端ない。



2014/02/09 19:58 | Comments(0) | 買ったもの
PHP5.5.3 DateTimeImmutableで不変の日時
https://bugs.php.net/bug.php?id=65502
え?
<?php
	$today = DateTimeImmutable::createFromFormat('Y-m-d H:i:s', '2014-01-01 00:00:00');
	var_dump($today);

object(DateTime)#3 (3) {
  ["date"]=>
  string(19) "2014-01-01 00:00:00"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(10) "Asia/Tokyo"
}
これはひどい。

http://www.php.net/ChangeLog-5.php#5.5.5
PHP5.5.5で修正されたそうです。


https://bugs.php.net/bug.php?id=65548
え?

http://www.php.net/manual/ja/datetime.diff.php
> PHP 5.2.2 以降では、DateTime オブジェクトを 比較演算子 で比較できるようになりました。
<?php
	$today = new DateTimeImmutable('2014/01/01 00:00:00');
	$tomorrow = new DateTimeImmutable('2014/01/02 00:00:00');
	var_dump($today < $tomorrow , $today > $tomorrow, $today == $tomorrow);
	
bool(false)
bool(false)
bool(false)
これはひどい。

http://www.php.net/ChangeLog-5.php#5.5.5
PHP5.5.5で修正されたそうです。


http://bugs.php.net/65768
え?

http://jp2.php.net/manual/ja/datetime.diff.php
> public DateInterval DateTimeImmutable::diff ( DateTimeInterface $datetime2 [, bool $absolute = false ] )

<?php
	$now = new DateTimeImmutable('now');
	$hour = new DateTimeImmutable('+1 hour');
	var_dump($now->diff($hour));
	
	DateTime::diff() must be derived from DateTimeImmutable::diff
これはひどい。

http://www.php.net/ChangeLog-5.php#5.5.8
PHP5.5.8で修正されたそうです。


DateTimeImmutableクラスはPHP5.5で追加されたクラスで、最初に設定した日時を変更することができないDateTimeです。
<?php
	$today = new DateTimeImmutable('2014/01/01 00:00:00');
	$tomorrow = $today->modify('+1 day');
	
	print($tomorrow->format('Y-m-d H:i:s')); // 2014-01-02 00:00:00
	print($today->format('Y-m-d H:i:s')); // 2014-01-01 00:00:00のまま
DateTime::modify()は自分自身を変更しますが、DateTimeImmutable::modify()は自分は変えずに変更後の値を返すという挙動になります。

変えられない日付(イベントの日時など)を設定しておいて、それからの差分を求めたりなんかしたい場合に便利です。
が、しかしこうもバグがあると使うのが躊躇われますね。

PHP5.5からDateTimeInterfaceインターフェイスが追加され、DateTimeとDateTimeImmutableはDateTimeInterfaceをimplementsするようになりました。
しかしIntlDateFormatter::formatなど、元々DateTimeを要求していたところが未だそのままになっていたりするなど、周囲の変更が追いついていないようです。



2014/02/03 23:15 | Comments(0) | PHP
買ったものリスト 2014/02/02
やっとネット環境が復活。

ということで地球防衛軍4INFERNOノーダメージ攻略はじめました。

てれてれとプレイしていきます。
実は既に半分以上クリアしてるのは秘密だ。


AverMedia AVT-C285

動画の撮影に使ったのがこいつ。
元々AVT-C281Jの評判を見て買いに行ったのだが売り切れていて、新商品ということでちょっと高かったけどまあいいかと購入。
感想。
なんといっても録画が楽。
キャプチャボードだとPCつけてソフト起動して、と色々必要だったのが、録画ボタン押すだけ。超楽ちん。
XBOX360、PS3、WiiU対応ケーブルが最初からついてきて、さらにHDMIケーブル使えばHDMI録画も可能。
画質も1920*1080と圧倒的。
欠点は筐体やリモコンが安っぽいのと、ボタンに対するレスポンスが妙に遅いこと。
前者はまあどうでもいいのですが、後者は使い勝手に影響するのでかなり困ります。

一応これ単品でもカット編集は出来るのですが、大変です。
細かな録画・再生などには向いておらず、垂れ流し保存しておいてPCでの編集向けでしょう。


立川・福生本
くるマップ多摩市街道路地図

ネット環境がなかった間に横浜から立川に引っ越しました。
しかし周辺地域が全くわからないので困る。
誰かいいところ連れてってください。


絶対☆霊域8 吉辺 あくろ
☆☆☆☆☆

ヒナちゃんがかわいいだけの漫画だが、ヒナちゃんがかわいいからそれでいい。
幼女回素敵すぎる。

そして最後…あれ、このふたりまだ出会ってなかったのか。
相変わらず巻末以外話が進まない作品だ。


角刈りすずめ 完全版 KICHIJO
☆☆☆☆☆

既に単行本持ってるのに書き下ろし付きなんてずるい。
うっかり買ってしまうじゃないか。

しかしあまりに酷すぎるオチだった。
どうすんだよこれ。

なお麻雀漫画ではないので、間違ってもまともに考えてはいけません。


2014/02/02 20:12 | Comments(0) | 買ったもの
PHP5.5.3 エラトステネスの篩で素数を求める
素数出力プログラミング大会
http://person-link.co.jp/blog/detail/32

1時間でやるならまだしも、一週間も期間があるのに誰もエラトステネスの篩書いてないとかどういうことだよ。
<?php
	// ArrayIteratorを使ったエラトステネスの篩

	// 初期値
	$max = 1000000;
	$arr = new ArrayIterator(array_flip(range(3, $max, 2)));
	$loopmax = ceil(sqrt($max));

	// 篩
	foreach($arr as $key=>$val){
		if($key > $loopmax ){ break; }
		if(!isset($arr[$key])){ continue; }
		$loop=2;
		$now = $key*2;
		while($now <= $max){
			if(isset($arr[$now])){unset($arr[$now]);}
			$loop++;
			$now = $key*$loop;
		}
	}

	// 出力
	echo 2, PHP_EOL, implode(PHP_EOL, array_keys($arr->getArrayCopy())) , PHP_EOL;
<?php
	// 文字列を使ったエラトステネスの篩
	
	// 初期値
	$max = 1000000;
	$str = str_repeat('01', $max/2+1);
	$loopmax = ceil(sqrt($max));

	// 篩
	for($key=3; $key<=$loopmax; $key+=2){
		if($str[$key] === '0'){continue;}
		$loop=2;
		$now = $key*2;
		while($now <= $max){
			$str[$now] = '0';
			$loop++;
			$now = $key*$loop;
		}
	}

	// 出力
	$sosuu = '2'.PHP_EOL;
	for($key=3; $key<=$max; $key+=2){
		if($str[$key]==='1'){
			$sosuu .= $key.PHP_EOL;
		}
	}
	echo $sosuu;
10000まで、および1000000までの素数を求めるのにかかった時間とメモリ使用量です。
計測方法は2回計った平均値というかなり意味のない値なので、オーダー程度に見てください。

ファイル名10000件時間(秒)1000件メモリ(kb)1000000件時間(秒)1000000件メモリ(kb)
katsurayama_sosu.php 0.00400043 134.38 1.78117800 1362.41
maeda_sosu.php 0.30502999 991.88 Maximum execution time of 180 seconds exceeded
sosu_sample.php 2.81178141 992.17 Maximum execution time of 180 seconds exceeded
tanaka_sosu.php 0.00449991 248.15 0.99830055 8166.82
NurseAngel ArrayIterator 0.00450063 993.30 0.48954952 84322.09
NurseAngel str_repeat 0.00250053 145.05 0.19101894 2363.26

2番目と3番目ひどいな。
10000件の時点で既に他と100倍~1000倍の差があります。
毎回echoしているせいかと最後にまとめて出力してみたのですが変わりませんでした。
何故ここまで違うんだろう。

篩のほうは値が大きくなるほど処理対象が少なくなるため、10000件程度ではtanaka_sosu.phpとあまりかわりませんが、1000000件まで行くと相対的に処理時間が減っていきます。

はじめ何も考えずにArrayIteratorで書いたのですが、最初に50万件のArrayIteratorをががっと作ってしまうので、使用メモリがえらいことになってます。
1000万件を処理しようとしたら死にます。
あまりに残念だったので書き直してみたのがstr_repeat()を使う方。
メモリ使用量が激減したのは想定通りですが、実行時間まで半分以下になるとは正直思ってなかった。
やってることは単純に、最初に'1111111111'という文字列を作り、篩に当たったところを0にしていくだけです。

ちなみに偶数の素数は2だけなので、予め処理対象から外しておいて計算量を減らしています。
まあ対照実験やってないので本当に減ってるかどうかは不明ですが。

ググってみた限りでは、PHPでエラトステネスの篩を使うソースは全て配列での実装を行っており、文字列の実装をしている人は見当たりませんでした。


2014/01/17 22:04 | Comments(2) | PHP

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