280 likes | 542 Views
オープンソース実践特論. 第 6 回 オープンソース開発ツールの種類と機能 2009 年 11 月 21 日. 情報技術研究センター 飯尾 淳. 分析と設計で利用するツール. 分析・設計ツール. 分析・設計ツールが必要である理由 分析・設計ツールが必要になる場面 分析・設計と UML UML … Unified Modeling Language “ Language ” といってもテキストではない 図の集まり 図によって情報をやりとりすることで様々なメリットが (どのようなメリットがあるか、考えてみよう). 開発の初期段階 概念設計 機能設計
E N D
オープンソース実践特論 第6回 オープンソース開発ツールの種類と機能 2009年11月21日 情報技術研究センター 飯尾 淳 Copyright (C) Mitsubishi Research Institute, Inc.
分析と設計で利用するツール Copyright (C) Mitsubishi Research Institute, Inc.
分析・設計ツール • 分析・設計ツールが必要である理由 • 分析・設計ツールが必要になる場面 • 分析・設計とUML • UML … Unified Modeling Language • “Language”といってもテキストではない • 図の集まり • 図によって情報をやりとりすることで様々なメリットが • (どのようなメリットがあるか、考えてみよう) • 開発の初期段階 • 概念設計 • 機能設計 • 詳細設計 • 画面設計 • データベース設計 • etc... • 運用時 • パフォーマンス測定 • ボトルネック検出 • バグ追跡 • チューニング • 追加機能検討 • etc... • システムのアップデート • 機能追加 • 不具合修正 • 性能向上 • etc... Copyright (C) Mitsubishi Research Institute, Inc.
UMLの歴史と意義 • UMLの歴史 • UML登場以前 • Booch, JacobsonらのOOSE • Object Oriented Software Engineering • RumbaughらのOMT • Coad-Yourdon法 • Shlaer-Mellor法 • 問題点 • 開発者同士でツールが違うと話ができない! • 歴史 • 1996年 UMLコンソーシアム設立 • 1997年 UML1.0発表 • 2003年 UML1.5 • 2004年 UML2.0 Booch法によるクラス図 OMTによるクラス図 出典:ウィキメディア・コモンズ いやOMTを使おう BoochのOOSEだ UMLとオブジェクト指向設計は 表裏一体の関係 Copyright (C) Mitsubishi Research Institute, Inc.
Webアプリケーション設計の例 ビジネスロジック設計 コンポーネント間インターフェース設計など 実際の利用方法 クラス図を用いてオブジェクトの関係を記述 クラスの属性、メソッド、クラス間の関係等をブレークダウンする アクティビティ図、状態図、シーケンス図などで動作を記述 (農工大「Webコンピューティング実践特論」第7回資料より引用) UMLの活用シーン UMLにおける代表的な各図の例 シーケンス図:各オブジェクトの動作を時系列(シーケンス)に従って記述 オブジェクトA:クラス1 オブジェクトB:クラス2 オブジェクトC:クラス3 オブジェクトの生成 オブジェクトの生成 メッセージ(復帰) オブジェクトの消滅 アクティビティ図:各アクションの関係を実行順序や依存性に着目して記述 アクション アクション アクション アクション アクション Copyright (C) Mitsubishi Research Institute, Inc.
UMLに定められている図 Copyright (C) Mitsubishi Research Institute, Inc.
UMLの利用 • UMLで定義されている様々な図の例 ユースケース図 シーケンス図 クラス図 出典:ウィキメディア・コモンズ (いずれもCCまたはパブリックドメインのものを利用) パッケージ図 ステート図 Copyright (C) Mitsubishi Research Institute, Inc.
システム 何をするか アクター 何をするか アクター 演習:UMLを書いてみよう • 簡単なのは「ユースケース図」 • いろいろなシステムの「ユースケース」を考えてみよう • 図書館の蔵書データベース • 自動販売機 • 銀行のATM • 電車の改札(SUICAのシステム) • etc… • ポイント • その「ユースケース」に登場するアクターは誰か • そのアクターは何をするか • それぞれどのような関係にあるか Copyright (C) Mitsubishi Research Institute, Inc.
UML作成支援ツール(1) • ArgoUML • 特徴 • Javaで作られている • Java Web Startでも利用可能 • OSに依存しない • UML1.4の全図をサポート • 多くの画像形式で出力できる • リバースエンジニアリング機能 • ライセンス • BSDライセンス • 入手先 • http://argouml.tigris.org/ ArgoUMLを利用している画面のスクリーンショット Copyright (C) Mitsubishi Research Institute, Inc.
UML作成支援ツール(2) • Umbrello • 特徴 • KDEに含まれるプログラミング支援ツール • KDE環境でなくとも利用はできる • Windows, Mac OS Xにも移植されている • 利用頻度の高い図をサポート • クラス図 • ユースケース図 • コンポーネント図 • 配置図 • コードの自動生成 • Java • PHP • C++ • JavaScript • ActionScript、他、多数の言語に対応 • ライセンス • GPL v2 • 入手先 • http://uml.sourceforge.net/index.php Umbrelloを利用している画面のスクリーンショット Copyright (C) Mitsubishi Research Institute, Inc.
データベース設計に必要な項目 ERDに基づいた正規化 必要に応じて逆正規化 運用上の制約から、正規化の逆処理が必要になる場合がある ERDを物理設計レベルにブレークダウン DB構築のSQLを生成する ER図 • ERD (Entity Relationship Diagram)とは? • ERDを構成する3つの要素 • エンティティ(Entity):個々の事象 • アトリビュート(Attribute):事象の特性や状態、「属性」 • リレーションシップ(Relationship):事象同士の関係 • 1970年、ピーターチェンが提唱 • RDB設計の表現に適している M N 受注 顧客 商品 • DBの正規化とは? • 正規化で行う作業 • データの重複、冗長性をなくす • 部分的な従属性を取り除く • 正規化の手順 • 非正規形 → 第一正規形 → 第二正規形 • → 第三正規形 → 第四正規形 → 第五正規形 顧客コード 受注番号 商品コード データを一定のルールに従って変形し、利用しやすくすること 顧客名 受注日次 商品名 顧客住所 受注個数 商品単価 ERDの例 「IT用語辞典 e-Words」より 実際のERD(部分)の例 ⇒ (ERD作成ツールのスクリーンショット) 出典:http://fabforce.net/dbdesigner4/screenshots.php 出典:農工大「Webコンピューティング実践特論」第7回資料 Copyright (C) Mitsubishi Research Institute, Inc.
ER図作成支援ソフトウェア(1) • DBDesigner 4 • 特徴 • Linux、Windows XPで利用可能 • リバースエンジニアリング機能 • MySQL, Oracle, MSSQL等に対応 • DBから自動でER図を作成可能 • デザインモードとクエリーモード • 設計ツールとして利用(デザインモード) • DB操作ツールとして利用(クエリーモード) • ER図からSQLを自動作成可能 • ライセンス • GPL • 入手先 • http://www.fabforce.net/dbdesigner4/downloads.php 出典:http://www.fabforce.net/dbdesigner4/ Copyright (C) Mitsubishi Research Institute, Inc.
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 • Eclipseのプラグインとして提供 WWW SQL Designer のデモ画面 出典:http://ondras.zarovi.cz/sql/demo/?keyword=default Copyright (C) Mitsubishi Research Institute, Inc.
演習: WWW SQL Designer を使ってみよう • 各エンティティ(テーブル)の配置を動かすにはどうすればよいか • 各フィールドの色は何を意味しているのだろうか • このツール、日本語は使えるか • SQL文を自動生成するにはどのような手順で何をすればよいか • 説明した以外に何ができそうか • いじってみてどう感じたか Copyright (C) Mitsubishi Research Institute, Inc.
開発・プログラミングで利用するツール Copyright (C) Mitsubishi Research Institute, Inc.
プログラミング支援ツール(1) • テキストエディタ • ソースコードやその他のテキストファイルを編集 • vi, emacs, gedit, etc… 様々なテキストエディタ (左から、vi, emacs, gedit) Copyright (C) Mitsubishi Research Institute, Inc.
プログラミング支援ツール(2) • プログラム解析ツール(静的コード解析ツール) • プログラムのソースコードを解析して様々な問題点を検出する • コーディングスタイルをチェックするタイプ • リファクタリングやコードの整形をサポートするタイプ • セキュリティ脆弱性やバグを検出して指摘するタイプ Copyright (C) Mitsubishi Research Institute, Inc.
プログラミング支援ツール(3) • 動的解析ツール • プログラムを実行させて性能を解析したり問題解決を図る • (デバッガも動的解析ツールの1つ?) • 代表的なツール…プロファイラ • 関数の実行時間や呼び出し回数といったデータを採取して分析する • ボトルネックとなっているコードはどこかといったことが分かる • その他、Linux (またはFreeBSD等のUnix系OS)には細かなツールが山ほど存在 Copyright (C) Mitsubishi Research Institute, Inc.
Pirka'r - 「良い道」 (Web作成支援ツール) 出典:http://pirkar.asikunep.org/ Copyright (C) 2009 Mitsubishi Research Institute.Inc.
Pirka'rの仕組み Copyright (C) 2009 Mitsubishi Research Institute.Inc.
カバレージテスト • カバレージテストとは • プログラム開発、システム開発にテスト工程は必須 • テストしないと品質を高めることはできない。バグだらけのソフトウェア、欠陥システム • でも…「どこまでテストすれば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.
テスト支援ツール • Selenium • Firefoxの拡張として作成されたWebアプリケーション向けテストツール • 詳しくは説明用ビデオを参照(SeleniumHQ提供) • Jcoverage • コードの何パーセントがテストされたかを分析する機能を持つテスト自動化ツール • Eclipseのプラグインとして提供、JUnit (後述)環境と連携 • gcov • GNU gcc と組み合わせて使うコード・カバレージ分析ツール • コマンドラインから gcov [options] sourcefileとして起動 これらのツールを上手に組み合わせてテストの 効率化を行うことが重要 ⇒ テスト工程の時間短縮、成果品質の向上 Copyright (C) Mitsubishi Research Institute, Inc.
単体テスト • 単体テストとは • プログラムの細かい単位で行われるテスト • V字モデルでは… • 詳細設計に対応 V字モデル ウォーターフォールモデル 出所:「演習と実例で学ぶプロジェクトマネジメント入門」より引用のうえ改変 Copyright (C) Mitsubishi Research Institute, Inc.
単体テスト・ツール • FoobarUnit • 各種のプログラム言語に対応して単体テストを支援するツールが存在 • JUnit … Javaプログラム向け単体テストツール • CUnit … Cプログラム向け単体テストツール • CppUnit … C++プログラム向け単体テストツール • PHPUnit … PHPプログラム向け単体テストツール • PyUnit … Pythonプログラム向け単体テストツール • RubyUnit … Rubyプログラム向け単体テストツール ⇒ Ruby1.8で標準ライブラリに統合 • FoobarUnitを利用するメリット • 単体テストを行うテストプログラムが規格化され分かりやすくなる • いずれにせよ単体テストではそのモジュールが正しく動作しているかどうかのテストプログラムを数多く作成して実施、検証する必要がある • 一連の単体テストを自動的に行うことができる • 単体テスト結果を分析することが可能になる ⇒ カバレージテストツールとの連携 Copyright (C) Mitsubishi Research Institute, Inc.
単体テストの利用例(1) • 「CUnitチュートリアル」(http://homepage3.nifty.com/kaku-chan/cunit/index.html)からCUnitの利用例を引用 • 対象プログラム(バブルソートのアルゴリズムを実装した単純なプログラム) • Cunitを使い、これにテストコードを追加してみる • ※ 通常はテストコードのファイルは別に分けるが、説明のため同じファイルに記述する 1 : void sort(int array[], int num) { 2 : int i; 3 : int j; 4 : int val; 5 : 6 : for(i=0; i<(num-1); i++) { 7 : for(j=(num-1); j>i; j--) { 8 : if (array[j-1] > array[j]) { 9 : val = array[j]; 10 : array[j] = array[j-1]; 11 : array[j-1] = val; 12 : } 13 : } 14 : } 15 : } Copyright (C) Mitsubishi Research Institute, Inc.
単体テストの利用例(2) 1 : //============================================================================= 2 : // ファイル : main.c 3 : //============================================================================= 4 : #include <CUnit/CUnit.h> 5 : #include <CUnit/Console.h> 6 : 7 : //----------------------------------------------------------------------------- 8 : // プロトタイプ宣言 9 : //----------------------------------------------------------------------------- 10 : void sort(int array[], int num); 11 : void test_sort_001(void); 12 : void test_sort_002(void); 13 : void test_sort_003(void); 14 : void test_sort_004(void); 15 : void test_sort_005(void); 16 : 17 : //----------------------------------------------------------------------------- 18 : // main() 関数 19 : //----------------------------------------------------------------------------- 20 : int main() { 21 : CU_pSuite sort_suite; 22 : 23 : CU_initialize_registry(); 24 : sort_suite = CU_add_suite("Sort", NULL, NULL); 25 : CU_add_test(sort_suite, "test_001", test_sort_001); 26 : CU_add_test(sort_suite, "test_002", test_sort_002); 27 : CU_add_test(sort_suite, "test_003", test_sort_003); 28 : CU_add_test(sort_suite, "test_004", test_sort_004); 29 : CU_add_test(sort_suite, "test_005", test_sort_005); 30 : CU_console_run_tests(); 31 : CU_cleanup_registry(); 32 : 33 : return(0); 34 : } 35 : 36 : //----------------------------------------------------------------------------- 37 : // テスト対象のソート関数 38 : //----------------------------------------------------------------------------- 39 : void sort(int array[], int num) { 40 : int i; 41 : int j; 42 : int val; 43 : 44 : for(i=0; i<(num-1); i++) { 45 : for(j=(num-1); j>i; j--) { 46 : if (array[j-1] > array[j]) { 47 : val = array[j]; 48 : array[j] = array[j-1]; 49 : array[j-1] = val; 50 : } 51 : } 52 : } 53 : } 54 : 55 : //----------------------------------------------------------------------------- 56 : // テスト関数1 57 : //----------------------------------------------------------------------------- 58 : void test_sort_001(void) { 59 : int array[] = {3}; 60 : 61 : sort(array, 1); 62 : CU_ASSERT(array[0] == 3); 63 : } 64 : 65 : //----------------------------------------------------------------------------- 66 : // テスト関数2 67 : //----------------------------------------------------------------------------- 68 : void test_sort_002(void) { 69 : int array[] = {11, 7, 5, 3, 2}; 70 : 71 : sort(array, 5); 72 : CU_ASSERT(array[0] == 2); 73 : CU_ASSERT(array[1] == 3); 74 : CU_ASSERT(array[2] == 5); 75 : CU_ASSERT(array[3] == 7); 76 : CU_ASSERT(array[4] == 11); 77 : } 78 : 79 : //----------------------------------------------------------------------------- 80 : // テスト関数3 81 : //----------------------------------------------------------------------------- 82 : void test_sort_003(void) { 83 : int array[] = {7, 11, 3, 2, 5}; 84 : 85 : sort(array, 5); 86 : CU_ASSERT(array[0] == 2); 87 : CU_ASSERT(array[1] == 3); 88 : CU_ASSERT(array[2] == 5); 89 : CU_ASSERT(array[3] == 7); 90 : CU_ASSERT(array[4] == 11); 91 : } 92 : 93 : //----------------------------------------------------------------------------- 94 : // テスト関数4 95 : //----------------------------------------------------------------------------- 96 : void test_sort_004(void) { 97 : int array[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; 98 : 99 : sort(array, 10); 100 : CU_ASSERT(array[0] == 1); 101 : CU_ASSERT(array[1] == 2); 102 : CU_ASSERT(array[2] == 3); 103 : CU_ASSERT(array[3] == 4); 104 : CU_ASSERT(array[4] == 5); 105 : CU_ASSERT(array[5] == 6); 106 : CU_ASSERT(array[6] == 7); 107 : CU_ASSERT(array[7] == 8); 108 : CU_ASSERT(array[8] == 9); 109 : CU_ASSERT(array[9] == 10); 110 : } 111 : 112 : //----------------------------------------------------------------------------- 113 : // テスト関数5 114 : //----------------------------------------------------------------------------- 115 : void test_sort_005(void) { 116 : int array[] = {2, 9, 3, 6, 10, 5, 8, 4, 1, 7}; 117 : 118 : sort(array, 10); 119 : CU_ASSERT(array[0] == 1); 120 : CU_ASSERT(array[1] == 2); 121 : CU_ASSERT(array[2] == 3); 122 : CU_ASSERT(array[3] == 4); 123 : CU_ASSERT(array[4] == 5); 124 : CU_ASSERT(array[5] == 6); 125 : CU_ASSERT(array[6] == 7); 126 : CU_ASSERT(array[7] == 8); 127 : CU_ASSERT(array[8] == 9); 128 : CU_ASSERT(array[9] == 10); 129 : } テスト2 テスト3 CUnitのテスト 環境を設定、 テスト1~5を 登録し実行 テスト4 テスト対象 テスト5 テスト1 Copyright (C) Mitsubishi Research Institute, Inc.
CUnitの利用例 • (実際にCUnitの使い方を示す) • ubuntuでCUnitを使うときの留意点 • libcunit1, libcunit1-dev の両パッケージが必要 • コンパイルは gcc sourcecode.c -lcunit でよい • コンパイルしてできた実行形式を起動すると、テストメニューが現れる • (参考「CUnitチュートリアル」) Copyright (C) Mitsubishi Research Institute, Inc.
プロジェクト管理ツール • プロジェクト管理ツールの機能 • 作業進捗状況の管理 • WBSの作成とメンテナンス • TODOリストの作成、作業の割り当て管理 • 成果品質の管理 • バグや問題点の登録と状況追跡、管理 Redmine GanttProject FreeMind Copyright (C) Mitsubishi Research Institute, Inc.