<?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>Apelog &#187; Develop</title>
	<atom:link href="http://blog.apecell.com/category/develop/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.apecell.com</link>
	<description>Apecell's blog by Design</description>
	<lastBuildDate>Tue, 22 Jun 2010 07:08:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>DoCoMoで「サイトが移動しました(301)」が出る場合</title>
		<link>http://blog.apecell.com/2009/02/27/id/59</link>
		<comments>http://blog.apecell.com/2009/02/27/id/59#comments</comments>
		<pubDate>Fri, 27 Feb 2009 04:40:14 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/?p=59</guid>
		<description><![CDATA[昔から言われている事ながらDoCoMo向けサイトでリダイレクトする場合、リダイレクト先のURLがディレクトリで終わる場合にURLの最後を「/」で終わらないと警告が出るというもの。
× http://blog.apecell.com
↓
○ http://blog.apecell.com/
警告は出るものの遷移はおこなわれるので見られなくなるわけではないものの、特に理由が無ければ付けるようにした方がいいでしょう。
久しぶりに聞かれたのでメモ。
]]></description>
			<content:encoded><![CDATA[<p>昔から言われている事ながらDoCoMo向けサイトでリダイレクトする場合、リダイレクト先のURLがディレクトリで終わる場合にURLの最後を「/」で終わらないと警告が出るというもの。</p>
<pre>× http://blog.apecell.com
↓
○ http://blog.apecell.com/</pre>
<p>警告は出るものの遷移はおこなわれるので見られなくなるわけではないものの、特に理由が無ければ付けるようにした方がいいでしょう。</p>
<p>久しぶりに聞かれたのでメモ。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2009/02/27/id/59/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>携帯3キャリアの迷惑メールフィルター設定URL</title>
		<link>http://blog.apecell.com/2009/01/06/id/56</link>
		<comments>http://blog.apecell.com/2009/01/06/id/56#comments</comments>
		<pubDate>Tue, 06 Jan 2009 13:31:22 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[note]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/?p=56</guid>
		<description><![CDATA[
DoCoMo
http://imutl.ezweb.ne.jp/cgi2001/utl_menu.cgi
AU
http://docomo.ne.jp/cp/mailsetst.cgi
SoftBank
http://elinks.softbank.ne.jp/selfcare

]]></description>
			<content:encoded><![CDATA[<dl>
<dt>DoCoMo</dt>
<dd>http://imutl.ezweb.ne.jp/cgi2001/utl_menu.cgi</dd>
<dt>AU</dt>
<dd>http://docomo.ne.jp/cp/mailsetst.cgi</dd>
<dt>SoftBank</dt>
<dd>http://elinks.softbank.ne.jp/selfcare</dd>
</dl>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2009/01/06/id/56/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>携帯サイトの入力フォームのUIの話</title>
		<link>http://blog.apecell.com/2008/10/08/id/41</link>
		<comments>http://blog.apecell.com/2008/10/08/id/41#comments</comments>
		<pubDate>Wed, 08 Oct 2008 10:06:05 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[note]]></category>
		<category><![CDATA[userbility]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/?p=41</guid>
		<description><![CDATA[継続は力だという事を頭に叩き込みながら開発に関するもの以外にも、読んだ本や音楽(CD)なども交えてやっていくということで。
携帯のUIであった話
とある携帯サイトの入力フォームは以下のようになっていた。
【入力1】→【入力2】→【入力3】→【確認】→【完了】
特におかしい様には思わないがアクセス解析を見ると確認から完了へのコンバージョン率が低い。
確認画面まで行っておいて完了しないのはおかしい、という事で再度見直してみると「もしかして確認ページなのに完了ページだと思っているのではないか？」という話が挙がり、試しに確認ページの上部にも完了ページへのボタンを設置したところコンバージョン率が上がったという話。
確かに確認ページまでの遷移が長く確認ページの上部には「この内容で良ければ完了してください」と書いてあるものの目立っていないので逆に紛らわしくなっていた。
PCサイトでもたまに見かけるが携帯サイトの方が表示領域が少ない分、利用者への通知には気をつけた方がいい。
このケースは最終的にページ上部にまだ完了していない旨を目立つように表記した。
]]></description>
			<content:encoded><![CDATA[<p>継続は力だという事を頭に叩き込みながら開発に関するもの以外にも、読んだ本や音楽(CD)なども交えてやっていくということで。</p>
<h3>携帯のUIであった話</h3>
<p>とある携帯サイトの入力フォームは以下のようになっていた。</p>
<p><em>【入力1】→【入力2】→【入力3】→【確認】→【完了】</em></p>
<p>特におかしい様には思わないがアクセス解析を見ると確認から完了へのコンバージョン率が低い。</p>
<p>確認画面まで行っておいて完了しないのはおかしい、という事で再度見直してみると<em>「もしかして確認ページなのに完了ページだと思っているのではないか？」</em>という話が挙がり、試しに確認ページの上部にも完了ページへのボタンを設置したところコンバージョン率が上がったという話。</p>
<p>確かに確認ページまでの遷移が長く確認ページの上部には<em>「この内容で良ければ完了してください」</em>と書いてあるものの目立っていないので逆に紛らわしくなっていた。</p>
<p>PCサイトでもたまに見かけるが携帯サイトの方が表示領域が少ない分、利用者への通知には気をつけた方がいい。</p>
<p>このケースは最終的にページ上部にまだ完了していない旨を目立つように表記した。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2008/10/08/id/41/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>複数ユーザーでディレクトリ管理</title>
		<link>http://blog.apecell.com/2008/06/20/id/40</link>
		<comments>http://blog.apecell.com/2008/06/20/id/40#comments</comments>
		<pubDate>Fri, 20 Jun 2008 04:48:34 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[Howto]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[centos]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/?p=40</guid>
		<description><![CDATA[Web開発では複数ユーザーでディレクトリを共有管理したいケースが良くある、そういった場合の設定方法。
/var/www/html を foo, bar, apacheの3ユーザーで管理するとする、設定環境はCentOS5。
設定方法
管理用グループ(webadmin)を作成
# /usr/sbin/groupadd webadmin
管理用グループ(webadmin)に3ユーザー追加。追加時に他のグループにも所属させる場合は同時に指定する事。特にwheelユーザーからしかrootになれない状態で間違ってwheelから外してしまうと悲惨な事に。
# /usr/sbin/usermod -G webadmin foo
# /usr/sbin/usermod -G webadmin bar
# /usr/sbin/usermod -G webadmin,apache apache
対象ディレクトリをwebadminが操作できるようにグループを指定し書き込み権限を与える。
# chgrp webadmin /var/www/html
# chmod g+w /var/www/html
このままだとファイルを生成した際に所有権がそれぞれのユーザーになってしまうので、グループ権限でファイルを作成するようにする。
# chmod g+s /var/www/html
以上でグループで管理出来る環境になる。
複数設定する場合はfindでディレクトリだけ検索した結果に対して変更すると楽。
find . -type d -print &#124; xargs chmod g+w
]]></description>
			<content:encoded><![CDATA[<p>Web開発では複数ユーザーでディレクトリを共有管理したいケースが良くある、そういった場合の設定方法。</p>
<p><em>/var/www/html</em> を <em>foo, bar, apache</em>の3ユーザーで管理するとする、設定環境はCentOS5。</p>
<h3>設定方法</h3>
<p>管理用グループ(webadmin)を作成</p>
<pre># /usr/sbin/groupadd webadmin</pre>
<p>管理用グループ(webadmin)に3ユーザー追加。<em class="notice">追加時に他のグループにも所属させる場合は同時に指定する事。</em>特にwheelユーザーからしかrootになれない状態で間違ってwheelから外してしまうと悲惨な事に。</p>
<pre># /usr/sbin/usermod -G webadmin foo
# /usr/sbin/usermod -G webadmin bar
# /usr/sbin/usermod -G webadmin,apache apache</pre>
<p>対象ディレクトリをwebadminが操作できるようにグループを指定し書き込み権限を与える。</p>
<pre># chgrp webadmin /var/www/html
# chmod g+w /var/www/html</pre>
<p>このままだとファイルを生成した際に所有権がそれぞれのユーザーになってしまうので、グループ権限でファイルを作成するようにする。</p>
<pre># chmod g+s /var/www/html</pre>
<p>以上でグループで管理出来る環境になる。</p>
<p>複数設定する場合はfindでディレクトリだけ検索した結果に対して変更すると楽。</p>
<pre>find . -type d -print | xargs chmod g+w</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2008/06/20/id/40/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend_MailのFromヘッダでDoCoMoから返信が出来ない</title>
		<link>http://blog.apecell.com/2008/05/31/id/39</link>
		<comments>http://blog.apecell.com/2008/05/31/id/39#comments</comments>
		<pubDate>Sat, 31 May 2008 09:10:17 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zendframework]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/?p=39</guid>
		<description><![CDATA[Zend_Mailでメールする際のFromヘッダ作成時にメールアドレスのみ渡して名前を渡さない場合
"" &#60;foo@bar.com&#62;
の様な形で生成されてしまう。
この状態でDoCoMo宛にメール送信を行うとDoCoMo端末から返信が出来なかった（確認したのはD905とPROSOLID μ）
ダブルクォーテーションで囲われた所が無ければ返信が出来たのでFromヘッダ生成メソッド部を変更。

public function setFrom($email, $name = '')
{
    if ($this-&#62;_from === null) {
        $email = strtr($email,&#34;\r\n\t&#34;,'???');
        $this-&#62;_from = $email;

        $this-&#62;_storeHeader('From', $email, true);
    } else {
    [...]]]></description>
			<content:encoded><![CDATA[<p>Zend_Mailでメールする際のFromヘッダ作成時にメールアドレスのみ渡して名前を渡さない場合</p>
<pre>"" &lt;foo@bar.com&gt;</pre>
<p>の様な形で生成されてしまう。</p>
<p>この状態でDoCoMo宛にメール送信を行うとDoCoMo端末から返信が出来なかった（確認したのはD905とPROSOLID μ）</p>
<p>ダブルクォーテーションで囲われた所が無ければ返信が出来たのでFromヘッダ生成メソッド部を変更。</p>
<pre name="code" class="php">
public function setFrom($email, $name = '')
{
    if ($this-&gt;_from === null) {
        $email = strtr($email,&quot;\r\n\t&quot;,'???');
        $this-&gt;_from = $email;

        $this-&gt;_storeHeader('From', $email, true);
    } else {
        /**
         * Error
         */
    }
    return $this;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2008/05/31/id/39/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQLでインデックスを使わなくなるケース</title>
		<link>http://blog.apecell.com/2008/01/22/id/30</link>
		<comments>http://blog.apecell.com/2008/01/22/id/30#comments</comments>
		<pubDate>Mon, 21 Jan 2008 15:00:00 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/1970/01/01/30</guid>
		<description><![CDATA[MySQLではインデックスを使用しても30%以上のレコードにアクセスしなければならない時インデックスは使用されない。が、LIMIT句があればインデックスを使用する。

MySQL では利用可能な場合でもインデックスが使用されない場合があることに注意してください。この一例として、インデックスの使用によって、MySQL がテーブルの 30% を超えるレコードにアクセスする必要が生じる場合が挙げられます（この場合は、必要なシークが大幅に減少するため、テーブルスキャンのほうが高速になる可能性が高くなります）。 ただしこのクエリに、レコードの一部のみを取り出す LIMITが使用されている場合、結果で返される少数のレコードを迅速に検索できるため、MySQL はインデックスを使用します。
6.4.5. MySQLにおけるインデックスの使用
例えば&#8217;2007-01-01 &#60; register_date &#60; 2007-12-31&#8242;な数百万件データがありregister_dateにインデックスを張っているものとして、以下のSQLの条件の日付を進めていくと急にインデックスが効かなくなる。
SELECT * FROM `foo` WHERE `register_date` &#60; '2007-01-01'
知っていればどうという事はないものの何も考えず実装してしまうとデータ量が増えると予想外の時間が掛ってしまう時があるかもしれない。データ量を増やしたテストとexplainは重要。
データ量が増えるなら差分のみを対象に出来る設計にした方が良いと思う。
]]></description>
			<content:encoded><![CDATA[<p>MySQLではインデックスを使用しても30%以上のレコードにアクセスしなければならない時インデックスは使用されない。が、LIMIT句があればインデックスを使用する。</p>
<blockquote title="6.4.5. MySQLにおけるインデックスの使用" cite="http://dev.mysql.com/doc/refman/5.1/ja/mysql-indexes.html">
<p>MySQL では利用可能な場合でもインデックスが使用されない場合があることに注意してください。この一例として、インデックスの使用によって、MySQL がテーブルの 30% を超えるレコードにアクセスする必要が生じる場合が挙げられます（この場合は、必要なシークが大幅に減少するため、テーブルスキャンのほうが高速になる可能性が高くなります）。 ただしこのクエリに、レコードの一部のみを取り出す LIMITが使用されている場合、結果で返される少数のレコードを迅速に検索できるため、MySQL はインデックスを使用します。</p>
<p><cite><a href="http://dev.mysql.com/doc/refman/5.1/ja/mysql-indexes.html">6.4.5. MySQLにおけるインデックスの使用</a></cite></p></blockquote>
<p>例えば&#8217;2007-01-01 &#60; register_date &#60; 2007-12-31&#8242;な数百万件データがありregister_dateにインデックスを張っているものとして、以下のSQLの条件の日付を進めていくと急にインデックスが効かなくなる。</p>
<pre name="code" class="sql">SELECT * FROM `foo` WHERE `register_date` &lt; '2007-01-01'</pre>
<p>知っていればどうという事はないものの何も考えず実装してしまうとデータ量が増えると予想外の時間が掛ってしまう時があるかもしれない。データ量を増やしたテストとexplainは重要。</p>
<p>データ量が増えるなら差分のみを対象に出来る設計にした方が良いと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2008/01/22/id/30/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ZendFrameworkでfindAllBy{Field}メソッドを使う</title>
		<link>http://blog.apecell.com/2008/01/22/id/31</link>
		<comments>http://blog.apecell.com/2008/01/22/id/31#comments</comments>
		<pubDate>Mon, 21 Jan 2008 15:00:00 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zendframework]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/1970/01/01/31</guid>
		<description><![CDATA[RailsやCakePHPなどのフレームワークではお馴染みのfindBy系メソッドをZendFrameworkで実装したいということで。
Zend_Db_Tableクラスを継承したMyZend_Db_Tableクラス内のマジックメソッドで実装し、ModelはMyZend_Db_Tableを継承する。

&#60;?php
class MyZend_Db_Table extends Zend_Db_Table {
    /**
     * 論理削除カラム名
     * @var string
     */
    private $_deleteCol = 'delete_time';

    /**
     * findAllBy[ColName]($value [, $flag])でデータアクセス
     *
     [...]]]></description>
			<content:encoded><![CDATA[<p>RailsやCakePHPなどのフレームワークではお馴染みのfindBy系メソッドをZendFrameworkで実装したいということで。</p>
<p>Zend_Db_Tableクラスを継承したMyZend_Db_Tableクラス内のマジックメソッドで実装し、ModelはMyZend_Db_Tableを継承する。</p>
<pre name="code" class="php">
&lt;?php
class MyZend_Db_Table extends Zend_Db_Table {
    /**
     * 論理削除カラム名
     * @var string
     */
    private $_deleteCol = 'delete_time';

    /**
     * findAllBy[ColName]($value [, $flag])でデータアクセス
     *
     * $flag = true で論理削除された行は除外して取得
     *
     * @param string $method
     * @param array  $args
     * @return Zend_Db_Table_Row_Abstract
     */
    public function __call($method, $args) {
        if (preg_match('/^findAllBy(\w+)?$/', $method, $matches)) {
            $field = strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $matches[1]));

            $where = array();
            $where[&quot;`$field` = ?&quot;] = $args[0];

            if (isset($args[1]) &amp;&amp; $args[1] === true
                &amp;&amp; in_array($this-&gt;_deleteCol, $this-&gt;_cols)) {
                $where[] = &quot;`{$this-&gt;_deleteCol}` IS NULL&quot;;
            }
            return $this-&gt;fetchAll($where);
        }
        throw new Zend_Db_Table_Exception(&quot;Call undefine method $method()&quot;);
    }
}
</pre>
<p>これで<em>$model-&#62;findAllByName(&#8217;Design&#8217;);</em>のようにアクセスすれば<em>`name` = &#8216;Design&#8217;</em>という条件でのデータアクセスが可能になる。</p>
<p>データは論理削除する事が多いのでfindAllByName(&#8217;Design&#8217;, true)の形の呼び出しで<br /><em>`name` = &#8216;Design&#8217; AND `delete_time` IS NULL</em></p>
<p>有効な行のみ返すようにしている。</p>
<p>まぁそんな感じで移植実装がおこなわれていくわけです。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2008/01/22/id/31/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TemplateLiteは割り当てたオブジェクトにアクセスできない</title>
		<link>http://blog.apecell.com/2008/01/01/id/29</link>
		<comments>http://blog.apecell.com/2008/01/01/id/29#comments</comments>
		<pubDate>Mon, 31 Dec 2007 18:00:00 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/1970/01/01/29</guid>
		<description><![CDATA[Smarty互換でSmartyより軽量なTemplateLiteを使うに書いた後適度に使っていたところ、Smartyと決定的な差異を発見。

TemplateLiteはオブジェクトにアクセスできない。はじめからオブジェクトをアサインしないような作りにしておけば問題無いものの、既にSmartyでオブジェクトをアサインして使っている場合、テンプレートエンジンをそのまま差し替えるわけにはいかないので注意。
例えば、Zend_Validateのエラー結果を纏めて以下のようなクラスに渡したオブジェクトをアサインしているとする。

&#60;?php
/**
 * @package Sample
 */
class Sample_Validate_Result {
    /**
     * @var array
     */
    private $_errors;

    /**
     * @param array $errors
     */
    public function __construct(array $errors) {
   [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blog.apecell.com/archives/318974.html" target="_blank">Smarty互換でSmartyより軽量なTemplateLiteを使う</a><br />に書いた後適度に使っていたところ、Smartyと決定的な差異を発見。</p>
</p>
<p>TemplateLiteはオブジェクトにアクセスできない。はじめからオブジェクトをアサインしないような作りにしておけば問題無いものの、既にSmartyでオブジェクトをアサインして使っている場合、テンプレートエンジンをそのまま差し替えるわけにはいかないので注意。</p>
<p>例えば、Zend_Validateのエラー結果を纏めて以下のようなクラスに渡したオブジェクトをアサインしているとする。</p>
<pre name="code" class="php">
&lt;?php
/**
 * @package Sample
 */
class Sample_Validate_Result {
    /**
     * @var array
     */
    private $_errors;

    /**
     * @param array $errors
     */
    public function __construct(array $errors) {
        $this-&gt;_errors = $errors;
    }

    /**
     * エラーの有無を返す
     *
     * @param string $name
     * @return mixed
     */
    public function __get($name) {
        if (array_search($name, $this-&gt;_errors) !== false) {
            return true;
        } elseif (!array_key_exists($name, $this-&gt;_errors)) {
            return false;
        } else {
            return new Sample_Validate_Result($this-&gt;_errors[$name]);
        }
    }
}
</pre>
<p>その状態でテンプレートからアサインしたオブジェクトのメンバ変数にアクセスしようとTemplateLiteの場合、evalに失敗してエラー。</p>
<pre name="code" class="php">
&lt;?php
// Validatorから帰ってくるエラー例
$errorArray = array(
    'nickname'    =&gt; array('isEmpty'),
    'mailaddress' =&gt; array('tooLong', 'invalid')
);

// コントローラー内でエラーオブジェクトをアサイン
$this-&gt;view-&gt;errors = new Sample_Validate_Result($errorsArray);

// Smartyならこれができる
{ if $errors-&gt;nickname-&gt;isEmpty }
</pre>
<p>完全互換だと思っていて差し替えが後になってしまうと、影響範囲も広がってしまうので記憶の片隅にでも。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2008/01/01/id/29/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>.Xmodmapと.vimrc</title>
		<link>http://blog.apecell.com/2007/12/07/id/28</link>
		<comments>http://blog.apecell.com/2007/12/07/id/28#comments</comments>
		<pubDate>Thu, 06 Dec 2007 15:00:00 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[conf]]></category>
		<category><![CDATA[note]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/1970/01/01/28</guid>
		<description><![CDATA[忘れないうちにLinuxでキーバインド変更用の.XmodmapとVimの設定.vimrcを記録。
共にホームディレクトリ以下に配置すればよし。
.Xmodmap
CapslockをCtrlに、無変換キーを全角/半角に。

clear Lock
clear Control

!! 左Ctrl → Super
keycode 37 = Super_L
!! Caps Lock → Ctrl
keycode 66 = Control_L

!! 半角/全角 → Esc
keycode 131 = Zenkaku_Hankaku

add Control = Control_L Control_R

.vimrc
とりあえず切り貼りして使っている感じ。

&#34;--------------------------------------------------------------------------
&#34; Last Change: 2007-11-18
&#34; Maintainer:  Design
&#34;
&#34;- Memo -------------------------------------------------------------------
&#34;
&#34; :set number?      オプションの設定状況を表示
&#34; :set all          全てのオプションの設定状況を表示
&#34; :set [...]]]></description>
			<content:encoded><![CDATA[<p>忘れないうちにLinuxでキーバインド変更用の.XmodmapとVimの設定.vimrcを記録。</p>
<p>共にホームディレクトリ以下に配置すればよし。</p>
<h4>.Xmodmap</h4>
<p>CapslockをCtrlに、無変換キーを全角/半角に。</p>
<pre>
clear Lock
clear Control

!! 左Ctrl → Super
keycode 37 = Super_L
!! Caps Lock → Ctrl
keycode 66 = Control_L

!! 半角/全角 → Esc
keycode 131 = Zenkaku_Hankaku

add Control = Control_L Control_R
</pre>
<h4>.vimrc</h4>
<p>とりあえず切り貼りして使っている感じ。</p>
<pre>
&quot;--------------------------------------------------------------------------
&quot; Last Change: 2007-11-18
&quot; Maintainer:  Design
&quot;
&quot;- Memo -------------------------------------------------------------------
&quot;
&quot; :set number?      オプションの設定状況を表示
&quot; :set all          全てのオプションの設定状況を表示
&quot; :set              デフォルトから変更されたオプションの設定状況を表示
&quot; :mkvimrc          現在のオプションを ~/.vimrc に書き出す(存在すれば無効)
&quot; :source ~/.vimrc  設定ファイルを読み直す

&quot;--------------------------------------------------------------------------
&quot; Global

set nocompatible
syntax on
colorscheme desert

&quot;set number
set nobackup
set autoindent
&quot;set smartindent

&quot; UTF-8, SJIS, EUCの順番に開く
set fileencodings=utf-8,cp932,euc-jp
&quot; デフォルトはUTF-8
set fileencoding=utf-8

&quot;--------------------------------------------------------------------------&quot;
&quot; Edit

&quot; タブ幅
set tabstop=4
&quot; タブの代わりに空白
set expandtab
&quot; バックスペースでインデントや改行を削除できるようにする
set backspace=2
&quot; 括弧入力時に対応する括弧を表示
set showmatch
&quot;カーソルを行頭、行末で止まらないようにする
&quot;set whichwrap=b,s,h,l,&lt;,&gt;,[,]
&quot;全角スペースを視覚化
highlight ZenkakuSpace cterm=underline ctermfg=red guibg=lightgray
au BufNewFile,BufRead * match ZenkakuSpace /　/

&quot;--------------------------------------------------------------------------
&quot; Status bar

&quot; 常にステータスバーを表示
set laststatus=2
&quot; コマンドラインの高さ
set cmdheight=1
&quot; コマンドを表示
set showcmd
&quot; 文字コード・改行コードを表示
set statusline=%&lt;%f\
%m%r%h%w%{'['.(&amp;fenc!=''?&amp;fenc:&amp;enc).']['.&amp;ff.']'}%=%l,%c%V%8P &quot;
&quot; カーソル位置情報を表示
set ruler
&quot; コマンドライン補完するときに強化されたものを使う
set wildmenu

&quot;--------------------------------------------------------------------------
&quot; Search

&quot; サーチをインクリメンタルサーチにする
set incsearch
&quot; 検索文字列が小文字の場合は大文字小文字を区別なく検索する
set ignorecase
&quot; 検索文字列に大文字が含まれている場合は区別して検索する
set smartcase
&quot; 検索時にファイルの最後まで行ったら最初に戻る
set wrapscan
&quot; 検索結果文字列のハイライト
set hlsearch

&quot;--------------------------------------------------------------------------
&quot; Buffer

&quot;変更中のファイルでも保存せず他のファイルを表示
set hidden
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2007/12/07/id/28/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHPで暗号化・復号あれやこれや</title>
		<link>http://blog.apecell.com/2007/11/26/id/21</link>
		<comments>http://blog.apecell.com/2007/11/26/id/21#comments</comments>
		<pubDate>Sun, 25 Nov 2007 15:00:00 +0000</pubDate>
		<dc:creator>design</dc:creator>
				<category><![CDATA[Develop]]></category>
		<category><![CDATA[Program]]></category>
		<category><![CDATA[encrypt]]></category>
		<category><![CDATA[pear]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://blog.apecell.com/1970/01/01/21</guid>
		<description><![CDATA[ウノウラボ Unoh Labs: PHPで暗号化・復号あれこれに暗号化の話が出ていたので、追記する形で他にいくつか。
同じ記事を書いていた前のBlogが消えてしまったので流し書き程度に。
gnupg 関数
PHPからOpenPGPであるgnupg 関数を利用して鍵方式の暗号化がおこなえます。
gnupg関数を使用する為にPECLのgnupgモジュールが必要。
速度的にも以降の方法に比べて早い。PGP暗号化では一番最初に検討したい。
PEAR::Crypt_RSA
PEAR::Crypt_RSAパッケージで公開鍵暗号がおこなえる。
GMP, BigInt, BCMathの3種類が使え、速度は（GMP＞BigInt＞BCMath）でGMPを基準として（1倍＞5倍＞250倍）遅い。暗号化するものが少なければ問題無いものの、多くなると速度以外でも色々と問題がある。
動作環境はDebian / PHP5.2.0 / Crypt_RSA 1.2.0bで確認。

GMPを使うと暗号化時にメモリリーク（PHP自体）、復号は大丈夫。
BigIngを64bit環境で使うと暗号化できない（空文字になる）。

PEAR::Crypt_RSAを使うしか選択肢が無い状態で、3000レコード（1レコード１M）ほどのデータを各行暗号化してDBに入れ、しばらくして復元した時、テスト環境が32bitの本番環境が64bitで泣いた記憶があるので（結局分割してバックグラウンドでGMPで暗号化した）、そもそも環境が違うなんて･･･というのはおいておき、もしかしたら特有の問題かもしれませんが似たような環境で使う人は注意。
exec()でgpgコマンドを叩く
http://www.alt-php-faq.org/local/65/
もしかすると幾多もの外的要因によりこういった方法を選択せざるを得ない時もあるかもしれない。GnuPGが必要なのでインストールしておく。
とても重いので頻度が少ないならまだしも、多くなると実用には耐え切れない。既にGnuPGが入っている状態なら何も必要無いのでそういう点で利用は出来るかもしれない。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://labs.unoh.net/2007/11/php_de_crypt.html" target="_blank">ウノウラボ Unoh Labs: PHPで暗号化・復号あれこれ</a><br />に暗号化の話が出ていたので、追記する形で他にいくつか。</p>
<p>同じ記事を書いていた前のBlogが消えてしまったので流し書き程度に。</p>
<h4>gnupg 関数</h4>
<p>PHPからOpenPGPである<a href="http://jp.php.net/manual/ja/ref.gnupg.php" target="_blank">gnupg 関数</a>を利用して鍵方式の暗号化がおこなえます。</p>
<p>gnupg関数を使用する為に<a href="http://pecl.php.net/package/gnupg" target="_blank">PECLのgnupgモジュール</a>が必要。</p>
<p>速度的にも以降の方法に比べて早い。PGP暗号化では一番最初に検討したい。</p>
<h4>PEAR::Crypt_RSA</h4>
<p><a href="http://pear.php.net/package/Crypt_RSA" target="_blank">PEAR::Crypt_RSA</a>パッケージで公開鍵暗号がおこなえる。</p>
<p>GMP, BigInt, BCMathの3種類が使え、速度は（GMP＞BigInt＞BCMath）でGMPを基準として（1倍＞5倍＞250倍）遅い。暗号化するものが少なければ問題無いものの、多くなると速度以外でも色々と問題がある。</p>
<p>動作環境はDebian / PHP5.2.0 / Crypt_RSA 1.2.0bで確認。</p>
<ul>
<li>GMPを使うと暗号化時にメモリリーク（PHP自体）、復号は大丈夫。</li>
<li>BigIngを64bit環境で使うと暗号化できない（空文字になる）。</li>
</ul>
<p>PEAR::Crypt_RSAを使うしか選択肢が無い状態で、3000レコード（1レコード１M）ほどのデータを各行暗号化してDBに入れ、しばらくして復元した時、テスト環境が32bitの本番環境が64bitで泣いた記憶があるので（結局分割してバックグラウンドでGMPで暗号化した）、そもそも環境が違うなんて･･･というのはおいておき、<em>もしかしたら特有の問題かもしれませんが似たような環境で使う人は注意</em>。</p>
<h4>exec()でgpgコマンドを叩く</h4>
<p><a href="http://www.alt-php-faq.org/local/65/" target="_blank">http://www.alt-php-faq.org/local/65/</a></p>
<p>もしかすると幾多もの外的要因によりこういった方法を選択せざるを得ない時もあるかもしれない。GnuPGが必要なのでインストールしておく。</p>
<p>とても重いので頻度が少ないならまだしも、多くなると実用には耐え切れない。既にGnuPGが入っている状態なら何も必要無いのでそういう点で利用は出来るかもしれない。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.apecell.com/2007/11/26/id/21/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
