2008年8月20日水曜日

Mixi が OpenID に対応

mixiOpenID に対応しました。早速、利用してみました。

今回 mixi が対応した OpenID のバージョンは 2.0 とのこと。
つまり、ユーザは URI を入力することなく、 OpenID 対応のサイトから
  • mixi.jp と入力する
  • 「mixi アカウントでログイン」というボタンを押す
のどちらかでサードパーティサイトにログインすることが可能になります。
※試してみたい方は、例えばhttp://twitwi.tw/ から mixi.jp と入力してみてください。

ちなみに、OpenID の URI は、
https://id.mixi.jp/{ユーザID}
のようになっており、Yahoo よりは、分かりやすい形になっています。 (が、前述の理由で、ユーザはこの URI を覚える必要はありません。)

mixi の OpenID はサードパーティに、OpenID に付随する属性情報を公開する仕組み (OpenID Extentions) という仕様を採用しています。 mixi の OpenID では、OpenID の持ち主のニックネームを公開している模様です。サードパーティは OpenID でログインしたユーザのニックネームをサイト上で利用できることになります。
これは、Yahoo の OpenID がサードパーティに個人特定情報を一切解放していないのとは対照的です。

今回のリリースに関連して、mixi は 以下のページを公開しました。これらを見ていると、個人的な印象ですが、 mixi はサードパーティに対して加速度的にオープン化していくことを伺わせます。

また、サードパーティのサイトから mixi での OpenID 認証のために、mixi にリダイレクトしますが、この際、広告のある、 mixi の認証ページを挟んでいます。これにより、広告のインプレッションも増加するでしょう。

2008年8月18日月曜日

Merb ことはじめ

Ruby には、Rails 以外にも様々な Web Application フレームワークがあります
今回はその内のひとつ、 Merb を試してみました。

Merb とは?

Merb (Mongrel + Erb) は Ruby で書かれた MVC フレームワークです。

「規約と DRY」の Rails は、何でもできる一方で、コアが必要以上に大きいフレームワークとなっています。このため、あるプロジェクトでは Rails は冗長すぎる可能性もあります。

一方、Merb が目指したのは「疑わしきは入れず」。
コアはあくまでシンプルに。必要なものを必要に応じて追加していくイメージのフレームワークです。
この点で、Merb の本家サイトではその特徴として、
  • Faster
  • Lighter
  • More Agile
を謳っています。

Welcome!

以下では、Merb 0.9.4 及び、ランタイムとして Ruby 1.8.6 を利用します。
まず、以下のコマンドでインストールをします。
$ sudo gem install merb --include-dependencies
続いて、Merb アプリケーション、hello_merb を生成します。
$ merb-gen app hello_merb
Generating with app generator:
[ADDED] hello_merb/test/test_helper.rb
[ADDED] hello_merb/public/stylesheets/master.css
.......
[ADDED] hello_merb/app/views/layout/application.html.erb

$ cd hello_merb

merb は以下のコマンドで一発で起動します。
$ merb
これで、http://localhost:4000/ にアクセスすると、Welcome! のページが表示されるようになります。

Hello, Merb!

次に Controller を利用して、Hello, Merb の文字列を表示させてみます。Merb には generator が装備されています。以下のコマンドから、hello コントローラを生成します。
$ merb-gen controller hello
Generating with controller generator:
[ADDED] app/controllers/hello.rb
[ADDED] app/views/hello/index.html.erb
[ADDED] spec/controllers/hello_spec.rb
[ADDED] app/helpers/hello_helper.rb
[ADDED] spec/helpers/hello_helper_spec.rb
Rails と異なり、Controller の名前の後ろに _controller はつきませんので注意。Hello, Merb を表示する方法は次の 2 通り。
  • app/views/hello/index.html.erb に文字列 Hello, Merb! と記述。
  • Hello Controller の index アクションを、以下のように変更
    class Hello < Application
    # ...and remember, everything returned from an action
    # goes to the client...
    def index
    "Hello, Merb!"
    end

    end
2 番目の方法において、アクションの実行結果のオブジェクトが HTTP レスポンスボディになることを利用しています。

