PHPのRuby on Railsクローンのフレームワーク Akelos PHPをいじってみた出来事のメモ。

Akelosをいじってみるメモ帳

Akelos PHP Blogチュートリアル一覧(全18記事)
Akelos PHP ユーザ認証チュートリアル一覧(全19記事)

2008年09月05日

Blog screencast チュートリアルのコメント表示が出来ない問題

Akelos-jaのメーリングリストでも話題に出ていますが、Akelos公式サイトのBlogチュートリアルの動画(Screencast)でコメント表示の所の挙動が確かに謎。

今回私が書いたチュートリアルでは明示的にincludeを書いて先読み動作させていますが、果たしてこれで正しいの?

動画チュートリアルにあるように何も書かないで行けるパターンってあるんですかね?


「Akelos Blogチュートリアル 17.コメント機能を追加する 表示、反映の仕組みなど追加」より

続いて、読み出しの指定を書きます。show()アクションが書いてあるところを探してください。
下記のようになっているはずです。
-------------------------------------------------------
function show()
{
$this->post = $this->Post->find(@$this->params['id']);
}
-------------------------------------------------------
となっているところを

-------------------------------------------------------
function show()
{
$this->post = $this->Post->find(@$this->params['id'],array('include'=>'comment'));
}
-------------------------------------------------------
と書き換えてください。末尾のところがポイントです。何を取り込む(include)するかを指定します。

タグ:雑記 akelos
posted by AMUAMU at 12:15| Comment(1) | TrackBack(3) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年09月01日

Akelos AkActionMailerのバグ解決

AkelosのAkActionMailerは特定のメールアドレスの場合、メール送信出来ない場合がある。

その特定のメールアドレスというのは"-"を含んだアドレス。
具体的には so-net.ne.jp だとアウト。

かなり痛いバグだ。
まぁ、リリースされたばかりだし、しょうがない。
後日本家にフィードバックしたいが、二通りの解決方法を見つけた。

まず、本来の解決方法
→取りあえず本体をいじって解決

akelos\lib\AkActionMailer\AkMailMessage.php
のsetRecipientsメソッド
function setRecipients($recipients)
{
// $this->recipients = join(", ", (array)Ak::toArray($recipients));
$this-<recipients = join(", ",(array)$this->_recipientsArray($recipients)); $this->setHeader('To',$this->getTo());
}

function _recipientsArray()
{
$args = func_get_args();
return is_array($args[0]) ? $args[0] : (func_num_args() === 1 ? $this->_recipientsToArray($args[0]) : $args);
}

function _recipientsToArray($string)
{
$args = $string;
if(count($args) == 1 && !is_array($args)){
(array)$args = array_unique(array_map('trim',array_diff(explode(',',strtr($args.',',';|',',,,')),array(''))));
}
return $args;
}


と、_getMessageHeaderFieldFormatedも修正が必要

function _getMessageHeaderFieldFormated($address_header_field)
{
$charset = empty($this->charset) ? AK_ACTION_MAILER_DEFAULT_CHARSET : $this->charset;
// return join(", ",AkActionMailerQuoting::quoteAnyAddressIfNecessary(Ak::toArray($address_header_field), $charset));
return join(", ",AkActionMailerQuoting::quoteAnyAddressIfNecessary($this->_recipientsArray($address_header_field), $charset));
}



これで、問題は完全に取り除かれる。ただしスマートじゃないですね・・・
//でコメントアウトしてるところが問題のポイント
Ak::toArray() を使ってるんだが、こいつが-もarrayに分けちゃうって問題だと思う。
なので、Ak::toArray()の-を分けない関数として_recipientsArray()とrecipientsToArray()を作って、こいつに投げている感じです。


第二の解決法

メールアドレスの指定を
$this->setRecipients(array($User->email));
とする。

とっても簡単。でもtrimとか複数アドレスの分割とかしてくれないのが問題。スパム対策としてもオススメできないのかな?脆弱性がある気がする

まぁ、でもスマートに解決できるってのはある。

