オープンソース実践特論

オープンソース実践特論
第1回 開発の流れとツール
Copyright (C) Mitsubishi Research Institute, Inc.
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
2
オープンソース
Copyright (C) Mitsubishi Research Institute, Inc.
3
オープンソースソフトウェア(OSS)って何?
 ソースコードが公開され、自由に利用、改良、再配布が可能なソフトウェア




正式にはOSI (Open Source Initiative)が定義
【OSIの定義】
無料なだけでなく、自由に改良できるところがポイント
再配布の自由
世界中の個人・企業が開発に協力
ソースコードへのアクセス
ひとり(一社)で開発するよりも効果的
派生ソフトウェアの許可
 (ただし、ある程度利用者がいれば、の話)
作者のソースコードの完全性
利用者に対する差別の禁止
 著名なOSS
利用分野に対する差別の禁止
 Linux(OS)
ライセンスの頒布
 Firefox(Webブラウザ)
特定製品でのみ有効なライセ
 OpenOffice.org(オフィススイート)
ンスの禁止
 Apache(Webサーバ)
他のソフトウェアに干渉するラ
イセンスの禁止
 ソフトウェア開発の学習に向いている
ライセンスは技術的に中立でな
 ソースコードの書き方の勉強になる
ければならない
 豊富なツールが自由に使える
Copyright (C) Mitsubishi Research Institute, Inc.
4
ソフトウェア開発プロセスの特徴と開発環境
Copyright (C) Mitsubishi Research Institute, Inc.
5
ソフトウェア開発の特徴
 ソフトウェアとハードウェアの相違点
 「モノ」が見えるか見えないか
 製品の前段階として「開発」がある
 開発手順
 大まかな手順はハードウェアと共通(ウォーターフォール型の場合)
 再利用がしやすい
 スパイラル型やテストファーストの開発はソフトウェア向け
SStep
tep11
要件定義
SStep
tep22
設計
SStep
tep33
実装
SStep
tep44
Step5
テスト
製造
リリース
本講義の対象
Copyright (C) Mitsubishi Research Institute, Inc.
6
Linuxにおける開発環境
 Linuxの歴史
 1991年、Linus Torvalsが開発
 GPLライセンスで配布し、急成長
Linux
 Linuxでの開発スタイル
 Linusが開発の中心
 世界中の個人・企業が無償で開発に参加
(バザール方式)
Linusらコーディネータ
 Linuxで利用できる開発環境
 豊富なコマンドラインツール(UNIX系OS)
 GUI開発環境も充実(Eclipseなど)
 UNIXとの関係
 ソースコードを流用していない
 商標を取得していない
 マルチタスク・マルチユーザの概念は踏襲
Copyright (C) Mitsubishi Research Institute, Inc.
7
インターネット
Linuxとオープンソース
 Linuxはオープンソースの成功事例
 Linuxはオープンソースの塊
 Linuxディストリビューションと呼ぶ
 Linusが開発したのは「Linuxカーネル」
 オープンソースの開発ツールの学習にLinux環境は最適
Copyright (C) Mitsubishi Research Institute, Inc.
8
ソフトウェア実装
Copyright (C) Mitsubishi Research Institute, Inc.
9
OS (オペレーティングシステム)
 計算機の歴史
「計算」以外
もできる!
そろばん
電卓
コンピュータ
 OSの機能





 OSの例






ハードウェアの管理
メモリ・プロセスの管理
ファイルの管理
GUIの提供
・・・
Copyright (C) Mitsubishi Research Institute, Inc.
10
MS DOS
MS Windows
UNIX
Linux
Mac OS X
z/OS
ブートローダ
 コンピュータ起動の仕組み
 脳(コンピュータ)だけでは何もできない
 身体(OS)があってはじめて作業ができる
OSの組み込み
(ブート)
 OSをロードする小さなプログラム=ブートローダ
 LILO、GRUBなど
 デュアルブート
 ロードするOSは切り替えられる
 Linux, Windows, FreeBSDなど・・・
Copyright (C) Mitsubishi Research Institute, Inc.
11
ファイルシステム
 ファイルシステム
 記憶装置は0/1の羅列
 住所(ファイル名、ディレクトリ名など)をつける仕組み
 ext2, ext3, ext4, xfs, FAT, NTFSなど
 ファイルツリー
 ツリー(木)構造
 "/(ルートディレクトリ)"が先頭
 ディレクトリは"/"で区切る
suzuki
tanaka
yamada
www
log
bin
local
 /home/suzuki, /var/www/htmlなど
 Windowsでは"¥"を使う
 C:¥Program Files¥
var
home
/
Copyright (C) Mitsubishi Research Institute, Inc.
12
usr
演習
 ブートローダ
 LinuxとWindowsを切り替えて起動してみる
 ブートローダの設定ファイルを読んでみる
 (以下はLinux環境で)
 ファイルシステム
 ファイルシステムの種類を調べる
 "df –T"と実行
 現在のディレクトリを確認する
 "pwd"と実行
 ファイルツリーを書いてみる
 ルートディレクトリ(/)から2, 3段階たどってみる
 ディレクトリの移動は"cd ディレクトリ名"
Copyright (C) Mitsubishi Research Institute, Inc.
13
結果の例
 ブートローダ
lilo (/etc/lilo.conf)
grub (/boot/grub/grub.conf)
boot=/dev/hda map=/boot/map
install=/boot/boot.b
timeout=50
message=/boot/message
lba32
default=linux
image=/boot/vmlinuz-2.4.0-0.43.6
label=linux
initrd=/boot/initrd-2.4.0-0.43.6.img
read-only
root=/dev/hda5
other=/dev/hda1
label=dos
default=0 timeout=10 splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux AS (2.6.8-1.523)
root (hd0,0)
kernel /vmlinuz-2.6.8-1.523 ro root=/dev/VolGroup00/LogVol00 rhgb quiet
initrd /initrd-2.6.8-1.523.img
# section to load Windows
title Windows
rootnoverify (hd0,0)
chainloader +1
※ 設定ファイルの位置は環境によって異なる
 ファイルシステム
$ df -T
Filesystem
/dev/hda2
none
Type
ext3
tmpfs
Copyright (C) Mitsubishi Research Institute, Inc.
1K%
56997280 40637428 13464540 76% /
224840
0
224840 0% /dev/shm
14
アプリケーション開発
Copyright (C) Mitsubishi Research Institute, Inc.
15
ソフトウェアのリソース
 プログラムだけではソフトウェアは成立しない
 アプリケーションの実行に必要なもの=リソース




プログラムコード(命令の集まり)
データ(画像、音声なども含む)
設定ファイル
など
Copyright (C) Mitsubishi Research Institute, Inc.
16
デバッグ手法
 デバッグプリント
 ソースコード中で変数の値を出力させる(原始的)
 リリース前に削除しないといけない
 例)10までの和を計算するとき
for (i=0; i<10; i++) {
j=j+i;
printf ("%d", j) ;
←途中経過を確認
}
 デバッガ




デバッグ専用のソフトウェアを利用
プログラムを一行一行実行し、そのときの各変数の値を見ることができる
指定した行(ブレイクポイント)までまとめて実行できる
EclipseなどのIDE(統合開発環境)には最初から実装されている
Copyright (C) Mitsubishi Research Institute, Inc.
17
デバッグプリント
デバッグプリントによる動作確認
 ソースコードに変数の値を出力するコードを埋め込む
 例: 変数 v の値を知りたいとき
 printf (“DEBUG: v = %d¥n”, v);
 デバッグプリントのメリット
 お手軽
 どんな言語でも、たいてい対応可能
 デバッグプリントのデメリット
 端末に表示をできないケースがある(例: カーネルモジュール、組み込みシステム等)
 簡単に確認できないバグもある(例: 画像処理プログラム、リアルタイムシステム等)
 デバッグプリントのコードが本体に影響し、動作が変わるケースもある
 スタックを破壊しているようなバグで、デバッグプリントの影響によってバグを回避してしまうケースなど
Copyright (C) Mitsubishi Research Institute, Inc.
18
デバッガ
デバッガ(および統合開発環境に組み込まれたデバッグ機能)による動作確認
 デバッガによるデバッグの標準的な流れ
 シンボル情報付きでコンパイル
 デバッガを起動、デバッガの操作により、不具合(バグ)の問題点を追求する
 デバッガ利用によるデバッグのメリット
 ブレークポイント、ウォッチポイント等の細かなプログラム制御による確認が可能
 どんな言語でも、たいていデバッガは用意されている
 デバッガ利用によるデバッグのデメリット
 デバッガの使い方を覚えなければならない
 最適化されていると、デバッガが適切に動作しないケースもある
デバッガ利用によるデバッグで戸惑うケース(Cプログラミングの場合)
 最適化が効き、変数がレジスタに割り当てられてしまう
 レジスタの内容を見なければならないが、対応が分かりづらい
Copyright (C) Mitsubishi Research Institute, Inc.
19
演習
 適当なソフトウェアを選択し、どのようなリソースファイルがあるか調べる
 ソフトウェアは以下のディレクトリにインストールされていることが多い
 Linux:/usr/, /usr/local/
 Windows:c:¥Program Files¥
 次のプログラム(バグが混入している)をデバッグプリントでデバッグする
#include <stdio.h>
int main() {
int i, j;
for (i = 0; i < 10; i++) {
j = j + i;
}
printf("Sum: %d¥n", j);
}
Copyright (C) Mitsubishi Research Institute, Inc.
20
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
21
オープンソース実践特論
第2回 ソフトウェア開発環境の概要
Copyright (C) Mitsubishi Research Institute, Inc.
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
2
ソフトウェア開発環境の必要条件
Copyright (C) Mitsubishi Research Institute, Inc.
3
言語
 コンピュータが理解できる言語と人間の関係
 工場とのアナロジー
 コンピュータは機械語しか理解できない
 コンパイラの登場
 アセンブリ言語の限界
 ALレジスタに32を代入
 MOV AL, 32
 より人間の言葉に近い言語の開発
 C言語、C++、Javaなど
Copyright (C) Mitsubishi Research Institute, Inc.
言語
リーダー
(利用者)
4
作業者
(コンピュータ)
プログラミング支援
 コンパイラ
 GCC (the GNU Compiler Collection)が代表的
 クロスコンパイラ
 別のプラットフォーム向けの実行ファイルをコンパイル
 実機上で開発ができない組み込みシステム開発には不可欠
 GCCが対応
 デバッガ
 第1回で紹介済み
 プロファイラ
 CPUやメモリに関する統計情報を取得するツール
 統合開発環境
 上記の機能がひとまとまりになったアプリケーション
Copyright (C) Mitsubishi Research Institute, Inc.
5
プロファイラ
 CPU使用率、メモリ使用量、メモリリーク検出など
 プログラムのボトルネックの分析に使う
 gprof
 プログラムの動作状況を計測、表示するツール
 各関数の呼び出し回数、処理時間などがわかる
 ボトルネック箇所の分析→高速化
 gprofの使い方
1. "-pg"オプションをつけてコンパイル
gcc –pg test.c
2. 通常通りプログラムを実行
./a.out
3. "gprof a.out gmon.out"を実行
 出力例
%
cumulative
self
time
seconds
seconds
100.00
0.40
0.40
0.00
0.40
0.00
Copyright (C) Mitsubishi Research Institute, Inc.
6
self
total
calls ms/call ms/call
80
5.00
5.00
3
0.00
133.33
name
func2
func1
プロファイラ
 MemProf
 メモリ使用量のプロファイリング
 メモリリークの検査
 MEMWATCH
 C用のCUIメモリ検査ツール
 メモリリーク、データ破壊等の検出
Copyright (C) Mitsubishi Research Institute, Inc.
7
gprofを使ったプロファイリング例
フィボナッチ数列を求めるプログラム
 再帰プログラミングバージョン(fib_bad.c)
#include <stdio.h>
int fib(int n)
{
if (n == 1 || n == 2)
return 1;
else
return fib(n-1) + fib(n-2);
}
int main(int argc, char** argv)
{
if (argc < 2)
{
printf ("usage: fib n¥n");
return -1;
}
int n = atoi(argv[1]);
printf("Fib(%d) = %d¥n", n, fib(n));
return 0;
}
同志社大学 理工学部 インテリジェント情報工学科 知的システムデザイン研究室 2002 advanced seminar 「第1回 gprof ゼミ」より引用
Copyright (C) Mitsubishi Research Institute, Inc.
8
gprofを使ったプロファイリング例
gprofの利用例
-pgオプション付きでコンパイル
まずは実行してみる
$ gcc –pg –o fib_bad fib_bad.c
$ ./fib_bad 40
Fib(40) = 102334155
$ ls
fib_bad
fib_bad.c
gmon.out
$ gprof –c --brief fib_bad
Flat profile:
プロファイルデータが生成されている
プロファイラを起動(-c オプションは “Call graph”の表示、
--brief オプションは余分な表示を消すという指示)
Each sample counts as 0.01 seconds.
%
cumulative
self
time
seconds
seconds
calls
94.54
2.25
2.25
1
5.46
2.38
0.13
self
s/call
2.25
total
s/call
2.25
name
fib
main
Call graph
granularity: each sample hit covers 4 byte(s) for 0.42% of 2.38 seconds
index % time
self children
called
name
<spontaneous>
[1]
100.0
0.13
2.25
main [1]
2.25
0.00
1/1
fib [2]
----------------------------------------------204668308
fib [2]
2.25
0.00
1/1
main [1]
[2]
94.5
2.25
0.00
1+204668308 fib [2]
204668308
fib [2]
----------------------------------------------Index by function name
膨大な回数の呼び出しが!
[2] fib
[1] main
$
Copyright (C) Mitsubishi Research Institute, Inc.
9
gprofを使ったプロファイリング例
フィボナッチ数列を求めるプログラム
 再帰プログラミングを使わないバージョン(fib_good.c)
#include <stdio.h>
int fib(int n)
{
int i, a=1, b=0, t;
for(i = 1; i < n; i++) {
t = a+b; b = a; a = t;
}
return a;
}
int main(int argc, char** argv)
{
if (argc < 2)
{
printf ("usage: fib n¥n");
return -1;
}
int n = atoi(argv[1]);
printf("Fib(%d) = %d¥n", n, fib(n));
return 0;
}
同志社大学 理工学部 インテリジェント情報工学科 知的システムデザイン研究室 2002 advanced seminar 「第1回 gprof ゼミ」より引用
 プロファイリング結果はどうなるか?
