MongoDBが起動しなくなった
久しぶりにyum updateなどしてたら出力内容にmongoなる文字列を見かけてMongoDBの存在を思い出した。
$ cat /etc/redhat-release CentOS release 5.8 (Final) $ rpm -aq | grep mongo mongo-10gen-server-2.2.1-mongodb_1 mongo-10gen-2.2.1-mongodb_1
v2.2.1にアップデートしたらしい。
$ mongo mytest MongoDB shell version: 2.2.1 connecting to: mytest Mon Nov 12 01:50:08 Error: couldn't connect to server 127.0.0.1:27017 src/mongo/shell/mongo.js:91 exception: connect failed $ ps ax | grep mongo 29556 pts/0 R+ 0:00 grep mongo
mongodのプロセスが無いようなので
起動してみる。
$ sudo /etc/init.d/mongod start Starting mongod: all output going to: /var/log/mongo/mongod.log forked process: 29585 [失敗] $ ps ax | grep mongo 29590 pts/0 R+ 0:00 grep mongo
mongodが起動しなくなっちゃった。。。
$ sudo ls /var/lib/mongo/ mongod.lock $ sudo mv /var/lib/mongo/mongod.lock /var/lib/mongo/mongod.lock~
mongo.lockという、それっぽいファイルが残っていたので別名で退避してみる。
$ sudo /etc/init.d/mongod start Starting mongod: all output going to: /var/log/mongo/mongod.log forked process: 30964 child process started successfully, parent exiting [ OK ] $ ps ax | grep mongo 30964 ? Sl 0:00 /usr/bin/mongod -f /etc/mongod.conf 31274 pts/0 R+ 0:00 grep mongo
正常に起動できるようになった。
めでたしめでたし。
Ruby2.0のlazyを試してみる
Ruby2.0のプレビュー版がでたとのことで、新機能のlazyを試してみる。
#!/usr/bin/env ruby # coding:utf-8 exit unless RUBY_VERSION >= '2.0.0' require "benchmark" require "prime" a = b = nil Benchmark.bm(10) do |x| x.report("not lazy:") { a = (1..100000).select(&:prime?).take(10) } x.report("lazy:") { b = (1..100000).lazy.select(&:prime?).take(10).force } end puts "-"*20 puts "a = #{a.join(',')}" puts "b = #{b.join(',')}"
$ ruby -v ruby 2.0.0dev (2012-11-01 trunk 37411) [i686-linux] $ ruby hoge.rb user system total real not lazy: 3.010000 0.000000 3.010000 ( 3.019988) lazy: 0.000000 0.000000 0.000000 ( 0.000410) -------------------- a = 2,3,5,7,11,13,17,19,23,29 b = 2,3,5,7,11,13,17,19,23,29
ふむふむ。
2つの配列から重複を省いたり、重複を得たり
2つの配列から重複を省いたり、重複を得たり
割とよく使うのにすぐ忘れるからメモ。
RUBY_VERSION #=> "1.9.3" a = [1,2,3,4,5,6,7,8,9,10] b = [1,3,5,7,9,11] a - b #=> [2, 4, 6, 8, 10] a & b #=> [1, 3, 5, 7, 9]
import sys print(sys.version_info) # (2, 6, 5, 'final', 0) a = [1,2,3,4,5,6,7,8,9,10] b = [1,3,5,7,9,11] list( set(a) - set(b) ) # [8, 2, 4, 10, 6] list( set(a) & set(b) ) # [1, 3, 9, 5, 7]
echo phpversion(); //=> 5.3.6 $a = array(1,2,3,4,5,6,7,8,9,10); $b = array(1,3,5,7,9,11); var_dump( array_diff($a, $b) ); //=> // array(5) { // [1]=> // int(2) // [3]=> // int(4) // [5]=> // int(6) // [7]=> // int(8) // [9]=> // int(10) // } var_dump( array_intersect($a, $b) ); //=> // array(5) { // [0]=> // int(1) // [2]=> // int(3) // [4]=> // int(5) // [6]=> // int(7) // [8]=> // int(9) // }
クラスを示す文字列からインスタンスを得る方法
クラスを示す文字列からインスタンスを得る方法
検索したら普通に出てきた。
http://bugs.ruby-lang.org/issues/767
def my_const_get(name) name.split(/::/).inject(Object){|o,c| o.const_get(c) } end module Hoge class Foo end end my_const_get('Hoge::Foo').new #=> #<Hoge::Foo:0x951bec8>
なるほど。なるほど。
続:クラスマクロ
http://d.hatena.ne.jp/UNKK/20110801/p1
こちらの記事の追記を読んでみて、なるほど自分が前回書いた例だと全てのクラスを汚染してしまう。
その点を踏まえて色々やっていたら、以下のようになった。
とはいっても、元記事のeigenclassメソッドをラムダに差し替えただけだが。
#!/usr/bin/env ruby # -*- coding: utf-8 -*- class Module def my_macro(arg) lambda{ class << self; self; end }.call.class_eval do define_method("Gorira" + arg.to_s) do "Gorira" + arg.to_s end end end end class C my_macro :x end puts C.Gorirax #=> Gorirax class D end puts D.Gorirax #=> undefined method `Gorirax' for D:Class (NoMethodError)
自分の理解が浅いだけでもっといい方法あるのかも。
クラスマクロ
こちらの記事のクラスマクロについて考えてみた。
http://d.hatena.ne.jp/UNKK/20110801/p1
#!/usr/bin/env ruby # -*- coding: utf-8 -*- class Module def my_macro(arg) self.class.instance_eval do define_method("Gorira" + arg.to_s) do "Gorira" + arg.to_s end end end end class C my_macro :x end puts C.Gorirax #=> Gorirax
意図している挙動になっているか自信は無いけどこういうことかな?
Rubyで配列内の重複する値を抽出する方法
こちらの記事の Rubyで配列から重複している値を抽出するのを考えてみた。
http://d.hatena.ne.jp/kiyo560808/20110801/1312196444
a = [1, 2, 3, 4, 5, 6, 5, 4] a.uniq.reject{|i| a.index(i) == a.rindex(i)} #=> [4, 5]
もしくは
a = [1, 2, 3, 4, 5, 6, 5, 4] a.uniq.reject{|i| a.count(i) == 1} #=> [4, 5]
こんな感じか?
ふとパフォーマンスが気になったので調べてみた。
#!/usr/bin/env ruby # -*- coding: utf-8 -*- require 'benchmark' a = (1..10000).to_a a += [1, 10000] Benchmark.bm do |x| x.report("Array#index:") do a.uniq.reject{|i| a.index(i) == a.rindex(i)} end x.report("Array#count:") do a.uniq.reject{|i| a.count(i) == 1} end x.report("using Hash:") do h = {} a.each do |i| h[i] ||= 0 h[i] += 1 end r = [] a.uniq.each do |i| r << i if h[i] > 1 end end end
user system total real Array#index: 12.430000 0.010000 12.440000 ( 12.461251) Array#count: 11.930000 0.000000 11.930000 ( 11.967026) using Hash: 0.020000 0.010000 0.030000 ( 0.029133)
結果、泥臭く書いたのがダントツで速いとか。
追記メモ
1行でやるなら
a.inject(Hash.new(0)){|h, i| h[i] += 1; h }.reject{|k, v| v <= 1 }.keys