From 99bcb160dcbb8f7ea597facfb90af327fcd0e8eb Mon Sep 17 00:00:00 2001 From: Darshan Sarojini <85709297+darshansarojini@users.noreply.github.com> Date: Sun, 16 Aug 2026 14:08:02 -0400 Subject: [PATCH 1/2] Migrate lab site from Google Sites to al-folio Replaces the two-card landing page with a full Jekyll site built on the al-folio academic starter, porting content from sites.google.com/view/darshan-sarojini. Content: - about/home, research (5 ongoing projects), teaching, people, join - _bibliography/papers.bib: 52 entries generated from the OpenAlex author record (all DOIs authoritative, none transcribed), with Crossref used to fill venue names OpenAlex leaves empty for AIAA proceedings. The PhD thesis has no DOI and was added by hand. - _data/people.yml drives the roster so adding a member is a data edit Deployment: - Replaces al-folio's stock gh-pages branch deploy with the Pages artifact API. interactive-visualization/ is ~218 MB of .glb models, which a branch-based deploy would commit into git history on every build. - Pull requests build without publishing, so main stays deployable. Removed al-folio demo data that would otherwise have gone live: Einstein's CV record and social links, and 50 MB of sample imagery. Co-Authored-By: Claude Opus 5 (1M context) --- .claude/skills | 1 + .dockerignore | 3 + .git-blame-ignore-revs | 24 + .gitattributes | 2 + .github/GIT_WORKFLOW.md | 47 ++ .github/ISSUE_TEMPLATE/1_bug_report.yml | 102 +++ .github/ISSUE_TEMPLATE/2_feature_request.yml | 56 ++ .../3_plugin_feature_proposal.yml | 112 +++ .github/ISSUE_TEMPLATE/config.yml | 11 + .github/agents/customize.agent.md | 51 ++ .github/agents/docs.agent.md | 41 + .github/copilot-instructions.md | 27 + .../bibtex-bibliography.instructions.md | 13 + .../javascript-scripts.instructions.md | 18 + .../liquid-templates.instructions.md | 18 + .../markdown-content.instructions.md | 13 + .../yaml-configuration.instructions.md | 18 + .github/pull_request_template.md | 48 ++ .github/release.yml | 14 + .github/stale.yml | 18 + .github/workflows/deploy.yml | 87 +++ .gitignore | 21 + .lycheeignore | 16 + .prettierignore | 8 + .prettierrc | 3 + Dockerfile | 76 ++ Gemfile | 64 ++ Gemfile.lock | 551 ++++++++++++++ _bibliography/papers.bib | 443 +++++++++++ _config.yml | 718 ++++++++++++++++++ _data/coauthors.yml | 5 + _data/people.yml | 61 ++ _data/socials.yml | 11 + _data/venues.yml | 1 + _news/2026-09-01-oceans.md | 8 + _pages/404.md | 9 + _pages/about.md | 44 ++ _pages/join.md | 24 + _pages/news.md | 7 + _pages/people.md | 49 ++ _pages/projects.md | 65 ++ _pages/publications.md | 20 + _pages/teaching.md | 31 + _projects/1_regional_air_mobility.md | 13 + _projects/2_certification_driven_design.md | 11 + _projects/3_advanced_visualization.md | 13 + _projects/4_ocean_vehicle_mdo.md | 11 + _projects/5_break_apart_uas.md | 13 + assets/bibliography/2018-12-22-distill.bib | 7 + assets/html/relativity.html | 10 + assets/json/resume.json | 221 ++++++ assets/json/table_data.json | 128 ++++ assets/jupyter/blog.ipynb | 48 ++ assets/pdf/example_pdf.pdf | Bin 0 -> 15879 bytes assets/rendercv/design.yaml | 7 + assets/rendercv/locale.yaml | 3 + .../rendercv_output/Albert_Einstein_CV.pdf | Bin 0 -> 71513 bytes assets/rendercv/settings.yaml | 17 + bin/al-folio | 4 + bin/capture_screenshots.js | 124 +++ bin/cibuild | 1 + bin/deploy | 119 +++ bin/entry_point.sh | 50 ++ bin/generate_star_history.py | 312 ++++++++ bin/setup-python-deps | 9 + bin/update_scholar_citations.py | 132 ++++ docker-compose-slim.yml | 12 + docker-compose.yml | 22 + index.html | 169 ----- openalex_authors.json | 1 + package-lock.json | 191 +++++ package.json | 15 + purgecss.config.js | 27 + requirements.txt | 4 + robots.txt | 7 + 75 files changed, 4491 insertions(+), 169 deletions(-) create mode 100644 .claude/skills create mode 100644 .dockerignore create mode 100644 .git-blame-ignore-revs create mode 100644 .gitattributes create mode 100644 .github/GIT_WORKFLOW.md create mode 100644 .github/ISSUE_TEMPLATE/1_bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/2_feature_request.yml create mode 100644 .github/ISSUE_TEMPLATE/3_plugin_feature_proposal.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/agents/customize.agent.md create mode 100644 .github/agents/docs.agent.md create mode 100644 .github/copilot-instructions.md create mode 100644 .github/instructions/bibtex-bibliography.instructions.md create mode 100644 .github/instructions/javascript-scripts.instructions.md create mode 100644 .github/instructions/liquid-templates.instructions.md create mode 100644 .github/instructions/markdown-content.instructions.md create mode 100644 .github/instructions/yaml-configuration.instructions.md create mode 100644 .github/pull_request_template.md create mode 100644 .github/release.yml create mode 100644 .github/stale.yml create mode 100644 .github/workflows/deploy.yml create mode 100644 .gitignore create mode 100644 .lycheeignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 Dockerfile create mode 100644 Gemfile create mode 100644 Gemfile.lock create mode 100644 _bibliography/papers.bib create mode 100644 _config.yml create mode 100644 _data/coauthors.yml create mode 100644 _data/people.yml create mode 100644 _data/socials.yml create mode 100644 _data/venues.yml create mode 100644 _news/2026-09-01-oceans.md create mode 100644 _pages/404.md create mode 100644 _pages/about.md create mode 100644 _pages/join.md create mode 100644 _pages/news.md create mode 100644 _pages/people.md create mode 100644 _pages/projects.md create mode 100644 _pages/publications.md create mode 100644 _pages/teaching.md create mode 100644 _projects/1_regional_air_mobility.md create mode 100644 _projects/2_certification_driven_design.md create mode 100644 _projects/3_advanced_visualization.md create mode 100644 _projects/4_ocean_vehicle_mdo.md create mode 100644 _projects/5_break_apart_uas.md create mode 100644 assets/bibliography/2018-12-22-distill.bib create mode 100644 assets/html/relativity.html create mode 100644 assets/json/resume.json create mode 100644 assets/json/table_data.json create mode 100644 assets/jupyter/blog.ipynb create mode 100644 assets/pdf/example_pdf.pdf create mode 100644 assets/rendercv/design.yaml create mode 100644 assets/rendercv/locale.yaml create mode 100644 assets/rendercv/rendercv_output/Albert_Einstein_CV.pdf create mode 100644 assets/rendercv/settings.yaml create mode 100644 bin/al-folio create mode 100644 bin/capture_screenshots.js create mode 100644 bin/cibuild create mode 100644 bin/deploy create mode 100644 bin/entry_point.sh create mode 100644 bin/generate_star_history.py create mode 100644 bin/setup-python-deps create mode 100644 bin/update_scholar_citations.py create mode 100644 docker-compose-slim.yml create mode 100644 docker-compose.yml delete mode 100644 index.html create mode 100644 openalex_authors.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 purgecss.config.js create mode 100644 requirements.txt create mode 100644 robots.txt diff --git a/.claude/skills b/.claude/skills new file mode 100644 index 0000000..2b7a412 --- /dev/null +++ b/.claude/skills @@ -0,0 +1 @@ +../.agents/skills \ No newline at end of file diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..7e82674 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,3 @@ +_site/ +.git/ +assets/ diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000..691dff4 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,24 @@ +# Template taken from https://github.com/v8/v8/blob/master/.git-blame-ignore-revs. +# +# This file contains a list of git hashes of revisions to be ignored by git blame. These +# revisions are considered "unimportant" in that they are unlikely to be what you are +# interested in when blaming. Most of these will probably be commits related to linting +# and code formatting. +# +# Instructions: +# - Only large (generally automated) reformatting or renaming CLs should be +# added to this list. Do not put things here just because you feel they are +# trivial or unimportant. If in doubt, do not put it on this list. +# - Precede each revision with a comment containing the PR title and number. +# For bulk work over many commits, place all commits in a block with a single +# comment at the top describing the work done in those commits. +# - Only put full 40-character hashes on this list (not short hashes or any +# other revision reference). +# - Append to the bottom of the file (revisions should be in chronological order +# from oldest to newest). +# - Because you must use a hash, you need to append to this list in a follow-up +# PR to the actual reformatting PR that you are trying to ignore. + +# Format all the code using prettier.io. (#2048, #2062) +beb6f27d596e753014cb9bff1939e5f78d66431c +2d34024961c3a3d27d6fd18ce06a551657983234 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..e785898 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Force LF line endings, needed for Docker to work on Windows +*.sh text eol=lf \ No newline at end of file diff --git a/.github/GIT_WORKFLOW.md b/.github/GIT_WORKFLOW.md new file mode 100644 index 0000000..771a71c --- /dev/null +++ b/.github/GIT_WORKFLOW.md @@ -0,0 +1,47 @@ +# Git Workflow + +This document outlines the conventions for using Git and writing commit messages in this project. + +## Commit Message Format + +All commit messages should follow this format: + +``` +: + + +``` + +**Types:** + +- `feat`: A new feature +- `fix`: A bug fix +- `docs`: Documentation only changes +- `style`: Changes that do not affect the meaning of the code (white-space, formatting, etc.) +- `config`: Changes to configuration files +- `chore`: Changes to the build process or auxiliary tools and libraries + +**Examples:** + +``` +feat: Add dark mode toggle button to header +fix: Correct baseurl in project site configuration +docs: Update docs/INSTALL.md with Docker troubleshooting +style: Format all Liquid templates with Prettier +config: Enable blog section in _config.yml +chore: Update Jekyll dependencies with bundle update --all +``` + +## Staging Changes + +**Always `git add` files explicitly.** Do not stage everything with `git add .` unless you are certain of what's being committed. Check `git status` first to review your changes. + +## What NOT to Commit + +**Always obey the project's [`.gitignore`](../.gitignore) file.** It prevents the accidental commit of: + +- Build outputs (`_site/`, `.jekyll-cache/`) +- Dependencies (`node_modules/`, `vendor/`) +- OS-specific files (`.DS_store`) +- Editor temporary files (`.idea/`, `.swp`, `.swo`) +- Secrets and API keys (never commit credentials) diff --git a/.github/ISSUE_TEMPLATE/1_bug_report.yml b/.github/ISSUE_TEMPLATE/1_bug_report.yml new file mode 100644 index 0000000..318d1ad --- /dev/null +++ b/.github/ISSUE_TEMPLATE/1_bug_report.yml @@ -0,0 +1,102 @@ +name: 🐛 Report a bug +description: Any errors. +labels: ["needs triage", "bug"] +body: + - type: markdown + attributes: + value: > + Before you go any further. Is this really a **🐛 bug**? + + If it's a question about how al-folio works, have a look at our [documentation](https://github.com/alshedivat/al-folio/blob/main/docs/README.md), + [frequently asked questions](https://github.com/alshedivat/al-folio/blob/main/docs/FAQ.md), + [past questions](https://github.com/alshedivat/al-folio/discussions/categories/q-a), + or [ask a question](https://github.com/alshedivat/al-folio/discussions/new?category=q-a). + + - type: checkboxes + id: requirements + attributes: + label: Have you checked that your issue isn't already filed? + description: > + Please check if somebody else has already filed the same issue. + If you find a similar issue, please add a 👍 reaction or comment on the original post. + options: + - label: I read through [FAQ](https://github.com/alshedivat/al-folio/blob/main/docs/FAQ.md) and searched through the [past issues](https://github.com/alshedivat/al-folio/issues), none of which addressed my issue. + required: true + - label: Yes, I have checked that this issue isn't already filed. + required: true + + - type: input + attributes: + label: Bug description + description: A description of the 🐛 bug. + placeholder: A clear and concise description of what the bug is. + validations: + required: true + + - type: textarea + attributes: + label: How to reproduce the bug + description: Provide steps to reproduce the 🐛 bug. + placeholder: | + Include steps to reproduce, the expected behaviour, and the actual behaviour. + + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: true + + - type: textarea + attributes: + label: Error messages and logs + description: > + Provide any error messages and/or logs + placeholder: "Copy the complete error messages and logs" + value: | + ``` + The error message you got, with the full traceback if available. Please paste it between these triple backticks. + ``` + validations: + required: false + + - type: dropdown + id: os + attributes: + label: What operating system are you using? + description: select all OSs where you have experienced this issue + multiple: true + options: + - Linux + - Mac + - Windows + - Not applicable (e.g. you're using GitHub Pages or other hosting) + validations: + required: true + + - type: dropdown + id: environment + attributes: + label: Where are you seeing the problem on? + description: select all environments where you have experienced this issue + multiple: true + options: + - "Running locally with Docker (docker compose)" + - "Running locally with Docker (devcontainer)" + - "Running locally without Docker" + - "Deployed site" + validations: + required: true + + - type: textarea + attributes: + label: More info + description: Add any other info about the issue here. + placeholder: | + Add any other context about the problem here, such as versions of the libraries if running without docker, screenshots, links to the deployed site, etc. + validations: + required: false + + - type: markdown + attributes: + value: "**Happy coding!**" diff --git a/.github/ISSUE_TEMPLATE/2_feature_request.yml b/.github/ISSUE_TEMPLATE/2_feature_request.yml new file mode 100644 index 0000000..6b97b1b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/2_feature_request.yml @@ -0,0 +1,56 @@ +name: 🚀 Feature request +description: Propose a feature for this project +labels: ["needs triage", "enhancement"] +body: + - type: markdown + attributes: + value: > + Before you go any further, are you sure that this feature is not already implemented? + + If it's a question about how al-folio works, have a look at our [documentation](https://github.com/alshedivat/al-folio/blob/main/docs/README.md), + [frequently asked questions](https://github.com/alshedivat/al-folio/blob/main/docs/FAQ.md), + [past questions](https://github.com/alshedivat/al-folio/discussions/categories/q-a), + or [ask a question](https://github.com/alshedivat/al-folio/discussions/new?category=q-a). + + - type: checkboxes + id: requirements + attributes: + label: Have you checked that your feature request isn't already filed? + description: > + Please check if somebody else has already filed the same 🚀 feature request. + If you find a similar feature request, please add a 👍 reaction or comment on the original post. + options: + - label: I read through [FAQ](https://github.com/alshedivat/al-folio/blob/main/docs/FAQ.md) and searched through the [past issues](https://github.com/alshedivat/al-folio/issues), none of which addressed my feature request. + required: true + - label: Yes, I have checked that this feature request isn't already filed. + required: true + + - type: textarea + attributes: + label: Description & Motivation + description: A clear and concise description of the 🚀 feature proposal + placeholder: | + Please outline the motivation for the proposal. + Is your feature request related to a problem? e.g., I'm always frustrated when [...]. + If this is related to another GitHub issue, please link it here + + - type: textarea + attributes: + label: Pitch + description: A clear and concise description of what you want to happen. + validations: + required: false + + - type: textarea + attributes: + label: Alternatives + description: A clear and concise description of any alternative solutions or features you've considered, if any. + validations: + required: false + + - type: textarea + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/3_plugin_feature_proposal.yml b/.github/ISSUE_TEMPLATE/3_plugin_feature_proposal.yml new file mode 100644 index 0000000..986c0c0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/3_plugin_feature_proposal.yml @@ -0,0 +1,112 @@ +name: "🔌 Plugin feature proposal" +description: Propose a plugin to be listed (featured) or bundled in al-folio. +labels: ["needs triage", "plugin-ecosystem"] +body: + - type: markdown + attributes: + value: > + Use this template to propose adding a plugin to the `al-folio` ecosystem catalog. + Featuring and bundling are separate decisions. + + - type: checkboxes + id: requirements + attributes: + label: Proposal checklist + options: + - label: I confirmed this plugin is not already listed in `_data/featured_plugins.yml`. + required: true + - label: I understand that featuring does not automatically mean bundling. + required: true + + - type: input + id: plugin_name + attributes: + label: Plugin name + description: Human-readable plugin name. + placeholder: al_folio_example + validations: + required: true + + - type: input + id: repo_url + attributes: + label: Repository URL + description: Public repository URL for the plugin. + placeholder: https://github.com/your-org/al-folio-example + validations: + required: true + + - type: input + id: gem_name + attributes: + label: Gem name + description: Name published on RubyGems. + placeholder: al_folio_example + validations: + required: true + + - type: input + id: plugin_id + attributes: + label: Jekyll plugin ID + description: Plugin id used in `_config.yml` plugins list. + placeholder: al_folio_example + validations: + required: true + + - type: dropdown + id: plugin_scope + attributes: + label: Plugin scope + description: Does this plugin depend on al-folio-specific runtime contracts? + options: + - Theme-coupled (al-folio-specific) + - Reusable (works outside al-folio) + validations: + required: true + + - type: dropdown + id: requested_track + attributes: + label: Requested track + description: Which listing track are you proposing? + options: + - Featured-only + - Bundled in starter + validations: + required: true + + - type: input + id: compatibility + attributes: + label: Compatibility range + description: al-folio versions supported by this plugin. + placeholder: "al_folio_min: 1.0.0, al_folio_max: 1.x" + validations: + required: true + + - type: input + id: demo_path + attributes: + label: Demo page/post URL + description: Public demo path showing the plugin in action. + placeholder: https://your-site.example/plugins/my-plugin-demo + validations: + required: true + + - type: input + id: maintainer_contact + attributes: + label: Maintainer contact + description: Primary maintainer handle or contact URL. + placeholder: https://github.com/your-handle + validations: + required: true + + - type: textarea + id: notes + attributes: + label: Additional notes + description: Add context, migration notes, or caveats. + validations: + required: false diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..0195fca --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: ❓ Ask a Question + url: https://github.com/alshedivat/al-folio/discussions/categories/q-a + about: Ask and answer al-folio related questions. + - name: 📖 Read the documentation + url: https://github.com/alshedivat/al-folio/blob/main/docs/README.md + about: Please consult the documentation before opening any issues! + - name: ⭐ Add your site to the showcase + url: https://github.com/alshedivat/al-folio/discussions + about: Request a listing in the Showcase category of GitHub Discussions. Entries are reviewed and added periodically — please do not open a pull request. diff --git a/.github/agents/customize.agent.md b/.github/agents/customize.agent.md new file mode 100644 index 0000000..b97b2b9 --- /dev/null +++ b/.github/agents/customize.agent.md @@ -0,0 +1,51 @@ +--- +name: customization_agent +description: Customization assistant for al-folio v1.x starter and plugin ecosystem +--- + +You are a customization assistant for `al-folio` v1.x. + +## Mission + +Help users customize their site while respecting v1 ownership boundaries. + +## Boundary Model + +- `al-folio` starter: docs, content, config wiring, integration and visual checks. +- `al-*` plugins: runtime feature behavior and component assets. + +If a request changes runtime behavior, route to the owning plugin repo instead of patching starter internals. + +## User Guidance Priorities + +1. Keep explanations simple for non-expert users. +2. Prefer editing `_config.yml`, content collections, and data files. +3. Avoid monolith-era guidance that assumes starter owns `_includes/_layouts/_sass` runtime internals. +4. When retaining local overrides of plugin-owned files, run the override audit and acknowledge reviewed overrides. + +## Key Starter Files + +- `_config.yml` +- `_data/*.yml` +- `_pages/`, `_posts/`, `_projects/`, `_news/`, `_teachings/` +- `Gemfile` +- `README.md` +- `docs/INSTALL.md`, `docs/CUSTOMIZE.md`, `docs/FAQ.md`, `docs/CONTRIBUTING.md`, `docs/BOUNDARIES.md` + +## Validation + +Use the validated command set in `AGENTS.md`. + +For local overrides, include: + +```bash +bundle exec al-folio upgrade overrides audit +``` + +## Escalation + +If user requests a feature that should live in a plugin: + +- identify likely owner plugin repo, +- explain why, +- provide starter wiring/docs changes only in this repo. diff --git a/.github/agents/docs.agent.md b/.github/agents/docs.agent.md new file mode 100644 index 0000000..6ea1231 --- /dev/null +++ b/.github/agents/docs.agent.md @@ -0,0 +1,41 @@ +--- +name: docs_agent +description: Documentation specialist for al-folio v1.x +--- + +You are the documentation specialist for `al-folio` v1.x. + +## Documentation Objective + +Keep starter docs accurate for the pluginized architecture. + +## Non-Negotiable Rules + +- Do not document `al-folio` as a monolithic runtime theme. +- Reflect starter-vs-plugin boundaries from `docs/BOUNDARIES.md`. +- Keep contributor routing explicit: starter changes here, feature/runtime changes in owning plugin repos. +- Avoid stale bootstrap-era instructions unless clearly marked compatibility-only. +- Keep migration guidance aligned with `al_folio_upgrade`, including the local override audit workflow. + +## Core Docs to Maintain + +- `README.md` +- `docs/README.md` +- `docs/INSTALL.md` +- `docs/CUSTOMIZE.md` +- `docs/FAQ.md` +- `docs/CONTRIBUTING.md` +- `docs/BOUNDARIES.md` +- `.github/copilot-instructions.md` +- `.agents/skills/al-folio-bootstrap/SKILL.md` +- `.agents/skills/al-folio-v1-migration/SKILL.md` + +## Validation + +Use commands from `AGENTS.md` and ensure documented commands are current and runnable. + +## Style + +- Be concise and practical. +- Prefer links over duplicated long instructions. +- Use repository-real file paths and commands. diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 0000000..9582579 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,27 @@ +# Copilot Coding Agent Instructions (v1.x) + +**Read [`AGENTS.md`](../AGENTS.md) first — it is the authoritative entry point for all coding agents in this repo.** It carries the change-routing table, the stop sign for gem-owned paths, the three silent failure modes, and the validated command set. This file previously duplicated that content; it is now a pointer so the rules cannot drift apart. + +In short: `al-folio` v1.x is a **thin Jekyll starter, not a theme**. It owns starter wiring (`Gemfile`, `_config.yml`), example content, docs, integration tests, and visual parity tests. All runtime — layouts, includes, Sass, Liquid tags, filters, feature JS — lives in versioned gems under [`al-org-dev`](https://github.com/al-org-dev). Route runtime changes to the owning gem. + +## Where to look + +| Question | File | +| ------------------------------------ | --------------------------------------------------------------------------------------------- | +| Which repo does my change belong in? | [`AGENTS.md`](../AGENTS.md#route-your-change) | +| Which gem owns this area? | [`docs/BOUNDARIES.md`](../docs/BOUNDARIES.md) | +| Which gem owns this Liquid tag? | [`docs/ARCHITECTURE.md`](../docs/ARCHITECTURE.md#wrapper-to-tag-to-gem-delegation) | +| Why did my feature render nothing? | [`docs/ARCHITECTURE.md`](../docs/ARCHITECTURE.md#failure-modes-that-produce-no-error-message) | +| What commands should I run? | [`AGENTS.md`](../AGENTS.md#validated-local-command-set) | +| How do I contribute? | [`docs/CONTRIBUTING.md`](../docs/CONTRIBUTING.md) | + +## Copilot-specific paths + +- `.github/agents/` — custom agents (`customize.agent.md`, `docs.agent.md`). +- `.github/instructions/` — per-file-type instruction files (Liquid, YAML, BibTeX, Markdown, JavaScript). +- `.github/workflows/copilot-setup-steps.yml` — pre-installs Ruby, Python, Node, ImageMagick, and nbconvert for the coding agent. +- `.agents/skills/` — canonical agent skills, also exposed via the `.codex/skills` and `.claude/skills` symlinks. + +## CI expectations + +Keep these workflows aligned when changing starter behavior: `unit-tests.yml` (style contract plus all six `test/integration_*.sh` scripts), `visual-regression.yml`, `upgrade-check.yml`, `prettier.yml`, and `deploy.yml`. diff --git a/.github/instructions/bibtex-bibliography.instructions.md b/.github/instructions/bibtex-bibliography.instructions.md new file mode 100644 index 0000000..2ade7ef --- /dev/null +++ b/.github/instructions/bibtex-bibliography.instructions.md @@ -0,0 +1,13 @@ +# BibTeX/Bibliography Instructions (v1.x) + +Scope: `_bibliography/**`, `*.bib` + +## Guidance + +- Keep BibTeX entries valid and consistently formatted. +- Preserve fields expected by citation/publication plugins. +- Route citation runtime/parsing changes to owning plugin repos. + +## Validation + +Use the validated command set in `AGENTS.md`. diff --git a/.github/instructions/javascript-scripts.instructions.md b/.github/instructions/javascript-scripts.instructions.md new file mode 100644 index 0000000..32fa3a5 --- /dev/null +++ b/.github/instructions/javascript-scripts.instructions.md @@ -0,0 +1,18 @@ +# JavaScript Instructions (v1.x) + +Scope: starter JS and related setup scripts + +## Ownership + +- Starter JS should be limited to orchestration/integration behavior. +- Feature runtime JS belongs in owning plugin repos. + +## Guidance + +- Do not copy plugin-owned search/icon/math/image runtime code into starter. +- Keep starter scripts framework-agnostic and compatible with plugin contracts. +- Prefer deterministic behavior suitable for integration/visual tests. + +## Validation + +Use the validated command set in `AGENTS.md`. diff --git a/.github/instructions/liquid-templates.instructions.md b/.github/instructions/liquid-templates.instructions.md new file mode 100644 index 0000000..a990ea0 --- /dev/null +++ b/.github/instructions/liquid-templates.instructions.md @@ -0,0 +1,18 @@ +# Liquid Templates Instructions (v1.x) + +Scope: `**/*.liquid` + +## Ownership + +- Starter templates in this repo should orchestrate plugin tags/includes. +- Runtime feature logic belongs in owning plugin repos. + +## Guidance + +- Prefer plugin wrappers/includes over embedding feature runtime logic in starter. +- Keep markup/config expectations consistent with `docs/BOUNDARIES.md`. +- Avoid reintroducing bootstrap-specific assumptions in starter templates. + +## Validation + +Use the validated command set in `AGENTS.md`. diff --git a/.github/instructions/markdown-content.instructions.md b/.github/instructions/markdown-content.instructions.md new file mode 100644 index 0000000..32379fb --- /dev/null +++ b/.github/instructions/markdown-content.instructions.md @@ -0,0 +1,13 @@ +# Markdown Content Instructions (v1.x) + +Scope: `_pages/**`, `_posts/**`, `_projects/**`, `_news/**`, `_teachings/**`, `_books/**` + +## Guidance + +- Keep starter content examples aligned with pluginized v1 behavior. +- Do not document runtime implementation details as starter-owned unless they truly are. +- When content depends on a plugin feature, ensure plugin wiring exists in `_config.yml` and `Gemfile`. + +## Validation + +Use the validated command set in `AGENTS.md`. diff --git a/.github/instructions/yaml-configuration.instructions.md b/.github/instructions/yaml-configuration.instructions.md new file mode 100644 index 0000000..fb75385 --- /dev/null +++ b/.github/instructions/yaml-configuration.instructions.md @@ -0,0 +1,18 @@ +# YAML Configuration Instructions (v1.x) + +Scope: `_config.yml`, `_data/**/*.yml` + +## Ownership + +- `_config.yml` in starter wires plugins and feature flags. +- Plugin-specific runtime semantics are owned by plugin repos. + +## Guidance + +- Keep plugin list and config keys aligned with v1 boundaries. +- When adding featured plugins, update `_data/featured_plugins.yml`. +- Validate YAML syntax and avoid stale monolith keys. + +## Validation + +Use the validated command set in `AGENTS.md`. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..57b679a --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,48 @@ +## Summary + +Describe what changed and why. + +> **Adding your site to the showcase?** We no longer accept pull requests for that. Please close this PR and post a request in the _Showcase_ category of [GitHub Discussions](https://github.com/alshedivat/al-folio/discussions) instead — entries are reviewed and added periodically. + +## Ownership Routing + +- [ ] I confirmed this PR targets the correct repo based on `docs/BOUNDARIES.md`. +- [ ] This PR only changes starter-owned scope (`al-folio`) **or** I am porting a routed change and linked the owning repo issue/PR. + +Owning repo (if not starter): +Related issue/PR: + +## Plugin Ecosystem (if applicable) + +- [ ] Not applicable +- [ ] This PR proposes a plugin for **featured-only** listing. +- [ ] This PR proposes a plugin for **bundled** starter inclusion. + +If plugin-related, provide: + +- Plugin repo URL: +- Gem name: +- Jekyll plugin id: +- Compatibility (`al_folio_min`/`al_folio_max`): +- Demo page/post path: +- Maintainer contact: + +## Starter Wiring Changes + +- [ ] Not applicable +- [ ] Updated `Gemfile` dependency wiring. +- [ ] Updated `_config.yml` plugin activation/config. +- [ ] Updated `_data/featured_plugins.yml` metadata. + +## Validation + +- [ ] `npm ci` +- [ ] `bundle exec jekyll build` +- [ ] `npm run lint:prettier` +- [ ] `npm run lint:style-contract` +- [ ] Integration tests (`test/integration_*.sh`) as needed +- [ ] Visual tests (`npm run test:visual`) as needed + +## Notes + +Compatibility, migration implications, and follow-ups: diff --git a/.github/release.yml b/.github/release.yml new file mode 100644 index 0000000..4fdc27e --- /dev/null +++ b/.github/release.yml @@ -0,0 +1,14 @@ +changelog: + exclude: + labels: + - ignore-for-release + categories: + - title: new features 🚀 + labels: + - enhancement + - title: bug fixes and improvements ✨ + labels: + - bug-fix + - title: other changes 🛠️ + labels: + - "*" diff --git a/.github/stale.yml b/.github/stale.yml new file mode 100644 index 0000000..8ec2004 --- /dev/null +++ b/.github/stale.yml @@ -0,0 +1,18 @@ +# Number of days of inactivity before an issue becomes stale +daysUntilStale: 60 +# Number of days of inactivity before a stale issue is closed +daysUntilClose: 7 +# Issues with these labels will never be considered stale +exemptLabels: + - pinned + - security + - enhancement +# Label to use when marking an issue as stale +staleLabel: wontfix +# Comment to post when marking an issue as stale. Set to `false` to disable +markComment: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. +# Comment to post when closing a stale issue. Set to `false` to disable +closeComment: false diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..1fe6679 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,87 @@ +name: Deploy site + +# Builds the al-folio site and publishes it via the GitHub Pages artifact API. +# +# This deliberately does NOT use al-folio's stock JamesIves/github-pages-deploy-action, +# which commits the built _site to a gh-pages branch. interactive-visualization/ holds +# ~218 MB of .glb models, so a branch-based deploy would write a quarter-gigabyte of +# binaries into git history on every single build. The artifact API keeps the build +# output out of the repo entirely. +# +# Requires Settings -> Pages -> Build and deployment -> Source = "GitHub Actions". + +on: + push: + branches: [main] + pull_request: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +# Let a running deployment finish rather than cancelling it mid-publish. +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v4 + + - name: Configure Pages + uses: actions/configure-pages@v5 + + - name: Setup Ruby 💎 + uses: ruby/setup-ruby@v1 + with: + ruby-version: "3.3.5" + bundler-cache: true + + - name: Setup Python 🐍 + uses: actions/setup-python@v5 + with: + python-version: "3.13" + cache: "pip" + + - name: Setup Node 🧰 + uses: actions/setup-node@v4 + with: + node-version: "20" + cache: "npm" + + - name: Install JS deps 📦 + run: npm ci + + - name: Install and Build 🔧 + run: | + sudo apt-get update && sudo apt-get install -y imagemagick + pip3 install --upgrade nbconvert + export JEKYLL_ENV=production + bundle exec jekyll build + + - name: Purge unused CSS 🧹 + run: | + npm install -g purgecss + purgecss -c purgecss.config.js + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + + deploy: + # Pull requests build only — they must not publish over the live site. + if: github.event_name != 'pull_request' + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..865c7fc --- /dev/null +++ b/.gitignore @@ -0,0 +1,21 @@ +_site +.bundle +.DS_store +.idea +.jekyll-cache +.jekyll-metadata +.ruby-version +.sass-cache +.tweet-cache +.venv +assets/libs/ +assets/rendercv/rendercv_output/*.typ +al-folio-upgrade-report.md +node_modules/ +output/playwright/ +test-results/ +vendor + +# Python bytecode from bin/ helper scripts +__pycache__/ +*.pyc diff --git a/.lycheeignore b/.lycheeignore new file mode 100644 index 0000000..9a9837b --- /dev/null +++ b/.lycheeignore @@ -0,0 +1,16 @@ +.github/instructions/bibtex-bibliography.instructions.md +.github/instructions/liquid-templates.instructions.md +.github/instructions/markdown-content.instructions.md +.github/instructions/yaml-configuration.instructions.md +_books/the_godfather.md +_pages/404.md +_pages/blog.md +_posts/2018-12-22-distill.md +_posts/2023-04-24-videos.md +AGENTS.md +https://dash.cloudflare.com/ +https://www.linkedin.com/ +https://www.reddit.com/ +README.md +docs/SEO.md +docs/SHOWCASE.md diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..fd7a420 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,8 @@ +**/*.map +**/*.min.css +**/*.min.js +assets/plotly/demo.html +lighthouse_results/** +_posts/2015-10-20-math.md +# Ignore citation YAML file generated by script +_data/citations.yml diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..0163f19 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,3 @@ +plugins: ["@shopify/prettier-plugin-liquid"] +printWidth: 150 +trailingComma: "es5" diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..99109cd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,76 @@ +FROM ruby:slim + +# uncomment these if you are having this issue with the build: +# /usr/local/bundle/gems/jekyll-4.3.4/lib/jekyll/site.rb:509:in `initialize': Permission denied @ rb_sysopen - /srv/jekyll/.jekyll-cache/.gitignore (Errno::EACCES) +# ARG GROUPID=901 +# ARG GROUPNAME=ruby +# ARG USERID=901 +# ARG USERNAME=jekyll + +ENV DEBIAN_FRONTEND noninteractive + +LABEL authors="Amir Pourmand,George Araújo" \ + description="Docker image for al-folio academic template" \ + maintainer="Amir Pourmand" + +# uncomment these if you are having this issue with the build: +# /usr/local/bundle/gems/jekyll-4.3.4/lib/jekyll/site.rb:509:in `initialize': Permission denied @ rb_sysopen - /srv/jekyll/.jekyll-cache/.gitignore (Errno::EACCES) +# add a non-root user to the image with a specific group and user id to avoid permission issues +# RUN groupadd -r $GROUPNAME -g $GROUPID && \ +# useradd -u $USERID -m -g $GROUPNAME $USERNAME + +# install system dependencies +RUN apt-get update -y && \ + apt-get install -y --no-install-recommends \ + build-essential \ + curl \ + git \ + imagemagick \ + inotify-tools \ + locales \ + nodejs \ + procps \ + python3-pip \ + zlib1g-dev && \ + pip --no-cache-dir install --upgrade --break-system-packages nbconvert + +# clean up +RUN apt-get clean && \ + apt-get autoremove && \ + rm -rf /var/lib/apt/lists/* /var/cache/apt/archives/* /tmp/* + +# set the locale +RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && \ + locale-gen + +# set environment variables +ENV EXECJS_RUNTIME=Node \ + JEKYLL_ENV=production \ + LANG=en_US.UTF-8 \ + LANGUAGE=en_US:en \ + LC_ALL=en_US.UTF-8 + +# create a directory for the jekyll site +RUN mkdir /srv/jekyll + +# copy the Gemfile and Gemfile.lock to the image +ADD Gemfile.lock /srv/jekyll +ADD Gemfile /srv/jekyll + +# set the working directory +WORKDIR /srv/jekyll + +# install jekyll and dependencies +RUN gem install --no-document jekyll bundler +RUN bundle install --no-cache + +EXPOSE 8080 + +COPY bin/entry_point.sh /tmp/entry_point.sh + +# uncomment this if you are having this issue with the build: +# /usr/local/bundle/gems/jekyll-4.3.4/lib/jekyll/site.rb:509:in `initialize': Permission denied @ rb_sysopen - /srv/jekyll/.jekyll-cache/.gitignore (Errno::EACCES) +# set the ownership of the jekyll site directory to the non-root user +# USER $USERNAME + +CMD ["/tmp/entry_point.sh"] diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..e7f6c5c --- /dev/null +++ b/Gemfile @@ -0,0 +1,64 @@ +source 'https://rubygems.org' + +gem 'jekyll' + +# Core plugins that directly affect site building +group :jekyll_plugins do + gem 'jekyll-3rd-party-libraries' + gem 'jekyll-archives-v2' + gem 'jekyll-cache-bust' + gem 'jekyll-email-protect' + gem 'jekyll-feed' + gem 'jekyll-get-json' + gem 'jekyll-imagemagick' + gem 'jekyll-jupyter-notebook' + gem 'jekyll-link-attributes' + gem 'jekyll-minifier' + gem 'jekyll-paginate-v2' + gem 'jekyll-regex-replace' + gem 'jekyll-scholar' + gem 'jekyll-sitemap' + gem 'jekyll-socials' + gem 'jekyll-tabs' + gem 'jekyll-terser', :git => "https://github.com/RobertoJBeltran/jekyll-terser.git" + gem 'jekyll-toc' + gem 'jekyll-twitter-plugin' + gem 'jemoji' + + gem 'classifier-reborn' # used for content categorization during the build +end + +# Gems for development or external data fetching (outside :jekyll_plugins) +group :other_plugins do + gem 'css_parser' + gem 'observer' # used by jekyll-scholar + gem 'ostruct' # used by jekyll-twitter-plugin + # gem 'terser' # used by jekyll-terser + # gem 'unicode_utils' -- should be already installed by jekyll + # gem 'webrick' -- should be already installed by jekyll +end + +# Gems for al-folio plugins +group :al_folio_plugins do + gem 'al_folio_core', '= 1.0.15' + gem 'al_icons', '= 1.0.0' + gem 'al_folio_cv', '= 1.0.2' + gem 'al_folio_distill', '= 1.0.3' + gem 'al_folio_upgrade', '= 1.0.3' + gem 'al_folio_bootstrap_compat', '= 1.0.0' + gem 'al_cookie', '= 1.0.1' + + gem 'al_analytics', '= 1.0.2' + gem 'al_citations', '= 1.0.1' + gem 'al_ext_posts', '= 1.0.3' + gem 'al_img_tools', '= 1.0.3' + gem 'al_search', '= 1.0.3' + gem 'al_charts', '= 1.0.1' + gem 'al_math', '= 1.0.2' + gem 'al_comments', '= 1.0.0' + gem 'al_newsletter', '= 1.0.0' + + gem 'al_email_protect', '= 1.0.1' + gem 'al_marimo', '= 1.0.0' + gem 'al_rtl', '= 1.0.0' +end diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..f08fecd --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,551 @@ +GIT + remote: https://github.com/RobertoJBeltran/jekyll-terser.git + revision: 1085bf66d692799af09fe39f8162a1e6e42a3cc4 + specs: + jekyll-terser (0.2.3) + jekyll (>= 0.10.0) + terser (>= 1.0.0) + +GEM + remote: https://rubygems.org/ + specs: + activesupport (7.2.3.1) + base64 + benchmark (>= 0.3) + bigdecimal + concurrent-ruby (~> 1.0, >= 1.3.1) + connection_pool (>= 2.2.5) + drb + i18n (>= 1.6, < 2) + logger (>= 1.4.2) + minitest (>= 5.1, < 6) + securerandom (>= 0.3) + tzinfo (~> 2.0, >= 2.0.5) + addressable (2.9.0) + public_suffix (>= 2.0.2, < 8.0) + al_analytics (1.0.2) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_charts (1.0.1) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_citations (1.0.1) + activesupport (>= 6.0, < 8.0) + jekyll (>= 3.9, < 5.0) + nokogiri (>= 1.13, < 2.0) + al_comments (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_cookie (1.0.1) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_email_protect (1.0.1) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_ext_posts (1.0.3) + feedjira (>= 3.2, < 5.0) + httparty (>= 0.18, < 1.0) + jekyll (>= 3.9, < 5.0) + nokogiri (>= 1.13, < 2.0) + al_folio_bootstrap_compat (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_folio_core (1.0.15) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_folio_cv (1.0.2) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_folio_distill (1.0.3) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_folio_upgrade (1.0.3) + al_folio_core (>= 1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_icons (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_img_tools (1.0.3) + jekyll (>= 3.9, < 5.0) + jekyll-3rd-party-libraries (~> 0.0.1) + al_marimo (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_math (1.0.2) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_newsletter (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_rtl (1.0.0) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + al_search (1.0.3) + jekyll (>= 3.9, < 5.0) + liquid (>= 4.0, < 6.0) + base64 (0.3.0) + benchmark (0.5.0) + bibtex-ruby (6.2.0) + latex-decode (~> 0.0) + logger (~> 1.7) + racc (~> 1.7) + bigdecimal (4.1.2) + citeproc (1.1.0) + date + forwardable + json + namae (~> 1.0) + observer (< 1.0) + open-uri (< 1.0) + citeproc-ruby (2.1.8) + citeproc (~> 1.0, >= 1.0.9) + csl (~> 2.0) + observer (< 1.0) + classifier-reborn (2.3.0) + fast-stemmer (~> 1.0) + matrix (~> 0.4) + colorator (1.1.0) + concurrent-ruby (1.3.7) + connection_pool (3.0.2) + crass (1.0.7) + csl (2.2.1) + forwardable (~> 1.3) + namae (~> 1.2) + open-uri (< 1.0) + rexml (~> 3.0) + set (~> 1.1) + singleton (< 1.0) + time (< 1.0) + csl-styles (2.0.2) + csl (~> 2.0) + css_parser (1.22.0) + addressable + cssminify2 (2.1.0) + csv (3.3.5) + date (3.5.1) + deep_merge (1.2.2) + drb (2.2.3) + em-websocket (0.5.3) + eventmachine (>= 0.12.9) + http_parser.rb (~> 0) + eventmachine (1.2.7) + execjs (2.10.1) + fast-stemmer (1.0.2) + feedjira (4.0.2) + logger (>= 1.0, < 2) + loofah (>= 2.3.1, < 3) + sax-machine (>= 1.0, < 2) + ffi (1.17.4-aarch64-linux-gnu) + ffi (1.17.4-aarch64-linux-musl) + ffi (1.17.4-arm-linux-gnu) + ffi (1.17.4-arm-linux-musl) + ffi (1.17.4-arm64-darwin) + ffi (1.17.4-x86_64-darwin) + ffi (1.17.4-x86_64-linux-gnu) + ffi (1.17.4-x86_64-linux-musl) + forwardable (1.4.0) + forwardable-extended (2.6.0) + gemoji (4.1.0) + google-protobuf (4.35.0) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-aarch64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-aarch64-linux-musl) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-arm64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-x86_64-darwin) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-x86_64-linux-gnu) + bigdecimal + rake (~> 13.3) + google-protobuf (4.35.0-x86_64-linux-musl) + bigdecimal + rake (~> 13.3) + html-pipeline (2.14.3) + activesupport (>= 2) + nokogiri (>= 1.4) + htmlcompressor (0.4.0) + http_parser.rb (0.8.1) + httparty (0.24.2) + csv + mini_mime (>= 1.0.0) + multi_xml (>= 0.5.2) + i18n (1.14.8) + concurrent-ruby (~> 1.0) + jekyll-3rd-party-libraries (0.0.1) + css_parser (>= 1.6, < 2.0) + jekyll (>= 3.6, < 5.0) + nokogiri (>= 1.8, < 2.0) + jekyll (4.4.1) + addressable (~> 2.4) + base64 (~> 0.2) + colorator (~> 1.0) + csv (~> 3.0) + em-websocket (~> 0.5) + i18n (~> 1.0) + jekyll-sass-converter (>= 2.0, < 4.0) + jekyll-watch (~> 2.0) + json (~> 2.6) + kramdown (~> 2.3, >= 2.3.1) + kramdown-parser-gfm (~> 1.0) + liquid (~> 4.0) + mercenary (~> 0.3, >= 0.3.6) + pathutil (~> 0.9) + rouge (>= 3.0, < 5.0) + safe_yaml (~> 1.0) + terminal-table (>= 1.8, < 4.0) + webrick (~> 1.7) + jekyll-archives-v2 (0.0.8) + activesupport + jekyll (>= 3.6, < 5.0) + jekyll-cache-bust (0.0.1) + jekyll (>= 3.6, < 5.0) + jekyll-email-protect (1.1.0) + jekyll-feed (0.17.0) + jekyll (>= 3.7, < 5.0) + jekyll-get-json (1.0.0) + deep_merge (~> 1.2) + jekyll (>= 3.0) + jekyll-imagemagick (1.4.0) + jekyll (>= 3.4) + jekyll-jupyter-notebook (0.0.6) + jekyll + jekyll-link-attributes (2.0.1) + jekyll-minifier (0.2.2) + cssminify2 (~> 2.1.0) + htmlcompressor (~> 0.4) + jekyll (~> 4.0) + json-minify (~> 0.0.3) + terser (~> 1.2.3) + jekyll-paginate-v2 (3.0.0) + jekyll (>= 3.0, < 5.0) + jekyll-regex-replace (1.1.0) + jekyll-sass-converter (3.1.0) + sass-embedded (~> 1.75) + jekyll-scholar (7.3.0) + bibtex-ruby (~> 6.0) + citeproc-ruby (>= 2.1.6) + csl-styles (~> 2.0) + jekyll (~> 4.0) + jekyll-sitemap (1.4.0) + jekyll (>= 3.7, < 5.0) + jekyll-socials (0.0.7) + jekyll (>= 3.6, < 5.0) + jekyll-tabs (1.2.1) + jekyll (>= 3.0, < 5.0) + jekyll-toc (0.19.0) + jekyll (>= 3.9) + nokogiri (~> 1.12) + jekyll-twitter-plugin (2.1.0) + jekyll-watch (2.2.1) + listen (~> 3.0) + jemoji (0.13.0) + gemoji (>= 3, < 5) + html-pipeline (~> 2.2) + jekyll (>= 3.0, < 5.0) + json (2.19.9) + json-minify (0.0.3) + json (> 0) + kramdown (2.5.2) + rexml (>= 3.4.4) + kramdown-parser-gfm (1.1.0) + kramdown (~> 2.0) + latex-decode (0.4.2) + liquid (4.0.4) + listen (3.10.0) + logger + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) + logger (1.7.0) + loofah (2.25.2) + crass (~> 1.0.2) + nokogiri (>= 1.12.0) + matrix (0.4.3) + mercenary (0.4.0) + mini_mime (1.1.5) + minitest (5.27.0) + multi_xml (0.9.1) + bigdecimal (>= 3.1, < 5) + namae (1.2.0) + racc (~> 1.7) + nokogiri (1.19.4-aarch64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-aarch64-linux-musl) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-arm-linux-musl) + racc (~> 1.4) + nokogiri (1.19.4-arm64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-darwin) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-gnu) + racc (~> 1.4) + nokogiri (1.19.4-x86_64-linux-musl) + racc (~> 1.4) + observer (0.1.2) + open-uri (0.5.0) + stringio + time + uri + ostruct (0.6.3) + pathutil (0.16.2) + forwardable-extended (~> 2.6) + public_suffix (7.0.5) + racc (1.8.1) + rake (13.4.2) + rb-fsevent (0.11.2) + rb-inotify (0.11.1) + ffi (~> 1.0) + rexml (3.4.4) + rouge (4.7.0) + safe_yaml (1.0.5) + sass-embedded (1.100.0-aarch64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-aarch64-linux-musl) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-arm-linux-gnueabihf) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-arm-linux-musleabihf) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-arm64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-x86_64-darwin) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-x86_64-linux-gnu) + google-protobuf (~> 4.31) + sass-embedded (1.100.0-x86_64-linux-musl) + google-protobuf (~> 4.31) + sax-machine (1.3.2) + securerandom (0.4.1) + set (1.1.3) + singleton (0.3.0) + stringio (3.2.0) + terminal-table (3.0.2) + unicode-display_width (>= 1.1.1, < 3) + terser (1.2.7) + execjs (>= 0.3.0, < 3) + time (0.4.2) + date + tzinfo (2.0.6) + concurrent-ruby (~> 1.0) + unicode-display_width (2.6.0) + uri (1.1.1) + webrick (1.9.2) + +PLATFORMS + aarch64-linux-gnu + aarch64-linux-musl + arm-linux-gnu + arm-linux-gnueabihf + arm-linux-musl + arm-linux-musleabihf + arm64-darwin + x86_64-darwin + x86_64-linux-gnu + x86_64-linux-musl + +DEPENDENCIES + al_analytics (= 1.0.2) + al_charts (= 1.0.1) + al_citations (= 1.0.1) + al_comments (= 1.0.0) + al_cookie (= 1.0.1) + al_email_protect (= 1.0.1) + al_ext_posts (= 1.0.3) + al_folio_bootstrap_compat (= 1.0.0) + al_folio_core (= 1.0.15) + al_folio_cv (= 1.0.2) + al_folio_distill (= 1.0.3) + al_folio_upgrade (= 1.0.3) + al_icons (= 1.0.0) + al_img_tools (= 1.0.3) + al_marimo (= 1.0.0) + al_math (= 1.0.2) + al_newsletter (= 1.0.0) + al_rtl (= 1.0.0) + al_search (= 1.0.3) + classifier-reborn + css_parser + jekyll + jekyll-3rd-party-libraries + jekyll-archives-v2 + jekyll-cache-bust + jekyll-email-protect + jekyll-feed + jekyll-get-json + jekyll-imagemagick + jekyll-jupyter-notebook + jekyll-link-attributes + jekyll-minifier + jekyll-paginate-v2 + jekyll-regex-replace + jekyll-scholar + jekyll-sitemap + jekyll-socials + jekyll-tabs + jekyll-terser! + jekyll-toc + jekyll-twitter-plugin + jemoji + observer + ostruct + +CHECKSUMS + activesupport (7.2.3.1) sha256=11ebed516a43a0bb47346227a35ebae4d9427465a7c9eb197a03d5c8d283cb34 + addressable (2.9.0) sha256=7fdf6ac3660f7f4e867a0838be3f6cf722ace541dd97767fa42bc6cfa980c7af + al_analytics (1.0.2) sha256=0c8e0c029b1a28401d21ed9b56033036697e61722a0d8867f33c30010ad738d6 + al_charts (1.0.1) sha256=ce26374c2b1159ae0d65dc7999730be700a9ee486002ae14cb480eef70580885 + al_citations (1.0.1) sha256=308cfd4cd73c8dc6d24c0214f424b61606b3a393bdb899394fce80dd647cba59 + al_comments (1.0.0) sha256=1da87a29b55e4d9fd62d380200af9671f10ae4a84e3259828588498d8f3210e5 + al_cookie (1.0.1) sha256=2420241497b1fb165311ba1c9e059a9025586925b65dbba429aee225bd91a67f + al_email_protect (1.0.1) sha256=04d1e9b19a47d26e6fa238baba197165653002c788b60525fef093ee1a3989e5 + al_ext_posts (1.0.3) sha256=c4956d36071958d30de14f6c368863d3e4190dfe312dba08ff79aa685292420d + al_folio_bootstrap_compat (1.0.0) sha256=c210ff3087f17344dc864fa9594c737e947b23c6cae9fab3dbd37a87090b98a8 + al_folio_core (1.0.15) sha256=eee5d0afefab5d3e8747b615890d760ed0ab01a1210991118709c4e969ad1326 + al_folio_cv (1.0.2) sha256=d9b8d3624c0c707a04deaa41972fa88395fa164419bccc44e2dc2488400022fa + al_folio_distill (1.0.3) sha256=3feb669dd669effec127e1be5385158c5f98062c510980b5c9c802227ec2c247 + al_folio_upgrade (1.0.3) sha256=434ffddb27705852eae0bcaa01a8d007e0ef65472a989d1a33ae759f910f4709 + al_icons (1.0.0) sha256=7a7b6428d18e77b039aa1ae765a3faed0ae27cb646a08c1009b145c31ca5ef2d + al_img_tools (1.0.3) sha256=c50dfa206bb4459925cbfc0e7d03b326e7cb1c282200d5d110b6595f4d661cf7 + al_marimo (1.0.0) sha256=bbd8ce9650c7e8a3b35cbbde8d98eba983f132647f316b3ba2a9bd8abf502434 + al_math (1.0.2) sha256=c9fa6f3e343c0d35782d77fe386461ceff7d12186d9b51e6c92bb186b3d60781 + al_newsletter (1.0.0) sha256=27c914f5fcd0c7fac51a513ab11de7123f05de7ba834206a68ddf2588ede96d3 + al_rtl (1.0.0) sha256=dffed3cb05acf0e4f96e7ee2d51cb05fc83a428e0d5e4d697c5da4b7c3fe0f0b + al_search (1.0.3) sha256=70e846081b57a3494dd41e6bc8e1af13997200c5c28744f2449a8ebe07f79a8a + base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b + benchmark (0.5.0) sha256=465df122341aedcb81a2a24b4d3bd19b6c67c1530713fd533f3ff034e419236c + bibtex-ruby (6.2.0) sha256=d610eba78d6adf503a843daf144644449fb34e7c3f4a75e9ab67fae5dfd7c69a + bigdecimal (4.1.2) sha256=53d217666027eab4280346fba98e7d5b66baaae1b9c3c1c0ffe89d48188a3fbd + citeproc (1.1.0) sha256=278e6b8948133e82bef1c8204a1f88ca7adaa8744b9a283fe73e8f4cd0b53b95 + citeproc-ruby (2.1.8) sha256=192ce6525235adaa60d1dbc3f1b10b0839e86d98a94278736b807e234b3572e9 + classifier-reborn (2.3.0) sha256=e2236322de42b9c8d45d88a951cb0d76e210afa3bb8658b7b5802e2df41ef61c + colorator (1.1.0) sha256=e2f85daf57af47d740db2a32191d1bdfb0f6503a0dfbc8327d0c9154d5ddfc38 + concurrent-ruby (1.3.7) sha256=4412caec3a5ea2e5fdc52076724c071a81f2c0593d83b2ac8cbb8ca63b3151b0 + connection_pool (3.0.2) sha256=33fff5ba71a12d2aa26cb72b1db8bba2a1a01823559fb01d29eb74c286e62e0a + crass (1.0.7) sha256=94868719948664c89ddcaf0a37c65048413dfcb1c869470a5f7a7ceb5390b295 + csl (2.2.1) sha256=624352f1f6f51f1e0b155bd2501ce423f03264495ec259e65c26e00872a195a2 + csl-styles (2.0.2) sha256=a48007d8a60307825de140dc2adaacc0b7186f2d1042f7e839eb47fce051de98 + css_parser (1.22.0) sha256=f274988a40c6178305530d60e7deb5162f7b5538b701b61b5488fc703e5b40c1 + cssminify2 (2.1.0) sha256=406a0b95fdaab60132c6f1fbb47b4a30f9572d2ef523f806fb94a530d78c2bb1 + csv (3.3.5) sha256=6e5134ac3383ef728b7f02725d9872934f523cb40b961479f69cf3afa6c8e73f + date (3.5.1) sha256=750d06384d7b9c15d562c76291407d89e368dda4d4fff957eb94962d325a0dc0 + deep_merge (1.2.2) sha256=83ced3a3d7f95f67de958d2ce41b1874e83c8d94fe2ddbff50c8b4b82323563a + drb (2.2.3) sha256=0b00d6fdb50995fe4a45dea13663493c841112e4068656854646f418fda13373 + em-websocket (0.5.3) sha256=f56a92bde4e6cb879256d58ee31f124181f68f8887bd14d53d5d9a292758c6a8 + eventmachine (1.2.7) sha256=994016e42aa041477ba9cff45cbe50de2047f25dd418eba003e84f0d16560972 + execjs (2.10.1) sha256=abe0ae028467eb8e30c10814eb934d07876a691aae7e803d813b7ce5a75e73f1 + fast-stemmer (1.0.2) sha256=d0aa9fd9cfbca836a09d8abb122552ac8234130271a3b0da1cb077323d650819 + feedjira (4.0.2) sha256=3e7a90d24fd66eddc809539e637a86a02de1a7e038cd40157e916ed2f3b5ff71 + ffi (1.17.4-aarch64-linux-gnu) sha256=b208f06f91ffd8f5e1193da3cae3d2ccfc27fc36fba577baf698d26d91c080df + ffi (1.17.4-aarch64-linux-musl) sha256=9286b7a615f2676245283aef0a0a3b475ae3aae2bb5448baace630bb77b91f39 + ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564 + ffi (1.17.4-arm-linux-musl) sha256=9d4838ded0465bef6e2426935f6bcc93134b6616785a84ffd2a3d82bc3cf6f95 + ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b + ffi (1.17.4-x86_64-darwin) sha256=aa70390523cf3235096cf64962b709b4cfbd5c082a2cb2ae714eb0fe2ccda496 + ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d + ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e + forwardable (1.4.0) sha256=f1cd40cc9812937980e1c76f1aa053660990a7c9b6a98fc37d945468afcce838 + forwardable-extended (2.6.0) sha256=1bec948c469bbddfadeb3bd90eb8c85f6e627a412a3e852acfd7eaedbac3ec97 + gemoji (4.1.0) sha256=734434020cbe964ea9d19086798797a47d23a170892de0ce55b74aa65d2ddc1a + google-protobuf (4.35.0) sha256=95346162c792ed78c9a28cbf2d937a53f706de6df36a27471582f63f03c30c0d + google-protobuf (4.35.0-aarch64-linux-gnu) sha256=2cabd61b420918aec1564f9f7414e455bf922d20c5f8139d62783df5558a7aea + google-protobuf (4.35.0-aarch64-linux-musl) sha256=f6b11f3420a4564f68e8233c95eac6924f6a727dfc2f81a56af2e09add551501 + google-protobuf (4.35.0-arm64-darwin) sha256=66ab26d3fc82b8950702e53ab16c198e3c0ea3f2a38aaaf1f32152da45593ac5 + google-protobuf (4.35.0-x86_64-darwin) sha256=05eb5c8bc9899135befff496fc0a3642e7ff3d0943f043841dcc456f5654fea0 + google-protobuf (4.35.0-x86_64-linux-gnu) sha256=999226f3b00cd9fddb1b26851d16060212fa1d90c406aaad47e574682b716059 + google-protobuf (4.35.0-x86_64-linux-musl) sha256=be0218520d77b2aee898b363514b03819f6f63f9c041ae0d0d79b4ce5247bffd + html-pipeline (2.14.3) sha256=8a1d4d7128b2141913387cac0f8ba898bb6812557001acc0c2b46910f59413a0 + htmlcompressor (0.4.0) sha256=4630cf8ed46b563f0b49cc6028a3fe8c17a9067f2becd7c3a2aa5aaacefb1f9e + http_parser.rb (0.8.1) sha256=9ae8df145b39aa5398b2f90090d651c67bd8e2ebfe4507c966579f641e11097a + httparty (0.24.2) sha256=8fca6a54aa0c4aa4303a0fd33e5e2156175d6a5334f714263b458abd7fda9c38 + i18n (1.14.8) sha256=285778639134865c5e0f6269e0b818256017e8cde89993fdfcbfb64d088824a5 + jekyll (4.4.1) sha256=4c1144d857a5b2b80d45b8cf5138289579a9f8136aadfa6dd684b31fe2bc18c1 + jekyll-3rd-party-libraries (0.0.1) sha256=331f8d53adbb532a27705d9d4fb719c7f306247c56531fa22c0178f4a445a692 + jekyll-archives-v2 (0.0.8) sha256=5584088b4bd188a6099a2f6940c223f037ddb30e70890fcca1da299395584a7d + jekyll-cache-bust (0.0.1) sha256=538ffe6d48f56d933b435bf32d4fef19ff1082cae7d6d8bc737fc13a9c86ba8c + jekyll-email-protect (1.1.0) sha256=00d620939c710788ae3f71188ef913e0aa7ff0a5a39f48249213ea6215558c8d + jekyll-feed (0.17.0) sha256=689aab16c877949bb9e7a5c436de6278318a51ecb974792232fd94d8b3acfcc3 + jekyll-get-json (1.0.0) sha256=f6b076a93de9cace89a88617b494bea10e6dbb86331c293d663d37d9b9ae7522 + jekyll-imagemagick (1.4.0) sha256=dcf4ae46ffbeabfac584a5256821e39fc5fae8d651fd5c4a56fef3a2061a7ef4 + jekyll-jupyter-notebook (0.0.6) sha256=33f757eaad9035bebc5309e23ce2274db089ae8a0d002a53c3acbc5265d322cd + jekyll-link-attributes (2.0.1) sha256=e25b12e3c2a2960c8cfd9ab33e8df9aa3c4ba86491dbeec48f3cb11b0a0f216d + jekyll-minifier (0.2.2) sha256=f0a182b98b369492b9d93f1dd064223cf04a10ba31c49e1535f28fe35764ee19 + jekyll-paginate-v2 (3.0.0) sha256=001be6c1963caa41fed9c2f43b0d47201defa0395381eb8830487c1c2fc4f4e3 + jekyll-regex-replace (1.1.0) sha256=3738e6a0aa07dd3f9b7369e6e38e5d245c623bbd70c31b21e7838c654377a00c + jekyll-sass-converter (3.1.0) sha256=83925d84f1d134410c11d0c6643b0093e82e3a3cf127e90757a85294a3862443 + jekyll-scholar (7.3.0) sha256=d912e60aa5ab342fb4322772f02674152e2799375612a2aa5f9b2228728fd09b + jekyll-sitemap (1.4.0) sha256=0de08c5debc185ea5a8f980e1025c7cd3f8e0c35c8b6ef592f15c46235cf4218 + jekyll-socials (0.0.7) sha256=813448f79182fa5aa05a87e2b7cfec3d9a55660a323f082e249a47a84f2a7518 + jekyll-tabs (1.2.1) sha256=e7e0f05d1180c9651318fb5834a0c745a613b4253e9699a662b63cc3d39cbc4d + jekyll-terser (0.2.3) + jekyll-toc (0.19.0) sha256=8a8270f7e8e3d849e2035710b1713d0af5e2185a4bfaca70f9192ecf5ac50668 + jekyll-twitter-plugin (2.1.0) sha256=d25ee86813705244dcec3163d9a110a1c0216e157dcf6cf88ab57cf389887acd + jekyll-watch (2.2.1) sha256=bc44ed43f5e0a552836245a54dbff3ea7421ecc2856707e8a1ee203a8387a7e1 + jemoji (0.13.0) sha256=5d4c3e8e2cbbb2b73997c31294f6f70c94e4d4fade039373e86835bcf5529e7c + json (2.19.9) sha256=9b9025b7cdddafa38d316eca0b2358488e42d417045c1b90d216a9fefe46b79a + json-minify (0.0.3) sha256=fd38ef93867332c2340aaf1b57335782ab5958fe6fb3ca7a8aba1469f0bf08ae + kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa + kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729 + latex-decode (0.4.2) sha256=e85633406e315e348e0ca6de231dee1bf45a22496b0866059c635f7502c2a592 + liquid (4.0.4) sha256=4fcfebb1a045e47918388dbb7a0925e7c3893e58d2bd6c3b3c73ec17a2d8fdb3 + listen (3.10.0) sha256=c6e182db62143aeccc2e1960033bebe7445309c7272061979bb098d03760c9d2 + logger (1.7.0) sha256=196edec7cc44b66cfb40f9755ce11b392f21f7967696af15d274dde7edff0203 + loofah (2.25.2) sha256=2007f746959ac65552456e04b433e83deb22759ab38c838b4445c70e43425918 + matrix (0.4.3) sha256=a0d5ab7ddcc1973ff690ab361b67f359acbb16958d1dc072b8b956a286564c5b + mercenary (0.4.0) sha256=b25a1e4a59adca88665e08e24acf0af30da5b5d859f7d8f38fba52c28f405138 + mini_mime (1.1.5) sha256=8681b7e2e4215f2a159f9400b5816d85e9d8c6c6b491e96a12797e798f8bccef + minitest (5.27.0) sha256=2d3b17f8a36fe7801c1adcffdbc38233b938eb0b4966e97a6739055a45fa77d5 + multi_xml (0.9.1) sha256=7ce766b59c17241ed62976caeae1fae9b2431b263398c35396239a68c4a64e57 + namae (1.2.0) sha256=3541ce4b086fd4981d2376630c03e284402bfe1cdbab4e50e2222a72aeb9d59d + nokogiri (1.19.4-aarch64-linux-gnu) sha256=1269fb644a6de405057a53dd5c762b1209b43ca7424f839454d3dbc677c31a8f + nokogiri (1.19.4-aarch64-linux-musl) sha256=35c65b9ce72b3bb03207bdbe7067915019dc18c1b9b59139684bd6690fdd01af + nokogiri (1.19.4-arm-linux-gnu) sha256=a301313e38bb065d68239e79734bcd6f56fb6efaacebde29e9abf2a4735340ca + nokogiri (1.19.4-arm-linux-musl) sha256=588923c101bcfa78869734d247d25b598674323e7f22474fc468f6e5647311eb + nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 + nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 + nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a + nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b + observer (0.1.2) sha256=d8a3107131ba661138d748e7be3dbafc0d82e732fffba9fccb3d7829880950ac + open-uri (0.5.0) sha256=7b4f06fdac39e6946aed15a8da82531580882fbbec80438adcb7c30d388887ca + ostruct (0.6.3) sha256=95a2ed4a4bd1d190784e666b47b2d3f078e4a9efda2fccf18f84ddc6538ed912 + pathutil (0.16.2) sha256=e43b74365631cab4f6d5e4228f812927efc9cb2c71e62976edcb252ee948d589 + public_suffix (7.0.5) sha256=1a8bb08f1bbea19228d3bed6e5ed908d1cb4f7c2726d18bd9cadf60bc676f623 + racc (1.8.1) sha256=4a7f6929691dbec8b5209a0b373bc2614882b55fc5d2e447a21aaa691303d62f + rake (13.4.2) sha256=cb825b2bd5f1f8e91ca37bddb4b9aaf345551b4731da62949be002fa89283701 + rb-fsevent (0.11.2) sha256=43900b972e7301d6570f64b850a5aa67833ee7d87b458ee92805d56b7318aefe + rb-inotify (0.11.1) sha256=a0a700441239b0ff18eb65e3866236cd78613d6b9f78fea1f9ac47a85e47be6e + rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142 + rouge (4.7.0) sha256=dba5896715c0325c362e895460a6d350803dbf6427454f49a47500f3193ea739 + safe_yaml (1.0.5) sha256=a6ac2d64b7eb027bdeeca1851fe7e7af0d668e133e8a88066a0c6f7087d9f848 + sass-embedded (1.100.0-aarch64-linux-gnu) sha256=c13187f8eaae7e7e64246b18eb896534a84465a17198829ef65730db4662860e + sass-embedded (1.100.0-aarch64-linux-musl) sha256=1b0945a66cd4e40f505db73b1e790e2561e07e6d9fd04ef6ebbf279835666b3f + sass-embedded (1.100.0-arm-linux-gnueabihf) sha256=a2de272bb02977ea91acaf3fecb6d8e09e4989501efbfc5375da4b5e7bff001d + sass-embedded (1.100.0-arm-linux-musleabihf) sha256=ce19837c10bab5ae6785f10b435a57a64ca027a99875cd701dc6fd3af317cbe5 + sass-embedded (1.100.0-arm64-darwin) sha256=d294b32c3b7bed293ad39bd392713c07f1df5454e65fa0f8d80dadbdba8a0cf4 + sass-embedded (1.100.0-x86_64-darwin) sha256=3db80c837a60712de3461d5aa1be43c7056a0584d7182a8ae7a8996d64ab46d3 + sass-embedded (1.100.0-x86_64-linux-gnu) sha256=58dd0a8a4f0dd78881b90d8b0e4d0eed042d54865b19b71384d91091ade93e18 + sass-embedded (1.100.0-x86_64-linux-musl) sha256=03dbee81bf93e770c725caf0c895e04c7b049ebef56b8a7002fcf21e6bedf7c5 + sax-machine (1.3.2) sha256=a1112678039eea4c402827ca0d377744e0f882fd6386f29f7b0023d938750d3a + securerandom (0.4.1) sha256=cc5193d414a4341b6e225f0cb4446aceca8e50d5e1888743fac16987638ea0b1 + set (1.1.3) sha256=12bbbd31c8b177d55ac0314bcc7f4c473276b06e8a2dcfdc14326e73ce7769ce + singleton (0.3.0) sha256=83ea1bca5f4aa34d00305ab842a7862ea5a8a11c73d362cb52379d94e9615778 + stringio (3.2.0) sha256=c37cb2e58b4ffbd33fe5cd948c05934af997b36e0b6ca6fdf43afa234cf222e1 + terminal-table (3.0.2) sha256=f951b6af5f3e00203fb290a669e0a85c5dd5b051b3b023392ccfd67ba5abae91 + terser (1.2.7) sha256=1b12eb49769dadac44caac3485b38928ff4ab435f1bbbacfe8048cff84c6aa1b + time (0.4.2) sha256=f324e498c3bde9471d45a7d18f874c27980e9867aa5cfca61bebf52262bc3dab + tzinfo (2.0.6) sha256=8daf828cc77bcf7d63b0e3bdb6caa47e2272dcfaf4fbfe46f8c3a9df087a829b + unicode-display_width (2.6.0) sha256=12279874bba6d5e4d2728cef814b19197dbb10d7a7837a869bab65da943b7f5a + uri (1.1.1) sha256=379fa58d27ffb1387eaada68c749d1426738bd0f654d812fcc07e7568f5c57c6 + webrick (1.9.2) sha256=beb4a15fc474defed24a3bda4ffd88a490d517c9e4e6118c3edce59e45864131 + +BUNDLED WITH + 4.0.6 diff --git a/_bibliography/papers.bib b/_bibliography/papers.bib new file mode 100644 index 0000000..5086804 --- /dev/null +++ b/_bibliography/papers.bib @@ -0,0 +1,443 @@ +@inproceedings{nguyen2026autonomous, + author = {Nguyen, Khoa D. and Hogge, Dylan and Riris, John and Sarojini, Darshan and Denby, Bradley}, + title = {Autonomous Battery Units as an Enabling Technology for Urban Air Mobility}, + booktitle = {AIAA SCITECH 2026 Forum}, + year = {2026}, + doi = {10.2514/6.2026-1713} +} + +@inproceedings{sarker2026kernelbased, + author = {Sarker, Amit and Batley, Reza T. and Sarojini, Darshan and Saha, Sourav}, + title = {A Kernel-based Resource-efficient Neural Surrogate for Multi-fidelity Prediction of Aerodynamic Field}, + booktitle = {AIAA SCITECH 2026 Forum}, + year = {2026}, + doi = {10.2514/6.2026-0043} +} + +@inproceedings{gould2026certificationinformed, + author = {Gould, J. and Shune, Nathan and Sarojini, Darshan}, + title = {Certification-Informed Reliability and Performance Assessment of Electrified Aircraft}, + booktitle = {AIAA SCITECH 2026 Forum}, + year = {2026}, + doi = {10.2514/6.2026-1788} +} + +@inproceedings{prophet2026programmed, + author = {Prophet, Nicholas R. and Wallace, Vincent and Cartwright, James E. and Kapania, Rakesh and Sarojini, Darshan and Schetz, Joseph and Stern, Adam}, + title = {Programmed Disassembly of Unmanned Aerial Vehicles}, + booktitle = {AIAA AVIATION 2026 Forum}, + year = {2026}, + doi = {10.2514/6.2026-4381} +} + +@inproceedings{lee2026transportation, + author = {Lee, Grant and Wang, Zhou and Hogge, Dylan and Anwar, Aman and Bhatt, Krish and Sarojini, Darshan and Trani, Antonio}, + title = {A Transportation Model for Door-to-Door Regional Air Mobility Applied to West Virginia}, + booktitle = {AIAA AVIATION 2026 Forum}, + year = {2026}, + doi = {10.2514/6.2026-4065} +} + +@inproceedings{schie2025largescale, + author = {Schie, Sebastiaan P. van and Ruh, Marius L. and Fletcher, Andrew H. and Warner, M. and Sperry, Mark and Scotzniovsky, Luca and Orndorff, Nicholas C. and Xiang, Ru and Yan, Jiayao and Zhao, Han and Krokowski, Joshua and Chen, Jiun‐Shyan and Sarojini, Darshan and Gill, Hyunjune and Lee, Seongkyu and Tagg, Andrew and Anderson, Ryan and Green, Eric and Joseph, Cibin and Ning, Andrew and Cheng, Zeyu and Cao, Zhi and Mı, Chris and Guibert, Alexandre T. and Cronk, Ashley and Kim, Hyunsun A. and Meng, Ying Shirley and Silva, Christopher J. and Hwang, John T.}, + title = {Large-Scale Distributed Multidisciplinary Design Optimization of the {NASA} Lift-Plus-Cruise Air Taxi Concept}, + booktitle = {AIAA SCITECH 2025 Forum}, + year = {2025}, + doi = {10.2514/6.2025-0362} +} + +@inproceedings{gould2025performance, + author = {Gould, Joseph and Shune, Nathan and Sarmiento, David Solano and Sarojini, Darshan}, + title = {Performance and Regulatory Assessment Trim Formulations for Conceptual Aircraft Design}, + booktitle = {AIAA AVIATION FORUM AND ASCEND 2025}, + year = {2025}, + doi = {10.2514/6.2025-3624} +} + +@inproceedings{ruh2024largescale, + author = {Ruh, Marius L. and Fletcher, Andrew and Sarojini, Darshan and Sperry, Mark and Yan, Jiayao and Scotzniovsky, Luca and Schie, Sebastiaan P. van and Warner, M. and Orndorff, Nicholas C. and Xiang, Ru and Joshy, Anugrah Jo and Zhao, Han and Krokowski, Joshua and Gill, Hyunjune and Lee, Seongkyu and Cheng, Zeyu and Cao, Zhi and Mı, Chris and Silva, Christopher J. and Wolfe, Lauren G. and Chen, Jiun‐Shyan and Hwang, John T.}, + title = {Large-scale multidisciplinary design optimization of a {NASA} air taxi concept using a comprehensive physics-based system model}, + booktitle = {AIAA SCITECH 2024 Forum}, + year = {2024}, + doi = {10.2514/6.2024-0771} +} + +@inproceedings{sarojini2024review, + author = {Sarojini, Darshan and Ruh, Marius L. and Yan, Jiayao and Scotzniovsky, Luca and Orndorff, Nicholas C. and Xiang, Ru and Zhao, Han and Krokowski, Joshua and Warner, M. and Schie, Sebastiaan van and Cronk, Ashley and Guibert, Alexandre T. and Chambers, Jeffrey T. and Wolfe, Lauren G. and Doring, Rachel and Despins, Robin and Joseph, Cibin and Anderson, Ryan and Ning, Andrew and Gill, Hyunjune and Lee, Seongkyu and Cheng, Zeyu and Cao, Zhi and Mı, Chris and Meng, Ying Shirley and Silva, Christopher J. and Chen, Jiun‐Shyan and Kim, Alicia A. and Hwang, John T.}, + title = {Review of Computational Models for Large-Scale {MDAO} of Urban Air Mobility Concepts}, + booktitle = {AIAA SCITECH 2024 Forum}, + year = {2024}, + doi = {10.2514/6.2024-0377} +} + +@inproceedings{sarojini2023largescale, + author = {Sarojini, Darshan and Ruh, Marius L. and Joshy, Anugrah Jo and Yan, Jiayao and Ivanov, Alexander K. and Scotzniovsky, Luca and Fletcher, Andrew H. and Orndorff, Nicholas C. and Sperry, Mark and Gandarillas, Victor E. and Asher, Issac and Chambers, Jeffrey T. and Gill, Hyunjune and Lee, Seongkyu and Cheng, Zeyu and Rodriguez, Gabriel and Zhao, Shuofeng and Mı, Chris and Nascenzi, Thomas and Cuatt, Timothy and Winter, Tyler and Guibert, Alexandre T. and Cronk, Ashley and Kim, Hyunsun A. and Meng, Ying Shirley and Hwang, John T.}, + title = {Large-Scale Multidisciplinary Design Optimization of an eVTOL Aircraft using Comprehensive Analysis}, + booktitle = {AIAA SCITECH 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-0146}, + selected = {true} +} + +@inproceedings{orndorff2023airtaxi, + author = {Orndorff, Nicholas C. and Sarojini, Darshan and Scotzniovsky, Luca and Gill, Hyunjune and Lee, Seongkyu and Cheng, Zeyu and Zhao, Shuofeng and Mı, Chris and Hwang, John T.}, + title = {Air-taxi transition trajectory optimization with physics-based models}, + booktitle = {AIAA SCITECH 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-0324} +} + +@article{xie2023certificationconstrained, + author = {Xie, Jiacheng and Cai, Yu and Sarojini, Darshan and Harrison, Evan and Mavris, Dimitri N.}, + title = {Certification-Constrained Vertical Tail Sizing and Power Split Optimization for Distributed Electric Propulsion Aircraft}, + journal = {Journal of Aircraft}, + year = {2023}, + volume = {60}, + number = {4}, + pages = {1272--1289}, + doi = {10.2514/1.c037239} +} + +@inproceedings{swaminathan2023integrating, + author = {Swaminathan, Rajashekar and Sarojini, Darshan and Hwang, John T.}, + title = {Integrating {MBSE} and {MDO} through an Extended Requirements-Functional-Logical-Physical ({RFLP}) Framework}, + booktitle = {AIAA AVIATION 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-3908} +} + +@inproceedings{anderson2023aerostructural, + author = {Anderson, Ryan and Ning, Andrew and Xiang, Ru and Schie, Sebastiaan P. van and Sperry, Mark and Sarojini, Darshan and Kamensky, David and Hwang, John T.}, + title = {Aerostructural Predictions Combining {FEniCS} and a Viscous Vortex Particle Method}, + booktitle = {AIAA SCITECH 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-1193} +} + +@inproceedings{nascenzi2023physicsbased, + author = {Nascenzi, Thomas and Cuatt, Timothy and Winter, Tyler and Ruh, Marius L. and Sarojini, Darshan and Hwang, John T. and Kiani, Sarina}, + title = {Physics-based Surrogate Models for Urban Air Mobility Vehicle Weight Prediction}, + booktitle = {AIAA SCITECH 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-1360} +} + +@inproceedings{sarojini2023towards, + author = {Sarojini, Darshan and Burrows, Cyd and Thomas, Kimberly and Mizumoto, Claire}, + title = {Towards Developing a Guide to Choosing National High-Performance Computing Resources}, + booktitle = {Practice and Experience in Advanced Research Computing}, + year = {2023}, + pages = {382--385}, + doi = {10.1145/3569951.3597549} +} + +@inproceedings{sabeti2023generating, + author = {Sabeti, Shaadi and Nascenzi, Thomas and Cuatt, Timothy and Winter, Tyler and Ruh, Marius L. and Sarojini, Darshan and Hwang, John T.}, + title = {Generating Structural Weight Estimation Equations for a Category of {UAM} Aircraft}, + booktitle = {AIAA AVIATION 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-4280} +} + +@inproceedings{solano2023computationally, + author = {Solano, David and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Computationally Efficient Analysis and Sizing of the {PEGASUS} and Truss-Braced Wing Structures Subjected to Dynamic Loads}, + booktitle = {AIAA AVIATION 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-3943} +} + +@misc{ruh2023largescale, + author = {Ruh, Marius L. and Sarojini, Darshan and Fletcher, Andrew and Asher, Isaac and Hwang, John T.}, + title = {Large-scale multidisciplinary design optimization of the {NASA} lift-plus-cruise concept using a novel aircraft design framework}, + howpublished = {arXiv (Cornell University)}, + year = {2023}, + doi = {10.48550/arxiv.2304.14889} +} + +@inproceedings{huang2023efficient, + author = {Huang, Zeyu and Sarojini, Darshan and Hwang, John T.}, + title = {Efficient Gradient-Based Optimization of Differential-Algebraic Equation Systems}, + booktitle = {AIAA SCITECH 2023 Forum}, + year = {2023}, + doi = {10.2514/6.2023-0532} +} + +@article{pokhrel2023conceptual, + author = {Pokhrel, Manish and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Conceptual aero-structural design of a fan stage under distorted flow}, + journal = {Proceedings of the Institution of Mechanical Engineers Part G Journal of Aerospace Engineering}, + year = {2023}, + volume = {237}, + number = {11}, + pages = {2545--2560}, + doi = {10.1177/09544100231153910} +} + +@inproceedings{dietz2023scaling, + author = {Dietz, Daniel T. and Sarojini, Darshan and Gharbi, Aroua and Weakley, Le Mai}, + title = {Scaling Up: Growth of the Indy Student Cluster Competition}, + booktitle = {Practice and Experience in Advanced Research Computing}, + year = {2023}, + pages = {359--362}, + doi = {10.1145/3569951.3597591} +} + +@article{perron2022manifold, + author = {Perron, Christian and Sarojini, Darshan and Rajaram, Dushhyanth and Corman, Jason A. and Mavris, Dimitri N.}, + title = {Manifold alignment-based multi-fidelity reduced-order modeling applied to structural analysis}, + journal = {Structural and Multidisciplinary Optimization}, + year = {2022}, + volume = {65}, + number = {8}, + doi = {10.1007/s00158-022-03274-1} +} + +@article{solano2022adjointbased, + author = {Solano, David and Sarojini, Darshan and Rajaram, Dushhyanth and Mavris, Dimitri N.}, + title = {Adjoint-based analysis and optimization of beam-like structures subjected to dynamic loads}, + journal = {Structural and Multidisciplinary Optimization}, + year = {2022}, + volume = {65}, + number = {2}, + doi = {10.1007/s00158-021-03141-5} +} + +@inproceedings{kallou2022application, + author = {Kallou, Evanthia and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Application of Set-Based Design Principles on Multi-Level Aircraft Design Space Exploration}, + booktitle = {AIAA AVIATION 2022 Forum}, + year = {2022}, + doi = {10.2514/6.2022-3848} +} + +@inproceedings{xie2022vertical, + author = {Xie, Jiacheng and Cai, Yu and Sarojini, Darshan and Harrison, Evan and Mavris, Dimitri N.}, + title = {Vertical Tail Sizing and Power Split Optimization for the {PEGASUS} Concept Considering Certification Requirements}, + booktitle = {AIAA AVIATION 2022 Forum}, + year = {2022}, + doi = {10.2514/6.2022-3204} +} + +@inproceedings{sarojini2022structural, + author = {Sarojini, Darshan and Solano, David and Mavris, Dimitri N.}, + title = {Structural Layout Design Space Exploration and Structural Sizing of Aircraft Wingbox}, + booktitle = {AIAA SCITECH 2022 Forum}, + year = {2022}, + doi = {10.2514/6.2022-1026} +} + +@inproceedings{sarojini2022indyscc, + author = {Sarojini, Darshan and Gharbi, Aroua}, + title = {{IndySCC}: A New Student Cluster Competition That Broadens Participation}, + booktitle = {Practice and Experience in Advanced Research Computing}, + year = {2022}, + pages = {1--4}, + doi = {10.1145/3491418.3535153} +} + +@inproceedings{sarojini2022parametric, + author = {Sarojini, Darshan and Solano, David and Corman, Jason A. and Mavris, Dimitri N.}, + title = {Parametric Wingbox Structural Weight Estimation of the {CRM}, {PEGASUS} and Truss-Braced Wing Concepts}, + booktitle = {AIAA AVIATION 2022 Forum}, + year = {2022}, + doi = {10.2514/6.2022-4054} +} + +@article{bendarkar2021offnominal, + author = {Bendarkar, Mayank V. and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Off-Nominal Performance and Reliability of Novel Aircraft Concepts During Early Design}, + journal = {Journal of Aircraft}, + year = {2021}, + volume = {59}, + number = {2}, + pages = {400--414}, + doi = {10.2514/1.c036395} +} + +@article{sarojini2021structural, + author = {Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Structural Analysis and Optimization of Wings Subjected to Dynamic Loads}, + journal = {AIAA Journal}, + year = {2021}, + volume = {60}, + number = {2}, + pages = {1013--1023}, + doi = {10.2514/1.j060931} +} + +@article{xie2021certificationdriven, + author = {Xie, Jiacheng and Sarojini, Darshan and Cai, Yu and Corman, Jason A. and Mavris, Dimitri N.}, + title = {Certification-Driven Platform for Multidisciplinary Design Space Exploration in Airframe Preliminary Design}, + journal = {Journal of Aircraft}, + year = {2021}, + volume = {59}, + number = {2}, + pages = {329--349}, + doi = {10.2514/1.c036328} +} + +@inproceedings{bendarkar2021evaluation, + author = {Bendarkar, Mayank V. and Sarojini, Darshan and Harrison, Evan and Mavris, Dimitri N.}, + title = {Evaluation of Off-Nominal Performance and Reliability of a Distributed Electric Propulsion Aircraft during Early Design}, + booktitle = {AIAA Scitech 2021 Forum}, + year = {2021}, + doi = {10.2514/6.2021-1723} +} + +@inproceedings{sarojini2021dynamic, + author = {Sarojini, Darshan and Harrison, Evan and Mavris, Dimitri N.}, + title = {Dynamic Environment for Loads Prediction and Handling Investigation ({DELPHI})}, + booktitle = {AIAA Scitech 2021 Forum}, + year = {2021}, + doi = {10.2514/6.2021-0326} +} + +@inproceedings{solano2021parametric, + author = {Solano, David and Sarojini, Darshan and Corman, Jason A.}, + title = {Parametric Structural Weight Estimation for the {PEGASUS} Concept Considering Dynamic Aeroelastic Effects}, + booktitle = {AIAA AVIATION 2021 FORUM}, + year = {2021}, + doi = {10.2514/6.2021-3086} +} + +@inproceedings{sarojini2020certificationdriven, + author = {Sarojini, Darshan and Xie, Jiacheng and Cai, Yu and Corman, Jason A. and Mavris, Dimitri N.}, + title = {A Certification-Driven Platform for Multidisciplinary Design Space Exploration in Airframe Early Preliminary Design}, + booktitle = {AIAA AVIATION 2020 FORUM}, + year = {2020}, + doi = {10.2514/6.2020-3157} +} + +@inproceedings{jing2020dynamic, + author = {Jing, Xiao and Berthon, Benjamin and Somers, Luke and Rairigh, Geoffrey and Morgan, James and Sarojini, Darshan and Harrison, Evan and Mavris, Dimitri N.}, + title = {Dynamic Simulation of Vehicle Maneuvers for Loads Analysis}, + booktitle = {AIAA AVIATION 2020 FORUM}, + year = {2020}, + doi = {10.2514/6.2020-2651} +} + +@inproceedings{sarojini2020adjointbased, + author = {Sarojini, Darshan and Rajaram, Dushhyanth and Solano, David and Mavris, Dimitri N.}, + title = {Adjoint-Based Structural Optimization for Beam-Like Structures Subjected to Dynamic Loads}, + booktitle = {AIAA Scitech 2020 Forum}, + year = {2020}, + doi = {10.2514/6.2020-0273} +} + +@inproceedings{solano2020structural, + author = {Solano, David and Sarojini, Darshan and Corman, Jason A. and Mavris, Dimitri N.}, + title = {Structural Sizing of Unconventional Aircraft under Static and Dynamic Aeroelastic Loading}, + booktitle = {AIAA Scitech 2020 Forum}, + year = {2020}, + doi = {10.2514/6.2020-0274} +} + +@inproceedings{pokhrel2020conceptual, + author = {Pokhrel, Manish and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Conceptual Level Optimization of a Fan Stage Under Distortion Considering Aero-structural Constraints}, + booktitle = {AIAA AVIATION 2020 FORUM}, + year = {2020}, + doi = {10.2514/6.2020-3115} +} + +@inproceedings{sarojini2020efficient, + author = {Sarojini, Darshan and Gupta, Mohit and Hodges, Dewey H. and Mavris, Dimitri N.}, + title = {An Efficient Method to Dimensionally Reduce Aperiodic Inhomogeneous 3-D Structures to 1-D Beam-Like Structures}, + booktitle = {AIAA Scitech 2020 Forum}, + year = {2020}, + doi = {10.2514/6.2020-0272} +} + +@article{gupta2019beam, + author = {Gupta, Mohit and Sarojini, Darshan and Shah, Aarohi and Hodges, Dewey H.}, + title = {Beam Theory for Asymptotic Analysis of Aperiodic and Inhomogeneous Structures}, + journal = {AIAA Journal}, + year = {2019}, + volume = {57}, + number = {10}, + pages = {4155--4168}, + doi = {10.2514/1.j057563} +} + +@inproceedings{karagoz2019design, + author = {Karagoz, Esma and Tai, Jimmy C. and Sarojini, Darshan and Mavris, Dimitri N.}, + title = {Design Space Reduction using Clustering in Aircraft Engine Design}, + booktitle = {2019 IEEE Aerospace Conference}, + year = {2019}, + pages = {1--8}, + doi = {10.1109/aero.2019.8741654} +} + +@inproceedings{corman2019estimating, + author = {Corman, Jason A. and Sarojini, Darshan and Gharbi, Aroua and Mavris, Dimitri N.}, + title = {Estimating Jig Shape for an Aircraft Wing Determined Through Aerodynamic Shape Optimization with Rigid Body Assumptions}, + booktitle = {AIAA Scitech 2019 Forum}, + year = {2019}, + doi = {10.2514/6.2019-0418} +} + +@inproceedings{sarojini2018framework, + author = {Sarojini, Darshan and Duca, Ruxandra and Solano, David and Chakraborty, Imon and Briceño, Simon I. and Mavris, Dimitri N.}, + title = {Framework to Assess Effects of Structural Flexibility on Dynamic Loads Developed in Maneuvering Aircraft}, + booktitle = {2018 Aviation Technology, Integration, and Operations Conference}, + year = {2018}, + doi = {10.2514/6.2018-4147} +} + +@inproceedings{gupta2018dimensional, + author = {Gupta, Mohit and Sarojini, Darshan and Shah, Aarohi and Hodges, Dewey H.}, + title = {Dimensional Reduction Technique for Analysis of Aperiodic Inhomogeneous Structures}, + booktitle = {2018 AIAA/ASCE/AHS/ASC Structures, Structural Dynamics, and Materials Conference}, + year = {2018}, + doi = {10.2514/6.2018-0698} +} + +@inproceedings{duca2018effects, + author = {Duca, Ruxandra and Sarojini, Darshan and Bloemer, Sebastian and Chakraborty, Imon and Briceño, Simon I. and Mavris, Dimitri N.}, + title = {Effects of Epistemic Uncertainty on Empennage Loads During Dynamic Maneuvers}, + booktitle = {2018 AIAA Aerospace Sciences Meeting}, + year = {2018}, + doi = {10.2514/6.2018-0767} +} + +@inproceedings{gharbi2017single, + author = {Gharbi, Aroua and Sarojini, Darshan and Kallou, Evanthia and Harper, Dustin J. and Petitgenet, Victor and Rancourt, David and Briceño, Simon I. and Mavris, Dimitri N.}, + title = {A Single Digital Thread Approach to Aircraft Detailed Design}, + booktitle = {55th AIAA Aerospace Sciences Meeting}, + year = {2017}, + doi = {10.2514/6.2017-0693} +} + +@inproceedings{goron2017simulationbased, + author = {Goron, Gael and Duca, Ruxandra and Sarojini, Darshan and Shah, Somil and Chakraborty, Imon and Briceño, Simon I. and Mavris, Dimitri N.}, + title = {A Simulation-Based Framework for Structural Loads Assessment during Dynamic Maneuvers}, + booktitle = {17th AIAA Aviation Technology, Integration, and Operations Conference}, + year = {2017}, + doi = {10.2514/6.2017-3767} +} + +@inproceedings{sarojini2017requirements, + author = {Sarojini, Darshan and Collins, Kyle and Mavris, Dimitri N.}, + title = {Requirements Analysis for Design Optimization of Aerobatic Aircraft}, + booktitle = {55th AIAA Aerospace Sciences Meeting}, + year = {2017}, + doi = {10.2514/6.2017-0462} +} + +@article{sarojini2016statically, + author = {Sarojini, Darshan and Lassche, T.J. and Herder, Just L. and Ananthasuresh, G. K.}, + title = {Statically balanced compliant two-port bistable mechanism}, + journal = {Mechanism and Machine Theory}, + year = {2016}, + volume = {102}, + pages = {1--13}, + doi = {10.1016/j.mechmachtheory.2016.03.016} +} + +@phdthesis{sarojini2021thesis, + author = {Sarojini, Darshan}, + title = {Structural Analysis and Optimization of Aircraft Wings through Dimensional Reduction}, + school = {Georgia Institute of Technology}, + year = {2021} +} diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..4ba3af6 --- /dev/null +++ b/_config.yml @@ -0,0 +1,718 @@ +# ----------------------------------------------------------------------------- +# Site settings +# ----------------------------------------------------------------------------- + +title: IDOpt Lab # the website title (if blank, full name will be used instead) +first_name: Darshan +middle_name: +last_name: Sarojini +contact_note: > + Email is the best way to reach me. +description: > # the ">" symbol means to ignore newlines until "footer_text:" + Intelligent Design Optimization Lab — advancing the science and practice of engineering design. +footer_text: > + Powered by Jekyll with al-folio theme. + Hosted by GitHub Pages. +keywords: aircraft design, MDAO, MBSE, multidisciplinary design optimization, certification-driven design, Virginia Tech # add your own keywords or leave empty +lang: en # the language of your site (for example: en, fr, cn, ru, etc.) +icon: ⚛️ # the emoji used as the favicon (alternatively, provide image name in /assets/img/) +apple_touch_icon: # image name in /assets/img/ (or a rooted path / absolute URL) used for iOS home-screen bookmarks; needs a real 180x180 PNG, since Safari ignores the emoji favicon above. Left empty, iOS falls back to a screenshot of the page. + +# Root user site: baseurl MUST stay empty. Swapping to a custom domain later is a +# CNAME file + DNS change plus the url below — no content changes needed. +url: https://idopt-lab.github.io # the base hostname & protocol for your site +baseurl: "" # the subpath of your site, e.g. /blog/. Leave blank for root +last_updated: false # set to true if you want to display last updated in the footer +impressum_path: # set to path to include impressum link in the footer, use the same path as permalink in a page, helps to conform with EU GDPR +back_to_top: true # set to false to disable the back to top button + +# ----------------------------------------------------------------------------- +# Theme +# ----------------------------------------------------------------------------- + +# repo color theme +repo_theme_light: default # https://github.com/stats-organization/github-stats-extended/blob/master/packages/core/src/themes/README.md +repo_theme_dark: dark # https://github.com/stats-organization/github-stats-extended/blob/master/packages/core/src/themes/README.md +# Off by default: addresses are then split at build time so the HTML contains no +# `user@host` and no `mailto:` for harvesters to scrape, and clicking one copies +# it to the clipboard instead of opening a mail client. +# See "Protecting email addresses from scrapers" in docs/CUSTOMIZE.md. +protect_email: false + +# Off by default: the free public github-profile-trophy instance is disabled +# (its Vercel deployment answers HTTP 402 / DEPLOYMENT_DISABLED), so every trophy +# image 404s. The project itself is still open source and free — self-host it and +# point external_services.github_profile_trophy_url at your instance, then set +# enabled: true. See docs/CUSTOMIZE.md. +repo_trophies: + enabled: false + theme_light: flat # https://github.com/ryo-ma/github-profile-trophy + theme_dark: gitdimmed # https://github.com/ryo-ma/github-profile-trophy + +# External service URLs for repository page +# To use a different instance or service for displaying GitHub stats and trophies, +# update these URLs. These are used in the repository templates. +external_services: + github_readme_stats_url: https://github-stats-extended.vercel.app + github_profile_trophy_url: https://github-profile-trophy.vercel.app + +# ----------------------------------------------------------------------------- +# al-folio API (v1.x) +# ----------------------------------------------------------------------------- + +al_folio: + api_version: 1 + style_engine: tailwind + tailwind: + version: 4.1.18 + preflight: false + css_entry: assets/tailwind/app.css + distill: + engine: distillpub-template + source: al-org-dev/distill-template#al-folio + allow_remote_loader: false + features: + cv: + # Off until there is a real _data/cv.yml — the demo file shipped as Einstein's + # record and was removed rather than published as placeholder biography data. + enabled: false + distill: + enabled: true + compat: + bootstrap: + enabled: false + support_window: v1.0-v1.2 + deprecates_in: v1.3 + removed_in: v2.0 + upgrade: + channel: stable + auto_apply_safe_fixes: false + +# ----------------------------------------------------------------------------- +# RSS Feed +# ----------------------------------------------------------------------------- +# will use title and url fields +# Take a look to https://github.com/jekyll/jekyll-feed for more customization + +# ----------------------------------------------------------------------------- +# Layout +# ----------------------------------------------------------------------------- + +navbar_fixed: true +footer_fixed: true +search_enabled: true +socials_in_search: true +posts_in_search: true +bib_search: true + +# Dimensions +max_width: 930px + +# ----------------------------------------------------------------------------- +# Open Graph & Schema.org +# ----------------------------------------------------------------------------- +# Display links to the page with a preview object on social media. +# see https://schema.org/docs/faq.html for more information +serve_og_meta: false # Include Open Graph meta tags in the HTML head +serve_schema_org: false # Include Schema.org in the HTML head +og_image: # The site-wide (default for all links) Open Graph preview image + +# ----------------------------------------------------------------------------- +# Analytics and search engine verification +# ----------------------------------------------------------------------------- + +analytics: + # For Google Analytics, see https://support.google.com/analytics/answer/10447272?hl=en&ref_topic=14088998&sjid=5129943941510317771-SA#zippy=%2Cgoogle-sites + # and follow the instructions for Google Sites. You will need to create a Google Analytics property and copy the Google tag ID. + google: # your Google Analytics measurement ID (format: G-XXXXXXXXXX) + cronitor: # cronitor RUM analytics site ID (format: XXXXXXXXX) + pirsch: # your Pirsch analytics site ID (length 32 characters) + openpanel: # your Openpanel analytics client ID (format: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX) + cloudflare: # your Cloudflare Web Analytics beacon token (32 hex characters) +enable_simple_analytics: false # Simple Analytics identifies a site by its domain, so it has no ID to set above + +# For Google Search Console, see https://support.google.com/webmasters/answer/9008080?hl=en#meta_tag_verification&zippy=%2Chtml-tag +google_site_verification: # your google-site-verification ID (Google Search Console) +bing_site_verification: # out your bing-site-verification ID (Bing Webmaster) + +# ----------------------------------------------------------------------------- +# Blog +# ----------------------------------------------------------------------------- + +blog_name: al-folio # blog_name will be displayed in your blog page +blog_description: a simple whitespace theme for academics +permalink: /blog/:year/:title/ +lsi: false # produce an index for related posts + +# Pagination +pagination: + enabled: true + +related_blog_posts: + enabled: true + max_related: 5 + +# Giscus comments (RECOMMENDED) +# Follow instructions on https://giscus.app/ to setup for your repo to fill out the information below. +giscus: + repo: # / + repo_id: # leave empty or specify your repo_id (see https://giscus.app/) + category: Comments # name of the category under which discussions will be created + category_id: # leave empty or specify your category_id (see https://giscus.app/) + mapping: title # identify discussions by post title + strict: 1 # use strict identification mode + reactions_enabled: 1 # enable (1) or disable (0) emoji reactions + input_position: bottom # whether to display input form below (bottom) or above (top) the comments + dark_theme: dark # name of the dark color scheme (preferred works well with al-folio dark mode) + light_theme: light # name of the light color scheme (preferred works well with al-folio light mode) + emit_metadata: 0 + lang: en + +# Disqus comments (DEPRECATED) +disqus_shortname: al-folio # put your disqus shortname +# https://help.disqus.com/en/articles/1717111-what-s-a-shortname + +# External sources. +# If you have blog posts published on medium.com or other external sources, +# you can display them in your blog by adding a link to the RSS feed. +# Optional: Set default categories and tags for posts from each source. +external_sources: + - name: medium.com + rss_url: https://medium.com/@al-folio/feed + categories: [external-posts] + tags: [medium] + - name: Google Blog + posts: + - url: https://blog.google/technology/ai/google-gemini-update-flash-ai-assistant-io-2024/ + published_date: 2024-05-14 + categories: [external-posts] + tags: [google] + +# ----------------------------------------------------------------------------- +# Newsletter +# ----------------------------------------------------------------------------- + +newsletter: + enabled: false + endpoint: # your loops endpoint (e.g., https://app.loops.so/api/newsletter-form/YOUR-ENDPOINT) + # https://loops.so/docs/forms/custom-form + +# ----------------------------------------------------------------------------- +# Collections +# ----------------------------------------------------------------------------- + +collections: + books: + output: true + news: + defaults: + layout: post + output: true + projects: + output: true + teachings: + output: true + +# ----------------------------------------------------------------------------- +# Jekyll settings +# ----------------------------------------------------------------------------- + +# Markdown and syntax highlight +markdown: kramdown +highlighter: rouge +kramdown: + input: GFM + syntax_highlighter_opts: + css_class: "highlight" + span: + line_numbers: false + block: + line_numbers: false + start_line: 1 + +# Includes & excludes +include: ["_pages"] +exclude: + - AGENTS.md + - al-folio-upgrade-report.md + - bin/ + - CLAUDE.md + - Dockerfile + - docker-compose.yml + - docker-compose-slim.yml + - docs/ + - Gemfile + - Gemfile.lock + - LICENSE + - lighthouse_results/ + - package.json + - package-lock.json + - _pages/about_einstein.md + - purgecss.config.js + - README.md + - readme_preview/ + - gems/ + - migrations/ + - vendor +keep_files: + - CNAME + - .nojekyll + +# Use al_folio_core as the theme runtime; local files can still override theme files. +theme: al_folio_core + +# Plug-ins +plugins: + - jekyll-3rd-party-libraries + - jekyll-archives-v2 + - jekyll-cache-bust + - jekyll-email-protect + - jekyll-feed + - jekyll-get-json + - jekyll-imagemagick + - jekyll-jupyter-notebook + - jekyll-link-attributes + - jekyll-minifier + - jekyll-paginate-v2 + - jekyll-regex-replace + - jekyll/scholar + - jekyll-sitemap + - jekyll-socials + - jekyll-tabs + - jekyll-terser + - jekyll-toc + - jekyll-twitter-plugin + - jemoji + + # al-folio plugins + - al_folio_core + - al_icons + - al_folio_cv + - al_folio_distill + - al_folio_upgrade + - al_folio_bootstrap_compat + - al_cookie + - al_analytics + - al_citations + - al_ext_posts + - al_img_tools + - al_search + - al_charts + - al_math + - al_comments + - al_newsletter + - al_email_protect + - al_marimo + - al_rtl + +# Sitemap settings +defaults: + - scope: + path: "assets" + values: + sitemap: false + +sass: + style: compressed + +# ----------------------------------------------------------------------------- +# Jekyll Minifier +# ----------------------------------------------------------------------------- + +jekyll-minifier: + compress_javascript: false # set to false since we are using terser as the js minifier + # CSS is already minified upstream (Tailwind build ships tailwind.css; main.scss is compiled + # with sass `style: compressed`). Re-minifying via cssminify2 mangles Tailwind v4 spacing + # tokens inside calc(), turning `var(--spacing)` into the invalid `var( - - spacing)` and + # breaking every spacing/positioning utility (e.g. .fixed-top -> broken navbar). Disable it. + compress_css: false + # JS minification is delegated to jekyll-terser (compress_javascript above is false). + # interactive-visualization/ is hand-written x3dom markup copied through as static + # files. Minifying it risks breaking the inline 3D scene markup, so leave it alone. + exclude: ["robots.txt", "interactive-visualization/*"] + +# ----------------------------------------------------------------------------- +# Terser +# ----------------------------------------------------------------------------- + +terser: + compress: + drop_console: true + +# ----------------------------------------------------------------------------- +# Jekyll Archives +# ----------------------------------------------------------------------------- + +jekyll-archives: + posts: + enabled: [year, tags, categories] # enables year, tag and category archives (remove if you need to disable one of them). + permalinks: + year: "/blog/:year/" + tags: "/blog/:type/:name/" + categories: "/blog/:type/:name/" + books: + enabled: [year, tags, categories] # enables year, tag and category archives (remove if you need to disable one of them). + +display_tags: ["formatting", "images", "links", "math", "code", "blockquotes"] # these tags will be displayed on the front page of your blog +display_categories: ["external-services"] # these categories will be displayed on the front page of your blog + +# ----------------------------------------------------------------------------- +# Jekyll Scholar +# ----------------------------------------------------------------------------- + +scholar: + last_name: [Sarojini] + first_name: [Darshan, D.] + + style: apa + locale: en + + source: /_bibliography/ + bibliography: papers.bib + bibliography_template: bib + # Note: if you have latex math in your bibtex, the latex filter + # preprocessing may conflict with MathJAX if the latter is enabled. + # See https://github.com/alshedivat/al-folio/issues/357. + bibtex_filters: [latex, smallcaps, superscript] + + replace_strings: true + join_strings: true + + details_dir: bibliography + details_link: Details + + query: "@*" + group_by: year + group_order: descending + +# Display different badges withs stats for your publications +# Customize badge behavior in _layouts/bib.liquid +enable_publication_badges: + altmetric: true # Altmetric badge (Customization options: https://badge-docs.altmetric.com/index.html) + dimensions: true # Dimensions badge (Customization options: https://badge.dimensions.ai/) + google_scholar: true # Google Scholar badge (https://scholar.google.com/intl/en/scholar/citations.html) + inspirehep: true # Inspire HEP badge (https://help.inspirehep.net/knowledge-base/citation-metrics/) + +# Filter out certain bibtex entry keywords used internally from the bib output +filtered_bibtex_keywords: + [ + abbr, + abstract, + additional_info, + altmetric, + annotation, + arxiv, + award, + award_name, + bibtex_show, + blog, + code, + dimensions, + eprint, + google_scholar_id, + hal, + html, + inspirehep_id, + pdf, + pmid, + poster, + preview, + selected, + slides, + supp, + video, + website, + ] + +# Maximum number of authors to be shown for each publication (more authors are visible on click) +max_author_limit: 3 # leave blank to always show all authors +more_authors_animation_delay: 10 # more authors are revealed on click using animation; smaller delay means faster animation + +# Enables publication thumbnails. If disabled, none of the publications will display thumbnails, even if specified in the bib entry. +enable_publication_thumbnails: true + +# ----------------------------------------------------------------------------- +# Jekyll Link Attributes +# ----------------------------------------------------------------------------- + +# These are the defaults +external_links: + enabled: true + rel: external nofollow noopener + target: _blank + exclude: + +# ----------------------------------------------------------------------------- +# Responsive WebP Images +# ----------------------------------------------------------------------------- + +# MAKE SURE imagemagick is installed and on your PATH before enabling imagemagick. In a terminal, run: +# convert -version +imagemagick: + enabled: true # enables responsive images for your site (recommended, see https://github.com/alshedivat/al-folio/issues/537) + widths: + - 480 + - 800 + - 1400 + input_directories: + - assets/img/ + input_formats: + - ".jpg" + - ".jpeg" + - ".png" + - ".tiff" + - ".gif" + output_formats: + webp: "-auto-orient -quality 85" + +# Lazy loading images +# If you enable lazy loading, all images will add the loading="lazy" attribute. +# This will make your site load faster, but it may not be supported in all browsers. +# You can also set loading="" to other values for specific images to override the default behavior. +# Options: "auto", "eager", "lazy" +# See https://web.dev/browser-level-image-lazy-loading/ for more information. +lazy_loading_images: true # enables lazy loading of images (recommended) + +# ----------------------------------------------------------------------------- +# Optional Features +# ----------------------------------------------------------------------------- + +enable_google_verification: false # enables google site verification +enable_bing_verification: false # enables bing site verification +enable_cookie_consent: false # enables GDPR-compliant cookie consent dialog (https://github.com/orestbida/cookieconsent) +enable_masonry: true # enables automatic project cards arrangement +enable_math: true # enables math typesetting (uses MathJax) +enable_tooltips: false # enables automatic tooltip links generated for each section titles on pages and posts +enable_darkmode: true # enables switching between light/dark modes +enable_navbar_social: false # enables displaying social links in the navbar on the about page +enable_project_categories: true # enables categorization of projects into multiple categories +enable_medium_zoom: true # enables image zoom feature (as on medium.com) +enable_progressbar: true # enables a horizontal progress bar linked to the vertical scroll position +enable_video_embedding: false # enables video embedding for bibtex entries. If false, the button opens the video link in a new window. + +# ----------------------------------------------------------------------------- +# Library versions +# ----------------------------------------------------------------------------- + +# Add the url, version and integrity hash of the libraries you use in your site. +# The integrity hash is used to ensure that the library is not tampered with. +# Integrity hashes not provided by the libraries were generated using https://www.srihash.org/ +third_party_libraries: + download: false # if true, download the versions of the libraries specified below and use the downloaded files + bootstrap-table: + integrity: + css: "sha256-uRX+PiRTR4ysKFRCykT8HLuRCub26LgXJZym3Yeom1c=" + js: "sha256-4rppopQE9POKfukn2kEvhJ9Um25Cf6+IDVkARD0xh78=" + url: + css: "https://cdn.jsdelivr.net/npm/bootstrap-table@{{version}}/dist/bootstrap-table.min.css" + js: "https://cdn.jsdelivr.net/npm/bootstrap-table@{{version}}/dist/bootstrap-table.min.js" + version: "1.22.4" + fontawesome: + integrity: + css: "sha256-MVopmdyC2tYTiJ8wlktf0uh0v4NgT+vNdyVFepi7Q0c=" + url: + css: "https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@{{version}}/css/all.min.css" + version: "7.2.0" + academicons: + integrity: + css: "sha256-SzrCOBJbGVFMahewkgjwnApaV2+av1DwMAA+/QGLyZw=" + url: + css: "https://cdn.jsdelivr.net/npm/academicons@{{version}}/css/academicons.min.css" + version: "1.9.5" + chartjs: + integrity: + js: "sha256-0q+JdOlScWOHcunpUk21uab1jW7C1deBQARHtKMcaB4=" + url: + js: "https://cdn.jsdelivr.net/npm/chart.js@{{version}}/dist/chart.umd.min.js" + version: "4.4.1" + d3: + integrity: + js: "sha256-1rA678n2xEx7x4cTZ5x4wpUCj6kUMZEZ5cxLSVSFWxw=" + url: + js: "https://cdn.jsdelivr.net/npm/d3@{{version}}/dist/d3.min.js" + version: "7.8.5" + diff2html: + integrity: + css: "sha256-IMBK4VNZp0ivwefSn51bswdsrhk0HoMTLc2GqFHFBXg=" + js: "sha256-eU2TVHX633T1o/bTQp6iIJByYJEtZThhF9bKz/DcbbY=" + url: + css: "https://cdn.jsdelivr.net/npm/diff2html@{{version}}/bundles/css/diff2html.min.css" + js: "https://cdn.jsdelivr.net/npm/diff2html@{{version}}/bundles/js/diff2html-ui.min.js" + version: "3.4.47" + echarts: + integrity: + js: + library: "sha256-QvgynZibb2U53SsVu98NggJXYqwRL7tg3FeyfXvPOUY=" + dark_theme: "sha256-sm6Ui9w41++ZCWmIWDLC18a6ki72FQpWDiYTDxEPXwU=" + url: + js: + library: "https://cdn.jsdelivr.net/npm/echarts@{{version}}/dist/echarts.min.js" + dark_theme: "https://cdn.jsdelivr.net/npm/echarts@{{version}}/theme/dark-fresh-cut.js" + version: "5.5.0" + google_fonts: + url: + fonts: "https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Roboto+Slab:100,300,400,500,700|Material+Icons&display=swap" + highlightjs: + integrity: + css: + light: "sha256-Oppd74ucMR5a5Dq96FxjEzGF7tTw2fZ/6ksAqDCM8GY=" + dark: "sha256-nyCNAiECsdDHrr/s2OQsp5l9XeY2ZJ0rMepjCT2AkBk=" + url: + css: + light: "https://cdn.jsdelivr.net/npm/highlight.js@{{version}}/styles/github.min.css" + dark: "https://cdn.jsdelivr.net/npm/highlight.js@{{version}}/styles/github-dark.min.css" + version: "11.9.0" + imagesloaded: + integrity: + js: "sha256-htrLFfZJ6v5udOG+3kNLINIKh2gvoKqwEhHYfTTMICc=" + url: + js: "https://cdn.jsdelivr.net/npm/imagesloaded@{{version}}/imagesloaded.pkgd.min.js" + version: "5.0.0" + jquery: + integrity: + js: "sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" + url: + js: "https://cdn.jsdelivr.net/npm/jquery@{{version}}/dist/jquery.min.js" + version: "3.6.0" + leaflet: + integrity: + css: "sha256-q9ba7o845pMPFU+zcAll8rv+gC+fSovKsOoNQ6cynuQ=" + js: "sha256-MgH13bFTTNqsnuEoqNPBLDaqxjGH+lCpqrukmXc8Ppg=" + js_map: "sha256-YAoQ3FzREN4GmVENMir8vgHHypC0xfSK3CAxTHCqx1M=" + local: + images: "images/" + url: + css: "https://cdn.jsdelivr.net/npm/leaflet@{{version}}/dist/leaflet.min.css" + images: "https://cdn.jsdelivr.net/npm/leaflet@{{version}}/dist/images/" + js: "https://cdn.jsdelivr.net/npm/leaflet@{{version}}/dist/leaflet.min.js" + js_map: "https://cdn.jsdelivr.net/npm/leaflet@{{version}}/dist/leaflet.js.map" + version: "1.9.4" + masonry: + integrity: + js: "sha256-Nn1q/fx0H7SNLZMQ5Hw5JLaTRZp0yILA/FRexe19VdI=" + url: + js: "https://cdn.jsdelivr.net/npm/masonry-layout@{{version}}/dist/masonry.pkgd.min.js" + version: "4.2.2" + mdb: + integrity: + css: "sha256-jpjYvU3G3N6nrrBwXJoVEYI/0zw8htfFnhT9ljN3JJw=" + css_map: "sha256-iYYMNfsJdVZjvsebJulg09miBXM4/GMTJgv1u5EZFFM=" + js: "sha256-NdbiivsvWt7VYCt6hYNT3h/th9vSTL4EDWeGs5SN3DA=" + js_map: "sha256-UPgyn4YNsT0khkBK5553QwhnlbTlU0aa+igyc6qP1bE=" + url: + css: "https://cdn.jsdelivr.net/npm/mdbootstrap@{{version}}/css/mdb.min.css" + css_map: "https://cdn.jsdelivr.net/npm/mdbootstrap@{{version}}/css/mdb.min.css.map" + js: "https://cdn.jsdelivr.net/npm/mdbootstrap@{{version}}/js/mdb.min.js" + js_map: "https://cdn.jsdelivr.net/npm/mdbootstrap@{{version}}/js/mdb.min.js.map" + version: "4.20.0" + mermaid: + integrity: + js: "sha256-TtLOdUA8mstPoO6sGvHIGx2ceXrrX4KgIItO06XOn8A=" + url: + js: "https://cdn.jsdelivr.net/npm/mermaid@{{version}}/dist/mermaid.min.js" + version: "10.7.0" + mathjax: + integrity: + js: "sha256-MASABpB4tYktI2Oitl4t+78w/lyA+D7b/s9GEP0JOGI=" + local: + fonts: "output/chtml/fonts/woff-v2/" + url: + fonts: "https://cdn.jsdelivr.net/npm/mathjax@{{version}}/es5/output/chtml/fonts/woff-v2/" + js: "https://cdn.jsdelivr.net/npm/mathjax@{{version}}/es5/tex-mml-chtml.js" + version: "3.2.2" + tikzjax: + integrity: + css: "sha256-p+CQrhSq3dnLHELDcVBFDf4whOor3w8gzLuc/pwRLyQ=" + js: "sha256-7SCmUR11IG4MkSoeLUq0pombv7oeV7yZuu7Z82e4Uy4=" + url: + css: "https://cdn.jsdelivr.net/npm/@planktimerr/tikzjax@{{version}}/dist/fonts.css" + js: "https://cdn.jsdelivr.net/npm/@planktimerr/tikzjax@{{version}}/dist/tikzjax.js" + version: "1.0.8" + tocbot: + integrity: + css: "sha256-zTN0r+0OKaIv2xqeNNIYxNk0pWJ6+IqPGc1iDgVzWF0=" + js: "sha256-lo/r+jQ81wWrxdIiiiEEd538z4+dTJTt+leOuAS7GCw=" + url: + css: "https://cdn.jsdelivr.net/npm/tocbot@{{version}}/dist/tocbot.css" + js: "https://cdn.jsdelivr.net/npm/tocbot@{{version}}/dist/tocbot.min.js" + version: "4.36.4" + plotly: + integrity: + js: "sha256-oy6Be7Eh6eiQFs5M7oXuPxxm9qbJXEtTpfSI93dW16Q=" + url: + js: "https://cdn.jsdelivr.net/npm/plotly.js@{{version}}/dist/plotly.min.js" + version: "3.0.1" + pseudocode: + integrity: + css: "sha256-VwMV//xgBPDyRFVSOshhRhzJRDyBmIACniLPpeXNUdc=" + js: "sha256-aVkDxqyzrB+ExUsOY9PdyelkDhn/DfrjWu08aVpqNlo=" + url: + css: "https://cdn.jsdelivr.net/npm/pseudocode@{{version}}/build/pseudocode.min.css" + js: "https://cdn.jsdelivr.net/npm/pseudocode@{{version}}/build/pseudocode.min.js" + version: "2.4.1" + scholar-icons: + integrity: + css: "sha256-VY3hHVj/hNX3fYG6wtbA6TcKJQl7+FthzGSyIB64klY=" + url: + css: "https://cdn.jsdelivr.net/npm/scholar-icons@{{version}}/css/scholar-icons.css" + version: "1.0.3" + vanilla-back-to-top: + integrity: + js: "sha256-uMJJ3EoTyfRBoTbR+lrfu1uRQ87RZG8AR3cVNuQVeFg=" + url: + js: "https://cdn.jsdelivr.net/npm/vanilla-back-to-top@{{version}}/dist/vanilla-back-to-top.min.js" + version: "7.2.1" + vanilla-cookieconsent: + integrity: + css: "sha256-ygRrixsQlBByBZiOcJamh7JByO9fP+/l5UPtKNJmRsE=" + js: "sha256-vG4vLmOB/AJbJ6awr7Wg4fxonG+fxAp4cIrbIFTvRXU=" + url: + css: "https://cdn.jsdelivr.net/npm/vanilla-cookieconsent@{{version}}/dist/cookieconsent.css" + js: "https://cdn.jsdelivr.net/npm/vanilla-cookieconsent@{{version}}/dist/cookieconsent.umd.js" + version: "3.1.0" + vega: + integrity: + js: "sha256-Yot/cfgMMMpFwkp/5azR20Tfkt24PFqQ6IQS+80HIZs=" + js_map: "sha256-z0x9ICA65dPkZ0JVa9wTImfF6n7AJsKc6WlFE96/wNA=" + url: + js: "https://cdn.jsdelivr.net/npm/vega@{{version}}/build/vega.min.js" + js_map: "https://cdn.jsdelivr.net/npm/vega@{{version}}/build/vega.min.js.map" + version: "5.27.0" + vega-embed: + integrity: + js: "sha256-FPCJ9JYCC9AZSpvC/t/wHBX7ybueZhIqOMjpWqfl3DU=" + js_map: "sha256-VBbfSEFYSMdX/rTdGrONEHNP6BprCB7H/LpMMNt/cPA=" + url: + js: "https://cdn.jsdelivr.net/npm/vega-embed@{{version}}/build/vega-embed.min.js" + js_map: "https://cdn.jsdelivr.net/npm/vega-embed@{{version}}/build/vega-embed.min.js.map" + version: "6.24.0" + vega-lite: + integrity: + js: "sha256-TvBvIS5jUN4BSy009usRjNzjI1qRrHPYv7xVLJyjUyw=" + js_map: "sha256-l2I4D5JC23Ulsu6e3sKVe5AJ+r+DFkzkKnZS8nUGz28=" + url: + js: "https://cdn.jsdelivr.net/npm/vega-lite@{{version}}/build/vega-lite.min.js" + js_map: "https://cdn.jsdelivr.net/npm/vega-lite@{{version}}/build/vega-lite.min.js.map" + version: "5.16.3" + +# ----------------------------------------------------------------------------- +# Get external JSON data +# ----------------------------------------------------------------------------- + +jekyll_get_json: + - data: resume + json: assets/json/resume.json # it can also be an url + +jsonresume: + - basics + - work + - education + - publications + - projects + - volunteer + - awards + - certificates + - skills + - languages + - interests + - references diff --git a/_data/coauthors.yml b/_data/coauthors.yml new file mode 100644 index 0000000..b5c15f1 --- /dev/null +++ b/_data/coauthors.yml @@ -0,0 +1,5 @@ +# Maps author surnames to canonical first-name variants and a link. +# Example: +# "sarojini": +# - firstname: ["Darshan", "D."] +# url: https://www.aoe.vt.edu/people/faculty/darshan-sarojini.html diff --git a/_data/people.yml b/_data/people.yml new file mode 100644 index 0000000..1492ffa --- /dev/null +++ b/_data/people.yml @@ -0,0 +1,61 @@ +# Lab roster. Adding a member = appending an entry under the right group. +# Groups render in the order listed in _pages/people.md. +# +# Fields: name (required), topic, grad (expected graduation), note (awards, +# fellowships), url (personal page), email. + +pi: + - name: Darshan Sarojini + role: Assistant Professor, Aerospace and Ocean Engineering + email: sdarshan@vt.edu + url: https://www.aoe.vt.edu/people/faculty/darshan-sarojini.html + +phd: + - name: Grant Lee + topic: Vehicle-Operations Co-Design for Regional Air Mobility + - name: Khoa D. Nguyen + topic: Autonomous Battery Units for Urban Air Mobility + +bsms: + - name: Joseph Gould + topic: Certification-Driven Aircraft Design + grad: Dec 2026 + - name: Nathan M. Shune + topic: Multidisciplinary Aircraft Design and Trajectory Optimization + grad: Dec 2026 + - name: Joel George + topic: Structural Optimization + grad: May 2027 + - name: Krish D. Bhatt + topic: Agent-Based Modeling for Multi-modal Transportation + grad: Dec 2027 + - name: Jeremy John + topic: Ship Design Optimization + grad: May 2027 + note: DoW SMART Scholar; 2025 Fincantieri Scholar + - name: Quinn McIver + topic: Off-Nominal Reliability in Aircraft Design + grad: May 2027 + +ms: + - name: Emma Paulter + topic: Hypersonic Waveriders Optimization + grad: Dec 2026 + - name: Casey Chamberlain + topic: Conceptual Aircraft Design Tools + grad: Dec 2027 + - name: Dylan Hogge + topic: Hybrid-Electric Aircraft Design + grad: Dec 2027 + +undergrad: + - name: Sanjana Anem + topic: Aircraft Design Visualization in VR + grad: May 2028 + +alumni: + - name: Naman Kumar Shetty + topic: Flight Dynamics Framework + note: MS, May 2026 + - name: Ethan J. Phillips + topic: Flight Simulation and VR diff --git a/_data/socials.yml b/_data/socials.yml new file mode 100644 index 0000000..059df0c --- /dev/null +++ b/_data/socials.yml @@ -0,0 +1,11 @@ +# Social links shown in the footer / about page, in the order defined here. +# See https://github.com/george-gca/jekyll-socials for the full field list. +email: sdarshan@vt.edu +scholar_userid: BmotoisAAAAJ # Google Scholar ID +github_username: Idopt-Lab +rss_icon: true # comment this line to hide the RSS icon + +# TODO: add if you want them shown — +# orcid_id: +# linkedin_username: +# cv_pdf: /assets/pdf/your_cv.pdf # drop the file in assets/pdf/ first diff --git a/_data/venues.yml b/_data/venues.yml new file mode 100644 index 0000000..0d111c2 --- /dev/null +++ b/_data/venues.yml @@ -0,0 +1 @@ +# Optional per-venue styling for the publications page. diff --git a/_news/2026-09-01-oceans.md b/_news/2026-09-01-oceans.md new file mode 100644 index 0000000..b83633d --- /dev/null +++ b/_news/2026-09-01-oceans.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-09-01 +inline: true +related_posts: false +--- + +Attending the OCEANS 2026 conference in Monterey, CA. diff --git a/_pages/404.md b/_pages/404.md new file mode 100644 index 0000000..f0d9804 --- /dev/null +++ b/_pages/404.md @@ -0,0 +1,9 @@ +--- +layout: page +permalink: /404.html +title: "Page not found" +description: "Looks like there has been a mistake. Nothing exists here." +redirect: true +--- + +You will be redirected to the main page within 3 seconds. If not redirected, please go back to the [home page]({{ site.baseurl | prepend: site.url }}). diff --git a/_pages/about.md b/_pages/about.md new file mode 100644 index 0000000..76d11f6 --- /dev/null +++ b/_pages/about.md @@ -0,0 +1,44 @@ +--- +layout: about +title: about +permalink: / +subtitle: Intelligent Design Optimization Lab · Aerospace and Ocean Engineering, Virginia Tech + +profile: + align: right + # TODO: drop a photo at assets/img/prof_pic.jpg and uncomment the line below. + # The al-folio demo image that shipped here has been removed. + # image: prof_pic.jpg + image_circular: false + more_info: > +

