% This file was generated with po4a. Translate the source file.
%
\documentclass[10pt,final]{beamer}
\mode<presentation> \usetheme{debian}

\usepackage{debiantutorial.ja}\hypersetup{unicode}\usepackage[whole]{bxcjkjatype}

\hypersetup{bookmarks}
\title{Debian パッケージングチュートリアル}
\author[]{Lucas Nussbaum\\{\small\texttt{packaging-tutorial@packages.debian.org}}}

\date{\footnotesize version 0.29 -- 2021-11-03} 

\begin{document}


\frame{\titlepage}

\begin{frame}{このチュートリアルについて}
  \begin{itemize}
  \item 目的: \textbf{Debianのパッケージ作成について、知る必要のあることの提供}
    \begin{itemize}
      \hbr
    \item 既存パッケージの修正
      \hbr
    \item 自作パッケージの作成
	    \hbr
    \item Debian コミュニティとのやりとり
      \hbr
    \item Debian のパワーユーザーになる
    \end{itemize}
    \br
  \item 最も重要な点を押さえているが不完全
    \begin{itemize}
    \item 詳細なドキュメントを参照
    \end{itemize}
    \br
  \item ほとんどの内容は Debian 派生ディストリビューションにも適用可能
    \begin{itemize}
      \hbr
    \item Ubuntu を含む
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}{アウトライン}
  \tableofcontents[hideallsubsections]
\end{frame}

\section{はじめに}

\subsection{Debian}

\begin{frame}{Debian}
	\begin{itemize}
		\item \textbf{GNU/Linux ディストリビューション}
			\br
		\item 「GNU の精神でオープンに」開発している\\第一のメジャーディストリビューション
			\br
		\item \textbf{非商用}: 1,000 人以上のボランティアが協力して開発
			\br
		\item 3つの主要機能
			\begin{itemize}
				\item \textbf{品質} -- 技術的利点の文化\\ {\small\sl 準備できた時にリリース}
					\hbr
				\item \textbf{自由} -- 開発者とユーザーは、1993 年に成立した、\\フリーソフトウェアの文化を促す\textsl{社会契約}で結ばれている。
					\hbr
				\item \textbf{独立} -- Debian のお守りをしている (単一) 企業はない\\ また、オープンな意思決定プロセス (\textsl{実行主義}
+ \textsl{民主主義})
			\end{itemize}
                        \br
                \item 最高の \textbf{アマチュア} が、好きだからこそ成し遂げた
	\end{itemize}
\end{frame}

\subsection{Debian パッケージ}
\begin{frame}{Debian パッケージ}
\begin{itemize}
\item \textbf{.deb} ファイル (バイナリパッケージ)
	\br
\item ソフトウェアをユーザーに配布する、とても強力で便利な方法
	\br
\item もっとも一般的なパッケージフォーマットのひとつ (もうひとつは RPM)
	\br
\item ユニバーサル:
	\begin{itemize}
		\item 30,000 のバイナリーパッケージ\\ $\rightarrow$ ほとんどのフリーソフトウェアがDebianでパッケージ化
			\hbr
		\item 2 つの 非 Linux (Hurd, KFreeBSD) を含む 12 の移植版 (アーキテクチャ)
			\hbr
		\item 120 の Debian 派生ディストリビューションでも使用
	\end{itemize}
\end{itemize}
\end{frame}


\subsection{deb パッケージフォーマット}

\begin{frame}[fragile=singleslide]{deb パッケージフォーマット}
  \begin{itemize}
  \item \texttt{.deb} ファイル: \texttt{ar} アーカイブ
    \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
