上京

ついにきました。関東です。これで勉強会なんかにも・・・まぁいかないだろうなあ。

しかしいやはや、なかなか苦労しました。まぁ古いしいいか、と思ってデスクトップを運送会社を使って送ったんですけど(もちろんパソコン用のパックで)、届いたら、見事に起動せず。ファンは回るけどBIOSは出ない、という。運送会社に問い合わせたら、自作なのでどうしたらいいのかわからない、とのこと。アキバまでパーツを買いにいって自分で直す羽目になりました。やっぱりPCは自分ではこんだほうがいい気がする。

苦労はしたけど、その分(?)自分への就職祝いとしてディスプレイを24型、1920x1200のものにしました。いやー一枚でもかなり広い。ウインドウを2個並べれば十分やりやすい。これでプログラミングの効率がアップ・・・するはず。

はじめての一人暮らしなので、生活環境を整えることで忙しい感じです。そろそろ触っとかなきゃまずいな、と思ってこっちくる直前までCSA(compressed suffix array)をPythonで実装してたんですけど、まだまだ再開できそうにありません。せっかくなので普通にsuffix arrayを経由する方法じゃない方法で実装しています。数年前のそこらへんの論文を読み漁っていたら、ちょうど日本語みたいなアルファベットが多い場合でも構成しやすい方法が書いてある論文があったので、そこらへんを参考にしています。仕事が始まる4月までに出来たら良いなあと思ってたりします。

07.27.08/12am

謹賀新年&近況

2007年になりましたね。月に1回更新するか怪しいこのブログを購読してくださってる方々、ありがとうございます(笑

無事卒論も提出し、気楽な学生気分を満喫しています。ちなみに、卒論は完璧にコンピュータは関係ないもので、まぁラットと戯れていました。生物、こと脳にかかわる話も面白いですよ。まったくもって大した研究ではないのですが、教授が今年ヨーロッパの学会で発表してくださるらしいです。とりあえず書けて何より。

さて、プログラミング関連ですが、卒論もようやく終わり4月までは暇な学生生活、まとまった時間がとれるようになったので、ちょろちょろ書き始めています。

書いているのは・・・なんと今更NESエミュレータ。

一から自分で解析してエミュレータを書くのは達人ワザですが、十分なハードウェアの情報がある場合、実はそんなに難しくなかったりします。

というわけで書いているんですが、ここで普通にC言語やアセンブラで書こうというような楽?はしてません!NESエミュレータをPythonで書いてみる、これがチャレンジング。ぶっちゃけPythonで速度がシビアに求められるものを書いたことがないので、チャレンジです。

書く上で、とりあえず

  • ctypesは使わない(Cの流儀をそのままもっていってもおもしろくない)
  • 当然Cで拡張モジュールは書かない

というポリシーで書き進めています。

しかしやっぱりキツイ。絶対Cの方が楽な気がするのは気のせいだろうか・・・。現在はだいたいCPU(6502)のコアが書き終わったので、メモリ周りを書き進めてます。とりあえず.NESファイルから読み込んでメモリに読み込み、PCをセットするあたりまで書きました。

まず、NESのヘッダ読み込むのもめんどくさい。Cならfreadで構造体にマップしておわり、なのにPythonだとそうは行かない。そしてなんといってもポインタがない。これ。メモリのミラーリングとかめんどくさいだろうな・・・(笑

そうこう書いてるうちに、Pythonでのバイナリの扱いが上手くなってきました(きたような気がします)。

今のところ以下のような関数が活躍しています。エディアンは今のところ決めうちです。

python code
  1. from struct import *
  2. from array import array
  3.  
  4. def unpack_byte(b):
  5.   return unpack("<B", b)[0]
  6.  
  7. def zero_filled(n):
  8.   n /= 2
  9.   return pack('h'*n, *([0]*n))
  10.  
  11. def byte_array(v):
  12.   return array('c', v)
  13.  
  14. class byte_ref(object):
  15.   def __init__(self, p):
  16.     self._value = p
  17.   def get_value(self):
  18.     return self._value
  19.   def set_value(self, v):
  20.     self.value[0:] = byte_array(v)
  21.   value = property(get_value, set_value)
  22.  

まず、PythonでRAMをエミュレートしようと思うと、可変なunsigned charな配列が当然必要です。

Pythonでdata = open("name", "rb").read()とした場合、きちんとバイナリデータがdataに入って、unpack_byte(data[0:1])などとするとちゃんとデータを取り出せます。

しかし、この場合、Pythonの内部では不変な型である文字列型として扱われているのでdata[w_addr & 0x7ff] = 0x12みたいなことは出来ません。つまりROMにはなりますが、RAMになれません。じゃあどうやってunsigned charの配列を表現するか、ということでarrayモジュールの登場なわけです。data = byte_array(open("name", "rb").read())という感じで使っています。生成方法がことなるだけでdata[0]みたいなインデックスによるアクセスも出来るし、部分書き換えも可能です。

byte_refは・・・別になくてもいいかもしれませんが、byte配列に対する参照を表現するオブジェクトです。といっても注意して使わないと意味がないクラスで気持ちの問題かもしれません。

ここをctypesでポインタを使えば考えなくてもよかったんですが、あえてPythonなんだ、ということで(笑

近況はこんな感じです。

ついに就職が近づいてきました。仕事はプログラマではないので、プログラムを書く時間はあんまり取れないかもしれません。でもまぁ、日曜プログラマとして細々やっていけたらなあ、と思っています。

07.27.08/12am

About

Author:yuin(http://inforno.net/)

文学部文化学科卒という生粋の文系趣味プログラマ。

主にRuby、Javascript、PHP、JAVA,Python,C,Scala,Schemeなどを使っています。今はPythonな感じかもしれない。今後作曲活動なども復活するかもしれない。

Pages