Compare commits
46 Commits
post-summe
...
eleventy-m
Author | SHA1 | Date | |
---|---|---|---|
|
3016fd8d5b | ||
|
6beea310df | ||
|
6f506c4273 | ||
|
32444ba72a | ||
|
6fd5369daf | ||
|
2d6be05eae | ||
|
a73d30d52f | ||
|
c08adab41c | ||
|
c8cf9dd738 | ||
|
041164f1d2 | ||
|
660c328c86 | ||
|
cd4e714cb6 | ||
|
df2d33e32a | ||
|
87ae00354d | ||
|
668a89a276 | ||
|
f612212911 | ||
|
914636e5fe | ||
|
3431132901 | ||
|
1798624bce | ||
|
40028ed830 | ||
|
6fe01ca1f8 | ||
|
a72c989a7d | ||
|
dd4671b7b8 | ||
|
46db1fd2e0 | ||
|
43157146e8 | ||
|
c4eaa3d82b | ||
|
c37990b434 | ||
|
be269cf9b5 | ||
|
b21d04854e | ||
|
2ebfb8ef48 | ||
|
fff17e62a1 | ||
|
6808d71ca5 | ||
|
91528d99a4 | ||
|
ceea34cb51 | ||
|
b94cfbdf76 | ||
|
255d6b1920 | ||
|
7fbedea388 | ||
|
f044b27a34 | ||
|
b10995bbef | ||
|
01298d0249 | ||
|
87f653243a | ||
|
d8cc6f8ef6 | ||
|
dbba94a679 | ||
|
2973477f69 | ||
|
942040d68b | ||
|
bc54bf81f7 |
25
.editorconfig
Normal 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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
@@ -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
@@ -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
5
package.json
Normal file
@@ -0,0 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"@11ty/eleventy": "latest"
|
||||
}
|
||||
}
|
28
src/_data/contact.json
Normal 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
@@ -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
@@ -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"
|
||||
}
|
38
src/_includes/layouts/about.html
Normal 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 %}
|
15
src/_includes/layouts/base.html
Normal 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>
|
14
src/_includes/layouts/home.html
Normal 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 %}
|
8
src/_includes/layouts/personal.html
Normal 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 %}
|
10
src/_includes/layouts/portfolio.html
Normal 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
@@ -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 %}
|
6
src/_includes/partials/education.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<!doctype html>
|
||||
{% from "macros.html" import sectionHeading %}
|
||||
{{ sectionHeading("Education") }}
|
||||
|
||||
{% from "macros.html" import portfolioWithHighlights %}
|
||||
{{ portfolioWithHighlights(collections.education, collections.highlights) }}
|
15
src/_includes/partials/footer.html
Normal 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 © {{ site.copyrightYear }} {{ site.author }} under
|
||||
<a
|
||||
rel="license"
|
||||
href="{{ site.licenseFile }}"
|
||||
target="_blank"
|
||||
>{{ site.licenseName }}</a>
|
||||
</small>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
6
src/_includes/partials/hardware.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<!doctype html>
|
||||
{% from "macros.html" import sectionHeading %}
|
||||
{{ sectionHeading("Hardware") }}
|
||||
|
||||
{% from "macros.html" import personalItems %}
|
||||
{{ personalItems(collections.hardware) }}
|
48
src/_includes/partials/navigation.html
Normal 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>
|
6
src/_includes/partials/professionalExperience.html
Normal 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) }}
|
3
src/_includes/partials/research.html
Normal file
@@ -0,0 +1,3 @@
|
||||
<!doctype html>
|
||||
{% from "macros.html" import sectionHeading %}
|
||||
{{ sectionHeading("Research") }}
|
16
src/_includes/partials/resume.html
Normal 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>
|
33
src/_includes/partials/site-head.html
Normal 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>
|
6
src/_includes/partials/software.html
Normal file
@@ -0,0 +1,6 @@
|
||||
<!doctype html>
|
||||
{% from "macros.html" import sectionHeading %}
|
||||
{{ sectionHeading("Software") }}
|
||||
|
||||
{% from "macros.html" import personalItems %}
|
||||
{{ personalItems(collections.software) }}
|
175
src/about.html
@@ -1,175 +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 graduated from the
|
||||
<a href="https://umich.edu" target="_blank"
|
||||
>University of Michigan</a
|
||||
>
|
||||
with 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. He was admitted to the
|
||||
<a href="https://umich.edu" target="_blank"
|
||||
>University of Michigan</a
|
||||
>
|
||||
<a href="https://robotics.umich.edu/" target="_blank"
|
||||
>Robotics Institute</a
|
||||
>
|
||||
for the Winter 2021 semester where he is currently pursuing an
|
||||
M.S. in Robotics with an expected graduation of 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 will be
|
||||
returning to
|
||||
<a href="https://www.mitre.org/" target="_blank">MITRE</a>
|
||||
as an Associate Autonomous Systems Engineer in late January 2022.
|
||||
</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, 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
@@ -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.
|
Before Width: | Height: | Size: 152 KiB After Width: | Height: | Size: 4.4 MiB |
Before Width: | Height: | Size: 576 KiB After Width: | Height: | Size: 796 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 33 KiB |
Before Width: | Height: | Size: 92 KiB |
BIN
src/assets/hardware/galaxy-watch5-pro.png
Normal file
After Width: | Height: | Size: 47 KiB |
BIN
src/assets/hardware/galaxy-z-fold-4.png
Normal file
After Width: | Height: | Size: 946 KiB |
BIN
src/assets/hardware/galaxy_buds2pro.png
Normal file
After Width: | Height: | Size: 428 KiB |
BIN
src/assets/hardware/hifiman-ananda.jpg
Normal file
After Width: | Height: | Size: 232 KiB |
BIN
src/assets/hardware/keychron_q1_pro.avif
Normal file
After Width: | Height: | Size: 99 KiB |
Before Width: | Height: | Size: 112 KiB |
BIN
src/assets/hardware/truthear-hexa.jpeg
Normal file
After Width: | Height: | Size: 127 KiB |
Before Width: | Height: | Size: 7.5 MiB |
Before Width: | Height: | Size: 43 KiB |
Before Width: | Height: | Size: 18 KiB |
BIN
src/assets/podcasts/decoder.jpg
Normal file
After Width: | Height: | Size: 106 KiB |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 82 KiB |
Before Width: | Height: | Size: 46 KiB |
Before Width: | Height: | Size: 28 KiB |
BIN
src/assets/podcasts/missed-apex.jpg
Normal file
After Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 84 KiB After Width: | Height: | Size: 61 KiB |
BIN
src/assets/professional_experience/logo-metron.jpeg
Normal file
After Width: | Height: | Size: 5.0 KiB |
Before Width: | Height: | Size: 68 KiB |
BIN
src/assets/software/logo-beeper.png
Normal file
After Width: | Height: | Size: 20 KiB |
BIN
src/assets/software/logo-bitwarden.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
src/assets/software/logo-emacs.png
Normal file
After Width: | Height: | Size: 153 KiB |
@@ -1,18 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;">
|
||||
<g id="Logo" transform="matrix(13.3662,0,0,13.3662,20.0535,18.5803)">
|
||||
<g id="Background-Circle" serif:id="Background Circle" transform="matrix(0.707107,0.707107,-0.707107,0.707107,36.0061,-14.8263)">
|
||||
<path d="M35.9,71.5C16.3,71.5 0.4,55.6 0.4,36C0.4,16.4 16.3,0.6 35.9,0.6C55.5,0.6 71.4,16.5 71.4,36.1C71.4,55.7 55.5,71.5 35.9,71.5Z" style="fill:url(#_Linear1);fill-rule:nonzero;stroke:white;stroke-width:2.5px;"/>
|
||||
</g>
|
||||
<g id="Lower-beard" serif:id="Lower beard" transform="matrix(0.0748156,0,0,0.0748156,-1.50032,-1.39009)">
|
||||
<path d="M503.642,629.673C527.496,629.947 576.943,631.918 581,640C594.482,666.859 531.448,825.299 503.284,841.639L503.282,843C502.598,843 501.881,842.874 501.133,842.629C500.391,842.874 499.679,843 499,843L498.998,841.659C470.575,825.433 406.168,666.87 419.745,640C423.831,631.913 474.528,629.944 498.642,629.673L498.642,629.638C499.424,629.64 500.255,629.644 501.132,629.65C502.017,629.644 502.855,629.64 503.642,629.638L503.642,629.673Z" style="fill:white;"/>
|
||||
</g>
|
||||
<g id="Upper-beard" serif:id="Upper beard" transform="matrix(0.0748156,0,0,0.0748156,-1.50032,-1.39009)">
|
||||
<path d="M498.733,357.203C547.473,355.78 574.716,313.221 627.233,336.042C700.337,367.808 723.258,456.308 806.959,474.341C838.428,481.121 857.323,456.253 877.092,437.581C883.524,431.506 893.049,418.562 896.807,419.813C900.441,421.022 900.267,433.842 898.85,440.69C896.129,453.836 892.451,467.441 884.685,478.393C874.137,493.269 860.132,505.776 845.238,516.299C802.136,546.753 740.569,558.817 688.631,557.703C652.806,556.934 612.989,546.685 579.942,534.342C549.791,523.08 533.28,483.381 498.234,482.887C463.111,483.381 446.563,523.08 416.345,534.342C383.226,546.685 343.32,556.934 307.416,557.703C255.363,558.817 193.659,546.753 150.461,516.299C135.535,505.776 121.498,493.269 110.927,478.393C103.144,467.441 99.458,453.836 96.731,440.69C95.311,433.842 95.136,421.022 98.778,419.813C102.545,418.562 112.091,431.506 118.537,437.581C138.35,456.253 157.286,481.121 188.826,474.341C272.712,456.308 295.684,367.808 368.949,336.042C421.583,313.221 449.854,355.78 498.733,357.203Z" style="fill:rgb(254,254,254);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
<defs>
|
||||
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(71,0,0,70.9,0.4,36.05)"><stop offset="0" style="stop-color:rgb(206,159,252);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(115,103,240);stop-opacity:1"/></linearGradient>
|
||||
</defs>
|
||||
</svg>
|
Before Width: | Height: | Size: 2.9 KiB |
BIN
src/assets/software/logo-gentoo.png
Normal file
After Width: | Height: | Size: 107 KiB |
Before Width: | Height: | Size: 23 KiB |
BIN
src/assets/software/logo-obsidian.png
Normal file
After Width: | Height: | Size: 137 KiB |
@@ -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 |
0
src/assets/software/logo-spotify.png
Executable file → Normal file
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 155 KiB |
@@ -26,7 +26,7 @@
|
||||
<h1>System76 Oryx Pro 7 Review</h1>
|
||||
|
||||
<!-- Author & Date/Time -->
|
||||
<p class="lead">Updated on August 27, 2021</p>
|
||||
<p class="lead">Updated on July 1, 2022</p>
|
||||
|
||||
<!-- Preview Image -->
|
||||
<div class="blog-cover">
|
||||
@@ -115,12 +115,12 @@
|
||||
|
||||
<h2><a name="upgradeability">Upgradeability</a></h2>
|
||||
<p>
|
||||
I ended up purchasing the Oryx Pro 7 with base memory and storage,
|
||||
then upgraded these components with parts I bought from Amazon. The
|
||||
upgrade experience was pretty good. Removing the bottom cover just
|
||||
involves removing a bunch of screws, nothing too difficult. I had a
|
||||
little trouble with this because one of the screws seemed to get
|
||||
stuck, but I eventually got it out. The
|
||||
I ended up purchasing the Oryx Pro 7 with base memory and storage in
|
||||
March of 2021, then upgraded these components with parts I bought
|
||||
from Amazon. The upgrade experience was pretty good. Removing the
|
||||
bottom cover just involves removing a bunch of screws, nothing too
|
||||
difficult. I had a little trouble with this because one of the
|
||||
screws seemed to get stuck, but I eventually got it out. The
|
||||
<a
|
||||
href="https://tech-docs.system76.com/models/oryp7/repairs.html"
|
||||
target="_blank"
|
||||
@@ -137,52 +137,26 @@
|
||||
>
|
||||
</h2>
|
||||
<p>
|
||||
Regarding OS, I initially tried to install Arch Linux with dwm like
|
||||
I had on my desktop, but found that switching between the graphics
|
||||
modes (i.e. Integrated, Hybrid, and Discrete) was just a nightmare.
|
||||
I tried installing
|
||||
<a
|
||||
href="https://aur.archlinux.org/packages/system76-power/"
|
||||
target="_blank"
|
||||
>System76 software through the AUR</a
|
||||
>, but could never get it working reliably. Additionally, the laptop
|
||||
speakers did not seem to work out of the box. I eventually got the
|
||||
audio working thanks to the
|
||||
<a
|
||||
href="https://wiki.archlinux.org/title/System76_Oryx_Pro#Audio"
|
||||
target="_blank"
|
||||
>solution in the ArchWiki</a
|
||||
>, but I ultimately decided to switch to Pop!_OS because of the
|
||||
graphics switching issue. The main change I made to the default
|
||||
Pop!_OS install process was to use
|
||||
<a
|
||||
href="https://btrfs.wiki.kernel.org/index.php/Main_Page"
|
||||
target="_blank"
|
||||
>btrfs</a
|
||||
>
|
||||
rather than the default (ext4 I think) so I could take snapshots and
|
||||
backup my data with
|
||||
<a href="https://github.com/teejee2008/timeshift" target="_blank"
|
||||
>Timeshift</a
|
||||
>.
|
||||
</p>
|
||||
<p>
|
||||
My experience with Pop!_OS was very positive. I'm really happy that
|
||||
System76 and Pop!_OS have come up with a good solution for
|
||||
switchable graphics. Being able to just click on the option in the
|
||||
GNOME menu is so useful. The window management in Pop!_OS's
|
||||
I initially decided to give
|
||||
<a href="https://pop.system76.com/" target="_blank">Pop!_OS</a> a
|
||||
chance since it came pre-installed on the Oryx Pro and was developed
|
||||
by System76. My experience was very positive. I'm really happy that
|
||||
System76 and Pop!_OS have come up with a good and reliable solution
|
||||
for switching between the integrated graphics and discrete NVIDIA
|
||||
graphics. Being able to just click on the option in the GNOME menu
|
||||
is so useful. The window management in Pop!_OS's
|
||||
<a href="https://github.com/pop-os/cosmic" target="_blank"
|
||||
>COSMIC</a
|
||||
>
|
||||
desktop environment is very good too. Coming from a standalone
|
||||
tiling window manager like dwm, this provides a pretty good balance
|
||||
between convenience and usability.
|
||||
tiling window manager like dwm, I found that this provides a pretty
|
||||
good balance between convenience and usability.
|
||||
</p>
|
||||
<p>
|
||||
After some more time with Pop!_OS, I realized that I really missed
|
||||
the package management, customizability, and rolling release of
|
||||
Arch. Since I couldn't get Arch working before, I decided to try
|
||||
some other Arch based distros like
|
||||
Arch. For the longest time, I couldn't get Arch working reliably, so
|
||||
I decided to try some other Arch based distros like
|
||||
<a href="https://manjaro.org/" target="_blank">Manjaro</a>
|
||||
and
|
||||
<a href="https://garudalinux.org/" target="_blank">Garuda</a>. With
|
||||
@@ -191,28 +165,96 @@
|
||||
href="https://aur.archlinux.org/packages/system76-power/"
|
||||
target="_blank"
|
||||
>system76-power AUR package</a
|
||||
>, now works. I eventually decided on Garuda because it implements a
|
||||
lot of the customizations I usually do in my vanilla Arch installs
|
||||
anyways (e.g. btrfs, zen kernel, chaotic-aur, backups w/ timeshift,
|
||||
easy options to enable gaming tweaks, etc.). The
|
||||
<a href="https://www.gnome.org/" target="_blank">GNOME</a>
|
||||
edition immediately ran into crashing and system break issues, so I
|
||||
tried the KDE Dragonized edition. It looks pretty nice and uses
|
||||
<a href="https://kde.org/plasma-desktop/" target="_blank"
|
||||
>KDE plasma</a
|
||||
>) works very well. I eventually decided on Garuda because it
|
||||
implements a lot of the customizations I usually do in my vanilla
|
||||
Arch installs anyways (e.g., btrfs, zen kernel, chaotic-aur, backups
|
||||
w/ timeshift, easy options to enable gaming tweaks, etc.).
|
||||
</p>
|
||||
<p>
|
||||
Later, I started noticing some issues with suspending and
|
||||
hibernating as well as switching graphics. I couldn't rely on my
|
||||
laptop to stay awake or suspend when I expected it to. Sometimes the
|
||||
computer would just freeze up randomly and I would need to hard
|
||||
reboot. It seemed that there was something interfering with the
|
||||
graphics card. This is when I noticed that the
|
||||
<a
|
||||
href="https://wiki.archlinux.org/title/System76_Oryx_Pro"
|
||||
target="_blank"
|
||||
>Oryx Pro ArchWiki page</a
|
||||
>
|
||||
instead of GNOME. After still encountered freezing issues, I
|
||||
switched to the
|
||||
<a href="https://i3wm.org/" target="_blank">i3</a>
|
||||
edition, but replaced i3 with
|
||||
<a href="https://xmonad.org/" target="_blank">Xmonad</a>
|
||||
because I was experimenting with it at the time. After realizing
|
||||
that Xmonad would not really fit my needs (mainly gaming), I
|
||||
replaced it with
|
||||
<a href="https://github.com/bakkeby/dwm-flexipatch" target="_blank"
|
||||
>dwm-flexipatch</a
|
||||
>. Now, performance is amazing and I haven't encountered the major
|
||||
freezing issues that I had with GNOME and KDE.
|
||||
had been updated and I noticed an
|
||||
<a
|
||||
href="https://github.com/pop-os/system76-power/issues/299"
|
||||
target="_blank"
|
||||
>issue on GitHub</a
|
||||
>. These finally led me to a stable install with Arch Linux.
|
||||
</p>
|
||||
<p>
|
||||
Install the following packages from the
|
||||
<a href="https://aur.archlinux.org/" target="_blank">AUR</a>:
|
||||
</p>
|
||||
<ul>
|
||||
<li>system76-dkms</li>
|
||||
<li>system76-acpi-dkms</li>
|
||||
<li>system76-io-dkms</li>
|
||||
<li>system76-driver</li>
|
||||
<li>system76-power</li>
|
||||
<li>system76-firmware-daemon</li>
|
||||
<li>system76-firmware</li>
|
||||
<li>firmware-manager</li>
|
||||
</ul>
|
||||
<p>
|
||||
Then add your user to the <code>adm</code> group and enable the
|
||||
following services:
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>sudo gpasswd -a $USER adm</code></li>
|
||||
<li><code>sudo systemctl enable --now system76</code></li>
|
||||
<li>
|
||||
<code>sudo systemctl enable --now system76-firmware-daemon</code>
|
||||
</li>
|
||||
<li>
|
||||
<code
|
||||
>sudo systemctl enable --now
|
||||
com.system76.PowerDaemon.service</code
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
Finally, disable the Power Profiles Daemon which was interfering
|
||||
with system76-power and enable the NVIDIA services for suspending
|
||||
(and optionally hibernating & resuming if you want that):
|
||||
</p>
|
||||
<ul>
|
||||
<li><code>sudo systemctl mask power-profiles-daemon</code></li>
|
||||
<li>
|
||||
<code
|
||||
>sudo systemctl enable nvidia-{suspend,resume,hibernate}</code
|
||||
>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
To get the speakers working, you will probably need to create a file
|
||||
called <code>/etc/modprobe.d/clevo-p950.conf</code> and put the
|
||||
following inside:
|
||||
<code>options snd-hda-intel model=clevo-p950</code>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
If you encounter any other issues, be sure to check out the
|
||||
<a
|
||||
href="https://wiki.archlinux.org/title/System76_Oryx_Pro"
|
||||
target="_blank"
|
||||
>Oryx Pro ArchWiki page</a
|
||||
>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Now your laptop should be able to run Arch with all the same
|
||||
graphics switching goodness and functional speakers of Pop!_OS
|
||||
without any of the random freezing or crashing!
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
@@ -239,11 +281,10 @@
|
||||
>.
|
||||
</li>
|
||||
<li>
|
||||
Gaming performance is amazing! Recently got Yakuza: Like a Dragon
|
||||
on Steam. It runs at around 70 to 80 fps with all the settings
|
||||
turned up to the max. I love that I can use my favorite operating
|
||||
system without having to compromise too much on gaming
|
||||
performance.
|
||||
Gaming performance is amazing! I can run Yakuza: Like a Dragon at
|
||||
around 70 or 80 fps with all the settings turned up to the max. I
|
||||
love that I can use my favorite operating system without having to
|
||||
compromise too much on gaming performance.
|
||||
</li>
|
||||
<li>
|
||||
Love the keyboard backlighting and color changing on the fly.
|
||||
@@ -278,8 +319,8 @@
|
||||
<li>
|
||||
Speakers are really sub-par. I understand that System76 doesn't
|
||||
design the hardware, but this was my main disappointment. I have
|
||||
bluetooth bookshelf speakers and bluetooth headphones I can use,
|
||||
so this isn't an unsolvable problem, but just generally annoying.
|
||||
external bookshelf speakers and bluetooth headphones I can use, so
|
||||
this isn't an unsolvable problem, but just generally annoying.
|
||||
</li>
|
||||
<li>
|
||||
Webcam is functional, but not good at all. Definitely need to use
|
||||
@@ -297,25 +338,14 @@
|
||||
Battery life is really bad when the discrete graphics card is on
|
||||
(as expected). Maybe a little more than an hour a time, sometimes
|
||||
more depending on how willing I am to lower CPU frequency and
|
||||
stuff. As a desktop replacement, that is to be expected through.
|
||||
stuff. As a desktop replacement type laptop, that is to be
|
||||
expected through.
|
||||
</li>
|
||||
<li>
|
||||
Mouse click buttons are not great. Regularly left click on
|
||||
something in GNOME and nothing happens. "Tapping" with the
|
||||
mousepad works very reliably though.
|
||||
</li>
|
||||
<li>
|
||||
Fans can get really loud at times, especially when gaming. I often
|
||||
have to turn up my speakers or wear noise cancelling headphones.
|
||||
This is an understandable limitation with gaming laptops though.
|
||||
Using a custom kernel solved a lot of my complaints with the
|
||||
thermals and fan noise though. Now the fans don't turn on as
|
||||
often. When they do, they don't ramp up to the maximum speed, so
|
||||
noise is kept to a reasonable level.
|
||||
</li>
|
||||
<li>
|
||||
Random freezing is kind of an issue, but is generally resolved by
|
||||
using a custom kernel.
|
||||
Fans can get really loud at times, especially when pushing the GPU
|
||||
in games. I often have to turn up my speakers or wear noise
|
||||
cancelling headphones. This is an understandable physical
|
||||
limitation of thin and light gaming laptops though.
|
||||
</li>
|
||||
<li>
|
||||
While the display itself is great, I really wish the hinge would
|
||||
@@ -330,16 +360,19 @@
|
||||
|
||||
<h2><a name="conclusions">Conclusions</a></h2>
|
||||
<p>
|
||||
It may seem that the cons outweigh the pros, but this is only in
|
||||
number and because I am really nitpicking. The things this laptop
|
||||
get right (e.g. gaming, refresh rate, switchable graphics, general
|
||||
performance) are much more important to me than the other things.
|
||||
Regarding price, you are definitely paying a premium for first-class
|
||||
linux support, but it is well worth it in my opinion. I do not want
|
||||
to use Windows anymore and I am happy to pay extra if it means
|
||||
supporting a company that promotes and sells Linux computers and
|
||||
having a device that can be easily upgraded down the line. Overall,
|
||||
I am very happy with my purchase.
|
||||
It may seem that the cons outweigh the pros, but this is only
|
||||
because I am really nitpicking. The things this laptop gets right
|
||||
(e.g., gaming, refresh rate, switchable graphics, general
|
||||
performance) are much more important to me than the other things
|
||||
(e.g., mic / webcam quality). Regarding price, you are definitely
|
||||
paying a premium for first-class linux support, but it is well worth
|
||||
it in my opinion. I do not want to use Windows anymore and I am
|
||||
happy to pay extra if it means supporting a company that promotes
|
||||
and sells Linux computers and having a device that can be easily
|
||||
upgraded down the line. Overall, I am very happy with my purchase.
|
||||
Especially now that I have a stable installation of Arch Linux that
|
||||
has all the functionality I expect without random freezing or
|
||||
crashing.
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
|
@@ -26,7 +26,7 @@
|
||||
<h1>Switching from Windows to Linux</h1>
|
||||
|
||||
<!-- Author & Date/Time -->
|
||||
<p class="lead">Updated on August 27, 2021</p>
|
||||
<p class="lead">Updated on July 1, 2022</p>
|
||||
|
||||
<!-- Preview Image -->
|
||||
<div class="blog-cover">
|
||||
@@ -62,11 +62,11 @@
|
||||
<p>
|
||||
Development is definitely where Linux shines because of its superior
|
||||
package management. For example, Ubuntu (and its derivatives) use
|
||||
the apt package manager which allows you to easily install most
|
||||
development packages like Python, gcc, Git, etc. On Windows, you
|
||||
have to go to a website, click on a download link, run an
|
||||
executable, and walk through the steps in an installer. On Linux, it
|
||||
is as simple as a couple terminal commands. There's a reason even
|
||||
the <code>apt</code> package manager which allows you to easily
|
||||
install most development packages like Python, gcc, Git, etc. On
|
||||
Windows, you have to go to a website, click on a download link, run
|
||||
an executable, and walk through the steps in an installer. On Linux,
|
||||
it is as simple as a couple terminal commands. There's a reason even
|
||||
Microsoft felt it needed to improve the developer experience on
|
||||
Windows via the
|
||||
<a
|
||||
@@ -112,14 +112,25 @@
|
||||
work by just pressing the play button, possibly with a few tweaks.
|
||||
After trying this out myself, I have come to the same conclusion.
|
||||
Gaming on Linux is as good as it has ever been and will only get
|
||||
better, especially after the announcement and release of the Linux
|
||||
powered
|
||||
better, especially after the launch of the SteamOS 3.0 powered
|
||||
<a href="https://store.steampowered.com/steamdeck" target="_blank"
|
||||
>Steam Deck</a
|
||||
>
|
||||
from Valve. If you play a lot of online multiplayer games, you may
|
||||
need to wait as popular anti-cheat software doesn't currently work
|
||||
through Proton.
|
||||
from Valve.
|
||||
</p>
|
||||
<p>
|
||||
If you play a lot of online multiplayer games, you may need to wait.
|
||||
Not all anti-cheat software currently works through Proton.
|
||||
<a href="https://areweanticheatyet.com" target="_blank"
|
||||
>Are We Anti-Cheat Yet?</a
|
||||
>
|
||||
provides "a comprehensive and crowd-sourced list of games using
|
||||
anti-cheats and their compatibility with GNU/Linux or Wine/Proton".
|
||||
<a href="https://www.ea.com/games/apex-legends" target="_blank"
|
||||
>Apex Legends</a
|
||||
>
|
||||
is one notable example that enabled Linux support for Easy
|
||||
Anti-Cheat shortly after the launch of the Steam Deck.
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
@@ -136,16 +147,15 @@
|
||||
like the best option because I could literally build my OS from the
|
||||
ground up. I essentially have complete control over which packages
|
||||
get installed on my system. This means there is a steep learning
|
||||
curve and things can break if you are not careful, but the
|
||||
<a href="https://wiki.archlinux.org" target="_blank">ArchWiki</a>
|
||||
is possibly the greatest Linux resource I have ever seen. The main
|
||||
reasons I decided on Arch are:
|
||||
curve and things can break if you are not careful. If you can get
|
||||
over the initial difficulties, you will find an amazing Linux
|
||||
desktop experience. The main reasons I decided on Arch are:
|
||||
</p>
|
||||
<ul>
|
||||
<li>
|
||||
<b>Rolling Release</b>: I don't have to re-install my OS every 6
|
||||
months. My system and the kernel get updated through my package
|
||||
manager.
|
||||
months. My system and the kernel get updated through a simple
|
||||
package manager command.
|
||||
</li>
|
||||
<li>
|
||||
<b>Package Management</b>: Pacman and AUR helpers (e.g.
|
||||
@@ -164,21 +174,30 @@
|
||||
<a href="https://snapcraft.io" target="_blank">snap</a>,
|
||||
<a href="flathub" target="_blank">flatpak</a>, or
|
||||
<a href="https://appimage.org" target="_blank">AppImage</a>. While
|
||||
these are great in that they can run on any Linux distro, they
|
||||
don't integrate into the system as well as I would like. AppImages
|
||||
have to be updated manually and don't integrate well with the
|
||||
desktop experience by default. Flatpaks are sandboxed
|
||||
applications, which means they require manual intervention to
|
||||
access certain parts of the OS. The main issue I found here was
|
||||
with theming. For lots of open source applications, they may not
|
||||
have a snap, flatpak, or AppImage package, but they almost always
|
||||
have an AUR package. This means it is extremely rare to have to
|
||||
manually install any application or program on my system.
|
||||
these universal package formats are great in that they can run on
|
||||
any Linux distro, they don't integrate into the system as well as
|
||||
I would like. AppImages have to be updated manually and don't
|
||||
integrate well with the desktop experience by default. Flatpaks
|
||||
are sandboxed applications, which means they require manual
|
||||
intervention to access certain parts of the OS. The main issue I
|
||||
found here was with theming. For lots of open source applications,
|
||||
they may not have a snap, flatpak, or AppImage package, but they
|
||||
almost always have an AUR package. This means it is extremely rare
|
||||
to have to manually install any application or program on my
|
||||
system.
|
||||
</li>
|
||||
<li>
|
||||
<b>Customizability</b>: Everything on my system was either
|
||||
installed by me or a dependency for something I installed. There
|
||||
is little to no bloatware.
|
||||
<b>ArchWiki</b>: The
|
||||
<a href="https://wiki.archlinux.org/" target="_blank">ArchWiki</a>
|
||||
is by far the best source of linux documentation I have found on
|
||||
the internet. It has clear and well written information on pretty
|
||||
much any topic you may be interested in and any issue you may
|
||||
encounter. On other distros, you generally have to resolve issues
|
||||
yourself or search for solutions on random message boards without
|
||||
really understanding what the different components of your OS do.
|
||||
By reading the ArchWiki, I feel like I have gained a much better
|
||||
understanding of how my computer works and how to approach
|
||||
resolving any issues I may have.
|
||||
</li>
|
||||
</ul>
|
||||
<p>
|
||||
@@ -198,17 +217,9 @@
|
||||
href="https://wiki.archlinux.org/title/System76_Oryx_Pro"
|
||||
target="_blank"
|
||||
>page for the System76 Oryx Pro</a
|
||||
>. Unfortunately, I had some issue with NVIDIA's Linux drivers and
|
||||
<a href="https://github.com/pop-os/system76-power" target="_blank"
|
||||
>System76's graphics switching tool</a
|
||||
>
|
||||
on Arch. I was able to resolve the issue by switching to
|
||||
<a href="https://garudalinux.org" target="_blank">Garuda Linux</a>,
|
||||
which is based on Arch, but provides an easy to use installer and
|
||||
some nice GUI tools for configuring your system. As of the time of
|
||||
writing, I don't see myself switching from Garuda because it
|
||||
provides all the benefits of Arch without the initial hassle of
|
||||
installing the system from scratch.
|
||||
>. By following the suggestions there, I was able to resolve issues
|
||||
like the audio not working, graphics switching, suspend/hibernate,
|
||||
etc.
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
@@ -227,9 +238,8 @@
|
||||
from Windows, I was much more comfortable with the look and feel of
|
||||
KDE Plasma. Additionally, it has many (perhaps too many)
|
||||
customizability options. After using this for a while, I eventually
|
||||
ran into some system freezing issues that I didn't expect to see
|
||||
given my hardware and felt that I could go for something a bit more
|
||||
minimal.
|
||||
felt that I wanted something more minimal that I could tweak exactly
|
||||
to my liking.
|
||||
</p>
|
||||
|
||||
<hr />
|
||||
@@ -256,8 +266,7 @@
|
||||
my needs. One of the main downsides of dwm is that it is meant to be
|
||||
super minimal where features you might expect to see need to be
|
||||
added through patches. The process of patching can be slow,
|
||||
annoying, and prone to error. One solution, that I ended up going
|
||||
with, is to use
|
||||
annoying, and prone to error. A great solution to this problem is
|
||||
<a href="https://github.com/bakkeby/dwm-flexipatch" target="_blank"
|
||||
>dwm-flexipatch</a
|
||||
>. This includes a bunch of commonly used patches that can be
|
||||
|
@@ -1,15 +0,0 @@
|
||||
<div class="container-fluid px-md-6">
|
||||
<div class="row align-items-center">
|
||||
<div class="col-md-12">
|
||||
<small>
|
||||
Copyright © 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>
|
@@ -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 © 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> ')
|
@@ -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" />
|
@@ -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" /> ')
|
@@ -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>
|
@@ -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> ')
|
@@ -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>
|
||||
|
||||
<!---------------------------------
|
||||
|
@@ -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
@@ -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).
|
1164
src/personal.html
4
src/personal.md
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
title: Personal
|
||||
layout: "layouts/personal.html"
|
||||
---
|
15
src/personal/hardware/galaxy-watch-5-pro.md
Normal 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.
|
17
src/personal/hardware/galaxy-z-fold-4.md
Normal 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.
|
13
src/personal/hardware/hifiman-ananda.md
Normal 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.
|
15
src/personal/hardware/keychron-q1-pro.md
Normal 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.
|
13
src/personal/hardware/oryx-pro-7.md
Normal 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.
|
11
src/personal/hardware/truthear-hexa.md
Normal 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.
|
11
src/personal/software/beeper.md
Normal 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.
|
11
src/personal/software/bitwarden.md
Normal 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.
|
11
src/personal/software/emacs.md
Normal 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.
|
17
src/personal/software/gentoo.md
Normal 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.
|
17
src/personal/software/obsidian.md
Normal 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.
|
13
src/personal/software/pocket-casts.md
Normal 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.
|
13
src/personal/software/spotify.md
Normal 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).
|
9
src/personal/software/vivaldi.md
Normal 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.
|
1485
src/portfolio.html
4
src/portfolio.md
Normal file
@@ -0,0 +1,4 @@
|
||||
---
|
||||
title: Portfolio
|
||||
layout: "layouts/portfolio.html"
|
||||
---
|
14
src/portfolio/education/umich-1.md
Normal 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
|
14
src/portfolio/education/umich-2.md
Normal 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
|
14
src/portfolio/education/umich-3.md
Normal 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
|
23
src/portfolio/highlights/hughes-1-project-1.md
Normal 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."
|
||||
>
|
||||
> — <cite>Hughes Customer</cite>
|
17
src/portfolio/highlights/hughes-1-project-2.md
Normal 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.
|
17
src/portfolio/highlights/mitre-1-project-1.md
Normal 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.
|