Darshan Sarojini

+

Assistant Professor

+

sdarshan@vt.edu

+ +selected_papers: true # includes a list of papers marked as "selected={true}" +social: true # includes social icons at the bottom of the page + +announcements: + enabled: true # includes a list of news items + scrollable: true + limit: 5 + +latest_posts: + enabled: false + scrollable: true + limit: 3 +--- + +We work on advancing the science and practice of engineering design — improving how complex engineering systems are conceived, analyzed, and optimized. + +Aircraft are the prime example: shaped by the missions they fly and the environments they operate in, spanning aerodynamics, propulsion, structures, and controls at once, and held to rigorous certification standards. Analyzing them well means treating them as multidisciplinary systems rather than a collection of separately optimized parts. We develop the methods, algorithms, and software to address those challenges. + +### Research expertise + +- **Certification-Driven Design** — treating certification criteria as constraints that shape the feasible design space, rather than checks applied after the fact. +- **Integration of MDAO and MBSE** — connecting multidisciplinary design, analysis, and optimization with model-based systems engineering. +- **Multimodal Transportation Systems** — assessing how new air vehicles interact with the wider transportation network. + +### Joining the lab + +I am recruiting students and researchers, including research assistantships, teaching positions, and postdoctoral opportunities. See [openings](/join/) for how to get in touch. diff --git a/_pages/join.md b/_pages/join.md new file mode 100644 index 0000000..73bca40 --- /dev/null +++ b/_pages/join.md @@ -0,0 +1,24 @@ +--- +layout: page +title: join +permalink: /join/ +description: Openings in the Intelligent Design Optimization Lab. +nav: true +nav_order: 6 +--- + +I am actively recruiting students and researchers. Current opportunities include **graduate research assistantships**, **teaching positions**, and **postdoctoral appointments**. + +## Prospective graduate students + +If your interests overlap with [our research](/research/) — multidisciplinary design optimization, certification-driven design, model-based systems engineering, or multimodal transportation — please get in touch. Include your CV and a short note on what you would like to work on. + + + +**Email:** sdarshan@vt.edu + +## Current Virginia Tech students + +Undergraduate and Master's students at Virginia Tech interested in research are welcome to email directly. Several lab members joined through the accelerated BS/MS program — see [people](/people/) for the kinds of projects students take on. diff --git a/_pages/news.md b/_pages/news.md new file mode 100644 index 0000000..6223439 --- /dev/null +++ b/_pages/news.md @@ -0,0 +1,7 @@ +--- +layout: page +title: news +permalink: /news/ +--- + +{% include news.liquid %} diff --git a/_pages/people.md b/_pages/people.md new file mode 100644 index 0000000..c48bea2 --- /dev/null +++ b/_pages/people.md @@ -0,0 +1,49 @@ +--- +layout: page +title: people +permalink: /people/ +description: The Intelligent Design Optimization Lab. +nav: true +nav_order: 4 +--- + + + +{% assign groups = "phd,bsms,ms,undergrad,alumni" | split: "," %} +{% assign labels = "PhD Students,Accelerated BS/MS Students,Master's Students,Undergraduate Researchers,Alumni" | split: "," %} + +{% assign pi = site.data.people.pi %} +{% if pi %} + +## Principal Investigator + +{% for p in pi %} + +**{% if p.url %}[{{ p.name }}]({{ p.url }}){% else %}{{ p.name }}{% endif %}**{% if p.role %} — {{ p.role }}{% endif %}{% if p.email %} +
{{ p.email }}{% endif %} +{% endfor %} +{% endif %} + +{% for g in groups %} +{% assign members = site.data.people[g] %} +{% if members and members.size > 0 %} + +## {{ labels[forloop.index0] }} + +
    +{% for p in members %} +
  • + {% if p.url %}{{ p.name }}{% else %}{{ p.name }}{% endif %} + {%- if p.topic %} — {{ p.topic }}{% endif -%} + {%- if p.grad %} (expected {{ p.grad }}){% endif -%} + {%- if p.note %}
    {{ p.note }}{% endif -%} +
  • +{% endfor %} +
