m.hana:迷想

m.hana:迷想

2009/02/19 19:35:28 PST

3Sという言葉をご存知でしょうか。工場の現場等でよく使われる言葉で、整理、整頓、清掃の頭文字をとったものだそうです。素人考えでは整理整頓でいいような気がしますがまあよく耳にします。ところが世の中にはそれでは足りないと考える人もいるようで、4S、5Sなんてのもあります。4Sはプラス清潔、5Sはプラス躾(習慣化の場合もある)だそうです。 こういうスローガン的なものはわかりやすくなくては浸透しない訳でどんどんふやせばいいものではないと思います。どんどん複雑になっていったら浸透させるどころか言葉だけが残って中身がともなってないなんてことになるでしょう。法律やら規則やらどんどん増えて複雑になっていってしまう中、本質をずばっとついてシンプ ルなスローガンでないとだめだと思います。ソフトウェアや機械でも同じですよね。複雑なものは結局コスト、時間、安全性いろいろなものが犠牲になってしまい、そのうち使われなくなってしまいます。できるだけシンプルを志すべきです。

そこで私は「シンプル」を追加した6Sを提唱します。

というネタを思いつきました。


2007/06/08 01:01:51 PDT

Shiroさんの2007/06/05の「浮動小数」を読んで。 さっぱりわからにゃい。そういえば昔、私は組み込み系のプログラマをしていましたが、そのとき「小数を使ってはいけない」という決まりがありました。先輩に理由を聞いてもよくわからない様子。よくわからん誤差で誰か昔痛い目にあったのかなーなんて今は思うのですが、その決まりのせいで私が痛い目にあいました。と、自分の無能さ、いい加減さを棚に上げてみる。


2007/06/08 00:18:11 PDT

Shiroさんの2007/04/30 の「名前はまだない」を読んで。 「名前の方がもったいない」という感覚はなるほどと思いました。確かにそうですね。でも、関数に「名前をつける」ということはその関数の中身を端的に表して理解しやすくする、という狙いもあるわけですよね。まあ、名前をつけなきゃわからないような長い無名関数書くなとかコメントつけろとかそういう話もありますか。何にしろ私はいくら考えてもよい名前がつけられず後でみたらなんじゃこりゃと思うことばかりです。長い関数を書いてコメントでごまかしたりもします。関係ないですが、mapとかfor-eachとかに渡す引数の順番は関数引数が最後の方がいいんじゃないのかといつも思います。


2007/04/04 19:02:24 PDT

会社で新しくMacBook Proを買って一週間。120GBのハードディスクの残りがもはや28GB...。なんでこうなるんだろう(Parallelsを使ってOSを3つも入れているからです)。

しかしGaucheのコンパイルの早さにびびりました。家で使っている初代PowerBookG4とは桁違いです。快適。


2007/02/28 22:38:09 PST

英語で人を表すときに後ろにつける "er" と "ist"。ドラマーとかピアニストとか。これらはどのように使い分けるのかずっと疑問に思っていました(もしかしたら学校で習ったのかもしれませんがまったく覚えがない)。しかし先日また歩きながらこの疑問について考えていたところ、"ist"がつく単語は"ing"がつけられる、だとしたら動詞は"ist"で名詞は"er"ではないか、そうだ、そうにちがいない、天才!などと思っていたのですが、今日ググってみたところあっさりわかりました。長い間疑問に思っていたのに拍子抜けです(いつもこの疑問が浮かぶときはパソコンのそばにはいなかったのです)。

http://www5b.biglobe.ne.jp/~aiida/gimon12.html

これを見るとまあ、私の予想は間違っていないようですが、何がいいたいかというと、LISPerとかSchemerでいいんですか?ということ。Schemeは動詞もあるようなのでいいみたいですね(たくらむという意味なので違うかも)。あとはコボラーとかもいいますね。Smalltalkerはいいんでしょうね。RubyはRubyistですね。 またググると

Lispistが出てきたことに驚いた。Lispingもかなり多い。辞書引いたらlispは動詞で「舌もつれで発音する」という意味が出てきた。

Lisperでいいんですか。

参考:coboling 346件


2006/12/05 20:00:44 PST http://cl-www.msi.co.jp/solutions/knowledge/lisp-world/articles/scheme こんなのがありました。曰く

うーん。私にはなんのことやらよくわかりませんが、Common LispとSchemeの両方勉強したらごっちゃになってわからなくなってしまうのは確かです。


2006/10/23 01:27:05 PDT

http://blog.mf-davinci.com/mori_log/archives/2006/09/post_662.php より。

ケーキを正方形に切る
233cm×144cmのケーキを144cm×144cmと144cm×89cmのケーキに切り分け
さらに144cm×89cmのケーキを89cm×89cmと55cm×89cmにケーキに切り分け...
というように正方形のケーキを切り出していくといくつの正方形のケーキができるか

