<!DOCTYPE html>
<html lang="en">
<head>

  <meta charset="utf-8">

  	<title>Conferences - O'Reilly Media</title>
	<meta name="description" content="Transforming our in-person events to online" />
	<meta name="date" content="2020-11-09" />
	<meta name="search_date" content="2020-04-06" />
	<meta name="search-title" content="Conferences - O'Reilly Media" />
	<meta name="pagename" content="Conferences - O'Reilly Media" />
	<meta name="site" content="O'Reilly" />
	<meta name="twitter:title" content="Conferences - O'Reilly Media" />
	<meta name="twitter:description" content="Transforming our in-person events to online" />
	<meta name="twitter:site" content="@OReillyMedia" />
	<meta property="og:type" content="website" />
	<meta property="og:title" content="Conferences - 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-20201027.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);
}
</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 Visual Website Optimizer Asynchronous Code -->
<script type='text/javascript'>
var _vwo_code=(function(){
var account_id=27087,
settings_tolerance=2000,
library_tolerance=2500,
use_existing_jquery=false,
// DO NOT EDIT BELOW THIS LINE
f=false,d=document;return{use_existing_jquery:function(){return use_existing_jquery;},library_tolerance:function(){return library_tolerance;},finish:function(){if(!f){f=true;var a=d.getElementById('_vis_opt_path_hides');if(a)a.parentNode.removeChild(a);}},finished:function(){return f;},load:function(a){var b=d.createElement('script');b.src=a;b.type='text/javascript';b.innerText;b.onerror=function(){_vwo_code.finish();};d.getElementsByTagName('head')[0].appendChild(b);},init:function(){settings_timer=setTimeout('_vwo_code.finish()',settings_tolerance);var a=d.createElement('style'),b='body{opacity:0 !important;filter:alpha(opacity=0) !important;background:none !important;}',h=d.getElementsByTagName('head')[0];a.setAttribute('id','_vis_opt_path_hides');a.setAttribute('type','text/css');if(a.styleSheet)a.styleSheet.cssText=b;else a.appendChild(d.createTextNode(b));h.appendChild(a);this.load('//dev.visualwebsiteoptimizer.com/j.php?a='+account_id+'&u='+encodeURIComponent(d.URL)+'&r='+Math.random());return settings_timer;}};}());_vwo_settings_timer=_vwo_code.init();
</script>
<!-- End Visual Website Optimizer Asynchronous Code -->

</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 href="https://learning.oreilly.com/accounts/login-check/">Sign In</a></li>
              <li class="menuList-item menuList-tryNow"><a class="menuList-cta" href="https://www.oreilly.com/online-learning/try-now.html">Try Now</a></li>
            </ul>
          </li>
          <li class="menuList-itemsP2">
            <ul>
              <li class="menuList-item"><a href="https://www.oreilly.com/online-learning/teams.html">Teams</a></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"><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-online-sessions.html">Live online sessions</a></li>
                  <li class="menuList-subItem"><a href="https://www.oreilly.com/online-learning/feature-answers.html">Answers</a></li>
                </ul>
              </li>
              <li class="menuList-item"><a href="https://www.oreilly.com/whats-new.html">What&rsquo;s new</a></li>
              <li class="menuList-item menuList-forMarketers"><a href="https://www.oreilly.com/content-marketing-solutions.html">O&rsquo;Reilly for marketers</a></li>
              <li class="menuList-item menuList-item-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=""></form>
              </li>
            </ul>
          </li>
        </ul>
      </nav>
    </div>
  </header>

  <main role="main" id="maincontent">

  

<style>
.shortDescription ul {
  margin-bottom: 24px;
}
#enterpriseDemo h2 {
  font-weight: 600;
  font-size: 28px;
  font-size: 1.75rem;
}
.shortDescription-col img {
  max-width: 100%;
  margin-bottom: 20px;
}

.shortDescription-col.portrait img {
  max-height: 25em;
}
.shortDescription-col .mktoDemoForm {
  width: 100%; 
}
.textCTA-small {
  display: inline-block;
  margin-bottom: 20px;
}
.mktoDemoForm-fillout p {
  margin-bottom: 20px;
}
.katacodaScreenshot {
  position: relative;
  padding-bottom: 110px;
}
.katacodaScreenshot .technology {
  position: absolute;
  z-index: 2;
  left: calc(50% - 150px);
  bottom: 0;
  display: block;
  width: 300px;
  max-width: 100%;
}

