diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e152ef7 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +publish: build + cp -r minimalist/_site/* /var/www/cluster/ + +build: + (cd minimalist && bundle exec jekyll build) + + diff --git a/minimalist/.editorconfig b/minimalist/.editorconfig new file mode 100644 index 0000000..0b008c9 --- /dev/null +++ b/minimalist/.editorconfig @@ -0,0 +1,15 @@ +# editorconfig.org + +root = true + +[*] +indent_style = space +indent_size = 2 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.py] +indent_style = space +indent_size = 4 diff --git a/minimalist/.gitignore b/minimalist/.gitignore new file mode 100755 index 0000000..eb0c2cc --- /dev/null +++ b/minimalist/.gitignore @@ -0,0 +1,8 @@ +_site +.sass-cache +.jekyll-metadata +.bundle +vendor +Gemfile.lock +*.gem +.jekyll-cache diff --git a/minimalist/Gemfile b/minimalist/Gemfile new file mode 100644 index 0000000..2f9bebd --- /dev/null +++ b/minimalist/Gemfile @@ -0,0 +1,24 @@ +# frozen_string_literal: true + +source "https://rubygems.org" + +gemspec +# commenting below to remove dependency with "github-pages" +# gem "github-pages", group: :jekyll_plugins + +gem "jekyll-seo-tag" +gem "jekyll-sitemap" + +# https://github.com/jekyll/jekyll/issues/8523#issuecomment-751409319 +# When running locally, we run into the following error — +# `require': cannot load such file -- webrick (LoadError) +# adding this avoids it +gem "webrick" + +# adding the following gems to support removal of "github-pages" dependency +gem "jemoji" +gem "kramdown-parser-gfm" + +group :jekyll_plugins do + gem 'jekyll-diagrams' +end diff --git a/minimalist/LICENSE b/minimalist/LICENSE new file mode 100644 index 0000000..670154e --- /dev/null +++ b/minimalist/LICENSE @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see + diff --git a/minimalist/README.md b/minimalist/README.md new file mode 100644 index 0000000..3102a0b --- /dev/null +++ b/minimalist/README.md @@ -0,0 +1,150 @@ +# The Minimalist theme + +*Minimalist is a Jekyll theme, inspired by the [Minimal](https://github.com/pages-themes/minimal) theme from GitHub. You can [preview the theme to see what it looks like](http://bdhu.github.io/minimalist), or even [use it today](#usage).* + +![Demo of Minimalist](https://raw.githubusercontent.com/BDHU/minimalist/main/minimalist.png) + +## Usage + +### Docker + +The simplest way is to use a Docker container. For Docker installation instructions, please refer to the offical Docker [docs](https://docs.docker.com/engine/install/). After successful installation, simply execute: + +```bash +./deploy.sh +``` + +### Other Methods + +To use the Minimalist theme: + +1. Add the following line to your Gemfile + +```ruby +gem "jekyll-remote-theme" +``` + +then run `bundle install` to install the plugin. + +2. Add the following to your site's `_config.yml` to activate the plugin: + +```yml +plugins: + - jekyll-remote-theme +``` + +Note: If you are using a Jekyll version less than 3.5.0, use the `gems` key instead of `plugins`. + +3. Add the following line to your `config.yml` to use the theme + +```yml +remote_theme: BDHU/minimalist +``` + +then running `bundle exec jekyll serve` for local deployment. Here is a [demo](https://github.com/BDHU/bdhu.github.io) using this theme. + +An example `_config.yml` file can be found [here](https://github.com/BDHU/bdhu.github.io/blob/master/_config.yml). More info can be found at [Jekyll Remote Theme](https://github.com/benbalter/jekyll-remote-theme). + +## Customizing + +### Configuration variables + +Minimalist will respect the following variables, if set in your site's `_config.yml`: + +```yml +title: [The title of your site] +description: [A short description of your site's purpose] +``` + +Additionally, you may choose to set the following optional variables: + +```yml +google_analytics: [Your Google Analytics tracking ID] +``` + +Choose light, dark, or automatically adjusting theme based on system theme: + +```yml +color-scheme: auto/light/dark +``` + +Specify logo for the website: + +```yml +logo: /assets/img/ +``` + +Enable favicon by putting a `favicon.ico` in the repo's root directory and add the following line in `config.yml`: + +```yml +favicon: true +``` + +### Customizing Sidebar + +You can define a list of platforms that are linked from the sidebar in `_config.yml`: + +```yml +sidebar: + - name: Google Scholar + icon: + link: https://scholar.google.com/citations?user=zR6afi8AAAAJ + - name: GitHub + icon: + link: https://github.com/BDHU + - ... +``` + +For further customization of the sidebar, go to [sidebar.html](https://github.com/BDHU/minimalist/blob/main/_includes/sidebar.html) in this repo and modify it however you like. The [link-mobile.html](https://github.com/BDHU/minimalist/blob/main/_includes/links-mobile.html) customizes the sidebar's look on mobile devices. This example uses fonts from [font awesome](https://fontawesome.com) and [Iconify](https://iconify.design/). Feel free to explore/find other sources. + +### Stylesheet + +If you'd like to add your own custom styles: + +1. Create a file called `/assets/css/style.scss` in your site +2. Add the following content to the top of the file, exactly as shown: + + ```scss + --- + --- + + @import "{{ site.theme }}"; + ``` + +3. Add any custom CSS (or Sass, including imports) you'd like immediately after the `@import` line + +*Note: If you'd like to change the theme's Sass variables, you must set new values before the `@import` line in your stylesheet.* + +### Layouts + +If you'd like to change the theme's HTML layout: + +1. For some changes such as a custom `favicon`, you can add custom files in your local `_includes` folder. The files [provided with the theme](https://github.com/BDHU/minimalist/tree/master/_includes) provide a starting point and are included by the [original layout template](https://github.com/BDHU/minimalist/blob/master/_layouts/default.html). +2. For more extensive changes, [copy the original template](https://github.com/BDHU/minimalist/blob/master/_layouts/default.html) from the theme's repository
(*Pro-tip: click "raw" to make copying easier*) +3. Create a file called `/_layouts/default.html` in your site +4. Paste the default layout content copied in the first step +5. Customize the layout as you'd like + +For example, this [repository](https://github.com/BDHU/bdhu.github.io) shows how customizations are made on the original theme. + +### Customizing Google Analytics code + +Google has released several iterations to their Google Analytics code over the years since this theme was first created. If you would like to take advantage of the latest code, paste it into `_includes/head-custom-google-analytics.html` in your Jekyll site. + +## Previewing the theme locally + +If you'd like to preview the theme locally (for example, in the process of proposing a change): + +1. Clone down the theme's repository (`git clone https://github.com/BDHU/minimalist`) +2. `cd` into the theme's directory +3. Run `script/bootstrap` to install the necessary dependencies +4. Run `bundle exec jekyll serve` to start the preview server +5. Visit [`localhost:4000`](http://localhost:4000) in your browser to preview the theme + +## Running tests + +The theme contains a minimal test suite, to ensure a site with the theme would build successfully. To run the tests, simply run `script/cibuild`. You'll need to run `script/bootstrap` once before the test script will work. + +## Contributors + +Special thanks to [@godalming123](https://github.com/godalming123) for adding dark mode support. Also thank [@solvaholic](https://github.com/solvaholic), [@tildehacker](https://github.com/tildehacker), and other contributors for making multiple bug fixes and improvements. All contributions are welcome. diff --git a/minimalist/_config.yml b/minimalist/_config.yml new file mode 100644 index 0000000..872e833 --- /dev/null +++ b/minimalist/_config.yml @@ -0,0 +1,38 @@ +title: Il beowulf steffe +logo: /assets/img/logo.png +email: fabio.durastante@unipi.it +description: Informazioni sul cluster steffe +show_downloads: false +google_analytics: G-ZLK2GHB055 +color-scheme: auto +plugins: + - jekyll-sitemap + - jekyll-seo-tag + - jemoji + - jekyll-diagrams + +# Per jekyll diagrams si veda: https://github.com/zhustec/jekyll-diagrams + +# Sidebar +sidebar: + - name: Didattica + icon: + link: ./didattica.html + - name: SLURM + icon: + link: ./slurm.html + - name: Setup iniziale + icon: + link: ./setup.html + - name: Software + icon: + link: ./software.html + - name: Definizioni + icon: + link: ./definizioni.html + +# https://github.com/github/pages-gem/issues/399#issuecomment-301827749 +# When running locally, we run into the following error — +# GitHub Metadata: No GitHub API authentication could be found. Some fields may be missing or have incorrect data. +# adding this avoids it +github: [metadata] diff --git a/minimalist/_includes/footer.html b/minimalist/_includes/footer.html new file mode 100644 index 0000000..d25f252 --- /dev/null +++ b/minimalist/_includes/footer.html @@ -0,0 +1 @@ +

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 @@ + diff --git a/minimalist/_includes/sidebar.html b/minimalist/_includes/sidebar.html new file mode 100644 index 0000000..7006e07 --- /dev/null +++ b/minimalist/_includes/sidebar.html @@ -0,0 +1,18 @@ + diff --git a/minimalist/_layouts/default.html b/minimalist/_layouts/default.html new file mode 100644 index 0000000..d654a41 --- /dev/null +++ b/minimalist/_layouts/default.html @@ -0,0 +1,66 @@ +{% case site.color-scheme %} + {% when "", nil, false, 0, empty %} + {% assign ColorScheme = "auto" %} + {% else %} + {% assign ColorScheme = site.color-scheme %} +{% endcase %} + + + + + + + + +{% seo %} + + + + + + {% include head-custom.html %} + + +
+ +
+ + {{ content }} + +
+
+ {%- include footer.html -%} +
+
+ + + diff --git a/minimalist/_layouts/post.html b/minimalist/_layouts/post.html new file mode 100644 index 0000000..0676aff --- /dev/null +++ b/minimalist/_layouts/post.html @@ -0,0 +1,14 @@ +--- +layout: default +--- + +{{ page.date | date: "%-d %B %Y" }} +

{{ page.title }}

+ +

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 +```