rubyでMongoDBにISODateを入れる試み

  • ruby1.9.3

apacheのログなどを解析する場合にはmongodbに一度入れると扱いやすくなります。

そこでこのプレーンテキストのapacheのログをrubyを使っていれる試みをしてみました

この辺りを参考に

http://mironal-memo.blogspot.jp/2012/07/mongodb-ruby.html

gem install mongo
gem install bson_ext

ログからip,時間、urlの3つ、必要なものを抽出します

zcat access.log.gz |awk '{print $1"\t"$4"\t"$7}' > log.txt
#!/bin/env ruby
require "mongo"

conn=Mongo::Connection.new
db=conn.db("database")
col=db.collection("logs")
open("log.txt"){|f|
	f.each{|line|
		line.chomp!
		ay=line.split("\t")
		col.insert({"ip"=>ay[0],"date":"ISODate(Time.parse(ay[1].gsub("[","").sub(":"," ")).strftime('%Y-%m-%dT%H:%M:%SZ'))","url":ay[2])
	}
}

こんな感じで入るのかと思ったのですがISODateにはなりません

仕方がないので一度ファイルにします

  • create.rb
#!/bin/env ruby
puts "use database"
open("log.txt"){|f|
	f.each{|line|
		line.chomp!
		ay=line.split("\t")
		puts 'db.logs.insert({ip:"'+ay[0]+'","date":ISODate("'+Time.parse(ay[1].gsub("[","").sub(":"," ")).strftime('%Y-%m-%dT%H:%M:%SZ'))+'"),"url":"'+ay[2]+'"))'
	}
}
ruby create.rb > mongo.dat
mongo < mongo.dat

これくらいしかわかりませんでした

20131225 追記

一度ファイルにせずともできました

#!/bin/env ruby
require "rubygems"
require "mongo"
require "time"
include Mongo
db=MongoClient.new("localhost",27017).db("database")
col=db.collection("test")
col.insert({"id"=>"id0","date"=>Time.parse("2013-12-25 00:00:00").utc})

Time型のオブジェクトを作成し、utcへ変換するとMongodbではISODateへとなっています

sshでsudoを使ってtomcatをスタートする

  • centos 5系
$ ssh user@server sudo /usr/local/tomcat/bin/startup.sh
sudo: sorry, you must have a tty to run sudo

どうやらttyがないとエラーになるらしいので以下のオプションをつける

$ ssh -t user@server sudo /usr/local/tomcat/bin/startup.sh

このままだとスタートアップしてもsshでログアウトするとTOMCATも終了してしまう

$ ssh -t use@server sudo nohup /usr/local/tomcat/bin/startup.sh

nohupを使うことによりログアウト後もTOMCATが終了しない

ちなみに/etc/sudoersは

root	ALL=(ALL)	 ALL
user ALL=NOPASSWD: /usr/bin/nohup /usr/local/tomcat/bin/startup.sh

さらにパスワードを入れるのが面倒な場合は

  • remotestart.sh
#!/bin/sh
restart(){
expect << Eof
set timeout -1
spawn ssh -t user@host sudo nohup /usr/local/tomcat/bin/startup.sh
match_max 100000
expect -exact "user@host's password: "
send -- "password\r"
expect eof
Eof
}
restart

このシェルを実行

marveriksにアップデートしたらSynergyのキー配列が変

以前Windowsをサーバにmacをクライアントでsynergyを使用していたのですが、macのOSをmountain lion からmavericksにアップデートしたところ、synergyで記号がまたまたおかしくなってしまった

以前はキーボードの設定で地域をオーストラリアなどにすればよかったのですが今回はそういう設定がなくなった模様。。

いろいろごじゃごじゃやってようやく解決

  • mac 10.9 + SybergyKM
  • windows 7 + Synergy1.3

1.macのシステム設定からキーボードを選択

2.入力ソースで+からbritish-PCを選択

3.ことえりを選択し英字のチェックを外す

つまり英語入力時にはbritish-PCを使えば106キーボードの記号がそのまま出ます

そろそろバグ修正してもらえませんかねぇ