KDE developer のための FAQ

これは http://developer.kde.org/documentation/other/developer-faq.html を訳したものです。

一般的な質問

新しいアプリケーションを書き始めたいのですが、何かアドバイスはありますか?

新たに書かなければいけない KDE アプリケーションがたくさんあるのは間違いありません。しかし、 あなたの助けを必要とする既存の KDE アプリケーションがたくさんあるのも確かです。

どの分野に助けが必要か知るには、このページをチェックしてください。

新しいアプリケーションを書き始める前に、apps.kde.comkde-devel@kde.org のメーリングリストで、誰かが似たようなプロジェクトをしていないかどうか確かるのは良いことです。

私は開発者です。どうすれば KDE に貢献できますか?

job list でオープンな仕事をチェックして下さい。あなたができる仕事は必ず1つはあるでしょう。

KOffice や Kdevelop などは高く評価されているにもかかわらず、開発者がとても少ないです。ですからそのあたりをチェックすると良いかも知れません。KDE のプロジェクトを手助けするのに、KDE のコアの開発者になる必要はりません。KDE は非常にうまくモジュール化されているので、全体のシステムがどうなっているか知らなくても、1つの分野を改良することができます。

また、kde-devel メーリングリストで、誰かがアプリケーション上での手助けを必要としているか質問することができます。

最新の KDE を使い必要とされていることを見付けて下さい。テーマジェネレータですか?konsole のスキーマエディタですか?ゲームの改良ですか?いつも小さな特徴が抜けているものです。実装してしまいましょう。

特定の分野に関してくわしかったり、興味があったりしますか?あなたの手助けが役に立つその分野に関連するアプリケーションがないかチェックして下さい。もしくはそのようなアプリを書いて下さい。KDE はおたく向けではないアプリケーションをもっと必要としています。

私は開発者ではありません。どうすればお手伝いできますか?

開発者のスキルを必要としない仕事がたくさんあります。KDE の促進のためにアプリケーションのレビューを書いたり(kde-promo メーリングリストを見て下さい)、ドキュメントチームを手伝ったり(i18n.kde.org/doc を見て下さい)、翻訳を手伝ったり(i18n.kde.orgを見て下さい)、新しく出てくるバグをフィルタリングするのを手伝って下さい(bugs.kde.org を見て下さい)。

Konqui dragon の画像はどこで手に入れることができますか?

ftp://ftp.kde.org/pub/kde/devel/konqi_sdk.tar.bz2 で入手可能です。

KDE に貢献するのに必要なスキルのレベルはどの程度ですか?何を学んでおくべきですか?何を読んでおくべきですか?

C++ について知っている必要があります。Qt で何が可能か知るためにQt tutorials を読み、 Qt docs を拾い読みしてください。そして、KDE tutorials を読んで、アーキテクチャやドキュメントを斜め読みしてください。また KDE Book を読んでも良いかも知れません。害にはなりません。しかし、KDE の開発者になるのに、KDE 全体のアーキテクチャについて詳しくなる必要はありません。KDE のテクノロジーを利用することはとても簡単なので、本当にあなたが必要とするところだけに集中してください。他の部分については後で学べます。

developer.kde.orgdoc.trolltech.com($QTDIR/doc/html にもあります)は計り知れない程の情報源です。これらを利用してください。

その後、ソースを読んで、examples ディレクトリを探して、他人がそれらのアプリケーションをどのようにコーディングしているか見て下さい。コードを読み、書くことはいちばん良い学習方法です。

CVS って何ですか?どうやって CVS から KDE を入手することができますか?

anonymous cvs page を見てください。

.cvsrc には何を書いておくべきですか?

cvs -l -q -z4
diff -up
update -dP
checkout -P

自分のアプリケーションを KDE に含めたいのですが…

三つの必要条件があります。

  • KDE の最新バージョン(CVS)でコンパイルできること。
  • 安定していること
  • メンテナンスされること。あなたはかなりの量のバグレポートと要望レポートを受け 取ることになるでしょう。人びとは、あなたがバグを直したり、意味のある要望を実装したりすると想定しています。

次の質問も見て下さい。

KDE の内部と外部どちらを開発したほうがいいでしょうか?

どうすれば、KDE への CVS アクセスを得ることができますか?

