diff --git a/lecture-impl.html b/lecture-impl.html index 9ed9756..4f3e150 100644 --- a/lecture-impl.html +++ b/lecture-impl.html @@ -35,7 +35,7 @@

開発者が知っておくべきトピック集
-実装編-・コメントはない方が良い
・動くの先にある良いプログラム
・良いプログラムとは?
-Don't call us, we'll call you
+"Don't call us, we'll call you"
・goto不要論からの学び
・できないことを増やす
・Complex vs Complicated
@@ -48,7 +48,7 @@

SWEBOK

Software Engineering Body of Knowledge
IEEEが作っているSEの知識体系

知識や概念の「体系化・構造化」が目的
-例:生物分類 脊索動物門 > 哺乳綱 > サル目 > サル科 > ...

+例:節足動物門 > 昆虫綱 > コウチュウ目 > カブトムシ亜目 ...

内容は薄くて広い
構造付きの辞書とみなすと良い

他にもいろいろなBOKがある

@@ -124,7 +124,7 @@

開発者が知っておくべきトピック集
-実装編-・コメントはない方が良い
・動くの先にある良いプログラム
・良いプログラムとは?
-Don't call us, we'll call you
+"Don't call us, we'll call you"
・goto不要論からの学び
・できないことを増やす
・Complex vs Complicated
@@ -258,7 +258,7 @@

開発者が知っておくべきトピック集
-実装編-・コメントはない方が良い
・動くの先にある良いプログラム
・良いプログラムとは?
-Don't call us, we'll call you
+"Don't call us, we'll call you"
・goto不要論からの学び
・できないことを増やす
・Complex vs Complicated
@@ -335,7 +335,7 @@

開発者が知っておくべきトピック集
-実装編-・コメントはない方が良い
・動くの先にある良いプログラム
・良いプログラムとは?
-Don't call us, we'll call you
+"Don't call us, we'll call you"
・goto不要論からの学び
・できないことを増やす
・Complex vs Complicated
@@ -343,7 +343,7 @@

開発者が知っておくべきトピック集
-実装編-・DRY・KISS・YAGNI

-

Don't call us, we'll call you

+

"Don't call us, we'll call you"

制御の反転・ハリウッド原則

制御の主となるmain()を自分で書かない
フレームワークはこの考えに基づく

@@ -515,7 +515,7 @@

開発者が知っておくべきトピック集
-実装編-・コメントはない方が良い
・動くの先にある良いプログラム
・良いプログラムとは?
-Don't call us, we'll call you
+"Don't call us, we'll call you"
・goto不要論からの学び
・できないことを増やす
・Complex vs Complicated
@@ -625,7 +625,7 @@

