GNOME Do の PPA を作った

前回、GNOME Do のmigemo対応をやってみたのですが、ついでなのでPPAでパッケージを作ってみました。
Ubuntu Maverick(10.10) と Natty(11.04) の人はこれを使うと簡単に導入できると思います。

導入方法

以下のコマンドを入力します。オレオレ認証のkiwanami鍵とPPAリポジトリの場所が入りますので、信用できない人はやめておきましょう。(2011/07/02 訂正 apt-key を書き間違えていましたので修正しました。@mori_devさんありがとうございます。)

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4009F8ED 26D9017F
$ sudo add-apt-repository ppa:m-sakurai/ppa1
$ sudo apt-get update

後は、apt-get でインストールするだけです。もちろん、synapticやソフトウエアセンターで入れてもかまいません。

$ sudo apt-get install gnome-do

依存パッケージとして cmigemo も入ります。 cmigemo の辞書は /usr/share/migemo に入りますので、Emacs 等で設定して使うことも出来ます。

既に入っている人は、おそらくアップグレードするかどうか尋ねられると思いますので、アップグレードするとPPA の GNOME Do が入ると思います。

GNOME Do 自体のバージョン表記は変更していないので、ちゃんと入ったかどうか確認するには「kagi」や「settei」とか入力してみてください。日本語がヒットしていればmigemoが動いています。

Ubuntu(debian)パッケージについて

以下は作業のメモなどです。debian パッケージは初めて作ったのですが、やはり各種多様なビルドをこなすだけあって、なかなか最初は理解が難しかったです。多分、経験者に師事して習ったりつっこんでもらいながら慣れていくものなのかなと思いました。しかしながら、理解していくうちにパッケージやlaunchpadの仕組みが非常に良くできていると思いました。

参考にした情報

検索するとそれなりに情報が見つかったのですが、debianパッケージ自体が進化していたり、ツールやパッケージの作り方が複数存在するため、どこを見ても違うことが書いてあるように感じました。結局、本家の情報を読むことが一番だったような気がします。

  • Debian New Maintainers' Guide
    • debianパッケージの本家マニュアル。汎用的に書いてあるのでいきなりは理解しづらい。
    • 突然 dh_make, quilt が出てくる
    • dquilt はここの設定をそのまま使った
  • The Ubuntu Packaging Guide 日本語版
    • Ubuntuパッケージの本家ドキュメントの日本語訳。
    • Hardy頃の情報で古いらしいけども一番参考になった。
    • ここで dh_make は devhelper だと言うことが分かった。CDBSはまだよく分からない。
    • こっちは dpatch を説明していて、ここでやっとパッチの管理方法にもいくつか方法があることが分かった。quiltが楽。

憩いの場さんのPPAにも cmigemo があったことを先ほど知りました。。。

作業メモ

以下は適当な作業メモです。突っ込み所があれば是非教えてください。

C/Migemo

ダウンロードと下準備

$ wget http://cmigemo.googlecode.com/files/cmigemo-default-src-20110227.zip
$ unzip cmigemo-default-src-20110227.zip
$ mv cmigemo-default-src cmigemo-20110227
$ tar zcvf cmigemo-20110227.tar.gz cmigemo-20110227

dh_make する

$ tar zxvf cmigemo-20110227.tar.gz
$ cd cmigemo-20110227
$ dh_make -e (mail address) -f ../cmigemo-20110227.tar.gz
 -> s / single を選ぶ

PPA なので省略

$ cd debian
$ rm -f README.Debian README.source *.ex *.EX

changelog, control, copyright, rules を編集する。

パッチを作る

$ cd ..
$ dquilt new fix-limit.patch
$ dquilt add src/wordbuf.c
$ vi src/wordbuf.c
   -> include <limits.h>
$ dquilt refresh
$ dquilt header -e
   -> fix an undefined symbol error.
$ dquilt new fix-makes.patch
$ dquilt add dict/dict.mak
$ vi dict/dict.mak
   -> gcc-dict: + utf-8
$ dquilt add Makefile
$ vi Makefile
   -> default: gcc-all
   -> install: gcc-install
$ dquilt add config.mk
$ vi config.mk
   -> /usr/local -> $(DESTDIR)/usr
   -> qkc -> nkf
$ dquilt refresh
$ dquilt header -e
   -> migemo patch

パッケージをビルドする

