• 検索結果がありません。

実装者に依存しないプログラム規模尺度の構築の試み

N/A
N/A
Protected

Academic year: 2021

シェア "実装者に依存しないプログラム規模尺度の構築の試み"

Copied!
6
0
0

読み込み中.... (全文を見る)

全文

(1)377 推薦論文● FOSE2010. 実装者に依存しないプログラム規模尺度の構築の試み 門田 暁人 内田 眞司 松本 健一. 多数の企業で用いられているソフトウェア規模の尺度であるソースコード行数 (SLOC;Source Lines of Code) は, 同一機能を実装した場合であっても,実装者によって値が大きくばらつくという問題がある.本論文では,この問題 の軽減を目的として,同一の機能仕様に基づいて実装された 9 個のプログラムを分析した結果に基づいて,トークン 数,クローン量,関数の仮引数の総数を組み合わせることで,実装者に依存しにくい規模の尺度 ALOC(Adjusted Length of Code) を導出した.この 9 個のプログラムには,SLOC に 3.16 倍の差があったが,ALOC の導出値の 差は 1.22 倍となった.さらに,導出した尺度 ALOC を別の仕様の 6 個のプログラムに適用した結果,SLOC の 4.66 倍の差に対して,ALOC は 1.60 倍の差となった.. Source Lines of Code (SLOC) is a most basic and widely-used program size measure in software project management and/or quality assurance although it greatly depends on a programmer who implemented the program. To build a programmer-independent program size measure, this paper analyzed 9 independentlybuilt C programs of a same functional specification, and found that 3 base measures (the number of tokens, tokens of code clones, and function parameters) are useful to eliminate programmer-dependent aspects of SLOC. A new size measure called Adjusted Length of Code (ALOC) built upon these 3 base measures showed that variations of size in ALOC was at most 1.22 times difference among 9 programs while SLOC showed 3.16 times difference. Furthermore, ALOC showed at most 1.60 times difference among another 6 independently-built programs of an alternative specification while SLOC showed 4.66 times difference among these programs. These results suggest that the new measure ALOC can reduce the programmer-dependent aspects of program size and can be used as a better size measure in project management.. トケース密度 (件/ SLOC),テスト工数密度 (SLOC. 1 はじめに. /人時),開発生産性 (SLOC /人時) など開発プロセ. ソフトウェア開発の黎明期から今日に至るまで,. スに関する様々な尺度が定義され,プロジェクト管理. ソフトウェア規模の尺度として,ソースコード行数. に用いられている.. (SLOC;Source Lines of Code.コメント行や空行. ところが,誰もが気付いているように,SLOC に. は含まない) が用いられてきた.さらには,SLOC を. は大きな問題がある.同一機能を実装した場合であっ. ベースにして,不具合検出密度 (件/ SLOC),テス. ても,実装者の能力やプログラミング技術によって, 値が大きくばらつくことである.とはいえ,多くの企. On Building Programmer-Independent Program Size Measure. Akito Monden, Ken-ichi Matsumoto, 奈良先端科学技 術 大学 院大 学情 報 科学 研究 科, Graduate School of Information Science, Nara Institute of Science and Technology. Shinji Uchida, 奈良工業高等専門学校情報工学科, Dep. of Information Engineering, Nara National College of Technology. コンピュータソフトウェア, Vol.28, No.4 (2011),pp.377–382. [研究論文 (レター)] 2011 年 4 月 30 日受付.. 業では,他に適当な尺度がないために SLOC に頼ら ざるを得ないのが現状であり,不具合検出密度 (件/. SLOC) に基準値を設けて,品質保証活動を行ったり, SLOC ベースで規模見積もりを行っている. SLOC に代わる尺度としては,ソフトウェア機能 量の尺度として,ファンクションポイントが用いられ るようになっており,一定の成功を収めている.ただ し,計測にコストを要するために,採用している企業.