第二の解決法はちょっと、本当にこれでいいのか自信ないなぁー・・・
タグ:akelos
posted by AMUAMU at 19:24| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年08月24日

AkObjectのlogメソッドは機能しないから直す

AkActiveRecordなど主要なクラスの基本クラスとなっているAkObjectクラス。

これには log というメソッド(関数)があるんだが、これが機能しない。

バグかな?

とりあえず、下記のようにして直してみた。
コメントアウトしているところが、元のコード。太字が足したところ。

AkObject.php内
function log($message, $type = '', $identifyer = '')
{
// require_once 'Log.php';
// $ident = empty($ident) ? 'main' : $ident;
//
// $log = Log::singleton('file', AK_LOGS_DIR.DS.$ident.'.log',$ident);
// $log->log($type, $message);

$logger =& Ak::getLogger();
$logger->log( empty($type) ? 'debug' : $type ,$message);

}
タグ:akelos
posted by AMUAMU at 00:52| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年08月23日

DEBUG用メモ:DBへのSQLクエリーの結果確認る

データベースへのSQLクエリーの発行内容は、デバッグフラグを立てておけば、標準でdevelopment.logに出る。

しかしながら、このSQLはPEARのADODBに渡す形式のSQLである。

SQLが正常に動いているかどうかをデバッグしたい場合にはさらに、どのような引数を付けているか、SQLの結果の生の状態はどんな風になっているかを確認しないと辛いときがある

そこで、デバッグ出力を足してみる
\lib\AkActiveRecord\AkDbAdapter.php

