メイドめーる

4,588 views

Published on

presentation at 2008-12-06 RubyKansai mtg.

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,588
On SlideShare
0
From Embeds
0
Number of Embeds
1,332
Actions
Shares
0
Downloads
13
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

メイドめーる

  1. 1. 萌える Rails の作り方 メイドさんはこうやって働いている! 古川大輔 http://mogya.com
  2. 2. 自己紹介
  3. 3. 古川大輔
  4. 4. 大怪獣もぎゃ
  5. 5. 「いいめも」作った人です。
  6. 6. <ul><li>兵庫県在住 33才 </li></ul><ul><li>ヨメとインコ </li></ul>
  7. 7. フリーランス 一年生
  8. 8. お仕事 募集中!
  9. 9. メイドめーるについて
  10. 10. ... の前に。
  11. 11. ... それは 関西 Ruby 会議 の 懇親会でのこと。
  12. 12. 「 50 分くらいしゃべってみませんか?」 「よろこんで!」
  13. 13. ・・・
  14. 14.          ___ _        /    u  \       /  \    /\     /  し (>)  (<) \      |  ∪    ( __ 人 __ )  J |   _______ _        \   u    `⌒ ´    /  | |            |     ノ           \  | |            |   / ´                 | |            |   |     l              | |            |          ___ _        /    u  \       /  \    ─\    チラッ     /  し (>)  (●) \      |  ∪    ( __ 人 __ )  J |   _______ _      \   u    `⌒ ´    /  | |            |     ノ           \  | |            |   / ´                 | |            |   |     l              | |            | 試しに読んでみるお。
  15. 15.            ___ _        / :::::::::::::::: \       / ::::::─ 三三─\     / :::::::: ( ○)三(○)\      |:::::::::::::::::::: ( __ 人 __ ) ::::   |   _______ _      \ :::::::::     |r┬-|   , /  .| |            |     ノ ::::::::::::    ` ー '´    \  | |            |   / :::::::::::::::::::::              | |            |   |::::::::::::::::: l                | |            | 20 分しかないお・・・
  16. 16. ゆっくり進行に ご協力ください 途中の質問も大歓迎。
  17. 17. 今日の予定 <ul><li>メイドめーるの紹介 </li></ul><ul><li>メールのやりとり </li></ul><ul><li>Google カレンダー </li></ul><ul><li>Mextractr </li></ul><ul><li>そのほか細かい話 </li></ul>
  18. 18. メイドめーるについて
  19. 19. メイドさんが起こしてくれるサービス
  20. 20. メールで予定を登録
  21. 21. Gigazine
  22. 23. Award on rails 2008 協賛企業賞
  23. 24. 実装の話
  24. 25. linux Ruby On Rails postfix Mail fetcher POP3 Mextractr lighttpd gcal api Apache
  25. 26. linux Ruby On Rails postfix Mail sender SMTP lighttpd gcal api Rake タスク
  26. 27. メールの 受信
  27. 28. postfix からアプリケーションに メールを渡す /etc/aliases hoge: &quot;|(cd /var/hoge && ruby hoge_app)&quot;
  28. 29. rails に渡す /etc/aliases hoge: &quot;|( export RAILS_ENV=&quot;production&quot; && cd /var/maidmail && ruby script/runner &quot;SchduleMailReceiver.receive(STDIN.read)&quot; )&quot;
  29. 30. 受け取る <ul><li>appmodelsschdule_mail_receiver.rb </li></ul><ul><li>class SchduleMailReceiver < ActionMailer::Base </li></ul><ul><ul><li>def receive(email) </li></ul></ul><ul><li>email.each_header{|name,value| </li></ul><ul><li>: </li></ul>
  30. 31. 問題 例外を吐くと .... This is the Postfix program at host snares.example.com. : The Postfix program >test@example.com< : Command died with status 1: &quot;/var/MailApp/mailserver/test.rb&quot;. Command output: /usr/lib/ruby/1.8/logger.rb:518:in `initialize': Permission denied - /var/MailApp/mailserver/../log/MailServer.log (Errno::EACCES) from /usr/lib/ruby/1.8/logger.rb:518:in `open' from /usr/lib/ruby/1.8/logger.rb:518:in `open_logfile' from ユーザー宛にエラーメール
  31. 32. <ul><li>appmodelsschdule_mail_receiver.rb </li></ul><ul><li>class SchduleMailReceiver < ActionMailer::Base </li></ul><ul><ul><li>def receive(email) </li></ul></ul><ul><ul><li>begin </li></ul></ul><ul><li>email.each_header{|name,value| </li></ul><ul><li>: </li></ul><ul><li>rescue => ex </li></ul><ul><li>bt = ex.backtrace </li></ul><ul><li>logger.fatal &quot; !!!!!!!!!!!!!!!!!!!!!! exception caught: &quot; </li></ul><ul><li>logger.fatal &quot;#{bt.shift}: #{ex.message} (#{ex.class})&quot; </li></ul><ul><li>logger.fatal bt.map{|s| &quot; from #{s}&quot;}.join(&quot; &quot;) </li></ul><ul><li>logger.fatal &quot; !!!!!!!!!!!!!!!!!!!!!! &quot; </li></ul><ul><li>end </li></ul>対策:例外は出さない。
  32. 33. <ul><li>def error_catch </li></ul><ul><ul><li>logger = ActiveRecord::Base.logger </li></ul></ul><ul><li>    begin </li></ul><ul><li>yield </li></ul><ul><li>    rescue => ex </li></ul><ul><li>bt = ex.backtrace </li></ul><ul><li>logger.fatal &quot; !!!!!!!!!!!!!!!!!!!!!! exception caught: &quot; </li></ul><ul><li>logger.fatal &quot;#{bt.shift}: #{ex.message} (#{ex.class})&quot; </li></ul><ul><li>logger.fatal bt.map{|s| &quot; from #{s}&quot;}.join(&quot; &quot;) </li></ul><ul><li>logger.fatal &quot; !!!!!!!!!!!!!!!!!!!!!! &quot; </li></ul><ul><li>    end </li></ul><ul><li>end </li></ul>error_catch{ 普通の処理 }
  33. 34. 問題 2 重い。
  34. 35. 対策 <ul><li>一度 POP3 に入れてから処理 </li></ul><ul><li>daemonize </li></ul>
  35. 36. require 'net/pop' task :mail_fetcher => [:environment] do @config = YAML.load(IO.read(&quot;#{RAILS_ROOT}/config/mail_fetcher.yml&quot;)) daemonize() loop do pop = Net::POP3.new(@config[RAILS_ENV]['server']) pop.start(@config[RAILS_ENV]['username'], @config[RAILS_ENV]['password']) unless pop.mails.empty? pop.each_mail do |m| IncomingMailHandler.receive(m.pop) m.delete end end pop.finish sleep(SLEEP_TIME) end end
  36. 37. メールが少ないのだったら、 ruby script/runner でいいかも ( ぼそ )
  37. 38. メールの処理 ここまで
  38. 39. Google カレンダー
  39. 40. GCalAPI
  40. 41. server = GoogleCalendar::Service.new(                GCAL_ACCOUNT, GCAL_PASSWORD) calendar = GoogleCalendar::Calendar.new(server, GCAL_FEED) event = calendar.create_event event.st = Time.parse(&quot;2008-12-04 22:46:39&quot;) event.en = Time.parse(&quot;2008-12-04 23:46:39&quot;) event.where = &quot; 場所 &quot; event.title = &quot; 予定 &quot; event.desc =&quot; 詳細 &quot; event.save! GCalAPI :予定の登録
  41. 42. <ul><li>conditions = {} </li></ul><ul><li>conditions['start-min']=Time.parse(&quot;2008-12-04 22:46:39&quot;) </li></ul><ul><li>conditions['start-max']=Time.parse(&quot;2008-12-05 22:46:39&quot;) </li></ul><ul><li>conditions['sortorder']='d' </li></ul><ul><li>conditions['timezone']='tokyo' </li></ul><ul><li>events = calendar.events(conditions) </li></ul><ul><li>events.each{|event| </li></ul><ul><ul><li>pp event </li></ul></ul><ul><li>} </li></ul>GCalAPI :予定の取得 event.st : 2008-12-04 22:46:39 event.en : 2008-12-04 23:46:39 event.where : &quot; 場所 &quot; event.title : &quot; 予定 &quot; event.desc : &quot; 詳細 &quot;
  42. 43. Google アカウント認証
  43. 44. よくあるインターフェイス 「 Google カレンダーのユーザー名とパスワードを入力してください」
  44. 45. 予想される展開
  45. 46. Google アカウント認証 <ul><li>ClientLogin </li></ul><ul><li> 普通のログイン  ユーザー名とパスワード </li></ul><ul><li>  </li></ul>
  46. 47. Google アカウント認証 AuthSub   Web アプリケーションの  ための認証方法  
  47. 51. ユーザーを Google アクセス要求 URL に誘導 ユーザーが「許可」を押す アプリケーション アプリケーションに「一時トークン」が渡される 「一時トークン」を「永続トークン」と交換してもらう 「永続トークン」をつかって Google サービスにアクセス AuthSub のながれ
  48. 52. https://www.google.com/accounts/AuthSubRequest ?next=http://www.maidmail.jp/login/google_auth_responce &scope=http://www.google.com/calendar/feeds/ &secure=0&session=1&hd=default Google アクセス要求 URL 認証成功時に戻ってくる URL アクセスしたいサービスごとの URL
  49. 53. require 'gcalapi' require 'googlecalendar/auth_sub_util' @uri = GoogleCalendar::AuthSubUtil.build_request_url( 'http://www.example.com/responce',  'http://www.google.com/calendar/feeds/', false, #use_secure true #use_session )  GCalAPI で生成
  50. 55. 成功時のレスポンス http://www.maidmail.jp/login/google_auth_responce ?Token=XXXX 一時トークン
  51. 56. トークンの交換 authsub_token = '' one_time_token = params[:token] session_token =    GoogleCalendar::      AuthSubUtil.        exchange_session_token(one_time_token)
  52. 57. トークンを使ってアクセス gserver = GoogleCalendar::ServiceAuthSub.new(user.calendarToken) calendar = GoogleCalendar::Calendar.new(gserver,   GoogleCalendar::Calendar::DEFAULT_CALENDAR_FEED) event = calendar.create_event event.st = Time.parse(&quot;2008-12-04 22:46:39&quot;) event.en = Time.parse(&quot;2008-12-04 23:46:39&quot;) event.where = &quot; 場所 &quot; event.title = &quot; 予定 &quot; event.desc =&quot; 詳細 &quot; event.save!
  53. 58. Google カレンダーの話 ここまで。
  54. 59. Mextractr について
  55. 60. Mextractr
  56. 61. http://api.emetadata.net/mextractr ?text=[[text]] &out=[[out]] &apikey=[[apikey]] 使い方 # POST でも動きます。 パラメータ 形式 意味 text UTF8 で URL エンコードした文字列 メタデータ抽出元の文字列 out 現状 &quot;atom&quot; だけ 出力データの形式:デフォルトは atom apikey 文字列 Mextractr の API キー(必須)
  57. 62. <?xml   version=&quot;1.0&quot;   encoding=&quot;utf-8&quot;?> :      <gd:extendedProperty   name='what'   value=&quot; 定時株主総会 &quot;/>      <gd:who   valueString=&quot;* メタデータ株式会社 &quot;/>      <gd:who   valueString=&quot; 野村直之 &quot;/>      <gd:when   startTime=&quot;2008-10-23&quot;   valueString=&quot;10 月 23 日 &quot;/>      <gd:where   valueString=&quot; 東京都墨田区本所 &quot;/>      <gd:where   valueString=&quot; 弊社本店 A 会議室 &quot;/>    </entry> </feed> レスポンス
  58. 63. $ sudo gem install mextractr_webapi Bulk updating Gem source index for: http://gems.rubyforge.org Successfully installed mextractr_webapi-0.0.1 1 gem installed gem : mextractr_webapi mextractr_result = MextractrWebApi.new(MEXTRACTR_API_KEY).parse(text) mextractr_result['when'][0]['startTime'] mextractr_result['where'][0]['valueString']
  59. 64. FAQ 解析精度? 時刻? 日々精進。 明日は晴れだ!
  60. 65. Mextractr の話 ここまで
  61. 66. ( おまけ ) デザインについて
  62. 67. 私がやりました。 今は反省している。
  63. 68. 2ch でも絶賛! 【ネット】メイドさんが Google カレンダーの予定をメールで届けてくれる「メイドめーる」 6 :なまえないよぉ~ : 2008/11/11( 火 ) 13:09:10 ID:TJ3qrp7g このメールの内容担当してるヤツは 30 代独身の堅太りなおっさんなんだろ? 11 :なまえないよぉ~ : 2008/11/11( 火 ) 19:20:14 ID:kf6HEfeT 絵とかデザインがいまいちなのが痛い。
  64. 69. ふとってないもん!
  65. 70. ↑ メイドさんの出所
  66. 71. 「夢夢色 TOWN 」
  67. 72. 個人・ 商用 どちらでも利用可。 利用なさる方が全責任を持つこと。 利用に際し、第三者や当局などから当サイトに問い合わせやクレームが一切来ないように配慮しなければなりません。 連絡不要 ライセンシー不要 著作権表示不要 リンク不要 使用の際の 使用報告不要 加工可 すばらしい利用条件
  68. 73. おまけ2 なんでメイド?
  69. 74. 当初の予定: メールで Google カレンダーに 予定を書くアプリ
  70. 75. Google カレンダーって、 利用者少なくね?
  71. 76. 集客力が必要!
  72. 77. 秘書メール?
  73. 79. 秘書よりメイドのほうが注目されるよね
  74. 80. 萌え系 WEB アプリケーション 「メイドめーる」
  75. 81. ねらい通り!
  76. 82. <ul><li>「執事メールはないの?」 </li></ul><ul><li>「ドジッ子が必要だろう」 </li></ul><ul><li>「ツンデレツンデレ!」 </li></ul>主な反響
  77. 84. ・・・だれか技術を見てくれ
  78. 85. 萌え系アプリは、 いろいろたいへんです。 結論:
  79. 86. ご静聴 ありがとう ございました
  80. 87. <ul><li>メイドめーる : http://www.maidmail.jp/ </li></ul><ul><li>Drecom Award on rails 2008 : http://rails.drecom.jp/ </li></ul><ul><li>夢夢色 TOWN : http://www.poipoi.com/yakko/index.html </li></ul><ul><li>  </li></ul><ul><li>Rails でのメール処理に関するサイト </li></ul><ul><li>Stress-free Incoming E-Mail Processing with Rails http://railspikes.com/2007/6/1/rails-email-processing </li></ul><ul><li>  </li></ul><ul><li>GCalAPI に関するサイト </li></ul><ul><li>RubyForge: google calendar api: Project Info : http://rubyforge.org/projects/gcalapi/ </li></ul><ul><li>メールから Google Calendar に登録するサンプル  http://d.hatena.ne.jp/zorio/20060925/1159201438 </li></ul><ul><li>  </li></ul><ul><li>Google カレンダー API に関するサイト </li></ul><ul><li>Google Calendar API の基礎 : Under Construction, Baby : http://www.rcdtokyo.com/ucb/contents/i000815.php </li></ul><ul><li> ↑ PHP ですけど、流れがとてもわかりやすくまとまっています。オススメ。 </li></ul><ul><li>API Developer's Guide: The Protocol - Google Calendar APIs and Tools - Google Code : http://code.google.com/intl/ja/apis/calendar/docs/2.0/developers_guide_protocol.html </li></ul><ul><li>  </li></ul><ul><li>Mextractr に関するサイト </li></ul><ul><li>Mextractr メタデータ抽出エンジン : http://api.emetadata.net/doc </li></ul><ul><li>RubyForge: mextractr_webapi: Project Info : http://rubyforge.org/projects/mextractr/ </li></ul><ul><li>  </li></ul><ul><li>GoogleAuthSub に関するサイト </li></ul><ul><li>[ruby]gcalapi を使って AuthSub ログイン http://blog.mogya.com/2008/09/rubygcalapiauthsub.html </li></ul><ul><li>[ruby]GoogleAuthSub を使う http://blog.mogya.com/2008/09/googleauthsub.html </li></ul><ul><li>AuthSub Authentication for Web Applications - Account Authentication API - Google Code : http://code.google.com/apis/accounts/docs/AuthSub.html </li></ul>興味を持っていただいた方のための URL :

×