2009年12月8日火曜日

XEmacs package system

XEmacs、ほぼ初めていじったといってよいのですが、このpackage systemは結構ちゃんとしていてびっくりです。依存関係管理を装備すれば、完備かと。

うーん。GNU Emacsにもこういうものが欲しい。。。


* XEmacs package system
- パッケージの置き場所
- パッケージの置き場所は、file system上のpathで
系統づけている。その系統を'パッケージ階層'と呼
ぶ。デフォルトでは3つの系統がある。
- startupの際に、パッケージ階層をXEmacsは見るこ
とができる。load-pathにする、ということではな
いようだ。M-x describe-installationでpackage
pathの値をみることができる。
- パッケージ階層 (package hierarchies)
- Local and 3rd party packages go here:
- $prefix/lib/xemacs/site-packages
- Only searched by MULE-enabled XEmacsen:
- $prefix/lib/xemacs/mule-packages
- Normal packages go here:
- $prefix/lib/xemacs/xemacs-packages
- Infodock development environments
- $prefix/lib/xemacs/infodock-packages

- $prefixはconfigure scriptに渡したパラメータ。
- 典型的には'/usr/local/'。
- ユーザのパッケージ階層
- '.xemacs/'配下
に、'site-packages'、'xemacs-packages'、
'mule-packages'ディレクトリをつくると、認識
される。
- パッケージ階層とload-path
- パッケージ階層達の優先度はXEmacsのコンパイ
ル時に指定する。
- 前項の指定順にしたがって、パッケージ階層を
調べて、load-pathを構成する。

- パッケージ
- バイナリパッケージとソースパッケージがある。
- ソースパッケージからバイナリパッケージを生成
する。'バイナリ'と言うが、実際はバイトコード
(コンパイルされたelispファイル)。

- バイナリパッケージアーカイブ
- XEmacs公式
- Official XEmacs Packages:
- XEmacs開発者によってテスト済み。
These packages have received testing from XEmacs developers and bleeding-edge users
and are available as documented in our Release Notice Archive.
- Pre-Release XEmacs Packages:
- テスト中またはテスト待ちのパッケージ。
- アーカイブではなく、パケージ個別に独立管理し
ているもの
- http://www.xemacs.org/Download/elispPackages.html
- ただし、このリストにあるもので、XEmacs
packagesに含まれることもあるとのこと。なん
のこっちゃ。
- http://ftp.xemacs.org/pub/packages/
- 130前後のパッケージあり。

- ソースパッケージリポジトリ
- XEmacs CVSリポジトリの一部。次の構造。

<repo-root>/
packages/
Makefile
iterate.rules
meta-iterate.rules
XEmacs.rules
Local.rules
Local.rules.template
Local.rules.mk
Local.rules.inc
package-compile.el
xemacs-packages/
Makefile
pkg-A-name/
pkg-B-name/
...
mule-packages/
Makefile
pkg-1-name/
pkg-2-name/
...
- 再帰的makeによって、パッケージ全体をビルドす
るようだ。

- パッケージの作法
- パッケージのflavor
- 2つのflavorがある。
- Regular Packages
- elispファイル達総体として機能をなすもの。
- 部分的に削除すると、機能しなくなる。
- Single-File Packages
- 個別elispファイルで機能するもの。そういっ
たものを共通テーマでくくったもの。
- 部分的に削除しても残りのものは機能する。
- ファイル名
- pkgname--pkg.tar.gz
- バイナリパッケージの中身の構成

_pkg.el
auto-autoloads.el
custom-load.el
ChangeLog
lib/pkgname/
lib-src/pkgname/
etc/pkgname/
info/
lisp/maybe-pkgname/
man/maybe-pkgname/
pkginfo/MANIFEST.pkgname

- _pkg.el
- パッケージ管理システム向け情報。
- auto-autoloads.el
- autoloadを中心に、pkgを使う(使えるように
する)ための設定を含む。
- custom-load.el
- customに対する設定を含む。
- pkginfo/MANIFEST.pkgname
- インストール対象ファイルの一覧を含む。

