2010/02/16

GAE と Android と JVM Languages

プログラミングClojure Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ) 


Java言語は置いといて、環境としてすごいんですねー。すごいんでしょうねー。
ところでJava(言語)のdisられっぷりはPHPに引けを取らないようですね。

ちなみに私はJavaもScalaもGroovyもJRubyもJythonもやりません。
RhinoやClojureをほんのすこーしだけ触ってみたりみなかったり・・・。
それと私はAndroidもGAEもClojureもさっぱりです。

GAEやAndroidでの開発の本命はやっぱりScalaなんだろうか?などと、やりもせず見ていました。
他にもいろいろ動くには動くんですね。 Javaでガリガリ書くというのもあれでしょうしね・・・。
と、Javaやったことない私が言ってみるテスト。
ところでGroovyってちょっと名前がダサくないですか?
あれ、日本語のWikipediaにClojureが無いのは気のせいかな?

Android






Google App Engine


  • Rhino




あ、Jython忘れた。
ところでJythonとJSONって紛らわしいですよね。
PythonはPythonで、Python言語とはまったく無関係の「Python最適化マシンコードコンパイラ」なるものがあるそうな。

プログラミングClojure Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ) Google Androidプログラミング入門 Groovyイン・アクション


追記

2010/02/15

Google App Engine + Clojure

Google App Engine
ClojureGoogle App Engine するっていうあれです。
以前から「いつかやろう」と思っていたので、今日手をつけてみました。
うまくいかず諦めました。私のやる気なんてこんなもんです。
面倒だし、よくわからん。というかantってなんぞ?ってやつはやめとけって?(笑)
HogeBox くらい簡単に環境作れて Google Site くらい手軽に使えるようにならないかな。
また今度やる気のある時にでもやるかな。

GAE で Scheme や Common Lisp ってる方もいらっしゃるようで。