開発者が知っておくべきトピック集
-実装編-・コメントはない方が良い
・動くの先にある良いプログラム
・良いプログラムとは?
-Don't call us, we'll call you
+"Don't call us, we'll call you"
・goto不要論からの学び
・できないことを増やす
・Complex vs Complicated
diff --git a/lecture-impl.md b/lecture-impl.md index 805773c..c53200a 100644 --- a/lecture-impl.md +++ b/lecture-impl.md @@ -35,7 +35,7 @@ B3授業 (演習D・実験B) の経験から考える ・コメントはない方が良い ・動くの先にある良いプログラム ・良いプログラムとは? -・_Don't call us, we'll call you_ +・_"Don't call us, we'll call you"_ ・goto不要論からの学び ・できないことを増やす ・Complex vs Complicated @@ -49,7 +49,7 @@ Software Engineering Body of Knowledge IEEEが作っているSEの知識体系 知識や概念の「体系化・構造化」が目的 -例:生物分類 `脊索動物門 > 哺乳綱 > サル目 > サル科 > ...` +例:`節足動物門 > 昆虫綱 > コウチュウ目 > カブトムシ亜目 ...` 内容は薄くて広い 構造付きの辞書とみなすと良い @@ -133,7 +133,7 @@ Data Management BOK ・コメントはない方が良い ・動くの先にある良いプログラム ・良いプログラムとは? -・_Don't call us, we'll call you_ +・_"Don't call us, we'll call you"_ ・goto不要論からの学び ・できないことを増やす ・Complex vs Complicated @@ -307,7 +307,7 @@ Pattern.compile("^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"); ・コメントはない方が良い ・動くの先にある良いプログラム ・良いプログラムとは? -・_Don't call us, we'll call you_ +・_"Don't call us, we'll call you"_ ・goto不要論からの学び ・できないことを増やす ・Complex vs Complicated @@ -403,7 +403,7 @@ Web検索による断片的知識でも怪しい ・コメントはない方が良い ・動くの先にある良いプログラム ・良いプログラムとは? -・_Don't call us, we'll call you_ +・_"Don't call us, we'll call you"_ ・goto不要論からの学び ・できないことを増やす ・Complex vs Complicated @@ -411,7 +411,7 @@ Web検索による断片的知識でも怪しい ・DRY・KISS・YAGNI --- -# _Don't call us, we'll call you_ +# _"Don't call us, we'll call you"_ ## 制御の反転・ハリウッド原則 制御の主となるmain()を自分で書かない フレームワークはこの考えに基づく @@ -622,7 +622,7 @@ let mut y = 5; // 可変 ・コメントはない方が良い ・動くの先にある良いプログラム ・良いプログラムとは? -・_Don't call us, we'll call you_ +・_"Don't call us, we'll call you"_ ・goto不要論からの学び ・できないことを増やす ・Complex vs Complicated @@ -759,7 +759,7 @@ public class Y implements X { ・コメントはない方が良い ・動くの先にある良いプログラム ・良いプログラムとは? -・_Don't call us, we'll call you_ +・_"Don't call us, we'll call you"_ ・goto不要論からの学び ・できないことを増やす ・Complex vs Complicated diff --git a/lecture-test.html b/lecture-test.html index 9506e18..ea78aa5 100644 --- a/lecture-test.html +++ b/lecture-test.html @@ -10,11 +10,11 @@ * @size 4:3 960px 720px */div#p>svg>foreignObject>section{--color-prettylights-syntax-comment:#6e7781;--color-prettylights-syntax-constant:#0550ae;--color-prettylights-syntax-entity:#8250df;--color-prettylights-syntax-storage-modifier-import:#24292f;--color-prettylights-syntax-entity-tag:#116329;--color-prettylights-syntax-keyword:#cf222e;--color-prettylights-syntax-string:#0a3069;--color-prettylights-syntax-variable:#953800;--color-prettylights-syntax-brackethighlighter-unmatched:#82071e;--color-prettylights-syntax-invalid-illegal-text:#f6f8fa;--color-prettylights-syntax-invalid-illegal-bg:#82071e;--color-prettylights-syntax-carriage-return-text:#f6f8fa;--color-prettylights-syntax-carriage-return-bg:#cf222e;--color-prettylights-syntax-string-regexp:#116329;--color-prettylights-syntax-markup-list:#3b2300;--color-prettylights-syntax-markup-heading:#0550ae;--color-prettylights-syntax-markup-italic:#24292f;--color-prettylights-syntax-markup-bold:#24292f;--color-prettylights-syntax-markup-deleted-text:#82071e;--color-prettylights-syntax-markup-deleted-bg:#ffebe9;--color-prettylights-syntax-markup-inserted-text:#116329;--color-prettylights-syntax-markup-inserted-bg:#dafbe1;--color-prettylights-syntax-markup-changed-text:#953800;--color-prettylights-syntax-markup-changed-bg:#ffd8b5;--color-prettylights-syntax-markup-ignored-text:#eaeef2;--color-prettylights-syntax-markup-ignored-bg:#0550ae;--color-prettylights-syntax-meta-diff-range:#8250df;--color-prettylights-syntax-brackethighlighter-angle:#57606a;--color-prettylights-syntax-sublimelinter-gutter-mark:#8c959f;--color-prettylights-syntax-constant-other-reference-link:#0a3069;--color-fg-default:#24292f;--color-fg-muted:#57606a;--color-fg-subtle:#6e7781;--color-canvas-default:#fff;--color-canvas-subtle:#f6f8fa;--color-border-default:#d0d7de;--color-border-muted:#d8dee4;--color-neutral-muted:rgba(175,184,193,.2);--color-accent-fg:#0969da;--color-accent-emphasis:#0969da;--color-attention-subtle:#fff8c5;--color-danger-fg:#cf222e;color-scheme:light}div#p>svg>foreignObject>section:where(.invert){--color-prettylights-syntax-comment:#8b949e;--color-prettylights-syntax-constant:#79c0ff;--color-prettylights-syntax-entity:#d2a8ff;--color-prettylights-syntax-storage-modifier-import:#c9d1d9;--color-prettylights-syntax-entity-tag:#7ee787;--color-prettylights-syntax-keyword:#ff7b72;--color-prettylights-syntax-string:#a5d6ff;--color-prettylights-syntax-variable:#ffa657;--color-prettylights-syntax-brackethighlighter-unmatched:#f85149;--color-prettylights-syntax-invalid-illegal-text:#f0f6fc;--color-prettylights-syntax-invalid-illegal-bg:#8e1519;--color-prettylights-syntax-carriage-return-text:#f0f6fc;--color-prettylights-syntax-carriage-return-bg:#b62324;--color-prettylights-syntax-string-regexp:#7ee787;--color-prettylights-syntax-markup-list:#f2cc60;--color-prettylights-syntax-markup-heading:#1f6feb;--color-prettylights-syntax-markup-italic:#c9d1d9;--color-prettylights-syntax-markup-bold:#c9d1d9;--color-prettylights-syntax-markup-deleted-text:#ffdcd7;--color-prettylights-syntax-markup-deleted-bg:#67060c;--color-prettylights-syntax-markup-inserted-text:#aff5b4;--color-prettylights-syntax-markup-inserted-bg:#033a16;--color-prettylights-syntax-markup-changed-text:#ffdfb6;--color-prettylights-syntax-markup-changed-bg:#5a1e02;--color-prettylights-syntax-markup-ignored-text:#c9d1d9;--color-prettylights-syntax-markup-ignored-bg:#1158c7;--color-prettylights-syntax-meta-diff-range:#d2a8ff;--color-prettylights-syntax-brackethighlighter-angle:#8b949e;--color-prettylights-syntax-sublimelinter-gutter-mark:#484f58;--color-prettylights-syntax-constant-other-reference-link:#a5d6ff;--color-fg-default:#c9d1d9;--color-fg-muted:#8b949e;--color-fg-subtle:#6e7681;--color-canvas-default:#0d1117;--color-canvas-subtle:#161b22;--color-border-default:#30363d;--color-border-muted:#21262d;--color-neutral-muted:hsla(215,8%,47%,.4);--color-accent-fg:#58a6ff;--color-accent-emphasis:#1f6feb;--color-attention-subtle:rgba(187,128,9,.15);--color-danger-fg:#f85149;color-scheme:dark}div#p>svg>foreignObject>section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;word-wrap:break-word;background-color:var(--color-canvas-default);color:var(--color-fg-default);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;font-size:16px;line-height:1.5;margin:0}div#p>svg>foreignObject>section{--marpit-root-font-size:16px}div#p>svg>foreignObject>section :is(h1,marp-h1):hover .anchor .octicon-link:before,div#p>svg>foreignObject>section :is(h2,marp-h2):hover .anchor .octicon-link:before,div#p>svg>foreignObject>section :is(h3,marp-h3):hover .anchor .octicon-link:before,div#p>svg>foreignObject>section :is(h4,marp-h4):hover .anchor .octicon-link:before,div#p>svg>foreignObject>section :is(h5,marp-h5):hover .anchor .octicon-link:before,div#p>svg>foreignObject>section :is(h6,marp-h6):hover .anchor .octicon-link:before{background-color:currentColor;content:" ";display:inline-block;height:16px;-webkit-mask-image:url('data:image/svg+xml;charset=utf-8,');mask-image:url('data:image/svg+xml;charset=utf-8,');width:16px}div#p>svg>foreignObject>section details,div#p>svg>foreignObject>section figcaption,div#p>svg>foreignObject>section figure{display:block}div#p>svg>foreignObject>section summary{display:list-item}div#p>svg>foreignObject>section [hidden]{display:none!important}div#p>svg>foreignObject>section a{background-color:transparent;color:var(--color-accent-fg);text-decoration:none}div#p>svg>foreignObject>section abbr[title]{border-bottom:none;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}div#p>svg>foreignObject>section b,div#p>svg>foreignObject>section strong{font-weight:var(--base-text-weight-semibold,600)}div#p>svg>foreignObject>section dfn{font-style:italic}div#p>svg>foreignObject>section :is(h1,marp-h1){border-bottom:1px solid var(--color-border-muted);font-size:2em;font-weight:var(--base-text-weight-semibold,600);margin:.67em 0;padding-bottom:.3em}div#p>svg>foreignObject>section mark{background-color:var(--color-attention-subtle);color:var(--color-fg-default)}div#p>svg>foreignObject>section small{font-size:90%}div#p>svg>foreignObject>section sub,div#p>svg>foreignObject>section sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}div#p>svg>foreignObject>section sub{bottom:-.25em}div#p>svg>foreignObject>section sup{top:-.5em}div#p>svg>foreignObject>section img{background-color:var(--color-canvas-default);border-style:none;box-sizing:content-box;max-width:100%}div#p>svg>foreignObject>section :is(pre,marp-pre),div#p>svg>foreignObject>section code,div#p>svg>foreignObject>section kbd,div#p>svg>foreignObject>section samp{font-family:monospace;font-size:1em}div#p>svg>foreignObject>section figure{margin:1em 40px}div#p>svg>foreignObject>section hr{background:transparent;background-color:var(--color-border-default);border:0;box-sizing:content-box;height:.25em;margin:24px 0;overflow:hidden;padding:0}div#p>svg>foreignObject>section input{font:inherit;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;overflow:visible}div#p>svg>foreignObject>section [type=button],div#p>svg>foreignObject>section [type=reset],div#p>svg>foreignObject>section [type=submit]{-webkit-appearance:button}div#p>svg>foreignObject>section [type=checkbox],div#p>svg>foreignObject>section [type=radio]{box-sizing:border-box;padding:0}div#p>svg>foreignObject>section [type=number]::-webkit-inner-spin-button,div#p>svg>foreignObject>section [type=number]::-webkit-outer-spin-button{height:auto}div#p>svg>foreignObject>section [type=search]::-webkit-search-cancel-button,div#p>svg>foreignObject>section [type=search]::-webkit-search-decoration{-webkit-appearance:none}div#p>svg>foreignObject>section ::-webkit-input-placeholder{color:inherit;opacity:.54}div#p>svg>foreignObject>section ::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}div#p>svg>foreignObject>section a:hover{text-decoration:underline}div#p>svg>foreignObject>section ::-moz-placeholder{color:var(--color-fg-subtle);opacity:1}div#p>svg>foreignObject>section ::placeholder{color:var(--color-fg-subtle);opacity:1}div#p>svg>foreignObject>section hr:after,div#p>svg>foreignObject>section hr:before{content:"";display:table}div#p>svg>foreignObject>section hr:after{clear:both}div#p>svg>foreignObject>section table{border-collapse:collapse;border-spacing:0;display:block;max-width:100%;overflow:auto;width:-moz-max-content;width:max-content}div#p>svg>foreignObject>section td,div#p>svg>foreignObject>section th{padding:0}div#p>svg>foreignObject>section details summary{cursor:pointer}div#p>svg>foreignObject>section details:not([open])>:not(summary){display:none!important}div#p>svg>foreignObject>section [role=button]:focus,div#p>svg>foreignObject>section a:focus,div#p>svg>foreignObject>section input[type=checkbox]:focus,div#p>svg>foreignObject>section input[type=radio]:focus{box-shadow:none;outline:2px solid var(--color-accent-fg);outline-offset:-2px}div#p>svg>foreignObject>section [role=button]:focus:not(:focus-visible),div#p>svg>foreignObject>section a:focus:not(:focus-visible),div#p>svg>foreignObject>section input[type=checkbox]:focus:not(:focus-visible),div#p>svg>foreignObject>section input[type=radio]:focus:not(:focus-visible){outline:1px solid transparent}div#p>svg>foreignObject>section [role=button]:focus-visible,div#p>svg>foreignObject>section a:focus-visible,div#p>svg>foreignObject>section input[type=checkbox]:focus-visible,div#p>svg>foreignObject>section input[type=radio]:focus-visible{box-shadow:none;outline:2px solid var(--color-accent-fg);outline-offset:-2px}div#p>svg>foreignObject>section a:not([class]):focus,div#p>svg>foreignObject>section a:not([class]):focus-visible,div#p>svg>foreignObject>section input[type=checkbox]:focus,div#p>svg>foreignObject>section input[type=checkbox]:focus-visible,div#p>svg>foreignObject>section input[type=radio]:focus,div#p>svg>foreignObject>section input[type=radio]:focus-visible{outline-offset:0}div#p>svg>foreignObject>section kbd{background-color:var(--color-canvas-subtle);border-bottom-color:var(--color-neutral-muted);border:1px solid var(--color-neutral-muted);border-radius:6px;box-shadow:inset 0 -1px 0 var(--color-neutral-muted);color:var(--color-fg-default);display:inline-block;font:11px ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;line-height:10px;padding:3px 5px;vertical-align:middle}div#p>svg>foreignObject>section :is(h1,marp-h1),div#p>svg>foreignObject>section :is(h2,marp-h2),div#p>svg>foreignObject>section :is(h3,marp-h3),div#p>svg>foreignObject>section :is(h4,marp-h4),div#p>svg>foreignObject>section :is(h5,marp-h5),div#p>svg>foreignObject>section :is(h6,marp-h6){font-weight:var(--base-text-weight-semibold,600);line-height:1.25;margin-bottom:16px;margin-top:24px}div#p>svg>foreignObject>section :is(h2,marp-h2){border-bottom:1px solid var(--color-border-muted);font-size:1.5em;padding-bottom:.3em}div#p>svg>foreignObject>section :is(h2,marp-h2),div#p>svg>foreignObject>section :is(h3,marp-h3){font-weight:var(--base-text-weight-semibold,600)}div#p>svg>foreignObject>section :is(h3,marp-h3){font-size:1.25em}div#p>svg>foreignObject>section :is(h4,marp-h4){font-size:1em}div#p>svg>foreignObject>section :is(h4,marp-h4),div#p>svg>foreignObject>section :is(h5,marp-h5){font-weight:var(--base-text-weight-semibold,600)}div#p>svg>foreignObject>section :is(h5,marp-h5){font-size:.875em}div#p>svg>foreignObject>section :is(h6,marp-h6){color:var(--color-fg-muted);font-size:.85em;font-weight:var(--base-text-weight-semibold,600)}div#p>svg>foreignObject>section p{margin-bottom:10px;margin-top:0}div#p>svg>foreignObject>section blockquote{border-left:.25em solid var(--color-border-default);color:var(--color-fg-muted);margin:0;padding:0 1em}div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section ul{margin-bottom:0;margin-top:0;padding-left:2em}div#p>svg>foreignObject>section ol ol,div#p>svg>foreignObject>section ul ol{list-style-type:lower-roman}div#p>svg>foreignObject>section ol ol ol,div#p>svg>foreignObject>section ol ul ol,div#p>svg>foreignObject>section ul ol ol,div#p>svg>foreignObject>section ul ul ol{list-style-type:lower-alpha}div#p>svg>foreignObject>section dd{margin-left:0}div#p>svg>foreignObject>section :is(pre,marp-pre),div#p>svg>foreignObject>section code,div#p>svg>foreignObject>section samp,div#p>svg>foreignObject>section tt{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace;font-size:12px}div#p>svg>foreignObject>section :is(pre,marp-pre){word-wrap:normal;margin-bottom:0;margin-top:0}div#p>svg>foreignObject>section .octicon{fill:currentColor;display:inline-block;overflow:visible!important;vertical-align:text-bottom}div#p>svg>foreignObject>section input::-webkit-inner-spin-button,div#p>svg>foreignObject>section input::-webkit-outer-spin-button{-webkit-appearance:none;appearance:none;margin:0}div#p>svg>foreignObject>section:after,div#p>svg>foreignObject>section:before{ /* content:""; */display:table}div#p>svg>foreignObject>section:after{clear:both}div#p>svg>foreignObject>section>:first-child{margin-top:0!important}div#p>svg>foreignObject>section>:last-child{margin-bottom:0!important}div#p>svg>foreignObject>section a:not([href]){color:inherit;text-decoration:none}div#p>svg>foreignObject>section .absent{color:var(--color-danger-fg)}div#p>svg>foreignObject>section .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}div#p>svg>foreignObject>section .anchor:focus{outline:none}div#p>svg>foreignObject>section :is(pre,marp-pre),div#p>svg>foreignObject>section blockquote,div#p>svg>foreignObject>section details,div#p>svg>foreignObject>section dl,div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section p,div#p>svg>foreignObject>section table,div#p>svg>foreignObject>section ul{margin-bottom:16px;margin-top:0}div#p>svg>foreignObject>section blockquote>:first-child{margin-top:0}div#p>svg>foreignObject>section blockquote>:last-child{margin-bottom:0}div#p>svg>foreignObject>section :is(h1,marp-h1) .octicon-link,div#p>svg>foreignObject>section :is(h2,marp-h2) .octicon-link,div#p>svg>foreignObject>section :is(h3,marp-h3) .octicon-link,div#p>svg>foreignObject>section :is(h4,marp-h4) .octicon-link,div#p>svg>foreignObject>section :is(h5,marp-h5) .octicon-link,div#p>svg>foreignObject>section :is(h6,marp-h6) .octicon-link{color:var(--color-fg-default);vertical-align:middle;visibility:hidden}div#p>svg>foreignObject>section :is(h1,marp-h1):hover .anchor,div#p>svg>foreignObject>section :is(h2,marp-h2):hover .anchor,div#p>svg>foreignObject>section :is(h3,marp-h3):hover .anchor,div#p>svg>foreignObject>section :is(h4,marp-h4):hover .anchor,div#p>svg>foreignObject>section :is(h5,marp-h5):hover .anchor,div#p>svg>foreignObject>section :is(h6,marp-h6):hover .anchor{text-decoration:none}div#p>svg>foreignObject>section :is(h1,marp-h1):hover .anchor .octicon-link,div#p>svg>foreignObject>section :is(h2,marp-h2):hover .anchor .octicon-link,div#p>svg>foreignObject>section :is(h3,marp-h3):hover .anchor .octicon-link,div#p>svg>foreignObject>section :is(h4,marp-h4):hover .anchor .octicon-link,div#p>svg>foreignObject>section :is(h5,marp-h5):hover .anchor .octicon-link,div#p>svg>foreignObject>section :is(h6,marp-h6):hover .anchor .octicon-link{visibility:visible}div#p>svg>foreignObject>section :is(h1,marp-h1) code,div#p>svg>foreignObject>section :is(h1,marp-h1) tt,div#p>svg>foreignObject>section :is(h2,marp-h2) code,div#p>svg>foreignObject>section :is(h2,marp-h2) tt,div#p>svg>foreignObject>section :is(h3,marp-h3) code,div#p>svg>foreignObject>section :is(h3,marp-h3) tt,div#p>svg>foreignObject>section :is(h4,marp-h4) code,div#p>svg>foreignObject>section :is(h4,marp-h4) tt,div#p>svg>foreignObject>section :is(h5,marp-h5) code,div#p>svg>foreignObject>section :is(h5,marp-h5) tt,div#p>svg>foreignObject>section :is(h6,marp-h6) code,div#p>svg>foreignObject>section :is(h6,marp-h6) tt{font-size:inherit;padding:0 .2em}div#p>svg>foreignObject>section summary :is(h1,marp-h1),div#p>svg>foreignObject>section summary :is(h2,marp-h2),div#p>svg>foreignObject>section summary :is(h3,marp-h3),div#p>svg>foreignObject>section summary :is(h4,marp-h4),div#p>svg>foreignObject>section summary :is(h5,marp-h5),div#p>svg>foreignObject>section summary :is(h6,marp-h6){display:inline-block}div#p>svg>foreignObject>section summary :is(h1,marp-h1) .anchor,div#p>svg>foreignObject>section summary :is(h2,marp-h2) .anchor,div#p>svg>foreignObject>section summary :is(h3,marp-h3) .anchor,div#p>svg>foreignObject>section summary :is(h4,marp-h4) .anchor,div#p>svg>foreignObject>section summary :is(h5,marp-h5) .anchor,div#p>svg>foreignObject>section summary :is(h6,marp-h6) .anchor{margin-left:-40px}div#p>svg>foreignObject>section summary :is(h1,marp-h1),div#p>svg>foreignObject>section summary :is(h2,marp-h2){border-bottom:0;padding-bottom:0}div#p>svg>foreignObject>section ol.no-list,div#p>svg>foreignObject>section ul.no-list{list-style-type:none;padding:0}div#p>svg>foreignObject>section ol[type=a]{list-style-type:lower-alpha}div#p>svg>foreignObject>section ol[type=A]{list-style-type:upper-alpha}div#p>svg>foreignObject>section ol[type=i]{list-style-type:lower-roman}div#p>svg>foreignObject>section ol[type=I]{list-style-type:upper-roman}div#p>svg>foreignObject>section div>ol:not([type]),div#p>svg>foreignObject>section ol[type="1"]{list-style-type:decimal}div#p>svg>foreignObject>section ol ol,div#p>svg>foreignObject>section ol ul,div#p>svg>foreignObject>section ul ol,div#p>svg>foreignObject>section ul ul{margin-bottom:0;margin-top:0}div#p>svg>foreignObject>section li>p{margin-top:16px}div#p>svg>foreignObject>section li+li{margin-top:.25em}div#p>svg>foreignObject>section dl{padding:0}div#p>svg>foreignObject>section dl dt{font-size:1em;font-style:italic;font-weight:var(--base-text-weight-semibold,600);margin-top:16px;padding:0}div#p>svg>foreignObject>section dl dd{margin-bottom:16px;padding:0 16px}div#p>svg>foreignObject>section table th{font-weight:var(--base-text-weight-semibold,600)}div#p>svg>foreignObject>section table td,div#p>svg>foreignObject>section table th{border:1px solid var(--color-border-default);padding:6px 13px}div#p>svg>foreignObject>section table tr{background-color:var(--color-canvas-default);border-top:1px solid var(--color-border-muted)}div#p>svg>foreignObject>section table tr:nth-child(2n){background-color:var(--color-canvas-subtle)}div#p>svg>foreignObject>section table img{background-color:transparent}div#p>svg>foreignObject>section img[align=right]{padding-left:20px}div#p>svg>foreignObject>section img[align=left]{padding-right:20px}div#p>svg>foreignObject>section .emoji{background-color:transparent;max-width:none;vertical-align:text-top}div#p>svg>foreignObject>section :is(span,marp-span).frame,div#p>svg>foreignObject>section :is(span,marp-span).frame>:is(span,marp-span){display:block;overflow:hidden}div#p>svg>foreignObject>section :is(span,marp-span).frame>:is(span,marp-span){border:1px solid var(--color-border-default);float:left;margin:13px 0 0;padding:7px;width:auto}div#p>svg>foreignObject>section :is(span,marp-span).frame :is(span,marp-span) img{display:block;float:left}div#p>svg>foreignObject>section :is(span,marp-span).frame :is(span,marp-span) :is(span,marp-span){clear:both;color:var(--color-fg-default);display:block;padding:5px 0 0}div#p>svg>foreignObject>section :is(span,marp-span).align-center{clear:both;display:block;overflow:hidden}div#p>svg>foreignObject>section :is(span,marp-span).align-center>:is(span,marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:center}div#p>svg>foreignObject>section :is(span,marp-span).align-center :is(span,marp-span) img{margin:0 auto;text-align:center}div#p>svg>foreignObject>section :is(span,marp-span).align-right{clear:both;display:block;overflow:hidden}div#p>svg>foreignObject>section :is(span,marp-span).align-right>:is(span,marp-span){display:block;margin:13px 0 0;overflow:hidden;text-align:right}div#p>svg>foreignObject>section :is(span,marp-span).align-right :is(span,marp-span) img{margin:0;text-align:right}div#p>svg>foreignObject>section :is(span,marp-span).float-left{display:block;float:left;margin-right:13px;overflow:hidden}div#p>svg>foreignObject>section :is(span,marp-span).float-left :is(span,marp-span){margin:13px 0 0}div#p>svg>foreignObject>section :is(span,marp-span).float-right{display:block;float:right;margin-left:13px;overflow:hidden}div#p>svg>foreignObject>section :is(span,marp-span).float-right>:is(span,marp-span){display:block;margin:13px auto 0;overflow:hidden;text-align:right}div#p>svg>foreignObject>section code,div#p>svg>foreignObject>section tt{background-color:var(--color-neutral-muted);border-radius:6px;font-size:85%;margin:0;padding:.2em .4em;white-space:break-spaces}div#p>svg>foreignObject>section code br,div#p>svg>foreignObject>section tt br{display:none}div#p>svg>foreignObject>section del code{text-decoration:inherit}div#p>svg>foreignObject>section samp{font-size:85%}div#p>svg>foreignObject>section :is(pre,marp-pre) code{font-size:100%}div#p>svg>foreignObject>section :is(pre,marp-pre)>code{background:transparent;border:0;margin:0;padding:0;white-space:pre;word-break:normal}div#p>svg>foreignObject>section .highlight{margin-bottom:16px}div#p>svg>foreignObject>section .highlight :is(pre,marp-pre){margin-bottom:0;word-break:normal}div#p>svg>foreignObject>section :is(pre,marp-pre){background-color:var(--color-canvas-subtle);border-radius:6px;font-size:85%;line-height:1.45;overflow:auto;padding:16px}div#p>svg>foreignObject>section :is(pre,marp-pre) code,div#p>svg>foreignObject>section :is(pre,marp-pre) tt{word-wrap:normal;background-color:transparent;border:0;display:inline;line-height:inherit;margin:0;max-width:auto;overflow:visible;padding:0}div#p>svg>foreignObject>section .csv-data td,div#p>svg>foreignObject>section .csv-data th{font-size:12px;line-height:1;overflow:hidden;padding:5px;text-align:left;white-space:nowrap}div#p>svg>foreignObject>section .csv-data .blob-num{background:var(--color-canvas-default);border:0;padding:10px 8px 9px;text-align:right}div#p>svg>foreignObject>section .csv-data tr{border-top:0}div#p>svg>foreignObject>section .csv-data th{background:var(--color-canvas-subtle);border-top:0;font-weight:var(--base-text-weight-semibold,600)}div#p>svg>foreignObject>section [data-footnote-ref]:before{content:"["}div#p>svg>foreignObject>section [data-footnote-ref]:after{content:"]"}div#p>svg>foreignObject>section .footnotes{border-top:1px solid var(--color-border-default);color:var(--color-fg-muted);font-size:12px}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.footnotes{--marpit-root-font-size:12px}div#p>svg>foreignObject>section .footnotes ol{padding-left:16px}div#p>svg>foreignObject>section .footnotes ol ul{display:inline-block;margin-top:16px;padding-left:16px}div#p>svg>foreignObject>section .footnotes li{position:relative}div#p>svg>foreignObject>section .footnotes li:target:before{border:2px solid var(--color-accent-emphasis);border-radius:6px;bottom:-8px;content:"";left:-24px;pointer-events:none;position:absolute;right:-8px;top:-8px}div#p>svg>foreignObject>section .footnotes li:target{color:var(--color-fg-default)}div#p>svg>foreignObject>section .footnotes .data-footnote-backref g-emoji{font-family:monospace}div#p>svg>foreignObject>section .pl-c{color:var(--color-prettylights-syntax-comment)}div#p>svg>foreignObject>section .pl-c1,div#p>svg>foreignObject>section .pl-s .pl-v{color:var(--color-prettylights-syntax-constant)}div#p>svg>foreignObject>section .pl-e,div#p>svg>foreignObject>section .pl-en{color:var(--color-prettylights-syntax-entity)}div#p>svg>foreignObject>section .pl-s .pl-s1,div#p>svg>foreignObject>section .pl-smi{color:var(--color-prettylights-syntax-storage-modifier-import)}div#p>svg>foreignObject>section .pl-ent{color:var(--color-prettylights-syntax-entity-tag)}div#p>svg>foreignObject>section .pl-k{color:var(--color-prettylights-syntax-keyword)}div#p>svg>foreignObject>section .pl-pds,div#p>svg>foreignObject>section .pl-s,div#p>svg>foreignObject>section .pl-s .pl-pse .pl-s1,div#p>svg>foreignObject>section .pl-sr,div#p>svg>foreignObject>section .pl-sr .pl-cce,div#p>svg>foreignObject>section .pl-sr .pl-sra,div#p>svg>foreignObject>section .pl-sr .pl-sre{color:var(--color-prettylights-syntax-string)}div#p>svg>foreignObject>section .pl-smw,div#p>svg>foreignObject>section .pl-v{color:var(--color-prettylights-syntax-variable)}div#p>svg>foreignObject>section .pl-bu{color:var(--color-prettylights-syntax-brackethighlighter-unmatched)}div#p>svg>foreignObject>section .pl-ii{background-color:var(--color-prettylights-syntax-invalid-illegal-bg);color:var(--color-prettylights-syntax-invalid-illegal-text)}div#p>svg>foreignObject>section .pl-c2{background-color:var(--color-prettylights-syntax-carriage-return-bg);color:var(--color-prettylights-syntax-carriage-return-text)}div#p>svg>foreignObject>section .pl-sr .pl-cce{color:var(--color-prettylights-syntax-string-regexp);font-weight:700}div#p>svg>foreignObject>section .pl-ml{color:var(--color-prettylights-syntax-markup-list)}div#p>svg>foreignObject>section .pl-mh,div#p>svg>foreignObject>section .pl-mh .pl-en,div#p>svg>foreignObject>section .pl-ms{color:var(--color-prettylights-syntax-markup-heading);font-weight:700}div#p>svg>foreignObject>section .pl-mi{color:var(--color-prettylights-syntax-markup-italic);font-style:italic}div#p>svg>foreignObject>section .pl-mb{color:var(--color-prettylights-syntax-markup-bold);font-weight:700}div#p>svg>foreignObject>section .pl-md{background-color:var(--color-prettylights-syntax-markup-deleted-bg);color:var(--color-prettylights-syntax-markup-deleted-text)}div#p>svg>foreignObject>section .pl-mi1{background-color:var(--color-prettylights-syntax-markup-inserted-bg);color:var(--color-prettylights-syntax-markup-inserted-text)}div#p>svg>foreignObject>section .pl-mc{background-color:var(--color-prettylights-syntax-markup-changed-bg);color:var(--color-prettylights-syntax-markup-changed-text)}div#p>svg>foreignObject>section .pl-mi2{background-color:var(--color-prettylights-syntax-markup-ignored-bg);color:var(--color-prettylights-syntax-markup-ignored-text)}div#p>svg>foreignObject>section .pl-mdr{color:var(--color-prettylights-syntax-meta-diff-range);font-weight:700}div#p>svg>foreignObject>section .pl-ba{color:var(--color-prettylights-syntax-brackethighlighter-angle)}div#p>svg>foreignObject>section .pl-sg{color:var(--color-prettylights-syntax-sublimelinter-gutter-mark)}div#p>svg>foreignObject>section .pl-corl{color:var(--color-prettylights-syntax-constant-other-reference-link);text-decoration:underline}div#p>svg>foreignObject>section g-emoji{display:inline-block;font-family:Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1em;font-style:normal!important;font-weight:var(--base-text-weight-normal,400);line-height:1;min-width:1ch;vertical-align:-.075em}div#p>svg>foreignObject>section g-emoji img{height:1em;width:1em}div#p>svg>foreignObject>section .task-list-item{list-style-type:none}div#p>svg>foreignObject>section .task-list-item label{font-weight:var(--base-text-weight-normal,400)}div#p>svg>foreignObject>section .task-list-item.enabled label{cursor:pointer}div#p>svg>foreignObject>section .task-list-item+.task-list-item{margin-top:4px}div#p>svg>foreignObject>section .task-list-item .handle{display:none}div#p>svg>foreignObject>section .task-list-item-checkbox{margin:0 .2em .25em -1.4em;vertical-align:middle}div#p>svg>foreignObject>section .contains-task-list:dir(rtl) .task-list-item-checkbox{margin:0 -1.6em .25em .2em}div#p>svg>foreignObject>section .contains-task-list{position:relative}div#p>svg>foreignObject>section .contains-task-list:focus-within .task-list-item-convert-container,div#p>svg>foreignObject>section .contains-task-list:hover .task-list-item-convert-container{clip:auto;display:block;height:24px;overflow:visible;width:auto}div#p>svg>foreignObject>section ::-webkit-calendar-picker-indicator{filter:invert(50%)}div#p>svg>foreignObject>section :is(h1,marp-h1){color:var(--h1-color);font-size:1.6em}div#p>svg>foreignObject>section :is(h1,marp-h1),div#p>svg>foreignObject>section :is(h2,marp-h2){border-bottom:none}div#p>svg>foreignObject>section :is(h2,marp-h2){font-size:1.3em}div#p>svg>foreignObject>section :is(h3,marp-h3){font-size:1.1em}div#p>svg>foreignObject>section :is(h4,marp-h4){font-size:1.05em}div#p>svg>foreignObject>section :is(h5,marp-h5){font-size:1em}div#p>svg>foreignObject>section :is(h6,marp-h6){font-size:.9em}div#p>svg>foreignObject>section :is(h1,marp-h1) strong,div#p>svg>foreignObject>section :is(h2,marp-h2) strong,div#p>svg>foreignObject>section :is(h3,marp-h3) strong,div#p>svg>foreignObject>section :is(h4,marp-h4) strong,div#p>svg>foreignObject>section :is(h5,marp-h5) strong,div#p>svg>foreignObject>section :is(h6,marp-h6) strong{color:var(--heading-strong-color);font-weight:inherit}div#p>svg>foreignObject>section :is(h1,marp-h1)::part(auto-scaling),div#p>svg>foreignObject>section :is(h2,marp-h2)::part(auto-scaling),div#p>svg>foreignObject>section :is(h3,marp-h3)::part(auto-scaling),div#p>svg>foreignObject>section :is(h4,marp-h4)::part(auto-scaling),div#p>svg>foreignObject>section :is(h5,marp-h5)::part(auto-scaling),div#p>svg>foreignObject>section :is(h6,marp-h6)::part(auto-scaling){max-height:563px}div#p>svg>foreignObject>section hr{height:0;padding-top:.25em}div#p>svg>foreignObject>section :is(pre,marp-pre){border:1px solid var(--color-border-default);line-height:1.15;overflow:visible}div#p>svg>foreignObject>section :is(pre,marp-pre)::part(auto-scaling){max-height:529px}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs){color:var(--color-prettylights-syntax-storage-modifier-import)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-doctag),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-keyword),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-meta .hljs-keyword),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-template-tag),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-template-variable),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-type),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-variable.language_){color:var(--color-prettylights-syntax-keyword)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-title),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-title.class_),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-title.class_.inherited__),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-title.function_){color:var(--color-prettylights-syntax-entity)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-attr),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-attribute),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-literal),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-meta),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-number),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-operator),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-selector-attr),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-selector-class),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-selector-id),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-variable){color:var(--color-prettylights-syntax-constant)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-meta .hljs-string),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-regexp),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-string){color:var(--color-prettylights-syntax-string)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-built_in),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-symbol){color:var(--color-prettylights-syntax-variable)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-code),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-comment),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-formula){color:var(--color-prettylights-syntax-comment)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-name),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-quote),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-selector-pseudo),div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-selector-tag){color:var(--color-prettylights-syntax-entity-tag)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-subst){color:var(--color-prettylights-syntax-storage-modifier-import)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-section){color:var(--color-prettylights-syntax-markup-heading);font-weight:700}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-bullet){color:var(--color-prettylights-syntax-markup-list)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-emphasis){color:var(--color-prettylights-syntax-markup-italic);font-style:italic}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-strong){color:var(--color-prettylights-syntax-markup-bold);font-weight:700}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-addition){background-color:var(--color-prettylights-syntax-markup-inserted-bg);color:var(--color-prettylights-syntax-markup-inserted-text)}div#p>svg>foreignObject>section :is(pre,marp-pre) :where(.hljs-deletion){background-color:var(--color-prettylights-syntax-markup-deleted-bg);color:var(--color-prettylights-syntax-markup-deleted-text)}div#p>svg>foreignObject>section footer,div#p>svg>foreignObject>section header{color:var(--header-footer-color);font-size:18px;left:30px;margin:0;position:absolute}div#p>svg>foreignObject>section header{top:21px}div#p>svg>foreignObject>section footer{bottom:21px}div#p>svg>foreignObject>section{--h1-color:#246;--header-footer-color:hsla(0,0%,40%,.75);--heading-strong-color:#48c;--paginate-color:#777;align-items:stretch;display:flex;flex-flow:column nowrap;font-size:29px;height:720px;justify-content:center;padding:78.5px;width:1280px}div#p>svg>foreignObject>section{--marpit-root-font-size:29px}div#p>svg>foreignObject>section:where(.invert){--h1-color:#cee7ff;--header-footer-color:hsla(0,0%,60%,.75);--heading-strong-color:#7bf;--paginate-color:#999}div#p>svg>foreignObject>section>:last-child,div#p>svg>foreignObject>section[data-footer]>:nth-last-child(2){margin-bottom:0}div#p>svg>foreignObject>section>:first-child,div#p>svg>foreignObject>section>header:first-child+*{margin-top:0}div#p>svg>foreignObject>section:after{bottom:21px;color:var(--paginate-color);font-size:24px;padding:0;position:absolute;right:30px}div#p>svg>foreignObject>section:after{--marpit-root-font-size:24px}div#p>svg>foreignObject>section[data-color] :is(h1,marp-h1),div#p>svg>foreignObject>section[data-color] :is(h2,marp-h2),div#p>svg>foreignObject>section[data-color] :is(h3,marp-h3),div#p>svg>foreignObject>section[data-color] :is(h4,marp-h4),div#p>svg>foreignObject>section[data-color] :is(h5,marp-h5),div#p>svg>foreignObject>section[data-color] :is(h6,marp-h6){color:currentcolor}div#p>svg>foreignObject>section img[data-marp-twemoji]{background:transparent;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em;width:1em} -/* @theme shin */div#p>svg>foreignObject>:where(section):not([root]){--color-font-main:#012F4B;--color-font-sub:#0f3b57;--color-font-accent:rgb(201,57,64);--color-background:#EBEEF9}div#p>svg>foreignObject>section{font-family:"Noto Sans","Noto Sans JP";justify-content:start;background-color:var(--color-background);color:var(--color-font-main);padding:30px 70px}div#p>svg>foreignObject>section ::selection{background-color:rgba(255,255,0,0.5)}div#p>svg>foreignObject>section.title{padding-top:400px}div#p>svg>foreignObject>section sub{bottom:0}div#p>svg>foreignObject>section :is(pre,marp-pre),div#p>svg>foreignObject>section blockquote,div#p>svg>foreignObject>section code{font-family:consolas,"Noto Sans JP";color:var(--color-font-sub);background-color:white;font-weight:500;padding:3px 6px;border:1px solid var(--color-font-main)}div#p>svg>foreignObject>section p:has(+marp-pre){margin-bottom:0;padding-bottom:5px}div#p>svg>foreignObject>section code{font-size:70%;vertical-align:middle}div#p>svg>foreignObject>section :is(pre,marp-pre){margin-left:30px}div#p>svg>foreignObject>section :is(h1,marp-h1){padding:0;font-size:200%;font-weight:900;color:var(--color-font-main)}div#p>svg>foreignObject>section :is(h2,marp-h2){margin:0;padding:10px 0 0 0;color:var(--color-font-main);font-weight:900;padding-bottom:5px}div#p>svg>foreignObject>section ul{list-style-type:"- ";margin-top:0;padding-top:0}div#p>svg>foreignObject>section ol{padding-inline-start:45px}div#p>svg>foreignObject>section u,div#p>svg>foreignObject>section u::selection{text-decoration:underline 8pt;text-decoration-color:#ffc3d6;text-underline-offset:-3px}div#p>svg>foreignObject>section li,div#p>svg>foreignObject>section p{color:var(--color-font-sub);margin-left:30px;font-weight:500;font-size:120%;line-height:1.2;margin-top:0}div#p>svg>foreignObject>section li+li{margin-top:0}div#p>svg>foreignObject>section brr{display:block;content:"";margin-top:.5lh}div#p>svg>foreignObject>section.outline .disabled{color:hsl(203,43%,56%,60%)}div#p>svg>foreignObject>section:after{color:#9badbe}div#p>svg>foreignObject>section blockquote{background-color:#dadfec;position:relative;border:none;padding-left:40px}div#p>svg>foreignObject>section blockquote:after{content:"“";font-family:Arial;font-size:500%;color:#8697a7;display:block;position:absolute;left:5px;top:-55px;bottom:0;margin:auto}div#p>svg>foreignObject>section div.corner-triangle{display:block;width:0px;height:0px;border-style:solid;border-width:0 150px 150px 0;border-color:transparent #608A32 transparent transparent;position:fixed;top:0;right:0;color:white}div#p>svg>foreignObject>section div.corner-triangle .corner-triangle-text{position:relative;top:40px;right:-60px;width:100px;font-family:consolas,"Noto Sans JP";font-weight:600;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}div#p>svg>foreignObject>section div.corner-triangle .corner-triangle-text :is(span,marp-span).corner-triangle-firstline{margin-left:29px}div#p>svg>foreignObject>section div.corner-triangle .corner-triangle-text a{color:white}div#p>svg>foreignObject>section .bespoke-marp-osc{display:hidden}div#p>svg>foreignObject>section.outline{background-color:var(--color-font-sub)}div#p>svg>foreignObject>section.outline>.corner-triangle{border-color:transparent var(--color-font-accent) transparent transparent}div#p>svg>foreignObject>section.outline p{margin-left:0}div#p>svg>foreignObject>section.outline :is(h1,marp-h1){font-size:160%}div#p>svg>foreignObject>section.outline :is(h1,marp-h1),div#p>svg>foreignObject>section.outline :is(h2,marp-h2),div#p>svg>foreignObject>section.outline :is(h3,marp-h3),div#p>svg>foreignObject>section.outline li,div#p>svg>foreignObject>section.outline p,div#p>svg>foreignObject>section.outline ul{color:#eff3f5}div#p>svg>foreignObject>section p:has(subb){font-size:70%;font-weight:400}div#p>svg>foreignObject>section .logo{position:absolute;font-family:consolas;font-size:120%;font-weight:bold;line-height:200px;left:630px;top:340px;width:200px;height:200px;border-radius:50%;color:var(--color-background);text-align:center;background:var(--color-font-main)}div#p>svg>foreignObject>section section.logo{--marpit-root-font-size:120%}div#p>svg>foreignObject>section{width:960px;height:720px}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]{columns:initial!important;display:block!important;padding:0!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]:after,div#p>svg>foreignObject>section[data-marpit-advanced-background=background]:before,div#p>svg>foreignObject>section[data-marpit-advanced-background=content]:after,div#p>svg>foreignObject>section[data-marpit-advanced-background=content]:before{display:none!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction=vertical]{flex-direction:column}div#p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split]>div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split,50%)}div#p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split=right]>div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]>figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#p>svg>foreignObject>section[data-marpit-advanced-background=content],div#p>svg>foreignObject>section[data-marpit-advanced-background=pseudo]{background:transparent!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=pseudo],div#p>svg[data-marpit-svg]>foreignObject[data-marpit-advanced-background=pseudo]{pointer-events:none!important}div#p>svg>foreignObject>section[data-marpit-advanced-background-split]{width:100%;height:100%}
+/* @theme shin */div#p>svg>foreignObject>:where(section):not([root]){--color-font-main:#012F4B;--color-font-sub:#0f3b57;--color-font-accent:rgb(201,57,64);--color-background:#EBEEF9}div#p>svg>foreignObject>section{font-family:"Noto Sans","Noto Sans JP";justify-content:start;background-color:var(--color-background);color:var(--color-font-main);padding:30px 70px}div#p>svg>foreignObject>section ::selection{background-color:rgba(255,255,0,0.5)}div#p>svg>foreignObject>section.title{padding-top:400px}div#p>svg>foreignObject>section sub{bottom:0}div#p>svg>foreignObject>section :is(pre,marp-pre),div#p>svg>foreignObject>section blockquote,div#p>svg>foreignObject>section code{font-family:consolas,"Noto Sans JP";color:var(--color-font-sub);background-color:white;font-weight:500;padding:3px 6px;border:1px solid var(--color-font-main)}div#p>svg>foreignObject>section p:has(+marp-pre){margin-bottom:0;padding-bottom:5px}div#p>svg>foreignObject>section code{font-size:70%;vertical-align:middle}div#p>svg>foreignObject>section :is(pre,marp-pre){margin-left:30px}div#p>svg>foreignObject>section :is(h1,marp-h1){padding:0;font-size:200%;font-weight:900;color:var(--color-font-main)}div#p>svg>foreignObject>section :is(h2,marp-h2){margin:0;padding:10px 0 0 0;color:var(--color-font-main);font-weight:900;padding-bottom:5px}div#p>svg>foreignObject>section ul{list-style-type:"- ";margin-top:0;padding-top:0}div#p>svg>foreignObject>section ol{padding-inline-start:45px}div#p>svg>foreignObject>section u,div#p>svg>foreignObject>section u::selection{text-decoration:underline 8pt;text-decoration-color:#ffc3d6;text-underline-offset:-3px}div#p>svg>foreignObject>section li,div#p>svg>foreignObject>section p{color:var(--color-font-sub);margin-left:30px;font-weight:500;font-size:120%;line-height:1.2;margin-top:0}div#p>svg>foreignObject>section li+li{margin-top:0}div#p>svg>foreignObject>section brr{display:block;content:"";margin-top:.5lh}div#p>svg>foreignObject>section.outline .disabled{color:hsl(203,43%,56%,60%)}div#p>svg>foreignObject>section:after{color:#9badbe}div#p>svg>foreignObject>section blockquote{background-color:#dadfec;position:relative;border:none;padding-left:40px}div#p>svg>foreignObject>section blockquote:after{content:"“";font-family:Arial;font-size:500%;color:#8697a7;display:block;position:absolute;left:5px;top:-55px;bottom:0;margin:auto}div#p>svg>foreignObject>section div.corner-triangle{display:block;width:0px;height:0px;border-style:solid;border-width:0 150px 150px 0;border-color:transparent #608A32 transparent transparent;position:fixed;top:0;right:0;color:white}div#p>svg>foreignObject>section div.corner-triangle .corner-triangle-text{position:relative;top:40px;right:-60px;width:100px;font-family:consolas,"Noto Sans JP";font-weight:600;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-ms-transform:rotate(45deg);-o-transform:rotate(45deg);transform:rotate(45deg)}div#p>svg>foreignObject>section div.corner-triangle .corner-triangle-text :is(span,marp-span).corner-triangle-firstline{margin-left:29px}div#p>svg>foreignObject>section div.corner-triangle .corner-triangle-text a{color:white}div#p>svg>foreignObject>section .bespoke-marp-osc{display:hidden}div#p>svg>foreignObject>section.outline{background-color:var(--color-font-sub)}div#p>svg>foreignObject>section.outline>.corner-triangle{border-color:transparent var(--color-font-accent) transparent transparent}div#p>svg>foreignObject>section.outline p{margin-left:0}div#p>svg>foreignObject>section.outline :is(h1,marp-h1){font-size:160%}div#p>svg>foreignObject>section.outline :is(h1,marp-h1),div#p>svg>foreignObject>section.outline :is(h2,marp-h2),div#p>svg>foreignObject>section.outline :is(h3,marp-h3),div#p>svg>foreignObject>section.outline li,div#p>svg>foreignObject>section.outline p,div#p>svg>foreignObject>section.outline ul{color:#eff3f5}div#p>svg>foreignObject>section p:has(subb){font-size:70%;font-weight:400}div#p>svg>foreignObject>section .logo{position:absolute;font-family:consolas;font-size:120%;font-weight:bold;line-height:200px;left:630px;top:340px;width:200px;height:200px;border-radius:50%;color:var(--color-background);text-align:center;background:var(--color-font-main)}div#p>svg>foreignObject>section section.logo{--marpit-root-font-size:120%}div#p>svg>foreignObject>section{width:960px;height:720px}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]{columns:initial!important;display:block!important;padding:0!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]:after,div#p>svg>foreignObject>section[data-marpit-advanced-background=background]:before,div#p>svg>foreignObject>section[data-marpit-advanced-background=content]:after,div#p>svg>foreignObject>section[data-marpit-advanced-background=content]:before{display:none!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]{all:initial;display:flex;flex-direction:row;height:100%;overflow:hidden;width:100%}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container][data-marpit-advanced-background-direction=vertical]{flex-direction:column}div#p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split]>div[data-marpit-advanced-background-container]{width:var(--marpit-advanced-background-split,50%)}div#p>svg>foreignObject>section[data-marpit-advanced-background=background][data-marpit-advanced-background-split=right]>div[data-marpit-advanced-background-container]{margin-left:calc(100% - var(--marpit-advanced-background-split, 50%))}div#p>svg>foreignObject>section[data-marpit-advanced-background=background]>div[data-marpit-advanced-background-container]>figure{all:initial;background-position:center;background-repeat:no-repeat;background-size:cover;flex:auto;margin:0}div#p>svg>foreignObject>section[data-marpit-advanced-background=content],div#p>svg>foreignObject>section[data-marpit-advanced-background=pseudo]{background:transparent!important}div#p>svg>foreignObject>section[data-marpit-advanced-background=pseudo],div#p>svg[data-marpit-svg]>foreignObject[data-marpit-advanced-background=pseudo]{pointer-events:none!important}div#p>svg>foreignObject>section[data-marpit-advanced-background-split]{width:100%;height:100%}

