2011年2月28日月曜日

スパコン見学

今日は、スパコンを見学してきた。

以前のものと比較しての印象としては、
  • 音が静かになった。
  • 高密度になった(ひとつひとつのノードにより多くの中身が入るようになった)。

というところが大きかった。
コンピュータの世界はドッグイヤーで日進月歩ではあるけど、こうやって実際にモノを見てみるというのはとても勉強になる。

今日の作業内容:金曜打ち合わせ内容の PDF 化 2h + 論文校正 2h + スパコン見学 1h
今日のランチ:角笛 幕の内弁当
明日の予測作業時間:4h

2011年2月25日金曜日

Dirac の量子力学の教科書

今日は午後に少し出かけて5時間ほど研究打ち合わせをしてきた。
いろんなことを勉強できたので、とてもよかったと思う。

あと、少しだけ話がそれているのかもしれないが、量子力学の教科書として Dirac の教科書はお勧めらしい。
Amazon で調べたところでは、
http://www.amazon.co.jp/principles-quantum-mechanics-P-M-Dirac/dp/4622025124/ref=pd_sim_b_2
の本のようなので、今度調べてみようと思う。

今日の作業内容:打ち合わせ準備 2h + 打ち合わせ 5h
今日のランチ:らく 焼き魚定食
明日の予測作業時間:2h

2011年2月24日木曜日

beamer と latexdraw

最近になって beamer を使い始めているが、latexdraw の場合は図の途中でも pause を入れられるので、アニメーションとしての使い勝手がよい。
 
まず、latexdraw で図を書いておき、export の pstricks で tex ファイルとして出力する(sample.texとかに)。
beamer 側では、これを \input{sample.tex} で取り込む。
これで表示ができるわけだが、sample.texはテキストファイルなので、emacs などで編集が簡単にできる。pscircle などで円を書いているのであれば、途中で \pause と入れれば、beamer がきちんと処理してくれる。

ただし、\pause は latexdraw の import では認識できないので削除されてしまう。
一通り図ができたあとにやるほうが楽である。
また、\pause の行までの分が先に出力されるので、先に出力したいものは上のほうの行に、あとに出力したいものは下のほうに置けばよい。

あと、latexdraw の文字列は色を付けることも可能だし、数式も可能。
図を書く段階では {\color{blue} aiueo} などと文章で書いておいて、export, import すると
色がついていることが解かる。
数式も対応できる部分は対応している(オールマイティなわけではない)。


今日の作業内容:論文校正 2h + beamer 3h
今日のランチ:味庵 牛肉の沙茶ジャン炒め
明日の予測作業時間:3h

2011年2月23日水曜日

論文校正の続き

昨日表にまとめた結果について、今日はラフに英語で考察を入れる作業をした。
あとで、他の節とのバランスを見て、文章を校正する必要がありそうだ。

ただ、文章を書くのにだいぶ時間がかかるので、ちゃんと時間配分を決めてから作業をしたほうが効率的かと思うので、明日からはそのように切り替えようと考えている。

あと、大き目の実験のほうでは SeDuMi でかなりの時間がかかっている。SDPT3 が1時間で解いた問題であるが SeDuMi はそろそろ丸2日ではないだろうか?ただ、ログを見るかぎりだと既に半分は解いているようなので、あと2日待てば終わるのかもしれない。

今日の作業内容:論文文章追加 2h
今日のランチ:ベッカーズ 肉味噌バーガープレート
明日の予測作業時間:6h

2011年2月22日火曜日

python でのデータ処理終了

大量にできたデータは、結果的に python で 100 行程度のスクリプトを書いて、一気に TeX に貼り込めるように変換した。
400 以上のファイルの中からいくつかのファイルを比較しながらの作業だったので、さすがに手作業で行なったらケアレスミスが入り込みやすく、プログラムで処理して正解だと考えている。

結果としてまとめた分は論文に入れ込むのでここでは詳細は省くが、やはり SDPA-GMP の計算時間は半端ではない。
gpp500-1.dat-s の場合、SDPA だと 2.36 秒であるが、SDPA-GMP だと 105325.74 秒かかる。
精度が高い分、反復回数も 10 倍程度かかっているが、1反復あたりの時間で計算しても3600倍程度の差がある。
gpp500-1.dat-s では、BLAS にかかる負担が大きいので、つまり GotoBLAS が高速である、ということでもある。(mlapack も GPU でかなり高速化できる様子)

今日の作業内容: SDPA 結果まとめ
今日のランチ:たちばな わらさ
明日の予測作業時間: 4h

2011年2月21日月曜日

数値実験の一部が終了

SDPA7の論文の校正で行なっている数値実験の一部がようやく終了した。
長い時間がかかる計算ということが予めわかっていた分、詳細なログを残してあるが、詳細すぎて行数が数千行もあるので、python スクリプトで処理しようと思う。
次の数値実験と並行して、論文への結果の張り込みも同時進行で行なう予定である。


今日の作業内容:論文校正 4h
今日のランチ:しなの エビ天丼
明日の予測作業時間:5h

2011年2月18日金曜日

Nature の論文を読む

SNL に関係があるかもしれない、ということで Nature の論文を読んでみた。
今回読んだのは
http://www.nature.com/nature/journal/v466/n7307/abs/nature09182.html
であって、これはグラフの中でのコミュニティを探す、という内容を
扱っている。
SNL の場合でも、直接は関係ないかもしれないが、このようなコミュニティの情報は役に立つ可能性がある。

今日の作業内容:論文読み 4h + 本読み 2h
今日のランチ:シッダルータ チキンカレー
明日の予測作業時間:6h

2011年2月17日木曜日

xdvi の色を変えるのに一苦労

昨日の latexdraw であるが、これを取り込むと xdvi の -fg が効かないことがわかり、それに対応するのにかなりの時間を取られてしまった。

