├── src ├── assets │ ├── styles │ │ ├── sidebar.css │ │ ├── newdefault.css │ │ ├── lecture_header.css │ │ ├── layout.css │ │ ├── homepage.css │ │ └── index.css │ ├── favicon.ico │ ├── scripts │ │ ├── sidebar.js │ │ └── search.js │ ├── favicon.svg │ ├── julia-logo-color.svg │ ├── julia-logo-dark.svg │ ├── tinbergen-institute-logo.svg │ ├── tinbergen-institute-logo-white.svg │ ├── zoom_logo.svg │ └── uva_logo.svg ├── index.jlmd ├── _includes │ ├── md.jlmd │ ├── welcome.md │ └── layout.jlhtml ├── search.md ├── cheatsheets.md ├── sidebar data.jl ├── installation.md └── week0 │ └── basic_syntax.jl ├── .gitattributes ├── .gitignore ├── develop.jl ├── extra_outputs └── index.html ├── pluto-deployment-environment ├── Project.toml ├── PlutoDeployment.toml └── Manifest.toml ├── .vscode ├── tasks.json ├── extensions.json └── settings.json ├── .github └── workflows │ ├── PRComment.yml │ ├── PRCleanup.yml │ ├── KeepCacheFresh.yml │ └── ExportNotebooks.yml └── README.md /src/assets/styles/sidebar.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | page/* linguist-vendored 2 | * text=auto -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .DS_Store 3 | 4 | _cache 5 | _site 6 | generation_report.html -------------------------------------------------------------------------------- /src/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/greimel/pluto-course-template/HEAD/src/assets/favicon.ico -------------------------------------------------------------------------------- /src/index.jlmd: -------------------------------------------------------------------------------- 1 | --- 2 | authors: ["Massachusetts Institute of Technology"] 3 | tags: ["homepage"] 4 | layout: "welcome.md" 5 | --- 6 | -------------------------------------------------------------------------------- /src/_includes/md.jlmd: -------------------------------------------------------------------------------- 1 | --- 2 | layout: "layout.jlhtml" 3 | --- 4 | 5 |
6 |
7 | $(content) 8 |
9 |
-------------------------------------------------------------------------------- /develop.jl: -------------------------------------------------------------------------------- 1 | cd(@__DIR__) 2 | 3 | @assert VERSION >= v"1.6.0" 4 | 5 | import Pkg 6 | Pkg.activate("./pluto-deployment-environment") 7 | Pkg.instantiate() 8 | import PlutoPages 9 | 10 | PlutoPages.develop(@__DIR__) -------------------------------------------------------------------------------- /extra_outputs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /pluto-deployment-environment/Project.toml: -------------------------------------------------------------------------------- 1 | [deps] 2 | MarkdownLiteral = "736d6165-7244-6769-4267-6b50796e6954" 3 | Pkg = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 4 | Pluto = "c3e4b0f8-55cb-11ea-2926-15256bba5781" 5 | PlutoPages = "d5dc3dd1-4774-47c7-8860-0a1ad9e34b8c" 6 | -------------------------------------------------------------------------------- /src/_includes/welcome.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: "md.jlmd" 3 | --- 4 | 5 | # Welcome 6 | 7 | to the course :-) 8 | 9 | > **Acknowledgement** \\ 10 | > The design of this website is based on _**Computational Thinking**, a live online Julia/Pluto textbook._ [(computationalthinking.mit.edu)](https://computationalthinking.mit.edu) 11 | -------------------------------------------------------------------------------- /pluto-deployment-environment/PlutoDeployment.toml: -------------------------------------------------------------------------------- 1 | [Export] 2 | baked_state = false 3 | baked_notebookfile = true 4 | offer_binder = true 5 | ignore_cache = [ 6 | "index.jl", 7 | ] 8 | create_index = true 9 | exclude = [ 10 | # these are in the repo but not used on the website 11 | "tools/*", 12 | "PlutoPages.jl", 13 | ] 14 | -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "PlutoPages: run development server", 8 | "type": "shell", 9 | "command": "julia develop.jl", 10 | "group": "build" 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /src/search.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Search results" 3 | tags: [] 4 | layout: "md.jlmd" 5 | --- 6 | 7 | 8 |
9 |
10 |

Search

11 | 17 | 18 |

Results

19 |
20 | Loading... 21 |
22 | 23 | -------------------------------------------------------------------------------- /src/cheatsheets.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Cheatsheets" 3 | tags: ["welcome"] 4 | order: 7 5 | layout: "md.jlmd" 6 | --- 7 | 8 | # Cheatsheets 9 | 10 | - [Getting Started with Julia - live](/basic_syntax/). 11 | - [Fastrack to Julia](https://juliadocs.github.io/Julia-Cheat-Sheet/) cheatsheet. 12 | - [MATLAB-Julia-Python comparative cheatsheet](https://cheatsheets.quantecon.org/) by [QuantEcon group](https://quantecon.org) 13 | - [Plots.jl cheatsheet](https://github.com/sswatson/cheatsheets/blob/master/plotsjl-cheatsheet.pdf) 14 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations. 3 | // Extension identifier format: ${publisher}.${name}. Example: vscode.csharp 4 | 5 | // List of extensions which should be recommended for users of this workspace. 6 | "recommendations": [ 7 | "esbenp.prettier-vscode", 8 | "julialang.language-julia", 9 | ], 10 | // List of extensions recommended by VS Code that should not be recommended for users of this workspace. 11 | "unwantedRecommendations": [ 12 | 13 | ] 14 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.associations": { 3 | "*.jlmd": "markdown", 4 | "*.jlhtml": "html", 5 | }, 6 | 7 | "prettier.printWidth": 160, 8 | "prettier.tabWidth": 4, 9 | "prettier.semi": false, 10 | "prettier.quoteProps": "consistent", 11 | "prettier.singleQuote": false, 12 | 13 | "editor.formatOnSave": false, 14 | "[javascript]": { 15 | "editor.defaultFormatter": "esbenp.prettier-vscode", 16 | "editor.formatOnSave": true 17 | }, 18 | "[css]": { 19 | "editor.defaultFormatter": "esbenp.prettier-vscode", 20 | "editor.formatOnSave": true 21 | } 22 | } -------------------------------------------------------------------------------- /src/assets/scripts/sidebar.js: -------------------------------------------------------------------------------- 1 | const sidebar = document.querySelector("#pages-sidebar") 2 | const layout = document.querySelector("#pages-layout") 3 | const navtoggle = document.querySelector("#toggle-nav") 4 | 5 | document.querySelector("#toggle-nav").addEventListener("click", function (e) { 6 | console.log(e) 7 | layout.classList.toggle("pages_show_sidebar") 8 | e.stopPropagation() 9 | }) 10 | 11 | window.addEventListener("click", function (e) { 12 | if (!sidebar.contains(e.target) && !navtoggle.contains(e.target)) { 13 | layout.classList.remove("pages_show_sidebar") 14 | } 15 | }) 16 | 17 | console.info("zzzz") 18 | console.info(layout) 19 | -------------------------------------------------------------------------------- /.github/workflows/PRComment.yml: -------------------------------------------------------------------------------- 1 | name: PR Comment # Write a comment in the PR with a link to the preview of the given website 2 | on: 3 | pull_request: 4 | types: [opened, reopened] 5 | jobs: 6 | pr_comment: 7 | runs-on: ubuntu-latest 8 | steps: 9 | - name: Create PR comment 10 | if: github.event_name == 'pull_request' && github.repository == github.event.pull_request.head.repo.full_name # if this is a pull request build AND the pull request is NOT made from a fork 11 | uses: thollander/actions-comment-pull-request@71efef56b184328c7ef1f213577c3a90edaa4aff 12 | with: 13 | message: 'Once the build has completed, you can preview your PR at this URL: https://${{ github.event.pull_request.base.repo.owner.login }}.github.io/${{ github.event.pull_request.base.repo.name }}/previews/PR${{ github.event.number }}/' 14 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /src/sidebar data.jl: -------------------------------------------------------------------------------- 1 | Dict( 2 | :main => [ 3 | "welcome" => collections["welcome"].pages, 4 | "Preliminaries" => collections["preliminaries"].pages, 5 | "Module 2: Social Science & Data Science" => collections["module2"].pages, 6 | #"Module 3: Climate Science" => collections["module3"].pages, 7 | 8 | ], 9 | :about => Dict( 10 | :authors => [ 11 | (name = "Instructor One", url = "https://www.the-one.eu"), 12 | (name = "Second Instructor", url = "https://www.the-second.com") 13 | ], 14 | :title => "A Great Course", 15 | :subtitle => "Even Greater Than You Thought", 16 | :term => "Spring 2023", 17 | :institution => "University of Greatness", 18 | :institution_url => "http://www.uva.nl", 19 | :institution_logo => "julia-logo-color.svg", 20 | :institution_logo_darkmode => "julia-logo-dark.svg" 21 | ) 22 | ) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pluto-course-template 2 | 3 | Template for a course website based on https://computationalthinking.mit.edu/Fall23/ 4 | 5 | #### see the [website this template generates](https://greimel.github.io/pluto-course-template) 6 | 7 | This is a fork of https://github.com/mitmath/computational-thinking/tree/Fall23. Changes: 8 | 9 | * repository reduced to a minimal example 10 | * can also deploy to GitLab Pages (via GitLab CI) – in addition to GitHub Pages. 11 | 12 | ## Instructions 13 | 14 | Here is how to adjust the website to your needs. 15 | 16 | 1. Generate the repository 17 | 2. Customize the content in `src/` 18 | * customize the sidebar in `sidebar data.jl` 19 | * add your own notebooks (you need to add metadata) 20 | * add additional pages 21 | 3. Push to GitHub - wait for GitHub Actions to finish 22 | 5. Enable GitHub Pages, choose branch `output` 23 | 6. On the repository's landing page, add a link to repo's pages 24 | 7. Wait for GitHub Actions to finish and check the result 25 | -------------------------------------------------------------------------------- /src/assets/styles/newdefault.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Alegreya:ital,wght@0,500;0,700;1,500;1,700&display=swap"); 2 | @import url("https://fonts.googleapis.com/css2?family=Inter:wght@100;200;300;400;500;600;700;800;900&display=swap"); 3 | @import url("https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap"); 4 | @import url("https://fonts.googleapis.com/css2?family=Vollkorn:ital,wght@0,400;0,500;0,600;0,700;0,800;0,900;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"); 5 | 6 | html { 7 | box-sizing: border-box; 8 | font-size: 17px; 9 | /* color: #3c3c3c; */ 10 | } 11 | 12 | body { 13 | /* background: #f1e7e7; */ 14 | font-family: "Open Sans", sans-serif; 15 | overflow-wrap: break-word; 16 | } 17 | main h1 { 18 | font-family: "Vollkorn", serif; 19 | font-weight: 800; 20 | font-style: italic; 21 | margin-block-end: 0.5em; 22 | font-size: 2.5rem; 23 | margin-block-start: 0; 24 | letter-spacing: -0.2px; 25 | } 26 | -------------------------------------------------------------------------------- /.github/workflows/PRCleanup.yml: -------------------------------------------------------------------------------- 1 | # from https://github.com/CliMA/ClimaTimeSteppers.jl 2 | # and https://github.com/JuliaPluto/computational-thinking-template 3 | 4 | name: Site Preview Cleanup 5 | 6 | on: 7 | pull_request: 8 | types: [closed] 9 | 10 | jobs: 11 | doc-preview-cleanup: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout gh-pages branch 15 | uses: actions/checkout@v2 16 | with: 17 | ref: output 18 | - name: Delete preview and history + push changes 19 | run: | 20 | if [ -d "previews/PR$PRNUM" ]; then 21 | git config user.name "Documenter.jl" 22 | git config user.email "documenter@juliadocs.github.io" 23 | git rm -rf "previews/PR$PRNUM" 24 | git commit -m "delete preview" 25 | git branch output-new $(echo "delete history" | git commit-tree HEAD^{tree}) 26 | git push --force origin output-new:output 27 | fi 28 | env: 29 | PRNUM: ${{ github.event.number }} -------------------------------------------------------------------------------- /src/assets/styles/lecture_header.css: -------------------------------------------------------------------------------- 1 | .lecture-header { 2 | background: #282936; 3 | color: white; 4 | padding: 1rem; 5 | /* min-height: 500px; */ 6 | /* width: 100%; */ 7 | display: block; 8 | border-radius: 1rem; 9 | margin: 1rem; 10 | } 11 | 12 | .lecture-header * { 13 | color: white; 14 | } 15 | 16 | .lecture-header, 17 | .lecture-header h1 { 18 | font-family: Vollkorn, serif; 19 | font-weight: 700; 20 | font-feature-settings: "lnum", "pnum"; 21 | } 22 | 23 | .lecture-header .number { 24 | font-style: italic; 25 | font-size: 1.5rem; 26 | opacity: 0.8; 27 | } 28 | 29 | .lecture-header h1 { 30 | text-align: center; 31 | font-size: 2rem; 32 | } 33 | .lecture-header .video > div { 34 | display: flex; 35 | justify-content: center; 36 | overflow: hidden; 37 | max-width: 400px; 38 | margin: 0 auto; 39 | } 40 | .lecture-header .video iframe, 41 | .lecture-header .video lite-youtube { 42 | /* max-width: 400px; */ 43 | aspect-ratio: 16/9; 44 | flex: 1 1 auto; 45 | } 46 | -------------------------------------------------------------------------------- /.github/workflows/KeepCacheFresh.yml: -------------------------------------------------------------------------------- 1 | name: Keep caches fresh 2 | on: 3 | schedule: 4 | - cron: "5 4 1/4 * *" # every 4 days 5 | 6 | jobs: 7 | build-and-deploy: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: ⏱ Cache notebook states 11 | uses: actions/cache@v2 12 | with: 13 | path: _cache 14 | key: ${{ runner.os }}-pluto_state_cache-v3-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }}-${{ github.run_id }} 15 | restore-keys: | 16 | ${{ runner.os }}-pluto_state_cache-v3-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }} 17 | 18 | - name: ⏱ Cache .julia 19 | uses: actions/cache@v2 20 | with: 21 | path: ~/.julia 22 | key: ${{ runner.os }}-dotjulia-v1-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }}-${{ github.run_id }} 23 | restore-keys: | 24 | ${{ runner.os }}-dotjulia-v1-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }} 25 | 26 | -------------------------------------------------------------------------------- /src/assets/favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /.github/workflows/ExportNotebooks.yml: -------------------------------------------------------------------------------- 1 | name: Export Pluto notebooks & Deploy 2 | permissions: 3 | contents: write 4 | on: 5 | push: 6 | branches: 7 | - main 8 | pull_request: 9 | branches: 10 | - main 11 | workflow_dispatch: 12 | concurrency: 13 | group: export 14 | cancel-in-progress: true 15 | 16 | jobs: 17 | build-and-deploy: 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Checkout Fall 23 source 21 | uses: actions/checkout@v2 22 | 23 | - name: 🙌 Install Julia 24 | uses: julia-actions/setup-julia@v1 25 | with: 26 | version: "1" 27 | 28 | - name: ⏱ Cache notebook states 29 | uses: actions/cache@v2 30 | with: 31 | path: _cache 32 | key: ${{ runner.os }}-pluto_state_cache-v3-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }}-${{ github.run_id }} 33 | restore-keys: | 34 | ${{ runner.os }}-pluto_state_cache-v3-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }} 35 | 36 | - name: ⏱ Cache .julia 37 | uses: actions/cache@v2 38 | with: 39 | path: ~/.julia 40 | key: ${{ runner.os }}-dotjulia-v1-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }}-${{ github.run_id }} 41 | restore-keys: | 42 | ${{ runner.os }}-dotjulia-v1-${{ hashFiles('**/Project.toml', '**/Manifest.toml') }} 43 | 44 | - name: 🪴 Generate site 45 | run: julia --project=pluto-deployment-environment -e ' 46 | import Pkg; 47 | Pkg.instantiate(); 48 | import PlutoPages; 49 | PlutoPages.generate("."; html_report_path="generation_report.html")' 50 | 51 | - name: 📰 Upload site generation report 52 | uses: actions/upload-artifact@v4 53 | if: always() 54 | with: 55 | path: generation_report.html 56 | 57 | - name: 🔀 Combine semesters into single site 58 | run: | 59 | mkdir www 60 | mv _site www/Fall23 61 | mv extra_outputs/* www 62 | 63 | - name: 🚀 Deploy to GitHub Pages (main) 64 | if: github.event_name == 'push' && github.ref == 'refs/heads/main' 65 | uses: JamesIves/github-pages-deploy-action@releases/v3 66 | with: 67 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 68 | BRANCH: output 69 | FOLDER: www 70 | CLEAN_EXCLUDE: | 71 | previews/* 72 | 73 | - name: Deploy PR preview 74 | if: github.event_name == 'pull_request' && github.repository == github.event.pull_request.head.repo.full_name # if this build is a PR build and the PR is NOT from a fork 75 | uses: JamesIves/github-pages-deploy-action@releases/v3 76 | with: 77 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 78 | BRANCH: output 79 | FOLDER: www 80 | TARGET_FOLDER: "previews/PR${{ github.event.number }}" # The website preview is going to be stored in the previews subfolder -------------------------------------------------------------------------------- /src/assets/styles/layout.css: -------------------------------------------------------------------------------- 1 | /* COLOR */ 2 | 3 | #pages-layout { 4 | /* --bg-color: set by pluto */ 5 | --sidebar-bg: #fafafa; 6 | --sidebar-color: rgb(82, 82, 82); 7 | --sidebar-li-active-bg: rgb(235, 235, 235); 8 | --sidebar-li-hover-bg: rgb(247, 240, 190); 9 | } 10 | @media (prefers-color-scheme: dark) { 11 | #pages-layout { 12 | --sidebar-bg: #303030; 13 | --sidebar-color: rgb(255, 255, 255); 14 | --sidebar-li-active-bg: rgb(82, 82, 82); 15 | --sidebar-li-hover-bg: rgb(108, 94, 70); 16 | } 17 | } 18 | 19 | /* LAYOUT */ 20 | 21 | #pages-layout { 22 | display: flex; 23 | flex-direction: row; 24 | min-height: 100vh; 25 | align-items: stretch; 26 | } 27 | 28 | #pages-sidebar { 29 | font-family: system-ui, sans-serif; 30 | flex: 0 0 auto; 31 | width: 15rem; 32 | font-weight: 400; 33 | z-index: 1900; 34 | } 35 | 36 | #pages-content { 37 | display: block; 38 | flex: 1 1 auto; 39 | min-width: 0; 40 | } 41 | 42 | #pages-sidebar > div { 43 | margin: 1rem; 44 | margin-right: 0; 45 | padding: 0.5rem; 46 | /* padding-bottom: 2rem; */ 47 | border-radius: 1rem; 48 | background: var(--sidebar-bg); 49 | color: var(--sidebar-color); 50 | } 51 | 52 | #toggle-nav { 53 | display: none; 54 | cursor: pointer; 55 | } 56 | 57 | /* SIDEBAR COLLAPSING */ 58 | 59 | #pages-content::after { 60 | content: ""; 61 | z-index: 23400; 62 | touch-action: none; 63 | pointer-events: none; 64 | position: fixed; 65 | top: 0; 66 | left: 0; 67 | right: 0; 68 | bottom: 0; 69 | transition: background-color 0.2s ease-out; 70 | } 71 | 72 | @media screen and (max-width: 768px) { 73 | #pages-layout { 74 | flex-direction: column; 75 | } 76 | #toggle-nav { 77 | display: inline-flex; 78 | align-self: start; 79 | border: none; 80 | background: none; 81 | } 82 | #toggle-nav::after { 83 | --size: 40px; 84 | content: " "; 85 | display: inline-block; 86 | width: var(--size); 87 | height: var(--size); 88 | background-image: url(https://cdn.jsdelivr.net/gh/ionic-team/ionicons@5.5.1/src/svg/menu-outline.svg); 89 | background-size: var(--size) var(--size); 90 | filter: var(--image-filters); 91 | } 92 | #pages-sidebar { 93 | position: fixed; 94 | top: 0; 95 | bottom: 0; 96 | right: 100%; 97 | overflow-y: auto; 98 | transition: transform 300ms cubic-bezier(0.18, 0.89, 0.45, 1.12); 99 | } 100 | @media (prefers-reduced-motion) { 101 | #pages-sidebar { 102 | transition: none; 103 | } 104 | } 105 | 106 | .pages_show_sidebar #pages-sidebar { 107 | transform: translateX(100%); 108 | z-index: 23401; 109 | } 110 | .pages_show_sidebar #pages-content::after { 111 | display: block; 112 | background-color: rgba(0, 0, 0, 0.5); 113 | } 114 | } 115 | 116 | /* SIDEBAR */ 117 | 118 | #pages-sidebar { 119 | --child-padding: 0.2em 0.6em; 120 | --border-radius: 0.5em; 121 | } 122 | 123 | #pages-sidebar > div > ul { 124 | margin-block-start: 0px; 125 | margin-block-end: 0px; 126 | } 127 | 128 | #pages-sidebar li, 129 | #pages-sidebar ul { 130 | padding: 0px; 131 | list-style-type: none; 132 | } 133 | 134 | #pages-sidebar a { 135 | color: unset; 136 | text-decoration: none; 137 | } 138 | 139 | #pages-sidebar li li a, 140 | #pages-sidebar li h3 { 141 | border-radius: var(--border-radius); 142 | padding: var(--child-padding); 143 | } 144 | 145 | #pages-sidebar li h3 { 146 | color: var(--sidebar-accent-1); 147 | font-variant-caps: all-petite-caps; 148 | margin-block-start: 3rem; 149 | margin-block-end: 0; 150 | } 151 | 152 | #pages-sidebar li hr { 153 | margin: 3rem 1rem; 154 | /* border-color: red; */ 155 | border-style: solid; 156 | opacity: 0.2; 157 | } 158 | 159 | #pages-sidebar li:first-of-type h3 { 160 | margin-block-start: 0; 161 | } 162 | 163 | #pages-sidebar li, 164 | #pages-sidebar ul { 165 | display: flex; 166 | flex-direction: column; 167 | align-items: stretch; 168 | } 169 | 170 | #pages-sidebar li li.homework { 171 | padding-left: 1ch; 172 | /* background: yellow; */ 173 | } 174 | 175 | #pages-sidebar li li a { 176 | margin: 0.2em 0; 177 | } 178 | 179 | #pages-sidebar li li.homework a { 180 | /* background: #ffb60012; */ 181 | margin: 0.4em 0px; 182 | outline: 3px dashed #92929278; 183 | outline-offset: -1px; 184 | } 185 | 186 | /* #pages-sidebar li li.homework a::before { 187 | content: "👉 "; 188 | } */ 189 | 190 | #pages-sidebar li li span.entry-number { 191 | opacity: 0.6; 192 | } 193 | #pages-sidebar li li.homework span.entry-number { 194 | display: block; 195 | } 196 | 197 | #pages-sidebar li li.active a { 198 | background-color: var(--sidebar-li-active-bg); 199 | } 200 | #pages-sidebar li li:hover a { 201 | background-color: var(--sidebar-li-hover-bg); 202 | } 203 | 204 | /* SIDEBAR LOGO */ 205 | 206 | #pages-sidebar .home_link img { 207 | height: 1.2em; 208 | width: 1.2em; 209 | } 210 | #pages-sidebar a.home_link { 211 | font-size: 1.7rem; 212 | padding: 0.3em; 213 | font-weight: 800; 214 | display: flex; 215 | flex-direction: row; 216 | align-items: center; 217 | gap: 0.5ch; 218 | } 219 | 220 | /* Markdown content */ 221 | 222 | .pages-markdown main { 223 | max-width: 700px; 224 | margin-left: auto; 225 | margin-right: auto; 226 | margin-top: 5rem; 227 | } 228 | -------------------------------------------------------------------------------- /src/assets/julia-logo-color.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/julia-logo-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /src/assets/scripts/search.js: -------------------------------------------------------------------------------- 1 | const root_href = document.head.querySelector("link[rel='root']").getAttribute("href") 2 | 3 | const minby = (arr, fn) => arr.reduce((a, b) => (fn(a) < fn(b) ? a : b)) 4 | const maxby = (arr, fn) => arr.reduce((a, b) => (fn(a) > fn(b) ? a : b)) 5 | const range = (length) => [...Array(length).keys()] 6 | 7 | const sortby = (arr, fn) => arr.sort((a, b) => fn(a) - fn(b)) 8 | 9 | const setup_search_index = async () => { 10 | const search_data_href = document.head.querySelector("link[rel='pp-search-data']").getAttribute("href") 11 | console.log(search_data_href) 12 | 13 | const search_data = await (await fetch(search_data_href)).json() 14 | window.search_data = search_data 15 | 16 | console.log(search_data) 17 | 18 | // create a search bar powered by lunr 19 | // const search_bar = document.createElement('div') 20 | // search_bar.id = 'search-bar' 21 | // search_bar.innerHTML = ` 22 | // 23 | //
24 | // ` 25 | // document.body.appendChild(search_bar) 26 | 27 | // create a search index 28 | const before = Date.now() 29 | const search_index = window.lunr(function () { 30 | this.ref("url") 31 | 32 | this.field("title", { boost: 10 }) 33 | this.field("tags", { boost: 5 }) 34 | this.field("text") 35 | this.metadataWhitelist = ["position"] 36 | search_data.forEach(function (doc) { 37 | this.add(doc) 38 | }, this) 39 | }) 40 | const after = Date.now() 41 | console.info(`lunr: Indexing ${search_data.length} documents took ${after - before}ms`) 42 | window.search_index = search_index 43 | 44 | return { search_data, search_index } 45 | } 46 | 47 | const excerpt_length = 200 48 | const excerpt_padding = 50 49 | 50 | const init_search = async () => { 51 | const query = new URLSearchParams(window.location.search).get("q") 52 | console.warn({ query }) 53 | 54 | document.querySelector(".search-bar.big input").value = query 55 | 56 | const { search_data, search_index } = await setup_search_index() 57 | 58 | if (query) { 59 | const results = search_index.search(query) 60 | console.log(results) 61 | 62 | const search_results = document.getElementById("search-results") 63 | 64 | if (results.length !== 0) { 65 | search_results.innerHTML = "" 66 | results.forEach((result) => { 67 | const { url, title, tags, text } = search_data.find((doc) => doc.url === result.ref) 68 | const result_div = document.createElement("a") 69 | result_div.classList.add("search-result") 70 | result_div.innerHTML = ` 71 |

