Xdg-utils

Xdg-utils は代表的なデスクトップ環境に対応しており、このツールを使えば異なる環境でもデスクトップ関連の操作を同じインターフェイスで扱うことができる。

Xdg-utils にはインストールに関連したツールの他にも以下のツールが含まれている。

  • xdg-open
  • xdg-email
  • xdg-screensaver

これらのコマンドの実体はシェルスクリプトであり、それぞれのコマンドの役割は上から順に

となっている。バージョン1.0.2の場合、内部で使われているコマンドは次の通りである。

Xdg-utils KDE GNOME Xfce
xdg-open kfmclient exec gnome-open exo-open
xdg-email kmailservice gnome-open exo-open
xdg-screensaver dcop kdesktop KScreensaverIface gnome-screensaver-command

ただし、スクリーンセーバーに関しては、KDEGNOME 環境ではない場合、xscreensaver-command がインストールされていれば、xscreensaver-command が使われる。

Xdg-utils では環境変数に応じて、使われているデスクトップ環境が検出される。具体的には

  1. KDE_FULL_SESSION が true ならば KDE
  2. GNOME_DESKTOP_SESSION_ID が設定されていれば GNOME
  3. xprop -root _DT_SAVE_MODE から得られた出力の最後が「 = "xfce4"」になっていたら Xfce

と判定している。この検出結果に基づいて上記の表におけるコマンドの中から適切なものが使われる。ただし、dcop は KDE3 までのコマンドであり、KDE4環境ではうまく動作しないかもしれない。

なお、kfmclient exec に似た KDE のコマンドとして kde-open がある。

Xdg-utils のコマンドの中には OpenSUSE10.0に対する workaround なども含まれるため、 Xdg-utils が使える環境では、直接 kfmclient や gnome-open を呼ぶよりもこれらのコマンドを使った方がよい。

基本的な使い方は以下の通りである。

xdg-open の場合

$ xdg-open 開くファイルまたは URL

例えば

$ xdg-open ~/foo.txt
$ xdg-open http://example.com/

xdg-email の場合

$ xdg-email 宛先のメールアドレスまたは URI

例えば

$ xdg-email foo@example.com
$ xdg-email mailto:foo@example.com

この Xdg-Utils を使っているライブラリに Qt がある。Qt 4.4.1 の QDesktopServices クラスの openUrl() では

  • 引数で与えた URL のスキームが file ならば openDocument()
  • それ以外ならば launchWebBrowser()

を呼んでいる。X11 版ならば、二つの関数の実装は qdesktopservices_x11.cpp で行われている。

URL の検証後は、以下のように処理される。

ドキュメントの場合は

  1. xdg-open を実行
  2. 失敗したら
  3. 失敗したら、メジャーなブラウザを起動

ドキュメント以外の場合は

  1. スキームが mailto の場合はドキュメントのときと同じ処理をする
  2. xdg-open を実行
  3. 失敗したら、環境変数 DEFAULT_BROWSER に指定されているブラウザを起動する
  4. 失敗したら、環境変数 BROWSER に指定されているブラウザを起動する
  5. 失敗したら
  6. 失敗したら、メジャーなブラウザを起動

となる。

つまり、Xdg-utils がインストールされていれば xdg-open で URL が開くことになる。

Canon PIXUS MP610 を Linux から使う

以下では主に DebianディストリビューションCanon のプリンタ MP610 を使う方法を示す。

まず、Canon のウェブページからファイルをダウンロードする。MP610 の場合、PIXUS iP3500 / PIXUS iP4500 / PIXUS MP520 / PIXUS MP610 共通のパッケージと MP610 固有のパッケージ、そしてインストール方法が書かれた操作説明書の三つのファイルをダウンロードする。

まず、コンピュータとプリンタを USB ケーブルでつないでおく。

ダウンロードした二つのパッケージをインストールする。コンソールから行う場合は以下の用になる。だたし、xは数字であり、ダウンロードしたパッケージの名前に応じて変える。私がインストールしたファイルは1だった。

$ sudo dpkg -i cnijfilter-common_2.80-x_i386.deb
$ sudo dpkg -i cnijfilter-mp610series_2.80-x_i386.deb

あるいは、ダウンロードしたパッケージをパッケージマネージャで開くことでもインストールできる。RPM 系ならば rpm -ihv を使えばよい。

