トップ 最新 追記

Route 477



2009-09-01

[hiki] Re: GBL

なおしました!


あとHikiDocのバージョンが上がって

[[foo|http:../foo]]

というハックができなくなっていたので、

[[foo|:../foo]]

に修正。これは直すところが沢山あるな多分。

Wikiなんで直してもらっていいんですけど(RSSをチェックしてるので変更があれば分かる)、 ふつうのWebサイトのようにも見える中途半端さがいかんですな。


2009-09-02

[Ruby/SDL] Ruby/SDLのMac用gemを作っておりますが

1.9でコンパイルが通らない。

具体的にはsmpeg/smpeg.hがないぞというエラーになる。1.9.1でも、1.9.2-preview1でも同じ。

どうもCPPFLAGSから-I /opt/local/include が抜けているようだ。mkmfが何か変わった?

ソースはここ


2009-09-03

[ruby][git] githubを10倍便利にするgithubコマンド

現在はgit-hub gemの方がおすすめです:Route 477 - github gemからgit-hub gemに乗り換えた (2011/1/13追記)

githubはよく使うけど、プロジェクト作るのにブラウザ開かないといけないのが 面倒だなーとか思っていませんか?githubコマンドをインストールすると、 ターミナルからgithubプロジェクトを新規作成できるようになります。

インストール

$ gem install defunkt-github -s http://gems.github.com

リポジトリの作成

新しく作る:

$ github create foobar
-> foobar/ 以下にgitリポジトリができ、githubにも登録される

既存のgitリポジトリから作る:

$ github create-from-local
-> ディレクトリ名がリポジトリ名になり、githubに登録される

ブラウザを開く

現在のリポジトリ:

$ github home

特定のリポジトリ:

$ github yhara biwascheme

その他

あとgithubの別のリポジトリからpullしたり、networkを表示したり、pull-request送ったりなどなど。

$ github -h

あとはWikiとかIssuesとか簡単に開けるといいなぁ。

[book] Scalaスケーラブルプログラミング

Scalaの本としては日本初?なのかな。

タイトルから応用編なのかと思ったが、立ち読みで確認したところ、入門書のようだった。 「これ一冊でScalaのことがだいたい分かる」みたいな感じ。

4844327453

原書はこちら。「Comprehensive」「Step-by-step」とか付いてるな。

0981531601

ということは、「スケーラブル」という単語を入れたのは日本の出版社の判断だと思うけど、 Scalaの利点ってスケーラビリティなんだっけ?

汎用言語はスケーラブルでなくてはならない。同じ概念で、小さいプログラムも大きなプログラムも記述できるべきである。

[Scala - Wikipediaより引用]

ああ、なんか、僕の思ってたスケーラブルと違う(笑)。

[ruby] 日本人のためのMarkdown/Textile入門

Markdown(wikipedia)及び Textile(wikipedia)は、 海外で(アメリカで、か?)人気のあるマークアップ言語です。 HTMLを簡単に書くためのやつね。 どちらもgithubとかRedMineで使われてたりして、避けがたくなりつつあるので、両者の特徴を簡単にまとめてみました。

文法

まずはそれぞれの文法を見てみましょう。 Textileは「HTMLの代替」を指向していて、実にいろいろな機能が用意されているのに対し、 Markdownは「自然な見た目」を指向しているようです。 両者は似ているように見えますが、Rubyist的に言うと「HamlとRDくらい違う」と言えるでしょう。

                   Textile                  Markdown
------------------------------------------------------------
見出し1          h1. Hello world      Hello world
                 ※空行が必要         ===========

見出し2          h2. About            About
                 ※空行が必要         -----

