日々進化するプロジェクトファシリテーションの、最新版プレゼンテーション資料を公開いたしました。写真や具体的な事例をますます増やし、更に皆さんのプロジェクトファシリテーションの実践に活かしていただければと思います。【オブジェクト倶楽部】http://www.ObjectClub.jp/community/pf/久しぶりに資料をアップデートしました。みなさんからのフィードバックを頂き、どんどん成長しています。Hacksとしての仕事の楽しみ、みたいなものを足しています。(表紙の私の写真も、それっぽく(?)なっています)加えて、プロジェクトファシリテーションのYahoo!グループ、もよろしく!【コミュニティー】http://groups.yahoo.co.jp/group/ProjectFacilitation/オフ会やワークショップも頻繁に開催しています。昨年、10月に開催いたしました第一回全日本腰リールカンファレンス。多数の方々の参加を頂き、盛況に開催することができました。ご参加ありがとうございました。「ネタイベントは一度で花々しく散るのが美しい」というご意見もございましたが、今回は「腰リール」というハードから、「腰リールというハードの使い方」というソフト面に着目して、再びカンファレンスを開催することとなりました。基調講演には、株式会社豆蔵の会長である羽生田栄一氏をお招きし、長年の研究の末に培われた携帯メモ術の真髄をご紹介して頂きます。皆さんのご参加を、お待ちしています。┗【プログラミング】TurboGearsでPythonを始めてみよう![8]こんにちは、オブジェクト倶楽部のまおとこ、やっとむです。いままさに桜の三分咲きがまっさかり、まあ週末まで待てば満開になるかな?こっちの桜はあ〜まいぞっと、まったり桜饅頭食べつつ仲間を待ちたい。■□ずいぶんと間が空いてしまいました。魔が差してPython記事を遅らせてしまったわけですが、間が悪いというか最近Rubyを勉強してたりして...Railsってすごいな。いやいやTurboGearsだって負けないけど...まごまごしてるとPythonをまるで忘れられてしまいますので、またまたPython言語のすまらしい機能をおませいたしましょう。今回紹介するのはPythonのジェネレータです[*1]。ジェネレータとは「結果を次々に生み出す魔法のオブジェクト」です、と言うとなにやらミステリアスに格好いいですね。普通に説明すると、一連の値を返すための便利な方法のひとつ、となります。イテレータ[*2]を簡単に作る方法とも言えます。Pythonにはrange()という関数があります。range(10)とすると、0から9までの数字をリストにして返してくれます。0から9の値の和を求めるには、次のように書けますね。45同様にして、0から999999999(10億-1)の和を求めてみましょう。いうエラーになったのではないでしょうか。人を信用しすぎないほうがいいですよ?10億個の数字をリストにしようとしたら、そのへんのPCではメモリが足りるわけがありません。今回のように単に「数字を順番にほしい」というだけなら、すべての数字をリストに格納する必要はないわけです。そこで、xrange()関数の登場です。これはrange()と同じように使えますが、リストを生成するのではなく、「順番に数を返してくれるオブジェクト」を生成して返します。0から始めて、呼び出すたびに次の数字を返してくれます。xrange()を使えば、10億までの数字を計算できるわけです。T42では7分ほどかかりましたよ。■□さて、xrange()は「値を生み出すオブジェクト」を生成しました。このようなオブジェクトを、Pythonでは簡単に自分で生成できます。こんどは、フィボナッチ数[*3]の計算をジェネレータを使って実装してみます。...yieldというのがポイントです。yieldはreturnのように値を返しますが、処理そのものは次の行へ続行します。続行して、ループを回ってまたyieldにたどり着くと、そこで次の値を返します。続行する...このfib()の中のロジックは、無限にループします。ループしながら、yieldを実行するたびに値をひとつずつ取り出せるのです。やって値を取り出すのでしょうか?それにはnext()を使います。fib()を実際に使う例を示します。28657fib()の戻り値が、ジェネレータオブジェクトになります。このオブジェクトに対してnext()を呼ぶと、yield1回分の結果が返ってきます。先の値を計算して取り出すことができます。これが面白いところで、何回計算するかを事前に指定しなくてよいわけです。無限に計算するような処理を書いて、何回繰り返すかは後で指定できる。ジェネレータを使わないと、なかなかこうはいきません。文で値を取り出すこともできます。以下のようにすると、フィボナッチ数が終了するまで繰り返します。実際にはnext()よりこっちの使い方のほうが多いかもしれません。fやってみましたか?やってない?ひっかかるわけないだろうって?なかなかやりますね。当然ですがフィボナッチ数が「終了する」ということはないので、これを実行すると無限に計算して無限に表示することになります。CTRL-Cでいつでも止められるし。途中で終了したい場合には、yieldせずに関数を終了すると、それ以上値がないということになります。単純な例ですが、次の例は3つ値を返して終了します。!さらに、リスト内包表記と似た書き方で、ジェネレータを作ることもできます。各要素を2倍したリストを作ってみます。6]次にジェネレータ式[*4]を使ってみましょう。似た形ですが、括弧の種類が違います。結果も、next()で取り出せます。StopIterationこれもrange()とxrange()の関係と同じで、必要な分しか計算しないので処理が無駄にならず、またメモリ消費もジェネレータのほうが有利です。直に書けるのがジェネレータの利点です。得するとか、ユーザーから入力を1つずつ受け取って処理するとか、ストリーミングに使うとか、応用はいろいろ考えられます。Pythonではジェネレータやジェネレータ式はとてもポピュラーです。普通にイテレータを書くより簡単ですし、うまく使うと、処理のロジックと終了判定を分離して記述でき、シンプルな設計ができます。余談ですが、RubyでもGeneratorというモジュールでジェネレータが使えます。実行速度に難があってあまりポピュラーではないみたいです。Pythonの感覚で普通に使ってみたら、角谷さんに「普通にGenerator使う人は初めて見た」と誉められ(?)ちゃいました。F(1)=1,F(2)=1から始まり、F(n)=F(n-1)+F(n-2)で求まる関数。前の2つの和で、次の数が決まる。http://www.python.jp/doc/2.4/ref/genexpr.html_______________________________________________________________________この記事への評価にご協力をお願いします。URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用のブラウザに表示されれば投票完了です。人はすぐに変われるものではないこんにちは、天野勝です。今回のお言葉は「人はすぐに変われるものではない」[*1]です。今回も筆者の独断と偏見で、解釈、解説してみます。●人は過去の経験に縛られる多くの方が変わりたいという願望は持っていても、それを誰かから強制的に変えられるというのはなかなか受け入れにくいのものではないでしょうか。それが悪習であると本人が認識していてもなかなか正すのは難しいものです。人はこれまでの過去からの経験を積み重ねて生きています。人の行動には、その過去から得たものが反映されるのです。人は何かのきっかけで変わることができます。Script)の言語仕様を調べたときのお話をします。当時、筆者が扱えるようになっていたオブジェクト指向言語として、LotusScriptとJavaがありました。これらは、classというキーワードでクラスを宣言し、そのインスタンスを作成するにはnewというキーワードを使います。このような言語を使用してプログラミングをしていたとうい背景もあり、オブジェクト指向言語であるJavaScriptでは、どうやってクラスを定義するのか調べてみました。その定義方法が分かりませんでした。詳しく調べていくと、オブジェクト指向的なプログラムをするにはfunctionを定義すればいいらしい、ということが分かってきました。functionがオブジェクトだというのです。これは、当時の筆者にはなんとも理解しがたいことでした。結局、その開発プロジェクトでは、JavaScriptでオブジェクト指向プログラミングをはしないという決定をしました。今から思うと、ずいぶんいい加減な調査だったとは思いますが、当時の筆者にはオブジェクト指向といえば、クラスの存在なくして成り立たないものだったのです。それ以外のことを受け入れず、思考停止状態になっていたようです。その何年か後、「プロトタイプベースのオブジェクト指向」という概念を教わり、JavaScriptを見る目が変わったのです。プロトタイプベースのオブジェクト指向の概念を知ったのが、変化のきっかけとなったのです。●オブジェクト指向プログラミングにクラスは必要ないプログラムは実行されてこそ価値のあるものです。実行時だけ考えれば、オブジェクトだけあれば十分なので、インスタンスを生成するためだけのクラスは特に必要としないのです。語は、クラスベースのオブジェクト指向言語と呼ばれているものだったのです。プロトタイプベースのオブジェクト指向言語では、既存のオブジェクトを複製することで新たなオブジェクトを作り出します。製されたオブジェクトにメソッドを追加します。GoFのデザインパターンに収録されている「プロトタイプパターン」に似ているといえば分かりやすいかもしれません。同じ「オブジェクト指向というパラダイム」の中にあっても、クラスベースと、プロトタイプベースでは考え方に異なる点があります。クラスベースで有用とされている設計技法や、デザインパターンのいくつかは、その効果を十分に発揮できないことでしょう。GoFのデザインパターンのほとんどがクラスベースを前提としています。筆者はクラスベースに慣れてしまっているので、このクラスベース考え方を、無理やりにプロトタイプベースにあてはめて考えてしまいます。これでは、秘められた能力を開放しきれてないように感じます。もったいないですが、やっぱり人はすぐには変われないものですね。●おわりに今回は、現在主流となっているクラスベースと、これからが期待されるプロトタイプベースという二つの考え方を紹介しました。人はすぐには変われません。筆者のようなクラスベースの考え方しかない人たちが、プロトタイプベースの考え方もできるようになるにはどのぐらいの時間がかかるのでしょうか。最近は、考え方の変化が加速してきているようですが、まだまだな感じがします。ここしばらくは、この変化の速さを楽しみたいと思います。これまで気づかずに縛られていた制約を取り払うことが、人類の革新の第一歩かもしれません。http://amazon.co.jp/o/ASIN/4894716852/xpjp-22_______________________________________________________________________この記事への評価にご協力をお願いします。URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用のブラウザに表示されれば投票完了です。ホントのところ今週は「新しい季節にやめることって?」のホントのところ。新しい季節に始めることは多いと思います。第気分になりませんか?今回は思い切って「やめること」について考えてみました。読者の皆さんが、一番やめたいと思っていることを教えてください。健康を害するようなこと。