Archive for December, 2009

* Ruby Facets(Core)でおしゃれRuby!

Posted on December 24th, 2009 by tomoya. Filed under 書いた.


(この記事はRuby Advent Calendar jp: 2009の24日目です. 前日はursmさん、明日はtechnohippyさんです。
普段、技術的なことはwww.nicecabbage.comで書いていますが、今回は企画ものなので日本語で書いてみます。)

メリークリスマスイブ!
こんな聖なる夜に、他人のブログを読んでいる人なんていないと知りながら、投稿します。

この記事では、「Ruby Facets」ライブラリを紹介したいと思います。

Rubyは簡単に基本クラスを拡張できることから、より便利に、あるいは暗黒的に使うためのライブラリがたくさんありますね。”2.days.ago”で一躍評判となったRailsのActiveSupportや、”require :merb / :core_ext / :lib”でおなじみのMerbのextlibが有名です。

Ruby Facetsも、そんなライブラリのひとつ。Rubyをほんのりおしゃれに、ちょっぴりスパイシーにしちゃいます。

どんなことができるのか、つまみ食い形式でご紹介しましょう。

Array

Arrayの積を求める(デカルト積というらしい)

%w(Chapman Cleese Gilliam) ** %w(ham egg spam)
#=>
[["Chapman", "ham"], ["Chapman", "egg"], ["Chapman", "spam"],
["Cleese", "ham"], ["Cleese", "egg"], ["Cleese", "spam"],
["Gilliam", "ham"], ["Gilliam", "egg"], ["Gilliam", "spam"]]

組み合わせを求める

%w(Chapman Cleese Gilliam).combination(2).to_a
#=> [["Chapman", "Cleese"], ["Chapman", "Gilliam"], ["Cleese", "Gilliam"]]

Arrayのおしりに詰め物をする

%w(k t k r).pad(10, "!")
#=> ["k", "t", "k", "r", "!", "!", "!", "!", "!", "!"]

セパレータを複数指定できるjoin

["Crosby", "Stils", "Nash", "Young"].conjoin(', ', ' & ')
#=> "Crosby, Stils, Nash & Young"

Enumerable

EnumerableをごにょごにょするときのECOモード「Denumerable」
(select, mapなどはフィルタのように働き、中間のオブジェクトを生成しない)

arr = (1..100).to_a
class << arr
  include Denumerable
end
puts arr.select{|n| n%10==0}.map{|n| n**2}.to_a

グループ化

(1970..1990).group_by{|y| y < 1989 ? 'showa' : 'heisei' }
#=>
{"heisei"=>[1989, 1990],
"showa"=>[1970, 1971, 1972, 1973, 1974, 1975, 1976, 1977, 1978, 1979, 1980, 1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988]}

MapしてHashしたいから、Mash!

[:year, :month, :day].mash{|sym| [sym, Date.today.send(sym)]}
#=> {:day=>24, :month=>12, :year=>2009}

最頻出要素(modeは統計用語だそうです)

%w(ham egg spam egg spam egg).mode #=> ["egg"]

出現する確率

%w(ham egg spam egg spam egg).probability
#=> {"egg"=>0.5, "spam"=>0.333333333333333, "ham"=>0.166666666666667}

出現する個数

%w(ham egg spam egg spam egg).frequency
 #=> {"egg"=>3, "spam"=>2, "ham"=>1}

エントロピー増大の法則

%w(ham egg ham egg ham egg).entropy #=> 1.0
%w(ham egg ham egg ham spam).entropy #=> 1.45914791702724
%w(ham egg spam! egg ham spam).entropy #=> 1.91829583405449
%w(ham egg spam! spam!! ham spam).entropy #=> 2.25162916738782
%w(ham egg spam! spam!! spam!!! spam).entropy #=> 2.58496250072116
%w(spam!!!! egg spam! spam!! spam!!! spam).entropy #=> 2.58496250072116
%w(spam!!!! spam!!!!! spam! spam!! spam!!! spam).entropy #=> 2.58496250072116