$ debuild -S -sa -k4009F8ED
$ sudo pbuilder build ../cmigemo_20110227-1.dsc

問題なければ dput でアップする。

GNOME Do

Maverick版は dpatch でパッチを作ってるので、既に入っているパッチの続きでパッチ作成。

ちなみにNatty版はquiltに変わっていた。

  • control の修正
    • Maintainer を自分に変更
    • cmigemo を依存に追加
    • ドキュメントを少し更新
  • copyright に追加
  • changelog に追加
    • version を修正
      • Maverick : 0.8.3.1+dfsg-2ubuntu1-migemo1
      • Natty : 0.8.4-0ubuntu2-migemo2

.pbuilderrc に PPA 追加してパッケージビルド。良ければ dput。

dput してビルド失敗したら、修正してバージョンを上げてアップし直す。

Backlog拡張:autofilter 更新

Backlogのautofilter(GreaseMonkey拡張)を更新しました。(v0.4.0)
カスタムフィールドの対応と要望の多かった簡易集計機能の追加です。

インストール方法

既に入っている人は、自動的にアップデートされるはずです。

新規でインストールする場合は、FirefoxGreaseMonkeyを入れて、以下のリンクをクリックしてインストールしてください。

AutoPagerizeはBacklogを使うページでは除外しておいてください。(GMのユーザースクリプトの管理画面で、AutoPagerizeの「ユーザースクリプトを実行しないページ」にて「*.backlog.jp/」のように指定。)

操作など

多分感覚で分かると思います。機能などについては以下の動画(4分くらい)にまとめました。



Backlog - autofilter デモ

  • 動画内容
    • 課題検索画面(普通のWebアプリの動き)
      • 次へ、状態で絞ったりソートする
    • AF 押す → autofilter起動
    • ヘッダ固定で上下スクロール
    • クリックで課題を別タブで開く
      • Ctrlを押しながら開けばどんどん開ける
    • インクリメンタルサーチ
      • リアルタイムにタスクのタイトルと本文を全文検索
      • 色、猫(変換)、backlog
    • ポップアップでタスクをチラ見
    • ヘッダクリックでソート
      • Excelで良くやる感じ
    • ヘッダクリックで絞り込み
      • Excelで良くやる感じ
      • ダブルクリックでクリア
    • タスクにチェックつけて、チェックつけたものだけ残す
    • 一括状態更新など
    • 表示カラム選択
    • 簡易レポート表示、クリックで広がる
    • 簡易Export機能

技術詳細

カスタムフィールド対応

先日、ユーザーが自由に項目を追加できるカスタムフィールドがBacklogに機能追加されました。

今回の対応では、素直にAPIから情報を取ってきて動的にカラム情報を組み立てています。
ついでに複数選択リストをまともに扱えるように修正しました。

余談ですが、実は当初のAutofilterにはカスタムフィールド機能がありました。もちろん当時はBacklog自体にはそんな機能がなかったため、タスク本文にカスタムフィールドをエンコードし、編集画面を動的生成するという方法を実装していました。こんな風に、GMだと欲しい機能を自分で追加できて便利です。今だったらChrome拡張の方が便利そうだと思います。

簡易集計

現在の絞り込み条件で集計を行う機能です。管理者的には、予実の時間合計が便利になるため、担当者間の調整や課題の整理に威力を発揮すると思います。

以下のルールで集計方法を決めています。

  • 数値だったら数値の合計と、入力されている項目数を数えます
  • 選択項目だったら各項目をカウントして多い順に並べます

もちろん、カスタムフィールドにも対応しています。

いろいろ

以前の記事でExcelタスク管理を駆逐するということを書きましたが、今もその気持ちは変わっていません。

少人数アジャイル的開発や、末端タスク消費者としてはBacklogは現状では非常に便利なのですが、中央集権的なプロジェクトで使う場合は管理者としての機能が不十分だと思っています。とはいえ、ASP型タスク管理ツールとしては他にはない良さと安定感がありますので、個人的には向かうところ敵無しな状態だと考えています。

個人的なブラウザ環境がChromeになってしまったため、今後はChrome拡張に移植したり、Chrome拡張で新しい拡張を作ろうと考えています。さすがにGreaseMonkeyで3600行は辛くなってきました。

あと、Backlogでは本体の改良を手伝ってくれるエンジニアを募集しているらしいです。腕に覚えがある人は是非参加してみたらいいと思います。

