CINXE.COM

<!DOCTYPE html> <!--[if lt IE 7 ]> <html lang="en" class="no-js ie6 ie"> <![endif]--> <!--[if IE 7 ]> <html lang="en" class="no-js ie7 ie"> <![endif]--> <!--[if IE 8 ]> <html lang="en" class="no-js ie8 ie"> <![endif]--> <!--[if IE 9 ]> <html lang="en" class="no-js ie9 ie"> <![endif]--> <!--[if (gt IE 9)|!(IE)]><!--> <html lang="en" class="no-js"><!--<![endif]--> <head> <meta name="theme-color" content="#333333"> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"> <meta name="application-name" content=""/> <meta name="apple-mobile-web-app-title" content=""/> <meta property="og:title" content=""/> <meta name="twitter:title" content=""/> <meta name="twitter:site" content="&#64;manningbooks"/> <meta name="twitter:card" content="summary_large_image"/> <meta property="og:type" content="website"/> <meta property="og:url" content="https://www.manning.com/liveaudio-landing"/> <meta property="og:site_name" content="Manning Publications"/> <meta property="og:locale" content="en_US"/> <meta name="twitter:description" content="Manning is an independent publisher of computer books, videos, and courses."/> <meta name="og:description" content="Manning is an independent publisher of computer books, videos, and courses."/> <meta property="og:image" content="https://www.manning.com/assets/defaultOGCard-08086a2ba84a94613971a17812a34881.png"/> <meta property="twitter:image" content="https://www.manning.com/assets/defaultTwitterCard-d210aa87bc328de9c9999dfa5f0b76de.png"/> <meta name="msapplication-TileColor" content=" #343434"/> <meta name="msapplication-square70x70logo" content="/assets/favicon/windows-small-tile-6f6b7c9200a7af9169e488a11d13a7d3.png"/> <meta name="msapplication-square150x150logo" content="/assets/favicon/windows-medium-tile-8fae4270fe3f1a6398f15015221501fb.png"/> <meta name="msapplication-wide310x150logo" content="/assets/favicon/windows-wide-tile-a856d33fb5e508f52f09495e2f412453.png"/> <meta name="msapplication-square310x310logo" content="/assets/favicon/windows-large-tile-072d5381c2c83afa924fe511a8f8b70a.png"/> <link rel="apple-touch-icon" href="/assets/favicon/apple-touch-152-63d7a4c42a1ab2ef3d086d87b05927ef.png"> <link rel="apple-touch-icon" sizes="57x57" href="/assets/favicon/apple-touch-57-2e8fb7a5c223891fa5c18412d9404a71.png"> <link rel="apple-touch-icon" sizes="60x60" href="/assets/favicon/apple-touch-60-7197ba085923b0b044db8b8794f78cdb.png"> <link rel="apple-touch-icon" sizes="72x72" href="/assets/favicon/apple-touch-72-c4cbf5a6b8e457caf1ad1ca140d665a2.png"> <link rel="apple-touch-icon" sizes="76x76" href="/assets/favicon/apple-touch-76-b5c44f21c29654af29dc1b48dc2298ea.png"> <link rel="apple-touch-icon" sizes="114x114" href="/assets/favicon/apple-touch-114-3bac5249c6b59afe8cc25e03bae9bf55.png"> <link rel="apple-touch-icon" sizes="120x120" href="/assets/favicon/apple-touch-120-83869a0805357689e3f663cb2518b9e4.png"> <link rel="apple-touch-icon" sizes="144x144" href="/assets/favicon/apple-touch-144-e5fd09012ba209ad454ca64136c3a5c2.png"> <link rel="apple-touch-icon" sizes="152x152" href="/assets/favicon/apple-touch-152-63d7a4c42a1ab2ef3d086d87b05927ef.png"> <script type="text/javascript"> window.ManningExperimentation = window.ManningExperimentation || {} window.ManningExperimentation.getExperimentSeed = function(){ if(window.ManningExperimentation.experimentSeedPromise){ return window.ManningExperimentation.experimentSeedPromise; } function sumDigitsInString(str) { var sum = 0; for (let i = 0; i < str.length; i++) { if (!isNaN(str[i]) && str[i] !== ' ') { sum += Number(str[i]); } } return sum; } return window.ManningExperimentation.experimentSeedPromise = new Promise(function(resolve, reject){ fetch("\u002fanalytics\u002fgetIpAddress").then(function (response){ return response.json() }).then(function (response) { if(response && response.ipAddress){ resolve(sumDigitsInString(response.ipAddress)) } else { resolve(0) } }).catch(function(error){ resolve(0) }); }) } </script> <!-- Google tag (gtag.js) --> <script async src="https://www.googletagmanager.com/gtag/js?id=G-NMEV8ZBBN1"></script> <script> window.dataLayer = window.dataLayer || []; function gtag(){dataLayer.push(arguments);} gtag('js', new Date()); gtag('config', 'G-NMEV8ZBBN1'); </script> <script> /* SET YOUR EXPERIMENTS HERE */ var runningExperiments = [ {name: "ABC-MANNING_header_size", distribution: [50, 50], variants: ["ABC-MANNING_header_size-A" /* variant A */, "ABC-MANNING_header_size-B" /* variant B */]}, {name: "ABC-MANNING_add_to_cart_discount", distribution: [25, 25, 25, 25], variants: ["ABC-MANNING_add_to_cart_discount-Default", "ABC-MANNING_add_to_cart_discount-A", "ABC-MANNING_add_to_cart_discount-B", "ABC-MANNING_add_to_cart_discount-C"]}, {name: "ABC-MANNING_auth_delegate", distribution: [10, 90], variants: ["ABC-MANNING_auth_delegate-A", "ABC-MANNING_auth_delegate-B"]}, {name: "ABC-MANNING_faq", distribution: [50, 50], variants: ["ABC-MANNING_FAQ_test-A", "ABC-MANNING_FAQ_test-B"], targetPath: "/books/build-a-large-language-model-from-scratch"} ]; /* _________________________ */ </script> <script> runningExperiments.forEach(function(experiment) { var cookieName = experiment.name; var cookieValue = getCookie(cookieName); if (cookieValue === "") { var random = Math.random() * 100; var sum = 0; var variantIndex = experiment.distribution.findIndex(function(percentage) { sum += percentage; return random < sum; }); cookieValue = experiment.variants[variantIndex]; setCookie(cookieName, cookieValue, 90); // Set cookie to expire in 90 days } window.abcExperiments = window.abcExperiments || {}; window.abcExperiments[cookieName] = cookieValue; if (experiment.targetPath) { if (window.location.href.includes(experiment.targetPath)) { gtag('event', 'experience_impression', {exp_variant_string: cookieValue}); } } else { gtag('event', 'experience_impression', {exp_variant_string: cookieValue}); } }); function getCookie(cname) { var name = cname + "="; var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(';'); for(var i = 0; i <ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return ""; } function setCookie(cname, cvalue, exdays) { var d = new Date(); d.setTime(d.getTime() + (exdays*24*60*60*1000)); var expires = "expires="+ d.toUTCString(); document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/"; } </script> <meta name="layout" content="application"/> <link rel="stylesheet" href="/assets/standalone/search-catalog-4f04aa035fac55984375d48bbae88ba7.css" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <script> document.addEventListener("DOMContentLoaded", function(){ $(document).one("mousemove click keydown touchstart", function(){ if(!window.OneSignal){ $.getScript("https://cdn.onesignal.com/sdks/OneSignalSDK.js", function(){ var OneSignal = window.OneSignal || []; OneSignal.push(function() { OneSignal.init({ appId: "b19746ae-b6cb-4983-8b6a-23b63424417a", }); }); }); } }); }); </script> <script type="text/javascript"> window.searchCatalogVars = { jsLocation: "\u002fassets\u002fsearchCatalog\u002fsearch-catalog-865603180a00345fcfd72042fc807711.js", deploymentType: "production" }; </script> <script async>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src='https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);})(window,document,'script','dataLayer','GTM-59QHSR4');</script> <script data-ad-client="ca-pub-9702019192198904" async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script> <!-- Reddit Pixel --> <script> !function(w,d){if(!w.rdt){var p=w.rdt=function(){p.sendEvent?p.sendEvent.apply(p,arguments):p.callQueue.push(arguments)};p.callQueue=[];var t=d.createElement("script");t.src="https://www.redditstatic.com/ads/pixel.js",t.async=!0;var s=d.getElementsByTagName("script")[0];s.parentNode.insertBefore(t,s)}}(window,document);rdt('init','a2_dzgdobk0f71i', {"optOut":false,"useDecimalCurrencyValues":true,"aaid":"<AAID-HERE>","email":"<EMAIL-HERE>","externalId":"<EXTERNAL-ID-HERE>","idfa":"<IDFA-HERE>"});rdt('track', 'PageVisit'); </script> <!-- Page hiding snippet --> <style>.async-hide { opacity: 0 !important} </style> <script async>(function(a,s,y,n,c,h,i,d,e){s.className+=' '+y;h.start=1*new Date; h.end=i=function(){s.className=s.className.replace(RegExp(' ?'+y),'')}; (a[n]=a[n]||[]).hide=h;setTimeout(function(){i();h.end=null},c);h.timeout=c; })(window,document.documentElement,'async-hide','dataLayer',1000, {'GTM-59QHSR4':true});</script> <link rel="shortcut icon preload" as="image" href="/assets/favicon/favicon-06c8d32da14f50950f2c6422e9af1731.png" type="image/png"> <link rel="preconnect" href="https://fonts.gstatic.com"> <link rel="stylesheet" href="https://use.typekit.net/ogd3eap.css"> <link rel="stylesheet preload" as="style" href="https://use.fontawesome.com/releases/v5.12.0/css/all.css" integrity="sha384-REHJTs1r2ErKBuJB0fCK99gCYsVjwxHrSU0N7I1zl9vZbggVJXRMsv/sLlOAGb4M" crossorigin="anonymous"> <link rel="stylesheet" href="/assets/application-162ddb0b8a4bb1b7439f92948adb776a.css" /> <script type="text/javascript"> var searchServerVars = { deploymentType: "production", polyfillsLocation: "\u002fassets\u002fsearch\u002fpolyfills-marketplace-05232e8143f92aac6c2589e26341a535.js", mainJsLocation: "\u002fassets\u002fsearch\u002fsearch-app-marketplace-496d6e0e921b747d15d5da1c355df61e.js", newJsLocation: "\u002fassets\u002fsearch\u002fnew-search-app-marketplace-dd750a152934d496b397c4a5c972baa7.js", coverImage: "\u002fassets\u002fcover-c0e554e9d065ae2e5b8b43d622fb8b95.png", livebookId: "", livebookManningId: "", videoId: "", videoManningId: "", optimizeTest: "3IFt_39gTxClytcLt-z57g", analyticsEndpoint: "\u002fanalytics\u002flogUserAction", feedbackEndpoint: "\u002ffeedback\u002fsendFeedback" } </script> <script type="text/javascript"> if(new URL(document.location.href).searchParams.get("cartIFrame") == "true"){ document.documentElement.classList.add("cart-iframe") } </script> </head> <body id="top" class="nav-liveaudio-landing search-catalog-page dismissible-deals side-social-view-count-only "> <script type="text/javascript" src="/assets/application-2ae854e15e50775f00816c73825e40fa.js" ></script> <script type="text/javascript" src="/assets/analytics/shopperApproved-5467a7e61287592fb79e0c22c00e7963.js" ></script> <!--Google Tag Manager (noscript) --> <noscript><iframe class="lazyload" data-src="https://www.googletagmanager.com/ns.html?id=GTM-59QHSR4" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript><!--End Google Tag Manager (noscript) --> <header id="header"> <nav> <div id="top-nav" class=""> <a href="/" id="home-link" class="nav-home-button"> <img src="/assets/manningLogoBlack-4ce2f7a38da67c986590975d7769f389.svg" id="manning-m" loading="lazy"/> <img src="/assets/manningLettersBlack-0ebe3f78d807742e74e80ce85f130096.svg" id="manning-letters" loading="lazy"/> </a> <form id="search-form" onsubmit="return false"> <div class="header-input-group"> <div class='search-categories-selector-container'></div> <input name="q" type="search" autocomplete="off" spellcheck="false" class="form-control" placeholder="search"> <button class="btn btn-default" type="submit"> <span class="fa fa-search"></span> </button> <i class="fas fa-times clear-search-btn"></i> </div> <div class="nav-browse-button clickable visible-header-desktop"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 27.79 28"> <path fill="currentColor" d="M27.66,24.16l-7-18.73a2,2,0,0,0-2.57-1.18l-3.26,1.2a2,2,0,0,0-.87.64V2a2,2,0,0,0-2-2H8A2,2,0,0,0,6,2V7H2A2,2,0,0,0,0,9V26a2,2,0,0,0,2,2H6a1.87,1.87,0,0,0,1-.28A1.91,1.91,0,0,0,8,28h4a2,2,0,0,0,2-2V8.81l6.7,17.93a2,2,0,0,0,2.58,1.19l3.26-1.2A2,2,0,0,0,27.66,24.16ZM2,26V9H6V26Zm10,0H8V9s0-.06,0-.09V2h4Zm10.58.05-7-18.73,3.26-1.2,7,18.73Z"></path> </svg> <label for="browse-desktop">browse</label> </div> <a href="https://subscription.manning.com" target="_blank" class="nav-manning-online-button clickable"> <svg width="30" height="28" viewBox="0 0 36 38" fill="none" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" clip-rule="evenodd" d="M18.5737 5.30664C18.2408 5.03125 17.7592 5.03125 17.4263 5.30664L6.42629 14.4066C6.21962 14.5776 6.09998 14.8319 6.09998 15.1001V29.4001C6.09998 30.3111 6.43968 31.195 7.06023 31.8551C7.68254 32.517 8.53887 32.9001 9.44442 32.9001H14C14.497 32.9001 14.9 32.4972 14.9 32.0001V19.9001H21.1V32.0001C21.1 32.4972 21.5029 32.9001 22 32.9001H26.5555C27.4611 32.9001 28.3174 32.517 28.9397 31.8551C29.5603 31.195 29.9 30.3111 29.9 29.4001V15.1001C29.9 14.8319 29.7803 14.5776 29.5737 14.4066L18.5737 5.30664ZM22.9 31.1001H26.5555C26.9466 31.1001 27.3338 30.9354 27.6283 30.6221C27.9246 30.3069 28.1 29.8683 28.1 29.4001V15.5236L18 7.16815L7.89998 15.5236V29.4001C7.89998 29.8683 8.07535 30.3069 8.37165 30.6221C8.66618 30.9354 9.05335 31.1001 9.44442 31.1001H13.1V19.0001C13.1 18.503 13.5029 18.1001 14 18.1001H22C22.497 18.1001 22.9 18.503 22.9 19.0001V31.1001Z" fill="currentColor"/> </svg> <label for="manning-online">home</label> </a> </form> <div id="controls"> <div class="nav-browse-button clickable hidden-header-desktop hidden-header-mobile"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 27.79 28"> <path fill="currentColor" d="M27.66,24.16l-7-18.73a2,2,0,0,0-2.57-1.18l-3.26,1.2a2,2,0,0,0-.87.64V2a2,2,0,0,0-2-2H8A2,2,0,0,0,6,2V7H2A2,2,0,0,0,0,9V26a2,2,0,0,0,2,2H6a1.87,1.87,0,0,0,1-.28A1.91,1.91,0,0,0,8,28h4a2,2,0,0,0,2-2V8.81l6.7,17.93a2,2,0,0,0,2.58,1.19l3.26-1.2A2,2,0,0,0,27.66,24.16ZM2,26V9H6V26Zm10,0H8V9s0-.06,0-.09V2h4Zm10.58.05-7-18.73,3.26-1.2,7,18.73Z"></path> </svg> <label for="browse-mobile">browse</label> </div> <a href="/cart" class="nav-cart-button visit-cart-link"> <svg viewBox="0 0 32 28" xmlns="http://www.w3.org/2000/svg"> <g clip-path="url(#clip0)"> <path fill-rule="evenodd" clip-rule="evenodd" d="M14.2555 25.7607C14.5331 23.963 13.0066 22.4429 11.2152 22.7141C10.0924 22.8844 9.1778 23.799 9.00749 24.9218C8.72995 26.7195 10.2564 28.246 12.0541 27.9684C13.1706 27.7981 14.0852 26.8772 14.2555 25.7607ZM12.8678 25.5399C12.9939 24.6947 12.2811 23.9819 11.4359 24.108C10.9061 24.1837 10.4771 24.6127 10.4014 25.1488C10.269 25.9941 10.9881 26.7131 11.8333 26.5807C12.3568 26.4987 12.7858 26.0634 12.8678 25.5399Z" fill="currentColor"></path> <path d="M10.0538 21.4841C8.72922 21.4841 8.65353 20.0396 8.65353 19.9766C8.63461 19.8189 6.89367 6.9385 6.81167 6.16896C6.71075 5.23541 5.6132 4.59203 5.56274 4.56679L1.21672 2.5294C0.144405 1.96801 -0.101597 1.18585 0.0308657 0.63708C0.125482 0.258617 0.396714 0 0.705792 0C0.787793 0 0.876101 0.0189232 0.964409 0.0567695C5.17166 2.0374 8.81753 3.75941 8.96891 4.69295C9.12661 5.68957 9.41676 8.13066 9.41676 8.14958L9.4483 8.42712H29.9926C30.5603 8.42712 30.945 8.57851 31.1469 8.86866C31.5569 9.46159 31.1721 10.5213 31.1658 10.5339L27.8921 20.2541C27.8732 20.3424 27.6398 21.4841 26.5422 21.4841H10.0538ZM10.7603 18.9863H26.1953L28.7121 10.4645H9.6943L10.7603 18.9863Z" fill="currentColor"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M25.849 25.7608C26.1266 23.9631 24.6001 22.4366 22.8024 22.7142C21.6859 22.8908 20.7713 23.7991 20.601 24.9156C20.3234 26.7069 21.8436 28.2334 23.6413 27.9622C24.7641 27.7919 25.6787 26.8773 25.849 25.7608ZM24.4614 25.5399C24.5875 24.6947 23.8748 23.9819 23.0295 24.108C22.506 24.1837 22.0708 24.6127 21.9951 25.1488C21.8626 25.9941 22.5817 26.7131 23.4269 26.5807C23.9505 26.4987 24.3794 26.0634 24.4614 25.5399Z" fill="currentColor"></path> </g> <defs> <clipPath id="clip0"> <rect width="31.3368" height="28" fill="white"></rect> </clipPath> </defs> </svg> <span id="header-cart-count"></span> <label for="cart">cart</label> </a> <div class="nav-dashboard-button clickable"> <svg class="avatar-icon" viewBox="0 0 22 30" fill="none" xmlns="http://www.w3.org/2000/svg"> <path fill-rule="evenodd" clip-rule="evenodd" d="M12.0503 3.15739C8.57031 2.66025 5.71847 5.54102 6.14142 9.09382L6.14288 9.10608L6.14281 9.10609C6.38912 11.4051 8.29151 13.3237 10.7068 13.5736L10.7164 13.5746L10.7259 13.5757C14.1535 13.9937 17.068 11.1652 16.6576 7.65433C16.3178 5.31573 14.3858 3.40828 12.0869 3.16197L12.0686 3.16L12.0503 3.15739ZM12.3291 1.07592C7.4196 0.386074 3.48311 4.49739 4.05542 9.33598C4.41147 12.6311 7.10307 15.3074 10.4811 15.6614C15.2455 16.2365 19.3224 12.2742 18.7414 7.39382L18.74 7.38162L18.7382 7.36945C18.274 4.11966 15.6177 1.43722 12.3291 1.07592Z" fill="currentColor"></path> <path fill-rule="evenodd" clip-rule="evenodd" d="M15.3921 16.8559C16.4921 16.2344 17.7592 16.4075 18.6721 17.1683L18.6965 17.1886L18.7196 17.2103C20.6274 19.0059 21.75 21.4813 21.75 24.275C21.75 25.2619 21.2671 26.0629 20.5982 26.6639C19.9445 27.2511 19.0715 27.6915 18.1244 28.0225C16.2242 28.6863 13.7603 29 11.35 29C8.93957 29 6.47573 28.6863 4.57551 28.0225C3.62836 27.6915 2.7554 27.2511 2.10175 26.6639C1.43283 26.0629 0.949951 25.2619 0.949951 24.275C0.949951 21.487 2.06871 19.0079 4.08191 17.2084C4.95575 16.3588 6.35997 16.2646 7.40762 16.8558C8.54564 17.4662 9.9693 17.825 11.4 17.825C12.8305 17.825 14.2541 17.4662 15.3921 16.8559ZM17.3065 18.7643C17.0281 18.5441 16.7105 18.5211 16.4209 18.6866L16.4094 18.6932L16.3978 18.6995C14.9374 19.4858 13.1652 19.925 11.4 19.925C9.63474 19.925 7.86249 19.4858 6.40215 18.6995L6.39049 18.6932L6.379 18.6866C6.03783 18.4917 5.66684 18.593 5.54241 18.7174L5.5206 18.7392L5.49753 18.7597C3.92361 20.1588 3.04995 22.0723 3.04995 24.275C3.04995 24.513 3.15144 24.7839 3.50519 25.1017C3.87419 25.4332 4.46217 25.7584 5.26814 26.04C6.87417 26.6011 9.08533 26.9 11.35 26.9C13.6146 26.9 15.8257 26.6011 17.4318 26.04C18.2377 25.7584 18.8257 25.4332 19.1947 25.1017C19.5485 24.7839 19.65 24.513 19.65 24.275C19.65 22.0815 18.7828 20.1666 17.3065 18.7643Z" fill="currentColor"></path> </svg> <label for="sign-in">log in</label> </div> </div> </div> <ul id="browse-nav" class="list-unstyled"> <li class="nav-catalog-button"><a href="/catalog">catalog</a></li> <li class="nav-meaps-button"><a href="/meap-catalog">MEAP</a></li> <li class="nav-livebook-button"><a href="https://livebook.manning.com">liveBook</a></li> <li class="nav-livevideo-button"><a href="https://livevideo.manning.com">liveVideo</a></li> <li class="nav-liveproject-button"><a href="https://liveproject.manning.com">liveProject</a></li> <li class="nav-liveaudio-button"><a href="/liveaudio-landing">liveAudio</a></li> <li class="nav-free-content-button"><a href="http://freecontent.manning.com">free content</a></li> <li class="nav-register-button"><a href="/freebook">register pBook</a></li> <li class="nav-subscription-button"><a href="/subscription">subscription</a></li> </ul> <div id="top-nav-deals-wrapper"> <div id="top-nav-deals" class="top-nav-deals carousel slide noselect carousel-fade" data-ride="carousel" data-interval="7500"> <div class="carousel-inner" role="listbox"> <style> #banner-item-inner-1724 { background-color: #2F5380; } </style> <style> #banner-item-inner-1724:hover { background-color: #4271AD; } </style> <div class="item active" data-background-color="#2F5380"> <a class="banner-item-inner link-to-banner" id="banner-item-inner-1724" data-banner-id="1724" data-banner-name="Save 40 with emails" data-banner-position="0" target="_blank" href="https://deals.manning.com/sign-up-to-emails-and-save-40-digital/"> <div class="container banner-item-inner-container"> <img class="visible-xs img-responsive lazyload" loading="lazy" src="https://images.manning.com/banner/3/2b21b17-0114-425f-a1f4-8bce0dbd8663/save40signupmob.svg"/> <img class="hidden-xs img-responsive lazyload" loading="lazy" src="https://images.manning.com/banner/9/5a8e3fb-62ba-4e7a-8ea7-81fec08a1b3a/save40signupdesk.svg"/> </div> </a> </div> <style> #banner-item-inner-1734 { background-color: #000000; } </style> <style> #banner-item-inner-1734:hover { background-color: #454545; } </style> <div class="item " data-background-color="#000000"> <a class="banner-item-inner link-to-banner" id="banner-item-inner-1734" data-banner-id="1734" data-banner-name="DOTD Banner" data-banner-position="1" target="_blank" href="https://www.manning.com/dotd"> <div class="container banner-item-inner-container"> <div class="visible-xs"> <div class="dotd-with-text-container"> <img class="img-responsive lazyload" loading="lazy" src="https://images.manning.com/banner/dotd/dotd_mobile.svg"/> <span class="dotd-text-overlay"><em>Machine Learning for Tabular Data</em>鈥擲ave 45% TODAY ONLY!</span> </div> </div> <div class="hidden-xs"> <div class="dotd-with-text-container"> <img class="img-responsive lazyload" loading="lazy" src="https://images.manning.com/banner/dotd/dotd_desktop.svg"/> <span class="dotd-text-overlay"><em>Machine Learning for Tabular Data</em>鈥擲ave 45% TODAY ONLY!</span> </div> </div> </div> </a> </div> </div> <div class="carousel-controls"> <div class="left carousel-control"> <div id="left-side-prev-deal-button" href="#top-nav-deals" role="button" data-slide="prev"> <span class="fas fa-chevron-left" aria-hidden="true"></span> <span class="sr-only">Previous</span> </div> <div id="left-side-next-deal-button" href="#top-nav-deals" role="button" data-slide="next"> <span class="fas fa-chevron-right" aria-hidden="true"></span> <span class="sr-only">Next</span> </div> </div> <div class="right carousel-control" id="next-deal-button" href="#top-nav-deals" role="button" data-slide="next"> <span class="fas fa-chevron-right" aria-hidden="true"></span> <span class="sr-only">Next</span> </div> <div class="right carousel-control" id="dismiss-deals-button" role="button"> <span class="fas fa-chevron-up" aria-hidden="true"></span> <span class="sr-only">Dismiss</span> </div> </div> </div> </div> <div id="restore-deals-tab"> <span class="fas fa-chevron-down" aria-hidden="true"></span> </div> <script> if (typeof jQuery !== 'undefined') { (function ($) { const now = (new Date()).getTime(); const thirtyDays = 2592000000; var dealsDismissed = JSON.parse(localStorage.getItem("deals-dismissed")); var restoreDealsButton = $("#restore-deals-button, #restore-deals-tab"); if ((dealsDismissed + thirtyDays) < now) { dealsDismissed = null; localStorage.removeItem("deals-dismissed"); } if (localStorage.getItem("deals-dismissed")) { $("body").addClass("deals-dismissed"); } else { restoreDealsButton.attr('aria-hidden', true); } $("#dismiss-deals-button").click(function() { restoreDealsButton.removeAttr('aria-hidden'); $("body").addClass("deals-dismissing-right-now"); localStorage.setItem("deals-dismissed", now); }); restoreDealsButton.click(function() { $(this).attr('aria-hidden', true); $("body").removeClass("deals-dismissing-right-now").removeClass("deals-dismissed"); localStorage.removeItem("deals-dismissed"); }); var changeColorOfExpanderOnDealChange = function(target = null) { var bc = "#ccc"; if (target && target.data('background-color')) { bc = target.data('background-color'); } restoreDealsButton.css('color', bc); } $("#top-nav-deals").on('slide.bs.carousel', function(event) { changeColorOfExpanderOnDealChange($(event.relatedTarget)); }); // Set the initial color changeColorOfExpanderOnDealChange($("#top-nav-deals .item.active")); $("#top-nav-deals .link-to-banner").on("click", function(e){ var $target = $(e.currentTarget) $.ajax({ url: "/analytics/logUserAction", data: { type: "banner", additionalData: "click-" + $target.attr("href") } }); }); })(jQuery); } </script> <div id="account-sidebar"> <a href="/dashboard" class="account-block"> <div class="icon"> <i class="fas fa-tachometer-alt"></i> </div> <div class="caption"> view your dashboard </div> </a> <a href="/dashboard/details" class="account-block"> <div class="icon"> <i class="far fa-address-card"></i> </div> <div class="caption"> manage account details </div> </a> <a href="https://login.manning.com/logout?service=https://www.manning.com/logout" class="account-block signout-link"> <div class="btn btn-full-width btn-default"> sign out </div> </a> </div> </nav> </header> <script> if (typeof jQuery !== 'undefined') { (function ($) { var lookupTime = new Date().getTime(); var handleDynamicLoad = function(data, status, error) { $("#header-cart-count").text(data['cartCount']).trigger("cart-updated"); if(data['cartCount']){ $("#header-cart-count").addClass("show-cart-count"); $(document.body).addClass("has-items-in-cart"); } else { $(document.body).removeClass("has-items-in-cart"); } if (data['userLoggedIn'] && data['userLoggedIn'] === true) { $(".signout-link").show(); $("body").addClass("logged-in"); $("body").attr("data-user-id", data.userId); if (data['userId']) { $(document).trigger('user-gtm', { userId: data['userId'].toString(), ltke: data['ltke'], firstName: data['firstName']}); } if (data['firstName'] && data['firstName'].length <= 6) { $(".nav-dashboard-button label").text(data['firstName']); } else { $(".nav-dashboard-button label").text("account"); } $(".nav-dashboard-button").addClass("signed-in"); if (data['ltke']) { $(document).trigger('user-log-in-ltk', data['ltke']); localStorage.removeItem('dynamicloadcache'); } $(document).trigger("logged-in"); } else { $(".nav-dashboard-button").removeClass("signed-in"); $(".nav-dashboard-button label").text("sign in"); $(".signout-link").hide(); } if (status !== "cache") { data['timestamp'] = lookupTime; localStorage.setItem('dynamicloadcache', JSON.stringify(data)); } }; var localLoadCache = JSON.parse(localStorage.getItem('dynamicloadcache')); var uncacheablePages = /cart|checkout|dashboard/i; var areSubscriptionsEnabled = "true" == "true"; // 1200000 is a twenty minute cache length. if (localLoadCache === null || lookupTime > (localLoadCache['timestamp'] + 1200000) || document.location.href.match(uncacheablePages)) { // Check to ensure we have a place to put the data so it's not a waste of time if ($("#header-cart-count").length) { $.ajax({url: "/cart/currentCartCount.json", cache: false}) .done(handleDynamicLoad) .fail(handleDynamicLoad); } } else { handleDynamicLoad(JSON.parse(localStorage.getItem('dynamicloadcache')), "cache", null); } $(".nav-browse-button").click(function() { $("body").toggleClass("browse-nav-in"); }); $("#top-nav").on('click', '.nav-dashboard-button', function() { if ($(this).hasClass('signed-in')) { var $accountSidebar = $("#account-sidebar"); var oldHtml = $accountSidebar.html(); var isUserSubscriber = $(document.body).is(".subscription-expired-paused, .subscription-active"); var shouldLoadNewMenu = areSubscriptionsEnabled && isUserSubscriber && loadAndRenderNewMenu && !window.SettingsMenu if(shouldLoadNewMenu){ $accountSidebar.addClass("new"); $accountSidebar.html("<div class='loader-container'><i class='fa fa-circle-notch fa-spin'></i></div>"); } $accountSidebar.toggleClass("drawer-in"); if(isUserSubscriber){ if($accountSidebar.is(".drawer-in")){ $("body").addClass("manning-menu-shown"); } else { $("body").removeClass("manning-menu-shown"); } } if(shouldLoadNewMenu){ loadAndRenderNewMenu(oldHtml) } } else { window.location = '/dashboard/decide'; } }); $(".signout-link").click(function(e) { e.preventDefault(); localStorage.removeItem('dynamicloadcache'); location.href = $(this).attr('href'); }); })(jQuery); $(document).trigger('activity-page-browse'); } $(document).ready(function() { $.ajax({ url: "/ajax/getSubscriptionStatus" }).done(function (data) { if (!jQuery.isEmptyObject(data) && data['status']) { let subscriptionStatusLoaded = new CustomEvent('subscription-status-loaded', { detail : data }); switch(data['subscriptionOfferingType']){ case "TEAM": case "PRO": $("body").addClass("team-pro-subscriber"); if(data.isSubscriptionOwner){ $("body").addClass("subscription-owner"); } break; } switch(data['status']) { case 'EXPIRED_PAUSED': $("body").addClass("subscription-expired-paused"); break; case 'ACTIVE': case 'PAUSED': case 'TRIAL': $("body").addClass("subscription-active"); $("body").addClass("deals-dismissed"); updateBrowseHeaderForSubscribers(); $(".hide-if-subscription-is-in-cart").remove(); break; case 'CANCELLED': if(data.endDate){ var now = new Date() var endDate = new Date(data.endDate); if(endDate > now){ $("body").addClass("subscription-active"); $("body").addClass("deals-dismissed"); updateBrowseHeaderForSubscribers(); $(".hide-if-subscription-is-in-cart").remove(); break; } } default: $("body").addClass("no-subscription"); } document.dispatchEvent(subscriptionStatusLoaded); } }); var dlc = JSON.parse(localStorage.getItem('dynamicloadcache')); if (dlc && dlc["cartHasSubscription"]) { $(".hide-if-subscription-is-in-cart").remove(); $(".click-if-subscription-is-in-cart").click(); } }); </script> <script> var isLoading = false var profileData = null function loadAndRenderNewMenu(oldHtml){ if(isLoading) { return } var isSourceLoaded = false, isProfileDataLoaded = false getSource().then(function(){ isLoading = false isSourceLoaded = true if(isSourceLoaded && isProfileDataLoaded){ clearTimeout(timer); renderSettingsMenu(); } }).catch(function() { $("#account-sidebar").html(oldHtml); }); getProfileData().then(function(data){ profileData = data isProfileDataLoaded = true if(isSourceLoaded && isProfileDataLoaded){ clearTimeout(timer); renderSettingsMenu(); } if(profileData != null){ $("body").toggleClass("browse-nav-in", (profileData.showBrowseHeader === null || profileData.showBrowseHeader)); } }); var timer = setTimeout(function(){ $("#account-sidebar").html(oldHtml); }, 4000); } function getInitialMenuState(){ return { name: profileData != null ? (profileData.firstName + " " + profileData.lastName) : "", showMenuBar: profileData != null ? (profileData.showBrowseHeader === null ? true : profileData.showBrowseHeader) : true, email: profileData != null ? profileData.email : "", avatarUrl: profileData != null ? profileData.avatarUrl : "" } } function getDeploymentType(){ switch("production"){ case "development": case "test": return SettingsMenu.DeploymentType.dev; case "qa": return SettingsMenu.DeploymentType.qa; case "production": return SettingsMenu.DeploymentType.prod; case "docker": return SettingsMenu.DeploymentType.docker; default: console.error("Unknown deployment environment, defaulting to production"); return SettingsMenu.DeploymentType.prod; } } function renderSettingsMenu(){ SettingsMenu.ReactDOM.render( SettingsMenu.React.createElement( SettingsMenu.ManningMenu, { sourceApp: SettingsMenu.SourceApp.marketplace, deploymentType: getDeploymentType(), avatarUrl: profileData != null ? profileData.avatarUrl : "", initialMenuState: getInitialMenuState(), isSubscriptionTeamOwner: $("body").is(".team-pro-subscriber.subscription-owner"), onMenuStateChange: function (oldState, newState) { if(oldState.showMenuBar != newState.showMenuBar){ $("body").toggleClass("browse-nav-in", newState.showMenuBar); syncShowMenuBar(newState.showMenuBar); } }, onProfile: function () { var profileLink = "/dashboard/details?template=profile" document.location.href = profileLink }, onViewDiscussions: function () { //alert("On discussions"); }, onLogOut: function () { var logoutLink = "https://login.manning.com/logout?service=https://www.manning.com/logout"; document.location.href = logoutLink } } ), $("#account-sidebar")[0] ) } var sourcePromise function getSource(){ if(sourcePromise != null) { return sourcePromise; } return sourcePromise = new Promise(function(resolve, reject){ $.getScript("/assets/settingsMenu/settings-menu-marketplace-a97275e061bfa2000492e182cf132f07.js") .done(resolve) .fail(reject) }) } var profileDataPromise; function getProfileData(){ if(profileDataPromise != null) { return profileDataPromise; } return profileDataPromise = new Promise(function(resolve, reject){ $.get("/userProfile/loadProfile") .done(function(profileData){ localStorage.setItem("showBrowseHeader", profileData.showBrowseHeader == null || profileData.showBrowseHeader); resolve(profileData) }).fail(function(e){ resolve({}) }); }); } function syncShowMenuBar(value){ localStorage.setItem("showBrowseHeader", value); $.post( "/userProfile/storeShowBrowserHeader", { value: value} ).fail(function(e){ console.log("Error when syncing show menu bar") }); } function updateBrowseHeaderForSubscribers(){ $("#browse-nav").html([ '<li><a href="https://subscription.manning.com?show-library">all</a></li>', '<li><a href="https://subscription.manning.com?show-books-library">books</a></li>', '<li><a href="https://subscription.manning.com?show-lv-library">video</a></li>', '<li><a href="https://subscription.manning.com?show-lp-library">projects</a></li>', '<li><a href="https://subscription.manning.com?show-audio" class="nav-liveaudio-button">audio books</a></li>' ].join("")); } (function(){ var showBrowseHeader = localStorage.getItem("showBrowseHeader"); if(showBrowseHeader == null || showBrowseHeader == "true"){ $("body").addClass("browse-nav-in"); } })(); </script> <div class="container content-body base-search-container" style="padding-top: 0; border-bottom: none !important;"> <div class="row"> <div class="col-xs-12"> <div class="row page-search-row"> <div class="col-xs-12 page-search-content-container" style="display:none;"></div> </div> </div> </div> </div> <div id="page-main-content-row" class="page-main-content-row"> <div class="big-liveaudio-quote"> <div class="container"> <div class="row"> <div class="col-xs-12"> <div class="liveaudio-brand"><span class="liveaudio-badge fa fa-volume-up"></span> liveAudio</div> </div> <div class="col-xs-12 col-md-6"> <p class="companion-paragraph">liveAudio integrates a high quality voice recording with the book鈥檚 text, graphics, code, and exercises in Manning鈥檚 exclusive liveBook online reader. Use the text to search and navigate the audio, or download the audio-only recording for portable offline listening. liveAudio is available exclusively at manning.com.</p> </div> <div class="col-xs-12 col-md-6"> <div id="hero-slider" class="liveaudio-carousel carousel slide" data-ride="carousel" data-interval="7000"> <div class="carousel-inner" role="listbox"> <div class="item active"> <img src="/assets/liveAudio_illustration1_transparent-0ca96a160b3fe46a9b25ecdccd5598ec.png" class="img-responsive liveaudio-illustration lazyload" loading="lazy"/> </div> <div class="item"> <img src="/assets/audioQuote1-1ba05d83b99d876778f6a29741f44875.png" class="img-responsive liveaudio-illustration lazyload" loading="lazy"/> </div> <div class="item"> <img src="/assets/liveAudio_illustration2_transparent-08e3c9cf378ec57169a959494f81d975.png" class="img-responsive liveaudio-illustration lazyload" loading="lazy"/> </div> <div class="item"> <img src="/assets/audioQuote2-1299b836b8277e1b4c44624e42f97ad4.png" class="img-responsive liveaudio-illustration lazyload" loading="lazy"/> </div> <div class="item"> <img src="/assets/liveAudio_illustration3_transparent-b4ea789e8c0c0ed23f7710036e123f61.png" class="img-responsive liveaudio-illustration lazyload" loading="lazy"/> </div> <div class="item"> <img src="/assets/audioQuote3-27e91bf924bf35d2d0a62f76b69c473e.png" class="img-responsive liveaudio-illustration lazyload" loading="lazy"/> </div> </div> </div> </div> </div> </div> </div> <div class="container content-body"> <div class="row"> <div class="col-xs-12"> <div class="liveaudio-features"> <div class="well"> <div> <strong>Synchronized voice and text in liveBook</strong> As you listen to liveAudio in liveBook, the text and graphics scroll in step with the voice recording. You can change the speed, pause, and use the text of the book to start the recording anywhere you like. </div> </div> <div class="well"> <div> <strong>Downloadable audio</strong> liveAudio books are downloadable in M4A format, so you can take them with you on your favorite listening device. </div> </div> </div> </div> </div> </div> <div id="body-container" class="main-container"> <div class="loading-container"> <i class="fa fa-spin fa-circle-notch"></i> </div> </div> <script> (function(){ function getDeploymentType(){ switch(window.searchCatalogVars.deploymentType){ case "development": case "test": return SearchCatalog.DeploymentType.dev; case "qa": return SearchCatalog.DeploymentType.qa; case "production": return SearchCatalog.DeploymentType.prod; case "docker": return SearchCatalog.DeploymentType.docker; default: console.error("Unknown deployment environment, defaulting to production"); return SearchCatalog.DeploymentType.prod; } } $.getScript(window.searchCatalogVars.jsLocation).done(function(){ var store = new SearchCatalog.SearchCatalogStore( SearchCatalog.SourceApp.livebook, getDeploymentType(), new SearchCatalog.SearchCatalogStoreProviderWeb( SearchCatalog.SourceApp.marketplace, getDeploymentType() ), SearchCatalog.Edition.Audio ); store.catalogHeaderHtml = "<a href='https://www.manning.com/'>manning.com</a></a> / audio"; if($("body").is(".logged-in")){ store.isUserLoggedIn = true; } if($("body").is(".no-subscription")){ store.isUserSubscriber = false } else if($("body").is(".subscription-expired-paused, .subscription-active")){ store.isUserSubscriber = true } else { document.addEventListener("subscription-status-loaded", function(e) { var status = e && e.detail && e.detail['status']; if (status != "ACTIVE" && status != "PAUSED") { return; } store.isUserLoggedIn = $("body").is(".logged-in"); store.isUserSubscriber = true }); } store.initialize(); function render(){ SearchCatalog.ReactDOM.render( SearchCatalog.React.createElement( SearchCatalog.SearchCatalog, { store: store } ), $("#body-container")[0] ) } render(); }); $("#body-container").on("click", ".search-catalog-pagination-root button", function(e){ window.scrollTo({top: 0, behavior: 'smooth'}); }); })(); </script> <script> function logAction(type) { var logActionsUrl = "/analytics/logUserAction"; try { $.ajax({ url: logActionsUrl, type: "GET", data: { type: type }, success: function () {}, error: function (error) { console.log(error); } }); } catch (ex) { console.log("Problem logging user action", ex) } } </script> <script> $(document).ready(function(){ if(window.searchCatalogVars){ window.searchCatalogVars.hasBeenOpened = true } }); </script> </div> <div role="contentinfo" id="footer"> <div id="minimize-footer-button" role="button" title="minimize footer"> <span class="fas fa-chevron-down" aria-hidden="true"></span> <span class="sr-only">minimize</span> </div> <div class="container"> <div class="row"> <div class="col-md-12"> <div class="row"> <div class="col-md-3 col-sm-12"> <dl> <dt>about</dt> <dd><a href="/manning">Manning</a></dd> <dd><a href="/meap-program">MEAP</a></dd> <dd><a href="/livebook-program">liveBook</a></dd> <dd><a href="/livevideo-program">liveVideo</a></dd> <dd><a href="https://liveproject.manning.com">liveProject</a></dd> <dd><a href="/liveaudio-landing">liveAudio</a></dd> <dd><a href="/ebooks">eBooks</a></dd> <dd><a href="/subscription">subscriptions</a></dd> <dd><a href="/tokens">tokens</a></dd> <dd><a href="/covers">our covers</a></dd> </dl> </div> <div class="col-md-3 col-sm-12"> <dl> <dt>info & inquiries</dt> <dd><a href="/reviews">site reviews<span class="site-review-count"></span></a></dd> <dd><a href="/user-group">user group program</a></dd> <dd><a href="/write-a-book">write a book</a></dd> <dd><a href="/create-a-liveproject">create a liveProject</a></dd> <dd><a href="/academic">academic</a></dd> <dd><a href="/distributors">distributors</a></dd> <dd><a href="/careers">careers</a></dd> <dd><a href="/manuscript-reviews">manuscript reviews</a></dd> <dd><a href="/affiliate-program">affiliate program</a></dd> <dd><a href="/news">news</a></dd> </dl> </div> <div class="col-md-3 col-sm-12"> <dl> <dt>help</dt> <dd><a href="/freebook">register pBook</a></dd> <dd><a href="/placing-an-order">placing an order</a></dd> <dd><a href="/shipping-and-returns">shipping & returns</a></dd> <dd><a href="/why-buy-from-manning">why buy from Manning?</a></dd> <dd><a href="/faq">faq</a></dd> <dd><a href="/contact">contact</a></dd> <dd><a href="/support">support</a></dd> </dl> </div> <div class="col-md-3 col-sm-12"> <dl> <dt>legal</dt> <dd><a href="/privacy">privacy</a></dd> <dd><a href="/terms-of-use">terms of use</a></dd> <dd><a href="/ebook-license">eBook license</a></dd> <dd><a href="/source-code">source code</a></dd> <dd><a href="/translations">translations</a></dd> </dl> </div> </div> </div> <div class="col-md-12"> <div class="row"> <div class="col-md-6 col-md-push-6 text-right-md"> <ul class="list-inline social-media-links"> <li><a href="/mail-preferences" tabindex="-1" data-toggle="tooltip" title="Subscribe to our Newsletter"><span class="far fa-newspaper"></span><span aria-hidden="true" class="hidden">Subscribe to our Newsletter</span></a> </li> <li><a href="https://www.linkedin.com/company/manning-publications-co/" tabindex="-1" data-toggle="tooltip" title="Manning on LinkedIn" rel="noopener" target="_blank"><span class="fab fa-linkedin-in"></span><span aria-hidden="true" class="hidden">Manning on LinkedIn</span></a> </li> <li><a href="https://www.instagram.com/manning_publications/" tabindex="-1" data-toggle="tooltip" title="Manning on Instagram" rel="noopener" target="_blank"><span class="fab fa-instagram"></span><span aria-hidden="true" class="hidden">Manning on Instagram</span></a> </li> <li><a href="https://www.facebook.com/ManningBooks?ref=nf" tabindex="-1" data-toggle="tooltip" title="Manning on Facebook" rel="noopener" target="_blank"><span class="fab fa-facebook-f"></span><span aria-hidden="true" class="hidden">Manning on Facebook</span></a> </li> <li><a href="https://twitter.com/manningbooks" tabindex="-1" data-toggle="tooltip" title="Manning on Twitter" rel="noopener" target="_blank"><span class="fab fa-twitter"></span><span aria-hidden="true" class="hidden">Manning on Twitter</span></a> </li> <li><a href="https://www.youtube.com/channel/UCDia_lkNYKLJVLRLQl_-pFw" tabindex="-1" data-toggle="tooltip" title="Manning on YouTube" rel="noopener" target="_blank"><span class="fab fa-youtube"></span><span aria-hidden="true" class="hidden">Manning on YouTube</span></a> </li> <li><a href="https://www.twitch.tv/manningpublications" tabindex="-1" data-toggle="tooltip" title="Manning on Twitch" rel="noopener" target="_blank"><span class="fab fa-twitch"></span><span aria-hidden="true" class="hidden">Manning on Twitch</span></a> </li> <li><a href="https://techhub.social/&#64;ManningPublications" tabindex="-1" data-toggle="tooltip" title="Manning on Mastodon" rel="noopener" target="_blank"><span class="fab fa-mastodon"></span><span aria-hidden="true" class="hidden">Manning on Mastodon</span></a> </li> </ul> </div> <div class="col-md-6 col-md-pull-6 text-left-md"> <div id="copyright"> &copy; 2025&nbsp;&nbsp;Manning Publications Co.&nbsp;&nbsp;<span class="hidden-xs">All rights reserved.</span> </div> </div> </div> <div class="row"> <div class="col-md-12 text-center dmca-footer"> <a href="https://www.dmcaforce.com" title="This copyright holder prohibits the use and distribution of their content from unauthorized sources. Support them by purchasing or accessing from authorized sources only. www.dmcaforce.com is the authorized DMCA Agent for this copyright holder." target="_blank" style="display: inline-block; vertical-align: middle;"><img src="https://www.dmcaforce.com/wp-content/uploads/2013/07/dmca-icon-enforced.png" alt="DMCA Enforced" width="200" height="50"/></a> </div> </div> </div> </div> </div> <script src="/assets/footer-6f2f4c0a1d29b9c2bd0d814422836837.js" /> </div> <!-- google tag manager code for promotional banner in header.gsp --> <script> var bannerPromotionGtmPayload = {}; var bannerPromotions = []; var p = 0; bannerPromotions.push({ id: '1724', name: 'Save 40 with emails', creative: 'banner', position: p++ }); bannerPromotions.push({ id: '1734', name: 'DOTD Banner', creative: 'banner', position: p++ }); bannerPromotionGtmPayload['promotions'] = bannerPromotions; $(document).trigger('promotion-gtm', bannerPromotionGtmPayload); $(document).ready(function () { $(".link-to-banner").on('click', function () { var $item = $(this); $(document).trigger('promotion-click-gtm', { promotions: [{ id: $item.data('banner-id').toString(), name: $item.data('banner-name'), position: $item.data('banner-position'), creative: 'banner' }] }); }); }); </script> <!-- Twitter universal website tag code --> <script type="text/javascript" async> $(document).trigger('twitter-init-tag'); </script> <!-- End Twitter universal website tag code --> <!-- Shopper approved review-count code --> <script async> $(document).trigger('sa-review-count'); </script> <!-- End shopper approved review-count code --> <!-- Facebook pixel --> <script async> $(document).trigger('page-view'); </script> <noscript> <img class="lazyload" loading="lazy" height="1" width="1" src="https://www.facebook.com/tr?id=1940497162877014&ev=PageView&noscript=1"/> </noscript> <!-- End Facebook Pixel Code --> <noscript> <img class="lazyload" loading="lazy" height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=1420473&fmt=gif" /> </noscript> <script type="text/javascript"> $.getScript("\u002fassets\u002fanalytics\u002fhotjar-b02672c9dafc632ff02836d97454dee2.js"); </script> <script> $(document).one("mousemove click keydown touchstart", function(){ $.getScript("/assets/analytics/bing-6ada15fe5fae6589ca2927a32d3d40e7.js", function(){ (function(w,d,t,r,u){var f,n,i;w[u]=w[u]||[],f=function(){var o={ti:"26032741"};o.q=w[u],w[u]=new UET(o),w[u].push("pageLoad")},n=d.createElement(t),n.src=r,n.async=1,n.onload=n.onreadystatechange=function(){var s=this.readyState;s&&s!=="loaded"&&s!=="complete"||(f(),n.onload=n.onreadystatechange=null)},i=d.getElementsByTagName(t)[0],i.parentNode.insertBefore(n,i)})(window,document,"script","//bat.bing.com/bat.js","uetq"); }); $.getScript("/assets/analytics/twitter-9cae03c447d02181487106a5c757d662.js"); $.getScript("/assets/analytics/reddit-3950eab301a1ef9d9bd25d1e27047643.js"); setTimeout(function(){ _linkedin_partner_id = "1420473"; window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || []; window._linkedin_data_partner_ids.push(_linkedin_partner_id); (function(){var s = document.getElementsByTagName("script")[0]; var b = document.createElement("script"); b.type = "text/javascript";b.async = true; b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js"; s.parentNode.insertBefore(b, s);})(); var postAffProScript = document.createElement("script") postAffProScript.addEventListener("load", function(){ PostAffTracker.setAccountId('default1'); try { PostAffTracker.track(); } catch (err) { } }); postAffProScript.id = "pap_x2s6df8d"; postAffProScript.src = "https://manning.postaffiliatepro.com/scripts/trackjs.js"; document.body.appendChild(postAffProScript); }, 100); }); </script> <div id="recently-viewed-drawer"> <div id="recently-viewed-toggler">RECENTLY VIEWED</div> <div id="recently-viewed-closer"> <svg aria-hidden="true" focusable="false" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 352 512"><path fill="#666" d="M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"></path></svg> </div> <div id="recently-viewed-list"> </div> </div> <script> $(function() { 'use strict'; var gtmPayload = {}; let recentlyViewed = JSON.parse(localStorage.getItem('recently-viewed')); function getRelativeTimeFrom(sourceDate){ if(window.Intl && window.Intl.RelativeTimeFormat){ var now = new Date() var dayDiff = -Math.abs(now.getDate() - sourceDate.getDate()); var formatter = new Intl.RelativeTimeFormat(); if (dayDiff === 0) { var hourDiff = -Math.abs(now.getHours() - sourceDate.getHours()); if (hourDiff === 0) { return 'within the hour'; } else { return formatter.format(hourDiff, 'hour'); } } else { return formatter.format(dayDiff, 'day'); } } else if(window.dayjs){ return dayjs(sourceDate).fromNow(); } else { return ""; } } function loadRecentlyViewed(){ if (Array.isArray(recentlyViewed)) { fillInRecentlyViewed() } } function fillInRecentlyViewed(){ if (Array.isArray(recentlyViewed)) { if (recentlyViewed.length <= 1) { document.getElementById('recently-viewed-drawer').remove(); } else { let position = 0; var impressions = []; recentlyViewed.forEach(function (product) { let item = document.createElement('a'); item.className = 'recently-viewed-product'; item.href = 'https://www.manning.com/' + product.path + '/' + product.slug; item.setAttribute('data-id', product.id); item.setAttribute('data-name', product.title); item.setAttribute('data-edition', product.edition); item.setAttribute('data-category', product.category); item.setAttribute('data-brand', product.brand); item.setAttribute('data-position', position); let img = document.createElement('img'); img.width = "100" img.height = "132" img.src = 'https://images.manning.com/100/132/resize/' + product.imageUrl; img.className = 'cover lazyload'; let title = document.createElement('div'); title.className = 'title'; title.innerHTML = product.title; if (product.viewTime) { let relativeTime = document.createElement('div'); relativeTime.className = 'relative-time'; relativeTime.innerHTML = getRelativeTimeFrom(new Date(product.viewTime)) item.appendChild(relativeTime); } item.appendChild(img); item.appendChild(title); document.getElementById('recently-viewed-list').appendChild(item); impressions.push({ id: product.id, name: product.title, edition: product.edition, category: product.category, brand: product.brand, list: 'recently-viewed-product', position: position++ }); }); gtmPayload['impressions'] = impressions; } } } if(window.Intl && window.Intl.RelativeTimeFormat){ loadRecentlyViewed(); } else { $.getScript("/assets/dayjs/dayjs-4b3b84d9ad069b307917ffc925be36c6.js", function(){ dayjs.extend(window.dayjs_plugin_relativeTime); loadRecentlyViewed(); }); } $(".recently-viewed-product").on('click', function () { var $item = $(this); $(document).trigger('impression-click-gtm', { list: 'recently-viewed-product', products: [{ id: $item.data('id').toString(), name: $item.data('name'), edition: $item.data('edition'), category: $item.data('category'), brand: $item.data('brand'), position: $item.data('position') }] }); }); $("#recently-viewed-toggler, #recently-viewed-closer").on('click', function () { document.getElementById('recently-viewed-drawer').classList.toggle('drawer-in'); }); $("#recently-viewed-toggler").one('click', function () { $(document).trigger('impression-gtm', gtmPayload); }); }); </script> <!-- Hide it behind a feature toggle --> </body> <!-- end of linkedin retargetting ads script --> </html>

Pages: 1 2 3 4 5 6 7 8 9 10