CINXE.COM
Request for Proposal - O'Reilly Media
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>Request for Proposal - O'Reilly Media </title> <meta name="description" content="Looking for a new learning partner? We're interested." /> <meta name="date" content="2024-11-24" /> <meta name="search_date" content="2021-12-17" /> <meta name="search-title" content="Request for Proposal - O'Reilly Media " /> <meta name="pagename" content="Request for Proposal - O'Reilly Media " /> <meta name="site" content="O'Reilly" /> <meta name="twitter:title" content="Request for Proposal - O'Reilly Media " /> <meta name="twitter:description" content="Looking for a new learning partner? We're interested." /> <meta name="twitter:site" content="@OReillyMedia" /> <meta property="og:type" content="website" /> <meta property="og:title" content="Request for Proposal - O'Reilly Media " /> <meta name="twitter:card" content="summary" /> <meta name="twitter:image" content="https://cdn.oreillystatic.com/oreilly/images/oreilly-social-200.png" /> <meta property="og:image" content="https://cdn.oreillystatic.com/oreilly/images/oreilly-social-200.png" /> <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">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/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-general */ .hero.hero-general { background-color: #eee; } .hero.hero-general > .content h1:last-child { margin-bottom: 14px; } .hero.hero-general > .content p:last-child { margin-bottom: 14px; } @media (min-width: 30em) { .hero.hero-general > .content h1 { max-width: 60%; } .hero.hero-general > .content p { max-width: 60%; } } @media (min-width: 40em) { .hero.hero-general > .content h1 { margin-top: 22px !important; } .hero.hero-general > .content p { margin-bottom: 20px; } } @media (min-width: 50em) { .hero.hero-general > .content h1 { margin-top: 22px !important; } } @media (min-width: 65em) { .hero.hero-general > .content h1 { margin-top: 22px !important; font-size: 48px !important; font-size: 3rem !important; } .hero.hero-general > .content p { max-width: 60%; margin-bottom: 20px; font-size: 32px !important; font-size: 2rem !important; line-height: 1.2em; } } @media (min-width: 68em) { } @media (min-width: 71em) { .hero.hero-general > .content p { font-size: 40px !important; font-size: 2.5rem !important; line-height: 1.2em; } } @media (min-width: 85em) { .hero.hero-general > .content h1 { font-size: 22px !important; font-size: 4rem !important; line-height: 1.08em !important; max-width: 66%; } .hero.hero-general > .content p { font-size: 40px !important; font-size: 2.5rem !important; line-height: 1.2em; max-width: 66%; } } @media (min-width: 100em) { } /* end .hero-general */ .shortDescription { padding: 34px 0 14px; } @media (min-width: 40em) { /* 640px */ .shortDescription { padding: 54px 0 34px; } } .videoRow { max-width: 640px; margin: 10px auto 20px; } .videoRow .videoContainer { box-shadow: 0 10px 20px rgba(0,0,0,.1); } .awards { margin: 40px 0 40px; } .awards-badges { display: flex; flex-direction: row; align-items: center; justify-content: space-between; margin: 0 0 20px; max-width: 600px; } .awards-badges img { display: block; width: calc(50% - 20px); max-width: 300px; } .awards-quote blockquote { display: block; margin-bottom: 8px; font-size: 22px; font-size: 1.375rem; line-height: 1.5em; font-weight: 600; } .awards-quote blockquote:before { margin-left: -.41em; display: inline-block; content: '"'; color: #222; font-weight: 600; } .awards-quote blockquote:after { display: inline-block; content: '"'; color: #222; font-weight: 600; margin-right: -.5em; } @media (min-width: 65em) { .awards { display: flex; flex-direction: row; align-items: center; justify-content: space-between; margin: 40px 0 20px; } .awards-badges { margin: 0; width: calc(66.66% - 20px); } .awards-quote { width: calc(33.33% - 20px); } } </style> <section class="hero hero-general"> <div class="content"> <h1>Requesting a proposal? <span class="nowrap">We’re interested.</span></h1> </div> </section> <section class="shortDescription introContent"> <div class="content"> <div class="shortDescription-columns"> <div class="shortDescription-col"> <p>If you’re looking for a comprehensive learning solution to help your organization continue to grow, adapt, and stay competitive, we’d like to throw our hat in the ring. O’Reilly has helped companies all over the world with their learning needs. We’ll happily give you all the information you need to make your choice <span class="nowrap">with confidence.</span></p> <p>More than 5,000 organizations, including 66% of all Fortune 100 companies, count on O’Reilly to keep their teams continuously learning and ahead of what’s next. We’re no strangers to <span class="nowrap">the process.</span></p> <div class="awards"> <figure class="awards-badges"> <img src="https://cdn.oreillystatic.com/oreilly/images/training_industry_online_library_2021.png" alt="2021 top 20 online learning library, Training Industry"> <img src="https://cdn.oreillystatic.com/oreilly/images/training_industry_it_training_2021.png" alt="2021 top 20 IT training, Training Industry"> </figure> <figure class="awards-quote"> <blockquote>The depth and breadth of content meets all levels of experience and demand.</blockquote> <figcaption>—Sanchia Masterson, L&D Business Partner, Digital & Technology, <span class="nowrap">William Hill</span></figcaption> </figure> </div> </div> <div class="shortDescription-col"> <h2 style="margin:0 0 8px; font-size: 2.5rem; line-height: 1.2em;">Submit your request for proposal</h2> <p>Complete this form to invite us to join <span class="nowrap">your RFP.</span></p> <form role="form" id="pardotForm" class="pardotForm salesforce-form" novalidate="true" method="post" data-pardot-form="lead gen form submit, rfp request, rfp form" action="https://ae.oreilly.com/l/1009792/2023-04-01/bx21"> <p class="required" aria-hidden="true">* Required fields</p> <div id="pardotForm-errorMessage" class="pardotForm-errorMessage"></div> <noscript> <p>Do you have JavaScript turned off? Sorry, but this form won’t work without it.</p> </noscript> <div class="pardotForm-split"> <div> <label for="pardotForm_first_name"><span aria-hidden="true" >*</span> First name</label> <input type="text" name="first_name" id="pardotForm_first_name" data-text="first name" autocomplete="given-name" aria-required="true" disabled > </div> <div> <label for="pardotForm_last_name"><span aria-hidden="true" >*</span> Last name</label> <input type="text" name="last_name" id="pardotForm_last_name" data-text="last name" autocomplete="family-name" aria-required="true" disabled > </div> </div> <div class="pardotForm-full"> <label for="pardotForm_email"><span aria-hidden="true" >*</span> Work email address</label> <input type="email" name="email" id="pardotForm_email" data-text="email address" autocomplete="email" aria-required="true" disabled > </div> <div class="pardotForm-full"> <label for="pardotForm_company"><span aria-hidden="true" >*</span> Company name</label> <input type="text" name="company" id="pardotForm_company" data-text="company" autocomplete="organization" aria-required="true" disabled> </div> <div class="pardotForm-full"> <label for="pardotForm_job_title"><span aria-hidden="true" >*</span> Job title</label> <input type="text" name="job_title" id="pardotForm_job_title" data-text="job title" autocomplete="organization-title" aria-required="true" disabled> </div> <div class="pardotForm-full"> <label for="pardotForm_team_size"><span aria-hidden="true" >*</span> Team size</label> <select id="pardotForm_team_size" name="team_size" aria-required="true" disabled> <option disabled selected value>- Select -</option> <option value="1-5">1–5</option> <option value="6-10">6–10</option> <option value="11-25">11–25</option> <option value="26-50">26–50</option> <option value="51-100">51–100</option> <option value="101+">101+</option> </select> </div> <div class="pardotForm-full"> <label for="pardotForm_industry"><span aria-hidden="true" >*</span> Industry</label> <select id="pardotForm_industry" name="industry" aria-required="true" disabled> <option disabled selected value>- Select -</option> <option value="Administration & Support Services">Administration & Support Services</option> <option value="Agriculture">Agriculture</option> <option value="Arts & Recreation">Arts & Recreation</option> <option value="Computers, Electronics & Hardware">Computers, Electronics & Hardware</option> <option value="Construction">Construction</option> <option value="Consulting & Professional Services">Consulting & Professional Services</option> <option value="Consumer Products">Consumer Products</option> <option value="Education">Education</option> <option value="Energy & Utilities">Energy & Utilities</option> <option value="Finance & Banking">Finance & Banking</option> <option value="Government">Government</option> <option value="Healthcare">Healthcare</option> <option value="Higher Education">Higher Education</option> <option value="Holding Companies">Holding Companies</option> <option value="Hospitality & Food Service">Hospitality & Food Service</option> <option value="Insurance">Insurance</option> <option value="Learning / Training">Learning / Training</option> <option value="Logistics / Transportation">Logistics / Transportation</option> <option value="Manufacturing">Manufacturing</option> <option value="Media / Entertainment">Media / Entertainment</option> <option value="Non-profit / Professional Association">Non-profit / Professional Association</option> <option value="Pharmaceuticals">Pharmaceuticals</option> <option value="Real Estate">Real Estate</option> <option value="Repair & Maintenance">Repair & Maintenance</option> <option value="Retail / E-Commerce">Retail / E-Commerce</option> <option value="Software">Software</option> <option value="Telecommunications">Telecommunications</option> <option value="Waste Management">Waste Management</option> <option value="Wholesale">Wholesale</option> </select> </div> <div class="pardotForm-full"> <label for="pardotForm_phone"><span aria-hidden="true" >*</span> Phone</label> <input type="text" name="phone" id="pardotForm_phone" data-text="phone" autocomplete="tel" aria-required="true" disabled> </div> <div class="pardotForm-full"> <label for="pardotForm_country"><span class="red" aria-hidden="true">*</span> Country</label> <select name="country" id="pardotForm_country" data-text="country" autocomplete="country-name" aria-required="true" disabled> <option disabled selected value>- Select country -</option> <option value="Afghanistan">Afghanistan</option> <option value="Albania">Albania</option> <option value="Algeria">Algeria</option> <option value="Andorra">Andorra</option> <option value="Angola">Angola</option> <option value="Antigua and Barbuda">Antigua and Barbuda</option> <option value="Argentina">Argentina</option> <option value="Armenia">Armenia</option> <option value="Aruba">Aruba</option> <option value="Australia">Australia</option> <option value="Austria">Austria</option> <option value="Azerbaijan">Azerbaijan</option> <option value="Bahamas">The Bahamas</option> <option value="Bahrain">Bahrain</option> <option value="Bangladesh">Bangladesh</option> <option value="Barbados">Barbados</option> <option value="Belarus">Belarus</option> <option value="Belgium">Belgium</option> <option value="Belize">Belize</option> <option value="Benin">Benin</option> <option value="Bermuda">Bermuda</option> <option value="Bhutan">Bhutan</option> <option value="Bolivia, Plurinational State of">Bolivia</option> <option value="Bosnia and Herzegovina">Bosnia and Herzegovina</option> <option value="Botswana">Botswana</option> <option value="Brazil">Brazil</option> <option value="Brunei Darussalam">Brunei</option> <option value="Bulgaria">Bulgaria</option> <option value="Burkina Faso">Burkina Faso</option> <option value="Burundi">Burundi</option> <option value="Cambodia">Cambodia</option> <option value="Cameroon">Cameroon</option> <option value="Canada">Canada</option> <option value="Cape Verde">Cape Verde</option> <option value="Central African Republic">Central African Republic</option> <option value="Chad">Chad</option> <option value="Chile">Chile</option> <option value="China">People's Republic of China</option> <option value="Colombia">Colombia</option> <option value="Comoros">Comoros</option> <option value="Congo, the Democratic Republic of the">Congo, Democratic Republic of the</option> <option value="Congo">Congo, Republic of the</option> <option value="Cook Islands">Cook Islands</option> <option value="Costa Rica">Costa Rica</option> <option value="Cote d'Ivoire">Côte d'Ivoire (Ivory Coast)</option> <option value="Croatia">Croatia</option> <option value="Cuba">Cuba</option> <option value="Cyprus">Cyprus</option> <option value="Czech Republic">Czechia</option> <option value="Denmark">Denmark</option> <option value="Djibouti">Djibouti</option> <option value="Dominica">Dominica</option> <option value="Dominican Republic">Dominican Republic</option> <option value="Ecuador">Ecuador</option> <option value="Egypt">Egypt</option> <option value="El Salvador">El Salvador</option> <option value="Equatorial Guinea">Equatorial Guinea</option> <option value="Eritrea">Eritrea</option> <option value="Estonia">Estonia</option> <option value="Swaziland">Eswatini (formerly Swaziland)</option> <option value="Ethiopia">Ethiopia</option> <option value="Fiji">Fiji</option> <option value="Finland">Finland</option> <option value="France">France</option> <option value="Gabon">Gabon</option> <option value="Gambia">The Gambia</option> <option value="Georgia">Georgia</option> <option value="Germany">Germany</option> <option value="Ghana">Ghana</option> <option value="Greece">Greece</option> <option value="Grenada">Grenada</option> <option value="Guatemala">Guatemala</option> <option value="Guinea">Guinea</option> <option value="Guinea-Bissau">Guinea-Bissau</option> <option value="Guyana">Guyana</option> <option value="Haiti">Haiti</option> <option value="Honduras">Honduras</option> <option value="Hungary">Hungary</option> <option value="Iceland">Iceland</option> <option value="India">India</option> <option value="Indonesia">Indonesia</option> <option value="Iran, Islamic Republic of">Iran</option> <option value="Iraq">Iraq</option> <option value="Ireland">Ireland</option> <option value="Israel">Israel</option> <option value="Italy">Italy</option> <option value="Jamaica">Jamaica</option> <option value="Japan">Japan</option> <option value="Jordan">Jordan</option> <option value="Kazakhstan">Kazakhstan</option> <option value="Kenya">Kenya</option> <option value="Kiribati">Kiribati</option> <option value="Korea, Democratic People's Republic of">Korea, Democratic People's Republic of</option> <option value="Korea, Republic of">Korea, Republic of</option> <option value="Kuwait">Kuwait</option> <option value="Kyrgyzstan">Kyrgyzstan</option> <option value="Lao People's Democratic Republic">Laos</option> <option value="Latvia">Latvia</option> <option value="Lebanon">Lebanon</option> <option value="Lesotho">Lesotho</option> <option value="Liberia">Liberia</option> <option value="Libyan Arab Jamahiriya">Libya</option> <option value="Liechtenstein">Liechtenstein</option> <option value="Lithuania">Lithuania</option> <option value="Luxembourg">Luxembourg</option> <option value="Macedonia, the former Yugoslav Republic of">Macedonia, Republic of</option> <option value="Madagascar">Madagascar</option> <option value="Malawi">Malawi</option> <option value="Malaysia">Malaysia</option> <option value="Maldives">Maldives</option> <option value="Mali">Mali</option> <option value="Malta">Malta</option> <option value="Mauritania">Mauritania</option> <option value="Mauritius">Mauritius</option> <option value="Mexico">Mexico</option> <option value="Federated States of Micronesia">Federated States of Micronesia</option> <option value="Moldova, Republic of">Moldova</option> <option value="Monaco">Monaco</option> <option value="Mongolia">Mongolia</option> <option value="Montenegro">Montenegro</option> <option value="Morocco">Morocco</option> <option value="Mozambique">Mozambique</option> <option value="Myanmar">Myanmar</option> <option value="Namibia">Namibia</option> <option value="Nauru">Nauru</option> <option value="Nepal">Nepal</option> <option value="Netherlands">Netherlands</option> <option value="New Zealand">New Zealand</option> <option value="Nicaragua">Nicaragua</option> <option value="Niger">Niger</option> <option value="Nigeria">Nigeria</option> <option value="Niue">Niue</option> <option value="Norway">Norway</option> <option value="Oman">Oman</option> <option value="Pakistan">Pakistan</option> <option value="Palestinian Territory, Occupied">Palestine, State of</option> <option value="Panama">Panama</option> <option value="Papua New Guinea">Papua New Guinea</option> <option value="Paraguay">Paraguay</option> <option value="Peru">Peru</option> <option value="Philippines">Philippines</option> <option value="Poland">Poland</option> <option value="Portugal">Portugal</option> <option value="Qatar">Qatar</option> <option value="Romania">Romania</option> <option value="Rwanda">Rwanda</option> <option value="Saint Kitts and Nevis">Saint Kitts and Nevis</option> <option value="Saint Lucia">Saint Lucia</option> <option value="Saint Vincent and the Grenadines">Saint Vincent and the Grenadines</option> <option value="Samoa">Samoa</option> <option value="San Marino">San Marino</option> <option value="Sao Tome and Principe">São Tomé and Príncipe</option> <option value="Saudi Arabia">Saudi Arabia</option> <option value="Senegal">Senegal</option> <option value="Serbia">Serbia</option> <option value="Seychelles">Seychelles</option> <option value="Sierra Leone">Sierra Leone</option> <option value="Singapore">Singapore</option> <option value="Slovakia">Slovakia</option> <option value="Slovenia">Slovenia</option> <option value="Solomon Islands">Solomon Islands</option> <option value="Somalia">Somalia</option> <option value="South Africa">South Africa</option> <option value="South Sudan">South Sudan</option> <option value="Spain">Spain</option> <option value="Sri Lanka">Sri Lanka</option> <option value="Sudan">Sudan</option> <option value="Suriname">Suriname</option> <option value="Sweden">Sweden</option> <option value="Switzerland">Switzerland</option> <option value="Syrian Arab Republic">Syria</option> <option value="Taiwan">Taiwan</option> <option value="Tajikistan">Tajikistan</option> <option value="Tanzania, United Republic of">Tanzania</option> <option value="Thailand">Thailand</option> <option value="Timor-Leste">Timor-Leste (East Timor)</option> <option value="Togo">Togo</option> <option value="Tonga">Tonga</option> <option value="Trinidad and Tobago">Trinidad and Tobago</option> <option value="Tunisia">Tunisia</option> <option value="Turkey">Turkey</option> <option value="Turkmenistan">Turkmenistan</option> <option value="Tuvalu">Tuvalu</option> <option value="Uganda">Uganda</option> <option value="Ukraine">Ukraine</option> <option value="United Arab Emirates">United Arab Emirates</option> <option value="United Kingdom">United Kingdom</option> <option value="United States">United States</option> <option value="Uruguay">Uruguay</option> <option value="Uzbekistan">Uzbekistan</option> <option value="Vanuatu">Vanuatu</option> <option value="Holy See (Vatican City State)">Vatican City</option> <option value="Venezuela, Bolivarian Republic of">Venezuela</option> <option value="Viet Nam">Vietnam</option> <option value="Yemen">Yemen</option> <option value="Zambia">Zambia</option> <option value="Zimbabwe">Zimbabwe</option> </select> </div> <div class="pardotForm-full us-states hidden"> <label for="pardotForm_state"><span aria-hidden="true">*</span> State</label> <select name="state" id="pardotForm_state" data-text="state" autocomplete="address-level1" disabled > <option disabled selected value>- Select state -</option> <option value="Alabama">Alabama</option> <option value="Alaska">Alaska</option> <option value="American Samoa">American Samoa</option> <option value="Arizona">Arizona</option> <option value="Arkansas">Arkansas</option> <option value="California">California</option> <option value="Colorado">Colorado</option> <option value="Connecticut">Connecticut</option> <option value="Delaware">Delaware</option> <option value="DC">District of Columbia</option> <option value="Florida">Florida</option> <option value="Georgia">Georgia</option> <option value="Guam">Guam</option> <option value="Hawaii">Hawaii</option> <option value="Idaho">Idaho</option> <option value="Illinois">Illinois</option> <option value="Indiana">Indiana</option> <option value="Iowa">Iowa</option> <option value="Kansas">Kansas</option> <option value="Kentucky">Kentucky</option> <option value="Louisiana">Louisiana</option> <option value="Maine">Maine</option> <option value="Maryland">Maryland</option> <option value="Massachusetts">Massachusetts</option> <option value="Michigan">Michigan</option> <option value="Minnesota">Minnesota</option> <option value="Mississippi">Mississippi</option> <option value="Missouri">Missouri</option> <option value="Montana">Montana</option> <option value="Nebraska">Nebraska</option> <option value="Nevada">Nevada</option> <option value="New Hampshire">New Hampshire</option> <option value="New Jersey">New Jersey</option> <option value="New Mexico">New Mexico</option> <option value="New York">New York</option> <option value="North Carolina">North Carolina</option> <option value="North Dakota">North Dakota</option> <option value="Northern Mariana Islands">Northern Mariana Islands</option> <option value="Ohio">Ohio</option> <option value="Oklahoma">Oklahoma</option> <option value="Oregon">Oregon</option> <option value="Pennsylvania">Pennsylvania</option> <option value="Puerto Rico">Puerto Rico</option> <option value="Rhode Island">Rhode Island</option> <option value="South Carolina">South Carolina</option> <option value="South Dakota">South Dakota</option> <option value="Tennessee">Tennessee</option> <option value="Texas">Texas</option> <option value="US Virgin Islands">U.S. Virgin Islands</option> <option value="Utah">Utah</option> <option value="Vermont">Vermont</option> <option value="Virginia">Virginia</option> <option value="Washington">Washington</option> <option value="West Virginia">West Virginia</option> <option value="Wisconsin">Wisconsin</option> <option value="Wyoming">Wyoming</option> </select> </div> <div class="pardotForm-full option-select gdpr-consent hidden"></div> <div class="pardotForm-full"> <label for="pardotForm_reason_for_rfp">Reason for the RFP (max 400 characters)</label> <textarea id="pardotForm_reason_for_rfp" name="reason_for_rfp" rows="3" maxlength="400" disabled></textarea> </div> <div class="pardotForm-full"> <label for="pardotForm_requested_response_by">Requested response by</label> <input id="pardotForm_requested_response_by" name="requested_response_by" maxlength="2000" type="date" disabled> </div> <input type="hidden" name="marketing_consent_context" value="rfp request"> <div class="pardotForm-full"> <button type="submit" class="pardotForm-cta" onclick="return verif('pardotForm');" value="Submit" disabled> Send request </button> </div> <p class="pardotForm-privacy"> <a href="https://www.oreilly.com/oreilly/privacy.html">Please read our <span class="nowrap">privacy policy</span></a>. </p> </form> <div id="pardotForm-thankyou" class="pardotForm-thankyou hidden"> <h2>Thanks for your interest in O’Reilly’s custom learning solutions.</h2> <p>You’ll hear from us shortly.</p> </div> <style> /* pardotForm */ .pardotForm, .pardotForm-thankyou { max-width: 600px; margin: 0 auto; font-family: 'guardian-text-oreilly', Arial, sans-serif; } .pardotForm > p { font-size: 16px; font-size: 1rem; line-height: 1.5em; margin: 0; } .pardotForm fieldset { margin: 0; padding: 0; border: 0; font-size: 100%; vertical-align: baseline; -webkit-font-smoothing: antialiased; } .pardotForm input, .pardotForm label { display: block; font-family: inherit; } .pardotForm.salesforce-form p.required { margin-top: 0; font-size: 16px; font-size: 1rem; line-height: 1.5em; margin-bottom: 8px; font-weight: 700; } .pardotForm input[type="text"], .pardotForm input[type="email"], .pardotForm input[type="date"], .pardotForm textarea { width: 100%; border: 1px solid #8b889a; padding: 10px; font-size: 16px; font-size: 1rem; padding: 0.625em 0.65em; margin: 2px 0 10px; -webkit-appearance: none; } .pardotForm .option-select input[type="radio"], .pardotForm .option-select label { display: inline-block; margin-right: 8px; } .pardotForm select { margin-bottom: 20px; padding: 0.625em 0.65em; box-sizing: border-box; -webkit-appearance: none; -moz-appearance: none; appearance: none; background: transparent url(https://cdn.oreillystatic.com/oreilly/images/inbound-aisf-select-arrow.png) right center no-repeat; color: #3D3B49; border: 1px solid #8b889a; border-radius: 0; min-height: 40px; font-size: 1rem; line-height: 1.5em; } .pardotForm select, .pardotForm .option-select { width: 100%; margin: 2px 0 10px; } .pardotForm textarea { height: auto; } .pardotForm-cta { display: inline-block; margin: 10px 0; padding: 10px 20px; border-radius: 2px; background-color: #0071eb; font-size: 18px; font-size: 1.125rem; color: #fff; font-family: 'guardian-text-oreilly', Arial, sans-serif; font-weight: 600; letter-spacing: 0.02em; text-decoration: none; white-space: nowrap; cursor: pointer; border: 0; } .pardotForm-cta:hover, .pardotForm-cta:active { opacity: 0.9; text-decoration: none; box-shadow: 0 1px 4px rgba(0,0,0,.3); color: #fff; } p.pardotForm-fillout { font-weight: bold; margin-bottom: 8px; } .pardotForm p.pardotForm-privacy { font-size: .875rem; line-height: 1.5em; } .pardotForm-thankyou h2 { font-family: 'gilroy', Arial, sans-serif; font-size: 32px; font-size: 3.2rem; line-height: 1.2em; font-weight: 600; } .pardotForm-thankyou p { font-size: 16px; font-size: 1rem; line-height: 1.5em; } @media (min-width: 40em) { .pardotForm-thankyou p { font-size: 22px; font-size: 1.375rem; line-height: 1.5em; } } @media (min-width: 28em ) and /* 448px */ (max-width: 71em ), /* px */ (min-width: 71em) { /* 1120px */ .pardotForm-split { display: flex; flex-direction: row; justify-content: space-between; width: 100%; } .pardotForm-split > div { width: calc(50% - 10px); } } @media (min-width: 37.5em) { /* 600px */ .pardotForm-text, .pardotForm, .pardotForm-thankyou { box-sizing: border-box; width: 100%; } .pardotForm-text { margin-right: 0; } } @media (min-width: 56.25em) { /* 900px */ .pardotForm-text { width: 100%; } .pardotForm, .pardotForm-thankyou { width: 100%; } } /* pardotForm error message styles */ .pardotForm input[type="text"].error, .pardotForm input[type="email"].error, .pardotForm select.error, .pardotForm .option-select.error { border-width: 2px; border-color: #e00; } .pardotForm select.error, .pardotForm .option-select.error { background-color: #fae0de; color: #e00; } .pardotForm label.error, .pardotForm-errorMessage p, .pardotForm .option-select.error legend { padding-left: 28px; color: #e00; position: relative; } .pardotForm noscript { font-weight: 600; color: #e00; position: relative; } .pardotForm noscript p { padding-left: 28px; } .pardotForm label.error:before, .pardotForm-errorMessage p:before, .pardotForm noscript p:before, .pardotForm .option-select.error legend:before { content: url('https://cdn.oreillystatic.com/images/icons/baseline-error_outline-24px.svg'); position: absolute; left: 0; } .pardotForm button { cursor: pointer; border: 0; } .pardotForm button[disabled], .pardotForm input[disabled], .pardotForm textarea[disabled], .pardotForm select[disabled] { opacity: 0.5; } /* end pardotForm */ </style> <script src="https://cdn.oreillystatic.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <script> document.addEventListener("DOMContentLoaded", function(event) { toggleFormThankYou(); enableForm(); addCountryEventListeners(); }); function toggleFormThankYou() { // show/hide form or thankyou message depending on URL parameters if (parseParams('submit') === 'true') { var formId = ('#' + parseParams('name')); toggleHidden(formId, formId + '-thankyou'); //During test only const bentoH2 = document.querySelector('#bentoSection-form > h2'); if (bentoH2) { bentoH2.remove(); } const bentoP = document.querySelector('#bentoSection-form > p'); if (bentoP) { bentoH2.remove(); } history.pushState(null, "", location.href.split("?")[0]); $('html, body').animate({ scrollTop: $(formId + '-thankyou').offset().top - 200 }, 500); // Open Qualified overlay setTimeout(function() { qualified("showFormExperience", "experience-1721175106650"); }, 1000); // End Qualified } } function parseParams(name) { name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); var regexS = "[\\?&]"+name+"=([^&#]*)"; var regex = new RegExp( regexS ); var results = regex.exec( window.location.href ); if (results === null) return ""; else return (results[1]); } function enableForm() { // enable form submit button if javascript present $('form input, form select, form textarea, form button').prop('disabled', false); } function addCountryEventListeners() { var countries = document.getElementById('pardotForm').querySelectorAll('[name="country"]'); for (i = 0; i < countries.length; i++ ) { countries[i].addEventListener('change', identifyEventTarget, false); } } function identifyEventTarget(e) { var country = e.target.value; var parentForm = e.target.closest('form'); checkOptInStatus(country, parentForm); checkForStates(country, parentForm); } function checkOptInStatus(country, parentForm) { var gdprSelect = parentForm.getElementsByClassName('gdpr-consent')[0]; var optInHtml = '\n <fieldset role="radiogroup" aria-required="true" data-text="choice for receiving O’Reilly email updates"> \n <legend>I would like to receive email updates from O’Reilly on its latest ideas, events, and offers: <strong class="red" aria-hidden="true">*</strong></legend> \n <input type="radio" name="marketing_consent" value="True"><label for="gdprYes">Yes</label> \n <input type="radio" name="marketing_consent" value="False"><label for="gdprNo">No</label> \n </fieldset>'; if (requiresConsent(country) && gdprConsentHidden(gdprSelect)) { toggleOptIn(gdprSelect, optInHtml); } else if (!requiresConsent(country) && !gdprConsentHidden(gdprSelect)) { toggleOptIn(gdprSelect, ' '); } } function requiresConsent(country) { var euCountries = ['Austria', 'Belgium', 'Bulgaria', 'China', 'Croatia', 'Republic of Cyprus', 'Czech Republic', 'Denmark', 'Estonia', 'Finland', 'France', 'Germany', 'Greece', 'Hungary', 'Iceland', 'Ireland', 'Italy', 'Latvia', 'Liechtenstein', 'Lithuania', 'Luxembourg', 'Malta', 'Netherlands', 'Norway', 'Poland', 'Portugal', 'Romania', 'Slovakia', 'Slovenia', 'Spain', 'Sweden', 'United Kingdom']; return(euCountries.indexOf(country) + 1); } function gdprConsentHidden(gdprSelect) { return gdprSelect.classList.contains('hidden') ? true : false; } function toggleOptIn(gdprSelect, optInHtml) { toggleHidden(gdprSelect); gdprSelect.innerHTML = optInHtml; checkError(gdprSelect); } function checkForStates(country, parentForm) { if (country === "United States") { stateSelect = parentForm.getElementsByClassName('us-states')[0]; document.getElementById('pardotForm_state').setAttribute('aria-required','true'); stateSelect.classList.remove('hidden'); } else { stateSelect = parentForm.getElementsByClassName('us-states')[0]; document.getElementById('pardotForm_state').removeAttribute('aria-required'); stateSelect.classList.add('hidden'); document.getElementById('pardotForm_state').value = ""; document.getElementById('pardotForm_state').selectedIndex = 0; } } function toggleHidden() { var targets = Array.prototype.slice.call(arguments); targets.forEach(function(target) { $(target).toggleClass('hidden'); }); } function checkError(arg) { if (arg.classList.contains('error')) { $(arg).removeClass('error'); } } function verif(formName) { var form = document.getElementById(formName); var formId = '#' + formName; $(formId +' .error').removeClass('error'); $('[aria-invalid$="true"]').attr('aria-invalid','false'); var errors = []; // find all elements in form that are required fields var requiredFields = $(formId + ' [aria-required$="true"]'); // loop through required fields to check if they are valid for (i = 0; i < requiredFields.length; i++) { var field = requiredFields[i]; if (fieldInvalid(field, form)) { createError(field, formId, formName, errors); }; } // If errors found, display them and prevent submit if (errors.length > 0) { displayErrors(errors, formId); return false; } // When no errors found continue... // Create hidden field for Sales_Request_Context const salesRequestContext = document.createElement("input"); salesRequestContext.type = "hidden"; salesRequestContext.name = "Sales_Request_Context"; salesRequestContext.value = window.location.host + window.location.pathname; form.appendChild(salesRequestContext); // Append URL to marketing_consent_context field form['marketing_consent_context'].value = form['marketing_consent_context'].value + " at " + window.location.host + window.location.pathname; //Add successParam to form action var successURL = encodeURIComponent(location.href.split("?")[0] + "?submit=true&name=pardotForm"); var successParam = "?success_location=" + successURL; form.action += successParam; // Send data to Qualified const formData = new FormData(form); qualified( "saveFormData", { "first_namefrom": formData.get("first_name"), "last_nameform": formData.get("last_name"), "email": formData.get("email"), "phone": formData.get("phone"), "company": formData.get("company"), "job_title": formData.get("job_title"), "country": formData.get("country"), "state": formData.get("state"), "marketing_consent_context": formData.get("marketing_consent_context"), "marketing_consent_optin": formData.get("marketing_consent"), "sales_request_context": formData.get("Sales_Request_Context"), "cta": "Submit", } ); qualified("emitFormFill", "custom"); // End Qualified return true; } function fieldInvalid(field, form) { if (field.tagName === "FIELDSET") { return (radioInvalid(field, form)) ? true : false; } else if (field.name === "email") { return (emailInvalid(form)) ? true : false; } else { return (field.value.length < 1) ? true : false; } } function radioInvalid(field, form) { var fieldsetName = field.querySelectorAll('input')[0].name; if (form[fieldsetName].value.length < 1) return true; } function emailInvalid(form) { var mail = new RegExp('@+','g'); if ( (form.email.value.length < 1) || (!mail.test(form.email.value)) ) { return true; } } function createError(field, formId, formName, errors) { if (field.tagName === 'FIELDSET') { $(formId + ' .gdpr-consent').addClass('error'); $(formId + ' .gdpr-consent fieldset input').addClass('error').attr('aria-invalid','true'); } else { $(formId + ' [name$="' + field.name + '"]').addClass('error').attr('aria-invalid','true'); } $(formId +' label[for="' + formName + '_' + field.name + '"]').addClass('error'); errors.push(field.dataset.text); return errors; } function displayErrors(errors, formId) { var errorMessage = ''; if (errors.length > 3) { errorMessage = '<p>Please fill out all required fields.</p>'; } else { errorMessage = '<p>Please enter your '; for (i = 0; i < errors.length; i++) { errorMessage += errors[i]; if (i === errors.length - 2) { errorMessage += ', and ' } else if (i < errors.length - 1) { errorMessage += ', ' } else { errorMessage += '.</p>' } } } $(formId +'-errorMessage').html(errorMessage); } </script> </div> </div> </div> </section> <section class="textSection textReverse textReverse-blueBackground featuresIndividuals-video"> <div class="content"> <div class="featuresIndividuals-videoText"> <h2>We bring a lot to the table.</h2> <p>The O’Reilly learning platform is continuously developed with one goal in mind: keeping your teams ahead of the latest technology and business trends they need to know to give your organization <span class="nowrap">every advantage.</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/27351912/partner_id/1681692?autoembed=true&entry_id=0_9nd228ht&playerId=kaltura_player_1532712340&cache_st=1532712340&width=100%&height=100%&flashvars[streamerType]=auto"></script> </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>© 2024, 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="/bdxdF5/wgY/XHI/Eb9JVw/aYLOwNS2r4zN/WRZ9AQ/HAN/pekpRbB4"></script><link rel="stylesheet" type="text/css" href="/bdxdF5/wgY/XHI/Eb9JVw/GG/clJdAQ/JHU/DIC4SMDVX"> <script src="/bdxdF5/wgY/XHI/Eb9JVw/GG/clJdAQ/WDg/cLU9Qdy4p" async defer></script> <div id="sec-overlay" style="display:none;"> <div id="sec-container"> </div> </div></body> </html>