Archive for 1月 2010

Yahoo!オークションで複数条件並べ替え

ヤフオクで、例えば

(1)現在価格が安い
(2)残り時間が少ない

とか、複数条件で並べかえって出来なかったんだっけ?
10年前くらいは出来なかったかな~?

ちょうど、ヤフオクAPIを使ってみたいと思ったので、もしなければ作成してみたいと思います。
おもに自分のためにですが・・・。

ついでに言えば、全カテゴリで(キーワード指定せず)、現在価格1円とかいう条件での検索も無理みたいですね?
そういうのやってる人いそうだけどなぁ?

誰でも使えるようにするので、要望募集中です。


Subverionの実運用で気付いたこと

ドキュメントやソースコードの管理にSubversionを使用しているが、
実際に運用しはじめてみると、色々な気付きがあったのでメモしておく。

複数プロジェクトか単一プロジェクトか

複数プロジェクトを一つのリポジトリで管理するのか、1プロジェクト1リポジトリにするのかは、以下のようなメリット・デメリットがある。

まず、複数プロジェクトを単一リポジトリで管理する場合のメリットは、Apacheの再起動や、svnadminコマンドをいちいち発行しなくても良い点。
デメリット?は
・プロジェクトから見たら、リビジョン番号が歯抜けになる

これはどういうことかと言うと、例えばAプロジェクトとBプロジェクトの2つのプロジェクトを1リポジトリで管理している場合、
それぞれ一番最初のコミットでは、
Aプロジェクト — Revision 1
Bプロジェクト — Revision 2
という番号になるが、次にAプロジェクトをコミットした場合は、Revision 3となり、
Aプロジェクトだけを見ている人にとっては、Revision 1の次はRevision 3となり、じゃあRevision 2はどこ行ったのよ?
という風に見えてしまう。
まぁ、リビジョン番号なんてほぼ気にしないんじゃないかとも思うが、気にするお客さんの場合もありえる。

・SVNParentPathと実際のリポジトリの間のフォルダもリポジトリにしなくてはいけない

複数プロジェクトを登録する根幹フォルダとして、mod_dav_svnのSVNParentPathを指定することによって、その配下にリポジトリをどんどん追加出来るが、
その根幹フォルダの下に一つ、分類用フォルダを作成し、その下にプロジェクトを作成したい場合が多いんじゃないか?と思った。
例えば、取引先ごとにフォルダを作成し、実際のプロジェクトはその下に、という場合とか。
以下は、分類用フォルダにプロジェクトA~Cの3つを作成したい場合。

ROOT(SVNParentPathで指定)
┗分類用フォルダ
  ┗プロジェクト A
  ┗プロジェクト B
  ┗プロジェクト C
  
こんな場合、この「分類用フォルダ」もmkdirしただけではダメで、svnadmin createで作成しないと、SVNクライアントからのコマンド発行時に、「No such file or directory」と怒られてしまう。
しかし、svnadmin createでは管理等に使用する以下のようなファイル・ディレクトリが作成されてしまう。

-rw-r--r--  1 apache apache  229  814  2008 README.txt
drwxr-xr-x  2 apache apache 4096  814  2008 conf
drwxr-xr-x  2 apache apache 4096  814  2008 dav
drwxr-sr-x  5 apache apache 4096  98  2008 db
-r--r--r--  1 apache apache    2  814  2008 format
drwxr-xr-x  2 apache apache 4096  814  2008 hooks
drwxr-xr-x  2 apache apache 4096  814  2008 locks

ここにはファイルを登録しないのに、こんな余計なファイルが出来てブラウザ経由で見たら見えちゃうのも嫌な感じだ。
apacheのリポジトリみたいに出来れば良いのだけれど、こんなファイル群がないし、単一プロジェクトの方針なのかな・・・。

単一リポジトリで管理するメリットは、SVNParentPathと実プロジェクトの間にリポジトリじゃないフォルダを作成出来るし、「conf」等のSVNが使用するファイル・ディレクトリも作成されない。つまり前述の逆だ。
デメリットも同じで、svnadminコマンドの発行とhttpd.confの修正とApacheの再起動が必要。

このデメリットはよくよく考えてみると別にデメリットでもないのかも。
プロジェクトが新たに作成されるという場合は、その規模にもよるかもしれないけど大規模なイベントなはずで、
それが追加されることはそう滅多にない。なので、Apacheを再起動するくらいの作業は必要なんじゃないかと。

こう考えると、1リポジトリ-1プロジェクトの運用のが良いんじゃないかと考えた。


XServerでPHP

今まで別サーバで動作していたPHPのプログラムがXServerに持って行ったらなぜか動かなくなった。

最初はmbstring関連の文字コードの問題かなと思い、以下の.htaccessを作成して実行してみたら500エラーが出る。

php_value mbstring.http_input auto 
php_value mbstring.http_output pass

なんかしれないけどXServerでは使えないんだな、とこの時は思ったけど・・・。

.htaccessが使えないと判断したので、コードの先頭に以下のように記載してエラーを出力するようにした。

@ini_set( 'display_errors', 'on' );

そしたら、どうもfputcsv()関数が実行できていない。というか定義されていないと怒られる。

Call to undefined function: fputcsv()

fputcsvという関数は比較的新しめの奴だったよな、と思ってマニュアルを見てみると、

fputcsv
(PHP 5 >= 5.1.0)
fputcsv — 行を CSV 形式にフォーマットし、ファイルポインタに書き込む

とあり、5.1以降ならOKとあるのでなぜだろうと思ってハマっていたら、XServerはphp4と5がどちらも使える環境で、
デフォルトが4で動くらしいというメモを見つけた。

エックスサーバーPHP ver.5で若干速くなった?

灯台もと暗し・・・。というかこういう基本的な部分はハマると深いよなぁ。
.htaccessを作成して無事動作を確認できた。

AddHandler x-httpd-php5 .php

ちなみに、前述で.htaccessでInteral Server Errorが出た件も、多分php4であることを意識することが必要なのだと思う。
以下のようにすれば動いた。

<IfModule mod_php4.c>
php_value mbstring.http_input           auto
php_value mbstring.http_output          UTF-8
</IfModule>

そして、そのfputcsv関数で出力したファイルを見たら、機種依存文字が化けていた。うーーーん。
内部的には文字コードはUTF-8で処理していたのですが、CSVファイルはExcelで見たいとの要望で、ファイル出力部分だけはSJISに変換して出力していました。
なぜなら、ExcelはSJISしか読めないからです。([XL2002] UTF-8 形式のテキスト ファイルが文字化けする)

文字コードは色々な部分で調整が必要なので、面倒だなと思って調べていたら、PHPで文字コードをSJISからUTF8に変換する方法
という記事があって、今まではUTF-8→SJISとやっていたのを以下のように変更してみましたらビンゴ!

mb_convert_encoding($value, "sjis-win", "UTF-8");

これで無事に機種依存文字もCSVに出力されるようになりました。