Parse Error

sugizou is Parse Error
スポンサーサイト

一定期間更新がないため広告を表示しています

| - | | - | - | pookmark |
fastladderのbookmarklet
ArgumentError (wrong number of arguments (2 for 1)):
/usr/local/lib/ruby/gems/1.8/gems/rfeedfinder-0.9.13/lib/rfeedfinder.rb:109:in `open_doc'
/usr/local/lib/ruby/gems/1.8/gems/rfeedfinder-0.9.13/lib/rfeedfinder.rb:109:in `feeds'
/app/controllers/subscribe_controller.rb:19:in `confirm'
エラーが出る。 gemのrfeedfinderがおかしいもよう。
# diff rfeedfinder.rb rfeedfinder.rb.bak
109c109,110
<     data = Rfeedfinder.open_doc(fulluri, options)
---
>     #data = Rfeedfinder.open_doc(fulluri, options)
>     data = Rfeedfinder.open_doc(fulluri)
304c305,306
<     data = Rfeedfinder.open_doc(uri, options)
---
>     #data = Rfeedfinder.open_doc(uri, options)
>     data = Rfeedfinder.open_doc(uri)
したら動いた。 しかしなんで引数2つ受け取るとエラーになるんだろうか。
def self.open_doc(link, options)
ってなってるのに。
| ruby | 13:45 | comments(1) | trackbacks(0) | pookmark |
まじで
http://www.ruby-lang.org/ja/man/html/Date.html

mjd

修正ユリウス日を返します。時刻の情報を含みません。

amjd も利用できます。このメソッドは mjd と似ていますが、天文学的な修正ユリウス日を返します。時刻を含みます。


mjd!!
| ruby | 16:58 | comments(0) | trackbacks(0) | pookmark |
gemのバグなんだろうか?
今回作ったmemcacheを使ったモジュール
Ruby-MemCacheを使ってる。
require 'memcache'
module Hoge
class Session
def initialize(session_id)
@mem = MemCache.new('localhost:11211') #mock
@sid = sprintf('session.%s',session_id)
end
def method_missing(name, args = nil)
args.nil? ? get(name.to_s) : set(name.to_s, args)
end
def set(key,value = '')
@mem.set("#{@sid}.#{key}", value)
end
def get(key)
@mem.get("#{@sid}.#{key}")
end
end
end


irbで試してみる
$ gem install Ruby-MemCache
$ memcached -d
$ irb
>> require 'hoge/session'
=> true
>> mem = Hoge::Session.new('hoge')
=> #>
>> mem.get('hoge')
=> nil
>> system 'perl -MCache::Memcached -e ¥'Cache::Memcached->new({servers => ["localhost:11211"]})->set("session.hoge.hoge", "hoge");¥''
=> true
>> mem.get('hoge')
=> "hoge"
>> quit


これを以下のテストコード使ってチェック

describe Hoge::Session,"Hoge::Sessionのテスト" do
it "set/getのテスト(perl to ruby)" do
system 'perl -MCache::Memcached -e ¥'Cache::Memcached->new({servers => ["localhost:11211"]})->set("session.hoge.hoge", "moge");¥''
ses = Mcd::Session.new('hoge')
ses.hoge.should eql('moge')
end
end


実行結果
$ spec -fs hoge_session_spec.rb 

Hoge::Session Hoge::Sessionのテスト
- set/getのテスト(perl and ruby) (ERROR - 1)

1)
MemCache::MemCacheError in 'Hoge::Session Hoge::Sessionのテスト set/getのテスト(perl and ruby)'
incompatible marshal file format (can't be read)
format version 4.8 required; 104.111 given
/Library/Ruby/Gems/1.8/gems/activesupport-2.1.1/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb:241:in `load'
/Library/Ruby/Gems/1.8/gems/activesupport-2.1.1/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb:241:in `get'
/Users/sugizou/test/hoge/session.rb:21:in `get'
/Users/sugizou/test/hoge/session.rb:13:in `method_missing'
./session_spec.rb:20:

Finished in 0.204226 seconds

1 example, 1 failure


エラーの内容をみるとなんかおかしい。
/Library/Ruby/Gems/1.8/gems/activesupport-2.1.1/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb:241:in `get'

実は以前にmemcache-clientを使っていたんだけど、perlのスクリプトで入れたデータを取得するときにバグがあるみたいで消していた。なぜかこのモジュールを使ってアクセスしてる模様。
ちなみにgem listで一覧を出しても存在してない。バグ?
とりあえず消せばなんとかなると思って消したら動いた。
$ sudo rm /Library/Ruby/Gems/1.8/gems/activesupport-2.1.1/lib/active_support/vendor/memcache-client-1.5.0/memcache.rb
$ spec -fs hoge_session_spec.rb

Hoge::Session Hoge::Sessionのテスト
- set/getのテスト(perl and ruby)

Finished in 0.190629 seconds

1 example, 0 failures


うーむ。
| ruby | 15:21 | comments(0) | trackbacks(0) | pookmark |
railsで独自のディレクトリ切ってテストしたりrailsで使えるようにしたり。
というかこんなことする人いるのかどうか分からないんだけど、例えば「作ったクラス(モジュール)を独自のディレクトリ切って、そこに置いてテストしたりRailsで使ったりしてみたい」とかいう方向け。

要は、app/以下(別にapp/以下じゃなくてもいいけどrspec on railsでチェックさせたかったので)やspec/以下にディレクトリを新しく切る。今回はlib。
$ mkdir app/lib
$ mkdir spec/lib


