Hatena::ブログ(Diary)

pochi’s weblog RSSフィード

2012-01-11 このエントリーを含むブックマーク

[rails] uninitialized constant MysqlCompat::MysqlResの対処法

rails2.3.9とかでアプリを動かそうとすると上記のエラーが出てはまったのでメモ。

周りの人たちはだいたいmac 64bit化したことで起きてたようですが、

当方32bit redhat + ruby 1.8.7とかで発生しました。(mysqlライブラリのバージョンは2.8)

gem install -v 2.7 mysql

とりあえずこれで動くようになりました。

おやすみなさい。

2011-05-27

Notificationsの使い方

| 16:56 |  Notificationsの使い方を含むブックマーク

FirefoxでNotification を利用できるようになり、(Chromeデフォルトで実装されてる)今後実装する機会も多くなりそうです。
Google先生に聞いてみるとdesktopifyが有名ですが中身を見ると自分で実装した方が早い気がしてます。
簡単に以下使い方をメモで残しておきます。

今回確認する用のアプリ

今回はRails 3.1.0rc1で簡単なアプリを作ってみました。

f:id:POCHI_BLACK:20110527181852p:image

簡単ですが、以下の流れで確認していきます。

  • クライアントにデスクトップ通知の確認を実施
  • 現状の通知状態を確認
  • 実際に通知してみる

クライアントにデスクトップ通知の確認を実施

画面のActivateを選択すると以下のダイアログができてデスクトップ通知を有効にするかどうか確認します。

f:id:POCHI_BLACK:20110527182309p:image

ここのコードはこんな感じです。(CoffeeScriptです)

$(document).ready ->
  $("#activate").live("click", ->
    window.webkitNotifications.requestPermission()
  )

<button id="activate">Activate</button>

上記のwindow.webkitNotifications.requestPermission()を呼べばユーザさんに確認できます。


現状の通知状態を確認

画面のConfirmを選択すると以下のダイアログができてデスクトップ通知を有効にするかどうか確認します。

f:id:POCHI_BLACK:20110527182947p:image

ここのコードはこんな感じです。(CoffeeScriptです)

$(document).ready ->
  $("#confirm").live("click", ->
    alert(window.webkitNotifications.checkPermission())
  )

<button id="confirm">Confirm</button>

0がユーザに許可されている状態、2がユーザが拒否している状態です。

実際に通知してみる

画面のNotification!を選択すると実際に通知が表示されます。

f:id:POCHI_BLACK:20110527182948p:image

ここのコードはこんな感じです。(CoffeeScriptです)

$(document).ready ->
  $("#notification").live("click", ->
    window.webkitNotifications.createNotification("mail.png", "pochi", "bowbow!").show()
  )

<button id="notification">Notification!</button>

showメソッドで表示することができます。

まとめ

jQueryPlugin使うのもいいですが結構簡単に使えるのでそのまま呼び出してもいいかなと個人的に思ってます。以下はなんか注意。。。

  • MacユーザはGrowl動いてないとだめ
  • FireFoxだとアドオンだからHTML読み込んだあとでもwebkitNotificationが初期化されてない(僕の勉強不足)
  • FireFoxだけどff5-notifications使ってるときはwebkitNotification使う(mozNotificationか迷った・・・)

作ったコード

2011-05-18

Thorで書いたタスクのテストをする方法

| 08:30 |  Thorで書いたタスクのテストをする方法を含むブックマーク

Thorでタスクを書くとそのメソッドが普通のRubyのようには呼べません。
それでもやっぱりテストは書きたいのでThorのspecをいろいろ見てたらありました。

# encoding: utf-8
require "rubygems"
require "thor"
require "rspec"
require "stringio"

class Sample < Thor
  desc "name", "sample name"
  def name
    puts "pochi"
  end
end

describe Sample do
  it "should display 'pochi'" do
    capture(:stdout) {
      Sample.new.invoke("name")
    }.strip.should == "pochi"
  end
end

2011-05-17

extendの使い方

| 10:26 |  extendの使い方を含むブックマーク

今まではincludeは全てのインスタンスに対して機能を追加したいときに利用して、extendは特定のインスタンスのみに機能を追加したい場合に使うものと思っていたけどextendはクラスメソッドを追加したいときにも使える事がわかったので、メモしておく。

module ClassMethod
  def hoge
    puts "hoge"
  end
end

class Empty
end

