PHPエディタ

私は今日までErogameScapeのスクリプトを書くのにPHPエディタを使っていました。
以前(もう何年も前ですが…)NetBeansやEclipse+PDTを試したことがあったのですが
  1. 重い
  2. 英語
  3. プロジェクトとかよくわからん用語がいっぱい
な感想で、
  1. 1人で開発している
  2. 扱っているファイル数は多くない
  3. javascriptは知らなかった
  4. フレームワーク何それ?な感じだった
  5. PHPエディタの機能で十分だった
  6. 慣れ親しんでいたPHPエディタから乗り換える気力がなかった
等の理由で使いませんでした。

先日、会社の後輩がPHPを学び初めたということを聞いて、最初のとっかかりを教えることにしました。

XAMPPをインストール ← 昔のXAMPPに比べて超使いやすくなっていてびびった
NetBeansをインストール ← 完全に日本語されていてびびった

特にNetBeansには超感動して
  1. 補完機能が素晴らしい
  2. javascriptにもデフォルトで対応、補完やらなにやらしてくれる
  3. HTMLのツリー構造もデフォルトで表示
等、いや…使っている方々には当たり前な機能なのだと思いますが、 PHPエディタでガリガリ書いていた私はカルチャーショックでした。

さっそく家に帰って、NetBeansをインストールして、ErogameScapeのフォルダを指定してプロジェクトを作成したら、まあ、当たり前なんでしょうけど、ちゃんと読み込んでくれて、とても快適な作業環境のできあがりです。

PHPエディタの場合、文法をチェックするには、F5を押してphp.exeを起動してチェックすることになりますが、リアルタイムで文法をチェックしてくれますし、いや、まあ…、当たり前な機能なのかもしれませんが…

もしかして、私のように「昔、IDEを試してみたけと、英語等に挫折して、未だにPHPエディタで書いている」という方がいるのではないかと思って、こうして文書を書いてみます。

その昔、javascriptを学習して挫折、その後、何度もjavascriptを学ぶも挫折、jQueryがでてきて、その簡単さにすごい衝撃を受けたのと同じくらい衝撃をうけました。

会社の後輩がPHPを学び初めて本当によかったです。
こんな機会がなければ、 NetBeansがすごいことになっていることに気がつきませんでした。

WebデザイナーのためのCakePHPビューコーディング入門

WebデザイナーのためのCakePHPビューコーディング入門WebデザイナーのためのCakePHPビューコーディング入門
著者:滝下 真玄
販売元:秀和システム
(2012-03-28)
販売元:Amazon.co.jp
クチコミを見る
WebデザイナーのためのCakePHPビューコーディング入門を読みました。
FuelPHP入門を読んで、作り物にとりかろうと思ったのですが、Codeigniterのようにいつ何があるか分からないので、いつまでも使い続けられそうなフレームワークの方がいいのではないか?と思いました。

小規模の開発ならCakePHPがよさそうな雰囲気だと思いました。
CakePHP2は日本語の書籍がなかったので私にとってハードルが高かったのですが、丁度、CakePHP2 実践入門 (WEB+DB PRESS plus)が出たので、まずCakePHP2実践入門を読みました。
その次にWebデザイナーのためのCakePHPビューコーディング入門を読みました。

感想は、「世の中のWebデザイナーのレベルはこんなに高いのか…」でした。

CakePHP2実践入門はとても素晴らしいのですが、意外に内容があっさりしているので(悪い意味ではなく、後は自分で調べれば大丈夫なくらいの必要十分な内容が書いてあります)、ビューに特化していそうなこの本も読もうかなと思って買いました。

この本の前半はCakePHP2のコントローラー、モデル、ビューについての説明と、簡単なアプリケーションの作成まで、後半はレイアウト、エレメント、ビューの説明、ヘルパーの説明、実際のビューの作成例が書かれています。

