summaryrefslogtreecommitdiff
path: root/resume
diff options
context:
space:
mode:
authorAlex Xu (Hello71) <alex_y_xu@yahoo.ca>2021-10-03 15:03:42 -0400
committerAlex Xu (Hello71) <alex_y_xu@yahoo.ca>2021-10-03 15:03:42 -0400
commit7dccf6e8684f767b6e377d627b36ccf493947f1e (patch)
tree4859d4e1a24ea2028de1366bc59cd28e6782a6d1 /resume
downloadalxu.ca-7dccf6e8684f767b6e377d627b36ccf493947f1e.tar.xz
alxu.ca-7dccf6e8684f767b6e377d627b36ccf493947f1e.zip
Initial commit
Diffstat (limited to 'resume')
-rw-r--r--resume/resume.css241
-rw-r--r--resume/resume.html230
-rw-r--r--resume/resume.js51
3 files changed, 522 insertions, 0 deletions
diff --git a/resume/resume.css b/resume/resume.css
new file mode 100644
index 0000000..04c8431
--- /dev/null
+++ b/resume/resume.css
@@ -0,0 +1,241 @@
+@font-face {
+ font-family: "EB Garamond";
+ src: url(EBGaramond-Regular.subset.woff2);
+}
+
+@font-face {
+ font-family: "EB Garamond";
+ font-weight: 500;
+ src: url(EBGaramond-Medium.subset.woff2);
+}
+
+@font-face {
+ font-family: "EB Garamond";
+ font-style: italic;
+ src: url(EBGaramond-Italic.subset.woff2);
+}
+
+* {
+ box-sizing: border-box;
+}
+body {
+ margin: .8em auto;
+ max-width: 90%;
+ width: 50em;
+ position: relative;
+ left: clamp(-2em,calc(25em - 45%),0em);
+ display: grid;
+ grid-template-columns: auto auto;
+
+ font-family: "EB Garamond", serif;
+ font-size: 16px;
+ line-height: 1.38;
+ overflow-wrap: break-word;
+ text-rendering: optimizeLegibility;
+ background: #fff;
+ color: #333;
+}
+
+address, .right {
+ align-self: center;
+}
+.left {
+ padding-right: .9rem;
+ text-align: right;
+ color: #246d84;
+}
+.right {
+ border-left: solid 3px #246d84;
+ padding: .2rem 0 0 1rem;
+}
+/* firefox prints grid margin wrong */
+.gap {
+ margin-top: .8rem;
+ grid-column: 1/-1;
+}
+.entry-header > :nth-child(1) {
+ flex: 60%;
+ max-width: max-content;
+ margin-right: auto;
+}
+.taddr {
+ grid-row: 1;
+ align-self: center;
+}
+b {
+ font-weight: 500;
+ font-size: 1.1em;
+}
+.date {
+ text-align: right;
+ margin-left: 1.2em;
+ max-width: max-content;
+ flex: 10 0 auto;
+ width: min-content;
+}
+.title {
+ line-height: 1.22;
+}
+.entry-header {
+ display: flex;
+}
+section + section {
+ margin-top: .7em;
+}
+address, .h1s {
+ color: #666;
+}
+address {
+ font-size: .9em;
+}
+.icon {
+ vertical-align: middle;
+ margin-bottom: .5ex;
+}
+h1, h2, h3, h4, p, ul {
+ margin: 0;
+}
+h1, h2, h3, h4 {
+ font-weight: normal;
+}
+h1 {
+ font-size: 3em;
+ margin-top: -.5ex;
+}
+h4 {
+ display: inline;
+}
+ul {
+ padding: 0;
+ list-style: none;
+}
+ul:not(.fakelist) > li {
+ margin-left: .1em;
+ /* separate list-style-type for safari <14.1 support */
+ list-style-type: '◦ ';
+ list-style-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' height='7.1' width='7.1' fill='none' stroke='%233873b3' stroke-width='1.1'><circle cx='3.55' cy='3.55' r='3'/></svg>");
+ list-style-position: inside;
+}
+a {
+ color: #06c;
+ text-decoration: none;
+}
+a:visited {
+ color: #0f00b0;
+}
+.date-punct, .hide, .printcol {
+ display: none;
+}
+.nb {
+ display: inline-block;
+}
+abbr {
+ text-decoration: none;
+}
+.h1s {
+ font-size: 1.4em;
+ font-style: italic;
+}
+@media (min-width: 25em) {
+ .left-heavy-columns {
+ columns: 2 14em;
+ margin-right: -1.4em;
+ }
+}
+@media (max-width: 30em) {
+ body {
+ display: block;
+ }
+ h1 {
+ margin-bottom: -.2ex;
+ }
+ .h1s {
+ margin-bottom: .6ex;
+ }
+ .title, .left address {
+ text-align: center;
+ }
+ .left address {
+ columns: 2;
+ }
+ .left {
+ text-align: center;
+ padding: 0;
+ min-width: 0;
+ }
+ .left:not(.taddr) {
+ border-bottom: solid;
+ margin-bottom: .2rem;
+ }
+ .gap {
+ margin-bottom: 1rem;
+ }
+ .right {
+ border-left: none;
+ padding: 0;
+ }
+ .title {
+ padding: 0;
+ }
+ .nb {
+ display: initial;
+ }
+}
+@media (max-width: 21em) {
+ header, .entry-header {
+ display: block;
+ }
+ .date {
+ text-align: left;
+ margin: 0;
+ width: auto;
+ }
+ .date-punct {
+ display: inline;
+ }
+}
+@media print {
+ .noprint {
+ display: none;
+ }
+ body {
+ position: static;
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ max-width: 100%;
+ font-size: 13px;
+ line-height: 1.28;
+ color: #000;
+ -webkit-print-color-adjust: exact;
+ }
+ /* workaround: safari doesn't support css columns in print */
+ .left-heavy-columns {
+ display: none;
+ }
+ .printcol {
+ display: inline-block;
+ }
+ section + section {
+ margin-top: .6em;
+ }
+ /* override print color for firefox */
+ address, .h1s {
+ color: transparent;
+ text-shadow: 0 0 #555;
+ }
+ address svg {
+ color: #555;
+ }
+}
+@media (prefers-contrast: high) {
+ .h1s, address {
+ color: #555;
+ }
+}
+@media (prefers-contrast: low) {
+ body {
+ background: #ccc;
+ }
+}
+@page { margin: 7mm 26mm 7mm 18mm; }
diff --git a/resume/resume.html b/resume/resume.html
new file mode 100644
index 0000000..982ded8
--- /dev/null
+++ b/resume/resume.html
@@ -0,0 +1,230 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <title>Alex Xu's Resume</title>
+ <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
+ <link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
+ <link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
+ <meta name="description" content="Generalist software developer with experience in Linux, C, Python, networking.">
+ <link rel="stylesheet" href="resume.css">
+</head>
+<body>
+ <div id="ie" style="font-size:2em;display:none">
+ Internet Explorer does not support the web standards used on this page. Please upgrade to a modern browser such as <a href="https://firefox.com">Mozilla Firefox</a>, <a href="https://microsoft.com/edge">Microsoft Edge</a>, or <a href="https://google.com/chrome">Google Chrome</a>.
+ </div>
+ <div class="right title">
+ <h1>Alex Xu</h1>
+ <p class="h1s">Generalist software developer</p>
+ </div>
+ <div class="left taddr">
+ <address>
+ <ul class="fakelist">
+ <li>
+ <svg class="icon" role="img" height="12" width="12" fill="none" stroke="currentcolor" stroke-linejoin="round" stroke-width="1.1">
+ <title>Location:</title>
+ <path aria-hidden="true" d="m1.5 4.4999967 4.5-3.50000004 4.5 3.50000004v5.5a1 1 0 0 1 -1 1.0000003h-7a1 1 0 0 1 -1-1.0000003z"/>
+ <path aria-hidden="true" d="m4.5 11v-5h3v5"/>
+ </svg>
+ Toronto, Canada<br>(open to remote, reloc)
+ </li>
+ <li>
+ <svg class="icon" role="img" height="12" width="12" fill="none" stroke="currentcolor" stroke-width="1.1">
+ <title>Email:</title>
+ <path aria-hidden="true" d="m2 2h8c.55 0 1 .45 1 1v6c0 .55-.45 1-1 1h-8c-.55 0-1-.45-1-1v-6c0-.55.45-1 1-1z"/>
+ <path aria-hidden="true" d="m11 3-5 3.5-5-3.5"/>
+ </svg>
+ <!-- remember to update print js below -->
+ <a href="javascript:location=['ca','.','alxu','@','alex',':','mailto'].reverse().join('');void 0">
+ <span style="display:inline">alex</span>&#64;alxu<span class="hide"> DELETE ME </span>.ca
+ </a>
+ </li>
+ </ul>
+ </address>
+ </div>
+ <div class="gap"></div>
+ <h2 class="left">Education</h2>
+ <div class="right">
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b>Lassonde School of Engineering, B.Sc., <abbr title="Honours">Hons.</abbr> Computer Science</b>, <i class="nb">York University</i>, GPA: 7.7/9.0 (A).</h4></div>
+ <div class="date"><b>Sept.&nbsp;2016&ndash;May&nbsp;2020</b><span class="date-punct">:</span></div>
+ </div>
+ <ul class="left-heavy-columns">
+ <li>Advanced Object Oriented Programming (A+)</li>
+ <li>Design and Analysis of Algorithms (A+)</li>
+ <li>Fundamentals of Data Structures (A+)</li>
+ <li>Computer Architecture (A)</li>
+ <li>Database Management Systems (A+)</li>
+ <li>Applied Cryptography (A+)</li>
+ <li>Mathematics of Cryptography (A)</li>
+ <li>Network Security (A+)</li>
+ </ul>
+ <ul class="printcol" style="width:21em">
+ <li>Advanced Object Oriented Programming (A+)</li>
+ <li>Design and Analysis of Algorithms (A+)</li>
+ <li>Fundamentals of Data Structures (A+)</li>
+ <li>Computer Architecture (A)</li>
+ </ul>
+ <ul class="printcol" style="width:16em">
+ <li>Database Management Systems (A+)</li>
+ <li>Applied Cryptography (A+)</li>
+ <li>Mathematics of Cryptography (A)</li>
+ <li>Network Security (A+)</li>
+ </ul>
+ </section>
+ </div>
+ <div class="gap"></div>
+ <h2 class="left">Work</h2>
+ <div class="right">
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b>Ethica Channel Enablement Inc</b>, <i>Network Engineer</i>.</h4></div>
+ <div class="date"><b>Dec.&nbsp;2018&ndash;Oct.&nbsp;2019</b><span class="date-punct">:</span></div>
+ </div>
+ <p>Developed several core projects and provided extensive consulting on C, Linux, git, and networking.</p>
+ <ul>
+ <li>built a Buildroot-based minimal Linux infrastructure for the launch of a multi-link VPN product</li>
+ <li>created a fully automated high-speed operating system installer for x86 systems using BusyBox sh</li>
+ <li>created a tool for remote Linux in-place replacement using POSIX sh and BusyBox</li>
+ <li>developed a GitLab CI process for generating the deployable image</li>
+ </ul>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b>York University</b>, <i>Undergraduate Student Research Award researcher</i>.</h4></div>
+ <div class="date"><b>May&ndash;Aug. 2018</b><span class="date-punct">:</span></div>
+ </div>
+ <p>Co-developed a Django web platform for worldwide crowdsourced hydrographic data collaboration.</p>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b>York University</b>, <i>Teaching assistant</i>.</h4></div>
+ <div class="date"><b>June&ndash;July 2017</b><span class="date-punct">:</span></div>
+ </div>
+ <p>Taught lab sessions for 48-student Android/web development course.</p>
+ </section>
+ </div>
+ <div class="gap"></div>
+ <div class="left">
+ <h2>Community</h2>
+ <address>
+ <ul class="fakelist">
+ <li>
+ <svg class="icon" role="img" height="12" width="12" fill="none" stroke="currentcolor" stroke-linecap="round" stroke-width="1.1">
+ <title>cgit:</title>
+ <path aria-hidden="true" d="m8 9 3-3-3-3 M4 3 l-3 3 3 3"/>
+ </svg>
+ <a href="https://cgit.alxu.ca/">cgit.alxu.ca</a>
+ </li>
+ <li>
+ <svg class="icon" role="img" height="12" width="12" fill="none" stroke="currentcolor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.1">
+ <title>GitHub:</title>
+ <path aria-hidden="true" d="m4.625 9.7566971c-2.5.75-2.5-1.25-3.5-1.5m7 3v-1.935a1.685 1.685 0 0 0 -.47-1.305c1.57-.175 3.22-.77 3.22-3.5a2.72 2.72 0 0 0 -.75-1.875 2.535 2.535 0 0 0 -.045-1.885s-.59-.175-1.955.74a6.69 6.69 0 0 0 -3.5 0c-1.365-.915-1.955-.74-1.955-.74a2.535 2.535 0 0 0 -.045 1.885 2.72 2.72 0 0 0 -.75 1.89c0 2.71 1.65 3.305 3.22 3.5a1.685 1.685 0 0 0 -.47 1.29v1.935"/>
+ </svg>
+ <a href="https://github.com/Hello71">gh/Hello71</a> <span style="font-style: normal">[</span><a href="https://github.com/search?q=type%3Apr+author%3AHello71&amp;s=created">PRs</a><span style="font-style: normal">]</span>
+ </li>
+ </ul>
+ </address>
+ </div>
+ <div class="right">
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b><a href="https://alpinelinux.org/">Alpine Linux</a></b></h4></div>
+ <div class="date"><b>March 2020&ndash;present</b><span class="date-punct">:</span></div>
+ </div>
+ <p><a href="https://gitlab.alpinelinux.org/groups/alpine/-/issues?state=all&amp;author_username=alxu">Reported</a>, documented, and <a href="https://gitlab.alpinelinux.org/groups/alpine/-/merge_requests?author_username=alxu&amp;state=all">contributed fixes</a> for issues including <a href="https://wiki.alpinelinux.org/wiki/Release_Notes_for_Alpine_3.14.0#faccessat2">Operation not permitted in Docker</a>, <a href="https://github.com/alpinelinux/docker-alpine/issues/134">sh: write error: Invalid argument</a>, and <a href="https://gitlab.alpinelinux.org/alpine/aports/-/issues/12368">Raspberry Pi doesn't boot, 7 blinks</a>. <a href="https://lists.alpinelinux.org/~alpine/devel/?search=from%3A%22Alex+Xu%22">Proposed changes</a> including <a href="https://lists.alpinelinux.org/~alpine/devel/%3C1628515011.zujvcn248v.none%40localhost%3E">-fno-plt for x86 and x86_64</a>, <a href="https://lists.alpinelinux.org/~alpine/devel/%3C1593702164.2nw55qdomr.none%40localhost%3E">compressing debuginfo</a>, and <a href="https://lists.alpinelinux.org/~alpine/devel/%3C1593625212.dirkptm3b0.none%40localhost%3E">reconsidering -Os</a>.</p>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b><a href="https://gitlab.freedesktop.org/glvnd/libglvnd">libglvnd</a></b></h4></div>
+ <div class="date"><b>September 2021</b><span class="date-punct">:</span></div>
+ </div>
+ <p><a href="https://gitlab.freedesktop.org/glvnd/libglvnd/-/merge_requests/249">Implemented correct global-dynamic TLS support, fixing musl compatibility.</a></p>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b><a href="https://www.winehq.org/">Wine</a></b></h4></div>
+ <div class="date"><b>July 2021</b><span class="date-punct">:</span></div>
+ </div>
+ <p><a href="https://www.winehq.org/pipermail/wine-devel/2021-July/191267.html">Implemented copy_file_range support, shrinking Wine prefixes from 200 MB to less than 1 MB.</a></p>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b>Linux kernel</b></h4></div>
+ <div class="date"><b>2012&ndash;present</b><span class="date-punct">:</span></div>
+ </div>
+ <p>Reported issues and submitted fixes: <a href="https://lore.kernel.org/lkml/?q=f%3A%22Alex+Xu%22">lkml</a>, <a href="https://linuxlists.cc/profile/47355/Alex_Xu">linuxlists</a>. Diagnosed <a href="https://github.com/rust-lang/cargo/issues/9739">Cargo issue 9739</a> to <a href="https://lore.kernel.org/lkml/1628086770.5rn8p04n6j.none@localhost/">a long-standing kernel bug</a>, and <a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=46c4c9d1beb7f5b4cec4dd90e7728720583ee348">fixed the underlying issue</a>, resolving a deadlock in GNU Make and similar jobservers.</p>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b><a href="https://qemu.org/">QEMU</a></b></h4></div>
+ <div class="date"><b>December 2020</b><span class="date-punct">:</span></div>
+ </div>
+ <p>Discovered and reported <a href="https://nvd.nist.gov/vuln/detail/CVE-2020-35517">an issue allowing full host device access from guests with virtiofsd enabled</a>.</p>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b><a href="https://cgit.alxu.ca/wfs.git/">wfs</a></b></h4></div>
+ <div class="date"><b>June 2020</b><span class="date-punct">:</span></div>
+ </div>
+ <p>Built a concurrent Python web font subsetter with automatic pixel-perfect verification.</p>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b><a href="https://cgit.alxu.ca/cgit-syntax-highlighting.git">cgit-syntax-highlighting</a></b></h4></div>
+ <div class="date"><b>March 2020</b><span class="date-punct">:</span></div>
+ </div>
+ <p>Built a concurrent Python pygments microservice, reducing TTFB from 1.1s to 0.15s on <a href="https://cgit.alxu.ca/">cgit.alxu.ca</a>. Improved portability and security and reduced LOC by 66% by <a href="https://cgit.alxu.ca/cgit-syntax-highlighting.git/commit/?id=bbbbafd21b1cade042d57c90cc70df682df28e6d">switching from http.server to aiohttp</a>.</p>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b><a href="https://cgit.alxu.ca/udpastcp.git">udpastcp</a></b></h4></div>
+ <div class="date"><b>July&nbsp;2016</b><span class="date-punct">:</span></div>
+ </div>
+ <p>Built a C tunnel to simulate datagrams using TCP packets, fixing TCP-over-TCP overhead.</p>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b><a href="https://github.com/Dwarf-Therapist/Dwarf-Therapist">Dwarf Therapist</a></b></h4></div>
+ <div class="date"><b>Aug.&nbsp;2014&ndash;Sept.&nbsp;2017</b><span class="date-punct">:</span></div>
+ </div>
+ <p><a href="https://github.com/Dwarf-Therapist/Dwarf-Therapist/commits?author=Hello71">Implemented cross-bit ptrace, migrated from qmake to CMake, and refactored code</a>.</p>
+ </section>
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b><a href="https://sourceforge.net/projects/simpregedit/">Simple Registry Editor</a></b></h4></div>
+ <div class="date"><b>Sept.&nbsp;2008</b><span class="date-punct">:</span></div>
+ </div>
+ <p>Built a minimal .NET registry editor.</p>
+ </section>
+ </div>
+ <div class="gap"></div>
+ <h2 class="left noprint">Personal</h2>
+ <div class="right noprint">
+ <section class="entry">
+ <div class="entry-header">
+ <div><h4><b>Resume</b></h4></div>
+ <div class="date"><b>June&nbsp;2020</b><span class="date-punct">:</span></div>
+ </div>
+ <p>Rewrote my resume from LaTeX to modern web standards:</p>
+ <ul>
+ <li>significantly improved mobile-friendliness and blind accessibility using standard HTML and CSS</li>
+ <li>reduced transfer size from 390 kB to 30 kB using aggressive inlining and font subsetting</li>
+ <li>optimized loading time by minimizing size and reducing round trips using HTTP/2 server push</li>
+ </ul>
+ </section>
+ </div>
+ <div class="gap noprint"></div>
+ <h2 class="left" style="font-size: 1.4em">Skills</h2>
+ <div class="right">
+ <p>Alpine, Debian Linux; FreeBSD; Docker; Git; NGINX; WireGuard; TCP/IP; HTTP(S); DNS; SSH</p>
+ </div>
+ <h3 class="left">Programming</h3>
+ <div class="right">
+ <p>C; C++; Go; Python; bash, POSIX sh; GNU make; HTML; CSS; JavaScript; SQL</p>
+ </div>
+ <script src="resume.js"></script>
+</body>
+</html>
diff --git a/resume/resume.js b/resume/resume.js
new file mode 100644
index 0000000..3f33976
--- /dev/null
+++ b/resume/resume.js
@@ -0,0 +1,51 @@
+(function(w, d, a){
+ 'use strict';
+ if (d.documentMode)
+ ie.style.display = "block";
+ else
+ ie.parentNode.removeChild(ie);
+ const css = d.styleSheets[0];
+ if (w.safari) {
+ css.insertRule("@page{margin:10mm}", css.cssRules.length);
+ css.insertRule("@media print{body{margin:-2mm 0 -2mm 0;padding:0 15mm 0 7mm}}", css.cssRules.length);
+ }
+ else if (w.chrome)
+ css.insertRule("@page{margin-top:auto;margin-bottom:auto}", css.cssRules.length);
+ let t, p = [];
+ const f = () => {
+ clearTimeout(t);
+ navigator.sendBeacon('/analytics', new Blob([JSON.stringify(p)], {type: 'application/json'}));
+ p = [];
+ };
+ const q = (kind, details) => {
+ clearTimeout(t);
+ p.push({created_ts: Date.now(), kind: kind, details: details});
+ t = setTimeout(f, 2000);
+ };
+ q('l', '');
+ d[a]('visibilitychange', () => {
+ const vs = d.visibilityState;
+ q('v', vs);
+ if (vs === 'hidden')
+ f();
+ });
+ d[a]('click', e => {
+ const a = e.target.closest('a');
+ if (a)
+ q('c', a.href);
+ });
+ w[a]('beforeprint', () => {
+ for (let el of d.getElementsByTagName('a')) {
+ const h = el.href.replace(/javascript:location=(.*);void 0/, '$1');
+ el.setAttribute('data-href', el.href);
+ if (h != el.href) el.href = eval(h);
+ else el.href = "https://alxu.ca/analytics?url=" + el.href.replace(/%/g, '%25').replace(/&/g, '%26').replace(/;/g, '%3B');
+ }
+ });
+ w[a]('afterprint', function () {
+ for (let el of d.getElementsByTagName('a')) {
+ el.href = el.getAttribute('data-href');
+ el.removeAttribute('data-href');
+ }
+ });
+}(window, document, 'addEventListener'));