- ソースパッケージの構成
- バイナリパッケージの '_pkg.el' 、
'auto-autoloads.el'、'custom-load.el' は生
成物。そのかわりに、次のものがある。

Makefile
package-info.in

- 制御ファイル (Control Files)
- ソースとバイナリにまたがって、制御系のファ
イル達のことを制御ファイルと呼ぶ。具体的に
は、次のとおり。

Makefile
package-info.in
_pkg.el
auto-autoloads.el
custom-load.el

- インストール
- 基本的にはパッケージ階層のトップにてuntarする
だけ。
- elispによるインストールフロントエンドもあり。

- アンインストール
- 関数:package-admin-delete-binary-packageにて
削除可能。

- 依存関係
- 依存関係を扱う機構は無い。

こつこつ。

2009年12月7日月曜日

Auto Install

現在自分が使用しているRev.1.18を読んでみた。
印象は、EmacsWikiのElispAreaインターフェイス。


* Auto Install
- ソースがきれい。ちゃんとしている雰囲気。
** パッケージの取得先
- auto-install-emacswiki-base-url
- "http://www.emacswiki.org/cgi-bin/wiki/download/"
- auto-install-gist-base-url
- "http://gist.github.com/"
- auto-install-filter-url
- '(("color-grep" "http://www.bookshelf.jp/elc/"))
- auto-install-batch-list
- バッチインストールのためのパッケージ情報。
** パッケージのデフォルト保存場所
- auto-install-directory
- "~/.emacs.d/auto-install/"
- 新規に導入するelispファイルの置き場所。
** 基本的な動作
- emacswikiのelisp areaをelispの主たるアーカイブと
位置付けている。副次的なものとして、gist、
filter-urlがある。
- elisp areaから、'.el'ファイルの一覧を取得し、こ
れを取扱い可能ライブラリの名前として利用する。
- 基本動作としては、この名前でライブラリを指定し
て、ダウンロード-中身確認-採用-配置となる。
- ライブラリの指定は、mini-bufferで指定する方法と、
既存のelispをdired上で指定する方法の二種類がある。
- 配置場所も二種類ある。すでにそのライブラリが
load-path上に存在するなら、それへの上書き配置が
可能である。load-path上に存在しないなら、
auto-install-directory内に配置される。
- 依存関係を自動処理する方法は無いようだ。
- ただし、複数ファイルで構成されるライブラリについ
ては、auto-install-batch-listにて明示的にelisp
ファイルのグループをつくることによって、一括イ
ンストールが可能。

あとはXEmacsのPackage Systemだ。
こつこつ。

2009年12月5日土曜日

ELPA (Emacs Lisp Package Archive)


* ELPA (Emacs Lisp Package Archive)
- 次の2つのファイルがパッケージ一覧の基本情報。
package-list-packagesを呼ぶと、
package-refresh-contentsによってWebから取得され
る。
- http://tromey.com/elpa/archive-contents
- これがELPA提供のパッケージの一覧を含むファ
イル。依存関係も記述されている。
- 104個のパッケージを含む。
- http://tromey.com/elpa/builtin-packages
- Emacs組込パッケージと衝突しているものについ
て、整理情報を記述。22.0用と23.0用が含まれ
ている。
- バージョンを考慮した依存関係管理をしている。
- パッケージの様式
- <package-user-dir>/<NAME-VERSION>/にそれぞれのパッ
ケージをダウンロードする。
- .el
- ELPA上では'NAME-VERSION.el'というファイル名
をもつ。
- DLすると、'NAME-VERSION'というディレクト
リに'NAME.el'というファイル名で格納する。
- .tar
- "PACKAGE-pkg.el"を含まなければならない。
- このファイルの中では、define-packageが
呼ばれている。
- define-package
- パッケージを定義して、package-alistにパッケー
ジ情報を格納する関数。


こつこつ。

Emacs Lisp List


