Lingr APIで何か作る日記

Lingr APIを使って何か面白いものが作れないかと試行錯誤する日記です。

2007-02-15

Lingr APIログインする  Lingr APIでログインする - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク -  Lingr APIでログインする - Lingr APIで何か作る日記  Lingr APIでログインする - Lingr APIで何か作る日記 のブックマークコメント

今日RailsからLingr APIを使ってみます。今日ログインに挑戦します。

Lingrへは、メールアドレスパスワードを使ってログインします。ログインすると、いま発行されているセッションユーザ情報が結び付けられます。API経由の場合、auth.loginを呼び出します。

これを、Railsからも使えるようにします。まずは、ユーザを表すUserモデルを新しく作ります。

$ script/generate model User session_id:integer email:string
class User < ActiveRecord::Base
  belongs_to :session
  validates_presence_of :email
end

Userモデル属性は、Sessionを参照するためのsession_idと、ユーザを識別するためのメールアドレスです。間違ってもパスワードは保存しません。

次に、Sessionモデルを修正して、loginメソッドを追加します。loginメソッドは、メールアドレスパスワードを受け取って、API Clientを使ってログインします。ログインに成功すると、先ほど作ったUserモデルユーザを追加します。すでにユーザ存在する場合は、データベースからUserモデルを取得します。

  def login(email, password)
    api = Lingr::ApiClient.new(nil)
    api.session = name
    response = api.login(email, password)
    unless response[:succeeded]
      p response
      p response[:response]
      error = response[:response]['error']
      message = "#{error['message']} (#{error['code']})"
      raise StandardError.new(message)
    end
    self.user = User.find_or_create_by_email(email)
  end

使い方はこんな感じ。簡単です。

$ script/console
Loading development environment.
>> session = Session.create
>> session.login('メールアドレス', 'パスワード')
>> session.user.email
=> "example@gmail.com"
>> session.logout
>> session.user
=> nil

ログアウト処理も追加しました。

  def logout
    api = Lingr::ApiClient.new(nil)
    api.session = name
    response = api.logout
    unless response[:succeeded]
      error = response[:response]['error']
      message = "#{error['message']} (#{error['code']})"
      raise StandardError.new(message)
    end
    self.user = nil
  end

2007-02-12

セッションを使ってroom.enterでルームに入る (その3)  セッションを使ってroom.enterでルームに入る (その3) - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク -  セッションを使ってroom.enterでルームに入る (その3) - Lingr APIで何か作る日記  セッションを使ってroom.enterでルームに入る (その3) - Lingr APIで何か作る日記 のブックマークコメント

Railsモデル側がだいぶできたので、Webブラウザからroom.observeを呼び出してLingrチャットルームを見られるようにしましょう。

まず最初に、room.enterレスポンスのうち、counterとmax_observe_timeもDBに保存するように、Occupantモデルを修正します。

Index: app/models/occupant.rb
===================================================================
--- app/models/occupant.rb      (revision 72)
+++ app/models/occupant.rb      (working copy)
@@ -17,6 +17,8 @@
     end
     self.ticket = response[:response]['ticket']
     self.name = response[:response]['occupant_id']
+    self.counter = response[:response]["room"]["counter"].to_i
+    self.max_observe_time = response[:response]['max_observe_time'].to_i
     self.room.name = response[:response]['room']['name']
     self.room.save
   end

次に、Railsコントローラとビューを作ります。

$ script/generate Controller room show

Roomコントローラ (app/controllers/room_controller.rb) のshowアクションでは、セッションを生成して指定されたルームに入室します。

class RoomController < ApplicationController
  def show
    room = Room.find(params[:id])
    if @room
      @session = Session.create
      @occupant = Occupant.create(:session => @session, :room => room)
    end
  end
end

