カテゴリ別 2003年 | 2004年 | 2005年 | 2006年 | 2007年 | 2008年
知り合いサイト: よんだもの / 暴想 / Linuxでやる夫 / 新宿Vipper / 僕だけが幸せになればいいのに。
README にも書いてあるんですが、はまったのでメモ。
test の時に SELECT だけスレーブにクエリを送りたくて DB 設定してもマスターにクエリが行きました。何故かと思って調べたところタイトルの通りでした。
acts_as_readonlyable は、(たぶん)トランザクション中の一部の SELECT だけスレーブに行くとおかしなことになり兼ねないので、トランザクションを開いているとマスターに問い合わせるようになってるようです。
一方 use_transactional_fixtures=true でのテストは、テスト毎の fixture の初期化にトランザクションのロールバックを使います。つまり、テストでは常にマスターにクエリが行きます。
ということで test の時に SELECT だけスレーブにクエリを送るということはできなさそうです。use_transactional_fixtures=false は辛いのでやりたくないですし。あるいは汎用性のある acts_as_readonlyable の改造の仕方があればいいんですが。
Wolfram|AlphaでMatzと検索するとちゃんとまつもとさんが検索結果に出てきました。
Wikipedia を情報ソースに使っているようなので、検索されるのは当たり前といえばそうなんですが、例えばCategory:Computer programmersにある人名を検索しても、Paul Graham も P. J. Plauger も Sam Ruby も駄目でした。しかし、Dennis Ritchie、Brian Kernighan、 Bjarne Stroustrup、Guido van Rossum、 Larry Wall はひっかかるので言語開発者なら OK なのかも。基準が良く分かりません。
いい加減 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 対応のポイントは……というほどのことはないのですが
くらいですね。
ちなみに、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>
MOONGIFT で紹介されていた xtt ですが、まだ作りかけらしく README すらないので Rails を知ってないと動かすのは難しいです。また、起動はできても使っているとしばしばエラーになるので、まだ常用は無理ですね。
以下が必要です。予めインストールしておいてください。
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
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
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
また、デフォルトで記述されている 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
にアクセスします。
これでアクティベート&ログインされるので、やっと使うことができます。
あるテンプレートのあるメッセージを条件によって出し分けたいとします。テンプレート全体を別ファイルに分けるほどには差分がなく、テンプレートに出し分けのロジックを書くには条件のパターンがちょっと多い(しそもそもロジックはなるべく書きたくない)のが悩みどころです。
例えば、ちょっとしたチャットアプリがあり、これを子ども向けと大人向けにそれぞれ提供するとします。別々の 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") → "発言する"
となります。
Ruby やネットとは1ミリも関係ないです。ジョンソンボディケアが個人的にヒットしたので書いておきたくなりました。
顔のお手入れに書きましたが、毎年冬場には手足、特に脛の肌が乾燥していました。乾燥すると痒くなって仕事の集中の妨げにもなるしで困ったものでした。「でした」と過去形なのはこの冬はその状態にならなくなったからです。タイトルにあるジョンソンのボディケアローションが役に立ちました。
これにたどり着くまでにいろいろ試しています。軽くご紹介。
まあ、100円ショップの安い乳液ですが。栄養は補給されてつやつやになるものの結局乾燥しているという見た目変な状態になりました。
ジョンソンのベビーオイルです。多少効果はありますが、塗ってからしばらくべたつくのと、効果が長続きしないので日に何度も塗り直さないといけないのが難点です。毎日会社で塗り直すのはさすがに面倒。
食用ではなく化粧品のオリーブオイルです。これも効果はあるものの、ベビーオイル同様に長続きしません。
医薬品だけあって効果はばつぐんです。ただ、やたらべたつくのと値段が高いので毎日塗る気になれないのがネックでした。
最終的解決策がこれ。お風呂上りに塗っておけば後は一日何もしなくてOK。べたつきもほとんどありません。今冬はシーズン前から使っているのが功を奏してか、今のところ乾燥肌知らずです。誰にでも効くかはわかりませんが、乾燥肌で困っている方には試してもらいたい一品です。
最近のコメント:
RSS
![]()
This work is licensed under a
Creative Commons License
(note: text only. w/o web design, citations, (re)distributed softwares).
_ なおゆき [かれこれ半月くらいcommitしていただけるのを待っています。 明日ですかね。]
_ だて [すみません。昨日コミットしましたよ。 結局テストは諦めたのできちんと動作確認お願い。]