mirror of
https://github.com/harvard-edge/cs249r_book.git
synced 2026-03-11 17:49:25 -05:00
Merge latest dev updates into feat/volume-restructure
This commit is contained in:
75
.github/workflows/book-update-contributors.yml
vendored
75
.github/workflows/book-update-contributors.yml
vendored
@@ -1,75 +0,0 @@
|
||||
name: '📚 Book Update Contributors'
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
workflow_dispatch:
|
||||
|
||||
# =============================================================================
|
||||
# PATH CONFIGURATION - Uses GitHub Repository Variables (Settings > Variables)
|
||||
# =============================================================================
|
||||
# MLSysBook content lives under book/ to accommodate TinyTorch at root
|
||||
# Use ${{ vars.BOOK_ROOT }}, ${{ vars.BOOK_QUARTO }}, etc. in workflow steps
|
||||
# Variables: BOOK_ROOT, BOOK_DOCKER, BOOK_TOOLS, BOOK_QUARTO, BOOK_DEPS
|
||||
|
||||
jobs:
|
||||
update-contributors:
|
||||
name: Update Contributors List
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.11'
|
||||
cache: 'pip'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r ${{ vars.BOOK_DEPS }}/requirements.txt
|
||||
pip install PyGithub>=1.55
|
||||
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config --global user.name "github-actions[bot]"
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
|
||||
- name: Update contributors (script)
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: python ${{ github.workspace }}/.github/workflows/contributors/update_contributors.py
|
||||
|
||||
- name: Update contributors (cli)
|
||||
run: npx --yes all-contributors-cli generate
|
||||
|
||||
- name: Check for changes
|
||||
id: update
|
||||
run: |
|
||||
if git status .all-contributorsrc README.md ${{ vars.BOOK_QUARTO }}/contents/frontmatter/acknowledgements/acknowledgements.qmd --porcelain | grep .; then
|
||||
echo "changes_made=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "changes_made=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Commit Changes
|
||||
if: steps.update.outputs.changes_made == 'true'
|
||||
run: |
|
||||
BRANCH_NAME=${GITHUB_HEAD_REF:-$(git rev-parse --abbrev-ref HEAD)}
|
||||
|
||||
git add .all-contributorsrc README.md ${{ vars.BOOK_QUARTO }}/contents/frontmatter/acknowledgements/acknowledgements.qmd
|
||||
git commit -m "Update contributors list [skip ci]"
|
||||
git pull --rebase origin "$BRANCH_NAME"
|
||||
git push origin "$BRANCH_NAME"
|
||||
|
||||
- name: Report Status
|
||||
run: |
|
||||
if [ "${{ steps.update.outputs.changes_made }}" = "true" ]; then
|
||||
echo "✅ Contributors list has been updated"
|
||||
else
|
||||
echo "ℹ️ No changes were needed for contributors list"
|
||||
fi
|
||||
149
.github/workflows/contributors/README.md
vendored
Normal file
149
.github/workflows/contributors/README.md
vendored
Normal file
@@ -0,0 +1,149 @@
|
||||
# Contributor Management Scripts
|
||||
|
||||
This folder contains scripts for managing contributor recognition across the repository.
|
||||
|
||||
## Overview
|
||||
|
||||
The contributor system tracks contributions to four projects:
|
||||
- **book/** - ML Systems textbook
|
||||
- **tinytorch/** - Educational ML framework
|
||||
- **kits/** - Hardware kits
|
||||
- **labs/** - Lab exercises
|
||||
|
||||
Each project has its own `.all-contributorsrc` file, and the main `README.md` displays all contributors in organized sections.
|
||||
|
||||
## Scripts
|
||||
|
||||
### `update_contributors.py`
|
||||
|
||||
Updates the root `.all-contributorsrc` from GitHub API.
|
||||
|
||||
```bash
|
||||
# Requires GITHUB_TOKEN environment variable
|
||||
python update_contributors.py
|
||||
```
|
||||
|
||||
**What it does:**
|
||||
- Queries GitHub API for all repository contributors
|
||||
- Resolves git emails to GitHub usernames
|
||||
- Generates gravatar URLs for non-GitHub contributors
|
||||
- Merges new contributors with existing entries
|
||||
|
||||
### `generate_main_readme.py`
|
||||
|
||||
Generates the sectioned contributor table in the main `README.md`.
|
||||
|
||||
```bash
|
||||
python generate_main_readme.py [--dry-run]
|
||||
```
|
||||
|
||||
**What it does:**
|
||||
- Reads all four project `.all-contributorsrc` files
|
||||
- Generates HTML tables with contributor avatars and badges
|
||||
- Updates the Contributors section in `README.md`
|
||||
- Creates sections: Book, TinyTorch, Kits, Labs
|
||||
|
||||
### `generate_readme_tables.py`
|
||||
|
||||
Updates per-project README files with contributor tables.
|
||||
|
||||
```bash
|
||||
python generate_readme_tables.py [--project PROJECT] [--update]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--project`: Process only one project (book, tinytorch, kits, labs)
|
||||
- `--update`: Actually update the README files (without this, just prints)
|
||||
|
||||
**What it does:**
|
||||
- Reads each project's `.all-contributorsrc`
|
||||
- Generates HTML contributor tables
|
||||
- Updates the `<!-- ALL-CONTRIBUTORS-LIST -->` section in each project's README
|
||||
|
||||
### `scan_contributors.py`
|
||||
|
||||
Scans git history to discover contributors (manual/one-time use).
|
||||
|
||||
```bash
|
||||
python scan_contributors.py [--project PROJECT] [--output FORMAT] [--update]
|
||||
```
|
||||
|
||||
**Options:**
|
||||
- `--project`: Scan only one project
|
||||
- `--output`: Output format (table, json, rc)
|
||||
- `--update`: Update `.all-contributorsrc` files directly
|
||||
- `--dry-run`: Preview changes without writing
|
||||
|
||||
**What it does:**
|
||||
- Analyzes git commit history per project folder
|
||||
- Categorizes contributions (code, doc, bug, etc.) from commit messages
|
||||
- Maps git emails to GitHub usernames
|
||||
- Filters out bots and AI tools
|
||||
|
||||
## Workflow Integration
|
||||
|
||||
The `update-contributors.yml` workflow runs these scripts automatically:
|
||||
|
||||
```
|
||||
Trigger: Push to dev/main with .all-contributorsrc changes
|
||||
OR manual dispatch
|
||||
|
||||
Steps:
|
||||
1. update_contributors.py → Update root config from GitHub API
|
||||
2. generate_main_readme.py → Rebuild main README sections
|
||||
3. generate_readme_tables.py → Update per-project READMEs
|
||||
4. Commit and push changes
|
||||
```
|
||||
|
||||
## Adding Contributors
|
||||
|
||||
### Method 1: Bot Command (Recommended)
|
||||
|
||||
Comment on any issue or PR:
|
||||
```
|
||||
@all-contributors please add @username for doc, code, bug, or ideas
|
||||
```
|
||||
|
||||
### Method 2: Manual Edit
|
||||
|
||||
1. Edit the appropriate `.all-contributorsrc` file
|
||||
2. Add entry with: login, name, avatar_url, contributions
|
||||
3. Run the workflow or scripts manually
|
||||
|
||||
## Contribution Types
|
||||
|
||||
| Type | Emoji | Description |
|
||||
|------|-------|-------------|
|
||||
| bug | 🐛 | Bug reports |
|
||||
| code | 💻 | Code contributions |
|
||||
| doc | 📖 | Documentation |
|
||||
| design | 🎨 | Design work |
|
||||
| ideas | 💡 | Ideas and suggestions |
|
||||
| review | 👀 | Code review |
|
||||
| test | 🧪 | Testing |
|
||||
| tool | 🔧 | Tools and infrastructure |
|
||||
| tutorial | ✅ | Tutorials |
|
||||
| maintenance | 🚧 | Maintenance |
|
||||
|
||||
See [All Contributors emoji key](https://allcontributors.org/docs/en/emoji-key) for full list.
|
||||
|
||||
## File Structure
|
||||
|
||||
```
|
||||
.github/workflows/
|
||||
├── update-contributors.yml # Workflow definition
|
||||
└── contributors/
|
||||
├── README.md # This file
|
||||
├── requirements.txt # Python dependencies
|
||||
├── update_contributors.py # GitHub API updater
|
||||
├── generate_main_readme.py # Main README generator
|
||||
├── generate_readme_tables.py # Per-project README generator
|
||||
└── scan_contributors.py # Git history scanner
|
||||
|
||||
Project configs:
|
||||
├── .all-contributorsrc # Root config (legacy)
|
||||
├── book/.all-contributorsrc # Book contributors
|
||||
├── tinytorch/.all-contributorsrc # TinyTorch contributors
|
||||
├── kits/.all-contributorsrc # Kits contributors
|
||||
└── labs/.all-contributorsrc # Labs contributors
|
||||
```
|
||||
245
.github/workflows/contributors/generate_main_readme.py
vendored
Normal file
245
.github/workflows/contributors/generate_main_readme.py
vendored
Normal file
@@ -0,0 +1,245 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate the main README.md contributor section from all project configs.
|
||||
|
||||
This script reads the .all-contributorsrc files from each project
|
||||
(book, tinytorch, kits, labs) and generates a sectioned contributor
|
||||
table for the main README.md.
|
||||
|
||||
Usage:
|
||||
python generate_main_readme.py [--dry-run]
|
||||
"""
|
||||
|
||||
import json
|
||||
import re
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Contribution type to emoji mapping
|
||||
CONTRIBUTION_EMOJIS = {
|
||||
"bug": "🐛",
|
||||
"code": "💻",
|
||||
"design": "🎨",
|
||||
"doc": "📖",
|
||||
"ideas": "💡",
|
||||
"review": "👀",
|
||||
"test": "🧪",
|
||||
"tool": "🔧",
|
||||
"tutorial": "✅",
|
||||
"maintenance": "🚧",
|
||||
"infra": "🚇",
|
||||
"question": "💬",
|
||||
"translation": "🌍",
|
||||
"content": "🖋",
|
||||
"example": "💡",
|
||||
"security": "🔐",
|
||||
"financial": "💵",
|
||||
"fundingFinding": "🔍",
|
||||
"eventOrganizing": "📋",
|
||||
"talk": "📢",
|
||||
"video": "📹",
|
||||
"audio": "🔊",
|
||||
"data": "🔣",
|
||||
"platform": "📦",
|
||||
"projectManagement": "📆",
|
||||
"mentoring": "🧑🏫",
|
||||
"plugin": "🔌",
|
||||
"userTesting": "📓",
|
||||
"a11y": "♿️",
|
||||
"business": "💼",
|
||||
"research": "🔬",
|
||||
"promotion": "📣",
|
||||
}
|
||||
|
||||
|
||||
def load_config(path: Path) -> dict:
|
||||
"""Load a .all-contributorsrc file."""
|
||||
if not path.exists():
|
||||
return {"contributors": []}
|
||||
with open(path) as f:
|
||||
return json.load(f)
|
||||
|
||||
|
||||
def generate_contributor_cell(contributor: dict, show_badges: bool = True) -> str:
|
||||
"""Generate HTML for a single contributor cell."""
|
||||
login = contributor.get("login", "")
|
||||
name = contributor.get("name", login)
|
||||
avatar_url = contributor.get("avatar_url", "")
|
||||
profile = contributor.get("profile", f"https://github.com/{login}")
|
||||
contributions = contributor.get("contributions", [])
|
||||
|
||||
# Generate badge string
|
||||
badges = ""
|
||||
if show_badges and contributions:
|
||||
badges = " ".join(CONTRIBUTION_EMOJIS.get(c, "") for c in contributions)
|
||||
badges = f"<br />{badges}" if badges.strip() else ""
|
||||
|
||||
return f''' <td align="center" valign="top" width="14.28%"><a href="{profile}"><img src="{avatar_url}?v=4?s=80" width="80px;" alt="{name}"/><br /><sub><b>{name}</b></sub></a>{badges}</td>'''
|
||||
|
||||
|
||||
def generate_contributor_table(contributors: list, show_badges: bool = True) -> str:
|
||||
"""Generate an HTML table for contributors."""
|
||||
if not contributors:
|
||||
return "<p><em>Coming soon!</em></p>"
|
||||
|
||||
rows = []
|
||||
row_cells = []
|
||||
|
||||
for i, contributor in enumerate(contributors):
|
||||
row_cells.append(generate_contributor_cell(contributor, show_badges))
|
||||
|
||||
# 7 contributors per row
|
||||
if len(row_cells) == 7:
|
||||
rows.append(" <tr>\n" + "\n".join(row_cells) + "\n </tr>")
|
||||
row_cells = []
|
||||
|
||||
# Add remaining cells
|
||||
if row_cells:
|
||||
rows.append(" <tr>\n" + "\n".join(row_cells) + "\n </tr>")
|
||||
|
||||
return f'''<table>
|
||||
<tbody>
|
||||
{chr(10).join(rows)}
|
||||
</tbody>
|
||||
</table>'''
|
||||
|
||||
|
||||
def generate_sectioned_contributors(repo_root: Path) -> str:
|
||||
"""Generate the full sectioned contributor section showing ALL contributors."""
|
||||
# Load all configs
|
||||
book_config = load_config(repo_root / "book" / ".all-contributorsrc")
|
||||
tinytorch_config = load_config(repo_root / "tinytorch" / ".all-contributorsrc")
|
||||
kits_config = load_config(repo_root / "kits" / ".all-contributorsrc")
|
||||
labs_config = load_config(repo_root / "labs" / ".all-contributorsrc")
|
||||
|
||||
book_contributors = book_config.get("contributors", [])
|
||||
tinytorch_contributors = tinytorch_config.get("contributors", [])
|
||||
kits_contributors = kits_config.get("contributors", [])
|
||||
labs_contributors = labs_config.get("contributors", [])
|
||||
|
||||
# Count contributors
|
||||
book_count = len(book_contributors)
|
||||
tinytorch_count = len(tinytorch_contributors)
|
||||
kits_count = len(kits_contributors)
|
||||
labs_count = len(labs_contributors)
|
||||
|
||||
# Generate tables - show ALL contributors
|
||||
book_table = generate_contributor_table(book_contributors)
|
||||
tinytorch_table = generate_contributor_table(tinytorch_contributors)
|
||||
kits_table = generate_contributor_table(kits_contributors)
|
||||
labs_table = generate_contributor_table(labs_contributors)
|
||||
|
||||
return f'''## Contributors
|
||||
|
||||
Thanks goes to these wonderful people who have contributed to making this resource better for everyone ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||
|
||||
### 📖 Textbook Contributors ({book_count})
|
||||
|
||||
<!-- BOOK-CONTRIBUTORS-START -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
{book_table}
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
<!-- BOOK-CONTRIBUTORS-END -->
|
||||
|
||||
---
|
||||
|
||||
### 🔥 TinyTorch Contributors ({tinytorch_count})
|
||||
|
||||
<!-- TINYTORCH-CONTRIBUTORS-START -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
{tinytorch_table}
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
<!-- TINYTORCH-CONTRIBUTORS-END -->
|
||||
|
||||
---
|
||||
|
||||
### 🛠️ Hardware Kits Contributors ({kits_count})
|
||||
|
||||
<!-- KITS-CONTRIBUTORS-START -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
{kits_table}
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
<!-- KITS-CONTRIBUTORS-END -->
|
||||
|
||||
---
|
||||
|
||||
### 🧪 Labs Contributors ({labs_count})
|
||||
|
||||
<!-- LABS-CONTRIBUTORS-START -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
{labs_table}
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
<!-- LABS-CONTRIBUTORS-END -->
|
||||
|
||||
---
|
||||
|
||||
**Recognize a contributor:** Comment on any issue or PR:
|
||||
```
|
||||
@all-contributors please add @username for doc, code, bug, or ideas
|
||||
```'''
|
||||
|
||||
|
||||
def update_readme(repo_root: Path, dry_run: bool = False) -> bool:
|
||||
"""Update the main README.md with sectioned contributors."""
|
||||
readme_path = repo_root / "README.md"
|
||||
|
||||
if not readme_path.exists():
|
||||
print(f"ERROR: README.md not found at {readme_path}")
|
||||
return False
|
||||
|
||||
content = readme_path.read_text()
|
||||
|
||||
# Generate new contributor section
|
||||
new_section = generate_sectioned_contributors(repo_root)
|
||||
|
||||
# Pattern to match the entire Contributors section
|
||||
# From "## Contributors" to just before the next "---" followed by a div or end of file
|
||||
pattern = r'## Contributors\n.*?(?=\n---\n\n<div align="center">|\Z)'
|
||||
|
||||
if not re.search(pattern, content, re.DOTALL):
|
||||
print("ERROR: Could not find Contributors section in README.md")
|
||||
return False
|
||||
|
||||
# Replace the section
|
||||
new_content = re.sub(pattern, new_section, content, flags=re.DOTALL)
|
||||
|
||||
if dry_run:
|
||||
print("=== DRY RUN - Would update README.md with: ===")
|
||||
print(new_section[:2000] + "..." if len(new_section) > 2000 else new_section)
|
||||
return True
|
||||
|
||||
readme_path.write_text(new_content)
|
||||
print(f"Updated {readme_path}")
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
dry_run = "--dry-run" in sys.argv
|
||||
|
||||
# Find repo root (this script is in .github/workflows/contributors/)
|
||||
script_dir = Path(__file__).parent
|
||||
repo_root = script_dir.parent.parent.parent
|
||||
|
||||
# Verify we're in the right place
|
||||
if not (repo_root / "README.md").exists():
|
||||
print(f"ERROR: Cannot find README.md in {repo_root}")
|
||||
sys.exit(1)
|
||||
|
||||
success = update_readme(repo_root, dry_run)
|
||||
sys.exit(0 if success else 1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
169
.github/workflows/contributors/generate_readme_tables.py
vendored
Executable file
169
.github/workflows/contributors/generate_readme_tables.py
vendored
Executable file
@@ -0,0 +1,169 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Generate All Contributors tables for README files.
|
||||
|
||||
This script reads .all-contributorsrc files and generates the HTML tables
|
||||
that go in the README.md files.
|
||||
|
||||
Usage:
|
||||
python generate_readme_tables.py [--project PROJECT] [--update]
|
||||
"""
|
||||
|
||||
import json
|
||||
import re
|
||||
import argparse
|
||||
from pathlib import Path
|
||||
|
||||
PROJECTS = {
|
||||
"book": "book/",
|
||||
"kits": "kits/",
|
||||
"labs": "labs/",
|
||||
"tinytorch": "tinytorch/",
|
||||
}
|
||||
|
||||
# Emoji mapping for contribution types
|
||||
EMOJI_KEY = {
|
||||
"bug": "🐛",
|
||||
"code": "💻",
|
||||
"doc": "📖",
|
||||
"design": "🎨",
|
||||
"ideas": "💡",
|
||||
"review": "👀",
|
||||
"test": "🧪",
|
||||
"tool": "🔧",
|
||||
"translation": "🌍",
|
||||
"tutorial": "✅",
|
||||
"video": "📹",
|
||||
"question": "💬",
|
||||
"maintenance": "🚧",
|
||||
"infra": "🚇",
|
||||
"platform": "📦",
|
||||
"projectManagement": "📆",
|
||||
"research": "🔬",
|
||||
}
|
||||
|
||||
|
||||
def generate_contributor_cell(contributor: dict, image_size: int = 80) -> str:
|
||||
"""Generate HTML for a single contributor cell."""
|
||||
login = contributor['login']
|
||||
name = contributor.get('name', login)
|
||||
avatar_url = contributor.get('avatar_url', f"https://avatars.githubusercontent.com/{login}")
|
||||
profile = contributor.get('profile', f"https://github.com/{login}")
|
||||
contributions = contributor.get('contributions', [])
|
||||
|
||||
# Generate emoji badges
|
||||
badges = " ".join(EMOJI_KEY.get(c, c) for c in contributions)
|
||||
|
||||
return f'''<td align="center" valign="top" width="14.28%"><a href="{profile}"><img src="{avatar_url}?v=4?s={image_size}" width="{image_size}px;" alt="{name}"/><br /><sub><b>{name}</b></sub></a><br />{badges}</td>'''
|
||||
|
||||
|
||||
def generate_table(contributors: list[dict], per_line: int = 7, image_size: int = 80) -> str:
|
||||
"""Generate the full HTML table for contributors."""
|
||||
if not contributors:
|
||||
return ""
|
||||
|
||||
lines = ["<table>", " <tbody>"]
|
||||
|
||||
for i in range(0, len(contributors), per_line):
|
||||
row = contributors[i:i + per_line]
|
||||
lines.append(" <tr>")
|
||||
for contributor in row:
|
||||
lines.append(" " + generate_contributor_cell(contributor, image_size))
|
||||
lines.append(" </tr>")
|
||||
|
||||
lines.append(" </tbody>")
|
||||
lines.append("</table>")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def update_readme(project_path: str, table_html: str) -> bool:
|
||||
"""Update the README.md with the new contributors table."""
|
||||
readme_path = Path(project_path) / "README.md"
|
||||
|
||||
if not readme_path.exists():
|
||||
print(f"Warning: {readme_path} does not exist")
|
||||
return False
|
||||
|
||||
with open(readme_path, 'r') as f:
|
||||
content = f.read()
|
||||
|
||||
# Pattern to match the ALL-CONTRIBUTORS-LIST section
|
||||
pattern = r'(<!-- ALL-CONTRIBUTORS-LIST:START.*?-->).*?(<!-- ALL-CONTRIBUTORS-LIST:END -->)'
|
||||
|
||||
if not re.search(pattern, content, re.DOTALL):
|
||||
print(f"Warning: No ALL-CONTRIBUTORS-LIST markers found in {readme_path}")
|
||||
return False
|
||||
|
||||
# Build replacement content
|
||||
replacement = f'''\\1
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
{table_html}
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
\\2'''
|
||||
|
||||
new_content = re.sub(pattern, replacement, content, flags=re.DOTALL)
|
||||
|
||||
with open(readme_path, 'w') as f:
|
||||
f.write(new_content)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def process_project(project_name: str, project_path: str, update: bool = False) -> None:
|
||||
"""Process a single project."""
|
||||
rc_path = Path(project_path) / ".all-contributorsrc"
|
||||
|
||||
if not rc_path.exists():
|
||||
print(f"Skipping {project_name}: no .all-contributorsrc found")
|
||||
return
|
||||
|
||||
with open(rc_path, 'r') as f:
|
||||
rc_data = json.load(f)
|
||||
|
||||
contributors = rc_data.get('contributors', [])
|
||||
per_line = rc_data.get('contributorsPerLine', 7)
|
||||
image_size = rc_data.get('imageSize', 80)
|
||||
|
||||
if not contributors:
|
||||
print(f"{project_name}: No contributors to display")
|
||||
return
|
||||
|
||||
table_html = generate_table(contributors, per_line, image_size)
|
||||
|
||||
print(f"\n=== {project_name} ({len(contributors)} contributors) ===")
|
||||
|
||||
if update:
|
||||
if update_readme(project_path, table_html):
|
||||
print(f"Updated {project_path}README.md")
|
||||
else:
|
||||
print(f"Failed to update {project_path}README.md")
|
||||
else:
|
||||
print(table_html)
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Generate All Contributors tables")
|
||||
parser.add_argument("--project", choices=list(PROJECTS.keys()), help="Process specific project")
|
||||
parser.add_argument("--update", action="store_true", help="Update README files")
|
||||
args = parser.parse_args()
|
||||
|
||||
# Find repo root (this script is in .github/workflows/contributors/)
|
||||
script_dir = Path(__file__).parent
|
||||
repo_root = script_dir.parent.parent.parent
|
||||
|
||||
if args.project:
|
||||
projects = {args.project: PROJECTS[args.project]}
|
||||
else:
|
||||
projects = PROJECTS
|
||||
|
||||
for name, rel_path in projects.items():
|
||||
process_project(name, str(repo_root / rel_path), args.update)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
465
.github/workflows/contributors/scan_contributors.py
vendored
Executable file
465
.github/workflows/contributors/scan_contributors.py
vendored
Executable file
@@ -0,0 +1,465 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Scan git history to identify contributors per project.
|
||||
|
||||
This script analyzes git commits to:
|
||||
1. Find unique contributors per project folder
|
||||
2. Categorize contribution types based on commit messages and files changed
|
||||
3. Map git emails to GitHub usernames where possible
|
||||
4. Filter out bots and AI tools
|
||||
5. Output data for .all-contributorsrc files
|
||||
|
||||
Usage:
|
||||
python scan_contributors.py [--project PROJECT] [--output json|table|rc]
|
||||
|
||||
Examples:
|
||||
python scan_contributors.py # Scan all projects
|
||||
python scan_contributors.py --project tinytorch # Scan only tinytorch
|
||||
python scan_contributors.py --output json # Output as JSON
|
||||
"""
|
||||
|
||||
import subprocess
|
||||
import json
|
||||
import re
|
||||
import argparse
|
||||
from collections import defaultdict
|
||||
from pathlib import Path
|
||||
|
||||
# Project folders to scan
|
||||
PROJECTS = {
|
||||
"book": "book/",
|
||||
"kits": "kits/",
|
||||
"labs": "labs/",
|
||||
"tinytorch": "tinytorch/",
|
||||
}
|
||||
|
||||
# Patterns to exclude (bots, AI tools, etc.)
|
||||
EXCLUDE_PATTERNS = [
|
||||
r"bot",
|
||||
r"github-actions",
|
||||
r"dependabot",
|
||||
r"claude",
|
||||
r"cursor",
|
||||
r"copilot",
|
||||
r"\[bot\]",
|
||||
r"noreply\.github\.com.*bot",
|
||||
]
|
||||
|
||||
# Contribution type detection based on commit message keywords
|
||||
CONTRIBUTION_PATTERNS = {
|
||||
"bug": [
|
||||
r"\bfix(es|ed|ing)?\b",
|
||||
r"\bbug\b",
|
||||
r"\bissue\b",
|
||||
r"\berror\b",
|
||||
r"\bpatch\b",
|
||||
r"\bresolve[sd]?\b",
|
||||
],
|
||||
"doc": [
|
||||
r"\bdoc(s|umentation)?\b",
|
||||
r"\breadme\b",
|
||||
r"\bcomment\b",
|
||||
r"\btypo\b",
|
||||
r"\bspelling\b",
|
||||
r"\bgrammar\b",
|
||||
r"\bexplain\b",
|
||||
r"\bdescription\b",
|
||||
],
|
||||
"test": [
|
||||
r"\btest(s|ing)?\b",
|
||||
r"\bspec\b",
|
||||
r"\bcoverage\b",
|
||||
r"\bvalidat(e|ion)\b",
|
||||
],
|
||||
"code": [
|
||||
r"\bfeat(ure)?\b",
|
||||
r"\badd(s|ed|ing)?\b",
|
||||
r"\bimplement(s|ed|ing|ation)?\b",
|
||||
r"\bcreate[sd]?\b",
|
||||
r"\bbuild\b",
|
||||
r"\brefactor\b",
|
||||
r"\bupdate[sd]?\b",
|
||||
r"\benhance\b",
|
||||
r"\bimprove[sd]?\b",
|
||||
],
|
||||
"review": [
|
||||
r"\breview(ed|ing)?\b",
|
||||
r"\bfeedback\b",
|
||||
r"\bsuggestion\b",
|
||||
],
|
||||
"design": [
|
||||
r"\bdesign\b",
|
||||
r"\bdiagram\b",
|
||||
r"\bfigure\b",
|
||||
r"\bimage\b",
|
||||
r"\billustrat(e|ion)\b",
|
||||
r"\bvisual\b",
|
||||
],
|
||||
"translation": [
|
||||
r"\btranslat(e|ion|ed)\b",
|
||||
r"\blocali[sz](e|ation)\b",
|
||||
r"\bi18n\b",
|
||||
],
|
||||
"tool": [
|
||||
r"\btool(s|ing)?\b",
|
||||
r"\bscript\b",
|
||||
r"\bautomation\b",
|
||||
r"\bworkflow\b",
|
||||
r"\bci\b",
|
||||
r"\bcd\b",
|
||||
],
|
||||
"ideas": [
|
||||
r"\bidea\b",
|
||||
r"\bpropos(e|al)\b",
|
||||
r"\bsuggest\b",
|
||||
r"\brfc\b",
|
||||
],
|
||||
}
|
||||
|
||||
# Known email to GitHub username mappings (extend as needed)
|
||||
EMAIL_TO_GITHUB = {
|
||||
# Core team
|
||||
"vj@eecs.harvard.edu": "profvjreddi",
|
||||
"zeljko.hrcek@gmail.com": "hzeljko",
|
||||
"mjrovai@gmail.com": "Mjrovai",
|
||||
"jjj4se@virginia.edu": "jasonjabbour",
|
||||
"iuchendu@g.harvard.edu": "uchendui",
|
||||
|
||||
# Contributors
|
||||
"kkleinbard@avaya.com": "kai4avaya",
|
||||
"kai4avaya@gmail.com": "kai4avaya",
|
||||
"khoshnevis.naeem@gmail.com": "Naeemkh",
|
||||
"matthew_stewart@g.harvard.edu": "mrdragonbear",
|
||||
"jeffreyma@g.harvard.edu": "18jeffreyma",
|
||||
"douwedb@gmail.com": "V0XNIHILI",
|
||||
"shanzeh.batool@gmail.com": "shanzehbatool",
|
||||
"jaredping@yahoo.com": "JaredP94",
|
||||
"sara.khosravi.ds@gmail.com": "Sara-Khosravi",
|
||||
"i.j.shapira@gmail.com": "ishapira1",
|
||||
"durand.didier@gmail.com": "didier-durand",
|
||||
"gabriel.amazonas.eng@gmail.com": "GabrielAmazonas",
|
||||
"cbanbury@g.harvard.edu": "colbybanbury",
|
||||
"zishenwan@g.harvard.edu": "zishenwan",
|
||||
"mark@markmaz.com": "mmaz",
|
||||
"lazio2013@gmail.com": "ma3mool",
|
||||
"divya.amirtharaj@gmail.com": "DivyaAmirtharaj",
|
||||
"91.srivatsan@gmail.com": "srivatsankrishnan",
|
||||
"alexbrodriguez@gmail.com": "alxrod",
|
||||
"jlin3@college.harvard.edu": "jaysonzlin",
|
||||
"jwnchung@umich.edu": "jaywonchung",
|
||||
"jettythek@gmail.com": "jettythek",
|
||||
"anfe4949anfe@gmail.com": "andreamurillomtz",
|
||||
"oishibanerjee@gmail.com": "oishib",
|
||||
"yushun_hsiao@g.harvard.edu": "leo47007",
|
||||
"michael.schnebly@gmail.com": "MichaelSchnebly",
|
||||
"duongvanthuong9a8@gmail.com": "VThuong99",
|
||||
"eliasab@college.harvard.edu": "eliasab16",
|
||||
}
|
||||
|
||||
|
||||
def is_excluded(name: str, email: str) -> bool:
|
||||
"""Check if contributor should be excluded (bot, AI, etc.)."""
|
||||
combined = f"{name} {email}".lower()
|
||||
for pattern in EXCLUDE_PATTERNS:
|
||||
if re.search(pattern, combined, re.IGNORECASE):
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def detect_contribution_types(commit_message: str, files_changed: list[str]) -> set[str]:
|
||||
"""Detect contribution types from commit message and files changed."""
|
||||
types = set()
|
||||
message_lower = commit_message.lower()
|
||||
|
||||
# Check commit message patterns
|
||||
for contrib_type, patterns in CONTRIBUTION_PATTERNS.items():
|
||||
for pattern in patterns:
|
||||
if re.search(pattern, message_lower, re.IGNORECASE):
|
||||
types.add(contrib_type)
|
||||
break
|
||||
|
||||
# Check file extensions for additional hints
|
||||
for file in files_changed:
|
||||
file_lower = file.lower()
|
||||
if file_lower.endswith(('.md', '.rst', '.txt')):
|
||||
types.add("doc")
|
||||
elif file_lower.endswith(('test_', '_test.py', 'test.py', '.spec.')):
|
||||
types.add("test")
|
||||
elif 'test' in file_lower:
|
||||
types.add("test")
|
||||
elif file_lower.endswith(('.png', '.jpg', '.svg', '.gif')):
|
||||
types.add("design")
|
||||
elif file_lower.endswith(('.py', '.js', '.ts', '.c', '.cpp', '.h')):
|
||||
types.add("code")
|
||||
|
||||
# Default to "code" if nothing detected
|
||||
if not types:
|
||||
types.add("code")
|
||||
|
||||
return types
|
||||
|
||||
|
||||
def get_github_username(name: str, email: str) -> str | None:
|
||||
"""Try to get GitHub username from email or name."""
|
||||
email_lower = email.lower()
|
||||
|
||||
# Check known mappings
|
||||
if email_lower in EMAIL_TO_GITHUB:
|
||||
return EMAIL_TO_GITHUB[email_lower]
|
||||
|
||||
# Try to extract from noreply email
|
||||
# Format: 12345+username@users.noreply.github.com
|
||||
noreply_match = re.match(r'(\d+\+)?([^@]+)@users\.noreply\.github\.com', email_lower)
|
||||
if noreply_match:
|
||||
return noreply_match.group(2)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def get_commits_for_project(project_path: str) -> list[dict]:
|
||||
"""Get all commits for a project folder."""
|
||||
# Format: hash|author_name|author_email|subject
|
||||
cmd = [
|
||||
"git", "log",
|
||||
"--format=%H|%an|%ae|%s",
|
||||
"--name-only",
|
||||
"--", project_path
|
||||
]
|
||||
|
||||
try:
|
||||
result = subprocess.run(cmd, capture_output=True, text=True, check=True)
|
||||
except subprocess.CalledProcessError:
|
||||
return []
|
||||
|
||||
commits = []
|
||||
current_commit = None
|
||||
|
||||
for line in result.stdout.split('\n'):
|
||||
if '|' in line and line.count('|') >= 3:
|
||||
# This is a commit line
|
||||
if current_commit:
|
||||
commits.append(current_commit)
|
||||
|
||||
parts = line.split('|', 3)
|
||||
current_commit = {
|
||||
'hash': parts[0],
|
||||
'name': parts[1],
|
||||
'email': parts[2],
|
||||
'message': parts[3] if len(parts) > 3 else '',
|
||||
'files': []
|
||||
}
|
||||
elif line.strip() and current_commit:
|
||||
# This is a file line
|
||||
current_commit['files'].append(line.strip())
|
||||
|
||||
if current_commit:
|
||||
commits.append(current_commit)
|
||||
|
||||
return commits
|
||||
|
||||
|
||||
def analyze_project(project_name: str, project_path: str) -> dict:
|
||||
"""Analyze a project and return contributor data."""
|
||||
commits = get_commits_for_project(project_path)
|
||||
|
||||
# Aggregate by contributor
|
||||
contributors = defaultdict(lambda: {
|
||||
'name': '',
|
||||
'email': '',
|
||||
'github': None,
|
||||
'commits': 0,
|
||||
'types': set(),
|
||||
})
|
||||
|
||||
for commit in commits:
|
||||
name = commit['name']
|
||||
email = commit['email']
|
||||
|
||||
# Skip excluded contributors
|
||||
if is_excluded(name, email):
|
||||
continue
|
||||
|
||||
# Use email as key for deduplication
|
||||
key = email.lower()
|
||||
|
||||
contributors[key]['name'] = name
|
||||
contributors[key]['email'] = email
|
||||
contributors[key]['github'] = get_github_username(name, email)
|
||||
contributors[key]['commits'] += 1
|
||||
|
||||
# Detect contribution types
|
||||
types = detect_contribution_types(commit['message'], commit['files'])
|
||||
contributors[key]['types'].update(types)
|
||||
|
||||
# Convert to list and sort by commits
|
||||
result = []
|
||||
for email, data in contributors.items():
|
||||
result.append({
|
||||
'name': data['name'],
|
||||
'email': data['email'],
|
||||
'github': data['github'],
|
||||
'commits': data['commits'],
|
||||
'types': sorted(list(data['types'])),
|
||||
})
|
||||
|
||||
result.sort(key=lambda x: x['commits'], reverse=True)
|
||||
return {
|
||||
'project': project_name,
|
||||
'path': project_path,
|
||||
'contributors': result,
|
||||
'total_contributors': len(result),
|
||||
}
|
||||
|
||||
|
||||
def format_as_table(data: dict) -> str:
|
||||
"""Format project data as a markdown table."""
|
||||
lines = [
|
||||
f"\n## {data['project']} ({data['total_contributors']} contributors)\n",
|
||||
"| Name | GitHub | Commits | Types |",
|
||||
"|------|--------|---------|-------|",
|
||||
]
|
||||
|
||||
for c in data['contributors']:
|
||||
github = f"@{c['github']}" if c['github'] else "?"
|
||||
types = ", ".join(c['types'])
|
||||
lines.append(f"| {c['name']} | {github} | {c['commits']} | {types} |")
|
||||
|
||||
return "\n".join(lines)
|
||||
|
||||
|
||||
def format_as_allcontributorsrc(data: dict) -> dict:
|
||||
"""Format project data as .all-contributorsrc contributor entries."""
|
||||
# Dedupe by GitHub username
|
||||
seen_github = {}
|
||||
|
||||
for c in data['contributors']:
|
||||
if not c['github']:
|
||||
continue # Skip if no GitHub username
|
||||
|
||||
github_lower = c['github'].lower()
|
||||
|
||||
if github_lower in seen_github:
|
||||
# Merge contribution types
|
||||
seen_github[github_lower]['contributions'].update(c['types'])
|
||||
# Keep higher commit count name
|
||||
if c['commits'] > seen_github[github_lower].get('_commits', 0):
|
||||
seen_github[github_lower]['name'] = c['name']
|
||||
seen_github[github_lower]['_commits'] = c['commits']
|
||||
else:
|
||||
seen_github[github_lower] = {
|
||||
"login": c['github'],
|
||||
"name": c['name'],
|
||||
"avatar_url": f"https://avatars.githubusercontent.com/{c['github']}",
|
||||
"profile": f"https://github.com/{c['github']}",
|
||||
"contributions": set(c['types']),
|
||||
"_commits": c['commits']
|
||||
}
|
||||
|
||||
# Convert sets to sorted lists and remove internal fields
|
||||
contributors = []
|
||||
for entry in seen_github.values():
|
||||
contributors.append({
|
||||
"login": entry['login'],
|
||||
"name": entry['name'],
|
||||
"avatar_url": entry['avatar_url'],
|
||||
"profile": entry['profile'],
|
||||
"contributions": sorted(list(entry['contributions']))
|
||||
})
|
||||
|
||||
# Sort by number of contribution types (most active first)
|
||||
contributors.sort(key=lambda x: len(x['contributions']), reverse=True)
|
||||
|
||||
return {
|
||||
"project": data['project'],
|
||||
"contributors": contributors
|
||||
}
|
||||
|
||||
|
||||
def update_allcontributorsrc(project_name: str, contributors: list[dict], dry_run: bool = True) -> bool:
|
||||
"""Update the .all-contributorsrc file for a project."""
|
||||
rc_path = Path(PROJECTS[project_name]) / ".all-contributorsrc"
|
||||
|
||||
if not rc_path.exists():
|
||||
print(f"Warning: {rc_path} does not exist", file=__import__('sys').stderr)
|
||||
return False
|
||||
|
||||
with open(rc_path, 'r') as f:
|
||||
rc_data = json.load(f)
|
||||
|
||||
# Merge new contributors with existing
|
||||
existing_logins = {c['login'].lower() for c in rc_data.get('contributors', [])}
|
||||
|
||||
added = []
|
||||
for new_contrib in contributors:
|
||||
if new_contrib['login'].lower() not in existing_logins:
|
||||
rc_data.setdefault('contributors', []).append(new_contrib)
|
||||
added.append(new_contrib['login'])
|
||||
existing_logins.add(new_contrib['login'].lower())
|
||||
|
||||
if dry_run:
|
||||
print(f"\n[DRY RUN] Would add {len(added)} contributors to {rc_path}:")
|
||||
for login in added:
|
||||
print(f" - @{login}")
|
||||
return True
|
||||
|
||||
# Write updated file
|
||||
with open(rc_path, 'w') as f:
|
||||
json.dump(rc_data, f, indent=4)
|
||||
|
||||
print(f"Updated {rc_path} with {len(added)} new contributors")
|
||||
return True
|
||||
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Scan git history for contributors")
|
||||
parser.add_argument("--project", choices=list(PROJECTS.keys()), help="Scan specific project")
|
||||
parser.add_argument("--output", choices=["json", "table", "rc"], default="table", help="Output format")
|
||||
parser.add_argument("--min-commits", type=int, default=1, help="Minimum commits to include")
|
||||
parser.add_argument("--update", action="store_true", help="Update .all-contributorsrc files")
|
||||
parser.add_argument("--dry-run", action="store_true", help="Show what would be updated without writing")
|
||||
args = parser.parse_args()
|
||||
|
||||
# Determine which projects to scan
|
||||
if args.project:
|
||||
projects = {args.project: PROJECTS[args.project]}
|
||||
else:
|
||||
projects = PROJECTS
|
||||
|
||||
results = []
|
||||
|
||||
for name, path in projects.items():
|
||||
print(f"Scanning {name}...", file=__import__('sys').stderr)
|
||||
data = analyze_project(name, path)
|
||||
|
||||
# Filter by minimum commits
|
||||
data['contributors'] = [c for c in data['contributors'] if c['commits'] >= args.min_commits]
|
||||
data['total_contributors'] = len(data['contributors'])
|
||||
|
||||
results.append(data)
|
||||
|
||||
# Update mode
|
||||
if args.update or args.dry_run:
|
||||
for data in results:
|
||||
rc_data = format_as_allcontributorsrc(data)
|
||||
update_allcontributorsrc(
|
||||
data['project'],
|
||||
rc_data['contributors'],
|
||||
dry_run=args.dry_run or not args.update
|
||||
)
|
||||
return
|
||||
|
||||
# Output results
|
||||
if args.output == "json":
|
||||
print(json.dumps(results, indent=2))
|
||||
elif args.output == "rc":
|
||||
for data in results:
|
||||
rc_data = format_as_allcontributorsrc(data)
|
||||
print(f"\n=== {data['project']}/.all-contributorsrc contributors ===")
|
||||
print(json.dumps(rc_data['contributors'], indent=2))
|
||||
else: # table
|
||||
for data in results:
|
||||
print(format_as_table(data))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
@@ -1,3 +1,27 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Update contributors from GitHub API.
|
||||
|
||||
This script queries the GitHub API to find all contributors to the repository
|
||||
and updates the root .all-contributorsrc file with their information.
|
||||
|
||||
Features:
|
||||
- Fetches contributors from GitHub commit history
|
||||
- Resolves email addresses to GitHub usernames
|
||||
- Generates gravatar URLs for contributors without GitHub avatars
|
||||
- Excludes bots and specified users
|
||||
- Merges new contributors with existing ones
|
||||
|
||||
Usage:
|
||||
python update_contributors.py
|
||||
|
||||
Environment variables:
|
||||
GITHUB_TOKEN: Required. GitHub personal access token for API access.
|
||||
|
||||
Note: This script updates the ROOT .all-contributorsrc file only.
|
||||
For per-project configs, use scan_contributors.py instead.
|
||||
"""
|
||||
|
||||
import os
|
||||
import json
|
||||
import random
|
||||
|
||||
133
.github/workflows/update-contributors.yml
vendored
Normal file
133
.github/workflows/update-contributors.yml
vendored
Normal file
@@ -0,0 +1,133 @@
|
||||
name: '👥 Update Contributors'
|
||||
|
||||
# =============================================================================
|
||||
# CONTRIBUTOR UPDATE WORKFLOW
|
||||
# =============================================================================
|
||||
# Automatically updates contributor recognition across all projects.
|
||||
#
|
||||
# TRIGGERS:
|
||||
# - push: When any .all-contributorsrc file changes on dev or main
|
||||
# - workflow_dispatch: Manual trigger from Actions UI
|
||||
# - workflow_call: Called by other workflows
|
||||
#
|
||||
# WHAT IT DOES:
|
||||
# 1. Updates root .all-contributorsrc from GitHub API
|
||||
# 2. Generates sectioned contributor tables in main README.md
|
||||
# 3. Updates per-project README.md files (book, tinytorch, kits, labs)
|
||||
# 4. Commits and pushes changes automatically
|
||||
#
|
||||
# ADDING CONTRIBUTORS:
|
||||
# Option 1: Comment on any issue/PR with:
|
||||
# @all-contributors please add @username for doc, code, bug, ideas
|
||||
# Option 2: Manually edit the .all-contributorsrc file for the project
|
||||
#
|
||||
# SCRIPTS (in .github/workflows/contributors/):
|
||||
# - update_contributors.py : Fetches contributors from GitHub API
|
||||
# - generate_main_readme.py : Builds sectioned main README
|
||||
# - generate_readme_tables.py : Updates per-project READMEs
|
||||
# - scan_contributors.py : Scans git history (manual use)
|
||||
#
|
||||
# See .github/workflows/contributors/README.md for full documentation.
|
||||
# =============================================================================
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
branches: [dev, main]
|
||||
paths:
|
||||
- '.all-contributorsrc'
|
||||
- 'book/.all-contributorsrc'
|
||||
- 'tinytorch/.all-contributorsrc'
|
||||
- 'kits/.all-contributorsrc'
|
||||
- 'labs/.all-contributorsrc'
|
||||
|
||||
jobs:
|
||||
update-contributors:
|
||||
name: Update Contributors List
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Python
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: '3.11'
|
||||
cache: 'pip'
|
||||
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r ${{ vars.BOOK_DEPS }}/requirements.txt
|
||||
pip install PyGithub>=1.55
|
||||
|
||||
- name: Configure Git
|
||||
run: |
|
||||
git config --global user.name "github-actions[bot]"
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
|
||||
- name: Update root contributors config
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: python ${{ github.workspace }}/.github/workflows/contributors/update_contributors.py
|
||||
|
||||
- name: Generate sectioned main README
|
||||
run: python ${{ github.workspace }}/.github/workflows/contributors/generate_main_readme.py
|
||||
|
||||
- name: Generate per-project README tables
|
||||
run: |
|
||||
# Generate tables for each project README from their configs
|
||||
python ${{ github.workspace }}/.github/workflows/contributors/generate_readme_tables.py --update 2>/dev/null || true
|
||||
|
||||
- name: Check for changes
|
||||
id: update
|
||||
run: |
|
||||
FILES_TO_CHECK=(
|
||||
".all-contributorsrc"
|
||||
"README.md"
|
||||
"book/.all-contributorsrc"
|
||||
"book/README.md"
|
||||
"tinytorch/.all-contributorsrc"
|
||||
"tinytorch/README.md"
|
||||
"kits/.all-contributorsrc"
|
||||
"kits/README.md"
|
||||
"labs/.all-contributorsrc"
|
||||
"labs/README.md"
|
||||
"${{ vars.BOOK_QUARTO }}/contents/frontmatter/acknowledgements/acknowledgements.qmd"
|
||||
)
|
||||
|
||||
if git status "${FILES_TO_CHECK[@]}" --porcelain 2>/dev/null | grep .; then
|
||||
echo "changes_made=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "changes_made=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
- name: Commit Changes
|
||||
if: steps.update.outputs.changes_made == 'true'
|
||||
run: |
|
||||
BRANCH_NAME=${GITHUB_HEAD_REF:-$(git rev-parse --abbrev-ref HEAD)}
|
||||
|
||||
# Add all contributor-related files
|
||||
git add -A .all-contributorsrc README.md \
|
||||
book/.all-contributorsrc book/README.md \
|
||||
tinytorch/.all-contributorsrc tinytorch/README.md \
|
||||
kits/.all-contributorsrc kits/README.md \
|
||||
labs/.all-contributorsrc labs/README.md \
|
||||
${{ vars.BOOK_QUARTO }}/contents/frontmatter/acknowledgements/acknowledgements.qmd \
|
||||
2>/dev/null || true
|
||||
|
||||
git commit -m "Update contributors list [skip ci]"
|
||||
git pull --rebase origin "$BRANCH_NAME"
|
||||
git push origin "$BRANCH_NAME"
|
||||
|
||||
- name: Report Status
|
||||
run: |
|
||||
if [ "${{ steps.update.outputs.changes_made }}" = "true" ]; then
|
||||
echo "✅ Contributors list has been updated"
|
||||
else
|
||||
echo "ℹ️ No changes were needed for contributors list"
|
||||
fi
|
||||
295
README.md
295
README.md
@@ -335,167 +335,224 @@ The textbook content (chapters, figures, explanations) is educational material t
|
||||
|
||||
## Contributors
|
||||
|
||||
Thanks goes to these wonderful people who have contributed to making this resource better for everyone:
|
||||
Thanks goes to these wonderful people who have contributed to making this resource better for everyone ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
### 📖 Textbook Contributors (102)
|
||||
|
||||
<!-- BOOK-CONTRIBUTORS-START -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?s=100" width="100px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/hzeljko"><img src="https://avatars.githubusercontent.com/hzeljko?s=100" width="100px;" alt="Zeljko Hrcek"/><br /><sub><b>Zeljko Hrcek</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/Mjrovai"><img src="https://avatars.githubusercontent.com/Mjrovai?s=100" width="100px;" alt="Marcelo Rovai"/><br /><sub><b>Marcelo Rovai</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/jasonjabbour"><img src="https://avatars.githubusercontent.com/jasonjabbour?s=100" width="100px;" alt="Jason Jabbour"/><br /><sub><b>Jason Jabbour</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/kai4avaya"><img src="https://avatars.githubusercontent.com/kai4avaya?s=100" width="100px;" alt="Kai Kleinbard"/><br /><sub><b>Kai Kleinbard</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 💡 👀 🧪 🔧</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mjrovai"><img src="https://avatars.githubusercontent.com/Mjrovai?v=4?s=80" width="80px;" alt="Marcelo Rovai"/><br /><sub><b>Marcelo Rovai</b></sub></a><br />💻 🎨 🧪</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GabrielAmazonas"><img src="https://avatars.githubusercontent.com/GabrielAmazonas?v=4?s=80" width="80px;" alt="Gabriel Amazonas"/><br /><sub><b>Gabriel Amazonas</b></sub></a><br />🐛 📖 💡</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hzeljko"><img src="https://avatars.githubusercontent.com/hzeljko?v=4?s=80" width="80px;" alt="Zeljko Hrcek"/><br /><sub><b>Zeljko Hrcek</b></sub></a><br />💻</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jasonjabbour"><img src="https://avatars.githubusercontent.com/jasonjabbour?v=4?s=80" width="80px;" alt="Jason Jabbour"/><br /><sub><b>Jason Jabbour</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/uchendui"><img src="https://avatars.githubusercontent.com/uchendui?v=4?s=80" width="80px;" alt="Ikechukwu Uchendu"/><br /><sub><b>Ikechukwu Uchendu</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Naeemkh"><img src="https://avatars.githubusercontent.com/Naeemkh?v=4?s=80" width="80px;" alt="Naeem Khoshnevis"/><br /><sub><b>Naeem Khoshnevis</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/uchendui"><img src="https://avatars.githubusercontent.com/uchendui?s=100" width="100px;" alt="Ikechukwu Uchendu"/><br /><sub><b>Ikechukwu Uchendu</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/Naeemkh"><img src="https://avatars.githubusercontent.com/Naeemkh?s=100" width="100px;" alt="Naeem Khoshnevis"/><br /><sub><b>Naeem Khoshnevis</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/Sara-Khosravi"><img src="https://avatars.githubusercontent.com/Sara-Khosravi?s=100" width="100px;" alt="Sara Khosravi"/><br /><sub><b>Sara Khosravi</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/V0XNIHILI"><img src="https://avatars.githubusercontent.com/V0XNIHILI?s=100" width="100px;" alt="Douwe den Blanken"/><br /><sub><b>Douwe den Blanken</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/18jeffreyma"><img src="https://avatars.githubusercontent.com/18jeffreyma?s=100" width="100px;" alt="Jeffrey Ma"/><br /><sub><b>Jeffrey Ma</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Sara-Khosravi"><img src="https://avatars.githubusercontent.com/Sara-Khosravi?v=4?s=80" width="80px;" alt="Sara Khosravi"/><br /><sub><b>Sara Khosravi</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/V0XNIHILI"><img src="https://avatars.githubusercontent.com/V0XNIHILI?v=4?s=80" width="80px;" alt="Douwe den Blanken"/><br /><sub><b>Douwe den Blanken</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/18jeffreyma"><img src="https://avatars.githubusercontent.com/18jeffreyma?v=4?s=80" width="80px;" alt="Jeffrey Ma"/><br /><sub><b>Jeffrey Ma</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shanzehbatool"><img src="https://avatars.githubusercontent.com/shanzehbatool?v=4?s=80" width="80px;" alt="shanzehbatool"/><br /><sub><b>shanzehbatool</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eliasab16"><img src="https://avatars.githubusercontent.com/eliasab16?v=4?s=80" width="80px;" alt="Elias"/><br /><sub><b>Elias</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JaredP94"><img src="https://avatars.githubusercontent.com/JaredP94?v=4?s=80" width="80px;" alt="Jared Ping"/><br /><sub><b>Jared Ping</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ishapira1"><img src="https://avatars.githubusercontent.com/ishapira1?v=4?s=80" width="80px;" alt="Itai Shapira"/><br /><sub><b>Itai Shapira</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/didier-durand"><img src="https://avatars.githubusercontent.com/didier-durand?s=100" width="100px;" alt="Didier Durand"/><br /><sub><b>Didier Durand</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/shanzehbatool"><img src="https://avatars.githubusercontent.com/shanzehbatool?s=100" width="100px;" alt="shanzehbatool"/><br /><sub><b>shanzehbatool</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/eliasab16"><img src="https://avatars.githubusercontent.com/eliasab16?s=100" width="100px;" alt="Elias"/><br /><sub><b>Elias</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/JaredP94"><img src="https://avatars.githubusercontent.com/JaredP94?s=100" width="100px;" alt="Jared Ping"/><br /><sub><b>Jared Ping</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/ishapira1"><img src="https://avatars.githubusercontent.com/ishapira1?s=100" width="100px;" alt="Itai Shapira"/><br /><sub><b>Itai Shapira</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8863743b4f26c1a20e730fcf7ebc3bc0?d=identicon&s=100?v=4?s=80" width="80px;" alt="Maximilian Lam"/><br /><sub><b>Maximilian Lam</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jaysonzlin"><img src="https://avatars.githubusercontent.com/jaysonzlin?v=4?s=80" width="80px;" alt="Jayson Lin"/><br /><sub><b>Jayson Lin</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sophiacho1"><img src="https://avatars.githubusercontent.com/sophiacho1?v=4?s=80" width="80px;" alt="Sophia Cho"/><br /><sub><b>Sophia Cho</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/andreamurillomtz"><img src="https://avatars.githubusercontent.com/andreamurillomtz?v=4?s=80" width="80px;" alt="Andrea"/><br /><sub><b>Andrea</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/alxrod"><img src="https://avatars.githubusercontent.com/alxrod?v=4?s=80" width="80px;" alt="Alex Rodriguez"/><br /><sub><b>Alex Rodriguez</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/korneelf1"><img src="https://avatars.githubusercontent.com/korneelf1?v=4?s=80" width="80px;" alt="Korneel Van den Berghe"/><br /><sub><b>Korneel Van den Berghe</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/foundingnimo"><img src="https://avatars.githubusercontent.com/foundingnimo?v=4?s=80" width="80px;" alt="Nimo"/><br /><sub><b>Nimo</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8863743b4f26c1a20e730fcf7ebc3bc0?d=identicon&s=100?s=100" width="100px;" alt="Maximilian Lam"/><br /><sub><b>Maximilian Lam</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/jaysonzlin"><img src="https://avatars.githubusercontent.com/jaysonzlin?s=100" width="100px;" alt="Jayson Lin"/><br /><sub><b>Jayson Lin</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/sophiacho1"><img src="https://avatars.githubusercontent.com/sophiacho1?s=100" width="100px;" alt="Sophia Cho"/><br /><sub><b>Sophia Cho</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/andreamurillomtz"><img src="https://avatars.githubusercontent.com/andreamurillomtz?s=100" width="100px;" alt="Andrea"/><br /><sub><b>Andrea</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/alxrod"><img src="https://avatars.githubusercontent.com/alxrod?s=100" width="100px;" alt="Alex Rodriguez"/><br /><sub><b>Alex Rodriguez</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/colbybanbury"><img src="https://avatars.githubusercontent.com/colbybanbury?v=4?s=80" width="80px;" alt="Colby Banbury"/><br /><sub><b>Colby Banbury</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zishenwan"><img src="https://avatars.githubusercontent.com/zishenwan?v=4?s=80" width="80px;" alt="Zishen Wan"/><br /><sub><b>Zishen Wan</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mmaz"><img src="https://avatars.githubusercontent.com/mmaz?v=4?s=80" width="80px;" alt="Mark Mazumder"/><br /><sub><b>Mark Mazumder</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ma3mool"><img src="https://avatars.githubusercontent.com/ma3mool?v=4?s=80" width="80px;" alt="Abdulrahman Mahmoud"/><br /><sub><b>Abdulrahman Mahmoud</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DivyaAmirtharaj"><img src="https://avatars.githubusercontent.com/DivyaAmirtharaj?v=4?s=80" width="80px;" alt="Divya Amirtharaj"/><br /><sub><b>Divya Amirtharaj</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/srivatsankrishnan"><img src="https://avatars.githubusercontent.com/srivatsankrishnan?v=4?s=80" width="80px;" alt="Srivatsan Krishnan"/><br /><sub><b>Srivatsan Krishnan</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arnaumarin"><img src="https://avatars.githubusercontent.com/arnaumarin?v=4?s=80" width="80px;" alt="marin-llobet"/><br /><sub><b>marin-llobet</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/korneelf1"><img src="https://avatars.githubusercontent.com/korneelf1?s=100" width="100px;" alt="Korneel Van den Berghe"/><br /><sub><b>Korneel Van den Berghe</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/foundingnimo"><img src="https://avatars.githubusercontent.com/foundingnimo?s=100" width="100px;" alt="Nimo"/><br /><sub><b>Nimo</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/colbybanbury"><img src="https://avatars.githubusercontent.com/colbybanbury?s=100" width="100px;" alt="Colby Banbury"/><br /><sub><b>Colby Banbury</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/zishenwan"><img src="https://avatars.githubusercontent.com/zishenwan?s=100" width="100px;" alt="Zishen Wan"/><br /><sub><b>Zishen Wan</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/GabrielAmazonas"><img src="https://avatars.githubusercontent.com/GabrielAmazonas?s=100" width="100px;" alt="Gabriel Amazonas"/><br /><sub><b>Gabriel Amazonas</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aptl26"><img src="https://avatars.githubusercontent.com/aptl26?v=4?s=80" width="80px;" alt="Aghyad Deeb"/><br /><sub><b>Aghyad Deeb</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/James-QiuHaoran"><img src="https://avatars.githubusercontent.com/James-QiuHaoran?v=4?s=80" width="80px;" alt="Haoran Qiu"/><br /><sub><b>Haoran Qiu</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ekhao"><img src="https://avatars.githubusercontent.com/Ekhao?v=4?s=80" width="80px;" alt="Emil Njor"/><br /><sub><b>Emil Njor</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ELSuitorHarvard"><img src="https://avatars.githubusercontent.com/ELSuitorHarvard?v=4?s=80" width="80px;" alt="ELSuitorHarvard"/><br /><sub><b>ELSuitorHarvard</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kaiM0ves"><img src="https://avatars.githubusercontent.com/kaiM0ves?v=4?s=80" width="80px;" alt="kaiM0ves"/><br /><sub><b>kaiM0ves</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/oishib"><img src="https://avatars.githubusercontent.com/oishib?v=4?s=80" width="80px;" alt="oishib"/><br /><sub><b>oishib</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jared-ni"><img src="https://avatars.githubusercontent.com/jared-ni?v=4?s=80" width="80px;" alt="Jared Ni"/><br /><sub><b>Jared Ni</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/mmaz"><img src="https://avatars.githubusercontent.com/mmaz?s=100" width="100px;" alt="Mark Mazumder"/><br /><sub><b>Mark Mazumder</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/ma3mool"><img src="https://avatars.githubusercontent.com/ma3mool?s=100" width="100px;" alt="Abdulrahman Mahmoud"/><br /><sub><b>Abdulrahman Mahmoud</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/DivyaAmirtharaj"><img src="https://avatars.githubusercontent.com/DivyaAmirtharaj?s=100" width="100px;" alt="Divya Amirtharaj"/><br /><sub><b>Divya Amirtharaj</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/srivatsankrishnan"><img src="https://avatars.githubusercontent.com/srivatsankrishnan?s=100" width="100px;" alt="Srivatsan Krishnan"/><br /><sub><b>Srivatsan Krishnan</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/arnaumarin"><img src="https://avatars.githubusercontent.com/arnaumarin?s=100" width="100px;" alt="marin-llobet"/><br /><sub><b>marin-llobet</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AditiR-42"><img src="https://avatars.githubusercontent.com/AditiR-42?v=4?s=80" width="80px;" alt="Aditi Raju"/><br /><sub><b>Aditi Raju</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MichaelSchnebly"><img src="https://avatars.githubusercontent.com/MichaelSchnebly?v=4?s=80" width="80px;" alt="Michael Schnebly"/><br /><sub><b>Michael Schnebly</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VThuong99"><img src="https://avatars.githubusercontent.com/VThuong99?v=4?s=80" width="80px;" alt="Thuong Duong"/><br /><sub><b>Thuong Duong</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/leo47007"><img src="https://avatars.githubusercontent.com/leo47007?v=4?s=80" width="80px;" alt="Yu-Shun Hsiao"/><br /><sub><b>Yu-Shun Hsiao</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BaeHenryS"><img src="https://avatars.githubusercontent.com/BaeHenryS?v=4?s=80" width="80px;" alt="Henry Bae"/><br /><sub><b>Henry Bae</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eimlav"><img src="https://avatars.githubusercontent.com/eimlav?v=4?s=80" width="80px;" alt="Eimhin Laverty"/><br /><sub><b>Eimhin Laverty</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jaywonchung"><img src="https://avatars.githubusercontent.com/jaywonchung?v=4?s=80" width="80px;" alt="Jae-Won Chung"/><br /><sub><b>Jae-Won Chung</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/aptl26"><img src="https://avatars.githubusercontent.com/aptl26?s=100" width="100px;" alt="Aghyad Deeb"/><br /><sub><b>Aghyad Deeb</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/James-QiuHaoran"><img src="https://avatars.githubusercontent.com/James-QiuHaoran?s=100" width="100px;" alt="Haoran Qiu"/><br /><sub><b>Haoran Qiu</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/Ekhao"><img src="https://avatars.githubusercontent.com/Ekhao?s=100" width="100px;" alt="Emil Njor"/><br /><sub><b>Emil Njor</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/ELSuitorHarvard"><img src="https://avatars.githubusercontent.com/ELSuitorHarvard?s=100" width="100px;" alt="ELSuitorHarvard"/><br /><sub><b>ELSuitorHarvard</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/kaiM0ves"><img src="https://avatars.githubusercontent.com/kaiM0ves?s=100" width="100px;" alt="kaiM0ves"/><br /><sub><b>kaiM0ves</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ShvetankPrakash"><img src="https://avatars.githubusercontent.com/ShvetankPrakash?v=4?s=80" width="80px;" alt="Shvetank Prakash"/><br /><sub><b>Shvetank Prakash</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marcozennaro"><img src="https://avatars.githubusercontent.com/marcozennaro?v=4?s=80" width="80px;" alt="Marco Zennaro"/><br /><sub><b>Marco Zennaro</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aryatschand"><img src="https://avatars.githubusercontent.com/aryatschand?v=4?s=80" width="80px;" alt="Arya Tschand"/><br /><sub><b>Arya Tschand</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arbass22"><img src="https://avatars.githubusercontent.com/arbass22?v=4?s=80" width="80px;" alt="Andrew Bass"/><br /><sub><b>Andrew Bass</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pongtr"><img src="https://avatars.githubusercontent.com/pongtr?v=4?s=80" width="80px;" alt="Pong Trairatvorakul"/><br /><sub><b>Pong Trairatvorakul</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/euranofshin"><img src="https://avatars.githubusercontent.com/euranofshin?v=4?s=80" width="80px;" alt="Eura Nofshin"/><br /><sub><b>Eura Nofshin</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0c931fcfd03cd548d44c90602dd773ba?d=identicon&s=100?v=4?s=80" width="80px;" alt="Matthew Stewart"/><br /><sub><b>Matthew Stewart</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/oishib"><img src="https://avatars.githubusercontent.com/oishib?s=100" width="100px;" alt="oishib"/><br /><sub><b>oishib</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/jared-ni"><img src="https://avatars.githubusercontent.com/jared-ni?s=100" width="100px;" alt="Jared Ni"/><br /><sub><b>Jared Ni</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/AditiR-42"><img src="https://avatars.githubusercontent.com/AditiR-42?s=100" width="100px;" alt="Aditi Raju"/><br /><sub><b>Aditi Raju</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/MichaelSchnebly"><img src="https://avatars.githubusercontent.com/MichaelSchnebly?s=100" width="100px;" alt="Michael Schnebly"/><br /><sub><b>Michael Schnebly</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/VThuong99"><img src="https://avatars.githubusercontent.com/VThuong99?s=100" width="100px;" alt="Thuong Duong"/><br /><sub><b>Thuong Duong</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/af39c27c6090c50a1921a9b6366e81cc?d=identicon&s=100?v=4?s=80" width="80px;" alt="Emeka Ezike"/><br /><sub><b>Emeka Ezike</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jianqingdu"><img src="https://avatars.githubusercontent.com/jianqingdu?v=4?s=80" width="80px;" alt="jianqingdu"/><br /><sub><b>jianqingdu</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jzhou1318"><img src="https://avatars.githubusercontent.com/jzhou1318?v=4?s=80" width="80px;" alt="Jennifer Zhou"/><br /><sub><b>Jennifer Zhou</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vitasam"><img src="https://avatars.githubusercontent.com/vitasam?v=4?s=80" width="80px;" alt="The Random DIY"/><br /><sub><b>The Random DIY</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/468ef35acc69f3266efd700992daa369?d=identicon&s=100?v=4?s=80" width="80px;" alt="Fatima Shah"/><br /><sub><b>Fatima Shah</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BrunoScaglione"><img src="https://avatars.githubusercontent.com/BrunoScaglione?v=4?s=80" width="80px;" alt="Bruno Scaglione"/><br /><sub><b>Bruno Scaglione</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allen-Kuang"><img src="https://avatars.githubusercontent.com/Allen-Kuang?v=4?s=80" width="80px;" alt="Allen-Kuang"/><br /><sub><b>Allen-Kuang</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/leo47007"><img src="https://avatars.githubusercontent.com/leo47007?s=100" width="100px;" alt="Yu-Shun Hsiao"/><br /><sub><b>Yu-Shun Hsiao</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/BaeHenryS"><img src="https://avatars.githubusercontent.com/BaeHenryS?s=100" width="100px;" alt="Henry Bae"/><br /><sub><b>Henry Bae</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/eimlav"><img src="https://avatars.githubusercontent.com/eimlav?s=100" width="100px;" alt="Eimhin Laverty"/><br /><sub><b>Eimhin Laverty</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/jaywonchung"><img src="https://avatars.githubusercontent.com/jaywonchung?s=100" width="100px;" alt="Jae-Won Chung"/><br /><sub><b>Jae-Won Chung</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/ShvetankPrakash"><img src="https://avatars.githubusercontent.com/ShvetankPrakash?s=100" width="100px;" alt="Shvetank Prakash"/><br /><sub><b>Shvetank Prakash</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4ad8cdf19eb3b666ace97d3eedb19278?d=identicon&s=100?v=4?s=80" width="80px;" alt="Tess314"/><br /><sub><b>Tess314</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/taunoe"><img src="https://avatars.githubusercontent.com/taunoe?v=4?s=80" width="80px;" alt="Tauno Erik"/><br /><sub><b>Tauno Erik</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gnodipac886"><img src="https://avatars.githubusercontent.com/gnodipac886?v=4?s=80" width="80px;" alt="gnodipac886"/><br /><sub><b>gnodipac886</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/serco425"><img src="https://avatars.githubusercontent.com/serco425?v=4?s=80" width="80px;" alt="Sercan Aygün"/><br /><sub><b>Sercan Aygün</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TheHiddenLayer"><img src="https://avatars.githubusercontent.com/TheHiddenLayer?v=4?s=80" width="80px;" alt="TheHiddenLayer"/><br /><sub><b>TheHiddenLayer</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Gjain234"><img src="https://avatars.githubusercontent.com/Gjain234?v=4?s=80" width="80px;" alt="Gauri Jain"/><br /><sub><b>Gauri Jain</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FinAminToastCrunch"><img src="https://avatars.githubusercontent.com/FinAminToastCrunch?v=4?s=80" width="80px;" alt="Fin Amin"/><br /><sub><b>Fin Amin</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/marcozennaro"><img src="https://avatars.githubusercontent.com/marcozennaro?s=100" width="100px;" alt="Marco Zennaro"/><br /><sub><b>Marco Zennaro</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/aryatschand"><img src="https://avatars.githubusercontent.com/aryatschand?s=100" width="100px;" alt="Arya Tschand"/><br /><sub><b>Arya Tschand</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/arbass22"><img src="https://avatars.githubusercontent.com/arbass22?s=100" width="100px;" alt="Andrew Bass"/><br /><sub><b>Andrew Bass</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/pongtr"><img src="https://avatars.githubusercontent.com/pongtr?s=100" width="100px;" alt="Pong Trairatvorakul"/><br /><sub><b>Pong Trairatvorakul</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/euranofshin"><img src="https://avatars.githubusercontent.com/euranofshin?s=100" width="100px;" alt="Eura Nofshin"/><br /><sub><b>Eura Nofshin</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/alex-oesterling"><img src="https://avatars.githubusercontent.com/alex-oesterling?v=4?s=80" width="80px;" alt="Alex Oesterling"/><br /><sub><b>Alex Oesterling</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AbenezerKb"><img src="https://avatars.githubusercontent.com/AbenezerKb?v=4?s=80" width="80px;" alt="Abenezer Angamo"/><br /><sub><b>Abenezer Angamo</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BravoBaldo"><img src="https://avatars.githubusercontent.com/BravoBaldo?v=4?s=80" width="80px;" alt="Baldassarre Cesarano"/><br /><sub><b>Baldassarre Cesarano</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jahnic-kb"><img src="https://avatars.githubusercontent.com/Jahnic-kb?v=4?s=80" width="80px;" alt="Jahnic Beck"/><br /><sub><b>Jahnic Beck</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aethernavshulkraven-allain"><img src="https://avatars.githubusercontent.com/aethernavshulkraven-allain?v=4?s=80" width="80px;" alt="अरनव शुक्ला | Arnav Shukla"/><br /><sub><b>अरनव शुक्ला | Arnav Shukla</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RinZ27"><img src="https://avatars.githubusercontent.com/RinZ27?v=4?s=80" width="80px;" alt="Rin"/><br /><sub><b>Rin</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bilgeacun"><img src="https://avatars.githubusercontent.com/bilgeacun?v=4?s=80" width="80px;" alt="Bilge Acun"/><br /><sub><b>Bilge Acun</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0c931fcfd03cd548d44c90602dd773ba?d=identicon&s=100?s=100" width="100px;" alt="Matthew Stewart"/><br /><sub><b>Matthew Stewart</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/af39c27c6090c50a1921a9b6366e81cc?d=identicon&s=100?s=100" width="100px;" alt="Emeka Ezike"/><br /><sub><b>Emeka Ezike</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/jianqingdu"><img src="https://avatars.githubusercontent.com/jianqingdu?s=100" width="100px;" alt="jianqingdu"/><br /><sub><b>jianqingdu</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/jzhou1318"><img src="https://avatars.githubusercontent.com/jzhou1318?s=100" width="100px;" alt="Jennifer Zhou"/><br /><sub><b>Jennifer Zhou</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/vitasam"><img src="https://avatars.githubusercontent.com/vitasam?s=100" width="100px;" alt="The Random DIY"/><br /><sub><b>The Random DIY</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/atcheng2"><img src="https://avatars.githubusercontent.com/atcheng2?v=4?s=80" width="80px;" alt="Andy Cheng"/><br /><sub><b>Andy Cheng</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arighosh05"><img src="https://avatars.githubusercontent.com/arighosh05?v=4?s=80" width="80px;" alt="Aritra Ghosh"/><br /><sub><b>Aritra Ghosh</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/abigailswallow"><img src="https://avatars.githubusercontent.com/abigailswallow?v=4?s=80" width="80px;" alt="abigailswallow"/><br /><sub><b>abigailswallow</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/YangZhou1997"><img src="https://avatars.githubusercontent.com/YangZhou1997?v=4?s=80" width="80px;" alt="Yang Zhou"/><br /><sub><b>Yang Zhou</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XaicuL"><img src="https://avatars.githubusercontent.com/XaicuL?v=4?s=80" width="80px;" alt="JEON HYUNJUN(Luciano)"/><br /><sub><b>JEON HYUNJUN(Luciano)</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/emmanuel2406"><img src="https://avatars.githubusercontent.com/emmanuel2406?v=4?s=80" width="80px;" alt="Emmanuel Rassou"/><br /><sub><b>Emmanuel Rassou</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jasonlyik"><img src="https://avatars.githubusercontent.com/jasonlyik?v=4?s=80" width="80px;" alt="Jason Yik"/><br /><sub><b>Jason Yik</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/468ef35acc69f3266efd700992daa369?d=identicon&s=100?s=100" width="100px;" alt="Fatima Shah"/><br /><sub><b>Fatima Shah</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/BrunoScaglione"><img src="https://avatars.githubusercontent.com/BrunoScaglione?s=100" width="100px;" alt="Bruno Scaglione"/><br /><sub><b>Bruno Scaglione</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/Allen-Kuang"><img src="https://avatars.githubusercontent.com/Allen-Kuang?s=100" width="100px;" alt="Allen-Kuang"/><br /><sub><b>Allen-Kuang</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4ad8cdf19eb3b666ace97d3eedb19278?d=identicon&s=100?s=100" width="100px;" alt="Tess314"/><br /><sub><b>Tess314</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/taunoe"><img src="https://avatars.githubusercontent.com/taunoe?s=100" width="100px;" alt="Tauno Erik"/><br /><sub><b>Tauno Erik</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jessicaquaye"><img src="https://avatars.githubusercontent.com/jessicaquaye?v=4?s=80" width="80px;" alt="Jessica Quaye"/><br /><sub><b>Jessica Quaye</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cursoragent"><img src="https://avatars.githubusercontent.com/cursoragent?v=4?s=80" width="80px;" alt="Cursor Agent"/><br /><sub><b>Cursor Agent</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/happyappledog"><img src="https://avatars.githubusercontent.com/happyappledog?v=4?s=80" width="80px;" alt="happyappledog"/><br /><sub><b>happyappledog</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/snuggs"><img src="https://avatars.githubusercontent.com/snuggs?v=4?s=80" width="80px;" alt="Snuggs"/><br /><sub><b>Snuggs</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/swilcock0"><img src="https://avatars.githubusercontent.com/swilcock0?v=4?s=80" width="80px;" alt="Sam Wilcock"/><br /><sub><b>Sam Wilcock</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sjohri20"><img src="https://avatars.githubusercontent.com/sjohri20?v=4?s=80" width="80px;" alt="Shreya Johri"/><br /><sub><b>Shreya Johri</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/skmur"><img src="https://avatars.githubusercontent.com/skmur?v=4?s=80" width="80px;" alt="Sonia Murthy"/><br /><sub><b>Sonia Murthy</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/gnodipac886"><img src="https://avatars.githubusercontent.com/gnodipac886?s=100" width="100px;" alt="gnodipac886"/><br /><sub><b>gnodipac886</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/serco425"><img src="https://avatars.githubusercontent.com/serco425?s=100" width="100px;" alt="Sercan Aygün"/><br /><sub><b>Sercan Aygün</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/TheHiddenLayer"><img src="https://avatars.githubusercontent.com/TheHiddenLayer?s=100" width="100px;" alt="TheHiddenLayer"/><br /><sub><b>TheHiddenLayer</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/Gjain234"><img src="https://avatars.githubusercontent.com/Gjain234?s=100" width="100px;" alt="Gauri Jain"/><br /><sub><b>Gauri Jain</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/FinAminToastCrunch"><img src="https://avatars.githubusercontent.com/FinAminToastCrunch?s=100" width="100px;" alt="Fin Amin"/><br /><sub><b>Fin Amin</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/fc4f3460cdfb9365ab59bdeafb06413e?d=identicon&s=100?v=4?s=80" width="80px;" alt="Costin-Andrei Oncescu"/><br /><sub><b>Costin-Andrei Oncescu</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0d6b8616427d8b19d425c9808692e347?d=identicon&s=100?v=4?s=80" width="80px;" alt="formlsysbookissue"/><br /><sub><b>formlsysbookissue</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/7cd8d5dfd83071f23979019d97655dc5?d=identicon&s=100?v=4?s=80" width="80px;" alt="Annie Laurie Cook"/><br /><sub><b>Annie Laurie Cook</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/5aa037840c0ca11ee42784ed4843c655?d=identicon&s=100?v=4?s=80" width="80px;" alt="Parampreet Singh"/><br /><sub><b>Parampreet Singh</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/b15b6e0e9adf58099905c1a0fd474cb9?d=identicon&s=100?v=4?s=80" width="80px;" alt="Vijay Edupuganti"/><br /><sub><b>Vijay Edupuganti</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f88052cca4f401d9b0f43aed0a53434a?d=identicon&s=100?v=4?s=80" width="80px;" alt="Jothi Ramaswamy"/><br /><sub><b>Jothi Ramaswamy</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/35a8d9ffd03f05e79a2c6ce6206a56f2?d=identicon&s=100?v=4?s=80" width="80px;" alt="Batur Arslan"/><br /><sub><b>Batur Arslan</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/alex-oesterling"><img src="https://avatars.githubusercontent.com/alex-oesterling?s=100" width="100px;" alt="Alex Oesterling"/><br /><sub><b>Alex Oesterling</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/AbenezerKb"><img src="https://avatars.githubusercontent.com/AbenezerKb?s=100" width="100px;" alt="Abenezer Angamo"/><br /><sub><b>Abenezer Angamo</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/BravoBaldo"><img src="https://avatars.githubusercontent.com/BravoBaldo?s=100" width="100px;" alt="Baldassarre Cesarano"/><br /><sub><b>Baldassarre Cesarano</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/KarthikDani"><img src="https://avatars.githubusercontent.com/KarthikDani?s=100" width="100px;" alt="Karthik Dani"/><br /><sub><b>Karthik Dani</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/Jahnic-kb"><img src="https://avatars.githubusercontent.com/Jahnic-kb?s=100" width="100px;" alt="Jahnic Beck"/><br /><sub><b>Jahnic Beck</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/bd53d146aa888548c8db4da02bf81e7a?d=identicon&s=100?v=4?s=80" width="80px;" alt="Curren Iyer"/><br /><sub><b>Curren Iyer</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8d8410338458e08bd5e4b96f58e1c217?d=identicon&s=100?v=4?s=80" width="80px;" alt="Edward Jin"/><br /><sub><b>Edward Jin</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/28c6123d2c9f75578d3ccdedb0df3d11?d=identicon&s=100?v=4?s=80" width="80px;" alt="Tess Watt"/><br /><sub><b>Tess Watt</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/ef139181fe00190f21730f6912532e9e?d=identicon&s=100?v=4?s=80" width="80px;" alt="bluebaer7"/><br /><sub><b>bluebaer7</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f5d58ba6aa9b00189d4c018d370e8f43?d=identicon&s=100?v=4?s=80" width="80px;" alt="yanjingl"/><br /><sub><b>yanjingl</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/a5a47df988ab1720dd706062e523ca32?d=identicon&s=100?v=4?s=80" width="80px;" alt="a-saraf"/><br /><sub><b>a-saraf</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/c2dc311aa8122d5f5f061e1db14682b1?d=identicon&s=100?v=4?s=80" width="80px;" alt="songhan"/><br /><sub><b>songhan</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/aethernavshulkraven-allain"><img src="https://avatars.githubusercontent.com/aethernavshulkraven-allain?s=100" width="100px;" alt="अरनव शुक्ला | Arnav Shukla"/><br /><sub><b>अरनव शुक्ला | Arnav Shukla</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/RinZ27"><img src="https://avatars.githubusercontent.com/RinZ27?s=100" width="100px;" alt="Rin"/><br /><sub><b>Rin</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/bilgeacun"><img src="https://avatars.githubusercontent.com/bilgeacun?s=100" width="100px;" alt="Bilge Acun"/><br /><sub><b>Bilge Acun</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/atcheng2"><img src="https://avatars.githubusercontent.com/atcheng2?s=100" width="100px;" alt="Andy Cheng"/><br /><sub><b>Andy Cheng</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/arighosh05"><img src="https://avatars.githubusercontent.com/arighosh05?s=100" width="100px;" alt="Aritra Ghosh"/><br /><sub><b>Aritra Ghosh</b></sub></a><br /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/abigailswallow"><img src="https://avatars.githubusercontent.com/abigailswallow?s=100" width="100px;" alt="abigailswallow"/><br /><sub><b>abigailswallow</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/YangZhou1997"><img src="https://avatars.githubusercontent.com/YangZhou1997?s=100" width="100px;" alt="Yang Zhou"/><br /><sub><b>Yang Zhou</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/XaicuL"><img src="https://avatars.githubusercontent.com/XaicuL?s=100" width="100px;" alt="JEON HYUNJUN(Luciano)"/><br /><sub><b>JEON HYUNJUN(Luciano)</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/emmanuel2406"><img src="https://avatars.githubusercontent.com/emmanuel2406?s=100" width="100px;" alt="Emmanuel Rassou"/><br /><sub><b>Emmanuel Rassou</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/jasonlyik"><img src="https://avatars.githubusercontent.com/jasonlyik?s=100" width="100px;" alt="Jason Yik"/><br /><sub><b>Jason Yik</b></sub></a><br /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/jessicaquaye"><img src="https://avatars.githubusercontent.com/jessicaquaye?s=100" width="100px;" alt="Jessica Quaye"/><br /><sub><b>Jessica Quaye</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/cursoragent"><img src="https://avatars.githubusercontent.com/cursoragent?s=100" width="100px;" alt="Cursor Agent"/><br /><sub><b>Cursor Agent</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/happyappledog"><img src="https://avatars.githubusercontent.com/happyappledog?s=100" width="100px;" alt="happyappledog"/><br /><sub><b>happyappledog</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/snuggs"><img src="https://avatars.githubusercontent.com/snuggs?s=100" width="100px;" alt="Snuggs"/><br /><sub><b>Snuggs</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/swilcock0"><img src="https://avatars.githubusercontent.com/swilcock0?s=100" width="100px;" alt="Sam Wilcock"/><br /><sub><b>Sam Wilcock</b></sub></a><br /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/sjohri20"><img src="https://avatars.githubusercontent.com/sjohri20?s=100" width="100px;" alt="Shreya Johri"/><br /><sub><b>Shreya Johri</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/skmur"><img src="https://avatars.githubusercontent.com/skmur?s=100" width="100px;" alt="Sonia Murthy"/><br /><sub><b>Sonia Murthy</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/fc4f3460cdfb9365ab59bdeafb06413e?d=identicon&s=100?s=100" width="100px;" alt="Costin-Andrei Oncescu"/><br /><sub><b>Costin-Andrei Oncescu</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0d6b8616427d8b19d425c9808692e347?d=identicon&s=100?s=100" width="100px;" alt="formlsysbookissue"/><br /><sub><b>formlsysbookissue</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/7cd8d5dfd83071f23979019d97655dc5?d=identicon&s=100?s=100" width="100px;" alt="Annie Laurie Cook"/><br /><sub><b>Annie Laurie Cook</b></sub></a><br /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/5aa037840c0ca11ee42784ed4843c655?d=identicon&s=100?s=100" width="100px;" alt="Parampreet Singh"/><br /><sub><b>Parampreet Singh</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/b15b6e0e9adf58099905c1a0fd474cb9?d=identicon&s=100?s=100" width="100px;" alt="Vijay Edupuganti"/><br /><sub><b>Vijay Edupuganti</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f88052cca4f401d9b0f43aed0a53434a?d=identicon&s=100?s=100" width="100px;" alt="Jothi Ramaswamy"/><br /><sub><b>Jothi Ramaswamy</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/35a8d9ffd03f05e79a2c6ce6206a56f2?d=identicon&s=100?s=100" width="100px;" alt="Batur Arslan"/><br /><sub><b>Batur Arslan</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/bd53d146aa888548c8db4da02bf81e7a?d=identicon&s=100?s=100" width="100px;" alt="Curren Iyer"/><br /><sub><b>Curren Iyer</b></sub></a><br /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/468ef35acc69f3266efd700992daa369?d=identicon&s=100?s=100" width="100px;" alt="Fatima Shah"/><br /><sub><b>Fatima Shah</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8d8410338458e08bd5e4b96f58e1c217?d=identicon&s=100?s=100" width="100px;" alt="Edward Jin"/><br /><sub><b>Edward Jin</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/28c6123d2c9f75578d3ccdedb0df3d11?d=identicon&s=100?s=100" width="100px;" alt="Tess Watt"/><br /><sub><b>Tess Watt</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/ef139181fe00190f21730f6912532e9e?d=identicon&s=100?s=100" width="100px;" alt="bluebaer7"/><br /><sub><b>bluebaer7</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f5d58ba6aa9b00189d4c018d370e8f43?d=identicon&s=100?s=100" width="100px;" alt="yanjingl"/><br /><sub><b>yanjingl</b></sub></a><br /></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/a5a47df988ab1720dd706062e523ca32?d=identicon&s=100?s=100" width="100px;" alt="a-saraf"/><br /><sub><b>a-saraf</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/c2dc311aa8122d5f5f061e1db14682b1?d=identicon&s=100?s=100" width="100px;" alt="songhan"/><br /><sub><b>songhan</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4814aad67982ab07a69006a1ce9d2a72?d=identicon&s=100?s=100" width="100px;" alt="jvijay"/><br /><sub><b>jvijay</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="20%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/43b1feff77c8a95fd581774fb8ec891f?d=identicon&s=100?s=100" width="100px;" alt="Zishen"/><br /><sub><b>Zishen</b></sub></a><br /></td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4814aad67982ab07a69006a1ce9d2a72?d=identicon&s=100?v=4?s=80" width="80px;" alt="jvijay"/><br /><sub><b>jvijay</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/43b1feff77c8a95fd581774fb8ec891f?d=identicon&s=100?v=4?s=80" width="80px;" alt="Zishen"/><br /><sub><b>Zishen</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kai4avaya"><img src="https://avatars.githubusercontent.com/kai4avaya?v=4?s=80" width="80px;" alt="Kai Kleinbard"/><br /><sub><b>Kai Kleinbard</b></sub></a><br />💻 🔧</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/didier-durand"><img src="https://avatars.githubusercontent.com/didier-durand?v=4?s=80" width="80px;" alt="Didier Durand"/><br /><sub><b>Didier Durand</b></sub></a><br />📖 🐛</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
<!-- BOOK-CONTRIBUTORS-END -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
---
|
||||
|
||||
### 🔥 TinyTorch Contributors (7)
|
||||
|
||||
<!-- TINYTORCH-CONTRIBUTORS-START -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AmirAlasady"><img src="https://avatars.githubusercontent.com/AmirAlasady?v=4?s=80" width="80px;" alt="Amir Alasady"/><br /><sub><b>Amir Alasady</b></sub></a><br />🐛</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 💡 👀 🧪 🔧</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kai4avaya"><img src="https://avatars.githubusercontent.com/kai4avaya?v=4?s=80" width="80px;" alt="kai"/><br /><sub><b>kai</b></sub></a><br />🐛 💻 🎨 📖 🧪</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/minhdang26403"><img src="https://avatars.githubusercontent.com/minhdang26403?v=4?s=80" width="80px;" alt="Dang Truong"/><br /><sub><b>Dang Truong</b></sub></a><br />🐛 💻 📖 🧪</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/didier-durand"><img src="https://avatars.githubusercontent.com/didier-durand?v=4?s=80" width="80px;" alt="Didier Durand"/><br /><sub><b>Didier Durand</b></sub></a><br />🐛 💻 📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/karthikdani"><img src="https://avatars.githubusercontent.com/karthikdani?v=4?s=80" width="80px;" alt="Karthik Dani"/><br /><sub><b>Karthik Dani</b></sub></a><br />🐛 💻</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jettythek"><img src="https://avatars.githubusercontent.com/jettythek?v=4?s=80" width="80px;" alt="jettythek"/><br /><sub><b>jettythek</b></sub></a><br />💻</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
<!-- TINYTORCH-CONTRIBUTORS-END -->
|
||||
|
||||
---
|
||||
|
||||
### 🛠️ Hardware Kits Contributors (2)
|
||||
|
||||
<!-- KITS-CONTRIBUTORS-START -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mjrovai"><img src="https://avatars.githubusercontent.com/Mjrovai?v=4?s=80" width="80px;" alt="Marcelo Rovai"/><br /><sub><b>Marcelo Rovai</b></sub></a><br />📖 💻 🎨 ✅</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 🧪 🔧</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
<!-- KITS-CONTRIBUTORS-END -->
|
||||
|
||||
---
|
||||
|
||||
### 🧪 Labs Contributors (1)
|
||||
|
||||
<!-- LABS-CONTRIBUTORS-START -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />💻 🎨 📖</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
<!-- LABS-CONTRIBUTORS-END -->
|
||||
|
||||
---
|
||||
|
||||
**Recognize a contributor:** Comment on any issue or PR:
|
||||
```
|
||||
@all-contributors please add @username for doc, code, bug, or ideas
|
||||
```
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
|
||||
948
book/.all-contributorsrc
Normal file
948
book/.all-contributorsrc
Normal file
@@ -0,0 +1,948 @@
|
||||
{
|
||||
"projectName": "MLSysBook - Textbook",
|
||||
"projectOwner": "harvard-edge",
|
||||
"repoType": "github",
|
||||
"repoHost": "https://github.com",
|
||||
"files": [
|
||||
"README.md"
|
||||
],
|
||||
"imageSize": 80,
|
||||
"commit": false,
|
||||
"commitConvention": "angular",
|
||||
"contributorsPerLine": 7,
|
||||
"linkToUsage": false,
|
||||
"skipCi": true,
|
||||
"contributors": [
|
||||
{
|
||||
"login": "profvjreddi",
|
||||
"name": "Vijay Janapa Reddi",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/profvjreddi",
|
||||
"profile": "https://github.com/profvjreddi",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code",
|
||||
"design",
|
||||
"doc",
|
||||
"ideas",
|
||||
"review",
|
||||
"test",
|
||||
"tool"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Mjrovai",
|
||||
"name": "Marcelo Rovai",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/Mjrovai",
|
||||
"profile": "https://github.com/Mjrovai",
|
||||
"contributions": [
|
||||
"code",
|
||||
"design",
|
||||
"test"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "GabrielAmazonas",
|
||||
"name": "Gabriel Amazonas",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/GabrielAmazonas",
|
||||
"profile": "https://github.com/GabrielAmazonas",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"doc",
|
||||
"ideas"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "hzeljko",
|
||||
"name": "Zeljko Hrcek",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/hzeljko",
|
||||
"profile": "https://github.com/hzeljko",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "jasonjabbour",
|
||||
"name": "Jason Jabbour",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/jasonjabbour",
|
||||
"profile": "https://github.com/jasonjabbour",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "uchendui",
|
||||
"name": "Ikechukwu Uchendu",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/uchendui",
|
||||
"profile": "https://github.com/uchendui",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Naeemkh",
|
||||
"name": "Naeem Khoshnevis",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/Naeemkh",
|
||||
"profile": "https://github.com/Naeemkh",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Sara-Khosravi",
|
||||
"name": "Sara Khosravi",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/Sara-Khosravi",
|
||||
"profile": "https://github.com/Sara-Khosravi",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "V0XNIHILI",
|
||||
"name": "Douwe den Blanken",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/V0XNIHILI",
|
||||
"profile": "https://github.com/V0XNIHILI",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "18jeffreyma",
|
||||
"name": "Jeffrey Ma",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/18jeffreyma",
|
||||
"profile": "https://github.com/18jeffreyma",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "shanzehbatool",
|
||||
"name": "shanzehbatool",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/shanzehbatool",
|
||||
"profile": "https://github.com/shanzehbatool",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "eliasab16",
|
||||
"name": "Elias",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/eliasab16",
|
||||
"profile": "https://github.com/eliasab16",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "JaredP94",
|
||||
"name": "Jared Ping",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/JaredP94",
|
||||
"profile": "https://github.com/JaredP94",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "ishapira1",
|
||||
"name": "Itai Shapira",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/ishapira1",
|
||||
"profile": "https://github.com/ishapira1",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Maximilian Lam",
|
||||
"name": "Maximilian Lam",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/8863743b4f26c1a20e730fcf7ebc3bc0?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "jaysonzlin",
|
||||
"name": "Jayson Lin",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/jaysonzlin",
|
||||
"profile": "https://github.com/jaysonzlin",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "sophiacho1",
|
||||
"name": "Sophia Cho",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/sophiacho1",
|
||||
"profile": "https://github.com/sophiacho1",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "andreamurillomtz",
|
||||
"name": "Andrea",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/andreamurillomtz",
|
||||
"profile": "https://github.com/andreamurillomtz",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "alxrod",
|
||||
"name": "Alex Rodriguez",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/alxrod",
|
||||
"profile": "https://github.com/alxrod",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "korneelf1",
|
||||
"name": "Korneel Van den Berghe",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/korneelf1",
|
||||
"profile": "https://github.com/korneelf1",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "foundingnimo",
|
||||
"name": "Nimo",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/foundingnimo",
|
||||
"profile": "https://github.com/foundingnimo",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "colbybanbury",
|
||||
"name": "Colby Banbury",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/colbybanbury",
|
||||
"profile": "https://github.com/colbybanbury",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "zishenwan",
|
||||
"name": "Zishen Wan",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/zishenwan",
|
||||
"profile": "https://github.com/zishenwan",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "mmaz",
|
||||
"name": "Mark Mazumder",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/mmaz",
|
||||
"profile": "https://github.com/mmaz",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "ma3mool",
|
||||
"name": "Abdulrahman Mahmoud",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/ma3mool",
|
||||
"profile": "https://github.com/ma3mool",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "DivyaAmirtharaj",
|
||||
"name": "Divya Amirtharaj",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/DivyaAmirtharaj",
|
||||
"profile": "https://github.com/DivyaAmirtharaj",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "srivatsankrishnan",
|
||||
"name": "Srivatsan Krishnan",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/srivatsankrishnan",
|
||||
"profile": "https://github.com/srivatsankrishnan",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "arnaumarin",
|
||||
"name": "marin-llobet",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/arnaumarin",
|
||||
"profile": "https://github.com/arnaumarin",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "aptl26",
|
||||
"name": "Aghyad Deeb",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/aptl26",
|
||||
"profile": "https://github.com/aptl26",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "James-QiuHaoran",
|
||||
"name": "Haoran Qiu",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/James-QiuHaoran",
|
||||
"profile": "https://github.com/James-QiuHaoran",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Ekhao",
|
||||
"name": "Emil Njor",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/Ekhao",
|
||||
"profile": "https://github.com/Ekhao",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "ELSuitorHarvard",
|
||||
"name": "ELSuitorHarvard",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/ELSuitorHarvard",
|
||||
"profile": "https://github.com/ELSuitorHarvard",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "kaiM0ves",
|
||||
"name": "kaiM0ves",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/kaiM0ves",
|
||||
"profile": "https://github.com/kaiM0ves",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "oishib",
|
||||
"name": "oishib",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/oishib",
|
||||
"profile": "https://github.com/oishib",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "jared-ni",
|
||||
"name": "Jared Ni",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/jared-ni",
|
||||
"profile": "https://github.com/jared-ni",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "AditiR-42",
|
||||
"name": "Aditi Raju",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/AditiR-42",
|
||||
"profile": "https://github.com/AditiR-42",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "MichaelSchnebly",
|
||||
"name": "Michael Schnebly",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/MichaelSchnebly",
|
||||
"profile": "https://github.com/MichaelSchnebly",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "VThuong99",
|
||||
"name": "Thuong Duong",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/VThuong99",
|
||||
"profile": "https://github.com/VThuong99",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "leo47007",
|
||||
"name": "Yu-Shun Hsiao",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/leo47007",
|
||||
"profile": "https://github.com/leo47007",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "BaeHenryS",
|
||||
"name": "Henry Bae",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/BaeHenryS",
|
||||
"profile": "https://github.com/BaeHenryS",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "eimlav",
|
||||
"name": "Eimhin Laverty",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/eimlav",
|
||||
"profile": "https://github.com/eimlav",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "jaywonchung",
|
||||
"name": "Jae-Won Chung",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/jaywonchung",
|
||||
"profile": "https://github.com/jaywonchung",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "ShvetankPrakash",
|
||||
"name": "Shvetank Prakash",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/ShvetankPrakash",
|
||||
"profile": "https://github.com/ShvetankPrakash",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "marcozennaro",
|
||||
"name": "Marco Zennaro",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/marcozennaro",
|
||||
"profile": "https://github.com/marcozennaro",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "aryatschand",
|
||||
"name": "Arya Tschand",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/aryatschand",
|
||||
"profile": "https://github.com/aryatschand",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "arbass22",
|
||||
"name": "Andrew Bass",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/arbass22",
|
||||
"profile": "https://github.com/arbass22",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "pongtr",
|
||||
"name": "Pong Trairatvorakul",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/pongtr",
|
||||
"profile": "https://github.com/pongtr",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "euranofshin",
|
||||
"name": "Eura Nofshin",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/euranofshin",
|
||||
"profile": "https://github.com/euranofshin",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Matthew Stewart",
|
||||
"name": "Matthew Stewart",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/0c931fcfd03cd548d44c90602dd773ba?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Emeka Ezike",
|
||||
"name": "Emeka Ezike",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/af39c27c6090c50a1921a9b6366e81cc?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "jianqingdu",
|
||||
"name": "jianqingdu",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/jianqingdu",
|
||||
"profile": "https://github.com/jianqingdu",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "jzhou1318",
|
||||
"name": "Jennifer Zhou",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/jzhou1318",
|
||||
"profile": "https://github.com/jzhou1318",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "vitasam",
|
||||
"name": "The Random DIY",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/vitasam",
|
||||
"profile": "https://github.com/vitasam",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Fatima Shah",
|
||||
"name": "Fatima Shah",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/468ef35acc69f3266efd700992daa369?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "BrunoScaglione",
|
||||
"name": "Bruno Scaglione",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/BrunoScaglione",
|
||||
"profile": "https://github.com/BrunoScaglione",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Allen-Kuang",
|
||||
"name": "Allen-Kuang",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/Allen-Kuang",
|
||||
"profile": "https://github.com/Allen-Kuang",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Tess314",
|
||||
"name": "Tess314",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/4ad8cdf19eb3b666ace97d3eedb19278?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "taunoe",
|
||||
"name": "Tauno Erik",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/taunoe",
|
||||
"profile": "https://github.com/taunoe",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "gnodipac886",
|
||||
"name": "gnodipac886",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/gnodipac886",
|
||||
"profile": "https://github.com/gnodipac886",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "serco425",
|
||||
"name": "Sercan Ayg\u00fcn",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/serco425",
|
||||
"profile": "https://github.com/serco425",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "TheHiddenLayer",
|
||||
"name": "TheHiddenLayer",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/TheHiddenLayer",
|
||||
"profile": "https://github.com/TheHiddenLayer",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Gjain234",
|
||||
"name": "Gauri Jain",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/Gjain234",
|
||||
"profile": "https://github.com/Gjain234",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "FinAminToastCrunch",
|
||||
"name": "Fin Amin",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/FinAminToastCrunch",
|
||||
"profile": "https://github.com/FinAminToastCrunch",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "alex-oesterling",
|
||||
"name": "Alex Oesterling",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/alex-oesterling",
|
||||
"profile": "https://github.com/alex-oesterling",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "AbenezerKb",
|
||||
"name": "Abenezer Angamo",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/AbenezerKb",
|
||||
"profile": "https://github.com/AbenezerKb",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "BravoBaldo",
|
||||
"name": "Baldassarre Cesarano",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/BravoBaldo",
|
||||
"profile": "https://github.com/BravoBaldo",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Jahnic-kb",
|
||||
"name": "Jahnic Beck",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/Jahnic-kb",
|
||||
"profile": "https://github.com/Jahnic-kb",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "aethernavshulkraven-allain",
|
||||
"name": "\u0905\u0930\u0928\u0935 \u0936\u0941\u0915\u094d\u0932\u093e | Arnav Shukla",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/aethernavshulkraven-allain",
|
||||
"profile": "https://github.com/aethernavshulkraven-allain",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "RinZ27",
|
||||
"name": "Rin",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/RinZ27",
|
||||
"profile": "https://github.com/RinZ27",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "bilgeacun",
|
||||
"name": "Bilge Acun",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/bilgeacun",
|
||||
"profile": "https://github.com/bilgeacun",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "atcheng2",
|
||||
"name": "Andy Cheng",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/atcheng2",
|
||||
"profile": "https://github.com/atcheng2",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "arighosh05",
|
||||
"name": "Aritra Ghosh",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/arighosh05",
|
||||
"profile": "https://github.com/arighosh05",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "abigailswallow",
|
||||
"name": "abigailswallow",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/abigailswallow",
|
||||
"profile": "https://github.com/abigailswallow",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "YangZhou1997",
|
||||
"name": "Yang Zhou",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/YangZhou1997",
|
||||
"profile": "https://github.com/YangZhou1997",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "XaicuL",
|
||||
"name": "JEON HYUNJUN(Luciano)",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/XaicuL",
|
||||
"profile": "https://github.com/XaicuL",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "emmanuel2406",
|
||||
"name": "Emmanuel Rassou",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/emmanuel2406",
|
||||
"profile": "https://github.com/emmanuel2406",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "jasonlyik",
|
||||
"name": "Jason Yik",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/jasonlyik",
|
||||
"profile": "https://github.com/jasonlyik",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "jessicaquaye",
|
||||
"name": "Jessica Quaye",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/jessicaquaye",
|
||||
"profile": "https://github.com/jessicaquaye",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "cursoragent",
|
||||
"name": "Cursor Agent",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/cursoragent",
|
||||
"profile": "https://github.com/cursoragent",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "happyappledog",
|
||||
"name": "happyappledog",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/happyappledog",
|
||||
"profile": "https://github.com/happyappledog",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "snuggs",
|
||||
"name": "Snuggs",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/snuggs",
|
||||
"profile": "https://github.com/snuggs",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "swilcock0",
|
||||
"name": "Sam Wilcock",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/swilcock0",
|
||||
"profile": "https://github.com/swilcock0",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "sjohri20",
|
||||
"name": "Shreya Johri",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/sjohri20",
|
||||
"profile": "https://github.com/sjohri20",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "skmur",
|
||||
"name": "Sonia Murthy",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/skmur",
|
||||
"profile": "https://github.com/skmur",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Costin-Andrei Oncescu",
|
||||
"name": "Costin-Andrei Oncescu",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/fc4f3460cdfb9365ab59bdeafb06413e?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "formlsysbookissue",
|
||||
"name": "formlsysbookissue",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/0d6b8616427d8b19d425c9808692e347?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Annie Laurie Cook",
|
||||
"name": "Annie Laurie Cook",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/7cd8d5dfd83071f23979019d97655dc5?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Parampreet Singh",
|
||||
"name": "Parampreet Singh",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/5aa037840c0ca11ee42784ed4843c655?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Vijay Edupuganti",
|
||||
"name": "Vijay Edupuganti",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/b15b6e0e9adf58099905c1a0fd474cb9?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Jothi Ramaswamy",
|
||||
"name": "Jothi Ramaswamy",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/f88052cca4f401d9b0f43aed0a53434a?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Batur Arslan",
|
||||
"name": "Batur Arslan",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/35a8d9ffd03f05e79a2c6ce6206a56f2?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Curren Iyer",
|
||||
"name": "Curren Iyer",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/bd53d146aa888548c8db4da02bf81e7a?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Edward Jin",
|
||||
"name": "Edward Jin",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/8d8410338458e08bd5e4b96f58e1c217?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Tess Watt",
|
||||
"name": "Tess Watt",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/28c6123d2c9f75578d3ccdedb0df3d11?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "bluebaer7",
|
||||
"name": "bluebaer7",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/ef139181fe00190f21730f6912532e9e?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "yanjingl",
|
||||
"name": "yanjingl",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/f5d58ba6aa9b00189d4c018d370e8f43?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "a-saraf",
|
||||
"name": "a-saraf",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/a5a47df988ab1720dd706062e523ca32?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "songhan",
|
||||
"name": "songhan",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/c2dc311aa8122d5f5f061e1db14682b1?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "jvijay",
|
||||
"name": "jvijay",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/4814aad67982ab07a69006a1ce9d2a72?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "Zishen",
|
||||
"name": "Zishen",
|
||||
"avatar_url": "https://www.gravatar.com/avatar/43b1feff77c8a95fd581774fb8ec891f?d=identicon&s=100",
|
||||
"profile": "https://github.com/harvard-edge/cs249r_book/graphs/contributors",
|
||||
"contributions": [
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "kai4avaya",
|
||||
"name": "Kai Kleinbard",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/kai4avaya",
|
||||
"profile": "https://github.com/kai4avaya",
|
||||
"contributions": [
|
||||
"code",
|
||||
"tool"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "didier-durand",
|
||||
"name": "Didier Durand",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/didier-durand",
|
||||
"profile": "https://github.com/didier-durand",
|
||||
"contributions": [
|
||||
"doc",
|
||||
"bug"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
156
book/README.md
156
book/README.md
@@ -173,6 +173,162 @@ We welcome contributions! See [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md) for g
|
||||
|
||||
---
|
||||
|
||||
## Contributors
|
||||
|
||||
Thanks to these wonderful people who helped improve the book ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 💡 👀 🧪 🔧</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mjrovai"><img src="https://avatars.githubusercontent.com/Mjrovai?v=4?s=80" width="80px;" alt="Marcelo Rovai"/><br /><sub><b>Marcelo Rovai</b></sub></a><br />💻 🎨 🧪</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/GabrielAmazonas"><img src="https://avatars.githubusercontent.com/GabrielAmazonas?v=4?s=80" width="80px;" alt="Gabriel Amazonas"/><br /><sub><b>Gabriel Amazonas</b></sub></a><br />🐛 📖 💡</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/hzeljko"><img src="https://avatars.githubusercontent.com/hzeljko?v=4?s=80" width="80px;" alt="Zeljko Hrcek"/><br /><sub><b>Zeljko Hrcek</b></sub></a><br />💻</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jasonjabbour"><img src="https://avatars.githubusercontent.com/jasonjabbour?v=4?s=80" width="80px;" alt="Jason Jabbour"/><br /><sub><b>Jason Jabbour</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/uchendui"><img src="https://avatars.githubusercontent.com/uchendui?v=4?s=80" width="80px;" alt="Ikechukwu Uchendu"/><br /><sub><b>Ikechukwu Uchendu</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Naeemkh"><img src="https://avatars.githubusercontent.com/Naeemkh?v=4?s=80" width="80px;" alt="Naeem Khoshnevis"/><br /><sub><b>Naeem Khoshnevis</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Sara-Khosravi"><img src="https://avatars.githubusercontent.com/Sara-Khosravi?v=4?s=80" width="80px;" alt="Sara Khosravi"/><br /><sub><b>Sara Khosravi</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/V0XNIHILI"><img src="https://avatars.githubusercontent.com/V0XNIHILI?v=4?s=80" width="80px;" alt="Douwe den Blanken"/><br /><sub><b>Douwe den Blanken</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/18jeffreyma"><img src="https://avatars.githubusercontent.com/18jeffreyma?v=4?s=80" width="80px;" alt="Jeffrey Ma"/><br /><sub><b>Jeffrey Ma</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/shanzehbatool"><img src="https://avatars.githubusercontent.com/shanzehbatool?v=4?s=80" width="80px;" alt="shanzehbatool"/><br /><sub><b>shanzehbatool</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eliasab16"><img src="https://avatars.githubusercontent.com/eliasab16?v=4?s=80" width="80px;" alt="Elias"/><br /><sub><b>Elias</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/JaredP94"><img src="https://avatars.githubusercontent.com/JaredP94?v=4?s=80" width="80px;" alt="Jared Ping"/><br /><sub><b>Jared Ping</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ishapira1"><img src="https://avatars.githubusercontent.com/ishapira1?v=4?s=80" width="80px;" alt="Itai Shapira"/><br /><sub><b>Itai Shapira</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8863743b4f26c1a20e730fcf7ebc3bc0?d=identicon&s=100?v=4?s=80" width="80px;" alt="Maximilian Lam"/><br /><sub><b>Maximilian Lam</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jaysonzlin"><img src="https://avatars.githubusercontent.com/jaysonzlin?v=4?s=80" width="80px;" alt="Jayson Lin"/><br /><sub><b>Jayson Lin</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sophiacho1"><img src="https://avatars.githubusercontent.com/sophiacho1?v=4?s=80" width="80px;" alt="Sophia Cho"/><br /><sub><b>Sophia Cho</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/andreamurillomtz"><img src="https://avatars.githubusercontent.com/andreamurillomtz?v=4?s=80" width="80px;" alt="Andrea"/><br /><sub><b>Andrea</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/alxrod"><img src="https://avatars.githubusercontent.com/alxrod?v=4?s=80" width="80px;" alt="Alex Rodriguez"/><br /><sub><b>Alex Rodriguez</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/korneelf1"><img src="https://avatars.githubusercontent.com/korneelf1?v=4?s=80" width="80px;" alt="Korneel Van den Berghe"/><br /><sub><b>Korneel Van den Berghe</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/foundingnimo"><img src="https://avatars.githubusercontent.com/foundingnimo?v=4?s=80" width="80px;" alt="Nimo"/><br /><sub><b>Nimo</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/colbybanbury"><img src="https://avatars.githubusercontent.com/colbybanbury?v=4?s=80" width="80px;" alt="Colby Banbury"/><br /><sub><b>Colby Banbury</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/zishenwan"><img src="https://avatars.githubusercontent.com/zishenwan?v=4?s=80" width="80px;" alt="Zishen Wan"/><br /><sub><b>Zishen Wan</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/mmaz"><img src="https://avatars.githubusercontent.com/mmaz?v=4?s=80" width="80px;" alt="Mark Mazumder"/><br /><sub><b>Mark Mazumder</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ma3mool"><img src="https://avatars.githubusercontent.com/ma3mool?v=4?s=80" width="80px;" alt="Abdulrahman Mahmoud"/><br /><sub><b>Abdulrahman Mahmoud</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/DivyaAmirtharaj"><img src="https://avatars.githubusercontent.com/DivyaAmirtharaj?v=4?s=80" width="80px;" alt="Divya Amirtharaj"/><br /><sub><b>Divya Amirtharaj</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/srivatsankrishnan"><img src="https://avatars.githubusercontent.com/srivatsankrishnan?v=4?s=80" width="80px;" alt="Srivatsan Krishnan"/><br /><sub><b>Srivatsan Krishnan</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arnaumarin"><img src="https://avatars.githubusercontent.com/arnaumarin?v=4?s=80" width="80px;" alt="marin-llobet"/><br /><sub><b>marin-llobet</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aptl26"><img src="https://avatars.githubusercontent.com/aptl26?v=4?s=80" width="80px;" alt="Aghyad Deeb"/><br /><sub><b>Aghyad Deeb</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/James-QiuHaoran"><img src="https://avatars.githubusercontent.com/James-QiuHaoran?v=4?s=80" width="80px;" alt="Haoran Qiu"/><br /><sub><b>Haoran Qiu</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Ekhao"><img src="https://avatars.githubusercontent.com/Ekhao?v=4?s=80" width="80px;" alt="Emil Njor"/><br /><sub><b>Emil Njor</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ELSuitorHarvard"><img src="https://avatars.githubusercontent.com/ELSuitorHarvard?v=4?s=80" width="80px;" alt="ELSuitorHarvard"/><br /><sub><b>ELSuitorHarvard</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kaiM0ves"><img src="https://avatars.githubusercontent.com/kaiM0ves?v=4?s=80" width="80px;" alt="kaiM0ves"/><br /><sub><b>kaiM0ves</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/oishib"><img src="https://avatars.githubusercontent.com/oishib?v=4?s=80" width="80px;" alt="oishib"/><br /><sub><b>oishib</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jared-ni"><img src="https://avatars.githubusercontent.com/jared-ni?v=4?s=80" width="80px;" alt="Jared Ni"/><br /><sub><b>Jared Ni</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AditiR-42"><img src="https://avatars.githubusercontent.com/AditiR-42?v=4?s=80" width="80px;" alt="Aditi Raju"/><br /><sub><b>Aditi Raju</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/MichaelSchnebly"><img src="https://avatars.githubusercontent.com/MichaelSchnebly?v=4?s=80" width="80px;" alt="Michael Schnebly"/><br /><sub><b>Michael Schnebly</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/VThuong99"><img src="https://avatars.githubusercontent.com/VThuong99?v=4?s=80" width="80px;" alt="Thuong Duong"/><br /><sub><b>Thuong Duong</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/leo47007"><img src="https://avatars.githubusercontent.com/leo47007?v=4?s=80" width="80px;" alt="Yu-Shun Hsiao"/><br /><sub><b>Yu-Shun Hsiao</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BaeHenryS"><img src="https://avatars.githubusercontent.com/BaeHenryS?v=4?s=80" width="80px;" alt="Henry Bae"/><br /><sub><b>Henry Bae</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/eimlav"><img src="https://avatars.githubusercontent.com/eimlav?v=4?s=80" width="80px;" alt="Eimhin Laverty"/><br /><sub><b>Eimhin Laverty</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jaywonchung"><img src="https://avatars.githubusercontent.com/jaywonchung?v=4?s=80" width="80px;" alt="Jae-Won Chung"/><br /><sub><b>Jae-Won Chung</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/ShvetankPrakash"><img src="https://avatars.githubusercontent.com/ShvetankPrakash?v=4?s=80" width="80px;" alt="Shvetank Prakash"/><br /><sub><b>Shvetank Prakash</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/marcozennaro"><img src="https://avatars.githubusercontent.com/marcozennaro?v=4?s=80" width="80px;" alt="Marco Zennaro"/><br /><sub><b>Marco Zennaro</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aryatschand"><img src="https://avatars.githubusercontent.com/aryatschand?v=4?s=80" width="80px;" alt="Arya Tschand"/><br /><sub><b>Arya Tschand</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arbass22"><img src="https://avatars.githubusercontent.com/arbass22?v=4?s=80" width="80px;" alt="Andrew Bass"/><br /><sub><b>Andrew Bass</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/pongtr"><img src="https://avatars.githubusercontent.com/pongtr?v=4?s=80" width="80px;" alt="Pong Trairatvorakul"/><br /><sub><b>Pong Trairatvorakul</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/euranofshin"><img src="https://avatars.githubusercontent.com/euranofshin?v=4?s=80" width="80px;" alt="Eura Nofshin"/><br /><sub><b>Eura Nofshin</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0c931fcfd03cd548d44c90602dd773ba?d=identicon&s=100?v=4?s=80" width="80px;" alt="Matthew Stewart"/><br /><sub><b>Matthew Stewart</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/af39c27c6090c50a1921a9b6366e81cc?d=identicon&s=100?v=4?s=80" width="80px;" alt="Emeka Ezike"/><br /><sub><b>Emeka Ezike</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jianqingdu"><img src="https://avatars.githubusercontent.com/jianqingdu?v=4?s=80" width="80px;" alt="jianqingdu"/><br /><sub><b>jianqingdu</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jzhou1318"><img src="https://avatars.githubusercontent.com/jzhou1318?v=4?s=80" width="80px;" alt="Jennifer Zhou"/><br /><sub><b>Jennifer Zhou</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/vitasam"><img src="https://avatars.githubusercontent.com/vitasam?v=4?s=80" width="80px;" alt="The Random DIY"/><br /><sub><b>The Random DIY</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/468ef35acc69f3266efd700992daa369?d=identicon&s=100?v=4?s=80" width="80px;" alt="Fatima Shah"/><br /><sub><b>Fatima Shah</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BrunoScaglione"><img src="https://avatars.githubusercontent.com/BrunoScaglione?v=4?s=80" width="80px;" alt="Bruno Scaglione"/><br /><sub><b>Bruno Scaglione</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Allen-Kuang"><img src="https://avatars.githubusercontent.com/Allen-Kuang?v=4?s=80" width="80px;" alt="Allen-Kuang"/><br /><sub><b>Allen-Kuang</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4ad8cdf19eb3b666ace97d3eedb19278?d=identicon&s=100?v=4?s=80" width="80px;" alt="Tess314"/><br /><sub><b>Tess314</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/taunoe"><img src="https://avatars.githubusercontent.com/taunoe?v=4?s=80" width="80px;" alt="Tauno Erik"/><br /><sub><b>Tauno Erik</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/gnodipac886"><img src="https://avatars.githubusercontent.com/gnodipac886?v=4?s=80" width="80px;" alt="gnodipac886"/><br /><sub><b>gnodipac886</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/serco425"><img src="https://avatars.githubusercontent.com/serco425?v=4?s=80" width="80px;" alt="Sercan Aygün"/><br /><sub><b>Sercan Aygün</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/TheHiddenLayer"><img src="https://avatars.githubusercontent.com/TheHiddenLayer?v=4?s=80" width="80px;" alt="TheHiddenLayer"/><br /><sub><b>TheHiddenLayer</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Gjain234"><img src="https://avatars.githubusercontent.com/Gjain234?v=4?s=80" width="80px;" alt="Gauri Jain"/><br /><sub><b>Gauri Jain</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/FinAminToastCrunch"><img src="https://avatars.githubusercontent.com/FinAminToastCrunch?v=4?s=80" width="80px;" alt="Fin Amin"/><br /><sub><b>Fin Amin</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/alex-oesterling"><img src="https://avatars.githubusercontent.com/alex-oesterling?v=4?s=80" width="80px;" alt="Alex Oesterling"/><br /><sub><b>Alex Oesterling</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AbenezerKb"><img src="https://avatars.githubusercontent.com/AbenezerKb?v=4?s=80" width="80px;" alt="Abenezer Angamo"/><br /><sub><b>Abenezer Angamo</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/BravoBaldo"><img src="https://avatars.githubusercontent.com/BravoBaldo?v=4?s=80" width="80px;" alt="Baldassarre Cesarano"/><br /><sub><b>Baldassarre Cesarano</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Jahnic-kb"><img src="https://avatars.githubusercontent.com/Jahnic-kb?v=4?s=80" width="80px;" alt="Jahnic Beck"/><br /><sub><b>Jahnic Beck</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/aethernavshulkraven-allain"><img src="https://avatars.githubusercontent.com/aethernavshulkraven-allain?v=4?s=80" width="80px;" alt="अरनव शुक्ला | Arnav Shukla"/><br /><sub><b>अरनव शुक्ला | Arnav Shukla</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/RinZ27"><img src="https://avatars.githubusercontent.com/RinZ27?v=4?s=80" width="80px;" alt="Rin"/><br /><sub><b>Rin</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/bilgeacun"><img src="https://avatars.githubusercontent.com/bilgeacun?v=4?s=80" width="80px;" alt="Bilge Acun"/><br /><sub><b>Bilge Acun</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/atcheng2"><img src="https://avatars.githubusercontent.com/atcheng2?v=4?s=80" width="80px;" alt="Andy Cheng"/><br /><sub><b>Andy Cheng</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/arighosh05"><img src="https://avatars.githubusercontent.com/arighosh05?v=4?s=80" width="80px;" alt="Aritra Ghosh"/><br /><sub><b>Aritra Ghosh</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/abigailswallow"><img src="https://avatars.githubusercontent.com/abigailswallow?v=4?s=80" width="80px;" alt="abigailswallow"/><br /><sub><b>abigailswallow</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/YangZhou1997"><img src="https://avatars.githubusercontent.com/YangZhou1997?v=4?s=80" width="80px;" alt="Yang Zhou"/><br /><sub><b>Yang Zhou</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/XaicuL"><img src="https://avatars.githubusercontent.com/XaicuL?v=4?s=80" width="80px;" alt="JEON HYUNJUN(Luciano)"/><br /><sub><b>JEON HYUNJUN(Luciano)</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/emmanuel2406"><img src="https://avatars.githubusercontent.com/emmanuel2406?v=4?s=80" width="80px;" alt="Emmanuel Rassou"/><br /><sub><b>Emmanuel Rassou</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jasonlyik"><img src="https://avatars.githubusercontent.com/jasonlyik?v=4?s=80" width="80px;" alt="Jason Yik"/><br /><sub><b>Jason Yik</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jessicaquaye"><img src="https://avatars.githubusercontent.com/jessicaquaye?v=4?s=80" width="80px;" alt="Jessica Quaye"/><br /><sub><b>Jessica Quaye</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/cursoragent"><img src="https://avatars.githubusercontent.com/cursoragent?v=4?s=80" width="80px;" alt="Cursor Agent"/><br /><sub><b>Cursor Agent</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/happyappledog"><img src="https://avatars.githubusercontent.com/happyappledog?v=4?s=80" width="80px;" alt="happyappledog"/><br /><sub><b>happyappledog</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/snuggs"><img src="https://avatars.githubusercontent.com/snuggs?v=4?s=80" width="80px;" alt="Snuggs"/><br /><sub><b>Snuggs</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/swilcock0"><img src="https://avatars.githubusercontent.com/swilcock0?v=4?s=80" width="80px;" alt="Sam Wilcock"/><br /><sub><b>Sam Wilcock</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/sjohri20"><img src="https://avatars.githubusercontent.com/sjohri20?v=4?s=80" width="80px;" alt="Shreya Johri"/><br /><sub><b>Shreya Johri</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/skmur"><img src="https://avatars.githubusercontent.com/skmur?v=4?s=80" width="80px;" alt="Sonia Murthy"/><br /><sub><b>Sonia Murthy</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/fc4f3460cdfb9365ab59bdeafb06413e?d=identicon&s=100?v=4?s=80" width="80px;" alt="Costin-Andrei Oncescu"/><br /><sub><b>Costin-Andrei Oncescu</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/0d6b8616427d8b19d425c9808692e347?d=identicon&s=100?v=4?s=80" width="80px;" alt="formlsysbookissue"/><br /><sub><b>formlsysbookissue</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/7cd8d5dfd83071f23979019d97655dc5?d=identicon&s=100?v=4?s=80" width="80px;" alt="Annie Laurie Cook"/><br /><sub><b>Annie Laurie Cook</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/5aa037840c0ca11ee42784ed4843c655?d=identicon&s=100?v=4?s=80" width="80px;" alt="Parampreet Singh"/><br /><sub><b>Parampreet Singh</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/b15b6e0e9adf58099905c1a0fd474cb9?d=identicon&s=100?v=4?s=80" width="80px;" alt="Vijay Edupuganti"/><br /><sub><b>Vijay Edupuganti</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f88052cca4f401d9b0f43aed0a53434a?d=identicon&s=100?v=4?s=80" width="80px;" alt="Jothi Ramaswamy"/><br /><sub><b>Jothi Ramaswamy</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/35a8d9ffd03f05e79a2c6ce6206a56f2?d=identicon&s=100?v=4?s=80" width="80px;" alt="Batur Arslan"/><br /><sub><b>Batur Arslan</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/bd53d146aa888548c8db4da02bf81e7a?d=identicon&s=100?v=4?s=80" width="80px;" alt="Curren Iyer"/><br /><sub><b>Curren Iyer</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/8d8410338458e08bd5e4b96f58e1c217?d=identicon&s=100?v=4?s=80" width="80px;" alt="Edward Jin"/><br /><sub><b>Edward Jin</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/28c6123d2c9f75578d3ccdedb0df3d11?d=identicon&s=100?v=4?s=80" width="80px;" alt="Tess Watt"/><br /><sub><b>Tess Watt</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/ef139181fe00190f21730f6912532e9e?d=identicon&s=100?v=4?s=80" width="80px;" alt="bluebaer7"/><br /><sub><b>bluebaer7</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/f5d58ba6aa9b00189d4c018d370e8f43?d=identicon&s=100?v=4?s=80" width="80px;" alt="yanjingl"/><br /><sub><b>yanjingl</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/a5a47df988ab1720dd706062e523ca32?d=identicon&s=100?v=4?s=80" width="80px;" alt="a-saraf"/><br /><sub><b>a-saraf</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/c2dc311aa8122d5f5f061e1db14682b1?d=identicon&s=100?v=4?s=80" width="80px;" alt="songhan"/><br /><sub><b>songhan</b></sub></a><br />📖</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/4814aad67982ab07a69006a1ce9d2a72?d=identicon&s=100?v=4?s=80" width="80px;" alt="jvijay"/><br /><sub><b>jvijay</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/harvard-edge/cs249r_book/graphs/contributors"><img src="https://www.gravatar.com/avatar/43b1feff77c8a95fd581774fb8ec891f?d=identicon&s=100?v=4?s=80" width="80px;" alt="Zishen"/><br /><sub><b>Zishen</b></sub></a><br />📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kai4avaya"><img src="https://avatars.githubusercontent.com/kai4avaya?v=4?s=80" width="80px;" alt="Kai Kleinbard"/><br /><sub><b>Kai Kleinbard</b></sub></a><br />💻 🔧</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/didier-durand"><img src="https://avatars.githubusercontent.com/didier-durand?v=4?s=80" width="80px;" alt="Didier Durand"/><br /><sub><b>Didier Durand</b></sub></a><br />📖 🐛</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
**Recognize a contributor:** Comment on any issue or PR:
|
||||
```
|
||||
@all-contributors please add @username for doc, review, translation, or design
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
Book content is licensed under **Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International** (CC BY-NC-SA 4.0).
|
||||
|
||||
@@ -88,3 +88,32 @@ Opening an early PR is encouraged. This will allow us to provide feedback on you
|
||||
|
||||
For a more detailed guide on the CS249r documentation process and peer review,
|
||||
check [here](https://docs.google.com/document/d/1izDoWwFLnV8XK2FYCl23_9KYL_7EQ5OWLo-PCNUGle0).
|
||||
|
||||
## Contributor Recognition
|
||||
|
||||
We use [All Contributors](https://allcontributors.org) to recognize everyone who helps improve the book.
|
||||
|
||||
### How to Recognize a Contributor
|
||||
|
||||
After merging a PR or resolving an issue, comment:
|
||||
|
||||
```
|
||||
@all-contributors please add @username for TYPE
|
||||
```
|
||||
|
||||
### Contribution Types
|
||||
|
||||
| Type | Emoji | Use For |
|
||||
|------|-------|---------|
|
||||
| `doc` | 📖 | Wrote or improved content |
|
||||
| `review` | 👀 | Reviewed chapters or PRs |
|
||||
| `translation` | 🌍 | Translated content |
|
||||
| `design` | 🎨 | Created diagrams or figures |
|
||||
| `bug` | 🐛 | Found errors or typos |
|
||||
| `ideas` | 💡 | Suggested improvements |
|
||||
|
||||
### Example
|
||||
|
||||
```
|
||||
@all-contributors please add @contributor for doc, review
|
||||
```
|
||||
|
||||
43
kits/.all-contributorsrc
Normal file
43
kits/.all-contributorsrc
Normal file
@@ -0,0 +1,43 @@
|
||||
{
|
||||
"projectName": "MLSysBook - Hardware Kits",
|
||||
"projectOwner": "harvard-edge",
|
||||
"repoType": "github",
|
||||
"repoHost": "https://github.com",
|
||||
"files": [
|
||||
"README.md"
|
||||
],
|
||||
"imageSize": 80,
|
||||
"commit": false,
|
||||
"commitConvention": "angular",
|
||||
"contributorsPerLine": 7,
|
||||
"linkToUsage": false,
|
||||
"skipCi": true,
|
||||
"contributors": [
|
||||
{
|
||||
"login": "Mjrovai",
|
||||
"name": "Marcelo Rovai",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/Mjrovai",
|
||||
"profile": "https://github.com/Mjrovai",
|
||||
"contributions": [
|
||||
"doc",
|
||||
"code",
|
||||
"design",
|
||||
"tutorial"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "profvjreddi",
|
||||
"name": "Vijay Janapa Reddi",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/profvjreddi",
|
||||
"profile": "https://github.com/profvjreddi",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code",
|
||||
"design",
|
||||
"doc",
|
||||
"test",
|
||||
"tool"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -132,10 +132,31 @@ We welcome contributions to the hardware labs! To contribute:
|
||||
|
||||
---
|
||||
|
||||
## Authors
|
||||
## Contributors
|
||||
|
||||
- **Marcelo Rovai** - Primary author
|
||||
- **Vijay Janapa Reddi** - Harvard University
|
||||
Thanks to these wonderful people who helped improve the hardware kits ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/Mjrovai"><img src="https://avatars.githubusercontent.com/Mjrovai?v=4?s=80" width="80px;" alt="Marcelo Rovai"/><br /><sub><b>Marcelo Rovai</b></sub></a><br />📖 💻 🎨 ✅</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 🧪 🔧</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
**Recognize a contributor:** Comment on any issue or PR:
|
||||
```
|
||||
@all-contributors please add @username for tool, test, video, or doc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
|
||||
28
labs/.all-contributorsrc
Normal file
28
labs/.all-contributorsrc
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"projectName": "MLSysBook - Labs",
|
||||
"projectOwner": "harvard-edge",
|
||||
"repoType": "github",
|
||||
"repoHost": "https://github.com",
|
||||
"files": [
|
||||
"README.md"
|
||||
],
|
||||
"imageSize": 80,
|
||||
"commit": false,
|
||||
"commitConvention": "angular",
|
||||
"contributorsPerLine": 7,
|
||||
"linkToUsage": false,
|
||||
"skipCi": true,
|
||||
"contributors": [
|
||||
{
|
||||
"login": "profvjreddi",
|
||||
"name": "Vijay Janapa Reddi",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/profvjreddi",
|
||||
"profile": "https://github.com/profvjreddi",
|
||||
"contributions": [
|
||||
"code",
|
||||
"design",
|
||||
"doc"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -67,6 +67,33 @@ Labs are under active development. To be notified when they launch:
|
||||
|
||||
---
|
||||
|
||||
## Contributors
|
||||
|
||||
Thanks to these wonderful people who helped build the labs ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />💻 🎨 📖</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
**Recognize a contributor:** Comment on any issue or PR:
|
||||
```
|
||||
@all-contributors please add @username for code, tutorial, test, or doc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
<div align="center">
|
||||
|
||||
**Read. Explore. Build.** *(Labs coming soon)*
|
||||
|
||||
97
tinytorch/.all-contributorsrc
Normal file
97
tinytorch/.all-contributorsrc
Normal file
@@ -0,0 +1,97 @@
|
||||
{
|
||||
"projectName": "MLSysBook - TinyTorch",
|
||||
"projectOwner": "harvard-edge",
|
||||
"repoType": "github",
|
||||
"repoHost": "https://github.com",
|
||||
"files": [
|
||||
"README.md"
|
||||
],
|
||||
"imageSize": 80,
|
||||
"commit": false,
|
||||
"commitConvention": "angular",
|
||||
"contributorsPerLine": 7,
|
||||
"linkToUsage": false,
|
||||
"skipCi": true,
|
||||
"contributors": [
|
||||
{
|
||||
"login": "AmirAlasady",
|
||||
"name": "Amir Alasady",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/AmirAlasady",
|
||||
"profile": "https://github.com/AmirAlasady",
|
||||
"contributions": [
|
||||
"bug"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "profvjreddi",
|
||||
"name": "Vijay Janapa Reddi",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/profvjreddi",
|
||||
"profile": "https://github.com/profvjreddi",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code",
|
||||
"design",
|
||||
"doc",
|
||||
"ideas",
|
||||
"review",
|
||||
"test",
|
||||
"tool"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "kai4avaya",
|
||||
"name": "kai",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/kai4avaya",
|
||||
"profile": "https://github.com/kai4avaya",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code",
|
||||
"design",
|
||||
"doc",
|
||||
"test"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "minhdang26403",
|
||||
"name": "Dang Truong",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/minhdang26403",
|
||||
"profile": "https://github.com/minhdang26403",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code",
|
||||
"doc",
|
||||
"test"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "didier-durand",
|
||||
"name": "Didier Durand",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/didier-durand",
|
||||
"profile": "https://github.com/didier-durand",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code",
|
||||
"doc"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "karthikdani",
|
||||
"name": "Karthik Dani",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/karthikdani",
|
||||
"profile": "https://github.com/karthikdani",
|
||||
"contributions": [
|
||||
"bug",
|
||||
"code"
|
||||
]
|
||||
},
|
||||
{
|
||||
"login": "jettythek",
|
||||
"name": "jettythek",
|
||||
"avatar_url": "https://avatars.githubusercontent.com/jettythek",
|
||||
"profile": "https://github.com/jettythek",
|
||||
"contributions": [
|
||||
"code"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -268,6 +268,38 @@ Your commits will be included in the next release with appropriate version bump.
|
||||
|
||||
---
|
||||
|
||||
## 🏆 Contributor Recognition
|
||||
|
||||
We use [All Contributors](https://allcontributors.org) to recognize everyone who helps improve TinyTorch.
|
||||
|
||||
### How to Recognize a Contributor
|
||||
|
||||
After merging a PR or resolving an issue, comment:
|
||||
|
||||
```
|
||||
@all-contributors please add @username for TYPE
|
||||
```
|
||||
|
||||
### Contribution Types
|
||||
|
||||
| Type | Emoji | Use For |
|
||||
|------|-------|---------|
|
||||
| `bug` | 🐛 | Found a bug or issue |
|
||||
| `code` | 💻 | Submitted code |
|
||||
| `doc` | 📖 | Improved documentation |
|
||||
| `ideas` | 💡 | Suggested improvements |
|
||||
| `test` | 🧪 | Added tests |
|
||||
| `review` | 👀 | Reviewed PRs |
|
||||
|
||||
### Examples
|
||||
|
||||
```
|
||||
@all-contributors please add @AmirAlasady for bug
|
||||
@all-contributors please add @student123 for code, doc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Remember**: TinyTorch is about teaching students to understand ML systems by building them. Every contribution should enhance that educational mission! 🎓🔥
|
||||
|
||||
**Questions?** Check the docs or open a GitHub Discussion.
|
||||
|
||||
@@ -255,12 +255,43 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
||||
|
||||
---
|
||||
|
||||
## Contributors
|
||||
|
||||
Thanks to these wonderful people who helped improve TinyTorch ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section -->
|
||||
<!-- prettier-ignore-start -->
|
||||
<!-- markdownlint-disable -->
|
||||
<table>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/AmirAlasady"><img src="https://avatars.githubusercontent.com/AmirAlasady?v=4?s=80" width="80px;" alt="Amir Alasady"/><br /><sub><b>Amir Alasady</b></sub></a><br />🐛</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/profvjreddi"><img src="https://avatars.githubusercontent.com/profvjreddi?v=4?s=80" width="80px;" alt="Vijay Janapa Reddi"/><br /><sub><b>Vijay Janapa Reddi</b></sub></a><br />🐛 💻 🎨 📖 💡 👀 🧪 🔧</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/kai4avaya"><img src="https://avatars.githubusercontent.com/kai4avaya?v=4?s=80" width="80px;" alt="kai"/><br /><sub><b>kai</b></sub></a><br />🐛 💻 🎨 📖 🧪</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/minhdang26403"><img src="https://avatars.githubusercontent.com/minhdang26403?v=4?s=80" width="80px;" alt="Dang Truong"/><br /><sub><b>Dang Truong</b></sub></a><br />🐛 💻 📖 🧪</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/didier-durand"><img src="https://avatars.githubusercontent.com/didier-durand?v=4?s=80" width="80px;" alt="Didier Durand"/><br /><sub><b>Didier Durand</b></sub></a><br />🐛 💻 📖</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/karthikdani"><img src="https://avatars.githubusercontent.com/karthikdani?v=4?s=80" width="80px;" alt="Karthik Dani"/><br /><sub><b>Karthik Dani</b></sub></a><br />🐛 💻</td>
|
||||
<td align="center" valign="top" width="14.28%"><a href="https://github.com/jettythek"><img src="https://avatars.githubusercontent.com/jettythek?v=4?s=80" width="80px;" alt="jettythek"/><br /><sub><b>jettythek</b></sub></a><br />💻</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<!-- markdownlint-restore -->
|
||||
<!-- prettier-ignore-end -->
|
||||
|
||||
<!-- ALL-CONTRIBUTORS-LIST:END -->
|
||||
|
||||
**Recognize a contributor:** Comment on any issue or PR:
|
||||
```
|
||||
@all-contributors please add @username for bug, code, doc, or ideas
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Acknowledgments
|
||||
|
||||
Created by [Prof. Vijay Janapa Reddi](https://vijay.seas.harvard.edu) at Harvard University.
|
||||
|
||||
Special thanks to students and contributors who helped build this framework.
|
||||
|
||||
---
|
||||
|
||||
## License
|
||||
|
||||
Reference in New Issue
Block a user