私の作ったアプリケーションは unstable ですが、KDE に含めたいのですが…

まず、kdenonbeta(== kde-alpha) に入れることができます。そこで開発して下さい。そして準備ができたらそれを適当な KDE パッケージに含めるようにたのんで下さい。

KDE にアプリケーションを含める際、CVS の履歴を失いたくないのですが、どうしたらいいでしょうか?

あなたの CVS レポジトリの tgz 圧縮ファイルを提供して下さい。

kde bindings の中には何が入っているのですか?

Qt/KDE のクラスを Java から使うためのバインディングや、DCOP を C、Java、Perl、Python から使うためのバインディング、非 KDE アプリを KPart として扱うための XPart などが含まれています。また、KDE ではメンテナンスされていないバインディングは他にもあります。the binding page of develop.kde.org をチェックしてください。

KDE のノンベータ版に機能の凍結は適応されますか?

stable な KDE と unstable な KDE をひとつのコンピュータに共存させることは可能ですか?

できます。Building 2 Versions document をチェックして下さい。

使用している Qt/KDE のバージョンはどうやって知るのですか?

コントロールセンターを起動してください。 そのスプラッシュ画面にKDEのバージョン情報が表示されます。 また、kde-config と全てのKDEプログラムは引数として --version を受け付けます。

Qt-copy か trolltech の Qt か?HEAD ブランチのクリーンビルドをするならどっちが良いですか?

どちらでもかまいません。それらはバイナリで互換性が保たれています。しかし、後者は最新の Qt へのバグフィックスを少し含むかもしれません。

CVS のモジュールからひとつだけディレクトリを checkout するにはどうしたら良いですか?

'cvs co -l modulename' でトップレベルのディレクトリをチェックアウトし、'cvs co modulename/admin' で admin/ ディレクトリをチェックアウトし、最後にあなたが欲しいディレクトリを 'cvs co modulename/subdir' でチェックアウトしてください。

(訳注:現在 admin は kde-common モジュール内にあります)

たとえば、reaktivate だけを kdenonbeta から入手したい場合は
cvs co -l kdenonbeta
cvs co kdenonbeta/admin
cvs co kdenonbeta/reaktivate
としてください。

コンパイルも普段と同じです。

この解決策は「kde-i18n から1つの言語だけをとってきたい場合どうするか」と言う質問の答にもなります。

もし、チェックアウトしたいディレクトリの名前がわからない場合は、webcvs.kde.org をブラウズして見付けてください。

KDE のアプリケーションのひとつをスタンダローンの tar ball にするにはどうしたら良いですか?

kdesdk/scripts/cvs2pack と kdesdk/scripts/dist が KDE のソースツリーからアプリケーションを抽出し、スタンドアローンなアプリケーションとしてパッケージ化するスクリプトです。

どうやったら、自分が出したバグレポートをクローズすることができますか?

技術的な質問

どうやって新しいアプリケーションを作り始めるのですか?

最も簡単な方法は、Makefile.am を生成するために kdesdk/kapptemplate か kdevelop を使うことです。その他の方法としては、他の KDE アプリケーションから Makefile.am をコピーし、それを今ある KDE ソースコードのトップディレクトリに組み込むことです。もっと他の方法としてはスクラッチから作るという古い方法です。しかし、この方法はautoconf/automake フレームワークの恩恵にあずかることは出来ません。

dcop、kpart、kiokdesktop、kdeinit とはなんですか?

http://developer.kde.orgをチェックしてみて下さい(特にアーキテクチャに関するドキュメント)。また KDE book をチェックしてみるのも良いかもしれません。

dcop や kpart を使う必要はあるのですか?

無理に使う必要はありません。しかし使ったほうがはるかに良いです。KPart は強力なコードの再利用を可能にします。DCOP はアプリケーションのスクリプトによる制御を可能にし、とても強力です。

どうやって Makefile.am を書けばいいのですか?

Makefile.amをどのように書けばよいのかについての文書は他にあります。makefile_am_howtoを参照して下さい。

Makefile の生成はどうなっているのですか?

am_editと呼ばれるプログラムによって書かれた別のレイヤーと共にautoconf,automakeを用いています。しかし、どのように使うかを理解しようとする必要はありません。 非常に複雑であるし、core-developerが既に理解しているので、実際しなくてよいというのがまたKDEの強みでもあります。

