comparison slide/slide.html @ 57:92e7655a7458

...
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Wed, 27 May 2020 22:04:40 +0900
parents 76a8f55f23fa
children b43d210923e7
comparison
equal deleted inserted replaced
56:76a8f55f23fa 57:92e7655a7458
10 */div#p>svg>foreignObject>section .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}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 h1 .octicon-link,div#p>svg>foreignObject>section h2 .octicon-link,div#p>svg>foreignObject>section h3 .octicon-link,div#p>svg>foreignObject>section h4 .octicon-link,div#p>svg>foreignObject>section h5 .octicon-link,div#p>svg>foreignObject>section h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}div#p>svg>foreignObject>section h1:hover .anchor,div#p>svg>foreignObject>section h2:hover .anchor,div#p>svg>foreignObject>section h3:hover .anchor,div#p>svg>foreignObject>section h4:hover .anchor,div#p>svg>foreignObject>section h5:hover .anchor,div#p>svg>foreignObject>section h6:hover .anchor{text-decoration:none}div#p>svg>foreignObject>section h1:hover .anchor .octicon-link,div#p>svg>foreignObject>section h2:hover .anchor .octicon-link,div#p>svg>foreignObject>section h3:hover .anchor .octicon-link,div#p>svg>foreignObject>section h4:hover .anchor .octicon-link,div#p>svg>foreignObject>section h5:hover .anchor .octicon-link,div#p>svg>foreignObject>section h6:hover .anchor .octicon-link{visibility:visible}div#p>svg>foreignObject>section h1:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h2:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h3:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h4:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h5:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h6:hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' aria-hidden='true'%3E%3Cpath fill-rule='evenodd' d='M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z'/%3E%3C/svg%3E")}div#p>svg>foreignObject>section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;font-size:16px;line-height:1.5;word-wrap:break-word}div#p>svg>foreignObject>section{--marpit-root-font-size:16px}div#p>svg>foreignObject>section details{display:block}div#p>svg>foreignObject>section summary{display:list-item}div#p>svg>foreignObject>section a{background-color:initial}div#p>svg>foreignObject>section a:active,div#p>svg>foreignObject>section a:hover{outline-width:0}div#p>svg>foreignObject>section strong{font-weight:inherit;font-weight:bolder}div#p>svg>foreignObject>section h1{margin:.67em 0}div#p>svg>foreignObject>section img{border-style:none}div#p>svg>foreignObject>section code,div#p>svg>foreignObject>section kbd,div#p>svg>foreignObject>section pre{font-family:monospace,monospace;font-size:1em}div#p>svg>foreignObject>section hr{box-sizing:initial;overflow:visible}div#p>svg>foreignObject>section input{font:inherit;margin:0;overflow:visible}div#p>svg>foreignObject>section [type=checkbox]{padding:0}div#p>svg>foreignObject>section *,div#p>svg>foreignObject>section [type=checkbox]{box-sizing:border-box}div#p>svg>foreignObject>section input{font-family:inherit;font-size:inherit;line-height:inherit}div#p>svg>foreignObject>section a{color:#0366d6;text-decoration:none}div#p>svg>foreignObject>section a:hover{text-decoration:underline}div#p>svg>foreignObject>section strong{font-weight:600}div#p>svg>foreignObject>section hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border-bottom:1px solid #dfe2e5}div#p>svg>foreignObject>section hr:after,div#p>svg>foreignObject>section hr:before{display:table;content:""}div#p>svg>foreignObject>section hr:after{clear:both}div#p>svg>foreignObject>section table{border-spacing:0;border-collapse:collapse}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 h1,div#p>svg>foreignObject>section h2,div#p>svg>foreignObject>section h3,div#p>svg>foreignObject>section h4,div#p>svg>foreignObject>section h5,div#p>svg>foreignObject>section h6{margin-top:0;margin-bottom:0}div#p>svg>foreignObject>section h1{font-size:32px}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{font-weight:600}div#p>svg>foreignObject>section h2{font-size:24px}div#p>svg>foreignObject>section h3{font-size:20px}div#p>svg>foreignObject>section h3,div#p>svg>foreignObject>section h4{font-weight:600}div#p>svg>foreignObject>section h4{font-size:16px}div#p>svg>foreignObject>section h5{font-size:14px}div#p>svg>foreignObject>section h5,div#p>svg>foreignObject>section h6{font-weight:600}div#p>svg>foreignObject>section h6{font-size:12px}div#p>svg>foreignObject>section p{margin-top:0;margin-bottom:10px}div#p>svg>foreignObject>section blockquote{margin:0}div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section ul{padding-left:0;margin-top:0;margin-bottom:0}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 code,div#p>svg>foreignObject>section pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px}div#p>svg>foreignObject>section pre{margin-top:0;margin-bottom:0}div#p>svg>foreignObject>section input::-webkit-inner-spin-button,div#p>svg>foreignObject>section input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}div#p>svg>foreignObject>section :checked+.radio-label{position:relative;z-index:1;border-color:#0366d6}div#p>svg>foreignObject>section .border{border:1px solid #e1e4e8!important}div#p>svg>foreignObject>section .border-0{border:0!important}div#p>svg>foreignObject>section .border-bottom{border-bottom:1px solid #e1e4e8!important}div#p>svg>foreignObject>section .rounded-1{border-radius:3px!important}div#p>svg>foreignObject>section .bg-white{background-color:#fff!important}div#p>svg>foreignObject>section .bg-gray-light{background-color:#fafbfc!important}div#p>svg>foreignObject>section .text-gray-light{color:#6a737d!important}div#p>svg>foreignObject>section .pl-3,div#p>svg>foreignObject>section .px-3{padding-left:16px!important}div#p>svg>foreignObject>section .px-3{padding-right:16px!important}div#p>svg>foreignObject>section .f6{font-size:12px!important}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.f6{--marpit-root-font-size:12px!important}div#p>svg>foreignObject>section .lh-condensed{line-height:1.25!important}div#p>svg>foreignObject>section .text-bold{font-weight:600!important}div#p>svg>foreignObject>section .pl-c{color:#6a737d}div#p>svg>foreignObject>section .pl-c1,div#p>svg>foreignObject>section .pl-s .pl-v{color:#005cc5}div#p>svg>foreignObject>section .pl-e,div#p>svg>foreignObject>section .pl-en{color:#6f42c1}div#p>svg>foreignObject>section .pl-s .pl-s1,div#p>svg>foreignObject>section .pl-smi{color:#24292e}div#p>svg>foreignObject>section .pl-ent{color:#22863a}div#p>svg>foreignObject>section .pl-k{color:#d73a49}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:#032f62}div#p>svg>foreignObject>section .pl-smw,div#p>svg>foreignObject>section .pl-v{color:#e36209}div#p>svg>foreignObject>section .pl-bu{color:#b31d28}div#p>svg>foreignObject>section .pl-ii{color:#fafbfc;background-color:#b31d28}div#p>svg>foreignObject>section .pl-c2{color:#fafbfc;background-color:#d73a49}div#p>svg>foreignObject>section .pl-c2:before{content:"^M"}div#p>svg>foreignObject>section .pl-sr .pl-cce{font-weight:700;color:#22863a}div#p>svg>foreignObject>section .pl-ml{color:#735c0f}div#p>svg>foreignObject>section .pl-mh,div#p>svg>foreignObject>section .pl-mh .pl-en,div#p>svg>foreignObject>section .pl-ms{font-weight:700;color:#005cc5}div#p>svg>foreignObject>section .pl-mi{font-style:italic;color:#24292e}div#p>svg>foreignObject>section .pl-mb{font-weight:700;color:#24292e}div#p>svg>foreignObject>section .pl-md{color:#b31d28;background-color:#ffeef0}div#p>svg>foreignObject>section .pl-mi1{color:#22863a;background-color:#f0fff4}div#p>svg>foreignObject>section .pl-mc{color:#e36209;background-color:#ffebda}div#p>svg>foreignObject>section .pl-mi2{color:#f6f8fa;background-color:#005cc5}div#p>svg>foreignObject>section .pl-mdr{font-weight:700;color:#6f42c1}div#p>svg>foreignObject>section .pl-ba{color:#586069}div#p>svg>foreignObject>section .pl-sg{color:#959da5}div#p>svg>foreignObject>section .pl-corl{text-decoration:underline;color:#032f62}div#p>svg>foreignObject>section .mb-0{margin-bottom:0!important}div#p>svg>foreignObject>section .my-2{margin-bottom:8px!important;margin-top:8px!important}div#p>svg>foreignObject>section .pl-0{padding-left:0!important}div#p>svg>foreignObject>section .py-0{padding-top:0!important;padding-bottom:0!important}div#p>svg>foreignObject>section .pl-1{padding-left:4px!important}div#p>svg>foreignObject>section .pl-2{padding-left:8px!important}div#p>svg>foreignObject>section .py-2{padding-top:8px!important;padding-bottom:8px!important}div#p>svg>foreignObject>section .pl-3{padding-left:16px!important}div#p>svg>foreignObject>section .pl-4{padding-left:24px!important}div#p>svg>foreignObject>section .pl-5{padding-left:32px!important}div#p>svg>foreignObject>section .pl-6{padding-left:40px!important}div#p>svg>foreignObject>section .pl-7{padding-left:48px!important}div#p>svg>foreignObject>section .pl-8{padding-left:64px!important}div#p>svg>foreignObject>section .pl-9{padding-left:80px!important}div#p>svg>foreignObject>section .pl-10{padding-left:96px!important}div#p>svg>foreignObject>section .pl-11{padding-left:112px!important}div#p>svg>foreignObject>section .pl-12{padding-left:128px!important}div#p>svg>foreignObject>section hr{border-bottom-color:#eee}div#p>svg>foreignObject>section kbd{display:inline-block;padding:3px 5px;font:11px SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:1px solid #d1d5da;border-radius:3px;box-shadow:inset 0 -1px 0 #d1d5da}div#p>svg>foreignObject>section:after,div#p>svg>foreignObject>section:before{display:table 10 */div#p>svg>foreignObject>section .octicon{display:inline-block;fill:currentColor;vertical-align:text-bottom}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 h1 .octicon-link,div#p>svg>foreignObject>section h2 .octicon-link,div#p>svg>foreignObject>section h3 .octicon-link,div#p>svg>foreignObject>section h4 .octicon-link,div#p>svg>foreignObject>section h5 .octicon-link,div#p>svg>foreignObject>section h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}div#p>svg>foreignObject>section h1:hover .anchor,div#p>svg>foreignObject>section h2:hover .anchor,div#p>svg>foreignObject>section h3:hover .anchor,div#p>svg>foreignObject>section h4:hover .anchor,div#p>svg>foreignObject>section h5:hover .anchor,div#p>svg>foreignObject>section h6:hover .anchor{text-decoration:none}div#p>svg>foreignObject>section h1:hover .anchor .octicon-link,div#p>svg>foreignObject>section h2:hover .anchor .octicon-link,div#p>svg>foreignObject>section h3:hover .anchor .octicon-link,div#p>svg>foreignObject>section h4:hover .anchor .octicon-link,div#p>svg>foreignObject>section h5:hover .anchor .octicon-link,div#p>svg>foreignObject>section h6:hover .anchor .octicon-link{visibility:visible}div#p>svg>foreignObject>section h1:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h2:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h3:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h4:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h5:hover .anchor .octicon-link:before,div#p>svg>foreignObject>section h6:hover .anchor .octicon-link:before{width:16px;height:16px;content:" ";display:inline-block;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' aria-hidden='true'%3E%3Cpath fill-rule='evenodd' d='M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z'/%3E%3C/svg%3E")}div#p>svg>foreignObject>section{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;color:#24292e;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;font-size:16px;line-height:1.5;word-wrap:break-word}div#p>svg>foreignObject>section{--marpit-root-font-size:16px}div#p>svg>foreignObject>section details{display:block}div#p>svg>foreignObject>section summary{display:list-item}div#p>svg>foreignObject>section a{background-color:initial}div#p>svg>foreignObject>section a:active,div#p>svg>foreignObject>section a:hover{outline-width:0}div#p>svg>foreignObject>section strong{font-weight:inherit;font-weight:bolder}div#p>svg>foreignObject>section h1{margin:.67em 0}div#p>svg>foreignObject>section img{border-style:none}div#p>svg>foreignObject>section code,div#p>svg>foreignObject>section kbd,div#p>svg>foreignObject>section pre{font-family:monospace,monospace;font-size:1em}div#p>svg>foreignObject>section hr{box-sizing:initial;overflow:visible}div#p>svg>foreignObject>section input{font:inherit;margin:0;overflow:visible}div#p>svg>foreignObject>section [type=checkbox]{padding:0}div#p>svg>foreignObject>section *,div#p>svg>foreignObject>section [type=checkbox]{box-sizing:border-box}div#p>svg>foreignObject>section input{font-family:inherit;font-size:inherit;line-height:inherit}div#p>svg>foreignObject>section a{color:#0366d6;text-decoration:none}div#p>svg>foreignObject>section a:hover{text-decoration:underline}div#p>svg>foreignObject>section strong{font-weight:600}div#p>svg>foreignObject>section hr{height:0;margin:15px 0;overflow:hidden;background:transparent;border-bottom:1px solid #dfe2e5}div#p>svg>foreignObject>section hr:after,div#p>svg>foreignObject>section hr:before{display:table;content:""}div#p>svg>foreignObject>section hr:after{clear:both}div#p>svg>foreignObject>section table{border-spacing:0;border-collapse:collapse}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 h1,div#p>svg>foreignObject>section h2,div#p>svg>foreignObject>section h3,div#p>svg>foreignObject>section h4,div#p>svg>foreignObject>section h5,div#p>svg>foreignObject>section h6{margin-top:0;margin-bottom:0}div#p>svg>foreignObject>section h1{font-size:32px}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{font-weight:600}div#p>svg>foreignObject>section h2{font-size:24px}div#p>svg>foreignObject>section h3{font-size:20px}div#p>svg>foreignObject>section h3,div#p>svg>foreignObject>section h4{font-weight:600}div#p>svg>foreignObject>section h4{font-size:16px}div#p>svg>foreignObject>section h5{font-size:14px}div#p>svg>foreignObject>section h5,div#p>svg>foreignObject>section h6{font-weight:600}div#p>svg>foreignObject>section h6{font-size:12px}div#p>svg>foreignObject>section p{margin-top:0;margin-bottom:10px}div#p>svg>foreignObject>section blockquote{margin:0}div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section ul{padding-left:0;margin-top:0;margin-bottom:0}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 code,div#p>svg>foreignObject>section pre{font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px}div#p>svg>foreignObject>section pre{margin-top:0;margin-bottom:0}div#p>svg>foreignObject>section input::-webkit-inner-spin-button,div#p>svg>foreignObject>section input::-webkit-outer-spin-button{margin:0;-webkit-appearance:none;appearance:none}div#p>svg>foreignObject>section :checked+.radio-label{position:relative;z-index:1;border-color:#0366d6}div#p>svg>foreignObject>section .border{border:1px solid #e1e4e8!important}div#p>svg>foreignObject>section .border-0{border:0!important}div#p>svg>foreignObject>section .border-bottom{border-bottom:1px solid #e1e4e8!important}div#p>svg>foreignObject>section .rounded-1{border-radius:3px!important}div#p>svg>foreignObject>section .bg-white{background-color:#fff!important}div#p>svg>foreignObject>section .bg-gray-light{background-color:#fafbfc!important}div#p>svg>foreignObject>section .text-gray-light{color:#6a737d!important}div#p>svg>foreignObject>section .pl-3,div#p>svg>foreignObject>section .px-3{padding-left:16px!important}div#p>svg>foreignObject>section .px-3{padding-right:16px!important}div#p>svg>foreignObject>section .f6{font-size:12px!important}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.f6{--marpit-root-font-size:12px!important}div#p>svg>foreignObject>section .lh-condensed{line-height:1.25!important}div#p>svg>foreignObject>section .text-bold{font-weight:600!important}div#p>svg>foreignObject>section .pl-c{color:#6a737d}div#p>svg>foreignObject>section .pl-c1,div#p>svg>foreignObject>section .pl-s .pl-v{color:#005cc5}div#p>svg>foreignObject>section .pl-e,div#p>svg>foreignObject>section .pl-en{color:#6f42c1}div#p>svg>foreignObject>section .pl-s .pl-s1,div#p>svg>foreignObject>section .pl-smi{color:#24292e}div#p>svg>foreignObject>section .pl-ent{color:#22863a}div#p>svg>foreignObject>section .pl-k{color:#d73a49}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:#032f62}div#p>svg>foreignObject>section .pl-smw,div#p>svg>foreignObject>section .pl-v{color:#e36209}div#p>svg>foreignObject>section .pl-bu{color:#b31d28}div#p>svg>foreignObject>section .pl-ii{color:#fafbfc;background-color:#b31d28}div#p>svg>foreignObject>section .pl-c2{color:#fafbfc;background-color:#d73a49}div#p>svg>foreignObject>section .pl-c2:before{content:"^M"}div#p>svg>foreignObject>section .pl-sr .pl-cce{font-weight:700;color:#22863a}div#p>svg>foreignObject>section .pl-ml{color:#735c0f}div#p>svg>foreignObject>section .pl-mh,div#p>svg>foreignObject>section .pl-mh .pl-en,div#p>svg>foreignObject>section .pl-ms{font-weight:700;color:#005cc5}div#p>svg>foreignObject>section .pl-mi{font-style:italic;color:#24292e}div#p>svg>foreignObject>section .pl-mb{font-weight:700;color:#24292e}div#p>svg>foreignObject>section .pl-md{color:#b31d28;background-color:#ffeef0}div#p>svg>foreignObject>section .pl-mi1{color:#22863a;background-color:#f0fff4}div#p>svg>foreignObject>section .pl-mc{color:#e36209;background-color:#ffebda}div#p>svg>foreignObject>section .pl-mi2{color:#f6f8fa;background-color:#005cc5}div#p>svg>foreignObject>section .pl-mdr{font-weight:700;color:#6f42c1}div#p>svg>foreignObject>section .pl-ba{color:#586069}div#p>svg>foreignObject>section .pl-sg{color:#959da5}div#p>svg>foreignObject>section .pl-corl{text-decoration:underline;color:#032f62}div#p>svg>foreignObject>section .mb-0{margin-bottom:0!important}div#p>svg>foreignObject>section .my-2{margin-bottom:8px!important;margin-top:8px!important}div#p>svg>foreignObject>section .pl-0{padding-left:0!important}div#p>svg>foreignObject>section .py-0{padding-top:0!important;padding-bottom:0!important}div#p>svg>foreignObject>section .pl-1{padding-left:4px!important}div#p>svg>foreignObject>section .pl-2{padding-left:8px!important}div#p>svg>foreignObject>section .py-2{padding-top:8px!important;padding-bottom:8px!important}div#p>svg>foreignObject>section .pl-3{padding-left:16px!important}div#p>svg>foreignObject>section .pl-4{padding-left:24px!important}div#p>svg>foreignObject>section .pl-5{padding-left:32px!important}div#p>svg>foreignObject>section .pl-6{padding-left:40px!important}div#p>svg>foreignObject>section .pl-7{padding-left:48px!important}div#p>svg>foreignObject>section .pl-8{padding-left:64px!important}div#p>svg>foreignObject>section .pl-9{padding-left:80px!important}div#p>svg>foreignObject>section .pl-10{padding-left:96px!important}div#p>svg>foreignObject>section .pl-11{padding-left:112px!important}div#p>svg>foreignObject>section .pl-12{padding-left:128px!important}div#p>svg>foreignObject>section hr{border-bottom-color:#eee}div#p>svg>foreignObject>section kbd{display:inline-block;padding:3px 5px;font:11px SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:1px solid #d1d5da;border-radius:3px;box-shadow:inset 0 -1px 0 #d1d5da}div#p>svg>foreignObject>section:after,div#p>svg>foreignObject>section:before{display:table
11 /* content:""; */}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 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 pre,div#p>svg>foreignObject>section table,div#p>svg>foreignObject>section ul{margin-top:0;margin-bottom:16px}div#p>svg>foreignObject>section hr{height:.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}div#p>svg>foreignObject>section blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}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 h1,div#p>svg>foreignObject>section h2,div#p>svg>foreignObject>section h3,div#p>svg>foreignObject>section h4,div#p>svg>foreignObject>section h5,div#p>svg>foreignObject>section h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}div#p>svg>foreignObject>section h1{font-size:2em}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{padding-bottom:.3em;border-bottom:1px solid #eaecef}div#p>svg>foreignObject>section h2{font-size:1.5em}div#p>svg>foreignObject>section h3{font-size:1.25em}div#p>svg>foreignObject>section h4{font-size:1em}div#p>svg>foreignObject>section h5{font-size:.875em}div#p>svg>foreignObject>section h6{font-size:.85em;color:#6a737d}div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section ul{padding-left:2em}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-top:0;margin-bottom:0}div#p>svg>foreignObject>section li{word-wrap:break-all}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{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}div#p>svg>foreignObject>section dl dd{padding:0 16px;margin-bottom:16px}div#p>svg>foreignObject>section table{display:block;width:100%;overflow:auto}div#p>svg>foreignObject>section table th{font-weight:600}div#p>svg>foreignObject>section table td,div#p>svg>foreignObject>section table th{padding:6px 13px;border:1px solid #dfe2e5}div#p>svg>foreignObject>section table tr{background-color:#fff;border-top:1px solid #c6cbd1}div#p>svg>foreignObject>section table tr:nth-child(2n){background-color:#f6f8fa}div#p>svg>foreignObject>section img{max-width:100%;box-sizing:initial;background-color:#fff}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 code{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px}div#p>svg>foreignObject>section pre{word-wrap:normal}div#p>svg>foreignObject>section pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}div#p>svg>foreignObject>section .highlight{margin-bottom:16px}div#p>svg>foreignObject>section .highlight pre{margin-bottom:0;word-break:normal}div#p>svg>foreignObject>section pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}div#p>svg>foreignObject>section pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:initial;border:0}div#p>svg>foreignObject>section .commit-tease-sha{display:inline-block;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:90%;color:#444d56}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.commit-tease-sha{--marpit-root-font-size:90%}div#p>svg>foreignObject>section .full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}div#p>svg>foreignObject>section .blob-wrapper{overflow-x:auto;overflow-y:hidden}div#p>svg>foreignObject>section .blob-wrapper-embedded{max-height:240px;overflow-y:auto}div#p>svg>foreignObject>section .blob-num{width:1%;min-width:50px;padding-right:10px;padding-left:10px;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px;line-height:20px;color:rgba(27,31,35,.3);text-align:right;white-space:nowrap;vertical-align:top;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.blob-num{--marpit-root-font-size:12px}div#p>svg>foreignObject>section .blob-num:hover{color:rgba(27,31,35,.6)}div#p>svg>foreignObject>section .blob-num:before{content:attr(data-line-number)}div#p>svg>foreignObject>section .blob-code{position:relative;padding-right:10px;padding-left:10px;line-height:20px;vertical-align:top}div#p>svg>foreignObject>section .blob-code-inner{overflow:visible;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px;color:#24292e;word-wrap:normal;white-space:pre}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.blob-code-inner{--marpit-root-font-size:12px}div#p>svg>foreignObject>section .pl-token.active,div#p>svg>foreignObject>section .pl-token:hover{cursor:pointer;background:#ffea7f}div#p>svg>foreignObject>section .tab-size[data-tab-size="1"]{-moz-tab-size:1;-o-tab-size:1;tab-size:1}div#p>svg>foreignObject>section .tab-size[data-tab-size="2"]{-moz-tab-size:2;-o-tab-size:2;tab-size:2}div#p>svg>foreignObject>section .tab-size[data-tab-size="3"]{-moz-tab-size:3;-o-tab-size:3;tab-size:3}div#p>svg>foreignObject>section .tab-size[data-tab-size="4"]{-moz-tab-size:4;-o-tab-size:4;tab-size:4}div#p>svg>foreignObject>section .tab-size[data-tab-size="5"]{-moz-tab-size:5;-o-tab-size:5;tab-size:5}div#p>svg>foreignObject>section .tab-size[data-tab-size="6"]{-moz-tab-size:6;-o-tab-size:6;tab-size:6}div#p>svg>foreignObject>section .tab-size[data-tab-size="7"]{-moz-tab-size:7;-o-tab-size:7;tab-size:7}div#p>svg>foreignObject>section .tab-size[data-tab-size="8"]{-moz-tab-size:8;-o-tab-size:8;tab-size:8}div#p>svg>foreignObject>section .tab-size[data-tab-size="9"]{-moz-tab-size:9;-o-tab-size:9;tab-size:9}div#p>svg>foreignObject>section .tab-size[data-tab-size="10"]{-moz-tab-size:10;-o-tab-size:10;tab-size:10}div#p>svg>foreignObject>section .tab-size[data-tab-size="11"]{-moz-tab-size:11;-o-tab-size:11;tab-size:11}div#p>svg>foreignObject>section .tab-size[data-tab-size="12"]{-moz-tab-size:12;-o-tab-size:12;tab-size:12}div#p>svg>foreignObject>section .task-list-item{list-style-type:none}div#p>svg>foreignObject>section .task-list-item+.task-list-item{margin-top:3px}div#p>svg>foreignObject>section .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}div#p>svg>foreignObject>section .hljs{display:block;background:#fff;padding:.5em;color:#333;overflow-x:auto}div#p>svg>foreignObject>section .hljs-comment,div#p>svg>foreignObject>section .hljs-meta{color:#969896}div#p>svg>foreignObject>section .hljs-emphasis,div#p>svg>foreignObject>section .hljs-quote,div#p>svg>foreignObject>section .hljs-strong,div#p>svg>foreignObject>section .hljs-template-variable,div#p>svg>foreignObject>section .hljs-variable{color:#df5000}div#p>svg>foreignObject>section .hljs-keyword,div#p>svg>foreignObject>section .hljs-selector-tag,div#p>svg>foreignObject>section .hljs-type{color:#d73a49}div#p>svg>foreignObject>section .hljs-attribute,div#p>svg>foreignObject>section .hljs-bullet,div#p>svg>foreignObject>section .hljs-literal,div#p>svg>foreignObject>section .hljs-symbol{color:#0086b3}div#p>svg>foreignObject>section .hljs-name,div#p>svg>foreignObject>section .hljs-section{color:#63a35c}div#p>svg>foreignObject>section .hljs-tag{color:#333}div#p>svg>foreignObject>section .hljs-attr,div#p>svg>foreignObject>section .hljs-selector-attr,div#p>svg>foreignObject>section .hljs-selector-class,div#p>svg>foreignObject>section .hljs-selector-id,div#p>svg>foreignObject>section .hljs-selector-pseudo,div#p>svg>foreignObject>section .hljs-title{color:#6f42c1}div#p>svg>foreignObject>section .hljs-addition{color:#55a532;background-color:#eaffea}div#p>svg>foreignObject>section .hljs-deletion{color:#bd2c00;background-color:#ffecec}div#p>svg>foreignObject>section .hljs-link{text-decoration:underline}div#p>svg>foreignObject>section .hljs-number{color:#005cc5}div#p>svg>foreignObject>section .hljs-string{color:#032f62}div#p>svg>foreignObject>section svg[data-marp-fitting=svg]{max-height:563px}div#p>svg>foreignObject>section h1{color:#246;font-size:1.6em}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{border-bottom:none}div#p>svg>foreignObject>section h2{font-size:1.3em}div#p>svg>foreignObject>section h3{font-size:1.1em}div#p>svg>foreignObject>section h4{font-size:1.05em}div#p>svg>foreignObject>section h5{font-size:1em}div#p>svg>foreignObject>section h6{font-size:.9em}div#p>svg>foreignObject>section h1 strong,div#p>svg>foreignObject>section h2 strong,div#p>svg>foreignObject>section h3 strong,div#p>svg>foreignObject>section h4 strong,div#p>svg>foreignObject>section h5 strong,div#p>svg>foreignObject>section h6 strong{font-weight:inherit;color:#48c}div#p>svg>foreignObject>section hr{height:0;padding-top:.25em}div#p>svg>foreignObject>section pre{border:1px solid #999;line-height:1.15;overflow:visible}div#p>svg>foreignObject>section pre code svg[data-marp-fitting=svg]{max-height:529px}div#p>svg>foreignObject>section footer,div#p>svg>foreignObject>section header{margin:0;position:absolute;left:30px;color:hsla(0,0%,40%,.75);font-size:18px}div#p>svg>foreignObject>section header{top:21px}div#p>svg>foreignObject>section footer{bottom:21px}div#p>svg>foreignObject>section{align-items:stretch;background:#fff;display:flex;flex-direction:column;flex-wrap: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>: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{position:absolute;padding:0;right:30px;bottom:21px;font-size:24px;color:#777}div#p>svg>foreignObject>section:after{--marpit-root-font-size:24px}div#p>svg>foreignObject>section.invert{background-color:#222;color:#e6eaf0}div#p>svg>foreignObject>section.invert:after{color:#999}div#p>svg>foreignObject>section.invert img{background-color:transparent}div#p>svg>foreignObject>section.invert a{color:#50b3ff}div#p>svg>foreignObject>section.invert h1{color:#a3c5e7}div#p>svg>foreignObject>section.invert h2,div#p>svg>foreignObject>section.invert h3,div#p>svg>foreignObject>section.invert h4,div#p>svg>foreignObject>section.invert h5{color:#ebeff5}div#p>svg>foreignObject>section.invert blockquote,div#p>svg>foreignObject>section.invert h6{border-color:#3d3f43;color:#939699}div#p>svg>foreignObject>section.invert h1 strong,div#p>svg>foreignObject>section.invert h2 strong,div#p>svg>foreignObject>section.invert h3 strong,div#p>svg>foreignObject>section.invert h4 strong,div#p>svg>foreignObject>section.invert h5 strong,div#p>svg>foreignObject>section.invert h6 strong{color:#7bf}div#p>svg>foreignObject>section.invert hr{background-color:#3d3f43}div#p>svg>foreignObject>section.invert footer,div#p>svg>foreignObject>section.invert header{color:hsla(0,0%,60%,.75)}div#p>svg>foreignObject>section.invert code,div#p>svg>foreignObject>section.invert kbd{background-color:#111}div#p>svg>foreignObject>section.invert kbd{border-color:#666;box-shadow:inset 0 -1px 0 #555;color:#e6eaf0}div#p>svg>foreignObject>section.invert table tr{background-color:#12181d;border-color:#60657b}div#p>svg>foreignObject>section.invert table tr:nth-child(2n){background-color:#1b2024}div#p>svg>foreignObject>section.invert table td,div#p>svg>foreignObject>section.invert table th{border-color:#5b5e61}div#p>svg>foreignObject>section.invert pre{background-color:#0a0e12;border-color:#777}div#p>svg>foreignObject>section.invert pre code{background-color:transparent}div#p>svg>foreignObject>section[data-color] h1,div#p>svg>foreignObject>section[data-color] h2,div#p>svg>foreignObject>section[data-color] h3,div#p>svg>foreignObject>section[data-color] h4,div#p>svg>foreignObject>section[data-color] h5,div#p>svg>foreignObject>section[data-color] h6{color:currentColor}div#p>svg>foreignObject>section svg[data-marp-fitting=svg]{display:block;height:auto;width:100%}@supports (-ms-ime-align:auto){div#p>svg>foreignObject>section svg[data-marp-fitting=svg]{position:static}}div#p>svg>foreignObject>section svg[data-marp-fitting=svg].__reflow__{content:""}@supports (-ms-ime-align:auto){div#p>svg>foreignObject>section svg[data-marp-fitting=svg].__reflow__{position:relative}}div#p>svg>foreignObject>section [data-marp-fitting-svg-content]{display:table;white-space:nowrap}div#p>svg>foreignObject>section [data-marp-fitting-svg-content-wrap]{white-space:pre}div#p>svg>foreignObject>section img[data-marp-twemoji]{background:transparent;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em;width:1em} 11 /* content:""; */}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 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 pre,div#p>svg>foreignObject>section table,div#p>svg>foreignObject>section ul{margin-top:0;margin-bottom:16px}div#p>svg>foreignObject>section hr{height:.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}div#p>svg>foreignObject>section blockquote{padding:0 1em;color:#6a737d;border-left:.25em solid #dfe2e5}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 h1,div#p>svg>foreignObject>section h2,div#p>svg>foreignObject>section h3,div#p>svg>foreignObject>section h4,div#p>svg>foreignObject>section h5,div#p>svg>foreignObject>section h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}div#p>svg>foreignObject>section h1{font-size:2em}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{padding-bottom:.3em;border-bottom:1px solid #eaecef}div#p>svg>foreignObject>section h2{font-size:1.5em}div#p>svg>foreignObject>section h3{font-size:1.25em}div#p>svg>foreignObject>section h4{font-size:1em}div#p>svg>foreignObject>section h5{font-size:.875em}div#p>svg>foreignObject>section h6{font-size:.85em;color:#6a737d}div#p>svg>foreignObject>section ol,div#p>svg>foreignObject>section ul{padding-left:2em}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-top:0;margin-bottom:0}div#p>svg>foreignObject>section li{word-wrap:break-all}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{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}div#p>svg>foreignObject>section dl dd{padding:0 16px;margin-bottom:16px}div#p>svg>foreignObject>section table{display:block;width:100%;overflow:auto}div#p>svg>foreignObject>section table th{font-weight:600}div#p>svg>foreignObject>section table td,div#p>svg>foreignObject>section table th{padding:6px 13px;border:1px solid #dfe2e5}div#p>svg>foreignObject>section table tr{background-color:#fff;border-top:1px solid #c6cbd1}div#p>svg>foreignObject>section table tr:nth-child(2n){background-color:#f6f8fa}div#p>svg>foreignObject>section img{max-width:100%;box-sizing:initial;background-color:#fff}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 code{padding:.2em .4em;margin:0;font-size:85%;background-color:rgba(27,31,35,.05);border-radius:3px}div#p>svg>foreignObject>section pre{word-wrap:normal}div#p>svg>foreignObject>section pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}div#p>svg>foreignObject>section .highlight{margin-bottom:16px}div#p>svg>foreignObject>section .highlight pre{margin-bottom:0;word-break:normal}div#p>svg>foreignObject>section pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}div#p>svg>foreignObject>section pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:initial;border:0}div#p>svg>foreignObject>section .commit-tease-sha{display:inline-block;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:90%;color:#444d56}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.commit-tease-sha{--marpit-root-font-size:90%}div#p>svg>foreignObject>section .full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}div#p>svg>foreignObject>section .blob-wrapper{overflow-x:auto;overflow-y:hidden}div#p>svg>foreignObject>section .blob-wrapper-embedded{max-height:240px;overflow-y:auto}div#p>svg>foreignObject>section .blob-num{width:1%;min-width:50px;padding-right:10px;padding-left:10px;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px;line-height:20px;color:rgba(27,31,35,.3);text-align:right;white-space:nowrap;vertical-align:top;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.blob-num{--marpit-root-font-size:12px}div#p>svg>foreignObject>section .blob-num:hover{color:rgba(27,31,35,.6)}div#p>svg>foreignObject>section .blob-num:before{content:attr(data-line-number)}div#p>svg>foreignObject>section .blob-code{position:relative;padding-right:10px;padding-left:10px;line-height:20px;vertical-align:top}div#p>svg>foreignObject>section .blob-code-inner{overflow:visible;font-family:SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px;color:#24292e;word-wrap:normal;white-space:pre}div#p>svg>foreignObject>section div#p>svg>foreignObject>section section.blob-code-inner{--marpit-root-font-size:12px}div#p>svg>foreignObject>section .pl-token.active,div#p>svg>foreignObject>section .pl-token:hover{cursor:pointer;background:#ffea7f}div#p>svg>foreignObject>section .tab-size[data-tab-size="1"]{-moz-tab-size:1;-o-tab-size:1;tab-size:1}div#p>svg>foreignObject>section .tab-size[data-tab-size="2"]{-moz-tab-size:2;-o-tab-size:2;tab-size:2}div#p>svg>foreignObject>section .tab-size[data-tab-size="3"]{-moz-tab-size:3;-o-tab-size:3;tab-size:3}div#p>svg>foreignObject>section .tab-size[data-tab-size="4"]{-moz-tab-size:4;-o-tab-size:4;tab-size:4}div#p>svg>foreignObject>section .tab-size[data-tab-size="5"]{-moz-tab-size:5;-o-tab-size:5;tab-size:5}div#p>svg>foreignObject>section .tab-size[data-tab-size="6"]{-moz-tab-size:6;-o-tab-size:6;tab-size:6}div#p>svg>foreignObject>section .tab-size[data-tab-size="7"]{-moz-tab-size:7;-o-tab-size:7;tab-size:7}div#p>svg>foreignObject>section .tab-size[data-tab-size="8"]{-moz-tab-size:8;-o-tab-size:8;tab-size:8}div#p>svg>foreignObject>section .tab-size[data-tab-size="9"]{-moz-tab-size:9;-o-tab-size:9;tab-size:9}div#p>svg>foreignObject>section .tab-size[data-tab-size="10"]{-moz-tab-size:10;-o-tab-size:10;tab-size:10}div#p>svg>foreignObject>section .tab-size[data-tab-size="11"]{-moz-tab-size:11;-o-tab-size:11;tab-size:11}div#p>svg>foreignObject>section .tab-size[data-tab-size="12"]{-moz-tab-size:12;-o-tab-size:12;tab-size:12}div#p>svg>foreignObject>section .task-list-item{list-style-type:none}div#p>svg>foreignObject>section .task-list-item+.task-list-item{margin-top:3px}div#p>svg>foreignObject>section .task-list-item input{margin:0 .2em .25em -1.6em;vertical-align:middle}div#p>svg>foreignObject>section .hljs{display:block;background:#fff;padding:.5em;color:#333;overflow-x:auto}div#p>svg>foreignObject>section .hljs-comment,div#p>svg>foreignObject>section .hljs-meta{color:#969896}div#p>svg>foreignObject>section .hljs-emphasis,div#p>svg>foreignObject>section .hljs-quote,div#p>svg>foreignObject>section .hljs-strong,div#p>svg>foreignObject>section .hljs-template-variable,div#p>svg>foreignObject>section .hljs-variable{color:#df5000}div#p>svg>foreignObject>section .hljs-keyword,div#p>svg>foreignObject>section .hljs-selector-tag,div#p>svg>foreignObject>section .hljs-type{color:#d73a49}div#p>svg>foreignObject>section .hljs-attribute,div#p>svg>foreignObject>section .hljs-bullet,div#p>svg>foreignObject>section .hljs-literal,div#p>svg>foreignObject>section .hljs-symbol{color:#0086b3}div#p>svg>foreignObject>section .hljs-name,div#p>svg>foreignObject>section .hljs-section{color:#63a35c}div#p>svg>foreignObject>section .hljs-tag{color:#333}div#p>svg>foreignObject>section .hljs-attr,div#p>svg>foreignObject>section .hljs-selector-attr,div#p>svg>foreignObject>section .hljs-selector-class,div#p>svg>foreignObject>section .hljs-selector-id,div#p>svg>foreignObject>section .hljs-selector-pseudo,div#p>svg>foreignObject>section .hljs-title{color:#6f42c1}div#p>svg>foreignObject>section .hljs-addition{color:#55a532;background-color:#eaffea}div#p>svg>foreignObject>section .hljs-deletion{color:#bd2c00;background-color:#ffecec}div#p>svg>foreignObject>section .hljs-link{text-decoration:underline}div#p>svg>foreignObject>section .hljs-number{color:#005cc5}div#p>svg>foreignObject>section .hljs-string{color:#032f62}div#p>svg>foreignObject>section svg[data-marp-fitting=svg]{max-height:563px}div#p>svg>foreignObject>section h1{color:#246;font-size:1.6em}div#p>svg>foreignObject>section h1,div#p>svg>foreignObject>section h2{border-bottom:none}div#p>svg>foreignObject>section h2{font-size:1.3em}div#p>svg>foreignObject>section h3{font-size:1.1em}div#p>svg>foreignObject>section h4{font-size:1.05em}div#p>svg>foreignObject>section h5{font-size:1em}div#p>svg>foreignObject>section h6{font-size:.9em}div#p>svg>foreignObject>section h1 strong,div#p>svg>foreignObject>section h2 strong,div#p>svg>foreignObject>section h3 strong,div#p>svg>foreignObject>section h4 strong,div#p>svg>foreignObject>section h5 strong,div#p>svg>foreignObject>section h6 strong{font-weight:inherit;color:#48c}div#p>svg>foreignObject>section hr{height:0;padding-top:.25em}div#p>svg>foreignObject>section pre{border:1px solid #999;line-height:1.15;overflow:visible}div#p>svg>foreignObject>section pre code svg[data-marp-fitting=svg]{max-height:529px}div#p>svg>foreignObject>section footer,div#p>svg>foreignObject>section header{margin:0;position:absolute;left:30px;color:hsla(0,0%,40%,.75);font-size:18px}div#p>svg>foreignObject>section header{top:21px}div#p>svg>foreignObject>section footer{bottom:21px}div#p>svg>foreignObject>section{align-items:stretch;background:#fff;display:flex;flex-direction:column;flex-wrap: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>: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{position:absolute;padding:0;right:30px;bottom:21px;font-size:24px;color:#777}div#p>svg>foreignObject>section:after{--marpit-root-font-size:24px}div#p>svg>foreignObject>section.invert{background-color:#222;color:#e6eaf0}div#p>svg>foreignObject>section.invert:after{color:#999}div#p>svg>foreignObject>section.invert img{background-color:transparent}div#p>svg>foreignObject>section.invert a{color:#50b3ff}div#p>svg>foreignObject>section.invert h1{color:#a3c5e7}div#p>svg>foreignObject>section.invert h2,div#p>svg>foreignObject>section.invert h3,div#p>svg>foreignObject>section.invert h4,div#p>svg>foreignObject>section.invert h5{color:#ebeff5}div#p>svg>foreignObject>section.invert blockquote,div#p>svg>foreignObject>section.invert h6{border-color:#3d3f43;color:#939699}div#p>svg>foreignObject>section.invert h1 strong,div#p>svg>foreignObject>section.invert h2 strong,div#p>svg>foreignObject>section.invert h3 strong,div#p>svg>foreignObject>section.invert h4 strong,div#p>svg>foreignObject>section.invert h5 strong,div#p>svg>foreignObject>section.invert h6 strong{color:#7bf}div#p>svg>foreignObject>section.invert hr{background-color:#3d3f43}div#p>svg>foreignObject>section.invert footer,div#p>svg>foreignObject>section.invert header{color:hsla(0,0%,60%,.75)}div#p>svg>foreignObject>section.invert code,div#p>svg>foreignObject>section.invert kbd{background-color:#111}div#p>svg>foreignObject>section.invert kbd{border-color:#666;box-shadow:inset 0 -1px 0 #555;color:#e6eaf0}div#p>svg>foreignObject>section.invert table tr{background-color:#12181d;border-color:#60657b}div#p>svg>foreignObject>section.invert table tr:nth-child(2n){background-color:#1b2024}div#p>svg>foreignObject>section.invert table td,div#p>svg>foreignObject>section.invert table th{border-color:#5b5e61}div#p>svg>foreignObject>section.invert pre{background-color:#0a0e12;border-color:#777}div#p>svg>foreignObject>section.invert pre code{background-color:transparent}div#p>svg>foreignObject>section[data-color] h1,div#p>svg>foreignObject>section[data-color] h2,div#p>svg>foreignObject>section[data-color] h3,div#p>svg>foreignObject>section[data-color] h4,div#p>svg>foreignObject>section[data-color] h5,div#p>svg>foreignObject>section[data-color] h6{color:currentColor}div#p>svg>foreignObject>section svg[data-marp-fitting=svg]{display:block;height:auto;width:100%}@supports (-ms-ime-align:auto){div#p>svg>foreignObject>section svg[data-marp-fitting=svg]{position:static}}div#p>svg>foreignObject>section svg[data-marp-fitting=svg].__reflow__{content:""}@supports (-ms-ime-align:auto){div#p>svg>foreignObject>section svg[data-marp-fitting=svg].__reflow__{position:relative}}div#p>svg>foreignObject>section [data-marp-fitting-svg-content]{display:table;white-space:nowrap}div#p>svg>foreignObject>section [data-marp-fitting-svg-content-wrap]{white-space:pre}div#p>svg>foreignObject>section img[data-marp-twemoji]{background:transparent;height:1em;margin:0 .05em 0 .1em;vertical-align:-.1em;width:1em}
12 12
13 /* @theme example */div#p>svg>foreignObject>section{background-image:url("assets/logo.svg");background-position:right 3% bottom 2%;background-repeat:no-repeat;background-attachment:5%;background-size:20% auto} 13 /* @theme example */div#p>svg>foreignObject>section{background-image:url("assets/logo.svg");background-position:right 3% bottom 2%;background-repeat:no-repeat;background-attachment:5%;background-size:20% auto}
14 14
15 /* @theme c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7 */div#p>svg>foreignObject>section[data-marpit-advanced-background=background]{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%}</style></head><body><div class="bespoke-marp-osc"><button data-bespoke-marp-osc="prev" tabindex="-1" title="Previous slide">Previous slide</button><span data-bespoke-marp-osc="page"></span><button data-bespoke-marp-osc="next" tabindex="-1" title="Next slide">Next slide</button><button data-bespoke-marp-osc="fullscreen" tabindex="-1" title="Toggle fullscreen (f)">Toggle fullscreen</button><button data-bespoke-marp-osc="presenter" tabindex="-1" title="Open presenter view (p)">Open presenter view</button></div><div id="p"><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="1" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="1" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 15 /* @theme xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu */div#p>svg>foreignObject>section[data-marpit-advanced-background=background]{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%}</style></head><body><div class="bespoke-marp-osc"><button data-bespoke-marp-osc="prev" tabindex="-1" title="Previous slide">Previous slide</button><span data-bespoke-marp-osc="page"></span><button data-bespoke-marp-osc="next" tabindex="-1" title="Next slide">Next slide</button><button data-bespoke-marp-osc="fullscreen" tabindex="-1" title="Toggle fullscreen (f)">Toggle fullscreen</button><button data-bespoke-marp-osc="presenter" tabindex="-1" title="Open presenter view (p)">Open presenter view</button></div><div id="p"><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="1" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="1" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
16 <h1><svg data-marp-fitting="svg"><foreignObject><span data-marp-fitting-svg-content> xv6の構成要素の継続の分析</span></foreignObject></svg></h1> 16 <h1><svg data-marp-fitting="svg"><foreignObject><span data-marp-fitting-svg-content> xv6の構成要素の継続の分析</span></foreignObject></svg></h1>
17 <ul> 17 <ul>
18 <li>清水 隆博 18 <li>清水 隆博
19 <ul> 19 <ul>
20 <li>琉球大学大学院理工学研究科情報工学専攻</li> 20 <li>琉球大学大学院理工学研究科情報工学専攻</li>
25 <li>琉球大学工学部</li> 25 <li>琉球大学工学部</li>
26 </ul> 26 </ul>
27 </li> 27 </li>
28 </ul> 28 </ul>
29 </section> 29 </section>
30 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="2" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="2" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 30 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="2" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="2" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
31 <h1>研究目的</h1> 31 <h1>研究目的</h1>
32 <ul> 32 <ul>
33 <li>アプリケーションの信頼性を向上させるたい 33 <li>アプリケーションの信頼性を向上させたい
34 <ul> 34 <ul>
35 <li>その為には土台となる OS 自体の信頼性を高く保証したい</li> 35 <li>その為には土台となる OS 自体の信頼性が重要である</li>
36 </ul> 36 </ul>
37 </li> 37 </li>
38 <li>OSそのものも巨大なプログラムである 38 <li>OSそのものも巨大なプログラムである</li>
39 <ul> 39 <li>並列並行処理などに起因するバグや、そもそもOSを構成する処理が巨大
40 <li>テストコードを用いた方法で信頼性を確保する事が可能</li> 40 <ul>
41 </ul> 41 <li>テストコードを用いた方法で信頼性を確保することが困難</li>
42 </li> 42 <li>テストではなく定理証明とモデル検査でOSの信頼性を高めたい</li>
43 <li>しかし並列並行処理などに起因するバグや、そもそもOSを構成する処理が巨大 43 </ul>
44 <ul> 44 </li>
45 <li>テストで完全にバグを発見するのは困難</li> 45 </ul>
46 <li>テスト以外の方法でOSの信頼性を高めたい</li> 46 </section>
47 </ul> 47 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="3" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="3" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
48 </li> 48 <h1>ノーマルレベルとメタレベルを用いた信頼性の向上</h1>
49 </ul> 49 <ul>
50 </section> 50 <li>プログラムの実行部分は以下の2つからなる
51 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="3" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="3" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 51 <ul>
52 <h1>OSの信頼性</h1> 52 <li>入力と出力の関係を決める計算(ノーマルレベル)</li>
53 <ul> 53 <li>プログラムを実行したり、 信頼性を保証するために必要な計算(メタレベル)</li>
54 <li>OSそのもの動作も保証されるべき</li> 54 </ul>
55 <li>アプリケーションが行いたい処理の他に、 メモリやCPUの資源管理などが存在する 55 </li>
56 <ul> 56 <li>メタレベルの例
57 <li>アプリケーション側からするとOSの機能</li> 57 <ul>
58 </ul> 58 <li>メモリやCPUの資源管理</li>
59 </li> 59 <li>システムコールの動作(副作用)</li>
60 <li>本来行いたい処理 60 <li>並行実行(他のプロセスとの干渉)</li>
61 <ul> 61 <li>モデル検査(可能な実行を列挙する方式の実行)</li>
62 <li>ノーマルレベルと呼ぶ</li> 62 <li>証明(入力時と出力時の論理的な条件)、(invariant)</li>
63 </ul> 63 </ul>
64 </li> 64 </li>
65 <li>資源管理など 65 <li>メタレベルの計算として信頼性を保証する</li>
66 <ul> 66 </ul>
67 <li>メタレベルと呼ぶ</li> 67 </section>
68 <li>この別け方はOSの実装でも存在する</li> 68 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="4" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="4" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
69 </ul> 69 <h1>モデル検査</h1>
70 </li>
71 <li>ノーマル、メタレベルの計算の両方を保証しないといけない</li>
72 </ul>
73 </section>
74 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="4" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="4" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;">
75 <h1>テスト以外で信頼性を高める方法</h1>
76 <ul>
77 <li>モデル検査
78 <ul> 70 <ul>
79 <li>実際に想定されるパターンを全て動かして検証する</li> 71 <li>実際に想定されるパターンを全て動かして検証する</li>
80 <li>デッドロック発生の検知 72 <li>デッドロック発生の検知
81 <ul> 73 <ul>
82 <li>JavaPathFinderなど</li> 74 <li>JavaPathFinderなど</li>
83 </ul> 75 </ul>
84 </li> 76 </li>
85 </ul> 77 <li>状態爆発が問題になる</li>
86 </li> 78 <li>Spinを用いる方法では、 promelaという言語で実装し直す必要がある</li>
87 <li>定理証明支援系 79 </ul>
80 </section>
81 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="5" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="5" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
82 <h1>定理証明支援系</h1>
88 <ul> 83 <ul>
89 <li>論理学的なモデルに変更して証明する 84 <li>論理学的なモデルに変更して証明する
90 <ul> 85 <ul>
91 <li>Agda</li> 86 <li>Agda</li>
92 <li>Coq</li> 87 <li>Coq</li>
93 </ul> 88 </ul>
94 </li> 89 </li>
95 </ul> 90 <li>HoareLogicを用いる
96 </li> 91 <ul>
97 <li>OSをこれらの方法で信頼性を高めたい</li> 92 <li>PreCondition -&gt; Statement -&gt; PostCondition</li>
98 </ul> 93 </ul>
99 </section> 94 </li>
100 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="5" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="5" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 95 <li>従来の方法ではStatementには限られたコマンドしか使えない
101 <h1>OSの信頼性を高めるためには</h1> 96 <ul>
102 <ul> 97 <li>ループは不変条件を使うが、 条件を見つけることが一般的には困難</li>
103 <li>既存のOSのソースコードをそのまま使うのは困難</li> 98 <li>実装言語と同じ記述で証明をすることはできない</li>
104 <li>モデル検査の場合 99 </ul>
105 <ul> 100 </li>
106 <li>OS自体をモデル検査する機能をOSに組み込む必要がある</li> 101 </ul>
107 </ul> 102 </section>
108 </li> 103 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="6" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="6" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
109 <li>定理証明系の場合 104 <h1>GearsOSでの信頼性の保証</h1>
110 <ul> 105 <ul>
111 <li>Agda/CoqでOSを再実装する必要がある</li> 106 <li>メタレベルのみで信頼性の保証を行う
112 <li>それらのコードはそのままコンパイルする事ができない</li> 107 <ul>
113 </ul> 108 <li>ノーマルレベルでの記述は変更しない</li>
114 </li> 109 </ul>
115 <li>ノーマルレベル/メタレベルを切り分けるのも困難</li> 110 </li>
116 <li>動きつつ証明可能なOSを目指したい 111 <li>Continuation Based C(CbC)をつかって、ノーマルレベルとメタレベルの分離を行う</li>
117 <ul> 112 <li>C言語の下位言語であり、 いくつかのCコンパイラ上で実装している</li>
118 <li>これらを同時に達成出来るプログラミング言語でOSを実装する必要がある</li>
119 </ul>
120 </li>
121 </ul>
122 </section>
123 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="6" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="6" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;">
124 <h1>Continuation Based C</h1>
125 <ul>
126 <li>ノーマルレベル/メタレベルの実装に適している言語
127 <ul>
128 <li>通称CbC</li>
129 </ul>
130 </li>
131 <li>C言語の下位言語であり、 いくつかのCコンパイラ上で実装している
132 <ul>
133 <li>gcc</li>
134 <li>llvm/clang</li>
135 </ul>
136 </li>
137 <li>C言語の構文は使用可能だが、 関数呼び出しの他に軽量継続を持つ 113 <li>C言語の構文は使用可能だが、 関数呼び出しの他に軽量継続を持つ
138 <ul> 114 <ul>
139 <li>関数呼び出し時のスタックの操作を行わず<code>jmp</code>命令で次の処理に移動する</li> 115 <li>関数呼び出し時のスタックの操作を行わず<code>jmp</code>命令で次の処理に移動する</li>
140 <li>schemaなどと違い環境を持たず継続するために軽量継続と呼ぶ</li> 116 <li>schemaなどと違い環境を持たず継続するために軽量継続と呼ぶ</li>
141 </ul> 117 </ul>
142 </li> 118 </li>
143 </ul> 119 </ul>
144 </section> 120 </section>
145 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="7" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="7" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 121 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="7" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="7" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
146 <h1>CbCとCodeGear</h1> 122 <h1>GearsOSでの信頼性の保証</h1>
123 <ul>
124 <li>デフォルトのメタレベルの計算は自動生成される</li>
125 <li>資源管理あるいは検証用のメタ計算は必要に応じて挿入する</li>
126 <li>これにより大きなコード変更無くモデル検査や定理証明を行うことができる</li>
127 <li>モデル検査や定理証明の困難さはメタレベルのプログラミングとして吸収する
128 <ul>
129 <li>例えばOSで使用するデータ構造に合わせたモデル検査用の状態圧縮</li>
130 <li>OSの検証に利用できるinvariantの提供</li>
131 </ul>
132 </li>
133 </ul>
134 </section>
135 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="8" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="8" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
136 <h1>CbCとCodeGear(ノーマルレベル)</h1>
147 <ul> 137 <ul>
148 <li>軽量継続で表現する単位をCodeGearと呼ぶ</li> 138 <li>軽量継続で表現する単位をCodeGearと呼ぶ</li>
149 <li>CodeGearはCの関数とアセンブラの中間の様に使える</li> 139 <li>CodeGearはCの関数とアセンブラの中間の様に使える</li>
150 <li>CodeGearは返り値の型の代わりに<code>__code</code>で宣言する</li> 140 <li>CodeGearは返り値の型の代わりに<code>__code</code>で宣言する</li>
151 </ul> 141 </ul>
162 </span></span></foreignObject></svg></code></pre> 152 </span></span></foreignObject></svg></code></pre>
163 <ul> 153 <ul>
164 <li>cbcで書き直したxv6の<code>read</code>システムコールの例</li> 154 <li>cbcで書き直したxv6の<code>read</code>システムコールの例</li>
165 </ul> 155 </ul>
166 </section> 156 </section>
167 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="8" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="8" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 157 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="9" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="9" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
168 <h1>CbCの呼び出し</h1> 158 <h1>cbcで書き直したシステムコールディスパッチの例</h1>
169 <ul> 159 <ul>
170 <li>CbCは<code>goto</code>文で呼び出す</li> 160 <li>CbCは<code>goto</code>文で呼び出す
171 <li>cbcで書き直したシステムコールディスパッチの例
172 <ul> 161 <ul>
173 <li>受け取ったシステムコール番号に対応するCodeGearに継続する</li> 162 <li>受け取ったシステムコール番号に対応するCodeGearに継続する</li>
174 </ul> 163 </ul>
175 </li> 164 </li>
176 </ul> 165 </ul>
183 proc-&gt;cbc_arg.cbc_console_arg.num = num; 172 proc-&gt;cbc_arg.cbc_console_arg.num = num;
184 <span class="hljs-keyword">goto</span> (cbccodes[num])(cbc_ret); 173 <span class="hljs-keyword">goto</span> (cbccodes[num])(cbc_ret);
185 } 174 }
186 </span></span></foreignObject></svg></code></pre> 175 </span></span></foreignObject></svg></code></pre>
187 <ul> 176 <ul>
188 <li>呼び出し元には返ってこない</li> 177 <li>呼び出し元には返ってこない
189 </ul> 178 <ul>
190 </section> 179 <li>goto trapreturn() ユーザープログラムにディスパッチする</li>
191 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="9" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="9" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 180 <li>goto panic() 致命的なエラーとしてOSを止める</li>
181 <li>goto err() システムコールのエラー処理をしてユーザープログラムにディスパッチする</li>
182 </ul>
183 </li>
184 </ul>
185 </section>
186 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="10" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="10" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
192 <h1>CbCを用いたソフトウェアの実装</h1> 187 <h1>CbCを用いたソフトウェアの実装</h1>
193 <ul> 188 <ul>
194 <li>CodeGearはスタックを持てない為にデータの管理やCodeGear自体の管理をローカル変数で行えない 189 <li>計算を実行するためのメモリ領域が必要
195 <ul> 190 <ul>
196 <li>実際に利用するデータはスタック以外の場所で確保する必要がある</li> 191 <li>MetaDataGearと呼ぶ</li>
197 <li>確保した場所からメタ計算でデータを取り出し、 CodeGearに渡したい</li> 192 </ul>
198 </ul> 193 </li>
199 </li> 194 <li>メタレベルから見た実行ではcontextとして持ち歩く</li>
200 <li>OS内部でノーマルレベル/メタレベルの処理の切り分けをしたい 195 <li>ノーマルレベルからはアクセスするDataGearのみが見えていて、 ポインタなどは直接は見えない</li>
201 <ul> 196 <li>contextはプロセスごとに別に存在する</li>
202 <li>メタな計算を行うCodeGearは直接呼び出したくない</li> 197 <li>kernel内で共有されているデータ構造
203 </ul> 198 <ul>
204 </li> 199 <li>ページテーブル</li>
205 <li>ノーマル/メタのCodeGearの切り分けと、データの管理をする構造を作成した</li> 200 <li>ファイル構造体</li>
206 </ul> 201 <li>キャッシュやバッファ</li>
207 </section> 202 <li>これらはkernel context内に置かれる</li>
208 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="10" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="10" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 203 </ul>
204 </li>
205 </ul>
206 </section>
207 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="11" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="11" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
209 <h1>CbCのcotnext</h1> 208 <h1>CbCのcotnext</h1>
210 <ul> 209 <ul>
211 <li>CbCのプログラムで利用するCodeGearとデータの組を管理する機能 210 <li>CbCのプログラムで利用するCodeGearとデータの組を管理する機能
212 <ul> 211 <ul>
213 <li>データをDataGearという単位として扱う</li> 212 <li>データをDataGearという単位として扱う</li>
225 </ul> 224 </ul>
226 </li> 225 </li>
227 <li>実際のデータの入手、保存はcontextを触ることが出来るMeta Code Gearが行う</li> 226 <li>実際のデータの入手、保存はcontextを触ることが出来るMeta Code Gearが行う</li>
228 </ul> 227 </ul>
229 </section> 228 </section>
230 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="11" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="11" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 229 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="12" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="12" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
231 <h1>通常のCbCプログラム</h1> 230 <h1>通常のCbCプログラム</h1>
232 <ul> 231 <ul>
233 <li>プログラマから見るとCodeGearからCodeGearへの継続のみに見える<br /> 232 <li>プログラマから見るとCodeGearからCodeGearへの継続のみに見える<br />
234 <img src="assets/context1.svg" alt="" style="padding-left: 100px;" /></li> 233 <img src="assets/context1.svg" alt="" style="padding-left: 100px;" /></li>
235 </ul> 234 </ul>
236 </section> 235 </section>
237 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="12" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="12" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 236 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="13" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="13" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
238 <h1>実際のCbCプログラム</h1> 237 <h1>実際のCbCプログラム</h1>
239 <ul> 238 <ul>
240 <li>実際は1度contextを参照するMetaCodeGearに継続する 239 <li>実際は1度contextを参照するMetaCodeGearに継続する
241 <ul> 240 <ul>
242 <li>番号から次のCodeGearに対応するMetaCodeGearを取り出す</li> 241 <li>番号から次のCodeGearに対応するMetaCodeGearを取り出す</li>
243 </ul> 242 </ul>
244 </li> 243 </li>
245 </ul> 244 </ul>
246 <img src="assets/context2.svg" alt="" style="padding-left: 100px;" /> 245 <img src="assets/context2.svg" alt="" style="padding-left: 100px;" />
247 </section> 246 </section>
248 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="13" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="13" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 247 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="14" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="14" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
249 <h1>実際のCbCプログラム</h1> 248 <h1>実際のCbCプログラム</h1>
250 <ul> 249 <ul>
251 <li>MetaCodeGearでは次の計算に必要なDataGearを取り出す 250 <li>MetaCodeGearでは次の計算に必要なDataGearを取り出す
252 <ul> 251 <ul>
253 <li>全てのDataGearが確保できたらCodeGearにgotoする</li> 252 <li>全てのDataGearが確保できたらCodeGearにgotoする</li>
254 </ul> 253 </ul>
255 </li> 254 </li>
256 </ul> 255 </ul>
257 <img src="assets/context_last.svg" alt="" style="padding-left: 100px;" /> 256 <img src="assets/context_last.svg" alt="" style="padding-left: 100px;" />
258 </section> 257 </section>
259 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="14" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="14" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 258 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="15" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="15" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
260 <h1>CbCのcotnext</h1>
261 <ul>
262 <li>CbCのcontextを使うことでメタ計算とノーマルレベルの計算を切り分ける事ができる</li>
263 <li>計算に必要な全てのデータはcontext上に保存される</li>
264 <li>使用するCodeGearの組や入出力の情報もcontextに保存される</li>
265 <li>これらを用いてOSを書き換えたい</li>
266 </ul>
267 </section>
268 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="15" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="15" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;">
269 <h1>CbCを用いたOSの再実装</h1> 259 <h1>CbCを用いたOSの再実装</h1>
270 <ul> 260 <ul>
271 <li>CbCのCodeGearは状態遷移単位での記述に向いている</li> 261 <li>CbCのCodeGearは状態遷移単位での記述に向いている</li>
272 <li>状態遷移を基本としたモデルに変換し、HoareLogicなどの形式手法を用いて信頼性を高めたい</li> 262 <li>状態遷移を基本としたモデルに変換し、HoareLogicなどの形式手法を用いて信頼性を高めたい</li>
273 <li>CbCは比較的文法が簡易 263 <li>CbCは比較的文法が簡易
280 <li>最初の段階として既存のOSをCbCで再実装する</li> 270 <li>最初の段階として既存のOSをCbCで再実装する</li>
281 </ul> 271 </ul>
282 </li> 272 </li>
283 </ul> 273 </ul>
284 </section> 274 </section>
285 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="16" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="16" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 275 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="16" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="16" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
286 <h1>xv6</h1> 276 <h1>xv6</h1>
287 <ul> 277 <ul>
288 <li>マサチューセッツ工科大学で開発されたv6OSをもとにしたOS 278 <li>マサチューセッツ工科大学で開発されたv6OSをもとにしたOS
289 <ul> 279 <ul>
290 <li>x86向けにANSI Cで実装されている</li> 280 <li>x86向けにANSI Cで実装されている</li>
302 <li>今回は ARMのバージョンをCbCで再実装する</li> 292 <li>今回は ARMのバージョンをCbCで再実装する</li>
303 </ul> 293 </ul>
304 </li> 294 </li>
305 </ul> 295 </ul>
306 </section> 296 </section>
307 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="17" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="17" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 297 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="17" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="17" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
308 <h1>xv6のCbCでの書き換え</h1> 298 <h1>xv6のCbCでの書き換え</h1>
309 <ul> 299 <ul>
310 <li>既存のOSを段階的にCbCで書き換えていく 300 <li>既存のOSを段階的にCbCで書き換えていく
311 <ul> 301 <ul>
302 <li>一部スタックを持っている</li>
312 <li>CbCでOSを実装する際のプロトタイプ実装としての段階</li> 303 <li>CbCでOSを実装する際のプロトタイプ実装としての段階</li>
313 </ul> 304 </ul>
314 </li> 305 </li>
315 <li>今回はシステムコール部分の一部、 メモリ管理部分、 ファイルシステムなどを書き換えた</li> 306 <li>今回はシステムコール部分の一部、 メモリ管理部分、 ファイルシステムなどを書き換えた</li>
316 <li>CbCのcontextをプロセス構造体に埋め込み、 <code>goto</code>文を利用する場合はcontextからデータを参照する</li> 307 <li>CbCのcontextをプロセス構造体に埋め込み、 <code>goto</code>文を利用する場合はcontextからデータを参照する</li>
317 </ul> 308 </ul>
318 </section> 309 </section>
319 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="18" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="18" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 310 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="18" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="18" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
320 <h1>read system callの書き換え</h1> 311 <h1>read system callの書き換え</h1>
321 <ul> 312 <ul>
322 <li>xv6のシステムコールの一部を書き換えることを検討する</li> 313 <li>xv6のシステムコールの一部を書き換えることを検討する</li>
323 <li>最初にread systemcallの処理をCodeGearへの書き換えを行った</li> 314 <li>最初にread systemcallの処理をCodeGearへの書き換えを行った</li>
324 <li>readシステムコールなのでreadする対象によって処理が分岐する 315 <li>readシステムコールなのでreadする対象によって処理が分岐する
333 <li>スケジューラーに接続する箇所や、 sleepする箇所もCodeGearとして書き換える</li> 324 <li>スケジューラーに接続する箇所や、 sleepする箇所もCodeGearとして書き換える</li>
334 </ul> 325 </ul>
335 </li> 326 </li>
336 </ul> 327 </ul>
337 </section> 328 </section>
338 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="19" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="19" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 329 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="19" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="19" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
339 <h1>read system callの継続の一部</h1> 330 <h1>read system callの継続の一部</h1>
340 <ul> 331 <ul>
341 <li>実際に処理を切り分けているCodeGear 332 <li>実際に処理を切り分けているCodeGear
342 <ul> 333 <ul>
343 <li>ファイルの<code>type</code>によって継続先を変更する</li> 334 <li>ファイルの<code>type</code>によって継続先を変更する</li>
362 353
363 <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">cbc_panic</span><span class="hljs-params">(<span class="hljs-string">"fileread"</span>)</span></span>; 354 <span class="hljs-function"><span class="hljs-keyword">goto</span> <span class="hljs-title">cbc_panic</span><span class="hljs-params">(<span class="hljs-string">"fileread"</span>)</span></span>;
364 } 355 }
365 </span></span></foreignObject></svg></code></pre> 356 </span></span></foreignObject></svg></code></pre>
366 </section> 357 </section>
367 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="20" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="20" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 358 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="20" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="20" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
368 <h1>read システムコールの状態遷移図</h1> 359 <h1>read システムコールの状態遷移図</h1>
369 <ul> 360 <ul>
370 <li>システムコール中のCodeGearを状態遷移図にした 361 <li>システムコール中のCodeGearを状態遷移図にした
371 <ul> 362 <ul>
372 <li>自然言語で説明可能となる利点がある<br /> 363 <li>自然言語で説明可能となる利点がある<br />
373 <img src="assets/readsyscall.svg" alt="" style="padding-left: 20px;" /></li> 364 <img src="assets/readsyscall.svg" alt="" style="padding-left: 20px;" /></li>
374 </ul> 365 </ul>
375 </li> 366 </li>
376 </ul> 367 </ul>
377 </section> 368 </section>
378 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="21" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="21" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 369 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="21" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="21" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
379 <h1>Basic Block単位での書き換え</h1> 370 <h1>Basic Block単位での書き換え</h1>
380 <ul> 371 <ul>
372 <li>Basic Blockとはコンパイラの用語でループやリターンを区切りとするプログラミング単位
373 <ul>
374 <li>長くかかるループは間にgotoを挟むことによりメタ計算を間にいれる</li>
375 <li>1つのCodeGearにいる間は(論理的に)preemptされないことを保証する</li>
376 </ul>
377 </li>
378 <li>これによりCodeGearを割り込まれない検証の単位とする事ができる</li>
381 <li>仮想メモリ管理やファイルシステムなどの関数はxv6の場合Cのファイル単位でまとまっている 379 <li>仮想メモリ管理やファイルシステムなどの関数はxv6の場合Cのファイル単位でまとまっている
382 <ul> 380 <ul>
383 <li>CodeGear用のAPIをいきなり設計するのではなく、 段階的に書き換える</li> 381 <li>CodeGear用のAPIをいきなり設計するのではなく、 段階的に書き換える</li>
384 </ul> 382 </ul>
385 </li> 383 </li>
388 <li>各関数への呼び出し時にダミーの関数を呼び出すことでCとCbCの相互移動が可能</li> 386 <li>各関数への呼び出し時にダミーの関数を呼び出すことでCとCbCの相互移動が可能</li>
389 </ul> 387 </ul>
390 </li> 388 </li>
391 </ul> 389 </ul>
392 </section> 390 </section>
393 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="22" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="22" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 391 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="22" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="22" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
394 <h1>メモリ管理部分の書き換え</h1> 392 <h1>メモリ管理部分の書き換え</h1>
395 </section> 393 </section>
396 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="23" data-paginate="true" data-theme="c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7" data-marpit-pagination="23" data-marpit-pagination-total="23" style="--paginate:true;--theme:c2kfvr8jgqfsn3ewehvvwh4jg228qrr336cc0x1hrsq7;"> 394 </foreignObject></svg><svg data-marpit-svg="" viewBox="0 0 1280 720"><foreignObject width="1280" height="720"><section id="23" data-paginate="true" data-theme="xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu" data-marpit-pagination="23" data-marpit-pagination-total="23" style="--paginate:true;--theme:xaf9wumbjrcj6leq41cctez8slpif4zqklnz8ncdnu;">
397 <h1>まとめ</h1> 395 <h1>まとめ</h1>
398 <ul> 396 <ul>
399 <li>xv6の処理の一部を継続を用いてcbcで書き換えた 397 <li>xv6の処理の一部を継続を用いてcbcで書き換えた
400 <ul> 398 <ul>
401 <li>システムコールに着目する手法</li> 399 <li>システムコールに着目する手法</li>