CINXE.COM
Keng's Blog | Keng's Blog
<!DOCTYPE html><html lang="en" class="scroll-pt-[76px] theme-clean no-tint sidebar-default sidebar-list-default links-default __variable_f9f441 __variable_7d852e __variable_96046e"><head><meta charSet="utf-8"/><link rel="preconnect" href="https://api.gitbook.com"/><link rel="preconnect" href="https://ka-p.fontawesome.com/releases/v6.6.0/"/><link rel="preconnect" href="https://static.gitbook.com"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="image" imageSrcSet="https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=1&quality=100&sign=c53efa1d&sv=2 32w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=2&quality=100&sign=c53efa1d&sv=2 64w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=3&quality=100&sign=c53efa1d&sv=2 96w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=4&quality=100&sign=c53efa1d&sv=2 128w" imageSizes="32px" fetchPriority="high"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/51d34edee75a6bda.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/45626ddd3633854a.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/4e754f385c6d5329.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/95b358fb5c9305a3.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/bc859a4cd35f3fe5.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/e1c64f6ae2213816.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/89f0191abc1ad313.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/442a0afb56948a32.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/b322ae72ca7529fb.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/74683140939dd056.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/ee3396defbfa8d21.css" data-precedence="next"/><link rel="stylesheet" href="https://static.gitbook.com/_next/static/css/4af9aafd612346fe.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="https://static.gitbook.com/_next/static/chunks/webpack-8254c9b1ba3233fb.js"/><script src="https://static.gitbook.com/_next/static/chunks/1dd3208c-2ac490673f536a31.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/1456-dd22d8bd5e7d0727.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/main-app-145b32589a8ebb53.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/app/global-error-53091e9566f77828.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/7842-785434c6c9469d80.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/4289-f629daea2759300f.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/8581-232e62c561277f92.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/5890-04b4600f719d7465.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/8843-00cba0b160454c4d.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/983-b8c447ba525bab23.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/1683-2cdcd7f4dd3f409e.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/8678-15aefe1165bae785.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/7093-8f66c7b92e65df99.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/app/middleware/(site)/(content)/%5B%5B...pathname%5D%5D/not-found-989d3dd52c55dcb1.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/app/middleware/(site)/layout-67575f2b686fd5fa.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/app/middleware/(site)/error-0c18ba8fba3d14c8.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/2241-ff00605587a5640e.js" async=""></script><script src="https://static.gitbook.com/_next/static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js" async=""></script><script async="" src="https://integrations.gitbook.com/v1/integrations/googleanalytics/installations/f358ef7676b84cfde66faab6d1bd9057fe92c347966f2738381bb4aa08f7ca27/sites/site_ELOmj/script.js?version=150.0"></script><meta name="color-scheme" content="light"/><title>Keng's Blog | Keng's Blog</title><meta name="generator" content="GitBook (73e2b47)"/><meta name="robots" content="index, follow"/><link rel="canonical" href="https://kengz.gitbook.io/blog"/><meta property="og:title" content="Keng's Blog | Keng's Blog"/><meta property="og:image" content="https://kengz.gitbook.io/blog/~gitbook/ogimage/-M5KBfHajq_-kWwmk-K4"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Keng's Blog | Keng's Blog"/><meta name="twitter:image" content="https://kengz.gitbook.io/blog/~gitbook/ogimage/-M5KBfHajq_-kWwmk-K4"/><link rel="icon" href="https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=48&height=48&sign=c53efa1d&sv=2" type="image/png" media="(prefers-color-scheme: light)"/><link rel="icon" href="https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=48&height=48&sign=c53efa1d&sv=2" type="image/png" media="(prefers-color-scheme: dark)"/><link rel="icon" href="https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=48&height=48&sign=c53efa1d&sv=2" type="image/png" media="(prefers-color-scheme: light)"/><link rel="icon" href="https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=48&height=48&sign=c53efa1d&sv=2" type="image/png" media="(prefers-color-scheme: dark)"/><meta name="next-size-adjust"/><style> :root { --primary-1: 251 255 255; --contrast-primary-1: 29 29 29; --primary-2: 242 251 255; --contrast-primary-2: 29 29 29; --primary-3: 236 248 255; --contrast-primary-3: 29 29 29; --primary-4: 227 244 255; --contrast-primary-4: 29 29 29; --primary-5: 218 239 255; --contrast-primary-5: 29 29 29; --primary-6: 207 231 255; --contrast-primary-6: 29 29 29; --primary-7: 190 219 255; --contrast-primary-7: 29 29 29; --primary-8: 174 206 255; --contrast-primary-8: 29 29 29; --primary-9: 56 132 255; --contrast-primary-9: 255 255 255; --primary-10: 38 114 236; --contrast-primary-10: 255 255 255; --primary-11: 23 102 222; --contrast-primary-11: 255 255 255; --primary-12: 0 0 119; --contrast-primary-12: 255 255 255; --primary-original: 56 132 255; --contrast-primary-original: 255 255 255; --tint-1: 254 255 255; --contrast-tint-1: 29 29 29; --tint-2: 248 250 253; --contrast-tint-2: 29 29 29; --tint-3: 245 248 252; --contrast-tint-3: 29 29 29; --tint-4: 239 242 248; --contrast-tint-4: 29 29 29; --tint-5: 233 237 244; --contrast-tint-5: 29 29 29; --tint-6: 225 230 238; --contrast-tint-6: 29 29 29; --tint-7: 212 217 226; --contrast-tint-7: 29 29 29; --tint-8: 199 205 215; --contrast-tint-8: 29 29 29; --tint-9: 119 134 157; --contrast-tint-9: 255 255 255; --tint-10: 108 122 145; --contrast-tint-10: 255 255 255; --tint-11: 97 111 134; --contrast-tint-11: 255 255 255; --tint-12: 18 29 48; --contrast-tint-12: 255 255 255; --tint-original: 120 120 120; --contrast-tint-original: 255 255 255; --neutral-1: 255 255 255; --contrast-neutral-1: 29 29 29; --neutral-2: 250 250 250; --contrast-neutral-2: 29 29 29; --neutral-3: 247 247 247; --contrast-neutral-3: 29 29 29; --neutral-4: 242 242 242; --contrast-neutral-4: 29 29 29; --neutral-5: 237 237 237; --contrast-neutral-5: 29 29 29; --neutral-6: 229 229 229; --contrast-neutral-6: 29 29 29; --neutral-7: 217 217 217; --contrast-neutral-7: 29 29 29; --neutral-8: 204 204 204; --contrast-neutral-8: 29 29 29; --neutral-9: 120 120 120; --contrast-neutral-9: 255 255 255; --neutral-10: 121 121 121; --contrast-neutral-10: 255 255 255; --neutral-11: 110 110 110; --contrast-neutral-11: 255 255 255; --neutral-12: 29 29 29; --contrast-neutral-12: 255 255 255; --neutral-original: 120 120 120; --contrast-neutral-original: 255 255 255; --header-background: 56 132 255; --header-link: 255 255 255; --info-1: 255 255 255; --contrast-info-1: 29 29 29; --info-2: 250 250 250; --contrast-info-2: 29 29 29; --info-3: 247 247 247; --contrast-info-3: 29 29 29; --info-4: 242 242 242; --contrast-info-4: 29 29 29; --info-5: 237 237 237; --contrast-info-5: 29 29 29; --info-6: 229 229 229; --contrast-info-6: 29 29 29; --info-7: 217 217 217; --contrast-info-7: 29 29 29; --info-8: 204 204 204; --contrast-info-8: 29 29 29; --info-9: 120 120 120; --contrast-info-9: 255 255 255; --info-10: 121 121 121; --contrast-info-10: 255 255 255; --info-11: 110 110 110; --contrast-info-11: 255 255 255; --info-12: 29 29 29; --contrast-info-12: 255 255 255; --info-original: 120 120 120; --contrast-info-original: 255 255 255; --warning-1: 255 254 249; --contrast-warning-1: 29 29 29; --warning-2: 255 248 238; --contrast-warning-2: 29 29 29; --warning-3: 255 244 230; --contrast-warning-3: 29 29 29; --warning-4: 255 238 219; --contrast-warning-4: 29 29 29; --warning-5: 255 232 208; --contrast-warning-5: 29 29 29; --warning-6: 255 223 194; --contrast-warning-6: 29 29 29; --warning-7: 246 210 176; --contrast-warning-7: 29 29 29; --warning-8: 237 196 157; --contrast-warning-8: 29 29 29; --warning-9: 254 154 0; --contrast-warning-9: 29 29 29; --warning-10: 187 92 0; --contrast-warning-10: 255 255 255; --warning-11: 174 81 0; --contrast-warning-11: 255 255 255; --warning-12: 75 0 0; --contrast-warning-12: 255 255 255; --warning-original: 254 154 0; --contrast-warning-original: 29 29 29; --danger-1: 255 252 251; --contrast-danger-1: 29 29 29; --danger-2: 255 244 242; --contrast-danger-2: 29 29 29; --danger-3: 255 239 235; --contrast-danger-3: 29 29 29; --danger-4: 255 231 226; --contrast-danger-4: 29 29 29; --danger-5: 255 223 217; --contrast-danger-5: 29 29 29; --danger-6: 255 212 205; --contrast-danger-6: 29 29 29; --danger-7: 255 196 189; --contrast-danger-7: 29 29 29; --danger-8: 255 181 173; --contrast-danger-8: 29 29 29; --danger-9: 251 44 54; --contrast-danger-9: 255 255 255; --danger-10: 228 0 33; --contrast-danger-10: 255 255 255; --danger-11: 214 0 17; --contrast-danger-11: 255 255 255; --danger-12: 101 0 0; --contrast-danger-12: 255 255 255; --danger-original: 251 44 54; --contrast-danger-original: 255 255 255; --success-1: 251 255 251; --contrast-success-1: 29 29 29; --success-2: 241 254 242; --contrast-success-2: 29 29 29; --success-3: 234 254 236; --contrast-success-3: 29 29 29; --success-4: 224 251 227; --contrast-success-4: 29 29 29; --success-5: 214 248 218; --contrast-success-5: 29 29 29; --success-6: 202 242 206; --contrast-success-6: 29 29 29; --success-7: 185 231 190; --contrast-success-7: 29 29 29; --success-8: 167 220 173; --contrast-success-8: 29 29 29; --success-9: 0 201 80; --contrast-success-9: 29 29 29; --success-10: 0 152 23; --contrast-success-10: 255 255 255; --success-11: 0 140 0; --contrast-success-11: 255 255 255; --success-12: 0 47 0; --contrast-success-12: 255 255 255; --success-original: 0 201 80; --contrast-success-original: 29 29 29; } .dark { --primary-1: 26 29 34; --contrast-primary-1: 255 255 255; --primary-2: 29 35 44; --contrast-primary-2: 255 255 255; --primary-3: 35 44 59; --contrast-primary-3: 255 255 255; --primary-4: 36 48 68; --contrast-primary-4: 255 255 255; --primary-5: 38 54 79; --contrast-primary-5: 255 255 255; --primary-6: 39 58 88; --contrast-primary-6: 255 255 255; --primary-7: 45 68 104; --contrast-primary-7: 255 255 255; --primary-8: 51 78 121; --contrast-primary-8: 255 255 255; --primary-9: 56 132 255; --contrast-primary-9: 255 255 255; --primary-10: 63 139 255; --contrast-primary-10: 255 255 255; --primary-11: 111 189 255; --contrast-primary-11: 29 29 29; --primary-12: 172 255 255; --contrast-primary-12: 29 29 29; --primary-original: 56 132 255; --contrast-primary-original: 255 255 255; --tint-1: 29 29 29; --contrast-tint-1: 255 255 255; --tint-2: 34 35 35; --contrast-tint-2: 255 255 255; --tint-3: 43 44 45; --contrast-tint-3: 255 255 255; --tint-4: 46 48 50; --contrast-tint-4: 255 255 255; --tint-5: 52 54 56; --contrast-tint-5: 255 255 255; --tint-6: 56 58 61; --contrast-tint-6: 255 255 255; --tint-7: 65 68 71; --contrast-tint-7: 255 255 255; --tint-8: 75 78 82; --contrast-tint-8: 255 255 255; --tint-9: 126 133 145; --contrast-tint-9: 255 255 255; --tint-10: 137 145 157; --contrast-tint-10: 255 255 255; --tint-11: 185 193 205; --contrast-tint-11: 29 29 29; --tint-12: 247 255 255; --contrast-tint-12: 29 29 29; --tint-original: 120 120 120; --contrast-tint-original: 255 255 255; --neutral-1: 29 29 29; --contrast-neutral-1: 255 255 255; --neutral-2: 34 34 34; --contrast-neutral-2: 255 255 255; --neutral-3: 44 44 44; --contrast-neutral-3: 255 255 255; --neutral-4: 48 48 48; --contrast-neutral-4: 255 255 255; --neutral-5: 53 53 53; --contrast-neutral-5: 255 255 255; --neutral-6: 57 57 57; --contrast-neutral-6: 255 255 255; --neutral-7: 67 67 67; --contrast-neutral-7: 255 255 255; --neutral-8: 78 78 78; --contrast-neutral-8: 255 255 255; --neutral-9: 120 120 120; --contrast-neutral-9: 255 255 255; --neutral-10: 144 144 144; --contrast-neutral-10: 255 255 255; --neutral-11: 192 192 192; --contrast-neutral-11: 29 29 29; --neutral-12: 255 255 255; --contrast-neutral-12: 29 29 29; --neutral-original: 120 120 120; --contrast-neutral-original: 255 255 255; --header-background: 56 132 255; --header-link: 255 255 255; --info-1: 29 29 29; --contrast-info-1: 255 255 255; --info-2: 34 34 34; --contrast-info-2: 255 255 255; --info-3: 44 44 44; --contrast-info-3: 255 255 255; --info-4: 48 48 48; --contrast-info-4: 255 255 255; --info-5: 53 53 53; --contrast-info-5: 255 255 255; --info-6: 57 57 57; --contrast-info-6: 255 255 255; --info-7: 67 67 67; --contrast-info-7: 255 255 255; --info-8: 78 78 78; --contrast-info-8: 255 255 255; --info-9: 120 120 120; --contrast-info-9: 255 255 255; --info-10: 144 144 144; --contrast-info-10: 255 255 255; --info-11: 192 192 192; --contrast-info-11: 29 29 29; --info-12: 255 255 255; --contrast-info-12: 29 29 29; --info-original: 120 120 120; --contrast-info-original: 255 255 255; --warning-1: 32 28 25; --contrast-warning-1: 255 255 255; --warning-2: 40 33 26; --contrast-warning-2: 255 255 255; --warning-3: 53 41 30; --contrast-warning-3: 255 255 255; --warning-4: 60 44 29; --contrast-warning-4: 255 255 255; --warning-5: 69 49 29; --contrast-warning-5: 255 255 255; --warning-6: 76 52 27; --contrast-warning-6: 255 255 255; --warning-7: 90 61 30; --contrast-warning-7: 255 255 255; --warning-8: 104 70 34; --contrast-warning-8: 255 255 255; --warning-9: 254 154 0; --contrast-warning-9: 29 29 29; --warning-10: 213 116 0; --contrast-warning-10: 255 255 255; --warning-11: 255 165 34; --contrast-warning-11: 29 29 29; --warning-12: 255 229 115; --contrast-warning-12: 29 29 29; --warning-original: 254 154 0; --contrast-warning-original: 29 29 29; --danger-1: 34 27 26; --contrast-danger-1: 255 255 255; --danger-2: 45 30 29; --contrast-danger-2: 255 255 255; --danger-3: 60 37 35; --contrast-danger-3: 255 255 255; --danger-4: 69 38 35; --contrast-danger-4: 255 255 255; --danger-5: 80 41 38; --contrast-danger-5: 255 255 255; --danger-6: 89 41 38; --contrast-danger-6: 255 255 255; --danger-7: 105 48 44; --contrast-danger-7: 255 255 255; --danger-8: 121 54 50; --contrast-danger-8: 255 255 255; --danger-9: 251 44 54; --contrast-danger-9: 255 255 255; --danger-10: 255 52 59; --contrast-danger-10: 255 255 255; --danger-11: 255 113 108; --contrast-danger-11: 255 255 255; --danger-12: 255 180 169; --contrast-danger-12: 29 29 29; --danger-original: 251 44 54; --contrast-danger-original: 255 255 255; --success-1: 26 31 26; --contrast-success-1: 255 255 255; --success-2: 28 37 29; --contrast-success-2: 255 255 255; --success-3: 33 48 35; --contrast-success-3: 255 255 255; --success-4: 33 54 35; --contrast-success-4: 255 255 255; --success-5: 34 61 38; --contrast-success-5: 255 255 255; --success-6: 32 66 38; --contrast-success-6: 255 255 255; --success-7: 37 78 44; --contrast-success-7: 255 255 255; --success-8: 41 90 50; --contrast-success-8: 255 255 255; --success-9: 0 201 80; --contrast-success-9: 29 29 29; --success-10: 0 176 54; --contrast-success-10: 255 255 255; --success-11: 62 227 106; --contrast-success-11: 29 29 29; --success-12: 139 255 168; --contrast-success-12: 29 29 29; --success-original: 0 201 80; --contrast-success-original: 29 29 29; } </style><script src="https://static.gitbook.com/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body class="bg-tint-base theme-muted:bg-tint-subtle theme-bold-tint:bg-tint-subtle theme-gradient:bg-gradient-primary theme-gradient-tint:bg-gradient-tint"><script>!function(){var d=document.documentElement,c=d.classList;c.remove('light','dark');d.style.colorScheme = 'light';c.add('light')}()</script><header id="site-header" class="flex flex-col h-[64px] sticky top-0 z-30 w-full flex-none shadow-[0px_1px_0px] shadow-tint-12/2 bg-tint-base/9 theme-muted:bg-tint-subtle/9 theme-bold-tint:bg-tint-subtle/9 theme-gradient:bg-gradient-primary theme-gradient-tint:bg-gradient-tint contrast-more:bg-tint-base text-sm backdrop-blur-lg"><div class="theme-bold:bg-header-background theme-bold:shadow-[0px_1px_0px] theme-bold:shadow-tint-12/2"><div class="scroll-nojump"><div class="gap-4 lg:gap-6 flex items-center justify-between w-full py-3 min-h-16 sm:h-16 px-4 sm:px-6 md:px-8 max-w-screen-2xl mx-auto page-full-width:max-w-full"><div class="flex max-w-full lg:basis-72 min-w-0 shrink items-center justify-start gap-2 lg:gap-4"><button class="flex flex-row items-center rounded straight-corners:rounded-sm px-2 py-1 lg:hidden -ml-2 text-tint-strong theme-bold:text-header-link hover:bg-tint-hover theme-bold:hover:bg-header-link/3 page-no-toc:hidden" aria-label="Open table of contents"><svg style="mask-image:url(https://ka-p.fontawesome.com/releases/v6.6.0/svgs/regular/bars.svg?v=2&token=a463935e93);mask-repeat:no-repeat;mask-position:center" class="gb-icon size-4 text-inherit"></svg></button><a class="group/headerlogo min-w-0 shrink flex items-center" href="https://kengz.gitbook.io/blog/"><img alt="" style="aspect-ratio:1" fetchPriority="high" class="block dark:hidden object-contain size-8" src="https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=4&quality=100&sign=c53efa1d&sv=2" srcSet="https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=1&quality=100&sign=c53efa1d&sv=2 32w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=2&quality=100&sign=c53efa1d&sv=2 64w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=3&quality=100&sign=c53efa1d&sv=2 96w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=4&quality=100&sign=c53efa1d&sv=2 128w" sizes="32px" width="256" height="256"/><img alt="" style="aspect-ratio:1" loading="lazy" fetchPriority="high" class="hidden dark:block object-contain size-8" src="https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=4&quality=100&sign=c53efa1d&sv=2" srcSet="https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=1&quality=100&sign=c53efa1d&sv=2 32w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=2&quality=100&sign=c53efa1d&sv=2 64w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=3&quality=100&sign=c53efa1d&sv=2 96w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia&width=32&dpr=4&quality=100&sign=c53efa1d&sv=2 128w" sizes="32px" width="256" height="256"/><div class="text-pretty line-clamp-2 tracking-tight max-w-[18ch] lg:max-w-[24ch] font-semibold ms-3 text-base/tight lg:text-lg/tight text-tint-strong theme-bold:text-header-link">Keng's Blog</div></a></div><div class="flex grow-0 shrink-0 md:basis-56 justify-self-end order-last"><!--$--><button type="button" aria-label="Search" class="flex flex-1 flex-row justify-center items-center w-full py-2 px-3 gap-2 bg-tint-base ring-1 ring-tint-12/2 shadow-sm shadow-tint-12/3 dark:shadow-none text-tint rounded-lg straight-corners:rounded-sm contrast-more:ring-tint-12 contrast-more:text-tint-strong transition-all hover:bg-tint-subtle hover:shadow-md hover:scale-102 hover:ring-tint-hover hover:text-tint-strong focus:shadow-md focus:scale-102 focus:ring-tint-hover focus:text-tint-strong contrast-more:hover:ring-2 contrast-more:hover:ring-tint-12 contrast-more:focus:ring-2 contrast-more:focus:ring-tint-12 active:shadow-sm active:scale-100 md:justify-start md:w-full text-sm theme-bold:bg-header-link/2 theme-bold:hover:bg-header-link/3 theme-bold:text-header-link/8 theme-bold:hover:text-header-link theme-bold:ring-header-link/4 theme-bold:hover:ring-header-link/5 theme-bold:[&_svg]:text-header-link/10 theme-bold:[&_.shortcut]:text-header-link/8 theme-bold:contrast-more:bg-header-background theme-bold:contrast-more:text-header-link theme-bold:contrast-more:ring-header-link theme-bold:contrast-more:hover:bg-header-background theme-bold:contrast-more:hover:ring-header-link theme-bold:contrast-more:focus:text-header-link theme-bold:contrast-more:focus:bg-header-background theme-bold:contrast-more:focus:ring-header-link theme-bold:shadow-none theme-bold:hover:shadow-none whitespace-nowrap"><svg style="mask-image:url(https://ka-p.fontawesome.com/releases/v6.6.0/svgs/regular/magnifying-glass.svg?v=2&token=a463935e93);mask-repeat:no-repeat;mask-position:center" class="gb-icon text-tint-subtle shrink-0 size-4"></svg><div class="w-full hidden md:block text-left"><span class="flex-1">Search<!-- -->...</span></div><div aria-busy="true" class="shortcut -mr-1 hidden justify-end gap-0.5 whitespace-nowrap text-tint text-xs [font-feature-settings:"calt",_"case"] contrast-more:text-tint-strong md:flex opacity-0"><kbd class="flex h-5 min-w-5 items-center justify-center rounded border border-tint-subtle theme-bold:border-header-link/5 bg-tint-base theme-bold:bg-header-background px-1 ">Ctrl</kbd><kbd class="flex size-5 items-center justify-center rounded border border-tint-subtle theme-bold:border-header-link/5 bg-tint-base theme-bold:bg-header-background">K</kbd></div></button><!--/$--></div></div></div></div></header><div class="scroll-nojump"><div class="flex flex-col lg:flex-row px-4 sm:px-6 md:px-8 max-w-screen-2xl mx-auto page-full-width:max-w-full"><aside data-testid="table-of-contents" class="group text-sm grow-0 shrink-0 basis-full lg:basis-72 page-no-toc:lg:basis-56 relative z-[1] lg:sticky lg:top-0 lg:h-screen site-header:lg:top-16 site-header:lg:h-[calc(100vh_-_4rem)] site-header-sections:lg:top-[6.75rem] site-header-sections:lg:h-[calc(100vh_-_6.75rem)] pt-6 pb-4 sidebar-filled:lg:pr-6 page-no-toc:lg:pr-0 hidden navigation-open:!flex lg:flex page-no-toc:lg:hidden page-no-toc:xl:flex site-header-none:page-no-toc:lg:flex flex-col gap-4 navigation-open:border-b border-tint-subtle"><div class="lg:-ms-5 overflow-hidden relative flex flex-col flex-grow sidebar-filled:bg-tint-subtle theme-muted:bg-tint-subtle theme-bold-tint:bg-tint-subtle [html.sidebar-filled.theme-muted_&]:bg-tint-base [html.sidebar-filled.theme-bold.tint_&]:bg-tint-base page-no-toc:!bg-transparent sidebar-filled:rounded-xl straight-corners:rounded-none"><div class="px-5 *:my-4"></div><div data-testid="toc-scroll-container" class="flex flex-grow flex-col p-2 lg:pb-20 overflow-y-auto lg:gutter-stable [&::-webkit-scrollbar]:bg-transparent [&::-webkit-scrollbar-thumb]:bg-transparent group-hover:[&::-webkit-scrollbar]:bg-tint-subtle group-hover:[&::-webkit-scrollbar-thumb]:bg-tint-7 group-hover:[&::-webkit-scrollbar-thumb:hover]:bg-tint-8"><ul class="flex flex-col gap-y-0.5 page-no-toc:hidden sidebar-list-line:border-l border-tint-subtle"><li class="flex flex-col"><a aria-current="page" class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance text-sm hover:contrast-more:ring-1 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px font-semibold sidebar-list-line:before:w-0.5 before:bg-primary-solid text-primary-subtle sidebar-list-pill:bg-primary [html.sidebar-list-pill.theme-muted_&]:bg-primary-hover [html.sidebar-list-pill.theme-bold.tint_&]:bg-primary-hover [html.sidebar-filled.sidebar-list-pill.theme-muted_&]:bg-primary [html.sidebar-filled.sidebar-list-pill.theme-bold.tint_&]:bg-primary hover:bg-primary-hover hover:text-primary hover:before:bg-primary-solid-hover sidebar-list-pill:hover:bg-primary-hover contrast-more:text-primary contrast-more:hover:text-primary-strong contrast-more:bg-primary contrast-more:ring-1 contrast-more:ring-primary contrast-more:hover:ring-primary-hover" href="/blog">Keng's Blog</a></li><li class="flex flex-col group/page-group-item"><div class="flex items-center gap-3 px-3 z-[1] sticky -top-5 pt-6 group-first/page-group-item:-mt-5 pb-3 -mb-1.5 text-xs tracking-wide font-semibold uppercase [mask-image:linear-gradient(rgba(0,0,0,1)_70%,rgba(0,0,0,0))] bg-tint-base sidebar-filled:bg-tint-subtle theme-muted:bg-tint-subtle theme-bold-tint:bg-tint-subtle [html.sidebar-filled.theme-muted_&]:bg-tint-base [html.sidebar-filled.theme-bold.tint_&]:bg-tint-base [html.sidebar-default.theme-gradient_&]:bg-gradient-primary [html.sidebar-default.theme-gradient.tint_&]:bg-gradient-tint">ML</div><ul class="flex flex-col gap-y-0.5"><li class="flex flex-col"><a class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance font-normal text-sm text-tint-strong/7 hover:bg-tint-hover hover:text-tint-strong contrast-more:text-tint-strong hover:contrast-more:text-tint-strong hover:contrast-more:ring-1 hover:contrast-more:ring-tint-12 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-line:before:w-px sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px" href="/blog/ml/running-wandb-on-kubernetes">Running WandB on Kubernetes</a></li><li class="flex flex-col"><a class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance font-normal text-sm text-tint-strong/7 hover:bg-tint-hover hover:text-tint-strong contrast-more:text-tint-strong hover:contrast-more:text-tint-strong hover:contrast-more:ring-1 hover:contrast-more:ring-tint-12 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-line:before:w-px sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px" href="/blog/ml/torcharc">TorchArc</a></li><li class="flex flex-col"><a class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance font-normal text-sm text-tint-strong/7 hover:bg-tint-hover hover:text-tint-strong contrast-more:text-tint-strong hover:contrast-more:text-tint-strong hover:contrast-more:ring-1 hover:contrast-more:ring-tint-12 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-line:before:w-px sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px" href="/blog/ml/distributed-training-with-torchelastic-on-kubernetes">Distributed Training with TorchElastic on Kubernetes</a></li><li class="flex flex-col"><a class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance font-normal text-sm text-tint-strong/7 hover:bg-tint-hover hover:text-tint-strong contrast-more:text-tint-strong hover:contrast-more:text-tint-strong hover:contrast-more:ring-1 hover:contrast-more:ring-tint-12 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-line:before:w-px sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px" href="/blog/ml/feature-transform">Feature Transform</a></li></ul></li><li class="flex flex-col group/page-group-item"><div class="flex items-center gap-3 px-3 z-[1] sticky -top-5 pt-6 group-first/page-group-item:-mt-5 pb-3 -mb-1.5 text-xs tracking-wide font-semibold uppercase [mask-image:linear-gradient(rgba(0,0,0,1)_70%,rgba(0,0,0,0))] bg-tint-base sidebar-filled:bg-tint-subtle theme-muted:bg-tint-subtle theme-bold-tint:bg-tint-subtle [html.sidebar-filled.theme-muted_&]:bg-tint-base [html.sidebar-filled.theme-bold.tint_&]:bg-tint-base [html.sidebar-default.theme-gradient_&]:bg-gradient-primary [html.sidebar-default.theme-gradient.tint_&]:bg-gradient-tint">Engineering</div><ul class="flex flex-col gap-y-0.5"><li class="flex flex-col"><a class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance font-normal text-sm text-tint-strong/7 hover:bg-tint-hover hover:text-tint-strong contrast-more:text-tint-strong hover:contrast-more:text-tint-strong hover:contrast-more:ring-1 hover:contrast-more:ring-tint-12 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-line:before:w-px sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px" href="/blog/engineering/github-actions-for-python-project">Github Actions for Python Project</a></li><li class="flex flex-col"><a class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance font-normal text-sm text-tint-strong/7 hover:bg-tint-hover hover:text-tint-strong contrast-more:text-tint-strong hover:contrast-more:text-tint-strong hover:contrast-more:ring-1 hover:contrast-more:ring-tint-12 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-line:before:w-px sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px" href="/blog/engineering/ubuntu-gpu-server-setup">Ubuntu GPU Server Setup</a></li><li class="flex flex-col"><a class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance font-normal text-sm text-tint-strong/7 hover:bg-tint-hover hover:text-tint-strong contrast-more:text-tint-strong hover:contrast-more:text-tint-strong hover:contrast-more:ring-1 hover:contrast-more:ring-tint-12 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-line:before:w-px sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px" href="/blog/engineering/setting-up-a-private-kubernetes-cluster">Setting up a private Kubernetes cluster</a></li><li class="flex flex-col"><a class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance font-normal text-sm text-tint-strong/7 hover:bg-tint-hover hover:text-tint-strong contrast-more:text-tint-strong hover:contrast-more:text-tint-strong hover:contrast-more:ring-1 hover:contrast-more:ring-tint-12 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-line:before:w-px sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px" href="/blog/engineering/setting-up-a-private-ml-kubernetes-cluster-with-k0s">Setting up a private GPU Kubernetes cluster with K0s</a></li></ul></li><li class="flex flex-col"><a class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance font-normal text-sm text-tint-strong/7 hover:bg-tint-hover hover:text-tint-strong contrast-more:text-tint-strong hover:contrast-more:text-tint-strong hover:contrast-more:ring-1 hover:contrast-more:ring-tint-12 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-line:before:w-px sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px" href="/blog/setting-up-a-private-kubernetes-cluster-with-k0sctl">Setting up a private Kubernetes cluster with k0sctl</a></li><li class="flex flex-col"><a class="group/toclink relative transition-colors flex flex-row justify-between rounded-md straight-corners:rounded-none p-1.5 pl-3 text-balance font-normal text-sm text-tint-strong/7 hover:bg-tint-hover hover:text-tint-strong contrast-more:text-tint-strong hover:contrast-more:text-tint-strong hover:contrast-more:ring-1 hover:contrast-more:ring-tint-12 before:contents[] before:-left-px before:absolute before:inset-y-0 sidebar-list-line:rounded-l-none sidebar-list-line:before:w-px sidebar-list-default:[&+div_a]:rounded-l-none [&+div_a]:pl-5 sidebar-list-default:[&+div_a]:before:w-px" href="/blog/setting-up-kubernetes-addons">Setting up Kubernetes Addons</a></li></ul><div class="relative z-[2] lg:absolute left-0 right-2 bottom-0 pointer-events-none sidebar-filled:pl-2 sidebar-filled:pb-2 sidebar-filled:page-no-toc:p-0 bg-tint-base sidebar-filled:bg-tint-subtle theme-muted:bg-tint-subtle [html.sidebar-filled.theme-muted_&]:bg-tint-base [html.sidebar-filled.theme-bold.tint_&]:bg-tint-base before:hidden lg:before:block before:content-[""] before:absolute before:inset-x-0 before:bottom-full before:h-8 before:bg-gradient-to-b before:from-transparent before:to-tint-base sidebar-filled:before:to-tint-subtle theme-muted:before:to-tint-subtle theme-bold-tint:before:to-tint-subtle [html.sidebar-filled.theme-muted_&]:before:to-tint-base [html.sidebar-filled.theme-bold.tint_&]:before:to-tint-base page-no-toc:before:!to-transparent"><a target="_blank" class="text-sm font-semibold text-tint flex flex-row items-center px-5 py-4 sidebar-filled:px-3 sidebar-filled:page-no-toc:lg:px-5 rounded-lg straight-corners:rounded-none hover:bg-tint hover:text-tint-strong ring-2 lg:ring-1 ring-inset ring-tint-subtle transition-colors pointer-events-auto" href="https://www.gitbook.com/?utm_source=content&utm_medium=trademark&utm_campaign=-M5KBcEvOMRAQtKb5jHb"><svg style="mask-image:url(https://static.gitbook.com/~gitbook/static/icons/svgs/custom-icons/gitbook.svg?v=2);mask-repeat:no-repeat;mask-position:center" class="gb-icon size-5 shrink-0"></svg><span class="ml-3">Powered by GitBook</span></a></div></div></div></aside><div class="flex min-w-0 flex-1 flex-col"><!--$?--><template id="B:0"></template><div class="flex flex-row flex-1 relative py-8 lg:px-16 xl:mr-56 items-center lg:items-start"><div class="flex-1 max-w-3xl mx-auto page-full-width:mx-0"><div role="status" aria-busy="true" class="mb-8"><div class="ring-1 ring-tint-subtle overflow-hidden relative grid rounded-md h-[47px] [max-width:calc(48rem-1px)]"><div class="w-full bg-tint grid grid-area-1-1 overflow-hidden [mask:conic-gradient(from_90deg_at_1px_1px,_#0000_90deg,_#0003_0)_calc(50%+1px)_calc(0%+47px)_/_12px_12px]"><div class="aspect-square from-tint-solid to-transparent grid-area-1-1 relative origin-[50%_50%] top-[50%] self-stretch bg-transparent will-change-transform animate-[rotateLoop_2s_linear_infinite] [background-image:conic-gradient(from_-90deg_at_50%_50%,_var(--tw-gradient-stops)_0deg,_var(--tw-gradient-stops)_90deg,_var(--tw-gradient-stops)_280deg)]"></div></div></div></div><div role="status" aria-busy="true" class="skeleton-paragraph"><div class="ring-1 ring-tint-subtle overflow-hidden relative grid rounded-md [height:calc(15rem-1px)] [max-width:calc(48rem-1px)] mb-4"><div class="w-full bg-tint grid grid-area-1-1 overflow-hidden [mask:conic-gradient(from_90deg_at_1px_1px,_#0000_90deg,_#0003_0)_calc(50%+1px)_calc(0%+47px)_/_48px_48px]"><div class="aspect-square from-tint-solid to-transparent grid-area-1-1 relative origin-[50%_50%] top-[50%] self-stretch bg-transparent will-change-transform animate-[rotateLoop_2s_linear_infinite] [background-image:conic-gradient(from_-90deg_at_50%_50%,_var(--tw-gradient-stops)_0deg,_var(--tw-gradient-stops)_90deg,_var(--tw-gradient-stops)_280deg)]"></div></div></div></div></div></div><!--/$--></div></div></div><!--$--><!--/$--><!--$--><!--/$--><script data-cfasync="false"> document.addEventListener("DOMContentLoaded", () => { if (Array.from(document.scripts).find(script => script.src.includes('rocket-loader.min.js'))) { const alert = document.createElement('div'); alert.className = 'p-4 mb-4 text-sm text-red-800 rounded-lg bg-red-50 mt-8 mx-8'; alert.innerHTML = ` <strong>Error in site configuration:</strong> It looks like ${window.location.hostname} has been incorrectly configured in Cloudflare. This may lead to unexpected behavior or issues with the page loading. If you are the owner of this site, please refer to <a href="https://docs.gitbook.com/published-documentation/custom-domain/configure-dns#are-you-using-cloudflare" class="underline">GitBook's documentation</a> for steps to fix the problem. `; document.body.prepend(alert); } });</script><script src="https://static.gitbook.com/_next/static/chunks/webpack-8254c9b1ba3233fb.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:HC[\"https://static.gitbook.com\",\"\"]\n2:HL[\"https://static.gitbook.com/_next/static/css/51d34edee75a6bda.css\",\"style\"]\n3:HL[\"https://static.gitbook.com/_next/static/css/45626ddd3633854a.css\",\"style\"]\n4:HL[\"https://static.gitbook.com/_next/static/css/4e754f385c6d5329.css\",\"style\"]\n5:HL[\"https://static.gitbook.com/_next/static/css/95b358fb5c9305a3.css\",\"style\"]\n6:HL[\"https://static.gitbook.com/_next/static/css/bc859a4cd35f3fe5.css\",\"style\"]\n7:HL[\"https://static.gitbook.com/_next/static/css/e1c64f6ae2213816.css\",\"style\"]\n8:HL[\"https://static.gitbook.com/_next/static/css/89f0191abc1ad313.css\",\"style\"]\n9:HL[\"https://static.gitbook.com/_next/static/css/442a0afb56948a32.css\",\"style\"]\na:HL[\"https://static.gitbook.com/_next/static/css/b322ae72ca7529fb.css\",\"style\"]\nb:HL[\"https://static.gitbook.com/_next/static/css/74683140939dd056.css\",\"style\"]\nc:HL[\"https://static.gitbook.com/_next/static/css/ee3396defbfa8d21.css\",\"style\"]\nd:HL[\"https://static.gitbook.com/_next/static/css/4af9aafd612346fe.css\",\"style\"]\ne:I[11815,[],\"default\"]\n11:I[55092,[],\"default\"]\n13:I[82023,[],\"default\"]\n18:I[44622,[\"6470\",\"static/chunks/app/global-error-53091e9566f77828.js\"],\"default\"]\n12:[\"pathname\",\"\",\"oc\"]\n19:[]\n0:[\"$\",\"$Le\",null,{\"buildId\":\"6scxKB58OhsRyJuLHZdrI\",\"assetPrefix\":\"https://static.gitbook.com\",\"urlParts\":[\"\",\"blog\"],\"initialTree\":[\"\",{\"children\":[\"middleware\",{\"children\":[\"(site)\",{\"children\":[\"(content)\",{\"children\":[[\"pathname\",\"\",\"oc\"],{\"children\":[\"__PAGE__\",{}]}]}]},\"$undefined\",\"$undefined\",true]}]}],\"initialSeedData\":[\"\",{\"children\":[\"middleware\",{\"children\":[\"(site)\",{\"children\":[\"(content)\",{\"children\":[[\"pathname\",\"\",\"oc\"],{\"children\":[\"__PAGE__\",{},[[\"$Lf\",\"$L10\",[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/e1c64f6ae2213816.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/89f0191abc1ad313.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/442a0afb56948a32.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/b322ae72ca7529fb.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"4\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/74683140939dd056.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"5\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/ee3396defbfa8d21.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"6\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/4af9aafd612346fe.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]]],null],null]},[null,[\"$\",\"$L11\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"middleware\",\"children\",\"(site)\",\"children\",\"(content)\",\"children\",\"$12\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L13\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$L14\",\"notFoundStyles\":[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/e1c64f6ae2213816.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/89f0191abc1ad313.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/442a0afb56948a32.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/b322ae72ca7529fb.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"4\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/74683140939dd056.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"5\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/ee3396defbfa8d21.css\",\"preceden"])</script><script>self.__next_f.push([1,"ce\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"6\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/4af9aafd612346fe.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]]}]],[[\"$\",\"div\",null,{\"className\":\"flex flex-row flex-1 relative py-8 lg:px-16 xl:mr-56 items-center lg:items-start\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex-1 max-w-3xl mx-auto page-full-width:mx-0\",\"children\":[[\"$\",\"div\",null,{\"id\":\"$undefined\",\"role\":\"status\",\"aria-busy\":true,\"className\":\"mb-8\",\"children\":[\"$\",\"div\",null,{\"className\":\"ring-1 ring-tint-subtle overflow-hidden relative grid rounded-md h-[47px] [max-width:calc(48rem-1px)]\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-full bg-tint grid grid-area-1-1 overflow-hidden [mask:conic-gradient(from_90deg_at_1px_1px,_#0000_90deg,_#0003_0)_calc(50%+1px)_calc(0%+47px)_/_12px_12px]\",\"children\":[\"$\",\"div\",null,{\"className\":\"aspect-square from-tint-solid to-transparent grid-area-1-1 relative origin-[50%_50%] top-[50%] self-stretch bg-transparent will-change-transform animate-[rotateLoop_2s_linear_infinite] [background-image:conic-gradient(from_-90deg_at_50%_50%,_var(--tw-gradient-stops)_0deg,_var(--tw-gradient-stops)_90deg,_var(--tw-gradient-stops)_280deg)]\"}]}]}]}],[\"$\",\"div\",null,{\"id\":\"$undefined\",\"role\":\"status\",\"aria-busy\":true,\"className\":\"skeleton-paragraph\",\"children\":[\"$\",\"div\",null,{\"className\":\"ring-1 ring-tint-subtle overflow-hidden relative grid rounded-md [height:calc(15rem-1px)] [max-width:calc(48rem-1px)] mb-4\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-full bg-tint grid grid-area-1-1 overflow-hidden [mask:conic-gradient(from_90deg_at_1px_1px,_#0000_90deg,_#0003_0)_calc(50%+1px)_calc(0%+47px)_/_48px_48px]\",\"children\":[\"$\",\"div\",null,{\"className\":\"aspect-square from-tint-solid to-transparent grid-area-1-1 relative origin-[50%_50%] top-[50%] self-stretch bg-transparent will-change-transform animate-[rotateLoop_2s_linear_infinite] [background-image:conic-gradient(from_-90deg_at_50%_50%,_var(--tw-gradient-stops)_0deg,_var(--tw-gradient-stops)_90deg,_var(--tw-gradient-stops)_280deg)]\"}]}]}]}]]}]}],[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/e1c64f6ae2213816.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/89f0191abc1ad313.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/442a0afb56948a32.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/b322ae72ca7529fb.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"4\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/74683140939dd056.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"5\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/ee3396defbfa8d21.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"6\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/4af9aafd612346fe.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],[]]]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/bc859a4cd35f3fe5.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],\"$L15\"],null],null]},[[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/51d34edee75a6bda.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"1\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/45626ddd3633854a.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"2\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/4e754f385c6d5329.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}],[\"$\",\"link\",\"3\",{\"rel\":\"stylesheet\",\"href\":\"https://static.gitbook.com/_next/static/css/95b358fb5c9305a3.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\"}]],\"$L16\"],null],null]},[null,[\"$\",\"$L11\",null,{\"parallelRou"])</script><script>self.__next_f.push([1,"terKey\":\"children\",\"segmentPath\":[\"children\",\"middleware\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L13\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[null,[\"$\",\"$L11\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L13\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}]],null],\"couldBeIntercepted\":false,\"initialHead\":[null,\"$L17\"],\"globalErrorComponent\":\"$18\",\"missingSlots\":\"$W19\"}]\n1a:I[80942,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"8581\",\"static/chunks/8581-232e62c561277f92.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"8843\",\"static/chunks/8843-00cba0b160454c4d.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"8678\",\"static/chunks/8678-15aefe1165bae785.js\",\"7093\",\"static/chunks/7093-8f66c7b92e65df99.js\",\"813\",\"static/chunks/app/middleware/(site)/(content)/%5B%5B...pathname%5D%5D/not-found-989d3dd52c55dcb1.js\"],\"SitePageNotFound\"]\n14:[\"$\",\"$L1a\",null,{}]\n1b:HC\"https://api.gitbook.com\"\n1c:HC\"https://ka-p.fontawesome.com/releases/v6.6.0/\"\n1d:HC\"https://static.gitbook.com\"\n1e:HL[\"https://integrations.gitbook.com/v1/integrations/googleanalytics/installations/f358ef7676b84cfde66faab6d1bd9057fe92c347966f2738381bb4aa08f7ca27/sites/site_ELOmj/script.js?version=150.0\",\"script\"]\n17:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"name\":\"color-scheme\",\"content\":\"light\"}],[\"$\",\"meta\",\"2\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"3\",{\"children\":\"Keng's Blog | Keng's Blog\"}],[\"$\",\"meta\",\"4\",{\"name\":\"generator\",\"content\":\"GitBook (73e2b47)\"}],[\"$\",\"meta\",\"5\",{\"name\":\"robots\",\"content\":\"index, follow\"}],[\"$\",\"link\",\"6\",{\"rel\":\"canonical\",\"href\":\"https://kengz.gitbook.io/blog\"}],[\"$\",\"meta\",\"7\",{\"property\":\"og:title\",\"content\":\"Keng's Blog | Keng's Blog\"}],[\"$\",\"meta\",\"8\",{\"property\":\"og:image\",\"content\":\"https://kengz.gitbook.io/blog/~gitbook/ogimage/-M5KBfHajq_-kWwmk-K4\"}],[\"$\",\"meta\",\"9\",{\"name\":\"twitter:card\",\"content\":\"summary_large_image\"}],[\"$\",\"meta\",\"10\",{\"name\":\"twitter:title\",\"content\":\"Keng's Blog | Keng's Blog\"}],[\"$\",\"meta\",\"11\",{\"name\":\"twitter:image\",\"content\":\"https://kengz.gitbook.io/blog/~gitbook/ogimage/-M5KBfHajq_-kWwmk-K4\"}],[\"$\",\"link\",\"12\",{\"rel\":\"icon\",\"href\":\"https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=48\u0026height=48\u0026sign=c53efa1d\u0026sv=2\",\"type\":\"image/png\",\"media\":\"(prefers-color-scheme: light)\"}],[\"$\",\"link\",\"13\",{\"rel\":\"icon\",\"href\":\"https://kengz.gitbook.io/~gitbook/image?url=https"])</script><script>self.__next_f.push([1,"%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=48\u0026height=48\u0026sign=c53efa1d\u0026sv=2\",\"type\":\"image/png\",\"media\":\"(prefers-color-scheme: dark)\"}],[\"$\",\"link\",\"14\",{\"rel\":\"icon\",\"href\":\"https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=48\u0026height=48\u0026sign=c53efa1d\u0026sv=2\",\"type\":\"image/png\",\"media\":\"(prefers-color-scheme: light)\"}],[\"$\",\"link\",\"15\",{\"rel\":\"icon\",\"href\":\"https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=48\u0026height=48\u0026sign=c53efa1d\u0026sv=2\",\"type\":\"image/png\",\"media\":\"(prefers-color-scheme: dark)\"}],[\"$\",\"meta\",\"16\",{\"name\":\"next-size-adjust\"}]]\nf:null\n20:I[5145,[\"4183\",\"static/chunks/app/middleware/(site)/layout-67575f2b686fd5fa.js\"],\"IconsProvider\"]\n21:I[75489,[\"4183\",\"static/chunks/app/middleware/(site)/layout-67575f2b686fd5fa.js\"],\"ClientContexts\"]\n22:I[61946,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"8626\",\"static/chunks/app/middleware/(site)/error-0c18ba8fba3d14c8.js\"],\"default\"]\n23:I[35592,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"NuqsAdapter\"]\n24:I[3119,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"ClientContexts\"]\n25:I[68339,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"SpaceLayoutContextProvider\"]\n26:I[31200,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"InsightsProvider\"]\n27:I[72020,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"HeaderMobileMenu\"]\n29:\"$Sreact.suspense\"\n2a:I[86604,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"SearchButton\"]\n2b:I[19656,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241"])</script><script>self.__next_f.push([1,"\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"TOCScrollContainer\"]\n37:I[22833,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"Link\"]\n38:I[22563,[\"4183\",\"static/chunks/app/middleware/(site)/layout-67575f2b686fd5fa.js\"],\"Icon\"]\n39:I[77964,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"SearchModal\"]\n3a:I[49780,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"LoadIntegrations\"]\n3b:I[35489,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"CookiesToast\"]\n1f:T2bc9,\n :root {\n --primary-1: 251 255 255; --contrast-primary-1: 29 29 29;\n--primary-2: 242 251 255; --contrast-primary-2: 29 29 29;\n--primary-3: 236 248 255; --contrast-primary-3: 29 29 29;\n--primary-4: 227 244 255; --contrast-primary-4: 29 29 29;\n--primary-5: 218 239 255; --contrast-primary-5: 29 29 29;\n--primary-6: 207 231 255; --contrast-primary-6: 29 29 29;\n--primary-7: 190 219 255; --contrast-primary-7: 29 29 29;\n--primary-8: 174 206 255; --contrast-primary-8: 29 29 29;\n--primary-9: 56 132 255; --contrast-primary-9: 255 255 255;\n--primary-10: 38 114 236; --contrast-primary-10: 255 255 255;\n--primary-11: 23 102 222; --contrast-primary-11: 255 255 255;\n--primary-12: 0 0 119; --contrast-primary-12: 255 255 255;\n--primary-original: 56 132 255; --contrast-primary-original: 255 255 255;\n --tint-1: 254 255 255; --contrast-tint-1: 29 29 29;\n--tint-2: 248 250 253; --contrast-tint-2: 29 29 29;\n--tint-3: 245 248 252; --contrast-tint-3: 29 29 29;\n--tint-4: 239 242 248; --contrast-tint-4: 29 29 29;\n--tint-5: 233 237 244; --contrast-tint-5: 29 29 29;\n--tint-6: 225 230 238; --contrast-tint-6: 29 29 29;\n--tint-7: 212 217 226; --contrast-tint-7: 29 29 29;\n--tint-8: 199 205 215; --contrast-tint-8: 29 29 29;\n--tint-9: 119 134 157; --contrast-tint-9: 255 255 255;\n--tint-10: 108 122 145; --contrast-tint-10: 255 255 255;\n--tint-11: 97 111 134; --contrast-tint-11: 255 255 255;\n--tint-12: 18 29 48; --contrast-tint-12: 255 255 255;\n--tint-original: 120 120 120; --contrast-tint-original: 255 255 255;\n --neutral-1: 255 255 255; --contrast-neutral-1: 29 29 29;\n--neutral-2: 250 250 250; --contrast-neutral-2: 29 29 29;\n--neutral-3: 247 247 247; --contrast-neutral-3: 29 29 29;\n--neutral-4: 242 242 242; --contrast-neutral-4: 29 29 29;\n--neutral-5: 237 237 237; --contrast-neutral-5: 29 29 29;\n--neutral-6: 229 229 229; --contrast-neutral-6: 29 29 29;\n--neutral-7: 217 217 217; --contrast-neutral-7: 29 29 29;\n--neutral-8: 204 204 204; --contrast-neutral-8: 29 29 29;\n--neutral-9: 120 120 120; --contrast-neutral-9: 255 255 255;\n--neutral-10: 121 121 121; --contrast-neutral-10: 255 2"])</script><script>self.__next_f.push([1,"55 255;\n--neutral-11: 110 110 110; --contrast-neutral-11: 255 255 255;\n--neutral-12: 29 29 29; --contrast-neutral-12: 255 255 255;\n--neutral-original: 120 120 120; --contrast-neutral-original: 255 255 255;\n\n --header-background: 56 132 255;\n --header-link: 255 255 255;\n\n --info-1: 255 255 255; --contrast-info-1: 29 29 29;\n--info-2: 250 250 250; --contrast-info-2: 29 29 29;\n--info-3: 247 247 247; --contrast-info-3: 29 29 29;\n--info-4: 242 242 242; --contrast-info-4: 29 29 29;\n--info-5: 237 237 237; --contrast-info-5: 29 29 29;\n--info-6: 229 229 229; --contrast-info-6: 29 29 29;\n--info-7: 217 217 217; --contrast-info-7: 29 29 29;\n--info-8: 204 204 204; --contrast-info-8: 29 29 29;\n--info-9: 120 120 120; --contrast-info-9: 255 255 255;\n--info-10: 121 121 121; --contrast-info-10: 255 255 255;\n--info-11: 110 110 110; --contrast-info-11: 255 255 255;\n--info-12: 29 29 29; --contrast-info-12: 255 255 255;\n--info-original: 120 120 120; --contrast-info-original: 255 255 255;\n --warning-1: 255 254 249; --contrast-warning-1: 29 29 29;\n--warning-2: 255 248 238; --contrast-warning-2: 29 29 29;\n--warning-3: 255 244 230; --contrast-warning-3: 29 29 29;\n--warning-4: 255 238 219; --contrast-warning-4: 29 29 29;\n--warning-5: 255 232 208; --contrast-warning-5: 29 29 29;\n--warning-6: 255 223 194; --contrast-warning-6: 29 29 29;\n--warning-7: 246 210 176; --contrast-warning-7: 29 29 29;\n--warning-8: 237 196 157; --contrast-warning-8: 29 29 29;\n--warning-9: 254 154 0; --contrast-warning-9: 29 29 29;\n--warning-10: 187 92 0; --contrast-warning-10: 255 255 255;\n--warning-11: 174 81 0; --contrast-warning-11: 255 255 255;\n--warning-12: 75 0 0; --contrast-warning-12: 255 255 255;\n--warning-original: 254 154 0; --contrast-warning-original: 29 29 29;\n --danger-1: 255 252 251; --contrast-danger-1: 29 29 29;\n--danger-2: 255 244 242; --contrast-danger-2: 29 29 29;\n--danger-3: 255 239 235; --contrast-danger-3: 29 29 29;\n--danger-4: 255 231 226; --contrast-danger-4: 29 29 29;\n--danger-5: 255 223 217; --contrast-danger-5: 29 29 29;\n--danger-6: 255 212 205; --contrast-danger-6: 29 29 29;\n--danger-7: 255 196 189; --contrast-danger-7: 29 29 29;\n--danger-8: 255 181 173; --contrast-danger-8: 29 29 29;\n--danger-9: 251 44 54; --contrast-danger-9: 255 255 255;\n--danger-10: 228 0 33; --contrast-danger-10: 255 255 255;\n--danger-11: 214 0 17; --contrast-danger-11: 255 255 255;\n--danger-12: 101 0 0; --contrast-danger-12: 255 255 255;\n--danger-original: 251 44 54; --contrast-danger-original: 255 255 255;\n --success-1: 251 255 251; --contrast-success-1: 29 29 29;\n--success-2: 241 254 242; --contrast-success-2: 29 29 29;\n--success-3: 234 254 236; --contrast-success-3: 29 29 29;\n--success-4: 224 251 227; --contrast-success-4: 29 29 29;\n--success-5: 214 248 218; --contrast-success-5: 29 29 29;\n--success-6: 202 242 206; --contrast-success-6: 29 29 29;\n--success-7: 185 231 190; --contrast-success-7: 29 29 29;\n--success-8: 167 220 173; --contrast-success-8: 29 29 29;\n--success-9: 0 201 80; --contrast-success-9: 29 29 29;\n--success-10: 0 152 23; --contrast-success-10: 255 255 255;\n--success-11: 0 140 0; --contrast-success-11: 255 255 255;\n--success-12: 0 47 0; --contrast-success-12: 255 255 255;\n--success-original: 0 201 80; --contrast-success-original: 29 29 29;\n }\n\n .dark {\n --primary-1: 26 29 34; --contrast-primary-1: 255 255 255;\n--primary-2: 29 35 44; --contrast-primary-2: 255 255 255;\n--primary-3: 35 44 59; --contrast-primary-3: 255 255 255;\n--primary-4: 36 48 68; --contrast-primary-4: 255 255 255;\n--primary-5: 38 54 79; --contrast-primary-5: 255 255 255;\n--primary-6: 39 58 88; --contrast-primary-6: 255 255 255;\n--primary-7: 45 68 104; --contrast-primary-7: 255 255 255;\n--primary-8: 51 78 121; --contrast-primary-8: 255 255 255;\n--primary-9: 56 132 255; --contrast-primary-9: 255 255 255;\n--primary-10: 63 139 255; --contrast-primary-10: 255 255 255;\n--primary-11: 111 189 255; --c"])</script><script>self.__next_f.push([1,"ontrast-primary-11: 29 29 29;\n--primary-12: 172 255 255; --contrast-primary-12: 29 29 29;\n--primary-original: 56 132 255; --contrast-primary-original: 255 255 255;\n --tint-1: 29 29 29; --contrast-tint-1: 255 255 255;\n--tint-2: 34 35 35; --contrast-tint-2: 255 255 255;\n--tint-3: 43 44 45; --contrast-tint-3: 255 255 255;\n--tint-4: 46 48 50; --contrast-tint-4: 255 255 255;\n--tint-5: 52 54 56; --contrast-tint-5: 255 255 255;\n--tint-6: 56 58 61; --contrast-tint-6: 255 255 255;\n--tint-7: 65 68 71; --contrast-tint-7: 255 255 255;\n--tint-8: 75 78 82; --contrast-tint-8: 255 255 255;\n--tint-9: 126 133 145; --contrast-tint-9: 255 255 255;\n--tint-10: 137 145 157; --contrast-tint-10: 255 255 255;\n--tint-11: 185 193 205; --contrast-tint-11: 29 29 29;\n--tint-12: 247 255 255; --contrast-tint-12: 29 29 29;\n--tint-original: 120 120 120; --contrast-tint-original: 255 255 255;\n --neutral-1: 29 29 29; --contrast-neutral-1: 255 255 255;\n--neutral-2: 34 34 34; --contrast-neutral-2: 255 255 255;\n--neutral-3: 44 44 44; --contrast-neutral-3: 255 255 255;\n--neutral-4: 48 48 48; --contrast-neutral-4: 255 255 255;\n--neutral-5: 53 53 53; --contrast-neutral-5: 255 255 255;\n--neutral-6: 57 57 57; --contrast-neutral-6: 255 255 255;\n--neutral-7: 67 67 67; --contrast-neutral-7: 255 255 255;\n--neutral-8: 78 78 78; --contrast-neutral-8: 255 255 255;\n--neutral-9: 120 120 120; --contrast-neutral-9: 255 255 255;\n--neutral-10: 144 144 144; --contrast-neutral-10: 255 255 255;\n--neutral-11: 192 192 192; --contrast-neutral-11: 29 29 29;\n--neutral-12: 255 255 255; --contrast-neutral-12: 29 29 29;\n--neutral-original: 120 120 120; --contrast-neutral-original: 255 255 255;\n\n --header-background: 56 132 255;\n --header-link: 255 255 255;\n\n --info-1: 29 29 29; --contrast-info-1: 255 255 255;\n--info-2: 34 34 34; --contrast-info-2: 255 255 255;\n--info-3: 44 44 44; --contrast-info-3: 255 255 255;\n--info-4: 48 48 48; --contrast-info-4: 255 255 255;\n--info-5: 53 53 53; --contrast-info-5: 255 255 255;\n--info-6: 57 57 57; --contrast-info-6: 255 255 255;\n--info-7: 67 67 67; --contrast-info-7: 255 255 255;\n--info-8: 78 78 78; --contrast-info-8: 255 255 255;\n--info-9: 120 120 120; --contrast-info-9: 255 255 255;\n--info-10: 144 144 144; --contrast-info-10: 255 255 255;\n--info-11: 192 192 192; --contrast-info-11: 29 29 29;\n--info-12: 255 255 255; --contrast-info-12: 29 29 29;\n--info-original: 120 120 120; --contrast-info-original: 255 255 255;\n --warning-1: 32 28 25; --contrast-warning-1: 255 255 255;\n--warning-2: 40 33 26; --contrast-warning-2: 255 255 255;\n--warning-3: 53 41 30; --contrast-warning-3: 255 255 255;\n--warning-4: 60 44 29; --contrast-warning-4: 255 255 255;\n--warning-5: 69 49 29; --contrast-warning-5: 255 255 255;\n--warning-6: 76 52 27; --contrast-warning-6: 255 255 255;\n--warning-7: 90 61 30; --contrast-warning-7: 255 255 255;\n--warning-8: 104 70 34; --contrast-warning-8: 255 255 255;\n--warning-9: 254 154 0; --contrast-warning-9: 29 29 29;\n--warning-10: 213 116 0; --contrast-warning-10: 255 255 255;\n--warning-11: 255 165 34; --contrast-warning-11: 29 29 29;\n--warning-12: 255 229 115; --contrast-warning-12: 29 29 29;\n--warning-original: 254 154 0; --contrast-warning-original: 29 29 29;\n --danger-1: 34 27 26; --contrast-danger-1: 255 255 255;\n--danger-2: 45 30 29; --contrast-danger-2: 255 255 255;\n--danger-3: 60 37 35; --contrast-danger-3: 255 255 255;\n--danger-4: 69 38 35; --contrast-danger-4: 255 255 255;\n--danger-5: 80 41 38; --contrast-danger-5: 255 255 255;\n--danger-6: 89 41 38; --contrast-danger-6: 255 255 255;\n--danger-7: 105 48 44; --contrast-danger-7: 255 255 255;\n--danger-8: 121 54 50; --contrast-danger-8: 255 255 255;\n--danger-9: 251 44 54; --contrast-danger-9: 255 255 255;\n--danger-10: 255 52 59; --contrast-danger-10: 255 255 255;\n--danger-11: 255 113 108; --contrast-danger-11: 255 255 255;\n--danger-12: 255 180 169; --contrast-danger-12: 29 29 29;\n--danger-original: 251 44 54; --contrast-danger-orig"])</script><script>self.__next_f.push([1,"inal: 255 255 255;\n --success-1: 26 31 26; --contrast-success-1: 255 255 255;\n--success-2: 28 37 29; --contrast-success-2: 255 255 255;\n--success-3: 33 48 35; --contrast-success-3: 255 255 255;\n--success-4: 33 54 35; --contrast-success-4: 255 255 255;\n--success-5: 34 61 38; --contrast-success-5: 255 255 255;\n--success-6: 32 66 38; --contrast-success-6: 255 255 255;\n--success-7: 37 78 44; --contrast-success-7: 255 255 255;\n--success-8: 41 90 50; --contrast-success-8: 255 255 255;\n--success-9: 0 201 80; --contrast-success-9: 29 29 29;\n--success-10: 0 176 54; --contrast-success-10: 255 255 255;\n--success-11: 62 227 106; --contrast-success-11: 29 29 29;\n--success-12: 139 255 168; --contrast-success-12: 29 29 29;\n--success-original: 0 201 80; --contrast-success-original: 29 29 29;\n }\n 16:[\"$\",\"html\",null,{\"suppressHydrationWarning\":true,\"lang\":\"en\",\"className\":\"scroll-pt-[76px] theme-clean no-tint sidebar-default sidebar-list-default links-default __variable_f9f441 __variable_7d852e __variable_96046e\",\"children\":[[\"$\",\"head\",null,{\"children\":[null,[\"$\",\"style\",null,{\"nonce\":\"$undefined\",\"children\":\"$1f\"}]]}],[\"$\",\"body\",null,{\"className\":\"bg-tint-base theme-muted:bg-tint-subtle theme-bold-tint:bg-tint-subtle theme-gradient:bg-gradient-primary theme-gradient-tint:bg-gradient-tint\",\"children\":[\"$\",\"$L20\",null,{\"assetsURL\":\"https://ka-p.fontawesome.com/releases/v6.6.0/\",\"assetsURLToken\":\"a463935e93\",\"assetsByStyles\":{\"custom-icons\":{\"assetsURL\":\"https://static.gitbook.com/~gitbook/static/icons\"}},\"iconStyle\":\"regular\",\"children\":[\"$\",\"$L21\",null,{\"language\":{\"locale\":\"en\",\"powered_by_gitbook\":\"Powered by GitBook\",\"sponsored_via_gitbook\":\"Sponsored via GitBook\",\"switch_to_dark_theme\":\"Switch to dark theme\",\"switch_to_light_theme\":\"Switch to light theme\",\"switch_to_system_theme\":\"Switch to system theme\",\"search\":\"Search\",\"search_or_ask\":\"Ask or search\",\"search_input_placeholder\":\"Search content\",\"search_ask_input_placeholder\":\"Search content or ask a question\",\"search_no_results\":\"No results for \\\"${1}\\\".\",\"search_scope_space\":\"$${1}\",\"search_scope_all\":\"All content\",\"search_ask\":\"Ask \\\"${1}\\\"\",\"search_ask_description\":\"Find the answer with AI\",\"search_ask_sources\":\"Sources\",\"search_ask_sources_no_answer\":\"Related pages\",\"search_ask_no_answer\":\"An answer could not be found for your question. You could try rephrasing it, or be more specific.\",\"search_ask_error\":\"Something went wrong. Please try again later.\",\"on_this_page\":\"On this page\",\"next_page\":\"Next\",\"previous_page\":\"Previous\",\"page_last_modified\":\"Last updated ${1}\",\"was_this_helpful\":\"Was this helpful?\",\"was_this_helpful_positive\":\"Yes, it was!\",\"was_this_helpful_neutral\":\"Not sure\",\"was_this_helpful_negative\":\"No\",\"was_this_helpful_thank_you\":\"Thank you!\",\"was_this_helpful_comment\":\"Anything you'd like to add?\",\"submit\":\"Submit\",\"annotation_button_label\":\"Open annotation\",\"code_copied\":\"Copied!\",\"code_copy\":\"Copy\",\"table_of_contents_button_label\":\"Open table of contents\",\"cookies_title\":\"Cookies\",\"cookies_prompt\":\"This site uses cookies to deliver its service and to analyse traffic. By browsing this site, you accept the ${1}.\",\"cookies_prompt_privacy\":\"privacy policy\",\"cookies_accept\":\"Accept\",\"cookies_reject\":\"Reject\",\"cookies_close\":\"Close\",\"edit_on_git\":\"Edit on ${1}\",\"notfound_title\":\"Page not found\",\"notfound\":\"The page you are looking for doesn't exist.\",\"unexpected_error_title\":\"An error occurred\",\"unexpected_error\":\"Sorry, an unexpected error has occurred. Please try again later.\",\"unexpected_error_retry\":\"Retry\",\"pdf_download\":\"Export as PDF\",\"pdf_goback\":\"Go back to content\",\"pdf_print\":\"Print or Save as PDF\",\"pdf_page_of\":\"$${1} of ${2}\",\"pdf_mode_only_page\":\"Only this page\",\"pdf_mode_all\":\"All pages\",\"pdf_limit_reached\":\"Couldn't generate the PDF for ${1} pages, generation stopped at ${2}.\",\"pdf_limit_reached_continue\":\"Extend with ${1} more pages.\",\"more\":\"More\"},\"children\":[\"$\",\"$L11\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"middleware\",\"children\",\"(site)\",\"children\"],\"error\":\"$22"])</script><script>self.__next_f.push([1,"\",\"errorStyles\":[],\"errorScripts\":[],\"template\":[\"$\",\"$L13\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]}]}]}]]}]\n15:[\"$\",\"$L23\",null,{\"children\":[\"$\",\"$L24\",null,{\"nonce\":\"$undefined\",\"forcedTheme\":\"light\",\"children\":[[\"$\",\"$L25\",null,{\"basePath\":\"/blog/\",\"children\":[\"$\",\"$L26\",null,{\"enabled\":true,\"appURL\":\"https://app.gitbook.com\",\"apiHost\":\"https://api.gitbook.com\",\"organizationId\":\"c1fMmGrujzxVxYDiFwSR\",\"siteId\":\"site_ELOmj\",\"siteSectionId\":null,\"siteSpaceId\":\"sitesp_cAjxp\",\"siteShareKey\":null,\"revisionId\":\"ghNSnlL7v2qU29QJZxbj\",\"spaceId\":\"-M5KBcEvOMRAQtKb5jHb\",\"visitorAuthClaims\":{},\"children\":[[\"$\",\"header\",null,{\"id\":\"site-header\",\"className\":\"flex flex-col h-[64px] sticky top-0 z-30 w-full flex-none shadow-[0px_1px_0px] shadow-tint-12/2 bg-tint-base/9 theme-muted:bg-tint-subtle/9 theme-bold-tint:bg-tint-subtle/9 theme-gradient:bg-gradient-primary theme-gradient-tint:bg-gradient-tint contrast-more:bg-tint-base text-sm backdrop-blur-lg\",\"children\":[[\"$\",\"div\",null,{\"className\":\"theme-bold:bg-header-background theme-bold:shadow-[0px_1px_0px] theme-bold:shadow-tint-12/2\",\"children\":[\"$\",\"div\",null,{\"className\":\"scroll-nojump\",\"children\":[\"$\",\"div\",null,{\"className\":\"gap-4 lg:gap-6 flex items-center justify-between w-full py-3 min-h-16 sm:h-16 px-4 sm:px-6 md:px-8 max-w-screen-2xl mx-auto page-full-width:max-w-full\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex max-w-full lg:basis-72 min-w-0 shrink items-center justify-start gap-2 lg:gap-4\",\"children\":[[\"$\",\"$L27\",null,{\"className\":\"lg:hidden -ml-2 text-tint-strong theme-bold:text-header-link hover:bg-tint-hover theme-bold:hover:bg-header-link/3 page-no-toc:hidden\"}],\"$L28\"]}],[\"$\",\"div\",null,{\"className\":\"flex grow-0 shrink-0 md:basis-56 justify-self-end order-last\",\"children\":[\"$\",\"$29\",null,{\"fallback\":null,\"children\":[\"$\",\"$L2a\",null,{\"style\":[\"theme-bold:bg-header-link/2\",\"theme-bold:hover:bg-header-link/3\",\"theme-bold:text-header-link/8\",\"theme-bold:hover:text-header-link\",\"theme-bold:ring-header-link/4\",\"theme-bold:hover:ring-header-link/5\",\"theme-bold:[\u0026_svg]:text-header-link/10\",\"theme-bold:[\u0026_.shortcut]:text-header-link/8\",\"theme-bold:contrast-more:bg-header-background\",\"theme-bold:contrast-more:text-header-link\",\"theme-bold:contrast-more:ring-header-link\",\"theme-bold:contrast-more:hover:bg-header-background\",\"theme-bold:contrast-more:hover:ring-header-link\",\"theme-bold:contrast-more:focus:text-header-link\",\"theme-bold:contrast-more:focus:bg-header-background\",\"theme-bold:contrast-more:focus:ring-header-link\",\"theme-bold:shadow-none\",\"theme-bold:hover:shadow-none\",\"whitespace-nowrap\"],\"children\":[\"$\",\"span\",null,{\"className\":\"flex-1\",\"children\":[\"Search\",\"...\"]}]}]}]}],false]}]}]}],null]}],[\"$\",\"div\",null,{\"className\":\"scroll-nojump\",\"children\":[\"$\",\"div\",null,{\"className\":\"flex flex-col lg:flex-row px-4 sm:px-6 md:px-8 max-w-screen-2xl mx-auto page-full-width:max-w-full\",\"children\":[[\"$\",\"aside\",null,{\"data-testid\":\"table-of-contents\",\"className\":\"group text-sm grow-0 shrink-0 basis-full lg:basis-72 page-no-toc:lg:basis-56 relative z-[1] lg:sticky lg:top-0 lg:h-screen site-header:lg:top-16 site-header:lg:h-[calc(100vh_-_4rem)] site-header-sections:lg:top-[6.75rem] site-header-sections:lg:h-[calc(100vh_-_6.75rem)] pt-6 pb-4 sidebar-filled:lg:pr-6 page-no-toc:lg:pr-0 hidden navigation-open:!flex lg:flex page-no-toc:lg:hidden page-no-toc:xl:flex site-header-none:page-no-toc:lg:flex flex-col gap-4 navigation-open:border-b border-tint-subtle\",\"children\":[null,[\"$\",\"div\",null,{\"className\":\"lg:-ms-5 overflow-hidden relative flex flex-col flex-grow sidebar-filled:bg-tint-subtle theme-muted:bg-tint-subtle theme-bold-tint:bg-tint-subtle [html.sidebar-filled.theme-muted_\u0026]:bg-tint-base [html.sidebar-filled.theme-bold.tint_\u0026]:bg-tint-base page-no-toc:!bg-transparent sidebar-filled:rounded-xl straight-corners:rounded-none\",\"children\":[[\"$\",\"div\",null,{\"className\":\"px-5 *:my-4\",\"children\":[false,false,false]}],[\"$\",\"$L2b\",null,{\"className\":\"flex flex-grow flex-col p-2 lg:pb-20 overflow-y-a"])</script><script>self.__next_f.push([1,"uto lg:gutter-stable [\u0026::-webkit-scrollbar]:bg-transparent [\u0026::-webkit-scrollbar-thumb]:bg-transparent group-hover:[\u0026::-webkit-scrollbar]:bg-tint-subtle group-hover:[\u0026::-webkit-scrollbar-thumb]:bg-tint-7 group-hover:[\u0026::-webkit-scrollbar-thumb:hover]:bg-tint-8\",\"children\":[[\"$\",\"ul\",null,{\"className\":\"flex flex-col gap-y-0.5 page-no-toc:hidden sidebar-list-line:border-l border-tint-subtle\",\"children\":[\"$L2c\",[\"$\",\"li\",null,{\"className\":\"flex flex-col group/page-group-item\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-3 px-3 z-[1] sticky -top-5 pt-6 group-first/page-group-item:-mt-5 pb-3 -mb-1.5 text-xs tracking-wide font-semibold uppercase [mask-image:linear-gradient(rgba(0,0,0,1)_70%,rgba(0,0,0,0))] bg-tint-base sidebar-filled:bg-tint-subtle theme-muted:bg-tint-subtle theme-bold-tint:bg-tint-subtle [html.sidebar-filled.theme-muted_\u0026]:bg-tint-base [html.sidebar-filled.theme-bold.tint_\u0026]:bg-tint-base [html.sidebar-default.theme-gradient_\u0026]:bg-gradient-primary [html.sidebar-default.theme-gradient.tint_\u0026]:bg-gradient-tint\",\"children\":[\"$undefined\",\"ML\"]}],[\"$\",\"ul\",null,{\"className\":\"flex flex-col gap-y-0.5\",\"children\":[\"$L2d\",\"$L2e\",\"$L2f\",\"$L30\"]}]]}],[\"$\",\"li\",null,{\"className\":\"flex flex-col group/page-group-item\",\"children\":[[\"$\",\"div\",null,{\"className\":\"flex items-center gap-3 px-3 z-[1] sticky -top-5 pt-6 group-first/page-group-item:-mt-5 pb-3 -mb-1.5 text-xs tracking-wide font-semibold uppercase [mask-image:linear-gradient(rgba(0,0,0,1)_70%,rgba(0,0,0,0))] bg-tint-base sidebar-filled:bg-tint-subtle theme-muted:bg-tint-subtle theme-bold-tint:bg-tint-subtle [html.sidebar-filled.theme-muted_\u0026]:bg-tint-base [html.sidebar-filled.theme-bold.tint_\u0026]:bg-tint-base [html.sidebar-default.theme-gradient_\u0026]:bg-gradient-primary [html.sidebar-default.theme-gradient.tint_\u0026]:bg-gradient-tint\",\"children\":[\"$undefined\",\"Engineering\"]}],[\"$\",\"ul\",null,{\"className\":\"flex flex-col gap-y-0.5\",\"children\":[\"$L31\",\"$L32\",\"$L33\",\"$L34\"]}]]}],\"$L35\",\"$L36\"]}],[\"$\",\"div\",null,{\"className\":\"relative z-[2] lg:absolute left-0 right-2 bottom-0 pointer-events-none sidebar-filled:pl-2 sidebar-filled:pb-2 sidebar-filled:page-no-toc:p-0 bg-tint-base sidebar-filled:bg-tint-subtle theme-muted:bg-tint-subtle [html.sidebar-filled.theme-muted_\u0026]:bg-tint-base [html.sidebar-filled.theme-bold.tint_\u0026]:bg-tint-base before:hidden lg:before:block before:content-[\\\"\\\"] before:absolute before:inset-x-0 before:bottom-full before:h-8 before:bg-gradient-to-b before:from-transparent before:to-tint-base sidebar-filled:before:to-tint-subtle theme-muted:before:to-tint-subtle theme-bold-tint:before:to-tint-subtle [html.sidebar-filled.theme-muted_\u0026]:before:to-tint-base [html.sidebar-filled.theme-bold.tint_\u0026]:before:to-tint-base page-no-toc:before:!to-transparent\",\"children\":[\"$\",\"$L37\",null,{\"target\":\"_blank\",\"href\":\"https://www.gitbook.com/?utm_source=content\u0026utm_medium=trademark\u0026utm_campaign=-M5KBcEvOMRAQtKb5jHb\",\"className\":\"text-sm font-semibold text-tint flex flex-row items-center px-5 py-4 sidebar-filled:px-3 sidebar-filled:page-no-toc:lg:px-5 rounded-lg straight-corners:rounded-none hover:bg-tint hover:text-tint-strong ring-2 lg:ring-1 ring-inset ring-tint-subtle transition-colors pointer-events-auto\",\"insights\":{\"type\":\"trademark_click\",\"placement\":\"sidebar\"},\"children\":[[\"$\",\"$L38\",null,{\"icon\":\"gitbook\",\"className\":\"size-5 shrink-0\"}],[\"$\",\"span\",null,{\"className\":\"ml-3\",\"children\":\"Powered by GitBook\"}]]}]}]]}]]}]]}],[\"$\",\"div\",null,{\"className\":\"flex min-w-0 flex-1 flex-col\",\"children\":[\"$\",\"$L11\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"middleware\",\"children\",\"(site)\",\"children\",\"(content)\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L13\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]}]]}]}],null,[\"$\",\"$29\",null,{\"fallback\":null,\"children\":[\"$\",\"$L39\",null,{\"spaceTitle\":\"Keng's Blog\",\"withAsk\":false,\"isMultiVariants\":false}]}]]}]}],[[\"$\",\"$L3a\",null,{}],[[\"$\",\"script\",\"https://integ"])</script><script>self.__next_f.push([1,"rations.gitbook.com/v1/integrations/googleanalytics/installations/f358ef7676b84cfde66faab6d1bd9057fe92c347966f2738381bb4aa08f7ca27/sites/site_ELOmj/script.js?version=150.0\",{\"async\":true,\"src\":\"https://integrations.gitbook.com/v1/integrations/googleanalytics/installations/f358ef7676b84cfde66faab6d1bd9057fe92c347966f2738381bb4aa08f7ca27/sites/site_ELOmj/script.js?version=150.0\",\"nonce\":\"$undefined\"}]]],[\"$\",\"$29\",null,{\"fallback\":null,\"children\":[\"$\",\"$L3b\",null,{\"privacyPolicy\":\"$undefined\"}]}],[\"$\",\"script\",null,{\"nonce\":\"$undefined\",\"suppressHydrationWarning\":true,\"data-cfasync\":\"false\",\"dangerouslySetInnerHTML\":{\"__html\":\"\\n document.addEventListener(\\\"DOMContentLoaded\\\", () =\u003e {\\n if (Array.from(document.scripts).find(script =\u003e script.src.includes('rocket-loader.min.js'))) {\\n const alert = document.createElement('div');\\n alert.className = 'p-4 mb-4 text-sm text-red-800 rounded-lg bg-red-50 mt-8 mx-8';\\n alert.innerHTML = `\\n \u003cstrong\u003eError in site configuration:\u003c/strong\u003e\\n It looks like ${window.location.hostname} has been incorrectly configured in Cloudflare. This may lead to unexpected behavior or issues with the page loading. If you are the owner of this site, please refer to \u003ca href=\\\"https://docs.gitbook.com/published-documentation/custom-domain/configure-dns#are-you-using-cloudflare\\\" class=\\\"underline\\\"\u003eGitBook's documentation\u003c/a\u003e for steps to fix the problem.\\n `;\\n\\n document.body.prepend(alert);\\n }\\n });\"}}],\"$L3c\"]}]}]\n3f:I[66185,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"ToggleableLinkItem\"]\n28:[\"$\",\"$L37\",null,{\"href\":\"https://kengz.gitbook.io/blog/\",\"className\":\"group/headerlogo min-w-0 shrink flex items-center\",\"children\":[[\"$L3d\",\"$L3e\"],[\"$\",\"div\",null,{\"className\":\"text-pretty line-clamp-2 tracking-tight max-w-[18ch] lg:max-w-[24ch] font-semibold ms-3 text-base/tight lg:text-lg/tight text-tint-strong theme-bold:text-header-link\",\"children\":\"Keng's Blog\"}]]}]\n2c:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\"/blog/\",\"pathname\":\"\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"-M5KBfHajq_-kWwmk-K4\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"Keng's Blog\"}]}]\n2d:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\"/blog/ml/running-wandb-on-kubernetes\",\"pathname\":\"ml/running-wandb-on-kubernetes\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"-MAHk614mgFNczHfbmPW\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"Running WandB on Kubernetes\"}]}]\n2e:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\"/blog/ml/torcharc\",\"pathname\":\"ml/torcharc\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"-MAHkgY0gMRpyzUqnVLP\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"TorchArc\"}]}]\n2f:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\"/blog/ml/distributed-training-with-torchelastic-on-kubernetes\",\"pathname\":\"ml/distributed-training-with-torchelastic-on-kubernetes\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"-Mew4Tx_YTDHMHUspyI7\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"Distributed Training with TorchElastic on Kubernetes\"}]}]\n30:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\"/blog/ml/feature-transform\",\"pathname\":\"ml/feature-transform\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"UgcRZuOqs3eSbIPJKjXm\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"Feature Transform\"}]}]\n31:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\""])</script><script>self.__next_f.push([1,"/blog/engineering/github-actions-for-python-project\",\"pathname\":\"engineering/github-actions-for-python-project\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"-M5KBp1AM15l2ewYK3Ua\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"Github Actions for Python Project\"}]}]\n32:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\"/blog/engineering/ubuntu-gpu-server-setup\",\"pathname\":\"engineering/ubuntu-gpu-server-setup\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"-MAHofXnS8nc7OEwb1Mz\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"Ubuntu GPU Server Setup\"}]}]\n33:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\"/blog/engineering/setting-up-a-private-kubernetes-cluster\",\"pathname\":\"engineering/setting-up-a-private-kubernetes-cluster\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"-MAHkRuAAqE_T6IMDEiu\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"Setting up a private Kubernetes cluster\"}]}]\n34:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\"/blog/engineering/setting-up-a-private-ml-kubernetes-cluster-with-k0s\",\"pathname\":\"engineering/setting-up-a-private-ml-kubernetes-cluster-with-k0s\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"-MdsdSyb1lXmQPOQX_OP\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"Setting up a private GPU Kubernetes cluster with K0s\"}]}]\n35:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\"/blog/setting-up-a-private-kubernetes-cluster-with-k0sctl\",\"pathname\":\"setting-up-a-private-kubernetes-cluster-with-k0sctl\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"HkirSAsaFtKN9mOAS3bt\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"Setting up a private Kubernetes cluster with k0sctl\"}]}]\n36:[\"$\",\"li\",null,{\"className\":\"flex flex-col\",\"children\":[\"$\",\"$L3f\",null,{\"href\":\"/blog/setting-up-kubernetes-addons\",\"pathname\":\"setting-up-kubernetes-addons\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"He5ohFTFsiArdW9twsRz\"},\"position\":\"sidebar\"}},\"descendants\":null,\"children\":\"Setting up Kubernetes Addons\"}]}]\n3c:null\n40:T49f,https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=32\u0026dpr=1\u0026quality=100\u0026sign=c53efa1d\u0026sv=2 32w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=32\u0026dpr=2\u0026quality=100\u0026sign=c53efa1d\u0026sv=2 64w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=32\u0026dpr=3\u0026quality=100\u0026sign=c53efa1d\u0026sv=2 96w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=32\u0026dpr=4\u0026quality=100\u0026sign=c53efa1d\u0026sv=2 128w3d:[\"$\",\"img\",null,{\"alt\":\"\",\"style\":{\"aspectRatio\":\"1\"},\"loading\":\"$undefined\",\"fetchPriority\":\"high\",\"data-visual-test\":\"$undefined\",\"className\":\"block dark:hidden object-contain size-8\",\"src\":\"https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=32\u0026dpr=4\u0026quality=100\u0026sign=c53efa1d\u0026sv=2\",\"srcSet\":\"$40\",\"sizes\":\"32px\",\"width\":256,\"height\":256}]\n41:T49f,https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7"])</script><script>self.__next_f.push([1,"E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=32\u0026dpr=1\u0026quality=100\u0026sign=c53efa1d\u0026sv=2 32w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=32\u0026dpr=2\u0026quality=100\u0026sign=c53efa1d\u0026sv=2 64w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=32\u0026dpr=3\u0026quality=100\u0026sign=c53efa1d\u0026sv=2 96w, https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=32\u0026dpr=4\u0026quality=100\u0026sign=c53efa1d\u0026sv=2 128w3e:[\"$\",\"img\",null,{\"alt\":\"\",\"style\":{\"aspectRatio\":\"1\"},\"loading\":\"lazy\",\"fetchPriority\":\"high\",\"data-visual-test\":\"$undefined\",\"className\":\"hidden dark:block object-contain size-8\",\"src\":\"https://kengz.gitbook.io/~gitbook/image?url=https%3A%2F%2F3782595534-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-legacy-files%2Fo%2Fspaces%252F-M5KBcEvOMRAQtKb5jHb%252Favatar-1587346363780.png%3Fgeneration%3D1587346364098105%26alt%3Dmedia\u0026width=32\u0026dpr=4\u0026quality=100\u0026sign=c53efa1d\u0026sv=2\",\"srcSet\":\"$41\",\"sizes\":\"32px\",\"width\":256,\"height\":256}]\n"])</script><script>self.__next_f.push([1,"43:I[75632,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"8581\",\"static/chunks/8581-232e62c561277f92.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"8843\",\"static/chunks/8843-00cba0b160454c4d.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"8678\",\"static/chunks/8678-15aefe1165bae785.js\",\"7093\",\"static/chunks/7093-8f66c7b92e65df99.js\",\"813\",\"static/chunks/app/middleware/(site)/(content)/%5B%5B...pathname%5D%5D/not-found-989d3dd52c55dcb1.js\"],\"PageFeedbackForm\"]\n44:I[93952,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"8581\",\"static/chunks/8581-232e62c561277f92.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"8843\",\"static/chunks/8843-00cba0b160454c4d.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"8678\",\"static/chunks/8678-15aefe1165bae785.js\",\"7093\",\"static/chunks/7093-8f66c7b92e65df99.js\",\"813\",\"static/chunks/app/middleware/(site)/(content)/%5B%5B...pathname%5D%5D/not-found-989d3dd52c55dcb1.js\"],\"Ad\"]\n45:I[46451,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"8581\",\"static/chunks/8581-232e62c561277f92.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"8843\",\"static/chunks/8843-00cba0b160454c4d.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"8678\",\"static/chunks/8678-15aefe1165bae785.js\",\"7093\",\"static/chunks/7093-8f66c7b92e65df99.js\",\"813\",\"static/chunks/app/middleware/(site)/(content)/%5B%5B...pathname%5D%5D/not-found-989d3dd52c55dcb1.js\"],\"PreservePageLayout\"]\n47:\"$Sreact.fragment\"\n49:I[66819,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/m"])</script><script>self.__next_f.push([1,"iddleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"DateRelative\"]\n4a:I[26700,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"2241\",\"static/chunks/2241-ff00605587a5640e.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"6119\",\"static/chunks/app/middleware/(site)/(content)/layout-cd7bf86acacb2c51.js\"],\"TrackPageViewEvent\"]\n4b:I[96498,[\"7842\",\"static/chunks/7842-785434c6c9469d80.js\",\"4289\",\"static/chunks/4289-f629daea2759300f.js\",\"8581\",\"static/chunks/8581-232e62c561277f92.js\",\"5890\",\"static/chunks/5890-04b4600f719d7465.js\",\"8843\",\"static/chunks/8843-00cba0b160454c4d.js\",\"983\",\"static/chunks/983-b8c447ba525bab23.js\",\"1683\",\"static/chunks/1683-2cdcd7f4dd3f409e.js\",\"8678\",\"static/chunks/8678-15aefe1165bae785.js\",\"7093\",\"static/chunks/7093-8f66c7b92e65df99.js\",\"813\",\"static/chunks/app/middleware/(site)/(content)/%5B%5B...pathname%5D%5D/not-found-989d3dd52c55dcb1.js\"],\"PageClientLayout\"]\n10:[null,[\"$\",\"div\",null,{\"className\":\"flex grow flex-row-reverse justify-end\",\"children\":[[\"$\",\"aside\",null,{\"className\":\"group/aside hidden xl:flex flex-col basis-56 grow-0 shrink-0 break-anywhere text-tint contrast-more:text-tint-strong sticky lg:top-0 lg:max-h-screen site-header:lg:top-16 site-header:lg:max-h-[calc(100vh_-_4rem)] site-header-sections:lg:top-[6.75rem] site-header-sections:lg:max-h-[calc(100vh_-_6.75rem)] page-api-block:xl:max-2xl:z-10 page-api-block:xl:max-2xl:fixed page-api-block:xl:max-2xl:right-8 page-api-block:xl:max-2xl:w-56 page-api-block:xl:max-2xl:bg-tint/9 page-api-block:xl:max-2xl:contrast-more:bg-tint page-api-block:xl:max-2xl:backdrop-blur-lg page-api-block:xl:max-2xl:border page-api-block:xl:max-2xl:border-tint page-api-block:xl:max-2xl:hover:shadow-lg page-api-block:xl:max-2xl:hover:shadow-tint-12/1 page-api-block:xl:max-2xl:dark:hover:shadow-tint-1/1 page-api-block:xl:max-2xl:rounded-md page-api-block:xl:max-2xl:h-auto page-api-block:xl:max-2xl:my-8 page-api-block:p-2\",\"children\":[[[\"$\",\"div\",null,{\"className\":\"hidden page-api-block:xl:max-2xl:flex text-xs tracking-wide font-semibold uppercase flex-row items-center gap-2\",\"children\":[[\"$\",\"$L38\",null,{\"icon\":\"block-quote\",\"className\":\"size-3\"}],\"On this page\",[\"$\",\"$L38\",null,{\"icon\":\"chevron-down\",\"className\":\"size-3 opacity-6 ml-auto page-api-block:xl:max-2xl:group-hover/aside:hidden\"}]]}],[\"$\",\"div\",null,{\"className\":\"overflow-y-auto overflow-x-visible flex flex-col shrink pb-12 sticky lg:top:0 site-header:lg:top-16 site-header-sections:lg:top-[6.75rem] gap-6 pt-8 page-api-block:xl:max-2xl:py-0 page-api-block:xl:max-2xl:hidden page-api-block:xl:max-2xl:group-hover/aside:flex\",\"children\":[[\"$\",\"$29\",null,{\"fallback\":null,\"children\":\"$L42\"}],[\"$\",\"div\",null,{\"className\":\"flex flex-col gap-3 sidebar-list-default:px-3 border-t first:border-none border-tint-subtle py-4 first:pt-0 page-api-block:xl:max-2xl:px-3 empty:hidden\",\"children\":[[\"$\",\"$29\",null,{\"fallback\":null,\"children\":[\"$\",\"$L43\",null,{\"pageId\":\"-M5KBfHajq_-kWwmk-K4\",\"className\":\"mt-2\"}]}],null,null]}]]}]],[\"$\",\"div\",null,{\"className\":\"sticky bottom-0 z-10 mt-auto flex flex-col bg-tint-base theme-bold-tint:bg-tint-subtle theme-gradient-tint:bg-gradient-tint theme-gradient:bg-gradient-primary theme-muted:bg-tint-subtle pb-4 page-api-block:xl:max-2xl:hidden page-api-block:xl:max-2xl:pb-0 page-api-block:xl:max-2xl:group-hover/aside:flex page-api-block:xl:max-2xl:bg-transparent\",\"children\":[null,[\"$\",\"$L44\",null,{\"zoneId\":null,\"placement\":\"aside\",\"spaceId\":\"-M5KBcEvOMRAQtKb5jHb\",\"siteAdsStatus\":\"$undefined\",\"ignore\":false,\"style\":\"$undefined\"}]]}]]}],[[\"$\",\"main\",null,{\"className\":\"relative min-w-0 flex-1 py-8 lg:px-12 break-anywhere page-api-block:xl:max-2xl:pr-0 page-api-block:mx-auto page-api-block:max-w-screen-2xl page-default-width page-has-toc\",\"children\":[[\"$\",\"$L45\",null,{\"asFullWidth\":false}],null,\"$L46\",[\"$\",\"$29\",null,{\"fallback\":[\"$\",\"div\",null,{\"className\":\"flex flex-col gap-4\",\"children\":[[\"$\",\"div\",null,{\"id\":\"$undefined\",\"role\":\"status\",\"ar"])</script><script>self.__next_f.push([1,"ia-busy\":true,\"className\":\"mx-auto w-full decoration-primary/6 max-w-3xl page-api-block:ml-0\",\"children\":[\"$\",\"div\",null,{\"className\":\"ring-1 ring-tint-subtle overflow-hidden relative grid rounded-md h-[35px] [max-width:calc(48rem-1px)]\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-full bg-tint grid grid-area-1-1 overflow-hidden [mask:conic-gradient(from_90deg_at_1px_1px,_#0000_90deg,_#0003_0)_calc(50%+1px)_calc(0%+47px)_/_12px_12px]\",\"children\":[\"$\",\"div\",null,{\"className\":\"aspect-square from-tint-solid to-transparent grid-area-1-1 relative origin-[50%_50%] top-[50%] self-stretch bg-transparent will-change-transform animate-[rotateLoop_2s_linear_infinite] [background-image:conic-gradient(from_-90deg_at_50%_50%,_var(--tw-gradient-stops)_0deg,_var(--tw-gradient-stops)_90deg,_var(--tw-gradient-stops)_280deg)]\"}]}]}]}],[\"$\",\"div\",null,{\"id\":\"$undefined\",\"role\":\"status\",\"aria-busy\":true,\"className\":\"mx-auto w-full decoration-primary/6 max-w-3xl page-api-block:ml-0\",\"children\":[\"$\",\"div\",null,{\"className\":\"ring-1 ring-tint-subtle overflow-hidden relative grid rounded-md h-[35px] [max-width:calc(48rem-1px)]\",\"children\":[\"$\",\"div\",null,{\"className\":\"w-full bg-tint grid grid-area-1-1 overflow-hidden [mask:conic-gradient(from_90deg_at_1px_1px,_#0000_90deg,_#0003_0)_calc(50%+1px)_calc(0%+47px)_/_12px_12px]\",\"children\":[\"$\",\"div\",null,{\"className\":\"aspect-square from-tint-solid to-transparent grid-area-1-1 relative origin-[50%_50%] top-[50%] self-stretch bg-transparent will-change-transform animate-[rotateLoop_2s_linear_infinite] [background-image:conic-gradient(from_-90deg_at_50%_50%,_var(--tw-gradient-stops)_0deg,_var(--tw-gradient-stops)_90deg,_var(--tw-gradient-stops)_280deg)]\"}]}]}]}]]}],\"children\":[\"$\",\"div\",null,{\"className\":\"grid [\u0026\u003e*+*]:mt-5 whitespace-pre-wrap\",\"children\":[[\"$\",\"p\",null,{\"className\":\"mx-auto w-full decoration-primary/6 max-w-3xl page-api-block:ml-0\",\"children\":[[[\"$\",\"$47\",\"0\",{\"children\":\"Welcome to my personal blog, where I post about my musings on thinking and engineering lessons I've learned.\"}]]]}],[\"$\",\"p\",null,{\"className\":\"mx-auto w-full decoration-primary/6 max-w-3xl page-api-block:ml-0\",\"children\":[[[\"$\",\"$47\",\"0\",{\"children\":\"All thoughts and opinions are mine and mine alone.\"}]]]}]]}]}],\"$L48\",[\"$\",\"div\",null,{\"className\":\"mx-auto mt-6 page-api-block:ml-0 flex max-w-3xl flex-row flex-wrap items-center gap-4 text-tint contrast-more:text-tint-strong\",\"children\":[[\"$\",\"p\",null,{\"className\":\"mr-auto text-sm\",\"children\":[[[\"$\",\"$47\",\"string-0\",{\"children\":\"Last updated \"}],[\"$\",\"$47\",\"arg-0\",{\"children\":[\"$\",\"$L49\",null,{\"value\":\"2020-06-20T17:49:16.000Z\"}]}]],\"\"]}],[\"$\",\"$L43\",null,{\"className\":\"xl:hidden\",\"pageId\":\"-M5KBfHajq_-kWwmk-K4\"}]]}]]}],[\"$\",\"$L4a\",null,{\"pageId\":\"-M5KBfHajq_-kWwmk-K4\"}]]]}],[\"$\",\"$29\",null,{\"fallback\":null,\"children\":[\"$\",\"$L4b\",null,{\"withSections\":false}]}]]\n"])</script><script>self.__next_f.push([1,"46:[\"$\",\"header\",null,{\"className\":\"max-w-3xl mx-auto mb-6 space-y-3 page-api-block:ml-0\",\"children\":[false,[\"$\",\"h1\",null,{\"className\":\"text-4xl font-bold flex items-center gap-4\",\"children\":[\"$undefined\",\"Keng's Blog\"]}],null]}]\n48:[\"$\",\"div\",null,{\"className\":\"flex flex-col md:flex-row mt-6 gap-2 max-w-3xl mx-auto page-api-block:ml-0 text-tint\",\"children\":[null,[\"$\",\"$L37\",null,{\"href\":\"/blog/ml/running-wandb-on-kubernetes\",\"insights\":{\"type\":\"link_click\",\"link\":{\"target\":{\"kind\":\"page\",\"page\":\"-MAHk614mgFNczHfbmPW\"},\"position\":\"content\"}},\"className\":\"group text-sm p-2.5 flex gap-4 flex-1 flex-row items-center pr-4 border border-tint-subtle rounded straight-corners:rounded-none hover:border-primary text-pretty md:p-4 md:text-base\",\"children\":[[\"$\",\"span\",null,{\"className\":\"flex flex-col flex-1\",\"children\":[[\"$\",\"span\",null,{\"className\":\"text-xs\",\"children\":\"Next\"}],[\"$\",\"span\",null,{\"className\":\"text-tint-strong group-hover:text-primary line-clamp-2\",\"children\":\"Running WandB on Kubernetes\"}]]}],[\"$\",\"$L38\",null,{\"icon\":\"chevron-right\",\"className\":\"hidden size-4 text-tint-subtle contrast-more:text-tint-strong group-hover:text-primary md:block\"}]]}]]}]\n42:null\n"])</script><div hidden id="S:0"><div class="flex grow flex-row-reverse justify-end"><aside class="group/aside hidden xl:flex flex-col basis-56 grow-0 shrink-0 break-anywhere text-tint contrast-more:text-tint-strong sticky lg:top-0 lg:max-h-screen site-header:lg:top-16 site-header:lg:max-h-[calc(100vh_-_4rem)] site-header-sections:lg:top-[6.75rem] site-header-sections:lg:max-h-[calc(100vh_-_6.75rem)] page-api-block:xl:max-2xl:z-10 page-api-block:xl:max-2xl:fixed page-api-block:xl:max-2xl:right-8 page-api-block:xl:max-2xl:w-56 page-api-block:xl:max-2xl:bg-tint/9 page-api-block:xl:max-2xl:contrast-more:bg-tint page-api-block:xl:max-2xl:backdrop-blur-lg page-api-block:xl:max-2xl:border page-api-block:xl:max-2xl:border-tint page-api-block:xl:max-2xl:hover:shadow-lg page-api-block:xl:max-2xl:hover:shadow-tint-12/1 page-api-block:xl:max-2xl:dark:hover:shadow-tint-1/1 page-api-block:xl:max-2xl:rounded-md page-api-block:xl:max-2xl:h-auto page-api-block:xl:max-2xl:my-8 page-api-block:p-2"><div class="hidden page-api-block:xl:max-2xl:flex text-xs tracking-wide font-semibold uppercase flex-row items-center gap-2"><svg style="mask-image:url(https://ka-p.fontawesome.com/releases/v6.6.0/svgs/regular/block-quote.svg?v=2&token=a463935e93);mask-repeat:no-repeat;mask-position:center" class="gb-icon size-3"></svg>On this page<svg style="mask-image:url(https://ka-p.fontawesome.com/releases/v6.6.0/svgs/regular/chevron-down.svg?v=2&token=a463935e93);mask-repeat:no-repeat;mask-position:center" class="gb-icon size-3 opacity-6 ml-auto page-api-block:xl:max-2xl:group-hover/aside:hidden"></svg></div><div class="overflow-y-auto overflow-x-visible flex flex-col shrink pb-12 sticky lg:top:0 site-header:lg:top-16 site-header-sections:lg:top-[6.75rem] gap-6 pt-8 page-api-block:xl:max-2xl:py-0 page-api-block:xl:max-2xl:hidden page-api-block:xl:max-2xl:group-hover/aside:flex"><!--$--><!--/$--><div class="flex flex-col gap-3 sidebar-list-default:px-3 border-t first:border-none border-tint-subtle py-4 first:pt-0 page-api-block:xl:max-2xl:px-3 empty:hidden"><!--$--><div class="flex flex-col gap-3 text-sm mt-2"><div class="flex flex-wrap items-center gap-2"><p>Was this helpful?</p><div class="rounded-full border border-tint-subtle bg-tint-base contrast-more:border-tint-12"><div class="flex"><button class="p-2 first:rounded-l-full first:pl-2.5 last:rounded-r-full last:pr-2.5 hover:bg-primary-hover hover:text-primary-strong disabled:cursor-not-allowed disabled:hover:bg-inherit disabled:hover:text-inherit disabled:dark:hover:text-inherit ring-tint contrast-more:hover:ring-1 disabled:opacity-7 disabled:contrast-more:ring-0" type="button" aria-label="No" title="No"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="9" cy="9" r="9" fill="currentColor" fill-opacity="0.2"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M5 8.25C4.58579 8.25 4.25 7.91421 4.25 7.5V6C4.25 5.58579 4.58579 5.25 5 5.25C5.41421 5.25 5.75 5.58579 5.75 6V7.5C5.75 7.91421 5.41421 8.25 5 8.25ZM4.66782 13.3737C4.87421 13.5572 5.19025 13.5386 5.3737 13.3322C7.30371 11.1609 10.6963 11.1609 12.6263 13.3322C12.8098 13.5386 13.1258 13.5572 13.3322 13.3737C13.5386 13.1902 13.5572 12.8742 13.3737 12.6678C11.0459 10.049 6.9541 10.049 4.6263 12.6678C4.44284 12.8742 4.46143 13.1902 4.66782 13.3737ZM12.25 7.5C12.25 7.91421 12.5858 8.25 13 8.25C13.4142 8.25 13.75 7.91421 13.75 7.5V6C13.75 5.58579 13.4142 5.25 13 5.25C12.5858 5.25 12.25 5.58579 12.25 6V7.5Z" fill="currentColor"></path></svg></button><button class="p-2 first:rounded-l-full first:pl-2.5 last:rounded-r-full last:pr-2.5 hover:bg-primary-hover hover:text-primary-strong disabled:cursor-not-allowed disabled:hover:bg-inherit disabled:hover:text-inherit disabled:dark:hover:text-inherit ring-tint contrast-more:hover:ring-1 disabled:opacity-7 disabled:contrast-more:ring-0" type="button" aria-label="Not sure" title="Not sure"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="9" cy="9" r="9" fill="currentColor" fill-opacity="0.2"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M5 8.25C4.58579 8.25 4.25 7.91421 4.25 7.5V6C4.25 5.58579 4.58579 5.25 5 5.25C5.41421 5.25 5.75 5.58579 5.75 6V7.5C5.75 7.91421 5.41421 8.25 5 8.25ZM4.5 12C4.5 11.7239 4.72386 11.5 5 11.5H13C13.2761 11.5 13.5 11.7239 13.5 12C13.5 12.2761 13.2761 12.5 13 12.5H5C4.72386 12.5 4.5 12.2761 4.5 12ZM12.25 7.5C12.25 7.91421 12.5858 8.25 13 8.25C13.4142 8.25 13.75 7.91421 13.75 7.5V6C13.75 5.58579 13.4142 5.25 13 5.25C12.5858 5.25 12.25 5.58579 12.25 6V7.5Z" fill="currentColor"></path></svg></button><button class="p-2 first:rounded-l-full first:pl-2.5 last:rounded-r-full last:pr-2.5 hover:bg-primary-hover hover:text-primary-strong disabled:cursor-not-allowed disabled:hover:bg-inherit disabled:hover:text-inherit disabled:dark:hover:text-inherit ring-tint contrast-more:hover:ring-1 disabled:opacity-7 disabled:contrast-more:ring-0" type="button" aria-label="Yes, it was!" title="Yes, it was!"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="9" cy="9" r="9" fill="currentColor" fill-opacity="0.2"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M5 8.25C4.58579 8.25 4.25 7.91421 4.25 7.5V6C4.25 5.58579 4.58579 5.25 5 5.25C5.41421 5.25 5.75 5.58579 5.75 6V7.5C5.75 7.91421 5.41421 8.25 5 8.25ZM4.66782 11.6263C4.87421 11.4428 5.19025 11.4614 5.3737 11.6678C7.30371 13.8391 10.6963 13.8391 12.6263 11.6678C12.8098 11.4614 13.1258 11.4428 13.3322 11.6263C13.5386 11.8098 13.5572 12.1258 13.3737 12.3322C11.0459 14.951 6.9541 14.951 4.6263 12.3322C4.44284 12.1258 4.46143 11.8098 4.66782 11.6263ZM12.25 7.5C12.25 7.91421 12.5858 8.25 13 8.25C13.4142 8.25 13.75 7.91421 13.75 7.5V6C13.75 5.58579 13.4142 5.25 13 5.25C12.5858 5.25 12.25 5.58579 12.25 6V7.5Z" fill="currentColor"></path></svg></button></div></div></div></div><!--/$--></div></div><div class="sticky bottom-0 z-10 mt-auto flex flex-col bg-tint-base theme-bold-tint:bg-tint-subtle theme-gradient-tint:bg-gradient-tint theme-gradient:bg-gradient-primary theme-muted:bg-tint-subtle pb-4 page-api-block:xl:max-2xl:hidden page-api-block:xl:max-2xl:pb-0 page-api-block:xl:max-2xl:group-hover/aside:flex page-api-block:xl:max-2xl:bg-transparent"><div class="" data-visual-test="removed"></div></div></aside><main class="relative min-w-0 flex-1 py-8 lg:px-12 break-anywhere page-api-block:xl:max-2xl:pr-0 page-api-block:mx-auto page-api-block:max-w-screen-2xl page-default-width page-has-toc"><header class="max-w-3xl mx-auto mb-6 space-y-3 page-api-block:ml-0"><h1 class="text-4xl font-bold flex items-center gap-4">Keng's Blog</h1></header><!--$--><div class="grid [&>*+*]:mt-5 whitespace-pre-wrap"><p class="mx-auto w-full decoration-primary/6 max-w-3xl page-api-block:ml-0">Welcome to my personal blog, where I post about my musings on thinking and engineering lessons I've learned.</p><p class="mx-auto w-full decoration-primary/6 max-w-3xl page-api-block:ml-0">All thoughts and opinions are mine and mine alone.</p></div><!--/$--><div class="flex flex-col md:flex-row mt-6 gap-2 max-w-3xl mx-auto page-api-block:ml-0 text-tint"><a class="group text-sm p-2.5 flex gap-4 flex-1 flex-row items-center pr-4 border border-tint-subtle rounded straight-corners:rounded-none hover:border-primary text-pretty md:p-4 md:text-base" href="/blog/ml/running-wandb-on-kubernetes"><span class="flex flex-col flex-1"><span class="text-xs">Next</span><span class="text-tint-strong group-hover:text-primary line-clamp-2">Running WandB on Kubernetes</span></span><svg style="mask-image:url(https://ka-p.fontawesome.com/releases/v6.6.0/svgs/regular/chevron-right.svg?v=2&token=a463935e93);mask-repeat:no-repeat;mask-position:center" class="gb-icon hidden size-4 text-tint-subtle contrast-more:text-tint-strong group-hover:text-primary md:block"></svg></a></div><div class="mx-auto mt-6 page-api-block:ml-0 flex max-w-3xl flex-row flex-wrap items-center gap-4 text-tint contrast-more:text-tint-strong"><p class="mr-auto text-sm">Last updated <time data-visual-test="transparent" dateTime="2020-06-20T17:49:16.000Z" title="6/20/2020, 5:49:16 PM">4 years ago</time></p><div class="flex flex-col gap-3 text-sm xl:hidden"><div class="flex flex-wrap items-center gap-2"><p>Was this helpful?</p><div class="rounded-full border border-tint-subtle bg-tint-base contrast-more:border-tint-12"><div class="flex"><button class="p-2 first:rounded-l-full first:pl-2.5 last:rounded-r-full last:pr-2.5 hover:bg-primary-hover hover:text-primary-strong disabled:cursor-not-allowed disabled:hover:bg-inherit disabled:hover:text-inherit disabled:dark:hover:text-inherit ring-tint contrast-more:hover:ring-1 disabled:opacity-7 disabled:contrast-more:ring-0" type="button" aria-label="No" title="No"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="9" cy="9" r="9" fill="currentColor" fill-opacity="0.2"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M5 8.25C4.58579 8.25 4.25 7.91421 4.25 7.5V6C4.25 5.58579 4.58579 5.25 5 5.25C5.41421 5.25 5.75 5.58579 5.75 6V7.5C5.75 7.91421 5.41421 8.25 5 8.25ZM4.66782 13.3737C4.87421 13.5572 5.19025 13.5386 5.3737 13.3322C7.30371 11.1609 10.6963 11.1609 12.6263 13.3322C12.8098 13.5386 13.1258 13.5572 13.3322 13.3737C13.5386 13.1902 13.5572 12.8742 13.3737 12.6678C11.0459 10.049 6.9541 10.049 4.6263 12.6678C4.44284 12.8742 4.46143 13.1902 4.66782 13.3737ZM12.25 7.5C12.25 7.91421 12.5858 8.25 13 8.25C13.4142 8.25 13.75 7.91421 13.75 7.5V6C13.75 5.58579 13.4142 5.25 13 5.25C12.5858 5.25 12.25 5.58579 12.25 6V7.5Z" fill="currentColor"></path></svg></button><button class="p-2 first:rounded-l-full first:pl-2.5 last:rounded-r-full last:pr-2.5 hover:bg-primary-hover hover:text-primary-strong disabled:cursor-not-allowed disabled:hover:bg-inherit disabled:hover:text-inherit disabled:dark:hover:text-inherit ring-tint contrast-more:hover:ring-1 disabled:opacity-7 disabled:contrast-more:ring-0" type="button" aria-label="Not sure" title="Not sure"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="9" cy="9" r="9" fill="currentColor" fill-opacity="0.2"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M5 8.25C4.58579 8.25 4.25 7.91421 4.25 7.5V6C4.25 5.58579 4.58579 5.25 5 5.25C5.41421 5.25 5.75 5.58579 5.75 6V7.5C5.75 7.91421 5.41421 8.25 5 8.25ZM4.5 12C4.5 11.7239 4.72386 11.5 5 11.5H13C13.2761 11.5 13.5 11.7239 13.5 12C13.5 12.2761 13.2761 12.5 13 12.5H5C4.72386 12.5 4.5 12.2761 4.5 12ZM12.25 7.5C12.25 7.91421 12.5858 8.25 13 8.25C13.4142 8.25 13.75 7.91421 13.75 7.5V6C13.75 5.58579 13.4142 5.25 13 5.25C12.5858 5.25 12.25 5.58579 12.25 6V7.5Z" fill="currentColor"></path></svg></button><button class="p-2 first:rounded-l-full first:pl-2.5 last:rounded-r-full last:pr-2.5 hover:bg-primary-hover hover:text-primary-strong disabled:cursor-not-allowed disabled:hover:bg-inherit disabled:hover:text-inherit disabled:dark:hover:text-inherit ring-tint contrast-more:hover:ring-1 disabled:opacity-7 disabled:contrast-more:ring-0" type="button" aria-label="Yes, it was!" title="Yes, it was!"><svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg"><circle cx="9" cy="9" r="9" fill="currentColor" fill-opacity="0.2"></circle><path fill-rule="evenodd" clip-rule="evenodd" d="M5 8.25C4.58579 8.25 4.25 7.91421 4.25 7.5V6C4.25 5.58579 4.58579 5.25 5 5.25C5.41421 5.25 5.75 5.58579 5.75 6V7.5C5.75 7.91421 5.41421 8.25 5 8.25ZM4.66782 11.6263C4.87421 11.4428 5.19025 11.4614 5.3737 11.6678C7.30371 13.8391 10.6963 13.8391 12.6263 11.6678C12.8098 11.4614 13.1258 11.4428 13.3322 11.6263C13.5386 11.8098 13.5572 12.1258 13.3737 12.3322C11.0459 14.951 6.9541 14.951 4.6263 12.3322C4.44284 12.1258 4.46143 11.8098 4.66782 11.6263ZM12.25 7.5C12.25 7.91421 12.5858 8.25 13 8.25C13.4142 8.25 13.75 7.91421 13.75 7.5V6C13.75 5.58579 13.4142 5.25 13 5.25C12.5858 5.25 12.25 5.58579 12.25 6V7.5Z" fill="currentColor"></path></svg></button></div></div></div></div></div></main></div><!--$--><!--/$--></div><script>$RC=function(b,c,e){c=document.getElementById(c);c.parentNode.removeChild(c);var a=document.getElementById(b);if(a){b=a.previousSibling;if(e)b.data="$!",a.setAttribute("data-dgst",e);else{e=b.parentNode;a=b.nextSibling;var f=0;do{if(a&&8===a.nodeType){var d=a.data;if("/$"===d)if(0===f)break;else f--;else"$"!==d&&"$?"!==d&&"$!"!==d||f++}d=a.nextSibling;e.removeChild(a);a=d}while(a);for(;c.firstChild;)e.insertBefore(c.firstChild,a);b.data="$"}b._reactRetry&&b._reactRetry()}};$RC("B:0","S:0")</script></body></html>