Date:  Wed, 28 Mar 2007 17:10:03 +0900
Subject:  【オブジェクト倶楽部: 2007-11号】
X-Mail-Count: 00186

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.180 2007/03/28

■ I N D E X
┃
┣【Topics】プロジェクトファシリテーション最新プレゼンテーション公開
┣【Topics】第二回 全日本腰リールカンファレンスを開催(4/6:新宿)
┣【プログラミング】TurboGearsでPythonを始めてみよう![8]
┣【設計】ソフトウェアのお言葉[17] - 人はすぐに変われるものではない
┗【アンケート】気になるシステム業界 ホントのところ

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇 プロジェクトファシリテーション最新プレゼンテーション公開
  〇 〇━━━━━━━━━━━━━ ━━・ 

日々進化するプロジェクトファシリテーションの、最新版プレゼンテーション
資料を公開いたしました。写真や具体的な事例をますます増やし、更に皆さん
のプロジェクトファシリテーションの実践に活かしていただければと思います。
ぜひ、ご活用ください。
【オブジェクト倶楽部】http://www.ObjectClub.jp/community/pf/

久しぶりに資料をアップデートしました。みなさんからのフィードバックを頂
き、どんどん成長しています。今回のアップデートでは、アジャイルの解説を
加えたのと、後半の「原則」の部分に多く考察をいれて、ソーシャルチェンジ、
組織改革、ファシリテータの心構え、導入のヒント、導入の効果、Life Hacks
としての仕事の楽しみ、みたいなものを足しています。
(表紙の私の写真も、それっぽく(?)なっています)
加えて、プロジェクトファシリテーションのYahoo!グループ、もよろしく!
【コミュニティー】http://groups.yahoo.co.jp/group/ProjectFacilitation/
オフ会やワークショップも頻繁に開催しています。
オブジェクト倶楽部主宰 平鍋健児

〇━━━━━━━━━━━━━━━━━━━━━━━━━━━T o p i c s━
 〇 第二回 全日本腰リールカンファレンスを開催 (4/6:新宿)
  〇 〇━━━━━━━━━━━━━ ━━・ 

昨年、10月に開催いたしました第一回全日本腰リールカンファレンス。多数の
方々の参加を頂き、盛況に開催することができました。ご参加ありがとうござ
いました。「ネタイベントは一度で花々しく散るのが美しい」というご意見も
ございましたが、今回は「腰リール」というハードから、「腰リールというハー
ドの使い方」というソフト面に着目して、再びカンファレンスを開催すること
となりました。基調講演には、株式会社豆蔵の会長である羽生田栄一氏をお招
きし、長年の研究の末に培われた携帯メモ術の真髄をご紹介して頂きます。
皆さんのご参加を、お待ちしています。

主 催 : 全日本腰リール連盟(全コ連)
日 時 : 4月6日(金) 19:00-22:00(懇親会含む) 
場 所 : 新宿三井ビル34階 (株)豆蔵 トレーニングルーム
詳 細 : http://giantech.jp/wiki/WaistreelConference2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【プログラミング】TurboGearsでPythonを始めてみよう![8]

こんにちは、オブジェクト倶楽部のまおとこ、やっとむです。
いままさに桜の三分咲きがまっさかり、まあ週末まで待てば満開になるかな?
こっちの桜はあ〜まいぞっと、まったり桜饅頭食べつつ仲間を待ちたい。

■□ ジェネレータの紹介 ■□

ずいぶんと間が空いてしまいました。ついつい魔が差してPython記事を遅らせ
てしまったわけですが、間が悪いというか最近Rubyを勉強してたりして...
Railsってすごいな。いやいやTurboGearsだって負けないけど...まごまごして
るとPythonをまるで忘れられてしまいますので、またまたPython言語のすまら
しい機能をおませいたしましょう。まる。

今回紹介するのはPythonのジェネレータです[*1]。ジェネレータとは「結果を
次々に生み出す魔法のオブジェクト」です、と言うとなにやらミステリアスに
格好いいですね。もっと普通に説明すると、一連の値を返すための便利な方法
のひとつ、となります。イテレータ[*2]を簡単に作る方法とも言えます。

Pythonにはrange()という関数があります。range(10)とすると、0から9までの
数字をリストにして返してくれます。0から9の値の和を求めるには、次のよう
に書けますね。

 >>> s = 0
 >>> for i in range(10): s+=i
 ...
 >>> s
 45