Hash

Hashだって、時にはArrayのように振る舞わせたいものです。

{ :john=>'lennon'} + { :ono=>'yoko'} #=> {:john=>"lennon", :ono=>"yoko"}
{ :john=>'lennon', :ono=>'yoko'} - { :john=>'lennon'} #=> {:ono=>yoko}
{ :john=>'lennon', :ono=>'yoko'}.join(' ', ', ') #=> "john lennon, ono yoko"

Object

Object#newのProc化

class Monty
  def initialize(name); @name = name end
end
%w(Chapman Cleese Gilliam).map &Monty
 
 #=> [#<Monty:0x1254a6c @name="Chapman">,
 #<Monty:0x1254a30 @name="Cleese">,
 #<Monty:0x12549f4 @name="Gilliam">]

Kernel

ファイル名、行番号つきデバッグ ‘d’(’g'とか’n'とかありますが、’d'もありますよ、ということで)

d variable
#=> [["Chapman", "Cleese", "Gilliam", "Idle", "Jones", "Palin"]] d.rb:5

仲間に入ってる?

me = "tomoya55"
monties = ["Chapman", "Cleese", "Gilliam", "Idle", "Jones", "Palin"]
me.in? monties #=> false

困ったらユーザに聞くといい

ask "Oops, I encoutered unexpected problems. Do you want to debug me?"

とまらないかも。。しれない。

loop do
  break if maybe
end

maybeはtrueになる確率を指定することができる。

# Christmas Eve by Tasturo Yamashita
maybe(0.01) ? 'she will come' : 'she will not'

だまれ!

silently do
  warn "It is a Chiristmas, stupid!"
  puts "We wish a Merry Chiristmas, We wish a Merry Chiristmas"
  STDERR.puts "****, explode!"
end
alias devnull silently

などしてみるのもいいかもしれません

Stackable

文字列をスタックのように扱う

str = "0123456"
class << str
  include Stackable
end
str.pop #=> 6
str.push("9") #=> "0123459"

Time

時の経過をはかる

Time.elapse{require 'active_support'} #=> 0.695170879364014
Time.elapse{require 'extlib'} #=> 0.185311079025269

1年前

Time.now.ago(1, :years)

1年後(引数のパターンが違うのがいやですね。こちらのCREDITはActiveSupportチームらしいです)

Time.now.advance(:years=>1)

Module

ラッパー(いわゆるデコレーター)

class ChristmasObject
  wrap(:inspect) do |orig, *args|
    "<We Wish>" + orig.call + "< a Merry Christmas!!>"
  end
end
p ChristmasObject.new #=> <We Wish>#<ChristmasObject:0x12535cc>< a Merry Christmas!!>

Symbol

~ではじまるSymbolは否定語

:friend.not? #=> false
:'~friend'.not? #=> true

String

Stringにはわさわさとメソッドが追加されています。使いやすそうなものだけ。

"ero".bracket('(') #=> "(ero)"
"ero".bracket('x') #=> "xerox"
"santa".chars #=> ["s", "a", "n", "t", "a"]
"santa clause".cleave #=> ["santa", "clause"] cleaveは「割く」という意味ぽい
 
%q(/usr/bin/ruby).quote(:b) #=> "`/usr/bin/ruby`"
%q(/usr/bin/ruby).quote(:s) #=> "'/usr/bin/ruby'"
%q(/usr/bin/ruby).quote(:d) #=> ""/usr/bin/ruby""
%q("/usr/bin/ruby").dequote #=> "/usr/bin/ruby"
 
"ham spam".rewrite([[/am/, "i"],[/\s/,'-']]) #=> "hi-spi"

まだまだありますがこのへんで、ふう〜

あまりここでは紹介していないけれど、メタプログラミングのための拡張もずいぶんなされているので、Rubyで黒魔術やるのが好きな向きには一見の価値ありだと思います。

ところで、Facets(Core)自体は、目新しい機能は何も用意しません。当たり前に使いたいメソッドを簡潔に実装したものの集まりにすぎません。たいていのメソッドの実装は数行程度で、多くても20行程度。
おそらくRubyプログラマなら、似た振る舞いをするメソッドを実装した経験も数多くあるでしょう。

このライブラリを使用する目的は、

  • 車輪の再発明なしに
  • 簡潔に
  • 正しいメソッド名で

書けることができることにつきます。つまり、コードが読みやすくなり、メンテナンスしやすくなるのですね。

正しいメソッド名とというのは、かなり重要です。
われわれ、へっぽこ日本語プログラマは、痛いクラス名、痛いメソッド名を量産してしまいがちなので、こういったライブラリから適切な英単語をパクる術を身につけておきましょう!

どれだけRuby文法的にきれいにコードを書いても、命名規則がアレげじゃあ、台無しです。
かっこいいメソッド名を使って、おしゃれRubyにしちゃいましょう。

また、実装自体が短いので、Ruby Wayなコードの書き方の参考にもなるなるです。
(ただし、テストがRSpecじゃないのが残念!)

RDocを見て、気になるメソッドがあればソースもぜひ覗いてください。
今夜さっそく気になるあの子を落とすのに役立つトリビアが待ってるかもしれません。

最後に、、、個人的な趣味で、コード例にPython的な用語を盗用してしまってごめんなさい。

.



* 一万人の第九!

Posted on December 13th, 2009 by tomoya. Filed under 行った.


12月5日6日に大阪に戻り、「一万人の第九」コンサートに参加してきました。広い大阪城ホールの中に、一万人の歌声が響いたのを聞いたときは、本当に感動的でした。
「一万人の第九」イベントは、その名の通り一万人の大合唱団でベートーヴェンの交響曲第九番を歌おうというイベントで、毎年、年末に開かれています。今年でもう27回目だそうで、知る人ぞ知る年末の恒例イベントです。
合唱隊として参加することを決めたのは今年の夏。妻に誘われて応募してみたら、見事抽選を合格し、東京クラスのレッスンを受けることができることになりました。当選して喜んでは見たものの、ぼくは合唱なんてこれまで一度も参加したことがありません。歌が上手とはお世辞にも言えないし、歌詞であるドイツ語もいっさいわかりません。まったくずぶの素人が参加したわけです。
まず困ったのが自分のパート選び。合唱は男声・女声パートに分かれ、それぞれ音域の高低によって、
女声(高)ソプラノ
女声(低)アルト
男声(高)テノール(年配の方は「テナー」とも呼ぶ)
男声(低)バス
に分かれています。合唱の経験がないので、テノールとバスのどちらが自分にとって歌いやすいのかまるでわからないわけです。悩んでも仕方ないので潔く、きらびやかさのあるテノールを選びました。
パート選びは抽選前に決めなくてはなりません。結果的には、毎年男声の(特にテノールの)人材不足が深刻なようで、女声に比べると、男声で応募する人はずっと当選確率が高いようです。
抽選に通ったからと言って、「一万人」に参加できるわけではありません。その前にきちんと全12回の練習に参加する義務があります。たしか今年は2回お休みすると本番に参加する権利を失うというルールだったと思います。平日夜のレッスンだったので、残業がちなビジネスマンはなかなか参加しづらいかもしれません。
初回から七−八回目くらいまでは合唱の一部を取り上げて繰り返し読み上げ+練習することの繰り返しでした。ぼくのように初めての人の場合、曲の全体構造を知ること、自分のパートの楽譜を「正確」に知ること、歌詞を覚えることを同時に進めていく必要があります。第九の有名な合唱部(いわゆるMのパートです)以外は、なかなか聞き覚えのないメロディーですので、練習だけではどうしても覚えきれません。しかし、練習の回数は決まっているわけなので、どうしても練習以外の時間、つまり家に帰って自分で自習する必要があります。ぼくの場合、レッスン会場で販売されているパート別CDを買って、何度も聞くことにしました。楽譜をていねいに読み解くことができる人であれば、パート別CDをわざわざ買わなくても、楽譜を片手に、いろんな第九の録音を繰り返し聴くのでもいいかもしれません。
練習の後半は通し練習が中心でした。楽譜を見ずに円になって歌います。楽譜を手にしていると、ついうつむきがちになりますが、楽譜を投げ捨てると、両手が自由になり、リズムに合わせて左右に体を揺らしながら歌えるようになります。こうなるまでには、何度も何度も練習する必要はありますが、曲の全体の流れさえ覚えておけば細部はとりあえずうろ覚えでも気持ちよく歌うことができました。ぼく自身なまけものなので、一部歌詞をきちんと覚えていないところはありました(苦笑)全部の歌詞をきちんと覚えるのは来年以降の課題ですね。
11月の後半には佐渡裕さん直々の指揮による練習がサントリーホールの小ホールで行われました。世界で活躍するプロの指揮者が目の前にいて、直接指導してもらえるチャンスなんてめったとあることではありません。会場全体が一種の興奮に包まれていて、佐渡さん自身が表現したような「祝祭」的な雰囲気の中で、2時間の練習を行うことができました。見ず知らずの人同士が集い、「ベートーヴェンの第九を歌いたい」という気持ちを体中を使って、佐渡さんにぶつけていました。佐渡さんもその会場の思いに答えるように、いっさい手を抜くことなく、懸命に指揮をし、悪い点を注意し、そして何度も何度もほめていただきました。いま思い返しても、すばらしい時間だったと思います。会場の一体感・親密さという点では本番以上に充実した時間だったとすら言えます。
東京での最後のレッスンで通し練習を行うそのときまで、怠け者で歌の不得手な自分が本当に第九を歌いきれるだろうかという不安は拭い去れないままでした。テノールのパートは、音の高低の変化が比較的大きく、平気でオクターブ以上の動きがある部分もあります。また、後半には見せ場でもある「フーガ」があります。曲の展開が非常に早くなり、いろんな表情の声をめくるめく間に切り替えていく必要があります。もたもたしていて置いてけぼりにされてはいけないとがんばって歌おうとすればするほど、体が硬直し顔から笑顔が消え、お坊さんが早口でお経を唱えているような歌い方になってしまいます。無表情で声だけ張り上げているのです。こんな歌い方ではどんな名曲ですら台無しです。歌い手がもっとも喜びを感じていない「歓びの歌」なんて誰も聴きたくはないでしょう。
「笑顔、笑顔!」
「リラックス、リラックス!」
と何度も何度も指摘されました。
たしかに周囲の人達を見渡しても、慣れている人ほど自然な表情で気持ちよく歌い上げているかわり、ビギナーの人達はしかめ面・仏頂面で顔をゆがめながら歌っているように見えました。
ぼく自身、うまく歌うことはかなわなくとも、楽しんで笑顔いっぱい元気いっぱいに歌うことだけは忘れまいとしました。
12月5日がリハーサルで、12月6日が本番でした。
両日、大阪城ホールには1万人の合唱隊が集まりました。ホールの3分の2が合唱隊で占められています。男性はスーツに蝶ネクタイ、女性は白ブラウスに黒のスカート。ずらーと並ぶとやはり圧巻です。練習ではじめて全員で声を出したとき、やはり普段の教室の響きとは全然違うことに少しとまどいました。ソプラノやアルトの声が1秒以上遅く聞こえるのです。また声の響かせ方にも工夫がいります。遠く遠くに声を飛ばすように意識しないと、声がすとんと下に落ちてしまって、くぐもったような音色になるのだそうです。何度も何度も音を出し合って大阪城ホールの響きを確認しました。
何度リハーサルを繰り返してもやはり本番は空気が違います。
正装したオーケストラが入場し、佐渡さんの情熱的な指揮の下、第一楽章、第二楽章、第三楽章と演奏が続きます。第四楽章に入ると、合唱隊の人達の口元がきりりとなります。
低弦が「歓喜のテーマ」を奏でます。それに呼応するようにバイオリンも奏で始め、曲は一気に華やかさを帯びます。
ティンパニーが叩かれた瞬間が合図でした。会場の一万人でだんっと同時に立ち上がりました。会場の照明もぐんと明るくなります。はっとするようなこの演出も、佐渡さんの指揮のものと何度か繰り返し練習したものでした。どれほど効果的だったか、早く映像で確認したいものです。
一万人が立ち上がり、照明が会場全体を照らした直後、バリトンの厳かな独唱が会場を包みます。ここらです。ここから、オーケストラ、ソリスト、合唱隊の掛け合いによる第九の見せ場が始まります。
Freude
とバスとテノールの男声がはじめて響きます。このタイミングも遅れないように入念に練習しました。広い会場なので、佐渡さんの指揮を見てから声を出していては遅いのです。その2小節ほど前からFrの発音のために巻き舌を作っておき、あるいはこすれるようなFの音を先行して出しておく必要があるのでした。
この音がどれほど肝心であるかはいくら強調しても足りません。このFreudeがわれわれ合唱隊の第一声であり、このFreudeこそが全歌詞の中でもっとも重要な「歓喜」という意味を持っているのです。ぼく自身はリハーサルでの遅れてしまった反省があったので、普段より一歩早く発声したつもりですが、気持ちが先んじてしまって、少し声が空回りしてしまったように思います。やはりこの箇所はとても難しい部分です。
そこから後は、もう佐渡さんの指揮を見つめて必死に歌っていました。誰もが知ってる有名なパート、であるMの部分では、特に笑顔を意識して、朗々と歌い上げることを心がけました。しびれるようなフーガのパートはもう下手くそでもいいので、がむしゃらに元気いっぱいといった歌い方。「ひざまづきなさい」の厳かな部分も練習よりも本番が一番うまく歌えたように思います。一万人で静寂な雰囲気を作り出すことは容易なことではありませんが、何度も練習してきたところで最後の最後にひとつにまとまったのではないかと思います。
あっという間に歌い終え、オーケストラが最後の音を出し終えたときは、とてもさわやかな達成感を感じることができました。
「歌うことは生きることだ」
と佐渡さんは言っていたのですが、この歌い終えた瞬間は、老若男女問わず合唱隊全員が生気ある喜びの表情をしていたように思います。
まだまだ自分のすべてを出し切ったとまでは言えませんが、3ヶ月の練習した分だけ、その時間の努力の分だけはしっかり出せたように思います。
とても貴重な体験をすることができました。関係者の皆様の努力により何十年も続いてきたイベントです。これからもいつまでも続いてほしいものです。

daiku_header

12月5日6日に大阪に戻り、「一万人の第九」コンサートに参加してきました。広い大阪城ホールの中に、一万人の歌声が響いたのを聞いたときは、本当に感動的でした。

「一万人の第九」イベントは、その名の通り一万人の大合唱団でベートーヴェンの交響曲第九番を歌おうというイベントで、毎年、年末に開かれています。今年でもう27回目だそうで、知る人ぞ知る年末の恒例イベントです。

合唱隊として参加することを決めたのは今年の夏。妻に誘われて応募してみたら、見事抽選を合格し、東京クラスのレッスンを受けることができることになりました。当選して喜んでは見たものの、ぼくは合唱なんてこれまで一度も参加したことがありません。歌が上手とはお世辞にも言えないし、歌詞であるドイツ語もいっさいわかりません。まったくずぶの素人が参加したわけです。

Read the rest of this entry »

.