+{% endif %} +{% endfor %} + +--- + +Interested in joining? See the [openings](/join/). diff --git a/_pages/projects.md b/_pages/projects.md new file mode 100644 index 0000000..0184a70 --- /dev/null +++ b/_pages/projects.md @@ -0,0 +1,65 @@ +--- +layout: page +title: research +permalink: /research/ +description: Projects underway in the Intelligent Design Optimization Lab. +nav: true +nav_order: 2 +display_categories: [ongoing, completed] +horizontal: false +--- + + +
+{% if site.enable_project_categories and page.display_categories %} + + {% for category in page.display_categories %} + +

{{ category }}

+
+ {% assign categorized_projects = site.projects | where: "category", category %} + {% assign sorted_projects = categorized_projects | sort: "importance" %} + + {% if page.horizontal %} +
+
+ {% for project in sorted_projects %} + {% include projects_horizontal.liquid %} + {% endfor %} +
+
+ {% else %} +
+ {% for project in sorted_projects %} + {% include projects.liquid %} + {% endfor %} +
+ {% endif %} + {% endfor %} + +{% else %} + + + +{% assign sorted_projects = site.projects | sort: "importance" %} + + + +{% if page.horizontal %} + +
+
+ {% for project in sorted_projects %} + {% include projects_horizontal.liquid %} + {% endfor %} +
+
+ {% else %} +
+ {% for project in sorted_projects %} + {% include projects.liquid %} + {% endfor %} +
+ {% endif %} +{% endif %} +
diff --git a/_pages/publications.md b/_pages/publications.md new file mode 100644 index 0000000..48027f8 --- /dev/null +++ b/_pages/publications.md @@ -0,0 +1,20 @@ +--- +layout: page +permalink: /publications/ +title: publications +description: publications by categories in reversed chronological order. generated by jekyll-scholar. +nav: true +nav_order: 2 +--- + + + + + +{% include bib_search.liquid %} + +
+ +{% bibliography %} + +
diff --git a/_pages/teaching.md b/_pages/teaching.md new file mode 100644 index 0000000..db6f053 --- /dev/null +++ b/_pages/teaching.md @@ -0,0 +1,31 @@ +--- +layout: page +title: teaching +permalink: /teaching/ +description: Courses taught and teaching activities. +nav: true +nav_order: 5 +--- + +## Virginia Tech + +- **AOE 4065 — Air Vehicle Design I** · Fall 2024, Fall 2025 +- **AOE 4066 — Air Vehicle Design II** · Spring 2025, Spring 2026 + +Reference material for the Air Vehicle Design sequence is published in the [AVD Reference Library](/air-vehicle-design/), organized by design-process phase. + +## University of California San Diego + +- **MAE 155A — Aerospace Engineering Design I** · Winter 2023 — lecture on systems engineering +- **MAE 270 — Multidisciplinary Design Optimization** · Winter 2023 — lecture on topology optimization + +## Georgia Institute of Technology + +- **AE 6344 — Aircraft Design II** · Spring 2021, Spring 2022 — lectures on structural analysis, structural sizing, and multidisciplinary design optimization +- **AE 6394 — System of Systems Engineering Applications** · Spring 2021 — teaching assistant +- **AE 4351 — AE Design Project II** · Spring 2017 — teaching assistant +- **AE 4350 — AE Design Project I** · Fall 2016 — teaching assistant + +## Teaching preparation + +Completed the **Tech to Teaching** certificate through Georgia Tech's Center for Teaching and Learning, comprising two graduate-level pedagogy courses and a capstone teaching experience. diff --git a/_projects/1_regional_air_mobility.md b/_projects/1_regional_air_mobility.md new file mode 100644 index 0000000..5991555 --- /dev/null +++ b/_projects/1_regional_air_mobility.md @@ -0,0 +1,13 @@ +--- +layout: page +title: Regional Air Mobility in Appalachia +description: A framework for increased accessibility in overburdened communities +importance: 1 +category: ongoing +--- + +**Sponsor:** NASA (September 2025 – August 2028) +**PI:** Darshan Sarojini +**Collaborators:** Dr. Antonio Trani (Virginia Tech), Marshall University, Vertx Partners + +This project develops methods to assess the impact of regional air mobility (RAM) on overburdened regions across the country. diff --git a/_projects/2_certification_driven_design.md b/_projects/2_certification_driven_design.md new file mode 100644 index 0000000..18f44c6 --- /dev/null +++ b/_projects/2_certification_driven_design.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Certification-Driven Aircraft Design +description: Embedding certification criteria directly into conceptual design +importance: 2 +category: ongoing +--- + +Certification criteria shape the feasible design space and, therefore, must be embedded directly into conceptual aircraft design, not simply checked after the fact. + +This work incorporates certification requirements — including reliability, handling qualities, and regulatory simulations — into multidisciplinary aircraft design frameworks. diff --git a/_projects/3_advanced_visualization.md b/_projects/3_advanced_visualization.md new file mode 100644 index 0000000..c7851a6 --- /dev/null +++ b/_projects/3_advanced_visualization.md @@ -0,0 +1,13 @@ +--- +layout: page +title: Advanced Visualization Methods for Design +description: Web-based tools for 3D geometry and scientific data +importance: 3 +category: ongoing +--- + +**Collaborators:** MathWorks, VT ARC Visionarium + +This initiative creates web-based tools for displaying three-dimensional geometries and scientific data within integrated analytical interfaces. + +Worked examples are published in the lab's [interactive visualization gallery](/interactive-visualization/). diff --git a/_projects/4_ocean_vehicle_mdo.md b/_projects/4_ocean_vehicle_mdo.md new file mode 100644 index 0000000..41f3b9b --- /dev/null +++ b/_projects/4_ocean_vehicle_mdo.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Design Optimization of Ocean Vehicles +description: Large-scale MDO methods applied to maritime vessels +importance: 4 +category: ongoing +--- + +**Sponsor:** Fincantieri (Summer 2025 Fincantieri scholarship; recipient: Jeremy John) + +This research applies multidisciplinary design optimization techniques developed for aerospace to maritime vessel design. diff --git a/_projects/5_break_apart_uas.md b/_projects/5_break_apart_uas.md new file mode 100644 index 0000000..6dc8c73 --- /dev/null +++ b/_projects/5_break_apart_uas.md @@ -0,0 +1,13 @@ +--- +layout: page +title: Break-Apart Mechanisms for UAS +description: Commanded in-flight disassembly of unmanned aerial systems +importance: 5 +category: ongoing +--- + +**Sponsor:** Prius Intelli LLC +**PI:** Dr. Rakesh Kapania +**Phase I:** January 1 – July 15, 2025 · **Phase II:** July 16 – December 31, 2025 + +Our group is engaged in developing mechanisms that enable Unmanned Aerial Systems (UAS) to safely disassemble in flight under controlled, commanded conditions. diff --git a/assets/bibliography/2018-12-22-distill.bib b/assets/bibliography/2018-12-22-distill.bib new file mode 100644 index 0000000..2b06f3c --- /dev/null +++ b/assets/bibliography/2018-12-22-distill.bib @@ -0,0 +1,7 @@ +@article{gregor2015draw, + title={DRAW: A recurrent neural network for image generation}, + author={Gregor, Karol and Danihelka, Ivo and Graves, Alex and Rezende, Danilo Jimenez and Wierstra, Daan}, + journal={arXiv preprint, arXiv:1502.04623}, + year={2015}, + url={https://arxiv.org/pdf/1502.04623.pdf} +} diff --git a/assets/html/relativity.html b/assets/html/relativity.html new file mode 100644 index 0000000..7d3472a --- /dev/null +++ b/assets/html/relativity.html @@ -0,0 +1,10 @@ + + +
+