* Emacs Lisp List
- http://www.damtp.cam.ac.uk/user/sje30/emacs/ell.html
- さて、前回ell.elをローダと書いたが、ローダでは
なかった。
- これは、ell.xmlをemacsのbufferにきれいに表示す
るものだ。いくつか機能を提供している。
- 著者名によるソート機能。
- ell.xmlに更新があった場合、更新項目に"<new>"
をつける。
- すでに導入済みのライブラリについては、項目の頭
に"*"をつける。
- ちなみに、Emacsではelispを含んだファイルをお
しなべてライブラリと呼ぶ。
- avltree
- ell.xmlをパースしてavltreeにする。
- 作成したavltreeは'~/.ell-last-read'にファイル
として保持して差分確認にも利用する。


こつこつ。

2009年12月4日金曜日

Emacsのパッケージング事情

debian emacs policyを理解できてきたところで、他のパッケージ管理機構についてざっと調べてみた。結構いろいろな情報がある。

何かひとつをちゃんと知るということは、やっぱり大変なことだなぁと再認識した。


* Emacsのパッケージング事情
** ヘッダ等の慣習
*** Conventional Headers for Emacs Libraries
- http://www.gnu.org/software/emacs/manual/html_node/elisp/Library-Headers.html#Library-Headers
- GNU Emacs Lisp Referenceの一部。
- Elispファイルを書くときの慣習。
- ライブラリのメタデータ(著者等)をコメントとして
記述するための慣習。
- ライブラリの中身をコメントで構造化するための慣習。
- 例:メタデータ

;;; lisp-mnt.el --- minor mode for Emacs Lisp maintainers

;; Copyright (C) 1992 Free Software Foundation, Inc.

;; Author: Eric S. Raymond <esr@snark.thyrsus.com>
;; Maintainer: Eric S. Raymond <esr@snark.thyrsus.com>
;; Created: 14 Jul 1992
;; Version: 1.2
;; Keywords: docs

;; This file is part of GNU Emacs.
...
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.

ここに本体コード。

;;; filename --- description

- 例:構造化コメント

;;; Commentary:
;;; Documentation:
;;; Change Log:
;;; Code:
;;; filename ends here

*** Elisp Area Conventions
- http://www.emacswiki.org/cgi-bin/wiki/ElispAreaConventions
- EmacsWikiのElisp Areaに置くelispのかきぶりの慣
習の説明。
- GNU Emacs Lispの慣習をベースにして、詳細化や拡
張を実施している。

** ヘッダツール
*** Automatic File Headers
- http://www.emacswiki.org/emacs/AutomaticFileHeaders
**** auto insert mode
- ユーザが定義したテンプレートにしたがって、ファイ
ル作成時にヘッダを自動的に挿入する。
auto-insert-alistでファイル名パターンとテンレプー
トを紐付ける。
**** header2.el
- Elisp Area Conventionsに対応したヘッダを自動挿入
や自動更新するelisp。
- そのライブラリが必要とするfeaturesを記述する欄を
設けている。(これは他のConventionsでは定義されて
いない)
- ;; Features that might be required by this library:
**** lib-requires.el
- ライブラリの依存情報を調査して、木構造をつくる
elisp。
**** elisp-depend.el
- elispファイルをparseして、そのelispで依存してい
るライブラリを探索し、それぞれについて、それが
providedならば、require式を出力し、そうでなけれ
ばautoload式を出力する。
**** checkdoc
- http://www.emacswiki.org/emacs/CheckDoc
- elispファイルのヘッダをチェックする。GNU慣習と
EmacsArea慣習の双方に対応している。

** パッケージ管理機構
*** Emacs Lisp List
- http://www.damtp.cam.ac.uk/user/sje30/emacs/ell.html
- http://www.damtp.cam.ac.uk/user/sje30/emacs/ell.xml
- http://www.damtp.cam.ac.uk/user/sje30/emacs/ell.el
- パッケージ一覧ファイル(ell.xml)とそれを参照する
ローダ(ell.el)を提供。
- ell.elではavltreeをつかってパッケージのキャッシュ
を作成し管理している。興味深い。

*** Auto Install
- http://www.emacswiki.org/emacs/AutoInstall
- フルセットのパッケージ管理が可能。
- パッケージの取得先はEmacsWiki他、いくつか指定可
能。
- パッケージの依存関係の管理などがどうなっている
のかは要調査。

