2010/07/31

夏の山田池公園#2

今朝の山田池公園の続きです。
まずは、モミジアオイ(紅葉葵)です。

モミジというのは、花ではなく、葉っぱが大きく5つに裂けていることに由来するようです。
アオイ科のハイビスカスの仲間です。どことなく南国風の顔つきですね。


お次はハス(蓮)です。


子供(あるいは中トトロ)なら傘にできそうな葉っぱです。茎が私の身長よりも高くその上に花が咲いているので、残念ながら横からしか写真を取れませんでした。ちなみにレンコンはこいつの地下茎ですね。

夏の山田池公園#1

今朝撮ってきた写真から、まずはサルスベリ。


花の色は、白とピンク(紅)と2種類ありますが、ピンクの方が有名(?)なので、今回はピンクです。長く花が咲くことから「百日紅」とも呼ばれます。紙風船のようなラインの入った蕾が面白いですね。

お次は、ガマ(蒲)です。


水辺に群生しています。ガマの穂は円柱形で、ソーセージか秋田のきりたんぽを思わせる形です。雄花と雌花が離れているのでヒメガマだと思います。
花粉は黄色く、集めたものはホオウ(蒲黄)という生薬として古くから使われています。外用で傷薬となるとのことで、古事記の「因幡の白兎」の話では、ワニ(サメ?)に毛皮を剥がれた兎が蒲黄で傷を癒しています。味には甘みがあり(?!)、飲めば利尿作用があるようです。

これはトンボ(蜻蛉)です。おそらくはシオカラトンボでしょう。

2010/07/24

状態を減らしてテストケースを減らす

状態遷移とテストケースで書きましたが、「Inputs * States = Outputs = Test Cases」です。であれば、入力 や 状態 を減らせば、テストケースも減ることになります。今回は状態を減らすことを考えてみます。

プログラムにおいて「変数」は「状態遷移するオブジェクト」であり、「変数への値の代入」は「状態遷移」と言えます。オブジェクト指向プログラミングではデータはメソッドによって隠蔽されますが、メソッド呼び出しにより内部データが変更されればそのオブジェクトの状態が遷移したことになります。

では、状態を減らすにはどうすればよいでしょうか?
  1. 状態(とその遷移)の絶対数を減らす

    • オブジェクト(=変数)の数を減らす
    • オブジェクト(=変数)に代入する値のバリエーションを減らす
    • オブジェクト(=変数)への代入回数を減らす
  2. 状態(とその遷移)の相対数を減らす

    • オブジェクト(=変数)の寿命を短くする
    • オブジェクト(=変数)のスコープを狭くする
1. 状態遷移の絶対数を減らす
純粋関数型言語のように言語自体で高い参照透過性が保証されている場合は別ですが、手続き型言語(やそこから発展したオブジェクト指向言語)を使用している場合は、アプリケーション全体で状態遷移を大幅に減らすことは難しいでしょう。クラスのメンバ変数を変更するメソッドが書けなくなったりします。

2. 状態遷移の相対数を減らす
たとえソフトウェアの起動から終了までに膨大な状態遷移があったとしても、Input があった時の可能なStateの数が少なければ、そのInputに対するOutputs(=Test Cases)も少なくてすむということです。こちらは絶対数を減らすのに比べて簡単です。

プログラム入門者向けの書籍にも「グローバル変数を無闇に使うな」とか「関数は長くし過ぎない」など、よく書かれています。ソースコードの可読性を高めることで、バグの混入を予防したり、バグ修正や機能追加等の保守を容易にするという文脈で語られることが多いように思いますが、テストケースの数を減らせるというご利益もあるわけです。

2010/07/10

グリーンIT, Green Computing

ふと、環境に優しいソフトウェアって一体何なのか、と思っていくつかに分類しみました。
  1. 環境に優しいことを目的としたソフトウェア
    • 電力使用量を最適化する
    • ペーパーレス化を支援する
    • ガソリンエンジンの空燃比を最適化する
  2. アルゴリズム的に優れた効率の良いソフトウェア
    • ハードウェアへのアクセスが少ない
    • CPUに負荷をかけない
    • 通信量/頻度が少ない
  3. UIのシンプルなソフトウェア
    • 無駄にアニメーションしない
    • 無駄に音を出さない
    • 無駄な機能がない
  4. 品質の高いソフトウェア
    • 不具合がない(対応に必要な資源はえてして多量)
    • ソースコードが読み易い
    • ソースコードが変更し易い
で、横道に逸れますが、このブログを書くにあたってWikipediaを参照したのですが、日本語版(グリーンIT)英語版(Green Computing)とでの情報格差が怖いです。日本語のページは情報量が少ないだけでなく、ソフトウェアについての言及もありません。「手法」の項ではハードウェアについての話ばかりです。英語のページには「Algorithmic efficiency」の項があり、「ハードウェアの価格がエネルギーコストに比べて相対的に下がってくるにつれて、アルゴリズムの効率性が重要になってくる」などと色々書いてあります。