Skip to content

Commit

Permalink
Commit with the template files.
Browse files Browse the repository at this point in the history
  • Loading branch information
nikhil-ravi committed Jan 8, 2024
1 parent 87b1ccd commit 1883a84
Show file tree
Hide file tree
Showing 9 changed files with 241 additions and 16 deletions.
61 changes: 61 additions & 0 deletions .github/workflows/build-resume.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: Build and Deploy Resume

on: push

permissions:
contents: write
packages: write

jobs:
build:
runs-on: ubuntu-latest
container: muggle7/resume:latest

steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Set TAG_NAME
id: set_tag_name
run: |
echo "TAG_NAME=v$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
shell: bash

- name: Build Private Resume
run: |
git config --global --add safe.directory /__w/resume/resume
mkdir -p output
make all BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) PRIVATIZE=false
- name: Create Tag
run: |
git tag ${{ env.TAG_NAME }}
git push origin ${{ env.TAG_NAME }}
- name: Create Private Release
id: create_private_release
uses: softprops/action-gh-release@v1
with:
files: output/*
tag_name: ${{ env.TAG_NAME }}

- name: Upload Private Release Asset
uses: softprops/action-gh-release@v1
with:
files: output/*
tag_name: ${{ env.TAG_NAME }}

# Now we build the public version and create a release on the nikhil-ravi/resume-public repo
- name: Build Public Resume
run: |
git config --global --add safe.directory /__w/resume/resume
mkdir -p output
make all BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) PRIVATIZE=true
- name: Create Public Release
env:
GITHUB_TOKEN: ${{ secrets.RELEASE_REPO_SECRET }}
run: |
git config --global user.email "nr337@cornell.edu"
git config --global user.name "Nikhil Ravi"
gh release create ${{ env.TAG_NAME }} --title ${{ env.TAG_NAME }} output/* -R ${{ env.PUBLIC_REPO_URL }}
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
output*/
*.log
11 changes: 11 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"emeraldwalk.runonsave": {
"commands": [
{
"match": "resume.md",
"isAsync": true,
"cmd": "make all BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) PRIVATIZE=false"
}
]
}
}
39 changes: 39 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# Convert Markdown (resume.md) to DOCX and PDF
# prerequisites(Mac): pandoc, basictex

RESUME = resume.md
OUTPUT_DIR = output

all: docx pdf

docx:
@mkdir -p $(OUTPUT_DIR)
pandoc $(RESUME) -o $(OUTPUT_DIR)/NikhilRavi_CV-$(BRANCH_NAME).docx \
--lua-filter filter.lua \
-M private=$(PRIVATIZE)

pdf:
@mkdir -p $(OUTPUT_DIR)
pandoc $(RESUME) -o $(OUTPUT_DIR)/NikhilRavi_CV-$(BRANCH_NAME).pdf \
--pdf-engine=xelatex \
--variable geometry:margin=0.5in \
--variable fontsize=8pt \
--variable documentclass=scrartcl \
--variable classoption=twoside \
--variable classoption=a4paper \
--variable lang=en \
--variable toc-depth=2 \
--variable toc-own-page=true \
--variable indent=true \
--pdf-engine-opt=--shell-escape \
--lua-filter filter.lua \
-V colorlinks=true \
-V linkcolor=blue \
-V urlcolor=blue \
-V toccolor=gray \
-M privatize=$(PRIVATIZE)

clean:
rm -rf $(OUTPUT_DIR)

.PHONY: all docx pdf clean
33 changes: 17 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,45 +13,43 @@ The public repository serves as a more accessible version of my resume. It omits

## Usage

For those who would like to implement a similar workflow, i.e., a private resume with all the information written completely in Markdown and exported to both PDF and DOCX formats using pandoc, and a public resume with information marked as private removed, then the contents of this repository should get you there.
For those interested in implementing a similar workflow—maintaining both a private resume with complete information and a public resume with sensitive details removed—follow these steps:

### Local development
1. Fork this repository and clone it to your local machine.

