cakePHP2.3 GMOペイメントのモジュールをつかう

app/Vendorにモジュールのディレクトリを配置して、require_onceする。

モジュールディレクトリの場所をインクルードパスに入れる必要があるので、上記のような感じにした。

参考: App::import() でファイルをインクルードする

尚、GMOペイメントのモジュールは、コンストラクタが2つある。PHP5.4だとRedefining already defined constructorというエラーがでた。だからcore.phpの下記を修正して、エラーがでないようにした。

PHP5を試してみる – コンストラクタの名称の統一
CakePHP2.xとPHP5.4でStrict Errorが出た場合の対処法

ディレクトリ内の全ファイルの置換

macでillegal byte sequenceというエラーがでる場合は、下記をやる。

追記:2014年2月14日

sedは、iオプションで上書き更新ができるが、上記コマンドを打つと-eという文字が後ろについたバックアップファイルが作成されてしまう。-i”.bak”とかってやると、.bak拡張しでバックアップができて、-iだけだとバックアップできないと思ってるんだけど、-eという文字列が後ろにくっついたファイルがバックアップとして作成されてしまっている。上記コマンドは-i -eとなってるので、この-eをバックアップファイルにくっつける文字列と勘違いしているのかもしれない。

とりあえず、-eとくっついたファイルが沢山できてしまったので、削除する場合は、下記のようにやる。

これはcakePHPのviewファイルでctp拡張しの後ろに-eとついってしまっているものを全部削除している様。sedの処理を複数回やっていると、-e-e-eとかっていう残念なファイルが沢山できてしまったので、-e-e-eとかのファイルも全部削除している。

-i”” -eとかやっても、やはり-eという文字がくっついたバックアップファイルが作成されてしまう。仕方ないので、全ファイル置換してからバックアップファイル削除することにした。微妙だ。

Capitstranoでデプロイする度に、ユーザが登録している画像が消えると困る件

当然困ります。

http://www.slideshare.net/T2J/capistrano-tips-tips
このページの22ページに解決策が書いてあります。これがよさげ。

(ちなみに、僕は今時点よりちょっと古いCapistranoを使っております。3ではありません。)

cakePHPでapp/webroot内に画像フォルダを作っている場合、(app/webroot/uploadsなど)まず最新リリースのuploadsフォルダを、shared/system/uploadsにコピーします。
そして、今後はデプロイする度に、app/webroot/uploadsを、shared/system/uploadsフォルダのシンボリックリンクにする。
という感じにしたらいいらしい。

でも今全然正しくシンボリックリンクの設定ができてなかったのにdeployしても画像が共有されているのはなぜだろうか???
謎すぎる。

シンボリックリンクをcapistranoで作成するには、下記のような感じにした。

uploadsフォルダを削除してからじゃないとエラーになるので、最初に削除してから新たにシンボリックリンクを作成した。ln -nfsとあるが、nオプションは不要かも。というかfオプションも不要か削除してるし。

AWSでCSRを作成する

AWSサーバに入るための鍵がppkという拡張子になっている。下記を見ながら変更してみる。
Putty の鍵ファイル .ppk を Linux ssh 用に変換してみる

yumが使えないから、下記を見ながらやってみる。
Run Putty on Mac OS X 10.6.8

sudo port install puttyってやっても、下記のエラーになった。
Error: Processing of port putty failed

sudo port selfupdateでportをアップデートしてみた。
テザリングでやってるから超おそい。
そもそもputtyとはなにか?

Windows OSで稼働するSSHクライアント。TTSSHとは異なり,SSHプロトコルversion2にも対応している。さらに,ファイル転送のためのscpや公開鍵認証のためのagentなど,UNIX版SSHクライアントの機能を多数サポートしている。

これがMacでも使えるらしい。SSHクライアントなんていらないんだけどな。やっぱり変換したい。
それにしてもUpdating the ports treeから動かない。諦めるか。一回とめてもう一回やってみる。やっぱり動かない。

そもそも変換したいわけだから、Putty自体は不要だし、どうもputtygenというのがあればいいらしい。
MacでPutty形式の秘密鍵を変換するこれみてもう一度やってみる。
brew install putty
おお出来たっぽい。