問題点は pstricks を取り込むことで、これを取り込むと本文が xdvi -fg で変更できなくなる。
自分の場合、長時間 xdvi を見ることもあるため、
$ xdvi -fg white -bg \#333366
としているが、黒になってしまって 333366 の背景に埋もれてしまう。

いろいろと試した結果、
\begin{document}
の前に
\color{white}
とすると、文章全体を白くできることがわかった。
とりあえず xdvi を見るときには、この状態で見ることにして、pdf に変換するときになったら、これを外すことにする。

今日の作業内容:xdvi の色 3h + 航空券関係 3h
今日のランチ:らく ハンバーグとカキフライ \850
明日の予測作業時間:5h

2011年2月16日水曜日

latexdraw

今まで TeX の図は tgif で作っていたが、TeX には picture 環境があって tgif のように eps にしなくても簡単な図であれば書くことができる。
ただ、picture 環境をそのまま座標とかの数字をいじるのはきついので、latexdraw を使うことにした。
これだと、eps と違って tex ファイル(文字ファイル)で生成されるので、git などでの管理も容易になるはず、というメリットもある。

latexdraw は Debian, Ubuntu ならパッケージになっているので、簡単に導入することができる。
ただし、latexdraw は dvipdfmx を通せないので、\documentclass などで dvipdf などを設定しているときには dvips にする必要がある。また、pdf にするなら ps2pdf である。

また、Ubuntu の dvips はそのままでは日本語が通らないので、
$ sudo add-apt-repository ppa:cosmos-door/dvipsk-ja
$ sudo apt-get update
$ sudo apt-get install dvipsk-ja
$ sudo apt-get install ptex-jisfonts cmap-adobe-japan1 gs-cjk-resources ghostscript
$ sudo jisftconfig add
とすると、dvips で日本語を通すことができる。
ただし、Debian ではこの方法は通じない。Debian では cidfmap に Ryumin-Light (Ryumin-Light-Hではなく、Ryumin-Lightを書くのがポイント)の行を書き足す必要があるのだが、他にもいろいろと作業をしてしまったため、どれが本当に必要なのかよくわからなくなってしまった。(Debian では dvipsk-ja は更新されていたので、ppa を追加しなくても大丈夫であった)

なお、latexdraw で生成したソースは、そのまま tex ソースにコピーペーストできるが、これはpstricks としてエクスポートしておくと、あとで latexdraw にインポートしなおせるので便利である。tex では \input があるので、これを利用するのがスマートでもある。

ちなみに、Ubuntu の LXDE では、いまは emacs が Arithmetic Error というエラーで起動できない。すでにバグ報告がされているので、そのうち修正されると思われる。
また、LANG=C をつけたまま日本語ファイルを扱うと、読み込んだときに文字化けを起こす。通常 ssh でログインするときには LANG=C のほうが便利なのでそうしていたが、意外な盲点であった。


今日の作業内容:dvips 文字化け対応 4h + 海外出張準備 2h
今日のランチ:四川 鶏白菜春雨うまみ煮
明日の予測作業時間:5h

2011年2月15日火曜日

C/C++によるプログラミングスタイルブック

ここのところ時間がまとまって取れていないので、今日は
「C/C++によるプログラミングスタイルブック」
を細切れの時間に読んだ。

この本はだいぶ古い本ではあるが、SDPA のソースを書く際に参考にしている。

例えば、SDPA の callalbe library で k,l,i,j の変数については、できるだけ
「入力行列 F_k の l 番目のブロックの (i,j) 要素」
となるように統一してある。

SDPA のソースの中でも、できるだけこのルールに従っている。
(ただし、Schur complement のところは少しルールが違い、
i,j は Schur complemet の (i,j) 要素を指すようになっている。)

このように変数の意味をできるだけ固定するとデバッグが行ないやすい。
たとえば、k は0から入力行列の個数 (mDIM) の範囲になるので、
行列のサイズ(nBLOCK, blockStruct)と比較していたらバグの可能性が高い。

10年近く前の書籍ではあるが、「バグの少ないプログラムを書く」という点では
今でも十分に参考になる。

今日の作業内容:本読み 2h
今日のランチ:つかさ カンパチのから揚げ
明日の予測作業時間: 2h

2011年2月14日月曜日

GotoBLAS2 の Windows 版を Debian の mingw32 でコンパイル

GotoBLAS2 の Windows 版を Debian 上の mingw32 でコンパイルできるようになったので、そのメモを残しておく。

[1] download
GotoBLAS2 は以下のところからダウンロードする。
http://www.tacc.utexas.edu/tacc-projects/gotoblas2/downloads/

[2] mingw32 の環境整理
sudo apt-get install mingw32-binutils mingw32-runtime wine

[3] ファイルを展開
tar xzf GotoBLAS2-1.13_bsd.tar.gz
cd GotoBLAS2

[4] ファイルを修正
以下のように修正する。
(先頭に - があるところを + の行に書き換える。ただし、Makefile.getarch は Makefile なので各行の最初がTabになるようにしなければならない)
Makefile.getarch では、
all: getarch_2nd
- ./getarch_2nd 0 >> $(TARGET_MAKE)
- ./getarch_2nd 1 >> $(TARGET_CONF)
+ cp getarch_2nd getarch_2nd.exe
+ wine ./getarch_2nd.exe 0 >> $(TARGET_MAKE)
+ wine ./getarch_2nd.exe 1 >> $(TARGET_CONF)
config.h : c_check f_check getarch
perl ./c_check $(TARGET_MAKE) $(TARGET_CONF) $(CC)
perl ./f_check $(TARGET_MAKE) $(TARGET_CONF) $(FC)
- ./getarch 0 >> $(TARGET_MAKE)
- ./getarch 1 >> $(TARGET_CONF)
+ cp getarch getarch.exe
+ wine ./getarch.exe 0 >> $(TARGET_MAKE)
+ wine ./getarch.exe 1 >> $(TARGET_CONF)

