Hatena::ブログ(Diary)

hogeなlog

プロフィール

hogelog

hogelog

小室 直(こむろ すなお)。電気通信大学2003年入学。2010年修士卒業。プログラミングとかしてます。

カレンダー
1984 | 01 |
2006 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
2010 | 01 | 06 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 12 |
2012 | 01 | 04 | 06 |

July 28(Mon), 2008

[][] Tsukuba.R#1

自分の発表

Tsukuba.R#1でなんか話してきました。発表タイトル「はじめてのR ―恋するRはせつなくてLispを想うとついlambdaしちゃうの―」とか、あーふざけてますね。内容はR処理系の中身を読んでいこうといったようなもの。


発表の途中で出てくるdiffを含むpatchも一応発表資料の中に。いやあんなの使うべきじゃないけど。


発表の様子は http://www.ustream.tv/channel/tsukuba.r のVideo Clipから見れます。声が小さいなあ。リハーサルしてなくておおまかなストーリーしか考えてこなかったから、喋りの内容その場で考えてるせいで「えーと」「まあ」「あれ」とか多い。あとわりとくどいなー。前フリ部分(発表に至った理由)は頭から尻尾まで全部嘘です。端末の文字小さくてまったく読めない。


あとたぶんRだとベクトルというものが重要なはずなのですが、その辺はまったく話してませんね。Lispっぽい部分だけ微妙に解説もどきをしました。

自分以外の発表

まず自分の発表の前はずっとソワソワしてたり、結局直前まで資料いじってたりプレゼンツールに機能追加してみてたり、あと端末の文字大きくしよう(結局できなくて小さい文字で発表してしまった)と四苦八苦してたせいで、他の人の発表はいまいちちゃんと聞いてなかったすいません。


Rのことは発表したようなソースコード以外は調べずに来たのでイントロダクション的な内容はありがたかったですね。

でも話す側に立つのに「おもしろいかなー」と思って本気で全く調べなかったのは良くなかったなやっぱり。

発表とか以外

芝工の学食などで昼飯食ったりしてたわけだけど、たぶん頭の悪い発言を繰り返していた。芝工の校舎はやたら小綺麗だった。あれは金かかってるぜ。

飲み会では基本的にずっと頭悪いこと喋ってた。つまり頭が悪い。


飲み会終わった帰路にてたしかwakutekaと「E.G.コンバットは超すばらしい」みたいな話をしてたところ急激に腹の調子がイイカンジになってしまいトイレに退避。「あれhogelogいなくね?」みたいな話になってたかもしれない。すいません。


勉強会発表ドリブン学習もできたし、Rにとっかかる動機付けができた。Tsukuba.Rを開催したsyou6162、会場の準備をしたnegaton、発表した人、聞いた人、ustreamで見てた人、みなさまに感謝を。

July 20(Sun), 2008

[] LaTeX Beamerでスライド書いた

プレゼン資料プレゼン資料したプレゼン資料ぽいものを作る必要があったので、とりあえず研究室でライセンスもらったPowerPointで書いたりしてみたんだけど、なんかこう、すさまじく窮屈だったのでLaTeXで書いた。最初slides classとか使ってみてたのですが、どうもBeamerとやらの方がモダンっぽいぞと気付いたのでBeamer を使ってみるなど参考にBeamerで書きました。

デフォルト表示からちょっといじりたかったので適当なstyleファイル書いた。コンパイルする.texファイルと同ディレクトリに置くか、texmf以下に置いておいて、texファイル中のdocumentの前に

\usepackage{my_slides}

などと書いておく。

my_slides.sty

\voffset=0in
\hoffset=0in
\voffset=0in

\mathversion{bold}
\renewcommand{\familydefault}{\sfdefault}
\renewcommand{\kanjifamilydefault}{\gtdefault}
\setbeamerfont{title}{size=\large,series=\bfseries}
\setbeamerfont{frametitle}{size=\large,series=\bfseries}
\setbeamertemplate{frametitle}[default][center]

\usefonttheme{professionalfonts}
\useoutertheme{default}

% maketitle
\def\event#1{\gdef\@event{#1}}
\def\group#1{\gdef\@group{#1}}
\def\stdid#1{\gdef\@stdid{#1}}

