セキュリティと認証 : MongoDB

2009-07-26 16:55 JST @sadayuki

Admin Zone の第十弾。セキュリティと認証

* セキュリティと認証

** セキュリティなしでの稼働

信頼された環境で、セキュリティと認証無しで、MongoDB を走らせるのは有効な方法のひとつだ。これはデフォルトのオプションであり推奨される。もちろん、このような設定の中では、信頼されたマシンからデータベースの TCP ポートへアクセスするべきである。

** Mongo セキュリティ

現在のバージョンの Mongo では、基本的なセキュリティのみ提供している。特定のデータベースの文脈においてユーザ名とパスワードで認証する。一度認証されると、ユーザは問題のデータベースへの読み書きのフルアクセスが可能だ。

admin データベースは特別である。admin データベースでに認証は、admin データベースでの管理的なコマンドの実行に加えて、そのサーバ上の全てのデータベースへの読み書きの権限を与える。事実上、admin へのアクセスは、サーバプロセスへの root アクセスを意味する。

mongod プロセスの起動時に --auth を付けることによりセキュリティを有効化する。

** セキュリティと認証の設定

認証情報は、個々のデータベースの system.users コレクションに格納される。例えば、データベース projectx の場合、projectx.system.users コレクションがユーザ情報を格納する。

最初に、データベースプロセス全体の管理者ユーザの設定をすべきである。このユーザは、admin という特別なデータベースに格納される。

admin.system.users コレクションにユーザ情報が無い場合、ローカルホストからは認証なしでアクセスできる。そのため、データベースの稼働するサーバから、管理者ユーザの設定をするためにデータベースシェルを実行する。


$ ./mongo
> use admin
> db.addUser("theadmin", "anadminpassword")

これで admin データベースにユーザが作成された。事前に認証されていない場合、これ以上の操作のためには、認証が必要であることに注意する。


> db.auth("theadmin", "anadminpassword")

admin 以外のデータベースのための普通のユーザを設定する。


> use projectx
> db.addUser("joe", "passwordForJoe")

** パスワードの変更

データベースシェルの addUser コマンドは、パスワードの変更にも使える。ユーザが既に存在する場合、パスワードが変更される。

多くの Mongo ドライバは、データベースシェルの addUser コマンドと同等の機能を提供している。

** ユーザの削除

ユーザの削除は下記の通り。


db.system.users.remove( { name: username } )

amazon_img "情報処理教科書 情報セキュリティスペシャリスト 2009年度版" (上原 孝之)

単純にユーザ名とパスワードの組み合わせで認証するので、格納方法に工夫が必要と思います。UNIX の /etc/passwd のように、暗号化したパスワードを格納すれば結構良いかな。ただし、パスワードの暗号化の責務を、ドライバが担うのか、アプリケーションが担うのか、少し悩みますね。と、思って Ruby ドライバを見たら、ドライバが暗号化してるようです。


# File lib/mongo/db.rb, line 157
        def authenticate(username, password)
          doc = db_command(:getnonce => 1)
          raise "error retrieving nonce: #{doc}" unless ok?(doc)
          nonce = doc['nonce']

          auth = OrderedHash.new
          auth['authenticate'] = 1
          auth['user'] = username
          auth['nonce'] = nonce
          auth['key'] = Digest::MD5.hexdigest("#{nonce}#{username}#{hash_password(username, password)}")
          ok?(db_command(auth))
        end

でも何か違う気もします。Admin Zone は終わりにして、今度は Developer Zone ですかね。

s セキュリティと認証-mongodb

f markdown

u d7cc75de-e208-4301-a178-a51985d764c8

マスタ - マスタ レプリケーション : MongoDB

2009-07-26 15:20 JST @sadayuki

Admin Zone の第九弾。マスタ - マスタ レプリケーションレプリケーションの続き。

* マスタ - マスタ レプリケーション

Mongo は、フル機能のマスタ - マスタ レプリケーションは提供していない。しかしながら、ある制限された局面ではマスタ - マスタ レプリケーションが利用できる。一般的に、マスタ - マスタ レプリケーションは推奨しない。

マスタ - マスタ は、結局のところ整合性の確保です。

マスタ - マスタを定義するには、単純に双方のデータベースを --master--slave パラメータ付きで起動します。例として、テストのため単独のサーバで起動する定義を示します。


$ nohup mongod --dbpath /data1/db --port 27017 --master --slave --source localhost:27018 > /tmp/dblog1 &  
$ nohup mongod --dbpath /data2/db --port 27018 --master --slave --source localhost:27017 > /tmp/dblog2 &  

このモードは下記の場合に安全です。

  • 挿入する個々のオブジェクトにユニークな _id が存在する
  • _id による削除
  • 全ての検索

マスタ - マスタ は下記の場合に使用できない。

  • 単一のオブジェクトに対してほぼ同時に更新が発生する

マスタ - マスタは十分テストできていないため実験的機能と考えられる。

s マスタ-マスタ-レプリケーション-mongodb

f markdown

u 5ffd0fe6-b001-4018-a4f6-e2d8a76985c8

レプリカ ペア : MongoDB

2009-07-26 14:52 JST @sadayuki

Admin Zone の第八弾。レプリカ ペアレプリケーションの続き。

* レプリカ ペア

** レプリカ ペアの準備

MongoDB はレプリカ ペアのコンセプトをサポートしている。ある時点でマスタである、スレイブであるデータベースが自動的に連携する。

起動時に、データベースは、どれがマスタでどれがスレイブであるか協議する。ひとつのデータベースサーバの停止時に、その他のデータベースサーバは自動的に引き継ぎ、その時点からマスタになる。将来の障害時には、マスタは別のデータベースに引き継がれる。データベースの管理はそれらの内部で行われる。

Note: 一般的に、個々のペアのメンバーは、空の /data/db ディレクトリで開始する。既に存在するデータベースについては、下記を参照すること

ペアのデータベースを起動するには、個々に下記の通り起動させる


$ ./mongod --pairwith  --arbiter 

remoteserver はペアを構成する他のサーバのホスト名。ホスト名に :port を追加することによりデフォルト以外のポートを利用できる

  • arbiterserver調停者 のホスト名(とポート名)。調停者は、ある時点でのマスタを決めるのを補助する MongoDB サーバである。調停者を他のマシンで稼働させる場合、ペアのメンバーが個々に接続できなくても効果的にマスタを決定できる。--arbiter オプションを指定せず、調停者なしで稼働させることも出来る。この場合、ネットワークが双方のサーバが隔てている場合、双方のサーバが自身をマスタであると見なす。

どのデータベースがマスタであるかをチェックできる。


$ ./mongo  
> db.$cmd.findOne({ismaster:1});  
{ "ismaster" : 0.0 , "remote" : "192.168.58.1:30001" , "ok" : 1.0  }  

Note: セキュリティ機能が有効な場合、リモートは、admin データベースへの接続が認証済みが否かのみ返す)
しかしながら、Mongo ドライバは通常この機能をサポートする。

** 整合性

ペアのメンバーは、最終的にはファイルオーバーにより整合している。マシン L がペアのマスタである時に故障した場合、最後の数秒の操作は R に及ばない。L が後に回復するまで、これらの操作は R のデータベースに反映されない。

** セキュリティ

セキュリティ機能が有効化されている場合の例を示す。


$ ./mongo /admin -u  -p  
> use local  
> db.addUser('repl', );  
^c  
$ ./mongo /admin -u  -p  
> use local  
> db.addUser('repl', );  

** レプリカ ペア サーバの交換

Mongo レプリカ ペア のひとつのサーバが故障した場合、システムが自動的に回復するには、故障したサーバがオンラインに戻る必要がある。しかしながら、マシンが完全に壊れた場合、サーバの交換が必要になる。そして交換されたサーバはデータを保持していない。これから述べる手順は、ペアの片方を交換する手順である。

(n1, n2) というペアの n2 が壊れたため、(n1, n3) というペアに切り替えることを想定する。

  • 故障した n2 はオフラインにする。

  • n1 に対し、n2 に代わって n3 とペアを組むように知らせる必要がある。これには、replacepeer コマンドを使う。成功したか否かチェックするために戻り値を確認する。


n1> ./mongo n1/admin  
`>` db.$cmd.findOne({replacepeer:1});  
{  
    "info" : "adjust local.sources hostname; db restart now required" ,  
    "ok" : 1.0  
}  

  この時点では、n1 は稼働しているが、リセットされたことと、将来に n3 と会話することを混同してはならない。サーバは稼働しているが、レプリケーションは無効になっている。

n3 と会話するように n1 を再起動する。


n1> ./mongod --pairwith n3 --arbiter 

n1 とペアを組むように n3 を起動する。


n3> ./mongod --pairwith n1 --arbiter 

  n3 は、n1 と完全に同期するまでマスタとしての操作を受け付けられないことに注意。また、n1 に大量のデータがある場合、この同期には時間が掛かる。

** スレーブへの要求

スレイブ OK フラグをセットしている場合、スレイブに要求できる。


db.getMongo().setSlaveOk()

** 既存のペアになっていないデータベースとの作業

独立したデータベースとして作成された既存データベースをペアとして最初に有効化する際に注意が必要である。ペアを起動するためには次の操作を行う。二つのサーバを "レフト" と "ライト" と呼ぶことにする。

  • 双方のサーバで mongod プロセスが起動していないことを確認する。
  • サーバ "レフト" にデータが存在するとする。"レフト" のデータディレクトリ ( デフォルトは /data/db ) に local.* データファイルが存在しないことを確認する。存在する場合は削除する。
  • サーバ "ライト" のデータディレクトリ ( デフォルトは /data/db ) にデータファイルが存在しないことを確認する。
  • "レフト" を起動する。適切なコマンド ライン オプション --pairwith を含むこと。
  • "ライト" を起動する。

