Compare commits

...

4 Commits

Author SHA1 Message Date
22f0696ea7 Server: fix duration string, add verbose option 2019-09-23 01:11:52 -04:00
14283b1a33 Server: add information, last updated and uptime 2019-09-22 23:54:33 -04:00
7ec40caf8e Server: (static) apps table
Organized image files.
2019-09-21 23:47:11 -04:00
5f5fd0d0a6 Config: setup base page 2019-09-21 17:40:18 -04:00
29 changed files with 352 additions and 200 deletions

1
.gitignore vendored
View File

@@ -4,3 +4,4 @@ resources/_gen/
themes/base16* themes/base16*
commit-msg.txt commit-msg.txt
static/server-apps.json

View File

@@ -500,6 +500,56 @@ footer {// {{{
}// }}} }// }}}
#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 // TODO: converted up to here
// hero {{{ // // hero {{{ //

View File

@@ -20,9 +20,17 @@ menu:
# - name: posts/ # - name: posts/
# url: /posts # url: /posts
# weight: 6 # weight: 6
- name: server
url: /server
weight: 7
- name: config
url: /config
weight: 10
# - name: credits # - name: credits
# url: /credits # url: /credits
# weight: 10 # weight: 20
# - name: config
# url: /config blackfriday:
plainIDAnchors: true
hrefTargetBlank: true

View File

