2011-01-31

rebase for perlbrew Perl on Cygwin

Cygwinperlbrew 環境の Perl を使うときの、関連する DLL を rebase するシェルスクリプトです。

Cygwin には rebaseall や perlrebase がありますが、perlbrew でインストールした Perl の rebase までは面倒を見てくれません。brewedperlrebase (長い…)は perlbrew 環境用の perlrebase です。

どういうこと?

Cygwin は Windows 上に Linux 風の環境を提供するもので、様々な GNU ツールや UNIX 的な機能を利用できるようになります。Windows と UNIX 系 OS のプロセスモデルの最も大きな相違は自プロセスのコピーを生成する fork の有無です。
Cygwin では Windows 上にこの擬似的な fork() を実装するために DLL をロードするアドレスを調整する必要があります。

Cygwin の rebase は DLL のベースアドレスを変更するユーティリティで、プロセスにロードされる DLL のアドレスが重複せずそれぞれ一意となるように調整することで、fork() の親プロセスと子プロセスが同じメモリーイメージを持てるようにします。
基本的にロードされている DLL のアドレスさえ調整されていれば問題ないのですが、沢山ある DLL のうちどの DLL がどのプロセスでロードされるかは事前に知りようがないので、通常は rebaseall を使って Cygwin のほぼすべての DLL を rebase します。rebaseall するには対象となる DLL が使用されていない状態でなければいけないので、Cygwin のプログラムをすべて終了させておく必要があります。

Cygwin のパッケージでインストールされる DLL は既に調整された状態なので、通常の利用では rebase のお世話になることはありません。

しかし Perl のモジュールを CPAN からインストールしたとき、そこに XS を使ったモジュールが含まれていて DLL がインストールされた場合は別です。こういったモジュールを使った Perl プログラムはそのまま動くことが多いと思いますが fork() したときにはエラーが発生します。
例えば、

0 [main] perl 4704 C:\cygwin\bin\perl.exe: *** fatal error - unable to remap \\?\C:\cygwin\lib\perl5\5.10\i686-cygwin\auto\Fcntl\Fcntl.dll to same address as parent: 0x64700000 != 0x67290000
0 [main] perl 2520 fork: child 4704 - died waiting for dll loading, errno 11

のような。

これは rebaseall することで解決しますし、いちいち rebaseall するために Cygwin のプログラムをすべて終了させるのが面倒なときには、Cygwin の perl パッケージに含まれる perlrebase を利用することもできます。perlrebase は Perl に関連する DLL だけをまとめて rebase してくれるので、実行時に Perl を使ったプログラムさえ終了させておけば rebase できます。

perlrebase は /bin と /usr/local/bin にある Perl には対応していますが、perlbrew でインストールした Perl までは面倒を見てくれません(2回目)。ということで brewedperlrebase です。

CPAN からの芋づるインストールでは、特に依存関係にあるモジュールをロードしたあとのテスト時に fork() の問題が発生するので、逐次失敗させて rebase しながらインストールを進めるか、モジュールが動作すると分かっている場合にはテストを省略してインストールし最後にまとめて rebase します。

2011-01-21

fontset-standard を使ったフォント設定

Emacs 23 になってから、これまで Windows の Emacs では create-fontset-from-ascii-font で作ったフォントセットを使ってきた。default-fontset をいじる設定も試したことがあったが納得いかなかった。上記の EmacsWiki を見て standard-fontset をいじって使ってみたところ、これは良さそうだ。

…と言っても毎度代わり映えしない設定なわけですが。

基本的なアルファベットのところは Consolas を使い、日本語は(表示できればいいや、で) MS Gothic、残りはフォントリンク、default-fontset のフォールバック、Arial Unicode MS によしなにしてもらう設定です。

Emacs 23.2.92 HELLO
Emacs 23.2.92 での view-hello-file

この設定ではギリシャ文字やキリル文字の見た目の文字幅(プロポーショナルで幅 1 っぽい)と、Emacs が扱う char-width の文字幅 2 が異なる状態になるので、これが問題になるようなら、本当に文字幅を 1 にするなり、latin-jisx0201, cyrillic-iso8859-5, greek-iso8859-7 を MS Gothic で表示してちゃんと文字幅 2 で見えるようにする必要があると思います。

半角カナは Arial Unicode MS での表示。MS Gothic より少しは綺麗。

picopico
まぁ少々ぴこぴこするけど。まず使わないし

Emacs 23.2.92   emacs-w3m Wikipedia
十分十分。どうせ読めないし

以前の設定

いずれも古いので参考にしないほうが良いと思います…。

2011-01-17

Emacs 23.2.92 pretest

Emacs 23.2.92

Emacs 23.3 リリースへ向けた23.2.92 pretest が週末に出ました。

Windows 用のバイナリーも出ています。

ただし、現時点でいくつかの問題が出ているようです。

Windows の PNG サポートありの場合はビルドに失敗するので、tarball からビルドする場合には以下の修正が必要になります。

