XREAサーバへのsymfonyのインストール方法

symfonyで開発したWebアプリケーションをXREAサーバにインストールした時の作業内容をメモしておきます。
symfonyフレームワーク テスト置き場に記載されている手順を参考にしました。
1.pearのインストール
phpディレクトリに作成

$mkdir ~/php

http://pear.php.net/go-pearの内容をコピーして~/go-pear.phpとして保存して実行

1. Installation prefix : /usr/local
2. Binaries directory : $prefix/bin
3. PHP code directory ($php_dir) : $prefix/lib/php
4. Documentation base directory : $php_dir/docs
5. Data base directory […]

Movable Typeのカテゴリアーカイブにおいて特定のカテゴリを非表示にする

Movable Typeをポータルサイト的に使用していると、カテゴリアーカイブに特定のカテゴリを非表示にさせたいと思い、いろいろ調べていると、

に答えがあった。具体的には、FilterCategoriesというプラグインを使うと実現できます。FilterCategoriesプラグインは、Kevin Shayさんのサイト(Staggernation)からダウンロードできます。
例えば、「About」というカテゴリを除外する場合は「exclude」を使用し、

<MTTopLevelCategories>
<MTFilterCategories exclude="About"> ★追加
<MTSubCatIsFirst><ul classs="module-list"></MTSubCatIsFirst>


<MTSubCatIsLast></ul></MTSubCatIsLast>
</MTFilterCategories> ★追加
</MTTopLevelCategories>

となります。逆に「About」というカテゴリだけを表示する場合は、

<MTFilterCategories include="About">

となります。また、カテゴリを複数ある場合は、

<MTFilterCategories include="About|Music|Programming">

というようにORを意味するパイプ「|」で区切ればOKです。

SymfonyにおけるCONCATによる文字列検索

MySQLにてカラムを連結して文字列検索でMySQLのCONCAT関数を利用し、連結したカラムに対して文字列検索を行う方法を紹介しましたが、これをSymfonyに実装する方法を紹介します。
例えば、下記のように、

SELECT * FROM tablename WHERE colA like ‘%keyword%’

単にカラムAに対してkeywordで文字列検索するのであれば、

$c = new Criteria();
$c->add(TablenamePeer::COLA, ‘%keyword%’, Criteria::LIKE);
$Tablenames = TablenamePeer::doSelect($c);

とすればOKですが、下記のように、

SELECT * FROM tablename WHERE CONCAT(colA, colB) like ‘%keyword%’

CONCATを利用しようと思うと、

$con = sfContext::getInstance()->getDatabaseConnection(’propel’);
$query = "SELECT id FROM " .self::TABLE_NAME. " WHERE CONCAT(colA, colB) like ‘%keyword%’";
$stmt = $con->prepareStatement($query);
$rs = $stmt->executeQuery();

とする必要があります。
パラメータの指定方法の詳細はこちらのTable 8-1 - SQL and Criteria Object Syntaxにありますのでご参照ください。

YouTube with Symfony

Symfonyで開発中のアプリケーションにYouTubeの動画をマッシュアップしようと思い、Services_YouTubeを使おうとしたのですが、Strict Standardsを吐きまくり、対処が面倒になったので、PEARを使わないことにしました。そこで、