ペアとしての起動時に "レフト" "ライト" の双方のデータディレクトリにデータファイルが存在する場合、エラーが発生する。さらに、ペアの起動時に local データベース ( レプリケーションのメタデータを格納している ) は必要ない。

amazon_img "侘助ノ白―居眠り磐音 江戸双紙〈30〉 (双葉文庫)" (佐伯 泰英)

"ペア" と書いてあるのだが、ふたつでなくても良いとも書いてある(気がする)。これも実地で試す必要がある。恐らく、最初は本当に "ペア" だったのが、機能強化でふたつ以上のサーバの同期ができるようになったのだと思う。ドキュメントが追いついてないだけではないだろうか。この訳文も恐らく原文の更新に追従できないだろう。Wiki にでもしないとね。

s レプリカ-ペア-mongodb

f markdown

u 18535698-afad-47e7-942a-e5f310e3eef8

マスタ スレイブ : MongoDB

2009-07-26 11:47 JST @sadayuki

Admin Zone の第七弾。マスタ スレイブレプリケーションの続き。

* マスタ - スレイブ の手動設定

マスタ - スレイブ設定のマスタデータベースの設定をするには、二つのインスタンスの設定を始める必要がある。ひとつはマスタ、ひとつはスレイブである。

データストレージ 下記の例では、コマンドラインでデータファイルの格納場所を指定している。これは、マスタとスレイブを異なるホストで稼働させているなら必要ではない。しかし、ひとつのホスト上でセットアップしようとする場合、安全のため必要である。


$ bin/mongod --master [--dbpath /data/masterdb/]

この結果、マスタ サーバ プロセスが local.oplog.$main コレクションを生成する。これは、スレイブに適用するべき操作を一時的に格納する、いわば "トランザクションログ" である。

マスタ - スレイブ設定におけるスレイブ データベースの設定をするには、下記のようにする。


$ bin/mongod --slave --source [:]  [--dbpath /data/slavedb/]

マスタ サーバの詳細は、スレイブの local.sources コレクションに格納される。--source パラメタで指定する代わりに、マスタ サーバの情報を local.sources に追加することが出来る。


$ bin/mongo /local  
> db.sources.find(); // コレクションが空であることを確認し次を実行  
> db.sources.save( { host:  } );  
  • host: masterhostname はマスタ サーバの IP アドレスか FQDN。デフォルトのポート以外で稼働させる場合は port を追加する
  • only: databasename (任意) が指定された場合、指定されたデータベースのみがレプリケートされる

ひとつのスレイブは複数のマスタを持てる。その場合、local.sources へ複数のオブジェクトを追加する。

ひとつのサーバは、同時にマスタでもありスレイブでもあることが出来る。

スレイブはマスタとの同期から外れることがある。マスタからのデータを更新するのがかなり遅れてしまう場合、スレイブが停止し再起動するまでの間にマスタからの更新データが利用できなくなった場合である。スレイブが同期から外れると、レプリケーションは停止し、レプリケーションの再開にはオペレータの介入が必要になる。オペレータは {resync:1} コマンドを用いてレプリケーションの再開を行える。もしくは、コマンドラインオプションの --autoresync を用いて、同期が停止した際にスレーブに対して自動的なレプリケーションの再開をするよう指示する。--autoresync オプションが指定された場合、スレイブは、10 分間に 1 度だけレプリケーションの再開を自動的に試行する。

--oplogSize コマンド ライン オプションは、( --master オプションと共に ) メガバイト単位で、スレイブが利用出来るように更新情報を記録するためのディスク使用量を指定する。--oplogSize コマンド ライン オプションが指定されなかった場合、更新情報のディスク容量は、64 ビット機の場合は最大 1 ギガバイトで利用可能なディスク容量の 5% 、32 ビット機の場合は 50 メガバイトとなる。

* セキュリティ

セキュリティの設定例を示す。


$ dbshell /admin -u  -p
> use local
> db.addUser('repl', );
^c
$ dbshell /admin -u  -p
> use local
> db.addUser('repl', );

amazon_img "戦闘妖精・雪風(改) (ハヤカワ文庫JA)" (神林 長平)

今朝の新聞を見ていたら、戦闘妖精・雪風の第三部が出ていた。知らなかった。早速注文したが暫くは来ないようだ。(改)も読みたいと思っているが、手元に旧版があるので億劫。あとで古本でも買うか?

s マスタ-スレイブ-mongodb

f markdown

u eb5e5f3f-3628-4194-bd76-c1064f8c8489

レプリケーション : MongoDB

2009-07-25 18:44 JST @sadayuki

Admin Zone の第六弾。レプリケーション

* レプリケーション

MongoDB はサーバ間のデータのレプリケーションをサポートしている。

このレプリケーションは、マスタ - スレイブ 設定の強化されたものである。これは、在る時点で、書き込みという面でアクティブなサーバ(マスタ)はひとつであることを意味する。レプリケーションの第一の目標はフェイルオーバーと冗長性の確保である。

MongoDB は二つの形式のレプリケーションをサポートする。単純なマスタ - スレイブ 設定と、レプリカペア コンセプトである。詳細については下記のページを参照願いたい。

** セキュリティ

セキュリティを有効化した場合、双方のサーバ上のデータベースに共通のユーザアカウントがひとつ必要である。

レプレケーション接続のスレーブ側では、最初にデータベース local.system.users のユーザ repl を探す。もし、ユーザ repl が存在すれば、そのユーザがレプレケーション接続のサーバ側のローカルデータベースの認証に用いられる。もし、ユーザ repl が存在しなければ、local.system.users の最初のユーザが利用される。

local データベースは admin データベースのように働く。local に対するアカウントは、サーバ全体のアクセスに用いられる。

** 診断

マスタの状況は、mongo シェル上で下記のコマンドを実行することで確認できる。


use local  
db.getReplicationInfo()  

amazon_img "エンタープライズ Rails" (Dan Chak)

セキュリティの節の記述は良くわからない。元々のセキュリティ機能が良くわかってないのが大きな原因である。実地で試してみる必要があると思うのだが、どうもやる気が起きない。後でやりたい。

s レプリケーション-mongodb

f markdown

u 718a3510-1534-4b95-b137-271a9b1cf990

コードギアス 反逆のルルーシュ R2 SPECIAL EDITION ‘ZERO REQUIEM’

2009-07-25 01:16 JST @sadayuki

衝動的に予約したんだけど、ちょっと失敗したかも。

まず言えるのは、テレビシリーズを見た人でないとストーリーが把握できないということ。まあ、これは総集編の宿命なので、仕方が無い。次に、エンディングが変わっている。これは痛い。個人的には、オリジナルのエンディングの、カレンの独白と C.C. の笑顔が凄く良かったのだが。なんで変えたんだろう。オリジナルを収録するとかしてくれれば、変更しても文句は無いのだが、何も無いのはちょっとね。変更後のノンテロップ版を付録に付けるなら、オリジナルも付けて欲しかったかな。

まあ、BLACK REBELLION と合わせて資料的な価値があるということで良しとしたい。

amazon_img

"コードギアス 反逆のルルーシュ R2 SPECIAL EDITION ‘ZERO REQUIEM’ [DVD]" (谷口悟朗)

s コードギアス-反逆のルルーシュ-r2-special-edition-‘zero-requiem’

f markdown

u 29f6da69-b174-4cf8-a4ed-2410668994f2

アルセウス超克の時空へ

2009-07-24 00:03 JST @sadayuki

今日は三男の看病を妻に任せて、次男と映画を見に行ってきました。行き先は毎度お馴染みのコクーン新都心にある MOVIX さいたま です。掛かっているのはポケモン映画のアルセウス超克の時空へです。

最近やっとプラチナを買った次男は、映画よりもアルセウスがゲットできることの方に意味があるのではないかと勘ぐってしまう程アルセウスのゲットに拘っていました。まあ、劇中のアルセウスは超強力で、どんなバトルでも勝てそうな感じ。劇中では、ダイヤモンド・パール三部作に登場したパルキア、ディアルガ、ギラティナという神と呼ばれしポケモンたちが束になっても勝てないほど。

そんな強力なポケモンを入れたらゲームバランスが無茶苦茶だよな、と心配していたのですが、ゲットしてみると心配無用なことが判明。たしかにスペック的には超強力なのですが、いつも寝ていて命令を聞かないので次男曰く「ポッチャマより使えない」とのこと。まあ、コレクションですね。

映画の後はいつもの ぶぶか でラーメンを食べて帰宅しました。

amazon_img

"レゴ シティ 白バイパトロール 7235" (レゴ)

今回のお土産は白バイでした。

s アルセウス超克の時空へ

f markdown

u 7997daf2-9c38-44d3-a118-080d0089ce28

男脳女脳診断

2009-07-23 08:50 JST @sadayuki

via V.J.Catkick@

面白そうなのでやってみました。

男脳女脳診断

あなたのポイントは -10ポイントです。 (男脳度数:55%/女脳度数:45%)

・ポイントは、-100〜100ポイントで計算され、マイナスが大きいほど、男性脳で、それに対し、プラスが大きいほど、女性脳となります。

オーバーラップ あなたは、極端な考え方をせず中性的な考え方を持っており、融通が利くため、問題解決の時とても役に立ちます。冷静で論理的に物事を考える男性的な部分と、感情豊かにコミニュケーションをとれる女性的な部分を、両方持っており、また、考え方が理解できるため、異性、同姓を問わず、たくさんの友達ができます。ただし、恋愛に関してはポリシーをもって友達で終わらないように注意しましょう。 From: 男脳女脳診断 − 憩いの広場