$ ar tv wget_1.12-2.1_i386.deb
rw-r--r-- 0/0      4 Sep  5 15:43 2010 debian-binary
rw-r--r-- 0/0   2403 Sep  5 15:43 2010 control.tar.gz
rw-r--r-- 0/0 751613 Sep  5 15:43 2010 data.tar.gz
    \end{lstlisting} \begin{itemize}
    \item \texttt{debian-binary}: deb ファイルフォーマットのバージョン \texttt{"2.0\textbackslash{}n"}
    \item \texttt{control.tar.gz}: パッケージについてのメタデータ\\ {\small \texttt{\textbf{control},
md5sums, (pre|post)(rm|inst), triggers, shlibs}, \ldots}
    \item \texttt{data.tar.gz}: パッケージのデータファイル
    \end{itemize}
    \br
  \item \texttt{.deb} ファイルを手で作ることも可能\\ {\footnotesize
\url{http://tldp.org/HOWTO/html\_single/Debian-Binary-Package-Building-HOWTO/}}
    \br
  \item しかし、ほとんどの人には不要
  \end{itemize}
  \br
  \centerline{\textbf{本チュートリアル: Debian のパッケージを Debian 流に作成}}
\end{frame}

\subsection{必要なツール}
\begin{frame}{必要なツール}
  \begin{itemize}
  \item Debian (ないし Ubuntu) システム (要 root アクセス)
    \br
  \item いくつかのパッケージ:
    \begin{itemize}
    \item \textbf{build-essential}: 開発者のマシンで利用前提となるパッケージに依存 (パッケージの
\texttt{Build-Depends:} コントロールフィールドに指定不要)
      \begin{itemize}
      \item パッケージを作成する、基本的な Debian 特化ツールである \textbf{dpkg-dev} への依存関係を含む
      \end{itemize}
      \hbr
    \item \textbf{devscripts}: Debian メンテナにとって便利なスクリプト群
    \end{itemize}
  \end{itemize}

  \br
  \textbf{debhelper}, \textbf{cdbs}, \textbf{quilt}, \textbf{pbuilder},
\textbf{sbuild}, \textbf{lintian}, \textbf{svn-buildpackage},
\textbf{git-buildpackage}, \ldots といった、その他たくさんのパッケージ (後述)\\ 必要に応じてインストール。
\end{frame}

\subsection{一般的なパッケージングワークフロー}
\begin{frame}{一般的なパッケージングワークフロー}
  \begin{center}
    \begin{tikzpicture}[
      node1/.style={shape=rectangle,draw=rouge,fill=debianbackgroundblue,thick},
      arr/.style={very thick}, command/.style={text=rouge,font=\ttfamily}, ]
      
      \node[node1] (www) at (0, 0) {Web}; \node[node1] (us) at (2.5, 0) {upstream
ソース}; \node[node1] (da) at (-2.5, 0) {Debian ミラーサイト}; \node[node1] (sp) at
(0, -2) {ソースパッケージ}; \draw[arr,<-,dashed,thick] (sp) -- (2.5,-2)
node[right=0cm,text width=2.98cm,text centered,font=\small\sl]
{ここでほとんどの手作業を実行}; \node[node1] (bin) at (0, -4) {単一/複数のバイナリーパッケージ};
\draw[arr,<-,dashed,thick] (bin) -- (3.5,-4) node[right,text
centered,font=\small\ttfamily\sl] {.deb\normalfont}; \draw[arr,->] (us) --
(sp) node[pos=0.5,right,command] {dh\_make}; \draw[arr,->] (da) -- (sp)
node[pos=0.5,left,command] {apt-get source}; \draw[arr,->] (www) -- (sp)
node[pos=0.5,left,command] {dget}; \draw[arr,->] (sp) -- (bin)
node[pos=0.5,right,text width=6cm] {\textttc{debuild} (構築と \textttc{lintian}
によるテスト) または \textttc{dpkg-buildpackage}}; \draw[arr,->] (bin) -- (1,-6)
node[pos=0.5,right] {インストール (\textttc{debi})}; \draw[transparent] (bin) --
(-1,-6) node[pos=0.5,left,opaque] {アップロード (\textttc{dput})};
\draw[arr,->,rounded corners] (bin) -- (-1,-6) -- (-4.5,-6) -- (-4.5,0) --
(da); \useasboundingbox (-4,-6) rectangle (6,0); \end{tikzpicture}
  \end{center}
\end{frame}

\subsection{dash の再構築}
\begin{frame}{例: dash の再構築}
\begin{enumerate}
\item dash を構築するのに必要なパッケージと devscripts のインストール\\ {\texttt{sudo apt-get build-dep
dash}\\ (\texttt{/etc/apt/sources.list} に \texttt{deb-src} 行が必要)}\\ 
{\texttt{sudo apt-get install -{}-no-install-recommends devscripts
fakeroot}}
  \hbr
\item 作業ディレクトリーを作成し、そこに移動\\ \texttt{mkdir /tmp/debian-tutorial ; cd
/tmp/debian-tutorial}
  \hbr
\item \texttt{dash} のソースパッケージを入手\\ \texttt{apt-get source dash}\\ {\small
(\texttt{/etc/apt/sources.list} に \texttt{deb-src} 行が必要)}
  \hbr
\item パッケージの構築\\ {\texttt{cd dash-*\\ debuild -us -uc}} ~~~(\texttt{-us -uc} は GPG
によるパッケージ署名を無効化)

  \hbr
\item 結果の確認
	\begin{itemize}
		\item  新しい \texttt{.deb} ファイルが親ディレクトリーに
	\end{itemize}
    \hbr
\item \texttt{debian/} ディレクトリーを参照
	\begin{itemize}
		\item パッケージング作業を行う場所
	\end{itemize}
\end{enumerate}
\end{frame}

\section{ソースパッケージの作成}
\subsection{ソースパッケージの基礎}
\begin{frame}{ソースパッケージ}
  \begin{itemize}
  \item 1 つのソースパッケージから複数のバイナリーパッケージを生成\\ {\small 例: \texttt{\bfseries libtar} のソースから
\texttt{\bfseries libtar0} と \texttt{\bfseries libtar-dev} のバイナリーパッケージを生成} \hbr
  \item 2種類のパッケージ: (よく判らなければ非ネイティブで)
    \begin{itemize}
      \small
    \item ネイティブパッケージ: 通常 Debian 固有ソフトウェア (\textsl{dpkg}, \textsl{apt})
    \item 非ネイティブパッケージ: Debian 外で開発されたソフトウェア
    \end{itemize}
    \hbr
  \item メインファイル: \texttt{.dsc} (メタデータ)
    \hbr
  \item ソースフォーマットのバージョンに依存する他のファイル
    \begin{itemize}
    \item 1.0, 3.0 (ネイティブ): \texttt{package\_version.tar.gz}
      \hbr
    \item 1.0 (非ネイティブ):
      \begin{itemize}
      \item \texttt{pkg\_ver.orig.tar.gz}: 上流ソース
      \item \texttt{pkg\_debver.diff.gz}: Debian 固有の変更を加えるパッチ
      \end{itemize}
      \hbr
    \item 3.0 (quilt):
      \begin{itemize}
      \item \texttt{pkg\_ver.orig.tar.gz}: 上流ソース
      \item \texttt{pkg\_debver.debian.tar.gz}: Debian の変更を格納した tarball
      \end{itemize}
    \end{itemize}
  \end{itemize}
  \hbr
  (詳細は \texttt{dpkg-source(1)} を参照)
\end{frame}

\begin{frame}[fragile=singleslide]{ソースパッケージの例 (wget\_1.12-2.1.dsc)}
  \begin{lstlisting}[basicstyle=\ttfamily\small]
Format: 3.0 (quilt)
Source: wget
Binary: wget
Architecture: any
Version: 1.12-2.1
Maintainer: Noel Kothe <noel@debian.org>
Homepage: http://www.gnu.org/software/wget/
Standards-Version: 3.8.4
Build-Depends: debhelper (>> 5.0.0), gettext, texinfo,
 libssl-dev (>= 0.9.8), dpatch, info2man
Checksums-Sha1: 
 50d4ed2441e67[..]1ee0e94248 2464747 wget_1.12.orig.tar.gz
 d4c1c8bbe431d[..]dd7cef3611 48308 wget_1.12-2.1.debian.tar.gz
Checksums-Sha256: 
 7578ed0974e12[..]dcba65b572 2464747 wget_1.12.orig.tar.gz
 1e9b0c4c00eae[..]89c402ad78 48308 wget_1.12-2.1.debian.tar.gz
Files: 
 141461b9c04e4[..]9d1f2abf83 2464747 wget_1.12.orig.tar.gz
 e93123c934e3c[..]2f380278c2 48308 wget_1.12-2.1.debian.tar.gz
\end{lstlisting}
\end{frame}

\subsection{ソースパッケージの入手}
\begin{frame}{既存のソースパッケージの入手}
  \begin{itemize}
  \item Debian のアーカイブから:
    \begin{itemize}
    \item \texttt{apt-get source \textsl{package}}
    \item \texttt{apt-get source \textsl{package=version}}
    \item \texttt{apt-get source \textsl{package/release}}
    \end{itemize}
    (\texttt{sources.list} に \texttt{deb-src} 行が必要)
    \br
  \item インターネットから:
    \begin{itemize}
    \item \texttt{dget \textsl{url-to.dsc}}
    \item \texttt{dget
http://snapshot.debian.org/archive/debian-archive/\\20090802T004153Z/debian/dists/bo/main/source/web/\\ 
wget\_1.4.4-6.dsc}\\ (\href{http://snapshot.debian.org/}{\ttfamily
snapshot.d.o} では、2005 年以降の Debian からのすべてのパッケージを提供)
    \end{itemize}
    \br
  \item (公開された) バージョン管理システムから:
    \begin{itemize}
    \item \texttt{debcheckout \textsl{package}}
    \end{itemize}
    \br
  \item ダウンロードしたら \texttt{dpkg-source -x \textsl{file.dsc}} で展開
  \end{itemize}
\end{frame}

\subsection{基本的なソースパッケージの作成}
\begin{frame}{基本的なソースパッケージの作成}
  \begin{itemize}
  \item 上流ソースのダウンロード\\ (\textsl{上流ソース} = ソフトウェアのオリジナル開発者からのもの)
    \hbr
  \item \texttt{<\textsl{source\_package}>\_<\textsl{upstream\_version}>.orig.tar.gz}
に名前の変更\\ (例: \texttt{simgrid\_3.6.orig.tar.gz})
    \hbr
  \item tar を展開
    \hbr
  \item ディレクトリーを \texttt{<\textsl{source\_package}>-<\textsl{upstream\_version}>}
に変更\\ (例: \texttt{simgrid-3.6})
    \hbr
  \item \texttt{cd \texttt{<\textsl{source\_package}>-<\textsl{upstream\_version}>}
\&\& dh\_make}\\ (\textbf{dh-make} パッケージに収録)
    \hbr
  \item \texttt{dh\_make} の代わりに特定のパッケージ向けのものも:\\\textbf{dh-make-perl},
\textbf{dh-make-php}, \ldots \hbr
  \item \texttt{debian/} ディレクトリーにたくさんのファイルが作成
  \end{itemize}
\end{frame}

\subsection{debian/ 内のファイル}
\begin{frame}{debian/ 内のファイル}
  パッケージングの作業は、すべて \texttt{debian/} 以下の変更で行う
  \hbr
  \begin{itemize}
  \item メインのファイル:
    \begin{itemize}
    \item \textbf{control} -- パッケージに関するメタデータ (依存関係 etc.)
    \item \textbf{rules} -- パッケージの構築方法を記載
    \item \textbf{copyright} -- パッケージの著作権情報
    \item \textbf{changelog} -- Debian パッケージの履歴
    \end{itemize}
    \hbr
  \item その他のファイル:
    \begin{itemize}
    \item compat
    \item watch
    \item dh\_install* targets\\ {\small *.dirs, *.docs, *.manpages, \ldots}
    \item メンテナースクリプト\\ {\small *.postinst, *.prerm, \ldots}
    \item source/format
    \item patches/ -- 上流ソースを変更する必要がある際に使用
    \end{itemize}
    \hbr
  \item ファイルのフォーマットは RFC 822 (メールヘッダー) を基にしたものも
  \end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{debian/changelog}
  \begin{itemize}
  \item Debian パッケージの変更点一覧
  \item パッケージの現在のバージョンの見方
  \begin{center}
    \begin{tikzpicture}
	    \draw (0,0) node[above right] {\large 1.2.1.1-5}; \draw
[decorate,decoration={brace}] (2.25,0) -- (1.45,0) node[at start,below,text
width=1.6cm,text centered] {\small Debian\\リビジョン}; \draw
[decorate,decoration={brace}] (1.4,0) -- (-0.25,0) node[midway,below,text
width=2.0cm,text centered] { \small 上流\\バージョン};
\end{tikzpicture}
\end{center}


	  \item 手で編集するか \textttc{dch} を使用
  \begin{itemize}
	  \item 新リリースの changelog エントリ作成: \textttc{dch -i}
  \end{itemize}
  \item Debian や Ubuntu のバグ報告をクローズする特殊フォーマット\\ Debian: \texttt{Closes:~\#595268};
Ubuntu: \texttt{LP:~\#616929}
  \item \texttt{/usr/share/doc/\textit{package}/changelog.Debian.gz} にインストール
  \end{itemize}
  \seprule
  \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
mpich2 (1.2.1.1-5) unstable; urgency=low

  * Use /usr/bin/python instead of /usr/bin/python2.5. Allow
    to drop dependency on python2.5.  Closes: #595268
  * Make /usr/bin/mpdroot setuid. This is the default after
    the installation of mpich2 from source, too. LP: #616929
    + Add corresponding lintian override.

 -- Lucas Nussbaum <lucas@debian.org>  Wed, 15 Sep 2010 18:13:44 +0200
\end{lstlisting}
\end{frame}

\begin{frame}[fragile=singleslide]{debian/control}
  \hbr
  \begin{itemize}
  \item パッケージのメタデータ
    \begin{itemize}
    \item ソースパッケージ向け
    \item このソースから構築される各バイナリーパッケージ向け
    \end{itemize}
    \hbr
  \item パッケージ名、セクション、優先度、メンテナー、アップロード担当、構築依存関係、依存関係、説明、ホームページ \ldots \hbr
  \item Documentation: Debian Policy chapter 5\\ 
\url{https://www.debian.org/doc/debian-policy/ch-controlfields}
  \end{itemize}
  \seprule
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
Source: wget
Section: web
Priority: important
Maintainer: Noel Kothe <noel@debian.org>
Build-Depends: debhelper (>> 5.0.0), gettext, texinfo,
 libssl-dev (>= 0.9.8), dpatch, info2man
Standards-Version: 3.8.4
Homepage: http://www.gnu.org/software/wget/

Package: wget
Architecture: any
Depends: ${shlibs:Depends}, ${misc:Depends}
Description: retrieves files from the web
 Wget is a network utility to retrieve files from the Web
\end{lstlisting}
\end{frame}

\begin{frame}{Architecture: all か any}
  2 種類のバイナリーパッケージ:
  \hbr
  \begin{itemize}
  \item Debian のアーキテクチャごとに異なる内容のパッケージ
    \begin{itemize}
    \item 例: C プログラム
    \item \texttt{debian/control} に \texttt{Architecture:\ any}
      \begin{itemize}
      \item または動作するアーキテクチャのみ:\\ \texttt{Architecture:\ amd64 i386 ia64 hurd-i386}
      \end{itemize}
    \item buildd.debian.org: アップロードした以外の全アーキテクチャを構築
    \item \texttt{\textsl{package}\_\textsl{version}\_\textsl{architecture}.deb} という名前
    \end{itemize}
    \br
  \item 全アーキテクチャで同じ内容のパッケージ
    \begin{itemize}
    \item 例: Perl ライブラリー
    \item \texttt{debian/control} に \texttt{Architecture:\ all}
    \item \texttt{\textsl{package}\_\textsl{version}\_\textbf{all}.deb} という名前
    \end{itemize}
  \end{itemize}
  \br
  ソースパッケージは、\texttt{Architecture:\ any} と \texttt{Architecture:\ all}
のバイナリーパッケージが混在しても生成可能
\end{frame}

\begin{frame}[fragile=singleslide]{debian/rules}
  \hbr
  \begin{itemize}
  \item Makefile
    \br
  \item Debian パッケージを構築するインターフェース
    \br
  \item Documented in Debian Policy, chapter 4.8\\ {\small
\url{https://www.debian.org/doc/debian-policy/ch-source\#s-debianrules}}
    \br
  \item 必要なターゲット:
    \begin{itemize}
    \item \texttt{build, build-arch, build-indep}: すべての設定とコンパイルを実行
      \hbr
    \item \texttt{binary, binary-arch, binary-indep}: バイナリーパッケージ構築
      \begin{itemize}
      \item \texttt{dpkg-buildpackage} は、\texttt{binary}
を呼び出して全パッケージの構築、\texttt{binary-arch} を呼び出して \texttt{Architecture:~any}
パッケージのみの構築
      \end{itemize}
      \hbr
    \item \texttt{clean}: ソースディレクトリーのクリーンナップ
    \end{itemize}
  \end{itemize}
\end{frame}

\subsection{パッケージングヘルパー}
\begin{frame}{パッケージングヘルパー -- debhelper}
  \begin{itemize}
  \item \texttt{debian/rules} に直接シェルのコードを記述可能
  \item よりよい方法 (多くのパッケージが採用): \textsl{パッケージングヘルパー} 利用
  \item 一番人気: \textbf{debhelper} (98\% のパッケージが採用)
  \item 目的:
    \begin{itemize}
    \item 全パッケージで使われる標準ツールの共通タスクを分解
    \item パッケージングバグを一度直して全パッケージに適用
    \end{itemize}{\footnotesize dh\_installdirs, dh\_installchangelogs, dh\_installdocs,
dh\_install, dh\_installdebconf, dh\_installinit, dh\_link, dh\_strip,
dh\_compress, dh\_fixperms, dh\_perl, dh\_makeshlibs, dh\_installdeb,
dh\_shlibdeps, dh\_gencontrol, dh\_md5sums, dh\_builddeb, \ldots}
    \begin{itemize}
    \item \texttt{debian/rules} から呼ばれる
    \item コマンドパラメーターや \texttt{debian/} のファイルで設定可能
    \end{itemize}{\footnotesize \ttfamily \textsl{package}.docs, \textsl{package}.examples,
\textsl{package}.install, \textsl{package}.manpages, \ldots} \hbr
  \item パッケージセット用のサードパーティーヘルパー: \textbf{python-support}, \textbf{dh\_ocaml}, \ldots \hbr
  \item \texttt{debian/compat}: Debhelper compatibility version
	  \begin{itemize}
		  \item Defines precise behaviour of dh\_*
		  \item New syntax: \texttt{Build-Depends: debhelper-compat (= 13)}
	  \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{debhelper を用いた debian/rules (1/2)}
  \begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]
#!/usr/bin/make -f

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

build: 
        $(MAKE)
        #docbook-to-man debian/packagename.sgml > packagename.1

clean: 
        dh_testdir
        dh_testroot
        rm -f build-stamp configure-stamp
        $(MAKE) clean
        dh_clean 

install: build
        dh_testdir
        dh_testroot
        dh_clean -k 
        dh_installdirs
        # Add here commands to install the package into debian/packagename.
        $(MAKE) DESTDIR=$(CURDIR)/debian/packagename install
\end{lstlisting}
\end{frame}

\begin{frame}[fragile=singleslide]{debhelper を用いた debian/rules (2/2)}
  \begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]

# Build architecture-independent files here.
binary-indep: build install

# Build architecture-dependent files here.
binary-arch: build install
        dh_testdir
        dh_testroot
        dh_installchangelogs 
        dh_installdocs
        dh_installexamples
        dh_install
        dh_installman
        dh_link
        dh_strip
        dh_compress
        dh_fixperms
        dh_installdeb
        dh_shlibdeps
        dh_gencontrol
        dh_md5sums
        dh_builddeb

binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure
\end{lstlisting}
\end{frame}

\begin{frame}[fragile=singleslide]{CDBS}
  \hbr
  \begin{itemize}
  \item debhelper では、まだ無駄がたくさん
    \hbr
  \item 共通機能を分解する第 2 レベルヘルパー
    \begin{itemize}
    \item 例: \texttt{./configure \&\& make \&\& make install} での構築や CMake での構築
    \end{itemize}
    \hbr
  \item CDBS:
    \begin{itemize}
    \item 2005 年に \textsl{GNU make} マジックを発展させたものをベースに導入
    \item ドキュメント: \texttt{/usr/share/doc/cdbs/}
    \item Perl, Python, Ruby, GNOME, KDE, Java, Haskell, \ldots をサポート
    \item でも嫌いな人が:
      \begin{itemize}
      \item パッケージ構築のカスタマイズが難しい場合がある:\\ "\textsl{makefile と環境変数の絡みあった迷宮}"
      \item 素の debhelper より遅い (無意味な \texttt{dh\_*} をたくさん呼び出す)
      \end{itemize}
    \end{itemize}
  \end{itemize}
  \seprule
      \begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]
#!/usr/bin/make -f
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/class/autotools.mk

# add an action after the build
build/mypackage::
    /bin/bash debian/scripts/foo.sh
      \end{lstlisting}
\end{frame}

\begin{frame}[fragile=singleslide]{Dh (Debhelper 7, dh7)}
  \begin{itemize}
  \item \textsl{CDBS キラー} として 2008 年に導入
    \hbr
  \item \texttt{dh\_*} を呼び出す \textbf{dh} コマンド
    \hbr
  \item オーバーライドのみを列挙するシンプルな \textsl{debian/rules}
    \hbr
  \item CDBS よりもカスタマイズが簡単
    \hbr
  \item 文書: man ページ (\texttt{debhelper(7)}, \texttt{dh(1)}) + DebConf9 talk のスライド\\ 
\url{http://kitenet.net/~joey/talks/debhelper/debhelper-slides.pdf}
  \end{itemize}
  \seprule
    \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
#!/usr/bin/make -f
%:
    dh $@

override_dh_auto_configure:
     dh_auto_configure -- --with-kitchen-sink

override_dh_auto_build:
     make world

    \end{lstlisting}
\end{frame}

\begin{frame}{Classic debhelper vs CDBS vs dh}
  \hbr
  \begin{itemize}
  \item Mind shares:\\ Classic debhelper: 15\% \hskip 1em CDBS: 15\% \hskip 1em dh:
68\%
    \hbr
  \item どれを学ぶべき?
    \begin{itemize}
    \item おそらく少しづつでもすべて
    \item dh や CDBS を使うには debhelper を知る必要
    \item CDBS パッケージを変更するかも
    \end{itemize}
    \hbr
  \item 新しいパッケージにはどれを使うべき?
    \begin{itemize}
	    \item \textbf{dh} (これだけマインドシェアが上昇)
	    \item See \url{https://trends.debian.net/\#build-systems}
    \end{itemize}
  \end{itemize}
  
  \hbr


\end{frame}

\section{パッケージの構築とテスト}
\subsection{パッケージの構築}
\begin{frame}{パッケージの構築}
  \begin{itemize}
  \item \textttc{apt-get build-dep mypackage}\\ \textsl{構築依存関係} をインストール (Debian
にパッケージあり)\\ または \textttc{mk-build-deps -ir} (まだアップロードされていないパッケージ)
    
    \br
  \item \textttc{debuild}: 構築、\texttt{lintian} によるテスト、GPG での署名
    \br
  \item \textttc{dpkg-buildpackage} を直接呼び出すのも可能
    \begin{itemize}
    \item 通常は \texttt{dpkg-buildpackage -us -uc}
    \end{itemize}
    \br
  \item クリーン \& 最小の環境でパッケージを構築するのが良い
    \begin{itemize}
    \item \textttc{pbuilder} -- \textsl{chroot} 内でパッケージを構築するヘルパー\\ よいドキュメント:
\url{https://wiki.ubuntu.com/PbuilderHowto}\\ (最適化: \textttc{cowbuilder}
\textttc{ccache} \textttc{distcc})
      \hbr
    \item \textttc{schroot} と \textttc{sbuild}: Debian 構築デーモンで使用\\ (\texttt{pbuilder}
ほどシンプルではないが LVM スナップショットが取れる\\ 
\url{https://help.ubuntu.com/community/SbuildLVMHowto} を参照)
    \end{itemize}
    \br
  \item \texttt{.deb} ファイルと \texttt{.changes} ファイルを生成
    \begin{itemize}
    \item \texttt{.changes}: 何を構築したかを説明 (パッケージのアップロードに使用)
    \end{itemize}
  \end{itemize}
\end{frame}
\subsection{パッケージのインストールとテスト}
\begin{frame}{パッケージのインストールとテスト}
  \begin{itemize}
  \item ローカルでパッケージをインストール: \textttc{debi} (インストール時の情報に \texttt{.changes} を利用) \br
  \item パッケージの内容一覧: \texttt{{\color{rouge}debc} ../mypackage<TAB>.changes} \br
  \item 旧バージョンのパッケージとの比較:\\ \texttt{{\color{rouge}debdiff}
../mypackage\_1\_*.changes ../mypackage\_2\_*.changes}\\ もしくはソースパッケージの比較:\\ 
\texttt{{\color{rouge}debdiff} ../mypackage\_1\_*.dsc
../mypackage\_2\_*.dsc}\\
    \br
  \item \texttt{lintian} によるパッケージのチェック (静的解析):\\ \texttt{{\color{rouge}lintian}
../mypackage<TAB>.changes}\\ \texttt{lintian -i}: エラーの詳細情報を表示 \\ 
\texttt{lintian -EviIL +pedantic}: もっと問題を表示\br
  \item Debian にパッケージをアップロード (\textttc{dput}) (要設定) \br
  \item Manage a private Debian archive with \textttc{reprepro} or \textttc{aptly}\\ 
Documentation: \url{https://wiki.debian.org/HowToSetupADebianRepository}
  \end{itemize}
\end{frame}
\section{練習問題 1: grep パッケージの変更}
\begin{frame}{練習問題 1: grep パッケージの変更}
  \begin{enumerate}
  \item Go to \url{http://ftp.debian.org/debian/pool/main/g/grep/} and download
version 2.12-2 of the package
    \begin{itemize}
		   \item ソースパッケージを自動展開しなければ \texttt{dpkg-source~-x~grep\_*.dsc} として展開
    \end{itemize}

  \item \texttt{debian/} の中を見よ。
    \begin{itemize}
    \item 		このソースパッケージからの、バイナリーパッケージの生成数は?
    \item 		このパッケージで利用しているパッケージヘルパーは?
    \end{itemize}
    \hbr
  \item パッケージを構築せよ
    \hbr
  \item 今度はパッケージの変更をしよう。changelog エントリーを追加し、バージョン番号を増加せよ。
    \hbr
  \item 今度は、perl-regexp サポートを無効にせよ (\texttt{./configure} オプション)
    \hbr
  \item パッケージを再構築せよ
    \hbr
  \item 元のパッケージと新しいものを debdiff で比較せよ
    \hbr
  \item 新しく構築したパッケージをインストールせよ
  \end{enumerate}
\end{frame}

\section{高度なパッケージングの話題}
\subsection{debian/copyright}
\begin{frame}[fragile=singleslide]{debian/copyright}
  \hbr
  \begin{itemize}
  \item ソースとパッケージの著作権・ライセンス情報
  \item 伝統的にテキストファイル
  \item New machine-readable format:
{\small\url{https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/}}
  \end{itemize}
  \seprule
  \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: X Solitaire
Source: ftp://ftp.example.com/pub/games

Files: *
Copyright: Copyright 1998 John Doe <jdoe@example.com>
License: GPL-2+
 This program is free software; you can redistribute it
 [...]
 .
 On Debian systems, the full text of the GNU General Public
 License version 2 can be found in the file
 `/usr/share/common-licenses/GPL-2'.

Files: debian/*
Copyright: Copyright 1998 Jane Smith <jsmith@example.net>
License:
 [LICENSE TEXT]
\end{lstlisting}
\end{frame}



\subsection{上流ソースの変更}
\begin{frame}{上流ソースの変更}
  しばしば必要:
  \begin{itemize}
  \item バグ修正や Debian 特有のカスタマイズを追加
    \hbr
  \item 新しい上流リリースからバックポート
  \end{itemize}
  \br
  いくつか方法あり:
  \begin{itemize}
  \item 直接ファイルを編集
    \begin{itemize}
    \item シンプル
    \item 変更のドキュメントや追跡する方法がない
    \end{itemize}
    \hbr
  \item パッチシステム利用
    \begin{itemize}
    \item 上流へ変更を送り簡単に貢献
    \item 派生物と変更を共有しやすく
    \item Gives more exposure to the changes\\ \url{http://patch-tracker.debian.org/}
(down currently)
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}{パッチシステム}
  \begin{itemize}
  \item 原則: 変更点は \texttt{debian/patches/} にパッチとして格納
    \br
  \item 適用・非適用は構築時に
    \br
  \item 過去: 複数の実装 -- \textsl{simple-patchsys} (\textsl{cdbs}), \textsl{dpatch},
\textbf{\textsl{quilt}}
    \begin{itemize}
  \item それぞれ以下の \texttt{debian/rules} ターゲットをサポート:
    \begin{itemize}
    \item \texttt{debian/rules patch}: 全パッチ適用
    \item \texttt{debian/rules unpatch}: 全パッチ非適用
    \end{itemize}
	  \hbr
  \item More documentation: \url{https://wiki.debian.org/debian/patches}
  \end{itemize}
  \br
  \item \textbf{新ソースパッケージフォーマットはパッチシステム内蔵: 3.0 (quilt)}
  \begin{itemize}
  \item 推奨解決法
	  \hbr
  \item You need to learn \textsl{quilt}\\ 
\url{https://perl-team.pages.debian.net/howto/quilt.html}
    \hbr
  \item \texttt{devscripts} にパッチシステム非依存ツール: \texttt{edit-patch}
  \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{パッチのドキュメント}
  \begin{itemize}
	  \item パッチの先頭に標準ヘッダー
    \br
  \item DEP-3 にドキュメント - Patch Tagging Guidelines\\ 
\url{http://dep.debian.net/deps/dep3/}
  \end{itemize}
  \vfill
\seprule
  \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
Description: Fix widget frobnication speeds
 Frobnicating widgets too quickly tended to cause explosions.
Forwarded: http://lists.example.com/2010/03/1234.html
Author: John Doe <johndoe-guest@users.alioth.debian.org>
Applied-Upstream: 1.2, http://bzr.foo.com/frobnicator/revision/123
Last-Update: 2010-03-29

--- a/src/widgets.c
+++ b/src/widgets.c
@@ -101,9 +101,6 @@ struct {
\end{lstlisting}
\end{frame}

\subsection{インストール・削除中に行われること}
\begin{frame}{インストール・削除中に行われること}
  \begin{itemize}
  \item パッケージを伸張するだけでは不十分
    \hbr
  \item システムユーザー追加/削除、サービス開始/停止、\textsl{alternatives} の管理
    \hbr
  \item \textsl{メンテナースクリプト} で実施\\ \texttt{preinst, postinst, prerm, postrm}
    \begin{itemize}
	    \item  共通アクションの一部は debhelper で生成可能
    \end{itemize}
    \hbr
  \item ドキュメント:
    \begin{itemize}
    \item Debian Policy Manual, chapter 6\\ {\footnotesize
\url{https://www.debian.org/doc/debian-policy/ch-maintainerscripts}}
      
      \hbr
    \item Debian Developer's Reference, chapter 6.4\\ {\scriptsize
\url{https://www.debian.org/doc/developers-reference/best-pkging-practices.html}}
      \hbr
    \item {\footnotesize
\url{https://people.debian.org/~srivasta/MaintainerScripts.html}}
    \end{itemize}
    \br
  \item ユーザーの入力
    \begin{itemize}
    \item \textbf{debconf} で行わなければならない
      \hbr
    \item ドキュメント: \texttt{debconf-devel(7)} (\texttt{debconf-doc} パッケージ)
    \end{itemize}
  \end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{上流バージョンの監視}
  \begin{itemize}
  \item どこを監視するか \texttt{debian/watch} に指定 (\texttt{uscan(1)} 参照)
    \begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
version=3

http://tmrc.mit.edu/mirror/twisted/Twisted/(\d\.\d)/ \
  Twisted-([\d\.]*)\.tar\.bz2
    \end{lstlisting}
    \br
  \item There are automated trackers of new upstream versions, that notify the
maintainer on various dashboards including \url{https://tracker.debian.org/}
and \url{https://udd.debian.org/dmd/}
    \br
  \item \texttt{uscan}: 手動チェック実行
    \br
  \item \texttt{uupdate}: 最新の上流バージョンにパッケージを更新
  \end{itemize}
\end{frame}

\subsection{バージョン管理システムでのパッケージング (SVN, Git)}
\begin{frame}[fragile=singleslide]{バージョン管理システムでのパッケージング}
  \begin{itemize}
  \item パッケージング作業でブランチやタグの管理補助ツール: \\ \texttt{svn-buildpackage},
\texttt{git-buildpackage}
    \hbr
  \item 例: \texttt{git-buildpackage}
    \begin{itemize}
    \item \texttt{upstream}ブランチは \texttt{upstream/\textsl{version}} タグで上流ソースを追跡
    \item \texttt{master} ブランチは Debian パッケージを追跡
    \item アップロードごとに \texttt{debian/\textsl{version}} タグを打つ
    \item \texttt{pristine-tar} ブランチで 上流 tar ボールを再構築
    \end{itemize}
    Doc:
\url{http://honk.sigxcpu.org/projects/git-buildpackage/manual-html/gbp.html}
    \hbr
  \item \texttt{debian/control} の \texttt{Vcs-*} フィールドにリポジトリの場所を
	  \begin{itemize}
		\item \url{https://wiki.debian.org/Salsa}
	\end{itemize}
\end{itemize}
  \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
Vcs-Browser: https://salsa.debian.org/debian/devscripts
Vcs-Git: https://salsa.debian.org/debian/devscripts.git
  \end{lstlisting}
  \begin{lstlisting}[basicstyle=\ttfamily\scriptsize]
Vcs-Browser: https://salsa.debian.org/perl-team/modules/packages/libwww-perl
Vcs-Git: https://salsa.debian.org/perl-team/modules/packages/libwww-perl.git
  \end{lstlisting}
  \begin{itemize}
  \item VCS 非依存インターフェース: \texttt{debcheckout}, \texttt{debcommit},
\texttt{debrelease}\\
    \begin{itemize}
	    \item     \texttt{debcheckout grep} $\rightarrow$ Git からソースパッケージをチェックアウト
    \end{itemize}
\end{itemize}
\end{frame}

\subsection{パッケージのバックポート}
\begin{frame}{パッケージのバックポート}
  \begin{itemize}
  \item 目的: 旧システム上でパッケージの新バージョンを使用する\\ 例: \textsl{unstable} 由来の \textsl{mutt} を
Debian \textsl{stable} で利用
	\br
  \item 全体的な考え方:
	  \begin{itemize}
		\item Debian unstable からソースパッケージ取得
		\hbr
		\item Debian stable で構築・動作するよう修正
		\begin{itemize}
			\item 時にたいしたことはない (変更不要)
			\item 時に難しい
			\item 時に不可能 (大量の解決不能な依存関係)
		\end{itemize}
	\end{itemize}
	\br
   \item Debian プロジェクトで提供・サポートするバックポート\\ \url{http://backports.debian.org/}
\end{itemize}
\end{frame}



\section{Debian でのパッケージメンテナンス}
\subsection{Debian archive and suites}
\begin{frame}{Debian archive and suites}
  \begin{center}
	  \resizebox{\textwidth}{!}{
    \begin{tikzpicture}[
	    people/.style={shape=ellipse,draw,thick},
      suite/.style={shape=rectangle,draw},
	    devel/.style={fill=red!30!white},
	    test/.style={fill=orange!30!white},
	    prod/.style={fill=green!30!white,node distance=2cm},
	    internal/.style={},
	    old/.style={fill=gray!30!white},
	    veryold/.style={fill=gray!70!white},
      arr/.style={very thick},
	    uploads/.style={decorate,decoration={snake,amplitude=.4mm,segment length=2mm,post length=1mm}},
	    migrations/.style={};
	    command/.style={text=rouge,font=\ttfamily},
	    legend/.style={font=\small}
	    ]
      
      \draw node[suite,prod] (sec) {security}; \draw node[suite,prod,right=of sec]
(su) {stable-updates}; \draw node[suite,prod,right=of su] (st) {stable};
\draw node[suite,old,node distance=0.3cm,below=of st] (os) {oldstable};
\draw node[suite,veryold,node distance=0.3cm,below=of os] (ar)
{archive.d.o}; \draw node[suite,prod,right=of st] (bp) {backports}; \draw
node[suite,test] (spu) at ($(su) + (-0.6,2.5)$) {stable-proposed-updates};
\draw node[suite,internal] (sn) at ($(st) + (-1.8,1.4)$) {stable-new}; \draw
node[suite,test,node distance=1.5cm,above=of st] (te) {testing}; \draw
node[suite,devel,above=of te] (sid) {unstable}; \draw node[suite,devel]
(exp) at ($(sid) + (2.5,0.5)$) {experimental}; \draw node[suite,devel] (tpu)
at ($(te)!0.5!(sid) + (2.5,0)$) {testing-proposed-updates}; \draw
node[people,above=of sid] (dd) {developer}; \draw node[people,node
distance=3cm,left=of dd] (secteam) {security team}; \draw[arr,uploads,->]
(dd) -- (sid); \draw[arr,uploads,->] (dd) -- (exp);
\draw[arr,uploads,->,bend right=8] (dd) to (tpu); \draw[arr,uploads,->]
(secteam) -- (sid); \draw[arr,uploads,->] (secteam) -- (sec);
\draw[arr,uploads,->] (dd) to (spu); \draw[arr,uploads,->] plot [smooth,
tension=0.75] coordinates { (dd.east) ($(exp.north east)+(0.1,0.1)$)
($(tpu.east)+(0.2,0)$)  ($(bp.north east) + (-0.4,0)$) };
\draw[arr,migrations,->] (tpu) -- (te); \draw[arr,migrations,->] (sid) --
(te); \draw[arr,migrations,->] (te) -- (st) node
[midway,align=left,midway,right,font=\footnotesize] {stable\\ release};
\draw[arr,migrations,->] (sec) -- (sn); \draw[arr,migrations,->] (sn) to
node [pos=0.2] (spulabel) {} (st); \draw
node[font=\footnotesize,align=right] at ($(spulabel) + (-0.4,-0.45)$)
{stable \\ point \\ release}; \draw[arr,migrations,->] (spu) to (sn);
\draw[arr,migrations,->] (spu) -- (su); \draw[arr,migrations,->] (st) --
(os); \draw[arr,migrations,->] (os) -- (ar); \coordinate (legend) at
(-2,-1); \draw[arr,uploads,->] (legend) -- ($(legend) + (0.7,0)$) node
[right,legend] {package uploads}; \coordinate[node distance=1.1em,below=of
legend] (legend2); \draw[arr,migrations,->] (legend2) -- ($(legend2) +
(0.7,0)$) node [right,legend] {package migrations between suites};
\coordinate[node distance=1.5em,below=of legend2] (legend3); \draw
node[right,suite,devel,legend] (ldev) at (legend3) {development}; \draw
node[node distance=0.1cm,right=of ldev,suite,test,legend] (ltest) {test};
\draw node[node distance=0.1cm,right=of ltest,suite,internal,legend] (lint)
{internal}; \draw node[node distance=0.1cm,right=of lint,suite,prod,legend]
(lprod) {production}; \draw ($(legend.north west) + (-0.1,0.25)$) rectangle
($(lprod.south east) + (0.1,-0.1)$); \draw
node[font=\bf,red!70!white,align=center] (tnext) at ($(te.east) + (2,-0.1)$)
{preparation of \\ next release}; \draw
node[font=\bf,green!70!black,align=center] (tsrm) at ($(sec.north east) +
(1,1)$) {stable\\release\\management}; \pgfdeclarelayer{background}
\pgfdeclarelayer{foreground} \pgfsetlayers{background,main,foreground}
\begin{pgfonlayer}{background}
	    \fill[red!10!white] plot [smooth cycle,tension=0.55] coordinates {
($(sid.north west) + (-0.1,0.1)$) ($(exp.north east)+(0.1,0.1)$)
($(tpu.south east)+(0.1,-0.1)$) ($(tnext.south) + (0.6,0)$) ($(te.south
west) + (0.1,-0.1)$)  }; \fill[green!10!white] plot [smooth
cycle,tension=0.55] coordinates { ($(spu.north west) + (-0.1,0.1)$)
($(spu.north east)+(0.1,0.1)$) ($(sn.north east)+(0.1,0.1)$) ($(st.north
east) + (0.1,0.5)$) ($(bp.north east) + (0.1,0.1)$)  ($(bp.south east) +
(0.1,-0.1)$) ($(sec.south west) + (-0.1,-0.1)$)  };
\end{pgfonlayer}

    \end{tikzpicture}
	  }
  \end{center}
	\begin{flushright}
		\tiny Based on graph by Antoine
Beaupr\'e. \url{https://salsa.debian.org/debian/package-cycle}~~~~~~~~~~~~
	\end{flushright}
\end{frame}

\begin{frame}{Suites for development}
		\begin{itemize}
			\item New versions of packages are uploaded to \textbf{unstable} (\textbf{sid})
				\hbr
			\item Packages migrate from \textbf{unstable} to \textbf{testing} based on several
criterias (e.g. has been in unstable for 10 days, and no regressions)
				\hbr
			\item New packages can also be uploaded to:
				\begin{itemize}
					\item \textbf{experimental} (for more \textsl{experimental} packages, such as when
the new version is not ready to replace the one currently in unstable)
						\hhbr
					\item \textbf{testing-proposed-updates}, to update the version in \textbf{testing}
without going through \textbf{unstable} (this is rarely used)
				\end{itemize}
		\end{itemize}
\end{frame}

\begin{frame}{Freezing and releasing}
	\begin{itemize}
					\item At some point during the release cycle, the release team decides to
\textsl{freeze} testing: automatic migrations from \textbf{unstable} to
\textbf{testing} are stopped, and replaced by manual review
						\br
		\item When the release team considers \textbf{testing} to be ready for release:
			\begin{itemize}
				\item The \textbf{testing} suite becomes the new \textbf{stable} suite
					\hhbr
				\item Similarly, the old \textbf{stable} becomes \textbf{oldstable}
					\hhbr
				\item Unsupported releases are moved to \texttt{archive.debian.org}
			\end{itemize}
			\br
		\item See \url{https://release.debian.org/}
	\end{itemize}
\end{frame}

\begin{frame}{Stable release suites and management}
	\begin{itemize}
		\item Several suites are used to provide stable release packages:
			\hhbr
			\begin{itemize}
				\item \textbf{stable}: the main suite
					\hbr
				\item \textbf{security} updates suite provided on \texttt{security.debian.org},
used by the security team. Updates are announced on the
\texttt{debian-security-announce} mailing list
					\hbr
				\item \textbf{stable-updates}: updates that are not security related, but that
should urgently be installed (without waiting for the next point release):
antivirus databases, timezone-related packages, etc. Announced on the
\texttt{debian-stable-announce} mailing list
					\hbr
				\item \textbf{backports}: new upstream versions, based on the version in
\textbf{testing}
			\end{itemize}
			\hbr
		\item The \textbf{stable} suite is updated every few months by \textsl{stable
point releases} (that include only bug fixes)
			\hhbr
			\begin{itemize}
				\item Packages targetting the next stable point release are uploaded to
\textbf{stable-proposed-updates} and reviewed by the release team
			\end{itemize}
			\hbr
		\item The \textbf{oldstable} release has the same set of suites
	\end{itemize}
\end{frame}

\subsection{Debian に貢献するさまざまな方法}
\begin{frame}{Debian に貢献するさまざまな方法}
  \begin{itemize}
  \item 貢献の \textbf{よくない} 方法:
    \begin{enumerate}
    \item 自分のアプリケーションをパッケージング
    \item Debian を理解した気になる
    \item いなくなる
    \end{enumerate}
    \br
  \item 貢献の \textbf{よりまし} な方法:
	  \begin{itemize}
		  \item パッケージングチームに参加
    \begin{itemize}
    \item パッケージ群にフォーカスした、たくさんのチーム
    \item List available at \url{https://wiki.debian.org/Teams}
    \item 経験豊富な貢献者から学ぶ、優れた方法
    \end{itemize}
    \br
\item メンテナンスされていないパッケージ (\textsl{メンテナー不在パッケージ}) の引き取り
    \br
  \item Debian に新しいソフトウェアを導入
    \begin{itemize}
    \item 興味深い/便利なものならぜひ
    \item すでに同じパッケージが Debian にないか?
    \end{itemize}
  \end{itemize}

  \end{itemize}
\end{frame}

\subsection{メンテナー不在パッケージの引き取り}
\begin{frame}{メンテナー不在パッケージの引き取り}
      \hbr
  \begin{itemize}
    \item Debian にはメンテナンスされていないパッケージが大量にある
    \hbr
  \item Full list + process: \url{https://www.debian.org/devel/wnpp/}
    \hbr
  \item Installed on your machine: \texttt{wnpp-alert}\\ Or better:
\texttt{how-can-i-help}
    \hbr
  \item それぞれの状態:
    \begin{itemize}
		    \small
    \item \textbf{O}rphaned (メンテナー不在): このパッケージはメンテナンスされていない\\ 気軽に引き取って
      \hbr
    \item \textbf{RFA}: \textbf{R}equest \textbf{F}or \textbf{A}dopter (引き取り求む)\\ 
メンテナーが作業継続困難につき、引き取り手を探している。\\ 気軽に引き取って。現メンテナーにメールするのが丁寧
      \hbr
    \item \textbf{ITA}: \textbf{I}ntent \textbf{T}o \textbf{A}dopt
(引き取り予定)\\誰かがパッケージを引き取ろうとしている\\ 手伝いを申し込むときに!
      \hbr
    \item \textbf{RFH}: \textbf{R}equest \textbf{F}or \textbf{H}elp (助け求む)\\ 
メンテナーが助けを求めている
    \end{itemize}
    \hbr
  \item 非メンテナンスパッケージを未検出 \arr まだメンテナー不在ではない
    \hbr
  \item 不明点は \texttt{debian-qa@lists.debian.org} や\\ \texttt{irc.debian.org} の
\texttt{\#debian-qa} で質問
  \end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{パッケージの引き取り: 例}
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize,escapeinside=\{\}]
From: You <you@yourdomain>
To: 640454@bugs.debian.org, control@bugs.debian.org
Cc: Francois Marier <francois@debian.org>
Subject: ITA: verbiste -- French conjugator

retitle 640454 ITA: verbiste -- French conjugator
owner 640454 !
thanks

Hi,

I am using verbiste and I am willing to take care of the package.

Cheers,

You
\end{lstlisting}

\begin{itemize}
\item 元メンテナーに丁寧に連絡を (特にまだメンテナー不在ではなく RFA パッケージの時)
\item 上流プロジェクトに連絡するとよい
\end{itemize}
\end{frame}

\subsection{Debian に自分のパッケージを提供}
\begin{frame}{Debian に自分のパッケージを提供}
\begin{itemize}
\item Debian に自分のパッケージを提供するのに公式ステータスは不要
	\begin{enumerate}
		\item \texttt{reportbug wnpp} で \textbf{ITP} バグ (\textbf{I}ntent \textbf{T}o
\textbf{P}ackage パッケージング宣言) を送信
			\hbr
		\item ソースパッケージの準備
			\hbr
		\item パッケージをスポンサーしてくれる Debian 開発者を探す
	\end{enumerate}
\br
\item 公式ステータス (経験豊富なパッケージメンテナーの場合):
	\begin{itemize}
		\item \textbf{Debian Maintainer (DM):}\\ Permission to upload your own packages\\ 
See \url{https://wiki.debian.org/DebianMaintainer}
			\hbr
		\item \textbf{Debian Developer (DD):}\\ Debian プロジェクトメンバー (投票および任意のパッケージをアップロード)
	\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}{スポンサーを探す前にやっておくこと}
\begin{itemize}
	\item Debian は \textbf{品質重視}
\hbr
\item 一般的に \textbf{スポンサーは忙しく、探すのは大変}
\begin{itemize}
\item スポンサーを探す前に、自分のパッケージは準備万端か確認
\end{itemize}
\hbr
\item チェック項目:
\begin{itemize}
\item 構築依存関係の不備はないか: クリーンな \textsl{sid} \textsl{chroot} できちんとパッケージが構築できるか確認
\begin{itemize}
\item \texttt{pbuilder} の利用を推奨
\end{itemize}
\hbr
\item 自分のパッケージに \texttt{lintian -EviIL +pedantic} を実行
\begin{itemize}
\item エラーは必ず修正。その他の問題も修正すべき
\end{itemize}
\hbr
\item もちろん、詳細なパッケージのテストをしておく
\end{itemize}
\hbr
\item 不明点は質問する
\end{itemize}
\end{frame}

\subsection{どこで助けを探す?}
\begin{frame}{どこで助けを探す?}
	\hbr
  必要とする助け
  \begin{itemize}
  \item 疑問に対する助言や回答、コードレビュー
  \item パッケージの準備ができたらスポンサーにアップロードしてもらう
  \end{itemize}
  \hbr
  助けはここから:
  \begin{itemize}
	  \item \textbf{パッケージングチームの他のメンバー}
    \begin{itemize}
    \item List of teams: \url{https://wiki.debian.org/Teams}
    \end{itemize}
    \hbr
  \item \textbf{Debian メンターグループ} (パッケージがチームに合わない場合)
    \begin{itemize}
    \item \url{https://wiki.debian.org/DebianMentorsFaq}
    \item メーリングリスト: \url{debian-mentors@lists.debian.org}\\ {\small (偶然学ぶにもいい方法)}
    \item IRC: \texttt{irc.debian.org} の \texttt{\#debian-mentors}
    \item \url{http://mentors.debian.net/}
    \item ドキュメント: \url{http://mentors.debian.net/intro-maintainers}
    \end{itemize}
    \hbr
  \item \textbf{地域化メーリングリスト} (自分の言語で助けを求む)
    \begin{itemize}
  \item \texttt{debian-devel@lists.debian.or.jp}
  \item 全メーリングリスト: \url{https://lists.debian.org/devel.html}
  \item ユーザーのメーリングリスト: \url{https://lists.debian.org/users.html}
  \end{itemize}
  \end{itemize}
\end{frame}

\subsection{さらなるドキュメント}
\begin{frame}{さらなるドキュメント}
  \begin{itemize}
  \item Debian Developers' Corner\\ \url{https://www.debian.org/devel/}\\ {\small
Links to many resources about Debian development}
    \hbr
  \item Guide for Debian Maintainers\\ 
\url{https://www.debian.org/doc/manuals/debmake-doc/}
    \hbr
  \item Debian Developer's Reference\\ 
\url{https://www.debian.org/doc/developers-reference/}\\ {\small Mostly
about Debian procedures, but also some best packaging practices (part 6)}
    \hbr
  \item Debian Policy\\ \url{https://www.debian.org/doc/debian-policy/}\\
    
    {\small \begin{itemize} \item \small すべてのパッケージが満たすべき要件 \item \small Perl,
Java, Python, \ldots の具体的なポリシー \end{itemize}}
    \hbr
    
  \item Ubuntu パッケージングガイド\\ 
\url{https://packaging.ubuntu.com/html/}
  \end{itemize}
\end{frame}

\subsection{メンテナー向け Debian ダッシュボード}
\begin{frame}{メンテナー向け Debian ダッシュボード}
  \begin{itemize}
	  \item \textbf{Source package centric}:\\ \url{https://tracker.debian.org/dpkg}
    \br
  \item \textbf{Maintainer/team centric}: Developer's Packages Overview (DDPO)\\ 
\url{https://qa.debian.org/developer.php?login=pkg-ruby-extras-maintainers@lists.alioth.debian.org}
    \br
  \item \textbf{TODO-list oriented}: Debian Maintainer Dashboard (DMD)\\ 
\url{https://udd.debian.org/dmd/}
  \end{itemize}
\end{frame}

\begin{frame}{バグ追跡システム (BTS) の利用}
\begin{itemize}
\item バグを管理する唯一の方法
\begin{itemize}
\item バグを見る Web インターフェース
\item バグを変更する Email インターフェース
\end{itemize}
\hbr
\item バグに情報を付加:
	\begin{itemize}
		\item \texttt{123456@bugs.debian.org} に送信 (送信者を含まない。含める場合は
\texttt{123456-submitter@bugs.debian.org} を追加)
	\end{itemize}
\hbr
\item バグの状態変更:
\begin{itemize}
\item \texttt{control@bugs.debian.org} にコマンド送信
\item コマンドラインインターフェース: \texttt{devscripts} の \texttt{bts} コマンド
\item Documentation: \url{https://www.debian.org/Bugs/server-control}
\end{itemize}
\hbr
\item バグの報告: \texttt{reportbug} を利用
\begin{itemize}
\item ローカルメールサーバー使用: \texttt{ssmtp} や \texttt{nullmailer} をインストール
\item または \texttt{reportbug -\@-template} を使用し \texttt{submit@bugs.debian.org} へ
(手動で) 送信
\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}{BTS の利用例:}
\begin{itemize}
\item Sending an email to the bug and the submitter:\\ 
\url{https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=680822\#10}
\hbr
\item Tagging and changing the severity:\\ 
\url{https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=680227\#10}
\hbr
\item Reassigning, changing the severity, retitling \ldots: \\ 
\url{https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=680822\#93}
\begin{itemize}
	\item \texttt{notfound}, \texttt{found}, \texttt{notfixed}, \texttt{fixed} は
\textbf{バージョン追跡} される \\ 
\url{https://wiki.debian.org/HowtoUseBTS\#Version\_tracking} 参照
\end{itemize}
\hbr
\item Using usertags:
\url{https://bugs.debian.org/cgi-bin/bugreport.cgi?msg=42;bug=642267}\\ See
\url{https://wiki.debian.org/bugs.debian.org/usertags}
\hbr
\item BTS のドキュメント:
\begin{itemize}
\item \url{https://www.debian.org/Bugs/}
\item \url{https://wiki.debian.org/HowtoUseBTS}
\end{itemize}
\end{itemize}
\end{frame}

\subsection{Ubuntu の方が興味ある?}
\begin{frame}{Ubuntu の方が興味ある?}
  \begin{itemize}
  \item Ubuntu では主に、Debian から分岐して管理
    \br
  \item 特定のパッケージに注目しているわけではないが、\\Debian チームと協力
    \br
  \item 通常はまず、Debian への新しいパッケージのアップロードを推奨\\ 
\url{https://wiki.ubuntu.com/UbuntuDevelopment/NewPackages}
    \br
  \item おそらくもっと良い案:
    \begin{itemize}
    \item Debian チームに参加し Ubuntu との橋渡し
      \hbr
    \item 差異を縮小し Launchpad のバグの処理順を決める手伝い
      \hbr
    \item Debian のツールの多くが助けに:
      \begin{itemize}
      \item Developer’s Packages Overview のUbuntu 列
      \item パッケージ追跡システムの Ubuntu ボックス
      \item PTS 経由での launchpad バグメール受信
      \end{itemize}
    \end{itemize}
  \end{itemize}
\end{frame}

\section{まとめ}
\subsection{まとめ}
\begin{frame}{まとめ}
  \begin{itemize}
  \item Debian のパッケージングについて全体を見渡した
    \br
  \item しかしもっと詳細なドキュメントが必要になる
    \br
  \item ベストプラクティスは長年にわたって発展
    \begin{itemize}
    \item よくわからなければ \textbf{dh} パッケージングヘルパーと \textbf{3.0 (quilt)} フォーマットを使う
    \end{itemize}
  \end{itemize}
  \vfill
  \centerline{\large フィードバック: \textbf{packaging-tutorial@packages.debian.org}}
\end{frame}

\subsection{法的事項}
\begin{frame}{法的事項}

  Copyright \copyright 2011--2019 Lucas Nussbaum -- lucas@debian.org
  \br

  {\small \textbf{This document is free software}: you can redistribute it
and/or modify it under either (at your option): \hbr \begin{itemize} \item
The terms of the GNU General Public License as published by the Free
Software Foundation, either version 3 of the License, or (at your option)
any later version.\\ \url{http://www.gnu.org/licenses/gpl.html} \br \item
The terms of the Creative Commons Attribution-ShareAlike 3.0 Unported
License.\\ \url{http://creativecommons.org/licenses/by-sa/3.0/}
\end{itemize} }
\end{frame}

\subsection{このチュートリアルへの貢献}
\begin{frame}{このチュートリアルへの貢献}
	\begin{itemize}
		\item 貢献:
			\begin{itemize}
				\item{\small \texttt{apt-get source packaging-tutorial}}
					\hbr
				\item  {\small \texttt{debcheckout packaging-tutorial}}
					\hbr
				\item  {\small \texttt{git clone\\ 
https://salsa.debian.org/debian/packaging-tutorial.git}}
					\hbr
				\item {\small \url{https://salsa.debian.org/debian/packaging-tutorial}}
					\hbr
				\item {\small 未修正バグ: \url{bugs.debian.org/src:packaging-tutorial}}
			\end{itemize}
			\br
		\item フィードバックの送り先:
			\begin{itemize}
				\item \href{mailto:packaging-tutorial@packages.debian.org}{\textbf{\texttt{mailto:packaging-tutorial@packages.debian.org}}}
				\begin{itemize}
					\item{\small このチュートリアルに何を追加すべき?}
				\item {\small もっと良くするには?}
				\end{itemize}
					\hbr
				\item{\small \texttt{reportbug packaging-tutorial}}
			\end{itemize}
	\end{itemize}
\end{frame}

\section{Additional practical sessions}

\subsection{練習問題 2: GNUjump のパッケージング}
\begin{frame}{練習問題 2: GNUjump のパッケージング}
	\begin{enumerate}
		\item GNUjump 1.0.8 を \url{http://ftp.gnu.org/gnu/gnujump/gnujump-1.0.8.tar.gz}
からダウンロードせよ
			\br
		\item この Debian パッケージを作成せよ
			\begin{itemize}
				\item パッケージを構築するため構築依存関係パッケージをインストール
				\item Fix bugs
				\item パッケージの基本作業を確認
				\item \texttt{debian/control} や他のファイルに記入して完成
			\end{itemize}
			\br
		\item 楽しむこと
	\end{enumerate}
\centerline{\includegraphics[width=5cm]{figs/gnujump.png}}
\end{frame}

\begin{frame}[fragile=singleslide]{Practical session 2: packaging GNUjump (tips)}
	\begin{itemize}
		\item To get a basic working package, use \texttt{dh\_make}
		\item To start with, creating a \textsl{1.0} source package is easier than
\textsl{3.0 (quilt)} (change that in \texttt{debian/source/format})
		\item To search for missing build-dependencies, find a missing file, and use
\texttt{apt-file} to find the missing package
		\item If you encounter that error:
\begin{lstlisting}[basicstyle=\ttfamily\tiny]
/usr/bin/ld: SDL_rotozoom.o: undefined reference to symbol 'ceil@@GLIBC_2.2.5'
//lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Makefile:376: recipe for target 'gnujump' failed
\end{lstlisting}
			You need to add \texttt{-lm} to the linker command line:\\ Edit
\texttt{src/Makefile.am} and replace
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = $(all_libraries)
\end{lstlisting}
					by
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = -Wl,--as-needed
gnujump_LDADD = $(all_libraries) -lm
\end{lstlisting}
				Then run \texttt{autoreconf -i}
	\end{itemize}
\end{frame}

\subsection{練習問題 3: Java ライブラリーのパッケージング}
\begin{frame}{練習問題 3: Java ライブラリーのパッケージング}
\begin{enumerate}
	\item Java のパッケージングについてのドキュメントを参照せよ:\\
		\begin{itemize}
		\item \url{https://wiki.debian.org/Java}
      \hbr
		\item \url{https://wiki.debian.org/Java/Packaging}
      \hbr
		\item \url{https://www.debian.org/doc/packaging-manuals/java-policy/}
      \hbr
		\item \texttt{/usr/share/doc/javahelper/tutorial.txt.gz}
		\end{itemize}
		\br
	\item \url{http://moepii.sourceforge.net/} から IRClib をダウンロードせよ
		\br
	\item パッケージを作成せよ
\end{enumerate}
\end{frame}

\subsection{練習問題 4: Ruby gem のパッケージング}
\begin{frame}{練習問題 4: Ruby gem のパッケージング}
\begin{enumerate}
	\item Ruby のパッケージングについてのドキュメントを参照せよ:\\
		\begin{itemize}
		\item \url{https://wiki.debian.org/Ruby}
      \hbr
		\item \url{https://wiki.debian.org/Teams/Ruby}
      \hbr
		\item \url{https://wiki.debian.org/Teams/Ruby/Packaging}
      \hbr
		\item \texttt{gem2deb(1)}, \texttt{dh\_ruby(1)} (\texttt{gem2deb} パッケージ内)
		\end{itemize}
		\hbr
	\item Create a basic Debian source package from the \texttt{peach} gem:\\ 
\texttt{gem2deb peach}
	\hbr
	\item きちんとした Debian パッケージになるよう改良せよ
\end{enumerate}
\end{frame}

\subsection{練習問題 5: Perl モジュールのパッケージング}
\begin{frame}[fragile=singleslide]{練習問題 5: Perl モジュールのパッケージング}
\begin{enumerate}
	\item Perl のパッケージングについてのドキュメントを参照せよ:\\
		\begin{itemize}
		\item \url{https://perl-team.pages.debian.net}
      \hbr
		\item \url{https://wiki.debian.org/Teams/DebianPerlGroup}
      \hbr
		\item \texttt{dh-make-perl(1)}, \texttt{dpt(1)} (\texttt{pkg-perl-tools} パッケージ内)
		\end{itemize}
		\hbr
	\item \texttt{Acme} CPAN ディストリビューションから基本的な Debian ソースパッケージを作成せよ:\\ 
\verb|dh-make-perl --cpan Acme|
	\hbr
	\item きちんとした Debian パッケージになるよう改良せよ
\end{enumerate}
\end{frame}

\section{練習問題の解答}

\begin{frame}
	\begin{center}
		\LARGE 解答\\[0.5em] 練習問題
	\end{center}
\end{frame}


\subsection{練習問題 1: grep パッケージの変更}

\begin{frame}{練習問題 1: grep パッケージの変更}
\begin{enumerate}
  \item Go to \url{http://ftp.debian.org/debian/pool/main/g/grep/} and download
version 2.12-2 of the package

	\item \texttt{debian/} の中を見よ。
		\begin{itemize}
			\item 		このソースパッケージからの、バイナリーパッケージの生成数は?
			\item 		このパッケージで利用しているパッケージヘルパーは?
		\end{itemize}
    \hbr
	\item パッケージを構築せよ
    \hbr
	\item 今度はパッケージの変更をしよう。changelog エントリーを追加し、バージョン番号を増加せよ。
    \hbr
	\item 今度は、perl-regexp サポートを無効にせよ (\texttt{./configure} オプション)
    \hbr
	\item パッケージを再構築せよ
    \hbr
	\item 元のパッケージと新しいものを debdiff で比較せよ
    \hbr
	\item 新しく構築したパッケージをインストールせよ
\end{enumerate}
\end{frame}

\begin{frame}{ソースの取得}
\begin{enumerate}
  \item Go to \url{http://ftp.debian.org/debian/pool/main/g/grep/} and download
version 2.12-2 of the package
\end{enumerate}
\begin{itemize}
	\item Use dget to download the \texttt{.dsc} file:\\ {\small \texttt{dget
http://cdn.debian.net/debian/pool/main/g/grep/grep\_2.12-2.dsc}}
		\hbr
	\item If you have \texttt{deb-src} for a Debian release that has \texttt{grep}
version 2.12-2 (find out on \url{https://tracker.debian.org/grep}), you can
use: \texttt{apt-get source grep=2.12-2}\\ or \texttt{apt-get source
grep/release} (e.g. \texttt{grep/stable})\\ or, if you feel lucky:
\texttt{apt-get source grep}
	\hbr
	\item \texttt{grep} のソースパッケージは以下の 3 ファイル:
		\begin{itemize}
			\item \texttt{grep\_2.12-2.dsc}
			\item \texttt{grep\_2.12-2.debian.tar.bz2}
			\item \texttt{grep\_2.12.orig.tar.bz2}
		\end{itemize}
		典型的な "3.0 (quilt)" フォーマット
	\hbr
\item If needed, uncompress the source with\\ \texttt{dpkg-source -x
grep\_2.12-2.dsc}
\end{itemize}
\end{frame}

\begin{frame}{パッケージを見回して構築}
	\begin{enumerate}
			\setcounter{enumi}{1}
	\item Look at the files in \texttt{debian/}
		\begin{itemize}
			\item 		このソースパッケージからの、バイナリーパッケージの生成数は?
			\item 		このパッケージで利用しているパッケージヘルパーは?
		\end{itemize}
	\end{enumerate}
	\hbr
	\begin{itemize}
		\item \texttt{debian/control} によると、このパッケージは \texttt{grep}
という名前のバイナリーパッケージをひとつだけ生成する。
			\hbr
		\item \texttt{debian/rules} によると、このパッケージは \textsl{CDBS} や \textsl{dh}
を使わず、\textsl{classic} debhelper でパッケージングされている。\texttt{debian/rules} で、さまざまな
\texttt{dh\_*} コマンドを呼び出していることがわかる。
	\end{itemize}
	\hbr
	\begin{enumerate}
			\setcounter{enumi}{2}

		\item パッケージを構築せよ
	\end{enumerate}
	\hbr
	\begin{itemize}
		\item \texttt{apt-get build-dep grep} を使用して、構築依存のパッケージを取得
		\item その後 \texttt{debuild} や \texttt{dpkg-buildpackage -us -uc} を実行 (1 分ほどかかる)
	\end{itemize}
\end{frame}

\begin{frame}{changelog の編集}
	\begin{enumerate}
			\setcounter{enumi}{3}

	\item 今度はパッケージの変更をしよう。changelog エントリーを追加し、バージョン番号を増加せよ。
	\end{enumerate}
	\hbr
	\begin{itemize}
		\item \texttt{debian/changelog} はテキストファイルである。手で編集して新エントリーを追加する。
	\hbr
		\item また、\texttt{dch -i} を使用し、エントリーを追加しエディターを起動
	\hbr
		\item 名前とメールアドレスは環境変数 \texttt{DEBFULLNAME} と \texttt{DEBEMAIL} で定義
	\hbr
		\item その後、パッケージを再構築: 新バージョンのパッケージを構築
	\hbr
		\item Package versioning is detailed in section 5.6.12 of the Debian policy\\ 
\url{https://www.debian.org/doc/debian-policy/ch-controlfields}
	\end{itemize}
\end{frame}

\begin{frame}{Perl 正規表現の無効化と再構築}
	\begin{enumerate}
			\setcounter{enumi}{4}

	\item 今度は、perl-regexp サポートを無効にせよ (\texttt{./configure} オプション)
	\item パッケージを再構築せよ
	\end{enumerate}
	\hbr
	\begin{itemize}
	  \item \texttt{./configure -{}-help} をチェック: Perl 正規表現を無効にするオプションは
\texttt{-{}-disable-perl-regexp}
	\hbr
		\item \texttt{debian/rules} を編集して \texttt{./configure} の行を探す
	\hbr
		\item \texttt{-{}-disable-perl-regexp} を追加
	\hbr
		\item \texttt{debuild} や \texttt{dpkg-buildpackage -us -uc} で再構築
	\end{itemize}
\end{frame}

\begin{frame}{パッケージの比較とテスト}
	\begin{enumerate}
			\setcounter{enumi}{6}

	\item 元のパッケージと新しいものを debdiff で比較せよ
	\item 新しく構築したパッケージをインストールせよ
	\end{enumerate}
	\hbr
	\begin{itemize}
		\item バイナリーパッケージの比較: \texttt{debdiff ../*changes}
	\hbr
		\item ソースパッケージの比較: \texttt{debdiff ../*dsc}
	\hbr
		\item 新規構築パッケージをインストール:\texttt{debi}\\ または \texttt{dpkg -i ../grep\_<TAB>}
	\hbr
		\item \texttt{grep -P foo} がもう動作しない!
	\end{itemize}
\br
Reinstall the previous version of the package:
\begin{itemize}
	\item \texttt{apt-get install -{}-reinstall grep=2.6.3-3} \textit{(= 前バージョン)}
\end{itemize}
\end{frame}

\subsection{練習問題 2: GNUjump のパッケージング}
\begin{frame}{練習問題 2: GNUjump のパッケージング}
\begin{enumerate}
	\item GNUjump 1.0.8 を \url{http://ftp.gnu.org/gnu/gnujump/gnujump-1.0.8.tar.gz}
からダウンロードせよ
		\br
	\item この Debian パッケージを作成せよ
		\begin{itemize}
			\item パッケージを構築するため構築依存関係パッケージをインストール
			\item パッケージの基本作業を確認
			\item \texttt{debian/control} や他のファイルに記入して完成
		\end{itemize}
		\br
	\item 楽しむこと
\end{enumerate}
\centerline{\includegraphics[width=5cm]{figs/gnujump.png}}
\end{frame}

\begin{frame}[fragile=singleslide]{一歩ずつ\ldots}
\begin{itemize}
	\item \texttt{wget http://ftp.gnu.org/gnu/gnujump/gnujump-1.0.8.tar.gz}
		\hbr
	\item \texttt{mv gnujump-1.0.8.tar.gz gnujump\_1.0.8.orig.tar.gz}
		\hbr
	\item \texttt{tar xf gnujump\_1.0.8.orig.tar.gz}
		\hbr
	\item \texttt{cd gnujump-1.0.8/}
		\hbr
	\item \texttt{dh\_make -f ../gnujump-1.0.8.tar.gz}
	\begin{itemize}
		\item \small パッケージのタイプ: 単一バイナリー (今回は)
	\end{itemize}
\end{itemize}
\begin{lstlisting}[basicstyle=\ttfamily\small]
gnujump-1.0.8$ ls debian/
changelog           gnujump.default.ex   preinst.ex
compat              gnujump.doc-base.EX  prerm.ex
control             init.d.ex            README.Debian
copyright           manpage.1.ex         README.source
docs                manpage.sgml.ex      rules
emacsen-install.ex  manpage.xml.ex       source
emacsen-remove.ex   menu.ex              watch.ex
emacsen-startup.ex  postinst.ex
gnujump.cron.d.ex   postrm.ex
\end{lstlisting}
\end{frame}

\begin{frame}[fragile=singleslide]{一歩ずつ\ldots (2)}
\begin{itemize}
	\item \texttt{debian/changelog}, \texttt{debian/rules}, \texttt{debian/control}
を見る\\ (\textbf{dh\_make} が自動記入)
		\hbr
	\item \texttt{debian/control} では: \\ \texttt{Build-Depends: debhelper (>=
7.0.50~), autotools-dev}\\ \textsl{構築依存関係} = パッケージを構築するのに必要なパッケージの一覧
		\hbr
	\item Try to build the package as-is with \texttt{debuild} (thanks to \textbf{dh}
magic)
		\begin{itemize}
			\item 構築できるまで構築依存関係を追加
			\item ヒント: \texttt{apt-cache search} や \texttt{apt-file} を使ってパッケージを探す
			\item 例:
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
checking for sdl-config... no
checking for SDL - version >= 1.2.0... no
[...]
configure: error: *** SDL version 1.2.0 not found!
\end{lstlisting}
$\rightarrow$ \textbf{libsdl1.2-dev} を Build-Depends に追加しインストールする。
		\hbr
	\item ベター: \textbf{pbuilder} を使ってクリーンな環境で構築
		\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{一歩ずつ\ldots (3)}
	\begin{itemize}
		\item Required build-dependencies are \texttt{libsdl1.2-dev, libsdl-image1.2-dev,
libsdl-mixer1.2-dev}

		\item Then, you will probably run into another error:
	\end{itemize}
	\begin{lstlisting}[basicstyle=\ttfamily\tiny]
	/usr/bin/ld: SDL_rotozoom.o: undefined reference to symbol 'ceil@@GLIBC_2.2.5'
	//lib/x86_64-linux-gnu/libm.so.6: error adding symbols: DSO missing from command line
	collect2: error: ld returned 1 exit status
	Makefile:376: recipe for target 'gnujump' failed
	\end{lstlisting}
	\begin{itemize}
		\item This problem is caused by bitrot: gnujump has not been adjusted following
linker changes.
		\item If you are using source format version \textbf{1.0}, you can directly change
upstream sources.
			\begin{itemize}
				\item Edit \texttt{src/Makefile.am} and replace
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = $(all_libraries)
\end{lstlisting}
					by
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = -Wl,--as-needed
gnujump_LDADD = $(all_libraries) -lm
\end{lstlisting}
				\item Then run \texttt{autoreconf -i}
			\end{itemize}
	\end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{一歩ずつ\ldots (4)}
\begin{itemize}
	\item If you are using source format version \textbf{3.0 (quilt)}, use
\texttt{quilt} to prepare a patch. (see
\url{https://wiki.debian.org/UsingQuilt})
\begin{itemize}
\item \texttt{export QUILT\_PATCHES=debian/patches}
\item \texttt{mkdir debian/patches}\\ \texttt{quilt new linker-fixes.patch}\\ 
\texttt{quilt add src/Makefile.am}\\
\hbr
\item Edit \texttt{src/Makefile.am} and replace
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = $(all_libraries)
\end{lstlisting}
by
\begin{lstlisting}[basicstyle=\ttfamily\footnotesize]
gnujump_LDFLAGS = -Wl,--as-needed
gnujump_LDADD = $(all_libraries) -lm
\end{lstlisting}
\hbr
\item \texttt{quilt refresh}
	\hbr
	\item Since \texttt{src/Makefile.am} was changed, autoreconf must be called during
the build. To do that automatically with \texttt{dh}, change the \texttt{dh}
call in \texttt{debian/rules} from: \texttt{dh \$\@ -{}-with
autotools-dev}\\ to: \texttt{dh \$\@ -{}-with autotools-dev -{}-with
autoreconf}
		\hbr
\end{itemize}
\end{itemize}
\end{frame}


\begin{frame}[fragile=singleslide]{Step by step\ldots (5)}
\begin{itemize}
	\item The package should now build fine.
		\hbr
	\item Use \texttt{debc} to list the content of the generated package, and
\texttt{debi} to install it and test it.
		\hbr
	\item \texttt{lintian} でパッケージのテスト
		\begin{itemize}
			\item 厳格な必要条件ではないが、Debian にアップロードするパッケージは \textsl{lintian-clean} を推奨
		\hbr
			\item \texttt{lintian -EviIL +pedantic} を使用してもっと問題を列挙できる
		\hbr
			\item ヒント:
				\begin{itemize}
					\item \texttt{debian/} にある不要なファイルを削除
		\hbr
					\item \texttt{debian/control} に記入
						\hbr
					\item \texttt{dh\_auto\_configure} を上書きし、実行ファイルを \texttt{/usr/games} にインストール
		\hbr
					\item Use \textsl{hardening} compiler flags to increase security.\\ See
\url{https://wiki.debian.org/Hardening}
				\end{itemize}
		\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}{Step by step\ldots (6)}
		\begin{itemize}
	\item Debian でパッケージ化されているものと、自分のパッケージを比較:
		\begin{itemize}
			\item データファイルを、第 2 のパッケージへ分割し、全アーキテクチャで同じ物にしている ($\rightarrow$  Debian
アーカイブの使用量を抑える)
				\hbr
			\item .desktop ファイル (GNOME/KDE メニュー向け) をインストールし、Debian メニューに統合もしている
				\hbr
			\item パッチを使用し、小さな問題を修正している
		\end{itemize}
\end{itemize}
\end{frame}

\subsection{練習問題 3: Java ライブラリーのパッケージング}
\begin{frame}{練習問題 3: Java ライブラリーのパッケージング}
\begin{enumerate}
	\item Java のパッケージングについてのドキュメントを参照せよ:\\
		\begin{itemize}
		\item \url{https://wiki.debian.org/Java}
      \hbr
		\item \url{https://wiki.debian.org/Java/Packaging}
      \hbr
		\item \url{https://www.debian.org/doc/packaging-manuals/java-policy/}
      \hbr
		\item \texttt{/usr/share/doc/javahelper/tutorial.txt.gz}
		\end{itemize}
		\br
	\item \url{http://moepii.sourceforge.net/} から IRClib をダウンロードせよ
		\br
	\item パッケージを作成せよ
\end{enumerate}
\end{frame}

\begin{frame}{一歩ずつ\ldots}
\begin{itemize}
	\item \texttt{apt-get install javahelper}
		\hbr
	\item 基本的なソースパッケージを作成: \texttt{jh\_makepkg}
		\begin{itemize}
			\item ライブラリー
			\item なし
			\item デフォルトのフリーなコンパイラー/ランタイム
		\end{itemize}
		\hbr
	\item \texttt{debian/} の中を見て修正
		\hbr
	\item \texttt{dpkg-buildpackage -us -uc} または \texttt{debuild}
		\hbr
	\item \texttt{lintian}, \texttt{debc}, etc.
		\hbr
	\item 自分の結果と \texttt{libirclib-java} ソースパッケージを比較
\end{itemize}
\end{frame}

\subsection{練習問題 4: Ruby gem のパッケージング}
\begin{frame}{練習問題 4: Ruby gem のパッケージング}
\begin{enumerate}
	\item Ruby のパッケージングについてのドキュメントを参照せよ:\\
		\begin{itemize}
		\item \url{https://wiki.debian.org/Ruby}
      \hbr
		\item \url{https://wiki.debian.org/Teams/Ruby}
      \hbr
		\item \url{https://wiki.debian.org/Teams/Ruby/Packaging}
      \hbr
		\item \texttt{gem2deb(1)}, \texttt{dh\_ruby(1)} (\texttt{gem2deb} パッケージ内)
		\end{itemize}
		\hbr
	\item Create a basic Debian source package from the \texttt{peach} gem:\\ 
\texttt{gem2deb peach}
	\hbr
	\item きちんとした Debian パッケージになるよう改良せよ
\end{enumerate}
\end{frame}

\begin{frame}{一歩ずつ\ldots}
\texttt{gem2deb peach}:
\begin{itemize}
\item rubygems.org から gem をダウンロード
\item ひと揃いの .orig.tar.gz アーカイブを作成し、tar を展開
\item gem のメタデータを基に Debian ソースパッケージを初期化
	\begin{itemize}
		\item \texttt{ruby-\textsl{gemname}} という名前
	\end{itemize}
\item Debian バイナリーパッケージの生成をしてみる (多分失敗)
\end{itemize}
\br
\texttt{dh\_ruby} (\textsl{gem2deb} に同梱) は Ruby 特有のタスク:
\begin{itemize}
	\item C の拡張を各 Ruby バージョン向けに構築
	\item 宛先ディレクトリーにファイルをコピー
	\item 実行スクリプトのシェバングを更新
	\item Run tests defined in \texttt{debian/ruby-tests.rb},
\texttt{debian/ruby-tests.rake}, or \texttt{debian/ruby-test-files.yaml}, as
well as various other checks
\end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{一歩ずつ\ldots (2)}
生成したパッケージを改良:
\begin{itemize}
	\item \texttt{debclean} を実行してソースツリーを掃除。\texttt{debian/} を見る。
		\hbr
	\item \texttt{changelog} や \texttt{compat} が正しいか
		\hbr
	\item Edit \texttt{debian/control}: improve \texttt{Description}
		\hbr
	\item 上流ファイルを基に \texttt{copyright} ファイルを適切に記述
		\hbr
	\item パッケージを構築せよ
		\hbr
	\item Compare your package with the \texttt{ruby-peach} package in the Debian
archive
\end{itemize}
\end{frame}

\subsection{練習問題 5: Perl モジュールのパッケージング}
\begin{frame}[fragile=singleslide]{練習問題 5: Perl モジュールのパッケージング}
\begin{enumerate}
	\item Perl のパッケージングについてのドキュメントを参照せよ:\\
		\begin{itemize}
		\item \url{https://perl-team.pages.debian.net}
      \hbr
		\item \url{https://wiki.debian.org/Teams/DebianPerlGroup}
      \hbr
		\item \texttt{dh-make-perl(1)}, \texttt{dpt(1)} (\texttt{pkg-perl-tools} パッケージ内)
		\end{itemize}
		\hbr
	\item \texttt{Acme} CPAN ディストリビューションから基本的な Debian ソースパッケージを作成せよ:\\ 
\verb|dh-make-perl --cpan Acme|
	\hbr
	\item きちんとした Debian パッケージになるよう改良せよ
\end{enumerate}
\end{frame}

\begin{frame}[fragile=singleslide]{一歩ずつ\ldots}
\verb|dh-make-perl --cpan Acme|:
\begin{itemize}
\item CPAN から tarball をダウンロード
\item ひと揃いの .orig.tar.gz アーカイブを作成し、tar を展開
\item ディストリビューションのメタデータを基に Debian ソースパッケージを初期化
	\begin{itemize}
		\item \texttt{lib\textsl{distname}-perl} という名前
	\end{itemize}
\end{itemize}
\end{frame}

\begin{frame}[fragile=singleslide]{一歩ずつ\ldots (2)}
生成したパッケージを改良:
\begin{itemize}
	\item \texttt{debian/changelog}, \texttt{debian/compat},
\texttt{debian/libacme-perl.docs}、および \texttt{debian/watch} は正しいはずです
		\hbr
	\item \texttt{debian/control} を編集: \texttt{Description} を改良、および一番下の定型文を削除
		\hbr
	\item \texttt{debian/copyright} を編集: 一番上の定型の段落を削除、\texttt{Files:\hspace{0.3em}*}
stanza に著作権の年を追加
\end{itemize}
\end{frame}


\section*{翻訳}
\begin{frame}{翻訳}

 このチュートリアルは 倉澤 望 が日本語訳しました。
 \hbr

 この翻訳についての意見・要望は\\
 \href{mailto:debian-doc@debian.or.jp}{\texttt{<debian-doc@debian.or.jp>}}
 にお知らせください。

\end{frame}
\end{document}
