Hatena::ブログ(Diary)

技術日記@kiwanami

2011-05-14

LinuxでiPadをセカンドモニターにする

はじめに

iPad」と呼ばれるディスプレイ装置はすごいデバイスです。タッチパネル付きの9.7インチIPS液晶で、解像度はXGA、しかも無線でマシンと接続できるだけでなく、わずか700g弱という重さながら、バッテリーを内蔵していて10時間以上の連続動作が可能です。

AirDisplayというソフトを使うと、簡単にMacWindowsiPadをセカンドディスプレイにすることが出来ます。

残念ながら、このiPadLinuxでセカンドディスプレイとして使う情報はありません。いろいろ検索してみましたが、やっている人は誰もいないようです。

そこでiPadLinuxでもセカンドモニターにしてみる方法を探してみました。結果としては一応セカンドモニターとして使えなくもないことが分かりました。

達成目標

ここでの「セカンドモニター」の定義ですが、iPadのAirDisplayと同じような動作を考えています。具体的には以下のようです。

前提

とりあえずは現在の自分のマシンで動くことです。

すべてVNCのポートは5901を仮定しています。

今回試した方法は一般的なハックですので、おそらくXに詳しい人なら他の環境でも容易に実現できると思います。

あと、VNCで画面を転送していますので画面の動きがすごく遅いです。動画とかは全く無理です。シェルの操作がまあまあ我慢できるぐらいの速度です。(追記 2011/05/15)

方法1: XINERAMA + x11vnc

概要

まずはXのディスプレイ拡張技術:XINERAMAを使ってを素直に拡張する方法です。dummyドライバで見えない仮想スクリーンを作って、XINERAMAで画面をつなげます。仮想スクリーンはVNC(x11vnc)でiPad側に表示させます。

XINERAMA + x11vnc

  • 良いところ
    • すべての機能要件を満たす
  • 問題
    • Xの設定変更にはXの再起動が必要
    • xrandr, compiz が使えない
インストール

必要なもの:

  • xserver-xorg-video-dummy
  • x11vnc

x11vnc は synaptic や apt-get で入ります。

問題は xserver-xorg-video-dummy です。これをパッケージから入れようとすると、現在入っている xserver-xorg-video〜 関係が軒並み削除されようとしてしまいます。ディスプレイのない環境で使うものというパッケージとして定義されているのかも知れません。さらにコードにバグも残っていますので、以下のように手動で修正して入れる必要があります。(XorgのログにWindowTableが無いといったエラーが出る場合はこの修正が必要です)

$ sudo apt-get build-dep xserver-xorg-video-dummy
$ apt-get source xserver-xorg-video-dummy
$ cd xserver-xorg-video-dummy-0.3.3
$ vi src/dummy_driver.c
  (下の修正箇所を参照)
$ dpkg-buildpackage -rfakeroot -uc -b
$ sudo cp debian/tmp/usr/lib/xorg/modules/drivers/dummy_drv.so /usr/lib/xorg/modules/drivers/dummy_drv.so

(修正箇所)

$ diff xf86-video-dummy-0.3.3/src/dummy_driver.c mod/src/dummy_driver.c
782c782
<         pWinRoot = WindowTable[DUMMYScrn->pScreen->myNum];
---
>         pWinRoot = DUMMYScrn->pScreen->root;
Xorgの設定など

最近は xorg.conf を書かないようになってきたので、昔よりもXの設定は難しくなってきました。 xorg.conf が何か分からない人はこの方法はあきらめた方が良いと思います。分かる人が分かるように簡単に書きます。

  • xorg.conf 生成
    • Ctrl+Alt+F1 から kill でXを落とす
    • sudo X -configure で現在の設定の xorg.conf を生成する
    • できた xorg.conf をひな形として取っておく
  • xorg.conf 書き換え
    • (下の設定例を参照)
    • Monitor, Screen, Device を作る
    • xinerama を有効にする
    • ServerLayoutで相対位置設定
    • /etc/x11/xorg.conf に置く

xorg.confの内容(抜粋):

Section "ServerLayout"
	Identifier     "X.org Configured"
	Screen      0  "Screen0" 0 0
	Screen      1  "Screen1" LeftOf "Screen0" # 相対位置を指定
	InputDevice    "Mouse0" "CorePointer"
	InputDevice    "Keyboard0" "CoreKeyboard"
