PageSourceSearch

https://ntsd.dev/

html ntsd.dev collected 2026-10-03 23:20:17 UTC 44,680 bytes, 2 lines download raw bytes

1<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta content="IE=edge" http-equiv="X-UA-Compatible"><meta content="xBT4GhYoi5qRD5tr338pgPM5OWHHIDR6mNg1a3euekI" name="google-site-verification"><meta content="width=device-width,initial-scale=1" name="viewport"><meta name="keywords" content="Programming, Web Development, Coding, Artificial Intelligence, Machine Learning, Jirawat Boonkumnerd"><meta name="theme-color" content="#000000"><meta content="script-src 'self' 'unsafe-inline' giscus.app *.jsdelivr.net *.googletagmanager.com *.google-analytics.com; object-src 'none';base-uri 'none';" http-equiv="Content-Security-Policy"><title>Jirawat Boonkumnerd | A software engineer who loves coding.</title><meta name="generator" content="Jekyll v4.3.3"><meta property="og:title" content="Jirawat Boonkumnerd"><meta property="og:locale" content="en_US"><meta name="description" content="A software engineer who loves coding."><meta property="og:description" content="A software engineer who loves coding."><link rel="canonical" href="https://ntsd.dev/"><meta property="og:url" content="https://ntsd.dev/"><meta property="og:site_name" content="Jirawat Boonkumnerd"><meta property="og:image" content="https://ntsd.dev/pwa/icons/512.png"><meta property="og:type" content="website"><meta name="twitter:card" content="summary_large_image"><meta property="twitter:image" content="https://ntsd.dev/pwa/icons/512.png"><meta property="twitter:title" content="Jirawat Boonkumnerd"><meta property="fb:app_id" content="1034059654428260"><style>*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}h1,h2{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0;padding:0}button{text-transform:none}[type=button],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}h1,h2,hr,p{margin:0}svg{display:block;vertical-align:middle}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:100%){.container{max-width:100%}}.sticky{position:sticky}.top-0{top:0}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-8{margin-bottom:2rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}
1.flex{display:flex}.grid{display:grid}.h-6{height:1.5rem}.h-7{height:1.75rem}.max-h-0{max-height:0}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-full{width:100%}.flex-grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.overflow-hidden{overflow:hidden}.border-b-\[1px\]{border-bottom-width:1px}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.fill-current{fill:currentColor}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-24{padding-bottom:6rem;padding-top:6rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pt-6{padding-top:1.5rem}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);
1--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}html{scroll-timeline:--page-scroll block;font-family:SFMono-Regular,Consolas,Menlo,Monaco,Liberation Mono,Courier New,monospace;scroll-behavior:smooth}*,:after,:before{border:0 solid #e5e7eb;box-sizing:border-box}:after,:before{--tw-content:""}html{-webkit-text-size-adjust:100%;font-feature-settings:normal;font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-variation-settings:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{line-height:inherit;margin:0}hr{border-top-width:1px;color:inherit;height:0}h1,h2{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button{font-feature-settings:inherit;color:inherit;font-family:inherit;font-size:100%;font-variation-settings:inherit;font-weight:inherit;line-height:inherit;margin:0;padding:0}button{text-transform:none}[type=button],button{-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}h1,h2,hr,p{margin:0}svg{display:block;vertical-align:middle}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: }.container{width:100%}@media (min-width:100%){.container{max-width:100%}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.sticky{position:sticky}.top-0{top:0}.z-50{z-index:50}.mx-auto{margin-left:auto;margin-right:auto}.mb-8{margin-bottom:2rem}.mt-1{margin-top:.25rem}.mt-10{margin-top:2.5rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.mt-8{margin-top:2rem}.mt-auto{margin-top:auto}.flex{display:flex}.grid{display:grid}.h-6{height:1.5rem}.h-7{height:1.75rem}.max-h-0{max-height:0}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-full{width:100%}.flex-grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-2{gap:.5rem}.gap-4{gap:1rem}.gap-8{gap:2rem}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.overflow-hidden{overflow:hidden}.border-b-\[1px\]{border-bottom-width:1px}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity))}.fill-current{fill:currentColor}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-24{padding-bottom:6rem;padding-top:6rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-8{padding-bottom:2rem;padding-top:2rem}.pt-6{padding-top:1.5rem}.text-center{text-align:center}.text-2xl{font-size:1.5rem;line-height:2rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-light{font-weight:300}.font-semibold{font-weight:600}.capitalize{text-transform:capitalize}.text-gray-100{--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(107 114 128/var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity))}.text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity))}.shadow-md{--tw-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1);
1--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}html{scroll-timeline:--page-scroll block;font-family:SFMono-Regular,Consolas,Menlo,Monaco,Liberation Mono,Courier New,monospace;scroll-behavior:smooth}@media (min-width:1024px){.lg\:mt-0{margin-top:0}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:max-h-screen{max-height:100vh}.lg\:w-auto{width:auto}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:flex-row{flex-direction:row}.lg\:items-center{align-items:center}.lg\:justify-start{justify-content:flex-start}.lg\:justify-between{justify-content:space-between}.lg\:gap-8{gap:2rem}.lg\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.lg\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.lg\:border-b-0{border-bottom-width:0}.lg\:px-16{padding-left:4rem;padding-right:4rem}.lg\:px-6{padding-left:1.5rem;padding-right:1.5rem}.lg\:py-4{padding-bottom:1rem;padding-top:1rem}.lg\:pt-0{padding-top:0}.lg\:text-right{text-align:right}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}.lg\:shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);
1--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}}</style>
1<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","description":"A software engineer who loves coding.","headline":"Jirawat Boonkumnerd","image":"https://ntsd.dev/pwa/icons/512.png","name":"Jirawat Boonkumnerd","publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://ntsd.dev/pwa/icons/icon-min.svg"}},"sameAs":["https://github.com/ntsd","https://www.linkedin.com/in/ntsd","https://facebook.com/ntsd.dev"],"url":"https://ntsd.dev/"}</script>
1<meta property="og:type" content="website"><link rel="stylesheet" href="/assets/css/style.css" as="style" onload="this.media='all'" media="print"><link rel="manifest" href="/pwa/manifest.json"><link rel="icon" href="/pwa/icons/icon-min.svg"><link rel="apple-touch-icon" href="/pwa/icons/icon-min.svg"></head><body><nav class="bg-white shadow-md sticky top-0 z-50 transition-transform duration-300 transform" id="navbar"><div class="container mx-auto py-3 px-4 lg:py-4 flex flex-col lg:flex-row lg:justify-between lg:items-center"><div class="flex flex-col lg:flex-row justify-between lg:items-center w-full"><div class="flex items-center justify-between w-full lg:w-auto"><div><a class="text-lg lg:text-2xl font-bold text-gray-800 hover:text-gray-700" href="/">NTSD BLOG</a></div><div class="flex lg:hidden"><button aria-label="toggle menu" class="text-gray-500 hover:text-gray-600 focus:outline-none focus:text-gray-600" id="nav-toggle" type="button"><svg class="w-6 h-6 fill-current" viewBox="0 0 24 24"><path d="M4 5h16a1 1 0 0 1 0 2H4a1 1 0 1 1 0-2zm0 6h16a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2zm0 6h16a1 1 0 0 1 0 2H4a1 1 0 0 1 0-2z" fill-rule="evenodd"></path></svg></button></div></div><div class="flex-grow flex flex-col justify-between text-gray-600 capitalize lg:space-x-4 lg:px-16 lg:flex-row lg:items-center overflow-hidden max-h-0 lg:max-h-screen transition-all duration-500" id="menu"><div class="flex flex-col lg:flex-row gap-4 mt-4 lg:mt-0 justify-start"><a class="hover:text-gray-900" href="/">HOME</a> <a class="hover:text-gray-900" href="/blog/">BLOG</a> <a class="hover:text-gray-900" href="/projects/">PROJECTS</a> <a class="hover:text-gray-900" href="https://tools.ntsd.dev">TOOLS</a> <a class="hover:text-gray-900" href="/tags/">TAGS</a> <a class="hover:text-gray-900" href="/about/">ABOUT</a></div><div class="flex justify-center pt-6 lg:flex lg:pt-0"><div class="flex space-x-4"><a aria-label="RSS" class="text-gray-600 hover:text-gray-400" href="/feed.xml" rel="noopener noreferrer" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="w-7 h-7 fill-current" viewBox="0 0 20 20"><path d="M5 3a1 1 0 000 2c5.523 0 10 4.477 10 10a1 1 0 102 0C17 8.373 11.627 3 5 3z"></path><path d="M4 9a1 1 0 011-1 7 7 0 017 7 1 1 0 11-2 0 5 5 0 00-5-5 1 1 0 01-1-1zM3 15a2 2 0 114 0 2 2 0 01-4 0z"></path></svg> </a><a aria-label="Github" class="text-gray-600 hover:text-gray-400" href="https://github.com/ntsd" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12.026 2C7.13295 1.99937 2.96183 5.54799 2.17842 10.3779C1.395 15.2079 4.23061 19.893 8.87302 21.439C9.37302 21.529 9.55202 21.222 9.55202 20.958C9.55202 20.721 9.54402 20.093 9.54102 19.258C6.76602 19.858 6.18002 17.92 6.18002 17.92C5.99733 17.317 5.60459 16.7993 5.07302 16.461C4.17302 15.842 5.14202 15.856 5.14202 15.856C5.78269 15.9438 6.34657 16.3235 6.66902 16.884C6.94195 17.3803 7.40177 17.747 7.94632 17.9026C8.49087 18.0583 9.07503 17.99 9.56902 17.713C9.61544 17.207 9.84055 16.7341 10.204 16.379C7.99002 16.128 5.66202 15.272 5.66202 11.449C5.64973 10.4602 6.01691 9.5043 6.68802 8.778C6.38437 7.91731 6.42013 6.97325 6.78802 6.138C6.78802 6.138 7.62502 5.869 9.53002 7.159C11.1639 6.71101 12.8882 6.71101 14.522 7.159C16.428 5.868 17.264 6.138 17.264 6.138C17.6336 6.97286 17.6694 7.91757 17.364 8.778C18.0376 9.50423 18.4045 10.4626 18.388 11.453C18.388 15.286 16.058 16.128 13.836 16.375C14.3153 16.8651 14.5612 17.5373 14.511 18.221C14.511 19.555 14.499 20.631 14.499 20.958C14.499 21.225 14.677 21.535 15.186 21.437C19.8265 19.8884 22.6591 15.203 21.874 10.3743C21.089 5.54565 16.9181 1.99888 12.026 2Z"></path></svg> </a><a aria-label="Linkedin" class="text-gray-600 hover:text-gray-400" href="https://www.linkedin.com/in/ntsd" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M13 21H9V9H13V11C13.8526 9.91525 15.1456 9.26857 16.525 9.237C19.0056 9.25077 21.0072 11.2694 21 13.75V21H17V14.25C16.84 13.1326 15.8818 12.3036 14.753 12.306C14.2593 12.3216 13.7932 12.5378 13.4624 12.9046C13.1316 13.2715 12.9646 13.7573 13 14.25V21ZM7 21H3V9H7V21ZM5 7C3.89543 7 3 6.10457 3 5C3 3.89543 3.89543 3 5 3C6.10457 3 7 3.89543 7 5C7 5.53043 6.78929 6.03914 6.41421 6.41421C6.03914 6.78929 5.53043 7 5 7Z"></path></svg> </a><a aria-label="Webring" class="text-gray-600 hover:text-gray-400" href="https://webring.wonderful.software#ntsd.dev" rel="noopener noreferrer" target="_blank"><svg class="mt-1 w-6 h-6 fill-current" fill="none" viewBox="0 0 416 416" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="M53 128.8l-16-8.2a192 192 0 1094.7-88.9l7.1 16.6A174 174 0 1153 128.8z" fill-rule="evenodd" fill="currentColor"></path><path d="M94.7 92.3L82 126.5 62.6 95.7l-36.4-1.4 23.3-28-9.9-35.1 33.9 13.5 30.3-20.3-2.4 36.4L130 83.3l-35.3 9z" fill="currentColor"></path></svg></a></div></div></div></div></div></nav>
1<script type="text/javascript" async="">var toggle = document.querySelector("#nav-toggle"); var menu = document.querySelector("#menu"); var opening = false; toggle.addEventListener("click", function (e) { if (opening) { opening = false; menu.classList.remove("max-h-screen"); } else { opening = true; menu.classList.add("max-h-screen"); } }); var navbar = document.querySelector("#navbar"); var prevScrollPos = window.pageYOffset; window.onscroll = function () { var curScrollPos = window.pageYOffset; if (curScrollPos > navbar.offsetHeight && !opening) { if (prevScrollPos > curScrollPos) { navbar.classList.remove("-translate-y-full"); } else { navbar.classList.add("-translate-y-full"); } prevScrollPos = curScrollPos; } };</script>
1<section id="hero" class="container mx-auto px-4 py-24"><h1 class="text-5xl font-semibold text-gray-900">Welcome!</h1><p class="text-xl text-gray-600 mt-4">Explore my blog posts and projects.</p></section><hr><section id="blog" class="container mx-auto px-4 py-24"><a href="/blog/"><h2 class="text-4xl font-semibold text-gray-900 mb-8">Blog</h2></a><div class="grid grid-cols-1 lg:grid-cols-2 gap-8"><div class="lg:py-4 lg:px-6 mx-auto bg-white lg:shadow-lg flex flex-col w-full"><div class="flex items-center justify-between"><time class="text-xs font-light text-gray-600" datetime=" 2024-11-23">November 23, 2024</time> <a class="px-2 py-1 text-xs font-bold text-gray-100 transition-colors duration-200 transform bg-gray-800 cursor-pointer hover:bg-gray-600" href="/categories/#Software Development" title="Software Development">Software Development</a></div><a class="mt-4 hover:underline" href="/node-stream-pipe-and-transform/"><div class="text-xl font-bold text-gray-900 hover:text-gray-800">How to use Stream Pipe and Transform in Node.js</div><p class="font-bold text-gray-500">Example use of stream pipe and transform in Node.js. Useful for processing large data and passing it through another process.</p></a><div class="flex items-center justify-end mt-auto"><div class="flex items-center mt-8 text-sm"></div></div></div><hr class="lg:hidden"><div class="lg:py-4 lg:px-6 mx-auto bg-white lg:shadow-lg flex flex-col w-full"><div class="flex items-center justify-between"><time class="text-xs font-light text-gray-600" datetime=" 2024-07-29">July 29, 2024</time> <a class="px-2 py-1 text-xs font-bold text-gray-100 transition-colors duration-200 transform bg-gray-800 cursor-pointer hover:bg-gray-600" href="/categories/#Software Development" title="Software Development">Software Development</a></div><a class="mt-4 hover:underline" href="/cloudflare-warp-multiple-profiles/"><div class="text-xl font-bold text-gray-900 hover:text-gray-800">Switch between personal and work Cloudflare Warp profiles</div><p class="font-bold text-gray-500">A guide to setting up multiple profiles for Cloudflare Warp on a single device</p></a><div class="flex items-center justify-end mt-auto"><div class="flex items-center mt-8 text-sm"></div></div></div><hr class="lg:hidden"><div class="lg:py-4 lg:px-6 mx-auto bg-white lg:shadow-lg flex flex-col w-full"><div class="flex items-center justify-between"><time class="text-xs font-light text-gray-600" datetime=" 2023-12-22">December 22, 2023</time> <a class="px-2 py-1 text-xs font-bold text-gray-100 transition-colors duration-200 transform bg-gray-800 cursor-pointer hover:bg-gray-600" href="/categories/#Software Development" title="Software Development">Software Development</a></div><a class="mt-4 hover:underline" href="/secure-home-server-by-cloudflare-zero-trust-and-tunnel/"><div class="text-xl font-bold text-gray-900 hover:text-gray-800">Secure home server by Cloudflare Zero Trust and Cloudflare Tunnel</div><p class="font-bold text-gray-500">Running a secure home server by Cloudflare Zero Trust, Cloudflare Tunnel, and connecting from the public internet by Cloudflare Warp Client.</p></a><div class="flex items-center justify-end mt-auto"><div class="flex items-center mt-8 text-sm"></div></div></div><hr class="lg:hidden"><div class="lg:py-4 lg:px-6 mx-auto bg-white lg:shadow-lg flex flex-col w-full"><div class="flex items-center justify-between"><time class="text-xs font-light text-gray-600" datetime=" 2023-09-22">September 22, 2023</time> <a class="px-2 py-1 text-xs font-bold text-gray-100 transition-colors duration-200 transform bg-gray-800 cursor-pointer hover:bg-gray-600" href="/categories/#Software Development" title="Software Development">Software Development</a></div><a class="mt-4 hover:underline" href="/deploy-astro-on-clouflare-page/"><div class="text-xl font-bold text-gray-900 hover:text-gray-800">Deploy Astro Hybrid rendering site on Cloudflare Pages</div><p class="font-bold text-gray-500">A guild to deploy Astro Hybrid Rendering site on Cloudflare Pages and Cloudflare Functions. plus Cloudflare KV binding</p></a><div class="flex items-center justify-end mt-auto"><div class="flex items-center mt-8 text-sm"></div></div></div><hr class="lg:hidden"></div><div class="mt-8 flex justify-end"><a class="px-4 py-2 text-2xl font-bold text-gray-100 transition-colors duration-200 transform bg-gray-800 cursor-pointer hover:bg-gray-600" href="/blog/">More Posts →</a></div></section><hr><section id="projects" class="container mx-auto px-4 py-24"><a href="/projects/"><h2 class="text-4xl font-semibold text-gray-900 mb-8">Projects</h2></a><div class="grid grid-cols-1 lg:grid-cols-2 lg:gap-8"><div class="project-card Svelte TypeScript WebRTC Featured py-8 lg:py-4 lg:px-6 mx-auto bg-white lg:sh
1adow-lg flex flex-col w-full border-b-[1px] lg:border-b-0"><div class="flex items-center justify-between"><time class="text-xs font-light text-gray-600">2023 - present</time> <a class="px-2 py-1 text-xs font-bold text-gray-100 transition-colors duration-200 transform bg-gray-800 cursor-pointer hover:bg-gray-600" href="/projects/?filter=Featured">Featured</a></div><a class="mt-2 hover:underline" href="/projects/zero-share"><div class="text-xl font-bold text-gray-900 hover:text-gray-800">Zero Share</div><p class="font-bold text-gray-500">A client-side secure P2P file sharing using WebRTC.</p></a><div class="flex items-center mt-auto"><div class="flex flex-row items-center mt-8 justify-between w-full"><div class="flex text-xs font-bold"><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=Svelte" title="Svelte">Svelte </a><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=TypeScript" title="TypeScript">TypeScript </a><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=WebRTC" title="WebRTC">WebRTC</a></div><div class="flex text-sm gap-2"><a aria-label="Website" class="text-gray-600 hover:text-gray-400" href="https://zero-share.github.io" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM6.262 6.072a8.25 8.25 0 1010.562-.766 4.5 4.5 0 01-1.318 1.357L14.25 7.5l.165.33a.809.809 0 01-1.086 1.085l-.604-.302a1.125 1.125 0 00-1.298.21l-.132.131c-.439.44-.439 1.152 0 1.591l.296.296c.256.257.622.374.98.314l1.17-.195c.323-.054.654.036.905.245l1.33 1.108c.32.267.46.694.358 1.1a8.7 8.7 0 01-2.288 4.04l-.723.724a1.125 1.125 0 01-1.298.21l-.153-.076a1.125 1.125 0 01-.622-1.006v-1.089c0-.298-.119-.585-.33-.796l-1.347-1.347a1.125 1.125 0 01-.21-1.298L9.75 12l-1.64-1.64a6 6 0 01-1.676-3.257l-.172-1.03z" clip-rule="evenodd"></path></svg> </a><a aria-label="Github" class="text-gray-600 hover:text-gray-400" href="https://github.com/ntsd/zero-share" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12.026 2C7.13295 1.99937 2.96183 5.54799 2.17842 10.3779C1.395 15.2079 4.23061 19.893 8.87302 21.439C9.37302 21.529 9.55202 21.222 9.55202 20.958C9.55202 20.721 9.54402 20.093 9.54102 19.258C6.76602 19.858 6.18002 17.92 6.18002 17.92C5.99733 17.317 5.60459 16.7993 5.07302 16.461C4.17302 15.842 5.14202 15.856 5.14202 15.856C5.78269 15.9438 6.34657 16.3235 6.66902 16.884C6.94195 17.3803 7.40177 17.747 7.94632 17.9026C8.49087 18.0583 9.07503 17.99 9.56902 17.713C9.61544 17.207 9.84055 16.7341 10.204 16.379C7.99002 16.128 5.66202 15.272 5.66202 11.449C5.64973 10.4602 6.01691 9.5043 6.68802 8.778C6.38437 7.91731 6.42013 6.97325 6.78802 6.138C6.78802 6.138 7.62502 5.869 9.53002 7.159C11.1639 6.71101 12.8882 6.71101 14.522 7.159C16.428 5.868 17.264 6.138 17.264 6.138C17.6336 6.97286 17.6694 7.91757 17.364 8.778C18.0376 9.50423 18.4045 10.4626 18.388 11.453C18.388 15.286 16.058 16.128 13.836 16.375C14.3153 16.8651 14.5612 17.5373 14.511 18.221C14.511 19.555 14.499 20.631 14.499 20.958C14.499 21.225 14.677 21.535 15.186 21.437C19.8265 19.8884 22.6591 15.203 21.874 10.3743C21.089 5.54565 16.9181 1.99888 12.026 2Z"></path></svg></a></div></div></div></div><div class="project-card Golang libp2p Featured py-8 lg:py-4 lg:px-6 mx-auto bg-white lg:shadow-lg flex flex-col w-full border-b-[1px] lg:border-b-0"><div class="flex items-center justify-between"><time class="text-xs font-light text-gray-600">2022 - present</time> <a class="px-2 py-1 text-xs font-bold text-gray-100 transition-colors duration-200 transform bg-gray-800 cursor-pointer hover:bg-gray-600" href="/projects/?filter=Featured">Featured</a></div><a class="mt-2 hover:underline" href="/projects/cross-clipboard"><div class="text-xl font-bold text-gray-900 hover:text-gray-800">Cross Clipboard</div><p class="font-bold text-gray-500">An open source cross-platform clipboard sharing over P2P network.</p></a><div class="flex items-center mt-auto"><div class="flex flex-row items-center mt-8 justify-between w-full"><div class="flex text-xs font-bold"><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=Golang" title="Golang">Golang </a><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=libp2p" title="libp2p">libp2p</a></div><div class="flex text-sm gap-2"><a aria-label="Github" class="text-gray-600 hover:text-gray-400" href="https://github.com/ntsd/cross-clipboard" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12.026 2C7.13295 1.99937 2.96183 5.54799 2.17842 10.3779C1.395 15.2079 4.23061 19.893 8.87302 21.439C9.37302 21.529 9.55202 21.222 9.55202 20.958C9.55202 20.721 9.54402 20.093 9.54102 19.258C6.76602 19.858 6.18002 17.92 6.18002 17.92C5.99733 17.317 5.60459 16.7993 5.07302 16.461C4.17302 15.842 5.14202 15.856 5.14202 15.856C5.78269 15.9438 6.34657 16.3235 6.66902 16.884C6.94195 17.3803 7.40177 17.747 7.94632 17.9026C8.49087 18.0583 9.07503 17.99 9.56902 17.713C9.61544 17.207 9.84055 16.7341 10.204 16.379C7.99002 16.128 5.66202 15.272 5.66202 11.449C5.64973 10.4602 6.01691 9.5043 6.68802 8.778C6.38437 7.91731 6.42013 6.97325 6.78802 6.138C6.78802 6.138 7.62502 5.869 9.53002 7.159C11.1639 6.71101 12.8882 6.71101 14.522 7.159C16.428 5.868 17.264 6.138 17.264 6.138C17.6336 6.97286 17.6694 7.91757 17.364 8.778C18.0376 9.50423 18.4045 10.4626 18.388 11.453C18.388 15.286 16.058 16.128 13.836 16.375C14.3153 16.8651 14.5612 17.5373 14.511 18.221C14.511 19.555 14.499 20.631 14.499 20.958C14.499 21.225 14.677 21.535 15.186 21.437C19.8265 19.8884 22.6591 15.203 21.874 10.3743C21.089 5.54565 16.9181 1.99888 12.026 2Z"></path></svg></a></div></div></div></div><div class="project-card TypeScript Astro Svelte Featured py-8 lg:py-4 lg:px-6 mx-auto bg-white lg:sh
1adow-lg flex flex-col w-full border-b-[1px] lg:border-b-0"><div class="flex items-center justify-between"><time class="text-xs font-light text-gray-600">2023 - present</time> <a class="px-2 py-1 text-xs font-bold text-gray-100 transition-colors duration-200 transform bg-gray-800 cursor-pointer hover:bg-gray-600" href="/projects/?filter=Featured">Featured</a></div><a class="mt-2 hover:underline" href="/projects/tools"><div class="text-xl font-bold text-gray-900 hover:text-gray-800">Online Tools</div><p class="font-bold text-gray-500">Online tools, calculators, and visualizer such as Universal Scalability Law, Amdahl's Law, and Queuing Theory</p></a><div class="flex items-center mt-auto"><div class="flex flex-row items-center mt-8 justify-between w-full"><div class="flex text-xs font-bold"><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=TypeScript" title="TypeScript">TypeScript </a><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=Astro" title="Astro">Astro </a><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=Svelte" title="Svelte">Svelte</a></div><div class="flex text-sm gap-2"><a aria-label="Website" class="text-gray-600 hover:text-gray-400" href="https://tools.ntsd.dev" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM6.262 6.072a8.25 8.25 0 1010.562-.766 4.5 4.5 0 01-1.318 1.357L14.25 7.5l.165.33a.809.809 0 01-1.086 1.085l-.604-.302a1.125 1.125 0 00-1.298.21l-.132.131c-.439.44-.439 1.152 0 1.591l.296.296c.256.257.622.374.98.314l1.17-.195c.323-.054.654.036.905.245l1.33 1.108c.32.267.46.694.358 1.1a8.7 8.7 0 01-2.288 4.04l-.723.724a1.125 1.125 0 01-1.298.21l-.153-.076a1.125 1.125 0 01-.622-1.006v-1.089c0-.298-.119-.585-.33-.796l-1.347-1.347a1.125 1.125 0 01-.21-1.298L9.75 12l-1.64-1.64a6 6 0 01-1.676-3.257l-.172-1.03z" clip-rule="evenodd"></path></svg> </a><a aria-label="Github" class="text-gray-600 hover:text-gray-400" href="https://github.com/ntsd/tools" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12.026 2C7.13295 1.99937 2.96183 5.54799 2.17842 10.3779C1.395 15.2079 4.23061 19.893 8.87302 21.439C9.37302 21.529 9.55202 21.222 9.55202 20.958C9.55202 20.721 9.54402 20.093 9.54102 19.258C6.76602 19.858 6.18002 17.92 6.18002 17.92C5.99733 17.317 5.60459 16.7993 5.07302 16.461C4.17302 15.842 5.14202 15.856 5.14202 15.856C5.78269 15.9438 6.34657 16.3235 6.66902 16.884C6.94195 17.3803 7.40177 17.747 7.94632 17.9026C8.49087 18.0583 9.07503 17.99 9.56902 17.713C9.61544 17.207 9.84055 16.7341 10.204 16.379C7.99002 16.128 5.66202 15.272 5.66202 11.449C5.64973 10.4602 6.01691 9.5043 6.68802 8.778C6.38437 7.91731 6.42013 6.97325 6.78802 6.138C6.78802 6.138 7.62502 5.869 9.53002 7.159C11.1639 6.71101 12.8882 6.71101 14.522 7.159C16.428 5.868 17.264 6.138 17.264 6.138C17.6336 6.97286 17.6694 7.91757 17.364 8.778C18.0376 9.50423 18.4045 10.4626 18.388 11.453C18.388 15.286 16.058 16.128 13.836 16.375C14.3153 16.8651 14.5612 17.5373 14.511 18.221C14.511 19.555 14.499 20.631 14.499 20.958C14.499 21.225 14.677 21.535 15.186 21.437C19.8265 19.8884 22.6591 15.203 21.874 10.3743C21.089 5.54565 16.9181 1.99888 12.026 2Z"></path></svg></a></div></div></div></div><div class="project-card TypeScript Astro Svelte Featured py-8 lg:py-4 lg:px-6 mx-auto bg-white lg:shadow-lg flex flex-col w-full border-b-[1px] lg:border-b-0"><div class="flex items-center justify-between"><time class="text-xs font-light text-gray-600">2023</time> <a class="px-2 py-1 text-xs font-bold text-gray-100 transition-colors duration-200 transform bg-gray-800 cursor-pointer hover:bg-gray-600" href="/projects/?filter=Featured">Featured</a></div><a class="mt-2 hover:underline" href="/projects/lisuify"><div class="text-xl font-bold text-gray-900 hover:text-gray-800">LiSuify</div><p class="font-bold text-gray-500">A liquid staking platform for the SUI protocol, enabling users to stake their SUI or StakedSui object to wrap with a liquid token name liSUI return to the user.</p></a><div class="flex items-center mt-auto"><div class="flex flex-row items-center mt-8 justify-between w-full"><div class="flex text-xs font-bold"><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=TypeScript" title="TypeScript">TypeScript </a><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=Astro" title="Astro">Astro </a><a class="text-sm px-1 hover:text-gray-800 hover:underline" href="/projects/?filter=Svelte" title="Svelte">Svelte</a></div><div class="flex text-sm gap-2"><a aria-label="Website" class="text-gray-600 hover:text-gray-400" href="https://lisuify.com" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
1<path fill-rule="evenodd" d="M12 2.25c-5.385 0-9.75 4.365-9.75 9.75s4.365 9.75 9.75 9.75 9.75-4.365 9.75-9.75S17.385 2.25 12 2.25zM6.262 6.072a8.25 8.25 0 1010.562-.766 4.5 4.5 0 01-1.318 1.357L14.25 7.5l.165.33a.809.809 0 01-1.086 1.085l-.604-.302a1.125 1.125 0 00-1.298.21l-.132.131c-.439.44-.439 1.152 0 1.591l.296.296c.256.257.622.374.98.314l1.17-.195c.323-.054.654.036.905.245l1.33 1.108c.32.267.46.694.358 1.1a8.7 8.7 0 01-2.288 4.04l-.723.724a1.125 1.125 0 01-1.298.21l-.153-.076a1.125 1.125 0 01-.622-1.006v-1.089c0-.298-.119-.585-.33-.796l-1.347-1.347a1.125 1.125 0 01-.21-1.298L9.75 12l-1.64-1.64a6 6 0 01-1.676-3.257l-.172-1.03z" clip-rule="evenodd"></path></svg> </a><a aria-label="Github" class="text-gray-600 hover:text-gray-400" href="https://github.com/lisuify/lisuify" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12.026 2C7.13295 1.99937 2.96183 5.54799 2.17842 10.3779C1.395 15.2079 4.23061 19.893 8.87302 21.439C9.37302 21.529 9.55202 21.222 9.55202 20.958C9.55202 20.721 9.54402 20.093 9.54102 19.258C6.76602 19.858 6.18002 17.92 6.18002 17.92C5.99733 17.317 5.60459 16.7993 5.07302 16.461C4.17302 15.842 5.14202 15.856 5.14202 15.856C5.78269 15.9438 6.34657 16.3235 6.66902 16.884C6.94195 17.3803 7.40177 17.747 7.94632 17.9026C8.49087 18.0583 9.07503 17.99 9.56902 17.713C9.61544 17.207 9.84055 16.7341 10.204 16.379C7.99002 16.128 5.66202 15.272 5.66202 11.449C5.64973 10.4602 6.01691 9.5043 6.68802 8.778C6.38437 7.91731 6.42013 6.97325 6.78802 6.138C6.78802 6.138 7.62502 5.869 9.53002 7.159C11.1639 6.71101 12.8882 6.71101 14.522 7.159C16.428 5.868 17.264 6.138 17.264 6.138C17.6336 6.97286 17.6694 7.91757 17.364 8.778C18.0376 9.50423 18.4045 10.4626 18.388 11.453C18.388 15.286 16.058 16.128 13.836 16.375C14.3153 16.8651 14.5612 17.5373 14.511 18.221C14.511 19.555 14.499 20.631 14.499 20.958C14.499 21.225 14.677 21.535 15.186 21.437C19.8265 19.8884 22.6591 15.203 21.874 10.3743C21.089 5.54565 16.9181 1.99888 12.026 2Z"></path></svg></a></div></div></div></div></div><div class="mt-8 flex justify-end"><a class="px-4 py-2 text-2xl font-bold text-gray-100 transition-colors duration-200 transform bg-gray-800 cursor-pointer hover:bg-gray-600" href="/projects/">More Projects →</a></div></section><footer><hr class="mt-10"><div class="container px-4 py-8 mx-auto"><div class="flex flex-col lg:flex-row justify-between text-gray-800 space-y-4 lg:space-y-0"><div class="flex justify-center lg:justify-start"><div class="flex space-x-4"><a aria-label="RSS" class="text-gray-600 hover:text-gray-400" href="/feed.xml" rel="noopener noreferrer" target="_blank"><svg xmlns="http://www.w3.org/2000/svg" class="w-7 h-7 fill-current" viewBox="0 0 20 20"><path d="M5 3a1 1 0 000 2c5.523 0 10 4.477 10 10a1 1 0 102 0C17 8.373 11.627 3 5 3z"></path><path d="M4 9a1 1 0 011-1 7 7 0 017 7 1 1 0 11-2 0 5 5 0 00-5-5 1 1 0 01-1-1zM3 15a2 2 0 114 0 2 2 0 01-4 0z"></path></svg> </a><a aria-label="Github" class="text-gray-600 hover:text-gray-400" href="https://github.com/ntsd" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12.026 2C7.13295 1.99937 2.96183 5.54799 2.17842 10.3779C1.395 15.2079 4.23061 19.893 8.87302 21.439C9.37302 21.529 9.55202 21.222 9.55202 20.958C9.55202 20.721 9.54402 20.093 9.54102 19.258C6.76602 19.858 6.18002 17.92 6.18002 17.92C5.99733 17.317 5.60459 16.7993 5.07302 16.461C4.17302 15.842 5.14202 15.856 5.14202 15.856C5.78269 15.9438 6.34657 16.3235 6.66902 16.884C6.94195 17.3803 7.40177 17.747 7.94632 17.9026C8.49087 18.0583 9.07503 17.99 9.56902 17.713C9.61544 17.207 9.84055 16.7341 10.204 16.379C7.99002 16.128 5.66202 15.272 5.66202 11.449C5.64973 10.4602 6.01691 9.5043 6.68802 8.778C6.38437 7.91731 6.42013 6.97325 6.78802 6.138C6.78802 6.138 7.62502 5.869 9.53002 7.159C11.1639 6.71101 12.8882 6.71101 14.522 7.159C16.428 5.868 17.264 6.138 17.264 6.138C17.6336 6.97286 17.6694 7.91757 17.364 8.778C18.0376 9.50423 18.4045 10.4626 18.388 11.453C18.388 15.286 16.058 16.128 13.836 16.375C14.3153 16.8651 14.5612 17.5373 14.511 18.221C14.511 19.555 14.499 20.631 14.499 20.958C14.499 21.225 14.677 21.535 15.186 21.437C19.8265 19.8884 22.6591 15.203 21.874 10.3743C21.089 5.54565 16.9181 1.99888 12.026 2Z"></path></svg> </a><a aria-label="Linkedin" class="text-gray-600 hover:text-gray-400" href="https://www.linkedin.com/in/ntsd" rel="noopener noreferrer" target="_blank"><svg class="w-7 h-7 fill-current" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M13 21H9V9H13V11C13.8526 9.91525 15.1456 9.26857 16.525 9.237C19.0056 9.25077 21.00
172 11.2694 21 13.75V21H17V14.25C16.84 13.1326 15.8818 12.3036 14.753 12.306C14.2593 12.3216 13.7932 12.5378 13.4624 12.9046C13.1316 13.2715 12.9646 13.7573 13 14.25V21ZM7 21H3V9H7V21ZM5 7C3.89543 7 3 6.10457 3 5C3 3.89543 3.89543 3 5 3C6.10457 3 7 3.89543 7 5C7 5.53043 6.78929 6.03914 6.41421 6.41421C6.03914 6.78929 5.53043 7 5 7Z"></path></svg> </a><a aria-label="Webring" class="text-gray-600 hover:text-gray-400" href="https://webring.wonderful.software#ntsd.dev" rel="noopener noreferrer" target="_blank"><svg class="mt-1 w-6 h-6 fill-current" fill="none" viewBox="0 0 416 416" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="M53 128.8l-16-8.2a192 192 0 1094.7-88.9l7.1 16.6A174 174 0 1153 128.8z" fill-rule="evenodd" fill="currentColor"></path><path d="M94.7 92.3L82 126.5 62.6 95.7l-36.4-1.4 23.3-28-9.9-35.1 33.9 13.5 30.3-20.3-2.4 36.4L130 83.3l-35.3 9z" fill="currentColor"></path></svg></a></div></div><div class="text-center lg:text-right"><div>Copyright © Jirawat Boonkumnerd 2025</div></div></div></div></footer>
1<script type="text/javascript" async="">if ('serviceWorker' in navigator) { navigator.serviceWorker.register('/sw.js').catch((err) => { console.error("service worker register error:", err); }); }</script>
1<script type="module" src="https://static.cloudflareinsights.com/beacon.min.js/v31edd6df95cf4e85bb4c19e7a9bdbcba1788362987495" integrity="sha512-iIg7k2xntmwu6/uSb5tpc/hySgZc4eoL31yB29W6tJFo2akwjPWcEqnCEdJvGexCL0KEQwVYv5BlowfhVz26hg==" data-cf-beacon='{"version":"2024.11.0","token":"2ce5015cbf7f4046bc3670d746d36fed","r":1,"spa":2}' crossorigin="anonymous"></script>
1
2</body></html>

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