@media (min-width: 40em) { 
  .hero.hero-general > .content p {
    margin-bottom: 20px;
  }
  .hero.hero-certifications .hero-cta {
    margin-bottom: 24px;
  }
  .shortDescription ul {
    font-size: 22px;
    font-size: 1.375rem;
    line-height: 1.5em;
    max-width: 800px;
    margin-bottom: 34px;
  }
  #enterpriseDemo h2 {
    font-size: 32px;
    font-size: 2rem;
  }
  .shortDescription ul.bullet.split-column {
       -moz-column-count: 2;
    -webkit-column-count: 2;
            column-count: 2;
       -moz-column-gap: 5%;
    -webkit-column-gap: 5%;
            column-gap: 5%;
  }
  .shortDescription ul.bullet.split-column li {
    -webkit-column-break-inside: avoid;
       -moz-column-break-inside: avoid;
              page-break-inside: avoid;
         -o-column-break-inside: avoid;
        -ms-column-break-inside: avoid;
                   break-inside: avoid;
  }
  .shortDescription .content p.note {
    font-size: 16px;
    font-size: 1rem;
  }

}
@media (min-width: 53em) { 
  .shortDescription.introContent {
      padding: 54px 0 74px;
  }
  .shortDescription-columns {
    display: flex;
    justify-content: space-between;
    flex-wrap: wrap;
  }
  .shortDescription-columns-reverse {
    flex-direction: row-reverse;
  }

  .introContent .shortDescription-col:nth-of-type(even) {
    width: 37.5%;
    width: calc(40% - 40px);
  }
  .introContent .shortDescription-col:nth-of-type(odd) {
    width: 57.5%;
    width: calc(60% - 40px);
    padding-right: 0;
  }

  .shortDescription-col:nth-of-type(even) {
    width: 37.5%;
    width: calc(40% - 40px);
  }
  .shortDescription-col:nth-of-type(odd) {
    width: 57.5%;
    width: calc(60% - 40px);
    padding-right: 0;
  }
  .shortDescription > .content > h2.multiColumnHeading {
    margin-bottom: 40px;
  }
  .textCTA-small {
    margin-bottom: 0;
  }

}
@media (min-width: 65em) {
  .hero.hero-certifications .content p {
    font-size: 32px !important;
    font-size: 2rem !important;
    line-height: 1.3em;
  }
}
@media (min-width: 71em) {
  .hero.hero-certifications .content p {
    margin-bottom: 34px;
    font-size: 40px !important;
    font-size: 2.5rem !important;
    line-height: 1.2em;
  }
  .hero.hero-certifications .hero-cta {
    margin-bottom: 34px;
  }

}
</style>


<section class="hero hero-general hero-certifications">
  <div class="content">
    <h1>Transforming our <span class="nowrap">in-person</span> events <span class="nowrap">to online</span></h1>
  </div>
</section>

<section class="shortDescription introContent">
  <div class="content">
    <div class="shortDescription-columns">

      <div class="shortDescription-col">
        <p>We&rsquo;ve made the very difficult decision to cancel all future O&rsquo;Reilly in-person conferences. Instead, we&rsquo;ll continue to invest in and grow O&rsquo;Reilly online learning, supporting the 5,000 companies and 2.5 million people who count on our experts to help them stay ahead in all facets of business <span class="nowrap">and technology.</span></p>

        <p>Come join them and learn what they already know. Become an O&rsquo;Reilly online learning member today and get innovative ways to connect with and learn from each other. Even when face-to-face gatherings <span class="nowrap">are impossible.</span></p>  
      </div>

      <div id="enterpriseDemo" class="shortDescription-col">
        <h2 style="font-weight: 100">Join us on O&rsquo;Reilly online learning for <span class="nowrap">10 days. Free.</span></h2>

        <p>Get insight into what&rsquo;s happening now. Develop skills to stay ahead of <span class="nowrap">what&rsquo;s next.</span></p>

        <a id="js-try-free" href="https://www.oreilly.com/online-learning/individuals.html" class="shortDescription-cta">Try it free</a>
      </div>

    </div>  
  </div>
</section>


<section class="shortDescription sectionBreak">
  <div class="content">
    <div class="shortDescription-columns shortDescription-columns-reverse">
      <div class="shortDescription-col">
        <h2>Topic-focused events with no boarding <span class="nowrap">pass required</span></h2>

        <p>The 2020 O&rsquo;Reilly Strata Data & AI Superstream online event gave more than 4,600 participants new insights and skills over two days of live sessions and interactive tutorials. It was our most attended online event ever. More like it <span class="nowrap">are coming.</span></p>
      </div>
      <div class="shortDescription-col">
        <img class src="https://cdn.oreillystatic.com/oreilly/images/strata-superstream-600x486.png" alt="Strata Data & AI Superstream" />
      </div>
    </div>
  </div>
</section>


