だめな子

だめな子ですが頑張って成長してゆくのです。

ypsilonをMacPortsで入れたい

と思ったけどypsilonなかった...
自分でmakeすればインストールできるけど、まだあまりUnix文化に馴染んでないし(変なことしたら自力で元に戻せなさそう)他のものはMacPortsが面倒みてくれてるからなるべく同じようにやりたい...

で、作ってみたらなんかできた
port destroot ypsilonしただけでなんか変なとこにインストールされちゃったりなんだりで結構苦労したけど頑張ったらなんとかなった(気がする)
試行1回に案外時間がかかるのが大変 間違いが含まれてそうで怖いな
あとデフォルトのヒープサイズを指定できるっぽいけど、variantsで port install ypsilon +heap_size 64 みたくできんのかな デフォルトのままで一向に困らないからいいんだけど...
手で頑張って作るのめんどいから、自前でPortfileかかないで普通にportで取ってこれるようになんないかなぁ

あと、手書きなのかどうなのかわからないけどMakefileが綺麗で慣れてないうちでもさるっっと読めた

参考サイト
MacPortsWikiJP HowTo/PrivatePortfileTutorial
Mac Ports 勉強会資料

また別のお話で、moshがなんかうまくコンパイルできないぽい
以下のコードがgaucheとypsilonだと動くけどmoshだと動かない

SCHEME:
  1. (define-syntax test
  2.   (syntax-rules (in out)
  3.     ((_ in s)
  4.      (begin
  5.        (display "<-")
  6.        (display s)
  7.        (newline)))
  8.     ((_ out s)
  9.      (begin
  10.        (display "->")
  11.        (display s)
  12.        (newline)))))
  13.  
  14. (test out "hoge")
  15. (test in "fuga")

あれー?
makeでもこけてなさそうだしmake testもちゃんと通ってそうに見えるよ...

No comment
taintedsong.com taintedsong.com taintedsong.com

Schemeで非決定性探索 深さ優先探索と幅優先探索

