Make portfolio + highlights a re-usable macro

- Use more generic metadata key names for portfolio
This commit is contained in:
Sravan Balaji
2025-01-02 17:06:27 -05:00
parent f612212911
commit 668a89a276
29 changed files with 153 additions and 164 deletions

View File

@@ -3,9 +3,9 @@ module.exports = function (eleventyConfig) {
eleventyConfig.addPassthroughCopy("./src/assets");
eleventyConfig.addPassthroughCopy("./src/scripts");
eleventyConfig.addFilter('findProjectAssociatedWithExperience', function (projects, associatedExperience) {
return projects.filter(function(project) {
return project.data.associatedExperience == associatedExperience;
eleventyConfig.addFilter('findAssociation', function (entries, associatedEntry) {
return entries.filter(function(entry) {
return entry.data.associatedEntry == associatedEntry;
});
})
@@ -15,18 +15,19 @@ module.exports = function (eleventyConfig) {
.sort((a, b) => (Number(a.data.displayOrder) < Number(b.data.displayOrder) ? 1 : -1));
});
eleventyConfig.addCollection('professionalExperienceProjects', (collection) => {
return collection
.getFilteredByGlob('./src/portfolio/professionalExperience/projects/*.md')
.sort((a, b) => (Number(a.data.displayOrder) > Number(b.data.displayOrder) ? 1 : -1));
});
eleventyConfig.addCollection('degrees', (collection) => {
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));
});
return {
markdownTemplateEngine: "njk",
dataTemplateEngine: "njk",

View File

@@ -7,4 +7,52 @@
</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"
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 %}

View File

@@ -2,26 +2,5 @@
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Education") }}
{% for degree in collections.degrees %}
<div class="row">
<div class="col-md-6">
<div class="row">
<div class="col-md-4">
<a href="{{ degree.data.degreeUrl }}" target="_blank">
<img
class="img-fluid mx-auto d-block"
src="{{ degree.data.degreeLogo }}"
/>
</a>
</div>
<div class="col-md-8">
<h2><b>{{ degree.data.schoolName }}</b></h2>
<h3>{{ degree.data.degreeName }}</h3>
<h4>{{ degree.data.schoolLocation }}</h4>
<h5><i>{{ degree.data.startDate }} - {{ degree.data.endDate }}</i></h5>
{{ degree.content | safe }}
</div>
</div>
</div>
</div>
{% endfor %}
{% from "macros.html" import portfolioWithHighlights %}
{{ portfolioWithHighlights(collections.education, collections.highlights) }}

View File

@@ -2,47 +2,5 @@
{% from "macros.html" import sectionHeading %}
{{ sectionHeading("Professional Experience") }}
{% for profExp in collections.professionalExperience %}
<div class="row">
<div class="col-md-6">
<div class="row">
<div class="col-md-4">
<a href="{{ profExp.data.companyUrl }}" target="_blank">
<img
class="img-fluid mx-auto d-block"
src="{{ profExp.data.companyLogo }}"
/>
</a>
</div>
<div class="col-md-8">
<h2><b>{{ profExp.data.companyName }}</b></h2>
<h3>{{ profExp.data.jobTitle }}</h3>
<h4>{{ profExp.data.workLocation }}</h4>
<h5><i>{{ profExp.data.startDate }} - {{ profExp.data.endDate }}</i></h5>
{{ profExp.content | safe }}
</div>
</div>
</div>
{% if collections.professionalExperienceProjects.length > 0 %}
<div class="col-md-6">
<div class="accordion accordion-flush" id="{{ profExp.data.id }}">
{% for project in (collections.professionalExperienceProjects | findProjectAssociatedWithExperience(profExp.data.id)) %}
{% set projectSlug = (profExp.data.id + '-' + project.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="#{{ projectSlug }}">
<b>{{ project.data.name }}</b>
</button>
</div>
<div id="{{ projectSlug }}" class="accordion-collapse collapse" data-bs-parent="#{{ profExp.data.id }}">
<div class="accordion-body">
{{ project.content | safe }}
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{% endif %}
</div>
{% endfor %}
{% from "macros.html" import portfolioWithHighlights %}
{{ portfolioWithHighlights(collections.professionalExperience, collections.highlights) }}

View File

@@ -1,10 +1,11 @@
---
displayOrder: 1
degreeUrl: "https://cse.engin.umich.edu"
degreeLogo: "/assets/education/logo-computer-science.jpg"
schoolName: "University of Michigan"
degreeName: "B.S.E. in Computer Science"
schoolLocation: "Ann Arbor, MI"
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"
---

View File

@@ -1,10 +1,11 @@
---
displayOrder: 2
degreeUrl: "https://me.engin.umich.edu"
degreeLogo: "/assets/education/logo-mechanical-engineering.jpg"
schoolName: "University of Michigan"
degreeName: "B.S.E. in Mechanical Engineering"
schoolLocation: "Ann Arbor, MI"
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"
---

View File

@@ -1,10 +1,11 @@
---
displayOrder: 3
degreeUrl: "https://robotics.umich.edu"
degreeLogo: "/assets/education/logo-robotics.png"
schoolName: "University of Michigan"
degreeName: "M.S. in Robotics"
schoolLocation: "Ann Arbor, MI"
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"
---

View File

@@ -1,5 +1,5 @@
---
associatedExperience: "hughes-1"
associatedEntry: "hughes-1"
name: "Mobile Terminal Configuration Tool"
displayOrder: 1
---
@@ -20,4 +20,4 @@ I designed and developed a GUI program in C# that detects which terminal model i
> "Btw the tool you sent us is helping a lot. Thank you so much."
>
> &mdash; <cite>Hughes Customer</cite>
> &mdash; <cite>Hughes Customer</cite>

View File

@@ -1,5 +1,5 @@
---
associatedExperience: "hughes-1"
associatedEntry: "hughes-1"
name: "Location Based Services"
displayOrder: 2
---
@@ -14,4 +14,4 @@ My task was to investigate a way to minimize the data packet size of GPS coordin
**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.
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

@@ -1,5 +1,5 @@
---
associatedExperience: "mitre-1"
associatedEntry: "mitre-1"
name: "PNT Defense & Threat Library"
displayOrder: 1
---
@@ -14,4 +14,4 @@ We wanted a way to identify implicit mitigation links without the user having to
**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.
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

@@ -1,5 +1,5 @@
---
associatedExperience: "mitre-1"
associatedEntry: "mitre-1"
name: "PNT Assurance"
displayOrder: 2
---
@@ -14,4 +14,4 @@ My task was to help the team improve the [Julia](https://julialang.org) script t
**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.
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

@@ -1,5 +1,5 @@
---
associatedExperience: "mitre-1"
associatedEntry: "mitre-1"
name: "AI Learning Track"
displayOrder: 3
---
@@ -14,4 +14,4 @@ The goal is to classify URLs as malicious or benign using URL strings and inform
**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.
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

@@ -1,5 +1,5 @@
---
associatedExperience: "mitre-1"
associatedEntry: "mitre-1"
name: "AWS DeepRacer"
displayOrder: 4
---
@@ -14,4 +14,4 @@ The goal was to train a model that would allow the autonomous vehicle to drive a
**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.
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

@@ -1,5 +1,5 @@
---
associatedExperience: "rivian-1"
associatedEntry: "rivian-1"
name: "Requirements Management and System Diagrams"
displayOrder: 1
---
@@ -14,4 +14,4 @@ My job was to create system architecture models to help distribute and track req
**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.
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

@@ -1,5 +1,5 @@
---
associatedExperience: "rivian-1"
associatedEntry: "rivian-1"
name: "Simulation Data Analysis Tool"
displayOrder: 2
---
@@ -14,4 +14,4 @@ My job was to develop a tool that could translate the collected data into a simp
**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.
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

@@ -1,5 +1,5 @@
---
associatedExperience: "rivian-2"
associatedEntry: "rivian-2"
name: "Bill of Materials Analysis"
displayOrder: 1
---
@@ -14,4 +14,4 @@ My job was to communicate with project management to determine and implement imp
**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.
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

@@ -1,5 +1,5 @@
---
associatedExperience: "rivian-2"
associatedEntry: "rivian-2"
name: "Internal Website"
displayOrder: 2
---

View File

@@ -1,5 +1,5 @@
---
associatedExperience: "rivian-2"
associatedEntry: "rivian-2"
name: "IT Service Desk"
displayOrder: 3
---

View File

@@ -1,5 +1,5 @@
---
associatedExperience: "rivian-3"
associatedEntry: "rivian-3"
name: "Model-In-Loop Test Case Generation"
displayOrder: 1
---

View File

@@ -1,5 +1,5 @@
---
associatedExperience: "rivian-3"
associatedEntry: "rivian-3"
name: "Simulink Software Integration"
displayOrder: 2
---

View File

@@ -1,5 +1,5 @@
---
associatedExperience: "rivian-3"
associatedEntry: "rivian-3"
name: "Testing Data Processing"
displayOrder: 3
---

View File

@@ -1,11 +1,11 @@
---
displayOrder: 3
id: "hughes-1"
companyUrl: "https://www.hughes.com"
companyLogo: "/assets/professional_experience/logo-hughes.jpg"
companyName: "Hughes Network Systems"
jobTitle: "Software Development Intern"
workLocation: "San Diego, CA"
url: "https://www.hughes.com"
logo: "/assets/professional_experience/logo-hughes.jpg"
association: "Hughes Network Systems"
entryTitle: "Software Development Intern"
location: "San Diego, CA"
startDate: "May 20, 2019"
endDate: "August 23, 2019"
---
@@ -24,4 +24,4 @@ endDate: "August 23, 2019"
- Public Presentation
- Design Documentation
- Professional Communication
- Professional Communication

View File

@@ -1,10 +1,11 @@
---
displayOrder: 8
companyUrl: "https://www.metsci.com"
companyLogo: "/assets/professional_experience/logo-metron.jpeg"
companyName: "Metron"
jobTitle: "Software Engineer I"
workLocation: "Reston, VA"
id: "metron-1"
url: "https://www.metsci.com"
logo: "/assets/professional_experience/logo-metron.jpeg"
assocation: "Metron"
entryTitle: "Software Engineer I"
location: "Reston, VA"
startDate: "April 3, 2023"
endDate: "Present"
---
---

View File

@@ -1,11 +1,11 @@
---
displayOrder: 5
id: "mitre-1"
companyUrl: "https://www.mitre.org"
companyLogo: "/assets/professional_experience/logo-mitre.jpeg"
companyName: "MITRE"
jobTitle: "Graduate Navigation Intern"
workLocation: "Remote"
url: "https://www.mitre.org"
logo: "/assets/professional_experience/logo-mitre.jpeg"
association: "MITRE"
entryTitle: "Graduate Navigation Intern"
location: "Remote"
startDate: "May 10, 2021"
endDate: "August 20, 2021"
---
@@ -23,4 +23,4 @@ endDate: "August 20, 2021"
- Public Presentation
- Design Documentation
- Professional Communication
- Professional Communication

View File

@@ -1,11 +1,11 @@
---
displayOrder: 6
id: "mitre-2"
companyUrl: "https://www.mitre.org"
companyLogo: "/assets/professional_experience/logo-mitre.jpeg"
companyName: "MITRE"
jobTitle: "Associate Autonomous Systems Engineer"
workLocation: "McLean, VA"
url: "https://www.mitre.org"
logo: "/assets/professional_experience/logo-mitre.jpeg"
association: "MITRE"
entryTitle: "Associate Autonomous Systems Engineer"
location: "McLean, VA"
startDate: "January 31, 2022"
endDate: "September 12, 2022"
---
---

View File

@@ -1,12 +1,11 @@
---
displayOrder: 7
id: "mitre-3"
companyUrl: "https://www.mitre.org"
companyLogo: "/assets/professional_experience/logo-mitre.jpeg"
companyName: "MITRE"
jobTitle: "Intermediate Autonomous Systems Engineer"
workLocation: "McLean, VA"
url: "https://www.mitre.org"
logo: "/assets/professional_experience/logo-mitre.jpeg"
association: "MITRE"
entryTitle: "Intermediate Autonomous Systems Engineer"
location: "McLean, VA"
startDate: "September 12, 2022"
endDate: "March 31, 2023"
---
---

View File

@@ -1,11 +1,11 @@
---
displayOrder: 1
id: "rivian-1"
companyUrl: "https://rivian.com"
companyLogo: "/assets/professional_experience/logo-rivian.png"
companyName: "Rivian"
jobTitle: "Vehicle Integration Intern"
workLocation: "Livonia, MI"
url: "https://rivian.com"
logo: "/assets/professional_experience/logo-rivian.png"
association: "Rivian"
entryTitle: "Vehicle Integration Intern"
location: "Livonia, MI"
startDate: "May 30, 2017"
endDate: "August 25, 2017"
---
@@ -20,4 +20,4 @@ endDate: "August 25, 2017"
**Soft Skills**
- Design Documentation
- Professional Communication
- Professional Communication

View File

@@ -1,11 +1,11 @@
---
displayOrder: 2
id: "rivian-2"
companyUrl: "https://rivian.com"
companyLogo: "/assets/professional_experience/logo-rivian.png"
companyName: "Rivian"
jobTitle: "Business Technology Intern"
workLocation: "Plymouth, MI"
url: "https://rivian.com"
logo: "/assets/professional_experience/logo-rivian.png"
association: "Rivian"
entryTitle: "Business Technology Intern"
location: "Plymouth, MI"
startDate: "May 7, 2018"
endDate: "December 7, 2018"
---
@@ -22,4 +22,4 @@ endDate: "December 7, 2018"
- Stakeholder Interviews
- Design Documentation
- Professional Communication
- Professional Communication

View File

@@ -1,11 +1,11 @@
---
displayOrder: 4
id: "rivian-3"
companyUrl: "https://rivian.com"
companyLogo: "/assets/professional_experience/logo-rivian.png"
companyName: "Rivian"
jobTitle: "ADAS Controls Intern"
workLocation: "Remote"
url: "https://rivian.com"
logo: "/assets/professional_experience/logo-rivian.png"
association: "Rivian"
entryTitle: "ADAS Controls Intern"
location: "Remote"
startDate: "June 1, 2020"
endDate: "August 21, 2020"
---
@@ -20,4 +20,4 @@ endDate: "August 21, 2020"
- Public Presentation
- Design Documentation
- Professional Communication
- Professional Communication