Relativity: the Special and General Theory

+
Albert Einstein
+
+ Insert HTML document here. +
+ + diff --git a/assets/json/resume.json b/assets/json/resume.json new file mode 100644 index 0000000..d974bb6 --- /dev/null +++ b/assets/json/resume.json @@ -0,0 +1,221 @@ +{ + "basics": { + "name": "Albert Einstein", + "label": "Scientist", + "image": "", + "email": "einstein@example.com", + "phone": "(912) 123-4567", + "summary": "A German-born theoretical physicist, widely ranked among the greatest and most influential scientists of all time", + "location": { + "address": "2712 Broadway St", + "postalCode": "CA 94115", + "city": "San Francisco", + "countryCode": "US", + "region": "California" + }, + "profiles": [] + }, + "work": [ + { + "name": "Institute for Advanced Study, Princeton University", + "position": "Professor of Theoretical Physics", + "location": "Princeton University, NJ", + "startDate": "1933-01-01", + "endDate": "1955-01-01", + "summary": "Teaching at Palmer Physical Laboratory (now 302 Frist Campus Center). While not a professor at Princeton, I associated with the physics professors and continued to give lectures on campus.", + "highlights": ["Relativity", "Description 2."] + }, + { + "name": "California Institute of Technology", + "position": "Visiting Professor", + "location": "Pasadena, California, US", + "startDate": "1933-01-01", + "endDate": "1933-01-01", + "summary": "", + "highlights": ["Description 1.", "Description 2."] + }, + { + "name": "Kaiser Wilhelm Institute for Physics", + "position": "Director", + "location": "Berlin, Germany", + "startDate": "1917-01-01", + "endDate": "1933-01-01", + "summary": "", + "highlights": [] + }, + { + "name": "Karl-Ferdinand University", + "position": "Professor of Theoretical Physics", + "location": "Prague, Czechoslovakia", + "startDate": "1911-01-01", + "endDate": "1917-01-01", + "summary": "", + "highlights": [] + }, + { + "name": "University of Zurich", + "position": "Associate Professor of Theoretical Physics", + "location": "Zurich, Switzerland", + "startDate": "1909-01-01", + "endDate": "1911-01-01", + "summary": "", + "highlights": [] + } + ], + "volunteer": [ + { + "organization": "People's Climate March", + "location": "Zurich, Switzerland", + "position": "Lead Organizer", + "startDate": "2014-04-01", + "endDate": "2015-07-01", + "summary": "Lead organizer for the New York City branch of the People's Climate March, the largest climate march in history.", + "highlights": ["Awarded 'Climate Hero' award by Greenpeace for my efforts organizing the march.", "Men of the year 2014 by Time magazine"] + } + ], + "education": [ + { + "institution": "University of Zurich", + "location": "Zurich, Switzerland", + "url": "https://www.uzh.ch/", + "area": "Physics", + "studyType": "PhD", + "startDate": "1900-01-01", + "endDate": "1905-01-01", + "score": "", + "courses": ["Theory of Relativity"], + "highlights": ["Description 1.", "Description 2."] + }, + { + "institution": "Eidgenössische Technische Hochschule", + "location": "Zurich, Switzerland", + "area": "Physics", + "studyType": "Federal teaching diploma", + "startDate": "1896-01-01", + "endDate": "1900-01-01", + "score": "", + "courses": [], + "highlights": ["Description 1.", "Description 2."] + } + ], + "awards": [ + { + "title": "Nobel Prize in Physics", + "date": "1921-11-01", + "awarder": "Royal Swedish Academy of Sciences", + "url": "https://www.nobelprize.org/prizes/physics/1921/einstein/biographical/", + "summary": "The Nobel Prizes are five separate prizes that, according to Alfred Nobel's will of 1895, are awarded to 'those who, during the preceding year, have conferred the greatest benefit to humankind.'" + }, + { + "title": "Max Planck Medal", + "date": "2029-01-01", + "awarder": "German Physical Society", + "summary": "" + } + ], + "certificates": [ + { + "name": "Machine Learning", + "date": "2018-01-01", + "issuer": "Stanford University", + "icon": "fa-solid fa-location-dot" + }, + { + "name": "Quantum Computing", + "date": "2018-01-01", + "issuer": "Stanford University", + "icon": "fa-solid fa-tag" + }, + { + "name": "Quantum Information", + "date": "2018-01-01", + "issuer": "Stanford University", + "icon": "fa-solid fa-envelope" + } + ], + "publications": [ + { + "name": "Zur Elektrodynamik bewegter Körper", + "publisher": "Annalen der Physik", + "releaseDate": "1905-06-30", + "url": "https://en.wikisource.org/wiki/Translation:On_the_Electrodynamics_of_Moving_Bodies", + "summary": "It concerned an interpretation of the Michelson–Morley experiment and the properties of light and time. Special relativity incorporates the principle that the speed of light is the same for all inertial observers regardless of the state of motion of the source." + }, + { + "name": "Über einen die Erzeugung und Verwandlung des Lichtes betreffenden heuristischen Gesichtspunkt", + "publisher": "Annalen der Physik", + "releaseDate": "1905-03-18", + "url": "https://de.wikisource.org/wiki/Über_einen_die_Erzeugung_und_Verwandlung_des_Lichtes_betreffenden_heuristischen_Gesichtspunkt", + "summary": "In the second paper, he applied the quantum theory to light to explain the photoelectric effect. In particular, he used the idea of light quanta (photons) to explain experimental results, but stressed the importance of the experimental results. The importance of his work on the photoelectric effect earned him the Nobel Prize in Physics in 1921." + }, + { + "name": "Die Grundlage der allgemeinen Relativitätstheorie", + "publisher": "Annalen der Physik", + "releaseDate": "1916-03-20", + "url": "https://de.wikisource.org/wiki/Die_Grundlage_der_allgemeinen_Relativitätstheorie", + "summary": "The publication of the theory of general relativity made him internationally famous. He was professor of physics at the universities of Zurich (1909–1911) and Prague (1911–1912), before he returned to ETH Zurich (1912–1914)." + } + ], + "skills": [ + { + "name": "Physics", + "level": "Master", + "icon": "fa-solid fa-hashtag", + "keywords": [ + "Quantum Mechanics", + "Quantum Computing", + "Quantum Information", + "Quantum Cryptography", + "Quantum Communication", + "Quantum Teleportation" + ] + } + ], + "languages": [ + { + "language": "German", + "fluency": "Native speaker", + "icon": "" + }, + { + "language": "English", + "fluency": "Fluent", + "icon": "" + } + ], + "interests": [ + { + "name": "Physics", + "icon": "fa-solid fa-tag", + "keywords": [ + "Quantum Mechanics", + "Quantum Computing", + "Quantum Information", + "Quantum Cryptography", + "Quantum Communication", + "Quantum Teleportation" + ] + } + ], + "references": [ + { + "name": "Professor John Doe", + "icon": "fa-solid fa-laptop", + "reference": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit." + }, + { + "name": "Professor Jane Smith", + "icon": "fa-solid fa-thumbtack", + "reference": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit." + } + ], + "projects": [ + { + "name": "Quantum Computing", + "summary": "Quantum computing is the use of quantum-mechanical phenomena such as superposition and entanglement to perform computation. Computers that perform quantum computations are known as quantum computers.", + "highlights": ["Quantum Teleportation", "Quantum Cryptography"], + "startDate": "2018-01-01", + "endDate": "2018-01-01" + } + ] +} diff --git a/assets/json/table_data.json b/assets/json/table_data.json new file mode 100644 index 0000000..a44a088 --- /dev/null +++ b/assets/json/table_data.json @@ -0,0 +1,128 @@ +[ + { + "id": 0, + "name": "Item 0", + "price": "$0", + "amount": 3 + }, + { + "id": 1, + "name": "Item 1", + "price": "$1", + "amount": 4 + }, + { + "id": 2, + "name": "Item 2", + "price": "$2", + "amount": 8 + }, + { + "id": 3, + "name": "Item 3", + "price": "$3", + "amount": 2 + }, + { + "id": 4, + "name": "Item 4", + "price": "$4", + "amount": 90 + }, + { + "id": 5, + "name": "Item 5", + "price": "$5", + "amount": 2 + }, + { + "id": 6, + "name": "Item 6", + "price": "$6", + "amount": 3 + }, + { + "id": 7, + "name": "Item 7", + "price": "$7", + "amount": 7 + }, + { + "id": 8, + "name": "Item 8", + "price": "$8", + "amount": 39 + }, + { + "id": 9, + "name": "Item 9", + "price": "$9", + "amount": 78 + }, + { + "id": 10, + "name": "Item 10", + "price": "$10", + "amount": 30 + }, + { + "id": 11, + "name": "Item 11", + "price": "$11", + "amount": 32 + }, + { + "id": 12, + "name": "Item 12", + "price": "$12", + "amount": 12 + }, + { + "id": 13, + "name": "Item 13", + "price": "$13", + "amount": 76 + }, + { + "id": 14, + "name": "Item 14", + "price": "$14", + "amount": 10 + }, + { + "id": 15, + "name": "Item 15", + "price": "$15", + "amount": 9 + }, + { + "id": 16, + "name": "Item 16", + "price": "$16", + "amount": 8 + }, + { + "id": 17, + "name": "Item 17", + "price": "$17", + "amount": 1 + }, + { + "id": 18, + "name": "Item 18", + "price": "$18", + "amount": 99 + }, + { + "id": 19, + "name": "Item 19", + "price": "$19", + "amount": 100 + }, + { + "id": 20, + "name": "Item 20", + "price": "$20", + "amount": 109 + } +] diff --git a/assets/jupyter/blog.ipynb b/assets/jupyter/blog.ipynb new file mode 100644 index 0000000..bc870dc --- /dev/null +++ b/assets/jupyter/blog.ipynb @@ -0,0 +1,48 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "sys.version_info(major=3, minor=6, micro=2, releaselevel='final', serial=0)" + ] + }, + "execution_count": 1, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import sys\n", + "sys.version_info" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.2" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/assets/pdf/example_pdf.pdf b/assets/pdf/example_pdf.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b1f80dbf28c0a576191ab1a642c52a3396bbfd6b GIT binary patch literal 15879 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 literal 0 HcmV?d00001 diff --git a/assets/rendercv/design.yaml b/assets/rendercv/design.yaml new file mode 100644 index 0000000..9488f71 --- /dev/null +++ b/assets/rendercv/design.yaml @@ -0,0 +1,7 @@ +# for more options, see https://docs.rendercv.com/user_guide/yaml_input_structure/design/ +design: + theme: classic + page: + size: a4 + show_footer: false + show_top_note: false diff --git a/assets/rendercv/locale.yaml b/assets/rendercv/locale.yaml new file mode 100644 index 0000000..ea11927 --- /dev/null +++ b/assets/rendercv/locale.yaml @@ -0,0 +1,3 @@ +# for more options, see https://docs.rendercv.com/user_guide/yaml_input_structure/locale/ +locale: + language: english diff --git a/assets/rendercv/rendercv_output/Albert_Einstein_CV.pdf b/assets/rendercv/rendercv_output/Albert_Einstein_CV.pdf new file mode 100644 index 0000000000000000000000000000000000000000..52aab0e4faa01e90b05bca7797b1739eb5a61f99 GIT binary patch literal 71513 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%0DV9Ly-xXt0phXr!fw*7 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 [name ...] +// +// Passing one or more names limits the run to those shots. + +const { chromium } = require("playwright"); +const path = require("path"); + +const BASE = (process.argv[2] || "http://127.0.0.1:4000/al-folio").replace(/\/$/, ""); +const OUT = process.argv[3] || "readme_preview"; +const ONLY = process.argv.slice(4); + +// height is the capture viewport, chosen per page so the shot ends on a +// sensible boundary instead of mid-paragraph. Full-page captures were tried and +// render as unreadable ribbons in the README. +const SHOTS = [ + { name: "al-folio-preview", url: "/", theme: "light", height: 900 }, + { name: "light", url: "/", theme: "light", height: 1000 }, + { name: "dark", url: "/", theme: "dark", height: 1000 }, + { name: "cv", url: "/cv/", theme: "light", height: 1100 }, + { name: "people", url: "/people/", theme: "light", height: 950 }, + { name: "publications", url: "/publications/", theme: "light", height: 1100 }, + { name: "projects", url: "/projects/", theme: "light", height: 1000 }, + { name: "blog", url: "/blog/", theme: "light", height: 1100 }, + { name: "repositories", url: "/repositories/", theme: "light", height: 1100, settle: 9000 }, + { name: "distill", url: "/blog/2021/distill/", theme: "light", height: 1100 }, + { name: "math", url: "/blog/2015/math/", theme: "light", height: 1000, settle: 6000 }, + { name: "code", url: "/blog/2015/code/", theme: "light", height: 1000 }, + { name: "jupyter", url: "/blog/2023/jupyter-notebook/", theme: "light", height: 1000 }, + { name: "photos-screenshot", url: "/projects/1_project/", theme: "light", height: 1100, settle: 6000 }, +]; + +(async () => { + const browser = await chromium.launch({ args: ["--no-sandbox"] }); + let failures = 0; + + for (const shot of SHOTS) { + if (ONLY.length && !ONLY.includes(shot.name)) continue; + + const ctx = await browser.newContext({ + viewport: { width: 1280, height: shot.height }, + // Retina capture; GitHub downscales cleanly and the text stays crisp. + deviceScaleFactor: 2, + colorScheme: shot.theme === "dark" ? "dark" : "light", + reducedMotion: "reduce", + }); + + // The theme is driven by localStorage -> data-theme-setting on . + // Setting it before first paint avoids capturing a flash of the wrong theme. + await ctx.addInitScript((t) => { + try { + localStorage.setItem("theme", t); + } catch (e) { + /* private mode */ + } + }, shot.theme); + + const page = await ctx.newPage(); + const failedRequests = []; + // `requestfailed` only covers transport-level failures. A stylesheet or + // webfont that answers 404 or 503 completes normally and never fires it, + // and a missing CSS file is invisible to the broken-image check below — so + // watch response status codes too, or the exact degradation this script + // exists to catch slips through. + page.on("requestfailed", (r) => failedRequests.push(`${r.url()} (${(r.failure() || {}).errorText})`)); + page.on("response", (res) => { + if (res.status() >= 400) failedRequests.push(`${res.url()} (HTTP ${res.status()})`); + }); + + try { + await page.goto(BASE + shot.url, { waitUntil: "load", timeout: 60000 }); + } catch (err) { + console.error(`FAIL ${shot.name}: ${err.message.split("\n")[0]}`); + failures++; + await ctx.close(); + continue; + } + + // Let webfonts, MathJax, charts and lazy images settle. + await page.waitForTimeout(shot.settle || 4000); + try { + await page.evaluate(() => document.fonts && document.fonts.ready); + } catch (e) { + /* older engines */ + } + + // A screenshot missing its icons or emoji is worse than a stale one, so + // surface that here instead of letting it land in the README unnoticed. + const broken = await page.evaluate(() => + Array.from(document.images) + .filter((img) => img.complete && img.naturalWidth === 0) + .map((img) => img.src) + ); + + await page.screenshot({ path: path.join(OUT, `${shot.name}.png`) }); + + const notes = []; + if (broken.length) notes.push(`${broken.length} broken image(s): ${broken.slice(0, 3).join(", ")}`); + if (failedRequests.length) notes.push(`${failedRequests.length} failed request(s): ${failedRequests.slice(0, 3).join(", ")}`); + if (notes.length) { + console.error(`WARN ${shot.name}: ${notes.join(" | ")}`); + failures++; + } else { + console.log(`OK ${shot.name}`); + } + + await ctx.close(); + } + + await browser.close(); + + if (failures) { + console.error(`\n${failures} shot(s) rendered with missing assets. Not treating these as usable.`); + process.exit(1); + } +})(); diff --git a/bin/cibuild b/bin/cibuild new file mode 100644 index 0000000..d5c9e19 --- /dev/null +++ b/bin/cibuild @@ -0,0 +1 @@ +bundle exec jekyll build diff --git a/bin/deploy b/bin/deploy new file mode 100644 index 0000000..7e1df85 --- /dev/null +++ b/bin/deploy @@ -0,0 +1,119 @@ +#!/usr/bin/env bash + +# Run this script to deploy the app to Github Pages + +# Parse cmd arguments + +SRC_BRANCH="main" +DEPLOY_BRANCH="gh-pages" + +USAGE_MSG="usage: deploy [-h|--help] [-u|--user] [-s|--src SRC_BRANCH] [-d|--deploy DEPLOY_BRANCH] [--verbose] [--no-push]" + +while [[ $# > 0 ]]; do + key="$1" + + case $key in + -h|--help) + echo $USAGE_MSG + exit 0 + ;; + -u|--user) + ;; + -s|--src) + SRC_BRANCH="$2" + shift + ;; + -d|--deploy) + DEPLOY_BRANCH="$2" + shift + ;; + --verbose) + set -x + ;; + --no-push) + NO_PUSH="--no-push" + ;; + *) + echo "Option $1 is unknown." >&2 + echo $USAGE_MSG >&2 + exit 1 + ;; + esac + shift +done + +# Exit if any subcommand fails +set -e + +echo "Deploying..." +echo "Source branch: $SRC_BRANCH" +echo "Deploy branch: $DEPLOY_BRANCH" + +read -r -p "Do you want to proceed? [y/N] " response +if [[ ! $response =~ ^([yY][eE][sS]|[yY])+$ ]] +then + echo "Aborting." + [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 +fi + +# Check if there are any uncommitted changes +if ! git diff-index --quiet HEAD --; then + echo "Changes to the following files are uncommitted:" + git diff-index --name-only HEAD -- + echo "Please commit the changes before proceeding." + echo "Aborting." + [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 +fi + +# Check if there are any untracked files +if ! test -z "$(git ls-files --exclude-standard --others)"; then + echo "There are untracked files:" + git ls-files --exclude-standard --others + echo "Please commit those files or stash them before proceeding." + echo "Aborting." + [[ "$0" = "$BASH_SOURCE" ]] && exit 1 || return 1 +fi + +# Switch to source branch (creates it if necessary from the current branch) +if [ `git branch | grep $SRC_BRANCH | tr ' ' '\n' | tail -1` ] +then + git checkout $SRC_BRANCH +else + git checkout -b $SRC_BRANCH +fi + +# Checkout DEPLOY_BRANCH branch +if [ `git branch | grep $DEPLOY_BRANCH` ] +then + git branch -D $DEPLOY_BRANCH +fi +git checkout -b $DEPLOY_BRANCH + +# Export JEKYLL_ENV=production +export JEKYLL_ENV=production + +# Build site +bundle exec jekyll build + +# Purge unused css +purgecss -c purgecss.config.js + +# Delete and move files +find . -maxdepth 1 ! -name '_site' ! -name '.git' ! -name 'CNAME' ! -name '.gitignore' -exec rm -rf {} \; +mv _site/* . +rm -R _site/ + +# Create `.nojekyll` file (bypass GitHub Pages Jekyll processing) +touch .nojekyll + +# Push to DEPLOY_BRANCH +git add -fA +git commit --allow-empty -m "$(git log -1 --pretty=%B) [ci skip]" +[[ ${NO_PUSH} ]] || git push -f -q origin $DEPLOY_BRANCH + +# Move back to SRC_BRANCH +git checkout $SRC_BRANCH + +echo "Deployed successfully!" + +exit 0 diff --git a/bin/entry_point.sh b/bin/entry_point.sh new file mode 100644 index 0000000..d937f1d --- /dev/null +++ b/bin/entry_point.sh @@ -0,0 +1,50 @@ +#!/bin/bash +set -euo pipefail + +echo "Entry point script running" + +CONFIG_FILE=_config.yml +DOCKER_DESTINATION=/tmp/_site + +# Function to manage Gemfile.lock +manage_gemfile_lock() { + git config --global --add safe.directory /srv/jekyll + if command -v git &> /dev/null && [ -f Gemfile.lock ]; then + if git ls-files --error-unmatch Gemfile.lock &> /dev/null; then + echo "Gemfile.lock is tracked by git, keeping it intact" + git restore Gemfile.lock 2>/dev/null || true + else + echo "Gemfile.lock is not tracked by git, removing it" + rm Gemfile.lock + fi + fi +} + +ensure_bundle_deps() { + if bundle check >/dev/null 2>&1; then + echo "Bundler dependencies already satisfied" + return + fi + + echo "Installing missing bundler dependencies" + bundle install --jobs 4 --retry 3 +} + +start_jekyll() { + manage_gemfile_lock + ensure_bundle_deps + mkdir -p "$DOCKER_DESTINATION" + bundle exec jekyll serve --watch --port=8080 --host=0.0.0.0 --livereload --verbose --trace --force_polling --destination "$DOCKER_DESTINATION" --config "$CONFIG_FILE" & +} + +start_jekyll + +while true; do + inotifywait -q -e modify,move,create,delete $CONFIG_FILE + if [ $? -eq 0 ]; then + echo "Change detected to $CONFIG_FILE, restarting Jekyll" + jekyll_pid=$(pgrep -f jekyll) + kill -KILL $jekyll_pid + start_jekyll + fi +done diff --git a/bin/generate_star_history.py b/bin/generate_star_history.py new file mode 100644 index 0000000..3fd3d76 --- /dev/null +++ b/bin/generate_star_history.py @@ -0,0 +1,312 @@ +#!/usr/bin/env python3 +"""Render the repository's star history to committed SVGs. + +al-folio used to hotlink api.star-history.com. That service began returning +HTTP 500 for every repository, and its UI now asks visitors to paste a GitHub +token with `Contents: read and write` — a permission that can push code and is +not required to read public star data. This script removes the dependency: the +stargazer timestamps it needs are public, so the chart is generated here and +committed as a static asset that cannot fail to load or prompt for anything. + +Two files are written, light and dark, because GitHub's README renderer picks +between them with + prefers-color-scheme. A single SVG using an +internal media query does not work reliably through GitHub's image proxy. + +Usage: + python3 bin/generate_star_history.py [--repo owner/name] [--out-dir DIR] + +GITHUB_TOKEN is optional but strongly recommended: unauthenticated API access +is capped at 60 requests/hour, which is not enough for a repository with more +than a few thousand stars. +""" + +from __future__ import annotations + +import argparse +import json +import math +import os +import sys +import urllib.error +import urllib.request +from datetime import datetime, timezone + +API = "https://api.github.com" +PER_PAGE = 100 +# GitHub refuses to paginate past 400 pages on this endpoint. +MAX_PAGE = 400 +# How many pages to sample across the full range. The curve is smooth enough +# that sampling beats fetching all ~160 pages of a 16k-star repo on every push. +SAMPLES = 28 + +THEMES = { + "light": { + "bg": "#ffffff", + "text": "#000000", + "muted": "#828282", + "grid": "rgba(0,0,0,0.10)", + "accent": "#b509ac", + "fill_from": "rgba(181,9,172,0.28)", + "fill_to": "rgba(181,9,172,0.02)", + }, + "dark": { + "bg": "#1c1c1d", + "text": "#e8e8e8", + "muted": "#828282", + "grid": "#424246", + "accent": "#d94fd0", + "fill_from": "rgba(217,79,208,0.32)", + "fill_to": "rgba(217,79,208,0.02)", + }, +} + +FONT = ( + "-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue'," + "Arial,sans-serif" +) + +W, H = 820, 420 +M_L, M_R, M_T, M_B = 68, 28, 64, 48 + + +def _get(url: str, token: str | None, accept: str) -> tuple[object, dict]: + req = urllib.request.Request(url, headers={"Accept": accept, "User-Agent": "al-folio-star-history"}) + if token: + req.add_header("Authorization", f"Bearer {token}") + try: + with urllib.request.urlopen(req, timeout=30) as resp: + return json.loads(resp.read().decode()), dict(resp.headers) + except urllib.error.HTTPError as exc: + detail = exc.read().decode(errors="replace")[:200] + if exc.code == 403 and "rate limit" in detail.lower(): + raise SystemExit( + "GitHub API rate limit hit. Set GITHUB_TOKEN " + "(in Actions, pass secrets.GITHUB_TOKEN) and retry." + ) from exc + raise SystemExit(f"GET {url} failed: HTTP {exc.code}: {detail}") from exc + + +def fetch_points(repo: str, token: str | None) -> tuple[list[tuple[datetime, int]], int, bool]: + """Return ([(date, cumulative_stars)], total, truncated_by_pagination_cap).""" + meta, _ = _get(f"{API}/repos/{repo}", token, "application/vnd.github+json") + total = int(meta.get("stargazers_count", 0)) + if total == 0: + return [], 0, False + + last_page = min(math.ceil(total / PER_PAGE), MAX_PAGE) + if last_page <= SAMPLES: + pages = list(range(1, last_page + 1)) + else: + step = (last_page - 1) / (SAMPLES - 1) + pages = sorted({1, last_page} | {round(1 + i * step) for i in range(SAMPLES)}) + + star_accept = "application/vnd.github.star+json" + points: list[tuple[datetime, int]] = [] + newest: datetime | None = None + + for page in pages: + url = f"{API}/repos/{repo}/stargazers?per_page={PER_PAGE}&page={page}" + batch, _ = _get(url, token, star_accept) + if not isinstance(batch, list) or not batch: + continue + first = batch[0].get("starred_at") + if first: + # Everything on earlier pages was starred before this entry. + points.append((_parse(first), (page - 1) * PER_PAGE + 1)) + if page == last_page: + last = batch[-1].get("starred_at") + if last: + newest = _parse(last) + points.append((newest, (page - 1) * PER_PAGE + len(batch))) + + # GitHub stops paginating this endpoint at page 400, so for a repository + # with more than 40,000 stars we cannot observe when the later ones arrived. + capped = last_page >= MAX_PAGE and total > MAX_PAGE * PER_PAGE + + if capped: + # Back-dating the full total onto the last *observable* star would draw a + # vertical cliff at that old date and freeze the x-axis there, inventing + # history that was never measured. The current total on today's date is a + # fact, so anchor there and let the segment between be interpolated, the + # same approximation already used between every other sampled point. + # Truncated to midnight so reruns within a day stay byte-identical. + now = datetime.now(timezone.utc).replace(hour=0, minute=0, second=0, microsecond=0) + points.append((now, total)) + elif newest and total > points[-1][1]: + # Dated to the most recent star rather than "now", so a run on a day with + # no new stars produces a byte-identical file instead of a junk commit. + points.append((newest, total)) + + points.sort(key=lambda p: p[0]) + deduped: list[tuple[datetime, int]] = [] + for date, count in points: + if deduped and date == deduped[-1][0]: + deduped[-1] = (date, max(count, deduped[-1][1])) + else: + deduped.append((date, count)) + return deduped, total, capped + + +def _parse(value: str) -> datetime: + return datetime.strptime(value, "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=timezone.utc) + + +def _nice_ceiling(value: int) -> tuple[int, int]: + """Round an axis maximum up to something a human would pick.""" + if value <= 10: + return max(value, 1), max(value, 1) + magnitude = 10 ** (len(str(value)) - 1) + for mult in (1, 2, 2.5, 5, 10): + step = magnitude * mult / 2 + top = math.ceil(value / step) * step + if top / step <= 5: + return int(top), int(step) + return value, max(1, value // 4) + + +def _fmt_count(n: int) -> str: + if n >= 1000: + text = f"{n / 1000:.1f}".rstrip("0").rstrip(".") + return f"{text}k" + return str(n) + + +def _smooth_path(pts: list[tuple[float, float]]) -> str: + """Catmull-Rom through the points, emitted as cubic beziers.""" + if len(pts) < 2: + return "" + if len(pts) == 2: + return f"M {pts[0][0]:.2f},{pts[0][1]:.2f} L {pts[1][0]:.2f},{pts[1][1]:.2f}" + d = [f"M {pts[0][0]:.2f},{pts[0][1]:.2f}"] + for i in range(len(pts) - 1): + p0 = pts[i - 1] if i > 0 else pts[0] + p1, p2 = pts[i], pts[i + 1] + p3 = pts[i + 2] if i + 2 < len(pts) else p2 + c1 = (p1[0] + (p2[0] - p0[0]) / 6, p1[1] + (p2[1] - p0[1]) / 6) + c2 = (p2[0] - (p3[0] - p1[0]) / 6, p2[1] - (p3[1] - p1[1]) / 6) + d.append(f"C {c1[0]:.2f},{c1[1]:.2f} {c2[0]:.2f},{c2[1]:.2f} {p2[0]:.2f},{p2[1]:.2f}") + return " ".join(d) + + +def render(points: list[tuple[datetime, int]], total: int, repo: str, theme: str, capped: bool = False) -> str: + t = THEMES[theme] + plot_w, plot_h = W - M_L - M_R, H - M_T - M_B + t0, t1 = points[0][0].timestamp(), points[-1][0].timestamp() + span = max(t1 - t0, 1) + y_max, y_step = _nice_ceiling(total) + + def sx(dt: datetime) -> float: + return M_L + (dt.timestamp() - t0) / span * plot_w + + def sy(count: int) -> float: + return M_T + plot_h - (count / y_max) * plot_h + + xy = [(sx(d), sy(c)) for d, c in points] + line = _smooth_path(xy) + area = f"{line} L {xy[-1][0]:.2f},{M_T + plot_h:.2f} L {xy[0][0]:.2f},{M_T + plot_h:.2f} Z" + + grid, y_labels = [], [] + v = 0 + while v <= y_max: + y = sy(v) + grid.append(f'') + y_labels.append( + f'{_fmt_count(v)}' + ) + v += y_step + + # Tick on calendar years across the whole range, not on sampled points: + # early years are all inside page 1, so point-derived ticks skip them and + # the axis reads as though data were missing. + first_year, last_year = points[0][0].year, points[-1][0].year + every = max(1, math.ceil((last_year - first_year + 1) / 12)) + years = [ + datetime(y, 1, 1, tzinfo=timezone.utc) + for y in range(first_year, last_year + 1) + if (y - first_year) % every == 0 + ] + # Drop a tick that would collide with the axis edges. + years = [d for d in years if M_L - 1 <= sx(d) <= W - M_R + 1] + x_labels = [ + f'{d.year}' + for d in years + ] + + # Say so rather than passing off an interpolated segment as measured data. + subtitle = ( + f"{repo} · beyond {MAX_PAGE * PER_PAGE:,} stars the API stops paginating, so the tail is interpolated" + if capped + else repo + ) + + lx, ly = xy[-1] + uid = theme # keeps gradient ids unique if both files are ever inlined together + + return f""" + Star history for {repo} + + + + + + + + + + + + Star History + {subtitle} + ★ {total:,} + +{chr(10).join(" " + g for g in grid)} + + +{chr(10).join(" " + lbl for lbl in y_labels)} + + +{chr(10).join(" " + lbl for lbl in x_labels)} + + + + + + + + +""" + + +def main() -> int: + ap = argparse.ArgumentParser(description=__doc__) + ap.add_argument("--repo", default="alshedivat/al-folio") + ap.add_argument("--out-dir", default="assets/img") + args = ap.parse_args() + + token = os.environ.get("GITHUB_TOKEN") or os.environ.get("GH_TOKEN") + if not token: + print("warning: no GITHUB_TOKEN set; 60 req/hour limit may not suffice", file=sys.stderr) + + points, total, capped = fetch_points(args.repo, token) + if len(points) < 2: + print(f"error: not enough stargazer data for {args.repo} (got {len(points)} points)", file=sys.stderr) + return 1 + + os.makedirs(args.out_dir, exist_ok=True) + for theme in THEMES: + path = os.path.join(args.out_dir, f"star-history-{theme}.svg") + with open(path, "w", encoding="utf-8") as fh: + fh.write(render(points, total, args.repo, theme, capped)) + print(f"wrote {path}") + note = " [truncated by API page cap; tail interpolated]" if capped else "" + print(f"{total:,} stars, {len(points)} sampled points, {points[0][0].date()} to {points[-1][0].date()}{note}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/bin/setup-python-deps b/bin/setup-python-deps new file mode 100644 index 0000000..065cceb --- /dev/null +++ b/bin/setup-python-deps @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +echo "Installing optional Python deps for jekyll-jupyter-notebook..." +python3 -m pip install --user --break-system-packages jupyter nbconvert + +echo +echo "If your shell cannot find jupyter binaries, add this to your shell profile:" +echo ' export PATH="$HOME/Library/Python/3.14/bin:$PATH"' diff --git a/bin/update_scholar_citations.py b/bin/update_scholar_citations.py new file mode 100644 index 0000000..1c4f57c --- /dev/null +++ b/bin/update_scholar_citations.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python + +import os +import sys +import yaml +from datetime import datetime +from scholarly import scholarly + + +def load_scholar_user_id() -> str: + """Load the Google Scholar user ID from the configuration file.""" + config_file = "_data/socials.yml" + if not os.path.exists(config_file): + print( + f"Configuration file {config_file} not found. Please ensure the file exists and contains your Google Scholar user ID." + ) + sys.exit(1) + try: + with open(config_file, "r") as f: + config = yaml.safe_load(f) + scholar_user_id = config.get("scholar_userid") + if not scholar_user_id: + print( + "No 'scholar_userid' found in the configuration file. Please add 'scholar_userid' to _data/socials.yml." + ) + sys.exit(1) + return scholar_user_id + except yaml.YAMLError as e: + print( + f"Error parsing YAML file {config_file}: {e}. Please check the file for correct YAML syntax." + ) + sys.exit(1) + + +SCHOLAR_USER_ID: str = load_scholar_user_id() +OUTPUT_FILE: str = "_data/citations.yml" + + +def get_scholar_citations() -> None: + """Fetch and update Google Scholar citation data.""" + print(f"Fetching citations for Google Scholar ID: {SCHOLAR_USER_ID}") + today = datetime.now().strftime("%Y-%m-%d") + + # Check if the output file was already updated today + if os.path.exists(OUTPUT_FILE): + try: + with open(OUTPUT_FILE, "r") as f: + existing_data = yaml.safe_load(f) + if ( + existing_data + and "metadata" in existing_data + and "last_updated" in existing_data["metadata"] + ): + print(f"Last updated on: {existing_data['metadata']['last_updated']}") + if existing_data["metadata"]["last_updated"] == today: + print("Citations data is already up-to-date. Skipping fetch.") + return + except Exception as e: + print( + f"Warning: Could not read existing citation data from {OUTPUT_FILE}: {e}. The file may be missing or corrupted." + ) + + citation_data = {"metadata": {"last_updated": today}, "papers": {}} + + scholarly.set_timeout(15) + scholarly.set_retries(3) + try: + author = scholarly.search_author_id(SCHOLAR_USER_ID) + author_data = scholarly.fill(author) + except Exception as e: + print( + f"Error fetching author data from Google Scholar for user ID '{SCHOLAR_USER_ID}': {e}. Please check your internet connection and Scholar user ID." + ) + sys.exit(1) + + if not author_data: + print( + f"Could not fetch author data for user ID '{SCHOLAR_USER_ID}'. Please verify the Scholar user ID and try again." + ) + sys.exit(1) + + if "publications" not in author_data: + print(f"No publications found in author data for user ID '{SCHOLAR_USER_ID}'.") + sys.exit(1) + + for pub in author_data["publications"]: + try: + pub_id = pub.get("pub_id") or pub.get("author_pub_id") + if not pub_id: + print( + f"Warning: No ID found for publication: {pub.get('bib', {}).get('title', 'Unknown')}. This publication will be skipped." + ) + continue + + title = pub.get("bib", {}).get("title", "Unknown Title") + year = pub.get("bib", {}).get("pub_year", "Unknown Year") + citations = pub.get("num_citations", 0) + + print(f"Found: {title} ({year}) - Citations: {citations}") + + citation_data["papers"][pub_id] = { + "title": title, + "year": year, + "citations": citations, + } + except Exception as e: + print( + f"Error processing publication '{pub.get('bib', {}).get('title', 'Unknown')}': {e}. This publication will be skipped." + ) + + # Compare new data with existing data + if existing_data and existing_data.get("papers") == citation_data["papers"]: + print("No changes in citation data. Skipping file update.") + return + + try: + with open(OUTPUT_FILE, "w") as f: + yaml.dump(citation_data, f, width=1000, sort_keys=True) + print(f"Citation data saved to {OUTPUT_FILE}") + except Exception as e: + print( + f"Error writing citation data to {OUTPUT_FILE}: {e}. Please check file permissions and disk space." + ) + sys.exit(1) + + +if __name__ == "__main__": + try: + get_scholar_citations() + except Exception as e: + print(f"Unexpected error: {e}") + sys.exit(1) diff --git a/docker-compose-slim.yml b/docker-compose-slim.yml new file mode 100644 index 0000000..3bd4f46 --- /dev/null +++ b/docker-compose-slim.yml @@ -0,0 +1,12 @@ +# this file uses prebuilt image in dockerhub +services: + jekyll: + image: amirpourmand/al-folio:slim + #build: . + ports: + - 8080:8080 + - 35729:35729 + volumes: + - .:/srv/jekyll + environment: + - JEKYLL_ENV=development diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..28adda3 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,22 @@ +# this file uses prebuilt image in dockerhub +services: + jekyll: + image: amirpourmand/al-folio:latest + build: . + command: /srv/jekyll/bin/entry_point.sh + # uncomment these if you are having this issue with the build: + # /usr/local/bundle/gems/jekyll-4.3.4/lib/jekyll/site.rb:509:in `initialize': Permission denied @ rb_sysopen - /srv/jekyll/.jekyll-cache/.gitignore (Errno::EACCES) + # and fill the args values with the output of the commands on the right + # build: + # args: + # GROUPID: # id -g + # GROUPNAME: # id -gn + # USERID: # id -u + # USERNAME: # echo $USER + ports: + - 8080:8080 + - 35729:35729 + volumes: + - .:/srv/jekyll + environment: + - JEKYLL_ENV=development diff --git a/index.html b/index.html deleted file mode 100644 index 29e70a5..0000000 --- a/index.html +++ /dev/null @@ -1,169 +0,0 @@ - - - - - - IDOpt Lab - - - - - - - - -
- -
- -
-

