トップ 最新 追記

Route 477



2010-05-24

[lisp][scheme] 社内勉強会でLisp概論的な話をした

(以下、わりと適当な資料)

Lispといえば?

  • 最初の動的言語
  • 最初のGC付き処理系
  • 人工知能研究の言語として活躍
  • 括弧
  • マクロ

  • 1957年 FORTRAN
  • 1958年 ALGOL58, LISP
  • 1960年 COBOL
  • 1964年 BASIC

LISP戦国時代

  • 方言の乱立

LISP二大政党時代

Common Lisp (1984-)

Scheme (1975-)

  • ミニマリズム
  • 処理系間の独自拡張が多い
  • http://www.r6rs.org/
  • LISP-1
  • #tと#f ('()は真)
  • PLT Scheme, MIT Scheme, Guile, Chez Scheme(商用), ...
    • Gauche, SigScheme, Mosh, Ypsillon, BiwaScheme
  • 関数型、一級継続、末尾最適化の保証(←再帰)

もともとの開発の動機は、継続や末尾再帰といったプログラミングのコンセプトを使って、彼らが研究していた平行プログラミングにおける制御構造の理論を検証するためだったという。

[Scheme - Wikipediaより引用]

新党

4274067890

  • Clojure
    • JVM上で動作、並列
  • Nu
    • Objective-Cとの親和性
  • Cyan
    • Ruby/Python風の構文+Lispマクロ

速習Scheme (1) 評価方法

http://www.biwascheme.org/ でREPLを開いてください

基本形:

 (func a b c)

 (+ 1 2 3)
 (string-append "Hello, " "world!")

特殊フォーム:

 (if (= 1 1) (print 1) (print 2))
 (and 1 2)

(2) クオート

特殊フォーム「quote」

 (print (quote (+ 1 2 3)))  ; 評価されない
 (print '(+ 1 2 3))         ; 上の省略形

プログラムを、とても簡単にデータと同様に扱える

 (eval '(+ 1 2 3))

*1

シンボル

 (print a)  ;=> エラー
 (print 'a) ;=> シンボル「a」が表示される

Schemeのシンボルは、Rubyのシンボルと同じようなもの*2

(3) リスト

配列ではなく、連結リスト

 '(a b c)
 +---+---+   +---+---+   +---+----+
 |'a |  ---->|'b |  ---->|'c | () |
 +---+---+   +---+---+   +---+----+
 (car '(a b c))
 (cdr '(a b c))

4757727151 S式 = ツリー構造を書き下すための記法

 '((1 2) (3))
 +---+---+                   +---+---+
 |   |  -------------------->|   | ()|
 +-|-+---+                   +-|-+---+
   |  +---+---+   +---+---+    |  +---+----+
   +->| 1 | ----->| 2 | ()|    +->| 3 | () |
      +---+---+   +---+---+       +---+----+

最後のcdrに物を入れることもできる(「.」を使って表記する)

 '((1 . 2) (3 . 4))
 +---+---+    +---+---+    +---+---+
 |   |  ----->|   |  ----->|   | ()|
 +-|-+---+    +-|-+---+    +-|-+---+
   |  +---+---+ |  +---+---+
   +->| 1 | 2 | +->| 3 | 4 |
      +---+---+    +---+---+

(3) マクロ

  • 特殊フォームを自分で定義できる
  • defmacro(CL)/define-macro, syntax-rules(R5RS), syntax-case(R6RS)

例:

 (assert-equal (+ 1 2) 3)
 -> (if (equal? (+ 1 2) 3) #t (print "error in " "(+ 1 2 3)"))
 (assert-equal <code> <value>)
 -> (if (equal? <code> <value>) #t (print "error in " <code>))
 (define-macro (assert-equal code value)
   `(if (equal? ,code ,value) #t (print "error in " ',code)))
 (assert-equal (+ 1 2) 3)

 (assert-equal (+ 1 2) 4)
  • マクロは「コードを受け取ってコードを返す手続き」
    • プログラムをプログラミングする=メタプログラミング

参考文献

Common Lisp

  • 網羅的な4894714337
  • 作りながら学ぶ4274067211
  • 堅苦しくない4798119415
  • 関数型への入門4839920818

Scheme

  • 概要から応用まで4873113482
  • 対話で学ぶ0262560992 (※洋書。和訳は絶版)
  • 網羅的な4894712261
  • 名著にして積ん読489471163X

その他

  • Effective Macros4274066371
  • More Effective Macros4434133632
  • 新党4274067890
  • 名著*3にして鈍器4798118907

無料で読める原書リンク

*1 BiwaSchemeのevalは手抜き仕様なのでこれが通るが、本当は第二引数が必要

*2 Common Lispのシンボルは、もっといろいろ付加情報を持っている

*3 らしい


2010-05-23

[lisp][memo] '()が偽であるか真であるかについての議論

空リスト('())は、Common Lispでは偽、Schemeでは真なのですが。それについてのshiroさんの考察。

(null? hoge)で基底条件判断するのと、(zero? hoge)で基底条件判断するのは同型。前者の方だけが特に気になるとすれば、そういうパースペクティブで見ているってこと。

[Gauche > Archives > 2010/05/19より引用]


2010-05-20

[prog] Webとアプリ

オープンな技術であるWebと、iPhone/Androidアプリなどの「モバイル端末専用アプリ」についての話。

ルック&フィールの観点でそれらを考えたことがなかったので新鮮だった。

もっと急速にWebオンリーの世界になるかと思ってたんだけど、モバイルアプリが対抗するってのは考えてなかったな。


2010-05-17

[ruby] rulebook - 正規表現による動的メソッド定義

require 'rulebook'

class User
    attr :name, :title

    def initialize(name)
        @name = name
        @title = :user
    end

    rule /is_(admin|moderator|super_user|user)/ do |title|
        @title = title.to_sym
    end
end

「rule + 正規表現」で、複数のメソッドを同時に定義する*1。 ruleという名前はともかく、結構良いかなと思ってしまった。

*1 ように見せかける、かな。多分method_missing


2010-04-30

[tetris] 「一番来てほしくないミノ」が来続けるテトリス

18ラインとかで死ぬ。難しすぎる。

初代TGMプレイヤーとかで、「ツモを信じないスタイル」を極めてる人だとどれくらいできるんだろうか。

んで、それをさらに厳しくしたのがこっち。

アクション性もランダム性も排除されているので、どっちかというと理詰めパズルに近い。

(from 秋元@サイボウズラボ・プログラマー・ブログ : Hatetris 超高難易度テトリス)

[web] < SL >: 電子書籍のフォーマットには HTML を使いましょう

同意。

pragprogの本をPDFやepubで読んでみたけど、ページ単位でしか表示できないのがすごく違和感あるんだよな。 HTMLみたいにだらーっとスクロールしながら読みたい。{{fn "PDFだとページごとにヘッダ・フッタが入ってたりして邪魔なんだ。スクリーンの幅に合わせてもくれないし(epubはこのへんはクリアしている)。}}

本って、本来は連続したコンテンツなわけで、ページに切らないといけなかったのは印刷・組版の都合上ですよね。 電子デバイスには不要なはず。

iBooksだとページをめくるアニメーションとかが出て「すごい!」という気になっちゃうんだけど(笑)。 デジタルデバイスに馴染みのない人のために、電子書籍の心理的な抵抗を減らす*1 という意味では大事なのかも知れんけど、少なくとも技術書くらいは、連続表示できる形態で読ませて欲しいです。

(iPhone/iPadで、epubをそういう表示にできるソフトがあったら教えてください)

*1 「ほらほら、こんな機械に入ってますけど、これは『本』なんですよ」

[lisp] Common Lispで人工知能を学ぶ本「PAIP(Paradigms of Artificial Intelligence Programming)」の訳書が発売

過去に読書会も行われていた (らしい)、 PAIPこと「Paradigms of Artificial Intelligence Programming」の 翻訳書が出るそうです。

4798118907

人工知能の本だと思ってたんですが、タイトルは「実用Common Lisp」。

これを読むと、プログラミング、Lisp, AI(人工知能)のことがわかります。

 特に、Lisperの問題のとらえ方、解き方、発想法、いかにもLisp的なプログ

ラミング技法(たとえばマクロや高階関数)もわかります。

[緊急特報!Peter NorvigのPAIPの翻訳「実用 Common Lisp」が出る\(^O^)/: ホットコーナーの舞台裏より引用]

ということなのでLisp側に倒したのかな。(あるいはLisp本の方が売れる?) 確かに「」(Practical Common Lisp)と紛らわしいですが。

6.でも,今読むものとしては,NorvigのPAIPがダントツのお勧めです.

最初これを出た直後のアメリカの学会で買って,読んで見て,驚天動地の思いでした.よく一人の人間がこれだけ纏めて書けるものだと.それからは,Russell&Norvigの人工知能が出るまでは,これが私のバイブルでした.

[セマンティックウェブ・ダイアリー:PAIPより引用]

原書はこちら:Paradigms of Artificial Intelligence Programming

1558601910

本日のツッコミ(全3件) [ツッコミを入れる]

ujihisa [epubに関して。個人的には両方選択できるのがいいですね。たとえば僕はブラウザではスクロールせずにページ単位で一気に..]

zunda [SICPのHTML版 http://mitpress.mit.edu/sicp/full-text/book/boo..]

FSIZq [<a href=http://eatatunion.com/drink/#tpk>xanax 1mg</a> gen..]


2010-04-28

[presen] プレゼンテーションのスライドに顔文字を使うというアイデア

顔文字っていうかemoticonですか。

29f7d24883b7938e93623d126240c882.png

「これはいいことなのか、悪いことなのか」が直感的に分かるのでいいかも。

from とりあえず僕のスライドを公開 - あどけない話

[ruby] rvmを使うと、複数のRubyを共存したり、Rails 2/3を共存したりできる

という話がRuby Freaks Loungeに上がってましたね(丸投げ)。

今のところMacPortsのruby 1.8.7を普段使いとして、自前コンパイルの1.9.1を動作確認用として使ってるんだけど、 そろそろrvmに乗り換えてもいいかなーと思ったり。

rvmの利点の一つはgemsetで、Rails 2.3.4とRails 2.3.5とRails 3 beta3 を共存させたりできる。(使う前にrvm use ruby-1.8.7@rails3 みたいにして切り替える)

gemsetの仕様がまだ把握できてないんだけど(というか仕様固まってるのかなw)、

  • 各Ruby処理系ごとにいくつかのgemsetを作れる
    • 例:ruby-head@rails3, ruby-head@rails2, ruby-head (←デフォルトのgemsetは無名)
  • "global"という名前のgemsetにインストールしたgemは、そのRuby処理系に共通のものとなる
    • 例:ruby-head@globalのgemは、ruby-head@rails3、ruby-head@rails2、ruby-headのどれからでも見える

ということでいいのかな。

つまり"global"とはいえRuby処理系をまたぐことはできないと。まあCRubyとJRubyだとインストールするgem違ったりするから(拡張ライブラリ系のやつね) そんなもんかな。

本日のツッコミ(全1件) [ツッコミを入れる]

sorah [rvmはごちゃごちゃしてるからなあ。 ruby-tapperとかいう代物を作ってしまった。]



2010-04-16

[rails] Rails2/3用の認証プラグイン「devise」

Railscastsに簡単な紹介が上がってますのでそちらをどうぞ。

特徴は

  • 必要なモデル・コントローラはUserのみ (Sessionは使わず、/user/sign_in とか create_user_session_path とかを使う)
  • 認証周りのいろいろな機能がそれぞれモジュール化されている (confirmable, :recoverable, :rememberable...)

とか。

Ruby Toolboxの他のプラグインとの比較は:

Authlogic: a really great piece of code and functionality, but a bit messy by handling the session in a model. It also only handles the model part.

Clearance: full stack, Rails Engine, extra modules, everything we needed. However, packaged with a User model and without the ability to customize it.

[Happy Birthday Devise | Plataforma Tecnologia Blogより引用]

だそうで。

[prog][iphoneos] iPhone OSのインタプリタ禁止縛りについての徒然

@nanki, @ujmとのチャットのまとめ。

  • Opera miniってJS動かないよね
  • 動くよ
  • あれ、インタプリタ禁止じゃないの?
  • →調べたら、JSはサーバサイドに贈って実行してたw無茶しやがる
  • ということはRubyコードをサーバ側で動かせばirbも…!
  • ていうかライフゲームは認証通ってるじゃん、チューリング完全なのに
  • ということは
  • 「全く新しい形のライフゲームです!!」と言い張れば
  • brainf*ckも通るし、irbも通る
  • プログラマブル電卓みたいのもインタプリタだよね
  • 「高機能な電卓です!!」と言い張れば、irbも(ry
  • それではこの画像を見ていただこう

00b59c933ccbf677af63a9e666063a81.png

  • 関数電卓どころか、既にRoR (Ruby on Rails)まで実装済み…だと
  • (1)チューリング完全でない
  • (2)ネイティブライブラリを叩けたりしない
  • (3)外部からコードを持ち込まない
  • のいずれかを満たせば認証が通る、という仮説。
  • irbは明らかにプログラミング言語っぽいので通らないのではないか
  • ということは明らかなプログラミング言語でなければ通るのではないか=時代はesolang
  • 例:将棋ソフトに偽装したModanShogiインタプリタ
  • 「このファイルを削除しますか?(成/不成)」

2010-04-14

[ruby] Common Lisp的な、「再開可能な例外」をRubyで

実装は以下。もちろん継続ですw

例:

10.times do |i|
  begin
    raise "OH NO!"
    puts "OH YES! #{i}"
    i += 1
  rescue => err
    if i < 5
      err.continue  ### これ(Exception#continue)が「例外が発生した次の行」に飛ぶ
    else
      raise err
    end
  end
end

実行結果:

/tmp % ruby-1.9 -rcontinuation a.rb
OH YES! 0
OH YES! 1
OH YES! 2
OH YES! 3
OH YES! 4
a.rb:48:in `rescue in block in <main>': RuntimeError (RuntimeError)
        from a.rb:40:in `block in <main>'
        from a.rb:39:in `times'
        from a.rb:39:in `<main>'

2010-04-04

[ruby][book] Rubyを使いこなすための一冊、『Rubyベストプラクティス』

「Ruby Best Practices」の和訳がオライリーから出て、読みたいなーと思っていたらなんと献本をいただいてしまった。 有り難いことです。

4873114454

内容を一言でまとめると、「実践Ruby」あるいは「Ruby中級者レッスン」という感じ。 4873113008の方とはちょっと毛色が違ってて、Rubyの正しい書き方というより、 Rubyを実践的に使う際のさまざまなトピックについて解説されている。

Rubyでプログラムを書き始めた人から、Rubyを長く使っている人まで、読めばなにかしら得るものがあるだろう。 僕も(まだところどころしか読んでないが)いくつか「なるほど」と思うことがあった。

1章はテストについて。

2章はRubyでのAPI設計について(引数・ブロックとかね)。

3章はRubyの動的さを生かしたテクニックについて。

4章はテキスト処理とファイル管理について(tempfileとか)。

5章はRuby上での関数型プログラミングのテクニックについて(無限リストとか)。

6章はデバッグ(inspectやLogger)について。YAML(Kernel#y)をppの代わりに使うというのはなるほどなぁと思った。

7章は他言語化について(CSIなやり方、UCSなやり方、アプリの他言語化)。

8章はライブラリをgem化して配布する際のいろいろな話題。

さらに、付録Aは1.8と1.9の両方で動くRubyスクリプトを書く方法、付録Bは便利な標準添付ライブラリの使い方が紹介されている。どこまでも実用的な本書なのであった。

最後の付録Cでは、「Rubyワーストプラクティス」として、いくつかのやらない方が良いことが列挙されている (「eval使いすぎ」とか)。

さて、実は英語版が先日からPDFで全文公開されている…どころか、本の原稿そのものが公開されていたりする。

だが日本語の方がやっぱり読みやすいし、物体としての本は、存在するだけで「読まなきゃ」というリマインダになる :-)。


2010-04-02

[esolang] プログラミング言語ModanShogiを公開しました

gihyo.jpのエイプリルフール企画のために、プログラミング言語ModanShogiを作りました。

おおむね好評/だったようで良かったです。

処理系も作ったので、良かったら実際に動かして遊んでみてください。アセンブラ知ってる人なら簡単だと思います。 *1

Strictモードについて

記事中に「不正な駒の動きをエラーとするStrictモードの搭載を予定している」みたいなネタを書いたところ、 Strictモードで実際にプログラムを書いてしまった人が!

putcが小数に対応してない件は修正しました。ありがとうございます。

小数を仕様に含めたのは、単にいままで含めたことがなかったのでやってみたかっただけなんですが、まだいろいろ調整が必要そうですね (特にputn周り)。

ラベルが「*1」なのはなんというか苦肉の策です。元々は:jump_ifは「指定した値の数だけ命令を飛ばす(pc+=val)」みたいな仕様を考えていたのですが、 実際にfizzbuzz書こうとしたらループ内の命令増やすだけで命令数数え直しでさすがにマゾすぎたので、こうなりました。 確かにラベルの個数が9個までで良ければ、構文を増やす必要は無かったですね。「▲5九成銀」で [:label, 5] 相当とか、どうだろうか。 成銀とか使いづらいので大変そうですが*2。入れたい命令が多すぎて困る。

Strictモードはほとんどバランス調整してないんですが、一応気をつけたのは

  • なるべく緩くする (先手後手や、「打」「右」「引」に意味を持たせない)
  • 実戦での駒移動の頻度と、命令の実行頻度が (できるだけ) 近くなるようにする

くらいでしょうか。でもまあ難しかったです。

[図1] 161手目まで - 先手、挨拶六段の勝ち

635ef00baae52edf49f3bf0393401b9a.png

[図2] 92手目まで - 後手の勝ち

1b0d1d1ca2939446a89d198f44f78a43.png

言語名について

棋譜をモチーフにするというアイデアはわりと前から考えてて、レジスタVMも面白そうだな ということでこうなりました。

最初はModernShogiにしようかと思ってたんですがさすがに迷惑 かなということでこうなりました。

当初は別の言語(Sumotalk)の方を考えてたんですが、一向にまとまらないので放置することになりました…が、 100%満足行かなくても公開すればいろいろ良いフィードバックがあることを学んだのでこっちもできればそのうちに。

将棋については駒の動かし方くらいしか知らなかったので、マーケットプレイスで4冊ほど買って読んでみました。 どれも面白かったですが、言語仕様には特に影響がなかったですw 4120040283 4047100080 4480063927 4047101079

*1 youzさんが CommonLispに移植してくださってるみたいです

*2 棋譜としては「成銀」じゃなくて「金」と書けば済むことで、「金」では曖昧性が生じる場合にのみ成銀と書くはずです。というかその場合でも「金右」「金引」とかで書く方が多いのではないかな

[ruby][english] InfoQの動画はけっこう英語の勉強になると思う

なぜなら文字起こしがあるからである。喋ってることのほぼ全文がテキストとして提供されている。有り難いことである。

たまに文字起こしじゃなくてスライドのときもあるけど。

本日のツッコミ(全1件) [ツッコミを入れる]

ょゎ [おかげさまで、久しぶりに esolang プログラミングを楽しめました。 ありがとうございます。 > 曖昧性が生じ..]


2010-04-01

[esolang] プロのesolang作家としてデビューしました

Rubyで作る奇妙なプログラミング言語」の上梓から1年。Esoteric Languageの概念も人口に膾炙したと判断し、奇妙なプログラミング言語を有償で製作する事業を開始いたしました。いわゆるプロesolang作家です。

4839927847

第一弾となる「ModanShogi」がgihyo.jpのサイトで公開されています。お楽しみ下さい。

今後は後輩の育成に励み、日本esolang作者協会を設立して利権で儲けるなどしたいと思います。よろしくお願いします。

本日のツッコミ(全1件) [ツッコミを入れる]

naoya_t [モダン焼フジ!!!]


2010-03-29

[prog] STM(ソフトウェアトランザクションメモリ)

関数プログラミング入門 の後半が面白かったのでメモ。

  • CPUのクロック数が頭打ちに → これからは並行処理しないと速くならない時代
  • でもロックはいろいろ大変…
    • ロック過剰→性能低下
    • ロック不足→再現しずらいバグ
    • デッドロック
    • 組み合わせ問題 (スライドp.86-)
  • そこでSTM (ソフトウェアによるトランザクションメモリ)ですよ
    • データベースのトランザクションに似たもの
    • 実行してみて、競合してたらやり直し
    • 性能的には劣るが扱いやすい
  • トランザクションの中ではIOとかやっちゃだめ(複数回実行されることがあるから)
    • 気をつける (Clojure等)
    • 型システムで、トランザクション中にIOがないことを保証 (Haskell) ←かっこいい

2010-03-27

[ruby][windows] nyacusだとpikがうまく動かない

pikは、Windows上で複数のRubyを切り替えて使うためのソフト。

例えば

$ pik add c:\ruby\bin
$ pik add c:\ruby-1.9\bin
$ ruby -v
1.8.ほげほげ
$ pik use 191
$ ruby -v
1.9.ほげほげ

みたいな感じになる。

のだが、nyacus上だとpik useがうまく動かない。

ソースを読んでみる。

pikは基本的に%PATH%を操作するという設計っぽいのだが、

       WindowsEnv.user.set(k => v) if global

という行があって、どうもwin32/registryを使って HKEY_CURRENT_USER.Environmentを直接書き換えてる模様。うーむ。

本日のツッコミ(全2件) [ツッコミを入れる]

miyamuko [nyaos で pik を使う方法を書いてみました。 http://d.hatena.ne.jp/miyamuko/..]

yhara [ありがとうございます!ためしてみます。]


2010-03-25

[book] C++0x本

私のC++0x本の執筆活動のため、寄付をお願いします。

[本の虫: 寄付のお願いより引用]

規格制定中の、C++の新バージョン「C++0x」の規格に沿った日本語によるC++の参考書を執筆中とのこと。

私は、既存の日本人の手によってかかれたC++の参考書に、満足していない。入門書はある。入門書は。しかし、いずれも、特定のコンパイラや、環境の挙動に依存していたり、規格への理解が乏しい者の手によって書かれた本ばかりである。C++の良書と呼ばれている日本語の本は、たいてい、翻訳本である。私は、これを打ち破りたい。幸い、私は規格を読むだけの能力がある。

[本の虫: 寄付のお願いより引用]

作家業って、処女作を書き上げるまでは完全に無収入なんだよなぁ。

寄付はPayPal経由で受付け。Pledgieって、githubでよく見るやつだね。


2010-03-19

[prog] GC(ガベージコレクション)に特化した日本語書籍が発売、"早くも出版社在庫は品切れ"

@nari3@_hikari_によるGC本が発売された。監修は竹内先生。 予想を上回る売れ行きに、既に出版社在庫が品切れらしい。どういうことなの…。

4798025623

[5F] 『ガベージコレクションのアルゴリズムと実践』中村成洋ほか¥3360(秀和システム)レジ前の新刊コーナーと情報科学のコーナーにて平積みしています。早くも出版社在庫は品切れです。購入を予定されている方はお早めに!!

[Twitter / 書泉グランデ: [5F] 『ガベージコレクションのアルゴリズムと実践 ...より引用]

「GC(ガベージコレクション)」は、プログラムの実行中に不要になったメモリを自動的に解放する機構のこと。 JavaやRubyを始め、現代においてはGCのない言語処理系の方が珍しいくらいだ。

そんな重要なGCであるが、GCを専門に扱った書籍は、いままでに洋書の「Garbage Collection」の一冊しかなかった。 世界で二冊目のGC本が、日本から出たというのは、なかなか凄いことじゃなかろうか。*1

0471941484 1420082795

さて一口にGCと言っても、メモリ効率を重視したもの、トータルの実行時間を重視したもの、一回の停止時間を重視したものなど、 さまざまなアルゴリズムと実装が存在する。本書では、代表的な8つのアルゴリズムと、実際の4つの言語処理系のGCの実装について解説されている。

●序章
 GCとは / GCの恩恵 / GCの歴史 / なぜ今GCなのか / 読者対象 / 本書の表記

●アルゴリズム編
第1章 GCを学ぶ前に
第2章 マークスイープGC(Mark Sweep GC)
第3章 参照カウント(Reference Counting)
第4章 コピーGC(Copying GC)
第5章 マークコンパクトGC(Mark Compact GC)
第6章 保守的GC(Conservative GC)
第7章 世代別GC(Generational GC)
第8章 インクリメンタルGC(Incremental GC)

●実装編
第9章 PythonのGC
第10章 DalvikVMのGC
第11章 RubiniusのGC
第12章 V8のGC

●補遺
補遺A 簡単言語入門:Python編
補遺B 簡単言語入門:Java編
補遺C 簡単言語入門:Ruby編
補遺D 簡単言語入門:JavaScript編
補遺E 参考文献

Pythonはご存じとして、はAndroid用のJava VM、 Rubiniusは「できるだけRubyで書く」Ruby処理系、V8はGoogle Chromeに搭載されているJavaScript処理系だ。

人生で3回GCを実装しているというまつもとゆきひろ氏*2による帯の文章も格好いいので、書店で注目してみてほしい。

*1 いまAmazon見たら、今年の11月に「Advanced Garbage Collection」が発売予定になってるな。

*2 一部で「帯職人」の異名があるらしい?


2010-03-18

[ruby] Hashのデフォルト値にHashを設定しようとしてはまった話

h = {}
ary.each do |x, y, z|
  h[x] ||= {}
  h[x][y] = z
end

をもっと短くしようとして、

h = Hash.new{ {} }
ary.each do |x, y, z|
  h[x][y] = z
end

としたら上手く動かない。あれっ?

デフォルト値が{}じゃなくて数値の場合、例えば

h = Hash.new{ 0 }
ary.each do |x|
  h[x] += 1
end

みたいのはちゃんと動くわけです。上のとどう違う?

 h[x][y] = z

はどういう動作になるか考えてみよう。

  • hにxというキーがある場合: h[x]というハッシュに、(y, z)のペアを保存。
  • hにxというキーがない場合: ブロックが呼ばれて、その値が返る。返り値であるハッシュに、(y, z)のペアを保存。

というところで気づきましたが、後者が原因ですね。毎回新しいハッシュが作られて捨てられてしまう!

というわけで

h = Hash.new{|h, k| h[k] = {} }
ary.each do |x, y, z|
  h[x][y] = z
end

が正しいコードでした。

まあ素直に冒頭のように書けばいい気もしますが。

[ruby] メソッドが最初に呼ばれたときだけ処理を実行する

例えば、重い計算をキャッシュしたい時とか。

begin-endを使うとこう書ける。

  def start_server
    @started ||= begin
      # 重い計算

      true
    end
  end

(以下、余談)

ただなー、偶然@startedという名前が被ってしまう可能性が残ってしまうのが気になる。

こういう場合、Schemeとかだと以下のようにして関数ローカルな状態変数を作れる。

(let ((started #f))
  (define (start_server)
    (unless started
      ; ...
      (set! started #t))))

Rubyで同じことができないかと思ったが駄目だった。

  proc{
    started = nil
    
    def start_server
      started ||= begin  #=> このstartedはfooのローカル変数になってしまう
        # ...
        true
      end
    end
  }.call

[ruby] Ruby 1.9.2のリリースプランが発表 (7月末リリース予定)

  • 3月末日 : 仕様の凍結 (この日までに合意が得られなかった仕様・修正は1.9.2に入らない)
  • 4月末日 : コードの凍結 (この日までに実装できなかった仕様・修正は1.9.2に入らない)
  • 5月末日 : 1.9.2-preview2
  • 6月末日 : 1.9.2-rc
  • 7月末日 : 1.9.2-p0 (正式リリース)

ということで、8月末のRubyKaigi2010に合わせた感じになったようです。

Ruby 1.9.2の新機能

Ruby 1.9.2は、既に公開されている1.9.1に対し、完成度を高めたバージョンです。特にTimeクラスの2038年問題が解決されたのが嬉しいですね(最近はまったので)。

この他大きめの新機能の一覧が、先日公開されたRubyist Magazine(るびま)で列挙されています。

Ruby 1.9.2の非互換

重要な非互換としては、$LOAD_PATHに"."が入らなくなったことが挙げられます。

例えば main.rb と util.rb が同じディレクトリにあった場合、従来は main.rbから以下のように直接util.rbを読み込むことができました。

require 'util.rb'

...

ですが、1.9.2ではセキュリティ上の理由から、これができなくなりました (Unix で、PATHに"."が含まれないのと同じでしょうか)。

対応としては、とりあえず「./」を明示的に付ければOKです。

 require './util.rb'

が、(元のスクリプトもそうですが) これだと別のディレクトリからmain.rbを起動した際にうまく読み込めません。 Ruby 1.9.2では、現在のファイルからの相対パスでrequireするファイルを指定するメソッド、require_relativeが追加されました。

 require_relative 'util.rb'

このようにすると、main.rbと同じディレクトリにあるutil.rbを必ず読み込むことができます。

従来は同じことをするのに

 require File.expand_path(File.join(File.dirname(__FILE__), "util.rb"))

と書く必要があったので、特にユニットテスト内からtest_helper.rbを読み込んだりする際にはとても便利になりました。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

yhara [どうなんでしたっけ?(おい) その方が良さそうですね。ありがとうございます。 (もとのstart_serverは無引..]

nanki [class Once def run class << self v = rand ..]

shugo [define_method使えば一応できるけど、conforming programじゃないね。 proc{ ..]


2010-03-16

[ruby] Ruby meets Manpage

manは、Unix系OSで一般的に使われているドキュメントシステムだ。 これを、Rubyのgemに対しても応用できないかという試みが現れた。 その名もgem-man

gem install gem-man

とすると、

gem man <gem名>

でそのgemの説明が見られるようになる。例えば

gem man gem-man

とか。

ライブラリ作者の側では、gemを作る際にman/以下にmanのファイルを置けばいい。

manファイルの作り方はman whatが参考になりそう (ronnを使う例が載っている)。

おまけ

http://man.cx/ruby : ネットでmanを引けるサイト。

[prog][memo] Test Doubleいろいろ

名前インターフェイスの実装用途・備考
dummy実装しない引数として渡すが、使われない
fake実装するただし本物よりは性能などが劣る、仮実装
stub実装するあらかじめ決められたものを返す
mock実装する期待した呼ばれ方かどうかをテストする
spy実装する呼ばれ方を記録して、あとで確認する

[ruby] Rubyスクリプトをcronで回したいときはどうすれば良い?

ありがちな罠:

  • PATHがいつもと違うせいので、portsで入れたやつじゃなくてMac標準のRubyが実行される
  • GEM_HOMEがいつもと違うせいで、ライブラリが読み込めない
  • RUBYOPT=rubygemsがないせいで、ライブラリが読み込めない

というのを避けるためには、どうするのが正しいんでしょう。

とりあえずcrontabの冒頭でこれらを設定することでなんとかなったが。

PATH=/Users/yhara/bin:/opt/local/bin:/opt/local/sbin/:/usr/local/bin:/usr/bin
GEM_HOME=/some/where
RUBYOPT=rubygems

0 * * * * /Users/yhara/proj/etc/cron_hatenagraph/hatena_graph.sh 
本日のツッコミ(全1件) [ツッコミを入れる]

okkez [自分ならラップしたシェルスクリプトを用意するかなぁ。]


2010-03-15

[gadget][prog] iPadは「プログラミング黄金時代」の終焉の始まりか?

来月に発売が予定されているiPadを以て、アップルは「パソコン」を置き換えようとしているように見える。 インターネット、メール、ゲーム、ワープロ、表計算。普通の人がパソコンに求める大半の機能が用意されている。

だけど、プログラミングはできない。

iPadには「ターミナル」も「コマンドプロンプト」もないし、実用的なプログラミングを学べるようなアプリも作ることができない (irbのような、実行時に動作が大きく変わり得るものは申請してもアップルの検閲を通らない)。

そのうち、物心ついて最初に触ったマシンがiPad、という世代が出てくるだろう。 さて、彼らはどうやってプログラミングの楽しさに出会うのか?

iPadと同カテゴリになりそうなChrome OSも、ネイティブアプリは一切動かせないので同様の問題を抱えている。 「次世代のパソコン」として覇権を握るのがiPadなのか、Chrome OSなのか、Androidなのか、あるいはこのままWindowsがシェア一位を保つのか分からないが、 どんな言語の処理系も、ネットからダウンロードするだけですぐにプログラミングが始められる現代を「あの頃はプログラミング黄金時代だったよなぁ…」と振り返る未来は避けたいところだ。

[prog] iPadでなんとかしてプログラミングを体験する方法を考える

補足しとくと上の「プログラミング黄金時代」は http://www.nicovideo.jp/watch/sm8249954 からです。

JavaScriptで頑張る

ブラウザ内でFlashプログラミングができるwonderflというのがあるが、 あれのJS版 (wonderjs?) を作れば、iPadのSafariでもJavaScriptでプログラミングが楽しめる。(wonderfl自体は、FlashなのでiPadでは使えない)

言語がJavaScriptに限られるけど、これは「JavaScriptで別の言語の処理系を作る」という奇手である程度対応できる。BiwaSchemeのようにね。

コードは別のマシンで動くことにする

Ruby用レンタルサーバのHerokuが昔やっていたように、クラウドで動くアプリをブラウザ上で書けるような何か。

うーん

どっちにしろVimで書けないので僕は使いたくないですね :-(

本日のツッコミ(全3件) [ツッコミを入れる]

masuidrive [http://widgetpad.com はどうでしょう?]

alohakun [そもそも最近の若い人たちは、既にパソコン使ってないとも聞きます。 みんな携帯電話でメールもインターネットも。]

通りすがり [おおっ、最先端を走るジジイの繰り言の例を見た気がした!]


2010-03-11

[ruby] RubiniusのJITコンパイル

開発者Evan Phoenixの記事。

http://www.engineyard.com/blog/2010/making-ruby-fast-the-rubinius-jit/

[ruby] 世界のRUG (Ruby User Group)

http://www.rubyusergroups.org/

宝石がグループ、人型がユーザ。南米が熱いな。

93786bc6148e7f09442fef7f18047027.png

via RubyInside


2010-03-02

[git] githubで任意の2点間のdiffが取れるようになったぞ

(from Introducing GitHub Compare View - GitHub)

例1:

compareの後に、始点と終点を書く。

例2:

ブランチ名だけでもOK。

例3:

タグ名を使った例。リリース間の変更点が見られる。


2010-02-22

[ruby] Ruby関係のTipsを集めたTumblrアカウント : Ruby Quicktips

Ruby/Rails関係のTipsが集まっています。中級のが多いかな。

irbで、直前の評価値が「_」に入ってるってのは知らんかった。 便利だ…。

via RubyInside

本日のツッコミ(全1件) [ツッコミを入れる]

otn [bashでも直前のコマンドが「_」に入ってます。役だった経験はないですが。]


2010-02-21

[rails] Rails3に関するさまざまないろいろ

Rails勉強会@東京です(講師:松田さん)

準備

$ gem install rails3b
$ gem install rails --pre
$ gem update

プロジェクト作る

 $ rails books --edge
  • Gemfileに、依存ライブラリ(gem)の情報を書くように。Bundler
  • --edgeなので、「gem "rails", :git => "git://github.com/rails/rails.git"」になっている
  • script/*がscript/railsに
  • 単にrailsでもいい(カレントのscript/railsが呼ばれる)
    • rails_head/railties/bin/railsを参照
  • rails generate
  • あるいはrails g
  • config/environment.rb
    • アプリ名がクラスに! (Books)
    • モデル名と被らないように注意

(このへんでbundlerがハマる)

  • rails g scaffold book title:string price:integer
  • 色が付くように
  • rails aboutがrake aboutに(どうでもいい?)
  • 長いrespond_toブロックの代わりにresponds_with :xmlみたいになるかも(!)
respond_to :html, :xml
def index
   @books = Book.all
   respond_with @books
end
  • validates :title, :presence => true (カラム名を軸にした書き方が)

RSpec

  • RSpecの2.0系(未リリース)はRails3対応
  • Gemfileに gem "rspec-rails', '2.0.0.a5', :group => :test
  • rails g rspec:install で生成

scope

  • scope :titled, lambda{|t| where :title => t}
  • @books = Book.scoped.titled(str)
  • scope :title_like, lambda{|t| where "title like ?", "%#{t}%"}
  • 今後のARの推奨は、find(:condition => ...)じゃなくて
    • Book.where(:title => 'aaa').count のような。
    • whereはさらに連結できる

ビュー

  • scaffoldが_formを作るように
    • app/views/books/_form.html.erb (newとeditから参照されている)

ActiveModel

  • 普通のクラスをモデル扱いさせたりできるぜ
    • form_for(@books_search_form) とするために、
    • #to_model, #to_key, #new_record?が必要

I18N

  • まだデフォルトの日本語訳がない! (松田さんを応援しよう)
  • cp ../rails_head/activerecord/lib/active_record/locale/en.yml config/locale/ar_ja.yml
  • cp ../rails_head/actionpack/lib/action_view/locale/en.yml config/locale/av_ja.yml

JS

  • jquery: scaffoldは対応、RJSはまだ未対応

リリースは?

  • まだバグレポート・修正が活発に
  • 4月予想

[rails] Rails3対応プラグインを探す方法

http://railsplugins.org/plugins を見ればいいそうです

[rails] OpenIDについていろいろ

  • Mixiアプリは当たれば100万人単位のユーザに使ってもらえる
    • PC用はJS、モバイル用は逆にHTTP+RESTな感じ
    • OAuthの仕様に詳しくなるらしい
  • users has_many :identity_url であるべき!
    • 例えばドメイン失効
    • 例えばサービス終了(OpenID Providerの)
    • じゃあ1つのIDでどこでも…ってわけにいかんじゃないすか
      • それはOpenIDのゴールではない
      • 「サービスごとにアカウント作らなくていい」のがいい
  • 独自ドメインをidentity_urlに使うのはアリ?
    • どのProviderのidentity_urlを受け入れるかは、サービス作成者に任されている
    • だから、サイトによってログインできないのは覚悟すべし
    • つまり、OpenIDだからって、任意のidentity_urlを受け入れないといけないわけじゃない
      • 極端な話、特定のサービス群のアカウント持ってる人だけ入れるサービスも作れる
    • というわけでホワイトリスト方式でセキュリティを高める、というのは許される
      • ブラックリスト方式は良くない
  • 要するにOpenIDは認証情報の交換のみを担当するから
    • その先のことはあんまり決まってない(自由度がある)
    • 例:AWSはAmazonのアカウントでログインするようになってるが、Amazonのアカウントで任意のサービスにログインできるわけではない
    • (社内のサービス間のユーザ情報共有としてOpenIDを使った例)

http://www.clickpass.com/

  1. clickpassにOpenIDを登録
  2. サイトのClickpassボタンをクリック
  3. Clickpass上でsignup
  4. 2回目は、Clickpasボタンを押すだけでログインできる!

[rails] プラグインの探し方とか

Rails HEADの情報は?

  • ML
  • コミット(git log)、チケット
  • チャット
  • lighthouse

@wycats vs @nk

  1. http://magicscalingsprinkles.wordpress.com/2010/02/08/why-i-love-everything-you-hate-about-java/
  2. http://gist.github.com/304407
  3. http://yehudakatz.com/2010/02/15/abstractqueryfactoryfactories-and-alias_method_chain-the-ruby-way/

repim

  • openid_authenticaitonのgenerate後、restful_authenticationいらないやってなったときに切り離すのがめんどいというモチベーション