というような問題。私の頭ではよくわからないのでプログラムでも書いてみるかと思ってSchemeで書いてみました。

; ケーキ
; 縦と横の長さのリスト
(define (make-cake x y)
  (list x y))

; 正方形化
; 正方形のケーキと残りのケーキのリスト
(define (make-square-cake cake)
  (let ((x (car cake))
        (y (cadr cake)))
    (if (> x y)
        (cons (make-cake y y) (make-cake (- x y) y))
        (cons (make-cake x x) (make-cake x (- y x))))))

; 正方形化の切り出しをやっていってその様子を表示する
(define (sq-loop cake)
  (if (end? cake)
      (display "end")
      (let ((sq (squared cake)))
        (display (car sq))
        (display " ")
        (display (cdr sq))
        (newline)
        (sq-loop (cdr sq)))))

終了条件がよくわからなかったので適当に辺の長さが1よりちいさかったら終了にしてみた。

(define (end? cake)
        (let ((x (car cake))
              (y (cadr cake)))
          (if (or (< x 1) (< y 1))
              #t
              #f)))

(sq-loop (make-cake 144 233))

結果

(144 144) (144 89)
(89 89) (55 89)
(55 55) (55 34)
(34 34) (21 34)
(21 21) (21 13)
(13 13) (8 13)
(8 8) (8 5)
(5 5) (3 5)
(3 3) (3 2)
(2 2) (1 2)
(1 1) (1 1)
end

フィボナッチ数ですね、これ。別の初期値でやってみる。

(sq-loop (make-cake 250 300))
(250 250) (250 50)
(50 50) (200 50)
(50 50) (150 50)
(50 50) (100 50)
(50 50) (50 50)
(50 50) (50 0)
end

フィボナッチ数じゃない(あたりまえ)。どうも最終的には同じ大きさの正方形ができるような気がする。ので終了条件は

(define (end? cake)
        (let ((x (car cake))
              (y (cadr cake)))
          (if (= x y))
              #t
              #f)))

でいいのかもしれない。いや、よくわからないんですけど(頭が悪い)。 結局いくつできるか、ということに関しては12個だと思います(手で数えました(頭が悪い))。最終的に同じ大きさの正方形ができる、というところがポイントかもしれませんね。

非常に遅れてあれですが、Shiroさんハワイ在住でしたね。地震は驚いたでしょうね。私は阪神大震災経験者な上に現在は東海地震直撃区域在住なため気をつけなければいけないのですがあんまり準備ができていません。一応アウトドア用品を詰め込んだザックとか水タンクとか水とか用意してるんですが一度用意して長い間ほったらかしなのでいざ地震が起こったら何をどうしていいかおろおろしそうです。日ごろの訓練が必要ですがなかなか・・・(経験がまったく生かされていない。みなさん気をつけましょう)。


2006/06/09 08:11:25 PDT
結城浩さんがJavaで祈りを表現していたのに触発されて Schemeで何かできないかと考えてみた。

結果

(define 蛙 "蛙")
(define 古池 "古池")
(define (飛び込む 何が どこに)
  (if (and (equal? 何が 蛙) (equal? どこに 古池))
      (display "ぽちゃん\n")
      (display "誰の俳句ですかそれは\n")))

(飛び込む 蛙 古池) => ぽちゃん

俳句を表現してみたが恐ろしくレベルが低い上に情緒も何もない。(ぽちゃんが悪いのか。情緒のある音がしたらいいかもしれない(想像))

ところで別のものがとびこんだときはどうすれば表現できるだろうか。 たとえば

(飛び込む 象 古池) => さっばーん

とか。これは以下のような定義で表現できないこともないかも。

(define 大 "大")
(define 中 "中")
(define 小 "小")
(define 蛙 小)
(define 象 大)
(define 古池
  (lambda (何)
    (let ((大きさ 何))
      (cond ((eqal? 大きさ 大) (display "さっぱーん"))
            ((eqal? 大きさ 中) (display "どぷん"))
            ((eqal? 大きさ 小) (display "ぽちゃん"))
            (else (display "しーん"))))))
(define (飛び込む 何が どこに)
  (どこに 何が))

古池が飛び込んできたものの大きさで判断している。 それでいいのか。 あるいは別のところに飛び込んだらどうなるか。

(飛び込む 蛙 草むら) => かさっ
(飛び込む 象 草むら) => ずどーん

さらに、飛び込むではなくてそっと入るとかだったら?

オブジェクトで考えたほうがいいだろうか。 蛙オブジェクト、古池オブジェクトを考えたときに、Java風に書くと

蛙.飛び込む(古池)

なのか

古池.飛び込む(蛙) あるいは 古池.飛び込まれる(蛙)

なのか。 水の音をさせているのは池なのか蛙なのか。両方の相互作用か。それをどう表現したらいいのだろうか。さらに、飛び込むのかそっと入るのかまでを考えたら誰にどの動作をもたせたらいいのだろうか。飛び込むとかの動作もオブジェクトになるのか。

オブジェクト指向の多態性はある一種のオブジェクトの多態性は表現できるが、複数のオブジェクトの相互作用は表現できないような気がする。

しかし、SICP Exercise 2.4. の

(define (cons x y)
  (lambda (m) (m x y)))

(define (car z)
  (z (lambda (p q) p)))

は、consとcarの相互作用を表現している気がするが、残念ながらこれを理解できるような頭脳はもっていない。Exercise 2.6にいたっては笑いがこみ上げてくるほどだ。宇宙の果てとかぐらいわからない。

二つのインターフェースがお互いに関係しているとようなものならできるかもしれない。というか常識ですか。

public interface IDiver {

      public static final String SIZE_LARGE = "大";
      public static final String SIZE_MIDIUM = "中";
      public static final String SIZE_SMALL = "小";

      public void 飛び込む(IDivee divee);

      public String 大きさ();
}
public interface IDivee {
      public void 飛び込まれる(IDiver diver);
}
public class  implements IDiver {

      public void 飛び込む(IDivee divee) {
            divee.飛び込まれる(this);
      }

      public String 大きさ() {
            return SIZE_SMALL;
      }

}
public class 古池 implements IDivee {

      public void 飛び込まれる(IDiver diver) {
            System.out.println(sound(diver.大きさ()));
      }

      public String sound(String size) {
            if ( size.equals(IDiver.SIZE_LARGE) ) {
                  return "さっばーん";
            }
            else if  (size.equals(IDiver.SIZE_MIDIUM)) {
                  return "どぷん";
            }
            else if (size.equals(IDiver.SIZE_SMALL)) {
                  return "ちゃぽん";
            }
            else {
                  return "しーん";
            }
      }
}
public class  芭蕉 {
      public static void main(String args[]) {
            IDiver  = new ();
            IDivee 古池 = new 古池();

            蛙.飛び込む(古池);
      }
}

いきなりJava。すみません。(Diveeってなんだという話もありますがAdapterとAdapteeというのを見たことがありますのでその類推ということでお願いします)

相互作用が表現されているだろうか。蛙が飛び込むと古池の飛び込まれるメソッドを呼び出す。まわりくどい。とういか変だ。飛び込んだときの音は池がif文で判断しており、ポリモーフィックではない。しかし、池に飛び込んだときの音を飛び込む側に持たせるのはおかしい。のでこれでいいと思う。IDiver#飛び込む()とIDivee#飛び込まれる()のは実装クラスで処理が同じだろうからそれぞれ抽象クラスを作ったほうがいいだろう。

しかし、まるで芭蕉が蛙を育てて(生んで?)古池を作って蛙にとびこませているようだ。それはいいとして意味的になんとなく 古池.飛び込む(蛙)の方があっている気がする(古池の中に蛙が入る様子が表現されている気がする)。そうすれば飛び込むメソッドの中で古池の飛び込まれるメソッドを呼び出す必要もない。というか飛び込むメソッド自体必要ない。じゃあ蛙は飛び込まないの?飛び込まされるの?というとそれも違う。飛び込むというのは自律的な動作で、オブジェクトにメッセージを送って、とかいうのとは違うと思う。オブジェクト指向で現実をそのままモデリングするとかいうのはやっぱり無理がある(自分に無理なだけか...)。

Scheme:オブジェクト指向表現で(動詞 名詞)と(名詞 動詞)の語順で議論があったが名詞が主語なのか目的語なのかで違うんじゃないだろうか。ん?目的語は引数か?しかも日本語だったらどっちにしろ(名詞 動詞)の順だ。中島聡さんのblogで「日本語とオブジェクト指向」というエントリーがあった。言語じゃなくてユーザインターフェースのはなしだったが「何々をどうする」という操作の手順が名詞、動詞の語順である日本語と同じだということである。ということはオブジェクト指向言語に当てはめてみると、オブジェクトは目的語なわけだ。じゃあ主語はなんだ。「私」、つまり「プログラマ」だ。ということはやっぱり蛙をとびこませているのだ。いや、芭蕉に蛙を飛びこまさせているのだ(芭蕉クラスの設計が間違ってます)。

というわけでオブジェクトが主語なのか目的語なのか考えているとよくわからなくなるという馬鹿なお話でした。 (俳句じゃなかったの?)

More ...