Intelligent Design Optimization Lab

-

IDOpt Lab

-

We work on advancing the science and practice of engineering design — improving how complex engineering systems are conceived, analyzed, and optimized. Aircraft are the prime example: shaped by the missions they fly and the environments they operate in, spanning aerodynamics, propulsion and structures at once, and held to rigorous certification standards. We develop the methods, algorithms, and software to address those challenges.

-
- -
- - -
- -
- IDOpt Lab — Intelligent Design Optimization Lab -
- - - diff --git a/openalex_authors.json b/openalex_authors.json new file mode 100644 index 0000000..237e929 --- /dev/null +++ b/openalex_authors.json @@ -0,0 +1 @@ +{"meta": {"count": 2, "db_response_time_ms": 45, "page": 1, "per_page": 10, "groups_count": null, "x_query": {"oql": "authors where text has (Darshan Sarojini)", "oqo": {"get_rows": "authors", "filter_rows": [{"column_id": "text.search", "value": "Darshan Sarojini", "operator": "has"}]}, "url": "/authors?filter=text.search:Darshan Sarojini&per_page=10"}, "cost_usd": 0.001}, "results": [{"id": "https://openalex.org/A5012988947", "orcid": "https://orcid.org/0000-0003-4910-3505", "display_name": "Darshan Sarojini", "raw_author_names": ["Darshan Sarojini", "Sarojini, Darshan"], "full_name": "Sarojini, Darshan", "relevance_score": 3693.1753, "works_count": 56, "cited_by_count": 348, "summary_stats": {"2yr_mean_citedness": 3.0, "h_index": 12, "i10_index": 16}, "ids": {"openalex": "https://openalex.org/A5012988947", "orcid": "https://orcid.org/0000-0003-4910-3505"}, "affiliations": [{"institution": {"id": "https://openalex.org/I130701444", "ror": "https://ror.org/01zkghx44", "display_name": "Georgia Institute of Technology", "country_code": "US", "type": "education", "lineage": ["https://openalex.org/I130701444"]}, "years": [2023, 2022, 2021, 2020, 2019, 2018, 2017]}, {"institution": {"id": "https://openalex.org/I36258959", "ror": "https://ror.org/0168r3w48", "display_name": "University of California San Diego", "country_code": "US", "type": "education", "lineage": ["https://openalex.org/I36258959"]}, "years": [2024, 2023]}, {"institution": {"id": "https://openalex.org/I4210150894", "ror": "https://ror.org/05pmj3x43", "display_name": "Jacobs (United States)", "country_code": "US", "type": "company", "lineage": ["https://openalex.org/I4210150894"]}, "years": [2023]}, {"institution": {"id": "https://openalex.org/I59270414", "ror": "https://ror.org/04dese585", "display_name": "Indian Institute of Science Bangalore", "country_code": "IN", "type": "education", "lineage": ["https://openalex.org/I59270414"]}, "years": [2016]}, {"institution": {"id": "https://openalex.org/I859038795", "ror": "https://ror.org/02smfhw86", "display_name": "Virginia Tech", "country_code": "US", "type": "education", "lineage": ["https://openalex.org/I859038795"]}, "years": [2026, 2025]}], "last_known_institutions": [{"id": "https://openalex.org/I859038795", "ror": "https://ror.org/02smfhw86", "display_name": "Virginia Tech", "country_code": "US", "type": "education", "lineage": ["https://openalex.org/I859038795"]}], "topics": [{"id": "https://openalex.org/T11524", "display_name": "Advanced Aircraft Design and Technologies", "count": 28, "subfield": {"id": "https://openalex.org/subfields/2306", "display_name": "Global and Planetary Change"}, "field": {"id": "https://openalex.org/fields/23", "display_name": "Environmental Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T10928", "display_name": "Probabilistic and Robust Engineering Design", "count": 13, "subfield": {"id": "https://openalex.org/subfields/1804", "display_name": "Statistics, Probability and Uncertainty"}, "field": {"id": "https://openalex.org/fields/18", "display_name": "Decision Sciences"}, "domain": {"id": "https://openalex.org/domains/2", "display_name": "Social Sciences"}}, {"id": "https://openalex.org/T12125", "display_name": "Aerospace and Aviation Technology", "count": 10, "subfield": {"id": "https://openalex.org/subfields/2202", "display_name": "Aerospace Engineering"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T11096", "display_name": "Aeroelasticity and Vibration Control", "count": 9, "subfield": {"id": "https://openalex.org/subfields/2202", "display_name": "Aerospace Engineering"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T10173", "display_name": "Computational Fluid Dynamics and Aerodynamics", "count": 8, "subfield": {"id": "https://openalex.org/subfields/2206", "display_name": "Computational Mechanics"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}], "topic_share": [{"id": "https://openalex.org/T11524", "display_name": "Advanced Aircraft Design and Technologies", "value": 0.0003777, "subfield": {"id": "https://openalex.org/subfields/2306", "display_name": "Global and Planetary Change"}, "field": {"id": "https://openalex.org/fields/23", "display_name": "Environmental Science"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T11096", "display_name": "Aeroelasticity and Vibration Control", "value": 0.000158, "subfield": {"id": "https://openalex.org/subfields/2202", "display_name": "Aerospace Engineering"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T12125", "display_name": "Aerospace and Aviation Technology", "value": 9.99e-05, "subfield": {"id": "https://openalex.org/subfields/2202", "display_name": "Aerospace Engineering"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T11489", "display_name": "Air Traffic Management and Optimization", "value": 6.89e-05, "subfield": {"id": "https://openalex.org/subfields/2202", "display_name": "Aerospace Engineering"}, "field": {"id": "https://openalex.org/fields/22", "display_name": "Engineering"}, "domain": {"id": "https://openalex.org/domains/3", "display_name": "Physical Sciences"}}, {"id": "https://openalex.org/T10928", "display_name": "Probabilistic and Robust Engineering Design", "value": 6.84e-05, "subfield": {"id": "https://openalex.org/subfields/1804", "display_name": "Statistics, Probability and Uncertainty"}, "field": {"id": "https://openalex.org/fields/18", "display_name": "Decision Sciences"}, "domain": {"id": "https://openalex.org/domains/2", "display_name": "Social Sciences"}}], "x_concepts": [{"id": "41008148", "wikidata": "https://www.wikidata.org/wiki/Q21198", "display_name": "Computer science", "score": 0.7001707553863525}, {"id": "66938386", "wikidata": "https://www.wikidata.org/wiki/Q633538", "display_name": "Structural engineering", "score": 0.650162935256958}, {"id": "146978453", "wikidata": "https://www.wikidata.org/wiki/Q3798668", "display_name": "Aerospace engineering", "score": 0.6043165922164917}, {"id": "127413603", "wikidata": "https://www.wikidata.org/wiki/Q11023", "display_name": "Engineering", "score": 0.5659967660903931}, {"id": "33923547", "wikidata": "https://www.wikidata.org/wiki/Q395", "display_name": "Mathematics", "score": 0.3466168940067291}], "counts_by_year": [{"year": 2016, "works_count": 1, "oa_works_count": 0, "cited_by_count": 21}, {"year": 2017, "works_count": 3, "oa_works_count": 0, "cited_by_count": 24}, {"year": 2018, "works_count": 4, "oa_works_count": 0, "cited_by_count": 31}, {"year": 2019, "works_count": 3, "oa_works_count": 0, "cited_by_count": 11}, {"year": 2020, "works_count": 7, "oa_works_count": 2, "cited_by_count": 17}, {"year": 2021, "works_count": 7, "oa_works_count": 0, "cited_by_count": 73}, {"year": 2022, "works_count": 8, "oa_works_count": 2, "cited_by_count": 44}, {"year": 2023, "works_count": 13, "oa_works_count": 4, "cited_by_count": 97}, {"year": 2024, "works_count": 2, "oa_works_count": 0, "cited_by_count": 24}, {"year": 2025, "works_count": 3, "oa_works_count": 1, "cited_by_count": 5}, {"year": 2026, "works_count": 5, "oa_works_count": 0, "cited_by_count": 1}], "display_name_alternatives": ["Darshan Sarojini", "Sarojini, Darshan"], "block_key": "d sarojini", "works_api_url": "https://api.openalex.org/works?filter=author.id:A5012988947", "updated_date": "2026-08-13T12:28:56", "created_date": "2022-06-17T00:00:00"}, {"id": "https://openalex.org/A5054309691", "orcid": null, "display_name": "B. K. Sarojini M .K. Ramakrishna C. G. Darshan Raj", "raw_author_names": ["B. K. Sarojini M .K. Ramakrishna C. G. Darshan Raj"], "full_name": "B. K. Sarojini M .K. Ramakrishna C. G. Darshan Raj", "relevance_score": 141.13535, "works_count": 1, "cited_by_count": 1, "summary_stats": {"2yr_mean_citedness": 0.0, "h_index": 1, "i10_index": 0}, "ids": {"openalex": "https://openalex.org/A5054309691", "orcid": null}, "affiliations": [], "last_known_institutions": null, "topics": [{"id": "https://openalex.org/T10875", "display_name": "Pesticide Exposure and Toxicity", "count": 1, "subfield": {"id": "https://openalex.org/subfields/1110", "display_name": "Plant Science"}, "field": {"id": "https://openalex.org/fields/11", "display_name": "Agricultural and Biological Sciences"}, "domain": {"id": "https://openalex.org/domains/1", "display_name": "Life Sciences"}}, {"id": "https://openalex.org/T11319", "display_name": "Curcumin's Biomedical Applications", "count": 1, "subfield": {"id": "https://openalex.org/subfields/1313", "display_name": "Molecular Medicine"}, "field": {"id": "https://openalex.org/fields/13", "display_name": "Biochemistry, Genetics and Molecular Biology"}, "domain": {"id": "https://openalex.org/domains/1", "display_name": "Life Sciences"}}, {"id": "https://openalex.org/T13023", "display_name": "Synthesis of Organic Compounds", "count": 1, "subfield": {"id": "https://openalex.org/subfields/2736", "display_name": "Pharmacology"}, "field": {"id": "https://openalex.org/fields/27", "display_name": "Medicine"}, "domain": {"id": "https://openalex.org/domains/4", "display_name": "Health Sciences"}}], "topic_share": [{"id": "https://openalex.org/T11319", "display_name": "Curcumin's Biomedical Applications", "value": 1.87e-05, "subfield": {"id": "https://openalex.org/subfields/1313", "display_name": "Molecular Medicine"}, "field": {"id": "https://openalex.org/fields/13", "display_name": "Biochemistry, Genetics and Molecular Biology"}, "domain": {"id": "https://openalex.org/domains/1", "display_name": "Life Sciences"}}, {"id": "https://openalex.org/T13023", "display_name": "Synthesis of Organic Compounds", "value": 8.4e-06, "subfield": {"id": "https://openalex.org/subfields/2736", "display_name": "Pharmacology"}, "field": {"id": "https://openalex.org/fields/27", "display_name": "Medicine"}, "domain": {"id": "https://openalex.org/domains/4", "display_name": "Health Sciences"}}, {"id": "https://openalex.org/T10875", "display_name": "Pesticide Exposure and Toxicity", "value": 7.8e-06, "subfield": {"id": "https://openalex.org/subfields/1110", "display_name": "Plant Science"}, "field": {"id": "https://openalex.org/fields/11", "display_name": "Agricultural and Biological Sciences"}, "domain": {"id": "https://openalex.org/domains/1", "display_name": "Life Sciences"}}], "x_concepts": [{"id": "111337013", "wikidata": "https://www.wikidata.org/wiki/Q2737837", "display_name": "Irradiation", "score": 0.5287938714027405}, {"id": "111771559", "wikidata": "https://www.wikidata.org/wiki/Q66295", "display_name": "Derivative (finance)", "score": 0.51905757188797}, {"id": "120665830", "wikidata": "https://www.wikidata.org/wiki/Q14620", "display_name": "Optics", "score": 0.1700924038887024}, {"id": "104317684", "wikidata": "https://www.wikidata.org/wiki/Q7187", "display_name": "Gene", "score": 0.06107237935066223}, {"id": "106159729", "wikidata": "https://www.wikidata.org/wiki/Q2294553", "display_name": "Financial economics", "score": 0.0}], "counts_by_year": [{"year": 2015, "works_count": 1, "oa_works_count": 1, "cited_by_count": 1}], "display_name_alternatives": ["B. K. Sarojini M .K. Ramakrishna C. G. Darshan Raj"], "block_key": "b raj", "works_api_url": "https://api.openalex.org/works?filter=author.id:A5054309691", "updated_date": "2026-07-16T12:16:06", "created_date": "2025-10-10T00:00:00"}], "group_by": []} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..ab1daf4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,191 @@ +{ + "name": "al-folio", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "devDependencies": { + "@playwright/test": "^1.56.1", + "@shopify/prettier-plugin-liquid": "^1.10.0", + "pixelmatch": "^7.1.0", + "pngjs": "^7.0.0", + "prettier": "^3.8.0" + } + }, + "node_modules/@playwright/test": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", + "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@shopify/liquid-html-parser": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@shopify/liquid-html-parser/-/liquid-html-parser-2.9.0.tgz", + "integrity": "sha512-bkI4tLbU47YUxpgbMa9fgeJjFEMvRNEFL644Yk0ZKo5H1IRzU4pPyCQ6PkGvb0JJnt7OZ+RDGvb6ZLCnAR2Z/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "line-column": "^1.0.2", + "ohm-js": "^17.0.0" + } + }, + "node_modules/@shopify/prettier-plugin-liquid": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@shopify/prettier-plugin-liquid/-/prettier-plugin-liquid-1.10.0.tgz", + "integrity": "sha512-csHYjwuT34o8ja6EY0dUBYQS5UVwsKwRYxGiuG816Ov0B8lVd8FUjOwWUk2SnrNx3cGgL0no7z+Byapp7sC1Uw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@shopify/liquid-html-parser": "^2.9.0", + "html-styles": "^1.0.0" + }, + "peerDependencies": { + "prettier": "^2.0.0 || ^3.0.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/html-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/html-styles/-/html-styles-1.0.0.tgz", + "integrity": "sha512-cDl5dcj73oI4Hy0DSUNh54CAwslNLJRCCoO+RNkVo+sBrjA/0+7E/xzvj3zH/GxbbBLGJhE0hBe1eg+0FINC6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/line-column": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/line-column/-/line-column-1.0.2.tgz", + "integrity": "sha512-Ktrjk5noGYlHsVnYWh62FLVs4hTb8A3e+vucNZMgPeAOITdshMSgv4cCZQeRDjm7+goqmo6+liZwTXo+U3sVww==", + "dev": true, + "license": "MIT", + "dependencies": { + "isarray": "^1.0.0", + "isobject": "^2.0.0" + } + }, + "node_modules/ohm-js": { + "version": "17.3.0", + "resolved": "https://registry.npmjs.org/ohm-js/-/ohm-js-17.3.0.tgz", + "integrity": "sha512-LySMdjweN1hKBMMV8lM44+1wiewkndDNNJxtgVAscs7y683MXCdQZLsIaw64/p8NuqYbKOWZoHIOA5DU/xchoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.1" + } + }, + "node_modules/pixelmatch": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-7.1.0.tgz", + "integrity": "sha512-1wrVzJ2STrpmONHKBy228LM1b84msXDUoAzVEl0R8Mz4Ce6EPr+IVtxm8+yvrqLYMHswREkjYFaMxnyGnaY3Ng==", + "dev": true, + "license": "ISC", + "dependencies": { + "pngjs": "^7.0.0" + }, + "bin": { + "pixelmatch": "bin/pixelmatch" + } + }, + "node_modules/playwright": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", + "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "playwright-core": "1.58.2" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.58.2", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", + "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/pngjs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-7.0.0.tgz", + "integrity": "sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.19.0" + } + }, + "node_modules/prettier": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f2d223e --- /dev/null +++ b/package.json @@ -0,0 +1,15 @@ +{ + "scripts": { + "lint:prettier": "prettier . --check", + "lint:style-contract": "node test/style_contract.js", + "test:visual": "playwright test --config test/visual/playwright.config.js", + "test:visual:update": "playwright test --config test/visual/playwright.config.js --update-snapshots" + }, + "devDependencies": { + "@playwright/test": "^1.56.1", + "@shopify/prettier-plugin-liquid": "^1.10.0", + "pixelmatch": "^7.1.0", + "pngjs": "^7.0.0", + "prettier": "^3.8.0" + } +} diff --git a/purgecss.config.js b/purgecss.config.js new file mode 100644 index 0000000..207a674 --- /dev/null +++ b/purgecss.config.js @@ -0,0 +1,27 @@ +module.exports = { + content: ["_site/**/*.html", "_site/**/*.js"], + css: ["_site/assets/css/*.css"], + output: "_site/assets/css/", + skippedContentGlobs: ["_site/assets/**/*.html"], + safelist: [ + "collapse", + "collapsing", + "show", + "dropdown-menu", + "dropdown-item", + "table", + "table-dark", + "table-hover", + "table-responsive", + "af-tooltip", + "af-popover", + "font-weight-bold", + "font-weight-medium", + "font-weight-lighter", + // medium-zoom injects these at runtime, so they never appear in the static + // HTML PurgeCSS scans; without them the zoom overlay's z-index rule is purged + // and page chrome (scroll-progress bar, ToC) bleeds through a zoomed image. + "medium-zoom-overlay", + "medium-zoom-image--opened", + ], +}; diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1e9a533 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +nbconvert +pyyaml +rendercv[full] +scholarly diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..a450fbe --- /dev/null +++ b/robots.txt @@ -0,0 +1,7 @@ +--- +permalink: /robots.txt +--- +User-agent: * +Disallow: + +Sitemap: {{ site.baseurl | prepend: site.url }}/sitemap.xml From 259cf566b967f63614c645ad65a72c2755053258 Mon Sep 17 00:00:00 2001 From: Darshan Sarojini <85709297+darshansarojini@users.noreply.github.com> Date: Sun, 16 Aug 2026 14:44:37 -0400 Subject: [PATCH 2/2] Add remaining pages; fix build breakages found in first local build Content: service, student resources, 8 completed projects, and 36 news items covering 2023-2026 (the archive gives month granularity only, so each is dated to the 1st). Fixes found by building al-folio locally for the first time: - interactive-visualization/ is now excluded from the Jekyll source and copied into _site verbatim after purgecss (bin/copy-viz.sh). jekyll-terser was minifying the x3dom library inside the 3D viewers, which risked breaking them; the copied x3dom.js is now byte-identical to source. - external_sources emptied. al-folio shipped its own Medium feed and a Google Blog post, both fetched over the network and rendered as our content on every build. - Removed the demo Jupyter notebook (build failed: no jupyter binary), the resume.json feed behind the deleted CV page, and relativity.html. - publications nav_order 2 -> 3; it collided with research. Local build is clean in 7.5s and renders all 52 publications. Co-Authored-By: Claude Opus 5 (1M context) --- .github/workflows/deploy.yml | 5 + Gemfile.lock | 13 ++ _config.yml | 26 +-- _news/2023-01-01-scitech-2023.md | 8 + _news/2023-07-01-enlace.md | 8 + _news/2023-07-01-pearc23-guide.md | 8 + _news/2023-07-01-pearc23-indyscc.md | 8 + _news/2023-08-01-summer-interns.md | 8 + _news/2023-08-01-uli-review.md | 8 + _news/2023-10-01-sdsc-workshop.md | 8 + _news/2024-01-01-scitech-2024.md | 8 + _news/2024-02-01-archer-aviation.md | 8 + _news/2024-08-01-aviation-2024.md | 8 + _news/2024-08-01-byteboost.md | 8 + _news/2024-08-01-joined-vt.md | 8 + _news/2024-10-01-mason-lecture-mavris.md | 8 + _news/2024-11-01-sc24-scc.md | 8 + _news/2024-12-01-umbridge-workshop.md | 8 + _news/2025-01-01-scitech-2025.md | 8 + _news/2025-03-01-aurora-visit.md | 8 + _news/2025-03-01-nasa-langley-seminar.md | 8 + _news/2025-06-01-boeing-visiting-professor.md | 8 + _news/2025-07-01-aviation-2025.md | 8 + _news/2025-07-01-caams-irb.md | 8 + _news/2025-07-01-nasa-ames-seminar.md | 8 + _news/2025-09-01-break-apart-visit.md | 8 + _news/2025-09-01-fincantieri-presentation.md | 8 + _news/2025-11-01-mason-lecture-electra.md | 8 + _news/2026-01-01-scitech-2026.md | 8 + _news/2026-01-01-tvf-meeting.md | 8 + _news/2026-02-01-caams-winter.md | 8 + _news/2026-02-01-nasa-rem-workshop.md | 8 + _news/2026-04-01-dbf-flyoff.md | 8 + _news/2026-06-01-aviation-2026.md | 8 + _news/2026-06-01-capstone-conference.md | 8 + _news/2026-06-01-gooseworks-navair.md | 8 + _news/2026-06-01-mathworks-summit.md | 8 + _news/2026-07-01-caams-summer.md | 8 + _news/2026-07-01-k12-flight-school.md | 8 + _pages/publications.md | 2 +- _pages/resources.md | 47 ++++ _pages/service.md | 43 ++++ _projects/10_fan_stage_distorted_flow.md | 11 + _projects/11_rade.md | 11 + _projects/12_delphi.md | 11 + _projects/13_beam_models_wingbox.md | 11 + _projects/6_evtol_system_mdo.md | 12 + _projects/7_pegasus_tbw_structures.md | 12 + _projects/8_certification_driven_mdo.md | 11 + _projects/9_x57_reliability.md | 11 + assets/html/relativity.html | 10 - assets/json/resume.json | 221 ------------------ assets/jupyter/blog.ipynb | 48 ---- assets/rendercv/design.yaml | 7 - assets/rendercv/locale.yaml | 3 - .../rendercv_output/Albert_Einstein_CV.pdf | Bin 71513 -> 0 bytes assets/rendercv/settings.yaml | 17 -- bin/copy-viz.sh | 13 ++ 58 files changed, 512 insertions(+), 321 deletions(-) create mode 100644 _news/2023-01-01-scitech-2023.md create mode 100644 _news/2023-07-01-enlace.md create mode 100644 _news/2023-07-01-pearc23-guide.md create mode 100644 _news/2023-07-01-pearc23-indyscc.md create mode 100644 _news/2023-08-01-summer-interns.md create mode 100644 _news/2023-08-01-uli-review.md create mode 100644 _news/2023-10-01-sdsc-workshop.md create mode 100644 _news/2024-01-01-scitech-2024.md create mode 100644 _news/2024-02-01-archer-aviation.md create mode 100644 _news/2024-08-01-aviation-2024.md create mode 100644 _news/2024-08-01-byteboost.md create mode 100644 _news/2024-08-01-joined-vt.md create mode 100644 _news/2024-10-01-mason-lecture-mavris.md create mode 100644 _news/2024-11-01-sc24-scc.md create mode 100644 _news/2024-12-01-umbridge-workshop.md create mode 100644 _news/2025-01-01-scitech-2025.md create mode 100644 _news/2025-03-01-aurora-visit.md create mode 100644 _news/2025-03-01-nasa-langley-seminar.md create mode 100644 _news/2025-06-01-boeing-visiting-professor.md create mode 100644 _news/2025-07-01-aviation-2025.md create mode 100644 _news/2025-07-01-caams-irb.md create mode 100644 _news/2025-07-01-nasa-ames-seminar.md create mode 100644 _news/2025-09-01-break-apart-visit.md create mode 100644 _news/2025-09-01-fincantieri-presentation.md create mode 100644 _news/2025-11-01-mason-lecture-electra.md create mode 100644 _news/2026-01-01-scitech-2026.md create mode 100644 _news/2026-01-01-tvf-meeting.md create mode 100644 _news/2026-02-01-caams-winter.md create mode 100644 _news/2026-02-01-nasa-rem-workshop.md create mode 100644 _news/2026-04-01-dbf-flyoff.md create mode 100644 _news/2026-06-01-aviation-2026.md create mode 100644 _news/2026-06-01-capstone-conference.md create mode 100644 _news/2026-06-01-gooseworks-navair.md create mode 100644 _news/2026-06-01-mathworks-summit.md create mode 100644 _news/2026-07-01-caams-summer.md create mode 100644 _news/2026-07-01-k12-flight-school.md create mode 100644 _pages/resources.md create mode 100644 _pages/service.md create mode 100644 _projects/10_fan_stage_distorted_flow.md create mode 100644 _projects/11_rade.md create mode 100644 _projects/12_delphi.md create mode 100644 _projects/13_beam_models_wingbox.md create mode 100644 _projects/6_evtol_system_mdo.md create mode 100644 _projects/7_pegasus_tbw_structures.md create mode 100644 _projects/8_certification_driven_mdo.md create mode 100644 _projects/9_x57_reliability.md delete mode 100644 assets/html/relativity.html delete mode 100644 assets/json/resume.json delete mode 100644 assets/jupyter/blog.ipynb delete mode 100644 assets/rendercv/design.yaml delete mode 100644 assets/rendercv/locale.yaml delete mode 100644 assets/rendercv/rendercv_output/Albert_Einstein_CV.pdf delete mode 100644 assets/rendercv/settings.yaml create mode 100644 bin/copy-viz.sh diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1fe6679..fed1e36 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -70,6 +70,11 @@ jobs: npm install -g purgecss purgecss -c purgecss.config.js + # Must run AFTER purgecss: the visualizations ship their own CSS, which + # purgecss would strip if it were present in _site during the purge. + - name: Copy interactive visualizations 🛩️ + run: ./bin/copy-viz.sh _site + - name: Upload artifact uses: actions/upload-pages-artifact@v3 diff --git a/Gemfile.lock b/Gemfile.lock index f08fecd..75716f7 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -141,6 +141,7 @@ GEM ffi (1.17.4-arm-linux-gnu) ffi (1.17.4-arm-linux-musl) ffi (1.17.4-arm64-darwin) + ffi (1.17.4-x64-mingw-ucrt) ffi (1.17.4-x86_64-darwin) ffi (1.17.4-x86_64-linux-gnu) ffi (1.17.4-x86_64-linux-musl) @@ -159,6 +160,9 @@ GEM google-protobuf (4.35.0-arm64-darwin) bigdecimal rake (~> 13.3) + google-protobuf (4.35.0-x64-mingw-ucrt) + bigdecimal + rake (~> 13.3) google-protobuf (4.35.0-x86_64-darwin) bigdecimal rake (~> 13.3) @@ -285,6 +289,8 @@ GEM racc (~> 1.4) nokogiri (1.19.4-arm64-darwin) racc (~> 1.4) + nokogiri (1.19.4-x64-mingw-ucrt) + racc (~> 1.4) nokogiri (1.19.4-x86_64-darwin) racc (~> 1.4) nokogiri (1.19.4-x86_64-linux-gnu) @@ -318,6 +324,8 @@ GEM google-protobuf (~> 4.31) sass-embedded (1.100.0-arm64-darwin) google-protobuf (~> 4.31) + sass-embedded (1.100.0-x64-mingw-ucrt) + google-protobuf (~> 4.31) sass-embedded (1.100.0-x86_64-darwin) google-protobuf (~> 4.31) sass-embedded (1.100.0-x86_64-linux-gnu) @@ -349,6 +357,7 @@ PLATFORMS arm-linux-musl arm-linux-musleabihf arm64-darwin + x64-mingw-ucrt x86_64-darwin x86_64-linux-gnu x86_64-linux-musl @@ -450,6 +459,7 @@ CHECKSUMS ffi (1.17.4-arm-linux-gnu) sha256=d6dbddf7cb77bf955411af5f187a65b8cd378cb003c15c05697f5feee1cb1564 ffi (1.17.4-arm-linux-musl) sha256=9d4838ded0465bef6e2426935f6bcc93134b6616785a84ffd2a3d82bc3cf6f95 ffi (1.17.4-arm64-darwin) sha256=19071aaf1419251b0a46852abf960e77330a3b334d13a4ab51d58b31a937001b + ffi (1.17.4-x64-mingw-ucrt) sha256=f6ff9618cfccc494138bddade27aa06c74c6c7bc367a1ea1103d80c2fcb9ed35 ffi (1.17.4-x86_64-darwin) sha256=aa70390523cf3235096cf64962b709b4cfbd5c082a2cb2ae714eb0fe2ccda496 ffi (1.17.4-x86_64-linux-gnu) sha256=9d3db14c2eae074b382fa9c083fe95aec6e0a1451da249eab096c34002bc752d ffi (1.17.4-x86_64-linux-musl) sha256=3fdf9888483de005f8ef8d1cf2d3b20d86626af206cbf780f6a6a12439a9c49e @@ -460,6 +470,7 @@ CHECKSUMS google-protobuf (4.35.0-aarch64-linux-gnu) sha256=2cabd61b420918aec1564f9f7414e455bf922d20c5f8139d62783df5558a7aea google-protobuf (4.35.0-aarch64-linux-musl) sha256=f6b11f3420a4564f68e8233c95eac6924f6a727dfc2f81a56af2e09add551501 google-protobuf (4.35.0-arm64-darwin) sha256=66ab26d3fc82b8950702e53ab16c198e3c0ea3f2a38aaaf1f32152da45593ac5 + google-protobuf (4.35.0-x64-mingw-ucrt) sha256=18ad683237ab6261b81ea4bb273f03dc5e46f0b1e4e4be0152302733cee0945a google-protobuf (4.35.0-x86_64-darwin) sha256=05eb5c8bc9899135befff496fc0a3642e7ff3d0943f043841dcc456f5654fea0 google-protobuf (4.35.0-x86_64-linux-gnu) sha256=999226f3b00cd9fddb1b26851d16060212fa1d90c406aaad47e574682b716059 google-protobuf (4.35.0-x86_64-linux-musl) sha256=be0218520d77b2aee898b363514b03819f6f63f9c041ae0d0d79b4ce5247bffd @@ -511,6 +522,7 @@ CHECKSUMS nokogiri (1.19.4-arm-linux-gnu) sha256=a301313e38bb065d68239e79734bcd6f56fb6efaacebde29e9abf2a4735340ca nokogiri (1.19.4-arm-linux-musl) sha256=588923c101bcfa78869734d247d25b598674323e7f22474fc468f6e5647311eb nokogiri (1.19.4-arm64-darwin) sha256=a46db9853286e6597b36ebc6953817d15acf3a299583eb3f89fdc6f91dd63527 + nokogiri (1.19.4-x64-mingw-ucrt) sha256=051da97b8eccfdb5444fed40246a35e10d7298b9efe759b4cd25455ea04c587e nokogiri (1.19.4-x86_64-darwin) sha256=7fd17057d3e1f00e9954a74b3cd76595d3d4a5ef233b7ed9599047c204f70551 nokogiri (1.19.4-x86_64-linux-gnu) sha256=379fae440b28915e3f19d752ce2dcf8465ed2b2fbefd2a7ca0dd497bc981a06a nokogiri (1.19.4-x86_64-linux-musl) sha256=17dfb7c1fa194ae02fbf7c51a7afc8d278045ab3fdacfd86f91d02d7b274470b @@ -531,6 +543,7 @@ CHECKSUMS sass-embedded (1.100.0-arm-linux-gnueabihf) sha256=a2de272bb02977ea91acaf3fecb6d8e09e4989501efbfc5375da4b5e7bff001d sass-embedded (1.100.0-arm-linux-musleabihf) sha256=ce19837c10bab5ae6785f10b435a57a64ca027a99875cd701dc6fd3af317cbe5 sass-embedded (1.100.0-arm64-darwin) sha256=d294b32c3b7bed293ad39bd392713c07f1df5454e65fa0f8d80dadbdba8a0cf4 + sass-embedded (1.100.0-x64-mingw-ucrt) sha256=059875f5d4ac1ed98c54041a49bd883c66344295714ff0b54566c49bb874a4dc sass-embedded (1.100.0-x86_64-darwin) sha256=3db80c837a60712de3461d5aa1be43c7056a0584d7182a8ae7a8996d64ab46d3 sass-embedded (1.100.0-x86_64-linux-gnu) sha256=58dd0a8a4f0dd78881b90d8b0e4d0eed042d54865b19b71384d91091ade93e18 sass-embedded (1.100.0-x86_64-linux-musl) sha256=03dbee81bf93e770c725caf0c895e04c7b049ebef56b8a7002fcf21e6bedf7c5 diff --git a/_config.yml b/_config.yml index 4ba3af6..b85aee6 100644 --- a/_config.yml +++ b/_config.yml @@ -176,17 +176,9 @@ disqus_shortname: al-folio # put your disqus shortname # If you have blog posts published on medium.com or other external sources, # you can display them in your blog by adding a link to the RSS feed. # Optional: Set default categories and tags for posts from each source. -external_sources: - - name: medium.com - rss_url: https://medium.com/@al-folio/feed - categories: [external-posts] - tags: [medium] - - name: Google Blog - posts: - - url: https://blog.google/technology/ai/google-gemini-update-flash-ai-assistant-io-2024/ - published_date: 2024-05-14 - categories: [external-posts] - tags: [google] +# Emptied: the al-folio demo shipped its own Medium feed and a Google Blog post +# here, which were being fetched over the network and rendered as our content. +external_sources: [] # ----------------------------------------------------------------------------- # Newsletter @@ -254,6 +246,12 @@ exclude: - gems/ - migrations/ - vendor + # Hand-written x3dom pages plus ~218 MB of .glb models. Excluded from the + # Jekyll source so that terser/minifier never touch the 3D scene markup and + # Jekyll does not re-copy a quarter-gigabyte on every build. The directory is + # copied into _site verbatim after the build instead — see bin/copy-viz.sh, + # which both the deploy workflow and local builds call. + - interactive-visualization/ keep_files: - CNAME - .nojekyll @@ -699,9 +697,9 @@ third_party_libraries: # Get external JSON data # ----------------------------------------------------------------------------- -jekyll_get_json: - - data: resume - json: assets/json/resume.json # it can also be an url +# Emptied along with the CV page: this fed the résumé layout from a demo +# assets/json/resume.json that shipped with al-folio. +jekyll_get_json: [] jsonresume: - basics diff --git a/_news/2023-01-01-scitech-2023.md b/_news/2023-01-01-scitech-2023.md new file mode 100644 index 0000000..1d8b764 --- /dev/null +++ b/_news/2023-01-01-scitech-2023.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-01-01 +inline: true +related_posts: false +--- + +Darshan presented two papers at the SciTech 2023 Forum: *Large-Scale Multidisciplinary Design Optimization of an eVTOL Aircraft using Comprehensive Analysis* and *Efficient Gradient-Based Optimization of Differential-Algebraic Equation Systems*. diff --git a/_news/2023-07-01-enlace.md b/_news/2023-07-01-enlace.md new file mode 100644 index 0000000..22939cf --- /dev/null +++ b/_news/2023-07-01-enlace.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-07-01 +inline: true +related_posts: false +--- + +Darshan welcomed ENLACE program students to the LSDO lab for mentorship on physics-based software and eVTOL design in collaboration with Aurora Flight Sciences. diff --git a/_news/2023-07-01-pearc23-guide.md b/_news/2023-07-01-pearc23-guide.md new file mode 100644 index 0000000..521ab1c --- /dev/null +++ b/_news/2023-07-01-pearc23-guide.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-07-01 +inline: true +related_posts: false +--- + +Cyd Burrows-Schilling presented *Towards Developing a Guide to Choosing National High-Performance Computing Resources* at PEARC23. diff --git a/_news/2023-07-01-pearc23-indyscc.md b/_news/2023-07-01-pearc23-indyscc.md new file mode 100644 index 0000000..2aee8e8 --- /dev/null +++ b/_news/2023-07-01-pearc23-indyscc.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-07-01 +inline: true +related_posts: false +--- + +Daniel Dietz presented *Scaling Up: Growth of the Indy Student Cluster Competition* at PEARC23. diff --git a/_news/2023-08-01-summer-interns.md b/_news/2023-08-01-summer-interns.md new file mode 100644 index 0000000..b32210e --- /dev/null +++ b/_news/2023-08-01-summer-interns.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-08-01 +inline: true +related_posts: false +--- + +Undergraduate summer interns Omar Ibrahim Alfonseca Navarrete and Ernesto Montano Alvares presented their work at a poster session. diff --git a/_news/2023-08-01-uli-review.md b/_news/2023-08-01-uli-review.md new file mode 100644 index 0000000..d928cb3 --- /dev/null +++ b/_news/2023-08-01-uli-review.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-08-01 +inline: true +related_posts: false +--- + +Darshan presented at the 2023 annual review workshop of the NASA University Leadership Initiative project. diff --git a/_news/2023-10-01-sdsc-workshop.md b/_news/2023-10-01-sdsc-workshop.md new file mode 100644 index 0000000..1e7337d --- /dev/null +++ b/_news/2023-10-01-sdsc-workshop.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2023-10-01 +inline: true +related_posts: false +--- + +Darshan ran a workshop with the San Diego Supercomputing Center, *Mini-Workshop on HPC CI Onboarding for the UCSD Research Community*. diff --git a/_news/2024-01-01-scitech-2024.md b/_news/2024-01-01-scitech-2024.md new file mode 100644 index 0000000..881a3a4 --- /dev/null +++ b/_news/2024-01-01-scitech-2024.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-01-01 +inline: true +related_posts: false +--- + +Darshan presented *Review of Computational Models for Large-Scale MDAO of Urban Air Mobility Concepts* at the SciTech 2024 Forum, with collaborators from Aurora Flight Sciences, Brigham Young University, UC Davis, San Diego State University, the University of Chicago, and NASA Ames. diff --git a/_news/2024-02-01-archer-aviation.md b/_news/2024-02-01-archer-aviation.md new file mode 100644 index 0000000..993a78d --- /dev/null +++ b/_news/2024-02-01-archer-aviation.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-02-01 +inline: true +related_posts: false +--- + +Darshan worked as Aerodynamic Performance Engineer at Archer Aviation in the Office of the Chief Engineer through July 2024, conducting aircraft-level performance and safety analysis of eVTOL aircraft and optimizing flaperon schedules. diff --git a/_news/2024-08-01-aviation-2024.md b/_news/2024-08-01-aviation-2024.md new file mode 100644 index 0000000..1303867 --- /dev/null +++ b/_news/2024-08-01-aviation-2024.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-08-01 +inline: true +related_posts: false +--- + +Darshan attended the AIAA Aviation 2024 Forum in Las Vegas and helped plan a panel discussion on multi-modal transportation. diff --git a/_news/2024-08-01-byteboost.md b/_news/2024-08-01-byteboost.md new file mode 100644 index 0000000..b1af272 --- /dev/null +++ b/_news/2024-08-01-byteboost.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-08-01 +inline: true +related_posts: false +--- + +Darshan attended the ByteBoost Summer Workshop at the Pittsburgh Supercomputing Center, exploring NSF computing testbeds for aircraft design and multi-modal transportation research. diff --git a/_news/2024-08-01-joined-vt.md b/_news/2024-08-01-joined-vt.md new file mode 100644 index 0000000..59d698c --- /dev/null +++ b/_news/2024-08-01-joined-vt.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-08-01 +inline: true +related_posts: false +--- + +Darshan joined Virginia Tech as Assistant Professor in the Aerospace and Ocean Engineering department. diff --git a/_news/2024-10-01-mason-lecture-mavris.md b/_news/2024-10-01-mason-lecture-mavris.md new file mode 100644 index 0000000..bebc949 --- /dev/null +++ b/_news/2024-10-01-mason-lecture-mavris.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-10-01 +inline: true +related_posts: false +--- + +Darshan hosted Dr. Dimitri Mavris at Virginia Tech for the 2024 William H. Mason Memorial Distinguished Lecture. diff --git a/_news/2024-11-01-sc24-scc.md b/_news/2024-11-01-sc24-scc.md new file mode 100644 index 0000000..5ae0fa4 --- /dev/null +++ b/_news/2024-11-01-sc24-scc.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-11-01 +inline: true +related_posts: false +--- + +Darshan served as vice-chair of the Student Cluster Competition at SuperComputing SC24. diff --git a/_news/2024-12-01-umbridge-workshop.md b/_news/2024-12-01-umbridge-workshop.md new file mode 100644 index 0000000..611d22c --- /dev/null +++ b/_news/2024-12-01-umbridge-workshop.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2024-12-01 +inline: true +related_posts: false +--- + +Darshan participated in the UM-Bridge workshop and gave a short talk on multifidelity reduced order modeling. diff --git a/_news/2025-01-01-scitech-2025.md b/_news/2025-01-01-scitech-2025.md new file mode 100644 index 0000000..67a12e7 --- /dev/null +++ b/_news/2025-01-01-scitech-2025.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-01-01 +inline: true +related_posts: false +--- + +Darshan attended the AIAA SciTech Forum and served as deputy technical discipline chair for the Modeling and Simulation Technologies technical committee. diff --git a/_news/2025-03-01-aurora-visit.md b/_news/2025-03-01-aurora-visit.md new file mode 100644 index 0000000..604ee31 --- /dev/null +++ b/_news/2025-03-01-aurora-visit.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-03-01 +inline: true +related_posts: false +--- + +Darshan visited Aurora Flight Sciences in Manassas, VA. diff --git a/_news/2025-03-01-nasa-langley-seminar.md b/_news/2025-03-01-nasa-langley-seminar.md new file mode 100644 index 0000000..a71eaa1 --- /dev/null +++ b/_news/2025-03-01-nasa-langley-seminar.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-03-01 +inline: true +related_posts: false +--- + +Darshan visited NASA Langley Research Center and gave a seminar, *MDAO and MBSE for Certification-Driven Aircraft Design*. diff --git a/_news/2025-06-01-boeing-visiting-professor.md b/_news/2025-06-01-boeing-visiting-professor.md new file mode 100644 index 0000000..563f172 --- /dev/null +++ b/_news/2025-06-01-boeing-visiting-professor.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-06-01 +inline: true +related_posts: false +--- + +Darshan participated in the Boeing Visiting Professor Program in Seattle, WA. diff --git a/_news/2025-07-01-aviation-2025.md b/_news/2025-07-01-aviation-2025.md new file mode 100644 index 0000000..2846bbc --- /dev/null +++ b/_news/2025-07-01-aviation-2025.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-07-01 +inline: true +related_posts: false +--- + +Darshan presented *Performance and Regulatory Assessment Trim Formulations for Conceptual Aircraft Design* at AIAA Aviation 2025 in Las Vegas, NV. diff --git a/_news/2025-07-01-caams-irb.md b/_news/2025-07-01-caams-irb.md new file mode 100644 index 0000000..b37f3bb --- /dev/null +++ b/_news/2025-07-01-caams-irb.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-07-01 +inline: true +related_posts: false +--- + +Darshan attended the CAAMS center annual Industry Review Board meeting in Ann Arbor, MI. diff --git a/_news/2025-07-01-nasa-ames-seminar.md b/_news/2025-07-01-nasa-ames-seminar.md new file mode 100644 index 0000000..6a07a78 --- /dev/null +++ b/_news/2025-07-01-nasa-ames-seminar.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-07-01 +inline: true +related_posts: false +--- + +Darshan visited NASA Ames Research Center to give a seminar, *MDAO for Urban Air Mobility*. diff --git a/_news/2025-09-01-break-apart-visit.md b/_news/2025-09-01-break-apart-visit.md new file mode 100644 index 0000000..867ce4e --- /dev/null +++ b/_news/2025-09-01-break-apart-visit.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-09-01 +inline: true +related_posts: false +--- + +Darshan visited Dr. Adam Stern in Livingston, MT to discuss the ongoing project on design of break-apart mechanisms for UAS. diff --git a/_news/2025-09-01-fincantieri-presentation.md b/_news/2025-09-01-fincantieri-presentation.md new file mode 100644 index 0000000..ef7256d --- /dev/null +++ b/_news/2025-09-01-fincantieri-presentation.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-09-01 +inline: true +related_posts: false +--- + +Jeremy John presented *Design Optimization of Ocean Vehicles Using Large-Scale MDAO Methods*, conducted as a Fincantieri scholarship recipient in Summer 2025. diff --git a/_news/2025-11-01-mason-lecture-electra.md b/_news/2025-11-01-mason-lecture-electra.md new file mode 100644 index 0000000..314b6be --- /dev/null +++ b/_news/2025-11-01-mason-lecture-electra.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2025-11-01 +inline: true +related_posts: false +--- + +Darshan hosted Dr. John S. Langford, JP Stewart, and Melissa Meredith from Electra.aero at Virginia Tech for the William H. Mason Memorial Distinguished Lecture, *The Quest for Electric Airplanes That Make Sense*. diff --git a/_news/2026-01-01-scitech-2026.md b/_news/2026-01-01-scitech-2026.md new file mode 100644 index 0000000..e90a71f --- /dev/null +++ b/_news/2026-01-01-scitech-2026.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-01-01 +inline: true +related_posts: false +--- + +Students presented at AIAA SciTech 2026 in Orlando, FL: Joey Gould and Nate Shune on *Certification-Informed Reliability and Performance Assessment of Electrified Aircraft*; Khoa Nguyen, Dylan Hogge, and John Riris (co-advised by Dr. Brad Denby) on *Autonomous Battery Units as an Enabling Technology for Urban Air Mobility*; Apurba Sarkar and Reza Batley (advisor: Dr. Sourav Saha) on *A Kernel-based Resource-efficient Neural Surrogate for Multi-fidelity Prediction of Aerodynamic Field*. diff --git a/_news/2026-01-01-tvf-meeting.md b/_news/2026-01-01-tvf-meeting.md new file mode 100644 index 0000000..2a4c276 --- /dev/null +++ b/_news/2026-01-01-tvf-meeting.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-01-01 +inline: true +related_posts: false +--- + +Darshan attended the Vertical Flight Society's Transformative Vertical Flight Meeting in San Jose, CA. diff --git a/_news/2026-02-01-caams-winter.md b/_news/2026-02-01-caams-winter.md new file mode 100644 index 0000000..fbeff7b --- /dev/null +++ b/_news/2026-02-01-caams-winter.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-02-01 +inline: true +related_posts: false +--- + +Darshan presented *AI Algorithms for Autonomous Decision Making in Resource-Constrained Environments* at the NSF CAAMS winter meeting in Alexandria, VA. diff --git a/_news/2026-02-01-nasa-rem-workshop.md b/_news/2026-02-01-nasa-rem-workshop.md new file mode 100644 index 0000000..2107f0e --- /dev/null +++ b/_news/2026-02-01-nasa-rem-workshop.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-02-01 +inline: true +related_posts: false +--- + +Darshan participated in the NASA Revolutionary Engineering Methods workshop at NASA Ames. diff --git a/_news/2026-04-01-dbf-flyoff.md b/_news/2026-04-01-dbf-flyoff.md new file mode 100644 index 0000000..dfb8e39 --- /dev/null +++ b/_news/2026-04-01-dbf-flyoff.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-04-01 +inline: true +related_posts: false +--- + +Darshan served as AIAA Design-Build-Fly student competition advisor for the Virginia Tech team at the 2026 Fly-Off in Wichita, KS. diff --git a/_news/2026-06-01-aviation-2026.md b/_news/2026-06-01-aviation-2026.md new file mode 100644 index 0000000..54786cc --- /dev/null +++ b/_news/2026-06-01-aviation-2026.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-06-01 +inline: true +related_posts: false +--- + +Students and collaborators presented at AIAA Aviation 2026 in San Diego, CA: Grant Lee, Dylan Hogge, Aman Anwar, and Krish Bhatt on *A Transportation Model for Door-to-Door Regional Air Mobility Applied to West Virginia*; Nicholas R. Prophet on *Programmed Disassembly of Unmanned Aerial Vehicles*. diff --git a/_news/2026-06-01-capstone-conference.md b/_news/2026-06-01-capstone-conference.md new file mode 100644 index 0000000..d05a42c --- /dev/null +++ b/_news/2026-06-01-capstone-conference.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-06-01 +inline: true +related_posts: false +--- + +Darshan attended the Capstone Design Conference at Texas A&M University. diff --git a/_news/2026-06-01-gooseworks-navair.md b/_news/2026-06-01-gooseworks-navair.md new file mode 100644 index 0000000..fe691de --- /dev/null +++ b/_news/2026-06-01-gooseworks-navair.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-06-01 +inline: true +related_posts: false +--- + +Senior design team GooseWorks presented their carrier-based strike fighter F/A-XX Emperor design to NAVAIR Commander Vice Adm. John Dougherty and his staff. diff --git a/_news/2026-06-01-mathworks-summit.md b/_news/2026-06-01-mathworks-summit.md new file mode 100644 index 0000000..e19fcb5 --- /dev/null +++ b/_news/2026-06-01-mathworks-summit.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-06-01 +inline: true +related_posts: false +--- + +Darshan presented *From Requirements to Flight Simulation: An Integrated Aircraft Design Demo* at the MathWorks Research Summit in Natick, MA. diff --git a/_news/2026-07-01-caams-summer.md b/_news/2026-07-01-caams-summer.md new file mode 100644 index 0000000..fe9be8d --- /dev/null +++ b/_news/2026-07-01-caams-summer.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-07-01 +inline: true +related_posts: false +--- + +Darshan attended the NSF CAAMS summer meeting at Penn State University. diff --git a/_news/2026-07-01-k12-flight-school.md b/_news/2026-07-01-k12-flight-school.md new file mode 100644 index 0000000..cf79acf --- /dev/null +++ b/_news/2026-07-01-k12-flight-school.md @@ -0,0 +1,8 @@ +--- +layout: post +date: 2026-07-01 +inline: true +related_posts: false +--- + +IDOpt Lab collaborated with VT CEED, Marshall University, and the Bill Noe Flight School on a K-12 field trip to the flight school. diff --git a/_pages/publications.md b/_pages/publications.md index 48027f8..39ed218 100644 --- a/_pages/publications.md +++ b/_pages/publications.md @@ -4,7 +4,7 @@ permalink: /publications/ title: publications description: publications by categories in reversed chronological order. generated by jekyll-scholar. nav: true -nav_order: 2 +nav_order: 3 --- diff --git a/_pages/resources.md b/_pages/resources.md new file mode 100644 index 0000000..983bb0a --- /dev/null +++ b/_pages/resources.md @@ -0,0 +1,47 @@ +--- +layout: page +title: student resources +permalink: /resources/ +description: Funding opportunities and competitions for students. +nav: true +nav_order: 8 +--- + + + +## National fellowships + +- **NSF GRFP** — three years of support, including an annual stipend of $37,000 +- **DoD SMART** — full tuition, annual stipend, internships, and guaranteed civilian employment +- **DoD NDSEG** — competitive fellowship for U.S. citizens pursuing doctoral degrees +- **ACRP Graduate Research Award** — stimulating thought, discussion, and research on airport issues +- **Dwight D. Eisenhower Transportation Fellowship (DDETFP)** +- **NSF Postdoctoral Fellowship** +- **John V. Wehausen Graduate Scholarship** +- **Samya Rose Stumo National Air Grant Fellowship** +- **DoE SCGSR Program** + +## Competitions + +- **NASA University Student Research Challenge (USRC)** +- **NASA Blue Skies** +- **ACRP Design Competition** + +## Summer research programs + +**International** — TUM PREP (Germany) · DAAD RISE · Start in France + +**United States** — MIT · University of Utah · Northwestern + +## Virginia Tech + +- **ICTAS Undergraduate Research Fellowship** +- **VSGC STEM Research Scholarship** +- **Tolson and Pratt departmental fellowships** +- **Presidential Postdoctoral Fellowship** +- **First-Year FURF** +- **MAOP Summer Research Internship** + +Virginia Tech also offers several conference travel funding options. diff --git a/_pages/service.md b/_pages/service.md new file mode 100644 index 0000000..67ad8de --- /dev/null +++ b/_pages/service.md @@ -0,0 +1,43 @@ +--- +layout: page +title: service +permalink: /service/ +description: Professional and academic service. +nav: true +nav_order: 7 +--- + +## AIAA + +- **Aircraft Design (AD) Technical Committee** — member, 2025–present +- **Aviation in Multimodal Transportation (AiMT) Integration and Outreach Committee** — member, 2024–present; chair of the technical papers subcommittee; Aviation 2024 Forum360 planning committee +- **Transformational Flight (TF) Integration and Outreach Committee** — member, 2022–present +- **Modeling and Simulation Technologies (MST) Technical Committee** — member, 2022–present; technical discipline chair for Aviation 2025; deputy chair for SciTech 2025 + +## SuperComputing Conference + +- **SC 2024** — vice-chair, Student Cluster Competition +- **SC 2023** — early career committee; reproducibility challenge committee +- **SC 2022** — early career committee; vice-chair, IndySCC; student programming committee +- **SC 2021** — co-chair of the IndySCC, a new education-focused track of the Student Cluster Competition + +## Campus Champions + +Campus champion for the University of California San Diego, with responsibility for NSF ACCESS allocations. + +## Peer review + +**Journals** — Structural and Multidisciplinary Optimization · AIAA Journal of Aerospace Information Systems · Advances in Materials and Processing Technologies · Engineering Computations · Proceedings of the Institution of Mechanical Engineers, Part G: Journal of Aerospace Engineering + +**Conferences** — AIAA SciTech Forum · AIAA Aviation Forum · ACM/IEEE SuperComputing Student Cluster Competition + +## Institutional service + +**Virginia Tech** (2024–present) +: Undergraduate Curriculum Committee · Mason Memorial Lecture Committee + +**University of California San Diego** +: Student mentoring · judge, UC LEADS 2023 poster competition + +**Georgia Institute of Technology** +: Student representative, Institute Graduate Curriculum Committee diff --git a/_projects/10_fan_stage_distorted_flow.md b/_projects/10_fan_stage_distorted_flow.md new file mode 100644 index 0000000..840f573 --- /dev/null +++ b/_projects/10_fan_stage_distorted_flow.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Aero-Structural Design of a Fan Stage under Distorted Flow +description: Variational Asymptotic Method applied to transient fan rotor blade analysis +importance: 5 +category: completed +--- + +**Role:** Collaborator on the PhD thesis of Manish Pokhrel + +Represents the fan blade as a higher-order beam model through the Variational Asymptotic Method (VAM) — the first reported work applying VAM to transient structural analysis of fan rotor blades. Rotor structural analysis covers dynamic stress computation, excitation frequency determination, and resonance margin calculation across vibration modes. The resulting design satisfies structural constraints at a cost of only 0.22% in aerodynamic stage efficiency. diff --git a/_projects/11_rade.md b/_projects/11_rade.md new file mode 100644 index 0000000..82eca2d --- /dev/null +++ b/_projects/11_rade.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Rapid Airframe Design Environment (RADE) +description: Rapid geometry manipulation and automated wingbox layout +importance: 6 +category: completed +--- + +**Role:** Postdoctoral scholar at ASDL, with Dr. Jason Corman + +A tool for rapid geometry manipulation of conventional and unconventional aircraft, covering outer mold line modification and automated wingbox structural layout. It provides an API to interface with physics-based solvers: AVL for low-fidelity aerodynamics, Nastran for structural and aeroelastic analysis, and HyperSizer for structural sizing. diff --git a/_projects/12_delphi.md b/_projects/12_delphi.md new file mode 100644 index 0000000..c10c3cc --- /dev/null +++ b/_projects/12_delphi.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Dynamic Environment for Loads Prediction and Handling Investigation (DELPHI) +description: Six-degree-of-freedom flight dynamics simulation with pluggable models +importance: 7 +category: completed +--- + +**Role:** Postdoctoral scholar at ASDL, with Dr. Evan Harrison + +A six-degree-of-freedom flight dynamics simulation tool whose API accepts any aerodynamic, propulsion, and mass properties model. Aircraft may be defined with arbitrary numbers of propulsion devices and control surfaces. A closed-loop control system supports prediction of regulation-specified dynamic maneuvers and handling qualities. diff --git a/_projects/13_beam_models_wingbox.md b/_projects/13_beam_models_wingbox.md new file mode 100644 index 0000000..7bae738 --- /dev/null +++ b/_projects/13_beam_models_wingbox.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Beam Models for Aircraft Wingbox Structures +description: Physics-based model reduction for wing primary structure +importance: 8 +category: completed +--- + +**Role:** PhD thesis, ASDL, Georgia Tech + +Explores physics-based model reduction to produce a simplified beam representation of aircraft wing primary structure, built on OpenMDAO with CasADi automating derivative computation. It handles arbitrary cross-sections, dynamic loads, both strength and buckling constraints, and multiple beam members connected by joints carrying masses and point loads, with a one-time correction from the higher-order Variational Asymptotic Method. Against higher-fidelity shell models, predicted weight differs by less than 5% with a 12x speed-up, even for configurations as complex as the truss-braced wing. diff --git a/_projects/6_evtol_system_mdo.md b/_projects/6_evtol_system_mdo.md new file mode 100644 index 0000000..1d2fdaf --- /dev/null +++ b/_projects/6_evtol_system_mdo.md @@ -0,0 +1,12 @@ +--- +layout: page +title: Electric Air Taxi Concept System-Level MDO +description: Large-scale MDO with seven disciplines contributing to a system-level optimization +importance: 1 +category: completed +--- + +**Funding:** NASA University Leadership Initiative (ULI) +**Role:** Postdoctoral scholar, with PI Dr. John Hwang + +A first-of-its-kind demonstration of large-scale MDO with seven disciplines contributing design variables to a system-level optimization — 102 design variables and 19 constraints. Low-fidelity physics-based analysis kept turnaround to roughly 30 minutes on a standard design computer, yielding 11.4% lower mass than a baseline sized vehicle. diff --git a/_projects/7_pegasus_tbw_structures.md b/_projects/7_pegasus_tbw_structures.md new file mode 100644 index 0000000..a0a5322 --- /dev/null +++ b/_projects/7_pegasus_tbw_structures.md @@ -0,0 +1,12 @@ +--- +layout: page +title: Structural Design Space Exploration of PEGASUS and TBW +description: Effect of outer mold line, engine, and structural layout variables on structural weight +importance: 2 +category: completed +--- + +**Funding:** NASA Transformational Tools and Technologies (TTT) +**Role:** PhD thesis work; collaborator on the PhD thesis of David Solano + +No previous work had examined the effect of high-level outer mold line (OML), engine, and structural layout variables on structural weight. For the PEGASUS concept, this work obtained a structural layout with the least sensitivity to gust loads specified by 14-CFR regulations. For the Truss-Braced Wing (TBW) concept, it identified the strut-wing attachment location giving the least overall primary structure weight. diff --git a/_projects/8_certification_driven_mdo.md b/_projects/8_certification_driven_mdo.md new file mode 100644 index 0000000..eb6009e --- /dev/null +++ b/_projects/8_certification_driven_mdo.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Certification-Driven MDO of Aircraft +description: Trade-offs between performance and certification constraints +importance: 3 +category: completed +--- + +**Role:** Collaborator on the PhD thesis of Jiacheng Xie + +Captures the trade-off between performance and certification constraints, including 14-CFR Part 25 Subpart B (Flight Characteristics) and Subpart C (Structures). Applications include retrofit design of a Boeing 777-type horizontal tail and redesign of the vertical tail for NASA's PEGASUS concept. diff --git a/_projects/9_x57_reliability.md b/_projects/9_x57_reliability.md new file mode 100644 index 0000000..aecdcc1 --- /dev/null +++ b/_projects/9_x57_reliability.md @@ -0,0 +1,11 @@ +--- +layout: page +title: Reliability-Based Design of the X-57 Concept +description: Safety assessment and off-nominal performance for distributed electric propulsion +importance: 4 +category: completed +--- + +**Role:** Collaborator on the PhD thesis of Mayank Bendarkar + +Implements a safety assessment framework for off-nominal performance and reliability, using a Bayesian decision framework for compliance assessment. A case study on the X-57 distributed electric propulsion aircraft identified battery failure as a catastrophic scenario, with loss of the cruise motor or traction power buses the next most critical hazardous failures. diff --git a/assets/html/relativity.html b/assets/html/relativity.html deleted file mode 100644 index 7d3472a..0000000 --- a/assets/html/relativity.html +++ /dev/null @@ -1,10 +0,0 @@ - - -
-

Relativity: the Special and General Theory

-
Albert Einstein
-
- Insert HTML document here. -
- - diff --git a/assets/json/resume.json b/assets/json/resume.json deleted file mode 100644 index d974bb6..0000000 --- a/assets/json/resume.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "basics": { - "name": "Albert Einstein", - "label": "Scientist", - "image": "", - "email": "einstein@example.com", - "phone": "(912) 123-4567", - "summary": "A German-born theoretical physicist, widely ranked among the greatest and most influential scientists of all time", - "location": { - "address": "2712 Broadway St", - "postalCode": "CA 94115", - "city": "San Francisco", - "countryCode": "US", - "region": "California" - }, - "profiles": [] - }, - "work": [ - { - "name": "Institute for Advanced Study, Princeton University", - "position": "Professor of Theoretical Physics", - "location": "Princeton University, NJ", - "startDate": "1933-01-01", - "endDate": "1955-01-01", - "summary": "Teaching at Palmer Physical Laboratory (now 302 Frist Campus Center). While not a professor at Princeton, I associated with the physics professors and continued to give lectures on campus.", - "highlights": ["Relativity", "Description 2."] - }, - { - "name": "California Institute of Technology", - "position": "Visiting Professor", - "location": "Pasadena, California, US", - "startDate": "1933-01-01", - "endDate": "1933-01-01", - "summary": "", - "highlights": ["Description 1.", "Description 2."] - }, - { - "name": "Kaiser Wilhelm Institute for Physics", - "position": "Director", - "location": "Berlin, Germany", - "startDate": "1917-01-01", - "endDate": "1933-01-01", - "summary": "", - "highlights": [] - }, - { - "name": "Karl-Ferdinand University", - "position": "Professor of Theoretical Physics", - "location": "Prague, Czechoslovakia", - "startDate": "1911-01-01", - "endDate": "1917-01-01", - "summary": "", - "highlights": [] - }, - { - "name": "University of Zurich", - "position": "Associate Professor of Theoretical Physics", - "location": "Zurich, Switzerland", - "startDate": "1909-01-01", - "endDate": "1911-01-01", - "summary": "", - "highlights": [] - } - ], - "volunteer": [ - { - "organization": "People's Climate March", - "location": "Zurich, Switzerland", - "position": "Lead Organizer", - "startDate": "2014-04-01", - "endDate": "2015-07-01", - "summary": "Lead organizer for the New York City branch of the People's Climate March, the largest climate march in history.", - "highlights": ["Awarded 'Climate Hero' award by Greenpeace for my efforts organizing the march.", "Men of the year 2014 by Time magazine"] - } - ], - "education": [ - { - "institution": "University of Zurich", - "location": "Zurich, Switzerland", - "url": "https://www.uzh.ch/", - "area": "Physics", - "studyType": "PhD", - "startDate": "1900-01-01", - "endDate": "1905-01-01", - "score": "", - "courses": ["Theory of Relativity"], - "highlights": ["Description 1.", "Description 2."] - }, - { - "institution": "Eidgenössische Technische Hochschule", - "location": "Zurich, Switzerland", - "area": "Physics", - "studyType": "Federal teaching diploma", - "startDate": "1896-01-01", - "endDate": "1900-01-01", - "score": "", - "courses": [], - "highlights": ["Description 1.", "Description 2."] - } - ], - "awards": [ - { - "title": "Nobel Prize in Physics", - "date": "1921-11-01", - "awarder": "Royal Swedish Academy of Sciences", - "url": "https://www.nobelprize.org/prizes/physics/1921/einstein/biographical/", - "summary": "The Nobel Prizes are five separate prizes that, according to Alfred Nobel's will of 1895, are awarded to 'those who, during the preceding year, have conferred the greatest benefit to humankind.'" - }, - { - "title": "Max Planck Medal", - "date": "2029-01-01", - "awarder": "German Physical Society", - "summary": "" - } - ], - "certificates": [ - { - "name": "Machine Learning", - "date": "2018-01-01", - "issuer": "Stanford University", - "icon": "fa-solid fa-location-dot" - }, - { - "name": "Quantum Computing", - "date": "2018-01-01", - "issuer": "Stanford University", - "icon": "fa-solid fa-tag" - }, - { - "name": "Quantum Information", - "date": "2018-01-01", - "issuer": "Stanford University", - "icon": "fa-solid fa-envelope" - } - ], - "publications": [ - { - "name": "Zur Elektrodynamik bewegter Körper", - "publisher": "Annalen der Physik", - "releaseDate": "1905-06-30", - "url": "https://en.wikisource.org/wiki/Translation:On_the_Electrodynamics_of_Moving_Bodies", - "summary": "It concerned an interpretation of the Michelson–Morley experiment and the properties of light and time. Special relativity incorporates the principle that the speed of light is the same for all inertial observers regardless of the state of motion of the source." - }, - { - "name": "Über einen die Erzeugung und Verwandlung des Lichtes betreffenden heuristischen Gesichtspunkt", - "publisher": "Annalen der Physik", - "releaseDate": "1905-03-18", - "url": "https://de.wikisource.org/wiki/Über_einen_die_Erzeugung_und_Verwandlung_des_Lichtes_betreffenden_heuristischen_Gesichtspunkt", - "summary": "In the second paper, he applied the quantum theory to light to explain the photoelectric effect. In particular, he used the idea of light quanta (photons) to explain experimental results, but stressed the importance of the experimental results. The importance of his work on the photoelectric effect earned him the Nobel Prize in Physics in 1921." - }, - { - "name": "Die Grundlage der allgemeinen Relativitätstheorie", - "publisher": "Annalen der Physik", - "releaseDate": "1916-03-20", - "url": "https://de.wikisource.org/wiki/Die_Grundlage_der_allgemeinen_Relativitätstheorie", - "summary": "The publication of the theory of general relativity made him internationally famous. He was professor of physics at the universities of Zurich (1909–1911) and Prague (1911–1912), before he returned to ETH Zurich (1912–1914)." - } - ], - "skills": [ - { - "name": "Physics", - "level": "Master", - "icon": "fa-solid fa-hashtag", - "keywords": [ - "Quantum Mechanics", - "Quantum Computing", - "Quantum Information", - "Quantum Cryptography", - "Quantum Communication", - "Quantum Teleportation" - ] - } - ], - "languages": [ - { - "language": "German", - "fluency": "Native speaker", - "icon": "" - }, - { - "language": "English", - "fluency": "Fluent", - "icon": "" - } - ], - "interests": [ - { - "name": "Physics", - "icon": "fa-solid fa-tag", - "keywords": [ - "Quantum Mechanics", - "Quantum Computing", - "Quantum Information", - "Quantum Cryptography", - "Quantum Communication", - "Quantum Teleportation" - ] - } - ], - "references": [ - { - "name": "Professor John Doe", - "icon": "fa-solid fa-laptop", - "reference": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit." - }, - { - "name": "Professor Jane Smith", - "icon": "fa-solid fa-thumbtack", - "reference": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam condimentum, diam quis convallis euismod, arcu mi ullamcorper lorem, a vestibulum nunc magna at sem. Sed in risus ac felis varius blandit." - } - ], - "projects": [ - { - "name": "Quantum Computing", - "summary": "Quantum computing is the use of quantum-mechanical phenomena such as superposition and entanglement to perform computation. Computers that perform quantum computations are known as quantum computers.", - "highlights": ["Quantum Teleportation", "Quantum Cryptography"], - "startDate": "2018-01-01", - "endDate": "2018-01-01" - } - ] -} diff --git a/assets/jupyter/blog.ipynb b/assets/jupyter/blog.ipynb deleted file mode 100644 index bc870dc..0000000 --- a/assets/jupyter/blog.ipynb +++ /dev/null @@ -1,48 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": false - }, - "outputs": [ - { - "data": { - "text/plain": [ - "sys.version_info(major=3, minor=6, micro=2, releaselevel='final', serial=0)" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "import sys\n", - "sys.version_info" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.6.2" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/assets/rendercv/design.yaml b/assets/rendercv/design.yaml deleted file mode 100644 index 9488f71..0000000 --- a/assets/rendercv/design.yaml +++ /dev/null @@ -1,7 +0,0 @@ -# for more options, see https://docs.rendercv.com/user_guide/yaml_input_structure/design/ -design: - theme: classic - page: - size: a4 - show_footer: false - show_top_note: false diff --git a/assets/rendercv/locale.yaml b/assets/rendercv/locale.yaml deleted file mode 100644 index ea11927..0000000 --- a/assets/rendercv/locale.yaml +++ /dev/null @@ -1,3 +0,0 @@ -# for more options, see https://docs.rendercv.com/user_guide/yaml_input_structure/locale/ -locale: - language: english diff --git a/assets/rendercv/rendercv_output/Albert_Einstein_CV.pdf b/assets/rendercv/rendercv_output/Albert_Einstein_CV.pdf deleted file mode 100644 index 52aab0e4faa01e90b05bca7797b1739eb5a61f99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71513 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%0DV9Ly-xXt0phXr!fw*7 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 $SITE/"