若干、男性脳に偏っていますがバランス型のようです。私の場合、××診断というとこんなのが多いです。血液型うらないとか。ちなみに AB 型です。同じような診断が重なると、なんかそうかなという気がしてきてしまい、危ない感じです。この危なさを感じるところが上記診断に繋がるのかとも思います。なんか微妙です。

s 男脳女脳診断

f markdown

u c59ca935-4eee-497b-b553-88d3f237d4b7

インポート エクスポート ツール : MongoDB

2009-07-21 23:13 JST @sadayuki

Admin Zone の第五弾。インポート エクスポート ツール

インポート エクスポート ツール

mongoimportjson

このユーティリティは、ひとつのファイルを引数に取り、その内容を取り込む。そのファイルは、1 行に 1 つの JSON 文字列を含む。オプションによりデータベースとコレクションを指定する必要がある。


importjson options:  
  --help                  ヘルプを表示する  
  -h [ --host ] arg       接続先のホスト  
  -d [ --db ] arg         利用するデータベース  
  -c [ --collection ] arg 利用するコレクション (some commands)  
  --dbpath arg            mongod のインスタンスにアクセする代わりに   
                          データファイルに直接アクセスする  
  --file arg              インポートするファイル  
  --idbefore              インポートする前に id に係る索引を作成する  
  --id                    インポートした後に id に係る索引を作成する(推奨)   
  --drop                  最初にコレクションの削除を行う   

mongoexport

このユーティリティは、コレクションを引数に取り、JSON か CSV にエクスポートする。フィルターか出力対象の項目を指定できる。CSV を出力する場合、項目の出力順を指定する必要がある。


master erh@ERH-OFC-MP.local ~/work/mongo -> ./mongoexport -d test -c test1 --csv -f "name,num"  
connected to: 127.0.0.1  
name,num  
"sara",2  
"eliot",1  
"eliot",1  

エクスポート オプション:  
  --help                  ヘルプを表示する  
  -h [ --host ] arg       接続先のホスト  
  -d [ --db ] arg         利用するデータベース  
  -c [ --collection ] arg 利用するコレクション (some commands)  
  --dbpath arg            mongod のインスタンスにアクセする代わりに   
                          データファイルに直接アクセスする  
  -q [ --query ] arg      クエリ  
  -f [ --fields ] arg     CSV の項目名 例. -f=name,age   
  --csv                   CSV でエクスポートする  
  -o [ --out ] arg        出力ファイル。指定しない場合は標準出力  

mongodump

このユーティリティはデータベース引数に取り、データベースのバイナリ表現を出力する。このユーティリティは、通常、データベースの稼働中のバックアップを作成するのに用いられる。


ダンプ オプション:  
  --help                  ヘルプを表示する  
  -h [ --host ] arg       接続先のホスト  
  -d [ --db ] arg         利用するデータベース  
  -c [ --collection ] arg 利用するコレクション (some commands)  
  --dbpath arg            mongod のインスタンスにアクセする代わりに   
                          データファイルに直接アクセスする  
  -o [ --out ] arg        出力ディレクトリ  

mongorestore

このユーティリティは、mongodump の出力ファイルを引数に取り、リストアする。


リストア オプション:  
  --help                  ヘルプを表示する  
  -h [ --host ] arg       接続先のホスト  
  -d [ --db ] arg         利用するデータベース  
  -c [ --collection ] arg 利用するコレクション (some commands)  
  --dbpath arg            mongod のインスタンスにアクセする代わりに   
                          データファイルに直接アクセスする  
  --dir arg               ダンプファイルの格納されているディレクトリ  




p style="text-align:left"> amazon_img

"TOSHIBA ポータロウ 7V型ワイドポータブルDVDプレーヤー SD-P73SR バーガンディレッド" (東芝)

子供の入院用に購入しました。「連続 5 時間再生バッテリー」と店頭価格の安さが決め手でした。まあ、その電気屋での最安値なので、個人的には高いなぁという感じです。役に立つといいな。

s インポート-エクスポート-ツール-mongodb

f markdown

u 1e161a72-7cfb-4f8a-a98f-eac58aa03a8f

ファイルベースの設定 : MongoDB

2009-07-20 09:47 JST @sadayuki

Admin Zone の第四弾。ファイルベースの設定

ファイルベースの設定

コマンド ライン パラメータを受け付けるのに加えて、MongoDB は設定ファイルを用いた設定を行うことができる。設定ファイルは、コマンド ライン パラメータの -f--config を用いて指定する。下記の設定ファイルの例で、文法の使い方の実例を示す。


# これは MongoDB の設定ファイルの例です                                   
#                                                                               
# シャープ記号で始まる行はコメントです                                 
# オプションは大文字小文字を認識します                                                   
# オプション名に `=` で値を代入します                   
# 全てのコマンドラインオプションを受け付けます                                       
# 設定ファイルは mongod を起動する際に -f [ --config ] オプションで指定します          

dbpath = /var/lib/mongodb                                                       
bind_ip = 127.0.0.1                                                             
noauth = true # 'true' を使う場合は引数を取らない     





p style="text-align:left"> amazon_img

"ネットブック らくらくスタートパック -お役立ちソフト満載の1GB SDカード付き- (IJデジタルBOOK)" (水野 寛之)

今回は訳すに値するまでもない短さでした。上記は SD カードが付録に付くということで話題の書籍。うちにも 1 台ありますが、使い方が難しいです。やっぱりキーボードと画面が小さいのが難点。特に画面の縦方向が短いので、ダイアログがはみ出てしまったり。まあ、プリインストールのまま使えば問題は無いと思うのですが。

s ファイルベースの設定

f markdown

u 6ef98016-9ff3-4697-bb33-2a2aca8b77be

会津若松市が OpenOffice.org 導入の手引きを公開

2009-07-19 10:43 JST @sadayuki

会津若松市がまたやってくれた。

それにしても、表紙がすごく・・・オライリーです・・。 From: OpenOffice.org導入の会津若松市が、ノウハウをまとめCCで公開 - スラッシュドット・ジャパン

オープンオフィスにしませんか?と題してこれまでのノウハウをまとめてくれているのだが、/. の記事にあるように、表紙がとってもオライリーだ。こんな表紙を作ってしまうようなメンタリティが無いと、オープンソースソフトの導入推進は出来ないということなのかも知れない。これ、明らかに狙っているもんね。狙うには標的が分からないと狙えない。オライリーの動物シリーズの愛読者が何人かいるに違いない。また、こういった企画を通すだけの組織があると。なんか羨ましい気がする。

amazon_img

"初めてのPHP & MySQL 第2版" (Michele E. Davis, Jon A. Phillips)

なるべく似た物をと思ったのだが、良く似たものが無かった。まあ、あんまりそっくりは問題があるので良いのかな。

s 会津若松市が-openoffice-org-導入の手引きを公開

f markdown

u fdf595bb-e7ca-48c5-a880-8c44a420733f

コマンド ライン パラメータ : MongoDB

2009-07-18 20:36 JST @sadayuki

Admin Zone の第三弾はコマンド ライン パラメータ

コマンド ライン パラメータ

MongoDB は、ファイルベースの制御に加えて、コマンド ライン パラメータにより制御できる。サポートされているオプションについては、パラメータ無しで実行するか、-h [ --help ] パラメータを付けて実行することにより確認できる。


$ ./mongod -h 

れらのパラメータの利用法は、Mongo の起動と停止を参照のこと。

下記のオプションの一覧が全てではない。上記の記述を参照のこと。

基本的なオプション

--help全てのオプションを表示する。
-f [ --config ]コンフィグレーション ファイルを指定する。
--port <portno>クライアントからの接続を待ち受けるポートを指定する。デフォルトは 27017 。
--dbpath <path>データファイルの格納先を指定する。デフォルトは /data/db か c:\data\db\
--quietログの出力量を減らす。
--cpu定期的な CPU の使用量と I/O ウェイトのロギングを行う。
--noauthセキュリティを OFF にする。デフォルトは OFF 。
--authセキュリティを ON にする。
--verboseログ出力を冗長化する。
-vvログ出力をより冗長化する。(-v = --verbose)
--objcheck全てのクライアントから受け取ったデータの妥当を検査する。
--quotadb の容量管理を有効化する。
--oplog<n>操作ログの出力レベルを設定する。0=オフ ( デフォルト )、1=書き込み 、2=読み出し 、3=両方 、7=書き込みといくつかの読み出し
--oplogSize <:メガバイトによるログサイズ>レプレケーション操作のログサイズ。
--nocursors診断 / デバッッグ オプション。
--noscriptingサーバ サイド スクリプティンのオフ。大幅に機能が制限される。

レプレケーション オプション

--masterマスタ-スレイブ ペアのマスタに指定する。
--slaveマスタ-スレイブ ペアのスレイブに指定する。
--source <server:port>スレイブ インスタンスのソース(マスタ)を指定する。

s コマンド-ライン-パラメータ

f markdown

u be1b59d8-7a01-451e-b071-a637a1c0d04a

Mongo の起動と停止

2009-07-18 17:49 JST @sadayuki

Admin Zone の第二弾は起動と停止

Mongo の起動と停止

Mongo はコマンドラインから通常のプログラムとして起動する。オプションについてのより詳細な情報は コマンド ライン パラメータ を参照のこと。ここでは一般的な利用法における起動方法について述べる。

後続の例は、Mongo の起動可能コマンドと同じディレクトリにおり、Mongo の起動コマンドを db と呼ぶと想定する。

Mongo の起動

デフォルトのデータディレクトリとポート

Mongo をデフォルトで起動すると、データは /data/db/ ディレクトリに格納され、ポート 27017 で待ち受ける。


