追記

Don'tStopMusic

2003|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|12|
2006|01|02|03|04|05|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|08|09|10|11|12|
2009|01|02|05|06|11|12|

カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年

知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。


2009-12-03 この日を編集

_ [Rails] Rails2.3.xとacts_as_readonlyable このエントリーを含むブックマーク

ActiveRecord が 2.3 でコネクションの保持の仕方を変えたので、Rails2.3.x 環境下では acts_as_readonlyable が効きません。RubyForge: acts_as_with_readonlyも2007年の0.0.9が最後ですし、github にも見当たりません。たぶんもうプロジェクトとしては死んでいるのでしょう。

が、困っているという話もあまり効かないので acts_as_readonlyable 使ってる人ってあんまりいないのですかね。

私は 2.0 から 2.3 に上げた時に困ったのでとりあえず以下のように修正して使っています。きっちり検証したわけではないので、ちゃんと動かないケースもあるんじゃないかと思います。もしこのパッチを使う場合にはそこは自己責任で……

検索クエリをスレーブに流すくらいであまり大々的に使ってないので、今のところ問題は起きてません。

Index: vendor/plugins/acts_as_readonlyable/lib/acts_as_readonlyable.rb
===================================================================
--- vendor/plugins/acts_as_readonlyable/lib/acts_as_readonlyable.rb     (revision 1448)
+++ vendor/plugins/acts_as_readonlyable/lib/acts_as_readonlyable.rb     (working copy)
@@ -77,8 +77,9 @@
         run_on_db(options) { super(sql) }
       end
       
+      # http://kristoff.eu/posts/fixing-acts-as-readonlyable-exception-in-rails-2
       def construct_finder_sql(options)
-        options.merge(:sql => super)
+        (options.is_a?(Hash) && options[:readonlyable]) ? options.merge(:sql => super) : super
       end
       
       def set_readonly_option!(options) #:nodoc:
@@ -118,12 +119,10 @@
       def run_on_readonly_db
         klass_conn = connection
         begin
-          self.connection = readonly_model.connection
-          self.clear_active_connection_name
+          self.connection_pool.instance_variable_get('@reserved_connections')[self.connection_pool.send(:current_connection_id)] = readonly_model.connection
           yield
         ensure
-          self.connection = klass_conn
-          self.clear_active_connection_name
+          self.connection_pool.instance_variable_get('@reserved_connections')[self.connection_pool.send(:current_connection_id)] = klass_conn
         end
         
       end

2009-11-26 この日を編集

_ [近況] さようならレモニスト このエントリーを含むブックマーク

昨日最後のレモニストを食べました。

森永にレモニストというレモンの香りさわやかなビスケットがありました。夏季限定の商品なのですが、今年は店頭で見かけませんでした。

8月末に問い合わせたところ次のような回答が。

時下ますますご清祥にお過ごしのこととおよろこび申し上げます。
日ごろは格別のご愛顧を賜り、誠にありがとうございます。
また、この度はお問合せくださいましたこと、重ねてお礼申し上げます。 
 
「レモニスト」をお探しいただきまして、誠に申し訳ございません。
 
「レモニスト」は2009年7月で製造販売を終了させていただきました。
 
せっかくお問い合わせをいただきましたのに、ご希望に添えず誠に申し訳ございません。
 
現在のところ再発売の予定はございませんが、いただきましたご意見は担当者に伝え、
これからの新商品開発、規格変更時の参考にさせていただきます。
 
これからも「おいしく・たのしく・すこやかに」をモットーに、
皆様により喜んでいただける製品を作るよう努めて参りますので、
今後とも森永製菓をよろしくお願いいたします。

昨日、去年買って保存しておいた最後のレモニストを食べました。別れのせいか、ちょっと湿っぽくなっていました。来年からはレモニストのない日々を過ごさなくてはなりません。大変残念です。

再発売しないかなあ。


2009-06-03 この日を編集

_ [Rails] acts_as_readonlyable は test 環境では無効になる このエントリーを含むブックマーク

README にも書いてあるんですが、はまったのでメモ。