同様にして、0から999999999(10億-1)の和を求めてみましょう。

 >>> for i in range(1000000000): s+=i

やってみましたか?やってみちゃったんですか?MemoryError というエラーに
なったのではないでしょうか。あまり人を信用しすぎないほうがいいですよ?
10億個の数字をリストにしようとしたら、そのへんのPCではメモリが足りるわ
けがありません。range()関数は、数列のリストを作成してくれるわけですが、
今回のように単に「数字を順番にほしい」というだけなら、すべての数字をリ
ストに格納する必要はないわけです。

そこで、xrange()関数の登場です。これはrange()と同じように使えますが、リ
ストを生成するのではなく、「順番に数を返してくれるオブジェクト」を生成
して返します。0から始めて、呼び出すたびに次の数字を返してくれます。指定
した値までいくと、StopIteration という例外を送出しますが、これで for な
どのループが終了します。xrange()を使えば、10億までの数字を計算できるわ
けです。やってみましょうか。

 >>> for i in xrange(1000000000): s+=i

やってみましたか?またやっちゃったんですか?メモリは食わないとはいえ、
そのへんのPCで10億回の計算なんて、どれだけ時間がかかることやら...(やっ
とむのThinkPad T42では7分ほどかかりましたよ。)

■□ ジェネレータを自分で書く ■□

さて、xrange()は「値を生み出すオブジェクト」を生成しました。このような
オブジェクトを、Pythonでは簡単に自分で生成できます。こんどは、フィボナッ
チ数[*3]の計算をジェネレータを使って実装してみます。

 >>> def fib():
 ...   v1 = v2 = 1
 ...   while True:
 ...     f = v1 + v2
 ...     yield f
 ...     v2 = v1
 ...     v1 = f
 ...

yieldというのがポイントです。yieldはreturnのように値を返しますが、処理
そのものは次の行へ続行します。続行して、ループを回ってまたyieldにたどり
着くと、そこで次の値を返します。そしてまた続行する...このfib()の中のロ
ジックは、無限にループします。ループしながら、yieldを実行するたびに値を
ひとつずつ取り出せるのです。

じゃあどうやって値を取り出すのでしょうか?それにはnext()を使います。
fib()を実際に使う例を示します。

 >>> f = fib()
 >>> f.next()
 2
 >>> f.next()
 3
 >>> f.next()
 5
 (...中略...)
 >>> f.next()
 17711
 >>> f.next()
 28657

fib()の戻り値が、ジェネレータオブジェクトになります。このオブジェクトに
対してnext()を呼ぶと、yield1回分の結果が返ってきます。呼べば呼ぶだけ、
先の値を計算して取り出すことができます。これが面白いところで、何回計算
するかを事前に指定しなくてよいわけです。無限に計算するような処理を書い
て、何回繰り返すかは後で指定できる。ジェネレータを使わないと、なかなか
こうはいきません。

■□ ジェネレータの活用方法 ■□

また、for 文で値を取り出すこともできます。以下のようにすると、フィボナッ
チ数が終了するまで繰り返します。実際にはnext()よりこっちの使い方のほう
が多いかもしれません。

 >>> for f in fib(): print f

やってみましたか?やってない?ひっかかるわけないだろうって?なかなかや
りますね。当然ですがフィボナッチ数が「終了する」ということはないので、
これを実行すると無限に計算して無限に表示することになります。まあ、せっ
かくなのでやってみてください。CTRL-Cでいつでも止められるし。

途中で終了したい場合には、yieldせずに関数を終了すると、それ以上値がない
ということになります。単純な例ですが、次の例は3つ値を返して終了します。

 >>> def count_three():
 ...   yield 'スリー!'
 ...   yield 'ツー!'
 ...   yield 'ワン!'
 ...   return
 ...
 >>> for n in count_three(): print n
 ...
 スリー!
 ツー!
 ワン!

さらに、リスト内包表記と似た書き方で、ジェネレータを作ることもできます。
まず内包表記で、もとのリスト lst の各要素を2倍したリストを作ってみます。

 >>> lst = [1,2,3]
 >>> [v*2 for v in lst]
 [2, 4, 6]