(2) 378. コンピュータソフトウェア. は必ずしも多くない.また,採用している企業におい. 基づく従来のメトリクスの基準値を,そのまま ALOC. ても,やはり計測コストのために,その適用は開発初. の基準値としても用いることができる.例えば,生産. 期の規模見積もりに限られる.一方,仕様追加や変更. 性の基準値を,社内で「10 SLOC /人時」としてい. が起こりがちな今日の開発では,実装中もしくは実装. た場合, 「10 ALOC /人時」に代替できる.なお,本. 後のソフトウェア規模を把握し,プロジェクト管理や. 論文における仕様 S は機能設計書レベルの仕様であ. 改善を行うことが求められる.そのためには,SLOC. り,プログラムの入出力と動作を規定する.アルゴリ. のように,低コストで計測できる規模尺度が必要で. ズム,データ構造,モジュール構造については規定し. ある.. ないが,プログラムの入出力に影響を与える基本的な. 本論文では,同一の機能仕様に基づいて作成された プログラム群の分析結果に基づいて,実装者に依存し. アルゴリズム (例えば,探索は,幅優先なのか深さ優 先なのか) は S で規定するものとする.. ない規模尺度の導出を目指す.. 3 実装者による SLOC のばらつきの分析 2 規模尺度に求められる条件 プログラムを P ,P の仕様を S ,実装者を H とす る.S に基づいて H が実装したプログラムを P (S, H). 本章では,実装者に依存する規模要因を明らかにす るため,ある特定の仕様に基づいて 9 人の実装者の 作成した C 言語プログラムを分析する.. と表す.また P の規模を ALOC(P ) とする.本論文 の目的は, 条件 1 任意の S および Hi , Hj (i = j) について,. ALOC(P (S, Hi ))  ALOC(P (S, Hj )) を満たす規模尺度 ALOC(Adjusted Length of Code). 3. 1 分析対象 プログラムの仕様,実装者,およびメトリクス計測 ツールは,次のとおりである.. • 仕様. を求めることである.つまり,同一の仕様が与えられ. 3 × 3 盤面の 8 パズルを幅優先探索によって解. た場合,異なる実装者が作成した 2 つのプログラム. くプログラム (8 パズルプログラム) である.標. は,ほぼ同規模となることが求められる.従来の規模. 準入力から初期の盤面 (数値の並び) を読み取り,. 尺度である SLOC は,明らかに条件 1 を満たさない.. 解を求め,初期状態から最終状態まで各盤面を標. ただし,常に定数を返す関数も条件 1 を満たしてし. 準出力に表示する.. まう.そこで,尺度 ALOC は, 条件 2 異なる仕様を持つ任意の P, Q について,. ALOC(P  Q)  ALOC(P ) + ALOC(Q) ただし,P  Q は P の後ろに Q をつなげたプログラ. • 実装者 奈良先端科学技術大学院大学情報科学研究科の 9 名の学生である.. • メトリクス計測ツール. ムを表す,という条件も満たすものとする.条件 2 は,. SLOC の計測には,Resource Standard Metrics. プログラム P に (全く異なる) 機能を追加して P  Q. [12] を 使 用し た.コ ード クロ ーン の計 測に は. というプログラムができた場合に,その ALOC の値. CCFinderX [2][6] を用い,10 トークン以上重複. は P と Q の各 ALOC の和になることを意味する.. するコード列をクローンとして検出した.トーク. さらに,実用面を考慮し,次の条件を設ける.. ン数およびトークン種類数の計測には,参考文献. 条件 3 任 意 の P に つ い て , ALOC(P ) . E(SLOC(P )). [3] のツールを用いた.. 実装された 9 個のプログラム PA ∼ PI の特徴を表. ただし,SLOC(P ) は P の SLOC を表し,E(x) は x. 1 に示す. 「主なコーディング Tips」は,各プログラ. の期待値を表す.条件 3 は,尺度 ALOC が,SLOC. ムで使用されているアルゴリズムやデータ構造を示. の期待値 (可能な実装の平均値) とほぼ同じ値を取る. す. 「改行」は,改行を多用するコーディングスタイ. とするものである.条件 3 を満たすことで,SLOC に. ルの有無を表す. 「SLOC」は,空行やコメント文だ.