これらの作業により、http://localhost:4000/hello/ にアクセスすると、"Hello, Merb!" が表示されます。

DataMapper を利用する

Merb のデフォルトの Object Relational Mapper: ORM は Rails と同じく ActiveRecord です。しかし、Merb の性質上、他の ORM を利用することができます。せっかくなので、今回は、ActiveRecord とは別の ORM、DataMapper を利用します。

DataMapper は、
  • 高速
  • スレッドセーフ
  • 高機能
を目標とした、Ruby で記述された ORM です。

まず、DataMapper の インストールです。
Merb 上で利用する場合、Edge DataMapper が必要です。
Edge DataMapper を以下のコマンドからインストールします。
$ sudo gem install addressable english rspec
$ mkdir -p ~/src
$ cd ~/src
$ sudo gem install sake
$ sake -i 'http://github.com/dkubb/dm-dev/tree/master/dm-dev.sake?raw=true'
$ sake dm:clone
$ cd dm
$ sake dm:install
※ 以下のコマンドでも DataMapper 自体インストールできます。 ただ、 Edge DataMapper をインストールしないと、Merb 上では DataMapper が上手く動作しませんでした。
$ gem install data_objects do_sqlite3 do_mysql dm-core 
さて、次に、 DataMapper を利用したアプリケーション、 dm_test を作成することにします。
先程作成した、hello_merb ディレクトリから一旦抜けてください。

ORM に DataMapper を利用したアプリケーション、 dm_test を以下のコマンドから作成します。
$ merb-gen app --orm datamapper dm_test
Generating with app generator:
[ADDED] dm_test/test/test_helper.rb
[ADDED] dm_test/public/stylesheets/master.css
[ADDED] dm_test/config/init.rb
....
[ADDED] dm_test/app/views/layout/application.html.erb
更に、config/database.yml.sample を生成します。
rake dm:db:database_yaml
これをコピーし、config/database.yml とし、データベースを環境に合わせ、以下のように設定します。
# This is a sample database file for the DataMapper ORM
development: &defaults
# These are the settings for repository :default
adapter: mysql
database: dm_test
username: dm_test_user
password: secret
host: localhost
次に、モデルを生成します。
$ merb-gen model user
Generating with model generator:
[ADDED] spec/models/user_spec.rb
[ADDED] app/models/user.rb
生成されたモデルを以下のように編集します。
class User
include DataMapper::Resource
property :id, Integer, :serial => true
property :name, String, :nullable => false
end
そして migrate。
rake dm:db:automigrate
ここまでできたら、merb -i (Rails での script/console) で model を操作してみます。
$ merb -i
~ Loaded DEVELOPMENT Environment...
~ Connecting to database...
~ loading gem 'merb_datamapper' ...
~ Compiling routes...
~ Using 'share-nothing' cookie sessions (4kb limit per client)

# User を生成
irb(main):001:0>user = User.new(:name => "Naofumi HAIDA")
=> #<User id=nil name="Naofumi HAIDA">

# 保存
irb(main):002:0> user.save
=> true