ppkを下記で変換できた。

SSHで接続しようとしてもPermission denied (publickey).ってでてエラーになる!
おーできた。ユーザ名指定してなかった笑

■CSRの作成(ジオトラスト)
サーバー証明書の作成、アップロード、削除
CSRの生成方法

CSRとは?企業の社会的責任ではない。CSRとは、お客様が生成し、認証局に提出する署名リクエスト(Certificate Signing Request)です。

ここで一旦お昼ご飯にする。

LESS

CSSをシンプルに書くことができるLESS使ってみた
Twitter Bootstrapを使ったサイト構築の流れ (後編)

便利だの。twitter bootstrap3というのは、昔のbootstrapと結構違いますね。LESSというのを使っているので、勉強してみようと思いました。LESSというのはCSSの値をパッケージングできまっす。なのでbootstrapのややこしいcssも簡単にカスタマイズできるようになっているのかもしれません。

http://incident57.com/less/

これがMac用のLessコンパイラーというやつらしいです。Lessを作ってコンパイラーでCssにするそうです。twitter bootstrapは全部Lessでcssを管理しており、bootstrapのgithubにそのLessがあります。これをカスタマイズしてコンパイラーでcssにして、bootstrapのcssを入れ替えればいいそうです。

ただ、どうも、上記コンパイラだとエラーがでる。&:extend(.clearfix all)というやつに対応できていないっぽい。有料版の下記だと問題なくコンパイルできました。

http://incident57.com/codekit/

下記のようにネストもできるようです。関数的なこともできるし、計算もできるようです。いいっすね。

LESSと同じようなメタ言語として、Sass、Stylusなどがあるらしい。聞いたことはある。

管理画面のメニューを自動で作成する

管理者の権限は色々ありますし、最終的にはメソッド単位で細かく管理できないといけないと思います。
あと、単にそのメソッドを実行できるか否かだけではなく、どのデータを扱うことができるかまで管理できる必要があります。
こういうのはどうもACLというらしいです。

すごく基本的な管理者権限を考えると、管理者のグループを作成して、そのグループがどのモデルに属するかを設定するといいのではないかと思いました。例外処理ができないと実用的ではありませんが、グループがモデルに属するのであれば、アソシエーションの状態から、自動的に実行可能なメソッドと、編集可能なデータを決定できるのではないかと思います。

例えば、roleのグループをrolesというテーブルで管理しつつ、その各グループに属するモデルもデータベース上で設定しておきます。role_idが1のグループは、Shopモデルに属するのであれば、Shopが持っているHasOneとかHasManyとかのテーブルのみ管理できるようにすればよいです。ShopがMovieを持っている場合、Movieのadmin_index,admin_view,admin_edit,admin_deleteへのアクセスが許可されて、admin_indexは自分が持っているMovieのみ表示されるといった感じになります。これをコンポーネント化しておけば、beforeFileterとかで$this->Auth->user(‘role_id’)をチェックして自動的に埋め込みが可能なんではないだろうかと思いました。

cakePHP モデルからランダムに取得する

orderに、’rand()’とやる

cakePHPのプロジェクトを簡単に作成するようにする

cakePHPをやってる人なら少なからずやってると思いますが、僕はやってません。
今考えて仕組みをつくりたいと思います。

今つくっているBakeを使いたいので、BakeのプロジェクトをGithubのリポジトリに入れておいて、それをクローンしてデータベースをつくって、Bakeします。すると作成したいサイトの大方(まだ少し)が出来上がるので、それを別のブランチとしてpushします。で納品時にBakeプラグインなどを簡単に削除できるコマンドを用意しておき、それを実行します。

というのでどうでしょうか?
まあシークレット文字列とかは手動変更が必要だなこれじゃあ。まあ今はいいか。

Bake お気に入り登録機能

お気に入りの登録機能を実装するときにどうしようかなと思っております。
単純に考えると、お気に入りを登録する対象を設定しておき、その対象設定に基づき、モデルを作成します。もしテーブルがなければモデル作成の前にテーブル作成してもいいです。