GotoBLAS2/driver/others/blas_server_omp.c では、
#include <sys/mmap>
をコメントアウトする。

GotoBLAS2.org/driver/others/dynamic.cでは、
#ifdef ARCH_X86
- if (gotoblas == NULL) gotoblas = gotoblas_KATMAI;
+ if (gotoblas == NULL) gotoblas = & gotoblas_KATMAI;
#else
- if (gotoblas == NULL) gotoblas = gotoblas_PRESCOTT;
+ if (gotoblas == NULL) gotoblas = & gotoblas_PRESCOTT;
#endif
と修正する。

[5] コンパイル
make \
DYNAMIC_ARCH=1 \
USE_THREAD=1 \
USE_OPENMP=0 \
CC=i586-mingw32msvc-gcc \
FC=i586-mingw32msvc-gfortran \
BINARY=32 \
libs netlib

なお、USE_OPENMP=1 は mingw32 に libgomp がないので失敗するため、USE_OPENMP は必ず 0 にする。
NO_WARMUP=1 にするのもありだと思うが、SDPA の場合には Warm up が効かなかった。
また、今回は 32 bit 版で作成している(pthread-win32 が 64bit でコンパイルできていないため)。
基本的にどの CPU にも対応できるように DYNAMIC_ARCH=1 であるが、これはすべての CPU の分を持つので、コンパイルに時間がかかるのとできるファイルが大きくなる。

[5]ranlib でライブラリにする。
i586-mingw32msvc-ranlib libgoto2.lib

これで mingw32 用に使える GotoBLAS2 がコンパイルできる。

今日の作業内容:SNL のデータ変換 2h
今日のランチ: らく 焼魚定食
明日の予測作業時間: 3h

2011年2月12日土曜日

GotoBLAS のマルチスレッドで SDPA が遅くなる理由

一日かけて、GotoBLAS のマルチスレッドで SDPA が遅くなる理由を探ってみた。

まず、シングルスレッドに比較してどの問題について遅くなるかを特定したところ、
量子化学の問題やtheta6.dat-s はマルチスレッドのほうが高速で、
control11.dat-s だけマルチスレッドにすると極端に遅くなる。

control11.dat-s は Schur complement 作成のときに F1 の式にかかる負担が大きいのが特徴で、マルチスレッドの場合もここが遅くなることがわかった。さらに F1 の式を詳しく見てみると、
X*Ai (Xは密行列、Ai は疎行列)の計算が99% 近い計算時間を占めている。
この中は daxpy を呼び出しているか、dgemm を呼び出しているのであるが、control11.dat-s の場合は、dgemm を F1 では呼び出していない。

結局のところ、問題が起きているのは daxpy のようである。
1回1回は 1 milli second 程度であるが、これが200万回程度呼ばれており、全体として 1300 秒程度(SDPA合計の95%以上)を占めていた。

今使っている GotoBLAS は DYNAMIC_ARCH なので、おそらく daxpy に入るたびにスレッド数などをチェックしているものと推測され、これが計算時間の負荷になっているのだと考えられる。
今はWARMUP を切っているので、WARMUP をつければ改善するのかもしれない。
これは、またチェックしよう。

今日の作業内容:GotoBLAS チェック 6h
明日の予測作業時間: 3h

2011年2月11日金曜日

航空券取れた

昨日から挑戦していた航空券であるが、今日8回目ぐらいの挑戦でようやく取ることができた。
(7回も失敗したので、8回目も失敗するものだとばかり思っていた。)
いずれにしても、これで無事に出張できそうである。

あと、今日は SDPA の python インターフェースの実行を確認してみた。
実装したのは私ではないが、最新の SDPA のソースでも実行できることが確認できた。
将来的には、Debian/Ubuntu パッケージに組み込んでもいいかもしれない。

今日の作業内容:航空券確保 2h + Python 確認 2h
明日の予測作業時間:5h

2011年2月10日木曜日

航空券だけで終わった

今日は航空券を探すのだけで終わってしまった。

インターネットのあるサイトで航空券を検索しているのだが、「空席わずか」のところで VISA カードの支払いまで進むと「座席なし」に切り替わってしまう。
一度「座席なし」になっても何時間か経つと急に「空席わずか」に戻り、また VISA カードの支払いでダメになる。
結局、1時間に何回もリロードして、実際に座席が取れるのかを確認してみたが、かなりの時間を取られてしまった。

今日の作業内容:航空券の確保 5h
今日のランチ:味庵 鶏とたまねぎの炒め物
明日の予測作業時間:5h

2011年2月9日水曜日

GotoBLAS とマルチスレッド

昨日の GotoBLAS の続きであるが、Debian 上の mingw でコンパイルできることを確認できた。
うまく ranlib が実行されていなかったが、ranlib をあとで別途行なったところ、ライブラリが生成された。

ただ、まだひとつよくわからない点があって、マルチスレッドを組み込むとSDPAの計算時間が大きく変わってしまう。
たとえば、control11.dat-s の場合にはシングルスレッドの GotoBLAS のほうが10倍程度速いのに対して、theta6.dat-s の場合にはマルチスレッドのほうが 3 倍程度速い。
おそらく control11.dat-s ではうまくいっていない部分があると思うので、それを特定する必要がありそうだ。


あとは、POP についての打ち合わせ。
疎性の効率的な利用について、などなので、明日あたりに論文をチェックしたり、アイデアなどをまとめなおしたりしようと思う。