作ったクラスやモジュールをapp/libに置き、rspecのテストコードをspec/libに置く。
$ cp ~/scripts/ruby/hoge.rb app/lib/
$ cp ~/scripts/ruby/test_hoge.rb spec/lib/


script/specの中に1行追加する。
$ diff script/spec script/spec.old
< $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__) + "/../app/lib"))


これでautotest走らせたときにapp/libの中もテストしてくれるようになる。
とりあえず業務中なのでここまで。あとで続きも書く。
| ruby | 16:04 | comments(0) | trackbacks(0) | pookmark |
rspecでのeql
http://rspec.info/rdoc/
Spec::Matchersの欄に
”Passes if actual and expected are of equal value, but not necessarily the same object.”
って書いてるけど、結局中身はeql?やってるからobject id見てる。

describe Hoge, "test" do
it "セットしてからゲットしたら一致するはず!" do
Hoge.set('moge', { 'koge' => 1 })
Hoge.get('moge').should eql({ 'koge' => 1 })
end
end

とかはできないよって話。
assert deepみたいなことできないのね。

'Hoge test セットしてからゲットしたら一致するはず!' FAILED
expected {"koge"=>1}, got {"koge"=>1} (using .eql?)
| ruby | 21:06 | comments(0) | trackbacks(0) | pookmark |
ruby,php,perlでmemcacheの中身を使い回す
表題の通り、業務で必要になったのでローカルで試してみた。

環境


OS: Mac OS X 10.5.5
perl: v5.8.8
php: PHP 5.2.6
ruby: ruby 1.8.6

使用モジュール


perl: Cache::Memcached::libmemcached(cpan)
php: Memcache(PECLからcvsでDLしてphpize->configure->make->make install)
ruby: Ruby-MemCache(,memcache-client)(gem)

まず、rubyとperlから。
rubyはmemcache-clientの方が早いらしいとい記事を見かけたのでとりあえずこっちをgem installする。
perlはCache::Memcached::libmemcachedを使う。

http://rafb.net/p/q6VNSJ37.html
//perl -> ruby
$ perl -MData::Dumper -MCache::Memcached::libmemcached -we 'my $mem = Cache::Memcached::libmemcached->new({servers => ["localhost:11211"]});$mem->set("id",120);$print Dumper($mem->get("id"));'
$VAR1 = '120';

$ irb
>> require 'memcache'
=> true
>> MemCache.new('localhost:11211').get('id')
MemCache::MemCacheError: incompatible marshal file format (can't be read)

//ruby -> perl
>> require 'memcache'
=> true
>> MemCache.new('localhost:11211').set('id',121)
=> nil
>> MemCache.new('localhost:11211').get('id')
=> 121

$ perl -MData::Dumper -MCache::Memcached::libmemcached -we 'my $mem = Cache::Memcached::libmemcached->new({servers => ["localhost:11211"]}); print Dumper($mem->get("id"));'
$VAR1 = i~';


結果的に見るといきなりエラッタ。
原因はよく分からないけどMarshalってやつでエラーが出ているらしい。
今の自分には解決法が見当たらないのでとりあず親和性の高そうな(?)perl<->phpを試す。

http://rafb.net/p/p5Nf4I49.html
//perl
$ perl -MData::Dumper -MCache::Memcached::libmemcached -we 'my $mem = Cache::Memcached::libmemcached->new({servers => ["localhost:11211"]});$mem->set("id", 120);print Dumper($mem->get("id"));'
$VAR1 = '120';

//php
error_reporting(E_ALL);
$mem = new Memcache;
$mem->connect('localhost', 11211);

var_dump($mem->get('id'));

=>string(3) "120"


…いけてる。
rubyで使ってるmemcache-clientが悪いのかと思い、gem uninstall memcache-clientしてgem install Ruby-MemCacheする。

http://rafb.net/p/MTYm7w43.html
//perl
$ perl -MData::Dumper -MCache::Memcached::libmemcached -we 'my $mem = Cache::Memcached::libmemcached->new({servers => ["localhost:11211"]});$mem->set("id", 120);print Dumper($mem->get("id"));'
$VAR1 = '120';

//ruby
$ irb
>> require 'memcache'
=> true
>> mem = MemCache.new('localhost:11211')
=>
>> mem.get('id')
=> "120"


いけた!
どうやらMarshalってやつに深く関係してそうだ。
TODO: Marshalを調べる http://www.ruby-lang.org/ja/man/html/Marshal.html
| ruby | 21:28 | comments(0) | trackbacks(1) | pookmark |
linkedlist
CodeKata: Kata Twenty One: Simple Lists
勉強の一環として書いてみた。

lib/list.rb


require 'lib/node'

class List < Array

def initialize
@node_lists = []
end

def add(arg='')
node = Node.new
node.value = arg
node.prev = @node_lists.last
node.next = nil
@node_lists.last.next = node if @node_lists.length > 0
@node_lists << node
end

def find(arg)
@node_lists.find { |node| node.value == arg }
end

def values
@node_lists.map { |node| node.value }
end

def delete(node)
return nil if @node_lists.empty?

pos = @node_lists.index(node)
if @node_lists[pos+1].nil? || @node_lists[pos-1].nil?
@node_lists[pos-1].next = nil unless @node_lists[pos-1].nil?
@node_lists[pos+1].prev = nil unless @node_lists[pos+1].nil?
else
@node_lists[pos-1].next = @node_lists[pos+1]
@node_lists[pos+1].prev = @node_lists[pos-1]
end

@node_lists.delete_at(pos)
end

end

lib/node.rb


class Node

attr_accessor :value
attr_accessor :next
attr_accessor :prev

end

| ruby | 19:25 | comments(0) | trackbacks(0) | pookmark |