WEBアプリケーション研究室 開発ノート TOP

WEBアプリケーション研究室 開発ノート 2008年12月

スポンサーサイト

-------- --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

    このエントリーをはてなブックマークに追加

admin generatorのテーマを作るとき、~/data/generator/sfPropelAdmin/gomo/template以下のactionsとtemplatesに雛形を作るのですが、この雛形はページが表示されるとき実行されてそれぞれページ用のcacheディレクトリにキャッシュされます。
その際これらのファイルはsfPropelAdminGeneratorとして実行されます。
つまりこれらのファイルの中で$this->の形でsfPropelAdminGeneratorのメソッドが使えるということになります。
例えばOMクラスAreaのページをadmin generatorで作ったとします。


symfony propel-init-admin --theme=gomo sys area Area

この時template/actions/actions.class.phpでAreaの全てのカラムを取得したかったら

$columns = $this->getTableMap()->getColumns()

で取得できます。
sfPropelAdminGeneratorをたどって行けば使えるメソッドは大体わかると思います。
[symfony 1.1.6]

    このエントリーをはてなブックマークに追加

フィルター上でアクションのインスタンスを取得したいと思ったのですが、ちょっとだけてこずったので書いておきます。


$action = sfContext::getInstance()
->getActionStack()
->getLastEntry()
->getActionInstance();

ActionStackを使うところがミソでしょうか。
[symfony 1.1.6]

    このエントリーをはてなブックマークに追加


//debugモードかどうか
var_dump(sfContext::getInstance()->getConfiguration()->isDebug());
出力
bool(true)

//現在の環境
var_dump(sfContext::getInstance()->getConfiguration()->getEnvironment());
出力
string(3) "dev"


[symfony 1.1.6]

    このエントリーをはてなブックマークに追加

このプラグインは本家にアップしました。名前もgmPackageXmlBuilderPluginに変更しました。
今後こちらはアップしません。
新しいほうをご利用ください。

GmPackageBuilderPlugin


pluginのpackage.xmlを自動で生成するtaskを作ってplugin化してみました。
ためしにUPしてみますので使用してみてください。

インストール方法は以下の3つの方法があります。
1.symfony plugin-install でURLかアップしたアーカイブを指定。

symfony plugin-install /path/to/GmPackageBuilderPlugin-1.0.3.tgz
あるいは
symfony plugin-install http://symfony.gomo.jp/plugins/GmPackageBuilderPlugin/GmPackageBuilderPlugin-1.0.3.tgz

2.ここからダウンロードして、pluginフォルダに入れる。
3.GmPackageBuilderPlugin/lib/task/gomoBuildpackagexmlTask.class.phpをtaskフォルダにアップ。

PEARのPEAR_PackageFileManager2を使用します。PackageFileManagerに含まれていますので、入ってなかったらインストールしてください。

pear install PEAR_PackageFileManager

pearコマンドを使えない環境のときはPEARをFTPなどで上げて設定ファイルでパスを指定してやれば使えると思います。

まず、helpを見てください

symfony help gomo:build-package-xml

versionやstabilityやnotesなどをオプションで指定し最後にplugin名を指定します。
-oオプションはファイルを出力するか、画面に表示するかのオプション名でdefaultは画面出力のみです。ファイルを出力するときは
-o f
を指定してください。

symfony gomo:build-package-xml -o f -A 1.0.0 -R 1.0.0 -a stable -r stable MyPlugin

インストールされたフォルダplugins/GmPackageBuilderPlugin/config/にサンプルの設定ファイルがあります。
グローバルセッティングはsymfony_root/config/にコピーします。
※設定ファイルの名前を変更しました。(1.0.2)

cp GmPackageBuilderPlugin/config/gm_plugin_package_builder.yml.sample symfony_root/config/gm_plugin_package_builder.yml

pluginごとのローカルセッティングは各pluginのconfig/builder.ymlにコピーしてください。
設定どっちにも書けますが、プラグインごとの方が優先されます。
内容は大体見ればわかると思いますが、ざっとこんな感じです。

builder:
make_backup: on
バックアップを作るか?
pear_path: /usr/local/php/lib/php
PEARのパス

config:
symfony:
channel: pear.symfony-project.com
min: 1.1.0
max: 1.1.6
exclude: ~
依存するsymfonyのバージョン

name: Name
user: User name
email: user@example.com

license: MIT License
license_uri: ~
ライセンス

php: {min: 5.1.0}
pearinstaller: {min: 1.4.1}

summary: ****summry****
description: ****description****

dependencies://依存するパッケージ
-
type: require
name: PEAR_PackageFileManager
channel: pear.php.net
min: 1.6.3
max: ~
recommended: ~
exclude: ~
providesextension: ~
nodefault: ~
-
type: require
name: TEST_OPTION
channel: pear.php.net
min: 1.0.0
max: 1.0.5
recommended: ~
exclude: ~
providesextension: ~
nodefault: ~
-
type: optional
name: URL_TEST
uri: http://www.yahoo.co.jp/
providesextension: ~
nodefault: ~