基本的に、automakeはMakefile.amからMakefile.inを生成します。そしてam_editがMakefile.inの中のKDE独自のタグを置き換え、そしてconfigureがMakefile.inから作り出されます。

どうして KDE は .lo ファイルや .la ファイルを生成するのですか?どうしてこれらのファイルは .lib ディレクトリに隠されているのですか?

なぜならKDEは"libtool"と呼ばれるGNU toolを用いているからです。だから、この質問は次のような二つの質問に分かれます。"何故libtoolを使うのですか?"という質問と、"なぜlibtoolは.loと.laというファイルを作るのですか?"という質問です。

KDEは移植性という理由からlibtoolを用いています。libtoolは様々なプラットフォームにおけるコンパイラ、そして特にリンカの違いを配慮するため、sharedライブラリを書いている時でさえそのようなことに悩む必要が無いのです。

.loや.laといったファイルはオブジェクトファイルやライブラリの情報を加えるために用いられます(plain textなので読んでみましょう) 。実際、これらのファイルにはライブラリの依存情報が書かれています。もしなかったとしたら、link lineに-lkparts -lkio -lkdeui -lkdecore -lqt -lXext -lX11...を必ず与えなければなりません。これらのファイルが.libsディレクトリに「隠されて」いるのに違和感を覚えるかもしれませんが、多大な利益を得ているのです。つまり完全な移植性と開発者の負担を減らすことです。

make のターゲットにはどんなものがありますか?

all:デフォルトターゲット('make' とタイプした時に実行されるターゲット)

clean:全ての生成されたファイルを消去します。

distclean:clean で消去されるファイルに加えて Makefile.cvs から生成されるファイルも消去します。KDE ではあまり役に立ちません("dist" のコンセプトを知るには dist の項を、本当のクリーンを行なうよりよい方法を知るには cvs-clean の項をみてください)。

dist:CVS ソースから tar ball を作ることを想定しています。しかし、KDE ではあまりサポートされていません。kdesdk/scripts/cvs2pack を使った方が良いでしょう。

cvs-clean:(CVS ユーザーのみ対処)CVS に入っていないファイルを全て消去します(もし、変更をコミットしていなければこれはうまく動きません)。

force-reedit:Makefile.am を使って automake や am_edit をもう一度実行します。

install:全てをインストールします。

install-strip:全てをインストールし、バイナリファイルを strip します(デバッグシンボルを取り除きます)。

install-exec:バイナリファイルやライブラリファイルのみをインストールします。

install-data:データファイルのみをインストールします。

check:テストプログラムをコンパイルします(それらは check_PROGRAMS で定義されています)。"make check"の途中で実際にそれらのプログラムを実行することも出来ます。 kdelibs/arts/tests/Makefile.am を参照して下さい。

CVS から checkout したのですが、configure スクリプトや Makefile ファイルが見つかりませんが…

"make -f Makefile.cvs" を実行してください。

どうすれば、特定のディレクトリを一時的にビルドから除くことが出来ますか?

プログラムをハックする際、特定のディレクトリをビルドの対象から除くと便利かもしれません。もしそうしなければコンパイルされてしまうのですが、それは必要のないことです。
また、コンパイルされていないソースを checkout してきて、コンパイルエラーを直す時間や知識がない場合、ディレクトリをコンパイルしたくないかもしれません。

トップディレクトリで行なう方法とサブディレクトリで行なう方法の二があります。

トップディレクトリで行なう方法は、単純にコンパイルしたくないディレクトリを消去すれば良いです(または、checkout しない)。

もし何らかの理由でそのようなことをしたくないのであれば、configure を実行する前に DO_NOT_COMPILE=someapps としてみて下さい。そうすれば、configure は someapps をスキップします。もしほんの少しのディレクトリしかコンパイルしたくなければ、DO_NOT_COMPILE にほとんど全てのディレクトリを加える代わりに、コンパイルしたいトップレベルのサブディレクトリをトップディレクトリの inst-apps というファイルにリストアップしてください。

