Practical Common Lisp

NDA のため詳しくは書けませんが、最近 iPhone SDK に挑戦しています。まだ資料を読んでいるだけの段階ですが!何か作れたらいいなと思っています。

話は変わりますが、LISP 関連の書籍は今までに

入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算

入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算

On Lisp

On Lisp

の2冊購入しています。On Lisp は私にとっては難しすぎて、途中で読むのをやめてしまいました。基本的なところは 入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算 で勉強したのですが、もう少し詳しい書籍が必要だと思っていました。しかし、Amazon で日本語の書籍を探してみたのですが、よさそうなものが見当たりません。最近、Appleの英語の資料を読み始め、英単語については、拙作 Wordbook2*1 で勉強しているので、洋書を読んでみようと思い立ちました。

それで

Practical Common Lisp (Books for Professionals by Professionals)

Practical Common Lisp (Books for Professionals by Professionals)

を買ってみました。購入して正解でした。

本当に丁寧に説明してあります。Optional Parameter (&optional)、Rest Parameter(&rest)、Keyword Parameter(&key) についての説明もあります。

実行環境は [id:KYoshiaki:20070225] と同じく Carbon Emacs を用いました。今回は Emacs Lisp (Elisp) ではなく Common Lisp を使う必要があります。それで書籍に紹介されている sbcl、SLIME を利用することにしました。

Leopard 以前は Fink を利用していたのですが、これを機会に MacPorts に変更することにしました。

The MacPorts Project -- Home
http://www.macports.org/
MacWiki - MacPorts
http://macwiki.sourceforge.jp/wiki/index.php/MacPorts

を参考に設定した後、パッケージ sbcl をコマンド

~ $ sudo port install sbcl

を使ってインストールしました。

また Carbon Emacs に表示されている SHA-1 の確認のために

~ $ sudo port install coreutils

を使ってパッケージ coreutils をインストールしました。
このパッケージには md5、md5sum、sha1sum などのコマンドが含まれています。ただし接頭語として g が追加されています。(gmd5、gmd5sum、gsha1sum というコマンド名になります。)

port コマンドに次の引数を渡すと、どのパッケージに含まれているか確認できます。

~ $ port provides /opt/local/bin/gsha1sum
/opt/local/bin/gsha1sum is provided by: coreutils

そして

Carbon Emacs パッケージ
http://homepage.mac.com/zenitani/emacs-j.html
Emacs をダウンロード (2008年春版; 40.8 MB)
SHA1: be4d67c6d44d937a7525fc3a8a739c443021ae29

からダウンロードしたファイル CarbonEmacs-Tiger-20080405.dmgSHA-1 を gsha1sum コマンドで求めると

~/Downloads $ gsha1sum CarbonEmacs-Tiger-20080405.dmg
be4d67c6d44d937a7525fc3a8a739c443021ae29  CarbonEmacs-Tiger-20080405.dmg

と表示されます。 私は SHA-1 が等しいか判断するためにスクリプト compare.sh

 $ cat ./compare.sh
#!/bin/sh
MD1="$1"
MD2="$2"
if [ $MD1 = $MD2 ] ; then
echo "match"
else
echo "failure"

を使っています。基本的にUnix についての知識は乏しいので、もっと良い方法があるかもしれません。

ただ単純に

Carbon Emacs パッケージ
http://homepage.mac.com/zenitani/emacs-j.html
Emacs をダウンロード (2008年春版; 40.8 MB)
SHA1: be4d67c6d44d937a7525fc3a8a739c443021ae29

に表示されている SHA-1 と gsha1sum で求めた SHA-1 をコピーして、コマンド compare.sh の引数として渡し

~ $ ./compare.sh be4d67c6d44d937a7525fc3a8a739c443021ae29  be4d67c6d44d937a7525fc3a8a739c443021ae29
match
~ $ 

match と表示されれば成功です。

SLIME については

SLIME: The Superior Lisp Interaction Mode for Emacs
http://common-lisp.net/project/slime/