pear_options:
PEAR_PackageFileManager2::setOptions()の引数にarray_mergeされます。


あんまり必要ないかもしれませんがコンソールのオプションも指定できます。
configファイルにオプションを書いても、コンソールでオプションを付けた場合はコンソール側が優先されます。
console:
api-stability: stable
release-stability: stable
api-version: 1.0.0
release-version: 1.0.0
notes: ------

迷ったのですがPEARコマンドが使えないことを想定してPEAR_PackageFileManagerをdependenciesに指定しませんでした。
何か不具合、要望、ご意見などいただけたらうれしいです。
MITライセンスです。

Change Log
1.0.3 'が'に変換されたままになっていたので修正
1.0.2 configファイルのファイル名を変更。PEARの問題だと思いますが、PEAR_PackageFileManager_fileをrequireしなくなってエラーが出ていた。
1.0.1ディレクトリの区切り文字を'/'→DIRECTORY_SEPARATORに変更

[symfony 1.1.6]

    このエントリーをはてなブックマークに追加

ymlファイルを読んで解析するには


$test = sfYaml::load('menu.yml');

で、取得できますが、これだとリクエストの度に解析をするので非効率です。
config/app.ymlなど、symfonyデフォルトの基本的な設定ファイルは解析結果をPHPのコードとしてキャッシュするようになっているので、そのシステムをうまく利用することが出来ます。
まず、設定ファイルを解析してPHPのコードに変換後保存するハンドラーを指定してやります。
app/config/config_handlers.ymlを作成して以下のように設定します。
ハンドラは独自に作成できますが、sfConfig::getで取得するだけなら、既存のsfDefineEnvironmentConfigHandlerを使えます。

config/menu.yml:
class: sfDefineEnvironmentConfigHandler
param:
prefix: menu_

そしてymlからのデータを使う前にキャッシュをincludeしてやります。
当然ですがキャッシュがなければ作ってくれます。

include(sfContext::getInstance()->getConfigCache()->checkConfig('config/menu.yml'));
$menu = sfConfig::getAll('menu_category');


[symfony 1.1.6]

    このエントリーをはてなブックマークに追加

たいして複雑じゃないといわれそうだがちょっとてこずったので書いておきます。
作りたかったのは下のような配列


[menu_category] => Array
(
[0] => Array
(
[title] => エリア
[items] => Array
(
[0] => Array
(
[title] => 地方
[uri] => region/list
)
[1] => Array
(
[title] => 都道府県
[uri] => prefecture/list
)
[2] => Array
(
[title] => 駅
[uri] => station/list
)
[3] => Array
(
[title] => 路線
[uri] => line/list
)
)
)
[1] => Array
(
[title] => 業種
[items] => Array
(
[0] => Array
(
[title] => 業種
[uri] => category/list
)
)
)
)

-の用法を完全に勘違いしていて、てこずりまいした。

all:
.menu:
category:
-
title: "エリア"
items:
- {title: "地方", uri: region/list}
- {title: "都道府県", uri: prefecture/list}
- {title: "駅", uri: station/list}
- {title: "路線", uri: line/list}
-
title: "業種"
items:
- {title: "業種", uri: category/list}


[symfony 1.1.6]

    このエントリーをはてなブックマークに追加


public function executeIndex()
{
echo " Hello, World!
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
";
return sfView::NONE;
}

でも良いけど

