cloudflare
tcp/443 tcp/80 tcp/8443
Open service 2606:4700:3036::ac43:dd8e:443 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 200 OK
Date: Mon, 26 Jan 2026 04:28:13 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Age: 0
Cache-Control: public, max-age=0, must-revalidate
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=P8wqr8sP6JmCZvwukuISbsCiMKX1eYUCNZ8lpUvkRvQQiKtrGhdigLOH5XhsLCuobe8%2F77yCL7NVCcAKiozVxZu3LCQJiAnPnMotw4ezVRbKBOvnEBve1OeBWp2t"}]}
Server: cloudflare
strict-transport-security: max-age=63072000
x-vercel-cache: MISS
x-vercel-id: iad1::hkg1::8jmfr-1769401692634-9537dcf12216
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=6,cfOrigin;dur=308
CF-RAY: 9c3d4322ab375642-EWR
alt-svc: h3=":443"; ma=86400
Page title: code4life
<!DOCTYPE html><html lang="en"> <head><!-- Global Metadata --><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><meta name="generator" content="Astro v5.16.6"><!-- Canonical URL --><link rel="canonical" href="https://www.code4life.net/"><!-- Primary Meta Tags --><title>code4life</title><meta name="title" content="code4life"><meta name="description" content="A blogger&developer bash on Shanghai."><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url" content="https://www.code4life.net/"><meta property="og:title" content="code4life"><meta property="og:description" content="A blogger&developer bash on Shanghai."><meta property="og:image" content="https://www.code4life.net/favicon.svg"><!-- Twitter --><meta property="twitter:card" content="summary_large_image"><meta property="twitter:url" content="https://www.code4life.net/"><meta property="twitter:title" content="code4life"><meta property="twitter:description" content="A blogger&developer bash on Shanghai."><meta property="twitter:image" content="https://www.code4life.net/favicon.svg"><script>
const theme = (() => {
if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) {
return localStorage.getItem('theme')
}
if (window.matchMedia('(prefers-color-scheme:dark)').matches) {
return 'dark'
}
return 'light'
})()
if (theme === 'light') {
document.documentElement.classList.remove('dark')
} else {
document.documentElement.classList.add('dark')
}
</script><link rel="stylesheet" href="/_astro/about.DUM8-Xab.css"><script>window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); };
var script = document.createElement('script');
script.defer = true;
script.src = '/_vercel/insights/script.js';
var head = document.querySelector('head');
head.appendChild(script);
</script></head> <body class="bg-orange-50 dark:bg-zinc-900 text-zinc-900 dark:text-zinc-300 break-words leading-6 transition-colors duration-500"> <header class="w-full py-8 sm:py-10 md:py-14 px-2 sm:px-4 md:p-2 backdrop-blur-md"> <div class="mx-auto max-w-5xl"> <nav class="flex items-center justify-between gap-2 sm:gap-4 text-sm sm:text-base"> <div class="flex flex-col items-end"> <a href="/" class="group"> <h2 class="flex items-center font-semibold tracking-tighter font-mplus text-2xl sm:text-3xl md:text-4xl"> <p class="mx-1 sm:mx-2">Code4life</p> <div class="pt-1"><svg width="29" height="27" viewBox="0 0 29 27" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.3733 25.3776C13.2067 25.4779 14.0322 25.5624 14.8728 25.5824C15.9908 25.609 17.1162 25.5432 18.2313 25.469C18.7329 25.4355 19.2317 25.3707 19.7331 25.3389L19.5815 25.3998C19.5321 25.4196 19.4822 25.4181 19.4298 25.4181L19.2449 25.4318L19.3552 25.4659C19.4629 25.5009 19.5647 25.4865 19.6732 25.5093C19.8375 25.5441 20.045 25.5153 20.2146 25.5123C20.5667 25.5064 20.9186 25.5057 21.2707 25.506C22.3434 25.5072 23.4193 25.4893 24.4915 25.5189C25.3583 25.5427 26.2308 25.605 27.0946 25.6788C27.4653 25.7104 27.8463 25.741 28.211 25.8128C28.3596 25.8419 28.499 25.8614 28.6253 25.9477C28.6125 25.9887 28.6198 25.9996 28.5775 26.0215C28.3273 26.1512 27.8805 26.1424 27.5994 26.1643C26.883 26.22 26.1662 26.2594 25.4477 26.2781C23.8628 26.3193 22.2696 26.289 20.6839 26.2882C19.1857 26.2876 17.6874 26.3071 16.1892 26.3032C14.5392 26.2989 12.8892 26.2705 11.2393 26.2656C8.29287 26.257 5.34468 26.3398 2.40047 26.187C1.99707 26.1661 1.59271 26.1476 1.19079 26.107C1.01137 26.0889 0.814677 26.0836 0.643504 26.0299L0.625336 25.997C1.10766 25.6079 6.87663 25.5707 7.81767 25.5532C8.50538 25.5404 9.19191 25.5068 9.87984 25.4997C10.3923 25.4944 10.9048 25.4983 11.4172 25.5003C11.7584 25.5017 12.0986 25.5178 12.4316 25.4656C12.4903 25.4564 12.4804 25.4594 12.5143 25.4925L12.5476 25.4857C12.6043 25.4746 12.6503 25.4766 12.7075 25.4586C12.5456 25.4695 12.5044 25.4787 12.3733 25.3776Z" fill="#B8DDE3"></path><path d="M12.3733 25.3776C
Open service 2606:4700:3036::ac43:dd8e:8443 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 522 <none> Date: Mon, 26 Jan 2026 04:28:32 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19362,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c3d432699f3acfd-AMS alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:3033::6815:190d:80 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 301 Moved Permanently
Date: Mon, 26 Jan 2026 04:28:12 GMT
Content-Length: 0
Connection: close
Location: https://www.code4life.net/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Qd9%2F4myDZCcqp8QOVUKI5g7LIJnNnlL3DoNs8kwBiRDmy7o0WYieFoJ%2BhE7jRehaotoQpg5bQTmJ5o7s37kdzXUrqhjf%2FQEaaZw8GEN%2Bh1ePVv0sRuw3czr7qR0Z"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=7,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c3d43201dea9cd3-AMS
alt-svc: h3=":443"; ma=86400
Open service 172.67.221.142:80 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 301 Moved Permanently
Date: Mon, 26 Jan 2026 04:28:12 GMT
Content-Length: 0
Connection: close
Location: https://www.code4life.net/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=UlYel79UBdYfpb9AQO%2BwMVlLGNDlZ3eiO9aFtqwMe8ZUu67lLlcUEbOi7nx99rKjKBo9lDbRwRF%2FYs%2Bcpd%2BtA3fP73QOea4aoqdtTneFbNje"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=8,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c3d43201e6a907e-AMS
alt-svc: h3=":443"; ma=86400
Open service 172.67.221.142:443 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 200 OK
Date: Mon, 26 Jan 2026 04:28:13 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Age: 0
Cache-Control: public, max-age=0, must-revalidate
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=KxtZRBdrft6vg7AsVlwtQCa%2Bk3SuY7yCokINwvAMgT2ZZocQJAvplkk2g2KWkMg%2F2EyqeXDZwoFEPH3Iw%2FTUF54tEmGBZB4hEgSlSVll7X4m"}]}
Server: cloudflare
strict-transport-security: max-age=63072000
x-vercel-cache: MISS
x-vercel-id: fra1::hkg1::vk2q4-1769401692608-efc3d75a8057
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=11,cfOrigin;dur=484
CF-RAY: 9c3d4322a8a9365b-FRA
alt-svc: h3=":443"; ma=86400
Page title: code4life
<!DOCTYPE html><html lang="en"> <head><!-- Global Metadata --><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><meta name="generator" content="Astro v5.16.6"><!-- Canonical URL --><link rel="canonical" href="https://www.code4life.net/"><!-- Primary Meta Tags --><title>code4life</title><meta name="title" content="code4life"><meta name="description" content="A blogger&developer bash on Shanghai."><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url" content="https://www.code4life.net/"><meta property="og:title" content="code4life"><meta property="og:description" content="A blogger&developer bash on Shanghai."><meta property="og:image" content="https://www.code4life.net/favicon.svg"><!-- Twitter --><meta property="twitter:card" content="summary_large_image"><meta property="twitter:url" content="https://www.code4life.net/"><meta property="twitter:title" content="code4life"><meta property="twitter:description" content="A blogger&developer bash on Shanghai."><meta property="twitter:image" content="https://www.code4life.net/favicon.svg"><script>
const theme = (() => {
if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) {
return localStorage.getItem('theme')
}
if (window.matchMedia('(prefers-color-scheme:dark)').matches) {
return 'dark'
}
return 'light'
})()
if (theme === 'light') {
document.documentElement.classList.remove('dark')
} else {
document.documentElement.classList.add('dark')
}
</script><link rel="stylesheet" href="/_astro/about.DUM8-Xab.css"><script>window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); };
var script = document.createElement('script');
script.defer = true;
script.src = '/_vercel/insights/script.js';
var head = document.querySelector('head');
head.appendChild(script);
</script></head> <body class="bg-orange-50 dark:bg-zinc-900 text-zinc-900 dark:text-zinc-300 break-words leading-6 transition-colors duration-500"> <header class="w-full py-8 sm:py-10 md:py-14 px-2 sm:px-4 md:p-2 backdrop-blur-md"> <div class="mx-auto max-w-5xl"> <nav class="flex items-center justify-between gap-2 sm:gap-4 text-sm sm:text-base"> <div class="flex flex-col items-end"> <a href="/" class="group"> <h2 class="flex items-center font-semibold tracking-tighter font-mplus text-2xl sm:text-3xl md:text-4xl"> <p class="mx-1 sm:mx-2">Code4life</p> <div class="pt-1"><svg width="29" height="27" viewBox="0 0 29 27" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.3733 25.3776C13.2067 25.4779 14.0322 25.5624 14.8728 25.5824C15.9908 25.609 17.1162 25.5432 18.2313 25.469C18.7329 25.4355 19.2317 25.3707 19.7331 25.3389L19.5815 25.3998C19.5321 25.4196 19.4822 25.4181 19.4298 25.4181L19.2449 25.4318L19.3552 25.4659C19.4629 25.5009 19.5647 25.4865 19.6732 25.5093C19.8375 25.5441 20.045 25.5153 20.2146 25.5123C20.5667 25.5064 20.9186 25.5057 21.2707 25.506C22.3434 25.5072 23.4193 25.4893 24.4915 25.5189C25.3583 25.5427 26.2308 25.605 27.0946 25.6788C27.4653 25.7104 27.8463 25.741 28.211 25.8128C28.3596 25.8419 28.499 25.8614 28.6253 25.9477C28.6125 25.9887 28.6198 25.9996 28.5775 26.0215C28.3273 26.1512 27.8805 26.1424 27.5994 26.1643C26.883 26.22 26.1662 26.2594 25.4477 26.2781C23.8628 26.3193 22.2696 26.289 20.6839 26.2882C19.1857 26.2876 17.6874 26.3071 16.1892 26.3032C14.5392 26.2989 12.8892 26.2705 11.2393 26.2656C8.29287 26.257 5.34468 26.3398 2.40047 26.187C1.99707 26.1661 1.59271 26.1476 1.19079 26.107C1.01137 26.0889 0.814677 26.0836 0.643504 26.0299L0.625336 25.997C1.10766 25.6079 6.87663 25.5707 7.81767 25.5532C8.50538 25.5404 9.19191 25.5068 9.87984 25.4997C10.3923 25.4944 10.9048 25.4983 11.4172 25.5003C11.7584 25.5017 12.0986 25.5178 12.4316 25.4656C12.4903 25.4564 12.4804 25.4594 12.5143 25.4925L12.5476 25.4857C12.6043 25.4746 12.6503 25.4766 12.7075 25.4586C12.5456 25.4695 12.5044 25.4787 12.3733 25.3776Z" fill="#B8DDE3"></path><path d="M12.3733 25.3776C
Open service 2606:4700:3033::6815:190d:443 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 200 OK
Date: Mon, 26 Jan 2026 04:28:12 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Age: 0
Cache-Control: public, max-age=0, must-revalidate
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=jnDEL%2FNBqohHOuBDFXV1YdeAh916U3rWq%2FEeUuUhGvArGvYF2JL3WZHaPZHt2mm4gykh0cJr11YwwuhOks4HPmYOKi1NGVm%2FpnXzXaDMrwxMnz%2BPP6TTsTDx5emb"}]}
Server: cloudflare
strict-transport-security: max-age=63072000
x-vercel-cache: MISS
x-vercel-id: fra1::hkg1::vk2q4-1769401692579-623ed48fb5c0
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=7,cfOrigin;dur=224
CF-RAY: 9c3d43228de3d352-FRA
alt-svc: h3=":443"; ma=86400
Page title: code4life
<!DOCTYPE html><html lang="en"> <head><!-- Global Metadata --><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><meta name="generator" content="Astro v5.16.6"><!-- Canonical URL --><link rel="canonical" href="https://www.code4life.net/"><!-- Primary Meta Tags --><title>code4life</title><meta name="title" content="code4life"><meta name="description" content="A blogger&developer bash on Shanghai."><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url" content="https://www.code4life.net/"><meta property="og:title" content="code4life"><meta property="og:description" content="A blogger&developer bash on Shanghai."><meta property="og:image" content="https://www.code4life.net/favicon.svg"><!-- Twitter --><meta property="twitter:card" content="summary_large_image"><meta property="twitter:url" content="https://www.code4life.net/"><meta property="twitter:title" content="code4life"><meta property="twitter:description" content="A blogger&developer bash on Shanghai."><meta property="twitter:image" content="https://www.code4life.net/favicon.svg"><script>
const theme = (() => {
if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) {
return localStorage.getItem('theme')
}
if (window.matchMedia('(prefers-color-scheme:dark)').matches) {
return 'dark'
}
return 'light'
})()
if (theme === 'light') {
document.documentElement.classList.remove('dark')
} else {
document.documentElement.classList.add('dark')
}
</script><link rel="stylesheet" href="/_astro/about.DUM8-Xab.css"><script>window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); };
var script = document.createElement('script');
script.defer = true;
script.src = '/_vercel/insights/script.js';
var head = document.querySelector('head');
head.appendChild(script);
</script></head> <body class="bg-orange-50 dark:bg-zinc-900 text-zinc-900 dark:text-zinc-300 break-words leading-6 transition-colors duration-500"> <header class="w-full py-8 sm:py-10 md:py-14 px-2 sm:px-4 md:p-2 backdrop-blur-md"> <div class="mx-auto max-w-5xl"> <nav class="flex items-center justify-between gap-2 sm:gap-4 text-sm sm:text-base"> <div class="flex flex-col items-end"> <a href="/" class="group"> <h2 class="flex items-center font-semibold tracking-tighter font-mplus text-2xl sm:text-3xl md:text-4xl"> <p class="mx-1 sm:mx-2">Code4life</p> <div class="pt-1"><svg width="29" height="27" viewBox="0 0 29 27" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.3733 25.3776C13.2067 25.4779 14.0322 25.5624 14.8728 25.5824C15.9908 25.609 17.1162 25.5432 18.2313 25.469C18.7329 25.4355 19.2317 25.3707 19.7331 25.3389L19.5815 25.3998C19.5321 25.4196 19.4822 25.4181 19.4298 25.4181L19.2449 25.4318L19.3552 25.4659C19.4629 25.5009 19.5647 25.4865 19.6732 25.5093C19.8375 25.5441 20.045 25.5153 20.2146 25.5123C20.5667 25.5064 20.9186 25.5057 21.2707 25.506C22.3434 25.5072 23.4193 25.4893 24.4915 25.5189C25.3583 25.5427 26.2308 25.605 27.0946 25.6788C27.4653 25.7104 27.8463 25.741 28.211 25.8128C28.3596 25.8419 28.499 25.8614 28.6253 25.9477C28.6125 25.9887 28.6198 25.9996 28.5775 26.0215C28.3273 26.1512 27.8805 26.1424 27.5994 26.1643C26.883 26.22 26.1662 26.2594 25.4477 26.2781C23.8628 26.3193 22.2696 26.289 20.6839 26.2882C19.1857 26.2876 17.6874 26.3071 16.1892 26.3032C14.5392 26.2989 12.8892 26.2705 11.2393 26.2656C8.29287 26.257 5.34468 26.3398 2.40047 26.187C1.99707 26.1661 1.59271 26.1476 1.19079 26.107C1.01137 26.0889 0.814677 26.0836 0.643504 26.0299L0.625336 25.997C1.10766 25.6079 6.87663 25.5707 7.81767 25.5532C8.50538 25.5404 9.19191 25.5068 9.87984 25.4997C10.3923 25.4944 10.9048 25.4983 11.4172 25.5003C11.7584 25.5017 12.0986 25.5178 12.4316 25.4656C12.4903 25.4564 12.4804 25.4594 12.5143 25.4925L12.5476 25.4857C12.6043 25.4746 12.6503 25.4766 12.7075 25.4586C12.5456 25.4695 12.5044 25.4787 12.3733 25.3776Z" fill="#B8DDE3"></path><path d="M12.3733 25.3776C
Open service 104.21.25.13:8443 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 522 <none> Date: Mon, 26 Jan 2026 04:28:32 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19453,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c3d4325eb0937fe-FRA alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:3036::ac43:dd8e:80 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 301 Moved Permanently
Date: Mon, 26 Jan 2026 04:28:12 GMT
Content-Length: 0
Connection: close
Location: https://www.code4life.net/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=1emVVa%2FXezzLjrll5DLngl0CdfHfc%2B8oan8v8RQa%2BikF69QGUNGPSYR2F2kwfoIvnCRgug89n%2FRh3JvFRqJ6YtHdSxPKe8xlQo0NhXxQWxiLyRQzic3ClJNovvlJ"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=8,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c3d431fbf4c1dc1-FRA
alt-svc: h3=":443"; ma=86400
Open service 172.67.221.142:8443 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 522 <none> Date: Mon, 26 Jan 2026 04:28:32 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19357,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c3d4325e91ad06a-LHR alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:3033::6815:190d:8443 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 522 <none> Date: Mon, 26 Jan 2026 04:28:32 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19549,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c3d4325dee919c7-EWR alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 104.21.25.13:443 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 200 OK
Date: Mon, 26 Jan 2026 04:28:13 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
Age: 0
Cache-Control: public, max-age=0, must-revalidate
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Hyne6%2BKvzw4Lmy58SQYfAU%2Fa57qw%2FnnTbW%2BCemr7f2CIu%2BPrpzwmeklnRk%2FtL3fEuzyQH78E7Ji0HvT5G0fWRoEeD0XuoqZsifMZMdrNd1Ey"}]}
Server: cloudflare
strict-transport-security: max-age=63072000
x-vercel-cache: MISS
x-vercel-id: fra1::hkg1::trjf8-1769401692644-ac7bd79d943f
cf-cache-status: DYNAMIC
vary: accept-encoding
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=4,cfOrigin;dur=213
CF-RAY: 9c3d43230eedd25c-FRA
alt-svc: h3=":443"; ma=86400
Page title: code4life
<!DOCTYPE html><html lang="en"> <head><!-- Global Metadata --><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><meta name="generator" content="Astro v5.16.6"><!-- Canonical URL --><link rel="canonical" href="https://www.code4life.net/"><!-- Primary Meta Tags --><title>code4life</title><meta name="title" content="code4life"><meta name="description" content="A blogger&developer bash on Shanghai."><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url" content="https://www.code4life.net/"><meta property="og:title" content="code4life"><meta property="og:description" content="A blogger&developer bash on Shanghai."><meta property="og:image" content="https://www.code4life.net/favicon.svg"><!-- Twitter --><meta property="twitter:card" content="summary_large_image"><meta property="twitter:url" content="https://www.code4life.net/"><meta property="twitter:title" content="code4life"><meta property="twitter:description" content="A blogger&developer bash on Shanghai."><meta property="twitter:image" content="https://www.code4life.net/favicon.svg"><script>
const theme = (() => {
if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) {
return localStorage.getItem('theme')
}
if (window.matchMedia('(prefers-color-scheme:dark)').matches) {
return 'dark'
}
return 'light'
})()
if (theme === 'light') {
document.documentElement.classList.remove('dark')
} else {
document.documentElement.classList.add('dark')
}
</script><link rel="stylesheet" href="/_astro/about.DUM8-Xab.css"><script>window.va = window.va || function () { (window.vaq = window.vaq || []).push(arguments); };
var script = document.createElement('script');
script.defer = true;
script.src = '/_vercel/insights/script.js';
var head = document.querySelector('head');
head.appendChild(script);
</script></head> <body class="bg-orange-50 dark:bg-zinc-900 text-zinc-900 dark:text-zinc-300 break-words leading-6 transition-colors duration-500"> <header class="w-full py-8 sm:py-10 md:py-14 px-2 sm:px-4 md:p-2 backdrop-blur-md"> <div class="mx-auto max-w-5xl"> <nav class="flex items-center justify-between gap-2 sm:gap-4 text-sm sm:text-base"> <div class="flex flex-col items-end"> <a href="/" class="group"> <h2 class="flex items-center font-semibold tracking-tighter font-mplus text-2xl sm:text-3xl md:text-4xl"> <p class="mx-1 sm:mx-2">Code4life</p> <div class="pt-1"><svg width="29" height="27" viewBox="0 0 29 27" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M12.3733 25.3776C13.2067 25.4779 14.0322 25.5624 14.8728 25.5824C15.9908 25.609 17.1162 25.5432 18.2313 25.469C18.7329 25.4355 19.2317 25.3707 19.7331 25.3389L19.5815 25.3998C19.5321 25.4196 19.4822 25.4181 19.4298 25.4181L19.2449 25.4318L19.3552 25.4659C19.4629 25.5009 19.5647 25.4865 19.6732 25.5093C19.8375 25.5441 20.045 25.5153 20.2146 25.5123C20.5667 25.5064 20.9186 25.5057 21.2707 25.506C22.3434 25.5072 23.4193 25.4893 24.4915 25.5189C25.3583 25.5427 26.2308 25.605 27.0946 25.6788C27.4653 25.7104 27.8463 25.741 28.211 25.8128C28.3596 25.8419 28.499 25.8614 28.6253 25.9477C28.6125 25.9887 28.6198 25.9996 28.5775 26.0215C28.3273 26.1512 27.8805 26.1424 27.5994 26.1643C26.883 26.22 26.1662 26.2594 25.4477 26.2781C23.8628 26.3193 22.2696 26.289 20.6839 26.2882C19.1857 26.2876 17.6874 26.3071 16.1892 26.3032C14.5392 26.2989 12.8892 26.2705 11.2393 26.2656C8.29287 26.257 5.34468 26.3398 2.40047 26.187C1.99707 26.1661 1.59271 26.1476 1.19079 26.107C1.01137 26.0889 0.814677 26.0836 0.643504 26.0299L0.625336 25.997C1.10766 25.6079 6.87663 25.5707 7.81767 25.5532C8.50538 25.5404 9.19191 25.5068 9.87984 25.4997C10.3923 25.4944 10.9048 25.4983 11.4172 25.5003C11.7584 25.5017 12.0986 25.5178 12.4316 25.4656C12.4903 25.4564 12.4804 25.4594 12.5143 25.4925L12.5476 25.4857C12.6043 25.4746 12.6503 25.4766 12.7075 25.4586C12.5456 25.4695 12.5044 25.4787 12.3733 25.3776Z" fill="#B8DDE3"></path><path d="M12.3733 25.3776C
Open service 104.21.25.13:80 · www.code4life.net
2026-01-26 04:28
HTTP/1.1 301 Moved Permanently
Date: Mon, 26 Jan 2026 04:28:12 GMT
Content-Length: 0
Connection: close
Location: https://www.code4life.net/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=cmE8E%2BXH9g82%2BhZRAJ2tOPdfDl3H1ZkLY9dP%2BQoETUoJM1SkUmETK1S62JCV1BbS7JW5nuLws9qr5CIyaPyJEcKU87Tb6Pe%2BddXUfYHY%2FKbR"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=8,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c3d431f59de7310-FRA
alt-svc: h3=":443"; ma=86400
Open service 104.21.25.13:8443 · code4life.net
2026-01-24 23:18
HTTP/1.1 522 <none> Date: Sat, 24 Jan 2026 23:18:33 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19540,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c333fb2ccad4200-BOM alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:3033::6815:190d:8443 · code4life.net
2026-01-24 23:18
HTTP/1.1 522 <none> Date: Sat, 24 Jan 2026 23:18:33 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19754,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c333fb29d587093-FRA alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 172.67.221.142:8443 · code4life.net
2026-01-24 23:18
HTTP/1.1 522 <none> Date: Sat, 24 Jan 2026 23:18:33 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19716,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c333fb28f534356-EWR alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:3036::ac43:dd8e:8443 · code4life.net
2026-01-24 23:18
HTTP/1.1 522 <none> Date: Sat, 24 Jan 2026 23:18:33 GMT Content-Type: text/plain; charset=UTF-8 Content-Length: 15 Connection: close Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 01 Jan 1970 00:00:01 GMT Referrer-Policy: same-origin Server-Timing: cfEdge;dur=19385,cfOrigin;dur=0 X-Frame-Options: SAMEORIGIN Server: cloudflare CF-RAY: 9c333fb23f6de90a-LHR alt-svc: h3=":8443"; ma=86400 error code: 522
Open service 2606:4700:3033::6815:190d:443 · code4life.net
2026-01-24 23:18
HTTP/1.1 308 Permanent Redirect
Date: Sat, 24 Jan 2026 23:18:13 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: close
Cache-Control: public, max-age=0, must-revalidate
location: https://www.code4life.net/
refresh: 0;url=https://www.code4life.net/
Server: cloudflare
strict-transport-security: max-age=63072000
x-vercel-id: lhr1::wwlv8-1769296693285-35493b4d1712
cf-cache-status: DYNAMIC
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=14,cfOrigin;dur=135
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=jc33qXH4hkadTiL1zH64a%2BNJ1BAAydJ6LkgNLsaqVCCzWuh487IXw1CTRQnRp8Cp%2FJ9C52xKX9gfmhZBwT5GJrAzfHU42TmT5xWO66cpRrON0Uv%2FYC5bt9A%3D"}]}
CF-RAY: 9c333facde6488a7-LHR
alt-svc: h3=":443"; ma=86400
Redirecting...
Open service 2606:4700:3033::6815:190d:80 · code4life.net
2026-01-24 23:18
HTTP/1.1 301 Moved Permanently
Date: Sat, 24 Jan 2026 23:18:13 GMT
Content-Length: 0
Connection: close
Location: https://code4life.net/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=Rb5nI%2FX4dzd6%2BFVhlOAwUMBJhPypuWzADgKhzMka7EoSGiAPO177gWuyjb%2F0jE03z4qkQNvSyhifG4EdQsXTNSuAShnjxRIIzkywkyM6u9EGNF1gamgiBVU%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=14,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c333fabdbcf9f24-FRA
alt-svc: h3=":443"; ma=86400
Open service 104.21.25.13:443 · code4life.net
2026-01-24 23:18
HTTP/1.1 308 Permanent Redirect
Date: Sat, 24 Jan 2026 23:18:13 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: close
Cache-Control: public, max-age=0, must-revalidate
location: https://www.code4life.net/
refresh: 0;url=https://www.code4life.net/
Server: cloudflare
strict-transport-security: max-age=63072000
x-vercel-id: fra1::jwrpz-1769296693148-0f480914d9eb
cf-cache-status: DYNAMIC
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=7,cfOrigin;dur=21
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=m2XbQoR%2Bo2G9MsrX0XTqGaZrcVmqfPcEz5wZ2rbXuIfAwa2CqMz42D2JEKBoZbSIQ%2BQQ%2F65Wp2Y6jJ4Dpk8jCxkv3G2AwrpUG6qmzfA%3D"}]}
CF-RAY: 9c333fac0b9ed36e-FRA
alt-svc: h3=":443"; ma=86400
Redirecting...
Open service 172.67.221.142:443 · code4life.net
2026-01-24 23:18
HTTP/1.1 308 Permanent Redirect
Date: Sat, 24 Jan 2026 23:18:13 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: close
Cache-Control: public, max-age=0, must-revalidate
location: https://www.code4life.net/
refresh: 0;url=https://www.code4life.net/
Server: cloudflare
strict-transport-security: max-age=63072000
x-vercel-id: sin1::w8d79-1769296693395-217e634a974b
cf-cache-status: DYNAMIC
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=6,cfOrigin;dur=26
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=HIod30yNDOgA5vl1jy1Ls5SHeifUOEsUPVmj9Xlw%2BT%2BOohOVQ8MvnReYb%2BP0YqoF61TdCfMSw7HRDH1zAew%2FM%2FKhuzbd7HHposa0CQM%3D"}]}
CF-RAY: 9c333fad9866fd67-SIN
alt-svc: h3=":443"; ma=86400
Redirecting...
Open service 2606:4700:3036::ac43:dd8e:443 · code4life.net
2026-01-24 23:18
HTTP/1.1 308 Permanent Redirect
Date: Sat, 24 Jan 2026 23:18:13 GMT
Content-Type: text/plain
Transfer-Encoding: chunked
Connection: close
Cache-Control: public, max-age=0, must-revalidate
location: https://www.code4life.net/
refresh: 0;url=https://www.code4life.net/
Server: cloudflare
strict-transport-security: max-age=63072000
x-vercel-id: fra1::mct54-1769296693122-e19a1b3c0d34
cf-cache-status: DYNAMIC
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfCacheStatus;desc="DYNAMIC"
Server-Timing: cfEdge;dur=22,cfOrigin;dur=16
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=JEXS9uk%2BuundDixBQdAjkbhftKUHAr0xU8V0GSqf7IUx1okgJjV3M%2Fa7Gocj380qXeMWJ%2FBqs%2FJJu9fFJ4JIw8tcHPrkbbg8bjC5ngKJXAdpPB%2Brp2LrWMw%3D"}]}
CF-RAY: 9c333fabce965d9a-FRA
alt-svc: h3=":443"; ma=86400
Redirecting...
Open service 104.21.25.13:80 · code4life.net
2026-01-24 23:18
HTTP/1.1 301 Moved Permanently
Date: Sat, 24 Jan 2026 23:18:13 GMT
Content-Length: 0
Connection: close
Location: https://code4life.net/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=u2wxBBE6K4ccozQP52VvBsxL760VyzxV6OOy0HgJhiiAqqWa8MITuVitYx5FKo74Wl0Ed7pl%2Bu0VsQh5bRq13RhHD7Gp1d4wxmi9pLc%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=9,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c333fabaae3c099-AMS
alt-svc: h3=":443"; ma=86400
Open service 172.67.221.142:80 · code4life.net
2026-01-24 23:18
HTTP/1.1 301 Moved Permanently
Date: Sat, 24 Jan 2026 23:18:13 GMT
Content-Length: 0
Connection: close
Location: https://code4life.net/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=K%2BbU51PEvV0Ip1kHVzuco5vS48l5GMeCT1mlV03s2bUz0lzN5d%2F6rz28GOxkE%2BSJ%2B93FVUJAZGT7yFlOdL2XTjSLkrLRzuEWQc3GxmI%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=12,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c333fab9ed41987-FRA
alt-svc: h3=":443"; ma=86400
Open service 2606:4700:3036::ac43:dd8e:80 · code4life.net
2026-01-24 23:18
HTTP/1.1 301 Moved Permanently
Date: Sat, 24 Jan 2026 23:18:13 GMT
Content-Length: 0
Connection: close
Location: https://code4life.net/
Report-To: {"group":"cf-nel","max_age":604800,"endpoints":[{"url":"https://a.nel.cloudflare.com/report/v4?s=T%2BgynOQw9OefPapsWzCR9ikjxyYl0%2BlEDsjKH6arJ336GdlUtUW%2BcjpfZGTeKknTkvaiYchP%2BXimzQVuT0Yufq5Zm0QxmKnqEkeEgKFTkfQhAINmAWM6iHg%3D"}]}
Nel: {"report_to":"cf-nel","success_fraction":0.0,"max_age":604800}
Server-Timing: cfEdge;dur=9,cfOrigin;dur=0
Server: cloudflare
CF-RAY: 9c333fab8c27dccc-FRA
alt-svc: h3=":443"; ma=86400