[emacs][ui] calfw の org-agenda 対応 calfw-org.el

(2011/07/25 追記: 設定方法が多少変わっていますので最新の記事を参照してください→[emacs][ui] Emacs用カレンダー calfw v1.2 リリース - 技術日記@kiwanami)

大変遅くなりましたが、要望の多かった org-mode の calfw 対応をしました。
(2011/06/20 追記:自分の知らなかったパターンが表示されないバグがありましたので calfw-org.el を更新しました。@takaxpさんありがとうございました!)

org-agenda の週表示を calfw で表示出来ます。



左が元の org-agenda 、右が calfw での表示

ついでに、1日に複数の予定があったときに正しく表示されない場合があるバグと、バイトコンパイルの問題で動かない場合がある問題の修正を行いましたので、今まで使っていた人も更新しておいた方が良いと思います。(バージョン v0.2)

インストール

新しくインストールされる方は、以前の記事も参考にしてみてください。

;; auto-installを使う場合
(auto-install-from-url "https://github.com/kiwanami/emacs-calfw/raw/master/calfw.el")
(auto-install-from-url "https://github.com/kiwanami/emacs-calfw/raw/master/calfw-org.el")

org-agenda をカレンダーで表示するには、 Emacs の設定ファイルの適当なところに以下のように2行加えます。

(require 'calfw-org)
(cfw:install-org-schedules) 

後は、 M-x cfw:open-org-calendar とすると、カレンダーで表示されるはずです。グローバルキーバインドに割り当てておけば、一発で開くことが出来て多分便利です。

簡単な使い方

カレンダーの中では以下のようなキーバインドが使えます。

日付移動
→, C-f, l 次の日へ
←, C-b, h 前の日へ
↑, C-p, k 前の週へ
↓, C-n, j 次の週へ
C-a, ^ 週の頭へ
C-e, $ 週末へ
[home] 月の初めへ
[end] 月末へ
[PgUp], < 前の月へ
[PgDown], > 次の月へ
t 今日へ
g 日付指定移動 (YYYY/MM/DD)
操作
SPC その日の予定の一覧をポップアップ(トグル)
r 表示更新
[予定クリック] orgファイルにジャンプ

これらは cfw:calendar-mode-map で定義されていますので、カスタマイズすることが出来ます。

スペースキーを押すと選択している日付の予定を一覧でポップアップします。再度スペースキーを押すと元に戻ります。(Mac の Quick Look のイメージ)
ポップアップの中で n,p を押すと前後の日付に移動できます。ポップアップの中のキーについては cfw:details-mode-map でキーバインドを調整できます。



その日の予定一覧 (Quick Look 的動き)

カレンダー上で予定をマウスでクリックしたり、このポップアップ一覧の中の予定をクリック、もしくはカーソールを移動してエンターを押すと、その予定の org ファイルを表示します。

主な使い方は以上です。

いろいろ

表示される予定は、 M-x org-agenda とやって a を押したときと同じものを出しているつもりです。*1

自分が org-mode のスケジュール機能を使わないのでこれで良いかちょっと分かっていません。誰かいいアイデアがありましたら教えてください。

現在の calfw は、まず作ってみて便利かどうか確認するというプロトタイプ的なものです。現在、拡張性を考えて設計・実装し直して、機能追加などを行っています。この新しい方では、表示期間を切り替えたり、表示内容をすぐに切り替えたり、もう少し便利になる予定です。

*1:実際には、そのあたりのコードをそのまま持ってきました。実装上、すごく遅いような気がしますが自分の所ではよく分かりません。とにかく org-mode のコードは大変でした。後先考えずに機能追加と改修を繰り返したようなコードになっています。逆に見れば、細かいところまで気の利いたツールとしてたどり着いたと言うことだと思います。

GNOME Do を migemo 対応にしてみた

GNOME Do というランチャーみたいなものがあります。

GNOME 上のただのランチャーであれば、標準の Alt+F2 でも悪くないのですが、 GNOME Do は Plugin によって Emacs の Anything のように拡張できると言うところがポイントです。最近開発が止まり気味ですが、端で見ている限りは、十分枯れていて、もうやることが無くなってきたと言う風に見えます。

大変便利なのですが、とても残念なことに検索に日本語が(ほとんど)使えません。また、日本語が使えない上に L10N な日本語アプリ名で検索しようとするため、ほとんどのアプリが GNOME Do から起動できません。自分は、どうしても GNOME Do から起動したいものは、 /usr/share/applications/ の中に入っているショートカットファイルをいちいち書き換えて使っていました。

アルファベットに最適化されたヒューリスティックなスコアリングアルゴリズムを使っており、さらにキー入力イベントで処理しているため、以前コードを調べたときには日本語化は無理かと思っていました。一応多言語対応として簡単な InputMethod の対応は入っているのですが、ほとんどの環境でうまく動かなかったり、動いたとしても変換の手間があるため、GNOME Do の素早く選んで実行するという良さが生かすことができません。

最近、CMigemoがC#から使えると知っていろいろ実験してみたところ、 Linux 上の Mono でも使えることが分かりました。ということで、強引に GNOME Do に組み込んでみました。結果、激しく便利になりました。

アプリケーションだけでなくあらゆるプラグインmigemo で検索可能になるため、設定、コンタクトリストや各種ファイル、PDFや楽曲名など、素早く絞り込んで開くことが出来ます。これで一気に生活が楽になりました。今まで Emacs の Anything でやっていたことが GNOME Do で出来るようになったため、早くも anything-books.el の地位が危うくなりました。

@kaoriya さんありがとうございます!!! あと、こういうことが簡単にできる Mono すごい!!!


以下、その作業のメモです。興味がある方は at your own risk でどうぞ。

migemo 対応作業メモ

Ubuntu 10.10 amd64 上での作業です。 11.04 でも人間パッチで同様に出来ると思います。

CMigemoのコンパイル、インストール

2011/06/23 追記:不正な正規表現で落ちるバグがありましたので修正しました。kazuさんご連絡ありがとうございます。)

