2008年07月31日

Railsで絵文字入りメールを送る方法

 最近は携帯向けメルマガでも絵文字入りメール使うところが増えてきているみたいですね。今回はRailsの場合に絵文字入りメールを送る場合はどうやるのかを調べてみました。

 結論から言っちゃうと、DoCoMo,auはShift_jis、SoftbankはUTF-8をBASE64でエンコードしたものにしてやれば送れます。

 あとは、絵文字の文字コードの各キャリア向けの変換ですが、jpmobile(0.0.2)をちょこと変えたものを使用しました。

 以下がサンプルコードになります。
  def send_mail(mail_address)
mail = TMail::Mail.new
docomo_or_au = (mail_address.ends_with?('docomo.ne.jp') || mail_address.ends_with?('ezweb.ne.jp'))
dummy_controller = DummyController.new
if mail_address.split('@').size == 2
case mail_address.split('@')[1]
when 'docomo.ne.jp'
dummy_controller.request.mobile = Jpmobile::Mobile::Docomo.new({})
when 'ezweb.ne.jp'
dummy_controller.request.mobile = Jpmobile::Mobile::Au.new({})
else
dummy_controller.request.mobile = Jpmobile::Mobile::Softbank.new({})
end
else
logger.error "invalid mail address:#{mail_address}"
return
end
mail_title = docomo_or_au ? NKF.nkf("-xWs", self.title) : self.title
mail_title = Jpmobile::Filter::Emoticon::Outer.new.to_external(mail_title, dummy_controller)
mail.subject = docomo_or_au ? mail_title : "=?UTF-8?B?" + Base64.b64encode(mail_title) + "?="
mail_body = docomo_or_au ? NKF.nkf("-xWs", self.body) : self.body
mail.body = Jpmobile::Filter::Emoticon::Outer.new.to_external(mail_body, dummy_controller)
mail.body = docomo_or_au ? mail.body : Base64.b64encode(mail.body)
mail.date = sent_at
mail.from = "hogehoge@hogehoge.com"
mail.to = mail_address
mail.set_content_type "text/plain; charset=#{docomo_or_au ? 'Shift_JIS' : 'UTF-8'}"
mail.transfer_encoding = "base64" unless docomo_or_au
begin
ActionMailer::Base.deliver mail
rescue Exception
logger.error "error sending to #{mail.to}: #{$!}"
end
end
 絵文字のベースは、i絵文字のUnicode形式で挿入されるものを前提としています。(晴れマークなら、。曇りマークなら、とか)まあ、jpmobileがそうだったからですが。
 DummyControllerはActionControllerで使われるのが前提のjpmobileの絵文字コード変換機能を使いたいがために無理やりこさえたクラスで、コードは以下になります。
 実装を思い付いたまま書いたので、もっとスマートな書き方はあるかもしれません。
  class DummyController
attr_accessor :request
def initialize
self.request = DummyRequest.new
end

class DummyRequest
attr_accessor :mobile
end
end
 あとは、jpmobileでうまく動かない部分と変換がSoftbankの絵文字メールの文字コードに対応していなかった部分の修正です。

 一点目。lib/jpmobile/filter.rbの153行目から165行目を以下のように。
    case controller.request.mobile.to_s
when Jpmobile::Mobile::Docomo.to_s
table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_DOCOMO
to_sjis = true
when Jpmobile::Mobile::Au.to_s
table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_AU
to_sjis = true
when Jpmobile::Mobile::Jphone.to_s
table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK
to_sjis = true
when Jpmobile::Mobile::Softbank.to_s
table = Jpmobile::Emoticon::CONVERSION_TABLE_TO_SOFTBANK
end
 自分の開発環境(Windows Vista)だけかもしれないけど、caseの判定がうまく動いていなかったので、Jpmobile::Mobile::Docomo、Jpmobile::Mobile::Auとかをto_sするように。

 二点目。lib/jpmobile/emoticon.rbの72行目を以下のように。
[converted-0x1000].pack("U")
 jpmobileでの変換がSoftbankの絵文字メールの文字コードに対応していなかった部分。

 以上です。細かい部分はしょりすぎでしょうか?
 足らない部分は意見をいただければ、随時修正させていただきます。
 これで、皆さんもバンバン絵文字メールを送っていただければと思います。

【追記:2009/04/01】
 今更ですけど、 よしみさんに指摘していただいたものを反映し、jpmobileの変更を1箇所必要ないものにしました。

posted by よっしぃ at 20:02 | Comment(1) | TrackBack(1) | Ruby On Rails

2008年05月30日

Railsのログからリクエスト時間ごとや閲覧回数ごとなどのランキングを生成してくれるツール