サブディレクトリを含むディレクトリをコンパイルしないで済ますには、Makefile や Makefile.am を修正しなくてはいけません。Makefile.am を修正することは推奨されていません。なぜなら、そのファイルは KDE CVS にも入っており、まちがってコミットしてしまう恐れがあるからです。よってここでは、Makefile を修正する方法を示します。
コンパイルしたくないディレクトリのひとつ上のディレクトリにある Makefile をテキストエディタでひらいて SUBDIRS 変数を探して下さい。多くの場合、次のようになっているとおもいます。

SUBDIRS = share core ui . proxy taskmanager taskbar applets extensions data

コンパイルしたくないディレクトリをこの行から消して下さい。そうすれば、新しく"make "した際、そのディレクトリのコンパイルはスキップされます。

たまに、SUBDIRS が他の変数から構成されるので難しくみえることがあるも知れません。

SUBDURS = $(COMPILE_FISRT) $(TOPSUBDIRS) $(COMPILE_LAST)

この場合、COMPILE_FIRST、TOPSUBDIRS、COMPILE_LAST を探して下さい。それらの中にあなたがコンパイルしたくないディレクトリが入っているはずです。それを見付けたこと呂で削除して Makefile を保存して下さい。

もし、変更を取り消したい場合は Makefile を再生成するが古い Makefile のバックアップをもどして下さい(ちゃんとバックアップしてますか?)。

Makefile を再生成するには "make force-reedit" を実行して下さい。

どのようなコンパイルオプションがありますか?

--enable-debug
デバッグシンボルを組み込み、最適化を不可にします。また、kdDebug() を有効にします。

--disable-debug
前のオプションの逆です。最適化を有効にし、kdDebug() を無効にします。

--enable-final
すべての .cpp ファイルを1つの .all_cpp.cpp ファイルにまとめ、それぞれの .cpp ファイルをコンパイルする代わりにそのファイルを1回でコンパイルします。これにより、コンパイルを速くし、より最適化されたコードを生成します。しかし、 かなり多くのメモリを必要とします。また、様々なソースファイルからインクルードされるヘッダファイルが次々とクラッシュしたときや、違うソースファイルで同じ名前の C スタティク関数を使ったときは、コンパイルエラーになります。

この方法はパッケージングするには有効ですが、もちろん開発者がすべきではありません。なぜなら、1つファイルを修正するだけで全部を際コンパイルしなくてはいけないからです。

どのようなコンパイルオプションが推奨されていますか?

もしあなたが開発者なら、Qt や KDE を --enable-debug オプションを付けてコンパイルすべきです。そうすれば、Qt や KDE の関数呼び出しの内部まで自分のプログラムをデバッグできます。

あなたが純粋なユーザーでも、--enable-debug オプションを付けても問題ありません。KDE はより多くのディスクスペースを占めることになりますが、それでデスクトップが遅くなることはありません。このオプションを付ける利点としては、アプリケーションがクラッシュした際にスタックトレースを得ることが出来ることです。もし、クラッシュの挙動に再現性があるならば、bugs.kde.org でそのクラッシュが報告されていないことを確認した後に、提出してください。それにより、KDE を改善していくことが出来ます。

Qt に関しては、qt-copy/README.qt-copy でコンパイルオプションの説明がされています。

コンパイルを速く済ますための Tips はありますか?

上にある"--enable-final"を読んで下さい。"make final"は--enable-final なしでも現在のディレクトリに関して all-in-one-file トリックを使います。"make no-final"は--enable-final を付けていても現在のディレクトリを普通の方法でコンパイルします。

moc ファイルをインクルードして下さい!QObject の派生クラスを定義しているヘッダファイルは .moc ファイルを生成するために moc を通さなくてはいけません。.moc ファイルもコンパイルしなくてはいけませんが、方法は2つあります。ひとつは別々にコンパイルする方法、もうひとつはクラスを実装しているファイルにインクルードする方法です。後者の方がコンパイルスピードの点で効率的です。kdesdk/scripts/includemocs ではこの方法が自動的にこれを行ないます。

また、現在では gcc-2.95 が gcc の最新版より速くコンパイルことが出来ることも知っておいて下さい。

Makefile の中で STRIP 変数がセットされていますが、どこでも使われていないようですが…

strip はコンパイル時に行なわれます。これを使うには "make install" の代わりに "make install-strip" を使ってしてください。

ソースコードを書く際、どんなインデントを使えばいいんですか?