$ ./mongod run

データディレクトリを変更しデフォルトポートを使う

データファイルの格納ディレクトリを指定するするには --dbpath オプションを使う。


$ ./mongod --dbpath /var/data/mongo/

ィレクトリは事前に作成する必要がある。Mongo はディレクトリの作成は行わない。

ポートを変更する

クライアントからの接続を待ち受けるポートを指定するには、--port オプションを使う。


$ ./mongod --port 12345

のオプションは、同じマシーン上に複数の Mongo インスタンスを立てる際に有用である。(例えば マスタースレーブペアを走らせる など)

Mongo の停止

Control-C

端末でフォアグランドで Mongo を走らせている場合、単純に "Ctrl-C" を入力することで停止できる。これにより、Mongo は、データファイルをフラッシュしクローズし、安全に停止する。このことは、実行中の全ての操作が終わるのを待つことに注意する。

Mongo シェルから shutdownServer() メッセージを送る

シェルからサーバの停止を要求できる。


$ ./mongo
> db.shutdownServer()

のコマンドは、ローカルホストからか、認証されている場合のみ利用できる。

TERM シグナルを送る

kill コマンドで TERM シグナルを送ることにより停止できる。Mongo は TERM シグナルを受けて停止する。


kill -2 PID

ILL シグナル (9) を送ると強制終了するためダメージが発生する。(この場合、repairDatabase コマンドを実行することになる)

メモリ使用量

Mongo はデータにアクセスするのにメモリ マップド ファイルを用いる。このため、top のようなコマンドでは、 mongod プロセスは大量のメモリを使用しているように表示される。これは懸念すべきことではなく、メモリ マップド ファイルを用いる場合は普通のことである。基本的に、マップされたファイルの容量は仮想記憶の欄に表示され、実記憶の欄には RAM にキャッシュされた量が表示される。

Mongo 本来のメモリ フットプリントは、起動時すぐ、クライアント未接続、空の /data/db/ ディレクトリ、という状態で実記憶量を見ることで得られる。( --nojni を付けて起動することでより少ないメモリ使用量になる)

s mongo-の起動と停止

f markdown

u fb0110bb-4527-428c-a058-7d2ef5e63206

自宅のネットワークを見直し

2009-07-18 15:40 JST @sadayuki

昨日から今日にかけて、このサーバへの接続が悪かったと思う。まあ、あまり影響は無いとは思うが、影響を受けた人にはごめんなさいを言いたい。

今までは、下記のような接続をしていた。

ONU

ひかり電話対応機器 ( RT-200KI )

ルータ ( BBR-4HG )

AirMac ExtremeAirMac Express

PPPoE はルータが面倒を見て、ひかり電話対応機器は通過の設定にしていた。AirMac もブリッジモードでただ無線サービスの提供のみ。Extreme が 802.11n 専用。Express が 802.11g 専用。11n を 5Ghz 帯で運用したかったので分けたのだ。

電話の脇に設置しているのだが、掃除も兼ねて接続の見直しをした。

ONU

HUB

AirMac Express 、ひかり電話対応機器 ( RT-200KI )

Express を 802.11n/g で運用し、PPPoE 接続の面倒を見て、DHCP サーバ、NAT サーバとして活用。RT-200KI はこれまで通り電話担当。ルータを通すと電話が使えなくなったのだが、HUB だと電話できる。光電話って、TCP/IP より下の層で何かやっているんでしたっけ?

差し引きでコンセントがひとつ減った。目出度い。

amazon_img

"Logitec イーサネットHUB / 5ポート / 電源外付け / ブラック LAN-SW05/PAB" (ロジテック)

今回使った HUB は家にあったやつを流用したのだが、この HUB はケーブルの長さにより給電量を制御するそうだ。次に買う時はこんなエコのやつを買いたい。

s 自宅のネットワークを見直し

f markdown

u 45b310b3-a060-451a-98ee-9b1f3125d310

バックアップ : MongoDB

2009-07-18 09:17 JST @sadayuki

今度は Admin Zone 。まずは上から。元ネタは Backups

バックアップ

MongoDB のバックアップ戦略には多くの種類が存在する。この文書では個々の異なる技術について見てゆく。

最初に、注意しておきたいのは、データベース起動中や書き込み中に MongoDB のデータファイル(デフォルトでは /data/db/)をバックアップしないことである。そのようなバックアップはファイルを破損させる。

シャットダウンとバックアップ

単純なやり方は、データベースを止め、データファイルをバックアップし、再起動するというものである。これは安全であるが明らかに望まれてはいない。

バリエーションのひとつに、mongo シェルからデータベースに closeAllDatabases コマンドを送るというものがある。


> use admin
 switched to db admin
 > db.$cmd.findOne({closeAllDatabases:1});
 {"ok" : 1}

ックアップ中にアプリケーションからデータベースへの書き込みが無い状態を保証してから、ファイルをバックアップする。

エクスポート

mongodump ユーティリティは、データベースの稼働中に、データベース全体をエクスポートするのに使える。作成されたダンプは、後日、リストアに用いることができる。

スレーブのバックアップ

レプレケーションを用い、スレーブデータベースを持つというのは、良いバックアップ戦略である。スレーブはマスターに追随し、ほぼ最新の状態のデータベースを保持している。スレーブデータベースを停止し、ファイルのバックアップをし、スレーブを再起動することができる。再起動後、バックアップ中の変更を反映する。

この手法は、主機の障害に備え、いつでも準備完了のバックアップ機を持てるため良い。そしてまた、スレーブからバックアップを取得するため、マスターにパフォーマンス上の問題を発生させないため良い。

スレーブからのエクスポート

これらの手法のコンビネーションが最も良い。スレーブから mongodump ユーティリティを用いてバックアップを取得することにより、スレーブを常に待機状態に置くのと同時に、マスターデータベースにはバックアップの負荷が掛からない。

s バックアップ

f markdown

u 54e8a817-24b9-435c-8763-363b4954d60e

イントロダクション - どのように Mongo は動作するか

2009-07-12 22:05 JST @sadayuki

基本に戻ってイントロダクションから始めてみました。とにかく動かすというのも良いですが、このような文章から始めるのも良いかもしれないです。

イントロダクション

MongoDB は コレクション指向、スキーマフリー の ドキュメント データベースである。

コレクション指向とは、データを コレクション と呼ぶセットにグループ化することを意味している。個々の コレクション はデータベースの中でユニークな名称を持っており、無制限な個数の ドキュメント を含むことが出来る。コレクションは、明確なスキーマを持たないことをのぞき、RDBMS の テーブル に似ている。

スキーマフリーとは、データベースが、コレクション に格納した ドキュメント の構造を知る必要がないことを意味している。実際、ひとつの コレクション に、異なる構造を持つ ドキュメント を格納することが出来る。

ドキュメントとは、構造化された key-value のペアを格納することを意味している。key は文字列であり、value は配列や ドキュメント を含むどのようなデータ型でも良い。このデータ型を、"BSON"、"Binary Serialized dOcument Format(シリアライズされたバイナリのドキュメントフォーマット)" と呼ぶ。BSON については、BSON を参照のこと。

MongoDB 運用の概要

MongoDB はサーバプロセスとして Linux, Windows, Mac OS X 上で稼働する。32 bit アプリケーションとしても、64 bit アプリケーションとしても稼働する。32 bit モードではデータサイズの合計が 2GB に制限されることから、64 bit モードで稼働させることを推奨する。

MongoDB のサーバプロセスは、デフォルトではポート 27017 で待ち受ける。(始動時に設定可能 - 詳しくはコマンドラインパラメータを参照のこと)

クライアントは MongoDB のサーバプロセスに接続し、実行 挿入、検索、更新といった操作を順次、実行することが出来る。また、セキュリティ機能を ON すれば、自身を認証することができる。

MongoDB は、そのデータをファイル(デフォルトでは /data/db/ に配置される)に格納し、効率的なデータ管理のためにメモリマップドファイルを利用する。

MongoDB はまた、自動的なデータの複製や、自動的なフェイルオーバーをするように設定できる。

MongoDB の管理に係るより詳細な情報は、Mongo 管理者ガイドを参照のこと。

MongoDB の機能性

開発者向けに、MongoDB のドライバは広範囲の操作を提供する。

  • クエリ: ドキュメントの検索のために、クエリ オブジェクト と SQL ライクな "Where 句" の両方を提供する。クエリ は ドキュメントのソート、サイズの限定、スキップが行え、また、ドキュメントの一部を取得することができる。
  • 挿入と更新: 新しい ドキュメント を挿入し、既存の ドキュメント を更新する。
  • インデックス管理: ドキュメント の単独のあるいは複数の項目をキーに インデックス を作成できる。サブストラクチャ、削除されたインデックス、その他を含む。
  • 一般的なコマンド: MongoDB の操作は、普通のソケット上を流れる DB コマンド により管理される。

参照

amazon_img

"Couchdb: The Definitive Guide" (J. Anderson, Jan Lehnardt, Noah Slater)

CouchDB の本でも読む ドキュメントベース データベース の話が書いてありそうだが日本語の本が無い。英語の本でも近日発売とのこと。暫くはネットで情報を漁るしかないかも。

s イントロダクション-どのように-mongo-は動作するか

f markdown

u e4d1cede-ad09-406e-adb8-6a57a60deb1a

PHP の Mongo 関数マニュアルが充実している

2009-07-12 18:15 JST @sadayuki

