gcalapiで”Invalid date/time value”(GoogleCalendar::EventInsertFailed)

rubyからGoogleCalendarにアクセスできるgcalapiを使ったアプリケーションを書いているのですが、こんなエラーが出て苦労しました。


/usr/lib/ruby/gems/1.8/gems/gcalapi-0.1.1/lib/googlecalendar/event.rb:130:in `save!’: [Line 8, Column 106, element gd:when] Invalid date/time value. (GoogleCalendar::EventInsertFailed)

from mail2gcal.rb:87:in `from_mail’

from mail2gcal.rb:102

from /usr/lib/ruby/1.8/net/pop.rb:528:in `each’

from /usr/lib/ruby/1.8/net/pop.rb:528:in `each_mail’

from mail2gcal.rb:97

要するに、GoogleCalendarにポストしたら “Invalid date/time value”といわれました、ということらしい。

Googleのドキュメントをあさると、

Invalid date/time value

The value you entered is not a valid date/time. Please enter a date and time in the correct format: YYYY-MM-DDThh:mm:ss. For example, “1975-09-25T06:20:00” is a valid date/time value, but “June 2005 5pm” is not.

(Invalid date/time value | Google Base Help Centre)

というのを発見。



「DateTimeは”1975-09-25T06:20:00″のフォーマットで渡してね」ということ。

そんなこと言われてもgcalapiにはDate型を渡しているし、うまくいく場合もあるからgcalapi側が変な形式のデータを渡しているとは考えにくい。ソース見ても、dt.iso8601 ってやっているし。





 試行錯誤した結果、 event.enを渡さないとエラーになるらしいことが判明。

event.st = Time.parse(yaml[“st”].to_s) if yaml.has_key?(“st”)

# event.en = Time.parse(yaml[“en”].to_s) if yaml.has_key?(“en”)



 gcalapiのサンプルについているmail2gcalに対して、

st: 2008-09-06 19:20:36

title: title of an event

desc: description of an event

where: location of an event

というメールを投げると再現します。



gcalapiとしては、開発者が渡したデータを適切に変換してGoogleCalendarに渡して、その結果帰ってきたエラーを適切に報告していただけているのだから、別にgcalapiが悪いわけじゃないと思うのですが。はまったので一応メモということで。



こういうのを調べるとき、原因がgcalapiや自分のアプリにあるのか、それともGoogleCalendarにあるのか切り分けるために、gcalapiがポストしたデータを見る方法ってないものでしょうか。パケットキャプチャ以外で。


CentOS 5のRuby、はまり処

 CentOS5.2でyumを使ってrubyを入れると、ruby 1.8.5が入る。一応rails動くからいいかなぁ、などと思って使おうとすると、意外とはまったのでメモ。



なんではまるかというと、Rubyのパッケージが複数に分かれていて、yum install rubyとしただけだと、意図するものが入らない。


  • ruby
  • ruby-devel
  • ruby-irb
  • ruby-libs
  • ruby-rdoc
  • ruby-ri



普通にRubyを使おうと思ったら、上記全部入れておく必要がある。



でないと、こんなことになる。



例1:railsを入れたときにwarning

(rdocがないから)


