{"version":3,"sources":["components/Navbar.js","Home/Home.js","About/About.js","components/GithubCard.js","Projects/Projects.js","Research/Research.js","App.js","serviceWorker.js","index.js"],"names":["Navbar","props","id","className","to","alt","src","style","color","href","target","type","rel","data-target","Home","About","GithubCard","image","title","content","githubLink","appLink","appLinkButton","Projects","Research","class","ScrollToTop","pathname","useLocation","useEffect","window","scrollTo","App","elems","document","querySelectorAll","M","Sidenav","init","exact","path","component","Component","Boolean","location","hostname","match","ReactDOM","render","StrictMode","getElementById","navigator","serviceWorker","ready","then","registration","unregister","catch","error","console","message"],"mappings":"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","file":"static/js/main.7a8fde2c.chunk.js","sourcesContent":["import React from 'react';\r\nimport { NavLink } from 'react-router-dom';\r\n\r\nconst Navbar = (props) => {\r\n return(\r\n
\r\n \r\n menu\r\n
\r\n )\r\n};\r\n\r\nexport default Navbar;","import React from 'react';\r\n\r\nconst Home = (props) => {\r\n return(\r\n
\r\n
\r\n
\r\n
\r\n

Luke Charbonneau

\r\n

Data Engineer | Back-end Web Developer

\r\n

\r\n Data engineer and back‑end web developer with professional experience that includes building data processing pipelines for NASA missions and\r\n leading the development of scientific software products from idea to market. I enjoy writing self‑explanatory code to achieve meaningful technical\r\n goals that improve the bottom line. I offer freelance coding services in my spare time under the Colorado‑registered Castle Scientific LLC.\r\n

\r\n
\r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Home;","import React from 'react';\r\n\r\nconst About = (props) => {\r\n return(\r\n
\r\n

About Luke

\r\n

\r\n I graduated from the University of Colorado in 2016, where I completed both my B.A. and M.S. in Physics. My research concentration in graduate school was in experimental ultrafast optics, which deals with optical pulses which are extremely temporally short (shorter than 10-12 seconds).\r\n

\r\n

\r\n After completing my studies at the University of Colorado, I worked in the optics industry as the Head of Product Development at Crunch Technologies in Boulder, Colorado. designing and building software for use by both optics production facilities and research institutions. Since deciding to focus on software, I have been able to leverage my graduate studies experiences as an optical hardware developer and researcher to design and develop user-friendly tools utilized by research institutions across the globe. \r\n

\r\n

\r\n I am currently helping to build and maintain data processing pipelines for NASA missions at the Laboratory for Atmospheric and Space Physics (LASP). The primary mission that I work on is known as the Total and spectral Solar Irradiance Sensor (TSIS-1), which consists a pair of instruments mounted on the International Space Station that perform daily measurements of the Sun's activity. These measurements are then processed and corrected by engineers at LASP (including myself) into scientific data products that provide climate researchers with critical insights into the Sun's influence on Earth's various systems. Additionally, I offer freelance coding services in my spare time under the Colorado-registered Castle Scientific LLC. \r\n

\r\n

\r\n My hobbies outside of coding include hiking, skiing, backpacking, playing piano and reading about history - in particular, my favorite topics right now are the late Roman Republic and the Cold War.\r\n

\r\n
\r\n );\r\n};\r\n\r\nexport default About;\r\n","import React from 'react';\r\n\r\nconst GithubCard = ({image, title, content, githubLink, appLink}) => {\r\n let appLinkButton = null;\r\n if (appLink) {\r\n appLinkButton = link\r\n }\r\n return(\r\n
\r\n
\r\n \r\n {title}\r\n code\r\n {appLinkButton}\r\n
\r\n
\r\n

{content}

\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default GithubCard;","import React from 'react';\r\nimport GithubCard from '../components/GithubCard';\r\n\r\nconst Projects = (props) => {\r\n return(\r\n
\r\n

Personal Projects

\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n );\r\n};\r\n\r\nexport default Projects;","import React from 'react';\r\n\r\nconst Research = (props) => {\r\n return(\r\n
\r\n

My Research at CU

\r\n

\r\n In graduate school, I performed research in experimental ultrafast optics, which essentially deals with optical pulses which are extremely temporally short, i.e. ultrashort pulses (less than 10-12 seconds). I conducted my research at the University of Colorado under the direction of Prof. Thomas Schibli.\r\n

\r\n

Why is ultrafast optics important?

\r\n
\r\n

\r\n Note: I have included sections from my master's thesis - available for download at the bottom of this page - that pertain to these concepts in parentheses, in case you would like more details about a particular topic.\r\n

\r\n
\r\n

\r\n Ultrashort pulses are often generated by lasers thorugh a process known as \"mode locking\" (2.2.1). Ultrashort pulses are the shortest man-made events ever created, therefore, they are useful for a wide range of applications which include frequency metrology, specturally-pure microwave generation and spectroscopy (1.1). This is because, in order to make a time-measurement of an event, you need a \"clock\" which has a precision shorter than the event to be measured. Here's a hypothetical scenario to explain this concept: imagine taking a roadtrip from Denver, CO to Vancouver, BC. According to Google Maps, this trip takes 21 hours and 57 minutues (assuming the Canadian border guards know you're an important scientist, in which case they, of course, just wave you through the border checkpoint in no-time). A typical car's digital clock has one minute of percision, so when you time the trip with your car's clock, you should obtain a time measurement of the trip that is close to 21 hours and 57 minutes. Great! Our hypothetical car's clock is plenty percise enough to accurately measure the length of this drive.\r\n

\r\n

\r\n However, now imagine that you are bored on this trip while driving across Southern Idaho and decide to use the car's clock to measure the time to travel between the white dashed lines in the center of the highway. You are traveling at Southern Idaho driving speed (~70 mph, depending on your tolerence for speeding tickets) and the lines are ~30 feet apart, so the time it takes to get from one line to the next is: 30 ft ⁄ 70 mph = ~.29 seconds. This is far, far less than the one minute percision of your car's clock, so the measurement you get is either 0 minutes or 1 minute (if the minute happens to tick within that .29 seconds). Obviously, both of these answers are very wrong, which demostrates that in order to accurately measure this event, we would need a timing device with a much greater percision than one minute (like maybe an atomic clock). This concept is the crux of why ultrashort pulses are so useful for measurements of events which occur on very short time scales, such as atomic transitions (1.1.3).\r\n

\r\n

Frequency Combs

\r\n

\r\n Another implementation of ultrashort pulses which is useful for a wide-range of applications is the generation of \"frequency combs\". Frequency combs get their name from the fact that they look like a hair comb in the frequency domain, where each tooth of the comb represents a different frequency (represented by different colors in the figure below). If the frequency comb is properly stabilized, the comb can be used to measure arbitrary frequencies of light (1.1).\r\n

\r\n
\r\n \"Frequency\r\n
\r\n

A frequency comb is essentially the frequency-domain picture of an ultrashort pulse. FT stands for \"Fourier Transform\", which is the mathematical operation which takes the description of the pulse from the time domain (left) to the frequency domain (right).\"

\r\n
\r\n
\r\n

Frequency combs can also be used to improve the precision of metrologic and spectroscopic instruments. For example, frequency combs can be used to stabilize astronomical spectrometers - potentially allowing astronomers in the near future to precisely determine the red shift of far-away celestial objects. These measurements would allow scientists to either vindicate or repudiate the Theory of Dark Energy. An example of such a setup is shown below.

\r\n
\r\n \"Astronomical\r\n
\r\n

Astronomical spectrometer calibration setup. From the Nature Photonics article \"Combs for Dark Energy\" by T.R. Schibli.

\r\n
\r\n
\r\n

My contribution

\r\n

My thesis work revolved around creating a method to stabilize the repetition rate of these light pulses, fr, which is the inverse of the period between the emitted pulses. There are several methods (3.1.3) which existed prior to this, but in my method (3.2), I sought to reduce the complexity of these established techniques. The method presented in my thesis was ultimately successful in reducing the timing jitter (which quantifies the degree of fluctuation, or noise, in the repetition rate) by at least four-fold from 100 Hz to 10 MHz.

\r\n \r\n

More Resources

\r\n \r\n
\r\n );\r\n};\r\nexport default Research;\r\n","import React, { Component, useEffect } from 'react';\nimport { BrowserRouter, Switch, Route, useLocation } from 'react-router-dom';\nimport Navbar from './components/Navbar';\nimport Home from './Home/Home';\nimport About from './About/About';\nimport Projects from './Projects/Projects';\nimport Research from './Research/Research';\nimport M from 'materialize-css';\nimport './App.css';\n\nfunction ScrollToTop() {\n const { pathname } = useLocation();\n\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n return null;\n}\n\nclass App extends Component {\n componentDidMount() {\n var elems = document.querySelectorAll('.sidenav');\n var instances = M.Sidenav.init(elems, {});\n }\n render() {\n return (\n \n \n
\n \n \n \n \n \n \n \n
\n
\n );\n }\n}\n\nexport default App;","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.0/8 are considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit https://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See https://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl, {\n headers: { 'Service-Worker': 'script' },\n })\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready\n .then(registration => {\n registration.unregister();\n })\n .catch(error => {\n console.error(error.message);\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(\n \n \n ,\n document.getElementById('root')\n);\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: https://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}