初歩的なメモ
SpringFrameworkでこう書いて、
テストこう書いて、
実行すると、こうなる
ねーぞ、と。
なので、テスト用にSessionスコープをつくってあげます(Requestとか他のスコープも一緒)
実行
とりあえずとおった。
複数のテストの場合、個別のテストに書くの微妙なのでリスナーを作りましょう。
で、ほげテスト君をもとどおりにしてアノテーションでリスナー指定
チクショーDIできてねー(>_<)
どうやらこうらしい。
さいごとのトコちょっと意味不明。
なので、(気が向いたら)つづく。
かねこ m)Д`)
2012年11月5日月曜日
2012年10月14日日曜日
Groovy!! (MOP: Meta Object Protocolの巻)
Groovyのすべてのクラスは暗黙的にgroovy.lang.GroovyObjectインタフェースを実装していて、GroovyObjectインタフェースにはMOP用のメソッドが定義されている。
こんな感じ。シンプル。
invokeMothod
set/getProperty
set/getMetaClass
→groovy.lang.MetaClass imprements MetaObject
コード例
まとめ
grooby++
かねこ\(^o^)/
こんな感じ。シンプル。
invokeMothod
set/getProperty
set/getMetaClass
→groovy.lang.MetaClass imprements MetaObject
コード例
まとめ
grooby++
かねこ\(^o^)/
2012年9月30日日曜日
Groovy!! ミックスイン(Minxin)の巻
GroovyはMixinがつかえる。
Mixin名前かっこいい!
多重継承の使いどころ全然思いつかない(ニューハーフとか?)
けど、コード書いてみよう。
言語仕様は使いやすくて読みやすい。
ただし、読みやすさは同一スコープでクラス初期化してる場合だけで、DIとかの場合は定義だけ見ても継承関係わかんなくなっちゃうからダメかも。でもGroovyでDIなんか書かないからいいか。
要は適材適所?でも適所がわからん(><)
ついでに参考
けつろん
名前かっこいい!
かねこ((´∀`))
Mixin名前かっこいい!
多重継承の使いどころ全然思いつかない(ニューハーフとか?)
けど、コード書いてみよう。
言語仕様は使いやすくて読みやすい。
ただし、読みやすさは同一スコープでクラス初期化してる場合だけで、DIとかの場合は定義だけ見ても継承関係わかんなくなっちゃうからダメかも。でもGroovyでDIなんか書かないからいいか。
要は適材適所?でも適所がわからん(><)
ついでに参考
Mixin は Symbolics 社のオブジェクト指向システム Flavors で初めて登場し、LISPマシン で用いられたオブジェクト指向への試みであった。この名称は、マサチューセッツ州 Somerville にあった Steve's Ice Cream Parlor からヒントを得て考え出されたものであった[1]。このアイスクリーム店の店長は(バニラやチョコレートなどの)基本となる味を混ぜ、追加の具材(ナッツ、クッキー、キャンディなど)と組み合わせたものを提供し、それを"Mix-in"と呼んで店の登録商標としていた[2]。
Mixin - Wikipedia
けつろん
名前かっこいい!
かねこ((´∀`))
2012年9月29日土曜日
Groovy!! クロージャ(Closure)の巻
Groovyはクロージャ(Closure)が使える。
クロージャが使えると、RubyとかjQueryでよくやるあの感じ(笑)のコーディングが出来る!
説明ができないので、コード書きます。
スコープ
クロージャはブロックの外側の変数にアクセスすることができる。
レキシカルスコープ
クロージャが呼び出された場所ではなく、クロージャが宣言されている場所からみたスコープが有効
変数の束縛
クロージャ内で宣言した変数のスコープはクロージャ内のみとなる
本領発揮
必殺!この記法で書くことができると、イテレーションの条件と実際の処理を分離することができる。
どんどんつかおうクロージャ!
かねこ( ゚ ρ ゚ )
クロージャが使えると、RubyとかjQueryでよくやるあの感じ(笑)のコーディングが出来る!
説明ができないので、コード書きます。
スコープ
クロージャはブロックの外側の変数にアクセスすることができる。
レキシカルスコープ
クロージャが呼び出された場所ではなく、クロージャが宣言されている場所からみたスコープが有効
変数の束縛
クロージャ内で宣言した変数のスコープはクロージャ内のみとなる
本領発揮
必殺!この記法で書くことができると、イテレーションの条件と実際の処理を分離することができる。
どんどんつかおうクロージャ!
かねこ( ゚ ρ ゚ )
2012年9月23日日曜日
2012年9月22日土曜日
Groovy!!(EclipseとGroovyプラグイン)
EclipseのGroovyプラグインいれるの巻。ほぼ全自動で楽々♪
ヘルプ→新規ソフトウェアのインストール
ヘルプ→新規ソフトウェアのインストール
何にも考えずにどんどん進んで、
インストール完了。
新規プロジェクトウィザードにGroovyできた。ナイス!
さっそくプロジェクト作ってみる。
check it!!
かねこ(´∀`∩)↑age↑
2012年9月20日木曜日
Groovy!!(Linuxに環境構築編)
Groovyきわめる!
まずはLinuxに環境構築する
前提確認。OS.
# uname -a Linux polyrhythm.e2info.co.jp 2.6.32-220.el6.x86_64 #1 SMP Tue Dec 6 19:48:22 GMT 2011 x86_64 x86_64 x86_64 GNU/Linux
種類わかったから以下。
# cat /etc/redhat-release CentOS release 6.2 (Final)
あとJava
java version "1.7.0_05-icedtea"
OpenJDK Runtime Environment (rhel-2.2.1.el6_3-x86_64)
OpenJDK 64-Bit Server VM (build 23.0-b21, mixed mode)
Groovyインストール!
バイナリ取得
[root@polyrhythm tmp]# cd /tmp
[root@polyrhythm tmp]# wget http://dist.groovy.codehaus.org/distributions/groovy-binar
展開と移動
[root@polyrhythm tmp]# unzip groovy-binary-2.0.2.zip [root@polyrhythm tmp]# mv groovy-binary-2.0.2/ /usr/share/
シンボリックリンク(必須じゃない)
[root@polyrhythm share]# mv /usr/share/ [root@polyrhythm share]# ln -s /usr/share/groovy-2.0.2/ groovy
パス設定(本当は~/.bash_profileで。)
[root@polyrhythm share]# PATH=$PATH:/usr/share/groovy/bin/
[root@polyrhythm share]# export PATH
要チェック!
[root@polyrhythm share]# groovy -v Groovy Version: 2.0.2 JVM: 1.6.0_24 Vendor: Sun Microsystems Inc. OS: Linuxやった。
コード実行
[root@polyrhythm e2info]# vi hw.groovy
println "Hello World!"
[root@polyrhythm e2info]# groovy hw.groovy
Hello World!
Groovyさいこう!
かねこ(^-^)
2012年9月18日火曜日
PHP Fog!
開発環境構築はそろそろネタ切れになってきてちょっと飽きちゃたから、たまには他のことやろう。
PHP Fogが気になったので、つかってみます。PHPのクラウドプラットフォーム!
1.登録~SSHキー設定
(省略)
アプリ登録で、とりあえずCustom Appを選択。登録が完了するとHelloWorldがでるようになる。
2.Gitリポジトリからソースコード取得
git cloneする。
3.ソースコード書き換え
適当に。
4.commit~push
コミットしてプッシュ。お決まり。
5.確認
さっきプッシュした内容が反映されたことを確認。
て感じでお手軽かどうかイマイチどうかわからない(コミットフックして自動デプロイってすぐ作れるもんね)PHP Fogだけど、スケールアウトしたりスケールアップしたり、リリースバージョン管理したり、すぐサービス起動したり止めたり、そういうクラウドの特徴っぽいところで真価を発揮するんだろうよ、きっと。
AppFogもきになる!
かねこ(b´∀`)
PHP Fogが気になったので、つかってみます。PHPのクラウドプラットフォーム!
1.登録~SSHキー設定
(省略)
アプリ登録で、とりあえずCustom Appを選択。登録が完了するとHelloWorldがでるようになる。
2.Gitリポジトリからソースコード取得
git cloneする。
# git clone git@git01.phpfog.com:e2kaneko.phpfogapp.com
Cloning into 'e2kaneko.phpfogapp.com'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.
3.ソースコード書き換え
適当に。
4.commit~push
コミットしてプッシュ。お決まり。
# git commit . -m "change message."
[master 3db2846] change message.
1 file changed, 1 insertion(+), 1 deletion(-)
# git push
Counting objects: 5, done.
Writing objects: 100% (3/3), 271 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: -----> Deploying to the cloud
To git@git01.phpfog.com:e2kaneko.phpfogapp.com
c0fb119..3db2846 master -> master
5.確認
さっきプッシュした内容が反映されたことを確認。
て感じでお手軽かどうかイマイチどうかわからない(コミットフックして自動デプロイってすぐ作れるもんね)PHP Fogだけど、スケールアウトしたりスケールアップしたり、リリースバージョン管理したり、すぐサービス起動したり止めたり、そういうクラウドの特徴っぽいところで真価を発揮するんだろうよ、きっと。
AppFogもきになる!
かねこ(b´∀`)
2012年9月17日月曜日
SVNとIRC連携の巻
SVNコミットをIRCに通知してみる。
ネット見たらSmartIRCのほうがよさそう。
かいた。
サーバに置いて、post-commit変更
どうかな
(*´・ω・)かねこ(・ω・`*)
SVNにはpost-commitがあるから、たぶん楽勝。
環境もなんでもいいんだろうけど、手っ取り早そうなPHPで。
pearライブラリ検索
> pear search IR
Retrieving data...0%.MATCHED PACKAGES, CHANNEL PEAR.PHP.NET:=======================================PACKAGE STABLE/(LATEST) LOCALNet_IRC 0.0.7 (beta) IRC Client ClassNet_SmartIRC 1.0.2 (stable) 1.0.2 Net_SmartIRC is a PHP class for communication with IRC networks
サーバに置いて、post-commit変更
[root@hoge hooks]# vi post-commit#!/bin/sAUTHOR=`svnlook author -r $REV $REPOS`LOG=`svnlook log -r $REV $REPOS`CHANGES=`svnlook changed -r $REV $REPOS`
php /home/e2info/developer/svn-irc.php "$AUTHOR" "$LOG" "$CHANGES"
どうかな
できた!!日本語よめないのはめんどくさいからまた今度で。
(*´・ω・)かねこ(・ω・`*)
ラベル:
iRC,
Linux,
Net_SmartIRC,
PEAR,
PHP,
php5,
post-commit,
Subversion,
SVN,
システム開発,
開発環境
2012年9月14日金曜日
Jenkins先生とIRCの連携の巻
IRCサーバうごいたので、早速Jenkinsのビルド結果をIRCサーバに送ってみよう。
JenkinsにはIRC Pluginがあるので導入。
Jenkinsの管理→プラグインの管理→Jenkins IRC Plugin
「Jenkinsの管理」→「システムの設定」にIRC Nortification発見!有効に。
ビルドしてみる…jenkins-botきた!わーい
いや、なんかしろ(笑)
気を取り直して設定見直し。
プロジェクト単位の設定の方にあった。
JenkinsにはIRC Pluginがあるので導入。
Jenkinsの管理→プラグインの管理→Jenkins IRC Plugin
「Jenkinsの管理」→「システムの設定」にIRC Nortification発見!有効に。
ビルドしてみる…jenkins-botきた!わーい
いや、なんかしろ(笑)
気を取り直して設定見直し。
プロジェクト単位の設定の方にあった。
再度ビルド。
できたー!連携サイコー!
IRC用のちっちゃいモニター欲しい。
かねこ( ^ω^ )
2012年9月13日木曜日
IRCいれた!!の巻
iRCサーバいれた。
設置と設定が簡単そうなので、IRCD-Hybridを選択。どのへんがハイブリッドなんだろうか。
EPEL追加
yumインストールして、
コンフィグファイル設定して起動
できた?
つないでみる
OS起動時に自動起動するようにして、
おしまい~☆
かねこ(・д・)
設置と設定が簡単そうなので、IRCD-Hybridを選択。どのへんがハイブリッドなんだろうか。
EPEL追加
[root@polyrhythm tmp]cd /tmp [root@polyrhythm tmp]# wget http://syslogserver.googlecode.com/files/epel-release-5-3.noarch.rpm --2012-09-12 18:19:48-- http://syslogserver.googlecode.com/files/epel-release-5-3.noarch.rpm Resolving syslogserver.googlecode.com... 74.125.31.82, 2404:6800:4008:c00::52 Connecting to syslogserver.googlecode.com|74.125.31.82|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 11989 (12K) [application/x-rpm] Saving to: epel-release-5-3.noarch.rpm” 100%[======================================>] 11,989 --.-K/s in 0.03s 2012-09-12 18:19:48 (396 KB/s) - epel-release-5-3.noarch.rpm saved [11989/11989] [root@polyrhythm tmp]# rpm -ivh epel-release-5-3.noarch.rpm warning: epel-release-5-3.noarch.rpm: Header V3 DSA/SHA1 Signature, key ID 21752 1f6: NOKEY Preparing... ########################################### [100%] 1:epel-release ########################################### [100%]
yumインストールして、
[root@polyrhythm tmp]# yum --enablerepo=epel install ircd-hybrid (略) Installed: ircd-hybrid.x86_64 0:7.2.3-5.el5 Dependency Installed: openssl098e.x86_64 0:0.9.8e-17.el6.centos.2 Complete! [root@polyrhythm tmp]#
コンフィグファイル設定して起動
[root@polyrhythm tmp]# cp /usr/share/doc/ircd-hybrid-7.2.3/simple.conf /etc/ircd/ircd.conf
[root@polyrhythm tmp]# vi /etc/ircd/ircd.conf
serverinfo {
name = "polyrhythm.e2info.co.jp";
sid = "000";
description = "Test IRC Server";
hub = no;
};
[root@polyrhythm tmp]# service ircd start
[root@polyrhythm tmp]# service ircd status
ircd (pid 13110) is running...
できた?
つないでみる
つながった?よくわからないけど、つながったんだろう、きっと。
OS起動時に自動起動するようにして、
[root@polyrhythm tmp]# chkconfig ircd on
おしまい~☆
かねこ(・д・)
2012年9月11日火曜日
最強の開発環境をつくるぞ!
本気でやるぞ!
というわけで、グランドデザインのラフつくりました。イマイチ!
トモチンに「もっとかっこよくしたい!」って相談したら、「モノクロにするとかっこよくなりますよ~」って言われたんだけど、モノクロのやりかたはおしえてくれませんでした
(-∧-;) あいつめ。
現在導入済みの環境は、
次はとりあえず全部つないじゃうのがわかりやすくていいだろうと思うので、iRCサーバ作って導入済みプロダクトの通知をバンバン飛ばしてみたい!
よって次回は、iRCサーバをたちあげてみたいと思います。
楽しみ!
かねこ(゜-゜)
トモチンに「もっとかっこよくしたい!」って相談したら、「モノクロにするとかっこよくなりますよ~」って言われたんだけど、モノクロのやりかたはおしえてくれませんでした
(-∧-;) あいつめ。
現在導入済みの環境は、
- Jenkins
- SVN
- Redmine
- Aipo
- サーバ死活監視
ほかにもあったっけな?
次はとりあえず全部つないじゃうのがわかりやすくていいだろうと思うので、iRCサーバ作って導入済みプロダクトの通知をバンバン飛ばしてみたい!
よって次回は、iRCサーバをたちあげてみたいと思います。
楽しみ!
かねこ(゜-゜)
2012年9月10日月曜日
Jenkins導入しました
ひろっちと開発チーム用サーバつくりました。KVM上にCentOS。
サーバ名はpolyrhythm.
かっこいい!
Jenkins入れました。
メモリ不足。
スペック貧弱すぎたか( TДT)
まだまだ序の口。
かねこ(゚з゚)
MVCとMOVE
世間ではMVC is dead, it's time to MOVE on.(和訳)の話題が花盛り♪
ちょっと見てみた。
これの、too much code into your controllers, because~ の下り、イマイチ(><)
実際は、MVCのモデルの領域は、”データと手続き”の部分なので、Controllerが誇大化する場合は、そもそもModelの扱い方を間違えてるのではないかと思います(よくあるのは、ControllerからDAO操作してるとか)
ということで、MVC死んでねー
MOVEは一読してよくわからなかったので、次回お勉強してみようと思います。
かねこ( ・`д・´)
ちょっと見てみた。
MVC is a phenomenal idea. You have models, which are nice self-contained bits of state, views which are nice self-contained bits of UI, and controllers which are nice self-contained bits of …
What?
I'm certainly not the first person to notice this, but the problem with MVC as given is that you end up stuffing too much code into your controllers, because you don't know where else to put it.
これの、too much code into your controllers, because~ の下り、イマイチ(><)
実際は、MVCのモデルの領域は、”データと手続き”の部分なので、Controllerが誇大化する場合は、そもそもModelの扱い方を間違えてるのではないかと思います(よくあるのは、ControllerからDAO操作してるとか)
ということで、MVC死んでねー
MOVEは一読してよくわからなかったので、次回お勉強してみようと思います。
かねこ( ・`д・´)
2012年4月9日月曜日
MongoDB(5) シャーディング
今日はMongoDBのシャーディングをやってみよう。
shardingとは: Shard(database_architecture)
mongoのシャーディング: Sharding
はじめにデータベース起動(とりあえず3つ)
コンフィグサーバ起動
ルーティングプロセス起動
(デフォルトチャンクサイズは200MBだけど、テストのために3MBに指定)
ここまでで、サーバ群起動完了。
次に、shardingの設定をする。
mongo起動、adminデータベースに接続
shardサーバ追加
ステータス確認
shardキーを指定
おこられた(><)
データベースにsharding許可を指示
再度挑戦
ていうか、これ、コレクション単位でshardできるのか。すごい柔軟。
ルーティングサーバに接続して、テストデータ投入。
100万件くらい、いれればいいかな。
状況確認
状況確認2
100万件はいってる。
接続先を個別のデータベースに変えて確認
合計100万件はいってる。ナイス。
というわけで、MongoDB編おしまい。
かねこ( ;∀;)
shardingとは: Shard(database_architecture)
mongoのシャーディング: Sharding
はじめにデータベース起動(とりあえず3つ)
mongod --dbpath=d:\xampp\mongodb\data\shard1 --port 28017mongod --dbpath=d:\xampp\mongodb\data\shard2 --port 28018mongod --dbpath=d:\xampp\mongodb\data\shard3 --port 28019
コンフィグサーバ起動
mongod --configsvr --port 28099 --dbpath=d:\xampp\mongodb\data\config
ルーティングプロセス起動
(デフォルトチャンクサイズは200MBだけど、テストのために3MBに指定)
mongos --configdb localhost:28099 --port 28100 --chunkSize 3
ここまでで、サーバ群起動完了。
次に、shardingの設定をする。
mongo起動、adminデータベースに接続
D:\xampp\mongodb\bin>mongo localhost:28100/admin
MongoDB shell version: 2.0.3
connecting to: localhost:28100/admin
shardサーバ追加
mongos> db.runCommand({addshard:"localhost:28017"});
{ "shardAdded" : "shard0000", "ok" : 1 }
mongos> db.runCommand({addshard:"localhost:28018"});
{ "shardAdded" : "shard0001", "ok" : 1 }
mongos> db.runCommand({addshard:"localhost:28019"});
{ "shardAdded" : "shard0002", "ok" : 1 }
ステータス確認
mongos> db.rintShardingStatus();
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "localhost:28017" }
{ "_id" : "shard0001", "host" : "localhost:28018" }
{ "_id" : "shard0002", "host" : "localhost:28019" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
mongos>
shardキーを指定
mongos> db.runCommand({shardcollection:"test.test",key:{userid:1}});
{ "ok" : 0, "errmsg" : "sharding not enabled for db" }
おこられた(><)
データベースにsharding許可を指示
mongos> db.runCommand({enablesharding:"test"});
{ "ok" : 1 }
再度挑戦
mongos> db.runCommand({shardcollection:"test.test",key:{userid:1}});
{ "collectionsharded" : "testdb.test", "ok" : 1 }
ていうか、これ、コレクション単位でshardできるのか。すごい柔軟。
ルーティングサーバに接続して、テストデータ投入。
D:\xampp\mongodb\bin>mongo localhost:28100
MongoDB shell version: 2.0.3
connecting to: localhost:28100/test
mongos>
100万件くらい、いれればいいかな。
mongos> for(var i =0; i<1000000; i++) {
... var doc = {userid:i, name:"user"+i};
... db.test.save(doc);
... }
状況確認
mongos> db.runCommand({addshard:"localhost:28017"});db.printShardingStatus();
--- Sharding Status ---
sharding version: { "_id" : 1, "version" : 3 }
shards:
{ "_id" : "shard0000", "host" : "localhost:28017" }
{ "_id" : "shard0001", "host" : "localhost:28018" }
{ "_id" : "shard0002", "host" : "localhost:28019" }
databases:
{ "_id" : "admin", "partitioned" : false, "primary" : "config" }
{ "_id" : "testdb", "partitioned" : true, "primary" : "shard0000" }
{ "_id" : "test", "partitioned" : true, "primary" : "shard0000" }
test.test chunks:
shard0000 8
shard0001 7
shard0002 14
too many chunks to print, use verbose if you want to force print
状況確認2
mongos> db.test.count();
1000000
100万件はいってる。
接続先を個別のデータベースに変えて確認
D:\xampp\mongodb\bin>mongo localhost:28017
MongoDB shell version: 2.0.4
connecting to: localhost:28017/test
> db.test.count();
162515
D:\xampp\mongodb\bin>mongo localhost:28018
MongoDB shell version: 2.0.4
connecting to: localhost:28018/test
> db.test.count();
171400
D:\xampp\mongodb\bin>mongo localhost:28019
MongoDB shell version: 2.0.4
connecting to: localhost:28019/test
> db.test.count();
666085
合計100万件はいってる。ナイス。
というわけで、MongoDB編おしまい。
かねこ( ;∀;)
2012年3月28日水曜日
MongoDB(4) レプリケーション
概要
CRUDはいい加減おもしろくないですが、MongoDBのレプリケーションは簡単で面白いらしいよ。ということで、やってみる。
まず、レプリケーションのアーキテクチャにMaster/SlaveとReplica Sets(+Replica Pair)がある。
新しいバージョンのMongoDBが導入できるならReplica Sets。
とくちょう
・Data Redundancy
・Automated Failover
・High Availability
・Distributing read load
・Simplify maintenance (compared to "normal" master-slave)
・Disaster recovery
日本語訳と違う(><)
レプリカ用ディレクトリ作成
レプリカセット起動
rep_testがレプリカセットの名前。
起動したけど、初期化してないから警告が出てる
レプリカセット初期化
initiate()すると、初期化がはじまってPrimary/Secondaryが選択される
なぜか27019がマスタに。
状態確認
自動フェイルオーバーの確認
PRIMARYを落としてみる
状態確認
27017がPRIMARYになった。
27019復活
状態確認
27019はSECONDARYとして復活。
master/secondaryノードの決定は、各サーバの多数決で決定される。
というわけで、うわさどおり簡単で面白かったです。
かねこ(ゝω・)
CRUDはいい加減おもしろくないですが、MongoDBのレプリケーションは簡単で面白いらしいよ。ということで、やってみる。
まず、レプリケーションのアーキテクチャにMaster/SlaveとReplica Sets(+Replica Pair)がある。
新しいバージョンのMongoDBが導入できるならReplica Sets。
とくちょう
・Data Redundancy
・Automated Failover
・High Availability
・Distributing read load
・Simplify maintenance (compared to "normal" master-slave)
・Disaster recovery
日本語訳と違う(><)
レプリカ用ディレクトリ作成
D:\xampp\mongodb\data ┗rep1 ┗rep2 ┗rep3
レプリカセット起動
mongod --replSet rep_test --port 27017 --dbpath ../data/rep1
mongod --replSet rep_test --port 27018 --dbpath ../data/rep2
mongod --replSet rep_test --port 27019 --dbpath ../data/rep3
rep_testがレプリカセットの名前。
起動したけど、初期化してないから警告が出てる
Wed Mar 28 07:48:44 [rsStart] replSet can't get local.system.replset config from self or any seed (EMPTYCONFIG)
レプリカセット初期化
D:\xampp\mongodb\bin>mongo MongoDB shell version: 2.0.3 connecting to: test > config = {_id: 'rep_test', members: [ {_id: 0, host: '127.0.0.1:27017'}, {_id: 1, host: '127.0.0.1:27018'}, {_id: 2, host: '127.0.0.1:27019'}] }; rs.initiate(config); { "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 } >
initiate()すると、初期化がはじまってPrimary/Secondaryが選択される
[rsStart] replSet STARTUP2 [rsSync] ****** [rsSync] creating replication oplog of size: 47MB... [rsSync] ****** [rsSync] replSet initial sync pending [rsSync] replSet initial sync need a member to be primary or second initial sync [rsHealthPoll] replSet member 127.0.0.1:27017 is up [rsHealthPoll] replSet member 127.0.0.1:27017 is now in state SECONDARY [rsHealthPoll] replSet member 127.0.0.1:27018 is up [rsHealthPoll] replSet member 127.0.0.1:27018 is now in state SECONDARY [rsSync] replSet initial sync finishing up
なぜか27019がマスタに。
状態確認
PRIMARY> rs.status() { "set" : "rep_test", "date" : ISODate("2012-03-27T23:03:25Z"), "myState" : 1, "syncingTo" : "127.0.0.1:27019", "members" : [ { "_id" : 0, "name" : "127.0.0.1:27017", "health" : 1, "state" : 1, "stateStr" : "SECONDARY", "optime" : { "t" : 1332888980000, "i" : 1 }, "optimeDate" : ISODate("2012-03-27T22:56:20Z"), "self" : true }, { "_id" : 1, "name" : "127.0.0.1:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 422, "optime" : { "t" : 1332888980000, "i" : 1 }, "optimeDate" : ISODate("2012-03-27T22:56:20Z"), "lastHeartbeat" : ISODate("2012-03-27T23:03:25Z"), "pingMs" : 0 }, { "_id" : 2, "name" : "127.0.0.1:27019", "health" : 1, "state" : 2, "stateStr" : "PRIMARY", "uptime" : 159, "optime" : { "t" : 1332888980000, "i" : 1 }, "optimeDate" : ISODate("2012-03-27T22:56:20Z"), "lastHeartbeat" : ISODate("2012-03-27T23:03:24Z"), "pingMs" : 0 } ], "ok" : 1 }
自動フェイルオーバーの確認
PRIMARYを落としてみる
[rsHealthPoll] replSet member 127.0.0.1:27019 is now in state DOWN
状態確認
PRIMARY> rs.status() { (略) "members" : [ { "_id" : 0, "name" : "127.0.0.1:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", (略) }, { "_id" : 1, "name" : "127.0.0.1:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", (略) }, { "_id" : 2, "name" : "127.0.0.1:27019", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", (略) } ], "ok" : 1 }
27017がPRIMARYになった。
27019復活
mongod --replSet rep_test --port 27019 --dbpath ../data/rep3
状態確認
PRIMARY> rs.status() { (略) "members" : [ { "_id" : 0, "name" : "127.0.0.1:27017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", (略) }, { "_id" : 1, "name" : "127.0.0.1:27018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", (略) }, { "_id" : 2, "name" : "127.0.0.1:27019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", (略) } ], "ok" : 1 }
27019はSECONDARYとして復活。
master/secondaryノードの決定は、各サーバの多数決で決定される。
というわけで、うわさどおり簡単で面白かったです。
かねこ(ゝω・)
2012年3月26日月曜日
MongoDB(3) クエリ速習
クエリに挑戦!
サンプルデータ
全件検索
条件検索
ソート(昇順)
ソート(降順)
リミット
オフセット
リミット&オフセット(ページング)
条件演算子(条件演算子一覧はここ)
カーソル
まとめ
MongoDBのクエリー単純で簡単。
かねこ(~_~)
サンプルデータ
> db.example.remove() > for(var i =0; i<6; i++) { ... var doc = {name:'user'+i, point: i*1000}; ... db.example.save(doc); ... } >
全件検索
> db.example.find() {"_id":ObjectId("4f69766ea84ad157af92c6ab"),"name":"user0","point":0} {"_id":ObjectId("4f69766ea84ad157af92c6ac"),"name":"user1","point":1000} {"_id":ObjectId("4f69766ea84ad157af92c6ad"),"name":"user2","point":2000} {"_id":ObjectId("4f69766ea84ad157af92c6ae"),"name":"user3","point":3000} {"_id":ObjectId("4f69766ea84ad157af92c6af"),"name":"user4","point":4000} {"_id":ObjectId("4f69766ea84ad157af92c6b0"),"name":"user5","point":5000}
条件検索
> db.example.find({point:2000}) { "_id" : ObjectId("4f69766ea84ad157af92c6ad"), "name" : "user2", "point" : 2000 }
ソート(昇順)
> db.example.find().sort({point:1}) { "_id" : ObjectId("4f69766ea84ad157af92c6ab"), "name" : "user0", "point" : 0 } { "_id" : ObjectId("4f69766ea84ad157af92c6ac"), "name" : "user1", "point" : 1000 } { "_id" : ObjectId("4f69766ea84ad157af92c6ad"), "name" : "user2", "point" : 2000 } { "_id" : ObjectId("4f69766ea84ad157af92c6ae"), "name" : "user3", "point" : 3000 } { "_id" : ObjectId("4f69766ea84ad157af92c6af"), "name" : "user4", "point" : 4000 } { "_id" : ObjectId("4f69766ea84ad157af92c6b0"), "name" : "user5", "point" : 5000 }
ソート(降順)
> db.example.find().sort({point:-1}) { "_id" : ObjectId("4f69766ea84ad157af92c6b0"), "name" : "user5", "point" : 5000 } { "_id" : ObjectId("4f69766ea84ad157af92c6af"), "name" : "user4", "point" : 4000 } { "_id" : ObjectId("4f69766ea84ad157af92c6ae"), "name" : "user3", "point" : 3000 } { "_id" : ObjectId("4f69766ea84ad157af92c6ad"), "name" : "user2", "point" : 2000 } { "_id" : ObjectId("4f69766ea84ad157af92c6ac"), "name" : "user1", "point" : 1000 } { "_id" : ObjectId("4f69766ea84ad157af92c6ab"), "name" : "user0", "point" : 0 }
リミット
>db.example.find().limit(2) { "_id" : ObjectId("4f69766ea84ad157af92c6ab"), "name" : "user0", "point" : 0 } { "_id" : ObjectId("4f69766ea84ad157af92c6ac"), "name" : "user1", "point" : 1000 }
オフセット
> db.example.find().skip(4) { "_id" : ObjectId("4f69766ea84ad157af92c6af"), "name" : "user4", "point" : 4000 } { "_id" : ObjectId("4f69766ea84ad157af92c6b0"), "name" : "user5", "point" : 5000 }
リミット&オフセット(ページング)
> db.example.find().skip(2).limit(2) { "_id" : ObjectId("4f69766ea84ad157af92c6ad"), "name" : "user2", "point" : 2000 } { "_id" : ObjectId("4f69766ea84ad157af92c6ae"), "name" : "user3", "point" : 3000 }
条件演算子(条件演算子一覧はここ)
> db.example.find({point:{$gte:3000}}) { "_id" : ObjectId("4f69766ea84ad157af92c6ae"), "name" : "user3", "point" : 3000 } { "_id" : ObjectId("4f69766ea84ad157af92c6af"), "name" : "user4", "point" : 4000 } { "_id" : ObjectId("4f69766ea84ad157af92c6b0"), "name" : "user5", "point" : 5000 }
カーソル
> var cursor = db.example.find(); > cursor.hasNext() true > cursor.next() { "_id" : ObjectId("4f69766ea84ad157af92c6ab"), "name" : "user0", "point" : 0 } >while (cursor.hasNext()){printjson(cursor.next());} { "_id" : ObjectId("4f69766ea84ad157af92c6ac"), "name" : "user1", "point" : 1000 } { "_id" : ObjectId("4f69766ea84ad157af92c6ad"), "name" : "user2", "point" : 2000 } { "_id" : ObjectId("4f69766ea84ad157af92c6ae"), "name" : "user3", "point" : 3000 } { "_id" : ObjectId("4f69766ea84ad157af92c6af"), "name" : "user4", "point" : 4000 } { "_id" : ObjectId("4f69766ea84ad157af92c6b0"), "name" : "user5", "point" : 5000 }
まとめ
MongoDBのクエリー単純で簡単。
かねこ(~_~)
2012年3月22日木曜日
MongoDB(2) はろーわーるど
つづき。MongoDBをつかってみます。
mongoシェルログイン
testデータベース(?)にログインしたっぽい。
create tableどーやるんだ。
ヘルプで確認。
create table ない。
もういっこのヘルプ参照
みつからず。
mycollってのはコレクションのことっぽい。
ていうか、もしかして、
スキーマレスってそういうことかー。 すごい。
カオス!
おもしろい!
まとめ
MongoDBはFacebookのデータ構造に近い。
かねこ(*´σ`)
mongoシェルログイン
> mongo MongoDB shell version: 2.0.3 connecting to: test >
testデータベース(?)にログインしたっぽい。
create tableどーやるんだ。
ヘルプで確認。
> help db.help() help on db methods db.mycoll.help() help on collection methods rs.help() help on replica set methods help admin administrative help help connect connecting to a db help help keys key shortcuts help misc misc things to know help mr mapreduce show dbs show database names show collections show collections in current database show users show users in current database show profile show most recent system.profile .... show logs show the accessible logger names show log [name] prints out the last segment of log in .... useset current database db.foo.find() list objects in collection foo db.foo.find( { a : 1 } ) list objects in foo where a == 1 it result of the last line evaluated; use to further iterate DBQuery.shellBatchSize = x set default number of items to.... exit quit the mongo shell
create table ない。
もういっこのヘルプ参照
>db.mycoll.help() DBCollection help db.mycoll.find().help() - show DBCursor help db.mycoll.count() db.mycoll.dataSize() db.mycoll.distinct( key ) - eg. db.mycoll.distinct( 'x' ) db.mycoll.drop() drop the collection db.mycoll.dropIndex(name) db.mycoll.dropIndexes() db.mycoll.ensureIndex(keypattern[,options]) - options is an object withthese .... db.mycoll.reIndex() db.mycoll.find([query],[fields]) - query is an optional query filter. fields is op.... db.mycoll.find(...).count() db.mycoll.find(...).limit(n) db.mycoll.find(...).skip(n) db.mycoll.find(...).sort(...) db.mycoll.findOne([query]) db.mycoll.findAndModify( { update : ... , remove : bool [, query: {}, sort: {}, 'new': false] } ) db.mycoll.getDB() get DB object associated with collection db.mycoll.getIndexes() db.mycoll.group( { key : ..., initial: ..., reduce : ...[, cond: ...] }) db.mycoll.mapReduce( mapFunction , reduceFunction ,) db.mycoll.remove(query) db.mycoll.renameCollection( newName , ) renames the collection. db.mycoll.runCommand( name , ) runs a db command with the gi.... db.mycoll.save(obj) db.mycoll.stats() db.mycoll.storageSize() - includes free space allocated to this collection db.mycoll.totalIndexSize() - size in bytes of all the indexes db.mycoll.totalSize() - storage allocated for all data and indexes db.mycoll.update(query, object[, upsert_bool, multi_bool]) db.mycoll.validate( ) - SLOW db.mycoll.getShardVersion() - only for use with sharding db.mycoll.getShardDistribution() - prints statistics about data distribution in the cluster
みつからず。
mycollってのはコレクションのことっぽい。
ていうか、もしかして、
>db.example.save({name:'myname'}) >db.example.find(); { "_id" : ObjectId("4f69656db3855bee2fdca9f2"), "name" : "myname" }
スキーマレスってそういうことかー。 すごい。
>db.example.save({age: 50}) >db.example.find() { "_id" : ObjectId("4f69656db3855bee2fdca9f2"), "name" : "myname" } { "_id" : ObjectId("4f696610b3855bee2fdca9f3"), "age" : 50 }
カオス!
> db.example.find({age: 50}) { "_id" : ObjectId("4f696610b3855bee2fdca9f3"), "age" : 50 }
おもしろい!
まとめ
MongoDBはFacebookのデータ構造に近い。
かねこ(*´σ`)
2012年3月21日水曜日
MongoDB(1) 導入編
MongoDBやります。いい加減、やっとかないとまずい状況です。
特長
・ドキュメント志向(JSON)
・スキーマレス
・簡単なレプリケーション
・自動シャーディング
・高速
・トランザクション機能なし
とか。
とりあえず、環境準備めんどくさいからWindows環境(+XAMPP)で使えるようにしてみる。
どうせクロスプラットフォームだし。
1.ダウンロード
公式サイトよりダウンロード
2.展開と設置
展開して、置けばおしまい。
ディレクトリ構成例
3.きどう
コマンドプロンプトで、デーモン起動
ログを見ると、
4.PHPとの連携
続いて、PHPにドライバを設定してPHPと連携させてみる。
MongoDBネイティブドライバのインストール説明ページのとおり。
該当のdllダウンロードして、php.iniに設定。
まとめ
MongoDB超簡単。
かねこ( `д´)
特長
・ドキュメント志向(JSON)
・スキーマレス
・簡単なレプリケーション
・自動シャーディング
・高速
・トランザクション機能なし
とか。
とりあえず、環境準備めんどくさいからWindows環境(+XAMPP)で使えるようにしてみる。
どうせクロスプラットフォームだし。
1.ダウンロード
公式サイトよりダウンロード
2.展開と設置
展開して、置けばおしまい。
ディレクトリ構成例
D:\xampp\mongodb ┗bin ┗data ┗log
3.きどう
コマンドプロンプトで、デーモン起動
D:\xampp\mongodb\bin>mongod --logpath=D:\xampp\mongodb\log\mongodb_log.txt --dbpath=D:\xampp\mongodb\data
ログを見ると、
Mon Mar 19 17:18:58 Mon Mar 19 17:18:58 warning: 32-bit servers don't have journaling enabled by default. Please use --journal if you want durability. Mon Mar 19 17:18:58 Mon Mar 19 17:18:58 [initandlisten] MongoDB starting : pid=4688 port=27017 dbpath=D:\xampp\mongodb\data 32-bit host=e2info9 Mon Mar 19 17:18:58 [initandlisten] Mon Mar 19 17:18:58 [initandlisten] ** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data Mon Mar 19 17:18:58 [initandlisten] ** see http://blog.mongodb.org/post/137788967/32-bit-limitations Mon Mar 19 17:18:58 [initandlisten] ** with --journal, the limit is lower Mon Mar 19 17:18:58 [initandlisten] Mon Mar 19 17:18:58 [initandlisten] db version v2.0.3, pdfile version 4.5 Mon Mar 19 17:18:58 [initandlisten] git version: 05bb8aa793660af8fce7e36b510ad48c27439697 Mon Mar 19 17:18:58 [initandlisten] build info: windows sys.getwindowsversion(major=6, minor=0, build=6002, platform=2, service_pack='Service Pack 2') BOOST_LIB_VERSION=1_42 Mon Mar 19 17:18:58 [initandlisten] options: { dbpath: "D:\xampp\mongodb\data", logpath: "D:\xampp\mongodb\log\mongodb_log.txt" } Mon Mar 19 17:18:59 [initandlisten] waiting for connections on port 27017 Mon Mar 19 17:18:59 [websvr] admin web console waiting for connections on port 28017 Mon Mar 19 17:19:59 [clientcursormon] mem (MB) res:14 virt:44 mapped:0 Mon Mar 19 17:19:59 [PeriodicTask::Runner] task: WriteBackManager::cleaner took: 31ms
ちゃんと動いてるっぽい(64bit推奨)。
27017が標準ポート。
Windowsのサービスとして登録する場合は、「--install」
以上。
27017が標準ポート。
Windowsのサービスとして登録する場合は、「--install」
D:\xampp\mongodb\bin>mongod --install --logpath=D:\xampp\mongodb\log\mongodb_log.txt --dbpath=D:\xampp\mongodb\data
以上。
MongoDBの導入超簡単。
4.PHPとの連携
続いて、PHPにドライバを設定してPHPと連携させてみる。
MongoDBネイティブドライバのインストール説明ページのとおり。
該当のdllダウンロードして、php.iniに設定。
extension=php_mongo.dll
以上。
MongoDBドライバの導入も超簡単。
まとめ
MongoDB超簡単。
2012年1月27日金曜日
vs Travis CI
CIサーバの用意めんどくさいから、オンラインのJenkinsあったらいいのになーと思っていたら、githubのリポジトリをそのまま使える、Travis CIというCIをみつけました。
とりあえずgithubのOAuthでログインして雰囲気をみて終了。
で、その後ちょっとだけコードかいたりしていたら、gmailにメールがいっぱい!!!
どうやらいつのまにか、自分のリポジトリをCI対象にしていたようだ。
ということで、せっかくなのでStill Failingを解決してずっと使えるようにしようと思います。
まず調査。
Rubyでテストしようとしてる(笑)
.travis.ymlをリポジトリルートにおいてPHPを指定しないといけないらしい。 ということで、追加。
.travis.yml
できた。
CakePHPの場合、通常はphpunitコマンドじゃなくてcakeコマンドでテスト実行するので、スクリプトを.travis.ymlに追加してみる。
.travis.yml
パーミッションあるのか。
.travis.yml
テスト用データベースに接続できなかった。
作る。
.travis.yml
そういえば、コンフィグファイルなかった。
.travis.yml
グリーン!!やったね!
SCMもCIもクラウドの時代ですよ、というわけで、おやすみなさい。
かねこ(^ν^)
とりあえずgithubのOAuthでログインして雰囲気をみて終了。
で、その後ちょっとだけコードかいたりしていたら、gmailにメールがいっぱい!!!
どうやらいつのまにか、自分のリポジトリをCI対象にしていたようだ。
ということで、せっかくなのでStill Failingを解決してずっと使えるようにしようと思います。
まず調査。
1Using worker: ruby2.worker.travis-ci.org:travis-ruby-63$ cd ~/builds4$ git clone --depth=100 --quiet git://github.com/e2kaneko/SocialLoginExamples.git e2kaneko/SocialLoginExamples5$ cd e2kaneko/SocialLoginExamples6$ git checkout -qf 4bea04f3da2290593d511804e3274821429835c17$ export TRAVIS_RUBY_VERSION=default8$ rvm use default9Using /home/vagrant/.rvm/gems/ruby-1.8.7-p35710$ ruby --version11ruby 1.8.7 (2011-12-28 patchlevel 357) [i686-linux]12$ gem --version131.8.1514$ rake15rake aborted!
Rubyでテストしようとしてる(笑)
.travis.ymlをリポジトリルートにおいてPHPを指定しないといけないらしい。 ということで、追加。
.travis.yml
language: php
php:
- 5.3
- 5.4
php:
- 5.3
- 5.4
Using worker: php1.worker.travis-ci.org:travis-php-13$ cd ~/builds4$ git clone --depth=100 --quiet git://github.com/e2kaneko/SocialLoginExamples.git e2kaneko/SocialLoginExamples5$ cd e2kaneko/SocialLoginExamples6$ git checkout -qf 479e254740fa4be905cfbc392eb640aa27044dfa7$ phpenv global 5.38$ php --version9PHP 5.3.9 (cli) (built: Jan 22 2012 13:00:07)10Copyright (c) 1997-2012 The PHP Group11Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies12 with Xdebug v2.1.2, Copyright (c) 2002-2011, by Derick Rethans13$ phpunit14PHPUnit 3.6.8 by Sebastian Bergmann.16Usage: phpunit [switches] UnitTest [UnitTest.php]17 phpunit [switches] <directory>
できた。
CakePHPの場合、通常はphpunitコマンドじゃなくてcakeコマンドでテスト実行するので、スクリプトを.travis.ymlに追加してみる。
.travis.yml
language: php
php:
- 5.3
- 5.4
script:
- ./lib/Cake/Console/cake testsuite app AllTests --stderr
php:
- 5.3
- 5.4
script:
- ./lib/Cake/Console/cake testsuite app AllTests --stderr
19$ ./lib/Cake/Console/cake testsuite core AllTests --stderr20-bash: ./lib/Cake/Console/cake: Permission denied
パーミッションあるのか。
.travis.yml
language: php
php:
- 5.3
- 5.4
before_script:
- chmod -R 777 ./lib/Cake/Console/cake
script:
- ./lib/Cake/Console/cake testsuite app AllTests --stderr
php:
- 5.3
- 5.4
before_script:
- chmod -R 777 ./lib/Cake/Console/cake
script:
- ./lib/Cake/Console/cake testsuite app AllTests --stderr
19Welcome to CakePHP v2.0.4 Console20---------------------------------------------------------------21App : app22Path: /home/vagrant/builds/e2kaneko/SocialLoginExamples/app/23---------------------------------------------------------------24CakePHP Test Shell25---------------------------------------------------------------26Error: Database connection "SQLSTATE[42000] [1049] Unknown database 'test'" is missing, or could not be created.27#0
テスト用データベースに接続できなかった。
作る。
.travis.yml
language: php
php:
- 5.3
- 5.4
env:
- DB=mysql
before_script:
- sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'CREATE DATABASE test;'; fi"
- chmod -R 777 ./lib/Cake/Console/cake
script:
- ./lib/Cake/Console/cake testsuite app AllTests --stderr
php:
- 5.3
- 5.4
env:
- DB=mysql
before_script:
- sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'CREATE DATABASE test;'; fi"
- chmod -R 777 ./lib/Cake/Console/cake
script:
- ./lib/Cake/Console/cake testsuite app AllTests --stderr
13$ phpunit14PHP Notice: Undefined offset: 0 in /home/vagrant/.phpenv/versions/5.3.9/share/pyrus/.pear/php/PHPUnit/Util/Configuration.php on line 86015PHP Stack trace:
そういえば、コンフィグファイルなかった。
.travis.yml
language: php
php:
- 5.3
- 5.4
env:
- DB=mysql
before_script:
- sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'CREATE DATABASE test;'; fi"
- chmod -R 777 ./lib/Cake/Console/cake
- cp ./app/Config/const.php.default ./app/Config/const.php
script:
- ./lib/Cake/Console/cake testsuite app AllTests --stderr
php:
- 5.3
- 5.4
env:
- DB=mysql
before_script:
- sh -c "if [ '$DB' = 'mysql' ]; then mysql -e 'CREATE DATABASE test;'; fi"
- chmod -R 777 ./lib/Cake/Console/cake
- cp ./app/Config/const.php.default ./app/Config/const.php
script:
- ./lib/Cake/Console/cake testsuite app AllTests --stderr
グリーン!!やったね!
SCMもCIもクラウドの時代ですよ、というわけで、おやすみなさい。
かねこ(^ν^)
登録:
投稿 (Atom)