2012年3月27日火曜日

MongoDBのReplicaSetsの構築

Primary / Secondary / Arbiter の3台を構築

全3台の定義ファイルを変更
$ sudo vi /etc/mongodb.conf

## ReplicaSetsの名前をつける。のちの設定で使用。
==
replSet = log_rep
==

## 変更後サービスの再起動
$ sudo service mongodb restart

現状のステータス
以降、PrimaryのMongoにアクセスして設定を行う。
> rs.status()
{
        "startupStatus" : 3,
        "info" : "run rs.initiate(...) if not yet done for the set",
        "errmsg" : "can't get local.system.replset config from self or any seed (EMPTYCONFIG)",
        "ok" : 0
}
自分自身の定義
> config = {_id: 'log_rep', members: [{_id: 0, host: '10.20.30.191:27017'}]}  ★定義ファイルで指定した名前が_id部
{
        "_id" : "log_rep",
        "members" : [
                {
                        "_id" : 0,
                        "host" : "10.20.30.191:27017"
                }
        ]
}
初期化
> rs.initiate(config)
{
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}
>

初期化完了
> rs.status()
{
        "set" : "log_rep",
        "date" : ISODate("2012-03-23T09:49:38Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "10.20.30.191:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "optime" : {
                                "t" : 1332496142000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-23T09:49:02Z"),
                        "self" : true
                }
        ],
        "ok" : 1
}
SECONDARYの定義追加
PRIMARY> rs.add("10.20.30.192")
{ "ok" : 1 }