今日の作業内容:GotoBLAS 3h
今日のランチ: 横浜家系ラーメン 虎家 並盛
明日の予測作業時間: 4h

2011年2月8日火曜日

GotoBLAS2 が Debian の mingw でコンパイルできそう

GotoBLAS2 の mingw のコンパイルにまだ挑戦しているが、ついにできそうなところまできた。
ここまで、いろいろなパラメータがうまく設定されずに困っていたが、要するに
「getarch が wine でなければ実行できない」
というところでつまづいていたことが判明。
getarch を実行する直前に getarch.exe に cp して、さらに ./getarch となっているところを wine ./getarch.exe にすると通る。
さらに、getarch_2nd も同様である。

これでコンパイルしていくと、いくつかうまくいかないところがやはりあるのだが、ソースファイルを修正するとなんとかコンパイルがある程度まで進む。
今日やったところでは、うっかり OpenMP をつけるようにしてしまったので、ここでつまづいてしまったが、とりあえず LAPACK のダウンロードやそのコンパイルまでは進んでいる。
なんとかなりそうな気配である。

今日の作業内容:GotoBLAS2 コンパイル 3h
今日のランチ:つかさ まぐろのづけ丼
明日の予測作業時間:3h

2011年2月7日月曜日

Windows のデフラグ

今日は時間が細切れになってしまったので、とりあえず先週からの懸念である Windows のバックアップの準備である。Windows のデフラグは行ったが、やはり完全にはデフラグができないので、そのあたりが苦労している。

とりあえず、デフラグはこのままにしておいて、あとはフリーソフトで Windows をパーティションごとバックアップを取れるようなものがないか検討することにする。

今日の作業内容:Windows デフラグ 2h
今日のランチ:シッダルータ 豆のカレー \680
明日の予測作業時間: 2h

2011年2月4日金曜日

Windows のバックアップに向けて

やはり、Windows マシンの調子がよくないので、USB-HDD にまるごとバックアップを取ることにした。
これは、通常であれば Knoppix の Live CD で起動して partimage を使えば簡単にできる。
ただ、Windows を長く使ってきたために断片化が激しいようで、このままではうまくできない。

そこで、SystemRescueCD を USB メモリにインストールして dd_rescue を使うことにした。
現時点で dd_rescue でバックアップ中であるが、やはり少しずつエラーが出るのが気になる。

いずれにしても、かなりの容量のバックアップになるので、この作業は来週にもかかりそうだ。

今日の作業内容:論文読み 2h + バックアップ 3h
今日のランチ:四川 鶏春雨辛炒め
明日の予測作業時間:3h

2011年2月3日木曜日

Windows の調子が悪くなってしまった

ここのところ、どうも Windows の調子が悪いが、どうやら HDD が調子がよくないようである。
ソフトの起動もかなり時間がかかるし、途中でフリーズしたりもする。
やはり、HDD を交換するべきときが来ているのかもしれない。
いずれにしても、注意深く見ていくことにしよう。

あと、SDPA の論文を校正してもらっているのをチェック。
数値実験にだいぶ時間がかかるので、それが終わらないと先に進みにくいところだ。

今日の作業内容:Windows チェック 2h + 校正チェック 1h
今日のランチ:角笛 豚キムチいため
明日の予測作業時間:3h

2011年2月2日水曜日

プログラムを改めて読み直し

楕円の論文の校正がほぼ一段落なので、今日は午後に別のプログラムを改めて読み直し。
ある程度は解かっているが、細かいところなどで苦戦しやすいので、注意が必要そうだ。

今日の作業内容:プログラム読み直し 3h
今日のランチ:鶏こまち 鶏丼
明日の予測作業時間:3h

2011年2月1日火曜日

Debian パッケージのAPTリポジトリ登録への手順

SDPA は既に Debian パッケージとなっていて、
unstable では apt-get で入手できる。
しかし、Debian の apt に登録されるまでの手順は
英語や略称が多くて、日本人にはわかりづらい。

そこで、自分がどこで苦労したかなど、各ステップを
まとめておくと、今後 Debian パッケージをaptに
登録する人の役に立つと思うので、簡単にまとめておく。

Debian パッケージになるとほぼ自動的に Ubuntu パッケージにも
なるので Ubuntu パッケージよりも Debian パッケージを
作るほうが楽である。

なお、時間が経つと実際の作業内容は変更されることが
考えられるので、それぞれのステップで確認が
必要である。

(間違いなどがあるかもしれないので、そのときには
指摘してもらえたら修正します。)


***** 大まかな流れ ******

1. 既にパッケージとして存在していないか確認する
2. ITP をメーリングリストに投稿する
3. ソースファイルの準備
4. configure の整理
5. gpg の鍵の作成
6. deb パッケージの作成
7. mentors のアカウント作成とパッケージアップロード
8. mentor とのやりとり
9. unstable の apt へと登録される
10. 他のアーキテクチャでのバグを修正

このうち、予想以上に手間暇がかかるのが
5 の gpg の鍵の作成である。
これは、実際に人にあって鍵を確認してもらう
必要があるためである。
(そうでなければ、どこの誰とも解からない人の
パッケージが登録されてしまうため)

**** 1. 既にパッケージとして存在していないか確認する ****

すでに登録されているパッケージは作る必要がないので、
これをあらかじめ確認しておく。
確認するには、
http://www.debian.org/distrib/packages
に行って、
「パッケージディレクトリを検索」を検索のところで
パッケージ名を入力する。
検索対象としては「パッケージ説明文」を選択する。
(「パッケージ名のみ」だと同じパッケージを違った
名前で登録されていると見落としがちになる。)
また、ディストリビューションとしては、「すべて」にする。
ここでヒットしていなければ、とりあえずパッケージとしては
まだ作成されていない。

