1<!DOCTYPE html> 2<html lang="en" data-nav-visible="no"> 3<head> 4 5 <meta charset="utf-8" /> 6 <meta http-equiv="X-UA-Compatible" content="IE=edge" /> 7 8 <title>Contact</title> 9 <meta name="HandheldFriendly" content="True" /> 10 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 11 12 <link rel="stylesheet" type="text/css" href="https://www.johnpapa.net/assets/built/app.css?v=8gOa4Gd_Qp02pMSG" /> 13 <link rel="stylesheet" type="text/css" href="https://www.johnpapa.net/assets/prism.css?v=aWOkA510_46g8QNT" /> 14 <link href="https://fonts.googleapis.com/css?family=Lato:300,300i,400,400i,700,700i|Source+Code+Pro:400&display=swap" rel="stylesheet"> 15 16 <meta name="description" content="Here's how to reach me on various communication channels"> 17 <link rel="canonical" href="https://www.johnpapa.net/contact/"> 18 <meta name="referrer" content="no-referrer-when-downgrade"> 19 20 <meta property="og:site_name" content="John Papa"> 21 <meta property="og:type" content="website"> 22 <meta property="og:title" content="Contact"> 23 <meta property="og:description" content="Here's how to reach me on various communication channels"> 24 <meta property="og:url" content="https://www.johnpapa.net/contact/"> 25 <meta property="og:image" content="https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w1200/2016/05/big-room.jpg"> 26 <meta property="article:published_time" content="2016-05-15T17:32:41.000Z"> 27 <meta property="article:modified_time" content="2020-03-29T02:10:56.000Z"> 28 <meta name="twitter:card" content="summary_large_image"> 29 <meta name="twitter:title" content="Contact"> 30 <meta name="twitter:description" content="Here's how to reach me on various communication channels"> 31 <meta name="twitter:url" content="https://www.johnpapa.net/contact/"> 32 <meta name="twitter:image" content="https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w1200/2016/05/big-room.jpg"> 33 <meta name="twitter:label1" content="Written by"> 34 <meta name="twitter:data1" content="John Papa"> 35 <meta name="twitter:site" content="@john_papa"> 36 <meta property="og:image:width" content="1200"> 37 <meta property="og:image:height" content="268"> 38 39
39<script type="application/ld+json"> 40{ 41 "@context": "https://schema.org", 42 "@type": "Article", 43 "publisher": { 44 "@type": "Organization", 45 "name": "John Papa", 46 "url": "https://www.johnpapa.net/", 47 "logo": { 48 "@type": "ImageObject", 49 "url": "https://www.johnpapa.net/favicon.ico", 50 "width": 48, 51 "height": 48 52 } 53 }, 54 "author": { 55 "@type": "Person", 56 "name": "John Papa", 57 "url": "https://www.johnpapa.net/author/johnpapa/", 58 "sameAs": [] 59 }, 60 "headline": "Contact", 61 "url": "https://www.johnpapa.net/contact/", 62 "datePublished": "2016-05-15T17:32:41.000Z", 63 "dateModified": "2020-03-29T02:10:56.000Z", 64 "image": { 65 "@type": "ImageObject", 66 "url": "https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w1200/2016/05/big-room.jpg", 67 "width": 1200, 68 "height": 268 69 }, 70 "description": "Thanks for wanting to get in touch with me! If you would like to engage in a\nconversation about your upcoming event, please refer to the channels below. I\nlook forward to hearing from you.\n\nPlease keep in mind that I get a huge amount of communications, so this page\nlists the channels I use and how I like to use them.\n\nTwitter: @john_papa [http://twitter.com/john_papa]\n\nI probably spend too much time here, but it has become my primary means of\nbroadcasting things to the world. Please follow me h", 71 "mainEntityOfPage": "https://www.johnpapa.net/contact/" 72} 73 </script>
73 74 75 <meta name="generator" content="Ghost 6.68"> 76 <link rel="alternate" type="application/rss+xml" title="John Papa" href="https://www.johnpapa.net/rss/"> 77
77<script defer src="https://cdn.jsdelivr.net/ghost/portal@~2.71/umd/portal.min.js" data-i18n="true" data-ghost="https://www.johnpapa.net/" data-key="6b9cb8259c309397dfd16dac6d" data-api="https://johnpapa.ghost.io/ghost/api/content/" data-locale="en" crossorigin="anonymous"></script>
77<style id="gh-members-styles">.gh-post-upgrade-cta-content, 78.gh-post-upgrade-cta { 79 display: flex; 80 flex-direction: column; 81 align-items: center; 82 font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; 83 text-align: center; 84 width: 100%; 85 color: #ffffff; 86 font-size: 16px; 87} 88 89.gh-post-upgrade-cta-content { 90 border-radius: 8px; 91 padding: 40px 4vw; 92} 93 94.gh-post-upgrade-cta h2 { 95 color: #ffffff; 96 font-size: 28px; 97 letter-spacing: -0.2px; 98 margin: 0; 99 padding: 0; 100} 101 102.gh-post-upgrade-cta p { 103 margin: 20px 0 0; 104 padding: 0; 105} 106 107.gh-post-upgrade-cta small { 108 font-size: 16px; 109 letter-spacing: -0.2px; 110} 111 112.gh-post-upgrade-cta a { 113 color: #ffffff; 114 cursor: pointer; 115 font-weight: 500; 116 box-shadow: none; 117 text-decoration: underline; 118} 119 120.gh-post-upgrade-cta a:hover { 121 color: #ffffff; 122 opacity: 0.8; 123 box-shadow: none; 124 text-decoration: underline; 125} 126 127.gh-post-upgrade-cta a.gh-btn { 128 display: block; 129 background: #ffffff; 130 text-decoration: none; 131 margin: 28px 0 0; 132 padding: 8px 18px; 133 border-radius: 4px; 134 font-size: 16px; 135 font-weight: 600; 136} 137 138.gh-post-upgrade-cta a.gh-btn:hover { 139 opacity: 0.92; 140}</style> 141
141<script defer src="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/sodo-search.min.js" data-key="6b9cb8259c309397dfd16dac6d" data-styles="https://cdn.jsdelivr.net/ghost/sodo-search@~1.8/umd/main.css" data-sodo-search="https://johnpapa.ghost.io/" data-locale="en" crossorigin="anonymous"></script>
141 142 143 <link href="https://www.johnpapa.net/webmentions/receive/" rel="webmention"> 144
144<script defer src="/public/cards.min.js?v=ShRHxgy4po8zN-Wf"></script>
144 145 <link rel="stylesheet" type="text/css" href="/public/cards.min.css?v=WwnU9jw5ancNC8Gc"> 146
146<script defer src="/public/member-attribution.min.js?v=AKG4hWena9j3yX3I"></script>
146 147
147<script defer src="/public/ghost-stats.min.js?v=vFcCUf6ZQ0Hyhc8h" data-stringify-payload="false" data-datasource="analytics_events" data-storage="localStorage" data-host="https://www.johnpapa.net/.ghost/analytics/api/v1/page_hit" tb_site_uuid="fa72fdbf-d221-41c6-98b6-52b6935978c9" tb_post_uuid="b2eef426-f9ea-4614-8a31-6a58928f40c8" tb_post_type="page" tb_member_uuid="undefined" tb_member_status="undefined" tb_gift_link=""></script>
147<style>:root {--ghost-accent-color: #15171A;}</style> 148
148<script type="text/javascript">
vendor: 372 bytes, line 148
148(function (i, s, o, g, r, a, m) { i['GoogleAnalyticsObject'] = r; i[r] = i[r] || function () { (i[r].q = i[r].q || []).push(arguments) }, i[r].l = 1 * new Date(); a = s.createElement(o), m = s.getElementsByTagName(o)[0]; a.async = 1; a.src = g; m.parentNode.insertBefore(a, m) })(window, document, 'script', '//www.google-analytics.com/analytics.js', 'ga'); ga('create', '
148UA-18897867-1
vendor: 35 bytes, line 148
148', 'auto'); ga('send', 'pageview');
148</script>
148 149 150</head> 151<body class="page-template page-contact"> 152 153 <header class="site-nav padded"> 154 <div class="wrapper"> 155 <nav class="site-nav-pages"> 156 <span class="site-nav-image" style="background-image: url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w600/2021/05/papa-new-banner-3.png);"></span> 157 <ul class="nav"> 158 <li class="nav-home"><a href="https://www.johnpapa.net/">Home</a></li> 159 <li class="nav-speaking"><a href="https://www.johnpapa.net/speaking/">Speaking</a></li> 160 <li class="nav-training"><a href="https://www.johnpapa.net/training/">Training</a></li> 161 <li class="nav-articles"><a href="https://www.johnpapa.net/articles/">Articles</a></li> 162 <li class="nav-about"><a href="https://www.johnpapa.net/about/">About</a></li> 163 <li class="nav-contact nav-current"><a href="https://www.johnpapa.net/contact/">Contact</a></li> 164</ul> 165 166 <button type="button" class="site-nav-close padded"> 167 <div class="wrapper"> 168 <svg width="24px" height="25px" viewBox="0 0 24 25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 169 <g id="Mobile" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 170 <g id="Mobile-Nav" transform="translate(-335.000000, -13.000000)" fill="#FFFFFF"> 171 <g id="Group-4" transform="translate(335.000000, 13.000000)"> 172 <rect id="Rectangle-Copy-3" transform="translate(12.000000, 12.500000) rotate(45.000000) translate(-12.000000, -12.500000) " x="-3" y="11" width="30" height="3"></rect> 173 <rect id="Rectangle-Copy-4" transform="translate(12.000000, 12.500000) scale(-1, 1) rotate(45.000000) translate(-12.000000, -12.500000) " x="-3" y="11" width="30" height="3"></rect> 174 </g> 175 </g> 176 </g> 177 </svg> 178 </div> 179 </button> 180 </nav> 181 <ul class="site-nav-social"> 182 <li> 183 <a class="twitter" href="https://twitter.com/john_papa"> 184 <span class="hidden">Twitter</span> 185 <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> 186 <title>Twitter icon</title> 187 <path 188 d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z" /> 189</svg> </a> 190 </li> 191 <li> 192 <a class="instagram" href="https://instagram.com/_john.papa"> 193 <span class="hidden">Instagram</span> 194 <svg viewBox="6.746 8.301 20.821 20.821" width="20.821" height="20.821"> 195 <g id="Instagram" transform="matrix(0.072619, 0, 0, 0.072619, -1.434176, 0.121547)" style=""> 196 <path 197 d="M366.28,233.93h-25a88.22,88.22,0,1,1-170.64,0h-25V355.25a11,11,0,0,0,11,11H355.24a11,11,0,0,0,11-11Zm0-77.19a11,11,0,0,0-11-11H322.17a11,11,0,0,0-11,11v33.09a11,11,0,0,0,11,11h33.07a11,11,0,0,0,11-11ZM256,200.86A55.14,55.14,0,1,0,311.14,256,55.13,55.13,0,0,0,256,200.86m110.28,198.5H145.72a33.09,33.09,0,0,1-33.08-33.09V145.72a33.08,33.08,0,0,1,33.08-33.08H366.28a33.07,33.07,0,0,1,33.08,33.08V366.27a33.08,33.08,0,0,1-33.08,33.09"> 198 </path> 199 </g> 200</svg> </a> 201 </li> 202 <li> 203 <a class="devdotto" href="https://dev.to/john_papa"> 204 <span class="hidden">Dev.to</span> 205 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" role="img"><title>dev.to icon</title><path d="M7.42 10.05c-.18-.16-.46-.23-.84-.23H6l.02 2.44.04 2.45.56-.02c.41 0 .63-.07.83-.26.24-.24.26-.36.26-2.2 0-1.91-.02-1.96-.29-2.18zM0 4.94v14.12h24V4.94H0zM8.56 15.3c-.44.58-1.
20506.77-2.53.77H4.71V8.53h1.4c1.67 0 2.16.18 2.6.9.27.43.29.6.32 2.57.05 2.23-.02 2.73-.47 3.3zm5.09-5.47h-2.47v1.77h1.52v1.28l-.72.04-.75.03v1.77l1.22.03 1.2.04v1.28h-1.6c-1.53 0-1.6-.01-1.87-.3l-.3-.28v-3.16c0-3.02.01-3.18.25-3.48.23-.31.25-.31 1.88-.31h1.64v1.3zm4.68 5.45c-.17.43-.64.79-1 .79-.18 0-.45-.15-.67-.39-.32-.32-.45-.63-.82-2.08l-.9-3.39-.45-1.67h.76c.4 0 .75.02.75.05 0 .06 1.16 4.54 1.26 4.83.04.15.32-.7.73-2.3l.66-2.52.74-.04c.4-.02.73 0 .73.04 0 .14-1.67 6.38-1.8 6.68z"/></svg> </a> 206 </li> 207 <li> 208 <a class="linkedin" href="http://www.linkedin.com/in/papajohn"> 209 <span class="hidden">LinkedIn</span> 210 <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>LinkedIn icon</title><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> </a> 211 </li> 212 <li> 213 <a class="rss" href="http://feeds.feedburner.com/johnpapa"> 214 <span class="hidden">RSS</span> 215 <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>RSS icon</title><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.294 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg> </a> 216 </li> 217 </ul> 218 <button type="button" class="site-menu-open"> 219 <svg width="26px" height="23px" viewBox="0 0 26 23" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> 220 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 221 <g transform="translate(-334.000000, -14.000000)" fill="#FFFFFF"> 222 <g transform="translate(334.000000, 14.000000)"> 223 <rect id="Rectangle" x="0" y="0" width="26" height="3"></rect> 224 <rect id="Rectangle-Copy" x="0" y="10" width="26" height="3"></rect> 225 <rect id="Rectangle-Copy-2" x="0" y="20" width="26" height="3"></rect> 226 </g> 227 </g> 228 </g> 229 </svg> 230 </button> 231 </div> 232</header> 233 234 235 236<style type="text/css"> 237@media (min-width: 1001px) { 238 .site-header { 239 background-image: url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w2000/2016/05/big-room.jpg); 240 } 241} 242 243@media (min-width: 601px) and (max-width: 1000px) { 244 .site-header { 245 background-image: url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w1000/2016/05/big-room.jpg); 246 background-image: -webkit-image-set( 247 url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w1000/2016/05/big-room.jpg) 1x, 248 url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w2000/2016/05/big-room.jpg) 2x 249 ); 250 background-image: image-set( 251 url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w1000/2016/05/big-room.jpg) 1x, 252 url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w2000/2016/05/big-room.jpg) 2x 253 ); 254 } 255} 256@media (max-width: 600px) { 257 .site-header { 258 background-image: url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w600/2016/05/big-room.jpg); 259 background-image: -webkit-image-set( 260 url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w600/2016/05/big-room.jpg) 1x, 261 url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w1000/2016/05/big-room.jpg) 2x 262 ); 263 background-image: image-set( 264 url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w600/2016/05/big-room.jpg) 1x, 265 url(https://storage.ghost.io/c/fa/72/fa72fdbf-d221-41c6-98b6-52b6935978c9/content/images/size/w1000/2016/05/big-room.jpg) 2x 266 ); 267 } 268} 269</style> 270<header class="site-header has-image"> 271 272 <div class="padded-wrapper"> 273 274 </div> 275 </header> 276 277 278 279 <div class="site-wrapper"> 280 281 <div class="site-main-outer padded"> 282 283 284<main id="site-main" class="site-main-inner"> 285 286 <article class="post-full post "> 287 288 <header class="post-header"> 289 <h1>Contact</h1> 290 </header> 291 292 <section class="post-full-content"> 293 <div class="post-content nice-type"> 294 <!--kg-card-begin: markdown--><p>Thanks for wanting to get in touch with me! If you would like to engage in a conversation about your upcoming event, please refer to the channels below. I look forward to hearing from you.</p> 295<p>Please keep in mind that I get a huge amount of communications, so this page lists the channels I use and how I like to use them.</p> 296<p><strong>Twitter: <a href="http://twitter.com/john_papa?ref=johnpapa.net">@john_papa</a></strong></p> 297<p>I probably spend too much time here, but it has become my primary means of broadcasting things to the world. Please follow me here. I don't see every mention so you may
297not get a reply via a public tweet, but I'll try.</p> 298<p><strong>LinkedIn: <a href="https://www.linkedin.com/in/papajohn?ref=johnpapa.net">papajohn</a></strong></p> 299<p>My background is decently well covered here. I accept connections from people I've met, worked with, spoken with or otherwise had enough interaction to feel that I can call them a professional contact. I don't respond to requests from people I don't know.</p> 300<!--kg-card-end: markdown--> 301 </div> 302 </section> 303 304 <div class="post-ads"> 305 <div id="ad3" data-type="ad" data-publisher="lqm.johnpapa.site" data-zone="post" data-format="728x90"></div> 306 <div id="ad4" data-type="ad" data-publisher="lqm.johnpapa.site" data-zone="post" data-format="728x90"></div> 307 <div id="ad5" data-type="ad" data-publisher="lqm.johnpapa.site" data-zone="post" data-format="300x250"></div> 308 <div id="ad6" data-type="ad" data-publisher="lqm.johnpapa.site" data-zone="post" data-format="300x250"></div> 309</div> 310 311 </article> 312 313</main> 314 315 316 317 318 319 320 </div> 321 322 <div class="site-sidebar-outer"> 323 <div class="site-sidebar-inner"> 324 <div class="sidebar-item sidebar-box"> 325 <div class="sidebar-box-content"> 326 <h3 class="thin">John Papa</h3> 327 <p>Hi, I'm John Papa. I author this blog, create courses for Pluralsight, and work in Developer Relations. I am a professional storyteller, I contribute to OSS, and I'm a Web technologist</p> 328 </div> 329 </div> 330 331 <div class="sidebar-item sidebar-ad"> 332 <div id="ad1" class="panel" data-type="ad" data-publisher="lqm.johnpapa.site" data-zone="sidebar" 333 data-format="160x600"></div> 334 <div id="ad1b" class="panel" data-type="ad" data-publisher="lqm.johnpapa.site" data-zone="sidebar" 335 data-format="160x600"></div> 336 </div> 337 338 <div class="sidebar-item sidebar-box sidebar-projects"> 339 <div class="sidebar-box-content"> 340 <h3 class="thin">Latest Projects</h3> 341 342 <a class="column" target="_blank" href="https://webrush.io"> 343 <img width="250" src="https://www.johnpapa.net/assets/images/webrush-horizontal.png?v=SzESMgI36mLp4eCJ" alt=""> 344 </a> 345 346 <a href="//pluralsight.pxf.io/c/1355333/432941/7490"> 347 <img src="https://www.johnpapa.net/assets/images/pluralsight.png?v=VXDwwvRTW-uNEfXG" alt="" width="250" /> 348 <img class="hidden" src="//pluralsight.pxf.io/i/1355333/432941/7490" /> 349 </a> 350 351 <a href="//pluralsight.pxf.io/QdWQo"> 352 <img src="https://www.johnpapa.net/assets/images/vue-gs.png?v=i4H6P_QrRHE5aIj3" alt="" width="301" /> 353 <img class="hidden" src="//pluralsight.pxf.io/i/1355333/432942/7490" /> 354 </a> 355 356 <a href="//pluralsight.pxf.io/dGBMK"> 357 <img src="https://www.johnpapa.net/assets/images/vue-cli.png?v=ZKV7CoLwTDHjeQVD" alt="" width="301" /> 358 <img class="hidden" src="//pluralsight.pxf.io/i/1355333/432942/7490" /> 359 </a> 360 361 <a href="//pluralsight.pxf.io/V9eR6"> 362 <img src="https://www.johnpapa.net/assets/images/ts-async.png?v=HtDBaF3v2D9Quiks" alt="" width="301" /> 363 <img class="hidden" src="//pluralsight.pxf.io/i/1355333/432942/7490" /> 364 </a> 365 366 <a href="//pluralsight.pxf.io/WN5VX"> 367 <img src="https://www.johnpapa.net/assets/images/angular-cli.png?v=oMrukzl7ZeBF8UDN" alt="" width="301" /> 368 <img class="hidden" src="//pluralsight.pxf.io/i/1355333/432942/7490" /> 369 </a> 370 </div> 371 </div> 372 373 <div class="sidebar-item sidebar-box sidebar-tabs"> 374 <div class="sidebar-tab-nav"> 375 <button type="button" data-tab="0" class="sidebar-tab-nav-item is-active"><span>Must Read</span></button> 376 <button type="button" data-tab="1" class="sidebar-tab-nav-item"><span>Most Recent</span></button> 377 </div> 378 <div class="sidebar-tab-boxes sidebar-box-content"> 379 <div class="sidebar-tab-box" data-tab="0"> 380 <ul> 381 <li><a href="/async-comparisons/">Comparing Callbacks, Promises and Async Await in TypeScript</a></li> 382 <li><a href="/debug-angular-9-interacting-with-components/">Debug Angular 9: Interacting with Components</a></li> 383 <li><a href="/render-html-2/">Vanilla JavaScript and HTML - No frameworks. No libraries. No problem.</a></li> 384 <li>
384<a href="/shifting-your-node-express-apis-to-serverless/">Shifting Your Node Express APIs to Serverless</a></li> 385 <li><a href="/predictive-preloading-of-your-angular-bundles/">Predictive Preloading Strategy for Your Angular Bundles</a></li> 386 <li><a href="/how-i-write-online-articles/">How I Write Online Articles</a></li> 387 <li><a href="/debugnodein60/">Debug Your Node.js App in 60Â Seconds</a></li> 388 </ul> 389 </div> 390 <div class="sidebar-tab-box" data-tab="1" style="display: none;"> 391 <ul> 392 <li><a href="/the-next-js-for-angular-analog-on-web-rush-290/">The Next.js for Angular - Analog on Web Rush #290</a></li> 393 <li><a href="/vs-code-to-the-cloud-in-60-seconds-on-web-rush-289/">VS Code to the Cloud in 60 Seconds on Web Rush #289</a></li> 394 <li><a href="/make-ai-useful-for-you-on-web-rush-288/">Make AI Useful For You on Web Rush #288</a></li> 395 <li><a href="/why-you-as-a-developer-must-care-about-managing-your-apis-on-web-rush-287/">Why You As A Developer Must Care About Managing Your APIs on Web Rush #287</a></li> 396 <li><a href="/fast-development-with-visual-studio-on-web-rush-286/">Fast Development with Visual Studio on Web Rush #286</a></li> 397 <li><a href="/the-best-of-build-for-developers-on-web-rush-285/">The Best of Build for Developers on Web Rush #285</a></li> 398 <li><a href="/app-spaces-new-way-you-can-developer-apps-in-the-cloud-on-web-rush-284/">App Spaces: Simplifying App Development in Azure on Web Rush #284</a></li> 399 </ul> 400 </div> 401 </div> 402 </div> 403 404 <div class="sidebar-item sidebar-ad"> 405 <div id="ad2" class="panel" data-type="ad" data-publisher="lqm.johnpapa.site" data-zone="sidebar" 406 data-format="300x250"></div> 407 </div> 408</div> 409 410 </div> 411 412 </div> 413 414 <footer class="site-footer"> 415 <div class="padded"> 416 <ul class="site-footer-social"> 417 <li> 418 <a class="twitter" href="https://twitter.com/john_papa"> 419 <span class="hidden">Twitter</span> 420 <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> 421 <title>Twitter icon</title> 422 <path 423 d="M23.954 4.569c-.885.389-1.83.654-2.825.775 1.014-.611 1.794-1.574 2.163-2.723-.951.555-2.005.959-3.127 1.184-.896-.959-2.173-1.559-3.591-1.559-2.717 0-4.92 2.203-4.92 4.917 0 .39.045.765.127 1.124C7.691 8.094 4.066 6.13 1.64 3.161c-.427.722-.666 1.561-.666 2.475 0 1.71.87 3.213 2.188 4.096-.807-.026-1.566-.248-2.228-.616v.061c0 2.385 1.693 4.374 3.946 4.827-.413.111-.849.171-1.296.171-.314 0-.615-.03-.916-.086.631 1.953 2.445 3.377 4.604 3.417-1.68 1.319-3.809 2.105-6.102 2.105-.39 0-.779-.023-1.17-.067 2.189 1.394 4.768 2.209 7.557 2.209 9.054 0 13.999-7.496 13.999-13.986 0-.209 0-.42-.015-.63.961-.689 1.8-1.56 2.46-2.548l-.047-.02z" /> 424</svg> </a> 425 </li> 426 <li> 427 <a class="instagram" href="https://instagram.com/_john.papa"> 428 <span class="hidden">Instagram</span> 429 <svg viewBox="6.746 8.301 20.821 20.821" width="20.821" height="20.821"> 430 <g id="Instagram" transform="matrix(0.072619, 0, 0, 0.072619, -1.434176, 0.121547)" style=""> 431 <path 432 d="M366.28,233.93h-25a88.22,88.22,0,1,1-170.64,0h-25V355.25a11,11,0,0,0,11,11H355.24a11,11,0,0,0,11-11Zm0-77.19a11,11,0,0,0-11-11H322.17a11,11,0,0,0-11,11v33.09a11,11,0,0,0,11,11h33.07a11,11,0,0,0,11-11ZM256,200.86A55.14,55.14,0,1,0,311.14,256,55.13,55.13,0,0,0,256,200.86m110.28,198.5H145.72a33.09,33.09,0,0,1-33.08-33.09V145.72a33.08,33.08,0,0,1,33.08-33.08H366.28a33.07,33.07,0,0,1,33.08,33.08V366.27a33.08,33.08,0,0,1-33.08,33.09"> 433 </path> 434 </g> 435</svg> </a> 436 </li> 437 <li> 438 <a class="devdotto" href="https://dev.to/john_papa"> 439 <span class="hidden">Dev.to</span> 440 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" role="img"><title>dev.to icon</title><path d="M7.42 10.05c-.18-.16-.46-.23-.84-.23H6l.02 2.44.04 2.45.56-.02c.41 0 .63-.07.83-.26.24-.24.26-.36.26-2.2 0-1.91-.02-1.96-.29-2.18zM0 4.94v14.12h24V4.94H0zM8.56 15.3c-.44.58-1.
44006.77-2.53.77H4.71V8.53h1.4c1.67 0 2.16.18 2.6.9.27.43.29.6.32 2.57.05 2.23-.02 2.73-.47 3.3zm5.09-5.47h-2.47v1.77h1.52v1.28l-.72.04-.75.03v1.77l1.22.03 1.2.04v1.28h-1.6c-1.53 0-1.6-.01-1.87-.3l-.3-.28v-3.16c0-3.02.01-3.18.25-3.48.23-.31.25-.31 1.88-.31h1.64v1.3zm4.68 5.45c-.17.43-.64.79-1 .79-.18 0-.45-.15-.67-.39-.32-.32-.45-.63-.82-2.08l-.9-3.39-.45-1.67h.76c.4 0 .75.02.75.05 0 .06 1.16 4.54 1.26 4.83.04.15.32-.7.73-2.3l.66-2.52.74-.04c.4-.02.73 0 .73.04 0 .14-1.67 6.38-1.8 6.68z"/></svg> </a> 441 </li> 442 <li> 443 <a class="linkedin" href="http://www.linkedin.com/in/papajohn"> 444 <span class="hidden">LinkedIn</span> 445 <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>LinkedIn icon</title><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg> </a> 446 </li> 447 <li> 448 <a class="rss" href="http://feeds.feedburner.com/johnpapa"> 449 <span class="hidden">RSS</span> 450 <svg role="img" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><title>RSS icon</title><path d="M19.199 24C19.199 13.467 10.533 4.8 0 4.8V0c13.165 0 24 10.835 24 24h-4.801zM3.291 17.415c1.814 0 3.293 1.479 3.293 3.295 0 1.813-1.485 3.29-3.301 3.29C1.47 24 0 22.526 0 20.71s1.475-3.294 3.291-3.295zM15.909 24h-4.665c0-6.169-5.075-11.245-11.244-11.245V8.09c8.727 0 15.909 7.184 15.909 15.91z"/></svg> </a> 451 </li> 452 </ul> 453 <div class="site-footer-legal"> 454 <h6>Copyright 2026 John Papa</h6> 455 <p>This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by/4.0/">Creative Commons Attribution 4.0 International License</a>. In other words, share generously but provide attribution.</p> 456 </div> 457 <div class="site-footer-disclaimer"> 458 <h6>Disclaimer</h6> 459 <p>Opinions expressed here are my own.</p> 460 </div> 461 <div class="site-footer-cite"> 462 <h6>Published with <a href="https://ghost.org">Ghost</a></h6> 463 <p>This site is hosted on <a href="http://ghost.io">Ghost.io</a><br>Theme by <a href="https://crossstroke.co">Cross Stroke</a>.</p> 464 </div> 465 </div> 466 </footer> 467 468
468<script> 469 var images = document.querySelectorAll('.kg-gallery-image img'); 470 images.forEach(function (image) { 471 var container = image.closest('.kg-gallery-image'); 472 var width = image.attributes.width.value; 473 var height = image.attributes.height.value; 474 var ratio = width / height; 475 container.style.flex = ratio + ' 1 0%'; 476 }); 477 </script>
477 478 479
479<script> 480 var html_elem = document.querySelector("html"); 481 var nav_open = document.querySelector(".site-menu-open"); 482 var nav_close = document.querySelector(".site-nav-close"); 483 484 nav_open.addEventListener('click', function(e){ 485 e.preventDefault(); 486 html_elem.setAttribute("data-nav-visible", "yes"); 487 }); 488 489 nav_close.addEventListener('click', function(e){ 490 e.preventDefault(); 491 html_elem.setAttribute("data-nav-visible", "no"); 492 }); 493 </script>
493 494 495
495<script> 496 function _dmBootstrap(t) { 497 var e = document.createElement("script"); 498 e.type = "text/javascript", e.async = !0, e.src = ("https:" == document.location.protocol ? "https://" : "http://") + t, (document.getElementsByTagName("head")[0] || document.getElementsByTagName("body")[0]).appendChild(e) 499 } 500 function _dmFollowup(t) { 501 "undefined" == typeof DMAds && _dmBootstrap("cdn2.DeveloperMedia.com/a.min.js") 502 } 503 !function() { 504 _dmBootstrap("cdn1.DeveloperMedia.com/a.min.js"), setTimeout(_dmFollowup, 2e3) 505 }(); 506 </script>
506 507 508 509
509<script type="text/javascript" src="https://www.johnpapa.net/assets/built/reframe.js?v=JbJIZon-q9A6QJWR"></script>
509 510
510<script> 511 (function() { 512 reframe(document.querySelectorAll('.post-full-content iframe')); 513 })(); 514 </script>
514 515 516
516<script type="text/javascript" src="https://www.johnpapa.net/assets/built/prism.js?v=qPmSzJzVgN55gmEh"></script>
516 517
517<script type="text/javascript"> 518 Prism.plugins.autoloader.languages_path = '/assets/prism-components/'; 519 Prism.plugins.autoloader.use_minified = false; 520 </script>
520 521 522
522<script src="https://www.johnpapa.net/assets/built/headroom.js?v=kCX1JppsstF6vyOq"></script>
522 523
523<script> 524 (function() { 525 526 var elem = document.querySelector(".site-nav"); 527 var headroom = new Headroom(elem, { 528 "offset": 10 529 }); 530 headroom.init(); 531 532 })(); 533 </script>
533 534
535<script> 536 // Simple polyfill for forEach support on a nodelist in MS Edge 537 if (window.NodeList && !NodeList.prototype.forEach) { 538 NodeList.prototype.forEach = Array.prototype.forEach; 539 } 540 541 (function () { 542 var sidebar_tab_buttons = document.querySelectorAll('.sidebar-tab-nav-item'); 543 544 for (var i = 0; i < sidebar_tab_buttons.length; i++) { 545 sidebar_tab_buttons[i].addEventListener('click', function (e) { 546 e.preventDefault(); 547 548 // get the index for the clicked tab 549 var target_tab_index = this.getAttribute('data-tab'); 550 551 // Get the content box with that index 552 var target_tab = document.querySelectorAll('.sidebar-tab-box')[target_tab_index]; 553 554 // And get all the other content boxes, except the selected one 555 var other_tabs = document.querySelectorAll(".sidebar-tab-box:not([data-tab='" + target_tab_index + "'])"); 556 557 // Oh, and the other buttons, except the one that was clicked 558 var other_sidebar_tab_buttons = document.querySelectorAll(".sidebar-tab-nav-item:not([data-tab='" + target_tab_index + "'])"); 559 560 // Loop over the now-inactive tabs and content boxes, and hide/deactivate them
561 other_tabs.forEach(function (item, i) { 562 item.style.display = 'none'; 563 }); 564 other_sidebar_tab_buttons.forEach(function (item, i) { 565 item.classList.remove('is-active'); 566 }); 567 568 // Finally, show the selected content, and active the correct tab 569 target_tab.style.display = 'block'; 570 this.classList.add('is-active'); 571 }); 572 } 573 574 })(); 575</script>
575 576 577 578 579 580 581</body> 582</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.