2011年11月30日水曜日

PHPのNullとissetとarray_key_exists

先ほど気がついたのですが、PHPのissetの動きを勘違いしていました。

$var=NULL;
isset( $var ); // returns FALSE
is_null( $var ); // return TRUE
is_null( $none ); // E_NOTCE

issetはNULL値をFALSE判定します。

いつから勘違いしてたんだろう。

たとえばis_nullで調べればいいのですが、
変数が存在しない場合はE_NOTICEが出ます。

実は、あることにNULL値を使おうと思ってたのです。PHPだと空白('')、FALSE、NULLと三種類あるので便利だなぁと思ってたのですが、変数の判定が出来なければ使いにくい。困ったぞ、というわけです。

で、気がついたのがarray_key_existsを使うこと。
こういう構造になっている場合、NULLでも存在判定が出来ます。

$data[ 'test' ] = NULL;
array_key_exists( 'test', $data ); // returns TRUE

何とかなりそうです。

2011年11月28日月曜日

formUpDownというJavaScript

Ctrl+矢印キーで、テーブル内のフォーム要素間を動き回るコードを書きました。
長らくリンク切れになってましたが、デモをアップしました。

http://www.workspot.jp/tech/formUpDn/formupdnTable.html

かなり格好の悪いHTMLですが、実際に動きます。
ちなみにソースコードはgithubにあります。

まだjQueryのプラグイン化すらしてませんが。

実際に使うと分かりますが、セレクト要素の動きが変です。
作ったときから、そして今でも、更にはブラウザーによって挙動が変わります。

こういったところは、JavaScriptの問題かなと考えてます。

2011年11月23日水曜日

yet another な Validator クラス

なんで、世の中に数あるValidatorクラスを作ってるのか、
などと自問自答しながら作ってます。

開発中なのですが、特徴をはっきりさせておくために、ブログでまとめます。

◆まず、面白くも何ともない普通の特徴から。

  • できるだけ簡単に使えるインターフェース、
  • タイプ(テキスト、メールアドレスとか)を指定すると前もって決めておいたルールに従ってバリデーションする、
  • フォーム入力だけでなく、普通の変数・配列でも適用可能。

とかでしょうか。
こういうのルールベースでのバリデーションとか言うのでしょうか。

◆これだけなら、別に作る必要はないわけで、一応自分なりの理由があって作ってます。ただ、他のValidatorクラスで実現してるか確認してはいませんが。

  1. バリデーション、サニテーション、フィルター、全部入り
  2. ルールの適用順番があらかじめ決まっている
  3. 複数に分割している項目も一つとしてバリデーション可能
  4. 配列入力もバリデーション可能

◆もう少し詳しく説明します。

1.全部入りルール

次のような3種類のルールがあると思うのですが、全部に対応しています。
  • サニテーション:
    ヌルバイトアタック、エンコーディングチェック、を行い、
    問題があれば安全な内容で上書きします。
  • フィルター:
    全角→半角、大文字・小文字変換、その逆、など。
  • バリデーション:
    レギュラーエクスプレッションによるフォーマットチェックなど。

2.ルールの順番を決めてある

まぁ大量のルールがある訳です。
が、例えば日本語だと、大文字→小文字変換を行う前には、全角→半角に変換しないと行けません。こういう順番を意識してルールを適用しても問題がないよう、ルールの順番を内部で持ってます。

3.複数分割項目対応

日付など、一つのデータでありながらフォーム上は複数の項目から成り立っている場合があります。例えば

$_POST = array(
 'date_y' => '2011',
 'date_m' => '11',
 'date_d' => '23',
);

find( $_POST, 'name', array( 'multiple' => array(
 'suffix' => array('y','m','d'),
 'sformat' => '$4d/$02d/$02d',
) ) );

4.配列入力のバリデーション

フォームのチェックボックスからだと、入力が配列の場合があります。
入力が配列の場合でも、それぞれの要素ごとにルールを適用してバリデーションします。またエラーがあった場合は、入力と同じ構造でエラーメッセージを返します。