見出し3          h3. foo              ### foo
                 ※空行が必要         (あるいは ### foo ###)

リスト           * foo                * foo     ※+や-でもOK
                 ** bar                 * bar   

順序付きリスト   # step 1             1. foo    ※ネストは不可
                 ## step 1-a             bar    ※複数行書ける
                 ## step 1-b          2. baz   
                 # step 2                quux

pre              Sample code:         Sample code:
                 <pre>                    require 'hello'
                 require 'hello'          Hello.greet
                 Hello.greet             
                 </pre>                   ※空白は4つ

画像             !http://a.jpg!       ![Alt text](http://a.jpg)

表               |_.foo|_.bar|        (<table>タグを書く)
                 | o | x |
                 | x | o |

リンク           "Ruby":http://url    [Ruby](http://url)

強調             これは *テスト* だ   これは *テスト* だ
                    ※どちらも「*」の前後に空白が必要

文法の詳細については以下を参照してください。

実装

TexitileはPHP生まれ、MarkdownはPerl生まれですが、どちらもRuby実装が存在します。それも、複数の。 こういう時に便利なのがRuby Toolboxです。

これを見ると、TextileコンバータとしてはRedClothが、 MarkdownコンバータとしてはRDiscountが最も人気があることが 分かります。(が、githubにリポジトリがあるものが点が高くなる傾向があり、実際は BlueClothも使われているんじゃないでしょうか)

それぞれ、

 $ gem install RedCloth
 $ gem install rdiscount

でインストールできます。

まあ実際に自分で動かすよりは、githubなりRedMine経由でお世話になることがほとんどだとは思いますが。

まとめとしては、Textileは「高機能」、Markdownは「見た目重視」。これでどっちがどっちだか迷わないはずです。

[misc] 7月、8月のサブブログ

7月は1件しか書けず。8月は3件。

白MacBookの掃除
MacBookの掃除方法について書いた。
太陽と月は同じ天体ではない
常識(らしい)科学知識について書いた。
ロボリスとの再会
ロボリスという思い出のゲームと、googlabilityについて書いた。
脳が劣化した
記憶について書いた(もうちょっと気軽に更新しようかな、と思った結果がこれだよ)。
本日のツッコミ(全3件) [ツッコミを入れる]

ujihisa [Markdownのリストのところのネストは不可ってあるけど、ネスタできるよー。 * this * is *..]

ujihisa [s/ネスタ/ネスト/]

yhara [ども。直しました。]


2009-09-04

[ruby][git] githubコマンドでforkした

昨日紹介したgithubコマンドだけど、wikiやissuesをブラウザで開く機能が欲しかったので実装してみた。

ここに至るまでもgithubコマンド使いまくりで、

  1. github clone defunkt github-gem でリポジトリ複製
  2. 編集
  3. github fork でgithub上に俺用リポジトリができて、さらにoriginがそっちに書き換えられる
  4. git push origin master

という感じでした。


2009-09-07

[javascript] srcを指定したscriptタグの中身にコードを書くとどうなる?

<script src="foo.js">
print("bar");
</script>

などとした場合、foo.jsと、print("bar")のどちらが先に実行されるのでしょうか?

Firefox 3, Opera 10, Safari 4 ではfoo.jsの方が先でした。保証されている?

(追記:なんか変なことを言っている?そもそも実行されない?)


2009-09-08

[ruby][python] RubyとPythonのユーザ分布

2chからの引用のようですが…

ハイレベルPythonユーザーのアプリケーション製作能力は異常

が、その下の層が薄い印象

Rubyはハイレベルユーザーの数が多くない代わり、中級ユーザー層が厚い感じ

Python自体は凄いんだが、高次に使いこなすための敷居があまりに高すぎる

[ときどきの雑記帖 i戦士篇 2009年9月(上旬)より引用]

これが妥当な観測だとすれば、まつもとさんの「Rubyは普通の人のための言語」という主張に合致してて興味深いですね。

「高次に使いこなす」というのは関数型言語的なテクニックのことなのかなぁ。 PythonはLISP-1なのでRubyよりも関数型言語に近いはずだけど。

LISP-2(関数と変数の名前空間が分かれてる)な関数型言語ってあるんだっけ?Haskellは違うよな。あとはOCaml, Erlang, Scala, Clojureとかどうだっけ。Common LispはLISP-2だけど「関数型言語」として設計されたわけではない(もちろん関数的「にも」書けるけどね)。


2009-09-09

[scheme][english] R6RS仕様の英文をLisp的に読み解いてみる

例外のところを読んでいるのですが、複雑すぎて意味が分からない英文が。

Raises a non-continuable exception by invoking the current exception handler on obj. The handler is called with a continuation whose dynamic environment is that of the call to raise, except that the current exception handler is the one that was in place when the handler being called was installed.

[r6rs-libより引用]

Lisp的にインデントしてみると、一文目は

(Raises a non-continuable exception
  (by invoking the current exception handler on obj)).

こうですよね。問題は二文目。

(The handler is called with (a continuation
                              (whose dynamic environment
                                is
                                (that of (the call to raise)))),
  (except that
    (the current exception handler
      is
      (the one
        (that was in place
          (when (the handler being called) was installed)))))).

こう?

  • (((raiseの呼び出し)と同じ動的環境)を持つ継続)の元で、handlerを呼び出す
  • ただし、カレント例外ハンドラは((handlerがカレント例外ハンドラに設定された時点)のカレント例外ハンドラ)とする

木構造を書き下す手段としてS式はなかなか優れているな。括弧があるので、配置の自由度が高い。


2009-09-10

[biwascheme] ソースを分割した

最近、BiwaSchemeのソース(*.js)をYUI compressorで1ファイルに圧縮するようにしたので、ファイルを好きなだけ分割できるようになった。

ということで、長すぎたstackbase.jsを10分割(笑)しました。ほぼ1クラス1ファイルです。

あと、YUI compressorがコメントを削ってくれるので、ライブラリ関数の定義のところにコメントで関数の説明を書こうかなぁと思っていたり。いつやるか分かりませんが。

ドキュメント方面では、githubのwikiページで中間言語の仕様をまとめ始めています。 R6RSの例外処理を実装しようと思っていて、そろそろちゃんと動作を把握しないとなぁと(してなかったのか!)。

[biwascheme] 例外どうやって実装しよう

メモをwikiの方に上げましたが、R6RSの例外(raise, with-exception-handler)の実装を最近考えています。

  • JSの例外を流用したら簡単なんじゃね?
    • と一瞬思ったけど、スレッド跨げないから駄目だった。
  • 処理系レベルで実装
    • 中間言語に手を入れてどうのこうの
  • ライブラリレベルで実装
    • どうやって?

他の処理系を見るとSchemeレイヤでparameterizeとか使って実装してる。

まず、カレント例外ハンドラ(と、最低限、一個外側の例外ハンドラ)をどっかグローバルなところに置いておかないといけないのは確定。 2つだけ保持するか、リスト使って全部保持するかは処理系によって違うようだ。まあハンドラのスタックがあると考えればいいのかな?

んで値を設定する方は簡単で、問題は復元する方だよな。with-exception-handler(以下w/eh)が終わったらpopしなければならない。 …が、Schemeの場合call/ccで脱出されちゃう可能性があるんだよねぇ。

(w/eh h1
  ; 処理1
  )
(w/eh h2
  ; 処理2
  )

call/ccはgotoみたいなもんだから、処理2から処理1にジャンプする可能性がある。このときカレント例外ハンドラをh2からh1に切り替えなければならない。

もっと言うと、

(define (f) <処理f>)
(w/eh h1
  (lambda () (f)))
(w/eh h2
  (lambda () (f)))

となっていた場合、処理f時点でのカレント例外ハンドラは、fがh1の方から呼ばれたかh2の方から呼ばれたかによって動的に決まる。


2009-09-11

[event] RubyConfのproposalに落ちるなどした

RubyKaigiとほぼ同ネタで応募していました。

通ると今年秋はちょっと忙しすぎるなぁと思ってたのでほっとした。けど悔しい。

今回は家でゆっくりすることにします。

[opera] Opera 10 重くね?

大きなページをバックグラウンドで開くと、現在のページのスクロールとかも重くなる。

前からこうだっけ?9より、重くなる閾値がだいぶ下がってしまってる気がするんだが。

[ruby] Rackは仕様であり実装である

Perl は今どうなってるかというと(中略)仕様と実装は明確に分離している必要があるのです。分離してないと、実装のくだらねーdetailで揉める。だから、Spec は PSGI で、reference Impl は Plack と名付けられています。

[Rack は困っていない - TokuLog 改めB日記より引用]

この視点は面白い。

[prog] IEEE754を読む

浮動小数点の規格があることは知ってたけど、中身をみたことは無かったので。なんかNaNのビットパターンって一意じゃないらしいね。

http://en.wikipedia.org/wiki/IEEE_754-2008#External_links からドラフトのPDFが手に入る。

  • 1章:概要
  • 2章:参照文献
  • 3章:用語定義
  • 4章:略語定義(LSB, MSB, NaN, qNaN, sNaN)

ここから本体:

  • 5章:Formats
    • Level1 : 実数(-∞から+∞)。
    • Level2 : 不動小数点データ(-0, +0, NaNを含む)。要素どうしの演算がこの集合内に閉じている
    • Level3 : 不動小数点の「表現(representation)」。ふつうの数(=符号・指数部・基数部の組)、正負の無限大、qNaNおよびsNaN。
    • Level4 : 実際のビットパターン (0111000...)
  • 6章:Modes and rounding
    • 丸めモード?
  • 7章:演算
    • 演算は、「(仮想的に)無限精度で計算する」→「丸める」という動作になる
    • Homogeneous general-computational operations [引数と返り値が同じ型] [返り値がflonum、例外発生あり]
      • nextUp(x)とかminNum(x,y)とか
    • formatOf general-computational operations [引数と返り値が違う型] [〃]
      • *-addition(x,y)とか*-squareRoot(x)とか
    • Homogeneous quiet-compuutational operations [引数と返り値が同じ型][返り値がflonum、例外発生なし]
      • negate(x)とかabs(x)とか
    • Signaling-computational operations [返り値がflonum以外、例外発生あり]
      • compareEqual(x,y)とか
    • Non-computational operations [返り値がflonum以外、例外発生なし]
      • isFinite(x)とか
  • 8章:無限、NaN、符号ビット
  • 9章:デフォルトの例外的状況の処理
    • 不正な操作、0除算、オーバー/アンダーフロー、不正確

[biwascheme] トレーサを作ろう

BiwaSchemeにはtest/browser_test.htmlという、インタプリタの実行状態を全部記録して表示するデバッガもどきがあるんだけど、 これを動かすためにはconsole_test.jsファイルを編集して動かしたいスクリプトを書かないといけなかった。 よく考えたら、REPLみたいにフォームで入力させるようにしたらいいわけで。なんで思いつかなかったんだろう。とりあえずやってみよう。

まず、全部Schemeで書いたら楽なんじゃね?という発想。

<script type="text/javascript" src="../src/development_loader.js">
// for browsers   
var dumper = new BiwaScheme.Dumper();
var show_error = function(e){
  puts("Error: "+e.message);
};

(new BiwaScheme.Interpreter(show_error).evaluate(
  '(define (stop-trace) \
    (js-eval "BiwaScheme.Interpreter.dumper = null;") #t) \
   (define (start-trace) \
     (js-eval "BiwaScheme.Interpreter.dumper = dumper;")) \
   (define (with-trace thunk) \
     (start-trace) (thunk) (stop-trace)) \
   \
   (add-handler! ($ "eval_btn") "click" \
     (lambda (e) \
       (let1 source (get-content ($ "bs-input")) \
         (print source) \
         (display ";=> ") \
         (print (with-trace \
                  (lambda () (eval (read-from-string source)))))) \
       (js-eval "dumper.dump_move(1)")))'
));

</script>

楽は楽だった…んだけど、これだと「対象ブログラムを動かすときだけトレーサをONにする」ことがうまくできず、余計なものが 出力されてしまう。

悔しかったのでブログに貼ってみた。


結局JavaScriptで実装した。これで処理系のデバッグが楽になるな。

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

ujihisa [> <]


2009-09-14

[vim] VIM-LaTeXの自動折りたたみ機能をオフにする

VIM-LaTeXは、ファイル開いたときに自動でいろんなところをfoldしてくれる。が、別に要らんのでオフにした。

.vimrcに

 let g:Tex_AutoFolding = 0

でOK。

[linux] Thunderbirdのキーバインドをemacs風にする方法(2009秋)

UbuntuではThunderbird (2.0.0.23 2009/8/17)を使っているのだが、

  • Ctrl-nで新規ウィンドウ
  • Ctrl-pで印刷

という発狂しそうなキーバインドになっているため、変更した。

keyconfig

http://mozilla.dorando.at/ のkeyconfig.xpiをダウンロード→Thunderbirdでツール:アドオン→インストールする

URLは以下のページから見つけた。

functions_for_keyconfig

とりあえず使う分にはいらん、のかも。

https://addons.mozilla.org/ja/firefox/addon/1537 からxpiをダウンロード、以下同文。

ここと同じものかな。

設定

ツール:キーボードショートカットのカスタマイズ→Ctrl-N、Ctrl-Pなどを削除→念のためThunderbird再起動

Ctrl-Nの挙動を追加しなくても、gnome全体がemacsキーバインドになっていればこれでOKのはず

以上。

もっと簡単な方法があったら教えてください。


2009-09-16

[link] Tab Sweep

抽象度の高いレベルでやれるから、それでマクロがない言語では大規模開発は無理だと思っています。

[Sun Developer Newsより引用]

なんと。


UTF-8で「/」に相当するバイト列が複数あるため、気をつけないとチェック漏れするという話。


RubyシンタックスのPython、という感じの言語。サンプルコードが…w(変愚やってなかったら分からなかったかも) リリースノート


海外ではそこまでPerlの人気が高いわけではなく、Mixiやlivedoorなどに対応する英語の巨大サービスでも、日本ほどにはPerlをメインとする企業の利用例は多く無いようです。

[秋元@サイボウズラボ・プログラマー・ブログ : YAPC::Asia 2009に来ていますより引用]

この辺の事情はよく知らなかった。Rubyの場合「仕事でRails使ってる」という話は多分海外の方が多いんだよな。


2009-09-19

[javascript] Prototype.jsにisDateがないと思ったら

ややこしい事情があるみたい。


2009-09-20

[rubystation] 連休中にリリースしたいのだが

「gem installの出力をブラウザにリアルタイムに出力する」ってところで詰まっている。 といってもlong-pollがどうのこうのではない。出力されたものをブラウザに表示するとこまではできてる*1

問題は、

  • gemコマンドの出力がSTDOUT.putsを利用していて
  • STDOUT.flushしてないので
  • コマンドの実行が終了してからしか文字列が読み出せない

こと。

stderrも取りたいので、通信にはopen3を使っている。単純化するとこんな感じ。

require 'open3'

cmd = "ruby -e '5.times{|i| STDOUT.puts i; sleep 1}'"

Open3.popen3(cmd){|i,o,e| i.close; o.each{|l| puts l} }

実行すると5秒後に全部の文字列が表示される。これを1秒ごとに表示されるようにしたい。

しかしコマンドラインからgem install ... とした場合はちゃんとリアルタイムに表示されるわけで、どうなってんのかな。出力がターミナルだったらバッファリングしないとかかな。


そもそもリアルタイムに出力する必要があるのかというとそうでもないんだけどw。ペンディングにしてリリースを優先すべきか。


もう一つ、パイプ使うんじゃなくて、gemのinstall_command.rbをそのまま利用する手もある。Ruby 1.9.x必須にするんだから、それでもいいのかもなぁ。 正式なAPIではないのでバージョン間の非互換踏むのが怖いが。

*1 1秒間隔でポーリングする

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

morita [pty をつかうとよいです < 子プロセスの出力をとる http://www.ruby-lang.org/ja/ma..]

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


2009-09-22

[book][mac][ruby] RubyCocoa&MacRubyの本が出ます (抽選で5名にプレゼントあり)

高尾さん(会社の先輩です)の書いた、RubyCocoaとMacRubyの本が今週、発売になります。

それに伴って、無料プレゼント企画が開催中です。締め切りは今週金曜なので、応募はお早めに!

483993178X

監修はRubyCocoaメンテナの木村さんと、LimeChat作者のPsychsさん *1です。豪華ですね(笑)。

僕もレビュアーとして少しだけお手伝いしたので(本当に少しですけど…)、内容を少し紹介しておくと、

  • 第一部:RubyCocoaのインストールと、HelloWorldアプリの作成
  • 第二部:RubyCocoaを使った、実用的なアプリの作成例(インストールパッケージを作るところまで)
  • 第三部:MacRubyの紹介と、HotCocoaを使ったアプリの作成例

という感じになっています。MacRubyは、Mac OS XのObjective-C環境を直接触れる特殊なRuby処理系で、HotCocoaはその上で動く、 GUIアプリを簡単に記述するためのライブラリです。

RubyCocoaの本としては日本初*2、MacRubyの本としては世界初だと思います。RubyによるMacアプリ開発の現在および未来に興味のある方はぜひ。

*1 LimeChatのMac版はRubyCocoaで書かれている

*2 英書ではpragprogのがあるようです

[book][rails] Railsデプロイ

会社つながりでもう一冊。「Railsデプロイ」の監訳を、弊社の先輩方がされています。

4873114004

著者はClinton Begin、最近RWC のために来松された「」のBruce Tate、MerbコミッタでもあるEzra Zygmuntowicz(ezmobius)

Railsといえばアプリケーションを効率的に作れることが強調されますが、「作ったあと、どうすればいいのか?」に焦点を当てたのが本書です。 サーバの設定から、Capistranoを使ったデプロイ、アクセスが増えたときの負荷分散やパフォーマンスの改善、さらには Windows環境でのデプロイ(!)まで、これまであまり書籍で語られることのなかった領域についてページが割かれています。


2009-09-24

[ruby][book] 「のに子博士のブラボーRuby道」が凄かったw

本屋で中身を見てきたんですが、うーん…凄い本ですね(笑)。類書も思いつかないけど、しいて言えば256本?

4844327704

何がすごいって、まず主人公が主婦。誰得。その主婦、のに子さんが、パートを始める。場所は謎のロボット研究所。 ロボットといっても、見た目は学ランを着た男子中学生で(誰得)、まじめな優等生に作ったはずなのに、再起動したらなぜかツッパリキャラになってしまう。 そこで、Rubyを使って中学生型ロボに命令し、巨悪(?)と戦うのがのに子さんの仕事なのだ…!

何を言ってるかわからねーと思うが(僕も分からないが)、だいたい合ってる、と思う。

内容は、printメソッドから始まり、マンガや会話を挟みつつ、だんたんとRubyの高度な内容(といっても、クラスとかそういう)に踏み込んでいく感じ。技術とストーリーを混合した本はいろいろあるけど、配合比でいうと、 ひなた先生以上、 数学ガール未満くらい(わかる?)。読み物としても楽しく読めそう。 だけど、最後はProcオブジェクトもちょっと出てきていた。なかなかやるな。

おっと、Amazonの商品説明に著者の本名が書いてある。本当に主婦だったのか。ベテラン入門書作者じゃないですか…! そう思うと、この本はだいぶ思い切った転換だったのかも。次ものに子シリーズだと良いな(面白いから)。

目次は以下です。

[misc] 情報学科の人はサマーウォーズを見よう

OZっていう、セカンドライフの可愛い版みたいなもん(人間に似せなくていいじゃんっていうのは確かにそうだと思った)が出てくるんだけど、その画面がぐりぐり動いてて凄いので、エンジニアも未来に向けて頑張らないといけないなーと思ったってそれだけなんですけど。

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

Yugui [のに子さんは清水美樹さんだったんですか! 昔、UNIX Userに連載してたときはちょっとあんなテイストでしたけど、..]


2009-09-26

[vim][git] vimの終了ステータスが常に1になる問題

いつからか、vimの終了ステータスが常に1になる現象が起きていた。 「ていた」というのは、特に実害もないのでずっと放っていたからなんだが(^^;

しかし「」によると

  • 1行目に変更点のサマリ
  • 2行目は空行
  • 3行目以降はなぜその変更をしたかの解説

を書くのがgit的に正しいコミットログらしいので、重い腰を上げて原因を究明してみた。

まず.vimrcをリネーム。変化なし。.gvimrcも。おっと、.vimをリネームすると終了ステータス (echo $? で確認できる) が0に戻った。

次は.vim/*をリネームし (for a in * ; mv $a _$a)、一つずつ戻してステータスを確認する (vi foo ; echo $? ; ls)。どうも.vim/plugin/が悪いらしい。

ということでplugin/*をリネーム (for a in * ; mv $a ${a}_)。vcscvs.vimが犯人だった模様。

深追いするモチベーションが起こらないので単に削除して作業終了。

4798023809


2009-09-28

[ruby] Structを使って簡単にクラスを定義するtips

Structを使うと、いちいちattr_readerとか書かなくていいのが楽だし、オープンクラス使えばメソッド追加だってできる。

  Identifier = Struct.new(:tag, :attributes)

  class Identifier
    attr_accessor :text
 
    def initialize(t, a={})
      super(t, a)
    end
  end

…という話は知ってる人が多いと思うけど、同じことをこう書いてる例を見つけて驚いた。

  Identifier = Struct.new(:tag, :attributes) do
    attr_accessor :text
 
    def initialize(t, a={})
      super(t, a)
    end
  end

Struct.newがブロック取れるとか知らなかったぜ(1.8.6/1.8.7/1.9.1で確認) るりまにも書いてないな。

[ruby] begin-endを使って関数的な書き方をするtips

    def webrat_session
      @_webrat_session ||= begin
        session = Webrat.session_class.new
        session.adapter = Webrat.adapter_class.new(self) if session.respond_to?(:adapter=)
        session
      end
    end

beginなんだけどrescueしない。Schemeのbegin、CLのprognのような使い方。初めて見た気がするけど、関数的(<=>手続き的)な書き方ができていいかも。


2009-09-29

[arc] ゴルフ場のためのarc起動方法

未だにわからんものも結構あったりします。例えば Arc 。

[2009-09-29 - 兼雑記より引用]

というわけで。

1. mzscheme v372を入れる

http://download.plt-scheme.org/v372.html

372より新しいバージョンはset-car!, set-cdr!が無くなったのでイヤなんだそうです。

2. arc3.tarをダウンロード

http://arclanguage.com/install

3. as.scmを編集する

編集するのかよ!と言われそうですが、普通にarcを起動するとREPLに入ってしまうので編集するしかなさそうです。

といっても最後の (tl) の行を ; (tl) のようにコメントアウトするだけですが。

4. 起動する

例:

$ cd /some/where/arc
$ mzscheme -m -v -f as.scm -e '(aload "/some/where/hello.arc")'

hello.arc:

(pr "Hello, world!")

実行結果:

/Users/yhara/research/Arc/arc3 % mzscheme -m -v -f as.scm -e '(aload "../hello.arc")'
Hello, world!%

5. ゴルフ場に入るのを待つ

Arcという言語はかなりゴルフを意識して作られているので(嘘。よく使うものにかなり短い名前が割り当てられているので)、 少なくともSchemeよりは健闘するんじゃないでしょうか。

公式サイトは http://arclanguage.com/ ですが、大した情報がないので、リファレンスなどは http://arcfn.com/doc/ が参考になります。

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

youz [最新のMzSchemeで動くようになったVer3.1がフォーラムで公開されています。 http://arclangu..]

yhara [なんと。installが更新されてないので気づきませんでした。 今度試してみよう。(set-car!はどう処理したの..]