さらに、「現在作業中のパッケージ」
http://www.debian.org/devel/wnpp/being_packaged
や「作成の要求がきているパッケージ」
http://www.debian.org/devel/wnpp/requested
についてもあらかじめチェックしておく。

**** 2. ITP をメーリングリストに投稿する ****

ITP とは、Intend To Package の略であり、
つまり、「自分がパッケージ化します」という
宣言をすることである。
一度宣言したら、自分でパッケージ化する責任が
あるので、よくよく考えてから宣言する。

また、パッケージ化するにはライセンスの確認が
避けられないので、Debian に登録できるライセンスを
確認する。
GPL のライセンスであれば特に問題ないが、
GPL のライセンスのときには GPL のライセンス条項を
http://www.gnu.org/licenses/gpl.html
http://sourceforge.jp/projects/opensource/wiki/licenses%252FGNU_General_Public_License_version_3.0
などで確認しておく。

他にも、Debian フリーソフトウェアガイドライン
http://www.debian.or.jp/community/devel/debian-policy-ja/policy.ja.html/ch-archive.html#s-dfsg
の条項を確認しておく。基本的にはこの条項をクリアできないと
Debian パッケージにはなれない。

また、Debian ポリシーマニュアルは必ず一通り目を通す。
http://www.debian.or.jp/community/devel/debian-policy-ja/policy.ja.html/index.html
最初はよくわからない単語が多いが、ここを参照することが
頻発するので、今の段階で単語の意味が解からなくても
「そういえばポリシーマニュアルに載っていたかも」
と気づくだけで、かなり作業が楽になる。
あとで debuild でエラーなどが出るときには、
ここがとても参考になる。

Ubuntu のパッケージングガイドも参考になる。
https://wiki.ubuntulinux.jp/UbuntuPackagingGuideJa
だいたいの概略を Ubuntu のガイドで把握してから
Debian のポリシーマニュアルを読む、というのも
効率的である。

ここまでを確認したら、ITP をメールで宣言する。
詳しい方法は
http://www.debian.org/devel/wnpp/#l2
にあるが、SDPA の場合は
http://www.mail-archive.com/debian-wnpp@lists.debian.org/msg111640.html
のようなメールを送っている。
なお、新規パッケージは wnpp パッケージとして一度
登録されるが wnpp とは
Work-Needing and Prospective Packages
の略である。
ITP のメールを出すときのメールアドレスは、
今後のパッケージ登録でもメールアドレスを
使うので同じアドレスが使えるほうがよいと思う。

このメールアドレスは環境変数にも登録しておく。
~/.bashrc に
export DEBFULLNAME="フルネール"
export DEBEMAIL=example@example.com
のようにして名前とメールアドレスを登録しておく。