Rawk - Ruby on Rails Log Analyzer

 時間のかかっている処理をログから抽出したいと思い検索し見つけたツールです。

 ただのRubyのスクリプトで

 $> ruby [ダウンロードしたスクリプトファイルのパス] < [対象のログファイルのパス(production.log等)

で解析し、コンソールに結果を出力してくれます。

 ただ、現時点の最新(1.2)が私の環境(Rails 1.2.5)のログだとうまく動いてくれず(ZeroDivisionErrorが発生)、スクリプトを修正する必要がありました。

 修正は、スクリプトの181行目に対し以下のように行いました。


修正前) next unless $_.index("Completed in") == 0

修正後) next unless $_.index("Completed in")


 同じ現象が発生するなら試してみて下さい。


 また、通常はリクエストURLからコントローラーとアクションを推測して集計されます。そのためruotes.rbの設定によっては、うまく単位がまとまってくれない場合があります。

 その場合、ログに指定した形式でプロセスIDを出すようにすると、コントローラーのアクションごとに集計してくれるようになります。

 それは、config/environment.rbに以下の記述を追加すればできるようになります。(ちなみに、スクリプトのヘルプ(-?を与えて実行で出力される)で指定される記述だとうまくいきませんでした)

class Logger
alias format_message old_format_message

def format_message(severity, timestamp, progname, msg)
old_format_message(severity, timestamp, progname, "#{msg} (pid:#{$$})")
end
end

 ちょっと修正が必要でしたが、ほぼ手間なしで有用な分析情報が手に入れられます。サイトの改善などに悩んでいるRails開発者には便利なツールといっていいでしょう。
タグ:ruby on rails

posted by よっしぃ at 17:55 | Comment(0) | TrackBack(0) | Ruby On Rails

2008年05月22日

Passenger上のRailsとTracなどを共存させるための設定(の追記)

Passenger上のRailsとTracなどを共存させるための設定

 上記の設定をしてもapacheの設定の<VirtualHost>〜</VirtualHost>内にPassenger(mod_rails)とtracの設定が共存しているとtracが動かななってしまいました。

 今回はそれを解消する方法がわかったので紹介させていただきます。

 apacheの設定で

 ScriptAlias /trac /usr/share/trac/cgi-bin/trac.fcgi
 ※trac.fcgiのパスは環境によって違う可能性があります



 ScriptAliasMatch /trac(.*) /usr/share/trac/cgi-bin/trac.fcgi

とします。

 これだけです。

 これで、ようやく同じドメインでPassenger(mod_rails)のRailsとtracの共存ができるようになりました。

 この問題でPassenger(mod_rails)の導入ができてなかった人は是非試してみて下さい!

タグ:ruby on rails

posted by よっしぃ at 12:57 | Comment(0) | TrackBack(0) | Ruby On Rails

2008年04月18日

Passenger上のRailsとTracなどを共存させるための設定

Passenger (mod_rails for apache)での色んな設定値について調べてみた

 こんな感じの記事を書いてみたのだけど、補足事項があったのでこっちに書いてみる。

 上記サイトの設定を加えたサーバーで、tracなど、Rails以外のアプリが動いていた場合、その他のアプリがうまく動かなくなってしまいます。

 その場合、まずApacheの設定ファイルに以下の項目を追加します。

  RailsAutoDetect off

 その上で<VirtualHost>〜</VirtualHost>内に以下の項目を追加します。

  RailsBaseURI /

 これで、上記の現象が解消します。

 特に、Tracなどは動かしていることが多いと思うので紹介してみました。

posted by よっしぃ at 18:59 | Comment(0) | TrackBack(1) | Ruby On Rails

2008年03月08日

電源管理のアイコンセット(Vista対応版)


posted by よっしぃ at 20:00 | Comment(0) | TrackBack(0) | その他

2007年11月05日

Postfix2.4とBerkeleyDBの微妙な関係

 バージョンがいくつになってもBerkeleyDBに振り回されるPostfix。

 まず、makedefsを編集しなきゃいかん。

 ふかふかの部屋 - Install Memo - Postfixの下のほう

 で、make installでエラーになるので

 sudo vi /etc/ld.so.conf

 /usr/local/BerkeleyDB.4.6/libを追加(数字はインストールされているBerkeleyDBのバージョンによって違う)

 で
 sudo ldconfig


 あとは、
 make tidy
 make -f Makefile.init makefiles \
CCARGS="-I/usr/local/BerkeleyDB.4.6/include" \
AUXLIBS="-L/usr/local/BerkeleyDB.4.6/lib -ldb"
 make
 make install


 で終了。あーめんどくさい。

posted by よっしぃ at 10:59 | Comment(0) | TrackBack(0) | Linux

2007年10月16日

