2011年1月26日水曜日

Scala Swingでデザインパターン[Command]

また昔買った「デザインパターン入門講座」本のサンプルを実装してみました。

こちらのプログラムはCommandパターンのサンプルとして紹介されているプログラムで
  1. 「File」-「Open」からファイル選択ダイアログを開く
  2. 「File」-「Exit」からプログラムを終了する
  3. 「Red」ボタンを押下すると背景が赤になる
という3つの動作を行うだけです。

Java実例プログラムによるデザインパターン入門講座―Swingプログラムで体得する23のパターン

このサンプルを実装してみて思ったのですが、Scalaはこの方法でイベント処理を実装するのに不向きなような気がします。 サンプルで実装されているアクションの実行方法は、

  1. ボタン、メニューのコンポーネントオブジェクトにCommandオブジェクトを保持するためのインタフェースを追加する
  2. コンポーネントにCommandオブジェクトを追加する
  3. イベント発生時にイベントオブジェクトからイベント発生元のコンポーネントを取得する
  4. コンポーネントからコマンドを取り出し実行する

というものなのですが、4.のコンポーネントからコマンドを取り出すには、型キャスト(アンボクシング?)が必要になります。

ジェネリクスによる型認識を徹底的に駆使して、型付言語でありなが型を意識することなく実装していくことを意識して設計されているScalaなのに、型キャストをしなければいけないのはいかがなものかと思ってしまうわけです。

ScalaではScalaなりのアクションの実装方法があるような気がするんですが、それがなんだかは全く検討がつきません。

そのうち気付くかな?でも、そこまで Scala + Swing を追求していこうとも思っていなんですが・・・・。

型キャストはasInstanceOf[T]というメソッドで行うことができます。

実装例は下記のとおりになります。
reactions += {
  case ButtonClicked(a) => a.asInstanceOf[CommandHolder].command.execute
}
本サンプルのソースはこちら

2011年1月20日木曜日

Swingでデザインパターン[Bridge]

「デザインパターン入門講座」本から「Bridge」パターンのサンプルをScalaで実装してみました。 今回は一つのデータを利用して、一般顧客用とエグゼクティブ顧客用の2種類のビューを生成するというものです。 コンポーネント追加用のメソッドを持つ抽象クラスをつくり、それを実装するクラスに委譲の形でコンポーネントを持たせています。

そして、コンポーネントもインタフェースをかませることで抽象度を高くしています。

Java実例プログラムによるデザインパターン入門講座―Swingプログラムで体得する23のパターン

個人的には、コンポーネント追加用の抽象クラスがBorderPanelを継承しているところがちょっと気になりました。 デスクトップアプリ(Swing)以外の方法で表示したくなったときにどうするのかな?と。「そこは、継承より委譲だろ」と思ってしまいました。Swing、デザパタに詳しい人とかはひょっとしたらもっと大きな問題に気付けたりするのかもしれないですが、自分ではこれが精一杯。

今回はまったのがずばりscala.swingパッケージにJTreeのラッパークラスがない!!ということでした。

なんで、JTreeのラッパーだけないんでしょう?実装漏れ?JTreeクラスに何か欠陥があるのか?「こんなコンポーネントいらね~よ」と実装者が思ったのでしょうか?まあ、考えてもしょうがないのですが・・・・。

かなり調べるのに時間がかかってしまったのですが、scala.swing.Componentクラスの中にコンポーネントを委譲させるように実装すれば言いということがわかりました。
実装例は下記の通り
viewportView = new Component {
    override lazy val peer = new JTree(root)
  }

あまりいいサンプルじゃないので、もう一つ

class Tree extends Component {
  override lazy val peer = new JTree(root)
}

遅延評価変数になっているところがミソ?なのかな・・・。

Scala Swing 独特のイベントリスナの実装も割と簡単にできるのですが、それはまた別の機会にということで(知りたい人はコメントとかくれるとありがたいです)。

あと今回、Javaのリフレクション機能を利用して文字列から動的にクラスを生成する方法を色々調べたのですが、結局わからずじまいとなってしまいました。Scalaという言語の特性上、基本的にやらないほうがいい処理なんでしょうか?
ちなみに、コップ本でもプログラム内で生成処理を分岐させて別のクラスの実装を返す方法しか紹介されていませんでした(27章)。

本サンプルのソースとサンプル内で利用したデータファイルはこちら

2011年1月18日火曜日

Scala Swingでデザインパターン[Abstract Factory]

「デザインパターン入門講座」本のAbstract FactoryパターンのサンプルをScalaで実装してみました。 こちらは、左のラジオボタンで選択した庭園の種類に応じて、ボタンを押下したときに右上のパネルに表示される文字列が異なってくるというものです。
ラジオボタンに対応する庭園クラスがあるのですが、それぞれの庭園クラスの親クラスを実装し、イベントアクション内では親クラスを操作するという形になっています。Factoryクラスは直感的だから、そんなに説明も必要ないとは思いますが・・・・

Java実例プログラムによるデザインパターン入門講座―Swingプログラムで体得する23のパターン このサンプルは、特に困ることもなく実装できました。 強いて言うと、GridBagPanelクラスの中で利用するConstraintsオブジェクトをどうやって生成するのだろう?というところで、少しつまづいたぐらいでした。 結局GridBagPanelクラスの中のpairConstraintsメソッドから生成する方法ぐらいしかわかりませんでした。 まあ、こちらのメソッドの利用方法はAPIドキュメントをみればすぐわかると思うので、あえてここでは何も書きません。
本サンプルのソースはこちら

2011年1月15日土曜日

60歳までに1億円つくる術

~ ご飯の炊き方と同じぐらい大事なお金の知識 ~