ソフトウェア設計論

まつ本

-
+

開発者が知っておくべきトピック集
-実装編-

前回

・SWEBOK
@@ -29,7 +29,7 @@

開発者が知っておくべきトピック集
-実装編-・分割統治
・DRY・KISS・YAGNI

-
+

SWEBOK 目次

全15章

1. SW要求
@@ -49,7 +49,7 @@ 

全15章

15. エンジニアリング基礎
-
+

テストは面白い

プログラミングと似た面白さ

パズル的な面白さ
@@ -63,25 +63,24 @@

理論と実践の境界

様々なセオリーが存在する
勉強するほどうまくなる

-
+

開発者が知っておくべきトピック集
-テスト編-

-

・SWEBOK
-・SWテストの基本
+

・SWテストの基本
・手動テストは危険

-

・リファクタリング前にテスト
-・先にテストを書く
-・Clean code that works
-・バグを直す前にテストを落とす

+

・リファクタリングのためのテスト
+・バグ修正のためのテスト

+

・テストを先に書く開発スタイル
+・"Clean code that works"

・テストは証明ではない
・テストはユーザ第1号である

+

・SWEBOK

-
+

SWテスト

対象SWが意図通り動くかを検証するプロセス
-下流工程の一つ, 実装とほぼ1:1

