Compare commits
10 commits
984b7f2641
...
485abd8d81
| Author | SHA1 | Date | |
|---|---|---|---|
| 485abd8d81 | |||
| bcfef6235c | |||
| 893114c214 | |||
| a4771f04c1 | |||
| 8ec6c9aead | |||
| 0e503a952e | |||
| ad27e7f06d | |||
| 8227b00542 | |||
| dddfb9e1b5 | |||
| 401803e349 |
26 changed files with 739 additions and 1281 deletions
521
Cargo.lock
generated
521
Cargo.lock
generated
|
|
@ -20,6 +20,23 @@ dependencies = [
|
|||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "arraydeque"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236"
|
||||
|
||||
[[package]]
|
||||
name = "async-trait"
|
||||
version = "0.1.89"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "atomic-waker"
|
||||
version = "1.1.2"
|
||||
|
|
@ -33,16 +50,65 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
|
||||
|
||||
[[package]]
|
||||
name = "base64"
|
||||
version = "0.22.1"
|
||||
name = "axum"
|
||||
version = "0.8.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
|
||||
checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90"
|
||||
dependencies = [
|
||||
"axum-core",
|
||||
"bytes",
|
||||
"form_urlencoded",
|
||||
"futures-util",
|
||||
"http",
|
||||
"http-body",
|
||||
"http-body-util",
|
||||
"hyper",
|
||||
"hyper-util",
|
||||
"itoa",
|
||||
"matchit",
|
||||
"memchr",
|
||||
"mime",
|
||||
"percent-encoding",
|
||||
"pin-project-lite",
|
||||
"serde_core",
|
||||
"serde_json",
|
||||
"serde_path_to_error",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper",
|
||||
"tokio",
|
||||
"tower",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "axum-core"
|
||||
version = "0.5.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-core",
|
||||
"http",
|
||||
"http-body",
|
||||
"http-body-util",
|
||||
"mime",
|
||||
"pin-project-lite",
|
||||
"sync_wrapper",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "block-buffer"
|
||||
|
|
@ -124,6 +190,55 @@ dependencies = [
|
|||
"phf_codegen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "config"
|
||||
version = "0.15.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e68cfe19cd7d23ffde002c24ffa5cda73931913ef394d5eaaa32037dc940c0c"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"convert_case",
|
||||
"json5",
|
||||
"pathdiff",
|
||||
"ron",
|
||||
"rust-ini",
|
||||
"serde-untagged",
|
||||
"serde_core",
|
||||
"serde_json",
|
||||
"toml",
|
||||
"winnow",
|
||||
"yaml-rust2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "const-random"
|
||||
version = "0.1.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359"
|
||||
dependencies = [
|
||||
"const-random-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "const-random-macro"
|
||||
version = "0.1.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
"once_cell",
|
||||
"tiny-keccak",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "convert_case"
|
||||
version = "0.6.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca"
|
||||
dependencies = [
|
||||
"unicode-segmentation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "core-foundation-sys"
|
||||
version = "0.8.7"
|
||||
|
|
@ -164,6 +279,12 @@ version = "0.8.21"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||
|
||||
[[package]]
|
||||
name = "crunchy"
|
||||
version = "0.2.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5"
|
||||
|
||||
[[package]]
|
||||
name = "crypto-common"
|
||||
version = "0.1.7"
|
||||
|
|
@ -191,10 +312,33 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.2"
|
||||
name = "dlv-list"
|
||||
version = "0.5.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
|
||||
checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f"
|
||||
dependencies = [
|
||||
"const-random",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "encoding_rs"
|
||||
version = "0.8.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "erased-serde"
|
||||
version = "0.4.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_core",
|
||||
"typeid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "errno"
|
||||
|
|
@ -213,10 +357,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582"
|
||||
|
||||
[[package]]
|
||||
name = "fnv"
|
||||
version = "1.0.7"
|
||||
name = "foldhash"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
|
||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||
|
||||
[[package]]
|
||||
name = "form_urlencoded"
|
||||
|
|
@ -261,9 +405,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
"futures-task",
|
||||
"pin-project-lite",
|
||||
"slab",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -312,52 +456,27 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.4.13"
|
||||
name = "hashbrown"
|
||||
version = "0.14.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54"
|
||||
dependencies = [
|
||||
"atomic-waker",
|
||||
"bytes",
|
||||
"fnv",
|
||||
"futures-core",
|
||||
"futures-sink",
|
||||
"http",
|
||||
"indexmap",
|
||||
"slab",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
"tracing",
|
||||
]
|
||||
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.17.0"
|
||||
version = "0.15.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51"
|
||||
|
||||
[[package]]
|
||||
name = "headers"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb"
|
||||
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"bytes",
|
||||
"headers-core",
|
||||
"http",
|
||||
"httpdate",
|
||||
"mime",
|
||||
"sha1",
|
||||
"foldhash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "headers-core"
|
||||
version = "0.3.0"
|
||||
name = "hashlink"
|
||||
version = "0.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4"
|
||||
checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1"
|
||||
dependencies = [
|
||||
"http",
|
||||
"hashbrown 0.15.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -393,6 +512,12 @@ dependencies = [
|
|||
"pin-project-lite",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "http-range-header"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c"
|
||||
|
||||
[[package]]
|
||||
name = "httparse"
|
||||
version = "1.10.1"
|
||||
|
|
@ -424,7 +549,6 @@ dependencies = [
|
|||
"bytes",
|
||||
"futures-channel",
|
||||
"futures-core",
|
||||
"h2",
|
||||
"http",
|
||||
"http-body",
|
||||
"httparse",
|
||||
|
|
@ -490,16 +614,6 @@ dependencies = [
|
|||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "indexmap"
|
||||
version = "2.14.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.18"
|
||||
|
|
@ -516,6 +630,17 @@ dependencies = [
|
|||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "json5"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1"
|
||||
dependencies = [
|
||||
"pest",
|
||||
"pest_derive",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
|
|
@ -549,6 +674,21 @@ version = "0.4.29"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
|
||||
|
||||
[[package]]
|
||||
name = "markdown"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5cab8f2cadc416a82d2e783a1946388b31654d391d1c7d92cc1f03e295b1deb"
|
||||
dependencies = [
|
||||
"unicode-id",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "matchit"
|
||||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.0"
|
||||
|
|
@ -597,6 +737,16 @@ version = "1.21.4"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
|
||||
|
||||
[[package]]
|
||||
name = "ordered-multimap"
|
||||
version = "0.7.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79"
|
||||
dependencies = [
|
||||
"dlv-list",
|
||||
"hashbrown 0.14.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "parking_lot"
|
||||
version = "0.12.5"
|
||||
|
|
@ -629,6 +779,12 @@ dependencies = [
|
|||
"regex",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pathdiff"
|
||||
version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
|
||||
|
||||
[[package]]
|
||||
name = "percent-encoding"
|
||||
version = "2.3.2"
|
||||
|
|
@ -716,26 +872,6 @@ dependencies = [
|
|||
"siphasher",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pin-project"
|
||||
version = "1.1.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517"
|
||||
dependencies = [
|
||||
"pin-project-internal",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-internal"
|
||||
version = "1.1.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.2.17"
|
||||
|
|
@ -837,6 +973,30 @@ version = "0.8.10"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
||||
|
||||
[[package]]
|
||||
name = "ron"
|
||||
version = "0.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4147b952f3f819eca0e99527022f7d6a8d05f111aeb0a62960c74eb283bec8fc"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"once_cell",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"typeid",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rust-ini"
|
||||
version = "0.21.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "796e8d2b6696392a43bea58116b667fb4c29727dc5abd27d6acf338bb4f688c7"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"ordered-multimap",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.22"
|
||||
|
|
@ -858,12 +1018,6 @@ dependencies = [
|
|||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scoped-tls"
|
||||
version = "1.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
|
|
@ -879,6 +1033,18 @@ dependencies = [
|
|||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde-untagged"
|
||||
version = "0.1.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058"
|
||||
dependencies = [
|
||||
"erased-serde",
|
||||
"serde",
|
||||
"serde_core",
|
||||
"typeid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_core"
|
||||
version = "1.0.228"
|
||||
|
|
@ -912,6 +1078,26 @@ dependencies = [
|
|||
"zmij",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_path_to_error"
|
||||
version = "0.1.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_spanned"
|
||||
version = "1.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_urlencoded"
|
||||
version = "0.7.1"
|
||||
|
|
@ -924,17 +1110,6 @@ dependencies = [
|
|||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sha1"
|
||||
version = "0.10.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures",
|
||||
"digest",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sha2"
|
||||
version = "0.10.9"
|
||||
|
|
@ -1011,6 +1186,12 @@ dependencies = [
|
|||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "sync_wrapper"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
|
||||
|
||||
[[package]]
|
||||
name = "tera"
|
||||
version = "1.20.1"
|
||||
|
|
@ -1033,6 +1214,15 @@ dependencies = [
|
|||
"unicode-segmentation",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tiny-keccak"
|
||||
version = "2.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
|
||||
dependencies = [
|
||||
"crunchy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.52.1"
|
||||
|
|
@ -1074,6 +1264,85 @@ dependencies = [
|
|||
"tokio",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "1.1.2+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "81f3d15e84cbcd896376e6730314d59fb5a87f31e4b038454184435cd57defee"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"toml_parser",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "1.1.1+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7"
|
||||
dependencies = [
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_parser"
|
||||
version = "1.1.2+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
|
||||
dependencies = [
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tower"
|
||||
version = "0.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"pin-project-lite",
|
||||
"sync_wrapper",
|
||||
"tokio",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tower-http"
|
||||
version = "0.6.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"bytes",
|
||||
"futures-core",
|
||||
"futures-util",
|
||||
"http",
|
||||
"http-body",
|
||||
"http-body-util",
|
||||
"http-range-header",
|
||||
"httpdate",
|
||||
"mime",
|
||||
"mime_guess",
|
||||
"percent-encoding",
|
||||
"pin-project-lite",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tower-layer"
|
||||
version = "0.3.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e"
|
||||
|
||||
[[package]]
|
||||
name = "tower-service"
|
||||
version = "0.3.3"
|
||||
|
|
@ -1100,6 +1369,12 @@ dependencies = [
|
|||
"once_cell",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "typeid"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
|
||||
|
||||
[[package]]
|
||||
name = "typenum"
|
||||
version = "1.20.0"
|
||||
|
|
@ -1118,6 +1393,12 @@ version = "2.9.0"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-id"
|
||||
version = "0.3.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "70ba288e709927c043cbe476718d37be306be53fb1fafecd0dbe36d072be2580"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.24"
|
||||
|
|
@ -1146,35 +1427,6 @@ dependencies = [
|
|||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "warp"
|
||||
version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "51d06d9202adc1f15d709c4f4a2069be5428aa912cc025d6f268ac441ab066b0"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-util",
|
||||
"headers",
|
||||
"http",
|
||||
"http-body",
|
||||
"http-body-util",
|
||||
"hyper",
|
||||
"hyper-util",
|
||||
"log",
|
||||
"mime",
|
||||
"mime_guess",
|
||||
"percent-encoding",
|
||||
"pin-project",
|
||||
"scoped-tls",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
"tower-service",
|
||||
"tracing",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasi"
|
||||
version = "0.11.1+wasi-snapshot-preview1"
|
||||
|
|
@ -1230,10 +1482,13 @@ dependencies = [
|
|||
name = "website"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"axum",
|
||||
"config",
|
||||
"lazy_static",
|
||||
"markdown",
|
||||
"tera",
|
||||
"tokio",
|
||||
"warp",
|
||||
"tower-http",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
|
@ -1313,6 +1568,26 @@ dependencies = [
|
|||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "yaml-rust2"
|
||||
version = "0.10.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2462ea039c445496d8793d052e13787f2b90e750b833afee748e601c17621ed9"
|
||||
dependencies = [
|
||||
"arraydeque",
|
||||
"encoding_rs",
|
||||
"hashlink",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.48"
|
||||
|
|
|
|||
|
|
@ -4,7 +4,10 @@ version = "0.1.0"
|
|||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
axum = "0.8.9"
|
||||
config = "0.15.22"
|
||||
lazy_static = "1.5.0"
|
||||
markdown = "1.0.0"
|
||||
tera = "1.20.1"
|
||||
tokio = { version = "1", features = ["full"] }
|
||||
warp = { version = "0.4", features = ["server"] }
|
||||
tower-http = { version = "0.6.8", features = ["fs"] }
|
||||
|
|
|
|||
15
src/functions.rs
Normal file
15
src/functions.rs
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
use std::collections::HashMap;
|
||||
use tera::{
|
||||
Value, to_value, try_get_value
|
||||
};
|
||||
|
||||
pub fn load_markdown(args: &HashMap<String, Value>) -> tera::Result<Value> {
|
||||
let value = args.get("path").ok_or("path not provided")?;
|
||||
let path = try_get_value!("load_markdown", "path", String, value);
|
||||
let content = std::fs::read_to_string(format!("static/{}", path))?;
|
||||
|
||||
let html = markdown::to_html(&content);
|
||||
dbg!(&html);
|
||||
Ok(to_value(&html)?)
|
||||
}
|
||||
|
||||
104
src/main.rs
104
src/main.rs
|
|
@ -1,50 +1,90 @@
|
|||
pub mod functions;
|
||||
|
||||
use std::collections::HashMap;
|
||||
use tera::{Context, Tera};
|
||||
use warp::{Filter, filters::path::Tail, Reply, Rejection};
|
||||
use axum::{
|
||||
Router,
|
||||
response::{
|
||||
Html,
|
||||
Redirect
|
||||
},
|
||||
extract::Path,
|
||||
routing::get,
|
||||
http::{
|
||||
header::{HeaderMap, ACCEPT_LANGUAGE},
|
||||
StatusCode
|
||||
}
|
||||
};
|
||||
use tower_http::services::{ServeDir, ServeFile};
|
||||
|
||||
lazy_static::lazy_static! {
|
||||
pub static ref TEMPLATES: Tera = Tera::new("templates/**/*").expect("failed to parse templates");
|
||||
pub static ref TEMPLATES: Tera = {
|
||||
let mut tera = Tera::new("templates/**/*").expect("failed to parse templates");
|
||||
tera.register_function("load_markdown", functions::load_markdown);
|
||||
tera
|
||||
};
|
||||
}
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let static_pages = warp::fs::dir("static");
|
||||
let serve_dir = ServeDir::new("static").not_found_service(ServeFile::new("static/404.html"));
|
||||
|
||||
for name in TEMPLATES.get_template_names() {
|
||||
println!("Loaded template {}", name);
|
||||
let app = Router::new()
|
||||
.route("/", get(language_redirect))
|
||||
.route("/{lang}/", get(render_template))
|
||||
.route("/{lang}/{*tail}", get(render_template))
|
||||
.fallback_service(serve_dir);
|
||||
|
||||
let listener = tokio::net::TcpListener::bind("0.0.0.0:3030").await.unwrap();
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
}
|
||||
|
||||
let templates = warp::get()
|
||||
.and(warp::path::tail())
|
||||
.and_then(render_template);
|
||||
|
||||
let root = warp::path::end()
|
||||
.and(warp::header::optional::<String>("accept-language"))
|
||||
.map(|lang: Option<String>| {
|
||||
let target = match lang {
|
||||
Some(l) if l.starts_with("fr") => "/fr/",
|
||||
_ => "/en/",
|
||||
};
|
||||
warp::redirect(warp::http::Uri::from_static(target))
|
||||
});
|
||||
|
||||
let routes = root.or(static_pages).or(templates);
|
||||
|
||||
warp::serve(routes)
|
||||
.run(([0,0,0,0], 3030))
|
||||
.await;
|
||||
async fn language_redirect(headers: HeaderMap) -> Redirect {
|
||||
let lang = headers
|
||||
.get(ACCEPT_LANGUAGE)
|
||||
.and_then(|value| value.to_str().ok())
|
||||
.map(|s| {
|
||||
if s.to_lowercase().starts_with("fr") {
|
||||
"fr"
|
||||
} else {
|
||||
"en"
|
||||
}
|
||||
}).unwrap_or("en");
|
||||
Redirect::to(&format!("/{}/", lang))
|
||||
}
|
||||
|
||||
async fn render_template(tail: Tail) -> Result<impl Reply, Rejection> {
|
||||
let mut path = tail.as_str().to_string();
|
||||
if path.is_empty() || path.ends_with('/') {
|
||||
path.push_str("index.html");
|
||||
}
|
||||
async fn render_template(Path(params): Path<HashMap<String,String>>) -> Result<Html<String>, StatusCode> {
|
||||
let lang = params.get("lang").ok_or(StatusCode::BAD_REQUEST)?;
|
||||
let tail = params.get("tail").map(|s| s.as_str()).unwrap_or("index.html");
|
||||
|
||||
match TEMPLATES.render(&path, &Context::new()) {
|
||||
Ok(html) => Ok(warp::reply::html(html)),
|
||||
let pb = normalize_path(format!("{lang}/{tail}"));
|
||||
let parent = pb.parent()
|
||||
.map(|p| p.to_string_lossy().into_owned())
|
||||
.unwrap_or_else(|| "".to_string()) + "/";
|
||||
|
||||
|
||||
|
||||
let mut context = Context::new();
|
||||
context.insert("lang", &lang);
|
||||
let main_css = include_str!("../static/main.css");
|
||||
context.insert("main_css", main_css);
|
||||
context.insert("path", &parent);
|
||||
|
||||
match TEMPLATES.render(&pb.to_string_lossy(), &context) {
|
||||
Ok(html) => Ok(Html(html)),
|
||||
Err(e) => {
|
||||
eprintln!("Tera error: {}", e);
|
||||
Err(warp::reject::not_found())
|
||||
Err(StatusCode::NOT_FOUND)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// returns a normalized path to an index from the input string,
|
||||
// guaranteed to end in index.html
|
||||
fn normalize_path(input: String) -> std::path::PathBuf {
|
||||
let mut pb = std::path::PathBuf::from(input.clone());
|
||||
if !input.ends_with("index.html") {
|
||||
pb.push("index.html");
|
||||
}
|
||||
pb
|
||||
}
|
||||
|
|
|
|||
14
static/404.html
Normal file
14
static/404.html
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="language" content="en">
|
||||
<title>404</title>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/main.css">
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
|
||||
<body>
|
||||
<p>Error 404 - The page you were looking for could not be found.</p>
|
||||
<p><a href="/">Click here to return to the home page.</a></p>
|
||||
</body>
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
@media (prefers-color-scheme: dark){
|
||||
body {
|
||||
background:#000
|
||||
}
|
||||
}
|
||||
body{
|
||||
margin:1em auto;
|
||||
max-width:40em;
|
||||
padding:0 .62em 3.24em;
|
||||
font:1.2em/1.62 sans-serif
|
||||
}
|
||||
h1,h2,h3 {
|
||||
line-height:1.2
|
||||
}
|
||||
|
||||
@media print{
|
||||
body{
|
||||
max-width:none
|
||||
}
|
||||
}
|
||||
body {
|
||||
margin:40px auto;
|
||||
max-width:850px;
|
||||
line-height:1.6;
|
||||
font-size:18px;
|
||||
color:#444;
|
||||
padding:0 10px;
|
||||
background-color:#EEEEEE
|
||||
}
|
||||
|
||||
a:link {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:visited {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a:active {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
13
static/en/content.md
Normal file
13
static/en/content.md
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
## Home Page — Spencer Whitehead
|
||||
|
||||
Pour accéder à la version française, veuillez cliquer [ici](/fr/).
|
||||
|
||||
This is the personal website of Spencer Whitehead. I am a fourth-year Ph.D. candidate at Duke University, expecting to graduate in early 2027. My primary research interests are in gauge theory, four- and eight-dimensional differential geometry, and the applications of computer algebra systems to solving problems in geometry.
|
||||
|
||||
[Resume](resume)
|
||||
|
||||
[Publications](publications)
|
||||
|
||||
[Homelab](homelab)
|
||||
|
||||
[View the code for this website](https://git.touhou.ca/spencer/website)
|
||||
2
static/en/test2.md
Normal file
2
static/en/test2.md
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
* dynamically scoped
|
||||
* very cool
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 17 KiB |
41
static/favicon.svg
Normal file
41
static/favicon.svg
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
width="506.72165"
|
||||
height="506.72165"
|
||||
viewBox="0 0 506.72165 506.72165"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
id="g1">
|
||||
<path
|
||||
style="fill:#c3c3c3;fill-opacity:0.992157;stroke:#7d2020;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.996078;paint-order:stroke fill markers"
|
||||
d="m 253.36,372.10243 99.53543,-180.7834 -99.53543,0.51822 z m 0.002,0 -99.53543,-180.7834 99.53543,0.51822 z"
|
||||
id="path1" />
|
||||
<path
|
||||
style="fill:#c3c3c3;fill-opacity:0.992157;stroke:#7d2020;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.996078;paint-order:stroke fill markers"
|
||||
d="M 253.36,170.5572 V 0 l 99.35897,170.76085 z m 0.002,0 V 0 l -99.35897,170.76085 z"
|
||||
id="path2" />
|
||||
<path
|
||||
style="fill:#c3c3c3;fill-opacity:0.992157;stroke:#7d2020;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.996078;paint-order:stroke fill markers"
|
||||
d="M 374.7425,167.77194 471.03213,122.88415 287.61625,17.450873 Z m -242.76335,0 L 35.689518,122.88415 219.1054,17.450873 Z"
|
||||
id="path3" />
|
||||
<path
|
||||
style="fill:#c3c3c3;fill-opacity:0.992157;stroke:#7d2020;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.996078;paint-order:stroke fill markers"
|
||||
d="m 385.85819,185.49632 102.11993,-47.18199 -0.24645,207.96439 z m -264.99473,0 -102.119932,-47.18199 0.24645,207.96439 z"
|
||||
id="path4" />
|
||||
<path
|
||||
style="fill:#c3c3c3;fill-opacity:0.992157;stroke:#7d2020;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.996078;paint-order:stroke fill markers"
|
||||
d="m 270.95344,382.91639 100.0392,-180.99411 109.22954,171.00934 z m -35.18523,0 L 135.72901,201.92228 26.499468,372.93162 Z"
|
||||
id="path5" />
|
||||
<path
|
||||
style="fill:#c3c3c3;fill-opacity:0.992157;stroke:#7d2020;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:0.996078;paint-order:stroke fill markers"
|
||||
d="M 263.83489,403.84915 458.247,395.55312 264.18227,506.72165 Z m -20.94813,0 -194.412112,-8.29603 194.064732,111.16853 z"
|
||||
id="path6" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.4 KiB |
23
static/main.css
Normal file
23
static/main.css
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
body{
|
||||
margin:1em auto;
|
||||
max-width:40em;
|
||||
padding:0 .62em 3.24em;
|
||||
font:1.2em/1.62 sans-serif;
|
||||
line-height:1.6;
|
||||
color:#444;
|
||||
background-color:#EEEEEE
|
||||
}
|
||||
|
||||
h1,h2,h3 {
|
||||
line-height:1.2
|
||||
}
|
||||
|
||||
a {
|
||||
color: #0044CC;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
a:hover, a:active {
|
||||
color: #003399;
|
||||
}
|
||||
|
||||
|
|
@ -1,3 +1,2 @@
|
|||
User-agent: *
|
||||
Disallow: /
|
||||
Allow: /en/academic/
|
||||
Allow: /
|
||||
|
|
|
|||
5
templates/_index.html
Normal file
5
templates/_index.html
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
{% import "common.html" as common %}
|
||||
{{ common::meta(title="") }}
|
||||
<body>
|
||||
{{ common::nav() }}
|
||||
</body>
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
{% macro meta(title, lang) %}
|
||||
{% macro meta(title) %}
|
||||
<!DOCTYPE html>
|
||||
<html lang="{{ lang }}">
|
||||
<head>
|
||||
|
|
@ -6,15 +6,18 @@
|
|||
<meta name="language" content="{{ lang }}">
|
||||
<title>{{ title }}</title>
|
||||
</head>
|
||||
<link rel="stylesheet" href="/assets/main.css">
|
||||
<style>
|
||||
{{ main_css | safe }}
|
||||
</style>
|
||||
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
|
||||
{% endmacro %}
|
||||
|
||||
{% macro nav() %}
|
||||
<nav>
|
||||
{% if lang == "fr" %}
|
||||
<a href="/">Accueil</a>
|
||||
<a href="/fr/">Accueil</a>
|
||||
{% else %}
|
||||
<a href="/">Home</a>
|
||||
<a href="/en/">Home</a>
|
||||
{% endif %}
|
||||
</nav>
|
||||
{% endmacro %}
|
||||
|
|
|
|||
|
|
@ -1,10 +0,0 @@
|
|||
<title>Spencer Nicholas Whitehead's Academic Page</title>
|
||||
<link rel="stylesheet" href="/static/main.css">
|
||||
<body>
|
||||
<h2>Spencer Nicholas Whitehead</h2>
|
||||
|
||||
<a href="/academic">Research</a> | <a href="/academic/cv"><b>CV</b></a> | <a href="/academic/teaching">Teaching</a> | <a href="/academic/art">Art</a>
|
||||
<hr>
|
||||
|
||||
<p>My most recent CV is available <a href="resume.pdf">here</a> (link to PDF; updated February 7 2023).</p>
|
||||
</body>
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
<title>Spencer Nicholas Whitehead's Academic Page</title>
|
||||
<link rel="stylesheet" href="/static/main.css">
|
||||
<body>
|
||||
<h2>Spencer Nicholas Whitehead</h2>
|
||||
<p>I received my Bachelor of Mathematics and Master of Mathematics from the <a href="https://uwaterloo.ca">University of Waterloo</a> in the years 2021 and 2022 respectively, both from the <a href="https://uwaterloo.ca/pure-mathematics">Department of Pure Mathematics</a>.
|
||||
During these degrees I worked primarily with Benoit Charbonneau in the fields of Euclidean geometry and gauge theory.
|
||||
Currently I am a Ph. D. student at the <a href="https://math.duke.edu">Department of Mathematics at Duke University</a>.
|
||||
</p>
|
||||
|
||||
<p>Aside from my research in mathematics, my primary skills are in software development and teaching.
|
||||
For a complete history of my work in academia and industry, see the <a href="/academic/cv">CV</a> tab.
|
||||
For my teaching activities, see the <a href="/academic/teaching">Teaching</a> tab.</p>
|
||||
<p>Research interests: differential geometry, Euclidean geometry, gauge theory, mathematical art</p>
|
||||
</body>
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
<title>MATH 106L Grading</title>
|
||||
<link rel="stylesheet" href="/static/main.css">
|
||||
|
||||
<body>
|
||||
<h2>MATH 106L Grading - F23</h2>
|
||||
<p>As described in <a href="../pdfs/grading.pdf">the description of grade breakdown here</a>, grading in this offering of MATH 106L will be on a <b>mastery grading</b> basis. That means for each assignment, you will ultimately receive a grade of either pass or fail.</p>
|
||||
|
||||
<p><b>In order to pass the course</b> (graded on a pass/fail basis) you must</p>
|
||||
<ul>
|
||||
<li>Attend lab throughout the term, with <b>no more than two</b> unexcused absences;</li>
|
||||
<li>earn a grade of `pass' on at least 27 of the 32 individual small assignments (lecture worksheets, individual lab submissions like the August 29 lab);</li>
|
||||
<li>earn a grade of `pass' on at least 3 of the last 4 lecture worksheets (13-1, 14-1, 14-3, 15-1);</li>
|
||||
<li>earn a grade of `pass' on the last worksheet (15-1);</li>
|
||||
<li>earn a grade of `pass' and contribute meaningfully to your group's report in at least 6 of 8 lab reports;</li>
|
||||
<li>earn a grade of `pass' and contribute meaningfully to your group's report in the final lab report (The logistic model and fishing); and finally,</li>
|
||||
<li>earn a grade of `pass' on at least 2 of 3 `big assignments'.</li>
|
||||
</ul>
|
||||
<p>At a glance, this seems like a lot.
|
||||
Most of these bullet points specify that you must pass <i>specific</i> labs/worksheets at the end of the course; fundamentally, you are responsible for 27 small assignments, 6 lab reports, and 2 big assignments to pass.
|
||||
<b>All of these but the big assignments can (and should) be done in groups!</b> This will make your life much easier.</p>
|
||||
|
||||
<h3>Some questions you might want to ask</h3>
|
||||
|
||||
<h4>Did I pass assignment XYZ?</h4>
|
||||
<p>If ever you fail to pass an assignment, <b>I will email you about it prior to publishing the Gradescope grades.</b>
|
||||
If you haven't received an email from me, the answer is yes!</p>
|
||||
|
||||
<h4>What constitutes a `pass'? — Lecture worksheets, individual lab assignments</h4>
|
||||
|
||||
<p>Each worksheet consists of a number of `worksheet questions' and potentially some `homework questions'. Each is worth 1 point; earning at least two thirds of the available points constitutes a pass. Your first submission will be graded for feedback only; the resubmission will be graded for correctness, and to determine whether or not a passing grade has been earned.</p>
|
||||
|
||||
<h4>What constitutes a `pass'? — Lab reports</h4>
|
||||
|
||||
<p>A lab report consists of a typed response in full sentences incorporating answers to a selection of math questions into the body of the text.
|
||||
Reports will be graded on a rubric for correctness and completeness of the mathematics and quality of written presentation. (See <a href="../pdfs/writing.pdf">here</a> for best practices in writing mathematics).
|
||||
A score of level 3 or higher will constitute a pass; that is, a total score of 12 or higher on the following rubric.</p>
|
||||
<img src="/static/106rubric.png"/>
|
||||
|
||||
<p>If your group fails to pass with a level 3 or higher on the first attempt, you will be given feedback and the opportunity to correct and make a resubmission.</p>
|
||||
|
||||
<h4>What constitutes a `pass'? — Big assignments</h4>
|
||||
|
||||
<p>The big assignments of MATH 106L are the closest thing the course has to conventional tests.
|
||||
You will fill out and submit the assignment individually, and a score of 70% or higher constitutes a pass.
|
||||
In the event that you fail to pass the assignment the first time, you will be given the chance to submit corrections to receive up to half of the lost points.
|
||||
For example, if you earn a grade of 60% on a first submission and submit corrections for 30% of the lost marks, your final grade on the big assignment would be 60% + 1/2 x 30% = 75%; a pass.</p>
|
||||
|
||||
<h4>Am I on track to pass the course?</h4>
|
||||
|
||||
<p>Unless we've spoken and I've said something to the opposite effect, yes! If you ever don't get credit for an assignment, I will contact you about it.
|
||||
You are always welcome to email me to request the records I have for grades you've earned in the course to a point.</p>
|
||||
|
||||
<h4>DukeHub says we have an exam on the 17th?</h4>
|
||||
|
||||
<p>We don't. There are no exams in this course.</p>
|
||||
</body>
|
||||
|
|
@ -1,856 +0,0 @@
|
|||
<title>MATH 106L - Fall 2023</title>
|
||||
<link rel="stylesheet" href="/static/main.css">
|
||||
<style>
|
||||
.styled-table {
|
||||
border-collapse: collapse;
|
||||
margin: 25px 0;
|
||||
font-size: 0.9em;
|
||||
font-family: sans-serif;
|
||||
min-width: 400px;
|
||||
box-shadow: 0 0 20px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
.styled-table thead tr {
|
||||
background-color: #987998;
|
||||
color: #ffffff;
|
||||
text-align: left;
|
||||
}
|
||||
.styled-table th,
|
||||
.styled-table td {
|
||||
padding: 12px 15px;
|
||||
}
|
||||
.styled-table tbody tr {
|
||||
border-bottom: 1px solid #dddddd;
|
||||
}
|
||||
|
||||
.styled-table tbody tr:nth-of-type(even) {
|
||||
background-color: #f3f3f3;
|
||||
}
|
||||
|
||||
.styled-table tbody tr:last-of-type {
|
||||
border-bottom: 2px solid #009879;
|
||||
}
|
||||
</style>
|
||||
|
||||
<body>
|
||||
<h3> MATH 106L: Lab calculus and functions II</h3>
|
||||
|
||||
<p><b>Instructor:</b> Spencer Nicholas Whitehead</p>
|
||||
|
||||
<p><b>Lecture times:</b> MWF 12:00-12:50, W. Duke 08A</p>
|
||||
<p><b>Lab times:</b> TTh 12:00-12:50, W. Duke 08A</p>
|
||||
|
||||
<p><b>Office Hours:</b> W 13:00-14:00, Classroom 132; Th 16:00-17:00, F 15:00-16:00, Zoom (link sent by email). One online office hour TBD.</p>
|
||||
|
||||
<p><b>Syllabus:</b> <a href="pdfs/syllabus.pdf">See the course syllabus in PDF format here.</a></p>
|
||||
|
||||
<p><b>Contact:</b> <a href="pdfs/facesheet.pdf">See a facesheet of course staff and contact info in PDF format here.</a></p>
|
||||
|
||||
<p><b>Grading:</b> <a href="pdfs/grading.pdf">Detailed information on the grading scheme is available in PDF format here.</a></p>
|
||||
|
||||
<p><a href="grading_info">A more detailed breakdown of the grading scheme and FAQ is available here.</a></p>
|
||||
|
||||
<p><a href="/static/106rubric.png">The rubric used to assess reports is available here (see above link for more grading info).</a>
|
||||
|
||||
<p>
|
||||
<b>Course description:</b> The notion of <i>quadrature</i>, the computation of the area of a complicated shape by filling it with smaller, better understood shapes, has been studied since the Greeks.
|
||||
In MATH 105L, you studied the calculus of differentials and learned how the behaviour of a (reasonable) function could be described locally by its <i>derivative</i>.
|
||||
Historically, this notion came almost 2,000 years after that of quadrature.
|
||||
It would be a further two centuries until James Gregory would publish a statement and proof of what is today known as the <i>fundamental theorem of calculus</i>.
|
||||
This theorem states roughly that quadrature, called <i>integration</i> today, is inverse to differentiation: the derivative of an integral of a function is the original function, and the integral of a derivative of a function is the original function—perhaps up to the oft-forgotten '+ C'.
|
||||
</p>
|
||||
<p>
|
||||
The fundamental theorem of calculus cannot be described as anything short of astonishing.
|
||||
There is no reason <i>a priori</i> to believe that the operations of finding area and finding local linear approximations should be related to each other in any reasonable way, but the fundamental theorem of calculus provides exactly this relation.
|
||||
The fundamental theorem of calculus comprises perhaps the first example of what one might call a 'local-global result': by knowing local information about a function (its derivative at each point), one learns global information about the function (the area under its graph).
|
||||
This philosophy underlying the fundamental theorem of calculus is omnipresent in day-to-day life, if often invisible—as the sewist closes a sleeve with a stitch in the round or a ship circumnavigates the globe using only an atlas is present the fundamental theorem of calculus, providing rigorous mathematical justification to the idea that local approximations, sufficiently accurate, sum to the whole.
|
||||
While often exploited as just a computational tool, it would be no exaggeration to call the fundamental theorem of calculus one of the most beautiful in all of mathematics.
|
||||
</p>
|
||||
<p>
|
||||
In MATH 106L we will develop the modern integral calculus from a particular kind of quadrature called a <i>Riemann sum</i>, and from this definition prove the fundamental theorem of calculus.
|
||||
After the fall break, we will begin the study of differential equations and methods of solution.
|
||||
Finally, after the Thanskgiving break (and throughout the labs) we will study specific examples of differential equations that motivated the historical development of calculus, such as Newton's laws of motion and models for population growth/decay, including the presence of forcing terms.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<b>Best practices for writing mathematics:</b> Through the course, you will have the chance in labs to write a number of group reports.
|
||||
While there is no universal style guide for mathematical writing, there are a number of accepted best practices, <a href="pdfs/writing.pdf">available in PDF format here.</a>
|
||||
When writing reports, <b>you are expected to follow the practices in this document.</b>
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<b>Textbook problems:</b> In the interest of fairness and accessibility, I will pull practice problems and enrichment reading from the free and openly available MIT OpenCourseWare Calculus text of Strang. <a href="https://ocw.mit.edu/courses/res-18-001-calculus-online-textbook-spring-2005/pages/textbook/">Click here to access this textbook.</a>
|
||||
The practice problems will be updated on a (roughly) week-by-week basis; for some weeks there may be no practice problems.
|
||||
Many Duke courses use recent editions of Hughes-Hallett; this is a resource you may consider purchasing or finding in the library, but is not required for this class.
|
||||
My personal favourite calculus texts are those of Michael Spivak.
|
||||
I highly recommend them for enrichment reading, but again do not require them for this class.
|
||||
See the syllabus for more information on titles, editions, etc.
|
||||
</p>
|
||||
|
||||
<table class="styled-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Lesson</th>
|
||||
<th>Date</th>
|
||||
<th>Topic</th>
|
||||
<th>Worksheet</th>
|
||||
<th>Due Date</th>
|
||||
<th>Resources</th>
|
||||
<th>Textbook practice<br>(Not to hand in)</th>
|
||||
<th>External resources</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>1-1</td>
|
||||
<td>2023-08-28</td>
|
||||
<td>105L Review</td>
|
||||
<td><a href="pdfs/1-1.pdf">Worksheet</a></td>
|
||||
<td>2023-09-04</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-08-29</td>
|
||||
<td>Trigonometry, I</td>
|
||||
<td><a href="pdfs/Lab1.pdf">Lab 1</a></td>
|
||||
<td>2023-09-04</td>
|
||||
<td></td>
|
||||
<td>Section 1.5</td>
|
||||
<td><a href="https://www.khanacademy.org/math/trigonometry/trigonometry-right-triangles">Basic trig</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1-2</td>
|
||||
<td>2023-08-30</td>
|
||||
<td>Trigonometry, II</td>
|
||||
<td><a href="pdfs/Lab1cont.pdf">Worksheet</a></td>
|
||||
<td>2023-09-04</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td><a href="https://www.khanacademy.org/math/trigonometry/unit-circle-trig-func#unit-circle-definition-of-trig-functions">Unit circle</a><br><a href="https://www.khanacademy.org/math/trigonometry/unit-circle-trig-func#intro-to-radians-trig">Radians</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-08-31</td>
|
||||
<td>Trigonometric<br>modelling, I</td>
|
||||
<td><a href="pdfs/Lab2.pdf">Lab 2</a></td>
|
||||
<td></td>
|
||||
<td><a href="https://docs.google.com/spreadsheets/d/1-SgnOfTnsVkriBXMihS9xRoaKnPxdMY33Zx48nRq6fM/edit?usp=sharing">Spreadsheet</a><br><a href="https://www.geogebra.org/m/pb6bpxar">Geogebra</a></td>
|
||||
<td>Section 1.5</td>
|
||||
<td><a href="https://www.khanacademy.org/math/trigonometry/unit-circle-trig-func#xfefa5515:sinusoidal-models">Sinusoidal models</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>1-3</td>
|
||||
<td>2023-09-01</td>
|
||||
<td>Trigonometric<br>identities, limits</td>
|
||||
<td><a href="pdfs/1-3.pdf">Worksheet</a></td>
|
||||
<td>2023-09-04</td>
|
||||
<td></td>
|
||||
<td>Section 1.5</td>
|
||||
<td><a href="https://www.khanacademy.org/math/trigonometry/trig-equations-and-identities#trig-identities">Trig identities</a><br><a href="https://www.khanacademy.org/math/trigonometry/trig-equations-and-identities#xfefa5515:angle-addition-identities">Angle addition</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>2023-09-04</td>
|
||||
<td>Labour day, no class</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-09-05</td>
|
||||
<td>Trigonometric<br>modelling, II</td>
|
||||
<td>Report: Global<br>warming [group]</td>
|
||||
<td>2023-09-13</td>
|
||||
<td></td>
|
||||
<td>Section 1.5</td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/2-2.mp3">2-2</a></td>
|
||||
<td>2023-09-06</td>
|
||||
<td>Trigonometric<br>Derivatives</td>
|
||||
<td><a href="pdfs/2-2.pdf">Worksheet</a></td>
|
||||
<td>2023-09-11</td>
|
||||
<td></td>
|
||||
<td>Section 2.4</td>
|
||||
<td><a href="https://www.khanacademy.org/math/calculus-1/cs1-derivatives-definition-and-basic-rules/cs1-derivatives-of-cosx-sinx-and-lnx/v/derivatives-of-sinx-and-cosx">Differentiating trig functions</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-09-07</td>
|
||||
<td>Newton's laws<br>of motion, I</td>
|
||||
<td><a href="pdfs/Lab3.pdf">Lab 3</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/2-3.mp3">2-3</a></td>
|
||||
<td>2023-09-08</td>
|
||||
<td>Inverse trigonometric<br>functions </td>
|
||||
<td><a href="pdfs/2-3.pdf">Worksheet</a></td>
|
||||
<td>2023-09-11</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td><a href="https://www.khanacademy.org/math/trigonometry/trig-equations-and-identities#inverse-trig-functions">Inverse trig functions</a></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/3-1.mp3">3-1</a></td>
|
||||
<td>2023-09-11</td>
|
||||
<td>Trigonometric<br>inverse derivatives</td>
|
||||
<td><a href="pdfs/3-1.pdf">Worksheet</a></td>
|
||||
<td>2023-09-18</td>
|
||||
<td></td>
|
||||
<td><a href="https://touhou.ca/notes/inverse_function_theorem/">The inverse function theorem</a></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-09-12</td>
|
||||
<td>NO LAB</td>
|
||||
<td>BIG ASSIGNMENT 1</td>
|
||||
<td>2023-09-22</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/3-2.mp3">3-2</a></td>
|
||||
<td>2023-09-13</td>
|
||||
<td>Trigonometric<br>related rates</td>
|
||||
<td><a href="pdfs/3-2.pdf">Worksheet</a></td>
|
||||
<td>2023-09-18</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-09-14</td>
|
||||
<td>Newton's laws<br>of motion, II</td>
|
||||
<td>Group report: understanding gravity</td>
|
||||
<td>2023-09-20</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/3-3.mp3">3-3</a></td>
|
||||
<td>2023-09-15</td>
|
||||
<td>Postition, velocity,<br>Acceleration</td>
|
||||
<td><a href="pdfs/3-3.pdf">Worksheet</a></td>
|
||||
<td>2023-09-18</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/4-1.mp3">4-1</a></td>
|
||||
<td>2023-09-18</td>
|
||||
<td>Distance from velocity</td>
|
||||
<td><a href="pdfs/4-1.pdf">Worksheet</a></td>
|
||||
<td>2023-09-25</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-09-19</td>
|
||||
<td><a href="pdfs/Lab4.pdf">Sums, sigma notation</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/4-2.mp3">4-2</a></td>
|
||||
<td>2023-09-20</td>
|
||||
<td>Left- and right-<br>handed sums</td>
|
||||
<td><a href="pdfs/4-2.pdf">Worksheet</a></td>
|
||||
<td>2023-09-25</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-09-21</td>
|
||||
<td>Sums and sigma notation, II</td>
|
||||
<td>Lab questions [individual]</td>
|
||||
<td>2023-09-27</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/4-3.mp3">4-3</a></td>
|
||||
<td>2023-09-22</td>
|
||||
<td>The definite integral</td>
|
||||
<td><a href="pdfs/4-3.pdf">Worksheet</a></td>
|
||||
<td>2023-09-25</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/5-1.mp3">5-1</a></td>
|
||||
<td>2023-09-25</td>
|
||||
<td>Midpoint and<br>trapezoid sums</td>
|
||||
<td><a href="pdfs/5-1.pdf">Worksheet</a></td>
|
||||
<td>2023-10-02</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-09-26</td>
|
||||
<td>Postponed due to technical issues</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>5-2</td>
|
||||
<td>2023-09-27</td>
|
||||
<td>FTC I</td>
|
||||
<td><a href="pdfs/5-2.pdf">Worksheet</a></td>
|
||||
<td>2023-10-02</td>
|
||||
<td></td>
|
||||
<td><a href="https://touhou.ca/notes/fundamental_theorem_of_calculus/">A proof of FTC in an easy case</a></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-09-28</td>
|
||||
<td><a href="pdfs/Lab5.pdf">Riemann sums, I</a></td>
|
||||
<td></td>
|
||||
<td><a href="https://docs.google.com/spreadsheets/d/120b7BClRcgxO9NMXEosa-Lq8t93aJ4cCtRbzX6CmdXM/edit#gid=0">Spreadsheet</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>5-3</td>
|
||||
<td>2023-09-29</td>
|
||||
<td>FTC I, cont.</td>
|
||||
<td>See 5-2</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/6-1.mp3">6-1</a></td>
|
||||
<td>2023-10-02</td>
|
||||
<td>Properties of definite<br>integrals</td>
|
||||
<td><a href="pdfs/6-1.pdf">Worksheet</a></td>
|
||||
<td>2023-10-09</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-10-03</td>
|
||||
<td>Riemann sums, II</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><a href="recordings/6-2.mp3">6-2</a></td>
|
||||
<td>2023-10-04</td>
|
||||
<td>Constructing<br>antiderivatives</td>
|
||||
<td><a href="pdfs/6-2.pdf">Worksheet</a></td>
|
||||
<td>2023-10-09</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-10-05</td>
|
||||
<td>Riemannian Sums, III</td>
|
||||
<td>Group report</td>
|
||||
<td>2023-10-11</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>6-3</td>
|
||||
<td>2023-10-06</td>
|
||||
<td>Integration by substitution</td>
|
||||
<td><a href="pdfs/6-3.pdf">Worksheet</a></td>
|
||||
<td>2023-10-09</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>7-1</td>
|
||||
<td>2023-10-09</td>
|
||||
<td>Integration by parts</td>
|
||||
<td><a href="pdfs/7-1.pdf">Worksheet</a></td>
|
||||
<td><b>2023-10-23</b></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-10-10</td>
|
||||
<td><a href="pdfs/Lab6.pdf">Average value of<br>a function, I</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>7-2</td>
|
||||
<td>2023-10-11</td>
|
||||
<td>Antidifferentiation<br>practice, I</td>
|
||||
<td><a href="pdfs/7-2.pdf">Worksheet</a></td>
|
||||
<td><b>2023-10-23</b></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-10-12</td>
|
||||
<td>Average value of a function, II</td>
|
||||
<td>Group report</td>
|
||||
<td>2023-10-18</td>
|
||||
<td><b>Also note:</b></td>
|
||||
<td>BIG ASSIGNMENT 2</td>
|
||||
<td>2023-10-27</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>2023-10-13</td>
|
||||
<td>Fall break, no class</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>2023-10-16</td>
|
||||
<td>Fall break, no class</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>2023-10-17</td>
|
||||
<td>Fall break, no class</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>8-2</td>
|
||||
<td>2023-10-18</td>
|
||||
<td>Antidifferentiation<br>practice, II</td>
|
||||
<td>See 7-2</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-10-19</td>
|
||||
<td>Average Values, II</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>8-3</td>
|
||||
<td>2023-10-20</td>
|
||||
<td>Integrating to infinity</td>
|
||||
<td><a href="pdfs/8-3.pdf">Worksheet</a></td>
|
||||
<td>2023-10-23</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>9-1</td>
|
||||
<td>2023-10-23</td>
|
||||
<td>Other improper integrals</td>
|
||||
<td><a href="pdfs/9-1.pdf">Worksheet</a></td>
|
||||
<td>2023-10-30</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-10-24</td>
|
||||
<td><b>NO LAB</b></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>9-2</td>
|
||||
<td>2023-10-25</td>
|
||||
<td>Big assignment help</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-10-26</td>
|
||||
<td><a href="pdfs/Lab8.pdf">Force and Work: I</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>9-3</td>
|
||||
<td>2023-10-27</td>
|
||||
<td>FTC II</td>
|
||||
<td><a href="pdfs/9-3.pdf">Worksheet</a></td>
|
||||
<td>2023-10-30</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>10-1</td>
|
||||
<td>2023-10-30</td>
|
||||
<td>Differential equations,<br>initial value problems, I</td>
|
||||
<td><a href="pdfs/10-1.pdf">Worksheet</a></td>
|
||||
<td>2023-11-06</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-10-31</td>
|
||||
<td>Force and Work: II</td>
|
||||
<td></td>
|
||||
<td>2023-11-08</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>10-2</td>
|
||||
<td>2023-11-01</td>
|
||||
<td>Differential equations,<br>initial value problems, II</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-11-02</td>
|
||||
<td><a href="Lab9.pdf">Differential equations, I</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>10-3</td>
|
||||
<td>2023-11-03</td>
|
||||
<td>Slope fields, equilibria, I</td>
|
||||
<td><a href="pdfs/10-3.pdf">Worksheet</a></td>
|
||||
<td>2023-11-06</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>11-1</td>
|
||||
<td>2023-11-06</td>
|
||||
<td>Slope fields, equilibria, II</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-11-07</td>
|
||||
<td>Differential equations, II</td>
|
||||
<td>Report: Short report [group]</td>
|
||||
<td>2023-11-15</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>11-2</td>
|
||||
<td>2023-11-08</td>
|
||||
<td>Separation of variables, I</td>
|
||||
<td><a href="pdfs/11-2.pdf">Worksheet</a></td>
|
||||
<td>2023-11-13</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-11-09</td>
|
||||
<td><a href="pdfs/Lab10.pdf">Euler's method</a></td>
|
||||
<td></td>
|
||||
<td><a href="https://docs.google.com/spreadsheets/d/1ZA7G8CMg7vv50n-hQFTuMHLdfw4RS9A2lN4zQEhnLxE/edit?usp=sharing">Spreadsheet</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>11-3</td>
|
||||
<td>2023-11-10</td>
|
||||
<td>Separation of variables, II</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>12-1</td>
|
||||
<td>2023-11-13</td>
|
||||
<td>Growth and decay</td>
|
||||
<td><a href="pdfs/12-1.pdf">Worksheet</a></td>
|
||||
<td>2023-11-20</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-11-14</td>
|
||||
<td>Euler's method</td>
|
||||
<td>Report: Short report [group]</td>
|
||||
<td>2023-11-22</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>12-2</td>
|
||||
<td>2023-11-15</td>
|
||||
<td>Applications: heating<br>and mixing, I</td>
|
||||
<td><a href="pdfs/12-2.pdf">Worksheet</a></td>
|
||||
<td>2023-11-20</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-11-16</td>
|
||||
<td>Euler's method</td>
|
||||
<td>BIG ASSIGNMENT 3</td>
|
||||
<td>2023-11-27</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>12-3</td>
|
||||
<td>2023-11-17</td>
|
||||
<td>Applications: heating<br>and mixing, I cont.</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>13-1</td>
|
||||
<td>2023-11-20</td>
|
||||
<td>Applications: heating<br>and mixing, II (online only)</td>
|
||||
<td><a href="pdfs/13-1.pdf">Worksheet</a></td>
|
||||
<td>2023-11-27</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>2023-11-21</td>
|
||||
<td>Thanksgiving, no class</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>2023-11-22</td>
|
||||
<td>Thanksgiving, no class</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>2023-11-23</td>
|
||||
<td>Thanksgiving, no class</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td>2023-11-24</td>
|
||||
<td>Thanksgiving, no class</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>14-1</td>
|
||||
<td>2023-11-27</td>
|
||||
<td></td>
|
||||
<td><a href="pdfs/14-1.pdf">Worksheet</a></td>
|
||||
<td>2023-12-04</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-11-28</td>
|
||||
<td><a href="pdfs/Lab11.pdf">Chemical rates</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>14-2</td>
|
||||
<td>2023-11-29</td>
|
||||
<td>The logistic model for<br>population, I</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-11-30</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>14-3</td>
|
||||
<td>2023-12-01</td>
|
||||
<td>The logistic model for<br>population, II</td>
|
||||
<td><a href="pdfs/14-3.pdf">Worksheet</a></td>
|
||||
<td>2023-12-04</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>15-1</td>
|
||||
<td>2023-12-04</td>
|
||||
<td>Population models<br>with migration</td>
|
||||
<td><a href="pdfs/15-1.pdf">Worksheet</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-12-05</td>
|
||||
<td><a href="pdfs/Lab12.pdf">Logistic model:<br>fishing</a></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>15-2</td>
|
||||
<td>2023-12-06</td>
|
||||
<td>Applications of the<br>logistic model</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Lab</td>
|
||||
<td>2023-12-07</td>
|
||||
<td>Logistic model:<br>fishing</td>
|
||||
<td>Report: Short report [group]</td>
|
||||
<td>2023-12-15</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>15-3</td>
|
||||
<td>2023-12-08</td>
|
||||
<td>Course evaluations</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
</body>
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
<title>Spencer Nicholas Whitehead's Academic Page</title>
|
||||
<link rel="stylesheet" href="/static/main.css">
|
||||
<body>
|
||||
<h2>Spencer Nicholas Whitehead</h2>
|
||||
|
||||
<a href="/academic">Research</a> | <a href="/academic/cv">CV</a> | <a href="/academic/teaching"><b>Teaching</b></a> | <a href="/academic/art">Art</a>
|
||||
<hr>
|
||||
|
||||
<p>For the Fall 2023 semester I am instructor of record on MATH 106L. <a href="/academic/teaching/2023/106">Click here to access the course webpage for MATH 106L.</a></p>
|
||||
<p>Below are a list of my previous teaching activities.</p>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Role</th>
|
||||
<th>Course</th>
|
||||
<th>Term</th>
|
||||
<th>Institution</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>Lab TA</td>
|
||||
<td>MATH 111<br>Calculus 1</td>
|
||||
<td>Fall 2022</td>
|
||||
<td>Duke</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Marker</td>
|
||||
<td>PMATH 347<br>Intro to Groups and Rings</td>
|
||||
<td>Spring 2022</td>
|
||||
<td>Waterloo</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Marker</td>
|
||||
<td>PMATH 365<br>Differential Geometry</td>
|
||||
<td>Winter 2022</td>
|
||||
<td>Waterloo</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TA</td>
|
||||
<td>MATH 137<br>Calculus 1 for Hon. Math</td>
|
||||
<td>Fall 2021</td>
|
||||
<td>Waterloo</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Tutor<br>(Official)</td>
|
||||
<td>MATH 136<br>Lin. Alg. 1 for Hon. Math</td>
|
||||
<td>Winter 2021</td>
|
||||
<td>Waterloo</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>TA lead</td>
|
||||
<td>MATH 135<br>Algebra for Hon. Math</td>
|
||||
<td>Fall 2020</td>
|
||||
<td>Waterloo</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Tutor<br>(Official)</td>
|
||||
<td>MATH 136</td>
|
||||
<td>Fall 2019</td>
|
||||
<td>Waterloo</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Tutorial lecturer</td>
|
||||
<td>CS 246<br>Obj. Oriented Soft. Devel</td>
|
||||
<td>Fall 2019</td>
|
||||
<td>Waterloo</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Tutorial lecturer</td>
|
||||
<td>CS 246</td>
|
||||
<td>Winter 2018</td>
|
||||
<td>Waterloo</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Instructional<br>support (full-time)</td>
|
||||
<td>CS 246</td>
|
||||
<td>Fall 2018</td>
|
||||
<td>Waterloo</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</body>
|
||||
25
templates/en/homelab/index.html
Normal file
25
templates/en/homelab/index.html
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
{% import "common.html" as common %}
|
||||
{{ common::meta(title="Spencer Whitehead - Homelab") }}
|
||||
<body>
|
||||
{{ common::nav() }}
|
||||
<h2>Homelab</h2>
|
||||
<main role="main">
|
||||
The website you are currently viewing is being served by my personal computing homelab, a cluster of three nodes orchestrated by k3s.
|
||||
|
||||
<h3>crusader</h3>
|
||||
<code>crusader</code> is a VPS managed by Vultr, used as a secure reverse proxy to my primary nodes.
|
||||
It is responsible for running a Nginx proxy server.
|
||||
|
||||
<h3>churchill</h3>
|
||||
<code>churchill</code> was built in 2014, featuring an AMD FX-8310 chip and 8GB of RAM, running Devuan Linux 6.
|
||||
It is the control node for the k3s cluster, and is responsible for lightweight web services such as this website and <a href="https://git.touhou.ca/spencer/website">my private git server</a>.
|
||||
|
||||
<h3>valentine</h3>
|
||||
<code>valentine</code> was built in 2018. It has a AMD Ryzen 7 1700 chip and 16GB of DDR4 2400 RAM, running Linux Mint 21.
|
||||
It is responsible for heavier media services, such as Jellyfin and Subsonic.
|
||||
|
||||
<h3>blackprince</h3>
|
||||
<code>blackprince</code> was built in 2025. It has an AMD Ryzen 7 7700XD chip, an Nvidia GeForce 1080 GPU, and 64GB of DDR5 3200 RAM, running Linux Mint 22.
|
||||
It is primarily used as a personal computing node, and for running more intense computations for research purposes.
|
||||
</main>
|
||||
</body>
|
||||
|
|
@ -1,8 +1,5 @@
|
|||
{% import "common.html" as common %}
|
||||
{{ common::meta(title="Home Page", lang="en") }}
|
||||
<body>
|
||||
<p>Pour accéder à la version française, veuillez cliquer <a href="/fr/">ici.</a></p>
|
||||
<p>This is the personal website of Spencer Whitehead. I am a fourth-year Ph.D. candidate at Duke University, expecting to graduate in early 2027.
|
||||
My primary research interests are in gauge theory, four- and eight-dimensional differential geometry, and the applications of computer algebra systems to solving problems in geometry.</p>
|
||||
<p><a href="resume/">Resume</a></p>
|
||||
{{ load_markdown(path=path ~ "content.md") | safe }}
|
||||
</body>
|
||||
|
|
|
|||
44
templates/en/publications/index.html
Normal file
44
templates/en/publications/index.html
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
{% import "common.html" as common %}
|
||||
{{ common::meta(title="Spencer Whitehead - Publications") }}
|
||||
<body>
|
||||
{{ common::nav() }}
|
||||
<h2>Publications</h2>
|
||||
<main role="main">
|
||||
<p>This page contains a list of my published (scholarly) works with plain-language descriptions of the results.</p>
|
||||
<article>
|
||||
<p><strong><i>On a smoothness characterization for good moduli spaces</i></strong>, joint with Dan Edidin and Matt Satriano, published in <i>Advances in Mathematics</i> in April 2024.</p>
|
||||
<p>A preprint is available for free <a href="https://arxiv.org/pdf/1905.04845">on the arXiv</a>. I was responsible for writing the second section of this paper (pp. 5 - 20 in the preprint).</p>
|
||||
<p>In mathematics, we are often interested in the spaces that result when taking a large space and 'identifying' some points (making a new, smaller space by declaring some points to be indistinguishable from each other). A typical example would be folding a piece of paper in half: so the top left corner is identified with the bottom left corner, and so on. Identifications that arise from a procedure like folding a sheet of paper leave a <i>crease</i> in the paper, points that are not identified to any other point. Mathematicians call such points <i>singular</i> (meaning 'exceptional/rare'), as the crease line is a one-dimensional object, while the paper itself is two-dimensional. The opposite of singular is <i>smooth</i>.</p>
|
||||
|
||||
<p>We considered the general problem of identifying which paper-folding rules were singular, and which were smooth (in mathematical jargon: which complex representations of a group have smooth GIT quotients?) The answer for a list of finitely many rules has been known since the 1950s, due to Shephard and Todd—the space is smooth only when the rules are generated by those rotating one dimension and leaving fixed a hyperplane.
|
||||
In our work, we allow for infinitely many rules, and recovered in some cases a natural generalization of the theorem of Shephard and Todd: we prove roughly that smoothness follows when the rules are generated by a rotation in one dimension leaving fixed a hypersurface.</p>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<p><strong><i>Generalized Pythagorean Lutes</i></strong>, published in the <i>Proceedings of Bridges 2022</i> in August 2022.</p>
|
||||
<p>The paper is available for free from the proceedings <a href="https://archive.bridgesmathart.org/2022/bridges2022-335.pdf">here (PDF, 8MB)</a>.<p>
|
||||
|
||||
<p>In this paper I investigated the construction of a geometric pattern (attributed to Pythagoras, but probably much more recent) called the <a href="https://en.wikipedia.org/wiki/Lute_of_Pythagoras">"lute of Pythagoras"</a>. The pattern features an appealing self-symmetry between the pentagon and its stellation, the pentagram, demonstrating how they fit 'within' each other in an infinite chain, descending in scale exponentially with the golden ratio. In this short paper, I formalized the geometric structure of the lute of Pythagoras and generalized it to higher dimensions. I proved that such structures can exist only in dimensions 2, 3, and 4, and that the lute of Pythagoras itself is a two-dimensional shadow of a larger 'generalized lute of Pythagoras' existing in four dimensions, based on an exceptional four-dimensional shape called the <a href=https://en.wikipedia.org/wiki/Dodecaplex>dodecaplex</a>.</p>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<p><strong><i>Integrality theorems for symmetric instantons</i></strong>, M.Math thesis (supervised by Benoit Charbonneau), August 2022.</p>
|
||||
<p>This thesis is available online <a href="https://uwspace.uwaterloo.ca/items/9add27bf-c8c6-493a-a697-608af3fdc8ef">through UWSpace</a>.</p>
|
||||
|
||||
<p>In this thesis, I studied objects from mathematical physics called 'instantons': particular solutions to the Yang—Mills equations that appear in various places in geometry, topology, knot theory, and high-energy particle physics. The instanton equations are very complicated, and thus difficult to solve directly. One promising idea is to look just for solutions that have some prescribed symmetry; these symmetries impose additional equations that can in some cases be used to directly construct interesting examples of instantons.</p>
|
||||
|
||||
<p>The original methodology for constructing instantons by symmetries was set out in a series of papers by Singer, Sutcliffe, et al. from the late 1990s and early 2000s. In my thesis, I generalized their framework and provided a formal proof of correctness. Then, I used the generalized framework to resolve a series of questions that had been left open in the original papers, constructing two new examples of instantons with the symmetries of the dodecahedron, and using a computer to prove that any instanton with the symmetries of a dodecaplex must satisfy a certain lower bound on its charge, resolving a 2013 question of Allen—Sutcliffe.</p>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<p><strong><i>Studying Wythoff and Zometool constructions using Maple</i></strong>, joint with Benoit Charbonneau, published in <i>Maple in Mathematics Education and Research</i> in February 2020.</p>
|
||||
<p>A preprint is available for free <a href="https://arxiv.org/abs/1908.07153">on the arXiv</a>. I was responsible for the initial writing of the paper and most of the software development.</p>
|
||||
|
||||
<p>In this paper, we concern ourselves with the mathematical educational toy <a href="https://en.wikipedia.org/wiki/Zometool">Zometool</a>. We had experience working in large-scale projects with Zometool previously (see the <a href="https://uwaterloo.ca/omnitruncated-dodecaplex/">Great Omnitruncated Dodecaplex Barn Raising Project</a>, University of Waterloo 2019), in which we built certain four-dimensional geometric objects using Zometool.</p>
|
||||
|
||||
<p>Any time one builds a four-dimensional object in three-dimensions, it is necessary to "project a dimension away": for example, by placing the skeleton of a three-dimensional cube in front of a light source, one can project it to a two-dimensional image on a wall.
|
||||
Not all projections are equal: some (like the <a href="https://en.wikipedia.org/wiki/Stereographic_projection">stereographic projection</a> distort lengths, while others (such as the orthogonal projection, where we imagine an infinitely strong light source placed infinitely far away) may cause edges to cross each other. In this project, we created <a href="https://git.uwaterloo.ca/Zome-Maple/Zome-Maple">a software package in Maple</a> to determine what projections could actually be constructed in the Zometool building system, and to generate plans for building complicated geometric projections in Zometool. We focused especially on a class of shapes called <a href="https://en.wikipedia.org/wiki/Wythoff_construction">Wythoff constructions</a>, which are the result of looking at images of a point in a system of mirrors called a kaleidoscope.</p>
|
||||
</article>
|
||||
</main>
|
||||
</body>
|
||||
|
||||
|
|
@ -1,16 +1,17 @@
|
|||
{% import "common.html" as common %}
|
||||
{{ common::meta(title="Spencer Whitehead - Resume", lang="en") }}
|
||||
{{ common::meta(title="Spencer Whitehead - Resume") }}
|
||||
<body>
|
||||
{{ common::nav() }}
|
||||
|
||||
<header>
|
||||
<h1>Spencer Nicholas Whitehead</h1>
|
||||
<h1>Spencer Whitehead</h1>
|
||||
<address>
|
||||
Email: <a href="mailto:spencer@firemail.cc">spencer@firemail.cc</a><br>
|
||||
Phone: +1 984 312 9089
|
||||
</address>
|
||||
</header>
|
||||
|
||||
<main role="main">
|
||||
<section>
|
||||
<h2>Education</h2>
|
||||
|
||||
|
|
@ -45,7 +46,7 @@
|
|||
<article>
|
||||
<p><strong>Software Engineering Intern</strong>, Citadel Enterprise, January 2020 – April 2020</p>
|
||||
<ul>
|
||||
<li>Developed C++ data pipelines to parse and archive data streams from Thompson Reuters.</li>
|
||||
<li>Developed C++ data pipelines to parse and archive data streams from Thomson Reuters.</li>
|
||||
<li>Handled over 300GB per day of market data at the height of the market impact of COVID-19.</li>
|
||||
</ul>
|
||||
</article>
|
||||
|
|
@ -83,17 +84,17 @@
|
|||
|
||||
<section>
|
||||
<h2>Leadership and Professional Service</h2>
|
||||
<p>Steward, Duke Graduate Students Union, Fall 2025 - present</p>
|
||||
<p><strong>Steward</strong>, Duke Graduate Students Union, Fall 2025 - present</p>
|
||||
<ul>
|
||||
<li>Mediated workplace disputes and represented graduate workers in grievance proceedings.</li>
|
||||
</ul>
|
||||
|
||||
<p>President, AMS Student Chapter, 2024-25 academic year</p>
|
||||
<p><strong>President</strong>, Duke AMS Student Chapter, 2024-25 academic year</p>
|
||||
<ul>
|
||||
<li>Organized and hosted the Triangle Area Graduate Mathematics Seminar with NC State University and UNC Chapel Hill at Duke, February 2025.</li>
|
||||
</ul>
|
||||
|
||||
<p>Graduate student representative, Duke Mathematics Departmental Teaching Committee, Fall 2023 - present</p>
|
||||
<p><strong>Graduate student representative</strong>, Duke Mathematics Departmental Teaching Committee, Fall 2023 - present</p>
|
||||
<ul>
|
||||
<li>Performed annual interviews and advocated for graduate interests in departmental teaching decisions.</li>
|
||||
</ul>
|
||||
|
|
@ -113,10 +114,15 @@
|
|||
<article>
|
||||
<h3>Supervision</h3>
|
||||
<p><strong>Duke Math+ program</strong> (joint with Biji Wong, Gregory Herschlag), Spring 2026</p>
|
||||
<ul>
|
||||
<li>
|
||||
<p>Supervised four undergraduate students in a project on the application of diffusion maps and machine learning to graph partition problems, with a focus on the study of gerrymandering.</p>
|
||||
|
||||
</li>
|
||||
</ul>
|
||||
<p><strong>MITACS internship program</strong> (joint with Benoit Charbonneau), Spring 2022</p>
|
||||
<p>Supervised two undergraduate students in a computational project on low-dimensional optimal packing problems</p>
|
||||
<ul>
|
||||
<li><p>Supervised two undergraduate students in a computational project on low-dimensional optimal packing problems.</p></li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
|
|
@ -143,7 +149,7 @@
|
|||
</ul>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,13 @@
|
|||
|
||||
|
||||
<body>
|
||||
<h2>Page d'accueil — Spencer Whitehead</h2>
|
||||
<main role="main">
|
||||
<p>To access the English version, click <a href="/en/">here.</a></p>
|
||||
<p>Ceci est le site web personnel de Spencer Whitehead.</p>
|
||||
<p>N.B. : ma langue maternelle est l'anglais ; je m'en excuse d'avance pour les éventuelles fautes sur cette page. En cas d'erreur, veuillez m'envoyer un e-mail à <a href="mailto:spencer@firemail.cc">spencer@firemail.cc</a>.</p>
|
||||
|
||||
<p>Ceci est le site web personnel de Spencer Whitehead. Je suis doctorant en quatrième année à l'université Duke. Je m'intéresse à la recherche en géométrie différentielle, particulièrement en dimension 4 et 8. J'étudie aussi les applications des systèmes de calcul formel aux problèmes de géométrie. Je prévois de soutenir ma thèse en avril 2027.</p>
|
||||
<p>
|
||||
<p><a href="resume/">CV</a></p>
|
||||
</main>
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -4,30 +4,30 @@
|
|||
<body>
|
||||
{{ common::nav() }}
|
||||
|
||||
<header>
|
||||
<h1>Spencer Nicholas Whitehead</h1>
|
||||
<header role="banner">
|
||||
<h1>Spencer Whitehead</h1>
|
||||
<address>
|
||||
Courriel : <a href="mailto:spencer@firemail.cc">spencer@firemail.cc</a><br>
|
||||
Tél. : +1 984 312 9089
|
||||
</address>
|
||||
</header>
|
||||
|
||||
<main role="main">
|
||||
<section>
|
||||
<h2>Education</h2>
|
||||
<h2>Formation</h2>
|
||||
|
||||
<article>
|
||||
<p><strong>Doctorant, départment des mathématiques, Université Duke</strong> | septembre 2022 – avril 2027</p>
|
||||
<p><strong>Doctorant, département de mathématiques, Université Duke</strong> | septembre 2022 – avril 2027</p>
|
||||
<ul>
|
||||
<li>Chercheur de la geometrie de quatre et huit dimensions sous la direction du Pr Mark Stern.</li>
|
||||
<li>Membre du programme de certificat en enseignant universitaire, qui sera décerné à la reussit au doctorat.</li>
|
||||
<li>Chercheur en géométrie de quatre et huit dimensions sous la direction du Pr Mark Stern.</li>
|
||||
<li>Membre du programme de certificat en enseigement universitaire, qui sera décerné à la réussite du doctorat.</li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<p><strong>M.Math. en mathématiques pures (thèse du recherche), Université de Waterloo</strong> | octobre 2021 – août 2022</p>
|
||||
<p><strong>M.Math. en mathématiques pures (thèse de recherche), Université de Waterloo</strong> | octobre 2021 – août 2022</p>
|
||||
<ul>
|
||||
<li>Sous la direction du Pr Benoit Charbonneau.</li>
|
||||
<li>Titre du thèse : Integrality theorems for symmetric instantons.</li>
|
||||
<li>Sous la direction du Pr Benoît Charbonneau.</li>
|
||||
<li>Titre de la thèse : Integrality theorems for symmetric instantons.</li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
|
|
@ -41,35 +41,35 @@
|
|||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Industry Experience</h2>
|
||||
<h2>Expérience industrielle</h2>
|
||||
|
||||
<article>
|
||||
<p><strong>Stagiaire en ingénierie logicielle</strong>, Citadel Enterprise, janvier 2020 – avril 2020</p>
|
||||
<ul>
|
||||
<li>Developpment de pipelines en C++ pour analyser et archiver donnèes de Thompson Reuters.</li>
|
||||
<li>Traitment d'en haute de 300GB des donnèes de marché par jour pendant la crise de COVID-19.</li>
|
||||
<li>Développement de pipelines en C++ pour analyser et archiver des données de Thomson Reuters.</li>
|
||||
<li>Traitement en masse de plus de 300 GB de données de marché par jour pendant la crise de COVID-19.</li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<p><strong>Stagiaire en ingénierie logicielle</strong>, ContextLogic LLC, janvier 2018 – avril 2018</p>
|
||||
<ul>
|
||||
<li>Recherche sur les estimates de délais de livraison qui ont généré 2,5% de profits supplémentaires.</li>
|
||||
<li>Création de reports et tableau de bord Grafana en combinaison des donnèes de MongoDB et TreasureData.</li>
|
||||
<li>Recherche sur les estimations de délais de livraison ayant généré 2,5 % de profits supplémentaires.</li>
|
||||
<li>Création de rapports et tableau de bord Grafana à partir de données de MongoDB et TreasureData.</li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<p><strong>Stagiaire en ingénierie logicielle</strong>, Citadel LLC, septembre 2017 – décembre 2017</p>
|
||||
<ul>
|
||||
<li>Création et soutien de logiciel de accounting comptabilité pour plus de 100 clients interne.</li>
|
||||
<li>Conception et implementation des nouveaux formats de réponse, ce qui a reduisé la taille de la réponse 10x et a amelioré la vitesse 5x.</li>
|
||||
<li>Création et soutien de logiciels de comptabilité pour plus de 100 clients internes.</li>
|
||||
<li>Conception et implémentation de nouveaux formats de réponse, ce qui a réduit la taille de la réponse par 10 fois et a amelioré la vitesse par 5 fois.</li>
|
||||
</ul>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Skills</h2>
|
||||
<h2>Compétences</h2>
|
||||
<dl>
|
||||
<dt><strong>Langues</strong></dt>
|
||||
<dd>anglais, français (DELF B2), japonais (niveau B2/C1).</dd>
|
||||
|
|
@ -84,27 +84,27 @@
|
|||
|
||||
<section>
|
||||
<h2>Leadership et services professionnels</h2>
|
||||
<p>Délégué syndical, Duke Graduate Students Union, septembre 2025 - à ce jour</p>
|
||||
<p><strong>Délégué syndical</strong>, Duke Graduate Students Union, septembre 2025 - à ce jour</p>
|
||||
<ul>
|
||||
<li>Mediation de conflits au travail et répresentation des doctorants en procédure de gref.</li>
|
||||
<li>Médiation de conflits au travail et représentation des doctorants en procédure de gref.</li>
|
||||
</ul>
|
||||
|
||||
<p>Président, Section étudiant de l'American Mathematical Society, année universitaire 2024-25</p>
|
||||
<p><strong>Président</strong>, Section étudiante de l'American Mathematical Society, année universitaire 2024-25</p>
|
||||
<ul>
|
||||
<li>Organisation du Triangle Area Graduate Mathematics Seminar avec l'Université NC State et l'UNC Chapel Hill à Duke, février 2025.</li>
|
||||
<li>Organisation du Triangle Area Graduate Mathematics Seminar avec l'université d'État de Caroline du Nord et l'université de Caroline du Nord à Chapel Hill, février 2025 à l'université Duke.</li>
|
||||
</ul>
|
||||
|
||||
<p>Représentant des doctorants, Duke Mathematics Departmental Teaching Committee, novembre 2023 - à ce jour</p>
|
||||
<p><strong>Représentant des doctorants</strong>, Duke Mathematics Departmental Teaching Committee, novembre 2023 - à ce jour</p>
|
||||
<ul>
|
||||
<li>Performed annual interviews and advocated for graduate interests in departmental teaching decisions.</li>
|
||||
<li>Réalisation d'entretiens annuels et défense des intérêtes des doctorants dans les décisions d'enseignement départementales.</li>
|
||||
</ul>
|
||||
</section>
|
||||
|
||||
<section>
|
||||
<h2>Academic Activity</h2>
|
||||
<h2>Activités de recherche</h2>
|
||||
|
||||
<article>
|
||||
<h3>Selected Publications</h3>
|
||||
<h3>Publications sélectionnées</h3>
|
||||
<ul>
|
||||
<li>Edidin, Dan, Matthew Satriano, et Spencer Whitehead. "On a smoothness characterization for good moduli spaces." <em>Advances in Mathematics</em> 442 (avril 2024).</li>
|
||||
<li>Charbonneau, B. et Whitehead, S. "Studying Wythoff and Zometool Constructions using Maple." <em>Maple in Mathematics Education and Research</em> (pp. 65–76), 2020.</li>
|
||||
|
|
@ -114,37 +114,41 @@
|
|||
<article>
|
||||
<h3>Direction</h3>
|
||||
<p><strong>Duke Math+ program</strong> (joint with Biji Wong, Gregory Herschlag), mai - août 2026</p>
|
||||
<p>Direction de quatres étudiants dans un projet sur l'application de diffusion maps et apprentissage automatique pour rechercher le gerrymandering.</p>
|
||||
<ul>
|
||||
<li><p>Direction de quatre étudiants dans un projet sur l'application de diffusion maps et apprentissage automatique pour étudier le gerrymandering.</p></li>
|
||||
</ul>
|
||||
|
||||
<p><strong>MITACS internship program</strong> (joint with Benoit Charbonneau), mai - août 2022</p>
|
||||
<p>Direction de deux étudiants dans un projet sur le probleme de packing en bas dimension.</p>
|
||||
<p><strong>MITACS internship program</strong> (joint with Benoît Charbonneau), mai - août 2022</p>
|
||||
<ul>
|
||||
<li><p>Direction de deux étudiants dans un projet sur le problème de packing en basse dimension.</p></li>
|
||||
</ul>
|
||||
</article>
|
||||
|
||||
<article>
|
||||
<h3>Selected Research Presentations</h3>
|
||||
<h3>Communications sélectionnées</h3>
|
||||
<ul>
|
||||
<li>[Invité] <em>An asymptotic Nahm transform for Spin(7) instantons.</em> Mathematical Congress of the Americas, Miami, julliet 2025.</li>
|
||||
<li>[Invité] <em>An asymptotic Nahm transform for Spin(7) instantons.</em> Mathematical Congress of the Americas, Miami, juillet 2025.</li>
|
||||
<li><em>Symmetric instantons.</em> (Poster). Geometric Models of Matter, Leeds, août 2024.</li>
|
||||
<li><em>Generalized Pythagorean lutes.</em> Bridges 2022, Helsinki, août 2022.</li>
|
||||
<li><em>Integrality theorems for symmetric instantons.</em> Union College Mathematics Conference, Schenectady, juin 2022.</li>
|
||||
</ul>
|
||||
</article>
|
||||
<article>
|
||||
<h3>Selected Teaching Experience</h3>
|
||||
<h3>Expérience d'enseignement sélectionnée</h3>
|
||||
<p><strong>Chargé de cours</strong> MATH 106L (Lab calculus 2), août - décembre 2023, Université Duke</p>
|
||||
<ul>
|
||||
<li>Enseignement et coordination d'un group de 18 étudiants.</li>
|
||||
<li>Gestion d'une équipe de 4 auxiliaires d'enseignement</li>
|
||||
<li>Enseignement et coordination d'un groupe de 18 étudiants.</li>
|
||||
<li>Gestion d'une équipe de 4 auxiliaires d'enseignement.</li>
|
||||
</ul>
|
||||
|
||||
<p><strong>Auxiliaire d'enseignment</strong> CS 246(E) ([Enriched] Object-Oriented Software Development), septembre 2018 - décembre 2019, Université de Waterloo.</p>
|
||||
<p><strong>Auxiliaire d'enseignement</strong> CS 246(E) ([Enriched] Object-Oriented Software Development), septembre 2018 - décembre 2019, Université de Waterloo.</p>
|
||||
<ul>
|
||||
<li>Delivered weekly tutorial lectures for classes of 50+ students.</li>
|
||||
<li>Creation des devoirs et gestation d'outils logiciels pour evaluer code d'étudiants</li>
|
||||
<li>Cours de tutorat hebdomadaires pour des groupes de plus de 50 étudiants.</li>
|
||||
<li>Création des devoirs et gestion d'outils logiciels pour évaluer le code des étudiants.</li>
|
||||
</ul>
|
||||
</article>
|
||||
</section>
|
||||
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
|
|
|||
8
update_static.sh
Executable file
8
update_static.sh
Executable file
|
|
@ -0,0 +1,8 @@
|
|||
#!/bin/bash
|
||||
|
||||
# updates static files in the deployment without a full rebuild
|
||||
POD=$(sudo k3s kubectl get pods | grep website | awk '{ print $1 }')
|
||||
echo "Recursive copy static to $POD:/app/static/"
|
||||
sudo k3s kubectl exec $POD -- sh -c "rm -rf /app/static/" || echo "Error in deleting directory"
|
||||
sudo k3s kubectl cp static "$POD:/app/static/" || echo "Error in copying new files"
|
||||
|
||||
Loading…
Reference in a new issue