page_adsence

2010年10月27日水曜日

さくらレンタルサーバではまった。

さくらレンタルサーバはもう使いたくないってくらいへんな仕様が多い・・・。
hoge.htmlというファイルがあって、「http://www.hogehoge.jp/hoge」のようなURLのリクエストがあった場合、
通常であれば404 Not Foundになるはずなのに、
拡張子の前までの文字のファイルを検索して、マッチしたファイルを表示してしまう。
つまり下記の2つは一緒のファイルが表示される。

http://www.hogehoge.jp/hoge
http://www.hogehoge.jp/hoge.html

この仕様のせいでsymfonyがうまく動かなくて、手間取った。
routing.ymlに書いてあるにも関わらず、デフォルトのルールにマッチしてしまい、
404 Not Foundになってしまうということが起きた。
apacheのmod_rewriteのせいとか色々疑ってみたけど、symfony内部の処理のせいだった。
sfWebRequest.class.phpの中を修正しないとちゃんと動かない。

/**
 * Retrieves the path info for the current web request.
 *
 * @return string Path info
 */
public function getPathInfo()
{
  $pathInfo = '';

  $pathArray = $this->getPathInfoArray();
  // simulate PATH_INFO if needed
  $sf_path_info_key = $this->options['path_info_key'];
  if ( !preg_match('/^(.*)\.php$/', $this->getScriptName(), $matched) ) unset($pathArray[$sf_path_info_key]);
  if (!isset($pathArray[$sf_path_info_key]) || !$pathArray[$sf_path_info_key])
  {
    if (isset($pathArray['REQUEST_URI']))
    {
      $qs = isset($pathArray['QUERY_STRING']) ? $pathArray['QUERY_STRING'] : '';
      $script_name = $this->getScriptName();
      if ( !preg_match('/^(.*)\.php$/', $script_name, $matched) ) $script_name .= '.php';
      else $script_name = $matched[1];
      $uri_prefix = $this->isAbsUri() ? $this->getUriPrefix() : '';
      $pathInfo = preg_replace('/^'.preg_quote($uri_prefix, '/').'/','',$pathArray['REQUEST_URI']);
      $pathInfo = preg_replace('/^'.preg_quote($script_name, '/').'/', '', $pathInfo);
      $prefix_name = preg_replace('#/[^/]+$#', '', $script_name);
      $pathInfo = preg_replace('/^'.preg_quote($prefix_name, '/').'/', '', $pathInfo);
      $pathInfo = preg_replace('/\??'.preg_quote($qs, '/').'$/', '', $pathInfo);
    }
  }
  else
  {
    $pathInfo = $pathArray[$sf_path_info_key];
    if ($relativeUrlRoot = $this->getRelativeUrlRoot())
    {
      $pathInfo = preg_replace('/^'.str_replace('/', '\\/', $relativeUrlRoot).'\//', '', $pathInfo);
    }
  }

  // for IIS
  if (isset($_SERVER['SERVER_SOFTWARE']) && false !== stripos($_SERVER['SERVER_SOFTWARE'], 'iis') && $pos = stripos($pathInfo, '.php'))
  {
    $pathInfo = substr($pathInfo, $pos + 4);
  }

  if (!$pathInfo)
  {
    $pathInfo = '/';
  }

  return $pathInfo;
}

上記のように赤文字になっている部分の処理を修正する必要がある。

2010年10月26日火曜日

apacheのmod_rewriteに関して

よく忘れるのでメモ。

mod_rewriteのQSAフラグ。
QSAとはQuery String Appendの略で、リクエスト時のURLに含まれているクエリストリングを書き換えたURLの後ろに引っ付けてくれるものである。
RewriteRule ^(.*)$ index.php [L]
RewriteRule ^(.*)$ index.php [QSA,L]

2010年10月23日土曜日

2010年10月19日火曜日

phpでtruncateが文字化けた

truncateの処理をPHPで実装してたら、切れ目の文字にマルチバイトがあると文字化けしてしまった。
mb_substrに文字コード指定してやると直るみたいでやってみたらちゃんと直りました。

if ( $length == 0 ) return '';
if ( mb_strlen($string) > $length ) return mb_substr($string, 0, $length, 'utf-8').'・・・';
else return $string;

2010年10月6日水曜日

doctrineでWhereとandWhereは書き分ける必要はない

doctrine使っていて、条件によってWhereを付加する場合に、WhereとandWhereを書き分けなきゃいけないと思ってたけど、
違うみたい。

$qeury = Doctrine_Query::create()->from('ModelName');
$qeury->andWhere('hoge = ?', $hoge);
$qeury->andWhere('fuga = ?', $fuga);

と、こうやって書いても問題なく動く。
Propelと違ってわかりずらいと思ったけど、まぁ解決したのでよしとする。

2010年10月4日月曜日

doctrineで実行されるSQLを事前に確認する方法

getSqlQueryで確認できる。

$q = Doctrine_Query::create();
$q->from('TableName');
echo $q->getSqlQuery();

doctrineでcreated_atとupdated_atに自動で日付を入れる方法

今回初めてdoctrineを使っていて、作成日と更新日に時間が自動で入っていないことに気づいた。
Propelの場合は何もしなくても、勝手に入れてくれていたが、doctrineはそうではないらしい。
調べてみるとschema.ymlに以下のような記述を追加すればできるみたい。

モデル名がTableName、テーブル名がtable_nameに対して自動で日付を入れる場合
config/doctrine/schema.ymlを開いて以下のように「actAs: { Timestampable: ~ }」の行を追加する。

TableName:
  actAs: { Timestampable: ~ }
  connection: doctrine
  tableName: table_name
  columns:
    table_id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
      :
      :

といった感じ。
Timestampableの値が「~」ってなってて、なんだこれと思ったけど、追加してみるとちゃんと動いた。
追加した後はモデルを再生成する。
そうするとBaseTableNameクラスのsetUpという関数の中に以下の記述が追加される。

$timestampable0 = new Doctrine_Template_Timestampable();
$this->actAs($timestampable0);

これで変更作業は完了。
あとはsaveメソッドで保存したものに関しては作成日付と更新日付が自動で挿入されるようになる。

2010年10月3日日曜日

GOM Playerの複数音声の切り替え方法

GOM PLAYERで複数の音声データ(通常音声とコメンタリーなど)を持つWMVやASFファイルを再生したとき、音声を選択できない、または強制的にコメンタリー(副音声)が再生されてしまう問題があります。
通常複数の音声データを持つMKVファイルやOGMファイルでは再生時に音声の切り替えが可能ですが、WMVの場合にこの操作をできない現象です。

複数の音声データを持つWMVファイル、ASFファイル再生時に強制的にコメンタリーが再生されてしまう場合には、下図の設定変更をしてWindows標準のフィルタ(コーデック)で再生すれば通常音声の再生が可能になります。
逆にコメンタリーを再生したい場合には、GOM PLAYER内蔵フィルタ(コーデック)で再生することで再生が可能になります。

※通常音声とコメンタリーを切り替える場合には、設定変更後にWMV(ASF)ファイルを改めて最初から再生する必要があります。

GOM PLAYER起動後[F5]キーを押して表示される、環境設定画面内の[フィルタ]画面にて設定をおこなってください。