-

基本はSWを叩いてみて確認する
-(レビューは叩かずに確かめる方法)

+下流工程の一つ, 実装とほぼ1:1
+基本はSWを叩いてみて確認する (⇔ レビュー)

テストの一例:sort(arr) の単体テスト

@Test void testSort1() {
   actual = sort([1,2,3]);     // プログラムを叩いてみて
@@ -92,11 +91,12 @@ 

SWテスト

assert(actual).is([1,2,3]); } @Test void testSortNull() { - actual = sort([]); // 空配列はどうなるか? - ... + actual = sort(null); // nullはどうなるか? + assert(actual).is(null); +} ...
-
+

様々なテスト

誰が叩くのか?

人が叩く:マニュアルテスト
@@ -108,7 +108,7 @@

SWの何をテストするか?

機能:単体テスト, 結合テスト, システムテスト
非機能:パフォーマンステスト, 負荷テスト, ..

-
+

テスト作成の流れ

インタフェースを決める

List sort(List);
@@ -123,9 +123,10 @@ 

テスト作成の流れ

}

要求とIFが決まればテストは作成できる
-実装より先にテストを作っても良い

+ - 要求 + IF = 実装
+ - 要求 + IF = テスト

-
+

例:実験スクリプトの場合

インタフェースを決める

