iCalendar on AppEngine

Okamotoプロジェクトの開発中に引っかかったとこの一つに、iCalendar gemがそのままでは使えなかったのがある。
iCalendar gemは内部でSocket#gethostnameを使用していて、これがAppEngineで制限されてるライブラリに引っかかって落ちてた。これ、iCalendar中のランダムIDとして使われているだけなので、以下のようにして潰してやれば使えるようになる。

require 'icalendar'
class Socket
  def self.gethostname
    return 'dokusho.yumenosora.net'
  end
end

過去から学ぶ。

かつて、ウチが最初に作った"Marble Note"というサービスが動いていました。
一定の成功を収めたあのサービスに学ぶべく、当時を知っているユーザの方々にアンケートをお願いしたいとおもいます。よろしければどうぞ。

http://spreadsheets.google.com/viewform?hl=ja&formkey=dExxMU1lSzZTSVNUWm5HX2x5OV9PVUE6MA

大きめの仕事が終わって。

今日のカケラの樹のメンテナンスで、開発コードネーム”Takarazuka"のカケラの樹第4世代エディタを本番環境に導入、リリースしました。このTakarazukaプロジェクトは結構開発が難航して、リソースをずっと食ってたんだけどついに完結。
一区切りなので、これまでとこれからのプロジェクトをまとめておこうかな、と思う。今年はまだまとめてなかったし。

Takauazuka

カケラの樹第4世代エディタ
本日リリース

Sakasegawa

内部用ツールの新規開発
開発中

Kotoen

七色連想(創作物ポータル)の新規開発
運用中

MondoYakujin

八会咲木陰(チャットサービス)の新規開発
運用中

Kitaguchi

認証/共通ユーティリティサービスの新規開発
開発中

Shukugawa

カケラの樹文書操作API
構想中

Ashiyagawa

カケラの樹Google App Engine移行
開発中

Okamoto

読書びよりGoogle App Engine移行
構想中

Mikage

創作活動支援プラットフォームの新規開発
構想中


コードネームは西宮北口まで到達したので*1今度は三宮方面に向かいます。
この中でも、特に重要なのはAshiyagawaかな。これでApp Engine移行に成功すれば後々の開発・運用がぐっと楽になる。

*1:ちなみに抜けている駅名は去年以前に終了したプロジェクトのコードネームとして使用済み

JRuby on Rails/AppEngineの文字化け対策。

AppEngine上でのRailsアプリ開発に再挑戦中。appengine-jruby gemによって開発がぐっと楽になっていて、今度こそいけそうな気配がしてるんだけど、開発環境で文字化けが発生した。
この問題は既知のもので、いくつか対策は公表されてるんだけどどうしてもpropertyにText型を使った場合の文字化けがとれなかった。
原因は、AppEngine::Datastore::Text#to_javaの中でto_java_stringが使われているままになっていたことで、これを上書きすれば解決できた。こんな感じ。

# appengine-jrubyのDataMapperを使用する場合の文字化け対策用パッチ
# Text対応版 by 殊海夕音
# original: http://d.hatena.ne.jp/yuum3/20090803/1249308751

module AppEngine
  module Datastore
    def Datastore.ruby_to_java(value)  # :nodoc:
      if SPECIAL_RUBY_TYPES.include? value.class
        value.to_java
      else
        case value
        when Fixnum
          java.lang.Long.new(value)
        when Float
          java.lang.Double.new(value)
        when String
          #value.to_java_string
          # Thanks http://d.hatena.ne.jp/milk1000cc/20090802/1249218370
          java.lang.String.new(value) 
        else
          value
        end
      end
    end
    
    class Text < String
      def to_java
        #JavaDatastore::Text.new(self.to_java_string)
        JavaDatastore::Text.new(java.lang.String.new(self.to_s))
      end
      
      def self.new_from_java(text)
        self.new(text.getValue)
      end
    end
  end
end

次のステップへの準備。

ウチのサービスでは、ユーザ認証にOpenIDを採用している。