EndSection

Section "ServerFlags" 
    Option         "Xinerama" "1" 
EndSection

#(中略:ここに入力デバイスやScreen0関係)

Section "Device"
        Identifier "Dummy Device"
        Driver "dummy"
EndSection

Section "Monitor"
        Identifier   "monitor_dummy"
        ModelName    "dummy"
        HorizSync    10-200
        VertRefresh  20-90
        Modeline "768x1024_60.00"  65.13  768 816 896 1024  1024 1025 1028 1060  -HSync +Vsync
EndSection

Section "Screen"
        Identifier "Screen1"
        Device "Dummy Device"
        DefaultDepth 24
        SubSection "Display"
                Depth      24
#               Modes      "1024x768"       # 横置きの場合
                Modes      "768x1024_60.00" # 縦置きの場合
        EndSubSection
        Monitor      "monitor_dummy"
EndSection

設定が出来たらXを起動します。(OS再起動が楽かも)

無事起動できたら、普通にログインして以下のコマンドでディスプレイを確認します。

$ xdpyinfo -ext XINERAMA
name of display:    :0.0
version number:    11.0
vendor string:    The X.Org Foundation
vendor release number:    10900000
X.Org version: 1.9.0
 : (中略)
XINERAMA version 1.1 opcode: 147
  head #0: 1440x900 @ 768,0
  head #1: 768x1024 @ 0,0

このようにXINERAMAのセクションでheadが2つ出てくれば成功です。このとき、マウスを仮想スクリーンがある方(上の設定では左側)の画面端に持って行くと、見えない画面にマウスが移動します。

もし、Xの起動に失敗した場合(画面が真っ暗なままなど)は、コンソールやsshログインしてXのログ(/var/log/xorg.0.log)を確認して、xorg.confの書き換えを行います。元に戻したい場合は xorg.conf を消して再起動するだけです。

VNCで接続

仮想スクリーンが準備できたらx11vncで見えない画面をVNCでアクセスできるようにします。以下のコマンドを入力します。(とりあえずパスワード無しにしていますので、実用時はパスワードを設定するか、sshトンネルなどでセキュリティを確保しておく必要があります。)

$ x11vnc -display :0 -rfbport 5901 -nopw -clip xinerama1

起動できたら、とりあえずは本体側でvncviewerで表示できるか確認しておきます。うまくいけばディスプレイの端から消えたマウスポインターは、VNC側の画面に表示されるはずです。

ここまでくれば、あとはiPadからVNCでアクセスするだけです。

完成風景

感想など

導入が大変ですが、ディスプレイ間でウインドウが移動できますので動作としては理想的です。

しかしながらXを再起動しなければならないため、iPadをセカンドディスプレイで使いたいような出先ではあんまりうれしくないです。また、XINERAMA を使うと compiz や randr が無効になってしまうのも個人的には残念です。というか、XINERAMA は開発終了なので出来れば依存したくありません。

理論上は XINERAMA 使わずにスクリーンを2つ作る方法もいけるはずなのですが、現時点の Xorg の実装では randr 対応・非対応の Device が混在するとXが落ちるようです。 Xorg 本体の randr 側が改善するか、 dummy を randr 対応するかになると思います。おそらく、 dummy 側が randr 対応するとX再起動無しでいけるようになるのではないかなと思っていますが、まだちょっとよく分かりません。誰か作ってくれるといいですね。

とにかく、 dummy ドライバは情報が少なかったので苦労しました。

参考URL

方法2: vnc4server+x2vnc

概要

Xorg上の仕組みで頑張る方法はあきらめて、素直にVNCで拡張する方法を考えてみました。

この方法はVNCサーバーで新規にXの画面を作り、そこをVNCiPadで表示させる方法です。ウインドウディスプレイ間を移動できませんが、マウスキーボードはx2vncで移動させることが出来ます。

vnc4server + x2vnc

インストール

必要なもの:

  • vnc4server
  • x2vnc

全部 synaptic, apt-get で入ります。

基本的な設定

まず、vnc4serverを起動します。初回はパスワードを設定が必要です。

$ vnc4server :1 -geometry 768x1024 -alwaysshared