Copyright (C) Mitsubishi Research Institute, Inc.
10
高度な演習
 適当なCプログラムを作成し、gprofを使って分析してみる
 2つ以上の関数からなるCプログラムを用意する
(内容は各自で考えること。計測結果がわかりやすいように、時間がかかる関数にする)
 gprofを使ってそれぞれの関数の実行回数、実行時間を分析する
 プログラム全体の実行スピードを速くするにはどうすればよいか検討する
Copyright (C) Mitsubishi Research Institute, Inc.
11
プログラムのコンパイルとリンク
Copyright (C) Mitsubishi Research Institute, Inc.
12
C言語によるプログラミングとコンパイル
 gccがそれぞれのコマンドを呼び出す(他のコンパイラでも同様)
ソースコード(*.c)
プリプロセッサ処
理済みコード(*.i)
プリプロセッサ cpp
ヘッダファイル(#include)の読み込み、
マクロ(#define)の展開など
コンパイラ cc1
アセンブリコードの生成
アセンブリコード
(*.s)
アセンブラ as
オブジェクトコードの生成
オブジェクトコード
(*.o)
リンカ ld
複数のオブジェクトファイルを結合
実行コード
Copyright (C) Mitsubishi Research Institute, Inc.
13
gccによるコンパイル
 基本的なコンパイルの仕方
 gcc [オプション] ファイル…
 コンパイルオプション
 -o 出力先ファイルの指定
 -g デバッグ情報を付加するオプション。デバッガを使用するときに指定
 -pg プロファイル情報を付加するオプション。gprofを使うときに指定
 -l リンクに利用するライブラリの指定
 -I ヘッダファイルの存在しているディレクトリの指定
 -L ライブラリの存在しているディレクトリの指定
 -b クロスコンパイルのとき、ターゲットマシンを指定
 詳しい説明は、"gcc –help"または"man gcc"を実行
 もちろんインターネットで検索しても良い
Copyright (C) Mitsubishi Research Institute, Inc.
14
演習
 適当なCプログラム(例:プロファイラの演習で作成したプログラム)をコンパイルし
てgccの動作を確認する
 gccを-vオプションをつけて実行する
gcc –v sample.c –o sample
 cc1等が実行されているかどうかを確認する(※)
 cppやldは環境によっては表示されないかもしれない
 gccの代わりに、cpp, cc1, asを手作業で実行する(ldはやらない)
cpp –E sample.c –o sample.i
(※で見つけたcc1のディレクトリ)/cc1 sample.i
as sample.s –o sample.o
 それぞれのファイルの中身を見てみる
← Cのソースコード
less sample.c
← Cのソースコード
less sample.i
← アセンブラのコード
less sample.s
← 機械語+アセンブラのコード(逆アセンブル結果)
objdump –d sample.o | less
← 機械語+アセンブラのコード(逆アセンブル結果)
objdump –d sample | less
Copyright (C) Mitsubishi Research Institute, Inc.
15
オブジェクトファイルの構造
 ELFフォーマット
 Executable and Linkable Format
 Linuxなどの実行ファイルのフォーマット
 ELFフォーマットの構成
 ELFヘッダ
 基本情報と下記のヘッダの位置情報
 プログラムヘッダ
 セグメントの定義情報
 セクションヘッダ




text, data等のセクションに分かれている
text: 実行命令
data: メモリに配置するデータ
init: 初期化用命令
Copyright (C) Mitsubishi Research Institute, Inc.
16
ライブラリ
 ライブラリとは
 良く使われる関数などのソフトウェア部品をひとまとめにし、再利用できるようにしたもの
 ライブラリの意義
 複数のソフトウェアで同じソースコードを書かなくてよい
 バグ修正・機能追加はライブラリのみを更新すればよい
 ライブラリの利用例
 stdioもライブラリのひとつ
 printf, scanfなど
 研究に役立つライブラリもたくさんある
 文字列処理、信号処理、画像処理、ネットワーク関連、機械学習など
Copyright (C) Mitsubishi Research Institute, Inc.
17
演習
 先ほどのサンプルプログラムの実行ファイルの中身を見てみる
 実行ファイルの種類を確認する
file sample
 各種ヘッダを確認する
objdump –x sample
 利用しているライブラリを確認する
ldd sample
 ライブラリの中身を見てみよう
 nm コマンドを使う
 /usr/lib/libc.a の中身を見てみよう ( ※ libc.a の場所は環境によって異なる)
 先ほどのサンプルプログラムで使った関数はどこにあるだろうか?
Copyright (C) Mitsubishi Research Institute, Inc.
18
第2回、宿題と回答
Copyright (C) Mitsubishi Research Institute, Inc.
19
「gprofを使ったプロファイリング例」からの問題
フィボナッチ数列を求めるプログラム
 再帰プログラミングを使わないバージョン(fib_good.c)
#include <stdio.h>
int fib(int n)
{
int i, a=1, b=0, t;
for(i = 1; i < n; i++) {
t = a+b; b = a; a = t;
}
return a;
}
int main(int argc, char** argv)
{
if (argc < 2)
{
printf ("usage: fib n¥n");
return -1;
}
int n = atoi(argv[1]);
printf("Fib(%d) = %d¥n", n, fib(n));
return 0;
}
同志社大学 理工学部 インテリジェント情報工学科 知的システムデザイン研究室 2002 advanced seminar 「第1回 gprof ゼミ」より引用
 n = 47でオーバーフロー!どうする?
Copyright (C) Mitsubishi Research Institute, Inc.
20
「gprofを使ったプロファイリング例」からの問題: 回答
フィボナッチ数列を求めるプログラム
 再帰プログラミングを使わないバージョン(fib_good.c)
#include <stdio.h>
long long int fib(int n)
{
int i;
long long int a=1, b=0, t;
for(i = 1; i < n; i++) {
t = a+b; b = a; a = t;
}
return a;
}
int main(int argc, char** argv)
{
if (argc < 2)
{
printf ("usage: fib n¥n");
return -1;
}
int n = atoi(argv[1]);
printf("Fib(%d) = %lld¥n", n, fib(n));
return 0;
}
同志社大学 理工学部 インテリジェント情報工学科 知的システムデザイン研究室 2002 advanced seminar 「第1回 gprof ゼミ」より引用
 long long int を使う。long int ではダメ
 ただしこれは32ビットアーキテクチャだから。詳しくは次のスライドを参照
Copyright (C) Mitsubishi Research Institute, Inc.
21
(参考)データモデル
データモデル
 それぞれの型が何ビットのデータを持つかというモデル
 ILP32 : Int, Long, Pointer が32ビット
 LP64(I32LP64) : Intが32ビット、LongとPointerが64ビット
 LLP64(IL32P64) : IntとLongが32ビット、Pointerが64ビット
 コンパイラやCPUのアーキテクチャによって異なる
16ビットアーキテクチャの名残り
ILP32
LP64
LLP64
ILP64
char
8
8
8
8
short
16
16
16
16
int
32
32
32
64
long
32
64
32
64
long long
64
64
64
64
pointer
32
64
64
64
Copyright (C) Mitsubishi Research Institute, Inc.
22
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
23
オープンソース実践特論
第3回 ソフトウェア開発環境の概要
Copyright (C) Mitsubishi Research Institute, Inc.
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
2
統合開発環境
Copyright (C) Mitsubishi Research Institute, Inc.
3
開発プラットフォーム
 開発に必要なツール
 エディタ
ソースコード編集
 vi, Emacs
エディタ
リソース管理ツール
バージョン管理ツール
GUI作成ツール
 コンパイラ
 gcc
 ビルド自動化
 make, autotools
 デバッガ
 gdb, ddd
デバッグ
プロファイリング
 プロファイラ
 gprof,
 リソース管理ツール
 バージョン管理ツール
デバッガ
プロファイラ
 RCS, CVS, Subversion, Git
 GUI作成ツール
コンパイル・ビルド
 glade
コンパイラ
ビルド自動化
Copyright (C) Mitsubishi Research Institute, Inc.
4
統合開発環境の利用
 前ページのツールをつかいこなすのは大変
 ひとつひとつ入手しないといけない
 使い方にそれぞれ癖がある
 GUIツールとCUIツールの混在
 統合開発環境
 ツールを統合
 操作性を統一
 GUIのため多くのユーザにとって使いやすい
Copyright (C) Mitsubishi Research Institute, Inc.
5
統合開発環境の例
 Eclipse
 Java用→さまざまな言語に対応。豊富なプラグイン。デファクトスタンダード
 NetBeans
 Java用。Eclipseと双璧をなす。
 WideStudio
 C/C++用。日本人が開発。クロスプラットフォームのアプリケーション開発が容易。
 ActiveBASIC
 BASIC用。日本人が開発。
 Visual Studio (Microsoft)
 代表的な商用統合開発環境
Copyright (C) Mitsubishi Research Institute, Inc.
6
Eclipse
http://www.eclipse.org/screenshots/images/SDK-RedFlag_Linux.png
Copyright (C) Mitsubishi Research Institute, Inc.
7
NetBeans
http://www.netbeans.org/images/v6/7/screenshots/web-app.png
Copyright (C) Mitsubishi Research Institute, Inc.
8
WideStudio
http://www.widestudio.org/ja/builder-doc/2-3.html
Copyright (C) Mitsubishi Research Institute, Inc.
9
この授業では
 まずは個々のツールを理解
 ツールの必要性を学ぶ
 ツールの有用性を実感する
 その後、統合開発環境を使ってみる
 統合開発環境の便利さを実感する
 ただし、機能が多すぎて理解するのが大変な側面も
 個々のツールを使ったことがある方が理解しやすいはず
Copyright (C) Mitsubishi Research Institute, Inc.
10
バージョン管理
Copyright (C) Mitsubishi Research Institute, Inc.
11
ソースコードバージョン管理
 アプリケーションの構成






ソースコード
アイコンなどの画像ファイル
設定ファイル
メッセージなどのデータファイル
マニュアルなどの文書
etc.
 開発の進捗に伴い、随時更新される
 こんなときはどうする?
 試しに機能追加をしたい
 ○○.bakのようなファイルを用意する?
 うまく動かないので前のバージョンに戻したい
 バージョンごとにディレクトリを作ってコピーしておく?
 ソースコードを編集したいが、他の人が編集中
 編集が終わるまで待つ?
 バージョン管理ツールを使えば問題は解決!
 アプリケーションを「リポジトリ」で管理
Copyright (C) Mitsubishi Research Institute, Inc.
12
バージョン管理システム
 ソースコード等やそれらの変更履歴を管理




チーム開発に必須
いつ、だれが、どこを、どのように変更したのかを管理
旧バージョンに戻したり、枝分かれバージョンを作ることもできる
単独開発→チーム開発→分散開発 という開発形態の変容とともに進歩
ネットワーク
レポジトリごとコピーし、
差分を更新
ファイルサーバ内を
直接編集
個人開発
チーム開発(少人数)
チーム開発(大規模)、分散開発
RCS
Copyright (C) Mitsubishi Research Institute, Inc.
CVS / Subversion
13
Git
RCS (Revision Control System)
 個人あるいはごく少数のプロジェクト向け
 最近はWikiのリビジョン管理に使われている
 編集時にファイルをロック(チェックアウト)、編集後、ロックを解除(コミット、チェック
イン)
 解除忘れに注意
A
B
C ・・・
Aを編集するよ
A
B
C ・・・
Aは編集できな
いわ・・・
同一ファイルを複数人で編集する場合(RCS)
Copyright (C) Mitsubishi Research Institute, Inc.
14
A
B
C ・・・
終わったからロッ
ク解除するね
今度は私がAを編
集するね
Subversion
 CVS (Concurrent Versions System)の後継であり、近年の主流
 複数人、ネットワーク越しでの開発に向いている
 集中管理方式
 リポジトリをローカルにコピーし、編集。編集後、サーバを更新。
 他のユーザが更新していた場合は、
 競合していなければ自動的にマージ
 競合している場合にはユーザが確認しながらマージ
Aを編集
しよう
Aを編集
しよう
コミット
しよう
Aを編集
中・・・
同一ファイルを複数人で編集する場合(Subversion)
Copyright (C) Mitsubishi Research Institute, Inc.
15
コミットしよう。
他に編集した人がい
るけど問題ないわ。
Git
 Linuxカーネル開発用に開発された。RoR、Perl、Androidでも利用
 処理が高速で、大規模分散開発に向いている
 分散管理方式
 リポジトリをローカルにコピーし、ローカルリポジトリ内でコミット
 メインリポジトリへは管理者が反映させる
だけを
取り込もう
Aを編集
しよう
Aを編集
しよう
コミット
しよう
コミット
しよう
同一ファイルを複数人で編集する場合(Git)
Copyright (C) Mitsubishi Research Institute, Inc.
16
演習
 オープンソースソフトウェアのリポジトリを見て、どんなファイルがあるか調べてみ
よう
 Web上からリポジトリが見られるソフトウェアも多い
 ddd: http://svn.savannah.gnu.org/viewvc/trunk/?root=ddd
 gprof: http://sourceware.org/cgi-bin/cvsweb.cgi/src/gprof/?cvsroot=src
Copyright (C) Mitsubishi Research Institute, Inc.
17
ドキュメンテーション
Copyright (C) Mitsubishi Research Institute, Inc.
18
ドキュメンテーションツール
 ソースコード
 プログラミング言語で記述
 ぱっと見ただけでは何をしているのかわからない
 関数の使い方、変数の意味、アルゴリズムなど
 ソースコードを「解説」する文書が必要
 他のプログラムから使うにはどうする?
 他の開発者にもわかるようにするには?
 昔自分で書いたプログラムの意味がわからない?
 小規模ならコメントをソースコードの随所に書けばOK
 大規模になると「コメント」では全体像を把握できない
 別途「API仕様書」などを用意する
 ソースコードと仕様書の両方に同じようなことを書くのは無駄、忘れやすい
ドキュメント管理ツールの出番
Copyright (C) Mitsubishi Research Institute, Inc.
19
ドキュメンテーションツール
 ドキュメントとソースコードの整合性を保つ
 ソースコード中のコメントからドキュメントを自動生成
 ソースコードとドキュメントが常に最新の状態になる
 ドキュメントジェネレータともいう
 ツールの例
 Doxygen
 JavaDoc
Copyright (C) Mitsubishi Research Institute, Inc.
20
Doxygen
 C/C++、Java、Python等に対応したドキュメント管理ツール
 ソースコードに記述されたコメントからドキュメントを生成
 HTML、PDF、LaTeX形式などで出力
使用例:MediaWiki
 Wikipediaで利用している
Wikiシステム
 http://svn.wikimedia.org/doc/
Copyright (C) Mitsubishi Research Institute, Inc.
21
Javadoc
 Javaに対応したドキュメント管理ツール
 ソースコードに記述されたコメントからドキュメントを生成
 HTMLへの出力が標準
 「@author」などのタグが自作できる(Doclet)
Copyright (C) Mitsubishi Research Institute, Inc.
22
演習
 Doxygenを使ってみよう
 設定ファイルの準備
1. (sample.cのディレクトリで)設定ファイルの生成
doxygen –g
2. 設定ファイルの編集(Doxyfile)
PROJECT_NAME, PROJECT_NUMBER: 好きなように
OUTPUT_LANGUAGE = Japanese
EXTRACT_ALL = YES
 ソースコード(sample.c)へのコメントの追加
/** @file (ファイル名)
@brief サンプルプログラム
サンプルプログラムの説明
*/
ファイルの先頭に追加するコード
 右のコードをファイルの先頭、関数の直前に追加する
 Doxygenの実行
doxygen
 ブラウザで出力を確認
html/index.htmlを開いてみる
Copyright (C) Mitsubishi Research Institute, Inc.
/**
関数の説明
*/
関数の直前に追加するコード
23
演習
 出力例
Copyright (C) Mitsubishi Research Institute, Inc.
24
レポート課題
 第3回までに紹介したオープンソースの開発ツールのいずれかを選択し、以下の
内容をA4 1~2枚程度でまとめなさい




ツールの概要
ツールを利用することのメリット・デメリット
実際に使った上での改善提案
その他の感想
Copyright (C) Mitsubishi Research Institute, Inc.
25
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
26
オープンソース実践特論
第4回 バージョン管理ツールの活用
Copyright (C) Mitsubishi Research Institute, Inc.
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
2
バージョンの管理
Copyright (C) Mitsubishi Research Institute, Inc.
3
ソースコードバージョン管理
 アプリケーションの構成






ソースコード
アイコンなどの画像ファイル
設定ファイル
メッセージなどのデータファイル
マニュアルなどの文書
etc.
 開発の進捗に伴い、随時更新される
 こんなときはどうする?
 試しに機能追加をしたい
 ○○.bakのようなファイルを用意する?
 うまく動かないので前のバージョンに戻したい
 バージョンごとにディレクトリを作ってコピーしておく?
 ソースコードを編集したいが、他の人が編集中
 編集が終わるまで待つ?
 バージョン管理ツールを使えば問題は解決!
 アプリケーションを「リポジトリ」で管理
Copyright (C) Mitsubishi Research Institute, Inc.
4
バージョン管理システム
 ソースコード等やそれらの変更履歴を管理




チーム開発に必須
いつ、だれが、どこを、どのように変更したのかを管理
旧バージョンに戻したり、枝分かれバージョンを作ることもできる
単独開発→チーム開発→分散開発 という開発形態の変容とともに進歩
ネットワーク
レポジトリごとコピーし、
差分を更新
ファイルサーバ内を
直接編集
個人開発
チーム開発(少人数)
チーム開発(大規模)、分散開発
RCS
Copyright (C) Mitsubishi Research Institute, Inc.
CVS / Subversion
5
Git
CVSリポジトリ
Copyright (C) Mitsubishi Research Institute, Inc.
6
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gprof/?cvsroot=src
変更履歴
Copyright (C) Mitsubishi Research Institute, Inc.
7
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gprof/?cvsroot=src
差分
Copyright (C) Mitsubishi Research Institute, Inc.
8
http://sourceware.org/cgi-bin/cvsweb.cgi/src/gprof/?cvsroot=src
バージョン管理の利用例
 複数人で開発を進めるときにとくに有効
 もちろん一人で使ってもOK!
Aを編集
しよう
Aを編集
しよう
コミット
しよう
Aを編集
中・・・
同一ファイルを複数人で編集する場合(Subversion)
Copyright (C) Mitsubishi Research Institute, Inc.
9
コミットしよう。
他に編集した人がい
るけど問題ないわ。
バージョン管理しない場合の問題発生事例
 ファイルを更新する場合には、「abc20091120.c」のような名前でバックアップをとっ
てから編集するルールにしていた
 うっかりバックアップを取る前に更新してしまった!
 同じ日に何度も更新していたら、どのバックアップが最新かわからなくなってしまった!
 たくさんのファイルに細かな修正を加えていた
 事情により、すべて修正をキャンセルしたくなった!
 たくさんのファイルをバックアップから復旧させるのはとても面倒・・・
Copyright (C) Mitsubishi Research Institute, Inc.
10
新しいバージョンを作る
 リポジトリ
 バージョン管理用のディレクトリ
 リポジトリにチェックイン(コミット)すると自動的に新しいバージョン(リビジョン)番
号がふられる
 リポジトリからデータを取り出すことを「チェックアウト」という
Copyright (C) Mitsubishi Research Institute, Inc.
11
複数人で編集すると何が起こる?
 ロック方式
 Aさんが編集中はBさんはそのファイルにアクセスできない(編集できない)
 RCS(個人向け)で採用
 マージ方式




Aさん、Bさんはそれぞれ自分の手元にファイルをコピーして編集
それぞれの編集部分を元のファイルに適用
同じ場所を編集していたら?(コンフリクト)
チェックインのときに対応する
コンフリクト
Copyright (C) Mitsubishi Research Institute, Inc.
12
バージョンを戻す
Copyright (C) Mitsubishi Research Institute, Inc.
13
バージョンを戻すケース
 機能追加をしてみたが、うまく行かなかったので元に戻したい
 新しいアルゴリズムを実装してみたが、間違っていた
 バグを修正したつもりが、かえって増やしてしまった
 リファクタリングをしていたが、間違いに気づいた
 ソフトウェア開発では、
 予想通りに行かないことは多い
 やり直しを簡単にできることが重要
Copyright (C) Mitsubishi Research Institute, Inc.
14
バージョンを戻す方法(Subversionの場合)
 指定したリビジョンのファイルを確認する
 sample.cのリビジョン3を見る場合
 svn cat --revision 3 sample.c
 バージョンを戻す
 sample.cのリビジョンを6から3に戻す場合
 svn merge -r 6:3 sample.c
Copyright (C) Mitsubishi Research Institute, Inc.
15
ブランチの管理
Copyright (C) Mitsubishi Research Institute, Inc.
16
ブランチとその必要性
 リポジトリを分岐させること(「枝」を作る)
 複数の開発を並行して進めることができる
 大幅な機能追加や変更をしたいとき
 バグフィクス等はこれまでのバージョンと新バージョンの両方に適用したい
 両者をしばらく並行運用させる(ブランチ)
 例)Windows XPとVista、Firefox 3.5系列と3.0系列など
 安定版と開発版
 開発版で試行錯誤し、動作を確認したら安定版に組み込む
 開発版は複数の場合もある
Copyright (C) Mitsubishi Research Institute, Inc.
17
ブランチを作る方法(Subversionの場合)
 ブランチを作成する方法
 trunkからmy-branchに"branch"という名前でブランチを作成する場合
 svn copy trunk my-branch -m "branch"
 ブランチで作業した内容をtrunkに反映させたり、全体を再度マージすることも可能
 svn mergeコマンド
 ブランチの削除
 svn deleteコマンド
Copyright (C) Mitsubishi Research Institute, Inc.
18
主なバージョン管理ツール
Copyright (C) Mitsubishi Research Institute, Inc.
19
RCS (Revision Control System)
 個人あるいはごく少数のプロジェクト向け
 最近はWikiのリビジョン管理に使われている
 編集時にファイルをロック(チェックアウト)、編集後、ロックを解除(コミット、チェック
イン)
 解除忘れに注意
A
B
C ・・・
Aを編集するよ
A
B
C ・・・
Aは編集できな
いわ・・・
同一ファイルを複数人で編集する場合(RCS)
Copyright (C) Mitsubishi Research Institute, Inc.
20
A
B
C ・・・
終わったからロッ
ク解除するね
今度は私がAを編
集するね
Subversion
 CVS (Concurrent Versions System)の後継であり、近年の主流
 複数人、ネットワーク越しでの開発に向いている
 集中管理方式
 リポジトリをローカルにコピーし、編集。編集後、サーバを更新。
 他のユーザが更新していた場合は、
 競合していなければ自動的にマージ
 競合している場合にはユーザが確認しながらマージ
Aを編集
しよう
Aを編集
しよう
コミット
しよう
Aを編集
中・・・
同一ファイルを複数人で編集する場合(Subversion)
Copyright (C) Mitsubishi Research Institute, Inc.
21
コミットしよう。
他に編集した人がい
るけど問題ないわ。
Git
 Linuxカーネル開発用に開発された。RoR、Perl、Androidでも利用
 処理が高速で、大規模分散開発に向いている
 分散管理方式
 リポジトリをローカルにコピーし、ローカルリポジトリ内でコミット
 メインリポジトリへは管理者が反映させる
だけを
取り込もう
Aを編集
しよう
Aを編集
しよう
コミット
しよう
コミット
しよう
同一ファイルを複数人で編集する場合(Git)
Copyright (C) Mitsubishi Research Institute, Inc.
22
演習 ~ RCSを使ってみよう
 基本的なバージョン管理システムであるRCSを使って、バージョン管理の基礎を
理解する
1. バージョン管理するファイルを作成する
数行程度のテキストファイル。ここではsample.txtとする
2. バージョン管理を開始する
ci sample.txt
ファイルの説明を入力して改行した後、ピリオドだけを打って改行する
3. sample.txt,vに名称が変更され、書き込み権限が無くなる
ls -al
を実行して確認する
4. チェックアウトして編集を開始する
co -l sample.txt
5. エディタを使ってsample.txtに数行のテキストを追加し、保存する
6. チェックインして編集を確定する
ci sample.txt
変更の説明を入力して改行した後、ピリオドだけを打って改行する
Copyright (C) Mitsubishi Research Institute, Inc.
23
演習 ~ RCSを使ってみよう
 基本的なバージョン管理システムであるRCSを使って、バージョン管理の基礎を
理解する
7. 変更履歴を確認する
rlog sample.txt
先ほど入力したコメントや日時が表示される
リビジョン番号も表示される
8. 変更した差分を表示する
rdiff -r1.2 -r 1.1 sample.txt
-rには差分をとるリビジョン番号を指定する
 時間があれば
 CVSのツールを使ってCVSリポジトリからダウンロードしてみる
 ブランチの作成、タグの作成をやってみる
 方法はインターネットで検索できる
 SubversionやGitなどではどうしているか調べる
Copyright (C) Mitsubishi Research Institute, Inc.
24
第4回、宿題と回答
Copyright (C) Mitsubishi Research Institute, Inc.
25
rcsを使ったバージョンのブランチとマージ
リビジョンのブランチ
 「co –rX.Y foobar.c 」とすると、リビジョン X.Y に戻すことができる
 しかし、そのままチェックインすると…
 枝分かれしてしまう
1.1
1.2
1.3
co -r 1.2 して
ci すると
← HEADがココにあるとき
 1.2.1.3 などを、元に戻して 1.4 にしたい。どうする?
Copyright (C) Mitsubishi Research Institute, Inc.
26
1.2.1.1
1.2.1.2
1.2.1.3
rcsを使ったバージョンのブランチとマージ :回答
安易なやり方
1.2
1.3
co -r 1.2 して
ci すると
← HEADがココにあるとき
1.2.1.1
1.2.1.2
ここの変更が ① co file; rm file して、中身を全部消す
無駄になって
② co -r1.2.1.3 -p file > /tmp/file を 1.2.1.3
しまう!
実行して、1.2.1.3 を一時ファイルに
取り出す
③ mv /tmp/file file して、中身を
全部移してから、ci file する
1.4
Copyright (C) Mitsubishi Research Institute, Inc.
27
rcsを使ったバージョンのブランチとマージ :回答
優れたやり方
1.2
1.3
ここの変更が
無駄に
ならない!
co -r 1.2 して
ci すると
← HEADがココにあるとき
1.2.1.2
1.2.1.3
+
1.4
1.2.1.1
co -j1.2.1.3 というように
-j (joint)オプションを使う
 ただし、同じ場所を編集していると「コンフリクト」が発生するのでうまくマージできない場合
があることには注意しよう
Copyright (C) Mitsubishi Research Institute, Inc.
28
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
29
オープンソース実践特論
第5回 デバッガによるプログラムデバッグの環境
Copyright (C) Mitsubishi Research Institute, Inc.
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
2
プログラムは(たいがい)思ったようには動かない!
Copyright (C) Mitsubishi Research Institute, Inc.
3
いくらいじっても(なかなか)思ったようには動かない!
Copyright (C) Mitsubishi Research Institute, Inc.
4
直せども直せども(やっぱり)思ったようには動かない!
Copyright (C) Mitsubishi Research Institute, Inc.
5
というわけでプログラミングにデバッグは付き物です
Copyright (C) Mitsubishi Research Institute, Inc.
6
基本的なデバッグの方法
Copyright (C) Mitsubishi Research Institute, Inc.
7
デバッグとは
 バグの種類
 コンパイルエラー
 ランタイムエラー
 論理エラー
 コンパイルエラー(ビルド時に生じるエラー)
 コンパイルに失敗する
 単純なミス(スペル、文法)が原因のことがほとんど
 ランタイムエラー
 実行時に途中で停止する
 0による除算(division by zero)やスタックオーバーフローが多い
 論理エラー
 設計・仕様と異なる動作をする
 プログラマ側の問題であり、コンピュータは判断できない
 問題: lesson 1 で発見したエラーは、上記のどれでしょう?
Copyright (C) Mitsubishi Research Institute, Inc.
8
デバッガの利用
 コンパイルエラーは発見が容易
 コンパイラがどの行に間違いがあるかを教えてくれる
 メッセージを読めばわかる
test.c: `main' :
test.c:7: error: `j' undeclared (first use in this function)
 リンク時のエラーはやや難しい
 ライブラリに不整合(バージョンの相違など)がある場合に起こりやすい
 よくあるパターン
 「呼び出している関数がない」 ⇒ nm コマンドでライブラリをチェックする
 関数の引数が変更されているだけの場合はランタイムエラーになる可能性がある
 ランタイムエラーや論理エラーへの対処方法
 デバッグプリント(printf等の埋め込み)
 デバッガを利用するともっと便利
 コンパイラフラグで -Wuninitialized や -Wall といったオプションを試す方法もある!
Copyright (C) Mitsubishi Research Institute, Inc.
9
トレース機能
Copyright (C) Mitsubishi Research Institute, Inc.
10
デバッガの機能~トレース
 間違ったプログラムは間違ったとおりに実行される
 論理エラーの追及はなかなか難しい!
 トレースとは何か
 プログラムを一行一行実行していく機能
 その時々の変数の値やアプリケーションの状況をチェックすることでバグを把握
 トレースの方法
1. 一行ずつ実行する
2. そのときの変数の値や分岐先を確認する
3. 想定していた値と異なればそこにバグがあるはず
Copyright (C) Mitsubishi Research Institute, Inc.
11
トレース機能の拡張
 ブレークポイント
 指定した場所で実行を停止する
 ウォッチポイント
 変数が指定した値になったときに実行
を停止する
Copyright (C) Mitsubishi Research Institute, Inc.
12
演習
 DDD (Data Display Debugger)を使ってみよう
 次ページのソースコード(1~4までの和を求める)を-gオプション付きでコンパイルする。
gcc -g sample.c -o sample
 ./sample で実行してみる
 結果は?10にならない・・・デバッグしてみよう
 DDDを起動する(メニューもしくは"ddd"とコマンドを打つ)
 File → Open Programから実行ファイル(sample)を選択する
 コマンドラインで、ddd [実行ファイル(sample)] と入力する方法もある
 ブレイクポイントを設定し、ステップ実行してみる
 ブレイクポイントの設定)指定したい行で右クリックして選択
 "Run"、"Step"で一行ずつ実行してみる
 変数の値を確認する
 変数名の右クリックで「Display (変数名)」を選択する
 マウスを変数の上にしばらく置くと値が表示される。ステータスバーにも表示される。
 バグの原因は?
