CentOSにRVMとRubyをインストール

ローカル開発環境の作成用に、MacのVMware FUSION 5にCentOSを入れたので、RVMインストール時のメモ。下記は全てroot権限で実行。

必要なパッケージのインストール

yum install zlib-devel openssl-devel sqlite-devel

上記だけでもRVMはインストール出来たけど、Ruby1.9.3をインストールした際に怒られたので、あらかじめlibyamlも入れておくことにする。libyamlは標準のリポジトリにはないので、epelリポジトリを追加して(割愛)そこからインストールする。

yum –enablerepo=epel install libyaml-devel

RVMのインストール

curl -L https://get.rvm.io | bash -s stable

完了したら、RVMを有効にするために「source path/to/.rvm/scripts/rvm」コマンドを打つか、再ログインする(.bash_profileを読みこませる)。

rvm -vでバージョン&インストールの確認

Ruby1.9.3のインストール

rvm install 1.9.3

結構時間がかかるので、しばし待つ。完了したらruby -vとgem -vでそれぞれインストールされていることを確認する。

備考

libyamlをインストールしない状態でgem -vを叩いたら「It seems your ruby installation is missing psych (for YAML output).To eliminate this warning, please install libyaml and reinstall your ruby.」というエラーメッセージが表示された。この場合、本文に書いた通りepelリポジトリからlibyamlをインストールした上で、「rvm reinstall 1.9.3」コマンドでRubyを再インストールしたらメッセージは消えた。

CakePHP2でWarning: SplFileInfo::openFileエラー

CakePHP2でBakeしようと思ったら「Warning: SplFileInfo::openFile」というエラーが発生。さっさと焼き上げてCakePHP2の質感を試してみたかったのでガッカリしながら、Google様にお問い合わせ。すると下記の記事を発見。

CakePHP2にあげてから度々目にするWarning: SplFileInfo::openFileの対処法 | ミラボ

この記事の通りにcore.phpのCache::configの_cake_core_と_cake_model_の2つにmask「0666」を設定して、再度Bakeしようとしたものの同様のエラー。ちょっと考えたのち、既に作られたキャッシュのパーミッションがそのままな事に気付いたので、「sudo chmod -R 707 ./app/tmp」で変更してあげたら無事にBake出来ました。

CakePHP2でUnable to allocate memory for pool.エラー