CUPS を再起動する。以下に示すように、/etc/init.d/cupsys がない環境では、代わりに /etc/init.d/cups を入力する。

$ sudo /etc/init.d/cups restart

操作説明書に記載されているインストール方法では、この次に

$ sudo /usr/sbin/lpadmin -p MP610 -m canonmp610.ppd -v cnij_usb:/dev/usblp0 -E

をやるとされているが、私の環境では

lpadmin: Unable to copy PPD file!

と出た。

CUPS のエラーログ /var/log/cups/error_log を見ると

E [19/Jun/2009:06:55:17 +0900] [cups-driverd] 
Unable to open "/usr/share/cups/model/canonmp610.ppd" - 
No such file or directory

のようになっている("/usr/share/cups/model/canonmp610.ppd" が見つからないと言っている)ので、シンボリックリンクを張る。具体的な張り方は後述する。

このエラーログの最後の部分は

$ tail /var/log/cups/error_log

で見ることができる。

また、Firefox などのウェブブラウザからもエラーログを見ることができる。具体的には

  1. http://localhost:631/ をウェブブラウザで開く
  2. 「管理」タブをクリックして管理ページを開く
  3. 「サーバ」という項の「エラーログを表示」ボタンをクリックする

という手順で見ることができる。なお、http://localhost:631/からはエラーログを表示させる以外にも、CUPS に対する様々な操作が行える。認証ダイアログが出た場合、

  • root のパスワードが設定されている環境では、ユーザ名として root、パスワード として root のパスワード
  • Ubuntu のように設定されていない環境では、ユーザ名として sudo を実行できるユーザ名、パスワードとしてユーザのパスワード

を入力すればよい。

閑話休題シンボリックリンクを張る前に /usr/share/cups/model/ というディレクトリがあるかどうかを確認する。なければ、ディレクトリを以下のようにして作る。

$ sudo mkdir /usr/share/cups/model

cnijfilter-mp610series_2.80-x_i386.deb をインストールすると

$ dpkg -L cnijfilter-mp610series | grep canonmp610.ppd
/usr/share/ppd/canonmp610.ppd

から /usr/share/ppd/canonmp610.ppd がインストールされていることが分かり(RPM 系ならば dpkg -L の代わりに rpm -ql を使えばよい)、エラーメッセージに/usr/share/cups/model/canonmp610.ppd とあるので、シンボリックリンクは以下のようにして張る。

$ sudo ln -s /usr/share/ppd/canonmp610.ppd /usr/share/cups/model/

以上をやった上で再び

$ sudo /usr/sbin/lpadmin -p MP610 -m canonmp610.ppd -v cnij_usb:/dev/usblp0 -E

を行うと、今度は

lpadmin: Bad device-uri "cnij_usb:/dev/usblp0"!

というメッセージがコンソールに出る。

このエラーの原因は lpadmin が cnij_usb をうまく扱えないことにあると考えられる。

そのため代わりに、一旦

$ sudo /usr/sbin/lpadmin -p MP610 -m canonmp610.ppd -v usb:/dev/usblp0 -E

とする。すなわち cnij_usb を usb で置き換える。

その後、/etc/cups/printers.conf を編集する。Vim で編集する場合は

$ sudo vim /etc/cups/printers.conf

となる。ここでは Vim を選んだが、好みに応じてテキストエディタ vimemacs、gedit や kate 等に変えても構わない。

テキストエディタで /etc/cups/printers.conf を開くと

DeviceURI usb:/dev/usblp0