test の時に SELECT だけスレーブにクエリを送りたくて DB 設定してもマスターにクエリが行きました。何故かと思って調べたところタイトルの通りでした。

acts_as_readonlyable は、(たぶん)トランザクション中の一部の SELECT だけスレーブに行くとおかしなことになり兼ねないので、トランザクションを開いているとマスターに問い合わせるようになってるようです。

一方 use_transactional_fixtures=true でのテストは、テスト毎の fixture の初期化にトランザクションのロールバックを使います。つまり、テストでは常にマスターにクエリが行きます。

ということで test の時に SELECT だけスレーブにクエリを送るということはできなさそうです。use_transactional_fixtures=false は辛いのでやりたくないですし。あるいは汎用性のある acts_as_readonlyable の改造の仕方があればいいんですが。

本日のツッコミ(全3件) [ツッコミを入れる]

_ なおゆき [かれこれ半月くらいcommitしていただけるのを待っています。 明日ですかね。]

_ だて [すみません。昨日コミットしましたよ。 結局テストは諦めたのできちんと動作確認お願い。]

_ BadGirl88 [That will get it wider coverage as it gets linked to from ..]


2009-05-19 この日を編集

_ [適当] Wolfram|Alpha knows Matz このエントリーを含むブックマーク

Wolfram|AlphaでMatzと検索するとちゃんとまつもとさんが検索結果に出てきました。

Matz - Wolfram|Alpha

Wikipedia を情報ソースに使っているようなので、検索されるのは当たり前といえばそうなんですが、例えばCategory:Computer programmersにある人名を検索しても、Paul Graham も P. J. Plauger も Sam Ruby も駄目でした。しかし、Dennis Ritchie、Brian Kernighan、 Bjarne Stroustrup、Guido van Rossum、 Larry Wall はひっかかるので言語開発者なら OK なのかも。基準が良く分かりません。

本日のツッコミ(全1件) [ツッコミを入れる]

_ なおゆき [3ヶ月ぶり]


2009-05-11 この日を編集

_ [Ruby] Ruby 1.9 でケブンリッジ このエントリーを含むブックマーク

いい加減 Ruby 1.9 使おうと思う今日この頃です。ということで、rbuyでケブンリッジ - さかぐちのはてな日記とロジックは同じで Ruby 1.9 対応にしてみました。このプログラム、標準添付のライブラリだけで実行できるのが良いですね。

#!/usr/bin/ruby19
# coding: EUC-JP
require 'open-uri'
require 'rexml/document'
 
YMA_API_URL = "http://jlp.yahooapis.jp/MAService/V1/parse"
APPID = "your-yahoo-application-id"
DEFAULT_TEXT = <<END
こんにちは。皆さんお元気ですか?私は元気です。
この文章は、イギリスのケンブリッジ大学の研究の結果
人間は文字を認識するとき、その最初と最後の文字さえ合っていれば
順番は滅茶苦茶でもちゃんと読めるという研究に基づいて
わざと文字の順番を入れ替えてあります。
どうです?ちゃんと読めちゃうでしょ?
ちゃんと読めたら反応よろしく。
END
 
def kebunridge(word)
  return word unless word.size >= 4
  word[0] + word[1..-2].chars.sort_by{rand}.join + word[-1]
end
 
sentence = DEFAULT_TEXT
url = URI.encode(YMA_API_URL + "?appid=" + APPID + "&sentence=" + sentence.encode("UTF-8") + "&results=ma")
open(url) do |f|
  result = REXML::Document.new(f)
  words = result.elements.collect("ResultSet/ma_result/word_list/word/reading"){|reading| kebunridge(reading.text.chomp) }
  puts words.join(" ").encode("EUC-JP")
end                               

ファイルの文字エンコーディングは EUC-JP とします。ついでに、kebunridge は短くして result.elements には趣味で collect 使ってます。

1.9 対応のポイントは……というほどのことはないのですが

  1. マジックコメント # coding: EUC-JP を追加 (Ruby 1.9 ではソースファイルの文字エンコーディングをマジックコメントで明示する必要がある)
  2. require 'jcode' 不要 (Ruby 1.9 では元から「文字単位」でアクセスできる)
  3. require 'kconv' 不要 (Ruby 1.9 では元から String が文字エンコーディングの変換のメソッドを持つ)
  4. 文字エンコーディングの変換には String#encode