(3) Vol. 28 No. 4 Nov. 2011 表1. P. 主なコーディング. 改. Tips. 行. 379. 実装された 8 パズルプログラムの特徴. SLOC. 関数. 仮引数. トーク. トークン. クローン. クローン. の数. の総数. ン数. 種類数. 量. 含有率. PA. キュー, リスト, ハッシュ. 165. 9. 7. 991. 114. 57. 5.8%. PB. キュー, ハッシュ. 203. 8. 7. 1406. 154. 351. 25.0%. PC. キュー, リスト, ハッシュ. 119. 4. 2. 883. 100. 153. 17.4%. PD. 3 次元配列. ○. 329. 1. 0. 3342. 107. 2439. 73.0%. PE. キュー, リスト, ハッシュ. ○. 116. 5. 2. 782. 101. 39. 5.0%. PF. キュー, リスト, ハッシュ. ○. 159. 4. 1. 1090. 109. 312. 28.7%. PG. キュー, リスト, ハッシュ. 135. 4. 2. 965. 119. 130. 13.5%. PH. キュー, ハッシュ. 366. 22. 25. 2522. 209. 968. 38.4%. PI. キュー, リスト, ハッシュ. 168. 8. 8. 1274. 138. 254. 20.0%. けの行を除いたソースコード行数を表す. 「関数の数」. ベースとして用いることとした.. はプログラム中のユーザ定義関数の数を表す. 「仮引. 3. 2. 2 モジュール粒度. 数の総数」はユーザ定義関数の仮引数の総数を表す.. 表 1 に示すように,モジュールの粒度には大きなば. 「トークン数」は,プログラム中のトークンの数であ. らつきがあった.例えば,PH は粒度が細かく,22 個. る. 「トークン種類数」は,プログラム中のユニーク. の関数と 25 個の仮引数を含んでいたが,PD は 1 個. なトークンの数である. 「クローン量」は,プログラ. の関数 (すなわち main 関数) だけであった.モジュー. ム中のコードクローン (プログラム中の重複する命令. ルの定義や呼び出しには一定の SLOC を要するため,. 列) の量をトークン数で表したものである. 「クローン. モジュールの粒度が細かいほど SLOC が増大する傾. 含有率」は,プログラムに占めるクローンの量をパー. 向があると考えられる.実際,PH は,モジュール. センテージで表したものである (すなわち,クローン. 粒度が細かすぎるために,9 プログラム中で最大の. トークン数÷トークン数× 100).これらのメトリク. SLOC となっていた.. スに着目した理由については,本論文のベースとなっ たワークショップ論文 [11] をご覧いただきたい.. モジュール粒度の影響を考慮した規模尺度を構築す るために,本論文では,関数の数と仮引数の数を用い ることとする.. 3. 2 分析. 3. 2. 3 コードクローン. 3. 2. 1 プログラムの表層的特徴. コードクローンの量には大きなばらつきがあり,. 表 1 に示すように,3 つのプログラム (PD , PE , PF ). SLOC に影響を与えていることが分かった.クロー. は,改行を多用するコーディングスタイルが採用され. ン含有率の最も大きいプログラムは PD であり,実に. ていた.これらのプログラムでは,中括弧 “{” およ. コードの 73%がクローンである.それに伴い,SLOC. び “}” の前後に改行が行われており,SLOC 増大の. も 329 と大きくなっている.一方,PE のクローン含. 原因となっていた.また,int i, first, move; と書く代. 有率はわずか 5%であり,SLOC は最小であった.. わりに int i;(改行)int first;(改行)int move; という記 述も見られた.. 3. 2. 4 コーディング Tips 表 1 の「主なコーディング Tips」に示される通り,. このようなプログラムの表層的特徴 [10] の違いの影. プログラム中で用いられているデータ構造やアルゴ. 響を小さくするため,本論文では,ソースコード行数. リズムには違いがあった.規模の大きな 3 つのプログ. の代わりに,プログラムのトークン数を規模尺度の. ラム PB , PD , PH は,本仕様をコンパクトに実装でき.