下のサイトから、最新版ソースをダウンロードする。

$ unzip cmigemo-default-src-20110227.zip
$ cd cmigemo-default-src/
$ chmod u+x configure
$ ./configure
$ vi src/wordbuf.c
→ ヘッダーに #include <limits.h> を加える
$ make gcc
$ vi dict/dict.mk
→ gcc の項目で、 euc-jp に加えて utf-8 を追加
$ make gcc-dict
$ sudo make gcc-install

この中の tools/Migemo.cs を後で使うのでまだ消さない。

GNOME Do の修正、インストール

修正内容は https://gist.github.com/1021707 にまとめてあります。(2011/06/23 パッチ内容修正)

$ cp (さっきの cmigemo のディレクトリ)/tools/Migemo.cs .
$ wget https://raw.github.com/gist/1021707/0a8739105314a4d9f14d5956f01e4c90d4c40e77/gnome-do_0.8.3.1+dfsg-2ubuntu1-migemo.patch
$ sudo apt-get build-dep gnome-do
$ apt-get source gnome-do
$ ORGDIR=gnome-do-0.8.3.1+dfsg
$ cp Migemo.cs $ORGDIR/Do.Platform/src/Do.Platform/Migemo.cs  #2011/06/23 訂正
$ cd $ORGDIR
$ patch -u -p1 < ../gnome-do_0.8.3.1+dfsg-2ubuntu1-migemo.patch
$ dpkg-buildpackage -rfakeroot -uc -b
$ cd ..
$ sudo dpkg -i gnome-do_0.8.3.1+dfsg-2ubuntu1_amd64.deb

多分、これでコンパイルが通ってインストールできると思います。

ポイントは、 cmigemo の最新版を使って、さらに辞書を UTF-8 にすることです。

PPA とかにすると良いのかもしれませんが、ライセンス的に Migemo.cs をどうしていいのかよく分からなかったので、要望があれば考えようと思っています。

SKKを一日使ってみた

上の記事はDDSKKを使って書きました。人生幾度目のSKK入門です。以前(10年くらい前?)と比べて機能が豊富になって便利になっていました。頑張って1日使うことでかなり慣れてきて、最終的にはまあまあ満足できる速度で入力できるようになりました。

DDSKKの完成度は高いと感じました。操作性やEmacsとの親和性も非常にスムーズです。漢字変換や辞書についても、かなり思い通りの単語がヒットして気持いいです。単漢字変換でもhintを使うことで思い通りの漢字を出すことが出来てUIとしても興味深いです。