python analyze.py in-file out-file
@@ -141,16 +142,17 @@ 

例:実験スクリプトの場合

assert("tmp.txt").isSameAs("test-out.txt");
-
+

手動テストは危険

よくある良くない手動テスト

-
print(sort([1,2,3]));
-print(sort([3,2,1]));
-print(sort([3,2,1,1,1,1,1,1]));
+
if __name__ == '__main__':
+  print(sort([1,2,3]));
+  print(sort([3,2,1]));
+  print(sort([3,2,1,1,1,1,1,1,0]));
 
1,2,3
 1,2,3
-1,1,1,1,1,1,2,3
+0,1,1,1,1,1,1,2,3
 

検証にコストを要する, ミスする可能性がある
テストに再利用性がない
@@ -158,16 +160,14 @@

よくある良くない手動テスト

 - 変更時にまた手動でテストするのか?

自動化されていないこと自体が問題

-
+

無茶な自動テスト

-
if sort([1,2,3]) == [1,2,3]:
-  print("ok")
-else
-  print("ng")
-if sort([3,1,2]) == [1,2,3]:
-  print("ok")
-else
-  print("ng")
+
if __name__ == '__main__':
+  # print(sort([1,2,3]));
+  if sort([1,2,3]) == [1,2,3]:
+    print("ok")
+  else:
+    print("ng")
 

