2011年5月5日木曜日

Mac OS X Snow LeopardでFinder上のファイルパスを右クリックで取得する

というのができない……。なんでですか。


参考:http://linker.in/journal/2010/05/macautomator.php

Mac ローカル環境でWebアプリケーション開発をバーチャルホスト管理にした

↓この記事でMac + XAMPP + eclipseプロジェクトで管理というのを書きましたが、
http://kozo002.blogspot.com/2011/01/cakephp13.html
最近MacBook Airを買ってちょっと環境が変わりましたので書きます。

XAMPPを卒業

Macなんだし。せっかくのUNIX環境と親切にもデフォルトでインストールされているApacheを使うことにしました。
そもそも以前も組み込みのApache使って開発していたのですが、httpd.confをいじってたらよくわからない事態になってしまって……えいや!っとXAMPPに逃げたわけです。はい。

前回の失敗を活かして慎重に進めることにより /Library/WebServer ディレクトリにまとめられました。


バーチャルホストごとに管理

前まではlocalhostのルート直下に site01 とかディレクトリを作って各サイトのトップページにしてたんですが、これ美しくないですよね。というわけで命名規則を local で始まり、サイトの名称をつなげたバーチャルホスト毎に管理するようにしました。例えばブログを開発するなんてときは localblog とかにしてます。

ディレクトリは /Library/WebServer/localblog に app/ と public_html/ を設置。CakePHPの本体は /Library/WebServer/share/cake に置くようにしました。見通しが良くなって気持ちいいです。


バーチャルホストの設定は

  1. /etc/hosts に 127.0.0.1 localblog を追加
  2. 再起動
  3. /etc/apache2/httpd.conf のかなり下の方にある
    # Virtual hosts
    #Include /private/etc/apache2/extra/httpd-vhosts.conf

    ↑をこのように↓修正

    # Virtual hosts
    Include /private/etc/apache2/extra/my-httpd-vhosts.conf

  4. my-httpd-vhosts.confには
    <VirtualHost *:80>
        ServerAdmin sample@gmail.com
        DocumentRoot "/Library/WebServer/Documents"
        ServerName localhost
    #    ServerAlias www.dummy-host.example.com
        ErrorLog "/private/var/log/apache2/localhost.error_log"
        CustomLog "/private/var/log/apache2/localhost.access_log" common
    </VirtualHost>
    
    <VirtualHost *:80>
        ServerAdmin sample@gmail.com
        DocumentRoot "/Library/WebServer/localblog/public_html"
        ServerName localblog
        ErrorLog "/private/var/log/apache2/localblog.error_log"
        CustomLog "/private/var/log/apache2/localblog.access_log" common
        <Directory "/Library/WebServer/localblog/public_html">
            Order deny,allow
            Allow from all
        </Directory>
    </VirtualHost>
    
    と記述しました。

eclipseのプロジェクトもバーチャルホストで管理

これが一番きもちいい結果になりました。今までプロジェクトは cake と app01 と site01 てな感じで一つのサイトを開発してましたが、これが cake と localblog になったので快適です。しかも cake を直接見ることって殆ど無い(ソース上でF3押して出現場所にジャンプするのが便利)ですよね。

以上僕のローカル開発環境でした。

2011年5月3日火曜日

CakePHP 特定のModelだけconfigと違うPrefixを使う

CakePHPもWordPressも超便利だけど、例えばCakePHPで構築したWebアプリに、ニュースとかだけWordPressで投稿できたらいいなぁと思って試してみました。

テーブル名はCakePHPのPrefixが「cake_」でWordPress「wp_」だとします。

そもそも下記のようにやれば、Model自体は自身の名称とちがうテーブルは全然使えるんだけど
class Sample extends AppModel {
  public $useTable = 'example';
}

これだとPrefixが「cake_」前提なんですよね。無理矢理「wp_posts」とか指定すると「cake_wp_posts」で認識されてMissing Tableになっちゃう。

でも何とかできるでしょ〜、と思ってModelのソースをPrefixで検索したらすぐ出てきたww
↓これです。(cake/libs/model/model.phpの2827行目くらい)
function setDataSource($dataSource = null) {
  $oldConfig = $this->useDbConfig;

  if ($dataSource != null) {
   $this->useDbConfig = $dataSource;
  }
  $db =& ConnectionManager::getDataSource($this->useDbConfig);
  if (!empty($oldConfig) && isset($db->config['prefix'])) {
   $oldDb =& ConnectionManager::getDataSource($oldConfig);

   if (!isset($this->tablePrefix) || (!isset($oldDb->config['prefix']) || $this->tablePrefix == $oldDb->config['prefix'])) {
    $this->tablePrefix = $db->config['prefix'];
   }
  } elseif (isset($db->config['prefix'])) {
   $this->tablePrefix = $db->config['prefix'];
  }

  if (empty($db) || !is_object($db)) {
   return $this->cakeError('missingConnection', array(array('code' => 500, 'className' => $this->alias)));
  }
 }

$this->tablePrefix = $db->config['prefix']とかやってますね。このあたりを書き換えちゃえばいいわけで、自分のModel側で以下のようにしてみました。

class News extends AppModel {
 
 var $useTable = 'wp_posts';
 
 public function setDataSource(){
  parent::setDataSource();
  $this->tablePrefix = '';
 }
 
}

これでバッチリWordPress側のデータを取り扱えるはずです。