PRIMARY> rs.status()
{
        "set" : "log_rep",
        "date" : ISODate("2012-03-23T09:55:43Z"),
        "myState" : 1,
        "members" : [
                {
                        "_id" : 0,
                        "name" : "10.20.30.191:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "optime" : {
                                "t" : 1332496301000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-23T09:51:41Z"),
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "10.20.30.192:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",  ★無事SECONDARYになった!
                        "uptime" : 242,
                        "optime" : {
                                "t" : 1332496301000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-23T09:51:41Z"),
                        "lastHeartbeat" : ISODate("2012-03-23T09:55:41Z"),
                        "pingMs" : 0
                }
        ],
        "ok" : 1
}
Secondaryのほうは何もしなくて良い
SECONDARY> rs.status()
{
        "set" : "log_rep",
        "date" : ISODate("2012-03-23T10:01:54Z"),
        "myState" : 2,
        "syncingTo" : "10.20.30.191:27017",
        "members" : [
                {
                        "_id" : 0,
                        "name" : "10.20.30.191:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "uptime" : 604,
                        "optime" : {
                                "t" : 1332496301000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-23T09:51:41Z"),
                        "lastHeartbeat" : ISODate("2012-03-23T10:01:53Z"),
                        "pingMs" : 1
                },
                {
                        "_id" : 1,
                        "name" : "10.20.30.192:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "optime" : {
                                "t" : 1332496301000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-23T09:51:41Z"),
                        "self" : true
                }
        ],
        "ok" : 1
}
Arbiterの設定
Arbiterの設定もPrimaryで行う。
Secondary追加時同様、しばらく待つとできあがる
PRIMARY> rs.addArb("10.20.30.190:27017")

PRIMARY> rs.status()
{
        "set" : "log_rep",
        "date" : ISODate("2012-03-26T08:23:53Z"),
        "myState" : 1,
        "syncingTo" : "10.20.30.192:27017",
        "members" : [
                {
                        "_id" : 0,
                        "name" : "10.20.30.191:27017",
                        "health" : 1,
                        "state" : 1,
                        "stateStr" : "PRIMARY",
                        "optime" : {
                                "t" : 1332749742000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-26T08:15:42Z"),
                        "self" : true
                },
                {
                        "_id" : 1,
                        "name" : "10.20.30.192:27017",
                        "health" : 1,
                        "state" : 2,
                        "stateStr" : "SECONDARY",
                        "uptime" : 514,
                        "optime" : {
                                "t" : 1332749742000,
                                "i" : 1
                        },
                        "optimeDate" : ISODate("2012-03-26T08:15:42Z"),
                        "lastHeartbeat" : ISODate("2012-03-26T08:23:53Z"),
                        "pingMs" : 1
                },
                {
                        "_id" : 2,
                        "name" : "10.20.30.190:27017",
                        "health" : 1,
                        "state" : 7,
                        "stateStr" : "ARBITER",  ★ Arbiterが追加されたことを確認
                        "uptime" : 390,
                        "optime" : {
                                "t" : 0,
                                "i" : 0
                        },
                        "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                        "lastHeartbeat" : ISODate("2012-03-26T08:23:53Z"),
                        "pingMs" : 1
                }
        ],
        "ok" : 1
}

Arbiterのほうでmongoに入るとARBITERになってるのが確認できる
ARBITER>

2012年3月26日月曜日

MongoDBのバージョンアップ

実は入れた当初、MongoDBのバージョンが2.03だったので、2.04に更新。

現状のバージョンチェック
$ mongo
MongoDB shell version: 2.0.3
connecting to: test
PRIMARY> exit
bye

バージョンアップ
ここで手動停止しなくても、update時に停止コマンドが発行されている。
$ sudo service mongodb stop  ★ DB停止
 * Stopping database mongodb

$ sudo apt-get install mongodb-10gen  ★ update
… (省略)
mongodb-10gen (2.0.4) を設定しています ...
* Starting database mongodb  ★ DB起動

確認
$ mongo
MongoDB shell version: 2.0.4 
connecting to: test

2012年3月22日木曜日

MongoDBセットアップ(パッケージ編)

こちらを参考
http://www.mongodb.org/display/DOCS/Ubuntu+and+Debian+packages

Ubuntuに入れました。Mongoのバージョンは2.04です。
途中躓きましたが、なんとかできました。

キーの追加
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /etc/apt/secring.gpg --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
gpg: 鍵7F0CEB10をhkpからサーバーkeyserver.ubuntu.comに要求
gpg: 鍵7F0CEB10: 公開鍵“Richard Kreuter <richard@10gen.com>”を読み込みました
gpg: 絶対的に信用する鍵が見つかりません
gpg: 処理数の合計: 1
gpg:               読込み: 1  (RSA: 1)

※ proxy設定をする場合は、--keyserver-option http-proxy=http://10.20.30.40:8000 を追加してあげれば良い。


パッケージインストールに必要な設定(sources.listに定義を追加)
$ sudo vi /etc/apt/sources.list

# 下記を追加
==
deb http://downloads-distro.mongodb.org/repo/debian-sysvinit dist 10gen
==
インストール
$ sudo apt-get update
$ sudo apt-get install mongodb-10gen


DBの場所の変更
インストールすると同時にMongoDBが実行され、DBが構築される。
不要の場合は、/var/lib/mongodb を削除すれば良い。
※ mongodbを止めてから行う!
$ sudo service mongodb stop


他の場所に作る場合は、定義ファイルを変更する。
MongoDBの生成場所は、 /etc/mongodb.conf  に記載されている。

#dbpath=/var/lib/mongodb  ←DBの場所
#logpath=/var/log/mongodb/mongodb.log ←ログの場所

しかし、、定義を変更しても、DBパスとログパスがうまく読み込まれないので
下記の対応を行った。
## サービスが書かれている場所
$ sudo vi /etc/init.d/mongodb
==
## 88-90行目あたりを変更する。
DAEMONUSER=${DAEMONUSER:-mongodb}  # ログインユーザに変更してみる
DAEMON_OPTS=${DAEMON_OPTS:-"--dbpath $DATA --logpath $LOGFILE run"} # この行が呼ばれるからコメントアウト!
DAEMON_OPTS="$DAEMON_OPTS --config $CONF"
==


ひとまず、これで無事起動しました。
$ sudo service mongodb start
 * Starting database mongodb 

2012年3月9日金曜日

RubyからMySQLにアクセス

MySQLのデータベースに直接アクセスしてデータを抜く方法。
これ以外にももちろんあります!

require 'mysql'
db = Mysql.connect("ホスト", "ログイン名", "パスワード", "DB名")
sql = "select login, firstname, lastname from users;"
rs = db.query(sql)

# 件数
puts rs.num_rows

# 結果の表示
rs.each do |row|
  puts row[0] + " " + row[1] + " " + row[2]
end

db.close

selectで書いた login, firstname, lastnameが、
結果でも0,1,2の順に配列に入っています。

Rubyで配列をソートする方法

ここでは、単一配列、多重配列、昇順、降順についてメモしました。
条件によるソートもあるのですが、それは追々…。

sort
数字
> a = [1,4,2,5,7,3,6,8,9]
=> [1, 4, 2, 5, 7, 3, 6, 8, 9]
> a.sort
=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
文字列
> b = ["e","c","a","b","d"]
=> ["e", "c", "a", "b", "d"]
> b.sort
=> ["a", "b", "c", "d", "e"]

sort_by
多重配列
> c = [[2,"b"],[1,"a"],[3,"c"],[2,"a"]]
=> [[2, "b"], [1, "a"], [3, "c"], [2, "a"]]
> c.sort_by{|item| item[0]}
=> [[1, "a"], [2, "b"], [2, "a"], [3, "c"]]
多重ソート
上記の場合だと、同じ値の時、[2, "b"], [2, "a"]になっています。
これを[2, "a"], [2, "b"]2つめもキーにしてソートしたい場合は
配列で順番を指定します。便利!
> c = [[2,"b"],[1,"a"],[3,"c"],[2,"a"]]
=> [[2, "b"], [1, "a"], [3, "c"], [2, "a"]]
> c.sort_by{|item| [item[0],item[1]]}
=> [[1, "a"], [2, "a"], [2, "b"], [3, "c"]]
c.sort でもできるけど、想定通りになるかは…?
> c.sort
=> [[1, "a"], [2, "a"], [2, "b"], [3, "c"]]

降順ソート
単一配列
> a.sort.reverse
=> [9, 8, 7, 6, 5, 4, 3, 2, 1]
> b.sort.reverse
=> ["e", "d", "c", "b", "a"]
多重配列
1項目は降順、2項目は昇順の場合
> c.sort_by{|item| [-item[0], item[1]]}
=> [[3, "c"], [2, "a"], [2, "b"], [1, "a"]]

2012年3月8日木曜日

cronから実行すると文字化け

忘れた頃にハマるのでメモっておきます。

cronからスクリプト等を実行する時は

    export LANG=ja_JP.UTF-8

をcrontabに書いておきましょう!

書かないと、実行した際に日本語が文字化けします。
cronだと環境変数が異なるんですよね。
手動で実行すると大丈夫なのに、cronからだと文字化けする時はまずここをチェック!

2012年3月3日土曜日

AWS Summit 2012 〜2日目〜

土曜日だけど、またもやAWS Summitへお邪魔してきましたー
今日はハンズオン!
EC2、S3、Beanstalkを動かしてみます。


EC2 (後藤さん)
http://www.slideshare.net/kaz.goto/jawsug-summit-ec2

AWSアカウントの作成完了までが事前準備とはいえ、なにやら終わってない人も…
さらにネットワークが遅くて、様々な要因が重なり時間が取られて
EC2でWordpressの起動まで終わらず。
起動は宿題になりましたー。
でも、休憩中に無事終わらせました♪
EC2は過去に1度だけ会社で使ったことがあるけど、
途中からだったので、今回は最初からできて勉強になりました!


S3 (李さん)
S3、CloudFront、IAMをやったのですが、IAMは途中で置いて行かれました(汗)
JSON形式で書く部分が全く分からず…。
でも、S3について権限設定とか分かったので良かったです。

Beanstalk (片山さん)
http://adsj-doc.s3.amazonaws.com/handson/beanstalk/AWS-ElasticBeanstalk-HandsOn-SUMMIT2012.pdf
最初の設定で何か間違えたらしく途中置いて行かれましたが、
最後に無事キャッチアップできました…。
Beanstalkはまだ東京リージョンにないけど、
Javaを使って開発している人にとっては便利かもしれないですね。

#ハンズオンのtogetter
http://togetter.com/li/267074?utm_source=dlvr.it&utm_medium=twitter

#jawsug
http://togetter.com/li/267065

さすがに2日目は迷わず到着したベルサール六本木。

Macのターミナルに色とalias設定


初Macで何が何だか…。
ターミナルを使うのにいろいろ設定したいのだが、
まず下記2点がやりたいのです。

1. ls -l と ls -a のショートカットとしてそれぞれ ll と laを設定したい。
2. ls の時に色を付けたい

起動時に読み込まれる .bash_profile に記載します。
ホームディレクトリ以下に.bash_profileを作成(or 記載を追加)。
$ cd
$ vi .bash_profile

追加する内容
alias ll='ls -l'
alias la='ls -a'
export CLICOLOR=1
export LSCOLORS=DxGxcxdxCxegedabagacad

ターミナルを一旦exitして再度入ればOK!

2012年3月2日金曜日

AWS Summit 2012 〜1日目〜

最初から出るはずが、いろいろ問題があり、
最後の1セッションのみの参加になりました(´・ω・`)
でも、いろいろな出会いもあり楽しかったです☆

印象深かったのは、佐藤さんが話してた下記の内容。
肩書きはデータサイエンティストより、データエンジニアのほうが良い
サイエンティストは成功事例だけを見るけど、
エンジニアは失敗事例も含めて見る。

togetterのまとめはこちら↓
http://togetter.com/li/266608

コミュニティセッション
アンケート回答でいただいたシール(左)とSAMURAIシール(右)♪




2012年3月1日木曜日

Rubyで配列を途中から最後まで取得する方法

配列を途中から最後まで取得したい場合は、「-1」を使います。

irbから見てみましょう。

> x = [1,2,3,4,5,6,7,8,9]
 => [1, 2, 3, 4, 5, 6, 7, 8, 9]
> x[0]   # 0番目
 => 1
> x[1]  # 1番目
 => 2
> x[3..5]  # 3-5番目
 => [4, 5, 6]
> x[3..-1]  # 3番目から最後まで
 => [4, 5, 6, 7, 8, 9]