Date:  Wed, 25 Oct 2006 17:17:03 +0900
Subject:  【オブジェクト倶楽部: 2006-40号】
X-Mail-Count: 00167

       ┏━━━━━━━━━━━━━━━━━━━━━━━━━━■
       ┃                         ■┃
      ●┃● ● オ ブ ジ ェ ク ト 倶 楽 部   ■ ┃
       ┃                       ■  ┃
       ┗━━━━━━━━━━━━━━━━━━━━━━■━━━┛
                          No.161 2006/10/25

■ I N D E X
┃
┣【コラム】O-One参加レポート
┣【プログラミング】ゆるーいHaskell[6]
┣【コラム】平鍋健児のちょっと息抜き[1]
┗【アンケート】気になるシステム業界 ホントのところ

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━1 s t ■━
■
┗【コラム】O-One参加レポート

はじめまして。オブジェクト倶楽部の平田です。
昨日(10月24日)、O-Oneというイベントに参加してきました。その参戦レポート
を書かせていただきたいと思います。

O-Oneとは技術者たちが集まって、特定のテーマに関してディベートをしようと
いうイベント[*1]です。技術がテーマですが、くじ引きで肯定側、否定側を決
めて、純粋にディベートを楽しむ企画です。今回が第3回の開催で、過去2回の
ディベートにはオブジェクト倶楽部からも平鍋、岡島が参戦して、惜しくも優
勝を逃しています。そのため、「今回こそは優勝を」というプレッシャーの中、
僕がディベーターとして参戦しました。

前日に与えられたテーマに対して、事前に戦略を立てて臨んだものの、結果は
残念ながら1回戦負け。今回の大会で優勝された方に惨敗してしまいました。
敗因は極度の緊張に加えて、日頃の仕事から売りにしている「誠実さ」が裏目
に出てしまったことかなと考えています。モデレータ役の方からの誘導尋問に
見事に引っかかり続けてしまいました。自分の気持ちを隠して「大人のエンジ
ニア」として振舞うにはもう少し訓練が必要なようです。

とはいえ、自分の本来の意見と反対の意見を通すために、いろいろと戦略を練っ
て戦えたのは楽しい経験でした。ぜひ皆さんも次回(開催時期未定)、ディベー
ターとして参戦されてみてはいかがでしょうか?

え、僕ですか?結果にはとても不満なので、次回もぜひ参戦しようと思ってい
ます。次回は優勝狙います!対戦相手待ってます!とはいえ、オブジェクト倶
楽部から新たな刺客の可能性も!?(平田)

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

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━2 n d ■━
■
┗【プログラミング】ゆるーいHaskell[6]

西川です。会社に来る時間を以前より1時間ほど早くしました。おかげで早寝早
起きができるようになり体調が良くなった気がします。気のせいかもしれませ
んが。
今回はタプル(tuple)の紹介をします。タプルはいくつかの値をひとつにまとめ
る機能です。リストとは異なり、違った型を持つ値もひとつのタプルとして扱
うことができます。いつものようにghciを起動しましょう。

> ghci

Prelude> :t (1,2)
(1,2) :: (Num a, Num b) => (a, b)
Prelude> :t (1,2,3,4)
(1,2,3,4) :: (Num a, Num b, Num c, Num d) => (a, b, c, d)
Prelude> :t (1,2,"hoge")
(1,2,"hoge") :: (Num a, Num b) => (a, b, [Char])

要素が2つのタプルを受け取って(+)する関数addを作ってみましょう。

Prelude> let add (x,y) = x + y
Prelude> :t add
add :: (Num b) => (b, b) -> b

add関数がNumクラスのインスタンスである要素を2つもつタプルを引数にとるこ
とが解ります。クラスやインスタンスについてはいずれお話します。いまのと
ころは「Numクラスのインスタンスである」は「数字である」と読みかえてし
まっても構いません。とりあえず実行してみましょう。

Prelude> add (1,2)
3
Prelude> add (1,2,3)
(エラーメッセージが表示されます)
Prelude> add (1,"hoge")
(エラーメッセージが表示されます)

タプルの要素が2つの場合はうまくいきますが、タプルの要素が3つになったり、
タプルの要素にStringが入ったりするとadd関数がうまく実行できません。要素
が2つのタプルを1つ引数としてもつ関数は、要素が3つのタプルを引数としてと
ることができません。タプルの要素数、要素それぞれの型も Haskellの型チェッ
クの対象となるからです。
それではタプルを使った関数をいくつか紹介します。