Copyright (C) Mitsubishi Research Institute, Inc.
13
演習のソースコード
#include <stdio.h>
int main() {
int i, j;
for (i = 0; i < 5; i++) {
j = j + i;
}
printf("%d", j);
}
Copyright (C) Mitsubishi Research Institute, Inc.
14
アプリケーションのデバッグ
Copyright (C) Mitsubishi Research Institute, Inc.
15
アプリケーションの様々なバリエーション
 デスクトップアプリケーション
 組み込みアプリケーション
 データベースアプリケーション
 Webアプリケーション
 DBMSを使うアプリケーション
 デスクトップアプリの場合もWebアプリの場合
もある
Copyright (C) Mitsubishi Research Institute, Inc.
16
デスクトップアプリケーションのデバッグ
 デバッグプリント、デバッガなどを使う
 たいていは先ほどの「演習」と同様の方法
 デバッグプリントやデバッガの利用で追求できないバグがある
 例:画像処理アプリケーション
 このようなバグはどうすれば直せるか
結果を検証するためのコードを作成してデバッグする
(かなり面倒だが、ソフトウェアの品質向上には不可欠)
Copyright (C) Mitsubishi Research Institute, Inc.
17
DBアプリケーションのデバッグ
 DBデータの取得(書き込みも同様)