しかし、やっぱり自分には連文節変換のATOKが楽でいいなと思いました。まずShiftが多すぎますし、別のキーに替えたとしても打鍵数が多いです。思いついた単語を文節関係なくばーっとローマ字で入力して、送り仮名もカタカナも機械に任せてもっと人間は楽をしたいです。ATOKが無かったらSKK使うとは思いますが、多分自分で作りそうな気もします。

実は今、IIIMECFでモードレス入力の拡張*1を作っています。他のIMにも応用できるかなと思ってユーザーの多そうなSKKを試してみたのですが、SKKはもともと変換単位が短いのでモードレスとかプレビューとか必要なさそうだなということが分りました。

献本頂きました:良いコードを書く技術

かなり日が経ってしまいましたが、「良いコードを書く技術」の献本をいただきました。

良いコードを書く技術 ?読みやすく保守しやすいプログラミング作法 (WEB+DB PRESS plus)

良いコードを書く技術 ?読みやすく保守しやすいプログラミング作法 (WEB+DB PRESS plus)

個人的には大変いい本だと思っていますので、宣伝もかねて少しコメントしたいと思います。

対象読者

まずは、この本がターゲットとしている対象読者についてです。

ブログなどでよく見るようなWeb系企業だけでなくて、ぜんぜん表に出てこないようなSIerも含めたエンジニアの人口分布を考えてみます。自分のこれまでの経験から、以下のような分布になっているのではないかと考えています。



エンジニア人口の分布(想像):※軸の説明は本文参照

縦軸は技術レベルを表します。

  • A 一人で完結して仕事が出来る人
    • AA 自力でサービスまで作れる、勉強会スピーカー、未踏戦士とか
  • B 中間の人
    • B+ うまく伸ばせば伸びる人
    • B- うまく教えれば人並みに出来る人
  • C ※お察しください

横軸は意識レベルを表します。

  • 1 コードに魂を売った人
  • 2 勉強会にも積極的に出て上を目指したい人
  • 3 プログラミングは嫌いではないが、仕事以外の時間は楽しみたい
  • 4 そもそもプログラミングが嫌い

色が付いているところがエンジニアの人口の分布で、B3あたりにピークがあって、斜めに分布が広がっているイメージです。

なお、他にも独立な軸はいくつかある(例えば環境とか仕事力とか)と思いますので、この図は適当に射影したものだと考えてください。また、いくつかの企業やSIerの現場を見てきた自分の経験をもとにしていますので、もしかしたらみなさんの現場とは違うかもしれません。

この分布図の中で、赤っぽい部分(B3周辺)が対象読者です。



対象読者の分布(想像)

ちなみに、はてなの皆様(この記事を読んでいるような皆さん)は水色のあたりだと思っています。アウトプットし続けたり難しい本や技術に挑戦していて、かなりレベルが高いと思っています。はてなの皆様に限らず、Code Complete(や巻末の参考文献など)を読んだり、Amazonに積極的に書評を書くような人もこのあたりに入ると思います。

なので、この本は、この記事を読んでいるような皆さん自身にとってはかなり物足りない内容のはずです。期待して買ってがっかりされた人もおられるかもしれません。ごめんなさい。

しかしながら、新人教育やメンバーの底上げには丁度良い分量と内容になっていると思います。かなり頑張って計算して内容や章立てを組み立ててありますし、この正味200ページという分量にも意味があります。

先程の分布を仮定するとターゲットとなる読者数が多いため、少しの効果でも人数が多ければ全体的効果が高いと思います。特にエンジニアの人数の多い(何十人以上)組織にお勧めです。

抽象化

この本でもう一つ個人的に重要だと思っているテーマが抽象化です。抽象化には哲学が重要だと思っていて、その抽象化に対する哲学がこの本にはちょっとだけ含まれています。個人的には抽象化については「SICP読め」で終わってしまうのですが、なかなか現実はそうもいきません。

情報系の研究室の方々や関数型言語をやっている人達には考えられないと思いますが、現場(特にSIer)では「プログラマ」を100人集めたとき9割以上の人は再帰を使ったプログラムが書けません。クイックソートはもちろんバブルソートすら書けない人も多いです。そもそも抽象化以前のレベルではありますが、こういう現状はFizzBuzzのテストや迷路の試験などの結果からも裏づけられていると思います。*1

こういう抽象化以前の現状に対して、どのように抽象化とそのパワー、そして各自のスキルの目指すべき方向を伝えられるか、ということがこの本のひとつの目標でした。(自分は書いてないけど)