@@ -1,24 +1,26 @@
--- ---
title: "Config" title: "Linux Config"
date: 2019-02-07T05:05:11-05:00 date: 2019-04-26
draft: true draft: false
layout: single
--- ---
<!--- Intro {{{ --> <!--- Intro {{{ -->
# Kevin's Linux Setup
![desktop-screenshot](https://i.imgur.com/Fpsr8Fc.png) ![desktop-screenshot](https://i.imgur.com/Fpsr8Fc.png)
*Screenshot from my dual-monitor setup.* *Screenshot from my dual-monitor setup.*
This repository contains the dotfiles to increase my workflow efficiency. They This [repository][lc-repo] contains the dotfiles to increase my workflow
are also for my Linux efficiency. They are also for my Linux [rice][ricing_explanation].
[rice](https://www.reddit.com/r/unixporn/comments/3iy3wd/stupid_question_what_is_ricing/cukxwog/).
[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 --> <!--- }}} Intro -->
<!--- 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](txt/nzxt-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
``` ```

View File

@@ -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

View File

@@ -62,7 +62,7 @@ show="true" %}}
- Proof of concept for a web app that finds the best supermarket for - 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 your needs based on the total price of your cart items and distance
form you. from you.
- Responsive front-end using **Bootstrap**. Uses **Node.js** and - Responsive front-end using **Bootstrap**. Uses **Node.js** and
**MongoDB** for back-end. **MongoDB** for back-end.
- Currently deployed on [**Heroku**][Grocery Finder Heroku]. - Currently deployed on [**Heroku**][Grocery Finder Heroku].
@@ -97,7 +97,7 @@ url="https://github.com/Kevin-Mok/SuperADABros" date="May 2019" %}}
- Clone of Super Mario Bros 1-1, but Mario is mobility-impaired and - Clone of Super Mario Bros 1-1, but Mario is mobility-impaired and
uses ramps to get through the level. uses ramps to get through the level.
- Able to played using only head movement by getting input from a - Able to be played using only head movement by getting input from a
face-tracking script (**OpenCV**). face-tracking script (**OpenCV**).
- Implemented in [**Godot**][Godot site], an open-source game engine. - Implemented in [**Godot**][Godot site], an open-source game engine.
- Made during a 24-hour [accessibility-themed hackathon][PC Hacks event]. - Made during a 24-hour [accessibility-themed hackathon][PC Hacks event].

15
content/server/_index.md Normal file
View 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

View File

@@ -1,12 +1,5 @@
# Large # Large
- resume - resume
- expand some projects by default
- repo link (GitHub icon) beside each section
- make links open in new tab
- picture/video links?
- printable white version
- upload PDF
- JS to change CSS?
- make old proj's displayable - make old proj's displayable
- spv - spv
- screenshots - screenshots
@@ -27,21 +20,20 @@
- cd/ls diff. pages - cd/ls diff. pages
# Medium # Medium
- socials in footer - contact page
- icons - icons
- Gitea
- GitHub - GitHub
- Fosstodon
- email - email
- tooltip pop-up with email and clipboard button/link - copy button
- [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) - [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/) - [Native Browser Copy To Clipboard](https://css-tricks.com/native-browser-copy-clipboard/)
- Fosstodon
- pages - pages
- fav. apps - fav. apps
- linux config - linux config
- neofetch on all devices
- credits - credits
- contact?
- site stats - site stats
- size - size
- load time - load time

View File

@@ -1,5 +1,9 @@
</div> </div>
{{- range .Params.js }}
<script src="/{{ . }}.js"></script>
{{- end }}
<footer> <footer>
<div class="container"> <div class="container">
<!-- <span class="copyright">&copy; {{ .Site.LastChange.Year }} {{ .Site.Title }} - <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></span> --> <!-- <span class="copyright">&copy; {{ .Site.LastChange.Year }} {{ .Site.Title }} - <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a></span> -->

View File

@@ -1,24 +1,24 @@
<div class="me-equation"> <div class="me-equation">
<div class="equation-part"> <div class="equation-part">
<a href="https://www.gnu.org/" target="_blank"> <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> </a>
<p>+</p> <p>+</p>
</div> </div>
<div class="equation-part"> <div class="equation-part">
<a href="https://www.wikiwand.com/en/Arch_Linux" target="_blank"> <a href="https://www.wikiwand.com/en/Arch_Linux" target="_blank">
<img src="{{ "img/arch.svg" | relURL }}" alt="linux-logo"> <img src="{{ "img/home/arch.svg" | relURL }}" alt="linux-logo">
<!-- <img src="{{ "img/larbs.png" | relURL }}" alt="linux-logo"> --> <!-- <img src="{{ "img/home/larbs.png" | relURL }}" alt="linux-logo"> -->
</a> </a>
<p>+</p> <p>+</p>
</div> </div>
<div class="equation-part" id="uoft-part"> <div class="equation-part" id="uoft-part">
<a href="https://www.utoronto.ca/" target="_blank"> <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> </a>
<p>=</p> <p>=</p>
</div> </div>
<div class="equation-part"> <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>
</div> </div>

View File

@@ -1,15 +1,15 @@
<div id="contact-info"> <div id="contact-info">
<div id="phone-number"> <div id="phone-number">
<img src="{{ "img/smartphone.svg" | relURL }}" <img src="{{ "img/resume/smartphone.svg" | relURL }}"
alt="smartphone-icon">: alt="smartphone-icon">:
<a href="tel:647-685-2500" target="_blank">647-685-2500</a> <a href="tel:647-685-2500" target="_blank">647-685-2500</a>
</div> </div>
<div id="email"> <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> <a href="mailto:me@kevin-mok.com">me@kevin-mok.com</a>
</div> </div>
<div id="website"> <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> <a href="https://kevin-mok.com/">kevin-mok.com</a>
</div> </div>
</div> </div>

View File

@@ -1,5 +1,5 @@
<div id="print-icon"> <div id="print-icon">
<a href="{{ "resume.pdf" | relURL }}" target="_blank"> <a href="{{ "kevin-mok-resume.pdf" | relURL }}" target="_blank">
<img src="{{ "img/printer.svg" | relURL }}" alt="printer-icon"> <img src="{{ "img/resume/printer.svg" | relURL }}" alt="printer-icon">
</a> </a>
</div> </div>

View 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" . }}

View File

@@ -1,6 +1,6 @@
<div class="project"> <div class="project">
<a class="project-link" href="{{ .Get "url" }}" target="_blank"> <a class="project-link" href="{{ .Get "url" }}" target="_blank">
<img src="{{ "img/link.svg" | relURL }}" alt="link-icon"> <img src="{{ "img/resume/link.svg" | relURL }}" alt="link-icon">
</a> </a>
<button class="btn" type="button" data-toggle="collapse" <button class="btn" type="button" data-toggle="collapse"
data-target="#{{ .Get "name" | lower | urlize }}-details" data-target="#{{ .Get "name" | lower | urlize }}-details"

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 132 KiB

After

Width:  |  Height:  |  Size: 132 KiB

View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 216 KiB

After

Width:  |  Height:  |  Size: 216 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

View File

@@ -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

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View 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
View 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

Binary file not shown.

Binary file not shown.

101
static/server-table.js Normal file
View 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) + '.'
});