(4) 380. コンピュータソフトウェア 表2. るリスト構造 (隣接リスト) を用いていなかった.こ のことは,適切なコーディング Tips を用いないとプ. 偏回帰係数. 標準化偏回帰係数. トークン数. 0.393. 3.98. 仮引数の総数. −12.2. −0.978. 接計測することは難しい.ただし,適切なコーディン. クローン量. −0.422. −3.36. グ Tips を用いていない場合には,プログラムが冗長. (定数項). ログラム規模が増大することを示唆している. 残念ながら,コーディング Tips の利用の有無を直. 説明変数. 得られた回帰式. 15.5. になりがちであることから,コードクローンにより間 接的に計測できる可能性がある.(実際,プログラム. PB , PD , PH はいずれも多くのクローンを含んでいる. ). 4 規模尺度 ALOC の定義と導出 3. 2 章の分析結果から,実装者に依存しない規模の 尺度を求めるにあたって,トークン数,クローン含有 率,関数の数,仮引数の総数といったメトリクスを 組み合わせて用いることが有望であることが確認で きた.メトリクスの組み合わせ方には様々な方法が. 図1. ALOC の理想値―導出値の散布図. 考えられるが,本論文では,最も単純な方法として, 式 (1) のようにメトリクスの線形結合により規模尺度. ALOC(P  P )  2 × ALOC(P ) となることが期待. ALOC を定義する.. される.また,条件 1∼3 を満たすために,各プログラ.  = k1 N1 + k2 + · · · + kn Nn + C ALOC. (1).  : 目的変数 (ALOC) の推定値 ALOC kn : 説明変数 (トークン数,関数の数など) Nn : 偏回帰係数 C : 定数項. ムの連結数を k,プログラム PA , · · · , PI の SLOC の 平均値を E(SLOC(PA , · · · , P i)) とすると,各プログ ラムについて ALOC = k × E(SLOC(PA , · · · , PI )) を教師信号として与えた. 式 (1) に取り入れる説明変数を決定するにあたって は,式 (1) では各説明変数が目的変数に対して (乗法. 式 (1) のパラメータ (係数 kj および定数 C) 推定に. 的ではなく) 加法的に作用することを考慮し, 「クロー. は,フィットデータ (学習データ) が必要であり,また,. ン含有率」という比率の尺度ではなく,正規化前の. フィットデータにおいて,2 章の条件 1∼3 を満たすよ. 「クローン量 (クローントークン数)」を用いた.また,. うに教師信号,すなわち,目的変数 ALOC の値を与. 多重共線性を避けるために,各説明変数間の相関係数. える必要がある.ここでは,フィットデータとして,実. を調査した結果,関数の数と仮引数の総数の相関係数. 験で用いた 9 個のプログラム (PA , · · · , PI ) に加えて,. が 0.984 と極めて高かったため,関数の数を説明変数. それぞれを 2 倍した (すなわち,2 個連結した) プロ. から除外した.. グラム PA  PA ,PB  PB ,PC  PC ,· · · を用意し. 重回帰分析によりパラメータを推定した結果,得ら. た.条件 2 を満たすためには,本来,異なる仕様を持. れた回帰式を表 2 に示す.各偏回帰係数および定数項. つプログラムを連結したものを用意すべきであるが,. の有意性検定を行った結果,有意水準 1%で全ての係. PA ∼ PI は同一仕様であるため,ここでは,連結した. 数および定数の有意性を確認できた.この回帰式が. プログラム P  P の前半部分と後半部分の仕様が異. ALOC を表す尺度となる.. なりコードの重複がない (前半部分と後半部分にまた. 図 1 は,横軸に ALOC の理想値 (教師信号),縦軸. がるコードクローンが検出されない) ものと仮定して. に回帰式による ALOC の導出値を取ったグラフであ. コードクローンの計測を行った.この仮定のもとでは,. る.図より分かるように, ALOC は (今回実験で用.

(5) Vol. 28 No. 4 Nov. 2011 表3. P. 8 パズルプログラムの SLOC と ALOC の比較. SLOC. ALOC. ALOC. (理想値). (導出値). 381. 表 4 ハ フ マ ン符 号 プロ グ ラム の メト リ クス 値 と ALOC の導出値. P. SLOC. 仮引数. トーク. クロー. ALOC. の総数. ン数. ンの量. 導出値. PA. 165. 296. 296. PS. 334. 7. 2135. 1433. 165. PB. 203. 296. 335. PT. 153. 5. 839. 204. 198. PC. 119. 296. 274. PU. 499. 0. 2411. 1656. 264. PD. 329. 296. 301. PV. 107. 0. 625. 132. 205. PE. 116. 296. 282. PW. 130. 3. 730. 93. 226. PF. 159. 296. 300. PX. 113. 1. 786. 289. 190. PG. 135. 296. 316. PH. 366. 296. 294. PI. 168. 296. 312. いた仕様に関しては) 条件 1∼3 をほぼ満たしている といえる.. 替として ALOC を利用できると期待される.. 6 関連研究 産業界では,プログラミングスタイルの違いによる 規模のばらつきを抑制するために,論理行数 (Logical. 表 3 に,SLOC と ALOC の理想値,導出値の比較. SLOC) がよく用いられる (行の代わりにステートメ. 結果を示す.SLOC は最小値 116,最大値 366 であ. ントの数がカウントされる).ただし,表 1 の 9 個の. り 3.16 倍の開きがあったが,ALOC の導出値は最小. プログラムの論理行数を計測した結果,最小行数と最. 274,最大 335 であり 1.22 倍の開きに収まった.. 大行数の差は 4.2 倍となり,通常の SLOC よりもむ しろ差が広がった.このことから,論理行数を用いる. 5 規模尺度の評価. ことは本論文の目的を達成するには不十分である..   4 章で得られた ALOC の導出式の一般性の評価を. Halstead [5] は,語彙の量を考慮したソースコード. 目的として,別の仕様に基づいて 6 名の実装者の作. 規模の尺度 Volume を提案している.Volume は,全. 成した C 言語プログラムの規模を計測する.プログ. トークン N のうち n 個がユニークであるようなプロ. ラムの仕様は,与えられたテキスト入力をハフマン符. グラムを記述するのに必要なビット数を表し,(トー. 号により符号化するものである.6 名の実装者の内訳. クン数 N )×log2 (トークン種類数 n) で与えられる.. は,奈良先端科学技術大学院大学情報科学研究科の 1. この尺度を表 1 の 9 個のプログラムに適用した結果,. 名の大学教員と 5 名の大学院生 (いずれもソフトウェ. 最小値 5207,最大値 22530 となり,その差は 4.33 倍. ア開発経験のある社会人学生) である.. であった.従って,Volume は実装者に依存しない規. 6 個のプログラムのメトリクス,及び,ALOC の導 出値を表 4 に示す.表より分かるように,SLOC は. 模の尺度とはなり得ないと言える. ソースコードからファンクションポイントを計測. 最小 107,最大 499 であり 4.66 倍の開きがあったが,. する試みも行われている [8] [9].この試みが成功すれ. ALOC の導出値は最小 165,最大 264 であり 1.60 倍. ば,本論文の目的とする規模尺度が得られると期待さ. の開きに収まった.このことから,4 章で得られた. れる.ただし,現状では,トランザクションファンク. ALOC の導出式は,異なる仕様のプログラムに対し. ションにおける外部出力と外部照会の区別の難しい. ても実装者による規模のばらつきを抑える効果があ. ことや,自動計測が難しいといった課題が存在するた. り,ある程度の一般性を持っていることが期待され. め,実用化に向けての今後の発展が望まれる.. る.また,SLOC の平均が 222,ALOC の平均が 208 となっており,両者の値が近いことから,SLOC の代.

