2011年4月10日日曜日

Scalaにおける菱形継承問題を調べてみた。

昨日、エンジニアな皆さんたちと京都の二条城にお花見に行ってきた。


その後の飲み会の席で、こんな話題がでた。

「Scalaって菱形継承をどう解決してんの?」

Scalaを勉強中とはいえ、まだまだ勉強が足りない僕は、その質問にきちんと答えることができなかったので、ちょっと調べてみた。

■菱形継承問題とは




引用元:wikipedia 菱形継承問題 


菱形継承問題とは、多重継承を認めているプログラム言語において、クラスが上記の図のような継承関係にあり、BとCがAのメソッドをそれぞれ異なる形でオーバーライドしていた場合、DのクラスはBかC、いずれのメソッドを継承するのか、という問題である。
JavaやC#などの言語では、そもそも多重継承を認めておらず、インターフェイスも最終的に具象化すべきクラス(上記図でいうとD)にて具体的な実装がなされるため、菱形継承は問題にならない。

■Scalaのトレイトではどうなる?

ScalaもJavaやC#と同様、言語仕様としてクラスの多重継承を認めていない。その一方でインターフェイスという概念も存在せず、代わりにトレイトという考え方が存在する。

トレイトとは、基本的にはインターフェイスと同様の考え方であるのだが、それ自体に具体的な実装を施すことができる。
(ちなみにインターフェイスでいうinplementsはトレイトではmixinと呼ぶ)

トレイトはインターフェイスと同様、複数のトレイトをクラスにmixinできるため、JavaやC#では起こり得なかった菱形継承問題が発生することになる。

■実際に動かしてみた

ではScalaで菱形継承を実装するとどうなるのか、実験してみよう。

package diamondProblem

abstract class Animal {
  def howl()
}

trait DogTrait extends Animal {
  override def howl() = println("bow wow")
}

trait CatTrait extends Animal {
  override def howl() = println("mew")
}

class MyPet extends DogTrait with CatTrait {
}

object Driver  {
  def main(args: Array[String]) {
    var pet = new MyPet
    pet.howl()
  }
}

前述した菱形継承の図と対応させると、AのクラスがAnimalクラスに該当する。これはhowl()メソッドを定義した抽象クラスである。
B、Cに当たるのは、Animalクラスを継承したトレイト、DogTraitとCatTrait。それぞれhowl()メソッドに具体的な実装を施している。
最後に、DogTraitとCatTraitを多重mixinしたMyPetクラス。
DriverでMyPetクラスのインスタンスを生成し、howl()メソッドを呼び出した。

ビルドしてみたところ、正常終了。実行したら以下の結果が出た。

% scala diamondProblem.Driver
mew

CatTraitのメソッドを継承するようだ。
続いて、コードをこのように変えてみた。

package diamondProblem

abstract class Animal {
  def howl()
}

trait DogTrait extends Animal {
  override def howl() = println("bow wow")
}

trait CatTrait extends Animal {
  override def howl() = println("mew")
}

class MyPet extends CatTrait with DogTrait {
}

object Driver  {
  def main(args: Array[String]) {
    var pet = new MyPet
    pet.howl()
  }
}


"class MyPet extends DogTrait with CatTrait"のExtends 〇〇 with △△を入れ替え、"class MyPet extends CatTrait with DogTrait"としてみる。

実行すると…。

% scala diamondProblem.Driver
bow wow

結果が変わった!

Scalaで菱形継承を実装した場合、Extends 〇〇 with △△ で定義された継承関係のうち、右側に位置するトレイトから優先して継承される(右側にあるトレイトが左側のトレイトを上書きする)ようだ。

ちなみに、菱形継承でなく、単純に同名のメソッドを有するトレイトを多重mixinした場合はこうなった。

package diamondProblem

trait DogTrait {
  def howl() = println("bow wow")
}

trait CatTrait {
  def howl() = println("mew")
}

class MyPet extends CatTrait with DogTrait {
}

object Driver  {
  def main(args: Array[String]) {
    var pet = new MyPet
    pet.howl()
  }
}

これをビルドすると…。