\renewcommand{\maketitle}{
\frametitle{\inserttitle}
{\footnotesize
\@event{\hfill}
\\
\@group \hspace{1.5zw} \@stdid \hspace{1.5zw} \insertauthor
\vspace{1.5zw}
}
}

適当にコピペとかでやってるので、TeXの文法とか全然知らない。コンパイルは

$ platex hoge.tex
$ dvipdfmx hoge.dvi

などと。エラーが大量に出るのがなんなのかはよく知らない。あとdviファイルは読めないものができる。


以下用例。

続きを読む

July 19(Sat), 2008

[] 7/20(日)は電気通信大学オープンキャンパスをよろしくおねがいします

私がいるのはここですね。

J−14 「VLSI時代のネットワークとセキュリティ」(阿部研究室)

西9号館6階609号室 13:00〜17:00

コンピュータ,ネットワーク,セキュリティなど,現代社会で必要とされる技術は多岐にわたります.本研究室では,学生の興味を大切にし学生の力を伸ばすことを主目的に,ソフトウェア,ハードウェアそれぞれの特性を活かし,アルゴリズムからVLSI(超大規模集積回路)設計に至る様々な手法を駆使し,広い分野で問題解決を試みています.

最近では,コンピュータシステムとネットワークのセキュアな高速低電力アーキテクチャを目指し,低コスト高精度パーセプトロン分岐予測,情報フロー追跡プロセッサ,暗号処理の最適化実装,動的再構成可能プロセッサの画像処理への応用,学習論的アプローチによるインターネットの輻輳制御,アドホックネットワークのセキュリティ対策,高速高精度不正侵入検知システム,未知ウィルスの検出,電子透かしによる画像の著作権保護と改ざん検出などで成果を上げています.また,アクセス予測に基づいたキャッシュメモリの高速低電力化,マルチコアプロセッサの低電力キャッシュアーキテクチャ,組み込み向け低電力ガーベジコレクション,アノーマリ型侵入検知システム,無線ネットワークの電力低減と利便性の向上などの研究も進行中です.

これらの研究について,学生が分かりやすくご紹介します.

http://www.cs.uec.ac.jp/profile/exam/open-campus.html

組み込み向け低電力ガーベジコレクション

私の研究分野はそこだったのかとこの資料で判明した次第です。新聞で自分の勤め先が倒産したことを知る無職さんみたいでかっこいいですね。電気通信大学に興味がある方は是非お誘いあわせのうえ冷やかしなどどうぞ。もう明日だけど。


デモプログラム走らせたりしときたいなーと思ってたけど、まだ何も手をつけてない。

トラックバック - http://d.hatena.ne.jp/hogelog/20080719

July 15(Tue), 2008

[] ICFPC2008感想

7/12(土) AM 4:00 - 7/15(火) AM 4:00まではICFP Programming Contest 2008に参加していました。「ICFPコンテストて何?」てむきの方とかはk.inabaさんによる紹介とか読むといいんじゃないかなと思います。一応簡単に説明すると、参加資格、使用プログラミング言語も定めず世界中から参加人を募る毎年開催のプログラミング祭みたいなもんです。

k.inabaさんの紹介にもありますが、2006年と2007年の主催者が用意したシステムの気合の入りっぷりが尋常じゃなく、おもしろすぎることあたりからも割と評判が広まったような印象がありますけど気のせいかもしれません。

というわけで今年。そういやハチロク世代とかだと参加する人多いのかなーと思って適当に「集まらないか?」的なこと書いたりしたのですが、まあ適当過ぎて集まりませんでした。というわけで個人で非常に気楽にダラダラと参加していました。好成績とかそういうのを意識すらしてない怠けた参加態度だったんですが、これはこれでけっこう楽しかったです。

1日目

まず問題文を読み解くところが難関です。難関なのでこれだけで1日目をだいたい終えたような記憶があります。まず今年の問題はでっかい岩とかクレーターとか、襲いかかってくる火星人がいたりする火星の地にて探査機を基地にたどりつくよう走らせるというものなんですが、ここまで読み解くのにもずいぶん時間がかかった。あとTCP/IPソケット通信をする云々書いてあったけどその辺さっぱりわからなかったので慌てて調べたり。でもRubyのTCPSocketあたりとか特に難しくもなさそうだったので自然とRubyで書き初めました。たぶんこの日は