1. SQLを用意する
2. DBMSでSQLを実行する
3. DBMSから結果を取得し、アプリケーションで活用する
 SQLの文字列が固定の場合
 例)ユーザ一覧の取得
SELECT id, name FROM users;
1. DBMSのフロントエンドでSQLを実行し、想定された値が返ってくるか確認する
2. SQLをアプリケーションに組み込み、動作を確認する
 動的に生成するSQLの場合
 例)ユーザが指定した番号の商品を取得する
SELECT product FROM products WHERE id=XYZ;
 “XYZ”の部分は毎回異なる
1. XYZを「決めうち」で実行し、想定された値が返ってくるか確認する
2. SQLを生成するプログラムを記述し、生成されたSQLをデバッグプリントで確認する
printf(“%s”, “SELECT product FROM products WHERE id=“, id);
3. 上記のSQLをアプリケーションに組み込み、動作を確認する
Copyright (C) Mitsubishi Research Institute, Inc.
18
こんなのどうやってデバッグするの?
撮影:三菱総合研究所
Copyright (C) Mitsubishi Research Institute, Inc.
19
組み込みアプリケーションのデバッグ
 組み込みアプリケーション
 メモリサイズ、計算速度、出力画面サイズなどに制約がある
 アプリケーション開発で問題になりそうなことは何があるだろうか?
 PC上でコードを書き、実行するのは端末上
動作検証の
方法は?
プログラム編集
コードのビルド
エミュレータ利用のデバッグ
実機への転送
実機上でのデバッグ
組み込みといってもいろいろある
システムや車の制御、ネットワーク機器、自動販売機、etc.
簡単にテストできる項目とそうでない項目がある
Copyright (C) Mitsubishi Research Institute, Inc.
20
★iPhoneアプリの開発環境
Copyright (C) Mitsubishi Research Institute, Inc.
21
組み込みアプリケーションのデバッグ(続き)
 基本はデバッグプリント
 シリアル経由でPCに出力することも
RS-232CやUSBといった
規格の通信ケーブルを
利用
もし表示装置が
あれば…
プログラムの転送
実行の制御
ターゲット
デバイス
ホストPC
デバッグ情報
Copyright (C) Mitsubishi Research Institute, Inc.
22
デバッグ
情報
組み込みアプリケーションのデバッグ(続き)
 デバッグモニター
 ターゲット上で動作させ、アプリケーションとPC上のデバッガの橋渡しをする
ホストPC
開発環境
(ホスト側の
デバッガ)
プログラムの転送
実行の制御
デバッグ情報
デバッグ
モニター
ターゲット
デバイス
デバッグ対象の
アプリケーション
ハードウェアによるデバッグツール
 ICE (In Circuit Emulator)
 プロセッサの代わりに組み込み、バスや信号の状態を参照できるようにする
 JTAG
 ターゲットに接続し、PC上のデバッガとの橋渡しをする
 さらにはオシロスコープ等でハードウェアのデバッグを行うことも…
Copyright (C) Mitsubishi Research Institute, Inc.
23
Webアプリケーションのデバッグ
 WebアプリはWebサーバ上で実行される
 組み込みアプリケーションのデバッグとどう違うか?
 基本はデバッグプリント
 画面出力またはログをファイルに出力
 プログラミング言語によってはデバッグ用の出力関数を用意
 デスクトップアプリケーションと比較すると非効率
 デバッグ機能はIDEが提供





Eclipse WTP (Web Tools Platform) (Java)
Eclipse + EPICプラグイン(Perl)
Eclipse + PDPプラグイン(PHP)
Firebug (JavaScript)
など
Copyright (C) Mitsubishi Research Institute, Inc.
24
array(3) {
["tokyo"]=>
string(4) "東京"
["kanagawa"]=>
string(6) "神奈川"
["saitama"]=> string(4) "埼玉"
}
PHPのvar_dump関数の出力例
FirebugでのJavaScriptのデバッグ
Copyright (C) Mitsubishi Research Institute, Inc.
25
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
26
オープンソース実践特論
第6回 オープンソース開発ツールの種類と機能
Copyright (C) Mitsubishi Research Institute, Inc.
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
2
分析と設計で利用するツール
Copyright (C) Mitsubishi Research Institute, Inc.
3
分析・設計ツール
分析・設計ツールが必要である理由
 分析・設計ツールが必要になる場面
開発の初期段階
概念設計
機能設計
詳細設計
画面設計
データベース設計
etc...
運用時
パフォーマンス測定
ボトルネック検出
バグ追跡
チューニング
追加機能検討
etc...
分析・設計とUML
 UML … Unified Modeling Language
 “Language”といってもテキストではない
 図の集まり
 図によって情報をやりとりすることで様々なメリットが
 (どのようなメリットがあるか、考えてみよう)
Copyright (C) Mitsubishi Research Institute, Inc.
4
システムのアップデート
機能追加
不具合修正
性能向上
etc...
UMLの歴史と意義
UMLの歴史
 UML登場以前
 Booch, JacobsonらのOOSE
 Object Oriented Software Engineering
 RumbaughらのOMT
 Coad-Yourdon法
 Shlaer-Mellor法
Booch法によるクラス図
問題点
 開発者同士でツールが違うと話ができない!
UMLコンソーシアム設立
UML1.0発表
UML1.5
UML2.0
Copyright (C) Mitsubishi Research Institute, Inc.
出典:ウィキメディア・コモンズ
いやOMTを使おう
BoochのOOSEだ
歴史
 1996年
 1997年
 2003年
 2004年
OMTによるクラス図
UMLとオブジェクト指向設計は
表裏一体の関係
5
UMLの活用シーン
 Webアプリケーション設計の例
UMLにおける代表的な各図の例
 ビジネスロジック設計
 コンポーネント間インターフェース設計など
シーケンス図:各オブジェクトの動作を時系列(シーケンス)に従って記述
オブジェクトA:クラス1
 実際の利用方法
オブジェクトB:クラス2
オブジェクトC:クラス3
オブジェクトの生成
 クラス図を用いてオブジェクトの関係を記述
 クラスの属性、メソッド、クラス間の関係等を
ブレークダウンする
 アクティビティ図、状態図、シーケンス図な
どで動作を記述
オブジェクトの生成
メッセージ(復帰)
オブジェクトの消滅
アクティビティ図:各アクションの関係を実行順序や依存性に着目して記述
(農工大「Webコンピューティング実践特論」
第7回資料より引用)
アクション
アクション
アクション
アクション
Copyright (C) Mitsubishi Research Institute, Inc.
6
アクション
UMLに定められている図
ユースケース図
ユーザ、システム、外部システム等の相互作用を表す。簡単にいうと、代表
的な利用状況を図示したもの
オブジェクト図
オブジェクト指向設計で作成されたシステムにおけるオブジェクト(データの
固まり)における関係を図示したもの
シーケンス図
システムの振る舞いを時系列的に表現したもの
状態図(ステート図)
オブジェクトの状態遷移を図示したもの
コンポーネント図
システムを構成する部品(コンポーネント)の関係を図示したもの
クラス図
システムの静的な構成を図示したもの。クラスの継承(is-a関係)や包含
(has-a)関係を表現する
パッケージ図
システムを構成するパッケージ単位の包含関係を図示したもの
コラボレーション図
オブジェクト間の相互作用を図示したもの
アクティビティ図
システムの動的な振る舞いを図示し、処理の手順を表現したもの
配置図
システムを配置する物理的な構成を図示したもの(DBサーバとWebサーバ、
クライアントの関係、など)
Copyright (C) Mitsubishi Research Institute, Inc.
7
UMLの利用
UMLで定義されている様々な図の例
シーケンス図
ユースケース図
クラス図
パッケージ図
Copyright (C) Mitsubishi Research Institute, Inc.
ステート図
8
出典:ウィキメディア・コモンズ
(いずれもCCまたはパブリックドメインのものを利用)
演習:UMLを書いてみよう
簡単なのは「ユースケース図」
 いろいろなシステムの「ユースケース」を考えてみよう





図書館の蔵書データベース
自動販売機
銀行のATM
電車の改札(SUICAのシステム)
etc…
システム
何をするか
アクター
 ポイント
 その「ユースケース」に登場するアクターは誰か
 そのアクターは何をするか
 それぞれどのような関係にあるか
Copyright (C) Mitsubishi Research Institute, Inc.
9
何をするか
アクター
UML作成支援ツール(1)
ArgoUML
 特徴
 Javaで作られている
 Java Web Startでも利用可能
 OSに依存しない
 UML1.4の全図をサポート
 多くの画像形式で出力できる
 リバースエンジニアリング機能
 ライセンス
 BSDライセンス
 入手先
 http://argouml.tigris.org/
ArgoUMLを利用している画面のスクリーンショット
Copyright (C) Mitsubishi Research Institute, Inc.
10
UML作成支援ツール(2)
Umbrello
 特徴
 KDEに含まれるプログラミング支援ツール
 KDE環境でなくとも利用はできる
 Windows, Mac OS Xにも移植されている
 利用頻度の高い図をサポート




クラス図
ユースケース図
コンポーネント図
配置図
 コードの自動生成





Java
PHP
C++
JavaScript
ActionScript、他、多数の言語に対応
 ライセンス
 GPL v2
 入手先
 http://uml.sourceforge.net/index.php
Copyright (C) Mitsubishi Research Institute, Inc.
Umbrelloを利用している画面のスクリーンショット
11
UML作成支援ツール(3)
その他のツール
 Conzilla
 UMLet
 etc…
Copyright (C) Mitsubishi Research Institute, Inc.
12
ER図
 データベース設計に必要な項目
ERD (Entity Relationship Diagram)とは?
 ERDに基づいた正規化
 必要に応じて逆正規化
ERDを構成する3つの要素
 エンティティ(Entity):個々の事象
 アトリビュート(Attribute):事象の特性や状態、「属性」
 リレーションシップ(Relationship):事象同士の関係
 運用上の制約から、正規化の逆処理が必要になる場合
がある
1970年、ピーターチェンが提唱
RDB設計の表現に適している
 ERDを物理設計レベルにブレークダウン
 DB構築のSQLを生成する
顧客
M
N
受注
商品
DBの正規化とは?
データを一定のルールに従って変形し、
利用しやすくすること
顧客コード
受注番号
商品コード
顧客名
受注日次
商品名
顧客住所
受注個数
商品単価
ERDの例
「IT用語辞典 e-Words」より
正規化で行う作業
データの重複、冗長性をなくす
部分的な従属性を取り除く
正規化の手順
実際のERD(部分)の例 ⇒
非正規形 → 第一正規形 → 第二正規形
→ 第三正規形 → 第四正規形 → 第五正規形
(ERD作成ツールのスクリーンショット)
出典:http://fabforce.net/dbdesigner4/screenshots.php
出典:農工大「Webコンピューティング実践特論」第7回資料
Copyright (C) Mitsubishi Research Institute, Inc.
13
ER図作成支援ソフトウェア(1)
DBDesigner 4
 特徴
 Linux、Windows XPで利用可能
 リバースエンジニアリング機能
 MySQL, Oracle, MSSQL等に対応
 DBから自動でER図を作成可能
 デザインモードとクエリーモード
 設計ツールとして利用(デザインモード)
 DB操作ツールとして利用(クエリーモード)
 ER図からSQLを自動作成可能
 ライセンス
 GPL
出典:http://www.fabforce.net/dbdesigner4/
 入手先
 http://www.fabforce.net/dbdesigner4/downloads.php
Copyright (C) Mitsubishi Research Institute, Inc.
14
ER図作成支援ソフトウェア(2)
WWW SQL Designer
 特徴