Google で MongoDB を検索すると、PHP 関係のページが大量にヒットする。私は PHP はやらないのだが、ちょっと覗いてみると凄い。日本語訳された関数マニュアルが並んでいる。Mongo 関数のトップページを見ると、Ruby のドライバと同じような作りになっているようだ。Ruby を使う上では使い方の例がまったく役に立たないが、メソッドが何をするかを知るには十分のようだ。訳語に迷ったら覗かせてもらおうと思う。

s php-の-mongo-関数マニュアルが充実している

f markdown

u cc46febe-d845-4762-91c3-cb9f4c1f13a3

XGen::Mongo::Driver::DB

2009-07-12 17:11 JST @sadayuki

オレオレ訳の続き。訳語が揺れていて、通しで見ると、同じ意味に読めないかも。メソッドを眺めると、当然ながら、MongoRecord::Base に似ている。また、使い方が不明なメソッドがいろいろある。authenticate とか。master と slave の関係が良くわからない。ドライバのマニュアルではなく、MongoDB 本体の説明を読む必要がありそう。次は XGen::Mongo::Driver::Collection か?

XGen::Mongo::Driver::DB

定数

SYSTEM_NAMESPACE_COLLECTION = "system.namespaces"
SYSTEM_INDEX_COLLECTION = "system.indexes"
SYSTEM_PROFILE_COLLECTION = "system.profile"
SYSTEM_USER_COLLECTION = "system.users"
SYSTEM_COMMAND_COLLECTION = "$cmd"

属性

hostR現在接続中のホスト。
nameRデータベースの名称。
nodesR[host, port] の配列。
pk_factoryRプライマリーキーファクトリーオブジェクト (or nil)。README.doc を参照するか、DB#new を参照すること。
portR現在接続中のポート。
socketRデータベースサーバのソケット。内部使用のみ。
strictWStrict モードはコレクションの存在を強いる。true の場合、コレクションが存在しない場合、作成を試行する。既に存在する場合はエラーを起こす。デフォルトでは false。この値はいつでも変更可能。

Public クラス メソッド

  • new(db_name, nodes, options={})

    DB インスタンスの生成は、通常は Mongo#db を呼ぶことにより行われる。

    
    
    db_nameデータベースの名称
    nodes [host, port] の配列。ノード定義のより詳しい手法は Mongo#new を参照
    optionsオプションのハッシュ
    Options:
    :strict true の場合、コレクションは、アクセスするためには存在が必須であり、作成するためには存在していたはいけない。colection と create_collection を参照。
    :pk:create_pk に応答する主キーファクトリーオブジェクトを指定する。オブジェクトは、ハッシュを受け取り、元のハッシュに主キー項目を追加したハッシュを返す(注: 受け取ったハッシュに既に主キー項目が含まれる場合、新しい主キーを追加しない)。これは、レコードが登録される時、:pk オブジェクトの create_pk メソッドが呼び出され、新しいハッシュが返されることを意味する。
    :slave_oknode が単独の host/port を含む場合のみ使用する。false の場合、host/port へ接続する際、サーバが master であることをチェックし、master でない場合はエラーを投げる。
    :auto_reconnect接続がクローズされた場合、master サーバか、単独サーバに自動的に再接続する。デフォルトは false 。
    DB オブジェクトが最初にペアに接続する際、master サーバを探して接続しようとする。ソケットエラーや “not master” を受け取ると、再度 master サーバを探して接続しようとする。

    Public インスタンス メソッド

    • admin()
      自分自身の Admin オブジェクトを返す。

    • authenticate(username, password)
      usernameSYSTEM_USER_COLLECTION の中に password を持っていたら true を返す。nameusername であり、 password はプレインテキストである。

    • auto_reconnect?()
      自動再接続するか否かを返す。

    • close()
      データベースへの接続を閉じる。

    • collection(name)
      コレクションを返す。strictfalse の場合、既に存在していればそのコレクションを、存在しない場合は新規のコレクションを返す。stricttrue の場合、コレクションが存在しない場合はエラーを投げる。

    • collection_names()
      コレクションの名称の配列を返す。それぞれの名称は、“データベース名.コレクション名“ の形式になる。

    • collections_info(coll_name=nil)
      コレクションの情報をもつ Cursor が返る。

    • connect_to_master()

    • connected?()

    • count(collection_name, selector={})
      collection_name で指定される名称を持つコレクションの中で、selector で指定される条件にマッチしたレコードの件数を返す。selectornil か空のハッシュの場合、全件の件数を返す。通常は Collection#count から呼ばれる。

    • create_collection(name, options={})
      コレクションを作成する。 stractfalse の場合、既存のコレクションか新規のコレクションを返す。stracttrue の場合、コレクションが既に存在する場合エラーを投げる。
      options はオプションを指定するハッシュである。

      :capped真偽値。指定されない場合、上限無し。
      :sizecapped が true の場合、上限のバイト数を指定する。false の場合、コレクションの最初のエクステントのサイズを指定する。
      :maxcapped が true の場合の最大レコード数。
    • create_index(collection_name, field_or_spec, unique=false)
      collection_name に対する新しいインデックスを作成する。field_or_spec は単一の項目名か、[項目名, 整列方法] の配列である。整列方法は、XGen::Mongo::ASCENDINGXGen::Mongo::DESCENDING で指定する。通常は、Collection#create_index から呼ばれる。uniquetrue の場合は、インデックスはユニークであることが強制される。

    • db_command(selector)
      DB コマンドは順序が維持されることが要求される。そのため、selectorOrderdHash であるか要素がひとつのハッシュである必要がある。このメソッドは内部使用のみ。

    • dereference(dbref)
      dbref の参照するドキュメントを取得する。

    • drop_collection(name)
      name で指定されたコレクションを削除する。削除が成功するかコレクションが存在しない場合は true を返す。その他の場合は false を返す。

    • drop_index(collection_name, name)
      collection_name で指定されたインデックスを削除する。通常は Collection#drop_index もしくは Collection#drop_indexes から呼ばれる。

    • error()
      この接続で発生した直近のエラーを返す。エラーが無い場合は nil を返す。
      注: このバージョンでは一部のエラーのみしか検知しない

    • error?()
      直近の操作でエラーが発生した場合に true を返す。

    • eval(code, *args)
      MongoDB 上で JavaScript の式を実行する。code は、JavaScript の式を含んだ、文字列か XGen::Mongo::Driver::Code インスタンスである必要がある。JavaScript 式を MongoDB 上で実行するために必要な追加の引数を *args で渡す。

    • full_coll_name(collection_name)

    • index_information(collection_name)
      collection_name で指定されるコレクションに対するインデックスの情報を取得する。通常は Collection#index_information から呼ばれる。インデックス名をキーとするハッシュが返る。

    • insert_into_db(collection_name, objects)
      objects を、collection_name で指定されるコレクションへ追加する。通常は Collection#insert から呼ばれる。@pk_factory により変更された objects を含んだ配列が返る。

    • logout()
      この接続におけるデータベースの認証済みでの利用を終了する。

    • master()
      “host:port” 形式で master データベースの位置を返す。自身が master であっても有効。

    • master?()
      自身が master である場合、もしくは他のデータベースとペアを組んでいない場合に true を返す。 slave の場合は false を返す。

    • modify_in_db(collection_name, selector, obj)
      replace_in_db の Alias。

    • ok?(doc)
      doc が、値が 1 である ok フィールドを含む場合に true を返す。

    • pk_factory=(pk_factory)

    • previous_error()
      このデータベースサーバにおける最近のエラーを取得する。最後に呼んだ DB#reset_error_history 以後のエラーのみ返す。エラーが無い場合は nil を返す。

    • query(collection, query)
      検索結果の Cursor を返す。検索は遅延実行されることに注意。Cursor は必要になった時点で sent_query_message を実行する。Cursor を通してオブジェクトの要求をしなければ、クエリーはサーバに送られない。

    • receive_full(length)

    • remove_from_db(collection_name, selector)
      collection_name で指定したコレクションから、selector にマッチしたレコードを削除する。通常は Collection#removeCollection#clear から呼ばれる。

    • replace_in_db(collection_name, selector, obj)
      collection_name で指定したコレクションの中で selector にマッチしたレコードを obj で置き換える。通常は Collection#replace から呼ばれる。

    • repsert_in_db(collection_name, selector, obj)
      collection_name で指定したコレクションの中で selector にマッチしたレコードを obj で置き換える。マッチしない場合は obj を登録する。通常は Collection#repsert から呼ばれる。

    • reset_error_history()
      このデータベースのエラーの履歴をリセットする。

    • send_message(msg)
      データベースに msg を送る。msgXGen::Mongo::Driver::MsgMessage のインスタンス。

    • send_query_message(query_message)
      Cursor によるクエリーの遅延実行により呼び出される。

    • send_to_db(message)

    • slave_ok?()

    • strict?()
      strict フラグを返す。

    s xgen-mongo-driver-db

    f markdown

    u ce3fac2e-a221-4cf4-b090-816fb572c71e

XGen::Mongo::Driver::Mongo

2009-07-11 18:50 JST @sadayuki

オレオレ訳の追加。master と slave がどんなふうに働くのが良くわからない。

XGen::Mongo::Driver::Mongo

定数

  • DEFAULT_PORT = 27017

Public クラス メソッド

  • new(pairorhost=nil, port=nil, options={})

Mongo データベースサーバのインスタンスを作成する。単独、もしくはペアのデータベースサーバを指定する必要がある。単独のサーバを指定する場合は `:slave_ok` を指定できる。`host` のデフォルトは "localhost" 、`port` のデフォルトは `DEFAULT_PORT` であり、どちらも省略可能である。`pair_or_host` に ペアを指定する場合、`:left` と `:right` の二つのキーを持つハッシュを指定する。それぞれのキーは、次の何れかになる。

