Compare commits
4 Commits
resume-pdf
...
drafts
| Author | SHA1 | Date | |
|---|---|---|---|
|
22f0696ea7
|
|||
|
14283b1a33
|
|||
|
7ec40caf8e
|
|||
|
5f5fd0d0a6
|
1
.gitignore
vendored
@@ -4,3 +4,4 @@ resources/_gen/
|
||||
themes/base16*
|
||||
|
||||
commit-msg.txt
|
||||
static/server-apps.json
|
||||
|
||||
@@ -82,18 +82,17 @@ $phone-width: 800px;
|
||||
|
||||
// general elements {{{ //
|
||||
|
||||
// $background-color: #2d2d2d;
|
||||
// $color: #f2f0ec;
|
||||
$background-color: white;
|
||||
$color: black;
|
||||
$background-color: #2d2d2d;
|
||||
$color: #f2f0ec;
|
||||
// $background-color: white;
|
||||
// $color: black;
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background-color: $background-color;
|
||||
color: $color;
|
||||
line-height: 1.5;
|
||||
// font-size: 100%;
|
||||
font-size: 1.1em;
|
||||
font-size: 100%;
|
||||
/* font-family: 'Source Code Pro', monospace; */
|
||||
font-family: 'Hack', monospace;
|
||||
display: flex;
|
||||
@@ -415,7 +414,6 @@ footer {// {{{
|
||||
} */// }}}
|
||||
|
||||
#print-icon {// {{{
|
||||
display: none;
|
||||
float: right;
|
||||
|
||||
img {
|
||||
@@ -429,7 +427,6 @@ footer {// {{{
|
||||
@include vert-padding-rem(0.5);
|
||||
display: flex;
|
||||
align-content: center;
|
||||
// font-size: 1.25em;
|
||||
|
||||
div {
|
||||
flex-grow: 1;
|
||||
@@ -449,24 +446,7 @@ footer {// {{{
|
||||
}
|
||||
}// }}}
|
||||
|
||||
@page {
|
||||
size: letter;
|
||||
}
|
||||
// @media print {
|
||||
// @page {
|
||||
// margin: 0;
|
||||
// size: letter;
|
||||
// }
|
||||
|
||||
// body {
|
||||
// padding: 1in;
|
||||
// }
|
||||
// }
|
||||
|
||||
#resume {// {{{
|
||||
// font-size: 1.1em;
|
||||
// font-size: 1em;
|
||||
|
||||
a {
|
||||
text-decoration: none;
|
||||
&:hover {
|
||||
@@ -476,8 +456,6 @@ footer {// {{{
|
||||
|
||||
h1 {
|
||||
color: $base-orange;
|
||||
margin-top: .9em;
|
||||
font-size: 1.75em;
|
||||
}
|
||||
|
||||
.date {
|
||||
@@ -491,7 +469,6 @@ footer {// {{{
|
||||
h2 {
|
||||
color: $base-sky-blue;
|
||||
display: inline;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
img {
|
||||
@@ -516,11 +493,61 @@ footer {// {{{
|
||||
}
|
||||
}
|
||||
|
||||
[id^="details-"] {
|
||||
margin-top: .5em;
|
||||
// [id^="details-"] {
|
||||
// margin-top: .5em;
|
||||
// }
|
||||
}
|
||||
|
||||
}// }}}
|
||||
|
||||
#server {// {{{
|
||||
.body {
|
||||
@include vert-padding-rem(.5);
|
||||
}
|
||||
|
||||
h1 {
|
||||
margin-bottom: .25em;
|
||||
}
|
||||
|
||||
// table {
|
||||
// margin-top: 1.75em;
|
||||
// }
|
||||
|
||||
th, td {
|
||||
@include vert-padding-rem(.4);
|
||||
@include side-padding-rem(.5);
|
||||
border: 1px solid rgba(160, 159, 147, .5);
|
||||
}
|
||||
|
||||
th {
|
||||
color: $base-orange;
|
||||
text-align: center;
|
||||
font-size: 1.3em;
|
||||
}
|
||||
|
||||
td {
|
||||
font-size: .9em;
|
||||
|
||||
}
|
||||
|
||||
.description {
|
||||
font-size: .85em;
|
||||
}
|
||||
|
||||
.status {
|
||||
text-align: center;
|
||||
|
||||
img {
|
||||
height: 2em;
|
||||
}
|
||||
}
|
||||
|
||||
#time-info {
|
||||
padding-top: 1em;
|
||||
font-size: .75em;
|
||||
font-style: italic;
|
||||
color: $base03;
|
||||
}
|
||||
}// }}}
|
||||
|
||||
// TODO: converted up to here
|
||||
@@ -529,8 +556,8 @@ footer {// {{{
|
||||
|
||||
h1.site-title {// {{{
|
||||
text-align: center;
|
||||
// font-size: 4.8em;
|
||||
font-size: 5.5em;
|
||||
/* font-size: 3.5em; */
|
||||
font-size: 4.8em;
|
||||
// color: #66cccc;
|
||||
color: $base05;
|
||||
margin-top: 1rem;
|
||||
@@ -541,13 +568,15 @@ h1.site-title {// {{{
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
// @media (max-width: $max-page-width) {
|
||||
// font-size: 3em;
|
||||
// }
|
||||
@media (max-width: $max-page-width) {
|
||||
font-size: 3em;
|
||||
}
|
||||
|
||||
// @media (max-width: $phone-width) {
|
||||
// font-size: 2em;
|
||||
// }
|
||||
@media (max-width: $phone-width) {
|
||||
// font-size: 3em;
|
||||
// font-size: 2.5em;
|
||||
font-size: 2em;
|
||||
}
|
||||
}// }}}
|
||||
|
||||
.hero-logo img {
|
||||
@@ -632,42 +661,42 @@ h1.site-title {// {{{
|
||||
// article.single {{{ //
|
||||
|
||||
article.single {
|
||||
.meta {
|
||||
font-size: 0.9em;
|
||||
text-align: right;
|
||||
margin-top: .5rem;
|
||||
margin-bottom: .5rem;
|
||||
.meta {
|
||||
font-size: 0.9em;
|
||||
text-align: right;
|
||||
margin-top: .5rem;
|
||||
margin-bottom: .5rem;
|
||||
|
||||
.key {
|
||||
color: #747369;
|
||||
}
|
||||
.key {
|
||||
color: #747369;
|
||||
}
|
||||
|
||||
.val {
|
||||
.val {
|
||||
color: #cc99cc;
|
||||
|
||||
a {
|
||||
color: #cc99cc;
|
||||
|
||||
a {
|
||||
color: #cc99cc;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.body {
|
||||
padding-top: 1rem;
|
||||
padding-bottom: 3rem;
|
||||
}
|
||||
|
||||
@media (max-width: $max-page-width) {
|
||||
.meta {
|
||||
padding-left: 2rem;
|
||||
padding-right: 2rem;
|
||||
}
|
||||
|
||||
.body {
|
||||
padding-top: 1rem;
|
||||
padding-bottom: 3rem;
|
||||
padding-top: .5rem;
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
|
||||
@media (max-width: $max-page-width) {
|
||||
.meta {
|
||||
padding-left: 2rem;
|
||||
padding-right: 2rem;
|
||||
}
|
||||
|
||||
.body {
|
||||
padding-top: .5rem;
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
14
config.yaml
@@ -20,9 +20,17 @@ menu:
|
||||
# - name: posts/
|
||||
# url: /posts
|
||||
# weight: 6
|
||||
- name: server
|
||||
url: /server
|
||||
weight: 7
|
||||
- name: config
|
||||
url: /config
|
||||
weight: 10
|
||||
# - name: credits
|
||||
# url: /credits
|
||||
# weight: 10
|
||||
# - name: config
|
||||
# url: /config
|
||||
# weight: 20
|
||||
|
||||
blackfriday:
|
||||
plainIDAnchors: true
|
||||
hrefTargetBlank: true
|
||||
|
||||
|
||||
@@ -1,27 +1,29 @@
|
||||
---
|
||||
title: "Config"
|
||||
date: 2019-02-07T05:05:11-05:00
|
||||
draft: true
|
||||
title: "Linux Config"
|
||||
date: 2019-04-26
|
||||
draft: false
|
||||
layout: single
|
||||
---
|
||||
<!--- Intro {{{ -->
|
||||
# Kevin's Linux Setup
|
||||
|
||||

|
||||
*Screenshot from my dual-monitor setup.*
|
||||
|
||||
This repository contains the dotfiles to increase my workflow efficiency. They
|
||||
are also for my Linux
|
||||
[rice](https://www.reddit.com/r/unixporn/comments/3iy3wd/stupid_question_what_is_ricing/cukxwog/).
|
||||
This [repository][lc-repo] contains the dotfiles to increase my workflow
|
||||
efficiency. They are also for my Linux [rice][ricing_explanation].
|
||||
|
||||
[lc-repo]: https://git.kevin-mok.com/Kevin-Mok/linux-config
|
||||
[ricing_explanation]: https://www.reddit.com/r/unixporn/comments/3iy3wd/stupid_question_what_is_ricing/cukxwog/
|
||||
<!--- }}} Intro -->
|
||||
|
||||
<!--- Main Programs {{{ -->
|
||||
## Main Programs
|
||||
* **OS**: [Arch Linux](https://www.archlinux.org/) ([packages](txt/nzxt-pkgs.txt))
|
||||
```
|
||||
> systemd-analyze
|
||||
Startup finished in 2.341s (kernel) + 1.085s (userspace) = 3.426s
|
||||
graphical.target reached after 1.085s in userspace
|
||||
```
|
||||
```
|
||||
$ systemd-analyze
|
||||
Startup finished in 2.341s (kernel) + 1.085s (userspace) = 3.426s
|
||||
graphical.target reached after 1.085s in userspace
|
||||
```
|
||||
* **Terminal**: [rxvt-unicode-pixbuf](https://www.wikiwand.com/en/Rxvt)
|
||||
* **Shell**: [Zsh](http://zsh.sourceforge.net/) + [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh)
|
||||
* **Window Manager**: [i3-gaps](https://github.com/Airblader/i3)
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
---
|
||||
title: "Server Apps"
|
||||
date: 2019-09-03T12:31:45-04:00
|
||||
draft: true
|
||||
---
|
||||
- Baikal
|
||||
- Gitea
|
||||
- Synapse
|
||||
- Taskserver
|
||||
- haste-server
|
||||
- liteshort
|
||||
- personal site
|
||||
- spv
|
||||
- twem
|
||||
@@ -32,13 +32,37 @@ url="https://github.com/Kevin-Mok/spotify-lib-vis" date="July 2018" show="true"
|
||||
|
||||
<!--- Spotify Graphs }}} -->
|
||||
|
||||
<!--- 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.
|
||||
- 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].
|
||||
- Came up with the idea based on [personal experience][Parsafood motivation].
|
||||
|
||||
[Parsafood repo]: https://github.com/Kevin-Mok/ParsaFood
|
||||
[Parsafood motivation]: https://github.com/Kevin-Mok/ParsaFood#motivation
|
||||
[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 }}} -->
|
||||
|
||||
<!--- Grocery Finder {{{ -->
|
||||
|
||||
{{% resume/project name="Grocery Finder"
|
||||
url="https://github.com/Kevin-Mok/grocery-finder" date="April 2019"
|
||||
show="true" %}}
|
||||
|
||||
- Proof of concept for a web app that finds the best supermarket for your needs.
|
||||
- Proof of concept for a web app that finds the best supermarket for
|
||||
your needs based on the total price of your cart items and distance
|
||||
from you.
|
||||
- Responsive front-end using **Bootstrap**. Uses **Node.js** and
|
||||
**MongoDB** for back-end.
|
||||
- Currently deployed on [**Heroku**][Grocery Finder Heroku].
|
||||
@@ -52,27 +76,6 @@ show="true" %}}
|
||||
|
||||
<!--- Grocery Finder }}} -->
|
||||
|
||||
<!--- 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.
|
||||
- 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
|
||||
[Parsafood motivation]: https://github.com/Kevin-Mok/ParsaFood#motivation
|
||||
[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 }}} -->
|
||||
|
||||
<!--- TrapBot {{{ -->
|
||||
|
||||
{{% resume/project name="TrapBot"
|
||||
@@ -80,10 +83,31 @@ url="https://github.com/Kevin-Mok/TrapBot" date="March 2018" %}}
|
||||
|
||||
- reddit bot that looks for comments with song names and responds with
|
||||
their respective SoundCloud links.
|
||||
- Received positive feedback from users who saw the bot's posts.
|
||||
- Uses __Python__ API wrappers for SoundCloud and reddit.
|
||||
|
||||
{{% /resume/project %}}
|
||||
|
||||
<!--- Grocery Finder }}} -->
|
||||
|
||||
<!--- Super ADA Bros. {{{ -->
|
||||
|
||||
{{% resume/project name="Super ADA Bros"
|
||||
url="https://github.com/Kevin-Mok/SuperADABros" date="May 2019" %}}
|
||||
|
||||
- Clone of Super Mario Bros 1-1, but Mario is mobility-impaired and
|
||||
uses ramps to get through the level.
|
||||
- Able to be played using only head movement by getting input from a
|
||||
face-tracking script (**OpenCV**).
|
||||
- Implemented in [**Godot**][Godot site], an open-source game engine.
|
||||
- Made during a 24-hour [accessibility-themed hackathon][PC Hacks event].
|
||||
|
||||
[PC Hacks event]: https://pchacks19.devpost.com/
|
||||
[Godot site]: https://godotengine.org
|
||||
|
||||
{{% /resume/project %}}
|
||||
|
||||
|
||||
<!--- Grocery Finder }}} -->
|
||||
|
||||
{{% /resume/section %}}<!--- }}} -->
|
||||
|
||||
@@ -1,17 +1,3 @@
|
||||
<!--- TrapBot {{{ -->
|
||||
|
||||
{{% resume/project name="TrapBot"
|
||||
url="https://github.com/Kevin-Mok/TrapBot" date="March 2018" %}}
|
||||
|
||||
- reddit bot that looks for comments with song names and responds with
|
||||
their respective SoundCloud links.
|
||||
- Received positive feedback from users who saw the bot's posts.
|
||||
- Uses __Python__ API wrappers for SoundCloud and reddit.
|
||||
|
||||
{{% /resume/project %}}
|
||||
|
||||
<!--- Grocery Finder }}} -->
|
||||
|
||||
<!--- Super ADA Bros. {{{ -->
|
||||
|
||||
{{% resume/project name="Super ADA Bros"
|
||||
@@ -19,8 +5,7 @@ url="https://github.com/Kevin-Mok/SuperADABros" date="May 2019" %}}
|
||||
|
||||
- Clone of Super Mario Bros 1-1, but Mario is mobility-impaired and
|
||||
uses ramps to get through the level.
|
||||
- Able to be played using only head movement by getting input from
|
||||
a
|
||||
- Able to played using only head movement by getting input from a
|
||||
face-tracking script (**OpenCV**).
|
||||
- Implemented in [**Godot**][Godot site], an open-source game engine.
|
||||
- Made during a 24-hour [accessibility-themed hackathon][PC Hacks event].
|
||||
@@ -30,5 +15,6 @@ url="https://github.com/Kevin-Mok/SuperADABros" date="May 2019" %}}
|
||||
|
||||
{{% /resume/project %}}
|
||||
|
||||
<!--- }}} -->
|
||||
|
||||
<!--- Grocery Finder }}} -->
|
||||
|
||||
|
||||
@@ -1,7 +1,4 @@
|
||||
- bg colors
|
||||
- site title max width
|
||||
- font size
|
||||
- resume
|
||||
- details top margin
|
||||
- print icon
|
||||
- project shortcode
|
||||
- switch project shortcode
|
||||
- rm details top margin
|
||||
|
||||
15
content/server/_index.md
Normal file
@@ -0,0 +1,15 @@
|
||||
---
|
||||
title: "Server Apps"
|
||||
date: 2019-09-22
|
||||
draft: false
|
||||
layout: single
|
||||
js: ["server-table"]
|
||||
---
|
||||
Here is a list of apps that I am running a my [DigitalOcean
|
||||
droplet][do-droplet]. Their statuses are updated every hour using a
|
||||
[Node.js script][update-script] and a [systemd service]/[timer].
|
||||
|
||||
[do-droplet]: https://www.digitalocean.com/products/droplets/
|
||||
[update-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
|
||||
17
ideas.md
@@ -1,8 +1,6 @@
|
||||
# Large
|
||||
- resume
|
||||
- make old proj's displayable
|
||||
- change to km.com URL's
|
||||
- change URL param to repo name
|
||||
- spv
|
||||
- screenshots
|
||||
- setup instructions
|
||||
@@ -22,21 +20,20 @@
|
||||
- cd/ls diff. pages
|
||||
|
||||
# Medium
|
||||
- socials in footer
|
||||
- contact page
|
||||
- icons
|
||||
- Gitea
|
||||
- GitHub
|
||||
- email
|
||||
- copy button
|
||||
- [Copying Text to Clipboard in HTML & JavaScript](https://www.youtube.com/watch?v=NHg6jQajaMs)
|
||||
- [Native Browser Copy To Clipboard](https://css-tricks.com/native-browser-copy-clipboard/)
|
||||
- Fosstodon
|
||||
- email
|
||||
- tooltip pop-up with email and clipboard button/link
|
||||
- [Pure CSS Tooltips](https://www.youtube.com/watch?v=hAeQ8CqrGDY)
|
||||
- use position element
|
||||
- [Copying Text to Clipboard in HTML & JavaScript](https://www.youtube.com/watch?v=NHg6jQajaMs)
|
||||
- [Native Browser Copy To Clipboard](https://css-tricks.com/native-browser-copy-clipboard/)
|
||||
- pages
|
||||
- fav. apps
|
||||
- linux config
|
||||
- neofetch on all devices
|
||||
- credits
|
||||
- contact?
|
||||
- site stats
|
||||
- size
|
||||
- load time
|
||||
|
||||
@@ -1,5 +1,9 @@
|
||||
</div>
|
||||
|
||||
{{- range .Params.js }}
|
||||
<script src="/{{ . }}.js"></script>
|
||||
{{- end }}
|
||||
|
||||
<footer>
|
||||
<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> -->
|
||||
|
||||
@@ -1,24 +1,24 @@
|
||||
<div class="me-equation">
|
||||
<div class="equation-part">
|
||||
<a href="https://www.gnu.org/" target="_blank">
|
||||
<img src="{{ "img/gnu.svg" | relURL }}" id="gnu" alt="gnu-logo">
|
||||
<img src="{{ "img/home/gnu.svg" | relURL }}" id="gnu" alt="gnu-logo">
|
||||
</a>
|
||||
<p>+</p>
|
||||
</div>
|
||||
<div class="equation-part">
|
||||
<a href="https://www.wikiwand.com/en/Arch_Linux" target="_blank">
|
||||
<img src="{{ "img/arch.svg" | relURL }}" alt="linux-logo">
|
||||
<!-- <img src="{{ "img/larbs.png" | relURL }}" alt="linux-logo"> -->
|
||||
<img src="{{ "img/home/arch.svg" | relURL }}" alt="linux-logo">
|
||||
<!-- <img src="{{ "img/home/larbs.png" | relURL }}" alt="linux-logo"> -->
|
||||
</a>
|
||||
<p>+</p>
|
||||
</div>
|
||||
<div class="equation-part" id="uoft-part">
|
||||
<a href="https://www.utoronto.ca/" target="_blank">
|
||||
<img src="{{ "img/uoft-logo.svg" | relURL }}" alt="uoft-logo">
|
||||
<img src="{{ "img/home/uoft-logo.svg" | relURL }}" alt="uoft-logo">
|
||||
</a>
|
||||
<p>=</p>
|
||||
</div>
|
||||
<div class="equation-part">
|
||||
<img src="{{ "img/hexatar.png" | relURL }}" id="hexatar" alt="my-avatar">
|
||||
<img src="{{ "img/home/hexatar.png" | relURL }}" id="hexatar" alt="my-avatar">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
<div id="contact-info">
|
||||
<div id="phone-number">
|
||||
<img src="{{ "img/smartphone.svg" | relURL }}"
|
||||
<img src="{{ "img/resume/smartphone.svg" | relURL }}"
|
||||
alt="smartphone-icon">:
|
||||
<a href="tel:647-685-2500" target="_blank">647-685-2500</a>
|
||||
</div>
|
||||
<div id="email">
|
||||
<img src="{{ "img/envelope.svg" | relURL }}" alt="envelope-icon">:
|
||||
<img src="{{ "img/resume/envelope.svg" | relURL }}" alt="envelope-icon">:
|
||||
<a href="mailto:me@kevin-mok.com">me@kevin-mok.com</a>
|
||||
</div>
|
||||
<div id="website">
|
||||
<img src="{{ "img/link.svg" | relURL }}" alt="link-icon">:
|
||||
<img src="{{ "img/resume/link.svg" | relURL }}" alt="link-icon">:
|
||||
<a href="https://kevin-mok.com/">kevin-mok.com</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<div id="print-icon">
|
||||
<a href="{{ "resume.pdf" | relURL }}" target="_blank">
|
||||
<img src="{{ "img/printer.svg" | relURL }}" alt="printer-icon">
|
||||
<a href="{{ "kevin-mok-resume.pdf" | relURL }}" target="_blank">
|
||||
<img src="{{ "img/resume/printer.svg" | relURL }}" alt="printer-icon">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
20
layouts/server/single.html
Normal file
@@ -0,0 +1,20 @@
|
||||
{{ partial "base/header.html" . }}
|
||||
|
||||
{{ partial "base/site-title.html" . }}
|
||||
|
||||
{{ partial "base/nav-bar.html" . }}
|
||||
|
||||
{{ partial "base/base16-logo.html" . }}
|
||||
|
||||
<main role="main" id="server">
|
||||
{{ partial "base/article.html" . }}
|
||||
<table>
|
||||
</table>
|
||||
<div id="time-info">
|
||||
<!-- <p id="last-updated">Last updated: <span id="last-updated-time"></span></p> -->
|
||||
<!-- <p id="server-uptime">Server Uptime: <span id="server-uptime-time"></span></p> -->
|
||||
Last updated: <span id="last-updated-time"></span> Server Uptime: <span id="server-uptime-time">
|
||||
</div>
|
||||
</main>
|
||||
|
||||
{{ partial "base/footer.html" . }}
|
||||
@@ -1,16 +0,0 @@
|
||||
<div class="project">
|
||||
<a class="project-link" href="{{ .Get "url" }}" target="_blank">
|
||||
<img src="{{ "img/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">{{ .Get "name" }} ⏷</h2>
|
||||
</button>
|
||||
<div class="date">{{ .Get "date" }}</div>
|
||||
<div class="collapse{{ with .Get "show" }} show{{ end }}" id="{{ .Get "name" | lower | urlize }}-details">
|
||||
<div>
|
||||
{{ .Inner }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1,11 +1,14 @@
|
||||
<div class="project">
|
||||
<h2 class="project-title">
|
||||
<a href="{{ .Get "url" }}" target="_blank">
|
||||
{{ .Get "name" }}
|
||||
</a>
|
||||
</h2>
|
||||
<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">{{ .Get "name" }} ⏷</h2>
|
||||
</button>
|
||||
<div class="date">{{ .Get "date" }}</div>
|
||||
<div class="collapse show" id="details-{{ .Get "name" | lower | urlize }}">
|
||||
<div class="collapse{{ with .Get "show" }} show{{ end }}" id="{{ .Get "name" | lower | urlize }}-details">
|
||||
<div>
|
||||
{{ .Inner }}
|
||||
</div>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 132 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 216 KiB After Width: | Height: | Size: 216 KiB |
|
Before Width: | Height: | Size: 56 KiB |
@@ -1,116 +0,0 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512.002 512.002" style="enable-background:new 0 0 512.002 512.002;" xml:space="preserve">
|
||||
<g>
|
||||
<path style="fill:#FFFFFF;" d="M259.345,110.181c-0.076-0.789-0.112-1.578-0.112-2.369c0-11.578,7.584-20.997,16.903-20.997
|
||||
c9.537,0,17.007,9.223,17.007,20.997c0,2.666-0.401,5.236-1.148,7.61c2.795-4.442,4.412-10.032,4.412-15.892
|
||||
c0-14.079-9-25.535-20.06-25.535c-11.063,0-20.06,11.455-20.06,25.535c0,3.461,0.542,6.849,1.615,10.099
|
||||
C258.369,109.807,258.851,109.992,259.345,110.181z"/>
|
||||
<path style="fill:#FFFFFF;" d="M209.407,87.924c0.604-0.092,1.157-0.134,1.707-0.134c7.418,0,14.069,7.281,15.812,17.311
|
||||
c0.175,1.1,0.285,2.196,0.334,3.277c0.482-0.245,0.972-0.475,1.471-0.688c0.245-1.739,0.364-3.369,0.364-5.006
|
||||
c0-12.986-6.879-23.957-15.019-23.957c-6.933,0-12.775,7.636-14.44,17.95C201.532,91.973,204.993,88.657,209.407,87.924z"/>
|
||||
<path style="fill:#FFFFFF;" d="M349.093,349.859c1.865-7.908,5.575-28.1,2.063-52.525c-4.438-30.87-47.875-126.994-55.35-137.727
|
||||
c-4.36,0.609-15.946,7.304-25.342,12.733c-10.896,6.295-22.166,12.807-29.829,15.019c-1.6,0.453-3.273,0.677-4.997,0.677
|
||||
c-11.199,0-23.32-9.468-31.135-16.926c-1.365,14.472-9.078,32.835-17.423,42.273c-5.271,6.045-9.982,19.854-14.538,33.21
|
||||
c-4.22,12.367-8.583,25.157-13.925,33.592c-10.809,16.842-17.009,49.555-9.144,68.159c3.806,9.018,17.62,19.668,29.807,29.062
|
||||
c14.905,11.491,27.776,21.413,29.196,31.419c1.657,11.831-4.635,18.388-10.927,21.497l15.961,18.263
|
||||
c2.466,0.374,8.405,1.091,17.712,1.091c10.886,0,22.97-0.952,35.907-2.834c31.763-4.705,53.886-30.88,58.261-36.438
|
||||
c0.023-7.363,0.248-40.123,2.396-50.366c0.834-3.945,4.037-10.547,16.136-10.547C345.803,349.488,347.594,349.653,349.093,349.859z
|
||||
"/>
|
||||
</g>
|
||||
<g>
|
||||
<path style="fill:#E69629;" d="M210.488,147.081c0.623,2.422,6.136,8.617,14.71,14.242c1.217,0.781,2.359,1.558,3.431,2.286
|
||||
c4.756,3.232,6.871,4.559,10.29,4.098c5.034-0.66,23.579-11.904,31.499-16.706l1.971-1.194c2.949-1.796,5.306-3.023,7.2-4.009
|
||||
c3.75-1.951,4.089-2.266,4.249-2.978c-0.425-1.103-3.926-4.056-10.641-6.364c-2.134-0.764-5.162-1.974-8.67-3.374
|
||||
c-7.589-3.03-17.984-7.176-22.197-7.922c-0.18-0.034-0.349-0.045-0.539-0.045c-3.586,0-10.831,4.499-18.031,11.194
|
||||
C220.211,139.513,213.283,144.92,210.488,147.081z"/>
|
||||
<path style="fill:#E69629;" d="M147.149,395.532c-3.119-5.222-5.815-9.735-7.27-11.984c-5.738-8.931-15.696-18.907-20.442-18.907
|
||||
c-0.416,0-0.635,0.097-0.777,0.181c-2.533,1.442-4.662,5.837-6.723,10.084c-2.847,5.875-6.075,12.535-12.036,16.146
|
||||
c-4.41,2.676-11.152,4.138-17.668,5.555c-4.637,1.007-15.493,3.362-16.003,5.562c-0.703,2.968-0.049,6.033,0.781,9.913
|
||||
c0.977,4.578,2.196,10.274,1.158,17.267c-0.732,4.386-2.063,8.575-3.354,12.627c-1.793,5.637-3.826,12.03-2.073,13.995
|
||||
c2.162,1.909,15.207,4.019,24.731,5.562c11.972,1.937,24.351,3.942,31.932,7.118l2.009,0.846
|
||||
c13.579,5.706,38.854,16.329,51.622,16.329c1.162,0,2.152-0.094,2.951-0.274c2.202-1.482,11.531-8.184,13.284-16.424
|
||||
c2.394-10.619-7.338-23.005-13.349-29.444C169.25,432.519,156.477,411.14,147.149,395.532z"/>
|
||||
<path style="fill:#E69629;" d="M435.761,420.974l-1.556-0.819c-10.688-5.65-16.307-20.984-15.563-32.542
|
||||
c0.139-2.129-0.126-3.78-0.557-5.045c-1.974,3.247-4.793,7.348-8.143,10.697c-5.691,5.692-19.584,11.833-32.105,11.833
|
||||
c-4.67,0-8.927-0.823-12.652-2.448c-12.498-5.451-14.202-21.081-14.234-28.917c-0.185,0.052-0.354,0.112-0.505,0.183
|
||||
c-0.764,2.701-0.024,11.806,0.475,17.935c0.267,3.279,0.542,6.669,0.705,9.78c0.708,13.708-3.658,36.958-7.447,54.049
|
||||
c-3.597,16.732,3.097,28.464,11.224,30.997c0.73,0.232,1.551,0.346,2.453,0.346c7.487,0,19.886-7.749,30.848-19.285
|
||||
c7.788-8.189,25.122-17.04,40.416-24.85c8.622-4.402,17.537-8.956,20.071-11.271c0.564-0.525,0.648-0.819,0.65-0.821
|
||||
C449.681,428.282,439.568,422.972,435.761,420.974z"/>
|
||||
</g>
|
||||
<path d="M461.071,411.093c-15.014-6.147-21.437-14.308-20.816-26.485c0.64-14.212-7.423-24.62-11.252-28.733
|
||||
c2.313-8.837,9.073-39.406,0.007-65.959c-9.743-28.42-39.49-71.825-70.183-114.492c-12.565-17.522-13.159-36.57-13.846-58.625
|
||||
c-0.658-21.036-1.4-44.88-13.131-71.387C319.095,16.55,293.501,0,261.628,0c-18.961,0-38.424,5.926-53.401,16.257
|
||||
c-30.67,21.167-26.616,67.316-23.933,97.851c0.368,4.182,0.713,8.132,0.915,11.504c1.786,29.908,0.161,45.672-1.964,50.463
|
||||
c-1.375,3.131-8.143,12.041-15.306,21.476c-7.408,9.758-15.807,20.816-22.691,31.121c-8.214,12.401-14.845,31.355-21.257,49.684
|
||||
c-4.692,13.411-9.124,26.08-13.438,33.655c-8.177,14.564-6.142,28.145-4.444,34.422c-3.096,2.15-7.568,6.386-11.343,14.366
|
||||
c-4.563,9.736-13.821,14.967-33.072,18.669c-8.847,1.81-14.947,5.53-18.137,11.056c-4.642,8.043-2.113,18.148,0.193,25.056
|
||||
c3.408,10.151,1.284,16.577-2.577,28.246c-0.89,2.691-1.899,5.741-2.921,9.102c-1.61,5.308-1.029,10.131,1.722,14.341
|
||||
c7.27,11.113,28.486,15.033,50.326,17.613c13.04,1.548,27.312,6.763,41.116,11.808c13.525,4.942,27.511,10.054,40.223,11.605
|
||||
c1.932,0.243,3.846,0.364,5.691,0.364c19.194,0,27.866-12.735,30.616-17.967c6.894-1.407,30.673-5.912,55.181-6.518
|
||||
c24.469-0.697,48.143,4.135,54.85,5.635c2.108,4.036,7.667,13.253,16.527,18.004c4.87,2.662,11.647,4.188,18.588,4.188
|
||||
c0.002,0,0,0,0.002,0c7.413,0,21.516-1.753,32.678-13.497c11.133-11.796,38.949-26.859,59.261-37.856
|
||||
c4.533-2.454,8.773-4.751,12.491-6.822c11.41-6.325,17.636-15.362,17.081-24.794C474.141,421.194,468.955,414.322,461.071,411.093z
|
||||
M276.345,73.995c11.061,0,20.06,11.455,20.06,25.535c0,5.859-1.617,11.449-4.412,15.892c0.745-2.374,1.148-4.944,1.148-7.61
|
||||
c0-11.774-7.47-20.997-17.007-20.997c-9.32,0-16.903,9.419-16.903,20.997c0,0.791,0.039,1.58,0.112,2.369
|
||||
c-0.494-0.188-0.975-0.374-1.445-0.552c-1.073-3.25-1.615-6.638-1.615-10.099C256.284,85.451,265.282,73.995,276.345,73.995z
|
||||
M242.329,125.164c4.214,0.744,14.606,4.892,22.197,7.922c3.508,1.4,6.539,2.61,8.67,3.374c6.715,2.308,10.217,5.261,10.641,6.364
|
||||
c-0.159,0.713-0.499,1.027-4.249,2.978c-1.894,0.985-4.25,2.211-7.2,4.009l-1.971,1.194c-7.92,4.803-26.465,16.048-31.499,16.706
|
||||
c-3.42,0.46-5.535-0.868-10.29-4.098c-1.073-0.73-2.214-1.506-3.431-2.286c-8.573-5.627-14.088-11.82-14.71-14.242
|
||||
c2.795-2.16,9.723-7.568,13.27-10.771c7.2-6.695,14.445-11.194,18.031-11.194C241.978,125.117,242.15,125.13,242.329,125.164z
|
||||
M214.073,78.724c8.142,0,15.019,10.97,15.019,23.957c0,1.638-0.118,3.267-0.364,5.006c-0.499,0.213-0.989,0.445-1.471,0.688
|
||||
c-0.049-1.083-0.161-2.177-0.334-3.277c-1.742-10.03-8.394-17.311-15.812-17.311c-0.549,0-1.101,0.042-1.707,0.134
|
||||
c-4.413,0.735-7.875,4.049-9.772,8.751C201.299,86.359,207.142,78.724,214.073,78.724z M189.271,469.128
|
||||
c-1.753,8.241-11.083,14.942-13.284,16.424c-0.799,0.18-1.788,0.274-2.951,0.274c-12.768,0-38.043-10.623-51.622-16.329
|
||||
l-2.009-0.846c-7.583-3.178-19.961-5.18-31.932-7.118c-9.525-1.543-22.568-3.653-24.731-5.562c-1.753-1.966,0.28-8.358,2.073-13.995
|
||||
c1.291-4.052,2.624-8.241,3.354-12.627c1.036-6.993-0.181-12.691-1.158-17.267c-0.829-3.881-1.484-6.945-0.781-9.913
|
||||
c0.51-2.199,11.366-4.554,16.003-5.562c6.518-1.417,13.26-2.879,17.668-5.555c5.961-3.611,9.189-10.27,12.036-16.146
|
||||
c2.061-4.247,4.19-8.642,6.723-10.084c0.143-0.086,0.361-0.181,0.777-0.181c4.746,0,14.704,9.975,20.442,18.907
|
||||
c1.455,2.249,4.151,6.76,7.27,11.984c9.329,15.609,22.102,36.987,28.773,44.151C181.933,446.123,191.664,458.508,189.271,469.128z
|
||||
M327.787,360.037c-2.145,10.243-2.372,43.003-2.396,50.366c-4.375,5.558-26.498,31.732-58.261,36.438
|
||||
c-12.938,1.88-25.019,2.834-35.907,2.834c-9.307,0-15.246-0.719-17.712-1.091l-15.961-18.263
|
||||
c6.292-3.109,12.584-9.666,10.927-21.497c-1.42-10.005-14.291-19.928-29.196-31.419c-12.187-9.394-26.001-20.042-29.807-29.062
|
||||
c-7.865-18.602-1.665-51.315,9.144-68.159c5.342-8.434,9.705-21.225,13.925-33.592c4.556-13.356,9.268-27.166,14.538-33.21
|
||||
c8.345-9.438,16.057-27.801,17.423-42.273c7.814,7.458,19.936,16.926,31.135,16.926c1.724,0,3.398-0.225,4.997-0.677
|
||||
c7.662-2.213,18.931-8.724,29.829-15.019c9.396-5.429,20.982-12.124,25.342-12.733c7.475,10.734,50.912,106.858,55.35,137.727
|
||||
c3.512,24.425-0.198,44.616-2.063,52.525c-1.501-0.206-3.29-0.371-5.17-0.371C331.824,349.488,328.621,356.092,327.787,360.037z
|
||||
M449.194,431.621c-2.533,2.315-11.449,6.869-20.071,11.271c-15.295,7.808-32.631,16.661-40.416,24.85
|
||||
c-10.962,11.536-23.361,19.285-30.848,19.285c-0.901,0-1.722-0.114-2.453-0.346c-8.128-2.533-14.821-14.266-11.224-30.997
|
||||
c3.789-17.093,8.153-40.341,7.447-54.049c-0.163-3.112-0.438-6.502-0.705-9.78c-0.499-6.127-1.239-15.233-0.475-17.935
|
||||
c0.151-0.071,0.319-0.131,0.505-0.183c0.032,7.836,1.734,23.467,14.234,28.917c3.725,1.625,7.982,2.448,12.652,2.448
|
||||
c12.521,0,26.414-6.141,32.105-11.833c3.351-3.349,6.169-7.45,8.143-10.697c0.431,1.264,0.697,2.916,0.557,5.044
|
||||
c-0.744,11.558,4.873,26.891,15.563,32.542l1.556,0.819c3.807,1.996,13.92,7.307,14.083,9.824
|
||||
C449.842,430.801,449.758,431.097,449.194,431.621z"/>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 8.9 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
43
static/img/server/check.svg
Normal file
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 507.2 507.2" style="enable-background:new 0 0 507.2 507.2;" xml:space="preserve">
|
||||
<circle style="fill:#32BA7C;" cx="253.6" cy="253.6" r="253.6"/>
|
||||
<path style="fill:#0AA06E;" d="M188.8,368l130.4,130.4c108-28.8,188-127.2,188-244.8c0-2.4,0-4.8,0-7.2L404.8,152L188.8,368z"/>
|
||||
<g>
|
||||
<path style="fill:#FFFFFF;" d="M260,310.4c11.2,11.2,11.2,30.4,0,41.6l-23.2,23.2c-11.2,11.2-30.4,11.2-41.6,0L93.6,272.8
|
||||
c-11.2-11.2-11.2-30.4,0-41.6l23.2-23.2c11.2-11.2,30.4-11.2,41.6,0L260,310.4z"/>
|
||||
<path style="fill:#FFFFFF;" d="M348.8,133.6c11.2-11.2,30.4-11.2,41.6,0l23.2,23.2c11.2,11.2,11.2,30.4,0,41.6l-176,175.2
|
||||
c-11.2,11.2-30.4,11.2-41.6,0l-23.2-23.2c-11.2-11.2-11.2-30.4,0-41.6L348.8,133.6z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.1 KiB |
46
static/img/server/x.svg
Normal file
@@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
|
||||
<circle style="fill:#E21B1B;" cx="256" cy="256" r="256"/>
|
||||
<path style="fill:#C40606;" d="M510.28,285.304L367.912,142.936L150.248,368.608l140.928,140.928
|
||||
C406.352,493.696,497.056,401.288,510.28,285.304z"/>
|
||||
<g>
|
||||
<path style="fill:#FFFFFF;" d="M354.376,371.536c-5.12,0-10.232-1.952-14.144-5.856L146.408,171.848
|
||||
c-7.816-7.816-7.816-20.472,0-28.28s20.472-7.816,28.28,0L368.52,337.4c7.816,7.816,7.816,20.472,0,28.28
|
||||
C364.608,369.584,359.496,371.536,354.376,371.536z"/>
|
||||
<path style="fill:#FFFFFF;" d="M160.544,371.536c-5.12,0-10.232-1.952-14.144-5.856c-7.816-7.816-7.816-20.472,0-28.28
|
||||
l193.832-193.832c7.816-7.816,20.472-7.816,28.28,0s7.816,20.472,0,28.28L174.688,365.68
|
||||
C170.784,369.584,165.664,371.536,160.544,371.536z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
BIN
static/kevin-mok-resume.pdf
Normal file
101
static/server-table.js
Normal file
@@ -0,0 +1,101 @@
|
||||
const log = console.log
|
||||
|
||||
const headerKeys = {
|
||||
"status": "Status",
|
||||
"url": "URL",
|
||||
"description": "Description",
|
||||
"repo": "Repository"
|
||||
}
|
||||
const keyOrder = ["status", "url", "description", "repo"]
|
||||
|
||||
const generateTableHead = table => {
|
||||
let thead = table.createTHead();
|
||||
let row = thead.insertRow();
|
||||
keyOrder.forEach(key => {
|
||||
let th = document.createElement("th");
|
||||
th.textContent = headerKeys[key];
|
||||
row.appendChild(th);
|
||||
})
|
||||
}
|
||||
|
||||
const generateTable = (table, data) => {
|
||||
data.forEach(elem => {
|
||||
let row = table.insertRow();
|
||||
keyOrder.forEach(key => {
|
||||
const cell = row.insertCell();
|
||||
cell.className = key;
|
||||
const aElem = document.createElement('a')
|
||||
aElem.target = '_blank'
|
||||
switch (key) {
|
||||
case 'status':
|
||||
// cell.textContent = ((elem[key] == 'up') ? '🗸' : '✗')
|
||||
const statusIcon = document.createElement('img')
|
||||
statusIcon.src = '/img/server/' + ((elem[key] == 'up') ? 'check' : 'x') + '.svg'
|
||||
cell.appendChild(statusIcon)
|
||||
break
|
||||
case 'url':
|
||||
aElem.href = elem[key]
|
||||
aElem.textContent = elem['shortUrl']
|
||||
cell.appendChild(aElem)
|
||||
break
|
||||
case 'repo':
|
||||
aElem.href = elem['repoUrl']
|
||||
aElem.textContent = elem[key]
|
||||
cell.appendChild(aElem)
|
||||
break
|
||||
default:
|
||||
cell.textContent = elem[key]
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
const getDurationSince = (date, verbose) => {
|
||||
const milli = Math.abs(Date.now() - date)
|
||||
let mins = Math.floor(milli/1000/60)
|
||||
const days = Math.floor(mins/60/24)
|
||||
mins %= 60*24
|
||||
const hours = Math.floor(mins/60)
|
||||
mins %= 60
|
||||
|
||||
let dayString = ''
|
||||
let hourString = ''
|
||||
let minString = ''
|
||||
if (days > 0) {
|
||||
dayString += days
|
||||
if (!verbose) {
|
||||
dayString += 'd '
|
||||
} else {
|
||||
dayString += (days == 1) ? ' day' : ' days'
|
||||
dayString += ', '
|
||||
}
|
||||
}
|
||||
if (hours > 0) {
|
||||
hourString += hours
|
||||
if (!verbose) {
|
||||
hourString += 'h '
|
||||
} else {
|
||||
hourString += (hours == 1) ? ' hour' : ' hours'
|
||||
hourString += ', '
|
||||
}
|
||||
}
|
||||
minString += (mins > 0) ? mins: '0'
|
||||
if (!verbose) {
|
||||
minString += 'm'
|
||||
} else {
|
||||
minString += (mins == 1) ? ' minute' : ' minutes'
|
||||
}
|
||||
return dayString + hourString + minString
|
||||
}
|
||||
|
||||
fetch("/server-apps.json")
|
||||
.then(response => response.json())
|
||||
.then(json => {
|
||||
let table = document.querySelector("table");
|
||||
generateTable(table, json['sites']);
|
||||
generateTableHead(table);
|
||||
document.querySelector('#last-updated-time').textContent =
|
||||
getDurationSince(new Date(json['updateTime']), false) + ' ago.'
|
||||
document.querySelector('#server-uptime-time').textContent =
|
||||
getDurationSince(new Date(json['upSince']), true) + '.'
|
||||
});
|
||||