1. On Ubuntu, first install the dependencies (might need sudo):
2. Install the necessary dependencies (on Ubuntu):
```bash
apt-get update
apt-get install -y git make wget texlive-xetex
```
We also need to install pandoc. The latest version of pandoc is available at [jgm/pandoc](https://github.com/jgm/pandoc/releases). To install the latest version of pandoc, run the following commands:
Install Pandoc using the latest version available at [jgm/pandoc](https://github.com/jgm/pandoc/releases). Replace the version number in the commands below:
```bash
wget https://github.com/jgm/pandoc/releases/download/3.1.11.1/pandoc-3.1.11.1-1-amd64.deb
dpkg -i pandoc-3.1.11.1-1-amd64.deb
rm pandoc-3.1.11.1-1-amd64.deb # remove the downloaded file
```
Make sure to replace the version number in the above commands with the latest version of pandoc.

2. Edit the `resume.md` file to your liking. If you want to hide something in the public release, simply enclose that part of the text in HTML `span` tags with a class name of `privatize`:
3. Edit the `resume.md` file to your liking. To hide information in the public release, enclose that part of the text in HTML `span` tags with a class name of `privatize`:
```md
# Nikhil Ravi
New York, NY | <span class="privatize">1 (800) 800 8009 |</span> LinkedIn | GitHub
```
3. Then run:
4. Run t:
```bash
make all BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD) PRIVATIZE=true
```
- The BRANCH_NAME variable is used to name the output files.
- The PRIVATIZE variable is used to determine whether to include the phone number and email address in the output files.
- Set PRIVATE to true to remove the phone number and email address and generate the public version of the resume.
- Set PRIVATE to false to include the phone number and email address and generate the private version of the resume.
This will create the PDF and DOCX files in the `output` directory.

4. Once you are done editing, create two repositories, one private and the other public.
5. Provide `Read and Write` permissions to GitHub workflows under `Repository Settings > Actions > General > Workflow permissions`.
6. Create a Fine grained Personal Access Token under `Settings > Developer Settings > Personal access tokens > Fine-grained tokens` and provide it access to both the repositories and enable Read and Write permissions for `Actions` and `Contents`.
7. Add this token as a repository secret for the private repository under `Secrets and variables > Actions > Repository Secrets` and give it the name `RELEASE_REPO_SECRET`.
8. Add the url of the public repository as an environment variable unde `Secrets and variables > Actions > Repository Variables` and give it the name `PUBLIC_REPO_URL`.
9. Commit and push your changes to your private repository. This will start the workflow in `.github/workflows/build-resume.yml`, and release the private and public resumes on their respective repositories.
- The PRIVATIZE variable, when set to true, removes the information enclosed in the `span` tags with the `privatize` class name, generating the public version of the resume.
5. This will create the PDF and DOCX files in the `output` directory.
6. Once done editing, create two repositories, one private and the other public.
7. Enable GitHub Actions in the private repository and provide `Read and Write` permissions to GitHub workflows under Repository `Settings > Actions > General > Workflow permissions`.
8. Create a Fine-grained Personal Access Token under `Settings > Developer Settings > Personal access tokens > Fine-grained tokens` with access to both repositories. Enable `Read and Write` permissions for `Actions` and `Contents`.
9. Add this token as a repository secret for the private repository under `Secrets and variables > Actions > Repository Secrets` with the name `RELEASE_REPO_SECRET`.
10. Add the URL of the public repository as an environment variable under `Secrets and variables > Actions > Repository Variables` with the name `PUBLIC_REPO_URL`.
11. Commit and push your changes to the private repository. This will start the workflow in `.github/workflows/build-resume.yml`, and release the private and public resumes on their respective repositories.

### Auto compile on save with VS Code

Expand Down Expand Up @@ -79,3 +77,6 @@ Then push the image to Docker Hub:
docker compose push resume
```

## Acknowledgements

I used dunkbing's [resume](https://github.com/dunkbing/dunkbing) as a starting point for this project after seeing it on [Dev.to](https://dev.to/dunkbing/managing-my-resume-with-git-a-version-control-approach-7hk).
15 changes: 15 additions & 0 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# This Dockerfile is used to build a Docker image for generating a resume.
# It starts with the base Ubuntu image and installs the necessary dependencies.
# The image includes pandoc and make for document conversion and texlive-xetex for PDF generation.
# It also copies custom fonts into the container and updates the font cache.

FROM ubuntu

LABEL maintainer="muggle7 <email@bla.com>"

RUN apt-get update && apt-get install -y make git wget gh
RUN wget https://github.com/jgm/pandoc/releases/download/3.1.11.1/pandoc-3.1.11.1-1-amd64.deb \
&& dpkg -i pandoc-3.1.11.1-1-amd64.deb \
&& rm pandoc-3.1.11.1-1-amd64.deb
RUN DEBIAN_FRONTEND='noninteractive' apt-get install -y texlive-xetex \
&& rm -rf /var/lib/apt/lists/*
6 changes: 6 additions & 0 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
services:
resume:
image: muggle7/resume
build:
context: .
dockerfile: Dockerfile
19 changes: 19 additions & 0 deletions filter.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
-- Function: Pandoc
-- Description: This function is the entry point for the Pandoc filter. It checks
-- each span element in the document for the class 'privatize'. If the class is
-- found, the span is removed from the document if the privatize metadata is set
-- to true. Otherwise, the span is unwrapped and its contents are returned.
-- Parameters:
-- - doc: The Pandoc document to be processed.
function Pandoc (doc)
local privatize = doc.meta['privatize']
return doc:walk {
Span = function (span)
if span.classes:includes 'privatize' then
return privatize and
{} or -- otherwise return an empty list of elements
span.content -- unwrap the span, just return the contents
end
end
}
end
71 changes: 71 additions & 0 deletions resume.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Nikhil Ravi

New York, NY |
<span class="privatize">1 (800) 800 8009 | <bla@blab.com> |</span>
[nikhilravi.com](https://nikhilravi.com/) |
[linkedin.com/in/nikhil--ravi](https://www.linkedin.com/in/nikhil--ravi/) |
[github.com/nikhil-ravi](https://github.com/nikhil-ravi/)

------------------
Doctoral student with research experience in the design and implementation of robust and privacy-preserving optimization algorithms for complex networked dynamic systems, with a focus on fault-tolerance and differential privacy for energy systems. Advanced understanding of linear algebra, statistics, stochastic processes, optimization, and probability theory. Skilled in time-series predictive modeling, causal inference, and hypothetical testing. I am looking for quantitative research/data ML science roles in Spring 2025.

| **Skills** | **Projects** |
|:-------|:--------------|
|Python (NumPy, pandas, scikit‑learn, statsmodels, plot.ly, TensorFlow, PyTorch, Langchain, HuggingFace), Ray, JavaScript, React, Next.js, Matlab, GCP, Git, Postgres, SQL, MongoDb, Neo4J. | - [Chess-insights drawn from chess games of a player on Chess.com](https://chess.chowkabhara.com/overview) \
- [Roosevelt Island Senior Adult Center Events App](https://github.com/nikhil-ravi/cbn-ri-events/tree/main) \
- [LocalGPT: Private and context-aware Retrieval Augmented Generation (RAG)](https://github.com/nikhil-ravi/localGPT)\
- [FicRec: Personalized fanfiction recommendations using RAG](https://ficrec.nikhilravi.com/)\
- [LeetScrape: Elevate Your Coding Game with Offline LeetCode Mastery](https://leetscrape.chowkabhara.com/) \
- More on my [projects webpage](https://www.nikhilravi.com/projects) |

## Education

- **Ph.D. in Electrical and Computer Engineering**, *Cornell University*, New York, NY, August 2021 - May 2024 (expected)
- Minor in Applied Math and Computer Science
- *Research*: **Robust Privacy-preserving algorithms for energy systems**
- *GPA*: 3.97/4.0
- *Relevant Coursework*: Statistical ML, Applied Probability and Stochastic, Reinforcement Learning and Optimal Control, Distributed Optimization, Bayesian Methods in ML, Causal Learning, and Inference.
- **M.S. in Electrical and Computer Engineering**, *Cornell University*, New York, NY, August 2021 - May 2023
- **M.S. in Electrical Engineering**, *Arizona State University* - Tempe, AZ, August 2017 - August 2021
- Transferred to Cornell University with a 4.0/4.0 GPA and a Master's degree.
- *Thesis*: **Decentralized Optimization in Adversarial Environments**
- Received the 2021 Ira A. Fulton Schools of Engineering Graduate Fellowship.
- **B.E. in Electrical and Electronics Engineering**, *PES Institute of Technology*, Bangalore, India, August 2013 - May 2017
- Graduated with Distinction, First Class with a 9.9/10 GPA.
- Awarded the 2015 Indian Academy of Sciences Summer Research Fellowship.

## Research / Work Experience

- **Data Science Intern**, *Kevala, Inc.*, San Francisco, CA (Remote), May 2022 - August 2022
- Developed a deep reinforcement learning‑based tool on GCP Vertex AI to maximize batteries and plug‑in electric vehicles’ electricity price arbitrage value via charge schedule optimization, based on electricity price, solar irradiation, and load forecasts.
- Developed a methodology to estimate carbon social prices for feeder‑level electricity generation.
- Created data visualization dashboards using Streamlit, translating complex data sets into comprehensive visual representations.
- Researched and published an internal blog on the use of racial features in ML.
- **Graduate Research Assistant**, *Cornell University*, New York, NY, August 2021 - Present
- Played a central role in the execution of *Provable Anonymization of Grid Data for Cyberattack Detection*, a research initiative funded by the Department of Energy, as the primary student researcher.
- Oversaw data collection, analysis, and reporting, generating critical findings that significantly advanced the project's objectives.
- Led innovative research initiatives within the project, including the development of
- Differential private (DP) clustering algorithm for consumer classification and typical load shape generation,
- DP cyber-physical attack detection methodology for SCADA systems, and
- DP approach for inferring solar PV metadata and forecasting from large-scale consumer energy usage datasets.
- **Graduate Teaching Assistant**, *Cornell University*, New York, NY, August 2021 - Present
- ECE 5260: __Graph-Based Data Science for Networked Systems__, Fall 2021 \& Spring 2024
- ORIE 5380: __Optimization Methods__, Fall 2023
- CS 5356: __Building Startup Systems__, Spring 2023
- **Research Intern**, *Lawrence Berkeley National Laboratory*, Berkeley, CA (Remote), May 2021 – August 2021
- Developed a pipeline to ingest and clean large time‑series AMI data of an electric ISO’s consumers onto a PostgreSQL database.
- Designed algorithms to publish differentially private summary statistics about consumer energy data.
- **Graduate Research Assistant**, *Arizona State University*, Tempe, AZ, August 2017 - August 2021
- Designed the Electron Volt Exchange, a secure Hyperledger Fabric‑based distributed ledger for Transactive Energy.
- Developed gradient‑based edge‑cutting mechanisms to build Byzantine fault‑tolerant decentralized optimization algorithms.
- Designed an algorithm to infer socioeconomic preference from crowd movement dynamics data.
- Managed the SINE Lab’s compute resource cluster including VM management, networking, and administration.

## Selected Publications

- [**"Data Privacy for the Grid: Toward a Data Privacy Standard for Inverter-Based and Distributed Energy Resources"**](https://scholar.google.com/citations?view_op=view_citation&hl=en&user=Ka5q7nIAAAAJ&sortby=pubdate&citation_for_view=Ka5q7nIAAAAJ:UebtZRa9Y70C), IEEE Power and Energy Magazine (2023).
- [**"Differential Privacy for Class-based Data: A Practical Gaussian Mechanism,"**](https://ieeexplore.ieee.org/abstract/document/10160035) IEEE Transactions on Information Forensics and Security (2023).
- [**"Differentially Private K‑means Clustering Applied to Meter Data Analysis and Synthesis."**](https://ieeexplore.ieee.org/abstract/document/9799519) IEEE Transactions on Smart Grid (2022).
- [**"A secure distributed ledger for transactive energy: The Electron Volt Exchange (EVE) blockchain."**](https://www.sciencedirect.com/science/article/abs/pii/S0306261920316044) Applied Energy (2021).
- [**"Detection and Isolation of Adversaries in Decentralized Optimization for Non-Strongly Convex Objectives."**](https://www.sciencedirect.com/science/article/pii/S2405896319320385) IFAC Workshop on Distributed Estimation and Control in Networked Systems (2019).
- [**"A Case of Distributed Optimization in Adversarial Environment."**](https://ieeexplore.ieee.org/abstract/document/8683442) IEEE International Conference on Acoustics, Speech, and Signal Processing (ICASSP 2019).

0 comments on commit 1883a84

Please sign in to comment.