ここまでやるならテストFWを使おう
テストの共通処理をFWに任す
@@ -177,18 +177,19 @@

無茶な自動テスト

 - テストのメタデータ付与 (名前等)

バグを減らす一つの方法はコードを書かないこと

-
+

各種言語のテストFW

Java:JUnit, TestNG

@Test @DisplayName("ソート済みデータのソート")
 void testSort1() {
-  List l = sort([1,2,3]);
-  assertThat(l).equalTo([1,2,3]);
+  List actual = sort([1,2,3]);
+  assertThat(actual).equalTo([1,2,3]);
 }
 

Python:pytest, unittest

def test_sort1():
-  assert sort([1,2,3]) == [1,2,3]
+  actual = sort([1,2,3])
+  assert actual == [1,2,3]
 
$ pytest -v
 test_sort.py::test_sort1 PASSED                 [ 33%]
@@ -197,54 +198,135 @@ 

Python:pytest, unittest

================= 3 passed in 0.02s ==================
-
+
+

手動テストにも価値がある

+

E2Eテスト (End to end)

+

システム全体のテスト
+エンドユーザの実利用を想定したテスト

+

自動化しにくい, 自動テストに向かない

+

自動テストでは検証しにくい事項がある
+ - UIのくずれ, 見た目
+ - 操作感

