4-2- 応 C に関する知識 1
4-2- 応 C に関する知識 本カリキュラムでは C での OSS 開発において セキュリティを強化し 機能性や信頼性を向上するために必要となる様々な知識や 並 Ⅰ. 概要列処理による効率を考慮した技術 様々なライブラリを通じて可搬性や使用性を向上させる技術などを学習する 更に OSS のソースコードリーディングによる技能向上方法を学習する Ⅱ. 対象専門分野職種共通 Ⅲ. 受講対象者 本カリキュラムの 4-2- 基 C に関する知識 を受講済みであるこ受講前提と または 同等の知識を有すること プロセスと仮想アドレス空間に関して理解する アーキテクチャとセキュリティに関する手法を理解する テストとデバッグの意義と手法に関して理解する ライブラリの概念や 構築方法と利用方法を理解する 並列処理の概念と利用方法を理解する Ⅳ. 学習目標 ネットワークプログラミングの概要と実装方法を理解する データベースプログラミングの意義と構築方法を理解する GUI ライブラリやその他開発ライブラリの利用方法を理解する ポータビリティと国際化の概要と手法を理解する コードリーディングの意義と手法を理解する C 実践プログラミング Ⅴ. 使用教科書 Steve Oualline 著 オライリー ジャパン刊教材等その他 オリジナル教材やソースコードを教材として用いる Ⅵ. 習得スキル講義終了後の受講レポート 定量アンケート 知識確認ミニテスト の評価方法演習問題の取り組み状況を総合的に判断して評価を行う Ⅶ. カリキュラムレベル 3( 応用 ) 第 1 回 ~ 第 12 回の構成 2
講座内容 第 1 回メモリアロケートの詳細 ( 講義 + ワークショップ 90 分 ) プロセスと仮想アドレス空間の概念について理解する 更に 仮想アドレス空間を構成する 5 つの領域の 特徴を学習し メモリアロケートの詳細内容を理解する (1) メモリアロケートの概要 1 プロセスとは ( プログラムの実行単位 プロセス ID など) 2 仮想アドレス空間とは ( 物理メモリとの対応 プログラム間での干渉防止 など ) (2) 仮想アドレス空間の構成 1 テキスト領域の特徴 ( 機械語命令 読み取り専用 存続期間 など ) 2 データ領域の特徴 ( 初期化指定あり 静的変数 グローバル変数 存続期間 など ) 3 BSS 領域の特徴 ( 初期化指定なし 静的変数 グローバル変数 0 で初期化 存続期間 など ) 4 ヒープ領域の特徴 ( 動的確保 存続期間 など ) 5 スタック領域の特徴 ( 自動変数 ブロック 存続期間 など ) 6 サンプルプログラム 第 2 回アーキテクチャとセキュリティ ( 講義 + ワークショップ 90 分 ) CPU のアーキテクチャが異なることを考慮しなければならない項目について学習する また メモリを管理 する上でセキュリティに注意しなければならない事項を理解する (1) アーキテクチャ 1 アーキテクチャの違いによる諸問題 (CPU の違い ) 2 データのサイズ (32 ビット CPU 64 ビット CPU long 型 pointer 型 など ) 3 エンディアン ( ビッグエンディアン リトルエンディアン バイエンディアン など ) 4 サンプルプログラム (2) セキュリティ 1 変数とセキュリティ ( 変数のバインド ) 2 バッファオーバーラン ( 不正な参照 不正な書き換え scanf strcpy など) 3 バッファアンダーラン ( 不正な参照 不正な書き換え ポインタの減算 など ) 4 メモリリーク ( 動的領域の解放忘れ メモリリークの累積 パフォーマンスの低下 malloc など) 5 二重解放 ( 再利用領域の不正解放 free など) 6 サンプルプログラム 3
第 3 回テストとデバッグ ( 講義 + ワークショップ 90 分 ) OSS の品質保証活動を支援するテストとデバッグの手順を理解する また OSS の単体テストを自動化す るフレームワーク カバレジ測定ツール デバッグツールの使用方法を学習する (1) テスト 1 テストの概要 ( 品質保証活動 ユニットテスト カバレジ OSS のテストツール など ) 2 ユニットテストの手法 ( テスト対象 テストケース テスト環境 回帰テスト カバレジ測定 など ) 3 ユニットテスト自動化ツール (CUnit Cutter など) 4 カバレジ測定ツール (gcov lcov など) 5 サンプルプログラム (2) デバッグ 1 デバッグの概要 ( テストとデバッグ テストケースの改修 OSS のデバッグツール など ) 2 デバッグの手順 ( エラー内容 再現手順 発生箇所 原因 修正方法 修正実施 など ) 3 シンボリックデバッガ (gdb xxgdb など) 4 メモリエラー検出ツール (ElectricFence MEMWATCH など) 5 サンプルプログラム 第 4 回ライブラリの構築と利用 ( 講義 + ワークショップ 90 分 ) 汎用性と再利用性といったライブラリの概念と 静的ライブラリや共有ライブラリの特徴を理解する また それぞれのライブラリによって異なる利用方法や ライブラリの構築方法を学習する (1) ライブラリ 1 ライブラリとは ( 汎用的な関数群 再利用 形式 など ) 2 静的ライブラリの特徴 ( コンパイル時にリンク 構築容易 プログラムの容量大 など ) 3 共有ライブラリの特徴 ( 実行時リンク 軽量 配置 共有ライブラリの更新 動的ロード など ) (2) 静的ライブラリの構築と利用 1 構築方法 (gcc のオブジェクトファイル生成用オプション ar の使用方法 拡張子 など ) 2 利用方法 (gcc でのコンパイル方法 ) 3 サンプルプログラム (3) 共有ライブラリの構築と利用 1 構築方法 (gcc のオプション soname バージョン番号 など) 2 インストール方法 ( 配置場所の指定 シンボリックリンク など ) 3 利用方法 (gcc の共有ライブラリ指定オプション など ) 4 サンプルプログラム 4
第 5 回並列処理 ( 講義 + ワークショップ 90 分 ) 並列処理と並行処理についての概念を学習し 逐次処理と並列処理の違いを理解する 更に 並列処理 の技法として マルチプロセスとマルチスレッドの実装方法を学習する (1) 並列処理 1 並列処理の概念 ( デュアルコアとシングルコア 並列処理と並行処理 SMP など) 2 マルチプロセス ( 複数のプロセスと仮想アドレス空間 プロセス間の通信 など ) 3 マルチスレッド ( プロセスとスレッド 同一仮想アドレス空間 スレッドセーフ など ) (2) マルチプロセスの実装 1 プロセスの生成 (fork 親子関係 自プロセスの複製 など) 2 プロセスの制御 ( プロセス ID 制御の分岐 など) 3 プロセスの待機と終了 (wait _exit 子プロセスの回収 ゾンビプロセス など) 4 サンプルプログラム (3) マルチスレッドの実装 1 スレッドの生成 (pthread_create メインスレッド スレッド関数 親子関係 など) 2 スレッドの制御 ( グローバル変数や静的変数の問題 スレッドセーフ関数 など ) 3 スレッドの待機と終了 (pthread_join return pthread_exit リソース解放 など) 4 サンプルプログラム 第 6 回ネットワーク ( 講義 + ワークショップ 90 分 ) TCP/IP でのクライアントプロセス サーバプロセスといった ネットワークプログラミングの概要を理解し ソケット利用したネットワークプログラミングの実装方法を学習する (1) ネットワークプログラミング 1 ネットワークプログラミングとは (TCP/IP IP アドレス クライアント サーバ など ) (2) ソケット 1 ソケットとは ( ソケット API セッション管理 ストリーム など) 2 ソケットの生成と解放 (socket bind ポート番号 close など) 3 サーバ側での同期の確立 ( 接続要求受付開始 listen 同時接続可能数 accept 待機 など) 4 クライアント側での同期の確立 ( 接続要求 connect など) 5 データの送受信 ( ストリームに書き出し ストリームから読み込み など ) 6 サンプルプログラム 5
第 7 回データベース ( 講義 + ワークショップ 90 分 ) データベースシステムの構成要素として アプリケーションと DBMS の関連性などについて理解する また C によるデータベースプログラミングの実装として DBMS ライブラリの使用方法を学習する (1) データベースプログラミング 1 データベースプログラミングの概要 ( 大量で複雑なデータ DBMS 安全性 効率性 など) 2 様々な DBMS(PostgreSQL MySQL SQLite ほぼ共通の SQL 文 CRUD 操作 など ) 3 C によるデータベースプログラミングの特徴 ( 処理速度 エンベデッド系 エンタプライズ系 など ) (2) DBMS ライブラリの使用 1 SQLite3 の導入 ( パッケージマネージャでのインストール など ) 2 データベースハンドルの取得 (sqlite3_open データベース名 など) 3 データベースの CRUD 操作 (sqlite3_exec SQL 文指定 コールバック関数 並列処理 など ) 4 データベースハンドルの解放 (sqlite3_close など) 5 サンプルプログラム 第 8 回 GUI( 講義 + ワークショップ 90 分 ) GUI アプリケーション開発の概要を理解する 更に GTK+ の導入方法 基本的な構造 特徴について学習 し GTK+ で使われるシグナルとコールバックの概念を理解する (1) GTK+ 1 GTK+ の概要 (GIMP GLib GDK シグナルとコールバック など) 2 GTK+ の導入 ( パッケージマネージャでのインストール など ) (2) Glade 1 Glade の概要 ( インタフェースビルダ コールバック関数のスケルトン など ) 2 Glade の導入 ( パッケージマネージャでのインストール など ) (3) 代表的なウィジェット 1 ウィジェットとは ( ウィンドウ ボタン メニュー コンテナ など ) 2 ウィンドウ ウィジェット (GtkWindow GtkDialog など) 3 ボタン ウィジェット (GtkButton GtkToggleButton など) 4 メニュー ウィジェット (GtkMenu GtkMenuItem など) 5 コンテナ ウィジェット (GtkTable GtkToolbar など) 6 サンプルプログラム 6
第 9 回演習 Ⅰ( ネットワーク マルチスレッド )( ワークショップ 90 分 ) ソケット API を使用してチャットを行うクライアントとサーバを作成し マルチスレッドの利用方法や 各種ラ イブラリの使用方法を学習する (1) 演習の要件 1 ソケット API を使用して同期を確立する 2 受信したメッセージをターミナルに表示する 3 ターミナルでユーザのメッセージ入力を受け付ける 4 入力されたメッセージを相手に送信する 5 EOF が入力されるまで 2から4を繰り返す 6 発展演習 : 送受信のブロッキングをマルチスレッドで回避する 7 発展演習 : 送受信のブロッキングを select で回避する 第 10 回演習 Ⅱ(GUI データベース )( ワークショップ 90 分 ) GUI でデータベースを操作するアプリケーションを作成することで シグナルの利用方法や 各種ライブラ リの使用方法を学習する (1) 演習の要件 1 データベースは SQLite3 を使用する 2 GUI の構築には GTK+ と Glade を使用する 3 ユーザの SQL 文をテキスト ウィジェットに入力する 4 実行のボタン ウィジェットが押されると SQL 文を実行する 5 SQL 文の実行結果をリスト ウィジェットで出力する 6 終了のボタン ウィジェットが押されると プログラムを終了する 7
第 11 回ポータビリティと国際化 ( 講義 + ワークショップ 90 分 ) OSS のポータビリティとして LSB の概要と 国際化として OpenI18N の概要を理解する 更に C における国 際化の手法として ロケールの設定にあわせた変換方法を学習する (1) ポータビリティ 1 ポータビリティの概要 ( 異なる環境での動作 移植性 LSB 国際化 など) 2 LSB( 標準規格 異なるディストリビューションでの動作 テストスイート など ) (2) 国際化 1 国際化の概要 ( 国や地域によって異なるものへの対応 OpenI18N など) 2 GNU gettext とは ( ソースコードを国際化 ロケール設定で文字列切り換え など ) 3 ソースコードの準備 (gettext のマクロ定義 setlocale textdomain bindtextdomain など) 4 po ファイルの作成 (xgettext pot ファイル po ファイル編集 msgid msgstr など) 5 mo ファイルの作成 (msgfmt po ファイルを mo ファイルにコンパイル ドメイン名 など ) 6 mo ファイルの配置 ( コード内で指定したディレクトリに配置 ロケールの切り換え など ) 7 サンプルプログラム 第 12 回コードリーディング ( 講義 + ワークショップ 90 分 ) OSS を読み解くことの意義を理解し コードリーディングに有効な手法を学習する 更に解析に有用な統合 開発環境やツール類を学習する (1) ソースコードリーディング 1 ソースコードリーディングの概要 ( 市場で使用されている技術 改善策の考察 など ) (2) コード解析手法 1 動的解析とは ( デバッガの利用 プロファイラの利用 など ) 2 静的解析とは ( テキストエディタの利用 クロスリファレンサの利用 など ) 3 統合開発環境の活用 (Eclipse など) (3) 解析手順 1 全体像の把握 ( 実行して全体の動作を概観 フォルダ構成 など ) 2 開発意図の理解 ( 開発者ドキュメント 変更履歴 バージョン管理 バグトラッキング など ) 3 詳細分析 ( 検索 トレース データ構造の変化 処理の流れ 動作予測 問題点の仮説 など ) (4) 読みやすいコード 1 コーディング規約 ( 可読性 保守性 命名規則 コメントのルール など ) 2 サンプルソース 以上 8