PageSourceSearch

https://dantonnoriega.gitlab.io/resume.html

html dantonnoriega.gitlab.io collected 2026-10-10 02:21:18 UTC 40,198 bytes, 915 lines download raw bytes

1<!DOCTYPE html>
2<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
3
4<meta charset="utf-8">
5<meta name="generator" content="quarto-1.9.38">
6
7<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
8
9
10<title>Resume – danton.codes</title>
11<style>
12/* Default styles provided by pandoc.
13** See https://pandoc.org/MANUAL.html#variables-for-html for config info.
14*/
15code{white-space: pre-wrap;}
16span.smallcaps{font-variant: small-caps;}
17div.columns{display: flex; gap: min(4vw, 1.5em);}
18div.column{flex: auto; overflow-x: auto;}
19div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
20ul.task-list{list-style: none;}
21ul.task-list li input[type="checkbox"] {
22  width: 0.8em;
23  margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ 
24  vertical-align: middle;
25}
26</style>
27
28
29<script src="site_libs/quarto-nav/quarto-nav.js"></script>
vendor: 1 bytes, line 29
29
30<script src="site_libs/quarto-nav/headroom.min.js"></script>
vendor: 1 bytes, line 30
30
31<script src="site_libs/clipboard/clipboard.min.js"></script>
vendor: 1 bytes, line 31
31
32<script src="site_libs/quarto-search/autocomplete.umd.js"></script>
vendor: 1 bytes, line 32
32
33<script src="site_libs/quarto-search/fuse.min.js"></script>
vendor: 1 bytes, line 33
33
34<script src="site_libs/quarto-search/quarto-search.js"></script>
34
35<meta name="quarto:offset" content="./">
36<link href="./favicon.ico" rel="icon">
37<script src="site_libs/quarto-html/quarto.js" type="module"></script>
vendor: 1 bytes, line 37
37
38<script src="site_libs/quarto-html/tabsets/tabsets.js" type="module"></script>
vendor: 1 bytes, line 38
38
39<script src="site_libs/quarto-html/popper.min.js"></script>
vendor: 1 bytes, line 39
39
40<script src="site_libs/quarto-html/tippy.umd.min.js"></script>
vendor: 1 bytes, line 40
40
41<script src="site_libs/quarto-html/anchor.min.js"></script>
41
42<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">
43<link href="site_libs/quarto-html/quarto-syntax-highlighting-15634bcf2e68342d4ad2dfa704d543f6.css" rel="stylesheet" class="quarto-color-scheme" id="quarto-text-highlighting-styles">
44<link href="site_libs/quarto-html/quarto-syntax-highlighting-dark-0a6b7249c26820e032cb0bd839ff02b1.css" rel="stylesheet" class="quarto-color-scheme quarto-color-alternate" id="quarto-text-highlighting-styles">
45<link href="site_libs/quarto-html/quarto-syntax-highlighting-15634bcf2e68342d4ad2dfa704d543f6.css" rel="stylesheet" class="quarto-color-scheme-extra" id="quarto-text-highlighting-styles">
46<script src="site_libs/bootstrap/bootstrap.min.js"></script>
46
47<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">
48<link href="site_libs/bootstrap/bootstrap-85545d89869a7d03b8d8b22d16f33e0b.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme" id="quarto-bootstrap" data-mode="light">
49<link href="site_libs/bootstrap/bootstrap-dark-f7fba41c1ef1477727021bb8767eabf3.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme quarto-color-alternate" id="quarto-bootstrap" data-mode="dark">
50<link href="site_libs/bootstrap/bootstrap-85545d89869a7d03b8d8b22d16f33e0b.min.css" rel="stylesheet" append-hash="true" class="quarto-color-scheme-extra" id="quarto-bootstrap" data-mode="light">
51<script id="quarto-search-options" type="application/json">{
52  "location": "navbar",
53  "copy-button": false,
54  "collapse-after": 3,
55  "panel-placement": "end",
56  "type": "overlay",
57  "limit": 50,
58  "keyboard-shortcut": [
59    "f",
60    "/",
61    "s"
62  ],
63  "show-item-context": false,
64  "language": {
65    "search-no-results-text": "No results",
66    "search-matching-documents-text": "matching documents",
67    "search-copy-link-title": "Copy link to search",
68    "search-hide-matches-text": "Hide additional matches",
69    "search-more-match-text": "more match in this document",
70    "search-more-matches-text": "more matches in this document",
71    "search-clear-button-title": "Clear",
72    "search-text-placeholder": "",
73    "search-detached-cancel-button-title": "Cancel",
74    "search-submit-button-title": "Submit",
75    "search-label": "Search"
76  }
77}</script>
77
78
79
80<link rel="stylesheet" href="styles.css">
81<meta property="og:title" content="Resume – danton.codes">
82<meta property="og:image" content="https://danton.codes/images/profile.jpeg">
83<meta property="og:site_name" content="danton.codes">
84<meta name="twitter:title" content="Resume – danton.codes">
85<meta name="twitter:image" content="https://danton.codes/images/profile.jpeg">
86<meta name="twitter:card" content="summary_large_image">
87</head>
88
89<body class="nav-fixed fullcontent quarto-light">
89<script id="quarto-html-before-body" type="application/javascript">
90    const toggleBodyColorMode = (bsSheetEl) => {
91      const mode = bsSheetEl.getAttribute("data-mode");
92      const bodyEl = window.document.querySelector("body");
93      if (mode === "dark") {
94        bodyEl.classList.add("quarto-dark");
95        bodyEl.classList.remove("quarto-light");
96      } else {
97        bodyEl.classList.add("quarto-light");
98        bodyEl.classList.remove("quarto-dark");
99      }
100    }
101    const toggleBodyColorPrimary = () => {
102      const bsSheetEl = window.document.querySelector("link#quarto-bootstrap:not([rel=disabled-stylesheet])");
103      if (bsSheetEl) {
104        toggleBodyColorMode(bsSheetEl);
105      }
106    }
107    const setColorSchemeToggle = (alternate) => {
108      const toggles = window.document.querySelectorAll('.quarto-color-scheme-toggle');
109      for (let i=0; i < toggles.length; i++) {
110        const toggle = toggles[i];
111        if (toggle) {
112          if (alternate) {
113            toggle.classList.add("alternate");
114          } else {
115            toggle.classList.remove("alternate");
116          }
117        }
118      }
119    };
120    const toggleColorMode = (alternate) => {
121      // Switch the stylesheets
122      const primaryStylesheets = window.document.querySelectorAll('link.quarto-color-scheme:not(.quarto-color-alternate)');
123      const alternateStylesheets = window.document.querySelectorAll('link.quarto-color-scheme.quarto-color-alternate');
124      manageTransitions('#quarto-margin-sidebar .nav-link', false);
125      if (alternate) {
126        // note: dark is layered on light, we don't disable primary!
127        enableStylesheet(alternateStylesheets);
128        for (const sheetNode of alternateStylesheets) {
129          if (sheetNode.id === "quarto-bootstrap") {
130            toggleBodyColorMode(sheetNode);
131          }
132        }
133      } else {
134        disableStylesheet(alternateStylesheets);
135        enableStylesheet(primaryStylesheets)
136        toggleBodyColorPrimary();
137      }
138      manageTransitions('#quarto-margin-sidebar .nav-link', true);
139      // Switch the toggles
140      setColorSchemeToggle(alternate)
141      // Hack to workaround the fact that safari doesn't
142      // properly recolor the scrollbar when toggling (#1455)
143      if (navigator.userAgent.indexOf('Safari') > 0 && navigator.userAgent.indexOf('Chrome') == -1) {
144        manageTransitions("body", false);
145        window.scrollTo(0, 1);
146        setTimeout(() => {
147          window.scrollTo(0, 0);
148          manageTransitions("body", true);
149        }, 40);
150      }
151    }
152    const disableStylesheet = (stylesheets) => {
153      for (let i=0; i < stylesheets.length; i++) {
154        const stylesheet = stylesheets[i];
155        stylesheet.rel = 'disabled-stylesheet';
156      }
157    }
158    const enableStylesheet = (stylesheets) => {
159      for (let i=0; i < stylesheets.length; i++) {
160        const stylesheet = stylesheets[i];
161        if(stylesheet.rel !== 'stylesheet') { // for Chrome, which will still FOUC without this check
162          stylesheet.rel = 'stylesheet';
163        }
164      }
165    }
166    const manageTransitions = (selector, allowTransitions) => {
167      const els = window.document.querySelectorAll(selector);
168      for (let i=0; i < els.length; i++) {
169        const el = els[i];
170        if (allowTransitions) {
171          el.classList.remove('notransition');
172        } else {
173          el.classList.add('notransition');
174        }
175      }
176    }
177    const isFileUrl = () => {
178      return window.location.protocol === 'file:';
179    }
180    const hasAlternateSentinel = () => {
181      let styleSentinel = getColorSchemeSentinel();
182      if (styleSentinel !== null) {
183        return styleSentinel === "alternate";
184      } else {
185        return false;
186      }
187    }
188    const setStyleSentinel = (alternate) => {
189      const value = alternate ? "alternate" : "default";
190      if (!isFileUrl()) {
191        window.localStorage.setItem("quarto-color-scheme", value);
192      } else {
193        localAlternateSentinel = value;
194      }
195    }
196    const getColorSchemeSentinel = () => {
197      if (!isFileUrl()) {
198        const storageValue = window.localStorage.getItem("quarto-color-scheme");
199        return storageValue != null ? storageValue : localAlternateSentinel;
200      } else {
201        return localAlternateSentinel;
202      }
203    }
204    const toggleGiscusIfUsed = (isAlternate, darkModeDefault) => {
205      const baseTheme = document.querySelector('#giscus-base-theme')?.value ?? 'light';
206      const alternateTheme = document.querySelector('#giscus-alt-theme')?.value ?? 'dark';
207      let newTheme = '';
208      if(authorPrefersDark) {
209        newTheme = isAlternate ? baseTheme : alternateTheme;
210      } else {
211        newTheme = isAlternate ? alternateTheme : baseTheme;
212      }
213      const changeGiscusTheme = () => {
214        // From: https://github.com/giscus/giscus/issues/336
215        const sendMessage = (message) => {
216          const iframe = document.querySelector('iframe.giscus-frame');
217          if (!iframe) return;
218          iframe.contentWindow.postMessage({ giscus: message }, 'https://giscus.app');
219        }
220        sendMessage({
221          setConfig: {
222            theme: newTheme
223          }
224        });
225      }
226      const isGiscussLoaded = window.document.querySelector('iframe.giscus-frame') !== null;
227      if (isGiscussLoaded) {
228        changeGiscusTheme();
229      }
230    };
231    const authorPrefersDark = false;
232    const darkModeDefault = authorPrefersDark;
233      document.querySelector('link#quarto-text-highlighting-styles.quarto-color-scheme-extra').rel = 'disabled-stylesheet';
234      document.querySelector('link#quarto-bootstrap.quarto-color-scheme-extra').rel = 'disabled-stylesheet';
235    let localAlternateSentinel = darkModeDefault ? 'alternate' : 'default';
236    // Dark / light mode switch
237    window.quartoToggleColorScheme = () => {
238      // Read the current dark / light value
239      let toAlternate = !hasAlternateSentinel();
240      toggleColorMode(toAlternate);
241      setStyleSentinel(toAlternate);
242      toggleGiscusIfUsed(toAlternate, darkModeDefault);
243      window.dispatchEvent(new Event('resize'));
244    };
245    // Switch to dark mode if need be
246    if (hasAlternateSentinel()) {
247      toggleColorMode(true);
248    } else {
249      toggleColorMode(false);
250    }
251  </script>
251
252
253<div id="quarto-search-results"></div>
254  <header id="quarto-header" class="headroom fixed-top">
255    <nav class="navbar navbar-expand-lg " data-bs-theme="dark">
256      <div class="navbar-container container-fluid">
257      <div class="navbar-brand-container mx-auto">
258    <a class="navbar-brand" href="./index.html">
259    <span class="navbar-title">danton.codes</span>
260    </a>
261  </div>
262            <div id="quarto-search" class="" title="Search"></div>
263          <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" role="menu" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">
264  <span class="navbar-toggler-icon"></span>
265</button>
266          <div class="collapse navbar-collapse" id="navbarCollapse">
267            <ul class="navbar-nav navbar-nav-scroll me-auto">
268  <li class="nav-item">
269    <a class="nav-link" href="./index.html"> 
270<span class="menu-text">About Me</span></a>
271  </li>  
272  <li class="nav-item">
273    <a class="nav-link active" href="./resume.html" aria-current="page"> 
274<span class="menu-text">Resume</span></a>
275  </li>  
276  <li class="nav-item">
277    <a class="nav-link" href="./posts.html"> 
278<span class="menu-text">Posts</span></a>
279  </li>  
280  <li class="nav-item">
281    <a class="nav-link" href="https://dantonnoriega.github.io/SR3TuringQuarto.jl/"> 
282<span class="menu-text">SR3TuringQuarto.jl</span></a>
283  </li>  
284</ul>
285          </div> <!-- /navcollapse -->
286            <div class="quarto-navbar-tools">
287    <a href="https://gitlab.com/dantonnoriega/dantonnoriega.gitlab.io" title="Source" class="quarto-navigation-tool px-1" aria-label="Source"><i class="bi bi-gitlab"></i></a>
288  <a href="" class="quarto-color-scheme-toggle quarto-navigation-tool  px-1" onclick="window.quartoToggleColorScheme(); return false;" title="Toggle dark mode"><i class="bi"></i></a>
289</div>
290      </div> <!-- /container-fluid -->
291    </nav>
292</header>
293<!-- content -->
294<div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-article page-navbar">
295<!-- sidebar -->
296<!-- margin-sidebar -->
297    
298<!-- main -->
299<main class="content" id="quarto-document-content">
300
301
302<header id="title-block-header" class="quarto-title-block default">
303<div class="quarto-title">
304<h1 class="title">Resume</h1>
305</div>
306
307
308
309<div class="quarto-title-meta">
310
311    
312  
313    
314  </div>
315  
316
317
318</header>
319
320
321<div class="d-flex gap-2 mb-3">
322<p><a href="https://gitlab.com/dantonnoriega/dantonnoriega.gitlab.io/-/raw/main/resume/danton-noriega-resume-single_2026.pdf?inline=true" type="button" class="btn btn-primary"><i class="bi bi-file-earmark-pdf-fill"></i> View </a></p>
323<p><a href="https://gitlab.com/dantonnoriega/dantonnoriega.gitlab.io/-/raw/main/resume/danton-noriega-resume-single_2026.pdf?inline=false" role="button" class="btn btn-info"><i class="bi bi-cloud-download-fill"></i> Download </a></p>
324</div>
325<!-- ------------------------------------------------------------------------ -->
326<section id="experience" class="level3">
327<h3 class="anchored" data-anchor-id="experience">EXPERIENCE</h3>
328<section id="microsoft-redmond-wa-current" class="level4">
329<h4 class="anchored" data-anchor-id="microsoft-redmond-wa-current"><strong>Microsoft</strong> | Redmond, WA <em>(Current)</em></h4>
330<ul>
331<li><strong>Principal Data Scientist (CoreAI)</strong> <em>(Nov 2025 - Present)</em>
332<ul>
333<li>Forecast GitHub Copilot LLM traffic to guide third-party capacity planning</li>
334<li>Run what-if scenarios to confirm capacity plans and size new model launches</li>
335<li>Build agents that turn fast-changing repo metadata into maintained dimension tables</li>
336</ul></li>
337</ul>
338</section>
339<section id="apple-cupertino-ca-2017---2025" class="level4">
340<h4 class="anchored" data-anchor-id="apple-cupertino-ca-2017---2025"><strong>Apple</strong> | Cupertino, CA <em>(2017 - 2025)</em></h4>
341<ul>
342<li><strong>Staff Data Scientist (Engineering)</strong> <em>(Oct 2023 - Oct 2025)</em>
343<ul>
344<li>Forecasted demand for Private Cloud Compute, Apple’s GPU infrastru
344cture for remote AI workloads</li>
345<li>Defined platform usage metrics that drove engineering and capacity decisions</li>
346<li>Worked with SREs and platform engineers to plan regional GPU deployments</li>
347<li>Built demand models from device growth, feature adoption, and latency data</li>
348<li>Investigated demand spikes and explained what changed and why</li>
349<li>Estimated workloads for new AI features using seed performance data before launch</li>
350</ul></li>
351<li><strong>Senior Data Science Manager (Business Operations)</strong> <em>(Oct 2021 - Sep 2024)</em>
352<ul>
353<li>Managed 4 data scientists and 5 contractors focused on cloud infrastructure costs</li>
354<li>Found expensive workloads and recommended fixes, cutting costs even as usage grew</li>
355<li>Mentored junior scientists, recruited new hires, and led cross-team projects</li>
356<li>Developed R packages, reviewed code, and advised on statistical methods</li>
357<li>Pushed for better documentation, reproducibility, and technical pragmatism</li>
358</ul></li>
359<li><strong>Data Science Manager (Finance)</strong> <em>(Oct 2020 - Sep 2021)</em>
360<ul>
361<li>Led a data science team analyzing infrastructure costs across finance and engineering</li>
362</ul></li>
363<li><strong>Senior Data Scientist (Finance)</strong> <em>(Oct 2018 - Sep 2020)</em>
364<ul>
365<li>Modeled storage growth to inform leadership infrastructure investment decisions</li>
366<li>Deployed time-series forecasts, dashboards, and reports used across finance and engineering</li>
367<li>Used difference-in-differences to estimate causal impact of service migrations on storage</li>
368<li>Authored 10+ R packages for telemetry and infrastructure data (e.g.&nbsp;<em>graphiter</em>, <em>hubbler</em>)</li>
369<li>Led recruiting, grew team from 1 to 7 data scientists</li>
370</ul></li>
371<li><strong>Data Scientist (Finance)</strong> <em>(Nov 2017 - Sep 2018)</em>
372<ul>
373<li>Modeled iCloud storage growth and its long-term costs</li>
374</ul></li>
375</ul>
376</section>
377<section id="transloc-durham-nc-2016" class="level4">
378<h4 class="anchored" data-anchor-id="transloc-durham-nc-2016"><strong>Transloc</strong> | Durham, NC <em>(2016)</em></h4>
379<ul>
380<li><strong>Data Scientist</strong> <em>(Sept 2016 - Dec 2016)</em>
381<ul>
382<li>Worked part-time, refining metrics available to the product team into understandable, actionable information using R</li>
383</ul></li>
384<li><strong>Data Science Intern</strong> <em>(May 2016 - Aug 2016)</em>
385<ul>
386<li>Developed products and packages that simplify working with and understanding transit data. Learned and experimented with implementing agile development philosophy for data science</li>
387</ul></li>
388</ul>
389</section>
390<section id="duke-university-durham-nc-2015---2017" class="level4">
391<h4 class="anchored" data-anchor-id="duke-university-durham-nc-2015---2017"><strong>Duke University</strong> | Durham, NC <em>(2015 - 2017)</em></h4>
392<ul>
393<li><strong>Research Assistant</strong>, Durham Children’s Data Center <em>(Jan 2017 – May 2017)</em>
394<ul>
395<li>Analyzed Durham County Social Services data for DCDC research projects with Dr.&nbsp;Ken Dodge, Dr.&nbsp;Beth Gifford, and Dr.&nbsp;Anna Gassman-Pines</li>
396</ul></li>
397<li><strong>Research Assistant</strong>, Duke-UNC BECR Center <em>(Jan 2015 – May 2016)</em>
398<ul>
399<li>Investigated food purchasing behavior, food-related health outcomes, and food assistance policy (SNAP/WIC). Uncovered trends to help BECR design behavioral nudges for improving food choices. Helped write papers and proposals, providing analytical results (graphics, tables, etc.)</li>
400</ul></li>
401<li><strong>Teaching Assistant</strong>, Sanford School of Public Policy <em>(Spring 2015)</em>
402<ul>
403<li>Co-taught <a href="https://github.com/dantonnoriega/PubPol590-Sp15"><em>PubPol 590: Applied Big Data Science Energy Data Analytics and Policy</em></a> with Dr.&nbsp;Matthew Harding. Students learned introductory causal inference theory and data analysis with large datasets using Python. Designed homework assignments, projects, and exams. Goal was for students to finish with capacity to do basic energy company consulting</li>
404</ul></li>
405</ul>
406<!-- ------------------------------------------------------------------------ -->
407</section>
408</section>
409<section id="education" class="level3">
410<h3 class="anchored" data-anchor-id="education">EDUCATION</h3>
411<ul>
412<li><strong>Ph.D.&nbsp;Public Policy &amp; Economics</strong> – <em>Aug 2019</em><br>
413<em>Duke University, Sanford School of Public Policy</em> (Durham, NC)</li>
414<li><strong>M.A.&nbsp;Economics</strong> – <em>Feb 2013</em><br>
415<em>Georgetown University</em> (Washington, DC)</li>
416<li><strong>M.S. Applied Statistics</strong> – <em>May 2011</em><br>
417<em>California State University at Long Beach</em> (Long Beach, CA)</li>
418<li><strong>B.S. Applied &amp; Computational Mathematics</strong> – <em>Aug 2006</em><br>
419<em>University of California at Irvine</em> (Irvine, CA) <em>Orange Coast Community College</em> (Costa Mesa, CA)</li>
420</ul>
421<!-- ------------------------------------------------------------------------ -->
422</section>
423<section id="programming" class="level3">
424<h3 class="anchored" data-anchor-id="programming">PROGRAMMING</h3>
425<ul>
426<li><strong>R</strong> – Expert. 13+ years of experience. First love. CRAN package author and contributor.</li>
427<li><strong>Python</strong> – Advanced. 7+ years. Current language. Pipelines, ETL (PySpark), agents. Taught courses with it. ♥ polars.</li>
428<li><strong>SQL</strong> – Expert. 10+ years. Connoisseur of PostgreSQL, Presto/Trino, and HiveQL docs. Never nester.</li>
429<li><strong>bash</strong> – Expert user, proficient developer. 10+ years. Mostly for processing raw text files. CLIs &gt; GUIs.</li>
430<li><strong>LLMs</strong> – Developer and daily user. 3+ years. Built production agents; Claude preferred for coding.</li>
431<li><strong>Others</strong> – dbt, git, docker. Dabbled with Julia, Stan, and Scala. Reluctantly capable analytics engineer.</li>
432</ul>
433<!-- ------------------------------------------------------------------------ -->
434</section>
435<section id="packages" class="level3">
436<h3 class="anchored" data-anchor-id="packages">PACKAGES</h3>
437<ul>
438<li><a href="https://github.com/ropenscilabs/gtfsr/">gtfsr</a> – for mapping and validating GTFS data.
439<ul>
440<li>superseded by <a href="https://cran.r-project.org/web/packages/tidytransit/index.html">tidytransit</a></li>
441</ul></li>
442</ul>
443<!-- ------------------------------------------------------------------------ -->
444</section>
445<section id="dissertation" class="level3">
446<h3 class="anchored" data-anchor-id="dissertation">DISSERTATION</h3>
447<ul>
448<li><em>“Doubled SNAP Dollars and Nudges: An Analysis of Two Pilot Programs Aimed at Increasing the Purchase of Healthy Foods”</em>
449<ul>
450<li>My dissertation used difference-in-difference-in-differences models and randomized controlled trials to measure the economic impacts of food policy interventions using transaction-level data from grocery stores and convenience stores. I analyzed controlled experiments to test hypotheses about consumer behavior and provided evidence-based recommendations to policymakers based on causal inference methods.</li>
451<li>The first pilot program was a financial incentive called “Double Up Food Bucks” that targeted SNAP participants, encouraging fresh produce purchases by effectively doubling purchasing power. The second pilot program consisted of three behavioral nudges designed to increase banana purchases in convenience store environments.</li>
452</ul></li>
453</ul>
454<!-- ------------------------------------------------------------------------ -->
455</section>
456<section id="awards-and-honors" class="level3">
457<h3 class="anchored" data-anchor-id="awards-and-honors">AWARDS AND HONORS</h3>
458<ul>
459<li><strong>Merit Based Fellowship (Economics)</strong>, Georgetown University <em>(2011 – 2015)</em></li>
460<li><strong>2010 STIPDG Outstanding Intern Award</strong>, US Department of Transportation <em>(Summer 2010)</em></li>
461<li><strong>Fletcher Jones Fellowship</strong>, University of California at Irvine (Awarded but chose not to pursue Ph.D.) <em>(Fall 2006)</em></li>
462<li><strong>Dean’s Honor List</strong>, University of California at Irvine <em>(Winter 2005 – Spring 2006)</em></li>
463<li><strong>Early Transfer (Academic Excellence)</strong>, Orange Coast College to UCI <em>(Winter 2005)</em></li>
464<li><strong>President’s List for Academic Excellence</strong>, Orange Coast College <em>(Fall 2003 – Fall 2004)</em></li>
465<li><strong>Community College Scholarship Recipient</strong>, Hispanic Education Endowment Fund (HEEF) <em>(Fall 2004)</em></li>
466</ul>
467<!-- ------------------------------------------------------------------------ -->
468</section>
469<section id="fun-facts" class="level3">
470<h3 class="anchored" data-anchor-id="fun-facts">FUN FACTS</h3>
471<ul>
472<li>Dual citizen of Chile and the US</li>
473<li>Native Spanish-speaker</li>
474<li>Songwriter and lead vocalist in a <a href="https://open.spotify.com/artist/4cM5qMjOXzNK3bjYVbTr7e">SoCal pop punk band</a></li>
475<li>Goaltimate (aging ultimate frisbee) player</li>
476<li>Former AmeriCorps NCCC Team Leader</li>
477<li>Cooks a mean kimchi &amp; onion frittata</li>
478</ul>
479
480
481</section>
482
483</main> <!-- /main -->
484<script id="quarto-html-after-body" type="application/javascript">
485  window.document.addEventListener("DOMContentLoaded", function (event) {
486    // Ensure there is a toggle, if there isn't float one in the top right
487    if (window.document.querySelector('.quarto-color-scheme-toggle') === null) {
488      const a = window.document.createElement('a');
489      a.classList.add('top-right');
490      a.classList.add('quarto-color-scheme-toggle');
491      a.href = "";
492      a.onclick = function() { try { window.quartoToggleColorScheme(); } catch {} return false; };
493      const i = window.document.createElement("i");
494      i.classList.add('bi');
495      a.appendChild(i);
496      window.document.body.appendChild(a);
497    }
498    setColorSchemeToggle(hasAlternateSentinel())
499    const icon = "";
500    const anchorJS = new window.AnchorJS();
501    anchorJS.options = {
502      placement: 'right',
503      icon: icon
504    };
505    anchorJS.add('.anchored');
506    const isCodeAnnotation = (el) => {
507      for (const clz of el.classList) {
508        if (clz.startsWith('code-annotation-')) {                     
509          return true;
510        }
511      }
512      return false;
513    }
514    const onCopySuccess = function(e) {
515      // button target
516      const button = e.trigger;
517      // don't keep focus
518      button.blur();
519      // flash "checked"
520      button.classList.add('code-copy-button-checked');
521      var currentTitle = button.getAttribute("title");
522      button.setAttribute("title", "Copied!");
523      let tooltip;
524      if (window.bootstrap) {
525        button.setAttribute("data-bs-toggle", "tooltip");
526        button.setAttribute("data-bs-placement", "left");
527        button.setAttribute("data-bs-title", "Copied!");
528        tooltip = new bootstrap.Tooltip(button, 
529          { trigger: "manual", 
530            customClass: "code-copy-button-tooltip",
531            offset: [0, -8]});
532        tooltip.show();    
533      }
534      setTimeout(function() {
535        if (tooltip) {
536          tooltip.hide();
537          button.removeAttribute("data-bs-title");
538          button.removeAttribute("data-bs-toggle");
539          button.removeAttribute("data-bs-placement");
540        }
541        button.setAttribute("title", currentTitle);
542        button.classList.remove('code-copy-button-checked');
543      }, 1000);
544      // clear code selection
545      e.clearSelection();
546    }
547    const getTextToCopy = function(trigger) {
548      const outerScaffold = trigger.parentElement.cloneNode(true);
549      const codeEl = outerScaffold.querySelector('code');
550      for (const childEl of codeEl.children) {
551        if (isCodeAnnotation(childEl)) {
552          childEl.remove();
553        }
554      }
555      return codeEl.innerText;
556    }
557    const clipboard = new window.ClipboardJS('.code-copy-button:not([data-in-quarto-modal])', {
558      text: getTextToCopy
559    });
560    clipboard.on('success', onCopySuccess);
561    if (window.document.getElementById('quarto-embedded-source-code-modal')) {
562      const clipboardModal = new window.ClipboardJS('.code-copy-button[data-in-quarto-modal]', {
563        text: getTextToCopy,
564        container: window.document.getElementById('quarto-embedded-source-code-modal')
565      });
566      clipboardModal.on('success', onCopySuccess);
567    }
568      var localhostRegex = new RegExp(/^(?:http|https):\/\/localhost\:?[0-9]*\//);
569      var mailtoRegex = new RegExp(/^mailto:/);
570        var filterRegex = new RegExp("https:\/\/danton\.codes");
571      var isInternal = (href) => {
572          return filterRegex.test(href) || localhostRegex.test(href) || mailtoRegex.test(href);
573      }
574      // Inspect non-navigation links and adorn them if external
575     var links = window.document.querySelectorAll('a[href]:not(.nav-link):not(.navbar-brand):not(.toc-action):not(.sidebar-link):not(.sidebar-item-toggle):not(.pagination-link):not(.no-external):not([aria-hidden]):not(.dropdown-item):not(.quarto-navigation-tool):not(.about-link)');
576      for (var i=0; i<links.length; i++) {
577        const link = links[i];
578        if (!isInternal(link.href)) {
579          // undo the damage that might have been done by quarto-nav.js in the case of
580          // links that we want to consider external
581          if (link.dataset.originalHref !== undefined) {
582            link.href = link.dataset.originalHref;
583          }
584        }
585      }
586    function tippyHover(el, contentFn, onTriggerFn, onUntriggerFn) {
587      const config = {
588        allowHTML: true,
589        maxWidth: 500,
590        delay: 100,
591        arrow: false,
592        appendTo: function(el) {
593            return el.parentElement;
594        },
595        interactive: true,
596        interactiveBorder: 10,
597        theme: 'quarto',
598        placement: 'bottom-start',
599      };
600      if (contentFn) {
601        config.content = contentFn;
602      }
603      if (onTriggerFn) {
604        config.onTrigger = onTriggerFn;
605      }
606      if (onUntriggerFn) {
607        config.onUntrigger = onUntriggerFn;
608      }
609      window.tippy(el, config); 
610    }
611    const noterefs = window.document.querySelectorAll('a[role="doc-noteref"]');
612    for (var i=0; i<noterefs.length; i++) {
613      const ref = noterefs[i];
614      tippyHover(ref, function() {
615        // use id or data attribute instead here
616        let href = ref.getAttribute('data-footnote-href') || ref.getAttribute('href');
617        try { href = new URL(href).hash; } catch {}
618        const id = href.replace(/^#\/?/, "");
619        const note = window.document.getElementById(id);
620        if (note) {
621          return note.innerHTML;
622        } else {
623          return "";
624        }
625      });
626    }
627    const xrefs = window.document.querySelectorAll('a.quarto-xref');
628    const processXRef = (id, note) => {
629      // Strip column container classes
630      const stripColumnClz = (el) => {
631        el.classList.remove("page-full", "page-columns");
632        if (el.children) {
633          for (const child of el.children) {
634            stripColumnClz(child);
635          }
636        }
637      }
638      stripColumnClz(note)
639      if (id === null || id.startsWith('sec-')) {
640        // Special case sections, only their first couple elements
641        const container = document.createElement("div");
642        if (note.children && note.children.length > 2) {
643          container.appendChild(note.children[0].cloneNode(true));
644          for (let i = 1; i < note.children.length; i++) {
645            const child = note.children[i];
646            if (child.tagName === "P" && child.innerText === "") {
647              continue;
648            } else {
649              container.appendChild(child.cloneNode(true));
650              break;
651            }
652          }
653          if (window.Quarto?.typesetMath) {
654            window.Quarto.typesetMath(container);
655          }
656          return container.innerHTML
657        } else {
658          if (window.Quarto?.typesetMath) {
659            window.Quarto.typesetMath(note);
660          }
661          return note.innerHTML;
662        }
663      } else {
664        // Remove any anchor links if they are present
665        const anchorLink = note.querySelector('a.anchorjs-link');
666        if (anchorLink) {
667          anchorLink.remove();
668        }
669        if (window.Quarto?.typesetMath) {
670          window.Quarto.typesetMath(note);
671        }
672        if (note.classList.contains("callout")) {
673          return note.outerHTML;
674        } else {
675          return note.innerHTML;
676        }
677      }
678    }
679    for (var i=0; i<xrefs.length; i++) {
680      const xref = xrefs[i];
681      tippyHover(xref, undefined, function(instance) {
682        instance.disable();
683        let url = xref.getAttribute('href');
684        let hash = undefined; 
685        if (url.startsWith('#')) {
686          hash = url;
687        } else {
688          try { hash = new URL(url).hash; } catch {}
689        }
690        if (hash) {
691          const id = hash.replace(/^#\/?/, "");
692          const note = window.document.getElementById(id);
693          if (note !== null) {
694            try {
695              const html = processXRef(id, note.cloneNode(true));
696              instance.setContent(html);
697            } finally {
698              instance.enable();
699              instance.show();
700            }
701          } else {
702            // See if we can fetch this
703            fetch(url.split('#')[0])
704            .then(res => res.text())
705            .then(html => {
706              const parser = new DOMParser();
707              const htmlDoc = parser.parseFromString(html, "text/html");
708              const note = htmlDoc.getElementById(id);
709              if (note !== null) {
710                const html = processXRef(id, note);
711                instance.setContent(html);
712              } 
713            }).finally(() => {
714              instance.enable();
715              instance.show();
716            });
717          }
718        } else {
719          // See if we can fetch a full url (with no hash to target)
720          // This is a special case and we should probably do some content thinning / targeting
721          fetch(url)
722          .then(res => res.text())
723          .then(html => {
724            const parser = new DOMParser();
725            const htmlDoc = parser.parseFromString(html, "text/html");
726            const note = htmlDoc.querySelector('main.content');
727            if (note !== null) {
728              // This should only happen for chapter cross references
729              // (since there is no id in the URL)
730              // remove the first header
731              if (note.children.length > 0 && note.children[0].tagName === "HEADER") {
732                note.children[0].remove();
733              }
734              const html = processXRef(null, note);
735              instance.setContent(html);
736            } 
737          }).finally(() => {
738            instance.enable();
739            instance.show();
740          });
741        }
742      }, function(instance) {
743      });
744    }
745        let selectedAnnoteEl;
746        const selectorForAnnotation = ( cell, annotation) => {
747          let cellAttr = 'data-code-cell="' + cell + '"';
748          let lineAttr = 'data-code-annotation="' +  annotation + '"';
749          const selector = 'span[' + cellAttr + '][' + lineAttr + ']';
750          return selector;
751        }
752        const selectCodeLines = (annoteEl) => {
753          const doc = window.document;
754          const targetCell = annoteEl.getAttribute("data-target-cell");
755          const targetAnnotation = annoteEl.getAttribute("data-target-annotation");
756          const annoteSpan = window.document.querySelector(selectorForAnnotation(targetCell, targetAnnotation));
757          const lines = annoteSpan.getAttribute("data-code-lines").split(",");
758          const lineIds = lines.map((line) => {
759            return targetCell + "-" + line;
760          })
761          let top = null;
762          let height = null;
763          let parent = null;
764          if (lineIds.length > 0) {
765              //compute the position of the single el (top and bottom and make a div)
766              const el = window.document.getElementById(lineIds[0]);
767              top = el.offsetTop;
768              height = el.offsetHeight;
769              parent = el.parentElement.parentElement;
770            if (lineIds.length > 1) {
771              const lastEl = window.document.getElementById(lineIds[lineIds.length - 1]);
772              const bottom = lastEl.offsetTop + lastEl.offsetHeight;
773              height = bottom - top;
774            }
775            if (top !== null && height !== null && parent !== null) {
776              // cook up a div (if necessary) and position it 
777              let div = window.document.getElementById("code-annotation-line-highlight");
778              if (div === null) {
779                div = window.document.createElement("div");
780                div.setAttribute("id", "code-annotation-line-highlight");
781                div.style.position = 'absolute';
782                parent.appendChild(div);
783              }
784              div.style.top = top - 2 + "px";
785              div.style.height = height + 4 + "px";
786              div.style.left = 0;
787              let gutterDiv = window.document.getElementById("code-annotation-line-highlight-gutter");
788              if (gutterDiv === null) {
789                gutterDiv = window.document.createElement("div");
790                gutterDiv.setAttribute("id", "code-annotation-line-highlight-gutter");
791                gutterDiv.style.position = 'absolute';
792                const codeCell = window.document.getElementById(targetCell);
793                const gutter = codeCell.querySelector('.code-annotation-gutter');
794                gutter.appendChild(gutterDiv);
795              }
796              gutterDiv.style.top = top - 2 + "px";
797              gutterDiv.style.height = height + 4 + "px";
798            }
799            selectedAnnoteEl = annoteEl;
800          }
801        };
802        const unselectCodeLines = () => {
803          const elementsIds = ["code-annotation-line-highlight", "code-annotation-line-highlight-gutter"];
804          elementsIds.forEach((elId) => {
805            const div = window.document.getElementById(elId);
806            if (div) {
807              div.remove();
808            }
809          });
810          selectedAnnoteEl = undefined;
811        };
812          // Handle positioning of the toggle
813      window.addEventListener(
814        "resize",
815        throttle(() => {
816          elRect = undefined;
817          if (selectedAnnoteEl) {
818            selectCodeLines(selectedAnnoteEl);
819          }
820        }, 10)
821      );
822      function throttle(fn, ms) {
823      let throttle = false;
824      let timer;
825        return (...args) => {
826          if(!throttle) { // first call gets through
827              fn.apply(this, args);
828              throttle = true;
829          } else { // all the others get throttled
830              if(timer) clearTimeout(timer); // cancel #2
831              timer = setTimeout(() => {
832                fn.apply(this, args);
833                timer = throttle = false;
834              }, ms);
835          }
836        };
837      }
838        // Attach click handler to the DT
839        const annoteDls = window.document.querySelectorAll('dt[data-target-cell]');
840        for (const annoteDlNode of annoteDls) {
841          annoteDlNode.addEventListener('click', (event) => {
842            const clickedEl = event.target;
843            if (clickedEl !== selectedAnnoteEl) {
844              unselectCodeLines();
845              const activeEl = window.document.querySelector('dt[data-target-cell].code-annotation-active');
846              if (activeEl) {
847                activeEl.classList.remove('code-annotation-active');
848              }
849              selectCodeLines(clickedEl);
850              clickedEl.classList.add('code-annotation-active');
851            } else {
852              // Unselect the line
853              unselectCodeLines();
854              clickedEl.classList.remove('code-annotation-active');
855            }
856          });
857        }
858    const findCites = (el) => {
859      const parentEl = el.parentElement;
860      if (parentEl) {
861        const cites = parentEl.dataset.cites;
862        if (cites) {
863          return {
864            el,
865            cites: cites.split(' ')
866          };
867        } else {
868          return findCites(el.parentElement)
869        }
870      } else {
871        return undefined;
872      }
873    };
874    var bibliorefs = window.document.querySelectorAll('a[role="doc-biblioref"]');
875    for (var i=0; i<bibliorefs.length; i++) {
876      const ref = bibliorefs[i];
877      const citeInfo = findCites(ref);
878      if (citeInfo) {
879        tippyHover(citeInfo.el, function() {
880          var popup = window.document.createElement('div');
881          citeInfo.cites.forEach(function(cite) {
882            var citeDiv = window.document.createElement('div');
883            citeDiv.classList.add('hanging-indent');
884            citeDiv.classList.add('csl-entry');
885            var biblioDiv = window.document.getElementById('ref-' + cite);
886            if (biblioDiv) {
887              citeDiv.innerHTML = biblioDiv.innerHTML;
888            }
889            popup.appendChild(citeDiv);
890          });
891          return popup.innerHTML;
892        });
893      }
894    }
895  });
896  </script>
896
897</div> <!-- /content -->
898<footer class="footer">
899  <div class="nav-footer">
900    <div class="nav-footer-left">
901      &nbsp;
902    </div>   
903    <div class="nav-footer-center">
904<p>☕️ copyright © 2026. made with ❤️ by danton.</p>
905</div>
906    <div class="nav-footer-right">
907      &nbsp;
908    </div>
909  </div>
910</footer>
911
912
913
914
915</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.