Hatena::ブログ(Diary)

てつじんにっき

2011-06-10

[][] anything-project.elでSymfony2

anything-project.elにSymfony2用のプロジェクトを定義してみた。

(ap:add-project
 :name 'symfony2
 :look-for 'ap:symfony2-root-detector
 :grep-extensions '("\\.php" "\\.twig" "\\.yml")
 :exclude-regexp  '("/cache/" "/logs/"))
(defun ap:symfony2-root-detector (files)
  (ap:all-files-exist '("app" "bin" "src" "vendor" "web") files))

使ってみて、M-x anything-project-grepした時にcacheディレクトリなどが対象になって少し困ったので、ap:add-project-exという関数の追加とap:build-grep-commandを上書きして:grep-ignore-dirsというキーワード引数で除外するディレクトリを定義できるようにした。*1

最終的に以下のような感じ。

(require 'anything-project)

(defun* ap:add-project-ex (&key name look-for (include-regexp ".*") (exclude-regexp nil) (exclude-directory-regexp nil) (grep-extensions nil) (grep-ignore-dirs nil))
  (ap:add-project
   :name name
   :look-for look-for
   :include-regexp include-regexp
   :exclude-regexp exclude-regexp
   :exclude-directory-regexp exclude-directory-regexp
   :grep-extensions grep-extensions)
  (nconc (cdr (assq name ap:projects))
         (list (cons :grep-ignore-dirs grep-ignore-dirs))))

(defun ap:get-grep-extra-options (key)
  (let ((grep-ignore-dirs (ap:get-project-data key :grep-ignore-dirs)))
    (mapconcat 'identity (mapcar (lambda (dir)
                                   (concat "--ignore-dir=" dir))
                                 grep-ignore-dirs) " ")))

(defun ap:build-grep-command (key)
  (let ((grep-extensions (ap:get-grep-extensions key))
        (ack-command (ap:get-ack-command))
        (grep-extra-options (ap:get-grep-extra-options key))
        (xargs-command (ap:get-xargs-command))
        (egrep-command (ap:get-egrep-command)))
    (concat
     ack-command " -afG " grep-extensions
     " "
     grep-extra-options
     " | "
     xargs-command
     " "
     egrep-command " -Hin "
     "%s")))

;; PHP Symfony2
(ap:add-project-ex
 :name 'symfony2
 :look-for 'ap:symfony2-root-detector
 :grep-extensions '("\\.php" "\\.twig" "\\.yml")
 :grep-ignore-dirs '("cache" "logs")    ; これを新たに追加
 :exclude-regexp  '("/cache/" "/logs/"))
(defun ap:symfony2-root-detector (files)
  (ap:all-files-exist '("app" "bin" "src" "vendor" "web") files))

そしてsymfony2.elが欲しくなってきた。

*1emacs lisp知識不足でdefunしたけどdefadviceで出来るものなのかな?

2011-06-05

[][][] PHPer.jpでSymfony2のblogチュートリアルを動かすためにやったこと

phper.jp | 523: Origin is unreachablePage not found · GitHub Pagesを動してみたので、雑なまとめですが、やった設定の備忘録。

最終的に下記のような構成に。

/path/to/approot/
 -  .phper/        # phper.jp用設定ファイル群
 -  Symfony/       # blogチュートリアルアプリケーション
 -  phpMyAdmin/    # 管理用phpMyAdmin

1. phper.jpに登録

http://phper.jp/quickstartを見てユーザ登録〜デプロイまで進める。

ドキュメントルートは Symfony/web にしておく。


2. phperコマンドのインストール

Ruby製のphperというCLIツールが用意されているので、no titleを参考にRuby環境整えて

$ gem install phper

で、phperコマンドをインストール


3. blogチュートリアルの作成

ローカルでblogチュートリアルを読み進めながら、/path/to/approot/Symfony下に作成。


4. phper.jp用に設定の修正


Symfony/web/app_dev.phpSymfony/web/config.phpのアクセス制限変更

no titleの構成を見るとフロントにproxyが居るので、

$_SERVER['REMOTE_ADDR']だけじゃなくて、$_SERVER['HTTP_X_FORWARDED_FOR']も見てやるようにする。

# /path/to/approot/Symfony/web/app_dev.php
# /path/to/approot/Symfony/web/config.php
<?php
...
$remoteIpAddresses = array_merge(
    (array)@$_SERVER['REMOTE_ADDR'],
    array_map('trim', explode(',', @$_SERVER['HTTP_X_FORWARDED_FOR']))
);
$allowIpAddresses  = array(
    '127.0.0.1',
    '::1',
    'your-global-ip-address', // 自分の接続元グローバルIP
);
if (count(array_intersect($remoteIpAddresses, $allowIpAddresses)) === 0) {
    header('HTTP/1.0 403 Forbidden');
    die('You are not allowed to access this file. Check '.basename(__FILE__).' for more information.');
}
...

■ .gitignore

下記をgitの管理対象外にする。

# /path/to/approot/Symfony/.gitignore
*/logs/*
*/cache/*
app/config/parameters.ini

parameters.iniはローカル、phper.jp上で異なるのでgit管理対象外として、下記のようにした。

# /path/to/approot/Symfony/app/config/parameters.phper.ini
[parameters]
    database_driver   = pdo_mysql
    database_host     = db.phper.jp
    database_name     = yourname_appname
    database_user     = yourname
    database_password = password

mysqlの接続情報などは、phper infoで確認できる。

$ phper info
yourname-appname
--> gitosis@git.phper.jp:yourname/appname.git
--> mysql://yourname:password@db.phper.jp/yourname_appname

5. phpMyAdminを用意する

MySQLコマンドラインクライアントが使えないのでphpMyAdminを入れる。

http://www.phpmyadmin.net/home_page/downloads.phpからDownloadして/path/to/approot/phpMyAdminに設置する。


また、できればphpMyAdminにはhttpsでアクセスしたい。

no titleを見ると、phper.jpではエッジレイヤのNginxがSSLアクセラレーションするようなので、

SSL-Proxy下でphpMyAdminSSLで動かす設定も入れておいた。


config.sample.inc.phpをコピーしてconfig.inc.phpを作成。下記を設定。

# /path/to/approot/phpMyAdmin/config.inc.php
<?php
..
// 書き換え
$cfg['Servers'][$i]['host'] = 'db.phper.jp';
// SSL-Proxy下でSSLで動かす設定。 http://wiki.phpmyadmin.net/pma/Config#PmaAbsoluteUri
$cfg['PmaAbsoluteUri'] = 'https://yourappname.phper.jp/pma/';

6. phper設定

プロジェクト直下の.phper/ディレクトリにいろいろとスクリプトや設定を記述できる。

詳しくはマニュアル参照。http://phper.jp/manual


■ deployの設定: /path/to/approot/.phper/deploy
#!/bin/sh
ROOT_DIR=$(cd $(dirname $0)/..; pwd)
# キャッシュの削除
rm -rf $ROOT_DIR/Symfony/app/cache/*
# parameters.iniのシンボリックリンク作成
ln -sf $ROOT_DIR/Symfony/app/config/parameters.phper.ini $ROOT_DIR/Symfony/app/config/parameters.ini

rsync除外設定: /path/to/approot/.phper/rsync_exclude.txt
Symfony/app/cache/*
Symfony/app/logs/*

アプリケーションサーバApacheの設定: /path/to/approot/.phper/httpd.conf

/pmaでphpMyAdminにアクセス。後、Digest認証も一応かけておく。

Alias /pma "/var/www/sites/yourname-appname/phpMyAdmin"
<Location pma>
    AuthType Digest
    AuthName "Secret Zone"
    AuthDigestDomain pma
    AuthDigestProvider file
    AuthUserFile  "/var/www/sites/yourname-appname/.phper/.htdigest"	
    Require valid-user
</Location>
$ htdigest -c /path/to/approot/.phper/.htdigest "Secret Zone" user
New password: ****
Re-type new password: ****

7. デプロイする

$ git push

8. phper.jp上のデータベースschema定義を流しこむ

blogチュートリアルschema定義をdumpして、phpMyAdminから流しこむ。

$ app/console doctrine:schema:create --dump-sql
ATTENTION: This operation should not be executed in an production enviroment.

CREATE TABLE Post (id INT AUTO_INCREMENT NOT NULL, title VARCHAR(255) NOT NULL, body LONGTEXT NOT NULL, createdAt DATETIME NOT NULL, updatedAt DATETIME NOT NULL, PRIMARY KEY(id)) ENGINE = InnoDB

後はブラウザから動作確認して動くか確認。


実際はこんなにすんなり行かずに、トライアンドエラーを繰り返しました。PaaS楽しい!!

*1gitに登録するのも嫌だが他の方法が思いつかなかったので