クリスマスの和菓子屋

和菓子屋「にーちゃん、なに見てくさって屁ぇこいてんねん」

昨日8086と486の本を読んで(とても面白かったので一気に読んでしまいました)x86_64の一般命令とレジスタをちょろっと見たのでjonesforthが何となく読めるようになりました。(コメント内にgasのシンタックスの説明すらちょっと書いてあってとても親切)

(OSやドライバを書くのが目的ではないでシステム系の難しい機能は飛ばしました。)

そこでまずforthが分からないとしょうがないのでgforth(gnuのforth実装)を入れてみることに。

$ sudo port install gforth
(...)
/usr/bin/gcc-4.2 -I./../arch/386 -I. -Wall -O2 -arch x86_64 -fomit-frame-pointer -fforce-addr -no-cpp-precomp -DHAVE_CONFIG_H -DDEFAULTPATH='".:/opt/local
/lib/gforth/site-forth:/opt/local/share/gforth/site-forth:/opt/local/lib/gforth/0.7.0:/opt/local/share/gforth/0.7.0"' -I/opt/local/include -fno-gcse -fno-s
trict-aliasing -fno-crossjumping -fno-reorder-blocks -falign-labels=1 -falign-loops=1 -falign-jumps=1 -fno-defer-pop -fcaller-saves -fno-inline -DGFORTH_DEB
UGGING -DENGINE=2 -o engine2-noll.o -c ./engine.c
/var/tmp//cc6XyjEK.s:1482:Incorrect register `%r13' used with `l' suffix
/var/tmp//cc6XyjEK.s:1525:Incorrect register `%rbx' used with `l' suffix
/var/tmp//cc6XyjEK.s:1587:Incorrect register `%rbx' used with `l' suffix

が、エラー。rbxレジスタが使えないというのは何となく64bit対応部分がおかしいのかなと予想。

building gforth on Mac OS X Snow Leopard (10.6.x) - comp.lang.forth | Google グループ

The error does not occur in 64-bit mode, with an updated version
of Anton's configure line:

./configure x86_64-apple-darwin10.2.0

Targetをちゃんと指定しないと駄目みたいです。

$ ./configure CC="gcc -m32"

でも行けるっぽいですが、せっかくのCPUなので前者で入るようにportfileに下記を追加。

$ sudo port edit gforth
(...)
configure.args x86_64-apple-darwin10.2.0
(...)

今度はちゃんと入りました。

% gforth
Gforth 0.7.0, Copyright (C) 1995-2008 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
1 2 + . 3 ok
bye

キター!

参照:MacPorts Guide

はじめて読む8086―16ビット・コンピュータをやさしく語る (アスキーブックス)

基礎と16bit CPUを知るために。

はじめて読む486―32ビットコンピュータをやさしく語る

32bit CPUを知るために。

x86アセンブラ入門―PC/ATなどで使われている80x86のアセンブラを習得 (TECHI―Processor)

gasの文法を知るために。

用途によって色んな言語が必要になり勉強してきたんですが、どうも基礎が分かってないので常に習うより慣れろ方式で、毎度繰り返しているうちに効率が悪い気がしてきました。

基礎、要はx86アセンブラで簡単な言語を実装してみれば今後、言語習得も楽なんじゃないかなと思いました。

しかし、業界で10年"作らなければいけない物があり、それに必要な技術をとにかく死に物狂いで覚える"ということを繰り返してきた結果、"作るべき物が無いと何も覚えられない"という体になってしまっていました。

おそらく、"作るべき物"に参照されない情報は寝ている間に僕の"優秀な"GCが回収してしまうようです・・・。 (一番忘れたい、ドラゴンクエストモンスターズに出てきた「"ボミエ"の呪文=敵一人の素早さを下げる」は何故かずっと回収してくれません。)

そこでquekさんに、

「何か簡単な作るべきもの無いですかね」

的なことを聞くと、Forthの処理系でjonesforthというのがコメントが豊富でシンプルなアセンブラで書かれていて分かりやすいということを教えてもらいました。(64bit対応にするのはどうか、とのこと)

