忍者ブログ
[PR]
×

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



2025/08/05 13:14 |
AuraPHP 1.0.0 Auraをインストール
AuraとはPHPのライブラリのひとつで、綺麗でモダンなソースで有名なのだそうです。
本当かどうかはよくわかりませんが、ソースを斜め読みしたかぎりではそんなような気がしないでもないです。

例によって日本語サイトが全く存在しないので適当に触ってみます。
まずはインストール。
composer.jsonの、require部分に以下の行を追加します。
    "aura/autoload": "1.*",
	"aura/cli": "1.*",
	"aura/di": "1.*",
	"aura/http": "1.*",
	"aura/marshal": "1.*",
	"aura/router": "1.*",
	"aura/signal": "1.*",
	"aura/sql": "1.*",
	"aura/uri": "1.*",
	"aura/view": "1.*",
	"aura/web": "1.*",
	"aura/filter": "1.*",
	"aura/intl": "1.*",
	"aura/session": "1.*"
そしてインストール。
> php composer.phar install
これでインストール完了です。

どうもComposerは、packagistというサイトに登録されているパッケージであれば、repositoriesを書かなくてもいいらしいです。
auraも登録されているので、ここに出てくるパッケージ名を記入するだけです。

ってこんな機能Composerのヘルプにあったっけ?
前インストールしたときとか全く見た覚えがないんだが。

と思ったら普通に書いてあった

packagistには他にもaura/inputとかaura/frameworkとかありましたが、inputはまだベータ、frameworkとかは何なのかよくわかりませんでした。
よくわからないので公式の記載に従っています。

それでは早速動作テスト。
<?php
	require_once('path/to/channel/vendor/autoload.php');
	
	$auraSql = new Aura\Sql\ConnectionFactory();
	$connection = $auraSql->newInstance('mysql', 'host=localhost;dbname=testdb;charset=utf8;', 'testuser', 'testpass');
	$sql = 'SELECT * FROM hoge LIMIT 1';
	$hoge = $connection->query($sql)->fetchAll();
簡単にできました。


AuraPHPの記事

PR


2013/04/19 22:06 | Comments(0) | PHP
Zend Framework2.1.3 Zend\Stdlib\ErrorHandler
Zend\Stdlib\ErrorHandlerは、PHPエラーを極めて簡単に扱えるクラスです。

通常PHPのエラー発生時は、画面に文字列としてエラーメッセージなどが表示されてしまいます。
わりかし扱いづらいので、ついつい@とかini_set('display_errors', 0);とかやってしまいがちです。
そこでErrorHandler。
PHPエラーを吸収し、例外として扱うことが可能になります。
まあset_error_handler()のラッパーです。

<?php
	header('Content-type: text/html; charset=UTF-8');
	require_once('path/to/channel/vendor/autoload.php');
	use Zend\Stdlib\ErrorHandler;
	
	// エラーハンドラ開始
		ErrorHandler::start(E_ALL | E_STRICT);
	
	// エラーはハンドラに奪われる
		print($a); // Undefined variable:a
		ereg('pattern', 'string'); // Function ereg() is deprecated
	
	// パースエラーはさすがに無理
		// hogehoge // Parse error: syntax error
		
	// 例外はキャッチしない
		// throw new Exception('なんか例外');
	
	// エラーハンドラを終了して元に戻す
		$exception = ErrorHandler::stop();
		
	// stop()の返り値はErrorExceptionクラス
		print($exception->getMessage()); // Function ereg() is deprecated
		print($exception->getPrevious()->getMessage()); // Undefined variable:a

	// 破棄して終了する場合はstop()のかわりにclean()
		ErrorHandler::clean();

ErrorHandler::start()で開始、stop()で終了してエラーを捕捉できるという非常に楽な作りとなっています。
この際だからPHPエラーとはさよならしてしまいましょう。



2013/04/17 22:58 | Comments(0) | PHP
PHP5.4.7 PHPの字句解析を行う
Tokenizer関数は、Zend Engineを用いてPHPソースコードの字句解析を行うという、いったい誰がどんな時に使用するのか全く見当が付かない関数です。