<section class="shortDescription sectionBreak">
  <div class="content">
    <div class="shortDescription-columns">
      <div class="shortDescription-col">
        <h2>Live online training with today&rsquo;s <span class="nowrap">top experts</span></h2>

        <p>Get in the virtual classroom for live training courses on today&rsquo;s hottest technologies&mdash;often by the people who had a hand in creating them. Hit them up with questions along the way. Class sizes are limited to keep the learning <span class="nowrap">more personal.</span></p>
      </div>
      <div class="shortDescription-col">
        <img style="box-shadow: 0 10px 20px rgba(0,0,0,.1);" class src="https://cdn.oreillystatic.com/oreilly/images/feature-live-online-training-1600x825.jpg" alt="Live online training" />
      </div>
    </div>
  </div>
</section>


<section class="shortDescription sectionBreak">
  <div class="content">
    <div class="shortDescription-columns shortDescription-columns-reverse">
      <div class="shortDescription-col">
        <h2>Interactive learning scenarios <span class="nowrap">and sandboxes</span></h2>

        <p>There&rsquo;s no better way to learn Kubernetes, Docker, Python, Bash, and more than just diving in and using it. Now you can, with guided interactive scenarios in a live dev environment you can access through your browser. Or get into a sandbox with a technology and write, run, or edit code to really understand how <span class="nowrap">it works.</span></p>
      </div>

      <div class="shortDescription-col katacodaScreenshot">
        <img style="box-shadow: 0 10px 20px rgba(0,0,0,.1);" class="screenshot" src="https://cdn.oreillystatic.com/oreilly/images/katacoda-editor-cropped.png" alt="Katacoda Screenshot">
        <img class="technology logos" src="https://cdn.oreillystatic.com/oreilly/images/interactive-learning-logos.png" alt="Technology logos">
      </div>
    </div>
  </div>
</section>


<section class="shortDescription sectionBreak">
  <div class="content">
    <div class="shortDescription-columns">
      <div class="shortDescription-col">
        <h2>Expert playlists to guide you through nearly <span class="nowrap">any topic</span></h2>

        <p>For over 40 years, O&rsquo;Reilly experts have kept our clients ahead of the tech curve. They&rsquo;ve handpicked the exact content that&rsquo;s best for you to learn about nearly any technology or business approach. So you can follow along step-by-step, whether you&rsquo;re just getting started or you&rsquo;re already <span class="nowrap">an expert.</span></p>
      </div>
      <div class="shortDescription-col">
        <img style="box-shadow: 0 10px 20px rgba(0,0,0,.1);" class src="https://cdn.oreillystatic.com/oreilly/images/feature-expert-playlists-1600x825.jpg" alt="Expert Playlists" />
      </div>
    </div>
  </div>
</section>


<section class="shortDescription sectionBreak">
  <div class="content">
    <div class="shortDescription-columns shortDescription-columns-reverse">
      <div class="shortDescription-col">
        <h2>Get on a faster path <span class="nowrap">to certifications</span></h2>

        <p>Certifications are hands down the best way to prove your proficiency. Get direct paths to the official prep materials plus practice exams to become an AWS Certified Cloud Practitioner, Certified Information Systems Security Professional (CISSP), Microsoft Azure Administrator, <span class="nowrap">and more.</span></p>
      </div>
      <div class="shortDescription-col">
        <img src="https://cdn.oreillystatic.com/oreilly/images/cert-vendor-logos.png" alt="Certification vendor logos">
      </div>
    </div>
  </div>
</section>


<section class="shortDescription sectionBreak">
  <div class="content">
    <div class="shortDescription-columns">
      <div class="shortDescription-col">
        <h2>Dive into tons of <span class="nowrap">new content</span></h2>

        <p>We&rsquo;re always adding new books, case studies, videos, early release titles, resource centers, and so much more. And it&rsquo;s all available through our handy O&rsquo;Reilly app. So you can learn from experts on your own time, wherever <span class="nowrap">you are.</span></p>
      </div>
      <div class="shortDescription-col">
        <img src="https://cdn.oreillystatic.com/oreilly/images/devices_600x306_20200323.png" alt="graphic: multidevice">
      </div>
    </div>
  </div>
</section>


<section class="sectionBreak shortDescription">
  <div class="content">
    <h2>Join us on O&rsquo;Reilly online learning for <span class="nowrap">10 days. Free.</span></h2>

    <p>Get insight into what&rsquo;s happening now. Develop skills to stay ahead of <span class="nowrap">what&rsquo;s next.</span></p>

    <a id="js-try-free2" href="https://www.oreilly.com/online-learning/individuals.html" class="shortDescription-cta">Try it free</a>
  </div>
</section>


<section class="shortDescription textReverse textReverse-blueBackground">
  <div class="content">
    <h2>New ways for sponsors to <span class="nowrap">make connections</span></h2>

    <p>If you were looking to sponsor an O&rsquo;Reilly event for lead generation, we&rsquo;ve put together some great solutions to help drive revenue&mdash;no costly expo <span class="nowrap">booth required.</span></p>

    <a id="js-make-connections" href="https://www.oreilly.com/content-marketing-goals.html" class="proquest-cta">See how</a>
  </div>