72 |

73 |

74 | ` 75 | console.log(root_href) 76 | result_div.querySelector(".title").innerText = title 77 | result_div.href = new URL(url, new URL(root_href, window.location.href)).href 78 | result_div.querySelector(".tags").innerText = tags.join(", ") 79 | result_div.querySelector(".snippet").innerText = text.substring(0, excerpt_length) + "..." 80 | 81 | const text_match_positions = Object.values(result?.matchData?.metadata ?? {}) 82 | .flatMap((z) => z?.text?.position ?? []) 83 | .sort(([a, _a], [b, _b]) => a - b) 84 | const title_match_positions = Object.values(result?.matchData?.metadata ?? {}) 85 | .flatMap((z) => z?.title?.position ?? []) 86 | .sort(([a, _a], [b, _b]) => a - b) 87 | 88 | console.error(title_match_positions) 89 | if (title_match_positions.length > 0) { 90 | const strong_el = document.createElement("strong") 91 | strong_el.innerText = title 92 | result_div.querySelector(".title").innerHTML = `` 93 | result_div.querySelector(".title").appendChild(strong_el) 94 | } 95 | 96 | if (text_match_positions.length > 0) { 97 | // console.log(text_match_positions) 98 | // console.log(find_longest_run(text_match_positions, 50)) 99 | // console.log(find_longest_run(text_match_positions, 100)) 100 | // console.log(find_longest_run(text_match_positions, 200)) 101 | // console.log(find_longest_run(text_match_positions, 300)) 102 | // console.log(find_longest_run(text_match_positions, 400)) 103 | 104 | const [start_index, num_matches] = find_longest_run(text_match_positions, excerpt_length) 105 | 106 | const excerpt_start = text_match_positions[start_index][0] 107 | const excerpt_end = excerpt_start + excerpt_length 108 | 109 | const highlighted_ranges = text_match_positions.slice(start_index, start_index + num_matches) 110 | 111 | const elements = highlighted_ranges.flatMap(([h_start, h_length], i) => { 112 | const h_end = h_start + h_length 113 | const word = text.slice(h_start, h_end) 114 | const filler = text.slice(h_end, highlighted_ranges[i + 1]?.[0] ?? excerpt_end) 115 | const word_el = document.createElement("strong") 116 | word_el.innerText = word 117 | return [word_el, filler] 118 | }) 119 | 120 | const snippet_p = result_div.querySelector(".snippet") 121 | snippet_p.innerHTML = `` 122 | ;["...", text.slice(excerpt_start - excerpt_padding, excerpt_start).trimStart(), ...elements, "..."].forEach((el) => snippet_p.append(el)) 123 | } 124 | 125 | // text_match_positions.slice(start_index, start_index + num_matches).forEach(([start, length]) => { 126 | 127 | search_results.appendChild(result_div) 128 | }) 129 | } else { 130 | search_results.innerText = `No results found for "${query}"` 131 | } 132 | } 133 | } 134 | 135 | const count = (arr, fn) => arr.reduce((a, b) => fn(a) + fn(b), 0) 136 | 137 | const find_longest_run = (/** @type{Array<[number, number]>} */ positions, max_dist) => { 138 | const legal_run_size = (start_index) => 139 | positions.slice(start_index).filter(([start, length]) => start + length < positions[start_index][0] + max_dist).length 140 | 141 | console.warn(range(positions.length).map(legal_run_size)) 142 | 143 | const best_start = maxby(range(positions.length), legal_run_size) 144 | const best_length = legal_run_size(best_start) 145 | return [best_start, best_length] 146 | } 147 | 148 | window.init_search = init_search 149 | -------------------------------------------------------------------------------- /src/assets/styles/homepage.css: -------------------------------------------------------------------------------- 1 | @import url("newdefault.css"); 2 | 3 | body { 4 | background: url("../homepage/bg.svg"); 5 | background-color: hsl(231deg 14% 57%); 6 | background-size: cover; 7 | backdrop-filter: blur(3vw); 8 | } 9 | main h1 { 10 | font-family: "Vollkorn", serif; 11 | font-weight: 800; 12 | font-style: italic; 13 | margin-block-end: 0.5em; 14 | font-size: 3rem; 15 | margin-block-start: 0; 16 | border-bottom: 5px solid #74747414; 17 | letter-spacing: -0.2px; 18 | color: #424250; 19 | padding: 0px 10px; 20 | text-shadow: 7px 5px 0px #e5dbb8; 21 | } 22 | 23 | a { 24 | text-decoration: none; 25 | /* background: #f3f3ff; */ 26 | /* border: 3px solid; */ 27 | color: black; 28 | /* border-bottom: 0.2em solid rgba(0, 0, 0, 0.3); */ 29 | } 30 | .homepage a:not(.no-decoration) { 31 | background-position: 0 0.83em; 32 | background-repeat: repeat-x; 33 | background-size: 2px 8px; 34 | background-image: linear-gradient(to bottom, rgba(165, 213, 235, 0.3) 33%, rgba(165, 213, 235, 0.3)); 35 | /* text-shadow: 2px 2px white, 2px -2px white, -2px 2px white, -2px -2px white; */ 36 | transition: background-position 50ms linear, background-size 50ms linear; 37 | } 38 | 39 | a:hover { 40 | background-position: 0 0em; 41 | background-size: 2px auto; 42 | } 43 | 44 | div.banner { 45 | min-height: 20rem; 46 | display: grid; 47 | place-items: center; 48 | } 49 | 50 | div.banner h1 { 51 | transform: perspective(187px) rotate3d(0, 2, 0, 0deg); 52 | font-family: "Alegreya", sans-serif; 53 | background: #000000ad; 54 | padding: 0.2em 0.5em; 55 | margin: 0px 10px; 56 | border-radius: 0.4em; 57 | transition: transform 200ms ease-in-out; 58 | color: #ffffffc7; 59 | font-style: normal; 60 | border: none; 61 | backdrop-filter: blur(6px); 62 | /* flex: 1 1 auto; */ 63 | /* display: block; */ 64 | } 65 | div.banner h1 strong { 66 | color: white; 67 | } 68 | 69 | div.banner:hover h1 { 70 | /* transform: perspective(187px) rotate3d(0, 2, 0, 3deg) scale(1.05); */ 71 | } 72 | 73 | #title { 74 | background-image: url("../homepage/swoosh.png"); 75 | 76 | background-size: cover; 77 | image-rendering: pixelated; 78 | } 79 | 80 | img.logo { 81 | position: absolute; 82 | top: 5px; 83 | left: 5px; 84 | z-index: 10; 85 | height: 2rem; 86 | background: #ffffff96; 87 | padding: 3px; 88 | } 89 | 90 | .twocols { 91 | column-count: 2; 92 | color: #fffffff7; 93 | background: linear-gradient(155deg, #7c7e87, #5a594a); 94 | } 95 | 96 | main { 97 | /* background: white; */ 98 | padding: 1em; 99 | max-width: 86rem; 100 | z-index: -1; 101 | margin: 3em auto 0 auto; 102 | } 103 | main > div { 104 | z-index: 4; 105 | background: white; 106 | padding: 2rem; 107 | margin-block-end: 15rem; 108 | border-radius: 1rem; 109 | box-shadow: 0px 6px 7px #1c12120d; 110 | 111 | max-width: 700px; 112 | margin-left: auto; 113 | margin-right: auto; 114 | } 115 | 116 | main > div.wide { 117 | max-width: unset; 118 | } 119 | 120 | main > div:last-of-type { 121 | margin-block-end: 0px; 122 | } 123 | main > div > *:last-child, 124 | main > div > .contain > *:last-child { 125 | margin-block-end: 0px; 126 | margin-bottom: 0em; 127 | } 128 | main thingy { 129 | background: #ff00005e; 130 | width: 300vw; 131 | border-radius: 50%; 132 | height: 60vh; 133 | display: block; 134 | /* position: unset; */ 135 | z-index: -4; 136 | /* transform: translate(10px, -64px); */ 137 | /* transform: rotate(11deg); */ 138 | } 139 | .asdf { 140 | position: absolute; 141 | transform: translate(-); 142 | overflow: hidden; 143 | max-width: 100vw; 144 | } 145 | .contain { 146 | max-width: 700px; 147 | margin-left: auto; 148 | margin-right: auto; 149 | } 150 | 151 | blockquote { 152 | border-left: 0.6em solid #b97777; 153 | padding: 0.5em 1em; 154 | max-width: 30em; 155 | font-style: italic; 156 | background: #f9f9f9; 157 | font-size: 1rem; 158 | margin: 0 auto; 159 | } 160 | 161 | blockquote.banner { 162 | margin-top: -46px; 163 | font-style: unset; 164 | font-size: 1rem; 165 | border-radius: 0.5em; 166 | box-shadow: 0px 3px 17px #0000001a; 167 | } 168 | 169 | .pillars { 170 | display: flex; 171 | flex-direction: row; 172 | justify-content: space-between; 173 | overflow-x: auto; 174 | } 175 | 176 | .pillars > div { 177 | color: white; 178 | padding: 1em; 179 | background: #434366; 180 | min-height: 300px; 181 | flex: 1 1 33%; 182 | margin: 0px 10px; 183 | } 184 | 185 | .scrolly { 186 | /* max-height: 20em; */ 187 | /* overflow-y: auto; */ 188 | } 189 | .pillars > div ul { 190 | padding-left: 0.6rem; 191 | } 192 | .pillars > div li { 193 | list-style: "- "; 194 | margin-bottom: 0.3rem; 195 | margin-right: 0.5rem; 196 | } 197 | .pillars > div li::marker { 198 | color: rgba(255, 255, 255, 0.4); 199 | } 200 | 201 | .subjects { 202 | display: grid; 203 | grid-template-columns: repeat(3, auto); 204 | grid-gap: 1rem; 205 | /* display: flex; */ 206 | /* flex-wrap: wrap; */ 207 | } 208 | 209 | @media (max-width: 1350px) { 210 | .subjects { 211 | grid-template-columns: repeat(2, auto); 212 | } 213 | } 214 | @media (max-width: 850px) { 215 | .subjects { 216 | grid-template-columns: repeat(1, auto); 217 | } 218 | } 219 | 220 | @media (min-width: 1250px) { 221 | .subjectscontainer { 222 | display: flex; 223 | flex-direction: row; 224 | margin-block-start: 15rem; 225 | } 226 | 227 | .subjectscontainer h1 { 228 | flex-shrink: 0; 229 | position: sticky; 230 | top: 100px; 231 | align-self: flex-start; 232 | margin-block-start: 0px; 233 | /* padding-right: 0; */ 234 | margin-right: 1em; 235 | } 236 | } 237 | 238 | .subjects > a { 239 | display: block; 240 | border: 7px solid #c19d1c1f; 241 | min-height: 200px; 242 | min-width: min(90vw, 188px); 243 | padding: 1em; 244 | border-radius: 1em; 245 | transition: transform 100ms ease-in-out; 246 | /* width: 27%; */ 247 | box-shadow: 0px 6px 7px #1c12120d; 248 | } 249 | 250 | .subjects > a:hover { 251 | transform: scale(1.05); 252 | } 253 | 254 | .subjects > a img { 255 | max-width: 100%; 256 | width: 100%; 257 | } 258 | section { 259 | display: flex; 260 | flex-direction: row; 261 | background: linear-gradient(145deg, #a6b8ef, #daeaff); 262 | padding: 1em; 263 | background-repeat: repeat-x; 264 | border-radius: 1em; 265 | margin-bottom: 2em; 266 | } 267 | 268 | .shadow, 269 | section { 270 | box-shadow: 0px 6px 9px #0606060f; 271 | padding: 1rem; 272 | border-radius: 1rem; 273 | } 274 | 275 | @media (max-width: 500px) { 276 | section { 277 | flex-direction: column; 278 | } 279 | } 280 | 281 | section > div { 282 | flex: 1 1 60%; 283 | } 284 | 285 | section > div.content { 286 | margin-right: 1em; 287 | } 288 | section > div.preview { 289 | flex: 0 1 40%; 290 | } 291 | 292 | section > div.preview > img { 293 | width: 100%; 294 | } 295 | 296 | .github-logo { 297 | width: 1em; 298 | } 299 | 300 | .homepage, 301 | .banner { 302 | color: #3c3c3c; 303 | } 304 | -------------------------------------------------------------------------------- /src/installation.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: "Software installation" 3 | tags: ["welcome"] 4 | order: 1 5 | layout: "md.jlmd" 6 | --- 7 | 8 | $( 9 | begin 10 | # these special elements will automatically update to read the latest Julia version. See the JavaScript snippet at the bottom of this page to see how it works! 11 | 12 | version = html"1.8.2" 13 | pkg_version = html"1.8" 14 | 15 | nothing 16 | end 17 | ) 18 | 19 | # First-time setup: Install Julia & Pluto 20 | 21 | **Video version:** 22 | 23 | 24 | 25 | \\ 26 | \\ 27 | \\ 28 | **Text and pictures version:** 29 | 30 | ## Step 1: Install Julia $version 31 | 32 | Go to [https://julialang.org/downloads](https://julialang.org/downloads) and download the current stable release, Julia $(version), using the correct version for your operating system (Linux x86, Mac, Windows, etc). 33 | 34 | ## Step 2: Run Julia 35 | 36 | After installing, **make sure that you can run Julia**. On some systems, this means searching for the "Julia $(version)" program installed on your computer; in others, it means running the command `julia` in a terminal. Make sure that you can execute `1 + 1`: 37 | 38 | ![image](https://user-images.githubusercontent.com/6933510/91439734-c573c780-e86d-11ea-8169-0c97a7013e8d.png) 39 | 40 | *Make sure that you are able to launch Julia and calculate `1+1` before proceeding!* 41 | 42 | ## Step 3: Install [`Pluto`](https://github.com/fonsp/Pluto.jl) 43 | 44 | Next we will install the [**Pluto**](https://github.com/fonsp/Pluto.jl), the notebook environment that we will be using during the course. Pluto is a Julia _programming environment_ designed for interactivity and quick experiments. 45 | 46 | Open the **Julia REPL**. This is the command-line interface to Julia, similar to the previous screenshot. 47 | 48 | Here you type _Julia commands_, and when you press ENTER, it runs, and you see the result. 49 | 50 | To install Pluto, we want to run a _package manager command_. To switch from _Julia_ mode to _Pkg_ mode, type `]` (closing square bracket) at the `julia>` prompt: 51 | 52 |

 53 | julia> ]
 54 | 
 55 | (@v$(pkg_version)) pkg>
 56 | 
57 | 58 | The line turns blue and the prompt changes to `pkg>`, telling you that you are now in _package manager mode_. This mode allows you to do operations on **packages** (also called libraries). 59 | 60 | To install Pluto, run the following (case sensitive) command to *add* (install) the package to your system by downloading it from the internet. 61 | You should only need to do this *once* for each installation of Julia: 62 | 63 |

 64 | (@v$(pkg_version)) pkg> add Pluto
 65 | 
66 | 67 | This might take a couple of minutes, so you can go get yourself a cup of tea! 68 | 69 | ![image](https://user-images.githubusercontent.com/6933510/91440380-ceb16400-e86e-11ea-9352-d164911774cf.png) 70 | 71 | You can now close the terminal. 72 | 73 | ## Step 4: Use a modern browser: Mozilla Firefox or Google Chrome 74 | We need a modern browser to view Pluto notebooks with. Firefox and Chrome work best. 75 | 76 | 77 | # Second time: _Running Pluto & opening a notebook_ 78 | Repeat the following steps whenever you want to work on a project or homework assignment. 79 | 80 | ## Step 1: Start Pluto 81 | 82 | Start the Julia REPL, like you did during the setup. In the REPL, type: 83 | ```julia 84 | julia> using Pluto 85 | 86 | julia> Pluto.run() 87 | ``` 88 | 89 | ![image](https://user-images.githubusercontent.com/6933510/91441094-eb01d080-e86f-11ea-856f-e667fdd9b85c.png) 90 | 91 | The terminal tells us to go to `http://localhost:1234/` (or a similar URL). Let's open Firefox or Chrome and type that into the address bar. 92 | 93 | ![image](https://user-images.githubusercontent.com/6933510/199279574-4b1d0494-2783-49a0-acca-7b6284bede44.png) 94 | 95 | > If you're curious about what a _Pluto notebook_ looks like, have a look at the **Featured Notebooks**. These notebooks are useful for learning some basics of Julia programming. 96 | > 97 | > If you want to hear the story behind Pluto, have a look a the [JuliaCon presentation](https://www.youtube.com/watch?v=IAF8DjrQSSk). 98 | 99 | If nothing happens in the browser the first time, close Julia and try again. And please let us know! 100 | 101 | ## Step 2a: Opening a notebook from the web 102 | 103 | This is the main menu - here you can create new notebooks, or open existing ones. Our homework assignments will always be based on a _template notebook_, available in this GitHub repository. To start from a template notebook on the web, you can _paste the URL into the blue box_ and press ENTER. 104 | 105 | For example, homework 0 is available [here](/hw0/). Go to this page, and on the top right, click on the button that says "Edit or run this notebook". From these instructions, copy the notebook link, and paste it into the box. Press ENTER, and select OK in the confirmation box. 106 | 107 | ![image](https://user-images.githubusercontent.com/6933510/91441968-6b750100-e871-11ea-974e-3a6dfd80234a.png) 108 | 109 | **The first thing we will want to do is to save the notebook somewhere on our own computer; see below.** 110 | 111 | ## Step 2b: Opening an existing notebook file 112 | When you launch Pluto for the second time, your recent notebooks will appear in the main menu. You can click on them to continue where you left off. 113 | 114 | If you want to run a local notebook file that you have not opened before, then you need to enter its _full path_ into the blue box in the main menu. More on finding full paths in step 3. 115 | 116 | ## Step 3: Saving a notebook 117 | We first need a folder to save our homework in. Open your file explorer and create one. 118 | 119 | Next, we need to know the _absolute path_ of that folder. Here's how you do that in [Windows](https://www.top-password.com/blog/copy-full-path-of-a-folder-file-in-windows/), [MacOS](https://www.josharcher.uk/code/find-path-to-folder-on-mac/) and [Ubuntu](). 120 | 121 | For example, you might have: 122 | 123 | - `C:\\Users\\fons\\Documents\\18S191_assignments\\` on Windows 124 | 125 | - `/Users/fons/Documents/18S191_assignments/` on MacOS 126 | 127 | - `/home/fons/Documents/18S191_assignments/` on Ubuntu 128 | 129 | Now that we know the absolute path, go back to your Pluto notebook, and at the top of the page, click on _"Save notebook..."_. 130 | 131 | ![image](https://user-images.githubusercontent.com/6933510/91444741-77fb5880-e875-11ea-8f6b-02c1c319e7f3.png) 132 | 133 | This is where you type the **new path+filename for your notebook**: 134 | 135 | ![image](https://user-images.githubusercontent.com/6933510/91444565-366aad80-e875-11ea-8ed6-1265ded78f11.png) 136 | 137 | Click _Choose_. 138 | 139 | ## Step 4: Sharing a notebook 140 | 141 | After working on your notebook (your code is autosaved when you run it), you will find your notebook file in the folder we created in step 3. This the file that you can share with others, or submit as your homework assignment to Canvas. 142 | 143 | 144 | 158 | -------------------------------------------------------------------------------- /src/assets/styles/index.css: -------------------------------------------------------------------------------- 1 | /* a minimalist set of CSS resets */ 2 | 3 | @import url("https://cdn.jsdelivr.net/npm/normalize.css@8.0.1/normalize.css"); 4 | @import url("lecture_header.css"); 5 | @import url("newdefault.css"); 6 | 7 | /* @import url('https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@0.18.0/frontend/vollkorn.css'); */ 8 | /* @import url('https://fonts.googleapis.com/css2?family=Jaldi:wght@400;700&display=swap'); */ 9 | /* @import url('https://fonts.googleapis.com/css2?family=Jaldi:wght@400;700&family=Work+Sans:ital,wght@0,400;0,500;0,600;0,700;0,800;0,900;1,400;1,500;1,600;1,700;1,800;1,900&family=Yantramanav:wght@400;500;700;900&display=swap'); */ 10 | 11 | *, 12 | *:before, 13 | *:after { 14 | box-sizing: inherit; 15 | } 16 | 17 | :root { 18 | --system-fonts: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Cantarell, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji", 19 | "Segoe UI Symbol", system-ui, sans-serif; 20 | --system-fonts-mono: Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; 21 | 22 | --fg: #000; 23 | --faded-1: #858585; 24 | --faded-2: rgb(161, 161, 161); 25 | --sidebar-accent-1: #c89393; 26 | --search-bg: hsl(78deg 10% 85%); 27 | --search-bg-accent: #f4f4f5; 28 | } 29 | 30 | @media (prefers-color-scheme: dark) { 31 | :root { 32 | --fg: #ddd; 33 | --faded-1: #b3b3b3; 34 | --faded-2: #999999; 35 | 36 | --sidebar-accent-1: #8b736a; 37 | --search-bg: #363b33; 38 | --search-bg-accent: #4d6542; 39 | } 40 | } 41 | 42 | /* adjust typography defaults */ 43 | body { 44 | margin: 0; 45 | padding: 0; 46 | /* font-family: Noto; */ 47 | /* font-family: sans-serif; */ 48 | /* font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif; */ 49 | width: 100vw; 50 | overflow-x: hidden; 51 | background: hsl(235deg 19% 16%); 52 | color: var(--pluto-output-color); 53 | 54 | /* background: url(bg.svg); */ 55 | /* background-color: hsl(231deg 14% 57%); */ 56 | /* background-size: cover; */ 57 | word-break: break-word; 58 | } 59 | 60 | .pages-markdown p, 61 | .pages-markdown ol { 62 | line-height: 1.5; 63 | } 64 | 65 | .pages-markdown h1, 66 | .pages-markdown h2 { 67 | font-weight: 800; 68 | } 69 | 70 | .pages-markdown h1, 71 | .pages-markdown h2, 72 | .pages-markdown h3, 73 | .pages-markdown h4, 74 | .pages-markdown h5, 75 | .pages-markdown h6 { 76 | color: var(--pluto-output-h-color); 77 | } 78 | 79 | pre { 80 | tab-size: 4; 81 | white-space: pre-wrap; 82 | word-break: break-word; 83 | } 84 | 85 | pre, 86 | code { 87 | font-family: var(--system-fonts-mono); 88 | } 89 | 90 | /* images and videos max out at full width */ 91 | img, 92 | video { 93 | height: auto; 94 | max-width: 100%; 95 | } 96 | 97 | a { 98 | font-weight: 500; 99 | text-decoration: none; 100 | } 101 | .pages-markdown a, 102 | .pages-markdown a:visited { 103 | color: #4674bc; 104 | } 105 | a:hover { 106 | text-decoration: underline; 107 | } 108 | h1 a, 109 | h2 a, 110 | h3 a { 111 | font-weight: inherit; 112 | } 113 | 114 | a.arrow::after { 115 | content: " →"; 116 | } 117 | card-text > a.arrow { 118 | margin-top: auto; 119 | } 120 | 121 | /* SIDEBAR LOGO */ 122 | 123 | a.pluto_home_link img { 124 | height: 1.2em; 125 | width: 1.2em; 126 | } 127 | a.pluto_home_link { 128 | font-size: 1.7em; 129 | font-weight: 800; 130 | color: inherit; 131 | padding: 0.3em; 132 | display: flex; 133 | flex-direction: row; 134 | align-items: center; 135 | gap: 0.5ch; 136 | } 137 | 138 | .sidebar-about .logos { 139 | display: flex; 140 | flex-direction: row; 141 | gap: 1em; 142 | padding: 1em; 143 | align-items: center; 144 | } 145 | 146 | .sidebar-about .logos picture { 147 | flex: 1 1 auto; 148 | min-width: 0; 149 | height: auto; 150 | object-fit: contain; 151 | } 152 | 153 | .sidebar-about .course-numbers { 154 | opacity: 0.6; 155 | } 156 | .sidebar-about .course-numbers > span { 157 | font-family: var(--system-fonts-mono); 158 | font-size: 0.9em; 159 | } 160 | .sidebar-about .course-numbers::before { 161 | /* content: " | "; */ 162 | } 163 | 164 | .semester-details, 165 | .authors { 166 | border-radius: var(--border-radius); 167 | padding: var(--child-padding); 168 | } 169 | .semester-details > a { 170 | font-weight: 700; 171 | } 172 | 173 | #pages-sidebar h1 { 174 | font-size: 1.4rem; 175 | margin-block-end: 0px; 176 | margin: 0; /* line-height: 1; */ 177 | } 178 | 179 | #pages-sidebar h2 { 180 | font-size: 1rem; 181 | font-weight: 500; 182 | font-style: italic; 183 | opacity: 0.8; 184 | margin-block-start: 0.2em; 185 | } 186 | 187 | .authors { 188 | color: var(--faded-2); 189 | } 190 | .authors { 191 | color: var(--faded-2); 192 | } 193 | #pages-sidebar .authors > a { 194 | color: var(--fg); 195 | } 196 | 197 | .search-result strong { 198 | --bg-color: #73731e94; 199 | background: var(--bg-color); 200 | outline: 0.15em solid var(--bg-color); 201 | border-radius: 0.1em; 202 | } 203 | 204 | #pages-sidebar .search-bar form { 205 | display: flex; 206 | flex-direction: row; 207 | } 208 | #pages-sidebar .search-bar input[type="search"] { 209 | flex: 1 1 auto; 210 | min-width: 0px; 211 | } 212 | 213 | a.search-result, 214 | a.search-result:visited { 215 | color: inherit; 216 | display: block; 217 | text-decoration: none; 218 | background: var(--search-bg); 219 | padding: 0.7rem; 220 | margin: 2rem 1rem 2rem 0rem; 221 | --br: 0.4em; 222 | border-radius: var(--br); 223 | position: relative; 224 | } 225 | 226 | .search-result h3 { 227 | margin-block-start: 0; 228 | } 229 | 230 | .search-result .tags { 231 | opacity: 0.6; 232 | font-family: var(--system-fonts-mono); 233 | } 234 | 235 | a.search-result::before { 236 | content: ""; 237 | display: block; 238 | position: absolute; 239 | z-index: -1; 240 | --off: -3px; 241 | top: var(--off); 242 | right: var(--off); 243 | left: var(--off); 244 | bottom: var(--off); 245 | background: var(--search-bg-accent); 246 | transform: rotate(356.9deg) translate(0px, 0px); 247 | border-radius: var(--br); 248 | } 249 | 250 | .student-feedback .card { 251 | box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2); 252 | margin: 1rem 0rem; 253 | border-radius: 0.4rem; 254 | padding: 0.2rem 1rem; 255 | } 256 | 257 | @media (prefers-color-scheme: dark) { 258 | .student-feedback .card { 259 | background: #4b4b4b; 260 | } 261 | } 262 | .student-feedback .card-container { 263 | padding: 4px 16px; 264 | } 265 | .student-feedback .card-container::after, 266 | .student-feedback .row::after { 267 | content: ""; 268 | clear: both; 269 | display: table; 270 | } 271 | .student-feedback .semester { 272 | opacity: 0.6; 273 | } 274 | .student-feedback .feedback { 275 | /* margin-top: 0.5em; */ 276 | } 277 | 278 | .student-feedback { 279 | margin-bottom: 4rem; 280 | } 281 | 282 | blockquote.twitter-tweet { 283 | margin: 0rem; 284 | } 285 | 286 | /* modify Pluto's styles to avoid a visual glitch. This will make the header always display fixed at the top. */ 287 | 288 | body:not(.asdfsdfa) pluto-editor:not(.asdffdas) header#pluto-nav { 289 | position: fixed; 290 | top: 0; 291 | left: 56px; 292 | right: 56px; 293 | z-index: 1998; 294 | width: auto; 295 | border-radius: 0 0 10px 10px; 296 | } 297 | 298 | /* Make space for the Pluto header */ 299 | body.binder:not(.offer_binder) { 300 | padding-top: 60px; 301 | } 302 | 303 | /* Another strategy: leave the header in place but make the export menu hidden when it is not opened. */ 304 | /* 305 | header.show_export aside#export { 306 | visibility: initial; 307 | } 308 | 309 | aside#export { 310 | visibility: hidden; 311 | } */ 312 | -------------------------------------------------------------------------------- /src/_includes/layout.jlhtml: -------------------------------------------------------------------------------- 1 | $(begin 2 | using MarkdownLiteral: @markdown 3 | import Pluto 4 | "The contents of `` from a Pluto HTML export." 5 | const pluto_head = let 6 | default = Pluto.generate_html(; 7 | pluto_cdn_root=Pluto.PLUTO_VERSION < v"0.19" ? "https://cdn.jsdelivr.net/gh/fonsp/Pluto.jl@9ca70c36/frontend/" : nothing) 8 | m = match(r"(.*)"s, default) 9 | reduce([ 10 | # r""s 11 | r"" 12 | r"" 13 | r"" 14 | r"" 15 | ]; init=m[1]) do s,r 16 | replace(s, r => "") 17 | end |> HTML 18 | end 19 | 20 | f(x,y) = get(page.output.frontmatter, x, y) 21 | 22 | function section_number(frontmatter) 23 | ch = get(frontmatter, "chapter", nothing) 24 | se = get(frontmatter, "section", nothing) 25 | 26 | isnothing(ch) || isnothing(se) ? nothing : "$(ch).$(se)" 27 | end 28 | 29 | hyperlink(href, description) = @htl("$(description)") 30 | 31 | function by_authors(authors) 32 | tmp = map(authors) do (; name, url) 33 | hyperlink(url, name) 34 | end 35 | "by " * join(tmp, ", ", " & ") |> HTML 36 | end 37 | 38 | nothing 39 | end) 40 | 41 | 42 | $(f("title", splitext(basename(page.input.relative_path))[1])) — Pluto.jl 43 | $(let d = f("description", nothing) 44 | if d !== nothing 45 | @htl("""""") 46 | end 47 | end) 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | $(pluto_head) 66 | 67 | 68 | 69 |
70 | 71 | 165 |
166 | $(any(contains("lecture"), f("tags", String[])) ? @htl(""" 167 |
168 |

Section $(f("chapter", "-")).$(f("section", "-"))

169 |

$( 170 | f("title", basename(page.input.relative_path)) 171 | )

172 | 173 |
174 | 175 |

Lecture Video

176 |
177 | 178 |
179 |
180 |
181 | """) : nothing) 182 | $(content) 183 |
184 |
185 | 186 | -------------------------------------------------------------------------------- /src/week0/basic_syntax.jl: -------------------------------------------------------------------------------- 1 | ### A Pluto.jl notebook ### 2 | # v0.19.14 3 | 4 | #> [frontmatter] 5 | #> chapter = 1 6 | #> section = 7 7 | #> order = 7 8 | #> title = "Basic Julia" 9 | #> layout = "layout.jlhtml" 10 | #> description = "" 11 | #> tags = ["preliminaries"] 12 | 13 | using Markdown 14 | using InteractiveUtils 15 | 16 | # ╔═╡ 0d3aec92-edeb-11ea-3adb-cd0dc17cbdab 17 | md"# Get started with Julia - live 18 | 19 | Before being able to run this notebook successfully locally, you will need to [set up Julia and Pluto.](/Spring21/installation/) 20 | " 21 | 22 | 23 | # ╔═╡ 3b038ee0-edeb-11ea-0977-97cc30d1c6ff 24 | md"## Variables 25 | 26 | We can define a variable using `=` (assignment). Then we can use its value in other expressions: 27 | " 28 | 29 | # ╔═╡ 3e8e0ea0-edeb-11ea-22e0-c58f7c2168ce 30 | x = 3 31 | 32 | 33 | # ╔═╡ 59b66862-edeb-11ea-2d62-71dcc79dbfab 34 | y = 2x 35 | 36 | # ╔═╡ 5e062a24-edeb-11ea-256a-d938f77d7815 37 | md"By default Julia displays the output of the last operation. (You can suppress the output by adding `;` (a semicolon) at the end.) 38 | " 39 | 40 | # ╔═╡ 7e46f0e8-edeb-11ea-1092-4b5e8acd9ee0 41 | md"We can ask what type a variable has using `typeof`:" 42 | 43 | # ╔═╡ 8a695b86-edeb-11ea-08cc-17263bec09df 44 | typeof(y) 45 | 46 | # ╔═╡ 8e2dd3be-edeb-11ea-0703-354fb31c12f5 47 | md"## Functions" 48 | 49 | # ╔═╡ 96b5a28c-edeb-11ea-11c0-597615962f54 50 | md"We can use a short-form, one-line function definition for simple functions:" 51 | 52 | # ╔═╡ a7453572-edeb-11ea-1e27-9f710fd856a6 53 | f(x) = 2 + x 54 | 55 | # ╔═╡ b341db4e-edeb-11ea-078b-b71ac00089d7 56 | md"Typing the function's name gives information about the function. To call it we must use parentheses:" 57 | 58 | # ╔═╡ 23f9afd4-eded-11ea-202a-9f0f1f91e5ad 59 | f 60 | 61 | # ╔═╡ cc1f6872-edeb-11ea-33e9-6976fd9b107a 62 | f(10) 63 | 64 | # ╔═╡ ce9667c2-edeb-11ea-2665-d789032abd11 65 | md"For longer functions we use the following syntax with the `function` keyword and `end`:" 66 | 67 | # ╔═╡ d73d3400-edeb-11ea-2dea-95e8c4a6563b 68 | function g(x, y) 69 | z = x + y 70 | return z^2 71 | end 72 | 73 | # ╔═╡ e04ccf10-edeb-11ea-36d1-d11969e4b2f2 74 | g(1, 2) 75 | 76 | # ╔═╡ e297c5cc-edeb-11ea-3bdd-090f415685ab 77 | md"## For loops" 78 | 79 | # ╔═╡ ec751446-edeb-11ea-31ba-2372e7c71b42 80 | md"Use `for` to loop through a pre-determined set of values:" 81 | 82 | # ╔═╡ fe3fa290-edeb-11ea-121e-7114e5c573c1 83 | let s = 0 84 | 85 | for i in 1:10 86 | s += i # Equivalent to s = s + i 87 | end 88 | 89 | s 90 | end 91 | 92 | # ╔═╡ 394b0ec8-eded-11ea-31fb-27392068ef8f 93 | md"Here, `1:10` is a **range** representing the numbers from 1 to 10:" 94 | 95 | # ╔═╡ 4dc00908-eded-11ea-25c5-0f7b2b7e18f9 96 | typeof(1:10) 97 | 98 | # ╔═╡ 6c44abb4-edec-11ea-16bd-557800b5f9d2 99 | md"Above we used a `let` block to define a new local variable `s`. 100 | But blocks of code like this are usually better inside functions, so that they can be reused. For example, we could rewrite the above as follows: 101 | " 102 | 103 | # ╔═╡ 683af3e2-eded-11ea-25a5-0d90bf099d98 104 | function mysum(n) 105 | s = 0 106 | 107 | for i in 1:n 108 | s += i 109 | end 110 | 111 | return s 112 | end 113 | 114 | # ╔═╡ 76764ea2-eded-11ea-1aa6-296f3421de1c 115 | mysum(100) 116 | 117 | # ╔═╡ 93a231f4-edec-11ea-3b39-299b3be2da78 118 | md"## Conditionals: `if`" 119 | 120 | # ╔═╡ 82e63a24-eded-11ea-3887-15d6bfabea4b 121 | md"We can evaluate whether a condition is true or not by simply writing the condition:" 122 | 123 | # ╔═╡ 9b339b2a-eded-11ea-10d7-8fc9a907c892 124 | a = 3 125 | 126 | # ╔═╡ 9535eb40-eded-11ea-1651-e33c9c23dbfb 127 | a < 5 128 | 129 | # ╔═╡ a16299a2-eded-11ea-2b56-93eb7a1010a7 130 | md"We see that conditions have a Boolean (`true` or `false`) value. 131 | 132 | We can then use `if` to control what we do based on that value:" 133 | 134 | # ╔═╡ bc6b124e-eded-11ea-0290-b3760cb81024 135 | if a < 5 136 | "small" 137 | 138 | else 139 | "big" 140 | 141 | end 142 | 143 | # ╔═╡ cfb21014-eded-11ea-1261-3bc30952a88e 144 | md"""Note that the `if` also returns the last value that was evaluated, in this case the string `"small"` or `"big"`, Since Pluto is reactive, changing the definition of `a` above will automatically cause this to be reevaluated!""" 145 | 146 | # ╔═╡ ffee7d80-eded-11ea-26b1-1331df204c67 147 | md"## Arrays" 148 | 149 | # ╔═╡ cae4137e-edee-11ea-14af-59a32227de1b 150 | md"### 1D arrays (`Vector`s)" 151 | 152 | # ╔═╡ 714f4fca-edee-11ea-3410-c9ab8825d836 153 | md"We can make a `Vector` (1-dimensional, or 1D array) using square brackets:" 154 | 155 | # ╔═╡ 82cc2a0e-edee-11ea-11b7-fbaa5ad7b556 156 | v = [1, 2, 3] 157 | 158 | # ╔═╡ 85916c18-edee-11ea-0738-5f5d78875b86 159 | typeof(v) 160 | 161 | # ╔═╡ 881b7d0c-edee-11ea-0b4a-4bd7d5be2c77 162 | md"The `1` in the type shows that this is a 1D array. 163 | 164 | We access elements also using square brackets:" 165 | 166 | # ╔═╡ a298e8ae-edee-11ea-3613-0dd4bae70c26 167 | v[2] 168 | 169 | # ╔═╡ a5ebddd6-edee-11ea-2234-55453ea59c5a 170 | v[2] = 10 171 | 172 | # ╔═╡ a9b48e54-edee-11ea-1333-a96181de0185 173 | md"Note that Pluto does not automatically update cells when you modify elements of an array, but the value does change." 174 | 175 | # ╔═╡ 68c4ead2-edef-11ea-124a-03c2d7dd6a1b 176 | md"A nice way to create `Vector`s following a certain pattern is to use an **array comprehension**:" 177 | 178 | # ╔═╡ 84129294-edef-11ea-0c77-ffa2b9592a26 179 | v2 = [i^2 for i in 1:10] 180 | 181 | # ╔═╡ d364fa16-edee-11ea-2050-0f6cb70e1bcf 182 | md"## 2D arrays (matrices)" 183 | 184 | # ╔═╡ db99ae9a-edee-11ea-393e-9de420a545a1 185 | md"We can make small matrices (2D arrays) with square brackets too:" 186 | 187 | # ╔═╡ 04f175f2-edef-11ea-0882-712548ebb7a3 188 | M = [1 2 189 | 3 4] 190 | 191 | # ╔═╡ 0a8ac112-edef-11ea-1e99-cf7c7808c4f5 192 | typeof(M) 193 | 194 | # ╔═╡ 1295f48a-edef-11ea-22a5-61e8a2e1d005 195 | md"The `2` in the type confirms that this is a 2D array." 196 | 197 | # ╔═╡ 3e1fdaa8-edef-11ea-2f03-eb41b2b9ea0f 198 | md"This won't work for larger matrices, though. For that we can use e.g." 199 | 200 | # ╔═╡ 48f3deca-edef-11ea-2c18-e7419c9030a0 201 | zeros(5, 5) 202 | 203 | # ╔═╡ a8f26af8-edef-11ea-2fc7-2b776f515aea 204 | md"Note that `zeros` gives `Float64`s by default. We can also specify a type for the elements:" 205 | 206 | # ╔═╡ b595373e-edef-11ea-03e2-6599ef14af20 207 | zeros(Int, 4, 5) 208 | 209 | # ╔═╡ 4cb33c04-edef-11ea-2b35-1139c246c331 210 | md"We can then fill in the values we want by manipulating the elements, e.g. with a `for` loop." 211 | 212 | # ╔═╡ 54e47e9e-edef-11ea-2d75-b5f550902528 213 | md"A nice alternative syntax to create matrices following a certain pattern is an array comprehension with a *double* `for` loop:" 214 | 215 | # ╔═╡ 6348edce-edef-11ea-1ab4-019514eb414f 216 | [i + j for i in 1:5, j in 1:6] 217 | 218 | # ╔═╡ Cell order: 219 | # ╟─0d3aec92-edeb-11ea-3adb-cd0dc17cbdab 220 | # ╟─3b038ee0-edeb-11ea-0977-97cc30d1c6ff 221 | # ╠═3e8e0ea0-edeb-11ea-22e0-c58f7c2168ce 222 | # ╠═59b66862-edeb-11ea-2d62-71dcc79dbfab 223 | # ╟─5e062a24-edeb-11ea-256a-d938f77d7815 224 | # ╟─7e46f0e8-edeb-11ea-1092-4b5e8acd9ee0 225 | # ╠═8a695b86-edeb-11ea-08cc-17263bec09df 226 | # ╟─8e2dd3be-edeb-11ea-0703-354fb31c12f5 227 | # ╟─96b5a28c-edeb-11ea-11c0-597615962f54 228 | # ╠═a7453572-edeb-11ea-1e27-9f710fd856a6 229 | # ╟─b341db4e-edeb-11ea-078b-b71ac00089d7 230 | # ╠═23f9afd4-eded-11ea-202a-9f0f1f91e5ad 231 | # ╠═cc1f6872-edeb-11ea-33e9-6976fd9b107a 232 | # ╟─ce9667c2-edeb-11ea-2665-d789032abd11 233 | # ╠═d73d3400-edeb-11ea-2dea-95e8c4a6563b 234 | # ╠═e04ccf10-edeb-11ea-36d1-d11969e4b2f2 235 | # ╟─e297c5cc-edeb-11ea-3bdd-090f415685ab 236 | # ╟─ec751446-edeb-11ea-31ba-2372e7c71b42 237 | # ╠═fe3fa290-edeb-11ea-121e-7114e5c573c1 238 | # ╟─394b0ec8-eded-11ea-31fb-27392068ef8f 239 | # ╠═4dc00908-eded-11ea-25c5-0f7b2b7e18f9 240 | # ╟─6c44abb4-edec-11ea-16bd-557800b5f9d2 241 | # ╠═683af3e2-eded-11ea-25a5-0d90bf099d98 242 | # ╠═76764ea2-eded-11ea-1aa6-296f3421de1c 243 | # ╟─93a231f4-edec-11ea-3b39-299b3be2da78 244 | # ╟─82e63a24-eded-11ea-3887-15d6bfabea4b 245 | # ╠═9b339b2a-eded-11ea-10d7-8fc9a907c892 246 | # ╠═9535eb40-eded-11ea-1651-e33c9c23dbfb 247 | # ╟─a16299a2-eded-11ea-2b56-93eb7a1010a7 248 | # ╠═bc6b124e-eded-11ea-0290-b3760cb81024 249 | # ╟─cfb21014-eded-11ea-1261-3bc30952a88e 250 | # ╟─ffee7d80-eded-11ea-26b1-1331df204c67 251 | # ╟─cae4137e-edee-11ea-14af-59a32227de1b 252 | # ╟─714f4fca-edee-11ea-3410-c9ab8825d836 253 | # ╠═82cc2a0e-edee-11ea-11b7-fbaa5ad7b556 254 | # ╠═85916c18-edee-11ea-0738-5f5d78875b86 255 | # ╟─881b7d0c-edee-11ea-0b4a-4bd7d5be2c77 256 | # ╠═a298e8ae-edee-11ea-3613-0dd4bae70c26 257 | # ╠═a5ebddd6-edee-11ea-2234-55453ea59c5a 258 | # ╟─a9b48e54-edee-11ea-1333-a96181de0185 259 | # ╟─68c4ead2-edef-11ea-124a-03c2d7dd6a1b 260 | # ╠═84129294-edef-11ea-0c77-ffa2b9592a26 261 | # ╟─d364fa16-edee-11ea-2050-0f6cb70e1bcf 262 | # ╟─db99ae9a-edee-11ea-393e-9de420a545a1 263 | # ╠═04f175f2-edef-11ea-0882-712548ebb7a3 264 | # ╠═0a8ac112-edef-11ea-1e99-cf7c7808c4f5 265 | # ╟─1295f48a-edef-11ea-22a5-61e8a2e1d005 266 | # ╟─3e1fdaa8-edef-11ea-2f03-eb41b2b9ea0f 267 | # ╠═48f3deca-edef-11ea-2c18-e7419c9030a0 268 | # ╟─a8f26af8-edef-11ea-2fc7-2b776f515aea 269 | # ╠═b595373e-edef-11ea-03e2-6599ef14af20 270 | # ╟─4cb33c04-edef-11ea-2b35-1139c246c331 271 | # ╟─54e47e9e-edef-11ea-2d75-b5f550902528 272 | # ╠═6348edce-edef-11ea-1ab4-019514eb414f 273 | -------------------------------------------------------------------------------- /src/assets/tinbergen-institute-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /src/assets/tinbergen-institute-logo-white.svg: -------------------------------------------------------------------------------- 1 | 2 | 16 | 18 | 36 | 42 | 43 | -------------------------------------------------------------------------------- /src/assets/zoom_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 239 | 240 | -------------------------------------------------------------------------------- /pluto-deployment-environment/Manifest.toml: -------------------------------------------------------------------------------- 1 | # This file is machine-generated - editing it directly is not advised 2 | 3 | julia_version = "1.10.5" 4 | manifest_format = "2.0" 5 | project_hash = "f95ded62b2d893d182f263dd98b9e7e215472110" 6 | 7 | [[deps.AbstractPlutoDingetjes]] 8 | deps = ["Pkg"] 9 | git-tree-sha1 = "6e1d2a35f2f90a4bc7c2ed98079b2ba09c35b83a" 10 | uuid = "6e696c72-6542-2067-7265-42206c756150" 11 | version = "1.3.2" 12 | 13 | [[deps.AbstractTrees]] 14 | git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" 15 | uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" 16 | version = "0.4.5" 17 | 18 | [[deps.Accessors]] 19 | deps = ["CompositionsBase", "ConstructionBase", "InverseFunctions", "LinearAlgebra", "MacroTools", "Markdown"] 20 | git-tree-sha1 = "b392ede862e506d451fc1616e79aa6f4c673dab8" 21 | uuid = "7d9f7c33-5ae7-4f3b-8dc6-eff91059b697" 22 | version = "0.1.38" 23 | 24 | [deps.Accessors.extensions] 25 | AccessorsAxisKeysExt = "AxisKeys" 26 | AccessorsDatesExt = "Dates" 27 | AccessorsIntervalSetsExt = "IntervalSets" 28 | AccessorsStaticArraysExt = "StaticArrays" 29 | AccessorsStructArraysExt = "StructArrays" 30 | AccessorsTestExt = "Test" 31 | AccessorsUnitfulExt = "Unitful" 32 | 33 | [deps.Accessors.weakdeps] 34 | AxisKeys = "94b1ba4f-4ee9-5380-92f1-94cde586c3c5" 35 | Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" 36 | IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" 37 | Requires = "ae029012-a4dd-5104-9daa-d747884805df" 38 | StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" 39 | StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" 40 | Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 41 | Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" 42 | 43 | [[deps.Adapt]] 44 | deps = ["LinearAlgebra", "Requires"] 45 | git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" 46 | uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" 47 | version = "4.0.4" 48 | 49 | [deps.Adapt.extensions] 50 | AdaptStaticArraysExt = "StaticArrays" 51 | 52 | [deps.Adapt.weakdeps] 53 | StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" 54 | 55 | [[deps.ArgCheck]] 56 | git-tree-sha1 = "a3a402a35a2f7e0b87828ccabbd5ebfbebe356b4" 57 | uuid = "dce04be8-c92d-5529-be00-80e4d2c0e197" 58 | version = "2.3.0" 59 | 60 | [[deps.ArgTools]] 61 | uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" 62 | version = "1.1.1" 63 | 64 | [[deps.Artifacts]] 65 | uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" 66 | 67 | [[deps.BangBang]] 68 | deps = ["Accessors", "ConstructionBase", "InitialValues", "LinearAlgebra", "Requires"] 69 | git-tree-sha1 = "e2144b631226d9eeab2d746ca8880b7ccff504ae" 70 | uuid = "198e06fe-97b7-11e9-32a5-e1d131e6ad66" 71 | version = "0.4.3" 72 | 73 | [deps.BangBang.extensions] 74 | BangBangChainRulesCoreExt = "ChainRulesCore" 75 | BangBangDataFramesExt = "DataFrames" 76 | BangBangStaticArraysExt = "StaticArrays" 77 | BangBangStructArraysExt = "StructArrays" 78 | BangBangTablesExt = "Tables" 79 | BangBangTypedTablesExt = "TypedTables" 80 | 81 | [deps.BangBang.weakdeps] 82 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 83 | DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" 84 | StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" 85 | StructArrays = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" 86 | Tables = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" 87 | TypedTables = "9d95f2ec-7b3d-5a63-8d20-e2491e220bb9" 88 | 89 | [[deps.Base64]] 90 | uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" 91 | 92 | [[deps.Baselet]] 93 | git-tree-sha1 = "aebf55e6d7795e02ca500a689d326ac979aaf89e" 94 | uuid = "9718e550-a3fa-408a-8086-8db961cd8217" 95 | version = "0.1.1" 96 | 97 | [[deps.BetterFileWatching]] 98 | deps = ["Deno_jll", "JSON"] 99 | git-tree-sha1 = "0d7ee0a1acad90d544fa87cc3d6f463e99abb77a" 100 | uuid = "c9fd44ac-77b5-486c-9482-9798bd063cc6" 101 | version = "0.1.5" 102 | 103 | [[deps.BitFlags]] 104 | git-tree-sha1 = "0691e34b3bb8be9307330f88d1a3c3f25466c24d" 105 | uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" 106 | version = "0.1.9" 107 | 108 | [[deps.CodeTracking]] 109 | deps = ["InteractiveUtils", "UUIDs"] 110 | git-tree-sha1 = "7eee164f122511d3e4e1ebadb7956939ea7e1c77" 111 | uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" 112 | version = "1.3.6" 113 | 114 | [[deps.CodecZlib]] 115 | deps = ["TranscodingStreams", "Zlib_jll"] 116 | git-tree-sha1 = "bce6804e5e6044c6daab27bb533d1295e4a2e759" 117 | uuid = "944b1d66-785c-5afd-91f1-9de20f533193" 118 | version = "0.7.6" 119 | 120 | [[deps.ColorTypes]] 121 | deps = ["FixedPointNumbers", "Random"] 122 | git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" 123 | uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" 124 | version = "0.11.5" 125 | 126 | [[deps.CommonMark]] 127 | deps = ["Crayons", "JSON", "PrecompileTools", "URIs"] 128 | git-tree-sha1 = "294d62bdb4e1809302f8927abdd0b19464147fb1" 129 | uuid = "a80b9123-70ca-4bc0-993e-6e3bcb318db6" 130 | version = "0.8.13" 131 | 132 | [[deps.CompilerSupportLibraries_jll]] 133 | deps = ["Artifacts", "Libdl"] 134 | uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" 135 | version = "1.1.1+0" 136 | 137 | [[deps.CompositionsBase]] 138 | git-tree-sha1 = "802bb88cd69dfd1509f6670416bd4434015693ad" 139 | uuid = "a33af91c-f02d-484b-be07-31d278c5ca2b" 140 | version = "0.1.2" 141 | weakdeps = ["InverseFunctions"] 142 | 143 | [deps.CompositionsBase.extensions] 144 | CompositionsBaseInverseFunctionsExt = "InverseFunctions" 145 | 146 | [[deps.ConcurrentUtilities]] 147 | deps = ["Serialization", "Sockets"] 148 | git-tree-sha1 = "ea32b83ca4fefa1768dc84e504cc0a94fb1ab8d1" 149 | uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" 150 | version = "2.4.2" 151 | 152 | [[deps.Configurations]] 153 | deps = ["ExproniconLite", "OrderedCollections", "TOML"] 154 | git-tree-sha1 = "4358750bb58a3caefd5f37a4a0c5bfdbbf075252" 155 | uuid = "5218b696-f38b-4ac9-8b61-a12ec717816d" 156 | version = "0.17.6" 157 | 158 | [[deps.ConstructionBase]] 159 | git-tree-sha1 = "76219f1ed5771adbb096743bff43fb5fdd4c1157" 160 | uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" 161 | version = "1.5.8" 162 | 163 | [deps.ConstructionBase.extensions] 164 | ConstructionBaseIntervalSetsExt = "IntervalSets" 165 | ConstructionBaseLinearAlgebraExt = "LinearAlgebra" 166 | ConstructionBaseStaticArraysExt = "StaticArrays" 167 | 168 | [deps.ConstructionBase.weakdeps] 169 | IntervalSets = "8197267c-284f-5f27-9208-e0e47529a953" 170 | LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 171 | StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" 172 | 173 | [[deps.Crayons]] 174 | git-tree-sha1 = "249fe38abf76d48563e2f4556bebd215aa317e15" 175 | uuid = "a8cc5b0e-0ffa-5ad4-8c14-923d3ee1735f" 176 | version = "4.1.1" 177 | 178 | [[deps.DataAPI]] 179 | git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" 180 | uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" 181 | version = "1.16.0" 182 | 183 | [[deps.DataValueInterfaces]] 184 | git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" 185 | uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" 186 | version = "1.0.0" 187 | 188 | [[deps.Dates]] 189 | deps = ["Printf"] 190 | uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" 191 | 192 | [[deps.DefineSingletons]] 193 | git-tree-sha1 = "0fba8b706d0178b4dc7fd44a96a92382c9065c2c" 194 | uuid = "244e2a9f-e319-4986-a169-4d1fe445cd52" 195 | version = "0.1.2" 196 | 197 | [[deps.Deno_jll]] 198 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 199 | git-tree-sha1 = "cd6756e833c377e0ce9cd63fb97689a255f12323" 200 | uuid = "04572ae6-984a-583e-9378-9577a1c2574d" 201 | version = "1.33.4+0" 202 | 203 | [[deps.Distributed]] 204 | deps = ["Random", "Serialization", "Sockets"] 205 | uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" 206 | 207 | [[deps.Downloads]] 208 | deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] 209 | uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" 210 | version = "1.6.0" 211 | 212 | [[deps.ExceptionUnwrapping]] 213 | deps = ["Test"] 214 | git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" 215 | uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" 216 | version = "0.1.10" 217 | 218 | [[deps.Expat_jll]] 219 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 220 | git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" 221 | uuid = "2e619515-83b5-522b-bb60-26c02a35a201" 222 | version = "2.6.2+0" 223 | 224 | [[deps.ExpressionExplorer]] 225 | git-tree-sha1 = "0889fdf7ac69b67b65f54b763941967e0a08b7b3" 226 | uuid = "21656369-7473-754a-2065-74616d696c43" 227 | version = "1.0.4" 228 | 229 | [[deps.ExproniconLite]] 230 | git-tree-sha1 = "4c9ed87a6b3cd90acf24c556f2119533435ded38" 231 | uuid = "55351af7-c7e9-48d6-89ff-24e801d99491" 232 | version = "0.10.13" 233 | 234 | [[deps.FileWatching]] 235 | uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" 236 | 237 | [[deps.FixedPointNumbers]] 238 | deps = ["Statistics"] 239 | git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" 240 | uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" 241 | version = "0.8.5" 242 | 243 | [[deps.FromFile]] 244 | deps = ["Downloads", "Requires"] 245 | git-tree-sha1 = "5df4ca248bed8c35164d6a7ae006073bbf8289ff" 246 | uuid = "ff7dd447-1dcb-4ce3-b8ac-22a812192de7" 247 | version = "0.1.5" 248 | 249 | [[deps.Future]] 250 | deps = ["Random"] 251 | uuid = "9fa8497b-333b-5362-9e8d-4d0656e87820" 252 | 253 | [[deps.FuzzyCompletions]] 254 | deps = ["REPL"] 255 | git-tree-sha1 = "40ec72c57559a4473961bbcd12c96bcd4c2aaab4" 256 | uuid = "fb4132e2-a121-4a70-b8a1-d5b831dcdcc2" 257 | version = "0.5.4" 258 | 259 | [[deps.Git]] 260 | deps = ["Git_jll"] 261 | git-tree-sha1 = "04eff47b1354d702c3a85e8ab23d539bb7d5957e" 262 | uuid = "d7ba0133-e1db-5d97-8f8c-041e4b3a1eb2" 263 | version = "1.3.1" 264 | 265 | [[deps.GitHubActions]] 266 | deps = ["JSON", "Logging"] 267 | git-tree-sha1 = "8750718611144f23584ca265d899baa1bf1a4531" 268 | uuid = "6b79fd1a-b13a-48ab-b6b0-aaee1fee41df" 269 | version = "0.1.7" 270 | 271 | [[deps.Git_jll]] 272 | deps = ["Artifacts", "Expat_jll", "JLLWrappers", "LibCURL_jll", "Libdl", "Libiconv_jll", "OpenSSL_jll", "PCRE2_jll", "Zlib_jll"] 273 | git-tree-sha1 = "ea372033d09e4552a04fd38361cd019f9003f4f4" 274 | uuid = "f8c6e375-362e-5223-8a59-34ff63f689eb" 275 | version = "2.46.2+0" 276 | 277 | [[deps.Glob]] 278 | git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" 279 | uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" 280 | version = "1.3.1" 281 | 282 | [[deps.Gumbo]] 283 | deps = ["AbstractTrees", "Gumbo_jll", "Libdl"] 284 | git-tree-sha1 = "a1a138dfbf9df5bace489c7a9d5196d6afdfa140" 285 | uuid = "708ec375-b3d6-5a57-a7ce-8257bf98657a" 286 | version = "0.8.2" 287 | 288 | [[deps.Gumbo_jll]] 289 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 290 | git-tree-sha1 = "29070dee9df18d9565276d68a596854b1764aa38" 291 | uuid = "528830af-5a63-567c-a44a-034ed33b8444" 292 | version = "0.10.2+0" 293 | 294 | [[deps.HTTP]] 295 | deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] 296 | git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed" 297 | uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" 298 | version = "1.10.8" 299 | 300 | [[deps.Hyperscript]] 301 | deps = ["Test"] 302 | git-tree-sha1 = "179267cfa5e712760cd43dcae385d7ea90cc25a4" 303 | uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" 304 | version = "0.0.5" 305 | 306 | [[deps.HypertextLiteral]] 307 | deps = ["Tricks"] 308 | git-tree-sha1 = "7134810b1afce04bbc1045ca1985fbe81ce17653" 309 | uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" 310 | version = "0.9.5" 311 | 312 | [[deps.IOCapture]] 313 | deps = ["Logging", "Random"] 314 | git-tree-sha1 = "b6d6bfdd7ce25b0f9b2f6b3dd56b2673a66c8770" 315 | uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" 316 | version = "0.2.5" 317 | 318 | [[deps.InitialValues]] 319 | git-tree-sha1 = "4da0f88e9a39111c2fa3add390ab15f3a44f3ca3" 320 | uuid = "22cec73e-a1b8-11e9-2c92-598750a2cf9c" 321 | version = "0.3.1" 322 | 323 | [[deps.InteractiveUtils]] 324 | deps = ["Markdown"] 325 | uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" 326 | 327 | [[deps.InverseFunctions]] 328 | git-tree-sha1 = "a779299d77cd080bf77b97535acecd73e1c5e5cb" 329 | uuid = "3587e190-3f89-42d0-90ee-14403ec27112" 330 | version = "0.1.17" 331 | weakdeps = ["Dates", "Test"] 332 | 333 | [deps.InverseFunctions.extensions] 334 | InverseFunctionsDatesExt = "Dates" 335 | InverseFunctionsTestExt = "Test" 336 | 337 | [[deps.IteratorInterfaceExtensions]] 338 | git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" 339 | uuid = "82899510-4779-5014-852e-03e436cf321d" 340 | version = "1.0.0" 341 | 342 | [[deps.JLLWrappers]] 343 | deps = ["Artifacts", "Preferences"] 344 | git-tree-sha1 = "f389674c99bfcde17dc57454011aa44d5a260a40" 345 | uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" 346 | version = "1.6.0" 347 | 348 | [[deps.JSON]] 349 | deps = ["Dates", "Mmap", "Parsers", "Unicode"] 350 | git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" 351 | uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" 352 | version = "0.21.4" 353 | 354 | [[deps.JuliaInterpreter]] 355 | deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] 356 | git-tree-sha1 = "2984284a8abcfcc4784d95a9e2ea4e352dd8ede7" 357 | uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" 358 | version = "0.9.36" 359 | 360 | [[deps.LazilyInitializedFields]] 361 | git-tree-sha1 = "8f7f3cabab0fd1800699663533b6d5cb3fc0e612" 362 | uuid = "0e77f7df-68c5-4e49-93ce-4cd80f5598bf" 363 | version = "1.2.2" 364 | 365 | [[deps.LeftChildRightSiblingTrees]] 366 | deps = ["AbstractTrees"] 367 | git-tree-sha1 = "fb6803dafae4a5d62ea5cab204b1e657d9737e7f" 368 | uuid = "1d6d02ad-be62-4b6b-8a6d-2f90e265016e" 369 | version = "0.2.0" 370 | 371 | [[deps.LibCURL]] 372 | deps = ["LibCURL_jll", "MozillaCACerts_jll"] 373 | uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" 374 | version = "0.6.4" 375 | 376 | [[deps.LibCURL_jll]] 377 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] 378 | uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" 379 | version = "8.4.0+0" 380 | 381 | [[deps.LibGit2]] 382 | deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] 383 | uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" 384 | 385 | [[deps.LibGit2_jll]] 386 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] 387 | uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" 388 | version = "1.6.4+0" 389 | 390 | [[deps.LibSSH2_jll]] 391 | deps = ["Artifacts", "Libdl", "MbedTLS_jll"] 392 | uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" 393 | version = "1.11.0+1" 394 | 395 | [[deps.Libdl]] 396 | uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" 397 | 398 | [[deps.Libiconv_jll]] 399 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 400 | git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" 401 | uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" 402 | version = "1.17.0+0" 403 | 404 | [[deps.LinearAlgebra]] 405 | deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] 406 | uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 407 | 408 | [[deps.LiveServer]] 409 | deps = ["HTTP", "LoggingExtras", "MIMEs", "Pkg", "Sockets", "Test"] 410 | git-tree-sha1 = "1e46b873b8ef176e23ee43f96e72cd45c20bafb4" 411 | uuid = "16fef848-5104-11e9-1b77-fb7a48bbb589" 412 | version = "1.3.1" 413 | 414 | [[deps.Logging]] 415 | uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" 416 | 417 | [[deps.LoggingExtras]] 418 | deps = ["Dates", "Logging"] 419 | git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" 420 | uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" 421 | version = "1.0.3" 422 | 423 | [[deps.LoweredCodeUtils]] 424 | deps = ["JuliaInterpreter"] 425 | git-tree-sha1 = "c2b5e92eaf5101404a58ce9c6083d595472361d6" 426 | uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" 427 | version = "3.0.2" 428 | 429 | [[deps.MIMEs]] 430 | git-tree-sha1 = "65f28ad4b594aebe22157d6fac869786a255b7eb" 431 | uuid = "6c6e2e6c-3030-632d-7369-2d6c69616d65" 432 | version = "0.1.4" 433 | 434 | [[deps.MacroTools]] 435 | deps = ["Markdown", "Random"] 436 | git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" 437 | uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" 438 | version = "0.5.13" 439 | 440 | [[deps.Malt]] 441 | deps = ["Distributed", "Logging", "RelocatableFolders", "Serialization", "Sockets"] 442 | git-tree-sha1 = "18cf4151e390fce29ca846b92b06baf9bc6e002e" 443 | uuid = "36869731-bdee-424d-aa32-cab38c994e3b" 444 | version = "1.1.1" 445 | 446 | [[deps.Markdown]] 447 | deps = ["Base64"] 448 | uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" 449 | 450 | [[deps.MarkdownLiteral]] 451 | deps = ["CommonMark", "HypertextLiteral"] 452 | git-tree-sha1 = "0d3fa2dd374934b62ee16a4721fe68c418b92899" 453 | uuid = "736d6165-7244-6769-4267-6b50796e6954" 454 | version = "0.1.1" 455 | 456 | [[deps.MbedTLS]] 457 | deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] 458 | git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" 459 | uuid = "739be429-bea8-5141-9913-cc70e7f3736d" 460 | version = "1.1.9" 461 | 462 | [[deps.MbedTLS_jll]] 463 | deps = ["Artifacts", "Libdl"] 464 | uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" 465 | version = "2.28.2+1" 466 | 467 | [[deps.MicroCollections]] 468 | deps = ["Accessors", "BangBang", "InitialValues"] 469 | git-tree-sha1 = "44d32db644e84c75dab479f1bc15ee76a1a3618f" 470 | uuid = "128add7d-3638-4c79-886c-908ea0c25c34" 471 | version = "0.2.0" 472 | 473 | [[deps.Mmap]] 474 | uuid = "a63ad114-7e13-5084-954f-fe012c677804" 475 | 476 | [[deps.MozillaCACerts_jll]] 477 | uuid = "14a3606d-f60d-562e-9121-12d972cd8159" 478 | version = "2023.1.10" 479 | 480 | [[deps.MsgPack]] 481 | deps = ["Serialization"] 482 | git-tree-sha1 = "f5db02ae992c260e4826fe78c942954b48e1d9c2" 483 | uuid = "99f44e22-a591-53d1-9472-aa23ef4bd671" 484 | version = "1.2.1" 485 | 486 | [[deps.NetworkOptions]] 487 | uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" 488 | version = "1.2.0" 489 | 490 | [[deps.OpenBLAS_jll]] 491 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] 492 | uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" 493 | version = "0.3.23+4" 494 | 495 | [[deps.OpenSSL]] 496 | deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] 497 | git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" 498 | uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" 499 | version = "1.4.3" 500 | 501 | [[deps.OpenSSL_jll]] 502 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 503 | git-tree-sha1 = "7493f61f55a6cce7325f197443aa80d32554ba10" 504 | uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" 505 | version = "3.0.15+1" 506 | 507 | [[deps.OrderedCollections]] 508 | git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" 509 | uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" 510 | version = "1.6.3" 511 | 512 | [[deps.PCRE2_jll]] 513 | deps = ["Artifacts", "Libdl"] 514 | uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" 515 | version = "10.42.0+1" 516 | 517 | [[deps.Parsers]] 518 | deps = ["Dates", "PrecompileTools", "UUIDs"] 519 | git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" 520 | uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" 521 | version = "2.8.1" 522 | 523 | [[deps.Pkg]] 524 | deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] 525 | uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 526 | version = "1.10.0" 527 | 528 | [[deps.Pluto]] 529 | deps = ["Base64", "Configurations", "Dates", "Downloads", "ExpressionExplorer", "FileWatching", "FuzzyCompletions", "HTTP", "HypertextLiteral", "InteractiveUtils", "Logging", "LoggingExtras", "MIMEs", "Malt", "Markdown", "MsgPack", "Pkg", "PlutoDependencyExplorer", "PrecompileSignatures", "PrecompileTools", "REPL", "RegistryInstances", "RelocatableFolders", "Scratch", "Sockets", "TOML", "Tables", "URIs", "UUIDs"] 530 | git-tree-sha1 = "73a74a03ac427363c4764f956f34b75e93f71514" 531 | uuid = "c3e4b0f8-55cb-11ea-2926-15256bba5781" 532 | version = "0.19.46" 533 | 534 | [[deps.PlutoDependencyExplorer]] 535 | deps = ["ExpressionExplorer", "InteractiveUtils", "Markdown"] 536 | git-tree-sha1 = "4bc5284f77d731196d3e97f23abb732ad6f2a6e4" 537 | uuid = "72656b73-756c-7461-726b-72656b6b696b" 538 | version = "1.0.4" 539 | 540 | [[deps.PlutoHooks]] 541 | deps = ["InteractiveUtils", "Markdown", "UUIDs"] 542 | git-tree-sha1 = "072cdf20c9b0507fdd977d7d246d90030609674b" 543 | uuid = "0ff47ea0-7a50-410d-8455-4348d5de0774" 544 | version = "0.0.5" 545 | 546 | [[deps.PlutoLinks]] 547 | deps = ["FileWatching", "InteractiveUtils", "Markdown", "PlutoHooks", "Revise", "UUIDs"] 548 | git-tree-sha1 = "8f5fa7056e6dcfb23ac5211de38e6c03f6367794" 549 | uuid = "0ff47ea0-7a50-410d-8455-4348d5de0420" 550 | version = "0.1.6" 551 | 552 | [[deps.PlutoPages]] 553 | deps = ["BetterFileWatching", "CommonMark", "Gumbo", "HypertextLiteral", "InteractiveUtils", "JSON", "LiveServer", "Logging", "Malt", "Markdown", "MarkdownLiteral", "Pkg", "Pluto", "PlutoHooks", "PlutoLinks", "PlutoSliderServer", "PlutoUI", "ProgressLogging", "RelocatableFolders", "SHA", "ThreadsX", "Unicode", "YAML"] 554 | git-tree-sha1 = "5fa183fe8d8b7beaf910f30bea5eb356b8b16b8d" 555 | uuid = "d5dc3dd1-4774-47c7-8860-0a1ad9e34b8c" 556 | version = "0.1.6" 557 | 558 | [[deps.PlutoSliderServer]] 559 | deps = ["AbstractPlutoDingetjes", "Base64", "BetterFileWatching", "Configurations", "Distributed", "FromFile", "Git", "GitHubActions", "Glob", "HTTP", "JSON", "Logging", "Pkg", "Pluto", "SHA", "Sockets", "TOML", "TerminalLoggers", "UUIDs"] 560 | git-tree-sha1 = "96f804d8963e33862f23ce67d42e9ae9fd2df04f" 561 | uuid = "2fc8631c-6f24-4c5b-bca7-cbb509c42db4" 562 | version = "0.3.31" 563 | 564 | [[deps.PlutoUI]] 565 | deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "FixedPointNumbers", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "MIMEs", "Markdown", "Random", "Reexport", "URIs", "UUIDs"] 566 | git-tree-sha1 = "eba4810d5e6a01f612b948c9fa94f905b49087b0" 567 | uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" 568 | version = "0.7.60" 569 | 570 | [[deps.PrecompileSignatures]] 571 | git-tree-sha1 = "18ef344185f25ee9d51d80e179f8dad33dc48eb1" 572 | uuid = "91cefc8d-f054-46dc-8f8c-26e11d7c5411" 573 | version = "3.0.3" 574 | 575 | [[deps.PrecompileTools]] 576 | deps = ["Preferences"] 577 | git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" 578 | uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" 579 | version = "1.2.1" 580 | 581 | [[deps.Preferences]] 582 | deps = ["TOML"] 583 | git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" 584 | uuid = "21216c6a-2e73-6563-6e65-726566657250" 585 | version = "1.4.3" 586 | 587 | [[deps.Printf]] 588 | deps = ["Unicode"] 589 | uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" 590 | 591 | [[deps.ProgressLogging]] 592 | deps = ["Logging", "SHA", "UUIDs"] 593 | git-tree-sha1 = "80d919dee55b9c50e8d9e2da5eeafff3fe58b539" 594 | uuid = "33c8b6b6-d38a-422a-b730-caa89a2f386c" 595 | version = "0.1.4" 596 | 597 | [[deps.REPL]] 598 | deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] 599 | uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" 600 | 601 | [[deps.Random]] 602 | deps = ["SHA"] 603 | uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 604 | 605 | [[deps.Reexport]] 606 | git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" 607 | uuid = "189a3867-3050-52da-a836-e630ba90ab69" 608 | version = "1.2.2" 609 | 610 | [[deps.Referenceables]] 611 | deps = ["Adapt"] 612 | git-tree-sha1 = "02d31ad62838181c1a3a5fd23a1ce5914a643601" 613 | uuid = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" 614 | version = "0.1.3" 615 | 616 | [[deps.RegistryInstances]] 617 | deps = ["LazilyInitializedFields", "Pkg", "TOML", "Tar"] 618 | git-tree-sha1 = "ffd19052caf598b8653b99404058fce14828be51" 619 | uuid = "2792f1a3-b283-48e8-9a74-f99dce5104f3" 620 | version = "0.1.0" 621 | 622 | [[deps.RelocatableFolders]] 623 | deps = ["SHA", "Scratch"] 624 | git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" 625 | uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" 626 | version = "1.0.1" 627 | 628 | [[deps.Requires]] 629 | deps = ["UUIDs"] 630 | git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" 631 | uuid = "ae029012-a4dd-5104-9daa-d747884805df" 632 | version = "1.3.0" 633 | 634 | [[deps.Revise]] 635 | deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "REPL", "Requires", "UUIDs", "Unicode"] 636 | git-tree-sha1 = "0a20a01fbb3a9531f3325a94b6dcf95c404a1658" 637 | uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" 638 | version = "3.6.0" 639 | 640 | [[deps.SHA]] 641 | uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" 642 | version = "0.7.0" 643 | 644 | [[deps.Scratch]] 645 | deps = ["Dates"] 646 | git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" 647 | uuid = "6c6a2e73-6563-6170-7368-637461726353" 648 | version = "1.2.1" 649 | 650 | [[deps.Serialization]] 651 | uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" 652 | 653 | [[deps.Setfield]] 654 | deps = ["ConstructionBase", "Future", "MacroTools", "StaticArraysCore"] 655 | git-tree-sha1 = "e2cc6d8c88613c05e1defb55170bf5ff211fbeac" 656 | uuid = "efcf1570-3423-57d1-acb7-fd33fddbac46" 657 | version = "1.1.1" 658 | 659 | [[deps.SimpleBufferStream]] 660 | git-tree-sha1 = "f305871d2f381d21527c770d4788c06c097c9bc1" 661 | uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" 662 | version = "1.2.0" 663 | 664 | [[deps.Sockets]] 665 | uuid = "6462fe0b-24de-5631-8697-dd941f90decc" 666 | 667 | [[deps.SparseArrays]] 668 | deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] 669 | uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 670 | version = "1.10.0" 671 | 672 | [[deps.SplittablesBase]] 673 | deps = ["Setfield", "Test"] 674 | git-tree-sha1 = "e08a62abc517eb79667d0a29dc08a3b589516bb5" 675 | uuid = "171d559e-b47b-412a-8079-5efa626c420e" 676 | version = "0.1.15" 677 | 678 | [[deps.StaticArraysCore]] 679 | git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" 680 | uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" 681 | version = "1.4.3" 682 | 683 | [[deps.Statistics]] 684 | deps = ["LinearAlgebra", "SparseArrays"] 685 | uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" 686 | version = "1.10.0" 687 | 688 | [[deps.StringEncodings]] 689 | deps = ["Libiconv_jll"] 690 | git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" 691 | uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" 692 | version = "0.3.7" 693 | 694 | [[deps.SuiteSparse_jll]] 695 | deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] 696 | uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" 697 | version = "7.2.1+1" 698 | 699 | [[deps.TOML]] 700 | deps = ["Dates"] 701 | uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" 702 | version = "1.0.3" 703 | 704 | [[deps.TableTraits]] 705 | deps = ["IteratorInterfaceExtensions"] 706 | git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" 707 | uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" 708 | version = "1.0.1" 709 | 710 | [[deps.Tables]] 711 | deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "OrderedCollections", "TableTraits"] 712 | git-tree-sha1 = "598cd7c1f68d1e205689b1c2fe65a9f85846f297" 713 | uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" 714 | version = "1.12.0" 715 | 716 | [[deps.Tar]] 717 | deps = ["ArgTools", "SHA"] 718 | uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" 719 | version = "1.10.0" 720 | 721 | [[deps.TerminalLoggers]] 722 | deps = ["LeftChildRightSiblingTrees", "Logging", "Markdown", "Printf", "ProgressLogging", "UUIDs"] 723 | git-tree-sha1 = "f133fab380933d042f6796eda4e130272ba520ca" 724 | uuid = "5d786b92-1e48-4d6f-9151-6b4477ca9bed" 725 | version = "0.1.7" 726 | 727 | [[deps.Test]] 728 | deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] 729 | uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 730 | 731 | [[deps.ThreadsX]] 732 | deps = ["Accessors", "ArgCheck", "BangBang", "ConstructionBase", "InitialValues", "MicroCollections", "Referenceables", "SplittablesBase", "Transducers"] 733 | git-tree-sha1 = "70bd8244f4834d46c3d68bd09e7792d8f571ef04" 734 | uuid = "ac1d9e8a-700a-412c-b207-f0111f4b6c0d" 735 | version = "0.1.12" 736 | 737 | [[deps.TranscodingStreams]] 738 | git-tree-sha1 = "e84b3a11b9bece70d14cce63406bbc79ed3464d2" 739 | uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" 740 | version = "0.11.2" 741 | 742 | [[deps.Transducers]] 743 | deps = ["Accessors", "Adapt", "ArgCheck", "BangBang", "Baselet", "CompositionsBase", "ConstructionBase", "DefineSingletons", "Distributed", "InitialValues", "Logging", "Markdown", "MicroCollections", "Requires", "SplittablesBase", "Tables"] 744 | git-tree-sha1 = "5215a069867476fc8e3469602006b9670e68da23" 745 | uuid = "28d57a85-8fef-5791-bfe6-a80928e7c999" 746 | version = "0.4.82" 747 | 748 | [deps.Transducers.extensions] 749 | TransducersBlockArraysExt = "BlockArrays" 750 | TransducersDataFramesExt = "DataFrames" 751 | TransducersLazyArraysExt = "LazyArrays" 752 | TransducersOnlineStatsBaseExt = "OnlineStatsBase" 753 | TransducersReferenceablesExt = "Referenceables" 754 | 755 | [deps.Transducers.weakdeps] 756 | BlockArrays = "8e7c35d0-a365-5155-bbbb-fb81a777f24e" 757 | DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" 758 | LazyArrays = "5078a376-72f3-5289-bfd5-ec5146d43c02" 759 | OnlineStatsBase = "925886fa-5bf2-5e8e-b522-a9147a512338" 760 | Referenceables = "42d2dcc6-99eb-4e98-b66c-637b7d73030e" 761 | 762 | [[deps.Tricks]] 763 | git-tree-sha1 = "7822b97e99a1672bfb1b49b668a6d46d58d8cbcb" 764 | uuid = "410a4b4d-49e4-4fbc-ab6d-cb71b17b3775" 765 | version = "0.1.9" 766 | 767 | [[deps.URIs]] 768 | git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" 769 | uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" 770 | version = "1.5.1" 771 | 772 | [[deps.UUIDs]] 773 | deps = ["Random", "SHA"] 774 | uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" 775 | 776 | [[deps.Unicode]] 777 | uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" 778 | 779 | [[deps.YAML]] 780 | deps = ["Base64", "Dates", "Printf", "StringEncodings"] 781 | git-tree-sha1 = "dea63ff72079443240fbd013ba006bcbc8a9ac00" 782 | uuid = "ddb6d928-2868-570f-bddf-ab3f9cf99eb6" 783 | version = "0.4.12" 784 | 785 | [[deps.Zlib_jll]] 786 | deps = ["Libdl"] 787 | uuid = "83775a58-1f1d-513f-b197-d71354ab007a" 788 | version = "1.2.13+1" 789 | 790 | [[deps.libblastrampoline_jll]] 791 | deps = ["Artifacts", "Libdl"] 792 | uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" 793 | version = "5.11.0+0" 794 | 795 | [[deps.nghttp2_jll]] 796 | deps = ["Artifacts", "Libdl"] 797 | uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" 798 | version = "1.52.0+1" 799 | 800 | [[deps.p7zip_jll]] 801 | deps = ["Artifacts", "Libdl"] 802 | uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" 803 | version = "17.4.0+2" 804 | -------------------------------------------------------------------------------- /src/assets/uva_logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | --------------------------------------------------------------------------------