% scalac diamondProblem.scala 
diamondProblem.scala:11: error: overriding method howl in trait CatTrait of type ()Unit;
 method howl in trait DogTrait of type ()Unit needs `override' modifier
class MyPet extends CatTrait with DogTrait { 
      ^
one error found


howl()をオーバーライドしろ、というエラーになる。

2011年3月27日日曜日

いまこそ、科学の力を信じよう

今日、友人たちと大阪市立科学館に遊びに行ってきた。

プラネタリウムの上映前に、今回の震災についての科学館からのコメントがあった。
それは科学に携わる人達の、誠実で真摯なメッセージで、わたしは胸を打たれて少し泣きそうになった。

どのようなメッセージだったかは後述するとして、帰宅後、少し気になって「科学」という言葉の意味を調べてみた。

wikipedia(2011.03.27 現在)ではこう書かれている。

・(広義)体系化された知識や経験の総称。
(中略)
自然についての体系的知識


 「学ぶ」ということは「世界をどのように理解するかを探る事」であるとわたしは思っている。それは自然といかに向き合うか、という事であり、己は何者であるかを突き詰める事でもある。

世界に対する理解が深まるほどに、わたしたちの生活は豊かになった。
世界に対する正しい知識は、わたしたちから多くの危険を遠ざけた。

しかし、わたしたちが未だ知りえぬ世界も存在していて、時にそれはわたしたちを翻弄し、蝕み、圧倒的な力を見せつけ、立ちはだかる。

プラネタリウムの上映前、科学館からこのようなコメントがあった。正確に記録したわけではなく、わたしの記憶からの記述なので細部は不正確であることを了承願いたい。

「いまこそ、わたしたちは正しい知識をもって自然と向き合わねばなりません。そのために、わたしたちや、この科学館がその知識を得るための助けになればと思います」

歩みを止めずに前へ進もう。

「正しい知識」を学び、世界をより深く理解し、そして世界と真摯に向き合おう。

世界は残酷で、過酷だけれど、美しく、優しくもある。

自分たちに何ができるのか、学んで、考え抜こう。

かつての先人たちがそうしてきたように。

そんな事を考えた一日だった。

2011年3月5日土曜日

シンポジウム2日目

シンポジウム2日目。

この日のメインは、我々の研究発表である。

前日、別の研究チームがUstream配信をするという情報をTwitterで入手し、それは面白そうだと我々も急遽Ustream配信を決定。ただのWebカメラでの野良配信だからあまり質の良い放送はできないけれど、あとから発表の振り返りをするための記録くらいにはなるだろう。

朝食後、メンバーと集まって最後の打ち合わせ。そしていよいよ会場入りである。


最終的な発表によると、会場に来てくださった聴講者は38名だったらしい。決して多い数ではないけれど、わざわざ興味を持って足を運んでくださって本当にありがたい。

発表の模様はこちら↓↓ 


メンバー最年少のOさんが初めてとは思えぬ堂々たる発表ぶり。きっちりと練習されたのだろう。

予定より少し時間はショートしてしまったものの、発表は無事に終了。

あとは気楽なものである。

我々の発表の次の枠でTwitter研究グループの発表があった。以前からわたしのTwitterのフォロワーさんが会場にいらっしゃるということは知っていたのだが、このグループの方だった事が判明。セッション後に挨拶に伺う。
Twitter研究の発表の場でTwitterのつながりを改めて感じ入るという不思議な出来事だった。

すべてのセッションが終了すると、あとは夕食のパーティ。中華のコース料理をいただく。

パーティの余興として、中村あゆみが登場。コンサートで会場は大いに盛り上がる。

そしていよいよ、授賞式。

全研究グループのリーダが壇上に上がり、スポットライトが縦横に走りまわり、まるでアカデミー賞のような演出で各賞が発表される。

我々は残念ながら受賞はできなかった。

受賞されたみなさん、おめでとうございました。


パーティ後、メンバーとカラオケボックスで大いに盛り上がり、こうしてすべてのイベントは終了した。

通常業務をこなしながらの研究であった事もあり、大変だったし、締切りギリギリに泣きそうになりながら論文を書いたりもしたが、こうして終わってみると大変素晴らしい時間を過ごせたのだなと思った。

なかなか得難い経験をさせていただき、協力いただいたみなさんに心より感謝したい。

どうもありがとうございました。

2011年3月4日金曜日

シンポジウム初日

とあるシンポジウムに参加している。この日に向けてメンバーで会議を重ね、データを集め、論文を書き、研究発表の準備を進めてきた。いよいよ本番である。

場所は大津プリンスホテル
桃の節句だというのに、JR大津駅に降り立つと雪が降っている。会場のホテルまではシャトルバスが出ているのだが、運動をかねて歩くことにする。


琵琶湖の湖畔を歩くのだが、琵琶湖から吹きすさぶ風と雪がやたらと寒い。しまいには何の余興か知らないが、琵琶湖面から噴水が吹き出すではないか。
噴水によって天高く舞い上がった水が、琵琶湖から陸へと吹きつける強風に乗り、わたしの体に降り注いでくる…。冷たい…。
「こんな日になにをしてくれとんねん…」と悪態をつきつつ歩くこと50分。ようやくホテルに着いた(バスに乗ればよかった…)。


開会式が終わり、メンバーと合流。今日は発表もなく、特にこの時間帯は聞きたいセッションもなかったので、喫茶店で世間話をしつつしばしの休息。


その後セッションに参加しつつ、Twitterでハッシュタグを付けて実況ツイートをしていると、会場にいると思われる人からフォローを貰った。しかし人が多すぎて誰が誰だかわからない。この人に期間中に会えることはあるのだろうか…。

本日すべてのセッションが終わり、チェックイン。メンバーの一人と相部屋だが、なかなか広くて快適な部屋だ。眺めも良い。



しばらく部屋でまったりした後、立食パーティへと向かう。聞くところによると600名強の参加者がいるようだ。


各ブースで料理を貰い、食べていると、ウェイターさんがお盆に載せたドリンクを運んでくる。ビール、ウイスキー、ワインなど。こんな光景、映画で観たことあるなー、などと思いながら周囲の人と名刺交換したり、雑談などをする。しかし立食で1時間半は結構しんどい。

パーティが終わると、我々は明日の研究発表の会場へ向かい、リハーサル。


スライドの確認、マイクチェック、前日のiPad2発表のジョブズの物真似などしつつ、リハーサルも完了。その後、わたしの部屋にメンバー全員が集まり、軽く飲みながら業界動向などを話し合った。

今日は自分たちの発表が無いので気楽な一日だったが、明日がいよいよ本番である。
さてさてどうなる事やら……。

2011年2月28日月曜日

カキオコを食べに行ってきた。

昨日、岡山県の日生(ひなせ)というところにカキオコを食べに行ってきました。


新快速に乗って、一路日生へ!!

ちょっとしたハプニングがありつつ、無事に日生に着きました。



当日は「ひなせかきまつり」というイベントが行われおり、凄い人手でした。
「かきまつり」の会場に向かう前に、まずは駅の近くのお好み焼き屋でファーストカキオコです。


うーん。カキのぷりぷり感がたまりません。

さて。かきまつりの会場に向かうことにしたのですが、会場まではシャトルフェリーに乗るとのこと。しかしフェリー乗り場は凄い行列です。
実際のフェリーもこんな有様。


あまりの人の多さに、僕はインドの通勤ラッシュを連想しました。
そこでフェリーは諦め、腹ごなしを兼ねて歩いてみたところ、普通に徒歩で行ける距離に会場はありました。


「かきまつり」です!
どこもかしこもカキづくし!!



焼きガキも絶品です。


今年、姫路で開催される「B-1グランプリ」にカキオコが出品されるとの事で、グランプリのデモをやってました。



これもまた絶品でしたねー。

もう当分、カキとお好み焼きは食べなくても平気というくらい、堪能してきました。

2011年2月26日土曜日

daiksy流ダイエット 〜 2ヶ月で5kg痩せました〜

■きっかけは祖母の一言
ダイエットを始めました。
お正月に実家に帰った際に、祖母に物凄い勢いで「あんた、よぉ肥えたなぁ!?」と家中に響き渡るよく通る声で言われた事が原因です。よほど大事な事だったのでしょう。祖母はまったく同じ言葉を、2回続けて言ってました
とりあえず、-5kgを目標にしていたのですが、見事達成したのでその方法などを書いてみようと思います。この方法が万人に対して適用できるかどうかはわかりません。あくまで、「僕はこの方法で体重が落ちましたよ」という事でご了承願います。


■まずは目標設定
ただ漠然と「痩せたい」と思っても上手くいくわけはありません。目標設定が大事です。
僕はこの目標を「1週間の平均体重が、ダイエット開始最初の週と比較して-5kg」と設定しました。
実際に毎日体重を計測すると分かるのですが、2kg弱くらいの範囲は一日単位で容易に変動します。計測するタイミングにもよるのでしょうが、満腹時と空腹時でも全然変わりますしね。1リットルの水を飲んだ直後に計測したとしたら、単純計算で1kgプラスになるわけですから、一日単位での変動は不確定要素が多すぎて「確実に体重が減った」とはいえません。
そこで、僕は平均体重で考えることにしました。

■記録重要
ダイエットで最も重要な事は、記録することだと思います。
特に今回は、「1週間の平均体重」を目安に設定しているわけですから、きちんと記録して週単位で計算しなければなりません。
僕はウェルネスリンクというサービスを使いました。オムロンの体重計と連動して使えるサービスのようですが、僕はオムロンの体重計を持っていないため、単純に日々の記録のみに使用しました。
記録した体重をグラフとして表示してくれるので、そのグラフが下降していく様を眺めるのも励みになります。わざわざExcelなどでグラフを自作する手間も省けるので、こういう無料サービスを活用するのが良いでしょう。
僕のグラフです。順調に下降しているのがわかります。

また、毎日記録することで、ダイエットのモチベーションを上げる効果もあります。いくら平均体重で目標値を設定しているとはいえ、前日比でプラスになっていると少しショックですから、そうならないよう自分を律することができます。
計測はなるべく同条件で行うのが良いでしょう。
僕は帰宅後、夕食を食べる前に入浴するのですが、その入浴前に全裸で計測していました(服を着ているだけでも1kgほどの誤差が発生するので)。
あと、これはダイエット中の色々な局面でいえることですが、あまり神経質にはならない事もポイントです。お酒を飲んで帰ってきて、そのまま眠ってしまった時などは、気にせずにスルーしましょう。平均体重を計算する際に、その計測漏れの一日を除外すれば良いだけです。

■運動も心がけて
体重を落とそうとすると、体内に蓄えた脂肪を減らす必要があるわけですから、運動は欠かせません。しかし、毎日会社に行って仕事をせねばならないサラリーマンですから、まとまった運動をするのも大変です。そこで、僕は歩く量を増やすことにしました。
1日1万歩が適度な運動量の目安である、とよく耳にするので、ここでも目標値として1日1万歩を設定しました。記録することが重要ですから、普段持ち歩く携帯電話(IS03)に標準で搭載されている歩数計を利用することにしました。
具体的に徒歩量を増やすため、職場の最寄り駅から自宅の最寄り駅まで地下鉄で7駅あるのですが、帰宅時にこのうちの5駅分を歩くことにしました。時間にして30-40分ほどです。
ただ、さきほどの体重の記録でも書きましたが、あまり神経質にならないようにしました。
お酒を飲んだ日や、雨が激しい日など、歩かずにそのまま普通に電車に乗って帰ることもあります。
また、1日1万歩という数値も遵守できていません。
ある1週間の歩数計の記録を紹介してみましょう。
月:9,405歩
火:10,156歩
水:7,508歩
木:9,720歩
金:11,199歩
土:9,457歩
日:549歩
このように、ここでも神経質にならないことが長続きのポイントです。日曜日など、ほとんど外に出掛けませんでしたから、歩いていません。
1日1万歩という数値は、普段より多めに歩くことを意識するための目標という程度で良いと思います。

■食べるのちょっとだけ我慢
食べる量も減らしました。
具体的には夕食の量を減らしています。
朝は今まで通りです。といっても朝はあまり食欲が無いので、フルーツを食べる程度です。
昼食は割ときちんと食べます。ただ、ボリューム満点の定食屋さんなどに行く時には、「ご飯少なめ」と注文するようにしています。
夜は基本的に白米を食べません。あと妻に協力してもらって、『タニタの社員食堂』のメニューのおかずを作ってもらいます。

ここでも神経質にやってません。同僚や友人と飲みにいくときなどは従来通り飲み食いします。焼肉を食べるときもありますし、週末は妻と外食することもあります。
しかしここでポイントになるのが、最初に設定した「体重の計測方法」です。
週ごとの平均体重を基準にしているので、焼肉を食べたり、ベロベロに酔いつぶれるほどお酒を飲んだりした日があれば、その週の別の日は食事量を普段よりさらに少なくします。
こうして1週間単位でトータルのつじつまが合うように意識しています。

■俺たちの闘いは始まったばかりだ!
これが「ダイエットとして僕が意識していること」のすべてです。
これを継続することで、1月6日から今日までで-5kgに到達しました。もちろん「1週間の平均体重」です。
最終的には、計測開始から-10kgくらいまでは減らしたいなと思っていますし、その体重をキープしたいので、まだまだ闘いは続きます。ひょっとしたらもう一工夫しないとどこかで壁がくるかもしれません。

みなさんのダイエットに何がしかの参考になれば幸いです。

2011年2月13日日曜日

Macbook Air でカメラ2台使ったUstream配信

最近Ustreamでいろいろ遊んでいて、Webカメラを衝動買いしたのでMacbook Airの内蔵カメラとWebカメラを同時に使う方法を調べたので書いておこうと思う。

用意したカメラは2台。
まずは内蔵カメラ。

そしてWebカメラ。


配信はブラウザではなく、Ustream Producer (無料版)を使うことにする。


今回は無料版を使うので、そのままではカメラは1台しか使えない。
そこでCamTwistを使ってカメラ2台の設定をする。


Step1.でwebcamを選択。
PIPというボタンを2度クリックすると、webcamを2台追加することができる。


Step3. のエリアでそれぞれのwebcamを選択し、Settingsのエリアで
使用カメラをそれぞれ選択する。


同じくSettingエリアにて、それぞれのカメラの画像サイズ。ディスプレイ内における表示位置を調整。



Ustream Producerで使用するカメラを「CamTwist」に設定すると、2台のカメラからの映像が入ってくる。


このときのそれぞれのカメラの配置はこんな感じ。


で、Ustream配信するとこうなる。


めでたしめでたし。