CakePHP2をインストールしてdatabase.phpとcore.phpを設定、簡単なテーブルを作成してBakeしてみたところ、大量に「Warning (2): include() [http://php.net/function.include]: Unable to allocate memory for pool. [CORE/Cake/Core/App.php, line 562]」のエラーが!

ググってみたらAPCのエラーのよう。

PECL apcのエラー Unable to allocate memory for pool. | 永田順伸のブログ 

このページ内のアドバイスどおり、/etc/php.d/apc.iniを修正した。
apc.mmap_file_mask=/tmp/apc.XXXXX

apc.mmap_file_mask=/dev/zero
へ変更するとエラーは表示されなくなった。

心にひっかかりを覚えながら、上記のサイトを参考に修正しようと思ったら、既になってた。ひっかかりは前にやった事があったからみたい。さらにググってみたら、知恵袋でこんなものが。

PHP 5.3.6で、Warning: require(): Unable to allocate memory for pool.という警… – Yahoo!知恵袋

APCのエラーによるものです。(* APCとは、PHPの中間コードのキャッシュや最適化を行う拡張モジュールのことです。)

対処法は、APCを無効にすればOKです。以下の1行を.htaccessに追加してください。

php_flag apc.cache_by_default Off

恐るおそるwebroot/.htaccessに追加してみたところ、無事エラーが消えた!core.phpハッキリした原因が分からないのでとっても気持ち悪いけど、APCってPHPレベルで設定してなくても勝手に動いちゃってるものなのかな?それともPHPのバージョンによるもの??うーん…

CakePHP1.3のScaffold優先順位についてまとめ

CakePHP1.3のScaffold機能が便利なので、管理機能なんかはほとんど丸投げしちゃえて楽な感じです。ただ公式ドキュメントやGoogle先生で調べてみると、予想を遙かに超えて柔軟にカスタマイズできるようなので、個人的な備忘録を兼ねてまとめてみることにします。

ちなみに今知ってること、ネットで見つけたことがほとんどでソースはピンポイントでしか追っていないので、まだまだ隠されている機能があるかもしれません。恐ろしい子ッ…!

  1. コントローラーにvar $scaffoldが定義されていればscaffold機能を使用する。その際に自動で動作するアクションは「‘index’, ‘list’, ‘view’, ‘add’, ‘create’, ‘edit’, ‘update’, ‘delete’」の8つ。(でもindex=list、add=create、edit=updateみたいだから、実質5つ…のはずなのに、listだけviewがないって怒られる。バグ?)
  2. var $scaffold = ‘admin’のようにRouting.prefixesで設定されている値が使用されていれば、自動で動作するアクションは$scaffoldで設定されたprefix名が付加されたものになる。この例だと「’admin_index’, ‘admin_list’, ‘admin_view’ … ‘admin_update’, ‘admin_delete’」の8つが動作する。この場合、prefixがつかない方のアクション(index, viewなど)は動かないので注意。
  3. var $scaffold = array(‘index’, ‘view’)のようにscaffoldで任意で動作させたいアクション名を配列で指定可能。この例だと、indexとviewはscaffoldで動くが、add,edit,deleteの3つは(コントローラーで定義しないと)動作しない。
  4. var $scaffold = array(‘admin_index’, ‘admin_view’)もいけるかと思ったけど、prefix付きのアクションは動作せず。自分の設定ミス?それともバグ?仕様??
  5. 各コントローラーにアクションを記述した場合、scaffoldで自動生成されるアクションよりも優先される。基本scaffoldでいいけど、indexだけカスタマイズしたい場合はfunction index()を記述すればそちらが使用される。

コントローラーについてサクっとまとめると

  • var $scaffoldの記述なし(scaffold使用しない)
  • var $scaffold;
  • var $scaffold = ‘admin’;
  • var $scaffold = array(‘index’, ‘view’);

の4パターンの指定が可能で、scaffoldの利用に関わらず、各コントローラーにアクションが定義されていればそれが最優先ってことらしい。多分。

Scaffoldで使用されるビューの優先順位

  1. 例えばposts_controllerでvar $scaffoldが定義されていて、アクションを上書きしていない場合(function index()などの記述がない)は、app/view/posts/scaffold.index.ctp -> app/view/scaffolds/index.ctp -> cake/libs/view/scaffolds/indexctpの順に探しにいく。
  2. 各コントローラーでアクションを上書きした場合は、scaffoldsのビューは使用されない。例えばfunction index()を記述した場合は、app/view/posts/index.ctpを用意してあげる必要があります。ないと怒られます。

ビューに関してまとめると、コントローラーで自分で定義したアクションについては、必ず対応するビューを用意する必要があるって事でいいのかな。scaffoldで自動生成されたアクションに関しては、上の優先順位1のように探しにいきます。

CakePHP1.3のScaffold機能、コントローラー単位、アクション単位、ビュー単位で柔軟にカスタマイズできそうなので、上手く利用できれば作業がかなり楽になりそうです。使いこなすぞー!

それではまた。

蕎麦湯の正しい飲み方

突然ですが蕎麦が好きです。そばと言えばざる蕎麦な食べ方が一番好きなんですが、蕎麦湯…くれますよね。今まで何となく探り探り楽しんでいたけど、気になって調べてみました。そしたら教えてGooで正解っぽい答えを書いている方がいたので、まとめてみます。

蕎麦湯の飲み方 – その他(料理・グルメ) – 教えて!goo

  1. 食後、そばつゆに蕎麦湯を流し込む。量は適当、好みでOK
  2. 飲む
  3. まだ蕎麦湯が残っていれば流し込む
  4. 飲む
  5. 何ならそばつゆが無くなっても、蕎麦湯だけで飲んでもOK
  6. 好みで青ネギやしょうが、ゴマなどの薬味をプラスしてもOK

まとめると、そばつゆと足して飲んで良し、蕎麦湯だけで飲んで良し、好みで薬味を足して良し…つまり自由に楽しめばいいみたいです(笑)

さすがに蕎麦湯をお蕎麦がまだ残っているザルにぶっかけて食べるようなド外道、いや破廉恥な食べ方をする人はいないでしょう!いませんよね?自分も今まで何となく飲んでた方法で間違ってなかったみたいで安心しました。薬味をあえて足した事はなかったので、次からはあればやってみようと思います。健康にもいいみたいなので、ぜひ素晴らしい蕎麦湯ライフを!

それではまた。

CakePHP1.3で携帯電話(ガラケー)とiPhone,Androidを振り分ける方法

ミッション

CakePHPサイトをガラケー対応させること。とりあえずはガラケーとiPhone&Androidの振り分けまで。

手順

MASA-P/KtaiLibrary · GitHub

  1. 上記からファイルをZIPダウンロードして解凍
  2. 解凍したファイルのvendorsディレクトリの下にある「ecw」ディレクトリを「vendors」又は「app/vendors」ディレクトリ下に丸ごとコピー
  3. 解凍したファイルの「app/controllers/components/ktai.php」を、同じ「app/controllers/components」ディレクトリ下にコピー
  4. コントローラーで下記のコードにより振り分け可能

コントローラーの使用コンポーネントにKtaiを追加

[php]
var $components = array(‘Ktai’);
[/php]

振り分け処理を記述

[php]
if ($this->Ktai->is_ktai()) {
// ガラケー用の処理
} else if ($this->Ktai->is_iphone() || $this->Ktai->is_android()) {
// iPhone,Android用の処理
} else {
// それ以外、PCなどの処理
}
[/php]

これだけです!簡単でしょう?サイト全体に適用するならapp_controller.phpのbeforeFilterやbeforeRenderあたりでレイアウトやテーマの設定をごそっとしてあげると便利かと思われます。

それではまた!

※参考にしたサイト

phyMyAdminでrootログインできないようにする手順メモ

作業経緯

場所を問わずphpMyAdminからDBを操作したいので、IP制限はしたくない。でも個人使用で複数DBにまたがった作業をするので、root同等の権限は欲しい、でもrootでphpMyAdminにログインできるのはあまりに危険。

作業した手順

  1. phpMyAdminにrootでログインして、「特権 -> 新しいユーザを追加する」から全権限を付与したユーザーを作成。(ユーザ名とパスワードは複雑に、ホストはlocalhost、ユーザ専用データベースは不要、グローバル特権はすべてチェック)
  2. phpmyadmin/config.inc.phpに「$cfg[‘Servers’][$i][‘AllowRoot’] = false;」を追記(作業前に念のためconfig.inc.php.bakなどでバックアップを取っておく。自分の場合、config.inc.phpは/usr/share/にありました。)

これだけ。もはやphpMyAdminにrootでは入れません。限定的ではあるけど、ちょっとだけセキュリティがマシになるかな…ぐらい。もちろん全権限を付与したユーザーが割れたら元も子もないので、そちらのセキュリティはしっかりと。

CakePHP 1.3のbakeで焼かれるビューをカスタマイズする方法

日本語ドキュメントを参考にしたら上手く動かないから、ソースコード読んで頑張った…そしたら元の英文ドキュメントには正しい事が書いてありましたorz

やっぱりドキュメントは原文を当たるのがセオリーのようです。よし学んだ!

手順

  1. app/vendors/shells/templates に好きなテーマ名でディレクトリを作成(※ユニークな必要があるので「default」以外の名前で)
  2. app/vendors/shells/templates/[themename] にviewsディレクトリを作成
  3. cake/console/templates/default/views の下に4つの.ctpファイルがあることを確認
  4. app/vendors/shells/templates/[themename]/views に4つの.ctpファイルをコピーする
  5. ctpファイルを自分の好みに編集する

いつも通りにViewをbakeすれば、途中でどのテーマを使うか聞かれます。「default」ではなく自分で作成したテーマを選択すれば、[themename]/views以下のctpファイルを元にviewが焼き上がります。テーマ名さえ違えばテーマは複数作れるようなので、フロントと管理系で分けたりできますね!

注意点

  • bakeするviewの元になるコントローラーがないと怒られる(そりゃそうか…)
  • bakeコンソールに入った状態でテーマを作成しても、テーマ選択が出てきませんでした。テーマを作成してからbakeコンソールを起動(実行)して下さい。

参考

CakePHPで管理画面用のレイアウトを設定する

  1. config/core.phpでRouting.prefixesの設定を有効にする(コメントアウト解除)
  2. app/app_controller.phpのbeforeFilterに下記のコードを設定する
  3. 以上

[php]
<?php
class AppController extends Controller {

function beforeFilter() {
if (isset($this->params[‘prefix’]) && $this->params[‘prefix’] == ‘admin’) {
$this->layout = ‘admin’;
}
}

}
[/php]

Routing.prefixesの値として”admin”を使用した場合の記述です。例えばprefixesに”manager”を設定した場合は、5行目の「== ‘admin’」の部分を「== ‘manager’」として下さい。

6行目、$this->layoutの方は自分がapp/view/layoutフォルダ内に作った管理画面用のレイアウトファイル名に合わせて下さい。manager.ctpという名前なら「$this->layout = ‘manager’」となります。

app/app_controller.phpがない場合は、cake/libs/controller/app_controller.phpからコピーした上で、app配下のファイルを編集しましょう。

※参考
php – Change admin layout in CakePHP – Stack Overflow

古参ファンと新規ファン

ももクロ春の一大事@西武ドーム楽しかった!あんなに歌って踊って、4時間オーバーのライブを2日間もやるんだから凄いもんです。んもう絶対日産も行く。

感想を読んだり、詳しく調べていくと「古参ファン」と「新規ファン」の話題をよく目にします。これはももクロに限ったことじゃなく、何年か活動していて、人気があるグループならジャンルを問わず話題にのぼる事なんでしょう。

たまたま見つけたももクロファン最古参(メンバーから顔を覚えてもらっているレベル)の方のブログを読んでいたら、「古参」なんて自分で口にできるのはこのレベルだよなって思いました。このレベルの人になると、かえって古参ぶらない事が多いんですけどね。どんなファンでも、古参ぶる人のほとんどはメディアでそれなりに取り上げられるようになってからでしょう。最古参の人がそれを見たら、腹立たしいのか微笑ましいのか…自分には分かりませんが、どんぐりの背比べに見えるに違いない。

ミスチルは95年来のファンだから、もうかれこれ18年。ミスチル現象よりも後からのファンだから絶対に古参ではないけれど、期間だけで見たらそれなりに古参でもあったりして。ミスチル現象の後もSignやしるし、HANABIなどで着実に新規ファンを獲得しているから、自分や友人が当たり前のように過ごしてきた経験をしてない人もたくさんいる印象です。そんな人が的を射ない講釈をたれていたりすると「それは違うだろ…」なんて思うことも多々あるけど、よく考えてみたら真実がどっちにせよ迷惑な古参ファン以外の何者でもないですね。気をつけなくては。

新規だと、何か意見を言うのもはばかられるような気がしていたけど、自分が思ったことは素直にそのまま出していこうと思いました。ちょっと経験積んで古参ぶるのは恥ずかしいけど、新規だからって別に卑屈になることもない。同じものを好きっていう共通点があるんだから仲良くすればいいよね。

ただ、売れてない頃から応援してきた人に対する敬意は忘れないつもりです。その人達がいなければ、もう消えちゃってる可能性が高いんですから。