* サーバ名を指定する。ポートは `DEFAULT_PORT` になる
* ポートを指定する。サーバ名は "localhost" になる
* サーバ名とポート番号を持つ配列

`options` それぞれの DB インスタンスに引き継がれる。

:slave_ok
単独のサーバを指定した場合にのみ使用できる。`false` を指定すると、サーバ/ポートへ接続する時、DB オブジェクトは、サーバが master か否かチェックする。もし master で無い場合は エラーが送出される。
:auto_reconnec
DB 接続がクローズした際、master か、単独のサーバへ自動的に再接続を試みる。
例を示す。 Mongo.new # localhost, DEFAULT_PORT, slave 不可 Mongo.new("localhost") # localhost, DEFAULT_PORT, slave 不可 Mongo.new("localhost", 3000) # localhost, 3000, slave 不可 # localhost, 3000, slave 可 Mongo.new("localhost", 3000, :slave_ok => true) # localhost, DEFAULT_PORT, 自動再接続 Mongo.new(nil, nil, :auto_reconnect => true) # ペアのサーバ. DB は常に master に接続する. ソケットエラー か "not master" エラーの場合は、master に自動再接続する Mongo.new({:left => ["db1.example.com", 3000], :right => "db2.example.com"}, # DEFAULT_PORT nil, :auto_reconnect => true) # この場合、:right はi localhost/DEFAULT_PORT になる. 自動再接続なし. Mongo.new({:left => ["db1.example.com", 3000]}) DB オブジェクトが最初にペアのサーバに接続しようとした際、master インスタンスを探して接続する。

Public インスタンス メソッド

  • database_info()

    データベース名をキー、ディスク容量を値とするハッシュが返る。

  • database_name()

    データベース名の配列が返る。

  • db(db_name, options={})

    db_name をデータベース名に持つ XGen::Mongo::Drive::DB の インスタンスが返る。slave_okauto_reconnect のオプションを new で渡した場合、ここで上書きが出来る。

  • drop_database(name)

    name をデータベース名に持つデータベースを削除する。

s xgen-mongo-driver-mongo

f markdown

u 02f1772f-3e71-4fb8-a0e2-ca76b8dd30fa

機動戦士ガンダム 00 COMPLETE BEST

2009-07-11 14:17 JST @sadayuki

何か棚にこんなんばっかり増えてゆく。COMPLETE BEST はこれが 5 個目かしら。でも普段は聞かない知らない歌手の歌が聴けるので結構面白いものだ。今回の CD も良い歌が揃っている。駅へ向かう道すがら、L'Arc〜en〜CielDAYBREAK’S BELL を聞いて涙が出てしまった。まあ、曲が良いというのもあるのだろうが、00 の物語、現実の世界、そんなものが合わさって力を持っている。

どれだけ祈れば 天に届く?

でもね。天に届いても誰が何をしてくれる訳ではない。自分で何とかしないと。例え自分で何とか出来ないものであっても、何かしないと誰も助けてくれない。「天は自ら助くる者を助く」ってね。

おっと。職場の自分に向かって言ったほうが良い言葉だな。

amazon_img

"機動戦士ガンダムOO COMPLETE BEST(期間生産限定盤)(DVD付)" (TVサントラ, Tommy heavenly6, マリナ・イスマイール(恒松あゆみ), L’Arc~en~Ciel, THE BACK HORN, the brilliant green, ステファニー, Taja, UVERworld, 石川智晶, ステレオポニー)

細かいことだけど、「ガンダム00」の「00」はゼロゼロと書いて「ダブルオー」と読ませるのだけど、Amazon はそのままアルファベットの「OO」としてますね。今更リンクを変えられないし、この手の間違いは恥ずかしいものです。Blog の場合もタイトルがそのまま URL に出るので気を付けましょう。

s 機動戦士ガンダム-00-complete-best

f markdown

u d1698d39-0579-47ac-9d9a-2fcdd1da197c

MongoRecord の続き ( find )

2009-07-11 12:08 JST @sadayuki
  • find(*args)
    • 単一のもしくは複数のデータベースオブジェクトを検索する

* `id` ( 単一の `id` か `id` の配列) による検索は、1 レコードか `Cursor` を返す
* `Find :first` は `options` にマッチした最初のレコードを返す。マッチしなかった場合は `nil` を返す
* `Find :all` は `Cursor` を返す

  Options:

  :conditions - キーが項目名、値が項目値であるハッシュである。項目値は、文字列、数値、正規表現のような単純な値である必要がある

  :select - 単一の項目名か、項目名のリスト。指定されない場合は全ての項目が返る。項目名はシンボルか文字列。データベースは、常に `_id` と `_ns` は返す。

  :order - シンボルを与える場合、その項目の昇順でソートされる。“field1 asc, field2 desc, field3” のような文字列を与える場合、指定した項目と整列方法でソートされる。デフォルトは昇順である。配列を与える場合、個々の要素はシンボルか文字列で項目名を指定し、昇順でソートされる。ハッシュを与える場合、キーに項目名を指定し、値に ‘asc’ か ‘desc’ を与える。ハッシュの値には、1 ( 昇順を表す ) と -1 ( 降順を表す ) を与えても良い。または、真偽値でも良い。その場合、true で代表される 真値が昇順、偽値が降順を表す。

  :limit - 戻るレコード数の最大数を指定する

  :offset - スキップするレコード数を指定する

  :where - JavaScript の式を指定する。この式は `:conditions` で選択された個々のレコードに対して、データベースサーバが適用する。

  :criteria - MongoDB の条件演算子をハッシュ形式で指定する

  `id` による検索の例:

Person.find("48e5307114f4abdf00dfeb86")     # 単一の id による検索はレコードを返す  
Person.find(["a_hex_id", "another_hex_id"]) # id の配列による検索は Cursor を返す  
Person.find(["a_hex_id"])                   # id の配列による検索は Cursor を返す  
Person.find("a_hex_id", :conditions => "admin = 1", :order => "created_on DESC")  

  Find :first の例:

Person.find(:first) # コレクションの中の最初のレコードが返る  
Person.find(:first, :conditions => ["user_name = ?", user_name])  
Person.find(:first, :order => "created_on DESC", :offset => 5)  
Person.find(:first, :order => {:created_on => -1}, :offset => 5) # 直前の例と同じ意味  

  Find :all の例:

