LO41/Rapport projet LO41 Bartucc...

227 行
49 KiB
HTML
Raw パーマリンク Blame 履歴

このファイルには曖昧(ambiguous)なUnicode文字が含まれています

このファイルには、他の文字と見間違える可能性があるUnicode文字が含まれています。 それが意図的なものと考えられる場合は、この警告を無視して構いません。 それらの文字を表示するにはエスケープボタンを使用します。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="mobile-web-app-capable" content="yes">
<title>
Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur - HackMD
</title>
<link rel="icon" type="image/png" href="https://hackmd.io/favicon.png">
<link rel="apple-touch-icon" href="https://hackmd.io/apple-touch-icon.png">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha256-916EbMg70RQy9LHiGkXzG8hSg9EdNy97GazNG/aiY1w=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" integrity="sha256-eZrrJcwDc/3uDhsdt61sL2oOBY362qM3lon1gyExkL0=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/ionicons/2.0.1/css/ionicons.min.css" integrity="sha256-3iu9jgsy9TpTwXKb7bNQzqWekRX7pPK+2OLj3R922fo=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/octicons/3.5.0/octicons.min.css" integrity="sha256-QiWfLIsCT02Sdwkogf6YMiQlj4NE84MKkzEMkZnMGdg=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/prism/1.5.1/themes/prism.min.css" integrity="sha256-vtR0hSWRc3Tb26iuN2oZHt3KRUomwTufNIf5/4oeCyg=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/9.7.0/styles/github-gist.min.css" integrity="sha256-tAflq+ymku3Khs+I/WcAneIlafYgDiOQ9stIHH985Wo=" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/emojify.js/1.1.0/css/basic/emojify.min.css" integrity="sha256-UOrvMOsSDSrW6szVLe8ZDZezBxh5IoIfgTwdNDgTjiU=" crossorigin="anonymous" />
<style>
@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400italic,600,600italic,300italic,300|Source+Serif+Pro|Source+Code+Pro:400,300,500&subset=latin,latin-ext);.markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif;font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body:after,.markdown-body:before{display:table;content:""}.markdown-body:after{clear:both}.markdown-body>:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#c00}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body blockquote,.markdown-body dl,.markdown-body ol,.markdown-body p,.markdown-body pre,.markdown-body table,.markdown-body ul{margin-top:0;margin-bottom:16px}.markdown-body hr{height:.25em;padding:0;margin:24px 0;background-color:#e7e7e7;border:0}.markdown-body blockquote{padding:0 1em;color:#777;border-left:.25em solid #ddd}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body .loweralpha{list-style-type:lower-alpha}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#000;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 code,.markdown-body h1 tt,.markdown-body h2 code,.markdown-body h2 tt,.markdown-body h3 code,.markdown-body h3 tt,.markdown-body h4 code,.markdown-body h4 tt,.markdown-body h5 code,.markdown-body h5 tt,.markdown-body h6 code,.markdown-body h6 tt{font-size:inherit}.markdown-body h1{font-size:2em}.markdown-body h1,.markdown-body h2{padding-bottom:.3em;border-bottom:1px solid #eee}.markdown-body h2{font-size:1.5em}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:.875em}.markdown-body h6{font-size:.85em;color:#777}.markdown-body ol,.markdown-body ul{padding-left:2em}.markdown-body ol.no-list,.markdown-body ul.no-list{padding:0;list-style-type:none}.markdown-body ol ol,.markdown-body ol ul,.markdown-body ul ol,.markdown-body ul ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:700}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto;word-break:normal;word-break:keep-all}.markdown-body table th{font-weight:700}.markdown-body table td,.markdown-body table th{padding:6px 13px;border:1px solid #ddd}.markdown-body table tr{background-color:#fff;border-top:1px solid #ccc}.markdown-body table tr:nth-child(2n){background-color:#f8f8f8}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #ddd}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#333}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:0;padding-top:.2em;padding-bottom:.2em;margin:0;font-size:85%;background-color:rgba(0,0,0,.04);border-radius:3px}.markdown-body code:after,.markdown-body code:before,.markdown-body tt:after,.markdown-body tt:before{letter-spacing:-.2em;content:"\A0"}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f7f7f7;border-radius:3px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body pre code:after,.markdown-body pre code:before,.markdown-body pre tt:after,.markdown-body pre tt:before{content:normal}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-line-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:700;background:#f8f8f8;border-top:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#555;vertical-align:middle;background-color:#fcfcfc;border:1px solid #ccc;border-bottom-color:#bbb;border-radius:3px;box-shadow:inset 0 -1px 0 #bbb}.news .alert .markdown-body blockquote{padding:0 0 0 40px;border:0 none}.activity-tab .news .alert .commits,.activity-tab .news .markdown-body blockquote{padding-left:0}.task-list-item{list-style-type:none}.task-list-item label{font-weight:400}.task-list-item.enabled label{cursor:pointer}.task-list-item+.task-list-item{margin-top:3px}.task-list-item-checkbox{float:left;margin:.31em 0 .2em -1.3em!important;vertical-align:middle;cursor:default!important}.markdown-body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,sans-serif;padding-top:40px;padding-bottom:40px;max-width:758px;overflow:visible!important}.markdown-body pre{border:inherit!important}.markdown-body code{color:inherit!important}.markdown-body pre code .wrapper{display:-moz-inline-flex;display:-ms-inline-flex;display:-o-inline-flex;display:inline-flex}.markdown-body pre code .gutter{float:left;overflow:hidden;-webkit-user-select:none;user-select:none}.markdown-body pre code .gutter.linenumber{text-align:right;position:relative;display:inline-block;cursor:default;z-index:4;padding:0 8px 0 0;min-width:20px;box-sizing:content-box;color:#afafaf!important;border-right:3px solid #6ce26c!important}.markdown-body pre code .gutter.linenumber>span:before{content:attr(data-linenumber)}.markdown-body pre code .code{float:left;margin:0 0 0 16px}.markdown-body .gist .line-numbers{border-left:none;border-top:none;border-bottom:none}.markdown-body .gist .line-data{border:none}.markdown-body .gist table{border-spacing:0;border-collapse:inherit!important}.markdown-body code[data-gist-id]{background:none;padding:0}.markdown-body code[data-gist-id]:after,.markdown-body code[data-gist-id]:before{content:""}.markdown-body code[data-gist-id] .blob-num{border:unset}.markdown-body code[data-gist-id] table{overflow:unset;margin-bottom:unset}.markdown-body code[data-gist-id] table tr{background:unset}.markdown-body[dir=rtl] pre{direction:ltr}.markdown-body[dir=rtl] code{direction:ltr;unicode-bidi:embed}.markdown-body .alert>p{margin-bottom:0}.markdown-body pre.abc,.markdown-body pre.flow-chart,.markdown-body pre.graphviz,.markdown-body pre.mermaid,.markdown-body pre.sequence-diagram{text-align:center;background-color:inherit;border-radius:0;white-space:inherit}.markdown-body pre.abc>code,.markdown-body pre.flow-chart>code,.markdown-body pre.graphviz>code,.markdown-body pre.mermaid>code,.markdown-body pre.sequence-diagram>code{text-align:left}.markdown-body pre.abc>svg,.markdown-body pre.flow-chart>svg,.markdown-body pre.graphviz>svg,.markdown-body pre.mermaid>svg,.markdown-body pre.sequence-diagram>svg{max-width:100%;height:100%}.markdown-body pre>code.wrap{white-space:pre-wrap;white-space:-moz-pre-wrap;white-space:-pre-wrap;white-space:-o-pre-wrap;word-wrap:break-word}.markdown-body .alert>p,.markdown-body .alert>ul{margin-bottom:0}.markdown-body summary{display:list-item}.markdown-body summary:focus{outline:none}.markdown-body details summary{cursor:pointer}.markdown-body details:not([open])>:not(summary){display:none}.markdown-body figure{margin:1em 40px}.vimeo,.youtube{cursor:pointer;display:table;text-align:center;background-position:50%;background-repeat:no-repeat;background-size:contain;background-color:#000;overflow:hidden}.vimeo,.youtube{position:relative;width:100%}.youtube{padding-bottom:56.25%}.vimeo img{width:100%;object-fit:contain;z-index:0}.youtube img{object-fit:cover;z-index:0}.vimeo iframe,.youtube iframe,.youtube img{width:100%;height:100%;position:absolute;top:0;left:0}.vimeo iframe,.youtube iframe{vertical-align:middle;z-index:1}.vimeo .icon,.youtube .icon{position:absolute;height:auto;width:auto;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;opacity:.3;transition:opacity .2s;z-index:0}.vimeo:hover .icon,.youtube:hover .icon{opacity:.6;transition:opacity .2s}.slideshare .inner,.speakerdeck .inner{position:relative;width:100%}.slideshare .inner iframe,.speakerdeck .inner iframe{position:absolute;top:0;bottom:0;left:0;right:0;width:100%;height:100%}.MJX_Assistive_MathML{display:none}.ui-infobar{position:relative;z-index:2;max-width:758px;margin-top:25px;margin-bottom:-25px;color:#777}.ui-toc{position:fixed;bottom:20px;z-index:10000}.ui-toc-label{opacity:.3;background-color:#ccc;border:none;transition:opacity .2s}.ui-toc .open .ui-toc-label{opacity:1;color:#fff;transition:opacity .2s}.ui-toc-label:focus{opacity:.3;background-color:#ccc;color:#000}.ui-toc-label:hover{opacity:1;background-color:#ccc;transition:opacity .2s}.ui-toc-dropdown{margin-top:23px;margin-bottom:20px;padding-left:10px;padding-right:10px;max-width:45vw;width:25vw;max-height:70vh;overflow:auto;text-align:inherit}.ui-toc-dropdown>.toc{max-height:calc(70vh - 100px);overflow:auto}.ui-toc-dropdown[dir=rtl] .nav{padding-right:0;letter-spacing:.0029em}.ui-toc-dropdown a{overflow:hidden;text-overflow:ellipsis;white-space:pre}.ui-toc-dropdown .nav>li>a{display:block;padding:4px 20px;font-size:13px;font-weight:500;color:#767676}.ui-toc-dropdown .nav>li:first-child:last-child > ul,.ui-toc-dropdown .toc.expand ul{display:block}.ui-toc-dropdown .nav>li>a:focus,.ui-toc-dropdown .nav>li>a:hover{padding-left:19px;color:#000;text-decoration:none;background-color:transparent;border-left:1px solid #000}.ui-toc-dropdown[dir=rtl] .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav>li>a:hover{padding-right:19px;border-left:none;border-right:1px solid #000}.ui-toc-dropdown .nav>.active:focus>a,.ui-toc-dropdown .nav>.active:hover>a,.ui-toc-dropdown .nav>.active>a{padding-left:18px;font-weight:700;color:#000;background-color:transparent;border-left:2px solid #000}.ui-toc-dropdown[dir=rtl] .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav>.active>a{padding-right:18px;border-left:none;border-right:2px solid #000}.ui-toc-dropdown .nav .nav{display:none;padding-bottom:10px}.ui-toc-dropdown .nav>.active>ul{display:block}.ui-toc-dropdown .nav .nav>li>a{padding-top:1px;padding-bottom:1px;padding-left:30px;font-size:12px;font-weight:400}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a{padding-right:30px}.ui-toc-dropdown .nav .nav>li>ul>li>a{padding-top:1px;padding-bottom:1px;padding-left:40px;font-size:12px;font-weight:400}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a{padding-right:40px}.ui-toc-dropdown .nav .nav>li>a:focus,.ui-toc-dropdown .nav .nav>li>a:hover{padding-left:29px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>a:hover{padding-right:29px}.ui-toc-dropdown .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown .nav .nav>li>ul>li>a:hover{padding-left:39px}.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:focus,.ui-toc-dropdown[dir=rtl] .nav .nav>li>ul>li>a:hover{padding-right:39px}.ui-toc-dropdown .nav .nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>a{padding-left:28px;font-weight:500}.ui-toc-dropdown[dir=rtl] .nav .nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>a{padding-right:28px}.ui-toc-dropdown .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown .nav .nav>.active>.nav>.active>a{padding-left:38px;font-weight:500}.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:focus>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active:hover>a,.ui-toc-dropdown[dir=rtl] .nav .nav>.active>.nav>.active>a{padding-right:38px}.markdown-body[lang^=ja]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,Hiragino Kaku Gothic Pro,\\30D2\30E9\30AE\30CE\89D2\30B4 Pro W3,Osaka,Meiryo,\\30E1\30A4\30EA\30AA,MS Gothic,"\FF2D\FF33 \30B4\30B7\30C3\30AF",sans-serif}.ui-toc-dropdown[lang^=ja]{font-family:Source Sans Pro,Helvetica,Arial,Meiryo UI,MS PGothic,"\FF2D\FF33 \FF30\30B4\30B7\30C3\30AF",sans-serif}.markdown-body[lang=zh-tw]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,PingFang TC,Microsoft JhengHei,\\5FAE\8EDF\6B63\9ED1,sans-serif}.ui-toc-dropdown[lang=zh-tw]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft JhengHei UI,\\5FAE\8EDF\6B63\9ED1UI,sans-serif}.markdown-body[lang=zh-cn]{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Helvetica,Arial,PingFang SC,Microsoft YaHei,\\5FAE\8F6F\96C5\9ED1,sans-serif}.ui-toc-dropdown[lang=zh-cn]{font-family:Source Sans Pro,Helvetica,Arial,Microsoft YaHei UI,\\5FAE\8F6F\96C5\9ED1UI,sans-serif}.ui-affix-toc{position:fixed;top:0;max-width:15vw;max-height:70vh;overflow:auto}.back-to-top,.expand-toggle,.go-to-bottom{display:block;padding:4px 10px;margin-top:10px;margin-left:10px;font-size:12px;font-weight:500;color:#999}.back-to-top:focus,.back-to-top:hover,.expand-toggle:focus,.expand-toggle:hover,.go-to-bottom:focus,.go-to-bottom:hover{color:#563d7c;text-decoration:none}.back-to-top,.go-to-bottom{margin-top:0}.ui-user-icon{width:20px;height:20px;display:block;border-radius:3px;margin-top:2px;margin-bottom:2px;margin-right:5px;background-position:50%;background-repeat:no-repeat;background-size:contain}.ui-user-icon.small{width:18px;height:18px;display:inline-block;vertical-align:middle;margin:0 0 .2em}.ui-infobar>small>span{line-height:22px}.ui-infobar>small .dropdown{display:inline-block}.ui-infobar>small .dropdown a:focus,.ui-infobar>small .dropdown a:hover{text-decoration:none}.unselectable{-moz-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}@media print{blockquote,div,img,pre,table{page-break-inside:avoid!important}a[href]:after{font-size:12px!important}}.markdown-body.slides{position:relative;z-index:1;color:#222}.markdown-body.slides:before{content:"";display:block;position:absolute;top:0;left:0;right:0;bottom:0;z-index:-1;background-color:currentColor;box-shadow:0 0 0 50vw}.markdown-body.slides section[data-markdown]{position:relative;margin-bottom:1.5em;background-color:#fff;text-align:center}.markdown-body.slides section[data-markdown] code{text-align:left}.markdown-body.slides section[data-markdown]:before{content:"";display:block;padding-bottom:56.23%}.markdown-body.slides section[data-markdown]>div:first-child{position:absolute;top:50%;left:1em;right:1em;transform:translateY(-50%);max-height:100%;overflow:hidden}.markdown-body.slides section[data-markdown]>ul{display:inline-block}.markdown-body.slides>section>section+section:after{content:"";position:absolute;top:-1.5em;right:1em;height:1.5em;border:3px solid #777}body{font-smoothing:subpixel-antialiased!important;-webkit-font-smoothing:subpixel-antialiased!important;-moz-osx-font-smoothing:auto!important;text-shadow:0 0 1em transparent,1px 1px 1.2px rgba(0,0,0,.004);-webkit-overflow-scrolling:touch;font-family:Source Sans Pro,Helvetica,Arial,sans-serif;letter-spacing:.025em}.focus,:focus{outline:none!important}::-moz-focus-inner{border:0!important}body.modal-open{overflow-y:auto;padding-right:0!important}
</style>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js" integrity="sha256-3Jy/GbSLrg0o9y5Z5n1uw0qxZECH7C6OQpVBgNFYa0g=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js" integrity="sha256-g6iAfvZp+nDQ2TdTR/VVKJf3bGro4ub5fvWSWVRi2NE=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/es5-shim/4.5.9/es5-shim.min.js" integrity="sha256-8E4Is26QH0bD52WoQpcB+R/tcWQtpzlCojrybUd7Mxo=" crossorigin="anonymous"></script>
<![endif]-->
</head>
<body>
<div id="doc" class="markdown-body container-fluid" style="position: relative;"><h1 id="Rapport-projet-LO41-Bartuccio-Antoine-et-Amalvy-Arthur"><a class="anchor hidden-xs" href="#Rapport-projet-LO41-Bartuccio-Antoine-et-Amalvy-Arthur" title="Rapport-projet-LO41-Bartuccio-Antoine-et-Amalvy-Arthur" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur</h1><h1 id="Interprétation-du-sujet"><a class="anchor hidden-xs" href="#Interprétation-du-sujet" title="Interprétation-du-sujet" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Interprétation du sujet</h1><p>Ce sujet de LO41 étant volontairement vague pour permettre de nombreuses implémentations différentes, et la contrainte vis à vis du temps étant importante, il était impossible dajouter toutes les fonctionnalitées proposées. Il a donc fallu opérer un choix pragmatique afin de rendre un travail le plus complet possible tout en sapprochant un maximum de la vision originelle du sujet.</p><p>Dans un premier temps, nous avons répertorié les contraintes auxquelles nous ne pouvions nous soustraire. Cest donc bien évidemment que nous avons conservé le bâtiment de 25 étages ainsi que les 3 ascenseurs et la borne interactive au pied de ce dernier. Cest à ce moment là que se sont posées les questions les plus importantes et pouvant potentiellement modifier complètement le résultat du projet : est-ce seulement la borne qui permet dappeler les ascenseurs ? Auquel cas, puisquelle est au pied de limmeuble personne ne peut redescendre autrement quen prenant les escaliers. Devons nous utiliser un bouton par ascenseur ou un système dappel centralisé ? Si on ajoute un bouton pour les ascenseurs à chaque étage, à quoi sert donc la borne au final ? Est-elle uniquement dédiée aux visiteurs ou est-elle utilisable par les résidents ? Est-elle vraiment pertinente ? La rendre indépendante est-il vraiment un choix intéressant ? Allons nous empêcher certains ascenseurs daccéder à certains étages ou faire en sorte quils aient tous accès à lentièreté de limmeuble ? Comment faire pour le dépannage ? Comment peut-on déterminer quun technicien est plus à même dintervenir ? Doit-on avoir plusieurs types de pannes nécessitant différents outils ? Combien tout ceci va-t-il coûter à la copropriété ?</p><p>Nous avons donc commencé par trancher sur lutilisation de la borne. Cette borne aura une utilité assez limitée et sera cantonée à la recherche de létage dun résident par un visiteur. Globalement, elle sera simulée par une fonction renvoyant létage dun résident à partir de son nom. Lappel des ascenseur se fera en interrogeant directement le bâtiment qui se chargera tout seul dindiquer un ascenseur à partir simplement de létage de départ et de létage darrivée souhaité. Lordonancement des ascenseurs se fera donc directement depuis le bâtiment.</p><p>Nous en arrivons donc logiquement à une distinction visiteurs et résidents. Les visiteurs démarrent à leur étage dhabitation et se déplacent ou non selon leur envie. Les visiteurs, quand à eux, souhaitent rejoindre létage dun résident dont ils connaissent uniquement le nom, ils demandent donc à la borne où celui-ci réside, et tentent dy accéder en utilisant les ascenceurs.</p><p>Enfin, pour les réparations, il a été décidé, afin déviter de peser trop fortement sur le budget de la copropriété, dengager un seul réparateur prêt à répondre à tous les cas pratique et toutes les pannes. Il sera appelé par les ascenseurs qui détecteront automatiquement les pannes et attendront leur réparation selon la disponibilité de cette ressource critique.</p><h1 id="Mise-en-place-de-larchitecture"><a class="anchor hidden-xs" href="#Mise-en-place-de-larchitecture" title="Mise-en-place-de-larchitecture" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Mise en place de larchitecture</h1><h2 id="Le-choix-des-moniteurs-et-des-threads"><a class="anchor hidden-xs" href="#Le-choix-des-moniteurs-et-des-threads" title="Le-choix-des-moniteurs-et-des-threads" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Le choix des moniteurs et des threads</h2><p>Dans le cadre de lUV LO41, nous avons eu loccasion dexpérimenter et de tester différentes méthodes de parallélisation via lAPI du système Linux et UNIX. Nous avons donc dû effectuer un choix crucial : utiliser des processus indépendants ou un seul processus avec plusieurs threads.</p><p>Notre choix sest porté sur lutilisation de threads et de moniteurs. En effet, ils sont bien plus simples dusage, puisque toute la mémoire du programme est partagée, permettant une communication efficiente et simple entre les différentes sections indépendantes de celui-ci. De plus, en cas dextinction non contrôlée du programme (particulièrement pratique en phase de tests), il est simple dopérer vis-à-vis de lextinction des threads : On évite ainsi tout processus zombie, et donc latteinte de la limite maximum de processus système.</p><p>Mais surtout, ce qui a le plus fait pencher la balance en faveur des moniteurs est le fait que cette technologie est présente dans des languages de plus haut niveau tel que le java. En effet, on retrouve ce genre de mécanisme directement intégré au language via le mot clef synchronize. Cest ce type de comportement que nous avons souhaité imiter.</p><h2 id="Une-architecture-orientée-objet"><a class="anchor hidden-xs" href="#Une-architecture-orientée-objet" title="Une-architecture-orientée-objet" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Une architecture orientée objet</h2><p>En observant le language java, nous avons remarqué quune architecture orientée objet, avec son encapsulation, était particulièrement adaptée à la parallélisation, et notamment dans le cadre dutilisation des moniteurs. Cest donc sur ce concept solide et éprouvé que nous avons construit notre projet.</p><p>Petit problème, nous sommes contraint, de par le sujet, à utiliser le langage C. Ce langage très populaire, inventé en 1972 par Dennis Ritchie, nest pas pensé pour ce genre dapproche. Il a donc fallu mettre en place bon nombre de stratégies pour rendre cohérente et agréable une approche de programmation non prévue par notre outil. Nous avons poussé le langage dans ses retranchements grâce à de nombreuses macros de manière à modifier la syntaxe selon nos besoins.</p><p>Le temps consacré à la mise en place de cette structure est loin davoir été perdu et nous a permis de gagner en consistance et en clarté dans notre code. Les fuites de mémoires sont très rares et faciles à régler, le lancement des threads est très simple et ils peuvent être stoppés à tout moment grâce à lutilisation dun singleton persistant contenant les différents objets systèmes. Le partage de la mémoire est très simple grâce à une utilisation de getter et setter encapsulant les mutexs. Les interblocages sont quasiment impossibles à réaliser de cette manière.</p><p>Voici, pour illustrer, le très concis thread principal de notre programme qui permet dapprécier à sa juste valeur les modifications apportées à la syntaxe et à lagencement des structures pour les faire ressembler à des objets :</p><pre><code class="c hljs"><span class="token keyword">int</span> <span class="token function">main</span><span class="token punctuation">(</span><span class="token keyword">int</span> argc<span class="token punctuation">,</span> <span class="token keyword">char</span><span class="token operator">*</span> argv<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
SharedData <span class="token operator">*</span> shared_data <span class="token operator">=</span> <span class="token function">GET_INSTANCE</span><span class="token punctuation">(</span>SharedData<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">signal</span><span class="token punctuation">(</span>SIGINT<span class="token punctuation">,</span> clean_exit<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>argc <span class="token operator">==</span> <span class="token number">3</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
shared_data<span class="token operator">-&gt;</span><span class="token function">set_main_building</span><span class="token punctuation">(</span>shared_data<span class="token punctuation">,</span> <span class="token function">NEW</span><span class="token punctuation">(</span>Building<span class="token punctuation">,</span> argv<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">,</span> argv<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>argc <span class="token operator">==</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">{</span>
shared_data<span class="token operator">-&gt;</span><span class="token function">set_main_building</span><span class="token punctuation">(</span>shared_data<span class="token punctuation">,</span> <span class="token function">NEW</span><span class="token punctuation">(</span>Building<span class="token punctuation">,</span> <span class="token string">"../residents.txt"</span><span class="token punctuation">,</span> <span class="token string">"../visitors.txt"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span> <span class="token keyword">else</span><span class="token punctuation">{</span>
<span class="token function">CRASH</span><span class="token punctuation">(</span><span class="token string">"Arguments invalides\nUsage : ./LO41 [residents_file visitors_file]\n"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
shared_data<span class="token operator">-&gt;</span><span class="token function">start_all_threads</span><span class="token punctuation">(</span>shared_data<span class="token punctuation">)</span><span class="token punctuation">;</span>
shared_data<span class="token operator">-&gt;</span><span class="token function">wait_all_threads</span><span class="token punctuation">(</span>shared_data<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">DELETE</span><span class="token punctuation">(</span>shared_data<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre><h2 id="Lintroduction-des-agents"><a class="anchor hidden-xs" href="#Lintroduction-des-agents" title="Lintroduction-des-agents" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Lintroduction des agents</h2><p>De lobjet à lagent il ny a quun pas, lindépendance. Enfin, pas vraiment, mais presque. Nous avons eu loccasion lors de notre cursus de travailler sur un langage orienté agent : le SARL. Même si celui-ci reste perfectible, il a su nous inspirer lors de la conception de ce projet. Même si nous navons pas le temps dimplémenter de la communication entre agents dans des contextes séparés le tout en architecture holonique, nous avons repris lidée de lagent et lavons adaptée à notre architecture et notre projet.</p><p>Globalement, il existe 4 types dagents dans ce projet : les ascenseurs, les visiteurs, les résidents et le casseur dascenseur (pour casser les ascenseurs de temps en temps). Ils sont chacun lancés dans leur propre thread et tentent datteindre leur objectif indépendamment tout en interagissant avec les autres. Ils réagissent également lorsquils reçoivent un signal dapoptose les invitant à mettre fin à leur existence dans le but de libérer les ressources, dans le cadre dune fin prévue ou non du programme.</p><p>Pour y parvenir, nous avons attaché à chacun de ces trois objets une méthode <code>runnable</code>, qui prend en paramètre une référence vers lobjet lui même et qui configure le thread de manière à répondre de manière normalisée aux signaux. En effet, chaque agent se doit de répondre correctement aux signaux dapoptose (attachés à SIGUSR1) et dignorer les signaux darrêt (SIGINT) pour ne pas quils linterceptent à la place du thread principal puisque la réception de signal dans un environnement multithread nest pas predictive.</p><p>Attention en utilisant lAPI pthread, envoyer un signal (avec <code>pthread_kill</code>) vers un thread terminé a un comportement non défini daprès la spécification du standard. On observe ainsi des comportements très variés selon lOS. Pour pallier à cela, nous avons mis en place un système de déréférencement des threads terminés.</p><h2 id="Le-choix-des-scénarios-prétirés"><a class="anchor hidden-xs" href="#Le-choix-des-scénarios-prétirés" title="Le-choix-des-scénarios-prétirés" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Le choix des scénarios prétirés</h2><p>Dans ce projet, nous avons fait le choix de ne pas effectuer de génération aléatoire de clients. En effet, le programme opère vis-à-vis de scénarios pré-tirés injectables directement à lexécution du programme. Cela permet notamment de facilement reproduire en phase de développement les différents situations pratiques non souhaitées par le développeur dans une optique damélioration de la stabilité du programme… Ces scenarios se présentent sous la forme de fichiers textes au format csv où les différentes données sont séparées par des points virgule.</p><h1 id="Architecture"><a class="anchor hidden-xs" href="#Architecture" title="Architecture" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Architecture</h1><h2 id="Diagramme-des-classes"><a class="anchor hidden-xs" href="#Diagramme-des-classes" title="Diagramme-des-classes" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Diagramme des classes</h2><p>Puisque nous respectons aussi rigoureusement que possible une architecture objet, nous sommes en mesure de vous fournir un diagramme de classe du projet.</p><p>Nous avons tout dabord commencé par faire une liste chaînée afin de tester notre architecture objet.<br>
<img src="https://i.imgur.com/rcbNfz2.png" alt=""></p><p>Voici enfin ce que donne larchitecture du projet.<br>
<img src="https://i.imgur.com/0QwVT5k.png" alt=""></p><p>On observe en particulier la singularité de lobjet SharedData, vis-à-vis en tout cas de ses pairs. En effet, celui-ci opère en tant que singleton et permet notamment de référencer et déréférencer tous les threads, et ce quelque soit le contexte dans lequel opère le programme.</p><h2 id="Réseau-de-Pétri"><a class="anchor hidden-xs" href="#Réseau-de-Pétri" title="Réseau-de-Pétri" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Réseau de Pétri</h2><p>Même si notre architecture initiale limite déjà fortmenet les possibilités dinterblocages, il était judicieux de modéliser de manière abstraite le fonctionnement théorique et basique de lattente dun utilisateur à un étage à laide dun réseau de Pétri. La priorité est ici simulée par un nombre détapes plus ou moins faible pour chaque ascenseur. Il faut cependant ne pas oublier que les ascenseurs devant être intelligents et autonomes, il est impossible avec un outil tel que le réseau de pétri de modéliser fidèlement leur comportement. Ce réseau ne donne donc quune vision simplifiée du principe et limplémentation sen éloigne parfois.</p><p><img src="https://i.imgur.com/nbTpyfB.png" alt=""></p><h1 id="Guide-dutilisation"><a class="anchor hidden-xs" href="#Guide-dutilisation" title="Guide-dutilisation" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Guide dutilisation</h1><h2 id="Phase-de-compilation"><a class="anchor hidden-xs" href="#Phase-de-compilation" title="Phase-de-compilation" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Phase de compilation</h2><p>Le logiciel utilise la technologie cmake pour gérer le projet. Voici donc les étapes nécessaires à sa compilation.</p><pre><code class="shell hljs"><span class="token function">mkdir</span> out
<span class="token function">cd</span> out
cmake <span class="token punctuation">..</span>
<span class="token function">make</span>
</code></pre><h2 id="Exécution"><a class="anchor hidden-xs" href="#Exécution" title="Exécution" data-vivaldi-spatnav-clickable="1"><span class="octicon octicon-link"></span></a>Exécution</h2><p>Ce programme peut sexécuter avec ou sans arguments. Sans arguments, le logiciel ouvre automatiquement les fichiers …/residents.txt et …/visitors.txt. Avec arguments, il est possible de choisir de lancer des scénarios personnalisés.</p><pre><code class="shell hljs">./LO41 <span class="token punctuation">[</span>fichier_residents fichier_visiteurs<span class="token punctuation">]</span>
./LO41 <span class="token comment"># -&gt; correspond à ./LO41 ../residents.txt ../visitors.txt </span>
</code></pre></div>
<div class="ui-toc dropup unselectable hidden-print" style="display:none;">
<div class="pull-right dropdown">
<a id="tocLabel" class="ui-toc-label btn btn-default" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false" title="Table of content">
<i class="fa fa-bars"></i>
</a>
<ul id="ui-toc" class="ui-toc-dropdown dropdown-menu" aria-labelledby="tocLabel">
<div class="toc"><ul class="nav"><li class=""><a href="#Rapport-projet-LO41-Bartuccio-Antoine-et-Amalvy-Arthur" title="Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur" data-vivaldi-spatnav-clickable="1">Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur</a></li><li class=""><a href="#Interprétation-du-sujet" title="Interprétation du sujet" data-vivaldi-spatnav-clickable="1">Interprétation du sujet</a></li><li><a href="#Mise-en-place-de-larchitecture" title="Mise en place de larchitecture" data-vivaldi-spatnav-clickable="1">Mise en place de larchitecture</a><ul class="nav"><li><a href="#Le-choix-des-moniteurs-et-des-threads" title="Le choix des moniteurs et des threads" data-vivaldi-spatnav-clickable="1">Le choix des moniteurs et des threads</a></li><li><a href="#Une-architecture-orientée-objet" title="Une architecture orientée objet" data-vivaldi-spatnav-clickable="1">Une architecture orientée objet</a></li><li><a href="#Lintroduction-des-agents" title="Lintroduction des agents" data-vivaldi-spatnav-clickable="1">Lintroduction des agents</a></li><li><a href="#Le-choix-des-scénarios-prétirés" title="Le choix des scénarios prétirés" data-vivaldi-spatnav-clickable="1">Le choix des scénarios prétirés</a></li></ul></li><li class=""><a href="#Architecture" title="Architecture" data-vivaldi-spatnav-clickable="1">Architecture</a><ul class="nav"><li class=""><a href="#Diagramme-des-classes" title="Diagramme des classes" data-vivaldi-spatnav-clickable="1">Diagramme des classes</a></li><li class=""><a href="#Réseau-de-Pétri" title="Réseau de Pétri" data-vivaldi-spatnav-clickable="1">Réseau de Pétri</a></li></ul></li><li class=""><a href="#Guide-dutilisation" title="Guide dutilisation" data-vivaldi-spatnav-clickable="1">Guide dutilisation</a><ul class="nav"><li><a href="#Phase-de-compilation" title="Phase de compilation" data-vivaldi-spatnav-clickable="1">Phase de compilation</a></li><li class=""><a href="#Exécution" title="Exécution" data-vivaldi-spatnav-clickable="1">Exécution</a></li></ul></li></ul></div><div class="toc-menu"><a class="expand-toggle" href="#" data-vivaldi-spatnav-clickable="1">Expand all</a><a class="back-to-top" href="#" data-vivaldi-spatnav-clickable="1">Back to top</a><a class="go-to-bottom" href="#" data-vivaldi-spatnav-clickable="1">Go to bottom</a></div>
</ul>
</div>
</div>
<div id="ui-toc-affix" class="ui-affix-toc ui-toc-dropdown unselectable hidden-print" data-spy="affix" style="top:17px;display:none;" >
<div class="toc"><ul class="nav"><li class=""><a href="#Rapport-projet-LO41-Bartuccio-Antoine-et-Amalvy-Arthur" title="Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur" data-vivaldi-spatnav-clickable="1">Rapport projet LO41 Bartuccio Antoine et Amalvy Arthur</a></li><li class=""><a href="#Interprétation-du-sujet" title="Interprétation du sujet" data-vivaldi-spatnav-clickable="1">Interprétation du sujet</a></li><li><a href="#Mise-en-place-de-larchitecture" title="Mise en place de larchitecture" data-vivaldi-spatnav-clickable="1">Mise en place de larchitecture</a><ul class="nav"><li><a href="#Le-choix-des-moniteurs-et-des-threads" title="Le choix des moniteurs et des threads" data-vivaldi-spatnav-clickable="1">Le choix des moniteurs et des threads</a></li><li><a href="#Une-architecture-orientée-objet" title="Une architecture orientée objet" data-vivaldi-spatnav-clickable="1">Une architecture orientée objet</a></li><li><a href="#Lintroduction-des-agents" title="Lintroduction des agents" data-vivaldi-spatnav-clickable="1">Lintroduction des agents</a></li><li><a href="#Le-choix-des-scénarios-prétirés" title="Le choix des scénarios prétirés" data-vivaldi-spatnav-clickable="1">Le choix des scénarios prétirés</a></li></ul></li><li class=""><a href="#Architecture" title="Architecture" data-vivaldi-spatnav-clickable="1">Architecture</a><ul class="nav"><li class=""><a href="#Diagramme-des-classes" title="Diagramme des classes" data-vivaldi-spatnav-clickable="1">Diagramme des classes</a></li><li class=""><a href="#Réseau-de-Pétri" title="Réseau de Pétri" data-vivaldi-spatnav-clickable="1">Réseau de Pétri</a></li></ul></li><li class=""><a href="#Guide-dutilisation" title="Guide dutilisation" data-vivaldi-spatnav-clickable="1">Guide dutilisation</a><ul class="nav"><li><a href="#Phase-de-compilation" title="Phase de compilation" data-vivaldi-spatnav-clickable="1">Phase de compilation</a></li><li class=""><a href="#Exécution" title="Exécution" data-vivaldi-spatnav-clickable="1">Exécution</a></li></ul></li></ul></div><div class="toc-menu"><a class="expand-toggle" href="#" data-vivaldi-spatnav-clickable="1">Expand all</a><a class="back-to-top" href="#" data-vivaldi-spatnav-clickable="1">Back to top</a><a class="go-to-bottom" href="#" data-vivaldi-spatnav-clickable="1">Go to bottom</a></div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js" integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8=" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha256-U5ZEeKfGNOja007MMD3YBI0A3OSZOQbeG6z2f2Y0hu8=" crossorigin="anonymous" defer></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gist-embed/2.6.0/gist-embed.min.js" integrity="sha256-KyF2D6xPIJUW5sUDSs93vWyZm+1RzIpKCexxElmxl8g=" crossorigin="anonymous" defer></script>
<script>
var markdown = $(".markdown-body");
//smooth all hash trigger scrolling
function smoothHashScroll() {
var hashElements = $("a[href^='#']").toArray();
for (var i = 0; i < hashElements.length; i++) {
var element = hashElements[i];
var $element = $(element);
var hash = element.hash;
if (hash) {
$element.on('click', function (e) {
// store hash
var hash = this.hash;
if ($(hash).length <= 0) return;
// prevent default anchor click behavior
e.preventDefault();
// animate
$('body, html').stop(true, true).animate({
scrollTop: $(hash).offset().top
}, 100, "linear", function () {
// when done, add hash to url
// (default click behaviour)
window.location.hash = hash;
});
});
}
}
}
smoothHashScroll();
var toc = $('.ui-toc');
var tocAffix = $('.ui-affix-toc');
var tocDropdown = $('.ui-toc-dropdown');
//toc
tocDropdown.click(function (e) {
e.stopPropagation();
});
var enoughForAffixToc = true;
function generateScrollspy() {
$(document.body).scrollspy({
target: ''
});
$(document.body).scrollspy('refresh');
if (enoughForAffixToc) {
toc.hide();
tocAffix.show();
} else {
tocAffix.hide();
toc.show();
}
$(document.body).scroll();
}
function windowResize() {
//toc right
var paddingRight = parseFloat(markdown.css('padding-right'));
var right = ($(window).width() - (markdown.offset().left + markdown.outerWidth() - paddingRight));
toc.css('right', right + 'px');
//affix toc left
var newbool;
var rightMargin = (markdown.parent().outerWidth() - markdown.outerWidth()) / 2;
//for ipad or wider device
if (rightMargin >= 133) {
newbool = true;
var affixLeftMargin = (tocAffix.outerWidth() - tocAffix.width()) / 2;
var left = markdown.offset().left + markdown.outerWidth() - affixLeftMargin;
tocAffix.css('left', left + 'px');
} else {
newbool = false;
}
if (newbool != enoughForAffixToc) {
enoughForAffixToc = newbool;
generateScrollspy();
}
}
$(window).resize(function () {
windowResize();
});
$(document).ready(function () {
windowResize();
generateScrollspy();
});
//remove hash
function removeHash() {
window.location.hash = '';
}
var backtotop = $('.back-to-top');
var gotobottom = $('.go-to-bottom');
backtotop.click(function (e) {
e.preventDefault();
e.stopPropagation();
if (scrollToTop)
scrollToTop();
removeHash();
});
gotobottom.click(function (e) {
e.preventDefault();
e.stopPropagation();
if (scrollToBottom)
scrollToBottom();
removeHash();
});
var toggle = $('.expand-toggle');
var tocExpand = false;
checkExpandToggle();
toggle.click(function (e) {
e.preventDefault();
e.stopPropagation();
tocExpand = !tocExpand;
checkExpandToggle();
})
function checkExpandToggle () {
var toc = $('.ui-toc-dropdown .toc');
var toggle = $('.expand-toggle');
if (!tocExpand) {
toc.removeClass('expand');
toggle.text('Expand all');
} else {
toc.addClass('expand');
toggle.text('Collapse all');
}
}
function scrollToTop() {
$('body, html').stop(true, true).animate({
scrollTop: 0
}, 100, "linear");
}
function scrollToBottom() {
$('body, html').stop(true, true).animate({
scrollTop: $(document.body)[0].scrollHeight
}, 100, "linear");
}
</script>
</body>
</html>