From 7c88669458a5b4358279ddb894982839a60e78b9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 6 Oct 2023 13:45:39 +0000 Subject: [PATCH] deploy: 02be74f9f174e2223e65baf139784382ec6357b6 --- 404.html | 8 ++++---- assets/js/007e88ba.0fb56621.js | 1 + assets/js/007e88ba.f838c180.js | 1 - assets/js/0f563736.a023b345.js | 1 + assets/js/0f563736.e945c3b6.js | 1 - .../js/{1388c4ac.dff5a9cc.js => 1388c4ac.8cc0e671.js} | 2 +- assets/js/16fb93b6.28e7671a.js | 1 - assets/js/16fb93b6.993c4352.js | 1 + assets/js/1ba1fdde.2b4c17a0.js | 1 + assets/js/1ba1fdde.86e9596e.js | 1 - assets/js/2bcf1a01.02c7e9cf.js | 1 - assets/js/2bcf1a01.6e8f8b94.js | 1 + assets/js/2ec3b088.914781f0.js | 1 + assets/js/2ec3b088.bd573609.js | 1 - .../js/{356d1211.3d93446d.js => 356d1211.45896582.js} | 2 +- .../js/{359b770c.ca537649.js => 359b770c.1d3d955c.js} | 2 +- .../js/{3dd08d97.dafb331e.js => 3dd08d97.0b7ef328.js} | 2 +- assets/js/3ea99f16.3205e3ac.js | 1 + assets/js/3ea99f16.9e77d688.js | 1 - assets/js/473c0143.1f434086.js | 1 - assets/js/473c0143.57a0bdd7.js | 1 + assets/js/48e9e5f1.33d97b0d.js | 1 + assets/js/48e9e5f1.749d6abe.js | 1 - assets/js/4a01a261.7827a619.js | 1 + assets/js/4a01a261.c19bb9f0.js | 1 - assets/js/4bc4971a.0412a86b.js | 1 - assets/js/4bc4971a.33383340.js | 1 + assets/js/4edc808e.59e94125.js | 1 + assets/js/4edc808e.71ad89e9.js | 1 - assets/js/56c122aa.050a81ce.js | 1 - assets/js/56c122aa.98df1abc.js | 1 + assets/js/5bdcc37f.07874b66.js | 1 - assets/js/5bdcc37f.fd13d075.js | 1 + assets/js/6e7c13c8.19bd2714.js | 1 + assets/js/6e7c13c8.28f471e7.js | 1 - assets/js/717128d8.9c30be9b.js | 1 + assets/js/717128d8.fd790493.js | 1 - assets/js/72b27058.6d5a0533.js | 1 + assets/js/72b27058.77a103d0.js | 1 - assets/js/770c5109.454db8d0.js | 1 + assets/js/770c5109.bc503c60.js | 1 - assets/js/778078a6.2e2b8768.js | 1 - assets/js/778078a6.83182040.js | 1 + assets/js/78f57216.0f15c0ed.js | 1 - assets/js/78f57216.4969e886.js | 1 + assets/js/7a11bfb9.244eda19.js | 1 + assets/js/7a11bfb9.e4072bc6.js | 1 - assets/js/7d4685ea.1d0c3875.js | 1 + assets/js/7d4685ea.ae64fc90.js | 1 - assets/js/8002bf56.d2c0388f.js | 1 - assets/js/8002bf56.db7acfed.js | 1 + assets/js/836ef5f0.da45542c.js | 1 + assets/js/836ef5f0.db5cf3bd.js | 1 - assets/js/8f91f489.4e27d9c9.js | 1 + assets/js/8f91f489.e98c4381.js | 1 - .../js/{9209d359.3d600634.js => 9209d359.38961375.js} | 2 +- assets/js/93d64a37.93332187.js | 1 - assets/js/93d64a37.e2e63719.js | 1 + assets/js/957fd519.d5ee2d31.js | 1 + assets/js/957fd519.f639f16e.js | 1 - assets/js/98ee5961.43a2fbfb.js | 1 + assets/js/98ee5961.c2b6c365.js | 1 - assets/js/9e642b58.512315b8.js | 1 + assets/js/9e642b58.e1aa676b.js | 1 - assets/js/a3d45d30.4a383e5f.js | 1 + assets/js/a3d45d30.4e1854cd.js | 1 - .../js/{a4dfb062.67c2d527.js => a4dfb062.504bb07b.js} | 2 +- assets/js/a637ac13.310ea95b.js | 1 - assets/js/a637ac13.dd0d96f1.js | 1 + assets/js/a829cb4e.3e2e1fd9.js | 1 - assets/js/a829cb4e.d7efb83e.js | 1 + assets/js/ab84bad5.90224f1b.js | 1 + assets/js/ab84bad5.a9681b30.js | 1 - assets/js/b02fcbbe.1c38afe2.js | 1 + assets/js/b02fcbbe.3b4970a4.js | 1 - assets/js/b084ff01.6f5a1aa8.js | 1 - assets/js/b084ff01.bb761190.js | 1 + .../js/{b0cf2206.be33a4cf.js => b0cf2206.2cd8dc60.js} | 2 +- assets/js/b6af033a.b3a67d0e.js | 1 - assets/js/b6af033a.fad23e3f.js | 1 + .../js/{b8dc3674.2fb2ef93.js => b8dc3674.ac86471f.js} | 2 +- .../js/{bf31d9bc.06bff309.js => bf31d9bc.dc180fea.js} | 2 +- assets/js/c0a2235c.2fec7948.js | 1 - assets/js/c0a2235c.d9df13ba.js | 1 + assets/js/c5a0b084.39a0ffb0.js | 1 - assets/js/c5a0b084.db8d8eaf.js | 1 + .../js/{cc299ddb.fb3a6675.js => cc299ddb.eac8b84f.js} | 2 +- assets/js/e20ae084.36687c90.js | 1 - assets/js/e20ae084.92be8f04.js | 1 + assets/js/e450c455.2c604c6e.js | 1 + assets/js/e450c455.e901e9f8.js | 1 - assets/js/f00aede0.32061047.js | 1 + assets/js/f00aede0.f947b6c1.js | 1 - assets/js/f31c573f.bbd17bc6.js | 1 + assets/js/f31c573f.dd8695e9.js | 1 - .../js/{f542e803.1dfe66b0.js => f542e803.0b0d2041.js} | 2 +- assets/js/f59c19d8.3cf4f21e.js | 1 - assets/js/f59c19d8.f040a789.js | 1 + assets/js/fada8994.6bb157d1.js | 1 + assets/js/fada8994.6dacb172.js | 1 - .../js/{fb940ba6.a372c42d.js => fb940ba6.90b6bff2.js} | 2 +- assets/js/fd82f3a4.2b01ef8a.js | 1 - assets/js/fd82f3a4.e012512d.js | 1 + assets/js/{main.3da98d95.js => main.9070a6a9.js} | 4 ++-- ...d95.js.LICENSE.txt => main.9070a6a9.js.LICENSE.txt} | 0 assets/js/runtime~main.5f7b12ab.js | 1 + assets/js/runtime~main.ce5ae760.js | 1 - catalog/ai/compress-ml-models-for-inference/index.html | 10 +++++----- .../ai/efficent-format-for-model-training/index.html | 10 +++++----- catalog/ai/energy-efficent-ai-edge/index.html | 10 +++++----- catalog/ai/energy-efficent-framework/index.html | 10 +++++----- catalog/ai/energy-efficent-models/index.html | 10 +++++----- catalog/ai/index.html | 10 +++++----- catalog/ai/leverage-sustainable-regions/index.html | 10 +++++----- catalog/ai/pre-trained-transfer-learning/index.html | 10 +++++----- catalog/ai/right-hardware-type/index.html | 10 +++++----- catalog/ai/serverless-model-development/index.html | 10 +++++----- catalog/cloud/cache-static-data/index.html | 10 +++++----- .../cloud/choose-region-closest-to-users/index.html | 10 +++++----- catalog/cloud/compress-transmitted-data/index.html | 10 +++++----- .../cloud/delete-unused-storage-resources/index.html | 10 +++++----- .../evaluate-whether-to-use-TLS-termination/index.html | 10 +++++----- catalog/cloud/implement-stateless-design/index.html | 10 +++++----- catalog/cloud/index.html | 10 +++++----- catalog/cloud/match-slo/index.html | 10 +++++----- .../match-utilization-requirements-of-vm/index.html | 10 +++++----- .../index.html | 10 +++++----- .../cloud/minimizing-deployed-environments/index.html | 10 +++++----- .../optimise-storage-resource-utilisation/index.html | 10 +++++----- catalog/cloud/optimize-avg-cpu-utilization/index.html | 10 +++++----- .../optimize-impact-on-customer-equipment/index.html | 10 +++++----- catalog/cloud/optimize-peak-cpu-utilization/index.html | 10 +++++----- catalog/cloud/queue-non-urgent-requests/index.html | 10 +++++----- catalog/cloud/reduce-transmitted-data/index.html | 10 +++++----- catalog/cloud/remove-unused-assets/index.html | 10 +++++----- .../cloud/scale-down-kubernetes-workloads/index.html | 10 +++++----- .../index.html | 10 +++++----- catalog/cloud/scan-for-vulnerabilities/index.html | 10 +++++----- .../index.html | 10 +++++----- catalog/cloud/shed-lower-priority-traffic/index.html | 10 +++++----- .../cloud/time-shift-kubernetes-cron-jobs/index.html | 10 +++++----- catalog/cloud/use-circuit-breaker/index.html | 10 +++++----- .../index.html | 10 +++++----- catalog/cloud/use-serverless/index.html | 10 +++++----- catalog/index.html | 10 +++++----- .../web/avoid-chaining-critical-requests/index.html | 10 +++++----- catalog/web/avoid-excessive-dom-size/index.html | 10 +++++----- catalog/web/avoid-tracking-unnecessary-data/index.html | 10 +++++----- catalog/web/defer-offscreen-images/index.html | 10 +++++----- catalog/web/deprecate-gifs/index.html | 10 +++++----- catalog/web/enable-text-compression/index.html | 10 +++++----- catalog/web/index.html | 10 +++++----- catalog/web/keep-request-counts-low/index.html | 10 +++++----- catalog/web/minify-web-assets/index.html | 10 +++++----- catalog/web/minimize-main-thread-work/index.html | 10 +++++----- catalog/web/properly-sized-images/index.html | 10 +++++----- catalog/web/remove-unused-css/index.html | 10 +++++----- catalog/web/serve-images-in-modern-formats/index.html | 10 +++++----- guide/index.html | 10 +++++----- guide/initial-reviewer-guide/index.html | 10 +++++----- guide/sme-reviewer-guide/index.html | 10 +++++----- guide/suggested-tags/index.html | 10 +++++----- index.html | 10 +++++----- tags/ai/index.html | 8 ++++---- tags/cloud/index.html | 8 ++++---- tags/compute/index.html | 8 ++++---- tags/deployment/index.html | 8 ++++---- tags/index.html | 8 ++++---- tags/kubernetes/index.html | 8 ++++---- tags/machine-learning/index.html | 8 ++++---- tags/monitoring/index.html | 8 ++++---- tags/networking/index.html | 8 ++++---- tags/reliability-availability/index.html | 8 ++++---- tags/role-cloud-engineer/index.html | 8 ++++---- tags/role-data-scientist/index.html | 8 ++++---- tags/role-reliability-engineer/index.html | 8 ++++---- tags/role-software-engineer/index.html | 8 ++++---- tags/role-web-developer/index.html | 8 ++++---- tags/security/index.html | 8 ++++---- tags/serverless/index.html | 8 ++++---- tags/size-large/index.html | 8 ++++---- tags/size-medium/index.html | 8 ++++---- tags/size-small/index.html | 8 ++++---- tags/storage/index.html | 8 ++++---- tags/web/index.html | 8 ++++---- 185 files changed, 432 insertions(+), 432 deletions(-) create mode 100644 assets/js/007e88ba.0fb56621.js delete mode 100644 assets/js/007e88ba.f838c180.js create mode 100644 assets/js/0f563736.a023b345.js delete mode 100644 assets/js/0f563736.e945c3b6.js rename assets/js/{1388c4ac.dff5a9cc.js => 1388c4ac.8cc0e671.js} (84%) delete mode 100644 assets/js/16fb93b6.28e7671a.js create mode 100644 assets/js/16fb93b6.993c4352.js create mode 100644 assets/js/1ba1fdde.2b4c17a0.js delete mode 100644 assets/js/1ba1fdde.86e9596e.js delete mode 100644 assets/js/2bcf1a01.02c7e9cf.js create mode 100644 assets/js/2bcf1a01.6e8f8b94.js create mode 100644 assets/js/2ec3b088.914781f0.js delete mode 100644 assets/js/2ec3b088.bd573609.js rename assets/js/{356d1211.3d93446d.js => 356d1211.45896582.js} (51%) rename assets/js/{359b770c.ca537649.js => 359b770c.1d3d955c.js} (51%) rename assets/js/{3dd08d97.dafb331e.js => 3dd08d97.0b7ef328.js} (50%) create mode 100644 assets/js/3ea99f16.3205e3ac.js delete mode 100644 assets/js/3ea99f16.9e77d688.js delete mode 100644 assets/js/473c0143.1f434086.js create mode 100644 assets/js/473c0143.57a0bdd7.js create mode 100644 assets/js/48e9e5f1.33d97b0d.js delete mode 100644 assets/js/48e9e5f1.749d6abe.js create mode 100644 assets/js/4a01a261.7827a619.js delete mode 100644 assets/js/4a01a261.c19bb9f0.js delete mode 100644 assets/js/4bc4971a.0412a86b.js create mode 100644 assets/js/4bc4971a.33383340.js create mode 100644 assets/js/4edc808e.59e94125.js delete mode 100644 assets/js/4edc808e.71ad89e9.js delete mode 100644 assets/js/56c122aa.050a81ce.js create mode 100644 assets/js/56c122aa.98df1abc.js delete mode 100644 assets/js/5bdcc37f.07874b66.js create mode 100644 assets/js/5bdcc37f.fd13d075.js create mode 100644 assets/js/6e7c13c8.19bd2714.js delete mode 100644 assets/js/6e7c13c8.28f471e7.js create mode 100644 assets/js/717128d8.9c30be9b.js delete mode 100644 assets/js/717128d8.fd790493.js create mode 100644 assets/js/72b27058.6d5a0533.js delete mode 100644 assets/js/72b27058.77a103d0.js create mode 100644 assets/js/770c5109.454db8d0.js delete mode 100644 assets/js/770c5109.bc503c60.js delete mode 100644 assets/js/778078a6.2e2b8768.js create mode 100644 assets/js/778078a6.83182040.js delete mode 100644 assets/js/78f57216.0f15c0ed.js create mode 100644 assets/js/78f57216.4969e886.js create mode 100644 assets/js/7a11bfb9.244eda19.js delete mode 100644 assets/js/7a11bfb9.e4072bc6.js create mode 100644 assets/js/7d4685ea.1d0c3875.js delete mode 100644 assets/js/7d4685ea.ae64fc90.js delete mode 100644 assets/js/8002bf56.d2c0388f.js create mode 100644 assets/js/8002bf56.db7acfed.js create mode 100644 assets/js/836ef5f0.da45542c.js delete mode 100644 assets/js/836ef5f0.db5cf3bd.js create mode 100644 assets/js/8f91f489.4e27d9c9.js delete mode 100644 assets/js/8f91f489.e98c4381.js rename assets/js/{9209d359.3d600634.js => 9209d359.38961375.js} (84%) delete mode 100644 assets/js/93d64a37.93332187.js create mode 100644 assets/js/93d64a37.e2e63719.js create mode 100644 assets/js/957fd519.d5ee2d31.js delete mode 100644 assets/js/957fd519.f639f16e.js create mode 100644 assets/js/98ee5961.43a2fbfb.js delete mode 100644 assets/js/98ee5961.c2b6c365.js create mode 100644 assets/js/9e642b58.512315b8.js delete mode 100644 assets/js/9e642b58.e1aa676b.js create mode 100644 assets/js/a3d45d30.4a383e5f.js delete mode 100644 assets/js/a3d45d30.4e1854cd.js rename assets/js/{a4dfb062.67c2d527.js => a4dfb062.504bb07b.js} (82%) delete mode 100644 assets/js/a637ac13.310ea95b.js create mode 100644 assets/js/a637ac13.dd0d96f1.js delete mode 100644 assets/js/a829cb4e.3e2e1fd9.js create mode 100644 assets/js/a829cb4e.d7efb83e.js create mode 100644 assets/js/ab84bad5.90224f1b.js delete mode 100644 assets/js/ab84bad5.a9681b30.js create mode 100644 assets/js/b02fcbbe.1c38afe2.js delete mode 100644 assets/js/b02fcbbe.3b4970a4.js delete mode 100644 assets/js/b084ff01.6f5a1aa8.js create mode 100644 assets/js/b084ff01.bb761190.js rename assets/js/{b0cf2206.be33a4cf.js => b0cf2206.2cd8dc60.js} (78%) delete mode 100644 assets/js/b6af033a.b3a67d0e.js create mode 100644 assets/js/b6af033a.fad23e3f.js rename assets/js/{b8dc3674.2fb2ef93.js => b8dc3674.ac86471f.js} (50%) rename assets/js/{bf31d9bc.06bff309.js => bf31d9bc.dc180fea.js} (51%) delete mode 100644 assets/js/c0a2235c.2fec7948.js create mode 100644 assets/js/c0a2235c.d9df13ba.js delete mode 100644 assets/js/c5a0b084.39a0ffb0.js create mode 100644 assets/js/c5a0b084.db8d8eaf.js rename assets/js/{cc299ddb.fb3a6675.js => cc299ddb.eac8b84f.js} (52%) delete mode 100644 assets/js/e20ae084.36687c90.js create mode 100644 assets/js/e20ae084.92be8f04.js create mode 100644 assets/js/e450c455.2c604c6e.js delete mode 100644 assets/js/e450c455.e901e9f8.js create mode 100644 assets/js/f00aede0.32061047.js delete mode 100644 assets/js/f00aede0.f947b6c1.js create mode 100644 assets/js/f31c573f.bbd17bc6.js delete mode 100644 assets/js/f31c573f.dd8695e9.js rename assets/js/{f542e803.1dfe66b0.js => f542e803.0b0d2041.js} (53%) delete mode 100644 assets/js/f59c19d8.3cf4f21e.js create mode 100644 assets/js/f59c19d8.f040a789.js create mode 100644 assets/js/fada8994.6bb157d1.js delete mode 100644 assets/js/fada8994.6dacb172.js rename assets/js/{fb940ba6.a372c42d.js => fb940ba6.90b6bff2.js} (52%) delete mode 100644 assets/js/fd82f3a4.2b01ef8a.js create mode 100644 assets/js/fd82f3a4.e012512d.js rename assets/js/{main.3da98d95.js => main.9070a6a9.js} (96%) rename assets/js/{main.3da98d95.js.LICENSE.txt => main.9070a6a9.js.LICENSE.txt} (100%) create mode 100644 assets/js/runtime~main.5f7b12ab.js delete mode 100644 assets/js/runtime~main.ce5ae760.js diff --git a/404.html b/404.html index 73b7e099..4c011cdc 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/007e88ba.0fb56621.js b/assets/js/007e88ba.0fb56621.js new file mode 100644 index 00000000..8d79d1f0 --- /dev/null +++ b/assets/js/007e88ba.0fb56621.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7647],{4137:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>u});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),d=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=d(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)}},f=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),f=d(a),u=r,m=f["".concat(s,".").concat(u)]||f[u]||p[u]||o;return a?n.createElement(m,i(i({ref:t},c),{},{components:a})):n.createElement(m,i({ref:t},c))}));function u(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=f;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=a(7462),r=(a(7294),a(4137));const o={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",description:"Web pages offer a lot of images that aren't displayed on the first loaded screen and can thus be loaded dynamically.",tags:["web","role:web-developer","size:small"]},i="Defer offscreen images",l={unversionedId:"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.",source:"@site/docs/catalog/web/defer-offscreen-images.md",sourceDirName:"catalog/web",slug:"/catalog/web/defer-offscreen-images",permalink:"/catalog/web/defer-offscreen-images",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/defer-offscreen-images.md",tags:[{label:"web",permalink:"/tags/web"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2022-11-10T00:00:00.000Z",category:"web",description:"Web pages offer a lot of images that aren't displayed on the first loaded screen and can thus be loaded dynamically.",tags:["web","role:web-developer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Avoid tracking unnecessary data",permalink:"/catalog/web/avoid-tracking-unnecessary-data"},next:{title:"Deprecate GIFs for animated content",permalink:"/catalog/web/deprecate-gifs"}},s={},d=[{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:d};function p(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"defer-offscreen-images"},"Defer offscreen images"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"Web pages offer a lot of images that aren't displayed on the first loaded screen. They can also hide these images behind other interactions, like tabs and accordions. This content is dynamically displayed and therefore doesn't need to be loaded when it isn't displayed. "),(0,r.kt)("p",null,'The fact that images are loaded on-demand, only when they are about to be displayed, is often called "lazy-loading".'),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Use on demand loading for images which are unlikely to be displayed on first page load. This can be done via the newer browser attribute ",(0,r.kt)("inlineCode",{parentName:"p"},'loading="lazy"')," on the image tag and can also be ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/mfranzke/loading-attribute-polyfill"},"polyfilled")," for older browsers."),(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"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,r.kt)("p",null,"Using lazy loading of images will impact SCI as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"E"),": Images are only loaded when needed, saving bandwidth and processing power on the client and server, therefore reducing the energy required.")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"This assumes that the HTML for the image tags can be modified in the application")),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("p",null,"None"),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://web.dev/offscreen-images/"},"Detailed description"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/007e88ba.f838c180.js b/assets/js/007e88ba.f838c180.js deleted file mode 100644 index 73a684ba..00000000 --- a/assets/js/007e88ba.f838c180.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7647],{4137:(e,t,a)=>{a.d(t,{Zo:()=>c,kt:()=>u});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function o(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function i(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var s=n.createContext({}),d=function(e){var t=n.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):i(i({},t),e)),a},c=function(e){var t=d(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)}},f=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),f=d(a),u=r,m=f["".concat(s,".").concat(u)]||f[u]||p[u]||o;return a?n.createElement(m,i(i({ref:t},c),{},{components:a})):n.createElement(m,i({ref:t},c))}));function u(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=a.length,i=new Array(o);i[0]=f;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,i[1]=l;for(var d=2;d{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>d});var n=a(7462),r=(a(7294),a(4137));const o={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",description:"Web pages offer a lot of images that aren't displayed on the first loaded screen and can thus be loaded dynamically.",tags:["web","role:web-developer","size:small"]},i="Defer offscreen images",l={unversionedId:"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.",source:"@site/docs/catalog/web/defer-offscreen-images.md",sourceDirName:"catalog/web",slug:"/catalog/web/defer-offscreen-images",permalink:"/catalog/web/defer-offscreen-images",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/defer-offscreen-images.md",tags:[{label:"web",permalink:"/tags/web"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2022-11-10T00:00:00.000Z",category:"web",description:"Web pages offer a lot of images that aren't displayed on the first loaded screen and can thus be loaded dynamically.",tags:["web","role:web-developer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Avoid tracking unnecessary data",permalink:"/catalog/web/avoid-tracking-unnecessary-data"},next:{title:"Deprecate GIFs for animated content",permalink:"/catalog/web/deprecate-gifs"}},s={},d=[{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:d};function p(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},c,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"defer-offscreen-images"},"Defer offscreen images"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"Web pages offer a lot of images that aren't displayed on the first loaded screen. They can also hide these images behind other interactions, like tabs and accordions. This content is dynamically displayed and therefore doesn't need to be loaded when it isn't displayed. "),(0,r.kt)("p",null,'The fact that images are loaded on-demand, only when they are about to be displayed, is often called "lazy-loading".'),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Use on demand loading for images which are unlikely to be displayed on first page load. This can be done via the newer browser attribute ",(0,r.kt)("inlineCode",{parentName:"p"},'loading="lazy"')," on the image tag and can also be ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/mfranzke/loading-attribute-polyfill"},"polyfilled")," for older browsers."),(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"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,r.kt)("p",null,"Using lazy loading of images will impact SCI as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"E"),": Images are only loaded when needed, saving bandwidth and processing power on the client and server, therefore reducing the energy required.")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"This assumes that the HTML for the image tags can be modified in the application")),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("p",null,"None"),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://web.dev/offscreen-images/"},"Detailed description"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0f563736.a023b345.js b/assets/js/0f563736.a023b345.js new file mode 100644 index 00000000..6c227303 --- /dev/null +++ b/assets/js/0f563736.a023b345.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9692],{4137:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>m});var n=i(7294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function a(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function o(e){for(var t=1;t=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var l=n.createContext({}),c=function(e){var t=n.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},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 i=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(i),m=r,f=d["".concat(l,".").concat(m)]||d[m]||p[m]||a;return i?n.createElement(f,o(o({ref:t},u),{},{components:i})):n.createElement(f,o({ref:t},u))}));function m(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=i.length,o=new Array(a);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:r,o[1]=s;for(var c=2;c{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=i(7462),r=(i(7294),i(4137));const a={version:1,submitted_by:"danielmeixner",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["Cloud","Reliability/Availability","Monitoring"]},o="Match your service level objectives to business needs",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/match-slo.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/match-slo",permalink:"/catalog/cloud/match-slo",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/match-slo.md",tags:[{label:"Cloud",permalink:"/tags/cloud"},{label:"Reliability/Availability",permalink:"/tags/reliability-availability"},{label:"Monitoring",permalink:"/tags/monitoring"}],version:"current",frontMatter:{version:1,submitted_by:"danielmeixner",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["Cloud","Reliability/Availability","Monitoring"]},sidebar:"tutorialSidebar",previous:{title:"Implement stateless design",permalink:"/catalog/cloud/implement-stateless-design"},next:{title:"Match utilization requirements of virtual machines (VMs)",permalink:"/catalog/cloud/match-utilization-requirements-of-vm"}},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,...i}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"match-your-service-level-objectives-to-business-needs"},"Match your service level objectives to business needs"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"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."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Adjust your solution design to the service level your actual end users require."),(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)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"E"),": We reduce the total electricity required by reducing the number of infrastructure components running."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"M"),": Depending on the solution used it might also reduce the number of physical infrastructure components used.")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("p",null,"Suppose you offer a service level objective (SLO) for availability for your service. Engineering teams target to fulfill this objective and will try to exceed this service level objective. In some cases, engineering teams tend to strive for very sophisticated solutions to not run into any danger of falling below the SLO.\nHigh availability comes often for the cost of additional resources used, in the case of hot stand-by designs even with full duplication of infrastructure where half of the infrastructure is not even used.\nIdeally you validate the business reason for a specific SLO target and use it to design a solution that matches business requirements with a reasonable design for reliability and availability."),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"This can impact the end user experience negatively because you are working towards a specifc SLO instead of highest availability."),(0,r.kt)("li",{parentName:"ul"},"This can reduce overall cloud cost because you will use less resources.")),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Uptime"},"Uptime")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Availability_(system)"},"Availability")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Service-level_objective"},"Service Level Objective (SLO)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency/"},"Energy Efficiency Principle")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency/"},"Hardware Efficiency Principle"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/0f563736.e945c3b6.js b/assets/js/0f563736.e945c3b6.js deleted file mode 100644 index 8e7535c3..00000000 --- a/assets/js/0f563736.e945c3b6.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9692],{4137:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>f});var n=i(7294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function a(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function o(e){for(var t=1;t=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var l=n.createContext({}),c=function(e){var t=n.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},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 i=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),d=c(i),f=r,m=d["".concat(l,".").concat(f)]||d[f]||p[f]||a;return i?n.createElement(m,o(o({ref:t},u),{},{components:i})):n.createElement(m,o({ref:t},u))}));function f(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var a=i.length,o=new Array(a);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:r,o[1]=s;for(var c=2;c{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=i(7462),r=(i(7294),i(4137));const a={version:1,submitted_by:"danielmeixner",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["Cloud","Reliability/Availability","Monitoring"]},o="Match your service level objectives to business needs",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/match-slo.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/match-slo",permalink:"/catalog/cloud/match-slo",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/match-slo.md",tags:[{label:"Cloud",permalink:"/tags/cloud"},{label:"Reliability/Availability",permalink:"/tags/reliability-availability"},{label:"Monitoring",permalink:"/tags/monitoring"}],version:"current",frontMatter:{version:1,submitted_by:"danielmeixner",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["Cloud","Reliability/Availability","Monitoring"]},sidebar:"tutorialSidebar",previous:{title:"Implement stateless design",permalink:"/catalog/cloud/implement-stateless-design"},next:{title:"Match utilization requirements of virtual machines (VMs)",permalink:"/catalog/cloud/match-utilization-requirements-of-vm"}},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,...i}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"match-your-service-level-objectives-to-business-needs"},"Match your service level objectives to business needs"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"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."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Adjust your solution design to the service level your actual end users require."),(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)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"E"),": We reduce the total electricity required by reducing the number of infrastructure components running."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"M"),": Depending on the solution used it might also reduce the number of physical infrastructure components used.")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("p",null,"Suppose you offer a service level objective (SLO) for availability for your service. Engineering teams target to fulfill this objective and will try to exceed this service level objective. In some cases, engineering teams tend to strive for very sophisticated solutions to not run into any danger of falling below the SLO.\nHigh availability comes often for the cost of additional resources used, in the case of hot stand-by designs even with full duplication of infrastructure where half of the infrastructure is not even used.\nIdeally you validate the business reason for a specific SLO target and use it to design a solution that matches business requirements with a reasonable design for reliability and availability."),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"This can impact the end user experience negatively because you are working towards a specifc SLO instead of highest availability."),(0,r.kt)("li",{parentName:"ul"},"This can reduce overall cloud cost because you will use less resources.")),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Uptime"},"Uptime")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Availability_(system)"},"Availability")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Service-level_objective"},"Service Level Objective (SLO)")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency/"},"Energy Efficiency Principle")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency/"},"Hardware Efficiency Principle"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1388c4ac.dff5a9cc.js b/assets/js/1388c4ac.8cc0e671.js similarity index 84% rename from assets/js/1388c4ac.dff5a9cc.js rename to assets/js/1388c4ac.8cc0e671.js index c95b768c..9fc7e057 100644 --- a/assets/js/1388c4ac.dff5a9cc.js +++ b/assets/js/1388c4ac.8cc0e671.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5852],{9129:(e,t,a)=>{a.d(t,{b:()=>d,Z:()=>p});var r=a(7294);const n="container_yFwD",i="teamMember_Kw7v",l="avatar_j88W",c="name_MjYQ",s="role_RkEc",o="company_QP6n",m="social_fOOP";function d(e){let{children:t}=e;return r.createElement("div",{className:n},t)}function p(e){let{children:t,role:a,company:n,github:d,twitter:p,linkedin:u}=e;return r.createElement("div",{className:i},r.createElement("div",{className:l},r.createElement("img",{src:"https://github.com/"+d+".png",alt:"avatar"})),r.createElement("div",null,r.createElement("span",{className:c},t),r.createElement("span",{className:s},a),r.createElement("span",{className:o},"@",n),r.createElement("div",{className:m},d&&r.createElement("a",{href:"https://github.com/"+d,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 496 512",width:24},r.createElement("path",{fill:"currentColor",d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"}))),p&&r.createElement("a",{href:"https://twitter.com/"+p,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:24},r.createElement("path",{fill:"currentColor",d:"M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"}))),u&&r.createElement("a",{href:"https://www.linkedin.com/in/"+u,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",width:24},r.createElement("path",{fill:"currentColor",d:"M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"}))))))}},1545:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>s,toc:()=>m});var r=a(7462),n=(a(7294),a(4137)),i=a(9129);a(5944);const l={sidebar_position:5},c="Artificial Intelligence (AI)",s={unversionedId:"catalog/ai/index",id:"catalog/ai/index",title:"Artificial Intelligence (AI)",description:"Subject Matter Experts",source:"@site/docs/catalog/ai/index.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/",permalink:"/catalog/ai/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/ai/index.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Catalog",permalink:"/catalog/"},next:{title:"Optimize the size of AI/ML models",permalink:"/catalog/ai/compress-ml-models-for-inference"}},o={},m=[{value:"Subject Matter Experts",id:"subject-matter-experts",level:2}],d={toc:m};function p(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"artificial-intelligence-ai"},"Artificial Intelligence (AI)"),(0,n.kt)("h2",{id:"subject-matter-experts"},"Subject Matter Experts"),(0,n.kt)(i.b,{mdxType:"TeamMembers"},(0,n.kt)(i.Z,{github:"navveenb",mdxType:"TeamMember"},"Navveen Balani")))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5852],{9129:(e,t,a)=>{a.d(t,{b:()=>d,Z:()=>p});var r=a(7294);const n="container_yFwD",i="teamMember_Kw7v",l="avatar_j88W",c="name_MjYQ",s="role_RkEc",o="company_QP6n",m="social_fOOP";function d(e){let{children:t}=e;return r.createElement("div",{className:n},t)}function p(e){let{children:t,role:a,company:n,github:d,twitter:p,linkedin:u}=e;return r.createElement("div",{className:i},r.createElement("div",{className:l},r.createElement("img",{src:"https://github.com/"+d+".png",alt:"avatar"})),r.createElement("div",null,r.createElement("span",{className:c},t),r.createElement("span",{className:s},a),r.createElement("span",{className:o},"@",n),r.createElement("div",{className:m},d&&r.createElement("a",{href:"https://github.com/"+d,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 496 512",width:24},r.createElement("path",{fill:"currentColor",d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"}))),p&&r.createElement("a",{href:"https://twitter.com/"+p,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:24},r.createElement("path",{fill:"currentColor",d:"M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"}))),u&&r.createElement("a",{href:"https://www.linkedin.com/in/"+u,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",width:24},r.createElement("path",{fill:"currentColor",d:"M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"}))))))}},1545:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>c,default:()=>p,frontMatter:()=>l,metadata:()=>s,toc:()=>m});var r=a(7462),n=(a(7294),a(4137)),i=a(9129);a(5944);const l={sidebar_position:5},c="Artificial Intelligence (AI)",s={unversionedId:"catalog/ai/index",id:"catalog/ai/index",title:"Artificial Intelligence (AI)",description:"Subject Matter Experts",source:"@site/docs/catalog/ai/index.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/",permalink:"/catalog/ai/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/ai/index.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Catalog",permalink:"/catalog/"},next:{title:"Optimize the size of AI/ML models",permalink:"/catalog/ai/compress-ml-models-for-inference"}},o={},m=[{value:"Subject Matter Experts",id:"subject-matter-experts",level:2}],d={toc:m};function p(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"artificial-intelligence-ai"},"Artificial Intelligence (AI)"),(0,n.kt)("h2",{id:"subject-matter-experts"},"Subject Matter Experts"),(0,n.kt)(i.b,{mdxType:"TeamMembers"},(0,n.kt)(i.Z,{github:"navveenb",mdxType:"TeamMember"},"Navveen Balani")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/16fb93b6.28e7671a.js b/assets/js/16fb93b6.28e7671a.js deleted file mode 100644 index 682ab130..00000000 --- a/assets/js/16fb93b6.28e7671a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2677],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>m});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)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return a.createElement(a.Fragment,{},t)}},p=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"]),p=c(r),m=i,h=p["".concat(l,".").concat(m)]||p[m]||d[m]||n;return r?a.createElement(h,o(o({ref:t},u),{},{components:r})):a.createElement(h,o({ref:t},u))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);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:i,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var a=r(7462),i=(r(7294),r(4137));const n={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["cloud","compute","kubernetes","role:software-engineer","size:medium"]},o="Implement stateless design",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/implement-stateless-design.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/implement-stateless-design",permalink:"/catalog/cloud/implement-stateless-design",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/implement-stateless-design.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:"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:"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.",tags:["cloud","compute","kubernetes","role:software-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Terminate TLS at border gateway",permalink:"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},next:{title:"Match your service level objectives to business needs",permalink:"/catalog/cloud/match-slo"}},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,...r}=e;return(0,i.kt)("wrapper",(0,a.Z)({},u,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"implement-stateless-design"},"Implement stateless design"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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. "),(0,i.kt)("p",null,"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. "),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Remove state from your design to reduce the in-memory or on-disk data required by the workload to function, hence requiring smaller compute sizes for hosting."),(0,i.kt)("p",null,"State can be either externalized in a noSQL database or an in-memory cache service."),(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,"Implementing stateless design will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Rightsizing the compute VM increases its utilization and therefore its energy efficiency."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": Stateless applications require smaller compute VMs, which means lower total embodied carbon emissions.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"The application design supports externalization of state."),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"Follow the ",(0,i.kt)("a",{parentName:"p",href:"https://12factor.net/"},"The 12-factor app methodology")," to design stateless applications."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/16fb93b6.993c4352.js b/assets/js/16fb93b6.993c4352.js new file mode 100644 index 00000000..011a5ea0 --- /dev/null +++ b/assets/js/16fb93b6.993c4352.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2677],{4137:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});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},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 r=e.components,i=e.mdxType,n=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),p=c(r),m=i,h=p["".concat(l,".").concat(m)]||p[m]||u[m]||n;return r?a.createElement(h,o(o({ref:t},d),{},{components:r})):a.createElement(h,o({ref:t},d))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,o=new Array(n);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:i,o[1]=s;for(var c=2;c{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>n,metadata:()=>s,toc:()=>c});var a=r(7462),i=(r(7294),r(4137));const n={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["cloud","compute","kubernetes","role:software-engineer","size:medium"]},o="Implement stateless design",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/implement-stateless-design.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/implement-stateless-design",permalink:"/catalog/cloud/implement-stateless-design",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/implement-stateless-design.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:"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:"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.",tags:["cloud","compute","kubernetes","role:software-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Terminate TLS at border gateway",permalink:"/catalog/cloud/evaluate-whether-to-use-TLS-termination"},next:{title:"Match your service level objectives to business needs",permalink:"/catalog/cloud/match-slo"}},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,...r}=e;return(0,i.kt)("wrapper",(0,a.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"implement-stateless-design"},"Implement stateless design"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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. "),(0,i.kt)("p",null,"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. "),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Remove state from your design to reduce the in-memory or on-disk data required by the workload to function, hence requiring smaller compute sizes for hosting."),(0,i.kt)("p",null,"State can be either externalized in a noSQL database or an in-memory cache service."),(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,"Implementing stateless design will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Rightsizing the compute VM increases its utilization and therefore its energy efficiency."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": Stateless applications require smaller compute VMs, which means lower total embodied carbon emissions.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"The application design supports externalization of state."),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"Follow the ",(0,i.kt)("a",{parentName:"p",href:"https://12factor.net/"},"The 12-factor app methodology")," to design stateless applications."))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/1ba1fdde.2b4c17a0.js b/assets/js/1ba1fdde.2b4c17a0.js new file mode 100644 index 00000000..4215d60b --- /dev/null +++ b/assets/js/1ba1fdde.2b4c17a0.js @@ -0,0 +1 @@ +"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:"TBD",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:"TBD",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/1ba1fdde.86e9596e.js b/assets/js/1ba1fdde.86e9596e.js deleted file mode 100644 index 47536488..00000000 --- a/assets/js/1ba1fdde.86e9596e.js +++ /dev/null @@ -1 +0,0 @@ -"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 l(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 a(e){for(var r=1;r=0||(n[t]=e[t]);return n}(e,r);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(s=0;s=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(n[t]=e[t])}return n}var i=s.createContext({}),c=function(e){var r=s.useContext(i),t=r;return e&&(t="function"==typeof e?e(r):a(a({},r),e)),t},u=function(e){var r=c(e.components);return s.createElement(i.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,l=e.originalType,i=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=c(t),m=n,v=d["".concat(i,".").concat(m)]||d[m]||p[m]||l;return t?s.createElement(v,a(a({ref:r},u),{},{components:t})):s.createElement(v,a({ref:r},u))}));function m(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var l=t.length,a=new Array(l);a[0]=d;var o={};for(var i in r)hasOwnProperty.call(r,i)&&(o[i]=r[i]);o.originalType=e,o.mdxType="string"==typeof e?e:n,a[1]=o;for(var c=2;c{t.r(r),t.d(r,{assets:()=>i,contentTitle:()=>a,default:()=>p,frontMatter:()=>l,metadata:()=>o,toc:()=>c});var s=t(7462),n=(t(7294),t(4137));const l={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",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/green-software-patterns/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:"TBD",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: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/2bcf1a01.02c7e9cf.js b/assets/js/2bcf1a01.02c7e9cf.js deleted file mode 100644 index e7af6eb8..00000000 --- a/assets/js/2bcf1a01.02c7e9cf.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6686],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});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 s=r.createContext({}),c=function(e){var t=r.useContext(s),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(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),f=c(n),d=a,m=f["".concat(s,".").concat(d)]||f[d]||p[d]||i;return n?r.createElement(m,o(o({ref:t},u),{},{components:n})):r.createElement(m,o({ref:t},u))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.length,o=new Array(i);o[0]=f;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{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=n(7462),a=(n(7294),n(4137));const i={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",description:"Evaluate and use alternative, more energy efficient, models that provide similar functionality.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Use energy efficient AI/ML models",l={unversionedId:"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.",source:"@site/docs/catalog/ai/energy-efficent-models.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/energy-efficent-models",permalink:"/catalog/ai/energy-efficent-models",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/ai/energy-efficent-models.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",description:"Evaluate and use alternative, more energy efficient, models that provide similar functionality.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Select a more energy efficient AI/ML framework",permalink:"/catalog/ai/energy-efficent-framework"},next:{title:"Use sustainable regions for AI/ML training",permalink:"/catalog/ai/leverage-sustainable-regions"}},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,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"use-energy-efficient-aiml-models"},"Use energy efficient AI/ML models"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Large AI/ML and deep learning network models have a significant carbon footprint. Evaluate and use alternative, more energy efficient, models that provide similar functionality."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Evaluate energy efficient AI/ML models for development and inference. For example, DistilBERT provides similar functionality to the BERT model, running 60% faster while preserving 97% of BERT's performance. GPT-Neo 125M provides balanced results for energy consumption and accuracy compared to GPT-J 6B or GPT Neo 2.7B models."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Using energy efficient AI/ML models impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Having an energy-efficient AI/ML model would provide efficient resource utilization and reduces the energy consumption of the compute resources and consequently, the E number should decrease.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(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://blog.tensorflow.org/2020/05/how-hugging-face-achieved-2x-performance-boost-question-answering.html"},"DistilBERT")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/Green-Software-Foundation/eval_sci_of_foundation_models/blob/main/Report/SCI_Foundation_Models_Preliminary_Results.pdf"},"SCI Foundation Models Results"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2bcf1a01.6e8f8b94.js b/assets/js/2bcf1a01.6e8f8b94.js new file mode 100644 index 00000000..b28081b9 --- /dev/null +++ b/assets/js/2bcf1a01.6e8f8b94.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6686],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>d});var r=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 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||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),c=function(e){var t=r.useContext(s),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(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),f=c(n),d=i,m=f["".concat(s,".").concat(d)]||f[d]||p[d]||a;return n?r.createElement(m,o(o({ref:t},u),{},{components:n})):r.createElement(m,o({ref:t},u))}));function d(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=f;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{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var r=n(7462),i=(n(7294),n(4137));const a={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",description:"Evaluate and use alternative, more energy efficient, models that provide similar functionality.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Use energy efficient AI/ML models",l={unversionedId:"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.",source:"@site/docs/catalog/ai/energy-efficent-models.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/energy-efficent-models",permalink:"/catalog/ai/energy-efficent-models",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/ai/energy-efficent-models.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",description:"Evaluate and use alternative, more energy efficient, models that provide similar functionality.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Select a more energy efficient AI/ML framework",permalink:"/catalog/ai/energy-efficent-framework"},next:{title:"Use sustainable regions for AI/ML training",permalink:"/catalog/ai/leverage-sustainable-regions"}},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,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"use-energy-efficient-aiml-models"},"Use energy efficient AI/ML models"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Large AI/ML and deep learning network models have a significant carbon footprint. Evaluate and use alternative, more energy efficient, models that provide similar functionality."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Evaluate energy efficient AI/ML models for development and inference. For example, DistilBERT provides similar functionality to the BERT model, running 60% faster while preserving 97% of BERT's performance. GPT-Neo 125M provides balanced results for energy consumption and accuracy compared to GPT-J 6B or GPT Neo 2.7B models."),(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)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,i.kt)("p",null,"Using energy efficient AI/ML models impacts SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Having an energy-efficient AI/ML model would provide efficient resource utilization and reduces the energy consumption of the compute resources and consequently, the E number should decrease.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"None "),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"None"),(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://blog.tensorflow.org/2020/05/how-hugging-face-achieved-2x-performance-boost-question-answering.html"},"DistilBERT")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/Green-Software-Foundation/eval_sci_of_foundation_models/blob/main/Report/SCI_Foundation_Models_Preliminary_Results.pdf"},"SCI Foundation Models Results"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2ec3b088.914781f0.js b/assets/js/2ec3b088.914781f0.js new file mode 100644 index 00000000..9a7a134e --- /dev/null +++ b/assets/js/2ec3b088.914781f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2351],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var r=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 s(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 a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),d=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=d(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)}},u=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,s=e.originalType,l=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),u=d(n),m=i,f=u["".concat(l,".").concat(m)]||u[m]||p[m]||s;return n?r.createElement(f,a(a({ref:t},c),{},{components:n})):r.createElement(f,a({ref:t},c))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var s=n.length,a=new Array(s);a[0]=u;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o.mdxType="string"==typeof e?e:i,a[1]=o;for(var d=2;d{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var r=n(7462),i=(n(7294),n(4137));const s={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",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.",tags:["size:small","role:web-developer","web"]},a="Remove unused CSS definitions",o={unversionedId:"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.",source:"@site/docs/catalog/web/remove-unused-css.md",sourceDirName:"catalog/web",slug:"/catalog/web/remove-unused-css",permalink:"/catalog/web/remove-unused-css",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/remove-unused-css.md",tags:[{label:"size:small",permalink:"/tags/size-small"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"web",permalink:"/tags/web"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2022-11-10T00:00:00.000Z",category:"web",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.",tags:["size:small","role:web-developer","web"]},sidebar:"tutorialSidebar",previous:{title:"Optimize image size",permalink:"/catalog/web/properly-sized-images"},next:{title:"Serve images in modern formats",permalink:"/catalog/web/serve-images-in-modern-formats"}},l={},d=[{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:d};function p(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"remove-unused-css-definitions"},"Remove unused CSS definitions"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Cascading Style Sheets (CSS) allow HTML content to be styled in a very exact way. In order to have this flexibility, the CSS files are very complex and need energy intensive parsing and processing. The browser needs to download all specified CSS files, process all definitions inside these files, apply it to the DOM and calculate the layout for rendering. Each added CSS definition increases the amount of time and processing power needed in this process."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Remove all unused CSS definitions if they aren't used on the website at all. Also consider combining multiple CSS files into one file to reduce the amount of requests, and therefore time, the browser needs to retrieve all CSS definitions at once."),(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,"Removing unused CSS definitions will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Reduces the processing, memory and bandwidth requirements to display the page and therefore the energy requirements.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"None"),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Depending on the web page, consider crafting specialized CSS files for landing pages or highly frequented web pages. This also makes sense if a landing page has a completely different layout as the rest of the web page.")),(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://web.dev/unused-css-rules/"},"Unused CSS Rules reference"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/2ec3b088.bd573609.js b/assets/js/2ec3b088.bd573609.js deleted file mode 100644 index 8359f406..00000000 --- a/assets/js/2ec3b088.bd573609.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2351],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>m});var r=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 s(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 a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),d=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=d(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)}},u=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,s=e.originalType,l=e.parentName,c=o(e,["components","mdxType","originalType","parentName"]),u=d(n),m=i,f=u["".concat(l,".").concat(m)]||u[m]||p[m]||s;return n?r.createElement(f,a(a({ref:t},c),{},{components:n})):r.createElement(f,a({ref:t},c))}));function m(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var s=n.length,a=new Array(s);a[0]=u;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o.mdxType="string"==typeof e?e:i,a[1]=o;for(var d=2;d{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>o,toc:()=>d});var r=n(7462),i=(n(7294),n(4137));const s={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",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.",tags:["size:small","role:web-developer","web"]},a="Remove unused CSS definitions",o={unversionedId:"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.",source:"@site/docs/catalog/web/remove-unused-css.md",sourceDirName:"catalog/web",slug:"/catalog/web/remove-unused-css",permalink:"/catalog/web/remove-unused-css",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/remove-unused-css.md",tags:[{label:"size:small",permalink:"/tags/size-small"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"web",permalink:"/tags/web"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2022-11-10T00:00:00.000Z",category:"web",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.",tags:["size:small","role:web-developer","web"]},sidebar:"tutorialSidebar",previous:{title:"Optimize image size",permalink:"/catalog/web/properly-sized-images"},next:{title:"Serve images in modern formats",permalink:"/catalog/web/serve-images-in-modern-formats"}},l={},d=[{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:d};function p(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"remove-unused-css-definitions"},"Remove unused CSS definitions"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Cascading Style Sheets (CSS) allow HTML content to be styled in a very exact way. In order to have this flexibility, the CSS files are very complex and need energy intensive parsing and processing. The browser needs to download all specified CSS files, process all definitions inside these files, apply it to the DOM and calculate the layout for rendering. Each added CSS definition increases the amount of time and processing power needed in this process."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Remove all unused CSS definitions if they aren't used on the website at all. Also consider combining multiple CSS files into one file to reduce the amount of requests, and therefore time, the browser needs to retrieve all CSS definitions at once."),(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,"Removing unused CSS definitions will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Reduces the processing, memory and bandwidth requirements to display the page and therefore the energy requirements.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"None"),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Depending on the web page, consider crafting specialized CSS files for landing pages or highly frequented web pages. This also makes sense if a landing page has a completely different layout as the rest of the web page.")),(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://web.dev/unused-css-rules/"},"Unused CSS Rules reference"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/356d1211.3d93446d.js b/assets/js/356d1211.45896582.js similarity index 51% rename from assets/js/356d1211.3d93446d.js rename to assets/js/356d1211.45896582.js index 3d0b95ef..4a995963 100644 --- a/assets/js/356d1211.3d93446d.js +++ b/assets/js/356d1211.45896582.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7904],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var r=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 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||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}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)},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,i=e.mdxType,a=e.originalType,l=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=c(n),b=i,f=d["".concat(l,".").concat(b)]||d[b]||p[b]||a;return n?r.createElement(f,s(s({ref:t},u),{},{components:n})):r.createElement(f,s({ref:t},u))}));function b(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,s=new Array(a);s[0]=d;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o.mdxType="string"==typeof e?e:i,s[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var r=n(7462),i=(n(7294),n(4137));const a={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",description:"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.",tags:["web","role:web-developer","size:small"]},s="Minify web assets",o={unversionedId:"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.",source:"@site/docs/catalog/web/minify-web-assets.md",sourceDirName:"catalog/web",slug:"/catalog/web/minify-web-assets",permalink:"/catalog/web/minify-web-assets",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/minify-web-assets.md",tags:[{label:"web",permalink:"/tags/web"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"web",description:"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.",tags:["web","role:web-developer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Keep request counts low",permalink:"/catalog/web/keep-request-counts-low"},next:{title:"Minimize main thread work",permalink:"/catalog/web/minimize-main-thread-work"}},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,i.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"minify-web-assets"},"Minify web assets"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"A web page comprises various assets, such as HTML, CSS, JavaScript, and third-party libraries like jQuery, Bootstrap etc. Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Minify web assets to reduce page size and network bandwidth while delivering the content. At scale, even a small reduction in size can have a significant impact."),(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,"Minifying web assets will impact the SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Minifying web assets can reduce the size of the web page and lead to a reduction in network bytes during the transfer of content. The browser/device would take less energy to render the content. This should reduce the energy consumption of your web page.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"None "),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"None"),(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://web.dev/unminified-css/"},"Minify CSS")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://web.dev/unminified-javascript/"},"Minify JavaScript"))))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7904],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var r=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 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||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}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)},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,i=e.mdxType,a=e.originalType,l=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),d=c(n),b=i,f=d["".concat(l,".").concat(b)]||d[b]||p[b]||a;return n?r.createElement(f,s(s({ref:t},u),{},{components:n})):r.createElement(f,s({ref:t},u))}));function b(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,s=new Array(a);s[0]=d;var o={};for(var l in t)hasOwnProperty.call(t,l)&&(o[l]=t[l]);o.originalType=e,o.mdxType="string"==typeof e?e:i,s[1]=o;for(var c=2;c{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>c});var r=n(7462),i=(n(7294),n(4137));const a={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",description:"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.",tags:["web","role:web-developer","size:small"]},s="Minify web assets",o={unversionedId:"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.",source:"@site/docs/catalog/web/minify-web-assets.md",sourceDirName:"catalog/web",slug:"/catalog/web/minify-web-assets",permalink:"/catalog/web/minify-web-assets",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/minify-web-assets.md",tags:[{label:"web",permalink:"/tags/web"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"web",description:"Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser.",tags:["web","role:web-developer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Keep request counts low",permalink:"/catalog/web/keep-request-counts-low"},next:{title:"Minimize main thread work",permalink:"/catalog/web/minimize-main-thread-work"}},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,i.kt)("wrapper",(0,r.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"minify-web-assets"},"Minify web assets"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"A web page comprises various assets, such as HTML, CSS, JavaScript, and third-party libraries like jQuery, Bootstrap etc. Minification removes unnecessary or redundant data without affecting how the resource is processed by the web browser."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Minify web assets to reduce page size and network bandwidth while delivering the content. At scale, even a small reduction in size can have a significant impact."),(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,"Minifying web assets will impact the SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Minifying web assets can reduce the size of the web page and lead to a reduction in network bytes during the transfer of content. The browser/device would take less energy to render the content. This should reduce the energy consumption of your web page.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"None "),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"None"),(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://web.dev/unminified-css/"},"Minify CSS")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://web.dev/unminified-javascript/"},"Minify JavaScript"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/359b770c.ca537649.js b/assets/js/359b770c.1d3d955c.js similarity index 51% rename from assets/js/359b770c.ca537649.js rename to assets/js/359b770c.1d3d955c.js index ba5047da..f6b1b127 100644 --- a/assets/js/359b770c.ca537649.js +++ b/assets/js/359b770c.1d3d955c.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 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},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=i(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,s(s({ref:t},u),{},{components:n})):a.createElement(b,s({ref:t},u))}));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:()=>d,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/green-software-patterns/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 down kubernetes applications when not in use",permalink:"/catalog/cloud/scale-down-kubernetes-workloads"},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:()=>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 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},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=i(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,s(s({ref:t},u),{},{components:n})):a.createElement(b,s({ref:t},u))}));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:()=>d,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 down kubernetes applications when not in use",permalink:"/catalog/cloud/scale-down-kubernetes-workloads"},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 diff --git a/assets/js/3dd08d97.dafb331e.js b/assets/js/3dd08d97.0b7ef328.js similarity index 50% rename from assets/js/3dd08d97.dafb331e.js rename to assets/js/3dd08d97.0b7ef328.js index 4f854e2e..e690343f 100644 --- a/assets/js/3dd08d97.dafb331e.js +++ b/assets/js/3dd08d97.0b7ef328.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8751],{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:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["storage","role:cloud-engineer","size:small"]},i="Set storage retention policies",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/set-retention-policy-on-storage-resources.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/set-retention-policy-on-storage-resources",permalink:"/catalog/cloud/set-retention-policy-on-storage-resources",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/set-retention-policy-on-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 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.",tags:["storage","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Scan for vulnerabilities",permalink:"/catalog/cloud/scan-for-vulnerabilities"},next:{title:"Shed lower priority traffic",permalink:"/catalog/cloud/shed-lower-priority-traffic"}},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:"set-storage-retention-policies"},"Set storage retention policies"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"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. "),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"Set a retention policy on storage resources to automate the deletion of unused storage resources. "),(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,"Setting a retention policy 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, we reduce the total embodied carbon.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"If we choose not to delete ",(0,n.kt)("em",{parentName:"li"},"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 set a retention policy that automatically deletes and keeps storage resources based on business needs. ")),(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"},"If a retention policy on the storage resources is undefined, there is more overhead for manually deleting idle resources. ")),(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 +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8751],{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:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["storage","role:cloud-engineer","size:small"]},i="Set storage retention policies",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/set-retention-policy-on-storage-resources.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/set-retention-policy-on-storage-resources",permalink:"/catalog/cloud/set-retention-policy-on-storage-resources",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/set-retention-policy-on-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 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.",tags:["storage","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Scan for vulnerabilities",permalink:"/catalog/cloud/scan-for-vulnerabilities"},next:{title:"Shed lower priority traffic",permalink:"/catalog/cloud/shed-lower-priority-traffic"}},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:"set-storage-retention-policies"},"Set storage retention policies"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"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. "),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"Set a retention policy on storage resources to automate the deletion of unused storage resources. "),(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,"Setting a retention policy 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, we reduce the total embodied carbon.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"If we choose not to delete ",(0,n.kt)("em",{parentName:"li"},"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 set a retention policy that automatically deletes and keeps storage resources based on business needs. ")),(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"},"If a retention policy on the storage resources is undefined, there is more overhead for manually deleting idle resources. ")),(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/3ea99f16.3205e3ac.js b/assets/js/3ea99f16.3205e3ac.js new file mode 100644 index 00000000..3ce5f088 --- /dev/null +++ b/assets/js/3ea99f16.3205e3ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6330],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});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},p=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)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),f=a,h=u["".concat(l,".").concat(f)]||u[f]||d[f]||i;return r?n.createElement(h,o(o({ref:t},p),{},{components:r})):n.createElement(h,o({ref:t},p))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=u;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:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Select the right hardware/VM instance types for AI/ML training",s={unversionedId:"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.",source:"@site/docs/catalog/ai/right-hardware-type.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/right-hardware-type",permalink:"/catalog/ai/right-hardware-type",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/ai/right-hardware-type.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Leverage pre-trained models and transfer learning for AI/ML development",permalink:"/catalog/ai/pre-trained-transfer-learning"},next:{title:"Adopt serverless architecture for AI/ML workload processes",permalink:"/catalog/ai/serverless-model-development"}},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}],p={toc:c};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"select-the-right-hardwarevm-instance-types-for-aiml-training"},"Select the right hardware/VM instance types for AI/ML training"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Training an AI model has a significant carbon footprint. 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. For instance, custom application-specific integrated circuits (ASICs) and field-programmable gate arrays (FPGAs) are provided or supported by cloud vendors which provide better energy efficiency and inference for AI models than conventional chips. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Evaluate and leverage the right hardware/VM instance types for training and inference of AI/ML development."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Selecting the right hardware/VM types impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": The right hardware/VM type provides better energy efficiency and inference for AI models, reducing the energy consumption of your AI/ML processes overall."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of servers required to run a process, the total embodied carbon is lower.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(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://arxiv.org/pdf/1906.02243.pdf"},"Energy and Policy Considerations for Deep Learning in NLP")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/machine-learning/v1/how-to-deploy-fpga-web-service"},"Deploy ML models to field-programmable gate arrays (FPGAs) with Azure Machine Learning")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://cloud.google.com/blog/products/gcp/quantifying-the-performance-of-the-tpu-our-first-machine-learning-chip"},"Quantifying the performance of the TPU, our first machine learning chip"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/3ea99f16.9e77d688.js b/assets/js/3ea99f16.9e77d688.js deleted file mode 100644 index 7bfb55be..00000000 --- a/assets/js/3ea99f16.9e77d688.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6330],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>f});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},p=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)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(r),f=a,h=d["".concat(l,".").concat(f)]||d[f]||u[f]||i;return r?n.createElement(h,o(o({ref:t},p),{},{components:r})):n.createElement(h,o({ref:t},p))}));function f(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 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:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Select the right hardware/VM instance types for AI/ML training",s={unversionedId:"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.",source:"@site/docs/catalog/ai/right-hardware-type.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/right-hardware-type",permalink:"/catalog/ai/right-hardware-type",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/ai/right-hardware-type.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Leverage pre-trained models and transfer learning for AI/ML development",permalink:"/catalog/ai/pre-trained-transfer-learning"},next:{title:"Adopt serverless architecture for AI/ML workload processes",permalink:"/catalog/ai/serverless-model-development"}},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}],p={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"select-the-right-hardwarevm-instance-types-for-aiml-training"},"Select the right hardware/VM instance types for AI/ML training"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Training an AI model has a significant carbon footprint. 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. For instance, custom application-specific integrated circuits (ASICs) and field-programmable gate arrays (FPGAs) are provided or supported by cloud vendors which provide better energy efficiency and inference for AI models than conventional chips. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Evaluate and leverage the right hardware/VM instance types for training and inference of AI/ML development."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Selecting the right hardware/VM types impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": The right hardware/VM type provides better energy efficiency and inference for AI models, reducing the energy consumption of your AI/ML processes overall."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of servers required to run a process, the total embodied carbon is lower.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(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://arxiv.org/pdf/1906.02243.pdf"},"Energy and Policy Considerations for Deep Learning in NLP")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/machine-learning/v1/how-to-deploy-fpga-web-service"},"Deploy ML models to field-programmable gate arrays (FPGAs) with Azure Machine Learning")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://cloud.google.com/blog/products/gcp/quantifying-the-performance-of-the-tpu-our-first-machine-learning-chip"},"Quantifying the performance of the TPU, our first machine learning chip"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/473c0143.1f434086.js b/assets/js/473c0143.1f434086.js deleted file mode 100644 index bccca10e..00000000 --- a/assets/js/473c0143.1f434086.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4601],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var r=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 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||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=u(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)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=u(n),d=i,f=m["".concat(l,".").concat(d)]||m[d]||p[d]||a;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));function d(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=m;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 u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var r=n(7462),i=(n(7294),n(4137));const a={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["cloud","role:cloud-engineer","size:small"]},o="Queue non-urgent processing requests",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/queue-non-urgent-requests.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/queue-non-urgent-requests",permalink:"/catalog/cloud/queue-non-urgent-requests",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/queue-non-urgent-requests.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{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:"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.",tags:["cloud","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Optimize peak CPU utilization",permalink:"/catalog/cloud/optimize-peak-cpu-utilization"},next:{title:"Reduce transmitted data",permalink:"/catalog/cloud/reduce-transmitted-data"}},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 p(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"queue-non-urgent-processing-requests"},"Queue non-urgent processing requests"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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. "),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Utilize a message queue so requests that do not require immediate processing are queued. "),(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,"Queuing non-urgent requests will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": By reducing the total number of idle resources, less total electricity is required."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of computing equipment required, the total embodied carbon is lower.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"There is an assumption that the components in your system can communicate with a message queue asynchronously. If your component is the producer, it can add requests to the queue without waiting for the previous sent to be processed. If your component is the consumer, it will only process requests when they are available. We assume that no components in the system ever stalled while waiting for another. "),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"Decoupling components of your system can introduce unnecessary complexity and managing a message queue might mean additional overheads. As such, you should give careful consideration as to whether a message queue is appropriate."),(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.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency/"},"Hardware Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aws.amazon.com/message-queue/"},"Message Queue")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/optimize-software-and-architecture-for-asynchronous-and-scheduled-jobs.html"},"Optimise software and architecture for asynchronous and scheduled jobs"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/473c0143.57a0bdd7.js b/assets/js/473c0143.57a0bdd7.js new file mode 100644 index 00000000..139853cc --- /dev/null +++ b/assets/js/473c0143.57a0bdd7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4601],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var r=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 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||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var l=r.createContext({}),u=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=u(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)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),m=u(n),d=i,f=m["".concat(l,".").concat(d)]||m[d]||p[d]||a;return n?r.createElement(f,o(o({ref:t},c),{},{components:n})):r.createElement(f,o({ref:t},c))}));function d(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=m;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 u=2;u{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var r=n(7462),i=(n(7294),n(4137));const a={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["cloud","role:cloud-engineer","size:small"]},o="Queue non-urgent processing requests",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/queue-non-urgent-requests.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/queue-non-urgent-requests",permalink:"/catalog/cloud/queue-non-urgent-requests",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/queue-non-urgent-requests.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{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:"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.",tags:["cloud","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Optimize peak CPU utilization",permalink:"/catalog/cloud/optimize-peak-cpu-utilization"},next:{title:"Reduce transmitted data",permalink:"/catalog/cloud/reduce-transmitted-data"}},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 p(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"queue-non-urgent-processing-requests"},"Queue non-urgent processing requests"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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. "),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Utilize a message queue so requests that do not require immediate processing are queued. "),(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,"Queuing non-urgent requests will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": By reducing the total number of idle resources, less total electricity is required."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of computing equipment required, the total embodied carbon is lower.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"There is an assumption that the components in your system can communicate with a message queue asynchronously. If your component is the producer, it can add requests to the queue without waiting for the previous sent to be processed. If your component is the consumer, it will only process requests when they are available. We assume that no components in the system ever stalled while waiting for another. "),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"Decoupling components of your system can introduce unnecessary complexity and managing a message queue might mean additional overheads. As such, you should give careful consideration as to whether a message queue is appropriate."),(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.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency/"},"Hardware Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aws.amazon.com/message-queue/"},"Message Queue")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/optimize-software-and-architecture-for-asynchronous-and-scheduled-jobs.html"},"Optimise software and architecture for asynchronous and scheduled jobs"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/48e9e5f1.33d97b0d.js b/assets/js/48e9e5f1.33d97b0d.js new file mode 100644 index 00000000..9817231e --- /dev/null +++ b/assets/js/48e9e5f1.33d97b0d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7538],{4137:(e,r,i)=>{i.d(r,{Zo:()=>d,kt:()=>f});var t=i(7294);function n(e,r,i){return r in e?Object.defineProperty(e,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[r]=i,e}function a(e,r){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),i.push.apply(i,t)}return i}function o(e){for(var r=1;r=0||(n[i]=e[i]);return n}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(n[i]=e[i])}return n}var l=t.createContext({}),c=function(e){var r=t.useContext(l),i=r;return e&&(i="function"==typeof e?e(r):o(o({},r),e)),i},d=function(e){var r=c(e.components);return t.createElement(l.Provider,{value:r},e.children)},u={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},p=t.forwardRef((function(e,r){var i=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),p=c(i),f=n,h=p["".concat(l,".").concat(f)]||p[f]||u[f]||a;return i?t.createElement(h,o(o({ref:r},d),{},{components:i})):t.createElement(h,o({ref:r},d))}));function f(e,r){var i=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var a=i.length,o=new Array(a);o[0]=p;var s={};for(var l in r)hasOwnProperty.call(r,l)&&(s[l]=r[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,o[1]=s;for(var c=2;c{i.r(r),i.d(r,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var t=i(7462),n=(i(7294),i(4137));const a={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["compute","monitoring","reliability-availability","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:large"]},o="Shed lower priority traffic",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/shed-lower-priority-traffic.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/shed-lower-priority-traffic",permalink:"/catalog/cloud/shed-lower-priority-traffic",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/shed-lower-priority-traffic.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"monitoring",permalink:"/tags/monitoring"},{label:"reliability-availability",permalink:"/tags/reliability-availability"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"role:reliability-engineer",permalink:"/tags/role-reliability-engineer"},{label:"size:large",permalink:"/tags/size-large"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["compute","monitoring","reliability-availability","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:large"]},sidebar:"tutorialSidebar",previous:{title:"Set storage retention policies",permalink:"/catalog/cloud/set-retention-policy-on-storage-resources"},next:{title:"Time-shift Kubernetes cron jobs",permalink:"/catalog/cloud/time-shift-kubernetes-cron-jobs"}},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:r,...i}=e;return(0,n.kt)("wrapper",(0,t.Z)({},d,i,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"shed-lower-priority-traffic"},"Shed lower priority traffic"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"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."),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"From an energy efficiency perspective, shedding lower priority traffic during high traffic and high carbon intensity periods will reduce the overall energy required to support traffic. "),(0,n.kt)("p",null,"From a hardware efficiency perspective, shedding lower priority traffic during high traffic and high carbon intensity periods will reduce the total number of hardware resources needed to support traffic. "),(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,"Optimizing peak CPU utilization will impact SCI as follows:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"E"),": Shedding traffic means your system is handling fewer requests, resulting in lower energy requirements. "),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"M"),": Shedding traffic means fewer hardware resources are needed to handle it, resulting in lower embodied carbon requirements to support the system.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("p",null,"Your traffic must be prioritized and identified so that you can programmatically determine which can be shed and which is critical for system functionality. "),(0,n.kt)("h2",{id:"considerations"},"Considerations"),(0,n.kt)("p",null,'Consider having an exponential shedding policy that increases shedding exponentially as traffic climbs. This will help reduce the impact of traffic with high variance "spikes".'),(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://github.com/Green-Software-Foundation/green-software-patterns/issues/43"},"https://github.com/Green-Software-Foundation/green-software-patterns/issues/43")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://aws.amazon.com/builders-library/using-load-shedding-to-avoid-overload/"},"Using load shedding to avoid overload"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/48e9e5f1.749d6abe.js b/assets/js/48e9e5f1.749d6abe.js deleted file mode 100644 index e8a37b59..00000000 --- a/assets/js/48e9e5f1.749d6abe.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7538],{4137:(e,r,i)=>{i.d(r,{Zo:()=>d,kt:()=>f});var t=i(7294);function n(e,r,i){return r in e?Object.defineProperty(e,r,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[r]=i,e}function a(e,r){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);r&&(t=t.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),i.push.apply(i,t)}return i}function o(e){for(var r=1;r=0||(n[i]=e[i]);return n}(e,r);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(t=0;t=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(n[i]=e[i])}return n}var l=t.createContext({}),c=function(e){var r=t.useContext(l),i=r;return e&&(i="function"==typeof e?e(r):o(o({},r),e)),i},d=function(e){var r=c(e.components);return t.createElement(l.Provider,{value:r},e.children)},u={inlineCode:"code",wrapper:function(e){var r=e.children;return t.createElement(t.Fragment,{},r)}},p=t.forwardRef((function(e,r){var i=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),p=c(i),f=n,h=p["".concat(l,".").concat(f)]||p[f]||u[f]||a;return i?t.createElement(h,o(o({ref:r},d),{},{components:i})):t.createElement(h,o({ref:r},d))}));function f(e,r){var i=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var a=i.length,o=new Array(a);o[0]=p;var s={};for(var l in r)hasOwnProperty.call(r,l)&&(s[l]=r[l]);s.originalType=e,s.mdxType="string"==typeof e?e:n,o[1]=s;for(var c=2;c{i.r(r),i.d(r,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var t=i(7462),n=(i(7294),i(4137));const a={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["compute","monitoring","reliability-availability","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:large"]},o="Shed lower priority traffic",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/shed-lower-priority-traffic.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/shed-lower-priority-traffic",permalink:"/catalog/cloud/shed-lower-priority-traffic",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/shed-lower-priority-traffic.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"monitoring",permalink:"/tags/monitoring"},{label:"reliability-availability",permalink:"/tags/reliability-availability"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"role:reliability-engineer",permalink:"/tags/role-reliability-engineer"},{label:"size:large",permalink:"/tags/size-large"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["compute","monitoring","reliability-availability","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:large"]},sidebar:"tutorialSidebar",previous:{title:"Set storage retention policies",permalink:"/catalog/cloud/set-retention-policy-on-storage-resources"},next:{title:"Time-shift Kubernetes cron jobs",permalink:"/catalog/cloud/time-shift-kubernetes-cron-jobs"}},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:r,...i}=e;return(0,n.kt)("wrapper",(0,t.Z)({},d,i,{components:r,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"shed-lower-priority-traffic"},"Shed lower priority traffic"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"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."),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"From an energy efficiency perspective, shedding lower priority traffic during high traffic and high carbon intensity periods will reduce the overall energy required to support traffic. "),(0,n.kt)("p",null,"From a hardware efficiency perspective, shedding lower priority traffic during high traffic and high carbon intensity periods will reduce the total number of hardware resources needed to support traffic. "),(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,"Optimizing peak CPU utilization will impact SCI as follows:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"E"),": Shedding traffic means your system is handling fewer requests, resulting in lower energy requirements. "),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"M"),": Shedding traffic means fewer hardware resources are needed to handle it, resulting in lower embodied carbon requirements to support the system.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("p",null,"Your traffic must be prioritized and identified so that you can programmatically determine which can be shed and which is critical for system functionality. "),(0,n.kt)("h2",{id:"considerations"},"Considerations"),(0,n.kt)("p",null,'Consider having an exponential shedding policy that increases shedding exponentially as traffic climbs. This will help reduce the impact of traffic with high variance "spikes".'),(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://github.com/Green-Software-Foundation/green-software-patterns/issues/43"},"https://github.com/Green-Software-Foundation/green-software-patterns/issues/43")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"https://aws.amazon.com/builders-library/using-load-shedding-to-avoid-overload/"},"Using load shedding to avoid overload"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4a01a261.7827a619.js b/assets/js/4a01a261.7827a619.js new file mode 100644 index 00000000..612f4ee0 --- /dev/null +++ b/assets/js/4a01a261.7827a619.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5497],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=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 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 o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}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},p=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)}},d=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(r),m=i,f=d["".concat(l,".").concat(m)]||d[m]||u[m]||a;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);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:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(7462),i=(r(7294),r(4137));const a={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",description:"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.",tags:["ai","machine-learning","serverless","role:data-scientist","size:small"]},o="Adopt serverless architecture for AI/ML workload processes",s={unversionedId:"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.",source:"@site/docs/catalog/ai/serverless-model-development.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/serverless-model-development",permalink:"/catalog/ai/serverless-model-development",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/ai/serverless-model-development.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"serverless",permalink:"/tags/serverless"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",description:"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.",tags:["ai","machine-learning","serverless","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Select the right hardware/VM instance types for AI/ML training",permalink:"/catalog/ai/right-hardware-type"},next:{title:"Cloud",permalink:"/catalog/cloud/"}},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}],p={toc:c};function u(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"adopt-serverless-architecture-for-aiml-workload-processes"},"Adopt serverless architecture for AI/ML workload processes"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Building an ML model requires a series of steps, such as building a data pipeline for data capture, data cleansing, feature generation, and running multiple training iterations and experiments to get the desired accuracy. All of these steps take significant computing resources that need to be optimized for efficient utilization."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Adopt a serverless architecture for maximum resource utilization for your entire AI/ML model development process like data pipeline, training and experiments. Going serverless ensures the resources are launched only when required. "),(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)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,i.kt)("p",null,"For the SCI equation, adopting serverless architecture for AI/ML workload process would impact the following:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": A serverless architecture for the AI/ML development process provides efficient resource utilization and reduces the energy consumption of the compute resources."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": A serverless architecture for the AI/ML development process would lead to effective hardware utilization as the resources would be provisioned only when required.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"None"),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"Evaluate and consider what AI/ML workloads can be moved to serverless. Consider if your application can afford cold start during serverless resource initialization."),(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://cloud.google.com/blog/products/ai-machine-learning/serverless-machine-learning-pipelines-on-google-cloud"},"Serverless Pipeline on Google Cloud")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aws.amazon.com/blogs/machine-learning/machine-learning-inference-at-scale-using-aws-serverless/"},"Machine learning inference at scale using AWS serverless"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4a01a261.c19bb9f0.js b/assets/js/4a01a261.c19bb9f0.js deleted file mode 100644 index b36695e3..00000000 --- a/assets/js/4a01a261.c19bb9f0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5497],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>m});var n=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 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 o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}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},p=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)}},d=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(r),m=i,f=d["".concat(l,".").concat(m)]||d[m]||u[m]||a;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);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:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(7462),i=(r(7294),r(4137));const a={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",description:"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.",tags:["ai","machine-learning","serverless","role:data-scientist","size:small"]},o="Adopt serverless architecture for AI/ML workload processes",s={unversionedId:"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.",source:"@site/docs/catalog/ai/serverless-model-development.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/serverless-model-development",permalink:"/catalog/ai/serverless-model-development",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/ai/serverless-model-development.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"serverless",permalink:"/tags/serverless"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",description:"Building an ML model takes significant computing resources that need to be optimized for efficient utilization.",tags:["ai","machine-learning","serverless","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Select the right hardware/VM instance types for AI/ML training",permalink:"/catalog/ai/right-hardware-type"},next:{title:"Cloud",permalink:"/catalog/cloud/"}},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}],p={toc:c};function u(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"adopt-serverless-architecture-for-aiml-workload-processes"},"Adopt serverless architecture for AI/ML workload processes"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Building an ML model requires a series of steps, such as building a data pipeline for data capture, data cleansing, feature generation, and running multiple training iterations and experiments to get the desired accuracy. All of these steps take significant computing resources that need to be optimized for efficient utilization."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Adopt a serverless architecture for maximum resource utilization for your entire AI/ML model development process like data pipeline, training and experiments. Going serverless ensures the resources are launched only when required. "),(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)("p",null,(0,i.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,i.kt)("p",null,"For the SCI equation, adopting serverless architecture for AI/ML workload process would impact the following:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": A serverless architecture for the AI/ML development process provides efficient resource utilization and reduces the energy consumption of the compute resources."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": A serverless architecture for the AI/ML development process would lead to effective hardware utilization as the resources would be provisioned only when required.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"None"),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("p",null,"Evaluate and consider what AI/ML workloads can be moved to serverless. Consider if your application can afford cold start during serverless resource initialization."),(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://cloud.google.com/blog/products/ai-machine-learning/serverless-machine-learning-pipelines-on-google-cloud"},"Serverless Pipeline on Google Cloud")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://aws.amazon.com/blogs/machine-learning/machine-learning-inference-at-scale-using-aws-serverless/"},"Machine learning inference at scale using AWS serverless"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4bc4971a.0412a86b.js b/assets/js/4bc4971a.0412a86b.js deleted file mode 100644 index 3f682084..00000000 --- a/assets/js/4bc4971a.0412a86b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1938],{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,f=p["".concat(l,".").concat(m)]||p[m]||d[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]=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:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["networking","role:cloud-engineer","size:small"]},o="Reduce transmitted data",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/reduce-transmitted-data.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/reduce-transmitted-data",permalink:"/catalog/cloud/reduce-transmitted-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/reduce-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 minimize 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:"Queue non-urgent processing requests",permalink:"/catalog/cloud/queue-non-urgent-requests"},next:{title:"Remove unused assets",permalink:"/catalog/cloud/remove-unused-assets"}},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:"reduce-transmitted-data"},"Reduce transmitted data"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"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. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Minimize the size of data transmitted by only sending properties or values deemed necessary. "),(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 size of data 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. "),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total size of data stored, the total embodied carbon is lower.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Suppose we choose to transfer data (e.g. payloads) to the client side as it is because some properties or values may be needed later. A better solution would be to consider curating the data set, ensuring only necessary properties are sent across the network so the overall network traffic is reduced. In many use cases, certain properties or values can be correlated later. ")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Another consideration is that different data formats will affect the overall network traffic depending on their size. For example, Protobuf is much more compact than XML. "))),(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 we minimize the data set by taking away properties or values, there may be overhead to corelate the missing properties or values.")),(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"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4bc4971a.33383340.js b/assets/js/4bc4971a.33383340.js new file mode 100644 index 00000000..fe845894 --- /dev/null +++ b/assets/js/4bc4971a.33383340.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1938],{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,f=p["".concat(l,".").concat(m)]||p[m]||d[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]=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:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["networking","role:cloud-engineer","size:small"]},o="Reduce transmitted data",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/reduce-transmitted-data.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/reduce-transmitted-data",permalink:"/catalog/cloud/reduce-transmitted-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/reduce-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 minimize 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:"Queue non-urgent processing requests",permalink:"/catalog/cloud/queue-non-urgent-requests"},next:{title:"Remove unused assets",permalink:"/catalog/cloud/remove-unused-assets"}},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:"reduce-transmitted-data"},"Reduce transmitted data"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"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. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Minimize the size of data transmitted by only sending properties or values deemed necessary. "),(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 size of data 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. "),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total size of data stored, the total embodied carbon is lower.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Suppose we choose to transfer data (e.g. payloads) to the client side as it is because some properties or values may be needed later. A better solution would be to consider curating the data set, ensuring only necessary properties are sent across the network so the overall network traffic is reduced. In many use cases, certain properties or values can be correlated later. ")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("p",{parentName:"li"},"Another consideration is that different data formats will affect the overall network traffic depending on their size. For example, Protobuf is much more compact than XML. "))),(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 we minimize the data set by taking away properties or values, there may be overhead to corelate the missing properties or values.")),(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"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/4edc808e.59e94125.js b/assets/js/4edc808e.59e94125.js new file mode 100644 index 00000000..3dc2ec04 --- /dev/null +++ b/assets/js/4edc808e.59e94125.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4173],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,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},p=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)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),m=a,f=u["".concat(l,".").concat(m)]||u[m]||d[m]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));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]=u;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.d(t,{b:()=>d,Z:()=>u});var n=r(7294);const a="container_yFwD",i="teamMember_Kw7v",o="avatar_j88W",s="name_MjYQ",l="role_RkEc",c="company_QP6n",p="social_fOOP";function d(e){let{children:t}=e;return n.createElement("div",{className:a},t)}function u(e){let{children:t,role:r,company:a,github:d,twitter:u,linkedin:m}=e;return n.createElement("div",{className:i},n.createElement("div",{className:o},n.createElement("img",{src:"https://github.com/"+d+".png",alt:"avatar"})),n.createElement("div",null,n.createElement("span",{className:s},t),n.createElement("span",{className:l},r),n.createElement("span",{className:c},"@",a),n.createElement("div",{className:p},d&&n.createElement("a",{href:"https://github.com/"+d,target:"_blank",rel:"noopener noreferrer"},n.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 496 512",width:24},n.createElement("path",{fill:"currentColor",d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"}))),u&&n.createElement("a",{href:"https://twitter.com/"+u,target:"_blank",rel:"noopener noreferrer"},n.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:24},n.createElement("path",{fill:"currentColor",d:"M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"}))),m&&n.createElement("a",{href:"https://www.linkedin.com/in/"+m,target:"_blank",rel:"noopener noreferrer"},n.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",width:24},n.createElement("path",{fill:"currentColor",d:"M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"}))))))}},1211:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>p});var n=r(7462),a=(r(7294),r(4137)),i=r(9129);const o={sidebar_position:1,description:"An online open-source database of green software patterns reviewed and curated by the Green Software Foundation"},s="Green Software Patterns",l={unversionedId:"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",source:"@site/docs/index.mdx",sourceDirName:".",slug:"/",permalink:"/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/index.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,description:"An online open-source database of green software patterns reviewed and curated by the Green Software Foundation"},sidebar:"tutorialSidebar",next:{title:"Guide",permalink:"/guide/"}},c={},p=[{value:"Summary",id:"summary",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Quick Links",id:"quick-links",level:2},{value:"Principles, Patterns, and Practices",id:"principles-patterns-and-practices",level:2},{value:"Core Team",id:"core-team",level:3},{value:"Advisors",id:"advisors",level:3}],d={toc:p};function u(e){let{components:t,...o}=e;return(0,a.kt)("wrapper",(0,n.Z)({},d,o,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"green-software-patterns"},"Green Software Patterns"),(0,a.kt)("div",{class:"intro-logo"},(0,a.kt)("img",{src:"/img/logo.svg",alt:"logo"})),(0,a.kt)("br",null),(0,a.kt)("h2",{id:"summary"},"Summary"),(0,a.kt)("p",null,"An online open-source database of software patterns reviewed and curated by the Green Software Foundation across a wide range of categories. You can be confident that applying any of our published and live patterns will reduce your software emissions."),(0,a.kt)("p",null,"Any software practitioner can find the patterns related to their field, technology, or domain. Anyone can submit a pattern that triggers a detailed review process by the Foundation."),(0,a.kt)("h2",{id:"getting-started"},"Getting Started"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Learn what constitutes a pattern and how to ",(0,a.kt)("a",{parentName:"li",href:"/guide"},"contribute")," a new one or edit an existing one."),(0,a.kt)("li",{parentName:"ul"},"View the ",(0,a.kt)("a",{parentName:"li",href:"/catalog/"},"catalog")," of patterns.")),(0,a.kt)("h2",{id:"quick-links"},"Quick Links"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/Green-Software-Foundation/pr-faqs/blob/main/live/green-software-patterns.pr-faq.md"},"Press Release FAQ")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://patterns.greensoftware.foundation"},"Main Website")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/Green-Software-Foundation/green-software-patterns"},"Main GitHub Repository"))),(0,a.kt)("h2",{id:"principles-patterns-and-practices"},"Principles, Patterns, and Practices"),(0,a.kt)("p",null,"The ",(0,a.kt)("a",{parentName:"p",href:"https://learn.greensoftware.foundation/practitioner/introduction"},(0,a.kt)("strong",{parentName:"a"},"principles"))," of green software outline a core set of competencies needed to define, run and build green software."),(0,a.kt)("p",null,"A green software ",(0,a.kt)("strong",{parentName:"p"},"pattern")," is a specific example of how to apply one or more principles in a real-world example. Whereas principles describe the theory that underpins green software, patterns are the practical advice software practitioners can use in their software applications today. Patterns are vendor-neutral."),(0,a.kt)("p",null,"A green software ",(0,a.kt)("strong",{parentName:"p"},"practice")," is a pattern applied to a specific vendor's product and informs practitioners about how to use that product in a more sustainable way."),(0,a.kt)("p",null,"Practices should refer to patterns that should refer to principles."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Green Software Principles, Patterns, and Practices",src:r(8546).Z,title:"Green Software Principles, Patterns, and Practices",width:"1920",height:"1080"})),(0,a.kt)("h3",{id:"core-team"},"Core Team"),(0,a.kt)(i.b,{mdxType:"TeamMembers"},(0,a.kt)(i.Z,{role:"Project Manager",company:"GSF",github:"holanita",mdxType:"TeamMember"},"Anita Holczmann"),(0,a.kt)(i.Z,{role:"Project Lead",company:"Microsoft",github:"dubrie",twitter:"dubrie",linkedin:"dubrie",mdxType:"TeamMember"},"Bill Johnson"),(0,a.kt)(i.Z,{role:"Project Principle ",company:"Goldman Sachs",github:"greenhsu123",twitter:"greenhsu123",linkedin:"greenhsu123",mdxType:"TeamMember"},"Sarah Hsu")),(0,a.kt)("h3",{id:"advisors"},"Advisors"),(0,a.kt)("p",null,"Advisors are associated with the project and may perform tasks related to the project."),(0,a.kt)(i.b,{mdxType:"TeamMembers"},(0,a.kt)(i.Z,{role:"Project Advisor",company:"GSF",github:"jawache",twitter:"jawache",linkedin:"jawache",mdxType:"TeamMember"},"Asim Hussain")))}u.isMDXComponent=!0},8546:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/GSF_Principles_Patterns_Practices_v2-c5e2753b6270473d1da02b97a1321d51.png"}}]); \ No newline at end of file diff --git a/assets/js/4edc808e.71ad89e9.js b/assets/js/4edc808e.71ad89e9.js deleted file mode 100644 index b01453eb..00000000 --- a/assets/js/4edc808e.71ad89e9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4173],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,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 o(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||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=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):i(i({},t),e)),r},p=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)}},u=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),u=c(r),m=a,f=u["".concat(l,".").concat(m)]||u[m]||d[m]||o;return r?n.createElement(f,i(i({ref:t},p),{},{components:r})):n.createElement(f,i({ref:t},p))}));function m(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=u;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,i[1]=s;for(var c=2;c{r.d(t,{b:()=>d,Z:()=>u});var n=r(7294);const a="container_yFwD",o="teamMember_Kw7v",i="avatar_j88W",s="name_MjYQ",l="role_RkEc",c="company_QP6n",p="social_fOOP";function d(e){let{children:t}=e;return n.createElement("div",{className:a},t)}function u(e){let{children:t,role:r,company:a,github:d,twitter:u,linkedin:m}=e;return n.createElement("div",{className:o},n.createElement("div",{className:i},n.createElement("img",{src:"https://github.com/"+d+".png",alt:"avatar"})),n.createElement("div",null,n.createElement("span",{className:s},t),n.createElement("span",{className:l},r),n.createElement("span",{className:c},"@",a),n.createElement("div",{className:p},d&&n.createElement("a",{href:"https://github.com/"+d,target:"_blank",rel:"noopener noreferrer"},n.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 496 512",width:24},n.createElement("path",{fill:"currentColor",d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"}))),u&&n.createElement("a",{href:"https://twitter.com/"+u,target:"_blank",rel:"noopener noreferrer"},n.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:24},n.createElement("path",{fill:"currentColor",d:"M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"}))),m&&n.createElement("a",{href:"https://www.linkedin.com/in/"+m,target:"_blank",rel:"noopener noreferrer"},n.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",width:24},n.createElement("path",{fill:"currentColor",d:"M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"}))))))}},1211:(e,t,r)=>{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>p});var n=r(7462),a=(r(7294),r(4137)),o=r(9129);const i={sidebar_position:1,description:"An online open-source database of green software patterns reviewed and curated by the Green Software Foundation"},s="Green Software Patterns",l={unversionedId:"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",source:"@site/docs/index.mdx",sourceDirName:".",slug:"/",permalink:"/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/index.mdx",tags:[],version:"current",sidebarPosition:1,frontMatter:{sidebar_position:1,description:"An online open-source database of green software patterns reviewed and curated by the Green Software Foundation"},sidebar:"tutorialSidebar",next:{title:"Guide",permalink:"/guide/"}},c={},p=[{value:"Summary",id:"summary",level:2},{value:"Getting Started",id:"getting-started",level:2},{value:"Quick Links",id:"quick-links",level:2},{value:"Principles, Patterns, and Practices",id:"principles-patterns-and-practices",level:2},{value:"Core Team",id:"core-team",level:3},{value:"Advisors",id:"advisors",level:3}],d={toc:p};function u(e){let{components:t,...i}=e;return(0,a.kt)("wrapper",(0,n.Z)({},d,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"green-software-patterns"},"Green Software Patterns"),(0,a.kt)("div",{class:"intro-logo"},(0,a.kt)("img",{src:"/img/logo.svg",alt:"logo"})),(0,a.kt)("br",null),(0,a.kt)("h2",{id:"summary"},"Summary"),(0,a.kt)("p",null,"An online open-source database of software patterns reviewed and curated by the Green Software Foundation across a wide range of categories. You can be confident that applying any of our published and live patterns will reduce your software emissions."),(0,a.kt)("p",null,"Any software practitioner can find the patterns related to their field, technology, or domain. Anyone can submit a pattern that triggers a detailed review process by the Foundation."),(0,a.kt)("h2",{id:"getting-started"},"Getting Started"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Learn what constitutes a pattern and how to ",(0,a.kt)("a",{parentName:"li",href:"/guide"},"contribute")," a new one or edit an existing one."),(0,a.kt)("li",{parentName:"ul"},"View the ",(0,a.kt)("a",{parentName:"li",href:"/catalog/"},"catalog")," of patterns.")),(0,a.kt)("h2",{id:"quick-links"},"Quick Links"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/Green-Software-Foundation/pr-faqs/blob/main/live/green-software-patterns.pr-faq.md"},"Press Release FAQ")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://patterns.greensoftware.foundation"},"Main Website")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://github.com/Green-Software-Foundation/green-software-patterns"},"Main GitHub Repository"))),(0,a.kt)("h2",{id:"principles-patterns-and-practices"},"Principles, Patterns, and Practices"),(0,a.kt)("p",null,"The ",(0,a.kt)("a",{parentName:"p",href:"https://learn.greensoftware.foundation/practitioner/introduction"},(0,a.kt)("strong",{parentName:"a"},"principles"))," of green software outline a core set of competencies needed to define, run and build green software."),(0,a.kt)("p",null,"A green software ",(0,a.kt)("strong",{parentName:"p"},"pattern")," is a specific example of how to apply one or more principles in a real-world example. Whereas principles describe the theory that underpins green software, patterns are the practical advice software practitioners can use in their software applications today. Patterns are vendor-neutral."),(0,a.kt)("p",null,"A green software ",(0,a.kt)("strong",{parentName:"p"},"practice")," is a pattern applied to a specific vendor's product and informs practitioners about how to use that product in a more sustainable way."),(0,a.kt)("p",null,"Practices should refer to patterns that should refer to principles."),(0,a.kt)("p",null,(0,a.kt)("img",{alt:"Green Software Principles, Patterns, and Practices",src:r(8546).Z,title:"Green Software Principles, Patterns, and Practices",width:"1920",height:"1080"})),(0,a.kt)("h3",{id:"core-team"},"Core Team"),(0,a.kt)(o.b,{mdxType:"TeamMembers"},(0,a.kt)(o.Z,{role:"Project Manager",company:"GSF",github:"holanita",mdxType:"TeamMember"},"Anita Holczmann"),(0,a.kt)(o.Z,{role:"Project Lead",company:"Microsoft",github:"dubrie",twitter:"dubrie",linkedin:"dubrie",mdxType:"TeamMember"},"Bill Johnson"),(0,a.kt)(o.Z,{role:"Project Principle ",company:"Goldman Sachs",github:"greenhsu123",twitter:"greenhsu123",linkedin:"greenhsu123",mdxType:"TeamMember"},"Sarah Hsu")),(0,a.kt)("h3",{id:"advisors"},"Advisors"),(0,a.kt)("p",null,"Advisors are associated with the project and may perform tasks related to the project."),(0,a.kt)(o.b,{mdxType:"TeamMembers"},(0,a.kt)(o.Z,{role:"Project Advisor",company:"GSF",github:"jawache",twitter:"jawache",linkedin:"jawache",mdxType:"TeamMember"},"Asim Hussain")))}u.isMDXComponent=!0},8546:(e,t,r)=>{r.d(t,{Z:()=>n});const n=r.p+"assets/images/GSF_Principles_Patterns_Practices_v2-c5e2753b6270473d1da02b97a1321d51.png"}}]); \ No newline at end of file diff --git a/assets/js/56c122aa.050a81ce.js b/assets/js/56c122aa.050a81ce.js deleted file mode 100644 index c1b90401..00000000 --- a/assets/js/56c122aa.050a81ce.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1286],{4137:(e,r,t)=>{t.d(r,{Zo:()=>d,kt:()=>m});var n=t(7294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function o(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=n.createContext({}),c=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):o(o({},r),e)),t},d=function(e){var r=c(e.components);return n.createElement(s.Provider,{value:r},e.children)},p={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},u=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),u=c(t),m=a,f=u["".concat(s,".").concat(m)]||u[m]||p[m]||i;return t?n.createElement(f,o(o({ref:r},d),{},{components:t})):n.createElement(f,o({ref:r},d))}));function m(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=u;var l={};for(var s in r)hasOwnProperty.call(r,s)&&(l[s]=r[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=t(7462),a=(t(7294),t(4137));const i={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Leverage pre-trained models and transfer learning for AI/ML development",l={unversionedId:"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.",source:"@site/docs/catalog/ai/pre-trained-transfer-learning.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/pre-trained-transfer-learning",permalink:"/catalog/ai/pre-trained-transfer-learning",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/ai/pre-trained-transfer-learning.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Use sustainable regions for AI/ML training",permalink:"/catalog/ai/leverage-sustainable-regions"},next:{title:"Select the right hardware/VM instance types for AI/ML training",permalink:"/catalog/ai/right-hardware-type"}},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}],d={toc:c};function p(e){let{components:r,...t}=e;return(0,a.kt)("wrapper",(0,n.Z)({},d,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"leverage-pre-trained-models-and-transfer-learning-for-aiml-development"},"Leverage pre-trained models and transfer learning for AI/ML development"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Training an AI model has a significant carbon footprint. 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. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Evaluate and select pre-trained models and use transfer learning to avoid training a new model from scratch. "),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Leveraging a pre-trained model would impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Having a pre-trained model reduces energy consumption for your AI/ML development as you don\u2019t need to train the entire model from scratch."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": Transfer learning does not require as many servers as you don\u2019t need to train the entire model from scratch. By reducing the total number of servers required to run a process, the total embodied carbon is lower.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(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://www.tensorflow.org/tutorials/images/transfer_learning"},"Transfer learning and fine-tuning"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/56c122aa.98df1abc.js b/assets/js/56c122aa.98df1abc.js new file mode 100644 index 00000000..f4a5ed9c --- /dev/null +++ b/assets/js/56c122aa.98df1abc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1286],{4137:(e,r,t)=>{t.d(r,{Zo:()=>c,kt:()=>m});var n=t(7294);function a(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function o(e){for(var r=1;r=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=n.createContext({}),d=function(e){var r=n.useContext(s),t=r;return e&&(t="function"==typeof e?e(r):o(o({},r),e)),t},c=function(e){var r=d(e.components);return n.createElement(s.Provider,{value:r},e.children)},p={inlineCode:"code",wrapper:function(e){var r=e.children;return n.createElement(n.Fragment,{},r)}},u=n.forwardRef((function(e,r){var t=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=d(t),m=a,f=u["".concat(s,".").concat(m)]||u[m]||p[m]||i;return t?n.createElement(f,o(o({ref:r},c),{},{components:t})):n.createElement(f,o({ref:r},c))}));function m(e,r){var t=arguments,a=r&&r.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=u;var l={};for(var s in r)hasOwnProperty.call(r,s)&&(l[s]=r[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var d=2;d{t.r(r),t.d(r,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>d});var n=t(7462),a=(t(7294),t(4137));const i={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Leverage pre-trained models and transfer learning for AI/ML development",l={unversionedId:"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.",source:"@site/docs/catalog/ai/pre-trained-transfer-learning.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/pre-trained-transfer-learning",permalink:"/catalog/ai/pre-trained-transfer-learning",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/ai/pre-trained-transfer-learning.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Use sustainable regions for AI/ML training",permalink:"/catalog/ai/leverage-sustainable-regions"},next:{title:"Select the right hardware/VM instance types for AI/ML training",permalink:"/catalog/ai/right-hardware-type"}},s={},d=[{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:d};function p(e){let{components:r,...t}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,t,{components:r,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"leverage-pre-trained-models-and-transfer-learning-for-aiml-development"},"Leverage pre-trained models and transfer learning for AI/ML development"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Training an AI model has a significant carbon footprint. 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. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Evaluate and select pre-trained models and use transfer learning to avoid training a new model from scratch. "),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Leveraging a pre-trained model would impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Having a pre-trained model reduces energy consumption for your AI/ML development as you don\u2019t need to train the entire model from scratch."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": Transfer learning does not require as many servers as you don\u2019t need to train the entire model from scratch. By reducing the total number of servers required to run a process, the total embodied carbon is lower.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(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://www.tensorflow.org/tutorials/images/transfer_learning"},"Transfer learning and fine-tuning"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5bdcc37f.07874b66.js b/assets/js/5bdcc37f.07874b66.js deleted file mode 100644 index e5feb7bb..00000000 --- a/assets/js/5bdcc37f.07874b66.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2949],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});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({}),u=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),f=u(r),d=o,m=f["".concat(l,".").concat(d)]||f[d]||s[d]||a;return r?n.createElement(m,i(i({ref:t},p),{},{components:r})):n.createElement(m,i({ref:t},p))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:o,i[1]=c;for(var u=2;u{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>s,frontMatter:()=>a,metadata:()=>c,toc:()=>u});var n=r(7462),o=(r(7294),r(4137));const a={sidebar_position:3},i="Catalog",c={unversionedId:"catalog/index",id:"catalog/index",title:"Catalog",description:"",source:"@site/docs/catalog/index.md",sourceDirName:"catalog",slug:"/catalog/",permalink:"/catalog/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/index.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Subject Matter Expert (SME) Review Guide",permalink:"/guide/sme-reviewer-guide"},next:{title:"Artificial Intelligence (AI)",permalink:"/catalog/ai/"}},l={},u=[],p={toc:u};function s(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"catalog"},"Catalog"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/5bdcc37f.fd13d075.js b/assets/js/5bdcc37f.fd13d075.js new file mode 100644 index 00000000..673d20c6 --- /dev/null +++ b/assets/js/5bdcc37f.fd13d075.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2949],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>d});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 o(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||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var l=n.createContext({}),u=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(l.Provider,{value:t},e.children)},s={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,o=e.originalType,l=e.parentName,p=c(e,["components","mdxType","originalType","parentName"]),f=u(r),d=a,m=f["".concat(l,".").concat(d)]||f[d]||s[d]||o;return r?n.createElement(m,i(i({ref:t},p),{},{components:r})):n.createElement(m,i({ref:t},p))}));function d(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=r.length,i=new Array(o);i[0]=f;var c={};for(var l in t)hasOwnProperty.call(t,l)&&(c[l]=t[l]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var u=2;u{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>s,frontMatter:()=>o,metadata:()=>c,toc:()=>u});var n=r(7462),a=(r(7294),r(4137));const o={sidebar_position:3},i="Catalog",c={unversionedId:"catalog/index",id:"catalog/index",title:"Catalog",description:"",source:"@site/docs/catalog/index.md",sourceDirName:"catalog",slug:"/catalog/",permalink:"/catalog/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/index.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Subject Matter Expert (SME) Review Guide",permalink:"/guide/sme-reviewer-guide"},next:{title:"Artificial Intelligence (AI)",permalink:"/catalog/ai/"}},l={},u=[],p={toc:u};function s(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"catalog"},"Catalog"))}s.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6e7c13c8.19bd2714.js b/assets/js/6e7c13c8.19bd2714.js new file mode 100644 index 00000000..26898d1e --- /dev/null +++ b/assets/js/6e7c13c8.19bd2714.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7821],{4137:(e,t,a)=>{a.d(t,{Zo:()=>s,kt:()=>c});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),u=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},s=function(e){var t=u(e.components);return r.createElement(p.Provider,{value:t},e.children)},g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,s=o(e,["components","mdxType","originalType","parentName"]),m=u(a),c=n,d=m["".concat(p,".").concat(c)]||m[c]||g[c]||i;return a?r.createElement(d,l(l({ref:t},s),{},{components:a})):r.createElement(d,l({ref:t},s))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:n,l[1]=o;for(var u=2;u{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>u});var r=a(7462),n=(a(7294),a(4137));const i={sidebar_position:3},l="Suggested Tags",o={unversionedId:"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.",source:"@site/docs/guide/suggested-tags.md",sourceDirName:"guide",slug:"/guide/suggested-tags",permalink:"/guide/suggested-tags",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/guide/suggested-tags.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Guide",permalink:"/guide/"},next:{title:"Initial Review Guide",permalink:"/guide/initial-reviewer-guide"}},p={},u=[{value:"Technology",id:"technology",level:2},{value:"Role",id:"role",level:2},{value:"Complexity",id:"complexity",level:2}],s={toc:u};function g(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},s,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"suggested-tags"},"Suggested Tags"),(0,n.kt)("p",null,"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."),(0,n.kt)("h2",{id:"technology"},"Technology"),(0,n.kt)("p",null,"Which technology does this pattern align to? "),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Alerting"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/ai"},"Artificial Intelligence")),(0,n.kt)("li",{parentName:"ul"},"Augmented Reality"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/cloud"},"Cloud")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/compute"},"Compute")),(0,n.kt)("li",{parentName:"ul"},"Content Delivery/CDN"),(0,n.kt)("li",{parentName:"ul"},"Database"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/deployment"},"Deployment")),(0,n.kt)("li",{parentName:"ul"},"DevOps"),(0,n.kt)("li",{parentName:"ul"},"Gaming"),(0,n.kt)("li",{parentName:"ul"},"Internet of Things"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/kubernetes"},"Kubernetes")),(0,n.kt)("li",{parentName:"ul"},"Logging"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/machine-learning"},"Machine Learning")),(0,n.kt)("li",{parentName:"ul"},"Mobile"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/monitoring"},"Monitoring")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/networking"},"Networking")),(0,n.kt)("li",{parentName:"ul"},"Operating Systems"),(0,n.kt)("li",{parentName:"ul"},"Programming Language"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/reliability-availability/"},"Reliability/Availability")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/security"},"Security")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/serverless"},"Serverless")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/storage"},"Storage")),(0,n.kt)("li",{parentName:"ul"},"User Experience"),(0,n.kt)("li",{parentName:"ul"},"User Interface"),(0,n.kt)("li",{parentName:"ul"},"Virtual Reality"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/web"},"Web"))),(0,n.kt)("h2",{id:"role"},"Role"),(0,n.kt)("p",null,"Which traditional role would implement this pattern? "),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/role-cloud-engineer"},"Cloud Engineer")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/role-data-scientist"},"Data Scientist")),(0,n.kt)("li",{parentName:"ul"},"Database Administrator"),(0,n.kt)("li",{parentName:"ul"},"UX/Graphic Designer"),(0,n.kt)("li",{parentName:"ul"},"Hardware Engineer"),(0,n.kt)("li",{parentName:"ul"},"Mobile Engineer"),(0,n.kt)("li",{parentName:"ul"},"Project Manager"),(0,n.kt)("li",{parentName:"ul"},"Program Manager"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/role-reliability-engineer"},"Reliability Engineer")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/role-software-engineer"},"Software Engineer")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/role-web-developer"},"Web Developer"))),(0,n.kt)("h2",{id:"complexity"},"Complexity"),(0,n.kt)("p",null,"How complex is this pattern to implement? "),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/size-small"},"Small")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/size-medium"},"Medium")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/size-large"},"Large")),(0,n.kt)("li",{parentName:"ul"},"Undetermined")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/6e7c13c8.28f471e7.js b/assets/js/6e7c13c8.28f471e7.js deleted file mode 100644 index 3139c082..00000000 --- a/assets/js/6e7c13c8.28f471e7.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7821],{4137:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>c});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function l(e){for(var t=1;t=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var p=r.createContext({}),s=function(e){var t=r.useContext(p),a=t;return e&&(a="function"==typeof e?e(t):l(l({},t),e)),a},u=function(e){var t=s(e.components);return r.createElement(p.Provider,{value:t},e.children)},g={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,i=e.originalType,p=e.parentName,u=o(e,["components","mdxType","originalType","parentName"]),m=s(a),c=n,d=m["".concat(p,".").concat(c)]||m[c]||g[c]||i;return a?r.createElement(d,l(l({ref:t},u),{},{components:a})):r.createElement(d,l({ref:t},u))}));function c(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=a.length,l=new Array(i);l[0]=m;var o={};for(var p in t)hasOwnProperty.call(t,p)&&(o[p]=t[p]);o.originalType=e,o.mdxType="string"==typeof e?e:n,l[1]=o;for(var s=2;s{a.r(t),a.d(t,{assets:()=>p,contentTitle:()=>l,default:()=>g,frontMatter:()=>i,metadata:()=>o,toc:()=>s});var r=a(7462),n=(a(7294),a(4137));const i={sidebar_position:3},l="Suggested Tags",o={unversionedId:"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.",source:"@site/docs/guide/suggested-tags.md",sourceDirName:"guide",slug:"/guide/suggested-tags",permalink:"/guide/suggested-tags",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/guide/suggested-tags.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{sidebar_position:3},sidebar:"tutorialSidebar",previous:{title:"Guide",permalink:"/guide/"},next:{title:"Initial Review Guide",permalink:"/guide/initial-reviewer-guide"}},p={},s=[{value:"Technology",id:"technology",level:2},{value:"Role",id:"role",level:2},{value:"Complexity",id:"complexity",level:2}],u={toc:s};function g(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"suggested-tags"},"Suggested Tags"),(0,n.kt)("p",null,"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."),(0,n.kt)("h2",{id:"technology"},"Technology"),(0,n.kt)("p",null,"Which technology does this pattern align to? "),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Alerting"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/ai"},"Artificial Intelligence")),(0,n.kt)("li",{parentName:"ul"},"Augmented Reality"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/cloud"},"Cloud")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/compute"},"Compute")),(0,n.kt)("li",{parentName:"ul"},"Content Delivery/CDN"),(0,n.kt)("li",{parentName:"ul"},"Database"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/deployment"},"Deployment")),(0,n.kt)("li",{parentName:"ul"},"DevOps"),(0,n.kt)("li",{parentName:"ul"},"Gaming"),(0,n.kt)("li",{parentName:"ul"},"Internet of Things"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/kubernetes"},"Kubernetes")),(0,n.kt)("li",{parentName:"ul"},"Logging"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/machine-learning"},"Machine Learning")),(0,n.kt)("li",{parentName:"ul"},"Mobile"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/monitoring"},"Monitoring")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/networking"},"Networking")),(0,n.kt)("li",{parentName:"ul"},"Operating Systems"),(0,n.kt)("li",{parentName:"ul"},"Programming Language"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/reliability-availability/"},"Reliability/Availability")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/security"},"Security")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/serverless"},"Serverless")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/storage"},"Storage")),(0,n.kt)("li",{parentName:"ul"},"User Experience"),(0,n.kt)("li",{parentName:"ul"},"User Interface"),(0,n.kt)("li",{parentName:"ul"},"Virtual Reality"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/web"},"Web"))),(0,n.kt)("h2",{id:"role"},"Role"),(0,n.kt)("p",null,"Which traditional role would implement this pattern? "),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/role-cloud-engineer"},"Cloud Engineer")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/role-data-scientist"},"Data Scientist")),(0,n.kt)("li",{parentName:"ul"},"Database Administrator"),(0,n.kt)("li",{parentName:"ul"},"UX/Graphic Designer"),(0,n.kt)("li",{parentName:"ul"},"Hardware Engineer"),(0,n.kt)("li",{parentName:"ul"},"Mobile Engineer"),(0,n.kt)("li",{parentName:"ul"},"Project Manager"),(0,n.kt)("li",{parentName:"ul"},"Program Manager"),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/role-reliability-engineer"},"Reliability Engineer")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/role-software-engineer"},"Software Engineer")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/role-web-developer"},"Web Developer"))),(0,n.kt)("h2",{id:"complexity"},"Complexity"),(0,n.kt)("p",null,"How complex is this pattern to implement? "),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/size-small"},"Small")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/size-medium"},"Medium")),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("a",{parentName:"li",href:"/tags/size-large"},"Large")),(0,n.kt)("li",{parentName:"ul"},"Undetermined")))}g.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/717128d8.9c30be9b.js b/assets/js/717128d8.9c30be9b.js new file mode 100644 index 00000000..e6d8885e --- /dev/null +++ b/assets/js/717128d8.9c30be9b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2122],{4137:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>d});var n=i(7294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function o(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function a(e){for(var t=1;t=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),i=t;return e&&(i="function"==typeof e?e(t):a(a({},t),e)),i},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)}},m=n.forwardRef((function(e,t){var i=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=c(i),d=r,f=m["".concat(s,".").concat(d)]||m[d]||p[d]||o;return i?n.createElement(f,a(a({ref:t},u),{},{components:i})):n.createElement(f,a({ref:t},u))}));function d(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=i.length,a=new Array(o);a[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c{i.r(t),i.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=i(7462),r=(i(7294),i(4137));const o={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"cloud",tags:["cloud","role:cloud-engineer","size:small"]},a="Optimize impact on customer devices and equipment",l={unversionedId:"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",source:"@site/docs/catalog/cloud/optimize-impact-on-customer-equipment.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/optimize-impact-on-customer-equipment",permalink:"/catalog/cloud/optimize-impact-on-customer-equipment",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/optimize-impact-on-customer-equipment.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"cloud",tags:["cloud","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Optimize average CPU utilization",permalink:"/catalog/cloud/optimize-avg-cpu-utilization"},next:{title:"Optimize peak CPU utilization",permalink:"/catalog/cloud/optimize-peak-cpu-utilization"}},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,...i}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"optimize-impact-on-customer-devices-and-equipment"},"Optimize impact on customer devices and equipment"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"Applications run on customer hardware or are displayed on it. The hardware used by the customer has a carbon footprint embodied through the production and electricity required while running. Optimising your software design and architecture to extend the life of the customer devices reduces the carbon intensity of the application.\nIdeally the customer can use the hardware until it's failure or until it becomes obsolete."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Understand the devices and equipment your customers use to consume your services. Implement software patterns and architectures to minimize the need for customers to replace devices and upgrade equipment.\nA few examples on how this could be achieved:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Implement new features using code that is backwards compatible with older hardware and operating system versions or disable them on older hardware only so the application can still be used"),(0,r.kt)("li",{parentName:"ul"},"Support older browser versions and optimize the UX for an older tier of CPUs"),(0,r.kt)("li",{parentName:"ul"},"Optimize network bandwidth for older devices or customers that have limited connectivity")),(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"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,r.kt)("p",null,"Concerning the SCI equation, optimize impact on customer devices will impact two parts:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"I"),": Optimizing for older hardware might reduce the carbon intensity if it also runs more efficiently in general"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"M"),": Using older devices allows hardware to be used longer and therefore reduces the embodied carbon impact")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"This pattern assumes that the team does have sufficient time and resources to implement backwards compatibility and optimize the application")),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Consider the other cloud patterns to optimize the application itself inside the cloud environment")),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/sus_sus_software_a6.html"},"AWS Sustainability Pillar"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/717128d8.fd790493.js b/assets/js/717128d8.fd790493.js deleted file mode 100644 index 06afadcf..00000000 --- a/assets/js/717128d8.fd790493.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2122],{4137:(e,t,i)=>{i.d(t,{Zo:()=>u,kt:()=>d});var n=i(7294);function r(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function o(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function a(e){for(var t=1;t=0||(r[i]=e[i]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(r[i]=e[i])}return r}var s=n.createContext({}),c=function(e){var t=n.useContext(s),i=t;return e&&(i="function"==typeof e?e(t):a(a({},t),e)),i},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)}},m=n.forwardRef((function(e,t){var i=e.components,r=e.mdxType,o=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),m=c(i),d=r,f=m["".concat(s,".").concat(d)]||m[d]||p[d]||o;return i?n.createElement(f,a(a({ref:t},u),{},{components:i})):n.createElement(f,a({ref:t},u))}));function d(e,t){var i=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=i.length,a=new Array(o);a[0]=m;var l={};for(var s in t)hasOwnProperty.call(t,s)&&(l[s]=t[s]);l.originalType=e,l.mdxType="string"==typeof e?e:r,a[1]=l;for(var c=2;c{i.r(t),i.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>p,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var n=i(7462),r=(i(7294),i(4137));const o={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"cloud",tags:["cloud","role:cloud-engineer","size:small"]},a="Optimize impact on customer devices and equipment",l={unversionedId:"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",source:"@site/docs/catalog/cloud/optimize-impact-on-customer-equipment.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/optimize-impact-on-customer-equipment",permalink:"/catalog/cloud/optimize-impact-on-customer-equipment",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/optimize-impact-on-customer-equipment.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"cloud",tags:["cloud","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Optimize average CPU utilization",permalink:"/catalog/cloud/optimize-avg-cpu-utilization"},next:{title:"Optimize peak CPU utilization",permalink:"/catalog/cloud/optimize-peak-cpu-utilization"}},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,...i}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,i,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"optimize-impact-on-customer-devices-and-equipment"},"Optimize impact on customer devices and equipment"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"Applications run on customer hardware or are displayed on it. The hardware used by the customer has a carbon footprint embodied through the production and electricity required while running. Optimising your software design and architecture to extend the life of the customer devices reduces the carbon intensity of the application.\nIdeally the customer can use the hardware until it's failure or until it becomes obsolete."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Understand the devices and equipment your customers use to consume your services. Implement software patterns and architectures to minimize the need for customers to replace devices and upgrade equipment.\nA few examples on how this could be achieved:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Implement new features using code that is backwards compatible with older hardware and operating system versions or disable them on older hardware only so the application can still be used"),(0,r.kt)("li",{parentName:"ul"},"Support older browser versions and optimize the UX for an older tier of CPUs"),(0,r.kt)("li",{parentName:"ul"},"Optimize network bandwidth for older devices or customers that have limited connectivity")),(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"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,r.kt)("p",null,"Concerning the SCI equation, optimize impact on customer devices will impact two parts:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"I"),": Optimizing for older hardware might reduce the carbon intensity if it also runs more efficiently in general"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"M"),": Using older devices allows hardware to be used longer and therefore reduces the embodied carbon impact")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"This pattern assumes that the team does have sufficient time and resources to implement backwards compatibility and optimize the application")),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Consider the other cloud patterns to optimize the application itself inside the cloud environment")),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/sus_sus_software_a6.html"},"AWS Sustainability Pillar"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/72b27058.6d5a0533.js b/assets/js/72b27058.6d5a0533.js new file mode 100644 index 00000000..0a35db79 --- /dev/null +++ b/assets/js/72b27058.6d5a0533.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3969],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>p});var r=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 o(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 a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),u=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),m=u(n),p=i,h=m["".concat(s,".").concat(p)]||m[p]||d[p]||o;return n?r.createElement(h,a(a({ref:t},c),{},{components:n})):r.createElement(h,a({ref:t},c))}));function p(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=m;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,a[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=n(7462),i=(n(7294),n(4137));const o={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["compute","role:cloud-engineer","size:small"]},a="Match utilization requirements of virtual machines (VMs)",l={unversionedId:"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.",source:"@site/docs/catalog/cloud/match-utilization-requirements-of-vm.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/match-utilization-requirements-of-vm",permalink:"/catalog/cloud/match-utilization-requirements-of-vm",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/match-utilization-requirements-of-vm.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["compute","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Match your service level objectives to business needs",permalink:"/catalog/cloud/match-slo"},next:{title:"Match utilization requirements with pre-configured servers",permalink:"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"}},s={},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,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"match-utilization-requirements-of-virtual-machines-vms"},"Match utilization requirements of virtual machines (VMs)"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"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."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Rightsize your VMs by changing the number of resources allocated to a VM to match the utilization requirements of the VM. For example, adding a vCPU if the VM is running high CPU utilization or removing memory if the server is not using all of its allocated memory."),(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,"Rightsizing oversized VMs will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Rightsizing oversized VMs will ",(0,i.kt)("em",{parentName:"li"},"increase")," the total server utilization. The more a server is utilized, the more efficient it becomes at turning energy into useful operations. Therefore rightsizing VMs should reduce the energy consumption of your processes."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of servers required to run a process, the total embodied carbon is lower.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"If we choose an oversized VM because ",(0,i.kt)("em",{parentName:"p"},"occasionally")," there is a burst of work (peak load) then undersizing them will reduce the margin available to handle the peak traffic. A better solution would be to consider an auto-scaling architecture that would automatically scale the number of VMs."),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"It may reduce your cloud bill as reducing the spec of your VMs will cost less."),(0,i.kt)("li",{parentName:"ul"},"If you do not have an auto-scaling architecture, there is less overhead for handling spikes in load.")),(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.greensoftware.foundation/practitioner/hardware-efficiency"},"Hardware Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/72b27058.77a103d0.js b/assets/js/72b27058.77a103d0.js deleted file mode 100644 index 479f3794..00000000 --- a/assets/js/72b27058.77a103d0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3969],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>p});var r=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 o(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 a(e){for(var t=1;t=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),u=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),m=u(n),p=i,h=m["".concat(s,".").concat(p)]||m[p]||d[p]||o;return n?r.createElement(h,a(a({ref:t},c),{},{components:n})):r.createElement(h,a({ref:t},c))}));function p(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=n.length,a=new Array(o);a[0]=m;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,a[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=n(7462),i=(n(7294),n(4137));const o={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["compute","role:cloud-engineer","size:small"]},a="Match utilization requirements of virtual machines (VMs)",l={unversionedId:"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.",source:"@site/docs/catalog/cloud/match-utilization-requirements-of-vm.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/match-utilization-requirements-of-vm",permalink:"/catalog/cloud/match-utilization-requirements-of-vm",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/match-utilization-requirements-of-vm.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["compute","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Match your service level objectives to business needs",permalink:"/catalog/cloud/match-slo"},next:{title:"Match utilization requirements with pre-configured servers",permalink:"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"}},s={},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,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"match-utilization-requirements-of-virtual-machines-vms"},"Match utilization requirements of virtual machines (VMs)"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"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."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Rightsize your VMs by changing the number of resources allocated to a VM to match the utilization requirements of the VM. For example, adding a vCPU if the VM is running high CPU utilization or removing memory if the server is not using all of its allocated memory."),(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,"Rightsizing oversized VMs will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Rightsizing oversized VMs will ",(0,i.kt)("em",{parentName:"li"},"increase")," the total server utilization. The more a server is utilized, the more efficient it becomes at turning energy into useful operations. Therefore rightsizing VMs should reduce the energy consumption of your processes."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of servers required to run a process, the total embodied carbon is lower.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"If we choose an oversized VM because ",(0,i.kt)("em",{parentName:"p"},"occasionally")," there is a burst of work (peak load) then undersizing them will reduce the margin available to handle the peak traffic. A better solution would be to consider an auto-scaling architecture that would automatically scale the number of VMs."),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"It may reduce your cloud bill as reducing the spec of your VMs will cost less."),(0,i.kt)("li",{parentName:"ul"},"If you do not have an auto-scaling architecture, there is less overhead for handling spikes in load.")),(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.greensoftware.foundation/practitioner/hardware-efficiency"},"Hardware Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/770c5109.454db8d0.js b/assets/js/770c5109.454db8d0.js new file mode 100644 index 00000000..65b749ed --- /dev/null +++ b/assets/js/770c5109.454db8d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8725],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var a=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 i(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||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),l=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=l(e.components);return a.createElement(s.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 r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(r),h=n,m=p["".concat(s,".").concat(h)]||p[h]||d[h]||i;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,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=p;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:n,o[1]=c;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var a=r(7462),n=(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 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.",tags:["networking","role:cloud-engineer","size:small"]},o="Cache static data",c={unversionedId:"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.",source:"@site/docs/catalog/cloud/cache-static-data.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/cache-static-data",permalink:"/catalog/cloud/cache-static-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/cache-static-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 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.",tags:["networking","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Cloud",permalink:"/catalog/cloud/"},next:{title:"Choose the region that is closest to users",permalink:"/catalog/cloud/choose-region-closest-to-users"}},s={},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=(d="PatternComponent",function(e){return console.warn("Component "+d+" was not imported, exported, or provided by MDXProvider as global scope"),(0,n.kt)("div",e)});var d;const p={toc:l};function h(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"cache-static-data"},"Cache static data"),(0,n.kt)(u,{mdxType:"PatternComponent"}),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"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. "),(0,n.kt)("p",null,"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. "),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"Caching static data, such as images or audio, instead of transferring it over the network. "),(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 travelled 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 amount of computing equipment traversed, the total embodied carbon is lower.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("p",null,"Suppose we transfer all the data of an application across the network as often as needed because some of the data may require a regular update. A better solution would be to consider a caching mechanism for static data that doesn't require frequent updates. This will reduce network traffic because we are doing local readings of the static data. "),(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 travels will cost less. "),(0,n.kt)("li",{parentName:"ul"},"If data is not static anymore, there is more overhead to re-architect the application to deal with the new data requirement."),(0,n.kt)("li",{parentName:"ul"},"It is assumed that a local in-memory cache of the server(s) is used to implement this pattern. If any external cache infrastructure is leveraged, then SCI score may not reduce considerably as we have to account for the E and M values of the external infrastructure in the equation. ")),(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"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/770c5109.bc503c60.js b/assets/js/770c5109.bc503c60.js deleted file mode 100644 index d3ebd92e..00000000 --- a/assets/js/770c5109.bc503c60.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8725],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>h});var a=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 i(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||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var s=a.createContext({}),l=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=l(e.components);return a.createElement(s.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 r=e.components,n=e.mdxType,i=e.originalType,s=e.parentName,u=c(e,["components","mdxType","originalType","parentName"]),p=l(r),h=n,m=p["".concat(s,".").concat(h)]||p[h]||d[h]||i;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,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.length,o=new Array(i);o[0]=p;var c={};for(var s in t)hasOwnProperty.call(t,s)&&(c[s]=t[s]);c.originalType=e,c.mdxType="string"==typeof e?e:n,o[1]=c;for(var l=2;l{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>c,toc:()=>l});var a=r(7462),n=(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 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.",tags:["networking","role:cloud-engineer","size:small"]},o="Cache static data",c={unversionedId:"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.",source:"@site/docs/catalog/cloud/cache-static-data.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/cache-static-data",permalink:"/catalog/cloud/cache-static-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/cache-static-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 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.",tags:["networking","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Cloud",permalink:"/catalog/cloud/"},next:{title:"Choose the region that is closest to users",permalink:"/catalog/cloud/choose-region-closest-to-users"}},s={},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=(d="PatternComponent",function(e){return console.warn("Component "+d+" was not imported, exported, or provided by MDXProvider as global scope"),(0,n.kt)("div",e)});var d;const p={toc:l};function h(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,a.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"cache-static-data"},"Cache static data"),(0,n.kt)(u,{mdxType:"PatternComponent"}),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"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. "),(0,n.kt)("p",null,"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. "),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"Caching static data, such as images or audio, instead of transferring it over the network. "),(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 travelled 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 amount of computing equipment traversed, the total embodied carbon is lower.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("p",null,"Suppose we transfer all the data of an application across the network as often as needed because some of the data may require a regular update. A better solution would be to consider a caching mechanism for static data that doesn't require frequent updates. This will reduce network traffic because we are doing local readings of the static data. "),(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 travels will cost less. "),(0,n.kt)("li",{parentName:"ul"},"If data is not static anymore, there is more overhead to re-architect the application to deal with the new data requirement."),(0,n.kt)("li",{parentName:"ul"},"It is assumed that a local in-memory cache of the server(s) is used to implement this pattern. If any external cache infrastructure is leveraged, then SCI score may not reduce considerably as we have to account for the E and M values of the external infrastructure in the equation. ")),(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"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/778078a6.2e2b8768.js b/assets/js/778078a6.2e2b8768.js deleted file mode 100644 index e7f558ef..00000000 --- a/assets/js/778078a6.2e2b8768.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8450],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});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({}),m=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=m(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,c=s(e,["components","mdxType","originalType","parentName"]),p=m(r),d=a,f=p["".concat(l,".").concat(d)]||p[d]||u[d]||i;return r?n.createElement(f,o(o({ref:t},c),{},{components:r})):n.createElement(f,o({ref:t},c))}));function d(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 m=2;m{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>m});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"markus-ntt-seidl, navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",description:"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.",tags:["web","size:small","role:web-developer"]},o="Serve images in modern formats",s={unversionedId:"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.",source:"@site/docs/catalog/web/serve-images-in-modern-formats.md",sourceDirName:"catalog/web",slug:"/catalog/web/serve-images-in-modern-formats",permalink:"/catalog/web/serve-images-in-modern-formats",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/serve-images-in-modern-formats.md",tags:[{label:"web",permalink:"/tags/web"},{label:"size:small",permalink:"/tags/size-small"},{label:"role:web-developer",permalink:"/tags/role-web-developer"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl, navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"web",description:"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.",tags:["web","size:small","role:web-developer"]},sidebar:"tutorialSidebar",previous:{title:"Remove unused CSS definitions",permalink:"/catalog/web/remove-unused-css"},next:{title:"Tags",permalink:"/tags/"}},l={},m=[{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:m};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"serve-images-in-modern-formats"},"Serve images in modern formats"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Images are a key element in modern websites and are widely used. Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device."),(0,a.kt)("p",null,"There are several new image formats to choose from, for example WebP and AVIF. All new formats provide better compression ratio, increased quality and more features than traditional formats. For example, WebP offers around 30% smaller files sizes than JPEG, with no drop in quality."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Test which image format give the best compression ratio, visual quality and device coverage for the website use cases. Use the best image format to serve the images on the website."),(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,"Concerning the SCI equation, the new image formats will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Reducing the amount of emissions by reducing time spent on transfering and processing images")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The ability to use modern web browsers which support modern image formats.")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Consider minification to reduce emissions on other resources.")),(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://en.wikipedia.org/wiki/WebP"},"More Information about WebP")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/AVIF"},"More Information about AVIF")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://caniuse.com/?search=image%20format"},"Image Format WebBrowser Implementation Status"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/778078a6.83182040.js b/assets/js/778078a6.83182040.js new file mode 100644 index 00000000..63766a9a --- /dev/null +++ b/assets/js/778078a6.83182040.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8450],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>d});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({}),m=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=m(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,c=s(e,["components","mdxType","originalType","parentName"]),p=m(r),d=a,f=p["".concat(l,".").concat(d)]||p[d]||u[d]||i;return r?n.createElement(f,o(o({ref:t},c),{},{components:r})):n.createElement(f,o({ref:t},c))}));function d(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 m=2;m{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>u,frontMatter:()=>i,metadata:()=>s,toc:()=>m});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"markus-ntt-seidl, navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",description:"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.",tags:["web","size:small","role:web-developer"]},o="Serve images in modern formats",s={unversionedId:"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.",source:"@site/docs/catalog/web/serve-images-in-modern-formats.md",sourceDirName:"catalog/web",slug:"/catalog/web/serve-images-in-modern-formats",permalink:"/catalog/web/serve-images-in-modern-formats",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/serve-images-in-modern-formats.md",tags:[{label:"web",permalink:"/tags/web"},{label:"size:small",permalink:"/tags/size-small"},{label:"role:web-developer",permalink:"/tags/role-web-developer"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl, navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"web",description:"Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device.",tags:["web","size:small","role:web-developer"]},sidebar:"tutorialSidebar",previous:{title:"Remove unused CSS definitions",permalink:"/catalog/web/remove-unused-css"},next:{title:"Tags",permalink:"/tags/"}},l={},m=[{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:m};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"serve-images-in-modern-formats"},"Serve images in modern formats"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Images are a key element in modern websites and are widely used. Modern image formats can help to reduce bandwidth, storage and computing requirements on the displaying device."),(0,a.kt)("p",null,"There are several new image formats to choose from, for example WebP and AVIF. All new formats provide better compression ratio, increased quality and more features than traditional formats. For example, WebP offers around 30% smaller files sizes than JPEG, with no drop in quality."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Test which image format give the best compression ratio, visual quality and device coverage for the website use cases. Use the best image format to serve the images on the website."),(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,"Concerning the SCI equation, the new image formats will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Reducing the amount of emissions by reducing time spent on transfering and processing images")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The ability to use modern web browsers which support modern image formats.")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Consider minification to reduce emissions on other resources.")),(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://en.wikipedia.org/wiki/WebP"},"More Information about WebP")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/AVIF"},"More Information about AVIF")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://caniuse.com/?search=image%20format"},"Image Format WebBrowser Implementation Status"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/78f57216.0f15c0ed.js b/assets/js/78f57216.0f15c0ed.js deleted file mode 100644 index 2d548b84..00000000 --- a/assets/js/78f57216.0f15c0ed.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7070],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,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 o(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||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),u=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(i.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,o=e.originalType,i=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(n),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,s(s({ref:t},c),{},{components:n})):r.createElement(f,s({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=p;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,s[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=n(7462),a=(n(7294),n(4137));const o={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"cloud",tags:["cloud","role:cloud-engineer","size:small"]},s="Remove unused assets",l={unversionedId:"catalog/cloud/remove-unused-assets",id:"catalog/cloud/remove-unused-assets",title:"Remove unused assets",description:"Description",source:"@site/docs/catalog/cloud/remove-unused-assets.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/remove-unused-assets",permalink:"/catalog/cloud/remove-unused-assets",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/remove-unused-assets.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"cloud",tags:["cloud","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Reduce transmitted data",permalink:"/catalog/cloud/reduce-transmitted-data"},next:{title:"Scale down kubernetes applications when not in use",permalink:"/catalog/cloud/scale-down-kubernetes-workloads"}},i={},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,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"remove-unused-assets"},"Remove unused assets"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Monitor and analyze the application and the cloud bill to identify resources that are no longer used or can be reduced."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Decommission unused assets to free consumed resources. Consolidate resources, for example different database instances with a only a few tables could be moved into one instance. Review generated assets if they contain redundant content and handle them accordingly.\nInspect storage buckets if unused assets can be removed."),(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,"With respect to the SCI equation, remove unused assets will impact one part:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Reduces the electricity by not using resources"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": Removing unused resources also reduces the embodied emissions, for example by reducing the storage or CPUs needed")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Assumes that resources can be decommissioned")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Consider creating monitoring to more easily identify resources that are no longer needed")),(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://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/sus_sus_user_a4.html"},"AWS Sustainability Pillar"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/78f57216.4969e886.js b/assets/js/78f57216.4969e886.js new file mode 100644 index 00000000..776518cf --- /dev/null +++ b/assets/js/78f57216.4969e886.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7070],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,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 o(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||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var i=r.createContext({}),u=function(e){var t=r.useContext(i),n=t;return e&&(n="function"==typeof e?e(t):s(s({},t),e)),n},c=function(e){var t=u(e.components);return r.createElement(i.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,o=e.originalType,i=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(n),m=a,f=p["".concat(i,".").concat(m)]||p[m]||d[m]||o;return n?r.createElement(f,s(s({ref:t},c),{},{components:n})):r.createElement(f,s({ref:t},c))}));function m(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,s=new Array(o);s[0]=p;var l={};for(var i in t)hasOwnProperty.call(t,i)&&(l[i]=t[i]);l.originalType=e,l.mdxType="string"==typeof e?e:a,s[1]=l;for(var u=2;u{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>s,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var r=n(7462),a=(n(7294),n(4137));const o={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"cloud",tags:["cloud","role:cloud-engineer","size:small"]},s="Remove unused assets",l={unversionedId:"catalog/cloud/remove-unused-assets",id:"catalog/cloud/remove-unused-assets",title:"Remove unused assets",description:"Description",source:"@site/docs/catalog/cloud/remove-unused-assets.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/remove-unused-assets",permalink:"/catalog/cloud/remove-unused-assets",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/remove-unused-assets.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"cloud",tags:["cloud","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Reduce transmitted data",permalink:"/catalog/cloud/reduce-transmitted-data"},next:{title:"Scale down kubernetes applications when not in use",permalink:"/catalog/cloud/scale-down-kubernetes-workloads"}},i={},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,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"remove-unused-assets"},"Remove unused assets"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Monitor and analyze the application and the cloud bill to identify resources that are no longer used or can be reduced."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Decommission unused assets to free consumed resources. Consolidate resources, for example different database instances with a only a few tables could be moved into one instance. Review generated assets if they contain redundant content and handle them accordingly.\nInspect storage buckets if unused assets can be removed."),(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,"With respect to the SCI equation, remove unused assets will impact one part:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Reduces the electricity by not using resources"),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": Removing unused resources also reduces the embodied emissions, for example by reducing the storage or CPUs needed")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Assumes that resources can be decommissioned")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Consider creating monitoring to more easily identify resources that are no longer needed")),(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://docs.aws.amazon.com/wellarchitected/latest/sustainability-pillar/sus_sus_user_a4.html"},"AWS Sustainability Pillar"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7a11bfb9.244eda19.js b/assets/js/7a11bfb9.244eda19.js new file mode 100644 index 00000000..612e3e86 --- /dev/null +++ b/assets/js/7a11bfb9.244eda19.js @@ -0,0 +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 diff --git a/assets/js/7a11bfb9.e4072bc6.js b/assets/js/7a11bfb9.e4072bc6.js deleted file mode 100644 index 795d6c02..00000000 --- a/assets/js/7a11bfb9.e4072bc6.js +++ /dev/null @@ -1 +0,0 @@ -"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/green-software-patterns/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 diff --git a/assets/js/7d4685ea.1d0c3875.js b/assets/js/7d4685ea.1d0c3875.js new file mode 100644 index 00000000..77d4ea94 --- /dev/null +++ b/assets/js/7d4685ea.1d0c3875.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9797],{4137:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>d});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),p=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(a),d=r,m=c["".concat(l,".").concat(d)]||c[d]||h[d]||i;return a?n.createElement(m,o(o({ref:t},u),{},{components:a})):n.createElement(m,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=c;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,o[1]=s;for(var p=2;p{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var n=a(7462),r=(a(7294),a(4137));const i={sidebar_position:2},o="Guide",s={unversionedId:"guide/index",id:"guide/index",title:"Guide",description:"What is a green software pattern?",source:"@site/docs/guide/index.md",sourceDirName:"guide",slug:"/guide/",permalink:"/guide/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/guide/index.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Green Software Patterns",permalink:"/"},next:{title:"Suggested Tags",permalink:"/guide/suggested-tags"}},l={},p=[{value:"What is a green software pattern?",id:"what-is-a-green-software-pattern",level:2},{value:"How to propose a new pattern or a change to a pattern?",id:"how-to-propose-a-new-pattern-or-a-change-to-a-pattern",level:2},{value:"How to submit a new pattern or a change to a pattern?",id:"how-to-submit-a-new-pattern-or-a-change-to-a-pattern",level:2},{value:"What are the stages if a Green Software Pattern?",id:"what-are-the-stages-if-a-green-software-pattern",level:2},{value:"Discussion",id:"discussion",level:3},{value:"Draft",id:"draft",level:3},{value:"Initial Review",id:"initial-review",level:3},{value:"SME Review",id:"sme-review",level:3},{value:"Team Consensus",id:"team-consensus",level:3},{value:"Consistency Review",id:"consistency-review",level:3},{value:"What are the timelines for each stage?",id:"what-are-the-timelines-for-each-stage",level:2},{value:"Roles and Responsibilities",id:"roles-and-responsibilities",level:2},{value:"What are the expectations for an Internal Reviewer?",id:"what-are-the-expectations-for-an-internal-reviewer",level:3},{value:"What are the expectations for a Subject Matter Experts review?",id:"what-are-the-expectations-for-a-subject-matter-experts-review",level:3},{value:"What are the expectations on the Team to reach consensus?",id:"what-are-the-expectations-on-the-team-to-reach-consensus",level:3},{value:"What are the expectations on the broader GSF members in a consistency review?",id:"what-are-the-expectations-on-the-broader-gsf-members-in-a-consistency-review",level:3},{value:"How granular should my pattern be?",id:"how-granular-should-my-pattern-be",level:2},{value:"Least number of solutions per pattern",id:"least-number-of-solutions-per-pattern",level:3},{value:"Touching on two or more SCI components is a sign it can be decomposed further",id:"touching-on-two-or-more-sci-components-is-a-sign-it-can-be-decomposed-further",level:3},{value:"Smallest SCI Impact",id:"smallest-sci-impact",level:3},{value:"Available Guides",id:"available-guides",level:2}],u={toc:p};function h(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"guide"},"Guide"),(0,r.kt)("h2",{id:"what-is-a-green-software-pattern"},"What is a green software pattern?"),(0,r.kt)("p",null,"A green software pattern if applied correctly will reduce the emissions of your software. Every pattern in the database contains these sections:"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Metadata")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Version"),": Designation of iteration on the pattern. This will initially be assigned by the patterns working group and defaults to 1.0"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Submitted By"),": The name of the person(s) submitting the pattern"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Published Date"),": The date this version of the pattern is published. This will be provided by the patterns working group upon approval"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Tag Category"),": Select the most appropriate category from: Artificial Intelligence, Cloud, or Web which might apply to this pattern"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Tags"),": A ",(0,r.kt)("a",{parentName:"li",href:"/guide/suggested-tags"},"pre-defined list of additional tags")," which might apply to the pattern (e.g. Machine Learning, Gaming, Mobile).")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Pattern Content")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Title"),": Title of the pattern. Please follow the naming convention of an ",(0,r.kt)("inlineCode",{parentName:"li"},"Action")," taken on a ",(0,r.kt)("inlineCode",{parentName:"li"},"Resource"),'. Example: "Reduce compute requirements"'),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Description"),": A full description of what problem this pattern is solving"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Solution"),": How will this patter solve the problem"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"SCI Impact"),": How will this pattern affect an SCI score of an application and why"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Assumptions"),": What are the assumptions being made"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Considerations"),": Discussion section anything that should be taken into consideration when implementing this pattern "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"References"),": Use this section to provide relevant links for your pattern content from other web sites")),(0,r.kt)("h2",{id:"how-to-propose-a-new-pattern-or-a-change-to-a-pattern"},"How to ",(0,r.kt)("strong",{parentName:"h2"},"propose")," a new pattern or a change to a pattern?"),(0,r.kt)("p",null,"Whether you are proposing a new pattern or a change to an existing pattern. The first step is to discuss the change with others."),(0,r.kt)("p",null,"Open a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Green-Software-Foundation/green-software-patterns/issues"},"GitHub issue")," to discuss your changes."),(0,r.kt)("p",null,"Use the appropriate GitHub issue template for the change you would like to make."),(0,r.kt)("h2",{id:"how-to-submit-a-new-pattern-or-a-change-to-a-pattern"},"How to ",(0,r.kt)("strong",{parentName:"h2"},"submit")," a new pattern or a change to a pattern?"),(0,r.kt)("p",null,"You will need experience with GitHub and Pull Requests in order to submit a change."),(0,r.kt)("p",null,"All changes follow a series of approval stages that starts with a PULL REQUEST made to the ",(0,r.kt)("inlineCode",{parentName:"p"},"dev")," branch."),(0,r.kt)("p",null,"Fork the repository\nCheckout the ",(0,r.kt)("inlineCode",{parentName:"p"},"dev")," branch make the changes that you see fit. You can edit an existing pattern or creating a new markdown file for a new pattern. For any new patterns, please follow the Pattern Template provided in root of the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Green-Software-Foundation/green-software-patterns"},"GitHub repository"),(0,r.kt)("br",{parentName:"p"}),"\n","Create a PULL REQUEST to merge your changes in with the official repository, remember it should be against the ",(0,r.kt)("inlineCode",{parentName:"p"},"dev")," branch."),(0,r.kt)("p",null,"This starts an approval process."),(0,r.kt)("h2",{id:"what-are-the-stages-if-a-green-software-pattern"},"What are the stages if a Green Software Pattern?"),(0,r.kt)("h3",{id:"discussion"},"Discussion"),(0,r.kt)("p",null,"Anyone (member or non-members) can discuss patterns via the GitHub Issues tab of the repository. There will be an issue template to suggest new patterns or suggest changes to existing patterns. Once they are ready then can go ahead and create a PR to add a pattern to the database."),(0,r.kt)("h3",{id:"draft"},"Draft"),(0,r.kt)("p",null,"Anyone (member or non-members) can create a PR matching the template for Green Software Patterns to be merged into the dev branch. This starts an internal process of review."),(0,r.kt)("h3",{id:"initial-review"},"Initial Review"),(0,r.kt)("p",null,"An initial review by one member of the patterns project. The goal of this stage is just to make sure the pattern meets core requirements for what a pattern should contain, is it the right format, syntax etc\u2026? "),(0,r.kt)("p",null,"The initial reviewer will also decide what subject matter experts are required to review this pattern. "),(0,r.kt)("p",null,"This needs an explicit approval from the initial reviewer before the pattern can move to the next stage. "),(0,r.kt)("h3",{id:"sme-review"},"SME Review"),(0,r.kt)("p",null,"One or more subject matter experts in the GSF are asked to review the pattern and give their feedback. E.g. If the pattern is in the machine-learning catalog we ask a machine learning expert to review."),(0,r.kt)("p",null,"This needs an explicit approval from the SME reviewer before the pattern can move to the next stage."),(0,r.kt)("h3",{id:"team-consensus"},"Team Consensus"),(0,r.kt)("p",null,"Once the pattern has been approved by the SME it starts the team review phase. The principles and patterns team has 2 weeks to comment/object to the pattern. It needs consensus before the PR can be approved and merged into dev."),(0,r.kt)("p",null,"At the end of this stage the pattern is merged into ",(0,r.kt)("inlineCode",{parentName:"p"},"dev")," but is ",(0,r.kt)("strong",{parentName:"p"},"not published on our official catalog"),"."),(0,r.kt)("h3",{id:"consistency-review"},"Consistency Review"),(0,r.kt)("p",null,"Every quarter the ",(0,r.kt)("inlineCode",{parentName:"p"},"dev")," branch is merged to the ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," branch and this triggers a consistency review where anyone in the Foundation has 2 weeks to comment or object. We need GSF wide consensus for the patterns to be published."),(0,r.kt)("p",null,"This is done in batches every quarter to reduce the noise to the rest of the Foundation."),(0,r.kt)("h2",{id:"what-are-the-timelines-for-each-stage"},"What are the timelines for each stage?"),(0,r.kt)("p",null,"The working group will regularly review submitted patterns along the following timeline:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Initial Review: 1 week"),(0,r.kt)("li",{parentName:"ul"},"SME Review: 2 weeks (plus additional iteration time based on feedback)"),(0,r.kt)("li",{parentName:"ul"},"Team Consensus: 2 weeks")),(0,r.kt)("h2",{id:"roles-and-responsibilities"},"Roles and Responsibilities"),(0,r.kt)("h3",{id:"what-are-the-expectations-for-an-internal-reviewer"},"What are the expectations for an Internal Reviewer?"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Determine the if the submitted pattern aligns to green software and is clearly written"),(0,r.kt)("li",{parentName:"ul"},"Ensure the submitted pattern provides enough detail for the Subject Matter Expert to effectively evaluate"),(0,r.kt)("li",{parentName:"ul"},"Ensure the submitted pattern follows the defined pattern template"),(0,r.kt)("li",{parentName:"ul"},"Provide clear feedback to the submitter if any of these areas are missing or not up to the defined standard "),(0,r.kt)("li",{parentName:"ul"},"Assign the pattern to a relevant Subject Matter Expert for further review")),(0,r.kt)("h3",{id:"what-are-the-expectations-for-a-subject-matter-experts-review"},"What are the expectations for a Subject Matter Experts review?"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Determine if this pattern already exists in the catalog"),(0,r.kt)("li",{parentName:"ul"},"Ensure there is appropriate level of detail for this pattern to be implemented"),(0,r.kt)("li",{parentName:"ul"},"Determine the efficacy and accuracy of the submitted pattern"),(0,r.kt)("li",{parentName:"ul"},"Explore splitting or combining patterns as necessary to meet the defined level of depth for a pattern "),(0,r.kt)("li",{parentName:"ul"},"Provide clear feedback to the submitter if any of these areas are missing or not up to the defined standard ")),(0,r.kt)("h3",{id:"what-are-the-expectations-on-the-team-to-reach-consensus"},"What are the expectations on the Team to reach consensus?"),(0,r.kt)("p",null,"TODO"),(0,r.kt)("h3",{id:"what-are-the-expectations-on-the-broader-gsf-members-in-a-consistency-review"},"What are the expectations on the broader GSF members in a consistency review?"),(0,r.kt)("p",null,"TODO"),(0,r.kt)("h2",{id:"how-granular-should-my-pattern-be"},"How granular should my pattern be?"),(0,r.kt)("p",null,"We prefer smaller atomic patterns to larger patterns. A helpful way to approach a pattern is defining a specific ",(0,r.kt)("inlineCode",{parentName:"p"},"Action")," to take on a specific ",(0,r.kt)("inlineCode",{parentName:"p"},"Resource"),". For example, ",(0,r.kt)("inlineCode",{parentName:"p"},"Write efficient code")," would be rejected as too generic since there is no specific action to take on a specific resource. Whereas ",(0,r.kt)("inlineCode",{parentName:"p"},"Cache Static Data")," provides a specific action of Caching to a specific resource of Static Data. "),(0,r.kt)("h3",{id:"least-number-of-solutions-per-pattern"},"Least number of solutions per pattern"),(0,r.kt)("p",null,"If your pattern has multiple solutions in the solutions section, that's a good hint that the pattern can be decomposed into smaller patterns, try one per solution."),(0,r.kt)("h3",{id:"touching-on-two-or-more-sci-components-is-a-sign-it-can-be-decomposed-further"},"Touching on two or more SCI components is a sign it can be decomposed further"),(0,r.kt)("p",null,"If your pattern touches on multiple components of the SCI equation simultaneously then thats a hint that your pattern can be decomposed further into multiple smaller patterns."),(0,r.kt)("h3",{id:"smallest-sci-impact"},"Smallest SCI Impact"),(0,r.kt)("p",null,"If decomposing your pattern allows the sub patterns to impact smaller areas of the SCI equation then that's a good signal to break down your pattern into smaller patterns."),(0,r.kt)("p",null,"For instance if your pattern affects, ",(0,r.kt)("inlineCode",{parentName:"p"},"E"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"I")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"M")," but it could be broken down further into two smaller patterns one that impacts only ",(0,r.kt)("inlineCode",{parentName:"p"},"E")," and the other that impacts ",(0,r.kt)("inlineCode",{parentName:"p"},"M")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"I"),". Then break down the pattern until breaking it down further doesn't create any more changes to the SCI impact section."),(0,r.kt)("h2",{id:"available-guides"},"Available Guides"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/guide/initial-reviewer-guide"},"Initial Reviewer Guide")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/guide/sme-reviewer-guide"},"Subject Matter Expert Reviewer Guide"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/7d4685ea.ae64fc90.js b/assets/js/7d4685ea.ae64fc90.js deleted file mode 100644 index 1f0e6777..00000000 --- a/assets/js/7d4685ea.ae64fc90.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9797],{4137:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>d});var n=a(7294);function r(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function i(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,n)}return a}function o(e){for(var t=1;t=0||(r[a]=e[a]);return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(r[a]=e[a])}return r}var l=n.createContext({}),p=function(e){var t=n.useContext(l),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=p(e.components);return n.createElement(l.Provider,{value:t},e.children)},h={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var a=e.components,r=e.mdxType,i=e.originalType,l=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),c=p(a),d=r,m=c["".concat(l,".").concat(d)]||c[d]||h[d]||i;return a?n.createElement(m,o(o({ref:t},u),{},{components:a})):n.createElement(m,o({ref:t},u))}));function d(e,t){var a=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var i=a.length,o=new Array(i);o[0]=c;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,o[1]=s;for(var p=2;p{a.r(t),a.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>h,frontMatter:()=>i,metadata:()=>s,toc:()=>p});var n=a(7462),r=(a(7294),a(4137));const i={sidebar_position:2},o="Guide",s={unversionedId:"guide/index",id:"guide/index",title:"Guide",description:"What is a green software pattern?",source:"@site/docs/guide/index.md",sourceDirName:"guide",slug:"/guide/",permalink:"/guide/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/guide/index.md",tags:[],version:"current",sidebarPosition:2,frontMatter:{sidebar_position:2},sidebar:"tutorialSidebar",previous:{title:"Green Software Patterns",permalink:"/"},next:{title:"Suggested Tags",permalink:"/guide/suggested-tags"}},l={},p=[{value:"What is a green software pattern?",id:"what-is-a-green-software-pattern",level:2},{value:"How to propose a new pattern or a change to a pattern?",id:"how-to-propose-a-new-pattern-or-a-change-to-a-pattern",level:2},{value:"How to submit a new pattern or a change to a pattern?",id:"how-to-submit-a-new-pattern-or-a-change-to-a-pattern",level:2},{value:"What are the stages if a Green Software Pattern?",id:"what-are-the-stages-if-a-green-software-pattern",level:2},{value:"Discussion",id:"discussion",level:3},{value:"Draft",id:"draft",level:3},{value:"Initial Review",id:"initial-review",level:3},{value:"SME Review",id:"sme-review",level:3},{value:"Team Consensus",id:"team-consensus",level:3},{value:"Consistency Review",id:"consistency-review",level:3},{value:"What are the timelines for each stage?",id:"what-are-the-timelines-for-each-stage",level:2},{value:"Roles and Responsibilities",id:"roles-and-responsibilities",level:2},{value:"What are the expectations for an Internal Reviewer?",id:"what-are-the-expectations-for-an-internal-reviewer",level:3},{value:"What are the expectations for a Subject Matter Experts review?",id:"what-are-the-expectations-for-a-subject-matter-experts-review",level:3},{value:"What are the expectations on the Team to reach consensus?",id:"what-are-the-expectations-on-the-team-to-reach-consensus",level:3},{value:"What are the expectations on the broader GSF members in a consistency review?",id:"what-are-the-expectations-on-the-broader-gsf-members-in-a-consistency-review",level:3},{value:"How granular should my pattern be?",id:"how-granular-should-my-pattern-be",level:2},{value:"Least number of solutions per pattern",id:"least-number-of-solutions-per-pattern",level:3},{value:"Touching on two or more SCI components is a sign it can be decomposed further",id:"touching-on-two-or-more-sci-components-is-a-sign-it-can-be-decomposed-further",level:3},{value:"Smallest SCI Impact",id:"smallest-sci-impact",level:3},{value:"Available Guides",id:"available-guides",level:2}],u={toc:p};function h(e){let{components:t,...a}=e;return(0,r.kt)("wrapper",(0,n.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"guide"},"Guide"),(0,r.kt)("h2",{id:"what-is-a-green-software-pattern"},"What is a green software pattern?"),(0,r.kt)("p",null,"A green software pattern if applied correctly will reduce the emissions of your software. Every pattern in the database contains these sections:"),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Metadata")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Version"),": Designation of iteration on the pattern. This will initially be assigned by the patterns working group and defaults to 1.0"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Submitted By"),": The name of the person(s) submitting the pattern"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Published Date"),": The date this version of the pattern is published. This will be provided by the patterns working group upon approval"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Tag Category"),": Select the most appropriate category from: Artificial Intelligence, Cloud, or Web which might apply to this pattern"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Tags"),": A ",(0,r.kt)("a",{parentName:"li",href:"/guide/suggested-tags"},"pre-defined list of additional tags")," which might apply to the pattern (e.g. Machine Learning, Gaming, Mobile).")),(0,r.kt)("p",null,(0,r.kt)("strong",{parentName:"p"},"Pattern Content")),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Title"),": Title of the pattern. Please follow the naming convention of an ",(0,r.kt)("inlineCode",{parentName:"li"},"Action")," taken on a ",(0,r.kt)("inlineCode",{parentName:"li"},"Resource"),'. Example: "Reduce compute requirements"'),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Description"),": A full description of what problem this pattern is solving"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Solution"),": How will this patter solve the problem"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"SCI Impact"),": How will this pattern affect an SCI score of an application and why"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Assumptions"),": What are the assumptions being made"),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"Considerations"),": Discussion section anything that should be taken into consideration when implementing this pattern "),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("strong",{parentName:"li"},"References"),": Use this section to provide relevant links for your pattern content from other web sites")),(0,r.kt)("h2",{id:"how-to-propose-a-new-pattern-or-a-change-to-a-pattern"},"How to ",(0,r.kt)("strong",{parentName:"h2"},"propose")," a new pattern or a change to a pattern?"),(0,r.kt)("p",null,"Whether you are proposing a new pattern or a change to an existing pattern. The first step is to discuss the change with others."),(0,r.kt)("p",null,"Open a ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Green-Software-Foundation/green-software-patterns/issues"},"GitHub issue")," to discuss your changes."),(0,r.kt)("p",null,"Use the appropriate GitHub issue template for the change you would like to make."),(0,r.kt)("h2",{id:"how-to-submit-a-new-pattern-or-a-change-to-a-pattern"},"How to ",(0,r.kt)("strong",{parentName:"h2"},"submit")," a new pattern or a change to a pattern?"),(0,r.kt)("p",null,"You will need experience with GitHub and Pull Requests in order to submit a change."),(0,r.kt)("p",null,"All changes follow a series of approval stages that starts with a PULL REQUEST made to the ",(0,r.kt)("inlineCode",{parentName:"p"},"dev")," branch."),(0,r.kt)("p",null,"Fork the repository\nCheckout the ",(0,r.kt)("inlineCode",{parentName:"p"},"dev")," branch make the changes that you see fit. You can edit an existing pattern or creating a new markdown file for a new pattern. For any new patterns, please follow the Pattern Template provided in root of the ",(0,r.kt)("a",{parentName:"p",href:"https://github.com/Green-Software-Foundation/green-software-patterns"},"GitHub repository"),(0,r.kt)("br",{parentName:"p"}),"\n","Create a PULL REQUEST to merge your changes in with the official repository, remember it should be against the ",(0,r.kt)("inlineCode",{parentName:"p"},"dev")," branch."),(0,r.kt)("p",null,"This starts an approval process."),(0,r.kt)("h2",{id:"what-are-the-stages-if-a-green-software-pattern"},"What are the stages if a Green Software Pattern?"),(0,r.kt)("h3",{id:"discussion"},"Discussion"),(0,r.kt)("p",null,"Anyone (member or non-members) can discuss patterns via the GitHub Issues tab of the repository. There will be an issue template to suggest new patterns or suggest changes to existing patterns. Once they are ready then can go ahead and create a PR to add a pattern to the database."),(0,r.kt)("h3",{id:"draft"},"Draft"),(0,r.kt)("p",null,"Anyone (member or non-members) can create a PR matching the template for Green Software Patterns to be merged into the dev branch. This starts an internal process of review."),(0,r.kt)("h3",{id:"initial-review"},"Initial Review"),(0,r.kt)("p",null,"An initial review by one member of the patterns project. The goal of this stage is just to make sure the pattern meets core requirements for what a pattern should contain, is it the right format, syntax etc\u2026? "),(0,r.kt)("p",null,"The initial reviewer will also decide what subject matter experts are required to review this pattern. "),(0,r.kt)("p",null,"This needs an explicit approval from the initial reviewer before the pattern can move to the next stage. "),(0,r.kt)("h3",{id:"sme-review"},"SME Review"),(0,r.kt)("p",null,"One or more subject matter experts in the GSF are asked to review the pattern and give their feedback. E.g. If the pattern is in the machine-learning catalog we ask a machine learning expert to review."),(0,r.kt)("p",null,"This needs an explicit approval from the SME reviewer before the pattern can move to the next stage."),(0,r.kt)("h3",{id:"team-consensus"},"Team Consensus"),(0,r.kt)("p",null,"Once the pattern has been approved by the SME it starts the team review phase. The principles and patterns team has 2 weeks to comment/object to the pattern. It needs consensus before the PR can be approved and merged into dev."),(0,r.kt)("p",null,"At the end of this stage the pattern is merged into ",(0,r.kt)("inlineCode",{parentName:"p"},"dev")," but is ",(0,r.kt)("strong",{parentName:"p"},"not published on our official catalog"),"."),(0,r.kt)("h3",{id:"consistency-review"},"Consistency Review"),(0,r.kt)("p",null,"Every quarter the ",(0,r.kt)("inlineCode",{parentName:"p"},"dev")," branch is merged to the ",(0,r.kt)("inlineCode",{parentName:"p"},"main")," branch and this triggers a consistency review where anyone in the Foundation has 2 weeks to comment or object. We need GSF wide consensus for the patterns to be published."),(0,r.kt)("p",null,"This is done in batches every quarter to reduce the noise to the rest of the Foundation."),(0,r.kt)("h2",{id:"what-are-the-timelines-for-each-stage"},"What are the timelines for each stage?"),(0,r.kt)("p",null,"The working group will regularly review submitted patterns along the following timeline:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Initial Review: 1 week"),(0,r.kt)("li",{parentName:"ul"},"SME Review: 2 weeks (plus additional iteration time based on feedback)"),(0,r.kt)("li",{parentName:"ul"},"Team Consensus: 2 weeks")),(0,r.kt)("h2",{id:"roles-and-responsibilities"},"Roles and Responsibilities"),(0,r.kt)("h3",{id:"what-are-the-expectations-for-an-internal-reviewer"},"What are the expectations for an Internal Reviewer?"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Determine the if the submitted pattern aligns to green software and is clearly written"),(0,r.kt)("li",{parentName:"ul"},"Ensure the submitted pattern provides enough detail for the Subject Matter Expert to effectively evaluate"),(0,r.kt)("li",{parentName:"ul"},"Ensure the submitted pattern follows the defined pattern template"),(0,r.kt)("li",{parentName:"ul"},"Provide clear feedback to the submitter if any of these areas are missing or not up to the defined standard "),(0,r.kt)("li",{parentName:"ul"},"Assign the pattern to a relevant Subject Matter Expert for further review")),(0,r.kt)("h3",{id:"what-are-the-expectations-for-a-subject-matter-experts-review"},"What are the expectations for a Subject Matter Experts review?"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"Determine if this pattern already exists in the catalog"),(0,r.kt)("li",{parentName:"ul"},"Ensure there is appropriate level of detail for this pattern to be implemented"),(0,r.kt)("li",{parentName:"ul"},"Determine the efficacy and accuracy of the submitted pattern"),(0,r.kt)("li",{parentName:"ul"},"Explore splitting or combining patterns as necessary to meet the defined level of depth for a pattern "),(0,r.kt)("li",{parentName:"ul"},"Provide clear feedback to the submitter if any of these areas are missing or not up to the defined standard ")),(0,r.kt)("h3",{id:"what-are-the-expectations-on-the-team-to-reach-consensus"},"What are the expectations on the Team to reach consensus?"),(0,r.kt)("p",null,"TODO"),(0,r.kt)("h3",{id:"what-are-the-expectations-on-the-broader-gsf-members-in-a-consistency-review"},"What are the expectations on the broader GSF members in a consistency review?"),(0,r.kt)("p",null,"TODO"),(0,r.kt)("h2",{id:"how-granular-should-my-pattern-be"},"How granular should my pattern be?"),(0,r.kt)("p",null,"We prefer smaller atomic patterns to larger patterns. A helpful way to approach a pattern is defining a specific ",(0,r.kt)("inlineCode",{parentName:"p"},"Action")," to take on a specific ",(0,r.kt)("inlineCode",{parentName:"p"},"Resource"),". For example, ",(0,r.kt)("inlineCode",{parentName:"p"},"Write efficient code")," would be rejected as too generic since there is no specific action to take on a specific resource. Whereas ",(0,r.kt)("inlineCode",{parentName:"p"},"Cache Static Data")," provides a specific action of Caching to a specific resource of Static Data. "),(0,r.kt)("h3",{id:"least-number-of-solutions-per-pattern"},"Least number of solutions per pattern"),(0,r.kt)("p",null,"If your pattern has multiple solutions in the solutions section, that's a good hint that the pattern can be decomposed into smaller patterns, try one per solution."),(0,r.kt)("h3",{id:"touching-on-two-or-more-sci-components-is-a-sign-it-can-be-decomposed-further"},"Touching on two or more SCI components is a sign it can be decomposed further"),(0,r.kt)("p",null,"If your pattern touches on multiple components of the SCI equation simultaneously then thats a hint that your pattern can be decomposed further into multiple smaller patterns."),(0,r.kt)("h3",{id:"smallest-sci-impact"},"Smallest SCI Impact"),(0,r.kt)("p",null,"If decomposing your pattern allows the sub patterns to impact smaller areas of the SCI equation then that's a good signal to break down your pattern into smaller patterns."),(0,r.kt)("p",null,"For instance if your pattern affects, ",(0,r.kt)("inlineCode",{parentName:"p"},"E"),", ",(0,r.kt)("inlineCode",{parentName:"p"},"I")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"M")," but it could be broken down further into two smaller patterns one that impacts only ",(0,r.kt)("inlineCode",{parentName:"p"},"E")," and the other that impacts ",(0,r.kt)("inlineCode",{parentName:"p"},"M")," and ",(0,r.kt)("inlineCode",{parentName:"p"},"I"),". Then break down the pattern until breaking it down further doesn't create any more changes to the SCI impact section."),(0,r.kt)("h2",{id:"available-guides"},"Available Guides"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/guide/initial-reviewer-guide"},"Initial Reviewer Guide")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"/guide/sme-reviewer-guide"},"Subject Matter Expert Reviewer Guide"))))}h.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8002bf56.d2c0388f.js b/assets/js/8002bf56.d2c0388f.js deleted file mode 100644 index 23c2dc31..00000000 --- a/assets/js/8002bf56.d2c0388f.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7860],{4137:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>g});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),g=a,f=p["".concat(l,".").concat(g)]||p[g]||u[g]||i;return r?n.createElement(f,s(s({ref:t},d),{},{components:r})):n.createElement(f,s({ref:t},d))}));function g(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:"dubrie, holanita",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",description:"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.",tags:["storage","role:web-developer","role:software-engineer","size:small"]},s="Avoid tracking unnecessary data",o={unversionedId:"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.",source:"@site/docs/catalog/web/avoid-tracking-unnecessary-data.md",sourceDirName:"catalog/web",slug:"/catalog/web/avoid-tracking-unnecessary-data",permalink:"/catalog/web/avoid-tracking-unnecessary-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/avoid-tracking-unnecessary-data.md",tags:[{label:"storage",permalink:"/tags/storage"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie, holanita",published_date:"2022-11-10T00:00:00.000Z",category:"web",description:"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.",tags:["storage","role:web-developer","role:software-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Avoid an excessive DOM size",permalink:"/catalog/web/avoid-excessive-dom-size"},next:{title:"Defer offscreen images",permalink:"/catalog/web/defer-offscreen-images"}},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:"avoid-tracking-unnecessary-data"},"Avoid tracking unnecessary data"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services. This is primarily due to the large size of tracking and advertising scripts, the energy required to process and track user behavior, and databases collecting vast amounts of user data. Furthermore, this can present a significant violation of user privacy and tangibly degrade user experience."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"From an energy efficiency perspective, avoiding tracking unnecessary user data will reduce the overall workload for page loads and decrease overall page weight of the site. "),(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,"Avoiding tracking unnecessary data will impact SCI as follows:"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"E"),": Avoiding the tracking of unnecessary data will reduce time spent on transfering and processing web pages.\n",(0,a.kt)("inlineCode",{parentName:"p"},"I"),": Avoiding the tracking of unnecessary data will reduce the amount of energy consumed by the users browser, reducing the intensity of carbon emissions. "),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The term ",(0,a.kt)("inlineCode",{parentName:"li"},"unnecessary")," here is assumed to mean data that is not required for the functionality of the site. Things like advertisements, user location, or click patterns are considered not-critical functionality for a site.")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Consider what data is absolutely critical to your site functionality and what data can be deferred, sampled, or aggregated from other more energy efficient sources.")),(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://github.com/Green-Software-Foundation/green-software-patterns/issues/52"},"https://github.com/Green-Software-Foundation/green-software-patterns/issues/52")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://sustainablewebdesign.org/does-the-website-avoid-tracking-user-behaviour-and-collecting-data-unnecessarily/"},"Does the website avoid tracking user behavior and collecting data unnecessarily?"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8002bf56.db7acfed.js b/assets/js/8002bf56.db7acfed.js new file mode 100644 index 00000000..19913062 --- /dev/null +++ b/assets/js/8002bf56.db7acfed.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7860],{4137:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>g});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 s(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):s(s({},t),e)),n},d=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u={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,d=o(e,["components","mdxType","originalType","parentName"]),p=c(n),g=a,f=p["".concat(l,".").concat(g)]||p[g]||u[g]||i;return n?r.createElement(f,s(s({ref:t},d),{},{components:n})):r.createElement(f,s({ref:t},d))}));function g(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=n.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{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>c});var r=n(7462),a=(n(7294),n(4137));const i={version:1,submitted_by:"dubrie, holanita",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",description:"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.",tags:["storage","role:web-developer","role:software-engineer","size:small"]},s="Avoid tracking unnecessary data",o={unversionedId:"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.",source:"@site/docs/catalog/web/avoid-tracking-unnecessary-data.md",sourceDirName:"catalog/web",slug:"/catalog/web/avoid-tracking-unnecessary-data",permalink:"/catalog/web/avoid-tracking-unnecessary-data",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/avoid-tracking-unnecessary-data.md",tags:[{label:"storage",permalink:"/tags/storage"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie, holanita",published_date:"2022-11-10T00:00:00.000Z",category:"web",description:"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services.",tags:["storage","role:web-developer","role:software-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Avoid an excessive DOM size",permalink:"/catalog/web/avoid-excessive-dom-size"},next:{title:"Defer offscreen images",permalink:"/catalog/web/defer-offscreen-images"}},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,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"avoid-tracking-unnecessary-data"},"Avoid tracking unnecessary data"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"User tracking, user data collection and targeting in things like advertisements are responsible for significant energy use in many digital products, and services. This is primarily due to the large size of tracking and advertising scripts, the energy required to process and track user behavior, and databases collecting vast amounts of user data. Furthermore, this can present a significant violation of user privacy and tangibly degrade user experience."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"From an energy efficiency perspective, avoiding tracking unnecessary user data will reduce the overall workload for page loads and decrease overall page weight of the site. "),(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,"Avoiding tracking unnecessary data will impact SCI as follows:"),(0,a.kt)("p",null,(0,a.kt)("inlineCode",{parentName:"p"},"E"),": Avoiding the tracking of unnecessary data will reduce time spent on transfering and processing web pages.\n",(0,a.kt)("inlineCode",{parentName:"p"},"I"),": Avoiding the tracking of unnecessary data will reduce the amount of energy consumed by the users browser, reducing the intensity of carbon emissions. "),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The term ",(0,a.kt)("inlineCode",{parentName:"li"},"unnecessary")," here is assumed to mean data that is not required for the functionality of the site. Things like advertisements, user location, or click patterns are considered not-critical functionality for a site.")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Consider what data is absolutely critical to your site functionality and what data can be deferred, sampled, or aggregated from other more energy efficient sources.")),(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://github.com/Green-Software-Foundation/green-software-patterns/issues/52"},"https://github.com/Green-Software-Foundation/green-software-patterns/issues/52")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://sustainablewebdesign.org/does-the-website-avoid-tracking-user-behaviour-and-collecting-data-unnecessarily/"},"Does the website avoid tracking user behavior and collecting data unnecessarily?"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/836ef5f0.da45542c.js b/assets/js/836ef5f0.da45542c.js new file mode 100644 index 00000000..14511789 --- /dev/null +++ b/assets/js/836ef5f0.da45542c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[146],{4137:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>d});var i=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,i)}return t}function a(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=i.createContext({}),c=function(e){var n=i.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},p=function(e){var n=c(e.components);return i.createElement(l.Provider,{value:n},e.children)},u={inlineCode:"code",wrapper:function(e){var n=e.children;return i.createElement(i.Fragment,{},n)}},m=i.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),m=c(t),d=r,h=m["".concat(l,".").concat(d)]||m[d]||u[d]||o;return t?i.createElement(h,a(a({ref:n},p),{},{components:t})):i.createElement(h,a({ref:n},p))}));function d(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,a=new Array(o);a[0]=m;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s.mdxType="string"==typeof e?e:r,a[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var i=t(7462),r=(t(7294),t(4137));const o={version:1,submitted_by:"camcash17",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["cloud","deployment"]},a="Minimize the total number of deployed environments",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/minimizing-deployed-environments.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/minimizing-deployed-environments",permalink:"/catalog/cloud/minimizing-deployed-environments",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/minimizing-deployed-environments.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"deployment",permalink:"/tags/deployment"}],version:"current",frontMatter:{version:1,submitted_by:"camcash17",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["cloud","deployment"]},sidebar:"tutorialSidebar",previous:{title:"Match utilization requirements with pre-configured servers",permalink:"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},next:{title:"Optimise storage utilization",permalink:"/catalog/cloud/optimise-storage-resource-utilisation"}},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}],p={toc:c};function u(e){let{components:n,...t}=e;return(0,r.kt)("wrapper",(0,i.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"minimize-the-total-number-of-deployed-environments"},"Minimize the total number of deployed environments"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"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 environments are used to make sure there are no issues before code reaches a production environment where users may have access."),(0,r.kt)("p",null,"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 environment and it's environmental impact."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"From an energy-efficiency perspective, it's better to minimize the amount of deployed environments for an application so that less resources are provisioned and less energy is required."),(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"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,r.kt)("p",null,"Reducing the amount of deployed environments will impact SCI as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"E"),": We reduce the total electricity required by reducing provisioned resources."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the amount of nodes running on underlying machines, the total embodied carbon is lower.")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("p",null,"Suppose we choose to remove a deployed performance environment for an application. Another existing environment like ",(0,r.kt)("inlineCode",{parentName:"p"},"QA")," could be repurposed for both quality assurance and performance testing to save and optimize existing resources."),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("p",null,"It may reduce cloud bills because minimising the total amount of provisioned resources will cost less. It may also create a bottleneck in the application life cycle, losing an environment created for the sole purpose of performance or QA testing."),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency/"},"Hardware Efficiency Principle"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/836ef5f0.db5cf3bd.js b/assets/js/836ef5f0.db5cf3bd.js deleted file mode 100644 index 8dfea603..00000000 --- a/assets/js/836ef5f0.db5cf3bd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[146],{4137:(e,n,t)=>{t.d(n,{Zo:()=>p,kt:()=>d});var i=t(7294);function r(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function o(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,i)}return t}function a(e){for(var n=1;n=0||(r[t]=e[t]);return r}(e,n);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(r[t]=e[t])}return r}var l=i.createContext({}),c=function(e){var n=i.useContext(l),t=n;return e&&(t="function"==typeof e?e(n):a(a({},n),e)),t},p=function(e){var n=c(e.components);return i.createElement(l.Provider,{value:n},e.children)},u={inlineCode:"code",wrapper:function(e){var n=e.children;return i.createElement(i.Fragment,{},n)}},m=i.forwardRef((function(e,n){var t=e.components,r=e.mdxType,o=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),m=c(t),d=r,f=m["".concat(l,".").concat(d)]||m[d]||u[d]||o;return t?i.createElement(f,a(a({ref:n},p),{},{components:t})):i.createElement(f,a({ref:n},p))}));function d(e,n){var t=arguments,r=n&&n.mdxType;if("string"==typeof e||r){var o=t.length,a=new Array(o);a[0]=m;var s={};for(var l in n)hasOwnProperty.call(n,l)&&(s[l]=n[l]);s.originalType=e,s.mdxType="string"==typeof e?e:r,a[1]=s;for(var c=2;c{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>o,metadata:()=>s,toc:()=>c});var i=t(7462),r=(t(7294),t(4137));const o={version:1,submitted_by:"camcash17",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["cloud","deployment"]},a="Minimize the total number of deployed environments",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/minimizing-deployed-environments.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/minimizing-deployed-environments",permalink:"/catalog/cloud/minimizing-deployed-environments",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/minimizing-deployed-environments.md",tags:[{label:"cloud",permalink:"/tags/cloud"},{label:"deployment",permalink:"/tags/deployment"}],version:"current",frontMatter:{version:1,submitted_by:"camcash17",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["cloud","deployment"]},sidebar:"tutorialSidebar",previous:{title:"Match utilization requirements with pre-configured servers",permalink:"/catalog/cloud/match-utilization-requirements-with-pre-configured-server"},next:{title:"Optimise storage utilization",permalink:"/catalog/cloud/optimise-storage-resource-utilisation"}},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}],p={toc:c};function u(e){let{components:n,...t}=e;return(0,r.kt)("wrapper",(0,i.Z)({},p,t,{components:n,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"minimize-the-total-number-of-deployed-environments"},"Minimize the total number of deployed environments"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"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 environments are used to make sure there are no issues before code reaches a production environment where users may have access."),(0,r.kt)("p",null,"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 environment and it's environmental impact."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"From an energy-efficiency perspective, it's better to minimize the amount of deployed environments for an application so that less resources are provisioned and less energy is required."),(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"),(0,r.kt)("br",{parentName:"p"}),"\n",(0,r.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,r.kt)("p",null,"Reducing the amount of deployed environments will impact SCI as follows:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"E"),": We reduce the total electricity required by reducing provisioned resources."),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the amount of nodes running on underlying machines, the total embodied carbon is lower.")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("p",null,"Suppose we choose to remove a deployed performance environment for an application. Another existing environment like ",(0,r.kt)("inlineCode",{parentName:"p"},"QA")," could be repurposed for both quality assurance and performance testing to save and optimize existing resources."),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("p",null,"It may reduce cloud bills because minimising the total amount of provisioned resources will cost less. It may also create a bottleneck in the application life cycle, losing an environment created for the sole purpose of performance or QA testing."),(0,r.kt)("h2",{id:"references"},"References"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle")),(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/hardware-efficiency/"},"Hardware Efficiency Principle"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/8f91f489.4e27d9c9.js b/assets/js/8f91f489.4e27d9c9.js new file mode 100644 index 00000000..85135181 --- /dev/null +++ b/assets/js/8f91f489.4e27d9c9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7182],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var o=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 o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=o.createContext({}),u=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=u(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,i=e.mdxType,n=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(r),m=i,g=d["".concat(l,".").concat(m)]||d[m]||p[m]||n;return r?o.createElement(g,a(a({ref:t},c),{},{components:r})):o.createElement(g,a({ref:t},c))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,a=new Array(n);a[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,a[1]=s;for(var u=2;u{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>n,metadata:()=>s,toc:()=>u});var o=r(7462),i=(r(7294),r(4137));const n={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["storage","role:cloud-engineer","role:software-engineer","size:small"]},a="Optimise storage utilization",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/optimise-storage-resource-utilisation.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/optimise-storage-resource-utilisation",permalink:"/catalog/cloud/optimise-storage-resource-utilisation",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/optimise-storage-resource-utilisation.md",tags:[{label:"storage",permalink:"/tags/storage"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"role:software-engineer",permalink:"/tags/role-software-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:"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.",tags:["storage","role:cloud-engineer","role:software-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Minimize the total number of deployed environments",permalink:"/catalog/cloud/minimizing-deployed-environments"},next:{title:"Optimize average CPU utilization",permalink:"/catalog/cloud/optimize-avg-cpu-utilization"}},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 p(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,o.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"optimise-storage-utilization"},"Optimise storage utilization"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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. "),(0,i.kt)("p",null,"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."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Move storage resources away from underutilised storage resources. "),(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,"Moving storage resources will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Moving storage resources away from underutilised storage will ",(0,i.kt)("em",{parentName:"li"},"increase")," the total storage utilisation. The more storage that is utilised, the more efficient it becomes at turning energy into useful operations. Therefore rightsizing storage volumes should reduce the energy consumption of processes."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of storage volumes required, the total embodied carbon is lower.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"If we choose oversized storage resources ",(0,i.kt)("em",{parentName:"p"},"occasionally")," because there may be a burst of workload, then undersizing them will reduce the margin available to handle the peak load. A better solution would be to consider an auto-scaling architecture that automatically scales the number of storage resources."),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"It may reduce cloud bills, as using less storage volumes will cost less. "),(0,i.kt)("li",{parentName:"ul"},"If auto-scaling architecture is absent, there is more overhead for handling spikes in load.")),(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.greensoftware.foundation/practitioner/hardware-efficiency"},"Hardware Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.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/8f91f489.e98c4381.js b/assets/js/8f91f489.e98c4381.js deleted file mode 100644 index 641ebb39..00000000 --- a/assets/js/8f91f489.e98c4381.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[7182],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var o=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 o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,o)}return r}function a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var l=o.createContext({}),u=function(e){var t=o.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=u(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,i=e.mdxType,n=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(r),m=i,g=d["".concat(l,".").concat(m)]||d[m]||p[m]||n;return r?o.createElement(g,a(a({ref:t},c),{},{components:r})):o.createElement(g,a({ref:t},c))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=r.length,a=new Array(n);a[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,a[1]=s;for(var u=2;u{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>n,metadata:()=>s,toc:()=>u});var o=r(7462),i=(r(7294),r(4137));const n={version:1,submitted_by:"greenhsu123",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["storage","role:cloud-engineer","role:software-engineer","size:small"]},a="Optimise storage utilization",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/optimise-storage-resource-utilisation.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/optimise-storage-resource-utilisation",permalink:"/catalog/cloud/optimise-storage-resource-utilisation",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/optimise-storage-resource-utilisation.md",tags:[{label:"storage",permalink:"/tags/storage"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"role:software-engineer",permalink:"/tags/role-software-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:"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.",tags:["storage","role:cloud-engineer","role:software-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Minimize the total number of deployed environments",permalink:"/catalog/cloud/minimizing-deployed-environments"},next:{title:"Optimize average CPU utilization",permalink:"/catalog/cloud/optimize-avg-cpu-utilization"}},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 p(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,o.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"optimise-storage-utilization"},"Optimise storage utilization"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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. "),(0,i.kt)("p",null,"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."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Move storage resources away from underutilised storage resources. "),(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,"Moving storage resources will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Moving storage resources away from underutilised storage will ",(0,i.kt)("em",{parentName:"li"},"increase")," the total storage utilisation. The more storage that is utilised, the more efficient it becomes at turning energy into useful operations. Therefore rightsizing storage volumes should reduce the energy consumption of processes."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of storage volumes required, the total embodied carbon is lower.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"If we choose oversized storage resources ",(0,i.kt)("em",{parentName:"p"},"occasionally")," because there may be a burst of workload, then undersizing them will reduce the margin available to handle the peak load. A better solution would be to consider an auto-scaling architecture that automatically scales the number of storage resources."),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"It may reduce cloud bills, as using less storage volumes will cost less. "),(0,i.kt)("li",{parentName:"ul"},"If auto-scaling architecture is absent, there is more overhead for handling spikes in load.")),(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.greensoftware.foundation/practitioner/hardware-efficiency"},"Hardware Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.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/9209d359.3d600634.js b/assets/js/9209d359.38961375.js similarity index 84% rename from assets/js/9209d359.3d600634.js rename to assets/js/9209d359.38961375.js index 842cbef0..4677e15a 100644 --- a/assets/js/9209d359.3d600634.js +++ b/assets/js/9209d359.38961375.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6214],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});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 c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),f=p(r),d=o,m=f["".concat(c,".").concat(d)]||f[d]||l[d]||a;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var n=r(7462),o=(r(7294),r(4137));const a={sidebar_position:4},i="Tags",s={unversionedId:"tags/index",id:"tags/index",title:"Tags",description:"",source:"@site/docs/tags/index.md",sourceDirName:"tags",slug:"/tags/",permalink:"/tags/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/tags/index.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Serve images in modern formats",permalink:"/catalog/web/serve-images-in-modern-formats"}},c={},p=[],u={toc:p};function l(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:"tags"},"Tags"))}l.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6214],{4137:(e,t,r)=>{r.d(t,{Zo:()=>u,kt:()=>d});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 c=n.createContext({}),p=function(e){var t=n.useContext(c),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},u=function(e){var t=p(e.components);return n.createElement(c.Provider,{value:t},e.children)},l={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},f=n.forwardRef((function(e,t){var r=e.components,o=e.mdxType,a=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),f=p(r),d=o,m=f["".concat(c,".").concat(d)]||f[d]||l[d]||a;return r?n.createElement(m,i(i({ref:t},u),{},{components:r})):n.createElement(m,i({ref:t},u))}));function d(e,t){var r=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=r.length,i=new Array(a);i[0]=f;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:o,i[1]=s;for(var p=2;p{r.r(t),r.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>l,frontMatter:()=>a,metadata:()=>s,toc:()=>p});var n=r(7462),o=(r(7294),r(4137));const a={sidebar_position:4},i="Tags",s={unversionedId:"tags/index",id:"tags/index",title:"Tags",description:"",source:"@site/docs/tags/index.md",sourceDirName:"tags",slug:"/tags/",permalink:"/tags/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/tags/index.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{sidebar_position:4},sidebar:"tutorialSidebar",previous:{title:"Serve images in modern formats",permalink:"/catalog/web/serve-images-in-modern-formats"}},c={},p=[],u={toc:p};function l(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:"tags"},"Tags"))}l.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/93d64a37.93332187.js b/assets/js/93d64a37.93332187.js deleted file mode 100644 index 7a0bdce4..00000000 --- a/assets/js/93d64a37.93332187.js +++ /dev/null @@ -1 +0,0 @@ -"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,g=p["".concat(l,".").concat(m)]||p[m]||d[m]||i;return r?n.createElement(g,o(o({ref:t},u),{},{components:r})):n.createElement(g,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/green-software-patterns/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:"Delete unused storage resources",permalink:"/catalog/cloud/delete-unused-storage-resources"},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/93d64a37.e2e63719.js b/assets/js/93d64a37.e2e63719.js new file mode 100644 index 00000000..d74e34ae --- /dev/null +++ b/assets/js/93d64a37.e2e63719.js @@ -0,0 +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,g=p["".concat(l,".").concat(m)]||p[m]||d[m]||i;return r?n.createElement(g,o(o({ref:t},u),{},{components:r})):n.createElement(g,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:"Delete unused storage resources",permalink:"/catalog/cloud/delete-unused-storage-resources"},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/957fd519.d5ee2d31.js b/assets/js/957fd519.d5ee2d31.js new file mode 100644 index 00000000..4e892b7b --- /dev/null +++ b/assets/js/957fd519.d5ee2d31.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9275],{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,g=d["".concat(l,".").concat(m)]||d[m]||p[m]||i;return n?r.createElement(g,o(o({ref:t},u),{},{components:n})):r.createElement(g,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:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Use sustainable regions for AI/ML training",s={unversionedId:"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.",source:"@site/docs/catalog/ai/leverage-sustainable-regions.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/leverage-sustainable-regions",permalink:"/catalog/ai/leverage-sustainable-regions",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/ai/leverage-sustainable-regions.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Use energy efficient AI/ML models",permalink:"/catalog/ai/energy-efficent-models"},next:{title:"Leverage pre-trained models and transfer learning for AI/ML development",permalink:"/catalog/ai/pre-trained-transfer-learning"}},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:"use-sustainable-regions-for-aiml-training"},"Use sustainable regions for AI/ML training"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Training an AI model has a significant carbon footprint. 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."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Use a cloud region which has a lower carbon intensity value for running your AI/ML training workloads."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Using a lower carbon intensity region for AI/ML training impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Using a lower carbon intensity region for ML training would reduce the carbon emissions of ML applications, therefore decreasing the amount of energy consumed.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"The migration of workloads to other regions assumes you have taken into consideration privacy, security, or data sovereignty based on your application requirements. "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"Consider the trade-offs between carbon footprint, cost, and latency when selecting a region. "),(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://cloud.google.com/blog/topics/sustainability/google-cloud-region-picker-helps-you-make-the-green-choice"},"Faster, cheaper, greener? Pick the Google Cloud region that\u2019s right for you")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://sustainability.aboutamazon.com/around-the-globe?energyType=true"},"Amazon\u2019s sustainability regions")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://azure.microsoft.com/en-us/explore/global-infrastructure/sustainability/"},"Azure sustainability")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://cloud.google.com/sustainability/region-carbon"},"Google Cloud sustainability regions"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/957fd519.f639f16e.js b/assets/js/957fd519.f639f16e.js deleted file mode 100644 index d02cf8a5..00000000 --- a/assets/js/957fd519.f639f16e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9275],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>g});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),g=a,m=d["".concat(l,".").concat(g)]||d[g]||p[g]||i;return n?r.createElement(m,o(o({ref:t},u),{},{components:n})):r.createElement(m,o({ref:t},u))}));function g(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:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Use sustainable regions for AI/ML training",s={unversionedId:"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.",source:"@site/docs/catalog/ai/leverage-sustainable-regions.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/leverage-sustainable-regions",permalink:"/catalog/ai/leverage-sustainable-regions",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/ai/leverage-sustainable-regions.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Use energy efficient AI/ML models",permalink:"/catalog/ai/energy-efficent-models"},next:{title:"Leverage pre-trained models and transfer learning for AI/ML development",permalink:"/catalog/ai/pre-trained-transfer-learning"}},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:"use-sustainable-regions-for-aiml-training"},"Use sustainable regions for AI/ML training"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Training an AI model has a significant carbon footprint. 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."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Use a cloud region which has a lower carbon intensity value for running your AI/ML training workloads."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Using a lower carbon intensity region for AI/ML training impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Using a lower carbon intensity region for ML training would reduce the carbon emissions of ML applications, therefore decreasing the amount of energy consumed.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"The migration of workloads to other regions assumes you have taken into consideration privacy, security, or data sovereignty based on your application requirements. "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"Consider the trade-offs between carbon footprint, cost, and latency when selecting a region. "),(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://cloud.google.com/blog/topics/sustainability/google-cloud-region-picker-helps-you-make-the-green-choice"},"Faster, cheaper, greener? Pick the Google Cloud region that\u2019s right for you")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://sustainability.aboutamazon.com/around-the-globe?energyType=true"},"Amazon\u2019s sustainability regions")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://azure.microsoft.com/en-us/explore/global-infrastructure/sustainability/"},"Azure sustainability")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://cloud.google.com/sustainability/region-carbon"},"Google Cloud sustainability regions"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/98ee5961.43a2fbfb.js b/assets/js/98ee5961.43a2fbfb.js new file mode 100644 index 00000000..bf653848 --- /dev/null +++ b/assets/js/98ee5961.43a2fbfb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9401],{4137:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var r=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=c(e.components);return r.createElement(s.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 a=e.components,i=e.mdxType,n=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(a),h=i,m=d["".concat(s,".").concat(h)]||d[h]||p[h]||n;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=a.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{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>n,metadata:()=>l,toc:()=>c});var r=a(7462),i=(a(7294),a(4137));const n={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2023-09-28T00:00:00.000Z"),category:"cloud",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.",tags:["compute","size:medium"]},o="Use circuit breaker patterns",l={unversionedId:"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.",source:"@site/docs/catalog/cloud/use-circuit-breaker.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-circuit-breaker",permalink:"/catalog/cloud/use-circuit-breaker",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/use-circuit-breaker.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2023-09-28T00:00:00.000Z",category:"cloud",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.",tags:["compute","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Time-shift Kubernetes cron jobs",permalink:"/catalog/cloud/time-shift-kubernetes-cron-jobs"},next:{title:"Use cloud native network security tools and controls",permalink:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"}},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,...a}=e;return(0,i.kt)("wrapper",(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"use-circuit-breaker-patterns"},"Use circuit breaker patterns"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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.\nIf the other application is not reachable, all network requests against this other application will fail and future network requests are futile."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Circuit breaker patterns reject the request to the other application if health checks against the other application have failed to complete successfully. In this case a lot of network requests, and energy, can be saved.\nThe circuit breaker will reset itself automatically, if health checks against the other application are successful again."),(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,"The circuit breaker pattern reduces the following aspect:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Reduces the energy consumed, as requests are not executed if the other system is known to be not available")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Assumes that the communication target can be checked for availability")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Consider implementing an back-off strategy to automatically re-enable the requests if the resource becomes available again"),(0,i.kt)("li",{parentName:"ul"},"Consider handling different errors of the called application differently. For example exceptions that indicate that the called application will not be available for a longer time should be handled differently than exceptions that indicate only a short time in-availability.")),(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")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker"},"Azure Circuit Breaker Pattern Description"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/98ee5961.c2b6c365.js b/assets/js/98ee5961.c2b6c365.js deleted file mode 100644 index b4be286c..00000000 --- a/assets/js/98ee5961.c2b6c365.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[9401],{4137:(e,t,a)=>{a.d(t,{Zo:()=>u,kt:()=>h});var r=a(7294);function i(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function n(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t=0||(i[a]=e[a]);return i}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(i[a]=e[a])}return i}var s=r.createContext({}),c=function(e){var t=r.useContext(s),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},u=function(e){var t=c(e.components);return r.createElement(s.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 a=e.components,i=e.mdxType,n=e.originalType,s=e.parentName,u=l(e,["components","mdxType","originalType","parentName"]),d=c(a),h=i,m=d["".concat(s,".").concat(h)]||d[h]||p[h]||n;return a?r.createElement(m,o(o({ref:t},u),{},{components:a})):r.createElement(m,o({ref:t},u))}));function h(e,t){var a=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var n=a.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{a.r(t),a.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>n,metadata:()=>l,toc:()=>c});var r=a(7462),i=(a(7294),a(4137));const n={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2023-09-28T00:00:00.000Z"),category:"cloud",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.",tags:["compute","size:medium"]},o="Use circuit breaker patterns",l={unversionedId:"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.",source:"@site/docs/catalog/cloud/use-circuit-breaker.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/use-circuit-breaker",permalink:"/catalog/cloud/use-circuit-breaker",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/use-circuit-breaker.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2023-09-28T00:00:00.000Z",category:"cloud",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.",tags:["compute","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Time-shift Kubernetes cron jobs",permalink:"/catalog/cloud/time-shift-kubernetes-cron-jobs"},next:{title:"Use cloud native network security tools and controls",permalink:"/catalog/cloud/use-cloud-native-network-security-tools-and-controls"}},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,...a}=e;return(0,i.kt)("wrapper",(0,r.Z)({},u,a,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"use-circuit-breaker-patterns"},"Use circuit breaker patterns"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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.\nIf the other application is not reachable, all network requests against this other application will fail and future network requests are futile."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Circuit breaker patterns reject the request to the other application if health checks against the other application have failed to complete successfully. In this case a lot of network requests, and energy, can be saved.\nThe circuit breaker will reset itself automatically, if health checks against the other application are successful again."),(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,"The circuit breaker pattern reduces the following aspect:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Reduces the energy consumed, as requests are not executed if the other system is known to be not available")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Assumes that the communication target can be checked for availability")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Consider implementing an back-off strategy to automatically re-enable the requests if the resource becomes available again"),(0,i.kt)("li",{parentName:"ul"},"Consider handling different errors of the called application differently. For example exceptions that indicate that the called application will not be available for a longer time should be handled differently than exceptions that indicate only a short time in-availability.")),(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")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker"},"Azure Circuit Breaker Pattern Description"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/9e642b58.512315b8.js b/assets/js/9e642b58.512315b8.js new file mode 100644 index 00000000..f3812056 --- /dev/null +++ b/assets/js/9e642b58.512315b8.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 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.e1aa676b.js b/assets/js/9e642b58.e1aa676b.js deleted file mode 100644 index eea7afbb..00000000 --- a/assets/js/9e642b58.e1aa676b.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/green-software-patterns/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/a3d45d30.4a383e5f.js b/assets/js/a3d45d30.4a383e5f.js new file mode 100644 index 00000000..7577c346 --- /dev/null +++ b/assets/js/a3d45d30.4a383e5f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6431],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var n=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 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 o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}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},p=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)}},d=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(r),h=i,g=d["".concat(l,".").concat(h)]||d[h]||u[h]||a;return r?n.createElement(g,o(o({ref:t},p),{},{components:r})):n.createElement(g,o({ref:t},p))}));function h(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);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:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(7462),i=(r(7294),r(4137));const a={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",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.",tags:["web","role:web-developer","size:medium"]},o="Avoid chaining critical requests",s={unversionedId:"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.",source:"@site/docs/catalog/web/avoid-chaining-critical-requests.md",sourceDirName:"catalog/web",slug:"/catalog/web/avoid-chaining-critical-requests",permalink:"/catalog/web/avoid-chaining-critical-requests",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/avoid-chaining-critical-requests.md",tags:[{label:"web",permalink:"/tags/web"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"web",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.",tags:["web","role:web-developer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Web",permalink:"/catalog/web/"},next:{title:"Avoid an excessive DOM size",permalink:"/catalog/web/avoid-excessive-dom-size"}},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}],p={toc:c};function u(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"avoid-chaining-critical-requests"},"Avoid chaining critical requests"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Most web experiences require a lot of work from the user's browser. The intermediate steps between receiving the HTML, CSS, and JavaScript bytes and the request processing to turn them into rendered pixels is known as the critical rendering path. ",(0,i.kt)("a",{parentName:"p",href:"https://web.dev/critical-rendering-path/"},"Critical request chains")," are a series of dependent network requests that block page rendering until they complete. 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."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"From an energy efficiency perspective, avoiding critical request chains reduces the overall energy required to render a page by using loading time more efficiently without a serialized set of requests and allowing the user to begin interacting with the content earlier, potentially negating the need for any further rendering and energy consumption. "),(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,"Avoiding chaining critical requests will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Improved page rendering times will reduce the amount of energy needed to render the page ")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"There is an assumption that users are on modern web browsers that can support these types of requests. ")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Some critical request chains may be necessary, the focus here is on avoidance and only using them when absolutely critical ")),(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://web.dev/critical-rendering-path/"},"Critical Rendering Path")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://web.dev/critical-request-chains/"},"Critical Request Chains")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/Green-Software-Foundation/green-software-patterns/issues/54"},"Proposed Pattern in Issue 54"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a3d45d30.4e1854cd.js b/assets/js/a3d45d30.4e1854cd.js deleted file mode 100644 index c15a9e0e..00000000 --- a/assets/js/a3d45d30.4e1854cd.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6431],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});var n=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 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 o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}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},p=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)}},d=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(r),h=i,g=d["".concat(l,".").concat(h)]||d[h]||u[h]||a;return r?n.createElement(g,o(o({ref:t},p),{},{components:r})):n.createElement(g,o({ref:t},p))}));function h(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);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:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var n=r(7462),i=(r(7294),r(4137));const a={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",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.",tags:["web","role:web-developer","size:medium"]},o="Avoid chaining critical requests",s={unversionedId:"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.",source:"@site/docs/catalog/web/avoid-chaining-critical-requests.md",sourceDirName:"catalog/web",slug:"/catalog/web/avoid-chaining-critical-requests",permalink:"/catalog/web/avoid-chaining-critical-requests",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/avoid-chaining-critical-requests.md",tags:[{label:"web",permalink:"/tags/web"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"web",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.",tags:["web","role:web-developer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Web",permalink:"/catalog/web/"},next:{title:"Avoid an excessive DOM size",permalink:"/catalog/web/avoid-excessive-dom-size"}},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}],p={toc:c};function u(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"avoid-chaining-critical-requests"},"Avoid chaining critical requests"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Most web experiences require a lot of work from the user's browser. The intermediate steps between receiving the HTML, CSS, and JavaScript bytes and the request processing to turn them into rendered pixels is known as the critical rendering path. ",(0,i.kt)("a",{parentName:"p",href:"https://web.dev/critical-rendering-path/"},"Critical request chains")," are a series of dependent network requests that block page rendering until they complete. 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."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"From an energy efficiency perspective, avoiding critical request chains reduces the overall energy required to render a page by using loading time more efficiently without a serialized set of requests and allowing the user to begin interacting with the content earlier, potentially negating the need for any further rendering and energy consumption. "),(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,"Avoiding chaining critical requests will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Improved page rendering times will reduce the amount of energy needed to render the page ")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"There is an assumption that users are on modern web browsers that can support these types of requests. ")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Some critical request chains may be necessary, the focus here is on avoidance and only using them when absolutely critical ")),(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://web.dev/critical-rendering-path/"},"Critical Rendering Path")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://web.dev/critical-request-chains/"},"Critical Request Chains")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://github.com/Green-Software-Foundation/green-software-patterns/issues/54"},"Proposed Pattern in Issue 54"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a4dfb062.67c2d527.js b/assets/js/a4dfb062.504bb07b.js similarity index 82% rename from assets/js/a4dfb062.67c2d527.js rename to assets/js/a4dfb062.504bb07b.js index e4b6e566..15162204 100644 --- a/assets/js/a4dfb062.67c2d527.js +++ b/assets/js/a4dfb062.504bb07b.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2805],{9129:(e,t,a)=>{a.d(t,{b:()=>d,Z:()=>u});var r=a(7294);const n="container_yFwD",s="teamMember_Kw7v",c="avatar_j88W",l="name_MjYQ",i="role_RkEc",o="company_QP6n",m="social_fOOP";function d(e){let{children:t}=e;return r.createElement("div",{className:n},t)}function u(e){let{children:t,role:a,company:n,github:d,twitter:u,linkedin:p}=e;return r.createElement("div",{className:s},r.createElement("div",{className:c},r.createElement("img",{src:"https://github.com/"+d+".png",alt:"avatar"})),r.createElement("div",null,r.createElement("span",{className:l},t),r.createElement("span",{className:i},a),r.createElement("span",{className:o},"@",n),r.createElement("div",{className:m},d&&r.createElement("a",{href:"https://github.com/"+d,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 496 512",width:24},r.createElement("path",{fill:"currentColor",d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"}))),u&&r.createElement("a",{href:"https://twitter.com/"+u,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:24},r.createElement("path",{fill:"currentColor",d:"M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"}))),p&&r.createElement("a",{href:"https://www.linkedin.com/in/"+p,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",width:24},r.createElement("path",{fill:"currentColor",d:"M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"}))))))}},7045:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>m});var r=a(7462),n=(a(7294),a(4137)),s=a(9129);a(5944);const c={sidebar_position:5},l="Web",i={unversionedId:"catalog/web/index",id:"catalog/web/index",title:"Web",description:"Subject Matter Experts",source:"@site/docs/catalog/web/index.md",sourceDirName:"catalog/web",slug:"/catalog/web/",permalink:"/catalog/web/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/index.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Use serverless cloud services",permalink:"/catalog/cloud/use-serverless"},next:{title:"Avoid chaining critical requests",permalink:"/catalog/web/avoid-chaining-critical-requests"}},o={},m=[{value:"Subject Matter Experts",id:"subject-matter-experts",level:2}],d={toc:m};function u(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"web"},"Web"),(0,n.kt)("h2",{id:"subject-matter-experts"},"Subject Matter Experts"),(0,n.kt)(s.b,{mdxType:"TeamMembers"},(0,n.kt)(s.Z,{github:"markus-ntt-seidl",mdxType:"TeamMember"},"Markus Seidl"),(0,n.kt)(s.Z,{github:"dubrie",mdxType:"TeamMember"},"Bill Johnson"),(0,n.kt)(s.Z,{github:"navveenb",mdxType:"TeamMember"},"Navveen Balani")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2805],{9129:(e,t,a)=>{a.d(t,{b:()=>d,Z:()=>u});var r=a(7294);const n="container_yFwD",s="teamMember_Kw7v",c="avatar_j88W",l="name_MjYQ",i="role_RkEc",o="company_QP6n",m="social_fOOP";function d(e){let{children:t}=e;return r.createElement("div",{className:n},t)}function u(e){let{children:t,role:a,company:n,github:d,twitter:u,linkedin:p}=e;return r.createElement("div",{className:s},r.createElement("div",{className:c},r.createElement("img",{src:"https://github.com/"+d+".png",alt:"avatar"})),r.createElement("div",null,r.createElement("span",{className:l},t),r.createElement("span",{className:i},a),r.createElement("span",{className:o},"@",n),r.createElement("div",{className:m},d&&r.createElement("a",{href:"https://github.com/"+d,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 496 512",width:24},r.createElement("path",{fill:"currentColor",d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"}))),u&&r.createElement("a",{href:"https://twitter.com/"+u,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:24},r.createElement("path",{fill:"currentColor",d:"M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"}))),p&&r.createElement("a",{href:"https://www.linkedin.com/in/"+p,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",width:24},r.createElement("path",{fill:"currentColor",d:"M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"}))))))}},7045:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>o,contentTitle:()=>l,default:()=>u,frontMatter:()=>c,metadata:()=>i,toc:()=>m});var r=a(7462),n=(a(7294),a(4137)),s=a(9129);a(5944);const c={sidebar_position:5},l="Web",i={unversionedId:"catalog/web/index",id:"catalog/web/index",title:"Web",description:"Subject Matter Experts",source:"@site/docs/catalog/web/index.md",sourceDirName:"catalog/web",slug:"/catalog/web/",permalink:"/catalog/web/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/index.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Use serverless cloud services",permalink:"/catalog/cloud/use-serverless"},next:{title:"Avoid chaining critical requests",permalink:"/catalog/web/avoid-chaining-critical-requests"}},o={},m=[{value:"Subject Matter Experts",id:"subject-matter-experts",level:2}],d={toc:m};function u(e){let{components:t,...a}=e;return(0,n.kt)("wrapper",(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"web"},"Web"),(0,n.kt)("h2",{id:"subject-matter-experts"},"Subject Matter Experts"),(0,n.kt)(s.b,{mdxType:"TeamMembers"},(0,n.kt)(s.Z,{github:"markus-ntt-seidl",mdxType:"TeamMember"},"Markus Seidl"),(0,n.kt)(s.Z,{github:"dubrie",mdxType:"TeamMember"},"Bill Johnson"),(0,n.kt)(s.Z,{github:"navveenb",mdxType:"TeamMember"},"Navveen Balani")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/a637ac13.310ea95b.js b/assets/js/a637ac13.310ea95b.js deleted file mode 100644 index dc8f62b7..00000000 --- a/assets/js/a637ac13.310ea95b.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6187],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var i=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 i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=i.createContext({}),l=function(e){var t=i.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=l(e.components);return i.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},p=i.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(n),b=r,m=p["".concat(c,".").concat(b)]||p[b]||d[b]||o;return n?i.createElement(m,a(a({ref:t},u),{},{components:n})):i.createElement(m,a({ref:t},u))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=p;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:r,a[1]=s;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var i=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:"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.",tags:["kubernetes","role:cloud-engineer","size:medium"]},a="Time-shift Kubernetes cron jobs",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/time-shift-kubernetes-cron-jobs.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/time-shift-kubernetes-cron-jobs",permalink:"/catalog/cloud/time-shift-kubernetes-cron-jobs",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/time-shift-kubernetes-cron-jobs.md",tags:[{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:"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.",tags:["kubernetes","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Shed lower priority traffic",permalink:"/catalog/cloud/shed-lower-priority-traffic"},next:{title:"Use circuit breaker patterns",permalink:"/catalog/cloud/use-circuit-breaker"}},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}],u={toc:l};function d(e){let{components:t,...o}=e;return(0,r.kt)("wrapper",(0,i.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"time-shift-kubernetes-cron-jobs"},"Time-shift Kubernetes cron jobs"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"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. "),(0,r.kt)("p",null,"Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Kubernetes recurrent Jobs (such as ML Training Jobs, Batchs, etc.) are implemented ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/"},"as CronJobs"),". They can be time shifted by using ",(0,r.kt)("strong",{parentName:"p"},"carbon intensity Forecast data")," (24h usually, depdening on the Electricity data provider), to calculate the best time in the future to execute the job."),(0,r.kt)("p",null,"To capture the impact of time shifting, the following image shows variation of electricity carbon intensity during a day, from one the electricity data providers, ",(0,r.kt)("a",{parentName:"p",href:"https://app.electricitymaps.com/map"},"ElectricityMap"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"zez",src:n(4140).Z,width:"2426",height:"877"})),(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,"Regarding the SCI equation, Time shifting will impact:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"I"),": The goal is to reduce SCI by reducing carbon intensity.")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("p",null,"In order to estimate the best time to schedule the CronJob:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The execution duration of the Job is assumed to be known."),(0,r.kt)("li",{parentName:"ul"},"The Job should ideally have a flexible deadline which allows a wider time window for scheduling.")),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"This pattern does not require an application code change and can be handled at the platform operating level."),(0,r.kt)("li",{parentName:"ul"},"When cron jobs have scheduling constraints or dependencies, it can be difficult to change their timing.")))}d.isMDXComponent=!0},4140:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/time-shift-37ee67e815001ab5bdabf6e3de729124.png"}}]); \ No newline at end of file diff --git a/assets/js/a637ac13.dd0d96f1.js b/assets/js/a637ac13.dd0d96f1.js new file mode 100644 index 00000000..511fc9f8 --- /dev/null +++ b/assets/js/a637ac13.dd0d96f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6187],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>b});var i=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 i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function a(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var c=i.createContext({}),l=function(e){var t=i.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):a(a({},t),e)),n},u=function(e){var t=l(e.components);return i.createElement(c.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return i.createElement(i.Fragment,{},t)}},p=i.forwardRef((function(e,t){var n=e.components,r=e.mdxType,o=e.originalType,c=e.parentName,u=s(e,["components","mdxType","originalType","parentName"]),p=l(n),b=r,m=p["".concat(c,".").concat(b)]||p[b]||d[b]||o;return n?i.createElement(m,a(a({ref:t},u),{},{components:n})):i.createElement(m,a({ref:t},u))}));function b(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){var o=n.length,a=new Array(o);a[0]=p;var s={};for(var c in t)hasOwnProperty.call(t,c)&&(s[c]=t[c]);s.originalType=e,s.mdxType="string"==typeof e?e:r,a[1]=s;for(var l=2;l{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>s,toc:()=>l});var i=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:"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.",tags:["kubernetes","role:cloud-engineer","size:medium"]},a="Time-shift Kubernetes cron jobs",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/time-shift-kubernetes-cron-jobs.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/time-shift-kubernetes-cron-jobs",permalink:"/catalog/cloud/time-shift-kubernetes-cron-jobs",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/time-shift-kubernetes-cron-jobs.md",tags:[{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:"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.",tags:["kubernetes","role:cloud-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Shed lower priority traffic",permalink:"/catalog/cloud/shed-lower-priority-traffic"},next:{title:"Use circuit breaker patterns",permalink:"/catalog/cloud/use-circuit-breaker"}},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}],u={toc:l};function d(e){let{components:t,...o}=e;return(0,r.kt)("wrapper",(0,i.Z)({},u,o,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"time-shift-kubernetes-cron-jobs"},"Time-shift Kubernetes cron jobs"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"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. "),(0,r.kt)("p",null,"Carbon aware time scheduling, is about scheduling workloads to execute, when electricity carbon intensity is low."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Kubernetes recurrent Jobs (such as ML Training Jobs, Batchs, etc.) are implemented ",(0,r.kt)("a",{parentName:"p",href:"https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/"},"as CronJobs"),". They can be time shifted by using ",(0,r.kt)("strong",{parentName:"p"},"carbon intensity Forecast data")," (24h usually, depdening on the Electricity data provider), to calculate the best time in the future to execute the job."),(0,r.kt)("p",null,"To capture the impact of time shifting, the following image shows variation of electricity carbon intensity during a day, from one the electricity data providers, ",(0,r.kt)("a",{parentName:"p",href:"https://app.electricitymaps.com/map"},"ElectricityMap"),"."),(0,r.kt)("p",null,(0,r.kt)("img",{alt:"zez",src:n(4140).Z,width:"2426",height:"877"})),(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,"Regarding the SCI equation, Time shifting will impact:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"I"),": The goal is to reduce SCI by reducing carbon intensity.")),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("p",null,"In order to estimate the best time to schedule the CronJob:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"The execution duration of the Job is assumed to be known."),(0,r.kt)("li",{parentName:"ul"},"The Job should ideally have a flexible deadline which allows a wider time window for scheduling.")),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"This pattern does not require an application code change and can be handled at the platform operating level."),(0,r.kt)("li",{parentName:"ul"},"When cron jobs have scheduling constraints or dependencies, it can be difficult to change their timing.")))}d.isMDXComponent=!0},4140:(e,t,n)=>{n.d(t,{Z:()=>i});const i=n.p+"assets/images/time-shift-37ee67e815001ab5bdabf6e3de729124.png"}}]); \ No newline at end of file diff --git a/assets/js/a829cb4e.3e2e1fd9.js b/assets/js/a829cb4e.3e2e1fd9.js deleted file mode 100644 index 9c40ee00..00000000 --- a/assets/js/a829cb4e.3e2e1fd9.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/green-software-patterns/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/a829cb4e.d7efb83e.js b/assets/js/a829cb4e.d7efb83e.js new file mode 100644 index 00000000..24221a1b --- /dev/null +++ b/assets/js/a829cb4e.d7efb83e.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 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/ab84bad5.90224f1b.js b/assets/js/ab84bad5.90224f1b.js new file mode 100644 index 00000000..aee32a7b --- /dev/null +++ b/assets/js/ab84bad5.90224f1b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1375],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});var r=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 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||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),m=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},c=function(e){var t=m(e.components);return r.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),u=m(n),d=i,h=u["".concat(s,".").concat(d)]||u[d]||p[d]||a;return n?r.createElement(h,o(o({ref:t},c),{},{components:n})):r.createElement(h,o({ref:t},c))}));function d(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=u;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 m=2;m{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>m});var r=n(7462),i=(n(7294),n(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["web","compute","role:web-developer","size:small"]},o="Minimize main thread work",l={unversionedId:"catalog/web/minimize-main-thread-work",id:"catalog/web/minimize-main-thread-work",title:"Minimize main thread work",description:"Description",source:"@site/docs/catalog/web/minimize-main-thread-work.md",sourceDirName:"catalog/web",slug:"/catalog/web/minimize-main-thread-work",permalink:"/catalog/web/minimize-main-thread-work",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/minimize-main-thread-work.md",tags:[{label:"web",permalink:"/tags/web"},{label:"compute",permalink:"/tags/compute"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["web","compute","role:web-developer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Minify web assets",permalink:"/catalog/web/minify-web-assets"},next:{title:"Optimize image size",permalink:"/catalog/web/properly-sized-images"}},s={},m=[{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:m};function p(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"minimize-main-thread-work"},"Minimize main thread work"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Web browsers traditionally consist of a main rendering thread that handles most of the updates on the web page and the execution of JavaScript. JavaScript is executed on the main thread to simplify JavaScript implementations so the JavaScript programmer doesn't have to deal with any multi-threading programming patterns.\nWhen doing long running JavaScript computations it is running single threaded. In contrast all CPUs nowadays have multiple cores which have to be powered on while being underutilized."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"For long running JavaScript computations (e.g. computations that run longer than a few 100 ms) try to use WebWorkers and run them in another thread while keeping the main rendering thread free. Consider moving the JavaScript computation to efficient server implementations that use optimized algorithms."),(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,"Concerning the SCI equation, minimize main thread work will impact as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": CPU resources can be used more efficiently which reduces the electricity required and reduces the carbon intensity")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"An assumption is made that the code in question can be moved of the main rendering thread")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Consider moving the workload to a efficient server implementation")),(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://web.dev/mainthread-work-breakdown/"},"Main thread work breakdown")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.debugbear.com/docs/metrics/total-blocking-time#whats-a-good-total-blocking-time"},"What is a good Total Blocking Time"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/ab84bad5.a9681b30.js b/assets/js/ab84bad5.a9681b30.js deleted file mode 100644 index f8110a2c..00000000 --- a/assets/js/ab84bad5.a9681b30.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[1375],{4137:(e,t,n)=>{n.d(t,{Zo:()=>m,kt:()=>d});var r=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 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||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):o(o({},t),e)),n},m=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},u=r.forwardRef((function(e,t){var n=e.components,i=e.mdxType,a=e.originalType,s=e.parentName,m=l(e,["components","mdxType","originalType","parentName"]),u=c(n),d=i,h=u["".concat(s,".").concat(d)]||u[d]||p[d]||a;return n?r.createElement(h,o(o({ref:t},m),{},{components:n})):r.createElement(h,o({ref:t},m))}));function d(e,t){var n=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=n.length,o=new Array(a);o[0]=u;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{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>a,metadata:()=>l,toc:()=>c});var r=n(7462),i=(n(7294),n(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["web","compute","role:web-developer","size:small"]},o="Minimize main thread work",l={unversionedId:"catalog/web/minimize-main-thread-work",id:"catalog/web/minimize-main-thread-work",title:"Minimize main thread work",description:"Description",source:"@site/docs/catalog/web/minimize-main-thread-work.md",sourceDirName:"catalog/web",slug:"/catalog/web/minimize-main-thread-work",permalink:"/catalog/web/minimize-main-thread-work",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/minimize-main-thread-work.md",tags:[{label:"web",permalink:"/tags/web"},{label:"compute",permalink:"/tags/compute"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["web","compute","role:web-developer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Minify web assets",permalink:"/catalog/web/minify-web-assets"},next:{title:"Optimize image size",permalink:"/catalog/web/properly-sized-images"}},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}],m={toc:c};function p(e){let{components:t,...n}=e;return(0,i.kt)("wrapper",(0,r.Z)({},m,n,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"minimize-main-thread-work"},"Minimize main thread work"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Web browsers traditionally consist of a main rendering thread that handles most of the updates on the web page and the execution of JavaScript. JavaScript is executed on the main thread to simplify JavaScript implementations so the JavaScript programmer doesn't have to deal with any multi-threading programming patterns.\nWhen doing long running JavaScript computations it is running single threaded. In contrast all CPUs nowadays have multiple cores which have to be powered on while being underutilized."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"For long running JavaScript computations (e.g. computations that run longer than a few 100 ms) try to use WebWorkers and run them in another thread while keeping the main rendering thread free. Consider moving the JavaScript computation to efficient server implementations that use optimized algorithms."),(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,"Concerning the SCI equation, minimize main thread work will impact as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": CPU resources can be used more efficiently which reduces the electricity required and reduces the carbon intensity")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"An assumption is made that the code in question can be moved of the main rendering thread")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Consider moving the workload to a efficient server implementation")),(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://web.dev/mainthread-work-breakdown/"},"Main thread work breakdown")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://www.debugbear.com/docs/metrics/total-blocking-time#whats-a-good-total-blocking-time"},"What is a good Total Blocking Time"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b02fcbbe.1c38afe2.js b/assets/js/b02fcbbe.1c38afe2.js new file mode 100644 index 00000000..8f1c3b27 --- /dev/null +++ b/assets/js/b02fcbbe.1c38afe2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8540],{4137:(e,t,i)=>{i.d(t,{Zo:()=>c,kt:()=>m});var r=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var s=r.createContext({}),u=function(e){var t=r.useContext(s),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},c=function(e){var t=u(e.components);return r.createElement(s.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 i=e.components,a=e.mdxType,n=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(i),m=a,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||n;return i?r.createElement(f,o(o({ref:t},c),{},{components:i})):r.createElement(f,o({ref:t},c))}));function m(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=p;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 u=2;u{i.r(t),i.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var r=i(7462),a=(i(7294),i(4137));const n={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["compute","monitoring","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:medium"]},o="Optimize average CPU utilization",l={unversionedId:"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.",source:"@site/docs/catalog/cloud/optimize-avg-cpu-utilization.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/optimize-avg-cpu-utilization",permalink:"/catalog/cloud/optimize-avg-cpu-utilization",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/optimize-avg-cpu-utilization.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"monitoring",permalink:"/tags/monitoring"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"role:reliability-engineer",permalink:"/tags/role-reliability-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["compute","monitoring","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Optimise storage utilization",permalink:"/catalog/cloud/optimise-storage-resource-utilisation"},next:{title:"Optimize impact on customer devices and equipment",permalink:"/catalog/cloud/optimize-impact-on-customer-equipment"}},s={},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,...i}=e;return(0,a.kt)("wrapper",(0,r.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"optimize-average-cpu-utilization"},"Optimize average CPU utilization"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"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. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Optimizing average CPU utilization means driving the average utilization value to an optimal level. To find that optimal level, you must understand how your system reacts to traffic and scale issues. If you system can scale quickly, a higher average CPU is ideal. If you system cannot scale quickly, lower average CPU values are generally better to provide additional buffer to support the longer scale times. "),(0,a.kt)("p",null,"From an energy efficiency perspective, optimizing and reducing the average CPU utilization values for your system reduces the overall energy required to support traffic and can make your system hardware requirements more predictable overall. "),(0,a.kt)("p",null,"From a hardware efficiency perspective, optimizing and reducing the average CPU utilization values for your system reduces the amount of resources needed to support traffic. If the traffic in your system spikes quickly, that typically requires resources to be on stand-by and under utilized. This pattern would reduce the amount of resources required to support traffic. "),(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,"Optimizing average CPU utilization will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Optimized average CPU utilization can reduce the amount of energy needed to support the systems traffic from the reduced CPU requirements."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": Optimized average CPU utilization can reduce the amount of resources needed which will decrease the amount of embodied carbon required to support the system.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"There is an assumption that traffic is expected to fluctuate during normal production usage because of external natural changes in how users consume. Monitoring the average CPU utilization helps to normalize these fluctuations and give a better overall sense of the system CPU utilization.")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"There is no optimal CPU utilization value provided in this pattern, that should be determined from the system and its specific requirements."),(0,a.kt)("li",{parentName:"ul"},"Reducing average CPU utilization could be achieved by adding more hardware to better load balance. The software practioner should try to find efficiencies within the system that don't involve introducing more hardware and therefore additional embodied carbon.")),(0,a.kt)("h2",{id:"references"},"References"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b02fcbbe.3b4970a4.js b/assets/js/b02fcbbe.3b4970a4.js deleted file mode 100644 index c16b47e4..00000000 --- a/assets/js/b02fcbbe.3b4970a4.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8540],{4137:(e,t,i)=>{i.d(t,{Zo:()=>c,kt:()=>m});var r=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var s=r.createContext({}),u=function(e){var t=r.useContext(s),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},c=function(e){var t=u(e.components);return r.createElement(s.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 i=e.components,a=e.mdxType,n=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(i),m=a,f=p["".concat(s,".").concat(m)]||p[m]||d[m]||n;return i?r.createElement(f,o(o({ref:t},c),{},{components:i})):r.createElement(f,o({ref:t},c))}));function m(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,o=new Array(n);o[0]=p;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 u=2;u{i.r(t),i.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>n,metadata:()=>l,toc:()=>u});var r=i(7462),a=(i(7294),i(4137));const n={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["compute","monitoring","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:medium"]},o="Optimize average CPU utilization",l={unversionedId:"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.",source:"@site/docs/catalog/cloud/optimize-avg-cpu-utilization.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/optimize-avg-cpu-utilization",permalink:"/catalog/cloud/optimize-avg-cpu-utilization",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/optimize-avg-cpu-utilization.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"monitoring",permalink:"/tags/monitoring"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"role:reliability-engineer",permalink:"/tags/role-reliability-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["compute","monitoring","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Optimise storage utilization",permalink:"/catalog/cloud/optimise-storage-resource-utilisation"},next:{title:"Optimize impact on customer devices and equipment",permalink:"/catalog/cloud/optimize-impact-on-customer-equipment"}},s={},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,...i}=e;return(0,a.kt)("wrapper",(0,r.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"optimize-average-cpu-utilization"},"Optimize average CPU utilization"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"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. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Optimizing average CPU utilization means driving the average utilization value to an optimal level. To find that optimal level, you must understand how your system reacts to traffic and scale issues. If you system can scale quickly, a higher average CPU is ideal. If you system cannot scale quickly, lower average CPU values are generally better to provide additional buffer to support the longer scale times. "),(0,a.kt)("p",null,"From an energy efficiency perspective, optimizing and reducing the average CPU utilization values for your system reduces the overall energy required to support traffic and can make your system hardware requirements more predictable overall. "),(0,a.kt)("p",null,"From a hardware efficiency perspective, optimizing and reducing the average CPU utilization values for your system reduces the amount of resources needed to support traffic. If the traffic in your system spikes quickly, that typically requires resources to be on stand-by and under utilized. This pattern would reduce the amount of resources required to support traffic. "),(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,"Optimizing average CPU utilization will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Optimized average CPU utilization can reduce the amount of energy needed to support the systems traffic from the reduced CPU requirements."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": Optimized average CPU utilization can reduce the amount of resources needed which will decrease the amount of embodied carbon required to support the system.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"There is an assumption that traffic is expected to fluctuate during normal production usage because of external natural changes in how users consume. Monitoring the average CPU utilization helps to normalize these fluctuations and give a better overall sense of the system CPU utilization.")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"There is no optimal CPU utilization value provided in this pattern, that should be determined from the system and its specific requirements."),(0,a.kt)("li",{parentName:"ul"},"Reducing average CPU utilization could be achieved by adding more hardware to better load balance. The software practioner should try to find efficiencies within the system that don't involve introducing more hardware and therefore additional embodied carbon.")),(0,a.kt)("h2",{id:"references"},"References"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b084ff01.6f5a1aa8.js b/assets/js/b084ff01.6f5a1aa8.js deleted file mode 100644 index 02162bca..00000000 --- a/assets/js/b084ff01.6f5a1aa8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8668],{4137:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>p});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 o(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 i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,s=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),f=c(n),p=a,m=f["".concat(s,".").concat(p)]||f[p]||u[p]||o;return n?r.createElement(m,i(i({ref:t},d),{},{components:n})):r.createElement(m,i({ref:t},d))}));function p(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=f;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,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(7462),a=(n(7294),n(4137));const o={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},i="Run AI models at the edge",l={unversionedId:"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.",source:"@site/docs/catalog/ai/energy-efficent-ai-edge.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/energy-efficent-ai-edge",permalink:"/catalog/ai/energy-efficent-ai-edge",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/ai/energy-efficent-ai-edge.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Use efficient file formats for AI/ML development",permalink:"/catalog/ai/efficent-format-for-model-training"},next:{title:"Select a more energy efficient AI/ML framework",permalink:"/catalog/ai/energy-efficent-framework"}},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}],d={toc:c};function u(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"run-ai-models-at-the-edge"},"Run AI models at the edge"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"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. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Evaluate and run AI models at the edge, based on your application requirements. Also running data and compute processing tasks (i.e. data cleansing, feature generation) directly on the edge resources, ensure better utilization, and low latency and limit the transfer of data over the network to the cloud."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Running energy efficient AI at the edge would impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": An energy efficient AI at the edge would reduce energy consumption by providing local computing and storage for data. Running the inference at the edge in this way would reduce the network transfer to the cloud, reducing the overall energy consumed.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"Consider the operational and embodied emissions of the edge devices as part of your overall solution and how it can reduce the carbon impact of your overall application."),(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://ieeexplore.ieee.org/document/9520303"},"Green AI for IIoT: Energy Efficient Intelligent Edge Computing for Industrial Internet of Things"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b084ff01.bb761190.js b/assets/js/b084ff01.bb761190.js new file mode 100644 index 00000000..853a453f --- /dev/null +++ b/assets/js/b084ff01.bb761190.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[8668],{4137:(e,t,n)=>{n.d(t,{Zo:()=>d,kt:()=>p});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 o(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 i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var c=r.createContext({}),s=function(e){var t=r.useContext(c),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},d=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},f=r.forwardRef((function(e,t){var n=e.components,a=e.mdxType,o=e.originalType,c=e.parentName,d=l(e,["components","mdxType","originalType","parentName"]),f=s(n),p=a,m=f["".concat(c,".").concat(p)]||f[p]||u[p]||o;return n?r.createElement(m,i(i({ref:t},d),{},{components:n})):r.createElement(m,i({ref:t},d))}));function p(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=f;var l={};for(var c in t)hasOwnProperty.call(t,c)&&(l[c]=t[c]);l.originalType=e,l.mdxType="string"==typeof e?e:a,i[1]=l;for(var s=2;s{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>u,frontMatter:()=>o,metadata:()=>l,toc:()=>s});var r=n(7462),a=(n(7294),n(4137));const o={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},i="Run AI models at the edge",l={unversionedId:"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.",source:"@site/docs/catalog/ai/energy-efficent-ai-edge.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/energy-efficent-ai-edge",permalink:"/catalog/ai/energy-efficent-ai-edge",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/ai/energy-efficent-ai-edge.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Use efficient file formats for AI/ML development",permalink:"/catalog/ai/efficent-format-for-model-training"},next:{title:"Select a more energy efficient AI/ML framework",permalink:"/catalog/ai/energy-efficent-framework"}},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},{value:"References",id:"references",level:2}],d={toc:s};function u(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},d,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"run-ai-models-at-the-edge"},"Run AI models at the edge"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"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. "),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Evaluate and run AI models at the edge, based on your application requirements. Also running data and compute processing tasks (i.e. data cleansing, feature generation) directly on the edge resources, ensure better utilization, and low latency and limit the transfer of data over the network to the cloud."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Running energy efficient AI at the edge would impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": An energy efficient AI at the edge would reduce energy consumption by providing local computing and storage for data. Running the inference at the edge in this way would reduce the network transfer to the cloud, reducing the overall energy consumed.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"Consider the operational and embodied emissions of the edge devices as part of your overall solution and how it can reduce the carbon impact of your overall application."),(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://ieeexplore.ieee.org/document/9520303"},"Green AI for IIoT: Energy Efficient Intelligent Edge Computing for Industrial Internet of Things"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b0cf2206.be33a4cf.js b/assets/js/b0cf2206.2cd8dc60.js similarity index 78% rename from assets/js/b0cf2206.be33a4cf.js rename to assets/js/b0cf2206.2cd8dc60.js index e574d705..3334f192 100644 --- a/assets/js/b0cf2206.be33a4cf.js +++ b/assets/js/b0cf2206.2cd8dc60.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[252],{9129:(e,t,a)=>{a.d(t,{b:()=>d,Z:()=>u});var r=a(7294);const l="container_yFwD",c="teamMember_Kw7v",n="avatar_j88W",o="name_MjYQ",s="role_RkEc",i="company_QP6n",m="social_fOOP";function d(e){let{children:t}=e;return r.createElement("div",{className:l},t)}function u(e){let{children:t,role:a,company:l,github:d,twitter:u,linkedin:p}=e;return r.createElement("div",{className:c},r.createElement("div",{className:n},r.createElement("img",{src:"https://github.com/"+d+".png",alt:"avatar"})),r.createElement("div",null,r.createElement("span",{className:o},t),r.createElement("span",{className:s},a),r.createElement("span",{className:i},"@",l),r.createElement("div",{className:m},d&&r.createElement("a",{href:"https://github.com/"+d,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 496 512",width:24},r.createElement("path",{fill:"currentColor",d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"}))),u&&r.createElement("a",{href:"https://twitter.com/"+u,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:24},r.createElement("path",{fill:"currentColor",d:"M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"}))),p&&r.createElement("a",{href:"https://www.linkedin.com/in/"+p,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",width:24},r.createElement("path",{fill:"currentColor",d:"M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"}))))))}},1685:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>n,metadata:()=>s,toc:()=>m});var r=a(7462),l=(a(7294),a(4137)),c=a(9129);a(5944);const n={sidebar_position:5},o="Cloud",s={unversionedId:"catalog/cloud/index",id:"catalog/cloud/index",title:"Cloud",description:"Subject Matter Experts",source:"@site/docs/catalog/cloud/index.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/",permalink:"/catalog/cloud/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/index.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Adopt serverless architecture for AI/ML workload processes",permalink:"/catalog/ai/serverless-model-development"},next:{title:"Cache static data",permalink:"/catalog/cloud/cache-static-data"}},i={},m=[{value:"Subject Matter Experts",id:"subject-matter-experts",level:2}],d={toc:m};function u(e){let{components:t,...a}=e;return(0,l.kt)("wrapper",(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"cloud"},"Cloud"),(0,l.kt)("h2",{id:"subject-matter-experts"},"Subject Matter Experts"),(0,l.kt)(c.b,{mdxType:"TeamMembers"},(0,l.kt)(c.Z,{github:"aoifefitton",mdxType:"TeamMember"},"Aoife Fitton"),(0,l.kt)(c.Z,{github:"dubrie",mdxType:"TeamMember"},"Bill Johnson"),(0,l.kt)(c.Z,{github:"camcash17",mdxType:"TeamMember"},"Cameron Casher"),(0,l.kt)(c.Z,{github:"navveenb",mdxType:"TeamMember"},"Navveen Balani"),(0,l.kt)(c.Z,{github:"greenhsu123",mdxType:"TeamMember"},"Sarah Hsu"),(0,l.kt)(c.Z,{github:"tmcclell",mdxType:"TeamMember"},"Tammy McClellan"),(0,l.kt)(c.Z,{github:"yelghali",mdxType:"TeamMember"},"Yassine El Ghali")))}u.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[252],{9129:(e,t,a)=>{a.d(t,{b:()=>d,Z:()=>u});var r=a(7294);const l="container_yFwD",c="teamMember_Kw7v",n="avatar_j88W",o="name_MjYQ",s="role_RkEc",i="company_QP6n",m="social_fOOP";function d(e){let{children:t}=e;return r.createElement("div",{className:l},t)}function u(e){let{children:t,role:a,company:l,github:d,twitter:u,linkedin:p}=e;return r.createElement("div",{className:c},r.createElement("div",{className:n},r.createElement("img",{src:"https://github.com/"+d+".png",alt:"avatar"})),r.createElement("div",null,r.createElement("span",{className:o},t),r.createElement("span",{className:s},a),r.createElement("span",{className:i},"@",l),r.createElement("div",{className:m},d&&r.createElement("a",{href:"https://github.com/"+d,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 496 512",width:24},r.createElement("path",{fill:"currentColor",d:"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"}))),u&&r.createElement("a",{href:"https://twitter.com/"+u,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 512 512",width:24},r.createElement("path",{fill:"currentColor",d:"M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"}))),p&&r.createElement("a",{href:"https://www.linkedin.com/in/"+p,target:"_blank",rel:"noopener noreferrer"},r.createElement("svg",{"aria-hidden":"true",focusable:"false",role:"img",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 448 512",width:24},r.createElement("path",{fill:"currentColor",d:"M100.28 448H7.4V148.9h92.88zM53.79 108.1C24.09 108.1 0 83.5 0 53.8a53.79 53.79 0 0 1 107.58 0c0 29.7-24.1 54.3-53.79 54.3zM447.9 448h-92.68V302.4c0-34.7-.7-79.2-48.29-79.2-48.29 0-55.69 37.7-55.69 76.7V448h-92.78V148.9h89.08v40.8h1.3c12.4-23.5 42.69-48.3 87.88-48.3 94 0 111.28 61.9 111.28 142.3V448z"}))))))}},1685:(e,t,a)=>{a.r(t),a.d(t,{assets:()=>i,contentTitle:()=>o,default:()=>u,frontMatter:()=>n,metadata:()=>s,toc:()=>m});var r=a(7462),l=(a(7294),a(4137)),c=a(9129);a(5944);const n={sidebar_position:5},o="Cloud",s={unversionedId:"catalog/cloud/index",id:"catalog/cloud/index",title:"Cloud",description:"Subject Matter Experts",source:"@site/docs/catalog/cloud/index.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/",permalink:"/catalog/cloud/",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/index.md",tags:[],version:"current",sidebarPosition:5,frontMatter:{sidebar_position:5},sidebar:"tutorialSidebar",previous:{title:"Adopt serverless architecture for AI/ML workload processes",permalink:"/catalog/ai/serverless-model-development"},next:{title:"Cache static data",permalink:"/catalog/cloud/cache-static-data"}},i={},m=[{value:"Subject Matter Experts",id:"subject-matter-experts",level:2}],d={toc:m};function u(e){let{components:t,...a}=e;return(0,l.kt)("wrapper",(0,r.Z)({},d,a,{components:t,mdxType:"MDXLayout"}),(0,l.kt)("h1",{id:"cloud"},"Cloud"),(0,l.kt)("h2",{id:"subject-matter-experts"},"Subject Matter Experts"),(0,l.kt)(c.b,{mdxType:"TeamMembers"},(0,l.kt)(c.Z,{github:"aoifefitton",mdxType:"TeamMember"},"Aoife Fitton"),(0,l.kt)(c.Z,{github:"dubrie",mdxType:"TeamMember"},"Bill Johnson"),(0,l.kt)(c.Z,{github:"camcash17",mdxType:"TeamMember"},"Cameron Casher"),(0,l.kt)(c.Z,{github:"navveenb",mdxType:"TeamMember"},"Navveen Balani"),(0,l.kt)(c.Z,{github:"greenhsu123",mdxType:"TeamMember"},"Sarah Hsu"),(0,l.kt)(c.Z,{github:"tmcclell",mdxType:"TeamMember"},"Tammy McClellan"),(0,l.kt)(c.Z,{github:"yelghali",mdxType:"TeamMember"},"Yassine El Ghali")))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b6af033a.b3a67d0e.js b/assets/js/b6af033a.b3a67d0e.js deleted file mode 100644 index d881bff1..00000000 --- a/assets/js/b6af033a.b3a67d0e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4923],{4137:(e,t,i)=>{i.d(t,{Zo:()=>d,kt:()=>u});var r=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function s(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):s(s({},t),e)),i},d=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,l=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=p(i),u=a,h=m["".concat(l,".").concat(u)]||m[u]||c[u]||n;return i?r.createElement(h,s(s({ref:t},d),{},{components:i})):r.createElement(h,s({ref:t},d))}));function u(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,s=new Array(n);s[0]=m;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 p=2;p{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>n,metadata:()=>o,toc:()=>p});var r=i(7462),a=(i(7294),i(4137));const n={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",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.",tags:["web","size:medium","role:web-developer"]},s="Optimize image size",o={unversionedId:"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.",source:"@site/docs/catalog/web/properly-sized-images.md",sourceDirName:"catalog/web",slug:"/catalog/web/properly-sized-images",permalink:"/catalog/web/properly-sized-images",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/properly-sized-images.md",tags:[{label:"web",permalink:"/tags/web"},{label:"size:medium",permalink:"/tags/size-medium"},{label:"role:web-developer",permalink:"/tags/role-web-developer"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2022-11-10T00:00:00.000Z",category:"web",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.",tags:["web","size:medium","role:web-developer"]},sidebar:"tutorialSidebar",previous:{title:"Minimize main thread work",permalink:"/catalog/web/minimize-main-thread-work"},next:{title:"Remove unused CSS definitions",permalink:"/catalog/web/remove-unused-css"}},l={},p=[{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:p};function c(e){let{components:t,...i}=e;return(0,a.kt)("wrapper",(0,r.Z)({},d,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"optimize-image-size"},"Optimize image size"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Images are stored with fixed pixel dimensions on disk. This determines the file size and the quality that can be achieved when displaying the image on screen. Web pages let us dynamically resize the images from the stored size to a specific display size. "),(0,a.kt)("p",null,'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.\nThe display size of images varies from device to device and can even change when the window is esized. For this use case, web browsers provide the functionality to have "responsive images". In practice, the web server stores multiple versions of the same image, then decides which image size to load depending on the screen and window size. '),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"The ideal scenario is for the web browser to download the image in a size that is nearest to the display size, in order to save bandwidth and processing cost in the web browser. The generation can be done in multiple ways, for example inside the CI/CD pipeline or via a third party service (for example via Image-CDNs)."),(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,"Optimizing the image sizes will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Reduces the processing and memory requirements to display the page, which also reduces the energy requirements. However, there is also an increase in the processing time for every image to convert it into the required size."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": Increases the storage requirements to cache or store all needed image sizes.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None"),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Consider using vector image formats like SVG to provide dynamically scalable images.")),(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://web.dev/uses-responsive-images/"},"Further explanation")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://web.dev/image-cdns/"},"Image CDNs"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b6af033a.fad23e3f.js b/assets/js/b6af033a.fad23e3f.js new file mode 100644 index 00000000..74f47666 --- /dev/null +++ b/assets/js/b6af033a.fad23e3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4923],{4137:(e,t,i)=>{i.d(t,{Zo:()=>d,kt:()=>u});var r=i(7294);function a(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function n(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function s(e){for(var t=1;t=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}var l=r.createContext({}),p=function(e){var t=r.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):s(s({},t),e)),i},d=function(e){var t=p(e.components);return r.createElement(l.Provider,{value:t},e.children)},c={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var i=e.components,a=e.mdxType,n=e.originalType,l=e.parentName,d=o(e,["components","mdxType","originalType","parentName"]),m=p(i),u=a,h=m["".concat(l,".").concat(u)]||m[u]||c[u]||n;return i?r.createElement(h,s(s({ref:t},d),{},{components:i})):r.createElement(h,s({ref:t},d))}));function u(e,t){var i=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var n=i.length,s=new Array(n);s[0]=m;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 p=2;p{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>s,default:()=>c,frontMatter:()=>n,metadata:()=>o,toc:()=>p});var r=i(7462),a=(i(7294),i(4137));const n={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",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.",tags:["web","size:medium","role:web-developer"]},s="Optimize image size",o={unversionedId:"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.",source:"@site/docs/catalog/web/properly-sized-images.md",sourceDirName:"catalog/web",slug:"/catalog/web/properly-sized-images",permalink:"/catalog/web/properly-sized-images",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/properly-sized-images.md",tags:[{label:"web",permalink:"/tags/web"},{label:"size:medium",permalink:"/tags/size-medium"},{label:"role:web-developer",permalink:"/tags/role-web-developer"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2022-11-10T00:00:00.000Z",category:"web",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.",tags:["web","size:medium","role:web-developer"]},sidebar:"tutorialSidebar",previous:{title:"Minimize main thread work",permalink:"/catalog/web/minimize-main-thread-work"},next:{title:"Remove unused CSS definitions",permalink:"/catalog/web/remove-unused-css"}},l={},p=[{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:p};function c(e){let{components:t,...i}=e;return(0,a.kt)("wrapper",(0,r.Z)({},d,i,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"optimize-image-size"},"Optimize image size"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Images are stored with fixed pixel dimensions on disk. This determines the file size and the quality that can be achieved when displaying the image on screen. Web pages let us dynamically resize the images from the stored size to a specific display size. "),(0,a.kt)("p",null,'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.\nThe display size of images varies from device to device and can even change when the window is esized. For this use case, web browsers provide the functionality to have "responsive images". In practice, the web server stores multiple versions of the same image, then decides which image size to load depending on the screen and window size. '),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"The ideal scenario is for the web browser to download the image in a size that is nearest to the display size, in order to save bandwidth and processing cost in the web browser. The generation can be done in multiple ways, for example inside the CI/CD pipeline or via a third party service (for example via Image-CDNs)."),(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,"Optimizing the image sizes will impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Reduces the processing and memory requirements to display the page, which also reduces the energy requirements. However, there is also an increase in the processing time for every image to convert it into the required size."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": Increases the storage requirements to cache or store all needed image sizes.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None"),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Consider using vector image formats like SVG to provide dynamically scalable images.")),(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://web.dev/uses-responsive-images/"},"Further explanation")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://web.dev/image-cdns/"},"Image CDNs"))))}c.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/b8dc3674.2fb2ef93.js b/assets/js/b8dc3674.ac86471f.js similarity index 50% rename from assets/js/b8dc3674.2fb2ef93.js rename to assets/js/b8dc3674.ac86471f.js index 9efe937a..b152eaa7 100644 --- a/assets/js/b8dc3674.2fb2ef93.js +++ b/assets/js/b8dc3674.ac86471f.js @@ -1 +1 @@ -"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/green-software-patterns/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 +"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/bf31d9bc.06bff309.js b/assets/js/bf31d9bc.dc180fea.js similarity index 51% rename from assets/js/bf31d9bc.06bff309.js rename to assets/js/bf31d9bc.dc180fea.js index e058b661..01e9b402 100644 --- a/assets/js/bf31d9bc.06bff309.js +++ b/assets/js/bf31d9bc.dc180fea.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6795],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=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 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 s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),c=function(e){var t=o.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 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 n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=r,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return n?o.createElement(f,s(s({ref:t},u),{},{components:n})):o.createElement(f,s({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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:r,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 o=n(7462),r=(n(7294),n(4137));const a={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["kubernetes","role:cloud-engineer","size:small"]},s="Scale down kubernetes applications when not in use",i={unversionedId:"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.",source:"@site/docs/catalog/cloud/scale-down-kubernetes-workloads.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/scale-down-kubernetes-workloads",permalink:"/catalog/cloud/scale-down-kubernetes-workloads",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/scale-down-kubernetes-workloads.md",tags:[{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["kubernetes","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Remove unused assets",permalink:"/catalog/cloud/remove-unused-assets"},next:{title:"Scale Kubernetes workloads based on relevant demand metrics",permalink:"/catalog/cloud/scale-kubernetes-workloads-based-on-events"}},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,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"scale-down-kubernetes-applications-when-not-in-use"},"Scale down kubernetes applications when not in use"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes (VMs) out of office hours (e.g at night & during weekends). => thereby, optimization is implemented at the cluster level."),(0,r.kt)("p",null,"For production clusters, where nodes need to stay up and running: optimization needs to be implemented at the application level (Deployment, StatefulSet)."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Scale down Kubernetes applications (Deployments, StatefulSets) based on time (out of office hours). Turning off an application means scaling its pods to zero."),(0,r.kt)("p",null,"The scaled down Kubernetes resources can be selected using Labels or Annotations. "),(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,"Regarding the SCI equation. scaling down the pods to zero will impact:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"E"),': The goal is to "reduce demand", aka the number of pods running out of office hours, which reduces overall consumed power by the application.')),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("p",null,"The Business Application has predictible traffic (usage), which allows to scale up & down based on Time. "),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"This pattern does not require application code changes."),(0,r.kt)("li",{parentName:"ul"},"This pattern requires an understanding of the application usage patterns including technical governance and inventory management.")))}d.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6795],{4137:(e,t,n)=>{n.d(t,{Zo:()=>u,kt:()=>m});var o=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 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 s(e){for(var t=1;t=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(o=0;o=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}var l=o.createContext({}),c=function(e){var t=o.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 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 n=e.components,r=e.mdxType,a=e.originalType,l=e.parentName,u=i(e,["components","mdxType","originalType","parentName"]),p=c(n),m=r,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return n?o.createElement(f,s(s({ref:t},u),{},{components:n})):o.createElement(f,s({ref:t},u))}));function m(e,t){var n=arguments,r=t&&t.mdxType;if("string"==typeof e||r){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:r,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 o=n(7462),r=(n(7294),n(4137));const a={version:1,submitted_by:"yelghali",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["kubernetes","role:cloud-engineer","size:small"]},s="Scale down kubernetes applications when not in use",i={unversionedId:"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.",source:"@site/docs/catalog/cloud/scale-down-kubernetes-workloads.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/scale-down-kubernetes-workloads",permalink:"/catalog/cloud/scale-down-kubernetes-workloads",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/scale-down-kubernetes-workloads.md",tags:[{label:"kubernetes",permalink:"/tags/kubernetes"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"yelghali",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["kubernetes","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Remove unused assets",permalink:"/catalog/cloud/remove-unused-assets"},next:{title:"Scale Kubernetes workloads based on relevant demand metrics",permalink:"/catalog/cloud/scale-kubernetes-workloads-based-on-events"}},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,o.Z)({},u,n,{components:t,mdxType:"MDXLayout"}),(0,r.kt)("h1",{id:"scale-down-kubernetes-applications-when-not-in-use"},"Scale down kubernetes applications when not in use"),(0,r.kt)("h2",{id:"description"},"Description"),(0,r.kt)("p",null,"In order to reduce carbon emissions and costs, Dev&Test Kubernetes clusters can turn off nodes (VMs) out of office hours (e.g at night & during weekends). => thereby, optimization is implemented at the cluster level."),(0,r.kt)("p",null,"For production clusters, where nodes need to stay up and running: optimization needs to be implemented at the application level (Deployment, StatefulSet)."),(0,r.kt)("h2",{id:"solution"},"Solution"),(0,r.kt)("p",null,"Scale down Kubernetes applications (Deployments, StatefulSets) based on time (out of office hours). Turning off an application means scaling its pods to zero."),(0,r.kt)("p",null,"The scaled down Kubernetes resources can be selected using Labels or Annotations. "),(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,"Regarding the SCI equation. scaling down the pods to zero will impact:"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},(0,r.kt)("inlineCode",{parentName:"li"},"E"),': The goal is to "reduce demand", aka the number of pods running out of office hours, which reduces overall consumed power by the application.')),(0,r.kt)("h2",{id:"assumptions"},"Assumptions"),(0,r.kt)("p",null,"The Business Application has predictible traffic (usage), which allows to scale up & down based on Time. "),(0,r.kt)("h2",{id:"considerations"},"Considerations"),(0,r.kt)("ul",null,(0,r.kt)("li",{parentName:"ul"},"This pattern does not require application code changes."),(0,r.kt)("li",{parentName:"ul"},"This pattern requires an understanding of the application usage patterns including technical governance and inventory management.")))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c0a2235c.2fec7948.js b/assets/js/c0a2235c.2fec7948.js deleted file mode 100644 index fc35c523..00000000 --- a/assets/js/c0a2235c.2fec7948.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2092],{4137:(e,t,n)=>{n.d(t,{Zo:()=>c,kt:()=>d});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 o(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 i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),f=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},c=function(e){var t=f(e.components);return r.createElement(s.Provider,{value:t},e.children)},m={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,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=f(n),d=a,u=p["".concat(s,".").concat(d)]||p[d]||m[d]||o;return n?r.createElement(u,i(i({ref:t},c),{},{components:n})):r.createElement(u,i({ref:t},c))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;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,i[1]=l;for(var f=2;f{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>f});var r=n(7462),a=(n(7294),n(4137));const o={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",description:"Efficient storage of the model becomes extremely important to manage the data used for ML model development.",tags:["ai","machine-learning","role:data-scientist","size:small"]},i="Use efficient file formats for AI/ML development",l={unversionedId:"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.",source:"@site/docs/catalog/ai/efficent-format-for-model-training.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/efficent-format-for-model-training",permalink:"/catalog/ai/efficent-format-for-model-training",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/ai/efficent-format-for-model-training.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",description:"Efficient storage of the model becomes extremely important to manage the data used for ML model development.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Optimize the size of AI/ML models",permalink:"/catalog/ai/compress-ml-models-for-inference"},next:{title:"Run AI models at the edge",permalink:"/catalog/ai/energy-efficent-ai-edge"}},s={},f=[{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:f};function m(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},c,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"use-efficient-file-formats-for-aiml-development"},"Use efficient file formats for AI/ML development"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Data processing and storage constitute a significant portion of AI/ML development and impact the carbon footprint of your application. Variety and volumes of data might need to be captured and pre-processed for building the ML model. Efficient storage of the model becomes extremely important to manage the data used for ML model development."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Use efficient file formats for building your ML models. For instance, column-oriented data file formats like Parquet provide efficient data storage and retrieval as compared to formats like CSV."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Using efficient file formats for ML development impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": A more efficient file format for ML development means more efficient data storage and retrieval, resulting in lower overall energy consumption."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": A more efficient file format for ML development reduces the amount of storage space and number of servers needed, resulting in a lower overall embodied carbon.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"Evaluate and consider the most energy efficient formats required for your application."),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://parquet.apache.org/"},"Apache Parquet")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c0a2235c.d9df13ba.js b/assets/js/c0a2235c.d9df13ba.js new file mode 100644 index 00000000..5bba4a79 --- /dev/null +++ b/assets/js/c0a2235c.d9df13ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[2092],{4137:(e,t,n)=>{n.d(t,{Zo:()=>f,kt:()=>d});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 o(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 i(e){for(var t=1;t=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}var s=r.createContext({}),c=function(e){var t=r.useContext(s),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},f=function(e){var t=c(e.components);return r.createElement(s.Provider,{value:t},e.children)},m={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,o=e.originalType,s=e.parentName,f=l(e,["components","mdxType","originalType","parentName"]),p=c(n),d=a,u=p["".concat(s,".").concat(d)]||p[d]||m[d]||o;return n?r.createElement(u,i(i({ref:t},f),{},{components:n})):r.createElement(u,i({ref:t},f))}));function d(e,t){var n=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var o=n.length,i=new Array(o);i[0]=p;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,i[1]=l;for(var c=2;c{n.r(t),n.d(t,{assets:()=>s,contentTitle:()=>i,default:()=>m,frontMatter:()=>o,metadata:()=>l,toc:()=>c});var r=n(7462),a=(n(7294),n(4137));const o={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",description:"Efficient storage of the model becomes extremely important to manage the data used for ML model development.",tags:["ai","machine-learning","role:data-scientist","size:small"]},i="Use efficient file formats for AI/ML development",l={unversionedId:"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.",source:"@site/docs/catalog/ai/efficent-format-for-model-training.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/efficent-format-for-model-training",permalink:"/catalog/ai/efficent-format-for-model-training",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/ai/efficent-format-for-model-training.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",description:"Efficient storage of the model becomes extremely important to manage the data used for ML model development.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Optimize the size of AI/ML models",permalink:"/catalog/ai/compress-ml-models-for-inference"},next:{title:"Run AI models at the edge",permalink:"/catalog/ai/energy-efficent-ai-edge"}},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}],f={toc:c};function m(e){let{components:t,...n}=e;return(0,a.kt)("wrapper",(0,r.Z)({},f,n,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"use-efficient-file-formats-for-aiml-development"},"Use efficient file formats for AI/ML development"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Data processing and storage constitute a significant portion of AI/ML development and impact the carbon footprint of your application. Variety and volumes of data might need to be captured and pre-processed for building the ML model. Efficient storage of the model becomes extremely important to manage the data used for ML model development."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Use efficient file formats for building your ML models. For instance, column-oriented data file formats like Parquet provide efficient data storage and retrieval as compared to formats like CSV."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Using efficient file formats for ML development impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": A more efficient file format for ML development means more efficient data storage and retrieval, resulting in lower overall energy consumption."),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"M"),": A more efficient file format for ML development reduces the amount of storage space and number of servers needed, resulting in a lower overall embodied carbon.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"Evaluate and consider the most energy efficient formats required for your application."),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://parquet.apache.org/"},"Apache Parquet")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c5a0b084.39a0ffb0.js b/assets/js/c5a0b084.39a0ffb0.js deleted file mode 100644 index 3496ea68..00000000 --- a/assets/js/c5a0b084.39a0ffb0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4403],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,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},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},u={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,p=l(e,["components","mdxType","originalType","parentName"]),d=c(r),m=a,f=d["".concat(s,".").concat(m)]||d[m]||u[m]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));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:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",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.",tags:["size:small","role:web-developer","web"]},o="Deprecate GIFs for animated content",l={unversionedId:"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.",source:"@site/docs/catalog/web/deprecate-gifs.md",sourceDirName:"catalog/web",slug:"/catalog/web/deprecate-gifs",permalink:"/catalog/web/deprecate-gifs",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/deprecate-gifs.md",tags:[{label:"size:small",permalink:"/tags/size-small"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"web",permalink:"/tags/web"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2022-11-10T00:00:00.000Z",category:"web",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.",tags:["size:small","role:web-developer","web"]},sidebar:"tutorialSidebar",previous:{title:"Defer offscreen images",permalink:"/catalog/web/defer-offscreen-images"},next:{title:"Enable text compression",permalink:"/catalog/web/enable-text-compression"}},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}],p={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"deprecate-gifs-for-animated-content"},"Deprecate GIFs for animated content"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"GIFs were invented in the early 80s and this popular format was used to deliver animated content in web browsers."),(0,a.kt)("p",null,"Newer technologies have made GIFs technically obsolete, but they are still widely known as animated picture format. One direct replacement of the GIF is the MP4 video format. MP4 provides much smaller file sizes and higher quality at the same time."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Convert the source material of the GIF to MP4 to receive a higher quality at lower file size. If that is not possible, the GIF can also be directly converted to reduce the file size while maintaining the quality of the GIF."),(0,a.kt)("p",null,"Even higher compression ratios can be achieved by inspecting the content of the GIF. Depending on the content other techniques may provide even better solutions, such as CSS animations, SVG animations and image formats that also support animations."),(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,"Converting GIFs will impact the SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Reduced energy consumption by reducing download size and increased page performance.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The web browser must support the new format.")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(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://en.wikipedia.org/wiki/GIF#Alternatives"},"Alternatives to GIF")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/GIF#Uses"},"Real life improvement reports for replacing GIF with MP4"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/c5a0b084.db8d8eaf.js b/assets/js/c5a0b084.db8d8eaf.js new file mode 100644 index 00000000..cef33413 --- /dev/null +++ b/assets/js/c5a0b084.db8d8eaf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[4403],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,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},p=function(e){var t=c(e.components);return n.createElement(s.Provider,{value:t},e.children)},u={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,p=l(e,["components","mdxType","originalType","parentName"]),d=c(r),m=a,f=d["".concat(s,".").concat(m)]||d[m]||u[m]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));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:()=>u,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",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.",tags:["size:small","role:web-developer","web"]},o="Deprecate GIFs for animated content",l={unversionedId:"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.",source:"@site/docs/catalog/web/deprecate-gifs.md",sourceDirName:"catalog/web",slug:"/catalog/web/deprecate-gifs",permalink:"/catalog/web/deprecate-gifs",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/deprecate-gifs.md",tags:[{label:"size:small",permalink:"/tags/size-small"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"web",permalink:"/tags/web"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2022-11-10T00:00:00.000Z",category:"web",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.",tags:["size:small","role:web-developer","web"]},sidebar:"tutorialSidebar",previous:{title:"Defer offscreen images",permalink:"/catalog/web/defer-offscreen-images"},next:{title:"Enable text compression",permalink:"/catalog/web/enable-text-compression"}},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}],p={toc:c};function u(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"deprecate-gifs-for-animated-content"},"Deprecate GIFs for animated content"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"GIFs were invented in the early 80s and this popular format was used to deliver animated content in web browsers."),(0,a.kt)("p",null,"Newer technologies have made GIFs technically obsolete, but they are still widely known as animated picture format. One direct replacement of the GIF is the MP4 video format. MP4 provides much smaller file sizes and higher quality at the same time."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Convert the source material of the GIF to MP4 to receive a higher quality at lower file size. If that is not possible, the GIF can also be directly converted to reduce the file size while maintaining the quality of the GIF."),(0,a.kt)("p",null,"Even higher compression ratios can be achieved by inspecting the content of the GIF. Depending on the content other techniques may provide even better solutions, such as CSS animations, SVG animations and image formats that also support animations."),(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,"Converting GIFs will impact the SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Reduced energy consumption by reducing download size and increased page performance.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"The web browser must support the new format.")),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(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://en.wikipedia.org/wiki/GIF#Alternatives"},"Alternatives to GIF")),(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/GIF#Uses"},"Real life improvement reports for replacing GIF with MP4"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/cc299ddb.fb3a6675.js b/assets/js/cc299ddb.eac8b84f.js similarity index 52% rename from assets/js/cc299ddb.fb3a6675.js rename to assets/js/cc299ddb.eac8b84f.js index a40a4a8e..fb54c826 100644 --- a/assets/js/cc299ddb.fb3a6675.js +++ b/assets/js/cc299ddb.eac8b84f.js @@ -1 +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 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/green-software-patterns/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:"Terminate TLS at border gateway",permalink:"/catalog/cloud/evaluate-whether-to-use-TLS-termination"}},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 +"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:"Terminate TLS at border gateway",permalink:"/catalog/cloud/evaluate-whether-to-use-TLS-termination"}},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/e20ae084.36687c90.js b/assets/js/e20ae084.36687c90.js deleted file mode 100644 index 20b3227e..00000000 --- a/assets/js/e20ae084.36687c90.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6181],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var n=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 o(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 a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(s.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,i=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(r),m=i,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(h,a(a({ref:t},c),{},{components:r})):n.createElement(h,a({ref:t},c))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=p;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,a[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(7462),i=(r(7294),r(4137));const o={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["compute","role:cloud-engineer","size:small"]},a="Match utilization requirements with pre-configured servers",l={unversionedId:"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.",source:"@site/docs/catalog/cloud/match-utilization-requirements-with-pre-configured-server.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/match-utilization-requirements-with-pre-configured-server",permalink:"/catalog/cloud/match-utilization-requirements-with-pre-configured-server",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/match-utilization-requirements-with-pre-configured-server.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["compute","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Match utilization requirements of virtual machines (VMs)",permalink:"/catalog/cloud/match-utilization-requirements-of-vm"},next:{title:"Minimize the total number of deployed environments",permalink:"/catalog/cloud/minimizing-deployed-environments"}},s={},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,i.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"match-utilization-requirements-with-pre-configured-servers"},"Match utilization requirements with pre-configured servers"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"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."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Rightsize your machine by selecting a pre-configured server that better matches the utilization requirements of the process."),(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,"Rightsizing oversized VMs will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Rightsizing oversized VMs will ",(0,i.kt)("em",{parentName:"li"},"increase")," the total server utilization. The more a server is utilized, the more efficient it becomes at turning energy into useful operations. Therefore rightsizing VMs should reduce the energy consumption of your processes."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of servers required to run a process, the total embodied carbon is lower.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"If we choose an oversized VM because ",(0,i.kt)("em",{parentName:"p"},"occasionally")," there is a burst of work (peak load) then undersizing them will reduce the margin available to handle the peak traffic. A better solution would be to consider an auto-scaling architecture that would automatically scale the number of VMs."),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"It may reduce your cloud bill as reducing the spec of your VMs will cost less."),(0,i.kt)("li",{parentName:"ul"},"If you do not have an auto-scaling architecture, there is less overhead for handling spikes in load.")),(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.greensoftware.foundation/practitioner/hardware-efficiency"},"Hardware Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e20ae084.92be8f04.js b/assets/js/e20ae084.92be8f04.js new file mode 100644 index 00000000..d901fbdf --- /dev/null +++ b/assets/js/e20ae084.92be8f04.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6181],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>m});var n=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 o(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 a(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}var s=n.createContext({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):a(a({},t),e)),r},c=function(e){var t=u(e.components);return n.createElement(s.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,i=e.mdxType,o=e.originalType,s=e.parentName,c=l(e,["components","mdxType","originalType","parentName"]),p=u(r),m=i,h=p["".concat(s,".").concat(m)]||p[m]||d[m]||o;return r?n.createElement(h,a(a({ref:t},c),{},{components:r})):n.createElement(h,a({ref:t},c))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var o=r.length,a=new Array(o);a[0]=p;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,a[1]=l;for(var u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>a,default:()=>d,frontMatter:()=>o,metadata:()=>l,toc:()=>u});var n=r(7462),i=(r(7294),r(4137));const o={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["compute","role:cloud-engineer","size:small"]},a="Match utilization requirements with pre-configured servers",l={unversionedId:"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.",source:"@site/docs/catalog/cloud/match-utilization-requirements-with-pre-configured-server.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/match-utilization-requirements-with-pre-configured-server",permalink:"/catalog/cloud/match-utilization-requirements-with-pre-configured-server",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/match-utilization-requirements-with-pre-configured-server.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["compute","role:cloud-engineer","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Match utilization requirements of virtual machines (VMs)",permalink:"/catalog/cloud/match-utilization-requirements-of-vm"},next:{title:"Minimize the total number of deployed environments",permalink:"/catalog/cloud/minimizing-deployed-environments"}},s={},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,i.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"match-utilization-requirements-with-pre-configured-servers"},"Match utilization requirements with pre-configured servers"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"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."),(0,i.kt)("p",null,"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."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Rightsize your machine by selecting a pre-configured server that better matches the utilization requirements of the process."),(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,"Rightsizing oversized VMs will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Rightsizing oversized VMs will ",(0,i.kt)("em",{parentName:"li"},"increase")," the total server utilization. The more a server is utilized, the more efficient it becomes at turning energy into useful operations. Therefore rightsizing VMs should reduce the energy consumption of your processes."),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"M"),": By reducing the total number of servers required to run a process, the total embodied carbon is lower.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("p",null,"If we choose an oversized VM because ",(0,i.kt)("em",{parentName:"p"},"occasionally")," there is a burst of work (peak load) then undersizing them will reduce the margin available to handle the peak traffic. A better solution would be to consider an auto-scaling architecture that would automatically scale the number of VMs."),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"It may reduce your cloud bill as reducing the spec of your VMs will cost less."),(0,i.kt)("li",{parentName:"ul"},"If you do not have an auto-scaling architecture, there is less overhead for handling spikes in load.")),(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.greensoftware.foundation/practitioner/hardware-efficiency"},"Hardware Efficiency Principle")),(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("a",{parentName:"li",href:"https://learn.greensoftware.foundation/practitioner/energy-efficiency"},"Energy Efficiency Principle"))))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e450c455.2c604c6e.js b/assets/js/e450c455.2c604c6e.js new file mode 100644 index 00000000..e41692ee --- /dev/null +++ b/assets/js/e450c455.2c604c6e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6513],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});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({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=u(r),h=a,f=c["".concat(s,".").concat(h)]||c[h]||d[h]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=c;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 u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var n=r(7462),a=(r(7294),r(4137));const i={},o="Initial Review Guide",l={unversionedId:"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.",source:"@site/docs/guide/initial-reviewer-guide.md",sourceDirName:"guide",slug:"/guide/initial-reviewer-guide",permalink:"/guide/initial-reviewer-guide",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/guide/initial-reviewer-guide.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Suggested Tags",permalink:"/guide/suggested-tags"},next:{title:"Subject Matter Expert (SME) Review Guide",permalink:"/guide/sme-reviewer-guide"}},s={},u=[{value:"What To Look For In Your Review",id:"what-to-look-for-in-your-review",level:2},{value:"Alignment to Green Software Foundation",id:"alignment-to-green-software-foundation",level:3},{value:"Alignment to Green Software Pattern Template",id:"alignment-to-green-software-pattern-template",level:3},{value:"Proper Green Software Pattern Formatting",id:"proper-green-software-pattern-formatting",level:3},{value:"Pull Request Set To Merge In Dev Branch",id:"pull-request-set-to-merge-in-dev-branch",level:3},{value:"Content Validation",id:"content-validation",level:3},{value:"Provide Clear Feedback",id:"provide-clear-feedback",level:3},{value:"Assigning to SME for Further Review",id:"assigning-to-sme-for-further-review",level:2}],p={toc:u};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"initial-review-guide"},"Initial Review Guide"),(0,a.kt)("p",null,"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. "),(0,a.kt)("h2",{id:"what-to-look-for-in-your-review"},"What To Look For In Your Review"),(0,a.kt)("p",null,"Here are the things you should look for in the initial review. If any of these areas are not met, provide feedback and any recommended changes in the pull request and assign back to the submitter. If all of these areas are met, you may assign the pattern to an appropriate Subject Matter Expert (SME) for the next phase of review."),(0,a.kt)("h3",{id:"alignment-to-green-software-foundation"},"Alignment to Green Software Foundation"),(0,a.kt)("p",null,"Does this pattern align to the mission of the Green Software Foundation of reducing emissions that software is responsible for? Is the content clearly written and able to be understood by a subject matter expert? You don't need to evaluate jargon or acronyms from a specific domain, focus more on the content and how it relates to emission reduction and the SCI. "),(0,a.kt)("h3",{id:"alignment-to-green-software-pattern-template"},"Alignment to Green Software Pattern Template"),(0,a.kt)("p",null,"Does this pattern align to the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/Green-Software-Foundation/green-software-patterns/blob/dev/TEMPLATE.md"},"Pattern Template")," for Green Software Patterns? This includes all sections being present, tags supported on our ",(0,a.kt)("a",{parentName:"p",href:"https://patterns.greensoftware.foundation/tags/"},"Tags list"),", valid author and github alias, clearly defined assumptions and considerations, relevance to SCI has been called out. The Pattern Title should follow the form of a specific ",(0,a.kt)("inlineCode",{parentName:"p"},"Action")," on a specific ",(0,a.kt)("inlineCode",{parentName:"p"},"Resource"),'. For example, "Write efficient code" is not a good title since there is no specific action to take on a specific resource. A title of "Cache Static Data" provides a specific action of Caching to a specific resource of Static Data.'),(0,a.kt)("h3",{id:"proper-green-software-pattern-formatting"},"Proper Green Software Pattern Formatting"),(0,a.kt)("p",null,'Our documentation system uses "front matter" which requires a specific format for metadata and this section should be included at the top of each submitted pattern. The front matter content and structure can be seen on the ',(0,a.kt)("a",{parentName:"p",href:"https://github.com/Green-Software-Foundation/green-software-patterns/blob/dev/TEMPLATE.md"},"Pattern Template")," and should include all fields listed there."),(0,a.kt)("p",null,"Additionally, we look for patterns to align to the following formatting rules:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Titles should be in sentence casing. Ex: ",(0,a.kt)("inlineCode",{parentName:"li"},"Title of a pattern")," and not ",(0,a.kt)("inlineCode",{parentName:"li"},"Title Of A Pattern"),"."),(0,a.kt)("li",{parentName:"ul"},"Each section should end with the appropriate punctuation."),(0,a.kt)("li",{parentName:"ul"},"The SCI Impact section entries should follow the same order of the equation. ",(0,a.kt)("inlineCode",{parentName:"li"},"E")," should be first (if applicable), then ",(0,a.kt)("inlineCode",{parentName:"li"},"I")," (if applicable), then ",(0,a.kt)("inlineCode",{parentName:"li"},"M")," (if applicable), then ",(0,a.kt)("inlineCode",{parentName:"li"},"R")," (if applicable).")),(0,a.kt)("h3",{id:"pull-request-set-to-merge-in-dev-branch"},"Pull Request Set To Merge In Dev Branch"),(0,a.kt)("p",null,"We require that all new patterns are submitted against the ",(0,a.kt)("inlineCode",{parentName:"p"},"dev")," branch in the repository. If the pull request is set to merge to any other branch of the repository, the submitter should update it to merge to ",(0,a.kt)("inlineCode",{parentName:"p"},"dev"),"."),(0,a.kt)("h3",{id:"content-validation"},"Content Validation"),(0,a.kt)("p",null,"Is there enough information and detail provided in the pattern for a subject matter expert to reasonably evaluate it? You may or may not have specific knowledge for the submitted pattern so this is a cursory check to make sure there is enough information present for the subject matter expert and does not need to be perfect."),(0,a.kt)("h3",{id:"provide-clear-feedback"},"Provide Clear Feedback"),(0,a.kt)("p",null,"If any of these areas are missing or incomplete, you must provide clear and constructive feedback and guidance as comments in the pull request so that the submitter can make the necessary changes to move to the next phase. Initial Reviewers are one of the first interactions many people will have with Green Software leaders so we want to ensure we are creating an open and inclusive environment by being constructive and clear with the feedback. "),(0,a.kt)("h2",{id:"assigning-to-sme-for-further-review"},"Assigning to SME for Further Review"),(0,a.kt)("p",null,"If all of these conditions have been met and the pattern is ready for a subject matter expert, you should remove the ",(0,a.kt)("inlineCode",{parentName:"p"},"Initial Review")," label and add the ",(0,a.kt)("inlineCode",{parentName:"p"},"SME Review")," label on the pull request. You also should assign the pull request to an appropriate SME Reviewer based on the tags and content of the pattern. A list of available SMEs is available on each ",(0,a.kt)("a",{parentName:"p",href:"https://patterns.greensoftware.foundation/tags/"},"Tag Page"),". Where possible, spread the SME reviews out across the available experts on a tag so that we do not overload one single person with reviews."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/e450c455.e901e9f8.js b/assets/js/e450c455.e901e9f8.js deleted file mode 100644 index 525dba70..00000000 --- a/assets/js/e450c455.e901e9f8.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6513],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>h});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({}),u=function(e){var t=n.useContext(s),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},p=function(e){var t=u(e.components);return n.createElement(s.Provider,{value:t},e.children)},d={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},c=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,p=l(e,["components","mdxType","originalType","parentName"]),c=u(r),h=a,f=c["".concat(s,".").concat(h)]||c[h]||d[h]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function h(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var i=r.length,o=new Array(i);o[0]=c;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 u=2;u{r.r(t),r.d(t,{assets:()=>s,contentTitle:()=>o,default:()=>d,frontMatter:()=>i,metadata:()=>l,toc:()=>u});var n=r(7462),a=(r(7294),r(4137));const i={},o="Initial Review Guide",l={unversionedId:"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.",source:"@site/docs/guide/initial-reviewer-guide.md",sourceDirName:"guide",slug:"/guide/initial-reviewer-guide",permalink:"/guide/initial-reviewer-guide",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/guide/initial-reviewer-guide.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Suggested Tags",permalink:"/guide/suggested-tags"},next:{title:"Subject Matter Expert (SME) Review Guide",permalink:"/guide/sme-reviewer-guide"}},s={},u=[{value:"What To Look For In Your Review",id:"what-to-look-for-in-your-review",level:2},{value:"Alignment to Green Software Foundation",id:"alignment-to-green-software-foundation",level:3},{value:"Alignment to Green Software Pattern Template",id:"alignment-to-green-software-pattern-template",level:3},{value:"Proper Green Software Pattern Formatting",id:"proper-green-software-pattern-formatting",level:3},{value:"Pull Request Set To Merge In Dev Branch",id:"pull-request-set-to-merge-in-dev-branch",level:3},{value:"Content Validation",id:"content-validation",level:3},{value:"Provide Clear Feedback",id:"provide-clear-feedback",level:3},{value:"Assigning to SME for Further Review",id:"assigning-to-sme-for-further-review",level:2}],p={toc:u};function d(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"initial-review-guide"},"Initial Review Guide"),(0,a.kt)("p",null,"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. "),(0,a.kt)("h2",{id:"what-to-look-for-in-your-review"},"What To Look For In Your Review"),(0,a.kt)("p",null,"Here are the things you should look for in the initial review. If any of these areas are not met, provide feedback and any recommended changes in the pull request and assign back to the submitter. If all of these areas are met, you may assign the pattern to an appropriate Subject Matter Expert (SME) for the next phase of review."),(0,a.kt)("h3",{id:"alignment-to-green-software-foundation"},"Alignment to Green Software Foundation"),(0,a.kt)("p",null,"Does this pattern align to the mission of the Green Software Foundation of reducing emissions that software is responsible for? Is the content clearly written and able to be understood by a subject matter expert? You don't need to evaluate jargon or acronyms from a specific domain, focus more on the content and how it relates to emission reduction and the SCI. "),(0,a.kt)("h3",{id:"alignment-to-green-software-pattern-template"},"Alignment to Green Software Pattern Template"),(0,a.kt)("p",null,"Does this pattern align to the ",(0,a.kt)("a",{parentName:"p",href:"https://github.com/Green-Software-Foundation/green-software-patterns/blob/dev/TEMPLATE.md"},"Pattern Template")," for Green Software Patterns? This includes all sections being present, tags supported on our ",(0,a.kt)("a",{parentName:"p",href:"https://patterns.greensoftware.foundation/tags/"},"Tags list"),", valid author and github alias, clearly defined assumptions and considerations, relevance to SCI has been called out. The Pattern Title should follow the form of a specific ",(0,a.kt)("inlineCode",{parentName:"p"},"Action")," on a specific ",(0,a.kt)("inlineCode",{parentName:"p"},"Resource"),'. For example, "Write efficient code" is not a good title since there is no specific action to take on a specific resource. A title of "Cache Static Data" provides a specific action of Caching to a specific resource of Static Data.'),(0,a.kt)("h3",{id:"proper-green-software-pattern-formatting"},"Proper Green Software Pattern Formatting"),(0,a.kt)("p",null,'Our documentation system uses "front matter" which requires a specific format for metadata and this section should be included at the top of each submitted pattern. The front matter content and structure can be seen on the ',(0,a.kt)("a",{parentName:"p",href:"https://github.com/Green-Software-Foundation/green-software-patterns/blob/dev/TEMPLATE.md"},"Pattern Template")," and should include all fields listed there."),(0,a.kt)("p",null,"Additionally, we look for patterns to align to the following formatting rules:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},"Titles should be in sentence casing. Ex: ",(0,a.kt)("inlineCode",{parentName:"li"},"Title of a pattern")," and not ",(0,a.kt)("inlineCode",{parentName:"li"},"Title Of A Pattern"),"."),(0,a.kt)("li",{parentName:"ul"},"Each section should end with the appropriate punctuation."),(0,a.kt)("li",{parentName:"ul"},"The SCI Impact section entries should follow the same order of the equation. ",(0,a.kt)("inlineCode",{parentName:"li"},"E")," should be first (if applicable), then ",(0,a.kt)("inlineCode",{parentName:"li"},"I")," (if applicable), then ",(0,a.kt)("inlineCode",{parentName:"li"},"M")," (if applicable), then ",(0,a.kt)("inlineCode",{parentName:"li"},"R")," (if applicable).")),(0,a.kt)("h3",{id:"pull-request-set-to-merge-in-dev-branch"},"Pull Request Set To Merge In Dev Branch"),(0,a.kt)("p",null,"We require that all new patterns are submitted against the ",(0,a.kt)("inlineCode",{parentName:"p"},"dev")," branch in the repository. If the pull request is set to merge to any other branch of the repository, the submitter should update it to merge to ",(0,a.kt)("inlineCode",{parentName:"p"},"dev"),"."),(0,a.kt)("h3",{id:"content-validation"},"Content Validation"),(0,a.kt)("p",null,"Is there enough information and detail provided in the pattern for a subject matter expert to reasonably evaluate it? You may or may not have specific knowledge for the submitted pattern so this is a cursory check to make sure there is enough information present for the subject matter expert and does not need to be perfect."),(0,a.kt)("h3",{id:"provide-clear-feedback"},"Provide Clear Feedback"),(0,a.kt)("p",null,"If any of these areas are missing or incomplete, you must provide clear and constructive feedback and guidance as comments in the pull request so that the submitter can make the necessary changes to move to the next phase. Initial Reviewers are one of the first interactions many people will have with Green Software leaders so we want to ensure we are creating an open and inclusive environment by being constructive and clear with the feedback. "),(0,a.kt)("h2",{id:"assigning-to-sme-for-further-review"},"Assigning to SME for Further Review"),(0,a.kt)("p",null,"If all of these conditions have been met and the pattern is ready for a subject matter expert, you should remove the ",(0,a.kt)("inlineCode",{parentName:"p"},"Initial Review")," label and add the ",(0,a.kt)("inlineCode",{parentName:"p"},"SME Review")," label on the pull request. You also should assign the pull request to an appropriate SME Reviewer based on the tags and content of the pattern. A list of available SMEs is available on each ",(0,a.kt)("a",{parentName:"p",href:"https://patterns.greensoftware.foundation/tags/"},"Tag Page"),". Where possible, spread the SME reviews out across the available experts on a tag so that we do not overload one single person with reviews."))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f00aede0.32061047.js b/assets/js/f00aede0.32061047.js new file mode 100644 index 00000000..8ef5b472 --- /dev/null +++ b/assets/js/f00aede0.32061047.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3043],{4137:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>d});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 i(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):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),m=c(n),d=o,b=m["".concat(l,".").concat(d)]||m[d]||u[d]||a;return n?r.createElement(b,i(i({ref:t},p),{},{components:n})):r.createElement(b,i({ref:t},p))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;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{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(7462),o=(n(7294),n(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["web","size:small","role:web-developer"]},i="Enable text compression",s={unversionedId:"catalog/web/enable-text-compression",id:"catalog/web/enable-text-compression",title:"Enable text compression",description:"Description",source:"@site/docs/catalog/web/enable-text-compression.md",sourceDirName:"catalog/web",slug:"/catalog/web/enable-text-compression",permalink:"/catalog/web/enable-text-compression",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/enable-text-compression.md",tags:[{label:"web",permalink:"/tags/web"},{label:"size:small",permalink:"/tags/size-small"},{label:"role:web-developer",permalink:"/tags/role-web-developer"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["web","size:small","role:web-developer"]},sidebar:"tutorialSidebar",previous:{title:"Deprecate GIFs for animated content",permalink:"/catalog/web/deprecate-gifs"},next:{title:"Keep request counts low",permalink:"/catalog/web/keep-request-counts-low"}},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}],p={toc:c};function u(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"enable-text-compression"},"Enable text compression"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"Web browsers often communicate with web servers in a human readable format. These can be HTML, JavaScript and/or CSS - files and also REST requests which can return a response in JSON. This communication is human readable and therefore highly redundant, therefore it can be highly compressed saving a lot of bandwidth."),(0,o.kt)("p",null,'Web browsers and servers can communicate the compression format dynamically via the "Accept-Encoding"/"Content-Encoding" HTTP Headers. This allows the communication to dynamically switch to compression formats both side support.'),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Enable all supported compression formats on the server, this allows clients to use the best available format."),(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"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Concerning the SCI equation, the compression will impact the equation as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": Reducing the amount of emissions by reducing electricity needed while transferring and processing text files."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": Reducing the amount of size of the files can also reduce the amount of storage requirements of the web page on the server")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The ability to use web servers that allow compression formats")),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(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://en.wikipedia.org/wiki/HTTP_compression"},"HTTP compression")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Brotli"},"Information about Brotli, a common web compression algorithm")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://caniuse.com/?search=content-encoding"},"Compression Format WebBrowser Implementation Status"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f00aede0.f947b6c1.js b/assets/js/f00aede0.f947b6c1.js deleted file mode 100644 index b518759e..00000000 --- a/assets/js/f00aede0.f947b6c1.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3043],{4137:(e,t,n)=>{n.d(t,{Zo:()=>p,kt:()=>d});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 i(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):i(i({},t),e)),n},p=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},m=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),m=c(n),d=o,b=m["".concat(l,".").concat(d)]||m[d]||u[d]||a;return n?r.createElement(b,i(i({ref:t},p),{},{components:n})):r.createElement(b,i({ref:t},p))}));function d(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=m;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{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>u,frontMatter:()=>a,metadata:()=>s,toc:()=>c});var r=n(7462),o=(n(7294),n(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["web","size:small","role:web-developer"]},i="Enable text compression",s={unversionedId:"catalog/web/enable-text-compression",id:"catalog/web/enable-text-compression",title:"Enable text compression",description:"Description",source:"@site/docs/catalog/web/enable-text-compression.md",sourceDirName:"catalog/web",slug:"/catalog/web/enable-text-compression",permalink:"/catalog/web/enable-text-compression",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/enable-text-compression.md",tags:[{label:"web",permalink:"/tags/web"},{label:"size:small",permalink:"/tags/size-small"},{label:"role:web-developer",permalink:"/tags/role-web-developer"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["web","size:small","role:web-developer"]},sidebar:"tutorialSidebar",previous:{title:"Deprecate GIFs for animated content",permalink:"/catalog/web/deprecate-gifs"},next:{title:"Keep request counts low",permalink:"/catalog/web/keep-request-counts-low"}},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}],p={toc:c};function u(e){let{components:t,...n}=e;return(0,o.kt)("wrapper",(0,r.Z)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"enable-text-compression"},"Enable text compression"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"Web browsers often communicate with web servers in a human readable format. These can be HTML, JavaScript and/or CSS - files and also REST requests which can return a response in JSON. This communication is human readable and therefore highly redundant, therefore it can be highly compressed saving a lot of bandwidth."),(0,o.kt)("p",null,'Web browsers and servers can communicate the compression format dynamically via the "Accept-Encoding"/"Content-Encoding" HTTP Headers. This allows the communication to dynamically switch to compression formats both side support.'),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Enable all supported compression formats on the server, this allows clients to use the best available format."),(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"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Concerning the SCI equation, the compression will impact the equation as follows:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": Reducing the amount of emissions by reducing electricity needed while transferring and processing text files."),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": Reducing the amount of size of the files can also reduce the amount of storage requirements of the web page on the server")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"The ability to use web servers that allow compression formats")),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(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://en.wikipedia.org/wiki/HTTP_compression"},"HTTP compression")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://en.wikipedia.org/wiki/Brotli"},"Information about Brotli, a common web compression algorithm")),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("a",{parentName:"li",href:"https://caniuse.com/?search=content-encoding"},"Compression Format WebBrowser Implementation Status"))))}u.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f31c573f.bbd17bc6.js b/assets/js/f31c573f.bbd17bc6.js new file mode 100644 index 00000000..2cd434ba --- /dev/null +++ b/assets/js/f31c573f.bbd17bc6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3777],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>h});var a=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 i(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||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),u=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(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,n=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(r),h=n,f=d["".concat(l,".").concat(h)]||d[h]||p[h]||i;return r?a.createElement(f,o(o({ref:t},c),{},{components:r})):a.createElement(f,o({ref:t},c))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.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:n,o[1]=s;for(var u=2;u{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var a=r(7462),n=(r(7294),r(4137));const i={},o="Subject Matter Expert (SME) Review Guide",s={unversionedId:"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.",source:"@site/docs/guide/sme-reviewer-guide.md",sourceDirName:"guide",slug:"/guide/sme-reviewer-guide",permalink:"/guide/sme-reviewer-guide",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/guide/sme-reviewer-guide.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Initial Review Guide",permalink:"/guide/initial-reviewer-guide"},next:{title:"Catalog",permalink:"/catalog/"}},l={},u=[{value:"What To Look For In Your Review",id:"what-to-look-for-in-your-review",level:2},{value:"Check For Dupliate Patterns",id:"check-for-dupliate-patterns",level:3},{value:"Content Validation",id:"content-validation",level:3},{value:"Efficacy & Accuracy Review",id:"efficacy--accuracy-review",level:3},{value:"Validate Pattern Level of Depth",id:"validate-pattern-level-of-depth",level:3},{value:"Provide Clear Feedback",id:"provide-clear-feedback",level:3},{value:"Approving and Moving To Team Consensus Phase",id:"approving-and-moving-to-team-consensus-phase",level:2}],c={toc:u};function p(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"subject-matter-expert-sme-review-guide"},"Subject Matter Expert (SME) Review Guide"),(0,n.kt)("p",null,"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. "),(0,n.kt)("h2",{id:"what-to-look-for-in-your-review"},"What To Look For In Your Review"),(0,n.kt)("p",null,"Here are the things you should look for in the subject matter expert review. If any of these areas are not met, provide feedback and any recommended changes in the pull request and assign back to the submitter. If all of these areas are met, you may approve the pull request and move it to the Team Consensus phase."),(0,n.kt)("h3",{id:"check-for-dupliate-patterns"},"Check For Dupliate Patterns"),(0,n.kt)("p",null,"The first thing to check is if this pattern exists already in our defined catalog or in a pending pull request. If you feel that any other pattern matches this submission, reference the potential duplicate in the pull request comments and seek feedback from the submitter on this possible duplication. It may be a new or more specific scenario that what is previously defined so we want to provide the submitter the opportunity to provide more clarity. "),(0,n.kt)("h3",{id:"content-validation"},"Content Validation"),(0,n.kt)("p",null,"Determine if there is an appropriate level of details for someone in the industry to implement it based solely on this content. We aren't looking for step-by-step instructions at this level, but the guidance of taking a specific action on a specific resource or system component should be clearly stated and able to be replicated by another person. "),(0,n.kt)("h3",{id:"efficacy--accuracy-review"},"Efficacy & Accuracy Review"),(0,n.kt)("p",null,"Determine if the proposed pattern would effectively reduce software emissions based on your experitise and best judgement. This is where we look to you as the subject matter expert to provide guidance and make judgement calls. If you are unsure or would like more detail or data, make clear requests or comments in the pull request to gain that clarity from the submitter. The value of Green Software Patterns is largely driven from this step in the review so please be critical of submissions where the efficacy and/or the accuracy is not stated or evident to you. "),(0,n.kt)("h3",{id:"validate-pattern-level-of-depth"},"Validate Pattern Level of Depth"),(0,n.kt)("p",null,'One of the trickiest parts of defining new Green Software Patterns is determining the appropriate "level" a pattern should exist. Patterns that are too broad or vague are not useful and difficult to apply. Patterns that are too specific risk losing touch with the system emissions impact in a system and are not as relatable to the industry. We prefer smaller atomic patterns to larger patterns. A helpful way to approach a pattern is defining a specific ',(0,n.kt)("inlineCode",{parentName:"p"},"Action")," to take on a specific ",(0,n.kt)("inlineCode",{parentName:"p"},"Resource"),". For example, ",(0,n.kt)("inlineCode",{parentName:"p"},"Write efficient code")," is too vague and high-level since there is no specific action to take on a specific resource. Whereas ",(0,n.kt)("inlineCode",{parentName:"p"},"Cache Static Data")," provides a specific action of Caching to a specific resource of Static Data. "),(0,n.kt)("p",null,"Some common signs that patterns should be broken down into multiple patterns include: "),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Multiple solutions in solution section "),(0,n.kt)("li",{parentName:"ul"},"Touching on two or more SCI components simultaneously ")),(0,n.kt)("p",null,"If the pattern is too specific as defined, the reviewer should look to combine it with other existing patterns or provide guidance to meet the appropriate level of depth. "),(0,n.kt)("h3",{id:"provide-clear-feedback"},"Provide Clear Feedback"),(0,n.kt)("p",null,"If any of these areas are missing or incomplete, you must provide clear and constructive feedback and guidance as comments in the pull request so that the submitter can make the necessary changes to move to the next phase. Subject Matter Experts are one of the first interactions many people will have with Green Software leaders so we want to ensure we are creating an open and inclusive environment by being constructive and clear with the feedback. "),(0,n.kt)("h2",{id:"approving-and-moving-to-team-consensus-phase"},"Approving and Moving To Team Consensus Phase"),(0,n.kt)("p",null,"If all of these conditions have been met and the pattern is ready for the Team Consensus phase, you should remove the ",(0,n.kt)("inlineCode",{parentName:"p"},"SME Review")," label and add the ",(0,n.kt)("inlineCode",{parentName:"p"},"Team Consensus")," label on the pull request. You also should assign the pull request back to the Initial Reviewer of the pattern. This will start a new 2-week phase where the Principles and Patterns Working Group has 2 weeks to comment/object to the pattern. It needs team consensus before the PR can be approved and merged into the ",(0,n.kt)("inlineCode",{parentName:"p"},"dev")," branch of the repository."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f31c573f.dd8695e9.js b/assets/js/f31c573f.dd8695e9.js deleted file mode 100644 index 7dc37dc2..00000000 --- a/assets/js/f31c573f.dd8695e9.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3777],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,kt:()=>h});var a=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 i(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||(n[r]=e[r]);return n}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(a=0;a=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(n[r]=e[r])}return n}var l=a.createContext({}),u=function(e){var t=a.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):o(o({},t),e)),r},c=function(e){var t=u(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,n=e.mdxType,i=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),d=u(r),h=n,f=d["".concat(l,".").concat(h)]||d[h]||p[h]||i;return r?a.createElement(f,o(o({ref:t},c),{},{components:r})):a.createElement(f,o({ref:t},c))}));function h(e,t){var r=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var i=r.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:n,o[1]=s;for(var u=2;u{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>s,toc:()=>u});var a=r(7462),n=(r(7294),r(4137));const i={},o="Subject Matter Expert (SME) Review Guide",s={unversionedId:"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.",source:"@site/docs/guide/sme-reviewer-guide.md",sourceDirName:"guide",slug:"/guide/sme-reviewer-guide",permalink:"/guide/sme-reviewer-guide",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/guide/sme-reviewer-guide.md",tags:[],version:"current",frontMatter:{},sidebar:"tutorialSidebar",previous:{title:"Initial Review Guide",permalink:"/guide/initial-reviewer-guide"},next:{title:"Catalog",permalink:"/catalog/"}},l={},u=[{value:"What To Look For In Your Review",id:"what-to-look-for-in-your-review",level:2},{value:"Check For Dupliate Patterns",id:"check-for-dupliate-patterns",level:3},{value:"Content Validation",id:"content-validation",level:3},{value:"Efficacy & Accuracy Review",id:"efficacy--accuracy-review",level:3},{value:"Validate Pattern Level of Depth",id:"validate-pattern-level-of-depth",level:3},{value:"Provide Clear Feedback",id:"provide-clear-feedback",level:3},{value:"Approving and Moving To Team Consensus Phase",id:"approving-and-moving-to-team-consensus-phase",level:2}],c={toc:u};function p(e){let{components:t,...r}=e;return(0,n.kt)("wrapper",(0,a.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"subject-matter-expert-sme-review-guide"},"Subject Matter Expert (SME) Review Guide"),(0,n.kt)("p",null,"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. "),(0,n.kt)("h2",{id:"what-to-look-for-in-your-review"},"What To Look For In Your Review"),(0,n.kt)("p",null,"Here are the things you should look for in the subject matter expert review. If any of these areas are not met, provide feedback and any recommended changes in the pull request and assign back to the submitter. If all of these areas are met, you may approve the pull request and move it to the Team Consensus phase."),(0,n.kt)("h3",{id:"check-for-dupliate-patterns"},"Check For Dupliate Patterns"),(0,n.kt)("p",null,"The first thing to check is if this pattern exists already in our defined catalog or in a pending pull request. If you feel that any other pattern matches this submission, reference the potential duplicate in the pull request comments and seek feedback from the submitter on this possible duplication. It may be a new or more specific scenario that what is previously defined so we want to provide the submitter the opportunity to provide more clarity. "),(0,n.kt)("h3",{id:"content-validation"},"Content Validation"),(0,n.kt)("p",null,"Determine if there is an appropriate level of details for someone in the industry to implement it based solely on this content. We aren't looking for step-by-step instructions at this level, but the guidance of taking a specific action on a specific resource or system component should be clearly stated and able to be replicated by another person. "),(0,n.kt)("h3",{id:"efficacy--accuracy-review"},"Efficacy & Accuracy Review"),(0,n.kt)("p",null,"Determine if the proposed pattern would effectively reduce software emissions based on your experitise and best judgement. This is where we look to you as the subject matter expert to provide guidance and make judgement calls. If you are unsure or would like more detail or data, make clear requests or comments in the pull request to gain that clarity from the submitter. The value of Green Software Patterns is largely driven from this step in the review so please be critical of submissions where the efficacy and/or the accuracy is not stated or evident to you. "),(0,n.kt)("h3",{id:"validate-pattern-level-of-depth"},"Validate Pattern Level of Depth"),(0,n.kt)("p",null,'One of the trickiest parts of defining new Green Software Patterns is determining the appropriate "level" a pattern should exist. Patterns that are too broad or vague are not useful and difficult to apply. Patterns that are too specific risk losing touch with the system emissions impact in a system and are not as relatable to the industry. We prefer smaller atomic patterns to larger patterns. A helpful way to approach a pattern is defining a specific ',(0,n.kt)("inlineCode",{parentName:"p"},"Action")," to take on a specific ",(0,n.kt)("inlineCode",{parentName:"p"},"Resource"),". For example, ",(0,n.kt)("inlineCode",{parentName:"p"},"Write efficient code")," is too vague and high-level since there is no specific action to take on a specific resource. Whereas ",(0,n.kt)("inlineCode",{parentName:"p"},"Cache Static Data")," provides a specific action of Caching to a specific resource of Static Data. "),(0,n.kt)("p",null,"Some common signs that patterns should be broken down into multiple patterns include: "),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"Multiple solutions in solution section "),(0,n.kt)("li",{parentName:"ul"},"Touching on two or more SCI components simultaneously ")),(0,n.kt)("p",null,"If the pattern is too specific as defined, the reviewer should look to combine it with other existing patterns or provide guidance to meet the appropriate level of depth. "),(0,n.kt)("h3",{id:"provide-clear-feedback"},"Provide Clear Feedback"),(0,n.kt)("p",null,"If any of these areas are missing or incomplete, you must provide clear and constructive feedback and guidance as comments in the pull request so that the submitter can make the necessary changes to move to the next phase. Subject Matter Experts are one of the first interactions many people will have with Green Software leaders so we want to ensure we are creating an open and inclusive environment by being constructive and clear with the feedback. "),(0,n.kt)("h2",{id:"approving-and-moving-to-team-consensus-phase"},"Approving and Moving To Team Consensus Phase"),(0,n.kt)("p",null,"If all of these conditions have been met and the pattern is ready for the Team Consensus phase, you should remove the ",(0,n.kt)("inlineCode",{parentName:"p"},"SME Review")," label and add the ",(0,n.kt)("inlineCode",{parentName:"p"},"Team Consensus")," label on the pull request. You also should assign the pull request back to the Initial Reviewer of the pattern. This will start a new 2-week phase where the Principles and Patterns Working Group has 2 weeks to comment/object to the pattern. It needs team consensus before the PR can be approved and merged into the ",(0,n.kt)("inlineCode",{parentName:"p"},"dev")," branch of the repository."))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f542e803.1dfe66b0.js b/assets/js/f542e803.0b0d2041.js similarity index 53% rename from assets/js/f542e803.1dfe66b0.js rename to assets/js/f542e803.0b0d2041.js index 88afa63f..911ba01e 100644 --- a/assets/js/f542e803.1dfe66b0.js +++ b/assets/js/f542e803.0b0d2041.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6559],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>u});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},p=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},m={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,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(r),u=a,f=d["".concat(l,".").concat(u)]||d[u]||m[u]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function u(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 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:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",description:"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Optimize the size of AI/ML models",s={unversionedId:"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.",source:"@site/docs/catalog/ai/compress-ml-models-for-inference.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/compress-ml-models-for-inference",permalink:"/catalog/ai/compress-ml-models-for-inference",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/ai/compress-ml-models-for-inference.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",description:"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Artificial Intelligence (AI)",permalink:"/catalog/ai/"},next:{title:"Use efficient file formats for AI/ML development",permalink:"/catalog/ai/efficent-format-for-model-training"}},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}],p={toc:c};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"optimize-the-size-of-aiml-models"},"Optimize the size of AI/ML models"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Optimizing the size of the AI/ML model can save on storage space and take up less memory. Apply strategies like quantization and evaluate the optimization changes against the desired accuracy."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Optimizing the AI/ML model impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Having an optimized AI model would reduce the energy consumption for your AI/ML inference, save storage space and network bandwidth and consequently, the E number should decrease.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://www.tensorflow.org/lite/performance/model_optimization"},"Model optimization")))}m.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[6559],{4137:(e,t,r)=>{r.d(t,{Zo:()=>p,kt:()=>u});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},p=function(e){var t=c(e.components);return n.createElement(l.Provider,{value:t},e.children)},m={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,l=e.parentName,p=s(e,["components","mdxType","originalType","parentName"]),d=c(r),u=a,f=d["".concat(l,".").concat(u)]||d[u]||m[u]||i;return r?n.createElement(f,o(o({ref:t},p),{},{components:r})):n.createElement(f,o({ref:t},p))}));function u(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 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:()=>m,frontMatter:()=>i,metadata:()=>s,toc:()=>c});var n=r(7462),a=(r(7294),r(4137));const i={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",description:"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Optimize the size of AI/ML models",s={unversionedId:"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.",source:"@site/docs/catalog/ai/compress-ml-models-for-inference.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/compress-ml-models-for-inference",permalink:"/catalog/ai/compress-ml-models-for-inference",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/ai/compress-ml-models-for-inference.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",description:"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Artificial Intelligence (AI)",permalink:"/catalog/ai/"},next:{title:"Use efficient file formats for AI/ML development",permalink:"/catalog/ai/efficent-format-for-model-training"}},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}],p={toc:c};function m(e){let{components:t,...r}=e;return(0,a.kt)("wrapper",(0,n.Z)({},p,r,{components:t,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"optimize-the-size-of-aiml-models"},"Optimize the size of AI/ML models"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"Large-scale AI/ML models require significant storage space and take more resources to run as compared to optimized models."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Optimizing the size of the AI/ML model can save on storage space and take up less memory. Apply strategies like quantization and evaluate the optimization changes against the desired accuracy."),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Optimizing the AI/ML model impacts SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Having an optimized AI model would reduce the energy consumption for your AI/ML inference, save storage space and network bandwidth and consequently, the E number should decrease.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://www.tensorflow.org/lite/performance/model_optimization"},"Model optimization")))}m.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f59c19d8.3cf4f21e.js b/assets/js/f59c19d8.3cf4f21e.js deleted file mode 100644 index 1f9e6648..00000000 --- a/assets/js/f59c19d8.3cf4f21e.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5189],{4137:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=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 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 o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}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)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(r),m=i,h=u["".concat(l,".").concat(m)]||u[m]||p[m]||a;return r?n.createElement(h,o(o({ref:t},d),{},{components:r})):n.createElement(h,o({ref:t},d))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=u;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:()=>a,metadata:()=>s,toc:()=>c});var n=r(7462),i=(r(7294),r(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",description:"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.",tags:["size:medium","role:web-developer","web"]},o="Avoid an excessive DOM size",s={unversionedId:"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.",source:"@site/docs/catalog/web/avoid-excessive-dom-size.md",sourceDirName:"catalog/web",slug:"/catalog/web/avoid-excessive-dom-size",permalink:"/catalog/web/avoid-excessive-dom-size",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/avoid-excessive-dom-size.md",tags:[{label:"size:medium",permalink:"/tags/size-medium"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"web",permalink:"/tags/web"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2022-11-10T00:00:00.000Z",category:"web",description:"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.",tags:["size:medium","role:web-developer","web"]},sidebar:"tutorialSidebar",previous:{title:"Avoid chaining critical requests",permalink:"/catalog/web/avoid-chaining-critical-requests"},next:{title:"Avoid tracking unnecessary data",permalink:"/catalog/web/avoid-tracking-unnecessary-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}],d={toc:c};function p(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"avoid-an-excessive-dom-size"},"Avoid an excessive DOM size"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Web browsers convert the HTML from the server into a Document Object Model (DOM) to further process the web page. Each HTML element, for example, one div, is then one node in the DOM. The amount of nodes defines the memory requirements in the browser and the needed time to display and update the page.\nThe greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element. Additionally, each interaction with the DOM from Javascript needs more processing time and more memory to traverse the DOM elements."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Keep the necessary HTML as small as possible and strip unneeded elements from it. Use advanced strategies of the frontend framework used to reduce the DOM size additionally. When rendering large lists, for example, use these techniques:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Angular: Use ",(0,i.kt)("a",{parentName:"li",href:"https://material.angular.io/cdk/scrolling/overview#virtual-scrolling"},"virtual scrolling")," with the component dev kit"),(0,i.kt)("li",{parentName:"ul"},'React: Use "windowing" libraries like ',(0,i.kt)("a",{parentName:"li",href:"https://react-window.vercel.app/#/examples/list/fixed-size"},"react-window")," ")),(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,"Optimizing the DOM size will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Reduces the processing and memory requirements to display the page and therefore the energy requirements.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"There is an assumption that the framework and/or the environment allows for changing the HTML structure or rendering path.")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(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://web.dev/dom-size/"},"Reference"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/f59c19d8.f040a789.js b/assets/js/f59c19d8.f040a789.js new file mode 100644 index 00000000..5870077f --- /dev/null +++ b/assets/js/f59c19d8.f040a789.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[5189],{4137:(e,t,r)=>{r.d(t,{Zo:()=>d,kt:()=>m});var n=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 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 o(e){for(var t=1;t=0||(i[r]=e[r]);return i}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(i[r]=e[r])}return i}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)},p={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},u=n.forwardRef((function(e,t){var r=e.components,i=e.mdxType,a=e.originalType,l=e.parentName,d=s(e,["components","mdxType","originalType","parentName"]),u=c(r),m=i,h=u["".concat(l,".").concat(m)]||u[m]||p[m]||a;return r?n.createElement(h,o(o({ref:t},d),{},{components:r})):n.createElement(h,o({ref:t},d))}));function m(e,t){var r=arguments,i=t&&t.mdxType;if("string"==typeof e||i){var a=r.length,o=new Array(a);o[0]=u;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:()=>a,metadata:()=>s,toc:()=>c});var n=r(7462),i=(r(7294),r(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"web",description:"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.",tags:["size:medium","role:web-developer","web"]},o="Avoid an excessive DOM size",s={unversionedId:"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.",source:"@site/docs/catalog/web/avoid-excessive-dom-size.md",sourceDirName:"catalog/web",slug:"/catalog/web/avoid-excessive-dom-size",permalink:"/catalog/web/avoid-excessive-dom-size",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/avoid-excessive-dom-size.md",tags:[{label:"size:medium",permalink:"/tags/size-medium"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"web",permalink:"/tags/web"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"2022-11-10T00:00:00.000Z",category:"web",description:"The greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element.",tags:["size:medium","role:web-developer","web"]},sidebar:"tutorialSidebar",previous:{title:"Avoid chaining critical requests",permalink:"/catalog/web/avoid-chaining-critical-requests"},next:{title:"Avoid tracking unnecessary data",permalink:"/catalog/web/avoid-tracking-unnecessary-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}],d={toc:c};function p(e){let{components:t,...r}=e;return(0,i.kt)("wrapper",(0,n.Z)({},d,r,{components:t,mdxType:"MDXLayout"}),(0,i.kt)("h1",{id:"avoid-an-excessive-dom-size"},"Avoid an excessive DOM size"),(0,i.kt)("h2",{id:"description"},"Description"),(0,i.kt)("p",null,"Web browsers convert the HTML from the server into a Document Object Model (DOM) to further process the web page. Each HTML element, for example, one div, is then one node in the DOM. The amount of nodes defines the memory requirements in the browser and the needed time to display and update the page.\nThe greater the amount of nodes that are defined in HTML, the greater the time spent processing and rendering each element. Additionally, each interaction with the DOM from Javascript needs more processing time and more memory to traverse the DOM elements."),(0,i.kt)("h2",{id:"solution"},"Solution"),(0,i.kt)("p",null,"Keep the necessary HTML as small as possible and strip unneeded elements from it. Use advanced strategies of the frontend framework used to reduce the DOM size additionally. When rendering large lists, for example, use these techniques:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"Angular: Use ",(0,i.kt)("a",{parentName:"li",href:"https://material.angular.io/cdk/scrolling/overview#virtual-scrolling"},"virtual scrolling")," with the component dev kit"),(0,i.kt)("li",{parentName:"ul"},'React: Use "windowing" libraries like ',(0,i.kt)("a",{parentName:"li",href:"https://react-window.vercel.app/#/examples/list/fixed-size"},"react-window")," ")),(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,"Optimizing the DOM size will impact SCI as follows:"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},(0,i.kt)("inlineCode",{parentName:"li"},"E"),": Reduces the processing and memory requirements to display the page and therefore the energy requirements.")),(0,i.kt)("h2",{id:"assumptions"},"Assumptions"),(0,i.kt)("ul",null,(0,i.kt)("li",{parentName:"ul"},"There is an assumption that the framework and/or the environment allows for changing the HTML structure or rendering path.")),(0,i.kt)("h2",{id:"considerations"},"Considerations"),(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://web.dev/dom-size/"},"Reference"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fada8994.6bb157d1.js b/assets/js/fada8994.6bb157d1.js new file mode 100644 index 00000000..a9fb808d --- /dev/null +++ b/assets/js/fada8994.6bb157d1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[727],{4137:(e,t,i)=>{i.d(t,{Zo:()=>c,kt:()=>m});var r=i(7294);function n(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function a(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t=0||(n[i]=e[i]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(n[i]=e[i])}return n}var l=r.createContext({}),u=function(e){var t=r.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},c=function(e){var t=u(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 i=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(i),m=n,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return i?r.createElement(f,o(o({ref:t},c),{},{components:i})):r.createElement(f,o({ref:t},c))}));function m(e,t){var i=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=i.length,o=new Array(a);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:n,o[1]=s;for(var u=2;u{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var r=i(7462),n=(i(7294),i(4137));const a={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["compute","monitoring","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:medium"]},o="Optimize peak CPU utilization",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/optimize-peak-cpu-utilization.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/optimize-peak-cpu-utilization",permalink:"/catalog/cloud/optimize-peak-cpu-utilization",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/cloud/optimize-peak-cpu-utilization.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"monitoring",permalink:"/tags/monitoring"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"role:reliability-engineer",permalink:"/tags/role-reliability-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["compute","monitoring","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Optimize impact on customer devices and equipment",permalink:"/catalog/cloud/optimize-impact-on-customer-equipment"},next:{title:"Queue non-urgent processing requests",permalink:"/catalog/cloud/queue-non-urgent-requests"}},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,...i}=e;return(0,n.kt)("wrapper",(0,r.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"optimize-peak-cpu-utilization"},"Optimize peak CPU utilization"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"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. "),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"Optimizing peak CPU utilization can take many different forms but the key is to understand the processes utilizing your CPU and what actions drive increases and decreases. For example, loading a user's full profile could potentially require dozens of database queries, data processing threads and UI rendering that can drive CPU usage up. Adding caching layers, reducing the amount of data being transmitted and rendered, or queuing non-urgent requests up for later processing are good examples of ways to optimize CPU utilization and flatten out some of the spikes your system may see. "),(0,n.kt)("p",null,"From an energy efficiency perspective, optimizing and reducing the peak CPU utilization values for your system reduces the overall energy required to support traffic and can make your system hardware requirements more predictable overall. "),(0,n.kt)("p",null,"From a hardware efficiency perspective, optimizing and reducing the peak CPU utilization values for your system reduces the amount of resources needed to support traffic. If the traffic in your system spikes quickly, that typically requires resources to be on stand-by and under utilized. This pattern would reduce the amount of resources required to support traffic. "),(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,"Optimizing peak CPU utilization impacts SCI as follows:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"E"),": Reduced peak CPU utilization will reduce the amount of energy needed to support the systems traffic from the reduced CPU requirements."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"M"),": Reduced peak CPU utilization will reduce the amount of resources needed which will decrease the amount of embodied carbon required to support the system.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"There is an assumption that traffic is expected to fluctuate during normal production usage because of external natural changes in how users consume. If there are other reasons for the CPU utilization spikes caused by the system itself, these should be addressed separately. ")),(0,n.kt)("h2",{id:"considerations"},"Considerations"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"There is no optimal CPU utilization value provided in this pattern, that should be determined from the system and its specific requirements."),(0,n.kt)("li",{parentName:"ul"},"Reducing spikes in CPU utilization could be achieved by adding more hardware to better load balance. The software practioner should try to find efficiencies within the system that don't involve introducing more hardware and therefore additional embodied carbon.")),(0,n.kt)("h2",{id:"references"},"References"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fada8994.6dacb172.js b/assets/js/fada8994.6dacb172.js deleted file mode 100644 index 3613f3ea..00000000 --- a/assets/js/fada8994.6dacb172.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[727],{4137:(e,t,i)=>{i.d(t,{Zo:()=>c,kt:()=>m});var r=i(7294);function n(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function a(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,r)}return i}function o(e){for(var t=1;t=0||(n[i]=e[i]);return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(n[i]=e[i])}return n}var l=r.createContext({}),u=function(e){var t=r.useContext(l),i=t;return e&&(i="function"==typeof e?e(t):o(o({},t),e)),i},c=function(e){var t=u(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 i=e.components,n=e.mdxType,a=e.originalType,l=e.parentName,c=s(e,["components","mdxType","originalType","parentName"]),p=u(i),m=n,f=p["".concat(l,".").concat(m)]||p[m]||d[m]||a;return i?r.createElement(f,o(o({ref:t},c),{},{components:i})):r.createElement(f,o({ref:t},c))}));function m(e,t){var i=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var a=i.length,o=new Array(a);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:n,o[1]=s;for(var u=2;u{i.r(t),i.d(t,{assets:()=>l,contentTitle:()=>o,default:()=>d,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var r=i(7462),n=(i(7294),i(4137));const a={version:1,submitted_by:"dubrie",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"cloud",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.",tags:["compute","monitoring","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:medium"]},o="Optimize peak CPU utilization",s={unversionedId:"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.",source:"@site/docs/catalog/cloud/optimize-peak-cpu-utilization.md",sourceDirName:"catalog/cloud",slug:"/catalog/cloud/optimize-peak-cpu-utilization",permalink:"/catalog/cloud/optimize-peak-cpu-utilization",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/cloud/optimize-peak-cpu-utilization.md",tags:[{label:"compute",permalink:"/tags/compute"},{label:"monitoring",permalink:"/tags/monitoring"},{label:"role:cloud-engineer",permalink:"/tags/role-cloud-engineer"},{label:"role:software-engineer",permalink:"/tags/role-software-engineer"},{label:"role:reliability-engineer",permalink:"/tags/role-reliability-engineer"},{label:"size:medium",permalink:"/tags/size-medium"}],version:"current",frontMatter:{version:1,submitted_by:"dubrie",published_date:"2022-11-10T00:00:00.000Z",category:"cloud",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.",tags:["compute","monitoring","role:cloud-engineer","role:software-engineer","role:reliability-engineer","size:medium"]},sidebar:"tutorialSidebar",previous:{title:"Optimize impact on customer devices and equipment",permalink:"/catalog/cloud/optimize-impact-on-customer-equipment"},next:{title:"Queue non-urgent processing requests",permalink:"/catalog/cloud/queue-non-urgent-requests"}},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,...i}=e;return(0,n.kt)("wrapper",(0,r.Z)({},c,i,{components:t,mdxType:"MDXLayout"}),(0,n.kt)("h1",{id:"optimize-peak-cpu-utilization"},"Optimize peak CPU utilization"),(0,n.kt)("h2",{id:"description"},"Description"),(0,n.kt)("p",null,"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. "),(0,n.kt)("h2",{id:"solution"},"Solution"),(0,n.kt)("p",null,"Optimizing peak CPU utilization can take many different forms but the key is to understand the processes utilizing your CPU and what actions drive increases and decreases. For example, loading a user's full profile could potentially require dozens of database queries, data processing threads and UI rendering that can drive CPU usage up. Adding caching layers, reducing the amount of data being transmitted and rendered, or queuing non-urgent requests up for later processing are good examples of ways to optimize CPU utilization and flatten out some of the spikes your system may see. "),(0,n.kt)("p",null,"From an energy efficiency perspective, optimizing and reducing the peak CPU utilization values for your system reduces the overall energy required to support traffic and can make your system hardware requirements more predictable overall. "),(0,n.kt)("p",null,"From a hardware efficiency perspective, optimizing and reducing the peak CPU utilization values for your system reduces the amount of resources needed to support traffic. If the traffic in your system spikes quickly, that typically requires resources to be on stand-by and under utilized. This pattern would reduce the amount of resources required to support traffic. "),(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,"Optimizing peak CPU utilization impacts SCI as follows:"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"E"),": Reduced peak CPU utilization will reduce the amount of energy needed to support the systems traffic from the reduced CPU requirements."),(0,n.kt)("li",{parentName:"ul"},(0,n.kt)("inlineCode",{parentName:"li"},"M"),": Reduced peak CPU utilization will reduce the amount of resources needed which will decrease the amount of embodied carbon required to support the system.")),(0,n.kt)("h2",{id:"assumptions"},"Assumptions"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"There is an assumption that traffic is expected to fluctuate during normal production usage because of external natural changes in how users consume. If there are other reasons for the CPU utilization spikes caused by the system itself, these should be addressed separately. ")),(0,n.kt)("h2",{id:"considerations"},"Considerations"),(0,n.kt)("ul",null,(0,n.kt)("li",{parentName:"ul"},"There is no optimal CPU utilization value provided in this pattern, that should be determined from the system and its specific requirements."),(0,n.kt)("li",{parentName:"ul"},"Reducing spikes in CPU utilization could be achieved by adding more hardware to better load balance. The software practioner should try to find efficiencies within the system that don't involve introducing more hardware and therefore additional embodied carbon.")),(0,n.kt)("h2",{id:"references"},"References"))}d.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fb940ba6.a372c42d.js b/assets/js/fb940ba6.90b6bff2.js similarity index 52% rename from assets/js/fb940ba6.a372c42d.js rename to assets/js/fb940ba6.90b6bff2.js index 0e0a9670..363cd884 100644 --- a/assets/js/fb940ba6.a372c42d.js +++ b/assets/js/fb940ba6.90b6bff2.js @@ -1 +1 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[927],{4137:(e,n,t)=>{t.d(n,{Zo:()=>f,kt:()=>u});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},f=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},p={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,f=l(e,["components","mdxType","originalType","parentName"]),d=c(t),u=a,m=d["".concat(s,".").concat(u)]||d[u]||p[u]||i;return t?r.createElement(m,o(o({ref:n},f),{},{components:t})):r.createElement(m,o({ref:n},f))}));function u(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=t(7462),a=(t(7294),t(4137));const i={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Select a more energy efficient AI/ML framework",l={unversionedId:"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.",source:"@site/docs/catalog/ai/energy-efficent-framework.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/energy-efficent-framework",permalink:"/catalog/ai/energy-efficent-framework",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/ai/energy-efficent-framework.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Run AI models at the edge",permalink:"/catalog/ai/energy-efficent-ai-edge"},next:{title:"Use energy efficient AI/ML models",permalink:"/catalog/ai/energy-efficent-models"}},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}],f={toc:c};function p(e){let{components:n,...t}=e;return(0,a.kt)("wrapper",(0,r.Z)({},f,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"select-a-more-energy-efficient-aiml-framework"},"Select a more energy efficient AI/ML framework"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"Typically, AI/ML frameworks built on languages like C/C++ are more energy efficient than those built on other programming languages."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Evaluate and select an energy-efficient framework/module for AI/ML development, training and inference. "),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Selecting an energy-efficient AI/ML would impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Having an energy-efficient framework reduces energy consumption for AI/ML training and inference and consequently.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://stefanos1316.github.io/my_curriculum_vitae/GKSSZ22.pdf"},"Green AI: Do Deep Learning Frameworks Have Different Costs?")))}p.isMDXComponent=!0}}]); \ No newline at end of file +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[927],{4137:(e,n,t)=>{t.d(n,{Zo:()=>f,kt:()=>u});var r=t(7294);function a(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}function i(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);n&&(r=r.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,r)}return t}function o(e){for(var n=1;n=0||(a[t]=e[t]);return a}(e,n);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(r=0;r=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var s=r.createContext({}),c=function(e){var n=r.useContext(s),t=n;return e&&(t="function"==typeof e?e(n):o(o({},n),e)),t},f=function(e){var n=c(e.components);return r.createElement(s.Provider,{value:n},e.children)},p={inlineCode:"code",wrapper:function(e){var n=e.children;return r.createElement(r.Fragment,{},n)}},d=r.forwardRef((function(e,n){var t=e.components,a=e.mdxType,i=e.originalType,s=e.parentName,f=l(e,["components","mdxType","originalType","parentName"]),d=c(t),u=a,m=d["".concat(s,".").concat(u)]||d[u]||p[u]||i;return t?r.createElement(m,o(o({ref:n},f),{},{components:t})):r.createElement(m,o({ref:n},f))}));function u(e,n){var t=arguments,a=n&&n.mdxType;if("string"==typeof e||a){var i=t.length,o=new Array(i);o[0]=d;var l={};for(var s in n)hasOwnProperty.call(n,s)&&(l[s]=n[s]);l.originalType=e,l.mdxType="string"==typeof e?e:a,o[1]=l;for(var c=2;c{t.r(n),t.d(n,{assets:()=>s,contentTitle:()=>o,default:()=>p,frontMatter:()=>i,metadata:()=>l,toc:()=>c});var r=t(7462),a=(t(7294),t(4137));const i={version:1,submitted_by:"navveenb",published_date:new Date("2022-11-10T00:00:00.000Z"),category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},o="Select a more energy efficient AI/ML framework",l={unversionedId:"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.",source:"@site/docs/catalog/ai/energy-efficent-framework.md",sourceDirName:"catalog/ai",slug:"/catalog/ai/energy-efficent-framework",permalink:"/catalog/ai/energy-efficent-framework",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/ai/energy-efficent-framework.md",tags:[{label:"ai",permalink:"/tags/ai"},{label:"machine-learning",permalink:"/tags/machine-learning"},{label:"role:data-scientist",permalink:"/tags/role-data-scientist"},{label:"size:small",permalink:"/tags/size-small"}],version:"current",frontMatter:{version:1,submitted_by:"navveenb",published_date:"2022-11-10T00:00:00.000Z",category:"ai",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.",tags:["ai","machine-learning","role:data-scientist","size:small"]},sidebar:"tutorialSidebar",previous:{title:"Run AI models at the edge",permalink:"/catalog/ai/energy-efficent-ai-edge"},next:{title:"Use energy efficient AI/ML models",permalink:"/catalog/ai/energy-efficent-models"}},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}],f={toc:c};function p(e){let{components:n,...t}=e;return(0,a.kt)("wrapper",(0,r.Z)({},f,t,{components:n,mdxType:"MDXLayout"}),(0,a.kt)("h1",{id:"select-a-more-energy-efficient-aiml-framework"},"Select a more energy efficient AI/ML framework"),(0,a.kt)("h2",{id:"description"},"Description"),(0,a.kt)("p",null,"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."),(0,a.kt)("p",null,"Typically, AI/ML frameworks built on languages like C/C++ are more energy efficient than those built on other programming languages."),(0,a.kt)("h2",{id:"solution"},"Solution"),(0,a.kt)("p",null,"Evaluate and select an energy-efficient framework/module for AI/ML development, training and inference. "),(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)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,a.kt)("p",null,"Selecting an energy-efficient AI/ML would impact SCI as follows:"),(0,a.kt)("ul",null,(0,a.kt)("li",{parentName:"ul"},(0,a.kt)("inlineCode",{parentName:"li"},"E"),": Having an energy-efficient framework reduces energy consumption for AI/ML training and inference and consequently.")),(0,a.kt)("h2",{id:"assumptions"},"Assumptions"),(0,a.kt)("p",null,"None "),(0,a.kt)("h2",{id:"considerations"},"Considerations"),(0,a.kt)("p",null,"None"),(0,a.kt)("h2",{id:"references"},"References"),(0,a.kt)("p",null,(0,a.kt)("a",{parentName:"p",href:"https://stefanos1316.github.io/my_curriculum_vitae/GKSSZ22.pdf"},"Green AI: Do Deep Learning Frameworks Have Different Costs?")))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd82f3a4.2b01ef8a.js b/assets/js/fd82f3a4.2b01ef8a.js deleted file mode 100644 index d2c2a194..00000000 --- a/assets/js/fd82f3a4.2b01ef8a.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3422],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,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({}),u=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=u(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,c=s(e,["components","mdxType","originalType","parentName"]),d=u(r),m=o,f=d["".concat(l,".").concat(m)]||d[m]||p[m]||a;return r?n.createElement(f,i(i({ref:t},c),{},{components:r})):n.createElement(f,i({ref:t},c))}));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 u=2;u{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var n=r(7462),o=(r(7294),r(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["size:medium","role:web-developer","web"]},i="Keep request counts low",s={unversionedId:"catalog/web/keep-request-counts-low",id:"catalog/web/keep-request-counts-low",title:"Keep request counts low",description:"Description",source:"@site/docs/catalog/web/keep-request-counts-low.md",sourceDirName:"catalog/web",slug:"/catalog/web/keep-request-counts-low",permalink:"/catalog/web/keep-request-counts-low",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/green-software-patterns/docs/catalog/web/keep-request-counts-low.md",tags:[{label:"size:medium",permalink:"/tags/size-medium"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"web",permalink:"/tags/web"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["size:medium","role:web-developer","web"]},sidebar:"tutorialSidebar",previous:{title:"Enable text compression",permalink:"/catalog/web/enable-text-compression"},next:{title:"Minify web assets",permalink:"/catalog/web/minify-web-assets"}},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 p(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"keep-request-counts-low"},"Keep request counts low"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"Accessing a web page usually retrieves a HTML file from the web server. The HTML can then reference additional resources that the browser has to download.\nTo use the least amount of CO2, reduce the amount of files needed to display a page in the browser."),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Reduce the amount of files needed and also the amount of requests done by the loaded JavaScript to display the final page. "),(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"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Concerning the SCI equation, keeping the request counts low will impact:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": Reducing the amount of requests reduces the energy needed to display the page"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": Reducing the amount of requests can also reduce the amount of files and therefore the storage requirements of the web page on the server")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Consider setting up request count budgets that are measured when the application is tested via test automation")),(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://web.dev/resource-summary/"},"Detailed description"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/fd82f3a4.e012512d.js b/assets/js/fd82f3a4.e012512d.js new file mode 100644 index 00000000..b2764161 --- /dev/null +++ b/assets/js/fd82f3a4.e012512d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkgsf_docusaurus_template=self.webpackChunkgsf_docusaurus_template||[]).push([[3422],{4137:(e,t,r)=>{r.d(t,{Zo:()=>c,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({}),u=function(e){var t=n.useContext(l),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},c=function(e){var t=u(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,c=s(e,["components","mdxType","originalType","parentName"]),d=u(r),m=o,f=d["".concat(l,".").concat(m)]||d[m]||p[m]||a;return r?n.createElement(f,i(i({ref:t},c),{},{components:r})):n.createElement(f,i({ref:t},c))}));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 u=2;u{r.r(t),r.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>a,metadata:()=>s,toc:()=>u});var n=r(7462),o=(r(7294),r(4137));const a={version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["size:medium","role:web-developer","web"]},i="Keep request counts low",s={unversionedId:"catalog/web/keep-request-counts-low",id:"catalog/web/keep-request-counts-low",title:"Keep request counts low",description:"Description",source:"@site/docs/catalog/web/keep-request-counts-low.md",sourceDirName:"catalog/web",slug:"/catalog/web/keep-request-counts-low",permalink:"/catalog/web/keep-request-counts-low",draft:!1,editUrl:"https://github.com/Green-Software-Foundation/patterns/edit/main/docs/catalog/web/keep-request-counts-low.md",tags:[{label:"size:medium",permalink:"/tags/size-medium"},{label:"role:web-developer",permalink:"/tags/role-web-developer"},{label:"web",permalink:"/tags/web"}],version:"current",frontMatter:{version:1,submitted_by:"markus-ntt-seidl",published_date:"TBD",category:"web",tags:["size:medium","role:web-developer","web"]},sidebar:"tutorialSidebar",previous:{title:"Enable text compression",permalink:"/catalog/web/enable-text-compression"},next:{title:"Minify web assets",permalink:"/catalog/web/minify-web-assets"}},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 p(e){let{components:t,...r}=e;return(0,o.kt)("wrapper",(0,n.Z)({},c,r,{components:t,mdxType:"MDXLayout"}),(0,o.kt)("h1",{id:"keep-request-counts-low"},"Keep request counts low"),(0,o.kt)("h2",{id:"description"},"Description"),(0,o.kt)("p",null,"Accessing a web page usually retrieves a HTML file from the web server. The HTML can then reference additional resources that the browser has to download.\nTo use the least amount of CO2, reduce the amount of files needed to display a page in the browser."),(0,o.kt)("h2",{id:"solution"},"Solution"),(0,o.kt)("p",null,"Reduce the amount of files needed and also the amount of requests done by the loaded JavaScript to display the final page. "),(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"),(0,o.kt)("br",{parentName:"p"}),"\n",(0,o.kt)("a",{parentName:"p",href:"https://grnsft.org/sci"},"Software Carbon Intensity Spec")),(0,o.kt)("p",null,"Concerning the SCI equation, keeping the request counts low will impact:"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"E"),": Reducing the amount of requests reduces the energy needed to display the page"),(0,o.kt)("li",{parentName:"ul"},(0,o.kt)("inlineCode",{parentName:"li"},"M"),": Reducing the amount of requests can also reduce the amount of files and therefore the storage requirements of the web page on the server")),(0,o.kt)("h2",{id:"assumptions"},"Assumptions"),(0,o.kt)("h2",{id:"considerations"},"Considerations"),(0,o.kt)("ul",null,(0,o.kt)("li",{parentName:"ul"},"Consider setting up request count budgets that are measured when the application is tested via test automation")),(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://web.dev/resource-summary/"},"Detailed description"))))}p.isMDXComponent=!0}}]); \ No newline at end of file diff --git a/assets/js/main.3da98d95.js b/assets/js/main.9070a6a9.js similarity index 96% rename from assets/js/main.3da98d95.js rename to assets/js/main.9070a6a9.js index dd51a133..1f41d69d 100644 --- a/assets/js/main.3da98d95.js +++ b/assets/js/main.9070a6a9.js @@ -1,2 +1,2 @@ -/*! For license information please see main.3da98d95.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],"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],"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],"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],"8d33f67c":[()=>n.e(3079).then(n.t.bind(n,253,19)),"~docs/default/tag-tags-kubernetes-7ba.json",253],"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],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("/","5aa"),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/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-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-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:"/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/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-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-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":"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