次にジェネレータ式[*4]を使ってみましょう。よく似た形ですが、括弧の種類
が違います。結果も、next()で取り出せます。最後の値を過ぎて取り出そうと
するとStopIteration 例外が発生します。

 >>> g = (v*2 for v in lst)
 >>> g.next()
 2
 >>> g.next()
 4
 >>> g.next()
 6
 >>> g.next()
 Traceback (most recent call last):
   File "<stdin>", line 1, in ?
 StopIteration

これもrange()とxrange()の関係と同じで、必要な分しか計算しないので処理が
無駄にならず、またメモリ消費もジェネレータのほうが有利です。

■□ まとめ ■□

計算に限らず、ファイルの読み込みや、データベースからデータを複数件取得
したり、値を見て終了判定する場合など、いつ終了するかわからない処理を素
直に書けるのがジェネレータの利点です。検索結果を画面に表示できるだけ取
得するとか、ユーザーから入力を1つずつ受け取って処理するとか、ストリーミ
ングに使うとか、応用はいろいろ考えられます。

Pythonではジェネレータやジェネレータ式はとてもポピュラーです。普通にイ
テレータを書くより簡単ですし、うまく使うと、処理のロジックと終了判定を
分離して記述でき、シンプルな設計ができます。ぜひ使ってみてください。
余談ですが、RubyでもGeneratorというモジュールでジェネレータが使えます。
実行速度に難があってあまりポピュラーではないみたいです。Pythonの感覚で
普通に使ってみたら、角谷さんに「普通にGenerator使う人は初めて見た」と誉
められ(?)ちゃいました。(やっとむ)

[*1] http://www.python.jp/doc/2.4/tut/node11.html#SECTION0011900000000000000000

[*2] http://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%86%E3%83%AC%E3%83%BC%E3%82%BF

[*3] F(1)=1,F(2)=1から始まり、F(n)=F(n-1)+F(n-2)で求まる関数。つまり、直
     前の2つの和で、次の数が決まる。

[*4] http://www.python.jp/doc/2.4/ref/genexpr.html
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E009-7&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E009-7&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E009-7&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2 n d ■━
■
┗【設計】ソフトウェアのお言葉[17] - 人はすぐに変われるものではない

こんにちは、天野勝です。
今回のお言葉は「人はすぐに変われるものではない」[*1]です。今回も筆者の
独断と偏見で、解釈、解説してみます。

●人は過去の経験に縛られる
多くの方が変わりたいという願望は持っていても、それを誰かから強制的に変
えられるというのはなかなか受け入れにくいのものではないでしょうか。例え
それが悪習であると本人が認識していてもなかなか正すのは難しいものです。
人はこれまでの過去からの経験を積み重ねて生きています。人の行動には、そ
の過去から得たものが反映されるのです。
しかし、人は何かのきっかけで変わることができます。

●オブジェクト指向プログラミングにおける過去からの呪縛
筆者が、はじめてJavaScript(ECMA Script)の言語仕様を調べたときのお話をし
ます。
当時、筆者が扱えるようになっていたオブジェクト指向言語として、LotusScript
とJavaがありました。これらは、classというキーワードでクラスを宣言し、そ
のインスタンスを作成するにはnewというキーワードを使います。また、キーワー
ドこそ違えど、クラス名の後ろにスーパークラスの名前を連ねて書くことで実
装の継承ができます。
このような言語を使用してプログラミングをしていたとうい背景もあり、オブ
ジェクト指向言語であるJavaScriptでは、どうやってクラスを定義するのか調
べてみました。しかし、すぐにはその定義方法が分かりませんでした。
さらに詳しく調べていくと、オブジェクト指向的なプログラムをするにはfunction
を定義すればいいらしい、ということが分かってきました。そして、function
がオブジェクトだというのです。これは、当時の筆者にはなんとも理解しがた
いことでした。結局、その開発プロジェクトでは、JavaScriptでオブジェクト
指向プログラミングをはしないという決定をしました。
今から思うと、ずいぶんいい加減な調査だったとは思いますが、当時の筆者に
はオブジェクト指向といえば、クラスの存在なくして成り立たないものだった
のです。それ以外のことを受け入れず、思考停止状態になっていたようです。
その何年か後、「プロトタイプベースのオブジェクト指向」という概念を教わ
り、JavaScriptを見る目が変わったのです。プロトタイプベースのオブジェク
ト指向の概念を知ったのが、変化のきっかけとなったのです。