+

向き不向き

+

自動テスト:システムの細かな部品
+手動テスト:システム全体の振る舞い

+
+

開発者が知っておくべきトピック集
-テスト編-

DUMMY

-
+

リファクタリング

-

振る舞いを変えずにプログラム内部を改善する

-

無駄処理の排除, 関数の切り出し, 変数名の修正, ..

+

プログラムの振る舞いを変えずに内部を改善

+

無駄処理の排除, 関数の切り出し, 変数名の修正, ...

プログラムができたらリファクタリングすべき
良くない状態を放置しない, 負債を貯めない


https://medium.com/@raychongtk/why-is-refactoring-important-2f1e4dec21ab

-
+

技術的負債

雑談

-
+

リファクタリングによる破壊

-

「振る舞いを変えずに」プログラムを改善~

+

プログラムの「振る舞いを変えずに」を~

振る舞いを変えないのが難しい

すぐに壊れるならまだマシ
-新たなバグの混入に気づかないことも

+壊れていることに気づかないケースが最悪
+ - 新たなバグの混入
+ - 不要だと判断した処理が実は必要だった

Q. 振る舞いの維持をどう確認すれば良いか?

リファクタリング前と後の等価性を判定したい

+

もし等価性を自動判定できたら?
+ → リファクタリングを恐れなくて良くなる