Person.find(:all) # コレクションの全てを表す Cursor が返る  
Person.find(:all, :conditions => ["category = ?, category], :limit => 50)  
Person.find(:all, :offset => 10, :limit => 10)  
Person.find(:all, :select => :name) # name 項目のみ返る  

  ActiveRecord 風の Find_by_* の例:

Person.find_by_name_and_age("Spongebob", 42)  
Person.find_all_by_name("Fred")  

  Mongo 形式の例:

Person.find(:all, :where => "this.address.city == 'New York' || this.age = 42")  
Person.find(:all, :criteria => {"followers_count"=>{"$gte"=>410}})  

  注: :order , :limit , :offset の各オプションは、Cursor に渡される。そのため

Person.find(:all, :offset => 10, :limit => 10, :order => :created_on)

  は、下記と同義である。

Person.find(:all).skip(10).limit(10).sort({:created_on => 1})

いう訳ですが、最後のはちょっとどうかと思います。:offset と :limit ってサーバからのデータ転送量を減らす目的で使うことが多いと思います。今のバージョンではそれが期待できなくて、全件アプリケーションに持ってきてから自分でスキップするのと同じです。XGen::Mongo::Driver::Collection.find は offset, limit, sort ともにサーバに送っているようなのですが確信が持てません。

s mongorecord-の続き-find

f markdown

u d576a5ea-3c1d-44ad-80f0-01841867ce61

北朝鮮と握手はいつか?

2009-07-11 09:50 JST @sadayuki

今朝の新聞に「おお〜っ」という写真が載っていた。

オバマ米大統領は9日、イタリア・ラクイラ主要国首脳会議(サミット)の会場で、リビアのカダフィ大佐と初めて握手を交わした。 From: 時事ドットコム:カダフィ大佐と握手=関係改善を象徴−米大統領

かつてはならずもの国家と呼んでいたのに。これを見ると、日本の隣の某北朝鮮との対比が鮮明だ。北朝鮮もいつの日かこんなふうになるのか。

s 北朝鮮と握手はいつか?

f markdown

u 62822070-f937-460c-b4c5-b537c31f27fa

「iPodリサイクルプログラム」で iPod を10% 割引で買おう!

2009-07-08 23:51 JST @sadayuki

ついこの間も、iPod nano を買ったばかりなのだが、こんなキャンペーンをやっているのは知らなかった。

Summer Music NightでApple Storeを訪れるついでに、古いiPodを「iPodリサイクルプログラム」でリサイクルしましょう。 Apple Storeは無料のiPodリサイクルで、環境に優しい廃棄を実施しています。また、古いiPodのリサイクルと同時に、新品のiPodをお求めになる場合は、新品のiPodを10%割引で購入できます。詳しくはApple Storeのスペシャリストにお尋ねください From: アップル - 直営店 - Summer Music Nights - Live at the Apple Store

2代目 nano のバッテリーが充電できなくなってしまったので買い替えたばかり。修理するよりは新しく買ったほうが記憶容量も増えるし良いかと思ったのだ。ただ、直営店の話なので無料刻印サービスが使えないかも。実家に 1 台と家に 1 台使ってないのがあるので次に買う時があれば有効活用しよう。

amazon_img

"Apple iPod nano 8GB ブルー" (アップル)

s 「ipodリサイクルプログラム」で-ipod-を10-割引で買おう!

f markdown

u ec733876-55f8-4d62-bc95-c0659cda87eb

MongoDB と REST アクセス

2009-07-07 22:49 JST @sadayuki

このところ、CouchDBCloudKit で遊んでいた。これらはスキーマレス、ドキュメント指向という点では MongoDB と同じなのだが、アクセスの方法が異なる。うっかりしていたのだが、MongoDB はデータベースへの REST を使ったアクセスを提供していない。これは、パフォーマンスを重視してということのようだ。

まあ、Sinatra を使えば MongoDB への REST を使ったインタフェースを構築することも割りと容易に出来るだろう。逆に、CloudKit へのドライバベースのアクセスを提供するためには Clouder がある。ただ、アクセスのパフォーマンスを考えると、MongoDB のやり方の方が自由度が高いだろう。しかも、ひとつのコレクションを複数のサーバに分散して保存する機能があるようだ。ちゃんと読んでないので自信は無いのだが。。

パフォーマンスを考えて REST を用意していないのは良いのだが、個人的には REST を使いたい。仕方が無いので Sinatra で REST を提供するインタフェースを提供することを考えてみようか。またやりたいことが増えてしまう。いい加減に減らすことを考えたほうが良いだろうに何時まで増えるか?

amazon_img

"RESTful Webサービス" (Leonard Richardson, Sam Ruby)

s mongodb-と-rest-アクセス

f markdown

u 905e6597-466e-4cbd-9dc8-6dc2ec4b5c3d

電子レンジを買い替えました

2009-07-05 22:43 JST @sadayuki

結婚した時に買った、東芝の 1992 年製の電子レンジが、先週とうとう壊れた。お疲れ様と言いたい。最近は長男と三男の弁当のために大活躍だった。急に働き過ぎが良くなかったのかも知れない。長男はちょうど定期テスト期間中で弁当が不要だったのが幸いだった。今日、近くの電気屋で買ってきた。取り寄せになるのなら在庫のあるやつと考えていたのだが、ちょうど欲しかったのがあったので良かった。

今度の電子レンジは愛称が「エレック」。私の実家には古い古い「エレック」があった。まだ出始めの(確か二代目くらい)高いやつだ。母が働きに出るため購入し、何年か前まで現役で活躍していた。さすがナショナルは丈夫だ。先代の東芝の電子レンジも 15 年以上働いた。今度の電子レンジは「エレック」さんの名に恥じないように頑張って欲しい。

amazon_img

"Panasonic フラットオーブンレンジ NE-M251-S" (パナソニック)

s 電子レンジを買い替えました

f markdown

u aca99c79-d056-41eb-aa49-eca6c9eb2594

% 2009-07-07T21:49:48+09:00|みきだんな|やはり、今買うならフラットタイプでスチーム付きかぁ.....我が家のオーブンレンジは嫁さんが独身時代から使っているヤツで、もはやビンテージと言ってよさそうな年代物。表示部分が調子悪く、ついたり消えたりするのでいい加減買い替えたいが、一応肝心の機能は生きているのでしぶとく使ってます。実は最近テレビの調子も良くなくて、時々キ〜ンと異音がするのでこちらもどうしたものか悩んでいます。(ブラウン管なので、当然地デジなんて見られません。)あれやこれやと寿命が来つつありますが、「家電の買い替えは果たしてエコなのか?」などと言い訳を述べつつ、財布の中身と相談しながら悩んでおります。

% 2009-07-07T22:51:21+09:00|Sadayuki|「ボッ」と音を立てて動かなくなったそうで、後ろの排気口を見ると焦げてました。

MongoRecord

2009-07-05 22:10 JST @sadayuki

SinatraMongoDB を使うことを考えると、MongoRecord が良い。下記はサンプルコード。


require 'rubygems'
require 'mongo'
require 'mongo_record'

class Track < MongoRecord::Base
  collection_name :tracks
  fields :artist, :album, :song, :track
  index :artist

  def to_s
    "artist: #{artist}, album: #{album}, song: #@song, track: #{@track ? @track.to_i : nil}"
  end
end

MongoRecord::Base.connection =
  XGen::Mongo::Driver::Mongo.new.db('mongorecord-test')

t = Track.new(:artist => 'Level 42', :album => 'Standing In The Light',
              :song => 'Micro-Kid', :track => 1)
t.save
puts "There are #{Track.count()} tracks."
t = Track.find(:first, :conditions => {:song => 'Micro-Kid'})
Track.find(:all, :sort => 'song').each { |t| puts t.to_s }

etting Started には、examplesMongoRecord::Base と MongoRecord::Cursor を見ろと書いてあるが、MongoRecord::Cursor が見つからない。

MongoRecord::Base

Public Class methods

  • collectionname(collname)
    • このメソッドは、Mongo のコレクション名を設定するために呼ばれる。デフォルトでは、クラス名に lower_case_with_underscores を適用してものが設定される。
  • field(*fields)
    • コレクションのフィールドを作る。個々のフィールドは、データベースに格納され、呼び出される。フィールド名 “id” と “ns” は自動的に保存され呼び出される。メソッド “field” は “fields” とも呼ばれる。
  • index(fileds, unique = false)
    • コレクションのためのインデックスを作成する。fields は単一のフィールド名 (:title) か、フィールド名の配列 ([:title, :author, :date]) か、フィールド名とソート方向の配列 ([:title, :asc] か [:title, :desc]) か、フィールド名とソート方向の配列の配列 ([[:title, :asc], [:author, :desc]]) である。uniquetruefalse である必要があり、インデックスがユニークである必要があるか否かを示す。
  • connection=(val)
    • データベースへの接続を格納する。nil に設定されると、$db が利用される。
  • find(*args)
    • (長いのであとで)

Public Instance methods

  • save()
    • 自身を保存する。保存に成功すると true を返す。失敗の場合は false を返す。

s mongorecord

f markdown

u 77c81a50-e5af-42e0-81a0-0abe29c0f821

エサキモンキツノカメムシ?

2009-07-05 11:42 JST @sadayuki

家の車のタイヤにくっついていました。カメムシも気になりますが、タイヤの劣化も気になりますね。

amazon_img

s エサキモンキツノカメムシ?

f markdown

u 245f0c70-1d1f-4069-8c6e-513ae382dd5f

MongoDB Ruby チュートリアル

2009-07-04 20:59 JST @sadayuki

Ruby Tutorial のオレオレ訳。

* データベースサポート

Ruby プログラマーは MongoDB を利用するのに次の 3 種類の方法を選べる。

* ドライバ

2 種類のドライバが存在する。

* ドキュメンテーション

mongo-ruby-driver API documentation を参照。

* ドライバのインストール

RubyGem からインストールするには下記の通り。


$ gem sources -a http://gems.github.com
$ sudo gem install mongodb-mongo

最初の行で GitHub のリポジトリを追加している。ソースコードからインストールする方法は README.rdoc を参照のこと。

* mongo-ruby-driver を使う

** RubyGem を使う

全てのコードは下記の実行が必要。


require 'rubygems'  # not necessary for Ruby 1.9
require 'mongo'

** MongoDB へ接続する

XGen::Mongo::Driver::Mongo のインスタンスは Mongo サーバを表す。Mongo インスタンスは、名前をつけられたデータベースを表す XGen::Mongo::Driver::DB インスタンスを獲得するために使われる。このデータベースは存在する必要は無い。存在しない場合は作成される。

Mongo サーバに接続する際、サーバのアドレス/ポートを指定することが出来る。下記の例は、ローカルホストの "mydb" へ接続する例である。


db = XGen::Mongo::Driver::Mongo.new.db("mydb")
db = XGen::Mongo::Driver::Mongo.new("localhost").db("mydb")
db = XGen::Mongo::Driver::Mongo.new("localhost", 27017).db("mydb")

この時点で、上記の db オブジェクトは Mongo サーバ上の指定されたデータベースに接続される。個々の DB インスタンスは、サーバへ接続するために、個々のソケット接続を用いる。

** データベースを一覧する


m = XGen::Mongo::Driver::Mongo.new # (optional host/port args)
m.database_names.each { |name| puts name }
m.database_info.each { |info| puts info.inspect}

* データベースの削除


m.drop_database('database_name')

** 認証 ( オプション )

MongoDB は、name と password で認証された secure モードで実行できる。サーバが secure モードで実行されると、全てのクライアントは全ての操作を実行する前に、name と password を伝える必要がある。Ruby ドライバを使用する際は、接続済みの DB オブジェクトに対して下記のように実行する。


auth = db.authenticate(my_user_name, my_password)

name と password が正しい場合は、上記の authtrue になる。反対に正しくない場合は false になる。可能ならば、MongoDB ログを参照すべきだ。

** コレクションの一覧を取得する

個々のデータベースは 0 個以上のコレクションを保持している。データベースからコレクションの一覧を取得することが出来る。


db.collection_names.each { |name| puts name }

データベースに name と addres という二つのコレクションがあるとすれば、上記を実行すると下記の出力がある。


name
address

** コレクションを取得する

コレクションを取得するには、コレクションの名前を指定して collection(String collectionName) メソッドを用いる。


coll = db.collection("testCollection")

コレクションオブジェクトを取得することにより、コレクションへのデータの挿入や、クエリの実行が可能になる。

** ドキュメントの挿入

コレクションオブジェクトを取得することにより、コレクションへのデータの挿入が可能になる。例として、下記のような JSON ドキュメントを作成する。


{
   "name" : "MongoDB",
   "type" : "database",
   "count" : 1,
    "info" : {
               x : 203,
               y : 102
             }
}

上記の例は、埋め込まれた JSON ドキュメントを保持していることに注意が必要である。これを実行するために、Hash か ドライバで用意している OrderedHash ( キー順を保存する ) を用いることができる。そして、コレクションに挿入するために insert() メソッドを用いる。


doc = {"name" => "MongoDB", "type" => "database", "count" => 1,
       "info" => {"x" => 203, "y" => '102'}}
coll.insert(doc)

** find_first() を用いてコレクションの最初のドキュメントを検索する

前節で挿入したドキュメントを照会するには、find_first() を実行する。このメソッドは、単一のドキュメントを返す。カーソルを扱う必要は無い。


my_doc = coll.find_first()
puts my_doc.inspect

上記を実行することにより、下記の出力を得る。


{"_id"=>#, "name"=>"MongoDB", "info"=>{"x"=>203, "y"=>102}, "type"=>"database", "count"=>1}

: _id エレメントは MongoDB により自動的に追加される。MongoDB は、_ で始まるエレメント名について、内部利用のため予約している。find_first() は、他の Mongo のドキュメントや Java ドライバにおいては、findOne と呼ばれている。

** 複数ドキュメントの追加

興味深い他のクエリの実行のために、複数のドキュメントをコレクションへ追加する。これらのドキュメントは下記のようなものだ。


{
   "i" : value
}

これを簡単に行うために、下記のようにする。


100.times { |i| coll.insert("i" => i) }

注: 同一のコレクションに異なる形式のドキュメントを挿入することができる。これらのレコードは、同じコレクション内に複合レコードとして格納される。この振る舞いは、MongoDB は "スキーマフリー" であるということの意味である。

** コレクション内のドキュメントをカウントする

これまでに私たちは 101 のドキュメントを挿入した。count() メソッドを使ってチェックしてみよう。


puts coll.count()

101 と出力される。

** 全てのドキュメントを取得するためにカーソルを使う

コレクションの中の全てのドキュメントを取得するためには find() メッソッドを使う。find() メッソッドは、クエリにマッチしたドキュメントを繰り返すための Cursor オブジェクトを返す。Ruby ドライバの Cursorenumerable である。そのため、全てのドキュメントをクエリし出力するには下記のようにする。


coll.find().each { |row| puts row.inspect }

これによりコレクションに含まれる 101 のドキュメントが出力される。

** ひとつのドキュメントをクエリする

コレクションに含まれる一部のドキュメントを取得するために、find() メソッドにハッシュを渡すことが出来る。例として、フィールド "i" が 71 であるドキュメントを得たいとすると、下記のようになる。


coll.find("i" => 71).each { |row| puts row.inspect }

そしてひとつのドキュメントが出力される。


{"_id"=>#, "i"=>71}

** クエリによりドキュメントのセットを取得する

クエリは、コレクションからドキュメントのセットを取得するのにも使える。例として、フィールド "i" が 51 を越えるドキュメントを得たいとすると、下記のようになる。


coll.find("i" => {"$gt" => 50}).each { |row| puts row }

同じように、20 < i <= 30 であるドキュメントは下記のようになる。


coll.find("i" => {"$gt" => 20, "$lte" => 30}).each { |row| puts row }

** OrderedHash

操作の順序が重要な場合は、キーの挿入順序を保存する XGen::Mongo::Driver::OrderedHash を利用する。また、Ruby 1.9 では、Ruby の Hash が挿入順序を保存するようになったため、OrderedHash を利用する必要はない。

** インデックスを作成する

MongoDBはインデックスをサポートしており、簡単にコレクションに追加できる。インデックスを作成するために、インデックスの名前と、インデックスを付けるためのフィールド名を指定することが必要である。下記は "i" の昇順のインデックスを作成する。


# create_index assumes ascending order; see method docs
# for details
coll.create_index("my_index_name", "i")

降順のインデックスを指定するためには、少し複雑な書式が必要である。フィールド名をキーに、値に 1 か -1 を持つ Hash で指定する必要がある。1 は昇順を意味し、-1 は降順を意味する。上記の create_index の呼び出しと、下記の呼び出しは等価である。


# explicit "ascending"
coll.create_index("my_index_name", {"i" => 1})

** コレクションのインデックスの一覧を取得する

コレクションに定義されたインデックスの一覧を取得することが出来る。


coll.index_information.each { |info| puts info.inspect }

下記の出力を得る。


{:ns=>"test", :name=>"my_index_name", :keys=>{"i"=>1}}

** データベース管理

DB オブジェクトは admin メソッドを持ち、管理機能を持つオブジェクトを返す。


admin = db.admin

データベースは、:off 、:slow_only 、:all という 3 つの分析レベルを持ち、データベースの分析レベルを照会するには下記のようにする。


puts admin.profiling_level   # => off (the symbol :off printed as a string)
admin.profiling_level = :slow_only

コレクションの正当性の解析は興味深い Hash を返す。全てのドキュメントが正しくない場合は例外があがる。


p admin.validate_collection('coll_name')

*

例については、mongo-ruby-driver examples directory を参照のこと。

The Mongo Tutorial は、Working with Mongo Objects and Classes in Ruby という特別なセクションを用意している。(このチュートリアルは、Mongo の包括的で有益な導入である)

* 参照

s mongodb-ruby-チュートリアル

f markdown

u 80458e93-6218-42cc-87eb-fb500e75985c

MongoDB を試す

2009-07-03 22:44 JST @sadayuki

くまくまーの紹介。MongoDB : C++ で書かれた高速なドキュメント指向DB。各プラットフォームごとにバイナリパッケージが用意されている。ダウンロードして解凍するだけで使える。


$ curl -O http://downloads.mongodb.org/osx/mongodb-osx-x86_64-0.9.5.tgz
$ tar zxvf ~/Downloads/mongodb-osx-x86_64-0.9.5.tgz
$ cd mongodb-osx-x86_64-0.9.5/
$ mkdir ~/Sites/mongo
$ ./bin/mongod --dbpath ~/Sites/mongo run

いて mongo-ruby-drivermongo-activerecord-ruby のインストール。Rails 向けの activerecord-mongo-adapter もあり。


$ gem sources -a http://gems.github.com
$ sudo gem install mongodb-mongo
$ sudo gem install mongodb-mongo_record

まくまーのサンプルコード。


require 'mongo'  
require 'mongo_record'  
MongoRecord::Base.connection = XGen::Mongo::Driver::Mongo.new.db('jpop')  
module MD  
  class Song < MongoRecord::Base  
    collection_name :songs  
    fields :code, :name, :singer, :word, :music, :intro, :tieup, :body, :created_at  
    index :singer  
  end  
end

From ヽ( ・∀・)ノくまくまー(2009-07-02)

クラスの中でフィールド定義をして save すればスキーマを考えずに保存できる。CloudKit の場合は別途 clouder が必要だが、本体とドライバーが纏まって用意されているのが良い。Ruby Tutorial が用意されているのも良い。少し突っ込んでみようと思う。

s mongodb-を試す

f markdown

u 267cb0ca-5b97-4f69-b14d-d3ac75ae27a1

「フレッツ 光ネクスト」のサービス提供地域の拡大はアナログ停波に間に合うだろうか?

2009-07-01 21:22 JST @sadayuki

今週末にボーナスが出る。どうも今回は思わしくなく、人事に言わせると「寸志」なのだそうだ。なんか違うと思うが。

そろそろ地デジ対応をしようと思っていたのだが、ボーナスがあんまり出ないのと、フレッツ・テレビが来そうな気配があり、今回は見送りかと考えている。近くに新幹線が走っており、アンテナよりもケーブルの方が良さそうな点も待ちの理由だ。

平成21年度内には「Bフレッツ」提供地域の全域へ拡大します。 From: 平成21年度上期における「フレッツ 光ネクスト」のサービス提供地域の拡大について

フレッツ・テレビはフレッツ 光ネクストのサービスなので、光ネクストが来ないと使えない。リンク先の News Release によれば、平成21年度中には来るようなのだ。アナログ停波は 2011 年 7 月なので、普通に考えると十分な余裕がある。今年度中であれば待つかとも思うが、本当に今年度中に来るのか。それが問題だ。さてさて。

amazon_img

"TOSHIBA REGZA 37V型 地上・BS・110度CSデジタルフルハイビジョン液晶テレビ 37Z8000" (東芝)

s 「フレッツ-光ネクスト」のサービス提供地域の拡大はアナログ停波に間に合うだろうか?

f markdown

u 495ce52f-fb40-48a6-a56b-74b3e5c91087

PLUTO 8

2009-07-01 21:21 JST @sadayuki

豪華版から 10 日遅れで、普及版がやっと出た。会社帰りに神谷町の TSUTAYA で購入。平積みで結構な面積を占めていたが、どの山も低くなっていたので、結構な数が出ていたような感じだ。

帰りの電車の中で泣けるかと思い警戒していたが、そうでもなし。「一体 500 ゼウスでいいよ。」のおっさんも、やっとつながった。ボラーやゴジの謎も、ゲジヒトの記憶を受け継いだアトムにより解決された。まあ、アトムが主人公なのかも知れないが、ゲジヒトとプルートーの物語だったのかも。

憎しみからは
何も生まれない
..........

ゲジヒトの、プルートー(サハド)の遺言が本シリーズのメインテーマなのだろう。トラキア合衆国のペルシア王国への侵攻にも似た現実のイラクからは、アメリカ軍の撤退が始まった。ここが治まればあとはパレスチナか。平和の国日本にいては、「憎しみからは何も生まれない」という言葉も現実味がない。現場ではどんな思いでいるのか。

amazon_img

"PLUTO 8 (ビッグコミックス)" (浦沢 直樹)

s pluto-8

f markdown

u 442d363d-fe54-4cd6-a6bd-d98888da3dfc

Google 検索

フィード

Amazon

最近 1ヶ月の投稿

過去の投稿

Amazon アソシエイト

Google AdSense

楽天アフィリエイト