Webアプリケーション型のER図作成ツール
ブラウザで操作可能
ER図からSQLを自動作成しDBを作成可能
MySQLとSQLiteに対応
 カスタマイズで他のDBにも対応可能
 ライセンス
 修正BSDライセンス
 入手先
 http://code.google.com/p/wwwsqldesigner/
その他のツール
 db2dot
 dotファイルを作成、graphviz (dotty等)で描画
 AmaterasERD
WWW SQL Designer のデモ画面
 Eclipseのプラグインとして提供
出典:http://ondras.zarovi.cz/sql/demo/?keyword=default
Copyright (C) Mitsubishi Research Institute, Inc.
15
演習: WWW SQL Designer を使ってみよう
 各エンティティ(テーブル)の配置を動かすにはどうすればよいか
 各フィールドの色は何を意味しているのだろうか
 このツール、日本語は使えるか
 SQL文を自動生成するにはどのような手順で何をすればよいか
 説明した以外に何ができそうか
 いじってみてどう感じたか
Copyright (C) Mitsubishi Research Institute, Inc.
16
開発・プログラミングで利用するツール
Copyright (C) Mitsubishi Research Institute, Inc.
17
プログラミング支援ツール(1)
テキストエディタ
 ソースコードやその他のテキストファイルを編集
 vi, emacs, gedit, etc…
様々なテキストエディタ (左から、vi, emacs, gedit)
Copyright (C) Mitsubishi Research Institute, Inc.
18
プログラミング支援ツール(2)
プログラム解析ツール(静的コード解析ツール)
 プログラムのソースコードを解析して様々な問題点を検出する
 コーディングスタイルをチェックするタイプ
 リファクタリングやコードの整形をサポートするタイプ
 セキュリティ脆弱性やバグを検出して指摘するタイプ
Lint
C言語プログラムの文法やコーディングスタイルをチェックする
Splint (Secure
Programming Lint)
セキュリティ脆弱性やコーディングミスを検出する
CScout
ソースコード解析とリファクタリングをサポートするツール。複数のファイル
を跨った変数の名前変更等の機能でリファクタリングを支援する
PMD’s Copy/Paste
Detector
Java, JSP, C, C++等の言語を対象として、コピー・アンド・ペーストされた
コードを検出する
FindBugs
Javaプログラムのバグを検出する(文法以外のバグで、明らかに実行せず
とも分かるものを判別する)
Flawfinder
セキュリティ脆弱性を検出してそのリスクレベルとともに警告する
Cqual
型ベースで分析してプログラムのバグを検出する
Copyright (C) Mitsubishi Research Institute, Inc.
19
プログラミング支援ツール(3)
動的解析ツール
 プログラムを実行させて性能を解析したり問題解決を図る
 (デバッガも動的解析ツールの1つ?)
 代表的なツール… プロファイラ
 関数の実行時間や呼び出し回数といったデータを採取して分析する
 ボトルネックとなっているコードはどこかといったことが分かる
 その他、Linux (またはFreeBSD等のUnix系OS)には細かなツールが山ほど存在
gprof
GNU Binutilsに含まれる標準的なプロファイラ
OProfile
処理時間統計といったプロファイラの基本機能だけでなく様々な機能を備
えるプロファイリング・スイート
PerfSuite
最適化、ベンチマーク等に利用できるプロファイラ
JRat
Java Runtime Analysis Toolkit; Javaプログラムのプロファイラ
NProf
.NETアプリケーション向けのプロファイラ
memprof
メモリ利用状況を分析しメモリリークの不具合を検出する。GUIを備える
mpatrol
C言語向けメモリリーク検出ツール
strace
システムコールの呼び出し回数等の統計情報を取得する
Copyright (C) Mitsubishi Research Institute, Inc.
20
Pirka'r - 「良い道」 (Web作成支援ツール)
出典:http://pirkar.asikunep.org/
Copyright (C) 2009 Mitsubishi Research Institute.Inc.
21
Pirka'rの仕組み
Copyright (C) 2009 Mitsubishi Research Institute.Inc.
22
カバレージテスト
カバレージテストとは
 プログラム開発、システム開発にテスト工程は必須
 テストしないと品質を高めることはできない。バグだらけのソフトウェア、欠陥システム
 でも… 「どこまでテストすればOKなんだろう?」
 コードカバレージ
 プログラム内部のロジック(制御パス)をどのくらい網羅したテストか
 下のプログラム例でも、様々なケースが考えられる




argv[2]が空だったら? argv[1]も空だったら?
argv[1]またはargv[2]に「数字」以外の文字が入れられたら?
argv[1]またはargv[2]に「整数」以外の数字が入れられたら?
argv[1]またはargv[2]に並べられた「整数」がとてつもなく大きいもしくはとてつもなく小さい負の整数だったら?
(すなわちC言語で扱える範囲を超えていたら?)
 足し算の結果がオーバーフローしたら?
#include <stdio.h>
int main(int argc, char** argv)
{
int a = atoi(argv[1]);
int b = atoi(argv[2]));
printf (“%d + %d = %d¥n”, a, b, a+b);
return 0;
}
Copyright (C) Mitsubishi Research Institute, Inc.
23
テスト支援ツール
Selenium
 Firefoxの拡張として作成されたWebアプリケーション向けテストツール
 詳しくは説明用ビデオを参照(SeleniumHQ提供)
Jcoverage
 コードの何パーセントがテストされたかを分析する機能を持つテスト自動化ツール
 Eclipseのプラグインとして提供、JUnit (後述)環境と連携
gcov
 GNU gcc と組み合わせて使うコード・カバレージ分析ツール
 コマンドラインから gcov [options] sourcefile として起動
これらのツールを上手に組み合わせてテストの
効率化を行うことが重要
⇒ テスト工程の時間短縮、成果品質の向上
Copyright (C) Mitsubishi Research Institute, Inc.
24
単体テスト
単体テストとは
 プログラムの細かい単
位で行われるテスト
 V字モデルでは…
V字モデル
 詳細設計に対応
ウォーターフォールモデル
出所:「演習と実例で学ぶプロジェクトマネジメント入門」より引用のうえ改変
Copyright (C) Mitsubishi Research Institute, Inc.
25
単体テスト・ツール
FoobarUnit
 各種のプログラム言語に対応して単体テストを支援するツールが存在






JUnit … Javaプログラム向け単体テストツール
CUnit … Cプログラム向け単体テストツール
CppUnit … C++プログラム向け単体テストツール
PHPUnit … PHPプログラム向け単体テストツール
PyUnit … Pythonプログラム向け単体テストツール
RubyUnit … Rubyプログラム向け単体テストツール ⇒ Ruby1.8で標準ライブラリに統合
 FoobarUnitを利用するメリット
 単体テストを行うテストプログラムが規格化され分かりやすくなる
 いずれにせよ単体テストではそのモジュールが正しく動作しているかどうかのテストプログラムを数多く作成し
て実施、検証する必要がある
 一連の単体テストを自動的に行うことができる
 単体テスト結果を分析することが可能になる ⇒ カバレージテストツールとの連携
Copyright (C) Mitsubishi Research Institute, Inc.
26
単体テストの利用例(1)
「CUnitチュートリアル」(http://homepage3.nifty.com/kaku-chan/cunit/index.html)
からCUnitの利用例を引用
 対象プログラム(バブルソートのアルゴリズムを実装した単純なプログラム)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
: void sort(int array[], int num) {
:
int i;
:
int j;
:
int val;
:
:
for(i=0; i<(num-1); i++) {
:
for(j=(num-1); j>i; j--) {
:
if (array[j-1] > array[j]) {
:
val = array[j];
:
array[j] = array[j-1];
:
array[j-1] = val;
:
}
:
}
:
}
: }
 Cunitを使い、これにテストコードを追加してみる
 ※ 通常はテストコードのファイルは別に分けるが、説明のため同じファイルに記述する
Copyright (C) Mitsubishi Research Institute, Inc.
27
単体テストの利用例(2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
//=============================================================================
// ファイル : main.c
//=============================================================================
#include <CUnit/CUnit.h>
#include <CUnit/Console.h>
//----------------------------------------------------------------------------// プロトタイプ宣言
//----------------------------------------------------------------------------void sort(int array[], int num);
void test_sort_001(void);
void test_sort_002(void);
void test_sort_003(void);
void test_sort_004(void);
void test_sort_005(void);
//----------------------------------------------------------------------------// main() 関数
//----------------------------------------------------------------------------int main() {
CU_pSuite sort_suite;
CU_initialize_registry();
sort_suite = CU_add_suite("Sort", NULL, NULL);
CU_add_test(sort_suite, "test_001", test_sort_001);
CU_add_test(sort_suite, "test_002", test_sort_002);
CU_add_test(sort_suite, "test_003", test_sort_003);
CU_add_test(sort_suite, "test_004", test_sort_004);
CU_add_test(sort_suite, "test_005", test_sort_005);
CU_console_run_tests();
CU_cleanup_registry();
return(0);
CUnitのテスト
環境を設定、
テスト1~5を
登録し実行
}
//----------------------------------------------------------------------------// テスト対象のソート関数
//----------------------------------------------------------------------------void sort(int array[], int num) {
int i;
int j;
int val;
for(i=0; i<(num-1); i++) {
for(j=(num-1); j>i; j--) {
if (array[j-1] > array[j]) {
val = array[j];
array[j] = array[j-1];
array[j-1] = val;
}
}
}
テスト対象
}
//----------------------------------------------------------------------------// テスト関数1
//----------------------------------------------------------------------------void test_sort_001(void) {
int array[] = {3};
sort(array, 1);
CU_ASSERT(array[0] == 3);
テスト1
}
Copyright (C) Mitsubishi Research Institute, Inc.
28
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
:
//----------------------------------------------------------------------------// テスト関数2
//----------------------------------------------------------------------------void test_sort_002(void) {
int array[] = {11, 7, 5, 3, 2};
sort(array, 5);
CU_ASSERT(array[0]
CU_ASSERT(array[1]
CU_ASSERT(array[2]
CU_ASSERT(array[3]
CU_ASSERT(array[4]
==
==
==
==
==
2);
3);
5);
7);
11);
テスト2
}
//----------------------------------------------------------------------------// テスト関数3
//----------------------------------------------------------------------------void test_sort_003(void) {
int array[] = {7, 11, 3, 2, 5};
sort(array, 5);
CU_ASSERT(array[0]
CU_ASSERT(array[1]
CU_ASSERT(array[2]
CU_ASSERT(array[3]
CU_ASSERT(array[4]
==
==
==
==
==
2);
3);
5);
7);
11);
テスト3
}
//----------------------------------------------------------------------------// テスト関数4
//----------------------------------------------------------------------------void test_sort_004(void) {
int array[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};
sort(array, 10);
CU_ASSERT(array[0]
CU_ASSERT(array[1]
CU_ASSERT(array[2]
CU_ASSERT(array[3]
CU_ASSERT(array[4]
CU_ASSERT(array[5]
CU_ASSERT(array[6]
CU_ASSERT(array[7]
CU_ASSERT(array[8]
CU_ASSERT(array[9]
==
==
==
==
==
==
==
==
==
==
1);
2);
3);
4);
5);
6);
7);
8);
9);
10);
テスト4
}
//----------------------------------------------------------------------------// テスト関数5
//----------------------------------------------------------------------------void test_sort_005(void) {
int array[] = {2, 9, 3, 6, 10, 5, 8, 4, 1, 7};
sort(array, 10);
CU_ASSERT(array[0]
CU_ASSERT(array[1]
CU_ASSERT(array[2]
CU_ASSERT(array[3]
CU_ASSERT(array[4]
CU_ASSERT(array[5]
CU_ASSERT(array[6]
CU_ASSERT(array[7]
CU_ASSERT(array[8]
CU_ASSERT(array[9]
}
==
==
==
==
==
==
==
==
==
==
1);
2);
3);
4);
5);
6);
7);
8);
9);
10);
テスト5
CUnitの利用例
(実際にCUnitの使い方を示す)
ubuntuでCUnitを使うときの留意点
 libcunit1, libcunit1-dev の両パッケージが必要
 コンパイルは gcc sourcecode.c -lcunit でよい
 コンパイルしてできた実行形式を起動すると、テストメニューが現れる
 (参考「CUnitチュートリアル」)
Copyright (C) Mitsubishi Research Institute, Inc.
29
プロジェクト管理ツール
プロジェクト管理ツールの機能
 作業進捗状況の管理
 WBSの作成とメンテナンス
 TODOリストの作成、作業の割り当て管理
 成果品質の管理
 バグや問題点の登録と状況追跡、管理
Redmine
GanttProject
FreeMind
Copyright (C) Mitsubishi Research Institute, Inc.
30
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
31
オープンソース実践特論
第7回 統合開発環境を用いた開発手順
Copyright (C) Mitsubishi Research Institute, Inc.
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
2
統合開発環境を用いた開発手順
Copyright (C) Mitsubishi Research Institute, Inc.
3
開発プラットフォーム(再掲)
 開発に必要なツール
 エディタ
ソースコード編集
 vi, Emacs
エディタ
リソース管理ツール
バージョン管理ツール
GUI作成ツール
 コンパイラ
 gcc
 ビルド自動化
 make, autotools
 デバッガ
 gdb, ddd
デバッグ
プロファイリング
 プロファイラ
 gprof,
 リソース管理ツール
 バージョン管理ツール
デバッガ
プロファイラ
 RCS, CVS, Subversion, Git
 GUI作成ツール
コンパイル・ビルド
 glade
コンパイラ
ビルド自動化
Copyright (C) Mitsubishi Research Institute, Inc.
4
統合開発環境とは
 多くのツールをつかいこなすのは大変
 ひとつひとつ入手しないといけない
 使い方にそれぞれ癖がある
 GUIツールとCUIツールの混在
 統合開発環境
 ツールを統合
 操作性を統一
 GUIのため多くのユーザにとって使いやすい
 統合開発環境のメリット
 開発効率の向上
 開発者の負担軽減、大規模プログラミングの実現
Copyright (C) Mitsubishi Research Institute, Inc.
5
統合開発環境の特徴
Copyright (C) Mitsubishi Research Institute, Inc.
6
統合開発環境の機能
 対話型操作環境
 プロトタイピング(RAD)機能
 プロジェクト管理
 バージョン管理
 GUI作成支援
 チーム開発支援
 編集補助機能
 ビルド・デバッグ補助機能