ちなみに vnc4server の終了は以下のようです。動かしたサーバーは停止させるまでずっと裏で動いています。

$ vnc4server -kill :1

次に、ディスプレイの端とVNCの画面をつなげるためにx2vncを起動します。下の場合はディスプレイの左側がVNC画面と繋がります。

$ x2vnc -shared -west localhost:1

ここでもvncviewerで動作確認をしてみてください。

問題なければiPad側からVNCで接続してみます。うまく画面が表示されれば成功です。

快適化

マウスキーボードが使えるのはいいのですが、vnc4serverがデフォルトで用意してくれる xstartup だとターミナルが一つ表示されるだけで少し使いづらいです。そこで、使いやすくカスタマイズします。

以下に自分で使っている xstartup ファイルを示します。背景を真っ白にして、VNC内でもATOKを使えるようにして、あとは狭い画面を有効に活用できるようにタイル型ウインドウマネージャーのxmonadを導入しました。

$ cat ~/.vnc/xstartup
#!/bin/sh
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid white
/opt/atokx3/bin/atokx3start.sh
vncconfig -iconic &
gnome-terminal&
exec xmonad

xmonadでは、dmenuを入れただけで特にあまりカスタマイズはしていません。

注意点

この方法ではメインのディスプレイが「:0」、VNC側が「:1」になります。基本的に各ディスプレイのX環境は独立していて、アプリケーションは起動させたディスプレイで表示され、起動後のウインドウの移動は出来ません。

Xに慣れた人なら分かると思いますが、DISPLAY変数アプリケーション引数などで表示するディスプレイを選ぶことが出来ます。

まれにGNOMEアプリのテーマが適用されなくなるなど、多少混乱があるようです。

感想など

個人的にはこの方法を使っています。メインの環境に全く影響が無く、セカンドディスプレイ内の通常の操作だけでなく日本語入力も問題ありません。

ウインドウの移動が出来ませんが、Twitterやログ表示のような軽いアプリであれば全く問題ありません。

方法3: x11vncの特定ウインドウ表示

概要

最後はおまけのような方法です。

x11vncで指定したウインドウVNCiPadに表示させるだけです。ほとんど操作は出来ませんが、iPadで表示したいウインドウが今そこにある場合には手軽で便利かも知れません。

x11vncによる特定ウインドウ表示

導入方法

必要なものは x11vnc のみです。synaptic, apt-get で入ります。

表示したいと思ったところで以下のコマンドを入力します。「-id pick」がポイントです。

$ x11vnc -xwarppointer -nopw -rfbport 5901 -nocursorpos -nocursor -id pick

そのあと、表示したいウインドウ内部でクリックします。

あとはiPad側からVNCで接続してみます。うまく画面が表示されれば成功です。

注意点

以下のような操作ができません。大抵 x11vnc が落ちるか、調子が悪くなります。

また、指定したウインドウでないもの(そのウインドウから起動されたメニュー、ポップアップダイアログなども)も表示できません。

上のような理由から、おそらくタイル型ウインドウマネージャーとは相性が悪いと思います。

感想

ログや Twitter の TL、R や Gnuplotプロット画面、 LaTeX 編集時やWeb開発時の表示確認などの、ちらっと見るだけで良いものには便利です。また、ポート番号を変えれば方法1,2とも同居できます。

しかしながら、思わず最小化したりしてしまうとVNCの更新が止まってしまったりするため、個人的にはあまり使っていません。

まとめ

以上、いろいろ試してみました。方法2の vnc4server を使う方法が楽で良いと思います。

将来 xrandr 対応 dummy ドライバが出来て、自由にウインドウが移動できるようになると良いなと思っています。

他にも良い方法がありましたら是非教えてください。


各地のドキュメントやXのソースを読みながら、さらに Ubuntu 11.04 で Wayland がやってきたりするのを見て、まだまだディスプレイ関係は進化が続いて大変だなと思いました。

2011-05-13

Emacsへの知の集約

Emacsアプリを作ることについての自分の考えのまとめ。

Emacsの2つの側面

Emacsの可能性を議論する場合に、エディタIDEとしてのEmacsと、アプリケーション実行環境としてのEmacsの2つの側面を分けた方が良いかなと思っています。両者がごっちゃになるので、「Emacsは環境だ」→「エディタでメールとか変態だ」→「むきー!!!」という不毛な議論になるのだと思っています。

