36 Commits

Author SHA1 Message Date
Sravan Balaji
3016fd8d5b Clean Up Personal Page
- Add hardware section to personal page
- Remove video games, podcasts, music, etc.
2025-02-22 22:00:36 -05:00
Sravan Balaji
6beea310df Update devenv packages 2025-02-18 21:43:01 -05:00
Sravan Balaji
6f506c4273 Update gentoo content 2025-02-18 21:42:44 -05:00
Sravan Balaji
32444ba72a Add collection for hardware with oryp7 and add gentoo to software 2025-02-15 11:38:59 -05:00
Sravan Balaji
6fd5369daf Finish migrating software to markdown 2025-02-07 22:47:53 -05:00
Sravan Balaji
2d6be05eae Update packages 2025-02-07 20:14:55 -05:00
Sravan Balaji
a73d30d52f Add Software Engineer II promotion 2025-02-07 19:52:27 -05:00
Sravan Balaji
c08adab41c Add npm update to justfile's update command 2025-01-04 22:21:52 -05:00
Sravan Balaji
c8cf9dd738 Format eleventy config with prettier 2025-01-04 22:20:12 -05:00
Sravan Balaji
041164f1d2 Setup project with devenv instead of docker 2025-01-04 22:20:12 -05:00
Sravan Balaji
660c328c86 Format dark mode switch script 2025-01-04 18:39:43 -05:00
Sravan Balaji
cd4e714cb6 Start migrating software section to use templates 2025-01-04 14:36:32 -05:00
Sravan Balaji
df2d33e32a Minor fixes to portfolio page 2025-01-02 17:38:30 -05:00
Sravan Balaji
87ae00354d Add notable courses for umich degrees 2025-01-02 17:26:39 -05:00
Sravan Balaji
668a89a276 Make portfolio + highlights a re-usable macro
- Use more generic metadata key names for portfolio
2025-01-02 17:06:27 -05:00
Sravan Balaji
f612212911 Add education section entries 2025-01-02 16:35:18 -05:00
Sravan Balaji
914636e5fe Change cards to accordion in bootstrap 5 2025-01-02 11:29:09 -05:00
Sravan Balaji
3431132901 Add dropdown toggles for navigation bar
- Fix styling for nav-link.active
2025-01-02 10:42:40 -05:00
Sravan Balaji
1798624bce Create macro for section heading
- Update layouts to use new macro
- Reformat some files
2025-01-02 10:25:18 -05:00
Sravan Balaji
40028ed830 Split portfolio template into partial sections 2025-01-02 10:10:57 -05:00
Sravan Balaji
6fe01ca1f8 Fix duplicate bootstrap causing strange issues 2025-01-02 10:07:04 -05:00
Sravan Balaji
a72c989a7d Add editorconfig and re-format navigation.html 2025-01-02 09:49:37 -05:00
Sravan Balaji
dd4671b7b8 Update navigation bar to work with bootstrap 5 2025-01-02 00:16:57 -05:00
Sravan Balaji
46db1fd2e0 Update dependencies and use new dark mode switch from bootstrap 2025-01-01 23:51:43 -05:00
Sravan Balaji
43157146e8 Migrate professional experience to templates 2025-01-01 23:14:13 -05:00
Sravan Balaji
c4eaa3d82b Update about page to use templates 2025-01-01 17:50:50 -05:00
Sravan Balaji
c37990b434 Update profile picture 2025-01-01 17:12:43 -05:00
Sravan Balaji
be269cf9b5 Fix filepath to style 2025-01-01 17:05:26 -05:00
Sravan Balaji
b21d04854e Reorganization and Data Files
- Use more template / partial features of 11ty by splitting
  up sections of code into separate files
- Change output directory to "dist"
- Use njk as the template engine
- Add data file for navigation links and site metadata
2025-01-01 16:28:21 -05:00
Sravan Balaji
2ebfb8ef48 Move common files into base template
- Copy assets and scripts folder to output
- Move contents of common files into the base template's HTML
- Fix link syntax on index.md
2025-01-01 13:50:36 -05:00
Sravan Balaji
fff17e62a1 Cleanup justfile and dockerfile
- Add a gitignore for output directory
- Make justfile use multi-lines for readability
- Remove COPY step from Dockerfile
2025-01-01 13:26:23 -05:00
Sravan Balaji
6808d71ca5 Basic 11ty config and index page with base layout 2024-12-31 13:26:07 -05:00
Sravan Balaji
91528d99a4 Initial migration to eleventy
- Add dockerfile to run eleventy from
- Add justfile to save useful commands
2024-12-31 12:40:10 -05:00
Sravan Balaji
ceea34cb51 Replace Google Drive PDF Viewer with Link to GitHub
- Google drive PDF viewer appears to be broken or
  unreliable now, so switched to a simple link
  to the GitHub repo
2024-04-19 11:24:48 -04:00
Sravan Balaji
b94cfbdf76 Change top level index redirection to relative path 2023-08-25 15:27:55 -04:00
Sravan Balaji
255d6b1920 April 2023 Update
- Update personal page with new devices, remove deprecated VS Code extensions, replace deprecated apps, add mechanical keyboard
- Update portfolio page with new jobs and move education to end
- Update images
2023-04-08 11:11:07 -04:00
114 changed files with 3770 additions and 3630 deletions

25
.editorconfig Normal file
View File

@@ -0,0 +1,25 @@
# EditorConfig is awesome: https://editorconfig.org
# top-most EditorConfig file
root = true
# Unix-style newlines with a newline ending every file
[*]
charset = utf-8
indent_style = space
indent_size = 4
end_of_line = lf
insert_final_newline = false
trim_trailing_whitespace = true
# JSON Files
[*.{json}]
indent_size = 2
# Markdown Files
[*.{md,mdx}]
trim_trailing_whitespace = false
# Web Files
[*.{html,js,css}]
indent_size = 2

64
.eleventy.js Normal file
View File

@@ -0,0 +1,64 @@
module.exports = function (eleventyConfig) {
eleventyConfig.addPassthroughCopy("./src/style.css");
eleventyConfig.addPassthroughCopy("./src/assets");
eleventyConfig.addPassthroughCopy("./src/scripts");
eleventyConfig.addFilter(
"findAssociation",
function (entries, associatedEntry) {
return entries.filter(function (entry) {
return entry.data.associatedEntry == associatedEntry;
});
},
);
eleventyConfig.addCollection("professionalExperience", (collection) => {
return collection
.getFilteredByGlob("./src/portfolio/professionalExperience/*.md")
.sort((a, b) =>
Number(a.data.displayOrder) < Number(b.data.displayOrder) ? 1 : -1,
);
});
eleventyConfig.addCollection("education", (collection) => {
return collection
.getFilteredByGlob("./src/portfolio/education/*.md")
.sort((a, b) =>
Number(a.data.displayOrder) < Number(b.data.displayOrder) ? 1 : -1,
);
});
eleventyConfig.addCollection("highlights", (collection) => {
return collection
.getFilteredByGlob("./src/portfolio/highlights/*.md")
.sort((a, b) =>
Number(a.data.displayOrder) > Number(b.data.displayOrder) ? 1 : -1,
);
});
eleventyConfig.addCollection("software", (collection) => {
return collection
.getFilteredByGlob("./src/personal/software/*.md")
.sort((a, b) =>
Number(a.data.displayOrder) > Number(b.data.displayOrder) ? 1 : -1,
);
});
eleventyConfig.addCollection("hardware", (collection) => {
return collection
.getFilteredByGlob("./src/personal/hardware/*.md")
.sort((a, b) =>
Number(a.data.displayOrder) > Number(b.data.displayOrder) ? 1 : -1,
);
});
return {
markdownTemplateEngine: "njk",
dataTemplateEngine: "njk",
htmlTemplateEngine: "njk",
dir: {
input: "src",
output: "dist",
},
};
};

3
.envrc Normal file
View File

@@ -0,0 +1,3 @@
source_url "https://raw.githubusercontent.com/cachix/devenv/82c0147677e510b247d8b9165c54f73d32dfd899/direnvrc" "sha256-7u4iDd1nZpxL4tCzmPG0dQgC5V+/44Ba+tHkPob1v2k="
use devenv

15
.gitignore vendored Normal file
View File

@@ -0,0 +1,15 @@
# eleventy output
dist
# Devenv
.devenv*
devenv.local.nix
# direnv
.direnv
# pre-commit
.pre-commit-config.yaml
# NodeJS
node_modules/

103
devenv.lock Normal file
View File