(6) 382. コンピュータソフトウェア 構築のための研究開発」の委託に基づいて行われた.. 7 まとめ. また,本研究の一部は,文部科学省科学研究費補助金. 本論文では,SLOC が実装者に依存するという問. (基盤研究 (C):課題番号 22500028) に基づいて行わ. 題の軽減を目的として,まず,規模の尺度に求められ る 3 つの条件を定義した.次に,同一の機能仕様に 基づいて作成された 9 個のプログラムを分析した結 果,トークン数,クローン量,関数の数,関数の仮引 数の総数を組み合わせて用いることが,規模尺度の 導出に有望であることが分かった.そこで,これらの メトリクスの線形結合として規模尺度 ALOC を定義 し,回帰式のパラメータ推定を行った.9 個のプログ ラムには,SLOC に 3.16 倍の差があったが,ALOC の導出値の差は 1.22 倍となった. さらに,導出した規模尺度 ALOC の一般性を評価 するために,別の仕様に基づいて作成された 6 個の プログラムを計測した結果,SLOC は 4.66 倍の差が あったが,ALOC は 1.60 倍の差に収まった.このこ とから,尺度 ALOC は,異なる仕様のプログラムに 対しても実装者による規模のばらつきを抑える効果 があり,ある程度の一般性を持っていることが期待さ れる. 得られた規模尺度 ALOC は,トークン数,クロー ン量,関数の仮引数の総数という,自動計測可能な メトリクスから導出できる.また,2 章の条件 3 によ り,SLOC の代替として用いることが容易であり,今 後,産業界での利用が期待される. 今後の課題として,より多くの仕様,及び,実装者 の作成したプログラム群を用いて,より一般性のある 尺度 ALOC の導出式を求めるとともに,その評価を 行うことが重要となる.また,ソフトウェアメトリク スのセオリー [1] [4] [13] に基づいて,条件 1∼3 以外に 尺度 ALOC が満たすべき性質について,検討してい くことが重要となる.. 謝辞 本研究の一部は,文部科学省「次世代 IT 基盤. れた. 参 考 文 献 [ 1 ] Briand, L.C., Morasca, S. and Basili, V.R.: Property-Based Software Engineering Measurement, IEEE Trans. Software Engineering, Vol. 22, No. 1 (1996), pp. 68–86. [ 2 ] CCFinderX, http://www.ccfinder.net/ [ 3 ] C/C++言 語 の ト ー ク ン を 抽 出, http:// www.vector.co.jp/soft/winnt/prog/se482039.html [ 4 ] Fenton, N.E.: Software Measurement: A Necessary Scientific Basis, IEEE Trans. Software Engineering, Vol. 20, No. 3 (1994), pp. 199–206. [ 5 ] Halstead, M.H.: Elements of Software Science (Operating and programming systems series), Elsevier Science Inc., New York, 1977. [ 6 ] Kamiya, T., Kusumoto, S. and Inoue, K.: CCFinder: A Multi-Linguistic Token-based Code Clone Detection System for Large Scale Source Code, IEEE Trans. Software Engineering, Vol. 28, No. 7 (2002), pp. 654–670. [ 7 ] Kernighan, B. and Pike, R.: プログラミング作法, アスキー, 2000. [ 8 ] Kusumoto, S., Edagawa, T. and Higo, Y.: On an Automatic Function Point Measurement from Source Codes, in 2nd Workshop on Accountability and Traceability in Global Software Engineering (ATGSE2008), 2008, pp. 27–28. [ 9 ] Kusumoto, S., Imagawa, M., Inoue, K., Morimoto, S., Matsushita, K. and Tsuda, M.: Function Point Measurement from Java Program, in Proc. 24th International Conference on Software Engineering (ICSE2002), 2002, pp. 576–582. [10] 永井洋一, シムウォンボ, 三輪誠, 近山隆 : 機械学習 を用いたプログラムの表層的特徴による分類, 第 9 回プ ログラミングおよびシステムに関するワークショップ, 2006. [11] 門田暁人, 内田眞司, 松本健一 : 実装者に依存しな いプログラム規模の測定に向けて, ソフトウェア工学の 基礎 XVII FOSE 2010, 2010, pp. 25–34. [12] Resource Standard Metrics, http://msquaredtechnologies.com/m2rsm/ [13] Weyuker, E.: Evaluating software complexity measures, IEEE Transactions on Software Engineering, Vol. 14, No. 9 (1988), pp. 1357–1365..

