Compare commits
	
		
			46 Commits
		
	
	
		
			a605f7b560
			...
			main
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| e0675a8df4 | |||
| b90ee4ca82 | |||
| 84c4a30b91 | |||
| 4e7b7c7d08 | |||
| 9021a4733e | |||
| 7c2ab5201b | |||
| bbe89c9a4b | |||
| d2dda4dba7 | |||
| feb559a12e | |||
| 7536b589e1 | |||
| dfb69fd831 | |||
| 8afc013965 | |||
| b7ef31cf04 | |||
| db07bcf7bb | |||
| 21b03c5445 | |||
| 0dd8bc0e7f | |||
| bdaeaf31a9 | |||
| 8ec57acc93 | |||
| 845556877c | |||
| 37b1374f83 | |||
| 58e18fe044 | |||
| 5b0c85711f | |||
| b9981f35ea | |||
| 215d0a8d1b | |||
| 26f42eaf76 | |||
| 4a5206fe72 | |||
| a0a8d4de81 | |||
| 0aa7b322f3 | |||
| 18ad528a87 | |||
| 67dd7ceb72 | |||
| 1a628389df | |||
| 84f3524a06 | |||
| 4b8b0b3455 | |||
| 85c249e35d | |||
| 7ec9727406 | |||
| 63dfc836a7 | |||
| 9ca11f0e36 | |||
| 8777b4df3b | |||
| 068b0caa78 | |||
| 743ab247d8 | |||
|  | c425d8fbda | ||
| 5949c5483b | |||
| 062fed5778 | |||
| 85281a74c3 | |||
| fb6c78ec3e | |||
| 24d2b0a1a1 | 
							
								
								
									
										104
									
								
								data.yaml
									
									
									
									
									
								
							
							
						
						| @@ -1,6 +1,8 @@ | ||||