executeメソッド内(220行前後 [8/23現在最新のソースコードで])
の .... $this->connection->Execute(... が含まれている行の前後に以下を足して、ログで確認できるようにしてみた


$this->_log($message.'(bindings): '. empty($bindings) ? '' : print_r($bindings ,true));
$result = isset($bindings) ? $this->connection->Execute($sql_string, $bindings) : $this->connection->Execute($sql_string);
$this->_log($message.'(result): '. print_r($result,true));

前後の太字の部分が足したところ
これで、SQLの前後の中身がまるまるdevelopment.logに出る。

複雑なSQLのデバッグ時には役に立つんじゃないかな?

(8/24修正)
$bindingsが空だった場合が想定されてなかったので、ちょっと修正した
タグ:tips DEBUG
posted by AMUAMU at 23:41| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年08月19日

AkActiveRecordの挙動が・・・&ActionMailerがおかしい?

色々確認をしていると、2つほど問題が発生して時間食ってる。
取りあえず寝る為にメモ代わりに・・w

1.AkActiveRecordの挙動がいまいち不安定で、動作確認に時間がかかるぅ・・・
findFirstBy に ('email',$email) とか引数を与えると
findFirstBy -> findBy -> find -> _findInitial -> _findEvery -> findBySql -> $this->_db->select [AkDbAdapterへ] -> execute -> $this->connection->Execute [PEARのADODBライブラリへ]

という感じで、呼び出される。

本来このPEARのADODBライブラリのExecuteメソッド
Execute($sql,$inputarr=false)

に対して
$sql = "SELECT * FROM users WHERE users.email = ? LIMIT 1"
$inputarr = Array( [0] => hoge@hogehoge.jp )

というふうにAkDbAdapter等で展開されて渡されて、正常にSQL文が実行されるはずなんだけど、なーんか動作が不安定。
SQL文は正常に生成できてるんだけど
$inputarr = Array( [1] => hoge@hogehoge.jp )

とかって、なんか配列展開中のarray_shiftがうまく行かないのか、配列が2番目(配列番号1)とか変なところに入る事がある。
試行錯誤してると、いきなり治ったりするからタチが悪い。
Apache再起動しても治らないのに、デバッグ用に出力コード入れただけで治ったりとか、もう、なんなんだいったいw
Akelosってより、Windows環境のPHPが不安定なのか?????

致命的な問題に繋がる事じゃないし、良いんだけど、
デバッグで時間食う・・・・・
Akelosが悪いわけじゃないっぽいんだけど、いまいち・・・
ソースコードを追っかける限りは問題無さそうだしなぁ・・・

とりあえず、今は正常に動いているので解決。
これが解決したので今日は終わり。

2.そして、残ってるのがActionMailerがおかしい?ってかんじのところ
具体的には、メールアドレスとして abc@aa1.so-net.ne.jp というアドレスを入れると、何故か「 - 」でアドレスが分割されて、Toが2つになって、SMTPサーバに送られる。
RCPT TO:<abc@aa.so>
RCPT TO:<net.ne.jp>

とかって、SMTPサーバ側の受信ログで2つのアドレスに分割されているところまで、確認した。
AkActionMailerクラスのrecipients(Mail.phpのrecipientsそのままっぽいんだけど)には正常なアドレスで格納されている事は確認した。

Akelosが悪いのか、Akelos付属のPEARのMail.phpの問題なのかなぁ・・・?
とりあえず、明日(というか今日だろうけど)はこれを追っかけよう。

あとちょっとなんだ、あとちょっと。
文は全部書けているんで、ここらの確認が済めば、再校正をすれば完成なんだけどなぁ、チュートリアル。

まぁ、でも、こういうデバッグとか調査は楽しいw(まぞ?
タグ:雑記
posted by AMUAMU at 04:58| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年08月18日

あーとちょっとぉー

Akelosチュートリアル、認証機能追加編
あとちょっとだぁ

暇を見つけて少しずつ最終確認中でする
タグ:雑記
posted by AMUAMU at 23:37| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年08月14日

ActionMailer問題解決

メールプロパティの渡し方がまずかったようだ
委細は後日の記事で

問題は解決したので、細かいところの最終確認中
FindBy周りの挙動を精査してるところ。
何が最適なのか、サニタイジング大丈夫なのかをコード全部読んで確認しないと不安なんでw
タグ:雑記
posted by AMUAMU at 09:18| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年08月13日

AkActionMailer、少々苦戦中

正しく使ってるつもりなんだがなぁ。。。
なんかエラーが出る。

明日原因を追ってみよう


Notice: Undefined property: AkMailMessage::$recipients
in C:\xampp\htdocs\akelos\lib\AkActionMailer
\AkMailMessage.php on line 50

Warning: Invalid argument supplied for foreach() in C:\xampp\htdocs\akelos\lib\AkActionMailer
\AkActionMailerQuoting.php on line 111

Warning: join() [function.join]: Invalid arguments passed in
C:\xampp\htdocs\akelos\lib\AkActionMailer
\AkMailMessage.php on line 127

Notice: Undefined property: AkMailMessage::$subject in
C:\xampp\htdocs\akelos\lib\AkActionMailer
\AkMailMessage.php on line 121

Warning: mail() [function.mail]: "sendmail_from" not set
in php.ini or custom "From:" header missing in
C:\xampp\htdocs\akelos\lib\AkActionMailer\AkMailDelivery
\AkPhpMailDelivery.php on line 16

タグ:雑記
posted by AMUAMU at 04:08| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年08月12日

ActionMailer来たんで再開しよう

ActionMailerの実装がされたので、再開予定
タグ:雑記
posted by AMUAMU at 15:19| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年06月18日

メール処理

v0.9に入る予定のActionMailerを使うか
それとも独自で組むか

AkelosのActionMailerのクラスに関してはsvnで引っ張ってこれるんですよね
ただしRailsのようなgenerate mailerは無いようだ

チュートリアルは、ここを今、悩み中で遅れ中・・・
タグ:雑記
posted by AMUAMU at 10:59| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年06月13日

Akelosでユーザ認証、執筆中

Akelosユーザ認証チュートリアルを、かなりまともな形で執筆中
あと1〜2日で完成するかなぁ・・・

説明を加えるべきメソッドとか多くて、思ったより時間が掛かる;
Railsのユーザ認証の説明を元にしてるんだけど・・・

自分のAkelosの勉強にもなるのでついつい、フレームワーク側のコードを読み入ってしまうww

Railsのattr_accessorや、attr_protectedとの互換機能あたりの実装は面白い。

さぁ、がんばろう。
酒飲みながらだが!!!wwww
タグ:雑記
posted by AMUAMU at 23:23| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年06月11日

Akelosの立ち位置

Akelosの立ち位置が微妙な気がしたんでちょっと考えてみたんだけど、フレームワークとしての位置づけの仕方がダメな気がする。

ネットで書かれているのを見ると
1.Ruby on RailsクローンのPHPのフレームワーク
2.CakePHPより良いんじゃね?

という感じが多く、2つの視点でよく書かれているけど、
それじゃあユーザが増えない気がするんだよなぁ・・・

だって、
・クローンである以上、RoRを越えていく というイメージが無い
・CakePHPは歴史が長いだけあって情報が多い、安定している、機能が多い

って反論が出るわけだし

自分が思うに、
・Railsは聞いたことがあるし、良いと騒がれているけど、触ったことなんて無いよ!
・Rubyを覚えるのだるい
ってPHP使いの人は結構多いんじゃないかなー・・・

こういう人でフレームワークに興味がある人はCakePHPなりEnthaなりを触ったことあるだろうけど、やっぱりRailsのほうが話題だし・・・って感じの人多そう。

そういう人に、従来の視点とは逆で、PHP使いの人へ、RoRへの橋渡しとしての立ち位置としてAkelos PHPを勧めるってのはダメなのかな?

1.PHP -> Ruby -> Rails は、言語が変わるところで挫折
2.PHP -> CakePHP ->Rails(Ruby) は、CakePHPの癖が強いから障壁高い
3.CakePHP -> Akelos は、同じPHPだし、問題ない
4.PHP -> Akelos -> Rails(Ruby) は、RoRと思想が似てるので障壁低い
5.Rails-> Akelos は、Rails使いの人にメリットがあるのってレン鯖利用ぐらいだよね・・・

3はCakePHPのほうが機能が多かったり情報が多いという前述の理由で、乗り換える理由としては、CakePHPに不満がある人に絞られるよね
新たに覚える事多いし

となると、4が一番ありえそうなシナリオな気がするんだけど

フレームワークをあまり使いこなしていない、Railsが対岸の出来事ってかんじの普通のPHP使いにAkelos PHPをわからせるってのが一番ありえそうなシナリオ。
でも日本語情報が薄いから普及しないって感じですか?

せっかくの多言語対応がベースから出来ているAkelosはすごい良いと思うんだけどなー
タグ:akelos 雑記
posted by AMUAMU at 18:17| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

2008年06月10日

validate回りを追っていて

Akelosのvalidate周りの処理を追ってたら
なんか楽しくなってきた

validate後のエラーメッセージの処理って正確に動いていない気がするが・・・俺の気の性かなぁ

とりあえず、やっぱコードを追うのは頭フル回転して楽しいな・・・
タグ:雑記
posted by AMUAMU at 23:09| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

ADOdbの書式とは完全互換ではなさそう

Akelosのマイグレーションファイルでのテーブル定義はADOdb Data Dictionaryに準ずるとマニュアルに書いてあるけど、通らない書式もあるようだ。

気付いたのはカラム属性指定のDEF指定。

ADOdbの書式では、"DEF"は"DEFAULT"のシノニム つまりDEFAULTと同じ意味ということだが、その通りにならない。

Akelosのマイグレーションファイルで下記のように指定してみた

$this->createTable('users',
'id,' .
'name C(30) NOTNULL,'.
'view I(1) NOTNULL DEF 0 INDEX,');


と指定してみると

CREATE TABLE users (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
view INTEGER(1) NOT NULL DEFAULT 'DEF',
created_at DATE NOT NULL,
updated_at TIMESTAMP NOT NULL,
PRIMARY KEY (id)
)TYPE=InnoDB

という、DEFAULT 'DEF' とか意味不明な展開になる。


なので、
$this->createTable('users',
'id,' .
'name C(30) NOTNULL,'.
'view I(1) NOTNULL DEFAULT 0 INDEX,');


と指定すれば問題ない

CREATE TABLE users (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(30) NOT NULL,
view INTEGER(1) NOT NULL DEFAULT '0 ',
created_at DATE NOT NULL,
updated_at TIMESTAMP NOT NULL,
PRIMARY KEY (id)
)TYPE=InnoDB


というSQLになる。
これは正常に通るSQL文だが、なんかDEFAULT値の部分に'0 'とスペースが入ってるのが気になるなぁ・・・
怪しい・・・

これはバグなのかなぁ・・・仕様とも言えるレベルだが。
AkInstaller.php 内の処理を追えばすぐわかるだろうけど
原因を負うほどの時間はなっしんぐー

Akelos Memo様でも DEF は使えると書いてあるが・・・
環境によっては通るんですかねぇ・・・?
posted by AMUAMU at 15:11| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

テーブル作成時の文法ミス

マイグレーションしてみると、だーってエラーが出る。
というか、自分がミスった

$this->createTable(
'tbl_test',
'id I(11) NOTNULL AUTOINCREMENT PRIMARY,'.
'name C(240) NOTNULL INDEX'.
'description X'.
);

こういうコードがあったとき、これ、nameの設定の後に "," を入れ忘れてるんだよね

だーってエラーが吐かれて
Fatal error: Could not create or alter table users using the SQL
とうまくいかなかったSQLコードが出てくる。

まぁ、もちろん通るわけ無いし、この表記の文法チェックなんかしてくれるわけないわけで
こんぐらいのミスはするなってことですがw

まぁ、よくありそうなケアレスミスってことで
posted by AMUAMU at 14:22| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

マイグレーションのデータ型

マイグレーションのときにデフォルトで設定されるデータ型は下の一覧だけのようだ

AkInstaller.php にコメントで書いてあるものと、その中のコード_getColumnsAsAdodbDataDictionaryString()のコードを見て、軽く確認してみた。

id = Integer not null auto_increment primary_key //おきまり
xxxx_id = integer index //参照用ですね
xxxx_by = integer index //_idの代わりにも使えるようだ
description = text
content = text
body = text
position = integer index //位置用? flagチックな使いかた想定なのかな?
xxxx_count = integer default 0 // これはカウンタ用?
lock_version = integer default 1 // これはバージョン管理想定かな
xxxx_at = datetime //日付+時間用 updated_atならtimestampとかのほうが楽なのに、MySQL依存だったか
xxxx_on = date // 日付のみ 
is_xxxx,has_xxxx,do_xxxx,does_xxxx,are_xxxx = boolean not null default 0 index // これは有効フラグとか用を想定ですね
*xxxxxx // 頭に * を付けると言語毎のフィールドが用意されるようだ。どっかのBlogでも書いてあった気がする。詳細はそっちに譲ろうw
その他の名前 = string = varchar(255)

名前が一致しないとvarchar(255)ってことは、結構容量食うし、DB設計が適当だと重いですね

あと、設定しないと created_at と updated_atは自動的に全部につくっぽい???
細かい挙動は追って確認しよう

実際の使用に耐える使い方をするなら手動で全部データ型を書くしか無いかな
こちらとか参考にしながら設定しよう
http://akelos.cann.in/wiki/%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3

なんかルールをオリジナルでたくさん足したくなるなぁ
name = varchar(20) とか
passwd = varchar(45) とか、※ハッシュ利用前提
タグ:akelos 設定
posted by AMUAMU at 13:59| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

Akelos勉強中

とりあえず、Akelosの日本語の情報源はまだまだ少ないようだし、気付いたこととかあれば、メモしていこう。

取りあえず、インストール
Linux環境、レンタル鯖と、XAMPP for Windows環境の3つでやってみた。
これは、そこらに転がっているネットの情報通りでだいたい行けたっぽい。

ちょっとレンタル鯖とLinux環境はひっかかるところがあったので、後日書こうかな。
とりあえず勉強がてら触るためにXAMPP for Windowsのほうで開発を進めてみる。
posted by AMUAMU at 13:33| Comment(0) | TrackBack(0) | Akelos | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。