Empty.extend ClassMethod
Empty.hoge #=> "hoge"

2011-04-14

socket.ioのイベント一覧

| 11:13 |  socket.ioのイベント一覧を含むブックマーク

昨日からnode.js+socket.ioでチャットアプリを作り出しました。
簡単に作れて楽しいのだけどサーバ側のeventで"message"しか受け取れないのかしらと疑問に思ってどうせならついでにsocket.ioのドキュメントをちょっと見てみました。ドキュメントは4/14日時点のgithubにあがっているものです。

socket.ioって?

シンプルなHTTP Socketインタフェースです。簡単にリアルタイム接続処理をかけるようになります。socket.ioはリアルタイムプロトコルをwebsocketAPIみたいに利用できるのでそのあたりを気にしないとこがいいんだよ。

サポートプロトコル

  • WebSocket
  • Adobe Flash Socket
  • ActiveX HTMLFile (IE)
  • XHR with multipart encoding
  • XHR with long-polling
  • JSONP polling (for cross-domain)

サポートブラウザ

  • Safari 4
  • Google Chrome 5
  • Internet Explorer 6
  • Internet Explorer 7
  • Internet Explorer 8
  • iPhone Safari
  • iPad Safari
  • Firefox 3
  • Firefox 4 (Minefield)
  • Opera 10.61

その他

  • ActionScriptがプロキシの配下で動かない事がよく知られています。すなわちそれはCONNECT HTTPメソッド経由でアクセスできないことを意味します。このあたりは別の方法を考えようと思っています。
  • 接続に成功した場合、そのプロトコルはcookieに保存され、次回アクセス時に利用されます。

注意

もし別ドメインからswfファイルを受け取る場合 WEB_SOCKET_SWF_LOCATION は別の不安定バージョンを利用してください。

<script>WEB_SOCKET_SWF_LOCATION = '/path/to/WebSocketMainInsecure.swf';</script>

Documentation

io.Socket
new io.Sokcet(host, [options]);
options:
  • secure
false

https使うときはtrueなんだとおもう

  • port
Current port or 80

socket.ioサーバが利用するポート(default: document.location.port)

  • resource
socket.io

どんなHTTPサーバでもリアルタイムでないリクエストを受け付けたままsocketリクエストを受けれるようになります。

  • transports
['websocket', 'flashsocket', 'htmlfile', 'xhr-multipart', 'xhr-polling', 'jsonp-polling']

プロトコルリスト。

  • transportOptions
 {
      someTransport: {
          someOption: true
      },
      ...
  }

プロトコルごとにオプションを設定可能

  • rememberTransport
true

接続したプロトコルを覚えておくかどうか(cookieを利用)

  • connectTimeout
5000

millisecでかく

  • tryTransportsOnConnectTimeout
true

connectTimeoutが発生したときに別プロトコルで接続するかどうか

  • reconnect
true

接続が切れたときに再度接続しにいくかどうか

  • reconnectionDelay
500

サーバに再度接続しにいくときにまつ時間

  • maxReconnectionAttempts
10

接続の試行回数

Properties:
  • options

デフォルトのオプションを見る。

  • connected

サーバと接続されていたかどうか(true/false)

  • connecting

サーバと接続されているかどうか(true/false)

  • transport

どのプロトコルで接続しているか

Methods:
  • connect

接続を実施

  • send(message)

文字列データをサーバに送る

  • disconnect

接続をきる

  • on(event, λ)

listenerイベントの登録

  • removeEvent(event, λ)

eventからλ処理を削除する

Events:
  • connect

接続が確立されたとき

  • connecting(transport_type)

引数で指定したtranport_typeでの接続に失敗したとき

  • connect_failed

connectTimeoutによって接続失敗されたときに発生するイベント。
tryTransportsOnConnectTimeoutを設定していた場合全てのtransportに失敗した場合のみ発生する。

  • message(message)

サーバからリクエストがきたとき

  • disconnect

接続が閉じられたとき

  • reconnect(transport_type, reconnectionAttemps)

接続が再び確立されたとき

  • reconnecting(reconnectionDelay, reconnectionAttemps)
  • reconnection_failed

。。。

messageの中でがんばれってことか。まぁそうかという気もしてきた。

[追記]

見逃していたけど本家のページにNode.js以外でも動くって書いてある。
対象は以下。

  • Python(tornard)
  • Java
  • Google GO
  • Rack

ruby動きそう!