CINXE.COM
Online Learning with O'Reilly - O'Reilly Media
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Online Learning with O'Reilly - O'Reilly Media</title> <meta name="description" content="Solve a problem, learn a programming language, develop new skills, or get started with something entirely new. See what O'Reilly can do for you." /> <meta name="date" content="2025-02-17" /> <meta name="search_date" content="2020-02-26" /> <meta name="search-title" content="Online Learning with O'Reilly - O'Reilly Media" /> <meta name="pagename" content="Online Learning with O'Reilly - O'Reilly Media" /> <meta name="site" content="O'Reilly" /> <meta name="twitter:title" content="Online Learning with O'Reilly - O'Reilly Media" /> <meta name="twitter:description" content="Solve a problem, learn a programming language, develop new skills, or get started with something entirely new. See what O'Reilly can do for you." /> <meta name="twitter:site" content="@OReillyMedia" /> <meta property="og:type" content="website" /> <meta property="og:title" content="Online Learning with O'Reilly - O'Reilly Media" /> <meta name="twitter:card" content="summary_large_image" /> <meta name="twitter:image" content="https://cdn.oreillystatic.com/oreilly/images/social_ol_individuals_1200x630.jpg" /> <meta property="og:image" content="https://cdn.oreillystatic.com/oreilly/images/social_ol_individuals_1200x630.jpg" /> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="language_name" content="English"> <meta name="native_language_name" content="English"> <meta name="format-detection" content="telephone=no"> <link rel="icon" type="image/png" href="//www.oreilly.com/favicon.ico"> <!--[if lte IE 9]> <script> 'article aside footer header main nav section time'.replace(/\w+/g,function(n){document.createElement(n)}) </script> <![endif]--> <link rel="stylesheet" type="text/css" href="https://cdn.oreillystatic.com/assets/css/2018_font_face.css" /> <link rel="stylesheet" type="text/css" href="https://cdn.oreillystatic.com/assets/css/odot-layout-20240226.css" /> <!--[if IE 9]> <style type="text/css"> #menu-toggle:checked ~ .mobile-nav { display:block; } .mobile-nav { display: none; } </style> <![endif]--> <!-- Initiate dataLayer for GA --> <script> loggedInObject = new Object(); var dataLayer = window.dataLayer || []; //Check for O'Reilly Unified logged-in status if (document.cookie.split(';').filter(function(item) { return item.indexOf('orm-jwt=') >= 0 }).length) { loggedInObject.unifiedLoggedIn = 'yes'; loggedInObject.loggedIn = 'yes'; dataLayer.push(loggedInObject); //Add 'loggedIn class to html tag const htmlTag = document.querySelector('html'); if (htmlTag !== null) { htmlTag.classList.add('loggedIn'); } } </script> <!-- Google Tag Manager --> <script>(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-5P4V6Z');</script> <!-- End Google Tag Manager --> <!-- Start VWO Async SmartCode --> <link rel="preconnect" href="https://dev.visualwebsiteoptimizer.com" /> <script type='text/javascript' id='vwoCode'> window._vwo_code || (function() { var account_id=27087, version=2.1, settings_tolerance=2000, hide_element='body', hide_element_style = 'opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important', /* DO NOT EDIT BELOW THIS LINE */ f=false,w=window,d=document,v=d.querySelector('#vwoCode'),cK='_vwo_'+account_id+'_settings',cc={};try{var c=JSON.parse(localStorage.getItem('_vwo_'+account_id+'_config'));cc=c&&typeof c==='object'?c:{}}catch(e){}var stT=cc.stT==='session'?w.sessionStorage:w.localStorage;code={use_existing_jquery:function(){return typeof use_existing_jquery!=='undefined'?use_existing_jquery:undefined},library_tolerance:function(){return typeof library_tolerance!=='undefined'?library_tolerance:undefined},settings_tolerance:function(){return cc.sT||settings_tolerance},hide_element_style:function(){return'{'+(cc.hES||hide_element_style)+'}'},hide_element:function(){if(performance.getEntriesByName('first-contentful-paint')[0]){return''}return typeof cc.hE==='string'?cc.hE:hide_element},getVersion:function(){return version},finish:function(e){if(!f){f=true;var t=d.getElementById('_vis_opt_path_hides');if(t)t.parentNode.removeChild(t);if(e)(new Image).src='https://dev.visualwebsiteoptimizer.com/ee.gif?a='+account_id+e}},finished:function(){return f},addScript:function(e){var t=d.createElement('script');t.type='text/javascript';if(e.src){t.src=e.src}else{t.text=e.text}d.getElementsByTagName('head')[0].appendChild(t)},load:function(e,t){var i=this.getSettings(),n=d.createElement('script'),r=this;t=t||{};if(i){n.textContent=i;d.getElementsByTagName('head')[0].appendChild(n);if(!w.VWO||VWO.caE){stT.removeItem(cK);r.load(e)}}else{var o=new XMLHttpRequest;o.open('GET',e,true);o.withCredentials=!t.dSC;o.responseType=t.responseType||'text';o.onload=function(){if(t.onloadCb){return t.onloadCb(o,e)}if(o.status===200){_vwo_code.addScript({text:o.responseText})}else{_vwo_code.finish('&e=loading_failure:'+e)}};o.onerror=function(){if(t.onerrorCb){return t.onerrorCb(e)}_vwo_code.finish('&e=loading_failure:'+e)};o.send()}},getSettings:function(){try{var e=stT.getItem(cK);if(!e){return}e=JSON.parse(e);if(Date.now()>e.e){stT.removeItem(cK);return}return e.s}catch(e){return}},init:function(){if(d.URL.indexOf('__vwo_disable__')>-1)return;var e=this.settings_tolerance();w._vwo_settings_timer=setTimeout(function(){_vwo_code.finish();stT.removeItem(cK)},e);var t;if(this.hide_element()!=='body'){t=d.createElement('style');var i=this.hide_element(),n=i?i+this.hide_element_style():'',r=d.getElementsByTagName('head')[0];t.setAttribute('id','_vis_opt_path_hides');v&&t.setAttribute('nonce',v.nonce);t.setAttribute('type','text/css');if(t.styleSheet)t.styleSheet.cssText=n;else t.appendChild(d.createTextNode(n));r.appendChild(t)}else{t=d.getElementsByTagName('head')[0];var n=d.createElement('div');n.style.cssText='z-index: 2147483647 !important;position: fixed !important;left: 0 !important;top: 0 !important;width: 100% !important;height: 100% !important;background: white !important;';n.setAttribute('id','_vis_opt_path_hides');n.classList.add('_vis_hide_layer');t.parentNode.insertBefore(n,t.nextSibling)}var o='https://dev.visualwebsiteoptimizer.com/j.php?a='+account_id+'&u='+encodeURIComponent(d.URL)+'&vn='+version;if(w.location.search.indexOf('_vwo_xhr')!==-1){this.addScript({src:o})}else{this.load(o+'&x=true')}}};w._vwo_code=code;code.init();})(); </script> <!-- End VWO Async SmartCode --> </head> <body> <!-- Google Tag Manager (noscript) --> <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5P4V6Z" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript> <!-- End Google Tag Manager (noscript) --> <div class="skipToMain" id="skipToMain"><a href="#maincontent"><span class="skipToMain-text">Skip to main content</span></a></div> <header role="banner"> <div class="content"> <nav role="navigation" aria-label="site sections"> <a href="https://www.oreilly.com" class="logo" title="home page"><img src="https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red.svg" onerror="this.src='https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red_@2x.png'; this.onerror=null;" alt="O'Reilly home"></a> <button id="mobileNavButton" class="mobileNavButton mobileNavButton--collapse mobileNavButton--3dx" type="button" aria-expanded="false" aria-controls="menuList"> <span class="mobileNavButton-box"> <span class="mobileNavButton-inner"></span> </span> </button> <ul id="menuList" class="menuList mobileHidden "> <li class="menuList-itemsP1"> <ul> <li class="menuList-item menuList-signIn"><a id="nav-signIn" href="https://www.oreilly.com/member/login/">Sign In</a></li> <li class="menuList-item menuList-tryNow"><a id="nav-tryNow" class="menuList-cta" href="https://www.oreilly.com/online-learning/try-now.html">Try Now</a></li> <li class="menuList-item menuList-platform"><a id="nav-platform" class="menuList-cta" href="https://www.oreilly.com/member/login/">O’Reilly Platform</a></li> </ul> </li> <li class="menuList-itemsP2"> <ul> <li class="menuList-item menuList-itemWithSub"><a href="https://www.oreilly.com/online-learning/teams.html">Teams</a> <ul class="menuList-subList"> <li class="menuList-subItem menuList-extra"><a href="https://www.oreilly.com/online-learning/teams.html">For business</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/government.html">For government</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/academic.html">For higher ed</a></li> </ul> </li> <li class="menuList-item"><a href="https://www.oreilly.com/online-learning/individuals.html" aria-current="page">Individuals</a></li> <li class="menuList-item menuList-itemWithSub"><a href="https://www.oreilly.com/online-learning/features.html">Features</a> <ul class="menuList-subList"> <li class="menuList-subItem menuList-extra"><a href="https://www.oreilly.com/online-learning/features.html">All features</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/courses.html">Courses</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/feature-certification.html">Certifications</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/intro-interactive-learning.html">Interactive learning</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/live-events.html">Live events</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/feature-answers.html">Answers</a></li> <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/insights-dashboard.html">Insights reporting</a></li> </ul> </li> <li class="menuList-item"><a href="https://www.oreilly.com/online-learning/pricing.html">Plans</a></li> <li class="menuList-item"><a href="https://www.oreilly.com/radar/">Blog</a></li> <li class="menuList-item" id="nav-forMarketers"><a href="https://www.oreilly.com/content-marketing-solutions.html">Content sponsorship</a></li> <li class="menuList-item menuList-item-search" id="nav-search"> <form id="js-searchForm" class="searchForm" action="https://www.oreilly.com/search/"><input id="search" type="search" name="query" placeholder="Explore our content" autocomplete="off" required=""><button id="js-searchCloseButton" class="navSearchCloseButton">Close</button></form> <button id="js-searchButton" class="navSearchButton">Search</button> </li> </ul> </li> </ul> </nav> </div> </header> <main role="main" id="maincontent"> <style> /* .hero-individuals */ .hero.hero-individuals { background-color: #eee; } .hero.hero-individuals:before { content: ""; display: block; position: absolute; z-index: 0; height: 100%; width: 100%; background-color: #0045ff; background-image: url(https://cdn.oreillystatic.com/oreilly/images/odot-individuals-800x600.jpg); background-position: right top; background-repeat: no-repeat; background-size: cover; } .hero.hero-individuals > .content h1:last-child { margin-bottom: 14px; } .hero.hero-individuals > .content p:last-child { margin-bottom: 14px; } @media (min-width: 30em) { .hero.hero-individuals > .content h1 { max-width: 60%; } .hero.hero-individuals > .content p { max-width: 60%; } } @media (min-width: 40em) { .hero.hero-individuals > .content h1 { margin-top: 22px !important; } .hero.hero-individuals > .content p { margin-bottom: 20px; } } @media (min-width: 50em) { .hero.hero-individuals:before { background-image: url(https://cdn.oreillystatic.com/oreilly/images/odot-individuals-1364x420.jpg); right: 0; } .hero.hero-individuals > .content h1 { margin-top: 22px !important; } } @media (min-width: 65em) { .hero.hero-individuals:before { background-size: cover; background-position: right top; } .hero.hero-individuals > .content h1 { margin-top: 22px !important; font-size: 48px !important; font-size: 3rem !important; } .hero.hero-individuals > .content p { max-width: 40%; margin-bottom: 20px; font-size: 32px !important; font-size: 2rem !important; line-height: 1.2em; } } @media (min-width: 68em) { .hero.hero-individuals:before { background-image: url(https://cdn.oreillystatic.com/oreilly/images/odot-individuals-1364x420.jpg); } } @media (min-width: 71em) { .hero.hero-individuals > .content p { font-size: 40px !important; font-size: 2.5rem !important; line-height: 1.2em; } } @media (min-width: 85em) { .hero.hero-individuals > .content h1 { font-size: 22px !important; font-size: 4rem !important; line-height: 1.08em !important; max-width: 50%; } .hero.hero-individuals > .content p { font-size: 40px !important; font-size: 2.5rem !important; line-height: 1.2em; max-width: 50%; } } @media (min-width: 100em) { .hero.hero-individuals:before { width: 1600px; left: 50%; margin-left: -800px; background-size: 1600px; background-position: center top; } } /* end .hero-individuals */ .ctaRow-cta:first-of-type { margin: 0 20px 20px 0; } .shortDescription-cta:first-of-type { margin: 0 20px 20px 0; } .shortDescription-cta.secondaryCTA { margin-bottom: 20px; border: 1px solid #ee0000; color: #ee0000; background: #fff; } .shortDescription-cta.secondaryCTA:after { background: transparent url(https://cdn.oreillystatic.com/images/icons/icon_right_arrow_red.svg) center center no-repeat; } @media (min-width: 53em) { .ctaRow-cta { margin: 0 10px; } .shortDescription-cta:first-of-type { margin: 0 0 20px 0; } } .shortDescription { padding: 34px 0 14px; } .shortDescription.introContent .shortDescription-col.multiCTA h3 { margin: 0 0 8px; max-width: 880px; font-size: 24px; font-size: 1.5rem; line-height: 1.4em; font-family: 'gilroy', Arial, sans-serif; font-weight: 600; letter-spacing: 0; } .shortDescription.introContent .shortDescription-col.multiCTA h4 { margin-bottom: 8px; max-width: 880px; font-size: 20px; font-size: 1.25rem; line-height: 1.5em; font-weight: 400; } .shortDescription-col.multiCTA .multiCTA-group:not(:last-of-type) { margin-bottom: 30px; padding-bottom: 20px; border-bottom: 1px solid #ddd; } @media (min-width: 40em) { /* 640px */ .shortDescription { padding: 54px 0 34px; } .shortDescription.introContent .shortDescription-col.multiCTA h3 { margin: 0 0 12px; font-size: 28px; font-size: 1.75rem; line-height: 1.3em; } .shortDescription.introContent .shortDescription-col.multiCTA h4 { font-size: 22px; font-size: 1.375rem; line-height: 1.5em; margin-bottom: 12px; } } @media (min-width: 53em) { /* 848px */ .shortDescription { padding: 54px 0 34px; } } /* .callOuts */ .callOuts { padding: 0; } .callOuts h2, .callOuts h3 { margin-bottom: 12px; font-family: 'gilroy', Arial, sans-serif; font-size: 24px; font-size: 1.5rem; line-height: 1.3em; font-weight: 600; } .callOuts-text { position: relative; padding-left: 24px; margin-bottom: 20px; } .callOuts-text:before { content: ""; position: absolute; top: 6px; left: 0; height: 120px; max-height: 100%; width: 4px; background: #0045ff; background: linear-gradient(0deg, #00cb89 0%, #0045ff 100%); } .callOuts-text p { margin-bottom: 20px; max-width: 880px; font-size: 16px; font-size: 1rem; line-height: 1.5em; } @media (min-width: 40em) { /* 640px */ .calloutSection { padding: 54px 0 34px; } .callOuts h2, .callOuts h3 { font-size: 40px; font-size: 2.5rem; line-height: 1.2em; } .callOuts-text p { font-size: 22px; font-size: 1.375rem; line-height: 1.5em; } } @media (min-width: 60em) { /* 960px */ .callOuts { display: flex; flex-direction: row; flex-wrap: wrap; justify-content: space-between; } .callOuts-text { width: calc(50% - 40px); } } </style> <section class="hero hero-individuals"> <div class="content"> <h1>Future-proof <span class="nowrap">your career</span></h1> <p>Give yourself every advantage</p> </div> </section> <section class="shortDescription introContent"> <div class="content"> <div class="shortDescription-col"> <p>The only thing that separates you from your competition is knowledge. Do you know how to deploy using Kubernetes? Can you design, build, and maintain a modern infrastructure that’s distributed, intelligent, and predictive? Can you use Python to wrangle gobs of data, and implement AI and ML to generate real insights? Do you hold a certification that proves <span class="nowrap">your proficiency?</span></p> <p>O’Reilly is your answer to all of these questions and more. Like we are for 2.8 million business and technology professionals who count on us to help them stay ahead. It’s time for you to learn what they already know. Check out the <a href="https://www.oreilly.com/online-learning/features.html">Features page</a> to see all the ways we help you <span class="nowrap">become indispensable.</span></p> </div> <div class="shortDescription-col multiCTA"> <div class="multiCTA-group"> <h3 style="margin:0 0 8px; font-size: 2.5rem; line-height: 1.2em;">Start learning now</h3> <h4>Sign up for a 10-day free trial with unlimited access to O’Reilly.</h4> <a href="https://learning.oreilly.com/start-trial/" class="shortDescription-cta" id="shortDescription-cta-freeTrial">Try it free</a> <a href="https://learning.oreilly.com/signup/" class="shortDescription-cta secondaryCTA" id="shortDescription-cta-becomeMember">Become a member now</a> </div> <!-- <div class="multiCTA-group"> <h4>Sign up for a 10-day free trial with unlimited access to O’Reilly.</h4> <a href="https://learning.oreilly.com/start-trial/" class="shortDescription-cta" id="shortDescription-cta-freeTrial">Try it free</a> </div> --> </div> </div> </section> <section class="textSection textReverse textReverse-blueBackground featuresIndividuals-video"> <div class="content"> <div class="featuresIndividuals-videoText"> <h2>See what worked for them—make it work <span class="nowrap">for you</span></h2> <p>Don’t just take our word for it—let our members tell you how O’Reilly helps them focus on the topics that matter, so they can build the knowledge and skills they need to stay ahead of <span class="nowrap">the curve.</span></p> </div> <div class="featuresIndividuals-videoPlayer"> <div class="videoContainer videoContainer-kaltura"> <script src="https://cdnapisec.kaltura.com/p/1681692/sp/168169200/embedIframeJs/uiconf_id/24975532/partner_id/1681692?autoembed=true&entry_id=0_7frpx61v&playerId=kaltura_player_1553035552&cache_st=1553035552&width=400&height=333"></script> </div> </div> </div> </section> <section class="shortDescription sectionBreak callOutSection"> <div class="content"> <div class="callOuts"> <div class="callOuts-text"> <h3>Get certified. <span class="nowrap">Earn more.</span></h3> <p>The more certifications you have, the more you stand out—and the better your leverage in salary negotiations. We make it easier to get certified with paths to the official materials and interactive practice tests that teach you as <span class="nowrap">you go.</span></p> </div> <div class="callOuts-text"> <h3>Live online courses from today’s <span class="nowrap">top minds</span></h3> <p>Our live virtual courses, including our topic-specific Superstream events, are led by some of today’s most renowned tech experts. You can ask questions during most sessions, and sizes are kept smaller for a more <span class="nowrap">personal experience.</p> </div> <div class="callOuts-text"> <h3>Hands-on experience in a live dev environment</h3> <p>The best way to learn a new technology is to dive in and start using it. O’Reilly interactive learning lets you do just that with Python, Kubernetes, Docker, Java, Linux, SQL, and more. Right from <span class="nowrap">your browser.</span></p> </div> <div class="callOuts-text"> <h3>Take O’Reilly wherever <span class="nowrap">you go</span></h3> <p>60K+ titles including early release books, 30K+ hours of video, live online courses, case studies, expert playlists, and more. Start learning with any of it on your laptop, then pick up where you left off with the O’Reilly app. Even when you don’t have <span class="nowrap">a signal.</span></p> </div> </div> </div> </section> </main> <footer id="footer" class="footer"> <div class="content"> <div class="footer-main" aria-label="company info"> <div class="footer-mainLeft"> <div class="footer-mainLeftOne"> <div class="footer-approach"> <h2 class="footer-header"><a href="/about/">About O’Reilly</a></h2> <ul class="footer-links"> <li><a href="/work-with-us.html">Teach/write/train</a></li> <li><a href="/careers/">Careers</a></li> <li><a href="/press/">O’Reilly news</a></li> <li><a href="/press/media-coverage.html">Media coverage</a></li> <li><a href="/partner/signup.csp">Community partners</a></li> <li><a href="/affiliates/">Affiliate program</a></li> <li><a href="/online-learning/rfp.html">Submit an RFP</a></li> <li><a href="/diversity/">Diversity</a></li> <li><a href="/content-marketing-solutions.html" id="footerSponsorshipLink">O’Reilly for marketers</a></li> </ul> </div> </div> <div class="footer-mainLeftTwo"> <div class="footer-contact"> <h2 class="footer-header"><a href="/online-learning/support/">Support</a></h2> <ul class="footer-links"> <li><a href="/about/contact.html">Contact us</a></li> <li><a href="/emails/newsletters/">Newsletters</a></li> <li><a href="/privacy.html">Privacy policy</a></li> <li><a href="/about/oreilly-approach-to-generative-ai.html">AI policy</a></li> </ul> <a href="https://www.linkedin.com/company/oreilly-media" target="_blank"><svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32.25 32.25"><defs><style>.cls-1{fill:#d30000;fill-rule:evenodd;}</style></defs><title>linkedin-logo</title><path class="cls-1" d="M17.43,13.53v0l0,0ZM16.12,0A16.13,16.13,0,1,0,32.25,16.12,16.12,16.12,0,0,0,16.12,0ZM11.77,22.92H8.12v-11h3.65ZM9.94,10.44h0a1.89,1.89,0,0,1-2-1.89A1.91,1.91,0,0,1,10,6.65a1.9,1.9,0,1,1,0,3.79Zm15,12.48H21.28V17.05c0-1.48-.53-2.49-1.85-2.49a2,2,0,0,0-1.88,1.34,2.63,2.63,0,0,0-.12.89v6.13H13.79s.05-10,0-11h3.64V13.5a3.63,3.63,0,0,1,3.29-1.82c2.4,0,4.21,1.57,4.21,4.95Z"/></svg></a> <a href="https://www.youtube.com/user/OreillyMedia" target="_blank"><svg data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32.25 32.25"><defs><style>.cls-1{fill:#d30000;fill-rule:evenodd;}</style></defs><title>youtube-logo</title><path class="cls-1" d="M18.35,18.68a.89.89,0,0,0-.86.63V16.94h-1v7.59h1v-.59a.92.92,0,0,0,.89.74c.52,0,.86-.36,1-1.07a8.56,8.56,0,0,0,.14-1.9,10.47,10.47,0,0,0-.12-1.93C19.21,19.05,18.87,18.68,18.35,18.68Zm.09,4.14c-.05.52-.2.77-.45.77s-.43-.21-.49-.63a7.22,7.22,0,0,1,0-1c0-.72,0-1.14,0-1.26.07-.58.23-.88.51-.88s.4.27.46.79c0,.09,0,.47,0,1.13S18.46,22.71,18.44,22.82ZM8.61,18.19H9.86v6.34H11V18.19H12.2V16.94H8.61Zm7.71-6.12c.27,0,.43-.22.49-.66,0-.09,0-.45,0-1.07V9.78c0-.58,0-.93,0-1-.07-.43-.23-.65-.48-.65s-.41.19-.48.57a8.79,8.79,0,0,0,0,1v.53c0,.71,0,1.09,0,1.16C15.88,11.82,16.05,12.07,16.32,12.07Zm-1.74,10.4a2.92,2.92,0,0,1-.06.71c-.07.25-.2.37-.4.37s-.32-.11-.38-.34a2.63,2.63,0,0,1-.05-.66V18.83h-1v4.48c0,.91.33,1.37,1,1.37A1,1,0,0,0,14.6,24v.57h1v-5.7h-1Zm7.1-3.79a1.35,1.35,0,0,0-1.22.59,2.48,2.48,0,0,0-.3,1.07c0,.23,0,.61,0,1.16s0,1.13,0,1.37a2.93,2.93,0,0,0,.35,1.27,1.25,1.25,0,0,0,1.14.54,1.36,1.36,0,0,0,1.13-.45,2.29,2.29,0,0,0,.37-1.43s0-.07,0-.11v-.12h-1c0,.75-.17,1.12-.51,1.12s-.38-.18-.45-.56a4.68,4.68,0,0,1-.06-.9c0-.18,0-.31,0-.37h2v-.43a4.86,4.86,0,0,0-.3-2.11A1.28,1.28,0,0,0,21.68,18.68ZM22.15,21h-1c0-.05,0-.11,0-.16v-.08a1.64,1.64,0,0,1,.11-.8.39.39,0,0,1,.38-.23.42.42,0,0,1,.43.33,2.32,2.32,0,0,1,.07.7Zm-6-21A16.13,16.13,0,1,0,32.25,16.12,16.12,16.12,0,0,0,16.12,0Zm2.51,7.2h1V11a2.52,2.52,0,0,0,.06.66c.06.23.18.34.38.34s.34-.12.41-.37a3.76,3.76,0,0,0,.05-.71V7.2h1v5.74h-1v-.57a1,1,0,0,1-.93.72c-.66,0-1-.46-1-1.38ZM15,8a1.29,1.29,0,0,1,1.33-.92A1.3,1.3,0,0,1,17.65,8a6.77,6.77,0,0,1,.23,2.1,6.77,6.77,0,0,1-.23,2.1,1.3,1.3,0,0,1-1.32.92A1.29,1.29,0,0,1,15,12.17a6.77,6.77,0,0,1-.23-2.1A6.86,6.86,0,0,1,15,8ZM11.45,5.3l.89,2.87.88-2.87H14.4L12.88,9.7v3.24h-1.1V9.7L10.24,5.3ZM24.93,23.91a3,3,0,0,1-3,3h-12a3,3,0,0,1-3-3V18.05a3,3,0,0,1,3-3h12a3,3,0,0,1,3,3Z"/></svg></a> </div> <div class="footer-international"> <h2 class="footer-header">International</h2> <ul class="footer-links"> <li><a href="https://www.oreilly.com/anz/">Australia & New Zealand</a></li> <li><a href="https://oreilly.hk/">Hong Kong & Taiwan</a></li> <li><a href="https://oreillylearning.in/">India</a></li> <li><a href="https://oreilly.id/">Indonesia</a></li> <li><a href="https://www.oreilly.co.jp/index.shtml">Japan</a></li> </ul> </div> </div> </div> <div class="footer-download" id="download-info"> <h2 class="footer-header">Download the O’Reilly App</h2> <p>Take O’Reilly with you and learn anywhere, anytime on your phone <span class="nowrap">and tablet.</span></p> <div class="footer-downloadLinks"> <a href="https://itunes.apple.com/us/app/safari-to-go/id881697395"><img src="https://cdn.oreillystatic.com/oreilly/images/app-store-logo.png" alt="Apple app store" /></a> <a href="https://play.google.com/store/apps/details?id=com.safariflow.queue"><img src="https://cdn.oreillystatic.com/oreilly/images/google-play-logo.png" alt="Google play store" /></a> </div> </div> <div class="footer-download" id="tv-info"> <h2 class="footer-header">Watch on your big screen</h2> <p>View all O’Reilly videos, Superstream events, and Meet the Expert sessions on your <span class="nowrap">home TV.</span></p> <div class="footer-downloadLinks"> <a href="https://channelstore.roku.com/details/c8a2d0096693eb9455f6ac165003ee06/oreilly"><img src="https://cdn.oreillystatic.com/oreilly/images/roku-tv-logo.png" alt="Roku Players and TVs" /></a> <a href="https://www.amazon.com/OReilly-Media-Inc/dp/B087YYHL5C/ref=sr_1_2?dchild=1&keywords=oreilly&qid=1604964116&s=mobile-apps&sr=1-2"><img src="https://cdn.oreillystatic.com/oreilly/images/amazon-appstore-logo.png" alt="Amazon appstore" /></a> </div> </div> <div class="footer-donotsell" id="donotsell-info"> <h2 class="footer-header"><a href="https://www.oreilly.com/privacy.html?donotsell=show">Do not sell or share my personal information</a></h2> </div> </div> <div class="footer-subfooter"> <a href="https://www.oreilly.com" title="home page" aria-current="page"> <img class="footer-subfooterLogo" id="footer-subfooterLogo" src="https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red.svg" onerror="this.src='https://cdn.oreillystatic.com/images/sitewide-headers/oreilly_logo_mark_red_@2x.png'; this.onerror=null;" alt="O'Reilly home"> </a> <p>© 2025, O’Reilly Media, Inc. All trademarks and registered trademarks appearing on oreilly.com are the property of their respective owners.</p> <p><a href="/terms/">Terms of service</a> • <a href="/privacy.html">Privacy policy</a> • <a href="/about/editorial_independence.html">Editorial independence</a><span class="transparencyStatement" style="display:none;"> • <a href="/modern-slavery-act-transparency-statement.html">Modern Slavery Act Statement</a></span></p> </div> </div> </footer> <script src="https://cdn.oreillystatic.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script> <script> $(function() { //Toggle isActive and mobileHidden classes for mobileNavButton $('nav #mobileNavButton').on('click', function() { var expanded = $(this).attr('aria-expanded') === 'true' || false; $(this).attr('aria-expanded', !expanded); $(this).toggleClass("isActive"); $(this).next().toggleClass("mobileHidden"); }); //Toggle isFocused class for keyboard navigation of submenus $('nav #menuList .menuList-subItem a').each(function(navItem) { $(this).on('focus', function() { $(this).parent().parent().toggleClass('isFocused'); }); $(this).on('blur', function() { $(this).parent().parent().toggleClass('isFocused'); }); }); //Toggle mobileHidden class accordian elements $('.mobileAccordian').each(function() { var $btn = $(this).find('button'); var $target = $(this).next(); $btn.on('click', function() { var expanded = $btn.attr('aria-expanded') === 'true' || false; $btn.attr('aria-expanded', !expanded); $target.toggleClass("mobileHidden"); }); }); //Search platform form action function searchSubmit(e) { e.preventDefault(); sParameter = searchForm.search.value; sParameter = encodeURIComponent(sParameter.trim()); sURL = searchForm.action + '?query=' + sParameter; window.location = sURL; //GA event for search dataLayer.push({ 'event': 'eventTracker', 'eventCat':'site search', 'eventAct':'search box', 'eventLbl':'explore our content', 'eventVal':0, 'nonInteraction': 0, }); } const searchForm = document.getElementById('js-searchForm'); searchForm.addEventListener('submit', searchSubmit); //Search button action function showNavSearch(e) { $('.menuList-item-search').addClass('overlay'); $('.menuList-item-search input#search').focus(); } const searchButton = document.getElementById('js-searchButton'); searchButton.addEventListener('click', showNavSearch); //Close search button action function hideNavSearch(e) { $('.menuList-item-search').removeClass('overlay'); } const searchCloseButton = document.getElementById('js-searchCloseButton'); searchCloseButton.addEventListener('click', hideNavSearch); //"Try Now" nav button tracking $('#nav-tryNow').on('click', function() { dataLayer.push({ 'event': 'eventTracker', 'eventCat':'marketing', 'eventAct':'nav', 'eventLbl':'try now', 'eventVal':0, 'nonInteraction': 0, }); }); //"Sign in" nav button tracking $('#nav-signIn').on('click', function() { dataLayer.push({ 'event': 'eventTracker', 'eventCat':'marketing', 'eventAct':'nav', 'eventLbl':'sign in', 'eventVal':0, 'nonInteraction': 0, }); }); //"O'Reilly Platform" nav button tracking $('#nav-platform').on('click', function() { dataLayer.push({ 'event': 'eventTracker', 'eventCat':'marketing', 'eventAct':'nav', 'eventLbl':'oreilly platform', 'eventVal':0, 'nonInteraction': 0, }); }); }); (function(document, history, location) { var HISTORY_SUPPORT = !!(history && history.pushState); FIXED_HEADER_HEIGHT = document.querySelector('body > header').offsetHeight; FIXED_HEADER_HEIGHT += 20; var anchorScrolls = { ANCHOR_REGEX: /^#[^ ]+$/, OFFSET_HEIGHT_PX: FIXED_HEADER_HEIGHT, /** * Establish events, and fix initial scroll position if a hash is provided. */ init: function() { this.scrollToCurrent(); window.addEventListener('hashchange', this.scrollToCurrent.bind(this)); document.body.addEventListener('click', this.delegateAnchors.bind(this)); }, /** * Return the offset amount to deduct from the normal scroll position. * Modify as appropriate to allow for dynamic calculations */ getFixedOffset: function() { return this.OFFSET_HEIGHT_PX; }, /** * If the provided href is an anchor which resolves to an element on the * page, scroll to it. * @param {String} href * @return {Boolean} - Was the href an anchor. */ scrollIfAnchor: function(href, pushToHistory) { var match, rect, anchorOffset; if(!this.ANCHOR_REGEX.test(href)) { return false; } match = document.getElementById(href.slice(1)); if(match) { rect = match.getBoundingClientRect(); anchorOffset = window.pageYOffset + rect.top - this.getFixedOffset(); // Wait 1ms and scroll. It wasn't consistently scrolling immediately. setTimeout(function(){ window.scroll(window.pageXOffset, anchorOffset); }, 1); // Add the state to history as-per normal anchor links if(HISTORY_SUPPORT && pushToHistory) { history.pushState({}, document.title, location.pathname + href); } } return !!match; }, /** * Attempt to scroll to the current location's hash. */ scrollToCurrent: function() { this.scrollIfAnchor(window.location.hash); }, /** * If the click event's target was an anchor, fix the scroll position. */ delegateAnchors: function(e) { var elem = e.target; if( elem.nodeName === 'A' && this.scrollIfAnchor(elem.getAttribute('href'), true) ) { e.preventDefault(); } } }; window.addEventListener( 'DOMContentLoaded', anchorScrolls.init.bind(anchorScrolls) ); })(window.document, window.history, window.location); </script><script type="text/javascript" src="/rhNq5lNIuI0lo/_EQN5TzEsqDrg/M/uOitL6rkmXLN7pOJ/WlluOA/M3BwKF0/PXHgB"></script><link rel="stylesheet" type="text/css" href="/rhNq5lNIuI0lo/_EQN5TzEsqDrg/M/SJit7b/SAxgOA/cUBJARt/CB3xY"><script src="/rhNq5lNIuI0lo/_EQN5TzEsqDrg/M/SJit7b/SAxgOA/JXtFVXR/HMm0p" async defer></script><div id="sec-overlay" style="display:none;"><div id="sec-container"></div></div></body> </html>