ソース。
<?php
	$source = file_get_contents(basename($_SERVER['SCRIPT_NAME']));
	$token = token_get_all($source);
	
	foreach($token as $key=>$val){
		if(is_array($val)){
			$token[$key][0] = token_name($val[0]);
		}
	}
	print_r($token);

実行結果。
Array
(
    [0] => Array
        (
            [0] => T_OPEN_TAG
            [1] => <?php

            [2] => 1
        )

    [1] => Array
        (
            [0] => T_WHITESPACE
            [1] => 	
            [2] => 2
        )

    [2] => Array
        (
            [0] => T_VARIABLE
            [1] => $source
            [2] => 2
        )

    [3] => Array
        (
            [0] => T_WHITESPACE
            [1] =>  
            [2] => 2
        )

    [4] => =
    [5] => Array
        (
            [0] => T_WHITESPACE
            [1] =>  
            [2] => 2
        )

    [6] => Array
        (
            [0] => T_STRING
            [1] => file_get_contents
            [2] => 2
        )
以下も続きますが省略。
このように、PHPがプログラムを実行するうえで必要なトークン単位にソースを分割してくれます。
こんなのネタ以外で使う人なんていないだろと思いきや、ソースをPHPからC++に変換するという、これまた意味の分からないプロジェクトで使われていました。
誰がどんな時に使うんだそれ。


2013/04/15 22:05 | Comments(0) | PHP
買ったものリスト 2013/04/14

プリキュア オールスターズ ぜんいんしゅうごう☆レッツダンス! バンダイナムコゲームス

Wii最高傑作がハッピーダンスコレクションだと思っているので仕方なく購入。
ええ、仕方なくですよ仕方なく、いやほんと。

で、まだあまりやっていないのですが軽くプレイした限りでの感想。
とりあえず3Dモデルが激しく微妙。
エンディングのモデルそのまま使えなかったんですかね?
あと収録曲もAllright!ハートキャッチプリキュア!が無いとかどういうことなのでしょうか。
またせっかくのリアルタイムレンダなのに構図が同じせいであまり意味がないという。
着せ替えとまでは言わないから、キャラの入れ替えくらいできなかったんですかね。
しかしプリキュアの曲で歌って踊れるという魅力は何物にも代えられないですので、それさえ許せるのであれば多少の欠点など気にせず買うべし。

なお、私プリキュア本編はハートキャッチ、フレッシュ、スイートしか見ていないので、そこらへん思い入れの差があるかもしれません。


本当に恐ろしかったさぬきうどん10
☆☆☆☆

私、自動車免許を合宿で取ったのですが、それがたまたま香川にある関西自動車学院というところでした。
昼食は近くにあるうどん屋で必ずうどんでした。
場所的にはたしかこの店だったような気がするのですが見た感じなんか違う気もするがどこだったっけ。
で、そのうどんがマジうまい。
それまで特にうどんとか好きってわけでもなかったのですが、そりゃもうこんなうどんだったら毎日食べる理由もわかります。
さすが本場、そこらにありふれているチェーン店とは桁が違う。

さてこちらの本ですが、レポート風というかブログエントリ風に色々な店を紹介してくれています。
食べ方の掟とか、それ以前に店の存在の見分け方とか、そしてもちろん味も。
気軽に行ける場所ではないのですが、また行きたくなってしまった。

ちなみに絵は正直無くていいんじゃないかというレベルですが、まあ絵を見るものではないのでどうでもいいです。
なお、何が恐ろしかったのかは結局不明。
しかしサイトは全然更新されていないですね。



アドベンチャーゲームサイド Vol.0 ゲームサイド編集部
シューティングゲームサイド Vol.6
アクションゲームサイド Vol.B

てっきり打ち切りフラグとしか思えなかった特化ゲームサイド、むしろ拡大して月刊レベルになるという予想外の展開を迎えました。
ジャンルを限定したことにより、逆に深い特集が可能になったのでしょうか。
新着情報や、またレビューについても今やネットにはほぼ敵わなくなってしまった雑誌ですが、制作者インタビューや開発資料といった他にはない情報を持ってくることにより、まだまだ買うに値する価値を保っています。
さすがに長くやってるだけあってネタ被りはありますが、それでも初回なのだからアドベンチャーはEver17を特集すべき。
さて次はシミュレーションゲームサイドかパズルゲームサイドか、それともFPSゲームサイドか。


2013/04/14 19:49 | Comments(0) | 買ったもの
今週の実績 2013/04/14
2013/04/08の実績

Gears of War: Judgment

兄弟分 50
協力プレイでストーリーモードをすべてクリアした



2013/04/14 17:28 | Comments(0) | 実績
PHP5.4.4 SplFixedArrayで固定長配列
PHPの配列は、普通の配列も連想配列も実際は順序付きMapです。
JavaであればArrayListやTreeMap等色々な配列があってややこしいのですが、PHPだと全部array()で楽ちん。
これは非常に便利なのですが、でも自由度があるぶん遅いです。
固定長配列しか扱えないかわりに高速化されたSplFixedArrayというものがありましたので使ってみます。

<?php
	$max = 1000000;
	
	$array = array();
	$splFixedArray = new SplFixedArray($max);
	$time=array();
	
	// arrayにput
	$time[1] = microtime(true);
	for($i=0;$i<$max;$i++){
		$array[$i] = $i;
	}
	$time[2] = microtime(true);
	
	// SplFixedArrayにput
	$time[3] = microtime(true);
	for($i=0;$i<$max;$i++){
		$splFixedArray[$i] = $i;
	}
	$time[4] = microtime(true);
	
	// arrayからget
	$time[5] = microtime(true);
	foreach($array as $key=>$val){
		$tmp = $val;
	}
	$time[6] = microtime(true);
	
	// SplFixedArrayからget
	$time[7] = microtime(true);
	foreach($splFixedArray as $key=>$val){
		$tmp = $val;
	}
	$time[8] = microtime(true);
いいかげんな計測方法ですがまあ気にしない。
結果は以下のとおり。

array put: 0.25703620910645
array get: 0.061129093170166

SplFixedArray put: 0.11810994148254
SplFixedArray get: 0.13133406639099

挿入はSplFixedArrayが配列の約半分、でも取得は普通の配列のほうが早くてSplFixedArrayの約半分という微妙な結果になりました。
合計としてはSplFixedArrayに軍配があがりますが、それでも100万件で0.1秒差とかそういうレベルです。
よっぽど時間にシビアなシステムでもないかぎり、現状の配列をわざわざ差し替えるほどのものではないかなあと。
どちらかというと予め最大数を決めておきたい場合に使うとかになるでしょうか。



2013/04/12 23:47 | Comments(0) | PHP
WEBZARU 「PHPでCSVデータを読み込む(文字化け対策ver)」 の感想
http://www.webzaru.net/php/1365/
なんか色々ともやもやする。
一番気に入らないのは$id=1を指定しても全行読み込むところですが、他にも引数$idによって返り値が違うとか、全く意味のないforがあるとか、$_enc_toをループ内で毎回呼び出してるとか、if()の後に{}が無いとか色々とびみょい。
ということで書き直した。

class GetCsv{

    /**
     * CSVの全行を取得する
     *
     * @param  String ファイル名
     * @return array  fgetcsvの配列
     */
    public static function getCsvData( $filename, $id = false ){
        if($id && is_int($id)){
            return self::getCsvLine($filename, $id);
        }
        if ( !file_exists( $filename ) ){ return false;}

        $rows = array();
        $_enc_to   = mb_internal_encoding();
        $_enc_from = 'sjis';

        $handle = fopen( $filename, 'r' );

        self::fgetcsv_reg( $handle );
        while ( ( $data = self::fgetcsv_reg( $handle ) ) !== false ) {
            $rows[] = $data;
        }
        mb_convert_variables( $_enc_to, $_enc_from, $rows );

        fclose( $handle );
        return $rows;
    }

    /**
     * CSVの特定行を取得する
     *
     * @param  String ファイル名
     * @param  int    取得する行
     * @return array  fgetcsv
     */
    public static function getCsvLine( $filename, $id ){
        if ( !file_exists( $filename ) ){ return false;}
        $_enc_to   = mb_internal_encoding();
        $_enc_from = 'sjis';
        $handle = fopen( $filename, 'r' );

        for($loop=0; $loop<$id; $loop++){
            if(!self::fgetcsv_reg($handle)){
                return false;
            }
        }

        $row = self::fgetcsv_reg($handle);
        mb_convert_variables( $_enc_to, $_enc_from, $row );

        fclose( $handle );
        return $row;
    }
}

書き直してはみたもののやはり微妙だ。
メソッドがキャメルケースなのに内部変数がスネークケースのせい?
FROMエンコーディングがファイルを確認せずにSJIS固定のせい?
特定行取得はメソッドに織り込んでるのに範囲取得はarray_sliceとかやってるせい?

いや、そもそもニュースとかCSVじゃなくてDBで管理しろってところだ。


ちなみにfgetcsv_regは有名なのですが、そのまま使うとUndefined variable: eofのNoticeが出ます。
頭に$eof = false;とか突っ込んでおきましょう。



2013/04/10 00:00 | Comments(0) | PHP
Zend Framework2.1.3 Zend\Stdlib\ArrayUtils
Zend\Stdlib\ArrayUtilsは、配列について少し便利なチェックや操作が行えるクラスです。

<?php
	header('Content-type: text/html; charset=UTF-8');
	require_once('path/to/channel/vendor/autoload.php');
	use Zend\Stdlib\ArrayUtils;
	
	$sample = array();
	
	$sample[2] = 1;
	$sample[3] = 'foo';
	$sample['hoge'] = true;
	$sample['fuga'] = 'bar';
	
	// 配列が文字列のキーを持つか(is_string) → true
	$hasStringKeys = ArrayUtils::hasStringKeys($sample);
	
	// 配列が整数のキーを持つか(is_int) → true
	$hasIntegerKeys = ArrayUtils::hasIntegerKeys($sample);
	
	// 配列が数値形式文字列のキーを持つか(is_numeric) → true
	$hasNumericKeys = ArrayUtils::hasNumericKeys($sample);
	
	// 連想配列、もしくは0から順に値が埋まっていない配列であるか → false
	$isList = ArrayUtils::isList($sample);
	
	// isListの逆、ハッシュテーブルか → true
	$isHashTable = ArrayUtils::isHashTable($sample);
	
	// in_array('foo', array(0))がtrueになるのを修正 → false
	$inArray =  ArrayUtils::inArray(0, $sample);
	
	// イテレータから配列に
	$iteratorToArray = ArrayUtils::iteratorToArray(new \ArrayObject($sample));
	
	// 配列のマージ。連想配列は上書き。数値キーは振り直されず、重複は追記。
	$merge = ArrayUtils::merge($sample, $sample);

ArrayUtils::isHashTable()はややこしそうに見えますが、実は単にisListの逆です。
ArrayUtils::iteratorToArray()は特徴として、イテレータが多重になっている場合は全て多重配列に解凍してくれます。
array_merge()は数値キーが0から振り直されてしまいますが、ArrayUtils::merge()は数値キーもそのままです。

本気でちょっとだけ便利なようなユーティリティでした。
いまだにリファレンスに載ってないAPIが多すぎる。



2013/04/08 22:48 | Comments(0) | PHP
買ったものリスト 2013/04/07
GoWジャッジメント、インセイン・情報開示クリア。
シナリオが短いと言いましたが、それをある程度補うためか、同じシーンでも変化があります。
敵の出現パターンが基本的に2種類(たまに3種類?)あり、同じ場所でも違った攻略が必要とされます。
さらに台詞も複数パターンがあるため、一度クリアするだけでは絶対に聞けなかったりします。
またプレイヤーの任意で「情報開示」というモードを選択することができ、これを選択するとさらに強力な敵が出てきたり、砂埃で視界が悪くなったり、時間制限がついたりと難易度上昇効果が発生します。
このように変化を付けることである程度周回プレイに耐えうるようにはなっているのですが、やはり「根本的に短い」という点を完全に解消するに至ってはいません。
まあGoWのメインはオン要素だと考えている人の方が多数でしょうけど。

オンはSURVIVAL以外ひととおりプレイ。
対戦マップ数が何故かやたら少ないこと以外はかなり快適で、ラグもほとんど感じられません。
見通しのいいマップとフィールドの狭いマップ追加はよ。


かくげいぶ! 1巻 IKa
☆☆☆

怪我で空手を続けることができなくなってしまい、でもマネージャとして空手部に入ろうとしたらうっかり間違って格芸部に入ってしまったさくらちゃんの健闘を見守る、ふりをしたレゲーネタの宝庫、のふりをした女児を見守る漫画。
この作者ぶれない。
正直まんがとしては見所はないんですが、まあそんなことはどうでもいいんです。
女児は正義。


メガドラ部長りるなちゃん IKa
☆☆☆

15年以上前から同人で少しづつ書かれ、何故かエロ雑誌などにも掲載されていたりるなちゃんの総集編です。
まあ見たのは初めてですが。
またメガドラ部長とか言っていますがゲームネタはほぼありません。
129センチの女児(21)が色々するだけの漫画。
この作者昔からぶれてない。
21の女児は正義…?


小悪魔女子大生のサーバエンジニア日記 aico
☆☆☆

同名のブログを本に仕立てたものです。
なのでブログを見ていれば買う必要はほぼ一切無いです。
またここを見て技術を勉強しようっていうのは大間違いなので、持ってても全く役には経たないのですが、ついうっかり購入してしまいました。
元々本が出る前は見ていたのですが、本が出てから更新頻度が落ちるというどこかで見たような風景が発生し、現在ではすっかり停滞。
directorzって会社に就職したようですが…この一切何も説明していないサイトはなんなんだ。


大伝説の勇者の伝説12 遅れてきた魔眼の王 鏡 貴也
大伝説の勇者の伝説13 昼寝と団子と王様と
☆☆☆

とりあえずシリーズでやってたような内容を一行で終わらせやがった。
というかただの移動にそんなに時間かけて大丈夫なのか?
正直シリーズ初期の内容とか完全に忘れ去ってるんだけど何で全国行脚してたんだっけ。




2013/04/07 20:50 | Comments(0) | 買ったもの
今週の実績 2013/04/07
2013/04/06の実績

Gears of War: Judgment

さあ行くぞ 50
レベル 50 に到達し、経験値をリセットして新たな任務に備えた

レベル 50 25
レベル 50 に到達した

2013/04/05の実績

Gears of War: Judgment

便利屋 10
OVERRUN で 10 回勝利した

2013/04/04の実績

Gears of War: Judgment

オーバーラン 10
OVERRUN の全マップで勝利した

倒れし者の記憶 20
ストーリーモードで COG タグを 48 個すべて手に入れた

COG 軍の滅亡 10
ローカスト軍の全種類で敵を倒した (OVERRUN)

鉄の拳 25
難易度ハードコア以上でストーリーモードをクリアした

獅子奮迅 50
難易度インセインでストーリーモードをクリアした

真摯な兵士 50
すべての機密情報を開示してクリアした

厳格な審理 75
難易度インセインですべての機密情報を開示してクリアした

2013/04/03の実績

Gears of War: Judgment

ローカスト軍の滅亡 10
COG 軍の全クラスで敵を倒した (OVERRUN または SURVIVAL)

2013/04/02の実績

Gears of War: Judgment

チーム リーダー 10
TEAM DEATHMATCH で 10 回勝利した

旅行者 10
対戦モードの全マップで勝利した

ドミネーター 10
DOMINATION の全マップで勝利した

2013/04/01の実績

Gears of War: Judgment

レベル 40 25
レベル 40 に到達した

オールラウンダー 10
FREE FOR ALL、TEAM DEATHMATCH、DOMINATION でそれぞれ 1 回勝利した

放浪者 10
FREE FOR ALL の全マップで勝利した

スター シャワー 50
難易度ハードコア以上でスター 100 個を獲得した

2013/03/31の実績

Gears of War: Judgment

老兵の記憶 10
ストーリーモードで COG タグを 25 個手に入れた

チーム ツアー 10
TEAM DEATHMATCH の全マップで勝利した

レベル 30 15
レベル 30 に到達した



2013/04/07 17:20 | Comments(0) | 実績

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