2009/12/30

SICP 図形言語 黄金四角形

WS0831 WS0827 WS0828 WS0834 WS0830 WS0835 WS0837

書いただけで放置していたSICPの図形言語で遊んでみました。

黄金四角形に現れる正方形の中心を曲線で結ぶ(SBR)」ってのをPostScriptvallog:PostScript)でやろうとしてうまくできず、図形言語ならうまいことできるんじゃないかなーなどと思いつつ・・・そのまま遊んでました。


計算機プログラムの構造と解釈

2009/12/23

プログラマが好きそうな読み物100

寝る前に携帯で読めそうな文章のまとめとかあると良いなーなどと思ったもので。
(100個かどうかはわかりません)
他にオススメがあれば教えてください。


















    2009/12/21

    9LISP 2009 まとめ

     

    9LISPKPFメーリングリストミニ勉強会やりませんか?)から始まりました。

    KPF(熊本プログラミングフリークス)はTwitterから始まりました。

     

    KPFを始めたお陰で今年はたくさんの変態プログラマに会うことができました。

    KPFを始めたお陰で熊本でLISP勉強会、つまり9LISPを始めることができました。

    言ってみるもんですね。

     

    9LISPは朝10:00から勉強会を行っています。

    開催スパンは原則的に隔週で、土曜日に行っています。

    勉強会後には希望者でランチしてます。たまに09:00からモーニングコーヒーミーティングしたりもします。

     

    ブログに感想や進捗を書いてなかったので、少し書き残しておきます。

    こうやって見ると毎回初参加者の方がいるのがおもしろい。

     

    001

    参加者:6人

    キックオフミーティング

    9LISP発足後2ヶ月を経過し初めての会。

    急な開催(前日アナウンスだったような?)にも関わらず6人も集まり驚く。

    ここは熊本ですよ?

    LISP勉強会ではあるが、Common LispではなくSchemeの学習から入ることに決定。

     

    002

    参加者:6人

    初参加者:1人

    ランチ:5人

    毎回宿題を出すことにする。

    課題について事前に質疑応答できるようにする方が良いのではないか。

    会の間にもっとコードを書けるように事前に準備が必要ではないか。

     

    003

    参加者:6人

    初参加者:1人

    ランチ:5人

    宿題をやってきた人は少なめ。

    宿題については事前にWeb上にアップしておく方が良いのではないか。

    なにかテキストに沿って進めていってはどうか。

    SchemeらしさLispらしさ、そういうものがもっと良くわかる勉強会が良い。

     

    004

    参加者:6人

    初参加者:1人

    ランチ:4人

    テキスト:The Little Schemerを使って進め始める。

    読書会、輪読会等に参加したことのある人がおらず、体当たりで進めることにする。

    テキストは問答形式となっており、一問一答。

    洋書なので、参加者一人につき一つのQ&Aを読み、訳す形で進めることにする。

    疑問や不明な点があればホワイトボードなどを用いて議論。

    S式を二分木や「箱とポインタ記法」などの図に描いてみたりする。

    経験者の脳内イメージを描きだしてみる。

    テキストはP.8までを終える。

    今後の課題はやはりWeb上でのコード共有と、会の間にもっとコードを書きたい。

    ランチではSQLや集合論、JavaScriptエンジン、アセンブラ、組み込み、制御系などについて大いに盛り上がる。

     

    005

    参加者:5人

    初参加者:1人

    ランチ:4人

    前回に引き続き、テキスト:The Little Schemerを進める。

    P.8 ~

    復習と初参加者を考慮し、前回進んだ部分を復習。

    今後も会の始めに復習を行うことにする。

    復習の仕方は検討が必要。

    Scheme/Lisp未経験者だった参加者からは、なかなか頭が切り替わらないとの声も。

    テキストの和訳はないのか?→絶版(Scheme手習い)

    9LISPの読み方は?当初「キューリスプ」だったが、あえて決めない方向に変更。

    キューリスプ、クリスプ、クリスピー、ナインリスプ。

    読みたいように読んでください。

     

    006

    参加者:7名

    初参加者:1名

    ランチ:7名

    9LISP - 006

     

    今後の予定

     

     

     

    The Little Schemer, 4th Edition

    The Little Schemer, 4th Edition

    posted with amazlet at 09.12.21

    Daniel P. Friedman Matthias Felleisen
    The MIT Press
    売り上げランキング: 22002

    おすすめ度の平均: 5.0

    5 小さなScheme処理系で学ぶ数学基礎理論
    5 Schemeが好きになります
    5 英語であるのが苦痛にならない楽しさ
    5 面白いスタイル

    Amazon.co.jp で詳細を見る

    9LISP - 006

     

    参加者

    7名(初参加者1名)

    ランチ7名

     

    進捗

    テキスト:The Little Schemer

    Chapter 2 ~
    P.15 ~ P.21 「or」の手前(lat?)まで

    lat?手続き(list of atoms の略かな?)を定義し、1行づつ動作を追って説明されているところまでを終える。

     

    課題/目標

    • テキストは章以外の区切りがはっきりしていないので、事前に区切りを決めて時間的な目標を設けて読み進めるようにしたい。
    • オンライン参加についての検討。しばらくは宿題をMy Snippetに投稿する形でどうか。ust、skypeも検討。

     

    今後の予定

     

    参考URL

     

     

    The Little Schemer, 4th Edition
    The Little Schemer, 4th Edition
    posted with amazlet at 09.12.21
    Daniel P. Friedman Matthias Felleisen
    The MIT Press
    売り上げランキング: 22002
    おすすめ度の平均: 5.0
    5 小さなScheme処理系で学ぶ数学基礎理論
    5 Schemeが好きになります
    5 英語であるのが苦痛にならない楽しさ
    5 面白いスタイル

    2009/12/02

    PostScript 書籍 PDF 追加

     

    PostScript(R) Language Program Design (APL)
    Adobe Systems Inc.
    Addison-Wesley Professional
    売り上げランキング: 59322

     

    BlueBook, Thinking in PostScript 他はこちら

    scheme filter

    にコメントが付いてました!

    このfilterだと入れ子のリストは処理できないですね
    たとえば
    (1 2 (3 4) 5 (6 7))

    ホンマや・・・。

    ということで寝る前に

    (define filter
      (lambda (pred l)
        (cond
         ((null? l) l)
         ((list? (car l))(filter pred (car l)))
         ((pred (car l))(cons (car l)
                             (filter pred (cdr l))))
         (else (filter pred (cdr l))))))

    (filter even? '(1 2 3 4 5))
    ; -> (2 4)
    (filter even? '(1 2 3 4 5 (6 7 8 9 (10 11 12 13)(14 15 16 (17 18 (19 20))))))
    ; -> (2 4 6 8 10 12)

    結果は、リストのネストもそのままにすべきか?ということで・・・

    (define filter
      (lambda (pred l)
        (cond
         ((null? l) l)
         ((list? (car l))(cons (filter pred (car l))
                               (filter pred (cdr l))))
         ((pred (car l))(cons (car l)
                             (filter pred (cdr l))))
         (else (filter pred (cdr l))))))

    (filter even? '(1 2 3 4 5))
    ; -> (2 4)
    (filter even? '(1 2 3 4 5 (6 7 8 9 (10 11 12 13)(14 15 16 (17 18 (19 20))))))
    ; -> (2 4 (6 8 (10 12) (14 16 (18 (20)))))
    (filter even? '((((1 2 3) 4 5 6 (7 (8 9 10 (((11 12 13)) 14) 15)))) 16 17))
    ; -> ((((2) 4 6 ((8 10 (((12)) 14))))) 16)
    (filter odd? '((((1 2 3) 4 5 6 (7 (8 9 10 (((11 12 13)) 14) 15)))) 16 17))
    ; -> ((((1 3) 5 (7 (9 (((11 13))) 15)))) 17)

     

    どっちだろ。srfiだと・・・

    (use srfi-1)
    (filter even? '(1 2 3 4 5))
    ; -> (2 4)
    (filter even? '(1 2 3 4 5 (6 7 8 9 (10 11 12 13)(14 15 16 (17 18 (19 20))))))
    ; -> *** ERROR: integer required, but got (6 7 8 9 (10 11 12 13) (14 15 16 (17 18 (19 20))))
    (filter even? '((((1 2 3) 4 5 6 (7 (8 9 10 (((11 12 13)) 14) 15)))) 16 17))
    ; -> *** ERROR: integer required, but got (((1 2 3) 4 5 6 (7 (8 9 10 (((11 12 13)) 14) 15))))

     

    今までまったくコメントチェックしてませんでした。今度から気をつけます。(サイドバーに"最近のコメント"を追加して、メールでも知らせてくれるようにした)

     

    なんか久しぶりにScheme書いた気がした。

    2009/11/27

    今までどのくらいプログラミング言語を触ってきたか

     

    いまさら掘り返してみる。

    (3秒で飽きたものも含め)

     

    • Delphi
    • C
    • JavaScript
      • JScript
      • Ejacs
      • Rhino
    • WSH
    • VB
      • VB6
      • VBA
    • SQL
    • C#
      • 1.1~3.5
    • F#
    • PowerShell
    • Ruby
    • PHP
    • Scheme
      • PLT
      • Gauche
      • IronScheme
    • Emacs Lisp
    • R
    • Common Lisp
    • PostScript
      • GhostScript
    • Erlang
    • Prolog
      • SWI-Prolog

     

    含むならこの辺も

    • HTML
    • XML
    • XSLT
    • XAML

     

    わりと長くやったもの

    • JavaScript
    • SQL
    • C#
    • Scheme
    • PostScript

     

    JavaScriptはコアJavaScriptと言えば良いのか?DOMとかブラウザとか抜きで、関数型っぽいところとプロトタイプベースのオブジェクト指向が面白そうでやってみた。サイ本の後半には興味が持てなかった。Schemeで書いたコードをJSで書いてみたりというのも楽しんだ。Win環境で仕事の補助的な単純処理バッチも結構書いた(JScript)。

    SQLとC#は仕事で2年半くらい結構みっちりやった。行数にして合わせて数十万行くらいは書いたと思う(一番書いた時で3万行/月くらい)。そのうち2年くらいは1.1だけど(笑)笑えない。MCTSも2.0なら3つとも取れた。MCPDは落ちたまま再挑戦してない。そのうちMCPD取って3.5にアップグレードしたいなーなどと思っていたが、今となってはどうだろうか。

    Schemeはここ1年くらい結構継続してやってるけどずっと初級者。PostScriptはつい最近2ヶ月ほど入門的なことを。

    ごく最近はPrologの入門的なことをだらだらと少々・・・。

     

    将来設計はなし。興味が湧いた言語にただ手を出してるだけ。仕事はドロップアウト中。「自分探しの旅(笑)」とかに似たような現実逃避中なのかな。しかし結構充実している。たぶんやりたい放題だから。昼寝してやりたいことやって好きな時に自由にプログラミングしてるからかな。時間的余裕がたっぷりあるからなのかも。こういうスタイルで生活費でも稼げればラッキーなんだけどなー。

     

    お金を稼げるプログラマになりたいな。それも"頑張り次第"とか"書いたら書いただけ"とか"仕事をさばいた分だけ、さばけばさばくほど"なんていうんじゃなくて、もっと怠惰にプログラマブルに。その方がプログラマっぽい。

     

    華麗に脱線。

    2009/11/21

    Prolog 数値計算、述語

    % X is 1 + 2 + 3.
    % X = 6.

    % X is 1 + 2, X is 3 + 4.
    % false.

     

    square(X, Y) :-
        Y is X * X.
    /*
    square(2, Y).
    Y = 4.
    square(2, 4).
    true.
    square(2, 10).
    false.
    */

    /*
      predicate
      >
      <
      >=
      <=
      =\= 等しくない
      =:= 等しい
    */

     

    Prolog 空を飛ぶのは飛行機もしくはスーパーマン

    fly(X) :-
        airplane(X).
    fly(X) :-
        superman(X).

    airplane(jet_plane).
    airplane(helicopter).

    superman(taro).

    /*
    fly(jet_plane).
    true.

    fly(taro).
    true.

    fly(Y).
    Y = jet_plane ;
    Y = helicopter ;
    Y = taro.
    */

     

    Prolog isono家

    % 節?
    male(namihei).
    male(masuo).
    male(katuo).
    male(tara).
    /*
    male(X).
    X = namihei ;
    X = masuo ;
    X = katuo ;
    X = tara.
    */

    female(fune).
    female(sazae).
    female(wakame).
    /*
    female(X).
    X = fune ;
    X = sazae ;
    X = wakame.
    */

    father_of(namihei, sazae).
    father_of(namihei, katuo).
    father_of(namihei, wakame).
    father_of(masuo, tara).
    /*
    father_of(X, Y).
    X = namihei,
    Y = sazae ;
    X = namihei,
    Y = katuo ;
    X = namihei,
    Y = wakame ;
    X = masuo,
    Y = tara.
    */

     

    mother_of(fune, sazae).
    mother_of(fune, katuo).
    mother_of(fune, wakame).
    mother_of(sazae, tara).
    /*
    mother_of(X, Y).
    X = fune,
    Y = sazae ;
    X = fune,
    Y = katuo ;
    X = fune,
    Y = wakame ;
    X = sazae,
    Y = tara.
    */

     

    % XはYの親である
    % XがYの父親であるか、XがYの母親である
    parent_of(X, Y) :-
        father_of(X, Y).
    parent_of(X, Y) :-
        mother_of(X, Y).
    /*
    parent_of(X, sazae).
    X = namihei ;
    X = fune ;
    false.

    parent_of(X, Y).
    X = namihei,
    Y = sazae ;
    X = namihei,
    Y = katuo ;
    X = namihei,
    Y = wakame ;
    X = masuo,
    Y = tara ;
    X = fune,
    Y = sazae ;
    X = fune,
    Y = katuo ;
    X = fune,
    Y = wakame ;
    X = sazae,
    Y = tara.
    */

     

    % XはYの息子である
    % YはXの親であり、かつX
    は男性である
    suns_of(X, Y) :-
        parent_of(Y, X),
        male(X).
    /*
    suns_of(X, sazae).
    X = tara.

    suns_of(X, fune).
    X = katuo ;
    false.
    */

     

    % XはYの娘である
    % YはXの親であり、かつXは女性である
    daughter_of(X, Y) :-
        parent_of(Y, X),
        female(X).
    /*
    daughter_of(X, Y).
    X = sazae,
    Y = namihei ;
    X = wakame,
    Y = namihei ;
    X = sazae,
    Y = fune ;
    X = wakame,
    Y = fune ;
    false.
    */

     

    % XはYの祖父である
    % ZはYの親であり、XはZの父である
    grandfather_of(X, Y) :-
        parent_of(Z, Y),
        father_of(X, Z).
    /*
    grandfather_of(X, Y).
    X = namihei,
    Y = tara ;
    false.
    */

    /*
    grandfather_of(X, Y).
    X = namihei,
    Y = tara
    */

     

    % XはYの祖母である
    % ZはYの親であり、XはZの母
    grandmother_of(X, Y) :-
        parent_of(Z, Y),
        mother_of(X, Z).

    /*
    grandmother_of(X, Y).
    X = fune,
    Y = tara
    */

     

    Prolog 階乗

    % 階乗
    fact(0, 1).
    fact(X, Y) :-
        X > 0,
        X1 is X - 1,
        fact(X1, Y1),
        Y is X * Y1.
    fact(5, 120).


    % ?- fact(5, Y).
    % 120

    % 外部ファイルの読み込み
    % ['c:/program files/pl/demo/likes.pl'].


    % pwd : カレントフォルダ
    % ls : カレントフォルダ内のファイルを表示

    % comment
    /*
      comments
    */

     

    Prolog ソクラテスは人間である

    % socrates
    human(socrates).

    mortal(X) :-
        human(X).

    /*

    mortal(Y).
    Y = socrates.

    human(Y).
    Y = socrates.

    human(socrates).
    true.

    mortal(socrates).
    true.

    */

    % 終了は
    % halt.

    *mortal : 死ぬ運命にある、死を免れない

    Prolog PDF 他

    (PDF)Prolog入門

    (PDF)Prologue: Prologを動かすには

    Prologプログラミング: 再帰的プログラミング

    Prolog準備

    お気楽 Prolog プログラミング入門
    Prolog Programming

    Prolog演習

    Prolog演習

    Some Coding Guidelines for Prolog

    Prolog(Web Console)

    Guide to Prolog Programming

    Prolog Programming A First Course

    prolog :- tutorial

    Learn Prolog Now!

    The Prolog Dictionary

    Prolog Tutorial




    Erlang Hello world!, factorial, fibonacci

    Hello world!

    -module(hello).
    -export([hello/0]).

    hello () ->
        io : fwrite("Hello, world!~n", []).
    % hello:hello().
    % Hello, world!
    % ok

    factorial

    -module(fact).
    -export([fact/1]).

    fact(1) ->
        1;
    fact(N) ->
        N * fact(N-1).

    % fact:fact(5).
    % 120

    fibonacci

    % 一般的にファイル名と同じ名称を指定する
    -module(fib).
    % モジュール外から使用する関数とその引数の数を記述
    -export([fib/1]).
    % 全ての関数をエクスポートするには
    % -compile(export_all).
    % 定数定義、レコード定義のインクルード
    % -include_lib("hoge.hrl").

    fib(1) ->
        1;
    fib(2) ->
        1;
    fib(N) ->
        fib(N-1) + fib(N-2).

     

    C-c C-k コンパイル

    Prolog 階乗

    % 階乗
    fact(0, 1).
    fact(X, Y) :-
        X > 0,
        X1 is X - 1,
        fact(X1, Y1),
        Y is X * Y1.
    fact(5, 120).


    % ?- fact(5, Y).
    % 120

    % 外部ファイルの読み込み
    % ['c:/program files/pl/demo/likes.pl'].

    % ; : 選択(「もしくは」のようなニュアンス?)
    % pwd : カレントフォルダ
    % ls : カレントフォルダ内のファイルを表示

     

    % comment
    /*
      comments
    */

     

    2009/11/20

    Erlang PDF 他

    erlang.pdf

    Concurrent Programming in ERLANG Second Edition

    Thinking in Erlang

    Erlangの並列計算の入り口

    Getting Started with Erlang

    Concurrency Oriented Programming in Erlang

    Program Development Using Erlang - Programming Rules and Conventions

    Thinking in Erlang (Japanese version)

    Erlang入門



    Prolog PDF

    論理プログラミング言語Prologの基礎

    初級Prolog 講座

    【Prolog(JunPrologInterpreter)マニュアル】

    SWI-Prolog 5.0 Reference Manual

    prolog.pdf
    DB

    SWI-Prolog の使い方

    帰納論理プログラミング 第2回 Prolog

    Introducing Prolog II

    GNU PROLOG MANUAL

    The.Art.of.Prolog.Advanced.Programming._1999__.2Ed._0262193388_.

    Prolog A Tutorial Introduction

    Introduction to Prolog

    Prolog入門

    Prolog入門(自習用)

    A Prolog Interpreter in Python

    ebook.The Art of PROLOG - 2nd Edition Advanced Programming Techniques
    Logic Progra.0262193388 .zip


    Prolog(プロログ)を学ぶ―文化とその実践Prologへの入門 (PrologとAI)



    2009/11/19

    PostScript DSCコメント, ページ, page

     

    %!PS-Adobe-3.0
    %%Pages: 3

    % PostScript実習マニュアル
    % P.70 DSC

    % %%Title
    % %%EOF
    % %%Page
    % %%Pages
    % %%BoundingBox

    % P.71 page.ps
    /showstring {
        1 dict begin
            /string exch def
            100 500 moveto
            0 0.6 0 setrgbcolor
            /Times-Roman findfont 128 scalefont setfont
            string show
            showpage
        end
    } def

    %%Page: (first page) 1
    (first) showstring
    %%Page: (second page) 2
    (second) showstring
    %%Page: (third page) 3
    (third) showstring

     

    そうそう、2ページ目以降ってどうやるんだろうって思ってたんだった。この方法だけなのかな。

    PostScript gsave grestore

    gsave-grestore.ps

     

     

    %!PS-Adobe-3.0
    % PostScript実習マニュアル
    % P.68 3.11 グラフィックス状態の保存

    /square {
        2 dict begin
            /y exch def
            /x exch def
            x y moveto
            200 0 rlineto
            0 200 rlineto
            -200 0 rlineto
            fill
        end
    } def

    /specialsquare {
        gsave
            200 200 translate
            50 rotate
            2 0.5 scale
            0.4 0.8 0 setrgbcolor
            0 0 square
        grestore
    } def

    0 0.4 0.8 setrgbcolor
    200 100 square
    specialsquare
    200 500 square
    showpage

     

     

    PostScript Clip Star

    clip-star.ps

     

     

    %!PS-Adobe-3.0
    % PostScript実習マニュアル
    % P.67 3.10 クリッピング

    % clip
    % eoclip
    % initclip

    /star {
        2 dict begin
            /y exch def
            /x exch def
            newpath
            x y moveto
            300 0 rlineto
            -250 -200 rlineto
            100 300 rlineto
            100 -300 rlineto
        end
    } def

    /polkadot {
        4 dict begin
            /y exch def
            /x exch def
            /dy y def
            14 {
                /dy dy 25 add def
                /dx x def
                14 {
                    /dx dx 25 add def
                    newpath
                    dx dy 8 0 360 arc
                    stroke
                } repeat
            } repeat
        end
    } def

    /polkadotstar {
        150 650 star
        clip
        100 400 polkadot
    } def

    /polkadotstarbyeo {
        150 300 star
        eoclip
        100 50 polkadot
    } def

    1 0 0.4 setrgbcolor
    6 setlinewidth
    polkadotstar
    initclip
    polkadotstarbyeo
    showpage

     

     

    PostScript ベジェ曲線

    bezier-1.ps bezier-2.ps

     

    bezier-1.ps

    %!PS-Adobe-3.0
    % PostScript実習マニュアル
    % P.58 3.7 ベジェ曲線

    % P.58 3.7.1 ベジェ曲線の基礎
    /bezier {
        8 dict begin
            /y3 exch def
            /x3 exch def
            /y2 exch def
            /x2 exch def
            /y1 exch def
            /x1 exch def
            /y0 exch def
            /x0 exch def
            newpath
            x0 y0 moveto
            x1 y1 x2 y2 x3 y3 curveto
            0 0.8 1 setrgbcolor
            40 setlinewidth
            stroke
            newpath
            x0 y0 moveto
            x1 y1 lineto
            x2 y2 moveto
            x3 y3 lineto
            1 0 0 setrgbcolor
            1 setlinewidth
            stroke
        end
    } def

    140 450 100 650 500 750 300 450 bezier
    140 150 100 350 300 150 500 450 bezier
    showpage

    bezier-2.ps

    %!PS-Adobe-3.0
    % PostScript実習マニュアル
    % P.58 3.7 ベジェ曲線

    % P59 3.7.3 ベジェ曲線の連結
    /bezbez {
        14 dict begin
            /y6 exch def
            /x6 exch def
            /y5 exch def
            /x5 exch def
            /y4 exch def
            /x4 exch def
            /y3 exch def
            /x3 exch def
            /y2 exch def
            /x2 exch def
            /y1 exch def
            /x1 exch def
            /y0 exch def
            /x0 exch def
            newpath
            x0 y0 moveto
            x1 y1 x2 y2 x3 y3 curveto
            x4 y4 x5 y5 x6 y6 curveto
            0 1 0.8 setrgbcolor
            30 setlinewidth
            stroke
            newpath
            x0 y0 moveto
            x1 y1 lineto
            x2 y2 moveto
            x3 y3 lineto
            1 0 0 setrgbcolor
            1 setlinewidth
            stroke
            newpath
            x3 y3 moveto
            x4 y4 lineto
            x5 y5 moveto
            x6 y6 lineto
            0 0 1 setrgbcolor
            stroke
        end
    } def

    150 600 100 750 350 700 250 600 300 450 500 400 400 600 bezbez
    150 300 100 450 350 400 250 300 100 150 500 100 400 300 bezbez
    showpage

     

  • PostScript実習マニュアル
  • PostScript - PDF,Web まとめ