もちろんx86アセンブラもForthもさっぱり分かりませんがとりあえず本を買って始めてみました。とりあえず、年明けにjonesforthを何かに移植するという目標でやってみたいと思います。
(本来、8086は専門学校で習ったハズなんですが、僕の優秀な(略・・・)

Debianでapache2落ちたら再起動

$ sudo apt-get install monit
Starting daemon monitor: monit won't be started/stopped
unless it it's configured
please configure monit and then edit /etc/default/monit
and set the "startup" variable to 1 in order to allow
monit to start

Debianでは/etc/default/monitを編集しないと起動しないみたい。

$ sudo vi /etc/monit/monitrc
set daemon 120
set logfile syslog facility log_daemon
set mailserver localhost
set mail-format { from: monit@kmsebisu.com }
set alert dev@actindi.net
check process apache with pidfile /var/run/apache2.pid
start program = "/etc/init.d/apache2 start"
stop program = "/etc/init.d/apache2 stop"
if failed host localhost port 80
protocol HTTP request / then restart
group www-data

便利だわぁ。こんな簡単なら早く使えばよかった・・・。

いつからあるのか分からないけどrake notesでTODOとかFIXMEが見れるらしいので手元のプロジェクトで行ってみた。

% rake notes
(in /Users/komagata/Sites/outing)
app/models/facility.rb:
* [ 52] [TODO] もっとメタな書き方がしたい
* [ 57] [TODO] ハッシュにしたいが、今のとこ,はエラーが出る
* [ 68] [TODO] ハッシュにしたいが、今のところはエラーが出る
* [114] [TODO] リファクタリング
% rake notes
(in /Users/komagata/Sites/tsuisumi)
app/helpers/cemeteries_helper.rb:
* [ 5] [FIXME] クラス変数が共有できないのでメソッドで対処

app/helpers/stone_shops_helper.rb:
* [ 16] [FIXME]

lib/romkan.rb:
* [221] [FIXME] ad hod solution

生々しい。面白いので僕ももっとコメント書いていこうと思いました。

__init__と__call__ってどう違うのかなと思ったけどわかった。

class Foo:
def __init__(self):
print 'init'

def __call__(self):
print 'call'

Foo()()
init
call

__init__はクラスがインスタンス化される時に呼ばれて、__call__はインスタンスが呼ばれた時に動くんですね。

この間書いた、RubyのFoo()とか使ってると混乱するわ!

関連:Ruby - クラス名と同名の関数にデフォルト動作をさせるパターン - p0t

GAEのgoogle.appengine.ext.webapp.WSGIApplicationはRailsでおなじみの_methodパラメータによるメソッドエミュレーションをやってくれないのでREST厨涙目ということで、そこだけのMiddlewareを書いてみました。

import webob

class MethodEmulator(object):
def __init__(self, application):
self.application = application

def __call__(self, environ, start_response):
req = webob.Request(environ)
if req.params.has_key('_method'):
method = req.params['_method'].upper()
if method in ['PUT', 'DELETE']:
environ['REQUEST_METHOD'] = method
return self.application(environ, start_response)

HEAD, OPTIONS, TRACEやWEBDAVのメソッドも何か怖いので無し。

application = WSGIApplication([('/', MainHandler)])
run_wsgi_app(MethodEmulator(application))

こんな感じで被せて使う。

Rackだとuse MethodEmulatorって感じだったけどRuby始めたばっかりで、

「useなんて予約語無いじゃないか!」

とか迷ったので明示的なのも分かりやすくて良いですね。

REE

$ wget https://packages.endpoint.com/endpoint-rpmsign.pub
$ sudo rpm --import endpoint-rpmsign.pub
$ sudo yum remove ruby*
$ wget https://packages.endpoint.com/rhel/5/os/i386/ruby-enterprise-1.8.7-2.ep.i386.rpm
$ wget https://packages.endpoint.com/rhel/5/os/i386/ruby-enterprise-rubygems-1.3.5-2.ep.i386.rpm
$ sudo rpm -ivh ruby-enterprise-1.8.7-2.ep.i386.rpm
$ sudo rpm -ivh ruby-enterprise-rubygems-1.3.5-2.ep.i386.rpm

RMagick

$ wget http://ftp.kddlabs.co.jp/graphics/ImageMagick/ImageMagick-6.5.8-6.tar.gz
$ tar zxf ImageMagick-6.5.8-6.tar.gz
$ cd ImageMagick-6.5.8-6
$ ./configure --prefix=/usr
$ make
$ sudo make install
$ sudo gem install rmagick
天地創造

何時の間にやらMacでのSnes9xが動くようになってるらしく、無線コントローラーのLogicool Cordless Rumblepad 2と合わせるととても快適。

俺のようなどうせ最新ハードでもレトロゲームやその復刻版か続編しか食手が伸びないおっさんにとってはこういう方が楽しいかも。

Snes9xはC++だそうですが、MacのIntel化の恩恵は少なくなさそうです。

ロジクール Cordless Rumblepad 2(ブラック) GPW-600