例えばshopsにお気に入りを登録するという設定がされている場合、shop_likesテーブルを作成して、ShopLikeモデルを作成するわけです。でもshopsにlike_countみたいなお気に入り数を登録したい場合もあるでしょうから、shopsが対象に設定されているのに、like_countがフィールドとしてつくられていない場合は、それも事前に作成してもよいと思います。

しかしながらそうなると、モデル作成関数の実行前にこれら全てを実行する必要がありますので、テーブル作成関数というモデル作成の前段のフェーズをもう少しきちんと考えた方がいいのかなとも思う訳です。おまけにいうと、僕は今Bakeの設定のためのデータベースと、Bakeによって作成するデータベースを同じにしてしまっております。これを分けること自体はもちろん可能だと思うのですが、どうも頭の中でこの2つが混在しているようです。つまりいざ分けようとするときに、あらわけられないじゃんこれじゃあという風になるだろうと思っている訳です。

本来であればというか理想としてはBakeのための設定情報データベースのみから、Bakeにより作成するテーブルを全て新規で作成し、
それに基づきモデルを作成し、、、という流れであれば一番分かりやすいわけです。しかしながら、それはそれで大変でありますし、phpmyadiminを使えばデータベースの作成というのは割とすぐにできるものであり(簡単なものならですが)ますので、そのテーブル情報に基づきBakeするという考え方は、踏襲してもいいのではないかと思っております。

なので、最終的に納品するような状態になった場合に限り、設定情報に関連するテーブルを削除するという考え方で進めればいいのだなと今思いました。となるとまあ今のまま進めていいのか。

defaultデータベースにお気に入り設定に関するテーブルを作成しまして、そこに対象となるモデルを登録するようにします。
Bakeの前段でテーブル作成関数を実行して、そこでお気に入りに関する未作成のテーブルを作成するようにします。
となると、画像登録(Filebinder)に関する未作成テーブルもそこで作成することになります。なにしろ、機能毎に別個でテーブル、モデル、コントローラー。。。という風に作成していくと、不整合が生じてしまいますので、テーブル、モデル、コント、、という流れの中で全機能をつつがなく実装していく必要があるわけであります。

cakePHP2.3 shellで色変える

参考: http://book.cakephp.org/2.0/ja/console-and-shells.html#styling-output

Bake改造 あたまの整理

Bakeを改造しているわけですが、結局何がしたいのか不明瞭なままつくっているとたこ足配線みたいになってきますので、目的をしぼってリファクタリングしていきます。最終的にはWEB上で設定した内容に基づいてぽこっとサイトを生むようなものを想定しておりますので、Bakeのコンソール上で設定を入力させるような機能はいらないわけで、むしろサイトの設定内容に基づき一から完全なサイトを瞬間的に一気に作成することが必要なわけですから、どの設定をいじっても確実のその設定が反映されたサイトが自動作成されるようにする必要があり、裏側のBakeコマンドは1つでいいわけです。その一つに全てを集約させていきます。

データベースがあり、そこに設定情報があります。その設定情報に基づき、モデルを作成し、コントローラーを作成し、ビューを作成します。認証情報にソーシャルを連動させるか否か、お気に入り機能を搭載するか否か、各モデルにおいて画像を登録させるか否かなどの情報はモデル作成段階、コントローラー作成段階、ビュー作成段階でそれぞれチェックし、設定内容に応じたモデル、コントローラー、ビューを作成していく必要があります。

あと最終的には、特定のディレクトリに新しいプロジェクトを作成し、シークレット文字列?とかもランダムに変えつつ、今回作成するBakeプラグインなどを排除したものにし、データベースからも設定情報自体は削除(分離)するようにしたいです。自動作成するための情報は、自動作成後(納品後)は基本不要だからであります。まあこの辺りは特段問題ないですので、後で考えるとして、やはり設定情報を全てDB上で表現できるようにし、その情報に基づいてターミナルからBakeすることで一発サイト作成が出来る状態を早々につくっていきたいと思います。