# 取得
irb(main):003:0> User.all
=> [#<User id=1 name="Naofumi HAIDA">]

# id 1 のユーザを取得
irb(main):004:0> User.get(1)
=> #<User id=1 name="Naofumi HAIDA">
このように、ユーザモデルを操作できるようになりました。同様にコントローラからモデルを操作することにより、アプリケーションができていきます。

DataMapper の repository 機能

DataMapper では複数の Database を簡単に使い分けることができます。先程の config/database.yml ファイルの repositories の項目に以下のように記述を追加します。
# This is a sample database file for the DataMapper ORM
development: &defaults
# These are the settings for repository :default
adapter: mysql
database: dm_test
username: dm_test_user
password: secret
host: localhost

# レポジトリの設定
repositories:
common:
adapter: mysql
encoding: utf8
database: dm_test_common
username: dm_test
password: dm_test_user
host: localhost
共通で利用する DB が別にある場合を想定して、common という名前の DB を設定してみました。これを以下のように利用できます。
# デフォルトで利用する DB からデータを取得
user = User.first
# 共通データベースからデータを取得
admin = Admin.first(:repository => repository(:common))
モデル単位でどこのリポジトリを使うか、を設定できますので、上記のように、普通のデータはデフォルトの DB に入れ、あるモデルは :common から取得する、という使い方もできます。

まとめ

本記事のように、Merb では必要に応じ、必要なライブラリを使いながらアプリケーションを構築していくことができます。また、Rails ライクにアプリケーションを作成できるので、Rails からの乗り換えもそれほど大変ではないかと思います。


※ 参考記事

2008年8月17日日曜日

RSS に広告が表示されます

RSS 広告と言えば、日本では RSS 広告社 が有名です。

しかし、この度、というリリース。
このブログの RSS にも広告が入るかな、と思い、早速試してみました。

これまで、このブログではデフォルトの RSS へのアクセス (http://purple-skys.blogspot.com/feeds/posts/default) を Feed Burner の作成する RSS にリダイレクトすることで、FeedBurner の持つ、レポート機能など、便利な機能を利用していました。

ところで、Google は FeedBurner を買収しています ので、今回のリリースにより、 FeedBurner で作成した RSS に、広告を表示するオプションがつくのかな、と思いきや??
Adsense アカウントと FeedBurner アカウントへのインテグレートは作業中、とのことです。

仕方なく、アドセンスで、新規に Haida's weblog というフィードを作りました。
このフィードを、利用している RSS リーダにアグリゲートさせると、広告が表示されるようになります。
※ 今のところ挿入される広告は、バナー広告とテキスト広告の組合せとなっているようです。

やるなぁ、Google。。
このシステムにより、Google はブログのフィード、という巨大なメディア媒体を Ad Network 化することになる訳です。

さて、今までこのブログをフィード登録してくださっていたみなさま、是非この機会に、こちらのフィード → Haida's weblog に切り替えてみては??笑

※ FeedBurner で作成した RSS を、新規に作った RSS にリダイレクトすれば良いという話もあります。しかし、 FeedBurner では、RSS をさらにリダイレクトさせる機能は見当たりませんでした。

2008年8月1日金曜日

Ext JS 勉強会メモ

最近 ExtJS という JavaScript ライブラリが注目されています。
開発者は、このライブラリを利用することで、簡単に Windows ライクな UI を実装することができます。例えば Feed Viewer とか、Web Desktop とか。
最近、日本でも Ext Japan が設立され、勉強会が行われるようになりました。

29/07/2008 @ 青山 で開催された、第 2 回 ExtJS/ExtGWT 勉強会 (Powered by Ext JAPAN) に参加してきましたので、そのメモを残しておきます。今回の参加者は 20 名。

※ ちなみに API Document (日本語) もあります。

ExtJS を利用したアプリケーションの作り方


参考: http://www.xenophy.com/
ExtJS を利用したアプリケーション作成では、以下の手順はほぼ必ず踏むことになる。

1. 3 ファイルを読み込む
- ext-all.css, ext-base.js, ext-all.js

2. ソースを書く

- DOM ロードを待って実行するソースコードを記述
Ext.onReady(function() {
});


- レイアウトを記述するコードを書く
良く利用される border レイアウトの例
Ext.onReady(
function() {
new Ext.Viewport(
{
layout: 'border',
title: 'Sample Codes',
items: [
{
region: 'north',
height: 100,
title: 'North Area'
},
{
region: 'west',
width: 100,
split: true,
title: 'West Area'
},
{
region: 'east',
title: 'East Area'
}
],
renderTo: Ext.getBody()
}
);
}
);

- アプリケーションのためのクラス設計
Ext JS でクラスを作成するには、Ext.util.Observable を継承すること

- 名前空間の定義 (Packaging)
Ext.ns('Ext.app');


- 継承の例
// App という名前空間を定義
Ext.app.App = function(cfg) {
// config 適用
Ext.apply(this, cfg);

// 親コンストラクタ呼び出し
Ext.app.App.superclass.constructor.call(this, {
});
};


// Ext.app.App を Ext.util.Observable というクラスを継承させる
Ext.extend(Ext.app.App, Ext.util.Observable, {
init: function() {
new Ext.Viewport(
{
layout: 'border',
title: 'Sample Codes',
items: [
{
region: 'north',
height: 100,
title: 'North Area'
},
{
region: 'west',
width: 100,
split: true,
title: 'West Area'
},
{
region: 'east',
title: 'East Area'
}
],
renderTo: Ext.getBody()
}
);
}
});

- extJS はまだクロスブラウザで挙動が安定しないこともあるらしい


OpenSocial で作る Ext アプリケーション



田中洋一郎様 発表

OpenSocial とは?


Facebook ショックが発端。

1.開発者がアプリケーションを自由に登録できる (Facebook Platform)
→ 会員は登録された多くのアプリケーションを利用できる

2.SNS アプリケーションの登場
  • 会員情報を利用する
  • 友達関係を利用する
  • SNS が提供する Web ページに統合される
  • アプリケーションの利用状況が共有される
  • SNS 外のデータを利用できる
3. Facebook アプリケーション利用による利害関係

SNS 利用者
  • 次々と新しい APP を得られる
  • 常に新鮮な気持ちを持って SNS を利用できる

運営者
  • 自ら機能追加をしなくて済む
  • APP がコンテンツを生みだしてくれる

開発者
  • ユーザ獲得の手間がない
  • 広告をアプリ内に入れればマネタイズ可能


※ Facebook アプリケーションの弱点
→ 他の SNS に移植する手間がとてもかかる
→ OpenSocial (= Learn once, Write anywhere.) の登場

OpenSocial アプリケーションの作り方



標準技術の適用により学習コストが低い
  • HTML + JavaScript + REST + OAuth
  • Web アプリ開発者の日常使用技術
  • 例えば、HelloWorld なら以下くらいのソースコードを書くと良い
<?XML version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="Hello">
<Require feature="opensocial-0.7" />
</ModulePrefs>
<Contents type="html"><![CDATA[
Hello, world
]]></Contents>
</Module>

OpenSocial API


1. People & Friends の情報取得

2. Activities
アプリケーションの利用状況を公開 & 共有

3. Persistence
標準で提供されるデータ格納領域

Ext.js と OpenSocial


OpenSocial が html や JavaScript といった Web 標準技術を利用しているため、相性は良い。上記の例の content タグ内に、 普通に ExtJs のアプリケーションコードを書くだけ。

OpenSocial の現在のステータス


OpenSocial ver 0.8。ver 1.0 の登場も間近


Ext GWT で作成する GWT で作成する iPhone ウェブアプリ



GWT とは??

  • Google 発 Java → JavaScript コンパイラ
  • GWT Hosted Browser ← 書いたコードをテストする専用ブラウザ
  • JRE emulation library
  • GWT WebUI class ライブラリ
  • サーバ側も Java でそのまま記述

ExtGWT を利用するにあたり、インストールするもの

  • Exlipse 3.4 + WTP
  • Cypal Studio for GWT RC8
  • GWT 1.5
  • GXT 1.0.1
  • Apache tomecat 5.5.6
  • JDK

Ext GWT で作成する iPhone ウェブアプリ



スクリーンキャスト (Jingを利用) があるが、後日アップロードされる
  • panel の横幅 は 320px
  • viewport メタタグ
  • windowResizeListner でイベントをキャッチ



その他



勉強会は来月 (8月) もあり
  • extjs.co.jp から資料辿れる
  • extjs 2.0 は来月 (2008/8 月)リリース予定


GPL ver3 に準拠するアプリケーションならばオープンソースとして利用できる
※商用な用途のものは商用ライセンスを購入する
  • チームライセンス, ワークグループライセンス
  • ライセンスは EXT JS LLC 米国からライセンスを買う
  • Ext Japan は販売代行であり、Ext Japan はサポートで稼ぐ
※ ライセンスに関しては最後の質疑応答で頻繁に質問されていました。

マッシュアップキャラバンでも利用したらどうか、とか。

その他参考になりそうな記事


IBM Developer Networks 内にいくつかExtJS 関連の記事がありました。