もしあなたが、今あるアプリケーションで仕事をするなら、そのアプリの作者のインデントを尊重してください。そうでなければ、あなたの好きなインデントを使って良いです。

i18n と I18N_NOOP の違いは何ですか?

QString translatedStuff=i18n("foobar");
を使った場合、translatedStuff は "foobar" の翻訳結果が含まれます。一方、
QString marketStuff=I18N_NOOP("foobar");
を使った場合、marketStuff はまだ、リテラル "foobar" を含んでいます。しかし、トランスレータはそのが翻訳されてほしいことを分っているので、後に
QString translatedStuff=i18n(marketStuff);
を実行すると、"foobar" の翻訳結果が得られます。これは I18N_NOOP なしではうまくいきません。

そのため、普通は i18n を使いたいとおもいます。しかし、絶対に翻訳をさせずに後で翻訳したい場合や、KInstance が存在する前に翻訳したいものを持っておきたい場合は、I18N_NOOP を使って下さい。

What is this bug thing with QSpinNumber??

QSpinNumber? にはバグがあります。KSpinNumber? を使って下さい。それらは同じ特徴を持っています。

"virtual table error"というエラーが出ます。

このエラーは、.moc ファイルがソースファイルと同期していない場合や、リンクされていない場合に多く起こります。正しく moc を使っているかどうか確かめて下さい。"which moc" で分ります。また、moc ファイルを再生成して下さい(make force-reedit;make clean;make)。

dcop を使おうとして k_dcop を myClassHeader?.h に加えましたが、何もおこりません。

myClassHeader?.kidl を Makefile.am に加えた後に、再び make を実行して下さい。

いくつかの Makefile.am の中には .stub ファイルがありますが、これは何のためですか?

スタブはあまり使われません。スタブは dcop に登録されたアプリケーションをメソッドが dcop スロットであるオブジェクトとして見せることを可能にします。普通、アプリケーションはすべての dcop スロットを含む appnameIface.h を持っています。Makefile.am の中に appnameIface.stub を加えて、オブジェクト appnameIface を使って下さい。具体例として konqueror スタブを使っている kdebase/kdehelpcenter を参照して下さい。

Q_OBJECT を myClassHeader?.h に加えましたが、mocファイルが生成されません。

正しく Makefile を生成できるように Makefile.am をパーズするために am_edit を実行して下さい。もし加えた Q_OBJECT がそのディレクトリで最初なら、Makefile.cvs を実行するか、または kdesdk/scripts の中にある create_makefile を実行して下さい。他の方法として、単に make force-reedit しても良いです。

簡単に済ませるために、自分のクラス全体をひとつの cpp ファイルにコーディングしました。どうすれば moc ファイルと kidl ファイルを生成することが出来ますか?

もし Q_OBJECT を使っているクラスがあるなら、そうするのはやめて下さい。KDE のフレームワーク(am_edit)はその方法をあまりうまくサポートしません。ただ、METASOURCE=file.cpp とすれば moc ファイルにたいしてはうまくいくかも知れません。

kpart(つまりプラグイン)を作りましたが、まだ完成していないのでインストールしたくありません。KTrader や KLibLoader? を利用してその kpart にリクエストした際に KDE がそれを見つけられるようにするにはどうしたらよいですか?

KDE は KDE ライブラリを $KDEDIR/lib と$KDEDIRS の各要素内の lib ディレクトリの中で探します。よって、あなたがライブラリを開発していてそれをインストールしたくないのならばこのトリックが使えます。

  • 開発したディレクトリ(ライブラリをビルドしたディレクトリ)に移動して下さい。
  • KDEDIRS がそのディレクトリを含むように設定して下さい。:export KDEDIRS=`pwd`:$KDEDIR
  • KDE があなたのライブラリをみつけるべき擬似 lib ディレクトリを作って下さい。:ln -s .libs lib(すべてのオブジェクトファイルとライブラリファイルは .libs ディレクトリにビルドされます)
  • KDE に KDEDIRS が変更されたことを通知するために kbuildsycoca を実行して下さい。

これで KTrader や KLibLoader? を使ったときに KDE はあなたのライブラリを見付けるはずです。

root になれない場合に、どうすれば追加の KDE ソフトをインストールできますか?

