K.Sasada's Home Page

Diary - 2013 March

研究日記

弥生

_22(Fri)

遠藤さんに、型システム入門 プログラミング言語と型の理論 を頂きました。誠にありがとうございます。

言語処理系について研究してるんなら、これくらい読めよ! というありがたいお心遣いだと思います。誠にありがとうございます。

最初にみた感覚は、「あれ、意外と薄い」という印象でした。原著 TAPL はハードカバーで重厚で、本棚にどっしりと鎮座している感じなのですが、訳書はどこでも気軽に持って行けそうな雰囲気です。ありがたいですね。

喜び勇んで中をあけると、数式が沢山書いてあって心躍ります。私はそっと閉じました。

紹介文を引用します。

型システムを理解するうえでの定番書を翻訳!

型システムとは、プログラミング言語の安全性や効率を高めるうえで重要な理論・手法です。本書は、その型システムについて基礎的な話題を網羅し、実装例を交えて丁寧に解説したThe MIT Press発行の解説書“Types And Programming Languages”を翻訳したものです。言語設計者や学生だけでなく、静的型付言語を深く理解して活用したいプログラマーにとっても貴重な情報となっています。

簡約者、じゃなくて監訳者の住井先生の冒頭の文章に出てくるお名前を見ると、日本の総力を結集したと言っても過言ではないようなメンツが揃っていて、この翻訳のために、論文の生産性がどれくらい落ちたのか心配になりそうな気もしますが、皆様素晴らしく優秀な方々なので、そんな心配ないんでしょうね。さすがです。

これは買うしかないですね。


RSS ではなく、日記の表紙 http://www.atdot.net/~ko1/diary/ をご覧頂くとわかると思いますが、オススメの本を記載するスペースに、まだ若干の余裕があります。著者・訳者の方々にはこのスペースの活用を何とぞご検討下さい。


アホなこと言ってないで、勉強します...。ここまでしてもらってわかりませんとは言えないよなあ。


どちらもオーム社さんなんですな。素晴らしい。

_21(Thu)

[Rubyコミッタ 笹田耕一氏]東大教員を辞しRuby開発に専念

インタビューを記事にして頂きました。

Rubyのエンジン部分であるVM(仮想マシン)「YARV(ヤルフ)」を開発した笹田耕一氏。

私個人としては「やるぶ」と読んでいます。インタビューの時もそう読んでたんじゃないかなぁ。読み方は何でも良い、と公言しているので修正の御願いはしませんでした。

デバッガに関しては、 https://github.com/ko1/debugger2 で中途半端に達成出来たと思っています(中途半端...)。

他の人と違って、まったく良い話をしていない。

_かくたに(Fri Mar 22 09:11:52 +0900 2013)

 "Rubyにはまだまだ高速化の余地がありますので、もっと速くしていきたい" かっこいい

_18(Mon)

土曜日に大江戸Ruby会議03でモテナイ発表をしてきました。

@koichisasada: Ruby の GC の問題点と改善手法についての一考察, 大江戸Ruby会議03 (2013.3).

スライド資料はこちら:http://www.atdot.net/~ko1/activities/oedorubykaigi03_ko1_pub.pdf

いやー、発表時間が足りなくて、改善案の話まで至らなくて残念ダッタナー。


で、ここで bitmap marking なんだから bitmap 画像が簡単に出るよって話だったんですが、実は GC というかオブジェクト空間の可視化って、昔から割とスグに出来る話ではあったし、実際に何人もの人が作っています。

で、折角の機会だし、私もやってみようかなぁ、と思ったのが、あれを作ったきっかけではありました。


で、戦略なんですが、mark 終了時に bitmap を書き出す、みたいなことをやるわけで、データ構造さえわかれば、それを実行するだけです。今回はあまり考えず、gc.c にちょいちょい手を入れることで行いました。

で作った結果はこちら。

文字列がどわーっと増えて、赤くなっていく様はホラーです。

これらの例は、結構恣意的というか、パターン化された例なので、実際のアプリでどのような挙動を示すかは、見てみたいような気がしますね。


さて、画像データを出すのは、だから簡単なのです。出すだけなら職場から帰る途中の電車の中だけで出来た。

これを、画像ファイルに変換し、さらには動画までするのが面倒だった。

ベタ bitmap を画像編集ソフトや動画作成ソフトに渡すためには適切なファイルフォーマットに変換しないといけませんが、さてこれをどうやればよいか。

ということで、今回は rcairo を使って png ファイルをガンガン作成して、それを ffmpeg でくっつける、という方針をとりました。きっと、もっと効率的な方法もあったと思いますが、手持ちで触れそうなのがこれくらいだった。

ベタデータから png ファイルを作成するのがこっち。

require 'rubygems'
require 'cairo'
require 'pp'

require 'rubygems'
require 'cairo'
require 'pp'
DIR = '/home/ko1/src/tmp/gc'

pid_files = Hash.new{|h, k| h[k] = []}

Dir.glob("#{DIR}/gcbitmap*").sort.each{|file|
  if /gcbitmap-(\d+)-(\d+)-(\d+)x(\d+)/ =~ file
    f = {
      file: file,
      pid: $1.to_i,
      cnt: $2.to_i,
      y: $3.to_i,
      x: $4.to_i,
    }
    # p [file, x, y, File.size(file)]
    pid_files[f[:pid]] << f
  end
}

pid_files.each{|pid, files|
  next if files.size < 200
  max_x = files.max_by{|f| f[:x]}[:x]
  max_y = files.max_by{|f| f[:y]}[:y]
  p [pid, files.size, max_x, max_y]

  # next

  files.each{|f|
    x = f[:x]
    y = f[:y]
    file = f[:file]

    background_surface = Cairo::ImageSurface.new(max_x, max_y)
    surface = Cairo::ImageSurface.new(File.read(file), Cairo::Format::RGB24, x, y, x * 4)

    Cairo::Context.new(background_surface){|context|
      context.set_source_rgb(0.2, 0.2, 0.2) # blue
      context.rectangle(0, 0, max_x, max_y)
      context.fill
      context.set_source(surface)
      context.paint
    }


    dirname = "#{DIR}/png-#{pid}"
    Dir.mkdir(dirname) if !FileTest.directory?(dirname)
    png_filename = "#{dirname}/#{'%08d' % f[:cnt]}.png"
    p png_filename
    background_surface.write_to_png(png_filename)
  }
}

まぁ、画像処理っぽいことをしているのは、高さを合わせるために画像を弄った、というところくらいではあるのですが。

いやはや、楽しかったです。


んで、こういう作業をするには、前述の通り gc.c を弄れば簡単なんですが、そうじゃないとやりづらい。何がやりづらいかというと、mark 終了時にすぐにこれを起動することなわけです。ということで、何かしら、これを拡張ライブラリから叩けるようなものにしておきたいなぁ、という気がしているところです。

_11(Mon)

もう震災から2年なんですね。合掌。

Sasada Koichi / ko1 at atdot dot net
$Date: 2003/04/28 10:27:51 $