<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BPS株式会社 開発ブログ Beyond Perspective Solutions LTD.</title>
	<atom:link href="http://www.bpsinc.jp/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://www.bpsinc.jp/blog</link>
	<description>BPS株式会社（Beyond Perspective Solutions）のプログラマによる技術・開発などに関してのブログです</description>
	<lastBuildDate>Tue, 09 Mar 2010 08:00:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PowerShellを便利に使う</title>
		<link>http://www.bpsinc.jp/blog/archives/1216</link>
		<comments>http://www.bpsinc.jp/blog/archives/1216#comments</comments>
		<pubDate>Tue, 09 Mar 2010 08:00:58 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[Windows]]></category>
		<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1216</guid>
		<description><![CDATA[Windows Vista以降では、PowerShellが標準搭載されています。
慣れてくると、コマンドプロンプトよりもPowerShellの方がいろいろ便利です。とりあえず、うっかりlsと打っても大丈夫なのが一番重要。 [...]]]></description>
			<content:encoded><![CDATA[<p>Windows Vista以降では、PowerShellが標準搭載されています。</p>
<p>慣れてくると、コマンドプロンプトよりもPowerShellの方がいろいろ便利です。とりあえず、うっかりlsと打っても大丈夫なのが一番重要。</p>
<p>ただし、起動手順は<br />
・コマンドプロンプト： Windows + R → cmd<br />
・PowerShell： Windows + R → powershell<br />
このように、powershellと打ち込むのがめんどくさいですね。</p>
<p>そこで、ファイル名を指定して実行のショートカットに追加してしまいましょう。</p>
<p>C:/Users/baba/shortcuts などのフォルダを作り、その中にPowerShellへのショートカット「ps」という名前で作ります。<br />
ps → C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe</p>
<p>後は、環境変数のPATHにC:/Users/baba/shortcuts を追加すればOKです。</p>
<div id="attachment_1217" class="wp-caption aligncenter" style="width: 463px"><a href="http://www.bpsinc.jp/blog/wp-content/uploads/2010/03/path.png"><img src="http://www.bpsinc.jp/blog/wp-content/uploads/2010/03/path.png" alt="環境変数のPATHを設定" title="path" width="453" height="446" class="size-full wp-image-1217" /></a><p class="wp-caption-text">環境変数のPATHを設定</p></div>
<p>これで、Windows + R → ps でPowerShellが開くため、コマンドプロンプトを使う機会が減りそうです。<br />
ショートカットを作成する際、作業フォルダを指定できるのもポイントですね。</p>
<p>もちろん、PowerShell以外にもショートカットおき放題なので、ランチャーいらずです。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1216/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>プライバシーマーク取得</title>
		<link>http://www.bpsinc.jp/blog/archives/1212</link>
		<comments>http://www.bpsinc.jp/blog/archives/1212#comments</comments>
		<pubDate>Mon, 08 Mar 2010 11:42:13 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[馬場]]></category>
		<category><![CDATA[プライバシーマーク]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1212</guid>
		<description><![CDATA[早速プライバシーマークが届きました！
3日にBPSから速達で契約書を発送　→　6日にPマーク到着（ただし不在）なので、かなり迅速な手続きですね。
#今回も宅急便で届きましたが・・・　大丈夫かな？？
11日から正式に使える [...]]]></description>
			<content:encoded><![CDATA[<p>早速プライバシーマークが届きました！</p>
<div id="attachment_1213" class="wp-caption aligncenter" style="width: 290px"><a href="http://www.bpsinc.jp/blog/wp-content/uploads/2010/03/pmark.png"><img src="http://www.bpsinc.jp/blog/wp-content/uploads/2010/03/pmark.png" alt="Pマーク付与認定証" title="pmark" width="280" height="400" class="size-full wp-image-1213" /></a><p class="wp-caption-text">Pマーク付与認定証</p></div>
<p>3日にBPSから速達で契約書を発送　→　6日にPマーク到着（ただし不在）なので、かなり迅速な手続きですね。<br />
#今回も宅急便で届きましたが・・・　大丈夫かな？？</p>
<p>11日から正式に使えるので、名刺に組み込む準備中です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1212/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>いろいろなバージョン取得</title>
		<link>http://www.bpsinc.jp/blog/archives/1205</link>
		<comments>http://www.bpsinc.jp/blog/archives/1205#comments</comments>
		<pubDate>Sat, 06 Mar 2010 23:27:57 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[ClickOnce]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1205</guid>
		<description><![CDATA[バージョン情報と一口にいっても、実行ファイルのバージョン、DLLのバージョン、ClickOnceやインストーラのバージョンなど様々です。
バージョン情報ダイアログを作るために、これらのバージョンの取得方法を書いてみます。 [...]]]></description>
			<content:encoded><![CDATA[<p>バージョン情報と一口にいっても、実行ファイルのバージョン、DLLのバージョン、ClickOnceやインストーラのバージョンなど様々です。</p>
<p>バージョン情報ダイアログを作るために、これらのバージョンの取得方法を書いてみます。といってもコードで。</p>
<pre class="brush:csharp">
/// &#60;summary&#62;
/// ClickOnceで設定されたバージョンを取得
/// &#60;/summary&#62;
public static Version ClickOnceVersion
{
	if (!System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed)
	{
		return null;
	}
	return System.Deployment.Application.ApplicationDeployment
		.CurrentDeployment.CurrentVersion;
}

/// &#60;summary&#62;
/// 実行中のexeファイルのバージョンを取得
/// &#60;/summary&#62;
public static string AssemblyVersion
{
	return System.Windows.Forms.Application.ProductVersion;
}

/// &#60;summary&#62;
/// 実行中のexeファイルと同一ディレクトリにあるDLLの情報を取得
/// &#60;/summary&#62;
public static List&#60;System.Diagnostics.FileVersionInfo&#62; DllVersion
{
	var versions = new List&#60;System.Diagnostics.FileVersionInfo&#62;();

	//自身のファイルパスを取得し、同一ディレクトリのdllファイルを一覧する
	string path = System.IO.Path.GetDirectoryName(
		System.Windows.Forms.Application.ExecutablePath);
	foreach (string name in System.IO.Directory.GetFiles(path, "*.dll"))
	{
		System.Diagnostics.FileVersionInfo info =
			System.Diagnostics.FileVersionInfo.GetVersionInfo(name);
		versions.Add(info);
	}

	return versions;
}
</pre>
<p>このような感じで、バージョン情報ダイアログが作れそうです。<br />
※DLLのバージョン取得はもう少し工夫しないと問題がありそうですが・・・</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1205/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ApplicationDeployment</title>
		<link>http://www.bpsinc.jp/blog/archives/1201</link>
		<comments>http://www.bpsinc.jp/blog/archives/1201#comments</comments>
		<pubDate>Sat, 06 Mar 2010 00:21:36 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[ClickOnce]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1201</guid>
		<description><![CDATA[C#等のアプリで、自身がClickOnceでインストール・実行されているかをチェックするには、
System.Deployment.Application.ApplicationDeployment.IsNetworkD [...]]]></description>
			<content:encoded><![CDATA[<p>C#等のアプリで、自身がClickOnceでインストール・実行されているかをチェックするには、</p>
<p>System.Deployment.Application.ApplicationDeployment.IsNetworkDeployed</p>
<p>を調べます。</p>
<p>しかしこのプロパティ、普通に起動するとfalseが取得できますが、Visual Studioから起動するとなぜかフリーズすることがあります。ありました。</p>
<p>この場合は、ClickOnceアプリの実体が保存される　C:/Users/ユーザ名/AppData/Local/Apps/2.0　を削除して、コンピュータを再起動すると直るようです。直りました。</p>
<p>起動プロセスが複雑になるとたまに面倒ですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1201/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SSHでパスワードなしログイン</title>
		<link>http://www.bpsinc.jp/blog/archives/1197</link>
		<comments>http://www.bpsinc.jp/blog/archives/1197#comments</comments>
		<pubDate>Fri, 05 Mar 2010 00:18:44 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1197</guid>
		<description><![CDATA[SSHでパスワードなしログインするための環境構築で、基本的なところで躓いてしまいました。
■手順

ssh-keygen -t rsa で、パスフレーズなしのSSH鍵を生成する
~/.ssh/id_rsa.pub を、リ [...]]]></description>
			<content:encoded><![CDATA[<p>SSHでパスワードなしログインするための環境構築で、基本的なところで躓いてしまいました。</p>
<p>■手順</p>
<ol>
<li>ssh-keygen -t rsa で、パスフレーズなしのSSH鍵を生成する</li>
<li>~/.ssh/id_rsa.pub を、リモートホストにコピーする</li>
<li>リモートホストで、cat id_rsa &gt;&gt; ~/.ssh/authorized_keys する</li>
<li>リモートホストで、authorized_keys のパーミッションを600にする</li>
<li>ssh -i (IDファイル) (リモートホスト)</li>
</ol>
<p>だけなのですが、authorized_keys の所有者がrootになってしまっていました。<br />
パーミッションを600にしても、ownerが間違っていたらだめですよね・・・</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1197/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pマーク付与認定</title>
		<link>http://www.bpsinc.jp/blog/archives/1194</link>
		<comments>http://www.bpsinc.jp/blog/archives/1194#comments</comments>
		<pubDate>Wed, 03 Mar 2010 22:53:31 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1194</guid>
		<description><![CDATA[ずいぶん長いことかかってしまいましたが、ようやくプライバシーマーク付与認定通知が届きました。
来週からBPSはプライバシーマーク付与事業者になる予定です。
この区切りに、審査からの数ヶ月で変化した点を踏まえ、再度個人情報 [...]]]></description>
			<content:encoded><![CDATA[<p>ずいぶん長いことかかってしまいましたが、ようやくプライバシーマーク付与認定通知が届きました。<br />
来週からBPSはプライバシーマーク付与事業者になる予定です。</p>
<p>この区切りに、審査からの数ヶ月で変化した点を踏まえ、再度個人情報取り扱いのレビューを行っていこうと思います。<br />
引き続きよろしくお願いします。</p>
<p>#ところで、Pマーク事務局からの請求書・契約書がクロネコヤマトで届いたのですが、これって信書ですよね・・・？</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1194/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ethna_DBでfetchArrayのようなことをする</title>
		<link>http://www.bpsinc.jp/blog/archives/1183</link>
		<comments>http://www.bpsinc.jp/blog/archives/1183#comments</comments>
		<pubDate>Wed, 03 Mar 2010 00:33:50 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[Ethna]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1183</guid>
		<description><![CDATA[PHPでmysql_queryの結果オブジェクトは、mysql_fetch_row()しても良いですが、mysql_fetch_array()した方が便利ですよね。
※mysql_fetch_row()では、結果を通常の [...]]]></description>
			<content:encoded><![CDATA[<p>PHPでmysql_queryの結果オブジェクトは、mysql_fetch_row()しても良いですが、mysql_fetch_array()した方が便利ですよね。<br />
※mysql_fetch_row()では、結果を通常の配列で取得しますが、mysql_fetch_array()では、カラム名をキーにした連想配列で取得できます</p>
<p>EthnaでAppObjectを使わずにEthna_DBを直接たたく場合、結果オブジェクトはPEAR::DB_Resultオブジェクトです。<br />
これはfetchRow()のメソッドを持ちますが、fetchArray()は存在しません。<br />
<a href="http://pear.plus-server.net/package.database.db.db-result.fetchrow.html">http://pear.plus-server.net/package.database.db.db-result.fetchrow.html</a></p>
<p>カラム名をキーにした連想配列が欲しい場合、queryを投げる前にsetFetchMode(DB_FETCHMODE_ASSOC)を実行しておく必要があります。<br />
<a href="http://pear.plus-server.net/package.database.db.db-common.setfetchmode.html">http://pear.plus-server.net/package.database.db.db-common.setfetchmode.html</a></p>
<p>EthnaのデフォルトDBアダプタ、DB_PEARは、内部にPEAR::DBを持っているので、以下のようなコードを書けばOKです。</p>
<pre class="brush:php">
$db = $this-&#62;backend-&#62;getDB();
$db-&#62;db-&#62;setFetchMode(DB_FETCHMODE_ASSOC);
$res = $db-&#62;query($sql);
print_r($res-&#62;fetchRow());
</pre>
<p>※<a href="http://ethna.jp/ethna-document-dev_guide-db.html">http://ethna.jp/ethna-document-dev_guide-db.html</a>に<br />
<q>Ethnaの デフォルトの DB接続クラス(Ethna_DB_PEAR) はPEAR::DBを継承しているので</q><br />
と書いてありますが、継承ではなくて委譲なので、$db->db->setFetchMode()となります。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1183/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>dekiwikiで画面が真っ白に</title>
		<link>http://www.bpsinc.jp/blog/archives/1191</link>
		<comments>http://www.bpsinc.jp/blog/archives/1191#comments</comments>
		<pubDate>Tue, 02 Mar 2010 23:37:50 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[MindTouch Deki]]></category>
		<category><![CDATA[馬場]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1191</guid>
		<description><![CDATA[社内のサーバを仮想化したのに伴い、社内wikiとして使っているdekiwikiも環境移行しました。
dekiwikiは優れたツールですが、移行やバージョンアップはいまいち考えられていない感もありますね。
次のような手順で [...]]]></description>
			<content:encoded><![CDATA[<p>社内のサーバを仮想化したのに伴い、社内wikiとして使っているdekiwikiも環境移行しました。</p>
<p>dekiwikiは優れたツールですが、移行やバージョンアップはいまいち考えられていない感もありますね。<br />
次のような手順で移行しました。</p>
<p>・新サーバで、aptitudeから普通にdekiwikiをインストール（この際、DBパスワードなどを同じにしておく）<br />
・旧サーバのmysqlデータを、新サーバにコピー<br />
・/var/www/dekiwiki/attachments 以下を、新サーバにコピー</p>
<p>これで一通りは使えるようになります。<br />
インストール後はコントロールパネルからキャッシュの再構築が必要です。</p>
<p>ついでにmonoをバージョンアップしたせいか、動作が劇的に速くなりました。古いmonoはCPUをずっと食い散らかしていたので、何かバグがあったのでしょう。</p>
<p>しかし、新wikiでは以下の問題が発生しました。<br />
・検索すると画面が真っ白になる<br />
・コントロールパネル「削除済みファイル」を開くと画面が真っ白になる</p>
<p>これは2つの問題が複合していました。</p>
<p>まず削除済みファイルの件ですが、attachmentsの中身のコピーが不完全で、エラーになっていたようです。<br />
ファイルのインデックスはmysqlに保存されるため、インデックスが存在してファイル実体が無い場合、エラーになってしまいます。<br />
/var/log/dekiwiki/deki-api.log に表示されるエラーを参考にしながら、完全なコピーを実施します。万が一ファイルを無くしてしまっていたら、とりあえず同名ダミーファイルでもおいておけば良いかもしれません。</p>
<p>次に検索が出来ない件ですが、PHPのメモリ不足でした。<br />
php.iniでmemory_limit を16MBから64MBにしたら、無事検索できるようになりました。ページやファイル数が多くなっているため、結構メモリを食うのですね。</p>
<p>PHPエラーを出力する設定にしないと気づかないので注意が必要です。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1191/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQLのサブクエリを改善</title>
		<link>http://www.bpsinc.jp/blog/archives/1176</link>
		<comments>http://www.bpsinc.jp/blog/archives/1176#comments</comments>
		<pubDate>Tue, 02 Mar 2010 00:20:10 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[馬場]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1176</guid>
		<description><![CDATA[MySQLのサブクエリは、一見問題なさそうなものも相関サブクエリに置換されて、極端に遅くなることがありますね。
INを適切に処理できないのが原因らしいです。
なぜMySQLのサブクエリは遅いのか。
今回は、以下のような「 [...]]]></description>
			<content:encoded><![CDATA[<p>MySQLのサブクエリは、一見問題なさそうなものも相関サブクエリに置換されて、極端に遅くなることがありますね。<br />
INを適切に処理できないのが原因らしいです。</p>
<p><a href="http://nippondanji.blogspot.com/2009/03/mysql_25.html">なぜMySQLのサブクエリは遅いのか。</a></p>
<p>今回は、以下のような「ユーザごとにスコアの履歴を保持していて、最新のスコアが有効」というテーブル設計で、「全ユーザの最新スコア合計を取得」しようとして問題が起きました。</p>
<table border="1" caption="score_log">
<caption>score_log</caption>
<tr>
<th>id</th>
<td>int</td>
<td>primary key auto_increment</td>
</tr>
<tr>
<th>user_id</th>
<td>int</td>
<td>※外部キー</th>
</tr>
<tr>
<th>score</th>
<td>int</td>
<td>&nbsp;</td>
</tr>
</table>
<p>最初考えたSQLは以下のようなものです。<br />
ユーザごとの最新スコアIDを一括取得し、それに該当するスコアの合計を計算しました。</p>
<blockquote><p>
SELECT SUM(score_log.score) FROM score_log WHERE score_log.id IN (SELECT MAX(log2.id) FROM score_log AS log2 GROUP BY log2.user_id)
</p></blockquote>
<p>しかしこれだと、EXPLAINをつけると分かるように、DEPENDENT SUBQUERYになってしまいます。<br />
参考サイトによると、MySQLがINをEXISTSに変換する際に、相関サブクエリにしてしまっているようです。<br />
実行速度も、データ件数の二乗に比例し、極端に遅くなってしまいました。</p>
<p>結果的に、以下のクエリに変更して解決しました。</p>
<blockquote><p>
SELECT SUM(score_log.score) FROM score_log, (SELECT MAX(log2.id) id FROM score_log AS log2 GROUP BY log2.user_id) each_cur WHERE score_log.id = each_cur.id
</p></blockquote>
<p>ユーザごとの最新スコアIDの一覧をテーブルとして、それをFROMに使ってしまうというわけですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1176/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>fputcsvの問題点と改良</title>
		<link>http://www.bpsinc.jp/blog/archives/1172</link>
		<comments>http://www.bpsinc.jp/blog/archives/1172#comments</comments>
		<pubDate>Sun, 28 Feb 2010 23:20:22 +0000</pubDate>
		<dc:creator>baba</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[馬場]]></category>

		<guid isPermaLink="false">http://www.bpsinc.jp/blog/?p=1172</guid>
		<description><![CDATA[PHPのfputcsv関数は便利です。
しかし、以下のような点が不便です。
エンコーディングを変換できない
主にCSV出力の目的になるExcelでは、Shift-JIS以外のCSVを開けません。
Excel 2007なら [...]]]></description>
			<content:encoded><![CDATA[<p>PHPのfputcsv関数は便利です。<br />
しかし、以下のような点が不便です。</p>
<p><strong>エンコーディングを変換できない</strong><br />
主にCSV出力の目的になるExcelでは、Shift-JIS以外のCSVを開けません。<br />
Excel 2007ならBOMを付けるとか、データインポートで実行するといった回避策はありますが、日本語のみならShift-JISで出力したいことが多いと思います。</p>
<p>このためにはあらかじめShift-JISに変換しておく必要があり、</p>
<blockquote><p>
$sjis = array_map(create_function(&#8217;$str&#8217;, &#8216;return mb_convert_encoding($str, &#8220;Shift-JIS&#8221;, &#8220;UTF-8&#8243;);&#8217;), $line);
</p></blockquote>
<p>といった処理をやっていましたが、正直めんどうです。</p>
<p><strong>ダブルコーテーションのエスケープにバグがある</strong><br />
カンマが含まれる場合、ダブルコーテーションで囲ってくれます。<br />
ダブルコーテーションが含まれる場合、ダブルコーテーションを二重にしてエスケープしてくれます。<br />
しかし、\&#8221; （バックスラッシュ+ダブルコーテーション）があった場合、なぜかこの部分のダブルコーテーションは二重にしてくれません。</p>
<p>ということで、結局自前でやった方が便利です。<br />
mb_str_replaceは、<a href="http://fetus.k-hsu.net/document/programming/php/mb_str_replace.html">http://fetus.k-hsu.net/document/programming/php/mb_str_replace.html</a>を使わせて頂きました。</p>
<pre class="brush:php">
function _fputcsv($fp, $data, $toEncoding='Shift-JIS', $srcEncoding='UTF-8') {
	require_once 'mb_str_replace.php';

	$csv = '';
	foreach ($data as $col) {
		if (is_numeric($col)) {
			$csv .= $col;
		} else {
			$col = mb_convert_encoding($col, $toEncoding, $srcEncoding);
			$col = mb_str_replace('"', '""', $col, $toEncoding);
			$csv .= '"' . $col . '"';
		}
		$csv .= ',';
	}

	fwrite($fp, $csv);
	fwrite($fp, "\r\n");
}
</pre>
<p>ちゃんとテストしていないのでミスがあるかもしれませんが、このくらいシンプルで十分そうですね。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bpsinc.jp/blog/archives/1172/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