#!/usr/bin/env ruby

require 'socket'

port = ARGV[1].to_i
host = ARGV[0]
rounds = 5

sock = TCPSocket.open(host, port)
sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)

$/ = ';'
count = 0
sock.each_line do |line|
  puts line
  case line[0]
  when ?I
  when ?T
  when ?B
  when ?S
  when ?C
  when ?K
  when ?E
    if (count += 1) == rounds
      sock.close
      exit
    end
  end
end
sock.close

こういう正真正銘何もしない(探査機を動かさない)プログラムを書いて試しにサブミットしたあたりまでで終えてた気がします。

2日目

しばらくは

#!/usr/bin/env ruby

require 'socket'

port = ARGV[1].to_i
host = ARGV[0]

sock = TCPSocket.open(host, port)
sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)

while op=$stdin.gets
  sock.write(op.chomp+';')
end
sock.close

みたいなプログラム書いて、ジョイパッドとJoyToKey使って手動で探査機走らせて遊んだりしていました。だいたいこの遊びが2日目にした作業の半分くらいのような……

もう半分は障害物を完全無視して基地へと進むようにしました。頭左右に振りながらヨタヨタしながらも一応基地へと進むことに感動したりしてました。

f:id:hogelog:20080715174230p:image

この後にLiveCD上で書いてたソースコードを紛失したりしましたが、たいして書いてなかったので被害は小さかったです。この時点でもプログラムはたぶんこんな感じ。

#!/usr/bin/env ruby

require 'socket'

port = ARGV[1].to_i
host = ARGV[0]
rounds = ARGV[2] ? ARGV[2].to_i : 5

sock = TCPSocket.open(host, port)
sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)

$/ = ';'
init = sock.gets
dx, dy, time_limit, min_sensor, max_sensor,
  max_speed, max_turn, max_hard_turn =
  init.scan(/-?[\d\.]+/).map!{|f|f.to_f}

count = 0
sock.each_line do |line|
  puts line
  case line[0]
  when ?T
    time, ctrl, x, y, dir, speed =
      line[1..-1].scan(/[^\s]+/)
    if time=='0'
      sock.write('a;a;')
    else
      x = x.to_f
      y = y.to_f
      dir = dir.to_f
      pos_dir = Math.atan2(y, x)*180/Math::PI

      if (pos_dir > 0 && pos_dir-180 < dir && dir < pos_dir) ||
        (pos_dir < 0 && (dir < pos_dir || pos_dir+180 < dir))
        sock.write('r;')
      else
        sock.write('l;')
      end
    end
  when ?B
  when ?S
  when ?C
  when ?K
  when ?E
    if (count += 1) == rounds
      sock.close
      exit
    end
  end
end
sock.close

3日目

2日目のプログラムの時点で、運が良ければ基地にたどりつくようになってたので割と満足していたのですが、さすがに障害物避けようとする努力の影すら無いのはなー、と思いちょっとごちゃごちゃ書き足しました。Tメッセージを読んで、だいたい探査機の向いてる方向ある障害物のうち、一番近いものを避けようとする感じです。左の方にあったら右に向いて、右の方にあったら左を向く、という。障害物の半径も読んでないので、当たるときは普通に当たります。あとなんか正面から障害物に突っ込むことあるので普通にダメダメだと思う。火星人はあんまし当たらないので完全無視。

f:id:hogelog:20080715175108p:image

まあ、なんとなく2日目よりは良くなってるのかなあと思えるような思えないような。最終提出のプログラムはこんなの。ひどいので誰の参考にもならないと思います。ruby知らない人に「rubyのプログラムは汚ないなあ」と思われないように言っておきますと、処理を全部mainの中に書いてるCプログラムみたいなもんです。

#!/usr/bin/env ruby

require 'socket'

