優先順位を上げないといけないのは、あとは何ですかねぇ。
ご飯が無かったので、味噌ラーメンに余ったカレーをかけてみた。
うーん、微妙だ。
うわー、やっちまった。期日を June -> July と間違えた orz
ところで、http://www.namikilab.tuat.ac.jp/~sasada/diary/vote.cgi 12号の人気投票をしています。
しまった。この日記は月が新しくなったときに自動的にページを作る機能を持っていない。
で、2005 年度分は予め作っておいたんだけど、2006 年度分が無い。どうしようかな。
Function | Module | Instructions Retired samples | Clockticks samples | Cycles per Retired Instruction - CPI |
rb_lastline_set | cygruby19.dll | 357 | 315 | 0.88 |
strftime | cygruby19.dll | 309 | 174 | 0.56 |
th_call0 | cygruby19.dll | 263 | 152 | 0.58 |
thread_dump_regs | cygruby19.dll | 206 | 127 | 0.62 |
th_eval | cygruby19.dll | 206 | 119 | 0.58 |
Init_yarvcore | cygruby19.dll | 175 | 108 | 0.62 |
debug_print_register | cygruby19.dll | 169 | 85 | 0.50 |
rb_check_type | cygruby19.dll | 121 | 105 | 0.87 |
native_thread_cleanup | cygruby19.dll | 80 | 39 | 0.49 |
rb_backref_set | cygruby19.dll | 71 | 48 | 0.68 |
rb_lastline_get | cygruby19.dll | 59 | 42 | 0.71 |
thread_eval | cygruby19.dll | 50 | 43 | 0.86 |
rb_svar | cygruby19.dll | 33 | 45 | 1.36 |
yarv_backtrace | cygruby19.dll | 24 | 68 | 2.83 |
yarv_caller | cygruby19.dll | 18 | 42 | 2.33 |
debug_print_pre | cygruby19.dll | 11 | 14 | 1.27 |
rb_backref_get | cygruby19.dll | 11 | 10 | 0.91 |
rb_obj_as_string | cygruby19.dll | 1 | 1 | 1.00 |
rb_hash_freeze | cygruby19.dll | 1 | 0.00 | |
Init_heap | cygruby19.dll | 1 | 0.00 | |
rb_parser_append_print | cygruby19.dll | 2 |
VTune にコマンドラインインターフェースがあるのを今初めて知った。というわけで、使ってみているんだけれど、とても難しい。
ちなみに、上記は fib(34) を動かしてみた結果。
$ vtl activity -c sampling -app "ruby","-I../yarv/lib ../yarv/benchmark/bmx_temp.rb" run $ vtl view -hf -mn cygruby19.dll -sum -sort -cd
こんな感じで出力。うーん、わからん。変な結果だなぁ。
色々試したが、DLL のものだと、うまく関数ポインタを得ることが出来ていないような気がする。
というわけで、VTune は miniruby 専用にしておく。
gcc -O0
th_eval | miniruby.exe | 3267 | 3060 | 0.94 |
th_set_env | miniruby.exe | 529 | 598 | 1.13 |
eval_method_search | miniruby.exe | 235 | 120 | 0.51 |
rb_class_of | miniruby.exe | 146 | 80 | 0.55 |
yarv_get_current_running_thread | miniruby.exe | 67 | 90 | 1.34 |
rb_check_type | miniruby.exe | 53 | 67 | 1.26 |
rb_type | miniruby.exe | 47 | 90 | 1.91 |
memcpy | miniruby.exe | 1 | 0.00 | |
rb_newobj | miniruby.exe | 1 | 0.00 | |
st_lookup | miniruby.exe | 1 | 2 | 2.00 |
strhash | miniruby.exe | 1 | 0.00 | |
rb_add_method | miniruby.exe | 1 |
gcc -O2
th_eval | miniruby.exe | 2659 | 1754 | 0.66 |
rb_check_type | miniruby.exe | 129 | 96 | 0.74 |
strhash | miniruby.exe | 1 | 1 | 1.00 |
rb_node_newnode | miniruby.exe | 1 | ||
rb_set_class_path | miniruby.exe | 1 | ||
set_syserr | miniruby.exe | 1 | ||
st_lookup | miniruby.exe | 1 |
hf オプションは hotspot functions で、ha オプションは hotspot address らしい。見たいのは address のような粒度の小さいものだが、しかし address を見ただけではソースコードのどのあたりかわからない。
アドレスからソースコードのファイル名と行番号を得るにはどうすればいいんだろうか。
GUI 版ではやってくれるんだけどなぁ。
どうにも思い浮かばないので(objdump -dl で出来るのかと思ったが、オフセットを得る方法がわからない)、ソースレベルの話は GUI 版を見ることにしよう。
100行くらいのマクロ関数の中でエラーがあると、マクロのどこにエラーがあったのかわからない(一行にまとめられてしまうため)。どうにも、こいつが都合が悪いため、なんとかしたいんだけど、いいアイデアがない。
いっそコピペ?
このでかい奴は自動生成するものなので、各ファイルに細切れに include させるのも手なんだが、呼び出すところで #include って書くのはかっこ悪い(呼び出し側は自動生成ではない)。
マクロの中で #include とはかけない(そりゃそうだ)とか、なんか色々方法を考えてみたんだけど、いい方法は思い浮かばない。うーん。
VTune は、色々調べたが諦め風味。
懸念だった cref について、やっとなんとかした。多分、これで Rubyがきちんと実現できた。
多分、これで大分よくなるだろう。あとはまともな Binding か...。
しかし、diff が1500行で、それに対するログが1行って、われながら...。
カレーライスを2杯食べて、仮眠したら気持ち悪い...。
懸念だった TOPLEVEL_BINDING にも対応。これで ERB はばっちり。
... 速度以外は。
require 'erb' 100000.times{|e| ERB.new('<% e %>').result(binding) } -- ruby 13.024 yarv 12.683
ううむ。
やっと GC などのバグの元を見つけた、ような気がする。
ここまで実装して、やっと cref / class の扱いがわかってきた。んで、やっとなんとか、実装方法がわかってきた。
んー、やっぱり cref はメソッド呼出しごとに切り替える他無いのか? んー。module_eval みたいなのさえなければ、こんな苦労しなくていいのに。
lfp と一緒に特別な何かとして格納してやれば、なんとかなるような気はするな。あー、やっぱりなんとかならなかった。
そして、ruby_class 相当も必要ってことだろうか。この辺は別に問題ないか。
うーん、フレームごとに cref を用意するべきだろうか。今 10 word でこれ以上増やしたくないんだよな。
フレームごと、じゃなくてメソッドフレームごとにしてみるのはどうだろうか。なんとなく、うまくいきそうな気がしないこともない。
Ruby Quiz.
Const = :top class C Const = :C end C.instance_eval %{ p Const } C.instance_eval{ p Const } C.module_eval %{ p Const } C.module_eval{ p Const } C.class_eval %{ p Const } C.class_eval{ p Const } eval %{ p Const } eval{ p Const }
If you can answer all outputs, You are a great Ruby Hacker.
頭の中がやっとまとまった。
これで行こう。これで問題ないはず。現在 $_, $~ のために lfp[-1] を用意(nil 初期化)しているが、ひとつ余計に nil 初期化したところで、速度的なオーバヘッドは皆無だろう。
よし、多分これで懸念は去った。
って、lfp[-1] をもっと有効活用すれば、コンパイラを一切いじらなくても対応できるな。RNode なので、nd_file をそれ用の領域にすれば問題無さそうだ。そうしてしまうかなぁ。しかし、ぎゅうぎゅうに詰めたものだ。
というとき、 Ruby または Rails の学習曲線的はどんなもんなんだろうか。
cvar は今、cref を見てるけど、ruby_class を見ないのはなぜだろう。
YARV がだんだんバグが少なくなっているのを見て、結構うれしい。それなりに動くようになっているような気がするので、試してもらえると助かります。signal 系と I/O 系がまだ手付かずだけど。
control frame stack は GC 領域にしたくなかったんだけど、しないとまずい、ということでするとにした。これを GC 対象にしたんだから、なんかもっと手が抜ける方法が思いつくかも。つかないかも...。
学校に来たので投票を更新。
ちょっとお正月風にしてみる。ちょっと早いけど。
バグ報告に対応するってのは、色々楽でいいですね。自分で開発してるより。
今、backtrace を C 関数の再帰で作ってるんだけれど、これがどうにもよろしくない。スタックオーバーフローを起こしたときに、大変なことに。
しかし、再帰を使わないとなると、面倒なんだよな。これ、ループで出来るんだろうか。
作ってから reverse すると...。うーん、どっちが速いんだろう。
ループしてリバースのほうが早かった。
backtrace 作るのが遅かったんだけれど、色々悩んでみたら、snprintf() してから rb_str_new2() で作るより、rb_sprintf() で文字列オブジェクトを作ったほうが速かったから、という結論になった。なんてこった。
こないだ Joel on Software で読んだ事例だよな、多分。
しかし、まだ遅いな。うーん。
根本的に、バックトレースとして出力するものがふえたからだと思う。バックトレース生成を遅延すれば、なんとかなりそう。
帰宅。未踏の下期キックオフだった。
キーボードが進んだ進んだ。
VMware のライセンス来た。紙(10ページくらい)を届けるのに、このでかい箱はなんなんだ...。
VOA を聞いていたら、とても聞きなれた単語が。
VOA News - Women's Hall of Fame Adds New Members, Including Hillary Clinton
Answer a question about open-source software …
なんで、全米女性保健ネットワークにオープンソースソフトウェアがくっついてるんだろう。
軽く読めるし聞けるので、VOA Special English はおすすめ。ただ、Podcasting が溜まりまくってる。
mF24 こんなサービスができたのねぇ。だらだらと jazz を聞きたいんだが、一々ダウンロードするのが面倒だな。
VMware Player ではフォルダの共有、という機能は使えないらしい orz
さて、どうしたもんかね。
configure: error: cannot find sources () in ../yarv or ..
って、なんだ。
test -r で失敗してるらしい。
原因はわかった気がする。
Merry Xmas.
なんとなく、動いたような気がする。次は命令融合とかの対処かな...。
関係ないけど、かなりダメな間違いを見つけてしまった orz
どうしよう。
上記は直した。
make ext で死ぬというバグをこちらでは cygwin 上で見つけてしまった orz
なんでー。mswin32 と、linux では再現しない。どうしたもんかな。
あれ、build ディレクトリを空にしてやりなおしたら動く...。ナンデー。
うーん、GC なんだろうか。
で、もう一度、と思ってやってみたら同じエラー。なんか、rm -rf ext しようとすると、ext/socket が busy とか出るんだが、なんでだ。何が悪い。
と、思ったら linux でも出るな。なんか、最適化オプションによって出たり出なかったり...。
gdb 上だと動くー。なんでー。
色々試すといろんなところで落ちるので、やっぱり GC かな。
もうちょっと簡単に再現するものが欲しい。
るびまのプレゼント、できれば本がなかなか買えない学生さんにお渡ししたいなぁ、などと思うが学生からの応募は(多分)一切無い。広報が足りないのかなあ。
あと、なんとなく不公平かな、って思って編集者は応募禁止にしてるんだが、さてこれは逆に編集者に不公平か。俺以外、ってことにして、俺(が作ったスクリプト)が選ぶ、ってことにすれば大丈夫なんだろうか。なんかこういうのに関する法律もあったような気がするんだが、調べられない。懸賞の額とかは出て来るんだけどな。
うぅ、やっぱり 2GB じゃ足りなくなってしまった。ちょっと音楽を追加しよう、とか思ってしまったばっかりに。割り切れてないなあ。
kahua seminar 2 でもらったオライリーのボールペン、書きづらい...。
ruby (syntax) quiz.
class C def m p "C#m" end end class D < C alias foo m end class C def m p "re-defined C#m" end end D.new.foo # what should be printed?
なんというか、やっと visibility をそれっぽくサポートした。遅すぎ。これ、実は去年の仕事だよな(まだ、scope 中の visibility は対応していない。つまり、引数無しの private とか)。
で、なんで一月もかかっていたかというと、現状のクラスのメソッドテーブルの持ち方ではどーもうまくいかなかったんですよね(RClass#m_tbl)。というわけで、その辺のデザインを全部とっかえて、ということを影響範囲を小さく保ちながらやる、ということができずうまいことできなくて困っていた。
うー、寝すぎ。
コンパイル時に各命令におけるスタックの深さを正確に計算する方法がうまく出来ない。融合操作を考えなければ出来そうなんだけれど。うーむ。いっそ禁止してしまうかなぁ。
なんとなく出来たかな、と思ったけど、まだまだだった。
世の中には本がなかなか買えない社会人だっていると思いますよ。(しないと思うけど)抽選時に職業差別するなら募集要項に書いてね。
Rubyist Magazine 0012 をリリースしました。
お楽しみください。
しかし今回はなんかなかなか出なかった。
リリースの日付をみてもらえるとわかると思うんですけど(Rubyist Magazine - るびま)、20 日を過ぎたのは今回が初めてなんです。逆に言うと、11 回は(11 回も!)凄く順調だった、といえるんだろうか(いや、中では毎回、色々大変なんですが)。
もしかしたら、そろそろ潮時なのかもな、などと考える年の瀬。
しかし、連休の初日にリリース、というのはアクセス数的にはどんなもんなのかな。
ガクガクブルブル orz
そういえば、るびま、プレゼントの締め切りは今年中なので、ご応募はお早めに。
お疲れ様です。
オブジェクト倶楽部がアウェイ、というか、ただ単に私が初対面の人と話ができないだけと言うか。対人スキルが根本的に無いので、そこが問題なのよね。
なんか、今回はるびまなかなかリリースできんなあ。
こっそりと YARV 0.3.3 リリース。
えー...。いまさらなものをちょっと(じゃないけど)やってみたんだけれど、まさかループものだったとは...。
しかし、よく出来てるな。すごい。
ひぐらし?
SMB over ssh での portforwarding が出来なくなった.なんでか理由が全然わからない.なーんーでー.
なんかわからんけど設定を弄ったり戻したりputtyのバージョンをあげたりしたらつながった.なーんーでー.
さて,なんで久々に SMB でつなげようとしていたかというと,おうちのファイルをとってきたかったからなんだが,今の数時間を考えると帰ったほうが早かった orz
さくさくとバグを退治.多重代入の仕様,ほんとさっさと決まらないかなあ.
さぼってた ruby-eng 投げたっと。あとはるびまの編集か...。
るびまのインタビューの録音したファイルに、13 という数字をつけて、くだらない感傷なのかもしれないけど、あぁ、13回目なのだなぁ、などと一人感動していた。
というわけで、「査読2.0」ということで決定しました。
何がだ...。
1.times{ defined?(break :foo) :bar }
さて,このプログラムはどんな挙動を示すか.
Ruby プログラムを書くために私がエディタに求める機能は,今のところ (1) オートインデント(改行時に適切なインデントをしてくれる機能)(2) 適切な色付け(文法エラーとかを知るために必要) (3) 編集中のファイルを即座に実行する仕組みだけなので,xyzzy で困っていないんだけど,実はもっと便利な機能を見過ごしてるだけだったりする?
(1) (2) は ruby-mode がやってくれて,(3) は簡単に作れるから問題ない.
irb は (3) をもっと簡単に実現するものだけれど,3行以上のプログラムを試そうと思うと現実的じゃない(少なくとも私には).そして,試したいプログラムは大抵 3行以上ある.
(3) を実現するスクリプトを tips/拡張子に応じて何かする に貼ったら,なんか拡張されてた.
最近(といっても数ヶ月前)xyzzy 用にこんなコードを書いた.
(global-set-key '(#\C-c #\C-r) #'(lambda () (interactive) (let* ((file "~/src/rb/t.rb")) (if (or (and (get-file-buffer file) (set-buffer (get-file-buffer file))) (find-file file)) ;; insert (progn (goto-char 0) (insert "\n\n__END__\n") (goto-char 0)) ))))
~/src/rb/t.rb というファイルに,私はなんでも放り込むんだけど,好きなタイミングですぐに新しい実験コードを書くために,そのファイルを開いて,ファイルの先頭に __END__ を挿入するというだけのスクリプト.
私の用途にはとても便利.
頭が悪いので,C-x C- ... のような,難しいことを覚えられないので,C-2 でとりあえずなんかしてくれるのが欲しいのだけれど,emacs だと C-[数字] ってキーバインド作れないのよね.
なんか,溜まってた話を消化...,出来てないなあ.
gccの話を聞いた.2000円分の何かを吸収できただろうか.
12/13 賞味期限のもやしにチャレンジ.
GCC は cvs から subversion に移ったとのこと.機械的なリポジトリの移行は殆ど問題なかったとのこと.subversion が選ばれたのは better cvs として,唯一の解だったとのこと.
GCC も移ったんだしさー,という論法は,どうなんだろうね.
30人上限,ということでもっと沢山人が居るのかと思ったら,15人弱だったようで.皆さん顔見知りばかりみたいで,アレだった.なかなか,あのコミュニティも.オブジェクト倶楽部とは真逆な感じで,居づらい.一人アウェイ.
しかし,なんで GCC の(日本ではとても貴重だと思うんだが)話に,こんだけしか聞きに来ないのかな.凄い,意外.
珍しくメモを取ったので面倒なんで載せておく。あんまり信用しないように。
... と思ったけど、あんまりにもひどい内容なので、さらすのはよしておこう。
一人称シューティングゲーム」ある種の(というかこのテ)の語は、誰にもネタがわからないまま素訳(の時の直訳)が残ってしまったまま出版されたりしてそれが定着しちゃうことが。hack(6) の注が「地下迷宮爆破ゲーム」となってた例があります(この場合さらに空目に基づく誤訳になってますが)
(global-set-key [?\C-2] 'set-mark-command)
とか .emacs に書いてあるけどな....
KEY is a key sequence; noninteractively, it is a string or vector of characters or event types, and non-ASCII characters with codes above 127 (such as ISO Latin-1) can be included if you use a vector.
ってやつ。多分、info にもっとちゃんとした説明があります。X 上でないと駄目なのが不満っていう話だとどうにもなりませんけど。
Xだとできるのかー.
起きたら16時だった。
昨日は、まず kahua セミナー2へ行く。
2年ぶりくらいにkahuaを起動。まだ自分の文章があってびっくりした。使う人に簡単に管理させるための何かが必要ですね。アーキテクチャの基本は全然変わってなくて、容易に理解できた(思い出せた)。が、セミナーの説明で理解させることができたかどうかはちょっとわからなかった。
emacs から kahua-shell につなぐために ssh を要求するのはちょっと嫌だな。
kahua-admin から connect するのと、kahua-shell でつなぐのでは評価する環境が違うらしく、ちょっと戸惑った。
で、懇親会。久井さんのやつを色々教えてもらったり。
(define alias define)
は、Gauche special だ、とかなんとか。
その足で、Rails勉強会の懇親会に行った。Kahua セミナー懇親会で聞く話と全然違ったり、オブジェクト倶楽部のイベントでは顔を知らない人ばかりで何も出来なかったが、こっちでは(私は彼らの顔を知らないんだけど)彼らは私のことを、るびまの人だ、とかYARVの人、などで知っておられたようで、いろいろ話がしやすかったりして、こちらも楽しかった。
どちらかというと、本当に相反する集まりだったように思う。そういう点で、Rails は新鮮で楽しかった。
まつもとさんレベルだと、発表中にマシントラブルなどがあってもそれをネタにして会場を沸かせたり、資料が無くても十分しゃべれるんだけれど、たとえば私がそれをやったらとにかく顰蹙を買うだけ。とくに、学会発表なんかだと最悪。
なので、
をします。というか、常識だと思ってるんだけど、なかなかそうではないらしく。発表者の人、気をつけましょうね。
一度、会場で事前テストしたら写らないことがわかったので、急遽運営側のマシンをお借りして無事終了、ということがあったな。それがはじめてのシンポジウム (SACSIS) だったわけだけど。
さて、まだ「査読」の話をするわけですが。
やはり、「原稿を読んで文章の質を高めるためによくすること」を「査読」という人は多いようです。Rails 勉強会でも、セッションのひとつにその意味で「査読会」ということをしていたそうです。
そうなると、この言葉が流行りだした元が気になるわけです(もちろん、日本語としての言葉の意味も気になるわけですが)。
誰かが流行らせた様な気もするんだけれど、誰か、ってのも気になりますねえ。その「誰か」はどうして査読という言葉を使ったかというのも気になる。
(間違いだとかどうのとか、そういうの関係なく、気になるって話です)
とかそんな話を柳田さんにしたら、「敷居が高い」という言葉について教えてくれました。
「敷居が高い」というのは
http://dictionary.goo.ne.jp/search.php?MT=%C9%DF%B5%EF&kind=jn&mode=0&base=1&row=0
――が高・い 不義理・不面目なことなどがあって、その人の家に行きにくい。
ということで、たとえば「Ruby を使うのは敷居が高い」という使い方は「辞書に書いてあるとおり」解釈すると、誤用ということらしい。
全然知りませんでした。
メソッド名などの補完について。
Ruby のシンボルは、標準で存在するものすべてを網羅しても数千くらいだろうから、全部候補にしてしまうとどうなんだろう。混乱するだけかな。3文字くらい入力すれば、だいたい決まるような気がするんだけど。
さくっと試せないのが基礎力のないところ。
まだ引っ張るか、と思うと同時に、笹田さんのそういうところが好きだな。(引っ張るというか、また目にしたってことだとは書いてあるけど)。 確かに誤用(この場合は誤用というほど逆向きになるのでも明後日の方向に行くのでもなく、対象範囲の厳密性が薄れただけという点でちょっと微妙な気がするけど)の発生と定着の過程ってのは興味深いね。
こんにちは。補完はだいたいわかった(てる)のですが、候補をどう集めてくるのか良くわかってません。rubyのシンボルてどうやってとるんですか?xyzzyで静的な補完をしたいだけならetc/Rubyを適当にいじってEsc Tab (服部さんのruby-modeの場合)だと思います。徐々に候補を狭めてくのは割と怪しいのしかないのですが…
Symbol.all_symbols
"review" を日本語で表現しようとして、「検閲じゃないし再検査じゃないし復習じゃないし回顧じゃないし批評だとしっくりこないし…よし(意味はよく考えてないけど)この『査読』で行こう!」ってなもんじゃないすかね。
なかださん、ありがとうございます。遊んでみます。
all_symbols だと,Symbol の種類が特定できないから,もうちょっと工夫があるといい気がしますが....
Ruby関係忘年会。終電まで久々に飲んだ。楽しかったです。
「さ」は、携帯から私が書くときの名前です(めんどーなので)。
たしかに、批評は違うかな、という気はします。
「査読」の意味を調べてみますと、
http://dictionary.goo.ne.jp/search.php?MT=%BA%BA%C6%C9&kind=&kwassist=0&mode=0&jn.x=34&jn.y=8
水準に達しているかどうかを審査するために読むこと。
とあります。これもそうだと思うのですが、私は、「査読」という行為は「○と×」を示すために読むことだと思っています(いや、△でもなんでもいいんですが、目的が「審査」である)。「審査」するプロセスの中で「こうしたほうがいいんじゃない」という「副次的」なものがあってもいいと思いますが、第一目的が「審査」することではないかと思います。
「文章の質を高めるために読んでもらってダメだしする」ことの目的は「審査」じゃなくて、「よくする」ことだと思うので、こういう文脈(「この文章をよくするためにだれだれに査読してもらいました」、など)での「査読」という言葉には違和感を感じます。
るびまでは、記事について、「アドバイザー」をお願いしたり、「レビューア」をお願いしたりしています。ただし、お願いすることは「記事をよくするためのアドバイス」であり、「査読」ではないと思っています。
記事が水準ではない、たとえば「るびまには載せられない」「次回に持ち越したほうがいいんじゃないか(今回載せるにはちょっと文章が練れてないかな)」などの判断をすることは「査読」だと思っています。まぁ、似たようなプロセスではあるんですが。
で、問題は「review」の意味に「査読」というのが入ってるんですね(peer review)。英語で「論文の査読者」のことを reviewer といいます(多分)。じゃぁ、よくいう「レビュー」を日本語にどうするか、というと、今は案がなかったりするので「レビュー」でいいんじゃない、などと思ってます。
まぁ、言葉というのは生き物だ、という言い方もありますし、「役不足」とか「すべからく」とか、ふつーの活字の原稿でも(いわゆる)間違った意味(それぞれ、「役者不足」、「すべて」)で使われたりしているので、「査読」という言葉は今はそう使うんだよ、と言われると反論する術はありません。
というか、日本語に不自由な私がこんなことを言っても説得力が無いなあ。
とまぁ、「査読」という単語の意味という、取るに足らないネタを私は書いてますが、この本自体の翻訳はほぼ完璧なんではないかと思います(今のところ)。とても読みやすい。話も面白い。仕様書の話は身につまされるというか。仕様書なんて書いたことねー(似非プログラマ)。
(訳注にあった、「一人称シューティングゲーム」という言葉はどうなんだろう、とちょっと思った。でも、これは翻訳じゃないし。いや、ぐぐってみると結構ひっかかるな。直訳すると First Person Shooterで、それでもいいのか。一人称視点、と思っていたのだけれど。女の子が「僕」とかいうのは、もちろん関係ないんだろうなぁ)
文字コードについての議論も面白かった。
そして、これはちょっとリークですが、るびま読者用にプレゼントを2冊くらいご用意いただけるようです。太っ腹!>オーム社
うぅ、久々に酒を多めに飲んで頭が痛い...。サワーなどを4杯ほどなんだけど。
プログラムマネージャというのは大変切望されてると思うんだけど、さてどうやって見つけてくるのかね。しかし、「コーダをPMの下に置かない」という話は直感的じゃない(ように私には感じられて)面白い。
火曜日のゴルフってどういう意味なんだろう。偉い人は火曜日にゴルフをするもんなんだろうか。
P81 の訳注の「コラムニスト」って誰を示してるんだろう。ピギー嬢? しかし、こんな仕様書読みたいんだか読みたくないんだか(同ページの注2 に笑った。活字だってところが。やりすぎると読みづらそうだが)。
はらはらドキドキな仕様書ってどうだろう。最後まで読まないと犯人がわからない(よまねーって)。
今日は下北沢経由で行くのがいいか。帰りは初台まで歩いてみよう。
なんとか起きれた。
オブジェクト倶楽部のイベントに行ってきた。色々興味深かったが、全体にやっぱりアウェイだなぁ。社交性がないので宴会でも何も出来ず。
ついでに(ついでかよ)咳さんのインタビューをさせていただきました。突然のお願いに快くご協力いただきました咳さん、須藤さん、角谷さんに深く御礼いたします。
るびまIRCの人たちもね。
ちょっと「生き物」のところは異議がある。古い言葉が誤用から転移した例と比較するのはおかしいし、「今はそう使う」って最初にreviewの翻訳を「査読」に当てた状況を知って(一次資料に当たった上で)決め付けてますか?(っていうか僕も知らないけど)もし明治より前にある言葉なら、当然、論文の査読の意味での査読は語源じゃないし、そうでなければレビューの訳語なんですよ。
「古い言葉からの誤用」の例は不適切だったかもしれません。そもそも「査読という言葉の意味に文章をよくすることを目的とする行為(つまり、review の意味をすべて汲み取った話)意味はない」という前提で書いた文章なので、その前提が崩れればまったくもって事実誤認な話だと思います。ただ、今のところその前提を崩すものを見つけていない(根拠は上記辞書へのリンクだけですが)ので、そのように書いています。もし間違っていたらごめんなさい。
「査読」という言葉は「review」という言葉の一部の意味を示していてすべてではないと思っています。なので、そもそも「文章をよくするために読む行為」である「review」を「査読」と訳すのも変だなあ、などと思ってます。変だなぁ、であって「間違いである」という証拠が示せないのが駄目な感じですが。
L'eclatに書いたけど、笹田さんの主張が正しいようだ、という結論に僕の中ではなりました。不当な言いがかりをつけたみたいでごめんなさい。で、後だしじゃんけんをすると、一応技術的な内容チェックだったんだよ。ただし、ほとんど技術的に黒白がつくような内容が無いから結果的には文章をこなれさせるだけのものになったけど。
いや、こちらこそ変に拘ってしまってすみません。なぜか私は「査読」という言葉に異様にこだわってるんですよねぇ。ちなみに、「査読という言葉はreviewの訳語を作るために作った」という話はどこから来てるんでしょうか。国語に詳しい人に意見を聞いてみたいところ。
ああ、頭からreviewの訳語と決め付けてるのは僕の思い込みで、翻訳語特有の匂いがするといういい加減な理由です。ただし、あれだけ用例があり実際に利用されている言葉で大辞林に出ていないというのは「用語」以外には考えられないし、論文と査読という組み合わせは輸入だと(これも)想像しているからです(近代科学の成り立ちから言って輸入で間違いないとは思う)。
なるほど、説得力がありますね。
P.81の訳注1って場所が間違ってる。*1)と同じくデイブ・バリーのことですね。http://www.ne.jp/asahi/macrosoft/main/DaveBarry.html とか。
なるほどー。
(話の流れを読まずに) 文字コードの議論ってどんなことを話したんですか?
献本あっても編集者は応募できないじゃないか!(私の立場で「献」本って書いていいのかしら?)
こんな話>http://www.joelonsoftware.com/articles/Unicode.html
どもですー。忘年会行きたかったあ(仕事が落ち着いてればね)
あ、文字コードの話は忘年会じゃなくて本のほうです。
いやー、やっとグインサーガ、追いついた。104巻、読了。10年かかったのか。なんつうか、ナゲェ。
Joel on Software の書籍版を、るびまやっていたから、ということで頂いてしまった。はじめてるびま編集していて何かもらったりしたような気がする。12/20 発売だそうです。
内容はこれから読みます。
今日のまつもとさんを囲む宴会、実は、18人で予約を取っていたんだけど、結局参加は12人、ということになって、電話越しの店員に嫌な声を出されてしまった。
ということで、飛び入りは可能、なのか?
うぅ、「Joel ...」で「査読」という言葉を「レビュー」という意味で使っているなぁ。
なんでそうなんだろう。語感がそれっぽいからだろうか。意味違うってば。
イントロダクションまで読んだ。
人間のチームをマネジメントしていると、C++のテンプレートさえまったく簡単なものに見えるようになる。
笑った。
さて,御茶ノ水に行こう.
人があんまりこない
幹事ご苦労様です。今頃は盛り上がってるんでしょうか?
なるほど。>査読 != レビュー。
つい、送ってしまったけど、もちろん全く間違ってるよ。レビューの日本語訳としての査読と、論文の審査の意味の査読をごっちゃにしてるでしょ。
大体予定どおりに終わり
このREVIEWの日本語訳は批評
等ではないでしょうか
一連の書き込みから想定すると批評じゃなくて査読。というか査する対象領域が違うんだよね。と書けば良かったのか最初から。
と書いたそばから別の見解を持った。僕にとって「批評」の対象領域は文芸が第1に来るからすごく「さ」さん00:18:37には違和感がある。それと同じことでしょうね、きっと。「誰でも自分の分野の意味でその言葉を受け取る」ってやつ。
いやー・・・。 やっとバグを見つけた。疲れた orz
一週間これに費やしたのか?
原因はメモリを破壊。
NODE *node; hoge *foo = (hoge*)node; ... foo->bar = ...;
とやっていたのが敗因。無理やり突っ込んでるのが駄目駄目なんだけれど、さてどうしたもんかねぇ。この領域(foo)をもっとまともに管理できればいいんだけど。
うう。また optparse.rb が動かない orz
えーと,今日どこまで何をやればいいんだっけ....
今の Delegator はブロックを渡してくれないらしい.まずそう.
寝坊した orz
セキュリティのチュートリアル、大変楽しかった。
というか、大山さんの仮想化技術の話が(セキュリティ関係ないし)。高木先生のわかりやすい話も面白かったけど。
セキュリティ技術について聞きに来た人たちが、大山さんの説明を聞いてぽかーんとしていたのが面白かった。
そしてうささんを囲む会。RUBY CAFE で Ruby Hack が出来なかった orz。料理は普通においしかったけど、あの量で share は取りづらかったね。
なんというか、品川駅近辺の物価は3倍くらい違ったような気がする。
履歴書を TeX で作るためにちょっと調べたら,ちゃんと写真つきのものが作れた.よかった.
弊社製品のムービー再生にxvid.orgのムービー展開ライブラリを使用していた件について。
おお,と思ったんだけど.
それよりも,もう既に無かったことになってる P/ECE 用 GCC のソースを公開して欲しいぞ.知りたいのは GCC というよりはリンカだけど.リンカはオリジナルんなんだっけ?
P/ECE,もうさっぱり使ってないな.いい機械なんだけどな.
なんか物欲がうずきっぱなし.
DiMAGE X1 が欲しい.512MB くらいの SD カード買うかな.安いし.
http://www.pc-success.co.jp/frame.php?n=/pc/navi.html&h=/header/pc_hdr.html&m=/shop.php?sg_cd=7818
今は19インチモニタが3万なのか・・・.安い.
あと,複合機が欲しい.
えー,ruby-list にはまつもとさんを囲む忘年会の告知をしましたが,明日はなかむら(う)さんを囲む(というか,俺一人なので囲めない)忘年会っぽいことを品川でします.多分.興味のある方はメールしてください.
RUBY CAFE で Ruby Hack というのを狙ってるんだろうけど,どうだろう.
明日は日本ソフトウェア科学会 チュートリアル 「安全な情報基盤の実現に向けて」.
svn のポリシの書き方にはまった.
リポジトリ hoge のアクセス制限は,
[/hoge]
じゃなくて
[hoge:/]
というセクションではじめる.
RHG 読書会でした.
よくわかる人が居ないとつらい話だったか.
構造体メンバの「順番を入れ替える」とエラーが出たり出なかったり orz もう,さっぱり原因がわからん.
有楽町へ行ってきた.
ylug のMLに登録しようとしたんだけど,出来なかった(atdot.net のメールが弾かれた).しょぼん.
なんというか,3日も家に帰っていないと,それはそれで悲しいわけで.そして帰ろうと思ったら雪.
なんとかやーまにを書き上げたつもりになってるが,どうにもクオリティが低すぎる件について.
俺は命令の解説書なんて書くつもりはなかったんだがなぁ.簡単だから,そっちに流れてしまった.次はなんか他の面白いことを書いてみたいぞ.うーん,なんかリクエスト無いですかねえ.
今日は RHG 読書会で、コンパイラの話を読みます。
読書会忘年会になりそうですので、暇な人はぜひ。
どうしても segv が取れない。原因は多分 Proc オブジェクトの生成なんだが。今日は諦めるか・・・。悔しい。
(z)super の実引数、仮引数の扱いを多分完璧にできたと思う。気になっていたのでうれしい。
いつまでたってもやーまにが書けないのでまた凄い難易度を下げた orz
また他のエラーを見つけてしまった orz
これはかなり嫌なエラーだなぁ・・・。
バグ取れなかった&帰れなかった orz
就職のお誘いを受ける.Access さん.仕事大変そうだけど給料はよさそう.Dr でも普通に取ってくれるらしい.凄い人気企業なのかと思ったら,仕事が大変という印象からか,そう高倍率でも無いらしい.
広告:ささだは就職活動中です.
なかださんの出した例は解析できないだろうか.
recv.method(a, &begin foo(*ary, &raise) rescue nil end)
手でコンパイルしてみる.
getlocal recv getlocal a LABEL: putself getlocal ary putself send :recv, 0 send :foo, 1 (splat, procarg) RESCUE_CONT: send :method, 1 (procarg) rescue_clause: putnil end
となって,十分解析できるような気がする.
というわけで,未踏下期の意見交換会に行ってきた.
色々話す.世の中は狭いなぁと思ったり広いなぁと思ったり.
というわけで、プラネタリウムを作った。実に2時間。結構大変だった。
でも、見れた。感動。
いい買い物をした。
書籍のほうを見てみる。「大人の科学」と書いてあるのに子供向けな内容ばかりなのはなんでだろう。
gc にもバージョン番号があったのか,と誤読.
考えてみると,zsuper は要らないことに気づく.ステ.
なんとなく気になっていた root_iseq というものが要らない(別名のものがあればよい)ことに気づき,ステ.捨てたら大分気が楽になった.
ちょっと必要があって研究業績をまとめてみた(../tmp/g.pdf).
共著は多いが,自分はあまりやっていないことに気づく. うーむ.
さて,るびまの記事は業績に入るんでしょうか.関西勉強会でしゃべったりするのは入るんでしょうか.
懐中時計はあるので,さぁ時計男だ! と思ってもバイク通学だし.
ところで,やっとこさバイクの免許更新してきた.ほぼ何事も無く,すんなり.
一点.免許配布時,行ってみたらもう配布済みだったらしく,待てど暮らせど配られない.なんか呼びかけられて,もう配り終わったよ,と言われて直接渡される.顔写真でわかったらしい.講習が終わった後すぐに行ったんだけどなあ.
オブジェクト倶楽部のクリスマスイベント,学生無料だわーい,と思っていたら,懇親会は有料だった.しょぼーん.
さて,こちらの懇親会には行ったことがないんだけど,どうしよう.なんか登録がめんどいのが障壁に.
やばいなー.やーまに書く余裕が無い.主に心に.
yard というデバッガを教えてもらう。なんで有名じゃないんだろう。
BlackDogというものを知る。USBパワーで動作するLinuxマシンらしい。すげぇほしいかも。
やる気がなくなったんで(いつもだな...)、vncserver をいじってみる。inetd で起動するようにしたら、そもそも DISPLAY が何かわからんし。.vnc/xstartup も起動してくれないし(inetd のユーザは自分にしている)。.vnc/xstartup は vncserver が動かしてる気がしなくも無いが...。ということは、Xvnc じゃなくて vncserver を起動するようにすればいいのかなぁ。でも、inetd に bind してほしいのだから、なんか違うような気はする。
XDM なんか通さない(ローカルのVMwareにつなぎに行くので認証なんか要らん)ので -query オプションをつけないんだけど、だからなんかまずいのかなぁ。
手動で kde を立ち上げたらなんか動いた。
で、VNC をフルスクリーンモードにしたら、元に戻れないという驚愕の事実。がーん
Xvnc を殺して解決(?)。
うーむ、-query がない例が見つからない。
なんで shell script を inetd から立ち上げようとすると失敗するんだろう。
また next でエラーか....
でかいプレゼン買ってきた.
あとがきまで読んだ(あとがきだけ読んだ).こういうデザインなのねー.
アスペクト指向入門買ってきた.
ついでに,大人の科学 vol.9 買ってしまった.
shell のリダイレクトで,
の違いを知る.>&- とかも知る.何に使うか知らんが.
入門UNIXシェルプログラミングを読んでるんだな.shell 難しい.Ruby よりよっぽど難しいぜ.
1.times{ while true class C begin break ensure break end end end }
こんなのはなにが返るべきなんかねぇ(実は自明)。
p(while true class C begin break :foo ensure break :bar end end end)
こんなのはどうですかね。ちなみに YARV ではエラーになってしまった。
原因はわかった。根本的に YARV ではこれ対応してないわ。どうしよ。
break があると stack を撒き戻すんだけれど、この例では撒き戻してはいけない。
で、撒き戻しを抑止する方法なんだが、コンパイル中に適切にその命令でのスタックの深さを測らないといけない。さて、これは可能か。いや、可能なんだけど、自動生成系と絡めたとき、可変長(命令オペランドで指定される数)、スタックを pop するような命令だと、きちんとできるようにするためには工夫が必要。しかもオペランド融合、命令融合したときにはもう目が当てられないわけです。さぁどうしてくれる(知るかよ)。
あぁ,一ついいアイデア,というか抜け穴を考えた.実行時に戻すスタックポインタを計算すればいいんだ.
何を当たり前のこと言ってるんだこの野郎,と思われるかもしれないけれど,一応,もうちょっと考えている.この問題は,SP を 0 じゃなく,もうちょっと進んだ状態にする,という話.
recv.method(a, begin raise rescue 1 end) #=> このとき,スタックはこんな感じになる recv, a # recv.method(a までやった recv, a, self # recv.method(begin; raise までやった recv, a, 1 # ) までやった #=> 今の YARV だとこうなる recv, a # recv.method(a までやった recv, a, self # recv.method(begin; raise までやった 1 # ) までやった. つまり,recv, a が pop されてしまう
さて,ここでは例外から帰ってきたとき, recv と a は pop されて欲しくないので SP は 2 の位置からスタート,ということになる.つまり,2 という値が欲しい.
というわけで,begin の前に,sp の値(cont_spとしよう)をどこかに保存してあげればいい.ここで,例外テーブルにじかに書き込んでやればいいわけだ.多分.
一度書き込んでしまえば後はスルーしてもいいので,自分自身を nop に書き換えてしまえばよい.cont_sp を保存する必要がある場面なんて殆ど無い(と信じたい)ので,この命令自体の頻度は低い.
というわけで,コンパイラに手を入れずに簡単に対応できるね,って考えてみたんだけど,やっぱりコンパイル時点で決まったほうが気持ちいいなぁ,と思う今日この頃です.はい.
(この cont_sp 保存命令が必要か必要じゃないか,という判断には,そもそも cont_sp が 0 or over を判断しなくてはいけなくて,結局コンパイル時にスタックの位置を考えてあげなければいけない,という)
さて,簡単に出来ることだろうか.
node を traverse するときに(命令オペランドは決定するので)スタックの位置は決定するような気はする.だから,融合操作(とスタックキャッシング)をしなければスタックの位置はわかりそうである.
さて,融合操作のときにうまくそれが効くか.なんとなくうまく行きそうな気はするなぁ.オペランド融合ではスタックの位置は変わらないし,命令融合だったら,融合する前と後でつじつまが合えばいいのだから.
というわけで,基本命令についてきっちりスタックの位置がわかっているのならば,なんとかなりそうだということがわかった.
あとは,基本命令のスタックの位置の解析を手動でやるか,手でやるか,だなぁ.可変長の命令じゃなければ簡単だから,大部分のふつーの命令は自動で,そうじゃなければ手動でやるか.
Ruby を紹介するためにはどうすればいいのか,入門書を勉強してみるか.というわけで,楽しい Ruby を買うか.RubyWay とかも一応買わないといけないんだろうかなぁ.
勉強のために(何の)でかいプレゼンを読む.読みやすいですね.
よくかけてるけど,よくかけてるから,これしか読まない人が出てこないか不安.これはふつりなも同じ印象なんだよな.うーん.
ちなみに,最初のページの写真は dan さんが撮った写真です.こんなデジカメでも書籍に貼れるんだなぁ(でもやっぱりぼけてるな).
なんで読みやすいんだろう.
あと,短いのでゴールがわかりやすいってのもあるかなぁ.
yard は使ったことがあります。実は結構で好きです。yard に興味があるなら http://www.mind.sccs.chukyo-u.ac.jp/~yyuu/rem/ はどうでしょう?
継続はスタック全セーブ/リストアなんでしたっけ。Gaucheはフレームをひとつづつセーブして、継続起動時はヒープのフレームを直接参照するので、関数の頭でのspと途中の時点でのspとの間隔はコンパイル時に決まりません。この例のようなケースでは引数式の評価の前に継続フレームのpushを入れています。
yard とか rem とか興味深いですね。もっとメジャーになればいいと思うのですが(誰か記事書かないかな...)。
そうか、Schemeでは例外の起動は継続の呼び出しになるんですね。YARVでは簡単のためにスタック全セーブ / リストア にしてしまおうかと思っています(マシンスタック / YARVスタック双方)。Rubyでの例外発生とRubyでの継続実行のコストは違いがあるべきだと思っています(前者が圧倒的に高速でないといけない)。デザイン的には同じことを違う方法を使って行うので気持ち悪いんですが。
recv.method(a, &begin foo(*ary, &raise) rescue nil end)
みたいのは?
YARV、それなりに対応できているような気がするので評価などしてもらえるとうれしいです。スレッドとかシグナルとか、まだいい加減だけど。
IO は全部書き換えないと駄目かなぁ。
なぜか ICO を終わらせたりするんだけれど、はて2回目をやるべきか。 印象としては手をつなぐゼルダの伝説。
連載って毎号続けないといけないんだっけ。
IPA:未踏ソフトウェア創造事業:2005年度下期未踏ソフト に、応募件数が出ている。
高田さん、ねらい目? うちの先生への応募が増えてるな。
連載の話を出したのは、るびまを念頭に考えてます。
るびまの連載記事は、毎号出すから連載って意味じゃなくて、一度で終わらないとか、続き物という意味で連載にしてるんですが、さて毎号出せなければ、出せなかった分は「休載」ということになるんだろうか、と思って。
ちなみに、やーまには先月出さなかったけど休載とは思ってない人。いや、次回予告を裏切ったので、休載かなぁ。罪悪感は全然無いんだけど。
pr = lambda{ p self } pr.call 1.instance_eval{ pr.call } 1.instance_eval(&pr)
ブロックの中の self が変わるのは気持ち悪いなあ(そういうもんだけど)。
while begin break ensure break end end
が動かない。うーむ。
begin while true begin break ensure p :ensure raise end end rescue end
今度はこれが動かない。理由はわかったんだけど、どうしたもんかな。
while cond begin BODY break ensure ENSURE raise end end
とやると、
jump WHILE_NEXT WHILE_REDO: eval BODY # begin 部 eavl ENSURE # # ensure 部 send raise # # put nil # jump WHILE_END # eval ENSURE # ensure 部 send raise # WHILE_NEXT: eval cond if WHILE_REDO WHILE_END: ---- ENSURE: ENSURE raise
とコンパイルされる。つまり ENSURE の部分を while の BODY の後ろにコピーしてるんだけど、そうすると、ENSURE の部分が begin 部に含まれてしまって、ensure 部の中で raise したものが、ensure で捉えられる(ややこしい)ことになる。さて、こいつをなんとかするにはコピーする場所を変えるか、キャッチするアドレスをいじるかしないといけないのだけれど、さてどうしたものかな。
ensure 部の中から脱出するのを真面目に考えてないからいけないんだけれども。やれやれ。
■案1
jump WHILE_NEXT WHILE_REDO: eval BODY # begin 部 eavl ENSURE # ensure 部 send raise # put nil # jump WHILE_END # eval ENSURE # ensure 部 send raise # WHILE_NEXT: eval cond if WHILE_REDO WHILE_END: ---- ENSURE: ENSURE raise
■案2
jump WHILE_NEXT WHILE_REDO: eval BODY # begin 部 jump ENSURE1 ENSURE_RET: put nil # jump WHILE_END # eval ENSURE # ensure 部 send raise # WHILE_NEXT: eval cond if WHILE_REDO WHILE_END: ... end ENSURE1: eavl ENSURE # ensure 部 send raise # jump ENSURE_RET ---- ENSURE: ENSURE raise
どう考えても案1が綺麗だよなぁ。でも、テーブルいじるの面倒だし。
もう一案。この領域はスルー、って教えてあげるのはどうだろうか。うーむ、無理かな。
この辺は、ensure がネストしてたりとかbreakが何個もあったりすると泥沼。どうしたもんかね。
というわけで、案1、コンパイラで頑張る、を選択。
なんというか、無駄に break の対応にコンパイラの行数が。
while true begin p 1 break p 2 break ensure p :ensure end end
は、次のようになる。
== disasm: <ISeq:<main>@../yarv/test.rb>================================ == catch table |type: en, st: 0000, ed: 0010, sp: 0000, cont: 0054 == disasm: <ISeq:ensure@../yarv/test.rb>================================ local scope table (size: 1, argc: 0) [ 1] __$! 0000 putself ( 9) 0001 putobject :ensure 0003 send :p, 1, nil, 0, <ic> 0009 pop 0010 getdynamic 1, 0 0013 throw 0 |type: en, st: 0020, ed: 0032, sp: 0000, cont: 0054 == disasm: <ISeq:ensure@../yarv/test.rb>================================ local scope table (size: 1, argc: 0) [ 1] __$! 0000 putself ( 9) 0001 putobject :ensure 0003 send :p, 1, nil, 0, <ic> 0009 pop 0010 getdynamic 1, 0 0013 throw 0 |type: en, st: 0042, ed: 0044, sp: 0000, cont: 0054 == disasm: <ISeq:ensure@../yarv/test.rb>================================ local scope table (size: 1, argc: 0) [ 1] __$! 0000 putself ( 9) 0001 putobject :ensure 0003 send :p, 1, nil, 0, <ic> 0009 pop 0010 getdynamic 1, 0 0013 throw 0 |type: br, st: 0000, ed: 0057, sp: 0000, cont: 0057 |type: nx, st: 0000, ed: 0057, sp: 0000, cont: 0054 |type: rd, st: 0000, ed: 0057, sp: 0000, cont: 0000 |------------------------------------------------------------------------ local scope table (size: 1, argc: 0) 0000 putself ( 4) 0001 putobject 1 0003 send :p, 1, nil, 0, <ic> 0009 pop 0010 putself ( 9) 0011 putobject :ensure 0013 send :p, 1, nil, 0, <ic> 0019 pop 0020 putnil 0021 end ( 5) 0022 putself ( 6) 0023 putobject 2 0025 send :p, 1, nil, 0, <ic> 0031 pop 0032 putself ( 9) 0033 putobject :ensure 0035 send :p, 1, nil, 0, <ic> 0041 pop 0042 putnil 0043 end ( 7) 0044 putself ( 9) 0045 putobject :ensure 0047 send :p, 1, nil, 0, <ic> 0053 pop 0054 jump 0 ( 2) 0056 putnil 0057 end ( 9)
手で dead code eliminationするとこうなる。
== catch table |type: en, st: 0000, ed: 0010, sp: 0000, cont: 0054 |type: en, st: 0020, ed: 0032, sp: 0000, cont: 0054 |type: en, st: 0042, ed: 0044, sp: 0000, cont: 0054 |type: br, st: 0000, ed: 0057, sp: 0000, cont: 0057 |type: nx, st: 0000, ed: 0057, sp: 0000, cont: 0054 |type: rd, st: 0000, ed: 0057, sp: 0000, cont: 0000 |------------------------------------------------------------------------ local scope table (size: 1, argc: 0) 0000 putself ( 4) 0001 putobject 1 0003 send :p, 1, nil, 0, <ic> 0009 pop 0010 putself ( 9) 0011 putobject :ensure 0013 send :p, 1, nil, 0, <ic> 0019 pop 0020 putnil 0021 end ( 5) ...
さて、Array#each、Integer#times、Range#each だけ を高速化したんだけれど、他に高速化しないといけないような、よく使うものってあるかな。
まぁ、フレームワークみたいなものは作ったんだから、どうしても、ってところをちょいちょい追加できるってことでよしとしとこう(拡張ライブラリのようになっている)。
ちなみに、Hash#each は Ruby レベルで書くことは不可能なのでやらない。こればっかりはなぁ。
さて、あとは visibilityなんだが...。
ちなみに、今回のblock inlining は現状のRubyでも十分通用する話。でも、速くはならない。
ところで、
begin BLOCK rescue RESCUE_BLOCK ensure ENSURE_BLOCK end
というコードがあったとき、RESCUE_BLOCK を rescue 部、ENSURE_BLOCK を ensure 部と呼ぶのは問題ないと思うんだけど、BLOCK をなんというか、いつも戸惑う。YARV の説明などで、とくに戸惑う。
候補:
なんというのがいいんでしょうかねぇ。
goooo(ry)ooogleをYahooで検索 に爆笑してしまったので自分もやってみた。google で yahoo
["yah", 249000] ["yaho", 60700] ["yahoo", 35800000] ["yahooo", 35300] ["yahoooo", 10800] ["yahooooo", 3590] ["yahoooooo", 1820] ["yahooooooo", 1610] ["yahoooooooo", 2230] ["yahooooooooo", 954] ["yahoooooooooo", 1310] ["yahooooooooooo", 636] ["yahoooooooooooo", 488] ["yahooooooooooooo", 472] ["yahoooooooooooooo", 400] ["yahooooooooooooooo", 374] ["yahoooooooooooooooo", 462] ["yahooooooooooooooooo", 215] ["yahoooooooooooooooooo", 191] ["yahooooooooooooooooooo", 127] ["yahoooooooooooooooooooo", 160] ["yahooooooooooooooooooooo", 141] ["yahoooooooooooooooooooooo", 382] ["yahooooooooooooooooooooooo", 330] ["yahoooooooooooooooooooooooo", 298] ["yahooooooooooooooooooooooooo", 355] ["yahoooooooooooooooooooooooooo", 291] ["yahooooooooooooooooooooooooooo", 266] ["yahoooooooooooooooooooooooooooo", 176] ["yahooooooooooooooooooooooooooooo", 206] ["yahoooooooooooooooooooooooooooooo", 216] ["yahooooooooooooooooooooooooooooooo", 405] ["yahoooooooooooooooooooooooooooooooo", 197] ["yahooooooooooooooooooooooooooooooooo", 171] ["yahoooooooooooooooooooooooooooooooooo", 104] ["yahooooooooooooooooooooooooooooooooooo", 130] ["yahoooooooooooooooooooooooooooooooooooo", 124] ["yahooooooooooooooooooooooooooooooooooooo", 99] ["yahoooooooooooooooooooooooooooooooooooooo", 128] ["yahooooooooooooooooooooooooooooooooooooooo", 110] ["yahoooooooooooooooooooooooooooooooooooooooo", 78] ["yahooooooooooooooooooooooooooooooooooooooooo", 67] ["yahoooooooooooooooooooooooooooooooooooooooooo", 99] ["yahooooooooooooooooooooooooooooooooooooooooooo", 54] ["yahoooooooooooooooooooooooooooooooooooooooooooo", 44] ["yahooooooooooooooooooooooooooooooooooooooooooooo", 43] ["yahoooooooooooooooooooooooooooooooooooooooooooooo", 36] ["yahooooooooooooooooooooooooooooooooooooooooooooooo", 185] ["yahoooooooooooooooooooooooooooooooooooooooooooooooo", 27] ["yahooooooooooooooooooooooooooooooooooooooooooooooooo", 28] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooo", 21] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooo", 40] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooo", 81] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooo", 48] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooo", 26] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 39] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 17] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 21] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 11] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 12] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 11] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 10] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 30] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 9] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 3] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 7] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 8] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 8] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 4] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 4] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 6] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 5] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 3] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 8] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 5] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 4] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 4] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 5] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 3] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 3] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 2] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 1] ["yahooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo", 0]
0 になったかと思えばまた復活する。
IRC でも昔ツンデレshellの話はあったんだけれど、ツンデレは基本的に stateful なので、stateless な shell はあわないだろう、と思った。
(そこでログイン回数とか history の長さとか、時間とか...)
今のままだと caller binding 出来ないことに気づく。参ったな。
なんでRubyはwhile文ひとつとってもとても難しいかね。
こう、どの辺が難しいかというと、
while cond class Foo next bar end end
を実現することあたりが難しい。
お台場産総研でBlueGeneを見学させていただきました.とても寒かったです(空調).
Binary2.0 でした.どれも面白かったですが,時間が無かったせいもありますが,もっと深い話を聞きたかったものです(正直,どれもこれも消化不良な.一人一時間くらいあっても良かったんではなかろうか(話者にそんな暇はなさげ)).それだけ凝縮されていた話ということだったんでしょう.
りょうせいさんにAXEの社長さんという方を紹介してもらったんですが,ぱっと面接だったらしく,すぱっと不合格になりました.というわけで,就職活動失敗.ああいう人じゃないと社長さんは務まらないんでしょうねえ.
2次会,まごまごしてしまってすみません.とくにartonさんごめんなさい.
というわけで,遅いので西山さんとそれから水島君も一緒に研究室へ.
衝撃,千葉先生はこんな本まで書いていた>http://www.meteo-intergate.com/catalog/link/kobetsu/5891.htm
水島君にEclipse のプラグインの話とGroovy組み込みについての話を聞く.
私はよく FPGA ボードという言葉を聞きますね.
やってみたかった block の inlining (Integer#times と Range#each だけ)をやってみた.繰り返し自体はとても速くなったと思う.
意味を保つために色々な工夫をした.命令が2個ほど増えた.ついでに,バグをつぶした.
かなり気持ち悪い書き方になっている部分があるため,なんとかしたいとは思う.ファイルを分けるかな,やっぱり.
この辺の話は PRO には出せなさそうだけど,どっかでまとめてみたいものだなぁ.どこかいいところありませんかね.YARV Maniacs では書くと思うけどね(続いてたら).でも,Rubyオンリーだから,論文としての価値は無いかな.
Range#each インライン化をすることによって,例えば Range#map (Enumerable#map)は C で書くよりも Ruby で書いたほうが速くなった(2.0 秒が 1.2秒くらい.相当速い).
さて,ここで問題になるのは,例えば Haskell の prelude.hs みたいなものが Ruby には無いため,Ruby Scriptで書いた組み込みメソッドなどは定義できないこと.
どうしたもんですかね.C で文字列に書いて eval?
なんで? 気にしてないというか、「とくに」ってことは無いと思うよ。
いや,寒いといっていらしたのに,なかなか決まらなくて申し訳なかったなあ,と.
C で書くよりも Ruby で書いたほうが速くなった
素晴らしいじゃないですか。
Haskell の prelude.hs みたいなものが Ruby には無い
暗黙の裡に読めばいいじゃない。あんまり大きくなると、処理系の起動が遅くなっちゃうかな。
やっぱそうなりますかねぇ。
あとは、
とか。
今日はいいことがあった。よかった。これで、通算4本。
まぁ、数は関係ないけど。
今日はBinary2.0の前にBlue geneデスヨ(中尾さん、どうもありがとうございます)。SC2.0ですよ、ってSCは2.0じゃきかねーよな。(SC: SuperComputing)
TUNTUN という名前に爆笑したおやつ時.JIAJIAを意識してるんだろうが.
スタックポインタをチェックするコードを書いたらなんか色々エラー.うーむ.
Komodo 3.5 が出たようなので、ちょっと試してみた。何気なく GUI ビルダーがあったので cygwin 版の Ruby で試してみる。Tk なんて入れた覚えが無いからどーせできないだろうーと思ってたら、ふつーに動いた!
動くことを知りませんでした。スゲーぜ cygwin。
で、Komodo 3.5 ですが、色々頑張ってるようです。メソッド名補完とかも怪しげに動いてます。まぁ、$300 払うかは、どうなんだろう。プロフェッショナル版の機能を使いこなしてないだけとも。
Professional と Personal は、商用アプリ開発に使えるか使えないか、が違うのかな。
go suck it
addr2line