●オブジェクト指向プログラミングにクラスは必要ない
プログラムは実行されてこそ価値のあるものです。実行時だけ考えれば、オブ
ジェクトだけあれば十分なので、インスタンスを生成するためだけのクラスは
特に必要としないのです。これまで、筆者が使用してきたオブジェクト指向言
語は、クラスベースのオブジェクト指向言語と呼ばれているものだったのです。
プロトタイプベースのオブジェクト指向言語では、既存のオブジェクトを複製
することで新たなオブジェクトを作り出します。新たな機能が必要ならば、複
製されたオブジェクトにメソッドを追加します。GoFのデザインパターンに収録
されている「プロトタイプパターン」に似ているといえば分かりやすいかもし
れません。
同じ「オブジェクト指向というパラダイム」の中にあっても、クラスベースと、
プロトタイプベースでは考え方に異なる点があります。ですので、クラスベー
スで有用とされている設計技法や、デザインパターンのいくつかは、その効果
を十分に発揮できないことでしょう。
GoFのデザインパターンのほとんどがクラスベースを前提としています。筆者は
クラスベースに慣れてしまっているので、このクラスベース考え方を、無理や
りにプロトタイプベースにあてはめて考えてしまいます。でもこれでは、秘め
られた能力を開放しきれてないように感じます。もったいないですが、やっぱ
り人はすぐには変われないものですね。

●おわりに
今回は、現在主流となっているクラスベースと、これからが期待されるプロト
タイプベースという二つの考え方を紹介しました。
人はすぐには変われません。筆者のようなクラスベースの考え方しかない人た
ちが、プロトタイプベースの考え方もできるようになるにはどのぐらいの時間
がかかるのでしょうか。最近は、考え方の変化が加速してきているようですが、
まだまだな感じがします。ここしばらくは、この変化の速さを楽しみたいと思
います。これまで気づかずに縛られていた制約を取り払うことが、人類の革新
の第一歩かもしれません。(天野勝)

[1]:『XPエクストリーム・プログラミング入門―変化を受け入れる 第2版』P.34
     著:ケント ベック、監訳:長瀬 嘉秀
     ピアソン・エデュケーション(2005)
     http://amazon.co.jp/o/ASIN/4894716852/xpjp-22
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=L001-16&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=L001-16&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=L001-16&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━3 r d ■━
■
┗【アンケート】気になるシステム業界 ホントのところ

今週は「新しい季節にやめることって?」のホントのところ。新しい季節に始
めることは多いと思います。毎年増えて行くばかりで、しかも継続しないと落
第気分になりませんか?今回は思い切って「やめること」について考えてみま
した。読者の皆さんが、一番やめたいと思っていることを教えてください。

  健康を害するようなこと。(例)不摂生・睡眠不足など
     http://www.ObjectClub.jp/special/kininaru/vote?vol=146&choice=0
  お金の無駄遣い。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=146&choice=1
  仕事しすぎ。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=146&choice=2
  悪い人間関係。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=146&choice=3
  だらだらすること。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=146&choice=4
  一生懸命。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=146&choice=5
  それは秘密です。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=146&choice=6
  ちょっと語らせて!
     詳細をこのメールに返信ください!!

アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「マインドマップを何に使いますか?」の結果は公開中。ぜひご覧
下さい。
⇒http://www.ObjectClub.jp/special/kininaru/vol145/PlonePopoll_results2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。今日はいよいよこれから春イベントの「天野カンファ
レンス」です。ドキドキしますね〜!楽しみです。今回も沢山の皆さんにご参
加いただきました。ありがとうございます。この嬉しい気持ちが、夏イベント
準備のガソリンになりそうです!夏イベントも、どうぞよろしく〜♪

オブジェクト倶楽部4月カレンダーの電子データを公開します。
4月のテーマは「ホワイトボード」。もう既に多くの皆さんが、アジャツールと
して使い始めているようです。
http://www.ObjectClub.jp/special/#calendar

今週の強引な一言
*** 会うは別れの始め(ことわざ)***
出会ったときから別れは始まっているという意味で、人生の無常を表している
言葉。皆さんが作っているソフトウェアも、変更や使われなくなることを頭に
おいてみると、今やることにどんな変化があるのでしょうか?(上田雅美)

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