前半は、CakePHPをまったく知らない人が読んだら、なんのことだかさっぱり分からずに終わる…と思います。CakePHPで何か作ったことはなくて、CakePHP2実践入門を読んで、「ああ、なるほど、作れそうかな…」と思った程度の私は読んでてすごくつらかったです。

「あー、そう動くんだっけ?」と、たまにCakePHP2実践入門を読み直しました。

後半はリファレンスみたいなものですので、まあ、そんなもんかなという内容です。
レイアウト、エレメント、ビューの説明は、「CakePHPはもともとレイアウトがあってそこにはめこんでいく感じなんだ」ということが分かってよかったです。
ここらへんが、ちょっとCakePHP2実践入門では分かりませんでした。

自分は週末にPHPをいじりはじめて10年くらいになる気がするのですが、Webデザイナーの方々がこの本の内容を普通に読んで把握できるとすると、私はWebデザイナーの方より相当プログラムの分野でも劣っているということだと思います。
つまりErogameScapeくらいのサイトだったら、デザイナーの方々にもさくっと作れるということで、プログラマの方々はいったいどんなスピードでどんなクオリティでアプリを作れるのか想像できないです…

Webアプリケーションで何かヒットするものを作ろうとしても、素晴らしいWebアプリケーションを作れる方がたくさんいるので、相当きついなあと思いました。

これを書いている時点でAmazonに感想が2つあります。以下引用です。
  • 2.0以降はじめてcakeを触る(かつ初心者の)人たちには以下の点から大変お勧めできます。
  • 「Webデザイナーのための」となっていますが、プログラマー向けとしても十分に通用します。
こちらの感想を書かれたのはプログラマの方だと思います。
プログラマの方ってすごいなと思いました…

FuelPHPで自作のClassを格納する場所とその呼び出し方

早川聖司(2012)FuelPHP入門 ソーテック社
FuelPHP入門FuelPHP入門
著者:早川 聖司
販売元:ソーテック社
(2012-06-02)
販売元:Amazon.co.jp
クチコミを見る

には、MでもCでもVでもない自分で作ったClassをどこにおいてどうやって呼び出すか書いていません。
そして、公式のマニュアルを見ても、いまいちよくわからない気がします。
私は…わかるまでひどく時間がかかりました。

googleで「自作 クラス fuelphp」で検索すると、共通処理クラスを作りたい場合にどうしてますか?がでてきて、もう、なんといいますか、質問者の方の意図(私の疑問とほぼ同じ疑問をもっている方です)と、回答している方々の回答がかみ合って無くて、ああ、難しいなあと思いました。

公式のマニュアルはクラス - 概要 - FuelPHP ドキュメントになるのですが、結局どこに自作のclassを置いていいかがわかりませんでした。

多分、同じところでつまづく方がいらっしゃると思うので、記録に残します。

自作のClassの置き場所
 APPPATH/class/の配下
例えば、
 APPPATH/class/test.php

そこに例えば、
<?php
class Test
{
public function a()
{
return "OK";
}
}
と書いて、
 
APPPATH/class/controller/test.php

$test = new test();
var_dump( $test->a() );
と書くと、OKと表示されます。
classのファイルをincludeする必要はなくて、
APPPATH/class/の配下にファィルを規則にしたがったファイル名とclassの名前を規則にしたがって定義すれば、オートロードされます。

ちなみに、 Codeigniterみたいにfunctionををおくための場所はないみたいですので、自分の今までの資産はclassに書き換えることになるのかなと思います。 
 

FuelPHPでPostgreSQLを使う場合のSimpleAuthのDatabase tableについて

FuelPHPでSimpleAuthを使う場合、 ログインユーザーの情報を保持するためのテーブルが必要です。
mysqlだとIntroduction - SimpleAuth - Auth Package - FuelPHP Documentationに書いてある通り以下のようなテーブルの定義になります。

CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `username` VARCHAR( 50 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `password` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `group` INT NOT NULL DEFAULT 1 , `email` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `last_login` VARCHAR( 25 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL DEFAULT 0, `login_hash` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `profile_fields` TEXT CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , `created_at` INT( 11 ) UNSIGNED NOT NULL , UNIQUE ( `username` , `email` ) ) 

Postgresqlの場合は以下のようになるかと思います。

CREATE TABLE test_users (
    id SERIAL PRIMARY KEY ,
    username VARCHAR( 50 )  NOT NULL ,
    password VARCHAR( 255 )  NOT NULL ,
    "group" INT NOT NULL DEFAULT 1 ,
    email VARCHAR( 255 )  NOT NULL ,
    last_login VARCHAR( 25 )  NOT NULL DEFAULT 0,
    login_hash VARCHAR( 255 )  NOT NULL  DEFAULT '',
    profile_fields TEXT NOT NULL,
    created_at INT NOT NULL ,
    UNIQUE (
        username ,
        email
    )
);
GRANT ALL ON test_users TO PUBLIC ;
GRANT ALL ON test_users_id_seq TO PUBLIC ;

※テーブルの名前のデフォルトの設定は、usersです。
 上記のようにテーブルの名前をかえた場合は、APPPATH/config/simpleauth.phpにテーブルの名前がtest_usersであるという設定を書く必要があります。

※GRANTはTO PUBLICになっていますが、それらしいユーザーを設定しましょう。

※ usernameがVARCHER(50)になっていのますが、多分50文字にこだわる理由はないと思います。50文字をこえるユーザー名を設定するユーザーがいたらそれはそれでどうかなーと思いますが。PostgreSQLではVARCHARを使う理由はない(TEXTで良い)とどこかで見た気がしますので、TEXT型でいいかなーと思います。

ポイントは2つあります。
1. 列名groupは予約語なので、"group"すること
2.  login_hashにDEFAULT ''を追加すること

2.でDEFAULTの値を設定しないと、ユーザーの作成の際のINSERTに失敗します。
失敗の要因は「 login_hash」はNOT NULLです、になります。

simpleauth.phpを見ると
$user = array(
'username'        => (string) $username,
'password'        => $this->hash_password((string) $password),
'email'           => $email,
'group'           => (int) $group,
'profile_fields'  => serialize($profile_fields),
'created_at'      => \Date::forge()->get_timestamp()
);
$result = \DB::insert(\Config::get('simpleauth.table_name'))
->set($user)
->execute(\Config::get('simpleauth.db_connection'));
と書いてあります。
login_hashの列がないので、 login_hashにDEFAULT ''を追加しないと駄目です。

※MYSQLの場合は、NOT NULLの列にデフォルトの値が入っていなくても、空文字が挿入されるのかなあと想像します。

※AuthパッケージはemailアドレスがかぶるとユーザーIDの登録ができないようになっています。
 サービスにもよると思いますが、emailがかぶっていても登録できた方がいい場合もあるので(ErogameScapeのように気軽にユーザーIDを取得して情報を登録できるようなサイトな場合)、必要に応じてソースをいじってみてもいいかなと思います。

動くかどうかを確かめた結果が以下のような感じです。
ユーザーの作成
$auth = Auth::instance();
$auth->create_user("uid","passweord","mail@mail.co.jp");
すると、
 ap2=# SELECT * FROM test_users ;
 id | username |                   password                   | group |      email      | last_login | login_hash | prof
ile_fields | created_at
----+----------+----------------------------------------------+-------+-----------------+------------+------------+-----
-----------+------------
  1 | uid      | xvBIQwcBRf0+l56uTmeAVM3MqfkI8w5jfD3VF6mJ59k= |     1 | mail@mail.co.jp | 0          |            | a:0:
{}         | 1348325469
(1 行)

ログイン
$auth = Auth::instance();
if( $auth->login("uid","passweord") )
{
var_dump("OK");
}
すると、
ap2=# SELECT * FROM test_users ;
 id | username |                   password                   | group |      email      | last_login |                lo
gin_hash                | profile_fields | created_at
----+----------+----------------------------------------------+-------+-----------------+------------+------------------
------------------------+----------------+------------
  1 | uid      | xvBIQwcBRf0+l56uTmeAVM3MqfkI8w5jfD3VF6mJ59k= |     1 | mail@mail.co.jp | 1348325657 | 83843e97111e17d36
62cd7148d7c9ce3f6a2b83c | a:0:{}         | 1348325469
(1 行)
last_loginに時刻、login_hashにハッシュ値 が入ります。

ログイン中かを確認
if( Auth::check() )
{
var_dump(Auth::get_screen_name());
}
では、特にDBの内容はかわらなくて、
$auth = Auth::instance();
$auth->logout();
 ログアウトしても、DBの内容はかわらないです。

再度ログインすると
UPDATE "test_users" SET "last_login" = 1348496738, "login_hash" = 'cb94453fab5e4e05ab012457c167879e95de6e22' WHERE "username" = 'uid'
なクエリが実行されて、 last_loginの時刻、login_hashのハッシュ値 が書き換わります。

 

 


FuelPHPでPostgreSQLを使う場合のdb.phpについて

FuelPHPはPostgrSQLが非標準だそうです。
 → PHPカンファレンス 2012 フレームワークアップデート

でもPDOドライバ使えば特に問題なく(と思っています…)使えます。
マニュアルの通りテーブルを作ってAuth パッケージがちゃんと動くことを確認しました。

※ネイティブのドライバがないことのデメリットが自分には分かりません…PDOを介すと遅いとかあるのでしょうか…

PostgreSQLにPDOドライバで接続するためのdb.phpの書き方はマニュアルに書いてある通りで
'production' => array( 'type' => 'pdo', 'connection' => array( 'dsn' => 'pgsql:host=localhost;dbname=fuel_db', 'username' => 'your_username', 'password' => 'y0uR_p@ssW0rd', 'persistent' => false, ), 'identifier' => '"', 'table_prefix' => '', 'charset' => 'utf8', 'enable_cache' => true, 'profiling' => false, ), 
のようになります。

さて、「PostgreSQL fuelphp pdo」で検索するとFuelPHP、PDO、Postgresで実験。 : 生存戦略 しましょうかのページが引っかかります。

ここに、 identifier は
'"' ←ダブルクオーテーション(")をシングルクォーテーションで囲う
または
'' ←空にする
と書いてありますが、マニュアルの通り'"'が正解かなと思います。

大抵の場合、''で問題ないのですが、 列名に予約語…たとえばtimestampだったりgroupだったりする場合、列名を"で囲わないといけないので、'"'が正解だと思っています。

Authパッケージを使う際には、groupという名前の列を持つテーブルを作成しないといけないので、そこではまります。 

FuelPHP、PDO、Postgresで実験。 : 生存戦略 しましょうかのページ では、その後に、mb_convert_encodingでSJISからUTF8に変換しないと日本語の挿入でエラーがでたと書いてありましたが、これは…どこかの設定がSJISなんじゃないかなと思います。私の環境では、 mb_convert_encoding は特にいりませんでしたし、いらないと思います。

また、 マニュアルにがちょっといけてなくて、「データベースの設定ファイルは APPPATH/config/db.php にあります」と書いてあるので、そのdb.phpを編集するとNGです。
APPPATH/config/development/db.php、 APPPATH/config/production/db.php、もそれなりに書き換えてあげないとNGです。

APPPATH/config/db.phpをちゃんとPDOドライバで書いているのに、なぜかmysqlで接続しようとしていて、なぜかと思ったら、そういうことでした。

※Fuelphpは、設定が上書きされていきます。 APPPATH/config/db.php とAPPPATH/config/development/db.php に同じ項目があった場合、APPPATH/config/development/db.php の設定で動きます。

早川聖司(2012)FuelPHP入門 ソーテック社には、ちゃんと APPPATH/config/development/db.php を変更しますと書いてあるのですが、マニュアルの通りにやってすっかりはまりました…




 


記事検索