Date:  Wed, 04 Aug 2010 18:29:00 +0900
Subject:  【オブジェクト倶楽部: 2010-30号】
X-Mail-Count: 00348

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.338 2010/08/04

■ I N D E X
┃
┣【プログラミング】ドキュメント指向データベースMongoDB [5]
┣【アジャイル】アジャイル・プラクティスの見つけ方 [17]
┃              〜自分の環境の変わった点から見つける〜
┗ 編集後記

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■━
■
┗【プログラミング】ドキュメント指向データベースMongoDB [5]

こんにちは、ursmです。

前回は様々な条件でドキュメントを検索する方法をご紹介しました。今回はド
キュメントのアップデートを見ていきましょう。

アップデートの基本となるのはupdateコマンドです。

> db.<collection>.update(<query>, <document>)

第一引数は検索条件です。この条件に該当するドキュメントのうち、最初の1つ
を第二引数のドキュメントで置き換えます。

さて、このコマンドはちょっと奇妙な挙動をします。例えば、あるユーザに生
年月日を設定するとしましょう。

> db.users.update({name: 'ursm'}, {birthday: '1983-09-20'})

結果としてこのユーザはどうなるでしょうか。次のようになります。

{birthday: '1983-09-20'}

元々あったnameというキーがなくなってしまいました。update()は普通に使う
と元のドキュメントを破壊的に上書きしてしまいます。
では、このようにしたらどうでしょうか。

> db.users.update({name: 'ursm'}, {name: 'ursm', birthday: '1983-09-20'})
{name: 'ursm', birthday: '1983-09-20'}

悪くはありませんが、冗長ですね。キーが増えたとき大変ですし、常にドキュ
メント全体を上書きするのでパフォーマンスも悪そうです。
MongoDBではドキュメントの一部を更新する方法として、Modifier Operations
という仕組みが用意されています。先程の例を書き換えてみましょう。

> db.users.update({name: 'ursm'}, {$set: {birthday: '1983-09-20'}})
{name: 'ursm', birthday: '1983-09-20'}

$setは指定されたキーに値をセットする効果を持つモディファイアです。他に
もいくつかありますので、見てみましょう。

● $inc
> db.users.update({name: 'ursm'}, {$inc: {age: 1}})
指定されたキーに値を足し合わせます。負の値を使えば減らすこともできます。

● $push
> db.users.update({name: 'ursm'}, {$push: {tags: 'ruby'}})
配列型のプロパティに値を追加します。

● $addToSet
> db.users.update({name: 'ursm'}, {$addToSet: {tags: 'kinesis'}})
$pushと似ていますが、追加する値が配列にすでに入っている場合は何もしませ
ん。値を重複させたくない場面で使います。

● $pull
> db.users.udpate({name: 'ursm'}, {$pull: {tags: '締切破り'}})
配列型のプロパティから指定された値を取り除きます。

モディファイアは複数組み合わせて使うこともできます。
> db.users.update({name: 'ursm'}, {$set: {birthday: '1983-09-20'}, $inc: {age: 1}})

Modifier Operationsはデータの一貫性を保つ上で重要な役割を果たします。
例えば、$incと同じことを素直にやると以下のようになります。

> ursm = db.users.findOne({name: 'ursm'})
> ursm.age++
> db.users.save(ursm)

一見同じようですが、大きな違いがあります。ageをインクリメントしている間
に他のプロセスからデータが更新された場合を考えてみてください。そのデー
タはsave()によって上書きされ、二度と日の目を見ることはないでしょう。
$incを用いればこのような問題は発生しません。

MongoDBは分散環境での性能向上に主眼を置いているため、リレーショナルデー
タベースのようなトランザクションをサポートしません。
代わりにModifier Operationsによってドキュメント単位でのアトミックな操作
が行えるようになっています。
このことはMongoDB特有のデータモデリング・スキーマ設計へと繋がっていくの
ですが、その話はまた今度にしましょう。

● まとめ
updateコマンドとModifier Operationsについてご紹介しました。次回は引き続
きアップデートについてです。(id:ursm)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■━
■
┣【アジャイル】アジャイル・プラクティスの見つけ方 [17]
┗              〜自分の環境の変わった点から見つける〜

こんにちは。こんぴろです。今僕が参加しているプロジェクトでは東京と福井
の2拠点で分散して開発をしている、いわゆる分散開発プロジェクトです。そう
いった、普通の開発環境と違った環境で、普段「良い」と言われているプラク
ティスを試してみると、ちょっと違った視点が得られるようです。

僕のチームでは、朝会やイテレーションミーティングの時に、Mikogo[*1]とい
う、無償で使えるデスクトップ共有ソフトを使って情報共有を行っていながら
話を進めています。Mikogoを使うと、そのセッションに参加しているメンバー
から、簡単に「ここ」をさせる矢印(ポインタ)が表示できたり、メンバーの画
面表示を簡単に切り替えられたり、別の参加者が表示中のマシンをリモートコ
ントロールできたりします。その他にも下記のような幾つか特徴があります。
 * WindowsだけでなくMacをサポート
 * マーカーで文字を書くようなホワイトボードの機能がある。

