PageSourceSearch

https://understandingdistributed.systems/build/bundle.js

js understandingdistributed.systems collected 2026-10-07 06:10:38 UTC 55,215 bytes, 2 lines download raw bytes

1var app=function(){"use strict";function e(){}function t(e){return e()}function s(){return Object.create(null)}function n(e){e.forEach(t)}function a(e){return"function"==typeof e}function i(e,t){return e!=e?t==t:e!==t||e&&"object"==typeof e||"function"==typeof e}function o(e,t,s,n){if(e){const a=r(e,t,s,n);return e[0](a)}}function r(e,t,s,n){return e[1]&&n?function(e,t){for(const s in t)e[s]=t[s];return e}(s.ctx.slice(),e[1](n(t))):s.ctx}function l(e,t,s,n,a,i,o){const l=function(e,t,s,n){if(e[2]&&n){const a=e[2](n(s));if(void 0===t.dirty)return a;if("object"==typeof a){const e=[],s=Math.max(t.dirty.length,a.length);for(let n=0;n<s;n+=1)e[n]=t.dirty[n]|a[n];return e}return t.dirty|a}return t.dirty}(t,n,a,i);if(l){const a=r(t,s,n,o);e.p(a,l)}}function c(e,t){e.appendChild(t)}function d(e,t,s){e.insertBefore(t,s||null)}function h(e){e.parentNode.removeChild(e)}function p(e){return document.createElement(e)}function u(e){return document.createElementNS("http://www.w3.org/2000/svg",e)}function g(e){return document.createTextNode(e)}function m(){return g(" ")}function f(e,t,s){null==s?e.removeAttribute(t):e.getAttribute(t)!==s&&e.setAttribute(t,s)}function v(e,t){t=""+t,e.wholeText!==t&&(e.data=t)}let w;function y(e){w=e}const x=[],b=[],$=[],k=[],z=Promise.resolve();let q=!1;function C(e){$.push(e)}let T=!1;const I=new Set;function M(){if(!T){T=!0;do{for(let e=0;e<x.length;e+=1){const t=x[e];y(t),S(t.$$)}for(y(null),x.length=0;b.length;)b.pop()();for(let e=0;e<$.length;e+=1){const t=$[e];I.has(t)||(I.add(t),t())}$.length=0}while(x.length);for(;k.length;)k.pop()();q=!1,T=!1,I.clear()}}function S(e){if(null!==e.fragment){e.update(),n(e.before_update);const t=e.dirty;e.dirty=[-1],e.fragment&&e.fragment.p(e.ctx,t),e.after_update.forEach(C)}}const A=new Set;function P(e,t){e&&e.i&&(A.delete(e),e.i(t))}function L(e,t,s,n){if(e&&e.o){if(A.has(e))return;A.add(e),undefined.c.push((()=>{A.delete(e),n&&(s&&e.d(1),n())})),e.o(t)}}function j(e){e&&e.c()}function H(e,s,i){const{fragment:o,on_mount:r,on_destroy:l,after_update:c}=e.$$;o&&o.m(s,i),C((()=>{const s=r.map(t).filter(a);l?l.push(...s):n(s),e.$$.on_mount=[]})),c.forEach(C)}function E(e,t){const s=e.$$;null!==s.fragment&&(n(s.on_destroy),s.fragment&&s.fragment.d(t),s.on_destroy=s.fragment=null,s.ctx=[])}function B(e,t){-1===e.$$.dirty[0]&&(x.push(e),q||(q=!0,z.then(M)),e.$$.dirty.fill(0)),e.$$.dirty[t/31|0]|=1<<t%31}function W(t,a,i,o,r,l,c=[-1]){const d=w;y(t);const p=a.props||{},u=t.$$={fragment:null,ctx:null,props:l,update:e,not_equal:r,bound:s(),on_mount:[],on_destroy:[],before_update:[],after_update:[],context:new Map(d?d.$$.context:[]),callbacks:s(),dirty:c,skip_bound:!1};let g=!1;if(u.ctx=i?i(t,p,((e,s,...n)=>{const a=n.length?n[0]:s;return u.ctx&&r(u.ctx[e],u.ctx[e]=a)&&(!u.skip_bound&&u.bound[e]&&u.bound[e](a),g&&B(t,e)),s})):[],u.update(),g=!0,n(u.before_update),u.fragment=!!o&&o(u.ctx),a.target){if(a.hydrate){const e=function(e){return Array.from(e.childNodes)}(a.target);u.fragment&&u.fragment.l(e),e.forEach(h)}else u.fragment&&u.fragment.c();a.intro&&P(t.$$.fragment),H(t,a.target,a.anchor),M()}y(d)}class _{$destroy(){E(this,1),this.$destroy=e}$on(e,t){const s=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return s.push(t),()=>{const e=s.indexOf(t);-1!==e&&s.splice(e,1)}}$set(e){var t;this.$$set&&(t=e,0!==Object.keys(t).length)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}function D(t){let s;return{c(){s=p("div"),s.innerHTML='<div class="hidden lg:block lg:absolute lg:inset-0" aria-hidden="true"><svg class="absolute top-0 left-1/2 transform translate-x-64 -translate-y-8" width="640" height="784" fill="none" viewBox="0 0 640 784"><defs><pattern id="9ebea6f4-a1f5-4d96-8c4e-4c2abf658047" x="118" y="0" width="20" height="20" patternUnits="userSpaceOnUse"><rect x="0" y="0" width="4" height="4" class="text-gray-200" fill="currentColor"></rect></pattern></defs><rect y="72" width="640" height="640" class="text-gray-50" fill="currentColor"></rect><rect x="118" width="404" height="784" fill="url(#9ebea6f4-a1f5-4d96-8c4e-4c2abf658047)"></rect></svg></div> \n    <div class="relative pt-6 pb-16 sm:pb-24 lg:pb-32"><main class="mt-16 mx-auto max-w-7xl px-4 sm:mt-24 sm:px-6 lg:mt-32"><div class="lg:grid lg:grid-cols-12 lg:gap-8"><div class="sm:text-center md:max-w-2xl md:mx-auto lg:col-span-6 lg:text-left"><h1><span class="mt-1 block text-4xl tracking-tight font-extrabold sm:text-5xl xl:text-6xl"><span class="text-gray-900">Want to learn how to build</span>
1 \n                            <span class="text-yellow-600">scalable and fault-tolerant cloud applications?</span></span></h1> \n                    <p class="mt-3 text-base text-gray-500 sm:mt-5 sm:text-xl lg:text-lg xl:text-xl">This book will teach you the core principles of\n                        distributed systems so that you don’t have to spend\n                        countless hours trying to understand how everything fits\n                        together.</p> \n                    <p id="sign-up" class="text-base text-gray-500 mt-5 sm:text-xl lg:text-lg xl:text-xl">Read the first two chapters for\n                        <a class="font-medium text-gray-900 underline" href="./sample.pdf">free</a>\n                        or\n                        <a class="font-medium text-gray-900 underline" href="#get-the-book">buy now</a> if you&#39;re already convinced!</p></div> \n                <div class="mt-12 relative sm:max-w-lg sm:mx-auto lg:mt-0 lg:max-w-none lg:mx-0 lg:col-span-6 lg:flex lg:items-center"><svg class="absolute top-0 left-1/2 transform -translate-x-1/2 -translate-y-8 scale-75 origin-top sm:scale-100 lg:hidden" width="640" height="784" fill="none" viewBox="0 0 640 784" aria-hidden="true"><defs><pattern id="4f4f415c-a0e9-44c2-9601-6ded5a34a13e" x="118" y="0" width="20" height="20" patternUnits="userSpaceOnUse"><rect x="0" y="0" width="4" height="4" class="text-gray-200" fill="currentColor"></rect></pattern></defs><rect x="118" width="404" height="784" fill="url(#4f4f415c-a0e9-44c2-9601-6ded5a34a13e)"></rect></svg> \n                    <div class="relative mx-auto"><img class="w-full" src="img/mockup.png" alt=""/> \n                        <div class="text-base text-center text-gray-500 sm:text-xl lg:text-lg xl:text-xl">Rated <img class="inline -mt-1" src="img/stars.svg" alt="rating"/>\n                            on\n                            <a href="https://www.goodreads.com/book/show/60598814-understanding-distributed-systems">Goodreads</a>.</div></div></div></div></main></div>',f(s,"class","relative bg-white overflow-hidden")},m(e,t){d(e,s,t)},p:e,i:e,o:e,d(e){e&&h(s)}}}class N extends _{constructor(e){super(),W(this,e,null,D,i,{})}}function U(t){let s;return{c(){s=p("div"),s.innerHTML='<div class="hidden lg:block lg:absolute lg:inset-y-0 lg:h-full lg:w-full"><div class="relative h-full text-lg max-w-prose mx-auto" aria-hidden="true"><svg class="absolute top-12 left-full transform translate-x-32" width="404" height="384" fill="none" viewBox="0 0 404 384"><defs><pattern id="74b3fd99-0a6f-4271-bef2-e80eeafdf357" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse"><rect x="0" y="0" width="4" height="4" class="text-gray-200" fill="currentColor"></rect></pattern></defs><rect width="404" height="384" fill="url(#74b3fd99-0a6f-4271-bef2-e80eeafdf357)"></rect></svg> \n            <svg class="absolute top-1/2 right-full transform -translate-y-1/2 -translate-x-32" width="404" height="384" fill="none" viewBox="0 0 404 384"><defs><pattern id="f210dbf6-a58d-4871-961e-36d5016a0f49" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse"><rect x="0" y="0" width="4" height="4" class="text-gray-200" fill="currentColor"></rect></pattern></defs><rect width="404" height="384" fill="url(#f210dbf6-a58d-4871-961e-36d5016a0f49)"></rect></svg> \n            <svg class="absolute bottom-12 left-full transform translate-x-32" width="404" height="384" fill="none" viewBox="0 0 404 384"><defs><pattern id="d3eb07ae-5182-43e6-857d-35c643af9034" x="0" y="0" width="20" height="20" patternUnits="userSpaceOnUse"><rect x="0" y="0" width="4" height="4" class="text-gray-200" fill="currentColor"></rect></pattern></defs><rect width="404" height="384" fill="url(#d3eb07ae-5182-43e6-857d-35c643af9034)"></rect></svg></div></div> \n    <div class="relative px-4 sm:px-6 lg:px-8"><div class="text-lg max-w-prose mx-auto"><h1><span class="mt-2 block text-3xl text-center leading-8 font-extrabold tracking-tight text-gray-900 sm:text-4xl">&quot;How do I learn to build big distributed systems?&quot;</span></h1></div> \n        <div class="mt-6 prose prose-indigo prose-lg text-gray-500 mx-auto"><p><strong>Learning to build distributed systems is hard</strong>,\n                especially if they are large scale. It&#39;
1s not that there is a\n                lack of information out there. You can find academic papers,\n                engineering blogs, and even books on the subject. The problem is\n                that the available information is spread out all over the place,\n                and if you were to put it on a spectrum from theory to practice,\n                you would find a lot of material at the two ends but not much in\n                the middle.</p> \n\n            <p><strong>That is why I decided to write a book that brings together\n                    the core theoretical and practical concepts of distributed\n                    systems</strong>\n                so that you don&#39;t have to spend hours connecting the dots. This book\n                will guide you through the fundamentals of large-scale distributed\n                systems, with just enough details and external references to dive\n                deeper. This is the guide I wished existed when I first started out,\n                based on my experience building large distributed systems that scale\n                to millions of requests per second and billions of devices.</p> \n\n            <p><strong>If you are a developer working on the backend of web or\n                    mobile applications (or would like to be!), this book is for\n                    you.</strong>\n                When building distributed applications, you need to be familiar with\n                the network stack, data consistency models, scalability and reliability\n                patterns, observability best practices, and much more. Although you\n                can build applications without knowing much of that, you will end\n                up spending hours debugging and re-architecting them, learning hard\n                lessons that you could have acquired in a much faster and less painful\n                way.</p> \n            <p>However, if you have several years of experience designing and\n                building highly available and fault-tolerant applications that\n                scale to millions of users, this book might not be for you. As\n                an expert, you are likely looking for depth rather than breadth,\n                and this book focuses more on the latter since it would be\n                impossible to cover the field otherwise.</p></div></div>',f(s,"class","relative pb-16 bg-white overflow-hidden")},m(e,t){d(e,s,t)},p:e,i:e,o:e,d(e){e&&h(s)}}}class R extends _{constructor(e){super(),W(this,e,null,U,i,{})}}function G(e){let t,s,n,a,i,r,w,y,x,b,$,k,z,q,C,T,I,M,S;const A=e[4].default,j=o(A,e,e[3],null);return{c(){t=p("blockquote"),s=p("div"),j&&j.c(),n=m(),a=p("footer"),i=p("div"),r=p("div"),w=p("img"),x=m(),b=p("div"),$=p("div"),k=g(e[0]),z=m(),q=u("svg"),C=u("path"),T=m(),I=p("div"),M=g(e[1]),f(s,"class","max-w-3xl mx-auto text-center text-xl leading-9 font-medium text-gray-900"),f(w,"class","mx-auto h-10 w-10 rounded-full"),w.src!==(y=e[2])&&f(w,"src",y),f(w,"alt",""),f(r,"class","md:flex-shrink-0"),f($,"class","text-base font-medium text-gray-900"),f(C,"d","M11 0h3L9 20H6l5-20z"),f(q,"class","hidden md:block mx-1 h-5 w-5 text-indigo-600"),f(q,"fill","currentColor"),f(q,"viewBox","0 0 20 20"),f(I,"class","text-base font-medium text-gray-500"),f(b,"class","mt-3 text-center md:mt-0 md:ml-4 md:flex md:items-center"),f(i,"class","md:flex md:items-center md:justify-center"),f(a,"class","mt-8"),f(t,"class","mt-10")},m(e,o){d(e,t,o),c(t,s),j&&j.m(s,null),c(t,n),c(t,a),c(a,i),c(i,r),c(r,w),c(i,x),c(i,b),c(b,$),c($,k),c(b,z),c(b,q),c(q,C),c(b,T),c(b,I),c(I,M),S=!0},p(e,[t]){j&&j.p&&8&t&&l(j,A,e,e[3],t,null,null),(!S||4&t&&w.src!==(y=e[2]))&&f(w,"src",y),(!S||1&t)&&v(k,e[0]),(!S||2&t)&&v(M,e[1])},i(e){S||(P(j,e),S=!0)},o(e){L(j,e),S=!1},d(e){e&&h(t),j&&j.d(e)}}}function F(e,t,s){let{$$slots:n={},$$scope:a}=t,{name:i}=t,{role:o}=t,{imagePath:r}=t;return e.$$set=e=>{"name"in e&&s(0,i=e.name),"role"in e&&s(1,o=e.role),"imagePath"in e&&s(2,r=e.imagePath),"$$scope"in e&&s(3,a=e.$$scope)},[i,o,r,a,n]}class O extends _{constructor(e){super(),W(this,e,F,G,i,{name:0,role:1,imagePath:2})}}function V(e){let t;return{c(){t=p("div"),t.innerHTML='<iframe width="560" height="315" src="https://www.youtube.com/embed/83o-LNw3Eps" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>',f(t,"class","flex flex-col justify-center items-center")},m(e,s){d(e,t,s)},d(e){e&&h(t)}}}function K(e){let t;return{c(){t=p("p"),t.textContent="“Understanding Distributed Systems fills the void\n                    between the deep theory and the \"interview preparation\"\n                    focused books. The book walks through practical concepts\n                    like failure detection, replication, scalability,\n                    resiliency, and operating large systems. It's the book I'd\n                    recommend to start with if you have less hands-on experience\n                    with distributed systems.”"},m(e,s){d(e,t,s)},d(e){e&&h(t)}}}function X(e){let t;return{c(){t=p("p"),t.textContent="“I've read approximately 20 technical books on the\n                    last 5 years or so. So far, no books approached modern\n                    services and backend development as well as software\n                    architecture as this book does. I would recommend this book\n                    over all “timeless” ones for craftsmanship perfection\n                    purposes as well as for software engineers early in their\
1n                    careers trying to understand what awaits for them as they\n                    take responsibility over large systems at global\n                    scale.”"},m(e,s){d(e,t,s)},d(e){e&&h(t)}}}function Q(e){let t;return{c(){t=p("p"),t.textContent="“The book brings together theory and real world\n                    practice by discussing how large scale applications are\n                    built from the ground up. Although I was familiar with some\n                    of the content, it's the first time I have seen it woven so\n                    well together into a coherent story. If you have to read one\n                    book about the topic, start with this one!”"},m(e,s){d(e,t,s)},d(e){e&&h(t)}}}function Y(e){let t;return{c(){t=p("p"),t.textContent="“This interesting book mixes together academic\n                    concepts with real life experience in building distributed\n                    systems at scale. Such systems present many challenges, and\n                    the book will have you tackle some of the most important\n                    ones: load balancing compute nodes, distributed data access\n                    and synchronization, resiliency mechanisms, and many\n                    more.”"},m(e,s){d(e,t,s)},d(e){e&&h(t)}}}function Z(e){let t,s,n,a,i,o,r,l,u,g,v,w,y,x,b;return o=new O({props:{name:"Utsav",role:"Senior Software Engineer at Microsoft",imagePath:"img/utsav.jpeg",$$slots:{default:[V]},$$scope:{ctx:e}}}),l=new O({props:{name:"Gergely",role:"Author of The Pragmatic Engineer",imagePath:"img/gergely.png",$$slots:{default:[K]},$$scope:{ctx:e}}}),g=new O({props:{name:"Emanuel",role:"Engineering Manager at Netflix",imagePath:"img/emanuel.jpeg",$$slots:{default:[X]},$$scope:{ctx:e}}}),w=new O({props:{name:"Mauro",role:"Software Engineer at Microsoft",imagePath:"img/mauro.jpeg",$$slots:{default:[Q]},$$scope:{ctx:e}}}),x=new O({props:{name:"Vamis",role:"Senior Engineering Manager at Vonage",imagePath:"img/vamis.jpeg",$$slots:{default:[Y]},$$scope:{ctx:e}}}),{c(){t=p("section"),s=p("div"),n=p("div"),a=p("h2"),a.textContent="What readers say",i=m(),j(o.$$.fragment),r=m(),j(l.$$.fragment),u=m(),j(g.$$.fragment),v=m(),j(w.$$.fragment),y=m(),j(x.$$.fragment),f(a,"class","text-center text-3xl leading-8 font-extrabold tracking-tight text-gray-900 sm:text-4xl"),f(n,"class","relative"),f(s,"class","relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"),f(t,"class","py-12 bg-gray-50 overflow-hidden md:py-20 lg:py-24")},m(e,h){d(e,t,h),c(t,s),c(s,n),c(n,a),c(n,i),H(o,n,null),c(n,r),H(l,n,null),c(n,u),H(g,n,null),c(n,v),H(w,n,null),c(n,y),H(x,n,null),b=!0},p(e,[t]){const s={};1&t&&(s.$$scope={dirty:t,ctx:e}),o.$set(s);const n={};1&t&&(n.$$scope={dirty:t,ctx:e}),l.$set(n);const a={};1&t&&(a.$$scope={dirty:t,ctx:e}),g.$set(a);const i={};1&t&&(i.$$scope={dirty:t,ctx:e}),w.$set(i);const r={};1&t&&(r.$$scope={dirty:t,ctx:e}),x.$set(r)},i(e){b||(P(o.$$.fragment,e),P(l.$$.fragment,e),P(g.$$.fragment,e),P(w.$$.fragment,e),P(x.$$.fragment,e),b=!0)},o(e){L(o.$$.fragment,e),L(l.$$.fragment,e),L(g.$$.fragment,e),L(w.$$.fragment,e),L(x.$$.fragment,e),b=!1},d(e){e&&h(t),E(o),E(l),E(g),E(w),E(x)}}}class J extends _{constructor(e){super(),W(this,e,null,Z,i,{})}}function ee(e){let t,s,n,a,i,r,u,w,y,x;const b=e[4].default,$=o(b,e,e[3],null);return{c(){t=p("div"),s=p("div"),n=p("h3"),a=g(e[0]),i=m(),$&&$.c(),r=m(),u=p("div"),w=p("img"),f(n,"class","text-2xl font-extrabold text-gray-900 tracking-tight sm:text-3xl"),f(s,"class","relative"),f(w,"class","relative mx-auto rounded-lg"),f(w,"width",e[1]),w.src!==(y=e[2])&&f(w,"src",y),f(w,"alt",""),f(u,"class","mt-10 -mx-4 relative lg:mt-0 px-4"),f(u,"aria-hidden","true"),f(t,"class","relative mt-12 lg:mt-24 lg:grid lg:grid-cols-2 lg:gap-8 lg:items-center")},m(e,o){d(e,t,o),c(t,s),c(s,n),c(n,a),c(s,i),$&&$.m(s,null),c(t,r),c(t,u),c(u,w),x=!0},p(e,[t]){(!x||1&t)&&v(a,e[0]),$&&$.p&&8&t&&l($,b,e,e[3],t,null,null),(!x||2&t)&&f(w,"width",e[1]),(!x||4&t&&w.src!==(y=e[2]))&&f(w,"src",y)},i(e){x||(P($,e),x=!0)},o(e){L($,e),x=!1},d(e){e&&h(t),$&&$.d(e)}}}function te(e,t,s){let{$$slots:n={},$$scope:a}=t,{title:i}=t,{imageWidth:o}=t,{imageSrc:r}=t;return e.$$set=e=>{"title"in e&&s(0,i=e.title),"imageWidth"in e&&s(1,o=e.imageWidth),"imageSrc"in e&&s(2,r=e.imageSrc),"$$scope"in e&&s(3,a=e.$$scope)},[i,o,r,a,n]}class se extends _{constructor(e){super(),W(this,e,te,ee,i,{title:0,imageWidth:1,imageSrc:2})}}function ne(e){let t,s,n,a,i,r,u,w,y,x,b;const $=e[4].default,k=o($,e,e[3],null);return{c(){t=p("div"),s=p("div"),n=p("div"),a=p("h3"),i=g(e[0]),r=m(),k&&k.c(),u=m(),w=p("div"),y=p("img"),f(a,"class","text-2xl font-extrabold text-gray-900 tracking-tight sm:text-3xl"),f(n,"class","lg:col-start-2"),f(y,"class","relative mx-auto rounded-lg"),f(y,"width",e[1]),y.src!==(x=e[2])&&f(y,"src",x),f(y,"alt",""),f(w,"class","mt-10 -mx-4 relative lg:mt-0 lg:col-start-1 px-4"),f(s,"class","lg:grid lg:grid-flow-row-dense lg:grid-cols-2 lg:gap-8 lg:items-center"),f(t,"class","relative mt-12 sm:mt-16 lg:mt-24")},m(e,o){d(e,t,o),c(t,s),c(s,n),c(n,a),c(a,i),c(n,r),k&&k.m(n,null),
1c(s,u),c(s,w),c(w,y),b=!0},p(e,[t]){(!b||1&t)&&v(i,e[0]),k&&k.p&&8&t&&l(k,$,e,e[3],t,null,null),(!b||2&t)&&f(y,"width",e[1]),(!b||4&t&&y.src!==(x=e[2]))&&f(y,"src",x)},i(e){b||(P(k,e),b=!0)},o(e){L(k,e),b=!1},d(e){e&&h(t),k&&k.d(e)}}}function ae(e,t,s){let{$$slots:n={},$$scope:a}=t,{title:i}=t,{imageWidth:o}=t,{imageSrc:r}=t;return e.$$set=e=>{"title"in e&&s(0,i=e.title),"imageWidth"in e&&s(1,o=e.imageWidth),"imageSrc"in e&&s(2,r=e.imageSrc),"$$scope"in e&&s(3,a=e.$$scope)},[i,o,r,a,n]}class ie extends _{constructor(e){super(),W(this,e,ae,ne,i,{title:0,imageWidth:1,imageSrc:2})}}function oe(e){let t;return{c(){t=p("div"),t.innerHTML='<p class="svelte-v98w5z">Communication between processes over the network, or inter-process\n            communication (IPC), is at the heart of distributed systems — it&#39;s\n            what makes distributed systems distributed. In order for processes\n            to communicate, they need to agree on a set of rules that determine\n            how data is processed and formatted. Network protocols specify such\n            rules.</p> \n          <p class="svelte-v98w5z">The protocols are arranged in a stack, where each layer builds on\n            the abstraction provided by the layer below, and lower layers are\n            closer to the hardware. When a process sends data to another through\n            the network stack, the data moves from the top layer to the bottom\n            one and vice-versa at the other end.</p> \n          <p class="svelte-v98w5z">Even though each protocol builds on top of another, sometimes the\n            abstractions leak. If you don&#39;t have a good grasp of how the lower\n            layers work, you will have a hard time troubleshooting networking\n            issues that will inevitably arise. More importantly, having an\n            appreciation of the complexity of what happens when you make a\n            network call will make you a better systems builder.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 2 (&quot;Reliable links&quot;)</strong> describes how to build\n            a reliable communication channel (TCP) on top of an unreliable one (IP),\n            which can drop or duplicate data or deliver it out of order. Building\n            reliable abstractions on top of unreliable ones is a common pattern we\n            will encounter again in the rest of the book.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 3 (&quot;Secure links&quot;)</strong> describes how to build a\n            secure channel (TLS) on top of a reliable one (TCP). Security is a core\n            concern of any system, and in this chapter, we will get a taste of what\n            it takes to secure a network connection from prying eyes and malicious\n            agents.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 4 (&quot;Discovery&quot;)</strong> dives into how the phone book\n            of the internet (DNS) works, which allows nodes to discover others using\n            names. At its heart, DNS is a distributed, hierarchical, and eventually\n            consistent key-value store. By studying it, we will get the first taste\n            of eventual consistency and the challenges it introduces.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 5 (&quot;APIs&quot;)</strong> concludes this part by discussing\n            how loosely coupled services communicate with each other through APIs\n            by describing the implementation of a RESTful HTTP API built upon the\n            protocols introduced earlier.</p>',f(t,"class","paragraphs svelte-v98w5z")},m(e,s){d(e,t,s)},d(e){e&&h(t)}}}function re(e){let t;return{c(){t=p("div"),t.innerHTML='<p class="svelte-v98w5z">A distributed system should try to give its clients the illusion\n            they interact with a single node. Although achieving a perfect\n            illusion is not always possible or desirable, it&#39;s clear that some\n            degree of coordination is needed to build a distributed a
1pplication.</p> \n          <p class="svelte-v98w5z">In this part, we will explore the core distributed algorithms at the\n            heart of distributed applications. This is the most challenging part\n            of the book since it contains the most theory, but also the most\n            rewarding one once you are through it.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 6 (&quot;System models&quot;)</strong> introduces formal models\n            that categorize systems based on what guarantees they offer about the\n            behavior of processes, communication links, and timing; they allow us\n            to reason about distributed systems by abstracting away the implementation\n            details.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 7 (&quot;Failure detection&quot;)</strong> describes how to detect\n            that a remote process is unreachable. Failure detection is a crucial\n            component of any distributed system. Because networks are unreliable,\n            and processes can crash at any time, without failure detection a process\n            trying to communicate with another could hang forever.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 8 (&quot;Time&quot;)</strong> dives into the concept of time and\n            order. We will first learn why agreeing on the time an event happened\n            in a distributed system is much harder than 
1it looks and then discuss\n            a solution based on clocks that don&#39;t measure the passing of time.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 9 (&quot;Leader election&quot;)</strong> describes how a group\n            of processes can elect a leader that can perform privileged operations,\n            like accessing a shared resource or coordinating the actions of other\n            processes.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 10 (&quot;Replication&quot;)</strong> introduces one of the fundamental\n            challenges in distributed systems: replicating data across multiple processes.\n            This chapter also discusses the implications of the CAP and PACELC theorems,\n            namely the tradeoff between consistency and availability/performance.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 11 (&quot;Coordination avoidance&quot;)</strong> explores weaker\n            consistency models for replicated data, like strong eventual consistency\n            and causal consistency, which allow us to build consistent, available,\n            and partition-tolerant systems.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 12 (&quot;Transactions&quot;)</strong> dives into the implementation\n            of ACID transactions that span data partitioned among multiple processes\n            or services. Transactions relieve us from a whole range of possible failure\n            scenarios so that we can focus on the actual application logic rather\n            than all the possible things that can go wrong.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 13 (&quot;Asynchronous transactions&quot;)</strong> discusses\n            how to implement long-running atomic transactions that don&#39;t block by\n            sacrificing the isolation guarantees of ACID. This chapter is particularly\n            relevant in practice since it showcases techniques commonly used in microservice\n            architectures.</p>',f(t,"class","paragraphs svelte-v98w5z")},m(e,s){d(e,t,s)},d(e){e&&h(t)}}}function le(e){let t;return{c(){t=p("div"),t.innerHTML='<p class="svelte-v98w5z">For an application to scale, it must run without performance\n            degradations as load increases. In this part, we will walk through\n            the journey of scaling a simple CRUD web application comprised of a\n            single-page JavaScript application that communicates with an\n            application server through a RESTful HTTP API.</p> \n          <p class="svelte-v98w5z">The simplest and quickest way to increase the application&#39;s capacity\n            to handle load is to scale up the machine hosting it. However, the\n            application will eventually hit a hard physical limit that we can&#39;t\n            overcome no matter how much money we are willing to throw at it. The\n            alternative to scaling up is to scale out by distributing the\n            application across multiple machines.</p> \n          <p class="svelte-v98w5z">As we will repeatedly see in this part, there are three fundamental\n            and independent patterns that we can exploit to build scalable\n            applications: breaking down an application into separate services,\n            each with its own well-defined responsibility (<i class="svelte-v98w5z">functional decomposition</i>); splitting data into partitions and distributing them among nodes\n            (<i class="svelte-v98w5z">partitioning</i>); and replicating functionality or data across\n            nodes, also known as horizontal scaling (<i class="svelte-v98w5z">replication</i>).</p> \n\n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 14 (&quot;HTTP caching&quot;)</strong> discusses the use of client-side\n            caching to reduce the number of requests hitting the application.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 15 (&quot;Content delivery networks&quot;)</strong> describes using\n            a content delivery network (CDN), a geographically distributed network\n            of managed reverse proxies, to further reduce the number of requests\n            the application needs to handle.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 16 (&quot;Partitioning&quot;)</strong> dives into partitioning,\n            a technique used by CDNs, and pretty much any distributed data store,\n            to handle large volumes of data. The chapter explores different partitioning\n            strategies, such as range and hash partitioning, and the challenges that\n            partitioning introduces.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 17 (&quot;File storage&quot;)</strong>
1 discusses the benefits of\n            offloading the storage of large static files, such as images and videos,\n            to a managed file store. It then describes the architecture of Azure\n            Storage, a highly available and scalable file store.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 18 (&quot;Network load balancing&quot;)</strong> talks about how\n            to increase the application&#39;s capacity by load-balancing requests across\n            a pool of servers. The chapter starts with a simple approach based on\n            DNS and then explores more flexible solutions that operate at the transport\n            and application layers of the network stack.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 19 (&quot;Data storage&quot;)</strong> describes how to scale out\n            the application&#39;s relational database using replication and partitioning\n            and the challenges that come with it. It then introduces NoSQL data stores\n            as a solution to these challenges and recounts their evolution since\n            their initial adoption in the industry.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 20 (&quot;Caching&quot;)</strong> takes a stab at discussing caching\n            from a more general point of view by diving into the benefits and pitfalls\n            of putting a cache in front of the application&#39;s data store. Although\n            caching is a deceptively simple technique, it can create subtle consistency\n            and operational issues that are all too easy to dismiss.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 21 (&quot;Microservices&quot;)</strong> talks about scaling the\n            development of the application across multiple teams by decomposing it\n            into independently deployable services. Next, it introduces the concept\n            of an API gateway as a means for external clients to communicate with\n            the backend after it has been decomposed into separated services.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 22 (&quot;Control planes and data planes&quot;)</strong> describes\n            the benefits of separating the serving of client requests (data plane)\n            from the management of the system&#39;s metadata and configuration (control\n            plane), which is a common pattern in large-scale systems.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 23 (&quot;Messaging&quot;)</strong> explores the use of asynchronous\n            messaging channels to decouple the communication between services, allowing\n            two services to communicate even if one of them is temporarily unavailable.\n            Messaging offers many other benefits, which we will explore in the chapter\n            along with its best practices and pitfalls.</p>',f(t,"class","paragraphs svelte-v98w5z")},m(e,s){d(e,t,s)},d(e){e&&h(t)}}}function ce(e){let t;return{c(){t=p("div"),t.innerHTML='<p class="svelte-v98w5z">In the last part, we mentioned the three fundamental scalability\n            patterns: functional decomposition, data partitioning, and\n            replication. They all have one thing in common: they increase the\n            number of moving parts (machines, services, processes, etc.) in our\n            applications. But since every part has a probability of failing, the\n            more moving parts there are, the higher the chance that any of them\n            will fail. Eventually, anything that can go wrong will go wrong;\n            power outages, hardware faults, software crashes, memory leaks — you\n            name it.</p> \n          <p class="svelte-v98w5z">To guarantee just two nines of availability, an application can only\n            be unavailable for up to 15 minutes a day. That&#39;s very little time\n            to take any manual action when something goes wrong. And if we\n            strive for three nines, we only have 43 minutes per month available.\n            Clearly, the more nines we want, the faster our systems need to\n            detect, react to, and repair faults as they occur.</p> \n          <p class="svelte-v98w5z">In this part, we will discuss a variety of resiliency best practices\n            and patterns to achieve that.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 24 (&quot;Common failure causes&quot;)</strong> explores some of\n            the most common root causes of failures.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 25 (&quot;Redundancy&quot;)</strong> describes how to use redundancy,\n            the replication of functionality or state, to increase the availability\n            of a system. As we will learn, redundancy is only helpful when the redundant\n            nodes can&#39;t fail for the same reason at the same time, i.e., when the\n            failures are not correlated.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 26 (&quot;Fault isolation&quot;)</strong>
1 discusses how to isolate\n            correlated failures by partitioning resources and then describes two\n            very powerful forms of partitioning: shuffle sharding and cellular architectures.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 27 (&quot;Downstream resiliency&quot;)</strong> dives into more\n            tactical resiliency patterns for tolerating failures of downstream dependencies\n            that you can apply to existing systems with few changes, like timeouts\n            and retries.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 28 (&quot;Upstream resiliency&quot;)</strong> discusses resiliency\n            patterns, like load shedding and rate-limiting, for protecting systems\n            against overload from upstream dependencies.</p>',f(t,"class","paragraphs svelte-v98w5z")},m(e,s){d(e,t,s)},d(e){e&&h(t)}}}function de(e){let t;return{c(){t=p("div"),t.innerHTML='<p class="svelte-v98w5z">It&#39;s a well-known fact that the majority of the cost of software is\n            spent after its initial development in maintenance activities, such\n            as fixing bugs, adding new features, and operating it. Thus, we\n            should aspire to make our systems easy to modify, extend and operate\n            so that they are easy to maintain.</p> \n          <p class="svelte-v98w5z">Good testing, in the form of unit, integration, and end-to-end\n            tests, is a minimum requirement to be able to modify or extend a\n            system without worrying it will break. And once a change has been\n            merged into the codebase, it needs to be released to production\n            safely without affecting the application&#39;s availability. Also, the\n            operators need to be able to monitor the system&#39;s health,\n            investigate degradations and restore the service when it gets into a\n            bad state. This requires altering the system&#39;s behavior without code\n            changes, e.g., toggling a feature flag or scaling out a service with\n            a configuration change.</p> \n          <p class="svelte-v98w5z">In this part, we will explore some of the best practices for testing\n            and operating large distributed applications.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 29 (&quot;Testing&quot;)</strong> describes the different types\n            of tests, unit, integration, and end-to-end tests, that we can leverage\n            to increase the confidence that a distributed application works as expected.\n            This chapter also explores the use of formal verification methods to\n            verify the correctness of an application before writing a single line\n            of code.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 30 (&quot;Continuous delivery and deployment&quot;)</strong> dives\n            into continuous delivery and deployment pipelines to release changes\n            safely and efficiently to production.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 31 (&quot;Monitoring&quot;)</strong> discusses how to use metrics,\n            service-level indicators, and dashboards to monitor the health of distributed\n            applications. It then talks about how to define and enforce service-level\n            objectives that describe how the service should behave when it&#39;s functioning\n            correctly.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 32 (&quot;Observability&quot;)</strong> introduces the concept\n            of observability and its relation to monitoring. Later, it describes\n            how to debug production issues using logs and traces.</p> \n          <p class="svelte-v98w5z"><strong class="svelte-v98w5z">Chapter 33 (&quot;Manageability&quot;)</strong> describes how to modify\n            a system&#39;s behavior without changing its code, which is a must-have to\n            enable operators to quickly mitigate failures in production when everything\n            else fails.</p>',f(t,"class","paragraphs svelte-v98w5z")},m(e,s){d(e,t,s)},d(e){e&&h(t)}}}function he(e){let t,s,n,a,i,o,r,l,u,g,v,w,y,x,b;return o=new se({props:{title:"Part I: Communication",imageWidth:"480",imageSrc:"img/handshake.png",$$slots:{default:[oe]},$$scope:{ctx:e}}}),l=new ie({props:{title:"Part II: Coordination",imageWidth:"530",imageSrc:"img/spanner.png",$$slots:{default:[re]},$$scope:{ctx:e}}}),g=new se({props:{title:"Part III: Scalability",imageWidth:"400",imageSrc:"img/l4_balancing.png",$$slots:{default:[le]},$$scope:{ctx:e}}}),w=new ie({props:{title:"Part IV: Resiliency",imageWidth:"530",imageSrc:"img/cb.png",$$slots:{default:[ce]},$$scope:{ctx:e}}}),x=new se({props:{title:"Part V: Maintainability",imageWidth:"550",imageSrc:"img/observability.png",$$slots:{default:[de]},$$scope:{ctx:e}}}),{c(){t=p("div"),s=p("div"),n=p("div"),n.innerHTML='<h2 class="text-center text-3xl leading-8 font-extrabold tracking-tight text-gray-900 sm:text-4xl">Book Content</h2> \n      <p class="mt-4 max-w-3xl mx-auto text-left text-xl text-gray-500">The book is divided into 5 parts: communication, coordination,\n        scalability, resiliency, and maintainability.</p>',a=m(),i=p("div"),j(o.$$.fragment),r=m(),j(l.$$.fragment),u=m(),j(g.$$.fragment),v=m(),j(w.$$.fragment),y=m(),j(x.$$.fragment),f(n,"class","relative"),f(s,"class","relative max-w-xl mx-auto px-4 sm:px-6 lg:px-8 lg:max-w-7xl"),f(t,"class","py-16 bg-white overflow-hidden")},m(e,h){d(e,t,h),c(t,s),c(s,n),c(s,a),c(s,i),H(o,i,null),c(i,r),H(l,i,null),c(i,u),H(g,i,null),c(i,v),H(w,i,null),c(i,y),H(x,i,null),b=!0},p(e,[t]){const s={};1&t&&(s.$$scope={dirty:t,ctx:e}),o.$set(s);const n={};1&t&&(n.$$scope={dirty:t,ctx:e}),l.$set(n);const a={};1&t&&(a.$$scope={dirty:t,ctx:e}),g.$set(a);const i={};1&t&&(i.$$scope={dirty:t,ctx:e}),w.$set(i);const r={};1&t&&(r.$$scope={dirty:t,ctx:e}),x.$set(r)},i(e){b||(P(o.$$.fragment,e),P(l.$$.fragment,e),P(g.$$.fragment,e),P(w.$$.fragment,e),P(x.$$.fragment,e),b=!0)},o(e){L(o.$$.fragment,e),L(l.$$.fragment,e),L(g.$$.fragment,e),L(w.$$.fragment,e),L(x.$$.fragment,e),b=!1},d(e){e&&h(t),E(o),E(l),E(g),E(w),E(x)}}}class pe extends _{constructor(e){super(),W(this,e,null,he,i,{})}}function ue(t){let s,n,a,i,o;return{c(){s=p("li"),n=p("div"),n.innerHTML='<svg class="flex-shrink-0 h-6 w-6 text-green-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg>',a=m(),i=p("p"),o=g(t[0]),f(n,"class","flex-shrink-0"),f(i,"class","ml-3 text-base font-medium text-gray-500"),f(s,"class","flex items-start")},m(e,t){d(e,s,t),c(s,n),c(s,a),c(s,i),c(i,o)},p(e,[t]){1&t&&v(o,e[0])},i:e,o:e,d(e){e&&h(s)}}}function ge(e,t,s){let{text:n}=t;return e.$$set=e=>{"text"in e&&s(0,n=e.text)},[n]}class me extends _{constructor(e){super(),W(this,e,ge,ue,i,{text:0})}}function fe(t){let s,n,a,i,o,r,l,u,g,v,w,y,x,b,$,k,z,q,C,T,I,M,S,A,B,W,_,D,N,U,R,G,F,O,V,K,X,Q,Y,Z,J,ee,te,se,ne;return S=new me({props:{text:"2nd edition with 33 packed chapters and 328 pages in PDF and EPUB format"}}),B=new me({props:{text:"Lifetime access to updates and future editions"}}),_=new me({props:{text:"Request a refund within 30 days, no questions asked"}}),Q=new me({props:{text:"2nd edition with 33 packed chapters and 328 pages"}}),Z=new me({props:{text:"Available through Amazon"}}
1),{c(){s=p("script"),a=m(),i=p("div"),o=p("div"),o.innerHTML='<div class="text-center"><h2 class="mt- text-3xl font-extrabold text-white sm:text-4xl lg:text-5xl">Buy the book</h2> \n      <p class="mt-3 max-w-4xl mx-auto text-xl text-gray-300 sm:mt-5 sm:text-2xl text-left"></p></div>',r=m(),l=p("div"),u=p("div"),g=p("div"),v=m(),w=p("div"),y=p("div"),x=p("div"),b=p("div"),$=p("div"),k=m(),z=p("div"),z.innerHTML='<div class="flex justify-center transform -translate-y-1/2"><span class="inline-flex rounded-full bg-yellow-600 px-4 py-1 text-sm font-semibold tracking-wider uppercase text-white">Most popular</span></div>',q=m(),C=p("div"),C.innerHTML='<div><h3 class="text-center text-4xl font-semibold text-gray-900 sm:-mx-6">E-book</h3> \n                  <h4 class="text-center text-l font-semibold text-gray-900 sm:-mx-6">2nd Edition</h4> \n                  <div class="mt-4 flex items-center justify-center"><span class="px-3 flex items-start text-6xl tracking-tight text-gray-900 sm:text-6xl"><span class="mt-2 mr-2 text-4xl font-medium">$</span> \n                      <span class="font-extrabold">35</span></span></div></div>',T=m(),I=p("div"),M=p("ul"),j(S.$$.fragment),A=m(),j(B.$$.fragment),W=m(),j(_.$$.fragment),D=m(),N=p("div"),N.innerHTML='<a href="https://gum.co/xDBTX?wanted=true" data-gumroad-single-product="true" class="block w-full text-center rounded-lg border border-transparent bg-yellow-600 px-6 py-4 text-xl leading-6 font-medium text-white hover:bg-yellow-700">Buy the book</a> \n                  <div class="mt-5 text-base font-medium text-gray-500">Not convinced yet? Read the first two chapters for\n                    <a class="underline font-medium text-gray-900" href="./sample.pdf">free</a></div>',U=m(),R=p("div"),G=p("div"),F=p("div"),O=p("div"),O.innerHTML='<div><h3 class="text-center text-2xl font-medium text-gray-900" id="tier-hobby">Paperback</h3> \n                    <h4 class="text-center text-l font-medium text-gray-900">2nd Edition</h4> \n                    <div class="mt-4 flex items-center justify-center"><span class="px-3 flex items-start text-6xl tracking-tight text-gray-900"><span class="mt-2 mr-2 text-4xl font-medium">$</span> \n                        <span class="font-extrabold">35*</span></span></div></div>',V=m(),K=p("div"),X=p("ul"),j(Q.$$.fragment),Y=m(),j(Z.$$.fragment),J=m(),ee=p("li"),ee.innerHTML='<p class="ml-3 text-base font-medium text-gray-400">*Price can vary by Amazon store</p>',te=m(),se=p("div"),se.innerHTML='<div class="rounded-lg shadow-md"><a href="https://geni.us/distsysbook" class="block w-full text-center rounded-lg border border-transparent bg-white px-6 py-3 text-base font-medium text-yellow-600 hover:bg-gray-50" aria-describedby="tier-hobby">Buy the book</a></div>',s.src!==(n="https://gumroad.com/js/gumroad.js")&&f(s,"src","https://gumroad.com/js/gumroad.js"),f(o,"class","pt-12 px-4 sm:px-6 lg:px-8 lg:pt-20"),f(g,"class","absolute inset-0 h-5/6 bg-gray-900 lg:h-2/3"),f($,"class","pointer-events-none absolute inset-0 rounded-lg border-2 border-yellow-600"),f($,"aria-hidden","true"),f(z,"class","absolute inset-x-0 top-0 transform translate-y-px"),f(C,"class","bg-white rounded-t-lg px-6 pt-12 pb-10"),f(M,"class","space-y-4"),f(N,"class","mt-10 flex flex-col items-center"),f(I,"class","border-t-2 border-gray-100 rounded-b-lg pt-10 pb-8 px-6 bg-gray-50 sm:px-10 sm:py-10"),f(b,"class","relative z-10 rounded-lg shadow-xl"),f(x,"class","mb-10 max-w-lg mx-auto lg:mt-0 lg:max-w-none lg:mx-0 lg:col-start-3 lg:col-end-6 lg:row-start-1 lg:row-end-4"),f(O,"class","bg-white px-6 py-10"),f(ee,"class","flex items-start"),f(X,"class","space-y-4"),f(se,"class","mt-8"),f(K,"class","flex-1 flex flex-col justify-between border-t-2 border-gray-100 p-6 bg-gray-50 sm:p-10 lg:p-6 xl:p-10"),f(F,"class","flex-1 flex flex-col"),f(G,"class","h-full flex flex-col rounded-lg shadow-lg overflow-hidden lg:rounded-none lg:rounded-l-lg"),f(R,"class","mx-auto max-w-md lg:mx-0 lg:max-w-none lg:col-start-1 lg:col-end-3 lg:row-start-2 lg:row-end-3"),f(y,"class","relative lg:grid lg:grid-cols-7"),f(w,"class","max-w-7xl mx-auto px-4 sm:px-6 lg:px-8"),f(u,"class","relative z-0"),f(l,"class","mt-16 bg-white pb-12 lg:mt-20 lg:pb-20"),f(i,"class","bg-gray-900")},m(e,t){c(document.head,s),d(e,a,t),d(e,i,t),c(i,o),c(i,r),c(i,l),c(l,u),c(u,g),c(u,v),c(u,w),c(w,y),c(y,x),c(x,b),c(b,$),c(b,k),c(b,z),c(b,q),c(b,C),c(b,T),c(b,I),c(I,M),H(S,M,null),
vendor: 1,822 bytes, line 1
1c(M,A),H(B,M,null),c(M,W),H(_,M,null),c(I,D),c(I,N),c(y,U),c(y,R),c(R,G),c(G,F),c(F,O),c(F,V),c(F,K),c(K,X),H(Q,X,null),c(X,Y),H(Z,X,null),c(X,J),c(X,ee),c(K,te),c(K,se),ne=!0},p:e,i(e){ne||(P(S.$$.fragment,e),P(B.$$.fragment,e),P(_.$$.fragment,e),P(Q.$$.fragment,e),P(Z.$$.fragment,e),ne=!0)},o(e){L(S.$$.fragment,e),L(B.$$.fragment,e),L(_.$$.fragment,e),L(Q.$$.fragment,e),L(Z.$$.fragment,e),ne=!1},d(e){h(s),e&&h(a),e&&h(i),E(S),E(B),E(_),E(Q),E(Z)}}}class ve extends _{constructor(e){super(),W(this,e,null,fe,i,{})}}function we(t){let s;return{c(){s=p("div"),s.innerHTML='<div class="mx-auto pb-10 px-4 max-w-7xl sm:px-6 lg:px-8"><div class="space-y-12 lg:grid lg:grid-cols-1 lg:gap-8 lg:space-y-0"><div class="space-y-5 sm:space-y-4"><h2 class="text-3xl font-extrabold tracking-tight sm:text-4xl">About the author</h2></div> \n      <div class="lg:col-span-2"><ul class="space-y-12 sm:divide-y sm:divide-gray-200 sm:space-y-0 sm:-mt-8 lg:gap-x-8 lg:space-y-0"><li class="sm:py-8"><div class="space-y-4 sm:grid sm:grid-cols-4 sm:items-start sm:gap-6 sm:space-y-0"><div class="aspect-w-3 aspect-h-3 sm:aspect-w-3 sm:aspect-h-4"><img class="object-cover shadow-lg rounded-lg" src="img/profile-pic.jpg" alt=""/></div> \n              <div class="sm:col-span-3"><div class="space-y-4"><div class="text-lg leading-6 font-medium space-y-1"><h3>Roberto Vitillo</h3></div> \n                  <div class="text-lg text-gray-500"><p class="mb-4">I have over 10 years of experience in the tech industry as\n                      a software engineer, technical lead, and manager.</p> \n                    <p class="mb-4">After getting my master&#39;s degree in computer science from\n                      the University of Pisa, I worked on scientific computing\n                      applications at the Berkeley Lab. The softw
1are I\n                      contributed is used to this day by the ATLAS experiment at\n                      the Large Hadron Collider.</p> \n                    <p class="mb-4">Next, I worked at Mozilla, where I set the direction of\n                      the data platform from its very early days and built a\n                      large part of it, including the team.</p> \n                    <p class="mb-4">Then, in 2017, I joined Microsoft to help scale an\n                      internal telemetry platform and launch multiple analytics\n                      products on top of it, such as Playfab and Customer\n                      Insights. The data ingestion platform I was responsible\n                      for is one of the largest in the world, ingesting millions\n                      of events per second from billions of devices worldwide.</p> \n                    <p>In the fall of 2022, I joined AWS as a Principal Software\n                      Engineer in the DynamoDB organization.</p></div> \n                  <ul class="flex space-x-5"><li><a href="https://twitter.com/RaVitillo" class="text-gray-400 hover:text-gray-500"><span class="sr-only">Twitter</span> \n                        <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true"><path d="M6.29 18.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0020 3.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.073 4.073 0 01.8 7.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 010 16.407a11.616 11.616 0 006.29 1.84"></path></svg></a></li> \n                    <li><a href="https://www.linkedin.com/in/ravitillo/" class="text-gray-400 hover:text-gray-500"><span class="sr-only">LinkedIn</span> \n                        <svg class="w-5 h-5" fill="currentColor" viewBox="0 0 20 20" aria-hidden="true"><path fill-rule="evenodd" d="M16.338 16.338H13.67V12.16c0-.995-.017-2.277-1.387-2.277-1.39 0-1.601 1.086-1.601 2.207v4.248H8.014v-8.59h2.559v1.174h.037c.356-.675 1.227-1.387 2.526-1.387 2.703 0 3.203 1.778 3.203 4.092v4.711zM5.005 6.575a1.548 1.548 0 11-.003-3.096 1.548 1.548 0 01.003 3.096zm-1.337 9.763H6.34v-8.59H3.667v8.59zM17.668 1H2.328C1.595 1 1 1.581 1 2.298v15.403C1 18.418 1.595 19 2.328 19h15.34c.734 0 1.332-.582 1.332-1.299V2.298C19 1.581 18.402 1 17.668 1z" clip-rule="evenodd"></path></svg></a></li></ul></div></div></div></li></ul></div></div></div>',f(s,"class","bg-white")},m(e,t){d(e,s,t)},p:e,i:e,o:e,d(e){e&&h(s)}}}class ye extends _{constructor(e){super(),W(this,e,null,we,i,{})}}function xe(t){let s;return{c(){s=p("div"),s.innerHTML='<div class="max-w-7xl mx-auto py-16 px-4 sm:px-6 lg:py-20 lg:px-8"><div class="lg:grid lg:grid-cols-3 lg:gap-8"><div><h2 class="text-3xl font-extrabold text-gray-900">Frequently asked questions</h2> \n        <p class="mt-4 text-lg text-gray-500">Can’t find the answer you’re looking for?</p> \n        <p class="text-lg text-gray-500">Reach out to me at: <a href="mailto:[email protected]" class="font-medium text-indigo-600 hover:text-indigo-500">[email protected]</a></p></div> \n      <div class="mt-12 lg:mt-0 lg:col-span-2"><dl class="space-y-6"><div><div><dt class="question svelte-1a11tfp">Do you have a bulk pricing?</dt> \n              <dd class="answer svelte-1a11tfp">Yes. If you’re buying more than three copies for your\n                team/students/event attendees reach out to me for a bulk pricing\n                cost.</dd></div> \n            <div class="mt-5"><dt class="question svelte-1a11tfp">Can I read the book on a Kindle?</dt> \n              <dd class="answer svelte-1a11tfp">Yes, you can. To do that, you have to convert the EPUB file to\n                KFX using Calibre&#39;s KFX output plugin and then sideload the KFX\n                on your device. KFX is Kindle&#39;s native e-book format with\n                enhanced typesetting, which supports MathML. MathML is required\n                to render the equations included in the book correctly.</dd></div></div></dl></div></div></div>',f(s,"class","bg-white")},m(e,t){d(e,s,t)},p:e,i:e,o:e,d(e){e&&h(s)}}}class be extends _{constructor(e){super(),W(this,e,null,xe,i,{})}}function $e(t){let s,n,a;return{c(){s=p("script"),a=p("script"),a.textContent='window.dataLayer = window.dataLayer || [];\n        function gtag() {\n            dataLayer.push(arguments);\n        }\n        gtag("js", new Date());\n\n        gtag("config", "G-G35Z5CMSQG");',s.async=!0,s.src!==(n="https://www.googletagmanager.com/gtag/js?i
1d=G-G35Z5CMSQG")&&f(s,"src","https://www.googletagmanager.com/gtag/js?id=G-G35Z5CMSQG")},m(e,t){c(document.head,s),c(document.head,a)},p:e,i:e,o:e,d(e){h(s),h(a)}}}class ke extends _{constructor(e){super(),W(this,e,null,$e,i,{})}}function ze(t){let s,n,a,i,o,r,l,u,g,v,w,y,x,b,$,k,z,q;return n=new ke({}),i=new N({}),r=new R({}),u=new J({}),v=new pe({}),x=new ve({}),$=new ye({}),z=new be({}),{c(){s=p("main"),j(n.$$.fragment),a=m(),j(i.$$.fragment),o=m(),j(r.$$.fragment),l=m(),j(u.$$.fragment),g=m(),j(v.$$.fragment),w=m(),y=p("div"),j(x.$$.fragment),b=m(),j($.$$.fragment),k=m(),j(z.$$.fragment),f(y,"id","get-the-book"),f(s,"class","bg-gray-300")},m(e,t){d(e,s,t),H(n,s,null),c(s,a),H(i,s,null),c(s,o),H(r,s,null),c(s,l),H(u,s,null),c(s,g),H(v,s,null),c(s,w),c(s,y),H(x,y,null),c(s,b),H($,s,null),c(s,k),H(z,s,null),q=!0},p:e,i(e){q||(P(n.$$.fragment,e),P(i.$$.fragment,e),P(r.$$.fragment,e),P(u.$$.fragment,e),P(v.$$.fragment,e),P(x.$$.fragment,e),P($.$$.fragment,e),P(z.$$.fragment,e),q=!0)},o(e){L(n.$$.fragment,e),L(i.$$.fragment,e),L(r.$$.fragment,e),L(u.$$.fragment,e),L(v.$$.fragment,e),L(x.$$.fragment,e),L($.$$.fragment,e),L(z.$$.fragment,e),q=!1},d(e){e&&h(s),E(n),E(i),E(r),E(u),E(v),E(x),E($),E(z)}}}return new class extends _{constructor(e){super(),W(this,e,null,ze,i,{})}}({target:document.body,props:{}})}();
2//# sourceMappingURL=bundle.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.