commit ce2ae8c1a1fb3292abe1515f09dea620476b3ae8
parent df9b5013eb4bad248177dab6739d075a7deabfbd
Author: gracefu <81774659+gracefuu@users.noreply.github.com>
Date: Thu, 10 Apr 2025 01:59:00 +0800
New blog
Diffstat:
25 files changed, 675 insertions(+), 0 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1 @@
+public/
diff --git a/Makefile b/Makefile
@@ -0,0 +1,145 @@
+# BunnyCDN Uploader Makefile
+
+# Dependencies
+#
+# - make
+# - jq
+# - sha256sum
+# - tr, sed
+# - curl
+
+# Usage:
+#
+# 1) Enter your storage zone name and password
+# 2) If you want to purge your pullzone automatically after upload,
+# enter your pull zone ID and API password
+# 3) Set UPLOAD to the list of files you want on the CDN
+# - e.g. if you want https://---.b-cdn.net/hello/world.html to exist,
+# then 'hello/world.html' should be one of the SOURCES.
+# - Typically this should just be 'find . -type f'
+# 4) Set CLEAN to the list of directories you want clean from the CDN
+# - e.g. if 'hello/...' no longer exists locally,
+# and you want https://---.b-cdn.net/hello/... to be deleted,
+# then 'hello' should be one of the CLEAN.
+# - Typically this should just be 'find . -type d'
+# 5) Set LOCALPATH to be the path you want to upload files from.
+# - e.g. if you have 'hello/world.html' in SOURCES,
+# and it is stored in ./public/hello/world.html on the filesystem,
+# then set LOCALPATH to 'public'
+
+# Notes:
+#
+# - Ensure TMPPATH does not exist. You may change this if you wish.
+# - Make sure your make parallelism isn't set too high
+# or you may run into BunnyCDN's API limits.
+
+# Limitations:
+#
+# - Paths cannot contain spaces, because Makefile.
+# Use %20 instead, and name the file with %20 locally.
+# It will show up as a space in BunnyCDN.
+
+STORAGENAME=blog-grace-moe
+STORAGEPASSWORD=$(shell secret-tool lookup owner blog-grace-moe.b-cdn.net)
+
+PULLZONEID=3580820
+APIPASSWORD=$(shell secret-tool lookup owner grace@bunny.net)
+
+UPLOAD=$(shell cd '$(LOCALPATH)' && find . -type f)
+CLEAN=$(shell cd '$(LOCALPATH)' && find . -type d)
+LOCALPATH=public
+
+TMPPATH=.bunny-tmp
+
+################################################################################
+
+# Set Make stuff
+
+.PHONY: all upload clean nothing \
+ $(TMPPATH)/contents/%/contents \
+ $(TMPPATH)/clean/% $(TMPPATH)/cleanfile/% $(TMPPATH)/cleandir/% \
+ $(TMPPATH)/upload/%
+
+.SECONDEXPANSION:
+.SHELLFLAGS:=-eou pipefail -c
+.ONESHELL:
+
+MAKEFLAGS=--no-print-directory -s
+
+PULLZONEID?=
+APIPASSWORD?=
+
+# Hashing of filenames
+# We use this to generate a unique filename for storing into .bunny-tmp
+hash=$(shell sha256sum <<<'$1' | cut -d' ' -f1)
+
+STORAGEURL='https://sg.storage.bunnycdn.com/$(STORAGENAME)'
+STORAGECMD=curl -H 'AccessKey: $(STORAGEPASSWORD)' -s
+PURGEURL='https://api.bunny.net/pullzone/$(PULLZONEID)/purgeCache'
+APICMD=curl -H 'AccessKey: $(APIPASSWORD)' -s
+
+all: upload clean
+ rm -rf $(TMPPATH)
+ if [ -n '$(PULLZONEID)' ]; then
+ $(APICMD) -XPOST '$(PURGEURL)' && echo 'Purged.'
+ fi
+
+upload: $(addprefix $(TMPPATH)/upload/,$(UPLOAD))
+clean: $(addprefix $(TMPPATH)/clean/,$(CLEAN))
+nothing:
+
+$(TMPPATH)/contents/%/contents:
+ # Get dir contents from bunny, and
+ # Delete any files or directories on bunny that don't exist locally
+ mkdir -p '$(@D)'
+ # echo + download '$(shell sed 's_[^/]*/__' <<<'$*')'
+ $(STORAGECMD) '$(STORAGEURL)/$(shell sed 's_^[^/]*/__' <<<'$*')/' >'$@'
+ echo - download '$(shell sed 's_[^/]*/__' <<<'$*')'
+
+$(TMPPATH)/clean/%: $(TMPPATH)/contents/$$(call hash,$$*)/$$*/contents
+ # echo + clean '$(*)'
+ $(MAKE) nothing $$(<'$<' jq -r '"$(TMPPATH)/cleanfile/$(*)/" +
+ (arrays | .[] | select(.IsDirectory == false).ObjectName)')
+ $(MAKE) nothing $$(<'$<' jq -r '"$(TMPPATH)/cleandir/$(*)/" +
+ (arrays | .[] | select(.IsDirectory == true).ObjectName)')
+ echo - clean '$(*)'
+
+$(TMPPATH)/cleanfile/%: $(TMPPATH)/contents/$$(call hash,$$(*D))/$$(*D)/contents
+ # echo + cleanfile '$(*)'
+ if ! [ -f '$(LOCALPATH)/$(*)' ]; then
+ echo Deleting file '$(*)'
+ $(STORAGECMD) -XDELETE '$(STORAGEURL)/$(*)'
+ echo
+ fi | tac | tac
+ # echo - cleanfile '$(*)'
+
+$(TMPPATH)/cleandir/%: $(TMPPATH)/contents/$$(call hash,$$(*D))/$$(*D)/contents
+ # echo + cleandir '$(*)'
+ if ! [ -d '$(LOCALPATH)/$(*)' ]; then
+ echo Deleting dir '$(*)'
+ $(STORAGECMD) -XDELETE '$(STORAGEURL)/$(*)'/
+ echo
+ fi | tac | tac
+ # echo - cleandir '$(*)'
+
+$(TMPPATH)/upload/%: $(TMPPATH)/contents/$$(call hash,$$(*D))/$$(*D)/contents
+ # Using dir contents, upload any files that have the wrong hash
+ # echo + upload '$(*)'
+ diff >/dev/null \
+ <(<'$<' jq -r 'arrays | .[] |
+ select(.ObjectName == "$(notdir $@)").Checksum'
+ ) \
+ <(<'$(LOCALPATH)/$(*)' \
+ sha256sum |
+ tr '[:lower:]' '[:upper:]' |
+ sed 's/ .*//'
+ ) || (
+ echo uploading '$(*)'
+ $(STORAGECMD) -T'$(LOCALPATH)/$(*)' '$(STORAGEURL)/$(*)'
+ echo
+ ) | tac |tac
+ echo - upload '$(*)'
+
+.PHONY: install-Mathjax;
+install-Mathjax:
+ rsync --delete --delete-excluded --exclude '/*svg*.js' --exclude '/*mml*.js' --exclude '/*full*.js' --exclude '/adaptors' -a MathJax/es5/ static/mathjax/
diff --git a/assets/docs/POPL-2025-SRC-Grace-Tan-Extended-Abstract.pdf b/assets/docs/POPL-2025-SRC-Grace-Tan-Extended-Abstract.pdf
Binary files differ.
diff --git a/assets/icons/android-chrome-192x192.png b/assets/icons/android-chrome-192x192.png
Binary files differ.
diff --git a/assets/icons/android-chrome-512x512.png b/assets/icons/android-chrome-512x512.png
Binary files differ.
diff --git a/assets/icons/apple-touch-icon.png b/assets/icons/apple-touch-icon.png
Binary files differ.
diff --git a/assets/icons/browserconfig.xml b/assets/icons/browserconfig.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<browserconfig>
+ <msapplication>
+ <tile>
+ <square150x150logo src="/icons/mstile-150x150.png"/>
+ <TileColor>#603cba</TileColor>
+ </tile>
+ </msapplication>
+</browserconfig>
diff --git a/assets/icons/favicon-16x16.png b/assets/icons/favicon-16x16.png
Binary files differ.
diff --git a/assets/icons/favicon-32x32.png b/assets/icons/favicon-32x32.png
Binary files differ.
diff --git a/assets/icons/favicon.ico b/assets/icons/favicon.ico
Binary files differ.
diff --git a/assets/icons/mstile-150x150.png b/assets/icons/mstile-150x150.png
Binary files differ.
diff --git a/assets/icons/safari-pinned-tab.svg b/assets/icons/safari-pinned-tab.svg
@@ -0,0 +1,33 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
+ "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
+<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
+ width="512.000000pt" height="512.000000pt" viewBox="0 0 512.000000 512.000000"
+ preserveAspectRatio="xMidYMid meet">
+<metadata>
+Created by potrace 1.14, written by Peter Selinger 2001-2017
+</metadata>
+<g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)"
+fill="#000000" stroke="none">
+<path d="M2349 5116 c-2 -2 -34 -7 -70 -10 -37 -3 -98 -10 -135 -17 -38 -6
+-78 -13 -89 -14 -35 -5 -227 -55 -305 -80 -220 -69 -456 -187 -670 -334 -36
+-25 -70 -50 -77 -55 -7 -6 -18 -15 -25 -21 -39 -30 -126 -103 -144 -120 -11
+-11 -46 -44 -77 -73 -32 -29 -57 -55 -57 -58 0 -2 -17 -21 -37 -42 -84 -83
+-254 -314 -324 -439 -66 -117 -148 -293 -179 -383 -12 -36 -26 -74 -31 -85
+-31 -73 -91 -330 -104 -445 -17 -145 -20 -198 -20 -380 0 -292 13 -400 75
+-650 31 -125 96 -319 111 -335 5 -5 9 -15 9 -22 0 -20 124 -264 167 -331 20
+-31 46 -73 56 -92 11 -19 23 -37 27 -40 4 -3 18 -21 31 -40 13 -20 30 -42 36
+-50 102 -125 130 -158 149 -176 13 -12 20 -25 17 -28 -4 -3 -2 -6 3 -6 5 0 53
+-42 106 -93 53 -50 109 -102 125 -114 15 -13 44 -35 63 -50 19 -16 36 -31 38
+-35 2 -5 8 -8 13 -8 5 0 39 -22 76 -49 141 -101 377 -222 578 -293 102 -37
+291 -90 360 -101 232 -39 263 -41 505 -42 255 0 307 4 520 41 107 19 288 72
+430 126 109 41 322 144 371 178 15 11 30 20 33 20 22 0 284 195 379 283 23 20
+45 37 49 37 4 0 8 6 8 14 0 8 9 18 20 21 11 3 20 10 20 14 0 4 24 32 53 62
+209 219 399 517 510 804 60 154 116 349 133 464 3 20 9 54 14 76 17 79 25 213
+25 420 0 186 -3 244 -21 385 -17 141 -100 451 -153 575 -35 81 -49 112 -93
+200 -88 178 -184 324 -332 504 -47 57 -234 244 -286 285 -30 24 -66 53 -80 65
+-14 11 -29 24 -35 29 -65 52 -304 202 -322 202 -6 0 -13 3 -15 8 -6 15 -216
+110 -335 152 -157 55 -379 111 -503 125 -30 4 -66 9 -80 11 -31 6 -506 15
+-511 10z"/>
+</g>
+</svg>
diff --git a/assets/icons/site.webmanifest b/assets/icons/site.webmanifest
@@ -0,0 +1,18 @@
+{
+ "name": "",
+ "short_name": "",
+ "icons": [
+ {
+ "src": "/icons/android-chrome-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/icons/android-chrome-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ],
+ "theme_color": "#ffffff",
+ "background_color": "#ffffff"
+}
diff --git a/content/bio.smd b/content/bio.smd
@@ -0,0 +1,14 @@
+---
+.title = "Bio",
+.date = @date("2025-04-09T21:13:53+08:00"),
+.author = "Grace Tan",
+.description = "Grace Tan's Bio",
+.layout = "page.shtml",
+.draft = false,
+---
+
+Grace Tan is currently a PhD student at the National University of Singapore (School of Computing), advised by Prof. [Umang Mathur](https://www.comp.nus.edu.sg/~umathur/).
+She is a part of the group [Foundations of Computer Systems Lab](https://focs-lab.comp.nus.edu.sg/), led by her advisor.
+In 2022, she obtained her Bachelor's Degree in Math and Computer Science at National University of Singapore.
+
+Her research area is broadly on concurrent programming languages, and is currently focused on consistency testing under weak memory models.
diff --git a/content/index.smd b/content/index.smd
@@ -0,0 +1,14 @@
+---
+.title = "Grace Tan's Site",
+.date = @date("2025-04-09T21:13:53+08:00"),
+.author = "Grace Tan",
+.layout = "index.shtml",
+.description = "Hello! I am a PhD student studying weak memory models.",
+.draft = false,
+---
+
+Hello! I am a PhD student at the National University of Singapore (School of Computing), advised by Prof. [Umang Mathur](https://www.comp.nus.edu.sg/~umathur/). I am a part of the group [Foundations of Computer Systems Lab](https://focs-lab.comp.nus.edu.sg/), led by my advisor.
+
+## Now
+
+I am currently studying algorithms for consistency testing.
diff --git a/content/posts/2025-01-14-popl-src.smd b/content/posts/2025-01-14-popl-src.smd
@@ -0,0 +1,23 @@
+---
+.title = "POPL 2025 Student Research Competition",
+.date = @date("2025-01-14T16:38:33+08:00"),
+.author = "Grace Tan",
+.description = "What happened at POPL SRC",
+.aliases = ["/posts/popl-2025-src/index.html"],
+.layout = "post.shtml",
+.draft = false,
+---
+
+I submitted an extended abstract to the POPL 2025 Student Research competition, which has been accepted into the poster presentation stage. See you at POPL 2025!
+
+[Download Extended Abstract]($link.siteAsset("docs/POPL-2025-SRC-Grace-Tan-Extended-Abstract.pdf"))
+
+----
+
+**Update 2025-01-23**: I proceeded to Round 3 (Oral presentation) and gave my talk, here are my slides!
+
+[Link to Presentation Slides](https://docs.google.com/presentation/d/1IRLBLujk5qB1ekCzD-k7LSTpECGeYWXDenZrtXp1Lvc/view)
+
+----
+
+**Update 2025-01-23**: I'm honoured to receive the Gold prize ($500) and advance to the ACM SRC Grand Finals! Thank you for our discussions during the poster session and for listening to my talk!
diff --git a/content/posts/index.smd b/content/posts/index.smd
@@ -0,0 +1,13 @@
+---
+.title = "Posts",
+.date = @date("2025-04-09T21:13:53+08:00"),
+.author = "Grace Tan",
+.description = "Posts by Grace Tan",
+.layout = "posts.shtml",
+.alternatives = [{
+ .name = "rss",
+ .layout = "posts.xml",
+ .output = "index.xml",
+}],
+.draft = false,
+---
diff --git a/content/teaching.smd b/content/teaching.smd
@@ -0,0 +1,71 @@
+---
+.title = "Teaching",
+.date = @date("2025-04-09T21:13:53+08:00"),
+.author = "Grace Tan",
+.description = "Grace Tan's Teaching Experience",
+.layout = "page.shtml",
+.draft = false,
+---
+
+## Current
+
+### Teaching assistant
+
+I am currently assisting with the following modules:
+
+- **CS3211 Parallel and Concurrent Programming**
+ - As Head Teaching Assistant, I am also helping with the C++ and memory model portions of the course syllabus.
+ - AY2024/25 Semester 2, Head Teaching Assistant **(Tutorial)**
+
+## Past
+
+### Awards
+
+- **CS3211 Parallel and Concurrent Programming**
+ - NUS Annual Teaching Excellence Award (Team category) 2024
+
+- **CS1101S Programming Methodology**
+ - [NUS Outstanding Undergraduate Researcher Prize 2022 (Group)](https://www.comp.nus.edu.sg/news/2022-ourp-ocp-2122/)
+ - [NUS Annual Digital Education Award (ADEA) 2021](https://ctlt.nus.edu.sg/teaching-and-learning-quality/teaching-awards/past-teaching-award-winners/past-annual-teaching-excellence-award-atea-annual-digital-education-award-adea-winners/)
+
+### Teaching assistant
+
+- **CS3211 Parallel and Concurrent Programming**
+ - As Head Teaching Assistant, I also helped with the design of the C++ portion of the course syllabus.
+ - AY2023/24 Semester 2, Head Teaching Assistant **(Tutorial)**
+ - AY2021/22 Semester 2, Head Teaching Assistant **(Tutorial)**
+
+- **CS1101S Programming Methodology**
+ - AY2024/25 Semester 1, Reflection Tutor **(Recitation)**
+ - AY2020/21 Semester 1, Studio Avenger **(Tutorial)**
+ - AY2019/20 Semester 1, Studio Avenger **(Tutorial)**
+ - AY2018/19 Semester 1, Studio Avenger **(Tutorial)**
+ - *(Informal) Best Tutor Award*
+
+- **CS3230 Design and Analysis of Algorithms**
+ - AY2019/20 Semester 1, Teaching Assistant **(Tutorial)**
+
+- **CS2030 Programming Methodology II**
+ - AY2018/19 Semester 2, Teaching Assistant **(Tutorial)**
+
+### Teaching and mentoring events
+
+I have also organised the following teaching and mentoring events:
+
+- **C++ Crash Course**
+ - Summer Vacation 2022, **Organiser and instructor**
+ - Aimed to be a comprehensive overview ranging from bits and bytes to high level metaprogramming, targeted at students who have some programming experience.
+ - Organiser: Grace Tan
+ - Syllabus design: Grace Tan, Bernard Teo, Ng Zhia Yang
+ - Instructors: Grace Tan, Bernard Teo, Ng Zhia Yang, Georgie Lee
+
+- **Introduction to Type Theory**
+ - AY2019/20 Semester 1, **Organiser and instructor**
+ - Introduction to Simply Typed Lambda Calculus, System F, and Calculus of Construction, with a larger focus on proof systems.
+
+- **Programming Helpdesk @ PGP**
+ - AY2019/20 Semester 1, **Organiser and mentor**
+ - AY2018/19 Semester 1, **Organiser and mentor**
+ - Aimed at first year undergraduates struggling with programming modules.
+ - I advertised to both seniors who were willing to lend their help as well as first years struggling with programming, and set up a common time and place for seniors to help groups of first years with similar struggles.
+
diff --git a/layouts/index.shtml b/layouts/index.shtml
@@ -0,0 +1,9 @@
+<extend template="base.shtml">
+<head id="head">
+</head>
+<div id="content">
+ <main>
+ <h1 :text="$page.title"></h1>
+ <div :html="$page.content()"></div>
+ </main>
+</div>
diff --git a/layouts/page.shtml b/layouts/page.shtml
@@ -0,0 +1,36 @@
+<extend template="base.shtml">
+<head id="head">
+ <style>
+#prev-next {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ margin-top: 40px;
+}
+
+#post-header {
+ margin: 1.5em 0;
+}
+#post-header>h1 {
+ margin: 0;
+}
+#post-header>time,
+#post-header>span {
+ font-size: 0.8em;
+}
+ </style>
+</head>
+<div id="content">
+ <main>
+ <article>
+ <header id="post-header">
+ <h1 :text="$page.title"></h1>
+ <time class="date" datetime="$page.date.format('2006-01-02 15:04:05MST')" :text="$page.date.format('2006-01-02')"></time>
+ ·
+ <span rel="author" :text="$page.author"></span>
+ </header>
+ <div class="post-content" :html="$page.content()"></div>
+ </article>
+ </main>
+</div>
+
diff --git a/layouts/post.shtml b/layouts/post.shtml
@@ -0,0 +1,49 @@
+<extend template="base.shtml">
+<head id="head">
+ <style>
+#prev-next {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ margin-top: 40px;
+}
+
+#post-header {
+ margin: 1.5em 0;
+}
+#post-header>h1 {
+ margin: 0;
+}
+#post-header>time,
+#post-header>span {
+ font-size: 0.8em;
+}
+ </style>
+</head>
+<div id="content">
+ <main>
+ <article>
+ <header id="post-header">
+ <h1 :text="$page.title"></h1>
+ <time class="date" datetime="$page.date.format('2006-01-02 15:04:05MST')" :text="$page.date.format('2006-01-02')"></time>
+ ·
+ <span rel="author" :text="$page.author"></span>
+ </header>
+ <div class="post-content" :html="$page.content()"></div>
+ </article>
+ </main>
+ <footer id="prev-next">
+ <div :if="$page.prevPage?()">
+ <a href="$if.link()">
+ ←
+ <span :text="$if.title"></span>
+ </a>
+ </div>
+ <div :if="$page.nextPage?()">
+ <a href="$if.link()">
+ <span :text="$if.title"></span>
+ →
+ </a>
+ </div>
+ </footer>
+</div>
diff --git a/layouts/posts.shtml b/layouts/posts.shtml
@@ -0,0 +1,32 @@
+<extend template="base.shtml">
+<head id="head">
+ <style>
+.date, .author {
+ font-size: 0.8em;
+}
+
+.post {
+ margin: 1.5em 0;
+}
+
+.post-title h3 {
+ margin: 0;
+}
+ </style>
+</head>
+<div id="content">
+ <main>
+ <h1 :text="$page.title"></h1>
+ <div :if="$page.content().len().eq(0).not()" :html="$page.content()"></div>
+ <div :loop="$page.subpages()">
+ <section class="post">
+ <a class="post-title" href="$loop.it.link()">
+ <h3 :text="$loop.it.title"></h3>
+ </a>
+ <time class="date" datetime="$loop.it.date.format('2006-01-02 15:04:05MST')" :text="$loop.it.date.format('2006-01-02')"></time>
+ ·
+ <span class="author" rel="author" :text="$loop.it.author"></span>
+ </section>
+ </div>
+ </main>
+</div>
diff --git a/layouts/posts.xml b/layouts/posts.xml
@@ -0,0 +1,19 @@
+<rss version="2.0">
+ <channel>
+ <title :text="$site.title"></title>
+ <link :text="$site.host_url"></link>
+ <description :text="$site.title.suffix(' - Blog')"></description>
+ <generator>Zine -- https://zine-ssg.io</generator>
+ <language>en-US</language>
+ <lastBuildDate :text="$build.generated.formatHTTP()"></lastBuildDate>
+ <ctx :loop="$page.subpages()">
+ <item>
+ <title :text="$loop.it.title"></title>
+ <description :text="$loop.it.content()"></description>
+ <link :text="$site.host_url.addPath($loop.it.link())"></link>
+ <pubDate :text="$loop.it.date.formatHTTP()"></pubDate>
+ <guid :text="$site.host_url.addPath($loop.it.link())"></guid>
+ </item>
+ </ctx>
+ </channel>
+</rss>
diff --git a/layouts/templates/base.shtml b/layouts/templates/base.shtml
@@ -0,0 +1,169 @@
+<!DOCTYPE html>
+<html lang="en">
+ <head id="head">
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+ <title :text="$site.title"></title>
+ <meta name="author" content="$page.author">
+ <meta name="description" content="$page.description">
+ <link rel="apple-touch-icon" sizes="180x180" href="$site.asset('icons/apple-touch-icon.png').link()">
+ <link rel="icon" type="image/png" sizes="32x32" href="$site.asset('icons/favicon-32x32.png').link()">
+ <link rel="icon" type="image/png" sizes="16x16" href="$site.asset('icons/favicon-16x16.png').link()">
+ <link rel="manifest" href="$site.asset('icons/site.webmanifest').link()">
+ <link rel="mask-icon" href="$site.asset('icons/safari-pinned-tab.svg').link()" color="#ffb6c1">
+ <link rel="shortcut icon" href="$site.asset('icons/favicon.ico').link()">
+ <meta name="msapplication-TileColor" content="#603cba">
+ <meta name="msapplication-config" content="$site.asset('icons/browserconfig.xml').link()">
+ <meta name="theme-color" content="#ffffff">
+ <super>
+ <!-- <link type="text/css" rel="stylesheet" href="$site.asset('style.css').link()"> -->
+ <!-- <link type="text/css" rel="stylesheet" href="$site.asset('highlight.css').link()"> -->
+ <!-- mathtex -->
+ <!-- <link type="text/css" rel="stylesheet" href="$site.asset('Temml-Local.css').link()"> -->
+ <!-- <script defer src="$site.asset('temml.min.js').link()"></script> -->
+ <!-- <script defer src="$site.asset('render-mathtex.js').link()"></script> -->
+ <!-- /mathtex -->
+ <style>
+/* 1. Use a more-intuitive box-sizing model */
+*, *::before, *::after {
+ box-sizing: border-box;
+}
+
+/* 2. Remove default margin */
+* {
+ margin: 0;
+}
+
+/* 3. Enable keyword animations */
+@media (prefers-reduced-motion: no-preference) {
+ html {
+ interpolate-size: allow-keywords;
+ }
+}
+
+body {
+ /* 4. Add accessible line-height */
+ line-height: 1.5;
+ /* 5. Improve text rendering */
+ -webkit-font-smoothing: antialiased;
+}
+
+/* 6. Improve media defaults */
+img, picture, video, canvas, svg {
+ display: block;
+ max-width: 100%;
+}
+
+/* 7. Inherit fonts for form controls */
+input, button, textarea, select {
+ font: inherit;
+}
+
+/* 8. Avoid text overflows */
+p, h1, h2, h3, h4, h5, h6 {
+ overflow-wrap: break-word;
+ hyphens: auto;
+}
+
+/* 9. Improve line wrapping */
+p {
+ text-wrap: pretty;
+}
+h1, h2, h3, h4, h5, h6 {
+ text-wrap: balance;
+}
+
+/*
+ 10. Create a root stacking context
+*/
+#root, #__next {
+ isolation: isolate;
+}
+ </style>
+
+ <style>
+html {
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
+ font-size: 18px;
+}
+
+hr {
+ border: 0.25px solid;
+}
+
+h1 {
+ font-size: 1.9em;
+}
+
+h1, h2, h3, h4, h5, h6,
+p, hr {
+ margin-top: 0.75em;
+ margin-bottom: 0.25em;
+}
+
+#nav {
+ max-width: 75ch;
+ margin: 0 auto;
+ margin-top: 15px;
+ padding: 0 15px;
+}
+
+#nav a {
+ text-align: center;
+ color: #000;
+}
+
+#nav a:not(:hover) {
+ text-decoration: none;
+}
+
+#site-title-text {
+ margin-top: 0;
+ margin-bottom: 0;
+}
+
+#nav-links {
+ margin: 0 auto;
+ display: flex;
+ justify-content: center;
+ flex-wrap: wrap;
+ gap: 20px;
+ row-gap: 0px;
+}
+
+#nav-links>a {
+ padding: .5em 0;
+}
+
+#nav-rule {
+ margin-top: 0;
+ margin-bottom: 0;
+ margin-left: 15px;
+ margin-right: 15px;
+}
+
+#content {
+ margin: auto;
+ padding: 0 15px;
+ max-width: 75ch;
+}
+ </style>
+ </head>
+ <body id="body">
+ <nav id="nav">
+ <a id="site-title" href="$site.page('').link()">
+ <h2 id="site-title-text" :text="$site.title"></h2>
+ </a>
+ <div id="nav-links">
+ <a href="$site.page('').link()">Home</a>
+ <a href="$site.page('posts').link()">Posts</a>
+ <a href="$site.page('bio').link()">Bio</a>
+ <a href="$site.page('teaching').link()">Teaching</a>
+ </div>
+ </nav>
+ <hr id="nav-rule">
+ <div id="content">
+ <super>
+ </div>
+ </body>
+</html>
diff --git a/zine.ziggy b/zine.ziggy
@@ -0,0 +1,20 @@
+Site {
+ .title = "Grace Tan's Site",
+ .host_url = "https://blog.grace.moe",
+ .content_dir_path = "content",
+ .layouts_dir_path = "layouts",
+ .assets_dir_path = "assets",
+ .static_assets = [
+ "docs/POPL-2025-SRC-Grace-Tan-Extended-Abstract.pdf",
+ "icons/android-chrome-192x192.png",
+ "icons/android-chrome-512x512.png",
+ "icons/apple-touch-icon.png",
+ "icons/browserconfig.xml",
+ "icons/favicon-16x16.png",
+ "icons/favicon-32x32.png",
+ "icons/favicon.ico",
+ "icons/mstile-150x150.png",
+ "icons/safari-pinned-tab.svg",
+ "icons/site.webmanifest",
+ ],
+}