アプリケーションを個人的にインストールしたい場合、普段とは違う prefix でそのアプリを configure してください。たとえば、configure --prefix=$HOME/kdeprefix などです。その後に KDE にこの prefix を教えましょう。KDEDIRS に $HOME/kdeprefix:$KDEDIRS をセットします。KDE に新しい prefix を教えるもう1つの方法は、/etc/kderc を編集して以下の記述を加えます。
[Directories]
prefixes=/the/new/prefix
ただし、この方法はこの質問に対しては答にはなってません。
KDEDIRS を変更した後に kbuildsycoca を実行するのを忘れないで下さい。

私の作った kpart ライブラリが KTrader を通してリクエストをするとリストに表示されません。

新しいサービス(アプリケーションやプラグインなど)がインストールされた場合、mime データベースを再構成しなくてはいけません。理論的にはそれは勝手に行われます(kded がインストールディレクトリを監視しています)が、もし不確かなら kbuildsycoca を実行してください。

trader に関する問題をデバックする一番良い方法は ktradertest を使うことです。kdelibs/kio/tests に移動して ./ktradertest を実行してください。

kdelibs を変更してインストールしましたが、新しい KDE アプリケーションがそれを使っているように見えません。

解決策は簡単です。新しいアプリをコマンドラインから実行してみてください。そうすれば新しいライブラリを使うでしょう。
このような問題が起きる理由は、他のアプリ(kicker、minicli、konqueror)から起動されるアプリは kdeinit を通して起動され、kdeinit は KDE の起動時にライブラリをロードするからです。よって、古いライブラリが使われます。しかし、もし 新しいライブラリを使って kdeinit をスタートさせたければ、それを再起動するだけで良いです。それをするには、単に kdeinit とターミナルから打つだけです。
この方法は、コマンドラインから起動できない場合に必要です。たとえば kioslave などです。もし kio を変更したなら、kdeinit を再起動して、起動している kioslave を殺してください。そうすれば新しい kioslave が起動します。

KParts とスタンドアローンアプリケーションの両方を作成していますが、どうすればコードの重複を避けることが出来ますか?

アプリケーションをしばしば Part とリンクしたくなります。なぜなら、それらは多くの共通の機能を持っているからです。しかし、それは以下の理由からやってはいけません。

  • ライブラリはリンクするものであり、モジュールは dlopen するものです。ライブラリを dlopen できないし、モジュールをリンクできません。
  • ライブラリはバージョン番号を持ち $libdir(たとえは、$KDEDIR/lib)にインストールされます。一方、モジュールはバージョン番号を持たず、バイナリに似ています(konqueror-1.14.23 なんてないですよね)。また、KDE のモジュールのディレクトリ($KDEDIR/lib/kde3)にインストールされます(つまり ld.so のサーチパスにはインストールされず、--rpath がなければシステムが落ちてしまいます)。

上で言っていることを理解できなくても心配しないで下さい。要はアプリケーションを KParts や、 dlopen されるべきモジュールにリンクしてはいけないということです。

解決策

  1. アプリケーションに part を dlopen させましょう。これは KOffice でもやっていることです。しかし、この制限はアプリケーションを KReadOnlyPart?/KReadWritePart? API に制限します。あなたがリンクしていない実装をもつ non-virtual 関数を呼び出すことはできないということを覚えておいて下さい。解決策としては新しい virtual 関数を持つ ReadWritePart? の派生クラスを定義することです(KOffice では KoDocument? があります)。この派生クラスはコードを持つか、抽象的なインターフェースを提供するだけで十分です。また、part の基底クラスを替える代わりに、part の子オブジェクトに知られたインターフェースを使うことができます。これが、KParts::BrowserExtension? を使う解決策です。
  2. 共通のクラスをもつ共通のライブラリを定義して、アプリケーションと part がそれを使うのがもう1つの解決策です。 That library can be noinst_ or lib_, both work. 一番目の場合、コンパイルされたオブジェクトコードが複製され、2番目の場合、本当のライブラリがインストールされます。ここで使われているアイディアは、part 自体はアプリケーションからアクセスできないが、変わりに part はまさにアプリケーションが使うクラスと同じものの thin ラッパーであるということです。KPart に固有なものだけが part に残されています。

外部のアプリケーションを起動する一番良い方法は何ですか?

