PageSourceSearch

https://parkie-doo.sh/thoughts

html parkie-doo.sh collected 2026-10-04 09:33:40 UTC 112,294 bytes, 18 lines download raw bytes

1<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Thoughts / Parker Ziegler / Software Engineer and Cartographer</title><meta name="description" content="Musings, learnings, and tutorials written by Parker Ziegler, a software engineer and cartographer based in Berkeley, CA."/><meta property="og:title" content="Thoughts / Parker Ziegler / Software Engineer and Cartographer"/><meta property="og:description" content="Musings, learnings, and tutorials written by Parker Ziegler, a software engineer and cartographer based in Berkeley, CA."/><meta property="og:type" content="website"/><meta property="og:image" content="/thoughts/og-image.png"/><meta property="og:image:alt" content="Thoughts / Parker Ziegler / Software Engineer and Cartographer"/><meta property="og:image:width" content="1280"/><meta property="og:image:height" content="675"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:creator" content="@parker_ziegler"/><meta name="twitter:title" content="Thoughts / Parker Ziegler / Software Engineer and Cartographer"/><meta name="twitter:description" content="Musings, learnings, and tutorials written by Parker Ziegler, a software engineer and cartographer based in Berkeley, CA."/><meta name="twitter:image" content="/thoughts/og-image.png"/><meta name="next-head-count" content="16"/><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><meta name="theme-color" content="#7b16ff"/><link rel="icon" type="image/png" href="/favicon/favicon-48.png"/><link rel="icon" type="image/png" href="/favicon/favicon-96.png"/><link rel="icon" type="image/png" href="/favicon/favicon-144.png"/><link rel="icon" type="image/png" href="/favicon/favicon-192.png"/><style>
2            html {
3              font-size: 10px;
4              scroll-behavior: smooth;
5            }
6
7            body {
8              margin: 0;
9              overflow-x: hidden;
10            }
11
12            * {
13              box-sizing: border-box;
14            }
15          </style><link rel="preload" href="/_next/static/media/d9c8a48aa27d17bd-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/media/97ac91773d3121b2-s.p.woff2" as="font" type="font/woff2" crossorigin="anonymous" data-next-font="size-adjust"/><link rel="preload" href="/_next/static/css/1fd5545aab654765.css" as="style" crossorigin=""/><link rel="stylesheet" href="/_next/static/css/1fd5545aab654765.css" crossorigin="" data-n-g=""/><noscript data-n-css=""></noscript>
15<script defer="" crossorigin="" nomodule="" src="/_next/static/chunks/polyfills-c67a75d1b6f99dc8.js"></script>
15<script src="/_next/static/chunks/webpack-5aafa03a7ba29c94.js" defer="" crossorigin=""></script>
15<script src="/_next/static/chunks/framework-84465b8d7b10076d.js" defer="" crossorigin=""></script>
15<script src="/_next/static/chunks/main-31d19595cfab07d9.js" defer="" crossorigin=""></script>
15<script src="/_next/static/chunks/pages/_app-dda59870a214bdac.js" defer="" crossorigin=""></script>
15<script src="/_next/static/chunks/pages/thoughts-7be0747631bc2946.js" defer="" crossorigin=""></script>
15<script src="/_next/static/w57ZcEGWwx5SCMXHkOiaY/_buildManifest.js" defer="" crossorigin=""></script>
15<script src="/_next/static/w57ZcEGWwx5SCMXHkOiaY/_ssgManifest.js" defer="" crossorigin=""></script>
15</head><body><div id="__next"><div class="w-full bg-gradient-to-r from-primary to-terminal-secondary sm:header-clip-path __variable_8d7944"><header class="w-full max-w-view mx-auto flex items-center justify-between flex-auto px-8 sm:px-32 md:px-40 py-8 sm:pt-8 sm:pb-16"><a href="/"><svg height="55" width="200" viewBox="0 0 200 55" class="fill-current text-white -ml-4 font-serif"><g><path d="M-0.43301270189221697 54.75000000000001 C-0.43301270189221697 54.75000000000001, -0.43301270189221697 54.75000000000001, -0.43301270189221697 54.75000000000001 M-0.43301270189221697 54.75000000000001 C-0.43301270189221697 54.75000000000001, -0.43301270189221697 54.75000000000001, -0.43301270189221697 54.75000000000001 M1.652450297278553 54.92812568329906 C1.3076273790081734 54.43285552991651, 0.8451344665491757 54.439057166933345, 0.09686977217937578 53.79242909147092 M1.8721699219121328 54.789521662110964 C1.2274219417218957 54.52402491967086, 0.47274142285629117 54.08052125738816, -0.023664239405301338 53.86848967311825 M3.980891508230695 55.458840436872094 C3.0293621622893396 54.47160277705607, 2.075248164504145 53.3377360838458, -0.21842792340562456 52.155754308688074 M4.238827055391513 55.261890550071804 C2.8147522266239413 54.39182660505738, 1.9298035943756287 53.84326565427447, -0.34733101323127125 52.62579437405281 M6.422855702097291 55.27528496125257 C3.779063812503221 54.598569841478486, 2.061353430039123 53.08975202708169, 0.09329471908988274 51.33597334916434 M5.949394675178059 55.26639764022405 C3.7970803245592037 53.679413074899784, 1.6545152629705635 52.82620522271206, 0.34526103688553 51.81042275071455 M7.797736774047577 55.08832675038257 C4.841527836656958 52.918893972387764, 3.3660965744047315 51.790949006935094, -0.9007841188121013 51.17232902129086 M8.066268450230035 54.725187326581754 C5.536860357531447 53.30038698723538, 3.1278662091112612 52.139782048663214, 0.2751608676759532 50.15736778073088 M8.780013481762348 54.63570849810335 C7.82787313878842 53.42729139797202, 6.380220682170111 52.04341869622555, -0.27879129664400937 49.51370108609613 M10.336544805317049 54.580732045398236 C6.961424083523157 52.85426934087137, 3.286935265797341 50.76493915969035, 0.7180527104226986 49.35041139248646 M12.354833298969307 56.154349636931926 C9.218979697106832 53.70647899055684, 2.842776012550887 49.940428673537426, 0.8252301055027158 47.629758244400065 M12.364286764949183 55.590157655121374 C8.184694396697822 53.4613018790764, 4.434616090610047 50.47077533478288, -0.5891036436325296 47.54803895152409 M14.895843912535312 56.06774582267993 C12.152278733287423 52.92775661136374, 7.1943583718522595 52.59803574078877, -0.6409050229465059 45.25428672206189 M15.082074892422927 54.51629322657002 C11.154779302576074 53.09710824575557, 7.691798021981973 50.83014458578995, -0.6425496752413575 45.966837935476 M14.561804833714705 54.89517059322493 C12.29551502418537 52.86910567262609, 6.720299773906148 50.1080405997163, 0.45689811330588026 44.603007363361314 M14.94839540767337 54.540291914349126 C10.525963427971552 51.91379485129173, 4.586959156505576 48.82381830023517, 0.0012259090583091048 46.61081254514183 M18.7968662326673 54.453444028190205 C12.811430309100219 51.309528210449834, 8.92139233011921 51.36126649400414, -1.654295103684095 45.72454352296341 M17.3689573227218 55.69292982505167 C12.708731944791738 51.73896868027094, 6.397838645082114 48.32125650204434, -0.6302611548602106 45.2187090947364 M21.575557687973816 56.357586979930566 C13.274893675520223 49.30709638212395, 5.589246892617005 45.421205875014316, 1.7362932487393041 44.770087380345316 M20.928436447763723 54.17198530678736 C13.620834714121871 52.71053417572689, 7.575214038321439 47.4031728596298, 0.9881866949629694 43.72134697877216 M22.657506066895778 55.02436224160199 C12.982281025764985 48.402746181870576, 3.6535470545016633 45.06548043622622, -2.092953540674694 43.63421273618441 M21.940163814750452 55.44092731255979 C18.063662686446094 52.57000906227462, 13.932896088353061 50.51208692780996, -1.0060772610119213 41.53384974162026 M25.72946405124977 53.5604649466003 C13.978888033795547 48.29450676751914, 5.280421759084834 45.07871047708919, 0.8713615328465316 41.168774662283404 M24.688860725997223 54.230020842144995 C18.040656076799014 51.96264569881372, 11.10296535244279 46.958131425941914, 0.0562359853369403 41.624411336637365 M24.285127046938072 53.81772811591541 C14.855887963187236 51.07744931881352, 6.467307334270087 42.534209844428695, -1.7621401668521508 39.78751899444639 M26.12972830319596 55.009108853269105 C19.331230804154288 51.29466557737765, 10.640820306978142 45.367745039652185, 0.33455358246704847 39.767475998259805 M27.055363465151835 54.196345444366266 C19.213076146751423 49.455957743775436, 7.87582408373613 44.057332104826344, 1.1962913642501585 40.29787047300937 M27.91012293715782 54.248628822154664 C19.46531161864415 49.35804441833434, 11.248503289650419 45.70378710068559, -0.2698114320837788 38.41095685095639 M29.186543843073824 56.
15683612352746074 C24.848204420531737 50.24674770555173, 18.1802183744867 47.726731402454355, -1.4494864963961738 38.338033322107094 M28.841291531297383 54.11484874606866 C18.546215116911256 49.170744331485075, 8.729923657991993 43.185723954031914, 0.3842871559534431 37.467631878297325 M33.521298261830005 54.42528781963662 C24.939123632505652 48.67237965584526, 17.445298860854784 46.95284318395489, -0.8985093642058581 37.39817028728308 M30.841756526149602 54.19278024686891 C22.658954511979164 49.156966772217, 12.787679239220592 43.39420449213978, -0.8306379809933466 36.55306351352135 M32.48924632835835 56.10590234871232 C26.18458579209586 50.80968519771268, 13.93104979927006 44.13232859442383, 1.8559258083927808 34.9284431487513 M34.871391988667064 55.764802010323436 C25.17258533136416 50.555233175751795, 15.853668286226629 44.02428525955615, -0.0007985561864818358 35.44069743481059 M35.864088064883795 56.20366247510693 C28.749237234913505 50.754386224718864, 18.170974148846756 45.13130935817344, 0.8857314810152275 33.042205900466875 M35.33014028411123 54.54054701224434 C25.52817820910924 49.148960184840256, 13.171177712598896 42.65409702121105, -0.059415638456525866 33.46183835969494 M36.588753267453484 54.612310573761164 C27.719858983696014 49.39820480277433, 16.162983434566076 42.007454178624485, 2.014592000603193 31.729182646352562 M38.30502735806961 55.72375292232974 C28.048967577805403 48.77290252698626, 17.791069951508153 43.50701368988067, 1.2154301427607497 32.694225533478004 M41.31477140096743 55.64406552131031 C25.07399438124965 46.63515460365396, 9.121734405249526 39.124641855688914, -0.7707324935984796 32.528902445446086 M39.00677458816089 55.909328725302615 C27.693243915154472 47.60592101692498, 14.402259934940606 41.21337173500172, -0.2592263360615408 31.835136734199 M40.313601698568384 56.189196941971474 C32.959294756400446 48.84096579895622, 21.820941035234384 42.299236253194124, 0.41471497115480416 31.390375398698502 M41.557756173108984 54.40260240045561 C26.765847776438058 46.25563791034861, 11.876705839310409 36.5781222659336, -1.0974991917645611 29.573116917936268 M42.56809003806284 54.431794841964106 C33.38688382040375 49.32486329243452, 20.16929068396831 40.73473643274985, 1.540562802403198 28.137761714346784 M44.7949041389534 55.57849129047468 C35.15236371499112 50.00996387812499, 25.205739653937933 44.7252420438557, 0.31700593905439933 30.253435930670438 M46.8009880450315 54.340696948266725 C35.65598984530968 46.96887245324031, 24.933380509265497 40.30740842426134, -1.850345813534334 29.902052859178255 M45.48659453572019 54.476485578972856 C30.206839955848118 44.62853702541993, 14.06945210149181 37.022187481938914, 0.03685601419665541 28.585442782137562 M48.22388767456928 55.618421607448525 C32.46085838738326 47.25627301366462, 22.513631470077158 38.22761027490303, 0.35515073209602477 26.261720328349565 M47.62201674347292 54.80679874258734 C28.040757808841636 43.47092011417843, 10.629931161834808 32.56652633399164, 0.9187580252190872 27.910432346853042 M48.96571475184572 54.72974836425688 C38.92137777572545 48.824269648952765, 28.954388994304463 42.56141562272604, 1.825316827301155 25.66194484472291 M49.399254372169565 55.00206197942244 C35.03935912763448 47.46666670566009, 22.014139862187086 38.334353773786724, 0.12990510219061302 25.763657101918035 M50.88433192786177 53.862585233632906 C34.38097124776952 45.90968617653312, 19.706388544628965 37.9665378507528, 0.944410541145432 24.885909883009184 M51.489187994476154 54.77750438597595 C38.847309032002826 49.21300002702559, 25.502234480030005 41.361963952935085, -0.5169008805629118 24.885123433259754 M52.14166715955398 54.79012843471002 C35.30434261196559 43.11463918349054, 15.91291408508087 32.823676507039906, -1.5459133917440488 22.68714778746054 M54.49154168425607 54.061746851481296 C39.072901187944026 46.3680137596836, 23.911858002860036 39.01027540422211, -0.49489212328588317 23.457356955152832 M54.809885455733024 53.218189901668076 C40.49874160388191 43.76293953084564, 21.753694305804526 36.25764086105364, -0.22886730108703457 23.799103784062222 M55.5125082414214 55.537644843836524 C36.597693686321605 43.81472537960724, 16.248191092101465 32.26067156942608, 0.21985610373991782 22.240135825370736 M57.15311719905775 56.186726456404024 C43.68247380470238 47.9088152316906, 26.18721335169361 36.425367650738224, -1.7139142785507935 22.43446382135032 M57.354387957590184 54.427521682072694 C38.22595908347547 42.23810636106186, 15.431738250255327 30.09169541431888, 1.1735089077293155 22.59978235009857 M57.62445956030903 53.84964023884197 C45.80910932856369 49.32216579492035, 33.78029077253128 39.60081297347199, 0.65401335308671 20.753923800475484 M58.90937349077048 55.71722630629852 C40.326777528706586 44.36676023930541, 20.65506692018613 33.66005968351781, 0.5357076353641284 20.25783637336637 M63.76017560814084 56.20207409127699 C47.30640696746915 44.94960881350653, 32.03380467324843 39.96003115439483, 0.2110236105724259 19.902885980383612 M61.25551957831437 54.58703676745626 C41.12109270096137 41.87043407383345, 21.11575105977236 29.67335658254796, 1.3001914507191707 19.0406424562995 M64.01549425032304 54.18496289314099 C45.23535026856437 45.05568621715729, 27.572750400298915 32.92508089494954, -1.5996157189610414 16.453957483244835 M64.7634108263383 55.545501375474984 C45.19105183980034 44.71999860290942, 25.881658253621666 32.2454839592626, 0.6059002564209486 17.460850560217768 M66.76038671280362 54.55228916368994 C38.96730868367763 39.90701882699808, 14.999692261572598 22.815428431771917, -1.341423260773562 18.219435384515172 M66.68535721824159 54.53457341821732 C44.92729193823607 42.130954821509775, 22.06071058277092 29.23592728718117, -1.2494263837395758 15.740010312808934 M67.61028596936839 54.97820829060795 C44.75286102975374 41.73184778022157, 21.633015500724877 26.972761421843067, 1.7103274354611546 15.444096380455946 M67.17410202090993 55.50281258995473 C52.760730402775785 45.77477731793713, 39.44159020467212 37.7046431786663, 0.37694713180224637 16.34813793303477 M68.54593600349813 56.240244364117515 C48.26109778776238 43.47865337161348, 29.77259473869723 31.69562190151456, 1.1917387884393515 14.693528824667066 M70.11170997322854 54.54930142842676 C47.882863871259026 42.51469241816855, 25.222177800812673 30.431432594305548, -0.4904161981332953 13.781912455491671 M73.60231908260727 55.189851101805914 C52.4440113286888 43.03027364834522, 31.477086312047724 32.13293497622732, -0.4859989961720199 14.762075992573337 M72.92895278875683 54.352045642250246 C56.10672971649025 44.15604127146445, 37.47267238370795 35.23264747007855, 0.4292156286614477 12.944154278506883 M75.40060920931707 54.685631751032275 C49.82211886611695 41.51724317877234, 23.800207549105725 26.803648220527506, -0.7145029202801458 13.868795629046154 M74.66170133929619 55.35024801086291 C46.621216658407675 38.621294902
151824, 20.259912010861047 23.6642253831648, -0.38664208174030024 11.44039058392708 M75.77495423326766 53.61190298608892 C56.69966416765497 46.57432029780241, 41.00974367730389 33.376635371331474, 2.3146388919146053 12.823601876709603 M75.36417400052494 54.48151646880595 C49.01964376481345 40.03696119204036, 21.86784568243478 24.488387064540316, 0.06254129417831411 11.473565249236241 M76.39822048706537 55.60875453793509 C56.49526664382187 43.61620894790598, 32.43311045542188 27.04641180017829, 0.4503186558865009 9.894204543015015 M78.80329863871297 55.306262862659345 C50.855854704715206 40.08384335092287, 21.508418017242747 22.891640938156453, -0.6497694408365187 9.083284444687758 M81.74710743426554 55.71633340074673 C55.10939052437134 40.91193126937381, 34.20475277625233 29.637776420596786, -2.0043782495894327 8.185182445089884 M80.12415041435764 54.50148307983498 C50.744497688747224 36.853540232833694, 21.651663248072317 21.344111994000386, -0.6135673043264007 8.396532801327906 M80.83317670828933 54.23554667443994 C54.10370060433736 36.437357376382835, 26.70461196003252 22.6700156631564, 0.38392415146826897 6.791474273611537 M83.01360908989164 55.397993420606795 C51.513328293233 37.906712798702635, 22.051516955930122 20.017637901889653, -0.7117445475787734 8.605051961757301 M85.01611922707316 56.145542640435714 C59.0691672767782 42.40704271155805, 36.34330157836861 26.453273128761708, -1.9428269615365146 6.034169652067517 M83.77408282852976 55.85974696209189 C56.54464700928215 38.09706257591632, 29.45457682727423 22.376849161941294, 0.29019379000610335 6.375441367994792 M84.97799300080257 54.30761579438142 C65.5143852328826 41.89305615185939, 39.92319459546337 28.85698741578799, 1.4811219909529907 4.322103806384023 M86.83234432268243 54.73746861748322 C65.1303098308352 43.210121086496535, 45.03109891158237 31.881013210370664, -0.23862898680394795 5.433218981883389 M89.59627806456731 53.82616149585863 C67.72035810445428 41.46874544511773, 47.08314527734106 29.34452666497156, 1.266127137094272 4.843065660255587 M87.60837532308497 55.30814657934856 C69.52343830923398 45.625561080003706, 51.06042820250759 34.68204242681088, -1.0118293540643792 3.6965110924221314 M87.93507197329147 54.39640434134798 C63.834917424053074 42.06607856220676, 41.15312537735737 26.96627928130921, 2.1780994243858265 4.773904983238526 M88.85359016364275 54.55466644112563 C66.59049302399704 41.87160410452274, 45.69021268036529 29.092943843844022, -0.0834019640323378 3.386299324946492 M92.09344629186765 55.61424278126661 C63.14843302399226 37.4463427603988, 39.396955109797005 21.65316751820313, -0.8905504146561327 2.474558180721947 M92.30296806808488 55.5904321181834 C61.21616903675089 36.301578360758924, 30.542347498714854 19.818204745570437, -0.47792729036316417 1.230673624182979 M94.15943120218112 56.977941660596215 C74.2202213254808 44.71179032297042, 52.228799773361224 30.125711234532023, -1.3053754452508621 2.3463741229924056 M93.31405588057281 54.692652222008675 C65.68389714999758 38.631240497899114, 38.246344914304544 23.185343314431734, 0.44606622553945124 1.1971400472341995 M95.37039631683847 56.98753602957659 C75.08515531063384 42.247939606980445, 54.808819543865845 31.627537357277212, 2.0251340513832687 -1.3410660104098282 M95.827424391309 56.04609705860496 C58.37781496844701 34.37579747665859, 23.09063708965251 11.247251628843065, 1.0230321623443965 -1.1562927153029046 M95.83906048652801 53.30779368472266 C73.45544699303525 41.424646525638174, 50.560274276679884 25.95867079313003, 1.0787602518972745 -1.679047927463691 M98.61332686736284 54.92757448755711 C62.634421930836616 34.60818035094413, 26.115703129353363 13.906808201391195, 2.961720533723965 -1.0551308961039778 M101.68046502434858 54.10731126876171 C64.05735800981857 35.51214908038551, 30.186365417407064 14.795500327717301, 3.3445372523487076 -0.8187666489399186 M100.26800431556141 55.24859804033645 C65.46546619190853 34.47270552756321, 31.188957081140302 14.396135334871584, 3.522006997112805 0.3923851833562839 M103.62965414463743 55.762839677370295 C81.69643904023336 40.87504102977304, 58.57698172526755 31.494423428464117, 5.060300232340268 1.391162388297713 M103.08692455914849 54.390401319656426 C75.61013183338403 38.75146365516787, 48.70009506592084 23.98182177435215, 6.21072060021822 -0.9151259478959428 M105.1730937662722 53.45011626413867 C84.73818899802136 42.451274234761584, 61.75021852716818 32.407602783361064, 6.290096908840836 0.6234346070764558 M104.3987473451649 55.20045681707814 C78.80390803825571 38.9004781452312, 53.34213096118481 24.18966205985064, 7.423171389515611 -1.137696853158246 M105.70146728518446 56.810925498248196 C75.56856739254115 34.92539912066586, 40.02578337844579 18.735320024844228, 9.50670238388216 1.5303346721771058 M104.95000570352114 55.78933603059378 C78.45550043496362 40.38326323756201, 52.32401134317021 24.093977352256182, 10.900434593918867 0.072660780378764 M106.16053426666898 55.79414935994759 C70.81241572437852 32.428741415014585, 35.86484457094091 11.66371672805307, 11.775477478105989 -2.1032417674572437 M107.04297370721537 55.22015664327656 C76.70397575376074 38.318101702418, 46.132514728214964 19.63213881689311, 11.280512136140219 -0.023475211199847967 M111.50504456490589 55.49545639931696 C78.45647947195351 36.18265960695112, 48.788695284992926 17.650672228925927, 15.33058734386692 -1.0739041184539881 M110.26433485100966 54.63551787055626 C88.27817676413778 42.85580932691374, 64.36554433294292 29.69919685934028, 13.724760656681369 0.3183506981498059 M111.40732121861967 54.62443905227158 C90.42022503402401 42.81246134241302, 66.57298441341962 26.733325097710107, 17.92100191168187 -0.8450621324664276 M111.38716455866461 54.605823489335954 C79.80487461274882 36.14990539362718, 46.99350403682887 17.082499083415314, 15.52774316668819 0.7142354337936943 M112.49840771252535 56.88439614515064 C92.81685131554508 43.95804230424017, 73.18735783998493 31.5213531945233, 20.217043074343167 1.5556686127534878 M113.50675246948441 54.54503146473668 C81.16729787076537 34.71729152590562, 48.5436943160899 14.967699720829003, 
1518.156665276874914 -0.5403630928848251 M116.05174624047764 53.101173508659286 C95.71398052669635 43.775670069967354, 69.84051140014596 31.39561582292187, 20.897075689937907 -0.6387170942217946 M116.93943172334414 55.11186890942605 C92.95174944163192 42.028741989248786, 71.06224962042776 28.73144921831554, 19.213487932069818 0.322395162233025 M117.37747850986366 56.95058520213957 C94.52835442115472 41.14600948385777, 72.47082448395817 28.245304052030406, 23.0508985454978 -0.5331720297583029 M118.05887914465585 55.84156633497409 C98.01249819578447 43.4497919115058, 77.73244909031295 32.14120518946766, 21.521710483664975 -0.8141445945644434 M119.25191900270346 55.370438278139645 C84.82926441540312 34.30378903115151, 47.924240304867105 11.379441426167324, 22.424983136312612 -1.3390071698683874 M118.87300562873159 55.097556394748004 C89.59065313868619 36.681759320298106, 60.73410316001336 18.89502066367456, 25.209957213165666 -0.7908330748570642 M122.61728789805632 55.07868597033714 C94.1745788110472 39.079134908582816, 66.82906176059569 23.880625071726623, 26.157512940210644 -0.4228606961887005 M122.36839895773343 53.944631544222275 C98.6421532091379 42.20476957549207, 75.15058877228209 26.810878966353137, 26.284610788099183 0.8904107533883208 M122.49820850935826 55.94789905263984 C99.13316508507623 41.41931170442819, 77.22635956089267 27.09164253868865, 27.710970295146243 -2.0603208407042852 M124.79084436443866 55.636088354974426 C96.55575625457563 39.31116933814251, 68.88751160805654 24.354903814486004, 28.90169415276287 0.11631600595127489 M126.16014030663176 53.938715071192924 C98.04804306341357 36.15536240457091, 65.32513471335363 20.963822523121365, 31.095748049985374 0.3342992706112691 M126.65293407419105 54.86963660445634 C94.80707501922123 36.01246080471151, 61.98714547861212 18.136088501738254, 31.01438793723591 -1.0201103161411047 M126.04447157923082 55.33978050932627 C103.4278595139078 42.28073233800185, 75.11340068765074 25.211786078255567, 33.11068585042237 -1.4812435670804924 M127.65723200190489 54.272453910386176 C102.18772745343047 37.77503676470416, 74.9920455568529 22.854115076064296, 31.989725832333036 -1.1303962491524577 M128.55455615172713 54.392539509253275 C95.12460022635507 32.96503967793301, 61.20426273717595 11.872697435647005, 34.31049953904978 -1.3699872830687814 M130.0891405594557 54.79162615596441 C109.68844007493553 43.75499881760476, 91.0242621100432 31.602769050915178, 33.3498399494398 -0.005263989423767157 M132.77397195893775 56.15885280436118 C99.7860751362456 35.08931284542173, 72.05114575343406 16.93347285480429, 35.5087754991807 -2.3686412417047498 M132.27688099234535 54.58502328889604 C109.65973362941226 39.743478861867096, 85.23963633390622 27.23917093553855, 35.87983103938318 -1.3997237740449608 M135.7626087771645 57.21903086727938 C113.20648084223055 42.82371485919123, 93.96443181503165 32.5127878226537, 38.41267478720074 0.09223220502034657 M133.7894195671338 56.08469998688689 C100.00258970314083 36.613618381190356, 64.59961034481232 14.703681821196646, 37.27933334115053 0.3133267003084874 M136.3662811385664 56.134508812506006 C102.8661394010421 36.23902171244135, 69.71132443914412 14.362210580720058, 41.79349839492489 -0.6356729315684437 M135.85631829090931 55.77693653167381 C109.40446177940852 38.56314148898126, 84.6868534622531 23.63359057112607, 40.875071010872254 -1.0783993476377447 M139.5797696627425 55.73288114756233 C115.54123131402622 43.646155313712384, 96.08905781312184 27.973788927246837, 42.717613869749805 0.9322189224444766 M138.06317084622478 54.44993572062548 C103.82506962376672 35.58885456196281, 69.71247417760263 14.194472362101628, 41.386247854768484 -0.25932431402740996 M140.6526169428502 54.26807051846438 C104.06430976105325 33.70465904083767, 69.17320022076854 15.1704846856522, 44.635635840124515 -0.7142503574253638 M140.23404192769289 55.3216259022664 C115.8430298419028 41.099401420387636, 92.1068294436618 27.979599729077748, 44.58755349532942 0.21633325490241262 M141.34911756594514 53.908866130010125 C120.25303428070384 41.269582187561184, 101.73330168502102 30.115214458514707, 47.479110706434646 -0.912984145435049
151 M140.8299146701596 53.95590814674543 C117.64699747093209 41.19038141059826, 95.0859003202515 27.87265166253078, 45.46156803863679 0.6848525161141767 M143.5828564905895 55.43256698476287 C107.9579083292471 34.82035999503789, 73.07952470013977 13.57360548711289, 48.9708155196708 1.3799387284455298 M144.26787538269983 54.39395304006111 C110.85239141976157 36.752888031046346, 78.54354987779433 18.68592064635739, 48.61718866471969 -0.9555554423681669 M146.1070228531219 56.76875800975538 C107.44033764163426 33.68869324908596, 69.36818890875384 11.134958510008062, 50.54953884494575 -0.8887674522038469 M145.17292496093347 54.21782562944382 C120.91300376911231 40.32323720242662, 96.44030096562776 27.007657680787457, 49.509740353500426 0.2807492745708493 M149.01306319784808 55.49734941666571 C111.15205677018302 33.67569642447525, 73.80757132543373 9.274563356440902, 53.50531954732772 -1.8293031440574286 M147.32236956610316 54.311860497823666 C124.42567902499304 41.07652943992153, 98.96008101091498 26.354230786847406, 52.02827014590427 0.5840685798926799 M148.23156778700198 54.88425222584066 C124.66252633189389 40.40866863482817, 98.3713215527566 26.012377562522826, 55.985626126002636 0.0169635072661114 M149.50025886173583 55.44255639076355 C115.45019835880676 35.0872886174855, 83.38122519373259 16.01059487864069, 54.71353654735466 0.7979651877725775 M153.0230847461585 53.57551674021075 C122.51833571693805 37.57449619650651, 93.86318749364752 19.85852711837061, 56.88437495297476 -1.6412213272441734 M150.88659844126795 54.43797617485106 C114.6698533206822 34.30234852908558, 80.30161933037328 12.812315972918297, 55.06379635376132 -0.3017733524342665 M153.20036027556205 53.25755342080849 C129.33879973182704 39.84101543738293, 102.66746909273988 24.01245342029699, 59.3180742415627 0.6802843561931007 M154.25428042541648 55.98298852717393 C129.31574098753546 41.87413765460174, 104.33906009398436 26.829387084395933, 58.2337602428375 -0.8692347278065748 M157.94890853139475 55.70377945878655 C126.89654228024136 37.699965760112626, 98.21971996487032 20.976856925822982, 60.98637370600195 0.37024366410382736 M156.75980775068658 55.65594651291632 C121.71489795655191 34.86827419238672, 86.53807095485175 14.662910620133408, 59.80649759948732 0.2629717369473361 M157.7264651084948 55.69689675077822 C135.9188331556387 42.989655809227266, 113.89896744232495 30.014625697265497, 63.09385598002393 0.031414829576404735 M157.81866536488894 53.89225374394137 C125.98034651051316 35.04815451842369, 92.71741000619362 16.391139461671514, 62.84878524703542 0.31878603659353555 M159.769765385041 53.27272038431802 C133.1737394616507 39.303137671626246, 109.91155439924617 26.91837081225539, 64.37287207262504 -1.7237990291872696 M160.87033845301326 54.753812658058806 C120.76415631597308 32.99779207355332, 84.23412435347967 11.523307070533747, 63.37582387429364 -0.41812730545163523 M161.74090416068103 56.848843139104005 C125.86600693027472 35.44842060243856, 88.38187591519622 12.830501229076852, 65.81670089831186 0.7783086665108745 M161.23569147657992 55.487002684492886 C134.31681249736485 38.47093727768181, 104.36910473173201 20.058743966949848, 65.39772510577828 -0.28406591090474254 M165.14811132801648 56.663434670775146 C127.17565494379177 35.75749720068429, 91.09476531855091 13.024243248108831, 69.82034544687438 -0.4190818436355408 M165.29004022025347 55.07098031841131 C142.60554580131424 44.00030855128635, 122.26543161639837 30.825119242878092, 67.66959069970129 -0.9551891426585144 M164.534517290736 54.940760540279435 C128.21089839473814 34.937538725292306, 93.4454693022363 14.291243452377255, 71.65854316109704 -1.5917808562509013 M166.51209782178162 54.78820152048102 C133.73274609585278 36.566611982990445, 103.08666804955995 19.475779973722968, 71.02545170431941 0.813193095579029 M167.14779288886947 55.96110485710487 C138.22997225102273 37.34088767117498, 108.7409686644815 21.15491032977767, 73.45657213437939 -0.2859885998760996 M168.07952642637105 54.02086131818023 C133.57489807493658 35.254103442848084, 98.19638604674414 14.779031413884603, 71.42445888295764 -0.336357505459985 M171.49010267773767 54.27016038507009 C143.5544371664517 40.55807519212142, 119.18453422635878 27.633147724625857, 75.73178807805667 0.8805171904427573 M169.30966076851826 55.22712278290888 C141.04644360745363 37.239610821437445, 110.79775894117701 19.532115442359604, 74.7579636536709 -0.2971637593059442 M173.03065301681966 56.767702516122704 C153.70896098666353 44.50543892600554, 131.42987638024724 33.342247737017246, 77.11043659196096 -1.3889872116058735 M172.55547938247608 55.366244702716415 C151.
150901789303447 42.178924897411996, 127.61217425757681 29.113843650199602, 76.87080193518015 -0.029094164391085586 M173.3112636016362 55.14706006084036 C152.9244556891092 41.16644001427424, 130.5423721324023 30.65917226960721, 79.2341020618239 1.5226463711612346 M172.98938816894932 54.66034429959923 C148.63220823950812 39.32823868042785, 123.09570096415767 25.363680120969537, 79.04511432706242 0.5639712456721262 M174.23157928868105 55.407475168326826 C145.668255601397 37.19892667856377, 111.80257597940293 20.20052120474709, 81.16995968388082 0.5419183680381954 M176.7473362261081 55.84160966504398 C141.5362642683679 34.447287627163895, 105.7542526966052 14.147555946495375, 79.50243692431806 -1.0325594304484873 M178.78943023041722 53.9794676995803 C158.3855058998039 41.4793645107589, 136.7634710810672 30.142609386326434, 80.57707453000742 -0.06922822433402631 M178.49610536883094 55.36394467369564 C140.99334092959154 34.08506154440111, 104.00413837091638 12.845207422443151, 82.3922477406672 -0.34031162940193327 M181.43879091369288 56.78752232960368 C151.08389008150795 37.631989435988466, 118.16992590053243 19.94580543705441, 83.9462316210375 0.4171263075824867 M180.5290798728325 55.10146763118114 C150.13090253359144 38.30065313077677, 121.04598783975229 21.579801161497024, 85.25620168456147 -1.1074152834812856 M182.1768289291942 56.80181316986897 C160.78394873380643 41.95736318873608, 143.2015387779572 31.493264434348106, 84.81121461069681 -1.5915171051995496 M181.76471261435594 55.695227537708895 C146.1859783044668 33.42106814034248, 109.29468281975716 12.963686161178662, 85.2084419327373 -1.379136155286477 M182.85111236457467 55.29927975442361 C155.41149540345887 38.9163914924119, 124.0292364324864 22.466107955965203, 89.2653401137466 -1.090953644969081 M183.86878354335894 54.1554575180564 C146.36988197345312 32.39415654680208, 106.87764724262409 10.840212988961913, 88.19020102450911 -0.4782500659468114 M184.58141492583195 53.24519487888839 C154.99103813921388 36.32180278985856, 119.39990845762297 16.813944884143922, 91.02258548268208 -1.9808349083829317 M186.92552784055277 56.020099757249426 C153.08425762326203 35.88140968197433, 119.56306381952989 17.294384507766335, 89.398682611888 0.3120803849469673 M186.95318587809692 56.54393647228228 C151.3032374040604 35.16199523767717, 115.37933161892263 14.430663607446133, 92.60525075626458 -1.109200630283842 M187.71293049373028 55.5251569094623 C160.16696802079764 39.754382153370415, 134.10484026107522 23.719984972228286, 93.09075568533743 -0.20796870934431677 M190.7434493865207 54.45092752121074 C170.06914509721074 42.20857286653831, 149.53683889206428 31.038427618534985, 94.97103314828333 0.47531112186128777 M189.04694432021685 55.01097899868238 C162.62360381178638 39.36919032642387, 135.77554510978513 23.679128991157516, 94.17709724848373 -0.4128613974304407 M190.70386985867376 54.017636669469766 C165.44526387274854 38.34589066494064, 139.13748629319417 25.08987993443557, 96.25076536870176 -0.3191518695441755 M193.09884216446946 55.248877666190715 C169.85673905065966 41.5417862003727, 146.41858627118364 26.92179889468701, 96.63166718703759 -1.370139155097483 M194.93189982602456 54.513831475544706 C162.09460953445233 35.21590880199543, 127.89499490823029 18.609458793186473, 96.62511500250379 -0.7202007077254979 M195.23827040037827 56.08103508156059 C169.61012924093137 39.43161758302933, 143.5140842719337 26.365328685333605, 98.53374711622573 0.08069737326951221 M196.54859256612465 54.92360980749243 C170.6721300554567 40.8896425592331, 143.05133367524155 24.398105176428523, 100.53428128525103 1.240407807858407 M195.96400417209296 55.29804595217791 C170.69946084628228 40.46696427245132, 146.9695020499956 26.246905871350823, 100.1385770260734 0.34115203262909954 M196.74119103975855 55.902638119116254 C176.25130885098952 38.77939174190896, 150.01263253893228 25.855333056770284, 102.66183307187465 -0.7032482952947756 M197.59848175771623 55.06126305243293 C161.0728456325774 34.160105399746726, 125.05697385868402 12.333939690344959, 101.35181651814283 -0.48499230377568625 M199.96366302303218 53.40173689075432 C166.30839356559673 37.556515873018704, 135.61208857317698 16.683424014191125, 105.30135111363671 0.8368997309370849 M200.41347856567563 54.186735824776434 C169.2494292886409 37.97660636500422, 138.78229320180412 20.20368644302635, 103.3693523444705 -0.876150480982056 M201.77580271086762 54.81120718546694 C169.54400318568065 38.39879355551201, 142.85343924946315 21.768284065028578, 104.74635703978593 1.2340898426936318 M200.65223884892535 53.56014260410446 C173.78111878784532 38.59344096988359, 148.41341689733025 24.047857527684705, 106.00597212118211 -0.48003688758112006 M201.5414247668749 54.25001974425391 C169.18177346377297 35.928954040286065, 137.99461509492406 16.080144799260786, 109.60097675773531 1.5087507281002548 M199.5463121734493 52.86232479346975 C164.5422738827088 32.29370650950597, 129.8196174861484 13.344812291964093, 108.46987275178222 -0.7002094865990163 M199.52674444594075 52.95137755146687 C168.0720412869316 32.8421275832689, 138.77186198954757 16.030550708949967, 110.71627299128876 -0.6529285476097244 M200.43828190832542 52.378579020400664 C173.9382545684716 35.78932694679343, 145.5949608635366 20.02440279030533, 109.84768573244416 -1.2541345734274119 M200.95840549686395 48.4229552385618 C169.78399212667384 31.95221494663448, 135.85891994484012 11.066005466730756, 112.45534004751646 0.9520772429562978 M198.83028454599446 50.62026422958943 C171.89217430755772 34.69107541344318, 145.30939677353348 18.454397851366593, 112.14888963184082 -0.40400246883492863 M201.821049151528 48.53980890316468 C167.34536779592548 29.5039520560
155992, 137.68197832786007 12.158862978356764, 116.25863505632765 0.3136630948081556 M199.9493306870589 48.52894068195767 C178.98553432528448 35.59523428976033, 156.31603509219812 23.179316580485576, 115.23336908585372 -0.4641656670316574 M199.95087300406743 48.71302950759016 C180.9355898895772 37.26086157641729, 163.27626878061741 27.327131153738065, 117.44947252382785 1.1599989544358884 M200.431073381608 47.34636536508115 C173.81608454487275 32.811356085408505, 146.91852719245927 17.775156848314595, 114.98922545600323 0.4053896569711368 M201.97345643558293 47.624635428817925 C176.31063159261163 33.9731442598459, 149.15451936354708 15.75630289701942, 119.66143007512649 0.925419294798552 M200.3636078146079 46.76730450431406 C183.76443265963186 37.66754369607137, 165.80794362276586 26.076844231416683, 117.25639008366309 0.04301849522701273 M199.00953829049135 44.51693936827869 C177.8772668809554 33.466061881304796, 157.2847223309959 19.438072781573073, 120.90791993966891 -0.3037299906672106 M199.44621999653714 45.5746372397568 C181.63995134488138 34.58493766754189, 163.5586928039705 25.19213914199775, 119.42991567392073 0.7093831760581597 M201.7532978614798 43.26415362080819 C172.8916652386916 31.365877808388994, 145.0955451746157 16.14454460838406, 122.90844005428465 0.47353803613708356 M199.84952407951147 44.755713131922604 C175.3537128510252 29.744247188561594, 148.0102957988394 14.156681199380083, 123.32470383424507 -0.5617613035065567 M201.99967462372885 44.1528629823783 C178.05212200919726 31.40415651589333, 155.92337146960853 16.933904036516484, 124.53388947719608 -0.03975040566741184 M199.29819494732374 44.23842777891861 C181.53870361164516 32.45015802813298, 164.6614571507007 21.736099683788776, 124.24726215504933 -1.0903762659819398 M200.70596921124172 42.74337739386714 C183.41649760734447 34.23156888209948, 168.63360753991216 25.693736227136192, 126.11068615929251 -1.1275873327347847 M200.56841823776253 41.129457314472944 C176.4264273898981 28.6869714604387, 153.91378436667125 14.113393110640924, 126.94558568505155 0.42444308115485474 M198.87619760173837 42.301415992702005 C183.031771608044 32.82018733564638, 170.79747014793182 25.53412883517367, 126.82258160152848 0.6285928262530192 M200.37674473768135 41.79271075521254 C182.44225527056454 31.169606347800332, 163.86335627607215 18.67129540154415, 127.40195678959364 -0.12793097081724736 M199.0027680943085 39.25795578823179 C185.568779628629 30.978630696986507, 168.37033669201128 20.844046811015907, 132.12764719012878 1.3335481963573699 M199.9526308115957 39.582172386738485 C175.869926438198 25.87035206075623, 151.54952478114302 13.069247718835092, 129.56401707979703 0.30514785013385626 M199.86099090242044 37.51535528922884 C176.92562719029 24.059784316306963, 154.1561588625469 14.43976581580168, 132.47888707406605 1.3684745984703337 M199.9089685179278 39.81914021429735 C175.1155062849057 24.60049915534913, 150.43876199794303 10.635711665009733, 131.89942108556608 -1.0857948678244431 M199.49861404848193 38.228100176406635 C184.94209400923262 27.842153908294126, 170.77701454184316 18.832592113581143, 132.51756175237446 0.8375617290067772 M200.32258512284238 38.207472931874086 C185.1608988232344 29.13387908955863, 171.23123879781096 20.813339467347912, 133.74504694423553 0.05305450637817799 M200.295477190724 36.55792580307666 C184.86984643117455 28.238603882071178, 169.62807583996693 22.273744606089252, 135.17154334259607 1.1142517130402014 M199.08590042918655 36.14428369398158 C185.48420399672585 28.909945506938474, 171.18748691060924 19.805211559733507, 135.8318999318502 -0.3191764899494016 M198.37930774302797 37.37286036777504 C182.3656642602949 26.11342321580225, 166.10887363406403 14.999422653109619, 137.91188524329203 -0.36517446658893604 M199.33161655171853 35.341585328975 C186.27015841185718 28.469296459792186, 172.97465648029166 20.706749308813883, 138.86021637278475 0.8981955326786504 M199.79926905107382 34.99527032810329 C183.9733752616788 24.554200725919195, 170.0983553145965 16.881334685461177, 140.1192287664144 0.23750692602458834 M199.78547476878833 33.666234685630606 C186.8985898473999 26.00273457161668, 171.8248214507098 18.435102168309214, 139.5310015651007 -0.5333551426108365 M201.36815640740664 32.647516421400375 C176.67954260404736 18.681360569995075, 158.4185825037962 7.350796723337896, 140.99378717737105 0.4041464346732475 M200.02276035434699 33.51805671192354 C182.24033072178966 22.92839332543367, 163.59756947900217 11.3622563785546, 142.44920414386397 -0.36661259530526324 M200.82168963586895 30.56002424456382 C185.384927233155 22.95247383689033, 169.08685048977077 12.697256558023595, 145.22538750615826 1.5181201383935568 M198.91197194529425 32.45702835160297 C178.81798474224337 19.266315845730915, 158.02792147287082 8.586259724527899, 144.95350178354263 -0.6173184848313755 M201.27429765455895 30.785029701174373 C181.70581391756542 21.13754595114628, 164.6340886110726 10.193868758317073, 144.39150783022532 -1.1043819049459804 M200.32474554452418 30.971047112493505 C188.37572036036386 23.75154064736929, 175.02687906885734 16.002329873347456, 145.9013183574767 
15-0.73272281670526 M199.25726064418188 27.720944181730292 C186.2273080182935 22.851708630852034, 170.7602881606788 11.271966017339068, 148.64592173291246 1.5403437767444972 M200.707633104986 29.277642704253587 C184.48331701459367 21.353747495040803, 168.397508904321 12.087290913432913, 147.44927726210818 -0.021585915201165262 M198.09506530957512 26.581589664970387 C185.50681081288798 17.581675876991067, 169.75366449905255 9.433127441395914, 149.73294438953104 -1.6557011557761663 M199.30622351199094 27.34667926328 C190.15939730954028 21.586011282492336, 178.59553187220823 15.39887979399587, 150.33892302168093 0.39359656401353127 M200.95380908306268 27.7326098921142 C190.26639786382273 22.119996000446406, 178.8036952174682 12.238344195270876, 150.63280158690498 1.3404900197888234 M200.90575604342033 27.76266509811425 C183.18221736527434 17.420646638275215, 164.63977307066082 7.763379588976654, 152.96635974712228 -0.9903825144357983 M200.27656990356834 24.91034996276183 C187.97837830355655 17.91071445527104, 174.07709683191945 10.258612187525111, 152.17457803552335 0.532616914793691 M199.64183148471972 25.972012382366643 C188.0916414873754 18.852147702407404, 175.92151136041642 12.687364779726591, 153.7376028643166 0.3799605041566838 M200.82415928348672 23.900586637335255 C187.72804701420117 15.41732445760115, 170.39425362362712 9.213476568585456, 156.56324900147408 -0.6647834064441129 M201.0926849992192 24.28885808539341 C186.8480093959988 16.644654980921466, 172.4893824762812 9.334670371637817, 156.46405218642565 -0.07674299765025139 M201.14899959702936 24.631769167950782 C190.03595015689262 16.8246193031173, 178.64577138707372 13.641655549422536, 159.4856927605725 -1.257538563308224 M199.184518949602 24.623349851393606 C185.27713564867793 15.029905493600431, 167.72430687791044 6.368913597443857, 158.24511526617408 0.5136390542488647 M199.74738650415074 21.03636631787139 C187.7353193262577 15.894469848987276, 170.54932333956918 8.079125146221045, 159.93405385742645 1.3555966706411335 M200.17394213422122 23.17205704308101 C185.75086832263707 13.992486743974482, 168.63018258259325 4.995470594062592, 160.51410637508494 0.6266715914566676 M201.7179360045444 19.94920809712594 C190.28176345377693 17.24239192343343, 179.66910781447848 10.707045183734808, 161.3689763932359 -1.583458392505055 M199.57176992937502 21.578029881765268 C184.8231680436378 12.881733412937288, 170.07307363563612 4.25680665721762, 162.19207892738874 0.1753162721305086 M199.23652681255362 22.056929087822056 C188.319853030955 16.258694790651344, 180.18987986411472 10.17545170968145, 164.47683375015683 1.004111058568208 M199.9530893595437 21.02461298107997 C185.1692377250496 11.922140063213869, 172.5628108612653 3.743568923103118, 163.39491253592084 -0.02426464756165303 M198.33770611834044 18.42282523640371 C189.23878324693894 11.444459013387794, 175.11592851027882 4.395432926384218, 167.3606411750272 -0.9913137993855416 M200.81541071456007 20.205617207228233 C187.52139571358657 12.041734159606266, 173.7214065848328 3.9362091060356725, 167.30281338653273 0.7669500395395918 M200.22866992204914 19.537331495678707 C194.40255321313424 13.236293950224809, 184.3649600632182 9.757803439032646, 168.05711212072669 -0.5286542223956223 M200.0244839414129 17.73840545170648 C188.32452944203987 11.689353002294805, 177.6318149099275 4.877386844088744, 168.2651136323317 -1.5570194201774916 M200.72156876617055 18.676037805086274 C193.22892377687396 11.077615179088987, 182.72307278755318 9.099921104419584, 169.474893889174 0.6541542138369167 M199.66808798767838 16.2694436064476 C190.64063014047863 10.951847719498783, 180.41838642554075 5.656697555255002, 170.69105599151675 0.23823258859388696 M200.69142959730382 15.980322058886816 C190.787083038425 9.216878485699697, 178.20785512989977 1.3331743145973065, 172.26024614338849 0.9924499091657637 M200.2290534727166 16.059283440372862 C190.64546882729252 9.088103737885024, 181.04134838538363 4.306211206872712, 172.7589665983701 -0.9747454673527447 M200.13481667142943 15.24171816012311 C191.91560288476532 9.81147554864101, 182.81497376701873 6.834908202360059, 176.06126161638113 -1.8506268520660365 M198.90075557209857 13.447803549850867 C192.14229793898775 10.89469925707858, 
15186.42156545456155 5.875404165661939, 173.9395827986597 -0.9435949934530208 M198.3632452964268 12.004958331056327 C193.61100506381268 12.000869942545993, 190.60378097971795 6.137164018001104, 174.87005965865316 -1.1195941578288457 M201.01455383081026 13.24890467111641 C192.9938680922962 8.232100483023931, 185.39429607967278 4.233730460422235, 176.7110516153474 -1.021908604761752 M200.81571135950333 13.442121422035326 C190.643523344588 7.1684260385102405, 184.77215949879206 1.275492251745228, 178.72624739991613 0.4246424540535192 M200.3877887348039 12.551604771177756 C193.57666782195213 7.423972402144509, 188.27694938760305 5.052712358277597, 177.59922065320828 -0.7195247577510371 M199.27943294224588 12.015144628405073 C195.1558661811277 10.190559787256996, 191.54796755259744 5.90105651092544, 181.31077553472466 -0.36247394513104236 M200.1837116480065 11.102758969967748 C192.58836087603308 6.1190308826150215, 184.44188877310538 2.4971937503378454, 180.54306338326742 0.7138326757971853 M199.8275637540849 10.811694094378208 C197.82429314628314 7.03262959329675, 193.74156638170422 6.33164532651051, 181.77092711762538 -2.064264177517252 M199.51119356366465 9.466198908276215 C194.1946348414984 6.7520085315761875, 187.90146520090866 2.6680511799192304, 182.75679470092913 -0.8090660048766805 M201.36783635722549 8.526286394781318 C197.54109276558864 7.270180143601216, 190.3693511978871 2.3611846572533657, 184.33402471769804 -0.7111011382098102 M200.46096556918633 8.086627975037887 C195.83890728122563 7.452550748796038, 192.61291445365396 5.096617786163983, 184.33537341042478 -1.2753084941585673 M199.1014909915617 6.929223344231538 C194.0858176616488 5.442912662798172, 188.80913031393342 2.2167032171154415, 185.80937081385107 -0.3339465944952238 M200.0350993643948 8.010376752376065 C195.43298981747358 5.21769824397576, 191.84851790834975 2.8847179882152916, 185.6950258369739 0.3037338679474759 M199.25840717349178 7.121707750066289 C197.0043663196029 4.92813421242989, 192.10799622219193 1.8095507327104132, 188.5339365132054 -0.8566301770675123 M199.55196059263247 5.907445151913963 C195.94978143401568 4.153842308466595, 191.3182604836666 0.8597120985408221, 188.4138531207219 0.2549993594154062 M199.39860239318136 6.003481603586386 C196.59249592669704 4.212070113879669, 193.20871465141198 0.3010031922280749, 189.6749612392154 1.0064477847371813 M199.6734745627711 5.2353706617906015 C196.3848939289033 3.4002983172871883, 192.69285790102404 1.4013600745572763, 190.84267874332588 0.4205911934120462 M200.5709388943555 4.638878283007269 C197.3809661267575 2.841011341049513, 193.439467028837 1.0642111198756927, 191.87274739874752 -0.9869926110550988 M199.77840394371214 3.8879712318335207 C198.4436991566055 3.594929172937635, 196.52333318953953 2.5068743675235514, 191.95379573878205 -0.7012344358586048 M200.1374118536503 3.3294320693234636 C198.4907714889529 1.7001171092708995, 197.13368764324642 1.726627715633858, 193.90582983796065 -0.7107667855130935 M200.11340047161912 3.4250779854248954 C198.1098503785324 1.9687876769507557, 196.18277985474978 0.9727812704667143, 194.36219854755365 -0.15034032791434782 M200.13240338311786 1.4675037082915572 C199.08490411221302 1.2996576616570081, 197.39169047111886 0.4417464385487993, 196.71556930628057 -0.31463844525233226 M199.77088043800669 2.0028204210113976 C199.10443513718383 1.2146390344129192, 198.05792343302525 0.7090214154575877, 196.4095877531202 -0.19073864078524377 M200.11181529880665 0.7617974331178836 C199.85772159243814 0.36265200270228426, 198.48992320014196 0.2731832603023569, 197.60667970004425 -0.4840741563618478 M200.42572955512676 1.006112477027846 C199.58104026838097 0.30903686436774563, 198.71605549715255 -0.06794546343785582, 197.8600571077786 -0.532107840176243" stroke="#000000" stroke-width="0.5" fill="none"></path><path d="M-0.3998087171934116 -0.22822640269351346 C63.770683342436726 1.3939698436450794, 127.23672797650818 -0.534815941873073, 200.128170861811 -1.742132245210188 M-0.1877532547112215 0.5083659193913385 C43.51907796974178 1.1074440397901006, 87.33045516897404 0.09667555761876023, 200.13679208612817 0.1193
151223095414385 M201.1952376118829 -1.5306089923384145 C200.13278069704847 18.16933025749108, 201.31882499654165 40.14771055834456, 199.19047234678138 54.05866097245129 M199.66835137177 -0.4168128321634008 C200.9044303042781 13.406540462035274, 200.6169459205801 25.723665372613755, 200.69351104181376 54.46659603983515 M199.34769029504642 55.868876167301686 C129.73038363690253 55.35028670095303, 57.07398892155848 55.04054000817094, 0.04286747389734458 54.958437722158344 M200.05830850397285 55.35657357150172 C135.3196986748405 53.7782079681552, 69.48538726668866 54.000380204431224, -0.0578207495155553 55.352385140330284 M-0.18474251058797808 54.329125830418604 C0.5942969054050546 41.55883687367363, -0.3560767889600458 26.94415012841081, -1.300537265534051 0.31228412367964875 M-0.7294449259940825 54.38004935760952 C-0.4036396324054232 37.37753850360237, -0.894445143881101 18.155410711669628, -0.7023155548770885 0.3826297706460915" stroke="#000" stroke-width="1" fill="none"></path></g><text x="10" y="36" fill="#ffffff" style="font:2.8rem &quot;Source Serif 4&quot;, serif;font-weight:600">Parker Ziegler</text></svg></a><nav><ul class="hidden sm:flex sm:items-center stack-md-h"><li><a class="text-white p-2 text-5xl sm:text-4xl font-serif no-underline relative" style="font-family:var(--font-source-serif-4)" href="/code">Code</a><svg height="6"></svg></li><li><a class="text-white p-2 text-5xl sm:text-4xl font-serif no-underline relative" style="font-family:var(--font-source-serif-4)" href="/maps">Maps</a><svg height="6"></svg></li><li><a class="text-white p-2 text-5xl sm:text-4xl font-serif no-underline relative font-semibold" style="font-family:var(--font-source-serif-4)" href="/thoughts">Thoughts</a><svg height="6"></svg></li></ul><button class="sm:hidden relative z-20" aria-label="Open Mobile Menu"><svg width="23" height="23" viewBox="0 0 23 23"><path fill="transparent" stroke-width="3" stroke="#ffffff" stroke-linecap="round" d="M 2 2.5 L 20 2.5"></path><path fill="transparent" stroke-width="3" stroke="#ffffff" stroke-linecap="round" d="M 2 9.423 L 20 9.423" opacity="1"></path><path fill="transparent" stroke-width="3" stroke="#ffffff" stroke-linecap="round" d="M 2 16.346 L 20 16.346"></path></svg></button><div class="sm:hidden absolute h-screen top-0 left-0 right-0 bottom-0 bg-primary opacity-90 z-10" style="clip-path:circle(0px at 100% 0p
15x)"><ul class="pt-40 pl-8 stack-md"><li style="opacity:0;transform:translateY(50px) translateZ(0)"><a class="text-white p-2 text-5xl sm:text-4xl font-serif no-underline relative" style="font-family:var(--font-source-serif-4)" href="/code">Code</a><svg height="6"></svg></li><li style="opacity:0;transform:translateY(50px) translateZ(0)"><a class="text-white p-2 text-5xl sm:text-4xl font-serif no-underline relative" style="font-family:var(--font-source-serif-4)" href="/maps">Maps</a><svg height="6"></svg></li><li style="opacity:0;transform:translateY(50px) translateZ(0)"><a class="text-white p-2 text-5xl sm:text-4xl font-serif no-underline relative font-semibold" style="font-family:var(--font-source-serif-4)" href="/thoughts">Thoughts</a><svg height="6"></svg></li></ul></div></nav></header></div><div class="w-full max-w-view mx-auto __variable_8d7944"><main><section class="relative flex flex-col px-8 py-12 sm:py-16 sm:px-32 md:px-40 stack-md"><h2 class="font-serif font-semibold text-6xl m-0">Thoughts<svg width="105" height="10" viewBox="0 0 105 10" class="translate-y-2" aria-hidden="true"><path d="M5,0 L25,0 L20,10 L0,10 z" fill="#FBFDD7"></path><path d="M25,0 L45,0 L40,10 L20,10 z" fill="#FCEB71"></path><path d="M45,0 L65,0 L60,10 L40,10 z" fill="#FCBB45"></path><path d="M65,0 L85,0 L80,10 L60,10 z" fill="#FC9A59"></path><path d="M85,0 L105,0 L100,10 L80,10 z" fill="#F24B4B"></path></svg></h2><p class="font-serif text-3xl leading-normal">I write mostly about tools I like, projects I&#x27;m working on, and things that are puzzling me. Here are some of my recent pieces.</p><div class="grid grid-cols-12 gap-x-6 gap-y-12 md:gap-12"><a class="col-span-12 md:col-span-6" href="/thoughts/choropleths-four-ways"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Choropleths, Four Ways</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">Ah, the humble choropleth. Given that its name is almost universally mispronounced outside of cartography circles (looking at you &quot;chloropleth&quot; 👀), it&#x27;s somewhat funny that this is one of the most recognizable map styles out there.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="JavaScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/js-logo.svg"/>JavaScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="D3" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/d3-logo.svg"/>D3</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="Observable" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/observable-dark-logo.svg"/>Observable</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Nov. 10, 2022</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/on-being-a-student-again"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">On Being a Student Again</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">I head back to classes again this week as part of my Ph.D. at Berkeley and, before I do, I wanted to take a moment to reflect on and share my experience returning to school after 5 and a half years. While in industry, I didn’t make time for a regular reflection practice — I always figured my annual reviews were supposed to help me do that. Looking back, I see that a workplace annual review is not especially well-suited to meaningful self-reflection. Your focus is on considering the value you bring to the company you’re working for, not evaluating whether or not the work is still meaningful to you. You reflect on your year in highlights, but you don’t, as Mike Bostock advises , think critically about if you’re still enjoying the day-to-day.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🎓</span>Grad School</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Jan. 18, 2022</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/the-state-of-reason-in-202
151"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">The State of Reason in 2021</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">If you, like me, find a bizarre pleasure in the relentless churn of the JavaScript ecosystem, you may remember a period just a few years ago when some members of the community began toying with an interesting idea: What if we stopped using JavaScript as our main programming language for writing web applications?</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="Reason" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/reason-logo.svg"/>Reason</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="ReScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/rescript-logo.svg"/>ReScript</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Feb. 25, 2021</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/playing-with-the-collatz-conjecture"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Playing with the Collatz Conjecture</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">It was a cold New Year&#x27;s Eve and I was sitting at my friend Louis&#x27; dining room table in my hometown of Northampton, MA. We were both back in town for a bit from our respective locales — me from Seattle and him on a break from his Math Ph.D. at Rutgers University. Louis is one of those friends whose love for the quirky, bizarre world of mathematics has brought so much color to my life. He has a knack for making complex things simple, a trait I deeply admire. On this particular night, a few hours after the 🍾 had been popped and most folks had gone to bed, he introduced me to a tricky problem he&#x27;d been researching called the Collatz conjecture .</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="JavaScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/js-logo.svg"/>JavaScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="D3" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/d3-logo.svg"/>D3</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="Observable" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/observable-dark-logo.svg"/>Observable</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Jan. 8, 2021</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/animating-maps-by-centroid-sorting"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Animating Maps by Centroid Sorting</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">One of my favorite flourishes when creating new maps is to animate in the individual SVG paths for the areal unit I&#x27;m using, be that a state, province, county, or U.S. House District. It gives a pleasant unfolding effect to the experience, a way to settle a map reader into the story you&#x27;re trying to tell.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="JavaScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/js-logo.svg"/>JavaScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="D3" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/d3-logo.svg"/>D3</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="Observable" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/observable-dark-logo.svg"/>Observable</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Nov. 2, 2020</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/reflections-on-renature"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Reflections on Renature</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">The end of January brought with it the conclusion of Formidable&#x27;s first open source Fellowship. In just six weeks&#x27; time, Parker Ziegler brought our new physics-based animation library,  , to life. To read more about the project, check out the introductory post , the technical deep dive , and our new docs site . You can also install v0.1.0 of renature from NPM today, and check out the source on GitHub.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="TypeScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/ts-logo.svg"/>TypeScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="React" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/react-logo.svg"/>React</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">✨</span>Animation</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Feb. 6, 2020</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/building-physics-based-animations-with-renature"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Building Physics-Based Animations with Renature</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">Three weeks ago , we at Formidable unveiled an exciting open source project we&#x27;ve been working on as part of our OSS Fellowship Program – Renature .  is a physics-based animation library for React focused on building delightful UI animations using natural world forces like gravity, friction, and fluid resistance.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="TypeScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/ts-logo.svg"/>TypeScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="React" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/react-logo.svg"/>React</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">✨</span>Animation</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Jan. 20, 2020</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/introducing-renature"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Introducing Renature: Experimenting with Physics for UI Animation</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">At the beginning of December Formidable kicked off its inaugural open source fellowship . The Fellowship Program gives one employee per quarter the opportunity to pursue a novel technical idea, full-time, over the course of six weeks. The shape this idea takes is left up to the selected applicant; it can be a new open source library, a design tool like our stunning UX Deck , or technical writing that explores new practices in our ever-evolving field.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="TypeScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/ts-logo.svg"/>TypeScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="React" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/react-logo.svg"/>React</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">✨</span>Animation</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Dec. 18, 2019</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/cypress-e2e-testing"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">End to End Testing React Applications with Cypress</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">Cypress has been creating a lot of buzz in the JavaScript ecosystem recently, promising a simple yet powerful API for writing integration and end-to-e
15nd tests. With an open source core written in JavaScript, you can test anything that runs in a browser, regardless of language or framework (think Reason, WASM, or Svelte). Cypress is unique in that it operates in the same run-loop as your application—client code and test code are embedded in separate iframes right next to each other and communicate over websockets. Pretty clever!</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">⚠️</span>Testing</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="TypeScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/ts-logo.svg"/>TypeScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="React" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/react-logo.svg"/>React</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="Cypress" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/cypress-logo.svg"/>Cypress</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">May 20, 2019</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/mapping-in-react-and-d3"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Mapping in React and D3</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">A lot of folks today are talking about React , the
16Javascript framework that lets you build performant apps and UIs quickly and
17efficiently. I use React almost everyday at my job and in my own open source
18projects, often pairing it with Redux for state management.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="JavaScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/js-logo.svg"/>JavaScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="React" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/react-logo.svg"/>React</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="D3" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/d3-logo.svg"/>D3</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🗺️</span>GIS</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Aug. 29, 2017</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/d3-carto"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Building Interactive D3 Dashboards with Carto Web Maps</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">Dashboards are all the rage these days. The talented folks at Stamen and Tableau have shown just how powerful a well-designed dashboard can be for integrating statistical and geospatial stories on a 
18single web page. I wanted to see if I could emulate their work in an interactive web application I’ve been developing for Transportation Alternatives that explores correlations between traffic crashes and poverty in New York City. But rather than using ready-made software like Tableau, I wanted to build and design the application through code using two powerful open-source tools – CARTO and D3 . This post will go through the design process I used for building my dashboard, highlighting some of the key pieces of code needed to get CARTO and D3 talking to one another.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="JavaScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/js-logo.svg"/>JavaScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="D3" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/d3-logo.svg"/>D3</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="CARTO" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/carto-logo.svg"/>CARTO</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🗺️</span>GIS</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Sept. 26, 2016</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/naip-imagery-urban-forest"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Using NAIP Imagery and a Texture Raster to Model the Urban Forest</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">As high-resolution satellite imagery becomes more accessible by the day, geographers, urban planners, and ecologists have begun to explore its potential for modeling the urban forest . However, attempts at precise urban canopy classifications often run into a few predictable problems. 30m or even 15m resolution still cannot model individual street trees or isolated stands. Classification algorithms confuse grass and other scrubby vegetation for the canopy. Shadows cast by adjacent trees affect spectral returns, leading to further misclassification. In short, mapping the urban forest in an accurate, detailed, and inexpensive way remains a challenge.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🗺️</span>GIS</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Sept. 14, 2016</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/sf-eviction-map"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Building a Map of Eviction in San Francisco with CartoDB.js</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">Throughout this semester, through all of the small victories and the frustrations and the beautiful journey of self
18-directed learning, I&#x27;ve always had one key goal at the front of my mind – make a map, exclusively through code, that I believe in. This has become a more and more difficult challenge for me as I&#x27;ve expanded my cartographic skills and interests into different realms and more complex politics. I have come to expect more of myself, both in terms of the design and the aesthetics of my maps as well as the epistemologies and methodologies that underlie them. I don&#x27;t know if I would necessarily go so far as to call all of my maps &quot;lies&quot; (as Monmonier might), but, in practicing self-reflexivity in my cartographic design process, I have learned that they are certainly far from being objective &quot;truth&quot;. Maps reflect their creators&#x27; perspectives and views of the world; not only that, they channel particular ways of viewing, seeing, engaging with, and understanding the world that are dependent on the tools used to make them. That will always be the map&#x27;s limitation. But rather than seeing maps only for their limitations, for their role as imperfect representations of a world that is inherently messy and complex, perhaps we can think of them differently – as individual experiences and expressions that can have meaning for others beyond the cartographer. Pieces of art that can inspire. Beautiful data that can inform. Little worlds unto themselves.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="JavaScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/js-logo.svg"/>JavaScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="CARTO" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/carto-logo.svg"/>CARTO</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🗺️</span>GIS</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">May 20, 2016</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/zyep-map"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Help Professor Holler Build an Interactive Map for the Zuni Youth Enrichment Project (ZYEP)</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">Anyone familiar with the contemporary cartographic landscape knows that the climate is shifting swiftly away from the static and towards the interactive. People want maps they can play with, maps that are responsive to user needs, and maps that can be accessed with nothing more than an internet connection and a few directed search terms. Particularly for those seeking to create a community resource (or just something that folks can access on the go) a web map is a good design choice.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="JavaScript" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/js-logo.svg"/>JavaScript</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🗺️</span>GIS</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">May 4, 2016</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/midd-spring-symposium"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Presenting at the Middlebury Spring Symposium</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">After the high of AAG, I came back to Middlebury reinvigorated and excited to get back to work with coding. Learning Python scripting in a matter of five weeks, producing a hard coded script to solve a real-world problem, creating an abstracted geoprocessing tool for broader application, and writing my first piece of documentation all felt like significant achievements in such a short amount of time. I wanted to keep the rhythm going, to dive further into PostgreSQL and PostGIS, Javascript, interactive cartography, spatial databases, and the whole slew of crazy plans I dreamt up for myself for the rest of my semester. But before I did that, I felt it was important to share the experiences of this first half with my peers.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🗣️</span>Speaking</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Apr. 18, 2016</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/aag"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Presenting at the American Association of Geographers (AAG) Annual Conference</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">The research process can so often feel like a solitary experience. Particularly working in the realm of technical geospatial applications and assorted programming languages, I often find myself deep down the rabbit hole, following links on endless Stack Exchange and Github pages to their very ends. And while I enjoy this process – the careful search for a technique or a block of code or an idea that will help me solve my problems – I have also noticed how it has brought me further from the original purpose of my research. From the beginning, I have wanted my work to 
18serve as a pedagogical tool, a framework for how we might go about teaching GIS and cartography with a keener eye to the role of both code and critical feminist theory in this learning process. And in order to do that, I needed to take an important step during this, the middle of my semester – presenting my work.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🗣️</span>Speaking</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Apr. 4, 2016</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/awr-docs"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Writing Documentation for the AWR Custom Tool</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">Having created a custom Python geoprocessing tool to automate the process of areal-weighted reaggregation (AWR), my next task was to write documentation articulating how the tool actually works. Documentation is obviously a critical part of development – without it, the tools we create can&#x27;t readily be accessed by others. These things we&#x27;ve poured our heart and soul into have no broader application in the world.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="Python" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/python-logo.svg"/>Python</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🗺️</span>GIS</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Mar. 24, 2016</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/custom-geoprocessing-tools-with-python"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Creating Custom Geoprocessing Tools with Python Scripts</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">While I think many GIS analysts cherish Python for its ability to automate large-scale geoprocessing tasks and do a lot of the heavy lifting when it comes to data management, I find that its true creative power lies in creating custom geoprocessing scripts. So just to back up for a moment, we know that all GIS applications are based on the idea of passing spatial files (i.e. shapefiles, rasters, feature classes) through script tools that do something to these files. These scripts, nowadays, are often written in Python, especially after Esri began writing all of their tools in this language. For most GIS users, however, script tools operate almost like a black box – files are passed into them and new files pop out. While we all have an understanding of what the input needs to look like and what the output should look like, what happens in the middle actually remains fairly opaque. This obscurity was something that initially frustrated me when I first began using GIS. I wanted to know more about what was actually going on &quot;under the hood&quot; and to be able to manipulate that process to make different things happen.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="Python" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/python-logo.svg"/>Python</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🗺️</span>GIS</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Mar. 16, 2016</p></div></div></div></div></a><a class="col-span-12 md:col-span-6" href="/thoughts/python-scripting-for-automated-geoprocessing"><div class="rounded-lg" style="opacity:0;transform:translateY(50px) translateZ(0)"><div class="flex h-full bg-gradient-to-r from-primary to-secondary shadow-lg p-2 rounded-lg"><div class="flex flex-col p-4 rounded-md bg-white flex-auto overflow-auto"><h2 class="text-4xl font-serif font-semibold">Python Scripting for Automated Geoprocessing</h2><p class="text-2xl font-serif line-clamp-ellipsis leading-snug tracking-normal my-8">When I first developed the syllabus for my senior research, I spent a lot of time asking fellow GIS students, professors, and analysts where they thought I should begin my study. And nearly everyone gave me the same answer – Python scripting.</p><div class="flex justify-between items-end mt-auto"><div class="flex flex-wrap"><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><img alt="Python" loading="lazy" width="20" height="20" decoding="async" data-nimg="1" class="mr-2 w-8 h-8" style="color:transparent" src="/logos/python-logo.svg"/>Python</div><div class="text-black font-mono flex items-center self-start border-primary border-solid border-2 rounded-md py-2 h-16 text-lg px-2 m-2 h-16 text-lg"><span class="text-3xl mr-2">🗺️</span>GIS</div></div><p class="text-xl lg:2xl font-mono self-end m-2 flex-shrink-0">Feb. 26, 2016</p></div></div></div></div></a></div></section></main></div><footer class="w-full max-w-view mx-auto flex flex-col px-8 py-12 sm:py-16 sm:px-32 md:px-40 __variable_8d7944"><div class="flex flex-col stack-lg self-center md:stack-xl-h md:flex-row md:items-center"><h2 class="font-serif font-semibold text-6xl m-0 self-center">
18Find Me<svg width="105" height="10" viewBox="0 0 105 10" class="translate-y-2" aria-hidden="true"><path d="M5,0 L25,0 L20,10 L0,10 z" fill="#FBFDD7"></path><path d="M25,0 L45,0 L40,10 L20,10 z" fill="#FCEB71"></path><path d="M45,0 L65,0 L60,10 L40,10 z" fill="#FCBB45"></path><path d="M65,0 L85,0 L80,10 L60,10 z" fill="#FC9A59"></path><path d="M85,0 L105,0 L100,10 L80,10 z" fill="#F24B4B"></path></svg></h2><div class="flex items-center stack-lg-h md:stack-xl-h"><a href="https://github.com/parkerziegler" target="_blank" rel="noopener noreferrer" class="flex justify-center"><img alt="Parker&#x27;s Github" loading="lazy" width="40" height="40" decoding="async" data-nimg="1" class="h-16 w-16" style="color:transparent" src="/logos/github-logo.svg"/></a><a href="https://observablehq.com/@parkerziegler" target="_blank" rel="noopener noreferrer" class="flex justify-center"><img alt="Parker&#x27;s Observable" loading="lazy" width="40" height="40" decoding="async" data-nimg="1" class="h-16 w-16" style="color:transparent" src="/logos/observable-logo.svg"/></a><a href="https://twitter.com/parker_ziegler" target="_blank" rel="noopener noreferrer" class="flex justify-center"><img alt="Parker&#x27;s Twitter" loading="lazy" width="40" height="40" decoding="async" data-nimg="1" class="h-16 w-16" style="color:transparent" src="/logos/twitter-logo.svg"/></a><a href="https://www.linkedin.com/in/parkerziegler/" target="_blank" rel="noopener noreferrer" class="flex justify-center"><img alt="Parker&#x27;s LinkedIn" loading="lazy" width="40" height="40" decoding="async" data-nimg="1" class="h-16 w-16" style="color:transparent" src="/logos/linkedin-logo.svg"/></a></div></div></footer></div>
18<script id="__NEXT_DATA__" type="application/json" crossorigin="">{"props":{"pageProps":{"posts":[{"title":"Choropleths, Four Ways","description":"In this post, I explore four different ways to create choropleth maps using four different JavaScript mapping libraries.","slug":"choropleths-four-ways","date":"Nov. 10, 2022","tags":[{"icon":"/logos/js-logo.svg","tag":"JavaScript"},{"icon":"/logos/d3-logo.svg","tag":"D3"},{"icon":"/logos/observable-dark-logo.svg","tag":"Observable"}],"introText":"Ah, the humble choropleth. Given that its name is almost universally mispronounced outside of cartography circles (looking at you \"chloropleth\" 👀), it's somewhat funny that this is one of the most recognizable map styles out there."},{"title":"On Being a Student Again","description":"Before I start the second semester of my Ph.D. at Berkeley, I reflect back on the experience of being a student again after 5 and a half years away from academia.","slug":"on-being-a-student-again","date":"Jan. 18, 2022","tags":[{"icon":"🎓","tag":"Grad School"}],"introText":"I head back to classes again this week as part of my Ph.D. at Berkeley and, before I do, I wanted to take a moment to reflect on and share my experience returning to school after 5 and a half years. While in industry, I didn’t make time for a regular reflection practice — I always figured my annual reviews were supposed to help me do that. Looking back, I see that a workplace annual review is not especially well-suited to meaningful self-reflection. Your focus is on considering the value you bring to the company you’re working for, not evaluating whether or not the work is still meaningful to you. You reflect on your year in highlights, but you don’t, as Mike Bostock advises , think critically about if you’re still enjoying the day-to-day."},{"title":"The State of Reason in 2021","description":"In this post, we look at Reason and its new offshoot, ReScript, nearly five years after the language came to life.","slug":"the-state-of-reason-in-2021","date":"Feb. 25, 2021","tags":[{"icon":"/logos/reason-logo.svg","tag":"Reason"},{"icon":"/logos/rescript-logo.svg","tag":"ReScript"}],"introText":"If you, like me, find a bizarre pleasure in the relentless churn of the JavaScript ecosystem, you may remember a period just a few years ago when some members of the community began toying with an interesting idea: What if we stopped using JavaScript as our main programming language for writing web applications?"},{"title":"Playing with the Collatz Conjecture","description":"In this post, I dive into visualizing the Collatz conjecture, one of my favorite problems in mathematics.","slug":"playing-with-the-collatz-conjecture","date":"Jan. 8, 2021","tags":[{"icon":"/logos/js-logo.svg","tag":"JavaScript"},{"icon":"/logos/d3-logo.svg","tag":"D3"},{"icon":"/logos/observable-dark-logo.svg","tag":"Observable"}],"introText":"It was a cold New Year's Eve and I was sitting at my friend Louis' dining room table in my hometown of Northampton, MA. We were both back in town for a bit from our respective locales — me from Seattle and him on a break from his Math Ph.D. at Rutgers University. Louis is one of those friends whose love for the quirky, bizarre world of mathematics has brought so much color to my life. He has a knack for making complex things simple, a trait I deeply admire. On this particular night, a few hours after the 🍾 had been popped and most folks had gone to bed, he introduced me to a tricky problem he'd been researching called the Collatz conjecture ."},{"title":"Animating Maps by Centroid Sorting","description":"In this post, we look at how to add delightful animations to your maps built in D3.","slug":"animating-maps-by-centroid-sorting","date":"Nov. 2, 2020","tags":[{"icon":"/logos/js-logo.svg","tag":"JavaScript"},{"icon":"/logos/d3-logo.svg","tag":"D3"},{"icon":"/logos/observable-dark-logo.svg","tag":"Observable"}],"introText":"One of my favorite flourishes when creating new maps is to animate in the individual SVG paths for the areal unit I'm using, be that a state, province, county, or U.S. House District. It gives a pleasant unfolding effect to the experience, a way to settle a map reader into the story you're trying to tell."},{"title":"Reflections on Renature","description":"In this post, I reflect back on the experience of authoring renature, a new physics-based animation library for React, and how working on open source full-time can be transformative for fostering personal creativity.","slug":"reflections-on-renature","date":"Feb. 6, 2020","tags":[{"icon":"/logos/ts-logo.svg","tag":"TypeScript"},{"icon":"/logos/react-logo.svg","tag":"React"},{"icon":"✨","tag":"Animation"}],"introText":"The end of January brought with it the conclusion of Formidable's first open source Fellowship. In just six weeks' time, Parker Ziegler brought our new physics-based animation library,  , to life. To read more about the project, check out the introductory post , the technical deep dive , and our new docs site . You can also install v0.1.0 of renature from NPM today, and check out the source on GitHub."},{"title":"Building Physics-Based Animations with Renature","description":"In this post, I look at how to create whimsical, delightful animations with renature, a new physics-based animation library for React.","slug":"building-physics-based-animations-with-renature","date":"Jan. 20, 2020","tags":[{"icon":"/logos/ts-logo.svg","tag":"TypeScript"},{"icon":"/logos/react-logo.svg","tag":"React"},{"icon":"✨","tag":"Animation"}],"introText":"Three weeks ago , we at Formidable unveiled an exciting open source project we've been working on as part of our OSS Fellowship Program – Renature .  is a physics-based animation library for React focused on building delightful UI animations using natural world forces like gravity, friction, and fluid resistance."},{"title":"Introducing Renature: Experimenting with Physics for UI Animation","description":"In this post, I introduce renature, a new physics-based animation library for React focused on modeling natural world forces.","slug":"introducing-renature","date":"Dec. 18, 2019","tags":[{"icon":"/logos/ts-logo.svg","tag":"TypeScript"},{"icon":"/logos/react-logo.svg","tag":"React"},{"icon":"✨","tag":"Animation"}],"introText":"At the beginning of December Formidable kicked off its inaugural open source fellowship . The Fellowship Program gives one employee per quarter the opportunity to pursue a novel technical idea, full-time, over the course of six weeks. The shape this idea takes is left up to the selected applicant; it can be a new open source library, a design tool like our stunning UX Deck , or technical writing that explores new practices in our ever-evolving field."},{"title":"End to End Testing React Applications with Cypress","description":"In this post, I look at how to create robust end-to-e
18nd tests for your React applications using Cypress.","slug":"cypress-e2e-testing","date":"May 20, 2019","tags":[{"icon":"⚠️","tag":"Testing"},{"icon":"/logos/ts-logo.svg","tag":"TypeScript"},{"icon":"/logos/react-logo.svg","tag":"React"},{"icon":"/logos/cypress-logo.svg","tag":"Cypress"}],"introText":"Cypress has been creating a lot of buzz in the JavaScript ecosystem recently, promising a simple yet powerful API for writing integration and end-to-end tests. With an open source core written in JavaScript, you can test anything that runs in a browser, regardless of language or framework (think Reason, WASM, or Svelte). Cypress is unique in that it operates in the same run-loop as your application—client code and test code are embedded in separate iframes right next to each other and communicate over websockets. Pretty clever!"},{"title":"Mapping in React and D3","description":"In this post, we go over how to create engaging maps using D3 in React applications.","slug":"mapping-in-react-and-d3","date":"Aug. 29, 2017","tags":[{"icon":"/logos/js-logo.svg","tag":"JavaScript"},{"icon":"/logos/react-logo.svg","tag":"React"},{"icon":"/logos/d3-logo.svg","tag":"D3"},{"icon":"🗺️","tag":"GIS"}],"introText":"A lot of folks today are talking about React , the\nJavascript framework that lets you build performant apps and UIs quickly and\nefficiently. I use React almost everyday at my job and in my own open source\nprojects, often pairing it with Redux for state management."},{"title":"Building Interactive D3 Dashboards with Carto Web Maps","description":"In this post for Azavea, I look at how to combine interactive D3 dashboards with your CARTO web maps.","slug":"d3-carto","date":"Sept. 26, 2016","tags":[{"icon":"/logos/js-logo.svg","tag":"JavaScript"},{"icon":"/logos/d3-logo.svg","tag":"D3"},{"icon":"/logos/carto-logo.svg","tag":"CARTO"},{"icon":"🗺️","tag":"GIS"}],"introText":"Dashboards are all the rage these days. The talented folks at Stamen and Tableau have shown just how powerful a well-designed dashboard can be for integrating statistical and geospatial stories on a single web page. I wanted to see if I could emulate their work in an interactive web application I’ve been developing for Transportation Alternatives that explores correlations between traffic crashes and poverty in New York City. But rather than using ready-made software like Tableau, I wanted to build and design the application through code using two powerful open-source tools – CARTO and D3 . This post will go through the design process I used for building my dashboard, highlighting some of the key pieces of code needed to get CARTO and D3 talking to one another."},{"title":"Using NAIP Imagery and a Texture Raster to Model the Urban Forest","description":"In this post for Azavea, I explore using NAIP and a texter rasture for performing precise urban canopy cover analysis in ArcGIS.","slug":"naip-imagery-urban-forest","date":"Sept. 14, 2016","tags":[{"icon":"🗺️","tag":"GIS"}],"introText":"As high-resolution satellite imagery becomes more accessible by the day, geographers, urban planners, and ecologists have begun to explore its potential for modeling the urban forest . However, attempts at precise urban canopy classifications often run into a few predictable problems. 30m or even 15m resolution still cannot model individual street trees or isolated stands. Classification algorithms confuse grass and other scrubby vegetation for the canopy. Shadows cast by adjacent trees affect spectral returns, leading to further misclassification. In short, mapping the urban forest in an accurate, detailed, and inexpensive way remains a challenge."},{"title":"Building a Map of Eviction in San Francisco with CartoDB.js","description":"In this post, I walk through the process of building an interactive map of eviction in San Francisco using CartoDB.js.","slug":"sf-eviction-map","date":"May 20, 2016","tags":[{"icon":"/logos/js-logo.svg","tag":"JavaScript"},{"icon":"/logos/carto-logo.svg","tag":"CARTO"},{"icon":"🗺️","tag":"GIS"}],"introText":"Throughout this semester, through all of the small victories and the frustrations and the beautiful journey of self
18-directed learning, I've always had one key goal at the front of my mind – make a map, exclusively through code, that I believe in. This has become a more and more difficult challenge for me as I've expanded my cartographic skills and interests into different realms and more complex politics. I have come to expect more of myself, both in terms of the design and the aesthetics of my maps as well as the epistemologies and methodologies that underlie them. I don't know if I would necessarily go so far as to call all of my maps \"lies\" (as Monmonier might), but, in practicing self-reflexivity in my cartographic design process, I have learned that they are certainly far from being objective \"truth\". Maps reflect their creators' perspectives and views of the world; not only that, they channel particular ways of viewing, seeing, engaging with, and understanding the world that are dependent on the tools used to make them. That will always be the map's limitation. But rather than seeing maps only for their limitations, for their role as imperfect representations of a world that is inherently messy and complex, perhaps we can think of them differently – as individual experiences and expressions that can have meaning for others beyond the cartographer. Pieces of art that can inspire. Beautiful data that can inform. Little worlds unto themselves."},{"title":"Help Professor Holler Build an Interactive Map for the Zuni Youth Enrichment Project (ZYEP)","description":"In this post, I walk through building an interactive web map using Leaflet for the Zuni Youth Enrichment Project (ZYEP).","slug":"zyep-map","date":"May 4, 2016","tags":[{"icon":"/logos/js-logo.svg","tag":"JavaScript"},{"icon":"🗺️","tag":"GIS"}],"introText":"Anyone familiar with the contemporary cartographic landscape knows that the climate is shifting swiftly away from the static and towards the interactive. People want maps they can play with, maps that are responsive to user needs, and maps that can be accessed with nothing more than an internet connection and a few directed search terms. Particularly for those seeking to create a community resource (or just something that folks can access on the go) a web map is a good design choice."},{"title":"Presenting at the Middlebury Spring Symposium","description":"I present my senior research on mixing code and feminist methodologies into the GIS classroom to my peers at the Middlebury College Undergraduate Research Symposium.","slug":"midd-spring-symposium","date":"Apr. 18, 2016","tags":[{"icon":"🗣️","tag":"Speaking"}],"introText":"After the high of AAG, I came back to Middlebury reinvigorated and excited to get back to work with coding. Learning Python scripting in a matter of five weeks, producing a hard coded script to solve a real-world problem, creating an abstracted geoprocessing tool for broader application, and writing my first piece of documentation all felt like significant achievements in such a short amount of time. I wanted to keep the rhythm going, to dive further into PostgreSQL and PostGIS, Javascript, interactive cartography, spatial databases, and the whole slew of crazy plans I dreamt up for myself for the rest of my semester. But before I did that, I felt it was important to share the experiences of this first half with my peers."},{"title":"Presenting at the American Association of Geographers (AAG) Annual Conference","description":"I head to the American Association of Geographers (AAG) annual conference in San Francisco to present my senior research on mixing code and feminist methodologies into the GIS classroom.","slug":"aag","date":"Apr. 4, 2016","tags":[{"icon":"🗣️","tag":"Speaking"}],"introText":"The research process can so often feel like a solitary experience. Particularly working in the realm of technical geospatial applications and assorted programming languages, I often find myself deep down the rabbit hole, following links on endless Stack Exchange and Github pages to their very ends. And while I enjoy this process – the careful search for a technique or a block of code or an idea that will help me solve my problems – I have also noticed how it has brought me further from the original purpose of my research. From the beginning, I have wanted my work to 
18serve as a pedagogical tool, a framework for how we might go about teaching GIS and cartography with a keener eye to the role of both code and critical feminist theory in this learning process. And in order to do that, I needed to take an important step during this, the middle of my semester – presenting my work."},{"title":"Writing Documentation for the AWR Custom Tool","description":"Documentation for a Python script that runs an automated areal-weighted reaggregation analysis in ArcGIS.","slug":"awr-docs","date":"Mar. 24, 2016","tags":[{"icon":"/logos/python-logo.svg","tag":"Python"},{"icon":"🗺️","tag":"GIS"}],"introText":"Having created a custom Python geoprocessing tool to automate the process of areal-weighted reaggregation (AWR), my next task was to write documentation articulating how the tool actually works. Documentation is obviously a critical part of development – without it, the tools we create can't readily be accessed by others. These things we've poured our heart and soul into have no broader application in the world."},{"title":"Creating Custom Geoprocessing Tools with Python Scripts","slug":"custom-geoprocessing-tools-with-python","description":"I experiment with creating custom Python scripts to run common geoprocessing tasks in an automated fashion.","date":"Mar. 16, 2016","tags":[{"icon":"/logos/python-logo.svg","tag":"Python"},{"icon":"🗺️","tag":"GIS"}],"introText":"While I think many GIS analysts cherish Python for its ability to automate large-scale geoprocessing tasks and do a lot of the heavy lifting when it comes to data management, I find that its true creative power lies in creating custom geoprocessing scripts. So just to back up for a moment, we know that all GIS applications are based on the idea of passing spatial files (i.e. shapefiles, rasters, feature classes) through script tools that do something to these files. These scripts, nowadays, are often written in Python, especially after Esri began writing all of their tools in this language. For most GIS users, however, script tools operate almost like a black box – files are passed into them and new files pop out. While we all have an understanding of what the input needs to look like and what the output should look like, what happens in the middle actually remains fairly opaque. This obscurity was something that initially frustrated me when I first began using GIS. I wanted to know more about what was actually going on \"under the hood\" and to be able to manipulate that process to make different things happen."},{"title":"Python Scripting for Automated Geoprocessing","description":"In this post, I explore using Python to perform automated geoprocessing tasks in ArcGIS.","slug":"python-scripting-for-automated-geoprocessing","date":"Feb. 26, 2016","tags":[{"icon":"/logos/python-logo.svg","tag":"Python"},{"icon":"🗺️","tag":"GIS"}],"introText":"When I first developed the syllabus for my senior research, I spent a lot of time asking fellow GIS students, professors, and analysts where they thought I should begin my study. And nearly everyone gave me the same answer – Python scripting."}]},"__N_SSG":true},"page":"/thoughts","query":{},"buildId":"w57ZcEGWwx5SCMXHkOiaY","isFallback":false,"gsp":true,"scriptLoader":[]}</script>
18</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.