(7)

表 1 実装された 8 パズルプログラムの特徴 P 主なコーディング 改 SLOC 関数 仮引数 トーク トークン クローン クローン Tips 行 の数 の総数 ン数 種類数 量 含有率 P A キュー, リスト, ハッシュ 165 9 7 991 114 57 5.8% P B キュー, ハッシュ 203 8 7 1406 154 351 25.0% P C キュー, リスト, ハッシュ 119 4 2 883 100 153 17.4% P D 3 次元配 列 ○ 329 1 0 3342 107 2
表 3 8 パズルプログラムの SLOC と ALOC の比較

参照

関連したドキュメント

平成 28 年度については、介助の必要な入居者 3 名が亡くなりました。三人について

新設される危険物の規制に関する規則第 39 条の 3 の 2 には「ガソリンを販売するために容器に詰め 替えること」が規定されています。しかし、令和元年

・条例第 37 条・第 62 条において、軽微なものなど規則で定める変更については、届出が不要とされ、その具 体的な要件が規則に定められている(規則第

基準の電力は,原則として次のいずれかを基準として決定するも

それゆえ︑規則制定手続を継続するためには︑委員会は︑今

基準の電力は,原則として次のいずれかを基準として各時間帯別

 次に、羽の模様も見てみますと、これは粒粒で丸い 模様 (図 3-1) があり、ここには三重の円 (図 3-2) が あります。またここは、 斜めの線