前回、automake に --foreign オプションを付けるために面倒なことをしていたが、configure.{ac,in} でオプションを指定できることが分かった。以下の行を書いておけばよい。
AM_INIT_AUTOMAKE(foreign)
これにより、以下のコマンドだけで、autotools 関連ファイルを更新できるようになった。
$ autoreconf -vfi
ただし、foreign オプションを指定すると、NEWS や ChangeLog ファイルが不要になる代わりに、INSTALL ファイルも更新されなくなってしまう。
Cygwin の fork が遅い問題を、Win32 API よりも低レベルの層で解決する方法はないのかと少し調査。
「WindowsNT・2000ネイティブAPIリファレンス」に、ZwCreateProcess() を使って fork を実現するコードが書かれているらしい。問題は、CsrpConnectToServer() というエクスポートされていない関数を呼び出す必要があるのだが、その関数のアドレスは ntdll.dll のバージョンによって変わってしまうという点。
IDA Pro の Free 版を使って WinXP の ntdll.dll をロードしたところ、シンボル情報を自動でダウンロードしてくれて、CsrpConnectToServer() のアドレスも判明した。この情報があれば、試しに fork を実装してみることはできそうである。
実はもう1つ大きな問題がある。x64 版の Windows だと、32bit 版の ntdll.dll は、64bit モードのコードを呼び出すだけの wrapper であり、CsrpConnectToServer() が存在しないのである。
Ubuntu 12.04 が出たので早速アップグレードしてみることにした。
まずは、アップグレードの前に、「ftp-adminの憂鬱: Ubuntuをアップグレードする前に」の設定を行って、JAIST からダウンロードするようにした。
2時間くらいでアップグレードが完了。VMware Player 上で動かしていたら、ログイン画面がやたら大きく表示されて、スクロールしないとパスワード入力欄が表示されないという問題が発生した。調べたところ、「feezch: 【deb系】Ubuntu Linux【ディストリ】 過去ログ - 123ページ目」に以下のような情報があった。
149 146 2012/03/02 (金) 22:59:28 【deb系】Ubuntu Linux 56【ディストリ】 (Linux板) LightDM を採用しているのが Ubuntu 以外見当たらなかったのでここでレスしました。 解決方法は2つありました。 1. /etc/X11/xorg.conf と /etc/lightdm/lightdm.conf を設定 sudo vi /etc/lightdm/display-setup.sh (新規作成 2行) #!/bin/sh /usr/bin/xrandr --output default --mode 1440x900 sudo chmod 755 /etc/lightdm/display-setup.sh sudo vi /etc/lightdm/lightdb.conf (最後に追加 1行) display-setup-script=/etc/lightdm/display-setup.sh 参考 https://wiki.ubuntulinux.jp/UbuntuTips/Hardware/HowToChangeMonitorResolution 2. VMware の仮想マシンの設定で最大解像度を設定 上記 display-setup-script が指定されていない場合は最大解像度を調べてるっぽいです。
とりあえず、簡単な 2. の方法で設定を行ってみた。
相変わらず Unity は使いづらい。Ubuntu の中の人は本当にこれが使いやすいと思っているのか?
autoreconf というコマンドの存在を知った。これを使えば、前回のように autotools のコマンドを 4つも入力する必要がなくなる。
Onigmo の場合、例えば次のようにすればよい。
$ AUTOMAKE='automake --foreign' autoreconf -vfi
automake に --foreign を指定して起動するためのオプションが無さそうなので、環境変数で代用することにした。
mosh を試しに使ってみた。現在の Version 1.1.3 は、OpenSSH の ForwardX11 や ForwardAgnet といった機能は使えないようだ。
Cygwin は、fork が遅いせいで configure が遅いという問題がある。Cygwin の fork について少し調べてみた。
Cygwin の fork は、Copy on Write を使わず、必要なメモリを全てコピーしているとのこと。
1番目のサイトにあるように、以下のコマンドを実行することで、1秒間に何回 fork を行うことができるか計測することができる。
$ while (true); do date; done | uniq -c
Core i5 のマシンで、Cygwin 1.7.14 で計測したところ、14forks/sec 程度だった。別の Core i5 のマシンで Cygwin 1.7.9 → 1.7.14 に更新したら、7forks/sec → 16forks/sec と 2倍以上に向上した。しかし、Linux に比べると全然駄目である。とある Ubuntu 10.04 では 250forks/sec 程度、別の Core i7 で VMware 上の Ubuntu 11.10 では 400〜600forks/sec 程度の速度が出た。桁が違う。
なお、Cygwin の fork のソースは以下の場所にある。
Vim の less 互換機能をもう少し less に近づけたいと思い、less.sh を修正してみた。前回の less.vim の修正も一緒に Gist に登録しておいた。
wget でファイルをダウンロードする時に、SourceForge などのように URL のリダイレクトが行われると、リダイレクトする前の URL を元にファイル名が付けられてしまい、長ったらしいよく分からないファイル名になってしまうのが以前から気になっていた。
wget --help でヘルプを見ても、この挙動を変更するようなオプションが見当たらなかったが、man wget で確認したところ、--trust-server-names というオプションが見つかった。これを指定すると、リダイレクトされた後の URL を元にファイル名が決定される。この指定を常に有効にするには、~/.wgetrc に次の行を追加すればよい。
trust-server-names = on
逆にこれを一時的に無効化するには、--no-trust-server-names オプションを付けて起動すればよい。
このような仕様になっているのは、セキュリティ上の問題によるようだ。安易に設定変更するべきではないのかもしれない。
Android SDK のアップデートで、一部のファイルが上書きできずに失敗する問題は以前にも書いたが、今回もやはり同様の現象が発生した。
前回は tools ディレクトリのファイルが複数更新できなかったが、今回は、SDK Manager.exe のみ更新できなかった。そのためか、今回はダウンロード済みの一時ファイルは消されてしまっており、もう一度手動でファイルをダウンロードすることになった。今回の tools のバージョンは r19 だったため、tools_r19-windows.zip をダウンロード・解凍し、tools\lib にあった SDK Manager.exe を C:\Program Files\Android\android-sdk-windows\ に上書きすることで、更新が完了した。
もっとまともな更新方法はないのか?
よく考えたら、前回とは異なり、tools ディレクトリのファイルは更新が完了しているので、C:\Program Files\Android\android-sdk-windows\tools\lib\SDK Manager.exe を C:\Program Files\Android\android-sdk-windows\ にコピーすればそれで良く、わざわざ手動でファイルをダウンロードする必要は無かった。
「這」の字形が WinXP と Win7 で違うことに気付いて、同じ字形で表示させることはできるのだろうかと、異体字セレクタについて調べてみた。
異体字の字形は Index of /ivd/data/2012-03-02 にある IVD_Charts.pdf で参照できる。「這」の文字コードは U+9019 なので、9019 の欄を見ると、E0100〜E0103 までの 4種類が登録されている。ただし、字形としては 2種類と見てよさそう。E0100, E0102 が一点しんにょう、E0101, E0103 が二点しんにょうとなっている。
Win7 + Firefox11 で、「這」 + U+E0100〜U+E0103 の 4種類の文字を表示してみたが、どれも同じ字形で表示されてしまった。前述の Wikipedia のページにも記載があるとおり、異体字セレクタに対応したフォントを使用しないと正しく表示できないようだ。
Onigmo の Makefile.am を修正したので、以前の記事 のようにして auomake を実行したら、以下のようなエラーが出てしまった。
Makefile.am: required file `./NEWS' not found Makefile.am: required file `./ChangeLog' not found
以下のようにオプションを少し修正するのが良さそうだ。
$ libtoolize --copy $ aclocal $ automake --foreign --add-missing --copy $ autoconf
--foreign を指定することで NEWS と ChangeLog など GNU プロジェクト特有のファイルの存在チェックをしなくなる。--copy は、足りないファイルを symlink ではなく、コピーするためのオプションである。
以前動かしたときに、--foreign を付けずとも動作した原因はよく分からない。
autotools を使ったパッケージでは、たいてい次のコマンドを入力することで、ビルドとインストールができる。
$ ./configure $ make $ make install
しかし、autotools を使った場合、install や uninstall 以外にも様々な make ターゲットが指定できる。例えば、以下のようなものが指定可能である。
ctags, CTAGS Vi 用のタグファイル (tags) を作成する tags, TAGS Emacs 用のタグファイル (TAGS) を作成する GTAGS GNU GLOBAL 用のタグファイルを作成する dist 配布パッケージを作成する dist-bzip2 .tar.bz2 形式の配布パッケージを作成する dist-xz .tar.xz 形式の配布パッケージを作成する (automake 1.11 以降) distcheck 配布パッケージを作成と、そのチェック configure configure を更新する Makefile Makefile を更新する
なお、Onigmo-5.13.2 で make distcheck を行うと、エラーになることが判明したため、対策を検討中。
Vim には、Vim を less のように使う less.sh, less.vim というスクリプトが付属している。Vim のシンタックスハイライトが使えるので、ソースコードやパッチファイルなどを見るときには重宝する。自分の場合は以下のように alias を設定して使っている。
alias vimless='/usr/share/vim/vim72/macros/less.sh' alias vl='vimless'
このスクリプトを使えば less とほぼ同じキー操作が使えるようになるのだが、1つだけ気になる動作があった。スペースキーを押すとページ送りになるのだが、ファイルの最後まで行くと、less とは異なり、Vim が終了してしまうのである。
/usr/share/vim/vim72/macros/less.vim を ~/.vim/macros/ にコピーし、以下のように変更したところ、ファイルの最後でスペースキーを押しても勝手に Vim が終了しないようになった。
--- less.vim 2010-04-16 21:47:50.000000000 +0900 +++ less.vim 2012-04-05 21:02:55.000000000 +0900 @@ -92,7 +92,8 @@ fun! s:NextPage() if line(".") == line("$") if argidx() + 1 >= argc() - quit + "quit + return endif next 1