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

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]


python

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]


php

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