60歳までに1億円つくる術―25歳ゼロ、30歳100万、40歳600万から始める (幻冬舎新書)

刺激的なタイトルに引かれた皆様、大変申し訳ありませんm(_ _)m 。
本書には、「こうすれば、投資で大もうけ!!」というような目新しい投資方法は何も書かれていません。

私自身そういった内容が書かれている本をたまに本屋で立ち読みしたりするのですが、そういった本に書かれているのは、大抵比較的短期の取引をしてキャピタルゲインで利益を得ようというものが多い気がします。著者はこのような投資方法を「投機」と呼び、このような投資方法をそもそも否定しています。それどころか、個人で特定の企業の株を購入することすら否定しています。

本書で紹介されている「1億円つくる術」といのは、「収入を増やす」、「支出を減らす」、「投資をする」という極めて地味で地道な方法です。しかも30代後半あたりからはじめた場合、本書で紹介されている方法だと「1億円つくる」のはかなり難しくなっています。1億円つくれるのは20代から投資をはじめないとちょっときついかなと思わせる内容となっています。

しかし、だからこそこの本は一読に値する本だなと思います。
本書では
  • 「ローリスク・ハイリターン」はありえない
  • 「コストを下げることは最も確実にリターンを上げる方法である」
  • 人生で取れるリスクの許容限度を把握する

など地に足のついた提言が数多く目につきます。
このような提言から著者の「投資はギャンブルではない」というメッセージや著者の「お金に対する誠実なスタンス」を感じ取ることができます。

また、著者は「お金を一人で抱え込んではいけない」と経済の面から見た投資の大切さについても主張しています。
次にあてはまる方は本書を一読してみてはいかがでしょうか?
  1. 「貯めるのが目的」というような使い道のない貯蓄が100万円以上ある。
  2. 自分の月々の収支を把握するため、家計簿をつけているがいつも続かない。
  3. 自分が加入している保険の内容と金額を正確に把握できていない。
    できたとしても、それぞれの保険に加入している理由を明確に説明えきない。
  4. 投資をはじめたいが、どのような債券、銘柄を購入すれば良いかわからない。 余計なお世話ですが、本書を読んで「将来が不安だから」と無理に生活を切り詰めて貯金ばかりしている若者が、
    正しいお金の知識を身につけ健全にお金を増やしていっていただければと願います。
お金を健全に増やす4つの方法

2011年1月14日金曜日

setterと「_」(アンダースコア)の不思議

ScalaでSwingのプログラムを組もうとして、apiのドキュメントを見ていたら、ちょいちょい「_=」で終わるメソッド名が目についた。

気になって、調べて見たら

Getters and Setters in Scala | The Personal Blog of Dustin Martin

を発見。

一番下のほうに

First, the method name is “age_=”. The underscore is a special character in Scala
and in this case, allows for a space in the method name which essentially makes
the name “age =”.

とあるんだけど訳すと

最初にメソッド名は "age_="となる。アンダースコアはScalaでは特別な文字で、この場合メソッド名に空白を許可し、メソッド名を実質的に "age =" とする

という意味になる。なんとなくこの文章読んで思ったのが
「文字列と"="の間に複数の空白が入ると実はエラーになるのでは」
と思って試してみた。

class SimpleTest {
   var _simpleTest = ""
   def test_=(strTest: String) = {_simpleTest = strTest}
   def test = _simpleTest
}

これを下記のように実行すると

val hoge = new SimpleTest
hoge.test = "Hello" // OK
hoge.test     = "Hello" //OK

という感じでどっちも問題なかった。

表記の仕方からするとエラーになった方が自然なような気がするんだけど、まあ、エラーにされると不便だからいいか。
でも不思議~~。

2011年1月5日水曜日

ナイスの法則

ナイスの法則
ナイスの法則
posted with amazlet at 10.12.14
リンダ・キャプラン セイラー ロビン コヴァル
幻冬舎
売り上げランキング: 517612

~ ナイスのパワーを発揮し、その恩恵を受ける ~

本書は人に優しくしたり、相手を肯定することこそが成功や幸せをもたらすのだと主張し、そのための具体的な方法について書かれています。
ナイスのパワーは、見返りを計算しながら、ただただ笑みを絶やさずに人と交際することでも、みんなの言うとおりにすることでもありません。
それは、知性、美、才能に敬意を払うように、自分自身や他人がもつやさしさに価値を置くことです。

とあるように相手を認めたり、誠意をもって接することで「ナイスのパワー」の恩恵を受けることができると主張しています。

本書を読むと他人と接するときに、自然体であることの大切さ、思いやりを持つことの大切さを「それが正しいことだから」というのではなく、「それが自分と相手の人生を幸せにするものだから」という側面から捉えることができると思います。

日頃の人間関係にちょっと疲れていたり、身の周りの人間との関係を少し改善したいなと思っている方は読んでみてはいかがでしょうか。

ナイスのパワーの恩恵を受ける8つの方法

2011年1月2日日曜日

Scala Swingでデザインパターン[Simple Factory]

ScalaのGUIプログラムの実行方法がわかったところで、今度はもうちょっと複雑なプログラムを組んでみようかな~ということで、昔買ったデザインパターンをSwing or awt なGUIのサンプルを用いて解説している本のサンプルを実装してみました。
こちらのプログラムは画面上部のテキストボックスに名前を入力したら、名前を姓(Last Name)と名(First Name)に分割してそれぞれのテキストボックスに表示するという簡単なプログラムです。
1. 名前を半角空白区切りにすると前が名で後ろが姓
2. 名前をカンマ区切りにすると前が姓で後ろが名

というような分割ルールになっています。

結構簡単なプログラムのはずなんですが、思いのほかはまってしまいました。
はまりポイントは下記の通り