class AngleRange
  DIR_R = 1
  DIR_L = 2
  DIR_RL = 3
  def initialize(base, range)
    @base = base
    @range = range
  end
  def include?(dir, rl)
    in_flag = 0
    if @base - @range <= -180
      if dir <= @base || 360 + @base - @range <= dir
        in_flag |= DIR_R
      elsif @base < dir && dir < @base + @range
        in_flag |= DIR_L
      end
    elsif @base + @range >= 180
      if @base - @range <= dir && dir <= @base
        in_flag |= DIR_R
      elsif dir <= -360 + @base + @range || @base <= dir
        in_flag |= DIR_L
      end
    elsif @base - @range < dir && dir < @base
      in_flag |= DIR_R
    elsif @base < dir && dir < @base + @range
      in_flag |= DIR_L
    end
    rl&in_flag != 0
  end
end

def nearest(objs, x, y, dir, range)
  near_dir = nil
  near_dis = Float::MAX
  near_obj = nil
  objs.each{|c|
    rx = c[0]-x
    ry = c[1]-y
    rdis = rx**2+ry**2
    cdir = Math.atan2(ry, rx)*180/Math::PI
    if range.include?(cdir, AngleRange::DIR_RL) && rdis < near_dis
      near_dir = cdir
      near_dis = rdis
    end
  }
  near_dir
end

counter = 0
port = ARGV[1].to_i
host = ARGV[0]
rounds = ARGV[2] ? ARGV[2].to_i : 5

$/ = ';'
sock = TCPSocket.open(host, port)
sock.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1)

init = sock.gets
dx, dy, time_limit, min_sensor, max_sensor,
  max_speed, max_turn, max_hard_turn =
  init.scan(/-?[\d\.]+/).map!{|f|f.to_f}

count = 0
aa = false

sock.each_line do |line|
  #puts line
  case line[0]
  when ?T
    time, ctrl, x, y, dir, speed =
      line[1..-1].scan(/[^\s]+/)
    if time=='0'
      sock.write('a;a;')
      aa = true
    else
      x = x.to_f
      y = y.to_f
      dir = dir.to_f
      pos_dir = Math.atan2(y,x)*180/Math::PI
      acc = ctrl[0]
      turn = ctrl[1]

      dis = x**2 + y**2
      if dis > 1000
        sock.write('a')
        aa = true
      elsif aa
        aa = false
        sock.write('b')
      end

      craters_dir = 0
      boulders_dir = 0

      if line.scan(/h/).length == 0
        craters = line.scan(/c (-?[\d\.]+) (-?[\d\.]+) (-?[\d\.]+)/)
        range = AngleRange.new(dir, 20.0)
        if craters.length > 0
          craters.map!{|c|c.map!{|f|f.to_f}}
          near_dir = nearest(craters, x, y, dir, range)
          if near_dir
            if range.include?(near_dir, AngleRange::DIR_R)
              craters_dir += 1
            elsif range.include?(near_dir, AngleRange::DIR_L)
              craters_dir -= 1
            end
          end
        else
          boulders = line.scan(/b (-?[\d\.]+) (-?[\d\.]+) (-?[\d\.]+)/)
          range = AngleRange.new(dir, 10.0)
          if boulders.length > 0
            boulders.map!{|c|c.map!{|f|f.to_f}}
            near_dir = nearest(boulders, x, y, dir, range)
            if near_dir
              if range.include?(near_dir, AngleRange::DIR_R)
                boulders_dir += 1
              elsif range.include?(near_dir, AngleRange::DIR_L)
                boulders_dir -= 1
              end
            end
          end
        end
      end
      if craters_dir > 0
        sock.write('l')
      elsif craters_dir < 0
        sock.write('r')
      elsif boulders_dir > 0
        sock.write('l')
      elsif boulders_dir < 0
        sock.write('r')
      else
        range = AngleRange.new(pos_dir, 180)
        if range.include?(dir, AngleRange::DIR_R)
          if turn != ?r && turn != ?R
            sock.write('r')
          end
        else
          if turn != ?l && turn != ?L
            sock.write('l')
          end
        end
      end
      sock.write(';')
    end
  when ?B
  when ?S
  when ?C
  when ?K
  when ?E
    if (count += 1) == rounds
      exit
    end
  end
  sock.flush
end
sock.close

言いたかったこと。

