@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-cyrillic-wght-normal.DqGufNeO.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-greek-ext-wght-normal.DlzME5K_.woff2)format("woff2-variations");unicode-range:U+1F??}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-greek-wght-normal.CkhJZR-_.woff2)format("woff2-variations");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-vietnamese-wght-normal.CBcvBZtf.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-latin-ext-wght-normal.DO1Apj_S.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./inter-latin-wght-normal.Dx4kXJAl.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--social-icons-dimensions-height:20px;--social-icons-dimensions-width:200px;--common-gutter:10px;--button-radius:calc(.8 * var(--common-gutter));--zone-padding:calc(2 * var(--page-right-pad));--josh-hero-image-height:634px;--josh-hero-image-width:500px;--gray-25:#fcfcfd;--gray-100:#f2f4f7;--gray-300:#d0d5dd;--gray-400:#98a2b3;--gray-500:#667085;--gray-800:#1d2939;--gray-900:#101828;--green-50:#ecfdf3;--green-600:#039855;--green-700:#027a48;--black:#000;--white:#fff;--light-green:#6ce9a6;--green-gradient:linear-gradient(#079052, #439792);--global-pad-multiplier:1;--page-right-pad:calc(var(--common-gutter) * var(--global-pad-multiplier));--page-left-pad:calc(var(--common-gutter) * var(--global-pad-multiplier));--page-top-pad:calc(var(--common-gutter) * var(--global-pad-multiplier));--page-bottom-pad:calc(var(--common-gutter) * var(--global-pad-multiplier));--appearance-event-padding:.9em;--mobile-width:1000px;--hamburger-menu-width:80px;--icon-button-left-padding:calc(4 * var(--common-gutter))}*,:after,:before{box-sizing:border-box}a{color:var(--white)}html{font-family:Inter Variable,Inter,system-ui,sans-serif}h2{line-height:normal}body,h2{margin:0}body{background:var(--white);padding-left:var(--page-left-pad);padding-right:var(--page-left-pad);padding-top:var(--page-top-pad);line-height:1.5em}.button,button{text-align:center;background-color:var(--green-50);border-radius:var(--common-gutter);padding:calc(1.5 * var(--common-gutter));color:var(--green-700);margin-bottom:var(--common-gutter);border-width:0;width:100%;font-size:medium;font-weight:700;text-decoration:none;display:inline-block}@media screen and (width>=1000px){.button,body,button{font-size:medium}.button,button{width:auto}:root{--global-pad-multiplier:3}}.button.icon,button.icon{padding-top:var(--common-gutter);background-repeat:no-repeat;background-position-y:var(--common-gutter);background-position-x:var(--common-gutter);padding-left:calc(5 * var(--common-gutter));background-size:25px}.hint{color:var(--gray-400);text-align:center;grid-area:hint;font-size:smaller}button:disabled,button[disabled]{color:var(--gray-500);background-color:var(--gray-100)}.search-form input{padding:var(--common-gutter);line-height:calc(var(--common-gutter) * 3);text-align:center;border-radius:var(--button-radius);background-color:#fff;background-image:none;border:1px solid #ccc;width:100%;font-size:larger}.search-form{padding:5vh}.search-form form{grid-row-gap:10px;grid-template-columns:100%;grid-template-areas:"query""hint""buttons";display:grid}.search-form form input{grid-area:query}.search-form .buttons{grid-area:buttons;justify-content:center;align-items:center;display:flex}.search-form .buttons button{text-align:center;margin-left:.5vw;margin-right:.5vw}.content .buttons a.icon{--icon-dimensions:27px;background-position-x:5px;background-repeat:no-repeat;border:2px solid #000;border-radius:5px;margin-left:5px;margin-right:0;padding:5px 5px 5px 35px;font-weight:400;text-decoration:none}.content .buttons a.icon.leanpub{color:#fff;background-color:#000;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAARCAYAAADHeGwwAAAACXBIWXMAAAsTAAALEwEAmpwYAAAB50lEQVQ4jZ3UT4iNURjH8c+M609mxjT+5s+YP4yFnUiUlIWUjZGdnZLYy8pCUVazk8WUJVlZWChFKMpGU6OIMZmGJsbVhIYYeize59ad617M/Op03vO8zznf8zvnfR8Roar1R8SViBiJ2RqKiIsR0R4Rrfk8XJMzFhGDEXGwes2miIC1uIkdCo3gDb5hAbagFzMILMJrvMI0WrAT7Tn/MY5gopSBfbn4bQxhU0LbcoE7mEQ/fuAW1mErjmMczejCAA5jL65XrJxOmwPRWOWIOJ9toip+qOaY+zJ+JiJUHPSk9dUaawXO1okvqxlPZ79R2pJ2PydkrqoFTNYD9KCcu5yr2mvGP/ERfdWAXkzUSf4ftdWJvcTmCqAtWxmt8wC01ImNoYSlzdiQwe9YPA9ARwMAdFUDokHyv1TP9Xj2nc2KC6a4nJXzAHTWib3NvquEbsXuFyrKAkwpSsFXRVno86e7KYwqykKtRrPvLimO6Bde4AGeKS6uQ3EnUxhW1KHdCX2S4PUJv4SnuKuoT88T0FMBzOALluBUg6P4gBu5maNm/zMHqp6HcFnxR3c2RcQ7rMmXgUE8zB2V08kunMT2zLuHa3iET1iObdiDE1WwiaaIuI/3OelqOmmkc4qP4cJfchbhGPZj1W8BAwtWJAwm8AAAAABJRU5ErkJggg==);background-size:var(--icon-dimensions) 14px;background-position-y:7px}.content .buttons a.icon.amazon{color:#000;background-color:#fff;background-size:var(--icon-dimensions) var(--icon-dimensions);background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFd0lEQVRogdVaMXDbNhT96XUU7tQRXKoMIcc6QvZAcyQnHakMvS5itqZRdpNzTtdkE6khl8Hh6pPsWeROqO5mw0PcBVh1B+3u4IOOFimJpNT4/CYQgD7+w8f/+AD06ObmBh4yfrhvBXbFgyfw474ELRaL+sXFxUEcx6+klD9fXl4eLBaLulKqDgCAEJpjjK8RQvNmsxkTQqJnz55Fu477aFcfSJKExnH86vT09DetbFEghOaU0pNer+dhjK+rjF+ZQJIkdDQaHTHGaCUBKyCERK7r/l6WSGkCi8Wi7vv+URiGb0v9sCC63e7Hd+/e/Vm0fykCUsqG4zhTIUSjinJFYRjGte/7rSLWKByFOOcH3W737/9beQAAIUTDcZwp5/xgW99CFuCcHziOMy3rpLsCITT3fb9lmub5uj5bCXyvZbMOCKH5169fn65bTlsJHB4efrsv5TUMw7g+Pj5+ihCar7Zt3MgGg8FfVZSnlEK73QbTNMEwDAAA4JwD5xwmkwkwxkrJE0I0RqPRUV50WmsBKWWj0+l8KzMQxhhc1wVCyMZ+QRBAEARlRAMAgO/7LUJIlK5bG4Vc1/1cYYCtygMA9Ho96HQ6ZcVDEARHq3W5BKSUjbI7bKfTWS4XjdPTU/A8DyaTSaZ/u90uIx4AABhjdFWvXB/wfd8tK3xVofQymUwmIKWEXq+3bC9iqTxMp9NX6WWUa4E4jl+WFRxFEURRBIwxEEJkZp1zXlZkLs7Ozu4kjRkLJElCq2xYYRhCGIZr25VSZUWuk1PnnB9oK2QI7CO7xBgDpRQsywLTNKFWq2X8Yxekl1GGwGw2e15VcNEwuiuklA1dzhBYLBb1KkIxxuD7fmamGWMgpYSbm5tKoTMPV1dXv+hyhkDVtKHf799RXggBnuctd11CyN4IpH00E4WqOLBe82mMRqPSKUNRbCRQBZZlZeqSJLnzbZpmpg9CaOexMwTyMr5tyFNk1Rds2870ySNVcLy5Lu+FQF6M1wojhDL+odHv98sOBQC36bUuZ5z4yZMn/5R1ZMYYKKXuWIJSCkmSZOrTME0TKKUQRVGZ4aBWq811OWOBKvczSqm16bFWnnMOnufdaQuCoLTyAADNZjPW5QyBVqt1Uloi3KYSeSQ0uW63C5PJZNln9UyAEFqG2tWItor0jV7mQKOUqh8eHn7LC6eEEDAMIzc9TiuinVMpBVLKjI+YpnknuSOEZDLVdYcehNB8Op3+pL9znfjFixdf8pRjjAHGGMbj8dpNSSkFjDFgjAHnPNfBVzNTxhg4jgODwQAcxwHOOUgpc+VTSk/S37lHSsYYdRxnmisBbmfo6Oj2cDSbzSqdczX0JqiXzfv372E8HkO3280lMR6PH6ej0NozseM4002ZKUIIbNteml7PvD68CyGWS0j3r9VqYFkWYIzBsixoNptgGMbST8IwXPqB67qZMQkhke/7rXTdWgLbrKCBMYZOpwPtdrt0ysw5hyiKIAzD5VKzbRuiKCo0+xsJAAAMBoOPYRj+UVQhQggQQpbXKRjjZRhVSoFSCmazGVxeXi6tVRS2bX/q9/tvV+s3ElBK1V+/fv1d7kM3wTCM6/F4/DivbWMyhxCaD4fDVpX0Yl8wDON6OBy21rVvzUb1Vfd9kEAIzT98+PDr6rpPo1A6bZrmue/7rU2C9g1tfcuyzjf1K/XAIYRovHnz5rs8cAyHw0ITVupAo53Jtu1PlbXbAtu2Px0fHz8tau3Kj3xCiIbneZ/3+cjX6/W81cvbbdj5mVUI0QiCwI3j+GWVZ9Z2u/2FUnpSVnGNnQmkwRijSZLQ2Wz2XClVl1I20g/dtVptblnWOcb4X0rpiWma57tGt70SuA88+P9KPHgC/wEz/+hm4rgTTwAAAABJRU5ErkJggg==)}.content .buttons a.icon.oreilly{color:#fff;--oreilly-image-width:385;--oreilly-image-height:66;--oreilly-image-divisor:3;--oreilly-image-size-factor:calc(var(--oreilly-image-width) / var(--oreilly-image-height));--oreilly-width:calc((var(--oreilly-image-size-factor) * var(--icon-dimensions)) / var(--oreilly-image-divisor));--oreilly-height:calc(var(--icon-dimensions) / var(--oreilly-image-divisor));background-color:#000;background-size:var(--oreilly-width) var(--oreilly-height);background-image:url(./oreilly.D8aWQOtS.png);background-position-y:calc(var(--common-gutter) + (var(--common-gutter) / 5));padding-left:calc(10px + var(--oreilly-width))}.content .buttons a.icon.livelessons{color:#fff;background-color:#000;background-size:var(--icon-dimensions) var(--icon-dimensions);background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAA0CAYAAADMk7uRAAAACXBIWXMAABYlAAAWJQFJUiTwAAADCElEQVRogc1aS5LbIBB9Urlm4vvMQr6IDpFV5iSeVS6QVXIReZHKdfTJlHsWgIxwAw1Csl+VSrYEdDevaWhQRUTYED2AWv++AjiWFnAo2JakJ9wyA5SBr7lCqwIMlKJwQoYhdbwIix5K8ZL+96LbG1Mq5TCw6aCxIGIkhQHT63vhRcsMQsrAnopzqHwvJAwk+eRG8HZgzIARispnAGtEaB5Yo/wE4B/z/A1qQsttl+C4k8+APlHIJ4C/AM7Wsz+esq2+nwB8T5RjdJtndN8glg7aC25K+xQOoYUypNGXFDMLnAES11mruAtjyA9h+XmOcA3oAXyLVDbKc4rb7mHQ6DoA0FnP3fqm7i/I3EqxQET21VMYZyJqnTqtft4R0Ripb/Df05ZprxO0ASLCGuWNIIkwHzryGyHBwoBQ77mCpL0kwUg8qyIW7EohGAGtvqSuIgXHhISFeSaOLppwixS/I4Ps4lyfgrYbAO+etsKguPsQqUEnoZTrybOgnqnrjoWYzNEwEAtbB8gmGi68dlxBBm/CcgvkZmRb4Mo8i7rQMxnA6RJj/VpDNoD3AMdAzK3qZ2Lgp/O/ZUstca3xHG50wf1gPyG+b3XcQ/lT5D23OGyhcoUoavC+l4uYsi58yr9DmOgc8BgX8uUTdoIjwgEqMdh628TOkX2JkOl5qfITcEtoShnwAX5NE4KJNinKAzqhKbk7nYpcxRfYwwA7nptB3jj3VAzmxx4GpCTrUszbKntEoGz38GCw/xgDvJuniXCVbZG5TJZiCwZa517STQc452z2vlDJUAqk77ZJcHfo4W5sPfocIIS73ge2G8TSZD4F7BGt658V1rPwgdvSeNUkZWHwvSg9D0xQytvrHOleZ6hN7wE550JrQip3qLH2hCd4UuljYEB8l5pDg2VOkLqwcxHtzNAp5aMjksgTQlGo1OycA7HsWBjd24ghVaYkClXY57g1q7OkE9krdAq3ASasYDrnYw/JOZpIdoE2spYSRy18QmCG9MD0drGxVeKDJxsj1D7Tqq+wUvAFunAhXzEvnWcAAAAASUVORK5CYII=);background-position-y:2px}h1{padding:0;padding-bottom:calc(var(--page-bottom-pad) * .5);padding-top:calc(3 * var(--page-top-pad));color:var(--gray-400);margin:0;margin-bottom:var(--page-bottom-pad);font-weight:400}@media screen and (width>=1000px){h1{font-size:400%}.search-form form{grid-template-columns:auto 70% auto;grid-template-areas:".query."".hint."".buttons."}.recent-posts .recent-posts-columns{-moz-column-count:3;column-count:3;-moz-column-gap:0;column-gap:0}}.recent-post-panel{padding:var(--common-gutter);width:100%;display:inline-block}a.read-post{text-transform:uppercase;font-size:small;font-weight:700;text-decoration:none}.post a,a.read-post{color:var(--gray-400)}.post{padding-top:var(--page-top-pad)}.recent-post{width:100%;filter:drop-shadow(calc(var(--common-gutter) / 2) calc(var(--common-gutter) / 2) calc(var(--common-gutter) / 2) var(--gray-300));background-color:var(--white);padding:var(--common-gutter);border-radius:var(--common-gutter);display:inline-block}.recent-post img{border:1px solid var(--gray-100);width:100%}.post .date{margin-top:0;margin-bottom:0;font-size:medium}.recent-post .date{z-index:1000;color:#000;margin-bottom:var(--common-gutter);margin-top:var(--common-gutter);font-size:smaller}.post h2{margin-bottom:0;margin-top:calc(var(--common-gutter) / 2)}.post h2,.recent-post h2{color:var(--gray-800);margin-bottom:var(--common-gutter);font-weight:700}.recent-post .text p{color:var(--gray-500)}.visually-hidden{clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;position:absolute;overflow:hidden}.skip-link{left:var(--common-gutter);z-index:2000;padding:var(--common-gutter);background-color:var(--white);color:var(--black);position:absolute;top:-100px}.skip-link:focus{top:var(--common-gutter)}.page{padding-bottom:calc(5 * var(--page-bottom-pad))}.page a{color:var(--green-700)}.page .intro{color:var(--gray-500);max-width:60em}.page img{max-width:100%;height:auto}.breadcrumbs{color:var(--gray-500);padding-top:calc(3 * var(--page-top-pad));font-size:small}.breadcrumbs+h1{padding-top:var(--common-gutter)}.breadcrumbs a{color:var(--gray-500)}.section-more{text-align:center;margin-top:var(--common-gutter)}@media screen and (width>=1000px){.page{padding-top:40px}}.notfound{--notfound-image-width:400px;background-color:#000;grid-template:"image""description"/auto;margin-bottom:0;padding-bottom:0;display:grid}.notfound img{width:100%;max-width:var(--notfound-image-width);grid-area:image;height:auto;display:block}.notfound div{padding-top:calc(2 * var(--zone-padding));padding-bottom:calc(2 * var(--zone-padding));color:var(--gray-400);grid-area:description;font-size:larger}.notfound h1{padding-top:0}.notfound a{color:var(--light-green)}@media screen and (width>=1000px){.notfound{grid-template-columns:var(--notfound-image-width) auto;grid-template-areas:"image description";padding-top:80px}.notfound div{padding-right:var(--notfound-image-width)}}