■zip関数
zip関数はリストを2つ受け取ってリストの要素の1つ1つをタプルにする関数で
す。タプルのリストを返しますが、リストの要素数はzip関数の2つの引数のう
ち要素数が少ないほうにアラインされます。今回紹介するのはタプルの要素を
2つ持つzip関数ですが、タプルの要素を3つ持つzip3,4つ持つzip4という関数も
あります。

Prelude> :t zip
zip :: [a] -> [b] -> [(a, b)]
Prelude> zip [1,2,3,4] [5,6,7,8]
[(1,5),(2,6),(3,7),(4,8)]
Prelude> zip [1,2,3] [5,6,7,8]
[(1,5),(2,6),(3,7)]
Prelude> zip [1,2,3,4] []
[]

■unzip関数
unzip関数はzip関数の反対でタプルのリストを引数にとり、リストのタプルを
返す関数です。zip関数と同じようにunzip3,unzip4などの関数もあります。

Prelude> :t unzip
unzip :: [(a, b)] -> ([a], [b])
Prelude> unzip [(1,2),(3,4),(5,6),(7,8)]
([1,3,5,7],[2,4,6,8])

■curry関数
curry関数は引数2つからタプルを作成し、タプルを引数として持つ関数を適用
します。さきほど作ったadd関数をそのまま使います。

Prelude> :t add
add :: (Num t) => (t, t) -> t
Prelude> :t curry
curry :: ((a, b) -> c) -> a -> b -> c
Prelude> curry (add) 1 2
3

curry関数を使うことで明示的にタプルを作らなくてもadd関数を実行すること
ができました。curry関数も前回紹介した高階関数です。

■uncurry関数
uncurry関数はcurry関数と逆にタプルを引数にとって、引数を2つとる関数を適
用します。uncurry関数ももちろん高階関数です。

Prelude> :t (-)
(-) :: (Num a) => a -> a -> a
Prelude> :t uncurry
uncurry :: (a -> b -> c) -> (a, b) -> c
Prelude> uncurry (-) (1,2)
-1

uncurry関数を使うことで明示的にタプルからデータを取り出したりせず、その
まま(-)関数を実行できました。curry関数やuncurry関数などの高階関数を使う
と、データを取り出してhogehogeするなど余計な処理が必要なくなり、処理が
簡潔で解りやすくなります。
練習として名前をアルファベット順でソートしてインデックスをつけて文字列
にする処理をzipやuncurryを使って書いてみましょう。

(例)
Prelude> let names =
["Akahoshi","Toritani","Kanemoto","Hamanaka","Yano","Igawa","Fujikawa"]
Prelude> let showName idx name = show idx ++ ":" ++ name
Prelude> map (uncurry showName) $ zip [1..] (Data.List.sort names)
["1:Akahoshi","2:Fujikawa","3:Hamanaka","4:Igawa","5:Kanemoto","6:Toritani","7:Yano"]

簡単に解説します。まず"Data.List.sort names"でリストnamesをソートします。

Prelude> Data.List.sort names
["Akahoshi","Fujikawa","Hamanaka","Igawa","Kanemoto","Toritani","Yano"]

"zip [1..] (Data.List.sort names)"で1からはじまる無限リストとソートした
名前のリストとをzipします。zip関数ではリストの要素が短いほうにアラインさ
れるので無限リストを使うことができます。

Prelude> zip [1..]
["Akahoshi","Fujikawa","Hamanaka","Igawa","Kanemoto","Toritani","Yano"]
[(1,"Akahoshi"),(2,"Fujikawa"),(3,"Hamanaka"),(4,"Igawa"),(5,"Kanemoto"),(6,"Toritani"),(7,"Yano")]

"map (uncurry showName) $ zip [1..] (Data.List.sort names)"でmap関数を
使ってzipしたタプルのひとつひとつに"uncurry showName"を適用します。試し
に"uncurry showName"を1つのタプルに適用してみます。

Prelude> uncurry showName (1, "Akahoshi")
"1:Akahoshi"

これが先ほど作ったタプルのリスト全てに適用されるので、以下のようになります。

Prelude> map (uncurry showName)
[(1,"Akahoshi"),(2,"Fujikawa"),(3,"Hamanaka"),(4,"Igawa"),(5,"Kanemoto"),(6,"Toritani"),(7,"Yano")]
["1:Akahoshi","2:Fujikawa","3:Hamanaka","4:Igawa","5:Kanemoto","6:Toritani","7:Yano"]