public function executeIndex()
{
return $this->renderText(" Hello, World!
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。
");
}

の方がスマートかな。

[symfony 1.1.6]

    このエントリーをはてなブックマークに追加

マニュアルを読めば載ってるのですが良く忘れるのでまとめておきます。
例えばeditアクション内で


return sfView::ERROR;
→editError.php

return 'MyResult';
→editMyResult.php

こんな感じでaction名+返した名前のphpが呼ばれます。
action名無で特定のテンプレートを呼び出したいときはsetTemplateでテンプレート名をセットしてやります。

$this->setTemplate('myCustomTemplate');
→myCustomTemplateSuccess.php


[symfony 1.1.6]

    このエントリーをはてなブックマークに追加

テスト・勉強用に自宅にサーバーを立ち上げてるのですが、最近、「なんか重いな~」と思ってtopで確認したところlogrotateが300分以上CPUを占有したままずっと動いてるのに気づきました。
ちなみにCentOS5です。
とりあえず、KILLでプロセスを止めてみましたが、毎晩同じことを繰り返してしまうので、どこで躓いてるのか実行して確認してみたところ


/usr/sbin/logrotate -dv /etc/logrotate.conf



reading config info for /var/log/wtmp

のところで固まってました。この辺が原因かと思いいろいろ設定をいじってみましたが、/var/log/wtmpの設定を消してみても、その一個前の

reading config info for /var/log/yum.log

つまり、一番最後のところでこけてるのを発見しました。
某巨大掲示板で「アップデイトかけてみろ」とアドバイスを頂き

yum update

やってみましたが、logrotateのアップデイトは無。他との相性的な問題もあるかもしれないので一応かけてみましたが改善しませんでした。
最後の手段?で一度logrotateを削除、入れなおしてみたところ無事に動くようになりました。

yum remove logrotate




=============================================================================
Package Arch Version Repository Size
=============================================================================
Removing:
logrotate x86_64 3.7.4-8 installed 55 k
Removing for dependencies:
conman x86_64 0.1.9.2-8.el5 installed 295 k
ppp x86_64 2.4.4-1.el5 installed 865 k
rp-pppoe x86_64 3.5-32.1 installed 249 k
wvdial x86_64 1.54.0-5.2.2.1 installed 268 k

Transaction Summary
=============================================================================
Install 0 Package(s)
Update 0 Package(s)
Remove 5 Package(s)

Is this ok [y/N]:



yum install logrotate

依存でPPP関係のデーモンを幾つか消したみたいです。インストールするときは特に出なかったし、つかわなそうなので入れませんでした。
何かファイルが壊れていたんですかね。まあ、解決してよかったです。

    このエントリーをはてなブックマークに追加

特にアップデートをかけた記憶はないのですが


console.info('foo');

をやると
console is undefined
とエラーが出て動かなくなりました。
この辺のブログでそれらしいのが報告されてますが、根本的な原因はよくわかりませんでした。(英語勉強中です。すいません。)
ですが、とりあえず回避する方法は見つけました。

window.loadFirebugConsole();

をすると使えるようになります。

    このエントリーをはてなブックマークに追加

ActionScript 3.0 アニメーションActionScript 3.0 アニメーション
(2007/10/30)
Keith Peters

商品詳細を見る
三角関数などを駆使してスクリプトによるアニメーションのテクニックを紹介している。三角関数なんて全然忘れていても大丈夫。3Dの動きもある。スクリプトによる表現力がぐっとアップします。
学生の頃数学は苦手で、三角関数を勉強したとき、「こんなものなんの役に立つんだよ」って思ったけど、フラッシュを使って教えたら学生も興味を持つのかな?とも思いました。

    このエントリーをはてなブックマークに追加

ウィンドウズとlinuxでは区切り文字が違うので、両方で動くシステムを作るのに使います。
DIRECTORY_SEPARATOR = ディレクトリの区切り文字
PATH_SEPARATOR = パスの区切り文字
例えばインクルードパスをスクリプト内で追加するのに


set_include_path(get_include_path().PATH_SEPARATOR.$lib_dir.DIRECTORY_SEPARATOR.'MyLib');

    このエントリーをはてなブックマークに追加

公式の1つのプロジェクト内で複数のアプリケーションが間違っていて、ちょっと詰まりました。

まず、考えてみればおかしいのはわかるのですが、バーチャルホストの設定でDirectoryIndexの設定はいりません。.htaccessでindex.phpにrewriteしてるので、意味がありません。
.htaccessでRewriteCondを使ってドメイン名でrewite先を切り替えるようにすればいいわけです。
例えばwww.example.comとsys.example.comを、それぞれサブドメインの名前のapp(wwwがフロントエンド)で運用するなら下のように変更します。


RewriteCond %{HTTP_HOST} ^www\.
RewriteRule ^(.*)$ index.php [QSA,L]

RewriteCond %{HTTP_HOST} ^sys\.
RewriteRule ^(.*)$ sys.php [QSA,L]

ただ、これだとcssやjsも飛んじゃうので

# we skip all files with .something
RewriteCond %{REQUEST_URI} \..+$
RewriteCond %{REQUEST_URI} !\.html$
RewriteRule .* - [L]

ここのコメントアウトをはずして、ドットのついたファイルがrewriteしないようにする。
こちらのブログを参考にさせていただきました。感謝感謝。
simpraightさんのブログにはセッションをサブドメイン間で共有する方法も書いてありました。
参考にしてください。

[symfony 1.1.5]

    このエントリーをはてなブックマークに追加

今日みたらリリースされてました。
http://www.symfony-project.org/installation/1_2

私が仕事で付き合っているホスティング会社はOSがCentOS5で全てのアプリケーションをyumで入れられるパッケージからしかインストールしないポリシーでやっているのでPHPのバージョンが5.1.6です。5.2系がアップされているリポジトリもあるし、お願いしたのですが、なんか、ごちゃごちゃ言って、要するに断られました。

なので、開発は1.1系を使います。来年サポートが切れるので心配ですが、その頃にはCentOS6が出て、5.2が乗せられることを期待して待ちます。

どっかいいホスティング会社ないですかね?

    このエントリーをはてなブックマークに追加
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。