blog.grace.moe

Source for the blog blog.grace.moe
git clone https://git.grace.moe/blog.grace.moe
Log | Files | Refs

commit ce2ae8c1a1fb3292abe1515f09dea620476b3ae8
parent df9b5013eb4bad248177dab6739d075a7deabfbd
Author: gracefu <81774659+gracefuu@users.noreply.github.com>
Date:   Thu, 10 Apr 2025 01:59:00 +0800

New blog

Diffstat:
A.gitignore | 1+
AMakefile | 145+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aassets/docs/POPL-2025-SRC-Grace-Tan-Extended-Abstract.pdf | 0
Aassets/icons/android-chrome-192x192.png | 0
Aassets/icons/android-chrome-512x512.png | 0
Aassets/icons/apple-touch-icon.png | 0
Aassets/icons/browserconfig.xml | 9+++++++++
Aassets/icons/favicon-16x16.png | 0
Aassets/icons/favicon-32x32.png | 0
Aassets/icons/favicon.ico | 0
Aassets/icons/mstile-150x150.png | 0
Aassets/icons/safari-pinned-tab.svg | 33+++++++++++++++++++++++++++++++++
Aassets/icons/site.webmanifest | 18++++++++++++++++++
Acontent/bio.smd | 14++++++++++++++
Acontent/index.smd | 14++++++++++++++
Acontent/posts/2025-01-14-popl-src.smd | 23+++++++++++++++++++++++
Acontent/posts/index.smd | 13+++++++++++++
Acontent/teaching.smd | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Alayouts/index.shtml | 9+++++++++
Alayouts/page.shtml | 36++++++++++++++++++++++++++++++++++++
Alayouts/post.shtml | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Alayouts/posts.shtml | 32++++++++++++++++++++++++++++++++
Alayouts/posts.xml | 19+++++++++++++++++++
Alayouts/templates/base.shtml | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Azine.ziggy | 20++++++++++++++++++++
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", + ], +}