単純なエディタIDEとしてのEmacsについては、十分議論が出ていると思いますので、ここでは議論しません。個人的には、趣味なら自由、仕事でやるなら望まれた生産性を満たす好きなツールを使えばいいと思っています。

今回の議論は、アプリケーション実行環境としてのEmacsです。こちらは、 Eclipse RCP や FLEXJVM系各種スクリプトや、各種WebフレームワークGAEHTML5 といった言葉と比べるようなものだと思っています。つまり、「GWTFLEX/S2のどちらでメーラーアプリを作る方が良いか?」という感じで、「GWTFLEX/JavaEclipse RCP、EmacsのどれでIMAP4メーラーアプリを作った方が、工数メンテナンス性の面で良いか?」という質問になるかと思います。

ほら!全然違和感ない!むしろ、Emacsの方が楽そうに見えますね!不思議!!!

Emacs上のアプリケーション使ったり、開発することはそんなにいいのか?

結論から書くと、まずEmacsは単体のアプリを使ったり書くにはあまり向いていません。単体のアプリを書くのであれば他の実行環境を使えばいいと思います。しかしながら、知的活動を支援するたくさんのアプリがそろってますので、もう全部Emacs上に載せてしまって、一連のワークフローを強化するようにカスタマイズしたり、必要なアプリを書くには悪くない選択だと思います。

アプリケーション実行環境としてのEmacs

Emacsの動作環境はかなり広いです。大抵のOSで動作します。GUI付き、端末画面、画面無しのバッチ実行など、動作方法も選べます。開発最先端は多少不安定なことがありますが、リリース版はかなり安定していることが期待できます。処理系としてはかなり枯れている方ですが、今でも精力的に開発が進んでいて進化し続けており、今後も長期的なサポートが期待できます。

実行速度は普通のLL的です。シンプルなスタックマシンのVMで動くので、バイトコンパイルすると多少最適化がかかって速くなります。

言語の機能ですが、伝統的な LISP-2 で、ダイナミックスコープが標準です。レキシカルスコープはもう少ししたら標準で使えるようになりますが、今でもマクロで擬似的に利用可能です。モジュール名前空間がないので、お行儀良くするには C のように関数変数に接頭辞をつける必要があります。末尾再帰最適化、リーダーマクロが無く、組み込みの構造体、OOP支援、パターンマッチ、正規表現リテラルはありません。CLの機能をエミュレートするclマクロ集が標準で付いています。

実行環境やライブラリは、もともとエディタなので文字列処理系が強いです。日本語も含めて各種文字コードをある程度まともに扱えます。正規表現、ファイルIO、外部プロセスネットワーク、日付・時刻、その他基本的な処理は大体そろっています。また、HTTP通信、非同期、OOPXMLJSON関係などの最近流行っているような機能のライブラリもそろっていますし、EmacsWiki等を探せばいろいろみつかります。スレッドのサポートは無いので、Node.jsのようにシングルスレッドの非同期プログラミングを駆使します。PerlCPANRubyGEMのようなパッケージ管理がいくつかあるのですが、まだ決定的なものが無いような状況です。

GUIについてですが、一般的なメニュー、マウスでのコンテキストメニューツールバーがあります。画面に画像も表示できますが、現バージョンではEmacs内でサイズの調整が出来ないため、ImageMagickなどを使って自前でサイズを調整する必要があります。ボタン、入力フィールドなどの一般的なGUI部品はありますが、使いこなすにはちょっと癖があります。さらに、ウインドウという表示領域を区切る仕組みがあり、基本的にどのようにウインドウを区切るか、またどのバッファを表示するかはユーザー側が決めるような仕組みになっています。このように、GUIまわりはテキストエディタ由来なので癖のある挙動になります。

Emacsならではの非常に強力な機能としては、日本語migemo検索(migemoは別途インストール必要)とAnythingインタフェースが挙げられます。これらを使うためだけでも実行環境としてEmacsを選ぶ価値があります。

開発環境としては一通りそろった Emacs があります。REPLアウトライン、補完、ドキュメント参照、定義ジャンプ、デバッガなど、必要なものは大体全部そろってます。