Railsでau携帯の分割ダウンロードに対処するコードを公開してみる

 Railsでauの携帯電話から3g2の動画がダウンロードできるようにするコードを書いたので公開してみる。

 auの携帯電話から3g2をダウンロードしようとすると分割ダウンロードの要求が送られて、au用マルチメディア・コンテンツダウンロードタグにしても「ダウンロードデータが正しくありません」となってしまうという現象が発生していました。

 これはその現象にRailsで対処するためのコードです。あくまでも参考のためのサンプルで動作の保障はできません。
def send_3g2_file
path = RAILS_ROOT + '/public/' + params[:filename]
filesize = File::size(path)
range = request.env["HTTP_RANGE"]

if range and /^bytes=(\d+)\-(\d+)$/ =~ range
offset = $1.to_i
limit = $2.to_i
length = limit - offset + 1
response.headers["Content-Range"] = sprintf("bytes %d-%d/%d", offset, limit, filesize)
response.headers["Content-Disposition"] = "devmpzz"
content = IO::read(path, length, offset)
status = 206
else
content = IO::read(path)
status = 200
end

response.headers["Accept-Ranges"] = "bytes"
response.headers["Content-Length"] = length

Content-Typeの後に「; charset=utf-8」とか付かないようにするため
response.headers["Content-Transfer-Encoding"] = "binary"

render :text => content, :status => status, :content_type => "video/3gpp2", :layout => false
end

posted by よっしぃ at 10:31 | Comment(0) | TrackBack(1) | Ruby On Rails

2007年10月12日

libfaac、libfaadのコンパイル&インストール


posted by よっしぃ at 20:17 | Comment(0) | TrackBack(0) | Linux

2007年10月09日

[Rails 2.0 Preview]新機能いくつか

 Rails 2.0: Preview Releaseの新機能でわかりやすいところをあげてみる。

scaffoldの変更


 まず、scaffoldで作成されるものが変わった。Rails 1.2でscaffold_resourceで作成されるものが2.0では、scaffoldになった。scaffold_resourceでは、RESTfulのコードが作成されていたので、Rails 2.0以降は、RESTfulメインということのようです。

1つのアクションに対して複数のビューが指定できる


 これも、Rails 1.2で少し出てきていたが、1つのアクションに対して複数のビューを指定できるようになった。
 またそのビューごとにテンプレートエンジンを指定できるようになった。

 リクエストでは、「(アクション).(拡張子)」と指定できるようになりました。描画形式はhtml、rss、xmlとか、テンプレートエンジンは、erb(Rails標準)、haml(記述が簡単なテンプレートエンジン ※使用できるためには別途ライブラリが必要)とかになると思います。

show.html.erbだと、showアクションの結果をhtml形式で出力するerbベースのビュー、show.xml.hamlだと、showアクションの結果をxml形式で出力するhamlベースのビューということになります。

 この変更のため、scaffoldで作成されるファイルもedit.html.erb、index.html.erb等に変更されています。

マイグレーションの記述方式の変更


create_table :people do |t|
t.column, "account_id", :integer
t.column, "first_name", :string, :null => false
t.column, "last_name", :string, :null => false
t.column, "description", :text
t.column, "created_at", :datetime
t.column, "updated_at", :datetime
end


create_table :people do |t|
t.integer :account_id
t.string :first_name, :last_name, :null => false
t.text :description
t.timestamps
end

のように記述できるようになりました。

 t.column ・・・の代わりに、t.integer、t.stringとか型名の関数で指定できます。

 同じ型でオプションが同じ場合、t.string :first_name, :last_name, :null => falseとか複数まとめて指定できます。

 t.timestampsと指定すると、t.datetime :created_at, :updated_atと同じ意味になります。
タグ:ruby on rails 2.0

posted by よっしぃ at 17:49 | Comment(0) | TrackBack(0) | Ruby On Rails

2007年10月03日

[Rails 2.0 Preview]データベース作成・削除のRakeタスクの追加

 Rails 2.0: Preview Releaseに興味深いRakeタスクが追加されていたので紹介します。

 紹介したいのは以下の4つです。
db:create
db:create:all
db:drop
db:drop:all
 db:create〜はデータベース作成、db:drop〜はデータベース削除のタスクになります。どれもconfig/database.ymlを元に操作を行います。allがあれば、config/database/ymlに定義してある全てが、allがなければ、RAILS_ENV(何も指定しなければdevelopment)にあたるものが対象になります。

 MySQLの場合、db:create〜でCHARSETとCOLLATIONが指定できます。何も指定しないと、それぞれ「utf8」、「utf8_general_ci」となります。

 ちなみに、どのコマンドもhostの値がlocalhostの時にのみ実行できます。
タグ:2.0 ruby on rails

posted by よっしぃ at 22:20 | Comment(0) | TrackBack(2) | Ruby On Rails

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。