kde2 porting instructions によい解決策があります。kdelibs/KDE2PORTING.html をチェックしてみてください。またここも参照してください。

どうやって KDE へのパッチを作成し提出すれば良いですか?

バグを見つけて修正コードを書きたいと思ったり、新しい機能をコーディングしたいと思ったら、パッチを送ってください。開発者に喜ばれるでしょう。以下にあなたがすべきことを記して起きます。

  1. CVS を使って最新の KDE を手に入れ、あなたが書きたいコードがまだ書かれていないことを確かめます。
  2. あなたの発見したバグが解決されているかどうか調べるためにbug databaseをチェックして下さい。
  3. あなたがコードを書きたいと思っているソフトの作者にコンタクトを取ってください。作者の名前は about ボックスや、ソースファイルのヘッダなどにあります。もし、そのソフトのプロジェクトにメーリングリストがあるならば、直したいバグや実装したい機能が議論されていないか、アーカイブをチェックして下さい。もし、作者やメーリングリストが見つからなければ kde-devel にメールしてくれても良いです。
  4. あなたの意図を説明したメッセージをポストしましょう。作者にあなたがしようとしていることを伝えるのは重要なことです。なぜなら、他の誰かがその機能を実装したり、作者がより良い設計を提案してくれたり、いいアドバイスをくれるかもしれないからです。
  5. 次のステップで、その機能を実装しましょう。オリジナルのソースは変えず、コピーに対して修正したほうが良いですよ。そうすれば、両方のバージョンでの動作をチェックできます。作者のインデント方法と命名規則を尊重し、注意深くコーディングし、side-effect を考え、すべてについて何回もテストしましょう。
  6. 最新の KDE ソースを使って diff を取りましょう。cvs diff -u または diff -uNp original-dir new-dir を使いましょう。リバースパッチを送らないでください。1番目の引数が古いディレクトリで、2番目の引数が新しいディレクトリです。
  7. 作者かメーリングリストにそのパッチを添付したメールを送ってください(添付するのを忘れないで)。
  8. 多分誰かがそのパッチに対して意見を述べて、あなたはそのパッチを改良しなければいけないでしょう。一般的に、パッチが受け入れられるまで3、4回は提出しないといけないでしょう。

これで OK です。あなたのコードは KDE に含まれました。これであなたもれっきとした KDE プロジェクトの一員です。ありがとうございました。

How do I make my application Xinerama and multi-head safe?

KDE に関して UIC プラグインが見つからないというエラーが出ましたが、それらはインストールされています。何が悪いのでしょうか?

それはほとんど間違いなく KDE のコードには問題なく、インストールの仕方に問題があります。たくさんの問題がこの障害を起こしえますが、ほとんどの場合、Qt が複数バージョンインストールされていて、configure スクリプトが呼び出すものと、KDE が使っているものが違うことが原因です。

この問題を解決する手助けとなるもう1つの方法は、kdewidget を再コンパイルすることです。これは kdelibs/kdewidget ディレクトリにあります。ただ、複数の Qt を持った状態でこれを行うと、間違った Qt に対してコンパイルしてしまうかもしれないことは注意してください。

この問題は、さまざまなメーリングリストで何回も投稿されています。よって lists.kde.orgのアーカイブをみれば役に立つでしょう。

デバッグ

Dr Konqi が出ないようにするにはどうしたら良いですか?

KDE_DEBUG 環境変数を(1に)セットしてください。

core ファイルって何ですか?どうすれば core ファイルを得ることができますか?

core ファイルとはアプリケーションがクラッシュしたときのメモリイメージです。これを使うことによって、どの変数がセットされていたり、どこでアプリがクラッシュしたかを知ることができます。

いくつかのディストリビューションでは core ファイルの生成を不可にしています。ふたたび、生成ができるようにするには "ulimit -c unlimited" を実行してください。

いったん core ファイルが手に入ったら、"gdb appname core" で調べることができます。これで gdb は与えられたアプリケーション用に core ファイル上でオープンできます。gdb のプロンプトが出たら、"bt" というコマンドが役に立ちます。これはクラッシュのバックトレースを生成することができます。

gdb の使い方についてもっと情報がほしいなら、このページ を見て下さい。