[furukawa src]$ sudo gem install rails --remote
Bulk updating Gem source index for: http://gems.rubyforge.org
Successfully installed rake-0.8.1
Successfully installed activesupport-2.1.0
Successfully installed activerecord-2.1.0
Successfully installed actionpack-2.1.0
Successfully installed actionmailer-2.1.0
Successfully installed activeresource-2.1.0
Successfully installed rails-2.1.0
7 gems installed
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- rdoc/rdoc (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
from /usr/lib/ruby/site_ruby/1.8/rubygems/doc_manager.rb:68:in `load_rdoc'
from /usr/lib/ruby/site_ruby/1.8/rubygems/doc_manager.rb:38:in `generate



例2:sqlite-rubyを入れたとき、ヘッダがないといわれる

(ヘッダファイルがないから)


[furukawa src]$ sudo gem install sqlite-ruby
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite-ruby:
ERROR: Failed to build gem native extension.
/usr/bin/ruby extconf.rb install sqlite-ruby
can't find header files for ruby.
:



例2:sqlite-rubyを入れたとき、irbがないといわれる

(irbがないから)


[furukawa src]$ sudo gem install sqlite-ruby
Building native extensions.  This could take a while...
Successfully installed sqlite-ruby-2.2.3
1 gem installed
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require': no such file to load -- irb/slex (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
:



Rubygem-develでも、「それはまずかったと思う」と指摘されています。

Maybe it should more gracefully fail. I was using CentOS at the
time, and had installed ruby with 'yum install ruby'. It is an additional
install 'yum install irb' to get irb. :(

(Re: error when irb not installed: msg#00092)



 メンテナの方がパッケージを分けたのにはそれなりの理由があるのだと思いますし、

#サーバ上だと、Rubyで書いたプログラムさえ動けばいいからかなぁ?



とはいえ、Rubyはirbも含めてRubyだと思っている人にとって見ればびっくりする状況だと思うので、とりあえず情報提供としてブログに書いておきます。





(追記)

yum一発でなんでも入る状況が空気のように当然になっていて、逆に動かないときだけ非難されちゃうメンテナの方はとても大変だと思います。この記事も、別にメンテナの方を非難したいわけではなくて、当面困らないための情報提供として書かせていただいた次第。日本語で書いて通じるかどうか知りませんが、メンテナの方々にはとても感謝していることを、ここに明記しておきます。

[ruby]ハッシュのソートについてのメモ

なるほど、と思ったので自分の勉強メモ。rubyにおけるハッシュのソートについての考え方。
rubyでハッシュにいろいろデータを入れて取り出すとき、ソートして取り出したいよね、ということがよくある。
そうすると、ハッシュをソートしたいという発想が当然出てくるのだけれど、RubyにはHash::sortというメソッドそのものがない。
なぜか。そもそもハッシュというのは順序が保存されないもの([ruby-list:43857] Hashへの生成順は保障されないのか?)。なので、順番を並べ替えるソートという考え方に意味がない。(ソートしたってその順番通りに並ぶ保証がないのだから)
じゃあ、ハッシュのデータを順序どおりに取り出すときどうするか?そういうときは、順序が保存される配列に変換してからソートを行う。

irb(main):018:0> var = {
irb(main):019:1* 2=>"2",
irb(main):020:1* 1=>"1",
irb(main):021:1* 3=>"3"
irb(main):022:1> }
=> {1=>"1", 2=>"2", 3=>"3"}

#ね、順序が変わったでしょ?

irb(main):023:0> var_sorted_array = var.to_a.sort{|a,b|
irb(main):024:1* (a[0]  b[0])}
=> [[1, "1"], [2, "2"], [3, "3"]]

いったん配列にしたものをソートすることで、順序を決めて取り出すことができる。
使うときはこんなふうに。

irb(main):030:0> var_sorted_array.each{|var|
irb(main):031:1* p var[0]
irb(main):032:1> p var[1]
irb(main):033:1> }
1
"1"
2
"2"
3
"3"

rails勉強会に行ってきた。

rails勉強会に行ってきた。



たのしいRubyの人とかヽ( ・∀・)ノくまくまーの人が来ていました。



yuum3の人に、初心者向けセッションをしていただきました。どうもありがとうございます!



coLinuxでの環境構築


  • 資料:
  • 参考:
    • WEB+DB PRESS Vol.40 「特集2 coLinux,Emacs,GNU screen,zsh[定番]Linux開発環境」
    • ↑今回の講習はこれが元になっている。でも、このままだと結構はまった。
  • なにがうれしいのか
    • Windows上のrailsはとても遅い。coLinux上のrailsのほうが早い。
  • インストール
    • パーソナルファイアーウォールetcがあるとはまるのではずしておく
    • コア部分とFS部分のインストールがある
    • FSにはubutu/Fedora7/Debianがある。Yuumi3の人はubutuを使っている
  • 起動
    • ネットワークの設定をすませるまではcoLinuxコンソールで。英語キーボード扱いになるので注意。
    • いろいろ設定。Windowsのインターネット接続の共有機能を使ってネットワークに出られるようにする
  • インストール
    • rubyとかgemとかsqliteとか
    • sambaでファイル共有すると、Windowsのエディタで編集できる

coLinuxは、サーバで使っているのとは別のlinuxを使わないといけないので、同じマシンを動作させられるvmwareのほうがいいのでは、と思っていたのですが、お手軽さは魅力的ですね。


Scaffoldの半歩先へ


  • 参考資料
     

    • railsによるアジャイルアプリケーション開発 <いい本だけど、読みにくい
    •  

    • 舞波さんの本 <開発し出すと役に立つ
  •  

  • リファレンス
     

      

  •  


実習


  • railsコマンドで todo プロジェクトを作成。
    rails todo -d sqlite3
  • config/database.yml を変更。
  • script/generate で todos テーブルに対応する
  • Modelを作成。
    ruby script/generate  model todo due:date task:string
  • rake db:migrate でDBにテーブルを作る。
    rake db:migrate
  • script/generate scaffold でひな形を作成。
    ruby script/generate scaffold todo
  • script/server でサーバーを起動。


コードを見る


  • 重要なのはAPP
    todo\app>dir
    controllers
    helpers
    models
    views
    • いわゆるMVCモデル
  • 例えばapp/views/todos.vhtml
    • railsであつかうhtmlテンプレート。rubyのコードっぽい物が書かれている。erbとかeRubyとか。
    • <HTML>がないじゃん?:layoutsに書かれている。
  • app/controller
    • todo_controller.rb
    • URLに応じた処理が書かれている
    • 例えばlist。pagenateというのが使われている。ヘルプ見る。
      • per_pageで1ページあたりの個数とか、orderでソート順とか指定できる
    • todo_controller.rbのlistメソッドでorderを指定すると、ソート順が指定できる。
    • debugモードだと、書いたコードがそのまま動く。


名前の規約



一つのコントローラーで何でもすると大変なので、普通、いくつかのコントローラーに分ける。

実習2


実習3

このへんは、テキストにある話をザーッと流した感じ。

おまけ:ログの見方



ターミナルで見ると色つきで見える <設定すればplainTextにも出来る。ブログに記事があったはず。


感想



 動かしながらやると終わらなさそうだということでしたので、ざ~っと説明しながらやって見せていただく、という感じになりました。
当然ながらこれだけでは頭に入らないので、早速やってみないと。

コーヒー100円事件

やっちゃった….orz
いいめもで、「間違ったときどうするの?」というユーザーさんがたくさんいたので、暫定対策として、マイナスの金額の入力を認めよう、ということになりました。
で、このとき、ユーザーさんにマイナスを入力してもらうと、-(マイナス記号)じゃなくて、「-」とか「―」とか、そういう文字をマイナスのつもりで使っちゃう人もいるよね、と思ったので、
正規表現で
/([-‐-─━―]?[0-90-9,.,.]+)/を探して価格とする、というふうにしました。
起こったこと:「コーヒー100円」と書いたら「コーヒ」が「-100円」になった。
…そりゃあそうだよねorz
「コーヒー」の危険性に気づかなかった自分の責任です。
こういうの、会社だとコード/デザインレビューでつぶせるのだけれど。できなくなって始めて分かるありがたみですね。勉強になります。

ライトニングトークします

[[ITpro Challenge! ライトニング・トークスの発表者決定:http://itpro.nikkeibp.co.jp/article/Watcher/20070823/280225/]]
というわけで、ITpro Challenge!でライトニングトーク(3分間の短いプレゼン)させていただくことになりました。
ITpro Challenge!では、こんな豪華なメンバーのお話が聞けます。
– インフォテリア 江島健太郎さん([[Lingr:http://www.lingr.com]]の人!)
– Google 鵜飼文敏さん
– はてな 伊藤直也さん
– ドワンゴ 戀塚昭彦さん(ニコニコ動画の人!)
これを聞かない手はないな、と思っていたら一杯だったので、前回の[[LL魂:http://www.mogya.com/blog/2007/08/ll.html]]で学習した秘技「ライトニングトークすれば会場には入れるよ!」を発動させていただくことにいたしました。
[[発表順:http://itpro.nikkeibp.co.jp/article/Watcher/20070831/280929/]]は4番目。[[masuidrive on rails » Blog Archive » masuidrive的プロジェクトの方針:http://blog.masuidrive.jp/index.php/2007/07/11/masuidrive-working-style/]]の人のすぐ後です。ぜひぜひご挨拶して来ねば。