から slime-2.0.zip をダウンロードしました。ファイル slime-2.0.zip を展開して作成された “slime-2.0” フォルダをホームフォルダに移動し、同封の ReadMe を参考に .emacs ファイルを

 (add-to-list 'load-path "~/slime-2.0/")  ; your SLIME directory
(setq inferior-lisp-program "/opt/local/bin/sbcl") ; your Lisp system
(require 'slime)
(slime-setup)

と設定しました。

Carbon Emacs 上で `M-x’ slime ( ESC-x slime ) と入力すると SLIME が起動します。
カーソルをファイル内の評価したい式に移動し C-c C-c と押せば実行できます。

現在、

Practical Common Lisp (Books for Professionals by Professionals)
Peter Seibel 著
CHAPTER 7 MACROS: STANDARD CONTROL CONSTRUCTS
DO

を読んでいる途中です、[id:KYoshiaki:20070225] で書いたフィボナッチ数列

F_{n}=\left\{{1 \text{ \(n=1, 2\)}\atop{F_{n-1} + F_{n-2} \text{ \(n\geq 3\)}}}\right.

もでてきます。

Practical Common Lisp (Books for Professionals by Professionals) の例

(do ((n 0 (1+ n))
(cur 0 next)
(next 1 (+ cur next)))
((= n 10) cur))

入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算 の例

(defun fib (n)
(cond ((= n 1) 1)
((= n 2) 1)
(t (+ (fib (- n 1)) (fib (- n 2)))))) 

動作を説明しやすいように n = 5

(do ((n 0 (1+ n))
(cur 0 next)
(next 1 (+ cur next)))
((= n 5)
(format t "~%~d" cur)))

とします。

実行結果は

5
CL-USER> 

となります。入門Common Lisp の fib を使っても

CL-USER> (fib 5)
5

と同じ値になります。

変数の移り変わりを表で表すと

n cur next
0 0 1
1 1 1
2 1 2
3 2 3
4 3 5
5 5 8
n cur next
0 F_{0} F_{1}
1 F_{1} F_{2}
2 F_{2} F_{3}
3 F_{3} F_{4}
4 F_{4} F_{5}
5 F_{5} F_{6}

ただし F_{0} = 0 とする。

になります。

また、CHAPTER 7 の最後に出てくるフィボナッチ数列を求める関数の動作も表にしてみました。
CHAPTER 22 を読んで LOOP についてだいたい理解しましたが、finally の挙動については自信がありません。

(format t "~%~d"
(loop for i below 5
and a = 0 then b
and b = 1 then (+ b a)
finally (return a)))
i a b
0 0 1
1 1 1
2 1 2
3 2 3
4 3 5
finally 5 5 8

実行結果

5
CL-USER> 

特に for と and の違いを理解するにに苦労しました。

(loop for var = initial-value-form [ then step-form ]  ...)

for を利用する場合

(format t "~%~a"
(loop for i below 5
for x = 0 then y
for y = 1 then (+ x y)
collect y))
i x y
0 0 1
1 1 2
2 2 4
3 4 8
4 8 16

実行結果

(1 2 4 8 16)
CL-USER> 

and を利用する場合

(format t "~%~a"
(loop for i below 5
and x = 0 then y
and y = 1 then (+ x y)
collect y))
i x y
0 0 1
1 1 1
2 1 2
3 2 3
4 3 5

実行結果

(1 1 2 3 5)
CL-USER> 

*1:Wordbook2: まだ公開していません。取扱説明書を作成中です。

Intel iMac (24インチ 2.4Ghz 2GBメモリ)

ブログの更新が随分遅れましたが、Leopardプレインストールされた Intel iMacを待ちきれず、2007/11/07(Wed) に Intel iMac (24インチ 2.4Ghz 2GBメモリ) をアップルストアで注文しました。

2007/11/14(Wed) に到着しました。

1. インストール

付属の ‘Mac OS X Leopard インストール DVD’ で ‘消去してからインストール’ を選び、Leopard をインストールした後、’Mac OS X Tiger インストール DVD’ から ‘Install Bundled Software Only.mpkg’ をダブルクリックして iLife をインストールしました。

2. Time Machine

Time Machine 用に Amazon で ‘IO-DATA の FireWire 400 対応ハードディスク’ を購入しました。

このハードディスクは、電源のスイッチを auto にすると、iMac の電源を ON/OFFするだけで、自動的にハードディスクの電源の入力が切り替わります。大変便利です。ハードディスクの書き込む時にガリガリ鳴る音が心配ですが!

ハードディスクは、’Mac OS 拡張 (ジャーナリング) ‘ でフォーマットし直しました。

3. アプリケーション

EGWORD 14 は egword Universal 2 にバ−ジョンアップし、『パワーアップキット for Leopard』を適用しました。

普段利用しているアプリケーション

mi、Firefox英辞郎ビューア

は何の問題もなく動作しました。

4. 自作アプリケーション

自作のアプリケーションで普段利用している

YKBookmarks、OpenURLHatenaRSS、YKCalendar、StripToString、HatenaDiaryAssistance、PocketLauncher、Shogiban2、2chScriptMenu、Search2chBBS

Universal Binary なので、問題がありませんでした。

YKClock、YKEyes、YKExplorer、IndexView2、DateMaker、LooseLeaf

PowerPC 版ですが動作には問題がありませんでした。

NSService、Wordbook.mdimporter は動作しませんでした。

5. Universal Binary

Mac OS X Leopard インストール DVD’にある XcodeTools.mpkg をダブルクリックして Xcode 3.0 Developer Tools インストールし、Xcode 3.0 を利用して、上記の PowerPC 版アプリケーションを Universal Binary に作り直しました。

XcodeUniversal Binary 化するには、プロジェクトを開いてから、メニュー ‘プロジェクト/すべてのターゲットをネイティブにアップグレード’ を選択しないとUniversal Binary 化できないようです。

Xcode 2.0 User Guide (Legacy): Converting a Project Builder Target
http://developer.apple.com/documentation/DeveloperTools/Conceptual/XcodeUserGuide20/Contents/Resources/en.lproj/bs_targets/chapter_29_section_7.html

簡単に Universal Binary 化を説明します。 (私が公開してるフリーウェアを Universal Binary 化する場合)

a) 設定

プロジェクト名をクリックして、 Option キーを押したまま メニュー ‘ファイル/情報を見る(インスペクタ)’ を表示

‘一般’ タブを選択
‘ターゲット SDK を使用したクロス開発’ で ‘Mac OS X 10.4 (Universal)’ を選択

‘ビルド’ タブを選択

構成メニューで ‘Deployment’ を選択

テーブルから ‘アーキテクチャ‘ をクリックして選択、Tab キーを押すと ‘値’ を編集できるようになります。$(NATIVE_ARCH) と表示されますが ppc i386 と入力して変更してください。

Xcode 3.0 Release Notes
http://developer.apple.com/releasenotes/DeveloperTools/RN-Xcode/index.html
Summary of New Features
Build System Improvements
New Architectures sheet for 32- and 64-bit building

に詳しく解説されています。

b) ビルド

メニュー ‘プロジェクト/アクティブなビルド構成を設定/Deployment’ を選択し、メニュー ‘ビルド/ビルドと実行’ で Universal Binary 化できます。

Universal Binary 化するとPowerPC 版でも動作した YKClock、YKEyes、YKExplorer、IndexView2、DateMaker、LooseLeaf はもちろん問題がありませんでした。

PowerPC 版では動作しなかった NSService を Universal Binary 化すると動作するようになりました。

7. Wordbook.mdimporter

Wordbook.mdimporter は Universal Binary 化しても、正しく機能しません。

Wordbook.mdimporter 内で定義した ‘拡張子が ywrd のファイルの UTI をjp.koyama.Wordbook.ywrd とする宣言’ をシステムが認識していないのが原因のようです。何とかならないか試行錯誤している段階です。

それと、ほとんど利用している人もいないと思うので、上記の Universal Binary 化したアプリケーションを公開したほうが良いか悩んでいます。

8. Xcode のメニュー英語化

後、Xcode のメニューを英語に変更したい場合は Finder 上で Xcode をクリックして選択し、右クリック (Control + 左クリック) で ‘情報を見る’ を選び、言語の ‘日本語’ のチェックを外してください。

9. xshogi.app

xshogi.app もUniversal Binary 化には成功しました。動作には問題がないのですが、完全に Leopard に対応できていません。

10. 2ch Script version 0.2

また、拙作 2ch Script version 0.2 も問題なく動作するのですが、デフォルトではターミナルに表示される文字が汚いと思います。

フォントを’Monaco 11 pt.’ に指定し、’テキストをアンチエイリアス処理’ にチェックを入れてください。

11. VMware Fusionバージョン 1.1

Intel iMac を手に入れたらぜひ試したかった ‘VMware Fusionバージョン 1.1′ を

Buy VMware Fusion, VMware Workstation and More Virtualization Products - VMware
http://www.vmware.com/vmwarestore/

で購入しました。値段は 9,003円 (VMware Inc. 現地通貨金額 79.99 USドル) でした。

Windows XP を利用したかったので Amazon で

Microsoft Windows XP Professional Service Pack 2 通常版

Microsoft Windows XP Professional Service Pack 2 通常版

を購入し

Kaspersky Internet Security 7.0 優待版

Just MyShop − ジャストシステム直営ECサイトhttps://www.justmyshop.com/app/mypage/doc/index.html?w=cojp_wtp01

で購入しました。

すべて VMware 上で正常に動作しています。詳細は次回に書きたいと思います。画像を添付して置きます。

Chessmaster 9000

たまに米国のアップルサイトを覗きます。たまたまダウンロードサイトに、Chessmaster 9000 の紹介記事 (下記 URL) を見つけました。

Apple - Downloads - Chessmaster 9000 - Demos & Updates
http://www.apple.com/downloads/macosx/games/demos_updates/chessmaster9000.html

チェスについては駒の動きとルールぐらいしか知りませんが、以前から興味を持っていました。書籍も何冊か購入したことがあります。

また Chessmaster シリーズは初心者にとってもチュートリアルが充実しているという噂を聞いています。

Universal Binary ではありませんし、英語版ですが、ぜひ欲しくなりました。米国アップルストアでは販売しているようですが、日本への発送には対応していないようです。日本のアップルストアでは残念ながら発売していません。

それで直接会社のホームページにアクセスしてみると

Feral Interactive
http://www.feralinteractive.com/?language=japanese
Feral Interactive : Chessmaster 9000
http://www.feralinteractive.com/?game=chessmaster9k

日本語表示にも対応しています。販売もしているようです。それで Chessmaster 9000 を注文してみました。

値段は 6000 円です。クレジットカードは Visa、Master に対応しているようです。

発送のメールの後、5日後に AIR MAIL で届きました。

DVD には、英語版とフランス語版のフォルダがあるみたいなので、英語版のフォルダをアプリケーションフォルダにコピーしました。後はマニュアル通りです。

残念なのが、コピープロテクトのためか、Chessmaster 9000 を起動するたびに Chessmaster 9000 の DVD をドライブに挿入する必要があります。

プレイヤーを作成、ログインし、CLASSROM の Classroom Curriculum / Beginning / Your First Chess Lesson を試してみました。本当に親切に解説してあります。もちろん英語ですが、そんなに難しい単語もないと思います。辞書で調べれば理解できるはずです。

ただ Quiz の解答で駒を連続して動かすときに、Good. Keep going. と Chessmaster 9000 が発音している間に、駒を動かすとクラッシュしました。Good. Keep going. と発音された後、カーソルが手の形に変わってから、駒を動かす必要があるようです。

GAME ROOM で Rating の低いコンピュータプレイヤーと対戦してみました。勝利しましたが、私が弱すぎます。

将棋も初心者並みで、xshogi でちょうどいいのですが、Mac OS X 付属のチェスソフトに、勝てるぐらいにはなりたいですね!道のりは長そうですが!