@@ -0,0 +1,103 @@
{
"nodes": {
"devenv": {
"locked": {
"dir": "src/modules",
"lastModified": 1739444039,
"owner": "cachix",
"repo": "devenv",
"rev": "1235cd13f47df6ad19c8a183c6eabc1facb7c399",
"type": "github"
},
"original": {
"dir": "src/modules",
"owner": "cachix",
"repo": "devenv",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1733328505,
"owner": "edolstra",
"repo": "flake-compat",
"rev": "ff81ac966bb2cae68946d5ed5fc4994f96d0ffec",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"git-hooks": {
"inputs": {
"flake-compat": "flake-compat",
"gitignore": "gitignore",
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1737465171,
"owner": "cachix",
"repo": "git-hooks.nix",
"rev": "9364dc02281ce2d37a1f55b6e51f7c0f65a75f17",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "git-hooks.nix",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"git-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1733477122,
"owner": "cachix",
"repo": "devenv-nixpkgs",
"rev": "7bd9e84d0452f6d2e63b6e6da29fe73fac951857",
"type": "github"
},
"original": {
"owner": "cachix",
"ref": "rolling",
"repo": "devenv-nixpkgs",
"type": "github"
}
},
"root": {
"inputs": {
"devenv": "devenv",
"git-hooks": "git-hooks",
"nixpkgs": "nixpkgs",
"pre-commit-hooks": [
"git-hooks"
]
}
}
},
"root": "root",
"version": 7
}

20
devenv.nix Normal file
View File

@@ -0,0 +1,20 @@
{ pkgs, lib, config, inputs, ... }:
{
# https://devenv.sh/packages/
packages = [
pkgs.git
pkgs.yaml-language-server
pkgs.typescript-language-server
pkgs.nodePackages.prettier
];
# https://devenv.sh/languages/
# languages.rust.enable = true;
languages.javascript = {
enable = true;
npm.enable = true;
npm.install.enable = true;
};
languages.nix.enable = true;
}

15
devenv.yaml Normal file
View File

@@ -0,0 +1,15 @@
# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json
inputs:
nixpkgs:
url: github:cachix/devenv-nixpkgs/rolling
# If you're using non-OSS software, you can set allowUnfree to true.
# allowUnfree: true
# If you're willing to use a package that's vulnerable
# permittedInsecurePackages:
# - "openssl-1.1.1w"
# If you have more than one devenv you can merge them
#imports:
# - ./backend

View File

@@ -1,7 +0,0 @@
<!--Dummy File to Redirect to index.html in Web Pages Folder-->
<head>
<meta
http-equiv="refresh"
content="0; url=https://sravanbalaji.com/src/index.html"
/>
</head>

22
justfile Normal file
View File

@@ -0,0 +1,22 @@
set shell := ["bash", "-c"]
PORT := "1280"
# List just commands by default
default:
@just --list
# Update development environment
update:
devenv update && \
npm update
# Run development server
dev:
npx @11ty/eleventy \
--serve \
--port={{ PORT }};
# Build static site files
build-site:
npx @11ty/eleventy

2201
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

5
package.json Normal file
View File

@@ -0,0 +1,5 @@
{
"dependencies": {
"@11ty/eleventy": "latest"
}
}

28
src/_data/contact.json Normal file
View File

@@ -0,0 +1,28 @@
{
"items": [
{
"label": "Email",
"icon": "/assets/about/email.png",
"link": "mailto:balajsra@umich.edu",
"displayText": "balajsra@umich.edu"
},
{
"label": "LinkedIn",
"icon": "/assets/about/linkedin.png",
"link": "https://www.linkedin.com/in/sravan-balaji",
"displayText": "sravan-balaji"
},
{
"label": "GitHub",
"icon": "/assets/about/github.png",
"link": "https://github.com/balajsra",
"displayText": "balajsra"
},
{
"label": "YouTube",
"icon": "/assets/about/youtube.png",
"link": "https://www.youtube.com/channel/UC-xFJ4IKdogbpoQdQf2mgaA",
"displayText": "Sravan Balaji"
}
]
}

37
src/_data/navigation.json Normal file
View File

@@ -0,0 +1,37 @@
{
"items": [
{
"text": "About",
"url": "/about/",
"sections": [
"Bio",
"Contact Me"
]
},
{
"text": "Portfolio",
"url": "/portfolio/",
"sections": [
"Resume",
"Professional Experience",
"Education",
"Research"
]
},
{
"text": "Personal",
"url": "/personal/",
"sections": []
},
{
"text": "Blog",
"url": "/blog/",
"sections": []
},
{
"text": "Documentation",
"url": "/documentation/",
"sections": []
}
]
}

7
src/_data/site.json Normal file
View File

@@ -0,0 +1,7 @@
{
"author": "Sravan Balaji",
"url": "https://sravanbalaji.com",
"copyrightYear": 2019,
"licenseFile": "https://github.com/balajsra/sravanbalaji.com/blob/master/LICENSE",
"licenseName": "MIT License"
}

View File

@@ -0,0 +1,38 @@
<!doctype html>
{% extends "layouts/base.html" %}
{% from "macros.html" import sectionHeading %}
{% block content %}
<div class="container-fluid px-md-6">
{{ sectionHeading("Bio") }}
<div class="row align-items-center">
<div class="col-md-3">
<img
class="img-fluid mx-auto d-block"
src="{{ profilePicture }}"
/>
</div>
<div class="col-md-9">
{{ content | safe }}
</div>
</div>
{{ sectionHeading("Contact Me") }}
<div class="row align-items-center">
{% for item in contact.items %}
<div class="col-md-{{ 12//contact.items.length }} text-center">
<a href="{{ item.link }}" target="_blank">
<img
class="img-fluid mx-auto d-block"
width=50%
alt="{{ item.label }}"
src="{{ item.icon }}"
/>
</a>
<p><br /><b>{{ item.label }}:</b> {{ item.displayText }}</p>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,15 @@
<!doctype html>
<html lang="en" color-mode="light">
<head>
{% include "partials/site-head.html" %}
{% include "partials/navigation.html" %}
</head>
<body>
<main tabindex="-1" id="main-content">{% block content %}{% endblock %}</main>
</body>
<footer>
{% include "partials/footer.html" %}
</footer>
</html>

View File

@@ -0,0 +1,14 @@
<!doctype html>
{% extends "layouts/base.html" %}
{% from "macros.html" import sectionHeading %}
{% block content %}
<div class="container-fluid px-md-6">
{{ sectionHeading("Welcome") }}
<div class="row align-items-center">
<div class="col-md-12">
{{ content | safe }}
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,8 @@
<!doctype html>
{% extends "layouts/base.html" %}
{% block content %}
<div class="container-fluid px-md-6">
{% include "partials/software.html" %}
{% include "partials/hardware.html" %}
</div>
{% endblock %}

View File

@@ -0,0 +1,10 @@
<!doctype html>
{% extends "layouts/base.html" %}
{% block content %}
<div class="container-fluid px-md-6">
{% include "partials/resume.html" %}
{% include "partials/professionalExperience.html" %}
{% include "partials/education.html" %}
<!-- {% include "partials/research.html" %} -->
</div>
{% endblock %}

79
src/_includes/macros.html Normal file
View File

@@ -0,0 +1,79 @@
<!doctype html>
{% macro sectionHeading(name) %}
<div class="row align-items-center">
<div class="col-md-12">
<h1>
<a name="{{ name | slugify }}">{{ name }}</a>
</h1>
</div>
</div>
{% endmacro %}
{% macro portfolioWithHighlights(portfolio, highlights) %}
{% for entry in portfolio %}
<div class="row">
<div class="col-md-6">
<div class="row">
<div class="col-md-4">
<a href="{{ entry.data.url }}" target="_blank">
<img
class="img-fluid mx-auto d-block"
width="100%"
src="{{ entry.data.logo }}"
/>
</a>
</div>
<div class="col-md-8">
<h2><b>{{ entry.data.association }}</b></h2>
<h3>{{ entry.data.entryTitle }}</h3>
<h4>{{ entry.data.location }}</h4>
<h5><i>{{ entry.data.startDate }} - {{ entry.data.endDate }}</i></h5>
{{ entry.content | safe }}
</div>
</div>
</div>
{% set associatedHighlights = (highlights | findAssociation(entry.data.id)) %}
{% if associatedHighlights.length > 0 %}
<div class="col-md-6">
<div class="accordion accordion-flush" id="{{ entry.data.id }}">
{% for highlight in associatedHighlights %}
{% set highlightSlug = (entry.data.id + '-' + highlight.data.name | slugify) %}
<div class="accordion-item">
<div class="accordion-header"">
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#{{ highlightSlug }}">
<b>{{ highlight.data.name }}</b>
</button>
</div>
<div id="{{ highlightSlug }}" class="accordion-collapse collapse" data-bs-parent="#{{ entry.data.id }}">
<div class="accordion-body">
{{ highlight.content | safe }}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{% endif %}
</div>
{% endfor %}
{% endmacro %}
{% macro personalItems(personal) %}
{% for entry in personal %}
<div class="row">
<div class="col-md-2">
<a href="{{ entry.data.url }}" target="_blank">
<img
class="img-fluid mx-auto d-block"
width="50%"
src="{{ entry.data.logo }}"
/>
</a>
</div>
<div class="col-md-10">
<h2><b>{{ entry.data.category }}: <a href="{{ entry.data.url }}" target="_blank">{{ entry.data.name }}</a></b></h2>
{{ entry.content | safe }}
</div>
</div>
{% endfor %}
{% endmacro %}

View File

@@ -0,0 +1,6 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Education") }}
{% from "macros.html" import portfolioWithHighlights %}
{{ portfolioWithHighlights(collections.education, collections.highlights) }}

View File

@@ -0,0 +1,15 @@
<!doctype html>
<div class="container-fluid px-md-6">
<div class="row align-items-center">
<div class="col-md-12">
<small>
Copyright &copy; {{ site.copyrightYear }} {{ site.author }} under
<a
rel="license"
href="{{ site.licenseFile }}"
target="_blank"
>{{ site.licenseName }}</a>
</small>
</div>
</div>
</div>

View File

@@ -0,0 +1,6 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Hardware") }}
{% from "macros.html" import personalItems %}
{{ personalItems(collections.hardware) }}

View File

@@ -0,0 +1,48 @@
<!doctype html>
<header role="banner" class="site-head">
<nav class="navbar my-nav navbar-expand-md fixed-top">
<div class="container-fluid">
<!-- Brand -->
<a class="navbar-brand" href="/">
<img src="/assets/branding/logo.png" alt="Icon" width="30px" height="30px"
class="d-inline-block align-top" />
<img src="/assets/branding/name.png" alt="Name" height="30px" class="d-inline-block align-center" />
</a>
<!-- Toggler/collapsible Button -->
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarToggler">
<span class="navbar-toggler-icon"></span>
</button>
<!-- Navbar links -->
<div class="collapse navbar-collapse" id="navbarToggler">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
{% for item in navigation.items %}
{% if item.sections.length > 0 %}
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" id="{{ item.text | slugify }}" role="button" data-bs-toggle="dropdown" href="{{ item.url }}"><b>{{ item.text }}</b></a>
<ul class="dropdown-menu">
{% for section in item.sections %}
<li><a class="dropdown-item" href="{{ item.url }}#{{ section | slugify }}">{{ section }}</a></li>
{% endfor %}
</ul>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link" href="{{ item.url }}"><b>{{ item.text }}</b></a>
</li>
{% endif %}
{% endfor %}
</ul>
</div>
<!-- Dark Mode Toggle -->
<!-- Reference: https://github.com/coliff/dark-mode-switch -->
<div class="form-check form-switch">
<input type="checkbox" class="form-check-input" id="darkSwitch" />
<label class="form-check-label" for="darkSwitch" id="darkSwitchLabel">Dark Mode</label>
</div>
<script src="/scripts/dark-mode-switch.min.js"></script>
</div>
</nav>
</header>

View File

@@ -0,0 +1,6 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Professional Experience") }}
{% from "macros.html" import portfolioWithHighlights %}
{{ portfolioWithHighlights(collections.professionalExperience, collections.highlights) }}

View File

@@ -0,0 +1,3 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Research") }}

View File

@@ -0,0 +1,16 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Resume") }}
<div class="row align-items-center">
<div class="col-md-12">
<p>
The latest version of my resume is hosted on
<a
href="https://github.com/balajsra/resume/blob/master/sravan_balaji_resume.pdf"
target="_blank"
>GitHub</a
>.
</p>
</div>
</div>

View File

@@ -0,0 +1,33 @@
<!doctype html>
<!--Required meta tags-->
<meta charset="utf-8" />
<meta name="author" content="{{ site.author }}" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- Bootstrap -->
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r"
crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js"
integrity="sha384-0pUGZvbkm6XF6gxjEnlmuGrJXVbNuzT9qBBavbLwCsOGabYfZo0T0to5eqruptLy"
crossorigin="anonymous"></script>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<!-- jQuery -->
<script src="https://code.jquery.com/jquery-3.7.1.slim.min.js"
integrity="sha256-kmHvs0B+OpCW5GVHUNjv9rOmY0IvSIRcf7zGUDTDQM8=" crossorigin="anonymous"></script>
<!-- highlight.js -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/default.min.css">
<script src="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/highlight.min.js"></script>
<script>hljs.highlightAll();</script>
<!-- Stylesheet -->
<link rel="stylesheet" type="text/css" href="/style.css" />
<!-- Favicon -->
<link rel="icon" href="/assets/branding/favicon.ico" type="image/x-icon" />
<!-- Title -->
<title>{{ title }}</title>

View File

@@ -0,0 +1,6 @@
<!doctype html>
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Software") }}
{% from "macros.html" import personalItems %}
{{ personalItems(collections.software) }}

View File

@@ -1,169 +0,0 @@
<!DOCTYPE html>
<html lang="en" color-mode="light">
<head>
<script
language="javascript"
type="text/javascript"
src="common/header.txt"
></script>
<title>About</title>
</head>
<script
language="javascript"
type="text/javascript"
src="common/navbar.txt"
></script>
<body>
<div class="container-fluid px-md-6">
<!---------------------------------
BIO
----------------------------------->
<div id="bio">
<div class="row align-items-center">
<div class="col-md-12">
<h1><a name="bio">Bio</a></h1>
</div>
</div>
<div class="row align-items-center">
<div class="col-md-3">
<img
class="img-fluid mx-auto d-block"
src="./assets/about/profile_picture.jpg"
/>
</div>
<div class="col-md-9">
<p>
Sravan Balaji completed his undergraduate and graduate degrees at
the
<a href="https://umich.edu" target="_blank"
>University of Michigan, Ann Arbor</a
>. He earned dual B.S.E.'s in
<a href="https://me.engin.umich.edu/" target="_blank"
>Mechanical Engineering</a
>
and
<a href="https://cse.engin.umich.edu/" target="_blank"
>Computer Science</a
>
in December 2020 and an M.S. in
<a href="https://robotics.umich.edu/" target="_blank">Robotics</a>
in December 2021.
</p>
<p>
Sravan worked as a Graduate Navigation Intern at
<a href="https://www.mitre.org/" target="_blank">MITRE</a>
during summer 2021. You can learn more about this and his other
work experiences in the
<a href="./portfolio.html#professional_experience"
>professional experience</a
>
section of the
<a href="./portfolio.html">portfolio</a> page. He is currently
working at
<a href="https://www.mitre.org/" target="_blank">MITRE</a>
as an Associate Autonomous Systems Engineer in McLean, VA.
</p>
<p>
Sravan's professional and academic interests are in controls,
motion planning, robotic perception & manipulation, autonomous &
connected vehicles, software development, and GNU/Linux among
other things. His personal interests include video games,
podcasts, music, cooking, football, soccer, formula 1, and
productivity software.
</p>
</div>
</div>
<div class="row align-items-center">
<div class="col-md-12">
<h1><a name="contact_me">Contact Me</a></h1>
</div>
</div>
<div class="row align-items-center">
<div class="col-md-12">
<p>
Feel free to reach out to me via email if you have any questions
about my website, college education, professional experience, or
anything else. If you have suggestions for the website or would
like to see the source files, check out my
<a
href="https://github.com/balajsra/sravanbalaji.com"
target="_blank"
>
GitHub repository</a
>. If you would like to connect with me on LinkedIn, use the link
below. I will do my best to respond to any communication in a
timely manner. Finally, check out my YouTube channel if you are
interested in some of the projects I have worked on.
</p>
</div>
</div>
</div>
<!---------------------------------
CONTACT ME
----------------------------------->
<div id="contact_me">
<div class="row align-items-center">
<div class="col-md-3 text-center">
<a href="mailto:balajsra@umich.edu" target="_blank">
<img
class="img-fluid mx-auto d-block"
alt="Email"
src="./assets/about/email.png"
/>
</a>
<p><br /><b>Email:</b> balajsra@umich.edu</p>
</div>
<div class="col-md-3 text-center">
<a
href="https://www.linkedin.com/in/sravan-balaji/"
target="_blank"
>
<img
class="img-fluid mx-auto d-block"
alt="LinkedIn"
src="./assets/about/linkedin.png"
/>
</a>
<p><br /><b>LinkedIn:</b> sravan-balaji</p>
</div>
<div class="col-md-3 text-center">
<a href="https://github.com/balajsra" target="_blank">
<img
class="img-fluid mx-auto d-block"
alt="GitHub"
src="./assets/about/github.png"
/>
</a>
<p><br /><b>GitHub:</b> balajsra</p>
</div>
<div class="col-md-3 text-center">
<a
href="https://www.youtube.com/channel/UC-xFJ4IKdogbpoQdQf2mgaA"
target="_blank"
>
<img
class="img-fluid mx-auto d-block"
alt="YouTube"
src="./assets/about/youtube.png"
/>
</a>
<p><br /><b>YouTube:</b> Sravan Balaji</p>
</div>
</div>
</div>
</div>
</body>
<footer>
<script
language="javascript"
type="text/javascript"
src="common/footer.txt"
></script>
</footer>
</html>

11
src/about.md Normal file
View File

@@ -0,0 +1,11 @@
---
title: About
layout: "layouts/about.html"
profilePicture: "/assets/about/profile_picture.jpg"
---
Sravan Balaji completed his undergraduate and graduate degrees at the [University of Michigan, Ann Arbor](https://umich.edu). He earned dual B.S.E.'s in [Mechanical Engineering](https://me.engin.umich.edu) and [Computer Science](https://cse.engin.umich.edu) in December 2020 and an M.S. in [Robotics](https://robotics.umich.edu) in December 2021.
Sravan worked as a Graduate Navigation Intern at [MITRE](https://www.mitre.org) during summer 2021. You can learn more about this and his other work experiences in the [professional experience](/portfolio#professional_experience) section of the [portfolio](/portfolio) page. He later returned to [MITRE](https://www.mitre.org) full-time to work as an Autonomous Systems Engineer in McLean, VA. He currently works at [Metron](https://metsci.com) as a Software Engineer in Reston, VA.
Sravan's professional and academic interests are in controls, motion planning, robotic perception & manipulation, autonomous & connected vehicles, software development, and GNU/Linux among other things. His personal interests include video games, podcasts, music, cooking, football, soccer, formula 1, and productivity software.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 152 KiB

After

Width:  |  Height:  |  Size: 4.4 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 946 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 232 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 84 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

Before

Width:  |  Height:  |  Size: 153 KiB

After

Width:  |  Height:  |  Size: 153 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

View File

@@ -1,4 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024">
<path fill="#3a76f0" d="M0,0v1024h1024V0H0z"/>
<path fill="#ffffff" d="M427.5,170.3l7.9,32A319.6,319.6,0,0,0,347,238.9l-16.9-28.3A347.6,347.6,0,0,1,427.5,170.3Zm169,0-7.9,32A319.6,319.6,0,0,1,677,238.9l17.1-28.3A350.1,350.1,0,0,0,596.5,170.3ZM210.6,330a349.5,349.5,0,0,0-40.3,97.5l32,7.9A319.6,319.6,0,0,1,238.9,347ZM193,512a318.5,318.5,0,0,1,3.6-47.8l-32.6-5a352,352,0,0,0,0,105.5l32.6-4.9A319.5,319.5,0,0,1,193,512ZM693.9,813.3,677,785.1a317.8,317.8,0,0,1-88.3,36.6l7.9,32A350.3,350.3,0,0,0,693.9,813.3ZM831,512a319.5,319.5,0,0,1-3.6,47.8l32.6,4.9a352,352,0,0,0,0-105.5l-32.6,5A318.5,318.5,0,0,1,831,512Zm22.7,84.4-32-7.9A319,319,0,0,1,785.1,677l28.3,17A348.9,348.9,0,0,0,853.7,596.4Zm-293.9,231a319.1,319.1,0,0,1-95.6,0L459.3,860a351.3,351.3,0,0,0,105.4,0Zm209-126.2a318.1,318.1,0,0,1-67.6,67.5l19.6,26.6A355.1,355.1,0,0,0,795.4,721Zm-67.6-446a318.6,318.6,0,0,1,67.6,67.6L795.4,303A354.6,354.6,0,0,0,721,228.6Zm-446,67.6a318.6,318.6,0,0,1,67.6-67.6L303,228.6A354.6,354.6,0,0,0,228.6,303ZM813.4,330l-28.3,17a317.8,317.8,0,0,1,36.6,88.3l32-7.9A348.9,348.9,0,0,0,813.4,330ZM464.2,196.6a319.1,319.1,0,0,1,95.6,0l4.9-32.6a351.3,351.3,0,0,0-105.4,0ZM272.1,804.1,204,819.9l15.9-68.1-32.1-7.5-15.9,68.1a33,33,0,0,0,24.6,39.7,34.5,34.5,0,0,0,15,0l68.1-15.7Zm-77.5-89.2,32.2,7.4,11-47.2a316.2,316.2,0,0,1-35.5-86.6l-32,7.9a353.3,353.3,0,0,0,32.4,83.7Zm154,71.4-47.2,11,7.5,32.2,34.7-8.1a349,349,0,0,0,83.7,32.4l7.9-32a316.7,316.7,0,0,1-86.3-35.7ZM512,226c-158,.1-285.9,128.2-285.9,286.1a286.7,286.7,0,0,0,43.9,152L242.5,781.5,359.8,754c133.7,84.1,310.3,44,394.4-89.6S798.3,354.2,664.7,270A286.7,286.7,0,0,0,512,226s"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 155 KiB

View File

@@ -1,15 +0,0 @@
<div class="container-fluid px-md-6">
<div class="row align-items-center">
<div class="col-md-12">
<small>
Copyright &copy; 2019 Sravan Balaji under
<a
rel="license"
href="https://docs.google.com/gview?url=https://github.com/balajsra/sravanbalaji.com/raw/master/LICENSE"
target="_blank"
>MIT License</a
>
</small>
</div>
</div>
</div>

View File

@@ -1 +0,0 @@
document.write('<div class="container-fluid px-md-6"> <div class="row align-items-center"> <div class="col-md-12"> <small> Copyright &copy; 2019 Sravan Balaji under <a rel="license" href="https://docs.google.com/gview?url=https://github.com/balajsra/sravanbalaji.com/raw/master/LICENSE" target="_blank" >MIT License</a > </small> </div> </div> </div> ')

View File

@@ -1,43 +0,0 @@
<!--Required meta tags-->
<meta charset="utf-8" />
<meta name="author" content="Sravan Balaji" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<!-- Bootstrap -->
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T"
crossorigin="anonymous"
/>
<script
src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"
crossorigin="anonymous"
></script>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js"
integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"
crossorigin="anonymous"
></script>
<script
src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js"
integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"
crossorigin="anonymous"
></script>
<!-- highlight.js -->
<link
rel="stylesheet"
href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.1/styles/default.min.css"
/>
<script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.1/highlight.min.js"></script>
<script>
hljs.initHighlightingOnLoad();
</script>
<!-- Stylesheet -->
<link rel="stylesheet" type="text/css" href="style/styles.css" />
<!-- Favicon -->
<link rel="icon" href="././assets/branding/favicon.ico" type="image/x-icon" />

View File

@@ -1 +0,0 @@
document.write('<!--Required meta tags--> <meta charset="utf-8" /> <meta name="author" content="Sravan Balaji" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <!-- Bootstrap --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous" /> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous" ></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous" ></script> <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous" ></script> <!-- highlight.js --> <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.1/styles/default.min.css" /> <script src="//cdnjs.cloudflare.com/ajax/libs/highlight.js/10.3.1/highlight.min.js"></script> <script> hljs.initHighlightingOnLoad(); </script> <!-- Stylesheet --> <link rel="stylesheet" type="text/css" href="style/styles.css" /> <!-- Favicon --> <link rel="icon" href="././assets/branding/favicon.ico" type="image/x-icon" /> ')

View File

@@ -1,174 +0,0 @@
<nav class="navbar my-nav navbar-expand-md fixed-top">
<!-- Brand -->
<a class="navbar-brand" href="./index.html">
<img
src="./assets/branding/logo.png"
alt="Icon"
width="30px"
height="30px"
class="d-inline-block align-top"
/>
<img
src="./assets/branding/name.png"
alt="Name"
height="30px"
class="d-inline-block align-center"
/>
</a>
<!-- Toggler/collapsible Button -->
<button
class="navbar-toggler"
type="button"
data-toggle="collapse"
data-target="#collapsibleNavbar"
>
<span class="navbar-toggler-icon"></span>
</button>
<!-- Navbar links -->
<div class="collapse navbar-collapse" id="collapsibleNavbar">
<ul class="navbar-nav">
<!-- About -->
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
href="./about.html"
id="navbardrop"
data-toggle="dropdown"
>
About
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="./about.html#bio"> Bio </a>
<a class="dropdown-item" href="./about.html#contact_me">
Contact Me
</a>
</div>
</li>
<!-- Portfolio -->
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
href="./portfolio.html"
id="navbardrop"
data-toggle="dropdown"
>
Portfolio
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="./portfolio.html#resume">
Resume
</a>
<a class="dropdown-item" href="./portfolio.html#education">
Education
</a>
<a
class="dropdown-item"
href="./portfolio.html#professional_experience"
>
Professional Experience
</a>
<!-- <a class="dropdown-item" href="./portfolio.html#research">
Research
</a>
<a class="dropdown-item" href="./portfolio.html#projects">
Projects
</a> -->
</div>
</li>
<!-- Personal -->
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
href="./personal.html"
id="navbardrop"
data-toggle="dropdown"
>
Personal
</a>
<div class="dropdown-menu">
<a class="dropdown-item" href="./personal.html#software">
Software
</a>
<a class="dropdown-item" href="./personal.html#hardware">
Hardware
</a>
<a class="dropdown-item" href="./personal.html#video_games">
Video Games
</a>
<a class="dropdown-item" href="./personal.html#podcasts">
Podcasts
</a>
<a class="dropdown-item" href="./personal.html#music">
Music
</a>
</div>
</li>
<!-- Blog -->
<li class="nav-item">
<a class="nav-link" href="./blog.html"> Blog </a>
</li>
<!-- Documentation -->
<li class="nav-item dropdown">
<a
class="nav-link dropdown-toggle"
href="./documentation.html"
id="navbardrop"
data-toggle="dropdown"
>
Documentation
</a>
<div class="dropdown-menu">
<a
class="dropdown-item"
href="./documentation.html#introduction"
>
Introduction
</a>
<a
class="dropdown-item"
href="./documentation.html#website_hosting"
>
Website Hosting
</a>
<a
class="dropdown-item"
href="./documentation.html#web_design"
>
Web Design
</a>
<a
class="dropdown-item"
href="./documentation.html#aesthetics"
>
Aesthetics
</a>
<a
class="dropdown-item"
href="./documentation.html#inspiration"
>
Inspiration
</a>
</div>
</li>
</ul>
</div>
<!-- Dark Mode Toggle -->
<!-- Reference: https://github.com/coliff/dark-mode-switch -->
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" id="darkSwitch" />
<label
class="custom-control-label"
for="darkSwitch"
id="darkSwitchLabel"
>Dark Mode</label
>
</div>
<script src="./scripts/dark-mode-switch.min.js"></script>
</nav>

View File

@@ -1 +0,0 @@
document.write('<nav class="navbar my-nav navbar-expand-md fixed-top"> <!-- Brand --> <a class="navbar-brand" href="./index.html"> <img src="./assets/branding/logo.png" alt="Icon" width="30px" height="30px" class="d-inline-block align-top" /> <img src="./assets/branding/name.png" alt="Name" height="30px" class="d-inline-block align-center" /> </a> <!-- Toggler/collapsible Button --> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar" > <span class="navbar-toggler-icon"></span> </button> <!-- Navbar links --> <div class="collapse navbar-collapse" id="collapsibleNavbar"> <ul class="navbar-nav"> <!-- About --> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="./about.html" id="navbardrop" data-toggle="dropdown" > About </a> <div class="dropdown-menu"> <a class="dropdown-item" href="./about.html#bio"> Bio </a> <a class="dropdown-item" href="./about.html#contact_me"> Contact Me </a> </div> </li> <!-- Portfolio --> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="./portfolio.html" id="navbardrop" data-toggle="dropdown" > Portfolio </a> <div class="dropdown-menu"> <a class="dropdown-item" href="./portfolio.html#resume"> Resume </a> <a class="dropdown-item" href="./portfolio.html#education"> Education </a> <a class="dropdown-item" href="./portfolio.html#professional_experience" > Professional Experience </a> <!-- <a class="dropdown-item" href="./portfolio.html#research"> Research </a> <a class="dropdown-item" href="./portfolio.html#projects"> Projects </a> --> </div> </li> <!-- Personal --> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="./personal.html" id="navbardrop" data-toggle="dropdown" > Personal </a> <div class="dropdown-menu"> <a class="dropdown-item" href="./personal.html#software"> Software </a> <a class="dropdown-item" href="./personal.html#hardware"> Hardware </a> <a class="dropdown-item" href="./personal.html#video_games"> Video Games </a> <a class="dropdown-item" href="./personal.html#podcasts"> Podcasts </a> <a class="dropdown-item" href="./personal.html#music"> Music </a> </div> </li> <!-- Blog --> <li class="nav-item"> <a class="nav-link" href="./blog.html"> Blog </a> </li> <!-- Documentation --> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="./documentation.html" id="navbardrop" data-toggle="dropdown" > Documentation </a> <div class="dropdown-menu"> <a class="dropdown-item" href="./documentation.html#introduction" > Introduction </a> <a class="dropdown-item" href="./documentation.html#website_hosting" > Website Hosting </a> <a class="dropdown-item" href="./documentation.html#web_design" > Web Design </a> <a class="dropdown-item" href="./documentation.html#aesthetics" > Aesthetics </a> <a class="dropdown-item" href="./documentation.html#inspiration" > Inspiration </a> </div> </li> </ul> </div> <!-- Dark Mode Toggle --> <!-- Reference: https://github.com/coliff/dark-mode-switch --> <div class="custom-control custom-switch"> <input type="checkbox" class="custom-control-input" id="darkSwitch" /> <label class="custom-control-label" for="darkSwitch" id="darkSwitchLabel" >Dark Mode</label > </div> <script src="./scripts/dark-mode-switch.min.js"></script> </nav> ')

View File

@@ -1,4 +1,4 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en" color-mode="light">
<head>
<script
@@ -228,27 +228,6 @@
</p>
</div>
</div>
<div class="row align-items-center">
<div class="col-md-12">
<h2>Display Resume PDF in Website using GitHub</h2>
<p>
I have the latest version of my
<a href="./portfolio.html#resume">resume</a> stored in a public
<a href="https://github.com/balajsra/resume" target="_blank">
GitHub repository</a
>, but I wanted an easy way to share it directly on my website.
This led me to look for ways to embed a PDF in HTML. This works
great for local files, but not so great for PDFs stored in a
repository. The trick is to get the link to the raw PDF file from
GitHub and to use Google Drive PDF Viewer. This is outlined in
<a
href="https://medium.com/@kekayan/display-your-resume-cv-pdf-in-website-using-github-73a088ac961d"
target="_blank"
>Kekayan's Medium post</a
>.
</p>
</div>
</div>
</div>
<!---------------------------------

View File

@@ -1,66 +0,0 @@
<!DOCTYPE html>
<html lang="en" color-mode="light">
<head>
<script
language="javascript"
type="text/javascript"
src="common/header.txt"
></script>
<title>Sravan Balaji</title>
</head>
<script
language="javascript"
type="text/javascript"
src="common/navbar.txt"
></script>
<body>
<div class="container-fluid px-md-6">
<div class="row align-items-center">
<div class="col-md-12">
<h1>Welcome!</h1>
<p>
Welcome to my personal website! This started out as a side project
to learn about web development and UI design, but it has since
expanded into a professional portfolio and blog (sort of). If you
are a fan of dark mode, try out the toggle button in the upper right
corner!
<br /><br />
On this website, you can find information about my
<a href="./portfolio.html#education">educational</a> and
<a href="./portfolio.html#professional_experience"
>professional career</a
>
as well as some of my
<a href="./personal.html">personal interests</a>. If you are looking
to create your own website and are curious about how I created and
hosted this one, please see the
<a href="./documentation.html">documentation</a>
page.
<br /><br />
This website is a constant work in progress and updates will be made
as I find time. You can follow development and make suggestions on
<a
href="https://github.com/balajsra/sravanbalaji.com"
target="_blank"
>GitHub</a
>.
</p>
</div>
</div>
</div>
</body>
<footer>
<script
language="javascript"
type="text/javascript"
src="common/footer.txt"
></script>
</footer>
</html>

10
src/index.md Normal file
View File

@@ -0,0 +1,10 @@
---
title: Sravan Balaji
layout: "layouts/home.html"
---
Welcome to my personal website! This started out as a side project to learn about web development and UI design, but it has since expanded into a professional portfolio and blog (sort of). If you are a fan of dark mode, try out the toggle button in the upper right corner!
On this website, you can find information about my [educational](./portfolio.html#education) and [professional career](./portfolio.html#professional_experience) as well as some of my [personal interests](./personal.html). If you are looking to create your own website and are curious about how I created and hosted this one, please see the [documentation](./documentation.html) page.
This website is a constant work in progress and updates will be made as I find time. You can follow development and make suggestions on [GitHub](https://github.com/balajsra/sravanbalaji.com).

File diff suppressed because it is too large Load Diff

4
src/personal.md Normal file
View File

@@ -0,0 +1,4 @@
---
title: Personal
layout: "layouts/personal.html"
---

View File

@@ -0,0 +1,15 @@
---
displayOrder: 3
url: "https://www.samsung.com/us/app/watches/galaxy-watch5-pro"
logo: "/assets/hardware/galaxy-watch5-pro.png"
category: "Smart Watch"
name: "Samsung Galaxy Watch 5 Pro"
---
With the Samsung Galaxy Watch 5 Pro (and some older devices), Samsung partnered with Google to build a new version of Wear OS. Now, you get the amazing user experience from Samsung's old Tizen OS with all the app support of Google's Wear OS.
The Watch 5 Pro drops the mechanical bezel that I loved on my old Galaxy Watch, but the capacitive bezel is perfectly fine. Battery live is decent, but nothing special in my experience. I can usually get a little more than a full day's worth of battery even with the always on display activated.
It charges pretty quickly though, so I've never had an issue as long as I charge it for a bit every morning before leaving for the day. If you're an Android phone user, I can absolutely recommend this device. Especially if you have a samsung phone.
I didn't find any of the included watch faces particularly compelling, but [Watchmaker](https://getwatchmaker.com/) has an awesome [Fallout Pip-Boy Watchface](https://getwatchmaker.com/watchface/fallout-pip-boy-4-copy-sBy) that I modified to show my name.

View File

@@ -0,0 +1,17 @@
---
displayOrder: 2
url: "https://www.samsung.com/us/smartphones/galaxy-z-fold4"
logo: "/assets/hardware/galaxy-z-fold-4.png"
category: "Smartphone"
name: "Samsung Galaxy Z Fold 4"
---
I was originally really hesitant about getting a folding phone given some of the quality control issues with the early generations of the Galaxy Z Fold, but the 4th is really where Samsung refined their design to the point that I think it is ready for the mainstream.
I upgraded to this from a Galaxy S10+, which I absolutely loved. However, this device is a step above even the top of the line slab style phones. The versatility of having an almost full size phone when folded, and an amazing tablet when unfolded was unmatched by the competition (at least in the U.S. market) until recently. We're finally starting to see some competition from the Google Pixel 9 Pro Fold and OnePlus Open.
Multi tasking and content consumption on the big screen is absolutely amazing. No longer do I need to pull out a big and clunky tablet (like the Microsoft Surface Go I had before) to watch a movie. Now, I just pull out my phone and unfold it into a screen that is plenty big enough to watch whatever I want. Sometimes, I even watch a live sports match while multi-tasking with stats on a second app.
This kind of functionality will definitely cost you, but given that it can replace two devices, can fit in your pocket, and supports the S-pen, I can absolutely recommend this device for anyone looking to upgrade to a folding phone.
However, if durability is a concern, you may want to stay away. The hinge on my device broke after about two years of normal usage and it cost around $600 to replace the mechanism. Had the device not broken on me unexpectectly, I likely would have traded it in and upgraded to the latest fold. It seems like Samsung has stagnated with the fold series since the Z Fold 3. None of the newer devices in this line are a compelling enough upgrade of my Z Fold 4 to justify dropping another $2K, so I'm going to stick with mine for another few years (if it lasts that long). Hopefully, Google and OnePlus (and possibly others) will improve their offerings by then.

View File

@@ -0,0 +1,13 @@
---
displayOrder: 5
url: "https://www.amazon.com/HIFIMAN-Ananda-Full-Size-Headphones-Comfortable/dp/B07DJ2ZBB3"
logo: "/assets/hardware/hifiman-ananda.jpg"
category: "Open-Back Headphones"
name: "HIFIMAN Ananda"
---
The audiophile hobby intrigued me, but I was put off by the insane prices on some of the higher end headphones (upwards of $1K). I decided to dip my toe in the water so to speak by looking at mid-range offerings and decided on the HIFIMAN Ananda. To my (untrained) ear, they sound fantastic and really enhance the music listening experience (even with imperfect music sources like Spotify).
I opted for the [Topping DX3 Pro+](https://www.toppingaudio.com/product-item/dx3-pro) DAC/AMP because it was relatively affordable, supported multiple I/O options, and looked nice on my desk.
The audio listening experience is an extremely personal one, so I would recommend trying out a couple different audiophile grade headphones at a store if at all possible. It will save you from agonizing over reviews and personal opinions on the internet for weeks (like I did) before making a decision.

View File

@@ -0,0 +1,15 @@
---
displayOrder: 4
url: "https://www.keychron.com/products/keychron-q1-pro-qmk-via-wireless-custom-mechanical-keyboard"
logo: "/assets/hardware/keychron_q1_pro.avif"
category: "Mechanical Keyboard"
name: "Kechron Q1 Pro"
---
I've always been interested in custom mechanical keyboards, but never enough to really dive into the hobby. I eventually decided to look into buying a pre-built base board with solid build quality, an option to connect wirelessly, media controls (e.g., volume knob), hot swappable switches, and keymapping software that works on Linux. After some searching, I came across the Keychron Q1 Pro, which is the wireless version of the much loved Keychron Q1.
I hadn't really tried any mechanical switches before, so I went with [Gateron Cap V2 - Brown](https://www.keychron.com/products/gateron-cap-switch-set?variant=40119285284953) which have a tactile bump, but aren't too loud. These are quiet enough to be used in an office setting or during a call while still being satisfying to type on. The switches definitely aren't as clicky as my old Razer Huntsman Elite, which I see as a plus.
Later, I was interested in linear switches. I started with the [Gateron Ink V2 - Black](https://www.keychron.com/products/gateron-ink-v2-switch-set?variant=40119300882521) which are on the heavier side, but are very satisfying to type on. On the recommendation of [Nathan Edwards at The Verge](https://www.theverge.com/24307425/black-friday-best-deals-tech-staff-picks-cyber-monday-2024), I picked up the [Kailh Deep Sea Silent Pro Box - Linear Islet](https://www.kailh.net/products/kailh-deep-sea-silent-pro-box-switch-set) on a Cyber Monday sale and have been using them ever since. They're smooth, quiet, and not nearly as heavy as the Ink Black switches.
For the keycaps, I started with [Cherry Profile Double-Shot PBT Full Set Keycaps - Player](https://www.keychron.com/products/cherry-profile-double-shot-pbt-full-set-keycaps-player) from Keychron. These look absolutely amazing, but I always wanted to match the [Dracula Themed](https://draculatheme.com) I use for all my software with a set of keycaps. Eventually, I found the [Developer - OEM Dye-Sub PBT](https://www.keychron.com/products/oem-dye-sub-pbt-full-set-keycap-set-developer?variant=40257780088921) keycaps in stock and absolutely love them.

View File

@@ -0,0 +1,13 @@
---
displayOrder: 1
url: "https://system76.com/laptops"
logo: "/assets/hardware/oryx-pro-7.png"
category: "Laptop"
name: "System76 Oryx Pro 7"
---
Around 2020, I was looking for a Linux laptop that I could use for development, general productivity, and gaming over the next couple of years. While I loved my old desktop and ultrabook laptop, I really wanted one device that could fill both roles. After doing some research, I landed on [System76](https://system76.com). They are a U.S. based company that specializes in selling Linux laptops, desktops, and servers. They also make their own Linux distribution in [Pop!_OS](https://pop.system76.com).
Of their available laptops, the Oryx Pro lineup seemed to be the best balance of portability, power, and hybrid graphics. The last point is especially important to me because I wanted to be able to extend battery life by turning off the discrete GPU when I didn't need it. I have seen many reports of poor customer service on [r/System76](https://www.reddit.com/r/System76) as of late, but take this with a grain of salt as the people who tend to be the most vocal about their experiences tend to be those with highly negative experiences.
Since my original purchase back in 2020, my needs have changed. I don't necessarily need or want a singular device to fill every role moving forward. The [Steam Deck](https://store.steampowered.com/steamdeck) and other gaming handhelds have proven that you can still get great gaming experiences on the go. When I eventually decide to upgrade, I'll probably get a less powerful laptop like those offered by [Framework](https://frame.work/) for on-the-go use and build a powerful desktop for home use.

View File

@@ -0,0 +1,11 @@
---
displayOrder: 6
url: "https://truthear.com/products/hexa"
logo: "/assets/hardware/truthear-hexa.jpeg"
category: "In-Ear Monitor"
name: "Truthear Hexa"
---
Like with the HIFIMAN Ananda, I wanted to improve my audio listening experience on the go as well. In-Ear Monitors (IEMs) can also get super expensive if that interests you, but I wanted a relatively cheap set that I wouldn't feel to bothered if I lost or accidentally damaged. In the sub $100 budget range, I chose the Truthear Hexa because they got almost universal praise for "breaking the IEM market" with their stellar performance for the price.
These don't strictly require a DAC/AMP depending on your source, but they certainly benefit from one. That's why I went for the [Qudelix 5K DAC/AMP](https://www.qudelix.com/blogs/5k-dac-amp). It's relatively cheap, powerful enough to drive even my HIFIMAN Anada, and can be used wired or wireless. It also supports Sony LDAC, so you can get extremely good sound quality even over Bluetooth.

View File

@@ -0,0 +1,11 @@
---
displayOrder: 3
url: "https://www.beeper.com"
logo: "/assets/software/logo-beeper.png"
category: "Instant Messaging"
name: "Beeper"
---
If you hate having to switch between messaging services to chat with people, you'll love [Beeper](https://www.beeper.com). It is a universal messaging app that acts as a bridge to your existing services like WhatsApp, Discord, SMS, etc. It works across mobile and desktop and offers a clean unified interface for all your chats.
Checkout their [GitHub](https://github.com/beeper) if you're curious about some of the technical details of how this works. tl;dr it's built on top of the [Matrix protocol](https://matrix.org/). You can even [self-host bridges](https://github.com/beeper/bridge-manager) if you're interested.

View File

@@ -0,0 +1,11 @@
---
displayOrder: 7
url: "https://bitwarden.com/"
logo: "/assets/software/logo-bitwarden.png"
category: "Password Manager"
name: "Bitwarden"
---
The most important feature of password managers is security. Bitwarden is open source, which means the source code, features, and infrastructure security are vetted and improved by a global community of cybersecurity experts. Additionally, all information stored in Bitwarden is end-to-end encrypted, so you can trust it with sensitive data like banking passwords, social security numbers, etc. I especially love that it offers its core features free for personal use, is available on all major platforms (including Linux), and can sync across devices. If you aren't using a password manager and don't want to pay a monthly or yearly subscription, I highly suggest that you give this a look.
I liked it so much that I opted for the [premium plan](https://bitwarden.com/pricing/) which offers an integrated 2-factor authenticator. For only $10 a year, I'm happy to support the project and get a couple extra features.

View File

@@ -0,0 +1,11 @@
---
displayOrder: 1
url: "https://github.com/doomemacs/doomemacs"
logo: "/assets/software/logo-emacs.png"
category: "IDE / Text Editor"
name: "Doom Emacs"
---
I originally tried Emacs because I had heard it is highly configurable and has amazing features like [Org Mode](https://orgmode.org) and [Magit](https://magit.vc). My initial impression was that it was extremely difficult to use due to its unintuitive design and high reliance on keybindings. After watching some videos by [System Crafters](https://www.youtube.com/c/SystemCrafters), I slowly picked up on these keybindings and how to go about configuring Emacs to my liking. I especially liked the [Emacs from Scratch](https://www.youtube.com/playlist?list=PLEoMzSkcN8oPH1au7H6B7bBJ4ZO7BXjSZ) series which helped me build up my [personal configuration](https://github.com/balajsra/emacs). After using this configuration for a couple months, I came to realize that there are just too many missing features and issues that I kept having to find resolutions for.
This is why I decided to switch to [Doom Emacs](https://github.com/hlissner/doom-emacs), which is a distribution of Emacs that comes pre-configured with stability, performance, and vim keybindings in mind. The [DoomCasts](https://www.youtube.com/playlist?list=PLhXZp00uXBk4np17N39WvB80zgxlZfVwj) series by [Zaiste Programming](https://www.youtube.com/c/ZaisteProgramming) provides a good introduction to Doom Emacs in video form. My experience with Doom so far has been great. It works a lot more like what I expected my personal Emacs configuration to be, but is much easier to use and configure. Startup time is significantly faster, editing files is faster, vim-like keybindings are already setup, and it is functional out of the box. You can checkout my Doom Emacs configuration on [GitHub](https://github.com/balajsra/doom-emacs-config). I have been using [Chemacs 2](https://github.com/plexus/chemacs2) to easily switch between my personal and Doom configurations so I can compare and make improvements.

View File

@@ -0,0 +1,17 @@
---
displayOrder: 3
url: "https://www.gentoo.org"
logo: "/assets/software/logo-gentoo.png"
category: "Operating System"
name: "Gentoo Linux"
---
I started my Linux journey with Ubuntu, which I was using for my college CS classes. I eventually got tired of Windows and migrated my personal computers to PopOS! for the better hardware compatibility and better GNOME-esque experience by default.
As with almost everyone who goes down the Linux rabbit hole, I eventually found my way to Arch and stuck with it for a few years until I tried Gentoo (based on a recommendation from someone I met at a [NoVaLUG](https://novalug.org) meeting).
With Gentoo, you get near complete control over your system (e.g., you can use init systems other than systemd if you so desire), a stable package update schedule (with the option to go "unstable" if desired), rolling release, and an amazing package manager (portage).
USE flags are probably its key selling point. You can enable/disable certain features in almost every package since you compile packages yourself (at least the ones that are open source). There are options to download binaries as well if you're limited on compute resources and/or time. It doesn't have the same community as the AUR in terms of package availability, but you can always write your own ebuilds for packages that don't exist in the main repo or community maintained ones like GURU.
I maintain a [personal overlay](https://github.com/balajsra/sravan-overlay) with ebuilds for packages I use.

View File

@@ -0,0 +1,17 @@
---
displayOrder: 2
url: "https://obsidian.md/"
logo: "/assets/software/logo-obsidian.png"
category: "Personal Knowledge Management"
name: "Obsidian"
---
[Notion](https://www.notion.com) was my previous favorite, but I started looking for alternatives due to the lack of an offline mode. The always online model has let me down a few times and I also didn't like the idea of handing over all of my data to a 3rd party company. Security and privacy are extremely important for personal notes.
When looking for alternatives, I was intrigued by the idea of having all my notes in plain-text. [Org mode for GNU Emacs](https://orgmode.org/) is an amazing solution, but it lacks the cross-platform support that I need. If you primarily write and use your notes on desktop, I definitely recommend Org mode.
The other obvious place to look was markdown based editors like [Logseq](https://logseq.com/) and [Obsidian](https://obsidian.md). I preferred Logseq for a time because it is completely open-source, unlike Obsidian. However, it structures all its notes as an outline rather than plain markdown that you can format however you choose. This lack of flexibility in the fundamental design finally led me to switch to Obsidian.
While not open-source, Obsidian is free for personal use. It has an amazing set of community plugins that extend the base functionality to include features like [task management](https://publish.obsidian.md/tasks/Introduction) that I use extensively. If having complete ownership over your notes is important to you, definitely give this a shot.
Obsidian does offer a paid [sync service](https://obsidian.md/sync) if you want to synchronize your notes across any device. However, since the notes are just plain-text, you can just as easily use [Git](https://github.com/Vinzent03/obsidian-git) or [Syncthing](https://syncthing.net) to do it yourself.

View File

@@ -0,0 +1,13 @@
---
displayOrder: 4
url: "https://pocketcasts.com"
logo: "/assets/software/logo-pocket-casts.png"
category: "Podcasts"
name: "Pocket Casts"
---
Pocket Casts is by far my favorite app for listening to podcasts. It has all the features you could ask for like automatically downloading new episodes and adding them to your queue, boosting the volume of dialogue, cutting out silence, and more! They support mobile apps, wearables, and a web player.
Unfortunately, they made the regrettable decision to switch from a one-time purchase to a subscription model. After backlash from the community, Pocket Casts partially reversed course by giving [lifetime Pocket Casts Plus access](https://support.pocketcasts.com/knowledge-base/lifetime-access-to-pocket-casts-plus/) to users who had previously purchased the web app (myself included). At the price of $9 prior to September 2019, this was an absolute steal.
While the base functionality in the mobile app is free, the new [subscription plans](https://pocketcasts.com/plans/#plans) which include access to the desktop and wearable apps (as well as some other nice features) come in at $40 or $80 per year. I can't necessarily recommend these subscription plans unless you listen to podcasts across multiple devices often enough to justify it.

View File

@@ -0,0 +1,13 @@
---
displayOrder: 5
url: "https://spotify.com"
logo: "/assets/software/logo-spotify.png"
category: "Music & Audiobooks"
name: "Spotify"
---
This is my preferred music app. I love having access to streaming music on all devices I use and integration with many smart home devices. Overall an excellent product and very reasonable prices, especially with the [student pricing plan](https://www.spotify.com/us/student).
In 2024, they increased the subscription price to $12 per month, but added 15 hours of audiobook listening time per month. I have been using this to make my way through the excellent [Witcher Audiobook series narrated by Peter Kenny](https://open.spotify.com/show/6vTRzKkZWCbPVQoMaUiDsz?si=8eca930e86854be3).
If you are interested in theming or adding more features to the spotify desktop app, check out [spicetify](https://spicetify.app).

View File

@@ -0,0 +1,9 @@
---
displayOrder: 6
url: "https://vivaldi.com/"
logo: "/assets/software/logo-vivaldi.png"
category: "Web Browser"
name: "Vivaldi"
---
After trying [Google Chrome](https://www.google.com/chrome), [Microsoft Edge](https://www.microsoft.com/en-us/edge), and [Brave](https://brave.com), I finally decided to go with [Vivaldi](https://vivaldi.com). It should be familiar to those coming from Chrome since it is also based on [Chromium](https://www.chromium.org). The main reason I like it is for its customizability. There are so many features available to the user like tab stacking and tiling that I find extremely helpful. If you are a browser power user such as myself, I think you will find it really hard to switch to another browser's tab management system. Vivaldi's is by far the best I have used. Additionally, most if not all Chrome extensions can be used with Vivaldi and it has built-in ad blocking and tracking prevention. Definitely recommend that you give it a try.

File diff suppressed because it is too large Load Diff

4
src/portfolio.md Normal file
View File

@@ -0,0 +1,4 @@
---
title: Portfolio
layout: "layouts/portfolio.html"
---

View File

@@ -0,0 +1,14 @@
---
displayOrder: 1
id: "umich-1"
url: "https://cse.engin.umich.edu"
logo: "/assets/education/logo-computer-science.jpg"
association: "University of Michigan"
entryTitle: "B.S.E. in Computer Science"
location: "Ann Arbor, MI"
startDate: "September 2016"
endDate: "December 2020"
---
**GPA:** 3.776
**Focus:** Intelligent Systems

View File

@@ -0,0 +1,14 @@
---
displayOrder: 2
id: "umich-2"
url: "https://me.engin.umich.edu"
logo: "/assets/education/logo-mechanical-engineering.jpg"
association: "University of Michigan"
entryTitle: "B.S.E. in Mechanical Engineering"
location: "Ann Arbor, MI"
startDate: "September 2016"
endDate: "December 2020"
---
**GPA:** 3.776
**Focus:** Controls

View File

@@ -0,0 +1,14 @@
---
displayOrder: 3
id: "umich-3"
url: "https://robotics.umich.edu"
logo: "/assets/education/logo-robotics.png"
association: "University of Michigan"
entryTitle: "M.S. in Robotics"
location: "Ann Arbor, MI"
startDate: "January 2021"
endDate: "December 2021"
---
**GPA:** 3.982
**Focus:** Acting

View File

@@ -0,0 +1,23 @@
---
associatedEntry: "hughes-1"
name: "Mobile Terminal Configuration Tool"
displayOrder: 1
---
**Problem**
Hughes sells mobile satellite terminals that provide internet and phone service to customers. Some customers who purchased terminals in bulk (~1000) required non-default settings. The configuration process of manually changing settings on each terminal was tedious and error-prone.
**Task**
My job was to develop a Windows 7 / 10 program that would automate the terminal configuration process.
**Result**
I designed and developed a GUI program in C# that detects which terminal model is connected and uses the available interface (<abbr title="REpresentational State Transfer">REST</abbr> <abbr title="Application Programming Interface">API</abbr> or <abbr title="File Transfer Protocol">FTP</abbr>) to copy the configuration of the *master* terminal. This can then be used to automatically configure subsequent terminals.
**Customer Feedback**
> "Btw the tool you sent us is helping a lot. Thank you so much."
>
> &mdash; <cite>Hughes Customer</cite>

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "hughes-1"
name: "Location Based Services"
displayOrder: 2
---
**Problem**
Hughes mobile terminals allow customers to have internet and phone access in remote areas via a satellite connection. Some customers may find value in a GPS feature built into the terminal. In this situation, the terminal would send GPS coordinates to a server at regular intervals of time, distance, and/or velocity as configured by the end-user.
**Task**
My task was to investigate a way to minimize the data packet size of GPS coordinates and to update the terminal's software to send these data packets to a server configured by the end-user.
**Result**
This project was assigned to me after the completion of my previous project, which was intended to last the entire internship. I was able to determine that <abbr title="MQ Telemetry Transport for Sensor Networks">[MQTT-SN](https://www.oasis-open.org/committees/document.php?document_id=66091&wg_abbrev=mqtt)</abbr> was a good option as it simply sends a data packet to a server without checking for acknowledgement and the packet header is sufficiently small. I successfully implemented the packet structure and delivery to the server on the terminal software written in C. However, I was unable to get the server to recognize that it received the packet in my remaining time at Hughes. Using [Wireshark](https://www.wireshark.org), I confirmed the reception of the packet, but none of the open-source <abbr title="MQ Telemetry Transport for Sensor Networks">[MQTT-SN](https://www.oasis-open.org/committees/document.php?document_id=66091&wg_abbrev=mqtt)</abbr> brokers I used worked.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "mitre-1"
name: "PNT Defense & Threat Library"
displayOrder: 1
---
**Problem**
The <abbr title="Positioning, Navigation, and Timing">PNT</abbr> Defense & Threat Library is a framework implemented in [Python](https://www.python.org) for mapping out and visualizing the space of <abbr title="Positioning, Navigation, and Timing">PNT</abbr> threats & defenses. The user specifies defenses (and which threats they mitigate) and threats as well as the relationships between entries.
**Task**
We wanted a way to identify implicit mitigation links without the user having to specify every single relationship.
**Result**
Implemented a function to parse the library, look through the directed acyclic graph structure, and identify which threats are mitigated by a subset of selected threats.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "mitre-1"
name: "PNT Assurance"
displayOrder: 2
---
**Problem**
To aid in <abbr title="Positioning, Navigation, and Timing">PNT</abbr> Assurance work, we wanted to mathematically model the <abbr title="Position, Velocity, and Time">PVT</abbr> output by <abbr title="Positioning, Navigation, and Timing">PNT</abbr> user equipment under different classes of threats with different parameters.
**Task**
My task was to help the team improve the [Julia](https://julialang.org) script that performs the monte carlo simulation.
**Result**
I revamped and formalized the team's software development process to improve visibility and organization. Rather than working on separate remote repositories, everyone works on the same remote, but uses separate branches. This makes it easier for everyone on the team to see changes and make comments in merge requests before changes make their way into the main branch. I also pushed for the use of issue tracking so discussions around new features and bugs can all be collected in one place. We can also make references to specific commits / branches / changes rather than having disjointed conversations with changing line numbers. Finally, I created a wiki documenting how to use git and some best practices.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "mitre-1"
name: "AI Learning Track"
displayOrder: 3
---
**Problem**
The AI Learning Track was the first of two intern events I participated in. This was an 8 hour hackathon (spread over 3 days) with a team of 5.
**Task**
The goal is to classify URLs as malicious or benign using URL strings and information on the age of the domain and when the site was last updated.
**Result**
Our team went through the steps of feature engineering, training, validation, and testing. We generated new features like the length of the URL string, number of non-alphanumeric symbols in the URL, etc. that we read were good indicators of malicious URLs. We ran our training dataset through several models: Logistic Regression (LOGIT), Linear Support Vector Machine, Random Forest, eXtreme Gradient Boosting Trees (XGBoost), and a Simple Feed Forward Neural Network (FFNN). We found that the FFNN performed best and we were able to achieve an F1 score of 0.94 on the testing dataset.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "mitre-1"
name: "AWS DeepRacer"
displayOrder: 4
---
**Problem**
<abbr title="Amazon Web Services">AWS</abbr> DeepRacer was the second of two intern events I participated in. This involved the use of cloud computing resources (provided by Amazon Web Services) to train and simulate a Reinforcement Learning model for an autonomous vehicle.
**Task**
The goal was to train a model that would allow the autonomous vehicle to drive around a simulated track as quickly as possible. You would receive time penalties for driving off track. The vehicles have a camera for sensing the environment and can drive at speeds of 0.5 - 1.75 m/s.
**Result**
The model I trained finished 3rd in the first two events (same track as training) and finished 2nd in the final event (a more difficult, unseen track). This may indicate that my model was more generalizable and less overfit to the track that I trained on.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "rivian-1"
name: "Requirements Management and System Diagrams"
displayOrder: 1
---
**Problem**
Rivian needed an organized way of tracking interfaces between components and managing requirements.
**Task**
My job was to create system architecture models to help distribute and track requirements from the vehicle level to component level. Additionally, these requirements needed to be managed and distributed via DOORS Next Generation.
**Result**
I was able to speak with managers of various vehicle subsystems to understand cross-system signal interfaces. These conversations were translated to system architecture models so teams could understand what signals they are consuming and outputting. To aid in cross-team communication, I created custom report templates in DOORS Next Generation.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "rivian-1"
name: "Simulation Data Analysis Tool"
displayOrder: 2
---
**Problem**
Rivian had collected simulation test data and needed to see the effect of changing vehicle parameters on performance metrics, without re-running expensive tests.
**Task**
My job was to develop a tool that could translate the collected data into a simple user interface to analyze how to optimize vehicle performance.
**Result**
I designed and developed a GUI program in Java that provided the user with sliders for the input vehicle parameters. The tool would then interpolate the performance metrics from the collected points using a neural network determined multi-variate function. The GUI tool then outputs plots showing the effect of changing each input on the projected performance output.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "rivian-2"
name: "Bill of Materials Analysis"
displayOrder: 1
---
**Problem**
Rivian had an existing process for analyzing bill of materials data that needed to be further developed and maintained.
**Task**
My job was to communicate with project management to determine and implement improvements to mass and cost analysis.
**Result**
I improved the existing Excel Macro to check for inconsistencies between parent and child items so mass and cost was not double counted. Additionally, improved the user interface by adding macro buttons to allow for quick filtering of pivot tables and highlight potential discrepancies.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "rivian-2"
name: "Internal Website"
displayOrder: 2
---
**Problem**
Requirements management in [JAMA](https://www.jamasoftware.com) was very much a manual process to check for inconsistent relationships between the different types of requirements.
**Task**
I proposed an automated system that would enforce relationships set by the systems engineering team and highlight issues that required manual intervention.
**Result**
I designed and implemented an internal-use website that collected and displayed data from business systems like [JAMA](https://www.jamasoftware.com). This made use of [JAMA](https://www.jamasoftware.com)'s <abbr title="REpresentational State Transfer">REST</abbr> <abbr title="Application Programming Interface">API</abbr> to automatically pull requirements metadata and enforce the determined relational rules. Additionally integrated Bill of Materials analysis macro into website so users would receive the processed spreadsheet via email. Front-end design was written in HTML and back-end scripts were written in [Python](https://www.python.org) using the [Django Web Framework](https://www.djangoproject.com).

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "rivian-2"
name: "IT Service Desk"
displayOrder: 3
---
**Problem**
Rivian's previous IT service desk in [KACE Systems Management](https://www.quest.com/products/kace-systems-management-appliance) had issues tracking the status of tickets resulting in an <abbr title="Service-level agreement">SLA</abbr> met percentage of ~75%.
**Task**
My job was to migrate the IT service desk to [Jira](https://www.atlassian.com/software/jira) and improve the ticket tracking process.
**Result**
I created custom automation rules to assign tickets based on request type and location. Created queues and reports to track response time, workload, request types, and other metrics. These efforts resulted in an <abbr title="Service-level agreement">SLA</abbr> met percentage of ~95%.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "rivian-3"
name: "Model-In-Loop Test Case Generation"
displayOrder: 1
---
**Problem**
Existing software components needed to be tested to ensure that requirements were being met.
**Task**
My job was to translate software component requirements into Model-in-Loop unit tests in Simulink.
**Result**
Created Model-in-Loop test cases for ~50 requirements using [Simulink Test](https://www.mathworks.com/products/simulink-test.html). I was able to identify and resolve 7 issues at the model level to prevent them from reaching in-vehicle testing. To improve testing, I created a script to automatically run all test cases and generate a report for easy identification of issues. Also created documentation in [Confluence](https://www.atlassian.com/software/confluence) to streamline future test case generation.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "rivian-3"
name: "Simulink Software Integration"
displayOrder: 2
---
**Problem**
Co-worker had developed a new algorithm that needed to be integrated into the Simulink environment for controls software.
**Task**
My job was to communicate with my co-worker to implement the algorithm using the existing signals, processing them, and resolving issues related to [Simulink Coder](https://www.mathworks.com/products/simulink-coder.html) C/C++ code generation.
**Result**
I was able to identify and suggest modifications to the algorithm to work within the limitations of [Simulink Coder](https://www.mathworks.com/products/simulink-coder.html). Learned about embedded systems, computing limitations, and how to increase software efficiency to prevent processing time delay.

View File

@@ -0,0 +1,17 @@
---
associatedEntry: "rivian-3"
name: "Testing Data Processing"
displayOrder: 3
---
**Problem**
Vehicle testing data needed to be processed to evaluate performance against requirements and determine controls parameters to tune.
**Task**
My job was to modify existing data processing scripts to work with new test data.
**Result**
I was able to map the signals from new test data logs to work with the existing scripts and manually calculate intermediate signals that were not recorded. This allowed me to generate plots that could easily be compared to previous test runs. From these plots, I identified potential issues that could be investigated by the controls team.

View File

@@ -0,0 +1,11 @@
---
associatedEntry: "umich-1"
name: "Notable Courses"
displayOrder: 1
---
- **EECS 442** - Computer Vision
- **EECS 445** - Introduction to Machine Learning
- **EECS 467** - Autonomous Robotics
- **EECS 492** - Introduction to Artificial Intelligence
- **EECS 493** - User Interface Development

Some files were not shown because too many files have changed in this diff Show More