<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xml:lang="ja">
<channel>
<title>maru.cc@はてな</title>
<link>http://d.hatena.ne.jp/maru_cc/</link>
<description>maru.cc@はてな</description>
<dc:creator>maru_cc</dc:creator>


<item>
<title>[開発環境]svn,git,hgコマンドのaliasあれこれ</title>
<link>http://d.hatena.ne.jp/maru_cc/20110120/svn_git_hg_alias</link>

<description><![CDATA[
<div class="section">
<p>バージョン管理システム使ってますか？</p>
<p>最近、会社のリポジトリをSubversionからGitにがつがつ移行してます。Gitのブランチを使った Git Flowの考え方を浸透させるべく、反映ツールのGit対応などしております。</p>
<br>

<p>それと同時に、MyBikeJPプロジェクトは、Mercurialで管理を行っています。</p>
<p>微妙に似ているけど違う gitコマンドと hgコマンドに混乱しまくりで、先日、マージにミスって @key3 さんに迷惑かけちゃいました。</p>
<br>

<p>ということで、環境差異を吸収し、さらにミスが減って楽になるような aliasやシェル関数を設定しました。</p>
<p>ちなみに zshです。</p>
<br>

<h4> Subversion</h4>
<p>svnでは、元々、.zshrc を <a href="http://d.hatena.ne.jp/sotarok/">id:sotarok</a> さんのをベースにしていた関係でショートカットを知りました。</p>
<p><a href="http://trac.nequal.jp/browser/public/dotfiles/sotarok/zsh/.zshrc?PATH=$HOME/bin:/usr/gnu/bin:/opt/local/bin:/usr/local/bin:$PATH:/sbin#L128" target="_blank">http://trac.nequal.jp/browser/public/dotfiles/sotarok/zsh/.zshrc?PATH=$HOME/bin:/usr/gnu/bin:/opt/local/bin:/usr/local/bin:$PATH:/sbin#L128</a></p>
<p>久々に見たらまたバージョンあがったっぽい</p>
<p>たぶん参考にした当時はこんな感じだったと思います。</p>
<pre class="syntax-highlight">
<span class="synStatement">alias </span><span class="synIdentifier">st</span><span class="synStatement">='</span><span class="synConstant">svn st</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">stu</span><span class="synStatement">='</span><span class="synConstant">svn st -u</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">sdi</span><span class="synStatement">='</span><span class="synConstant">svn di</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">sad</span><span class="synStatement">='</span><span class="synConstant">svn add</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">sp</span><span class="synStatement">='</span><span class="synConstant">svn up</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">sup</span><span class="synStatement">='</span><span class="synConstant">svn up</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">sci</span><span class="synStatement">='</span><span class="synConstant">svn ci</span><span class="synStatement">'</span>
</pre>

<br>

<p>さらにいくつか追加・変更して今はこんな感じ。</p>
<pre class="syntax-highlight">
<span class="synStatement">alias </span><span class="synIdentifier">st</span><span class="synStatement">='</span><span class="synConstant">svn info; svn st</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">stu</span><span class="synStatement">='</span><span class="synConstant">svn st -u</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">stg</span><span class="synStatement">='</span><span class="synConstant">repos=`svn info|grep &#34;URL: .*trunk&#34;|sed &#34;s/URL: \(.*\)trunk/\1/&#34;`;list=`svn ls ${repos}tags`;echo -ne $list|grep &#34;^release_&#34;|sed &#34;s/release_\(.*\)\//\1/&#34;|sort -t . -k 1,1 -k 2,2n -k 3,3n|sed &#34;s/\(.*\)/release_\1/&#34;;echo -ne $list|grep -v &#34;^release_&#34;|sort</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">stl</span><span class="synStatement">='</span><span class="synConstant">stg</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">sdi</span><span class="synStatement">='</span><span class="synConstant">svn di</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">sad</span><span class="synStatement">='</span><span class="synConstant">svn add</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">smv</span><span class="synStatement">='</span><span class="synConstant">svn mv</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">srm</span><span class="synStatement">='</span><span class="synConstant">svn rm</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">sp</span><span class="synStatement">='</span><span class="synConstant">svn up</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">sup</span><span class="synStatement">='</span><span class="synConstant">svn up</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">sci</span><span class="synStatement">='</span><span class="synConstant">svn ci</span><span class="synStatement">'</span>
</pre>


<ul>
<li> st：今参照しているのがtrunkなのかブランチなのかがわかるように変更</li>
<li> stg：svnのタグ一覧を表示

<ul>
<li> 弊社では「release_1.2.3」のような命名規則のリリースタグを切るので、それをちゃんと並び替えて表示</li>
</ul>
</li>
<li> smv, srm： 追加</li>
</ul>
<br>

<h4> Git</h4>
<p>基本的には Subsersionの考え方を踏襲して省略コマンドを作成</p>
<pre class="syntax-highlight">
<span class="synStatement">alias </span><span class="synIdentifier">gst</span><span class="synStatement">='</span><span class="synConstant">git status</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gtg</span><span class="synStatement">='</span><span class="synConstant">git tag</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gtl</span><span class="synStatement">='</span><span class="synConstant">list=`git tag`;echo -ne $list|grep &#34;^release_&#34;|sed &#34;s/release_\(.*\)/\1/&#34;|sort -t . -k 1,1 -k 2,2n -k 3,3n|sed &#34;s/\(.*\)/release_\1/&#34;;echo -ne $list|grep -v &#34;^release_&#34;|sort</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gbl</span><span class="synStatement">='</span><span class="synConstant">git branch</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gbls</span><span class="synStatement">='</span><span class="synConstant">git branch -a</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gdi</span><span class="synStatement">='</span><span class="synConstant">git diff</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gad</span><span class="synStatement">='</span><span class="synConstant">git add</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gmv</span><span class="synStatement">='</span><span class="synConstant">git mv</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">grm</span><span class="synStatement">='</span><span class="synConstant">git rm</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gci</span><span class="synStatement">='</span><span class="synConstant">git commit</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gcia</span><span class="synStatement">='</span><span class="synConstant">git commit -a</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gps</span><span class="synStatement">='</span><span class="synConstant">git push;git push --tags</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gpl</span><span class="synStatement">='</span><span class="synConstant">git pull;git pull --tag</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gmg</span><span class="synStatement">='</span><span class="synConstant">git pull origin</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">gco</span><span class="synStatement">='</span><span class="synConstant">git checkout</span><span class="synStatement">'</span>
</pre>


<ul>
<li> gtl：Gitでは、タグの概念がちょっと違うので、git tag と git tag -a 相当のコマンドを2つ用意</li>
<li> gbl、gbls：ブランチ用のコマンド用意　gblsはリモートも含めたブランチを表示</li>
<li> gps、gpl：pull pushはsvnには無い概念ですね</li>
<li> gmg：ブランチで作業中にmasterに入った新しい修正を取得するような時に使用</li>
<li> gco：作業ブランチの切り替え用</li>
</ul>
<br>

<h4> Mercurial</h4>
<p>ブランチ作業中に defaultに入った修正を取り込む方法と、ブランチの切り替えが Gitと大きく違うところなのでそこらへんを考慮しました（先日のミスもこの辺）</p>
<p>あとは、差分確認や diffコマンドなどは、Gitの方が使いやすかったので、色を付けたりとか less風に確認とかは、そちらを真似してみました。</p>
<pre class="syntax-highlight">
<span class="synStatement">alias </span><span class="synIdentifier">hst</span><span class="synStatement">='</span><span class="synConstant">echo -n &#34;# On branch &#34;;hg branch; hg --config &#34;extensions.color=&#34; status</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">hbl</span><span class="synStatement">='</span><span class="synConstant">hg --config &#34;extensions.color=&#34; branch</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">hbls</span><span class="synStatement">='</span><span class="synConstant">hg --config &#34;extensions.color=&#34; branches</span><span class="synStatement">'</span>
hdi<span class="synStatement">()</span> <span class="synSpecial">{</span>
    hg --config <span class="synStatement">&#34;</span><span class="synConstant">extensions.color=</span><span class="synStatement">&#34;</span> diff --<span class="synIdentifier">color</span>=always <span class="synPreProc">$1</span> <span class="synStatement">|</span> <span class="synStatement">less</span> -R
<span class="synSpecial">}</span>
<span class="synStatement">alias </span><span class="synIdentifier">had</span><span class="synStatement">='</span><span class="synConstant">hg add</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">hrm</span><span class="synStatement">='</span><span class="synConstant">hg rm</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">hci</span><span class="synStatement">='</span><span class="synConstant">hg commit</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">hps</span><span class="synStatement">='</span><span class="synConstant">hg push</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">hpl</span><span class="synStatement">='</span><span class="synConstant">hg pull;hg update</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">hup</span><span class="synStatement">='</span><span class="synConstant">hg update</span><span class="synStatement">'</span>
<span class="synStatement">alias </span><span class="synIdentifier">hmg</span><span class="synStatement">='</span><span class="synConstant">hg merge -r</span><span class="synStatement">'</span>
hco<span class="synStatement">()</span> <span class="synSpecial">{</span>
    hst
    <span class="synIdentifier">FROM</span>=<span class="synSpecial">`hg branch`</span>
    <span class="synIdentifier">TO</span>=<span class="synPreProc">$1</span>
    hg pull
    <span class="synIdentifier">RET</span>=<span class="synSpecial">`hg update -c -</span><span class="synStatement">r</span><span class="synSpecial"> </span><span class="synPreProc">$TO</span><span class="synSpecial">`</span>
    <span class="synStatement">if</span> <span class="synStatement">[</span> <span class="synStatement">-n</span> <span class="synStatement">&#34;</span><span class="synPreProc">$RET</span><span class="synStatement">&#34;</span> <span class="synStatement">];</span> <span class="synStatement">then</span>
        hg --config <span class="synStatement">&#34;</span><span class="synConstant">extensions.color=</span><span class="synStatement">&#34;</span> update <span class="synStatement">-r</span> <span class="synPreProc">$TO</span>
        hg --config <span class="synStatement">&#34;</span><span class="synConstant">extensions.color=</span><span class="synStatement">&#34;</span> diff <span class="synStatement">-r</span> <span class="synPreProc">$FROM</span> --stat
    <span class="synStatement">fi</span> 
<span class="synSpecial">}</span>
</pre>


<ul>
<li> hdi：diffを色を付けて表示と同時に、ファイルを個別指定でも動くようにしたかったので、シェル関数として設定</li>
<li> hco：ブランチ切り替えの仕方が Gitと違って混乱するので新しいコマンド作成　切り替えた時にどのファイルが変更されたのかわからないのでわかるような機能を追加</li>
</ul>
<br>

<br>

<h4> 作業している領域の確認</h4>
<p>いま、どのブランチにいるのかというのがわからなくなってしまうので、常に見えるように設定</p>
<pre class="syntax-highlight">
<span class="synStatement">autoload</span> <span class="synSpecial">-Uz</span> vcs_info
zstyle <span class="synStatement">'</span><span class="synConstant">:vcs_info:*</span><span class="synStatement">'</span> formats <span class="synStatement">'</span><span class="synConstant">(%s)-%b </span><span class="synStatement">'</span>
zstyle <span class="synStatement">'</span><span class="synConstant">:vcs_info:*</span><span class="synStatement">'</span> actionformats <span class="synStatement">'</span><span class="synConstant">(%s)-%b|%a </span><span class="synStatement">'</span>
precmd <span class="synStatement">()</span> <span class="synSpecial">{</span>
        <span class="synIdentifier">psvar</span>=<span class="synStatement">()</span>
            <span class="synPreProc">LANG</span><span class="synStatement">=</span>en_US.UTF<span class="synConstant">-8</span> vcs_info
                <span class="synSpecial">[[</span> <span class="synStatement">-n</span> <span class="synStatement">&#34;</span><span class="synPreProc">$vcs_info_msg_0_</span><span class="synStatement">&#34;</span> <span class="synSpecial">]]</span> <span class="synStatement">&#38;&#38;</span> psvar<span class="synStatement">[</span><span class="synConstant">1</span><span class="synStatement">]=&#34;</span><span class="synPreProc">$vcs_info_msg_0_</span><span class="synStatement">&#34;</span>
<span class="synSpecial">}</span>
<span class="synIdentifier">RPROMPT</span>=<span class="synStatement">&#34;</span><span class="synConstant">%1(v|%F{green}%1v%f|)[%~]</span><span class="synStatement">&#34;</span>
</pre>

<p>入力しているコマンド行の右側に、リポジトリの種別、ブランチ名、今いるパス が表示されるようになりました。</p>
<br>

<p>こんな感じです。</p>
<p><a href="http://f.hatena.ne.jp/maru_cc/20110120100026" class="hatena-fotolife" target="_blank"><img src="http://cdn-ak.f.st-hatena.com/images/fotolife/m/maru_cc/20110120/20110120100026.png" alt="f:id:maru_cc:20110120100026p:image" title="f:id:maru_cc:20110120100026p:image" class="hatena-fotolife"></a></p>
<br>

<h4> dotfiles</h4>
<p>こういう設定系は、新しいサーバに環境作る場合に同じものを反映できるように githubに放り込んであります。</p>
<p><a href="https://github.com/marucc/dotfiles" target="_blank">https://github.com/marucc/dotfiles</a></p>
<br>

<p>ほかにも、このような設定を公開している人はたくさんいるので（このあたりとか＞ <a href="http://coderepos.org/share/browser/dotfiles/" target="_blank">http://coderepos.org/share/browser/dotfiles/</a> ）、いろいろ試してみるといいと思いますし、もっといい設定があったらぜひ教えてください。</p>
<h4> 参考</h4>
<p><a href="http://d.hatena.ne.jp/mollifier/20090814/p1" target="_blank">http://d.hatena.ne.jp/mollifier/20090814/p1</a></p>
</div>
]]></description>

<dc:creator>maru_cc</dc:creator>

<pubDate>Wed, 19 Jan 2011 15:00:00 GMT</pubDate>



<category>開発環境</category>


</item>

<item>
<title>[Django][勉強会]MyBike.JP Studyなるものをやった</title>
<link>http://d.hatena.ne.jp/maru_cc/20110117/mybikejp_study</link>

<description><![CDATA[
<div class="section">
<p>まず、MyBike.JPとは。</p>

<ul>
<li> <a href="http://mybike.jp/" target="_blank">http://mybike.jp/</a></li>
<li> <a href="http://twitter.com/key3" target="_blank">@key3</a> さんが先日リリースしたサービス</li>
</ul>
<br>

<p>今のところは、自転車の写真投稿自慢サイトっぽくなっているが、今後に期待してください。</p>
<p>ずいぶん前から、一緒に飲みに行くと、自転車関連のサービスを何かということで　あれやこれや話していたのを実現させた感じだと思います。</p>
<br>

<p>私は、内部のソースを見たいなーとういのもあり、開発の手伝いができればと思い、bitbucketのプロジェクトに招待してもらって環境構築とかしていました。</p>
<br>

<p>今回、開発やサービスの今後を考えようということで、ビープラウドさんの会社を借りてハッカソン的な勉強会をしてきました。</p>
<br>

<br>

<p>日曜日の11時すぎにまったり集合。</p>
<p>keyさんが作ってきたスライドを見て（これは、すでにいろいろ話を聞いているので改めてって感じ）、環境構築。</p>
<br>

<p>Djangoは、軽くしか触ったことがないので、環境構築からはまりまくりです。</p>
<p>すでにある程度動くようになっていたのですが、画像投稿周りが動かず四苦八苦。</p>
<p>おもな構成</p>

<ul>
<li> python 2.6</li>
<li> Django</li>
<li> celery</li>
<li> rabbitmq</li>
<li> postgresql (ローカル開発時はsqlite）</li>
<li> memcached</li>
<li> mongodb</li>
</ul>
<br>

<p>とりあえず、勉強兼ねていわゆるガラケー対応をbpmobileとか使ってしてみているところです。</p>
<br>

<br>

<p>関連</p>

<ul>
<li> <a href="http://mybike.jp/" target="_blank">MyBike.JP &#91;マイバイク&#93; - オンラインのじてんしゃ手帖</a></li>
<li> <a href="http://mybikejp.blogspot.com/" target="_blank">MyBike.JP開発日誌</a></li>
<li> <a href="http://twitter.com/search?q=mybikejp" target="_blank">Twitter</a></li>
</ul>
</div>
]]></description>

<dc:creator>maru_cc</dc:creator>

<pubDate>Sun, 16 Jan 2011 15:00:00 GMT</pubDate>



<category>Django</category>

<category>勉強会</category>


</item>

<item>
<title>[mobile]携帯の空メールで、拡張アドレスのデリミタをプラスにしているとauではまる</title>
<link>http://d.hatena.ne.jp/maru_cc/20101215/au_mailto</link>

<description><![CDATA[
<div class="section">
<p>久々にはまったので、メモ兼ねて調べてみました。</p>
<br>

<p>携帯サイトで空メールを受け取るとういのは、アプリを作る上でよくある手段だと思います。</p>
<p>ユーザにメールアドレスを手入力してもらう手間を防ぐという理由以外に、確実に有効なアドレスを登録してもらえるという利点もあるからです。</p>
<p>また、画像投稿についても、一部のdocomoの新しい端末などを除き、ブラウザからは投稿が出来ないので、メールに添付をしてもらうというのはよくある手です。</p>
<br>

<p>それらの場合に、送信先をメールアドレスを複数用意しなければならない場合に出くわします。</p>
<p>そんな場合に使うのが拡張アドレスです。</p>
<p>user-ext@example.com</p>
<p>user+ext@example.com</p>
<p>user-、user+ 以降は自由になにを指定されても受け取るという仕組みです。</p>
<p>gmailでは+(プラス記号)が実際に使うことができます。</p>
<br>

<p>うちでは、もともとqmailを使用していたという理由から、拡張アドレスの区切り記号はハイフンを使用していました。</p>
<p>その後、MTAをpostfixに切り替えた時も、その設定を引き継ぎ、拡張アドレスの区切り記号はハイフンで通していました。</p>
<br>

<p>今回、とある案件を構築したのですが、サーバ環境側の都合で、MTAにsendmailを使用することになり、出来るだけ初期設定のままということで、拡張アドレスの区切り記号もプラス記号になることになりました。</p>
<p>まぁ、gmailでもやってるし大丈夫だろう。思えばこの判断が大きな誤りでした。</p>
<p>はまったはまった。はまりまくりました。</p>
<br>

<h4>プラス記号が使えないau</h4>
<p>結論から言うと、プラス記号だとau端末で空メールをhtmlのmailtoを使うと、普通の方法ではできません。</p>
<p>簡単なhtmlを作ってみます。</p>
<pre class="syntax-highlight">
<span class="synIdentifier">&#60;</span><span class="synStatement">html</span><span class="synIdentifier">&#62;</span>
<span class="synIdentifier">&#60;</span><span class="synStatement">head</span><span class="synIdentifier">&#62;</span>
<span class="synIdentifier">&#60;/</span><span class="synStatement">head</span><span class="synIdentifier">&#62;</span>
<span class="synIdentifier">&#60;</span><span class="synStatement">body</span><span class="synIdentifier">&#62;</span>
<span class="synIdentifier">&#60;</span><span class="synStatement">a</span><span class="synIdentifier"> </span><span class="synType">href</span><span class="synIdentifier">=</span><span class="synConstant">&#34;mailto:user+ext@example.com&#34;</span><span class="synIdentifier">&#62;</span><span class="synUnderlined">user+ext@example.com</span><span class="synIdentifier">&#60;/</span><span class="synStatement">a</span><span class="synIdentifier">&#62;&#60;</span><span class="synStatement">br</span><span class="synIdentifier"> /&#62;</span>
<span class="synIdentifier">&#60;</span><span class="synStatement">br</span><span class="synIdentifier"> /&#62;</span>
<span class="synIdentifier">&#60;</span><span class="synStatement">a</span><span class="synIdentifier"> </span><span class="synType">href</span><span class="synIdentifier">=</span><span class="synConstant">&#34;mailto:user%2Bext@example.com&#34;</span><span class="synIdentifier">&#62;</span><span class="synUnderlined">user%2Bext@example.com</span><span class="synIdentifier">&#60;/</span><span class="synStatement">a</span><span class="synIdentifier">&#62;&#60;</span><span class="synStatement">br</span><span class="synIdentifier"> /&#62;</span>
<span class="synIdentifier">&#60;/</span><span class="synStatement">body</span><span class="synIdentifier">&#62;</span>
<span class="synIdentifier">&#60;/</span><span class="synStatement">html</span><span class="synIdentifier">&#62;</span>
</pre>

<br>

<p>パターン1は、プラス記号をそのまま書いたパターン。</p>
<p>パターン2は、プラス記号をurlencodeした「%2B」を書いたパターン。</p>
<p>どうなると思いますか？ちなみに、検証した限りでは、docomo、softbank、willcom(WX330K)では、どちらでも正常に動きました。</p>
<br>

<br>

<h4>結果</h4>
<p>パターン1を開くと、プラス記号が空白になってしまう端末があります。つまり、メーラーは開くのですが、宛先の中身が</p>
<p>「user ext@example.com」になってしまっています。</p>
<p>そのまま送信しようとしても、端末のメーラー側のエラーが発生していまいます。</p>
<br>

<p>パターン2を開くと、urlencodeしている文字がちゃんとプラス記号として認識されて開く端末がありますが、逆にurlencodeしている文字のままメール作成画面が開いてしまう端末もあります。当然、そのまま送信しても宛先不明でサーバ側で受け取ることができません。</p>
<br>


<ul>
<li> パターン1（mailto:user+ext@example.com）

<ul>
<li> 空白になってしまう端末

<ul>
<li> AA5401CA、W21S、W31K、W41H、K002</li>
</ul>
</li>
<li> 正常に動く端末

<ul>
<li> W61T、SH001</li>
</ul>
</li>
</ul>
</li>
<li>パターン2（user%2Bext@example.com）

<ul>
<li> 正常に動く端末

<ul>
<li> A5401CA、W21S、W31K、W41H、K002</li>
</ul>
</li>
<li> urlencodeがそのまま出てしまう端末

<ul>
<li> W61T、SH001</li>
</ul>
</li>
</ul>
</li>
</ul>
<br>

<p>この記事を書く段階でテストに使用できる最新の端末が少なかったのですが、実案件で検証した範囲では、最新の世代ではプラス記号そのままで動くが、旧世代はurlencodeしないとダメみたいでした。</p>
<p>どこかで仕様を変更したのは明白ですが、探した範囲では、どこにも情報がありません。</p>
<br>

<br>

<h4>解決方法</h4>
<p>sendmailで拡張アドレスのデリミタを変更する方法がわからず、調査を続行することも、MTAをpostfix等にいまさら切り替えるわけにもいかず。。。</p>
<p>Win系以前は旧式、新形式は新世代だとわかりやすいのですが、K002とかが微妙な感じです。</p>
<br>

<p>あれやこれやテストを繰り返していたところ、ある法則を発見しました。</p>
<p>UserAgent</p>

<ul>
<li> A5401CA

<ul>
<li> KDDI-CA23 UP.Browser/6.2.0.3.111 (GUI) MMP/2.0</li>
</ul>
</li>
<li> W21S

<ul>
<li> KDDI-SN31 UP.Browser/6.2.0.7.3.129 (GUI) MMP/2.0</li>
</ul>
</li>
<li> W31KII

<ul>
<li> KDDI-KC33 UP.Browser/6.2.0.9 (GUI) MMP/2.0</li>
</ul>
</li>
<li> W41H

<ul>
<li> KDDI-HI36 UP.Browser/6.2.0.10.4 (GUI) MMP/2.0</li>
</ul>
</li>
<li> W61T

<ul>
<li> KDDI-TS3I UP.Browser/6.2_7.2.7.1.K.1.5.1.120 (GUI) MMP/2.0</li>
</ul>
</li>
<li> K002

<ul>
<li> KDDI-KC3O UP.Browser/6.2.0.15.1.1 (GUI) MMP/2.0</li>
</ul>
</li>
<li> SH001

<ul>
<li> KDDI-SH38 UP.Browser/6.2_7.2.7.1.K.3.341 (GUI) MMP/2.0</li>
</ul>
</li>
</ul>
<br>

<p>よーくみるとUserAgentの規則が変わっています！</p>
<p><a href="http://www.au.kddi.com/ezfactory/tec/spec/4_4.html" target="_blank">http://www.au.kddi.com/ezfactory/tec/spec/4_4.html</a></p>
<p>KDDIの仕様によると、ブラウザバージョンをしめす部分が変わっています。</p>

<ul>
<li> 6.2.0.3.111</li>
<li> 6.2.0.7.3.129</li>
<li> 6.2.0.9</li>
<li> 6.2.0.10.4</li>
<li> 6.2.0.15.1.1</li>
<li> 6.2_7.2.7.1.K.1.5.1.120　　！区切りがアンダーバーになってる</li>
<li> 6.2_7.2.7.1.K.3.341　　！区切りがアンダーバーになってる</li>
</ul>
<br>

<h4>対策</h4>
<p>ブラウザバージョンが \d.\d. (数字＋ドット＋数字＋ドット）の場合だけurlencodeしてあげるようにしました。</p>
<br>

<p>うちでは、Ethna+Smartyなので、こーいうめんどくさいキャリアしばりは smartyのプラグインで回避しました。</p>
<pre class="syntax-highlight">
<span class="synSpecial">&#60;?php</span>
<span class="synComment">/**</span>
<span class="synComment">* Smarty修正子ラグイン</span>
<span class="synComment">*/</span>

<span class="synComment">/**</span>
<span class="synComment">* mailtoで au旧端末で使えないプラス記号をエスケープする</span>
<span class="synComment">*</span>
<span class="synComment">* &#60;pre&#62;</span>
<span class="synComment">* ex.)</span>
<span class="synComment">*</span>
<span class="synComment">* &#60;/pre&#62;</span>
<span class="synComment">*/</span>
<span class="synPreProc">function</span> smarty_modifier_mailtoescape<span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">string</span><span class="synSpecial">)</span>
<span class="synSpecial">{</span>
    <span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synIdentifier">strlen</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">string</span><span class="synSpecial">))</span> <span class="synSpecial">{</span>
        <span class="synComment">// + をエスケープするUA</span>
        <span class="synComment">// KDDI-KC33 UP.Browser/6.2.0.9</span>
        <span class="synComment">// KDDI-KC3O UP.Browser/6.2.0.15.1.1</span>
        <span class="synComment">// そのままでOKなUA</span>
        <span class="synComment">// KDDI-SH3K UP.Browser/6.2_7.2.7.1.K.5.205</span>
        <span class="synComment">// KDDI-TS3I UP.Browser/6.2_7.2.7.1.K.1.5.1.120</span>
        <span class="synComment">// 6.2の後ろがドットのみ置換</span>
        <span class="synStatement">if</span> <span class="synSpecial">(</span><span class="synStatement">isset</span><span class="synSpecial">(</span><span class="synStatement">$</span><span class="synIdentifier">_SERVER</span><span class="synSpecial">[</span>'<span class="synConstant">HTTP_USER_AGENT</span>'<span class="synSpecial">])</span> <span class="synStatement">&#38;&#38;</span> <span class="synIdentifier">preg_match</span><span class="synSpecial">(</span>'<span class="synConstant">!^KDDI-[^ ]+ UP\.Browser/6\.2\.!</span>', <span class="synStatement">$</span><span class="synIdentifier">_SERVER</span><span class="synSpecial">[</span>'<span class="synConstant">HTTP_USER_AGENT</span>'<span class="synSpecial">]))</span> <span class="synSpecial">{</span>
            <span class="synStatement">$</span><span class="synIdentifier">string</span> <span class="synStatement">=</span> <span class="synIdentifier">str_replace</span><span class="synSpecial">(</span>'<span class="synConstant">+</span>', '<span class="synConstant">%2B</span>', <span class="synStatement">$</span><span class="synIdentifier">string</span><span class="synSpecial">)</span>;
        <span class="synSpecial">}</span>
    <span class="synSpecial">}</span>
    <span class="synStatement">return</span> <span class="synStatement">$</span><span class="synIdentifier">string</span>;
<span class="synSpecial">}</span>
</pre>

<p>使い方</p>
<pre class="syntax-highlight">
<span class="synIdentifier">&#60;</span><span class="synStatement">html</span><span class="synIdentifier">&#62;</span>
<span class="synIdentifier">&#60;</span><span class="synStatement">head</span><span class="synIdentifier">&#62;</span>
<span class="synIdentifier">&#60;/</span><span class="synStatement">head</span><span class="synIdentifier">&#62;</span>
<span class="synIdentifier">&#60;</span><span class="synStatement">body</span><span class="synIdentifier">&#62;</span> <span class="synIdentifier">&#60;</span><span class="synStatement">a</span><span class="synIdentifier"> </span><span class="synType">href</span><span class="synIdentifier">=</span><span class="synConstant">&#34;mailto:{'user+ext@example.com'|mailtoescape}&#34;</span><span class="synIdentifier">&#62;</span><span class="synUnderlined">user+ext@example.com</span><span class="synIdentifier">&#60;/</span><span class="synStatement">a</span><span class="synIdentifier">&#62;&#60;</span><span class="synStatement">br</span><span class="synIdentifier"> /&#62;</span>
<span class="synIdentifier">&#60;/</span><span class="synStatement">body</span><span class="synIdentifier">&#62;</span>
<span class="synIdentifier">&#60;/</span><span class="synStatement">html</span><span class="synIdentifier">&#62;</span> 
</pre>

<br>

<h4>まとめ</h4>
<p>auさん、仕様変えるなら言ってください。変えるとしても後方互換性を多少は気にしてください。</p>
<p>今回の件で言えば、docomo、softbankと同じように、プラス記号直書きでも、urlencodeした「%2B」でも動くようにしてもらえればすんだ話だと思うのは、考えが浅いだけでしょうか？</p>
<br>

<p>というわけで、auの新しい世代が出る前に作ったサイトで、空メールアドレスに拡張アドレスを使い、urlencodeしているサイトは、新端末で動いていないかもしれません。</p>
<p>逆に、auの新世代でだけ動作確認をしていると、旧端末で動いていないかもしれません。</p>
<br>

<p>最善の手は、postfixにして、デリミタはハイフンにすることだと思います。</p>
<p>sendmailは、他にも送信元情報等がphpで受けた時に環境変数で取得ができなかったりしたので、次回からはpostfixに絶対してもらおうと思います。</p>
</div>
]]></description>

<dc:creator>maru_cc</dc:creator>

<pubDate>Tue, 14 Dec 2010 15:00:00 GMT</pubDate>



<category>mobile</category>


</item>

<item>
<title>[groonga]全文検索エンジンgroongaについて中の人に来ていただき社内勉強会をやった</title>
<link>http://d.hatena.ne.jp/maru_cc/20101014/1287061487</link>

<description><![CDATA[
<div class="section">
<p>とある案件で日本語の全文検索をする必要があり、MySQLを使っていることからTritonnを候補にしていたのだが、新規開発は行わず、groonga(グルンガ)という新しいプロダクトに引き継がれているという状況でした。</p>
<p>そこで、Tritonn＆「groongaストレージエンジン(MySQL 5.1対応の全文検索エンジン)」の中の人である <a href="http://d.hatena.ne.jp/mir/">id:mir</a>さんに来ていただき社内勉強会を開きました。</p>
<p>堅苦しい感じではなく、ざっくり現状をいろいろ聞く感じ。</p>
<br>

<p>「groonga」と「groongaストレージエンジン」を混同していたのですが、groonga本体は最近1.0がリリースされていたのですが、MySQLの全文検索エンジンである「groongaストレージエンジン」は、まだ0.1でこれからという感じだそうです。</p>
<p>なので、案件に使うのは、2010/09/08現在では無理とのこと。</p>
<br>

<p>Tritonnの話は以前聞いたことがあったので、groongaの話をメインにしていただきました。</p>

<ul>
<li> <a href="http://groonga.org/" target="_blank">groonga - An open-source fulltext search engine and column store</a></li>
</ul>
<p>詳しくはサイト参照してください。</p>
<p>ちなみに、猫は開発者のぐにゃらくんの猫だそうですｗ</p>
<br>


<ul>
<li> groonga本体は、Tritonnでも使用していた Sennaという組み込み型の全文検索エンジンの後継プロダクトで、検索機能だけではなく、ストレージの機能を合わせもったものです。</li>
<li> httpのサーバとして立てることとかできる　jsonでやり取りができる</li>
<li> オリジナルプロトコルもある</li>
<li> memcachedのバイナリプロトコルもある

<ul>
<li> 作ってみたらテキストプロトコルの方がはやっていて　バイナリプロトコルは流行っていないｗという感じらしい</li>
</ul>
</li>
</ul>
<br>

<p>メインな売りは、リアルタイム　インデックス更新。</p>
<p>ちょー大規模だったらgoogleさんとか買うとか他の手段がいろいろある。</p>
<p>でも、短時間でそれほど大規模じゃないシステムで簡単に管理コストも下げて　というところに手軽に使えるというのがターゲットだそうです。</p>
<br>

<p>以前のTritonnでは、MyISAMをベースにしていたこともあり、更新時には検索もロックされてしまっていたが、groongaでは、更新時はテーブルロックがかかるのは同じだが、検索は更新中もOKとのこと。</p>
<br>

<p>言語バインディングとしては、ruby拡張とMySQL(groongaストレージエンジン)がある。</p>
<br>

<p>特徴いくつか</p>

<ul>
<li>「タンデム構成」という名前を付けていたが、別々の方式で同じデータを扱うことができる。

<ul>
<li> つまり、ruby拡張でデータを高速に登録しておいて、groongaストレージエンジンでSQLを使ってアクセスとかが出来る。</li>
</ul>
</li>
<li> ドリルダウン

<ul>
<li> 検索で絞り込んだ先の件数が簡単に取れる</li>
<li> オフレコ　事例がある</li>
</ul>
</li>
</ul>

<ul>
<li> データ量による更新スピードの劣化が少ない

<ul>
<li> Sennaの場合、データが数Gできつくなる　更新時に内部でコピーが発生する

<ul>
<li> Senna二次関数的</li>
<li> groonga一時関数的</li>
</ul>
</li>
</ul>
</li>
<li> NASでの共有はむり

<ul>
<li> nmap使っているので同一サーバ内で</li>
</ul>
</li>
<li> ライセンスはLGPL

<ul>
<li> 「おとといLGPLになりました」(2010/9/8時点で)</li>
</ul>
</li>
<li> yum aptで入れられる</li>
</ul>
<br>

<br>

<p>groongaストレージエンジンの2010/9/8時点での現状</p>

<ul>
<li> ヒットしたのが順不同で返ってくる</li>
<li> スコア無い</li>
<li> 年内に

<ul>
<li> マルチカラムなどができれば・・</li>
<li> Tritonn相当の機能を開発するのがまずは優先課題</li>
</ul>
</li>
</ul>
<br>

<br>

<p>あと、参考になったざっくり感覚</p>

<ul>
<li> MySQLで like とかで検索するか、全文検索を導入する必要があるかの目安

<ul>
<li> 10MB切っていたら全文検索必要ない</li>
<li> 100MBだと頑張ればなんとかできなくはない</li>
<li> 1Gだと10秒とかかかる</li>
</ul>
</li>
</ul>
<br>

<h4> けっきょく</h4>
<p>Tritonnは先方の要件もありNGになったので、groongaを使って構築中です。</p>
<p>いくつかメモもあるので随時エントリあげようと思います。</p>
</div>
]]></description>

<dc:creator>maru_cc</dc:creator>

<pubDate>Thu, 14 Oct 2010 13:04:47 GMT</pubDate>



<category>groonga</category>


</item>

<item>
<title>[php]phpカンファレンス2010に参加</title>
<link>http://d.hatena.ne.jp/maru_cc/20100925/1285381986</link>

<description><![CDATA[
<div class="section">
<p>phpカンファレンス2010にスタッフとして手伝いをしています。</p>
<br>

<p>今年はまったく動けていなかったのですが、直前にMLを見ていたら24日のビジネスDayのスタッフが足りないとのことで、急遽有休を取って参加することに。</p>
<p>仕事的にも忙しいのだが、そこは多少無理を言ってしまったかもしれない。</p>
<br>

<p>ビジネスDayは2部屋に分かれているので、片方の部屋のUst&撮影のスタッフが足りないとのことなので、そこら辺とその他雑用あれこれをしていました。</p>
<p>講演が始まると作業は手が空くので、話を聞いたりしつつ。</p>
<br>

<p>詳しくはUstの撮影動画やgihyo.jpの当日レポートなどを参照してみてください。</p>
<p><a href="http://phpcon.php.gr.jp/2010/" target="_blank"> PHPカンファレンス2010</a></p>
<p><a href="http://gihyo.jp/news/report/01/phpcon2010" target="_blank">レポート：PHPカンファレンス2010スペシャルレポート｜gihyo.jp … 技術評論社</a></p>
</div>
]]></description>

<dc:creator>maru_cc</dc:creator>

<pubDate>Sat, 25 Sep 2010 02:33:06 GMT</pubDate>



<category>php</category>


</item>

</channel>
</rss>