MacBook Air買いました!(挨拶

で、LLFutureんとき買ったOn Lispをがんばってしこしこ読んだらマクロのありがたさが少しわかったような
  ↓
でもSchemeってtraditional macroないんだよね... aifもかけやしねぇ
  ↓
syntax-caseで外の環境の変数とか補足できるよ!aifかけるよ!これは勝つる!!
  ↓
...あれ、使い方全然わかんない...←今ここ

それはそれとして、On Lispに乗ってる幅優先探索ってなんか思った通りの動作をしてくれない気がするんだけど...
見つかる解は浅いところのがちゃんと見つかるっぽいんだけど検索順路が深さ優先探索と同じ順序で探索していくのがなんかこー微妙な気持ち
どうすればいいんだ!!

深さ優先探索

SCHEME:
  1. ;;depth first search
  2. (define depth-fail #f)
  3. (define (depth-choose . args)
  4.   (if (null? args)
  5.       (depth-fail)
  6.       (let ((fail0 depth-fail))
  7.     (call/cc
  8.      (lambda (cc)
  9.        (set! depth-fail
  10.          (lambda ()
  11.            (set! depth-fail fail0)
  12.            (cc (apply depth-choose (cdr args)))))
  13.        (cc (car args)))))))
  14.  
  15. (call/cc
  16.  (lambda (cc)
  17.    (set! depth-fail
  18.      (lambda ()
  19.        (cc 'fail)))))

幅優先探索

SCHEME:
  1. ;;width first search
  2. (define width-fail #f)
  3. (define *search-path* '())
  4. (define (width-choose . args)
  5.   (call/cc
  6.    (lambda (cc)
  7.      (set! *search-path*
  8.        (append *search-path*
  9.            (map
  10.             (lambda (arg)
  11.               (lambda () (cc arg)))
  12.             args)))
  13.      (width-fail))))
  14.  
  15. (call/cc
  16.  (lambda (cc)
  17.    (set! width-fail
  18.      (lambda ()
  19.        (if (null? *search-path*)
  20.            (cc 'fail)
  21.            (let ((path (car *search-path*)))
  22.          (set! *search-path* (cdr *search-path*))
  23.          (path)))))))

SCHEME:
  1. ;;sample code
  2. (define choose width-choose)
  3. (define-syntax fail
  4.   (syntax-rules ()
  5.     ((_) (width-fail))))
  6. ;(define choose depth-choose)
  7. ;(define-syntax fail
  8. ;  (syntax-rules ()
  9. ;    ((_) (depth-fail))))
  10.  
  11. (let* ((a (choose 1 2 3 4 5 6))
  12.        (b (choose 1 2 3 4 5 6))
  13.        (c (choose 1 2 3 4 5 6)))
  14.   (if (and (odd? a) (even? b) (odd? c))
  15.       (print a " " b " " c)
  16.       (fail))
  17.   (fail))

途中(define fail depth-fail)とかやっててあれー?動かないなーとかむーむーうなってたのは内緒(しかも結構長時間

No comment
taintedsong.com taintedsong.com taintedsong.com

JRuby触ってみた!

ほんとに触っただけすぎてどうしようもないけどね

とりあえず普通にjrubyとかjirbでRubyと同じように遊べる
更には普通にJavaのクラスとか使えるし呼べるしすげー!って感じ
仕事でこっそり使ってもバレないんじゃないかコレ…

で、WindowsではjrubycがないのでRubyコードからバイトコードが作れない…
でもjrubycっていうファイルは%JRUBY_HOME%\binにあるので中身見てみるとなんかソレっぽいソースになってたので

@echo off
jruby -e "require 'jruby/jrubyc'; JRubyCompiler::compile_argv(ARGV)" %1 %2 %3 %4

こんなようなjrubyc.bat作っておけばOKな気がした

jrubyc hello.rb
set CLASSPATH=.
java -cp "%JRUBY_HOME%/lib/jruby.jar;%CLASSPATH%" hello
とかやっちゃうと
"Hello world!"
っとなりましたとさ

なんか普通にMechanizeとかもgemって使えるらしいしこれは夢がひろがりんぐかもわからんね!

No comment
taintedsong.com taintedsong.com taintedsong.com

Google Chrome

なんか朝いきなり現れた謎のブラウザ
しかもGoogle謹製ですよ!

とりあえずインスコして色々つつきまわしてみたけど、デザイン的にはとてもスラリとしていてかっこいいなー
ただ、タブが多段にならないのかなーとかFirefoxのあの拡張と同じような機能がほしいなーとかブックマーク周りがなんか貧弱だなーって感じ
それに、例えばブックマークのフォルダの中身全部開くときに、右クリックからのメニューでやらんと全部一気にゃひらけんよーみたいなバッドノウハウっていうと変だけど、普通気がつかないような操作方法がちらほらありそうで気に食わない!

その他
http://jp.techcrunch.com/archives/20080902google-officially-announces-chrome/ ユーザ側でプラグインを作ることは今のところ不可能らしい
TEXTAREAが手動でリサイズできて便利
TiddlyWikiとかGTDWikiみたいなローカルにファイル保存する系のJavaScriptがうまく動かない…?
Omnibox(アドレスバー)でAlt押しつつEnterで新しいタブで開けるなぁ
描画エンジンはWebkitでJavaScriptのエンジンがV8とかゆーGoogle独自のモノらしい WebkitならClient-side database storageもイケる?と思ったけどまぁJavaScriptエンジンが別なら使えないよね…
ていうかGoogle Gearsがデフォルトで入ってるからそっち使えばいいじゃんな感じ

一番注目すべきなのはたぶん「Webアプリとして保存」機能なのかなぁ?
Webブラウザがプラットフォームと化してきて、そーするとGoogle Chromeみたいな発想の新しいブラウザが出てくるのも納得だ
LLFutureでいってたLLVMバイトコードをABCに変換するだとかなんだとか、みんなが日常使うアプリケーションがWebアプリとして作られる日も近いのかしら
そしたら、EeePCみたいなマシンで一般人はホントに十分だよなー

No comment
taintedsong.com taintedsong.com taintedsong.com

Lightweight Language Futureいってきたよ!!

LLF バナー

たいへん楽しかった!

基調講演
PerlのLarryWallさんが来日して講演
通訳つくんだろとか思ってたら1時間ずっと英語
何いってるか1割くらいしかわかんなかった

LLで未来を発明する
話のワクが広すぎてネタが色々な方向にとんでって面白かった
Ypsilonの中の人がエラーメッセージが幸せだと幸せ!みたいなこと言っててそーだよねーと思った
俺が書いたブツは俺が使えればいいやすぎてエラーメッセージが超ないがしろなので自省しるということかっ
あと78年後には大統一理論が打ち立てられて「なんだ、やっぱLispに収束したじゃん」ってなるに違いない!ってひげぽんさんが言ってた!
最後に質問の人が「【セキュリティ】という単語がこのセッション中に1回も出なくて絶望したっ!!」って言ってたけど、そんなもんフレームワークとかで担保すればいいんじゃないの?と思う派の俺。言語が使いやすくて触ってて幸せになれるんなら、あとは他の人がそれをWrapすればいいじゃんみたいな。
言語としてセキュリティが保障されていることが重要なのかなぁ…。

サイコー!?フレームワーク
Seasarの中の人がアウェーな雰囲気すぎて笑った
Javaは書いててめんどくささがものすごいのが嫌いだ!
何であんなにめんどくさい印象になってるのか我ながら謎だけど
Gauche on Railsの吉田さんが「いや、Gauche on Railsっていらなくね?DSL作りやすいからそれぞれ用のフレームワーク勝手に作れば十分っしょ」みたいな趣旨のことを言ってたように思う(で、そういうもんなのか、っと思った)
あと、RoRは更新早すぎて一般人にはついていけないくて暗黒面に踏み込んだシスの人々しか使いこなせないんだって!
なんつー恐ろしいモノなんだ…

吉田さんは9/13にGauche/Kahuaセミナーもやるらしい
行ってみたいな でもレベル的に(俺が)下すぎて参加するとヤバい気もする どーしょー…

LLでアート
増田さんのAction Codingは見た目すげーカッコよかったし簡単そうに見えた
あーゆーカッコいいスクリーンセーバーとか壁紙とか欲しいなー
Proce55ingとゆーJava製の割とこわい(硬い)ものをJRubyでさっくり包んであげて色々工夫して触りやすくしました!みたいな物体だと判断
そういうアプローチもあるのかー みたいな JRubyやらJythonやらは会社でこっそり使ってもばれなさそうでいいですね!(バレるし

そして後半ぶっちゃけ落ちてた(サーセン

キミならどう書く!?
shinhさんが見てみたかったのでとりあえず満足
最後のHole 8のshinhさんの解説と回答が変態すぎて困った
色々みたセッションの中でかなり上位に入る笑えるっぷりだったー
最後に出てた質問の答えの
「ループの中で今何週目〜みたいなのが取れる組み込み変数が一番欲しい」っていうのはよかったなー デバッグのとき便利そう…

古い言語、新しい言語
あろはさんはどこからでもETに持ってく人だと思ってましたがETのEの字も出ませんでした。なんたることでしょう。
要約すると「JavaScript上で色々な言語処理系作ってみたよ!」と、「LLVMのバイトコードをABCに変換してブラウザ上でなんでも動かせばいいじゃん!」みたいな話だった
JavaScriptやらActionScriptってそんなに頑張れるの?どうなの?みたいなっ
ハッカーと画家(LLF会場で買ってまだあんまし読んでないけど)で書いてたみたく、そーなると一般ユーザはホント難しいこと考えないでブラウザだけあれば十分になると便利そうだよねぇ

ライトニング・トーク
面白かったものを抽出して…
Client-side database storageで実際にアプリケーションを作成してみた
めちゃめちゃ面白かった
クライアントサイドにSQLite仕込んで超Cookie!みたいなっ!でもドメイン単位でユニークなので超劣化クッキー!みたいなっ!
テンポラリビュー作りまくって作業できるしやりたい放題できてサイコーwww使ってるの俺だけwwww状態らしい
ちょっと調べてみたけど、HTML5の仕様に盛り込まれている新機能なのか
Safari3.1ではもう使えるらし Firefoxはどうなのかしら…
なんかこれで面白そうなネタ作れないかなー
ドメイン内でDB共有状態!なのを逆手にとった遊びとかも出来る気もするよなー

私は如何にしてNarioを作り、一面をクリアしたか
Grepして置換!Grepして置換!の壁紙が欲しくなった!

「Pit」で救う世界
なんつーか純粋に便利そう
IDやらパスワードやらを一元管理しましょう そうすると500年が節約できます!(適当すぎ
みたいなっ

UnBabel LLにLLを埋め込んでみた
大富豪的プログラミングwwwどんだけwwww
しかし、問題に適した言語をその都度選択するのは頭いいな
IOをRubyで書いてロジック部分をBrainF*ckで記述する!みたいな夢のような業務アプリがっ!すげーwww

Ruby on Railsで実現する自走式Webサーバー
なんという馬力(色々な意味で
これは会場でデモするべきだった!
大好き

ちょっと草植えときますね型言語Grass
存在は知ってたけどどんだけだしwWWwwwwWWww
つーか読んでも文法わかんねぇ…

思い出しつつ書いてみるとあんまり理解できてなかったらしいことに気がついてちょっと泣きたくなった
えと演者の6〜7割がMacでビビタ X61買ってUbuntuかなぁとか思ってたけど頑張ってMac買おうかなぁ あのインターフェースは一度は常用してみたい!
来年もあったらまたいく!!

No comment
taintedsong.com taintedsong.com taintedsong.com

LL Futureチケット買いました

こーゆーイベントって行ったことないから楽しみだー
すみっこでわくわくしながら帰ってこようと思います!
お友達ほしい!けど知らない人こわい!キャーキャー

No comment
taintedsong.com taintedsong.com taintedsong.com

SchemeでLifeGame v3

SCHEME:
  1. (use srfi-1)
  2. (use srfi-27)
  3.  
  4. (define width 14)
  5. (define height 10)
  6.  
  7. (define population 0.3)
  8.  
  9. (define birth '(3))
  10. (define keep '(2 3))
  11.  
  12. (define element-x car)
  13. (define element-y cadr)
  14. (define element-value caddr)
  15. (define (make-element x y v) (list x y v))
  16.  
  17. (define (make-field)
  18.     (define (flatten x) (fold-right append '() x))
  19.     (map
  20.         (lambda (e) (make-element (car e) (cadr e) #f))
  21.         (zip
  22.             (apply circular-list (iota width 0))
  23.             (flatten
  24.                 (map
  25.                     (lambda (x) (iota width x 0))
  26.                     (iota height 0))))))
  27.  
  28. (define (randomize-field field)
  29.     (random-source-randomize! default-random-source)
  30.     (map
  31.         (lambda (e)
  32.             (if (<(random-real) population)
  33.                 (make-element (element-x e) (element-y e) #t)
  34.                 (make-element (element-x e) (element-y e) #f)))
  35.         field))
  36.  
  37. (define (print-field field)
  38.     (define (print-cell e)
  39.         (if (element-value e)
  40.             (display "[*]")
  41.             (display "[ ]")))
  42.     (let loop ((left field))
  43.         (if (not (null? left))
  44.             (begin
  45.                 (print-cell (car left))
  46.                 (if (= (element-x (car left)) (- width 1))
  47.                     (newline))
  48.                 (loop (cdr left))))))
  49.  
  50. (define (game-next field)
  51.     (define (count field) (length (filter (lambda (e) (element-value e)) field)))
  52.     (define (get-neighbors x y)
  53.         (let
  54.             ((x-1 (remainder (+ x width -1) width))
  55.              (x+1 (remainder (+ x width +1) width))
  56.              (y-1 (remainder (+ y height -1) height))
  57.              (y+1 (remainder (+ y height +1) height)))
  58.             (filter
  59.                 (lambda (e)
  60.                     (let
  61.                         ((cx    (element-x e))
  62.                          (cy    (element-y e)))
  63.                         (or
  64.                             (and (= x-1 cx) (= y-1 cy)) (and (= x   cx) (= y-1 cy)) (and (= x+1 cx) (= y-1 cy))
  65.                             (and (= x-1 cx) (= y   cy))                             (and (= x+1 cx) (= y   cy))
  66.                             (and (= x-1 cx) (= y+1 cy)) (and (= x   cx) (= y+1 cy)) (and (= x+1 cx) (= y+1 cy)))))
  67.                 field)))
  68.     (define (next-state e)
  69.         (define neighbors (count (get-neighbors (element-x e) (element-y e))))
  70.         (define live? element-value)
  71.         (define (live->next)
  72.             (if (fold (lambda (x y) (or x y)) #f (map (cut = neighbors <>) keep))
  73.                 e
  74.                 (make-element (element-x e) (element-y e) #f)))
  75.         (define (dead->next)
  76.             (if (fold (lambda (x y) (or x y)) #f (map (cut = neighbors <>) birth))
  77.                 (make-element (element-x e) (element-y e) #t)
  78.                 e))
  79.         (if (live? e)
  80.             (live->next)
  81.             (dead->next)))
  82.     (map
  83.         next-state
  84.         field))
  85.  
  86. (define (play)
  87.     (define (field-chain field)
  88.         (cons
  89.             field
  90.             (delay (field-chain (game-next field)))))
  91.     (define field-list (field-chain (randomize-field (make-field))))
  92.     (define count ((lambda ()
  93.         (define counter 0)
  94.         (define (inc)
  95.             (set! counter (+ counter 1))
  96.             counter)
  97.         inc)))
  98.     (define (iter)
  99.         (display (count))
  100.         (newline)
  101.         (print-field (car field-list))
  102.         (display "if you want to exit. press e.")
  103.         (newline)
  104.         (if (char=? #\e (read-char)) (exit 0))
  105.         (set! field-list (force (cdr field-list)))
  106.         (iter))
  107.     (iter))
  108.  
  109. (play)

・CPSっぽいやり方じゃなくなった
・無限ストリームっぽいものになった
play内部のcountの作り方に1〜2分悩んだ(おばか

SCHEME:
  1. (define (play)
  2.     (define (field-chain field)
  3.         (cons
  4.             field
  5.             (delay (field-chain (game-next field)))))
  6.     (define field-list (field-chain (randomize-field (make-field))))
  7.     (define (iter count)
  8.         (display count)
  9.         (newline)
  10.         (print-field (car field-list))
  11.         (display "if you want to exit. press e.")
  12.         (newline)
  13.         (if (char=? #\e (read-char)) (exit 0))
  14.         (set! field-list (force (cdr field-list)))
  15.         (iter (+ count 1)))
  16.     (iter 1))

playの定義はこっちのが綺麗ですよねーってなるよねぇ…

No comment
taintedsong.com taintedsong.com taintedsong.com

SchemeでLifeGame v2

他の人の投稿も見てみた結果こうなった

SCHEME:
  1. (use srfi-1)
  2. (use srfi-27)
  3.  
  4. (define width 14)
  5. (define height 10)
  6.  
  7. (define population 0.3)
  8.  
  9. (define birth '(3))
  10. (define keep '(2 3))
  11.  
  12. (define element-x car)
  13. (define element-y cadr)
  14. (define element-value caddr)
  15. (define (make-element x y v) (list x y v))
  16.  
  17. (define (step-exec value next proc)
  18.     (define (iter value cc)
  19.         (cc value
  20.             (lambda () (iter (next value) cc))))
  21.     (lambda ()
  22.         (iter
  23.             value
  24.             (lambda (value cc) (proc value) cc))))
  25.  
  26. (define (make-field)
  27.     (define (flatten x) (fold-right append '() x))
  28.     (map
  29.         (lambda (e) (make-element (car e) (cadr e) #f))
  30.         (zip
  31.             (apply circular-list (iota width 0))
  32.             (flatten
  33.                 (map
  34.                     (lambda (x) (iota width x 0))
  35.                     (iota height 0))))))
  36.  
  37. (define (print-field field)
  38.     (define (print-cell e)
  39.         (if (element-value e)
  40.             (display "[*]")
  41.             (display "[ ]")))
  42.     (let loop ((left field))
  43.         (if (not (null? left))
  44.             (begin
  45.                 (print-cell (car left))
  46.                 (if (= (element-x (car left)) (- width 1))
  47.                     (newline))
  48.                 (loop (cdr left))))))
  49.