This commit is contained in:
2024-06-24 00:15:38 -04:00
parent 2cc88cdf72
commit 323e9474f9
28 changed files with 632 additions and 573 deletions

View File

@@ -11,6 +11,7 @@
"@testing-library/react": "^13.0.0",
"@testing-library/user-event": "^13.2.1",
"bootstrap": "^5.1.3",
"prettier": "^3.3.2",
"react": "^18.1.0",
"react-bootstrap": "^2.3.1",
"react-dom": "^18.1.0",

View File

@@ -1,7 +1,6 @@
<!DOCTYPE html>
<!doctype html>
<html lang="en">
<head>
<head>
<meta charset="utf-8" />
<link rel="icon" href="favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
@@ -22,9 +21,9 @@
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>Aman Tahiliani</title>
</head>
</head>
<body>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
@@ -37,6 +36,5 @@
To begin the development, run `npm start` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</body>
</html>

View File

@@ -1 +1,19 @@
{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"}
{
"name": "",
"short_name": "",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

View File

@@ -1,74 +1,74 @@
.App {
text-align: center;
background-color: black;
position: absolute;
top: 0px;
right: 0px;
left: 0px;
font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
color: azure;
overflow: hidden
}
.App {
text-align: center;
background-color: black;
position: absolute;
top: 0px;
right: 0px;
left: 0px;
font-family: "Gill Sans", "Gill Sans MT", Calibri, "Trebuchet MS", sans-serif;
color: azure;
overflow: hidden;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
.App-logo {
height: 40vmin;
pointer-events: none;
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
@media (prefers-reduced-motion: no-preference) {
.App-logo {
animation: App-logo-spin infinite 20s linear;
}
}
.App-header {
background-color: black;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-header {
background-color: black;
min-height: 100vh;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-size: calc(10px + 2vmin);
color: white;
}
.App-link {
color: #61dafb;
}
.App-link {
color: #61dafb;
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframes App-logo-spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
.About {
width: 100%;
position: absolute;
top: 120px;
bottom: 0px;
left: 0px;
right: 0px;
}
.About {
width: 100%;
position: absolute;
top: 120px;
bottom: 0px;
left: 0px;
right: 0px;
}
hr {
width: 70%;
margin-left: 15% !important;
margin-right: 15% !important;
border: 10px solid aquamarine;
}
hr {
width: 70%;
margin-left: 15% !important;
margin-right: 15% !important;
border: 10px solid aquamarine;
}
.publications {
margin-top: 230px;
}
.publications {
margin-top: 230px;
}
.slick-dots button:before {
color: grey !important;
}
.slick-dots button:before {
color: grey !important;
}
.slick-dots li.slick-active button:before {
color: White !important;
}
.slick-dots li.slick-active button:before {
color: White !important;
}

View File

@@ -9,29 +9,34 @@ import DevToolsComponent from "./components/devtools";
function App() {
return (
<div className="App" >
<div className="App">
<meta name="Aman Tahiliani's Portfolio"></meta>
<Header />
<hr></hr>
<About className ="About" id="About"/>
<About className="About" id="About" />
<div className="publications" id="Publications">
<h2 style={{color:"salmon", fontSize:"50px"}}><b>Publications</b></h2>
<SimpleSlider/>
<h2 style={{ color: "salmon", fontSize: "50px" }}>
<b>Publications</b>
</h2>
<SimpleSlider />
</div>
<div className="Experience" id="Experience">
<h2 style={{color:"salmon", fontSize:"50px", marginTop:"110px"}}><b>Experience</b></h2>
<Experience/>
<h2 style={{ color: "salmon", fontSize: "50px", marginTop: "110px" }}>
<b>Experience</b>
</h2>
<Experience />
</div>
<div className="DevTools" id="DevTools">
<h2 style={{color:"salmon", fontSize:"50px"}}><b>Dev Tools</b></h2>
<DevToolsComponent/>
<h2 style={{ color: "salmon", fontSize: "50px" }}>
<b>Dev Tools</b>
</h2>
<DevToolsComponent />
</div>
{/* <div className="Contact" id="Contact">
<h2 style={{color:"salmon", fontSize:"50px", marginTop:"60px"}}><b>Contact Me!</b></h2>
<Contact/>
</div> */}
</div>
);
}

View File

@@ -1,7 +1,7 @@
import { render, screen } from '@testing-library/react';
import App from './App';
import { render, screen } from "@testing-library/react";
import App from "./App";
test('renders learn react link', () => {
test("renders learn react link", () => {
render(<App />);
const linkElement = screen.getByText(/learn react/i);
expect(linkElement).toBeInTheDocument();

View File

@@ -31,10 +31,11 @@ class About extends Component {
<ul>
<li>
Currently working at <a href="https://rimidi.com/">Rimidi</a>,
a Software as a Service (SaaS) startup, full-time as a Software
Engineer with a special emphasis on data interoperabiltiy and
building a robust set of tools to enable secure flow of
sensitive patient health information across health systems.
a Software as a Service (SaaS) startup, full-time as a
Software Engineer with a special emphasis on data
interoperabiltiy and building a robust set of tools to enable
secure flow of sensitive patient health information across
health systems.
</li>
<li>
Graduated from Georgia Tech in 2024 with a Master's Of Science
@@ -63,7 +64,7 @@ class About extends Component {
href={resume}
style={{ color: "black", textDecoration: "none" }}
download="Aman_Tahiliani_Resume.pdf"
>
>
Resume
</a>
</button>

View File

@@ -3,27 +3,38 @@ import "bootstrap/dist/css/bootstrap.css";
// import { Row, Col} from "react-bootstrap";
import "../css/experience.css";
import ExperienceCard from "./experienceCard";
import experienceData from "../data/experience.json"
import experienceData from "../data/experience.json";
import InnovaccerLogo from "../media/logos/companies/innovaccerLogo.png";
import Medsupervision from "../media/logos/companies/logo.png"
import GeorgiaTech from "../media/logos/companies/GeorgiaTech.png"
import Rimidi from "../media/logos/companies/rimidi.png"
import Medsupervision from "../media/logos/companies/logo.png";
import GeorgiaTech from "../media/logos/companies/GeorgiaTech.png";
import Rimidi from "../media/logos/companies/rimidi.png";
const logos = {Innovaccer:InnovaccerLogo,Medsupervision:Medsupervision,"Georgia Tech":GeorgiaTech,Rimidi:Rimidi}
const logos = {
Innovaccer: InnovaccerLogo,
Medsupervision: Medsupervision,
"Georgia Tech": GeorgiaTech,
Rimidi: Rimidi,
};
class Experience extends Component {
render() {
return (
<div className="ExperienceComponent">
{experienceData.map(({company,title, points, term}) =>(
render() {
return (
<div className="ExperienceComponent">
{experienceData.map(({ company, title, points, term }) => (
<div>
<ExperienceCard company={company} title={title} points={points} photo={logos[company]} term={term}/>
<hr/>
<ExperienceCard
company={company}
title={title}
points={points}
photo={logos[company]}
term={term}
/>
<hr />
</div>
))}
</div>
);
}
</div>
);
}
}
export default Experience;
export default Experience;

View File

@@ -7,20 +7,20 @@ class Publication extends Component {
render() {
return (
<div className="publication-detail">
<h3>{this.props.title}</h3>
<h3>{this.props.title}</h3>
<Row>
<Col>Authors: {this.props.authors}</Col>
<Col>Authors: {this.props.authors}</Col>
</Row>
<Row>
<div>Publish Date: {this.props.publish_date}</div>
<div>Publish Date: {this.props.publish_date}</div>
</Row>
<div>Link: <a href={this.props.link}>{this.props.link}</a></div>
<br/>
<div style={{fontWeight:"bolder"}}>Abstract:</div>
<div>{this.props.abstract}</div>
<div>
Link: <a href={this.props.link}>{this.props.link}</a>
</div>
<br />
<div style={{ fontWeight: "bolder" }}>Abstract:</div>
<div>{this.props.abstract}</div>
</div>
);
}
}

View File

@@ -3,72 +3,70 @@ import "bootstrap/dist/css/bootstrap.css";
// import { Row, Col, TabContainer } from "react-bootstrap";
import "../css/contact.css";
function Contact() {
const [name, setName] = useState("");
const [organization, setOrganization] = useState("");
const [message, setMessage] = useState("");
const [popup, setPopup] = useState("");
function Contact () {
const [name, setName] = useState("");
const [organization, setOrganization] = useState("");
const [message, setMessage] = useState("");
const [popup, setPopup] = useState("");
let handleSubmit = async (e) => {
e.preventDefault();
try {
let res = await fetch("http://localhost:8000/sendMail", {
method: "POST",
body: JSON.stringify({
name: name,
organization: organization,
message: message,
}),
});
// let resJson = await res.json();
console.log(res.status)
if (res.status === 200) {
setName("");
setOrganization("");
setMessage("");
setPopup("Message sent successfully");
} else {
setPopup("Some error occured");
}
} catch (err) {
console.log(err);
let handleSubmit = async (e) => {
e.preventDefault();
try {
let res = await fetch("http://localhost:8000/sendMail", {
method: "POST",
body: JSON.stringify({
name: name,
organization: organization,
message: message,
}),
});
// let resJson = await res.json();
console.log(res.status);
if (res.status === 200) {
setName("");
setOrganization("");
setMessage("");
setPopup("Message sent successfully");
} else {
setPopup("Some error occured");
}
};
return (
<div>
<form onSubmit={handleSubmit}>
<input
type="text"
value={name}
placeholder="Name"
onChange={(e) => setName(e.target.value)}
required = "true"
/>
<br/>
<input
type="text"
value={organization}
placeholder="Organization"
onChange={(e) => setOrganization(e.target.value)}
/>
<br/>
<textarea
className="MessageBox"
type="textarea"
value={message}
placeholder="Message"
onChange={(e) => setMessage(e.target.value)}
required = "true"
/>
<br/>
<button type="submit">Send!</button>
<div className="popup">{popup ? <p>{popup}</p> : null}</div>
</form>
</div>
);
}
} catch (err) {
console.log(err);
}
};
return (
<div>
<form onSubmit={handleSubmit}>
<input
type="text"
value={name}
placeholder="Name"
onChange={(e) => setName(e.target.value)}
required="true"
/>
<br />
<input
type="text"
value={organization}
placeholder="Organization"
onChange={(e) => setOrganization(e.target.value)}
/>
<br />
<textarea
className="MessageBox"
type="textarea"
value={message}
placeholder="Message"
onChange={(e) => setMessage(e.target.value)}
required="true"
/>
<br />
<button type="submit">Send!</button>
<div className="popup">{popup ? <p>{popup}</p> : null}</div>
</form>
</div>
);
}
export default Contact;

View File

@@ -1,37 +1,34 @@
import React, { Component } from "react";
import PythonLogo from "../media/logos/languages/python-logo.png"
import JavaLogo from "../media/logos/languages/java-logo.png"
import CplusLogo from "../media/logos/languages/c++.png"
import JavaScriptLogo from "../media/logos/languages/JavaScript.webp"
import '../css/devtools.css'
import Languages from "../data/programmingLaguages.json"
import PythonLogo from "../media/logos/languages/python-logo.png";
import JavaLogo from "../media/logos/languages/java-logo.png";
import CplusLogo from "../media/logos/languages/c++.png";
import JavaScriptLogo from "../media/logos/languages/JavaScript.webp";
import "../css/devtools.css";
import Languages from "../data/programmingLaguages.json";
const logos = {
"Python":PythonLogo,
"Java":JavaLogo,
"C++":CplusLogo,
"JavaScript": JavaScriptLogo
}
class DevToolsComponent extends Component {
render(){
return (
<div>
{/* <h2>Programming Languages</h2> */}
<div className="dev-tools-container">
{Languages.map(({name}) => (
<div className="dev-tool">
<img src={logos[name]} alt={name} className="dev-tool-logo" />
<h3>{name}</h3>
</div>
))}
</div>
</div>
);
}
Python: PythonLogo,
Java: JavaLogo,
"C++": CplusLogo,
JavaScript: JavaScriptLogo,
};
class DevToolsComponent extends Component {
render() {
return (
<div>
{/* <h2>Programming Languages</h2> */}
<div className="dev-tools-container">
{Languages.map(({ name }) => (
<div className="dev-tool">
<img src={logos[name]} alt={name} className="dev-tool-logo" />
<h3>{name}</h3>
</div>
))}
</div>
</div>
);
}
}
export default DevToolsComponent;

View File

@@ -6,48 +6,47 @@ import "../css/experience.css";
class ExperienceCard extends Component {
render() {
return (
<div className="experience-detail" style={{marginTop:"30px", marginBottom:"30px"}}>
<Row>
<Col xs={12} md={5} className="Company1">
<img src={this.props.photo} className="Company-Image"/>
{/* <h3 className="Company">{this.props.company}</h3> */}
<h4>({this.props.term})</h4>
</Col>
<Col xs={12} md={7} >
<div className="experience-details">
<h3 className="JobTitle">{this.props.title}</h3>
<hr/>
<div>
<ul>
{this.props.points.map((item,i) =>(
<li>{item}</li>
))}
</ul>
</div>
</div>
</Col>
</Row>
<div
className="experience-detail"
style={{ marginTop: "30px", marginBottom: "30px" }}
>
<Row>
<Col xs={12} md={5} className="Company1">
<img src={this.props.photo} className="Company-Image" />
{/* <h3 className="Company">{this.props.company}</h3> */}
<h4>({this.props.term})</h4>
</Col>
<Col xs={12} md={7}>
<div className="experience-details">
<h3 className="JobTitle">{this.props.title}</h3>
<hr />
<div>
<ul>
{this.props.points.map((item, i) => (
<li>{item}</li>
))}
</ul>
</div>
</div>
</Col>
</Row>
</div>
</div>
// <div className="experience-detail">
// <h3>{this.props.title}</h3>
// <Row>
// <Col>Authors: {this.props.authors}</Col>
// </Row>
// <Row>
// <div>Publish Date: {this.props.publish_date}</div>
// </Row>
// <div>
// Link: <a href={this.props.link}>{this.props.link}</a>
// </div>
// <br />
// <div style={{ fontWeight: "bolder" }}>Abstract:</div>
// <div>{this.props.abstract}</div>
// </div>
// <div className="experience-detail">
// <h3>{this.props.title}</h3>
// <Row>
// <Col>Authors: {this.props.authors}</Col>
// </Row>
// <Row>
// <div>Publish Date: {this.props.publish_date}</div>
// </Row>
// <div>
// Link: <a href={this.props.link}>{this.props.link}</a>
// </div>
// <br />
// <div style={{ fontWeight: "bolder" }}>Abstract:</div>
// <div>{this.props.abstract}</div>
// </div>
);
}
}

View File

@@ -1,12 +1,12 @@
import React, { Component } from "react";
import Slider from "react-slick";
import publicationData from "../data/publications.json"
import Publication from "./Publication";
import publicationData from "../data/publications.json";
import Publication from "./Publication";
import "slick-carousel/slick/slick.css";
import "slick-carousel/slick/slick-theme.css";
import {FaArrowAltCircleRight,FaArrowAltCircleLeft} from "react-icons/fa"
import { FaArrowAltCircleRight, FaArrowAltCircleLeft } from "react-icons/fa";
export default class SimpleSlider extends Component {
constructor(props) {
constructor(props) {
super(props);
this.next = this.next.bind(this);
this.previous = this.previous.bind(this);
@@ -26,16 +26,43 @@ export default class SimpleSlider extends Component {
slidesToScroll: 1,
};
return (
<div style={{height:"auto"}}>
<Slider ref={c => (this.slider = c)} {...settings}>
{publicationData.map(({title,authors, publish_date, abstract,link}) =>(
<Publication title={title} authors={authors} publish_date={publish_date} abstract={abstract} link={link}/>
))}
<div style={{ height: "auto" }}>
<Slider ref={(c) => (this.slider = c)} {...settings}>
{publicationData.map(
({ title, authors, publish_date, abstract, link }) => (
<Publication
title={title}
authors={authors}
publish_date={publish_date}
abstract={abstract}
link={link}
/>
),
)}
</Slider>
<div style={{ textAlign: "center"}}>
<FaArrowAltCircleLeft onClick={this.previous} style={{marginTop:"40px",marginBottom:"40px",borderRadius:"3em" ,fontSize:"40px", color:"aquamarine"}}/>
<div style={{ textAlign: "center" }}>
<FaArrowAltCircleLeft
onClick={this.previous}
style={{
marginTop: "40px",
marginBottom: "40px",
borderRadius: "3em",
fontSize: "40px",
color: "aquamarine",
}}
/>
<FaArrowAltCircleRight onClick={this.next} style={{marginTop:"40px", marginBottom:"40px", borderRadius:"3em",fontSize:"40px",marginLeft:"30px", color:"salmon"}}/>
<FaArrowAltCircleRight
onClick={this.next}
style={{
marginTop: "40px",
marginBottom: "40px",
borderRadius: "3em",
fontSize: "40px",
marginLeft: "30px",
color: "salmon",
}}
/>
</div>
</div>
);

View File

@@ -1,54 +1,54 @@
.AboutComponent {
opacity: 5;
width: 100%;
margin-top: 80px;
padding-top: 5.5%;
padding-bottom: 4%;
opacity: 5;
width: 100%;
margin-top: 80px;
padding-top: 5.5%;
padding-bottom: 4%;
}
h1 {
position: relative;
position: relative;
}
.NameImage {
height: 350px;
width: 350px;
border-radius: 5.7em;
border: 2px solid black;
height: 350px;
width: 350px;
border-radius: 5.7em;
border: 2px solid black;
}
.InfoColumn h2 {
color: rgb(5, 255, 180);
font-size: 40px;
color: rgb(5, 255, 180);
font-size: 40px;
}
.InfoColumn h3 {
margin-bottom: 30px;
color: salmon;
margin-bottom: 30px;
color: salmon;
}
ul {
list-style-position: inside;
list-style-position: inside;
}
li {
text-align: justify;
padding-left: 5%;
text-align: justify;
padding-left: 5%;
}
.InfoColumn {
padding-right: 5%;
padding-right: 5%;
}
li>a {
color: hotpink;
li > a {
color: hotpink;
}
.Info {
font-size: larger;
font-size: larger;
}
.Info li {
margin-top: 10px;
list-style-type: square;
margin-top: 10px;
list-style-type: square;
}

View File

@@ -1,44 +1,42 @@
input ,textarea {
background-color: black;
width: 35%;
height: 40px;
margin-top: 25px;
margin-bottom: 5px;
color: white;
/* padding-top: 5.5%;
input,
textarea {
background-color: black;
width: 35%;
height: 40px;
margin-top: 25px;
margin-bottom: 5px;
color: white;
/* padding-top: 5.5%;
padding-bottom: 4%; */
padding: auto;
padding-left: 15px;
border: none;
border-bottom: 2px solid aquamarine;
font-size: larger;
padding: auto;
padding-left: 15px;
border: none;
border-bottom: 2px solid aquamarine;
font-size: larger;
}
input[type=text]:focus {
border: none;
border-bottom: 3px solid salmon;
outline: none;
input[type="text"]:focus {
border: none;
border-bottom: 3px solid salmon;
outline: none;
}
.MessageBox{
height: auto;
display: inline-block;
/* text-overflow: ellipsis; */
.MessageBox {
height: auto;
display: inline-block;
/* text-overflow: ellipsis; */
}
.MessageBox[type=textarea]:focus {
border: 3px solid salmon;
outline: none;
.MessageBox[type="textarea"]:focus {
border: 3px solid salmon;
outline: none;
}
button{
margin-top: 20px;
margin-bottom: 30px;
border: 2px solid rgb(122, 224, 143);
color:darkblue;
border-radius: 0.8em ;
width: auto;
height: 40px;
font-size: larger;
font-weight:600;
background-color: rgb(5, 255, 180);
button {
margin-top: 20px;
margin-bottom: 30px;
border: 2px solid rgb(122, 224, 143);
color: darkblue;
border-radius: 0.8em;
width: auto;
height: 40px;
font-size: larger;
font-weight: 600;
background-color: rgb(5, 255, 180);
}

View File

@@ -1,55 +1,54 @@
.dev-tools-container {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}
display: flex;
flex-wrap: wrap;
justify-content: center;
align-items: center;
}
.dev-tool {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 20px;
margin-top: 20px;
animation: toolAnimation 0.5s ease-in-out;
width: 200px;
max-width: 100%;
text-align: center;
}
.dev-tool-logo {
width: 100px;
height: 100px;
border-radius: 50%;
object-fit: cover;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease-in-out;
}
.dev-tool-logo:hover {
transform: scale(1.1);
}
@keyframes toolAnimation {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@media screen and (max-width: 768px) {
.dev-tool {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 20px;
margin-top: 20px;
animation: toolAnimation 0.5s ease-in-out;
width: 200px;
max-width: 100%;
text-align: center;
width: 150px;
}
}
.dev-tool-logo {
width: 100px;
height: 100px;
border-radius: 50%;
object-fit: cover;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: transform 0.3s ease-in-out;
@media screen and (max-width: 480px) {
.dev-tool {
width: 120px;
}
.dev-tool-logo:hover {
transform: scale(1.1);
}
@keyframes toolAnimation {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@media screen and (max-width: 768px) {
.dev-tool {
width: 150px;
}
}
@media screen and (max-width: 480px) {
.dev-tool {
width: 120px;
}
}
}

View File

@@ -1,52 +1,52 @@
.ExperienceComponent {
opacity: 5;
margin-top: 60px;
padding-top: 20px;
padding-bottom: 3%;
margin-left: 4%;
margin-right: 4%;
opacity: 5;
margin-top: 60px;
padding-top: 20px;
padding-bottom: 3%;
margin-left: 4%;
margin-right: 4%;
}
.Company-Image {
width: 65%;
border: 3px solid #B5EAD7;
border-radius: 10px;
margin-bottom: 10%;
margin-top: 10%;
padding: 20px;
width: 65%;
border: 3px solid #b5ead7;
border-radius: 10px;
margin-bottom: 10%;
margin-top: 10%;
padding: 20px;
}
.Company {
font-size: 50px;
font-weight: bold;
font-style: normal;
color: lightyellow;
margin-bottom: 5%;
margin-top: 10%;
font-size: 50px;
font-weight: bold;
font-style: normal;
color: lightyellow;
margin-bottom: 5%;
margin-top: 10%;
}
li {
list-style-position: outside;
margin-bottom: 10px;
list-style-position: outside;
margin-bottom: 10px;
}
.Company1 {
margin-bottom: 20px;
margin-bottom: 20px;
}
.experience-details {
padding-left: 3%;
padding-top: 2%;
padding-right: 3%;
width: 90%;
border: 2px solid white;
border-radius: 15px;
margin-left: auto;
margin-right: auto;
padding-left: 3%;
padding-top: 2%;
padding-right: 3%;
width: 90%;
border: 2px solid white;
border-radius: 15px;
margin-left: auto;
margin-right: auto;
}
.JobTitle {
color: #baffc9;
font-weight: bold;
font-size: 30px;
color: #baffc9;
font-weight: bold;
font-size: 30px;
}

View File

@@ -1,45 +1,45 @@
.menu-header {
padding-left: 50px;
padding-right: 50px;
height: "50px";
margin-bottom: 40px;
padding-left: 50px;
padding-right: 50px;
height: "50px";
margin-bottom: 40px;
}
.navRow {
height: 100%;
margin-top: 40px;
line-height: 100%;
height: 100%;
margin-top: 40px;
line-height: 100%;
}
.NameCol {
font-size: xx-large;
font-weight: bold;
color: salmon;
font-style: italic;
font-size: xx-large;
font-weight: bold;
color: salmon;
font-style: italic;
}
.nonNameCol {
font-size: larger;
padding-top: 1%;
color: aquamarine;
font-size: larger;
padding-top: 1%;
color: aquamarine;
}
.header a:link {
text-decoration: none;
color: aquamarine;
text-decoration: none;
color: aquamarine;
}
.header a:visited {
text-decoration: none;
color: aquamarine;
text-decoration: none;
color: aquamarine;
}
.header a:hover {
text-decoration: none;
color: aquamarine;
text-decoration: none;
color: aquamarine;
}
.header a:active {
text-decoration: none;
color: aquamarine;
text-decoration: none;
color: aquamarine;
}

View File

@@ -1,41 +1,41 @@
table,
th,
td {
border-collapse: collapse;
border-collapse: collapse;
}
th,
td {
padding: 15px;
text-align: left;
padding: 15px;
text-align: left;
}
tr {
height: auto;
height: auto;
}
tr:hover {
background-color: salmon;
background-color: salmon;
}
.publication-detail {
padding: 30px;
margin: 40px;
border: 1px solid white;
border-radius: 2em;
white-space: normal;
overflow: auto;
text-overflow: ellipsis;
text-align: justify;
padding-left: 5%;
padding-right: 5%;
padding: 30px;
margin: 40px;
border: 1px solid white;
border-radius: 2em;
white-space: normal;
overflow: auto;
text-overflow: ellipsis;
text-align: justify;
padding-left: 5%;
padding-right: 5%;
}
.publication-detail h3 {
font-size: xx-large;
color: aquamarine;
font-size: xx-large;
color: aquamarine;
}
.publication-detail a {
color: aquamarine
color: aquamarine;
}

View File

@@ -1,61 +1,62 @@
[ {
[
{
"company": "Rimidi",
"title": "Software Engineer",
"points":[
"Building Interoperable Health data parsers in order to be able to ingest health information from any US Electronic Health Record systems and write information back to them.",
"Focused on upgrades to the existing Rimidi Infrastructure to aid with efforts towards containerization and integration of cloud-first architecture.",
"Owner of the Rimidify (Data interpretation) and EhrMes (Data Writeback) micro-services and domain expert on FHIR and HL7 specs."
"points": [
"Building Interoperable Health data parsers in order to be able to ingest health information from any US Electronic Health Record systems and write information back to them.",
"Focused on upgrades to the existing Rimidi Infrastructure to aid with efforts towards containerization and integration of cloud-first architecture.",
"Owner of the Rimidify (Data interpretation) and EhrMes (Data Writeback) micro-services and domain expert on FHIR and HL7 specs."
],
"term": "June 2024 - Present"
},
{
},
{
"company": "Georgia Tech",
"title": "Graduate Teaching Assistant (CS 6440)",
"points": [
"Working under the guidance of Dr. Jon Duke as a teaching assistant for his course CS-6440 Introduction to Health Informatics in Spring 2023 to mentor students about Healthcare IT, including technologies such as HL7 FHIR. Interoperability, Clinical Decision Support (CDS) and the use of LLMs in healthcare.",
"Helped students gain hands on experience with new healthcare technologies such as Hapi FHIR (R4), Mirth Connect, creation of SMART on FHIR applications and more using Python, Java, Docker and Heroku. ",
"Responsibilities include grading of student assignments and examinations for the first half of the semester and mentoring students for their course projects by guiding them on the scope and viability of their project."
"Working under the guidance of Dr. Jon Duke as a teaching assistant for his course CS-6440 Introduction to Health Informatics in Spring 2023 to mentor students about Healthcare IT, including technologies such as HL7 FHIR. Interoperability, Clinical Decision Support (CDS) and the use of LLMs in healthcare.",
"Helped students gain hands on experience with new healthcare technologies such as Hapi FHIR (R4), Mirth Connect, creation of SMART on FHIR applications and more using Python, Java, Docker and Heroku. ",
"Responsibilities include grading of student assignments and examinations for the first half of the semester and mentoring students for their course projects by guiding them on the scope and viability of their project."
],
"term": "Jan 2023 - Present"
},
{
"company": "Rimidi",
"title": "Software Engineering Intern",
"points": [
"Spearheaded the creation of a universal data-standardization microservice capable of processing patient health information, including smart-device and lab data from 7 EHRs (including Epic and Cerner) regardless of FHIR API variations (DSTU, STU3, and R4), facilitating a 30% improvement in patient data refresh times compared to the monolith.",
"Slashed 3+ hours of integration effort per week through enabling push-pull based tenant mapping sync functionality.",
"Championed code cleanliness and maintainability, achieving robust 94% test coverage and logging, guaranteeing efficiency and scalability for future growth"
],
"term": "May 2023 - Dec 2023"
},
{
"company": "Innovaccer",
"title": "Software Development Engineer Intern (Data Platform)",
"points": [
"Worked as part of the Data Activation Platform team to create and maintain FHIR enabling microservices responsible for parsing and standardizing healthcare data from different sources spanning different data formats such as HL7, CCLF, CCDA etc.",
"Developed the Aggregator Metrics microservice to collect metadata of time taken by DAP microservices to process data for each customer and source type and aggregating them into Snowflake tables in order to represent them in graphical manner.",
"Created a framework for reporting of success and failure metrics of Merge and Split jobs in EMPI (Enterprise Master Patient Index) service."
],
"term": "Feb 2022 - July 2022"
},
{
"company": "Innovaccer",
"title": "Summer Intern SDE (Backend- License Management)",
"points": [
"Created and maintained the backend for two platform level services, License Management and Platform Configuration, as one of three Backend engineers in a team of 9.",
"Maintained over 25 API endpoints using Django RestFramework and ported existing MongoDB collections to PostgreSQL.",
"Optimized a critical API endpoint by reducing the response time from 16 seconds down to under 3 using Redis Caching and bulk creation/updation."
],
"term": "May 2021 - August 2021"
},
{
"company": "Medsupervision",
"title": "Web Development Intern",
"points": [
"Created frontend views and components for the MEDSupervision healthcare platform as per design, using ReactJs framework",
"Designed the frontend as well as backend for a Medicine Comparison tool, which suggests alternate medicines containing same or similar salts, using Flask and React.",
"Optimized website load times."
],
"term": "Oct 2020 - April 2021"
}
},
{
"company": "Rimidi",
"title": "Software Engineering Intern",
"points": [
"Spearheaded the creation of a universal data-standardization microservice capable of processing patient health information, including smart-device and lab data from 7 EHRs (including Epic and Cerner) regardless of FHIR API variations (DSTU, STU3, and R4), facilitating a 30% improvement in patient data refresh times compared to the monolith.",
"Slashed 3+ hours of integration effort per week through enabling push-pull based tenant mapping sync functionality.",
"Championed code cleanliness and maintainability, achieving robust 94% test coverage and logging, guaranteeing efficiency and scalability for future growth"
],
"term": "May 2023 - Dec 2023"
},
{
"company": "Innovaccer",
"title": "Software Development Engineer Intern (Data Platform)",
"points": [
"Worked as part of the Data Activation Platform team to create and maintain FHIR enabling microservices responsible for parsing and standardizing healthcare data from different sources spanning different data formats such as HL7, CCLF, CCDA etc.",
"Developed the Aggregator Metrics microservice to collect metadata of time taken by DAP microservices to process data for each customer and source type and aggregating them into Snowflake tables in order to represent them in graphical manner.",
"Created a framework for reporting of success and failure metrics of Merge and Split jobs in EMPI (Enterprise Master Patient Index) service."
],
"term": "Feb 2022 - July 2022"
},
{
"company": "Innovaccer",
"title": "Summer Intern SDE (Backend- License Management)",
"points": [
"Created and maintained the backend for two platform level services, License Management and Platform Configuration, as one of three Backend engineers in a team of 9.",
"Maintained over 25 API endpoints using Django RestFramework and ported existing MongoDB collections to PostgreSQL.",
"Optimized a critical API endpoint by reducing the response time from 16 seconds down to under 3 using Redis Caching and bulk creation/updation."
],
"term": "May 2021 - August 2021"
},
{
"company": "Medsupervision",
"title": "Web Development Intern",
"points": [
"Created frontend views and components for the MEDSupervision healthcare platform as per design, using ReactJs framework",
"Designed the frontend as well as backend for a Medicine Comparison tool, which suggests alternate medicines containing same or similar salts, using Flask and React.",
"Optimized website load times."
],
"term": "Oct 2020 - April 2021"
}
]

View File

@@ -1,14 +1,14 @@
[
{
"name": "Python"
},
{
"name": "Java"
},
{
"name": "C++"
},
{
"name": "JavaScript"
}
]
{
"name": "Python"
},
{
"name": "Java"
},
{
"name": "C++"
},
{
"name": "JavaScript"
}
]

View File

@@ -1,29 +1,30 @@
[{
"title": "Framework for determining the suitability of blockchain: Criteria and issues to consider",
"authors": "Vikas Hassija, Sherali Zeadally, Ishan Jain, Aman Tahiliani, Vinay Chamola, Shashank Gupta",
"publish_date": "29 July 2021",
"abstract": "Various distributed ledger technologies (DLTs), such as blockchain, have evolved significantly in recent years. These technologies provide a robust and effective solution for providing confidentiality, integrity, nonrepudiation, authentication, and transparency. While blockchain has many advantages, it has various limitations as well, such as complexity, low throughput, privacy, and so on. We discuss the issues that must be considered when deciding whether to use these technologies in a given case or not. We describe the operation of blockchain, application areas where blockchain is suitable, and those where it is not. We also discuss the applicability of other emerging DLTs, apart from blockchain technology, such as Hashgraph, Zcash, Nano coin, and IOTA.",
"link": "https://onlinelibrary.wiley.com/doi/abs/10.1002/ett.4334"
},
{
"title": "Privacy-Preserving and Incentivized Contact Tracing for COVID-19 Using Blockchain",
"authors": "Naren, Aman Tahiliani, Vikas Hassija, Vinay Chamola, Salil S. Kanhere, Mohsen Guizani",
"publish_date": "27 September 2021",
"abstract": "Many countries across the world have not been entirely successful in their attempts to contain the spread of the COVID-19 virus, which has caused, quite possibly, one of the greatest disasters of the 21st century. A rich variety of contact tracing applications, each offering its own unique set of features, are currently being used to track the spread of the virus from person to person, and isolate/quarantine suspected individuals. However, existing approaches have not been very successful since they lack incentives to motivate users to use them actively. Although each solution provides some form of privacy protection and data security, loopholes do exist, and there is scope for improvement. In this context, we explore the use of blockchain to help in advancing contact tracing applications. In this article, we describe how blockchain could offer enhanced data security and functionality without compromising users' privacy. The effectiveness of contact tracing applications improves with the user base. In this regard, we explore how blockchain-based smart contracts can be used to offer incentives to users at various stages of the contact tracing process. Next, we lay down a plan for future contact tracing frameworks that provide the advantages of blockchain and user incentives, and all the best features available in current solutions.",
"link": "https://ieeexplore.ieee.org/abstract/document/9548968"
},
{
"title": "Machine Unlearning: Its Need and Implementation Strategies",
"authors": "Aman Tahiliani, Vikas Hassija, Vinay Chamola, Mohsen Guizani",
"publish_date": "05 August 2021",
"abstract": " Generally when users share information about themselves on some online platforms, they knowingly or unknowingly allow this data to be used by the companies behind these companies for various purposes including selling this information to advertisers as well as using it to better enrich their predictive models. In the event of the user changing their minds on allowing such data about them to be able to be used by the companies, it becomes a strenuous task for the companies to get rid of the influence of this collected data, especially when it has been used to train their machine learning models. Recent legislations by governing bodies, like the European Union, grant people the right to choose where data about them may be used, including a right to have their data and its resulting influence be completely removed from a companys databases and machine learning models. To be able to do this at scale new machine unlearning solutions need to be invented. In this paper, we look at some of these early models of machine unlearning strategies that have been proposed.",
"link": "https://dl.acm.org/doi/abs/10.1145/3474124.3474158"
},
{
"title": "A Solution to Evade Social Media Distraction",
"authors": " Aman Tahiliani, Adarsh Kumar Verma, Shubham Agrawal, Kavita Pandey",
"publish_date": "04 August 2022",
"abstract": " With the rapidly growing numbers of people who have access to a smartphone and an internet connection, the usage of these mobile devices, especially to consume content on social media has also seen a drastic increase. This was accelerated even more due to the pandemic. Such an increased screen time due to social media consumption has left many people feeling less productive, instead focusing on their screens even while at work. A common method people try in order to combat this problem is by deleting or disabling their social media accounts altogether. However, such a tactic more often than not is only a temporary fix as most of the people who try it revert back to their habits in less than a week, or, start feeling a common fear of missing out on their social media updates. In this paper we detail the negative effects of social media addiction, look at suggested methods of combating social media addiction and also propose a method to be able to keep up with the happenings of your social media without feeling the constant need to check their phones repeatedly.",
"link": "https://dl.acm.org/doi/abs/10.1145/3549206.3549298"
}
[
{
"title": "Framework for determining the suitability of blockchain: Criteria and issues to consider",
"authors": "Vikas Hassija, Sherali Zeadally, Ishan Jain, Aman Tahiliani, Vinay Chamola, Shashank Gupta",
"publish_date": "29 July 2021",
"abstract": "Various distributed ledger technologies (DLTs), such as blockchain, have evolved significantly in recent years. These technologies provide a robust and effective solution for providing confidentiality, integrity, nonrepudiation, authentication, and transparency. While blockchain has many advantages, it has various limitations as well, such as complexity, low throughput, privacy, and so on. We discuss the issues that must be considered when deciding whether to use these technologies in a given case or not. We describe the operation of blockchain, application areas where blockchain is suitable, and those where it is not. We also discuss the applicability of other emerging DLTs, apart from blockchain technology, such as Hashgraph, Zcash, Nano coin, and IOTA.",
"link": "https://onlinelibrary.wiley.com/doi/abs/10.1002/ett.4334"
},
{
"title": "Privacy-Preserving and Incentivized Contact Tracing for COVID-19 Using Blockchain",
"authors": "Naren, Aman Tahiliani, Vikas Hassija, Vinay Chamola, Salil S. Kanhere, Mohsen Guizani",
"publish_date": "27 September 2021",
"abstract": "Many countries across the world have not been entirely successful in their attempts to contain the spread of the COVID-19 virus, which has caused, quite possibly, one of the greatest disasters of the 21st century. A rich variety of contact tracing applications, each offering its own unique set of features, are currently being used to track the spread of the virus from person to person, and isolate/quarantine suspected individuals. However, existing approaches have not been very successful since they lack incentives to motivate users to use them actively. Although each solution provides some form of privacy protection and data security, loopholes do exist, and there is scope for improvement. In this context, we explore the use of blockchain to help in advancing contact tracing applications. In this article, we describe how blockchain could offer enhanced data security and functionality without compromising users' privacy. The effectiveness of contact tracing applications improves with the user base. In this regard, we explore how blockchain-based smart contracts can be used to offer incentives to users at various stages of the contact tracing process. Next, we lay down a plan for future contact tracing frameworks that provide the advantages of blockchain and user incentives, and all the best features available in current solutions.",
"link": "https://ieeexplore.ieee.org/abstract/document/9548968"
},
{
"title": "Machine Unlearning: Its Need and Implementation Strategies",
"authors": "Aman Tahiliani, Vikas Hassija, Vinay Chamola, Mohsen Guizani",
"publish_date": "05 August 2021",
"abstract": " Generally when users share information about themselves on some online platforms, they knowingly or unknowingly allow this data to be used by the companies behind these companies for various purposes including selling this information to advertisers as well as using it to better enrich their predictive models. In the event of the user changing their minds on allowing such data about them to be able to be used by the companies, it becomes a strenuous task for the companies to get rid of the influence of this collected data, especially when it has been used to train their machine learning models. Recent legislations by governing bodies, like the European Union, grant people the right to choose where data about them may be used, including a right to have their data and its resulting influence be completely removed from a companys databases and machine learning models. To be able to do this at scale new machine unlearning solutions need to be invented. In this paper, we look at some of these early models of machine unlearning strategies that have been proposed.",
"link": "https://dl.acm.org/doi/abs/10.1145/3474124.3474158"
},
{
"title": "A Solution to Evade Social Media Distraction",
"authors": " Aman Tahiliani, Adarsh Kumar Verma, Shubham Agrawal, Kavita Pandey",
"publish_date": "04 August 2022",
"abstract": " With the rapidly growing numbers of people who have access to a smartphone and an internet connection, the usage of these mobile devices, especially to consume content on social media has also seen a drastic increase. This was accelerated even more due to the pandemic. Such an increased screen time due to social media consumption has left many people feeling less productive, instead focusing on their screens even while at work. A common method people try in order to combat this problem is by deleting or disabling their social media accounts altogether. However, such a tactic more often than not is only a temporary fix as most of the people who try it revert back to their habits in less than a week, or, start feeling a common fear of missing out on their social media updates. In this paper we detail the negative effects of social media addiction, look at suggested methods of combating social media addiction and also propose a method to be able to keep up with the happenings of your social media without feeling the constant need to check their phones repeatedly.",
"link": "https://dl.acm.org/doi/abs/10.1145/3549206.3549298"
}
]

View File

@@ -1,13 +1,13 @@
body {
margin: 0;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
"Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
monospace;
}

View File

@@ -1,14 +1,14 @@
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import React from "react";
import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App";
import reportWebVitals from "./reportWebVitals";
const root = ReactDOM.createRoot(document.getElementById('root'));
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<React.StrictMode>
<App />
</React.StrictMode>
</React.StrictMode>,
);
// If you want to start measuring performance in your app, pass a function

View File

@@ -1,6 +1,6 @@
const reportWebVitals = onPerfEntry => {
const reportWebVitals = (onPerfEntry) => {
if (onPerfEntry && onPerfEntry instanceof Function) {
import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
getCLS(onPerfEntry);
getFID(onPerfEntry);
getFCP(onPerfEntry);

View File

@@ -2,4 +2,4 @@
// allows you to do things like:
// expect(element).toHaveTextContent(/react/i)
// learn more: https://github.com/testing-library/jest-dom
import '@testing-library/jest-dom';
import "@testing-library/jest-dom";

View File

@@ -1,2 +1,2 @@
import React from 'react';
import React from "react";
import "./App.css";

View File

@@ -7044,6 +7044,11 @@ prelude-ls@~1.1.2:
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
prettier@^3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.3.2.tgz#03ff86dc7c835f2d2559ee76876a3914cec4a90a"
integrity sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==
pretty-bytes@^5.3.0, pretty-bytes@^5.4.1:
version "5.6.0"
resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb"