2010-05-24
■ [lisp][scheme] 社内勉強会でLisp概論的な話をした
(以下、わりと適当な資料)
Lispといえば?
- 最初の動的言語
- 最初のGC付き処理系
- 人工知能研究の言語として活躍
- 括弧
- マクロ
- 1957年 FORTRAN
- 1958年 ALGOL58, LISP
- 1960年 COBOL
- 1964年 BASIC
LISP戦国時代
- 方言の乱立
LISP二大政党時代
Common Lisp (1984-)
- 方言の統一
- 標準規格が存在 (ANSI CL)
- http://www.lispworks.com/documentation/HyperSpec/Front/Contents.htm
- SBCL, Clisp, Allegro CL(商用), ...
- LISP-2
- tとnil
- マルチパラダイム、コンパイラ、リーダマクロ、パッケージ、CLOS
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
速習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))
シンボル
(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
無料で読める原書リンク
2010-05-23
2010-05-20
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プレイヤーとかで、「ツモを信じないスタイル」を極めてる人だとどれくらいできるんだろうか。
んで、それをさらに厳しくしたのがこっち。
アクション性もランダム性も排除されているので、どっちかというと理詰めパズルに近い。
■ [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
2010-04-28
■ [ruby] rvmを使うと、複数のRubyを共存したり、Rails 2/3を共存したりできる
という話がRuby Freaks Loungeに上がってましたね(丸投げ)。
- Ruby Freaks Lounge:第39回 RVM(Ruby Version Manager)による環境構築|gihyo.jp … 技術評論社
- Ruby Freaks Lounge:第40回 RVM(Ruby Version Manager)による環境構築(2)|gihyo.jp … 技術評論社
今のところ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違ったりするから(拡張ライブラリ系のやつね) そんなもんかな。
2010-04-18
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.
■ [prog][iphoneos] iPhone OSのインタプリタ禁止縛りについての徒然
@nanki, @ujmとのチャットのまとめ。
- Opera miniってJS動かないよね
- 動くよ
- あれ、インタプリタ禁止じゃないの?
- →調べたら、JSはサーバサイドに贈って実行してたw無茶しやがる
- ということはRubyコードをサーバ側で動かせばirbも…!
- ていうかライフゲームは認証通ってるじゃん、チューリング完全なのに
- ということは
- 「全く新しい形のライフゲームです!!」と言い張れば
- brainf*ckも通るし、irbも通る
- プログラマブル電卓みたいのもインタプリタだよね
- 「高機能な電卓です!!」と言い張れば、irbも(ry
- それではこの画像を見ていただこう

- 関数電卓どころか、既に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手目まで - 先手、挨拶六段の勝ち

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

言語名について
棋譜をモチーフにするというアイデアはわりと前から考えてて、レジスタVMも面白そうだな ということでこうなりました。
最初はModernShogiにしようかと思ってたんですがさすがに迷惑 かなということでこうなりました。
当初は別の言語(Sumotalk)の方を考えてたんですが、一向にまとまらないので放置することになりました…が、 100%満足行かなくても公開すればいろいろ良いフィードバックがあることを学んだのでこっちもできればそのうちに。
将棋については駒の動かし方くらいしか知らなかったので、マーケットプレイスで4冊ほど買って読んでみました。 どれも面白かったですが、言語仕様には特に影響がなかったですw 4120040283 4047100080 4480063927 4047101079
*1 youzさんが CommonLispに移植してくださってるみたいです
*2 棋譜としては「成銀」じゃなくて「金」と書けば済むことで、「金」では曖昧性が生じる場合にのみ成銀と書くはずです。というかその場合でも「金右」「金引」とかで書く方が多いのではないかな
■ [ruby][english] InfoQの動画はけっこう英語の勉強になると思う
なぜなら文字起こしがあるからである。喋ってることのほぼ全文がテキストとして提供されている。有り難いことである。
- InfoQ: Evan Phoenix On Rubinius 1.0
- InfoQ: Chris Wanstrath on GitHub
- InfoQ: Ruby Creator Yukihiro "Matz" about Ruby, Functional Programming and Programming Languages Design
- InfoQ: Nathaniel Talbott on Experiment Driven Design
たまに文字起こしじゃなくてスライドのときもあるけど。
2010-04-01
■ [esolang] プロのesolang作家としてデビューしました
「Rubyで作る奇妙なプログラミング言語」の上梓から1年。Esoteric Languageの概念も人口に膾炙したと判断し、奇妙なプログラミング言語を有償で製作する事業を開始いたしました。いわゆるプロesolang作家です。
4839927847
第一弾となる「ModanShogi」がgihyo.jpのサイトで公開されています。お楽しみ下さい。
今後は後輩の育成に励み、日本esolang作者協会を設立して利権で儲けるなどしたいと思います。よろしくお願いします。
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を直接書き換えてる模様。うーむ。
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による帯の文章も格好いいので、書店で注目してみてほしい。
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を読み込んだりする際にはとても便利になりました。
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いろいろ
- Ruby Freaks Lounge:第35回 実用的なダミーサーバ ww(double-web)(1)|gihyo.jp … 技術評論社
- Martin Fowler's Bliki in Japanese - テストダブル
| 名前 | インターフェイスの実装 | 用途・備考 |
|---|---|---|
| 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
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で書けないので僕は使いたくないですね :-(
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/
宝石がグループ、人型がユーザ。南米が熱いな。

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
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 で生成
- hamlジェネレータ!
- http://github.com/indirect/rails3-generators
- ↑中身はまだまだだけどプラグイン書く人は参考になりそう
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を使った例)
- clickpassにOpenIDを登録
- サイトのClickpassボタンをクリック
- Clickpass上でsignup
- 2回目は、Clickpasボタンを押すだけでログインできる!
■ [rails] プラグインの探し方とか
- 昔は: http://agilewebdevelopment.com/plugins/search?q=openid
- Rails3対応を調べるには: http://railsplugins.org/
- あとは http://ruby-toolbox.com/ ?
Rails HEADの情報は?
- ML
- コミット(git log)、チケット
- チャット
- lighthouse
@wycats vs @nk
- http://magicscalingsprinkles.wordpress.com/2010/02/08/why-i-love-everything-you-hate-about-java/
- http://gist.github.com/304407
- http://yehudakatz.com/2010/02/15/abstractqueryfactoryfactories-and-alias_method_chain-the-ruby-way/
- openid_authenticaitonのgenerate後、restful_authenticationいらないやってなったときに切り離すのがめんどいというモチベーション

□ 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..]