例えば、数値のみの入力を可能にしている場合、
input: $input = array( 0 => '1', 1=>'3', 2=>'x', 3=>'4' );
error: $error = array( 2=>'not a number' );
という構造でエラーメッセージを作ります。

◆ソースコード

まだ開発中。
Cena-DTA内に組み込む予定なので、それから公開します。
githubにおいてあるので、探せば見つかりますが。

2011年11月19日土曜日

Simple@高円寺、2011/11/19

今日はいつものSimple勉強会@高円寺。
何をしようか考えながら、だらだらとして昼食して・・・

注目のPHPのフレームワーク

いろんなソースコードを読めるようにしようと思い立ち。
いくつか、すごそうな最新のPHPフレームワークなどを選んでみた。

  • Lithium
    CakePHPの人たちが作ってるPHP5.3用フレームワーク。
  • Fuel
    CodeIgniterの人たちが作ってるPHP5.3用フレームワーク。
  • underscore.php
    underscoreというjavaScriptのPHPポート。

コードをみても、追いかけられないorz

macでnetbeansでPHPのデバッグ環境を設定

コードを追いかけられないならデバッガーで追いかける。
MacBookAirにxdebugインストールして、デバッグ環境を整えました。
詳細は、こちらのページで。

で、underscore.phpを追いかけてみた。

が、追いかけられない。
何となくやってることは分かるけど。

staticクラスでメソードチェーンを、実現するため、引数を統一処理して、次のメソードに渡して、それを次々と処理している・・・と思う。が、追いかけきれない。

本当にすごいと思う。けど、
「こういうコードが書けるようにならなくてもいいはず」
と思うようにしよう。

◆Dioのコーディングでも

することにしました。
えぇと、フィルター(サニテーションとかバリデーション)を行うのに無名関数を使うように変更。これで変更しやすくなるはず・・・

と、static変数に無名関数を代入できない・・・
多分、staticなのに無名関数を実行しようとしてエラーなのか。
う〜ん、Lithiumみたいに__initとかで設定するか。

してみた。が、こんなのでいいのか悩む。

MacのbrewでxdebugインストールしてnetbeansでPHPのデバッグ

Simple勉強会@高円寺の作業ログ。

◆xdebugのインストール

マックでライオンでbrew使ってxdebugどうやってインストールするのか検索したが、いい感じのページが見つからず。そんなときは打ち込んでみる。

> brew install xdebug==> Downloading http://xdebug.org/files/xdebug-2.1.2.tgz######################################################################## 100.0%==> phpize==> ./configure --disable-debug --prefix=/usr/local/Cellar/xdebug/2.1.2 --enable==> make==> CaveatsTo use this software:  * Add the following line to php.ini:    zend_extension="/usr/local/Cellar/xdebug/2.1.2/xdebug.so"  * Restart your webserver.  * Write a PHP page that calls "phpinfo();"  * Load it in a browser and look for the info on the xdebug module.  * If you see it, you have been successful!==> Summary/usr/local/Cellar/xdebug/2.1.2: 348K, built in 15 seconds

なんだ。
インストール一発でできたみたい。

◆次はphp.iniの修正。

インストールからのメッセージを読めば書いてある、親切設計。
が、その通りに書いただけではnetbeansからデバッグできなかった。

ちょっとググって、下記のURLから
http://wiki.netbeans.org/HowToConfigureXDebug
これをxdebugのセクションの下にコピー。
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000

これでnetbeansでデバッグできるようになりました。

2011年11月9日水曜日

Chromeのuserスクリプト書いてみた

なんて簡単に・・・
FireFoxでGreacemonkey書いたときは苦労した記憶がある。
まだJavaScriptに慣れてなかったからか、jQueryのインストールに苦労したのか・・・

ともあれ、
JavaScript書く⇒Chromeにインストール
がこんなに簡単なんて。