という行があるので、コメントアウトする(行の最初に # を加える)か削除し、

DeviceURI cnij_usb:/dev/usblp0

という行を追加する。

以上の作業が終わったら、再び CUPS を再起動する。

$ sudo /etc/init.d/cups restart

MP610 に限らず Linux 環境でプリンタを使うときは用紙サイズの設定が適切か(日本では、多くの場合 A4)確認しておいた方がよい。用紙サイズが例えば、Letter になっていたりすると「用紙がありません」「用紙不足」といったメッセージが出て印刷できない。Firefox の場合、メニューの「ファイル(F)」->「ページ設定(U)...」から用紙サイズの確認/設定ができる。また、プリンタオプションは

  1. http://localhost:631/ をウェブブラウザで開く
  2. 「プリンタ」タブをクリックして管理ページを開く
  3. 確認/設定したいプリンタの「プリンタオプションの設定」ボタンを押す

という手順で表示されるページから行える。

Krazy

KrazyKDE アプリケーション向けのソースコードチェッカーである。C++Perl で実装されている。

ソースコードThe KDE Source Repository から取得する。Anonymous SVN で取得するには Getting Started/Sources/Anonymous SVN を参照すれば分かるように

$ svn co svn://anonsvn.kde.org/home/kde/trunk/quality/krazy2/

でチェックアウトできる。

チェックアウトしたら、ディレクトリを移動して

$ cd krazy2

install.sh を実行する。

$ ./install.sh /path/to/install

./install.sh で引数として与えるパスは、krazy2 のインストール先である。./configure で --prefix オプションに与えるパスに対応する。実行可能ファイル krazy2 が ./install.sh の引数で指定したディレクトリ(指定していなければ /usr/local)内の bin ディレクトリにインストールされる。つまり、一般的な Unix のソフトウェアにおける ./configure --prefix=/path/to/install && make && make install に対応する。

これで krazy2 のコンパイルとインストールが行われる。コンパイルには Qt4 以外にもいくつかの Perl ライブラリが必要である。必要なライブラリがインストールされていないとき、例えば以下のようなエラーメッセージが出る。

$ ./install.sh /path/to/install
MakeMaker FATAL: prerequisites not found.
    Tie::IxHash not installed
    XML::LibXML not installed

このようなメッセージが出たら、指摘されているライブラリを探してインストールする。

Krazy は krazy2 コマンドの引数にファイルを指定して使う。チェックしたいファイルが /path/to/file と /path/to/another/file の場合、krazy2 のあるディレクトリにパス ($PATH) が通っていれば

$ krazy2 /path/to/file /path/to/another/file

となる。従って find コマンドと組み合わせれば、/path/to/dir 以下にある拡張子が cpp または h のファイルを以下のようにして調べられる。

$ krazy2 `find /path/to/dir -name '*.cpp' -or -name '*.h'`

C/C++ のソースファイルの他、デスクトップエントリファイル (.desktop)、Qt Designer が生成するファイル (.ui) や KDE 関連のファイルを調べられる。

ファイル形式ごとにテスト項目が決められており、--extra オプションでテスト項目を追加でき、--exclude オプションで外すことができる。例えば camelcase と defines を追加し、qclasses を外すときは

$ krazy2 --extra camelcase,defines --exclude qclasses /path/to/file

となる。C++ソースファイルのコメントにディレクティブを追加することにより、ファイル単位や行単位で制御することもできる。

//krazy:skip

は、ファイル全体ですべてのテストを飛ばし

//krazy:excludeall=inline

は、ファイル全体で inline 項目のテストを行わないようにし

//krazy:exclude=inline

は、コメントした行で inline 項目のテストを行わないようにする。

指定された項目だけをテストするときは --check オプションを使う。例えば、includes だけを行うときは

$ krazy2 --check includes /path/to/file

とすればいい。テスト項目の一覧は

$ krazy2 --list

で見ることができる。

出力形式は、テキスト や XML などから選ぶことができ、--export オプションで指定する。XML 形式で foo.xml に出力する場合は以下のようになる。

$ krazy2 --export xml /path/to/file > foo.xml

このプログラムは KDE アプリケーションのソースファイルを想定して作られているが、qclasses といったテスト項目を外すことで、単なる Qt アプリケーション向けのソースコードチェッカーとしても使える。

32bit PowerPC におけるカーネル構築

32ビット PowerPC のマシンにインストールした Gentoo Linuxカーネルコンパイルし、アップデートする方法を示す。x86AMD64 の場合とは主にブートローダに対する操作が異なる。

Gentoo Linux Kernel Upgrade Guidex86 を前提として書かれており、適宜読み替えが必要となる。

32ビット PowerPC 環境でのカーネルのアップグレードを行う際は、基本的に
Gentoo Linux PPC Handbook を参考にすればいい。ハンドブックでは複数の方法が記述されているが、ここではその中で最も一般的な方法を選んでいる。

まずは、7. Configuring the Kernel を参照し、カーネルのソースをアップデートする。Gentoo なので当然 emerge コマンドを使う。

# emerge -u gentoo-sources

言うまでもなく、プロンプトの `#' は root で実行するという意味である。それに対して `$' や `%' は一般ユーザを示す。

そして、ソースをインストールした場所へ移動する。

# cd /usr/src/linux

その場所で

# make pmac32_defconfig

を実行し32ビット PowerPC 向けに設定する。

必要ならば

# make menuconfig

で設定を変える。問題なければ、これを行わなくても構わない。

そして、コンパイルする

# make && make modules_install

できあがったカーネルイメージを /boot ディレクトリの下にコピーする。

例えば、AppleIBM のマシンならば

# cp vmlinux /boot/kernel-2.6.28-gentoo-r5

となる。

Pegasos ならば

# cp arch/powerpc/boot/images/zImage /boot/kernel-2.6.28-gentoo-r5

になるらしい。

ここではカーネルのバージョン (2.6.28-gentoo-r5) に基づいてファイル名を kernel-2.6.28-gentoo-r5 としたが、まったく別の名前でも構わない。

自動的に読み込むカーネルモジュールを設定する。2.6 系のカーネルならば /etc/modules.autoload.d/kernel-2.6 に編集すればよい。今使っているカーネルと設定が同じならば、何もする必要はない。

ここからは 10. Configuring the Bootloader を見ながら、作業することになる。

ブートローダとして yaboot を使うことにする。GRUB は GRUB2 になってから PowerPC に対応したが、今のところ GRUB2 の安定版は出ていないので使わない方がよい。ただし、Open Firmware に詳しい人はこの限りではない。

yabootconfig で yaboot の設定を行う。Gentoo Linux インストール時とは異なり、オプションに --chroot /mnt/gentoo を付けない。

# yabootconfig
yaboot is the Linux Loader for PowerPC.  yabootconfig sets up your system to boot directly
from your hard disk, without the need for a boot CD, floppy or a network boot.
Install yaboot bootstrap on /dev/hda2 to boot Linux from /dev/hda4? [Yes] y
Creating a simple /etc/yaboot.conf...
yabootconfig: Cannot find a kernel, please provide one
Enter path to a kernel image: /boot/kernel-2.6.28-gentoo-r5
Enter path to an initrd image (hit Enter for none):
Running mkofboot to make the disk bootable...
Done

上ではユーザからの入力を太字で表している。yabootconfig を起動するとパーティションについて聞かれる。確認して問題なければ y を入力する。次に、カーネルイメージの場所について訊かれるので、先ほどの cp コマンドで最後の引数として渡した場所(この場合は /boot/kernel-2.6.28-gentoo-r5)を入力する。最後に initrd イメージの場所が訊かれるが、指定せず単に Enter (Return) キーを押すだけでいい。

ブートローダの設定が終わったら再起動する。

# reboot

新しいカーネルで起動されたかを確認するには uname コマンドを使えばよい。

$ uname -r

ビープ音を消す

Firefox のページ検索で、検索した単語が見つからなかったときなどに鳴るビープ音は耳障りなことがある。以下ではビープ音が出ないようにする方法について扱う。

結論から言えば、 xset コマンドを使えばよい。

b オプションはベルの音量、音程、持続時間を制御する。このオプションには 3 つまでの数値パラメータを指定するか、ハイフン(-)を前に付けるか、'on/off' のフラグを指定できる。パラメータが指定されない場合や 'on' フラグが使用されるとシステムのデフォルト値が使用される。ハイフンまたは 'off' が指定されるとベルが切られる。数値パラメータを1つだけ与えると、ベルの音量が設定される。この値は最大値に対するパーセント値として指定する。同様に、2番目の数値パラメータにはベルの音程をヘルツで指定し、3番目の数値パラメータには持続時間をミリ秒で指定する。全てのハードウェアでベルの特性を変更できるとは限らない点に注意すること。X サーバはユーザの指定にできるだけ近い設定を行う。

http://xjman.dsl.gr.jp/man/man1/xset.1x.html

つまり、コンソールから

$ xset -b

とすれば、ビープ音が出なくなる。しかし、これではログインする度にコマンドを実行することになる。

一々コマンドを実行しないで済むようにするには、以下の内容のデスクトップエントリファイルを作成する。つまり、テキストエディタを開き、以下の内容をコピペして、例えば xset.desktop といったファイル名で保存すればよい。保存先は[id:mnogu:20090523]に書いた通りである。

[Desktop Entry]
Type=Application
Name=xset
Exec=xset -b
StartupNotify=false

起動してもパネルに表示されないようにするため、StartupNotify を false にしている。

他にも、ログインする際、自動的に実行するようにする方法としては ~/.xinitrc や ~/.xprofile に上記コマンド行を追加することも考えられる。ただ、この方法は X のバージョンによってはうまくいかないことがある。

Ubuntu Linux では

$ sudo rmmod pcspkr

とすればよいが、他のディストリビューションで使えないことがある。更に、この方法だと root 権限がないと使えない。また、全ユーザでビープ音が出なくなってしまう。

Desktop Application Autostart Specification

Desktop Application Autostart Specification
http://standards.freedesktop.org/autostart-spec/latest/

Desktop Application Autostart Specification にはアプリケーションの自動起動についての仕様が書かれている。

ユーザ毎の自動起動ディレクトリは

  • 環境変数 XDG_CONFIG_HOME が設定されている場合、$XDG_CONFIG_DIRS/autostart/
  • 設定されていない場合、~/.config/autostart/

である。このディレクトリ内にデスクトップエントリファイル(id:mnogu:20090517 参照) を置けば、ログイン時にアプリケーションが自動起動するようになる。自動起動ディレクトリを調べるには、Bash の場合コンソールから以下のコマンドを実行すればいい。

$ echo ${XDG_CONFIG_HOME:-~/.config}/autostart/

私の調べた環境ではいずれも ~/.config/autostart/ だった。

ただし、KDE では上記のディレクトリにファイルを置いても起動しないことがある。起動しないときは、~/.kde/Autostart/ に置けばよい。KDE4 では「システム設定」->「詳細」タブ->詳細なユーザ設定の「Autostart」で自動起動を設定できるし、設定を確認することもできる。

Desktop Entry Specification

Desktop Entry Specification
http://standards.freedesktop.org/desktop-entry-spec/latest/

デスクトップエントリファイルは

などのデスクトップ環境でメニューを表示する際に使われる。拡張子はdesktopである。

上記仕様書にあるA. Example Desktop Entry Fileから、ファイルの例を引用する。

[Desktop Entry]
Version=1.0
Type=Application
Name=Foo Viewer
Comment=The best viewer for Foo objects available!
TryExec=fooview
Exec=fooview %F
Icon=fooview
MimeType=image/x-foo;
X-KDE-Library=libfooview
X-KDE-FactoryName=fooviewfactory
X-KDE-ServiceType=FooService

上を見れば分かるようにキーと値が"="でつながれている。

必須のキーは Type と Name である。Type には

  • Application
  • Link
  • Directory

のどれかを指定し、Name には文字通り名前を指定する。日本語名を指定するならば、

Name[ja]=Foo ビューア

となるだろう。ファイルの文字コードUTF-8 にすればよい。

アプリケーション (Application) の場合、Exec キーも必須で値にはコマンドが入る。

リンク (Link) の場合、URL キーも必須で値にはアクセスする URL が入る。

必須のキー以外にも、いくつかのキーがある。上記の例にあるものでは

  • Version は仕様のバージョンで今のところ最新が1.0。
  • Comment はアプリケーションの説明文。
  • TryExec はプログラムの実行可能ファイルで、プログラムが実際にインストールされているのかを調べるためにある。なければ、メニューなどに表示されない場合があるらしい。
  • Icon は表示に使うアイコン
  • MimeType はアプリケーションがサポートする MimeType
  • X-KDE で始まるキーは KDE による拡張

他にもキーがあり、例えば StartupNotify キーを false にした場合、起動してもパネルなどに表示されなくなる。仕様書のRecognized desktop entry keysにキーが解説されている。

インストールする場所は /usr/share/applications 以下になっていることが多い。OpenSUSE でデスクトップエントリファイルをインストールする場合、spec ファイルで %suse_update_desktop_file を使う。

作成したデスクトップエントリファイルに問題がないかを調べるには desktop-file-validate を使えばよい。