くらいですね。

2009/05/14追記

ちなみに、open-uri は良きに計らって、ウェブから取得したテキストに適切なエンコーディングを付与しようとしてくれます。

$ ruby19 -ropen-uri -e 'p open("http://www.yahoo.co.jp/").read.encoding'
#<Encoding:UTF-8>
$ ruby19 -ropen-uri -e 'p open("http://geocities.yahoo.co.jp/").read.encoding'
#<Encoding:EUC-JP>
$ ruby19 -ropen-uri -e 'p open("http://www.google.co.jp/").read.encoding'
#<Encoding:Shift_JIS>

(google は UserAgent によっては Shift_JIS で返す模様。)

ただ、HTTP ヘッダ Content-Type の charset を見てますので、HTML の meta タグには charset が書いてあるけど、HTTP ヘッダには text/html しか書いてないようなサイトの場合、返る String は ASCII-8BIT になります。

$ ruby19 -ropen-uri -e 'p open("http://www.cnta.gov.cn/").read.encoding'
#<Encoding:ASCII-8BIT>

こういう場合には、何らかの方法で調べて正しいエンコーディングをセットしてください。

読んでからセットする場合
$ ruby19 -ropen-uri -e 'p open("http://www.cnta.gov.cn/").read.force_encoding("gb2312").encoding'
#<Encoding:GB2312>
最初から知ってる場合
$ ruby19 -ropen-uri -e 'p open("http://www.cnta.gov.cn/", "r:gb2312").read.encoding'
#<Encoding:GB2312>

2009-02-06 この日を編集

_ [メモ] xttの動かし方 このエントリーを含むブックマーク

MOONGIFT で紹介されていた xtt ですが、まだ作りかけらしく README すらないので Rails を知ってないと動かすのは難しいです。また、起動はできても使っているとしばしばエラーになるので、まだ常用は無理ですね。

環境

以下が必要です。予めインストールしておいてください。

  • Ruby 1.8.6 or 1.8.7
  • Rails 2.1.1
  • MySQL 5.x
gem
  • bj 1.0.1
  • tinder 0.1.6
  • fastercsv 1.2.3
  • googlecharts 1.3.6
  • hpricot 0.6
  • net-toc 0.2

gem は

rake gems:install

でまとめてインストールできます。が、エラーになったりするので、手動でインストールするなら、

# gem install bj -v=1.0.1 
# gem install tinder -v=0.1.6 
# gem install fastercsv -v=1.2.3 
# gem install googlecharts -v=1.3.6
# gem install hpricot -v=0.6
# gem install net-toc -v=0.2

ダウンロード

  1. github の xtt の masterにいく
  2. download ボタンを押す
  3. zip か tar の好きなほうを選んでダウンロードしてください

セットアップ

database.yml

config/database.yml を用意します。

$ cp config/database.sample.yml config/database.yml

サンプルは sqlite3 を使いますが、sqlite3 では使えない SQL 関数を用いていたりしますので、MySQL を使うように修正してください。例えば、

development:
  adapter: mysql
  database: xtt_development
  host: localhost
  username: xtt
  password: xtt
 
production:
  adapter: mysql
  database: xtt_production:
  host: localhost
  username: xtt
  password: xtt

あとは MySQL のデータベースを作ります。

$ mysqladmin -u root -p create xtt_development
スキーマのロード

migration が用意されてません。db/schema.rb からテーブルを作成します。以下の rake タスクを実行してください。

$ rake db:schema:load
environment.rb の修正:hpricot

gem のインストール具合によっては起動時にエラーになります。もし以下のようなエラーが出た場合には、config/environment.rb を修正してください。

