symfony1.4で日本語のメールを送れるようにする

今更ながらsymfony1.4ですが・・・
日本語メール(iso-2022-jp)を送らなければならない機会にまだまだ遭遇して毎回検索するのもめんどうなので覚書。
jpSimpleMailPluginをインストールするだけでらくちんぽんで日本語メールが送れる優れもの!

インストールから送信まで楽々。
まずはインストール。openpear.orgからsymfonyコマンドで落とせるよ。

./symfony plugin:add-channel openpear.org
./symfony plugin:install --force-license --release=1.0.0 openpear.org/jpSimpleMailPlugin

だけwインストールされたかの確認は

./symfony plugin:list

実行でjpSimpleMailPluginが出力されればOK!
早速action内でのメール送信実装。
symfony1.4であればSwiftMailer4がすでにインストールされれいるので直ぐに使える!

<?php
try {
  $date = date('Y年m月d日');
  $format = '%s <%s>';
  $mailer = jpSimpleMail::create('SwiftMailer4');
  $mailer->setFrom(sprintf($format, '送信者', 'sample@sampledomain.com'));
  $mailer->addTo(sprintf($format, '送信先', 'to@sampledomain.com'));
  $mailer->setSubject('タイトル');
  $mailer->setBody($this->getPartial('createMail', array('date' => $date));
  $rs = $mailer->send();
} catch (jpSendMailException $e) {
  // ここにエラー対応の処理を入れる
  $this->logMessage('メール送信エラー');
}

メール本文をテンプレートファイルに記載しているので、別途同一モジュール内のtemplateディレクトリに _createMail.php で本文を作ろう。
getPartial()の第二引数に配列で値を渡せば、キーと同一名の変数で取得可能。
上記例だと_createMail.php内で$dateとすれば今日の日付が取得できる。
これできれいなコードで動的にメール本文が作れるね。

メールが送信できなければ$rsに0が代入される。
factories.ymlで送信しない設定でも何らかのエラーで送信ができなくても0らしい。
画面右上のデバッグツールにあるメールアイコンで送信内容を確認できるぞ。

下記リンクは参考サイト
ぷぎがぽぎの人は恐らく仕事で会った事ある人・・・

pathinfo()関数で日本語のファイル名が扱えないの?

PHP5.3.10で作られたファイルを取り扱うシステムで、日本語ファイルが取り扱えない不具合が発生。
原因を調査すると、pathinfo()関数で取得したbasenameがおかしい。

たとえば、「日本語abc.txt」のようなファイル名は「abc.txt」として出力されてしまう。
先頭に日本語がある場合だけおかしくなり、「abc日本語.txt」のようなファイル名では問題ない。
どう考えてもpathinfo()の挙動がおかしいのだ。

ぐーぐる先生に聞いてみても、

おまえ、それPHPのバグだから。
PHP6が出るまで諦めろ!

的な内容ばかり見られる。


だが待て!


同じコードが他のサーバーでは問題なく動いているんだよ!
特定のサーバーだけが動かないんだよ!!


PHPの公式マニュアルの下のほうに、マルチバイト使用時に関する注意書きがさりげなくある。
PHP: pathinfo - Manual

ほうほう。ロケールとな。
試しに、現在のロケール情報を調べてみたら、動かないサーバーだけうまく取得できない!!

それを全て解決してくれた魔法の言葉があったので記しておく。
日本語を取り扱う環境で、サーバーの文字コードUTF-8の場合。
まぁ、CentOSでの設定。

setlocale(LC_ALL, 'ja_JP.UTF-8');

この復活の呪文のおかげで、見事復活!!
ありがとう、setlocale関数。最高だよsetlocale関数。

cygwinの設定

慣れてくると便利なunixコマンド達。
かわいくて常に傍にいたい!!

てな人がいるかもしれない。
だけどそんな人が、「開発環境はWindowsのみです(キリッ」なんて言ってくる職場になってしまうかもしれない。

人生が全て終わりだ。もう生きている意味がない・・・

「まぁ、待ちなよ。そんなに簡単に人生あきらめちゃいけねぇぜ。」(誰

救世主cygwinの登場だ!!きゃー(//▽//)

本体のインストールと最低限wgetパッケージのインストールを行っておく。
詳細やインストールに関してはggrks。(何様だ
それが終わって起動してからのメモ。

proxy環境での使用

社内からなどで利用する場合、proxy設定が必要になってくる。
基本的には、windows環境で設定されたネットワークで利用できるのだが、proxy情報は別途設定が必要。
cygwin上からproxy経由で使用する場合は、.bashrcに記述することで対応できる。

export http_proxy

この項目にサーバーとポートを記述すれば大丈夫。

apt_cygのインストール

cygwinのパッケージ追加って、インストールに使用したsetup.exeを起動していちいち選択しなきゃならない。
そんなのめんどいよ。
かといって、ソースコードからコンパイルもめんどいし、バージョン管理も大変。
aptコマンドプリーズ・・・

そんな状況にはこれ、apt-cygコマンド!!
まんま、aptコマンドと同じようにcygwin環境で活躍してくれる。
早速インストールするぜ!!(このためにwgetコマンドだけ先にインストールしておいた)
wgetコマンドで取得してきて、/binディレクトリに移動して実行権限を付与する。

wget.exe http://apt-cyg.googlecode.com/svn/trunk/apt-cyg
mv apt-cyg /bin/
chmod.exr +x /bin/apt-cyg

これでapt-cygコマンドが使えるようになる。
vimやscreenを楽チンインストールできちゃう。

apt-cyg install screen
apt-cyg install vim

2015-11-11追記
久々にやったらapt-cyg install でmd5ハッシュ値が違うって怒られた。
実際に/setup/配下にインストールされたファイルを見ると、md5ではなくsha512ハッシュ値が記載されてた。
あれ?って思って調べたら、とまってた開発がgithub上で再開したみたいだった。
なので取得先が変わる。

wget https://raw.githubusercontent.com/transcode-open/apt-cyg/master/apt-cyg

WindowにインストールされているMySQLサーバーを使用

xamppなどで既にインストールされているMySQLサーバーへ接続には--protocol=tcpを渡す。
アカウントがusernameでdb_nameデータベースへログインする場合は以下になる。
カラム名などタブで自動補完してくれる--auto-rehashオプション付)

mysql --protocol=tcp --auto-rehash -uusername -p db_name

パスワードプロンプトが表示されるので、パスワードを入力してENTERキーをッターンとやればログインできる。
alias登録しておけば、いちいち入力しなくても簡単にアクセスできる。

lsコマンド・grepコマンド結果を色付きにする

    • color=autoオプションをつける事で見やすい結果表示になる。

ディレクトリや実行ファイルなどが見つけやすくなるね。

ls --color=auto /home/username/
grep --color=auto 'keyword'

これもalias登録しておけば、常に色付き。
よく使うls -lコマンドもまとめてalias設定しておけばひと手間省ける。

まとめ

~/.bashrc が以下のとおりになる。

# proxy設定
proxy=http://proxy-server-name:8080/
export http_proxy=$proxy
export ftp-proxy=$proxy

# データベース接続
alias mysql="mysql --protocol=tcp --auto-rehash -uusername -p db_name"

#色付きGREP
alias grep="grep --color=auto"

#色付きLS
alias ls="ls --color-auto"
alias ll="ls -l"

Fedoa14でLDAPサーバを構築

追記[2013/2/19]:再度構築を行った際、新たな情報を手にしたので記事を修正してます。

ユーザ管理がされていなかったので、デスクトップPCとして使っていたFedora14にOpenLDAPを構築。
サーバ機を購入できるまではこれで頑張る!

サーバ・クライアントをインストール

パッケージで用意されているので、必要な物をyumコマンドを使ってインストール。

sudo yum install openldap-servers openldap-clients

サーバの環境設定

インストールしたら設定だぜ。
でも、/etc/openldap/slapd.confがないなー。
あれか、「Ubuntu10.10 に OpenLDAPサーバのインストール&設定 - クマーのえんじにありんぐ 」と一緒か。

でも初っぱなからこけてうまくいかない。ググったら以下の記事を発見!

http://docs.redhat.com/docs/ja-JP/Red_Hat_Enterprise_Linux/6/html/Migration_Planning_Guide/ch07s03.html

  1. まず、/usr/share/openldap-servers/slapd.conf.obsolete から /etc/openldap/slapd.conf にコピー。
  2. ハッシュ化したパスワード生成
  3. コピーしてきた設定ファイルを環境に合わせて変更
  4. 新しくできた設定ファイルをDBに反映させる。

って流れで作業する。あとデータベースをサンプルからコピーする。

sudo cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
sudo cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
sudo slappasswd
sudo vi /etc/openldap/slapd.conf

slappasswdコマンドでは、パスワードを二回聞かれるので、新しく設定したい管理用のパスワードを入力する。
{SSHA}**************** の様に結果が返るので(*は文字で入力した値により変化)それをコピーしておく。
そして、slapd.confの主な変更箇所は以下の通り。

#include                /etc/openldap/schema/corba.schema
include         /etc/openldap/schema/core.schema
include         /etc/openldap/schema/cosine.schema
#include                /etc/openldap/schema/duaconf.schema
#include                /etc/openldap/schema/dyngroup.schema
include         /etc/openldap/schema/inetorgperson.schema
#include                /etc/openldap/schema/java.schema
#include                /etc/openldap/schema/misc.schema
include         /etc/openldap/schema/nis.schema
include         /etc/openldap/schema/openldap.schema
#include                /etc/openldap/schema/ppolicy.schema
#include                /etc/openldap/schema/collective.schema

# bind_v2を使用しないのであれば、不具合が起きにくくなるようコメントアウト
#allow bind_v2

# -- 略 --

suffix  "dc=your-domain,dc=net"  # 個別の環境に合わせてドメイン設定
rootdn  "cn=Manager,dc=your-domain,dc=net" # 個別の環境に合わせてドメインと管理者を設定
rootpw  {SSHA}************ # slapdpasswd で生成された文字列を貼り付け

# -- 略 --

access to attrs=userPassword
        by dn="cn=Manager,dc=your-domain,dc=net" write
        by self write
        by anonymous auth
        by * none
access to *
        by dn="cn=Manager,dc=your-domain,dc=net" write
        by self write
        by * none

database monitor
rootdn "cn=admin,cn=monitor"
rootpw {SSHA}************* # slappasswdで生成された文字列を貼付け

access to *
        by dn="cn=admin,cn=monitor" read

database config
rootdn "cn=config"
rootpw {SSHA}************* # slapdpasswdで生成された文字列を貼付け

#TLS用に証明書関連の設定
TLSCACertificateFile /etc/pki/tls/certs/ca-bundle.crt #CA証明書
TLSCertificateFile /etc/pki/tls/certs/slapd.pem #サーバ証明書
TLSCertificateKeyFile /etc/pki/tls/certs/slapd.pem #証明書秘密鍵

追記:今回構築する環境は、ログイン認証にsssdが使用される。
sssdは認証やら問い合わせやらを一手に引き受けてくれるのだが、認証処理はTLSまたはLDAPSプロトコルが必須となる。(詳しくはぐーぐる先生に聞こう)
その為に、証明書と秘密鍵が必要になる。イントラ内での使用なので、おれおれ証明書を使う事にした。
といっても、わざわざ証明書を発行するのも手間。
そんな時見つけた情報
http://almondy.net/xoops/modules/pukiwiki/?LDAP%A4%CESSL%A1%BFTLS%B2%BD
を参考に、OpenLDAPインストール時に用意されているデフォルトの証明書を使用する事にした。
要件的に厳格な証明書である必要がないので、こりゃ楽ちんだ。


設定ができたら、redhatのドキュメントにあった通りに実行する。
これはslapd.confの内容をLDAPのデータベースに変換する作業。
slaptest実行でslapd.dディレクトリ配下に作成されたDBを読むらしい。
設定の状態を常にオンメモリしてる。以前とは違うのね。

sudo rm -rf /etc/openldap/slapd.d/*
sudo slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
sudo chown -R ldap:ldap /etc/openldap/slapd.d
sudo chmod -R 000 /etc/openldap/slapd.d
sudo chmod -R u+rwX /etc/openldap/slapd.d

そして再起動させて問題なければ今回作成したconfファイルは削除。
・・・削除しなくても問題ないので、残しておいた方が後々の為になるかも。
キャッシュさせて負荷軽減を図るためnscdも起動。
あと、パーミション設定だけしておくか。

sudo /etc/init.d/slapd restart
sudo /etc/init.d/nscd start
chmod 600 /etc/openldap/slapd.conf

LDAPでログインさせるために(authconfig-tui編)

sudo yum install nss-pam-ldapd
sudo authconfig-tui

nss_ldapをインストールした後、認証方法の変更をする。

  1. ユーザ情報で「LDAP を使用」を有効にする(該当欄でスペースを押す)
  2. 認証で「LDAP 認証を使用」を有効にする(該当欄でスペースを押す)
  3. 「次」を選択
  4. LDAPの設定で以下の値を設定する
    1. [*]TLSを使用
    2. サーバー:ldap://127.0.0.1/
    3. ベース DN:dc=your-domain,dc=net
  5. 「OK」を選択

と行えばよいはずなんだが、うまく認証できない。
ググっていたら「http://clehou.com/article.php?story=20110523220534275」な記事を見つけた。
どうやら、生成される設定ファイルに問題があるようだ。
pam_ldap.soを使用しなければならぬ所を、pam_sss.soと記述されているので直す必要がある。
対象は /etc/pam.d/password-auth と /etc/pam.d/system-auth だ。
vimで :%s/pam_sss/pam_ldap/g コマンド一発で終わる。
system-authファイルは以下のようになる。初めからエディターで設定したほうがいいかもね。

追記:初期で設定されているpam_sssがTLS必須になっていた。
そのため、認証がうまくいかない状態であった。
今回はイントラ内なので、おれおれ証明書を用意して/etc/sssd/sssd.confに修正を行う。
そうすれば、pam_sssのまま置換しなくても問題ない。
TSLでない方法を模索したけど、どれもうまくいかない。

service_err=ignore と system_err=ignore、pam_mkhomedir項目を追加
authinfo_unavail=ignoreを設定しないと、slapdが起動していない場合に/etc/passwdのユーザもログイン出来なくなるらしいので、こちらも追加。
ldapサーバが落ちても問題ないようにする。
/etc/pam.d/password-auth と /etc/pam.d/system-auth の両方

auth        sufficient    pam_sss.so use_first_pass
account     [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore authinfo_unavail=ignore] pam_sss.so
session     optional      pam_sss.so
session     optional      pam_mkhomedir.so skel=/etc/skel umask=077
#最後の項目は、ログイン時にホームディレクトリが存在していなければ自動で生成する指定

/etc/sssd/sssd.conf の[domain/default]項目内に追加

  • おれおれ証明書対応の設定
  • getent passwd コマンド等で一覧を取得出来るようにする
[domain/default]
ldap_tls_reqcert = never #おれおれ証明書対策
enumerate = True #getentコマンド対策

この設定を変更したら、CA認証局をOSが既に持っている物をコピー。
nss-pam-ldapdに含まれているnslcdデーモンを起動する事でLDAPに問い合わせ出来る。
最後にsssdも再起動。

cp /etc/pki/tls/certs/ca-bundle.crt /etc/openldap/cacerts/
/etc/init.d/nslcd start
/etc/init.d/sssd restart

/etc/nsswitch.conf の以下の項目も修正
追記:特に修正しないでそのままでOK。以下の通りにはしない。

passwd: files ldap
shadow: files ldap
group:  files ldap

netgroup: files ldap

/etc/pam_ldap.conf /etc/nss_ldap.conf に以下の設定が必要。
これを行う事で、LDAPサーバが応答ない場合は処理を待たない。
OS起動時にslapdが起動する前にユーザ参照が行われる様で、この設定をしておかないと起動に20分とかかかる。。。。

bind_policy soft

getent passwd コマンドで登録したユーザーが引けるか確認。
問題なく引ければサーバ設定完了。

ちょっとはまった

ログインは出来たのに、passwdコマンドでパスワード変更ができない。
/var/log/secure には pam_sss(passwd:chauthtok): Password change failed for user xxx: 4 (システムエラー) が残されていた。
試しにslappasswdコマンドで変更を試みたけどエラー。どうやらパーミッション関連らしい・・・
ldapaclコマンドでxxxユーザ情報の権限を確認してみた。

ldapacl -b "uid=xxx,ou=People,dc=yourdomain,dc=net"

userPassword が auth ではなくread。あれ??
設定されているアクセス権限情報をみてみた。

ldapsearch -x -D "cn=config" -W -b "cn=config" olcAccess

bdb, config の項目の olcAccess が access to * by * read だけだと!?
原因は、slapd.conf の access to attr=userPassword 項目の前にdatabase monitor が書かれていた事だった。
なぜこの設定がこのような場所に書かれていたのかは謎であるが・・・
そのおかげで、本来は認証情報が入っているbdbへのACL(アクセス権限)設定が違うデータベースに反映されていた。
上記のslapd.conf設定内容はそれを回避した設定になっているので問題ない。

再設定を終えてslapsearchコマンドでもちゃんとアクセス権限ができているのに読めないorz
しかも色々トライしていて、いつの間にか認証そのものや getent passwd でもでてこないorz

なーんて泣きながら色々してたら突如出来るようになった。
あぁ、キャッシュしてたんだっけね・・・・その辺の再起動もし忘れないように!

LDAPでログインさせるために(手動で設定ファイル編集編)

最近の構成は、色々なモジュールが絡み合っているのでかなり複雑。
なので、手動で設定ファイルを書き換えるこの方法はおすすめしない。
どうしてもと言う場合の参考程度にしかならない。
実際にこの方法ではpasswdコマンドでパスワード変更ができなかった。

authconfig-tuiは何だか問題あるので手動で行う場合はこっち。
ログイン用のモジュールをインストール。これは一緒。

sudo yum install nss_ldap
sudo vim /etc/pam.d/system-auth
sudo vim /etc/sysconfig/authconfig
sudo vim /etc/nsswitch.conf

system-authの設定

auth        sufficient    pam_ldap.so use_first_pass
account     [default=bad success=ok user_unknown=ignore service_err=ignore system_err=ignore authinfo_unavail=ignore] pam_ldap.so
#ldapサーバが落ちていてもシステムを止めないaccount設定
session     optional      pam_ldap.so
session     optional      pam_mkhomedir.so skel=/etc/skel umask=077
#最後の項目は、ログイン時にホームディレクトリが存在していなければ自動で生成する指定

authconfigの設定

USELDAP=yes             # noからyesに変更
USELDAPAUTH=yes         # noからyesに変更

nsswitch.confの設定

password:  files ldap
shadow:    files ldap
group:     files ldap

次に行うのが、 /etc/ldap.conf の設定。

……ファイルがない…だと!?
認証に使用されるnss_ldap,pam_ldapが参照する設定ファイルが存在しない。
ダミーで作っても設定が反映されない。
ググっても、さも当然のように/etc/ldap.confを設定しろとでてくる。

が!!

/etc/ldap.conf の代わりに、/etc/nss_ldap.conf /etc/pam_ldap.conf を使用するらしい事を発見。
それぞれのファイルに以下を設定する。

base dc=your-domain,dc=net
uri ldap://127.0.0.1/
bind_policy soft
tls_cacertdir /etc/openldap/cacerts

bind_policy soft の設定をしないと、認証処理などでLDAPサーバが起動していないときに長いこと待たされる。
これは、問い合わせができなかったら諦めろ的な内容。hardに設定するとリトライを繰り返す。
特に注意したいのは、サーバー自体を起動した際、LDAPが起動する前にユーザー権限などを参照する処理が走る事。
その時にユーザー等を問い合わせているのでLDAPに問い合わせができず起動が失敗したかのように待たされる。
実際に設定し損ねて際起動した際は、20分も待たされた。遅いでしょ。
この /etc/ldap.conf がない& bind_policy soft が設定できないで3日間もハマったのは、今となってはいい思い出。・・・・・・・でもないな(怒

もう一つハマったのが、mdmonitorさん。
OSを再起動したら、slapdが起動できない。なにやら、DBがなくなったとか何とかでエラー。
たまたまかと思ったけど、再度DB構築し無事slapd起動できても同じ現象になった。
犯人はmdmonitorモジュール。ソフトウェアRAIDの監視をしてるらしいんだが。
標準で組み込まれているサービスモジュールだが、そもそもRAID組んでないので必要ない。
だからサービスで起動させないで、さよならしたった。
setupコマンドからシステムのサービスでできるよ。

さくらサーバでSSL通信にリダイレクト

さくらのレンタルサーバで、スタンダードプランでのお話。

お問い合わせフォーム的なページを作成して、HTTP通信な時はHTTPSにリダイレクトさせたかった。
アプリ側で切り替え制御させようとしたんだけど、これがなぜかうまくいかない。
SSL(HTTPS)通信でアクセスしても、HTTP通信として認識されてしまう。


???


んじゃま、.htaccess設定でmod_rewrite活用するか。ってことで、

RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^form https://ドメイン.sakura.ne.jp/form [QSA,R,L]

formへリクエストが来たら、SSLドメインへGETパラメータをそのまま付与[QSA]してリダイレクト処理[R]。

ありゃりゃ??
無限リダイレクトになっちまったぞい(・ω・`)

サーバ変数を調べたら、SSL通信でも80番ポートでアクセスしてる…
どうやら、共有SSL使用するとproxy経由で80番ポートにアクセスしてくるらしい。

SSLかどうか判定できないじゃないか……

アプリ側でサーバ変数を拾っていたら、proxy経由つまりSSL通信のときだけに取得できる変数があった。


その名も…HTTP_X_SAKURA_FORWARDED_FOR。

proxy経由だとアクセスログ等が常に同じになってしまうのを防ぐために、接続元のIPなんぞを取得できるようにする為の変数に HTTP_X_FORWARDED_FOR なるものがあるらしいんだが。
それのさくら仕様の変数なのか?
mod_rewriteは、特定のサーバ変数以外は読み込めないらしいのでちょっと書き方が違う。

RewriteCond %{SERVER:X_Sakura_Forwarded_For} ^$
RewriteRule ^form https://ドメイン.sakura.ne.jp/form [QSA,R,L]

で設定したら成功した。だが、これが正しいのかは不明だ…

symfony schema.yml の覚書

頭に搭載されている記憶装置が調子悪いので、忘れてもいいように……
symfony1.4とDoctrineで使うDBスキーマの定義。

定義内容

テーブル定義

テーブルクラスに設定できる項目

abstract
生成クラスをabstractするかどうか。デフォルトはfalse。クラスはabstractのときはデータベースにエクスポートされない。
className
生成するクラスの名前
tableName
使用するDBMSのテーブルの名前
connection
モデルにバインドするDoctrine_Connectionインスタンスの名前
columns
カラムの定義
relations
リレーションの定義
indexes
インデックスの定義
attributes
属性の定義
actAs
ActAsの定義
options
オプションの定義
inheritance
継承の定義用の配列
listeners
アタッチするリスナーを定義する配列
checks
DBMSにエクスポートするのと同様にアプリケーションレベルで実行するチェック
カラムの定義

各テーブルクラスに設定したカラム内に設定できる項目

name
カラムの名前
fixed
カラムが修正されるかどうか
primary
カラムが主キーの一部であるかどうか
autoincrement
autoincrementカラムであるかどうか
type
Doctrineのカラムのデータ型
length
カラムの長さ
default
カラムのデフォルト値
scale
カラムのスケール。decimal型に使用される
values
enum型用の値のリスト
comment
カラム用のコメント
sequence
カラム用のシーケンスの定義
zerofill
カラムの空の文字列をゼロで満たすかどうか
extra
カラム定義に保存する追加情報の配列
unsigned
符号なし数値
リレーション定義

relations内に設定したクラスに設定できる項目。
relations定義内に、各リレーション(外部キー設定)毎にリレーション先クラスを定義する。

class
リレーション用に使うクラスの名前。
alias
リレーションを識別するために使うエイリアス
type
リレーションの型。値はoneもしくはmanyのどちらかでデフォルトはone。
設定側から見て相手レコードが複数存在する場合にmany。
refClass
多対多のリレーション用に使われる中間の参照クラス。
local
リレーションで使われるローカルフィールドの名前。
foreign
リレーションで使われる外部フィールドの名前。
foreignAlias
リレーションの反対端のエイリアス。autoCompleteがtrueに設定されるときのみ許可されます。
foreignType
リレーションの反対端の型。autoCompleteがtrueに設定されるときのみ許可されます。
autoComplete
リレーションを反対側に追加して双方向にするかどうか。デフォルトはtrue。
cascade
アプリケーションレベルのカスケーディングオプション。
onDelete
データベースレベルのカスケーディング削除の値。
onUpdate
データベースレベルのカスケーディング更新の値。
equal
リレーションが入れ子の多対多に等しいかどうか。
owningSide
-
refClassRelationAlias
-
継承定義
type
使用する継承の型。許可される値はconcrete、column_aggregation、とsimple
extends
継承するクラスの名前
keyField
column_aggregation継承用のキーとして使用するフィールドの名前。
keyValue
column_aggregation継承でkeyFieldを満たす値
インデックス
name
作成するインデックスの名前
fields
インデックスの中で使うフィールドの配列
unique
インデックスがユニークかどうか

グループに所属しているユーザを表す場合のスキーマサンプル

userテーブルとgroupテーブルを用意し、ORマッパーではそれぞれUserクラスとGroupクラスで取り扱えるようにする。
必ず主キーを設定しレコード作成日・更新日を記録する。各テーブルの個別定義は以下とする。

  • ユーザテーブル
    • 所属グループIDと名前を保持する
    • 名前フィールドにインデックスを設定
    • 物理削除ではなく論理削除とする
  • グループテーブル
    • グループ名を保持する

接続用のconfig/database.yml

all:
  user_admin:
    class: sfDoctrineDatabase
    param:
      dsn: mysql:host=localhost;dbname=user_admin
      username: mysqluserid
      password: mysqluserpass

スキーマYAML config/doctrine/schema.yml

User:
  connection: user_admin
  tableName: user
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: true
      primary: true
      autoincrement: true
    group_id:
      type: integer(4)
      fixed: false
      unsigned: true
      primary: false
      notnull: true
      autoincrement: false
      comment: '所属グループID'
    name:
      type: string(255)
      notnull: true
      comment: 'ユーザ名'
  relations:
    Group:
      local: group_id
      foreign: id
      type: one
  actAs:
    Timestampable:
    SoftDelete:
  options:
    comment: 'ユーザ情報'
Group:
  connection: user_admin
  tableName: group
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: true
      primary: true
      autoincrement: true
    name:
      type: string(255)
      notnull: true
      comment: 'グループ名'
  actAs: [Timestampable]
  options:
    comment: 'グループ情報'

actAsにTimestampableを設定すると、新規登録・更新実行時に時間が記録され

created_at:
  type: datetime
  notnull: true
updated_at:
  type: datetime
  notnull: true

フィールドが自動で追加される。
actAsにSoftDeleteを設定すると論理削除扱いとなり、自動的に

deleted:
  type: boolean
  notnull: true
  default: false

フィールドが追加される。

Ubuntu11.10 ウィンドウが勝手にフィット

Ubuntu使っていて、マウスを画面端に合わせると黄色い枠が現れる。
どこでうっかりクリックしようものならば、アクティブなウインドウが枠にぴったり勝手にリサイズ。
特にVirtualBox上で起動している時なんか、ホストOSと行き来してる時にしょっちゅう現れて、せっかくサイズ調整していたウィンドウが・・・
この機能が邪魔な事邪魔な事・・・

そんな時の強い味方、CompizConfig設定マネージャ助けてー!!

インストールしようぜ!

apt-get install compizconfig-settings-manager

なんなら、ubuntuソフトウェアセンターから「compiz」で検索すれば、「CompizConfig設定マネージャー」が出てくるから、そこからインストールでもいいよ?

インストールしたら、起動してセッティングしようぜ!
Ubuntuアイコンクリック、Dashホームアイコンともいうをクリックして「ccsm」で検索すれば、CompizConfig設定マネージャーが見つかるよ。
起動したら、「ウィンドウ・マネジメント」に分類されている「Grid」のチェックを外せば大きなお世話機能ともおさらばさ。

調子こいてあんましカスタマイズしてると、VirtualBoxUbuntuが息絶えてしまう・・・程々に。