$url = "http://www.youtube.com/api2_rest?method=youtube.videos.list_by_category_and_tag&dev_id=". $apikey . "&category_id=15&tag=" . $tag;
$res = file_get_contents($url);
$xml = simplexml_load_string($res);
$items = $xml->xpath(’//video’);

として、$itemsから各種データを読みだそうとしましたが、XMLElementオブジェクトとなっているため、配列操作では当然ながら読み出せず、どうやったら読み出せるのだろうか?とネットを検索していると、答えが見つかりました。
そのままずばりarray型にキャストするのです。あまりにストレートだったので、かなり意表をつかれました。

foreach ($items as $item) {
$video = (array)$item;
// 各種データの読み出し
}

input conversion failed due to input error

お気に入りのYouTube動画を紹介しあうというコンセプトのSmile Cafeを運営しており、モデレータさんが運営するブログであるMy Video Cafeに、最新の動画エントリを5件表示しています。
その仕組みは、まずXOOPS側で投稿動画の最新エントリをRSSで配信し、そのRSSを受信してXML/Unserializerで解析・整形するツールを経由して、Movable TypeがJavaScriptでHTMLに埋め込むという感じです。
しかし、先日ブログ側に最新の投稿エントリが表示されないという現象が発生し、原因を調査していると、RSSを解析しているツールが

input conversion failed due to input error, bytes 0xAD 0xA1 0×3C 0×2F

というエラーを吐き出していました。結局、原因は文字コードEUC-JPで動作するXOOPSから配信されるRSS内にUTF-8には変換できない文字が含まれていたため、PEARのXML/Unserializer.phpが途中終了していたというもの。原因となった文字は、メールでもお馴染みの丸数字でした。
しょーがないので、ツール側でXML/Unserializerに渡す前に、

$data = mb_convert_encoding($data, "UTF-8", "EUC-JP");
$data = str_replace("EUC-JP", "UTF-8", $data);

文字コードを無理矢理UTF-8に変換し、charsetをUTF-8に置き換えました。これで途中終了はなくなり、めでたく(?)丸数字は「?」と表示されるようになりました。
本来ならば、正しいコードに変換してあげるべきかもしれないのですが、文字コードに詳しいわけでもない上、動画の投稿者が一般のユーザさんであるため、今後どのような文字で同じ現象が発生するかが予測できないので、このような対処をさせてもらいました。

MySQLにてカラムを連結して文字列検索

MySQLでカラムAとカラムBを連結して文字列検索したいのだが、どうしたらできるのだろうか?といろいろ調べていたら、回答は

にありました。つまり、concatenation(連結)を意味する”CONCAT”を使うと実現できます。例えば、colAとcolBを連結して、keyword検索したい場合、

SELECT * FROM tablename WHERE CONCAT(colA, colB) like ‘%keyword%’

となります。ただし、そのようなDB設計でいいのかを十分検討する必要がありますが。つまり、colAとcolBは連結したデータとして保持した方がいいのではないか?ということです。
私は迷った挙げ句、分離しておいた方が将来的に便利だと思えたので、上記のselect文を実装しました。

DB column types for Propel

以前からWebアプリケーションのちょっとしたアイデアがあり、ようやくその開発に着手できるようになりました。今回はsymfonyを使って開発しようとしているのですが、schema.xmlの作成中に早速データベースのカラムの型指定の方法がわかりませんでした。
ということで、早速ドキュメントへのリンク Propel Column Types です。
mysqlのtextは、propelではlongvarcharなのね。へぇ~、知らなかった。

Moosecandy for Google Adsense

を本屋で立ち読みしていると、エントリ内にGoogle Adsenseを表示するプラグイン、MooseCandyについての記載があった。早速試そうと思っていると、WordPress ME 2には対応してないことが判明。しかし、いろいろググっていると、MooseCandy2なるものが公開されているのを発見。
Moosecandy for WP 2.0+からダウンロードできます。
インストール方法は上記サイトに記載されている通り、
1.moosecandy.phpをpluginsディレクトリにアップロード
2.管理画面からプラグイン → プラグインエディタ でMoosecandyを選択
3.下記を置換
<置換前>

$candy[1] = ‘The Moose is Loose!’;
$candy[4] = ‘Is that REALLY an almond?’;

<置換後>

$candy[1] = <<<EOF
Google Adsenseのコード
EOF;

4.更新をクリック
5.Moosecandyプラグインを有効化
結果は本ブログの最新エントリにあります。
最初、最新10エントリにAdsenseを挿入しようと思いましたが、最新の2つ分にしか挿入されてませんでした。
恐らく、ページ当たりに表示できるAdsenseの上限が定められているように思います。

Google sitemap for WordPress

昨日のMovable Typeに引き続き、本日はWordPressでのGoogle sitemapの作成方法です。すばらしいことに、Wordpressではプラグインが公開されており、日本語化されています。しかもかなり高機能です。hiromasa.zoneでは設定内容について考察が記載されています。
Arne Brachholdさんのサイトから最新版をダウンロードできます(2007/05/04時点では2.7.1が最新)。
READMEに記載されている通り作業すれば、簡単にsitemap.xmlを作成できます。
1.解凍して、サーバのプラグインディレクトリにアップロード
2.トップディレクトリにsitemap.xmlとsitemap.xml.gzを作成し、パーミッションを書き込み可能に変更(606など)
3.プラグインを有効化
4.管理画面のオプション → Sitemapで再構築ボタンをクリック
5.Google sitemapにログインして、sitemap.xmlのURLを登録して、確認ボタンをクリック

Google Sitemap for Movable Type

MTブログのSEO対策としてGoogle Sitemap日本語版を利用すると効果があるらしいと聞いたので、作成方法を調べていたところ、自動生成するためのインデックステンプレートを公開されているサイトがありました。
ホームページ制作トータルウェブ
早速これを利用して、sitemap.xmlを作成し、Googleに登録しました。
#TOTAL WEB様、ありがとうございます。とても簡単にできました。
SEO対策としてどれほどの効果が出るのかが楽しみです。