/usr/lib/ruby/site_ruby/1.8/rubygems.rb:149:in `activate': can't activate hpricot (= 0.6, runtime), already activated hpricot-0.6.164 (Gem::Exception)

修正箇所は以下の通りです。とりあえずバージョン指定を外します……

旧: config.gem :hpricot, :version => '0.6'
新: config.gem :hpricot
environment.rb の修正:secret

また、デフォルトで記述されている secret が適当なので、以下のようなエラーが発生します。

  Secret should be something secure, like "e059db7575e806c7e80573aa36b4e1ad".  The value you provided, "SEKRIT", is shorter than the minimum length of 30 characters

secret 用の文字列を生成してくれてますので、config/environment.rb を修正して secret を置き換えます。

旧:
  config.action_controller.session = {
    :session_key => '_tt_session',
    :secret      => 'SEKRIT'
  }
旧:
  config.action_controller.session = {
    :session_key => '_tt_session',
    :secret      => 'e059db7575e806c7e80573aa36b4e1ad'
  }

起動してみる

おそらくこれで起動するようになりました。development モードでとりあえず起動してみます。

$ ./script/server

http://127.0.0.1:3000/ (ホスト部分は環境に合わせて変えてください)でアクセスして、ログイン画面が表示されたら成功です。

ユーザ登録とアクティベーション

ログイン画面からユーザ登録画面に遷移できないので、

http://127.0.0.1:3000/users/new

に直接アクセスしてください。ユーザ名、メールアドレス、パスワードなどを入力して「Sign up」ボタンを押せばユーザが作れます。

log/development.log にアクティベーション用の URL が出力されてますので、それの /activate 以下をコピペしてブラウザでアクセスしてください(ちゃんと設定してればメールを飛ばしますが)。これでユーザ登録が完了です。

Your account has been created.
 
  Username: date
  Password: date
 
Visit this url to activate your account:
 
  http://tt.entp.com/activate/dcfcf42d7f3124febbfe64722b2310d634232ff6

というようなログが出力されるので、

http://127.0.0.1:3000/activate/dcfcf42d7f3124febbfe64722b2310d634232ff6

にアクセスします。

これでアクティベート&ログインされるので、やっと使うことができます。


2009-01-29 この日を編集

_ [Rails] gettext のトリッキーな使い方 このエントリーを含むブックマーク

課題

あるテンプレートのあるメッセージを条件によって出し分けたいとします。テンプレート全体を別ファイルに分けるほどには差分がなく、テンプレートに出し分けのロジックを書くには条件のパターンがちょっと多い(しそもそもロジックはなるべく書きたくない)のが悩みどころです。

例えば、ちょっとしたチャットアプリがあり、これを子ども向けと大人向けにそれぞれ提供するとします。別々の Rails アプリとして稼動させるのもリソースの無駄なので、child サブドメインは子ども向け、adult サブドメインは大人向けとして、同じアプリケーションインスタンスで動かします。

子ども向けも大人向けも、使い方はまったく同じで表示されるメッセージが多少違うだけです。テンプレートをコピーして少しだけ書き変えるのも重複が多くて後々メンテナンスで困りそうです。高齢者向けや女性向けも提供予定なのでなおさらです。

提供先によって違うメッセージは次のような組み合わせとします。子ども向けだけ違うのが面倒そうなところです。

大人向け
発言する
高齢者向け
発言する
女性向け
発言する
子供向け
発言(はつげん)する

トリッキーな解決方法

で、なんとか手抜きな解決方法がないかと思った結果、gettext を以下のように使うことにしました。

gettext の po ファイルには以下のように書きます。

msdig "post"
msgstr "発言する"
 
msdid "child|post"
msgstr "発言(はつげん)する"

今アクセスしているアプリケーションが大人向けなのか子供向けなのかの状態を変数 @target に格納しているとします。@target は "child" か "adult" です。

そして、テンプレートには以下のように書きます。

_(s_("#{@target}|post"))

二重にしているのがみそです。@target が child のときには、

_(s_("child|post")) → _("発言(はつげん)する") → "発言(はつげん)する"

@target が adult のときには、

_(s_("adult|post")) → _("post") → "発言する"

となります。


最近のコメント:

  1. BadGirl88 (10-11)
  2. だて (06-04)
  3. なおゆき (06-04)

RSS
Creative Commons License
This work is licensed under a Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).