Let's note J10S で smmp など、いくつかの自作プログラムがビルドできることを確認した。これで開発環境の構築はほぼ完了だろう。ビルドが一瞬で終わり、感動した。
mp3infp 2.54i/u7 のビルドも試してみたところ、さすがに一瞬とはいかず 1分弱かかったが、前の R6M の 4倍以上の速度だった。WDK でビルドすると、最後にコンパイル速度が表示されるが、R6M: 960 LPS、J10S: 4116 LPS だった。SSD 化によるファイルアクセスの高速化や、最大で 4プロセス同時にコンパイルが行われていること、CPU 自体の速度向上が効いているようだ。
鬼車のバグの内容を確認した。/(?<!aa|b)c/i は "Aac" にマッチすべきではないにも関わらず、マッチしてしまうようだ。
bregonig.dll を python の ctypes を使ってアクセスできるようにするモジュールを作ってみた。ctypes のポインタの扱いにかなり苦労した。bregonig.dll の場合は、文字列へのポインタは基本的に c_void_p で扱っておくのが良さそうだ。c_char_p だと、文字列の途中を指すポインタを作ったり、ポインタ同士の差分を出したりすることができないようだ。
これで、テストプログラムを書き直すたびにコンパイルをし直す必要がなくなった。
Windows 7 では、Susie32 ver0.47b が動作しなくなってしまった。代わりに、Susie ver0.50 beta2a をインストールしたところ、SpringM が Susie Plugin の場所を見つけられない問題が発生。SpringM では、レジストリから Susie Plugin の場所を取得しているが、レジストリの場所が変わってしまったようだ。以下のようなレジストリファイルを書いて読み込ませれば、SpringM で Susie Plugin を認識するようになった。("C:\\WINOLS\\SUSIE" の部分は、*.spi を置いている場所を指すように書き換えて使う。)
REGEDIT4 [HKEY_CURRENT_USER\Software\Takechin\Susie\Plug-in] "Path"="C:\\WINOLS\\SUSIE"
uptime も avast! 6.0 のサンドボックスに引っかかることが判明。修正することにした。
他にも VC2003 + WTL 8.1 で作ったソフトが avast! 6.0 に引っかかる。ただ、このソフトは /section:.text,erw している訳ではないので、なぜ引っかかるのかが分からない。自分以外のソフトでは、ck 3.3.4 や一部の Cygwin のソフトなどが引っかかる。いったい何を見て安全ではないと判断しているのだろうか。
exsel のビルドには LSI C-86 が必要だが、Win7 x64 では 16bit アプリは動作しない。MS-DOS Player for Win32-x64 を使ってビルドできるか試してみようかと思ったが、結局今回は前のマシンでビルドした。
Let's note J10S に VMware Player をインストールして、その上で XP Mode を使うことにした。(Windows Virtual PC よりも、VMware Player の方が性能が良いので。) VMware Player には XP Mode を使うための機能があるので比較的簡単に使えるが、いくつか注意点がある。
まず、キーボードが英語配列になってしまうので、日本語配列に変更する必要がある。次に、Virtual PC 統合コンポーネントは不要なのでアンインストールする。
これに加えて、2つ問題が発生。まずは、起動時にマイドキュメントが開いてしまうという問題。"My Documents open at startup" に直し方が載っていた。C:\WINDOWS\system32\userinit.exe, となっているべき値が、C:\WINDOWS\system32\userinit.exe,rdpinit.exe になっていたので、修正して解決した。
次は、NAS にホスト名でアクセスできない問題。IP アドレスを使えばアクセス可能。どうやら、VMware の NAT に問題があるようで、ブリッジならばホスト名でもアクセスできる。どのように対処するかはまだ決めていない。
ActivePerl 5.8 の頃、Perl/Tk を使って書いたスクリプトが、ActivePerl 5.12 で動かなくなってしまった。ActivePerl 5.10 で Perl/Tk が削除されて Perl/Tkx に差し替えられてしまったのが原因。Tk から Tkx への書き換えは簡単にはできないのが非常に困る。
5.8 と 5.12 で同じスクリプトが動かないのは管理が面倒なので、Tk と Tkx の使える方を使って動くように書き直してみたが、とても面倒だった。
しかし、以前 Tkx を試してみたときからずいぶん経ったが、日本語の情報は相変わらず少ない。perl tkx でググると、「もしかして: perl tk」と言われる始末。
iTunes のライブラリを移行しようと思ったが、データの場所がなかなか見つからない。Vista 以降の場合はどうやら、C:\Users\<user>\Music\iTunes にあるようだ。
avast! を 6.0 に更新したら、自分の昔作ったプログラムがことごとく「安全ではないと思われるアプリケーションを開こうとしています。」と言われて、サンドボックス内で起動させられてしまう。どうやら .text セクションを書き込み可能にしていたせいらしい。ファイルサイズ削減のため /merge:.data=.text /merge:.rdata=.text /section:.text,erw としていたのが原因。やはり .data と .text をマージして、.text を書き込み可能にするのはよくない。
最近は、/merge:.rdata=.text だけにしている。WDK でもデフォルトでこれが指定されているので、この方式ならば安心である。
現在自分が使っているソフトでは undll.exe, startw, exsel などが引っかかっているので直さないと。それ以外のソフトで引っかかるものもいくつもありそうだが、もはや自分では使っていないので、あまり直すつもりはない。
なお exsel は、DOS と Windows でプログラムを自動的に切り替えるという当初の目的には使っておらず、ただのコマンドラインランチャーとしか使っていない。そろそろ新しいコマンドラインランチャーの開発を考えてみるか。
数日前に注文した Let's note J10SEEDP が届いた。OS は Win7 Pro SP1 x64 なので、XP Mode も使える。
開発用マシンとして、コンパイラをいろいろとインストールする予定だが、とっくの昔にサポートされなくなった VC6 をどうするかが問題。普通ならば XP Mode にインストールするべきなのだろうが。Win7 x64 に直接インストールできるか調べてみたところ、問題なくインストールできた事例と、問題が発生した事例が見つかった。問題が発生した方は、変なインストール方法を行ったのが原因ではないかと思われる。
気にせずにデフォルトの設定でインストールしてしまった。MSJVM だけは、削除すべきだと思われるので、「@IT:Windows TIPS -- Tips:Microsoft Java VMを手動で削除する方法」を参考に削除した。ただし記載通りにやるとうまくいかないので注意が必要である。C:\Windows\SysWOW64\cmd.exe を管理者権限で起動し、そこから 32bit 版の rundll32 を実行する必要がある。普通にそのまま実行しようとすると、64bit 版の rundll32 が実行されてしまい、正しくアンインストールできない。
データベース関連もインストール対象から外すべきかも。
次に、VS.NET 2003 をインストールしようとしたところ、.NET Framework 1.1 のインストールの段階でエラーが発生してしまった。.NET Framework 1.1 と VS2003 も Windows 7 ではサポートされなくなっていたようだ。警告を無視して .NET Framework 1.1 を手動インストールしたところ、VS2003 はインストールできた。ただし、.NET Framework 1.1 のセキュリティーアップデートも手動で行わなければならない点に注意しなければならない。今出ているアップデートはおそらく以下の通り。
C/Migemo をデフォルトの設定で使うと、グルーピングには ( ) が使われるにも関わらず、これらの文字がエスケープされないため、正しい結果を得られない場合がある。手軽に済ませるならば、Emacs などに合わせて \( \) をグルーピングに使えばよい。しかし、\( \) を使うとグルーピングだけではなくキャプチャも行われてしまい無駄である。Vim の正規表現ならば \%( \) を使えばキャプチャは行われないが、鬼車では Vim の正規表現が使えない。Ruby の正規表現の (?: ) を使いつつ、それに合わせてエスケープを正しく行う方法を調べてみた。
migemo_setproc_int2char() を使って、( ) などを正しくエスケープする関数をコールバックに登録すれば、Ruby の正規表現も使えることが分かった。ただし、このコールバック関数は使用する文字コードに合わせた処理を行わなければならない。C/Migemo の辞書の文字コードの自動判別機能も有効に使えなくなってしまう。migemo_setproc_int2char() でコールバックを登録する際に、以前のコールバック関数へのポインタを返してくれれば、必要なエスケープ処理だけ行って、残りは元の関数に処理させることもできたのに。
SpringM の C/Migemo 呼び出し方法を、この方法に修正した。文字コードの自動判別機能は使わず、Shift_JIS 固定とした。
C/Migemo 1.3e でも、このコールバック関数の呼び出し規約は stdcall ではなく cdecl のままになっている。中途半端だ。やはり cdecl に戻すべきだと思う。
C/Migemo 1.3 のバイナリが 1.2 と互換性が無くなった件を少し調べてみた。現在公開されているバイナリは 1.3 だが、ソースの VERSION ファイルの中を見ると、1.3e と書かれている。以前自分が使っていたバージョンは 1.3c-MIT なので、どちらも 1.3 ではあるが、中身は異なっていたらしい。
1.3e の呼び出し規約は stdcall から cdecl に戻すべきだと思うが、作者のブログを見ていてもすぐに対応される様子はなさそうなので、SpringM を両方の呼び出し規約に対応させることにした。
最初は、C 言語の機能だけで呼び出し規約の差分を吸収させる方法はないか考えてみたり、あるいは Win32 構造化例外処理で何とかできるのではないかとも思ったが、結局よく分からなかったので、素直にインラインアセンブラを使うことにした。書いてみたのが次のようなコード。
migemo* x_migemo_open(char* dict) { __asm { push dict call p_migemo_open mov esp, ebp ; restore the stack pointer } }
これを VC6 でコンパイルすると次のようなコードになる。
push ebp mov ebp, esp push DWORD PTR _dict$[ebp] call DWORD PTR _p_migemo_open mov esp, ebp pop ebp ret 0
x_migemo_open() に入ると、esp が ebp に保存されるので、p_migemo_open をコールした後で ebp を esp に書き戻せばよい。わざわざ自前で esp の値を保存しておく必要はない。
ところが、同じコードを VC2003 や VC2005 でコンパイルしたところ、実行時にエラーが発生してしまった。x_migemo_open() がインライン展開されてしまっていたのが原因だった。インライン展開された場合、__asm ブロックに入る前に、esp を ebp に保存することは当然行われないので、ebp を esp に書き戻すとおかしなことになってしまう。
結局、以下のようにしてインライン展開を抑制することで、VC2003 以降でも正常動作するようになった。
#pragma auto_inline(off) migemo* x_migemo_open(char* dict) { ... } #pragma auto_inline(on)
esp の値を自前で保存する普通のやり方とどちらが良かったのかはよく分からないが、おそらくこの方法の方がサイズが小さいはず。
springm.dll に、DLL プリロード攻撃対策を組み込むことにした。
一番手軽なのは、WinXP SP1 以降に限定されるが、SetDllDirectory() を使う方法だろう。それ以前の OS にも対応するには、LoadLibrary() で DLL を全てフルパスで指定するように変更しないといけないのだろうが、springm.exe 本体も対処するのは不可能である。
SetDllDirectory() が使用可能な環境であれば、それを呼び出すようにしておいた。
AviUtl プラグインの del_import.auf だが、エクスポートを選んでも保存ダイアログではなく開くダイアログが出るのが気になっていた。ソースを見ると、dlg_get_save_name を呼ばずに、dlg_get_load_name を呼んでいる。修正しようと思ったが、ビルド環境を整えるのが面倒だったので、バイナリパッチで済ませることにした。
del_import.auf に次のパッチを当てて保存ダイアログが出るようになった。
000008D5: 80 84
Windows 7 のタスクバーの新機能を使うには、ITaskbarList3 を使うことになる。ITaskbarList3 を普通に使うには、VC2008 + Windows SDK 7.x などを使えばよいが、VC2003 から使えないか試してみた。
まずは、VC2003 のインクルードディレクトリに、C:\Program Files\Microsoft SDKs\Windows\v7.0\Include を追加したところ、sal.h が見つからないとのエラーが出た。VC2005 から使えるようになった Source-code Annotation Language (SAL) 注釈のためのヘッダーファイルである。そこで、インクルードディレクトリに C:\Program Files\Microsoft Visual Studio 9.0\VC\include を追加したところ、リリースビルドはビルドできるようになったがデバッグビルドはリンクエラーが出てしまった。
結局、ShObjIdl.h から ITaskbarList3 の宣言をコピーしてくるのが一番簡単そうなので、そのようにした。
GCC のマングリング規則がどのようになっているのか、少し気になった。VC++ には、マングル名をデコードして表示する undname というツールがあるが、GCC では、代わりに c++filt というものがあるようだ。
ijexp32 に組み込めないかとも思ったが、ライセンスが問題か。
bregonig.dll では空文字を扱えないのかとの質問が来た。bregonig.dll は BREGEXP.DLL の仕様にできるだけ合わせてあり、空文字をエラーとするのも BREGEXP.DLL から引き継いだ仕様である。ただ自分自身、空文字を受け付けないのは問題だと感じている。bregonig.dll Ver.2.00 を正式公開する際には、この仕様を修正しようかと考えていたこともあったのだが、すっかり忘れたまま正式版を出してしまった。今後、直すべきか直さざるべきか。
Perl 5.14 ではかなり正規表現に手が加えられているのか。チェックしておかないとな。
しばらく前に出た Qt Creator 2.2 と Qt 4.7.3 をインストールしてみた。Qt Creator 2.2 では、UTF-8 の BOM を削除せずに保持できるようになっていた。コンパイラとして VC を使う場合は、BOM が無いと UTF-8 として扱ってくれないので、これはよかった。
コンパイラとして、WinSDK 7.0 に付属のコンパイラ(VC2008 相当)を使おうとしたのだが、どういう訳か WinSDK 6.1 付属のコンパイラ(VC2005 相当)が使われてしまい、エラーとなってしまった。Qt Creator 2.1 までは、使用するコンパイラを選択できるようになっていたのに、2.2 では自動で決まり、手動では変更できなくなっている。結局、WinSDK 6.1 をアンインストールすることで、正常動作するようになった。
コンパイラには VC を使っているため、デバッガには Debugging Tools for Windows の CDB を使うことになるのだが、WDK 7.0 と一緒に CDB をインストールしたら、Qt Creator が CDB を見つけてくれなかった。WDK と一緒にインストールした場合、C:\Program Files ではなく、C:\WinDDK 以下にインストールされてしまう。C:\Program Files 以下にインストールし直してようやく Qt Creator が CDB を認識した。
最近話題の GNU parallel をちょっと試してみた。まずは、Cygwin にインストールできるか試してみたが、./configure && make && make install だけで簡単にインストールできた。
続いて Cygwin で動作するか試してみたが、特に問題はなさそう。しかし、perl で書かれていることと Cygwin ではプログラムの起動に時間が掛かることによるのか、オーバーヘッドがかなり大きい。簡単な処理であれば、オーバーヘッドの小さい xargs の方が早く終わる。使いどころが難しそうである。
あれ? Cygwin のパッケージの Text 以下を見て、lv は無いと思っていたが、Utils 以下に lv があった。わざわざ自前でコンパイルせずとも使えたわけか。ま、機能が向上したので良しとしよう。
hmonig.dll の履歴を見て、鬼車に新しいバグが見つかっていたことに気付いた。後で内容を確認しなければ。
lv は、.gz や .bz2 などの自動的に解凍して中身を見ることができる。しかし、この機能をオフにすることはできないのだろうか。ソースを見たところ、stream.c でファイルの拡張子を見て、フィルタをセットしている。現在のバージョンでは、この機能をオフにすることはできないようだ。この機能をオフにできるように改造してみた。さらに .xz や .lzma も自動的に解凍できるようにしてみた。せっかくなので、command.c を参考に任意のコマンドをフィルタとして使えるように改造してみた。
lv の最新バージョンは v.4.51 だと思っていたが、Ubuntu の lv は v.4.51.a と書かれている。Debian メインテナーの GOTO Masanori 氏による修正のようだ。(Debian Package Tracking System - lv)
v.4.51.a をベースに先ほどのフィルタ関連のパッチを作り直した。以下の手順でインストールできる。
# 最新ソースをダウンロード・解凍 wget http://www.ff.iij4u.or.jp/~nrt/freeware/lv451.tar.gz tar xvf lv451.tar.gz # 自作パッチをダウンロード wget http://homepage3.nifty.com/k-takata/cygwin/lv451-default_encoding_utf8.patch wget http://homepage3.nifty.com/k-takata/cygwin/lv451-2-filter.patch # Debian のパッチをダウンロード・適用 wget http://ftp.jp.debian.org/debian/pool/main/l/lv/lv_4.51-2.diff.gz cd lv451 zcat ../lv_4.51-2.diff.gz | patch -p1 patch -p1 < debian/@patch.lv.20050502_~+num-pat-option patch -p1 < debian/@patch.lv.20050506_%src%file.c_~enable-fastio-use-fread.2 patch -p0 < debian/patch.lv.misc patch -p1 < debian/@patch.lv.20051030_%src%_~use_off_t # 自作パッチを適用 patch -p1 < ../lv451-default_encoding_utf8.patch patch -p1 < ../lv451-2-filter.patch # ビルド・インストール cd build ../src/configure --enable-fastio make make install
上記の場合、/usr/local 以下にインストールされるが、Cygwin の他のパッケージに合わせて /usr 以下にインストールするには、次のように configure する。
../src/configure --enable-fastio --prefix=/usr --mandir=/usr/share/man
なお、lv.1 から lv.hlp を作成する方法がなかなか分からなかったが、以下のコマンドで作成できるようだ。
nroff -c -mandoc lv.1 > lv.hlp
Ubuntu 10.10 を使っていると、bash 上で ~ を入力した状態で、TAB を押して補完すると ~/ が /home/<user>/ に勝手に展開されてしまう場合がある。不思議に思っていたが、bash_completion が原因だったらしい。(Ubuntu日本語フォーラム / bashで~(チルダ)が/home/hogeに展開されてしまう)
Cygwin で lv を使いたいと思い、調べてみた。「UTF-8 Cygwinにlv|備忘LOG」によると、非常に簡単にビルドできるようだ。
libncurses-devel パッケージをインストールしてから、以下のコマンドでビルドできた。
$ wget http://www.ff.iij4u.or.jp/~nrt/freeware/lv451.tar.gz $ tar xvf lv451.tar.gz $ cd lv451 $ vim src/conf.c # デフォルトの文字コードを UTF-8 に変更 $ cd build $ ../src/configure $ make $ make install
先日、bash でもリモートのファイル名の補完ができたと書いたが、これは bash_completion をインストールしているときに使える機能のようだ。ただ、Cygwin に bash_completion をインストールすると、ログインシェル時の bash の起動がかなり遅くなる。
$ time /etc/profile.d/bash_completion.sh
として、bash_completion の読み込みに掛かる時間を調べてみると、4〜5秒ほど掛かっていた。(ちなみに、Ubuntu では 0.5秒程度だった。) /etc/bash_completion.d/ にあるファイルの内、使っていないファイルを別の場所に移動(or 削除)してしまえば、読み込み時間が短縮できるはず。ということで早速試してみた。
次のようなスクリプトを書いてみた。実行すると、使われていないファイルを /etc/bash_completion.d/unused/ に移動する。
#!/bin/bash # # check_unused_bash_completion.sh: # Checks unused bash_completion files and moves them into # /etc/bash_completion.d/unused/. # BASH_COMPLETION_DIR=/etc/bash_completion.d BASH_COMPLETION_DIR_UNUSED="$BASH_COMPLETION_DIR/unused" # This function checks whether we have a given program on the system. # No need for bulky functions in memory if we don't. # have() { unset -v have # Completions for system administrator commands are installed as well in # case completion is attempted via `sudo command ...'. PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null && have="yes" } if [ ! -d $BASH_COMPLETION_DIR_UNUSED ]; then mkdir $BASH_COMPLETION_DIR_UNUSED fi for i in $(LC_ALL=C command ls "$BASH_COMPLETION_DIR"); do unset -v have i=$BASH_COMPLETION_DIR/$i if [[ ${i##*/} != @(*~|*.bak|*.swp|\#*\#|*.dpkg*|*.rpm@(orig|new|save)|Makefile*) \ && -f $i && -r $i ]]; then for j in $(grep -P '^\(?have' "$i" | grep -o -P '(?<=\bhave )[^ )]+'); do have "$j" && break done if [ "$have" = "yes" ]; then echo "$i: used" else echo "$i: unused" mv "$i" $BASH_COMPLETION_DIR_UNUSED fi fi done
自分の環境では、180個ほどのファイルの内、使用する可能性のあるものは 30個程度だった。再度、読み込み時間を測定したところ、1.7秒程度まで短縮された。しかし、もっと速くできないものか。
a2ps 4.14 が出ていたことを数日前に知った。a2ps 4.14 では、日本語のメッセージファイルが最初から含まれており、昔の日本語対応パッチに含まれていた脱字も直っている。Cygwin の a2ps 4.13 で、パッチファイルとして提供されていた C# のスタイルシートも標準で含まれている。
しかし、Cygwin の a2ps パッケージは何年も前の 4.13 のままである。そこで、一昨日辺りから Cygwin で a2ps 4.14 のビルドを試して、ようやくまともにビルドできるようになった。
日本語対応が必要ないのであれば、a2ps-4.14-1-cygwin.tar.xz を使い、中のドキュメントに従ってビルドすればよい。パッチの内容は以下の3つ。
パッチのサイズを削減するため、configure と config.h.in に対するパッチは入れていないので、configure を実行する前に、autoconf, autoheader を実行する必要がある。
どういう訳か、ビルド中の libtool の実行時に $echo が定義されていないためにエラーになる場合があった。その場合には、$echo を適切に設定してビルドすれば良さそうである。
必要なパッケージは、gettext-devel, bison, flex, gperf, autoconf, automake, libtool などである。ただし、automake と libtool は必須ではない。
日本語対応が必要な場合は、上記のパッチを当てた後、「a2ps 4.14 の UTF-8 対応 (日本語のみ Japanese Only)」のパッチを当ててから、autoconf, autoheader を実行し、libnkfm をビルド&インストールしてから、configure してビルドすればよい。
libnkfm については、同サイトの 2.0.9 用のパッチが最新の 2.1.1 にもそのまま使える。以下のコマンドを実行して libnkfm.a を作成し、libnkfm.a を /lib/ にでもコピーし、libnkfm.h を /usr/include/ にでもコピーすればよい。
$ make CFLAGS=-O2 libnkfm.a
上記の UTF-8 パッチには少々気になるところがあったので、追加でパッチを作成した。(a2ps-4.14-utf8-ja-mod.patch) ただし、当てても当てなくても日本語対応版の動作には影響しない。
ck2 の頃は、ck の中で動かしているアプリに対して、マウスイベントが送られていたが、ck3 ではマウスイベントが送られていないようだ。Vim で :set mouse=a とすると、ck2 ではマウスで範囲の選択などができたが、ck3 ではできない。
ソースを見ると、pty.cpp の Pty_::PutMouse() に、マウスイベントを送出するためのコードが書かれているようだが、この関数がどこからも呼ばれていないようである。なお、キーボード用の同様の関数と思われる Pty_::PutKeyboard() は、script_sys.js の中から呼ばれているようである。
出たばかりの Ubuntu 11.04 を入れて、一昨日からいろいろとお試し中。
9.10 → 10.04 → 10.10 → 11.04 と順番にアップグレードしてきた環境では、再起動したら sh:grub> の表示が出て、そこで起動が止まってしまうという現象が発生した。「Ubuntu日本語フォーラム / ubuntu9.10だけが起動しなくなりました (wubi, winXP)」などを参考に、以下のコマンドを入力したら、とりあえず起動はした。
sh:grub> insmod ext2 sh:grub> linux /boot/vmlinuz-2.6.38-8-generic root=/dev/sda1 sh:grub> initrd /boot/initrd.img-2.6.38-8-generic sh:grub> boot
しかし Linux 起動後に、sudo update-grub を何度実行しても直らなかった。いろいろ試したあげく、sudo grub-install /dev/sda を実行したところ、ようやく起動するようになった。アップグレードによって GRUB の設定ファイル等は新しくなったが、MBR にインストールされた GRUB 本体は古いままだったということだろうか?
他には、ログイン画面でパスワードを入力して Enter を押すと、gdm-simple-greeter.desktop が応答なしと表示される現象が何度か発生した。これは、何度かログイン・ログアウトを繰り返しているうちに、いつの間にか発生しなくなった。
もう1つ、以前からキーボードレイアウトが勝手に USA になってしまうという問題が発生していたが、/etc/default/keyboard に XKBVARIANT="U.S.English" と書かれていたのが原因だった。"" に直してようやく GUI での設定が有効になった。
これとは別に、Ubuntu 11.04 の 32bit 版を新規でインストールしてみたが、こちらは特に問題なくインストールできた。
さらに、Ubuntu 11.04 の 64bit 版も新規でインストールしてみたが、CD からの起動中に Can not mount /dev/loop0 などというエラーが出てしまった。よく確認すると CD のイメージファイルが破損していた。再度ダウンロードし直したところ、正常にインストールできた。
Ubuntu 11.04 では Unity という新しい UI が話題だが、VMware 上では Unity は使えないらしい。どうしても Unity を使いたい場合には、Unity 2D を追加でインストールしたらよい。Unity (2D) を試してみたが、使いづらかった。元々はネットブック用の UI として開発されたからか、XGA 以上の解像度の一般 PC にはあまり向いていない気がする。