2010/04/02

「ハッカーというのは自分で“ハッカー”と名乗るのではなくて、いろいろやっているうちに人からそう呼ばれるもの」

 「ハッカーというのは自分で“ハッカー”と名乗るのではなくて、いろいろやっているうちに人からそう呼ばれるもの」
「遊び心がある(playful)ことがハックの条件の1つです」 
 和田先生のマサチューセッツ工科大学時代の研究仲間に、こんな人がいたそうだ。その人は、エレベータに乗り込むなり操作盤のパネルを開いてパチパチとスイッチを切り替え、1階から9階まで必ずノンストップで上がってしまい、1日の作業を終えて帰宅する際には、必ず自分の端末からエレベータを自分のいる階に呼び寄せてしまう。 
かっけー。

継続 continuation

お陰様で「継続」が少しずつわかってきました。

ごく簡単なコードについては
  • 継続が見えるようになってきた
  • CPS(継続渡しスタイル)に書き換えることができるようになってきた
  • call/ccによる脱出が書けるようになってきた
  • 継続呼び出しによる「脱出」が結果的にそう見えるだけで、厳密には「脱出」という表現は相応しくないのではないか、と思うようになった
  • call/ccが使われているコードに対する抵抗が減った
しかし
  • 少し複雑になるだけで継続なんてちっとも見えやしない
  • 厳密なCPSなんて全く書けやしない
  • call/ccが散在するコードを見ると目が回る
というような状態。抵抗が減っただけでも、大きな収穫だと思っています。理解の助けになるのは、やはり簡単な例で良いのでたくさん書いてみることだなーと、いまさら思いました。いや、そんなにたくさん書いていないので、もっとたくさん書かないといけないなーと思っているところでした。

2010/04/01

2種類のshell



タイラギハマグリ

TSS length, Y!, Y-bang

The Seasoned Shcemer P.119からまたもやlengthを使ったY Combinatorが出てきます。The Little Schemerで出てきたY Combinatorと違うのは、どうやら副作用を使うところのようです。名前にも「!(bangと読むらしい)」がついています。

ここ、ちょっとよくわかりませんでした。再読が必要かもしれません。取り合えずコードは書いてみました。


The Seasoned Schemer

codepadには選択肢がなかったので

おもしろいコードがあったので貼りたかったのですが、codepadではJavaは対応していませんでした。
対応しているのは以下のもの。
C, C++, D, Haskell, Lua, OCaml, PHP, Perl, Plain Text, Python, Ruby, Scheme, Tcl,

こちらを使ってみました。
対応している言語が多い。まさかWhitespaceまでシンタックスハイライトされるとは・・・。
Ada, Assembler, Bash, Brainf**k, C, C#, C++, C99, strict, CLIPS, COBOL, Common Lisp (clisp), D(dmd), Erlang, Fortran, Go, Haskell, Icon, Intercal, Java, JavaScript (rhino), Lua, Nemerle, Nice, Ocaml, Pascal (fpc), Pascal (gpc), Perl, PHP, Pike, Prolog (swi), Python, Python3, R, Ruby, Scala, Scheme (guile), Smalltalk, Tcl, Text, Visual Basic .NET, Whitespace

参考

パターン指向リファクタリング入門~ソフトウエア設計を改善する27の作法

2010/03/31

Hello World

ここの「Hello World」はすごい(笑)
これは「パターン指向リファクタリング入門」で見たJava以来すごい。
読みにくいので貼り付けてみると、こんな感じ。すごくパターンハッピーですね。気持ちはわかります。オブジェクト指向デザインパターンを覚えると必要ないところにまで使いたくなるんですよね、なぜか。なんか必殺技っぽいからでしょうか。

/* http://developers.slashdot.org/comments.pl?sid=33602&cid=3636102 */
public interface MessageStrategy {
    public void sendMessage();
}
 
public abstract class AbstractStrategyFactory {
    public abstract MessageStrategy createStrategy(MessageBody mb);
}
 
public class MessageBody {
    Object payload;
    public Object getPayload() {
        return payload;
    }
    public void configure(Object obj) {
        payload = obj;
    }
    public void send(MessageStrategy ms) {
        ms.sendMessage();
    }
}
 
public class DefaultFactory extends AbstractStrategyFactory {
    private DefaultFactory() {;}
    static DefaultFactory instance;
    public static AbstractStrategyFactory getInstance() {
        if (instance==null) instance = new DefaultFactory();
        return instance;
    }
 
    public MessageStrategy createStrategy(final MessageBody mb) {
        return new MessageStrategy() {
            MessageBody body = mb;
            public void sendMessage() {
                Object obj = body.getPayload();
                System.out.println((String)obj);
            }
        };
    }
}
 
public class HelloWorld {
    public static void main(String[] args) {
        MessageBody mb = new MessageBody();
        mb.configure("Hello World!");
        AbstractStrategyFactory asf = DefaultFactory.getInstance();
        MessageStrategy strategy = asf.createStrategy(mb);
        mb.send(strategy);
    }
}
パターン指向リファクタリング入門~ソフトウエア設計を改善する27の作法

プログラマは皆どのようにしてLisperと化して行くのか?

ハッカーと画家 コンピュータ時代の創造者たち

カッとなって書いた。今は後悔していない。ネタです。

追記

こっそりいくつか追加した。

初めての人のためのLISP[増補改訂版]

2010/03/30

Emacs S式操作

表を拝借。C-M-f, C-M-b, C-x C-e しか使ってない・・・。あー C-M-a, C-M-e, C-c C-l も使うか。
Key定義コメント
C-M-@, C-M-SPCmark-sexpこれでS式をマークできるので、切り取ったりコピーしたりする
C-M-hmark-defun関数をマーク
C-M-f, C-M-bforward-sexp, backward-sexpS式単位で移動
C-M-ttranspose-sexpM-t のS式版
C-x n dnarrow-to-defun現在の関数以外を不可視に。defun の奥深くからでも可能
M-(insert-parentheses括弧を挿入し、カーソルをその間に移動(□)
M-TABlisp-complete-symbol補完
C-M-abeginning-of-defun関数定義の先頭へ
Esc C-deletebackward-kill-sexp前の S 式を削除
C-M-kkill-sexpS 式 をkill
C-c C-eeval-expressionS式の評価
C-x C-eeval-last-sexp直前のS式の評価
C-c C-reval-regionリージョン内のS式の評価
  • C-x n d からの復帰は C-x n w
こちらからも表を拝借。
コマンド動作
C-x C-eカーソルのS式を評価
C-c C-eカーソルのS式を含むトップレベルのS式を評価
C-c C-lファイルをロード
C-c C-rリージョンを評価
C-c C-zSchemeのインタプリタが動いているバッファへフォーカスを移動

コマンド動作
M-C-f次のS式へ移動
M-C-b前のS式へ移動
M-C-aカーソルのS式を含むトップレベルのS式の先頭へ移動
M-C-eカーソルのS式を含むトップレベルのS式の末尾へ移動
M-C-d1つ内側のS式へ移動
M-C-u1つ外側のS式へ移動
M-C-SPCカーソルのS式の次のS式をマーク
M-C-tカーソルのS式の前後の式を交換

プログラミングGauche

UML, ER(Entity Relation)図エディタ, Database Diagram

UML、ERDのエディタで使い易いものはないでしょうか。Linuxで使えるものが良いです。
JUDE, NClass, DBDesignerは以前使っていました。

UML

Web-based

ERD

Web-based


参考


UMLモデリングレッスン 21の基本パターンでわかる要求モデルの作り方