こうやってみると良いのか悪いのか微妙ですが、スペックとしては悪くない方だと思います。結構みんなが困っているのは名前空間レキシカルスコープが無いことでしょうか。個人的にはDBとの接続が欲しいです。あと、ESGI/Elackとか出来た日には、Emacs LispでWeb開発が始まると思います。

それぞれの環境には一長一短があるので、Emacs Lispを使うかどうかは、やりたいことと困ることのトレードオフで決めればいいかなと思います。

ワークフローとEmacs

アプリにはそれぞれ想定するユースケース(利用状況)があります。一般的にはワークフロー(業務手順)の一部がユースケースに当てはまり(もしくは当てはめて)、そこでアプリを利用することになります。ワークフローによっては、いくつかのアプリを組み合わせる必要が出てきます。このとき、これらのワークフローを支援するアプリ達がうまく繋がれば作業効率が上がります。

例えば、BacklogRedmineなどのいわゆるBTSでは、単なる課題を管理するWebアプリだけでなく、通知用のメール、ドキュメントとしてのWikiSubversionGitなどのVCSを、課題情報を中心にうまく接続することで、よくある開発チームのワークフローをサポートして効率を上げることが出来るようになっています。

同様に、Emacsでも各種アプリを自分のワークフローに合うように接続することで、自らの生産性を向上させることが出来ます。その鍵となるのが情報が集まるツール、つまりメモアプリコミュニケーションアプリ(メール、SkypeIRCTwitterなど)です。Emacsにはメモやコミュニケーションなど、知的活動を支援する数多くのアプリがあります。これらのアプリを自分のワークフローに合うように組み合わせることで、効率的な作業環境を実現することができます。

ということで、Emacs上で知的活動が完結するように、必要なアプリを開発することは十分な動機になると思います。

引きこもり、変態、あるいはユートピア

以上のようなことを書くと、「ひきこもり」「変態」と言われるわけです。しかしながら、個人の情報管理・コミュニケーションを単体でサポートするツールはたくさんあるのですが、それらを自分のワークフローに合うように組み合わせてカスタマイズしていける環境はあまりありません。

自分の乗り換え用として、また他人に勧めるために、Emacsに限らず今も探しているところです。

大昔は、システム手帳を使っていました。すごく良かったです。でも、検索できないことで困ってました。また、年が変わる時期の物理的な制約も気になってました。その後は何台かPDAを使っていました。これらもすごく良かったのですが、PC上のメールが多くなり始めてから、PCとPDAでデータが分かれてしまうことが気になっていました。そのあとしばらくいろいろ試行錯誤の結果、Emacsに全部まとめる方法に落ち着きました。howm最高です。

Outlookはメールだけではなく、アドレス帳(名刺管理)、スケジュール、タスクメモ帳などの一通りの機能がそろっています。GNOME だと Evolution があります。これらは普通の人が普通に使うには良いと思います。しかしながら、個人的には常用するには至りませんでした。機能やスペックは良いのですが、ヘビーに使うと細かいところで不便なところがたくさん出てきたり(特にパフォーマンスやUIに不満がある)、データの再利用などカスタマイズが難しいところが難点です。

Web上のサービスにも情報を管理するツールはたくさんあります。最近は、技術向上によりWeb上で出来ることが増えてきたり、スマートフォンからも使えるようになってきたことから、今後はローカルではなくクラウドで使うことが普通になりそうです。Evernoteを中心にして、周辺にエコシステムが形成されているのが良いですね。ただ、現在の自分の仕事のスタイルとしてオフライン(客先や移動中など)で使えないと困ることから、まだ様子見で止まっています。

いろいろな環境がありますが、すべてを一つの環境に統合して便利にしようという方向はそれぞれ一緒だと思います。なので、何かを我慢して既存のアプリを使うか、Emacsで自分でカスタマイズしながら頑張るかの違いでしかないと思います。

いろいろ脱線しましたが、要するにEmacsが最高と言いたいんです。

まとめ

すでにEmacsを使っているような人向けに、migemoとAnythingを使うようなツールで、メモやコミュニケーションツール自体やそれらと連携できるようなアプリを開発するのには、大変すばらしい実行環境だと思います。

間違いありません。