Powered by Jekyll — Theme by BDHU
\ No newline at end of file diff --git a/minimalist/_includes/head-custom-google-analytics.html b/minimalist/_includes/head-custom-google-analytics.html new file mode 100644 index 0000000..cd99f44 --- /dev/null +++ b/minimalist/_includes/head-custom-google-analytics.html @@ -0,0 +1,10 @@ +{% if site.google_analytics %} + + +{% endif %} diff --git a/minimalist/_includes/head-custom.html b/minimalist/_includes/head-custom.html new file mode 100644 index 0000000..9307d77 --- /dev/null +++ b/minimalist/_includes/head-custom.html @@ -0,0 +1,12 @@ + + + + +{% include head-custom-google-analytics.html %} + + +{% if site.favicon %} + +{% endif %} + + diff --git a/minimalist/_includes/links-mobile.html b/minimalist/_includes/links-mobile.html new file mode 100644 index 0000000..334cb6f --- /dev/null +++ b/minimalist/_includes/links-mobile.html @@ -0,0 +1,16 @@ +by {{ page.author | default: site.author }}
+ +{{content}} + +{% if page.tags %} + tags: {{ page.tags | join: " - " }} +{% endif %} diff --git a/minimalist/_sass/colors.scss b/minimalist/_sass/colors.scss new file mode 100644 index 0000000..3baff85 --- /dev/null +++ b/minimalist/_sass/colors.scss @@ -0,0 +1,124 @@ +/* +H -> hue +L -> luminosity +S -> saturation +clr -> color +bg -> background +hvr -> hover +*/ + +//colors +:root { + //red + --code-d14: #d14; + --code-aa0000: #aa0000; + --code-990000: #990000; + //cyan + --code-009999: #009999; + --code-008080: #008080; + --code-3c5d5d: #3c5d5d; + //green + --code-009926: #009926; + //pink + --code-990073: #990073; + --code-800080: #800080; + //purple + --code-445588: #445588; + //blue + --code-000080: #000080; + //grey + --code-aaaaaa: #aaaaaa; + --code-999999: #999999; + --code-888888: #888888; + --code-555555: #555555; +} + +@mixin colors { + // buttons + --L-a-text-hover-change: 0.8;//the number that --L-a-text gets changed by when it is hovered eg a button has 30% luminosity when left it luminosity is then timesed by 0.8 when the button is hovered + --clr-a-text: hsl(200, 100%, var(--L-a-text)); + --clr-a-text-hvr: hsl(200, 100%, calc(var(--L-a-text) * var(--L-a-text-hover-change))); + --clr-buttons-main-bg: hsl(0, 0%, var(--L-buttons-main-bg));//the buttons in the main section at the top titled "download zip" "download tarbell" "veiw on github" + --clr-buttons-main-border: hsl(0, 0%, var(--L-buttons-main-border)); + --clr-buttons-main-text: hsl(0, 0%, var(--L-buttons-main-text)); + --clr-buttons-main-text-hover: hsl(0, 6%, var(--L-buttons-main-text-hover)); + // headers + text + --clr-h1-and-bold: hsl(0, 0%, var(--L-h1-and-bold)); + --clr-h2: hsl(0, 0%, var(--L-h2)); + --clr-h-3-6: hsl(0, 0%, var(--L-h-3-6)); + --clr-text: hsl(0, 0%, var(--L-text)); + // code blocks + --clr-code-text: hsl(0, 0%, var(--L-code-text)); + --clr-code-bg: hsl(0, 0%, var(--L-code-bg)); + --clr-code-border: hsl(0, 0%, var(--L-code-border)); + --clr-code-bold-text: hsl(0, 0%, var(--L-code-bold-text)); + //kbd these are keyboard shortcuts eg CMD+R + --clr-kbd-bg: hsl(210, 25%, var(--L-kbd-bg)); + --clr-kbd-border: hsl(212.7, 10.7%, var(--L-kbd-border)); + --clr-kbd-border-bottom-and-shadow: hsl(210, 8.2%, var(--L-kbd-border-bottom-and-shadow));// akbd elemnts border bottom and its shadow color + --clr-kbd-text: hsl(210, 11.7%, var(--L-kbd-text)); + // miselainies + --clr-bg: hsl(0, 0%, var(--L-bg));//the bg of the page + --clr-splitter-blockquote-and-section: hsl(0, 0%, var(--L-splitter-blockquote-and-section));//a color for the lines that split tables, appear on the left pf blockquotes and mark new sections + --clr-small-in-a: hsl(0, 0%, var(--L-small-in-a));//the color for small elements in a's this color is used on the veiw on github button above the download buttons + --clr-table-header-and-dt: hsl(0, 0%, var(--L-table-header-and-dt)); //more info on dt's https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_dd_test +} + +@mixin light-colors { + // buttons + --L-a-text: 35%; + --L-buttons-main-bg: 96%; + --L-buttons-main-border: 88%; + --L-buttons-main-text: 40%; + --L-buttons-main-text-hover: 38%; + // headers + text + --L-h1-and-bold: 13%; + --L-h2: 22%; + --L-h-3-6: 29%; + --L-text-bold: 36%; + --L-text: 45%; + // code blocks + --L-code-text: 20%; + --L-code-bg: 97%; + --L-code-border: 90%; + --L-code-bold-text: 0%; + //kbd these are keyboard shortcuts eg CMD+R + --L-kbd-bg: 98%; + --L-kbd-border: 80%; + --L-kbd-border-bottom-and-shadow: 62%; + --L-kbd-text: 30%; + // misilainius + --L-bg: 100%; + --L-splitter-blockquote-and-section: 90%;//for elements like hr + blockquote + --L-small-in-a: 47%; + --L-table-header-and-dt: 27%; //more on dt's https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_dd_test +} + +@mixin dark-colors { +// buttons +--L-a-text: 60%; +--L-buttons-main-bg: 17%; +--L-buttons-main-border: 26%; +--L-buttons-main-text: 76%; +--L-buttons-main-text-hover: 80%; +// headers + text +--L-h1-and-bold: 90%; +--L-h2: 83%; +--L-h-3-6: 76%; +--L-text: 70%; +// code blocks +--L-code-text: 80%; +--L-code-bg: 3%; +--L-code-border: 5%; +--L-code-bold-text: 100%; +//kbd these are keyboard shortcuts eg CMD+R +--L-kbd-bg: 30%; +--L-kbd-border: 45%; +--L-kbd-border-bottom-and-shadow: 55%; +--L-kbd-text: 100%; +// misilainius +--L-splitter-blockquote-and-section: 15%;// for elements like hr and blockquote +--L-bg: 10%; +--L-small-in-a: 60%; +--L-table-header-and-dt: 90%; //more on dt's https://www.w3schools.com/tags/tryit.asp?filename=tryhtml_dd_test +} diff --git a/minimalist/_sass/fonts.scss b/minimalist/_sass/fonts.scss new file mode 100644 index 0000000..04c28e9 --- /dev/null +++ b/minimalist/_sass/fonts.scss @@ -0,0 +1,55 @@ +@font-face { + font-family: 'Noto Sans'; + font-weight: 400; + font-style: normal; + src: url('../fonts/Noto-Sans-regular/Noto-Sans-regular.eot'); + src: url('../fonts/Noto-Sans-regular/Noto-Sans-regular.eot?#iefix') format('embedded-opentype'), + local('Noto Sans'), + local('Noto-Sans-regular'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.woff2') format('woff2'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.woff') format('woff'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.ttf') format('truetype'), + url('../fonts/Noto-Sans-regular/Noto-Sans-regular.svg#NotoSans') format('svg'); +} + +@font-face { + font-family: 'Noto Sans'; + font-weight: 700; + font-style: normal; + src: url('../fonts/Noto-Sans-700/Noto-Sans-700.eot'); + src: url('../fonts/Noto-Sans-700/Noto-Sans-700.eot?#iefix') format('embedded-opentype'), + local('Noto Sans Bold'), + local('Noto-Sans-700'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.woff2') format('woff2'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.woff') format('woff'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.ttf') format('truetype'), + url('../fonts/Noto-Sans-700/Noto-Sans-700.svg#NotoSans') format('svg'); +} + +@font-face { + font-family: 'Noto Sans'; + font-weight: 400; + font-style: italic; + src: url('../fonts/Noto-Sans-italic/Noto-Sans-italic.eot'); + src: url('../fonts/Noto-Sans-italic/Noto-Sans-italic.eot?#iefix') format('embedded-opentype'), + local('Noto Sans Italic'), + local('Noto-Sans-italic'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.woff2') format('woff2'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.woff') format('woff'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.ttf') format('truetype'), + url('../fonts/Noto-Sans-italic/Noto-Sans-italic.svg#NotoSans') format('svg'); +} + +@font-face { + font-family: 'Noto Sans'; + font-weight: 700; + font-style: italic; + src: url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot'); + src: url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot?#iefix') format('embedded-opentype'), + local('Noto Sans Bold Italic'), + local('Noto-Sans-700italic'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2') format('woff2'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff') format('woff'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf') format('truetype'), + url('../fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg#NotoSans') format('svg'); +} diff --git a/minimalist/_sass/jekyll-theme-minimalist.scss b/minimalist/_sass/jekyll-theme-minimalist.scss new file mode 100644 index 0000000..7d456be --- /dev/null +++ b/minimalist/_sass/jekyll-theme-minimalist.scss @@ -0,0 +1,316 @@ +@import "fonts"; +@import "rouge-github"; +@import "colors"; + +body { + background-color: var(--clr-bg); + padding:50px; + font: 15px/1.5 "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + color: var(--clr-text); + font-weight:400; +} + +h1, h2, h3, h4, h5, h6 { + color: var(--clr-h1-and-bold); + margin:0 0 20px; +} + +p, ul, ol, table, pre, dl { + margin:0 0 20px; +} + +h1, h2, h3 { + line-height:1.1; +} + +h1 { + font-size:32px; +} + +h2 { + color: var(--clr-h2); +} + +h3, h4, h5, h6 { + color: var(--clr-h-3-6); +} + +a { + color:var(--clr-a-text); + text-decoration:none; +} + +a:hover, a:focus { + color: var(--clr-a-text-hvr); +} + +a small { + font-size:11px; + color:var(--clr-small-in-a); + margin-top:-0.3em; + display:block; +} + +a:hover small { + color:var(--clr-small-in-a); +} + +// added +p.link { + margin:0 0 4px; +} + +// added +ul.link { + list-style-type: none; /* Remove bullets */ + margin: 0; /* To remove default bottom margin */ + padding: 0.4px; /* To remove default left padding */ +} + +ul.link li + li { + margin-top: 6px; +} + +ul.link:last-child { + margin-bottom: 6px; +} + +.wrapper { + width:860px; + margin: 0 auto; +} + +blockquote { + border-left:1px solid var(--clr-splitter-blockquote-and-section); + margin:0; + padding:0 0 0 20px; + font-style:italic; +} + +code, pre { + font-family:Monaco, Bitstream Vera Sans Mono, Lucida Console, Terminal, Consolas, Liberation Mono, DejaVu Sans Mono, Courier New, monospace; + color: var(--clr-code-text); +} + +pre { + padding:8px 15px; + background: var(--clr-code-bg); + border-radius:5px; + border:1px solid var(--clr-code-border); + overflow-x: auto; +} + +table { + width:100%; + border-collapse:collapse; +} + +th, td { + text-align:left; + padding:5px 10px; + border-bottom:1px solid var(--clr-splitter-blockquote-and-section); +} + +dt { + color:var(--clr-table-header-and-dt); + font-weight:700; +} + +th { + color:var(--clr-table-header-and-dt); +} + +img { + max-width:100%; +} + +kbd { + background-color: var(--clr-kbd-bg) ; + border: 1px solid var(--clr-kbd-border); + border-bottom-color: var(--clr-kbd-border-bottom-and-shadow); + border-radius: 3px; + box-shadow: inset 0 -1px 0 var(--clr-kbd-border-bottom-and-shadow); + color: var(--clr-kbd-text); + display: inline-block; + font-size: 11px; + line-height: 10px; + padding: 3px 5px; + vertical-align: middle; +} + +.sidebar { + width:185px; + float:left; + position:fixed; + -webkit-font-smoothing:subpixel-antialiased; + top: 0; + padding: 58px 0 50px 0; + display: flex; + flex-direction: column; + justify-content: space-between; + height: calc(100vh - 108px); + overflow-x: hidden; + overflow-y: scroll; + -ms-overflow-style: -ms-autohiding-scrollbar; // IE10+ +} + +// Disables the scrollbar in Firefox +// HTML-Proofer fails without "@-moz-document url-prefix()" +// because scrollbar-width is still experimental in Firefox. +@-moz-document url-prefix() { + .sidebar { + scrollbar-width: none; + } +} + +.sidebar::-webkit-scrollbar { + /* Chrome, Safari, Edge */ + display: none; +} + +strong { + color:var(--clr-h1-and-bold); + font-weight:700; +} + +section { + width: 610px; + float:right; + padding-bottom:30px; +} + +small { + font-size:11px; +} + +hr { + border:0; + background:var(--clr-splitter-blockquote-and-section); + height:1px; + width:30%; + margin:10px auto 30px; +} + +footer, .sidebar-footer { + width:185px; + float:left; + bottom:30px; + -webkit-font-smoothing:subpixel-antialiased; +} + +footer { + display: none; +} + +.sidebar-footer { + flex-basis: content; +} + +@media print, screen and (max-width: 960px) { + + .sidebar { + padding: initial; + display: initial; + height: initial; + overflow: initial; + } + + footer { + display: initial; + } + + .sidebar-footer { + display: none; + } + + div.wrapper { + width:auto; + margin:0; + } + + .sidebar, section, footer { + float:none; + position:static; + width:auto; + } + + header { + padding-right:320px; + } + + section { + border:1px solid var(--clr-splitter-blockquote-and-section); + border-width:1px 0; + padding:20px 0; + margin:0 0 20px; + } + + header a small { + display:inline; + } + + header ul { + position:absolute; + right:50px; + top:52px; + } + + .link-wrapper { + display: none !important; + } + + .img-circle { + display: none !important; + } +} + +@media print, screen and (max-width: 720px) { + body { + word-wrap:break-word; + } + + header { + padding:0; + } + + header ul, header p.view { + position:static; + } + + pre, code { + word-wrap:normal; + } +} + +.link-wrapper-mobile { + margin-bottom: 20px; +} + +@media print, screen and (min-width: 961px) { + .link-wrapper-mobile { + display: none !important; + } +} + +@media print, screen and (max-width: 480px) { + body { + padding:15px; + } + + // header ul { + // width:99%; + // } + + // header li, header ul li + li + li { + // width:33%; + // } +} + +@media print { + body { + padding:0.4in; + font-size:12pt; + color:#444; + } +} + diff --git a/minimalist/_sass/minimalist.scss b/minimalist/_sass/minimalist.scss new file mode 100644 index 0000000..9fbc2f6 --- /dev/null +++ b/minimalist/_sass/minimalist.scss @@ -0,0 +1,4 @@ +// Placeholder file. If your site uses +// @import "{{ site.theme }}"; +// Then using this theme with jekyll-remote-theme will work fine. +@import "jekyll-theme-minimalist"; \ No newline at end of file diff --git a/minimalist/_sass/rouge-github.scss b/minimalist/_sass/rouge-github.scss new file mode 100644 index 0000000..b748973 --- /dev/null +++ b/minimalist/_sass/rouge-github.scss @@ -0,0 +1,220 @@ +.highlight table td { padding: 5px; } +.highlight table pre { margin: 0; } +.highlight .cm { + color: #999988; + font-style: italic; +} +.highlight .cp { + color: #999999; + font-weight: bold; +} +.highlight .c1 { + color: #999988; + font-style: italic; +} +.highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; +} +.highlight .c, .highlight .cd { + color: #999988; + font-style: italic; +} +.highlight .err { + color: #a61717; + background-color: #e3d2d2; +} +.highlight .gd { + // color: #000000; + color: var(--clr-code-bold-text); + background-color: #ffdddd; +} +.highlight .ge { + // color: #000000; + color: var(--clr-code-bold-text); + font-style: italic; +} +.highlight .gr { + color: #aa0000; +} +.highlight .gh { + color: #999999; +} +.highlight .gi { + // color: #000000; + color: var(--clr-code-bold-text); + background-color: #ddffdd; +} +.highlight .go { + color: #888888; +} +.highlight .gp { + color: #555555; +} +.highlight .gs { + font-weight: bold; +} +.highlight .gu { + color: #aaaaaa; +} +.highlight .gt { + color: #aa0000; +} +.highlight .kc { + // color: #000000; + color: var(--clr-code-bold-text); + font-weight: bold; +} +.highlight .kd { + // color: #000000; + color: var(--clr-code-bold-text); + font-weight: bold; +} +.highlight .kn { + // color: #000000; + color: var(--clr-code-bold-text); + font-weight: bold; +} +.highlight .kp { + // color: #000000; + color: var(--clr-code-bold-text); + font-weight: bold; +} +.highlight .kr { + // color: #000000; + color: var(--clr-code-bold-text); + font-weight: bold; +} +.highlight .kt { + color: #445588; + font-weight: bold; +} +.highlight .k, .highlight .kv { + // color: #000000; + color: var(--clr-code-bold-text); + font-weight: bold; +} +.highlight .mf { + color: #009999; +} +.highlight .mh { + color: #009999; +} +.highlight .il { + color: #009999; +} +.highlight .mi { + color: #009999; +} +.highlight .mo { + color: #009999; +} +.highlight .m, .highlight .mb, .highlight .mx { + color: #009999; +} +.highlight .sb { + color: #d14; +} +.highlight .sc { + color: #d14; +} +.highlight .sd { + color: #d14; +} +.highlight .s2 { + color: #d14; +} +.highlight .se { + color: #d14; +} +.highlight .sh { + color: #d14; +} +.highlight .si { + color: #d14; +} +.highlight .sx { + color: #d14; +} +.highlight .sr { + color: #009926; +} +.highlight .s1 { + color: #d14; +} +.highlight .ss { + color: #990073; +} +.highlight .s { + color: #d14; +} +.highlight .na { + color: #008080; +} +.highlight .bp { + color: #999999; +} +.highlight .nb { + color: #0086B3; +} +.highlight .nc { + color: #445588; + font-weight: bold; +} +.highlight .no { + color: #008080; +} +.highlight .nd { + color: #3c5d5d; + font-weight: bold; +} +.highlight .ni { + color: #800080; +} +.highlight .ne { + color: #990000; + font-weight: bold; +} +.highlight .nf { + color: #990000; + font-weight: bold; +} +.highlight .nl { + color: #990000; + font-weight: bold; +} +.highlight .nn { + color: #555555; +} +.highlight .nt { + color: #000080; +} +.highlight .vc { + color: #008080; +} +.highlight .vg { + color: #008080; +} +.highlight .vi { + color: #008080; +} +.highlight .nv { + color: #008080; +} +.highlight .ow { + // color: #000000; + color: var(--clr-code-bold-text); + font-weight: bold; +} +.highlight .o { + // color: #000000; + color: var(--clr-code-bold-text); + font-weight: bold; +} +.highlight .w { + color: #bbbbbb; +} +// .highlight { +// background-color: #f8f8f8; +// } diff --git a/minimalist/assets/css/colors-auto-default-dark.scss b/minimalist/assets/css/colors-auto-default-dark.scss new file mode 100644 index 0000000..5bafdb1 --- /dev/null +++ b/minimalist/assets/css/colors-auto-default-dark.scss @@ -0,0 +1,17 @@ +--- +--- + +//this mode is like colors-auto but if the device does not support @media prefers-color-scheme it will deafault to dark mode + +@import "colors"; + +:root { + @include colors; + @include dark-colors; + } + +@media print, (prefers-color-scheme: light) {//we would not like to apply dark mode if content is on printer as that would use a lot of ink + :root { + @include light-colors; + } +} \ No newline at end of file diff --git a/minimalist/assets/css/colors-auto.scss b/minimalist/assets/css/colors-auto.scss new file mode 100644 index 0000000..d9a2a19 --- /dev/null +++ b/minimalist/assets/css/colors-auto.scss @@ -0,0 +1,15 @@ +--- +--- + +@import "colors"; + +:root { + @include colors; + @include light-colors; + } + +@media screen and (prefers-color-scheme: dark) {//we would not like to apply dark mode if content is on printer as that would use a lot of ink + :root{ + @include dark-colors; + } +} \ No newline at end of file diff --git a/minimalist/assets/css/colors-dark.scss b/minimalist/assets/css/colors-dark.scss new file mode 100644 index 0000000..e567564 --- /dev/null +++ b/minimalist/assets/css/colors-dark.scss @@ -0,0 +1,15 @@ +--- +--- + +@import "colors"; + +:root { + @include colors; + @include dark-colors; +} + +@media print { + :root { + @include light-colors; + } +} \ No newline at end of file diff --git a/minimalist/assets/css/colors-light.scss b/minimalist/assets/css/colors-light.scss new file mode 100644 index 0000000..bccbf3d --- /dev/null +++ b/minimalist/assets/css/colors-light.scss @@ -0,0 +1,9 @@ +--- +--- + +@import "colors"; + +:root { + @include colors; + @include light-colors; +} \ No newline at end of file diff --git a/minimalist/assets/css/style.scss b/minimalist/assets/css/style.scss new file mode 100644 index 0000000..31f9a60 --- /dev/null +++ b/minimalist/assets/css/style.scss @@ -0,0 +1,68 @@ +--- +--- + +@import "jekyll-theme-minimalist"; + +.img-circle { + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + border-radius: 8px; + margin-bottom: 10px; +} + +.overlay { + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + background: rgba(0, 0, 0, 0.7); + transition: opacity 500ms; + visibility: hidden; + opacity: 0; +} + +.overlay:target { + visibility: visible; + opacity: 1; +} + +.popup { + margin: 70px auto; + padding: 20px; + background: #fff; + border-radius: 5px; + width: 30%; + position: relative; + transition: all 1s ease-in-out; +} + +.popup .close { + position: absolute; + top: 10px; + right: 10px; + transition: all 200ms; + font-size: 30px; + font-weight: bold; + text-decoration: none; + color: #333; +} +.popup .close:hover { + color: #06D85F; +} + +.popup .content { + padding-right: 20px; + max-height: 30%; + overflow: auto; + font: 15px/1.5 "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +@media screen and (max-width: 700px){ + .box{ + width: 70%; + } + .popup{ + width: 70%; + } +} diff --git a/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.eot b/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.eot new file mode 100755 index 0000000..03bf93f Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.eot differ diff --git a/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.svg b/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.svg new file mode 100755 index 0000000..925fe47 --- /dev/null +++ b/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.svg @@ -0,0 +1,336 @@ + + + diff --git a/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf b/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf new file mode 100755 index 0000000..4599e3c Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.ttf differ diff --git a/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff b/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff new file mode 100755 index 0000000..9d0b78d Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff differ diff --git a/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2 b/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2 new file mode 100755 index 0000000..55fc44b Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-700/Noto-Sans-700.woff2 differ diff --git a/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot b/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot new file mode 100755 index 0000000..cb97b2b Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.eot differ diff --git a/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg b/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg new file mode 100755 index 0000000..abdafc0 --- /dev/null +++ b/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.svg @@ -0,0 +1,334 @@ + + + diff --git a/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf b/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf new file mode 100755 index 0000000..6640dbe Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.ttf differ diff --git a/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff b/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff new file mode 100755 index 0000000..209739e Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff differ diff --git a/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2 b/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2 new file mode 100755 index 0000000..f5525aa Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-700italic/Noto-Sans-700italic.woff2 differ diff --git a/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.eot b/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.eot new file mode 100755 index 0000000..a997349 Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.eot differ diff --git a/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.svg b/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.svg new file mode 100755 index 0000000..dcd8fc8 --- /dev/null +++ b/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.svg @@ -0,0 +1,337 @@ + + + diff --git a/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf b/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf new file mode 100755 index 0000000..7f75a2d Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.ttf differ diff --git a/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff b/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff new file mode 100755 index 0000000..6dce67c Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff differ diff --git a/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2 b/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2 new file mode 100755 index 0000000..a9c14c4 Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-italic/Noto-Sans-italic.woff2 differ diff --git a/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.eot b/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.eot new file mode 100755 index 0000000..15fc8bf Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.eot differ diff --git a/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.svg b/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.svg new file mode 100755 index 0000000..bd2894d --- /dev/null +++ b/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.svg @@ -0,0 +1,335 @@ + + + diff --git a/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf b/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf new file mode 100755 index 0000000..a83bbf9 Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.ttf differ diff --git a/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff b/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff new file mode 100755 index 0000000..17c8500 Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff differ diff --git a/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2 b/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2 new file mode 100755 index 0000000..a87d9cd Binary files /dev/null and b/minimalist/assets/fonts/Noto-Sans-regular/Noto-Sans-regular.woff2 differ diff --git a/minimalist/assets/img/cluster1.jpg b/minimalist/assets/img/cluster1.jpg new file mode 100644 index 0000000..55fb837 Binary files /dev/null and b/minimalist/assets/img/cluster1.jpg differ diff --git a/minimalist/assets/img/cluster2.jpg b/minimalist/assets/img/cluster2.jpg new file mode 100644 index 0000000..8656bc5 Binary files /dev/null and b/minimalist/assets/img/cluster2.jpg differ diff --git a/minimalist/assets/img/logo.png b/minimalist/assets/img/logo.png new file mode 100644 index 0000000..eb010fe Binary files /dev/null and b/minimalist/assets/img/logo.png differ diff --git a/minimalist/assets/js/scale.fix.js b/minimalist/assets/js/scale.fix.js new file mode 100644 index 0000000..911d33c --- /dev/null +++ b/minimalist/assets/js/scale.fix.js @@ -0,0 +1,27 @@ +(function(document) { + var metas = document.getElementsByTagName('meta'), + changeViewportContent = function(content) { + for (var i = 0; i < metas.length; i++) { + if (metas[i].name == "viewport") { + metas[i].content = content; + } + } + }, + initialize = function() { + changeViewportContent("width=device-width, minimum-scale=1.0, maximum-scale=1.0"); + }, + gestureStart = function() { + changeViewportContent("width=device-width, minimum-scale=0.25, maximum-scale=1.6"); + }, + gestureEnd = function() { + initialize(); + }; + + + if (navigator.userAgent.match(/iPhone/i)) { + initialize(); + + document.addEventListener("touchstart", gestureStart, false); + document.addEventListener("touchend", gestureEnd, false); + } +})(document); diff --git a/minimalist/definizioni.md b/minimalist/definizioni.md new file mode 100644 index 0000000..891fb1a --- /dev/null +++ b/minimalist/definizioni.md @@ -0,0 +1,29 @@ +--- +layout: default +--- + +# Definizioni + +Alcune definizioni ricorrenti nell'ambito del **calcolo distribuito**. + +job e task +: Nell'informatica, un **job** è un'unità di lavoro o unità di esecuzione +(che esegue detto **job**). Un componente di un **job** (come unità di lavoro) +è chiamato **task** o **step** (se sequenziale). Come unità di esecuzione, un +**job** può essere concretamente identificato con un singolo processo, che può +a sua volta avere sottoprocessi (processi figli; il processo corrispondente al +**job** essendo il processo genitore) che eseguono i compiti o i passaggi che +compongono il lavoro del **job**; o con un gruppo di processi; o con un +riferimento astratto a un processo o a un gruppo di processi. + +Gestore di code +: Un *sotware* che si occupa di assegnare agli utenti un accesso esclusivo e/o +non esclusivo alle risorse (nodi informatici) per un certo periodo di tempo in +modo che possano eseguire i *job*. Fornisce una struttura per l'avvio, +l'esecuzione e il monitoraggio dei *job*. + +Scalabilità forte (strong scaling) +: Il numero di processori aumenta mentre la dimensione del problema rimane costante. Ciò si traduce anche in un carico di lavoro ridotto per processore. + +Scalabilità debole (weak scaling) +: In caso di scalabilità debole, aumentano sia il numero di processori che la dimensione del problema. Ciò si traduce anche in un carico di lavoro costante per processore. diff --git a/minimalist/deploy.sh b/minimalist/deploy.sh new file mode 100755 index 0000000..b415fce --- /dev/null +++ b/minimalist/deploy.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +docker run --rm --volume="$PWD:/srv/jekyll:Z" --publish [::1]:4000:4000 jekyll/jekyll jekyll serve + diff --git a/minimalist/didattica.md b/minimalist/didattica.md new file mode 100644 index 0000000..ebc88cd --- /dev/null +++ b/minimalist/didattica.md @@ -0,0 +1,28 @@ +--- +layout: default +--- +# Didattica + +Il Beowulf *steffe* è stato progettato ed assemblato durante il progetto speciale +per la didattica "Calcolo Parallelo dall’Infrastruttura alla Matematica" +finanziato dall'Università di Pisa durante il secondo semestre dell'Anno Accademico +2022/2023. + +Informazioni relative a quanto è stato fatto in quel contesto possono essere +trovate [qui](https://numpi.dm.unipi.it/teaching/calcolo-parallelo-dallinfrastruttura-alla-matematica-2022-23/), insieme al [materiale didattico](https://git.phc.dm.unipi.it/fdurastante/cpar2023) prodotto per l'occasione. + +## Corsi Collegati + +Diversi corsi della Laurea Triennale e Magistrale in Matematica hanno contenuto +che è collegato e che può essere testato su questa macchina. +- Laboratorio di Introduzione alla Matematica Computazionale, +- Laboratorio Computazionale, +- Calcolo Scientifico, +- Metodi Numerici per le Equazioni alle Derivate Parziali. + +## Alcuni progetti + +Alcuni progetti sviluppati e testati sul Beowulf +- E. Coli, [Algoritmi di ordinamento distribuito](https://git.phc.dm.unipi.it/3dY_0/Calcolo_Parallelo_Cluster_Steffe) +- A. De Lucreziis, [A small tcp server for monitoring a node in a cluster](https://git.phc.dm.unipi.it/aziis98/go-stats-server) +- F. Minnocci, [Parallel Homotopy Continuation in Julia](https://github.com/BachoSeven/homotopy-continuation/) diff --git a/minimalist/favicon.ico b/minimalist/favicon.ico new file mode 100644 index 0000000..63963e2 Binary files /dev/null and b/minimalist/favicon.ico differ diff --git a/minimalist/index.md b/minimalist/index.md new file mode 100644 index 0000000..5059623 --- /dev/null +++ b/minimalist/index.md @@ -0,0 +1,32 @@ +--- +layout: default +--- + +# Il beowulf steffe + + +![ilcluster](https://steffe.lb.cs.dm.unipi.it/assets/img/cluster1.jpg) + +![ilcluster](https://steffe.lb.cs.dm.unipi.it/assets/img/cluster2.jpg) + + + +## Hardware e Rete + +Il cluster steffe è composta da **1 nodo di accesso** e **20 nodi di calcolo**. + +| **Nodo** | | +|----------------------|-------------------------------------------------------------------------------------| +| OKdo ROCK 4 Model C+ | Processore Hexa-core con Arm® big.LITTLE™ dual Arm Cortex® A72, quad Cortex-A53 CPU | +| | Arm Mali™ T860MP4 GPU | +| | RAM 4 Gb LPDDR4 a 64 bit | +| **Rete** | TP-Link TL-SG1428PE / 10/100/1000Mbps | + +Alcuni nodi sono equipaggiati con degli **acceleratori** per le _inferenze_ per algoritmi di Machine-Learning. + +| Acceleratori | Google Coral AI | +| ------------------ | --------------------------------------------- | +| ML accelerator | Google Edge TPU coprocessor: | +| | 4 TOPS (int8); 2 TOPS per watt | +| | Connetore: USB 3.0 Type-C\* (data/power) | +| | Dimensioni: 65 mm x 30 mm | diff --git a/minimalist/jekyll-theme-minimalist.gemspec b/minimalist/jekyll-theme-minimalist.gemspec new file mode 100644 index 0000000..543bc69 --- /dev/null +++ b/minimalist/jekyll-theme-minimalist.gemspec @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +Gem::Specification.new do |s| + s.name = "jekyll-theme-minimalist" + s.version = "0.1.0" + s.license = "CC0-1.0" + s.authors = ["Bodun Hu", "Steve Smith", "GitHub, Inc."] + s.email = [""] + s.homepage = "https://github.com/BDHU/minimalist" + s.summary = "Minimalist is a Jekyll theme inspired by Minimal" + + s.files = `git ls-files -z`.split("\x0").select do |f| + f.match(%r{^((_includes|_layouts|_sass|assets)/|(LICENSE|README)((\.(txt|md|markdown)|$)))}i) + end + + s.required_ruby_version = ">= 2.4.0" + + s.platform = Gem::Platform::RUBY + s.add_runtime_dependency "jekyll", "> 3.5", "< 5.0" + s.add_runtime_dependency "jekyll-seo-tag", "~> 2.0" + s.add_development_dependency "html-proofer", "~> 3.0" + s.add_development_dependency "rubocop-github", "~> 0.16" + s.add_development_dependency "w3c_validators", "~> 1.3" +end diff --git a/minimalist/minimalist.png b/minimalist/minimalist.png new file mode 100644 index 0000000..eb010fe Binary files /dev/null and b/minimalist/minimalist.png differ diff --git a/minimalist/script/bootstrap b/minimalist/script/bootstrap new file mode 100755 index 0000000..492e553 --- /dev/null +++ b/minimalist/script/bootstrap @@ -0,0 +1,6 @@ +#!/bin/sh + +set -e + +gem install bundler +bundle install diff --git a/minimalist/script/cibuild b/minimalist/script/cibuild new file mode 100755 index 0000000..a8b322c --- /dev/null +++ b/minimalist/script/cibuild @@ -0,0 +1,9 @@ +#!/bin/sh + +set -e + +bundle exec jekyll build +bundle exec htmlproofer ./_site --check-html --check-sri +bundle exec rubocop -D --config .rubocop.yml +bundle exec script/validate-html +gem build jekyll-theme-minimalist.gemspec diff --git a/minimalist/script/release b/minimalist/script/release new file mode 100755 index 0000000..eb0f246 --- /dev/null +++ b/minimalist/script/release @@ -0,0 +1,42 @@ +#!/bin/sh +# Tag and push a release. + +set -e + +# Make sure we're in the project root. + +cd $(dirname "$0")/.. + +# Make sure the darn thing works + +bundle update + +# Build a new gem archive. + +rm -rf jekyll-theme-minimalist-*.gem +gem build -q jekyll-theme-minimalist.gemspec + +# Make sure we're on the master branch. + +(git branch | grep -q 'master') || { + echo "Only release from the master branch." + exit 1 +} + +# Figure out what version we're releasing. + +tag=v`ls jekyll-theme-minimalist-*.gem | sed 's/^jekyll-theme-minimalist-\(.*\)\.gem$/\1/'` + +# Make sure we haven't released this version before. + +git fetch -t origin + +(git tag -l | grep -q "$tag") && { + echo "Whoops, there's already a '${tag}' tag." + exit 1 +} + +# Tag it and bag it. + +gem push jekyll-theme-minimalist-*.gem && git tag "$tag" && + git push origin master && git push origin "$tag" diff --git a/minimalist/script/validate-html b/minimalist/script/validate-html new file mode 100755 index 0000000..43d8fca --- /dev/null +++ b/minimalist/script/validate-html @@ -0,0 +1,28 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +require "w3c_validators" + +def validator(file) + extension = File.extname(file) + if extension == ".html" + W3CValidators::NuValidator.new + elsif extension == ".css" + W3CValidators::CSSValidator.new + end +end + +def validate(file) + puts "Checking #{file}..." + + path = File.expand_path "../_site/#{file}", __dir__ + results = validator(file).validate_file(path) + + return puts "Valid!" if results.errors.empty? + + results.errors.each { |err| puts err.to_s } + exit 1 +end + +validate "index.html" +validate File.join "assets", "css", "style.css" diff --git a/minimalist/setup.md b/minimalist/setup.md new file mode 100644 index 0000000..4cc91b9 --- /dev/null +++ b/minimalist/setup.md @@ -0,0 +1,361 @@ +--- +layout: default +--- + +## Preliminari + +In più casi dovremo eseguire uno script su tutte i nodi, per farlo possiamo utilizzare il seguente script `runsetup.sh`: + +```bash +#!/bin/bash +# Our custom function +file=$1 +cust_func(){ + echo "I am ${url}" + scp $file root@$url:/root/$file + ssh root@$url chmod +x /root/$file + NUMBER=$(echo $url | tr -dc '0-9') + ssh root@$url /root/$file $NUMBER +} +while IFS= read -r url +do + cust_func "$url $file" & +done < list.txt + +wait +echo "All commands have been run." +``` +seguito dal nome `script.sh` che vogliamo eseguire su tutte le macchine, e.g., +```bash +./runsetup.sh script.sh +``` + + +## Script di configurazione iniziale del nodo +Script `runsetup.sh` utilizzato per installare le macchine: + +```bash +#!/bin/bash + +mkdir /scratch + +chown -R rock:rock /home/rock + +# Don't ask for anything +export DEBIAN_FRONTEND=noninteractive + +# Cambia il fuso orario +timedatectl set-timezone Europe/Rome + +# Fixa la chiave pubblica delle repository (da https://forum.radxa.com/t/gpg-error-with-ubuntu-server-20-04/13392) +wget -O - apt.radxa.com/focal-stable/public.key | sudo apt-key add - + +# Repository aggiuntive +add-apt-repository ppa:gluster/glusterfs-7 -y + +# Update & Upgrade +apt update -y && apt upgrade -y + +# Install required packages +apt -y install build-essential gcc openmpi-bin openmpi-common libopenmpi-dev glusterfs-server slurm python3-pip valgrind tree git curl man-db mc parallel neovim unrar atool +``` +e che può essere eseguito come: +```bash +./runsetup.sh script.sh +``` + +## Personalizzare la shell di login sul Nodo 0 + +Possiamo personalizzare il messaggio che appare al login sul nodo zero creando il seguente script `/etc/update-motd.d/05-info`: + +```bash +#! /usr/bin/env bash + +export TERM=xterm-256color + +# Basic info +HOSTNAME=$(uname -n) +ROOT=$(df -Ph | grep mmcblk0p5 | awk '{print $4}' | tr -d '\n') +IFS=. read -r s _ < /proc/uptime; d=$((s / 60 / 60 / 24)); h=$((s / 60 / 60 % 24)); m=$((s / 60 % 60)); [ "$d" = 0 ] || UPTIME="${UPTIME}${d}d "; [ "$h" = 0 ] || UPTIME="${UPTIME}${h}h "; [ "$m" = 0 ] || UPTIME="${UPTIME}${m}m "; UPTIME="${UPTIME:-0m}" +KERNEL=$(uname -r) +RAID=$(lsblk -b -n -d | awk '$NF!~/sd[a-z]$/ && $NF!~/md[0-9]+$/ && !/loop/ {sum+=$4} END {printf "%.0f", sum/2/1024/1024/1024}') + + +TEMP_BIG="$(paste <(cat /sys/class/thermal/thermal_zone*/type) <(cat /sys/class/thermal/thermal_zone*/temp) | column -s $'\t' -t | sed 's/\(.\)..$/.\1°C'/ | head -1| cut -d' ' -f3 )" +TEMP_LITTLE="$(paste <(cat /sys/class/thermal/thermal_zone*/type) <(cat /sys/class/thermal/thermal_zone*/temp) | column -s $'\t' -t | sed 's/\(.\)..$/.\1°C/'| tail -1| cut -d' ' -f3 )" + +# System load +MEMORY1=`free -t -m | grep Total | awk '{print $3" MB";}'` +MEMORY2=`free -t -m | grep "Mem" | awk '{print $2" MB";}'` +LOAD1=`cat /proc/loadavg | awk {'print $1'}` +LOAD5=`cat /proc/loadavg | awk {'print $2'}` +LOAD15=`cat /proc/loadavg | awk {'print $3'}` + +echo "$(tput setaf 1)=================================================== + _______________________ _______ _______ _______ _ +( ____ \__ __( ____ ( ____ ( ____ ( ____ ( ) +| ( \/ ) ( | ( \/ ( \/ ( \/ ( \// +| (_____ | | | (__ | (__ | (__ | (__ +(_____ ) | | | __) | __) | __) | __) + ) | | | | ( | ( | ( | ( +/\____) | | | | (____/\ ) | ) | (____/ +\_______) )_( (_______// |/ (_______/ +$(tput setaf 2) +=================================================== + - Hostname............: $HOSTNAME + - Disk Space..........: $ROOT remaining + - RAID Space..........: $RAID GB remaining +$(tput setaf 4)=================================================== + - CPU usage...........: $LOAD1, $LOAD5, $LOAD15 (1, 5, 15 min) + - Memory used.........: $MEMORY1 / $MEMORY2 +$(tput setaf 5)=================================================== + - Temperature big.....: $TEMP_BIG + - Temperature little..: $TEMP_LITTLE +$(tput setaf 3)=================================================== + - Kernel..............: $KERNEL + - Uptime..............: $UPTIME +$(tput sgr0)===================================================" +``` + +## `dnsmasq` e rete interna + +`dnsmasq` è un *software libero* che fornisce funzionalità di memorizzazione nella cache DNS (Domain Name System), un server DHCP (Dynamic Host Configuration Protocol), router advertisement e funzionalità di avvio di rete, destinato a reti di computer di piccole dimensioni. Nel nostro caso è utilizzato come server DHCP per assegnare gli indirizzi ai nodi del cluster sulla rete interna (NAT) e offrire un servizio di DNS (nodi raggiungibili tramite il loro nome e non tramite il loro indirizzo IP). + +### Configurazione dnsmasq + +Per lanciare questo servizio è necessario liberare la porta 53 da eventuali servizi che la occupino già, su Ubuntu questo vuol dire disabilitare `systemd-resolved`. + +```bash +sudo systemctl disable --now systemd-resolved +sudo apt install dnsmasq +``` +impostare nel suo file di configurazione la funzione di DHCP de-commentando la riga `dhcp-range` nel file `/etc/dnsmasq.conf`, e finalmente lanciare il servizio: +```bash +sudo systemctl enable --now dnsmasq +``` + +### Configurazione rete interna (NAT) + +Per avere il funzionamento del nostro **guarded Beowulf**, abbiamo bisogno che il **nodo 0**, nodo di accesso, sia equipaggiato di due schede di rete. Una sarà connessa verso l'esterno, rendendo quindi il nodo un *frontend* per gli utenti, l'altra verso tutti i nodi del cluster. Dal punto di vista operativo, questo vuol dire che un *pacchetto* in arrivo dall'esterno dovrà essere tradotto di indirizzo per raggiugere i nodi interni della rete. Nell'ambito delle reti questa funzione è svolta dal **network address translation** (NAT), ovvero il meccanismo che permette proprio di modificare l'indirizzo IP dei pacchetti in transito attraverso un genrico apparato di rete - il nostro *nodo 0* - all'interno di una comunicazione in corso tra un utente e gli altri nodi del cluster. + +Su Ubuntu questo può essere fatto tramite il programma `iptables`: + +```bash +sudo apt install iptables +echo "1" | sudo tee /proc/sys/net/ipv4/ip_forward +cd /etc/sysctl.d/ +echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/10-ip-forwarding.conf +``` +In `/etc/network/interfaces`, per configurare permanentemente l'IP statico della macchina all'interno della LAN, l'IP pubblico e per creare la NAT del cluster: + +```interfaces +auto eth0 +iface eth0 inet static + address 192.168.0.2 + netmask 255.255.255.0 + +auto enxd03745888a34 +iface enxd03745888a34 inet static + address 131.114.10.121 + netmask 255.255.255.0 + gateway 131.114.10.1 + post-up /usr/sbin/iptables -t nat -A POSTROUTING -o enxd03745888a34 -s 192.168.0.0/24 -j MASQUERADE +``` + +Infine: +```bash +sudo systemctl restart dnsmasq +sudo reboot +``` +Dobbiamo inoltre comunicare il DNS a tutti i nodi in modo che possano risolvere le connessioni tra loro, ad esempio creando lo script `fixdns.sh`: +```bash +sudo echo "nameserver 192.168.0.2" >> /etc/resolvconf/resolv.conf.d/head +sudo ln -sf /run/resolvconf/resolv.conf /etc/resolv.conf +sudo resolvconf -u +``` +ed eseguendo +```bash +./runsetup.sh fixdns.sh +``` + +## GlusterFS + +Creiamo la cartella che conterrà le home condivise in **tutti i nodi** e attiviamo il servizio GlusterFS: +```bash +sudo mkdir /data${i} +systemctl enable --now glusterd +``` +Per installare GlusterFS dobbiamo per prima cosa permettere le connessioni dagli altri nodi attraverso il Firewall: +```bash +for i in {1..20}; do sudo iptables -I INPUT -p all -s steffe$i -j ACCEPT; done; +``` +Ora dobbiamo far riconoscere i nodi tra di loro +```bash +sudo gluster peer probe steffe0 +for i in {1..20}; do sudo gluster peer probe steffe${i}; done; +``` +e creare il volume condiviso: +```bash +sudo gluster volume create data replica 3 transport tcp steffe0:/data0 steffe1:/data1 steffe2:/data2 steffe3:/data3 steffe4:/data4 steffe5:/data5 steffe6:/data6 steffe7:/data7 steffe8:/data8 steffe9:/data9 steffe10:/data10 steffe11:/data11 steffe12:/data12 steffe13:/data13 steffe14:/data14 steffe15:/data15 steffe16:/data16 steffe17:/data17 steffe18:/data18 steffe19:/data19 steffe20:/data20 force +sudo gluster volume start data +sudo gluster volume info +``` +Possiamo quindi montare i dischi facendo +```bash +mkdir -p /mnt/data +mount -t glusterfs steffe0:data /mnt/data +``` +(da mettere poi in `/etc/fstab` come `steffe0:/data /mnt/data glusterfs defaults,_netdev 0 0`) + +## Slurm Workload Manager + +Slurm Workload Manager, precedentemente noto come Simple Linux Utility for Resource Management (SLURM), o semplicemente **Slurm**, è un job scheduler gratuito e open source per kernel Linux e Unix-like, utilizzato da molti dei supercomputer e cluster di computer del mondo. + +Fornisce tre funzioni fondamentali: + +- assegnazione di accesso esclusivo e/o non esclusivo ai *nodi* di calcolo agli utenti per un certo periodo di tempo in modo che possano eseguire i loro *job*, +- fornire un framework per l'**avvio**, l'**esecuzione** e il **monitoraggio** dei *job* che contengono (in genere) istruzioni parallele di tipo MPI sull'insieme di nodi allocati, +- arbitrare la "contesa" per le risorse gestendo una coda di lavori in sospeso. + +Per prima cosa dobbiamo installare *Slurm* su tutti i nodi del cluster +```bash +sudo apt-get update -y +sudo apt-get install slurmd slurmctld -y +``` +Generare un file di configurazione mediante il [configuratore online](https://slurm.schedmd.com/configurator.html) e inserirne il contenuto in +```bash +/etc/slurm/slurm.conf +``` +Al termine della configurazione avviare il servizio: +```bash +sudo systemctl enable --now slurmctld +sudo systemctl enable --now slurmd +``` + +### Raid +Per controllare lo stato del raid, utilizzare +``` +cat /proc/mdstat +``` + +### NFS +Sul control node: +``` +sudo apt install nfs-kernel-server +``` + +Configurare `/etc/exports` come desiderato, ad esempio + +``` +/mnt/raid steffe1(rw,sync,no_root_squash,no_subtree_check) +... +``` + +e poi `sudo systemctl restart nfs-kernel-server.service` + +Sui compute nodes: +``` +mkdir -p /mnt/raid +mount -t nfs steffe0:/mnt/raid /mnt/raid +``` +(da mettere poi in `/etc/fstab` come `steffe0:/mnt/raid/ /mnt/raid nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0`) + +### Creazione utenti + +Affinché un programma possa essere lanciato su tutti i nodi è necessario che l'**utente** sia disponibile su ciascuno di essi, il seguente script si occupa di replicare l'utente ovunque sia necessario: +```bash +#!/bin/bash +# +# Add a SLURM user to the Steffè cluster +# A good place for this script is in: +# /usr/local/bin/cluster-users + +set -e + +cluster_hosts="steffe1 steffe2 steffe3 steffe4 steffe5 steffe6 steffe7 steffe8 steffe9 steffe10 steffe11 steffe12 steffe13 steffe14 steffe15 steffe16 steffe17 steffe18 steffe19 steffe20" + +function help { + echo "Usage: $0 COMMAND username" + echo "" + echo "Examples: " + echo " -) $0 --add utente" + echo " -) $0 --delete utente" +} + +function add_user { + if [ "$1" == "" ]; then + echo "Specify a valid username for the new user" + exit 1 + fi + + if [ "$2" != "" ]; then + echo "Unsupported option specified" + exit 1 + fi + + sudo mkdir -p /mnt/raid/home + sudo adduser --home=/mnt/raid/home/$1 $1 + + # We obtain the UID of the new user, as the last line at the end + # of passwd + userid=$(grep $1 /etc/passwd | tail -n1 | cut -d ':' -f3) + + for h in ${cluster_hosts}; do + echo -n "Creating the user $1 on $h ... " + ssh root@${h} useradd -u ${userid} $1 + echo "done" + done +} + +function del_user { + if [ "$1" == "" ]; then + echo "Specify a valid username to delete" + exit 1 + fi + + if [ "$2" != "" ]; then + echo "Unsupported option specified" + exit 1 + fi + + echo -n "This command will remove the user $1, proceed? [yn]: " + read ans + + if [ "$ans" != "y" ]; then + echo "Exiting" + exit 0 + fi + + sudo userdel -f $1 + + for h in ${cluster_hosts}; do + echo -n "Deleting the user $1 on $h ... " + ssh root@${h} userdel -f $1 + echo "done" + done + + echo "Note: the home directory /mnt/raid/home/$1 has been preserved," + echo " you may wish to delete that as well." +} + +if [ "$1" == "--add" ]; then + add_user $2 + exit 0 +fi + +if [ "$1" == "--delete" ]; then + del_user $2 + exit 0 +fi + +help +``` + +## Assicurarsi che tutto funzioni al riavvio del Cluster +1. Montare RAID sul control node _se_ non l'ha fatto in automatico (ovvero spegnere e riaccendere il case dei dischi dal power button, fa tutto `/etc/fstab`) +2. Riavviare glusterd sui compute nodes (sicuramente non si sono avviati tutti prima del control node): [da `rock`]: `./runsetup.sh mountgluster.sh`. Se `/mnt/data` non funziona da `steffe0`, riavviare il servizio `mnt-data.mount` (eventualmente anche sulle altre macchine, sta già in `mountgluster.sh`). +3. Rimettere su i nodi (in modo che vadano tutti da DOWN ad IDLE nell'output di `sinfo`): +``` +for i in {1..20}; do sudo scontrol update nodename=steffe$i state=idle; done +``` +4. riavviare `nfs-kernel-server.service` su `steffe0` (se `steffe0` si accende prima degli altri non riesce a risolvere gli hostname all'avvio) e poi rimontare dappertutto con `./runsetup.sh mount-raid-nfs.sh` (TODO {anche per gluster} trovare un modo di far funzionare gli FSTAB all'avvio...) diff --git a/minimalist/slurm.md b/minimalist/slurm.md new file mode 100644 index 0000000..f5a2502 --- /dev/null +++ b/minimalist/slurm.md @@ -0,0 +1,12 @@ +--- +layout: default +--- + +# SLURM + +Stato aggregato dei nodi del cluster come visto dal **gestore di code** [Slurm](https://slurm.schedmd.com/documentation.html){:target="_blank"} + + + +La **dashboard** è costruita sfruttando i servizi [Prometheus](https://prometheus.io/){:target="_blank"} e [Grafana](https://grafana.com/){:target="_blank"} ed è disponibile in maniera non immersa su [qui](http://steffe.cs.dm.unipi.it:3000/dashboard/snapshot/UFCKuretP59fsJzkSiwQMgzerrVmZi9Z){:target="_blank"}. + diff --git a/minimalist/software.md b/minimalist/software.md new file mode 100644 index 0000000..a42398f --- /dev/null +++ b/minimalist/software.md @@ -0,0 +1,46 @@ +--- +layout: default +--- + +Questa pagina contiene informazioni riguardanti il **software** installato sulla macchina. + +## Come flashare la SD + +In questa sezione andremo a vedere come "flashare" la scheda di memoria dei nostri mini-computer con una ISO Linux. + +--- + +All'inteno della cartella `BeowulfSoftware` dentro [questa repository](https://git.phc.dm.unipi.it/fdurastante/cpar2023) troveremo due file: + +* `balenaEtcher-1.18.4-x64.AppImage` +* `rock-4c-plus-ubuntu-focal-server-arm64-20221109-1302-gpt.img.xz` + +Il primo file è un AppImage di Balena Etcher, il programma che utilizzeremo per effettuare questa operazione + +> AppImage è un formato per la distribuzione di software portatile su Linux senza la necessità di autorizzazioni di superutente per installare l'applicazione. + +Il secondo è l'immagine della distribuzione Linux che andremo ad installare: una versione di Ubuntu Server 20.04 per ARM pensate per le macchine con cui stiamo lavorando + +--- + +Per lanciare Balena Etcher ci basterà aprire il terminale e recarci nella directory in cui si trova il file e lanciare il comando + +```bash +./balenaEtcher-1.18.4-x64.AppImage +``` + +Si aprirà una finestra come questa + +![](https://git.phc.dm.unipi.it/fdurastante/cpar2023/raw/branch/main/Docs/images/balena1.png) + +Assicuriamoci di aver inserito la SD in una porta del nostro computer. Adesso clicchiamo su `flash from file` e andiamo a selezionare il file immagine che vogliamo installare (che si trova in questa repository). + +Una volta selezionata l'immagine, dovremo selezionare il target: l'SD che abbiamo inserito nel computer. **ATTENZIONE** a selezionare il target corretto, se dovessimo sbagliare quel disco/dispositivo/partizione verrà formattato! + +![](https://git.phc.dm.unipi.it/fdurastante/cpar2023/raw/branch/main/Docs/images/balena2.png) + +Adesso possiamo premere `Flash!` ed aspettare. Dopo qualche minuto il programma avrà terminato e vedremo una schermata come questa + +![](https://git.phc.dm.unipi.it/fdurastante/cpar2023/raw/branch/main/Docs/images/balena4.png) + +Possiamo rimuovere l'SD dal nostro computer ed inserirla nei mini-pc ed iniziare la configurazione! diff --git a/minimalist/spack.md b/minimalist/spack.md new file mode 100644 index 0000000..12b36c9 --- /dev/null +++ b/minimalist/spack.md @@ -0,0 +1,20 @@ +# Spack + +[Spack](https://spack.io/) rappresenta uno strumento avanzato di gestione dei pacchetti, mirato a supportare simultaneamente diverse versioni e configurazioni di software su una vasta gamma di piattaforme e ambienti. In particolare, è stato appositamente progettato per rispondere alle esigenze dei grandi centri di supercalcolo, in cui numerosi utenti e team applicativi condividono installazioni comuni di software su cluster caratterizzati da architetture non convenzionali e l'utilizzo di librerie prive di un'ABI standardizzata. Un aspetto distintivo di Spack è la sua natura non distruttiva: l'installazione di una nuova versione non interferisce con le installazioni preesistenti, consentendo così la coesistenza di molteplici configurazioni sullo stesso sistema. + +L'ambiente Spack può essere ottenuto via *git* +```bash +git clone --depth=100 --branch=releases/v0.21 https://github.com/spack/spack.git spack +``` +Una volta clonato, è possibile caricare l'ambiente con +```bash +cd spack +. share/spack/setup-env.sh +``` + +Adesso possiamo visualizzare quali sono i compilatori già installti sul sistema +e quelli disponibili: +```bash +spack compiler find +spack compilers +```