Copyright (C) Mitsubishi Research Institute, Inc.
7
対話型操作環境
 IDEを利用しない場合
 IDEを利用する場合
 エディタ、デバッガ、プロファイラ、バージョン
管理ツールなどを切り替えて使用
 CUIのツールもある
Copyright (C) Mitsubishi Research Institute, Inc.
 すべての作業をひとつのウインドウ内で行え
る
 切り替えの手間が省ける一方、動作が重くな
りがち
8
プロトタイピング(RAD)機能
 GUI開発の実例(Widestudioの動画)
Copyright (C) Mitsubishi Research Institute, Inc.
9
プロジェクト管理
 プロジェクト
 IDEではアプリケーションに必要なすべての情報
を「プロジェクト」として管理
 ソースコード
 メッセージファイル
 GUIデザイン
 アイコン
 ドキュメント
 コンパイルに必要な情報
 IDEの設定など
Copyright (C) Mitsubishi Research Institute, Inc.
10
GUI作成支援機能
 ボタンやフォームなどの要素がドラッグ&ドロップで配置できる
 関連したソースコードも自動生成
ここだけ書けばOK!
ウィンドウの
作成・編集
イベント処理
の記述
(出典: WideStudio/MWT Home page http://www.widestudio.org/ に基づきMRIが編集)
Copyright (C) Mitsubishi Research Institute, Inc.
11
GUI作成支援機能
Copyright (C) Mitsubishi Research Institute, Inc.
12
チーム開発
 バージョン管理ツールを使いやすくするための機能




GUI
ヒストリの表示
リビジョンの可視化
など
Copyright (C) Mitsubishi Research Institute, Inc.
13
編集補助機能
関数の補完
自動インデント
ソースコードの色付け、等
Copyright (C) Mitsubishi Research Institute, Inc.
14
ビルド、デバッグ補助機能
 メニューから選択するだけ
 基本的な設定は済んでいる
 追加したライブラリ等は設定画面で
指定しておく
Copyright (C) Mitsubishi Research Institute, Inc.
15
IDEの利用例
Copyright (C) Mitsubishi Research Institute, Inc.
16
WideStudio利用例 - TSURU Develop
 大分県立鶴崎工業高等学校はTSURU
Developという統合開発環境を
WideStudioを利用して開発した
 同高校の佐藤先生がメーリングリストで
他のWideStudio利用者と相談 しながら
 C言語演習やマイコン制御等の授業で
利用しやすい統合開発環境(IDE)がな
かったため
 TSURU Developはエディタ機能、コンパ
イル、プログラム実行・転送機能を持っ
ている。
 「ターゲット」を変更することによって、複
数のマイコンに対応することができる
(出典: Open School Platform (OSP) Portal 統合開発環境TSURU Developの開発
<http://e2e.cec.or.jp/osp/modules/xfsection/article.php?articleid=74&page=0>)
Copyright (C) Shimane
MitsubishiUniversity
Research&Institute,
Mitsubishi
Inc.Research Institute, Inc.
17
実習環境の準備
 WideStudioのダウンロードをしておく
 今回の演習はWindows環境で。
 http://prdownloads.sourceforge.net/widestudio/wswin398-3a.zip
 昼休みから戻ってきたら
 Zipファイルを展開して、中のsetupj.exeを実行
 Ruby, Perl, Pythonはインストールしない
 終わったら再起動しておく
Copyright (C) Mitsubishi Research Institute, Inc.
18
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
19
オープンソース実践特論
第8回 オープンソース統合開発環境の種類と特徴
Copyright (C) Mitsubishi Research Institute, Inc.
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
2
ActiveBasic
Copyright (C) Mitsubishi Research Institute, Inc.
3
BASICとは
 手続き型言語
 初期は構造化されておらず、行番号とGOTO文が用いられた
 現在はオブジェクト指向に拡張したものもある
 1964年にコンピュータ言語の教育用に開発された
 初心者向けとされている
10
20
30
40
50
 予約語は大文字・小文字を問わない
 ポインタがない、など
 多数の方言がある
 異なる処理系では動かないことが多い
INPUT“Input radius.";RADIUS
INPUT“Input angle";ANGLE
AREA=RADIUS*RADIUS*3.14*ANGLE/360
PRINT“Area: ";AREA
END
BASICの例
 近年はGUIアプリケーションを簡易に開発する言語やマクロ用の言語として利用
 Visual Basic、VBA、OpenOffice.org BASICなど
Copyright (C) Mitsubishi Research Institute, Inc.
4
ActiveBasicの歴史と特徴
 1999年から山本大祐氏が個人で開発
 現在はバージョン5.0
 Windows上で動作
 無料だがオープンソースではない!
 従来のBASICとの比較







C言語やJavaの影響を受けて機能追加されている
ネイティブコンパイラ
オブジェクト指向に対応
ポインタのサポート
ガーベジコレクション機能
例外処理
数値計算、文字列処理などのクラスライブラリ
Copyright (C) Mitsubishi Research Institute, Inc.
5
サンプルコードとその動作
#console
Print "Hello, world"
Copyright (C) Mitsubishi Research Institute, Inc.
6
ActiveBasicによる開発
開発環境の設定
コンパイルと実行
デバッグ
Copyright (C) Mitsubishi Research Institute, Inc.
7
ActiveBasicによる開発 RADツール
Copyright (C) Mitsubishi Research Institute, Inc.
8
Eclipse
Copyright (C) Mitsubishi Research Institute, Inc.
9
Eclipseの歴史
 1990年代に開発されたIBMのVisualAgeが前身
 2001年、IBMはEclipseをオープンソース化
 2004年、Eclipse Foundationを設立し、IBMの手を離れる
 多くの企業・コミュニティが開発に参加するようになった
 IBMがオープンソース化した理由
 開発ツールをビジネスにすることも可能
 MicrosoftやBorland(現エンバカデロ)
 実際、Eclipseをベースに開発したRational Application Developerを販売
 それよりも開発ツールを普及させることを重視
 開発ツールには「慣れ」が必要
 EclipseやRationalに慣れた開発者が増えればIBMのビジネスも増えるはず
Copyright (C) Mitsubishi Research Institute, Inc.
10
Eclipseの対応言語
 当初はJava用に開発
 現在は他の言語でも利用可能




C/C++言語:
PHP:
Perl:
Python:
CDT(C/C++ Development Tools)プラグイン
PDT(PHP Development Tools)プラグイン
EPIC(Eclipse Perl Integration)プラグイン
PyDevプラグイン
Copyright (C) Mitsubishi Research Institute, Inc.
11
Javaの特徴
 オブジェクト指向言語
 C / C++ に似た構文で覚えやすい
 VM (Virtual Machine)を用いたマルチプラットフォーム対応
 “Write once, run anywhere”
 (実際はなかなかうまくいかないのだけれども…)
 豊富なクラスライブラリ
 ネットワーク、セキュリティ、国際化、データベース、並列・分散プログラミング、etc
 ガベージコレクション機能
 その他、様々なJava関連プロジェクト
 プログラミング界における一大勢力に
Javaのマスコット、Duke
(出典:Wikimedia)
Copyright (C) Mitsubishi Research Institute, Inc.
12
サンプルコードとその動作
// Hello.java
import javax.swing.*;
public class Hello extends JFrame {
Hello() {
setDefaultCloseOperation(
WindowConstants.DISPOSE_ON_CLOSE);
add(new JLabel("Hello, world!"));
pack();
}
public static void main(String[] args) {
new Hello().setVisible(true);
}
}
// Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("Hello, world!");
}
}
Copyright (C) Mitsubishi Research Institute, Inc.
13
Javaシステムの構成
 システムの種類
 アプレットとサーブレット
 アプレット
 Java EE (Enterprise Edition)
 多層C/Sシステム向け
①リクエスト
 Java SE (Standard Edition)
②プログラムを
ダウンロード
 標準バージョン
<applet>
:
:
<…>
 Java ME (Micro Edition)
③ブラウザ内で実行
 組込み用途
 サーブレット
 プログラムの形態
 コマンドラインプログラム
 GUIアプリケーション
①リクエスト
②サーバ側で
呼び出し
 AWTアプリケーション
 Swingアプリケーション
 アプレット
 サーブレット
Copyright (C) Mitsubishi Research Institute, Inc.
<servlett>
:
:
<…>
③結果を返送
14
Eclipseの機能と特徴
 Javaで開発
 Windows、Mac、Linuxなどで動作
 一般的なIDEが備えている機能は一通り網羅
 デバッガ
 バージョン管理ツールとの連携など
 拡張性の高いプラグイン機能
 Eclipseは「プラットフォーム」であり、プラグインの追加でさまざまな機能の追加、言語へ
の対応が可能
 C/C++、PHP、Perl、C#、D言語、TeX、Python、Ruby、JavaScript、COBOL、AspectJなど
 機能・プラグインが多いことによる弊害
 学習や慣れが必要
 動作(とくに起動速度)が遅い
 どのプラグインを使えばいいのかわからない
 目的別のパッケージが用意されている
Copyright (C) Mitsubishi Research Institute, Inc.
15
Eclipseによる開発
 自分にあったパッケージのダウンロードとインストール
 日本語化
Eclipseのパッケージ(一例)
Copyright (C) Mitsubishi Research Institute, Inc.
16
出典:http://www.eclipse.org/downloads/
WideStudio
Copyright (C) Mitsubishi Research Institute, Inc.
17
WideStudioとは
 GUIアプリケーションを構築するための統合開発環境
 日本の平林俊一氏が開発
 日本OSS貢献者賞受賞、IPA スーパークリエータ認定
 特徴
 オープンソース(無料で自由に使える)
 C、C++言語用
 さまざまなプラットフォーム向けのGUIアプリケーションが開発できる
 Linux, Windows, MacOSX, 組込機器向けをコンパイルしなおすだけでOK
 ドラッグ&ドロップでボタン類の配置ができる
 イベント駆動方式(GUIアプリケーションでは一般的)