showアクションに対応するビュー (app/views/room/show.rhtml) では、room.enterで取得したsession, ticket, counterをテキストフィールドに埋め込んでいます。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
  <head>
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <title>JSONP Test</title>
    <script type="text/javascript" src="/javascripts/prototype.js"></script>
    <script type="text/javascript" src="/javascripts/prototype-jsonp.js"></script>
    <script type="text/javascript" src="/javascripts/lingr.js"></script>
  </head>
  <body>
    <input id="session" name="session" type="text" value="<%=h @session.name %>" />
    <input id="ticket" name="ticket" type="text" value="<%=h @occupant.ticket %>" />
    <input id="counter" name="counter" type="text" value="<%=h @occupant.counter %>" />
    <button onclick="observeLingr()">connect Lingr (observe)</button>
    <ul id="messages"></ul>
  </body>
</html>

これでRails側の準備はおしまいです。次はWebブラウザからJavaScriptを使って、チャットルームのメッセージを取得します。

JavaScriptでJSONPを使う  JavaScriptでJSONPを使う - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク -  JavaScriptでJSONPを使う - Lingr APIで何か作る日記  JavaScriptでJSONPを使う - Lingr APIで何か作る日記 のブックマークコメント

Webブラウザごにょごにょする前に、JavaScriptでJSONPを簡単に使えるようにします。RailsJavaScriptと言えばprototype.jsなので、prototype.jsでJSONPを扱う方法を調べます。MochiKit で JSONP の利用 - 2nd lifeによると、「prototype.js なら dojoの ScriptSrcIO ライクに拡張したno title」が使えるようです。

リンク先のJavaScriptファイルコピペして、「prototype-json.js」という名前で保存しました。オリジナルのままだと動かなかったので、下記のように修正しています。

$ diff -u aaa.js prototype-jsonp.js
--- aaa.js      2007-02-12 23:36:26.759944464 +0900
+++ prototype-jsonp.js  2007-02-10 10:49:33.145858968 +0900
@@ -40,7 +40,7 @@
     try {
       this.url = url;
       if (this.options.method == 'get' && parameters.length > 0)
-        this.url += (this.url.match(/?/) ? '&' : '?') + parameters;
+        this.url += (this.url.match(/\?/) ? '&' : '?') + parameters;

       Ajax.Responders.dispatch('onCreate', this, this.transport);

@@ -72,9 +72,10 @@
   }
 });

-com.espn.io.ScriptSrcTransport = Class.create();

