From 331c39927ec023d114c3b39eff53a862453b44fd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 05:59:57 +0000 Subject: [PATCH] deploy: 230010d1f7f5228d91c3c5f83cbcb1597cfa908f --- 404.html | 8 +++---- ...de2c4.8b82b6ac.js => 14ede2c4.fb2ad1b3.js} | 2 +- assets/js/1ba1fdde.9240a016.js | 1 + assets/js/1ba1fdde.9640d0c5.js | 1 - assets/js/27fa7df4.4207b948.js | 1 + ...b770c.d4759ec0.js => 359b770c.8c41d758.js} | 2 +- assets/js/41cb6a13.313b0179.js | 1 + assets/js/41cb6a13.c1c04552.js | 1 - assets/js/55960ee5.7208ceb3.js | 1 - assets/js/55960ee5.a5223009.js | 1 + assets/js/5b55fa8e.3033515f.js | 1 + assets/js/5b55fa8e.4e00b448.js | 1 - assets/js/5cff0ebf.679e763e.js | 1 - assets/js/5cff0ebf.b3ca71af.js | 1 + ...82b23.cef43d14.js => 5e582b23.1e0eff5a.js} | 2 +- assets/js/6dd24dad.57465850.js | 1 + assets/js/782ac186.9a53e81e.js | 1 + ...1bfb9.244eda19.js => 7a11bfb9.40945dd2.js} | 2 +- assets/js/7ebec3ff.2b7b498a.js | 1 + assets/js/7ebec3ff.9ba52946.js | 1 - assets/js/8d33f67c.3859ef35.js | 1 + assets/js/8d33f67c.bbeb84f4.js | 1 - assets/js/935f2afb.05a3530f.js | 1 - assets/js/935f2afb.718b7629.js | 1 + ...64a37.e0ca9800.js => 93d64a37.60edcf62.js} | 2 +- assets/js/9e642b58.512315b8.js | 1 - assets/js/9e642b58.d42e2410.js | 1 + assets/js/a829cb4e.03dc12b6.js | 1 + assets/js/a829cb4e.d7efb83e.js | 1 - assets/js/b8dc3674.06dcbace.js | 1 + assets/js/b8dc3674.ac86471f.js | 1 - assets/js/be4eaa02.9ab09138.js | 1 + assets/js/cbb6a674.e7a07a55.js | 1 + assets/js/cc299ddb.54a3873b.js | 1 - assets/js/cc299ddb.bad9c949.js | 1 + assets/js/d8d29226.26b1f00f.js | 1 + assets/js/e0c6c906.b2ed79fa.js | 1 + assets/js/ed645329.890bf7f7.js | 1 - assets/js/ed645329.ab1520c3.js | 1 + assets/js/ff23dbd5.3475b4c2.js | 1 - assets/js/ff23dbd5.f16d3321.js | 1 + assets/js/main.67529a55.js | 2 -- assets/js/main.b2aba9e6.js | 2 ++ ...CENSE.txt => main.b2aba9e6.js.LICENSE.txt} | 0 assets/js/runtime~main.d8e20be1.js | 1 + assets/js/runtime~main.db7cda64.js | 1 - .../index.html | 8 +++---- .../index.html | 8 +++---- catalog/ai/energy-efficent-ai-edge/index.html | 8 +++---- .../ai/energy-efficent-framework/index.html | 8 +++---- catalog/ai/energy-efficent-models/index.html | 8 +++---- catalog/ai/index.html | 8 +++---- .../leverage-sustainable-regions/index.html | 8 +++---- .../pre-trained-transfer-learning/index.html | 8 +++---- catalog/ai/right-hardware-type/index.html | 8 +++---- .../serverless-model-development/index.html | 8 +++---- catalog/cloud/cache-static-data/index.html | 10 ++++----- .../choose-region-closest-to-users/index.html | 12 +++++----- catalog/cloud/compress-stored-data/index.html | 21 ++++++++++++++++++ .../compress-transmitted-data/index.html | 12 +++++----- .../index.html | 21 ++++++++++++++++++ .../index.html | 12 +++++----- .../encrypt-what-is-necessary/index.html | 10 ++++----- .../index.html | 12 +++++----- .../evaluate-using-a-service-mesh/index.html | 21 ++++++++++++++++++ .../index.html | 12 +++++----- .../implement-stateless-design/index.html | 10 ++++----- catalog/cloud/index.html | 10 ++++----- catalog/cloud/match-slo/index.html | 10 ++++----- .../index.html | 10 ++++----- .../index.html | 10 ++++----- .../index.html | 10 ++++----- .../index.html | 10 ++++----- .../optimize-avg-cpu-utilization/index.html | 10 ++++----- .../index.html | 10 ++++----- .../optimize-peak-cpu-utilization/index.html | 10 ++++----- .../queue-non-urgent-requests/index.html | 10 ++++----- .../cloud/reduce-transmitted-data/index.html | 10 ++++----- catalog/cloud/remove-unused-assets/index.html | 10 ++++----- .../index.html | 10 ++++----- .../scale-down-unused-applications/index.html | 10 ++++----- .../index.html | 10 ++++----- .../index.html | 12 +++++----- .../index.html | 21 ++++++++++++++++++ .../cloud/scan-for-vulnerabilities/index.html | 12 +++++----- .../index.html | 10 ++++----- .../shed-lower-priority-traffic/index.html | 10 ++++----- .../index.html | 10 ++++----- .../use-async-instead-of-sync/index.html | 10 ++++----- catalog/cloud/use-circuit-breaker/index.html | 10 ++++----- .../index.html | 12 +++++----- catalog/cloud/use-ddos-protection/index.html | 22 +++++++++++++++++++ .../use-energy-efficient-hardware/index.html | 21 ++++++++++++++++++ catalog/cloud/use-serverless/index.html | 12 +++++----- catalog/index.html | 8 +++---- .../index.html | 8 +++---- .../web/avoid-excessive-dom-size/index.html | 8 +++---- .../index.html | 8 +++---- catalog/web/defer-offscreen-images/index.html | 8 +++---- catalog/web/deprecate-gifs/index.html | 8 +++---- .../web/enable-text-compression/index.html | 8 +++---- catalog/web/index.html | 8 +++---- .../web/keep-request-counts-low/index.html | 8 +++---- catalog/web/minify-web-assets/index.html | 8 +++---- .../web/minimize-main-thread-work/index.html | 8 +++---- catalog/web/properly-sized-images/index.html | 8 +++---- catalog/web/remove-unused-css/index.html | 8 +++---- .../serve-images-in-modern-formats/index.html | 8 +++---- .../web/use-server-side-rendering/index.html | 8 +++---- guide/index.html | 8 +++---- guide/initial-reviewer-guide/index.html | 8 +++---- guide/sme-reviewer-guide/index.html | 8 +++---- guide/suggested-tags/index.html | 8 +++---- index.html | 8 +++---- sitemap.xml | 2 +- tags/ai/index.html | 8 +++---- tags/cloud/index.html | 12 +++++----- tags/compute/index.html | 12 +++++----- tags/deployment/index.html | 8 +++---- tags/index.html | 10 ++++----- tags/kubernetes/index.html | 12 +++++----- tags/machine-learning/index.html | 8 +++---- tags/monitoring/index.html | 8 +++---- tags/network/index.html | 20 +++++++++++++++++ tags/networking/index.html | 8 +++---- tags/reliability-availability/index.html | 8 +++---- tags/role-cloud-engineer/index.html | 12 +++++----- tags/role-data-scientist/index.html | 8 +++---- tags/role-reliability-engineer/index.html | 8 +++---- tags/role-software-engineer/index.html | 12 +++++----- tags/role-web-developer/index.html | 8 +++---- tags/security/index.html | 12 +++++----- tags/serverless/index.html | 8 +++---- tags/size-large/index.html | 8 +++---- tags/size-medium/index.html | 12 +++++----- tags/size-small/index.html | 12 +++++----- tags/storage/index.html | 8 +++---- tags/web/index.html | 8 +++---- 138 files changed, 575 insertions(+), 421 deletions(-) rename assets/js/{14ede2c4.8b82b6ac.js => 14ede2c4.fb2ad1b3.js} (61%) create mode 100644 assets/js/1ba1fdde.9240a016.js delete mode 100644 assets/js/1ba1fdde.9640d0c5.js create mode 100644 assets/js/27fa7df4.4207b948.js rename assets/js/{359b770c.d4759ec0.js => 359b770c.8c41d758.js} (52%) create mode 100644 assets/js/41cb6a13.313b0179.js delete mode 100644 assets/js/41cb6a13.c1c04552.js delete mode 100644 assets/js/55960ee5.7208ceb3.js create mode 100644 assets/js/55960ee5.a5223009.js create mode 100644 assets/js/5b55fa8e.3033515f.js delete mode 100644 assets/js/5b55fa8e.4e00b448.js delete mode 100644 assets/js/5cff0ebf.679e763e.js create mode 100644 assets/js/5cff0ebf.b3ca71af.js rename assets/js/{5e582b23.cef43d14.js => 5e582b23.1e0eff5a.js} (88%) create mode 100644 assets/js/6dd24dad.57465850.js create mode 100644 assets/js/782ac186.9a53e81e.js rename assets/js/{7a11bfb9.244eda19.js => 7a11bfb9.40945dd2.js} (50%) create mode 100644 assets/js/7ebec3ff.2b7b498a.js delete mode 100644 assets/js/7ebec3ff.9ba52946.js create mode 100644 assets/js/8d33f67c.3859ef35.js delete mode 100644 assets/js/8d33f67c.bbeb84f4.js delete mode 100644 assets/js/935f2afb.05a3530f.js create mode 100644 assets/js/935f2afb.718b7629.js rename assets/js/{93d64a37.e0ca9800.js => 93d64a37.60edcf62.js} (61%) delete mode 100644 assets/js/9e642b58.512315b8.js create mode 100644 assets/js/9e642b58.d42e2410.js create mode 100644 assets/js/a829cb4e.03dc12b6.js delete mode 100644 assets/js/a829cb4e.d7efb83e.js create mode 100644 assets/js/b8dc3674.06dcbace.js delete mode 100644 assets/js/b8dc3674.ac86471f.js create mode 100644 assets/js/be4eaa02.9ab09138.js create mode 100644 assets/js/cbb6a674.e7a07a55.js delete mode 100644 assets/js/cc299ddb.54a3873b.js create mode 100644 assets/js/cc299ddb.bad9c949.js create mode 100644 assets/js/d8d29226.26b1f00f.js create mode 100644 assets/js/e0c6c906.b2ed79fa.js delete mode 100644 assets/js/ed645329.890bf7f7.js create mode 100644 assets/js/ed645329.ab1520c3.js delete mode 100644 assets/js/ff23dbd5.3475b4c2.js create mode 100644 assets/js/ff23dbd5.f16d3321.js delete mode 100644 assets/js/main.67529a55.js create mode 100644 assets/js/main.b2aba9e6.js rename assets/js/{main.67529a55.js.LICENSE.txt => main.b2aba9e6.js.LICENSE.txt} (100%) create mode 100644 assets/js/runtime~main.d8e20be1.js delete mode 100644 assets/js/runtime~main.db7cda64.js create mode 100644 catalog/cloud/compress-stored-data/index.html create mode 100644 catalog/cloud/containerize-your-workload-where-applicable/index.html create mode 100644 catalog/cloud/evaluate-using-a-service-mesh/index.html create mode 100644 catalog/cloud/scale-logical-components-independently/index.html create mode 100644 catalog/cloud/use-ddos-protection/index.html create mode 100644 catalog/cloud/use-energy-efficient-hardware/index.html create mode 100644 tags/network/index.html diff --git a/404.html b/404.html index 67efa385..93174f22 100644 --- a/404.html +++ b/404.html @@ -8,13 +8,13 @@ Page Not Found | Green Software Patterns - - + +
Skip to main content

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

- - + + \ No newline at end of file diff --git a/assets/js/14ede2c4.8b82b6ac.js b/assets/js/14ede2c4.fb2ad1b3.js similarity index 61% rename from assets/js/14ede2c4.8b82b6ac.js rename to assets/js/14ede2c4.fb2ad1b3.js index d5f6492b..f471b906 100644 --- a/assets/js/14ede2c4.8b82b6ac.js +++ b/assets/js/14ede2c4.fb2ad1b3.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6972],{1520:e=>{e.exports=JSON.parse('{"label":"security","permalink":"/tags/security","allTagsPath":"/tags","count":4,"items":[{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6972],{1520:e=>{e.exports=JSON.parse('{"label":"security","permalink":"/tags/security","allTagsPath":"/tags","count":5,"items":[{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"}]}')}}]); \ No newline at end of file diff --git a/assets/js/1ba1fdde.9240a016.js b/assets/js/1ba1fdde.9240a016.js new file mode 100644 index 00000000..c1defd83 --- /dev/null +++ b/assets/js/1ba1fdde.9240a016.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5025],{4137:(e,r,t)=>{t.d(r,{Zo:()=>u,kt:()=>m});var s=t(7294);function n(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function a(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);r&&(s=s.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,s)}return t}function l(e){for(var r=1;r=0||(n[t]=e[t]);return n}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var o=s.createContext({}),c=function(e){var r=s.useContext(o),t=r;return e&&(t="function"==typeof e?e(r):l(l({},r),e)),t},u=function(e){var r=c(e.components);return s.createElement(o.Provider,{value:r},e.children)},p={inlineCode:"code",wrapper:function(e){var r=e.children;return s.createElement(s.Fragment,{},r)}},d=s.forwardRef((function(e,r){var t=e.components,n=e.mdxType,a=e.originalType,o=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),d=c(t),m=n,v=d["".concat(o,".").concat(m)]||d[m]||p[m]||a;return t?s.createElement(v,l(l({ref:r},u),{},{components:t})):s.createElement(v,l({ref:r},u))}));function m(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var a=t.length,l=new Array(a);l[0]=d;var i={};for(var o in r)hasOwnProperty.call(r,o)&&(i[o]=r[o]);i.originalType=e,i.mdxType="string"==typeof e?e:n,l[1]=i;for(var c=2;c{t.r(r),t.d(r,{assets:()=>o,contentTitle:()=>l,default:()=>p,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var s=t(7462),n=(t(7294),t(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2023-01-17T00:00:00.000Z"),category:"cloud",tags:["cloud","role:cloud-engineer","size:small","serverless"]},l="Use serverless cloud services",i={unversionedId:"catalog/cloud/use-serverless",id:"catalog/cloud/use-serverless",title:"Use serverless cloud services",description:"Description",source:"@site/docs/catalog/cloud/use-serverless.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-serverless",permalink:"/catalog/cloud/use-serverless",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-serverless.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"},{label:"serverless",permalink:"/tags/serverless"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2023-01-17T00:00:00.000Z",category:"cloud",tags:["cloud","role:cloud-engineer","size:small","serverless"]},sidebar:"tutorialSidebar",previous:{title:"Use cloud native processor VMs",permalink:"/catalog/cloud/use-energy-efficient-hardware"},next:{title:"Web",permalink:"/catalog/web/"}},o={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function p(e){let{components:r,...t}=e;return(0,n.kt)("wrapper",(0,s.Z)({},u,t,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"use-serverless-cloud-services"},"Use serverless cloud services"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"Serverless cloud services are services that the cloud provider manages for the application. These scale dynamically with the workload needed to fulfill the service task and apply best practices to keep resource usage minimal."),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"Evaluate serverless based on your application requirements."),(0,n.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,n.kt)("p",null,"Regarding the SCI equation. using serverless cloud services will impact:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"I"),": Resources are only running when in use and shared over many applications, the carbon intensity will decrease. There is a slight increase in provisioning serverless structures (for example AWS Lambda cold starts), overall the carbon intensity still decreases."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"M"),": Serverless architectures share resources and only use resources when needed, this reduces the embodied carbon.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The cloud provider provides serverless services for the technologies the application uses"),(0,n.kt)("li",{parentName:"ul"},"There is an assumption that the application can benefit from serverless architectures")),(0,n.kt)("h2",{id:"considerations"},"Considerations"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Evaluate and consider what workloads can be moved to serverless. Using serverless patterns can involve a complete redesign of the application architecture."),(0,n.kt)("li",{parentName:"ul"},"Consider if your application can afford a cold start during serverless resource initialization. ")),(0,n.kt)("h2",{id:"references"},"References"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://devblogs.microsoft.com/sustainable-software/adopting-azure-serverless-architectures-to-help-reduce-co2-emissions-part-1/"},"Azure Dev Blog"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1ba1fdde.9640d0c5.js b/assets/js/1ba1fdde.9640d0c5.js deleted file mode 100644 index 543d3f62..00000000 --- a/assets/js/1ba1fdde.9640d0c5.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5025],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var s=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);t&&(s=s.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,s)}return r}function a(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var i=s.createContext({}),c=function(e){var t=s.useContext(i),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},u=function(e){var t=c(e.components);return s.createElement(i.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return s.createElement(s.Fragment,{},t)}},d=s.forwardRef((function(e,t){var r=e.components,n=e.mdxType,l=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=c(r),m=n,v=d["".concat(i,".").concat(m)]||d[m]||p[m]||l;return r?s.createElement(v,a(a({ref:t},u),{},{components:r})):s.createElement(v,a({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=r.length,a=new Array(l);a[0]=d;var o={};for(var i in t)hasOwnProperty.call(t,i)&&(o[i]=t[i]);o.originalType=e,o.mdxType="string"==typeof e?e:n,a[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var s=r(7462),n=(r(7294),r(4137));const l={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2023-01-17T00:00:00.000Z"),category:"cloud",tags:["cloud","role:cloud-engineer","size:small","serverless"]},a="Use serverless cloud services",o={unversionedId:"catalog/cloud/use-serverless",id:"catalog/cloud/use-serverless",title:"Use serverless cloud services",description:"Description",source:"@site/docs/catalog/cloud/use-serverless.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-serverless",permalink:"/catalog/cloud/use-serverless",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-serverless.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"},{label:"serverless",permalink:"/tags/serverless"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2023-01-17T00:00:00.000Z",category:"cloud",tags:["cloud","role:cloud-engineer","size:small","serverless"]},sidebar:"tutorialSidebar",previous:{title:"Use cloud native network security tools and controls",permalink:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},next:{title:"Web",permalink:"/catalog/web/"}},i={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function p(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,s.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"use-serverless-cloud-services"},"Use serverless cloud services"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"Serverless cloud services are services that the cloud provider manages for the application. These scale dynamically with the workload needed to fulfill the service task and apply best practices to keep resource usage minimal."),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"Evaluate serverless based on your application requirements."),(0,n.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,n.kt)("p",null,"Regarding the SCI equation. using serverless cloud services will impact:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"I"),": Resources are only running when in use and shared over many applications, the carbon intensity will decrease. There is a slight increase in provisioning serverless structures (for example AWS Lambda cold starts), overall the carbon intensity still decreases."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"M"),": Serverless architectures share resources and only use resources when needed, this reduces the embodied carbon.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"The cloud provider provides serverless services for the technologies the application uses"),(0,n.kt)("li",{parentName:"ul"},"There is an assumption that the application can benefit from serverless architectures")),(0,n.kt)("h2",{id:"considerations"},"Considerations"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Evaluate and consider what workloads can be moved to serverless. Using serverless patterns can involve a complete redesign of the application architecture."),(0,n.kt)("li",{parentName:"ul"},"Consider if your application can afford a cold start during serverless resource initialization. ")),(0,n.kt)("h2",{id:"references"},"References"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://devblogs.microsoft.com/sustainable-software/adopting-azure-serverless-architectures-to-help-reduce-co2-emissions-part-1/"},"Azure Dev Blog"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/27fa7df4.4207b948.js b/assets/js/27fa7df4.4207b948.js new file mode 100644 index 00000000..da19dc73 --- /dev/null +++ b/assets/js/27fa7df4.4207b948.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8604],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=n(7294);function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}function r(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var c=o.createContext({}),s=function(e){var t=o.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):r(r({},t),e)),n},u=function(e){var t=s(e.components);return o.createElement(c.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,c=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=s(n),m=i,g=d["".concat(c,".").concat(m)]||d[m]||p[m]||a;return n?o.createElement(g,r(r({ref:t},u),{},{components:n})):o.createElement(g,r({ref:t},u))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,r=new Array(a);r[0]=d;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:i,r[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>r,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>s});var o=n(7462),i=(n(7294),n(4137));const a={version:1,submitted_by:"yelghali",published_date:new Date("2024-03-14T00:00:00.000Z"),category:"cloud",tags:["compute","cloud","kubernetes","role:software-engineer","role:cloud-engineer","size:medium"]},r="Scale logical components independently",l={unversionedId:"catalog/cloud/scale-logical-components-independently",id:"catalog/cloud/scale-logical-components-independently",title:"Scale logical components independently",description:"Description",source:"@site/docs/catalog/cloud/scale-logical-components-independently.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/scale-logical-components-independently",permalink:"/catalog/cloud/scale-logical-components-independently",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/scale-logical-components-independently.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"cloud",permalink:"/tags/cloud"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2024-03-14T00:00:00.000Z",category:"cloud",tags:["compute","cloud","kubernetes","role:software-engineer","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Scale Kubernetes workloads based on relevant demand metrics",permalink:"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},next:{title:"Scan for vulnerabilities",permalink:"/catalog/cloud/scan-for-vulnerabilities"}},c={},s=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2}],u={toc:s};function p(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"scale-logical-components-independently"},"Scale logical components independently"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"A microservice architecture may reduce the amount of compute resources required as it allows each independent component to be scaled according to its own demand."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Using cloud native projects can help you separate your application functionality into different microservices. This kind of microservice architecture allows for independent scaling of the application's logical components."),(0,i.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,i.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,i.kt)("p",null,"Scaling logical components independently will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": By optimizing the scaling of the most consuming application components, we reduce the amount of energy consumed by the application globally."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By scaling each component independently, we can right-size its resources to maximize their utilization, thereby reducing the application's total embodied carbon emissions.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"The application's logical components are deployed on platforms with auto-scaling capabilities, such as Kubernetes.")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Microservice frameworks use additional components or resources in order to provide additional capabilities (messaging, secure traffic, tracing, etc.). This may result in an increase in carbon emissions. As such, only the necessary framework capabilities should be used."),(0,i.kt)("li",{parentName:"ul"},"Communication incurs overheads, which also have a carbon impact. As such, microservices should not be made too small. Alternatively, communication tools other than http/s should be considered, such as GPRC.")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/359b770c.d4759ec0.js b/assets/js/359b770c.8c41d758.js similarity index 52% rename from assets/js/359b770c.d4759ec0.js rename to assets/js/359b770c.8c41d758.js index 650949d1..02d59ed7 100644 --- a/assets/js/359b770c.d4759ec0.js +++ b/assets/js/359b770c.8c41d758.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5677],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function i(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=r,b=p["".concat(l,".").concat(m)]||p[m]||d[m]||o;return n?a.createElement(b,i(i({ref:t},u),{},{components:n})):a.createElement(b,i({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,i=new Array(o);i[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:r,i[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var a=n(7462),r=(n(7294),n(4137));const o={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it's difficult to correlate your application's demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.",tags:["cloud","serverless","kubernetes","role:software-engineer","role:cloud-engineer","size:medium"]},i="Scale Kubernetes workloads based on relevant demand metrics",s={unversionedId:"catalog/cloud/scale-kubernetes-workloads-based-on-events",id:"catalog/cloud/scale-kubernetes-workloads-based-on-events",title:"Scale Kubernetes workloads based on relevant demand metrics",description:"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it's difficult to correlate your application's demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.",source:"@site/docs/catalog/cloud/scale-kubernetes-workloads-based-on-events.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/scale-kubernetes-workloads-based-on-events",permalink:"/catalog/cloud/scale-kubernetes-workloads-based-on-events",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/scale-kubernetes-workloads-based-on-events.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"serverless",permalink:"/tags/serverless"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it's difficult to correlate your application's demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.",tags:["cloud","serverless","kubernetes","role:software-engineer","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Scale infrastructure with user load",permalink:"/catalog/cloud/scale-infrastructure-with-user-load"},next:{title:"Scan for vulnerabilities",permalink:"/catalog/cloud/scan-for-vulnerabilities"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2}],u={toc:c};function d(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"scale-kubernetes-workloads-based-on-relevant-demand-metrics"},"Scale Kubernetes workloads based on relevant demand metrics"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it's difficult to correlate your application's demand drivers with CPU and RAM utilization."),(0,r.kt)("p",null,"Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Implement a custom scaler for your application, or use ",(0,r.kt)("a",{parentName:"p",href:"https://keda.sh"},"KEDA")," to help you build event-driven Kubernetes applications, to allow scaling down to zero when there is no demand."),(0,r.kt)("p",null,"In addition to scaling Kubernetes applications based on relevent scaling metrics (or events), cluster auto-scaling and bursting capabilities are also used to scale infrastructure based on demand."),(0,r.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,r.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,r.kt)("p",null,"Scaling based on events will impact SCI as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"M"),": By scaling the workloads based on demand and reducing resource utilization, the total embodied carbon emissions by the Kubernetes cluster is lower.")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("p",null,"The metrics that drive application demand and scaling needs are known."),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("p",null,"If your workloads have predictable usage patterns, you could implement scaling based on time as an alternative to optimize utilization and reduce carbon emissions."))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5677],{4137:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>m});var a=n(7294);function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=a.createContext({}),c=function(e){var t=a.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},d=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=a.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,d=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=r,b=p["".concat(l,".").concat(m)]||p[m]||u[m]||o;return n?a.createElement(b,s(s({ref:t},d),{},{components:n})):a.createElement(b,s({ref:t},d))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,s=new Array(o);s[0]=p;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:r,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>i,toc:()=>c});var a=n(7462),r=(n(7294),n(4137));const o={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it's difficult to correlate your application's demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.",tags:["cloud","serverless","kubernetes","role:software-engineer","role:cloud-engineer","size:medium"]},s="Scale Kubernetes workloads based on relevant demand metrics",i={unversionedId:"catalog/cloud/scale-kubernetes-workloads-based-on-events",id:"catalog/cloud/scale-kubernetes-workloads-based-on-events",title:"Scale Kubernetes workloads based on relevant demand metrics",description:"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it's difficult to correlate your application's demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.",source:"@site/docs/catalog/cloud/scale-kubernetes-workloads-based-on-events.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/scale-kubernetes-workloads-based-on-events",permalink:"/catalog/cloud/scale-kubernetes-workloads-based-on-events",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/scale-kubernetes-workloads-based-on-events.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"serverless",permalink:"/tags/serverless"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it's difficult to correlate your application's demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.",tags:["cloud","serverless","kubernetes","role:software-engineer","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Scale infrastructure with user load",permalink:"/catalog/cloud/scale-infrastructure-with-user-load"},next:{title:"Scale logical components independently",permalink:"/catalog/cloud/scale-logical-components-independently"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2}],d={toc:c};function u(e){let{components:t,...n}=e;return(0,r.kt)("wrapper",(0,a.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"scale-kubernetes-workloads-based-on-relevant-demand-metrics"},"Scale Kubernetes workloads based on relevant demand metrics"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it's difficult to correlate your application's demand drivers with CPU and RAM utilization."),(0,r.kt)("p",null,"Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Implement a custom scaler for your application, or use ",(0,r.kt)("a",{parentName:"p",href:"https://keda.sh"},"KEDA")," to help you build event-driven Kubernetes applications, to allow scaling down to zero when there is no demand."),(0,r.kt)("p",null,"In addition to scaling Kubernetes applications based on relevent scaling metrics (or events), cluster auto-scaling and bursting capabilities are also used to scale infrastructure based on demand."),(0,r.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,r.kt)("p",null,(0,r.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,r.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,r.kt)("p",null,"Scaling based on events will impact SCI as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"M"),": By scaling the workloads based on demand and reducing resource utilization, the total embodied carbon emissions by the Kubernetes cluster is lower.")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("p",null,"The metrics that drive application demand and scaling needs are known."),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("p",null,"If your workloads have predictable usage patterns, you could implement scaling based on time as an alternative to optimize utilization and reduce carbon emissions."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/41cb6a13.313b0179.js b/assets/js/41cb6a13.313b0179.js new file mode 100644 index 00000000..8c0eb82b --- /dev/null +++ b/assets/js/41cb6a13.313b0179.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5082],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var a=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=a.createContext({}),c=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return a.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(r),h=i,m=d["".concat(l,".").concat(h)]||d[h]||p[h]||n;return r?a.createElement(m,o(o({ref:t},u),{},{components:r})):a.createElement(m,o({ref:t},u))}));function h(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:i,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var a=r(7462),i=(r(7294),r(4137));const n={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2023-10-25T00:00:00.000Z"),category:"cloud",description:"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types",tags:["cloud","size:small"]},o="Evaluate other CPU architectures",s={unversionedId:"catalog/cloud/evaluate-other-cpu-architectures",id:"catalog/cloud/evaluate-other-cpu-architectures",title:"Evaluate other CPU architectures",description:"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types",source:"@site/docs/catalog/cloud/evaluate-other-cpu-architectures.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/evaluate-other-cpu-architectures",permalink:"/catalog/cloud/evaluate-other-cpu-architectures",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/evaluate-other-cpu-architectures.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2023-10-25T00:00:00.000Z",category:"cloud",description:"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types",tags:["cloud","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Encrypt what is necessary",permalink:"/catalog/cloud/encrypt-what-is-necessary"},next:{title:"Use a service mesh only if needed",permalink:"/catalog/cloud/evaluate-using-a-service-mesh"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function p(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"evaluate-other-cpu-architectures"},"Evaluate other CPU architectures"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types, such as x86-64, which can be included in the evaluation along with many cost effective alternatives that feature good performance per watt."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Other CPU architectures besides x86_64 should be evaluated for the application with energy efficiency and execution performance in mind."),(0,i.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,i.kt)("p",null,"Evaluating other CPU architectures can impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Other CPU architectures may provide better energy efficiency for the application use case and, as such, reduce the overall energy consumption")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Assumes that the framework can be executed on other CPU architectures as well and is optimized for it")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Also consider specialized accelerators for workloads that cloud providers might offer")),(0,i.kt)("h2",{id:"references"},"References"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-application-design"},"Azure Well-Architected Framework Sustainability Pillar"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/41cb6a13.c1c04552.js b/assets/js/41cb6a13.c1c04552.js deleted file mode 100644 index 2c956c1c..00000000 --- a/assets/js/41cb6a13.c1c04552.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5082],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var a=r(7294);function i(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var s=a.createContext({}),c=function(e){var t=a.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return a.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},d=a.forwardRef((function(e,t){var r=e.components,i=e.mdxType,n=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(r),h=i,m=d["".concat(s,".").concat(h)]||d[h]||p[h]||n;return r?a.createElement(m,o(o({ref:t},u),{},{components:r})):a.createElement(m,o({ref:t},u))}));function h(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:i,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>n,metadata:()=>l,toc:()=>c});var a=r(7462),i=(r(7294),r(4137));const n={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2023-10-25T00:00:00.000Z"),category:"cloud",description:"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types",tags:["cloud","size:small"]},o="Evaluate other CPU architectures",l={unversionedId:"catalog/cloud/evaluate-other-cpu-architectures",id:"catalog/cloud/evaluate-other-cpu-architectures",title:"Evaluate other CPU architectures",description:"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types",source:"@site/docs/catalog/cloud/evaluate-other-cpu-architectures.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/evaluate-other-cpu-architectures",permalink:"/catalog/cloud/evaluate-other-cpu-architectures",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/evaluate-other-cpu-architectures.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2023-10-25T00:00:00.000Z",category:"cloud",description:"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types",tags:["cloud","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Encrypt what is necessary",permalink:"/catalog/cloud/encrypt-what-is-necessary"},next:{title:"Terminate TLS at border gateway",permalink:"/catalog/cloud/evaluate-whether-to-use-TLS-termination"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function p(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"evaluate-other-cpu-architectures"},"Evaluate other CPU architectures"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types, such as x86-64, which can be included in the evaluation along with many cost effective alternatives that feature good performance per watt."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Other CPU architectures besides x86_64 should be evaluated for the application with energy efficiency and execution performance in mind."),(0,i.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,i.kt)("p",null,(0,i.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,i.kt)("br",{parentName:"p"}),"\n",(0,i.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,i.kt)("p",null,"Evaluating other CPU architectures can impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Other CPU architectures may provide better energy efficiency for the application use case and, as such, reduce the overall energy consumption")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Assumes that the framework can be executed on other CPU architectures as well and is optimized for it")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Also consider specialized accelerators for workloads that cloud providers might offer")),(0,i.kt)("h2",{id:"references"},"References"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-application-design"},"Azure Well-Architected Framework Sustainability Pillar"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/55960ee5.7208ceb3.js b/assets/js/55960ee5.7208ceb3.js deleted file mode 100644 index f7e400a8..00000000 --- a/assets/js/55960ee5.7208ceb3.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4121],{8070:e=>{e.exports=JSON.parse('[{"label":"ai","permalink":"/tags/ai","count":9},{"label":"machine-learning","permalink":"/tags/machine-learning","count":9},{"label":"role:data-scientist","permalink":"/tags/role-data-scientist","count":9},{"label":"size:small","permalink":"/tags/size-small","count":33},{"label":"serverless","permalink":"/tags/serverless","count":3},{"label":"networking","permalink":"/tags/networking","count":5},{"label":"role:cloud-engineer","permalink":"/tags/role-cloud-engineer","count":22},{"label":"storage","permalink":"/tags/storage","count":4},{"label":"size:medium","permalink":"/tags/size-medium","count":16},{"label":"cloud","permalink":"/tags/cloud","count":16},{"label":"security","permalink":"/tags/security","count":4},{"label":"compute","permalink":"/tags/compute","count":12},{"label":"kubernetes","permalink":"/tags/kubernetes","count":7},{"label":"role:software-engineer","permalink":"/tags/role-software-engineer","count":9},{"label":"Reliability/Availability","permalink":"/tags/reliability-availability","count":2},{"label":"Monitoring","permalink":"/tags/monitoring","count":4},{"label":"deployment","permalink":"/tags/deployment","count":1},{"label":"role:reliability-engineer","permalink":"/tags/role-reliability-engineer","count":3},{"label":"size:large","permalink":"/tags/size-large","count":1},{"label":"web","permalink":"/tags/web","count":12},{"label":"role:web-developer","permalink":"/tags/role-web-developer","count":12}]')}}]); \ No newline at end of file diff --git a/assets/js/55960ee5.a5223009.js b/assets/js/55960ee5.a5223009.js new file mode 100644 index 00000000..a26efe1c --- /dev/null +++ b/assets/js/55960ee5.a5223009.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4121],{8070:e=>{e.exports=JSON.parse('[{"label":"ai","permalink":"/tags/ai","count":9},{"label":"machine-learning","permalink":"/tags/machine-learning","count":9},{"label":"role:data-scientist","permalink":"/tags/role-data-scientist","count":9},{"label":"size:small","permalink":"/tags/size-small","count":34},{"label":"serverless","permalink":"/tags/serverless","count":3},{"label":"networking","permalink":"/tags/networking","count":5},{"label":"role:cloud-engineer","permalink":"/tags/role-cloud-engineer","count":26},{"label":"cloud","permalink":"/tags/cloud","count":22},{"label":"size:medium","permalink":"/tags/size-medium","count":21},{"label":"compute","permalink":"/tags/compute","count":15},{"label":"kubernetes","permalink":"/tags/kubernetes","count":11},{"label":"storage","permalink":"/tags/storage","count":4},{"label":"security","permalink":"/tags/security","count":5},{"label":"network","permalink":"/tags/network","count":1},{"label":"role:software-engineer","permalink":"/tags/role-software-engineer","count":11},{"label":"Reliability/Availability","permalink":"/tags/reliability-availability","count":2},{"label":"Monitoring","permalink":"/tags/monitoring","count":4},{"label":"deployment","permalink":"/tags/deployment","count":1},{"label":"role:reliability-engineer","permalink":"/tags/role-reliability-engineer","count":3},{"label":"size:large","permalink":"/tags/size-large","count":1},{"label":"web","permalink":"/tags/web","count":12},{"label":"role:web-developer","permalink":"/tags/role-web-developer","count":12}]')}}]); \ No newline at end of file diff --git a/assets/js/5b55fa8e.3033515f.js b/assets/js/5b55fa8e.3033515f.js new file mode 100644 index 00000000..dda88cc2 --- /dev/null +++ b/assets/js/5b55fa8e.3033515f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[50],{7798:e=>{e.exports=JSON.parse('{"label":"size:medium","permalink":"/tags/size-medium","allTagsPath":"/tags","count":21,"items":[{"id":"catalog/web/avoid-excessive-dom-size","title":"Avoid an excessive DOM size","description":"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.","permalink":"/catalog/web/avoid-excessive-dom-size"},{"id":"catalog/web/avoid-chaining-critical-requests","title":"Avoid chaining critical requests","description":"Most web experiences require a lot of work from the user\'s browser. The greater the length of the chains and the larger the download sizes, the more significant the impact on page load performance and the energy required to render a page.","permalink":"/catalog/web/avoid-chaining-critical-requests"},{"id":"catalog/cloud/compress-stored-data","title":"Compress stored data","description":"Description","permalink":"/catalog/cloud/compress-stored-data"},{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/web/keep-request-counts-low","title":"Keep request counts low","description":"Accessing a web page usually retrieves a HTML file from the web server. The HTML may then reference additional resources that the browser has to download.","permalink":"/catalog/web/keep-request-counts-low"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/web/properly-sized-images","title":"Optimize image size","description":"Ideally, the stored pixel dimensions are exactly the same, or smaller, as the display size in pixels so that no bandwidth or storage space is wasted.","permalink":"/catalog/web/properly-sized-images"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","permalink":"/catalog/cloud/use-async-instead-of-sync"},{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","permalink":"/catalog/cloud/use-circuit-breaker"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"}]}')}}]); \ No newline at end of file diff --git a/assets/js/5b55fa8e.4e00b448.js b/assets/js/5b55fa8e.4e00b448.js deleted file mode 100644 index 8172ca6d..00000000 --- a/assets/js/5b55fa8e.4e00b448.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[50],{7798:e=>{e.exports=JSON.parse('{"label":"size:medium","permalink":"/tags/size-medium","allTagsPath":"/tags","count":16,"items":[{"id":"catalog/web/avoid-excessive-dom-size","title":"Avoid an excessive DOM size","description":"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.","permalink":"/catalog/web/avoid-excessive-dom-size"},{"id":"catalog/web/avoid-chaining-critical-requests","title":"Avoid chaining critical requests","description":"Most web experiences require a lot of work from the user\'s browser. The greater the length of the chains and the larger the download sizes, the more significant the impact on page load performance and the energy required to render a page.","permalink":"/catalog/web/avoid-chaining-critical-requests"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/web/keep-request-counts-low","title":"Keep request counts low","description":"Accessing a web page usually retrieves a HTML file from the web server. The HTML may then reference additional resources that the browser has to download.","permalink":"/catalog/web/keep-request-counts-low"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/web/properly-sized-images","title":"Optimize image size","description":"Ideally, the stored pixel dimensions are exactly the same, or smaller, as the display size in pixels so that no bandwidth or storage space is wasted.","permalink":"/catalog/web/properly-sized-images"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","permalink":"/catalog/cloud/use-async-instead-of-sync"},{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","permalink":"/catalog/cloud/use-circuit-breaker"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"}]}')}}]); \ No newline at end of file diff --git a/assets/js/5cff0ebf.679e763e.js b/assets/js/5cff0ebf.679e763e.js deleted file mode 100644 index b5c86f88..00000000 --- a/assets/js/5cff0ebf.679e763e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8961],{3039:e=>{e.exports=JSON.parse('{"label":"compute","permalink":"/tags/compute","allTagsPath":"/tags","count":12,"items":[{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","permalink":"/catalog/web/minimize-main-thread-work"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","permalink":"/catalog/cloud/shed-lower-priority-traffic"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","permalink":"/catalog/cloud/use-circuit-breaker"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"}]}')}}]); \ No newline at end of file diff --git a/assets/js/5cff0ebf.b3ca71af.js b/assets/js/5cff0ebf.b3ca71af.js new file mode 100644 index 00000000..0c0d0a64 --- /dev/null +++ b/assets/js/5cff0ebf.b3ca71af.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8961],{3039:e=>{e.exports=JSON.parse('{"label":"compute","permalink":"/tags/compute","allTagsPath":"/tags","count":15,"items":[{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","permalink":"/catalog/web/minimize-main-thread-work"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","permalink":"/catalog/cloud/shed-lower-priority-traffic"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","permalink":"/catalog/cloud/use-circuit-breaker"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"}]}')}}]); \ No newline at end of file diff --git a/assets/js/5e582b23.cef43d14.js b/assets/js/5e582b23.1e0eff5a.js similarity index 88% rename from assets/js/5e582b23.cef43d14.js rename to assets/js/5e582b23.1e0eff5a.js index 566e0fb0..cc0af041 100644 --- a/assets/js/5e582b23.cef43d14.js +++ b/assets/js/5e582b23.1e0eff5a.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2645],{5554:e=>{e.exports=JSON.parse('{"label":"size:small","permalink":"/tags/size-small","allTagsPath":"/tags","count":33,"items":[{"id":"catalog/ai/serverless-model-development","title":"Adopt serverless architecture for AI/ML workload processes","description":"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.","permalink":"/catalog/ai/serverless-model-development"},{"id":"catalog/web/avoid-tracking-unnecessary-data","title":"Avoid tracking unnecessary data","description":"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.","permalink":"/catalog/web/avoid-tracking-unnecessary-data"},{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","permalink":"/catalog/cloud/cache-static-data"},{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","permalink":"/catalog/cloud/choose-region-closest-to-users"},{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/compress-transmitted-data"},{"id":"catalog/web/defer-offscreen-images","title":"Defer offscreen images","description":"Web pages offer a lot of images that aren\'t displayed on the first loaded screen and can thus be loaded dynamically.","permalink":"/catalog/web/defer-offscreen-images"},{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/delete-unused-storage-resources"},{"id":"catalog/web/deprecate-gifs","title":"Deprecate GIFs for animated content","description":"One direct replacement of the GIF is the MP4 video format which provides much smaller file sizes and higher quality at the same time.","permalink":"/catalog/web/deprecate-gifs"},{"id":"catalog/web/enable-text-compression","title":"Enable text compression","description":"Web browsers often communicate with web servers in a human readable format. These can be HTML, JavaScript and/or CSS files and REST requests which can return a response in JSON. This human readable communication is redundant and, as such, can be compressed to save bandwidth.","permalink":"/catalog/web/enable-text-compression"},{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","permalink":"/catalog/cloud/evaluate-other-cpu-architectures"},{"id":"catalog/ai/pre-trained-transfer-learning","title":"Leverage pre-trained models and transfer learning for AI/ML development","description":"As part of your AI/ML process, you should evaluate using a pre-trained model and use transfer learning to avoid training a new model from scratch.","permalink":"/catalog/ai/pre-trained-transfer-learning"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/web/minify-web-assets","title":"Minify web assets","description":"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.","permalink":"/catalog/web/minify-web-assets"},{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","permalink":"/catalog/web/minimize-main-thread-work"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","permalink":"/catalog/cloud/optimise-storage-resource-utilisation"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/ai/compress-ml-models-for-inference","title":"Optimize the size of AI/ML models","description":"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.","permalink":"/catalog/ai/compress-ml-models-for-inference"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/reduce-transmitted-data"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/web/remove-unused-css","title":"Remove unused CSS definitions","description":"CSS files are very complex and need energy intensive parsing and processing. Each added CSS definition increases the amount of time and processing power needed in this process.","permalink":"/catalog/web/remove-unused-css"},{"id":"catalog/ai/energy-efficent-ai-edge","title":"Run AI models at the edge","description":"Data computation for ML workloads and ML inference is a significant contributor to the carbon footprint of the ML application. Also, if the ML model is running on the cloud, the data needs to be transferred and processed on the cloud to the required format that can be used by the ML model for inference.","permalink":"/catalog/ai/energy-efficent-ai-edge"},{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","permalink":"/catalog/cloud/scale-down-unused-applications"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/ai/energy-efficent-framework","title":"Select a more energy efficient AI/ML framework","description":"Training an AI model implies a significant carbon footprint. The underlying framework used for the development, training, and deployment of AI/ML needs to be evaluated and considered to ensure the process is as energy efficient as possible.","permalink":"/catalog/ai/energy-efficent-framework"},{"id":"catalog/ai/right-hardware-type","title":"Select the right hardware/VM instance types for AI/ML training","description":"Selecting the right hardware/VM instance types for training is one of the choices you should make as part of your energy-efficient AI/ML process.","permalink":"/catalog/ai/right-hardware-type"},{"id":"catalog/web/serve-images-in-modern-formats","title":"Serve images in modern formats","description":"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.","permalink":"/catalog/web/serve-images-in-modern-formats"},{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/set-retention-policy-on-storage-resources"},{"id":"catalog/ai/efficent-format-for-model-training","title":"Use efficient file formats for AI/ML development","description":"Efficient storage of the model becomes extremely important to manage the data used for ML model development.","permalink":"/catalog/ai/efficent-format-for-model-training"},{"id":"catalog/ai/energy-efficent-models","title":"Use energy efficient AI/ML models","description":"Evaluate and use alternative, more energy efficient, models that provide similar functionality.","permalink":"/catalog/ai/energy-efficent-models"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"},{"id":"catalog/ai/leverage-sustainable-regions","title":"Use sustainable regions for AI/ML training","description":"Depending on the model parameters and training iterations, training an AI/ML model consumes a lot of power and requires many servers which contribute to embodied emissions.","permalink":"/catalog/ai/leverage-sustainable-regions"}]}')}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2645],{5554:e=>{e.exports=JSON.parse('{"label":"size:small","permalink":"/tags/size-small","allTagsPath":"/tags","count":34,"items":[{"id":"catalog/ai/serverless-model-development","title":"Adopt serverless architecture for AI/ML workload processes","description":"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.","permalink":"/catalog/ai/serverless-model-development"},{"id":"catalog/web/avoid-tracking-unnecessary-data","title":"Avoid tracking unnecessary data","description":"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.","permalink":"/catalog/web/avoid-tracking-unnecessary-data"},{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","permalink":"/catalog/cloud/cache-static-data"},{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","permalink":"/catalog/cloud/choose-region-closest-to-users"},{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/compress-transmitted-data"},{"id":"catalog/web/defer-offscreen-images","title":"Defer offscreen images","description":"Web pages offer a lot of images that aren\'t displayed on the first loaded screen and can thus be loaded dynamically.","permalink":"/catalog/web/defer-offscreen-images"},{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/delete-unused-storage-resources"},{"id":"catalog/web/deprecate-gifs","title":"Deprecate GIFs for animated content","description":"One direct replacement of the GIF is the MP4 video format which provides much smaller file sizes and higher quality at the same time.","permalink":"/catalog/web/deprecate-gifs"},{"id":"catalog/web/enable-text-compression","title":"Enable text compression","description":"Web browsers often communicate with web servers in a human readable format. These can be HTML, JavaScript and/or CSS files and REST requests which can return a response in JSON. This human readable communication is redundant and, as such, can be compressed to save bandwidth.","permalink":"/catalog/web/enable-text-compression"},{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","permalink":"/catalog/cloud/evaluate-other-cpu-architectures"},{"id":"catalog/ai/pre-trained-transfer-learning","title":"Leverage pre-trained models and transfer learning for AI/ML development","description":"As part of your AI/ML process, you should evaluate using a pre-trained model and use transfer learning to avoid training a new model from scratch.","permalink":"/catalog/ai/pre-trained-transfer-learning"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/web/minify-web-assets","title":"Minify web assets","description":"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.","permalink":"/catalog/web/minify-web-assets"},{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","permalink":"/catalog/web/minimize-main-thread-work"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","permalink":"/catalog/cloud/optimise-storage-resource-utilisation"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/ai/compress-ml-models-for-inference","title":"Optimize the size of AI/ML models","description":"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.","permalink":"/catalog/ai/compress-ml-models-for-inference"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/reduce-transmitted-data"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/web/remove-unused-css","title":"Remove unused CSS definitions","description":"CSS files are very complex and need energy intensive parsing and processing. Each added CSS definition increases the amount of time and processing power needed in this process.","permalink":"/catalog/web/remove-unused-css"},{"id":"catalog/ai/energy-efficent-ai-edge","title":"Run AI models at the edge","description":"Data computation for ML workloads and ML inference is a significant contributor to the carbon footprint of the ML application. Also, if the ML model is running on the cloud, the data needs to be transferred and processed on the cloud to the required format that can be used by the ML model for inference.","permalink":"/catalog/ai/energy-efficent-ai-edge"},{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","permalink":"/catalog/cloud/scale-down-unused-applications"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/ai/energy-efficent-framework","title":"Select a more energy efficient AI/ML framework","description":"Training an AI model implies a significant carbon footprint. The underlying framework used for the development, training, and deployment of AI/ML needs to be evaluated and considered to ensure the process is as energy efficient as possible.","permalink":"/catalog/ai/energy-efficent-framework"},{"id":"catalog/ai/right-hardware-type","title":"Select the right hardware/VM instance types for AI/ML training","description":"Selecting the right hardware/VM instance types for training is one of the choices you should make as part of your energy-efficient AI/ML process.","permalink":"/catalog/ai/right-hardware-type"},{"id":"catalog/web/serve-images-in-modern-formats","title":"Serve images in modern formats","description":"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.","permalink":"/catalog/web/serve-images-in-modern-formats"},{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/set-retention-policy-on-storage-resources"},{"id":"catalog/cloud/use-ddos-protection","title":"Use DDoS protection","description":"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.","permalink":"/catalog/cloud/use-ddos-protection"},{"id":"catalog/ai/efficent-format-for-model-training","title":"Use efficient file formats for AI/ML development","description":"Efficient storage of the model becomes extremely important to manage the data used for ML model development.","permalink":"/catalog/ai/efficent-format-for-model-training"},{"id":"catalog/ai/energy-efficent-models","title":"Use energy efficient AI/ML models","description":"Evaluate and use alternative, more energy efficient, models that provide similar functionality.","permalink":"/catalog/ai/energy-efficent-models"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"},{"id":"catalog/ai/leverage-sustainable-regions","title":"Use sustainable regions for AI/ML training","description":"Depending on the model parameters and training iterations, training an AI/ML model consumes a lot of power and requires many servers which contribute to embodied emissions.","permalink":"/catalog/ai/leverage-sustainable-regions"}]}')}}]); \ No newline at end of file diff --git a/assets/js/6dd24dad.57465850.js b/assets/js/6dd24dad.57465850.js new file mode 100644 index 00000000..2d529d60 --- /dev/null +++ b/assets/js/6dd24dad.57465850.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9930],{4559:e=>{e.exports=JSON.parse('{"label":"network","permalink":"/tags/network","allTagsPath":"/tags","count":1,"items":[{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"}]}')}}]); \ No newline at end of file diff --git a/assets/js/782ac186.9a53e81e.js b/assets/js/782ac186.9a53e81e.js new file mode 100644 index 00000000..a3da0d3c --- /dev/null +++ b/assets/js/782ac186.9a53e81e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4148],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(r),m=o,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||a;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=r(7462),o=(r(7294),r(4137));const a={version:1,submitted_by:"yelghali",published_date:new Date("2024-03-14T00:00:00.000Z"),category:"cloud",tags:["cloud","compute","kubernetes","role:cloud-engineer","size:medium"]},i="Containerize your workloads",l={unversionedId:"catalog/cloud/containerize-your-workload-where-applicable",id:"catalog/cloud/containerize-your-workload-where-applicable",title:"Containerize your workloads",description:"Description",source:"@site/docs/catalog/cloud/containerize-your-workload-where-applicable.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/containerize-your-workload-where-applicable",permalink:"/catalog/cloud/containerize-your-workload-where-applicable",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/containerize-your-workload-where-applicable.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2024-03-14T00:00:00.000Z",category:"cloud",tags:["cloud","compute","kubernetes","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Compress transmitted data",permalink:"/catalog/cloud/compress-transmitted-data"},next:{title:"Delete unused storage resources",permalink:"/catalog/cloud/delete-unused-storage-resources"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function p(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"containerize-your-workloads"},"Containerize your workloads"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"Containers allow resources to be used more flexibly, as workloads can be easily moved between machines. Containers allow for bin packing and require less compute resources than virtual machines, meaning a reduction in unnecessary resource allocation and an increase in utilization of the compute resources."),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Containerize your applications with their minimal dependencies. This can be done using tools for generating Dockerfiles and Kubernetes manifests."),(0,o.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Containerizing workloads impacts SCI as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": By reducing CPU and RAM usage, we reduce the amount of energy required."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": Reducing compute resources decreases the embodied carbon emissions.")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The application supports containerization.")),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Using containers may not be enough to reduce the carbon impact of a large monolith application."),(0,o.kt)("li",{parentName:"ul"},"Consider modernizing your applications into micro-service architectures that allow independent sizing and scaling of their logical components."),(0,o.kt)("li",{parentName:"ul"},"You may use a container orchestration system for automating software deployment, scaling, and management.")),(0,o.kt)("h2",{id:"references"},"References"),(0,o.kt)("p",null,"Microsoft Azure Well Architected Framework ",(0,o.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-application-platform"},"sustainability patterns")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7a11bfb9.244eda19.js b/assets/js/7a11bfb9.40945dd2.js similarity index 50% rename from assets/js/7a11bfb9.244eda19.js rename to assets/js/7a11bfb9.40945dd2.js index 612e3e86..e747a292 100644 --- a/assets/js/7a11bfb9.244eda19.js +++ b/assets/js/7a11bfb9.40945dd2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1421],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(n),m=a,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||i;return n?r.createElement(f,o(o({ref:t},u),{},{components:n})):r.createElement(f,o({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var r=n(7462),a=(n(7294),n(4137));const i={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.",tags:["cloud","security","compute","kubernetes","role:cloud-engineer","size:medium"]},o="Scan for vulnerabilities",s={unversionedId:"catalog/cloud/scan-for-vulnerabilities",id:"catalog/cloud/scan-for-vulnerabilities",title:"Scan for vulnerabilities",description:"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.",source:"@site/docs/catalog/cloud/scan-for-vulnerabilities.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/scan-for-vulnerabilities",permalink:"/catalog/cloud/scan-for-vulnerabilities",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/scan-for-vulnerabilities.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"security",permalink:"/tags/security"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.",tags:["cloud","security","compute","kubernetes","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Scale Kubernetes workloads based on relevant demand metrics",permalink:"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},next:{title:"Set storage retention policies",permalink:"/catalog/cloud/set-retention-policy-on-storage-resources"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"scan-for-vulnerabilities"},"Scan for vulnerabilities"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost. "),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Vulnerability_scanner"},"Vulnerability scanning")," and ",(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Endpoint_detection_and_response"},"endpoint detection and response")," (EDR) tools help minimize the window of opportunity for attackers and mitigate any potential malicious usage of resources."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"The EDR capabilities provide advanced attack detections and are able to take response actions to remediate those threats. The unnecessary resource usage created by these common attacks can quickly be discovered and remediated, often without the intervention of a security analyst."),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Scanning for vulnerabilities will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By preventing heavy misusage of resources, unnecesseary embodied carbon emissions are avoided.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"A zero trust security policy is implemented, which covers security controls for infrastructure, applications, data, networking, ",(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Role-based_access_control"},"role-based access control")," (RBAC), and devices. "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"Leverage cloud native EDR and scanning services, which scale based on demand, to maintain awareness of the carbon impact of the security tooling."),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-security"},"Microsoft Azure well architected framework sustainability patterns")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1421],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function o(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(n),m=a,f=d["".concat(l,".").concat(m)]||d[m]||p[m]||i;return n?r.createElement(f,o(o({ref:t},u),{},{components:n})):r.createElement(f,o({ref:t},u))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,o[1]=s;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var r=n(7462),a=(n(7294),n(4137));const i={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.",tags:["cloud","security","compute","kubernetes","role:cloud-engineer","size:medium"]},o="Scan for vulnerabilities",s={unversionedId:"catalog/cloud/scan-for-vulnerabilities",id:"catalog/cloud/scan-for-vulnerabilities",title:"Scan for vulnerabilities",description:"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.",source:"@site/docs/catalog/cloud/scan-for-vulnerabilities.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/scan-for-vulnerabilities",permalink:"/catalog/cloud/scan-for-vulnerabilities",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/scan-for-vulnerabilities.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"security",permalink:"/tags/security"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.",tags:["cloud","security","compute","kubernetes","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Scale logical components independently",permalink:"/catalog/cloud/scale-logical-components-independently"},next:{title:"Set storage retention policies",permalink:"/catalog/cloud/set-retention-policy-on-storage-resources"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function p(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"scan-for-vulnerabilities"},"Scan for vulnerabilities"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost. "),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Vulnerability_scanner"},"Vulnerability scanning")," and ",(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Endpoint_detection_and_response"},"endpoint detection and response")," (EDR) tools help minimize the window of opportunity for attackers and mitigate any potential malicious usage of resources."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"The EDR capabilities provide advanced attack detections and are able to take response actions to remediate those threats. The unnecessary resource usage created by these common attacks can quickly be discovered and remediated, often without the intervention of a security analyst."),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Scanning for vulnerabilities will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By preventing heavy misusage of resources, unnecesseary embodied carbon emissions are avoided.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"A zero trust security policy is implemented, which covers security controls for infrastructure, applications, data, networking, ",(0,a.kt)("a",{parentName:"p",href:"https://en.wikipedia.org/wiki/Role-based_access_control"},"role-based access control")," (RBAC), and devices. "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"Leverage cloud native EDR and scanning services, which scale based on demand, to maintain awareness of the carbon impact of the security tooling."),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-security"},"Microsoft Azure well architected framework sustainability patterns")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7ebec3ff.2b7b498a.js b/assets/js/7ebec3ff.2b7b498a.js new file mode 100644 index 00000000..f7fce4c7 --- /dev/null +++ b/assets/js/7ebec3ff.2b7b498a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5419],{4321:e=>{e.exports=JSON.parse('{"label":"role:cloud-engineer","permalink":"/tags/role-cloud-engineer","allTagsPath":"/tags","count":26,"items":[{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","permalink":"/catalog/cloud/cache-static-data"},{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","permalink":"/catalog/cloud/choose-region-closest-to-users"},{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/compress-transmitted-data"},{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/delete-unused-storage-resources"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","permalink":"/catalog/cloud/optimise-storage-resource-utilisation"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/reduce-transmitted-data"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/set-retention-policy-on-storage-resources"},{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","permalink":"/catalog/cloud/shed-lower-priority-traffic"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"}]}')}}]); \ No newline at end of file diff --git a/assets/js/7ebec3ff.9ba52946.js b/assets/js/7ebec3ff.9ba52946.js deleted file mode 100644 index 3303a0ab..00000000 --- a/assets/js/7ebec3ff.9ba52946.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5419],{4321:e=>{e.exports=JSON.parse('{"label":"role:cloud-engineer","permalink":"/tags/role-cloud-engineer","allTagsPath":"/tags","count":22,"items":[{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","permalink":"/catalog/cloud/cache-static-data"},{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","permalink":"/catalog/cloud/choose-region-closest-to-users"},{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/compress-transmitted-data"},{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/delete-unused-storage-resources"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-of-vm"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","permalink":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","permalink":"/catalog/cloud/optimise-storage-resource-utilisation"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","permalink":"/catalog/cloud/reduce-transmitted-data"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","permalink":"/catalog/cloud/set-retention-policy-on-storage-resources"},{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","permalink":"/catalog/cloud/shed-lower-priority-traffic"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"}]}')}}]); \ No newline at end of file diff --git a/assets/js/8d33f67c.3859ef35.js b/assets/js/8d33f67c.3859ef35.js new file mode 100644 index 00000000..cd05cbfc --- /dev/null +++ b/assets/js/8d33f67c.3859ef35.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3079],{253:e=>{e.exports=JSON.parse('{"label":"kubernetes","permalink":"/tags/kubernetes","allTagsPath":"/tags","count":11,"items":[{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"}]}')}}]); \ No newline at end of file diff --git a/assets/js/8d33f67c.bbeb84f4.js b/assets/js/8d33f67c.bbeb84f4.js deleted file mode 100644 index f49f519c..00000000 --- a/assets/js/8d33f67c.bbeb84f4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3079],{253:e=>{e.exports=JSON.parse('{"label":"kubernetes","permalink":"/tags/kubernetes","allTagsPath":"/tags","count":7,"items":[{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","permalink":"/catalog/cloud/scale-down-kubernetes-workloads"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","permalink":"/catalog/cloud/time-shift-kubernetes-cron-jobs"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"}]}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.05a3530f.js b/assets/js/935f2afb.05a3530f.js deleted file mode 100644 index b0a344ce..00000000 --- a/assets/js/935f2afb.05a3530f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Green Software Patterns","href":"/","docId":"index"},{"type":"category","label":"Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Suggested Tags","href":"/guide/suggested-tags","docId":"guide/suggested-tags"},{"type":"link","label":"Initial Review Guide","href":"/guide/initial-reviewer-guide","docId":"guide/initial-reviewer-guide"},{"type":"link","label":"Subject Matter Expert (SME) Review Guide","href":"/guide/sme-reviewer-guide","docId":"guide/sme-reviewer-guide"}],"href":"/guide/"},{"type":"category","label":"Catalog","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Artificial Intelligence (AI)","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Optimize the size of AI/ML models","href":"/catalog/ai/compress-ml-models-for-inference","docId":"catalog/ai/compress-ml-models-for-inference"},{"type":"link","label":"Use efficient file formats for AI/ML development","href":"/catalog/ai/efficent-format-for-model-training","docId":"catalog/ai/efficent-format-for-model-training"},{"type":"link","label":"Run AI models at the edge","href":"/catalog/ai/energy-efficent-ai-edge","docId":"catalog/ai/energy-efficent-ai-edge"},{"type":"link","label":"Select a more energy efficient AI/ML framework","href":"/catalog/ai/energy-efficent-framework","docId":"catalog/ai/energy-efficent-framework"},{"type":"link","label":"Use energy efficient AI/ML models","href":"/catalog/ai/energy-efficent-models","docId":"catalog/ai/energy-efficent-models"},{"type":"link","label":"Use sustainable regions for AI/ML training","href":"/catalog/ai/leverage-sustainable-regions","docId":"catalog/ai/leverage-sustainable-regions"},{"type":"link","label":"Leverage pre-trained models and transfer learning for AI/ML development","href":"/catalog/ai/pre-trained-transfer-learning","docId":"catalog/ai/pre-trained-transfer-learning"},{"type":"link","label":"Select the right hardware/VM instance types for AI/ML training","href":"/catalog/ai/right-hardware-type","docId":"catalog/ai/right-hardware-type"},{"type":"link","label":"Adopt serverless architecture for AI/ML workload processes","href":"/catalog/ai/serverless-model-development","docId":"catalog/ai/serverless-model-development"}],"href":"/catalog/ai/"},{"type":"category","label":"Cloud","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cache static data","href":"/catalog/cloud/cache-static-data","docId":"catalog/cloud/cache-static-data"},{"type":"link","label":"Choose the region that is closest to users","href":"/catalog/cloud/choose-region-closest-to-users","docId":"catalog/cloud/choose-region-closest-to-users"},{"type":"link","label":"Compress transmitted data","href":"/catalog/cloud/compress-transmitted-data","docId":"catalog/cloud/compress-transmitted-data"},{"type":"link","label":"Delete unused storage resources","href":"/catalog/cloud/delete-unused-storage-resources","docId":"catalog/cloud/delete-unused-storage-resources"},{"type":"link","label":"Encrypt what is necessary","href":"/catalog/cloud/encrypt-what-is-necessary","docId":"catalog/cloud/encrypt-what-is-necessary"},{"type":"link","label":"Evaluate other CPU architectures","href":"/catalog/cloud/evaluate-other-cpu-architectures","docId":"catalog/cloud/evaluate-other-cpu-architectures"},{"type":"link","label":"Terminate TLS at border gateway","href":"/catalog/cloud/evaluate-whether-to-use-TLS-termination","docId":"catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"type":"link","label":"Implement stateless design","href":"/catalog/cloud/implement-stateless-design","docId":"catalog/cloud/implement-stateless-design"},{"type":"link","label":"Match your service level objectives to business needs","href":"/catalog/cloud/match-slo","docId":"catalog/cloud/match-slo"},{"type":"link","label":"Match utilization requirements of virtual machines (VMs)","href":"/catalog/cloud/match-utilization-requirements-of-vm","docId":"catalog/cloud/match-utilization-requirements-of-vm"},{"type":"link","label":"Match utilization requirements with pre-configured servers","href":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server","docId":"catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"type":"link","label":"Minimize the total number of deployed environments","href":"/catalog/cloud/minimizing-deployed-environments","docId":"catalog/cloud/minimizing-deployed-environments"},{"type":"link","label":"Optimise storage utilization","href":"/catalog/cloud/optimise-storage-resource-utilisation","docId":"catalog/cloud/optimise-storage-resource-utilisation"},{"type":"link","label":"Optimize average CPU utilization","href":"/catalog/cloud/optimize-avg-cpu-utilization","docId":"catalog/cloud/optimize-avg-cpu-utilization"},{"type":"link","label":"Optimize impact on customer devices and equipment","href":"/catalog/cloud/optimize-impact-on-customer-equipment","docId":"catalog/cloud/optimize-impact-on-customer-equipment"},{"type":"link","label":"Optimize peak CPU utilization","href":"/catalog/cloud/optimize-peak-cpu-utilization","docId":"catalog/cloud/optimize-peak-cpu-utilization"},{"type":"link","label":"Queue non-urgent processing requests","href":"/catalog/cloud/queue-non-urgent-requests","docId":"catalog/cloud/queue-non-urgent-requests"},{"type":"link","label":"Reduce transmitted data","href":"/catalog/cloud/reduce-transmitted-data","docId":"catalog/cloud/reduce-transmitted-data"},{"type":"link","label":"Remove unused assets","href":"/catalog/cloud/remove-unused-assets","docId":"catalog/cloud/remove-unused-assets"},{"type":"link","label":"Scale down kubernetes applications when not in use","href":"/catalog/cloud/scale-down-kubernetes-workloads","docId":"catalog/cloud/scale-down-kubernetes-workloads"},{"type":"link","label":"Scale down applications when not in use","href":"/catalog/cloud/scale-down-unused-applications","docId":"catalog/cloud/scale-down-unused-applications"},{"type":"link","label":"Scale infrastructure with user load","href":"/catalog/cloud/scale-infrastructure-with-user-load","docId":"catalog/cloud/scale-infrastructure-with-user-load"},{"type":"link","label":"Scale Kubernetes workloads based on relevant demand metrics","href":"/catalog/cloud/scale-kubernetes-workloads-based-on-events","docId":"catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"type":"link","label":"Scan for vulnerabilities","href":"/catalog/cloud/scan-for-vulnerabilities","docId":"catalog/cloud/scan-for-vulnerabilities"},{"type":"link","label":"Set storage retention policies","href":"/catalog/cloud/set-retention-policy-on-storage-resources","docId":"catalog/cloud/set-retention-policy-on-storage-resources"},{"type":"link","label":"Shed lower priority traffic","href":"/catalog/cloud/shed-lower-priority-traffic","docId":"catalog/cloud/shed-lower-priority-traffic"},{"type":"link","label":"Time-shift Kubernetes cron jobs","href":"/catalog/cloud/time-shift-kubernetes-cron-jobs","docId":"catalog/cloud/time-shift-kubernetes-cron-jobs"},{"type":"link","label":"Use Asynchronous network calls instead of synchronous","href":"/catalog/cloud/use-async-instead-of-sync","docId":"catalog/cloud/use-async-instead-of-sync"},{"type":"link","label":"Use circuit breaker patterns","href":"/catalog/cloud/use-circuit-breaker","docId":"catalog/cloud/use-circuit-breaker"},{"type":"link","label":"Use cloud native network security tools and controls","href":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls","docId":"catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"type":"link","label":"Use serverless cloud services","href":"/catalog/cloud/use-serverless","docId":"catalog/cloud/use-serverless"}],"href":"/catalog/cloud/"},{"type":"category","label":"Web","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Avoid chaining critical requests","href":"/catalog/web/avoid-chaining-critical-requests","docId":"catalog/web/avoid-chaining-critical-requests"},{"type":"link","label":"Avoid an excessive DOM size","href":"/catalog/web/avoid-excessive-dom-size","docId":"catalog/web/avoid-excessive-dom-size"},{"type":"link","label":"Avoid tracking unnecessary data","href":"/catalog/web/avoid-tracking-unnecessary-data","docId":"catalog/web/avoid-tracking-unnecessary-data"},{"type":"link","label":"Defer offscreen images","href":"/catalog/web/defer-offscreen-images","docId":"catalog/web/defer-offscreen-images"},{"type":"link","label":"Deprecate GIFs for animated content","href":"/catalog/web/deprecate-gifs","docId":"catalog/web/deprecate-gifs"},{"type":"link","label":"Enable text compression","href":"/catalog/web/enable-text-compression","docId":"catalog/web/enable-text-compression"},{"type":"link","label":"Keep request counts low","href":"/catalog/web/keep-request-counts-low","docId":"catalog/web/keep-request-counts-low"},{"type":"link","label":"Minify web assets","href":"/catalog/web/minify-web-assets","docId":"catalog/web/minify-web-assets"},{"type":"link","label":"Minimize main thread work","href":"/catalog/web/minimize-main-thread-work","docId":"catalog/web/minimize-main-thread-work"},{"type":"link","label":"Optimize image size","href":"/catalog/web/properly-sized-images","docId":"catalog/web/properly-sized-images"},{"type":"link","label":"Remove unused CSS definitions","href":"/catalog/web/remove-unused-css","docId":"catalog/web/remove-unused-css"},{"type":"link","label":"Serve images in modern formats","href":"/catalog/web/serve-images-in-modern-formats","docId":"catalog/web/serve-images-in-modern-formats"},{"type":"link","label":"Use server-side rendering for high-traffic pages","href":"/catalog/web/use-server-side-rendering","docId":"catalog/web/use-server-side-rendering"}],"href":"/catalog/web/"}],"href":"/catalog/"},{"type":"link","label":"Tags","href":"/tags/","docId":"tags/index"}]},"docs":{"catalog/ai/compress-ml-models-for-inference":{"id":"catalog/ai/compress-ml-models-for-inference","title":"Optimize the size of AI/ML models","description":"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.","sidebar":"tutorialSidebar"},"catalog/ai/efficent-format-for-model-training":{"id":"catalog/ai/efficent-format-for-model-training","title":"Use efficient file formats for AI/ML development","description":"Efficient storage of the model becomes extremely important to manage the data used for ML model development.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-ai-edge":{"id":"catalog/ai/energy-efficent-ai-edge","title":"Run AI models at the edge","description":"Data computation for ML workloads and ML inference is a significant contributor to the carbon footprint of the ML application. Also, if the ML model is running on the cloud, the data needs to be transferred and processed on the cloud to the required format that can be used by the ML model for inference.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-framework":{"id":"catalog/ai/energy-efficent-framework","title":"Select a more energy efficient AI/ML framework","description":"Training an AI model implies a significant carbon footprint. The underlying framework used for the development, training, and deployment of AI/ML needs to be evaluated and considered to ensure the process is as energy efficient as possible.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-models":{"id":"catalog/ai/energy-efficent-models","title":"Use energy efficient AI/ML models","description":"Evaluate and use alternative, more energy efficient, models that provide similar functionality.","sidebar":"tutorialSidebar"},"catalog/ai/index":{"id":"catalog/ai/index","title":"Artificial Intelligence (AI)","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/ai/leverage-sustainable-regions":{"id":"catalog/ai/leverage-sustainable-regions","title":"Use sustainable regions for AI/ML training","description":"Depending on the model parameters and training iterations, training an AI/ML model consumes a lot of power and requires many servers which contribute to embodied emissions.","sidebar":"tutorialSidebar"},"catalog/ai/pre-trained-transfer-learning":{"id":"catalog/ai/pre-trained-transfer-learning","title":"Leverage pre-trained models and transfer learning for AI/ML development","description":"As part of your AI/ML process, you should evaluate using a pre-trained model and use transfer learning to avoid training a new model from scratch.","sidebar":"tutorialSidebar"},"catalog/ai/right-hardware-type":{"id":"catalog/ai/right-hardware-type","title":"Select the right hardware/VM instance types for AI/ML training","description":"Selecting the right hardware/VM instance types for training is one of the choices you should make as part of your energy-efficient AI/ML process.","sidebar":"tutorialSidebar"},"catalog/ai/serverless-model-development":{"id":"catalog/ai/serverless-model-development","title":"Adopt serverless architecture for AI/ML workload processes","description":"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.","sidebar":"tutorialSidebar"},"catalog/cloud/cache-static-data":{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","sidebar":"tutorialSidebar"},"catalog/cloud/choose-region-closest-to-users":{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","sidebar":"tutorialSidebar"},"catalog/cloud/compress-transmitted-data":{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","sidebar":"tutorialSidebar"},"catalog/cloud/delete-unused-storage-resources":{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","sidebar":"tutorialSidebar"},"catalog/cloud/encrypt-what-is-necessary":{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-other-cpu-architectures":{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-whether-to-use-TLS-termination":{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","sidebar":"tutorialSidebar"},"catalog/cloud/implement-stateless-design":{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","sidebar":"tutorialSidebar"},"catalog/cloud/index":{"id":"catalog/cloud/index","title":"Cloud","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/cloud/match-slo":{"id":"catalog/cloud/match-slo","title":"Match your service level objectives to business needs","description":"If service downtimes are acceptable it\'s better to not strive for highest availability but to design the solution according to real business needs. Lower availability guarantees can help reduce energy consumption by using less infrastructure components.","sidebar":"tutorialSidebar"},"catalog/cloud/match-utilization-requirements-of-vm":{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/match-utilization-requirements-with-pre-configured-server":{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/minimizing-deployed-environments":{"id":"catalog/cloud/minimizing-deployed-environments","title":"Minimize the total number of deployed environments","description":"In a given application, there may be a need to utilize multiple environments in the application workflow. Typically, a development environment is used for regular updates, while staging or testing enviroments are used to make sure there are no issues before code reaches a production environment where users may have access. Each added environment has an increasing energy impact, which in turn creates more emissions. As such, it is important to understand the necessity of each enviroment and it\'s environmental impact.","sidebar":"tutorialSidebar"},"catalog/cloud/optimise-storage-resource-utilisation":{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-avg-cpu-utilization":{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-impact-on-customer-equipment":{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-peak-cpu-utilization":{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","sidebar":"tutorialSidebar"},"catalog/cloud/queue-non-urgent-requests":{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","sidebar":"tutorialSidebar"},"catalog/cloud/reduce-transmitted-data":{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","sidebar":"tutorialSidebar"},"catalog/cloud/remove-unused-assets":{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/scale-down-kubernetes-workloads":{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-down-unused-applications":{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-infrastructure-with-user-load":{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-kubernetes-workloads-based-on-events":{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","sidebar":"tutorialSidebar"},"catalog/cloud/scan-for-vulnerabilities":{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","sidebar":"tutorialSidebar"},"catalog/cloud/set-retention-policy-on-storage-resources":{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","sidebar":"tutorialSidebar"},"catalog/cloud/shed-lower-priority-traffic":{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","sidebar":"tutorialSidebar"},"catalog/cloud/time-shift-kubernetes-cron-jobs":{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","sidebar":"tutorialSidebar"},"catalog/cloud/use-async-instead-of-sync":{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","sidebar":"tutorialSidebar"},"catalog/cloud/use-circuit-breaker":{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","sidebar":"tutorialSidebar"},"catalog/cloud/use-cloud-native-network-security-tools-and-controls":{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","sidebar":"tutorialSidebar"},"catalog/cloud/use-serverless":{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","sidebar":"tutorialSidebar"},"catalog/index":{"id":"catalog/index","title":"Catalog","description":"","sidebar":"tutorialSidebar"},"catalog/web/avoid-chaining-critical-requests":{"id":"catalog/web/avoid-chaining-critical-requests","title":"Avoid chaining critical requests","description":"Most web experiences require a lot of work from the user\'s browser. The greater the length of the chains and the larger the download sizes, the more significant the impact on page load performance and the energy required to render a page.","sidebar":"tutorialSidebar"},"catalog/web/avoid-excessive-dom-size":{"id":"catalog/web/avoid-excessive-dom-size","title":"Avoid an excessive DOM size","description":"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.","sidebar":"tutorialSidebar"},"catalog/web/avoid-tracking-unnecessary-data":{"id":"catalog/web/avoid-tracking-unnecessary-data","title":"Avoid tracking unnecessary data","description":"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.","sidebar":"tutorialSidebar"},"catalog/web/defer-offscreen-images":{"id":"catalog/web/defer-offscreen-images","title":"Defer offscreen images","description":"Web pages offer a lot of images that aren\'t displayed on the first loaded screen and can thus be loaded dynamically.","sidebar":"tutorialSidebar"},"catalog/web/deprecate-gifs":{"id":"catalog/web/deprecate-gifs","title":"Deprecate GIFs for animated content","description":"One direct replacement of the GIF is the MP4 video format which provides much smaller file sizes and higher quality at the same time.","sidebar":"tutorialSidebar"},"catalog/web/enable-text-compression":{"id":"catalog/web/enable-text-compression","title":"Enable text compression","description":"Web browsers often communicate with web servers in a human readable format. These can be HTML, JavaScript and/or CSS files and REST requests which can return a response in JSON. This human readable communication is redundant and, as such, can be compressed to save bandwidth.","sidebar":"tutorialSidebar"},"catalog/web/index":{"id":"catalog/web/index","title":"Web","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/web/keep-request-counts-low":{"id":"catalog/web/keep-request-counts-low","title":"Keep request counts low","description":"Accessing a web page usually retrieves a HTML file from the web server. The HTML may then reference additional resources that the browser has to download.","sidebar":"tutorialSidebar"},"catalog/web/minify-web-assets":{"id":"catalog/web/minify-web-assets","title":"Minify web assets","description":"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.","sidebar":"tutorialSidebar"},"catalog/web/minimize-main-thread-work":{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","sidebar":"tutorialSidebar"},"catalog/web/properly-sized-images":{"id":"catalog/web/properly-sized-images","title":"Optimize image size","description":"Ideally, the stored pixel dimensions are exactly the same, or smaller, as the display size in pixels so that no bandwidth or storage space is wasted.","sidebar":"tutorialSidebar"},"catalog/web/remove-unused-css":{"id":"catalog/web/remove-unused-css","title":"Remove unused CSS definitions","description":"CSS files are very complex and need energy intensive parsing and processing. Each added CSS definition increases the amount of time and processing power needed in this process.","sidebar":"tutorialSidebar"},"catalog/web/serve-images-in-modern-formats":{"id":"catalog/web/serve-images-in-modern-formats","title":"Serve images in modern formats","description":"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.","sidebar":"tutorialSidebar"},"catalog/web/use-server-side-rendering":{"id":"catalog/web/use-server-side-rendering","title":"Use server-side rendering for high-traffic pages","description":"Use server-side rendering for high-traffic pages","sidebar":"tutorialSidebar"},"guide/index":{"id":"guide/index","title":"Guide","description":"What is a green software pattern?","sidebar":"tutorialSidebar"},"guide/initial-reviewer-guide":{"id":"guide/initial-reviewer-guide","title":"Initial Review Guide","description":"This is the guide that our Initial Reviewers will follow to determine if a submitted Green Software Pattern meets the requirements to move the Subject Matter Expert review or not. If any issues arise, the reviewer will provide feedback directly in the pull request that the submitter should update before moving forward. Once the pattern passes the initial review guidelines, the reviewer will assign it to an appropriate Subject Matter Expert (SME) for a deeper technical review. This process is expected to take no more than 1 week barring any lengthy feedback cycles.","sidebar":"tutorialSidebar"},"guide/sme-reviewer-guide":{"id":"guide/sme-reviewer-guide","title":"Subject Matter Expert (SME) Review Guide","description":"This is the guide that our Subject Matter Experts (SMEs) will follow to determine if a submitted Green Software Pattern meets the requirements to move the Team Consensus Review or not. If any issues arise, the reviewer will provide feedback in the pull request that the submitter should update before moving forward. Once the pattern passes the SME Review guidelines, the reviewer add the appropriate label for the next stage of Team Consensus review. This process is expected to take no more than 2 weeks barring any lengthy feedback cycles.","sidebar":"tutorialSidebar"},"guide/suggested-tags":{"id":"guide/suggested-tags","title":"Suggested Tags","description":"Please use the tags within this section for your proposed pattern. New tags must be proposed through the defined proposal process and be approved by the working group.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Green Software Patterns","description":"An online open-source database of green software patterns reviewed and curated by the Green Software Foundation","sidebar":"tutorialSidebar"},"tags/index":{"id":"tags/index","title":"Tags","description":"","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/935f2afb.718b7629.js b/assets/js/935f2afb.718b7629.js new file mode 100644 index 00000000..23d3916f --- /dev/null +++ b/assets/js/935f2afb.718b7629.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[53],{1109:e=>{e.exports=JSON.parse('{"pluginId":"default","version":"current","label":"Next","banner":null,"badge":false,"className":"docs-version-current","isLast":true,"docsSidebars":{"tutorialSidebar":[{"type":"link","label":"Green Software Patterns","href":"/","docId":"index"},{"type":"category","label":"Guide","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Suggested Tags","href":"/guide/suggested-tags","docId":"guide/suggested-tags"},{"type":"link","label":"Initial Review Guide","href":"/guide/initial-reviewer-guide","docId":"guide/initial-reviewer-guide"},{"type":"link","label":"Subject Matter Expert (SME) Review Guide","href":"/guide/sme-reviewer-guide","docId":"guide/sme-reviewer-guide"}],"href":"/guide/"},{"type":"category","label":"Catalog","collapsible":true,"collapsed":true,"items":[{"type":"category","label":"Artificial Intelligence (AI)","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Optimize the size of AI/ML models","href":"/catalog/ai/compress-ml-models-for-inference","docId":"catalog/ai/compress-ml-models-for-inference"},{"type":"link","label":"Use efficient file formats for AI/ML development","href":"/catalog/ai/efficent-format-for-model-training","docId":"catalog/ai/efficent-format-for-model-training"},{"type":"link","label":"Run AI models at the edge","href":"/catalog/ai/energy-efficent-ai-edge","docId":"catalog/ai/energy-efficent-ai-edge"},{"type":"link","label":"Select a more energy efficient AI/ML framework","href":"/catalog/ai/energy-efficent-framework","docId":"catalog/ai/energy-efficent-framework"},{"type":"link","label":"Use energy efficient AI/ML models","href":"/catalog/ai/energy-efficent-models","docId":"catalog/ai/energy-efficent-models"},{"type":"link","label":"Use sustainable regions for AI/ML training","href":"/catalog/ai/leverage-sustainable-regions","docId":"catalog/ai/leverage-sustainable-regions"},{"type":"link","label":"Leverage pre-trained models and transfer learning for AI/ML development","href":"/catalog/ai/pre-trained-transfer-learning","docId":"catalog/ai/pre-trained-transfer-learning"},{"type":"link","label":"Select the right hardware/VM instance types for AI/ML training","href":"/catalog/ai/right-hardware-type","docId":"catalog/ai/right-hardware-type"},{"type":"link","label":"Adopt serverless architecture for AI/ML workload processes","href":"/catalog/ai/serverless-model-development","docId":"catalog/ai/serverless-model-development"}],"href":"/catalog/ai/"},{"type":"category","label":"Cloud","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Cache static data","href":"/catalog/cloud/cache-static-data","docId":"catalog/cloud/cache-static-data"},{"type":"link","label":"Choose the region that is closest to users","href":"/catalog/cloud/choose-region-closest-to-users","docId":"catalog/cloud/choose-region-closest-to-users"},{"type":"link","label":"Compress stored data","href":"/catalog/cloud/compress-stored-data","docId":"catalog/cloud/compress-stored-data"},{"type":"link","label":"Compress transmitted data","href":"/catalog/cloud/compress-transmitted-data","docId":"catalog/cloud/compress-transmitted-data"},{"type":"link","label":"Containerize your workloads","href":"/catalog/cloud/containerize-your-workload-where-applicable","docId":"catalog/cloud/containerize-your-workload-where-applicable"},{"type":"link","label":"Delete unused storage resources","href":"/catalog/cloud/delete-unused-storage-resources","docId":"catalog/cloud/delete-unused-storage-resources"},{"type":"link","label":"Encrypt what is necessary","href":"/catalog/cloud/encrypt-what-is-necessary","docId":"catalog/cloud/encrypt-what-is-necessary"},{"type":"link","label":"Evaluate other CPU architectures","href":"/catalog/cloud/evaluate-other-cpu-architectures","docId":"catalog/cloud/evaluate-other-cpu-architectures"},{"type":"link","label":"Use a service mesh only if needed","href":"/catalog/cloud/evaluate-using-a-service-mesh","docId":"catalog/cloud/evaluate-using-a-service-mesh"},{"type":"link","label":"Terminate TLS at border gateway","href":"/catalog/cloud/evaluate-whether-to-use-TLS-termination","docId":"catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"type":"link","label":"Implement stateless design","href":"/catalog/cloud/implement-stateless-design","docId":"catalog/cloud/implement-stateless-design"},{"type":"link","label":"Match your service level objectives to business needs","href":"/catalog/cloud/match-slo","docId":"catalog/cloud/match-slo"},{"type":"link","label":"Match utilization requirements of virtual machines (VMs)","href":"/catalog/cloud/match-utilization-requirements-of-vm","docId":"catalog/cloud/match-utilization-requirements-of-vm"},{"type":"link","label":"Match utilization requirements with pre-configured servers","href":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server","docId":"catalog/cloud/match-utilization-requirements-with-pre-configured-server"},{"type":"link","label":"Minimize the total number of deployed environments","href":"/catalog/cloud/minimizing-deployed-environments","docId":"catalog/cloud/minimizing-deployed-environments"},{"type":"link","label":"Optimise storage utilization","href":"/catalog/cloud/optimise-storage-resource-utilisation","docId":"catalog/cloud/optimise-storage-resource-utilisation"},{"type":"link","label":"Optimize average CPU utilization","href":"/catalog/cloud/optimize-avg-cpu-utilization","docId":"catalog/cloud/optimize-avg-cpu-utilization"},{"type":"link","label":"Optimize impact on customer devices and equipment","href":"/catalog/cloud/optimize-impact-on-customer-equipment","docId":"catalog/cloud/optimize-impact-on-customer-equipment"},{"type":"link","label":"Optimize peak CPU utilization","href":"/catalog/cloud/optimize-peak-cpu-utilization","docId":"catalog/cloud/optimize-peak-cpu-utilization"},{"type":"link","label":"Queue non-urgent processing requests","href":"/catalog/cloud/queue-non-urgent-requests","docId":"catalog/cloud/queue-non-urgent-requests"},{"type":"link","label":"Reduce transmitted data","href":"/catalog/cloud/reduce-transmitted-data","docId":"catalog/cloud/reduce-transmitted-data"},{"type":"link","label":"Remove unused assets","href":"/catalog/cloud/remove-unused-assets","docId":"catalog/cloud/remove-unused-assets"},{"type":"link","label":"Scale down kubernetes applications when not in use","href":"/catalog/cloud/scale-down-kubernetes-workloads","docId":"catalog/cloud/scale-down-kubernetes-workloads"},{"type":"link","label":"Scale down applications when not in use","href":"/catalog/cloud/scale-down-unused-applications","docId":"catalog/cloud/scale-down-unused-applications"},{"type":"link","label":"Scale infrastructure with user load","href":"/catalog/cloud/scale-infrastructure-with-user-load","docId":"catalog/cloud/scale-infrastructure-with-user-load"},{"type":"link","label":"Scale Kubernetes workloads based on relevant demand metrics","href":"/catalog/cloud/scale-kubernetes-workloads-based-on-events","docId":"catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"type":"link","label":"Scale logical components independently","href":"/catalog/cloud/scale-logical-components-independently","docId":"catalog/cloud/scale-logical-components-independently"},{"type":"link","label":"Scan for vulnerabilities","href":"/catalog/cloud/scan-for-vulnerabilities","docId":"catalog/cloud/scan-for-vulnerabilities"},{"type":"link","label":"Set storage retention policies","href":"/catalog/cloud/set-retention-policy-on-storage-resources","docId":"catalog/cloud/set-retention-policy-on-storage-resources"},{"type":"link","label":"Shed lower priority traffic","href":"/catalog/cloud/shed-lower-priority-traffic","docId":"catalog/cloud/shed-lower-priority-traffic"},{"type":"link","label":"Time-shift Kubernetes cron jobs","href":"/catalog/cloud/time-shift-kubernetes-cron-jobs","docId":"catalog/cloud/time-shift-kubernetes-cron-jobs"},{"type":"link","label":"Use Asynchronous network calls instead of synchronous","href":"/catalog/cloud/use-async-instead-of-sync","docId":"catalog/cloud/use-async-instead-of-sync"},{"type":"link","label":"Use circuit breaker patterns","href":"/catalog/cloud/use-circuit-breaker","docId":"catalog/cloud/use-circuit-breaker"},{"type":"link","label":"Use cloud native network security tools and controls","href":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls","docId":"catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"type":"link","label":"Use DDoS protection","href":"/catalog/cloud/use-ddos-protection","docId":"catalog/cloud/use-ddos-protection"},{"type":"link","label":"Use cloud native processor VMs","href":"/catalog/cloud/use-energy-efficient-hardware","docId":"catalog/cloud/use-energy-efficient-hardware"},{"type":"link","label":"Use serverless cloud services","href":"/catalog/cloud/use-serverless","docId":"catalog/cloud/use-serverless"}],"href":"/catalog/cloud/"},{"type":"category","label":"Web","collapsible":true,"collapsed":true,"items":[{"type":"link","label":"Avoid chaining critical requests","href":"/catalog/web/avoid-chaining-critical-requests","docId":"catalog/web/avoid-chaining-critical-requests"},{"type":"link","label":"Avoid an excessive DOM size","href":"/catalog/web/avoid-excessive-dom-size","docId":"catalog/web/avoid-excessive-dom-size"},{"type":"link","label":"Avoid tracking unnecessary data","href":"/catalog/web/avoid-tracking-unnecessary-data","docId":"catalog/web/avoid-tracking-unnecessary-data"},{"type":"link","label":"Defer offscreen images","href":"/catalog/web/defer-offscreen-images","docId":"catalog/web/defer-offscreen-images"},{"type":"link","label":"Deprecate GIFs for animated content","href":"/catalog/web/deprecate-gifs","docId":"catalog/web/deprecate-gifs"},{"type":"link","label":"Enable text compression","href":"/catalog/web/enable-text-compression","docId":"catalog/web/enable-text-compression"},{"type":"link","label":"Keep request counts low","href":"/catalog/web/keep-request-counts-low","docId":"catalog/web/keep-request-counts-low"},{"type":"link","label":"Minify web assets","href":"/catalog/web/minify-web-assets","docId":"catalog/web/minify-web-assets"},{"type":"link","label":"Minimize main thread work","href":"/catalog/web/minimize-main-thread-work","docId":"catalog/web/minimize-main-thread-work"},{"type":"link","label":"Optimize image size","href":"/catalog/web/properly-sized-images","docId":"catalog/web/properly-sized-images"},{"type":"link","label":"Remove unused CSS definitions","href":"/catalog/web/remove-unused-css","docId":"catalog/web/remove-unused-css"},{"type":"link","label":"Serve images in modern formats","href":"/catalog/web/serve-images-in-modern-formats","docId":"catalog/web/serve-images-in-modern-formats"},{"type":"link","label":"Use server-side rendering for high-traffic pages","href":"/catalog/web/use-server-side-rendering","docId":"catalog/web/use-server-side-rendering"}],"href":"/catalog/web/"}],"href":"/catalog/"},{"type":"link","label":"Tags","href":"/tags/","docId":"tags/index"}]},"docs":{"catalog/ai/compress-ml-models-for-inference":{"id":"catalog/ai/compress-ml-models-for-inference","title":"Optimize the size of AI/ML models","description":"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.","sidebar":"tutorialSidebar"},"catalog/ai/efficent-format-for-model-training":{"id":"catalog/ai/efficent-format-for-model-training","title":"Use efficient file formats for AI/ML development","description":"Efficient storage of the model becomes extremely important to manage the data used for ML model development.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-ai-edge":{"id":"catalog/ai/energy-efficent-ai-edge","title":"Run AI models at the edge","description":"Data computation for ML workloads and ML inference is a significant contributor to the carbon footprint of the ML application. Also, if the ML model is running on the cloud, the data needs to be transferred and processed on the cloud to the required format that can be used by the ML model for inference.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-framework":{"id":"catalog/ai/energy-efficent-framework","title":"Select a more energy efficient AI/ML framework","description":"Training an AI model implies a significant carbon footprint. The underlying framework used for the development, training, and deployment of AI/ML needs to be evaluated and considered to ensure the process is as energy efficient as possible.","sidebar":"tutorialSidebar"},"catalog/ai/energy-efficent-models":{"id":"catalog/ai/energy-efficent-models","title":"Use energy efficient AI/ML models","description":"Evaluate and use alternative, more energy efficient, models that provide similar functionality.","sidebar":"tutorialSidebar"},"catalog/ai/index":{"id":"catalog/ai/index","title":"Artificial Intelligence (AI)","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/ai/leverage-sustainable-regions":{"id":"catalog/ai/leverage-sustainable-regions","title":"Use sustainable regions for AI/ML training","description":"Depending on the model parameters and training iterations, training an AI/ML model consumes a lot of power and requires many servers which contribute to embodied emissions.","sidebar":"tutorialSidebar"},"catalog/ai/pre-trained-transfer-learning":{"id":"catalog/ai/pre-trained-transfer-learning","title":"Leverage pre-trained models and transfer learning for AI/ML development","description":"As part of your AI/ML process, you should evaluate using a pre-trained model and use transfer learning to avoid training a new model from scratch.","sidebar":"tutorialSidebar"},"catalog/ai/right-hardware-type":{"id":"catalog/ai/right-hardware-type","title":"Select the right hardware/VM instance types for AI/ML training","description":"Selecting the right hardware/VM instance types for training is one of the choices you should make as part of your energy-efficient AI/ML process.","sidebar":"tutorialSidebar"},"catalog/ai/serverless-model-development":{"id":"catalog/ai/serverless-model-development","title":"Adopt serverless architecture for AI/ML workload processes","description":"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.","sidebar":"tutorialSidebar"},"catalog/cloud/cache-static-data":{"id":"catalog/cloud/cache-static-data","title":"Cache static data","description":"From an energy-efficiency perspective, it\'s better to reduce network traffic by reading the data locally through a cache rather than accessing it remotely over the network. Shortening the distance a network packet travels means that less energy is required to transmit it. Similarly, from an embodied carbon perspective, we are more efficient with hardware when a network packet traverses through less computing equipment.","sidebar":"tutorialSidebar"},"catalog/cloud/choose-region-closest-to-users":{"id":"catalog/cloud/choose-region-closest-to-users","title":"Choose the region that is closest to users","description":"From an energy-efficiency perspective, it\'s better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.","sidebar":"tutorialSidebar"},"catalog/cloud/compress-stored-data":{"id":"catalog/cloud/compress-stored-data","title":"Compress stored data","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/compress-transmitted-data":{"id":"catalog/cloud/compress-transmitted-data","title":"Compress transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.","sidebar":"tutorialSidebar"},"catalog/cloud/containerize-your-workload-where-applicable":{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/delete-unused-storage-resources":{"id":"catalog/cloud/delete-unused-storage-resources","title":"Delete unused storage resources","description":"From an embodied carbon perspective, it\'s better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","sidebar":"tutorialSidebar"},"catalog/cloud/encrypt-what-is-necessary":{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-other-cpu-architectures":{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-using-a-service-mesh":{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/evaluate-whether-to-use-TLS-termination":{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","sidebar":"tutorialSidebar"},"catalog/cloud/implement-stateless-design":{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","sidebar":"tutorialSidebar"},"catalog/cloud/index":{"id":"catalog/cloud/index","title":"Cloud","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/cloud/match-slo":{"id":"catalog/cloud/match-slo","title":"Match your service level objectives to business needs","description":"If service downtimes are acceptable it\'s better to not strive for highest availability but to design the solution according to real business needs. Lower availability guarantees can help reduce energy consumption by using less infrastructure components.","sidebar":"tutorialSidebar"},"catalog/cloud/match-utilization-requirements-of-vm":{"id":"catalog/cloud/match-utilization-requirements-of-vm","title":"Match utilization requirements of virtual machines (VMs)","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/match-utilization-requirements-with-pre-configured-server":{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","title":"Match utilization requirements with pre-configured servers","description":"It\'s better to have one VM running at a higher utilization than two running at low utilization rates, not only in terms of energy proportionality but also in terms of embodied carbon. Two servers running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilized server could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/minimizing-deployed-environments":{"id":"catalog/cloud/minimizing-deployed-environments","title":"Minimize the total number of deployed environments","description":"In a given application, there may be a need to utilize multiple environments in the application workflow. Typically, a development environment is used for regular updates, while staging or testing enviroments are used to make sure there are no issues before code reaches a production environment where users may have access. Each added environment has an increasing energy impact, which in turn creates more emissions. As such, it is important to understand the necessity of each enviroment and it\'s environmental impact.","sidebar":"tutorialSidebar"},"catalog/cloud/optimise-storage-resource-utilisation":{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-avg-cpu-utilization":{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-impact-on-customer-equipment":{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/optimize-peak-cpu-utilization":{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","sidebar":"tutorialSidebar"},"catalog/cloud/queue-non-urgent-requests":{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","sidebar":"tutorialSidebar"},"catalog/cloud/reduce-transmitted-data":{"id":"catalog/cloud/reduce-transmitted-data","title":"Reduce transmitted data","description":"From an energy-efficiency perspective, it\'s better to minimize the size of the data transmitted so that less energy is required because the network traffic is reduced.","sidebar":"tutorialSidebar"},"catalog/cloud/remove-unused-assets":{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/scale-down-kubernetes-workloads":{"id":"catalog/cloud/scale-down-kubernetes-workloads","title":"Scale down kubernetes applications when not in use","description":"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes out of office hours. Thereby, optimization is implemented at the cluster level. For production clusters, where nodes need to stay up and running, optimization needs to be implemented at the application level.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-down-unused-applications":{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-infrastructure-with-user-load":{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-kubernetes-workloads-based-on-events":{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","sidebar":"tutorialSidebar"},"catalog/cloud/scale-logical-components-independently":{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/scan-for-vulnerabilities":{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","sidebar":"tutorialSidebar"},"catalog/cloud/set-retention-policy-on-storage-resources":{"id":"catalog/cloud/set-retention-policy-on-storage-resources","title":"Set storage retention policies","description":"From an embodied carbon perspective, it\'s better to have an automated mechanism to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.","sidebar":"tutorialSidebar"},"catalog/cloud/shed-lower-priority-traffic":{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","sidebar":"tutorialSidebar"},"catalog/cloud/time-shift-kubernetes-cron-jobs":{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","title":"Time-shift Kubernetes cron jobs","description":"The carbon emissions of a software system depends on the power consumed by that software, but also on the Carbon intensity of the electricity it is powered on. For this reason, running energy-efficient software on carbon intensive electricity grid, might be inefficient to reduce its global carbon emissions. Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low.","sidebar":"tutorialSidebar"},"catalog/cloud/use-async-instead-of-sync":{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","sidebar":"tutorialSidebar"},"catalog/cloud/use-circuit-breaker":{"id":"catalog/cloud/use-circuit-breaker","title":"Use circuit breaker patterns","description":"Modern applications need to communicate with other applications on a regular basis. Since these other applications have their own deployment schedule, downtimes and availability, the network connection to these application might have problems. If the other application is not reachable, all network requests against this other application will fail and future network requests are futile.","sidebar":"tutorialSidebar"},"catalog/cloud/use-cloud-native-network-security-tools-and-controls":{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","sidebar":"tutorialSidebar"},"catalog/cloud/use-ddos-protection":{"id":"catalog/cloud/use-ddos-protection","title":"Use DDoS protection","description":"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.","sidebar":"tutorialSidebar"},"catalog/cloud/use-energy-efficient-hardware":{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","sidebar":"tutorialSidebar"},"catalog/cloud/use-serverless":{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","sidebar":"tutorialSidebar"},"catalog/index":{"id":"catalog/index","title":"Catalog","description":"","sidebar":"tutorialSidebar"},"catalog/web/avoid-chaining-critical-requests":{"id":"catalog/web/avoid-chaining-critical-requests","title":"Avoid chaining critical requests","description":"Most web experiences require a lot of work from the user\'s browser. The greater the length of the chains and the larger the download sizes, the more significant the impact on page load performance and the energy required to render a page.","sidebar":"tutorialSidebar"},"catalog/web/avoid-excessive-dom-size":{"id":"catalog/web/avoid-excessive-dom-size","title":"Avoid an excessive DOM size","description":"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.","sidebar":"tutorialSidebar"},"catalog/web/avoid-tracking-unnecessary-data":{"id":"catalog/web/avoid-tracking-unnecessary-data","title":"Avoid tracking unnecessary data","description":"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.","sidebar":"tutorialSidebar"},"catalog/web/defer-offscreen-images":{"id":"catalog/web/defer-offscreen-images","title":"Defer offscreen images","description":"Web pages offer a lot of images that aren\'t displayed on the first loaded screen and can thus be loaded dynamically.","sidebar":"tutorialSidebar"},"catalog/web/deprecate-gifs":{"id":"catalog/web/deprecate-gifs","title":"Deprecate GIFs for animated content","description":"One direct replacement of the GIF is the MP4 video format which provides much smaller file sizes and higher quality at the same time.","sidebar":"tutorialSidebar"},"catalog/web/enable-text-compression":{"id":"catalog/web/enable-text-compression","title":"Enable text compression","description":"Web browsers often communicate with web servers in a human readable format. These can be HTML, JavaScript and/or CSS files and REST requests which can return a response in JSON. This human readable communication is redundant and, as such, can be compressed to save bandwidth.","sidebar":"tutorialSidebar"},"catalog/web/index":{"id":"catalog/web/index","title":"Web","description":"Subject Matter Experts","sidebar":"tutorialSidebar"},"catalog/web/keep-request-counts-low":{"id":"catalog/web/keep-request-counts-low","title":"Keep request counts low","description":"Accessing a web page usually retrieves a HTML file from the web server. The HTML may then reference additional resources that the browser has to download.","sidebar":"tutorialSidebar"},"catalog/web/minify-web-assets":{"id":"catalog/web/minify-web-assets","title":"Minify web assets","description":"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.","sidebar":"tutorialSidebar"},"catalog/web/minimize-main-thread-work":{"id":"catalog/web/minimize-main-thread-work","title":"Minimize main thread work","description":"Description","sidebar":"tutorialSidebar"},"catalog/web/properly-sized-images":{"id":"catalog/web/properly-sized-images","title":"Optimize image size","description":"Ideally, the stored pixel dimensions are exactly the same, or smaller, as the display size in pixels so that no bandwidth or storage space is wasted.","sidebar":"tutorialSidebar"},"catalog/web/remove-unused-css":{"id":"catalog/web/remove-unused-css","title":"Remove unused CSS definitions","description":"CSS files are very complex and need energy intensive parsing and processing. Each added CSS definition increases the amount of time and processing power needed in this process.","sidebar":"tutorialSidebar"},"catalog/web/serve-images-in-modern-formats":{"id":"catalog/web/serve-images-in-modern-formats","title":"Serve images in modern formats","description":"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.","sidebar":"tutorialSidebar"},"catalog/web/use-server-side-rendering":{"id":"catalog/web/use-server-side-rendering","title":"Use server-side rendering for high-traffic pages","description":"Use server-side rendering for high-traffic pages","sidebar":"tutorialSidebar"},"guide/index":{"id":"guide/index","title":"Guide","description":"What is a green software pattern?","sidebar":"tutorialSidebar"},"guide/initial-reviewer-guide":{"id":"guide/initial-reviewer-guide","title":"Initial Review Guide","description":"This is the guide that our Initial Reviewers will follow to determine if a submitted Green Software Pattern meets the requirements to move the Subject Matter Expert review or not. If any issues arise, the reviewer will provide feedback directly in the pull request that the submitter should update before moving forward. Once the pattern passes the initial review guidelines, the reviewer will assign it to an appropriate Subject Matter Expert (SME) for a deeper technical review. This process is expected to take no more than 1 week barring any lengthy feedback cycles.","sidebar":"tutorialSidebar"},"guide/sme-reviewer-guide":{"id":"guide/sme-reviewer-guide","title":"Subject Matter Expert (SME) Review Guide","description":"This is the guide that our Subject Matter Experts (SMEs) will follow to determine if a submitted Green Software Pattern meets the requirements to move the Team Consensus Review or not. If any issues arise, the reviewer will provide feedback in the pull request that the submitter should update before moving forward. Once the pattern passes the SME Review guidelines, the reviewer add the appropriate label for the next stage of Team Consensus review. This process is expected to take no more than 2 weeks barring any lengthy feedback cycles.","sidebar":"tutorialSidebar"},"guide/suggested-tags":{"id":"guide/suggested-tags","title":"Suggested Tags","description":"Please use the tags within this section for your proposed pattern. New tags must be proposed through the defined proposal process and be approved by the working group.","sidebar":"tutorialSidebar"},"index":{"id":"index","title":"Green Software Patterns","description":"An online open-source database of green software patterns reviewed and curated by the Green Software Foundation","sidebar":"tutorialSidebar"},"tags/index":{"id":"tags/index","title":"Tags","description":"","sidebar":"tutorialSidebar"}}}')}}]); \ No newline at end of file diff --git a/assets/js/93d64a37.e0ca9800.js b/assets/js/93d64a37.60edcf62.js similarity index 61% rename from assets/js/93d64a37.e0ca9800.js rename to assets/js/93d64a37.60edcf62.js index 1fd2acab..7fb63fe1 100644 --- a/assets/js/93d64a37.e0ca9800.js +++ b/assets/js/93d64a37.60edcf62.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1215],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,y=p["".concat(l,".").concat(m)]||p[m]||d[m]||i;return r?n.createElement(y,o(o({ref:t},u),{},{components:r})):n.createElement(y,o({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.",tags:["cloud","security","compute","kubernetes","role:software-engineer","size:medium"]},o="Terminate TLS at border gateway",s={unversionedId:"catalog/cloud/evaluate-whether-to-use-TLS-termination",id:"catalog/cloud/evaluate-whether-to-use-TLS-termination",title:"Terminate TLS at border gateway",description:"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.",source:"@site/docs/catalog/cloud/evaluate-whether-to-use-TLS-termination.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/evaluate-whether-to-use-TLS-termination",permalink:"/catalog/cloud/evaluate-whether-to-use-TLS-termination",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/evaluate-whether-to-use-TLS-termination.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"security",permalink:"/tags/security"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.",tags:["cloud","security","compute","kubernetes","role:software-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Evaluate other CPU architectures",permalink:"/catalog/cloud/evaluate-other-cpu-architectures"},next:{title:"Implement stateless design",permalink:"/catalog/cloud/implement-stateless-design"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"terminate-tls-at-border-gateway"},"Terminate TLS at border gateway"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Terminate TLS at your border gateway and continue with non-TLS to your application load balancer and onwards to your workload."),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Implementing non-TLS communication will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": By reducing CPU, the amount of energy needed to support the communication transport is reduced."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the compute resource requirements, the total embodied carbon emissions are reduced.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"The application does not have compliance requirements for using end-to-end TLS. "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"A balanced level of security can offer a more sustainable and energy efficient workload while a higher level of security may increase the requirements on compute resources."),(0,a.kt)("p",null,"Consider applying the ",(0,a.kt)("em",{parentName:"p"},"Just Enough Security")," (JES) model and terminate TLS at your border gateway for most standard applications that do not have strict compliance requirements."),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-security"},"Microsoft Azure Well-Architected Framework Sustainability Patterns")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1215],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,y=p["".concat(l,".").concat(m)]||p[m]||d[m]||i;return r?n.createElement(y,o(o({ref:t},u),{},{components:r})):n.createElement(y,o({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.",tags:["cloud","security","compute","kubernetes","role:software-engineer","size:medium"]},o="Terminate TLS at border gateway",s={unversionedId:"catalog/cloud/evaluate-whether-to-use-TLS-termination",id:"catalog/cloud/evaluate-whether-to-use-TLS-termination",title:"Terminate TLS at border gateway",description:"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.",source:"@site/docs/catalog/cloud/evaluate-whether-to-use-TLS-termination.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/evaluate-whether-to-use-TLS-termination",permalink:"/catalog/cloud/evaluate-whether-to-use-TLS-termination",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/evaluate-whether-to-use-TLS-termination.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"security",permalink:"/tags/security"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.",tags:["cloud","security","compute","kubernetes","role:software-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Use a service mesh only if needed",permalink:"/catalog/cloud/evaluate-using-a-service-mesh"},next:{title:"Implement stateless design",permalink:"/catalog/cloud/implement-stateless-design"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"terminate-tls-at-border-gateway"},"Terminate TLS at border gateway"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Terminate TLS at your border gateway and continue with non-TLS to your application load balancer and onwards to your workload."),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Implementing non-TLS communication will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": By reducing CPU, the amount of energy needed to support the communication transport is reduced."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the compute resource requirements, the total embodied carbon emissions are reduced.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"The application does not have compliance requirements for using end-to-end TLS. "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"A balanced level of security can offer a more sustainable and energy efficient workload while a higher level of security may increase the requirements on compute resources."),(0,a.kt)("p",null,"Consider applying the ",(0,a.kt)("em",{parentName:"p"},"Just Enough Security")," (JES) model and terminate TLS at your border gateway for most standard applications that do not have strict compliance requirements."),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-security"},"Microsoft Azure Well-Architected Framework Sustainability Patterns")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e642b58.512315b8.js b/assets/js/9e642b58.512315b8.js deleted file mode 100644 index f3812056..00000000 --- a/assets/js/9e642b58.512315b8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8456],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(r),m=o,h=d["".concat(l,".").concat(m)]||d[m]||p[m]||a;return r?n.createElement(h,i(i({ref:t},u),{},{components:r})):n.createElement(h,i({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(7462),o=(r(7294),r(4137));const a={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"From an energy-efficiency perspective, it's better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.",tags:["networking","role:cloud-engineer","size:small"]},i="Choose the region that is closest to users",s={unversionedId:"catalog/cloud/choose-region-closest-to-users",id:"catalog/cloud/choose-region-closest-to-users",title:"Choose the region that is closest to users",description:"From an energy-efficiency perspective, it's better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.",source:"@site/docs/catalog/cloud/choose-region-closest-to-users.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/choose-region-closest-to-users",permalink:"/catalog/cloud/choose-region-closest-to-users",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/choose-region-closest-to-users.md",tags:[{label:"networking",permalink:"/tags/networking"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"greenhsu123",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"From an energy-efficiency perspective, it's better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.",tags:["networking","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Cache static data",permalink:"/catalog/cloud/cache-static-data"},next:{title:"Compress transmitted data",permalink:"/catalog/cloud/compress-transmitted-data"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function p(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"choose-the-region-that-is-closest-to-users"},"Choose the region that is closest to users"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"From an energy-efficiency perspective, it's better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware. "),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Choose a region that is the closest to the majority of where the network packets are going. "),(0,o.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Reducing the distance will impact SCI as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": By reducing the distance a packet travels, less total electricity is required. "),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of computing equipment traversed, the total embodied carbon is lower.")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("p",null,"Suppose we choose a region that is further away from our users to deploy our applications because the region is more popular and may be first in line to receive new features or updates. A better solution would be to consider choosing a region closer to our users, so the data we transmit doesn't need to travel as far. "),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"It may reduce cloud bills because shortening the path that a network packet travel will cost less. "),(0,o.kt)("li",{parentName:"ul"},"If the closer region to your users is missing some features, there may be an overhead to finding a workaround in the meantime. ")),(0,o.kt)("h2",{id:"references"},"References"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency"},"Hardware Efficiency Principle")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e642b58.d42e2410.js b/assets/js/9e642b58.d42e2410.js new file mode 100644 index 00000000..8d88d6a8 --- /dev/null +++ b/assets/js/9e642b58.d42e2410.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8456],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),c=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},d=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(r),m=n,h=d["".concat(l,".").concat(m)]||d[m]||p[m]||a;return r?o.createElement(h,i(i({ref:t},u),{},{components:r})):o.createElement(h,i({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,i[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var o=r(7462),n=(r(7294),r(4137));const a={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"From an energy-efficiency perspective, it's better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.",tags:["networking","role:cloud-engineer","size:small"]},i="Choose the region that is closest to users",s={unversionedId:"catalog/cloud/choose-region-closest-to-users",id:"catalog/cloud/choose-region-closest-to-users",title:"Choose the region that is closest to users",description:"From an energy-efficiency perspective, it's better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.",source:"@site/docs/catalog/cloud/choose-region-closest-to-users.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/choose-region-closest-to-users",permalink:"/catalog/cloud/choose-region-closest-to-users",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/choose-region-closest-to-users.md",tags:[{label:"networking",permalink:"/tags/networking"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"greenhsu123",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"From an energy-efficiency perspective, it's better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware.",tags:["networking","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Cache static data",permalink:"/catalog/cloud/cache-static-data"},next:{title:"Compress stored data",permalink:"/catalog/cloud/compress-stored-data"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function p(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"choose-the-region-that-is-closest-to-users"},"Choose the region that is closest to users"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"From an energy-efficiency perspective, it's better to shorten the distance a network packet travels so that less energy is required to transmit it. Similarly, from an embodied-carbon perspective, when a network packet traverses through less computing equipment, we are more efficient with hardware. "),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"Choose a region that is the closest to the majority of where the network packets are going. "),(0,n.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,n.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,n.kt)("p",null,"Reducing the distance will impact SCI as follows:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"E"),": By reducing the distance a packet travels, less total electricity is required. "),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of computing equipment traversed, the total embodied carbon is lower.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("p",null,"Suppose we choose a region that is further away from our users to deploy our applications because the region is more popular and may be first in line to receive new features or updates. A better solution would be to consider choosing a region closer to our users, so the data we transmit doesn't need to travel as far. "),(0,n.kt)("h2",{id:"considerations"},"Considerations"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"It may reduce cloud bills because shortening the path that a network packet travel will cost less. "),(0,n.kt)("li",{parentName:"ul"},"If the closer region to your users is missing some features, there may be an overhead to finding a workaround in the meantime. ")),(0,n.kt)("h2",{id:"references"},"References"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency"},"Hardware Efficiency Principle")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a829cb4e.03dc12b6.js b/assets/js/a829cb4e.03dc12b6.js new file mode 100644 index 00000000..4d1a5736 --- /dev/null +++ b/assets/js/a829cb4e.03dc12b6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5920],{4137:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(l,".").concat(m)]||p[m]||u[m]||i;return r?n.createElement(f,o(o({ref:t},d),{},{components:r})):n.createElement(f,o({ref:t},d))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:a,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"From an energy-efficiency perspective, it's better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.",tags:["networking","role:cloud-engineer","size:small"]},o="Compress transmitted data",s={unversionedId:"catalog/cloud/compress-transmitted-data",id:"catalog/cloud/compress-transmitted-data",title:"Compress transmitted data",description:"From an energy-efficiency perspective, it's better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.",source:"@site/docs/catalog/cloud/compress-transmitted-data.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/compress-transmitted-data",permalink:"/catalog/cloud/compress-transmitted-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/compress-transmitted-data.md",tags:[{label:"networking",permalink:"/tags/networking"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"greenhsu123",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"From an energy-efficiency perspective, it's better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.",tags:["networking","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Compress stored data",permalink:"/catalog/cloud/compress-stored-data"},next:{title:"Containerize your workloads",permalink:"/catalog/cloud/containerize-your-workload-where-applicable"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],d={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"compress-transmitted-data"},"Compress transmitted data"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"From an energy-efficiency perspective, it's better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Minimise the size of data transmitted by compressing files or payloads."),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Reducing the distance will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": We reduce the total electricity required by reducing network traffic. However, we should be wary that there may be a slight increase in energy consumed due to compressing and de-compressing data. "),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"I"),": We may also have a slight increase in location-based marginal carbon emissions due to compressing and de-compressing data at different locations.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"Suppose we choose to transfer data (e.g. files or payloads) to the client side because that is the only format the client side can handle. A better solution would be to consider a compressing mechanism for large files or payloads before sending them across the network to the client side to reduce overall network traffic. "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It may reduce cloud bills because minimising the size of the data transmitted will cost less. "),(0,a.kt)("li",{parentName:"ul"},"If a compressed asset cannot be dealt with, there is more overhead to resend the asset in the correct format. ")),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a829cb4e.d7efb83e.js b/assets/js/a829cb4e.d7efb83e.js deleted file mode 100644 index 24221a1b..00000000 --- a/assets/js/a829cb4e.d7efb83e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5920],{4137:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},d=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),p=c(r),m=a,f=p["".concat(l,".").concat(m)]||p[m]||u[m]||i;return r?n.createElement(f,s(s({ref:t},d),{},{components:r})):n.createElement(f,s({ref:t},d))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,s=new Array(i);s[0]=p;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o.mdxType="string"==typeof e?e:a,s[1]=o;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"From an energy-efficiency perspective, it's better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.",tags:["networking","role:cloud-engineer","size:small"]},s="Compress transmitted data",o={unversionedId:"catalog/cloud/compress-transmitted-data",id:"catalog/cloud/compress-transmitted-data",title:"Compress transmitted data",description:"From an energy-efficiency perspective, it's better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.",source:"@site/docs/catalog/cloud/compress-transmitted-data.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/compress-transmitted-data",permalink:"/catalog/cloud/compress-transmitted-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/compress-transmitted-data.md",tags:[{label:"networking",permalink:"/tags/networking"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"greenhsu123",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"From an energy-efficiency perspective, it's better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced.",tags:["networking","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Choose the region that is closest to users",permalink:"/catalog/cloud/choose-region-closest-to-users"},next:{title:"Delete unused storage resources",permalink:"/catalog/cloud/delete-unused-storage-resources"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],d={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"compress-transmitted-data"},"Compress transmitted data"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"From an energy-efficiency perspective, it's better to minimise the size of the data transmitted so that less energy is required because the network traffic is reduced. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Minimise the size of data transmitted by compressing files or payloads."),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Reducing the distance will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": We reduce the total electricity required by reducing network traffic. However, we should be wary that there may be a slight increase in energy consumed due to compressing and de-compressing data. "),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"I"),": We may also have a slight increase in location-based marginal carbon emissions due to compressing and de-compressing data at different locations.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"Suppose we choose to transfer data (e.g. files or payloads) to the client side because that is the only format the client side can handle. A better solution would be to consider a compressing mechanism for large files or payloads before sending them across the network to the client side to reduce overall network traffic. "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It may reduce cloud bills because minimising the size of the data transmitted will cost less. "),(0,a.kt)("li",{parentName:"ul"},"If a compressed asset cannot be dealt with, there is more overhead to resend the asset in the correct format. ")),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b8dc3674.06dcbace.js b/assets/js/b8dc3674.06dcbace.js new file mode 100644 index 00000000..d7254fba --- /dev/null +++ b/assets/js/b8dc3674.06dcbace.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3505],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var r=n(7294);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function s(e){for(var t=1;t=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},u=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},p=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=o,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return n?r.createElement(f,s(s({ref:t},u),{},{components:n})):r.createElement(f,s({ref:t},u))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,s=new Array(a);s[0]=p;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:o,s[1]=i;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var r=n(7462),o=(n(7294),n(4137));const a={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",tags:["cloud","security","networking","compute","kubernetes","role:software-engineer","size:medium"]},s="Use cloud native network security tools and controls",i={unversionedId:"catalog/cloud/use-cloud-native-network-security-tools-and-controls",id:"catalog/cloud/use-cloud-native-network-security-tools-and-controls",title:"Use cloud native network security tools and controls",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",source:"@site/docs/catalog/cloud/use-cloud-native-network-security-tools-and-controls.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls",permalink:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-cloud-native-network-security-tools-and-controls.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"security",permalink:"/tags/security"},{label:"networking",permalink:"/tags/networking"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",tags:["cloud","security","networking","compute","kubernetes","role:software-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Use circuit breaker patterns",permalink:"/catalog/cloud/use-circuit-breaker"},next:{title:"Use DDoS protection",permalink:"/catalog/cloud/use-ddos-protection"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"use-cloud-native-network-security-tools-and-controls"},"Use cloud native network security tools and controls"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"Network & web application firewalls provide protection against ",(0,o.kt)("a",{parentName:"p",href:"https://owasp.org/Top10/"},"most common attacks")," and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure."),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Filter ingress and egress traffic at the source to block any unauthorized data transmissions."),(0,o.kt)("p",null,"Use cloud native security tools, as they scale based on demand, and only the necessary infrastructure resources."),(0,o.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Using cloud native security controls and tools will impact SCI as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": By filtering transmitted data, less energy is consumed by the networking resources."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": By scaling the tools based on demand and maximizing resource utilization, the total embodied carbon emissions are lower.")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("p",null,"Deployment and configuration of the security tools is automated."),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(0,o.kt)("p",null,"Consider implementing a zero trust model, where security controls are layered."),(0,o.kt)("h2",{id:"references"},"References"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-security"},"Microsoft Azure well architected framework sustainability patterns")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b8dc3674.ac86471f.js b/assets/js/b8dc3674.ac86471f.js deleted file mode 100644 index b152eaa7..00000000 --- a/assets/js/b8dc3674.ac86471f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3505],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function s(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var l=n.createContext({}),c=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},p=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(r),m=o,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return r?n.createElement(f,s(s({ref:t},u),{},{components:r})):n.createElement(f,s({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,s=new Array(a);s[0]=p;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:o,s[1]=i;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>c});var n=r(7462),o=(r(7294),r(4137));const a={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",tags:["cloud","security","networking","compute","kubernetes","role:software-engineer","size:medium"]},s="Use cloud native network security tools and controls",i={unversionedId:"catalog/cloud/use-cloud-native-network-security-tools-and-controls",id:"catalog/cloud/use-cloud-native-network-security-tools-and-controls",title:"Use cloud native network security tools and controls",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",source:"@site/docs/catalog/cloud/use-cloud-native-network-security-tools-and-controls.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls",permalink:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-cloud-native-network-security-tools-and-controls.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"security",permalink:"/tags/security"},{label:"networking",permalink:"/tags/networking"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.",tags:["cloud","security","networking","compute","kubernetes","role:software-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Use circuit breaker patterns",permalink:"/catalog/cloud/use-circuit-breaker"},next:{title:"Use serverless cloud services",permalink:"/catalog/cloud/use-serverless"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"use-cloud-native-network-security-tools-and-controls"},"Use cloud native network security tools and controls"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"Network & web application firewalls provide protection against ",(0,o.kt)("a",{parentName:"p",href:"https://owasp.org/Top10/"},"most common attacks")," and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure."),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Filter ingress and egress traffic at the source to block any unauthorized data transmissions."),(0,o.kt)("p",null,"Use cloud native security tools, as they scale based on demand, and only the necessary infrastructure resources."),(0,o.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Using cloud native security controls and tools will impact SCI as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": By filtering transmitted data, less energy is consumed by the networking resources."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": By scaling the tools based on demand and maximizing resource utilization, the total embodied carbon emissions are lower.")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("p",null,"Deployment and configuration of the security tools is automated."),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(0,o.kt)("p",null,"Consider implementing a zero trust model, where security controls are layered."),(0,o.kt)("h2",{id:"references"},"References"),(0,o.kt)("p",null,(0,o.kt)("a",{parentName:"p",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-security"},"Microsoft Azure well architected framework sustainability patterns")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/be4eaa02.9ab09138.js b/assets/js/be4eaa02.9ab09138.js new file mode 100644 index 00000000..f967a03e --- /dev/null +++ b/assets/js/be4eaa02.9ab09138.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8066],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t=0||(o[r]=e[r]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(r),m=o,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||a;return r?n.createElement(f,i(i({ref:t},u),{},{components:r})):n.createElement(f,i({ref:t},u))}));function m(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:o,i[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var n=r(7462),o=(r(7294),r(4137));const a={version:1,submitted_by:"yelghali",published_date:new Date("2024-03-14T00:00:00.000Z"),category:"cloud",tags:["cloud","compute","kubernetes","role:software-engineer","role:cloud-engineer","size:medium"]},i="Use cloud native processor VMs",l={unversionedId:"catalog/cloud/use-energy-efficient-hardware",id:"catalog/cloud/use-energy-efficient-hardware",title:"Use cloud native processor VMs",description:"Description",source:"@site/docs/catalog/cloud/use-energy-efficient-hardware.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-energy-efficient-hardware",permalink:"/catalog/cloud/use-energy-efficient-hardware",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-energy-efficient-hardware.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"compute",permalink:"/tags/compute"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2024-03-14T00:00:00.000Z",category:"cloud",tags:["cloud","compute","kubernetes","role:software-engineer","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Use DDoS protection",permalink:"/catalog/cloud/use-ddos-protection"},next:{title:"Use serverless cloud services",permalink:"/catalog/cloud/use-serverless"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2}],u={toc:c};function p(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"use-cloud-native-processor-vms"},"Use cloud native processor VMs"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"Cloud virtual machines come with different capabilities based on different hardware processors. As such, using virtual machines based on the efficiency of their processors would impact hardware efficiency and reduce carbon emissions."),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Using new cloud virtual machines that have been engineered with ",(0,o.kt)("a",{parentName:"p",href:"https://www.forbes.com/sites/davealtavilla/2022/10/13/amperes-efficient-128-core-cloud-native-processor-builds-momentum-in-sustainable-data-centers/"},"cloud native processors")," allows you to efficiently run scale-out, cloud-native workloads and consume energy efficiently."),(0,o.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,o.kt)("p",null,(0,o.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Using energy efficient hardware impacts SCI as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": By using energy efficient hardware, we reduce the total embodied carbon emissions."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": By using energy efficient hardware, we also reduce the embodied emissions.")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("p",null,"The cloud provider offers VM SKUs based on efficient hardware."),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(0,o.kt)("p",null,"Energy efficient VMs tend to be cost effective as well. However, you should consider SKU availability in the region you choose for deployment:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Azure: ",(0,o.kt)("a",{parentName:"li",href:"https://azure.microsoft.com/en-us/blog/azure-virtual-machines-with-ampere-altra-arm-based-processors-generally-available/"},"https://azure.microsoft.com/en-us/blog/azure-virtual-machines-with-ampere-altra-arm-based-processors-generally-available/")),(0,o.kt)("li",{parentName:"ul"},"Google: ",(0,o.kt)("a",{parentName:"li",href:"https://cloud.google.com/blog/products/compute/tau-t2a-is-first-compute-engine-vm-on-an-arm-chip"},"https://cloud.google.com/blog/products/compute/tau-t2a-is-first-compute-engine-vm-on-an-arm-chip"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cbb6a674.e7a07a55.js b/assets/js/cbb6a674.e7a07a55.js new file mode 100644 index 00000000..36a4e36e --- /dev/null +++ b/assets/js/cbb6a674.e7a07a55.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7143],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function i(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),c=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=c(e.components);return o.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=n,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return r?o.createElement(f,i(i({ref:t},u),{},{components:r})):o.createElement(f,i({ref:t},u))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,i=new Array(a);i[0]=p;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,i[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var o=r(7462),n=(r(7294),r(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2024-03-14T00:00:00.000Z"),category:"cloud",description:"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.",tags:["cloud","size:small"]},i="Use DDoS protection",s={unversionedId:"catalog/cloud/use-ddos-protection",id:"catalog/cloud/use-ddos-protection",title:"Use DDoS protection",description:"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.",source:"@site/docs/catalog/cloud/use-ddos-protection.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-ddos-protection",permalink:"/catalog/cloud/use-ddos-protection",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-ddos-protection.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2024-03-14T00:00:00.000Z",category:"cloud",description:"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.",tags:["cloud","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Use cloud native network security tools and controls",permalink:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},next:{title:"Use cloud native processor VMs",permalink:"/catalog/cloud/use-energy-efficient-hardware"}},l={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:c};function d(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"use-ddos-protection"},"Use DDoS protection"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.\nDue to the nature of attack, a lot of environmental resources are used up by nonsensical requests."),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"All cloud providers have some form of DDoS protection (AWS Shield, Azure DDoS Protection, GCP DDoS Protection, CloudFlare, etc.) that can prevent those attacks."),(0,n.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,n.kt)("br",{parentName:"p"}),"\n",(0,n.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,n.kt)("p",null,"DDoS protection impacts the SCI as follows:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"R"),": The functional unit is impacted because the amount of requests will be reduced.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"There is budget for the DDoS protection service.")),(0,n.kt)("h2",{id:"considerations"},"Considerations"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Consider purchasing advanced protection to be fully protected against other attack patterns similar to DDoS attacks.")),(0,n.kt)("h2",{id:"references"},"References"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/architecture/framework/sustainability/sustainability-application-design"},"Azure Well-Architected Framework Sustainability Pillar"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cc299ddb.54a3873b.js b/assets/js/cc299ddb.54a3873b.js deleted file mode 100644 index 606b0dac..00000000 --- a/assets/js/cc299ddb.54a3873b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2467],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var o=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=o.createContext({}),u=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},c=function(e){var t=u(e.components);return o.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var r=e.components,a=e.mdxType,n=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(r),m=a,g=p["".concat(l,".").concat(m)]||p[m]||d[m]||n;return r?o.createElement(g,s(s({ref:t},c),{},{components:r})):o.createElement(g,s({ref:t},c))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=r.length,s=new Array(n);s[0]=p;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:a,s[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>n,metadata:()=>i,toc:()=>u});var o=r(7462),a=(r(7294),r(4137));const n={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"From an embodied carbon perspective, it's better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.",tags:["storage","role:cloud-engineer","size:small"]},s="Delete unused storage resources",i={unversionedId:"catalog/cloud/delete-unused-storage-resources",id:"catalog/cloud/delete-unused-storage-resources",title:"Delete unused storage resources",description:"From an embodied carbon perspective, it's better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.",source:"@site/docs/catalog/cloud/delete-unused-storage-resources.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/delete-unused-storage-resources",permalink:"/catalog/cloud/delete-unused-storage-resources",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/delete-unused-storage-resources.md",tags:[{label:"storage",permalink:"/tags/storage"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"greenhsu123",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"From an embodied carbon perspective, it's better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.",tags:["storage","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Compress transmitted data",permalink:"/catalog/cloud/compress-transmitted-data"},next:{title:"Encrypt what is necessary",permalink:"/catalog/cloud/encrypt-what-is-necessary"}},l={},u=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],c={toc:u};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,o.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"delete-unused-storage-resources"},"Delete unused storage resources"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"From an embodied carbon perspective, it's better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Delete any unused storage resource."),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Deleting storage volumes will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of storage volumes required, the total embodied carbon is lower.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"If we choose not to delete ",(0,a.kt)("em",{parentName:"p"},"all")," storage resources because they might be needed in the future, then storing them permanently will take up a lot of unnecessary storage resources. A better solution would be to remove idle resources so that no hardware is wasted. "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"It may reduce cloud bills, as reducing idle storage resources will cost less. "),(0,a.kt)("li",{parentName:"ul"},"We may lose access to data that might be needed in the future")),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency"},"Hardware Efficiency Principle"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cc299ddb.bad9c949.js b/assets/js/cc299ddb.bad9c949.js new file mode 100644 index 00000000..18870c91 --- /dev/null +++ b/assets/js/cc299ddb.bad9c949.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2467],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var o=r(7294);function n(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function s(e){for(var t=1;t=0||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=o.createContext({}),u=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},c=function(e){var t=u(e.components);return o.createElement(l.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var r=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,c=i(e,["components","mdxType","originalType","parentName"]),p=u(r),m=n,g=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return r?o.createElement(g,s(s({ref:t},c),{},{components:r})):o.createElement(g,s({ref:t},c))}));function m(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=r.length,s=new Array(a);s[0]=p;var i={};for(var l in t)hasOwnProperty.call(t,l)&&(i[l]=t[l]);i.originalType=e,i.mdxType="string"==typeof e?e:n,s[1]=i;for(var u=2;u{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>d,frontMatter:()=>a,metadata:()=>i,toc:()=>u});var o=r(7462),n=(r(7294),r(4137));const a={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",description:"From an embodied carbon perspective, it's better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.",tags:["storage","role:cloud-engineer","size:small"]},s="Delete unused storage resources",i={unversionedId:"catalog/cloud/delete-unused-storage-resources",id:"catalog/cloud/delete-unused-storage-resources",title:"Delete unused storage resources",description:"From an embodied carbon perspective, it's better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.",source:"@site/docs/catalog/cloud/delete-unused-storage-resources.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/delete-unused-storage-resources",permalink:"/catalog/cloud/delete-unused-storage-resources",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/delete-unused-storage-resources.md",tags:[{label:"storage",permalink:"/tags/storage"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"greenhsu123",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",description:"From an embodied carbon perspective, it's better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task.",tags:["storage","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Containerize your workloads",permalink:"/catalog/cloud/containerize-your-workload-where-applicable"},next:{title:"Encrypt what is necessary",permalink:"/catalog/cloud/encrypt-what-is-necessary"}},l={},u=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],c={toc:u};function d(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,o.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"delete-unused-storage-resources"},"Delete unused storage resources"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"From an embodied carbon perspective, it's better to delete unused storage resources so we are efficient with hardware and so that the storage layer is optimised for the task. "),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"Delete any unused storage resource."),(0,n.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,n.kt)("p",null,(0,n.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,n.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,n.kt)("p",null,"Deleting storage volumes will impact SCI as follows:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of storage volumes required, the total embodied carbon is lower.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("p",null,"If we choose not to delete ",(0,n.kt)("em",{parentName:"p"},"all")," storage resources because they might be needed in the future, then storing them permanently will take up a lot of unnecessary storage resources. A better solution would be to remove idle resources so that no hardware is wasted. "),(0,n.kt)("h2",{id:"considerations"},"Considerations"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"It may reduce cloud bills, as reducing idle storage resources will cost less. "),(0,n.kt)("li",{parentName:"ul"},"We may lose access to data that might be needed in the future")),(0,n.kt)("h2",{id:"references"},"References"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency"},"Hardware Efficiency Principle"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/d8d29226.26b1f00f.js b/assets/js/d8d29226.26b1f00f.js new file mode 100644 index 00000000..477375f9 --- /dev/null +++ b/assets/js/d8d29226.26b1f00f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2097],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function i(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function o(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var s=n.createContext({}),c=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},u=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(r),m=a,f=d["".concat(s,".").concat(m)]||d[m]||p[m]||i;return r?n.createElement(f,o(o({ref:t},u),{},{components:r})):n.createElement(f,o({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=d;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"yelghali",published_date:new Date("2024-03-14T00:00:00.000Z"),category:"cloud",tags:["cloud","security","network","kubernetes","role:cloud-engineer","size:medium"]},o="Use a service mesh only if needed",l={unversionedId:"catalog/cloud/evaluate-using-a-service-mesh",id:"catalog/cloud/evaluate-using-a-service-mesh",title:"Use a service mesh only if needed",description:"Description",source:"@site/docs/catalog/cloud/evaluate-using-a-service-mesh.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/evaluate-using-a-service-mesh",permalink:"/catalog/cloud/evaluate-using-a-service-mesh",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/evaluate-using-a-service-mesh.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"security",permalink:"/tags/security"},{label:"network",permalink:"/tags/network"},{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2024-03-14T00:00:00.000Z",category:"cloud",tags:["cloud","security","network","kubernetes","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Evaluate other CPU architectures",permalink:"/catalog/cloud/evaluate-other-cpu-architectures"},next:{title:"Terminate TLS at border gateway",permalink:"/catalog/cloud/evaluate-whether-to-use-TLS-termination"}},s={},c=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2}],u={toc:c};function p(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"use-a-service-mesh-only-if-needed"},"Use a service mesh only if needed"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"A service mesh deploys additional containers for communication, typically in a sidecar pattern, to provide more operational capabilities. This can result in an increase in CPU usage and network traffic but also allows you to decouple your application from these capabilities, moving them out from the application layer and down to the infrastructure layer."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Use a service mesh if your application lacks features that can be added one by one, such as distributed tracing or traffic encryption. However, use it for required applications only, and not the entire platform. "),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Not using a service mesh impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": By reducing CPU usage and network traffic, we reduce the amount of energy required."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": reducing CPU usage and network data reduces the amount of resources required, which decreases the embodied carbon emissions.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"The application does not have compliance requirements for using a service mesh. "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"Consider alternative methods outside of an service mesh to fulfill application requirements, for example custom DNS servers or a configuration that is injected into the application"))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e0c6c906.b2ed79fa.js b/assets/js/e0c6c906.b2ed79fa.js new file mode 100644 index 00000000..65aa212c --- /dev/null +++ b/assets/js/e0c6c906.b2ed79fa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8536],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});var o=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function n(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function s(e){for(var t=1;t=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var c=o.createContext({}),l=function(e){var t=o.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):s(s({},t),e)),r},u=function(e){var t=l(e.components);return o.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return o.createElement(o.Fragment,{},t)}},p=o.forwardRef((function(e,t){var r=e.components,a=e.mdxType,n=e.originalType,c=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=l(r),m=a,f=p["".concat(c,".").concat(m)]||p[m]||d[m]||n;return r?o.createElement(f,s(s({ref:t},u),{},{components:r})):o.createElement(f,s({ref:t},u))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=r.length,s=new Array(n);s[0]=p;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:a,s[1]=i;for(var l=2;l{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>d,frontMatter:()=>n,metadata:()=>i,toc:()=>l});var o=r(7462),a=(r(7294),r(4137));const n={version:1,submitted_by:"franziska-warncke",published_date:new Date("2024-03-14T00:00:00.000Z"),category:"cloud",tags:["cloud","size:medium"]},s="Compress stored data",i={unversionedId:"catalog/cloud/compress-stored-data",id:"catalog/cloud/compress-stored-data",title:"Compress stored data",description:"Description",source:"@site/docs/catalog/cloud/compress-stored-data.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/compress-stored-data",permalink:"/catalog/cloud/compress-stored-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/compress-stored-data.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"franziska-warncke",published_date:"2024-03-14T00:00:00.000Z",category:"cloud",tags:["cloud","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Choose the region that is closest to users",permalink:"/catalog/cloud/choose-region-closest-to-users"},next:{title:"Compress transmitted data",permalink:"/catalog/cloud/compress-transmitted-data"}},c={},l=[{value:"Description",id:"description",level:2},{value:"Solution",id:"solution",level:2},{value:"SCI Impact",id:"sci-impact",level:2},{value:"Assumptions",id:"assumptions",level:2},{value:"Considerations",id:"considerations",level:2},{value:"References",id:"references",level:2}],u={toc:l};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,o.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"compress-stored-data"},"Compress stored data"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Storing too much uncompressed data can result in bandwidth waste and increase the storage capacity requirements."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Using the right compression tool for each use case reduces the storage requirements. This includes both the capacity and required bandwidth to write or retrieve data. "),(0,a.kt)("h2",{id:"sci-impact"},"SCI Impact"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"SCI = (E * I) + M per R"),(0,a.kt)("br",{parentName:"p"}),"\n",(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Using compression when storing data impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Decreasing the amount of storage means less energy is consumed for the storage. However, compressing and de-compressing data may also cause a slight increase in energy consumed."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": Decreasing the amount of storage means there is less embodied carbon emitted.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"You have the ability to choose whether you use compression or not. This is not the case if you store a lot of data, as compression is needed to keep storage costs reasonable. In the same way, if you have a limited amount of storage space, you will be forced to use a high compression (even when a high CPU is required).")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The benefit of compression should always be considered in terms of the trade-off with the increased carbon cost of the resources (e.g. CPU, RAM) needed to perform the compression/decompression.")),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/well-architected/sustainability/sustainability-storage#enable-storage-compression"},"Microsoft Azure Well-Architected Framework"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ed645329.890bf7f7.js b/assets/js/ed645329.890bf7f7.js deleted file mode 100644 index eac6d981..00000000 --- a/assets/js/ed645329.890bf7f7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4236],{2578:e=>{e.exports=JSON.parse('{"label":"cloud","permalink":"/tags/cloud","allTagsPath":"/tags","count":16,"items":[{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","permalink":"/catalog/cloud/evaluate-other-cpu-architectures"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/match-slo","title":"Match your service level objectives to business needs","description":"If service downtimes are acceptable it\'s better to not strive for highest availability but to design the solution according to real business needs. Lower availability guarantees can help reduce energy consumption by using less infrastructure components.","permalink":"/catalog/cloud/match-slo"},{"id":"catalog/cloud/minimizing-deployed-environments","title":"Minimize the total number of deployed environments","description":"In a given application, there may be a need to utilize multiple environments in the application workflow. Typically, a development environment is used for regular updates, while staging or testing enviroments are used to make sure there are no issues before code reaches a production environment where users may have access. Each added environment has an increasing energy impact, which in turn creates more emissions. As such, it is important to understand the necessity of each enviroment and it\'s environmental impact.","permalink":"/catalog/cloud/minimizing-deployed-environments"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","permalink":"/catalog/cloud/scale-down-unused-applications"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","permalink":"/catalog/cloud/use-async-instead-of-sync"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"}]}')}}]); \ No newline at end of file diff --git a/assets/js/ed645329.ab1520c3.js b/assets/js/ed645329.ab1520c3.js new file mode 100644 index 00000000..a6c2a3fc --- /dev/null +++ b/assets/js/ed645329.ab1520c3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4236],{2578:e=>{e.exports=JSON.parse('{"label":"cloud","permalink":"/tags/cloud","allTagsPath":"/tags","count":22,"items":[{"id":"catalog/cloud/compress-stored-data","title":"Compress stored data","description":"Description","permalink":"/catalog/cloud/compress-stored-data"},{"id":"catalog/cloud/containerize-your-workload-where-applicable","title":"Containerize your workloads","description":"Description","permalink":"/catalog/cloud/containerize-your-workload-where-applicable"},{"id":"catalog/cloud/encrypt-what-is-necessary","title":"Encrypt what is necessary","description":"Data protection through encryption is a crucial aspect of our security measures. However, the encryption process can be resource-intensive at multiple levels.","permalink":"/catalog/cloud/encrypt-what-is-necessary"},{"id":"catalog/cloud/evaluate-other-cpu-architectures","title":"Evaluate other CPU architectures","description":"Applications are built with a software architecture that best fits the business need they are serving. Cloud providers make it easy to evaluate other CPU types","permalink":"/catalog/cloud/evaluate-other-cpu-architectures"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/match-slo","title":"Match your service level objectives to business needs","description":"If service downtimes are acceptable it\'s better to not strive for highest availability but to design the solution according to real business needs. Lower availability guarantees can help reduce energy consumption by using less infrastructure components.","permalink":"/catalog/cloud/match-slo"},{"id":"catalog/cloud/minimizing-deployed-environments","title":"Minimize the total number of deployed environments","description":"In a given application, there may be a need to utilize multiple environments in the application workflow. Typically, a development environment is used for regular updates, while staging or testing enviroments are used to make sure there are no issues before code reaches a production environment where users may have access. Each added environment has an increasing energy impact, which in turn creates more emissions. As such, it is important to understand the necessity of each enviroment and it\'s environmental impact.","permalink":"/catalog/cloud/minimizing-deployed-environments"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","title":"Optimize impact on customer devices and equipment","description":"Description","permalink":"/catalog/cloud/optimize-impact-on-customer-equipment"},{"id":"catalog/cloud/queue-non-urgent-requests","title":"Queue non-urgent processing requests","description":"All systems have periods of peak and low load. From a hardware-efficiency perspective, we are more efficient with hardware if we minimise the impact of request spikes with an implementation that allows an even utilization of components. From an energy-efficiency perspective, we are more efficient with energy if we ensure that idle resources are kept to a minimum.","permalink":"/catalog/cloud/queue-non-urgent-requests"},{"id":"catalog/cloud/remove-unused-assets","title":"Remove unused assets","description":"Description","permalink":"/catalog/cloud/remove-unused-assets"},{"id":"catalog/cloud/scale-down-unused-applications","title":"Scale down applications when not in use","description":"Applications consume CPU even when they are not actively in use. For example, background timers, garbage collection, health checks, etc. Even when the application is shut down, the underlying hardware is consuming idle power.","permalink":"/catalog/cloud/scale-down-unused-applications"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","title":"Scale infrastructure with user load","description":"Demand for resources depends on user load at any given time. However, most applications run without taking this into consideration. As a result,resources are underused and inefficient.","permalink":"/catalog/cloud/scale-infrastructure-with-user-load"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/scan-for-vulnerabilities","title":"Scan for vulnerabilities","description":"Many attacks on cloud infrastructure seek to misuse deployed resources, which leads to an unnecessary spike in usage and cost.","permalink":"/catalog/cloud/scan-for-vulnerabilities"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/evaluate-using-a-service-mesh","title":"Use a service mesh only if needed","description":"Description","permalink":"/catalog/cloud/evaluate-using-a-service-mesh"},{"id":"catalog/cloud/use-async-instead-of-sync","title":"Use Asynchronous network calls instead of synchronous","description":"When making calls across process boundaries to either databases or file systems or REST APIs, relying on synchronous calls can cause the calling thread to become blocked, putting additional load on the CPU","permalink":"/catalog/cloud/use-async-instead-of-sync"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"},{"id":"catalog/cloud/use-ddos-protection","title":"Use DDoS protection","description":"Distributed denial of service (DDoS) attacks are used to increase the server load so that it is unable to respond to any legitimate requests. This is usually done to harm the owner of the service or hardware.","permalink":"/catalog/cloud/use-ddos-protection"},{"id":"catalog/cloud/use-serverless","title":"Use serverless cloud services","description":"Description","permalink":"/catalog/cloud/use-serverless"}]}')}}]); \ No newline at end of file diff --git a/assets/js/ff23dbd5.3475b4c2.js b/assets/js/ff23dbd5.3475b4c2.js deleted file mode 100644 index e6322dff..00000000 --- a/assets/js/ff23dbd5.3475b4c2.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4876],{9627:e=>{e.exports=JSON.parse('{"label":"role:software-engineer","permalink":"/tags/role-software-engineer","allTagsPath":"/tags","count":9,"items":[{"id":"catalog/web/avoid-tracking-unnecessary-data","title":"Avoid tracking unnecessary data","description":"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.","permalink":"/catalog/web/avoid-tracking-unnecessary-data"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","permalink":"/catalog/cloud/optimise-storage-resource-utilisation"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","permalink":"/catalog/cloud/shed-lower-priority-traffic"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"}]}')}}]); \ No newline at end of file diff --git a/assets/js/ff23dbd5.f16d3321.js b/assets/js/ff23dbd5.f16d3321.js new file mode 100644 index 00000000..cf74ee8b --- /dev/null +++ b/assets/js/ff23dbd5.f16d3321.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4876],{9627:e=>{e.exports=JSON.parse('{"label":"role:software-engineer","permalink":"/tags/role-software-engineer","allTagsPath":"/tags","count":11,"items":[{"id":"catalog/web/avoid-tracking-unnecessary-data","title":"Avoid tracking unnecessary data","description":"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.","permalink":"/catalog/web/avoid-tracking-unnecessary-data"},{"id":"catalog/cloud/implement-stateless-design","title":"Implement stateless design","description":"Service state refers to the in-memory or on-disk data required by a service to function. State includes the data structures and member variables that the service reads and writes. Depending on how the service is architected, the state might also include files or other resources stored on the disk. Applications that consume large memory or on-disk data require larger VM sizes, especially for cloud computing where you would need larger VM SKUs to support high RAM capacity and multiple data disks.","permalink":"/catalog/cloud/implement-stateless-design"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","title":"Optimise storage utilization","description":"It\'s better to maximise storage utilisation so the storage layer is optimised for the task, not only in terms of energy proportionality but also in terms of embodied carbon. Two storage units running at low utilization rates will consume more energy than one running at a high utilization rate. In addition, the unused capacity on the underutilised storage unit could be more efficiently used for another task or process.","permalink":"/catalog/cloud/optimise-storage-resource-utilisation"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","title":"Optimize average CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-avg-cpu-utilization"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","title":"Optimize peak CPU utilization","description":"CPU usage and utilization varies throughout the day, sometimes wildly for different computational requirements. The larger the variance between the average and peak CPU utilization values, the more resources need to be provisioned in stand-by mode to absorb those spikes in traffic.","permalink":"/catalog/cloud/optimize-peak-cpu-utilization"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","title":"Scale Kubernetes workloads based on relevant demand metrics","description":"By default, Kubernetes scales workloads based on CPU and RAM utilization. In practice, however, it\'s difficult to correlate your application\'s demand drivers with CPU and RAM utilization. Scaling your workload based on relevant demand metrics that drive scaling of your applications, such as HTTP requests, queue length, and cloud alerting events can help reduce resource utilization, and therefore also your carbon emissions.","permalink":"/catalog/cloud/scale-kubernetes-workloads-based-on-events"},{"id":"catalog/cloud/scale-logical-components-independently","title":"Scale logical components independently","description":"Description","permalink":"/catalog/cloud/scale-logical-components-independently"},{"id":"catalog/cloud/shed-lower-priority-traffic","title":"Shed lower priority traffic","description":"When resources are constrained during high-traffic events or when carbon intensity is high, more carbon emissions will be generated from your system. Adding more resources to support increased traffic requirements introduces more embodied carbon and more demand for electricity. Continuing to handle all requests during high carbon intensity will increase overall emissions for your system. Shedding traffic that is lower priority during these scenarios will save on resources and carbon emissions. This approach requires an understanding of your traffic, including which call requests are critical and which can best withstand retry attempts and failures.","permalink":"/catalog/cloud/shed-lower-priority-traffic"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","title":"Terminate TLS at border gateway","description":"Transport Layer Security (TLS) ensures that all data passed between the web server and web browsers remain private and encrypted. However, terminating and re-establishing TLS increases CPU usage and might be unnecessary in certain architectures.","permalink":"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","title":"Use cloud native network security tools and controls","description":"Network and web application firewalls provide protection against most common attacks and load shedding bad bots. These tools help to remove unnecessary data transmission and reduce the burden on the cloud infrastructure, while also using lower bandwidth and less infrastructure.","permalink":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"},{"id":"catalog/cloud/use-energy-efficient-hardware","title":"Use cloud native processor VMs","description":"Description","permalink":"/catalog/cloud/use-energy-efficient-hardware"}]}')}}]); \ No newline at end of file diff --git a/assets/js/main.67529a55.js b/assets/js/main.67529a55.js deleted file mode 100644 index 04105722..00000000 --- a/assets/js/main.67529a55.js +++ /dev/null @@ -1,2 +0,0 @@ -/*! For license information please see main.67529a55.js.LICENSE.txt */ -(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[179],{997:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7294),a=n(7462),o=n(8356),i=n.n(o),l=n(6887);const s={"007e88ba":[()=>n.e(7647).then(n.bind(n,7370)),"@site/docs/catalog/web/defer-offscreen-images.md",7370],"0751a84b":[()=>n.e(4996).then(n.t.bind(n,8406,19)),"~docs/default/tag-tags-size-large-273.json",8406],"0bfc0a96":[()=>n.e(8988).then(n.t.bind(n,6075,19)),"~docs/default/tag-tags-monitoring-45e.json",6075],"0c466652":[()=>n.e(5453).then(n.t.bind(n,4045,19)),"~docs/default/tag-tags-role-web-developer-697.json",4045],"0f563736":[()=>n.e(9692).then(n.bind(n,5140)),"@site/docs/catalog/cloud/match-slo.md",5140],"1388c4ac":[()=>Promise.all([n.e(532),n.e(1765),n.e(5852)]).then(n.bind(n,1545)),"@site/docs/catalog/ai/index.md",1545],"14ede2c4":[()=>n.e(6972).then(n.t.bind(n,1520,19)),"~docs/default/tag-tags-security-95f.json",1520],"16fb93b6":[()=>n.e(2677).then(n.bind(n,4150)),"@site/docs/catalog/cloud/implement-stateless-design.md",4150],17896441:[()=>Promise.all([n.e(532),n.e(7918)]).then(n.bind(n,7574)),"@theme/DocItem",7574],"1ba1fdde":[()=>n.e(5025).then(n.bind(n,409)),"@site/docs/catalog/cloud/use-serverless.md",409],"1be78505":[()=>Promise.all([n.e(532),n.e(9514)]).then(n.bind(n,1299)),"@theme/DocPage",1299],"237b5df5":[()=>n.e(8110).then(n.bind(n,1173)),"@site/docs/catalog/cloud/scale-down-unused-applications.md",1173],"2bcf1a01":[()=>n.e(6686).then(n.bind(n,3180)),"@site/docs/catalog/ai/energy-efficent-models.md",3180],"2ec3b088":[()=>n.e(2351).then(n.bind(n,3656)),"@site/docs/catalog/web/remove-unused-css.md",3656],"336012cf":[()=>n.e(7358).then(n.t.bind(n,8623,19)),"~docs/default/tag-tags-deployment-7e5.json",8623],"339e0e38":[()=>n.e(4124).then(n.bind(n,4784)),"@site/docs/catalog/cloud/use-async-instead-of-sync.md",4784],"356d1211":[()=>n.e(7904).then(n.bind(n,7969)),"@site/docs/catalog/web/minify-web-assets.md",7969],"359b770c":[()=>n.e(5677).then(n.bind(n,1490)),"@site/docs/catalog/cloud/scale-kubernetes-workloads-based-on-events.md",1490],"3720c009":[()=>Promise.all([n.e(532),n.e(3751)]).then(n.bind(n,6495)),"@theme/DocTagsListPage",6495],"3dd08d97":[()=>n.e(8751).then(n.bind(n,2647)),"@site/docs/catalog/cloud/set-retention-policy-on-storage-resources.md",2647],"3ea99f16":[()=>n.e(6330).then(n.bind(n,2118)),"@site/docs/catalog/ai/right-hardware-type.md",2118],"41cb6a13":[()=>n.e(5082).then(n.bind(n,3477)),"@site/docs/catalog/cloud/evaluate-other-cpu-architectures.md",3477],"473c0143":[()=>n.e(4601).then(n.bind(n,1651)),"@site/docs/catalog/cloud/queue-non-urgent-requests.md",1651],"48e9e5f1":[()=>n.e(7538).then(n.bind(n,4407)),"@site/docs/catalog/cloud/shed-lower-priority-traffic.md",4407],"4a01a261":[()=>n.e(5497).then(n.bind(n,9394)),"@site/docs/catalog/ai/serverless-model-development.md",9394],"4a0e72b8":[()=>n.e(2340).then(n.t.bind(n,8689,19)),"~docs/default/tag-tags-reliability-availability-86f.json",8689],"4bc4971a":[()=>n.e(1938).then(n.bind(n,296)),"@site/docs/catalog/cloud/reduce-transmitted-data.md",296],"4edc808e":[()=>Promise.all([n.e(532),n.e(4173)]).then(n.bind(n,1211)),"@site/docs/index.mdx",1211],"55960ee5":[()=>n.e(4121).then(n.t.bind(n,8070,19)),"~docs/default/tags-list-current-prop-15a.json",8070],"56c122aa":[()=>n.e(1286).then(n.bind(n,4688)),"@site/docs/catalog/ai/pre-trained-transfer-learning.md",4688],"5b55fa8e":[()=>n.e(50).then(n.t.bind(n,7798,19)),"~docs/default/tag-tags-size-medium-805.json",7798],"5bdcc37f":[()=>n.e(2949).then(n.bind(n,2834)),"@site/docs/catalog/index.md",2834],"5cff0ebf":[()=>n.e(8961).then(n.t.bind(n,3039,19)),"~docs/default/tag-tags-compute-461.json",3039],"5e582b23":[()=>n.e(2645).then(n.t.bind(n,5554,19)),"~docs/default/tag-tags-size-small-284.json",5554],"6e7c13c8":[()=>n.e(7821).then(n.bind(n,9845)),"@site/docs/guide/suggested-tags.md",9845],"717128d8":[()=>n.e(2122).then(n.bind(n,5383)),"@site/docs/catalog/cloud/optimize-impact-on-customer-equipment.md",5383],"72b27058":[()=>n.e(3969).then(n.bind(n,2401)),"@site/docs/catalog/cloud/match-utilization-requirements-of-vm.md",2401],"770c5109":[()=>n.e(8725).then(n.bind(n,3846)),"@site/docs/catalog/cloud/cache-static-data.md",3846],"777526ec":[()=>n.e(2072).then(n.t.bind(n,4390,19)),"~docs/default/tag-tags-role-data-scientist-44c.json",4390],"778078a6":[()=>n.e(8450).then(n.bind(n,1573)),"@site/docs/catalog/web/serve-images-in-modern-formats.md",1573],"78f57216":[()=>n.e(7070).then(n.bind(n,211)),"@site/docs/catalog/cloud/remove-unused-assets.md",211],"7a11bfb9":[()=>n.e(1421).then(n.bind(n,5965)),"@site/docs/catalog/cloud/scan-for-vulnerabilities.md",5965],"7d16b062":[()=>n.e(5754).then(n.t.bind(n,1336,19)),"~docs/default/tag-tags-networking-604.json",1336],"7d4685ea":[()=>n.e(9797).then(n.bind(n,5103)),"@site/docs/guide/index.md",5103],"7ebec3ff":[()=>n.e(5419).then(n.t.bind(n,4321,19)),"~docs/default/tag-tags-role-cloud-engineer-91c.json",4321],"8002bf56":[()=>n.e(7860).then(n.bind(n,5532)),"@site/docs/catalog/web/avoid-tracking-unnecessary-data.md",5532],"836ef5f0":[()=>n.e(146).then(n.bind(n,6686)),"@site/docs/catalog/cloud/minimizing-deployed-environments.md",6686],"8d01fc8d":[()=>n.e(8802).then(n.bind(n,1308)),"@site/docs/catalog/web/use-server-side-rendering.md",1308],"8d33f67c":[()=>n.e(3079).then(n.t.bind(n,253,19)),"~docs/default/tag-tags-kubernetes-7ba.json",253],"8e1e143b":[()=>n.e(9825).then(n.bind(n,5925)),"@site/docs/catalog/cloud/encrypt-what-is-necessary.md",5925],"8f91f489":[()=>n.e(7182).then(n.bind(n,8273)),"@site/docs/catalog/cloud/optimise-storage-resource-utilisation.md",8273],"9209d359":[()=>n.e(6214).then(n.bind(n,3075)),"@site/docs/tags/index.md",3075],"935f2afb":[()=>n.e(53).then(n.t.bind(n,1109,19)),"~docs/default/version-current-metadata-prop-751.json",1109],"93d64a37":[()=>n.e(1215).then(n.bind(n,4017)),"@site/docs/catalog/cloud/evaluate-whether-to-use-TLS-termination.md",4017],"957fd519":[()=>n.e(9275).then(n.bind(n,9534)),"@site/docs/catalog/ai/leverage-sustainable-regions.md",9534],"98ee5961":[()=>n.e(9401).then(n.bind(n,3806)),"@site/docs/catalog/cloud/use-circuit-breaker.md",3806],"9e642b58":[()=>n.e(8456).then(n.bind(n,4337)),"@site/docs/catalog/cloud/choose-region-closest-to-users.md",4337],a3d45d30:[()=>n.e(6431).then(n.bind(n,784)),"@site/docs/catalog/web/avoid-chaining-critical-requests.md",784],a4b181a9:[()=>n.e(8989).then(n.t.bind(n,9161,19)),"~docs/default/tag-tags-role-reliability-engineer-2d5.json",9161],a4dfb062:[()=>Promise.all([n.e(532),n.e(1765),n.e(2805)]).then(n.bind(n,7045)),"@site/docs/catalog/web/index.md",7045],a637ac13:[()=>n.e(6187).then(n.bind(n,8664)),"@site/docs/catalog/cloud/time-shift-kubernetes-cron-jobs.md",8664],a829cb4e:[()=>n.e(5920).then(n.bind(n,2131)),"@site/docs/catalog/cloud/compress-transmitted-data.md",2131],ab84bad5:[()=>n.e(1375).then(n.bind(n,1233)),"@site/docs/catalog/web/minimize-main-thread-work.md",1233],b02fcbbe:[()=>n.e(8540).then(n.bind(n,1102)),"@site/docs/catalog/cloud/optimize-avg-cpu-utilization.md",1102],b084ff01:[()=>n.e(8668).then(n.bind(n,601)),"@site/docs/catalog/ai/energy-efficent-ai-edge.md",601],b0cf2206:[()=>Promise.all([n.e(532),n.e(1765),n.e(252)]).then(n.bind(n,1685)),"@site/docs/catalog/cloud/index.md",1685],b6af033a:[()=>n.e(4923).then(n.bind(n,3677)),"@site/docs/catalog/web/properly-sized-images.md",3677],b8dc3674:[()=>n.e(3505).then(n.bind(n,2831)),"@site/docs/catalog/cloud/use-cloud-native-network-security-tools-and-controls.md",2831],bf31d9bc:[()=>n.e(6795).then(n.bind(n,6767)),"@site/docs/catalog/cloud/scale-down-kubernetes-workloads.md",6767],c0a2235c:[()=>n.e(2092).then(n.bind(n,7198)),"@site/docs/catalog/ai/efficent-format-for-model-training.md",7198],c30665ef:[()=>n.e(6755).then(n.t.bind(n,6671,19)),"~docs/default/tag-tags-ai-5b5.json",6671],c5a0b084:[()=>n.e(4403).then(n.bind(n,8589)),"@site/docs/catalog/web/deprecate-gifs.md",8589],cc299ddb:[()=>n.e(2467).then(n.bind(n,5247)),"@site/docs/catalog/cloud/delete-unused-storage-resources.md",5247],d6c3f943:[()=>n.e(3890).then(n.t.bind(n,1130,19)),"~docs/default/tag-tags-machine-learning-7b6.json",1130],df203c0f:[()=>n.e(9924).then(n.bind(n,9385)),"@theme/DocTagDocListPage",9385],e20ae084:[()=>n.e(6181).then(n.bind(n,7704)),"@site/docs/catalog/cloud/match-utilization-requirements-with-pre-configured-server.md",7704],e450c455:[()=>n.e(6513).then(n.bind(n,9669)),"@site/docs/guide/initial-reviewer-guide.md",9669],ed645329:[()=>n.e(4236).then(n.t.bind(n,2578,19)),"~docs/default/tag-tags-cloud-c13.json",2578],f00aede0:[()=>n.e(3043).then(n.bind(n,6739)),"@site/docs/catalog/web/enable-text-compression.md",6739],f217acd3:[()=>n.e(4077).then(n.t.bind(n,3769,19)),"/home/runner/work/patterns/patterns/.docusaurus/docusaurus-plugin-content-docs/default/plugin-route-context-module-100.json",3769],f31c573f:[()=>n.e(3777).then(n.bind(n,2502)),"@site/docs/guide/sme-reviewer-guide.md",2502],f415b733:[()=>n.e(6934).then(n.t.bind(n,4930,19)),"~docs/default/tag-tags-serverless-f69.json",4930],f4e56079:[()=>n.e(7030).then(n.t.bind(n,8022,19)),"~docs/default/tag-tags-storage-547.json",8022],f542e803:[()=>n.e(6559).then(n.bind(n,2154)),"@site/docs/catalog/ai/compress-ml-models-for-inference.md",2154],f59c19d8:[()=>n.e(5189).then(n.bind(n,2780)),"@site/docs/catalog/web/avoid-excessive-dom-size.md",2780],f80b235d:[()=>n.e(1492).then(n.t.bind(n,3444,19)),"~docs/default/tag-tags-web-fd1.json",3444],fada8994:[()=>n.e(727).then(n.bind(n,8158)),"@site/docs/catalog/cloud/optimize-peak-cpu-utilization.md",8158],fb227624:[()=>n.e(2704).then(n.bind(n,8771)),"@site/docs/catalog/cloud/scale-infrastructure-with-user-load.md",8771],fb940ba6:[()=>n.e(927).then(n.bind(n,5911)),"@site/docs/catalog/ai/energy-efficent-framework.md",5911],fd82f3a4:[()=>n.e(3422).then(n.bind(n,7322)),"@site/docs/catalog/web/keep-request-counts-low.md",7322],ff23dbd5:[()=>n.e(4876).then(n.t.bind(n,9627,19)),"~docs/default/tag-tags-role-software-engineer-c0b.json",9627]};function u(e){let{error:t,retry:n,pastDelay:a}=e;return t?r.createElement("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"}},r.createElement("p",null,String(t)),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},"Retry"))):a?r.createElement("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"}},r.createElement("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb"},r.createElement("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0"},r.createElement("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),r.createElement("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})),r.createElement("circle",{cx:"22",cy:"22",r:"8"},r.createElement("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"}))))):null}var c=n(5304),d=n(9656);function f(e,t){if("*"===e)return i()({loading:u,loader:()=>n.e(4248).then(n.bind(n,4248)),modules:["@theme/NotFound"],webpack:()=>[4248],render(e,t){const n=e.default;return r.createElement(d.z,{value:{plugin:{name:"native",id:"default"}}},r.createElement(n,t))}});const o=l[e+"-"+t],f={},p=[],m=[],g=(0,c.Z)(o);return Object.entries(g).forEach((e=>{let[t,n]=e;const r=s[n];r&&(f[t]=r[0],p.push(r[1]),m.push(r[2]))})),i().Map({loading:u,loader:f,modules:p,webpack:()=>m,render(t,n){const i=JSON.parse(JSON.stringify(o));Object.entries(t).forEach((t=>{let[n,r]=t;const a=r.default;if(!a)throw new Error("The page component at "+e+" doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.");"object"!=typeof a&&"function"!=typeof a||Object.keys(r).filter((e=>"default"!==e)).forEach((e=>{a[e]=r[e]}));let o=i;const l=n.split(".");l.slice(0,-1).forEach((e=>{o=o[e]})),o[l[l.length-1]]=a}));const l=i.__comp;delete i.__comp;const s=i.__context;return delete i.__context,r.createElement(d.z,{value:s},r.createElement(l,(0,a.Z)({},i,n)))}})}const p=[{path:"/tags",component:f("/tags","68f"),exact:!0},{path:"/tags/ai",component:f("/tags/ai","a2c"),exact:!0},{path:"/tags/cloud",component:f("/tags/cloud","de5"),exact:!0},{path:"/tags/compute",component:f("/tags/compute","777"),exact:!0},{path:"/tags/deployment",component:f("/tags/deployment","694"),exact:!0},{path:"/tags/kubernetes",component:f("/tags/kubernetes","90f"),exact:!0},{path:"/tags/machine-learning",component:f("/tags/machine-learning","9bf"),exact:!0},{path:"/tags/monitoring",component:f("/tags/monitoring","903"),exact:!0},{path:"/tags/networking",component:f("/tags/networking","b32"),exact:!0},{path:"/tags/reliability-availability",component:f("/tags/reliability-availability","fff"),exact:!0},{path:"/tags/role-cloud-engineer",component:f("/tags/role-cloud-engineer","d87"),exact:!0},{path:"/tags/role-data-scientist",component:f("/tags/role-data-scientist","df6"),exact:!0},{path:"/tags/role-reliability-engineer",component:f("/tags/role-reliability-engineer","338"),exact:!0},{path:"/tags/role-software-engineer",component:f("/tags/role-software-engineer","da4"),exact:!0},{path:"/tags/role-web-developer",component:f("/tags/role-web-developer","aad"),exact:!0},{path:"/tags/security",component:f("/tags/security","3dd"),exact:!0},{path:"/tags/serverless",component:f("/tags/serverless","792"),exact:!0},{path:"/tags/size-large",component:f("/tags/size-large","ab7"),exact:!0},{path:"/tags/size-medium",component:f("/tags/size-medium","270"),exact:!0},{path:"/tags/size-small",component:f("/tags/size-small","4f5"),exact:!0},{path:"/tags/storage",component:f("/tags/storage","8ea"),exact:!0},{path:"/tags/web",component:f("/tags/web","4ad"),exact:!0},{path:"/",component:f("/","8e5"),routes:[{path:"/",component:f("/","7d9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/",component:f("/catalog/","7d8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/",component:f("/catalog/ai/","625"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/compress-ml-models-for-inference",component:f("/catalog/ai/compress-ml-models-for-inference","f94"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/efficent-format-for-model-training",component:f("/catalog/ai/efficent-format-for-model-training","d50"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/energy-efficent-ai-edge",component:f("/catalog/ai/energy-efficent-ai-edge","b3d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/energy-efficent-framework",component:f("/catalog/ai/energy-efficent-framework","efb"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/energy-efficent-models",component:f("/catalog/ai/energy-efficent-models","761"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/leverage-sustainable-regions",component:f("/catalog/ai/leverage-sustainable-regions","755"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/pre-trained-transfer-learning",component:f("/catalog/ai/pre-trained-transfer-learning","61e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/right-hardware-type",component:f("/catalog/ai/right-hardware-type","a60"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/ai/serverless-model-development",component:f("/catalog/ai/serverless-model-development","585"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/",component:f("/catalog/cloud/","bb3"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/cache-static-data",component:f("/catalog/cloud/cache-static-data","0c2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/choose-region-closest-to-users",component:f("/catalog/cloud/choose-region-closest-to-users","483"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/compress-transmitted-data",component:f("/catalog/cloud/compress-transmitted-data","569"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/delete-unused-storage-resources",component:f("/catalog/cloud/delete-unused-storage-resources","504"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/encrypt-what-is-necessary",component:f("/catalog/cloud/encrypt-what-is-necessary","ad9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/evaluate-other-cpu-architectures",component:f("/catalog/cloud/evaluate-other-cpu-architectures","775"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/evaluate-whether-to-use-TLS-termination",component:f("/catalog/cloud/evaluate-whether-to-use-TLS-termination","ef8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/implement-stateless-design",component:f("/catalog/cloud/implement-stateless-design","411"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/match-slo",component:f("/catalog/cloud/match-slo","9f1"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/match-utilization-requirements-of-vm",component:f("/catalog/cloud/match-utilization-requirements-of-vm","ff8"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/match-utilization-requirements-with-pre-configured-server",component:f("/catalog/cloud/match-utilization-requirements-with-pre-configured-server","61d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/minimizing-deployed-environments",component:f("/catalog/cloud/minimizing-deployed-environments","151"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/optimise-storage-resource-utilisation",component:f("/catalog/cloud/optimise-storage-resource-utilisation","e69"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/optimize-avg-cpu-utilization",component:f("/catalog/cloud/optimize-avg-cpu-utilization","d5e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/optimize-impact-on-customer-equipment",component:f("/catalog/cloud/optimize-impact-on-customer-equipment","6ba"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/optimize-peak-cpu-utilization",component:f("/catalog/cloud/optimize-peak-cpu-utilization","e53"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/queue-non-urgent-requests",component:f("/catalog/cloud/queue-non-urgent-requests","2b0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/reduce-transmitted-data",component:f("/catalog/cloud/reduce-transmitted-data","554"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/remove-unused-assets",component:f("/catalog/cloud/remove-unused-assets","c9d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scale-down-kubernetes-workloads",component:f("/catalog/cloud/scale-down-kubernetes-workloads","3d4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scale-down-unused-applications",component:f("/catalog/cloud/scale-down-unused-applications","890"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scale-infrastructure-with-user-load",component:f("/catalog/cloud/scale-infrastructure-with-user-load","58c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scale-kubernetes-workloads-based-on-events",component:f("/catalog/cloud/scale-kubernetes-workloads-based-on-events","b00"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/scan-for-vulnerabilities",component:f("/catalog/cloud/scan-for-vulnerabilities","c71"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/set-retention-policy-on-storage-resources",component:f("/catalog/cloud/set-retention-policy-on-storage-resources","efa"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/shed-lower-priority-traffic",component:f("/catalog/cloud/shed-lower-priority-traffic","d65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/time-shift-kubernetes-cron-jobs",component:f("/catalog/cloud/time-shift-kubernetes-cron-jobs","e2f"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-async-instead-of-sync",component:f("/catalog/cloud/use-async-instead-of-sync","b65"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-circuit-breaker",component:f("/catalog/cloud/use-circuit-breaker","3d0"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls",component:f("/catalog/cloud/use-cloud-native-network-security-tools-and-controls","52e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/cloud/use-serverless",component:f("/catalog/cloud/use-serverless","089"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/",component:f("/catalog/web/","b72"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/avoid-chaining-critical-requests",component:f("/catalog/web/avoid-chaining-critical-requests","50e"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/avoid-excessive-dom-size",component:f("/catalog/web/avoid-excessive-dom-size","946"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/avoid-tracking-unnecessary-data",component:f("/catalog/web/avoid-tracking-unnecessary-data","99d"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/defer-offscreen-images",component:f("/catalog/web/defer-offscreen-images","a82"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/deprecate-gifs",component:f("/catalog/web/deprecate-gifs","86c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/enable-text-compression",component:f("/catalog/web/enable-text-compression","3cc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/keep-request-counts-low",component:f("/catalog/web/keep-request-counts-low","98b"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/minify-web-assets",component:f("/catalog/web/minify-web-assets","39a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/minimize-main-thread-work",component:f("/catalog/web/minimize-main-thread-work","dc9"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/properly-sized-images",component:f("/catalog/web/properly-sized-images","73a"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/remove-unused-css",component:f("/catalog/web/remove-unused-css","1fc"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/serve-images-in-modern-formats",component:f("/catalog/web/serve-images-in-modern-formats","2e4"),exact:!0,sidebar:"tutorialSidebar"},{path:"/catalog/web/use-server-side-rendering",component:f("/catalog/web/use-server-side-rendering","6bd"),exact:!0,sidebar:"tutorialSidebar"},{path:"/guide/",component:f("/guide/","9b2"),exact:!0,sidebar:"tutorialSidebar"},{path:"/guide/initial-reviewer-guide",component:f("/guide/initial-reviewer-guide","346"),exact:!0,sidebar:"tutorialSidebar"},{path:"/guide/sme-reviewer-guide",component:f("/guide/sme-reviewer-guide","c9c"),exact:!0,sidebar:"tutorialSidebar"},{path:"/guide/suggested-tags",component:f("/guide/suggested-tags","d83"),exact:!0,sidebar:"tutorialSidebar"},{path:"/tags/",component:f("/tags/","1a7"),exact:!0,sidebar:"tutorialSidebar"}]},{path:"*",component:f("*")}]},8121:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,t:()=>o});var r=n(7294);const a=r.createContext(!1);function o(e){let{children:t}=e;const[n,o]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{o(!0)}),[]),r.createElement(a.Provider,{value:n},t)}},654:(e,t,n)=>{"use strict";var r=n(7294),a=n(3935),o=n(3727),i=n(405),l=n(6136);const s=[n(4313),n(984),n(2251),n(9957),n(6930)];var u=n(997),c=n(6775),d=n(8790);function f(e){let{children:t}=e;return r.createElement(r.Fragment,null,t)}var p=n(7462),m=n(1514),g=n(9962),h=n(9524),b=n(107),v=n(5463),y=n(626),w=n(8181),k=n(246),E=n(3647);function S(){const{i18n:{defaultLocale:e,localeConfigs:t}}=(0,g.Z)(),n=(0,y.l)();return r.createElement(m.Z,null,Object.entries(t).map((e=>{let[t,{htmlLang:a}]=e;return r.createElement("link",{key:t,rel:"alternate",href:n.createUrl({locale:t,fullyQualified:!0}),hrefLang:a})})),r.createElement("link",{rel:"alternate",href:n.createUrl({locale:e,fullyQualified:!0}),hrefLang:"x-default"}))}function x(e){let{permalink:t}=e;const{siteConfig:{url:n}}=(0,g.Z)(),a=function(){const{siteConfig:{url:e}}=(0,g.Z)(),{pathname:t}=(0,c.TH)();return e+(0,h.Z)(t)}(),o=t?""+n+t:a;return r.createElement(m.Z,null,r.createElement("meta",{property:"og:url",content:o}),r.createElement("link",{rel:"canonical",href:o}))}function _(){const{i18n:{currentLocale:e}}=(0,g.Z)(),{metadata:t,image:n}=(0,b.L)();return r.createElement(r.Fragment,null,r.createElement(m.Z,null,r.createElement("meta",{name:"twitter:card",content:"summary_large_image"}),r.createElement("body",{className:w.h})),n&&r.createElement(v.d,{image:n}),r.createElement(x,null),r.createElement(S,null),r.createElement(E.Z,{tag:k.HX,locale:e}),r.createElement(m.Z,null,t.map(((e,t)=>r.createElement("meta",(0,p.Z)({key:t},e))))))}const C=new Map;function T(e){if(C.has(e.pathname))return{...e,pathname:C.get(e.pathname)};if((0,d.f)(u.Z,e.pathname).some((e=>{let{route:t}=e;return!0===t.exact})))return C.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return C.set(e.pathname,t),{...e,pathname:t}}var L=n(8121),A=n(694);function P(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r{var r,a;const o=null!=(r=null==(a=t.default)?void 0:a[e])?r:t[e];return null==o?void 0:o(...n)}));return()=>a.forEach((e=>null==e?void 0:e()))}const R=function(e){let{children:t,location:n,previousLocation:a}=e;return(0,r.useLayoutEffect)((()=>{a!==n&&(a&&function(e){const{hash:t}=e;if(t){const e=decodeURIComponent(t.substring(1)),n=document.getElementById(e);null==n||n.scrollIntoView()}else window.scrollTo(0,0)}(n),P("onRouteDidUpdate",{previousLocation:a,location:n}))}),[a,n]),t};function N(e){const t=(0,d.f)(u.Z,e);return Promise.all(t.map((e=>null==e.route.component.preload?void 0:e.route.component.preload())))}class O extends r.Component{constructor(e){super(e),this.previousLocation=void 0,this.routeUpdateCleanupCb=void 0,this.previousLocation=null,this.routeUpdateCleanupCb=l.Z.canUseDOM?P("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=P("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),N(n.pathname).then((()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})})).catch((e=>{console.warn(e),window.location.reload()})),!1}render(){const{children:e,location:t}=this.props;return r.createElement(R,{previousLocation:this.previousLocation,location:t},r.createElement(c.AW,{location:t,render:()=>e}))}}const D=O,I="docusaurus-base-url-issue-banner-container",M="docusaurus-base-url-issue-banner-suggestion-container",F="__DOCUSAURUS_INSERT_BASEURL_BANNER";function z(e){return"\nwindow['"+F+"'] = true;\n\ndocument.addEventListener('DOMContentLoaded', maybeInsertBanner);\n\nfunction maybeInsertBanner() {\n var shouldInsert = window['"+F+"'];\n shouldInsert && insertBanner();\n}\n\nfunction insertBanner() {\n var bannerContainer = document.getElementById('"+I+"');\n if (!bannerContainer) {\n return;\n }\n var bannerHtml = "+JSON.stringify(function(e){return'\n
\n

Your Docusaurus site did not load properly.

\n

A very common reason is a wrong site baseUrl configuration.

\n

Current configured baseUrl = '+e+" "+("/"===e?" (default value)":"")+'

\n

We suggest trying baseUrl =

\n
\n'}(e)).replace(/{window[F]=!1}),[]),r.createElement(r.Fragment,null,!l.Z.canUseDOM&&r.createElement(m.Z,null,r.createElement("script",null,z(e))),r.createElement("div",{id:I}))}function B(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,g.Z)(),{pathname:n}=(0,c.TH)();return t&&n===e?r.createElement(j,null):null}function U(){const{siteConfig:{favicon:e,title:t},i18n:{currentLocale:n,localeConfigs:a}}=(0,g.Z)(),o=(0,h.Z)(e),{htmlLang:i,direction:l}=a[n];return r.createElement(m.Z,null,r.createElement("html",{lang:i,dir:l}),r.createElement("title",null,t),r.createElement("meta",{property:"og:title",content:t}),e&&r.createElement("link",{rel:"icon",href:o}))}var q=n(3256);function G(){const e=(0,d.H)(u.Z),t=(0,c.TH)();return r.createElement(q.Z,null,r.createElement(A.M,null,r.createElement(L.t,null,r.createElement(f,null,r.createElement(U,null),r.createElement(_,null),r.createElement(B,null),r.createElement(D,{location:T(t)},e)))))}var $=n(6887);const H=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise(((t,n)=>{var r,a;if("undefined"==typeof document)return void n();const o=document.createElement("link");o.setAttribute("rel","prefetch"),o.setAttribute("href",e),o.onload=()=>t(),o.onerror=()=>n();const i=null!=(r=document.getElementsByTagName("head")[0])?r:null==(a=document.getElementsByName("script")[0])?void 0:a.parentNode;null==i||i.appendChild(o)}))}:function(e){return new Promise(((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)}))};var Z=n(5304);const V=new Set,W=new Set,Y=()=>{var e,t;return(null==(e=navigator.connection)?void 0:e.effectiveType.includes("2g"))||(null==(t=navigator.connection)?void 0:t.saveData)},K={prefetch(e){if(!(e=>!Y()&&!W.has(e)&&!V.has(e))(e))return!1;V.add(e);const t=(0,d.f)(u.Z,e).flatMap((e=>{return t=e.route.path,Object.entries($).filter((e=>{let[n]=e;return n.replace(/-[^-]+$/,"")===t})).flatMap((e=>{let[,t]=e;return Object.values((0,Z.Z)(t))}));var t}));return Promise.all(t.map((e=>{const t=n.gca(e);return t&&!t.includes("undefined")?H(t).catch((()=>{})):Promise.resolve()})))},preload:e=>!!(e=>!Y()&&!W.has(e))(e)&&(W.add(e),N(e))},Q=Object.freeze(K);if(l.Z.canUseDOM){window.docusaurus=Q;const e=a.hydrate;N(window.location.pathname).then((()=>{e(r.createElement(i.B6,null,r.createElement(o.VK,null,r.createElement(G,null))),document.getElementById("__docusaurus"))}))}},694:(e,t,n)=>{"use strict";n.d(t,{_:()=>c,M:()=>d});var r=n(7294),a=n(6809);const o=JSON.parse('{"docusaurus-plugin-google-gtag":{"default":{"trackingID":"G-G3P4S2WSTC","anonymizeIP":false,"id":"default"}},"docusaurus-plugin-content-docs":{"default":{"path":"/","versions":[{"name":"current","label":"Next","isLast":true,"path":"/","mainDocId":"index","docs":[{"id":"catalog/ai/compress-ml-models-for-inference","path":"/catalog/ai/compress-ml-models-for-inference","sidebar":"tutorialSidebar"},{"id":"catalog/ai/efficent-format-for-model-training","path":"/catalog/ai/efficent-format-for-model-training","sidebar":"tutorialSidebar"},{"id":"catalog/ai/energy-efficent-ai-edge","path":"/catalog/ai/energy-efficent-ai-edge","sidebar":"tutorialSidebar"},{"id":"catalog/ai/energy-efficent-framework","path":"/catalog/ai/energy-efficent-framework","sidebar":"tutorialSidebar"},{"id":"catalog/ai/energy-efficent-models","path":"/catalog/ai/energy-efficent-models","sidebar":"tutorialSidebar"},{"id":"catalog/ai/index","path":"/catalog/ai/","sidebar":"tutorialSidebar"},{"id":"catalog/ai/leverage-sustainable-regions","path":"/catalog/ai/leverage-sustainable-regions","sidebar":"tutorialSidebar"},{"id":"catalog/ai/pre-trained-transfer-learning","path":"/catalog/ai/pre-trained-transfer-learning","sidebar":"tutorialSidebar"},{"id":"catalog/ai/right-hardware-type","path":"/catalog/ai/right-hardware-type","sidebar":"tutorialSidebar"},{"id":"catalog/ai/serverless-model-development","path":"/catalog/ai/serverless-model-development","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/cache-static-data","path":"/catalog/cloud/cache-static-data","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/choose-region-closest-to-users","path":"/catalog/cloud/choose-region-closest-to-users","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/compress-transmitted-data","path":"/catalog/cloud/compress-transmitted-data","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/delete-unused-storage-resources","path":"/catalog/cloud/delete-unused-storage-resources","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/encrypt-what-is-necessary","path":"/catalog/cloud/encrypt-what-is-necessary","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/evaluate-other-cpu-architectures","path":"/catalog/cloud/evaluate-other-cpu-architectures","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/evaluate-whether-to-use-TLS-termination","path":"/catalog/cloud/evaluate-whether-to-use-TLS-termination","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/implement-stateless-design","path":"/catalog/cloud/implement-stateless-design","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/index","path":"/catalog/cloud/","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/match-slo","path":"/catalog/cloud/match-slo","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/match-utilization-requirements-of-vm","path":"/catalog/cloud/match-utilization-requirements-of-vm","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/match-utilization-requirements-with-pre-configured-server","path":"/catalog/cloud/match-utilization-requirements-with-pre-configured-server","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/minimizing-deployed-environments","path":"/catalog/cloud/minimizing-deployed-environments","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/optimise-storage-resource-utilisation","path":"/catalog/cloud/optimise-storage-resource-utilisation","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/optimize-avg-cpu-utilization","path":"/catalog/cloud/optimize-avg-cpu-utilization","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/optimize-impact-on-customer-equipment","path":"/catalog/cloud/optimize-impact-on-customer-equipment","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/optimize-peak-cpu-utilization","path":"/catalog/cloud/optimize-peak-cpu-utilization","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/queue-non-urgent-requests","path":"/catalog/cloud/queue-non-urgent-requests","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/reduce-transmitted-data","path":"/catalog/cloud/reduce-transmitted-data","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/remove-unused-assets","path":"/catalog/cloud/remove-unused-assets","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scale-down-kubernetes-workloads","path":"/catalog/cloud/scale-down-kubernetes-workloads","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scale-down-unused-applications","path":"/catalog/cloud/scale-down-unused-applications","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scale-infrastructure-with-user-load","path":"/catalog/cloud/scale-infrastructure-with-user-load","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scale-kubernetes-workloads-based-on-events","path":"/catalog/cloud/scale-kubernetes-workloads-based-on-events","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/scan-for-vulnerabilities","path":"/catalog/cloud/scan-for-vulnerabilities","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/set-retention-policy-on-storage-resources","path":"/catalog/cloud/set-retention-policy-on-storage-resources","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/shed-lower-priority-traffic","path":"/catalog/cloud/shed-lower-priority-traffic","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/time-shift-kubernetes-cron-jobs","path":"/catalog/cloud/time-shift-kubernetes-cron-jobs","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-async-instead-of-sync","path":"/catalog/cloud/use-async-instead-of-sync","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-circuit-breaker","path":"/catalog/cloud/use-circuit-breaker","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-cloud-native-network-security-tools-and-controls","path":"/catalog/cloud/use-cloud-native-network-security-tools-and-controls","sidebar":"tutorialSidebar"},{"id":"catalog/cloud/use-serverless","path":"/catalog/cloud/use-serverless","sidebar":"tutorialSidebar"},{"id":"catalog/index","path":"/catalog/","sidebar":"tutorialSidebar"},{"id":"catalog/web/avoid-chaining-critical-requests","path":"/catalog/web/avoid-chaining-critical-requests","sidebar":"tutorialSidebar"},{"id":"catalog/web/avoid-excessive-dom-size","path":"/catalog/web/avoid-excessive-dom-size","sidebar":"tutorialSidebar"},{"id":"catalog/web/avoid-tracking-unnecessary-data","path":"/catalog/web/avoid-tracking-unnecessary-data","sidebar":"tutorialSidebar"},{"id":"catalog/web/defer-offscreen-images","path":"/catalog/web/defer-offscreen-images","sidebar":"tutorialSidebar"},{"id":"catalog/web/deprecate-gifs","path":"/catalog/web/deprecate-gifs","sidebar":"tutorialSidebar"},{"id":"catalog/web/enable-text-compression","path":"/catalog/web/enable-text-compression","sidebar":"tutorialSidebar"},{"id":"catalog/web/index","path":"/catalog/web/","sidebar":"tutorialSidebar"},{"id":"catalog/web/keep-request-counts-low","path":"/catalog/web/keep-request-counts-low","sidebar":"tutorialSidebar"},{"id":"catalog/web/minify-web-assets","path":"/catalog/web/minify-web-assets","sidebar":"tutorialSidebar"},{"id":"catalog/web/minimize-main-thread-work","path":"/catalog/web/minimize-main-thread-work","sidebar":"tutorialSidebar"},{"id":"catalog/web/properly-sized-images","path":"/catalog/web/properly-sized-images","sidebar":"tutorialSidebar"},{"id":"catalog/web/remove-unused-css","path":"/catalog/web/remove-unused-css","sidebar":"tutorialSidebar"},{"id":"catalog/web/serve-images-in-modern-formats","path":"/catalog/web/serve-images-in-modern-formats","sidebar":"tutorialSidebar"},{"id":"catalog/web/use-server-side-rendering","path":"/catalog/web/use-server-side-rendering","sidebar":"tutorialSidebar"},{"id":"guide/index","path":"/guide/","sidebar":"tutorialSidebar"},{"id":"guide/initial-reviewer-guide","path":"/guide/initial-reviewer-guide","sidebar":"tutorialSidebar"},{"id":"guide/sme-reviewer-guide","path":"/guide/sme-reviewer-guide","sidebar":"tutorialSidebar"},{"id":"guide/suggested-tags","path":"/guide/suggested-tags","sidebar":"tutorialSidebar"},{"id":"index","path":"/","sidebar":"tutorialSidebar"},{"id":"tags/index","path":"/tags/","sidebar":"tutorialSidebar"}],"draftIds":[],"sidebars":{"tutorialSidebar":{"link":{"path":"/","label":"index"}}}}],"breadcrumbs":true}}}'),i=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var l=n(7529);const s=JSON.parse('{"docusaurusVersion":"2.0.1","siteVersion":"0.0.0","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"2.0.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"2.0.1"},"docusaurus-plugin-google-gtag":{"type":"package","name":"@docusaurus/plugin-google-gtag","version":"2.0.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"2.0.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"2.0.1"},"docusaurus-plugin-ideal-image":{"type":"package","name":"@docusaurus/plugin-ideal-image","version":"2.0.1"}}}'),u={siteConfig:a.Z,siteMetadata:s,globalData:o,i18n:i,codeTranslations:l},c=r.createContext(u);function d(e){let{children:t}=e;return r.createElement(c.Provider,{value:u},t)}},3256:(e,t,n)=>{"use strict";n.d(t,{Z:()=>c});var r=n(7294),a=n(6136),o=n(1514),i=n(9142);function l(e){let{error:t,tryAgain:n}=e;return r.createElement("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"center",height:"50vh",width:"100%",fontSize:"20px"}},r.createElement("h1",null,"This page crashed."),r.createElement("p",null,t.message),r.createElement("button",{type:"button",onClick:n},"Try again"))}function s(e){let{error:t,tryAgain:n}=e;return r.createElement(c,{fallback:()=>r.createElement(l,{error:t,tryAgain:n})},r.createElement(o.Z,null,r.createElement("title",null,"Page Error")),r.createElement(i.Z,null,r.createElement(l,{error:t,tryAgain:n})))}const u=e=>r.createElement(s,e);class c extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){a.Z.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){var n;const e={error:t,tryAgain:()=>this.setState({error:null})};return(null!=(n=this.props.fallback)?n:u)(e)}return null!=e?e:null}}},6136:(e,t,n)=>{"use strict";n.d(t,{Z:()=>a});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,a={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},1514:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(405);function o(e){return r.createElement(a.ql,e)}},3699:(e,t,n)=>{"use strict";n.d(t,{Z:()=>p});var r=n(7462),a=n(7294),o=n(3727),i=n(3905),l=n(9962),s=n(2735),u=n(6136);const c=a.createContext({collectLink:()=>{}});var d=n(9524);function f(e,t){var n,f;let{isNavLink:p,to:m,href:g,activeClassName:h,isActive:b,"data-noBrokenLinkCheck":v,autoAddBaseUrl:y=!0,...w}=e;const{siteConfig:{trailingSlash:k,baseUrl:E}}=(0,l.Z)(),{withBaseUrl:S}=(0,d.C)(),x=(0,a.useContext)(c),_=(0,a.useRef)(null);(0,a.useImperativeHandle)(t,(()=>_.current));const C=m||g;const T=(0,s.Z)(C),L=null==C?void 0:C.replace("pathname://","");let A=void 0!==L?(P=L,y&&(e=>e.startsWith("/"))(P)?S(P):P):void 0;var P;A&&T&&(A=(0,i.applyTrailingSlash)(A,{trailingSlash:k,baseUrl:E}));const R=(0,a.useRef)(!1),N=p?o.OL:o.rU,O=u.Z.canUseIntersectionObserver,D=(0,a.useRef)();(0,a.useEffect)((()=>(!O&&T&&null!=A&&window.docusaurus.prefetch(A),()=>{O&&D.current&&D.current.disconnect()})),[D,A,O,T]);const I=null!=(n=null==(f=A)?void 0:f.startsWith("#"))&&n,M=!A||!T||I;return M||v||x.collectLink(A),M?a.createElement("a",(0,r.Z)({ref:_,href:A},C&&!T&&{target:"_blank",rel:"noopener noreferrer"},w)):a.createElement(N,(0,r.Z)({},w,{onMouseEnter:()=>{R.current||null==A||(window.docusaurus.preload(A),R.current=!0)},innerRef:e=>{_.current=e,O&&e&&T&&(D.current=new window.IntersectionObserver((t=>{t.forEach((t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(D.current.unobserve(e),D.current.disconnect(),null!=A&&window.docusaurus.prefetch(A))}))})),D.current.observe(e))},to:A},p&&{isActive:b,activeClassName:h}))}const p=a.forwardRef(f)},7325:(e,t,n)=>{"use strict";n.d(t,{Z:()=>s,I:()=>l});var r=n(7294);function a(e,t){const n=e.split(/(\{\w+\})/).map(((e,n)=>{if(n%2==1){const n=null==t?void 0:t[e.slice(1,-1)];if(void 0!==n)return n}return e}));return n.some((e=>(0,r.isValidElement)(e)))?n.map(((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e)).filter((e=>""!==e)):n.join("")}var o=n(7529);function i(e){var t,n;let{id:r,message:a}=e;if(void 0===r&&void 0===a)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return null!=(t=null!=(n=o[null!=r?r:a])?n:a)?t:r}function l(e,t){let{message:n,id:r}=e;return a(i({message:n,id:r}),t)}function s(e){let{children:t,id:n,values:o}=e;if(t&&"string"!=typeof t)throw console.warn("Illegal children",t),new Error("The Docusaurus component only accept simple string values");const l=i({message:t,id:n});return r.createElement(r.Fragment,null,a(l,o))}},6875:(e,t,n)=>{"use strict";n.d(t,{m:()=>r});const r="default"},2735:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function a(e){return void 0!==e&&!r(e)}n.d(t,{Z:()=>a,b:()=>r})},9524:(e,t,n)=>{"use strict";n.d(t,{C:()=>o,Z:()=>i});var r=n(9962),a=n(2735);function o(){const{siteConfig:{baseUrl:e,url:t}}=(0,r.Z)();return{withBaseUrl:(n,r)=>function(e,t,n,r){let{forcePrependBaseUrl:o=!1,absolute:i=!1}=void 0===r?{}:r;if(!n||n.startsWith("#")||(0,a.b)(n))return n;if(o)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const l=n.startsWith(t)?n:t+n.replace(/^\//,"");return i?e+l:l}(t,e,n,r)}}function i(e,t){void 0===t&&(t={});const{withBaseUrl:n}=o();return n(e,t)}},9962:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(694);function o(){return(0,r.useContext)(a._)}},1048:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(8121);function o(){return(0,r.useContext)(a._)}},5304:(e,t,n)=>{"use strict";n.d(t,{Z:()=>r});function r(e){const t={};return function e(n,r){Object.entries(n).forEach((n=>{let[a,o]=n;const i=r?r+"."+a:a;var l;"object"==typeof(l=o)&&l&&Object.keys(l).length>0?e(o,i):t[i]=o}))}(e),t}},9656:(e,t,n)=>{"use strict";n.d(t,{_:()=>a,z:()=>o});var r=n(7294);const a=r.createContext(null);function o(e){let{children:t,value:n}=e;const o=r.useContext(a),i=(0,r.useMemo)((()=>function(e){let{parent:t,value:n}=e;if(!t){if(!n)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in n))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return n}const r={...t.data,...null==n?void 0:n.data};return{plugin:t.plugin,data:r}}({parent:o,value:n})),[o,n]);return r.createElement(a.Provider,{value:i},t)}},9871:(e,t,n)=>{"use strict";n.d(t,{Iw:()=>g,gA:()=>f,_r:()=>c,Jo:()=>h,zh:()=>d,yW:()=>m,gB:()=>p});var r=n(6775),a=n(9962),o=n(6875);function i(e,t){void 0===t&&(t={});const n=function(){const{globalData:e}=(0,a.Z)();return e}()[e];if(!n&&t.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin.');return n}const l=e=>e.versions.find((e=>e.isLast));function s(e,t){const n=function(e,t){const n=l(e);return[...e.versions.filter((e=>e!==n)),n].find((e=>!!(0,r.LX)(t,{path:e.path,exact:!1,strict:!1})))}(e,t),a=null==n?void 0:n.docs.find((e=>!!(0,r.LX)(t,{path:e.path,exact:!0,strict:!1})));return{activeVersion:n,activeDoc:a,alternateDocVersions:a?function(t){const n={};return e.versions.forEach((e=>{e.docs.forEach((r=>{r.id===t&&(n[e.name]=r)}))})),n}(a.id):{}}}const u={},c=()=>{var e;return null!=(e=i("docusaurus-plugin-content-docs"))?e:u},d=e=>function(e,t,n){void 0===t&&(t=o.m),void 0===n&&(n={});const r=i(e),a=null==r?void 0:r[t];if(!a&&n.failfast)throw new Error('Docusaurus plugin global data not found for "'+e+'" plugin with id "'+t+'".');return a}("docusaurus-plugin-content-docs",e,{failfast:!0});function f(e){void 0===e&&(e={});const t=c(),{pathname:n}=(0,r.TH)();return function(e,t,n){void 0===n&&(n={});const a=Object.entries(e).sort(((e,t)=>t[1].path.localeCompare(e[1].path))).find((e=>{let[,n]=e;return!!(0,r.LX)(t,{path:n.path,exact:!1,strict:!1})})),o=a?{pluginId:a[0],pluginData:a[1]}:void 0;if(!o&&n.failfast)throw new Error("Can't find active docs plugin for \""+t+'" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: '+Object.values(e).map((e=>e.path)).join(", "));return o}(t,n,e)}function p(e){return d(e).versions}function m(e){const t=d(e);return l(t)}function g(e){const t=d(e),{pathname:n}=(0,r.TH)();return s(t,n)}function h(e){const t=d(e),{pathname:n}=(0,r.TH)();return function(e,t){const n=l(e);return{latestDocSuggestion:s(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},4313:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={onRouteDidUpdate(e){let{location:t,previousLocation:n}=e;!n||t.pathname===n.pathname&&t.search===n.search&&t.hash===n.hash||setTimeout((()=>{window.gtag("event","page_view",{page_title:document.title,page_location:window.location.href,page_path:t.pathname+t.search+t.hash})}))}}},9957:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>o});var r=n(4865),a=n.n(r);a().configure({showSpinner:!1});const o={onRouteUpdate(e){let{location:t,previousLocation:n}=e;if(n&&t.pathname!==n.pathname){const e=window.setTimeout((()=>{a().start()}),200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){a().done()}}},2251:(e,t,n)=>{"use strict";n.r(t);var r=n(7410),a=n(6809);!function(e){const{themeConfig:{prism:t}}=a.Z,{additionalLanguages:r}=t;globalThis.Prism=e,r.forEach((e=>{n(6726)("./prism-"+e)})),delete globalThis.Prism}(r.Z)},4082:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294);const a="iconExternalLink_nPIU";function o(e){let{width:t=13.5,height:n=13.5}=e;return r.createElement("svg",{width:t,height:n,"aria-hidden":"true",viewBox:"0 0 24 24",className:a},r.createElement("path",{fill:"currentColor",d:"M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"}))}},9142:(e,t,n)=>{"use strict";n.d(t,{Z:()=>rt});var r=n(7294),a=n(6010),o=n(3256),i=n(5463),l=n(3702),s=n(8181),u=n(7325),c=n(6775),d=n(3266);function f(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}const p="skipToContent_fXgn";function m(){const{containerRef:e,handleSkip:t}=function(){const e=(0,r.useRef)(null),{action:t}=(0,c.k6)(),n=(0,r.useCallback)((e=>{var t;e.preventDefault();const n=null!=(t=document.querySelector("main:first-of-type"))?t:document.querySelector("."+l.k.wrapper.main);n&&f(n)}),[]);return(0,d.S)((n=>{let{location:r}=n;e.current&&!r.hash&&"PUSH"===t&&f(e.current)})),{containerRef:e,handleSkip:n}}();return r.createElement("div",{ref:e,role:"region"},r.createElement("a",{href:"#",className:p,onClick:t},r.createElement(u.Z,{id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation"},"Skip to main content")))}var g=n(107),h=n(5830),b=n(7462);function v(e){let{width:t=21,height:n=21,color:a="currentColor",strokeWidth:o=1.2,className:i,...l}=e;return r.createElement("svg",(0,b.Z)({viewBox:"0 0 15 15",width:t,height:n},l),r.createElement("g",{stroke:a,strokeWidth:o},r.createElement("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})))}const y="announcementBar_mb4j",w="announcementBarPlaceholder_vyr4",k="announcementBarClose_gvF7",E="announcementBarContent_xLdY";function S(){const{isActive:e,close:t}=(0,h.nT)(),{announcementBar:n}=(0,g.L)();if(!e)return null;const{content:o,backgroundColor:i,textColor:l,isCloseable:s}=n;return r.createElement("div",{className:y,style:{backgroundColor:i,color:l},role:"banner"},s&&r.createElement("div",{className:w}),r.createElement("div",{className:E,dangerouslySetInnerHTML:{__html:o}}),s?r.createElement("button",{type:"button",className:(0,a.Z)("clean-btn close",k),onClick:t,"aria-label":(0,u.I)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"})},r.createElement(v,{width:14,height:14,strokeWidth:3.1})):null)}var x=n(2600),_=n(2957);var C=n(3768),T=n(3086);const L=r.createContext(null);function A(e){let{children:t}=e;const n=function(){const e=(0,x.e)(),t=(0,T.HY)(),[n,a]=(0,r.useState)(!1),o=null!==t.component,i=(0,C.D9)(o);return(0,r.useEffect)((()=>{o&&!i&&a(!0)}),[o,i]),(0,r.useEffect)((()=>{o?e.shown||a(!0):a(!1)}),[e.shown,o]),(0,r.useMemo)((()=>[n,a]),[n])}();return r.createElement(L.Provider,{value:n},t)}function P(e){if(e.component){const t=e.component;return r.createElement(t,e.props)}}function R(){const e=(0,r.useContext)(L);if(!e)throw new C.i6("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,a=(0,r.useCallback)((()=>n(!1)),[n]),o=(0,T.HY)();return(0,r.useMemo)((()=>({shown:t,hide:a,content:P(o)})),[a,o,t])}function N(e){let{header:t,primaryMenu:n,secondaryMenu:o}=e;const{shown:i}=R();return r.createElement("div",{className:"navbar-sidebar"},t,r.createElement("div",{className:(0,a.Z)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":i})},r.createElement("div",{className:"navbar-sidebar__item menu"},n),r.createElement("div",{className:"navbar-sidebar__item menu"},o)))}var O=n(9200),D=n(1048);function I(e){return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"}))}function M(e){return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:24,height:24},e),r.createElement("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"}))}const F={toggle:"toggle_vylO",toggleButton:"toggleButton_gllP",darkToggleIcon:"darkToggleIcon_wfgR",lightToggleIcon:"lightToggleIcon_pyhR",toggleButtonDisabled:"toggleButtonDisabled_aARS"};function z(e){let{className:t,value:n,onChange:o}=e;const i=(0,D.Z)(),l=(0,u.I)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the navbar color mode toggle"},{mode:"dark"===n?(0,u.I)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"}):(0,u.I)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"})});return r.createElement("div",{className:(0,a.Z)(F.toggle,t)},r.createElement("button",{className:(0,a.Z)("clean-btn",F.toggleButton,!i&&F.toggleButtonDisabled),type:"button",onClick:()=>o("dark"===n?"light":"dark"),disabled:!i,title:l,"aria-label":l},r.createElement(I,{className:(0,a.Z)(F.toggleIcon,F.lightToggleIcon)}),r.createElement(M,{className:(0,a.Z)(F.toggleIcon,F.darkToggleIcon)})))}const j=r.memo(z);function B(e){let{className:t}=e;const n=(0,g.L)().colorMode.disableSwitch,{colorMode:a,setColorMode:o}=(0,O.I)();return n?null:r.createElement(j,{className:t,value:a,onChange:o})}var U=n(6811);function q(){return r.createElement(U.Z,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function G(){const e=(0,x.e)();return r.createElement("button",{type:"button",className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle()},r.createElement(v,{color:"var(--ifm-color-emphasis-600)"}))}function $(){return r.createElement("div",{className:"navbar-sidebar__brand"},r.createElement(q,null),r.createElement(B,{className:"margin-right--md"}),r.createElement(G,null))}var H=n(3699),Z=n(9524),V=n(2735);function W(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}var Y=n(4082);function K(e){let{activeBasePath:t,activeBaseRegex:n,to:a,href:o,label:i,html:l,isDropdownLink:s,prependBaseUrlToHref:u,...c}=e;const d=(0,Z.Z)(a),f=(0,Z.Z)(t),p=(0,Z.Z)(o,{forcePrependBaseUrl:!0}),m=i&&o&&!(0,V.Z)(o),g=l?{dangerouslySetInnerHTML:{__html:l}}:{children:r.createElement(r.Fragment,null,i,m&&r.createElement(Y.Z,s&&{width:12,height:12}))};return o?r.createElement(H.Z,(0,b.Z)({href:u?p:o},c,g)):r.createElement(H.Z,(0,b.Z)({to:d,isNavLink:!0},(t||n)&&{isActive:(e,t)=>n?W(n,t.pathname):t.pathname.startsWith(f)},c,g))}function Q(e){let{className:t,isDropdownItem:n=!1,...o}=e;const i=r.createElement(K,(0,b.Z)({className:(0,a.Z)(n?"dropdown__link":"navbar__item navbar__link",t),isDropdownLink:n},o));return n?r.createElement("li",null,i):i}function X(e){let{className:t,isDropdownItem:n,...o}=e;return r.createElement("li",{className:"menu__list-item"},r.createElement(K,(0,b.Z)({className:(0,a.Z)("menu__link",t)},o)))}function J(e){var t;let{mobile:n=!1,position:a,...o}=e;const i=n?X:Q;return r.createElement(i,(0,b.Z)({},o,{activeClassName:null!=(t=o.activeClassName)?t:n?"menu__link--active":"navbar__link--active"}))}var ee=n(4639),te=n(9003),ne=n(9962);function re(e,t){return e.some((e=>function(e,t){return!!(0,te.Mg)(e.to,t)||!!W(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t)))}function ae(e){var t;let{items:n,position:o,className:i,onClick:l,...s}=e;const u=(0,r.useRef)(null),[c,d]=(0,r.useState)(!1);return(0,r.useEffect)((()=>{const e=e=>{u.current&&!u.current.contains(e.target)&&d(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e)}}),[u]),r.createElement("div",{ref:u,className:(0,a.Z)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===o,"dropdown--show":c})},r.createElement(K,(0,b.Z)({"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,a.Z)("navbar__link",i)},s,{onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),d(!c))}}),null!=(t=s.children)?t:s.label),r.createElement("ul",{className:"dropdown__menu"},n.map(((e,t)=>r.createElement(ve,(0,b.Z)({isDropdownItem:!0,onKeyDown:e=>{if(t===n.length-1&&"Tab"===e.key){e.preventDefault(),d(!1);const t=u.current.nextElementSibling;if(t){(t instanceof HTMLAnchorElement?t:t.querySelector("a")).focus()}}},activeClassName:"dropdown__link--active"},e,{key:t}))))))}function oe(e){var t;let{items:n,className:o,position:i,onClick:l,...s}=e;const u=function(){const{siteConfig:{baseUrl:e}}=(0,ne.Z)(),{pathname:t}=(0,c.TH)();return t.replace(e,"/")}(),d=re(n,u),{collapsed:f,toggleCollapsed:p,setCollapsed:m}=(0,ee.u)({initialState:()=>!d});return(0,r.useEffect)((()=>{d&&m(!d)}),[u,d,m]),r.createElement("li",{className:(0,a.Z)("menu__list-item",{"menu__list-item--collapsed":f})},r.createElement(K,(0,b.Z)({role:"button",className:(0,a.Z)("menu__link menu__link--sublist menu__link--sublist-caret",o)},s,{onClick:e=>{e.preventDefault(),p()}}),null!=(t=s.children)?t:s.label),r.createElement(ee.z,{lazy:!0,as:"ul",className:"menu__list",collapsed:f},n.map(((e,t)=>r.createElement(ve,(0,b.Z)({mobile:!0,isDropdownItem:!0,onClick:l,activeClassName:"menu__link--active"},e,{key:t}))))))}function ie(e){let{mobile:t=!1,...n}=e;const a=t?oe:ae;return r.createElement(a,n)}var le=n(626);function se(e){let{width:t=20,height:n=20,...a}=e;return r.createElement("svg",(0,b.Z)({viewBox:"0 0 24 24",width:t,height:n,"aria-hidden":!0},a),r.createElement("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"}))}const ue="iconLanguage_nlXk";const ce=()=>null,de="searchBox_ZlJk";function fe(e){let{children:t,className:n}=e;return r.createElement("div",{className:(0,a.Z)(n,de)},t)}var pe=n(9871),me=n(3734);var ge=n(6409);const he=e=>e.docs.find((t=>t.id===e.mainDocId));const be={default:J,localeDropdown:function(e){let{mobile:t,dropdownItemsBefore:n,dropdownItemsAfter:a,...o}=e;const{i18n:{currentLocale:i,locales:l,localeConfigs:s}}=(0,ne.Z)(),c=(0,le.l)(),d=[...n,...l.map((e=>{const n="pathname://"+c.createUrl({locale:e,fullyQualified:!1});return{label:s[e].label,to:n,target:"_self",autoAddBaseUrl:!1,className:e===i?t?"menu__link--active":"dropdown__link--active":""}})),...a],f=t?(0,u.I)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):s[i].label;return r.createElement(ie,(0,b.Z)({},o,{mobile:t,label:r.createElement(r.Fragment,null,r.createElement(se,{className:ue}),f),items:d}))},search:function(e){let{mobile:t,className:n}=e;return t?null:r.createElement(fe,{className:n},r.createElement(ce,null))},dropdown:ie,html:function(e){let{value:t,className:n,mobile:o=!1,isDropdownItem:i=!1}=e;const l=i?"li":"div";return r.createElement(l,{className:(0,a.Z)({navbar__item:!o&&!i,"menu__list-item":o},n),dangerouslySetInnerHTML:{__html:t}})},doc:function(e){let{docId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,pe.Iw)(a),l=(0,me.vY)(t,a);return null===l?null:r.createElement(J,(0,b.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.path)===l.path||!(null==i||!i.sidebar)&&i.sidebar===l.sidebar,label:null!=n?n:l.id,to:l.path}))},docSidebar:function(e){let{sidebarId:t,label:n,docsPluginId:a,...o}=e;const{activeDoc:i}=(0,pe.Iw)(a),l=(0,me.oz)(t,a).link;if(!l)throw new Error('DocSidebarNavbarItem: Sidebar with ID "'+t+"\" doesn't have anything to be linked to.");return r.createElement(J,(0,b.Z)({exact:!0},o,{isActive:()=>(null==i?void 0:i.sidebar)===t,label:null!=n?n:l.label,to:l.path}))},docsVersion:function(e){let{label:t,to:n,docsPluginId:a,...o}=e;const i=(0,me.lO)(a)[0],l=null!=t?t:i.label,s=null!=n?n:(e=>e.docs.find((t=>t.id===e.mainDocId)))(i).path;return r.createElement(J,(0,b.Z)({},o,{label:l,to:s}))},docsVersionDropdown:function(e){let{mobile:t,docsPluginId:n,dropdownActiveClassDisabled:a,dropdownItemsBefore:o,dropdownItemsAfter:i,...l}=e;const s=(0,pe.Iw)(n),c=(0,pe.gB)(n),{savePreferredVersionName:d}=(0,ge.J)(n),f=[...o,...c.map((e=>{var t;const n=null!=(t=s.alternateDocVersions[e.name])?t:he(e);return{label:e.label,to:n.path,isActive:()=>e===s.activeVersion,onClick:()=>d(e.name)}})),...i],p=(0,me.lO)(n)[0],m=t&&f.length>1?(0,u.I)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):p.label,g=t&&f.length>1?void 0:he(p).path;return f.length<=1?r.createElement(J,(0,b.Z)({},l,{mobile:t,label:m,to:g,isActive:a?()=>!1:void 0})):r.createElement(ie,(0,b.Z)({},l,{mobile:t,label:m,to:g,items:f,isActive:a?()=>!1:void 0}))}};function ve(e){let{type:t,...n}=e;const a=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(t,n),o=be[a];if(!o)throw new Error('No NavbarItem component found for type "'+t+'".');return r.createElement(o,n)}function ye(){const e=(0,x.e)(),t=(0,g.L)().navbar.items;return r.createElement("ul",{className:"menu__list"},t.map(((t,n)=>r.createElement(ve,(0,b.Z)({mobile:!0},t,{onClick:()=>e.toggle(),key:n})))))}function we(e){return r.createElement("button",(0,b.Z)({},e,{type:"button",className:"clean-btn navbar-sidebar__back"}),r.createElement(u.Z,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)"},"\u2190 Back to main menu"))}function ke(){const e=0===(0,g.L)().navbar.items.length,t=R();return r.createElement(r.Fragment,null,!e&&r.createElement(we,{onClick:()=>t.hide()}),t.content)}function Ee(){const e=(0,x.e)();var t;return void 0===(t=e.shown)&&(t=!0),(0,r.useEffect)((()=>(document.body.style.overflow=t?"hidden":"visible",()=>{document.body.style.overflow="visible"})),[t]),e.shouldRender?r.createElement(N,{header:r.createElement($,null),primaryMenu:r.createElement(ye,null),secondaryMenu:r.createElement(ke,null)}):null}const Se="navbarHideable_m1mJ",xe="navbarHidden_jGov";function _e(e){return r.createElement("div",(0,b.Z)({role:"presentation"},e,{className:(0,a.Z)("navbar-sidebar__backdrop",e.className)}))}function Ce(e){let{children:t}=e;const{navbar:{hideOnScroll:n,style:o}}=(0,g.L)(),i=(0,x.e)(),{navbarRef:l,isNavbarVisible:s}=function(e){const[t,n]=(0,r.useState)(e),a=(0,r.useRef)(!1),o=(0,r.useRef)(0),i=(0,r.useCallback)((e=>{null!==e&&(o.current=e.getBoundingClientRect().height)}),[]);return(0,_.RF)(((t,r)=>{let{scrollY:i}=t;if(!e)return;if(i=l?n(!1):i+u{if(e)return t.location.hash?(a.current=!0,void n(!1)):void n(!0)})),{navbarRef:i,isNavbarVisible:t}}(n);return r.createElement("nav",{ref:l,className:(0,a.Z)("navbar","navbar--fixed-top",n&&[Se,!s&&xe],{"navbar--dark":"dark"===o,"navbar--primary":"primary"===o,"navbar-sidebar--show":i.shown})},t,r.createElement(_e,{onClick:i.toggle}),r.createElement(Ee,null))}function Te(e){let{width:t=30,height:n=30,className:a,...o}=e;return r.createElement("svg",(0,b.Z)({className:a,width:t,height:n,viewBox:"0 0 30 30","aria-hidden":"true"},o),r.createElement("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"}))}function Le(){const e=(0,x.e)();return r.createElement("button",{onClick:e.toggle,onKeyDown:e.toggle,"aria-label":"Navigation bar toggle",className:"navbar__toggle clean-btn",type:"button",tabIndex:0},r.createElement(Te,null))}const Ae="colorModeToggle_DEke";function Pe(e){let{items:t}=e;return r.createElement(r.Fragment,null,t.map(((e,t)=>r.createElement(ve,(0,b.Z)({},e,{key:t})))))}function Re(e){let{left:t,right:n}=e;return r.createElement("div",{className:"navbar__inner"},r.createElement("div",{className:"navbar__items"},t),r.createElement("div",{className:"navbar__items navbar__items--right"},n))}function Ne(){const e=(0,x.e)(),t=(0,g.L)().navbar.items,[n,a]=function(e){function t(e){var t;return"left"===(null!=(t=e.position)?t:"right")}return[e.filter(t),e.filter((e=>!t(e)))]}(t),o=t.find((e=>"search"===e.type));return r.createElement(Re,{left:r.createElement(r.Fragment,null,!e.disabled&&r.createElement(Le,null),r.createElement(q,null),r.createElement(Pe,{items:n})),right:r.createElement(r.Fragment,null,r.createElement(Pe,{items:a}),r.createElement(B,{className:Ae}),!o&&r.createElement(fe,null,r.createElement(ce,null)))})}function Oe(){return r.createElement(Ce,null,r.createElement(Ne,null))}function De(e){let{item:t}=e;const{to:n,href:a,label:o,prependBaseUrlToHref:i,...l}=t,s=(0,Z.Z)(n),u=(0,Z.Z)(a,{forcePrependBaseUrl:!0});return r.createElement(H.Z,(0,b.Z)({className:"footer__link-item"},a?{href:i?u:a}:{to:s},l),o,a&&!(0,V.Z)(a)&&r.createElement(Y.Z,null))}function Ie(e){var t;let{item:n}=e;return n.html?r.createElement("li",{className:"footer__item",dangerouslySetInnerHTML:{__html:n.html}}):r.createElement("li",{key:null!=(t=n.href)?t:n.to,className:"footer__item"},r.createElement(De,{item:n}))}function Me(e){let{column:t}=e;return r.createElement("div",{className:"col footer__col"},r.createElement("div",{className:"footer__title"},t.title),r.createElement("ul",{className:"footer__items clean-list"},t.items.map(((e,t)=>r.createElement(Ie,{key:t,item:e})))))}function Fe(e){let{columns:t}=e;return r.createElement("div",{className:"row footer__links"},t.map(((e,t)=>r.createElement(Me,{key:t,column:e}))))}function ze(){return r.createElement("span",{className:"footer__link-separator"},"\xb7")}function je(e){let{item:t}=e;return t.html?r.createElement("span",{className:"footer__link-item",dangerouslySetInnerHTML:{__html:t.html}}):r.createElement(De,{item:t})}function Be(e){let{links:t}=e;return r.createElement("div",{className:"footer__links text--center"},r.createElement("div",{className:"footer__links"},t.map(((e,n)=>r.createElement(r.Fragment,{key:n},r.createElement(je,{item:e}),t.length!==n+1&&r.createElement(ze,null))))))}function Ue(e){let{links:t}=e;return function(e){return"title"in e[0]}(t)?r.createElement(Fe,{columns:t}):r.createElement(Be,{links:t})}var qe=n(7909);const Ge="footerLogoLink_BH7S";function $e(e){var t;let{logo:n}=e;const{withBaseUrl:o}=(0,Z.C)(),i={light:o(n.src),dark:o(null!=(t=n.srcDark)?t:n.src)};return r.createElement(qe.Z,{className:(0,a.Z)("footer__logo",n.className),alt:n.alt,sources:i,width:n.width,height:n.height,style:n.style})}function He(e){let{logo:t}=e;return t.href?r.createElement(H.Z,{href:t.href,className:Ge,target:t.target},r.createElement($e,{logo:t})):r.createElement($e,{logo:t})}function Ze(e){let{copyright:t}=e;return r.createElement("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:t}})}function Ve(e){let{style:t,links:n,logo:o,copyright:i}=e;return r.createElement("footer",{className:(0,a.Z)("footer",{"footer--dark":"dark"===t})},r.createElement("div",{className:"container container-fluid"},n,(o||i)&&r.createElement("div",{className:"footer__bottom text--center"},o&&r.createElement("div",{className:"margin-bottom--sm"},o),i)))}function We(){const{footer:e}=(0,g.L)();if(!e)return null;const{copyright:t,links:n,logo:a,style:o}=e;return r.createElement(Ve,{style:o,links:n&&n.length>0&&r.createElement(Ue,{links:n}),logo:a&&r.createElement(He,{logo:a}),copyright:t&&r.createElement(Ze,{copyright:t})})}const Ye=r.memo(We);var Ke=n(2560);const Qe="docusaurus.tab.",Xe=r.createContext(void 0);const Je=(0,C.Qc)([O.S,h.pl,function(e){let{children:t}=e;const n=function(){const[e,t]=(0,r.useState)({}),n=(0,r.useCallback)(((e,t)=>{(0,Ke.W)("docusaurus.tab."+e).set(t)}),[]);(0,r.useEffect)((()=>{try{const e={};(0,Ke._)().forEach((t=>{if(t.startsWith(Qe)){const n=t.substring(Qe.length);e[n]=(0,Ke.W)(t).get()}})),t(e)}catch(e){console.error(e)}}),[]);const a=(0,r.useCallback)(((e,r)=>{t((t=>({...t,[e]:r}))),n(e,r)}),[n]);return(0,r.useMemo)((()=>({tabGroupChoices:e,setTabGroupChoices:a})),[e,a])}();return r.createElement(Xe.Provider,{value:n},t)},_.OC,ge.L5,i.VC,function(e){let{children:t}=e;return r.createElement(T.n2,null,r.createElement(x.M,null,r.createElement(A,null,t)))}]);function et(e){let{children:t}=e;return r.createElement(Je,null,t)}function tt(e){let{error:t,tryAgain:n}=e;return r.createElement("main",{className:"container margin-vert--xl"},r.createElement("div",{className:"row"},r.createElement("div",{className:"col col--6 col--offset-3"},r.createElement("h1",{className:"hero__title"},r.createElement(u.Z,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed"},"This page crashed.")),r.createElement("p",null,t.message),r.createElement("div",null,r.createElement("button",{type:"button",onClick:n},r.createElement(u.Z,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again when the page crashed"},"Try again"))))))}const nt="mainWrapper_z2l0";function rt(e){const{children:t,noFooter:n,wrapperClassName:u,title:c,description:d}=e;return(0,s.t)(),r.createElement(et,null,r.createElement(i.d,{title:c,description:d}),r.createElement(m,null),r.createElement(S,null),r.createElement(Oe,null),r.createElement("div",{className:(0,a.Z)(l.k.wrapper.main,nt,u)},r.createElement(o.Z,{fallback:e=>r.createElement(tt,e)},t)),!n&&r.createElement(Ye,null))}},6811:(e,t,n)=>{"use strict";n.d(t,{Z:()=>d});var r=n(7462),a=n(7294),o=n(3699),i=n(9524),l=n(9962),s=n(107),u=n(7909);function c(e){let{logo:t,alt:n,imageClassName:r}=e;const o={light:(0,i.Z)(t.src),dark:(0,i.Z)(t.srcDark||t.src)},l=a.createElement(u.Z,{className:t.className,sources:o,height:t.height,width:t.width,alt:n,style:t.style});return r?a.createElement("div",{className:r},l):l}function d(e){var t;const{siteConfig:{title:n}}=(0,l.Z)(),{navbar:{title:u,logo:d}}=(0,s.L)(),{imageClassName:f,titleClassName:p,...m}=e,g=(0,i.Z)((null==d?void 0:d.href)||"/"),h=u?"":n,b=null!=(t=null==d?void 0:d.alt)?t:h;return a.createElement(o.Z,(0,r.Z)({to:g},m,(null==d?void 0:d.target)&&{target:d.target}),d&&a.createElement(c,{logo:d,alt:b,imageClassName:f}),null!=u&&a.createElement("b",{className:p},u))}},3647:(e,t,n)=>{"use strict";n.d(t,{Z:()=>o});var r=n(7294),a=n(1514);function o(e){let{locale:t,version:n,tag:o}=e;const i=t;return r.createElement(a.Z,null,t&&r.createElement("meta",{name:"docusaurus_locale",content:t}),n&&r.createElement("meta",{name:"docusaurus_version",content:n}),o&&r.createElement("meta",{name:"docusaurus_tag",content:o}),i&&r.createElement("meta",{name:"docsearch:language",content:i}),n&&r.createElement("meta",{name:"docsearch:version",content:n}),o&&r.createElement("meta",{name:"docsearch:docusaurus_tag",content:o}))}},7909:(e,t,n)=>{"use strict";n.d(t,{Z:()=>u});var r=n(7462),a=n(7294),o=n(6010),i=n(1048),l=n(9200);const s={themedImage:"themedImage_ToTc","themedImage--light":"themedImage--light_HNdA","themedImage--dark":"themedImage--dark_i4oU"};function u(e){const t=(0,i.Z)(),{colorMode:n}=(0,l.I)(),{sources:u,className:c,alt:d,...f}=e,p=t?"dark"===n?["dark"]:["light"]:["light","dark"];return a.createElement(a.Fragment,null,p.map((e=>a.createElement("img",(0,r.Z)({key:e,src:u[e],alt:d,className:(0,o.Z)(s.themedImage,s["themedImage--"+e],c)},f)))))}},4639:(e,t,n)=>{"use strict";n.d(t,{u:()=>i,z:()=>m});var r=n(7462),a=n(7294),o=n(6136);function i(e){let{initialState:t}=e;const[n,r]=(0,a.useState)(null!=t&&t),o=(0,a.useCallback)((()=>{r((e=>!e))}),[]);return{collapsed:n,setCollapsed:r,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},s={display:"block",overflow:"visible",height:"auto"};function u(e,t){const n=t?l:s;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function c(e){let{collapsibleRef:t,collapsed:n,animation:r}=e;const o=(0,a.useRef)(!1);(0,a.useEffect)((()=>{const e=t.current;function a(){var t,n;const a=e.scrollHeight,o=null!=(t=null==r?void 0:r.duration)?t:function(e){const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(a);return{transition:"height "+o+"ms "+(null!=(n=null==r?void 0:r.easing)?n:"ease-in-out"),height:a+"px"}}function i(){const t=a();e.style.transition=t.transition,e.style.height=t.height}if(!o.current)return u(e,n),void(o.current=!0);return e.style.willChange="height",function(){const t=requestAnimationFrame((()=>{n?(i(),requestAnimationFrame((()=>{e.style.height=l.height,e.style.overflow=l.overflow}))):(e.style.display="block",requestAnimationFrame((()=>{i()})))}));return()=>cancelAnimationFrame(t)}()}),[t,n,r])}function d(e){if(!o.Z.canUseDOM)return e?l:s}function f(e){let{as:t="div",collapsed:n,children:r,animation:o,onCollapseTransitionEnd:i,className:l,disableSSRStyle:s}=e;const f=(0,a.useRef)(null);return c({collapsibleRef:f,collapsed:n,animation:o}),a.createElement(t,{ref:f,style:s?void 0:d(n),onTransitionEnd:e=>{"height"===e.propertyName&&(u(f.current,n),null==i||i(n))},className:l},r)}function p(e){let{collapsed:t,...n}=e;const[o,i]=(0,a.useState)(!t),[l,s]=(0,a.useState)(t);return(0,a.useLayoutEffect)((()=>{t||i(!0)}),[t]),(0,a.useLayoutEffect)((()=>{o&&s(t)}),[o,t]),o?a.createElement(f,(0,r.Z)({},n,{collapsed:l})):null}function m(e){let{lazy:t,...n}=e;const r=t?p:f;return a.createElement(r,n)}},5830:(e,t,n)=>{"use strict";n.d(t,{nT:()=>m,pl:()=>p});var r=n(7294),a=n(1048),o=n(2560),i=n(3768),l=n(107);const s=(0,o.W)("docusaurus.announcement.dismiss"),u=(0,o.W)("docusaurus.announcement.id"),c=()=>"true"===s.get(),d=e=>s.set(String(e)),f=r.createContext(null);function p(e){let{children:t}=e;const n=function(){const{announcementBar:e}=(0,l.L)(),t=(0,a.Z)(),[n,o]=(0,r.useState)((()=>!!t&&c()));(0,r.useEffect)((()=>{o(c())}),[]);const i=(0,r.useCallback)((()=>{d(!0),o(!0)}),[]);return(0,r.useEffect)((()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&d(!1),!r&&c()||o(!1)}),[e]),(0,r.useMemo)((()=>({isActive:!!e&&!n,close:i})),[e,n,i])}();return r.createElement(f.Provider,{value:n},t)}function m(){const e=(0,r.useContext)(f);if(!e)throw new i.i6("AnnouncementBarProvider");return e}},9200:(e,t,n)=>{"use strict";n.d(t,{I:()=>h,S:()=>g});var r=n(7294),a=n(6136),o=n(3768),i=n(2560),l=n(107);const s=r.createContext(void 0),u="theme",c=(0,i.W)(u),d="light",f="dark",p=e=>e===f?f:d;function m(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,l.L)(),[o,i]=(0,r.useState)((e=>a.Z.canUseDOM?p(document.documentElement.getAttribute("data-theme")):p(e))(e));(0,r.useEffect)((()=>{t&&c.del()}),[t]);const s=(0,r.useCallback)((function(t,r){void 0===r&&(r={});const{persist:a=!0}=r;t?(i(t),a&&(e=>{c.set(p(e))})(t)):(i(n?window.matchMedia("(prefers-color-scheme: dark)").matches?f:d:e),c.del())}),[n,e]);(0,r.useEffect)((()=>{document.documentElement.setAttribute("data-theme",p(o))}),[o]),(0,r.useEffect)((()=>{if(t)return;const e=e=>{if(e.key!==u)return;const t=c.get();null!==t&&s(p(t))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)}),[t,s]);const m=(0,r.useRef)(!1);return(0,r.useEffect)((()=>{if(t&&!n)return;const e=window.matchMedia("(prefers-color-scheme: dark)"),r=()=>{window.matchMedia("print").matches||m.current?m.current=window.matchMedia("print").matches:s(null)};return e.addListener(r),()=>e.removeListener(r)}),[s,t,n]),(0,r.useMemo)((()=>({colorMode:o,setColorMode:s,get isDarkTheme(){return o===f},setLightTheme(){s(d)},setDarkTheme(){s(f)}})),[o,s])}function g(e){let{children:t}=e;const n=m();return r.createElement(s.Provider,{value:n},t)}function h(){const e=(0,r.useContext)(s);if(null==e)throw new o.i6("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},6409:(e,t,n)=>{"use strict";n.d(t,{J:()=>y,L5:()=>b});var r=n(7294),a=n(9871),o=n(6875),i=n(107),l=n(3734),s=n(3768),u=n(2560);const c=e=>"docs-preferred-version-"+e,d=(e,t,n)=>{(0,u.W)(c(e),{persistence:t}).set(n)},f=(e,t)=>(0,u.W)(c(e),{persistence:t}).get(),p=(e,t)=>{(0,u.W)(c(e),{persistence:t}).del()};const m=r.createContext(null);function g(){const e=(0,a._r)(),t=(0,i.L)().docs.versionPersistence,n=(0,r.useMemo)((()=>Object.keys(e)),[e]),[o,l]=(0,r.useState)((()=>(e=>Object.fromEntries(e.map((e=>[e,{preferredVersionName:null}]))))(n)));(0,r.useEffect)((()=>{l(function(e){let{pluginIds:t,versionPersistence:n,allDocsData:r}=e;function a(e){const t=f(e,n);return r[e].versions.some((e=>e.name===t))?{preferredVersionName:t}:(p(e,n),{preferredVersionName:null})}return Object.fromEntries(t.map((e=>[e,a(e)])))}({allDocsData:e,versionPersistence:t,pluginIds:n}))}),[e,t,n]);return[o,(0,r.useMemo)((()=>({savePreferredVersion:function(e,n){d(e,t,n),l((t=>({...t,[e]:{preferredVersionName:n}})))}})),[t])]}function h(e){let{children:t}=e;const n=g();return r.createElement(m.Provider,{value:n},t)}function b(e){let{children:t}=e;return l.cE?r.createElement(h,null,t):r.createElement(r.Fragment,null,t)}function v(){const e=(0,r.useContext)(m);if(!e)throw new s.i6("DocsPreferredVersionContextProvider");return e}function y(e){var t;void 0===e&&(e=o.m);const n=(0,a.zh)(e),[i,l]=v(),{preferredVersionName:s}=i[e];return{preferredVersion:null!=(t=n.versions.find((e=>e.name===s)))?t:null,savePreferredVersionName:(0,r.useCallback)((t=>{l.savePreferredVersion(e,t)}),[l,e])}}},4432:(e,t,n)=>{"use strict";n.d(t,{V:()=>s,b:()=>l});var r=n(7294),a=n(3768);const o=Symbol("EmptyContext"),i=r.createContext(o);function l(e){let{children:t,name:n,items:a}=e;const o=(0,r.useMemo)((()=>n&&a?{name:n,items:a}:null),[n,a]);return r.createElement(i.Provider,{value:o},t)}function s(){const e=(0,r.useContext)(i);if(e===o)throw new a.i6("DocsSidebarProvider");return e}},2600:(e,t,n)=>{"use strict";n.d(t,{M:()=>f,e:()=>p});var r=n(7294),a=n(3086),o=n(3488),i=n(6775),l=n(3768);function s(e){!function(e){const t=(0,i.k6)(),n=(0,l.zX)(e);(0,r.useEffect)((()=>t.block(((e,t)=>n(e,t)))),[t,n])}(((t,n)=>{if("POP"===n)return e(t,n)}))}var u=n(107);const c=r.createContext(void 0);function d(){const e=function(){const e=(0,a.HY)(),{items:t}=(0,u.L)().navbar;return 0===t.length&&!e.component}(),t=(0,o.i)(),n=!e&&"mobile"===t,[i,l]=(0,r.useState)(!1);s((()=>{if(i)return l(!1),!1}));const c=(0,r.useCallback)((()=>{l((e=>!e))}),[]);return(0,r.useEffect)((()=>{"desktop"===t&&l(!1)}),[t]),(0,r.useMemo)((()=>({disabled:e,shouldRender:n,toggle:c,shown:i})),[e,n,c,i])}function f(e){let{children:t}=e;const n=d();return r.createElement(c.Provider,{value:n},t)}function p(){const e=r.useContext(c);if(void 0===e)throw new l.i6("NavbarMobileSidebarProvider");return e}},3086:(e,t,n)=>{"use strict";n.d(t,{HY:()=>l,Zo:()=>s,n2:()=>i});var r=n(7294),a=n(3768);const o=r.createContext(null);function i(e){let{children:t}=e;const n=(0,r.useState)({component:null,props:null});return r.createElement(o.Provider,{value:n},t)}function l(){const e=(0,r.useContext)(o);if(!e)throw new a.i6("NavbarSecondaryMenuContentProvider");return e[0]}function s(e){let{component:t,props:n}=e;const i=(0,r.useContext)(o);if(!i)throw new a.i6("NavbarSecondaryMenuContentProvider");const[,l]=i,s=(0,a.Ql)(n);return(0,r.useEffect)((()=>{l({component:t,props:s})}),[l,t,s]),(0,r.useEffect)((()=>()=>l({component:null,props:null})),[l]),null}},8181:(e,t,n)=>{"use strict";n.d(t,{h:()=>a,t:()=>o});var r=n(7294);const a="navigation-with-keyboard";function o(){(0,r.useEffect)((()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(a),"mousedown"===e.type&&document.body.classList.remove(a)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(a),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}}),[])}},3488:(e,t,n)=>{"use strict";n.d(t,{i:()=>u});var r=n(7294),a=n(6136);const o="desktop",i="mobile",l="ssr";function s(){return a.Z.canUseDOM?window.innerWidth>996?o:i:l}function u(){const[e,t]=(0,r.useState)((()=>s()));return(0,r.useEffect)((()=>{function e(){t(s())}return window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e),clearTimeout(undefined)}}),[]),e}},3702:(e,t,n)=>{"use strict";n.d(t,{k:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",admonitionType:e=>"theme-admonition-"+e},layout:{},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>"theme-doc-sidebar-item-category-level-"+e,docSidebarItemLinkLevel:e=>"theme-doc-sidebar-item-link-level-"+e},blog:{}}},3734:(e,t,n)=>{"use strict";n.d(t,{Wl:()=>f,_F:()=>m,cE:()=>d,hI:()=>y,lO:()=>h,vY:()=>v,oz:()=>b,s1:()=>g});var r=n(7294),a=n(6775),o=n(8790),i=n(9871),l=n(6409),s=n(4432);function u(e){return Array.from(new Set(e))}var c=n(9003);const d=!!i._r;function f(e){if(e.href)return e.href;for(const t of e.items){if("link"===t.type)return t.href;if("category"===t.type){const e=f(t);if(e)return e}}}const p=(e,t)=>void 0!==e&&(0,c.Mg)(e,t);function m(e,t){return"link"===e.type?p(e.href,t):"category"===e.type&&(p(e.href,t)||((e,t)=>e.some((e=>m(e,t))))(e.items,t))}function g(){var e;const t=(0,s.V)(),{pathname:n}=(0,a.TH)();if(!1===(null==(e=(0,i.gA)())?void 0:e.pluginData.breadcrumbs)||!t)return null;const r=[];return function e(t){for(const a of t)if("category"===a.type&&((0,c.Mg)(a.href,n)||e(a.items))||"link"===a.type&&(0,c.Mg)(a.href,n))return r.push(a),!0;return!1}(t.items),r.reverse()}function h(e){const{activeVersion:t}=(0,i.Iw)(e),{preferredVersion:n}=(0,l.J)(e),a=(0,i.yW)(e);return(0,r.useMemo)((()=>u([t,n,a].filter(Boolean))),[t,n,a])}function b(e,t){const n=h(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.sidebars?Object.entries(e.sidebars):[])),r=t.find((t=>t[0]===e));if(!r)throw new Error("Can't find any sidebar with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\n Available sidebar ids are:\n - '+Object.keys(t).join("\n- "));return r[1]}),[e,n])}function v(e,t){const n=h(t);return(0,r.useMemo)((()=>{const t=n.flatMap((e=>e.docs)),r=t.find((t=>t.id===e));if(!r){if(n.flatMap((e=>e.draftIds)).includes(e))return null;throw new Error("DocNavbarItem: couldn't find any doc with id \""+e+'" in version'+(n.length>1?"s":"")+" "+n.map((e=>e.name)).join(", ")+'".\nAvailable doc ids are:\n- '+u(t.map((e=>e.id))).join("\n- "))}return r}),[e,n])}function y(e){let{route:t,versionMetadata:n}=e;const r=(0,a.TH)(),i=t.routes,l=i.find((e=>(0,a.LX)(r.pathname,e)));if(!l)return null;const s=l.sidebar,u=s?n.docsSidebars[s]:void 0;return{docElement:(0,o.H)(i),sidebarName:s,sidebarItems:u}}},5463:(e,t,n)=>{"use strict";n.d(t,{FG:()=>f,d:()=>c,VC:()=>p});var r=n(7294),a=n(6010),o=n(1514),i=n(9656);function l(){const e=r.useContext(i._);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}var s=n(9524),u=n(9962);function c(e){let{title:t,description:n,keywords:a,image:i,children:l}=e;const c=function(e){const{siteConfig:t}=(0,u.Z)(),{title:n,titleDelimiter:r}=t;return null!=e&&e.trim().length?e.trim()+" "+r+" "+n:n}(t),{withBaseUrl:d}=(0,s.C)(),f=i?d(i,{absolute:!0}):void 0;return r.createElement(o.Z,null,t&&r.createElement("title",null,c),t&&r.createElement("meta",{property:"og:title",content:c}),n&&r.createElement("meta",{name:"description",content:n}),n&&r.createElement("meta",{property:"og:description",content:n}),a&&r.createElement("meta",{name:"keywords",content:Array.isArray(a)?a.join(","):a}),f&&r.createElement("meta",{property:"og:image",content:f}),f&&r.createElement("meta",{name:"twitter:image",content:f}),l)}const d=r.createContext(void 0);function f(e){let{className:t,children:n}=e;const i=r.useContext(d),l=(0,a.Z)(i,t);return r.createElement(d.Provider,{value:l},r.createElement(o.Z,null,r.createElement("html",{className:l})),n)}function p(e){let{children:t}=e;const n=l(),o="plugin-"+n.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"");const i="plugin-id-"+n.plugin.id;return r.createElement(f,{className:(0,a.Z)(o,i)},t)}},3768:(e,t,n)=>{"use strict";n.d(t,{D9:()=>i,Qc:()=>u,Ql:()=>s,i6:()=>l,zX:()=>o});var r=n(7294);const a=n(6136).Z.canUseDOM?r.useLayoutEffect:r.useEffect;function o(e){const t=(0,r.useRef)(e);return a((()=>{t.current=e}),[e]),(0,r.useCallback)((function(){return t.current(...arguments)}),[])}function i(e){const t=(0,r.useRef)();return a((()=>{t.current=e})),t.current}class l extends Error{constructor(e,t){var n,r,a,o;super(),this.name="ReactContextError",this.message="Hook "+(null!=(n=null==(r=this.stack)||null==(a=r.split("\n")[1])||null==(o=a.match(/at (?:\w+\.)?(?\w+)/))?void 0:o.groups.name)?n:"")+" is called outside the <"+e+">. "+(null!=t?t:"")}}function s(e){const t=Object.entries(e);return t.sort(((e,t)=>e[0].localeCompare(t[0]))),(0,r.useMemo)((()=>e),t.flat())}function u(e){return t=>{let{children:n}=t;return r.createElement(r.Fragment,null,e.reduceRight(((e,t)=>r.createElement(t,null,e)),n))}}},9003:(e,t,n)=>{"use strict";n.d(t,{Mg:()=>i,Ns:()=>l});var r=n(7294),a=n(997),o=n(9962);function i(e,t){const n=e=>{var t;return null==(t=!e||e.endsWith("/")?e:e+"/")?void 0:t.toLowerCase()};return n(e)===n(t)}function l(){const{baseUrl:e}=(0,o.Z)().siteConfig;return(0,r.useMemo)((()=>function(e){let{baseUrl:t,routes:n}=e;function r(e){return e.path===t&&!0===e.exact}function a(e){return e.path===t&&!e.exact}return function e(t){if(0===t.length)return;return t.find(r)||e(t.filter(a).flatMap((e=>{var t;return null!=(t=e.routes)?t:[]})))}(n)}({routes:a.Z,baseUrl:e})),[e])}},2957:(e,t,n)=>{"use strict";n.d(t,{Ct:()=>f,OC:()=>s,RF:()=>d});var r=n(7294),a=n(6136),o=n(1048),i=n(3768);const l=r.createContext(void 0);function s(e){let{children:t}=e;const n=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)((()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}})),[])}();return r.createElement(l.Provider,{value:n},t)}function u(){const e=(0,r.useContext)(l);if(null==e)throw new i.i6("ScrollControllerProvider");return e}const c=()=>a.Z.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function d(e,t){void 0===t&&(t=[]);const{scrollEventsEnabledRef:n}=u(),a=(0,r.useRef)(c()),o=(0,i.zX)(e);(0,r.useEffect)((()=>{const e=()=>{if(!n.current)return;const e=c();o(e,a.current),a.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)}),[o,n,...t])}function f(){const e=(0,r.useRef)(null),t=(0,o.Z)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const a=document.documentElement.scrollTop;(n&&a>e||!n&&at&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>null==e.current?void 0:e.current()}}},246:(e,t,n)=>{"use strict";n.d(t,{HX:()=>r,os:()=>a});n(9962);const r="default";function a(e,t){return"docs-"+e+"-"+t}},2560:(e,t,n)=>{"use strict";n.d(t,{W:()=>l,_:()=>s});const r="localStorage";function a(e){if(void 0===e&&(e=r),"undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,o||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),o=!0),null}var t}let o=!1;const i={get:()=>null,set:()=>{},del:()=>{}};function l(e,t){if("undefined"==typeof window)return function(e){function t(){throw new Error('Illegal storage API usage for storage key "'+e+'".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.')}return{get:t,set:t,del:t}}(e);const n=a(null==t?void 0:t.persistence);return null===n?i:{get:()=>{try{return n.getItem(e)}catch(t){return console.error("Docusaurus storage error, can't get key="+e,t),null}},set:t=>{try{n.setItem(e,t)}catch(r){console.error("Docusaurus storage error, can't set "+e+"="+t,r)}},del:()=>{try{n.removeItem(e)}catch(t){console.error("Docusaurus storage error, can't delete key="+e,t)}}}}function s(e){void 0===e&&(e=r);const t=a(e);if(!t)return[];const n=[];for(let r=0;r{"use strict";n.d(t,{l:()=>o});var r=n(9962),a=n(6775);function o(){const{siteConfig:{baseUrl:e,url:t},i18n:{defaultLocale:n,currentLocale:o}}=(0,r.Z)(),{pathname:i}=(0,a.TH)(),l=o===n?e:e.replace("/"+o+"/","/"),s=i.replace(e,"");return{createUrl:function(e){let{locale:r,fullyQualified:a}=e;return""+(a?t:"")+function(e){return e===n?""+l:""+l+e+"/"}(r)+s}}}},3266:(e,t,n)=>{"use strict";n.d(t,{S:()=>i});var r=n(7294),a=n(6775),o=n(3768);function i(e){const t=(0,a.TH)(),n=(0,o.D9)(t),i=(0,o.zX)(e);(0,r.useEffect)((()=>{n&&t!==n&&i({location:t,previousLocation:n})}),[i,t,n])}},107:(e,t,n)=>{"use strict";n.d(t,{L:()=>a});var r=n(9962);function a(){return(0,r.Z)().siteConfig.themeConfig}},4136:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[a]=e.split(/[#?]/),o="/"===a||a===r?a:(i=a,n?function(e){return e.endsWith("/")?e:e+"/"}(i):function(e){return e.endsWith("/")?e.slice(0,-1):e}(i));var i;return e.replace(a,o)}},3905:function(e,t,n){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.applyTrailingSlash=t.blogPostContainerID=void 0,t.blogPostContainerID="post-content";var a=n(4136);Object.defineProperty(t,"applyTrailingSlash",{enumerable:!0,get:function(){return r(a).default}})},6010:(e,t,n)=>{"use strict";function r(e){var t,n,a="";if("string"==typeof e||"number"==typeof e)a+=e;else if("object"==typeof e)if(Array.isArray(e))for(t=0;ta});const a=function(){for(var e,t,n=0,a="";n{"use strict";n.d(t,{lX:()=>w,q_:()=>C,ob:()=>p,PP:()=>L,Ep:()=>f});var r=n(7462);function a(e){return"/"===e.charAt(0)}function o(e,t){for(var n=t,r=n+1,a=e.length;r=0;f--){var p=i[f];"."===p?o(i,f):".."===p?(o(i,f),d++):d&&(o(i,f),d--)}if(!u)for(;d--;d)i.unshift("..");!u||""===i[0]||i[0]&&a(i[0])||i.unshift("");var m=i.join("/");return n&&"/"!==m.substr(-1)&&(m+="/"),m};var l=n(2177);function s(e){return"/"===e.charAt(0)?e:"/"+e}function u(e){return"/"===e.charAt(0)?e.substr(1):e}function c(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function f(e){var t=e.pathname,n=e.search,r=e.hash,a=t||"/";return n&&"?"!==n&&(a+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(a+="#"===r.charAt(0)?r:"#"+r),a}function p(e,t,n,a){var o;"string"==typeof e?(o=function(e){var t=e||"/",n="",r="",a=t.indexOf("#");-1!==a&&(r=t.substr(a),t=t.substr(0,a));var o=t.indexOf("?");return-1!==o&&(n=t.substr(o),t=t.substr(0,o)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),o.state=t):(void 0===(o=(0,r.Z)({},e)).pathname&&(o.pathname=""),o.search?"?"!==o.search.charAt(0)&&(o.search="?"+o.search):o.search="",o.hash?"#"!==o.hash.charAt(0)&&(o.hash="#"+o.hash):o.hash="",void 0!==t&&void 0===o.state&&(o.state=t));try{o.pathname=decodeURI(o.pathname)}catch(l){throw l instanceof URIError?new URIError('Pathname "'+o.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):l}return n&&(o.key=n),a?o.pathname?"/"!==o.pathname.charAt(0)&&(o.pathname=i(o.pathname,a.pathname)):o.pathname=a.pathname:o.pathname||(o.pathname="/"),o}function m(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,a){if(null!=e){var o="function"==typeof e?e(t,n):e;"string"==typeof o?"function"==typeof r?r(o,a):a(!0):a(!1!==o)}else a(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter((function(e){return e!==r}))}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;rt?n.splice(t,n.length-t,a):n.push(a),d({action:r,location:a,index:t,entries:n})}}))},replace:function(e,t){var r="REPLACE",a=p(e,t,g(),w.location);c.confirmTransitionTo(a,r,n,(function(e){e&&(w.entries[w.index]=a,d({action:r,location:a}))}))},go:y,goBack:function(){y(-1)},goForward:function(){y(1)},canGo:function(e){var t=w.index+e;return t>=0&&t{"use strict";var r=n(9864),a={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},o={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},i={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},l={};function s(e){return r.isMemo(e)?i:l[e.$$typeof]||a}l[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},l[r.Memo]=i;var u=Object.defineProperty,c=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,f=Object.getOwnPropertyDescriptor,p=Object.getPrototypeOf,m=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(m){var a=p(n);a&&a!==m&&e(t,a,r)}var i=c(n);d&&(i=i.concat(d(n)));for(var l=s(t),g=s(n),h=0;h{"use strict";e.exports=function(e,t,n,r,a,o,i,l){if(!e){var s;if(void 0===t)s=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var u=[n,r,a,o,i,l],c=0;(s=new Error(t.replace(/%s/g,(function(){return u[c++]})))).name="Invariant Violation"}throw s.framesToPop=1,s}}},5826:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},984:(e,t,n)=>{"use strict";n.r(t)},6930:(e,t,n)=>{"use strict";n.r(t)},4865:function(e,t,n){var r,a;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'
'};function a(e,t,n){return en?n:e}function o(e){return 100*(-1+e)}function i(e,t,n){var a;return(a="translate3d"===r.positionUsing?{transform:"translate3d("+o(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+o(e)+"%,0)"}:{"margin-left":o(e)+"%"}).transition="all "+t+"ms "+n,a}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=a(e,r.minimum,1),n.status=1===e?null:e;var o=n.render(!t),u=o.querySelector(r.barSelector),c=r.speed,d=r.easing;return o.offsetWidth,l((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),s(u,i(e,c,d)),1===e?(s(o,{transition:"none",opacity:1}),o.offsetWidth,setTimeout((function(){s(o,{transition:"all "+c+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),c)}),c)):setTimeout(t,c)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*a(Math.random()*t,.1,.95)),t=a(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var a,i=t.querySelector(r.barSelector),l=e?"-100":o(n.status||0),u=document.querySelector(r.parent);return s(i,{transition:"all 0 linear",transform:"translate3d("+l+"%,0,0)"}),r.showSpinner||(a=t.querySelector(r.spinnerSelector))&&p(a),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&p(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var l=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),s=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()}))}function r(t){var n=document.body.style;if(t in n)return t;for(var r,a=e.length,o=t.charAt(0).toUpperCase()+t.slice(1);a--;)if((r=e[a]+o)in n)return r;return t}function a(e){return e=n(e),t[e]||(t[e]=r(e))}function o(e,t,n){t=a(t),e.style[t]=n}return function(e,t){var n,r,a=arguments;if(2==a.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&o(e,n,r);else o(e,a[1],a[2])}}();function u(e,t){return("string"==typeof e?e:f(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=f(e),r=n+t;u(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=f(e);u(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function f(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function p(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(a="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=a)},7418:e=>{"use strict";var t=Object.getOwnPropertySymbols,n=Object.prototype.hasOwnProperty,r=Object.prototype.propertyIsEnumerable;function a(e){if(null==e)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(e)}e.exports=function(){try{if(!Object.assign)return!1;var e=new String("abc");if(e[5]="de","5"===Object.getOwnPropertyNames(e)[0])return!1;for(var t={},n=0;n<10;n++)t["_"+String.fromCharCode(n)]=n;if("0123456789"!==Object.getOwnPropertyNames(t).map((function(e){return t[e]})).join(""))return!1;var r={};return"abcdefghijklmnopqrst".split("").forEach((function(e){r[e]=e})),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},r)).join("")}catch(a){return!1}}()?Object.assign:function(e,o){for(var i,l,s=a(e),u=1;u{"use strict";n.d(t,{Z:()=>o});var r=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof a?new a(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/=d.reach);S+=E.value.length,E=E.next){var x=E.value;if(t.length>e.length)return;if(!(x instanceof a)){var _,C=1;if(v){if(!(_=o(k,S,e,b))||_.index>=e.length)break;var T=_.index,L=_.index+_[0].length,A=S;for(A+=E.value.length;T>=A;)A+=(E=E.next).value.length;if(S=A-=E.value.length,E.value instanceof a)continue;for(var P=E;P!==t.tail&&(Ad.reach&&(d.reach=D);var I=E.prev;if(N&&(I=s(t,I,N),S+=N.length),u(t,I,C),E=s(t,I,new a(f,h?r.tokenize(R,h):R,y,R)),O&&s(t,E,O),C>1){var M={cause:f+","+m,reach:D};i(e,t,n,E.prev,S,M),d&&M.reach>d.reach&&(d.reach=M.reach)}}}}}}function l(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function s(e,t,n){var r=t.next,a={value:n,prev:t,next:r};return t.next=a,r.prev=a,e.length++,a}function u(e,t,n){for(var r=t.next,a=0;a"+o.content+""},r}(),a=r;r.default=r,a.languages.markup={comment:{pattern://,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern://i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},a.languages.markup.tag.inside["attr-value"].inside.entity=a.languages.markup.entity,a.languages.markup.doctype.inside["internal-subset"].inside=a.languages.markup,a.hooks.add("wrap",(function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))})),Object.defineProperty(a.languages.markup.tag,"addInlined",{value:function(e,t){var n={};n["language-"+t]={pattern:/(^$)/i,lookbehind:!0,inside:a.languages[t]},n.cdata=/^$/i;var r={"included-cdata":{pattern://i,inside:n}};r["language-"+t]={pattern:/[\s\S]+/,inside:a.languages[t]};var o={};o[e]={pattern:RegExp(/(<__[^>]*>)(?:))*\]\]>|(?!)/.source.replace(/__/g,(function(){return e})),"i"),lookbehind:!0,greedy:!0,inside:r},a.languages.insertBefore("markup","cdata",o)}}),Object.defineProperty(a.languages.markup.tag,"addAttribute",{value:function(e,t){a.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:a.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),a.languages.html=a.languages.markup,a.languages.mathml=a.languages.markup,a.languages.svg=a.languages.markup,a.languages.xml=a.languages.extend("markup",{}),a.languages.ssml=a.languages.xml,a.languages.atom=a.languages.xml,a.languages.rss=a.languages.xml,function(e){var t="\\b(?:BASH|BASHOPTS|BASH_ALIASES|BASH_ARGC|BASH_ARGV|BASH_CMDS|BASH_COMPLETION_COMPAT_DIR|BASH_LINENO|BASH_REMATCH|BASH_SOURCE|BASH_VERSINFO|BASH_VERSION|COLORTERM|COLUMNS|COMP_WORDBREAKS|DBUS_SESSION_BUS_ADDRESS|DEFAULTS_PATH|DESKTOP_SESSION|DIRSTACK|DISPLAY|EUID|GDMSESSION|GDM_LANG|GNOME_KEYRING_CONTROL|GNOME_KEYRING_PID|GPG_AGENT_INFO|GROUPS|HISTCONTROL|HISTFILE|HISTFILESIZE|HISTSIZE|HOME|HOSTNAME|HOSTTYPE|IFS|INSTANCE|JOB|LANG|LANGUAGE|LC_ADDRESS|LC_ALL|LC_IDENTIFICATION|LC_MEASUREMENT|LC_MONETARY|LC_NAME|LC_NUMERIC|LC_PAPER|LC_TELEPHONE|LC_TIME|LESSCLOSE|LESSOPEN|LINES|LOGNAME|LS_COLORS|MACHTYPE|MAILCHECK|MANDATORY_PATH|NO_AT_BRIDGE|OLDPWD|OPTERR|OPTIND|ORBIT_SOCKETDIR|OSTYPE|PAPERSIZE|PATH|PIPESTATUS|PPID|PS1|PS2|PS3|PS4|PWD|RANDOM|REPLY|SECONDS|SELINUX_INIT|SESSION|SESSIONTYPE|SESSION_MANAGER|SHELL|SHELLOPTS|SHLVL|SSH_AUTH_SOCK|TERM|UID|UPSTART_EVENTS|UPSTART_INSTANCE|UPSTART_JOB|UPSTART_SESSION|USER|WINDOWID|XAUTHORITY|XDG_CONFIG_DIRS|XDG_CURRENT_DESKTOP|XDG_DATA_DIRS|XDG_GREETER_DATA_DIR|XDG_MENU_PREFIX|XDG_RUNTIME_DIR|XDG_SEAT|XDG_SEAT_PATH|XDG_SESSION_DESKTOP|XDG_SESSION_ID|XDG_SESSION_PATH|XDG_SESSION_TYPE|XDG_VTNR|XMODIFIERS)\\b",n={pattern:/(^(["']?)\w+\2)[ \t]+\S.*/,lookbehind:!0,alias:"punctuation",inside:null},r={bash:n,environment:{pattern:RegExp("\\$"+t),alias:"constant"},variable:[{pattern:/\$?\(\([\s\S]+?\)\)/,greedy:!0,inside:{variable:[{pattern:/(^\$\(\([\s\S]+)\)\)/,lookbehind:!0},/^\$\(\(/],number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee]-?\d+)?/,operator:/--|\+\+|\*\*=?|<<=?|>>=?|&&|\|\||[=!+\-*/%<>^&|]=?|[?~:]/,punctuation:/\(\(?|\)\)?|,|;/}},{pattern:/\$\((?:\([^)]+\)|[^()])+\)|`[^`]+`/,greedy:!0,inside:{variable:/^\$\(|^`|\)$|`$/}},{pattern:/\$\{[^}]+\}/,greedy:!0,inside:{operator:/:[-=?+]?|[!\/]|##?|%%?|\^\^?|,,?/,punctuation:/[\[\]]/,environment:{pattern:RegExp("(\\{)"+t),lookbehind:!0,alias:"constant"}}},/\$(?:\w+|[#?*!@$])/],entity:/\\(?:[abceEfnrtv\\"]|O?[0-7]{1,3}|U[0-9a-fA-F]{8}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{1,2})/};e.languages.bash={shebang:{pattern:/^#!\s*\/.*/,alias:"important"},comment:{pattern:/(^|[^"{\\$])#.*/,lookbehind:!0},"function-name":[{pattern:/(\bfunction\s+)[\w-]+(?=(?:\s*\(?:\s*\))?\s*\{)/,lookbehind:!0,alias:"function"},{pattern:/\b[\w-]+(?=\s*\(\s*\)\s*\{)/,alias:"function"}],"for-or-select":{pattern:/(\b(?:for|select)\s+)\w+(?=\s+in\s)/,alias:"variable",lookbehind:!0},"assign-left":{pattern:/(^|[\s;|&]|[<>]\()\w+(?=\+?=)/,inside:{environment:{pattern:RegExp("(^|[\\s;|&]|[<>]\\()"+t),lookbehind:!0,alias:"constant"}},alias:"variable",lookbehind:!0},string:[{pattern:/((?:^|[^<])<<-?\s*)(\w+)\s[\s\S]*?(?:\r?\n|\r)\2/,lookbehind:!0,greedy:!0,inside:r},{pattern:/((?:^|[^<])<<-?\s*)(["'])(\w+)\2\s[\s\S]*?(?:\r?\n|\r)\3/,lookbehind:!0,greedy:!0,inside:{bash:n}},{pattern:/(^|[^\\](?:\\\\)*)"(?:\\[\s\S]|\$\([^)]+\)|\$(?!\()|`[^`]+`|[^"\\`$])*"/,lookbehind:!0,greedy:!0,inside:r},{pattern:/(^|[^$\\])'[^']*'/,lookbehind:!0,greedy:!0},{pattern:/\$'(?:[^'\\]|\\[\s\S])*'/,greedy:!0,inside:{entity:r.entity}}],environment:{pattern:RegExp("\\$?"+t),alias:"constant"},variable:r.variable,function:{pattern:/(^|[\s;|&]|[<>]\()(?:add|apropos|apt|apt-cache|apt-get|aptitude|aspell|automysqlbackup|awk|basename|bash|bc|bconsole|bg|bzip2|cal|cat|cfdisk|chgrp|chkconfig|chmod|chown|chroot|cksum|clear|cmp|column|comm|composer|cp|cron|crontab|csplit|curl|cut|date|dc|dd|ddrescue|debootstrap|df|diff|diff3|dig|dir|dircolors|dirname|dirs|dmesg|docker|docker-compose|du|egrep|eject|env|ethtool|expand|expect|expr|fdformat|fdisk|fg|fgrep|file|find|fmt|fold|format|free|fsck|ftp|fuser|gawk|git|gparted|grep|groupadd|groupdel|groupmod|groups|grub-mkconfig|gzip|halt|head|hg|history|host|hostname|htop|iconv|id|ifconfig|ifdown|ifup|import|install|ip|jobs|join|kill|killall|less|link|ln|locate|logname|logrotate|look|lpc|lpr|lprint|lprintd|lprintq|lprm|ls|lsof|lynx|make|man|mc|mdadm|mkconfig|mkdir|mke2fs|mkfifo|mkfs|mkisofs|mknod|mkswap|mmv|more|most|mount|mtools|mtr|mutt|mv|nano|nc|netstat|nice|nl|node|nohup|notify-send|npm|nslookup|op|open|parted|passwd|paste|pathchk|ping|pkill|pnpm|podman|podman-compose|popd|pr|printcap|printenv|ps|pushd|pv|quota|quotacheck|quotactl|ram|rar|rcp|reboot|remsync|rename|renice|rev|rm|rmdir|rpm|rsync|scp|screen|sdiff|sed|sendmail|seq|service|sftp|sh|shellcheck|shuf|shutdown|sleep|slocate|sort|split|ssh|stat|strace|su|sudo|sum|suspend|swapon|sync|tac|tail|tar|tee|time|timeout|top|touch|tr|traceroute|tsort|tty|umount|uname|unexpand|uniq|units|unrar|unshar|unzip|update-grub|uptime|useradd|userdel|usermod|users|uudecode|uuencode|v|vcpkg|vdir|vi|vim|virsh|vmstat|wait|watch|wc|wget|whereis|which|who|whoami|write|xargs|xdg-open|yarn|yes|zenity|zip|zsh|zypper)(?=$|[)\s;|&])/,lookbehind:!0},keyword:{pattern:/(^|[\s;|&]|[<>]\()(?:case|do|done|elif|else|esac|fi|for|function|if|in|select|then|until|while)(?=$|[)\s;|&])/,lookbehind:!0},builtin:{pattern:/(^|[\s;|&]|[<>]\()(?:\.|:|alias|bind|break|builtin|caller|cd|command|continue|declare|echo|enable|eval|exec|exit|export|getopts|hash|help|let|local|logout|mapfile|printf|pwd|read|readarray|readonly|return|set|shift|shopt|source|test|times|trap|type|typeset|ulimit|umask|unalias|unset)(?=$|[)\s;|&])/,lookbehind:!0,alias:"class-name"},boolean:{pattern:/(^|[\s;|&]|[<>]\()(?:false|true)(?=$|[)\s;|&])/,lookbehind:!0},"file-descriptor":{pattern:/\B&\d\b/,alias:"important"},operator:{pattern:/\d?<>|>\||\+=|=[=~]?|!=?|<<[<-]?|[&\d]?>>|\d[<>]&?|[<>][&=]?|&[>&]?|\|[&|]?/,inside:{"file-descriptor":{pattern:/^\d/,alias:"important"}}},punctuation:/\$?\(\(?|\)\)?|\.\.|[{}[\];\\]/,number:{pattern:/(^|\s)(?:[1-9]\d*|0)(?:[.,]\d+)?\b/,lookbehind:!0}},n.inside=e.languages.bash;for(var a=["comment","function-name","for-or-select","assign-left","string","environment","function","keyword","builtin","boolean","file-descriptor","operator","punctuation","number"],o=r.variable[1].inside,i=0;i]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},a.languages.c=a.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),a.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),a.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},a.languages.c.string],char:a.languages.c.char,comment:a.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:a.languages.c}}}}),a.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete a.languages.c.boolean,function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!)\w+(?:\s*\.\s*\w+)*\b/.source.replace(//g,(function(){return t.source}));e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!)\w+/.source.replace(//g,(function(){return t.source}))),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/(?:\s*:\s*)?|:\s*/.source.replace(//g,(function(){return n}))+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(a),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-](?:[^;{\s]|\s+(?![\s{]))*(?:;|(?=\s*\{))/,inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css;var n=e.languages.markup;n&&(n.tag.addInlined("style","css"),n.tag.addAttribute("style","css"))}(a),function(e){var t,n=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/;e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+n.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[n,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}});var r={pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0},a={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0};e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:r,number:a,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:r,number:a})}(a),a.languages.javascript=a.languages.extend("clike",{"class-name":[a.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),a.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,a.languages.insertBefore("javascript","keyword",{regex:{pattern:/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)\/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/,lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:a.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:a.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:a.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:a.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:a.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),a.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:a.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),a.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),a.languages.markup&&(a.languages.markup.tag.addInlined("script","javascript"),a.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),a.languages.js=a.languages.javascript,function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(a),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",a=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-])(?:[ \t]*(?:(?![#:])|:))*/.source.replace(//g,(function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source})),o=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function i(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<>[ \t]+)?)(?:<>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return e}));return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<>/g,(function(){return r}))),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<>[ \t]+)?)<>(?=\s*:\s)/.source.replace(/<>/g,(function(){return r})).replace(/<>/g,(function(){return"(?:"+a+"|"+o+")"}))),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:i(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:i(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:i(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:i(o),lookbehind:!0,greedy:!0},number:{pattern:i(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(a),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(//g,(function(){return t})),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,a=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,(function(){return r})),o=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source;e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+a+o+"(?:"+a+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+a+o+")(?:"+a+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+a+")"+o+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+a+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)|_(?:(?!_))+_)+__\b|\*\*(?:(?!\*)|\*(?:(?!\*))+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)|__(?:(?!_))+__)+_\b|\*(?:(?!\*)|\*\*(?:(?!\*))+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~))+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\]))+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\]))+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach((function(t){["url","bold","italic","strike","code-snippet"].forEach((function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])}))})),e.hooks.add("after-tokenize",(function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n",quot:'"'},s=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(a),a.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:a.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},a.hooks.add("after-tokenize",(function(e){if("graphql"===e.language)for(var t=e.tokens.filter((function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type})),n=0;n0)){var l=f(/^\{$/,/^\}$/);if(-1===l)continue;for(var s=n;s=0&&p(u,"variable-input")}}}}function c(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,a=r.inside["interpolation-punctuation"],o=r.pattern.source;function i(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function l(e,t){return"___"+t.toUpperCase()+"_"+e+"___"}function s(t,n,r){var a={code:t,grammar:n,language:r};return e.hooks.run("before-tokenize",a),a.tokens=e.tokenize(a.code,a.grammar),e.hooks.run("after-tokenize",a),a.tokens}function u(t){var n={};n["interpolation-punctuation"]=a;var o=e.tokenize(t,n);if(3===o.length){var i=[1,1];i.push.apply(i,s(o[1],e.languages.javascript,"javascript")),o.splice.apply(o,i)}return new e.Token("interpolation",o,r.alias,t)}function c(t,n,r){var a=e.tokenize(t,{interpolation:{pattern:RegExp(o),lookbehind:!0}}),i=0,c={},d=s(a.map((function(e){if("string"==typeof e)return e;for(var n,a=e.content;-1!==t.indexOf(n=l(i++,r)););return c[n]=a,n})).join(""),n,r),f=Object.keys(c);return i=0,function e(t){for(var n=0;n=f.length)return;var r=t[n];if("string"==typeof r||"string"==typeof r.content){var a=f[i],o="string"==typeof r?r:r.content,l=o.indexOf(a);if(-1!==l){++i;var s=o.substring(0,l),d=u(c[a]),p=o.substring(l+a.length),m=[];if(s&&m.push(s),m.push(d),p){var g=[p];e(g),m.push.apply(m,g)}"string"==typeof r?(t.splice.apply(t,[n,1].concat(m)),n+=m.length-1):r.content=m}}else{var h=r.content;Array.isArray(h)?e(h):e([h])}}}(d),new e.Token(r,d,"language-"+r,t)}e.languages.javascript["template-string"]=[i("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),i("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),i("svg",/\bsvg/.source),i("markdown",/\b(?:markdown|md)/.source),i("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),i("sql",/\bsql/.source),t].filter(Boolean);var d={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function f(e){return"string"==typeof e?e:Array.isArray(e)?e.map(f).join(""):f(e.content)}e.hooks.add("after-tokenize",(function(t){t.language in d&&function t(n){for(var r=0,a=n.length;r]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(a),function(e){function t(e,t){return RegExp(e.replace(//g,(function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source})),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:(?:\s*,\s*(?:\*\s*as\s+|\{[^{}]*\}))?|\*\s*as\s+|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r*\.{3}(?:[^{}]|)*\})/.source;function o(e,t){return e=e.replace(//g,(function(){return n})).replace(//g,(function(){return r})).replace(//g,(function(){return a})),RegExp(e,t)}a=o(a).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=o(/<\/?(?:[\w.:-]+(?:+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|))?|))**\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:o(//.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:o(/=/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""},l=function(t){for(var n=[],r=0;r0&&n[n.length-1].tagName===i(a.content[0].content[1])&&n.pop():"/>"===a.content[a.content.length-1].content||n.push({tagName:i(a.content[0].content[1]),openedBraces:0}):n.length>0&&"punctuation"===a.type&&"{"===a.content?n[n.length-1].openedBraces++:n.length>0&&n[n.length-1].openedBraces>0&&"punctuation"===a.type&&"}"===a.content?n[n.length-1].openedBraces--:o=!0),(o||"string"==typeof a)&&n.length>0&&0===n[n.length-1].openedBraces){var s=i(a);r0&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(s=i(t[r-1])+s,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",s,null,s)}a.content&&"string"!=typeof a.content&&l(a.content)}};e.hooks.add("after-tokenize",(function(e){"jsx"!==e.language&&"tsx"!==e.language||l(e.tokens)}))}(a),function(e){e.languages.diff={coord:[/^(?:\*{3}|-{3}|\+{3}).*$/m,/^@@.*@@$/m,/^\d.*$/m]};var t={"deleted-sign":"-","deleted-arrow":"<","inserted-sign":"+","inserted-arrow":">",unchanged:" ",diff:"!"};Object.keys(t).forEach((function(n){var r=t[n],a=[];/^\w+$/.test(n)||a.push(/\w+/.exec(n)[0]),"diff"===n&&a.push("bold"),e.languages.diff[n]={pattern:RegExp("^(?:["+r+"].*(?:\r\n?|\n|(?![\\s\\S])))+","m"),alias:a,inside:{line:{pattern:/(.)(?=[\s\S]).*(?:\r\n?|\n)?/,lookbehind:!0},prefix:{pattern:/[\s\S]/,alias:/\w+/.exec(n)[0]}}}})),Object.defineProperty(e.languages.diff,"PREFIXES",{value:t})}(a),a.languages.git={comment:/^#.*/m,deleted:/^[-\u2013].*/m,inserted:/^\+.*/m,string:/("|')(?:\\.|(?!\1)[^\\\r\n])*\1/,command:{pattern:/^.*\$ git .*$/m,inside:{parameter:/\s--?\w+/}},coord:/^@@.*@@$/m,"commit-sha1":/^commit \w{40}$/m},a.languages.go=a.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),a.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete a.languages.go["class-name"],function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,a,o){if(n.language===r){var i=n.tokenStack=[];n.code=n.code.replace(a,(function(e){if("function"==typeof o&&!o(e))return e;for(var a,l=i.length;-1!==n.code.indexOf(a=t(r,l));)++l;return i[l]=e,a})),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var a=0,o=Object.keys(n.tokenStack);!function i(l){for(var s=0;s=o.length);s++){var u=l[s];if("string"==typeof u||u.content&&"string"==typeof u.content){var c=o[a],d=n.tokenStack[c],f="string"==typeof u?u:u.content,p=t(r,c),m=f.indexOf(p);if(m>-1){++a;var g=f.substring(0,m),h=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=f.substring(m+p.length),v=[];g&&v.push.apply(v,i([g])),v.push(h),b&&v.push.apply(v,i([b])),"string"==typeof u?l.splice.apply(l,[s,1].concat(v)):u.content=v}}else u.content&&i(u.content)}return l}(n.tokens)}}}})}(a),function(e){e.languages.handlebars={comment:/\{\{![\s\S]*?\}\}/,delimiter:{pattern:/^\{\{\{?|\}\}\}?$/,alias:"punctuation"},string:/(["'])(?:\\.|(?!\1)[^\\\r\n])*\1/,number:/\b0x[\dA-Fa-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:[Ee][+-]?\d+)?/,boolean:/\b(?:false|true)\b/,block:{pattern:/^(\s*(?:~\s*)?)[#\/]\S+?(?=\s*(?:~\s*)?$|\s)/,lookbehind:!0,alias:"keyword"},brackets:{pattern:/\[[^\]]+\]/,inside:{punctuation:/\[|\]/,variable:/[\s\S]+/}},punctuation:/[!"#%&':()*+,.\/;<=>@\[\\\]^`{|}~]/,variable:/[^!"#%&'()*+,\/;<=>@\[\\\]^`{|}~\s]+/},e.hooks.add("before-tokenize",(function(t){e.languages["markup-templating"].buildPlaceholders(t,"handlebars",/\{\{\{[\s\S]+?\}\}\}|\{\{[\s\S]+?\}\}/g)})),e.hooks.add("after-tokenize",(function(t){e.languages["markup-templating"].tokenizePlaceholders(t,"handlebars")})),e.languages.hbs=e.languages.handlebars}(a),a.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},a.languages.webmanifest=a.languages.json,a.languages.less=a.languages.extend("css",{comment:[/\/\*[\s\S]*?\*\//,{pattern:/(^|[^\\])\/\/.*/,lookbehind:!0}],atrule:{pattern:/@[\w-](?:\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{punctuation:/[:()]/}},selector:{pattern:/(?:@\{[\w-]+\}|[^{};\s@])(?:@\{[\w-]+\}|\((?:[^(){}]|\([^(){}]*\))*\)|[^(){};@\s]|\s+(?!\s))*?(?=\s*\{)/,inside:{variable:/@+[\w-]+/}},property:/(?:@\{[\w-]+\}|[\w-])+(?:\+_?)?(?=\s*:)/,operator:/[+\-*\/]/}),a.languages.insertBefore("less","property",{variable:[{pattern:/@[\w-]+\s*:/,inside:{punctuation:/:/}},/@@?[\w-]+/],"mixin-usage":{pattern:/([{;]\s*)[.#](?!\d)[\w-].*?(?=[(;])/,lookbehind:!0,alias:"function"}}),a.languages.makefile={comment:{pattern:/(^|[^\\])#(?:\\(?:\r\n|[\s\S])|[^\\\r\n])*/,lookbehind:!0},string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"builtin-target":{pattern:/\.[A-Z][^:#=\s]+(?=\s*:(?!=))/,alias:"builtin"},target:{pattern:/^(?:[^:=\s]|[ \t]+(?![\s:]))+(?=\s*:(?!=))/m,alias:"symbol",inside:{variable:/\$+(?:(?!\$)[^(){}:#=\s]+|(?=[({]))/}},variable:/\$+(?:(?!\$)[^(){}:#=\s]+|\([@*%<^+?][DF]\)|(?=[({]))/,keyword:/-include\b|\b(?:define|else|endef|endif|export|ifn?def|ifn?eq|include|override|private|sinclude|undefine|unexport|vpath)\b/,function:{pattern:/(\()(?:abspath|addsuffix|and|basename|call|dir|error|eval|file|filter(?:-out)?|findstring|firstword|flavor|foreach|guile|if|info|join|lastword|load|notdir|or|origin|patsubst|realpath|shell|sort|strip|subst|suffix|value|warning|wildcard|word(?:list|s)?)(?=[ \t])/,lookbehind:!0},operator:/(?:::|[?:+!])?=|[|@]/,punctuation:/[:;(){}]/},a.languages.objectivec=a.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete a.languages.objectivec["class-name"],a.languages.objc=a.languages.objectivec,a.languages.ocaml={comment:{pattern:/\(\*[\s\S]*?\*\)/,greedy:!0},char:{pattern:/'(?:[^\\\r\n']|\\(?:.|[ox]?[0-9a-f]{1,3}))'/i,greedy:!0},string:[{pattern:/"(?:\\(?:[\s\S]|\r\n)|[^\\\r\n"])*"/,greedy:!0},{pattern:/\{([a-z_]*)\|[\s\S]*?\|\1\}/,greedy:!0}],number:[/\b(?:0b[01][01_]*|0o[0-7][0-7_]*)\b/i,/\b0x[a-f0-9][a-f0-9_]*(?:\.[a-f0-9_]*)?(?:p[+-]?\d[\d_]*)?(?!\w)/i,/\b\d[\d_]*(?:\.[\d_]*)?(?:e[+-]?\d[\d_]*)?(?!\w)/i],directive:{pattern:/\B#\w+/,alias:"property"},label:{pattern:/\B~\w+/,alias:"property"},"type-variable":{pattern:/\B'\w+/,alias:"function"},variant:{pattern:/`\w+/,alias:"symbol"},keyword:/\b(?:as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|match|method|module|mutable|new|nonrec|object|of|open|private|rec|sig|struct|then|to|try|type|val|value|virtual|when|where|while|with)\b/,boolean:/\b(?:false|true)\b/,"operator-like-punctuation":{pattern:/\[[<>|]|[>|]\]|\{<|>\}/,alias:"punctuation"},operator:/\.[.~]|:[=>]|[=<>@^|&+\-*\/$%!?~][!$%&*+\-.\/:<=>?@^|~]*|\b(?:and|asr|land|lor|lsl|lsr|lxor|mod|or)\b/,punctuation:/;;|::|[(){}\[\].,:;#]|\b_\b/},a.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},a.languages.python["string-interpolation"].inside.interpolation.inside.rest=a.languages.python,a.languages.py=a.languages.python,a.languages.reason=a.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),a.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete a.languages.reason.function,function(e){e.languages.sass=e.languages.extend("css",{comment:{pattern:/^([ \t]*)\/[\/*].*(?:(?:\r?\n|\r)\1[ \t].+)*/m,lookbehind:!0,greedy:!0}}),e.languages.insertBefore("sass","atrule",{"atrule-line":{pattern:/^(?:[ \t]*)[@+=].+/m,greedy:!0,inside:{atrule:/(?:@[\w-]+|[+=])/}}}),delete e.languages.sass.atrule;var t=/\$[-\w]+|#\{\$[-\w]+\}/,n=[/[+*\/%]|[=!]=|<=?|>=?|\b(?:and|not|or)\b/,{pattern:/(\s)-(?=\s)/,lookbehind:!0}];e.languages.insertBefore("sass","property",{"variable-line":{pattern:/^[ \t]*\$.+/m,greedy:!0,inside:{punctuation:/:/,variable:t,operator:n}},"property-line":{pattern:/^[ \t]*(?:[^:\s]+ *:.*|:[^:\s].*)/m,greedy:!0,inside:{property:[/[^:\s]+(?=\s*:)/,{pattern:/(:)[^:\s]+/,lookbehind:!0}],punctuation:/:/,variable:t,operator:n,important:e.languages.sass.important}}}),delete e.languages.sass.property,delete e.languages.sass.important,e.languages.insertBefore("sass","punctuation",{selector:{pattern:/^([ \t]*)\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*(?:,(?:\r?\n|\r)\1[ \t]+\S(?:,[^,\r\n]+|[^,\r\n]*)(?:,[^,\r\n]+)*)*/m,lookbehind:!0,greedy:!0}})}(a),a.languages.scss=a.languages.extend("css",{comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},atrule:{pattern:/@[\w-](?:\([^()]+\)|[^()\s]|\s+(?!\s))*?(?=\s+[{;])/,inside:{rule:/@[\w-]+/}},url:/(?:[-a-z]+-)?url(?=\()/i,selector:{pattern:/(?=\S)[^@;{}()]?(?:[^@;{}()\s]|\s+(?!\s)|#\{\$[-\w]+\})+(?=\s*\{(?:\}|\s|[^}][^:{}]*[:{][^}]))/,inside:{parent:{pattern:/&/,alias:"important"},placeholder:/%[-\w]+/,variable:/\$[-\w]+|#\{\$[-\w]+\}/}},property:{pattern:/(?:[-\w]|\$[-\w]|#\{\$[-\w]+\})+(?=\s*:)/,inside:{variable:/\$[-\w]+|#\{\$[-\w]+\}/}}}),a.languages.insertBefore("scss","atrule",{keyword:[/@(?:content|debug|each|else(?: if)?|extend|for|forward|function|if|import|include|mixin|return|use|warn|while)\b/i,{pattern:/( )(?:from|through)(?= )/,lookbehind:!0}]}),a.languages.insertBefore("scss","important",{variable:/\$[-\w]+|#\{\$[-\w]+\}/}),a.languages.insertBefore("scss","function",{"module-modifier":{pattern:/\b(?:as|hide|show|with)\b/i,alias:"keyword"},placeholder:{pattern:/%[-\w]+/,alias:"selector"},statement:{pattern:/\B!(?:default|optional)\b/i,alias:"keyword"},boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"},operator:{pattern:/(\s)(?:[-+*\/%]|[=!]=|<=?|>=?|and|not|or)(?=\s)/,lookbehind:!0}}),a.languages.scss.atrule.inside.rest=a.languages.scss,function(e){var t={pattern:/(\b\d+)(?:%|[a-z]+)/,lookbehind:!0},n={pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0},r={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0},url:{pattern:/\burl\((["']?).*?\1\)/i,greedy:!0},string:{pattern:/("|')(?:(?!\1)[^\\\r\n]|\\(?:\r\n|[\s\S]))*\1/,greedy:!0},interpolation:null,func:null,important:/\B!(?:important|optional)\b/i,keyword:{pattern:/(^|\s+)(?:(?:else|for|if|return|unless)(?=\s|$)|@[\w-]+)/,lookbehind:!0},hexcode:/#[\da-f]{3,6}/i,color:[/\b(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)\b/i,{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,boolean:/\b(?:false|true)\b/,operator:[/~|[+!\/%<>?=]=?|[-:]=|\*[*=]?|\.{2,3}|&&|\|\||\B-\B|\b(?:and|in|is(?: a| defined| not|nt)?|not|or)\b/],number:n,punctuation:/[{}()\[\];:,]/};r.interpolation={pattern:/\{[^\r\n}:]+\}/,alias:"variable",inside:{delimiter:{pattern:/^\{|\}$/,alias:"punctuation"},rest:r}},r.func={pattern:/[\w-]+\([^)]*\).*/,inside:{function:/^[^(]+/,rest:r}},e.languages.stylus={"atrule-declaration":{pattern:/(^[ \t]*)@.+/m,lookbehind:!0,inside:{atrule:/^@[\w-]+/,rest:r}},"variable-declaration":{pattern:/(^[ \t]*)[\w$-]+\s*.?=[ \t]*(?:\{[^{}]*\}|\S.*|$)/m,lookbehind:!0,inside:{variable:/^\S+/,rest:r}},statement:{pattern:/(^[ \t]*)(?:else|for|if|return|unless)[ \t].+/m,lookbehind:!0,inside:{keyword:/^\S+/,rest:r}},"property-declaration":{pattern:/((?:^|\{)([ \t]*))(?:[\w-]|\{[^}\r\n]+\})+(?:\s*:\s*|[ \t]+)(?!\s)[^{\r\n]*(?:;|[^{\r\n,]$(?!(?:\r?\n|\r)(?:\{|\2[ \t])))/m,lookbehind:!0,inside:{property:{pattern:/^[^\s:]+/,inside:{interpolation:r.interpolation}},rest:r}},selector:{pattern:/(^[ \t]*)(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)(?:(?:\r?\n|\r)(?:\1(?:(?=\S)(?:[^{}\r\n:()]|::?[\w-]+(?:\([^)\r\n]*\)|(?![\w-]))|\{[^}\r\n]+\})+)))*(?:,$|\{|(?=(?:\r?\n|\r)(?:\{|\1[ \t])))/m,lookbehind:!0,inside:{interpolation:r.interpolation,comment:r.comment,punctuation:/[{},]/}},func:r.func,string:r.string,comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|\/\/.*)/,lookbehind:!0,greedy:!0},interpolation:r.interpolation,punctuation:/[{}()\[\];:.]/}}(a),function(e){var t=e.util.clone(e.languages.typescript);e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"];var n=e.languages.tsx.tag;n.pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+n.pattern.source+")",n.pattern.flags),n.lookbehind=!0}(a),a.languages.wasm={comment:[/\(;[\s\S]*?;\)/,{pattern:/;;.*/,greedy:!0}],string:{pattern:/"(?:\\[\s\S]|[^"\\])*"/,greedy:!0},keyword:[{pattern:/\b(?:align|offset)=/,inside:{operator:/=/}},{pattern:/\b(?:(?:f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|neg?|nearest|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|sqrt|store(?:8|16|32)?|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))?|memory\.(?:grow|size))\b/,inside:{punctuation:/\./}},/\b(?:anyfunc|block|br(?:_if|_table)?|call(?:_indirect)?|data|drop|elem|else|end|export|func|get_(?:global|local)|global|if|import|local|loop|memory|module|mut|nop|offset|param|result|return|select|set_(?:global|local)|start|table|tee_local|then|type|unreachable)\b/],variable:/\$[\w!#$%&'*+\-./:<=>?@\\^`|~]+/,number:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/,punctuation:/[()]/};const o=a},9901:e=>{e.exports&&(e.exports={core:{meta:{path:"components/prism-core.js",option:"mandatory"},core:"Core"},themes:{meta:{path:"themes/{id}.css",link:"index.html?theme={id}",exclusive:!0},prism:{title:"Default",option:"default"},"prism-dark":"Dark","prism-funky":"Funky","prism-okaidia":{title:"Okaidia",owner:"ocodia"},"prism-twilight":{title:"Twilight",owner:"remybach"},"prism-coy":{title:"Coy",owner:"tshedor"},"prism-solarizedlight":{title:"Solarized Light",owner:"hectormatos2011 "},"prism-tomorrow":{title:"Tomorrow Night",owner:"Rosey"}},languages:{meta:{path:"components/prism-{id}",noCSS:!0,examplesPath:"examples/prism-{id}",addCheckAll:!0},markup:{title:"Markup",alias:["html","xml","svg","mathml","ssml","atom","rss"],aliasTitles:{html:"HTML",xml:"XML",svg:"SVG",mathml:"MathML",ssml:"SSML",atom:"Atom",rss:"RSS"},option:"default"},css:{title:"CSS",option:"default",modify:"markup"},clike:{title:"C-like",option:"default"},javascript:{title:"JavaScript",require:"clike",modify:"markup",optional:"regex",alias:"js",option:"default"},abap:{title:"ABAP",owner:"dellagustin"},abnf:{title:"ABNF",owner:"RunDevelopment"},actionscript:{title:"ActionScript",require:"javascript",modify:"markup",owner:"Golmote"},ada:{title:"Ada",owner:"Lucretia"},agda:{title:"Agda",owner:"xy-ren"},al:{title:"AL",owner:"RunDevelopment"},antlr4:{title:"ANTLR4",alias:"g4",owner:"RunDevelopment"},apacheconf:{title:"Apache Configuration",owner:"GuiTeK"},apex:{title:"Apex",require:["clike","sql"],owner:"RunDevelopment"},apl:{title:"APL",owner:"ngn"},applescript:{title:"AppleScript",owner:"Golmote"},aql:{title:"AQL",owner:"RunDevelopment"},arduino:{title:"Arduino",require:"cpp",alias:"ino",owner:"dkern"},arff:{title:"ARFF",owner:"Golmote"},armasm:{title:"ARM Assembly",alias:"arm-asm",owner:"RunDevelopment"},arturo:{title:"Arturo",alias:"art",optional:["bash","css","javascript","markup","markdown","sql"],owner:"drkameleon"},asciidoc:{alias:"adoc",title:"AsciiDoc",owner:"Golmote"},aspnet:{title:"ASP.NET (C#)",require:["markup","csharp"],owner:"nauzilus"},asm6502:{title:"6502 Assembly",owner:"kzurawel"},asmatmel:{title:"Atmel AVR Assembly",owner:"cerkit"},autohotkey:{title:"AutoHotkey",owner:"aviaryan"},autoit:{title:"AutoIt",owner:"Golmote"},avisynth:{title:"AviSynth",alias:"avs",owner:"Zinfidel"},"avro-idl":{title:"Avro IDL",alias:"avdl",owner:"RunDevelopment"},awk:{title:"AWK",alias:"gawk",aliasTitles:{gawk:"GAWK"},owner:"RunDevelopment"},bash:{title:"Bash",alias:"shell",aliasTitles:{shell:"Shell"},owner:"zeitgeist87"},basic:{title:"BASIC",owner:"Golmote"},batch:{title:"Batch",owner:"Golmote"},bbcode:{title:"BBcode",alias:"shortcode",aliasTitles:{shortcode:"Shortcode"},owner:"RunDevelopment"},bicep:{title:"Bicep",owner:"johnnyreilly"},birb:{title:"Birb",require:"clike",owner:"Calamity210"},bison:{title:"Bison",require:"c",owner:"Golmote"},bnf:{title:"BNF",alias:"rbnf",aliasTitles:{rbnf:"RBNF"},owner:"RunDevelopment"},brainfuck:{title:"Brainfuck",owner:"Golmote"},brightscript:{title:"BrightScript",owner:"RunDevelopment"},bro:{title:"Bro",owner:"wayward710"},bsl:{title:"BSL (1C:Enterprise)",alias:"oscript",aliasTitles:{oscript:"OneScript"},owner:"Diversus23"},c:{title:"C",require:"clike",owner:"zeitgeist87"},csharp:{title:"C#",require:"clike",alias:["cs","dotnet"],owner:"mvalipour"},cpp:{title:"C++",require:"c",owner:"zeitgeist87"},cfscript:{title:"CFScript",require:"clike",alias:"cfc",owner:"mjclemente"},chaiscript:{title:"ChaiScript",require:["clike","cpp"],owner:"RunDevelopment"},cil:{title:"CIL",owner:"sbrl"},clojure:{title:"Clojure",owner:"troglotit"},cmake:{title:"CMake",owner:"mjrogozinski"},cobol:{title:"COBOL",owner:"RunDevelopment"},coffeescript:{title:"CoffeeScript",require:"javascript",alias:"coffee",owner:"R-osey"},concurnas:{title:"Concurnas",alias:"conc",owner:"jasontatton"},csp:{title:"Content-Security-Policy",owner:"ScottHelme"},cooklang:{title:"Cooklang",owner:"ahue"},coq:{title:"Coq",owner:"RunDevelopment"},crystal:{title:"Crystal",require:"ruby",owner:"MakeNowJust"},"css-extras":{title:"CSS Extras",require:"css",modify:"css",owner:"milesj"},csv:{title:"CSV",owner:"RunDevelopment"},cue:{title:"CUE",owner:"RunDevelopment"},cypher:{title:"Cypher",owner:"RunDevelopment"},d:{title:"D",require:"clike",owner:"Golmote"},dart:{title:"Dart",require:"clike",owner:"Golmote"},dataweave:{title:"DataWeave",owner:"machaval"},dax:{title:"DAX",owner:"peterbud"},dhall:{title:"Dhall",owner:"RunDevelopment"},diff:{title:"Diff",owner:"uranusjr"},django:{title:"Django/Jinja2",require:"markup-templating",alias:"jinja2",owner:"romanvm"},"dns-zone-file":{title:"DNS zone file",owner:"RunDevelopment",alias:"dns-zone"},docker:{title:"Docker",alias:"dockerfile",owner:"JustinBeckwith"},dot:{title:"DOT (Graphviz)",alias:"gv",optional:"markup",owner:"RunDevelopment"},ebnf:{title:"EBNF",owner:"RunDevelopment"},editorconfig:{title:"EditorConfig",owner:"osipxd"},eiffel:{title:"Eiffel",owner:"Conaclos"},ejs:{title:"EJS",require:["javascript","markup-templating"],owner:"RunDevelopment",alias:"eta",aliasTitles:{eta:"Eta"}},elixir:{title:"Elixir",owner:"Golmote"},elm:{title:"Elm",owner:"zwilias"},etlua:{title:"Embedded Lua templating",require:["lua","markup-templating"],owner:"RunDevelopment"},erb:{title:"ERB",require:["ruby","markup-templating"],owner:"Golmote"},erlang:{title:"Erlang",owner:"Golmote"},"excel-formula":{title:"Excel Formula",alias:["xlsx","xls"],owner:"RunDevelopment"},fsharp:{title:"F#",require:"clike",owner:"simonreynolds7"},factor:{title:"Factor",owner:"catb0t"},false:{title:"False",owner:"edukisto"},"firestore-security-rules":{title:"Firestore security rules",require:"clike",owner:"RunDevelopment"},flow:{title:"Flow",require:"javascript",owner:"Golmote"},fortran:{title:"Fortran",owner:"Golmote"},ftl:{title:"FreeMarker Template Language",require:"markup-templating",owner:"RunDevelopment"},gml:{title:"GameMaker Language",alias:"gamemakerlanguage",require:"clike",owner:"LiarOnce"},gap:{title:"GAP (CAS)",owner:"RunDevelopment"},gcode:{title:"G-code",owner:"RunDevelopment"},gdscript:{title:"GDScript",owner:"RunDevelopment"},gedcom:{title:"GEDCOM",owner:"Golmote"},gettext:{title:"gettext",alias:"po",owner:"RunDevelopment"},gherkin:{title:"Gherkin",owner:"hason"},git:{title:"Git",owner:"lgiraudel"},glsl:{title:"GLSL",require:"c",owner:"Golmote"},gn:{title:"GN",alias:"gni",owner:"RunDevelopment"},"linker-script":{title:"GNU Linker Script",alias:"ld",owner:"RunDevelopment"},go:{title:"Go",require:"clike",owner:"arnehormann"},"go-module":{title:"Go module",alias:"go-mod",owner:"RunDevelopment"},graphql:{title:"GraphQL",optional:"markdown",owner:"Golmote"},groovy:{title:"Groovy",require:"clike",owner:"robfletcher"},haml:{title:"Haml",require:"ruby",optional:["css","css-extras","coffeescript","erb","javascript","less","markdown","scss","textile"],owner:"Golmote"},handlebars:{title:"Handlebars",require:"markup-templating",alias:["hbs","mustache"],aliasTitles:{mustache:"Mustache"},owner:"Golmote"},haskell:{title:"Haskell",alias:"hs",owner:"bholst"},haxe:{title:"Haxe",require:"clike",optional:"regex",owner:"Golmote"},hcl:{title:"HCL",owner:"outsideris"},hlsl:{title:"HLSL",require:"c",owner:"RunDevelopment"},hoon:{title:"Hoon",owner:"matildepark"},http:{title:"HTTP",optional:["csp","css","hpkp","hsts","javascript","json","markup","uri"],owner:"danielgtaylor"},hpkp:{title:"HTTP Public-Key-Pins",owner:"ScottHelme"},hsts:{title:"HTTP Strict-Transport-Security",owner:"ScottHelme"},ichigojam:{title:"IchigoJam",owner:"BlueCocoa"},icon:{title:"Icon",owner:"Golmote"},"icu-message-format":{title:"ICU Message Format",owner:"RunDevelopment"},idris:{title:"Idris",alias:"idr",owner:"KeenS",require:"haskell"},ignore:{title:".ignore",owner:"osipxd",alias:["gitignore","hgignore","npmignore"],aliasTitles:{gitignore:".gitignore",hgignore:".hgignore",npmignore:".npmignore"}},inform7:{title:"Inform 7",owner:"Golmote"},ini:{title:"Ini",owner:"aviaryan"},io:{title:"Io",owner:"AlesTsurko"},j:{title:"J",owner:"Golmote"},java:{title:"Java",require:"clike",owner:"sherblot"},javadoc:{title:"JavaDoc",require:["markup","java","javadoclike"],modify:"java",optional:"scala",owner:"RunDevelopment"},javadoclike:{title:"JavaDoc-like",modify:["java","javascript","php"],owner:"RunDevelopment"},javastacktrace:{title:"Java stack trace",owner:"RunDevelopment"},jexl:{title:"Jexl",owner:"czosel"},jolie:{title:"Jolie",require:"clike",owner:"thesave"},jq:{title:"JQ",owner:"RunDevelopment"},jsdoc:{title:"JSDoc",require:["javascript","javadoclike","typescript"],modify:"javascript",optional:["actionscript","coffeescript"],owner:"RunDevelopment"},"js-extras":{title:"JS Extras",require:"javascript",modify:"javascript",optional:["actionscript","coffeescript","flow","n4js","typescript"],owner:"RunDevelopment"},json:{title:"JSON",alias:"webmanifest",aliasTitles:{webmanifest:"Web App Manifest"},owner:"CupOfTea696"},json5:{title:"JSON5",require:"json",owner:"RunDevelopment"},jsonp:{title:"JSONP",require:"json",owner:"RunDevelopment"},jsstacktrace:{title:"JS stack trace",owner:"sbrl"},"js-templates":{title:"JS Templates",require:"javascript",modify:"javascript",optional:["css","css-extras","graphql","markdown","markup","sql"],owner:"RunDevelopment"},julia:{title:"Julia",owner:"cdagnino"},keepalived:{title:"Keepalived Configure",owner:"dev-itsheng"},keyman:{title:"Keyman",owner:"mcdurdin"},kotlin:{title:"Kotlin",alias:["kt","kts"],aliasTitles:{kts:"Kotlin Script"},require:"clike",owner:"Golmote"},kumir:{title:"KuMir (\u041a\u0443\u041c\u0438\u0440)",alias:"kum",owner:"edukisto"},kusto:{title:"Kusto",owner:"RunDevelopment"},latex:{title:"LaTeX",alias:["tex","context"],aliasTitles:{tex:"TeX",context:"ConTeXt"},owner:"japborst"},latte:{title:"Latte",require:["clike","markup-templating","php"],owner:"nette"},less:{title:"Less",require:"css",optional:"css-extras",owner:"Golmote"},lilypond:{title:"LilyPond",require:"scheme",alias:"ly",owner:"RunDevelopment"},liquid:{title:"Liquid",require:"markup-templating",owner:"cinhtau"},lisp:{title:"Lisp",alias:["emacs","elisp","emacs-lisp"],owner:"JuanCaicedo"},livescript:{title:"LiveScript",owner:"Golmote"},llvm:{title:"LLVM IR",owner:"porglezomp"},log:{title:"Log file",optional:"javastacktrace",owner:"RunDevelopment"},lolcode:{title:"LOLCODE",owner:"Golmote"},lua:{title:"Lua",owner:"Golmote"},magma:{title:"Magma (CAS)",owner:"RunDevelopment"},makefile:{title:"Makefile",owner:"Golmote"},markdown:{title:"Markdown",require:"markup",optional:"yaml",alias:"md",owner:"Golmote"},"markup-templating":{title:"Markup templating",require:"markup",owner:"Golmote"},mata:{title:"Mata",owner:"RunDevelopment"},matlab:{title:"MATLAB",owner:"Golmote"},maxscript:{title:"MAXScript",owner:"RunDevelopment"},mel:{title:"MEL",owner:"Golmote"},mermaid:{title:"Mermaid",owner:"RunDevelopment"},mizar:{title:"Mizar",owner:"Golmote"},mongodb:{title:"MongoDB",owner:"airs0urce",require:"javascript"},monkey:{title:"Monkey",owner:"Golmote"},moonscript:{title:"MoonScript",alias:"moon",owner:"RunDevelopment"},n1ql:{title:"N1QL",owner:"TMWilds"},n4js:{title:"N4JS",require:"javascript",optional:"jsdoc",alias:"n4jsd",owner:"bsmith-n4"},"nand2tetris-hdl":{title:"Nand To Tetris HDL",owner:"stephanmax"},naniscript:{title:"Naninovel Script",owner:"Elringus",alias:"nani"},nasm:{title:"NASM",owner:"rbmj"},neon:{title:"NEON",owner:"nette"},nevod:{title:"Nevod",owner:"nezaboodka"},nginx:{title:"nginx",owner:"volado"},nim:{title:"Nim",owner:"Golmote"},nix:{title:"Nix",owner:"Golmote"},nsis:{title:"NSIS",owner:"idleberg"},objectivec:{title:"Objective-C",require:"c",alias:"objc",owner:"uranusjr"},ocaml:{title:"OCaml",owner:"Golmote"},odin:{title:"Odin",owner:"edukisto"},opencl:{title:"OpenCL",require:"c",modify:["c","cpp"],owner:"Milania1"},openqasm:{title:"OpenQasm",alias:"qasm",owner:"RunDevelopment"},oz:{title:"Oz",owner:"Golmote"},parigp:{title:"PARI/GP",owner:"Golmote"},parser:{title:"Parser",require:"markup",owner:"Golmote"},pascal:{title:"Pascal",alias:"objectpascal",aliasTitles:{objectpascal:"Object Pascal"},owner:"Golmote"},pascaligo:{title:"Pascaligo",owner:"DefinitelyNotAGoat"},psl:{title:"PATROL Scripting Language",owner:"bertysentry"},pcaxis:{title:"PC-Axis",alias:"px",owner:"RunDevelopment"},peoplecode:{title:"PeopleCode",alias:"pcode",owner:"RunDevelopment"},perl:{title:"Perl",owner:"Golmote"},php:{title:"PHP",require:"markup-templating",owner:"milesj"},phpdoc:{title:"PHPDoc",require:["php","javadoclike"],modify:"php",owner:"RunDevelopment"},"php-extras":{title:"PHP Extras",require:"php",modify:"php",owner:"milesj"},"plant-uml":{title:"PlantUML",alias:"plantuml",owner:"RunDevelopment"},plsql:{title:"PL/SQL",require:"sql",owner:"Golmote"},powerquery:{title:"PowerQuery",alias:["pq","mscript"],owner:"peterbud"},powershell:{title:"PowerShell",owner:"nauzilus"},processing:{title:"Processing",require:"clike",owner:"Golmote"},prolog:{title:"Prolog",owner:"Golmote"},promql:{title:"PromQL",owner:"arendjr"},properties:{title:".properties",owner:"Golmote"},protobuf:{title:"Protocol Buffers",require:"clike",owner:"just-boris"},pug:{title:"Pug",require:["markup","javascript"],optional:["coffeescript","ejs","handlebars","less","livescript","markdown","scss","stylus","twig"],owner:"Golmote"},puppet:{title:"Puppet",owner:"Golmote"},pure:{title:"Pure",optional:["c","cpp","fortran"],owner:"Golmote"},purebasic:{title:"PureBasic",require:"clike",alias:"pbfasm",owner:"HeX0R101"},purescript:{title:"PureScript",require:"haskell",alias:"purs",owner:"sriharshachilakapati"},python:{title:"Python",alias:"py",owner:"multipetros"},qsharp:{title:"Q#",require:"clike",alias:"qs",owner:"fedonman"},q:{title:"Q (kdb+ database)",owner:"Golmote"},qml:{title:"QML",require:"javascript",owner:"RunDevelopment"},qore:{title:"Qore",require:"clike",owner:"temnroegg"},r:{title:"R",owner:"Golmote"},racket:{title:"Racket",require:"scheme",alias:"rkt",owner:"RunDevelopment"},cshtml:{title:"Razor C#",alias:"razor",require:["markup","csharp"],optional:["css","css-extras","javascript","js-extras"],owner:"RunDevelopment"},jsx:{title:"React JSX",require:["markup","javascript"],optional:["jsdoc","js-extras","js-templates"],owner:"vkbansal"},tsx:{title:"React TSX",require:["jsx","typescript"]},reason:{title:"Reason",require:"clike",owner:"Golmote"},regex:{title:"Regex",owner:"RunDevelopment"},rego:{title:"Rego",owner:"JordanSh"},renpy:{title:"Ren'py",alias:"rpy",owner:"HyuchiaDiego"},rescript:{title:"ReScript",alias:"res",owner:"vmarcosp"},rest:{title:"reST (reStructuredText)",owner:"Golmote"},rip:{title:"Rip",owner:"ravinggenius"},roboconf:{title:"Roboconf",owner:"Golmote"},robotframework:{title:"Robot Framework",alias:"robot",owner:"RunDevelopment"},ruby:{title:"Ruby",require:"clike",alias:"rb",owner:"samflores"},rust:{title:"Rust",owner:"Golmote"},sas:{title:"SAS",optional:["groovy","lua","sql"],owner:"Golmote"},sass:{title:"Sass (Sass)",require:"css",optional:"css-extras",owner:"Golmote"},scss:{title:"Sass (Scss)",require:"css",optional:"css-extras",owner:"MoOx"},scala:{title:"Scala",require:"java",owner:"jozic"},scheme:{title:"Scheme",owner:"bacchus123"},"shell-session":{title:"Shell session",require:"bash",alias:["sh-session","shellsession"],owner:"RunDevelopment"},smali:{title:"Smali",owner:"RunDevelopment"},smalltalk:{title:"Smalltalk",owner:"Golmote"},smarty:{title:"Smarty",require:"markup-templating",optional:"php",owner:"Golmote"},sml:{title:"SML",alias:"smlnj",aliasTitles:{smlnj:"SML/NJ"},owner:"RunDevelopment"},solidity:{title:"Solidity (Ethereum)",alias:"sol",require:"clike",owner:"glachaud"},"solution-file":{title:"Solution file",alias:"sln",owner:"RunDevelopment"},soy:{title:"Soy (Closure Template)",require:"markup-templating",owner:"Golmote"},sparql:{title:"SPARQL",require:"turtle",owner:"Triply-Dev",alias:"rq"},"splunk-spl":{title:"Splunk SPL",owner:"RunDevelopment"},sqf:{title:"SQF: Status Quo Function (Arma 3)",require:"clike",owner:"RunDevelopment"},sql:{title:"SQL",owner:"multipetros"},squirrel:{title:"Squirrel",require:"clike",owner:"RunDevelopment"},stan:{title:"Stan",owner:"RunDevelopment"},stata:{title:"Stata Ado",require:["mata","java","python"],owner:"RunDevelopment"},iecst:{title:"Structured Text (IEC 61131-3)",owner:"serhioromano"},stylus:{title:"Stylus",owner:"vkbansal"},supercollider:{title:"SuperCollider",alias:"sclang",owner:"RunDevelopment"},swift:{title:"Swift",owner:"chrischares"},systemd:{title:"Systemd configuration file",owner:"RunDevelopment"},"t4-templating":{title:"T4 templating",owner:"RunDevelopment"},"t4-cs":{title:"T4 Text Templates (C#)",require:["t4-templating","csharp"],alias:"t4",owner:"RunDevelopment"},"t4-vb":{title:"T4 Text Templates (VB)",require:["t4-templating","vbnet"],owner:"RunDevelopment"},tap:{title:"TAP",owner:"isaacs",require:"yaml"},tcl:{title:"Tcl",owner:"PeterChaplin"},tt2:{title:"Template Toolkit 2",require:["clike","markup-templating"],owner:"gflohr"},textile:{title:"Textile",require:"markup",optional:"css",owner:"Golmote"},toml:{title:"TOML",owner:"RunDevelopment"},tremor:{title:"Tremor",alias:["trickle","troy"],owner:"darach",aliasTitles:{trickle:"trickle",troy:"troy"}},turtle:{title:"Turtle",alias:"trig",aliasTitles:{trig:"TriG"},owner:"jakubklimek"},twig:{title:"Twig",require:"markup-templating",owner:"brandonkelly"},typescript:{title:"TypeScript",require:"javascript",optional:"js-templates",alias:"ts",owner:"vkbansal"},typoscript:{title:"TypoScript",alias:"tsconfig",aliasTitles:{tsconfig:"TSConfig"},owner:"dkern"},unrealscript:{title:"UnrealScript",alias:["uscript","uc"],owner:"RunDevelopment"},uorazor:{title:"UO Razor Script",owner:"jaseowns"},uri:{title:"URI",alias:"url",aliasTitles:{url:"URL"},owner:"RunDevelopment"},v:{title:"V",require:"clike",owner:"taggon"},vala:{title:"Vala",require:"clike",optional:"regex",owner:"TemplarVolk"},vbnet:{title:"VB.Net",require:"basic",owner:"Bigsby"},velocity:{title:"Velocity",require:"markup",owner:"Golmote"},verilog:{title:"Verilog",owner:"a-rey"},vhdl:{title:"VHDL",owner:"a-rey"},vim:{title:"vim",owner:"westonganger"},"visual-basic":{title:"Visual Basic",alias:["vb","vba"],aliasTitles:{vba:"VBA"},owner:"Golmote"},warpscript:{title:"WarpScript",owner:"RunDevelopment"},wasm:{title:"WebAssembly",owner:"Golmote"},"web-idl":{title:"Web IDL",alias:"webidl",owner:"RunDevelopment"},wiki:{title:"Wiki markup",require:"markup",owner:"Golmote"},wolfram:{title:"Wolfram language",alias:["mathematica","nb","wl"],aliasTitles:{mathematica:"Mathematica",nb:"Mathematica Notebook"},owner:"msollami"},wren:{title:"Wren",owner:"clsource"},xeora:{title:"Xeora",require:"markup",alias:"xeoracube",aliasTitles:{xeoracube:"XeoraCube"},owner:"freakmaxi"},"xml-doc":{title:"XML doc (.net)",require:"markup",modify:["csharp","fsharp","vbnet"],owner:"RunDevelopment"},xojo:{title:"Xojo (REALbasic)",owner:"Golmote"},xquery:{title:"XQuery",require:"markup",owner:"Golmote"},yaml:{title:"YAML",alias:"yml",owner:"hason"},yang:{title:"YANG",owner:"RunDevelopment"},zig:{title:"Zig",owner:"RunDevelopment"}},plugins:{meta:{path:"plugins/{id}/prism-{id}",link:"plugins/{id}/"},"line-highlight":{title:"Line Highlight",description:"Highlights specific lines and/or line ranges."},"line-numbers":{title:"Line Numbers",description:"Line number at the beginning of code lines.",owner:"kuba-kubula"},"show-invisibles":{title:"Show Invisibles",description:"Show hidden characters such as tabs and line breaks.",optional:["autolinker","data-uri-highlight"]},autolinker:{title:"Autolinker",description:"Converts URLs and emails in code to clickable links. Parses Markdown links in comments."},wpd:{title:"WebPlatform Docs",description:'Makes tokens link to WebPlatform.org documentation. The links open in a new tab.'},"custom-class":{title:"Custom Class",description:"This plugin allows you to prefix Prism's default classes (.comment can become .namespace--comment) or replace them with your defined ones (like .editor__comment). You can even add new classes.",owner:"dvkndn",noCSS:!0},"file-highlight":{title:"File Highlight",description:"Fetch external files and highlight them with Prism. Used on the Prism website itself.",noCSS:!0},"show-language":{title:"Show Language",description:"Display the highlighted language in code blocks (inline code does not show the label).",owner:"nauzilus",noCSS:!0,require:"toolbar"},"jsonp-highlight":{title:"JSONP Highlight",description:"Fetch content with JSONP and highlight some interesting content (e.g. GitHub/Gists or Bitbucket API).",noCSS:!0,owner:"nauzilus"},"highlight-keywords":{title:"Highlight Keywords",description:"Adds special CSS classes for each keyword for fine-grained highlighting.",owner:"vkbansal",noCSS:!0},"remove-initial-line-feed":{title:"Remove initial line feed",description:"Removes the initial line feed in code blocks.",owner:"Golmote",noCSS:!0},"inline-color":{title:"Inline color",description:"Adds a small inline preview for colors in style sheets.",require:"css-extras",owner:"RunDevelopment"},previewers:{title:"Previewers",description:"Previewers for angles, colors, gradients, easing and time.",require:"css-extras",owner:"Golmote"},autoloader:{title:"Autoloader",description:"Automatically loads the needed languages to highlight the code blocks.",owner:"Golmote",noCSS:!0},"keep-markup":{title:"Keep Markup",description:"Prevents custom markup from being dropped out during highlighting.",owner:"Golmote",optional:"normalize-whitespace",noCSS:!0},"command-line":{title:"Command Line",description:"Display a command line with a prompt and, optionally, the output/response from the commands.",owner:"chriswells0"},"unescaped-markup":{title:"Unescaped Markup",description:"Write markup without having to escape anything."},"normalize-whitespace":{title:"Normalize Whitespace",description:"Supports multiple operations to normalize whitespace in code blocks.",owner:"zeitgeist87",optional:"unescaped-markup",noCSS:!0},"data-uri-highlight":{title:"Data-URI Highlight",description:"Highlights data-URI contents.",owner:"Golmote",noCSS:!0},toolbar:{title:"Toolbar",description:"Attach a toolbar for plugins to easily register buttons on the top of a code block.",owner:"mAAdhaTTah"},"copy-to-clipboard":{title:"Copy to Clipboard Button",description:"Add a button that copies the code block to the clipboard when clicked.",owner:"mAAdhaTTah",require:"toolbar",noCSS:!0},"download-button":{title:"Download Button",description:"A button in the toolbar of a code block adding a convenient way to download a code file.",owner:"Golmote",require:"toolbar",noCSS:!0},"match-braces":{title:"Match braces",description:"Highlights matching braces.",owner:"RunDevelopment"},"diff-highlight":{title:"Diff Highlight",description:"Highlights the code inside diff blocks.",owner:"RunDevelopment",require:"diff"},"filter-highlight-all":{title:"Filter highlightAll",description:"Filters the elements the highlightAll and highlightAllUnder methods actually highlight.",owner:"RunDevelopment",noCSS:!0},treeview:{title:"Treeview",description:"A language with special styles to highlight file system tree structures.",owner:"Golmote"}}})},2885:(e,t,n)=>{const r=n(9901),a=n(9642),o=new Set;function i(e){void 0===e?e=Object.keys(r.languages).filter((e=>"meta"!=e)):Array.isArray(e)||(e=[e]);const t=[...o,...Object.keys(Prism.languages)];a(r,e,t).load((e=>{if(!(e in r.languages))return void(i.silent||console.warn("Language does not exist: "+e));const t="./prism-"+e;delete n.c[n(6500).resolve(t)],delete Prism.languages[e],n(6500)(t),o.add(e)}))}i.silent=!1,e.exports=i},6726:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6726},6500:(e,t,n)=>{var r={"./":2885};function a(e){var t=o(e);return n(t)}function o(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}a.keys=function(){return Object.keys(r)},a.resolve=o,e.exports=a,a.id=6500},9642:e=>{"use strict";var t=function(){var e=function(){};function t(e,t){Array.isArray(e)?e.forEach(t):null!=e&&t(e,0)}function n(e){for(var t={},n=0,r=e.length;n "));var l={},s=e[r];if(s){function u(t){if(!(t in e))throw new Error(r+" depends on an unknown component "+t);if(!(t in l))for(var i in a(t,o),l[t]=!0,n[t])l[i]=!0}t(s.require,u),t(s.optional,u),t(s.modify,u)}n[r]=l,o.pop()}}return function(e){var t=n[e];return t||(a(e,r),t=n[e]),t}}function a(e){for(var t in e)return!0;return!1}return function(o,i,l){var s=function(e){var t={};for(var n in e){var r=e[n];for(var a in r)if("meta"!=a){var o=r[a];t[a]="string"==typeof o?{title:o}:o}}return t}(o),u=function(e){var n;return function(r){if(r in e)return r;if(!n)for(var a in n={},e){var o=e[a];t(o&&o.alias,(function(t){if(t in n)throw new Error(t+" cannot be alias for both "+a+" and "+n[t]);if(t in e)throw new Error(t+" cannot be alias of "+a+" because it is a component.");n[t]=a}))}return n[r]||r}}(s);i=i.map(u),l=(l||[]).map(u);var c=n(i),d=n(l);i.forEach((function e(n){var r=s[n];t(r&&r.require,(function(t){t in d||(c[t]=!0,e(t))}))}));for(var f,p=r(s),m=c;a(m);){for(var g in f={},m){var h=s[g];t(h&&h.modify,(function(e){e in d&&(f[e]=!0)}))}for(var b in d)if(!(b in c))for(var v in p(b))if(v in c){f[b]=!0;break}for(var y in m=f)c[y]=!0}var w={getIds:function(){var e=[];return w.load((function(t){e.push(t)})),e},load:function(t,n){return function(t,n,r,a){var o=a?a.series:void 0,i=a?a.parallel:e,l={},s={};function u(e){if(e in l)return l[e];s[e]=!0;var a,c=[];for(var d in t(e))d in n&&c.push(d);if(0===c.length)a=r(e);else{var f=i(c.map((function(e){var t=u(e);return delete s[e],t})));o?a=o(f,(function(){return r(e)})):r(e)}return l[e]=a}for(var c in n)u(c);var d=[];for(var f in s)d.push(l[f]);return i(d)}(p,c,t,n)}};return w}}();e.exports=t},2703:(e,t,n)=>{"use strict";var r=n(414);function a(){}function o(){}o.resetWarningCache=a,e.exports=function(){function e(e,t,n,a,o,i){if(i!==r){var l=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw l.name="Invariant Violation",l}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:o,resetWarningCache:a};return n.PropTypes=n,n}},5697:(e,t,n)=>{e.exports=n(2703)()},414:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},4448:(e,t,n)=>{"use strict";var r=n(7294),a=n(7418),o=n(3840);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n