<?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>『株式会社シンプル・アイ』 ブログ &#187; 技術情報</title>
	<atom:link href="http://blog.simple-eye.com/cat/technology/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.simple-eye.com</link>
	<description>PHP+MySQLのWEBシステム開発の現場からお届け</description>
	<lastBuildDate>Sat, 10 Jul 2010 10:36:33 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>rpmファイルはここで取得できますね</title>
		<link>http://blog.simple-eye.com/archives/346</link>
		<comments>http://blog.simple-eye.com/archives/346#comments</comments>
		<pubDate>Sat, 10 Jul 2010 10:36:13 +0000</pubDate>
		<dc:creator>シンプル・アイ社長</dc:creator>
				<category><![CDATA[サーバ・ネットワーク]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[サーバ]]></category>

		<guid isPermaLink="false">http://blog.simple-eye.com/?p=346</guid>
		<description><![CDATA[各種OSのパッケージ等はここで取得できますね。
ftp://ftp.riken.jp/
CentOSなら、Linux　＝＞　centos　と進めばいい。
]]></description>
			<content:encoded><![CDATA[<p>各種OSのパッケージ等はここで取得できますね。</p>
<p><a href="ftp://ftp.riken.jp/" target="_blank">ftp://ftp.riken.jp/</a></p>
<p>CentOSなら、Linux　＝＞　centos　と進めばいい。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simple-eye.com/archives/346/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>64bitサーバのCentOS5.3にyumをインストールする</title>
		<link>http://blog.simple-eye.com/archives/341</link>
		<comments>http://blog.simple-eye.com/archives/341#comments</comments>
		<pubDate>Sat, 10 Jul 2010 08:47:08 +0000</pubDate>
		<dc:creator>シンプル・アイ社長</dc:creator>
				<category><![CDATA[サーバ・ネットワーク]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[yum]]></category>
		<category><![CDATA[インストール]]></category>
		<category><![CDATA[サーバ]]></category>

		<guid isPermaLink="false">http://blog.simple-eye.com/?p=341</guid>
		<description><![CDATA[お名前.comのVPS（６４ビット、CentOS５．３）にyumが入っていなかったのでインストールする。
http://www.onamae-server.com/vps/
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-elementtree-1.2.6-5.x86_64.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-iniparse-0.2.3-4.el5.noarch.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-sqlite-1.1.7-1.2.1.x86_64.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/m2crypto-0.16-6.el5.6.x86_64.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-urlgrabber-3.1.0-5.el5.noarch.rpm
rpm -ivh python-elementtree-1.2.6-5.x86_64.rpm
rpm -ivh python-iniparse-0.2.3-4.el5.noarch.rpm
rpm -ivh python-sqlite-1.1.7-1.2.1.x86_64.rpm
rpm -ivh m2crypto-0.16-6.el5.6.x86_64.rpm
rpm -ivh python-urlgrabber-3.1.0-5.el5.noarch.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rp
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/yum-3.2.22-26.el5.centos.noarch.rpm
rpm -ivh yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rpm \
yum-metadata-parser-1.1.2-3.el5.centos.x86_64 \
yum-3.2.22-26.el5.centos.noarch.rpm
でも、FAQをよくみたら、コントロールパネルで自動アップデートをOFFにするとyumがインストールされるようでした。。。
http://www.onamae-server.com/support/faq/vps/common/common_43.php
初期セットアップ時は、yumはインストールされていません。
yumはコントロールパネルにてアップデート方法を&#8221;アップデートなし&#8221;に変更するとインストールされます
http://www.onamae-server.com/vps/
]]></description>
			<content:encoded><![CDATA[<p>お名前.comのVPS（６４ビット、CentOS５．３）にyumが入っていなかったのでインストールする。<br />
http://www.onamae-server.com/vps/</p>
<blockquote><p>wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-elementtree-1.2.6-5.x86_64.rpm<br />
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-iniparse-0.2.3-4.el5.noarch.rpm<br />
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-sqlite-1.1.7-1.2.1.x86_64.rpm<br />
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/m2crypto-0.16-6.el5.6.x86_64.rpm<br />
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/python-urlgrabber-3.1.0-5.el5.noarch.rpm</p>
<p>rpm -ivh python-elementtree-1.2.6-5.x86_64.rpm<br />
rpm -ivh python-iniparse-0.2.3-4.el5.noarch.rpm<br />
rpm -ivh python-sqlite-1.1.7-1.2.1.x86_64.rpm<br />
rpm -ivh m2crypto-0.16-6.el5.6.x86_64.rpm<br />
rpm -ivh python-urlgrabber-3.1.0-5.el5.noarch.rpm</p>
<p>wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rp<br />
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/yum-metadata-parser-1.1.2-3.el5.centos.x86_64.rpm<br />
wget ftp://ftp.riken.jp/Linux/centos/5/os/x86_64/CentOS/yum-3.2.22-26.el5.centos.noarch.rpm</p>
<p>rpm -ivh yum-fastestmirror-1.1.16-14.el5.centos.1.noarch.rpm \<br />
yum-metadata-parser-1.1.2-3.el5.centos.x86_64 \<br />
yum-3.2.22-26.el5.centos.noarch.rpm</p></blockquote>
<p>でも、FAQをよくみたら、コントロールパネルで自動アップデートをOFFにするとyumがインストールされるようでした。。。</p>
<p>http://www.onamae-server.com/support/faq/vps/common/common_43.php</p>
<blockquote><p>初期セットアップ時は、yumはインストールされていません。<br />
yumはコントロールパネルにてアップデート方法を&#8221;アップデートなし&#8221;に変更するとインストールされます</p></blockquote>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">http://www.onamae-server.com/vps/</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.simple-eye.com/archives/341/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenPNEのインストールにはpdo_mysqlが必要</title>
		<link>http://blog.simple-eye.com/archives/307</link>
		<comments>http://blog.simple-eye.com/archives/307#comments</comments>
		<pubDate>Thu, 13 May 2010 15:04:19 +0000</pubDate>
		<dc:creator>シンプル・アイ社長</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[OpenPNE]]></category>
		<category><![CDATA[pdo_mysql]]></category>

		<guid isPermaLink="false">http://blog.simple-eye.com/?p=307</guid>
		<description><![CDATA[OpenPNEのインストールで、

./symfony openpne:install


を実行した際に、

Couldn&#8217;t locate driver named mysql


と怒られたなら、それはPHPにpdo_mysqlエクステンションが入っていないから。ソースディレクトリからエクステンションをコンパイルする。

cd /usr/local/src/php/php-5.2.5/ext/pdo_mysql/
phpize
./configure &#8211;with-php-config=/usr/local/php5/bin/php-config \
   &#8211;with-pdo-mysql=/usr/local/mysql5.0
make
make install


でインストールし、php.iniに、

extension=pdo_mysql.so


を加えてApacheリスタート。
起動ＯＫと出て、安心できない。ブラウザでPHPのページをみると閲覧できない。Apacheが起動していない。。。

php -i


で、確認しようとすると、

php: symbol lookup error: /usr/local/php5/lib/php/20060613/pdo_mysql.so:
   undefined symbol: php_pdo_declare_long_constant

とでる。これは、/usr/local/php5/include/php/ext/pdo/php_pdo_driver.hのバージョンがよろしくないようだ。PHPをソースインストールした際のソースディレクトリからコピーしてやる。

cp /usr/local/src/php/php-5.2.5/ext/pdo/php_pdo_driver.h \
   /usr/local/php5/include/php/ext/pdo/php_pdo_driver.h


いったんpdo_mysqlをアンインストールする。

rm -f /usr/local/php5/lib/php/20060613/pdo_mysql.so


上記、ソースから再度インストール。make cleanしてからね。これでApache再起動でいけました。OpnePNEもインストール完了。
]]></description>
			<content:encoded><![CDATA[<p>OpenPNEのインストールで、</p>
<blockquote><p>
./symfony openpne:install
</p>
</blockquote>
<p>を実行した際に、</p>
<blockquote><p>
Couldn&#8217;t locate driver named mysql
</p>
</blockquote>
<p>と怒られたなら、それはPHPにpdo_mysqlエクステンションが入っていないから。ソースディレクトリからエクステンションをコンパイルする。</p>
<blockquote><p>
cd /usr/local/src/php/php-5.2.5/ext/pdo_mysql/<br />
phpize<br />
./configure &#8211;with-php-config=/usr/local/php5/bin/php-config \<br />
   &#8211;with-pdo-mysql=/usr/local/mysql5.0<br />
make<br />
make install
</p>
</blockquote>
<p>でインストールし、php.iniに、</p>
<blockquote><p>
extension=pdo_mysql.so
</p>
</blockquote>
<p>を加えてApacheリスタート。<br />
起動ＯＫと出て、安心できない。ブラウザでPHPのページをみると閲覧できない。Apacheが起動していない。。。</p>
<blockquote><p>
php -i
</p>
</blockquote>
<p>で、確認しようとすると、</p>
<blockquote><p>
php: symbol lookup error: /usr/local/php5/lib/php/20060613/pdo_mysql.so:<br />
   undefined symbol: php_pdo_declare_long_constant</pre>
</blockquote>
<p>とでる。これは、/usr/local/php5/include/php/ext/pdo/php_pdo_driver.hのバージョンがよろしくないようだ。PHPをソースインストールした際のソースディレクトリからコピーしてやる。</p>
<blockquote><p>
cp /usr/local/src/php/php-5.2.5/ext/pdo/php_pdo_driver.h \<br />
   /usr/local/php5/include/php/ext/pdo/php_pdo_driver.h
</p>
</blockquote>
<p>いったんpdo_mysqlをアンインストールする。</p>
<blockquote><p>
rm -f /usr/local/php5/lib/php/20060613/pdo_mysql.so
</p>
</blockquote>
<p>上記、ソースから再度インストール。make cleanしてからね。これでApache再起動でいけました。OpnePNEもインストール完了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simple-eye.com/archives/307/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>preg_matchのサブキャッチパターンの文字数が多いと落ちます！！</title>
		<link>http://blog.simple-eye.com/archives/298</link>
		<comments>http://blog.simple-eye.com/archives/298#comments</comments>
		<pubDate>Sun, 02 May 2010 15:15:39 +0000</pubDate>
		<dc:creator>シンプル・アイ社長</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[問題]]></category>

		<guid isPermaLink="false">http://blog.simple-eye.com/?p=298</guid>
		<description><![CDATA[PHPのpreg_matchにおいて、カッコを使って、サブキャッチパターンを作ることがあるだろう。ただ、そのサブキャッチパターンにマッチする文字数（バイト数）が10万文字（バイト）を超えると、エラーも発生させず、ただ単に、「マッチせずに」終了となる。（PHP５．２．５にて検証）　以下にサンプルコードを示す。
&#60;?php
for ( $i=1; $i&#60;=1000000000; $i++ ) {
$src .= &#8216;1234567890&#8242;;
 if ( !preg_match( &#8216;/&#60;(.+?)&#62;/&#8217;, &#8216;&#60;&#8217;.$src.&#8217;&#62;&#8217;, $matches ) ) {
  echo &#8220;not match at &#8220;.$i;
  break;
 }
}
?&#62;
&#60;?php
for ( $i=1; $i&#60;=1000000000; $i++ ) {
$src .= &#8216;1234567890&#8242;;
if ( !preg_match( &#8216;/&#60;(.+?)&#62;/&#8217;, &#8216;&#60;&#8217;.$src.&#8217;&#62;&#8217;, $matches ) ) {
echo &#8220;not match at &#8220;.$i;
break;
}
}
?&#62;
上記コードでは、決して「not match at ???」とは表示されることはないように思われるだろう。しかし実際はそうではない。実行してしばらく待つと以下の結果が出る。

not match at 10000

(.+?)というサブキャッチパターンにマッチする文字列が、10000×10文字＝10万文字になった時点で、マッチしなくなり、echoして、breakしていることが分かるはずだ。ちなみに、以下のコードでは、どうだろう。
&#60;?php
for ( $i=1; [...]]]></description>
			<content:encoded><![CDATA[<p>PHPのpreg_matchにおいて、カッコを使って、サブキャッチパターンを作ることがあるだろう。ただ、そのサブキャッチパターンにマッチする文字数（バイト数）が10万文字（バイト）を超えると、エラーも発生させず、ただ単に、「マッチせずに」終了となる。（PHP５．２．５にて検証）　以下にサンプルコードを示す。</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;?php</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">for ( $i=1; $i&lt;=1000000000; $i++ ) {</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">$src .= &#8216;1234567890&#8242;;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>if ( !preg_match( &#8216;/&lt;(.+?)&gt;/&#8217;, &#8216;&lt;&#8217;.$src.&#8217;&gt;&#8217;, $matches ) ) {</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span> echo &#8220;not match at &#8220;.$i;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span> break;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"><span style="white-space: pre;"> </span>}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">}</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">?&gt;</div>
<blockquote><p>&lt;?php<br />
for ( $i=1; $i&lt;=1000000000; $i++ ) {<br />
$src .= &#8216;1234567890&#8242;;<br />
if ( !preg_match( &#8216;/&lt;(.+?)&gt;/&#8217;, &#8216;&lt;&#8217;.$src.&#8217;&gt;&#8217;, $matches ) ) {<br />
echo &#8220;not match at &#8220;.$i;<br />
break;<br />
}<br />
}<br />
?&gt;</p></blockquote>
<p>上記コードでは、決して「not match at ???」とは表示されることはないように思われるだろう。しかし実際はそうではない。実行してしばらく待つと以下の結果が出る。</p>
<blockquote>
<div>not match at 10000</div>
</blockquote>
<p>(.+?)というサブキャッチパターンにマッチする文字列が、10000×10文字＝10万文字になった時点で、マッチしなくなり、echoして、breakしていることが分かるはずだ。ちなみに、以下のコードでは、どうだろう。</p>
<blockquote><p>&lt;?php<br />
for ( $i=1; $i&lt;=1000000000; $i++ ) {<br />
$src .= &#8216;1234567890&#8242;;<br />
$src2 .= &#8216;1234567890&#8242;;<br />
if ( !preg_match( &#8216;/&lt;(.+?)&gt;&lt;(.+?)&gt;/&#8217;, &#8216;&lt;&#8217;.$src.&#8217;&gt;&lt;&#8217;.$src2.&#8217;&gt;&#8217;, $matches ) ) {<br />
echo &#8220;not match at &#8220;.$i;<br />
break;<br />
}<br />
}<br />
?&gt;</p></blockquote>
<p>上記の場合、以下のような結果となる。</p>
<blockquote><p>not match at 5000</p></blockquote>
<p>おわかりだろう。やはり10万文字だ。(5000×10文字)＋(5000×10文字)＝10万文字なのである。</p>
<p>そんな長い文字をサブキャッチなんかしないといわれるかもしれない。しかし、私がこれに気付いたのは、XML-RPCのリクエストのパースを実装していた時だ。XML-RPCで、データを登録するリクエストにおいて、&lt;base64&gt;&lt;/base64&gt;タグで、画像データを受け取った際に、preg_matchのサブキャッチパターンで中身を取得したのだ。結果、大きな画像を受け取ったときに、マッチしないという事態に陥ったのだ。</p>
<p>たちが悪いのは、エラーをはいてプログラムが停止するのではなく、単にマッチしなくなって次の処理に進んでしまうことだ。ぜひ、気をつけていただきたい。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simple-eye.com/archives/298/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>携帯３キャリアの絵文字コンバータをつくった</title>
		<link>http://blog.simple-eye.com/archives/291</link>
		<comments>http://blog.simple-eye.com/archives/291#comments</comments>
		<pubDate>Wed, 28 Apr 2010 13:48:59 +0000</pubDate>
		<dc:creator>シンプル・アイ社長</dc:creator>
				<category><![CDATA[携帯]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[WEBサーバ]]></category>
		<category><![CDATA[変換]]></category>
		<category><![CDATA[絵文字]]></category>

		<guid isPermaLink="false">http://blog.simple-eye.com/?p=291</guid>
		<description><![CDATA[うちのフレームワークの絵文字コンバータ機能を再作成しました。３キャリアのSJISのページから送られてくる絵文字をmbstring.encoding_translationで、内部エンコードのUTF-8に変換したのちに、絵文字を [emoji:E123] のような内部で扱う形式に変換し、ＤＢに保存する。ＰＣサイトの出力時には、&#60;img&#62;で絵文字画像を出力し、各携帯キャリアに出力する際には、各キャリアの絵文字に変換して出力する機能です。
絵文字のバイナリと絵文字タグの相互変換をするための変換テーブルをどのような形式にしようかとだいぶ模索しました。
■フォームからやってくる絵文字を内部用の絵文字タグに変換する実装
DoCoMo
フォームからのSJIS絵文字＝＞UTF-8に変換＝＞※置換実行※＜＝UTF-8に変換＜＝unicodeの16進数をpack
EzWeb
フォームからのSJIS絵文字＝＞UTF-8に変換＝＞※置換実行※＜＝UTF-8に変換＜＝Shift-JISの16進数をpack
Softbank
フォームからのSJIS絵文字＝＞UTF-8に変換＝＞※置換実行※＜＝UTF-8に変換＜＝Shift-JISの16進数をpack
■内部用絵文字タグを絵文字に変換して携帯に出力する実装
DoCoMo
絵文字タグ＝＞※置換実行※＜＝UTF-8に変換＜＝unicodeの16進数をpack
※置換実行※＝＞SJIS-winに変換
EzWeb
絵文字タグ＝＞※置換実行※＜＝UTF-8に変換＜＝Shift-JISの16進数をpack
※置換実行※＝＞SJIS-winに変換
Softbank
絵文字タグ＝＞※置換実行※＜＝UTF-8に変換＜＝Shift-JISの16進数をpack
※置換実行※＝＞SJIS-winに変換
■実装する中でわかったこと
ドコモ絵文字は、mb_encoding_translationで、unicodeからSJIS-winや、UTF-8に変換して、それぞれの文字コードで表示できる。しかし、EzWebやSoftbankの絵文字では、unicodeから、SJIS-winや、UTF-8に変換しても、各エンコードの絵文字配列が異なるせいか、各エンコードで同じ絵文字を表示させることができない、というより文字化けとなる。したがって、サイトのHTML出力で使うエンコードの１６進数を使ってバイナリを作り、それをmb_encoding_translationで変換してやる必要がある。（フォームからやってくる絵文字は、mbstring.encoding_translationで変換されているので。）


]]></description>
			<content:encoded><![CDATA[<p>うちのフレームワークの絵文字コンバータ機能を再作成しました。３キャリアのSJISのページから送られてくる絵文字をmbstring.encoding_translationで、内部エンコードのUTF-8に変換したのちに、絵文字を [emoji:E123] のような内部で扱う形式に変換し、ＤＢに保存する。ＰＣサイトの出力時には、&lt;img&gt;で絵文字画像を出力し、各携帯キャリアに出力する際には、各キャリアの絵文字に変換して出力する機能です。</p>
<p>絵文字のバイナリと絵文字タグの相互変換をするための変換テーブルをどのような形式にしようかとだいぶ模索しました。</p>
<p><strong><span style="color: #000000;">■フォームからやってくる絵文字を内部用の絵文字タグに変換する実装</span></strong></p>
<blockquote><p><strong>DoCoMo</strong></p>
<p>フォームからのSJIS絵文字＝＞UTF-8に変換＝＞※置換実行※＜＝UTF-8に変換＜＝unicodeの16進数をpack</p>
<p><strong>EzWeb</strong></p>
<p>フォームからのSJIS絵文字＝＞UTF-8に変換＝＞※置換実行※＜＝UTF-8に変換＜＝Shift-JISの16進数をpack</p>
<p><strong>Softbank</strong></p>
<p>フォームからのSJIS絵文字＝＞UTF-8に変換＝＞※置換実行※＜＝UTF-8に変換＜＝Shift-JISの16進数をpack</p></blockquote>
<h3 style="font-size: 1.17em;"><strong><span style="color: #000000;">■内部用絵文字タグを絵文字に変換して携帯に出力する実装</span></strong></h3>
<blockquote><p><strong>DoCoMo</strong></p>
<p>絵文字タグ＝＞※置換実行※＜＝UTF-8に変換＜＝unicodeの16進数をpack<br />
※置換実行※＝＞SJIS-winに変換</p>
<p><strong>EzWeb</strong></p>
<p>絵文字タグ＝＞※置換実行※＜＝UTF-8に変換＜＝Shift-JISの16進数をpack<br />
※置換実行※＝＞SJIS-winに変換</p>
<p><strong>Softbank</strong></p>
<p>絵文字タグ＝＞※置換実行※＜＝UTF-8に変換＜＝Shift-JISの16進数をpack<br />
※置換実行※＝＞SJIS-winに変換</p></blockquote>
<h3 style="font-size: 1.17em;"><strong><span style="color: #000000;">■実装する中でわかったこと</span></strong></h3>
<p><span style="color: #000000;">ドコモ絵文字は、mb_encoding_translationで、unicodeからSJIS-winや、UTF-8に変換して、それぞれの文字コードで表示できる。しかし、EzWebやSoftbankの絵文字では、unicodeから、SJIS-winや、UTF-8に変換しても、各エンコードの絵文字配列が異なるせいか、各エンコードで同じ絵文字を表示させることができない、というより文字化けとなる。したがって、サイトのHTML出力で使うエンコードの１６進数を使ってバイナリを作り、それをmb_encoding_translationで変換してやる必要がある。（フォームからやってくる絵文字は、mbstring.encoding_translationで変換されているので。）</span></p>
<p><span style="color: #000000;"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simple-eye.com/archives/291/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XREAやCORESERVERのsession_start()でエラー</title>
		<link>http://blog.simple-eye.com/archives/289</link>
		<comments>http://blog.simple-eye.com/archives/289#comments</comments>
		<pubDate>Mon, 12 Apr 2010 02:00:54 +0000</pubDate>
		<dc:creator>シンプル・アイ社長</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[CORESERVER]]></category>
		<category><![CDATA[XREA]]></category>

		<guid isPermaLink="false">http://blog.simple-eye.com/?p=289</guid>
		<description><![CDATA[XREAやCORESRVERのPHPで、モジュール版とCGI版のPHPを合わせて使って、セッションが引き継がれると以下のようなエラーが出る。
Warning: session_start() [function.session-start]:  open(/tmp/sess_ｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘ, O_RDWR) failed: Permission denied  (13) in  /virtual/ｘｘｘｘ/public_html/index.php on  line xx
これはCGI版では、セッションファイルが、/tmp/にて、FTPユーザー権限で書きこまれ、一方モジュール版ではApacheユーザー権限で書きこまれるからだ。それで、CGI版PHPで作成されたセッションファイルをモジュール版PHPから読み込む際にパーミッションエラーとなるのだ。逆もまたしかり。
]]></description>
			<content:encoded><![CDATA[<p>XREAやCORESRVERのPHPで、モジュール版とCGI版のPHPを合わせて使って、セッションが引き継がれると以下のようなエラーが出る。</p>
<blockquote><p><strong>Warning</strong>: session_start() [<a href="http://www.shinko-grandsha.jp/contact/function.session-start">function.session-start</a>]:  open(/tmp/sess_ｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘｘ, O_RDWR) failed: Permission denied  (13) in  <strong>/virtual/ｘｘｘｘ/public_html/index.php</strong> on  line <strong>xx</strong></p></blockquote>
<p>これはCGI版では、セッションファイルが、/tmp/にて、FTPユーザー権限で書きこまれ、一方モジュール版ではApacheユーザー権限で書きこまれるからだ。それで、CGI版PHPで作成されたセッションファイルをモジュール版PHPから読み込む際にパーミッションエラーとなるのだ。逆もまたしかり。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simple-eye.com/archives/289/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TeraTermのマクロ。adminでログインして、rootにsu-。</title>
		<link>http://blog.simple-eye.com/archives/269</link>
		<comments>http://blog.simple-eye.com/archives/269#comments</comments>
		<pubDate>Fri, 02 Apr 2010 10:07:03 +0000</pubDate>
		<dc:creator>シンプル・アイ社長</dc:creator>
				<category><![CDATA[ツール]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[TeraTerm]]></category>
		<category><![CDATA[マクロ]]></category>

		<guid isPermaLink="false">http://blog.simple-eye.com/?p=269</guid>
		<description><![CDATA[TeraTermのマクロはとても便利だ。ログイン時の処理から、ログイン後のシェル実行までいろいろ使える。今回は、adminでログインして、rootにsu-してパスワード入力するマクロだ。
以下のようなフォルダを作り、そこをTeraTermのマクロを格納することにする。
C:\TTmacro
まずはそこにSSHログイン用の処理を記述したマクロを「ssh_login.ttl」という名前で作り、それを環境ごとのマクロからincludeする。
strcompare conn_method &#8217;ssh&#8217;
ssh_method = !result
strcompare conn_method &#8217;ssh1&#8242;
ssh1_method = !result
strcompare conn_method &#8217;ssh2&#8242;
ssh2_method = !result
if ssh_method then
conn_str = &#8216;/ssh&#8217;
elseif ssh1_method then
conn_str = &#8216;/ssh /1&#8242;
elseif ssh2_method then
conn_str = &#8216;/ssh /2&#8242;
endif
strlen key_file
exist_key_file = result
if exist_key_file then
sprintf &#8216;%s:%s %s /LA=%s /KT=%s /KR=%s /auth=publickey /user=%s /passwd=%s /keyfile=&#8221;%s%s&#8221;&#8216; hostname conn_port conn_str language kanji_transmit kanji_receive username password work_dir key_file
else
sprintf &#8216;%s:%s %s /LA=%s /KT=%s [...]]]></description>
			<content:encoded><![CDATA[<p>TeraTermのマクロはとても便利だ。ログイン時の処理から、ログイン後のシェル実行までいろいろ使える。今回は、adminでログインして、rootにsu-してパスワード入力するマクロだ。</p>
<p>以下のようなフォルダを作り、そこをTeraTermのマクロを格納することにする。</p>
<blockquote><p>C:\TTmacro</p></blockquote>
<p>まずはそこにSSHログイン用の処理を記述したマクロを「ssh_login.ttl」という名前で作り、それを環境ごとのマクロからincludeする。</p>
<blockquote><p>strcompare conn_method &#8217;ssh&#8217;<br />
ssh_method = !result<br />
strcompare conn_method &#8217;ssh1&#8242;<br />
ssh1_method = !result<br />
strcompare conn_method &#8217;ssh2&#8242;<br />
ssh2_method = !result</p>
<p>if ssh_method then<br />
conn_str = &#8216;/ssh&#8217;<br />
elseif ssh1_method then<br />
conn_str = &#8216;/ssh /1&#8242;<br />
elseif ssh2_method then<br />
conn_str = &#8216;/ssh /2&#8242;<br />
endif</p>
<p>strlen key_file<br />
exist_key_file = result</p>
<p>if exist_key_file then<br />
sprintf &#8216;%s:%s %s /LA=%s /KT=%s /KR=%s /auth=publickey /user=%s /passwd=%s /keyfile=&#8221;%s%s&#8221;&#8216; hostname conn_port conn_str language kanji_transmit kanji_receive username password work_dir key_file<br />
else<br />
sprintf &#8216;%s:%s %s /LA=%s /KT=%s /KR=%s /auth=password /user=%s /passwd=%s&#8217; hostname conn_port conn_str language kanji_transmit kanji_receive username password<br />
endif</p>
<p>conn_param = inputstr<br />
connect conn_param</p></blockquote>
<p>次に、各ログイン先ごとのマクロを書く。例として192.168.1.5のサーバに公開鍵方式でadminでログイン後、rootにsu-するマクロ「root@192.168.1.5.ttl」を示す。秘密キー「id_rsa」をマクロ格納フォルダにおく。</p>
<blockquote><p>; 設定<br />
work_dir = &#8216;C:\TTmacro\&#8217;<br />
hostname = &#8216;192.168.1.5&#8242;<br />
username = &#8216;admin&#8217;<br />
password = &#8216;adminpassword&#8217;<br />
root_password = &#8216;rootpassword&#8217;<br />
key_file = &#8216;id_rsa&#8217;</p>
<p>; 言語 E:英語 J:日本語 K:韓国語 R:ロシア語 U:UTF-8<br />
language = &#8216;J&#8217;<br />
; 漢字コード受信 SJIS EUC JIS UTF8 UTF8m KS5601<br />
kanji_transmit = &#8216;UTF8&#8242;<br />
; 漢字コード送信 SJIS EUC JIS UTF8 KS5601<br />
kanji_receive = &#8216;UTF8&#8242;<br />
; SSHバージョン。 ssh or ssh1 or ssh2<br />
conn_method = &#8217;ssh&#8217;<br />
conn_port = &#8216;22&#8242;</p>
<p>; SSHログインを実行する<br />
ssh_login_ttl = &#8217;ssh_login.ｔｔｌ&#8217;<br />
ssh_login_ttl_path = work_dir<br />
strconcat ssh_login_ttl_path ssh_login_ttl<br />
include ssh_login_ttl_path</p>
<p>; ここからはログイン後の処理<br />
wait username<br />
sendln &#8217;su -&#8217;<br />
wait &#8216;Password:&#8217;<br />
sendln root_password</p></blockquote>
<p>秘密キーのファイル指定「key_file」を空にすると通常のパスワード認証になる。</p>
<p>.ttlファイルがTTPMACRO.EXEに関連付けられていなければ、</p>
<blockquote><p>マクロファイルを右クリック =&gt; 「プロパティ」 =&gt; プログラムの「変更」ボタン =&gt; TTPMACRO.EXEを選択</p></blockquote>
<p>とする。これで、マクロファイルをダブルクリックするだけで、TeraTermの自動ログインができるようになった。</p>
<p>LogMeTTや、TeraTerm Menuなどで、こうしたマクロを利用するとさらに便利である。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simple-eye.com/archives/269/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>パソコンの遠隔操作にいいね</title>
		<link>http://blog.simple-eye.com/archives/266</link>
		<comments>http://blog.simple-eye.com/archives/266#comments</comments>
		<pubDate>Wed, 31 Mar 2010 15:02:30 +0000</pubDate>
		<dc:creator>シンプル・アイ社長</dc:creator>
				<category><![CDATA[ツール]]></category>
		<category><![CDATA[ソフトウェア]]></category>
		<category><![CDATA[遠隔操作]]></category>

		<guid isPermaLink="false">http://blog.simple-eye.com/?p=266</guid>
		<description><![CDATA[ＰＣの遠隔操作にTeamViewerというソフトがよさそうだ。
http://www.teamviewer.com/ja/index.aspx
インストールしたPC同士、IDとパスワードで遠隔操作できる。
ファイル転送もできちゃう。商用利用でなければ無料。
商用利用の場合はライセンスを購入する。
http://www.teamviewer.com/ja/licensing/index.aspx
上手に利用したい。
]]></description>
			<content:encoded><![CDATA[<p>ＰＣの遠隔操作にTeamViewerというソフトがよさそうだ。</p>
<p><a href="http://www.teamviewer.com/ja/index.aspx">http://www.teamviewer.com/ja/index.aspx</a></p>
<p>インストールしたPC同士、IDとパスワードで遠隔操作できる。<br />
ファイル転送もできちゃう。商用利用でなければ無料。<br />
商用利用の場合はライセンスを購入する。</p>
<p><a href="http://www.teamviewer.com/ja/licensing/index.aspx">http://www.teamviewer.com/ja/licensing/index.aspx</a></p>
<p><a href="http://www.teamviewer.com/ja/licensing/index.aspx"></a>上手に利用したい。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simple-eye.com/archives/266/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPでFTP通信する際の注意</title>
		<link>http://blog.simple-eye.com/archives/256</link>
		<comments>http://blog.simple-eye.com/archives/256#comments</comments>
		<pubDate>Tue, 30 Mar 2010 05:34:37 +0000</pubDate>
		<dc:creator>シンプル・アイ社長</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[サーバ・ネットワーク]]></category>
		<category><![CDATA[FTP]]></category>

		<guid isPermaLink="false">http://blog.simple-eye.com/?p=256</guid>
		<description><![CDATA[PHPでftp_put()関数などでFTP通信をする際に、
Warning:  ftp_put() [function.ftp-put]: Ok  to send data. in /path/to/script.php on line 99
のようなエラーに出くわすことはないだろうか。この場合、PHPが動作しているマシンのiptablesに注意が必要である。FTPログインはできたものの、相手からデータ通信のコネクションが張れないままタイムアウトしているのであろう。
通信相手のFTPサーバがアクティブモードで動作している場合、こちらから相手FTPサーバの２１番ポートにコネクトしたのち、相手FTPサーバの２０番ポートから、 こちらが通知した1024-65535の間のポートにコネクトしようとしてくる。
なので、こちら（PHPが動作しているマシン）のiptablesのINPUTチェーンで制限を加えている場合、INPUTチェーンでは、 1024-65535の間のポートが空いている必要が出てしまう。
これはあまりにも危険だし、その必要もない。以下のようにする。
iptables -L
を行い、INPUTチェーンに
ACCEPT  all  &#8211;  anywhere  anywhere  state RELATED,ESTABLISHED
の行があることを確認する。これは、確立済みのコネクションと、関連するコネクションを許可するものだ。なければ以下のように作る。
iptables -I INPUT 5 -p udp -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT
上記、5の部分は挿入するINPUTチェーンの行番号です。
次にiptables関連のカーネルモジュールを確認する。
lsmod
を実行し、ip_conntrack_ftpと、ip_nat_ftpの行があることを確認し、ないものを入れる。それぞれ以下の通り。（多くの場合、ip_conntrack_ftpは入っている。）
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
これで、アクティブモードのFTPサーバに対して、PHPでFTP通信ができるようになった。
このままではサーバが再起動したら元に戻ってしまう。
/etc/sysconfig/iptables-config
で、使用するモジュールを以下のように設定する。
IPTABLES_MODULES=&#8221;ip_nat_ftp&#8221;
また、先のiptables設定を保存する。
service iptables save

IPTABLES_MODULES=&#8221;ip_nat_ftp
]]></description>
			<content:encoded><![CDATA[<p>PHPでftp_put()関数などでFTP通信をする際に、</p>
<blockquote><p><strong>Warning</strong>:  ftp_put() [<a href="http://219.94.179.46/function.ftp-put">function.ftp-put</a>]: Ok  to send data. in <strong>/path/to/script.php</strong> on line <strong>99</strong></p></blockquote>
<p>のようなエラーに出くわすことはないだろうか。この場合、PHPが動作しているマシンのiptablesに注意が必要である。FTPログインはできたものの、相手からデータ通信のコネクションが張れないままタイムアウトしているのであろう。</p>
<p>通信相手のFTPサーバがアクティブモードで動作している場合、こちらから相手FTPサーバの２１番ポートにコネクトしたのち、相手FTPサーバの２０番ポートから、 こちらが通知した1024-65535の間のポートにコネクトしようとしてくる。</p>
<p>なので、こちら（PHPが動作しているマシン）のiptablesのINPUTチェーンで制限を加えている場合、INPUTチェーンでは、 1024-65535の間のポートが空いている必要が出てしまう。<br />
これはあまりにも危険だし、その必要もない。以下のようにする。</p>
<blockquote><p>iptables -L</p></blockquote>
<p>を行い、INPUTチェーンに</p>
<blockquote><p>ACCEPT  all  &#8211;  anywhere  anywhere  state RELATED,ESTABLISHED</p></blockquote>
<p>の行があることを確認する。これは、確立済みのコネクションと、関連するコネクションを許可するものだ。なければ以下のように作る。</p>
<blockquote><p>iptables -I INPUT 5 -p udp -m state &#8211;state ESTABLISHED,RELATED -j ACCEPT</p></blockquote>
<p>上記、5の部分は挿入するINPUTチェーンの行番号です。</p>
<p>次にiptables関連のカーネルモジュールを確認する。</p>
<blockquote><p>lsmod</p></blockquote>
<p>を実行し、ip_conntrack_ftpと、ip_nat_ftpの行があることを確認し、ないものを入れる。それぞれ以下の通り。（多くの場合、ip_conntrack_ftpは入っている。）</p>
<blockquote><p>modprobe ip_conntrack_ftp<br />
modprobe ip_nat_ftp</p></blockquote>
<p>これで、アクティブモードのFTPサーバに対して、PHPでFTP通信ができるようになった。</p>
<p>このままではサーバが再起動したら元に戻ってしまう。<br />
/etc/sysconfig/iptables-config<br />
で、使用するモジュールを以下のように設定する。</p>
<blockquote><p>IPTABLES_MODULES=&#8221;ip_nat_ftp&#8221;</p></blockquote>
<div>また、先のiptables設定を保存する。</div>
<blockquote><p>service iptables save</p></blockquote>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 390px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">
<p>IPTABLES_MODULES=&#8221;ip_nat_ftp</p></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.simple-eye.com/archives/256/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache2.0で、mod_cacheを後から追加</title>
		<link>http://blog.simple-eye.com/archives/247</link>
		<comments>http://blog.simple-eye.com/archives/247#comments</comments>
		<pubDate>Mon, 29 Mar 2010 06:56:10 +0000</pubDate>
		<dc:creator>シンプル・アイ社長</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[WEBサーバ]]></category>
		<category><![CDATA[モジュール]]></category>

		<guid isPermaLink="false">http://blog.simple-eye.com/?p=247</guid>
		<description><![CDATA[ソースインストールしたApache2.0に後からmod_cache.so、mod_disk_cache.so、mod_file_cache.so、mod_mem_cache.soを後から追加する。
ソースディレクトリに行く。うちの例では以下の通り。
cd /usr/local/src/apache/httpd-2.0.61/modules/cache/
apxsコマンドで、モジュールをコンパイル＆インストール
apxs -i -a -c mod_file_cache.c
ソースディレクトリに行く。うちの例では以下の通り。
cd /usr/local/src/apache/httpd-2.0.61/modules/experimental/
apxsコマンドで、モジュールをコンパイル＆インストール
apxs -i -a -c mod_cache.c cache_util.c cache_storage.c
apxs -i -a -c mod_mem_cache.c cache_cache.c cache_hash.c cache_pqueue.c
apxs -i -a -c mod_disk_cache.c
「-c」オプションでモジュールのソースファイルを指定。
「-i」オプションでビルド完了後モジュールをモジュールディレクトリに移動。
「-a」オプションでhttpd.confにLoadModule文が1行が追加されます。
]]></description>
			<content:encoded><![CDATA[<p>ソースインストールしたApache2.0に後からmod_cache.so、mod_disk_cache.so、mod_file_cache.so、mod_mem_cache.soを後から追加する。</p>
<p>ソースディレクトリに行く。うちの例では以下の通り。</p>
<blockquote><p>cd /usr/local/src/apache/httpd-2.0.61/modules/cache/</p></blockquote>
<p>apxsコマンドで、モジュールをコンパイル＆インストール</p>
<blockquote><p>apxs -i -a -c mod_file_cache.c</p></blockquote>
<p>ソースディレクトリに行く。うちの例では以下の通り。</p>
<blockquote><p>cd /usr/local/src/apache/httpd-2.0.61/modules/experimental/</p></blockquote>
<p>apxsコマンドで、モジュールをコンパイル＆インストール</p>
<blockquote><p>apxs -i -a -c mod_cache.c cache_util.c cache_storage.c<br />
apxs -i -a -c mod_mem_cache.c cache_cache.c cache_hash.c cache_pqueue.c<br />
apxs -i -a -c mod_disk_cache.c</p></blockquote>
<p>「-c」オプションでモジュールのソースファイルを指定。<br />
「-i」オプションでビルド完了後モジュールをモジュールディレクトリに移動。<br />
「-a」オプションでhttpd.confにLoadModule文が1行が追加されます。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.simple-eye.com/archives/247/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
