php入れたのだから早速admingeneratorを試したいのだが、symfony2になってからのadmingeneratorは2種類あるっぽい
どっちがどうとか知らないので、今回はとりあえず AdmingeneratorGeneratorBundle の方を試して行く
インストール
なにはなくともまずプロジェクトを作る
$ php composer.phar create-project symfony/framework-standard-edition 2.3.6 2.3.6
プレーンな状態で動くことを確認
AdmingeneratorGeneratorBundle / Resources / doc / installation / installation-via-composer.mdを参考にインストールを進める こっちは自分には全く役に立たなかった
composer.jsonを修正してupdateする
--- composer.json.1 2013-10-19 16:26:06.000000000 +0900
+++ composer.json 2013-10-19 16:27:02.000000000 +0900
@@ -18,7 +18,8 @@
"sensio/distribution-bundle": "2.3.*",
"sensio/framework-extra-bundle": "2.3.*",
"sensio/generator-bundle": "2.3.*",
- "incenteev/composer-parameter-handler": "~2.0"
+ "incenteev/composer-parameter-handler": "~2.0",
+ "cedriclombardot/admingenerator-generator-bundle": "2.3.*@dev"
},
"scripts": {
"post-install-cmd": [
@@ -37,7 +38,8 @@
]
},
"config": {
- "bin-dir": "bin"
+ "bin-dir": "bin",
+ "component-dir": "web/components"
},
"minimum-stability": "stable",
"extra": {
たぶん怒られるのでさらにcomposer.jsonを修正してupdateする
--- composer.json.2 2013-10-19 16:48:58.000000000 +0900
+++ composer.json 2013-10-19 16:51:56.000000000 +0900
@@ -41,7 +41,7 @@
"bin-dir": "bin",
"component-dir": "web/components"
},
- "minimum-stability": "stable",
+ "minimum-stability": "dev",
"extra": {
"symfony-app-dir": "app",
"symfony-web-dir": "web",
Symfony\Component\Process\Exception\ProcessTimedOutException などと言って怒られる場合はタイムアウトの時間を伸ばしてみる
$ COMPOSER_PROCESS_TIMEOUT=600 php composer.phar update
上手く言ったらBundleを有効にする
--- app/AppKernel.php.1 2013-10-19 17:26:45.000000000 +0900
+++ app/AppKernel.php 2013-10-19 17:27:12.000000000 +0900
@@ -16,6 +16,9 @@
new Symfony\Bundle\AsseticBundle\AsseticBundle(),
new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(),
new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
+ new Admingenerator\GeneratorBundle\AdmingeneratorGeneratorBundle(),
+ new Knp\Bundle\MenuBundle\KnpMenuBundle(),
+ new WhiteOctober\PagerfantaBundle\WhiteOctoberPagerfantaBundle(),
);
if (in_array($this->getEnvironment(), array('dev', 'test'))) {
app/config/config.yml に admingenerator の設定追加 使うORMとAsseticを使うかで修正内容を変えるっぽい
--- app/config/config.yml.1 2013-10-19 17:28:28.000000000 +0900
+++ app/config/config.yml 2013-10-19 17:32:20.000000000 +0900
@@ -64,3 +64,13 @@
username: %mailer_user%
password: %mailer_password%
spool: { type: memory }
+
+admingenerator_generator:
+ # choose and enable at least one
+ use_propel: false
+ use_doctrine_orm: true
+ use_doctrine_odm: false
+
+ # choose and uncomment only one
+# base_admin_template: AdmingeneratorGeneratorBundle::base_admin.html.twig
+ base_admin_template: AdmingeneratorGeneratorBundle::base_admin_assetic_less.html.twig
Asseticは無視して Install assets
$ php app/console assets:install web --symlink
Dashboard route も無視
AdmingeneratorGeneratorBundle のインストール自体は多分これで完了
php app/console generate:bundle する
最初から admin:generate-admin admin:generate-bundle をして admingenerater が適用されたBundleを作っても良いのだが色々面倒だったので
- Bundleを作る
- Entityを作る
- admin:generate-admin する
という感じで進める
$ php app/console generate:bundle
- Bundle namespace: Acme/SampleBundle
- Bundle name [AcmeSampleBundle]:
- Target directory [/project/path/src]:
- Configuration format (yml, xml, php, or annotation): annotation
- Do you want to generate the whole directory structure [no]?
- Do you confirm generation [yes]?
- Confirm automatic update of your Kernel [yes]?
- Confirm automatic update of the Routing [yes]?
データベースと Doctrine (“The Model”) ここを参考に適当にEntityを作って行く
確認ごときに mysql は仰々しすぎるので sqlite にする
--- app/config/parameters.yml.1 2013-10-19 19:39:04.000000000 +0900
+++ app/config/parameters.yml 2013-10-19 19:39:25.000000000 +0900
@@ -1,6 +1,6 @@
# This file is auto-generated during the composer install
parameters:
- database_driver: pdo_mysql
+ database_driver: pdo_sqlite
database_host: 127.0.0.1
database_port: null
database_name: symfony
@@ -10,5 +10,5 @@
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
- locale: en
+ locale: ja
secret: ThisTokenIsNotSoSecretChangeIt
この状態で doctrine:database:create するとプロジェクト直下に "symfony" とか出来て悲しみを背負う
よく見ると config.yml に「sqlite では設定を追加しろ」という指示が書いてあるので従う
--- app/config/config.yml.2 2013-10-19 19:43:37.000000000 +0900
+++ app/config/config.yml 2013-10-19 19:43:50.000000000 +0900
@@ -51,7 +51,7 @@
charset: UTF8
# if using pdo_sqlite as your database driver, add the path in parameters.yml
# e.g. database_path: %kernel.root_dir%/data/data.db3
- # path: %database_path%
+ path: %database_path%
orm:
auto_generate_proxy_classes: %kernel.debug%
--- app/config/parameters.yml.2 2013-10-19 19:43:15.000000000 +0900
+++ app/config/parameters.yml 2013-10-19 19:44:06.000000000 +0900
@@ -12,3 +12,4 @@
mailer_password: null
locale: ja
secret: ThisTokenIsNotSoSecretChangeIt
+ database_path: %kernel.root_dir%/data/data.db3
この状態で doctrine:database:create すると今度はパスが無くてdbファイルが作れないのでディレクトリを掘る
$ mkdir app/data
これでようやく doctrine:database:create が出来る
Entity を作る
ドキュメントでは手で作成してたりするが面倒なのでTipに書いてあるコマンドで作る
$ php app/console doctrine:generate:entity --entity="AcmeSampleBundle:Product" --fields="name:string(255) price:float description:text"
- The Entity shortcut name [AcmeSampleBundle:Product]:
- Configuration format (yml, xml, php, or annotation) [annotation]: annotation
- New field name (press
to stop adding fields): - Do you want to generate an empty repository class [no]?
- Do you confirm generation [yes]?
おそらくこれでEntityは出来たので admin:generate-admin してみる
$ php app/console admin:generate-admin
- Generator to use (doctrine, doctrine_odm, propel) [doctrine]:
- Bundle namespace: Acme/SampleBundle
- Model name [YourModel]: Product
- Bundle name [AcmeSampleBundle]:
- Target directory [/project/path/src]:
- Prefix of yaml: sample
- Do you confirm generation [yes]?
- Confirm automatic update of the Routing [yes]?
これで諸々最初に必要なものが出来たハズなので http://host:port/app_dev.php/admin/acme_sample_bundle/sample/ を確認するとテーブルが無いと言って怒られるので作る
$ php app/console doctrine:schema:create
echo ".schema" | sqlite3 app/data/data.db3 とかして出来てるのを確認
これで再度 http://host:port/app_dev.php/admin/acme_sample_bundle/sample/ を確認するとそれっぽい画面が出てくる
触ってみる
とりあえずレコード追加してみるかと触ると setId()ねぇよ 的な怒られ方をする
Productの中を見ると確かに無いがこれはAutoIncrementが効いているからなので、むしろcreate,edit時に編集させないようにするのが正しいと思われる
--- src/Acme/SampleBundle/Resources/config/Sample-generator.yml.1 2013-10-19 20:24:37.000000000 +0900
+++ src/Acme/SampleBundle/Resources/config/Sample-generator.yml 2013-10-19 20:25:10.000000000 +0900
@@ -26,14 +26,14 @@
new:
params:
title: New object for SampleBundle
- display: ~
+ display: [name, price, description]
actions:
save: ~
list: ~
edit:
params:
title: "You're editing the object \"%object%\"|{ %object%: Product.title }|"
- display: ~
+ display: [name, price, description]
actions:
save: ~
list: ~
こんな感じで generator.yml を修正してもう一度試すと今度は title なんてメソッドねぇよ 的な怒られ方をする
レコードは追加されていてレコード追加後 edit へリダイレクトした後にテンプレートのほうで怒られている
これは generator.yml タイトル表示にtitleを参照しようとしてるからなので適当に name に変える
--- src/Acme/SampleBundle/Resources/config/Sample-generator.yml.2 2013-10-19 20:33:43.000000000 +0900
+++ src/Acme/SampleBundle/Resources/config/Sample-generator.yml 2013-10-19 20:34:02.000000000 +0900
@@ -32,14 +32,14 @@
list: ~
edit:
params:
- title: "You're editing the object \"%object%\"|{ %object%: Product.title }|"
+ title: "You're editing the object \"%object%\"|{ %object%: Product.name }|"
display: [name, price, description]
actions:
save: ~
list: ~
show:
params:
- title: "You're viewing the object \"%object%\"|{ %object%: Product.title }|"
+ title: "You're viewing the object \"%object%\"|{ %object%: Product.name }|"
display: ~
actions:
list: ~
これでとりあえず触れる状態になったように思う
今回はここまで
次ぎはリレーション作ったときにどうなるのか、色々変えたくなったときにどうしたらいいのかを見たいのとsonataの方も試してみたいと思う
最終的には以下のような感じになりました
5.3
configure_option "--enable-intl"
configure_option "--with-icu-dir" "$(brew --prefix icu4c)"
configure_option "--with-libxml-dir" "$(brew --prefix libxml2)"
configure_option -R "--with-tidy" "/usr/local"
install_package "http://snaps.php.net/php5.3-latest.tar.bz2"
install_pyrus
install_xdebug "2.2.0"
install_apc "3.1.13"
5.4
configure_option "--enable-intl"
configure_option "--with-icu-dir" "$(brew --prefix icu4c)"
configure_option "--with-libxml-dir" "$(brew --prefix libxml2)"
configure_option -R "--with-tidy" "/usr/local"
install_package "http://snaps.php.net/php5.4-latest.tar.bz2"
install_pyrus
install_xdebug "2.2.1"
install_apc "3.1.13"
5.5
configure_option "--enable-intl"
configure_option "--with-icu-dir" "$(brew --prefix icu4c)"
configure_option "--with-libxml-dir" "$(brew --prefix libxml2)"
configure_option -R "--with-tidy" "/usr/local"
install_package "http://www.php.net/distributions/php-5.5.4.tar.bz2"
install_pyrus
install_xdebug "2.2.3"
enable_builtin_opcache
- --enable-intl のために --with-icu-dir --with-libxml-dir が必要
- あとさらに C++ でないとダメなときがあるっぽい nojimage / fixes-5.3.sh
- gistそのままだとシェバングがアレだったり、Macだからだと思うけど sed でだめなので mix3 / fixes-5.3.sh
- --with-tidy のパス指定は相変わらず "/usr/local"
- brew --prefix だとなぜか上手く行かない
- 5.3 5.4 ではAPCを有効にするため install_apc を指定(pluginが最初から用意されてる)
- 5.5 では 5.5用のAPC が無い(というか開発されてない?)らしいので apcは入れない
- Zend OPcache なるものがあるらしく enable_builtin_opcache が 5.5.* の definitions で最初から指定されてる
- 5.5 だけ latest 指定でないのはfpmを使うと謎のセグフォして困ったから バグなのかなんなのかは不明
--enable-intl 少しハマってググってたら同じくハマってた人 --disable-intlしろとか言われてて「そうじゃねぇよ」ってなってて笑った
intlのために http://t.co/241ee9MM6R ここに来て https://t.co/TwSABxyxhU ここに来た
— mix3 (@mix3) October 9, 2013
https://t.co/HeGEH3q3RL symfony2使ってるから --enable-intl してるのに --disable-intl しろ言われててワロタ
— mix3 (@mix3) October 9, 2013
php.ini の date.timezone を毎回インストール後に弄るのあれなので php-build のトリガー機能を使って、インストール後自動で $PREFIX/etc/conf.d/date.ini を作ってそこに date.timezone の記述してみた
~/.phpenv/plugins/php-build/share/php-build/after-install.d/date.sh #!/bin/bash
set -e
if [ -n "$PHP_BUILD_DEBUG" ]; then
set -x
fi
date_ini="$PREFIX/etc/conf.d/date.ini"
if [ ! -f "$date_ini" ]; then
echo "[Date]" > $date_ini
echo "date.timezone = Asia/Tokyo" >> $date_ini
fi
これでオラオラとインストールしまくった めでたしめでたし
phpはなんでこんなにインストールが面倒なんや…
正確にはfpmとnginxで複数バージョンでも幸せになれる開発環境作り mix3です
phpenvとphp-buildは以下のサイトを見てインストールするための環境は出来てる前提のお話
php-buildで複数バージョンのPHP-FPMを用意する
tidyで怒られる
homebrewで入れた場所が見れてないっぽくてこんなとき --with-tidy オプションにパス指定したいわけですが
php-buildでconfigureオプションを弄りたい場合は以下のファイルを弄る感じになるみたい
- ~/.phpenv/plugins/php-build/share/php-build/default_configure_options
- デフォルトのcongifureオプション設定
- ~/.phpenv/plugins/php-build/share/php-build/definitions/*
- バージョン別のインストール設定
良く見かけるのは~/.phpenv/plugins/php-build/share/php-build/default_configure_optionsを書き換えちゃうというものですが
オプションそんな知らないし他バージョンのインストールに影響するのとかどうなんだと思うので、だったらphp-buildが提供するdefaultを崩さない感じでやりたいなと
そんなときは
configure_option OPTION VALUE -- add
configure_option -D OPTION -- delete
configure_option -R OPTION VALUE -- replace
こんな感じになってるっぽいので目的のバージョンのdefinitionsを別名でコピって configure_option -R "--with-tidy" "/usr/local" を追記すれば良いっぽかった
5.5snapshot入れようとするとbisonで怒られる
バージョンが古いっぽいとかな感じだったのでbrew install bisonして入れてもまだ古いと怒られてしまった
これもまたhomebrewで入れたのが見えてない感じでそれもそのはず /usr/local/Celler/bison/{version} に入れられた後 /usr/local/opt/bison にリンクが貼られていた
例のごとくMac標準と競合してトラブルのもとだからという奴で LDFLAGS: -L/usr/local/opt/bison/lib 指定しろよ的な奴だが、
php-buildでLDFLAGSの指定の仕方とかわからんちんだったので、トラブルとか知るかと /usr/local 以下にリンク貼ってしまってインストール
brew で入れた bison 3.0 だとバージョン高すぎるようだったので homebrew で標準のバージョンよりも古い bison をインストールする を見ながら 2.7 を入れると今度こそインストール完了
バージョンを確認したら 5.6.0-dev だった なんでやねーん
github の master から入れてたので php5.5-latest から直接入れてみたけどやっぱり 5.6.0-dev だった なんでやねーん
ということで
5.5の最新は5.6でしたというオチがついたところでちゃうねんそうやないねん
うちが本当にやりたかったのはAdminGeneratorって最近のどうなってるんかなって知りたかってんって
【追記】php5.5-latestのほうはその前のインストールでダウンロードされたものが残っていてそのまま使われてしまったのが原因ぽかった でも5.5snapshotはやっぱり5.6だった
こうなるなぁというメモ
ただ世の中にはボット用のモジュールやらなんやらは既にある
IRCボットとか誰もが考えるし適当に作って捨てて行くので当然そのうちフレームワークっぽいものも出てくる 例えばUnazuSanとか
こういうは用途に合っていれば良いし、正規表現だしグループで捕まえたのを後方参照出来るしで大体がカバー出来そうだけど、
例えば「開発環境で使ってるバッチスクリプトをオプション指定しつつ実行するをIRCからやりたい」とか糞みたいな要求には向かなそうだなぁとか思ったり
無ければ作れば良いじゃない
#!/usr/bin/env perl
use Ikusan
'server url',
port => <port>,
enable_ssl => 1,
password => <password>,
nickname => <nickname>,
channels => { '#channel_name' => {} };
# undef_message "およよ…";
register qr/regexp?/ => sub {
my (%opts) = @_;
return $opts{error} ? (1, "エラー") : (0, "オッケー");
} => qw/
error
/;
register simple => sub {
my (%opts) = @_;
return $opts{error} ? 1 : 0;
} => qw/
error
/;
register "die" => sub { die "ぱっつんぱっつん" };
use LWP::UserAgent;
register pixiv => sub {
my $ua = LWP::UserAgent->new;
my $res = $ua->get("http://www.pixiv.net/");
my @url = ($res->content =~ /"(member_illust\.php.+?)"/g);
my $ret = "http://www.pixiv.net/" . $url[int(rand(scalar(@url)))];
return 0, $ret;
};
register qr/サタデーナイト/ => sub {
return 0, "フィーバー!!";
};
fever;
こんな感じで AnySan に渡すオプションを指定しつつ use Ikusan して regsiter で sub 登録して最後に fever すれば
mix3 > iku: regex
iku > [OK] オッケー
mix3 > iku: regexp
iku > [OK] オッケー
mix3 > iku: regex --error
iku > [ERR] エラー
mix3 > iku: regexp --error
iku > [ERR] エラー
mix3 > iku: simple
iku > [OK]
mix3 > iku: simple --error
iku > [ERR]
mix3 > iku: die
iku > [ERR] ぱっつんぱっつん at bin/ikusan.pl line 27.
mix3 > iku: pixiv
iku > [OK] http://www.pixiv.net/member_illust.php?mode=medium&illust_id=38896869
mix3 > iku: サタデーナイト
iku > [OK] フィーバー!!
mix3 > iku: ふぁ!?
iku > およよ…
という感じになるみたいな? regsiter で3つ目以降の引数は配列でGetOptionsに渡すようにして、sub に渡ってくるみたいな?
実際には my $ret = ‵perl path/to/script.pl --option $opts{option}‵; とかしてバッチスクリプトに右から左へオプション流すだけなのを想像してる
熱は出る、咳は出る、鼻水は出る
と悲惨な最近なので、現実逃避してたら衣玖さんボットを作りたくなったのでしたマル
ではありません。
livedoorブログがpsgiに移行したりなんかするこのご時世になぜかmod_rewriteとfcgiを使って頑張っているmix3です。
ulimitの話
とある事情でapacheのinit.dにulimitを設定していて、メモリを使いすぎる、とかCPU使いすぎるとfcgiプロセスを殺してもらうようにしていたのですが、
「それ子(fcgi process)だけじゃなくて親(httpd)まで殺しちゃわない?」
と @fujiwara さんの有り難いお言葉が飛び出して大慌てでulimitを外すということが発生しました。
しかもgracefulだと設定変更効かないからロードバランサから外して一台ずつリスタート掛けて行かなければならず…
再度設定する場合にどうするのか
とある事情は変わらないのでulimitの設定を戻さないと行けないが、どうすれば良いのか思いつかないので @fujiwara さんに考えて頂いたところ、
- index.fcgiをindex.fcgi.plとか適当に変える
- index.fcgiは中身shスクリプトにしてそこにulimitを書く
というのはどうか?と提案を頂きまして、いけそうな感じなのでそれで行こうかなぁとなっています。 @fujiwara さんありがとうございました。
ulimitの設定どうやって確認するの?
と、ロードバランサから1台外してinit.d からulimitを消してリスタートしたところでふと思い聞いたところ
cat /proc/$(cat /var/run/httpd.pid)/limits
「こういう感じかな」と教えていただきました。備忘録。
という記事を8月中ぐらいに書いていて放置プレイしてたので改めて残しておく