カテゴリー「ruby」の55件の記事

2011.02.16

Railsでmemcachedとnamed_scopeを組み合わせて使ってハマった。

以下のようなコードを書いていて、クエリの結果をキャッシュしているはずなのに、SQLが発行されるなぁ、、何でだろうなぁ、、と思っていた。


def recent_entries
get_cache("recent_entries") do
Entry.newly.user(self.id).limit(10)
end
end


で、結論としては、named_scopeは値が初めて評価される時にSQLが実行されるので、上記状態だとまだ、SQLが未発行の状態でキャッシュされる。

telnet localhost 11211

で実際にキャッシュの内容を確認すると以下のようになっている。

get app:User:1:recent_entries
VALUE app:User:1:recent_entries 1 224
o:$ActiveRecord::NamedScope::Scope:@proxy_scopeo;;o;c
Entries:)@current_scoped_methods_when_defined0:@proxy_options{:conditions"#user_id = ? i?{:
order"created_at DESC{:
limiti

END


つまり、まだnamed_scopeのまま。

そして、キャッシュしているつもりなのに全然負荷が落ちないという結果に。。


named_scopeを強制発行する方法がわからないので、とりあえず、

def recent_entries
get_cache("recent_entries") do
Entry.newly.user(self.id).limit(10).collect{|i| i}
end
end


とした。

| | コメント (0) | トラックバック (0)

2010.04.08

puppetでCould not resolve 172.*.*.*: no name for *.*.*.*みたいなエラーが出る

puppetca --list
ってやっても、リストが表示されなくて、

/var/log/puppet.log

をチェックすると

Colud not resolve

と表示されている。


接続元のhostsにノード名を書いても、駄目。
次に、接続先のhostsにノード名を書いたらOK。

接続元・先両方のhostsにノード名を書いたらOKみたい。

| | コメント (0) | トラックバック (0)

2010.04.01

Pupptで「notice: Run of Puppet configuration client already in progress; skipping」と表示されて実行できない

異常終了したときに、pidファイルとロックファイルが残ったままになるのが原因。

インストールした場所にもよるけど

/var/puppet/state/puppetdlock
/var/run/puppetd.pid

を消せばOK

| | コメント (0) | トラックバック (0)

2010.03.02

rails 2.3.5のvalidates_uniqueness_of

よくわからないんだけど、

validates_uniqueness_of

をすると、

http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html#M002167

comparison_operator = "#{connection.case_sensitive_equality_operator} ?"
で、
= BINARY ?
が付与される。
http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/MysqlAdapter.html#M002011

で、そうすると日本語の比較ができなくなって、期待する動作にならないんだけど、どうすれば良いんだろう?

とりあえず、

if configuration[:binary] then
comparison_operator = "#{connection.case_sensitive_equality_operator} ?"
else
comparison_operator = "= ?"
end

としてみたけど、検索しても誰も困っていないみたいだし、わからんちん。

↓1日1ポチッとをお願いします!励みになります!
ポチっとよろしく!

| | コメント (0) | トラックバック (0)

2010.02.08

puppetでのアクセス管理

新しいpuppet用のクライアントサーバーを追加して実行したら

Failed to retrieve current state of resource: Error 400 on SERVER: Not authorized to call find on

とか
Failed to generate additional resources using 'eval_generate': Error 400 on SERVER: Not authorized to call search on

みたいなエラーが出た。

Puppetへのアクセスコントロールにあるとおり、
/etc/puppet/puppet.conf
/etc/puppet/namespaceauth.conf
の2つのファイルを更新する必要がある。

更新したらpuppetmasterを再起動する。

/etc/init.d/puppetmaster restart

| | コメント (0) | トラックバック (0)

2009.11.20

railsのmemcacheのpluginであるcache_fuのget_cacheメソッドには任意の文字列を指定できる

サンプルとかだと

User.get_cache(1)

とかとID(数字)が利用されているので、ID専用かと思ったらそんなこともないみたい。

def find_by_nickname(nickname)
User.get_cache("find_by_#{nickname}"){
User.find(:first, :conditions => ['nickname = ?', nickname])
}
end

と、ブロックを利用してやるとnicknameでキャッシュできる。

当然、キャッシュがないときはDBから、キャッシュがあるときはキャッシュから値を返却しれくれる。

ちなみに、実際のkeyは

User:find_by_nickname

みたいな値になるから、telnetなどで直接メムキャッシュの値を参照したいときはそうする。


というか、だから一つ前の記事みたいな問題が発生して困ったということでした。

| | コメント (0) | トラックバック (0)

rubyのmemcache-clientはmemcacheのキーにコロン(:)が含まれていると、その左辺をclass名と認識して、自動的にマッピングしてくれる

memcacheのデータを閲覧しようと思って、irbを使って

cache['User:hoge']

とかとアクセスしたら

ArgumentError: undefined class/module User

とかとエラーが返ってきた。

最初、???と思ったけど、なるほど、自動的にclassオブジェクトとマッピングしてくれる模様。
なので、irbで利用するためには

class User
end

って宣言した後に

cache['User:hoge']


とやる必要がある。

だから、

cache['User:hoge'].class

の戻り値はUserになる。

便利だけど、最初は戸惑うな。

| | コメント (0) | トラックバック (0)

rubyのmemcache-client-1.7.6にキャッシュをdelete(expire)できない不具合

削除できないなぁ。。と思っていたら仕様変更?にともなう不具合なのかな。

これ、本家では直っていないけど、みんな困っていないのかなぁ・・?

修正されているバージョンがgithubで公開されている。

http://github.com/billhorsman/memcache-client/commit/adfcb8115e74b051f7c858e21dc5fcaeb477a52a


しかし、githubとgemの流儀がわからないんだけど、いくらgithubで修正済みのものが公開されているとしても、これをgemでインストールして良いものなの?
その場合、どれをロードすべきなの?
そして、その後のバージョンアップは?

わからないなぁ。。。

となると、パッチを手元の本家のバージョンに適用するのが良いのかな。と思って、そうしてみた。
けど、他のサーバーでgem install ...とか気軽にできなくなるなぁ。

| | コメント (0) | トラックバック (0)

2009.09.11

Snow Leopardでuninitialized constant MysqlCompat::MysqlRes

Snow LeopardにしたらRailsが動かなくなった。

MySQLをインストールし直す必要があるようだ。
http://journal.mycom.co.jp/news/2009/09/01/033/index.html

によると
Mac OS X 10.5 (x86_64)

と64ビット版のMySQLクライアントをインストールしないといけないらしい。


んで、gemのmysqlを以下のようにインストール


sudo env ARCHFLAGS="-arch x86_64" gem install mysql --with-mysql-config=/usr/local/mysql/bin/mysql_config

↓1日1ポチッとをお願いします!励みになります!
ポチっとよろしく!

| | コメント (2) | トラックバック (0)

2009.08.07

Ambling(amchartsのRubyのラッパー)の折れ線グラフのサンプルコード

Amblingはいいんだけど、サンプルコードないし、Googleで検索しても情報ゼロなので、公開する。欲しい人は多いはずだ。
暴想家計簿作るときにしんどかったので。


これは折れ線グラフのサンプル。
そもそも、Amblingの使い方として、グラフのデータを返すactionとグラフを表示する(Flashをレンダリングする)Actionが必要。
で、Flashのレンダリングタグのなかから、データを返すactionを呼び出してグラフを表示する。

んで、↓がデータを表示するactionのサンプルコード。
こっちのほうは、testコードを見ると意外とサンプルが多いので比較的楽。
------------------------------------------------------
simple_chart = Ambling::Data::LineChart.new

#横軸を定義。ここでは12ヶ月(1年)にするためにこうしている。必要に応じて変更する。
12.times{|i|
simple_chart.series.push(i+1)
}
#グラフに入れ込みたいデータを呼び出す。
#ここでは、yearをキーにしたhashをやっている。こうすることで年単位の比較折れ線グラフが作れる。
#折れ線が一本で良いときは単なる配列を突っ込めばいい。
data_hash.each_key{|year|
#chart_year[year]はただ単に縦軸の数字が詰まった配列(Array)。家計簿で言うところの月単位の金額が詰まった12個の配列。
#[200, 344, 445, 553, ...]みたいな感じ。
#titleには、まあ好きなラベルを入れればいい。
simple_chart.graphs << Ambling::Data::LineGraph.new(chart_year[year], :title => year)
}

return simple_chat.to_xml

------------------------------------------------------

んでこれまたわかりにくいのが、viewの方。


------------------------------------------------------
#data_fileには上記xmlデータを返すactionを指定
#approx_countは横軸の単位を表示する値を指定。今回は12ヶ月なので12。これを指定しないと、1, 6, 12とかしか横軸の単位が表示されない。
#指定しなければデフォルトになる
#そのほか細かい指定はdocumentにあるとおりで、このdocumentにある定義を↓みたいにHashで渡してあげればいい。一度理解すれば簡単。
<%=
ambling_chart(:line, :data_file => '',
:id => 'pie_data', :width => 800, :height => 360,
:chart_settings => Ambling::Line::Settings.new({
:grid => {
:x => {:approx_count => 12}
}
}).to_xml) do
"<p>To see this page properly, you need to upgrade your Flash Player</p>"
end
%>
------------------------------------------------------

あーあと、当たり前だけど、amchatの本体Flashは別途ダウンロードしておかないとだめ。忘れがち。

| | コメント (0) | トラックバック (0)

より以前の記事一覧