この形だと、各サービスのユーザアカウントは独立なため、たとえば読書びよりを使っている人がカケラの樹を使おうとした際、別途OpenIDログインをする必要がある。また、OpenID認証を要求して、認証情報を受け取る機能も別々に実装されており、新しい機能を共通で入れようとするとそれぞれに改修が必要。
このように、いくつか問題がある。そこで、次のKitaguchiプロジェクトでは各サービスから共通に呼び出すための認証機能を実装したアプリケーションを作ることに。
このプロジェクトの完了後はこんな形になる。

これははてなとかライブドアとか、複数のサービスを一つのIDで扱えるようにしてるサービス群と同じ形で、どれかのサービスを使い始めればほかのサービスもすぐに使えるようになるのが最大のメリット。
ほかにも、認証機能を一カ所に統合できるので今よりも手の込んだ認証方法の採用もやりやすくなる。手始めにKitaguchiプロジェクトでは、複数のOpenIDを一つのプロフィールに結びつけ、どのIDを使ってでも同じユーザとしてログインできる機能を付けようと考えてる。OpenIDとサービスのアカウントが一対一で結びついている今の形だと、もしOpenIDを提供しているサービスがつぶれるとサービス側のユーザアカウントも道連れになってしまうけど、複数のOpenIDで一つのアカウントに入れるならば道連れになるリスクが減らせて、より安全に。

Lingr亡き後、しゃべり場のまとめ。

Cometを使った高速ウェブチャットだったLingr。その代替となりそうなサービスをいくつかピックアップして、まとめ。
前提条件は以下の通り。

  • ブラウザから高速なオープンチャットが可能
  • ログが保存される
  • 自由に部屋が作れる

irc.gimite.net

方式
IRC(Flash xmlsocket)
部屋作成
匿名で可能
過去ログ
HTML, Atomフィード
デスクトップ通知
IRCクライアント経由
運用
Gimite氏

使い慣れたIRCクライアントからでも入室可能。

超高速無料レンタルチャットCometeo

方式
Comet(XmlHttpRequest)
部屋作成
匿名で可能
過去ログ
HTML
デスクトップ通知
専用クライアント(Windows向け)
運用
Mito Memel氏

あの思い出のためのチャットサービス「八会咲木陰」

方式
Comet(Flash xmlsocket/XmlHttpRequest)
部屋作成
OpenIDによるログインが必要
過去ログ
HTML, RSSフィード
デスクトップ通知
Google Talk/Jabber経由
運用
殊海夕音/雨上がりの青空を探して。


他にも良さそうなサービスがあったら教えてください。

8月過ぎても大丈夫。

だいぶ前に明らかになった話だけど、8/15日以降、AmazonのProduct Advertising APIがシグネチャ必須になる。ので、このAPIを使っているアプリケーションは改修が要るんです。
先日八会咲木陰が無事にサービスインして一息ついたので、ウチでもこの問題の対処を行いました。


現在、ウチでこのPA-APIを使っているサービスは八会咲木陰、カケラの樹、読書びよりの3つで、その全てがgemのamazon-ecsを使ってます。よって、このライブラリをなんとかすればアプリケーション側にはほとんど手を入れずに済むわけ。
で、署名を生成する処理を追加するパッチがこれ。amazon-ecs-0.5.4に対するパッチです。
http://www.box.net/shared/evp8qjpuay
パッチを適用したら、アプリケーション側でSecret Access Keyの設定をします。このgemを使っているとAmazon::Ecs.optionsにアクセスキーやアソシエイトIDを渡しているはずなので、そこに追加します。

require 'amazon/ecs'
Amazon::Ecs.options = {
  :aWS_access_key_id => アクセスキー,
  :associate_tag => アソシエイトID,
  :country => :jp,
  :secret_access_key => シークレット・アクセス・キー #この行を追加
}

あとは今まで通り。


次の記事を参考にしました。

Amazon Product Advertising APIの認証の件 - zorioの日記