</section>


<script>
document.addEventListener("DOMContentLoaded", function(event) {
  $('#js-try-free, #js-try-free2').on('click', function(e) {
    //Push dataLayer event for Goggle Analytics
    dataLayer.push({
      'event': 'eventTracker',
      'eventCat':'marketing',
      'eventAct':'click',
      'eventLbl':'try it free',
      'eventVal':0, 
      'nonInteraction': 0
    });
  });
  $('#js-make-connections').on('click', function(e) {
    //Push dataLayer event for Goggle Analytics
    dataLayer.push({
      'event': 'eventTracker',
      'eventCat':'marketing',
      'eventAct':'click',
      'eventLbl':'see how',
      'eventVal':0, 
      'nonInteraction': 0
    });
  });
});
</script>



  </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&rsquo;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="/partner/signup.csp">Community partners</a></li>
                <li><a href="/affiliates/">Affiliate program</a></li>
                <li><a href="/diversity/">Diversity</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>
              </ul>
            
              <a href="https://twitter.com/oreillymedia" target="_blank"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 400 400" style="enable-background:new 0 0 400 400;" xml:space="preserve"><style type="text/css">.st0{fill:#ee0000;}.st1{fill:#FFFFFF;}</style><g id="Red"><circle class="st0" cx="200" cy="200" r="200"/></g><g id="Logo__x2014__FIXED"><path class="st1" d="M163.4,305.5c88.7,0,137.2-73.5,137.2-137.2c0-2.1,0-4.2-0.1-6.2c9.4-6.8,17.6-15.3,24.1-25 c-8.6,3.8-17.9,6.4-27.7,7.6c10-6,17.6-15.4,21.2-26.7c-9.3,5.5-19.6,9.5-30.6,11.7c-8.8-9.4-21.3-15.2-35.2-15.2 c-26.6,0-48.2,21.6-48.2,48.2c0,3.8,0.4,7.5,1.3,11c-40.1-2-75.6-21.2-99.4-50.4c-4.1,7.1-6.5,15.4-6.5,24.2 c0,16.7,8.5,31.5,21.5,40.1c-7.9-0.2-15.3-2.4-21.8-6c0,0.2,0,0.4,0,0.6c0,23.4,16.6,42.8,38.7,47.3c-4,1.1-8.3,1.7-12.7,1.7 c-3.1,0-6.1-0.3-9.1-0.9c6.1,19.2,23.9,33.1,45,33.5c-16.5,12.9-37.3,20.6-59.9,20.6c-3.9,0-7.7-0.2-11.5-0.7 C110.8,297.5,136.2,305.5,163.4,305.5"/></g></svg></a>
              <a href="https://www.facebook.com/OReilly/" 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:#E00;fill-rule:evenodd;}</style></defs><title>facebook-logo</title><path class="cls-1" d="M16.13,0A16.13,16.13,0,1,0,32.25,16.12,16.13,16.13,0,0,0,16.13,0Zm5.12,9.54H19.57a1.52,1.52,0,0,0-1.51,1.51v1.14h3.19v3.42H18.06V26.12H13.57V15.61H10.69V12.19h2.88v-2a4,4,0,0,1,4-4h3.65Z"/></svg></a>
              <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:#E00;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:#E00;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>
        </div>

        <div class="footer-download" id="download-info">
          <h2 class="footer-header">Download the O&rsquo;Reilly App</h2>

          <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>

          <p>Take O&rsquo;Reilly online learning with you and learn anywhere, anytime on your phone <span class="nowrap">and tablet.</span></p>

          <ul>
            <li>Get unlimited access to books, videos, and <span class="nowrap">live training.</span></li>
            <li>Sync all your devices and never lose your place.</li>
            <li>Learn even when there&rsquo;s no signal with <span class="nowrap">offline access.</span></li>
          </ul>
        </div>
        
        <div class="footer-donotsell" id="donotsell-info">
          <h2 class="footer-header">Do not sell my personal information</h2>

          <p style="line-height: 1.5em;">Exercise your consumer rights by contacting us at <a href="mailto:donotsell@oreilly.com?subject=Do Not Sell My Personal Information Request" style="text-decoration:underline;">donotsell@oreilly.com</a>.</p>
        </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>&copy; 2020, O&rsquo;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> &bull; <a href="/privacy.html">Privacy policy</a> &bull; <a href="/about/editorial_independence.html">Editorial independence</a><span class="transparencyStatement" style="display:none;"> &bull; <a href="/2020-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.3.1/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);
  });

  (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();
          window.scrollTo(window.pageXOffset, anchorOffset);

          // 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></body>


</html>

