123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272 |
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta name="generator" content="Asciidoctor 1.5.4">
- <title>design</title>
- <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
- <style>
- /* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
- /* Remove comment around @import statement below when using as a custom stylesheet */
- /*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
- article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
- audio,canvas,video{display:inline-block}
- audio:not([controls]){display:none;height:0}
- [hidden],template{display:none}
- script{display:none!important}
- html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
- body{margin:0}
- a{background:transparent}
- a:focus{outline:thin dotted}
- a:active,a:hover{outline:0}
- h1{font-size:2em;margin:.67em 0}
- abbr[title]{border-bottom:1px dotted}
- b,strong{font-weight:bold}
- dfn{font-style:italic}
- hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
- mark{background:#ff0;color:#000}
- code,kbd,pre,samp{font-family:monospace;font-size:1em}
- pre{white-space:pre-wrap}
- q{quotes:"\201C" "\201D" "\2018" "\2019"}
- small{font-size:80%}
- sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
- sup{top:-.5em}
- sub{bottom:-.25em}
- img{border:0}
- svg:not(:root){overflow:hidden}
- figure{margin:0}
- fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
- legend{border:0;padding:0}
- button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
- button,input{line-height:normal}
- button,select{text-transform:none}
- button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
- button[disabled],html input[disabled]{cursor:default}
- input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
- input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
- input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
- button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
- textarea{overflow:auto;vertical-align:top}
- table{border-collapse:collapse;border-spacing:0}
- *,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
- html,body{font-size:100%}
- body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto}
- a:hover{cursor:pointer}
- img,object,embed{max-width:100%;height:auto}
- object,embed{height:100%}
- img{-ms-interpolation-mode:bicubic}
- .left{float:left!important}
- .right{float:right!important}
- .text-left{text-align:left!important}
- .text-right{text-align:right!important}
- .text-center{text-align:center!important}
- .text-justify{text-align:justify!important}
- .hide{display:none}
- body{-webkit-font-smoothing:antialiased}
- img,object,svg{display:inline-block;vertical-align:middle}
- textarea{height:auto;min-height:50px}
- select{width:100%}
- .center{margin-left:auto;margin-right:auto}
- .spread{width:100%}
- p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
- .subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
- div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
- a{color:#2156a5;text-decoration:underline;line-height:inherit}
- a:hover,a:focus{color:#1d4b8f}
- a img{border:none}
- p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
- p aside{font-size:.875em;line-height:1.35;font-style:italic}
- h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
- h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
- h1{font-size:2.125em}
- h2{font-size:1.6875em}
- h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
- h4,h5{font-size:1.125em}
- h6{font-size:1em}
- hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
- em,i{font-style:italic;line-height:inherit}
- strong,b{font-weight:bold;line-height:inherit}
- small{font-size:60%;line-height:inherit}
- code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
- ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
- ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
- ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
- ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
- ul.square{list-style-type:square}
- ul.circle{list-style-type:circle}
- ul.disc{list-style-type:disc}
- ul.no-bullet{list-style:none}
- ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
- dl dt{margin-bottom:.3125em;font-weight:bold}
- dl dd{margin-bottom:1.25em}
- abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
- abbr{text-transform:none}
- blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
- blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
- blockquote cite:before{content:"\2014 \0020"}
- blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
- blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
- @media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
- h1{font-size:2.75em}
- h2{font-size:2.3125em}
- h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
- h4{font-size:1.4375em}}
- table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
- table thead,table tfoot{background:#f7f8f7;font-weight:bold}
- table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
- table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
- table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
- table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
- body{tab-size:4}
- h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
- h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
- .clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
- .clearfix:after,.float-group:after{clear:both}
- *:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed}
- pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
- .keyseq{color:rgba(51,51,51,.8)}
- kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
- .keyseq kbd:first-child{margin-left:0}
- .keyseq kbd:last-child{margin-right:0}
- .menuseq,.menu{color:rgba(0,0,0,.8)}
- b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
- b.button:before{content:"[";padding:0 3px 0 2px}
- b.button:after{content:"]";padding:0 2px 0 3px}
- p a>code:hover{color:rgba(0,0,0,.9)}
- #header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
- #header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
- #header:after,#content:after,#footnotes:after,#footer:after{clear:both}
- #content{margin-top:1.25em}
- #content:before{content:none}
- #header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
- #header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
- #header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
- #header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
- #header .details span:first-child{margin-left:-.125em}
- #header .details span.email a{color:rgba(0,0,0,.85)}
- #header .details br{display:none}
- #header .details br+span:before{content:"\00a0\2013\00a0"}
- #header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
- #header .details br+span#revremark:before{content:"\00a0|\00a0"}
- #header #revnumber{text-transform:capitalize}
- #header #revnumber:after{content:"\00a0"}
- #content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
- #toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
- #toc>ul{margin-left:.125em}
- #toc ul.sectlevel0>li>a{font-style:italic}
- #toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
- #toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
- #toc li{line-height:1.3334;margin-top:.3334em}
- #toc a{text-decoration:none}
- #toc a:active{text-decoration:underline}
- #toctitle{color:#7a2518;font-size:1.2em}
- @media only screen and (min-width:768px){#toctitle{font-size:1.375em}
- body.toc2{padding-left:15em;padding-right:0}
- #toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
- #toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
- #toc.toc2>ul{font-size:.9em;margin-bottom:0}
- #toc.toc2 ul ul{margin-left:0;padding-left:1em}
- #toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
- body.toc2.toc-right{padding-left:0;padding-right:15em}
- body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
- @media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
- #toc.toc2{width:20em}
- #toc.toc2 #toctitle{font-size:1.375em}
- #toc.toc2>ul{font-size:.95em}
- #toc.toc2 ul ul{padding-left:1.25em}
- body.toc2.toc-right{padding-left:0;padding-right:20em}}
- #content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
- #content #toc>:first-child{margin-top:0}
- #content #toc>:last-child{margin-bottom:0}
- #footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
- #footer-text{color:rgba(255,255,255,.8);line-height:1.44}
- .sect1{padding-bottom:.625em}
- @media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
- .sect1+.sect1{border-top:1px solid #efefed}
- #content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
- #content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
- #content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
- #content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
- #content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
- .audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
- .admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
- table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
- .paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
- table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
- .admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
- .admonitionblock>table td.icon{text-align:center;width:80px}
- .admonitionblock>table td.icon img{max-width:none}
- .admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
- .admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
- .admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
- .exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
- .exampleblock>.content>:first-child{margin-top:0}
- .exampleblock>.content>:last-child{margin-bottom:0}
- .sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
- .sidebarblock>:first-child{margin-top:0}
- .sidebarblock>:last-child{margin-bottom:0}
- .sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
- .exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
- .literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
- .sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
- .literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
- .literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
- @media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
- @media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
- .literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
- .listingblock pre.highlightjs{padding:0}
- .listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
- .listingblock pre.prettyprint{border-width:0}
- .listingblock>.content{position:relative}
- .listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
- .listingblock:hover code[data-lang]:before{display:block}
- .listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
- .listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
- table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
- table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
- table.pyhltable td.code{padding-left:.75em;padding-right:0}
- pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
- pre.pygments .lineno{display:inline-block;margin-right:.25em}
- table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
- .quoteblock{margin:0 1em 1.25em 1.5em;display:table}
- .quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
- .quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
- .quoteblock blockquote{margin:0;padding:0;border:0}
- .quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
- .quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
- .quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
- .quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
- .quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
- .quoteblock .quoteblock blockquote:before{display:none}
- .verseblock{margin:0 1em 1.25em 1em}
- .verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
- .verseblock pre strong{font-weight:400}
- .verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
- .quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
- .quoteblock .attribution br,.verseblock .attribution br{display:none}
- .quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
- .quoteblock.abstract{margin:0 0 1.25em 0;display:block}
- .quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
- .quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
- table.tableblock{max-width:100%;border-collapse:separate}
- table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
- table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
- table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
- table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
- table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
- table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
- table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
- table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
- table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
- table.frame-all{border-width:1px}
- table.frame-sides{border-width:0 1px}
- table.frame-topbot{border-width:1px 0}
- th.halign-left,td.halign-left{text-align:left}
- th.halign-right,td.halign-right{text-align:right}
- th.halign-center,td.halign-center{text-align:center}
- th.valign-top,td.valign-top{vertical-align:top}
- th.valign-bottom,td.valign-bottom{vertical-align:bottom}
- th.valign-middle,td.valign-middle{vertical-align:middle}
- table thead th,table tfoot th{font-weight:bold}
- tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
- tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
- p.tableblock>code:only-child{background:none;padding:0}
- p.tableblock{font-size:1em}
- td>div.verse{white-space:pre}
- ol{margin-left:1.75em}
- ul li ol{margin-left:1.5em}
- dl dd{margin-left:1.125em}
- dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
- ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
- ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
- ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
- ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
- ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
- ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
- ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
- ul.inline>li>*{display:block}
- .unstyled dl dt{font-weight:400;font-style:normal}
- ol.arabic{list-style-type:decimal}
- ol.decimal{list-style-type:decimal-leading-zero}
- ol.loweralpha{list-style-type:lower-alpha}
- ol.upperalpha{list-style-type:upper-alpha}
- ol.lowerroman{list-style-type:lower-roman}
- ol.upperroman{list-style-type:upper-roman}
- ol.lowergreek{list-style-type:lower-greek}
- .hdlist>table,.colist>table{border:0;background:none}
- .hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
- td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
- td.hdlist1{font-weight:bold;padding-bottom:1.25em}
- .literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
- .colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
- .colist>table tr>td:last-of-type{padding:.25em 0}
- .thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
- .imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
- .imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
- .imageblock>.title{margin-bottom:0}
- .imageblock.thumb,.imageblock.th{border-width:6px}
- .imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
- .image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
- .image.left{margin-right:.625em}
- .image.right{margin-left:.625em}
- a.image{text-decoration:none;display:inline-block}
- a.image object{pointer-events:none}
- sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
- sup.footnote a,sup.footnoteref a{text-decoration:none}
- sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
- #footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
- #footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
- #footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
- #footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
- #footnotes .footnote:last-of-type{margin-bottom:0}
- #content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
- .gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
- .gist .file-data>table td.line-data{width:99%}
- div.unbreakable{page-break-inside:avoid}
- .big{font-size:larger}
- .small{font-size:smaller}
- .underline{text-decoration:underline}
- .overline{text-decoration:overline}
- .line-through{text-decoration:line-through}
- .aqua{color:#00bfbf}
- .aqua-background{background-color:#00fafa}
- .black{color:#000}
- .black-background{background-color:#000}
- .blue{color:#0000bf}
- .blue-background{background-color:#0000fa}
- .fuchsia{color:#bf00bf}
- .fuchsia-background{background-color:#fa00fa}
- .gray{color:#606060}
- .gray-background{background-color:#7d7d7d}
- .green{color:#006000}
- .green-background{background-color:#007d00}
- .lime{color:#00bf00}
- .lime-background{background-color:#00fa00}
- .maroon{color:#600000}
- .maroon-background{background-color:#7d0000}
- .navy{color:#000060}
- .navy-background{background-color:#00007d}
- .olive{color:#606000}
- .olive-background{background-color:#7d7d00}
- .purple{color:#600060}
- .purple-background{background-color:#7d007d}
- .red{color:#bf0000}
- .red-background{background-color:#fa0000}
- .silver{color:#909090}
- .silver-background{background-color:#bcbcbc}
- .teal{color:#006060}
- .teal-background{background-color:#007d7d}
- .white{color:#bfbfbf}
- .white-background{background-color:#fafafa}
- .yellow{color:#bfbf00}
- .yellow-background{background-color:#fafa00}
- span.icon>.fa{cursor:default}
- .admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
- .admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
- .admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
- .admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
- .admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
- .admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
- .conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
- .conum[data-value] *{color:#fff!important}
- .conum[data-value]+b{display:none}
- .conum[data-value]:after{content:attr(data-value)}
- pre .conum[data-value]{position:relative;top:-.125em}
- b.conum *{color:inherit!important}
- .conum:not([data-value]):empty{display:none}
- dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
- h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
- p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
- p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
- p{margin-bottom:1.25rem}
- .sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
- .exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
- .print-only{display:none!important}
- @media print{@page{margin:1.25cm .75cm}
- *{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
- a{color:inherit!important;text-decoration:underline!important}
- a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
- a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
- abbr[title]:after{content:" (" attr(title) ")"}
- pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
- thead{display:table-header-group}
- svg{max-width:100%}
- p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
- h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
- #toc,.sidebarblock,.exampleblock>.content{background:none!important}
- #toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
- .sect1{padding-bottom:0!important}
- .sect1+.sect1{border:0!important}
- #header>h1:first-child{margin-top:1.25rem}
- body.book #header{text-align:center}
- body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
- body.book #header .details{border:0!important;display:block;padding:0!important}
- body.book #header .details span:first-child{margin-left:0!important}
- body.book #header .details br{display:block}
- body.book #header .details br+span:before{content:none!important}
- body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
- body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
- .listingblock code[data-lang]:before{display:block}
- #footer{background:none!important;padding:0 .9375em}
- #footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
- .hide-on-print{display:none!important}
- .print-only{display:block!important}
- .hide-for-print{display:none!important}
- .show-for-print{display:inherit!important}}
- </style>
- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.5.0/css/font-awesome.min.css">
- <style>
- /* Stylesheet for CodeRay to match GitHub theme | MIT License | http://foundation.zurb.com */
- /*pre.CodeRay {background-color:#f7f7f8;}*/
- .CodeRay .line-numbers{border-right:1px solid #d8d8d8;padding:0 0.5em 0 .25em}
- .CodeRay span.line-numbers{display:inline-block;margin-right:.5em;color:rgba(0,0,0,.3)}
- .CodeRay .line-numbers strong{color:rgba(0,0,0,.4)}
- table.CodeRay{border-collapse:separate;border-spacing:0;margin-bottom:0;border:0;background:none}
- table.CodeRay td{vertical-align: top;line-height:1.45}
- table.CodeRay td.line-numbers{text-align:right}
- table.CodeRay td.line-numbers>pre{padding:0;color:rgba(0,0,0,.3)}
- table.CodeRay td.code{padding:0 0 0 .5em}
- table.CodeRay td.code>pre{padding:0}
- .CodeRay .debug{color:#fff !important;background:#000080 !important}
- .CodeRay .annotation{color:#007}
- .CodeRay .attribute-name{color:#000080}
- .CodeRay .attribute-value{color:#700}
- .CodeRay .binary{color:#509}
- .CodeRay .comment{color:#998;font-style:italic}
- .CodeRay .char{color:#04d}
- .CodeRay .char .content{color:#04d}
- .CodeRay .char .delimiter{color:#039}
- .CodeRay .class{color:#458;font-weight:bold}
- .CodeRay .complex{color:#a08}
- .CodeRay .constant,.CodeRay .predefined-constant{color:#008080}
- .CodeRay .color{color:#099}
- .CodeRay .class-variable{color:#369}
- .CodeRay .decorator{color:#b0b}
- .CodeRay .definition{color:#099}
- .CodeRay .delimiter{color:#000}
- .CodeRay .doc{color:#970}
- .CodeRay .doctype{color:#34b}
- .CodeRay .doc-string{color:#d42}
- .CodeRay .escape{color:#666}
- .CodeRay .entity{color:#800}
- .CodeRay .error{color:#808}
- .CodeRay .exception{color:inherit}
- .CodeRay .filename{color:#099}
- .CodeRay .function{color:#900;font-weight:bold}
- .CodeRay .global-variable{color:#008080}
- .CodeRay .hex{color:#058}
- .CodeRay .integer,.CodeRay .float{color:#099}
- .CodeRay .include{color:#555}
- .CodeRay .inline{color:#000}
- .CodeRay .inline .inline{background:#ccc}
- .CodeRay .inline .inline .inline{background:#bbb}
- .CodeRay .inline .inline-delimiter{color:#d14}
- .CodeRay .inline-delimiter{color:#d14}
- .CodeRay .important{color:#555;font-weight:bold}
- .CodeRay .interpreted{color:#b2b}
- .CodeRay .instance-variable{color:#008080}
- .CodeRay .label{color:#970}
- .CodeRay .local-variable{color:#963}
- .CodeRay .octal{color:#40e}
- .CodeRay .predefined{color:#369}
- .CodeRay .preprocessor{color:#579}
- .CodeRay .pseudo-class{color:#555}
- .CodeRay .directive{font-weight:bold}
- .CodeRay .type{font-weight:bold}
- .CodeRay .predefined-type{color:inherit}
- .CodeRay .reserved,.CodeRay .keyword {color:#000;font-weight:bold}
- .CodeRay .key{color:#808}
- .CodeRay .key .delimiter{color:#606}
- .CodeRay .key .char{color:#80f}
- .CodeRay .value{color:#088}
- .CodeRay .regexp .delimiter{color:#808}
- .CodeRay .regexp .content{color:#808}
- .CodeRay .regexp .modifier{color:#808}
- .CodeRay .regexp .char{color:#d14}
- .CodeRay .regexp .function{color:#404;font-weight:bold}
- .CodeRay .string{color:#d20}
- .CodeRay .string .string .string{background:#ffd0d0}
- .CodeRay .string .content{color:#d14}
- .CodeRay .string .char{color:#d14}
- .CodeRay .string .delimiter{color:#d14}
- .CodeRay .shell{color:#d14}
- .CodeRay .shell .delimiter{color:#d14}
- .CodeRay .symbol{color:#990073}
- .CodeRay .symbol .content{color:#a60}
- .CodeRay .symbol .delimiter{color:#630}
- .CodeRay .tag{color:#008080}
- .CodeRay .tag-special{color:#d70}
- .CodeRay .variable{color:#036}
- .CodeRay .insert{background:#afa}
- .CodeRay .delete{background:#faa}
- .CodeRay .change{color:#aaf;background:#007}
- .CodeRay .head{color:#f8f;background:#505}
- .CodeRay .insert .insert{color:#080}
- .CodeRay .delete .delete{color:#800}
- .CodeRay .change .change{color:#66f}
- .CodeRay .head .head{color:#f4f}
- </style>
- </head>
- <body class="article toc2 toc-left">
- <div id="header">
- <h1>design</h1>
- <div class="details">
- <span id="author" class="author"></span><br>
- <span id="revnumber">version ,</span>
- <span id="revdate">2016/03/17 20:48</span>
- </div>
- <div id="toc" class="toc2">
- <div id="toctitle">Table of Contents</div>
- <ul class="sectlevel1">
- <li><a href="#atom-framework-design">Atom Framework Design</a>
- <ul class="sectlevel2">
- <li><a href="#motivation">Motivation</a></li>
- <li><a href="#overview">Overview</a></li>
- </ul>
- </li>
- <li><a href="#design-goals">Design goals</a>
- <ul class="sectlevel3">
- <li><a href="#overal-goals">Overal goals</a></li>
- <li><a href="#additional-sub-goals">Additional sub goals</a></li>
- <li><a href="#slides">Slides</a></li>
- </ul>
- </li>
- <li><a href="#real-time-applications">Real time applications</a>
- <ul class="sectlevel2">
- <li><a href="#atom-vs-ptolemy">Atom VS ptolemy</a></li>
- <li><a href="#atom-vs-jscience">Atom VS JScience</a></li>
- <li><a href="#target-devices-platforms">Target Devices & Platforms</a></li>
- </ul>
- </li>
- <li><a href="#problems">Problems</a></li>
- <li><a href="#solutions-frameworks-platforms">Solutions & Frameworks & Platforms</a></li>
- <li><a href="#atom-framework-design-course">Atom framework Design course</a>
- <ul class="sectlevel2">
- <li><a href="#game-and-real-time-application">Game and real-time application</a></li>
- <li><a href="#atomcore-architecture">AtomCore Architecture</a></li>
- <li><a href="#design-patterns-programming-paradigms">Design patterns & Programming paradigms</a></li>
- <li><a href="#programming-aspects">Programming aspects</a></li>
- <li><a href="#polygot-programming">Polygot programming</a></li>
- <li><a href="#modular-architecture">Modular architecture</a></li>
- </ul>
- </li>
- <li><a href="#enterprise-facilities">Enterprise facilities</a>
- <ul class="sectlevel3">
- <li><a href="#services-dependency-and-decoupling">Services, Dependency and Decoupling</a></li>
- <li><a href="#available-services">Available Services</a></li>
- </ul>
- </li>
- <li><a href="#monitoring-and-development-workflow">Monitoring and development workflow</a></li>
- <li><a href="#future-vision">Future vision</a></li>
- <li><a href="#references-and-inspiration">References and Inspiration</a></li>
- </ul>
- </div>
- </div>
- <div id="content">
- <div class="sect1">
- <h2 id="atom-framework-design">Atom Framework Design</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p>This is the repository resulted of the design phase of Atom framework over years.</p>
- </div>
- <div class="sect2">
- <h3 id="motivation">Motivation</h3>
- <div class="paragraph">
- <p>It born to helps JME3 focus in <strong>game/simulation development</strong>, push futher in lastest/future Java technologies toward to enterpise/AAA game dev as its final goal, but compromise/ compatible with existing insfracture of JME3 and OpenGL.</p>
- </div>
- <div class="paragraph">
- <p>Its concept, design and archictecture inspired by AAA game engine and Enterprise Java solution.</p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="overview">Overview</h3>
- <div class="paragraph">
- <p>In this page:</p>
- </div>
- <div class="olist arabic">
- <ol class="arabic">
- <li>
- <p>Goal of Atom framework - which tend to expand JME3 and Java language to suite more for game dev.</p>
- </li>
- <li>
- <p>Problems of realtime applications (especially games).</p>
- </li>
- <li>
- <p>Solutions and those base platforms, frameworks that we going to use to approach those goals.</p>
- </li>
- <li>
- <p>Remain works and future vision</p>
- </li>
- </ol>
- </div>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="design-goals">Design goals</h2>
- <div class="sectionbody">
- <div class="sect3">
- <h4 id="overal-goals">Overal goals</h4>
- <div class="ulist">
- <ul>
- <li>
- <p>Flexible: Game | simulations centric but not forced!</p>
- </li>
- <li>
- <p>Modular: Dependency injection along with Component injection</p>
- </li>
- <li>
- <p>Parallel: Embrace parallel computing</p>
- </li>
- <li>
- <p>Next gen: Come with Bleeding edge technologies and powers of Java languages</p>
- </li>
- <li>
- <p>Cloud ready: Scale to web and distributed computing</p>
- </li>
- <li>
- <p>With ease: <abbr title="Graphical User Interface">GUI</abbr> Tools everywhere, almost zero config need</p>
- </li>
- <li>
- <p>Cross devices: Can run wide range of devices PC-mobile-TV.. any one that has java!</p>
- </li>
- </ul>
- </div>
- </div>
- <div class="sect3">
- <h4 id="additional-sub-goals">Additional sub goals</h4>
- <div class="ulist">
- <ul>
- <li>
- <p>Minimum dependencies and their overlap</p>
- </li>
- <li>
- <p>Small footprint & Efficient</p>
- </li>
- </ul>
- </div>
- </div>
- <div class="sect2">
- <h3 id="slides">Slides</h3>
- <div class="paragraph">
- <p>You can view slides and download papers about the design of Atom framework here.</p>
- </div>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="real-time-applications">Real time applications</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p>Atom is designed to <strong>MAKE</strong> concurrent, real-time, embedded systems and <strong>GAMES</strong></p>
- </div>
- <div class="sect2">
- <h3 id="atom-vs-ptolemy">Atom VS ptolemy</h3>
- <div class="paragraph">
- <p>As mentioned in the Atom framwork’s introduction, Atom is actually inspired by Plotemy project <a href="http://ptolemy.eecs.berkeley.edu/index.htm">http://ptolemy.eecs.berkeley.edu/index.htm</a></p>
- </div>
- <div class="literalblock">
- <div class="content">
- <pre>but it actually tend to has various different goals, techniques, mindset and approaches. The comparasion in constrast with Ptolemy will reveal a lot of Atom characteristics.</pre>
- </div>
- </div>
- <div class="literalblock">
- <div class="content">
- <pre> The Ptolemy project studies modeling, simulation, and design of concurrent, real-time, embedded systems. The focus is on assembly of concurrent components. The key underlying principle in the project is the use of well-defined models of computation that govern the interaction between components.A major problem area being addressed is the use of heterogeneous mixtures of models of computation.</pre>
- </div>
- </div>
- <div class="paragraph">
- <p><strong>VS</strong></p>
- </div>
- <div class="literalblock">
- <div class="content">
- <pre> Atom is designed to **MAKE** concurrent, real-time, embedded systems and **GAMES**. So it focus more in code generation, profile, monitoring; focus more in graphics, physics, **player experience**... etc. Underlying, it borrow quite a bunch of concepts that built in Ptolemy (not codes!).</pre>
- </div>
- </div>
- <div class="sect3">
- <h4 id="goals">Goals</h4>
- <div class="paragraph">
- <p>So the two projects' <strong>goals</strong> are quite overlapped but have different focus points and mindset!</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>Atom has no or less concern/ interests about mathematic/ physics correctioness ( so simmulations) but the graphics side and overal behaviors.</p>
- </li>
- <li>
- <p>Atom has open-source spirit… but not academic!! You can see Plotemy is quite “complicated and not very popular as it provided for academic first; in constrast, Atom is broadcasted for every one to use and to make games as kids in sandboxes.</p>
- </li>
- </ul>
- </div>
- </div>
- <div class="sect3">
- <h4 id="techniques-differencies">Techniques differencies:</h4>
- <div class="ulist">
- <ul>
- <li>
- <p>Atom not “just depend on well-defined models!</p>
- </li>
- <li>
- <p>Atom use simplier models, …but sometime simplier is better!</p>
- <div class="ulist">
- <ul>
- <li>
- <p>Simplier Entity model (not abstract out of Java object)</p>
- </li>
- <li>
- <p>Actor model is not as abstrat also actually from threaded enviroment</p>
- </li>
- <li>
- <p>No contract in Systems, the study of Systems conections and interactivities are though data-driven analysising only, that’s it, a dataflow monitoring system over working system.</p>
- </li>
- <li>
- <p>Timming: Because of the lack of interests in math/ phycics, time model and precision model is undefined but also from Java platform.</p>
- </li>
- </ul>
- </div>
- </li>
- <li>
- <p>Those above and its core techniques that you can find below, lead Atom to be less independent from Java but also has well embeding characteristics of Java languages and run-time enviroments. So can say Atom is built directly on top of Java with no hesitate!</p>
- </li>
- </ul>
- </div>
- </div>
- </div>
- <div class="sect2">
- <h3 id="atom-vs-jscience">Atom VS JScience</h3>
- <div class="paragraph">
- <p>Atom also depends in Javolution and has some parts from JScience code base but once again the purpose, Atom focus in Games and simulations… Also a lot of techniques Atom is different from one used in JScience.</p>
- </div>
- <div class="paragraph">
- <p>One can also see that Atom fullfill the lack of JScience’s experimental Game package. :)</p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="target-devices-platforms">Target Devices & Platforms</h3>
- <div class="sect3">
- <h4 id="pc">PC</h4>
- </div>
- <div class="sect3">
- <h4 id="mobile">Mobile</h4>
- <div class="sect4">
- <h5 id="android">Android</h5>
- </div>
- </div>
- <div class="sect3">
- <h4 id="web">Web</h4>
- <div class="sect4">
- <h5 id="html5-and-webgl">HTML5 and WebGL</h5>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="problems">Problems</h2>
- <div class="sectionbody">
- </div>
- </div>
- <div class="sect1">
- <h2 id="solutions-frameworks-platforms">Solutions & Frameworks & Platforms</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p>In Java, a lot good opensource projects are already provide solutions for various challanges in software developments. The problem is how to glue those gems together in appropriate way and result in efficient, good quality product - Saving time and efforts.</p>
- </div>
- <div class="paragraph">
- <p>For example, AtomCore module depends in these high quality libraries:</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>JME3</p>
- </li>
- <li>
- <p>Common Java JSR annotations:</p>
- </li>
- <li>
- <p>Apache commons</p>
- <div class="ulist">
- <ul>
- <li>
- <p>Lang</p>
- </li>
- <li>
- <p>Configurations</p>
- </li>
- <li>
- <p>BeanUtils</p>
- </li>
- <li>
- <p>Collections</p>
- </li>
- </ul>
- </div>
- </li>
- <li>
- <p>Google’s</p>
- <div class="ulist">
- <ul>
- <li>
- <p>Guava:</p>
- </li>
- <li>
- <p>Guice: Dependency injection</p>
- </li>
- <li>
- <p>Snappy:</p>
- </li>
- <li>
- <p>LevelDB</p>
- </li>
- <li>
- <p>Auto</p>
- </li>
- </ul>
- </div>
- </li>
- </ul>
- </div>
- <div class="paragraph">
- <p>*</p>
- </div>
- <div class="paragraph">
- <p>Other require pieces are write from sk</p>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="atom-framework-design-course">Atom framework Design course</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p>This section is dedicated to explain some idioms, patterns, and long term solutions for problems and each design goals, structures.</p>
- </div>
- <div class="sect2">
- <h3 id="game-and-real-time-application">Game and real-time application</h3>
- <div class="sect3">
- <h4 id="cross-game-genre-elements">Cross game-genre elements</h4>
- <div class="paragraph">
- <p>From an abstraction level, a Game- a special kind of software (almost always):</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>composed by Entities, and their Stage;</p>
- </li>
- <li>
- <p>where Actions happen in a Cycle, procedure Events;</p>
- </li>
- </ul>
- </div>
- <div class="paragraph">
- <p>A little bit more detailed, Gameplay is the way player play the Game, has:</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>Logic:</p>
- <div class="ulist">
- <ul>
- <li>
- <p>Trigger: in which Conditions, active some appropriate Action, as primitive brick.</p>
- </li>
- <li>
- <p>Rule: the laws, restrictions form the game rule which player, entities obey.</p>
- </li>
- </ul>
- </div>
- </li>
- <li>
- <p>Routines: Situations/ Events/ Actions that happen in the game Cycle.</p>
- <div class="ulist">
- <ul>
- <li>
- <p>Story/Cinematic mode: When player just watch the game like a movie.</p>
- </li>
- <li>
- <p>Interactive mode: When player interact with the game world</p>
- </li>
- </ul>
- </div>
- </li>
- <li>
- <p>Control: The way player handle their entities</p>
- </li>
- <li>
- <p>League:</p>
- <div class="ulist">
- <ul>
- <li>
- <p>Single: Infos, score, rewards stick to an individual</p>
- </li>
- <li>
- <p>Multi: The way players join, left, make friend and interactive and play together…</p>
- </li>
- </ul>
- </div>
- </li>
- <li>
- <p>Status: Way to pause/continue , save/load current game</p>
- </li>
- </ul>
- </div>
- <div class="paragraph">
- <p>The game “software should be published in specific enviroment, it then has:</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>Configurations : appropriate settings for specific enviroment, device.</p>
- </li>
- <li>
- <p>Data : appropriate size and format</p>
- </li>
- </ul>
- </div>
- </div>
- <div class="sect3">
- <h4 id="cpu-gpu-interactions">CPU-GPU interactions</h4>
- </div>
- <div class="sect3">
- <h4 id="java-native-interactions">Java-Native interactions</h4>
- </div>
- <div class="sect3">
- <h4 id="timing">Timing</h4>
- </div>
- <div class="sect3">
- <h4 id="cycle">Cycle</h4>
- </div>
- </div>
- <div class="sect2">
- <h3 id="atomcore-architecture">AtomCore Architecture</h3>
- <div class="paragraph">
- <p>The Core is the part that focus in <strong>Game and real-time application</strong>. It declare</p>
- </div>
- <div class="paragraph">
- <p>You can read more about the Core architecture here.
- <a href="../../../jme3/advanced/atom_framework/atomcore.html">atomcore</a></p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="design-patterns-programming-paradigms">Design patterns & Programming paradigms</h3>
- <div class="paragraph">
- <p>Consider research through this trusted resources before we go deeper into Atom architecture and where/why/how it apply each Design patterns:</p>
- </div>
- <div class="paragraph">
- <p><a href="../../../jme3/advanced/atom_framework/design/patterns.html">patterns</a></p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="programming-aspects">Programming aspects</h3>
- <div class="sect3">
- <h4 id="java-but-not-just-java">Java, but not just Java</h4>
- <div class="paragraph">
- <p>The most “Java things in AtomCore is Bean and Properties. Two pure Java data type which are very useful in Game world. Bean is for game object modeling and Properties for configuration.</p>
- </div>
- <div class="paragraph">
- <p>Of course, other Java technologies are also used but not mentioned because it’s not nessesary. But Bean and Properties are the two techs that heavily used!</p>
- </div>
- <div class="paragraph">
- <p>“Good Java extensions used in AtomCore 0.2+ is:
- Guava:</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>Bring Eventbus, network in a snap</p>
- </li>
- <li>
- <p>Collection, Fluent, functional syntax and flavour to Java.</p>
- </li>
- <li>
- <p>Guava also support Cache, reflection and more low level operations</p>
- </li>
- </ul>
- </div>
- <div class="paragraph">
- <p>Guice: bring Dependency injection, better unit test, refactoring in a lightweight manner.</p>
- </div>
- <div class="paragraph">
- <p>Groovy is a JVM language and intergrated deeply with AtomCore, most appreal as Scripting language but remember it also can replace Java, or seen as Java. Groovy also offer much more of superb things.</p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="code-vs-data">Code vs Data</h4>
- <div class="paragraph">
- <p>For big game, the amount of Data required can be so much. Mean while the complexity of code also rise fast, as the result of data increasing!</p>
- </div>
- <div class="paragraph">
- <p>At some point, we have to find a solution to reduce “manual Data + code making and maintaining. That where “generative code also can be seen as a kind of Data was born. This called Data-driven architecture (solution). In AtomCore 0.2, it have features to support this trend.</p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="around-bean">Around Bean</h4>
- <div class="paragraph">
- <p>For example:</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>AtomEX : the bridge to AKKA Actor model also use POJO as its candidate</p>
- </li>
- <li>
- <p>EJB leverage…</p>
- </li>
- <li>
- <p>Fx: use POJO as its effect elements</p>
- </li>
- </ul>
- </div>
- <div class="paragraph">
- <p>Here is a brief explaination why Bean/ POJO is choosed to be the Core of Atom framework?</p>
- </div>
- <div class="literalblock">
- <div class="content">
- <pre>As built in Java technologies, Bean/ POJO is the only "consider good" solution as:
- **"the bridge"** **from Java OOP to COP**, **from Java OOP to AOP**</pre>
- </div>
- </div>
- <div class="literalblock">
- <div class="content">
- <pre>also can be seen as
- **from Object oriented programming to Data oriented programming**
- **from Object oriented programming to Aspect oriented programming**</pre>
- </div>
- </div>
- <div class="literalblock">
- <div class="content">
- <pre>or **Code but also Data**...</pre>
- </div>
- </div>
- </div>
- </div>
- <div class="sect2">
- <h3 id="polygot-programming">Polygot programming</h3>
- <div class="literalblock">
- <div class="content">
- <pre> I want Best of both worlds!!
- (.. if it's possible?)</pre>
- </div>
- </div>
- <div class="paragraph">
- <p>Atom in its core try to be polymorphism (polygot programming), to suite with OOP, COP, AOP or functional … Yeah, it’s java after all but good kind of Java.</p>
- </div>
- <div class="paragraph">
- <p>Because AtomScripting and others use Groovy, so it inherit (a lot of) polygot capacity from Groovy.</p>
- </div>
- <div class="paragraph">
- <p>Read: <a href="http://groovy.codehaus.org/Polyglot+Programming+with+Groovy">http://groovy.codehaus.org/Polyglot+Programming+with+Groovy</a></p>
- </div>
- <div class="sect3">
- <h4 id="functional-reactive-programming">Functional reactive programming</h4>
- </div>
- <div class="sect3">
- <h4 id="flow-based-programming">Flow based programming</h4>
- </div>
- <div class="sect3">
- <h4 id="component-based-programming">Component based programming</h4>
- </div>
- <div class="sect3">
- <h4 id="composite-based-programming">Composite based programming</h4>
- </div>
- <div class="sect3">
- <h4 id="data-driven-model-driven-domain-driven">Data-driven & Model-driven & Domain-driven</h4>
- </div>
- </div>
- <div class="sect2">
- <h3 id="modular-architecture">Modular architecture</h3>
- <div class="literalblock">
- <div class="content">
- <pre> I want to reuse (or DRY)!!</pre>
- </div>
- </div>
- <div class="paragraph">
- <p>Take a look at a JME3 game, Manager for example, what if you want the two manager’s work together but loosely depend on each other, or what if you want the State to direct the Manager to do something but have minimal informations about them…</p>
- </div>
- <div class="paragraph">
- <p>More abstract, whenever you have some kind of Service, which is loosely depend on each other, you should try Dependency Injection <a href="http://martinfowler.com/articles/injection.html">http://martinfowler.com/articles/injection.html</a> .</p>
- </div>
- <div class="paragraph">
- <p>That’s where Guice help in the big picture.</p>
- </div>
- <div class="sect3">
- <h4 id="dependency-injection">Dependency injection</h4>
- <div class="paragraph">
- <p><a href="https://code.google.com/p/google-guice/">https://code.google.com/p/google-guice/</a></p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="component-injection">Component Injection</h4>
- <div class="paragraph">
- <p><a href="http://wiki.apidesign.org/wiki/Component_Injection">http://wiki.apidesign.org/wiki/Component_Injection</a></p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="dependency-injection-vs-component-injection">Dependency injection VS Component Injection</h4>
- <div class="paragraph">
- <p><a href="http://code.imagej.net/gbh/lookup/DependencyInjectionandLookup.html">http://code.imagej.net/gbh/lookup/DependencyInjectionandLookup.html</a></p>
- </div>
- </div>
- <div class="sect3">
- <h4 id="dependency-management-coolness">Dependency management coolness</h4>
- <div class="paragraph">
- <p>So what’s cool about dependency in real-time application and game that Atom included…
- A lot of things, but let me point out fews:</p>
- </div>
- <div class="paragraph">
- <p><strong>Real-time dependency</strong> is a new feature for game developing…
- Imagine that even the game just can load part of assets, with the other are delayed or missing, the dependency graph can help the game cycle continue to run, part of it in the mean time.</p>
- </div>
- <div class="paragraph">
- <p>In fact the dependency graph can be considered the topo structure of JME assets dependency graph before it built, means hard links via references. Now even when the assets graph are just partly loaded, the game can run because it know a resolution to safety resolve the assets graph and scene graph afterward.</p>
- </div>
- <div class="paragraph">
- <p><strong>Enterprise features</strong>
- You can imagine how Atom framework tend to bridge JME game and the Web universal. It’s not so hard in fact. Cause Java enterprise technologies are already there to use. Lot of them are built on the top of Dependency injection and Inversion of control (or else)… I really like dependency injection but I can not agree that i should always couple with IoC per se. This will be discuss later in this documentation</p>
- </div>
- </div>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="enterprise-facilities">Enterprise facilities</h2>
- <div class="sectionbody">
- <div class="sect3">
- <h4 id="services-dependency-and-decoupling">Services, Dependency and Decoupling</h4>
- <div class="paragraph">
- <p>The world of enteprise evolve Modular paradigm a lot to link services (database, configurations, network protocols, web…) and help they work together in one application.</p>
- </div>
- </div>
- <div class="sect2">
- <h3 id="available-services">Available Services</h3>
- <div class="paragraph">
- <p>Try AtomEx</p>
- </div>
- <div class="sect3">
- <h4 id="to-database">To Database</h4>
- </div>
- <div class="sect3">
- <h4 id="to-other-repository">To other repository</h4>
- </div>
- <div class="sect3">
- <h4 id="to-configurations">To configurations</h4>
- </div>
- <div class="sect3">
- <h4 id="to-web">To web</h4>
- </div>
- </div>
- </div>
- </div>
- <div class="sect1">
- <h2 id="monitoring-and-development-workflow">Monitoring and development workflow</h2>
- <div class="sectionbody">
- </div>
- </div>
- <div class="sect1">
- <h2 id="future-vision">Future vision</h2>
- <div class="sectionbody">
- </div>
- </div>
- <div class="sect1">
- <h2 id="references-and-inspiration">References and Inspiration</h2>
- <div class="sectionbody">
- <div class="paragraph">
- <p>Atom framework’s design is inspried by:</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>Game Engine Architcture book</p>
- </li>
- <li>
- <p>Game Programming gems serires</p>
- </li>
- <li>
- <p>AI Game Engine book</p>
- </li>
- <li>
- <p>AI Game Wisdom book</p>
- </li>
- </ul>
- </div>
- <div class="paragraph">
- <p>other GameEngine that I did use:</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>UDK</p>
- </li>
- <li>
- <p>Unity</p>
- </li>
- <li>
- <p>CryEngineSDK</p>
- </li>
- <li>
- <p>JavaScript game engines : CraftyJs, GameQuery ..</p>
- </li>
- <li>
- <p>Flash game engines : Starling ,</p>
- </li>
- <li>
- <p>… dozen of close-source engine.</p>
- </li>
- </ul>
- </div>
- <div class="paragraph">
- <p>other Java techs:</p>
- </div>
- <div class="ulist">
- <ul>
- <li>
- <p>EJB</p>
- </li>
- <li>
- <p>Spring</p>
- </li>
- <li>
- <p>Groovy</p>
- </li>
- <li>
- <p>Netbean</p>
- </li>
- <li>
- <p>… hunread of open-source projects</p>
- </li>
- </ul>
- </div>
- <div class="paragraph">
- <p>Full researched papers list are comming.</p>
- </div>
- </div>
- </div>
- </div>
- <div id="footer">
- <div id="footer-text">
- Version <br>
- Last updated 2016-06-05 15:58:32 UTC
- </div>
- </div>
- </body>
- </html>
|