現在Mikogoのページでは日本語の説明ページが用意されていないため、簡単に
使い方を紹介しましょう。

1.Mikogoをインストールすると、タスクバーに「M」のアイコンができます。
2.アイコンのメニューを表示すると、「Start Session」という項目があるので、
  それを選択します。
3.Mikogoの設定画面が開くので、メールアドレスやパスワードを入力すると、
  Mikogoのアカウントが作成されます。
4.最後に「Mikogo Session Window」という画面が表示され、9桁のSession ID
  が表示されます。
5.デスクトップを共有したい他のユーザは、アイコンのメニューから
 「Join Session」を選び先ほどの9桁のSession IDを入れるとデスクトップの
  共有が開始されます。

セッションに参加できる人数は10人までです。Sessionにはパスワードをかけら
れるため、間違えて接続したユーザが画面を参照できないようにパスワードを
かけておくとよいでしょう。

さて、そろそろ本題にもどります。先日、このMikogoを使い、チーム内でGUIテ
ストの勉強会を行ったところ、思った以上に成果を上げる事ができました。普
通、勉強会というとある場所に集まり、発表者が説明用の画面を表示し、講演
をするスタイルが多いと思います。このスタイルだと、なかなか話の最中に質
問を挟むのは難しいでしょう。Mikogoを使った勉強会では、話をしている最中
にもう少し詳しく聞きたくなったところはポインタを表示する事でより深く聞
きやすかったり、途中で操作者が変わったり、別のセッション参加者が資料を
見つけてきたものを、画面表示を切り替える事ですぐに表示したり、かなりや
りやすかったです。講演スタイルでは一方通行だったのが、双方向というか、
参加している人でセッションを作り上げる事が出来る訳です。

このMikogoですが、勉強会だけでなく、開発環境がうまく動かなくなったメン
バーのサポートや、ペアプログラミングでもとても活躍してくれています。以
上の視点からプラクティスをまとめてみます。

----------------------------------------------------------------------
● プラクティス名
「分散チームでも勉強会」
チーム学習はツールにより、共同の場所がなくても行える時代になりました。

● 悪魔の囁き
「普段なら行っている勉強会はやらなくていいな。別々の環境で開発をしてい
 るのだから。」

● 天使の言葉
「チームで学習した事は、成果物の品質の高さにつながります。あなたが学ん
 でよいと感じた事は、積極的に共有しましょう。」

● こんな気分
「お、良い記事を見つけた。チームの勉強会のネタにしよう。」

● バランスが肝心
分散している拠点間で文化の違いがあり、新たに見つけた勉強会のネタがすで
に先方のチームでは学習済みの事があります。そういうときは先方のメンバー
に教えてもらいましょう。
----------------------------------------------------------------------

今回は開発現場の変わった点から、プラクティスを見つけてみました。では、
次回もお楽しみに。(こんぴろ)

[*1] http://www.mikogo.com/

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人のナガタユウコです。8月に入って早々ですが、頭の中はも
う夏休みのことでいっぱいです。今年は石垣島に行って何もせずのーんびり過
ごす予定なので、いまから楽しみです☆みなさまはもう夏休みの予定を立てま
したか?帰省ラッシュや観光地の混雑は憂鬱ですが、たまには仕事を忘れてリ
フレッシュして、休み明けからまたがんばりましょう!(ナガタユウコ)

*** オブラブスタッフ自己紹介 ***
No.20 bekkou
( @bekkou68, http://www.bekkou68.com/ )
こんにちは、bekkouこと角掛(つのかけ)です。ギリギリ昭和生まれの永和シス
テムマネジメントの新入社員です。以前のメルマガ(2010-32号)で、『IT業界を
楽しく生き抜くための「つまみぐい勉強法」』の書評を書きました。肩の力を
抜いて、無理せず自分にあった勉強方法が掲載されているので、みなさんも是
非!また、夏イベントの若人セッションで話しました。多くのすごい人や楽し
い人たちに会えて沢山の刺激を受けました。
技術そのものが好きというよりは、何かを実現するための手段としての技術が
好きです。恥ずかしながら、この技術を勉強する!というのはあまり長続きし
ないです。実現したいことを先に決めて、その手段としての技術なら勉強でき
ます。なので、偏りとか抜け・漏れが多いです。毎日鍛えてもらってます!
最後に、自分はこんな感じに活動しています。
 Twitter: @bekkou68
 はてな : id:bekkou68
 サイト : http://www.bekkou68.com/
これからもどうぞよろしくお願いします。(bekkou)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
● ご意見、ご感想は         ⇒このメールに返信ください
〇 配信中止、アドレス変更は ⇒/community/object_ml/help/
〇 免責事項、過去の記事は   ⇒/community/object_ml/
■ 発行:オブジェクト倶楽部 ⇒http://ObjectClub.jp/
Copyright (c)2010 オブジェクト倶楽部. All Rights Reserved.
powered by Eiwa System Management, Inc.