現場でよく行なわれている「単に似ているところをまとめるだけの抽象化」だけでは限界がある、でも「勤勉な人の繊細なシステム」を作るような人にもなって欲くない。後半ではそういう微妙なラインを狙って章立てをしています。上の図でB2-B3の人達が業務しか経験していないと全く見ることがないであろう(でも現場ですぐに使えそうな感じの)具体例やテクニックを並べています。(自分は書いてないけど)

arton 勤勉中の勤勉なという人が世の中にはいるわけ。勤勉には飽きたらずもっと勤勉な人。そういう人はねいろんなこと勉強するから、色んなこと知ってるわけ。そうすっと、その人のプログラムがちょっと走った後には、なぜか String#length が実際の長さの 100 倍の値が返ってくるとかさ、色んな事が起きそうだよね。
  :
arton Web 2.0 系はβだから良いんだよ。直せば良い。masuidrive さんが一人で一所懸命頑張って作ったシステムっていうのと、勤勉な人たちが 1000 人ぐらいなぜか中国やインドから人を集めて作ったシステムは、繊細さが違うんだよ、繊細さが (笑) あまりにも繊細なものだから、息吹きかけてもやばいわけ。
一同 (笑)
ささだ 角谷さんウケすぎ。
角谷 「勤勉な人たちの作った繊細なシステム」という表現がもう素晴らし過ぎて (笑) 思い当たることがたくさん……。
  :
(※ 引用の強調はkiwanamiの主観です)

この本の中で紹介した具体例を身に付けて欲しいというわけではありません。例示した内容を通して、「抽象化にはいろいろなレベルや方法があって、ちょっとしたテクニックでもすごい生産性が得られて早く家に帰れますよ。でも現場だけでは経験できないことが多いし無闇に使うと火傷するから、たくさん本や情報を得てバランスの良い選択をして欲しい。」ということが伝わればいいなと思っています。(自分は書いてないけど)

そこで興味を持ってもらった人には、ぜひ巻末の参考文献を取っ掛かりにして先に進んで欲しいです。

ということで、この本が多くの現場エンジニアに読まれて、少しでも現場の底上げに役立ってもらえるといいなあと祈念いたしまして、献本の謝辞にかえさせて頂きます。ありがとうございました。

*1:ただし逆に、現場の人はもっと重要な別のエンジニアリングがあります。例えば、業務知識の引き出し方・まとめ方・分割の仕方、部屋のレイアウト・クライアント配置・配線や電源も含めたインフラ整備、データ移行、システム導入計画や切り替えのマネージメント、稼動後の障害対応などなど挙げ始めるときりがありません。もちろん技術的スキル不足からブラックになっている現場も多々あるのですが、開発プロセスやテストコードやドメインなんとかの枝葉以前に、そもそも今から作ろうとしているシステムを一体誰が責任を持って稼動させるのかという視点が抜けているなあと思うことが多いです。そこがちゃんとしていれば多くの問題は解決するはずなのですが。すみません、余談が長すぎました。続きは別エントリでやるかもしれません。

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

はじめに

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

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

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

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

達成目標

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

  • 機能要件(目ため、動作)
    • ポインターがメインのディスプレイから連続的に移動できる
    • 表示中のウインドウも連続的に移動できる
    • ディスプレイの相対位置(上下左右)も自由に設定できる
  • 非機能要件(使い勝手)
    • 必要なときに動的につけたり外したり出来る
      • X再起動無しでディスプレイを拡張できる
      • 逆にディスプレイを停止してもアプリが死なない
    • 現在の GNOME や compiz の設定を変えたくない
前提

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

すべて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

  • 良いところ
    • X再起動必要ない
    • 導入しやすい、カスタマイズしやすい
  • 問題
    • 各ディスプレイのX環境が独立しているのでウインドウの移動が出来ない
インストール

必要なもの:

  • 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 が落ちるか、調子が悪くなります。

  • ウインドウの最小化
    • 別のウインドウを前面に出すのはOK
  • 他のワークスペースに切り替える
  • その他ウインドウの中身を非表示にする操作

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

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

感想

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

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

まとめ

以上、いろいろ試してみました。方法2の vnc4server を使う方法が楽で良いと思います。
将来 xrandr 対応 dummy ドライバが出来て、自由にウインドウが移動できるようになると良いなと思っています。

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


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