ITP が登録されると、Bug 番号が振られる、
自分にメールが届く。
(SDPA の場合は、Bug#59446 である。)
この番号は新規パッケージを作るときには
重要なので必ずメモしておく。

**** 3. ソースファイルの準備 ****

ソースファイルは必ず配布できないといけないので、
ソースファイルが入手できないものはパッケージ化できない。

ソースファイルが Debian でコンパイルできることを確認する。
Debian のパッケージとしては、まずは unstable の
ディストリビューションに登録されるので、unstable な
Debian を準備する。
もちろん、unstable なので、通常業務とは別に用意する。

SDPA のパッケージ作成では、vmplayer で仮想環境を作っている。
(最初はよくわからなかったので、5回ぐらい
インストールしなおしたりして、使い勝手のいい環境にしている。)
なお、pbuilder などでさらに内側で仮想環境を作るので、
仮想環境のディスク容量は 20GB は確保しておいたほうがよい。
SDPA はコマンドラインで動くパッケージであるが、
それでも仮想ディスク全体の使用容量が 10GB 以上になっている。
(/dev/sda1 が 10GB 以上使用している)
メモリは vmplayer に 4GB を使用させているが、
おそらく 2GB はあったほうがいいと思われる。
vmplayer に1GB でもパッケージは作成できるが、かなり厳しい。

Debian では、 stable をまずはインストールした。
さらに、/etc/apt/sources.list を修正し、lenny 用に
なっている箇所を sid とする。
このあと、
# apt-get update
# apt-get upgrade
で unstable になる。なお、Debian では、
sid ディストリビューションとは unstable
ディストリビューションのことを指すようである。

unstable に切替えたところで、必要なパッケージを
インストールする。
パッケージを作成するのに必要なパッケージは
pbuilder を入れるとそれといっしょに
ほぼほとんど入るので、まずは pbuilder を
インストールする。

# apt-get install pbuilder

今まで gcc などもインストールされていなければ、
この時点で 100 以上のパッケージがインストールされると思う。
いずれにしても、pbuilder はパッケージ化の確認に
必要なので必ずインストールする。

今後必要なパッケージが出てきた場合には、そのつど
インストールする。
なお、どのパッケージがどのファイルを持っているかは、
http://www.debian.org/distrib/packages#search_contents
で検索できる。
(ディストリビューションを unstable にして検索すること)

このあと、ソースファイルを一度コンパイルして
Debian でコンパイルできるか確認する。

**** 4. configure の整理 ****

SDPA は configure スクリプトを用いているので、
deb パッケージを作る際に CDBS が使えて楽であった。
ただし、configure スクリプトは必須ではない。
configure スクリプトを準備すると、
$ ./configure && make && make install
の3ステップでインストールができるようになる。
なお、configure スクリプトの作り方は、
http://www.spa.is.uec.ac.jp/~kinuko/slidemaker/autotools/
がとてもよくまとめてあり、SDPA の configure を
更新する際にも参考にしている。

**** 5. gpg の鍵の作成 ****

Debian パッケージを apt に登録するときには、
だれが作成したか、という情報を署名しなければならない。
これがないと、deb ファイルは作れるが、apt には
登録できない。

この署名は電子的に行われ、基本的には gpg という
暗号化ソフトウェアが利用される。
$ dpkg --list | grep gpg
として gpgv パッケージが見つかればすでに gpg は
インストール済みである。
これが見つからなければ、apt-get でインストールする。

gpg の鍵は RSA の 4096 ビットで作る必要がある。
実際の作り方は、
http://lists.debian.or.jp/debian-users/200909/msg00008.html
に詳しいので、これを参考にして作る。
これとあわせて
http://www.debian.org/events/keysigning.ja.html
も参考にする。とくに、最後の
「やってはいけないこと」は必ず目を通す。

このあと、自分の鍵のうち、公開鍵を鍵用のサーバーに
登録する。よく使われるのは2つなので、以下の2つに
登録する。

$ gpg --keyserver pgp.mit.edu --send-keys
$ gpg --keyserver gp.nic.ad.jp --send-keys

なお、pgp.mit.edu では名前などでも検索できるので、
他のひとの公開鍵を検索することも可能である。
(そうでなければ、パッケージについている電子署名を
確認できないので)

作成して登録した鍵については、サインパーティで
自分の鍵であることを示す。
詳細は、
http://lists.debian.or.jp/debian-users/200909/msg00008.html
http://www.debian.org/events/keysigning.ja.html
に書かれているが、Debian の人とあって、
「これが自分の鍵です」と宣言する必要がある。
サインパーティは何回か行われているので、
スケジュールがあえばサインパーティに参加するのが
いいと思われる。
サインパーティがいつ開催されるかは、Google などで
検索すると簡単に解かる。

SDPA の場合にはスケジュールがあわなかったので、
Debian の人にお願いして、新宿の喫茶店で
鍵の確認をしてもらった。
(「Debian の人」の個人名はここでは伏せておきます。
名前を出すのであれば本人の了承が必要だと思うので)
このときには、運転免許証やパスポートなどの
公的機関が発行している写真つきの証明書が必要である。
自分の鍵をプリントアウトしたものを持っていって、
自分の口で「これが自分の鍵です」と明言することになる。

なお、運転免許証などには住所など個人情報が掲載されて
いるので、鍵を確認する人が Debian の人であるか、
怪しい人ではないか、さきにインターネットの情報
などをチェックしておくべきである。
(と、確認してもらった際に教えてもらった。)

鍵を確認してもらうと、Debian の人から署名された鍵が
メールで送られてくる。これを自分の鍵に import して、
このあと自分の鍵を export して Debian の人に送り返す。
import, export については、以下に詳しい。
http://www.debian.org/events/keysigning.ja.html

これで自分の鍵が deb パッケージへの署名に
使える段階となる。
(パッケージへの署名自体は確認してもらわなくても
できるが、最終的に apt に登録するには確認が必要。)

**** 6. deb パッケージの作成 ****

ソースファイルがあるときの deb パッケージの作成方法は、
http://yoshimov.com/?page=Ubuntu%2Fdeb%A5%D1%A5%C3%A5%B1%A1%BC%A5%B8%A4%CE%BA%EE%C0%AE
が参考になった。
ただし、必要ソフトは pbuilder をインストールすれば、
他もほとんど同時にインストールされる。

とにかく、現在のソースファイルについて、
debian というサブディレクトリができていることが
重要である。
これを修正したうえで、パッケージをコンパイルする。

なお、ここからはソースファイルのディレクトリと
コンパイルするためのディレクトリは別にしたほうがよい。
つまり、パッケージ作成のためにコンパイルするときには
ソースファイルのディレクトリをまるごと別にコピーして、
そちらでコンパイルする。
こうすれば、コンパイルの過程で誤ってソースファイルを
変更してしまっても問題ない。
SDPA の場合には、コンパイルするときには、
一度コンパイルのためのディレクトリを全消去して、
ソースファイルからコピーし直している。

実際には、以下のような作業をシェルスクリプトで行っている。
(ほんとのスクリプトはもっといろんなことをできるように
設定している。)
$ cd ~
$ rm -rf ~/compile-test
$ cd ~/source-directory/
$ rm -f `find . | grep ~$` (emacsなどでの作業ファイルを削除)
$ autoreconf (configure ファイルを更新しなおす)
$ rm -f autom4te.cache (autoreconf の途中ファイルを削除)
$ cd ~/compile-test
$ cp -r ~/source-directory sdpa-7.3.5.dfsg
$ tar czf sdpa_7.3.5.dfsg.orig.tar.gz sdpa-7.3.5.dfsg
$ cd sdpa-7.3.5
$ debuild -us -uc (ここで -us -uc は署名しないようにするため)

なお、SDPA では通常のパッケージと Debian のパッケージでは、
内部に MUMPS を持っているかどうかで異なるため、
通常パッケージと異なることを示す "dfsg" をディレクトリ名や
ファイル名につけている。

debuild で実際にコンパイルしているわけであるが、
最初は失敗しまくるので電子署名は必要ではない。
きちんとコンパイルなどを通してから署名すれば十分である。

なお、debian/ ディレクトリについては、
http://www.debian.or.jp/community/devel/debian-policy-ja/policy.ja.html/
の4章と5章にその概要が書かれている。
ただし、ここに書かれている概要はあまり詳しくないので、
インターネットでの検索も重要であるし、
既にあるパッケージを参考にすることもある。

たとえば、SDPA のパッケージを作る際には、MUMPS のパッケージなどを
参考にした。この場合には
http://www.debian.org/distrib/packages
の「パッケージディレクトリを検索」で MUMPS が
http://packages.debian.org/sid/libmumps-4.9.2
にあることを見つけ、ページ右側の
「ソースパッケージをダウンロード」を確認する。

$ wget http://ftp.de.debian.org/debian/pool/main/m/mumps/mumps_4.9.2.dfsg-6.dsc
$ wget http://ftp.de.debian.org/debian/pool/main/m/mumps/mumps_4.9.2.dfsg.orig.tar.gz
$ wget http://ftp.de.debian.org/debian/pool/main/m/mumps/mumps_4.9.2.dfsg-6.debian.tar.gz

でダウンロードして、
$ dpkg-source -x mumps_4.9.2.dfsg-6.dsc
とすると、パッケージを展開できるので、これで
debian/ ディレクトリがどうなっているかを
知ることができる。

同様のことを他のパッケージにも行い、どのように
すれば debian/ ディレクトリが書けるかを
実例で把握できる。
なお、debin/rules は一般には長くなるが、
configure の場合には CDBS を利用すると
かなり簡単にできる。
(SDPA のパッケージを上記方法で確認すると解かる。)
CDBS については、
http://sugi.nemui.org/doc/cdbs/cdbs-trans-1st.html
を読むとよくわかるし、
http://cdbs-doc.duckcorp.org/
にマニュアルが整備されている。


なお、新規パッケージの場合は、ITP (Intend To Package)
のときのバグの番号を debian/changelog に書く必要がある。
SDPA では、debian/changelog の中の
* New package release (closes: #594463) が対応している。


$ debuild -uc -us
でコンパイルすると、最初のころはエラーがたくさん出るので、
これを修正する。
コンパイルが通るとパッケージを作成し、パッケージチェックが
行われる。
このチェックは lintian というプログラムが実行しており、
debian/ ディレクトリ以下のおかしいところが指摘される。
lintian が出す Warning や Error は Google で検索すると
すぐに情報が出てくるので、これに従って Warning, Error が
出てこないようになるまで、ひたすら修正する。
(lintian は debuild コマンドの最後のあたりで実行されるので、
debuild が終了したら出ているメッセージの最後の
30行程度にあるはずである。)

debuild が終了すると、
debuild を実行したディレクトリのひとつ上のディレクトリに
deb パッケージが作成されている。
(???.deb というパッケージと ???.dsc というパッケージの内容が
記されているファイル、???.changes というファイル更新状況を
まとめたファイル、そして ???.orig.tar.gz のソースファイル
があるはずである。)

どのようなファイルになっているかは、
$ dpkg-deb -c ???.deb
で確認できる。
また、
# dpkg -i ???.deb
とするとインストールすることもできるはずである。
ただし、間違った構成にしているとインストールの時点で
システムファイルに上書きしてしまう危険性もあるので、
十分に確認してから行う必要がある。
なお、アンインストールするには
# dpkg -r ???
である。

debuild でインストールなどを確認したら、次は
pbuilder での確認である。
pbuilder は Debian の中に仮想環境を作って、
その中でコンパイルが行われる。
apt に登録されるパッケージは、apt 側で
用意されているサーバでコンパイルされて
バイナリが生成されるので、pbuilder で失敗する
のであれば、サーバでのコンパイルも失敗する可能性が高い。
pbuilder の使いかたは、
http://www.debian.org/doc/maint-guide/ch-build.ja.html
の6.5章に詳しい。
つまり、ベースとなる環境を仮想的に構築して、
その中で必要なパッケージなどをインストールして、
コンパイルを試すのである。
$ sudo pbuilder --create
で初期化するが、これだけでだいぶ時間がかかる。
そのあと
$ sudo pbuilder --update
$ sudo pbuilder --build ???.dsc
で実際にチェックが行われる。
なお、createは一回でいいが、update は Debian の他の
パッケージがアップデートされたら、その情報を pbuilder に
取り込むため、ひさしぶりに build するのであれば
その前に update しておいたほうがよい。

pbuilder では、実際にパッケージの依存情報や
インストール、アンインストールがチェックされるので、
ここのエラーも確実に取り除く。

なお、pbuilder は仮想環境を mount しているので、
途中で kill などで強制終了すると mount がうまく
外れず、次回の pbuilder が行えないことがある。
mount をうまく外すか、よくわからなければ Debian 全体を
再起動して pbuilder --update をしたほうがよい。

ここまで来たら、以下のチェックリストで確認する。

[1] ./configure && make && make install でインストールできること
[2] debuild で *.deb が生成できて、このときに gcc, lintian が
error と warning を出さないこと
[3] debuild でビルドしたあとに、もう一度そのまま debuild で
連続してビルドできること
make clean などがうまく書かれていないと、ここでこける。
SDPA では、octave のファイルを make とは別にコンパイル
しているので(debian/rules の "build/sdpam::" のところ)、
これを消去するために、Makefile.am で
MOSTLYCLEANFILES を追加している。
[3] pbuilder --build *.dsc でエラーが出て止まらないこと
[4] piuparts を使ってパッケージのインストール、アンインストール
アップデートアップグレードのチェックをパスすること
ただし、piuparts 自体が発展途上なので、piuparts の
エラーで止まることもある。
[5] 実際にインストールして動作確認をする。

**** 7. mentors のアカウント作成とパッケージアップロード ****

Debian では作成したパッケージは mentors.debian.net に登録して、
mentor というチェックする人にチェックを受ける。
http://mentors.debian.net/cgi-bin/maintainer-intro
に入って、sign up でアカウントを作成する。
このときに、自分のgpgの公開鍵とメールアドレスを
登録する必要がある。
公開鍵は、sign up のページにあるとおり、
"gpg --export --armor your-email-address > public-key-file"
とすればよい。

mentors.debian.net でアカウントを作ったら、
アップロードするパッケージを作成する。
今回は、debuild に -uc -us をつけずに、そのまま
$ debuild
でコンパイルする。最後に gpg による電子署名が2回行われる。

できあがったら、
$ dput mentors ???.changes
によって、mentors.debian.org にアップロードする。
アップロードが完了すると、mentors.debian.org から
「完了した」という意味のメールがくる。
ファイルは、
http://mentors.debian.net/debian/pool/main/s/sdpa/
のように、パッケージの最初の文字ごとのディレクトリの
中にパッケージ名でディレクトリができて、
そこにアップロードされる。
なお、dput をすると、???.upload というファイルが
できる。これは dput で誤って何回もアップロードを
防ぐためのようである。もし、本当にアップロード
しなおさないといけないときには、このファイルは
削除して dput する。

アップロードすると、mentor になってくれる人を募集する
メールのテンプレートが表示されるので、これにしたがって
mentor になってくれる人を募集する。
これは RFS と呼ばれ、たとえば SDPA なら
http://www.mail-archive.com/debian-mentors@lists.debian.org/msg69737.html
というメールを出している。

mentor は基本的にボランティアであるため、いつの時点で
mentor になってくれる人が名乗り出てくれるか解からない。
とりあえず待つしかないのである。
聞いたところでは、日本人の場合は apt に登録しようとする人が
少ないようなので、日本人が mentorになってくれることが
多いそうである。日本人が mentor だと、あとのやりとりを
日本語でできる分、スムーズに行える。

**** 8. mentor とのやりとり ****

mentor がつくと、mentor とのやりとりが始まる。
パッケージのディレクトリ構成など、いろいろな点を
指摘してくれるので、それをひとつひとつ修正する。
SDPA パッケージの場合、ここで
sdpa, libsdpa-dev, sdpam の3つに分割することを
提案されており、それに従っている。

(SDPA の場合、サインパーティを自分が知らなかったので、
mentor についてもらってから gpg の確認を行っている。
ただし、本来は先にサインパーティに行ったほうがよい。)

SDPA では1ヶ月程度、ほぼ毎日メールでやりとりをして
修正をおこなった。
mentor の方はだいぶ丁寧に教えてくれるが、
もちろん何でもかんでも mentor に聞くのではなく
あらかじめ自分で調べてから、それでも解からない点を
mentor に聞くようにする。
ちなみに、一度パッケージ作りをすると、
mentor をしている人がとてもよくサポートしてくれる
ことも解かる。

mentor がチェックをして OK が出ると、Debian Developer
の人が Debian のサーバーに登録してくれる。
ここからは、Debian Developer の人達によるチェックが
始まる。日本人だけではないので、改良点についての指摘が
英語メールでくることもある。英語とはいっても
難しい英語ではないので、丁寧な気持ちで答えれば
なんとかなる。

**** 9. unstable の apt へと登録される ****

Debian Developer のチェックが終わると、apt に登録される。
ただし、登録までには2,3週間かかるようである。
この時点で、unstable で
# apt-get update
# apt-cache search sdpa
とすることで SDPA が apt に登録されたことを確認できる。
(登録された、ということはメールなどでは特には通知されない。)
もちろん、
# apt-get install sdpa
でインストールもできる。

ここで、
http://packages.debian.org/sid/sdpa
に SDPA が登録されているページができる。
また、逆に卒業したことなる mentors.debian.net からは
ファイルが削除される。

**** 10. 他のアーキテクチャでのバグを修正 ****

一度登録されると、他のアーキテクチャでのコンパイルなども
行われる。SDPA は amd64 でコンパイルなどを確認しているが、
i386 などが自動的にコンパイルされる。
他のアーキテクチャでもコンパイルできているかは、
http://packages.debian.org/sid/パッケージ名
で右のほうにある「メンテナ」の「QAページ」へと移動し、
「buildd」に移動すると確認できる。
ここで、maybe-successful であれば OK であるが、
maybe-failed が出た場合には修正する。

maybe-failed をクリックするとコンパイルログが
出てくる。ただし、config.log を入手するのは難しいので、
configure スクリプトの場合には、エラーが出たときに
どのようなエラーか詳細を出力するようにしておいたほうがよい。
SDPA では、configure.in で AC_MSG_ERROR を
出力するときには、どのようなコンパイルをして
失敗しているかを表示するようにしてある。

アーキテクチャによっては、ディレクトリ構成などが
異なることがありうるので、そのような場合には
http://packages.debian.org/
でどのディレクトリにファイルがあるかを確認し、
それを反映できるようにする。
SDPA の場合は、ATLAS のファイルがこれに相当する
ことがありうるので、debian/rules の
DEB_CONFIGURE_EXTRA_FLAGS で configure スクリプト
へのオプションを切替えるようにしている。

また、debian/ ディレクトリやソースなどを変更したら、
debian/changelog を修正することも忘れずに行う。
このときに、少しずつバージョンがあがる。
SDPA のときは、7.3.2, 7.3.3, 7.3.4 と3回
かかっている。

修正したファイルは、debuild でビルド、チェックをし、
そのあと dput で mentors.debian.net へアップロードする。
mentor の人にメールで再度チェックをお願いするが、
すでに一度アップロードされていれば修正は大きくないので、
最初のアップロードほどは大変ではない。

なお、Debian で登録されると、数日のうちに
Ubuntu にも登録される。

Ubuntu にも自動的にパッケージのページができて、SDPAなら
https://launchpad.net/sdpa
である。
なお、バイナリ生成のためにコンパイル中であれば、そのことも
launchpad に表示される。

************************************************

ここまでで apt への登録は一通りである。
あとは、新しいバージョンが出たら、修正を行い、
mentors.debian.net へアップロードし、mentor の方に
チェックを受けるサイクルとなる。




今日の作業内容:Debian パッケージについてまとめ 5h
今日のランチ:つかさ 鯖の塩焼
明日の予測作業時間:4h