◆書いたコード:
// ==UserScript==
// @match http://dev.example.com/*
// ==/UserScript==

links = 
  document.evaluate(
    '//a[contains(@href,"http://www.example.com")]|', 
    document, null, 
    XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
for (i = 0; i < links.snapshotLength; i++) {
  links.snapshotItem(i).href = 
    links.snapshotItem(i).href.replace( 
    /\/\/www.example.com/i, "//dev.example.com" );
}


開発サーバー(dev.example.com)を立ち上げたけど、絶対パスでリンクが張ってある箇所が多いので、ユーザースクリプトでリンク先を強制書き直し。

◆上のファイルを自分のPCに保存。

「test-server.user.js」とかにして保存した。

で、Chrome上にドラッグ&ドロップで、ドロップ。

すると、

  • 左下に確認画面(Extensionはコンピュータにダメージ与えるかもしれないけど、続けていい?)が出るので「Continue」を押す、
  • ダイアログウィンドウが出るので「Install」ボタンを押す、
  • で、インストール完了。

何度もやる作業なので、インストールが簡単なのは素晴らしい。


2011年11月8日火曜日

ChromeでGreasemonkey:JavaScriptでリンク先を変更

仕事で使いそうなので。メモ。

◆ChromeでもGreasemonkeyが使えるらしい。
http://internet.watch.impress.co.jp/docs/news/20100202_346437.html

知らなかった~
早速、ウェブページ内のリンクを書き換えるスクリプトを書きたい。

◆が、jQueryが使えないとの話。

まぁこういうスクリプトを入れればよさそうだ。
http://stackoverflow.com/questions/2246901/how-can-i-use-jquery-in-greasemonkey-scripts-in-google-chrome

◆でも、もっとピュアJavaScriptでリンクの書き換えぐらい出来ないのか?

ちょっとググルと、サンプルコードがあった。
http://userscripts.org/topics/1966?page=1

document.evaluateってなんだ!

そんなメソード知らなかった!!!
XPathって言うんだ。。。
うん?「XPath」は聞いたことがある気がする・・・

なんか、とてつもなく、使えそう。
http://www.softel.co.jp/blogs/tech/archives/2067

こちらは、引数について説明が細かくある。
http://deltatech.blog90.fc2.com/blog-entry-332.html

ちょっとしたことでも、jQueryが便利だから使ってたけど、
ピュアJavaScriptでも、かなりのことが出来そう。

2011年11月6日日曜日

gitのbranchを覚える

gitを使うなら、branchを覚えるべきらしい。
なので、勉強がてらにメモ。

◆githubにレポジトリがある状態から

既にgithubでレポジトリを作ってるとして、まずはclone。

git clone git@github.com:asaokamei/test.git

◆ブランチの作成と確認

覚えるのはgit {branch|checkout} コマンド。
これでローカルレポジトリ上でbranchを作成したり、
branchを行ったり来たりできる。

まずはブランチを作成。そして現在のブランチを確認。
> git branch jpn
> git branch
  jpn
* master
新しいブランチ「jpn」に切り替え。そして現在のブランチを確認。
> git checkout jpn
Switched to branch 'jpn'
>git branch
* jpn
  master


◆で、ここからgit gui(笑

軟弱ものなので、gui版を使ってます。
「git gui &」でgui版を走らせます。

すると「現在のブランチ jpn」と出てます。
うまくいってる感じ。

適当にファイルを追加・編集したら
コミットしてプッシュを押すと、「元のブランチ」で
jpn
master

が出た。
「jpn」が選ばれてるのを確認してから、
「リモート:origin」でプッシュ。

githubで確認したら、ちゃんとブランチが切られてできてました。

◆簡単でした。

なんか悩んでましたが、これだけなら簡単ですね。
gui版を使えば、どこにプッシュするかもわかりやすいので、
間違えないですみそうです。

まぁブランチの入門編でしかないですが。