見てわかるように、やってることのショボさは尋常じゃないです。でも最初に問題文読んだとき「こんなの俺程度じゃどうしようもないじゃん……」という印象ほどじゃあなかったなと。なんだかんだとダラダラ書いて、動いてるプログラム見てりゃ結構楽しいんですよ。ICFPCはプログラミングスキルそんな高くない人でも割と楽しめましたよ、というのが言いたかったことです。どっとはらい

トラックバック - http://d.hatena.ne.jp/hogelog/20080715

July 11(Fri), 2008

[] Javaで1行エディタ

なんだっけな。そうだ twitter発言スクリプト - hogeなlogでエディタは外部のプログラム使ってたんだけど、twitter用の1行テキスト書くのにでっけえ画面のエディタ開いて、書いて、保存して、終了するっていうのがめんどくさかったからJavaで1行だけのテキストエディタもどきを書きました。ということです。超絶書き捨てプログラム。Enterで保存して終了、普通に終了すると保存しない。「保存しますか?」などと聞いてくる親切さは皆無。twitter投稿スクリプト用に使うことしか考えてない。中身ある既存ファイル開いても問答無用で上書きします。

import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
import java.awt.event.*;
import java.util.*;

public class OneLineEditor extends JFrame{
  private static final String title = "OneLineEditor";
  private String filepath;
  private JTextField field;
  private File file;
  private FileWriter writer;
  public OneLineEditor(String _filepath) {
    super(title);

    filepath = _filepath;
    try {
      writer = new FileWriter(new File(filepath));
    }
    catch(IOException ex) {
      System.err.printf("cannot open %s", filepath);
      System.exit(1);
    }
    field = new JTextField(50);
    field.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent ev) {
        save(field.getText());
        System.exit(0);
      }
    });
    field.getDocument().addDocumentListener(new DocumentListener() {
      public void changedUpdate(DocumentEvent ev) {
        edit(field.getText());
      }
      public void insertUpdate(DocumentEvent ev) {
        edit(field.getText());
      }
      public void removeUpdate(DocumentEvent ev) {
        edit(field.getText());
      }
    });
    getContentPane().add(field);

    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent ev) {
        System.exit(0);
      }
    });

    pack();
    setVisible(true);
  }
  private void save(String text) {
    try {
      writer.write(text, 0, text.length());
      writer.close();
    }
    catch(IOException ex) {
      System.err.printf("cannot write to %s", filepath);
      System.exit(1);
    }
  }
  private void edit(String text) {
    setTitle((new Formatter()).format("%s %d", title, text.length()).toString());
  }
  public static void main(String[] args) {
    if(args.length>0) {
      OneLineEditor editor = new OneLineEditor(args[0]);
    }
  }
}
トラックバック - http://d.hatena.ne.jp/hogelog/20080711

July 10(Thu), 2008

[][] twitter発言スクリプト

そんなもん書くまでも無くあるだろう。でも探すまでもなく書きゃいいじゃん。探したり動かすのってやっぱりめんどうだから。

ほとんどこの前書いたmixi日記投稿スクリプトの使い回し。

他の人の発言が見えないところとかが他のTwitterクライアントと比べて優れている点です。

#!/usr/bin/env ruby

require 'tempfile'
require 'rubygems'
require 'mechanize'
require 'kconv'

USER = 'username'
PASS = 'password'
EDITOR = 'C:/hoge/prg/gp/GreenPad.exe'
LOG = 'twitter.log'
def login
  agent = WWW::Mechanize.new
  page = agent.get('http://twitter.com/login')
  login_form = page.forms[1]
  login_form['username_or_email'] = USER
  login_form['password'] = PASS
  home_page = agent.submit(login_form)
  return agent, home_page
end
def update(agent, home_page, text)
  update_form = home_page.forms[0]
  update_form['status'] = text
  agent.submit(update_form)
end
def edit_txt
  tmppath = ''
  Tempfile.open('twitter'){|file|
    tmppath = file.path
  }
  system(EDITOR, tmppath)
  texts = IO.readlines(tmppath)
  return texts
end
text = edit_txt.join.toutf8
agent, home_page = login
update(agent, home_page, text)