-com.espn.io.ScriptSrcTransport.prototype = {
+EspnScriptSrcTransport = Class.create();
+
+EspnScriptSrcTransport.prototype = {
        initialize: function()
        {
                if(!document.scriptRequests){ document.scriptRequests = []; }
@@ -100,7 +101,7 @@

                if(jsonParamName)
                {
-                       sep = (/?/.test(url)) ? '&' : '?';
+                       sep = (/\?/.test(url)) ? '&' : '?';

使い方はリンク先に書いてあるとおりです。urlにはJSONPのURLを入れます。

new Ajax.Request(url,
{
	transport: com.espn.io.ScriptSrcTransport,
	jsonParamName: 'callback',
	method: 'get',
	onFailure: this.doClipFailure.bind(this),
	onSuccess: this.showClips.bind(this)
});

WebブラウザからJSONPで部屋を覗く (observe)  WebブラウザからJSONPで部屋を覗く (observe) - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク -  WebブラウザからJSONPで部屋を覗く (observe) - Lingr APIで何か作る日記  WebブラウザからJSONPで部屋を覗く (observe) - Lingr APIで何か作る日記 のブックマークコメント

Railsからもらったsession, ticket, counterを使って、Webブラウザからroom.observeを呼び出します。ソースは下に載せておきます。要点だけ箇条書きで書いておきます。

  • timeoutSecondsを必ず指定すること。値はroom.enter戻り値の一つ、max_observe_timeよりも大きくする。(さっき試したら80秒だったので、余裕を持って120秒にしている)
  • onFailureはサーバとの接続に失敗したか、timeoutSecondsで設定した時間が経っても応答が無かった場合。
  • onSuccessはサーバから応答が返ってきた場合。応答の種類によって処理が異なる。
    • statusがokの場合: 誰かが発言したか、max_observe_timeの時間が過ぎたかのどちらか。後者の場合はjson.messagesが空になる。counterも進まない。
    • statusがfailの場合: sessionやticketの有効期限切れなど。たぶんそのままリクエストを再送しても無駄
  • console.logはFireBug用のデバッグログ。
  • このままだとJSONPでroom.observeを呼ぶたびに、headのscriptタグがどんどん増えていく。本当は呼び終わったらscriptタグを消すべし(やり方分からない。req.abort()を呼べばいい?)。

と言うわけで、onSuccessかつstatusが'ok'の場合のみに、リクエストを再送 (再びobserveLingr関数を実行) しています。さらに、messages配列存在する場合は、showMessage関数を呼び出してWebブラウザの画面にチャットの発言を表示します。

一応、これでJSONPを使ってLingr API経由でチャットを見られるようになりました。

var lingr_base = 'http://www.lingr.com/api';

function observeLingr() {
  var url = lingr_base + '/room/observe/';
  url += '?session=' + $F('session');
  url += '&ticket=' + $F('ticket');
  url += '&counter=' + $F('counter');
  url += '&format=json';
  new Ajax.Request(url, {
    method: 'get',
    transport: EspnScriptSrcTransport,
    jsonParamName: 'callback',
    timeoutSeconds: 120,
    onFailure: function(req, json) {
      console.log(req);
      console.log('connection error');
    },
    onSuccess: function(req, json) {
      if (json && json.status == 'ok') {
        if (json.messages) {
          showMessage(json.messages);
          $('counter').value = json.counter;
        }
        observeLingr();
      } else {
        // Error was returned by Lingr API
        console.log('response error');
      }
    }
  });
}

function showMessage(messages) {
  messages.each(function(message, index) {
    nickname = message.nickname.escapeHTML();
    text = message.text.escapeHTML();
    new Insertion.Bottom('messages', '<li>' + nickname + ':' + text + '</li>');
  });
}

WebブラウザからJSONPで部屋を覗いて何が嬉しいのか  WebブラウザからJSONPで部屋を覗いて何が嬉しいのか - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク -  WebブラウザからJSONPで部屋を覗いて何が嬉しいのか - Lingr APIで何か作る日記  WebブラウザからJSONPで部屋を覗いて何が嬉しいのか - Lingr APIで何か作る日記 のブックマークコメント

さて、わざわざJSONPを使ってJavaScriptからLingr APIroom.observeを呼び出しました。こんなことしなくても、直接Lingrチャットルームを覗くのと何が違うのか、と思うかもしれません。

ですが、Lingr APIを使わないと実現できないこともあるのです。

部屋のパスワードを教えずに部屋に招待する

Lingrでは部屋に鍵(パスワード)をかけることができます。普通Lingrを使う場合は、パスワードを教えないと部屋の発言を見ることができません。

でも、Lingr APIを使えば、「部屋のパスワードを教えずに部屋の中を見せることができる」のです。さっきのJSONPの例でも、部屋のパスワードを知っているのはRails側で、Webブラウザには部屋に入るためのTicketとSessionしか渡していません。

Rails側でSessionを無効にすれば、その人はもう部屋の発言を見ることができなくなります(部屋のパスワードを知らないので)。

発言禁止状態で部屋に招待する

さらに発言禁止のAPIキーを使ってSessionを作るようにすれば、「パスワードを知らない人は閲覧だけができる部屋」が実現できます。例えば、誰かと誰かの対談を、ReadOnlyで広く公開することもできるでしょう。

と、ここまで書いておいて、本家に同じような機能ができたら意味が無いのですが…。

2007-02-09

API ClientRuby 1.8.2 (Debian Sarge) で動かす API ClientをRuby 1.8.2 (Debian Sarge) で動かす - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク - API ClientをRuby 1.8.2 (Debian Sarge) で動かす - Lingr APIで何か作る日記 API ClientをRuby 1.8.2 (Debian Sarge) で動かす - Lingr APIで何か作る日記 のブックマークコメント

Ruby 1.8.2だとAPI Clientが動かなかったのですが、回り道して原因を調べることにしました。

sample_chat_client.rb を編集して、API Clientを詳細デバッグモードで動くようにします。

@c = ApiClient.new(key, 0, hostname)

第二引数を0から2にすると、詳細なデバッグログが出るようになります。

@c = ApiClient.new(key, 2, hostname)

詳細デバッグモードでsample_chat_client.rbを動かすと、Net::HTTPのpost_formメソッドが無いというエラーがでました。Rubyリファレンスマニュアルを読むと、このメソッドはRuby1.8.3で追加されたようです。

Rubyごと1.8.5にするのが面倒だったので、少し安易ですがNetライブラリだけを新しくします。Ruby1.8.5のソースから、Netライブラリ一式 (ruby-1.8.5/lib/net/) を /usr/local/lib/site_ruby/1.8/ にコピーしました。

これでsample_chat_client.rbを動かします。

$ ruby sample_chat_client.rb <APIキー>
session/create succeeded

こんどはちゃんとセッションが作れました。ようやく先に進めます。

Ruby on RailsからLingr APIを使う Ruby on RailsからLingr APIを使う - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク - Ruby on RailsからLingr APIを使う - Lingr APIで何か作る日記 Ruby on RailsからLingr APIを使う - Lingr APIで何か作る日記 のブックマークコメント

API Clientも動くようになったので、いよいよLingr APIを使います。まずはAPI Clientの習熟を兼ねて、RailsからLingr APIを操作できるようにします。

APIチュートリアルによると、Lingr APIを使って発言するまでの流れは以下のようになります。

  1. session.createセッションを作る
  2. セッションを使ってroom.enterでルームに入る(チケットが発行される)
  3. セッションチケットを使ってroom.sayで発言するかroom.getMessagesroom.observeで発言を取得する。

Railsでは以下のモデルを作ってデータを管理します。

さて、APIチュートリアルの流れに沿って、ルームに入ってみましょう。

session.createセッションを作る  session.createでセッションを作る - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク -  session.createでセッションを作る - Lingr APIで何か作る日記  session.createでセッションを作る - Lingr APIで何か作る日記 のブックマークコメント

まずはセッションからです。セッションが無いと何もできません。Railsのgenerateを使ってSessionモデルを作ります。Railsバージョンは1.2.1です。

$ script/generate model Session name:string readonly:boolean created_on:date

Sessionが持つ属性は以下の通りです。

readonlyは、そのセッションを使って発言できるかどうかです。発言できるかどうかは、session.create時に指定するAPIキーで決まります。APIキーを作るときに、Permissionをobserve and speakとすれば発言可、observe onlyとすれば発言不可です(まだ試していませんが、きっとそうでしょう)。

2種類のAPIキーを取得し、config/environment.rbに書いておきます。

module Lingr
  API_KEY = 'observe and speakのAPIキー'
  API_KEY_READONLY = 'observe onlyのAPIキー'
end

Sessionモデルはこう書きました。Rails暦が浅いのでもっといい書き方があるかもしれません。

class Session < ActiveRecord::Base
  has_many :occupants, :dependent=>:destroy
  validates_presence_of :name

  def before_validation_on_create
    api_key = self.readonly ? Lingr::API_KEY_READONLY : Lingr::API_KEY
    api = Lingr::ApiClient.new(api_key)
    response = api.create_session
    unless response[:succeeded]
      error = response[:response]['error']
      message = "#{error['message']} (#{error['code']})"
      raise StandardError.new(message)
    end
    self.name = response[:response]['session']
  end
end

has_manyで複数のOccupantモデルと関連付けています。一つのセッションで複数のRoomに入ることを想定しています。

Lingr APIを使ってセッションIDを取得するのは、Sessionモデルを保存する直前 (before_validation_on_create) です。readonlyかどうかで、使用するAPIキーを切り替えています。無事にセッションIDを取得できたら、self.nameに代入します。エラーが起きれば例外を投げます。

試しに使ってみます。

$ script/console
Loading development environment.
>> Session.create    # セッションを生成
>> session = Session.new
>> session.readonly = true
>> session.save      # readonly のセッションを生成
>> puts session.name
"8kymI9MU5fZ"

無事にセッションIDが取得できたようです。

本当はsession.destroyにも対応させた方がいいのですが、とりあえず先に進みます。

セッションを使ってroom.enterでルームに入る (その1) セッションを使ってroom.enterでルームに入る (その1) - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク - セッションを使ってroom.enterでルームに入る (その1) - Lingr APIで何か作る日記 セッションを使ってroom.enterでルームに入る (その1) - Lingr APIで何か作る日記 のブックマークコメント

セッションを作ったので、次は部屋に入室します。room.enterの呼び出しパラメータを調べると、「入室するルームID」や「ルームのパスワード」が必要みたいです。これらは毎回の入室とは関係なく固定なので、部屋を管理するRoomモデルを作ります。

$ script/generate model Room name:string link:string password:string

Roomが持つ属性は以下の通りです。

Roomモデルデータを管理するだけなので、シンプルです。

Sessionモデルと同じく、has_manyで複数のOccupantモデルと関連付けています(一つの部屋に複数のセッションで入室することを想定)。

また、最低限必要なルームIDがないと、データベースに保存できないようにしています。

class Room < ActiveRecord::Base
  has_many :occupants
  validates_presence_of :link
end

試しにno titleのルームを登録してみました。

$ script/console
Loading development environment.
Room.create(:link => 'lingr_group_on_hatena')

セッションを使ってroom.enterでルームに入る (その2) セッションを使ってroom.enterでルームに入る (その2)  - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク - セッションを使ってroom.enterでルームに入る (その2)  - Lingr APIで何か作る日記 セッションを使ってroom.enterでルームに入る (その2)  - Lingr APIで何か作る日記 のブックマークコメント

セッションと部屋が出来たので、Occupantモデルを作って入室できるようにします。

$ script/generate model Occupant session_id:integer \
room_id:integer name:string nickname:string ticket:string

Occupantモデルには以下の属性を作りました。

ソースコードはこんな感じです。

class Occupant < ActiveRecord::Base
  belongs_to :session
  belongs_to :room
  validates_presence_of :name
  validates_presence_of :session
  validates_presence_of :room

  def before_validation_on_create
    return unless session && room
    api = Lingr::ApiClient.new(nil)
    api.session = session.name
    response = api.enter_room(self.room.link, self.nickname, self.room.password)
    unless response[:succeeded]
      error = response[:response]['error']
      message = "#{error['message']} (#{error['code']})"
      raise StandardError.new(message)
    end
    self.ticket = response[:response]['ticket']
    self.name = response[:response]['occupant_id']
    self.room.name = response[:response]['room']['name']
    self.room.save
  end
end                                                                                  

Sessionモデルと同じく、データベースに保存する直前にLingr APIを使って入室します。使い方の例です。

$ script/console
Loading development environment.
>> occupant = Occupant.create(:session => Session.create, :room => Room.find(1))
>> occupant.name
=> "krP8HBJumjA"
>> occupant.ticket
=> "a-r-fwjry8ziju8-2xpbRozJWb1"

新しいセッションを作って、先ほど登録したRoomに入室します。もちろん、以前のセッションを使いまわすこともできます。

occupant.nameでoccupant_idが、occupant.ticketで発言のためのチケットが取得できました。(微妙属性名が分かりにくい気がしますが…)

2007-02-08

Lingr APIクライアントから呼ぶ Lingr APIをクライアントから呼ぶ - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク - Lingr APIをクライアントから呼ぶ - Lingr APIで何か作る日記 Lingr APIをクライアントから呼ぶ - Lingr APIで何か作る日記 のブックマークコメント

Bot以外の目的Lingr APIを使うからには、Webブラウザの画面にチャットを表示したいのです。Lingr APIにはJSONPというインタフェースが用意されています。Webブラウザから使うときには、このJSONPを使います。

JSONPって良く分かっていないのですが、

<script src="Lingr APIのURL">

を使ってJSONデータを読み込むようです。でも、チャットで発言があるたびにLingr APIアクセスするので、そのたびに

<script>

を埋め込むのでしょうか。

難しそうだなと思っていたら、 id:urekat:20070201 さんがすでに試されていました。やっぱり難しそう…。

埋め込むといえば、日記の本文に

<script>

という文字を埋め込むにはどうすればいいのでしょう。普通日記の本文に書くと、そのあとの文章が表示されなくなってしまったので、とりあえずpre記法を使っています。

b-viagrab-viagra2007/03/30 03:36Hello
Buy viagra drugs at cheap online pharmacy:
<a href=http://rasklad.net.in/viagra/#cheap-viagra>viagra online</a> <a href="http://rasklad.net.in/viagra/#cheap-viagra">buy viagra</a> http://rasklad.net.in/viagra/#buy-cheap-viagra
Bye

2007-02-07

Lingr API を使おう 00:49 Lingr API を使おう - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク - Lingr API を使おう - Lingr APIで何か作る日記 Lingr API を使おう - Lingr APIで何か作る日記 のブックマークコメント

何か面白いものが作れないか試してみます。

まずは情報00:52 まずは情報源 - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク - まずは情報源 - Lingr APIで何か作る日記 まずは情報源 - Lingr APIで何か作る日記 のブックマークコメント

API Client
no titleから入手可能。RubyからのLingr APIアクセスライブラリっぽいです。
Botkit
API Clientを使って動かすBotでしょうか?

はじめの一歩 ~ API Clientを使う 08:30 はじめの一歩 ~ API Clientを使う - Lingr APIで何か作る日記 を含むブックマーク はてなブックマーク - はじめの一歩 ~ API Clientを使う - Lingr APIで何か作る日記 はじめの一歩 ~ API Clientを使う - Lingr APIで何か作る日記 のブックマークコメント

API ClientLingr APIへのアクセスライブラリです。

Rubyから使えます。id:Psychsさんが作られています。

まずはこの使い方を覚えることから始めます。それ以前に、はてな記法を覚えるところからになりそうですが…。

とにかく、ライブラリを取得します。公開されているのは4ファイルですが、botは使わないのでライブラリ本体 (api_client.rb) と呼び出しサンプル (sample_chat_client.rb) だけあればいいでしょう。

$ wget http://svn.lingr.com/api/toolkits/ruby/infoteria/api_client.rb
$ wget http://svn.lingr.com/api/toolkits/ruby/infoteria/sample_chat_client.rb

サンプルプログラムを実行します。

$ ruby sample_chat_client.rb
usage: simple_chat_client <api_key> [email password host]

APIキーが必要と言われてしまいました。

APIキーをno titleから取得して、もう一度実行します。

$ ruby sample_chat_client.rb <取得したAPIキー>
session/create failed :
enter <room_id> [nickname]
set_nickname <nickname>
say <message>
get_messages
exit
get_room_info <room_id> [<counter>]
verbose
quiet
quit

なにやらコマンドの羅列が出てきました。Lingr APIのメソッドに対応していそうです。とりあえず部屋に入ってみます。

> enter bBWVZpvWeib
not in a session
enter failed : nil

セッションが無いと怒られてしまいました。そういえば最初のコマンドの実行直後にも、「session/create failed」と出ています。

Rubyバージョンが古いのではないかと思って、Ruby1.8.4が入っているサーバでもう一度試してみます。

$ ruby sample_chat_client.rb <取得したAPIキー>
enter <room_id> [nickname]
set_nickname <nickname>
say <message>
get_messages
exit
get_room_info <room_id> [<counter>]
verbose
quiet
quit

こんどはfailedのメッセージがでません。enterで部屋に入室します。

enter 6xGZpwXtKEN
Starting observe loop for room bBWVZpvWeib


Room Occupants
==============
2 anonymous observers

何かしゃべってみます。

> say 'hello'
room/say failed : no nickname set
say failed : {"status"=>"fail", "error"=>{"message"=>"no nickname set", "code"=>110}}

先にニックネームを決めてねといわれました。親切ですね。

ニックネームセットします。

> set_nickname 'machu'
SYSTEM: 'machu' has joined the conversation

Room Occupants
==============
'machu'
And 1 anonymous observer

ニックネームを決めた時点で会話に参加になるのですね。

何か話してみます。

> say 'hello'
> say 'goodbye'
> exit
> quit

エラーがでていないので、上手くいったみたいです。

Webブラウザからこのチャットルームを見に行きます。

'machu' has joined the conversation at 3:22pm (February 07)
'machu' 'hello' at 3:23pm (February 07)
'machu' 'good bye' at 3:22pm (February 07)
'machu' has left the conversation

どうやら文字列をシングルクオーテーションで囲う必要は無かったようです><

とりあえずRuby1.8.4で動くことは分かりました。Ruby1.8.2だとセッションを作れないようです。Debian SargeのRubyは1.8.2なんですよね…。

1.8.2で動くようにするのが一番良さそうですが、この日記は「Lingr APIで何か作る日記」なんですよね。回り道するかどうか。

iSHMAeliSHMAel2007/02/27 01:17ak078370248 [url]http://faculty.deanza.fhda.edu/beggstom/discuss/msgReader$114 [/url]

iSHMAel@ku.comiSHMAel@ku.com2007/03/07 01:07ak079370354

iSHMAel@ku.comiSHMAel@ku.com2007/03/16 02:36ak078280342 0http://tol2mac8.soe.berkeley.edu:8081/2658.1/69357934/.html - nude girls http://tol2mac8.soe.berkeley.edu:8081/2658.1/69357965/.html - nude girls http://tol2mac8.soe.berkeley.edu:8081/2658.1/69357990/.html - hardcore sex

iSHMAel@ku.comiSHMAel@ku.com2007/03/16 22:42ak079870369 0http://condor.gmu.edu/validator/viewer/?id=622 - big black tits

iSHMAel@ku.comiSHMAel@ku.com2007/03/21 03:54ak078260367 ftp://email:read@ftp.ianr.unl.edu/email/blow.html - teen blowjob ftp://email:read@ftp.ianr.unl.edu/email/blowjob.html - blowjob clips ftp://email:read@ftp.ianr.unl.edu/email/blowjobs.html - blowjob clips ftp://email:read@ftp.ianr.unl.edu/email/boob.html - big boobs ftp://email:read@ftp.ianr.unl.edu/email/boobs.html - bouncing boobs ftp://email:read@ftp.ianr.unl.edu/email/cock.html - big cock ftp://email:read@ftp.ianr.unl.edu/email/cum.html - cum shot ftp://email:read@ftp.ianr.unl.edu/email/dick.html - black dick ftp://email:read@ftp.ianr.unl.edu/email/free.html - free porn videos ftp://email:read@ftp.ianr.unl.edu/email/freeporn.html - free porn clips

iSHMAel@ku.comiSHMAel@ku.com2007/03/21 03:56ak078260367 ftp://email:read@ftp.ianr.unl.edu/email/blow.html - blow ftp://email:read@ftp.ianr.unl.edu/email/blowjob.html - blow job ftp://email:read@ftp.ianr.unl.edu/email/blowjobs.html - blowjob ftp://email:read@ftp.ianr.unl.edu/email/boob.html - boob ftp://email:read@ftp.ianr.unl.edu/email/boobs.html - baby got boobs boobs ftp://email:read@ftp.ianr.unl.edu/email/cock.html - cock sucking ftp://email:read@ftp.ianr.unl.edu/email/cum.html - cumshot ftp://email:read@ftp.ianr.unl.edu/email/dick.html - huge dick dick in a pussy ftp://email:read@ftp.ianr.unl.edu/email/free.html - free porn ftp://email:read@ftp.ianr.unl.edu/email/freeporn.html - free porno