持ってるMacBookの型番:MB466J/A
MacBook 2.0GHz Core 2 Duo/13.3"/2G/160G/8xSuperDrive DL/Gigabit/802.11n/BT/Mini DisplayPort
持ってるMacBookの型番:MB466J/A
MacBook 2.0GHz Core 2 Duo/13.3"/2G/160G/8xSuperDrive DL/Gigabit/802.11n/BT/Mini DisplayPort
VirtualBoxをいちいち立ち上げるのが面倒なので、windowsのservice + coLinuxみたいに自動起動がしたい。
それには今まで避けてきたlaunchdを使わなくてはいけない。
Mac OS X 10.4(Tiger)から標準になったlaunchdは要はinit + inetd + daemontoolと理解。システム起動時にroot権限で動くLaunchDaemonsとログインしたときにユーザー毎に動くLaunchAgentsがあるそうです。(厳密には少し違うけど)
それぞれ指定のディレクトリにplist(プロパティリスト)というXMLの設定ファイルを作って、launchctlでloadするという流れ。
VirtualBoxはCUIでもVBoxManageコマンドでほとんどの操作が出来るのでLaunchAgentsで、
% VBoxManage startvm "仮想マシン名" --type headless
が動くようにしてやれば良いハズ。
~/Library/LaunchAgents/org.komagata.balloon.virtualbox-debian.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.komagata.balloon.virtualbox-debian</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/VBoxManage</string>
<string>startvm</string>
<string>debian</string>
<string>--type</string>
<string>headless</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
基本、ProgramArgumentsにargvを渡すだけみたいです。
% launchctl load ~/Library/LaunchAgents/org.komagata.balloon.virtualbox-debian.plist
これで設定が読み込まれたので再起動してみる。
すると立ち上がってはいるけど何故か"中断"の状態。
OnDemandをfalseにすると立ち上がるが、監視して終了しても自動的に起動する状態になるので、固定でメモリを確保するVirtualBoxでは気軽に落としたりしたいのでちょっと面倒。メモリが2Gなので増設すれば256MBぐらい気にならなくなるかな?
参照:Undocumented Mac OS X:第1回 initを置き換えるlaunchd【前編】 (1/3) - ITmedia エンタープライズ
$ gcc -v
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.3.2-1.1' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --enable-cld --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
Thread model: posix
gcc version 4.3.2 (Debian 4.3.2-1.1)
helloworld.s
.code32
.text
.global main
main:
movl $4, %eax
movl $1, %ebx
movl $msg,%ecx
movl $len,%edx
int $0x80
movl $1, %eax
int $0x80
.data
msg: .asciz "Hello, world!\n"
msgend: len = msgend - msg
$ as -o helloworld.o helloworld.s
$ ld -Ttext 0x0 -e main -o helloworld helloworld.o
$ ./helloworld
Hello, world!
% gcc -v
Using built-in specs.
Target: i686-apple-darwin10
Configured with: /var/tmp/gcc/gcc-5646.1~2/src/configure --disable-checking --enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --with-gxx-include-dir=/include/c++/4.2.1 --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10
Thread model: posix
gcc version 4.2.1 (Apple Inc. build 5646) (dot 1)
% as -a=helloworld.lst -o helloworld.o helloworld.s
FATAL:/usr/bin/../libexec/gcc/darwin/x86_64/as: I don't understand 'a' flag!
-aオプションは無い。
% as -o helloworld.o helloworld.s
helloworld.s:3:Unknown pseudo-op: .global
helloworld.s:3:Rest of line ignored. 1st junk character valued 109 (m).
.globalはだめ.globl。
% ld -Ttext 0x0 -e main -o helloworld helloworld.o
ld: unknown option: -Ttext
-Tオプションは無い。
% ld -e main -o helloworld helloworld.o
% ./helloworld
zsh: illegal hardware instruction ./helloworld
そもそもMac OS Xのldはbinutilsのldじゃないそうです。勉強はlinux上で進めていくことにします・・・。
参照
p0t.jpのドメインを失って暫く。
売ってもらったりできるのかなと思って調べてみると、
% whois p0t.jp | nkf -u
[ JPRS database provides information on network administration. Its use is ]
[ restricted to network administration purposes. For further information, ]
[ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e' ]
[ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'. ]
Domain Information: [ドメイン情報]
[Domain Name] P0T.JP
[登録者名] エヌエムケーケー
[Registrant] N.M.K.K
[Name Server] dns1.name-hosting.net
[Name Server] dns2.name-hosting.net
[登録年月日] 2009/07/01
[有効期限] 2010/07/31
[状態] Active
[最終更新] 2009/07/01 01:15:02 (JST)
Contact Information: [公開連絡窓口]
[名前] エヌエムケーケー
[Name] N.M.K.K
[Email] info@namemarket.jp
[Web Page]
[郵便番号] 150-0031
[住所] 東京都渋谷区
桜丘町20-1
[Postal Address] Shibuya-ku
20-1 Sakuragaoka-cho
[電話番号] 03-5456-5167
[FAX番号]
N.M.K.Kでググッたところ取り戻すのは難しそう。YHVHみたいで何か怖いですね。関わらない方がいいのかな・・・。

還暦プログラマの挑戦(Haskell に挑む→F#による言語造り)なにが、私を、そうさせたか。
還暦直前のプログラマです。
(厳密に言いますと、2008年1月1日、戊子(つちのえね)で還暦ということです。
2008年4月某日で60歳になりました)
最近引退したので、元プログラマというべきでしょうか。
還暦をマジかに控え、400時間、500時間労働はこたえました。おかげで、10Kg以上もやせて、メタボリックなんとやらは心配なくなったみたいな。
時間ができたらやりたいと思っていた事が2つありました。こんなおり、どこかで読んだのを、ちょいと思い出してしまったのが、かの「Haskell」です。
- 言語を作る。(CMLと名前だけ決まっています)
- OSを作る。(CMosと、名前だけ決まっています)
なんとかいう天才プログラマが、数ヶ月でHaskellを学び、また数ヶ月でPerlのV6を作っちゃったとか。
刺激的な話題ですよね。
で、めづらしいもの好きのオヤジとしては、つい環境を作っちゃって、お勉強をはじめたわけです。
「還暦の手習い」です。
この方の様な生活にとても憧れます。
とりたてて"天才"でも"スーパーハッカー"でもなくてもプログラムが好きで書き続けていれば還暦を迎えられ、その後に自分の楽しみのプログラムを書いて暮らせる老後生活が送れる。
我々にそういう希望を持たせてくれます。とても素敵なロールモデル。
内容もとても好きです。
地道な勉強やコーディングの合間にある発見や手応え。分からないことにも正面からスーっと入っていく自然体が素敵です。
常日頃、3億円あったらディアスポラのヤチマのように真理鉱山に引き篭って死ぬまで暮らしたいと思っていますが、既に体現されている方がいるとは羨ましい限りです。
![]() |
|
昨日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
キター!
![]() |
|
基礎と16bit CPUを知るために。
![]() |
|
32bit CPUを知るために。
![]() |
|
gasの文法を知るために。
用途によって色んな言語が必要になり勉強してきたんですが、どうも基礎が分かってないので常に習うより慣れろ方式で、毎度繰り返しているうちに効率が悪い気がしてきました。
基礎、要はx86アセンブラで簡単な言語を実装してみれば今後、言語習得も楽なんじゃないかなと思いました。
しかし、業界で10年"作らなければいけない物があり、それに必要な技術をとにかく死に物狂いで覚える"ということを繰り返してきた結果、"作るべき物が無いと何も覚えられない"という体になってしまっていました。
おそらく、"作るべき物"に参照されない情報は寝ている間に僕の"優秀な"GCが回収してしまうようです・・・。 (一番忘れたい、ドラゴンクエストモンスターズに出てきた「"ボミエ"の呪文=敵一人の素早さを下げる」は何故かずっと回収してくれません。)
そこでquekさんに、
「何か簡単な作るべきもの無いですかね」
的なことを聞くと、Forthの処理系でjonesforthというのがコメントが豊富でシンプルなアセンブラで書かれていて分かりやすいということを教えてもらいました。(64bit対応にするのはどうか、とのこと)
もちろんx86アセンブラもForthもさっぱり分かりませんがとりあえず本を買って始めてみました。とりあえず、年明けにjonesforthを何かに移植するという目標でやってみたいと思います。
(本来、8086は専門学校で習ったハズなんですが、僕の優秀な(略・・・)
$ 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
便利だわぁ。こんな簡単なら早く使えばよかった・・・。