File.open(LOG, 'a'){|file|
  file.printf("%s %s\n", Time.now.strftime('%Y%m%d %X'), text)
}

LukeSilviaLukeSilvia 2008/07/10 11:37 twitter はAPI があるので、それを活用するのがよいのではないかと思います

hogeloghogelog 2008/07/11 04:26 APIがあるのは知ってましたけど、制限あったり、あと調べるよりmechanizeで書く方が早いなーと思って書いてしまいました。

July 07(Mon), 2008

[][] mixiに日記投稿するスクリプト

最近mixiに日記とか全然書いてませんでした。そこでふとこの前うじひさのブログならライブドアブログ(livedoor Blog) - 無料・デザイン豊富を思いだし、rubyでmixi日記投稿スクリプトでも書いてみっかと思いたった。で、書いた。習作。習作以外のプログラム書いたこと無い気もするけど。いちおう自分では使うか。

これ書いた数時間後にUI変更で使えなくなるとかなんだそれ。

修正した。

開いたエディタに書いた1行目がタイトル、2行目以降が本文になる。

#!/usr/bin/env ruby

require 'tempfile'
require 'rubygems'
require 'mechanize'
require 'kconv'

USER = 'hoge@hoge.com'
PASS = 'password'
EDITOR = 'C:/your/editor/path/editor.exe'
def login
  agent = WWW::Mechanize.new
  page = agent.get('http://mixi.jp/')
  login_form = page.forms.first
  login_form['email'] = USER
  login_form['password'] = PASS
  login_form['next_url'] = '/home.pl'

  agent.submit(login_form)
  return agent
end
def add_diary(agent, title, body)
  home_page = agent.get('/home.pl')
  add_href = ''
  home_page.links.each do |link|
    if link.href =~ /^add_diary/
      add_href = link.href
    end
  end
  add_page = agent.get(add_href)
  add_form = add_page.forms[1]
  add_form['diary_title'] = title
  add_form['diary_body'] = body
  confirm_page = agent.submit(add_form)

  confirm_form = confirm_page.forms[1]
  agent.submit(confirm_form)
end
def edit_txt
  tmppath = ''
  Tempfile.open('mixi'){|file|
    tmppath = file.path
  }
  system(EDITOR, tmppath)
  texts = IO.readlines(tmppath)
  return texts
end
texts = edit_txt
title = texts[0].toeuc
body = texts[1..-1].join.toeuc
agent = login
add_diary(agent, title, body)

しかしこの程度なのにmechanizeの使い方わからなかったりで随分時間かかった。

一時ファイル作ってそれをエディタに開かせて、書いた内容を受け取っている部分の

  Tempfile.open('mixi'){|file|
    tmppath = file.path
  }
  system(EDITOR, tmppath)
  texts = IO.readlines(tmppath)

がなんかこう、openブロック閉じるときにclose(false)になり、GC.startが実行されるまでファイルを削除はせず、その隙にエディタにそのファイル渡して編集、その内容を受け取る、とかなんかこれいいのだろうか。

July 06(Sun), 2008

[][][] Rubyist Magazine - YARV Maniacs 【第 3 回】 命令ディスパッチの高速化を読む (1)

http://d.hatena.ne.jp/hogelog/20080704/p1 で書いたVMを高速化。というかコンパイラさんの頑張りを見てみよう。

続きを読む

[][][] Rubyist Magazine - YARV Maniacs 【第 3 回】 命令ディスパッチの高速化を読む (2)

Structured GOTO Programming World へようこそ!

前回はコンパイラさんのやってくれるswitch展開の妙技をobjdumpで眺めました。最適化オプションをつけていったらまたどんどん色々なことしてくわけですけどそれはYARV Maniacsとは逸れていくので割愛。コンパイラにできない最適化、スレッデッドコードをしてやります。

続きを読む

July 04(Fri), 2008

[] Rubyist Magazine - YARV Maniacs 【第 2 回】 VM ってなんだろうのVMをCで

ruby1.9のソース読もうかなーと思ったのでまずYARV Maniacsなど読んでます。で第二回のvmをc書いてみました。エラー処理とかはまったくしていません。

続きを読む

最近のコメント