<commit_before>= jpmobile: A Rails plugin for Japanese mobile-phones

== jpmobileとは
携帯電話特有の機能を Rails 3.0 や Rack middleware で利用するためのプラグイン。
以下の機能を備える。

* 携帯電話のキャリア判別
* 端末位置情報の取得
  * GeoKit(http://geokit.rubyforge.org)との連携
* 端末製造番号、契約者番号等の取得
* IPアドレスの検証(キャリアが公開しているIPアドレス帯域からのアクセスか判定)
* ディスプレイ情報(画面サイズ、ブラウザ画面サイズ、カラー・白黒、色数)の取得
* 文字コード変換機能／絵文字のキャリア間相互変換

また Rails 3.0 に以下の機能を追加する
* ビューへの自動振分け
* 位置情報取得などのリンクヘルパーの追加
* セッションIDをフォーム／リンクに付与(Trans SID)

== インストール
=== Rails pluginとしてインストールする場合
  % rails plugin install git://github.com/jpmobile/jpmobile.git

=== gemでインストールする場合
  % gem install jpmobile

== 使用例

=== 携帯電話の識別
環境変数 env['rack.jpmobile'] にキャリアクラスのインスタンスが格納されています。また Rack::Request#mobile としても取得可能です。

==== キャリアの識別

  case request.mobile
  when Jpmobile::Mobile::Docomo
    # for DoCoMo
  when Jpmobile::Mobile::Au
    # for au
  when Jpmobile::Mobile::Softbank
    # for SoftBank
  when Jpmobile::Mobile::Willcom
    # for Willcom
  when Jpmobile::Mobile::Emobile
    # for EMOBILE
  else
    # for PC
  end

あるいは
  if request.mobile.is_a?(Jpmobile::Mobile::Docomo)
    # for DoCoMo
  end

==== ビューの中で一部を切替える例
  <% if request.mobile? %>
    携帯電話からのアクセスです。
  <% else %>
    携帯電話からのアクセスではありません。
  <% end %>

  <% if request.smart_phone? %>
    スマートフォンからのアクセスです。
  <% else %>
    スマートフォンからのアクセスではありません。
  <% end %>



==== 別に用意した携帯電話用コントローラへリダイレクトする例
  class PcController < ApplicationController
    before_filter :redirect_if_mobile

    def index
    end

    private
    def redirect_if_mobile
      if request.mobile?
        pa = params.dup
        pa[:controller] = "/mobile"
        redirect_to pa
      elsif request.smart_phone?
        pa = params.dup
        pa[:controller] = "/smart_phone"
        redirect_to pa
      end
    end
  end

  class MobileController < ApplicationController
     mobile_filter
  end

=== 位置情報の取得
Rack::Request#mobile.position に位置情報が格納されます。

  @latitude   = request.mobile.position.lat
  @longuitude = request.mobile.position.lon

==== GeoKit(http://geokit.rubyforge.org)との連携

vandor/plugins/geokit以下にGeoKitがインストールされていると、Jpmobile::PositionにGeoKit::Mappableがincludeされる。したがって、

  request.mobile.position.distance_to('札幌駅')

とすることで、端末と「札幌駅」との距離を求めることができる。詳細は http://geokit.rubyforge.org/api/index.html 参照。

=== 端末情報の取得

端末側から通知されている場合、request.mobile.ident で
契約に固有の識別子もしくは端末の製造番号を取得できる。
両方存在する場合は契約に固有のIDが優先される。

* 契約に固有のID (request.mobile.ident_subscriber)
  * au: EZ番号(サブスクライバ番号)
  * DoCoMo: FOMAカード製造番号
  * EMOBILE: EMnet対応端末から通知されるユニークなユーザID
* 端末製造番号 (request.mobile.ident_device)
  * DoCoMo: 端末製造番号(FOMA, MOVA)
  * SoftBank: 製造番号

=== IPの検証
キャリアが公開しているIPアドレス帯域からのアクセスか判定する。
  request.mobile.valid_ip?
ただしスマートフォンの場合は必ずfalseとなる。

=== 端末の画面サイズ
request.mobile.display で Jpmobile::Display クラスのインスタンスが返る。
  画面幅 <%= request.mobile.display.width %>
  画面高さ <%= request.mobile.display.height %>

=== 文字コード変換機能／絵文字のキャリア間相互変換

jpmobileを読み込むとDoCoMo、Au、SoftBankの絵文字を透過的に扱うことができる。

* Rails の場合は vendor/plugins に配置し、下記の設定を追加することで有効になる。

  # Rack middleware を追加するメソッド
  Rails.application.config.jpmobile.mobile_fiter

** 下記の設定を追加することで、<form> タグの accept-charset が変更される。

  # <form accept-charset="Shift_JIS" ...> などに変更する
  Rails.application.config.jpmobile.form_accept_charset_conversion = true

携帯電話上では特に問題とならない。PCブラウザでテストする際に問題となるためのオプション。

* Sinatra の場合は下記のように指定する。

  $LOAD_PATH << './lib/jpmobile/lib'
  require 'jpmobile'
  require 'jpmobile/rack'

  use Jpmobile::Rack::MobileCarrier
  use Jpmobile::Rack::ParamsFilter<commit_msg>Fix typo<commit_after>= jpmobile: A Rails plugin for Japanese mobile-phones

== jpmobileとは
携帯電話特有の機能を Rails 3.0 や Rack middleware で利用するためのプラグイン。
以下の機能を備える。

* 携帯電話のキャリア判別
* 端末位置情報の取得
  * GeoKit(http://geokit.rubyforge.org)との連携
* 端末製造番号、契約者番号等の取得
* IPアドレスの検証(キャリアが公開しているIPアドレス帯域からのアクセスか判定)
* ディスプレイ情報(画面サイズ、ブラウザ画面サイズ、カラー・白黒、色数)の取得
* 文字コード変換機能／絵文字のキャリア間相互変換

また Rails 3.0 に以下の機能を追加する
* ビューへの自動振分け
* 位置情報取得などのリンクヘルパーの追加
* セッションIDをフォーム／リンクに付与(Trans SID)

== インストール
=== Rails pluginとしてインストールする場合
  % rails plugin install git://github.com/jpmobile/jpmobile.git

=== gemでインストールする場合
  % gem install jpmobile

== 使用例

=== 携帯電話の識別
環境変数 env['rack.jpmobile'] にキャリアクラスのインスタンスが格納されています。また Rack::Request#mobile としても取得可能です。

==== キャリアの識別

  case request.mobile
  when Jpmobile::Mobile::Docomo
    # for DoCoMo
  when Jpmobile::Mobile::Au
    # for au
  when Jpmobile::Mobile::Softbank
    # for SoftBank
  when Jpmobile::Mobile::Willcom
    # for Willcom
  when Jpmobile::Mobile::Emobile
    # for EMOBILE
  else
    # for PC
  end

あるいは
  if request.mobile.is_a?(Jpmobile::Mobile::Docomo)
    # for DoCoMo
  end

==== ビューの中で一部を切替える例
  <% if request.mobile? %>
    携帯電話からのアクセスです。
  <% else %>
    携帯電話からのアクセスではありません。
  <% end %>

  <% if request.smart_phone? %>
    スマートフォンからのアクセスです。
  <% else %>
    スマートフォンからのアクセスではありません。
  <% end %>



==== 別に用意した携帯電話用コントローラへリダイレクトする例
  class PcController < ApplicationController
    before_filter :redirect_if_mobile

    def index
    end

    private
    def redirect_if_mobile
      if request.mobile?
        pa = params.dup
        pa[:controller] = "/mobile"
        redirect_to pa
      elsif request.smart_phone?
        pa = params.dup
        pa[:controller] = "/smart_phone"
        redirect_to pa
      end
    end
  end

  class MobileController < ApplicationController
     mobile_filter
  end

=== 位置情報の取得
Rack::Request#mobile.position に位置情報が格納されます。

  @latitude   = request.mobile.position.lat
  @longuitude = request.mobile.position.lon

==== GeoKit(http://geokit.rubyforge.org)との連携

vandor/plugins/geokit以下にGeoKitがインストールされていると、Jpmobile::PositionにGeoKit::Mappableがincludeされる。したがって、

  request.mobile.position.distance_to('札幌駅')

とすることで、端末と「札幌駅」との距離を求めることができる。詳細は http://geokit.rubyforge.org/api/index.html 参照。

=== 端末情報の取得

端末側から通知されている場合、request.mobile.ident で
契約に固有の識別子もしくは端末の製造番号を取得できる。
両方存在する場合は契約に固有のIDが優先される。

* 契約に固有のID (request.mobile.ident_subscriber)
  * au: EZ番号(サブスクライバ番号)
  * DoCoMo: FOMAカード製造番号
  * EMOBILE: EMnet対応端末から通知されるユニークなユーザID
* 端末製造番号 (request.mobile.ident_device)
  * DoCoMo: 端末製造番号(FOMA, MOVA)
  * SoftBank: 製造番号

=== IPの検証
キャリアが公開しているIPアドレス帯域からのアクセスか判定する。
  request.mobile.valid_ip?
ただしスマートフォンの場合は必ずfalseとなる。

=== 端末の画面サイズ
request.mobile.display で Jpmobile::Display クラスのインスタンスが返る。
  画面幅 <%= request.mobile.display.width %>
  画面高さ <%= request.mobile.display.height %>

=== 文字コード変換機能／絵文字のキャリア間相互変換

jpmobileを読み込むとDoCoMo、Au、SoftBankの絵文字を透過的に扱うことができる。

* Rails の場合は vendor/plugins に配置し、下記の設定を追加することで有効になる。

  # Rack middleware を追加するメソッド
  Rails.application.config.jpmobile.mobile_filter

** 下記の設定を追加することで、<form> タグの accept-charset が変更される。

  # <form accept-charset="Shift_JIS" ...> などに変更する
  Rails.application.config.jpmobile.form_accept_charset_conversion = true

携帯電話上では特に問題とならない。PCブラウザでテストする際に問題となるためのオプション。

* Sinatra の場合は下記のように指定する。

  $LOAD_PATH << './lib/jpmobile/lib'
  require 'jpmobile'
  require 'jpmobile/rack'

  use Jpmobile::Rack::MobileCarrier
  use Jpmobile::Rack::ParamsFilter
{'fraction_non_alphanumeric': 0.1061614116285797, 'fraction_numerical': 0.0011570726063060456, 'mean_word_length': 4.470727848101266, 'pattern_counts': {'":': 0, '<': 31, '<?xml version=': 0, '>': 23, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1586477', 'n_tokens_mistral': 3956, 'n_tokens_neox': 3847, 'n_words': 420}