デバッグ用の出力を標準エラーに出す1番良い方法は何ですか?

kdDebug() を使うべきです:

#include <kdebug.h>
kdDebug() << "KMyApp? just started" << endl;

文法は cout とほとんど同じで、多くのネイティブな型を << の間に使えます。これはデバッグメッセージを出力しますが、リリース時に(--disable-debug で)自動的に無効にすることができます。もし、メッセージをリリース中も出力したいならば、それらは警告やエラーなので kdWarning() や kdError() を使って下さい。

コンポーネントやライブラリなどは kdDebug(1234) などのようにデバッグエリアナンバーを使うようにアドバイスされています。このためには、kdelibs/kdecore/kdebug.area にその数字が登録されていなければいけません。デバッグエリアのお陰で、特定のエリアナンバーのデバッグ出力を無効にすることができます。そのためには "kdebugdialog" という kdebase の一部であるプログラムを使います。"kdebugdialog --fullmode" によってまた、デバッグ出力のログをどこに取るか制御することもできます。普段、スタンドアローンなアプリケーションのためにエリアナンバーを登録することは、そのアプリケーションが複雑で出力をいくつかのエリアに分割したいと思うことが無ければ、必要ありません。

qDebug() を使ってはいけないということだけははっきり覚えておいて下さい。それはリリース時に無効になりません。また、assert() や kdFatal() を使うことも避けて下さい。それらは何かアプリケーションないでまずいことが起きた場合、アプリをクラッシュさせてしまいます。決してユーザーにとって良いものではないのです。エラーを発見する良い方法は kdWarning や kdError を使って下さい。そして、できる限りそのエラーから回復させて下さい。

私のアプリケーションをデバッグするのにどんなツールが使えますか?

  • kdDebug() の呼び出しはシンプルですが効率の良いデバッグ方法です。
  • gdb Gnu debugger は1ステップずつ実行し、変数がどんな値にセットされているか調べるもっとも手っ取り早い方法です(バージョンは 5.0 の方が好ましく、4.1.x より明らかにすぐれています)。
  • kdbg は KDE の GUI をもったすぐれた gdb のフロントエンドです。それは多くの Qt の型(QString も含む)をサポートしています。
  • メモリリーク探知機もあります。kdesdk/kmtrace を見て下さい。README にそれについて全てのってます。
  • kdcop や dcop は dcop インターフェースをながめるのを可能にし、dcop の呼び出しも簡単にします。

このページ や kdesdk をチェックして下さい。便利なスクリプトが集まっています。

QString の文字列を gdb で出力するにはどうしたら良いですか?

kdesdk をチェックアウトし ~/.gdbinit に以下の行を加えて下さい。

source /path/to/kde/sources/kdesdk/scripts/kde-devel-gdb

そうすれば、gdb で printqstring myqstring とすることで内容を見ることができます。

たとえば、QString myqstring=QString::fromLatin1("contents") は次のマクロで調べることができます。

(gdb) printqstring myqstring
$1 = 99 'c'
$2 = 111 'o'
$3 = 110 'n'
$4 = 116 't'
$5 = 101 'e'
$6 = 110 'n'
$7 = 116 't'
$8 = 115 's'

定義されている他のマクロを知るには kde-devel-gdb を見て下さい。

KPart を使っているアプリケーションをデバッグしているとき、デバッグシンボルがありません。どうするべきですか?

main がロードされた直後にとめる必要があります。そうすれば後は普通にデバッグできます。

kpart がロードされた直度に止めるために、gdb のマクロを作ることだってできます。KWord を例にすると、わたしは以下のマクロの定義を使っています。

define startkword break main run break 'KoDocument?::KoDocument?(int, QWidget *, char const *, QObject *, char const *, bool)' cont

どうやって ioslave をデバッグするのですか?

kdebase/kioslave/DEBUG.howtoを参照して下さい。

Counter: 12479, today: 1, yesterday: 0

  最終更新のRSS
Last-modified: 2004-06-26 (土) 20:30:20 (2260d)

このサイトは日本KDEユーザ会が著作権を有します。本著作権を表示する限りにおいて転載を許可します。
Copyright (C) 1999-2008 Japan KDE Users' Group. All Rights Reserved.
このサイトに関するご意見・お問い合わせは webmaster@kde.gr.jp まで