=== modified file 'src/ChangeLog'
--- src/ChangeLog       2011-01-15 02:55:58 +0000
+++ src/ChangeLog       2011-01-17 04:35:32 +0000
@@ -1,3 +1,11 @@
+2011-01-16  Stefan Monnier  <monnier@snip>
+
+       * image.c (syms_of_image): Don't access XSYMBOL's internals directly.
+
+2011-01-16  Eli Zaretskii  <eliz@snip>
+
+       * image.c (syms_of_image): Don't use SET_SYMBOL_VALUE.  (Bug#7848)
+
 2011-01-15  Martin Rudalics  <rudalics@snip>

        * window.c (inhibit_point_swap): New variable.

=== modified file 'src/image.c'
--- src/image.c 2011-01-03 19:32:41 +0000
+++ src/image.c 2011-01-17 04:35:32 +0000
@@ -8463,11 +8463,13 @@
 #ifdef HAVE_NTGUI
   Qlibpng_version = intern_c_string ("libpng-version");
   staticpro (&Qlibpng_version);
+  Fset (Qlibpng_version,
 #if HAVE_PNG
-  SET_SYMBOL_VAL (XSYMBOL (Qlibpng_version), make_number (PNG_LIBPNG_VER));
+       make_number (PNG_LIBPNG_VER)
 #else
-  SET_SYMBOL_VAL (XSYMBOL (Qlibpng_version), make_number (-1));
+       make_number (-1)
 #endif
+       );
 #endif

 #if defined (HAVE_XPM) || defined (HAVE_NS)

これは emacs-23 ブランチ先端では修正されています。

anything に関連して?上記のような不具合があるようです。が、ぼくはいま時間が取れなくて 23.2.91 のまま使っているので状況は良く分かりません。(anything も使っていないし…)

関連

2011-01-05

SKK-JISYO.L.yaskkserv を最新にする

ddskk / skkime から使っている Debian GNU/Linux squeeze の yaskkserv の辞書を最新の辞書ファイルで更新するメモ。

#!/bin/sh
# skk の辞書を更新して
wget -N http://openlab.ring.gr.jp/skk/dic/SKK-JISYO.L.gz
wget -N http://openlab.ring.gr.jp/skk/dic/SKK-JISYO.jinmei.gz
wget -N http://openlab.ring.gr.jp/skk/dic/SKK-JISYO.geo.gz
wget -N http://openlab.ring.gr.jp/skk/dic/SKK-JISYO.propernoun.gz
wget -N http://openlab.ring.gr.jp/skk/dic/SKK-JISYO.station.gz
wget -N http://openlab.ring.gr.jp/skk/dic/SKK-JISYO.law.gz
wget -N http://openlab.ring.gr.jp/skk/dic/SKK-JISYO.requested.gz
wget -N http://openlab.ring.gr.jp/skk/dic/SKK-JISYO.edict.tar.gz
wget -N http://openlab.ring.gr.jp/skk/dic/zipcode.tar.gz

# 展開して
gunzip < SKK-JISYO.L.gz > SKK-JISYO.L
gunzip < SKK-JISYO.jinmei.gz > SKK-JISYO.jinmei
gunzip < SKK-JISYO.geo.gz > SKK-JISYO.geo
gunzip < SKK-JISYO.propernoun.gz > SKK-JISYO.propernoun
gunzip < SKK-JISYO.station.gz > SKK-JISYO.station
gunzip < SKK-JISYO.law.gz > SKK-JISYO.law
gunzip < SKK-JISYO.requested.gz > SKK-JISYO.requested
tar xafO zipcode.tar.gz ./zipcode/SKK-JISYO.zipcode > SKK-JISYO.zipcode
tar xaf SKK-JISYO.edict.tar.gz SKK-JISYO.edict

# yaskkserv 用の辞書を生成
yaskkserv_make_dictionary SKK-JISYO.L SKK-JISYO.L.yaskkserv
yaskkserv_make_dictionary SKK-JISYO.jinmei SKK-JISYO.jinmei.yaskkserv
yaskkserv_make_dictionary SKK-JISYO.geo SKK-JISYO.geo.yaskkserv
yaskkserv_make_dictionary SKK-JISYO.propernoun SKK-JISYO.propernoun.yaskkserv
yaskkserv_make_dictionary SKK-JISYO.station SKK-JISYO.station.yaskkserv
yaskkserv_make_dictionary SKK-JISYO.law SKK-JISYO.law.yaskkserv
yaskkserv_make_dictionary SKK-JISYO.requested SKK-JISYO.requested.yaskkserv
yaskkserv_make_dictionary SKK-JISYO.zipcode SKK-JISYO.zipcode.yaskkserv
yaskkserv_make_dictionary SKK-JISYO.edict SKK-JISYO.edict.yaskkserv

 /usr/share/yaskkserv のファイルを上書きしちゃう(手動)
echo "sudo cp -f *.yaskkserv /usr/share/yaskkserv"

SKK-JISYO.edict は abbrev を使って英和変換できる辞書で、skkdic, skkdic-extra には含まれていないけど便利です。