追記


    ClojureでGAEするまとめ

    追記2


    Google App Engine for Java [実践]クラウドシステム構築 (WEB+DB PRESS plus) (WEB+DB PRESSプラスシリーズ) (WEB+DB PRESS plusシリーズ)

    2010/02/13

    図書館のリサイクルフェア行ってきた

    公共図書館や一般家庭に無償で配る本のリサイクルフェア「よかよか本まつり」
    これに行ってきました。
    2010/02/13(土) ~ 2010/02/15(月)までが一般向けだそうです。

    もしかしたら、攻殻機動隊の元ネタらしい「機械の中の幽霊 (ちくま学芸文庫)」とか、レクター博士の頭の中「マッテオ・リッチ記憶の宮殿」とかあるかも・・・。
    と少し期待してましたが、ありませんでした。


    機械の中の幽霊 (ちくま学芸文庫)マッテオ・リッチ記憶の宮殿

    先日の9LISPの時にshunsukさんに薦められた数学入門〈上〉 (岩波新書)があったのはラッキー!1975年の第25刷発行と、かなり古いものですが・・・。


    頂いてきたのは以下の本。

    第五世代コンピュータ―日本の挑戦
    第五世代コンピュータ―日本の挑戦

    FUZZY(ファジイ)コンピュータの発想
    FUZZY(ファジイ)コンピュータの発想

    OS戦線異変あり―オープンソースのLINUX大作戦
    OS戦線異変あり―オープンソースのLINUX大作戦

    ドメスティック・バイオレンス
    ドメスティック・バイオレンス

    数学入門〈上〉 (岩波新書)
    数学入門〈上〉 (岩波新書)

    “It”(それ)と呼ばれた子―少年期ロストボーイ (ヴィレッジブックス)
    “It”(それ)と呼ばれた子―少年期ロストボーイ (ヴィレッジブックス)

    変身 (新潮文庫)
    変身 (新潮文庫)


    そういえばFORTRAN入門とかありました。
    ダンボールに詰め込んで持って帰ってる人もいました。私も、もっともらってくらばよかったかな・・・。

    JavaScript と Scheme (とLisp)

    「Lispってどんな言語なの?」「世界でもっとも実装される言語。」

    整理されてません。メモがてら。



    The Little Schemer, 4th EditionJavaScript 第5版計算機プログラムの構造と解釈

    2010/02/12

    Forth

    1. Gforth: 高速な処理系, 有名, 最適化がキツくて読みにくい
    2. pForth: ポータブルな処理系
    3. pForth: C++で作られた処理系
    4. jonesforth: 最小のForth, 学習用, アセンブラ
    5. pForth: C++で作られた処理系
    6. yforth: ANSI Cで動く小さな処理系 - 6000行ほど
    7. sukuna: OO拡張 Forth

     

    2010/02/11

    gist.el

    便利。
    gitの方も何か便利なのあるのかな。
    M-x gist-buffer
    M-x gist-region
    M-x gist-buffer-private

    書籍

    左端の「入門git」の良い評判をよく聞くのですが、若干古くなってきてるらしいですね。
    入門git 入門Git 実用Git

    TSS scramble

    The Seasoned Schemer
    scrambleが「何をしているか」はわかった。でも目的がわからない。何これ。

    ;; scramble
    ; (1 1 1 3 4 2 1 1 9 2) -> (1 1 1 1 1 4 1 1 1 9)
    ; (1 2 3 4 5 6 7 8 9) -> (1 1 1 1 1 1 1 1 1)
    ; (1 2 3 1 2 3 4 1 8 2 10) -> (1 1 1 1 1 1 1 1 2 8 2)
    (define one?
      (lambda (n)
        (= n 1)))
    (define sub1
      (lambda (n)
        (- n 1)))
    (define pick
      (lambda (n lat)
        (if (one? n)
            (car lat)
            (pick (sub1 n)(cdr lat)))))
    (define pick
      (lambda (n lat)
        (list-ref lat (sub1 n))))
    (pick 3 '(a b c d e f g))
    ; -> c
    (define scramble-b
      (lambda (tup rev-pre)
        (if (null? tup)
            '()
            (cons (pick (car tup)
                        (cons (car tup) rev-pre))
                  (scramble-b (cdr tup)
                              (cons (car tup) rev-pre))))))
    (define scramble
      (lambda (tup)
        (scramble-b tup '())))
    (define scramble-b
      (lambda (tup rev-pre)
        (if (null? tup)
            '()
            (let* ((n (car tup))
                   (rev (cons n rev-pre)))
              (display (format "n = ~a, ret = ~a, tup = ~a, rev-pre = ~a\n"
                               n (pick n rev) tup rev-pre))
              (cons (pick n rev)
                    (scramble-b (cdr tup) rev))))))
    ; (1 1 1 3 4 2 1 1 9 2) -> (1 1 1 1 1 4 1 1 1 9)
    (scramble '(1 1 1 3 4 2 1 1 9 2))
    ;; n = 1, ret = 1, tup = (1 1 1 3 4 2 1 1 9 2), rev-pre = ()
    ;; n = 1, ret = 1, tup = (1 1 3 4 2 1 1 9 2), rev-pre = (1)
    ;; n = 1, ret = 1, tup = (1 3 4 2 1 1 9 2), rev-pre = (1 1)
    ;; n = 3, ret = 1, tup = (3 4 2 1 1 9 2), rev-pre = (1 1 1)
    ;; n = 4, ret = 1, tup = (4 2 1 1 9 2), rev-pre = (3 1 1 1)
    ;; n = 2, ret = 4, tup = (2 1 1 9 2), rev-pre = (4 3 1 1 1)
    ;; n = 1, ret = 1, tup = (1 1 9 2), rev-pre = (2 4 3 1 1 1)
    ;; n = 1, ret = 1, tup = (1 9 2), rev-pre = (1 2 4 3 1 1 1)
    ;; n = 9, ret = 1, tup = (9 2), rev-pre = (1 1 2 4 3 1 1 1)
    ;; n = 2, ret = 9, tup = (2), rev-pre = (9 1 1 2 4 3 1 1 1)
    ;; (1 1 1 1 1 4 1 1 1 9)
    ; (1 2 3 4 5 6 7 8 9) -> (1 1 1 1 1 1 1 1 1)
    (scramble '(1 2 3 4 5 6 7 8 9))
    ;; n = 1, ret = 1, tup = (1 2 3 4 5 6 7 8 9), rev-pre = ()
    ;; n = 2, ret = 1, tup = (2 3 4 5 6 7 8 9), rev-pre = (1)
    ;; n = 3, ret = 1, tup = (3 4 5 6 7 8 9), rev-pre = (2 1)
    ;; n = 4, ret = 1, tup = (4 5 6 7 8 9), rev-pre = (3 2 1)
    ;; n = 5, ret = 1, tup = (5 6 7 8 9), rev-pre = (4 3 2 1)
    ;; n = 6, ret = 1, tup = (6 7 8 9), rev-pre = (5 4 3 2 1)
    ;; n = 7, ret = 1, tup = (7 8 9), rev-pre = (6 5 4 3 2 1)
    ;; n = 8, ret = 1, tup = (8 9), rev-pre = (7 6 5 4 3 2 1)
    ;; n = 9, ret = 1, tup = (9), rev-pre = (8 7 6 5 4 3 2 1)
    ;; (1 1 1 1 1 1 1 1 1)
    ; (1 2 3 1 2 3 4 1 8 2 10) -> (1 1 1 1 1 1 1 1 2 8 2)
    (scramble '(1 2 3 1 2 3 4 1 8 2 10))
    ;; n = 1, ret = 1, tup = (1 2 3 1 2 3 4 1 8 2 10), rev-pre = ()
    ;; n = 2, ret = 1, tup = (2 3 1 2 3 4 1 8 2 10), rev-pre = (1)
    ;; n = 3, ret = 1, tup = (3 1 2 3 4 1 8 2 10), rev-pre = (2 1)
    ;; n = 1, ret = 1, tup = (1 2 3 4 1 8 2 10), rev-pre = (3 2 1)
    ;; n = 2, ret = 1, tup = (2 3 4 1 8 2 10), rev-pre = (1 3 2 1)
    ;; n = 3, ret = 1, tup = (3 4 1 8 2 10), rev-pre = (2 1 3 2 1)
    ;; n = 4, ret = 1, tup = (4 1 8 2 10), rev-pre = (3 2 1 3 2 1)
    ;; n = 1, ret = 1, tup = (1 8 2 10), rev-pre = (4 3 2 1 3 2 1)
    ;; n = 8, ret = 2, tup = (8 2 10), rev-pre = (1 4 3 2 1 3 2 1)
    ;; n = 2, ret = 8, tup = (2 10), rev-pre = (8 1 4 3 2 1 3 2 1)
    ;; n = 10, ret = 2, tup = (10), rev-pre = (2 8 1 4 3 2 1 3 2 1)
    ;; (1 1 1 1 1 1 1 1 2 8 2)
    (define scramble
      (lambda (tup)
        (letrec ((iter (lambda (t rev-pre)
                         (if (null? t)
                             '()
                             (let* ((n (car t))
                                    (rev (cons n rev-pre)))
                               (cons (pick n rev)
                                     (iter (cdr t) rev)))))))
          (iter tup '()))))





    追記


    The Little Schemer, 4th EditionThe Seasoned Schemer

    TSS sum-of-prefixes

    The Seasoned Schemer
    TSS =The Seasoned Schemer ということで。
    sum-of-prefixes は (2 1 9 17 0) を渡すと (2 3 12 29 29) が返ってくる。(1 1 1 1 1) を渡すと (1 2 3 4 5) が返ってくる。そんな手続き。

    ;; sum-of-prefixes
    ; (2 1 9 17 0) -> (2 3 12 29 29)
    ; (1 1 1 1 1) -> (1 2 3 4 5)
    ; letrec
    (define sum-of-prefixes
      (lambda (tup)
        (letrec ((f (lambda (t p)
                      (if (null? t)
                          '()
                          (let ((v (+ (car t) p)))
                            (cons v
                                  (f (cdr t) v)))))))
          (f tup 0))))
    ; fold
    (define sum-of-prefixes
      (lambda (tup)
        (reverse (fold (lambda (e r)
                         (cons (+ e (if (null? r)
                                        0
                                        (car r)))
                               r))
                       '()
                       tup))))
    ; pair-fold
    (use srfi-1)
    (define sum-of-prefixes
      (lambda (tup)
        (reverse (pair-fold (lambda (rest ret)
                              (cons (+ (car rest)
                                       (if (null? ret)
                                           0
                                           (car ret)))
                                    ret))
                            '()
                            tup))))
    (define sum-of-prefixes-b
      (lambda (sonssf tup)
        (if (null? tup)
            '()
            (let ((a (+ sonssf (car tup))))
              (cons a (sum-of-prefixes-b a (cdr tup)))))))
    (define sum-of-prefixes
      (lambda (tup)
        (sum-of-prefixes-b 0 tup)))
    (sum-of-prefixes '(2 1 9 17 0))
    ; -> (2 3 12 29 29)
    (sum-of-prefixes '(1 1 1 1 1))
    ; -> (1 2 3 4 5)






    余談

    まだ let も letrec も出てきてないし、ネストした define も出てきてない。そういえば letrec は 「Y combinator の代用」みたいな登場の仕方だったような・・・。

    もう一つ手続きが必要な時は別途-bを付加した手続きを定義するスタイルの様子。↑の sum-of-prefixes-b みたいな。

    The Little Schemer でも The Seasoned Schemer でも問題をそのまま1対1で変換したようなコード。
    自分なりに書いてみるも、なかなかスッキリ書けない。

    こういう小粒問題をどこかに集めたいなー。9LISPとかで使えるように。どこにどうやって集めたら良いかなー。


    ところでgitgist便利だなー。


    さらに余談
    私が Gauche や Scheme, Common Lisp をやる目的ってなんだろう。
    1. Gauche をバリバリ書けるようになりたい。
    2. 仕事に使う。
    3. 作りたいものがある。
    4. Lisp / Scheme を極めたい。
    どれも当てはまらない。4は無理。1,2,3も別に・・・。ニートだし。
    ちょっと考えてみたけど、何か明確な目的ってない。

    やっぱりポチポチ書いて「お、動くなー。」とか「うわ、これすげー。」とか「何これ、意味わがんね。どうなってんだ。」ってやるのが楽しいからかな。「悟り体験したい」でFA?そうなるとやっぱCLのマクロか・・・。別にそれだけじゃないか。


    というか別に理由を探る理由もないか。

    The Little Schemer, 4th EditionThe Seasoned Schemer

    gauche fold,reduce,fold-pair,unfold

    どんなもんかなーと。

    ;; Gauche ユーザリファレンス: 10.2 srfi-1 - List library http://practical-scheme.net/gauche/man/gauche-refj_102.html#SEC310
    ;; Making The Road Wiki - Programming::Scheme::SRFI1 http://ow.ly/13jo0
    ;; fold
    (fold +
          0
          '(1 2 3 4 5))
    ; -> 15
    (fold cons
          '()
          '(1 2 3 4 5))
    ; -> (5 4 3 2 1)
    (fold (lambda (e l)
            (display (format "~a : ~a" e l))
            (newline)
            (cons e l))
          '()
          '(1 2 3 4 5))
    ;; 1 : ()
    ;; 2 : (1)
    ;; 3 : (2 1)
    ;; 4 : (3 2 1)
    ;; 5 : (4 3 2 1)
    ;; (5 4 3 2 1)
    ;; fold-right
    (fold-right cons
                '()
                '(1 2 3 4 5))
    ; -> (1 2 3 4 5)
    (fold-right cons
                '()
                '(5 4 3 2 1))
    ; -> (5 4 3 2 1)
    (fold-right (lambda (e l)
                  (display (format "~a : ~a" e l))
                  (newline)
                  (cons e l))
                '()
                '(1 2 3 4 5))
    ;; 5 : ()
    ;; 4 : (5)
    ;; 3 : (4 5)
    ;; 2 : (3 4 5)
    ;; 1 : (2 3 4 5)
    ;; (1 2 3 4 5)
    ;; pair-fold
    ; [SRFI-1] fold および fold-right と同様ですが、kons 手続き は与えられた clist の car ではなく、cdr をとります。
    ; Gauche ユーザリファレンス: 10.2 srfi-1 - List library http://practical-scheme.net/gauche/man/gauche-refj_102.html#SEC310
    (use srfi-1)
    ;; pair-fold
    (pair-fold (lambda (e l)
                 (display (format "~a : ~a" e l))
                 (newline)
                 e)
               '()
               '(1 2 3 4 5))
    ;; (1 2 3 4 5) : ()
    ;; (2 3 4 5) : (1 2 3 4 5)
    ;; (3 4 5) : (2 3 4 5)
    ;; (4 5) : (3 4 5)
    ;; (5) : (4 5)
    ;; (5)
    (use srfi-1)
    ;; pair-fold-right
    (pair-fold-right (lambda (e l)
                       (display (format "~a : ~a" e l))
                       (newline)
                       e)
                     '()
                     '(1 2 3 4 5))
    ;; (5) : ()
    ;; (4 5) : (5)
    ;; (3 4 5) : (4 5)
    ;; (2 3 4 5) : (3 4 5)
    ;; (1 2 3 4 5) : (2 3 4 5)
    ;; (1 2 3 4 5)
    ;; reduce
    ; ridentityが使われるのはlistが空の場合だけです。
    ; Gauche ユーザリファレンス: 10.2 srfi-1 - List library http://practical-scheme.net/gauche/man/gauche-refj_102.html#SEC310
    (reduce + 100 '(1 2 3 4 5))
    ; -> 15
    (reduce + 100 '())
    ; -> 100
    (reduce (lambda (e l)
              (display (format "~a : ~a" e l))
              (newline)
              (cons e l))
            "list is null"
            '(1 2 3 4 5))
    ;; 2 : 1
    ;; 3 : (2 . 1)
    ;; 4 : (3 2 . 1)
    ;; 5 : (4 3 2 . 1)
    ;; (5 4 3 2 . 1)
    (reduce (lambda (e l)
              (display (format "~a : ~a" e l))
              (newline)
              (cons e l))
            "list is null"
            '())
    ; -> "list is null"
    ;; unfold p f g seed &optional tail-gen
    ;; (unfold p f g seed tail-gen) ≡
    ;; (if (p seed)
    ;; (tail-gen seed)
    ;; (cons (f seed)
    ;; (unfold p f g (g seed))))
    ; http://practical-scheme.net/gauche/man/gauche-refj_102.html#SEC310
    (unfold null?
            car
            cdr
            '(1 2 3 4 5))
    ; -> (1 2 3 4 5)
    (unfold null?
            (lambda (x)
              (cons (car x)(car x)))
            cdr
            '(1 2 3 4 5))
    ; -> ((1 . 1) (2 . 2) (3 . 3) (4 . 4) (5 . 5))
           
    (display (unfold null?
                     (lambda (x) x)
                     cdr
                     '(1 2 3 4 5)))
    ; -> ((1 2 3 4 5) (2 3 4 5) (3 4 5) (4 5) (5))#<undef>
    (unfold null?
            (lambda (l)
              (* (car l)(car l)))
            cdr
            '(1 2 3 4 5))
    ; -> (1 4 9 16 25)




















    ; fold, fold-right
    (fold (lambda (x y z)
            (display (format "x = ~a, y = ~a, z = ~a\n" x y z))
            (+ x y z)) 0 '(1 1 1) '(1 1 1))
    ;; x = 1, y = 1, z = 0
    ;; x = 1, y = 1, z = 2
    ;; x = 1, y = 1, z = 4
    ;; 6
    (fold (lambda (m n o r)
            (display (format "m = ~a, n = ~a, o = ~a, r = ~a\n" m n o r))
            (+ m n o r)) 0 '(1 1 1) '(1 1 1) '(1 1 1))
    ;; m = 1, n = 1, o = 1, r = 0
    ;; m = 1, n = 1, o = 1, r = 3
    ;; m = 1, n = 1, o = 1, r = 6
    ;; 9
    (fold-right (lambda (x y z)
                  (display (format "x = ~a, y = ~a, z = ~a\n" x y z))
                  (cons x (cons y z))) '() '(1 2 3) '(a b c))
    ;; x = 3, y = c, z = ()
    ;; x = 2, y = b, z = (3 c)
    ;; x = 1, y = a, z = (2 b 3 c)
    ;; (1 a 2 b 3 c)





    プログラミングGauche

    speedtest タイピングゲーム

    すごく懐かしいものを見つけたのでやってみました。当時もだいたいこんなもんだったような気がします。

    WS0899

    WS0900

    何度もやってこんなもん↑でした・・・。

    320pointsとかどんだけっすか。