| intro: | | ||||
|   I'm a <strong>platform engineer</strong> at <a href="https://giantswarm.io">Giant Swarm</a> working on building managed Kubernetes solutions and related projects. My area of focus in recent years has been around Go, ⎈ Kubernetes, containers and DevOps but originally started out as a <em>web developer</em> and <em>JavaScript enthusiast</em>. I'm a “tinkerer” and like to dabble with 3D printing and experimenting with smart home tech.<br/><br/> | ||||
|   I'm a <strong>platform engineer</strong> at <a href="https://monzo.com/">Monzo</a> working on their infrastructure platform, a <a href="https://www.civo.com/ambassadors">Civo Ambassador</a> and a <a href="https://www.cncf.io/people/ambassadors/">CNCF Ambassador</a>. My area of focus in recent years has been around release engineering, Go, ⎈ Kubernetes, containers and DevOps but originally started out as a <em>web developer</em> and <em>JavaScript enthusiast</em>. I'm a “tinkerer” and like to dabble with 3D printing and experimenting with smart home tech.<br/><br/> | ||||
|   I also run a monthly newsletter - <a href="https://cloudnative.now">CloudNative.Now</a> - where I do a roundup of all the cloud native happenings and have a small Etsy store - <a href="https://paradoxfoxuk.etsy.com">Paradox Fox</a> - where I sell geeky stickers, keyrings and pin badges.<br/><br/> | ||||
|   I'm always happy to chat so feel free to drop me an email at <span class="email-link"><svg viewBox="0 0 64 50" height="32" style="fill:#ededed"><path d="m64 39.7-4-22.4c-.4-2-2.4-3.5-4.5-3l-31.7 5.5a4 4 0 0 0-3.2 4.1l4 22.8a3.8 3.8 0 0 0 4.5 3l31.7-5.5a3.8 3.8 0 0 0 3.1-4.5zm-2.7-3.6-10.7-8.2 7.7-8.6 3 16.8zM24 21.8l32-5.6h.3a2 2 0 0 1 1.5.7c-1 1.1-9.4 10.8-13.4 14.6-1 1-2.6 1.3-4 .6l-17.7-8.7a1.8 1.8 0 0 1 1.5-1.6zm-1.1 4 10.5 5.3L26 42.8l-3-17zm38.7 15.7c-.3.4-.7.6-1.2.7l-31.8 5.6a1.9 1.9 0 0 1-2.1-1.5l-.1-.6 8.8-13.8 4.2 2a5.6 5.6 0 0 0 6.1-1c1-.9 2.3-2.1 3.6-3.6L61.8 39l.2 1c0 .6 0 1-.3 1.5zM19 29.9a1 1 0 0 0-1.2-.8l-17 3a1 1 0 1 0 .4 2l17-3c.5-.2.9-.7.8-1.2zm1 5.8a1 1 0 0 0-1.1-.9L8.7 36.6a1 1 0 1 0 .3 2l10.2-1.8c.6 0 1-.6.8-1.1zm-.1 4.9L13 41.8a1 1 0 1 0 .3 2l6.8-1.2a1 1 0 1 0-.3-2z"></path></svg> hello[@]marcusnoble.co.uk</span>, or using any of the other social links below. | ||||
|  | ||||
| social: | ||||
|   - url: https://marcusnoble.co.uk | ||||
|     slug: "/blog" | ||||
| @@ -28,12 +30,6 @@ social: | ||||
|     name: GitHub | ||||
|     icon: | | ||||
|       <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" height="32"><path d="M7.999,0.431c-4.285,0-7.76,3.474-7.76,7.761 c0,3.428,2.223,6.337,5.307,7.363c0.388,0.071,0.53-0.168,0.53-0.374c0-0.184-0.007-0.672-0.01-1.32 c-2.159,0.469-2.614-1.04-2.614-1.04c-0.353-0.896-0.862-1.135-0.862-1.135c-0.705-0.481,0.053-0.472,0.053-0.472 c0.779,0.055,1.189,0.8,1.189,0.8c0.692,1.186,1.816,0.843,2.258,0.645c0.071-0.502,0.271-0.843,0.493-1.037 C4.86,11.425,3.049,10.76,3.049,7.786c0-0.847,0.302-1.54,0.799-2.082C3.768,5.507,3.501,4.718,3.924,3.65 c0,0,0.652-0.209,2.134,0.796C6.677,4.273,7.34,4.187,8,4.184c0.659,0.003,1.323,0.089,1.943,0.261 c1.482-1.004,2.132-0.796,2.132-0.796c0.423,1.068,0.157,1.857,0.077,2.054c0.497,0.542,0.798,1.235,0.798,2.082 c0,2.981-1.814,3.637-3.543,3.829c0.279,0.24,0.527,0.713,0.527,1.437c0,1.037-0.01,1.874-0.01,2.129 c0,0.208,0.14,0.449,0.534,0.373c3.081-1.028,5.302-3.935,5.302-7.362C15.76,3.906,12.285,0.431,7.999,0.431z"></path></svg> | ||||
|   - url: https://twitter.com/Marcus_Noble_ | ||||
|     slug: "/twitter" | ||||
|     title: "@Marcus_Noble_ on Twitter" | ||||
|     name: Twitter | ||||
|     icon: | | ||||
|       <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" height="32"><path d="M15.969,3.058c-0.586,0.26-1.217,0.436-1.878,0.515c0.675-0.405,1.194-1.045,1.438-1.809c-0.632,0.375-1.332,0.647-2.076,0.793c-0.596-0.636-1.446-1.033-2.387-1.033c-1.806,0-3.27,1.464-3.27,3.27 c0,0.256,0.029,0.506,0.085,0.745C5.163,5.404,2.753,4.102,1.14,2.124C0.859,2.607,0.698,3.168,0.698,3.767 c0,1.134,0.577,2.135,1.455,2.722C1.616,6.472,1.112,6.325,0.671,6.08c0,0.014,0,0.027,0,0.041c0,1.584,1.127,2.906,2.623,3.206 C3.02,9.402,2.731,9.442,2.433,9.442c-0.211,0-0.416-0.021-0.615-0.059c0.416,1.299,1.624,2.245,3.055,2.271 c-1.119,0.877-2.529,1.4-4.061,1.4c-0.264,0-0.524-0.015-0.78-0.046c1.447,0.928,3.166,1.469,5.013,1.469 c6.015,0,9.304-4.983,9.304-9.304c0-0.142-0.003-0.283-0.009-0.423C14.976,4.29,15.531,3.714,15.969,3.058z"></path></svg> | ||||
|   - url: https://k8s.social/@Marcus | ||||
|     slug: "/mastodon" | ||||
|     title: "@marcus@k8s.social on Mastodon" | ||||
| @@ -43,6 +39,14 @@ social: | ||||
|         <path d="m409 290c-5 24-43 50-85 56-86 11-137-6-137-6 3 13-4 54 70 52 31 0 58-7 58-7l2 27c-51 24-107 15-140 6-67-17-79-90-81-162v-59c0-74 49-96 49-96 50-24 180-22 222 0 0 0 49 22 49 96 0 0 1 55-7 93"></path> | ||||
|         <path d="m358 202v91h-35v-88c0-18-8-27-23-27-18 0-27 11-27 33v47h-34v-47c0-22-9-33-27-33-15 0-23 9-23 27v88h-35v-91c0-18 5-60 52-60 39 0 50 37 50 37s10-37 50-37c45 0 52 42 52 60" fill="#3088d4"></path> | ||||
|       </svg> | ||||
|   - url: https://bsky.app/profile/averagemarcus.bsky.social | ||||
|     slug: "/bluesky" | ||||
|     title: "@averagemarcus.bsky.social on BlueSky" | ||||
|     name: BlueSky | ||||
|     icon: | | ||||
|       <svg xmlns="http://www.w3.org/2000/svg" height="32" viewBox="50 50 400 400"> | ||||
|         <path d="M159 126c-28-22-74-38-74 14 0 11 6 88 9 101 13 43 57 54 97 48-69 11-87 50-49 89 72 75 104-18 112-42l2-5 2 5c8 24 40 117 112 42 38-39 20-78-49-89 40 6 84-5 97-48 3-13 9-90 9-101 0-52-46-36-74-14-39 29-82 89-97 121-15-32-58-92-97-121Z" fill="#1185fe"/> | ||||
|       </svg> | ||||
|   - url: https://www.linkedin.com/in/marcusnoble/ | ||||
|     slug: "/linkedin" | ||||
|     title: Connect with me on Linkedin | ||||
| @@ -54,13 +58,13 @@ social: | ||||
|         <path stroke="#0077b5" stroke-width="66" d="M244 194v198M142 194v198"></path> | ||||
|         <path fill="#0077b5" d="M276 282c0-20 13-40 36-40 24 0 33 18 33 45v105h66V279c0-61-32-89-76-89-34 0-51 19-59 32"></path> | ||||
|       </svg> | ||||
|   - url: https://noti.st/averagemarcus | ||||
|     slug: "/notist" | ||||
|     title: View my previous talks on Notist | ||||
|     name: Notist | ||||
|   - url: https://speaking.marcusnoble.co.uk | ||||
|     slug: "/speaking" | ||||
|     title: View my previous talks | ||||
|     name: Speaking | ||||
|     icon: | | ||||
|       <svg xmlns="http://www.w3.org/2000/svg" height="32" viewBox="0 -20 520 218"> | ||||
|         <path d="M127.7 127.6a47 47 0 0 1-36.5 18.8c-16.4 0-26.4-9.8-26.4-22.1 0-17.6 9.2-29.1 9.2-40.4 0-4.6-2.6-8-6.7-8-4.9 0-11.8 4.9-18.1 17.5A146.2 146.2 0 0 0 36.8 139c0 4.8-2 6-6.3 6-8.7 0-19.9 1.4-24.2 1.4-3.8 0-6-1.4-6-6.3 0-10.7 12-49.5 12-65 0-5-2-5.6-2-9.3 0-6.3 15.6-10.7 32.3-10.7 6.3 0 9.8 2.6 9.8 7.5 0 4.6-2.3 13-2.3 13C55.2 69.3 72.2 55 89.2 55c15.9 0 22.2 7.2 22.2 18.2 0 13.2-8 27.6-8 39.4 0 7.5 4 10.4 9.2 10.4 4.9 0 7.2-2.3 10.9-6l.7-.8a44 44 0 0 1-.4-6.4c0-28 22.2-56 61.6-56 21.3 0 36 14 36 33.8 0 32.2-20.4 59.9-55.8 59.9-18 0-31.6-7.4-37.9-20zM291.2 113c2.2-15.1 8.7-29.4 8.7-38 0-4.9-1.7-5.5-1.7-9.2 0-6.3 15.3-10.7 32-10.7 6.3 0 9.8 2.6 9.8 7.5 0 11.6-9.3 29.7-9.3 48.7 0 7.5 4.4 11.8 9.5 11.8 3.8 0 6-1.3 8.6-3.7 1-7.7 7-12.1 13-12.1 7.8 0 12.4 3.7 12.4 10.6 0 7.2 2.6 12.1 7.8 12.1 4 0 6.3-2.6 6.3-7.8 0-17-28.5-19.5-28.5-41.1 0-18.2 18.2-27.4 39.8-27.4 21 0 30.5 8 30.5 19.9 0 7.8-4 14.7-13.5 14.7-5.5 0-10.4-4.4-10.4-9.8 0-4.3 2.3-6 2.3-8.7 0-2.8-2.3-4-5.5-4-3.7 0-8.3 4-8.3 9.5 0 17 31.7 19.3 31.7 40.3 0 18.7-15 31.4-40.4 31.4-16.3 0-29.3-5.4-34.7-14.8a45.4 45.4 0 0 1-32.4 14.2c-16.8 0-26.2-8.3-28.1-19.5-9.3 9.2-24.2 19.5-38.4 19.5-20.7 0-29.7-12.3-29.7-27.6 0-18.4 9-32.8 9-47.2 0-3.8-7.8-1.5-7.8-6.7 0-2.8 1.7-8.3 4.9-8.3 15.3 0 29.4-15 36.9-27 2.8-4.7 5.1-6.4 7.7-6.4 3.2 0 4.6 2.3 4.6 4.6 0 6.3-4 18.1-4 23 0 3.8 1.2 5.8 9.8 5.8 2.3 0 4 .8 4 3.2 0 5.7-3.1 9.7-6.6 9.7-7.2 0-10.4 2.3-12.4 9.3-2.3 8.3-6 23-6 32.5 0 8.6 4.3 11.8 11.2 11.8 5.8 0 11.5-5.5 16.1-9.2l1-.9zm200.1-43.5c-7.2 0-10.3 2.3-12.4 9.3-2.3 8.3-6 23-6 32.5 0 8.6 4.3 11.8 11.2 11.8 5.8 0 11.5-5.5 16.2-9.2 2-1.7 3.4-2.9 5.1-2.9 2.3 0 3.8 1.7 3.8 3.5a10 10 0 0 1-2.3 5.7c-7.5 9.8-26.5 26.2-44.4 26.2-20.7 0-29.6-12.3-29.6-27.6 0-18.4 8.9-32.8 8.9-47.2 0-3.8-7.8-1.5-7.8-6.7 0-2.8 1.7-8.3 5-8.3 15.2 0 29.3-15 36.8-27 2.9-4.7 5.2-6.4 7.8-6.4 3.1 0 4.6 2.3 4.6 4.6 0 6.3-4 18.1-4 23 0 3.8 1 5.8 9.7 5.8 2.3 0 4 .8 4 3.2 0 5.7-3.1 9.7-6.6 9.7zM356 120.8c0 2.6 2.2 4.7 4.9 4.7 3.3 0 6.4-3.8 6.4-7.3 0-2.6-1.7-4.6-4.8-4.6-3.4 0-6.5 3.7-6.5 7.2zm-48.6-96.5c0-11.5 10.4-23.6 21.3-23.6C339.1.7 345 7.3 345 16c0 11.5-10.4 23.9-21.4 23.9-8.9 0-16-7-16-15.6zm-107.3 80.4c0-5-1.7-9.2-5.7-11-9-3.4-11.6-6.6-11.6-11.8 0-7.2 4.4-9.5 4.4-11.2 0-1.4-1-2.3-2.6-2.3-1.2 0-4 .9-8.1 4a40.6 40.6 0 0 0-14.1 32.9c0 13 7.5 21.3 18.7 21.3 11.5 0 19-11.8 19-22z" /> | ||||
|       <svg height="32" viewBox="0 0 60 60" xmlns="http://www.w3.org/2000/svg"> | ||||
|           <path d="M20 22c0-1.103-.897-2-2-2s-2 .897-2 2 .897 2 2 2 2-.897 2-2Zm7-6H13a1 1 0 0 0-1 1v12a1 1 0 0 0 1 1h2a1 1 0 1 0 0-2h-1V18h12v8.586l-2.293-2.293a.999.999 0 0 0-1.414 0l-4 4a.999.999 0 1 0 1.414 1.414L23 26.414l3.293 3.293A1 1 0 0 0 28 29V17a1 1 0 0 0-1-1Zm20 18h-8a1 1 0 1 0 0 2h8a1 1 0 1 0 0-2Zm-14-4h12a1 1 0 1 0 0-2H33a1 1 0 1 0 0 2Zm10-14H33a1 1 0 1 0 0 2h10a1 1 0 1 0 0-2Zm4 6h-6a1 1 0 1 0 0 2h6a1 1 0 1 0 0-2Zm-14 2h4a1 1 0 1 0 0-2h-4a1 1 0 1 0 0 2Zm-5 11a1 1 0 0 0 1 1h6a1 1 0 1 0 0-2h-6a1 1 0 0 0-1 1Zm-15 1h12a1 1 0 1 0 0-2H13a1 1 0 1 0 0 2Zm20.707 18.293a.999.999 0 1 0-1.414 1.414l4 4a.997.997 0 0 0 1.414 0 .999.999 0 0 0 0-1.414l-4-4ZM30 48a1 1 0 0 0-1 1v2.586l-6.707 6.707a.999.999 0 1 0 1.414 1.414l7-7A.996.996 0 0 0 31 52v-3a1 1 0 0 0-1-1ZM60 3v4a1 1 0 0 1-1 1h-1v33c0 2.757-2.243 5-5 5H7c-2.757 0-5-2.243-5-5V11a1 1 0 1 1 2 0v30c0 1.654 1.346 3 3 3h46c1.654 0 3-1.346 3-3V7a1 1 0 0 1 1-1h1V4H2v2h51a1 1 0 1 1 0 2H1a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1h28V1a1 1 0 1 1 2 0v1h28a1 1 0 0 1 1 1Z" fill="#FFF" fill-rule="evenodd"/> | ||||
|       </svg> | ||||
|   - url: https://youtube.com/playlist?list=PLT41C0Ggz5wa66-AU5xapbOuzkUKUPLzi | ||||
|     slug: "/youtube" | ||||
| @@ -76,6 +80,18 @@ social: | ||||
|       <svg xmlns="http://www.w3.org/2000/svg" height="32" viewBox="0 0 54.826 54.826"><defs><linearGradient id="a"><stop offset="0" stop-color="#f41046"/><stop offset="1" stop-color="#f46f94"/></linearGradient><linearGradient xlink:href="#a" id="b" x1="66.774" y1="137.431" x2="189.397" y2="14.807" gradientUnits="userSpaceOnUse"/><clipPath clipPathUnits="userSpaceOnUse" id="c"><path class="powerclip" d="M69.3 80.322h71.07v54.633H69.3zm-24.096 28.493v7.522h120.638v-7.522z" fill="#00f" stroke-width="2.598"/></clipPath></defs><path d="M77.805 61.062h54.06c6.277 0 11.33 5.052 11.33 11.329v54.06c0 6.276-5.053 11.33-11.33 11.33h-54.06a11.304 11.304 0 0 1-11.329-11.33v-54.06c0-6.277 5.053-11.33 11.33-11.33z" fill="url(#b)" transform="matrix(.71464 0 0 .71464 -47.506 -43.637)"/><path clip-path="url(#c)" d="M74.3 85.321v38.044c0 3.651 2.94 6.59 6.592 6.59h47.887a6.577 6.577 0 0 0 6.591-6.59V85.32H80.892z" fill="#fff" transform="matrix(.71464 0 0 .71464 -47.506 -43.637)"/></svg> | ||||
|  | ||||
| projects: | ||||
|   - url: https://github.com/AverageMarcus/devstats-viewer | ||||
|     name: devstats-viewer | ||||
|     description: Discover your CNCF devstats score based on your GitHub username | ||||
|     languages: | ||||
|       - color: "#e34c26" | ||||
|         name: HTML | ||||
|   - url: https://github.com/AverageMarcus/bsky-screenshot | ||||
|     name: bsky-screenshot | ||||
|     description: Generate screenshots of Bluesky posts | ||||
|     languages: | ||||
|       - color: "#e34c26" | ||||
|         name: HTML | ||||
|   - url: https://github.com/AverageMarcus/kube-image-prefetch | ||||
|     name: kube-image-prefetch | ||||
|     description: Pre-pull all images, on all nodes, within a Kubernetes cluster | ||||
| @@ -118,29 +134,39 @@ projects: | ||||
|     languages: | ||||
|       - color: "#00ADD8" | ||||
|         name: Go | ||||
| events: | ||||
|   - date: "2023-10-07" | ||||
|     humanDate: "October 7th, 2023" | ||||
|     url: https://dddeastmidlands.com/ | ||||
|     eventName: DDD East Midlands | ||||
|     details: | ||||
|     - name: Managing Kubernetes without losing your cool | ||||
|       type: Talk | ||||
|   - date: "2023-10-17" | ||||
|     humanDate: "October 17th - 18th, 2023" | ||||
|     url: https://community.cncf.io/events/details/cncf-kcd-uk-presents-kubernetes-community-days-uk-2023/https://community.cncf.io/events/details/cncf-kcd-uk-presents-kubernetes-community-days-uk-2023/ | ||||
|     eventName: Kubernetes Community Days UK | ||||
|     details: | ||||
|     - name: Attendee | ||||
|   - date: "2023-11-04" | ||||
|     humanDate: "November 4th - 5th, 2023" | ||||
|     url: https://cloud-native.rejekts.io/ | ||||
|     eventName: Cloud Native Rejekts | ||||
|     details: | ||||
|     - name: Attendee | ||||
|   - date: "2023-11-06" | ||||
|     humanDate: "November 6th - 9th, 2023" | ||||
|     url: https://events.linuxfoundation.org/kubecon-cloudnativecon-north-america/ | ||||
|     eventName: KubeCon + CloudNativeCon NA | ||||
|     details: | ||||
|     - name: Attendee and representing <a href="https://giantswarm.io/">Giant Swarm</a> as a sponsor | ||||
|  | ||||
| badges: | ||||
|   - img: https://images.credly.com/size/340x340/images/e094e852-abe8-4ed2-b0f7-54adeeb910ee/blob | ||||
|     url: https://www.credly.com/badges/59794507-b4d4-40a4-bd30-d49b1bc9ed5e/public_url | ||||
|   - img: https://images.credly.com/size/340x340/images/5be4c74d-322f-476b-9fc9-72fda9c31ff2/blob | ||||
|     url: https://www.credly.com/badges/6eb33d91-c6c9-4b63-9803-1092913a1d95/public_url | ||||
|   - img: https://images.credly.com/size/110x110/images/0ec45b92-a143-4c48-a2d5-290c95dbcdc9/blob | ||||
|     url: https://www.credly.com/badges/c88ef1de-e0f2-4376-b71d-7a28c7dd529b/public_url | ||||
|   - img: https://images.credly.com/size/680x680/images/5000414f-2186-4bfa-b6b9-5f920b1d65cf/blob | ||||
|     url: https://www.credly.com/badges/fe951f9d-cbe8-4a5c-bb1a-793637a5958f/public_url | ||||
|   - img: https://images.credly.com/size/110x110/images/b1eaaa0e-3e14-4bfe-9881-9ce477cfa7fc/image.png | ||||
|     url: https://www.credly.com/badges/cd63e887-72ac-49b0-8322-a4062d86d997/public_url | ||||
|  | ||||
| talks: | ||||
|   - title: Pod Deep Dive - The Interesting Bits | ||||
|     image: https://on.notist.cloud/slides/deck15227/large-0.jpg | ||||
|     url: https://speaking.marcusnoble.co.uk/HqYcp2/pod-deep-dive-the-interesting-bits | ||||
|     recording: https://www.youtube.com/watch?v=E_r56x92KZw | ||||
|   - title: The Future of Kubernetes Admission Logic | ||||
|     image: https://on.notist.cloud/slides/deck15878/large-0.jpg | ||||
|     url: https://speaking.marcusnoble.co.uk/HARSlE/the-future-of-kubernetes-admission-logic | ||||
|     recording: https://youtu.be/zDBt4g1ETDg?list=PLzudWtDtAuH_nMRGBSsuN4s-YbXOu5lJL | ||||
|   - title: Webhooks - What's the worst that could happen? | ||||
|     image: https://on.notist.cloud/slides/deck12725/large-0.jpg | ||||
|     url: https://speaking.marcusnoble.co.uk/I6dyx4/webhooks-whats-the-worst-that-could-happen | ||||
|     recording: https://youtu.be/e4BlDLKJET4 | ||||
|   - title: Managing Kubernetes without losing your cool | ||||
|     image: https://on.notist.cloud/slides/deck9980/large-0.jpg | ||||
|     url: https://speaking.marcusnoble.co.uk/quuysq/managing-kubernetes-without-losing-your-cool | ||||
|     recording: https://youtu.be/SGlU1JDXSD8?list=PLT41C0Ggz5wa66-AU5xapbOuzkUKUPLzi | ||||
|   - title: The Wonders and Woes of Webhooks | ||||
|     image: https://on.notist.cloud/slides/deck9809/large-0.jpg | ||||
|     url: https://speaking.marcusnoble.co.uk/Hw2IXG/the-wonders-and-woes-of-webhooks | ||||
|     recording: https://youtu.be/-Mwo8Xy5lto | ||||
|  | ||||
| events: [] | ||||
|   | ||||
							
								
								
									
										15
									
								
								main.go
									
									
									
									
									
								
							
							
						
						| @@ -9,6 +9,7 @@ import ( | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	"gopkg.in/yaml.v2" | ||||
| ) | ||||
| @@ -36,6 +37,8 @@ func main() { | ||||
| 		panic(err) | ||||
| 	} | ||||
|  | ||||
| 	// Set up "slugs" that can be used as redirects to social media accounts | ||||
| 	// E.g. https://marcusnoble.com/mastodon -> https://k8s.social/@Marcus | ||||
| 	for _, l := range data["social"].([]interface{}) { | ||||
| 		link := l.(map[interface{}]interface{}) | ||||
| 		if link["slug"] != "" { | ||||
| @@ -43,6 +46,18 @@ func main() { | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Filter out any events that have passed already | ||||
| 	futureEvents := []map[interface{}]interface{}{} | ||||
| 	dateLayout := "2006-01-02" | ||||
| 	for _, e := range data["events"].([]interface{}) { | ||||
| 		event := e.(map[interface{}]interface{}) | ||||
| 		t, err := time.Parse(dateLayout, event["date"].(string)) | ||||
| 		if err == nil && time.Now().Before(t) { | ||||
| 			futureEvents = append(futureEvents, event) | ||||
| 		} | ||||
| 	} | ||||
| 	data["events"] = futureEvents | ||||
|  | ||||
| 	funcMap := template.FuncMap(map[string]interface{}{ | ||||
| 		"join": func(objs []interface{}, key, joiner string) template.HTML { | ||||
| 			vals := []string{} | ||||
|   | ||||
| @@ -10,16 +10,7 @@ | ||||
|  | ||||
| | {{ range .social }}<a href="{{ .url }}" rel="me" title="{{ .title }}">{{ .name | html }}</a> | {{ end }} | ||||
|  | ||||
| ## 💻 My Open Source Projects | ||||
|  | ||||
| All my Open Source projects can be found on my <a href="https://github.com/AverageMarcus">GitHub</a> profile (as well as my personal <a href="https://git.cluster.fun">Gitea</a> instance, <a href="https://gitlab.com/AverageMarcus">GitLab</a>, <a href="https://codeberg.org/AverageMarcus">Codeberg</a> and <a href="https://bitbucket.org/AverageMarcus/workspace/projects/PROJ">BitBucket</a>). | ||||
|  | ||||
| Below are a selection of highlights. | ||||
|  | ||||
| {{ range .projects }} | ||||
| [**{{ .name }}**]({{ .url }}) - {{ .description }} [{{ join .languages "name" ", " }}] | ||||
| {{ end }} | ||||
|  | ||||
| {{ if gt (len .events) 0 }} | ||||
| ## 🗓 Upcoming Events | ||||
|  | ||||
| {{ range .events }} | ||||
| @@ -40,3 +31,27 @@ Below are a selection of highlights. | ||||
| {{- end }} | ||||
|  | ||||
| </div> | ||||
|  | ||||
| {{ end }} | ||||
|  | ||||
| {{ if gt (len .projects) 0 }} | ||||
| ## 💻 My Open Source Projects | ||||
|  | ||||
| All my Open Source projects can be found on my <a href="https://github.com/AverageMarcus">GitHub</a> profile (as well as my personal <a href="https://git.cluster.fun">Gitea</a> instance, <a href="https://gitlab.com/AverageMarcus">GitLab</a>, <a href="https://codeberg.org/AverageMarcus">Codeberg</a> and <a href="https://bitbucket.org/AverageMarcus/workspace/projects/PROJ">BitBucket</a>). | ||||
|  | ||||
| Below are a selection of highlights. | ||||
|  | ||||
| {{ range .projects }} | ||||
| [**{{ .name }}**]({{ .url }}) - {{ .description }} [{{ join .languages "name" ", " }}] | ||||
| {{ end }} | ||||
| {{ end }} | ||||
|  | ||||
| {{ if gt (len .badges) 0 }} | ||||
| ## 🎖️ Badges | ||||
|  | ||||
| {{ range .badges }} | ||||
| <a href="{{ .url }}" target="_blank"> | ||||
|   <img src="{{ .img }}" width="110px" /> | ||||
| </a> | ||||
| {{ end }} | ||||
| {{ end }} | ||||
|   | ||||
| Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 14 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/favicon.ico
									
									
									
									
									
								
							
							
						
						| Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB | 
							
								
								
									
										3
									
								
								src/favicon.svg
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 246 KiB | 
| Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 835 KiB | 
							
								
								
									
										
											BIN
										
									
								
								src/headshot-transparent.png
									
									
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						| Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 3.1 MiB | 
| Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 784 KiB | 
							
								
								
									
										108
									
								
								src/index.html
									
									
									
									
									
								
							
							
						
						| @@ -197,6 +197,39 @@ | ||||
|       border-radius: 50%; | ||||
|     } | ||||
|  | ||||
|     /* Talks */ | ||||
|  | ||||
|     .talks { | ||||
|       list-style: none; | ||||
|       margin: 0; | ||||
|       padding: 0; | ||||
|       display: flex; | ||||
|       flex-direction: row; | ||||
|       flex-wrap: wrap; | ||||
|       font-size: .8em; | ||||
|     } | ||||
|  | ||||
|     .talks li { | ||||
|       width: 300px; | ||||
|       max-width: 100%; | ||||
|       margin: 4px 4px; | ||||
|     } | ||||
|  | ||||
|     .talks li a { | ||||
|       text-decoration: none; | ||||
|       color: unset; | ||||
|     } | ||||
|  | ||||
|     .talks .recording { | ||||
|       display: block; | ||||
|       color: #fd7e0b; | ||||
|     } | ||||
|  | ||||
|     .talks img { | ||||
|       width: 300px; | ||||
|       max-width: 100%; | ||||
|     } | ||||
|  | ||||
|     /* Events */ | ||||
|     .events { | ||||
|       list-style: none; | ||||
| @@ -230,6 +263,13 @@ | ||||
|       margin-bottom: 6px; | ||||
|     } | ||||
|  | ||||
|     .badges a { | ||||
|       display: inline-block; | ||||
|     } | ||||
|     .badges a img { | ||||
|       width: 110px; | ||||
|     } | ||||
|  | ||||
|     @media only screen and (max-width: 1700px) { | ||||
|       body { | ||||
|         grid-template: 20vh 80vh / 100%; | ||||
| @@ -291,6 +331,48 @@ | ||||
|       </ul> | ||||
|     </section> | ||||
|  | ||||
|     {{ if gt (len .events) 0 }} | ||||
|     <section id="events"> | ||||
|       <h2>🗓 Upcoming Events</h2> | ||||
|  | ||||
|       <ul class="events"> | ||||
|         {{ range .events }} | ||||
|         <li> | ||||
|           <time datetime="{{ .date }}">{{ .humanDate }}</time> | ||||
|           <div class="details"> | ||||
|             <strong><a href="{{ .url }}">{{ .eventName }}</a></strong> | ||||
|             {{ range .details }} | ||||
|             <div> | ||||
|               <span>{{ .name | html }}</span> | ||||
|               {{ if .type }}<span class="tag">{{ .type }}</span>{{ end }} | ||||
|             </div> | ||||
|             {{ end }} | ||||
|           </div> | ||||
|         </li> | ||||
|         {{ end }} | ||||
|       </ul> | ||||
|     </section> | ||||
|     {{ end }} | ||||
|  | ||||
|     {{ if gt (len .talks) 0 }} | ||||
|     <section id="talks"> | ||||
|       <h2>🗣️ My Talks</h2> | ||||
|  | ||||
|       <ul class="talks"> | ||||
|         {{ range .talks }} | ||||
|         <li> | ||||
|           <a href="{{ .url }}"> | ||||
|             <strong>{{ .title }}</strong> | ||||
|             <img src="{{.image}}"> | ||||
|           </a> | ||||
|           {{ if .recording }}<a href="{{.recording}}" class="recording">📺 Recording</a>{{ end }} | ||||
|         </li> | ||||
|         {{ end }} | ||||
|       </ul> | ||||
|     </section> | ||||
|     {{ end }} | ||||
|  | ||||
|     {{ if gt (len .projects) 0 }} | ||||
|     <section id="projects"> | ||||
|       <h2>💻 My Open Source Projects</h2> | ||||
|  | ||||
| @@ -314,27 +396,21 @@ | ||||
|         {{ end }} | ||||
|       </ul> | ||||
|     </section> | ||||
|     {{ end }} | ||||
|  | ||||
|     <section id="events"> | ||||
|       <h2>🗓 Upcoming Events</h2> | ||||
|     {{ if gt (len .badges) 0 }} | ||||
|     <section id="badges"> | ||||
|       <h2>🎖️ Badges</h2> | ||||
|  | ||||
|       <ul class="events"> | ||||
|         {{ range .events }} | ||||
|         <li> | ||||
|           <time datetime="{{ .date }}">{{ .humanDate }}</time> | ||||
|           <div class="details"> | ||||
|             <strong><a href="{{ .url }}">{{ .eventName }}</a></strong> | ||||
|             {{ range .details }} | ||||
|             <div> | ||||
|               <span>{{ .name | html }}</span> | ||||
|               {{ if .type }}<span class="tag">{{ .type }}</span>{{ end }} | ||||
|             </div> | ||||
|             {{ end }} | ||||
|           </div> | ||||
|         </li> | ||||
|       <ul class="badges"> | ||||
|         {{ range .badges }} | ||||
|         <a href="{{ .url }}" target="_blank"> | ||||
|           <img src="{{ .img }}" /> | ||||
|         </a> | ||||
|         {{ end }} | ||||
|       </ul> | ||||
|     </section> | ||||
|     {{ end }} | ||||
|   </main> | ||||
| </body> | ||||
| </html> | ||||
|   | ||||