*** ELPA
- http://tromey.com/elpa/
- パッケージアーカイブとそれを参照するローダを提
供。
- Web上の説明が簡素なため、理解するためには使って
みる必要がありそう。
- パッケージアーカイブの仕様を調べてみたい。

*** Install Lisp
- http://www.emacswiki.org/emacs/InstallElisp
- Auto Installの前身と考えてよさそう。

*** XEmacs package system
- http://www.xemacs.org/Documentation/packageGuide.html
- XEmacsはパッケージ管理機構を組み込みでもってい
る。専用のパッケージアーカイブも存在する。
- debian-emacs-policyとはどういう関係になるのだろ
う。
- 詳細は要調査。


こつこつ。

2009年12月2日水曜日

【maxima】ちょっと不安定?

ちょこちょこmaximaで遊んでいるが、いろいろなところで、Segmentation Faultとか、Stack Overflowとかが発生する。ちょっと不安定なような?

例えば。


Maxima 5.13.0 http://maxima.sourceforge.net
Using Lisp GNU Common Lisp (GCL) GCL 2.6.8 (aka GCL)
Distributed under the GNU Public License. See the file COPYING.
Dedicated to the memory of William Schelter.
This is a development version of Maxima. The function bug_report()
provides bug reporting information.
(%i1) eq1:[x^2+y*x-1,x*y^2-x+y];
2 2
(%o1) [x y + x - 1, x y + y - x]
(%i2) ans:algsys(eq1,[x,y]);

Unrecoverable error: invocation history stack overflow.

Process maxima aborted



Interpidのmaximaはgclを内包しているようだ。これを、allegroなり、sbclなりに変更すれば、common lispの中で状況を追えるかな? GCLだとGDBで追うことになりそうな。Maxima/GCL/C/Executableという階層でMaximaの問題をExecutableで追うのはかなりきつい。。。

2009年12月1日火曜日

debian-emacs-policyのポイント (2)

perlを思い出しつつ、スクリプトを多少調べてみた。


* emacsen-commonのスクリプト
- debian-emacs-policyにある例を理解できない。それ
を理解したい。
- 例1

1) Xemacs21 and the add-on packages tm and auctex are already installed,
and now someone installs emacs21.

In it's postinst, emacs21 would make this call:

/usr/lib/emacsen-common/emacs-install emacs21

which would result in calls to

/usr/lib/emacsen-common/packages/install/auctex emacs xemacs21
/usr/lib/emacsen-common/packages/install/auctex emacs21 xemacs21
/usr/lib/emacsen-common/packages/emacs21/install/tm emacs xemacs21
/usr/lib/emacsen-common/packages/emacs/install/tm emacs21 xemacs21

- わからないところの特定
- /usr/lib/emacsen-common/emacs-install emacs21
- これはわかる。これをpostinstで実行するとがポ
リシーだから。
- しかし、上の呼出しが、

/usr/lib/emacsen-common/packages/install/auctex emacs xemacs21
/usr/lib/emacsen-common/packages/install/auctex emacs21 xemacs21
/usr/lib/emacsen-common/packages/emacs21/install/tm emacs xemacs21
/usr/lib/emacsen-common/packages/emacs/install/tm emacs21 xemacs21

これになるのはわからない。特に、なんで'emacs
が呼ばれるの?というところ。具体的には、

/usr/lib/emacsen-common/packages/install/auctex emacs21 xemacs21
/usr/lib/emacsen-common/packages/emacs/install/tm emacs21 xemacs21

こうじゃないの? と。

- ソース解読
- 解決。私の「こうじゃないの?」で正しそう。
- 根拠。
- install済みのflavorsは、

/var/lib/emacsen-common/installed-flavors

に記載されており、emacs-install
scriptも'other-flavors'の値はこれを使用してい
る。なので、ここに何が書いてあるかが、展開し
て実行する命令群を決める。
- すると、ポイントは、meta packageである'emacs'
がここに含まれるかどうか、だ。私の環境では、

