<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://purl.org/rss/1.0/"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:admin="http://webns.net/mvcb/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
  <channel rdf:about="http://www.fraction.jp/log/category/47/">
    <title>Program/Ruby -- BONNOH FRACTION 14</title>
    <link>http://www.fraction.jp/log/category/47/</link>
    <description>世の中に寝るより楽はなかりけり&lt;br /&gt;浮世の馬鹿は起きて働く</description>
    
    <dc:creator>Yuanying</dc:creator>
	<dc:date>2012-01-26T09:34:36+09:00</dc:date>
	<admin:generatorAgent rdf:resource="http://webby.rubyforge.org/?v=0.9.4"/>
    <items>
      <rdf:Seq>
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2012/01/26/nginx-ssl-rails" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2011/12/22/rbenv-with-textmate" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2011/11/16/rspec-fail-on-i18n-translation-missing" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2011/10/24/vlad-with-sudo" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2011/08/17/rails3-with-nginx-unicorn" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2011/08/09/restart-unicorn-server-with-capistrano" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2011/07/29/opencv-objectdetect-with-ruby192" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2011/07/22/authenticated-paperclip-on-amazon-s3" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2011/03/28/sync-nikeplus-with-garmin-connect" />
        <rdf:li rdf:resource="http://www.fraction.jp/log/archives/2010/12/16/mojibake-on-rails3-mail" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://www.fraction.jp/log/archives/2012/01/26/nginx-ssl-rails">
    <title>Nginx + SSL + Rails</title>
    <link>http://www.fraction.jp/log/archives/2012/01/26/nginx-ssl-rails</link>
    <description>普通に nginx をフロントに置いて、バックエンドに Rails を置いた場合の nginx の設定ファイルは、半年くらい前に書いた。これはこれで良いのだが、今度は HTTPS でもアプリケーションにアクセスしたくなった場合、listen 80 の server セクションをコピーして、listen 443 で SSL を利用する server セクションを追加すれば良いだけの気もするのだが。単純にコピーして SSL の設定をしただけだとはまることがある。force_sslRails 3.x か...</description>
    <content:encoded><![CDATA[
        <p>普通に nginx をフロントに置いて、バックエンドに Rails を置いた場合の nginx の設定ファイルは、
<a href="/log/archives/2011/08/17/rails3-with-nginx-unicorn">半年くらい前に書いた</a>。</p>

<p>これはこれで良いのだが、今度は HTTPS でもアプリケーションにアクセスしたくなった場合、
listen 80 の server セクションをコピーして、listen 443 で SSL を利用する server セクションを追加すれば良いだけの気もするのだが。
単純にコピーして SSL の設定をしただけだとはまることがある。</p>

<h2>force_ssl</h2>

<p>Rails 3.x からだと思うが、ActionController に force_ssl というクラスメソッドが追加された。</p>

<pre><code class='prettyprint'># Force the request to this particular controller or specified actions to be
# under HTTPS protocol.
#
# Note that this method will not be effective on development environment.
#
# ==== Options
# * <tt>only</tt>   - The callback should be run only for this action
# * <tt>except</tt>  - The callback should be run for all actions except this action
def force_ssl(options = {})
  host = options.delete(:host)
  before_filter(options) do
    if !request.ssl? &amp;&amp; !Rails.env.development?
      redirect_options = {:protocol => 'https://', :status => :moved_permanently}
      redirect_options.merge!(:host => host) if host
      redirect_to redirect_options
    end
  end
end</code></pre>


<p>ようするに SSL でアクセスしているかを判断して、SSL 以外でアクセスしていた場合、
SSL を利用した URL にリダイレクトしてくれる before_filter だ。</p>

<p>ただ、フロントに nginx を置いて、バックエンドに Rails を置いた場合は、
普通、SSL の処理をフロントに任せるので以下のようになる。</p>

<p>
<img  src='/log/2012/01/nginx-ssl-rails.jpg'
      width='164' 
      height='229' 
      alt=''  />
</p>


<p>何も対策を施さなければ、force_ssl 処理内の request.ssl? が false を返して、
リダイレクトの無限ループになってしまう。ってかなった。</p>

<h2>X-FORWARDED_PROTO</h2>

<p>そんなバックエンドが SSL を利用された後であるかどうかを判断するために、
HTTP には X-FORWARDED_PROTO とかいうヘッダが用意されているらしい。へえー。</p>

<p>と、言う訳でリバースプロキシの設定に以下の記述を行えばおk。</p>

<pre>
try_files /system/maintenance.html $uri $uri/index.html $uri.html @application;

location @application {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        <strong>proxy_set_header X-FORWARDED_PROTO https;</strong>
        proxy_pass http://application;
}
</pre>




        
    ]]></content:encoded>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2012-01-26T08:54:28+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2011/12/22/rbenv-with-textmate">
    <title>rbenv with Textmate</title>
    <link>http://www.fraction.jp/log/archives/2011/12/22/rbenv-with-textmate</link>
    <description>Textmate で CMD+R を使った時に、rbenv で指定した Ruby を利用する方法。基本的には、uberfork: Integrate rbenv with Textmate上記のブログの通りで良いのだけど、それだけだと rbenv コマンドが無いよと言われるので、 PATH に /usr/local/bin も通しておく必要がある。まとめると、  PATH  /Users/USERNAME/.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr...</description>
    <content:encoded><![CDATA[
        <p>Textmate で <code>CMD+R</code> を使った時に、rbenv で指定した Ruby を利用する方法。</p>

<p>
<img  src='/log/2011/12/rbenv-with-textmate.jpg'
      width='389' 
      height='385' 
      alt=''  />
</p>


<p>基本的には、</p>

<ul>
<li><a href="http://uberfork.com/post/12280974742/integrate-rbenv-with-textmate">uberfork: Integrate rbenv with Textmate</a></li>
</ul>


<p>上記のブログの通りで良いのだけど、
それだけだと rbenv コマンドが無いよと言われるので、 <code>PATH</code> に <code>/usr/local/bin</code> も通しておく必要がある。</p>

<p>まとめると、</p>

<dl>
  <dt>PATH</dt>
  <dd><strong>/Users/USERNAME/.rbenv/shims:/usr/local/bin:</strong>/usr/bin:/bin:/usr/sbin:/sbin</dd>

  <dt>RBENV_VERSION</dt>
  <dd>1.9.3-p0</dd>

  <dt>TM_RUBY</dt>
  <dd>/Users/USERNAME/.rbenv/shims/ruby</dd>

</dl>


        
    ]]></content:encoded>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2011-12-22T13:45:57+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2011/11/16/rspec-fail-on-i18n-translation-missing">
    <title>Rails で翻訳に失敗したらテストが失敗するようにしてみた</title>
    <link>http://www.fraction.jp/log/archives/2011/11/16/rspec-fail-on-i18n-translation-missing</link>
    <description>View のテスト中に、翻訳テキストが存在しなかったらテストに失敗するといいなあと思った。通常は翻訳に失敗してもレンダリングされる html 中に「翻訳に失敗したよ！」というメッセージが出るだけなので、テストが失敗しないので翻訳できてるのかできてないのかチェックできない。翻訳漏れが発生！とかなってしまう。というわけで、以下を spec_helper に追加。I18n.exception_handler = lambda do |exception, locale, key, options|  r...</description>
    <content:encoded><![CDATA[
        

<p>
<img  src='/log/2011/11/translation-missing.jpg'
      width='404' 
      height='206' 
      alt=''  />
</p>


<p>View のテスト中に、翻訳テキストが存在しなかったらテストに失敗するといいなあと思った。</p>

<p>通常は翻訳に失敗してもレンダリングされる html 中に「翻訳に失敗したよ！」というメッセージが出るだけなので、</p>

<ol>
<li>テストが失敗しないので翻訳できてるのかできてないのかチェックできない。</li>
<li>翻訳漏れが発生！</li>
</ol>


<p>とかなってしまう。</p>

<p>というわけで、以下を <code>spec_helper</code> に追加。</p>

<pre><code class='prettyprint'>I18n.exception_handler = lambda do |exception, locale, key, options|
  raise exception.message
end</code></pre>


<p>まあ、ちょっと問題がある訳でもないが、
どちらかというと rspec-rails のバグのような気がしないでもないので気にしない。</p>

        
    ]]></content:encoded>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2011-11-16T10:20:39+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2011/10/24/vlad-with-sudo">
    <title>Vlad で sudo</title>
    <link>http://www.fraction.jp/log/archives/2011/10/24/vlad-with-sudo</link>
    <description>最近、Capistrano を使い始めたのだが、何気に使い方を調べようとソースコードを読むと、長くて大変。全体像を把握するのが大変だなあと何となく思っていたところに発見。Vlad the DeployerCapistrano の代替として使えそう。それでいてソースコードはシンプルで読みやすくてよい。まあ、ぶっちゃけ、ツールの使い方について、ネットを徘徊して調べるか？ソースコードを徘徊して調べるか？のどっちが好みかで、Capistrano を使うか Vlad を使うかが変わる気がするが。sudo し...</description>
    <content:encoded><![CDATA[
        

<p>
<img  src='/log/2011/10/Vlad-the-Deployer.png'
      width='338' 
      height='159' 
      alt=''  />
</p>


<p>最近、Capistrano を使い始めたのだが、
何気に使い方を調べようとソースコードを読むと、長くて大変。
全体像を把握するのが大変だなあと何となく思っていたところに発見。</p>

<ul>
<li><a href="http://rubyhitsquad.com/Vlad_the_Deployer.html">Vlad the Deployer</a></li>
</ul>


<p>Capistrano の代替として使えそう。それでいてソースコードはシンプルで読みやすくてよい。</p>

<p>まあ、ぶっちゃけ、ツールの使い方について、</p>

<ol>
<li>ネットを徘徊して調べるか？</li>
<li>ソースコードを徘徊して調べるか？</li>
</ol>


<p>のどっちが好みかで、Capistrano を使うか Vlad を使うかが変わる気がするが。</p>

<h2>sudo してみた</h2>

<p>で、まあ、Capistrano や Vlad の使い方はおいといて、
Remote のタスクを sudo 権限で実行してみたところ、</p>

<pre><code>$ rake vlad:test --trace 
** Invoke vlad:test (first_time)
** Execute vlad:test
ssh localhost 'sudo -p Password: echo sudo'
__sudo: no tty present and no askpass program specified__
rake aborted!
execution failed with status 1: ssh localhost sudo -p Password: echo sudo
</code></pre>

<p>みたいに言われて実行できないことがある。
Capistrano の場合は、<code>default\_run\_options[:pty] = true</code>
すればいいらしいが…。</p>

<p>色々調べたところ、</p>

<pre><code>set :sudo_flags, sudo_flags &lt;&lt; '-S'
</code></pre>

<p>で解決だった。</p>

        
    ]]></content:encoded>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2011-10-24T10:15:16+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2011/08/17/rails3-with-nginx-unicorn">
    <title>Rails3.1@Unicorn で nginx の設定</title>
    <link>http://www.fraction.jp/log/archives/2011/08/17/rails3-with-nginx-unicorn</link>
    <description>Rails3.1 のアプリケーションを Unicorn で動かして、静的ファイルは nginx におまかせ！ってしようとした時に nginx の設定で少しはまったのでメモ。前提nginx を 127.0.0.1:80 で動かしている。Unicorn を 127.0.0.1:8080 で動かしている。Rails3.1 の assets を 事前に rake assets:precompile してある。nginx の設定/assets ディレクトリ以下のファイルを expire max  で永久にブ...</description>
    <content:encoded><![CDATA[
        

<p>
<img  src='/log/2011/08/kona.jpg'
      width='400' 
      height='327' 
      alt=''  />
</p>


<p>Rails3.1 のアプリケーションを Unicorn で動かして、静的ファイルは nginx におまかせ！
ってしようとした時に nginx の設定で少しはまったのでメモ。</p>

<h2>前提</h2>

<ul>
<li>nginx を 127.0.0.1:80 で動かしている。</li>
<li>Unicorn を 127.0.0.1:8080 で動かしている。</li>
<li>Rails3.1 の assets を 事前に <code>rake assets:precompile</code> してある。</li>
</ul>


<h2>nginx の設定</h2>

<ul>
<li>/assets ディレクトリ以下のファイルを expire max  で永久にブラウザ側にキャッシュさせる。

<ul>
<li>assets 内のファイルは内容が変わればファイル名も変わるため、永久にキャッシュさせておーけー。</li>
</ul>
</li>
<li>try_files で すでに存在する静的ファイルはすべて nginx で処理。</li>
</ul>


<pre class='prettyprint'><code>upstream apps-server {
    server 127.0.0.1:8080;
}

server {
    listen  80;
    server_name     app.example.com;
    
    root /path/to/app/current/public;
    error_log /path/to/app/current/log/error.log;

    location ~* ^/assets {
            expires max;
            add_header Cache-Control public;
            break;
    }

    try_files /system/maintenance.html $uri $uri/index.html $uri.html @unicorn;

    location @unicorn {
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_pass http://apps-server;
    }
}</code></pre>




        
    ]]></content:encoded>
    <dc:subject>Apple</dc:subject>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:subject>Program/技術</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2011-08-17T11:09:18+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2011/08/09/restart-unicorn-server-with-capistrano">
    <title>CapistranoでUnicornの起動と停止と再起動</title>
    <link>http://www.fraction.jp/log/archives/2011/08/09/restart-unicorn-server-with-capistrano</link>
    <description>CapistranoでUnicornの起動と停止と再起動をしたくなった。CapistranoでUnicornの起動と停止と再起動 | ひげろぐ以上のエントリを参考にしたが、再起同時に空振り上等だったのでちょっといじった。 以上。...</description>
    <content:encoded><![CDATA[
        

<p>
<img  src='/log/2011/08/deploy-unicorn-rb.jpg'
      width='415' 
      height='278' 
      alt=''  />
</p>


<p>CapistranoでUnicornの起動と停止と再起動をしたくなった。</p>

<ul>
<li><a href="http://higelog.brassworks.jp/?p=1533">CapistranoでUnicornの起動と停止と再起動 | ひげろぐ</a></li>
</ul>


<p>以上のエントリを参考にしたが、再起同時に空振り上等だったのでちょっといじった。</p>

<script src="https://gist.github.com/1133608.js"> </script>


<p>以上。</p>

        
    ]]></content:encoded>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2011-08-09T17:28:27+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2011/07/29/opencv-objectdetect-with-ruby192">
    <title>Ruby 1.9.2 で顔認識してみた</title>
    <link>http://www.fraction.jp/log/archives/2011/07/29/opencv-objectdetect-with-ruby192</link>
    <description>4年ほど前に流行った Ruby の OpenCV ラッパである objectdetectを今更ながらに使ってみたら意外にハマッタのでメモ。環境とりあえず環境は、Ubuntu 10.10Ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]hoe (2.10.0)objectdetect (0.0.3)rake (0.9.2)OpenCV 2.1と言う感じ。OpenCV のインストールUbuntu の場合、OpenCV のライブラリがいくつ...</description>
    <content:encoded><![CDATA[
        

<p>
<img  src='/log/2011/07/objectdetect.jpg'
      width='388' 
      height='179' 
      alt=''  />
</p>


<p>4年ほど前に流行った Ruby の OpenCV ラッパである <a href="http://objectdetect.rubyforge.org/objectdetect/">objectdetect</a>
を今更ながらに使ってみたら意外にハマッタのでメモ。</p>

<h2>環境</h2>

<p>とりあえず環境は、</p>

<ul>
<li>Ubuntu 10.10</li>
<li>Ruby 1.9.2p180 (2011-02-18 revision 30909) [x86_64-linux]</li>
<li>hoe (2.10.0)</li>
<li>objectdetect (0.0.3)</li>
<li>rake (0.9.2)</li>
<li>OpenCV 2.1</li>
</ul>


<p>と言う感じ。</p>

<h2>OpenCV のインストール</h2>

<p>Ubuntu の場合、OpenCV のライブラリがいくつかに別れてるらしく、
<code>gem install objectdetect</code> するたびにあのライブラリが無いこのライブラリが無いと言われてむかついた。
どんな感じでむかついたのかはわざわざログにする必要も無いので、必要なライブラリを以下に晒す。</p>

<pre><code>$ sudo apt-get install libcv-dev
$ sudo apt-get install libhighgui-dev
$ sudo apt-get install libcvaux-dev
</code></pre>

<h2>objectdetect のインストール</h2>

<p>そもそも objectdetect は Ruby 1.9 に対応してないらしく、
native extention がコンパイルできないのでそこから直してやる必要がある。</p>

<h3>objectdetect 0.0.3 のソースコードの修正</h3>

<p>とりあえずどっかから、<code>objectdetect-0.0.3.gem</code> を拾ってきて <code>unpack</code> する。</p>

<pre><code>$ gem unpack objectdetect-0.0.3.gem
</code></pre>

<p><code>unpack</code> されて出てきたソースコードの中から、 <code>ext/objectdetect.c</code> を修正する。</p>

<pre><code>--- objectdetect.c.org  2011-07-29 15:09:32.000000000 +0900
+++ objectdetect.c  2011-07-29 15:10:03.000000000 +0900
@@ -25,13 +25,13 @@
   Check_Type(target_path, T_STRING);

   /* load the model */
-  CvHaarClassifierCascade* cascade = cvLoad(RSTRING(model_path)-&gt;ptr, 0, 0, 0);
+  CvHaarClassifierCascade* cascade = cvLoad(RSTRING_PTR(model_path), 0, 0, 0);
   if( cascade == 0 ) {
     rb_raise(rb_eArgError, "Can't load the cascade file");
   }

   /* load the target picture */
-  IplImage *img = cvLoadImage(RSTRING(target_path)-&gt;ptr, 1);
+  IplImage *img = cvLoadImage(RSTRING_PTR(target_path), 1);
   if( !img ) {
     cvReleaseHaarClassifierCascade(&amp;cascade);
     rb_raise(rb_eArgError, "Can't load the image file");
</code></pre>

<h3>インストール</h3>

<p>修正し終わったら <code>rake gem</code> して解凍したソースコードを gem 化しインストール。</p>

<pre><code>$ rake gem
$ gem install pkg/objectdetect-0.0.3.gem
</code></pre>

<p><code>rake gem</code> した時にエラーが出るようだったら、たぶん <code>hoe</code> が入ってないのでインストールしておく。</p>

<h2>試す</h2>

<pre><code class='prettyprint'>require 'rubygems'
require 'objectdetect'

model_path = 'haarcascade_frontalface_alt2.xml'

p ObjectDetect::detect(model_path, '01kiribati1.jpg')</code></pre>


<p>適当な名前で上のコードを保存して、</p>

<pre><code>$ rvm use 1.9.2@opencv                
Using /home/yuanying/.rvm/gems/ruby-1.9.2-p180 with gemset opencv

$ ruby test.rb        
libdc1394 error: Failed to initialize libdc1394
[[188, 27, 41, 41], [40, 35, 46, 46]]
</code></pre>

<p>認識されたことを確認してヨロコブ。
なんかエラーが出てますが、問題ない！</p>

<p>ちなみにさらっと書いてるように見えるがけっこー時間かかった！</p>

<h2>参考文献</h2>

<ul>
<li><a href="http://elpeo.jp/diary/20070312.html#p03">「顔面認識→笑い男貼り付け」ツールを Ruby で書く</a></li>
<li><a href="http://d.hatena.ne.jp/darashi/20070313/1173791243">[facedetector] gem objectdetect を公開しました</a></li>
</ul>


        
    ]]></content:encoded>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2011-07-29T15:25:47+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2011/07/22/authenticated-paperclip-on-amazon-s3">
    <title>Amazon S3 + Paperclip で認証アクセス</title>
    <link>http://www.fraction.jp/log/archives/2011/07/22/authenticated-paperclip-on-amazon-s3</link>
    <description>ぶっちゃけ、Restricting Access to Objects Stored on Amazon S3に書いてあるそのまんまで、:s3_permissions オプションを :private に設定して、has_attached_file :annual_report, :storage =&gt; :s3, :s3_credentials =&gt; &quot;#{Rails.root}/config/s3.yml&quot;, :s3_permissions =&gt; :private, :path =&gt; &quot;photo...</description>
    <content:encoded><![CDATA[
        

<p>
<img  src='/log/2011/07/paperclip.jpg'
      width='360' 
      height='270' 
      alt=''  />
</p>


<p>ぶっちゃけ、<a href="https://github.com/thoughtbot/paperclip/wiki/Restricting-Access-to-Objects-Stored-on-Amazon-S3">Restricting Access to Objects Stored on Amazon S3</a>
に書いてあるそのまんまで、</p>

<p><code>:s3_permissions</code> オプションを <code>:private</code> に設定して、</p>

<pre><code class='prettyprint'>has_attached_file :annual_report,
 :storage => :s3,
 :s3_credentials => "#{Rails.root}/config/s3.yml",
 :s3_permissions => :private,
 :path => "photos/:id/:filename"</code></pre>


<p>アクセスを許可する人にだけ、<code>expiring_url</code> にアクセスさせれば良い。</p>

<pre><code class='prettyprint'>def download
  redirect_to root_url if permission_denied?
  redirect_to @department.annual_report.expiring_url(10)
end</code></pre>


<h2>任意のスタイルだけ制限アクセスをかけたい場合</h2>

<p>例えば、original のスタイルのファイルにだけ制限アクセスをかけたい場合は、</p>

<pre><code class='prettyprint'>:s3_permissions => {
  :original => :private
}</code></pre>


<p>と、<code>:s3_permissions</code> オプションをハッシュで渡し、制限アクセスをかけたいスタイルにだけオプションを渡せば良いみたい。</p>

<p>ちなみに、<code>:s3_permissions</code> オプションに関しては、 Amazon S3 のドキュメント、
<a href="http://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?RESTAccessPolicy.html">REST Access Control Policy</a>
の「Canned Access Policies」に詳しく書いてある。</p>

        
    ]]></content:encoded>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2011-07-22T10:59:48+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2011/03/28/sync-nikeplus-with-garmin-connect">
    <title>Nike+ と Garmin Connect を同期したい</title>
    <link>http://www.fraction.jp/log/archives/2011/03/28/sync-nikeplus-with-garmin-connect</link>
    <description>最近、JogNote に少し興味を持ってるのだが、問題はすでにランの記録は Garmin Connect で管理しているのでいちいち JogNote に入力したくないって事。JogNote は JogNote で Nike+ からのデータインポートには対応してるのだけれども、Garmin Connect はナニソレ？って感じ。とすると、遠回りな方法になるが、Garmin Connect と Nike+ を同期Nike+ と JogNote を同期ということになる。とはいっても、結局問題が、Garm...</description>
    <content:encoded><![CDATA[
        <p>
<img  src='/log/2011/03/48km.jpg'
      width='270' 
      height='360' 
      alt=''  />
</p>


<p>最近、<a href="http://www.jognote.com/">JogNote</a> に少し興味を持ってるのだが、
問題はすでにランの記録は Garmin Connect で管理しているのでいちいち JogNote に入力したくないって事。</p>

<p>
<img  src='/log/2011/03/nikeplus_dashboard.jpg'
      width='371' 
      height='148' 
      alt=''  />
</p>


<p>JogNote は JogNote で Nike+ からのデータインポートには対応してるのだけれども、
Garmin Connect はナニソレ？って感じ。</p>

<p>とすると、遠回りな方法になるが、</p>

<ol>
<li>Garmin Connect と Nike+ を同期</li>
<li>Nike+ と JogNote を同期</li>
</ol>


<p>ということになる。</p>

<p>とはいっても、結局問題が、Garmin Connect と JogNote の同期から、
どうやって Garmin Connect と Nike+ を同期するのかって事になるだけな訳だが。</p>

<h2>Nike+ API</h2>

<p>少し調べてみると、一応 Nike+ には非公式ながらも Web API が存在するらしい。</p>

<p>そして、そのものずばりの <a href="http://awsmithson.com/tcx2nikeplus/">Garmin Forerunner tcx file to Nike+ Converter &amp; Uploader</a>
というサービスを発見。しかもオープンソース。</p>

<ul>
<li><a href="https://github.com/angusws/tcx2nikeplus">angusws/tcx2nikeplus - GutHub</a></li>
</ul>


<p>言語が Ruby だったら…、と悔やまれるが Java で書かれている。
わざわざ Java から Ruby に書き直すのも面倒なのでこのサービスをそのまま使うことにする。</p>

<p>毎回毎回 Garmin Connect にデータをアップロードしてからこのサービスをぽちぽちするのも面倒なので、
Garmin Connect の RSS からアップロードしてないデータをアップロードするスクリプトを書いて cron に登録することにした。</p>

<ul>
<li><a href="https://gist.github.com/886519">ガーミンコネクトのデータを Nike+ と同期するスクリプト。 -- Gist</a></li>
</ul>


<p>Ruby 1.8.7 @ Mac OSX 10.6 でのみ動作確認済み。</p>

        
    ]]></content:encoded>
    <dc:subject>Program/Java</dc:subject>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:subject>トライアスロン</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2011-03-28T10:17:51+09:00</dc:date>
  </item>
  <item rdf:about="http://www.fraction.jp/log/archives/2010/12/16/mojibake-on-rails3-mail">
    <title>Rails3 のメール受信で文字化けしちゃう件</title>
    <link>http://www.fraction.jp/log/archives/2010/12/16/mojibake-on-rails3-mail</link>
    <description>実は Rails3 はあんまり関係なくて、Rails3 で受信したメールを解析する際にデフォルトで利用できる、 mail-ruby ライブラリの話。あ、環境は、Ruby 1.8.7mail-ruby 2.2.17ね。現在の TODO に、  Improve MIME support for character sets in headers, currently works, mostly, needs refinement.ってあるからそのうち改善されるのかもしれないけど、とりあえず現状、 Ru...</description>
    <content:encoded><![CDATA[
        

<p>
<a href='http://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91'><img  src='/log/2010/12/mojibake.jpg'
      width='400' 
      height='248' 
      alt='Wikipedia での「文字化け」の項'  /></a>
</p>


<p>実は Rails3 はあんまり関係なくて、
Rails3 で受信したメールを解析する際にデフォルトで利用できる、 <a href="https://github.com/mikel/mail">mail-ruby</a> ライブラリの話。
あ、環境は、</p>

<ul>
<li>Ruby 1.8.7</li>
<li>mail-ruby 2.2.17</li>
</ul>


<p>ね。</p>

<p>現在の TODO に、</p>

<blockquote><ul>
<li>  Improve MIME support for character sets in headers, currently works, mostly, needs refinement.</li>
</ul>
</blockquote>

<p>ってあるからそのうち改善されるのかもしれないけど、
とりあえず現状、 Ruby 1.8.7 で mail-ruby ライブラリを使って受信したメールを解析する際に文字化けのリスクがある。</p>

<p>というのも受信したメールの文字コードの情報が mail-ruby を利用してメールを解析してる間にロストしてしまうため、
UTF-8 の文字コードでメールのタイトルを表示したい！と思っても
解析対象のメールの文字コードがわからないのでUTF-8に変換しようがない。</p>

<p>例えば、文字コードが iso-2022-jp でエンコードされたタイトルを表示したくても、</p>

<pre class='prettyprint'><code>mail = Mail.read_from_string(&lt;&lt;-EOM)
Sender: Yuanying &lt;xxxx@example.com&gt;
Subject: =?iso-2022-jp?B?GyRCJUYlOSVIGyhC?=
Date: Wed, 15 Dec 2010 15:18:41 +0900
To: "O. Yuanying" &lt;xxxx@example.com&gt;

aaaaaaa
EOM

puts mail.header['Subject'].charset   # -&gt; UTF-8
puts mail.subject                     # -&gt; B%F%9%H</code></pre>


<p>とかなってしまう。どう考えても UTF-8 じゃないのに charset が UTF-8 とか。
ソースを読んでみるとヘッダに入ってる 'iso-2022-jp' はどっかに捨ててるんですよね。</p>

<p>これが Ruby 1.9 系だった場合、文字列に文字コードの情報が含まれてるので、
解析対象のメールがどんな文字コードでエンコードされてようが、
UTF-8 で出力したい場合は、</p>

<pre class='prettyprint'><code>puts mail.subject.encode('UTF-8')</code></pre>


<p>でおk。</p>

<p>んで、Ruby 1.8 系でどうにか解析したメールを UTF-8 で表示したい場合は二つ方法があって、</p>

<ol>
<li>kconv を使う</li>
<li>mail-ruby にモンキーパッチを当てる</li>
</ol>


<p>という二つの方法がある。</p>

<h2>kconv を使う</h2>

<p>この場合は簡単で、表示したい時に、</p>

<pre class='prettyprint'><code>require 'kconv'
puts mail.subject.toutf8</code></pre>


<p>ってやればおk。
けど文字コードの判定に失敗した場合文字化けする。</p>

<h2>mail-ruby にモンキーパッチを当てる</h2>

<p>パッチはこんなの。</p>

<script src="https://gist.github.com/741734.js"> </script>


<p>このファイルを mail ライブラリを利用した際に読み込んでやれば良い。</p>

<p>出力する際の文字コードを変更したい場合は <code>Ruby18.force_encode_to_default</code> を変更してやればおk。</p>

<p>まあ、どっちも気持ち悪いけどね。</p>

        
    ]]></content:encoded>
    <dc:subject>Program/Ruby</dc:subject>
    <dc:creator>Yuanying</dc:creator>
    <dc:date>2010-12-16T14:18:34+09:00</dc:date>
  </item>
</rdf:RDF>

