ActionScript3でオブジェクトを複数条件ソートする時のメモ。
sortOn() を使うと一発でできるのでラクチンです。
しかし条件の指定をちょっと変えると結果が全然違ってくるので注意です。
下の例では全て「y」「x」の順にソートしています。
var list:Array = [ new Point(5, 5), new Point(0, 10), new Point(10, 10), new Point(10, 0) ]; list.sortOn( ["y", "x"] ); // 文字列比較で小さい順に並べている。文字列だから「10<5」になる。 // (x=10, y=0),(x=0, y=10),(x=10, y=10),(x=5, y=5) list.sortOn( ["y", "x"], Array.DESCENDING ); // 降順ソート。こちらも文字列だから「10<5」になる。 // (x=5, y=5),(x=10, y=10),(x=0, y=10),(x=10, y=0) list.sortOn( ["y", "x"], [Array.NUMERIC, Array.NUMERIC] ); // どちらも数値としてソート // (x=10, y=0),(x=5, y=5),(x=0, y=10),(x=10, y=10) list.sortOn( ["y", "x"], [Array.DESCENDING | Array.NUMERIC, Array.NUMERIC] ); // 「y」は「数値で降順」、「x」は「数値で昇順」 // (x=0, y=10),(x=10, y=10),(x=5, y=5),(x=10, y=0) list.sortOn( ["y", "x"], [Array.DESCENDING|Array.NUMERIC, Array.DESCENDING|Array.NUMERIC] ); // どちらも「数値で降順」 // (x=10, y=10),(x=0, y=10),(x=5, y=5),(x=10, y=0)
Array.CASEINSENSITIVE | 大文字と小文字を区別しないソート |
---|---|
Array.DESCENDING | 降順のソート順 |
Array.UNIQUESORT | 一意性ソート要件 |
Array.RETURNINDEXEDARRAY | sort() メソッドまたは sortOn() メソッドの呼び出し結果としてインデックス付き配列を返す |
Array.NUMERIC | 数値によるソート |
Array.UNIQUESORT はちょっと特殊で、ソート対象に同じ値が混ざっていないかチェックします。
同じ値が混ざっている場合は並び替えをせず「0」を返します。
前々回の記事でインストールをやり、
前回の記事でサブドメインの設定について書きました。
今回はLAN内の別のPCからアクセスする方法を書きます。
前回のようなサブドメインではなく、ポートを使ってバーチャルホストを実現します。
まずはApacheをインストールしたPCが外部からのアクセスを許可しているか確認します。
他のマシンのブラウザから対象PCのIPアドレスを入力します。
IPアドレスは「コマンドプロンプト」で「ipconfig」と入力すると確認できます。
(スタートメニュー>プログラム>アクセサリ>コマンドプロンプト)
例:http://192.168.0.10/
これでAMPPSの画面が出てくればいいですが、出てこない場合はファイアウォールの設定が必要になります。
自分の環境では「Apache HTTP Server」として有効になっていました。
ローカルPC内ならサブドメインを用いたバーチャルホストが使えますが、その方法だと他のPCからはちょっと手間がかかります。
なのでポート単位でバーチャルホストを実現する方法をここでは書きます。
まずは httpd.conf に使用したいポートを追記します。
「80」はAMPPSの管理画面のために残しておきたいので、「8080」や「8000」など空きポートを使います。
[AMPPSフォルダ]apacheconfhttpd.conf
Listen 80
↓
Listen 80
Listen 8080
次にバーチャルホストの設定です。
[AMPPSフォルダ]apacheconfextrahttpd-vhosts.conf
<VirtualHost *:8080>
DocumentRoot "U:/http"
ServerName localhost
</VirtualHost>
肝は「8080」になっているところと、サーバーネームにサブドメインを付けないことです。
これで、下記のようにポート番号を指定してアクセスすれば見えるようになります。
例:http://192.168.0.10:8080/
上記のサイトがとても詳しいので参考にしてください。
上記サイトほか、ポート変更する場合は「NameVirtualHost」の設定も必要のようですが、自分の環境では変更していません。
単に設定し忘れただけなのですが動いているので良しとします。
どうせ自分しか見ないものなのでw
いわゆるCSRF対策のメモです。
Webでのデータ登録には
入力 → 確認 → 完了 という3つのフェーズで行うのが一般的です。
中でも最後の「完了」でデータ登録を行うことが多いため、
このページでリロードを行われると重複登録になったり、
前2フェーズを飛ばして不正なフォームをPOSTしてくるなどの
対策をする必要があります。
今まではセッションを使うなどして自前でコードを書く必要がありましたが、
FuelPHPでは Securityクラスを使うことで簡単に行えます。
確認画面のフォーム部分に下記を追加します。
echo Form::hidden( Config::get('security.csrf_token_key'), Security::fetch_token() );
下記のような隠し項目が書き出されます。
<input name="fuel_csrf_token" value="8af49a49ef926ca20fb713542c258fb4" type="hidden" id="form_fuel_csrf_token" />
そして登録を行うコントローラーで下記のように振り分けます。
if( !Security::check_token() ){ // エラー表示 }else{ // 正常なデータ登録 }
下記のサイトでは様々なセキュリティ対策について書かれてます。
CSRF対策についてはこちらの記事が良いかもしれません。
PHPには標準で $_SESSIONが用意されていますが、FuelPHPにもセッション管理用に
Sessionクラスが用意されています。
セッションの書き込みには Session::set() を使います。
名前と内容のペアを渡すだけなので簡単です。
Session::set( 'name', 'hogehoge' ); Session::set( 'characters', array( 'haruka', 'chihaya', 'miki', 'yayoi' ) );
2行目のように、オブジェクトを渡すこともできます。
連想配列や、多次元配列でも可能です。
取り出すには Session::get() を使います。
$name = Session::get( 'name' ); $characters = Session::get( 'characters' ); $all_sessions = Session::get(); $nodata = Session::get( 'no_exists', 'hogehoge' );
3行目:引数がない場合は全てのセッションデータを取得する。
4行目:セッションが存在しない場合の初期値を指定。
削除は Session::delete( 'name' ); という感じで行います。
set_flash()、get_flash()
というメソッドもあります。
set() で作ったセッションはしばらく残りますが、
set_flash() で作ったものは一度使うと消えるようです。
Session::set_flash( 'name', 'azunyan' ); $name = Session::get_flash( 'name' ); Session::delete_flash( 'name' );
set()、get()、delete()と使い方は同じですね。
今回はこちらの記事を参考にさせていただきました。
というかほぼそのままです。
初期状態ではセッション情報をクッキーに保存しているので、ファイルに書き出すようにします。
fuel/core/config/session.php を fuel/app/config/session.php にコピーします。
エディタで下記のように編集します。
'driver' => 'file',
ファイルの保存場所が「/tmp」になっていますが、自分は Windows環境でテストしたいので
FuelPHP管理下のフォルダに作ることにします。
'file' => array( 'cookie_name' => 'fuelfid', 'path' => APPPATH.'/tmp', 'gc_probability' => 5 ),
設定ファイル session.php の下記部分を「db」に修正します。
'driver' => 'db',
dbにセッション専用のテーブルを作成します。
下記SQLで作成できるようです。
CREATE TABLE IF NOT EXISTS `sessions` (
`session_id` varchar(40) NOT NULL,
`previous_id` varchar(40) NOT NULL,
`user_agent` text NOT NULL,
`ip_hash` char(32) NOT NULL DEFAULT '',
`created` int(10) unsigned NOT NULL DEFAULT '0',
`updated` int(10) unsigned NOT NULL DEFAULT '0',
`payload` longtext NOT NULL,
PRIMARY KEY (`session_id`),
UNIQUE KEY `PREVIOUS` (`previous_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
ドキュメントによるとメモリキャッシュに書き出すこともできるみたいですね
前回の日記「[FuelPHP]フォームのバリデーションとカスタムメッセージ」の続きで
自分ルールのバリデーションを作るメモです。
fuel/app/classes/myvalidation.php に記述します。
名前:no_same_chara
ルール:
「chara1」「chara2」「chara3」3つのフィールドに重複があれば false。
ただし内容が「chara_none」なら除外する。
<?php class MyValidation { public static function _validation_no_same_chara($val) { $chara1 = Input::post('chara1'); $chara2 = Input::post('chara2'); $chara3 = Input::post('chara3'); if( $chara1 == $chara2 && $chara1 != 'chara_none' ) return false; if( $chara1 == $chara3 && $chara1 != 'chara_none' ) return false; if( $chara2 == $chara3 && $chara2 != 'chara_none' ) return false; return true; } }
いきなり引数 $valを無視してますw
普通に項目の内容を検証するには下記のようにします。
public static function _validation_test_validation( $val ) { return $val == "ABC" ? true : false; }
オプションを与えることもできます。
オプションの必要なルールだと「max_length」が良い例ですね。
下記ではエラーメッセージも同時に設定しています。
public static function _validation_test_validation( $val, $option ) { Validation::active()->set_message('test_validation', ':label は「'.$option.'」じゃない。'); return $val == $option ? true : false; }
前回の記事でメッセージのカスタマイズについて書いたように
fuel/app/lang/ja/validation.php
に記述してもかまいません。
フォームから入力されたデータの検証(Validation)についてのメモです。
FuelPHPでフォームを扱うにはひとつひとつViewに記述していく方法と、
Fieldsetクラスを使ってまとめて管理する方法があるようです。
Fieldsetクラスを使うほうが FuelPHPらしいのですが、
Fieldset->build() で出力される HTMLが目的と違うので
今回はひとつひとつ書いていきました。
echo Form::open('entry/confirm'); echo Form::label('名前','name'); echo Form::input('name', Input::post('name'), array('class'=>'intput-middle')); echo Form::label('メールアドレス','email'); echo Form::input('email', Input::post('email'), array('class'=>'intput-middle')); echo Form::submit('submit', '確認'); echo Form::close();
バリデーションのやり方は簡単で、Validationクラスのインスタンスを作れば
フォームの内容は自動的に格納されます。
$validation = Validation::forge(); $validation->add( 'name', 'お名前' ) ->add_rule('required'); $validation->add( 'email', 'メールアドレス' ) ->add_rule('valid_email') ->add_rule('required');
forge()でインスタンスを作り、add()、add_rule()で
項目とバリデーションルールを設定します。
ルールはこのへんが標準で用意されています。
if( $validation->run() ) { // 問題ない時の処理 } else { // 問題ある時の処理 // エラーの項目とメッセージの連想配列を取得 $errors = $validation->error(); // エラーメッセージ用HTMLを取得 $error_html = $validation->show_errors(); // 検証に使用した入力値を項目と値の連想配列で取得 $error_input = $validation->input(); }
run()でバリデーションを行い、エラーの場合はその結果を取得します。
show_errors()の結果は HTMLなので、そのままビューに渡すとエスケープされてしまいます。
set_safe() で渡すことで HTMLのままになります。
$this->template->content = View::forge( 'entry/index', Array( 'errors' => $errors, 'error_input' => $error_input )); $this->template->content->set_safe( 'error_html', $error_html );
上記は Controllerクラスの継承ではなく Controller_Templateクラスの継承の場合です。
Controllerの場合は下記のように記述します。
$view = View::forge( 'entry/index', Array( 'errors' => $errors, 'error_input' => $error_input )); $view->set_safe('error_html', $error_html);
fuel/core/lang/en/validation.php をコピーし
fuel/app/lang/ja/validation.php に保存します。
バリデーション項目ごとに記述されているので自分の好きなように編集します。
return array( 'required' => ':label が入力されていません。', 'valid_email' => ':label の書式が正しくありません。', ~略~ );
初期状態では英語設定なので、日本語設定にします。
fuel/app/config/config.php の下記の部分を書き換えます。
'language' => 'ja', 'language_fallback' => 'ja',
以上のようにバリデーションと、メッセージのカスタマイズが行えます。
下記サイトがとても詳して大変参考にさせていただきました。
サブドメイン「test」を作って、「http://test.localhost/」として表示されるように設定します。
hostsファイルは「C:WINDOWSsystem32driversetc」にあります。
ただのテキストファイルなのでメモ帳などで編集できます。
127.0.0.1 localhost
という行がありますので、下記のように追加します。
127.0.0.1 localhost 127.0.0.1 test.localhost
「http://test.localhost/」を開いてAMPPSの画面が出てくれば成功です。
Windows7の場合hostsを編集しようとするとエラーが出てくることがあります。
その場合、編集したいプログラム(メモ帳など)のプロパティから
互換性タブ>特権レベル>管理者としてこのプログラムを実行する
にチェックを入れてください。
httpd.conで下記の行がコメントアウトされていないことを確認します。
httpd.confは「AMPPSインストール先apacheconf」にあります。
# Virtual hosts Include conf/extra/httpd-vhosts.conf
バーチャルホストに関する設定ファイル「AMPPSインストール先apacheconfextrahttpd-vhosts.conf」を編集します。
初期状態では空っぽになっています。
「conforiginalextrahttpd-vhosts.conf」をコピーしても構いません。
NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot "U:/http" ServerName test.localhost ErrorLog "logs/test-error.log" CustomLog "logs/test-access.log" common </VirtualHost> <directory "U:/http"> order deny,allow deny from ALL allow from ALL </directory>
フォルダ位置は任意でかまいません。
ポートを変更した場合は「80」になっている箇所も合わせます。
<directory>~</directory>は無くてもいいという記事もありましたが、無いと表示されませんでした。