i emacs - The GNU Emacs editor (metapackage)
i emacs22 - The GNU Emacs editor (Emacs 22)

というinstall状況だが、installed-flavors
は'emacs22' のみを内容として含んでいる。
- 実証。
- 'emacs22'と'xemacs21'がinstall済みの状態で、
'emacs21'にて、emacs-install scriptをdry
runさせてみる。を入れてみよう。
- emacs-installをcopyしてemacs-install-testと
して、my $dry_run = 1;とする。

emacsen-common $ ./emacs-install-test emacs21
emacs-install emacs21
/usr/lib/emacsen-common/packages/install/apel emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/cedet-common emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/debian-el emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/dictionaries-common emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/emacs-extra emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/emacs-goodies-el emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/emacsen-common emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/global emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/latex-cjk-common emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/lookup-el emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/mdk emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/mew emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/mmm-mode emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/octave3.0-emacsen emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/paredit-el emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/prolog-el emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/ruby1.8-elisp emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/w3m-el emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/flim emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/elscreen emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/ddskk emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/speedbar emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/eieio emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/dpkg-dev-el emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/slime emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/nxml-mode emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/maxima-emacs emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/latex-cjk-thai emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/ede emacs21 emacs22 xemacs21
/usr/lib/emacsen-common/packages/install/semantic emacs21 emacs22 xemacs21
Installed flavors are now: emacs22 xemacs21 emacs21
emacsen-common $
- うむ。実証できた。

- 例2
- これは例1のremove版なのでinstallと同様の動作
であろう。内容確認は割愛。

- 例3
- an add-on packageをremoveする例。
- 'emacs22'と'xemacs21'がinstall済みとする。
- 'wget-el' add-on packageがinstall済みとする。
- 'wget-el'をremoveする。
- 例の挙動は、次のとおり。
- prermにて、emacsen-package-removeが'wget-el'を
引数にて呼ばれる。
- その結果、次の命令群が生成される。

/usr/lib/emacsen-common/packages/remove/wget-el emacs emacs22 xemacs21
/usr/lib/emacsen-common/packages/remove/wget-el emacs22 emacs22 xemacs21
/usr/lib/emacsen-common/packages/remove/wget-el xemacs21 emacs22 xemacs21

- ここでも、'emacs'が何故存在するのかがわから
ない。次のものならわかる。

/usr/lib/emacsen-common/packages/remove/wget-el emacs22 xemacs21
/usr/lib/emacsen-common/packages/remove/wget-el xemacs21 emacs22
- dry run。
- 今度は先にdry runしてみる。

emacsen-common $ ./emacs-package-test-remove wget-el
/usr/lib/emacsen-common/packages/remove/wget-el emacs emacs22 xemacs21
/usr/lib/emacsen-common/packages/remove/wget-el emacs22 emacs22 xemacs21
/usr/lib/emacsen-common/packages/remove/wget-el xemacs21 emacs22 xemacs21
emacsen-common $

- なんと。。。

- ソース解読。
- あ、

map {
my $script = $lib_dir . "/packages/$action/$_";
execute($script, 'emacs', @installed_flavors) if -e $script;
} @pkgs_to_handle;

なるものがいる。
- なので、add-on packagesについては
install/removeにおいて、'emacs'がかならず引
数に入ってくるのだな。
- そもそも、なんでothersをならべる必要がある
のか?
- packages/remove/wget-elをみてみる。

#!/bin/sh -e
# /usr/lib/emacsen-common/packages/remove/emacs-wget

FLAVOR=$1
PACKAGE=wget-el

if [ ${FLAVOR} != emacs ]; then
# if test -x /usr/sbin/install-info-altdir; then
# echo remove/${PACKAGE}: removing Info links for ${FLAVOR}
# install-info-altdir --quiet --remove --dirname=${FLAVOR} /usr/info/emacs-wget.info.gz
# fi

echo remove/${PACKAGE}: purging byte-compiled files for ${FLAVOR}
rm -rf /usr/share/${FLAVOR}/site-lisp/${PACKAGE}
fi
- うむー。$1しか使っていない。


こつこつ。