Compare commits
43 Commits
server-can
...
resume-it-
| Author | SHA1 | Date | |
|---|---|---|---|
|
8ab4b61a52
|
|||
|
a14b733a85
|
|||
|
5eb1372265
|
|||
|
a751dce299
|
|||
|
028b2bb712
|
|||
|
b4eaa5db7f
|
|||
|
4d5d25af15
|
|||
| 2e5b5b52d8 | |||
| adcc975d23 | |||
| e3065d8d6d | |||
| f5fe070e54 | |||
| 0534b97f73 | |||
| c56d8fb731 | |||
| 3f71be8c66 | |||
| 6a6e9bb11f | |||
| 90fef7bb61 | |||
| 49a846ee2d | |||
| c97c1a221f | |||
| 4ff6ac20f0 | |||
| 25535aa384 | |||
| 5d8442a6f0 | |||
| b40109382e | |||
| 5fdcb18365 | |||
| 278e2a8f46 | |||
| 79b7e336a7 | |||
| 7ea1739380 | |||
| a1086f3c2e | |||
| 87c293ce13 | |||
| 9be9043b6c | |||
| 26d63d2e6a | |||
| b1f3cfdf57 | |||
| 461eb2aeb6 | |||
| a7fa6b9f3e | |||
| d21758675c | |||
| 14c6827b79 | |||
| 052f98860d | |||
| 7c08682c66 | |||
| 179b3f7c7e | |||
| 2abc9de891 | |||
| 16bff441df | |||
| 6b2a29b078 | |||
| 1881fd9778 | |||
| 24f58db4f9 |
@@ -104,13 +104,18 @@ body {
|
|||||||
background-color: $background-color;
|
background-color: $background-color;
|
||||||
color: $color;
|
color: $color;
|
||||||
// line-height: 1.5;
|
// line-height: 1.5;
|
||||||
line-height: 1.55;
|
line-height: 1.59;
|
||||||
// font-size: 100%;
|
// font-size: 100%;
|
||||||
font-size: 15px;
|
// font-size: 15px;
|
||||||
|
font-size: 17px;
|
||||||
// font-size: 20px;
|
// font-size: 20px;
|
||||||
// font-size: 22px;
|
// font-size: 22px;
|
||||||
/* font-family: 'Source Code Pro', monospace; */
|
/* font-family: 'Source Code Pro', monospace; */
|
||||||
font-family: 'Hack', monospace;
|
// font-family: 'Hack', monospace;
|
||||||
|
// body {
|
||||||
|
// font-family: 'Times New Roman', serif;
|
||||||
|
font-family: "Computer Modern Serif";
|
||||||
|
// }
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
@@ -172,7 +177,8 @@ footer {
|
|||||||
margin-top: 2rem;
|
margin-top: 2rem;
|
||||||
$vertical-margin: .2em;
|
$vertical-margin: .2em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 0.8em;
|
// font-size: 0.8em;
|
||||||
|
font-size: .85em;
|
||||||
color: #747369;
|
color: #747369;
|
||||||
// bottom: 0;
|
// bottom: 0;
|
||||||
// position: absolute;
|
// position: absolute;
|
||||||
@@ -212,7 +218,8 @@ footer {
|
|||||||
// padding-right: .9em;
|
// padding-right: .9em;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
height: 1.5em;
|
// height: 1.5em;
|
||||||
|
height: 3em;
|
||||||
@include vert-margin-rem(.2);
|
@include vert-margin-rem(.2);
|
||||||
padding-left: .5em;
|
padding-left: .5em;
|
||||||
opacity: .6;
|
opacity: .6;
|
||||||
@@ -370,7 +377,7 @@ header {// {{{
|
|||||||
display: inline;
|
display: inline;
|
||||||
|
|
||||||
&#gnu {
|
&#gnu {
|
||||||
background-color: $base04;
|
// background-color: $base04;
|
||||||
// background-color: $base05;
|
// background-color: $base05;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -493,7 +500,7 @@ header {// {{{
|
|||||||
#contact-info {// {{{
|
#contact-info {// {{{
|
||||||
@include side-margin-em(0);
|
@include side-margin-em(0);
|
||||||
// @include vert-padding-rem(0.5);
|
// @include vert-padding-rem(0.5);
|
||||||
@include a-color($base-sky-blue);
|
// @include a-color($base-sky-blue);
|
||||||
// min-width: $max-page-width;
|
// min-width: $max-page-width;
|
||||||
@media (min-width: 1200px) {
|
@media (min-width: 1200px) {
|
||||||
.container{
|
.container{
|
||||||
@@ -501,6 +508,7 @@ header {// {{{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
a {// {{{
|
a {// {{{
|
||||||
|
color: #4287cd;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
@@ -512,7 +520,8 @@ header {// {{{
|
|||||||
|
|
||||||
.row {
|
.row {
|
||||||
// flex-grow: 1;
|
// flex-grow: 1;
|
||||||
color: $base05;
|
// color: $base05;
|
||||||
|
color: #4287cd;
|
||||||
|
|
||||||
img {
|
img {
|
||||||
height: 1em;
|
height: 1em;
|
||||||
@@ -530,7 +539,9 @@ header {// {{{
|
|||||||
}
|
}
|
||||||
|
|
||||||
.url-info {
|
.url-info {
|
||||||
|
font-size: 1em;
|
||||||
margin-left: 5px;
|
margin-left: 5px;
|
||||||
|
// text-decoration: underline;
|
||||||
// position: relative;
|
// position: relative;
|
||||||
// left: -8px;
|
// left: -8px;
|
||||||
// @media (max-width: $phone-width) {
|
// @media (max-width: $phone-width) {
|
||||||
@@ -545,6 +556,9 @@ header {// {{{
|
|||||||
#resume {// {{{
|
#resume {// {{{
|
||||||
a {// {{{
|
a {// {{{
|
||||||
// text-decoration: none;
|
// text-decoration: none;
|
||||||
|
// color: $base-blue;
|
||||||
|
color: #4287cd;
|
||||||
|
// color: blue;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
@@ -552,17 +566,19 @@ header {// {{{
|
|||||||
}// }}}
|
}// }}}
|
||||||
|
|
||||||
h1 {// {{{
|
h1 {// {{{
|
||||||
color: $base-orange;
|
// color: $base-orange;
|
||||||
|
color: black;
|
||||||
// margin-top: 1.3rem;
|
// margin-top: 1.3rem;
|
||||||
margin-top: 1rem;
|
margin-top: 1rem;
|
||||||
font-size: 1.2em;
|
// font-size: 1.2em;
|
||||||
|
font-size: 1.3em;
|
||||||
|
|
||||||
// @media (max-width: $phone-width) {
|
// @media (max-width: $phone-width) {
|
||||||
// margin-top: .75rem;
|
// margin-top: .75rem;
|
||||||
// }
|
// }
|
||||||
}// }}}
|
}// }}}
|
||||||
h2 {// {{{
|
h2 {// {{{
|
||||||
color: $base-orange;
|
//color: $base-orange;
|
||||||
margin-top: .5rem;
|
margin-top: .5rem;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
|
|
||||||
@@ -591,10 +607,19 @@ header {// {{{
|
|||||||
// }
|
// }
|
||||||
}// }}}
|
}// }}}
|
||||||
|
|
||||||
|
.section-header {
|
||||||
|
margin-top: .7em;
|
||||||
|
margin-bottom: 0.4em;
|
||||||
|
}
|
||||||
|
|
||||||
ul {
|
ul {
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.work-experience {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
#projects {// {{{
|
#projects {// {{{
|
||||||
// // h1 {
|
// // h1 {
|
||||||
// // margin-bottom: 3px;
|
// // margin-bottom: 3px;
|
||||||
@@ -606,6 +631,7 @@ header {// {{{
|
|||||||
h2 {
|
h2 {
|
||||||
color: $base-sky-blue;
|
color: $base-sky-blue;
|
||||||
display: inline;
|
display: inline;
|
||||||
|
font-size: 1.1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
img {
|
img {
|
||||||
@@ -613,8 +639,25 @@ header {// {{{
|
|||||||
}
|
}
|
||||||
|
|
||||||
.project-header {
|
.project-header {
|
||||||
// margin-bottom: .6em;
|
display: flex;
|
||||||
margin-bottom: .1em;
|
align-items: baseline;
|
||||||
|
justify-content: space-between;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-date {
|
||||||
|
margin-left: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-title {
|
||||||
|
display: inline;
|
||||||
|
margin-right: 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.project-title span {
|
||||||
|
display: inline;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
font-weight: normal;
|
||||||
}
|
}
|
||||||
|
|
||||||
.project-link {
|
.project-link {
|
||||||
@@ -654,8 +697,39 @@ header {// {{{
|
|||||||
}
|
}
|
||||||
}// }}}
|
}// }}}
|
||||||
|
|
||||||
|
.company {
|
||||||
|
// color: #fe4646;
|
||||||
|
color: black;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 1.2em;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.position {
|
||||||
|
// color: black;
|
||||||
|
// color: $base-sky-blue;
|
||||||
|
// color: $base-blue;
|
||||||
|
color: black;
|
||||||
|
font-weight: bold;
|
||||||
|
// font-style: italic;
|
||||||
|
// font-size: 1.1em;
|
||||||
|
font-size: 1em;
|
||||||
|
// margin-bottom: 5px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.languages {
|
||||||
|
font-weight: normal;
|
||||||
|
font-style: normal;
|
||||||
|
margin-left: 0.5em;
|
||||||
|
color: $base03;
|
||||||
|
}
|
||||||
|
|
||||||
.institution {
|
.institution {
|
||||||
color: $base-yellow;
|
// color: $base-yellow;
|
||||||
|
// color: $base-dark-orange;
|
||||||
|
// color: $base-blue;
|
||||||
|
color: black;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 1.1em;
|
font-size: 1.1em;
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
@@ -761,16 +835,21 @@ header {// {{{
|
|||||||
h1.site-title {// {{{
|
h1.site-title {// {{{
|
||||||
text-align: center;
|
text-align: center;
|
||||||
// font-size: 4.2em;
|
// font-size: 4.2em;
|
||||||
font-size: 3.2em;
|
// font-size: 3.2em;
|
||||||
|
font-size: 2.5em;
|
||||||
// color: #66cccc;
|
// color: #66cccc;
|
||||||
color: $base05;
|
color: $base05;
|
||||||
// margin-top: 1rem;
|
// margin-top: 1rem;
|
||||||
// margin-bottom: 0.75rem;
|
// margin-bottom: 0.75rem;
|
||||||
@include vert-margin-rem(.75);
|
@include vert-margin-rem(.75);
|
||||||
|
|
||||||
@include a-color($base-sky-blue);
|
// @include a-color($base-sky-blue);
|
||||||
a {
|
a {
|
||||||
text-decoration: none;
|
color: black;
|
||||||
|
// text-decoration: none;
|
||||||
|
text-decoration: underline;
|
||||||
|
text-decoration-thickness: 2px;
|
||||||
|
text-underline-offset: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
// @media (max-width: $phone-width) {
|
// @media (max-width: $phone-width) {
|
||||||
@@ -936,7 +1015,8 @@ article.single section.body h5 { color: #515151; }
|
|||||||
article.single section.body h6 { color: #747369; }
|
article.single section.body h6 { color: #747369; }
|
||||||
|
|
||||||
// article.single section.body a,a:visited { color: #a06700; }
|
// article.single section.body a,a:visited { color: #a06700; }
|
||||||
article.single section.body a,a:visited { color: $base-sky-blue; }
|
// article.single section.body a,a:visited { color: $base-sky-blue; }
|
||||||
|
// article.single section.body a,a:visited { color: $base-sky-blue; }
|
||||||
|
|
||||||
/* Article Elements */
|
/* Article Elements */
|
||||||
|
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ menu:
|
|||||||
- name: config
|
- name: config
|
||||||
url: /config
|
url: /config
|
||||||
weight: 10
|
weight: 10
|
||||||
- name: card
|
# - name: card
|
||||||
url: /card
|
# url: /card
|
||||||
weight: 15
|
# weight: 15
|
||||||
# - name: letter
|
# - name: letter
|
||||||
# url: /letter
|
# url: /letter
|
||||||
# weight: 17
|
# weight: 17
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ layout: single
|
|||||||
---
|
---
|
||||||
<!--- Intro {{{ -->
|
<!--- Intro {{{ -->
|
||||||
|
|
||||||

|

|
||||||
*Screenshot from my dual-monitor setup.*
|
*Screenshot from my dual-monitor setup.*
|
||||||
|
|
||||||
This [repository][lc-repo] contains the dotfiles to increase my workflow
|
This [repository][lc-repo] contains the dotfiles to increase my workflow
|
||||||
@@ -18,17 +18,17 @@ efficiency. They are also for my Linux [rice][ricing_explanation].
|
|||||||
|
|
||||||
<!--- Main Programs {{{ -->
|
<!--- Main Programs {{{ -->
|
||||||
## Main Programs
|
## Main Programs
|
||||||
* **OS**: [Arch Linux](https://www.archlinux.org/) ([packages](txt/nzxt-pkgs.txt))
|
* **OS**: [Arch Linux](https://www.archlinux.org/) ([packages](https://git.kevin-mok.com/Kevin-Mok/linux-config/src/branch/master/txt/arch-2-pkgs.txt))
|
||||||
```
|
```
|
||||||
$ systemd-analyze
|
$ systemd-analyze
|
||||||
Startup finished in 2.341s (kernel) + 1.085s (userspace) = 3.426s
|
Startup finished in 2.341s (kernel) + 1.085s (userspace) = 3.426s
|
||||||
graphical.target reached after 1.085s in userspace
|
graphical.target reached after 1.085s in userspace
|
||||||
```
|
```
|
||||||
* **Terminal**: [rxvt-unicode-pixbuf](https://www.wikiwand.com/en/Rxvt)
|
* **Terminal**: [kitty](https://sw.kovidgoyal.net/kitty/)
|
||||||
* **Shell**: [Zsh](http://zsh.sourceforge.net/) + [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)
|
* **Shell**: [fish](https://fishshell.com/)
|
||||||
* **Window Manager**: [i3-gaps](https://github.com/Airblader/i3)
|
* **Window Manager**: [i3-gaps](https://i3wm.org/)
|
||||||
* **Editor**: [Neovim](https://github.com/neovim/neovim) ([plugins](dotfiles/.vimrc#L51))
|
* **Editor**: [neovim](https://neovim.io/) ([plugins](https://git.kevin-mok.com/Kevin-Mok/linux-config/src/branch/master/dot_vimrc.tmpl#L147-L359))
|
||||||
* **File Manager**: [ranger](https://ranger.github.io/)
|
* **File Manager**: [ranger](https://github.com/ranger/ranger?tab=readme-ov-file#ranger-193)/[PCManFM](https://en.wikipedia.org/wiki/PCMan_File_Manager)
|
||||||
<!--- }}} Basic Info -->
|
<!--- }}} Basic Info -->
|
||||||
|
|
||||||
<!--- Setup {{{ -->
|
<!--- Setup {{{ -->
|
||||||
|
|||||||
Submodule content/letter updated: 1f7a5be6bc...f07869796d
@@ -5,102 +5,113 @@ draft: false
|
|||||||
---
|
---
|
||||||
{{% resume/section "Work Experience" %}}<!--- {{{ -->
|
{{% resume/section "Work Experience" %}}<!--- {{{ -->
|
||||||
|
|
||||||
{{% resume/education name="Red Hat"
|
{{% resume/work-experience name="Red Hat"
|
||||||
title="Cloud/Software Engineer Intern" date="May 2020 — Aug 2021" %}}
|
title="Cloud/Software Engineer Intern" languages="Kubernetes, GoLang, Jenkins" date="May 2022 — Aug 2023" %}}
|
||||||
- Reduced deployment time by **66%** by implementing ability to
|
|
||||||
deploy locally-compiled binaries onto **Kubernetes**/**OpenShift**
|
- **Provided Tier 1 and Tier 2 support**, resolving
|
||||||
using only command-line.
|
user-reported issues with CI/CD pipelines and Kubernetes
|
||||||
- Implemented ability for Kubernetes operator to fetch data
|
environments, resulting in a **40% faster average response
|
||||||
from a deployed service and update config with data.
|
time**.
|
||||||
- Added startup probes to handle starting legacy application containers that require additional startup time.
|
- **Diagnosed and resolved 80% of configuration
|
||||||
- Refactored probes to have default values assigned based on
|
errors** in Kubernetes deployments by automating data
|
||||||
deployed YAML while also fixing reconciliation issues.
|
fetching and validation, **reducing system downtime
|
||||||
- Automated the promotion and release process
|
by 40%** and improving reliability for end-users.
|
||||||
as part of the **Jenkins** release pipeline.
|
- **Reduced deployment-related support tickets by 66%**
|
||||||
- Wrote documentation on how to get started with the project to onboard new
|
by developing a CLI tool to automate Kubernetes
|
||||||
developers and mentored the incoming intern.
|
binary deployments, with documented troubleshooting
|
||||||
|
procedures that cut resolution time from 45 to 15
|
||||||
|
minutes.
|
||||||
|
- **Decreased configuration error escalations by 30%**
|
||||||
|
through dynamic probe defaults and created knowledge
|
||||||
|
base articles enabling Tier 1 support to resolve most
|
||||||
|
probe issues independently.
|
||||||
|
- **Authored clear, user-friendly documentation** that
|
||||||
|
translated complex technical processes into
|
||||||
|
step-by-step guides, **accelerating onboarding by
|
||||||
|
50%** and enabling non-technical stakeholders to
|
||||||
|
self-serve.
|
||||||
|
- **Collaborated with QA and DevOps teams** to document
|
||||||
|
root causes of startup failures in legacy systems,
|
||||||
|
implementing dynamic probes that **cut production
|
||||||
|
launch issues by 50%**.
|
||||||
|
|
||||||
{{% /resume/section %}}<!--- }}} -->
|
{{% /resume/section %}}<!--- }}} -->
|
||||||
|
|
||||||
{{% resume/section projects %}}<!--- {{{ -->
|
{{% resume/section "Web Dev Projects" %}}<!--- {{{ -->
|
||||||
|
|
||||||
<!--- AWS {{{ -->
|
|
||||||
|
|
||||||
{{% resume/project name="AWS Server/Kubernetes"
|
|
||||||
url="https://kevin-mok.com/server/" date="May 2024" show="true" %}}
|
|
||||||
|
|
||||||
- Deployed [various web apps](https://kevin-mok.com/server/) using **Docker** (Compose) and on an
|
|
||||||
**AWS EC2** Debian/**Linux** server.
|
|
||||||
- Created **Kubernetes** [manifest files](https://github.com/Kevin-Mok) to quickly recreate my server setup
|
|
||||||
(with persistent storage/restarts and open ports).
|
|
||||||
- Used Amazon Route 53's DNS and **NGINX** to route
|
|
||||||
subdomains to each web application.
|
|
||||||
- Used AWS security groups to allow inbound HTTPS traffic.
|
|
||||||
- Used Amazon EBS snapshots to regularly back up server.
|
|
||||||
- Wrote a [**JavaScript** script][server script] and [systemd service][systemd service]/[timer]
|
|
||||||
to display the uptime of my pages every hour.
|
|
||||||
|
|
||||||
[server script]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-status.js
|
|
||||||
[systemd service]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.service
|
|
||||||
[timer]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.timer
|
|
||||||
|
|
||||||
{{% /resume/project %}}
|
|
||||||
|
|
||||||
<!--- AWS }}} -->
|
|
||||||
|
|
||||||
<!--- Rarity Surf {{{ -->
|
<!--- Rarity Surf {{{ -->
|
||||||
|
|
||||||
{{% resume/project name="Rarity Surf"
|
{{% resume/project name="Rarity Surf"
|
||||||
date="Oct 2021" show="true" %}}
|
languages="TypeScript, JavaScript, Node.js, React"
|
||||||
|
date="March 2025" show="true" %}}
|
||||||
|
|
||||||
- Web app to give rarity rankings to NFT's within minutes of their metadata being revealed and check which are listed (based on rarity and price filters) on the OpenSea marketplace using their API.
|
- **Provided direct user support** for a live NFT analytics
|
||||||
- Reverse engineered the ranking algorithm to match the
|
platform, resolving front-end filtering bugs and API
|
||||||
leading rarity ranking site's rankings (scraped using
|
integration issues in real-time.
|
||||||
Selenium) with a **discrepancy of <0.25%**.
|
- **Developed a full-stack web application with PostgreSQL database** to analyze NFT rarity rankings, increasing market research efficiency by 80%.
|
||||||
- Used app to frontrun purchases of **top 5%** rarity NFT's
|
- **Translated user requests into technical features**, implementing real-time PostgreSQL-powered filters that improved usability for non-technical traders.
|
||||||
against competing buyers.
|
- **Debugged and optimized API performance** under
|
||||||
- Wrote **Django (Python)** backend to fetch metadata from IPFS, store rarity rankings in PostgreSQL and serve rarity data using GraphQL.
|
load, reducing latency by 50% and enabling **3,000+
|
||||||
- Wrote **React** frontend with hooks to dynamically load rarity data. Styled with Tailwind.
|
concurrent users** to filter NFT data
|
||||||
|
seamlessly, addressing real-time customer usability
|
||||||
|
issues.
|
||||||
|
|
||||||
{{% /resume/project %}}
|
{{% /resume/project %}}
|
||||||
|
|
||||||
<!--- Rarity Surf }}} -->
|
<!--- Rarity Surf }}} -->
|
||||||
|
|
||||||
<!--- Astronofty {{{ -->
|
|
||||||
|
|
||||||
{{% resume/project name="Astronofty"
|
{{% resume/project name="Astronofty"
|
||||||
url="https://github.com/Kevin-Mok/astronofty" date="Jan 2023"
|
url="https://github.com/Kevin-Mok/astronofty" languages="JavaScript, React, Solidity" date="Jan 2023"
|
||||||
show="true" %}}
|
show="true" %}}
|
||||||
|
|
||||||
- Created for a 36 hour hackathon (UofTHacks X) where it [**came 2nd overall**](https://devpost.com/software/astronofty).
|
- **Developed technical solutions in high-pressure
|
||||||
- Created and deployed a smart contract with **Solidity** on
|
environments**, earning 2nd place at UofTHacks X for a
|
||||||
the Ethereum blockchain to create/buy/sell NFT's
|
decentralized NFT marketplace app.
|
||||||
using MetaMask.
|
- **Handled real-time user testing feedback**, adapting
|
||||||
- Wrote a **React** hook to fetch and show listed NFT's, NFT details and owned NFT's.
|
components on the fly to resolve blocking issues during
|
||||||
- Used API to synchronously upload images and metadata to IPFS.
|
demo.
|
||||||
|
|
||||||
{{% /resume/project %}}
|
{{% /resume/project %}}
|
||||||
|
|
||||||
<!--- Astronofty }}} -->
|
<!--- AWS {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="AWS Server"
|
||||||
|
url="https://kevin-mok.com/server/" languages="AWS, Kubernetes, Docker, Terraform" date="May 2024" show="true" %}}
|
||||||
|
|
||||||
|
- **Deployed and maintained multiple web applications**
|
||||||
|
using **Docker Compose** on **AWS EC2 Debian/Linux servers**,
|
||||||
|
ensuring consistent environments for applications handling
|
||||||
|
**over 2,000+ monthly requests**.
|
||||||
|
- **Automated AWS infrastructure provisioning** by writing
|
||||||
|
**Terraform** files to deploy AWS EC2 instances and Docker
|
||||||
|
containers, **accelerating deployment times by 80%** and
|
||||||
|
providing an easily reproducible infrastructure setup.
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- AWS }}} -->
|
||||||
|
|
||||||
{{% /resume/section %}}<!--- }}} -->
|
{{% /resume/section %}}<!--- }}} -->
|
||||||
|
|
||||||
{{% resume/section skills %}}<!--- {{{ -->
|
{{% resume/section skills %}}<!--- {{{ -->
|
||||||
|
|
||||||
AWS, Kubernetes, Docker (Compose), **JavaScript**, **React**, **Python**, Go, Bash, Solidity, C, **Django**, Node.js, Jenkins, PostgreSQL, **Linux**, **Git**, **Command Line**
|
- **IT Support Skills**: Tier 1/2 Troubleshooting, Incident
|
||||||
|
Response, Jira, Microsoft 365, VPN, Log Analysis, Knowledge Base Writing, Root Cause
|
||||||
|
Investigation
|
||||||
|
- **Customer Support**: Cross-team Collaboration,
|
||||||
|
Communication, User Training, Documentation
|
||||||
|
- **Programming Languages**: Python, Go, JavaScript,
|
||||||
|
TypeScript
|
||||||
|
- **Web Development**: PostgreSQL, Linux, React, Django
|
||||||
|
|
||||||
{{% /resume/section %}}<!--- }}} -->
|
{{% /resume/section %}}<!--- }}} -->
|
||||||
|
|
||||||
{{% resume/section education %}}<!--- {{{ -->
|
{{% resume/section education %}}<!--- {{{ -->
|
||||||
|
|
||||||
{{% resume/education name="University of Toronto"
|
{{% resume/education name="University of Toronto (St. George)"
|
||||||
title="Computer Science Specialist — 3.84 GPA (CS). Graduated with High Distinction." date="2018 — 2023" %}}
|
title="Computer Science Specialist — 3.84 GPA (CS). Graduated with High Distinction." date="2019 — 2024" %}}
|
||||||
|
|
||||||
{{% /resume/section %}}<!--- }}} -->
|
- **Relevant Coursework**: Computer Networking, Databases, Operating Systems
|
||||||
|
|
||||||
{{% resume/section "References" %}}<!--- {{{ -->
|
|
||||||
|
|
||||||
{{% resume/references %}}
|
|
||||||
|
|
||||||
{{% /resume/section %}}<!--- }}} -->
|
{{% /resume/section %}}<!--- }}} -->
|
||||||
|
|
||||||
|
|||||||
39
content/resume/notes.md
Normal file
39
content/resume/notes.md
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# ME Sniper
|
||||||
|
write me a resume section similar to this (just a bit longer) for a web dev resume based on the points after with made up statistics
|
||||||
|
|
||||||
|
## Old
|
||||||
|
- **Developed a full-stack web application** to generate rarity
|
||||||
|
rankings for NFT's integrated with leading NFT
|
||||||
|
marketplace's (OpenSea) API,
|
||||||
|
enabling users to **quickly identify rare NFT's** and check
|
||||||
|
their listing status, **improving market research efficiency by 80%**.
|
||||||
|
- **Architected a robust Django (Python) [backend](https://github.com/Kevin-Mok/rarity-surf)** to fetch and process
|
||||||
|
NFT metadata from IPFS, store rarity rankings in
|
||||||
|
**PostgreSQL**, and serve the data via GraphQL API, **ensuring low-latency access and scaling to handle 2,000+ concurrent requests**.
|
||||||
|
- **Developed a dynamic React (Javascript)
|
||||||
|
[frontend](https://github.com/Kevin-Mok/rarity-surf-frontend)** using hooks to load
|
||||||
|
rarity data in real-time, styled with Tailwind for
|
||||||
|
mobile responsiveness, **improving user experience
|
||||||
|
and reducing frontend load times by 70%**.
|
||||||
|
|
||||||
|
## New
|
||||||
|
- Developed a full-stack web application to generate rarity rankings for NFT’s integrated with leading NFT marketplace’s (Magic
|
||||||
|
Eden) API, enabling users to quickly identify rare NFT’s and check their listing status, improving market research efficiency by 80%.
|
||||||
|
- fetch metadata from either IPFS or website in parallel processes to create rarity
|
||||||
|
rankings as soon as metadata revealed
|
||||||
|
- reverse engineered algorithm for rarity rankings for NFT's based on article from
|
||||||
|
marketplace about their in-house statistical rarity
|
||||||
|
ranking
|
||||||
|
- created Prisma schema for PostgreSQL for database to store NFT data
|
||||||
|
- Node.js backend with API endpoints to return NFT's based
|
||||||
|
on max rank/price along with rarest traits
|
||||||
|
- lowest prices for rarity percentile to see if good deal
|
||||||
|
- fetch all listings from leading marketplace (Magic Eden) to be
|
||||||
|
able to identify which rare NFT's are on sale and be able
|
||||||
|
to filter based on max price/filter
|
||||||
|
- store previous sales data to check whether a buy at rarity
|
||||||
|
percentile is a good deal
|
||||||
|
- React FE to dynamically load NFT's based on rarity
|
||||||
|
rank/price filter with ability to hide seen ones
|
||||||
|
- Discord bot to notify you when customizable profitable resale
|
||||||
|
opportunity comes up based on rarity level/price
|
||||||
293
content/resume/old.md
Normal file
293
content/resume/old.md
Normal file
@@ -0,0 +1,293 @@
|
|||||||
|
<!--- {{{ Red Hat -->
|
||||||
|
|
||||||
|
- Reduced deployment time by **66%** by [implementing ability](https://github.com/apache/incubator-kie-kogito-operator/commit/175a6356c5474f2360ccb8ae835e0b9b2d653cf1) to
|
||||||
|
deploy locally-compiled binaries onto **Kubernetes**/**OpenShift**
|
||||||
|
using only command-line (**Kubernetes/GoLang** used for this and three below).
|
||||||
|
- Implemented ability for Kubernetes operator to fetch data
|
||||||
|
from a deployed service and update config with data to
|
||||||
|
deprecate reliance on startup script.
|
||||||
|
- Added startup probes to handle starting legacy application containers that require additional startup time.
|
||||||
|
- Refactored probes to [have default values](https://github.com/apache/incubator-kie-kogito-operator/commit/af4977af228ec8648be28779259d4552246b656f) assigned based on
|
||||||
|
deployed YAML while also fixing reconciliation issues.
|
||||||
|
- Rewrote the **Jenkins (Groovy)** [nightly pipeline](https://github.com/apache/incubator-kie-kogito-pipelines/commit/4c83f1aecdea2c1ba2796b79839a90d4083dce88) to run in a GitHub
|
||||||
|
PR using a trigger keyword to test all the team's submitted PR's
|
||||||
|
before merging to the main branch.
|
||||||
|
- Took on tasks and contributed ideas in **Agile sprint** planning meetings in a team of 12 people.
|
||||||
|
- Took initiative to write [file](https://github.com/apache/incubator-kie-kogito-pipelines/commit/4c83f1aecdea2c1ba2796b79839a90d4083dce88#diff-7d2c018dafbccec859077d19bf1ade53ec9c7649f235528ce89f5632b109f7e6)
|
||||||
|
to define the GitHub parameters for the above pipeline so that it
|
||||||
|
can be recreated easily.
|
||||||
|
- Took initiative to write [documentation](https://github.com/apache/incubator-kie-kogito-operator/blob/1534c03d1d26bec08a16608a775782bf8b305de9/docs/GUIDE_FOR_KOGITO_DEVS.md) on how to get started with the project to onboard new
|
||||||
|
developers and mentored the incoming intern.
|
||||||
|
|
||||||
|
<!--- }}} Red Hat -->
|
||||||
|
|
||||||
|
<!--- Rarity Surf {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="Rarity Surf"
|
||||||
|
languages="Python, JavaScript, React, Django"
|
||||||
|
date="Oct 2021" show="true" %}}
|
||||||
|
|
||||||
|
- **Developed a full-stack web application** to generate rarity
|
||||||
|
rankings for NFT's integrated with OpenSea's API,
|
||||||
|
enabling users to **quickly identify rare NFT's** and check
|
||||||
|
their listing status, **improving market research efficiency by 80%**.
|
||||||
|
- **Reverse engineered a proprietary ranking algorithm** to
|
||||||
|
mirror the leading rarity ranking site’s results,
|
||||||
|
**achieving 99.75% accuracy** by
|
||||||
|
utilizing data scraping techniques [with Selenium](https://github.com/Kevin-Mok/rarity-surf/blob/django/rarity_check/project/scrape.py),
|
||||||
|
increasing the platform's trustworthiness among users.
|
||||||
|
- **Optimized purchasing strategy** by leveraging the app to
|
||||||
|
frontrun competitors in purchasing top 0.5% rarity NFTs,
|
||||||
|
**boosting acquisition success rate by 90%** and allowing
|
||||||
|
users to gain a competitive edge in the marketplace.
|
||||||
|
- **Architected a robust Django (Python) [backend](https://github.com/Kevin-Mok/rarity-surf)** to fetch and process
|
||||||
|
NFT metadata from IPFS, store rarity rankings in
|
||||||
|
**PostgreSQL**, and serve the data via GraphQL API, **ensuring low-latency access and scaling to handle 2,000+ concurrent requests**.
|
||||||
|
- **Developed a dynamic React [frontend](https://github.com/Kevin-Mok/rarity-surf-frontend)** using hooks to load
|
||||||
|
rarity data in real-time, styled with Tailwind for
|
||||||
|
mobile responsiveness, **improving user experience
|
||||||
|
and reducing frontend load times by 70%**.
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- Rarity Surf }}} -->
|
||||||
|
|
||||||
|
<!--- Rarity Surf {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="Rarity Surf (2)"
|
||||||
|
languages="Typescript, Node.js, React"
|
||||||
|
date="" show="true" %}}
|
||||||
|
|
||||||
|
- **Developed a full-stack web application** to generate
|
||||||
|
rarity rankings for NFT's, integrating with **leading
|
||||||
|
marketplace’s API** to enable users to quickly identify
|
||||||
|
rare NFT's and check their listing status, **improving
|
||||||
|
market research efficiency by 80%**.
|
||||||
|
- **Built a scalable Node.js backend** with REST API
|
||||||
|
endpoints to return NFTs based on customizable filters
|
||||||
|
such as max rank, price, and rarest traits. **Optimized
|
||||||
|
performance** to handle **3,000+ concurrent requests** by
|
||||||
|
implementing efficient data fetching and caching
|
||||||
|
mechanisms, ensuring low-latency access to NFT data.
|
||||||
|
- **Developed a dynamic React frontend** to load and display
|
||||||
|
NFT's in real-time based on user-defined filters to
|
||||||
|
streamline browsing. Styled the interface using **Tailwind
|
||||||
|
CSS** for a responsive and modern design, **reducing
|
||||||
|
frontend load times by 50%**.
|
||||||
|
- **Developed a Discord bot** to notify users of profitable
|
||||||
|
resale opportunities by leveraging historical sales data
|
||||||
|
to assess deal quality. This feature **increased user
|
||||||
|
engagement by 80%** and provided a seamless way for users
|
||||||
|
to stay updated on market opportunities.
|
||||||
|
- Designed and implemented a **PostgreSQL schema** for to
|
||||||
|
efficiently store NFT data, including metadata, rarity
|
||||||
|
scores, and historical sales data.
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- Rarity Surf }}} -->
|
||||||
|
|
||||||
|
<!--- Astronofty {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="Astronofty"
|
||||||
|
url="https://github.com/Kevin-Mok/astronofty" languages="JavaScript, React, Solidity" date="Jan 2023"
|
||||||
|
show="true" %}}
|
||||||
|
|
||||||
|
- Created for a 36 hour hackathon (UofTHacks X) where it [**came 2nd overall**](https://devpost.com/software/astronofty).
|
||||||
|
- Created and deployed a smart contract with **Solidity** on
|
||||||
|
the Ethereum blockchain to create/buy/sell NFT's.
|
||||||
|
- Wrote **React** [components](https://github.com/Kevin-Mok/astronofty/tree/main/src/components) to synchronously upload images and metadata to IPFS and fetch and show NFT's.
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- Astronofty }}} -->
|
||||||
|
|
||||||
|
<!--- AWS {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="AWS Server"
|
||||||
|
url="https://kevin-mok.com/server/" languages="AWS, Kubernetes, Docker, Terraform" date="May 2024" show="true" %}}
|
||||||
|
|
||||||
|
- Deployed [various web apps](https://kevin-mok.com/server/) using **Docker** (Compose) on an
|
||||||
|
**AWS EC2** Debian/**Linux** server.
|
||||||
|
- Created **Kubernetes** [manifest files](https://github.com/Kevin-Mok/aws-minicube) to quickly recreate my server setup
|
||||||
|
with persistent storage/restarts and open ports.
|
||||||
|
- Created **Terraform** [files](https://github.com/Kevin-Mok/terraform-deploys/tree/main)
|
||||||
|
to deploy an AWS EC2 instance and Docker containers.
|
||||||
|
- Used Amazon Route 53's DNS and **NGINX** to route
|
||||||
|
subdomains to each web application.
|
||||||
|
- Wrote a **JavaScript** [server script] and [systemd service][systemd service]/[timer]
|
||||||
|
to display the uptime of my pages every hour.
|
||||||
|
|
||||||
|
[server script]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-status.js
|
||||||
|
[systemd service]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.service
|
||||||
|
[timer]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.timer
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- AWS }}} -->
|
||||||
|
|
||||||
|
<!--- AWS 2 {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="AWS Server"
|
||||||
|
url="https://kevin-mok.com/server/" languages="AWS, Kubernetes, Docker, Terraform" date="May 2024" show="true" %}}
|
||||||
|
|
||||||
|
- **Deployed and maintained multiple web applications**
|
||||||
|
using **Docker Compose** on **AWS EC2 Debian/Linux servers**,
|
||||||
|
ensuring consistent environments for applications handling
|
||||||
|
**over 2,000+ monthly requests**.
|
||||||
|
- **Streamlined infrastructure management** by creating
|
||||||
|
Kubernetes manifest files to easily recreate server setups
|
||||||
|
with persistent storage, automatic restarts, and open
|
||||||
|
ports, **reducing the need for manual configuration**.
|
||||||
|
- **Automated AWS infrastructure provisioning** by writing
|
||||||
|
**Terraform** files to deploy **EC2** instances and Docker
|
||||||
|
containers, **accelerating deployment times by 80%** and
|
||||||
|
providing an easily reproducible infrastructure setup for
|
||||||
|
future projects.
|
||||||
|
- Improved web application accessibility and scalability by
|
||||||
|
configuring Amazon Route 53’s DNS and NGINX to route
|
||||||
|
subdomains to individual web apps, enabling seamless
|
||||||
|
navigation between apps and reducing DNS resolution times
|
||||||
|
by 25%.
|
||||||
|
- Built a robust uptime monitoring system by writing a
|
||||||
|
JavaScript server script and setting up a systemd
|
||||||
|
service/timer to check and display page uptime every hour,
|
||||||
|
ensuring near real-time monitoring and reducing downtime
|
||||||
|
detection time by 85%.
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- AWS 2 }}} -->
|
||||||
|
|
||||||
|
<!--- AWS 3 {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="AWS Server"
|
||||||
|
url="https://kevin-mok.com/server/" languages="AWS, Kubernetes, Docker, Terraform" date="May 2024" show="true" %}}
|
||||||
|
|
||||||
|
- **Deployed and maintained multiple web applications**
|
||||||
|
using **Docker Compose** on **AWS EC2 Debian/Linux servers**,
|
||||||
|
ensuring consistent environments for applications handling
|
||||||
|
**over 2,000+ monthly requests**.
|
||||||
|
- **Automated AWS infrastructure provisioning** by writing
|
||||||
|
**Terraform** files to deploy AWS EC2 instances and Docker
|
||||||
|
containers, **accelerating deployment times by 80%** and
|
||||||
|
providing an easily reproducible infrastructure setup.
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- AWS 3 }}} -->
|
||||||
|
|
||||||
|
<!--- Astronofty (extended) {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="Astronofty"
|
||||||
|
url="https://github.com/Kevin-Mok/astronofty" languages="JavaScript, React, Solidity" date="Jan 2023"
|
||||||
|
show="true" %}}
|
||||||
|
|
||||||
|
- **Secured [2nd place](https://devpost.com/software/astronofty) overall out of 150+ teams** at UofTHacks
|
||||||
|
X, a 36-hour hackathon, for developing a blockchain-based
|
||||||
|
NFT marketplace app.
|
||||||
|
- **Built and optimized React (JavaScript) [components](https://github.com/Kevin-Mok/astronofty/tree/main/src/components)** to synchronously
|
||||||
|
upload images and metadata to IPFS, **enhancing user engagement by 40%** during the demo,
|
||||||
|
and ensuring real-time NFT data retrieval, achieving a **75% improvement in loading times**.
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- Astronofty }}} -->
|
||||||
|
|
||||||
|
<!--- {{{ Spotify Graphs -->
|
||||||
|
|
||||||
|
{{% resume/project name="Spotify Graphs"
|
||||||
|
url="https://github.com/Kevin-Mok/spotify-lib-vis" date="June 2020 "
|
||||||
|
languages="Python, Django, PostgreSQL"
|
||||||
|
show="true" %}}
|
||||||
|
|
||||||
|
- Web app to visualize user's library and listening
|
||||||
|
history from Spotify.
|
||||||
|
- [Fetched and organized](https://github.com/Kevin-Mok/spotify-lib-vis/blob/master/api/utils.py) user data from Spotify API into PostgreSQL database with **Django (Python)** backend.
|
||||||
|
- Created and tested various relational database schemas to maximize
|
||||||
|
efficiency for use cases.
|
||||||
|
- Generated various charts to visualize the artists and genres
|
||||||
|
of tracks in library.
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- Spotify Graphs }}} -->
|
||||||
|
|
||||||
|
<!--- Grocery Finder {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="Grocery Finder"
|
||||||
|
url="https://github.com/Kevin-Mok/grocery-finder" date="Feb. 2019 — Apr. 2019"
|
||||||
|
show="true" %}}
|
||||||
|
|
||||||
|
- Proof of concept for web app that finds the ideal supermarket based on your cart.
|
||||||
|
- Designed responsive front-end layout using **Bootstrap**.
|
||||||
|
- Implemented REST API functionality on backend using **Node.js** and
|
||||||
|
**MongoDB**.
|
||||||
|
- Setup deployment on [**Heroku**][Grocery Finder Heroku].
|
||||||
|
- Led team of 4 as project leader to prioritize and delegate tasks while
|
||||||
|
also implementing a majority of the core features.
|
||||||
|
- Performed code review for team members' pull requests.
|
||||||
|
|
||||||
|
[Grocery Finder Heroku]: http://www.grocery-finder.ml
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- Grocery Finder }}} -->
|
||||||
|
|
||||||
|
<!--- CSC369 {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="Custom Kernel Module"
|
||||||
|
url="https://kevin-mok.com/server/" date="Jan. 2022" show="true" %}}
|
||||||
|
|
||||||
|
- Wrote and installed a [custom Linux kernel module](https://github.com/Kevin-Mok/interceptor-kernel/blob/master/a1/interceptor.c) in **C**.
|
||||||
|
- Intercepted pre-existing system calls using
|
||||||
|
custom kernel module by sending commands to
|
||||||
|
userspace.
|
||||||
|
- Monitored specific process ID's in my system
|
||||||
|
call to intercept their system calls.
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- CSC369 }}} -->
|
||||||
|
|
||||||
|
<!--- ParsaFood {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="ParsaFood"
|
||||||
|
url="https://github.com/Kevin-Mok/ParsaFood" date="Feb. 2018"
|
||||||
|
show="true" %}}
|
||||||
|
|
||||||
|
- **Android** app that reads ingredient labels and detects any dietary
|
||||||
|
restrictions/allergies.
|
||||||
|
- Designed user interface and linked various functionality together.
|
||||||
|
- Made during a 24-hour [food-themed hackathon][Platterz Hackathon event]
|
||||||
|
in a group with two other members. Came in 2<sup>nd</sup> place and won
|
||||||
|
an [Oculus Rift][Oculus Rift Amazon].
|
||||||
|
|
||||||
|
[Parsafood repo]: https://github.com/Kevin-Mok/ParsaFood
|
||||||
|
[Platterz Hackathon event]:
|
||||||
|
https://www.eventbrite.com/e/platterz-hackathon-tickets-42682237722
|
||||||
|
[Oculus Rift Amazon]: https://www.amazon.ca/Oculus-Rift-Windows-VR-Headset/dp/B00VF0IXEY/ref=sr_1_1_sspa?ie=UTF8&qid=1520422949&sr=8-1-spons&keywords=oculus+rift&psc=1
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- ParsaFood }}} -->
|
||||||
|
|
||||||
|
<!--- DigitalOcean {{{ -->
|
||||||
|
|
||||||
|
{{% resume/project name="Personal Server"
|
||||||
|
url="https://kevin-mok.com/server/" date="Aug. 2019 — present" %}}
|
||||||
|
|
||||||
|
- Deployed various web apps with backends such as Node, PHP and Python using
|
||||||
|
**NGINX** on a **Debian** server.
|
||||||
|
- Monitor system resources and perform system maintenance using tmux.
|
||||||
|
- Wrote [**Node.js** script][server script] and [**systemd** service][systemd service]/[timer]
|
||||||
|
to check and display the uptime of my pages every hour.
|
||||||
|
|
||||||
|
[server script]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-status.js
|
||||||
|
[systemd service]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.service
|
||||||
|
[timer]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.timer
|
||||||
|
|
||||||
|
{{% /resume/project %}}
|
||||||
|
|
||||||
|
<!--- DigitalOcean Droplet }}} -->
|
||||||
|
|
||||||
@@ -1,98 +0,0 @@
|
|||||||
<!--- CSC369 {{{ -->
|
|
||||||
|
|
||||||
{{% resume/project name="Custom Kernel Module"
|
|
||||||
url="https://kevin-mok.com/server/" date="Jan. 2022" show="true" %}}
|
|
||||||
|
|
||||||
- Wrote and installed a [custom Linux kernel module](https://github.com/Kevin-Mok/interceptor-kernel/blob/master/a1/interceptor.c) in **C**.
|
|
||||||
- Intercepted pre-existing system calls using
|
|
||||||
custom kernel module by sending commands to
|
|
||||||
userspace.
|
|
||||||
- Monitored specific process ID's in my system
|
|
||||||
call to intercept their system calls.
|
|
||||||
|
|
||||||
{{% /resume/project %}}
|
|
||||||
|
|
||||||
<!--- CSC369 }}} -->
|
|
||||||
|
|
||||||
<!--- Spotify Graphs {{{ -->
|
|
||||||
|
|
||||||
{{% resume/project name="Spotify Graphs"
|
|
||||||
url="https://github.com/Kevin-Mok/spotify-lib-vis" date="June 2018 — July 2018"
|
|
||||||
show="true" %}}
|
|
||||||
|
|
||||||
- Implemented base functionality of scanning tracks and listening
|
|
||||||
history from user's library using Spotify API and organized data
|
|
||||||
into **PostgreSQL** database with **Django** backend.
|
|
||||||
- Created and tested various relational database schemas to maximize
|
|
||||||
efficiency for use cases.
|
|
||||||
- Produced bubble chart and (stacked) bar chart using [**d3**]
|
|
||||||
[d3 graph examples] to visualize the artists, genres and features of
|
|
||||||
tracks in library.
|
|
||||||
|
|
||||||
[d3 graph examples]: https://github.com/d3/d3/wiki/Gallery
|
|
||||||
|
|
||||||
{{% /resume/project %}}
|
|
||||||
|
|
||||||
<!--- Spotify Graphs }}} -->
|
|
||||||
|
|
||||||
<!--- Grocery Finder {{{ -->
|
|
||||||
|
|
||||||
{{% resume/project name="Grocery Finder"
|
|
||||||
url="https://github.com/Kevin-Mok/grocery-finder" date="Feb. 2019 — Apr. 2019"
|
|
||||||
show="true" %}}
|
|
||||||
|
|
||||||
- Proof of concept for web app that finds the ideal supermarket based on your cart.
|
|
||||||
- Designed responsive front-end layout using **Bootstrap**.
|
|
||||||
- Implemented REST API functionality on backend using **Node.js** and
|
|
||||||
**MongoDB**.
|
|
||||||
- Setup deployment on [**Heroku**][Grocery Finder Heroku].
|
|
||||||
- Led team of 4 as project leader to prioritize and delegate tasks while
|
|
||||||
also implementing a majority of the core features.
|
|
||||||
- Performed code review for team members' pull requests.
|
|
||||||
|
|
||||||
[Grocery Finder Heroku]: http://www.grocery-finder.ml
|
|
||||||
|
|
||||||
{{% /resume/project %}}
|
|
||||||
|
|
||||||
<!--- Grocery Finder }}} -->
|
|
||||||
|
|
||||||
<!--- DigitalOcean {{{ -->
|
|
||||||
|
|
||||||
{{% resume/project name="Personal Server"
|
|
||||||
url="https://kevin-mok.com/server/" date="Aug. 2019 — present" %}}
|
|
||||||
|
|
||||||
- Deployed various web apps with backends such as Node, PHP and Python using
|
|
||||||
**NGINX** on a **Debian** server.
|
|
||||||
- Monitor system resources and perform system maintenance using tmux.
|
|
||||||
- Wrote [**Node.js** script][server script] and [**systemd** service][systemd service]/[timer]
|
|
||||||
to check and display the uptime of my pages every hour.
|
|
||||||
|
|
||||||
[server script]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-status.js
|
|
||||||
[systemd service]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.service
|
|
||||||
[timer]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.timer
|
|
||||||
|
|
||||||
{{% /resume/project %}}
|
|
||||||
|
|
||||||
<!--- DigitalOcean Droplet }}} -->
|
|
||||||
|
|
||||||
<!--- ParsaFood {{{ -->
|
|
||||||
|
|
||||||
{{% resume/project name="ParsaFood"
|
|
||||||
url="https://github.com/Kevin-Mok/ParsaFood" date="Feb. 2018"
|
|
||||||
show="true" %}}
|
|
||||||
|
|
||||||
- **Android** app that reads ingredient labels and detects any dietary
|
|
||||||
restrictions/allergies.
|
|
||||||
- Designed user interface and linked various functionality together.
|
|
||||||
- Made during a 24-hour [food-themed hackathon][Platterz Hackathon event]
|
|
||||||
in a group with two other members. Came in 2<sup>nd</sup> place and won
|
|
||||||
an [Oculus Rift][Oculus Rift Amazon].
|
|
||||||
|
|
||||||
[Parsafood repo]: https://github.com/Kevin-Mok/ParsaFood
|
|
||||||
[Platterz Hackathon event]:
|
|
||||||
https://www.eventbrite.com/e/platterz-hackathon-tickets-42682237722
|
|
||||||
[Oculus Rift Amazon]: https://www.amazon.ca/Oculus-Rift-Windows-VR-Headset/dp/B00VF0IXEY/ref=sr_1_1_sspa?ie=UTF8&qid=1520422949&sr=8-1-spons&keywords=oculus+rift&psc=1
|
|
||||||
|
|
||||||
{{% /resume/project %}}
|
|
||||||
|
|
||||||
<!--- ParsaFood }}} -->
|
|
||||||
23
content/resume/points-plain-text.md
Normal file
23
content/resume/points-plain-text.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Red Hat
|
||||||
|
1. Reduced deployment time by 66% by implementing ability to deploy locally-compiled binaries onto Kubernetes/OpenShift using only command-line (Kubernetes/GoLang used for this and three below).
|
||||||
|
2. Implemented ability for Kubernetes operator to fetch data from a deployed service and update config with data to deprecate reliance on startup script.
|
||||||
|
3. Added startup probes to handle starting legacy application containers that require additional startup time.
|
||||||
|
4. Refactored probes to have default values assigned based on deployed YAML while also fixing reconciliation issues.
|
||||||
|
5. Rewrote the Jenkins (Groovy) nightly pipeline to run in a GitHub PR using a trigger keyword to test all the team’s submitted PR’s before merging to the main branch.
|
||||||
|
6. Took on tasks and contributed ideas in Agile sprint planning meetings in a team of 12 people.
|
||||||
|
7. Took initiative to write file to define the GitHub parameters for the above pipeline so that it can be recreated easily.
|
||||||
|
8. Took initiative to write documentation on how to get started with the project to onboard new developers and mentored the incoming intern.
|
||||||
|
|
||||||
|
# Rarity Surf
|
||||||
|
1. Web app to give rarity rankings to NFT’s and check which are listed on the OpenSea marketplace using their API.
|
||||||
|
2. Reverse engineered the ranking algorithm to match the leading rarity ranking site’s rankings (scraped using Selenium) with a discrepancy of <0.25%.
|
||||||
|
3. Used app to frontrun purchases of top 0.5% rarity NFT’s against competing buyers.
|
||||||
|
4. Wrote Django (Python) backend to fetch metadata from IPFS, store rarity rankings in PostgreSQL and serve rarity data using GraphQL.
|
||||||
|
5. Wrote React frontend with hooks to dynamically load rarity data. Styled with Tailwind.
|
||||||
|
|
||||||
|
# AWS
|
||||||
|
1. Deployed various web apps using Docker (Compose) on an AWS EC2 Debian/Linux server.
|
||||||
|
2. Created Kubernetes manifest files to quickly recreate my server setup with persistent storage/restarts and open ports.
|
||||||
|
3. Created Terraform files to deploy an AWS EC2 instance and Docker containers.
|
||||||
|
4. Used Amazon Route 53’s DNS and NGINX to route subdomains to each web application.
|
||||||
|
5. Wrote a JavaScript server script and systemd service/timer to display the uptime of my pages every hour.
|
||||||
8
content/resume/skills.md
Normal file
8
content/resume/skills.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
# DevOps
|
||||||
|
AWS, Kubernetes, Terraform, Docker (Compose), Jenkins, Groovy, Go(Lang), Bash, **Linux**, **JavaScript**, **React**, **Python**, **Django**, Node.js, PostgreSQL, MongoDB, Solidity, C, **Git**, **Command Line**
|
||||||
|
|
||||||
|
# Web Dev
|
||||||
|
**JavaScript**, **React**, **Python**, **Django**, Node.js, PostgreSQL, MongoDB, Bash, **Git**, **Linux**, **Command Line**, Go(Lang), AWS, Kubernetes, Terraform, Docker (Compose), Jenkins, Groovy, Solidity, C
|
||||||
|
|
||||||
|
# Python
|
||||||
|
**Python**, **Django**, **Linux**, **Git**, AWS, Kubernetes, Docker (Compose), Ansible, Jenkins, Selenium, Terraform, Go(Lang), PostgreSQL, **Command Line**, Groovy, Bash, **JavaScript**, **React**, Node.js, MongoDB, Solidity, C
|
||||||
@@ -1,14 +1,16 @@
|
|||||||
---
|
---
|
||||||
title: "Server Apps"
|
title: "Server Apps"
|
||||||
date: 2019-09-22
|
date: 2024-06-10
|
||||||
draft: false
|
draft: false
|
||||||
layout: single
|
layout: single
|
||||||
js: ["server-table"]
|
js: ["server-table"]
|
||||||
---
|
---
|
||||||
Here is a list of apps that I am running on my [DigitalOcean
|
Here is a list of apps that I am running on my [AWS EC2][AWS EC2 info]
|
||||||
|
Debian instance/[DigitalOcean
|
||||||
droplet][do-droplet]. Their [statuses] are updated every hour using a
|
droplet][do-droplet]. Their [statuses] are updated every hour using a
|
||||||
[Node.js script][update-script] and a [systemd service]/[timer].
|
[Node.js script][update-script] and a [systemd service]/[timer].
|
||||||
|
|
||||||
|
[AWS EC2 info]: https://aws.amazon.com/pm/ec2/?gclid=CjwKCAjwyJqzBhBaEiwAWDRJVA8xkzlFBVRieWU_oiTxnHHfRgTnfN9WlnYON3UptS4aTtjaYRbVJRoCju8QAvD_BwE&trk=8c0f4d22-7932-45ae-9a50-7ec3d0775c47&sc_channel=ps&ef_id=CjwKCAjwyJqzBhBaEiwAWDRJVA8xkzlFBVRieWU_oiTxnHHfRgTnfN9WlnYON3UptS4aTtjaYRbVJRoCju8QAvD_BwE:G:s&s_kwcid=AL!4422!3!472464674288!e!!g!!aws%20ec2!11346198414!112250790958
|
||||||
[do-droplet]: https://www.digitalocean.com/products/droplets/
|
[do-droplet]: https://www.digitalocean.com/products/droplets/
|
||||||
[statuses]: https://kevin-mok.com/server-apps.json
|
[statuses]: https://kevin-mok.com/server-apps.json
|
||||||
[systemd service]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.service
|
[systemd service]: https://git.kevin-mok.com/Kevin-Mok/server-pages/src/branch/master/server-pages.service
|
||||||
|
|||||||
@@ -6,7 +6,6 @@
|
|||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<!-- <span class="copyright">© {{ .Site.LastChange.Year }} {{ .Site.Title }} - <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></span> -->
|
|
||||||
<div id="footer-row" class="row justify-content-center">
|
<div id="footer-row" class="row justify-content-center">
|
||||||
<span id="footer-content" class="name">
|
<span id="footer-content" class="name">
|
||||||
<span id="copyright" class="col-xs-6">
|
<span id="copyright" class="col-xs-6">
|
||||||
@@ -15,6 +14,13 @@
|
|||||||
<!-- <a href="{{ "credits" | relURL }}">Credits</a> · -->
|
<!-- <a href="{{ "credits" | relURL }}">Credits</a> · -->
|
||||||
</span>
|
</span>
|
||||||
<span id="social-icons" class="col-xs-4">
|
<span id="social-icons" class="col-xs-4">
|
||||||
|
<a href="https://www.linkedin.com/in/Kev-Mok" target="_blank">
|
||||||
|
<img src="{{ "img/social/linkedin.svg" | relURL }}" alt="linkedin-logo">
|
||||||
|
</a>
|
||||||
|
<a href="mailto:me@kevin-mok.com" target="_blank">
|
||||||
|
<img src="{{ "img/social/email.svg" | relURL }}"
|
||||||
|
alt="envelope">
|
||||||
|
·
|
||||||
<a href="https://github.com/Kevin-Mok" target="_blank">
|
<a href="https://github.com/Kevin-Mok" target="_blank">
|
||||||
<img src="{{ "img/social/github.svg" | relURL }}"
|
<img src="{{ "img/social/github.svg" | relURL }}"
|
||||||
alt="github-logo">
|
alt="github-logo">
|
||||||
@@ -36,12 +42,6 @@
|
|||||||
alt="reddit-logo">
|
alt="reddit-logo">
|
||||||
</a>
|
</a>
|
||||||
.
|
.
|
||||||
<a href="https://www.linkedin.com/in/Kev-Mok" target="_blank">
|
|
||||||
<img src="{{ "img/social/linkedin.svg" | relURL }}" alt="linkedin-logo">
|
|
||||||
</a>
|
|
||||||
<a href="mailto:me@kevin-mok.com" target="_blank">
|
|
||||||
<img src="{{ "img/social/email.svg" | relURL }}"
|
|
||||||
alt="envelope">
|
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<span class="col-xs-2">
|
<span class="col-xs-2">
|
||||||
|
|||||||
@@ -20,6 +20,9 @@
|
|||||||
<!-- <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,700" type="text/css"> -->
|
<!-- <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Code+Pro:400,700" type="text/css"> -->
|
||||||
<!-- <link rel='stylesheet' href='//cdn.jsdelivr.net/npm/hack-font@3.3.0/build/web/hack-subset.css'> -->
|
<!-- <link rel='stylesheet' href='//cdn.jsdelivr.net/npm/hack-font@3.3.0/build/web/hack-subset.css'> -->
|
||||||
<!-- <link rel="stylesheet" href="https://meyerweb.com/eric/tools/css/reset/reset.css" type="text/css" media="all" /> -->
|
<!-- <link rel="stylesheet" href="https://meyerweb.com/eric/tools/css/reset/reset.css" type="text/css" media="all" /> -->
|
||||||
|
<!-- href="https://cdn.rawgit.com/dreampulse/computer-modern-web-font/master/fonts.css"> -->
|
||||||
|
<link rel="stylesheet" type="text/css"
|
||||||
|
href="https://cdn.jsdelivr.net/gh/dreampulse/computer-modern-web-font@master/fonts.css">
|
||||||
<link rel="stylesheet" href="{{ "css/style.css" | relURL }}" type="text/css">
|
<link rel="stylesheet" href="{{ "css/style.css" | relURL }}" type="text/css">
|
||||||
{{ $main_sass := resources.Get "sass/main.scss" }}
|
{{ $main_sass := resources.Get "sass/main.scss" }}
|
||||||
{{ $main_style := $main_sass | resources.ToCSS }}
|
{{ $main_style := $main_sass | resources.ToCSS }}
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
<h1 class="site-title">
|
<h1 class="site-title">
|
||||||
<span class="surrounding">[</span><a href="{{ .Site.BaseURL }}"><span class="base08">K</span><span
|
<span class="surrounding"></span><a href="{{ .Site.BaseURL }}">
|
||||||
class="base0f">e</span><span class="base09">v</span><span
|
<span>Kevin Mok</span>
|
||||||
class="base0a">i</span><span class="base0b">n </span><span
|
|
||||||
class="base0c">M</span><span class="base0d">o</span><span
|
|
||||||
class="base0e">k</span></a><span class="surrounding">] # _</span>
|
|
||||||
</h1>
|
</h1>
|
||||||
|
|||||||
@@ -7,12 +7,23 @@
|
|||||||
<a href="https://www.redhat.com/" target="_blank">Red Hat</a>.
|
<a href="https://www.redhat.com/" target="_blank">Red Hat</a>.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
I'm a Computer Science student at the University of
|
I'm graduated University of Toronto as a Computer
|
||||||
Toronto, graduating at the end of 2023 (currently
|
Science Scecialist in 2023.
|
||||||
looking for a full-time position!).
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
I'm greatly interested in all things Linux and
|
I am currently looking for full-time work! You can
|
||||||
|
view
|
||||||
|
<a href="http://localhost:1313/resume/" target="_blank">my resume</a>
|
||||||
|
on my site can
|
||||||
|
reach me on my
|
||||||
|
<a href="https://www.linkedin.com/in/kev-mok" target="_blank">LinkedIn</a>
|
||||||
|
or email me at me at kevin-mok.com.
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
I'm greatly interested in Linux (been using
|
||||||
|
<a href="https://archlinux.org/" target="_blank">Arch Linux </a>
|
||||||
|
|
||||||
|
since 2019) and a supporter of
|
||||||
<a href="https://www.gnu.org/philosophy/floss-and-foss.en.html"
|
<a href="https://www.gnu.org/philosophy/floss-and-foss.en.html"
|
||||||
target="_blank">FOSS/FLOSS</a>.
|
target="_blank">FOSS/FLOSS</a>.
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -6,15 +6,16 @@
|
|||||||
</a>
|
</a>
|
||||||
<p>+</p>
|
<p>+</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="equation-part" id="uoft-part">
|
<div class="equation-part">
|
||||||
<a href="https://www.utoronto.ca/" target="_blank">
|
<a href="https://archlinux.org/" target="_blank">
|
||||||
<img src="{{ "img/home/uoft-logo.svg" | relURL }}" alt="uoft-logo">
|
<!-- <img src="{{ "img/home/gnu.svg" | relURL }}" id="gnu" alt="gnu-logo"> -->
|
||||||
|
<img src="{{ "img/home/arch.svg" | relURL }}" id="gnu" alt="gnu-logo">
|
||||||
</a>
|
</a>
|
||||||
<p>+</p>
|
<p>+</p>
|
||||||
</div>
|
</div>
|
||||||
<div class="equation-part">
|
<div class="equation-part" id="uoft-part">
|
||||||
<a href="https://www.gnu.org/" target="_blank">
|
<a href="https://www.utoronto.ca/" target="_blank">
|
||||||
<img src="{{ "img/home/gnu.svg" | relURL }}" id="gnu" alt="gnu-logo">
|
<img src="{{ "img/home/uoft-logo.svg" | relURL }}" alt="uoft-logo">
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<p>=</p>
|
<p>=</p>
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
<div id="linkedin" class="col text-right">
|
<div id="linkedin" class="col text-right">
|
||||||
<a href="https://www.linkedin.com/in/Kev-Mok" target="_blank">
|
<a href="https://www.linkedin.com/in/Kev-Mok" target="_blank">
|
||||||
<span class="url-info">
|
<span class="url-info">
|
||||||
Kev-Mok
|
linkedin.com/in/Kev-Mok
|
||||||
</span>
|
</span>
|
||||||
<img src="{{ "img/social/linkedin.svg" | relURL }}" alt="linkedin-icon">
|
<img src="{{ "img/social/linkedin.svg" | relURL }}" alt="linkedin-icon">
|
||||||
</a>
|
</a>
|
||||||
@@ -28,11 +28,11 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div id="website" class="col text-right">
|
<div id="website" class="col text-right">
|
||||||
<a href="https://kevin-mok.com/" target="_blank">
|
<a href="https://github.com/Kevin-Mok" target="_blank">
|
||||||
<span class="url-info">
|
<span class="url-info">
|
||||||
kevin-mok.com
|
github.com/Kevin-Mok
|
||||||
</span>
|
</span>
|
||||||
<img src="{{ "img/resume/link.svg" | relURL }}" alt="link-icon">
|
<img src="{{ "img/social/github.svg" | relURL }}" alt="link-icon">
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,17 +1,9 @@
|
|||||||
<div class="project">
|
<div class="project">
|
||||||
<div class="row project-header">
|
<div class="row project-header">
|
||||||
<div class="col-8 text-left">
|
<div class="col-8 text-left">
|
||||||
<a class="project-link" href="{{ .Get "url" }}" target="_blank">
|
|
||||||
<img src="{{ "img/resume/link.svg" | relURL }}" alt="link-icon">
|
|
||||||
</a>
|
|
||||||
<button class="btn" type="button" data-toggle="collapse"
|
|
||||||
data-target="#{{ .Get "name" | lower | urlize }}-details"
|
|
||||||
aria-expanded="false" aria-controls="{{ .Get "name" | lower | urlize }}-details">
|
|
||||||
<h2 class="project-title">
|
<h2 class="project-title">
|
||||||
{{ .Get "name" }}
|
{{ .Get "name" }} <span class="languages"><{{ .Get "languages" }}></span>
|
||||||
<img class="down-triangle" src="{{ "img/resume/down-triangle.png" | relURL }}" alt="link-icon">
|
|
||||||
</h2>
|
</h2>
|
||||||
</button>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-4 text-right date">{{ .Get "date" }}</div>
|
<div class="col-4 text-right date">{{ .Get "date" }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,9 +1,10 @@
|
|||||||
<div class="references">
|
<div class="references">
|
||||||
<span>
|
<span>
|
||||||
See my
|
See my LinkedIn for
|
||||||
<a href="https://www.linkedin.com/in/Kev-Mok"
|
<a href="https://www.linkedin.com/in/kev-mok/details/recommendations/?detailScreenTabIndex=0"
|
||||||
target="_blank">
|
target="_blank">
|
||||||
LinkedIn</a> for references from my Red Hat managers/mentee,
|
references</a> from my
|
||||||
a startup client and a graduate student mentor.
|
Red Hat managers/mentee, a startup client and a graduate
|
||||||
|
student mentor.
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
17
layouts/shortcodes/resume/work-experience.html
Normal file
17
layouts/shortcodes/resume/work-experience.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<div class="work-experience">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-8 text-left">
|
||||||
|
<p class="company">
|
||||||
|
{{ .Get "name" }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="col text-right date">{{ .Get "date" }}</div>
|
||||||
|
</div>
|
||||||
|
<!-- <span class="title"> -->
|
||||||
|
<span class="position">
|
||||||
|
{{ .Get "title" }}
|
||||||
|
</span>
|
||||||
|
<span class="languages">
|
||||||
|
<{{ .Get "languages" }}>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
BIN
static/img/config/desktop-screenshot.png
Normal file
BIN
static/img/config/desktop-screenshot.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.9 MiB |
Submodule static/pdf updated: d7b16226b8...b5d5360bdb
Reference in New Issue
Block a user