ちょっと難しかったでしょうか。せっかく紹介したのでzipとuncurryを使って
処理を書いてみました。今回は紹介しませんでしたが、実はzipWith関数を使っ
た方がもっとすっきり処理を書けます。暇だったら挑戦してみましょう。次回
はカリー化や関数合成のことをお話します。(西川)
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
良かった:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E008-5&choice=0
普通:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E008-5&choice=1
イマイチ:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=E008-5&choice=2

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━3 r d ■━
■
┗【コラム】平鍋健児のちょっと息抜き[1]

【福井の名産】へしこ

みなさん、「へしこ」ってご存知ですか?福井の名産で、サバの糠漬けです。
焼いたものを、朝ごはんに乗っけるのが最高で、かなり塩辛いので、ひと片で
ごはん一杯食べられます。また、お酒のつまみにもグッド、さらに、お茶漬け
の具にも最適という優れもの。

へしこは、しょっぱさの加減が難しく、辛すぎても、薄味すぎても美味しくな
いんです。(なんだか、「現実的なオブジェクト指向開発」に似てますね。どこ
が?!)ちょうどよい漬かり具合のへしこやフレームワークに出会うと、幸せに
なれます。

先週、とても美味しいへしこを頂いて、びっくりしたのですが、薄切りにして
生でも行けるんです。サバ寿司の塩っ辛いバージョン、という感じ。
みなさんも、福井に来たら、ぜひ「へしこ」をお試してください(^_^)。

※リクエストが多ければ、次回のオブジェクト倶楽部クリスマスイベントの景
  品にします、以下のアンケートに返答ください(平鍋)。
_______________________________________________________________________
この記事への評価にご協力をお願いします。
URLをクリックして、「ご協力ありがとうございました」のメッセージがご使用
のブラウザに表示されれば投票完了です。
へしこの景品がよい:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=H003-18&choice=0
あれば、ほしい:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=H003-18&choice=1
ていうか、そんな生モノはいらない:
http://www.ObjectClub.jp/community/object_ml/estimate?vol=H003-18&choice=2
ちょっと語らせて!
詳細をこのメールに返信ください!!

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

今週は「1ヶ月のお小遣いいくらですか?」のホントのところ。気が早い話で
すが、これから年末に向かうにしたがってイベントもいっぱい。その他に、メー
カーやショップのボーナス商戦に刺激されて新製品がほしくなってしまいます
ね。さて、今週はお小遣いについてです。生活費を差し引いてあなたが1ヶ月間
に好きなものに使えるお金はいくらぐらいですか?細かいことは気にせず、だ
いたいの金額でお答えくださいね。

  1〜10,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=127&choice=0
  10,001〜20,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=127&choice=1
  20,001〜30,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=127&choice=2
  30,001〜50,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=127&choice=3
  50,001〜70,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=127&choice=4
  70,001〜100,000円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=127&choice=5
  100,001〜それ以上。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=127&choice=6
  0円。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=127&choice=7
  それは秘密です。
     http://www.ObjectClub.jp/special/kininaru/vote?vol=127&choice=8
  ちょっと語らせて!
     詳細をこのメールに返信ください!!

アンケート結果はオブジェクト倶楽部サイト上にて公開します。お楽しみに。
なお、前号「オブラブイベントのこれが面白そうだな」の結果は公開中。ぜひ
ご覧下さい。
⇒http://www.ObjectClub.jp/special/kininaru/vol126/PlonePopoll_results2
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━--■--●--■
■
┗編集後記

こんにちは、編集人です。秋イベントの申し込みがあっという間に定員数に達
しました。ありがとうございます。スタッフ一同感謝感激で大喜びです。
その一方で「あぁ、残念ながら逃してしまったぁ」という声を聞くと居ても立っ
ても居られません。早速事務局長に直談判してきますよ!任せてください!
来週をお楽しみに!
そう言いつつ、冬のクリスマスイベントも準備開始です。1年が過ぎるのは早い
なぁ。

今週の強引な一言
*** あばたもえくぼ(ことわざ)***
惚れると、顔に残っている痘痕(あばた)までえくぼのように見えることから、
好きになったらとことん良く見えてしまうという意味。その魔法が解けて、びっ
くりしても後の祭りです。しかし、冷静な目で見たときにこそ、相手の本当に
素敵なところを発見することができるのかもしれませんね。(上田雅美)

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