Copyright (C) Shimane
MitsubishiUniversity
Research&Institute,
Mitsubishi
Inc.Research Institute, Inc.
18
WideStudioとは – 画面
インスペクタ
アプリケーションの
構造を確認
インスタンスエディタ
アプリケーションの
レイアウト決定
ドラッグ&
ドロップで
アプリケーション
に追加
ログなどを出力
Copyright (C) Shimane
MitsubishiUniversity
Research&Institute,
Mitsubishi
Inc.Research Institute, Inc.
19
WideStudioとは
ウィンドウの属性
を設定する
ウィンドウアトリビュートエディタ
表示の状態や形状
を数値で設定
タブで切り替え
プロパティエディタ
ボタンなどの
イベントと処理を
関連づける
Copyright (C) Shimane
MitsubishiUniversity
Research&Institute,
Mitsubishi
Inc.Research Institute, Inc.
20
イベントプロシージャエディタ
WideStudioでの開発の流れ
(出典: WideStudio/MWT Home page http://www.widestudio.org/ に基づきMRIが編集)
ここだけ書けばOK!
ウィンドウの
作成・編集
イベント処理
の記述
プロジェクト
WideStudio
コンパイル・
ビルド
編集・作成
Copyright (C) Shimane
MitsubishiUniversity
Research&Institute,
Mitsubishi
Inc.Research Institute, Inc.
アプリケーション
21
Linux, Windows, MacOS X,、組み込みOSで動作する
演習
 WideStudioを使ってみよう
 Hello worldを表示するプログラム
Copyright (C) Mitsubishi Research Institute, Inc.
22
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
23
オープンソース実践特論
第9回 Linux開発環境におけるソフトウェア開発
Copyright (C) Mitsubishi Research Institute, Inc.
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
2
ソフトウェアのビルド処理とライブラリの利用
Copyright (C) Mitsubishi Research Institute, Inc.
3
プログラムの分割(Cプログラムの例)
ファイルを分割することのメリットの例
 プログラムを変更した場合には、該当するファイルだけをコンパイルし直せばよく効率がよい。
 関数や宣言を共有することができるので便利。
規模の大きなプログラムを開発する時には欠かすことの出来ない手法
my_main.c
#include<stdio.h>
a_program.c
#include<stdio.h>
struct POINT {
分割してみると・・・
struct POINT {
double x,y; };
double x,y;
void get_point(struct POINT *a);
};
int main() {
void get_point(struct POINT *a);
struct POINT p;
int main() {
get_point(&p);
struct POINT p;
printf("%f %f¥n", p.x, p.y);
get_point(&p);
return 0;
printf("%f %f¥n", p.x, p.y);
}
return 0;
my_func.c
}
void get_point(struct POINT *p) {
void get_point(struct POINT *p) {
p->x = 3; p->y = 5;
p->x = 3; p->y = 5;
return;
return;
}
}
Copyright (C) Mitsubishi Research Institute, Inc.
4
ただし、このままだとまだコンパイルできない。
C言語プログラムのコンパイル(手作業による分割コンパイル)
C言語プログラムファイルから、オブジェクト形式のファイルを作成
次を実行
% gcc my_main.c -c
% gcc my_func.c -c
コンパイルオプション「-c」は、指定したファイルをコンパイルするという意味
その結果、拡張子が「.o」のオブジェクトファイルが得られる。
次のコマンドを実行すると、指定したオブジェクトファイルを結合し、更に必要なライブラリを自動的にリン
クし、実行ファイル a.out を生成する(ライブラリの意味は次で説明)。
% gcc my_main.o my_func.o
プログラム
ファイル
コンパイル
***.c
オブジェクト
ファイル
ライブラリのリンク
***.out
***.o
一気にやることもできる
Copyright (C) Mitsubishi Research Institute, Inc.
実行ファイル
5
ライブラリの利用
ソフトウェア部品
 成果の部品化
 成果の資産化
ソフトウェア部品とは?
 ソフトウェアの「部分」を部品化して使いまわす
 システムやソフトウェア構築の作業効率を上げることが目的
OSSやフリーソフトウェアではこれまでの莫大な資産を活用できる
 以下のコマンドを試してみよう
$ ls /lib
…
$ ls /usr/lib
…
※ ライブラリはC言語に限らず様々な言語で存在
ネットワークで集積されているケースもある
Copyright (C) Mitsubishi Research Institute, Inc.
6
ライブラリ
ヘッダファイルにおいては関数の型宣言やマクロの定義などを行うが、関数の本体部分が記述されていない。
これはライブラリという形で用意されており、/usr/lib ディレクトリに格納されている。
% cd /usr/lib
% ls -la lib*.a | more
ここにはいくつかの種類のライブラリが用意されているが、今回は拡張子が
「.a」のものについて説明する。
ライブラリの名称は、先頭に「lib」という文字列を付加し、拡張子に「.a」を用いるようになっている。
ここで「math.h」を用いたプログラムをコンパイルするときは、コンパイルオプションに次を加える。
% gcc sample.c -lm
「-l」:次に続く文字列で、組み込むライブラリの名称を指定する。
「m」:ライブラリの名称
※ライブラリは既にコンパイル済みの形式で用意されているので、リンク時にいちいちコンパイルする手間がかからない。
ライブラリの中身を覗いてみる。
このファイルはテキストエディタでオープンしても中身を確認することはできず、コマンド ar を使用する
(/usr/lib において、次のコマンドを実行する)。
% ar -t libm.a | more
表示された結果より、このライブラリには算術演算用の関数に関連したオブジェクトファイルが格納されていることが確認できる。
Copyright (C) Mitsubishi Research Institute, Inc.
7
プログラムの配布
バイナリ形式(実行形式)で配布
プログラムをどうやって配布するか
 バイナリ形式で配布
 ソースコードで配布
 コンパイルせずすぐに利用できる
 ある程度、想定された環境でしか利用できない
ソースコードで配布
それぞれのメリット・デメリット ⇒
 利用する前にコンパイルが必要
 環境の違いを吸収でき、柔軟に対応できる
ソースコードで配布されたプログラムのビルド
 手順のイメージ
配布対象
ライブラリ
コンパイル
リンク
ソースコード
Copyright (C) Mitsubishi Research Institute, Inc.
オブジェクトファイル
8
実行形式プログラム
ビルドの自動化と移植性
Copyright (C) Mitsubishi Research Institute, Inc.
9
makeコマンド
分割したプログラムから実行形式のファイルを効率よく作るための方法について説明する。
手動でコンパイルするのは手間がかかるのでこれを自動化する。
そのためには make というコマンドを使用
Makefile
a.out: my_main.o my_func.o
makefileの仕組みって?
gcc my_main.o my_func.o
my_main2.o: my_main.c my_header.h
gcc my_main.c –c
依存ファイル
ターゲット
my_func.o: my_func.c my_header.h
gcc my_header.c -c
a.out: my_main.o my_func.o
gcc my_main.o my_func.o
TAB分スペース
% make
コマンド行
を実行
※依存ファイルから、ターゲットが作られる。
※依存ファイルが変更されたら、ターゲットも更新され
る。
※依存関係を記述することにより、必要なコンパイル
のみを行うことが出来る。
実行形式ファイル a.out が出来れば成功!
Copyright (C) Mitsubishi Research Institute, Inc.
10
Makefileの例
makefile の名前は
変えられないのか?
「Makefile」以外のファイル名を利用するには make コマンドの
-f オプションで指定
% make –f hogehoge
(でも、分かりやすくするために出来るだけ Makefile を使う。)
hogehoge
a.out: my_main.o my_func.o
gcc my_main.o my_func.o
my_main.o: my_main.c my_header.h
gcc my_main.c –c
my_func.o: my_func.c my_header.h
gcc my_header.c -c
「clean」を設定し、余分なファイルを消去する機能
を追加した。
(※ rm と * を同時に使うときは要注意!!)
行末の「¥」は改行を無視するコマンド。ターゲットファ
イルの記述が長くなる場合には、このように複数行
にわたって記述する。
clean:
rm -f ./*~
Makefile2
rm -f ./*.o
rm -f ./a.out
a.out: my_main.o my_func.o
gcc my_main.o my_func.o
my_main.o: ./src/my_main.c ¥ ./src/my_header.h
gcc ./src/my_main.c -c
my_func.o: /home-cs/tte309u/work/lip2/d11/src/my_func.c ¥
異なるディレクトリにあ
るソースを使えるか?
/home-cs/tte309u/work/lip2/d11/src/my_header.h
ファイルへのパスを適切に指定すること
により、Makefile と異なるディレクトリ
にあるソースファイルを利用できる。
gcc /home-cs/tte309u/work/lip2/d11/src/my_func.c -c
clean: rm -f ./*~
rm -f ./*.o
rm -f ./a.out
Copyright (C) Mitsubishi Research Institute, Inc.
11
Makeの問題点
ソフトウェアの依存関係に関する情報は、場合によって違う
a.out: my_main.o my_func.o
gcc my_main.o my_func.o
my_main.o: ./src/my_main.c ¥ ./src/my_header.h
gcc ./src/my_main.c -c
my_func.o: /home-cs/tte309u/work/lip2/d11/src/my_func.c ¥
/home-cs/tte309u/work/lip2/d11/src/my_header.h
gcc /home-cs/tte309u/work/lip2/d11/src/my_func.c -c
clean: rm -f ./*~
ライブラリやソースコードへの
パスはケースバイケース
rm -f ./*.o
rm -f ./a.out
これが問題になるケース
 ソフトウェアを配布しようとするとき
 自分の環境が変わってしまったとき
 システムのメンテナンスで自分の環境も変わり得ることに注意
 ライブラリがアップデートされた、システムの構成が変更された、新しいH/Wを導入した、
etc…
Copyright (C) Mitsubishi Research Institute, Inc.
12
プログラムの配布(再掲)
バイナリ形式(実行形式)で配布
プログラムをどうやって配布するか
 バイナリ形式で配布
 ソースコードで配布
 コンパイルせずすぐに利用できる
 ある程度、想定された環境でしか利用できない
ソースコードで配布
それぞれのメリット・デメリット ⇒
 利用する前にコンパイルが必要
 環境の違いを吸収でき、柔軟に対応できる
ソースコードで配布されたプログラムのビルド
 手順のイメージ
配布対象
ライブラリ
コンパイル
リンク
ソースコード
Copyright (C) Mitsubishi Research Institute, Inc.
オブジェクトファイル
13
実行形式プログラム
環境によって違うライブラリ構成
何が異なるか
 バージョン(使える関数の差、パラメータの違い)
 置き場所の違い
 有り・無し
ライブラリ
ライブラリ
ライブラリ
配布対象
コンパイル
リンク
ソースコード
Copyright (C) Mitsubishi Research Institute, Inc.
オブジェクトファイル
14
実行形式プログラム
環境の差を吸収する例(別の環境へ移植する作業の例)
getopt() … コマンドラインオプションを解析する関数
配布パッケージ
#include “getopt.h”
int
main() {
…
getopt (argc, argv);
…
libgetopt.a
}
getopt() が存在しない環境
void
getopt(int argc,
char** argv) {
…
libgetopt.a
}
getopt.o
Copyright (C) Mitsubishi Research Institute, Inc.
ビルド方法の調整も必要
15
Makeの問題点を解決し移植性を高めるツールの導入
移植性を確保するためのAutotoolset
Copyright (C) Mitsubishi Research Institute, Inc.
16
Autotoolset
Autotoolsetとは…
 makeによるビルドの自動化をさらに一歩進めるためのツール
 部品の依存関係(どこに置かれているか、どのバージョンが用いられているか、な
ど)を自動的に解消
 ややこしいMakefileの記述、それを簡単に書けるようにすることも目的の1つ
 それを実現するための一連のツール(autoconfやautomake)をAutotoolsetという
どうやってそれを実現するか?
 configureスクリプトでMakefileを自動生成
 Makefile中に記載されたパラメータを変更
 ライブラリの位置
 マクロ定義によるプログラム機能のスイッチ
※ Autotoolsを使うと何がうれしいのか?
http://alohakun.blog7.fc2.com/blog-entry-379.html
Copyright (C) Mitsubishi Research Institute, Inc.
17
マクロ定義によるスイッチの例
#ifdef LINUX
#include “linux.h”
#else
#ifdef WINDOWS
#include “windows.h”
#endif
#endif
configureスクリプトの意義と概要
configureスクリプト
 各プラットフォーム、環境の違いを吸収してビルドできるようにする
 どんな環境でも動作するように、通常はシェルスクリプトとして提供される
 Windowsの場合は、バッチファイル
 動作の概要
配布物
configureスクリプト
ソースコード
ドキュメント
サンプルデータ
etc …
環境A
configure の実行
↓
環境A用のMakefile生成
make の実行
↓
環境Aの実行ファイル生成
環境B
configure の実行
↓
環境B用のMakefile生成
make の実行
↓
環境Bの実行ファイル生成
環境C
configure の実行
↓
環境C用のMakefile生成
Copyright (C) Mitsubishi Research Institute, Inc.
18
make の実行
↓
環境Cの実行ファイル生成
configureスクリプトが実際に行うこと
configureの処理
 ツール、コマンドの利用可能性を調べる
 ライブラリの利用可能性を調べる
 実際にテストプログラムをコンパイルしてみて、エラーが起こるかどうかを検証して判断
 判断結果からマクロの値を定義
 マクロの利用例
 Makefileの内部で変数として利用
 ソースコード定義のオプションスイッチとして利用
テストしてLinuxだと分かったら
マクロLINUXをセットする
その結果こちらが有効になる
#ifdef LINUX
#include “linux.h”
#else
#ifdef FREEBSD
#include “freebsd.h”
#endif
#endif
テストしてFreeBSDだと分かったら
マクロFREEBSDをセットする
その結果こちらが有効になる
Copyright (C) Mitsubishi Research Institute, Inc.
マクロ定義によるスイッチ
19
configure; make; make install
 ソースコードを入手してコンピュータにインストールするまでの手順
1 ソースコードパッケージを展開
 tar xzvf a_package_X_Y_Z.tgz; cd a_package_X_Y_Z
2 ビルド環境を調整
 ./configure
3 作成されたMakefileに従ってビルドを実行
 make
4 システムにインストール
 sudo make install
 ※ システムへのインストールは sudo で実行、もしくは root になって管理者権限
で実行する必要がある
Copyright (C) Mitsubishi Research Institute, Inc.
20
configureの実行例とログの見方
ここでエラー発生
Copyright (C) Mitsubishi Research Institute, Inc.
21
エラーへの対処
エラーになったらどうすればよいか
 依存関係のあるライブラリを先にインストールする
 最近はバイナリパッケージで導入できるので、楽
 パッケージがないときは、自分で導入
 それでもエラーになるときは…
 ソースコードレベルで対処が必要になる場合もある(先に示した例)
 この場合は多少の苦労、試行錯誤が必要
 OSSだからこそ、可能性が残る
Copyright (C) Mitsubishi Research Institute, Inc.
22
Autotoolsetを用いた移植性の高いパッケージング
Copyright (C) Mitsubishi Research Institute, Inc.
23
AutoconfとAutomake
Autotoolsetを構成するツール群
configure
各環境に合わせてビルド環境を調整するためのツール
autoconf
configureを作成するためのツール
automake
Makefileを簡単に作成するためのツール
libtool
様々な環境に合わせたライブラリを作成するためのツール
※ライブラリの動作方法は環境ごとに異なる場合が多い
その他、様々なコマンドがAutotoolsetには含まれる
aclocal … autoconfで利用するマクロ集 aclocal.m4 を作成する
autoheader … 調整用ヘッダファイルの元を作成する
acmkdir … パッケージのサブディレクトリを整備する
gpl … GPL関連のファイルを整備する
など
Copyright (C) Mitsubishi Research Institute, Inc.
24
Autotoolsetを使ったプログラム作成の流れ
aclocal
← ソフトウェアの開発者側で
用意する部分
autoconf
configure.sc
aclocal.m4
autoheader
configure
ソースコード
config.h.in
configure
make
automake
Makefile.am
config.h
Makefile.in
Makefile
実行形式
Copyright (C) Mitsubishi Research Institute, Inc.
25
Autotoolsetを使ったパッケージを作成してみよう(1)
題材はHello World
ステップ1
 次のプログラムをコンパイル、実行せよ
 gcc hello.c -o hello
#include <stdio.h>
main ()
{
printf(”Howdy world!¥n”);
}
 これをAutotoolsetを使って拡張
 移植性の高いプログラムにする
Copyright (C) Mitsubishi Research Institute, Inc.
26
Autotoolsetを使ったパッケージを作成してみよう(2)
ステップ2
 Makefile.am, configure.in を用意
 Makefile.am
bin_PROGRAMS = hello
hello_SOURCES = hello.c
 configure.in
AC_INIT(hello.c)
AM_INIT_AUTOMAKE(hello,0.1)
AC_PROG_CC
AC_PROG_INSTALL
AC_OUTPUT(Makefile)
Copyright (C) Mitsubishi Research Institute, Inc.
27
Autotoolsetを使ったパッケージを作成してみよう(3)
ステップ3
 Autotoolsetの各コマンドを起動
$ aclocal
$ autoconf
$ automake -a
 結果は?
$ automake -a
required file
required file
required file
required file
required file
required file
required file
required file
required file
Copyright (C) Mitsubishi Research Institute, Inc.
無いよ
無いよ
無いよ
"./install-sh" not found; installing
"./mkinstalldirs" not found; installing
"./missing" not found; installing
"./INSTALL" not found; installing
"./NEWS" not found
"./README" not found
"./COPYING" not found; installing
"./AUTHORS" not found
"./ChangeLog" not found
28
Autotoolsetを使ったパッケージを作成してみよう(4)
ステップ4
 必要なファイルを補充
 とりあえず中身だけ
 ※ touch は、空のファイルを作成するコマンド
$ touch NEWS README AUTHORS ChangeLog
 再チャレンジ
$ automake
$ ./configure
…
$ make
…
$ ./hello
Howdy, World!
Copyright (C) Mitsubishi Research Institute, Inc.
29
Autotoolsetを使ったパッケージを作成してみよう(おまけ)
余裕があったら次も試してみよう
make clean
実行形式や作業ファイルを削除(ゴミを削除)
make distclean
ゴミを削除
問1: make clean と何が違うだろうか?
make maintainer-clean
ゴミを削除
問2: 上の二つ と何が違うだろうか?
make dist
配布パッケージを作ってみよう
さらにその配布パッケージを別のディレクトリで展開
ビルドしてみよう
Copyright (C) Mitsubishi Research Institute, Inc.
30
参考:CMakeを使う
【使い方手順】
① CMakeList.txt ファイルにコンパイルしたいプログラムの情報を入力する。
② cmake. (最後の“.”を忘れないこと)処理
③ make 処理
hello.c
#include <stdio.h>
CMakeList.txtは以下の1行だけでよい
int main(void)
ADD_EXECUTABLE(hello hello.c)
{
printf("Hello, World.¥n");
これをhello.cと同じディレクトリに置く。
return(0);
}
Unixの場合はMakefileが生成される。
cmake.
Copyright (C) Mitsubishi Research Institute, Inc.
Windowsの場合は、hello.slnが生成される。
31
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
32
オープンソース実践特論
第10回ソフトウェア開発ツールの評価
Copyright (C) Mitsubishi Research Institute, Inc.
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
2
開発ツールの評価
Copyright (C) Mitsubishi Research Institute, Inc.
3
評価の位置づけと目的
開発ツール導入時の、ツール選択方法と評価の意義
 評価を行うべきシチュエーションとその理由
開発の生産性を上げるために、新しい開発
ツールを導入したい
新しい技術のキャッチアップ
流行のフォロー
 生産性向上のレバレッジ効果
 例:大企業
 開発技術、ツールも日々進化する
 常に新しい情報を押さえておくべき
開発者多数 × 効率化 = 莫大な時間の削減
インターネットで協働して開発されるOSS
開発者の間でツールの共有が求められる
 自分にとって使いやすいツールとは
 協調作業がしやすいツールとは
 関係者間における開発技術の共有
Copyright (C) Mitsubishi Research Institute, Inc.
4
評価に関する作業内容 … コストの算出
コストの算出方法
 コストとは




金銭的費用
時間的負荷
担当者や関係者の負担
その他、様々な要素を考える
コスト要因
様々な局面で発生するコスト
 導入コスト
OSSであれば
基本的には不要だが…
 ソフトウェアのライセンス費用
 導入作業にかかる費用
 ハードウェアの新規購入、等
 教育コスト
 新しいツールの使い方に関する教育
 慣れるまでの(一時的な)生産性低下、開発者の精神的負担
Copyright (C) Mitsubishi Research Institute, Inc.
5
(補足)導入教育の重要性
Copyright (C) Mitsubishi Research Institute, Inc.
6
評価に関する作業内容 … 導入のメリットデメリット
導入のメリットとデメリット
 開発ツールを導入する際のメリットとデメリットを考えてみよう
メリット
開発効率を向上させることができる
デメリット
ツール活用の教育コストがかかる
新しい技術に対応できる
ツールを受け入れる体制が求められる
開発コストを下げることができる
効果がすぐには現れないこともある
成果物の品質を高めることができる
維持のコストがかかる場合がある
メリット
デメリット
新たな開発ツールを導入するメリットとデメリット
OSSであれば大丈夫…?
Copyright (C) Mitsubishi Research Institute, Inc.
7
実施タイミング
 評価のタイミング
1. 導入前の見積り
2. 導入後の効果測定
 導入前の見積りに関する課題
 きちんとした見積りは実現可能かどうか?
 見積りは… 難しい
 経験に頼る… 「開発ツールの導入」機会はそう何回もあるものでもない
見積りの難しさについては、
関連書籍を参照 ⇒
Copyright (C) Mitsubishi Research Institute, Inc.
8
実施タイミング(続き)
 評価のタイミング
1. 導入前の見積り
2. 導入後の効果測定
 導入後の効果測定に関する課題
 効果測定した結果をどのように活用すべきか
 次回の導入にフィードバックする? ⇒ そうそう機会があるわけではない
 定期的な効果測定により、効率向上の定量的な指標を作成 ⇒ 開発者のモチベー
ション向上
 「開発ツール」開発者に効果をフィードバック ← OSSならではの活用法
Copyright (C) Mitsubishi Research Institute, Inc.
9
開発ツールの評価項目
Copyright (C) Mitsubishi Research Institute, Inc.
10
開発ツールの何を評価すればよいのか
相互運用性、
互換性
デバッグ効率
操作性、操作の
習得しやすさ
移行性、
移行コスト
開発ツールの
評価項目
機能性
購入・保守費用
Copyright (C) Mitsubishi Research Institute, Inc.
第三者による
評価、評判
11
開発ツールの操作性とユーザビリティ
User
eXperience
UX
ユーザビリティ
機能の提供
(写真提供:FreeFoto.com, 写真素材 足成)
開発者の満足度
= 開発効率の向上?
Copyright (C) Mitsubishi Research Institute, Inc.
12
操作性と、操作習得のコスト
操作性の評価
 操作性が悪いと…
作業効率が低下
 あることを実現するために多数の手数がかかる
 何べんも同じミスを繰り返す
品質が低下
 十分にテストできず、バグが紛れ込む可能性が高くなる
 開発者のやる気も低下、士気が下がる
 操作性は、どうやって評価すればよいだろうか?(考えてみよう)
開発ツールの操作性に関する評価のポイント
開発者が操作するユーザインタフェースの良し悪しを評価
開発ツールの常識とかけ離れていないかどうか
マニュアルやヘルプを見なくても操作できるかどうか
情報は見やすく表示されているかどうか
ミスを防ぐ仕組みや手戻りできる仕組みが用意されているかどうか
Copyright (C) Mitsubishi Research Institute, Inc.
13
(参考)情報システムのユーザビリティ評価ツール UxDux
ルールセットの内容と項目数
分類
内容
項目数
データ入力のしやすさ
ヘルプが無くても作業を進めることが
できるか、不要なダイアログはないか、
等
17
情報へのアクセス性、みつ
けやすさ
情報の把握しやすさ、わか
りやすさ
反応のよさ、動作のわかり
やすさ
エラーへの対処、 セキュリ
ティ
処理状況がわかるか、検索できるか、
適切なリンクがあるか、等
デザイン・文字の大きさは適切か、文
章が長すぎないか、等
動作速度は高速か、新しいウィンドウ
を次々に開いたりしないか、等
エラー表示がわかりやすいか、 不正
使用が行われない工夫があるか、等
20
アクセシビリティ
コンテンツは標準に準拠しているか、
色・形だけで情報を伝えていないか、
等
9
イントラ内の個別情報
会社情報へのアクセス手段は適切か、
社員を検索する手段が用意されてい
るか、等
20
10
7
14
作成:三菱総合研究所
ルールセット(抜粋)
Copyright (C) Mitsubishi Research Institute, Inc.
14
(参考)UxDux の診断結果
 ユーザビリティ評価の結果は、カテゴリごとの傾向と具体的な所見という形で示す
ユーザビリティ評価のアウトプット例 (カテゴリごとの傾向)
Copyright (C) Mitsubishi Research Institute, Inc.
15
出典:三菱総合研究所
操作性と、操作習得のコスト(続き)
(参考)オープンソースの
教育ビジネスの事例
操作方法習得コストの評価
 操作方法の習得にもコストがかかる
 簡単に操作方法を習得できるか
 教育に高いコストがかかることはないか
前提となる開発技法習得の必要性
 そのツールが特定の開発技法を前提としていないか?
開発環境やフレーム
ワーク等をOSSで提供
 操作方法の教育や活用
に関する教育で対価を
得る
 認定試験を実施し、認
定料を得る、など
 オブジェクト指向開発
 データベース、ネットワーク、等の特定ドメインに特化した開発技法
 他ツールの利用
 例: Android SDKは、Eclipse も利用可能 (ADT, Android Development Tools Plugin)
 開発スタイルによる違い
 アジャイル開発
 (古き良き)ウォーターフォール開発、etc…
 開発ツールだけでなく、言語環境、開発フレームワーク等にも依存
Copyright (C) Mitsubishi Research Institute, Inc.
16
移行性、移行コスト
移行性とは?
新しい開発ツールの導入 =
これまでの開発環境から、
新しい開発環境に
移行
移行性 … 簡単に移行できるかどうか
移行コスト … 移行にかかるコスト
Copyright (C) Mitsubishi Research Institute, Inc.
17
機能性
必要な機能が備わっているか
 特殊な環境に対する開発ツール(例、iPhone SDKに含まれる開発ツール)
Xocde
プロジェクト管理、ソースコードエディタ、デバッガ等を含む統合
開発環境
iPhone Simulator
Mac OS X上で動作するiPhone自体のシミュレータ。開発中のプ
ログラムがどのように動くかを検証するために利用
Instruments
開発中のiPhoneアプリケーションに関するプロファイラ
Interface Builder
ドラッグ・アンド・ドロップによりGUIを簡単に構築するためのデザ
イン・ツール
※ 組み込み機器の開発ツールには、機能性の検証が不可欠
Copyright (C) Mitsubishi Research Institute, Inc.
18
★iPhoneアプリの開発環境
Copyright (C) Mitsubishi Research Institute, Inc.
19
購入および保守の費用
購入、保守の留意点
 購入の費用は無料(フリーソフトのフリーは「無料」のフリー、ではないことに注意)
 では保守は?
 システム、ソフトウェアの保守… メンテナンスは不可欠
 何をしなければならないか、何に費用がかかるか?(考えてみよう)
OSSサポートのコスト
 サポート… 長期間、導入した開発ツールを使い続けるためにはとても重要
 ポイント
 誰がサポートするのか
 技術を理解している人間が身内に居るかどうか
 開発が途切れてしまうことはないか、etc.
Copyright (C) Mitsubishi Research Institute, Inc.
20
デバッグ効率
デバッグの効率が開発の質と速度を左右する
開発速度、開発成果の品質
統合開発
環境の活用
デバッガの
利用
デバッグ
プリント
 大規模開発
 インターネッ
 開発プロセ トの利用  オープンソース
スの統一
プロジェクト
 個人による
 プロトタイプ
 単純なプロ 開発
 単独作業
 様々な開発
グラム
メソッド
効果的なツールの活用
デバッグの効率と開発スピード、プログラム品質の関係
Copyright (C) Mitsubishi Research Institute, Inc.
21
デバッグ(おさらい)
デバッグプリントによる動作確認
 ソースコードに変数の値を出力するコードを埋め込む
 例: 変数 v の値を知りたいとき
 printf (“DEBUG: v = %d¥n”, v);
 デバッグプリントのメリット
 お手軽
 どんな言語でも、たいてい対応可能
 デバッグプリントのデメリット
 端末に表示をできないケースがある(例: カーネルモジュール、組み込みシステム等)
 簡単に確認できないバグもある(例: 画像処理プログラム、リアルタイムシステム等)
 デバッグプリントのコードが本体に影響し、動作が変わるケースもある
 スタックを破壊しているようなバグで、デバッグプリントの影響によってバグを回避してしまうケースなど
Copyright (C) Mitsubishi Research Institute, Inc.
22
デバッグ(おさらいの続き)
デバッガ(および統合開発環境に組み込まれたデバッグ機能)による動作確認
 デバッガによるデバッグの標準的な流れ
 シンボル情報付きでコンパイル
 デバッガを起動、デバッガの操作により、不具合(バグ)の問題点を追求する
 デバッガ利用によるデバッグのメリット
 ブレークポイント、ウォッチポイント等の細かなプログラム制御による確認が可能
 どんな言語でも、たいていデバッガは用意されている
 デバッガ利用によるデバッグのデメリット
 デバッガの使い方を覚えなければならない
 最適化されていると、デバッガが適切に動作しないケースもある
デバッガ利用によるデバッグで戸惑うケース(Cプログラミングの場合)
 最適化が効き、変数がレジスタに割り当てられてしまう
 レジスタの内容を見なければならないが、対応が分かりづらい
Copyright (C) Mitsubishi Research Institute, Inc.
23
他ツールとの接続性と生産物・データの互換性
接続性、互換性とは
 接続性
 様々なツールを組み合わせて使うときに、問題が生じないかどうか
 エディタ ⇒ コンパイラ ⇒ デバッガ ⇒ プロファイラ ⇒ …
 互換性




様々なデータのやり取りで問題が生じないかどうか
例1: WWW、様々なブラウザで動作するか
例2: オフィス文書(ODF, Open Document Format)
例3: 各種のXMLデータ(開発ツールで利用)
マルチプラットフォーム対応
 マルチプラットフォーム: Windows、Mac OS X、Linux、各種UNIX、モバイル機器、
携帯電話、etc.
Copyright (C) Mitsubishi Research Institute, Inc.
24
多様性の問題
 多様性とは何か
 コンポーネントの組合せ方が
自由なため、組合せの数が爆発
 自由度の高さに相反、
トレードオフの関係
 プロプラエタリ環境でも
 PC/AT互換機
 デバイスの多様性
 デバイスメーカが対処
 マイノリティは辛い
Copyright (C) Mitsubishi Research Institute, Inc.
25
3つの多様性
データの多様性
 外部との電子化文書交換で問題が発生
 動作環境に関する多様性の原因
 ディストリビューションの違い
 Red Hat, SUSE, Debian, Knoppix, etc...
 アプリケーション固有のデータフォーマット
 ex. *.doc, *.xls, *.ppt,...
 バージョンの違い
 個々のアプリが個別の進化を繰り返すため
 プロプラエタリOSでも、同様の問題はある
 SPxを当てた/当てない、YYYエディション、など
 交換したいのは、形式ではなく内容そのもの
 文書
 文章の記述、体裁...
ユーザインタフェースの多様性
 操作の多様性はユーザの不信感に直結する
 表計算シート、プレゼンテーション
 値、グラフ、図形、フォント...
 とくに、デスクトップ利用で顕著
 データが個別アプリケーションに依存
 慣れ親しんだユーザインタフェースと操作性
 本質的な機能は同じでも...
 同じカテゴリのアプリケーションでも、データ形式が
違う
 ex. ワードプロセッサ




 MS-Word, OpenOffice.org Writer, KOffice, AbiWord, etc...
プラットフォームの多様性
 プラットフォーム構成に関する自由度が高すぎ
 選択肢
 ユーザは保守的
 カーネルパラメータ、カーネルモジュール
 ライブラリ、ツール
 その他のアプリケーションが依存するソフトウェア
Copyright (C) Mitsubishi Research Institute, Inc.
アイコンが違う
メニューの位置や表記が違う
キーボードショートカットが違う
エラーメッセージが違う、etc...
 新しい操作を覚え直す手間と時間がもったいない
 せっかく操作を覚えたのに
26
本教材を利用する上での注意事項
 本資料の利用に関しては、株式会社三菱総合研究所が「クリエイティブ・コモンズ・
ライセンス 表示 2.1 日本」のもとで許諾します。
 「クリエイティブ・コモンズ・ライセンス 表示 2.1 日本」では
以下の条件に従う場合に限り、自由に
 本作品を複製、頒布、展示、実演することができます。
 二次的著作物を作成することができます。
あなたの従うべき条件は以下の通りです。
 表示 ― あなたは原著作者のクレジットを表示しなければなりません。
 より詳しくは、http://creativecommons.org/licenses/by/2.1/jp/ をご参照下さい。
Copyright (C) Mitsubishi Research Institute, Inc.
27