萌えキャラとは何だったのか

ギークにも絵描きにもなれない者の末路

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しろとか言われてて「そうじゃねぇよ」ってなってて笑った

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&amp;illust_id=38896869
mix3 > iku: サタデーナイト
 iku > [OK] フィーバー!!
mix3 > iku: ふぁ!?
 iku > およよ…

という感じになるみたいな? regsiter で3つ目以降の引数は配列でGetOptionsに渡すようにして、sub に渡ってくるみたいな?

実際には my $ret = ‵perl path/to/script.pl --option $opts{option}‵; とかしてバッチスクリプトに右から左へオプション流すだけなのを想像してる

gist

熱は出る、咳は出る、鼻水は出る

と悲惨な最近なので、現実逃避してたら衣玖さんボットを作りたくなったのでしたマル

ではありません。

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月中ぐらいに書いていて放置プレイしてたので改めて残しておく