329 lines
31 KiB
HTML
Executable file
329 lines
31 KiB
HTML
Executable file
<!DOCTYPE html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="UTF-8" />
|
||
<link rel="stylesheet" href="style.css" />
|
||
<!--TODO: Optimize loading?-->
|
||
<!--<link href="https://fonts.cdnfonts.com/css/jetbrains-mono" rel="stylesheet" />-->
|
||
<title>Michael Bradley</title>
|
||
<meta lang="EN" />
|
||
|
||
<meta name="color-scheme" content="dark light" />
|
||
<meta name="theme-color" content="#000000" />
|
||
|
||
<!--TODO: Find better icon than GH avatar-->
|
||
<!--<link rel="icon" href="https://avatars.githubusercontent.com/u/68788583?s=48&v=4" />-->
|
||
<meta name="keywords" content="Michael Bradley,personal website,student,co-op,coop,cooperative education,programmer,coder,software developer" />
|
||
<meta name="description" content="Michael Bradley's personal website" />
|
||
<meta name="subject" content="Self-advertisement" />
|
||
<meta name="robots" content="index,follow" />
|
||
<meta name="summary" content="Michael Bradley is a CS student looking for a full-time job starting in February" />
|
||
<meta name="url" content="https://MichaelMBradley.github.io" />
|
||
|
||
<meta property="og:type" content="website" />
|
||
<meta property="og:country-name" content="CA" />
|
||
<meta property="og:region" content="ON" />
|
||
<meta property="og:local" content="en_CA" />
|
||
<meta property="og:local:alternate" content="en_US" />
|
||
|
||
<meta property="og:url" content="https://MichaelMBradley.github.io" />
|
||
<meta property="og:site" content="Michael Bradley" />
|
||
<meta property="og:title" content="Michael's personal website" />
|
||
<meta property="og:description" content="A summary of my education, skills, and some projects I've worked on." />
|
||
<meta property="og:image" content="https://MichaelMBradley.github.io/assets/thumb.png" />
|
||
<meta property="og:image:secure_url" content="https://MichaelMBradley.github.io/assets/thumb.png" />
|
||
<meta property="og:image:alt" content="Michael Bradley is a CS student looking for a full-time job starting in February" />
|
||
<meta property="og:image:type" content="image/png" />
|
||
<meta property="og:image:width" content="4203" />
|
||
<meta property="og:image:height" content="2253" />
|
||
|
||
<meta name="twitter:url" content="https://MichaelMBradley.github.io" />
|
||
<meta name="twitter:title" content="Michael Bradley" />
|
||
<meta name="twitter:description" content="My personal website." />
|
||
<meta name="twitter:image" content="https://MichaelMBradley.github.io/assets/thumb.png" />
|
||
<meta name="twitter:card" content="summary_large_image" />
|
||
</head>
|
||
<body>
|
||
<input id="dark-mode-toggle" type="checkbox" aria-label="Toggle dark mode" />
|
||
<label for="dark-mode-toggle" id="dark-mode-toggle-label" title="Toggle dark mode">
|
||
<svg viewBox="0 0 544 544" xmlns="http://www.w3.org/2000/svg">
|
||
<defs>
|
||
<linearGradient id="dark-mode-toggle-sky" x1="0" x2="0" y1="0.4" y2="0.6">
|
||
<stop offset="0%" stop-color="deepskyblue" />
|
||
<stop offset="100%" stop-color="black" />
|
||
</linearGradient>
|
||
</defs>
|
||
<!-- From: https://www.svgrepo.com/svg/484307/moon -->
|
||
<rect class="dark-mode-svg" height="1280" width="544" fill="url(#dark-mode-toggle-sky)" x="-16px" y="-16px"/>
|
||
<g class="dark-mode-svg">
|
||
<path transform="translate(0, 768)" style="fill: rgb(244, 244, 245); --darkreader-inline-fill: #e1dfdb;" d="M426.655,444.491c-85.064,74.278-206.9,83.839-299.319,29.581 c-22.308-13.074-42.982-29.907-60.958-50.499C56,411.723,46.93,399.058,39.085,385.82C15.143,345.045,3.539,298.958,3.784,252.953 c0.49-71.582,29.989-142.754,87.026-192.6C138.776,18.433,197.855-1.096,256.69,0.047c45.597,0.817,91.03,13.973,131.069,38.733 c22.063,13.564,42.41,30.724,60.305,51.153c9.724,11.114,18.386,22.799,25.822,34.974 C537.623,227.785,521.117,361.878,426.655,444.491z" />
|
||
<path transform="translate(0, 768)" style="fill: rgb(237, 237, 236); --darkreader-inline-fill: #dcd9d5;" d="M107.7,89.244c99.915-87.35,248.817-74.175,333.815,23.051 c84.998,97.226,75.388,243.379-24.528,330.729c-99.915,87.35-251.727,82.317-336.725-14.908S7.784,176.594,107.7,89.244z" />
|
||
<path transform="translate(0, 768)" style="fill: rgb(216, 216, 216); --darkreader-inline-fill: #cfcbc5;" d="M244.029,141.49c-17.92,37.27-63.032,51.341-100.302,33.421 c-37.27-17.92-53.234-61.357-35.315-98.627c17.92-37.27,62.835-54.046,100.105-36.126 C245.787,58.078,261.948,104.22,244.029,141.49z" />
|
||
<path transform="translate(0, 768)" style="opacity: 0.06; fill: rgb(4, 0, 0); --darkreader-inline-fill: #e7e5e1;" d="M128.086,97.65c17.92-37.27,62.835-54.046,100.105-36.126 c4.127,1.984,7.994,4.316,11.586,6.942c-7.335-11.909-17.95-21.909-31.26-28.308c-37.27-17.92-82.185-1.144-100.105,36.126 c-15.805,32.872-5.247,70.538,23.036,91.265C118.963,147.091,116.789,121.146,128.086,97.65z" />
|
||
<path transform="translate(0, 768)" style="fill: rgb(216, 216, 216); --darkreader-inline-fill: #cfcbc5;" d="M217.121,218.367c-1.17-5.733,2.71-11.178,8.442-12.348c5.733-1.17,11.248,2.359,12.418,8.091 c1.17,5.733-2.456,11.466-8.189,12.635C224.06,227.916,218.291,224.099,217.121,218.367z" />
|
||
<path transform="translate(0, 768)" style="opacity: 0.5; fill: rgb(255, 255, 255); --darkreader-inline-fill: #e8e6e3;" d="M363.151,96.945c-1.17-5.733,2.71-11.178,8.442-12.348s11.248,2.359,12.418,8.091 c1.17,5.733-2.456,11.466-8.189,12.636C370.089,106.493,364.32,102.677,363.151,96.945z" />
|
||
<path transform="translate(0, 768)" style="fill: rgb(216, 216, 216); --darkreader-inline-fill: #cfcbc5;" d="M282.752,398.389c8.691-7.598,21.813-6.256,29.411,2.435c7.598,8.691,6.926,21.591-1.765,29.189 c-8.691,7.598-22.059,6.972-29.657-1.719C273.143,419.603,274.061,405.987,282.752,398.389z" />
|
||
<path transform="translate(0, 768)" style="opacity: 0.5; fill: rgb(255, 255, 255); --darkreader-inline-fill: #e8e6e3;" d="M58.327,220.961c-1.17-5.733,2.71-11.178,8.442-12.348 c5.733-1.17,11.248,2.359,12.418,8.091s-2.456,11.466-8.189,12.636C65.265,230.51,59.496,226.694,58.327,220.961z" />
|
||
<path transform="translate(0, 768)" style="fill: rgb(216, 216, 216); --darkreader-inline-fill: #cfcbc5;" d="M468.947,281.701c-3.725,36.649-37.256,62.098-73.905,58.373 c-36.649-3.725-63.177-35.279-59.452-71.928c3.725-36.649,36.272-64.305,72.921-60.58 C445.16,211.292,472.673,245.052,468.947,281.701z" />
|
||
<path transform="translate(0, 768)" style="fill: rgb(216, 216, 216); --darkreader-inline-fill: #cfcbc5;" d="M173.239,331.136c14.631,25.328,4.867,57.294-20.461,71.925 c-25.328,14.631-57.07,6.642-71.701-18.686c-14.631-25.328-6.526-58.257,18.802-72.888 C125.206,296.855,158.608,305.808,173.239,331.136z" />
|
||
<path transform="translate(0, 768)" style="opacity: 0.06; fill: rgb(4, 0, 0); --darkreader-inline-fill: #e7e5e1;" d="M112.818,324.329c18.464-10.666,41.21-8.787,57.855,2.82 c-15.693-22.238-46.847-29.497-70.794-15.663c-25.328,14.631-33.433,47.561-18.802,72.888c4.04,6.993,9.388,12.657,15.541,16.895 c-0.915-1.299-1.788-2.644-2.602-4.052C79.385,371.89,87.49,338.96,112.818,324.329z" />
|
||
<path transform="translate(0, 768)" style="opacity: 0.06; fill: rgb(4, 0, 0); --darkreader-inline-fill: #e7e5e1;" d="M349.701,282.093c3.725-36.649,36.272-64.305,72.921-60.579 c12.217,1.242,23.415,5.824,32.783,12.735c-11.007-14.534-27.694-24.73-46.893-26.682c-36.649-3.725-69.196,23.93-72.921,60.579 c-2.465,24.247,8.316,46.261,26.506,59.464C352.777,315.06,347.969,299.128,349.701,282.093z" />
|
||
<path transform="translate(0, 768)" style="opacity: 0.1; fill: rgb(4, 0, 0); --darkreader-inline-fill: #e7e5e1;" d="M254.81,381.707c-105.358,0-198.419-52.064-254.72-131.654 c-2.703,99.72,55.552,194.334,153.936,236.742c128.773,55.507,279.648,1.534,335.155-127.239 c15.267-35.419,21.657-72.747,20.288-109.416C453.162,329.68,360.13,381.707,254.81,381.707z" />
|
||
</g>
|
||
<!-- From: https://www.svgrepo.com/svg/484356/sun -->
|
||
<g class="dark-mode-svg">
|
||
<path style="fill: rgb(191, 182, 30); --darkreader-inline-fill: #e3db4d;" d="M258.373,448.122c-11.783,0-21.337,1.395-21.337,18.136c0,8.131,9.553,45.742,21.337,45.742 c11.784,0,21.336-37.611,21.336-45.742C279.709,449.518,270.156,448.122,258.373,448.122z" />
|
||
<path style="fill: rgb(191, 182, 30); --darkreader-inline-fill: #e3db4d;" d="M352.653,422.86c-10.205,5.891-17.78,11.876-9.41,26.374c4.065,7.041,31.144,34.837,41.349,28.945 c10.205-5.892-0.328-43.241-4.393-50.282C371.829,413.4,362.858,416.968,352.653,422.86z" />
|
||
<path style="fill: rgb(191, 182, 30); --darkreader-inline-fill: #e3db4d;" d="M448.046,344.432c-14.498-8.37-20.483-0.795-26.375,9.41c-5.892,10.205-9.46,19.176,5.038,27.546 c7.041,4.065,44.39,14.598,50.282,4.393C482.883,375.576,455.087,348.497,448.046,344.432z" />
|
||
<path style="fill: rgb(191, 182, 30); --darkreader-inline-fill: #e3db4d;" d="M465.07,238.225c-16.741,0-18.136,9.553-18.136,21.337c0,11.784,1.396,21.336,18.136,21.336 c8.13,0,45.742-9.553,45.742-21.336C510.812,247.777,473.2,238.225,465.07,238.225z" />
|
||
<path style="fill: rgb(191, 182, 30); --darkreader-inline-fill: #e3db4d;" d="M426.71,137.735c-14.498,8.37-10.93,17.341-5.038,27.546c5.892,10.204,11.877,17.78,26.375,9.41 c7.041-4.065,34.837-31.144,28.945-41.349C471.099,123.137,433.75,133.67,426.71,137.735z" />
|
||
<path style="fill: rgb(191, 182, 30); --darkreader-inline-fill: #e3db4d;" d="M164.092,422.86c-10.205-5.892-19.176-9.46-27.546,5.038c-4.065,7.041-14.598,44.39-4.393,50.282 c10.205,5.892,37.283-21.904,41.349-28.945C181.872,434.737,174.297,428.752,164.092,422.86z" />
|
||
<path style="fill: rgb(191, 182, 30); --darkreader-inline-fill: #e3db4d;" d="M424.226,259.561c0-45.799-18.564-87.263-48.577-117.276L141.097,376.837 c30.013,30.013,71.477,48.578,117.276,48.578C349.971,425.415,424.226,351.159,424.226,259.561z" />
|
||
<path style="fill: rgb(198, 186, 86); --darkreader-inline-fill: #cabf63;" d="M164.11,96.239c-10.143,5.855-19.05,9.401-27.297-4.618c-0.082-0.083-0.165-0.247-0.248-0.412 c-4.123-7.009-14.596-44.367-4.453-50.305c7.669-4.454,25.07,10.308,34.719,20.781c3.298,3.464,5.69,6.433,6.68,8.164 C181.84,84.364,174.336,90.384,164.11,96.239z" />
|
||
<path style="fill: rgb(198, 186, 86); --darkreader-inline-fill: #cabf63;" d="M279.729,52.861v0.577c-0.248,16.164-9.732,17.566-21.359,17.566 c-9.319,0-17.236-0.907-20.122-9.483c-0.824-2.227-1.237-5.113-1.237-8.66c0-5.03,3.629-21.276,9.154-32.987 c3.546-7.257,7.752-12.782,12.205-12.782c1.319,0,2.639,0.495,3.876,1.402C272.225,15.174,279.729,45.604,279.729,52.861z" />
|
||
<path style="fill: rgb(198, 186, 86); --darkreader-inline-fill: #cabf63;" d="M95.085,165.264c-5.938,10.226-11.875,17.813-26.39,9.401 c-3.958-2.227-14.432-11.793-21.854-21.524c-0.082-0.083-0.165-0.165-0.165-0.248c-5.69-7.504-9.484-15.091-6.928-19.545 c5.938-10.226,43.213,0.33,50.305,4.371c1.237,0.742,2.391,1.484,3.381,2.226C103.909,147.699,100.445,155.945,95.085,165.264z" />
|
||
<path style="fill: rgb(198, 186, 86); --darkreader-inline-fill: #cabf63;" d="M69.85,259.524c0,11.546-1.32,21.03-17.236,21.359h-0.907c-7.834,0-43.13-8.907-45.605-20.122 c-0.082,0-0.082,0-0.082,0c0-0.412-0.083-0.824-0.083-1.237c0-4.536,5.69-8.824,13.112-12.205 c11.711-5.525,27.709-9.071,32.657-9.071c4.701,0,8.164,0.742,10.721,2.062C69.108,243.773,69.85,251.113,69.85,259.524z" />
|
||
<path style="fill: rgb(198, 186, 86); --darkreader-inline-fill: #cabf63;" d="M68.7,344.432c-7.041,4.065-34.837,31.144-28.945,41.349c5.892,10.205,43.241-0.328,50.281-4.393 c14.498-8.37,10.93-17.341,5.038-27.546C89.183,343.637,83.197,336.062,68.7,344.432z" />
|
||
<path style="fill: rgb(198, 186, 86); --darkreader-inline-fill: #cabf63;" d="M352.653,96.263c10.205,5.892,19.176,9.46,27.546-5.038c4.065-7.041,14.598-44.39,4.393-50.282 c-10.205-5.892-37.284,21.904-41.349,28.945C334.873,84.386,342.448,90.371,352.653,96.263z" />
|
||
<path style="fill: rgb(198, 186, 86); --darkreader-inline-fill: #cabf63;" d="M258.373,93.708c-91.598,0-165.853,74.255-165.853,165.853 c0,45.799,18.563,87.262,48.577,117.276l234.552-234.552C345.635,112.271,304.172,93.708,258.373,93.708z" />
|
||
<path style="fill: rgb(239, 231, 72); --darkreader-inline-fill: #f0e850;" d="M252.408,440.964c-11.783,0-21.337,1.395-21.337,18.136c0,8.131,9.553,45.742,21.337,45.742 s21.336-37.611,21.336-45.742C273.744,442.36,264.191,440.964,252.408,440.964z" />
|
||
<path style="fill: rgb(239, 231, 72); --darkreader-inline-fill: #f0e850;" d="M346.688,415.702c-10.205,5.892-17.78,11.877-9.41,26.375c4.065,7.041,31.144,34.837,41.349,28.945 c10.205-5.892-0.328-43.241-4.393-50.282C365.864,406.242,356.893,409.81,346.688,415.702z" />
|
||
<path style="fill: rgb(239, 231, 72); --darkreader-inline-fill: #f0e850;" d="M442.081,337.274c-14.498-8.37-20.483-0.795-26.375,9.41c-5.892,10.205-9.46,19.176,5.038,27.546 c7.041,4.065,44.39,14.598,50.282,4.393C476.918,368.418,449.122,341.339,442.081,337.274z" />
|
||
<path style="fill: rgb(239, 231, 72); --darkreader-inline-fill: #f0e850;" d="M459.105,231.066c-16.741,0-18.136,9.553-18.136,21.337c0,11.784,1.395,21.336,18.136,21.336 c8.13,0,45.742-9.553,45.742-21.336C504.846,240.619,467.235,231.066,459.105,231.066z" />
|
||
<path style="fill: rgb(239, 231, 72); --darkreader-inline-fill: #f0e850;" d="M420.744,130.577c-14.497,8.37-10.93,17.341-5.038,27.546c5.892,10.205,11.877,17.78,26.375,9.41 c7.041-4.065,34.837-31.144,28.945-41.349C465.134,115.979,427.785,126.511,420.744,130.577z" />
|
||
<path style="fill: rgb(239, 231, 72); --darkreader-inline-fill: #f0e850;" d="M158.127,415.702c-10.205-5.892-19.176-9.46-27.546,5.038c-4.065,7.041-14.598,44.39-4.392,50.282 c10.205,5.892,37.283-21.904,41.349-28.945C175.907,427.578,168.332,421.594,158.127,415.702z" />
|
||
<path style="fill: rgb(239, 231, 72); --darkreader-inline-fill: #f0e850;" d="M418.261,252.403c0-45.799-18.564-87.263-48.577-117.276L135.132,369.679 c30.014,30.013,71.477,48.578,117.276,48.578C344.006,418.257,418.261,344.001,418.261,252.403z" />
|
||
<path style="fill: rgb(250, 242, 175); --darkreader-inline-fill: #f8ee97;" d="M158.09,89.065c-7.67,4.453-14.679,7.587-21.277,2.557c-2.144-1.567-4.206-4.041-6.268-7.587 c-4.041-7.01-14.597-44.367-4.371-50.223c9.814-5.69,34.967,19.545,40.657,27.874c0.33,0.412,0.577,0.742,0.742,1.072 C175.903,77.189,168.316,83.209,158.09,89.065z" />
|
||
<path style="fill: rgb(250, 242, 175); --darkreader-inline-fill: #f8ee97;" d="M273.709,45.687c0,0.577,0,1.155-0.083,1.65c-0.577,15.174-9.814,16.493-21.194,16.493 c-4.288,0-8.247-0.165-11.628-1.237c-0.907-0.247-1.732-0.659-2.556-1.072c-2.722-1.402-4.866-3.711-6.02-7.422 c-0.083-0.083,0-0.083,0-0.083c-0.742-2.227-1.155-5.03-1.155-8.329c0-4.865,3.464-20.452,8.824-32.08 c3.216-7.01,7.175-12.617,11.381-13.442C251.69,0.083,252.02,0,252.432,0c3.547,0,6.927,3.463,9.814,8.494 c0.99,1.649,1.897,3.464,2.804,5.443C270.328,25.482,273.709,40.904,273.709,45.687z" />
|
||
<path style="fill: rgb(250, 242, 175); --darkreader-inline-fill: #f8ee97;" d="M89.147,158.09c-5.937,10.226-11.875,17.813-26.39,9.484c-2.969-1.732-9.648-7.505-15.916-14.432 c-0.082-0.083-0.165-0.165-0.165-0.248c-8.577-9.401-16.246-20.864-12.865-26.719c5.855-10.226,43.213,0.33,50.222,4.371 c5.195,3.051,8.164,6.185,9.401,9.401C95.662,145.637,92.858,151.658,89.147,158.09z" />
|
||
<path style="fill: rgb(250, 242, 175); --darkreader-inline-fill: #f8ee97;" d="M63.83,252.432c0,11.793-1.402,21.277-18.142,21.277H45.44c-5.03-0.083-20.122-3.382-31.503-8.577 c-2.886-1.402-5.608-2.804-7.835-4.371c-0.082,0-0.082,0-0.082,0C2.309,258.205,0,255.401,0,252.432c0-0.33,0-0.742,0.165-1.072 c0.742-4.041,5.69-7.669,12.04-10.886c11.793-5.608,28.451-9.401,33.482-9.401c1.897,0,3.629,0.165,5.196,0.412 c6.762,0.99,9.978,4.288,11.545,8.824c0.412,1.072,0.66,2.309,0.825,3.546C63.748,246.412,63.83,249.381,63.83,252.432z" />
|
||
<path style="fill: rgb(250, 242, 175); --darkreader-inline-fill: #f8ee97;" d="M84.034,374.237c-5.196,3.051-27.379,9.649-40.739,8.576c-1.567-0.083-2.969-0.33-4.288-0.742 c-2.392-0.66-4.206-1.815-5.195-3.464c-0.908-1.567-1.072-3.629-0.577-5.855c2.804-12.206,23.503-32.08,29.523-35.461 c2.969-1.732,5.608-2.804,7.917-3.216c7.917-1.732,12.453,2.969,16.659,9.566c0.577,0.99,1.237,1.979,1.814,3.051 c2.062,3.711,3.959,7.175,4.701,10.556C95.25,363.268,93.353,368.876,84.034,374.237z" />
|
||
<path style="fill: rgb(250, 242, 175); --darkreader-inline-fill: #f8ee97;" d="M346.688,89.104c10.205,5.892,19.176,9.46,27.546-5.038c4.065-7.041,14.598-44.39,4.393-50.282 c-10.205-5.892-37.284,21.904-41.349,28.945C328.908,77.228,336.483,83.213,346.688,89.104z" />
|
||
<path style="fill: rgb(250, 242, 175); --darkreader-inline-fill: #f8ee97;" d="M369.701,135.164l-0.743,0.742l-3.381,3.381L135.164,369.701 c-2.474-2.474-4.783-4.948-7.092-7.587c-6.185-7.009-11.793-14.514-16.741-22.513c-15.668-25.318-24.74-55.171-24.74-87.168 c0-91.621,74.221-165.842,165.842-165.842c29.936,0,58.057,7.917,82.385,21.936C347.6,115.784,359.31,124.773,369.701,135.164z" />
|
||
</g>
|
||
</svg>
|
||
</label>
|
||
<div id="fetch">
|
||
<!--TODO: Automate screenshot of this div as preview photo?-->
|
||
<div id="michael-photo-container">
|
||
<img src="assets/MichaelBradley.jpg" alt="A picture of me in a suit smiling" id="michael-photo">
|
||
</div>
|
||
<div id="basic-info">
|
||
<div class="invisible-div">
|
||
<p><span class="text-highlight">website</span>@<span class="text-highlight">MichaelBradley</span></p>
|
||
<p>----------------------</p>
|
||
<p><span class="text-highlight">Program</span>: Bachelor of Computer Science</p>
|
||
<p><span class="text-highlight">Stream</span>: AI & Machine Learning</p>
|
||
<p><span class="text-highlight">University</span>: Carleton (Ottawa)</p>
|
||
<p><span class="text-highlight">Major CGPA</span>: 11.68/12 (A+)</p>
|
||
<p><span class="text-highlight">Languages</span>: Python, TypeScript, Java, C,</p>
|
||
<p class="whitespace"> C++, Haskell, SQL, Rust, Bash</p>
|
||
<p><span class="text-highlight">Applying for</span>: Co-op term May-August 2024</p>
|
||
</div>
|
||
<p><br /></p>
|
||
<p class="blocks">
|
||
<span style="color: var(--color0)">███</span><span style="color: var(--color1)">███</span><span style="color: var(--color2)">███</span><span style="color: var(--color3)">███</span><span style="color: var(--color4)">███</span><span style="color: var(--color5)">███</span><span style="color: var(--color6)">███</span><span style="color: var(--color7)">███</span>
|
||
</p>
|
||
<p class="blocks">
|
||
<span style="color: var(--color8)">███</span><span style="color: var(--color9)">███</span><span style="color: var(--color10)">███</span><span style="color: var(--color11)">███</span><span style="color: var(--color12)">███</span><span style="color: var(--color13)">███</span><span style="color: var(--color14)">███</span><span style="color: var(--color15)">███</span>
|
||
</p>
|
||
</div>
|
||
</div>
|
||
<div class="links">
|
||
<a href="https://github.com/MichaelMBradley" title="GitHub account">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512" width="49.6" height="51.2" aria-description="GitHub icon">
|
||
<!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
|
||
<path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/>
|
||
</svg>
|
||
</a>
|
||
<a href="https://www.linkedin.com/in/michaelmbradley/" title="LinkedIn account">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" width="44.8" height="51.2" aria-description="LinkedIn icon">
|
||
<!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
|
||
<path d="M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z"/>
|
||
</svg>
|
||
</a>
|
||
<a rel="me" href="https://mstdn.ca/@michaelbradley" title="Mastodon account">
|
||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" width="44.8" height="51.2" aria-description="Mastodon icon">
|
||
<!--!Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.-->
|
||
<path d="M433 179.1c0-97.2-63.7-125.7-63.7-125.7-62.5-28.7-228.6-28.4-290.5 0 0 0-63.7 28.5-63.7 125.7 0 115.7-6.6 259.4 105.6 289.1 40.5 10.7 75.3 13 103.3 11.4 50.8-2.8 79.3-18.1 79.3-18.1l-1.7-36.9s-36.3 11.4-77.1 10.1c-40.4-1.4-83-4.4-89.6-54a102.5 102.5 0 0 1 -.9-13.9c85.6 20.9 158.7 9.1 178.8 6.7 56.1-6.7 105-41.3 111.2-72.9 9.8-49.8 9-121.5 9-121.5zm-75.1 125.2h-46.6v-114.2c0-49.7-64-51.6-64 6.9v62.5h-46.3V197c0-58.5-64-56.6-64-6.9v114.2H90.2c0-122.1-5.2-147.9 18.4-175 25.9-28.9 79.8-30.8 103.8 6.1l11.6 19.5 11.6-19.5c24.1-37.1 78.1-34.8 103.8-6.1 23.7 27.3 18.4 53 18.4 175z"/>
|
||
</svg>
|
||
</a>
|
||
</div>
|
||
<div class="tab-container">
|
||
<a id="projects"></a>
|
||
<a href="#projects">Projects</a>
|
||
<div class="info-section">
|
||
<div class="info-group">
|
||
<h2>dotfiles</h2>
|
||
<p>
|
||
I use a highly customized Arch Linux installation on my desktop and laptop, so I created the repository to help sync the configuration files.
|
||
</p>
|
||
<a href="https://github.com/MichaelMBradley/dotfiles">
|
||
<img src="https://raw.githubusercontent.com/MichaelMBradley/dotfiles/master/laptop.png" alt="Screenshot of several windows open in an Arch Linux installation" />
|
||
</a>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Holiday Cards</h2>
|
||
<p>
|
||
Created a GitHub Pages site to securely deliver private messages to friends and family.
|
||
When given a link with a decryption key, the appropriate message would be unencrypted, run through a custom minimal Markdown parser, and displayed to the recipient.
|
||
Along with the message, a deterministically random "snowflake" graphic would be generated with the <a href="https://p5js.org/">p5.js</a> library for each unique recipient.
|
||
</p>
|
||
<a href="https://github.com/MichaelMBradley/holidaycards2022">
|
||
<img src="assets/HolidayCard.png" alt="Screenshot of an example holiday card" />
|
||
</a>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Heartbeat Analyzer</h2>
|
||
<p>
|
||
Analyzes the (fictional) heartbeat of the user, and displays the statistics it generates.
|
||
Completed in a group of 4 for a class project using Qt C++.
|
||
I personally worked on the heart rate sensor data generation, functionality to save sessions, various bug fixes (including tracking down memory leaks), as well as some documentation in the planning stage before any code was written.
|
||
</p>
|
||
<a href="https://github.com/TahaInc/heartwave">
|
||
<img src="https://raw.githubusercontent.com/TahaInc/heartwave/main/images/screenshot_2.png" alt="Screenshot of the graphical user interface" />
|
||
</a>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Multi-Agent Pathfinding</h2>
|
||
<p>
|
||
Fills a grid with various types of "trash", and then simulates agents moving through the grid to clean it up.
|
||
Completed in a group of 3 for a class project using Python.
|
||
I personally came up with the controller API, implemented the faster "independent" agent controllers, and implemented the UI using the <a href="https://textual.textualize.io/">Textual</a> framework (including a variety of helpful debugging and configuration tools).
|
||
</p>
|
||
<a href="https://github.com/vishalparmar01/comp3106-Project">
|
||
<img src="https://raw.githubusercontent.com/vishalparmar01/comp3106-Project/main/docs/example.png" alt="Screenshot of the simulation terminal user interface" />
|
||
</a>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Personal Website</h2>
|
||
<p>
|
||
What you're looking at right now!
|
||
This website is designed to work without any JavaScript, it's pure HTML+CSS.
|
||
</p>
|
||
<a href="https://github.com/MichaelMBradley/MichaelMBradley.github.io">
|
||
<div id="droste" aria-label="An image of the 'fetch' section above"></div>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
<a id="work"></a>
|
||
<a href="#work">Work Experience</a>
|
||
<div class="info-section">
|
||
<div class="info-group">
|
||
<h2>Emids</h2>
|
||
<p>
|
||
My most recent co-op job was as a Software Developer at Emids, where I worked on their InQ Telehealth solution.
|
||
While there, I contributed to a new service (the RAAM One Front Door) throughout its entire development life cycle, adding new pages and features, and optimizing UI components.
|
||
</p>
|
||
<p class="indent">
|
||
Most of my work was done on the front-end in TypeScript using React, which prior to the position I had almost no experience in but picked up so quickly that I became one of the driving forces in enforcing stricter typing and reducing the use of "Any".
|
||
Despite having never used React before, I became so proficient in it that by the end my superiors informed me that I was one of the best co-ops they’d ever had and nominated me for Carleton University’s Co-op of the Year award.
|
||
</p>
|
||
<p class="indent">
|
||
I also added new features to the back-end after quickly learning the in-house functional language it was written in.
|
||
During this work I found that working on something that made its way directly to customers gave me an extra drive to improve my work, as every extra little bit that I did might make someone else’s life easier.
|
||
</p>
|
||
<p>May-Aug 2023</p>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Ross (part-time)</h2>
|
||
<p>
|
||
After my 8-month co-op term at Ross Video was complete, I was re-hired on a part-time basis to research tracing Python library function call stacks to automatically generate unit tests, as well as updates to the structure of their internal testing framework.
|
||
</p>
|
||
<p>Jan-Mar 2023</p>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Ross</h2>
|
||
<p>
|
||
At Ross Video I completed an 8-month co-op where I worked as a Test Automation & Software Developer (a DevOps role) on the Enablement Team.
|
||
I started by using an in-house testing framework to automate web app security tests that needed to be run as part of any product release to ensure that no vulnerabilities had been introduced.
|
||
By integrating the OWASP ZAP and tenable.io Python APIs with an internally developed testing framework, I made it simpler to ensure that the web apps we were releasing were safe.
|
||
</p>
|
||
<p class="indent">
|
||
I then made a large refactor to the testing framework itself.
|
||
In the refactor I edited about 15 thousand lines of Python code to standardize the return types of the internal library functions, improve older test cases which were not well-written, and add type-hinting to provide additional information to developers.
|
||
</p>
|
||
<p class="indent">
|
||
Finally, I used Jenkins to create generic CI/CD jobs that could build and test the firmware for any of the products we were working on which help developers be confident that the features they’re introducing are not silently adding bugs.
|
||
As the feature set of Jenkins did not meet our needs, I became proficient in shell scripting to add any missing features required to create our pipelines.
|
||
</p>
|
||
<p>May-Dec 2022</p>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Carleton University</h2>
|
||
<p>
|
||
In 2021, I was awarded the Dean’s Summer Research Internship.
|
||
I worked under a Carleton Professor in the Graphics, Imaging, and Games Lab examining using circle-packing to create a polycurve enclosing an arbitrary area.
|
||
This work was done with the goal of being a tool for future GIGL publications in image stylization.
|
||
After writing this code in Java with the Processing graphics library, I used LaTeX to create a report for the lab.
|
||
The work was done remotely and independently, and it taught me how to effectively manage my own time and create realistic deadlines.
|
||
</p>
|
||
<p>May-Aug 2021</p>
|
||
</div>
|
||
</div>
|
||
<a id="accomplishments"></a>
|
||
<a href="#accomplishments">Accomplishments</a>
|
||
<div class="info-section">
|
||
<ul>
|
||
<li>2023 - Nominated for Carleton University's Co-op of the Year award</li>
|
||
<li>2021 - Awarded the Dean's Summer Research Internship</li>
|
||
</ul>
|
||
</div>
|
||
<a id="courses"></a>
|
||
<a href="#courses">Courses</a>
|
||
<div class="info-section">
|
||
<div class="info-group">
|
||
<h2>Introduction to Machine Learning</h2>
|
||
<p>
|
||
Progressed from basic implementations of gradient descent on simple linear models to using SciPy functions to optimize kernel-based models on the outputs of unsupervised learning methods like principal component analysis.
|
||
Analysed neural networks of various types (deep, convolutional, recurrent), but a fuller understanding and implementation will come about as a result of a course I am currently taking dedicated to neural nets.
|
||
</p>
|
||
<p>A+</p>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Introduction to Artificial Intelligence</h2>
|
||
<p>
|
||
Analyzed alternate methods of computer intelligence including graph search, Bayesian inference, fuzzy rules-based systems and reinforcement learning.
|
||
Final project was to create controllers for three garbage-collecting robots operating on a simple grid to collect trash in an optimal manner.
|
||
I optimized my agents with a heuristic penalizing potential targets based on their distance from the convex hull of the set of trash, ensuring that they would work their way inwards instead of taking a random walk.
|
||
</p>
|
||
<p>A+</p>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Introduction to Robotics</h2>
|
||
<p>
|
||
Built up knowledge of robotic control techniques in the <a href="https://cyberbotics.com">Webots</a> simulator.
|
||
Started from basic wheel control, and moved on to simple video analysis, LiDAR, object detection, terrain navigation, and pathfinding in complex environments.
|
||
Final (group) project was to create controllers for 3 robots that would run in sequence to detect, pick up, and move small objects to specified endpoints.
|
||
</p>
|
||
<p>A+</p>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Computer Game Design and Development</h2>
|
||
<p>
|
||
Created simple interactive programs using C++ and OpenGL, including programming some basic shaders in GLSL.
|
||
Final project was to create a more involved game including a larger scrolling environment, basic AI enemies, win conditions, and more advanced controls.
|
||
I was forced to complete my final group project individually after my group-mates dropped the course, and still managed to receive an A.
|
||
</p>
|
||
<p>A+</p>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>Quantum Computing and Information</h2>
|
||
<p>
|
||
Learned the mathematical basis of quantum algorithms, and analyzed how some standard algorithms operate on entangled qubits to probabilistically determine the answer in asymptotically better runtime.
|
||
</p>
|
||
<p>A+</p>
|
||
</div>
|
||
<div class="info-group">
|
||
<h2>In Progress:</h2>
|
||
<ul>
|
||
<li>Neural Networks</li>
|
||
<li>Computer Vision</li>
|
||
<li>Computer Graphics</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
</body>
|
||
</html>
|