-
-

リファクタリング前にのテスト

+
+

リファクタリングのためのテスト

テストを等価性判定の目安に使う

-

リファクタリング前に必ずテストを用意しておく
-テストが通るように内部を改善する

-

リファクタリングによってテストが落ちた
+

    +
  1. リファクタリング前にテストを用意しておく
  2. +
  3. テストが通る状態を保ちつつ内部を改善する
  4. +
+

リファクタリングによってテストが落ちたら?
 → リファクタリング失敗

リファクタリングでIFが変わる場合は?

-

ラッパーを作っておく

- def sort(arr)
 + def sort(arr, is_ascending)
 
+

ラッパーを作っておく

def sort(arr):
   return sort(arr, True)
 

テストとソースを同時に直さない

-
-

テストを先に書く

+
+

バグ修正のためのテスト

+

予期せぬバグが起きた場合:

+
    +
  1. バグが発生する条件・状況を探す
  2. +
+
sort([3,1,2,-5]);
+   → [1,2,3,-5]
+
+
    +
  1. その条件・状況をテストに起こす
    +プログラムの正しい振る舞いを定義 & 自動検証
  2. +
+
@Test public void testNegative() {
+  List l = sort([3,1,2,-5]);
+  assertThat(l).equalTo([-5,1,2,3]);
+}
+
+
    +
  1. そのテストが通るようにバグを直す
  2. +
+

テストとソースを同時に直さない

+
+
+

バグ報告もテストと同時に

+

バグ報告に書くべき項目

+
    +
  • バグの概要
  • +
  • 環境
  • +
  • バグの再現方法 ★
  • +
  • 期待する振る舞い ★
  • +
  • 実際の振る舞い ★
  • +
+
@Test public void testNegative() {
+  List l = sort([3,1,2,-5]);
+  assertThat(l).equalTo([-5,1,2,3]);
+}
+
+

下手な文章よりも役立つ

+

機械解読可能 = 客観的
+コード化 = 自動化・再現可能

+
+
+

何でもソースコードにしよう

+
雑談
+

インストール手順のコード化

+

※Home brewのインストールスクリプト

+
$ /bin/bash -c "$(curl -fsSL https://raw.git../install.sh)"
+
+

ビルド方法・依存解決のコード化

+

Java: Gradle, Bazel
+Python: requirements.txt + pip install

+

仮想環境のコード化

+

Docker

+

インフラ環境のコード化 (IaC)

+

Chef, Puppet, Pulumi

+
+
+

開発者が知っておくべきトピック集
-テスト編-

+
+

DUMMY

+
+
+

テストを先に書く開発スタイル

TDD - Test driven development, テスト駆動開発

  1. まずはテストを書く
  2. @@ -263,142 +345,124 @@

    ステップ1終了の時点

    return None
-
-

Clean code that works

+
+

"Clean code that works"

TDDのキモ

動くコードと良いコードを分けて考える
分割統治の考え

-

まずは動くコードを作る
-動いたら良くする

-
                         |
-                         |     ★
+

step1. まずは動くコードを作る
+step2. 動いたら良くする

+
                         |     ★
    Clean                 |    step2
                          |
           -------------------
-                         |      ↑
-   Dirty         ☆   →  |      ★
+                         |     ↑
+   Dirty         ☆   →  |     ★
                step0     |    step1
-                         |
-           Doesn't work        work
+
+           Doesn't work        Work
 
-
+

論文でも同じことが言える

雑談

-
+

Test Driven Class

雑談

テスト駆動の演習 (演習D)

学生に仕様とテストを配布する
 - 4つのサブ課題, 各課題にテスト20個程度

-

学生は仕様に従いテストが通るように実装する

-

全テストが通れば課題達成

+

学生は仕様に従いテストが通るように実装する
+全テストが通れば課題達成

Pros

TDD・テストの経験を得られる
-TDD・テストの恩恵を自然に受けられる

+TDD・テストの恩恵を自然に受けられる
+ - 機能の自動的な検証
+ - リファクタリング支援

教員の手間が減る

-
-

バグを直す前にテストを落とす

-

予期せぬバグが起きた場合:

-
    -
  1. バグが発生する条件・状況を探す
  2. -
-
sort([3,1,2,-5]);
-→ [1,2,3,-5]
-
-
    -
  1. その条件・状況をテストに起こす
    -プログラムの正しい振る舞いを定義 & 自動検証
  2. -
-
@Test public void testNegative() {
-  List l = sort([3,1,2,-5]);
-  assertThat(l).equalTo([-5,1,2,3]);
-}
-
-
    -
  1. そのテストが通るようにバグを直す
  2. -
-

常にテストとソースを同時に直さない

-
-
-

バグ報告もテストと同時に

-

バグ報告に書くべき項目

-

バグの概要
-環境
-バグの再現方法 ★
-期待する振る舞い ★
-実際の振る舞い ★

-
@Test public void testNegative() {
-  List l = sort([3,1,2,-5]);
-  assertThat(l).equalTo([-5,1,2,3]);
-}
-
-

下手な文章よりも役立つ

-

機械解読可能=客観的・再現可能

-
-
-

何でもソースコードにしよう

-
雑談
-

インストール手順のコード化

-

※Home brewのインストールスクリプト

-
$ /bin/bash -c "$(curl -fsSL https://raw.git../install.sh)"
-
-

ビルド方法・依存解決のコード化

-

Gradle, Bazel
-requirements.txt + pip install

-

仮想環境のコード化

-

Docker

-

インフラ環境のコード化 (IaC)

-

Chef, Puppet, Pulumi

-
-
+

開発者が知っておくべきトピック集
-テスト編-

DUMMY

-
+





Program testing can be used to show the presence of bugs, but never to show their absence

-

テストはバグが存在することを示せるが,
+

テストはバグが存在することを示せるが
バグがないことは示せない

-

Edsger W. Dijkstra

+

E.W. Dijkstra

-
+

テストは証明ではない

+

全組み合わせのテストは不可能

+

sort(arr) のパラメタの組み合わせは無限
+isPrime(int n)でもINT_MAX (42億) の可能性がある

+

テストは無料ではない

+

大きなシステムの全テストは1日かかる

経済

-
-

プログラムの正しさの証明?

+
+

プログラムの正しさの証明?

形式手法

雑談

数学的・形式的な分析に基づいて信頼性を確認
システム全体を数学的に表現することで検証する


-E.M. Clarke et al, ACM Computing Surveys 1996.

+E.M. Clarke et al, ACM Computing Surveys 1996.

ミッションクリティカル分野で利用されている
航空システム・医療等

形式手法と比べるとテストは手軽で安価

-
+

サボるために頑張る

投資

-
+

テストの経済学と心理学

-
-

手でやらない

-

手でやるべき状況もある

-
-
-

リファクタリング

+
+

良いテスト

+

良いテストとは?

+

バグの検出能力が高い (≒ 網羅率が高い)
+読みやすい・保守しやすい

+

単純であればあるほどよい

+

分岐if forを極力使わない
+テスト自体のバグを避けるため
+繰り返してもOK, DRYでなくても良い

+

仕様や利用方法という側面もある

+

1テストケース=1シナリオ

+
+
+

関数化

+
+
+

良いプログラムと良いテスト

+

+
+
+

parametrized test

+
+
+

回帰バグ

+

昔のバグが再度現れる現象

+

「レグレッションがおきた」
+「デグレした」

+

プログラム変更時に発生した意図せぬ別の問題
+バグを直したら別のバグが出てくる

+

テストは回帰バグの特効薬

+

バグ修正時に必ず対応するテストを作る
+プログラム変更時に常にテストを回す

+
+
+

テストスメル

+

CI/CD