1<!DOCTYPE html><html lang="zh" class="false"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width"><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="canonical" href="https://nusr.github.io/search/"><meta name="generator" content="Astro v4.4.7"><!-- General Meta Tags --><title>Search | Steve Xu</title><meta name="title" content="Search | Steve Xu"><meta name="description" content="Welcome to My Blog"><meta name="author" content="Steve Xu"><!-- Open Graph / Facebook --><meta property="og:title" content="Search | Steve Xu"><meta property="og:description" content="Welcome to My Blog"><meta property="og:url" content="https://nusr.github.io/search/"><meta property="og:image" content="https://nusr.github.io/op.jpeg"><!-- Article Published/Modified time --><!-- Twitter --><meta property="twitter:card" content="summary_large_image"><meta property="twitter:url" content="https://nusr.github.io/search/"><meta property="twitter:title" content="Search | Steve Xu"><meta property="twitter:description" content="Welcome to My Blog"><meta property="twitter:image" content="https://nusr.github.io/op.jpeg"><meta name="theme-color" content=""><meta name="astro-view-transitions-enabled" content="true"><meta name="astro-view-transitions-fallback" content="animate"><link rel="stylesheet" href="/_astro/about.CXnmc6_F.css" /> 2<style>#main-content:where(.astro-hsp6otuf){margin-left:auto;margin-right:auto;width:100%;max-width:48rem;padding-left:1rem;padding-right:1rem;padding-bottom:1rem}#main-content:where(.astro-hsp6otuf) h1:where(.astro-hsp6otuf){margin-top:1.5rem;font-size:1.5rem;line-height:2rem;font-weight:600}@media (min-width: 640px){#main-content:where(.astro-hsp6otuf) h1:where(.astro-hsp6otuf){font-size:1.875rem;line-height:2.25rem}}#main-content:where(.astro-hsp6otuf) p:where(.astro-hsp6otuf){margin-bottom:1.5rem;margin-top:.5rem} 3@keyframes astroFadeInOut{0%{opacity:1}to{opacity:0}}@keyframes astroFadeIn{0%{opacity:0}}@keyframes astroFadeOut{to{opacity:0}}@keyframes astroSlideFromRight{0%{transform:translate(100%)}}@keyframes astroSlideFromLeft{0%{transform:translate(-100%)}}@keyframes astroSlideToRight{to{transform:translate(100%)}}@keyframes astroSlideToLeft{to{transform:translate(-100%)}}@media (prefers-reduced-motion){::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}[data-astro-transition-scope]{animation:none!important}} 4</style>
4<script type="module" src="/_astro/hoisted.B2MTPbHz.js"></script>
4</head> <body> <header class="astro-3ef6ksr2"> <a id="skip-to-content" href="#main-content" class="astro-3ef6ksr2">Skip to content</a> <div class="nav-container astro-3ef6ksr2"> <div class="top-nav-wrap astro-3ef6ksr2"> <a href="/" class="logo whitespace-nowrap astro-3ef6ksr2"> Steve Xu </a> <nav id="nav-menu" class="astro-3ef6ksr2"> <button class="hamburger-menu focus-outline astro-3ef6ksr2" aria-label="Open Menu" aria-expanded="false" aria-controls="menu-items"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="menu-icon astro-3ef6ksr2"> <line x1="7" y1="12" x2="21" y2="12" class="line astro-3ef6ksr2"></line> <line x1="3" y1="6" x2="21" y2="6" class="line astro-3ef6ksr2"></line> <line x1="12" y1="18" x2="21" y2="18" class="line astro-3ef6ksr2"></line> <line x1="18" y1="6" x2="6" y2="18" class="close astro-3ef6ksr2"></line> <line x1="6" y1="6" x2="18" y2="18" class="close astro-3ef6ksr2"></line> </svg> </button> <ul id="menu-items" class="display-none sm:flex astro-3ef6ksr2"> <li class="astro-3ef6ksr2"> <a href="/" class=" astro-3ef6ksr2"> Home </a> </li> <li class="astro-3ef6ksr2"> <a href="/archives/" class=" astro-3ef6ksr2"> 5Archives 6</a> </li> <li class="astro-3ef6ksr2"> <a href="/tags/" class=" astro-3ef6ksr2"> 7Tags 8</a> </li> <li class="astro-3ef6ksr2"> <a href="/about/" class=" astro-3ef6ksr2"> 9About 10</a> </li> <li class="astro-3ef6ksr2"> <a href="/search/" class="group inline-block hover:text-skin-accent focus-outline p-3 sm:p-1 active flex astro-3ef6ksr2" aria-label="search" title="Search" target="_self"> <svg xmlns="http://www.w3.org/2000/svg" class="scale-125 sm:scale-100 astro-3ef6ksr2"><path d="M19.023 16.977a35.13 35.13 0 0 1-1.367-1.384c-.372-.378-.596-.653-.596-.653l-2.8-1.337A6.962 6.962 0 0 0 16 9c0-3.859-3.14-7-7-7S2 5.141 2 9s3.14 7 7 7c1.763 0 3.37-.66 4.603-1.739l1.337 2.8s.275.224.653.596c.387.363.896.854 1.384 1.367l1.358 1.392.604.646 2.121-2.121-.646-.604c-.379-.372-.885-.866-1.391-1.36zM9 14c-2.757 0-5-2.243-5-5s2.243-5 5-5 5 2.243 5 5-2.243 5-5 5z" class="astro-3ef6ksr2"></path> </svg> <span class="sr-only astro-3ef6ksr2">Search</span> </a> </li> <li class="astro-3ef6ksr2"> <button id="theme-btn" class="focus-outline astro-3ef6ksr2" title="Toggles light & dark" aria-label="auto" aria-live="polite"> <svg xmlns="http://www.w3.org/2000/svg" id="moon-svg" class="astro-3ef6ksr2"> <path d="M20.742 13.045a8.088 8.088 0 0 1-2.077.271c-2.135 0-4.14-.83-5.646-2.336a8.025 8.025 0 0 1-2.064-7.723A1 1 0 0 0 9.73 2.034a10.014 10.014 0 0 0-4.489 2.582c-3.898 3.898-3.898 10.243 0 14.143a9.937 9.937 0 0 0 7.072 2.93 9.93 9.93 0 0 0 7.07-2.929 10.007 10.007 0 0 0 2.583-4.491 1.001 1.001 0 0 0-1.224-1.224zm-2.772 4.301a7.947 7.947 0 0 1-5.656 2.343 7.953 7.953 0 0 1-5.658-2.344c-3.118-3.119-3.118-8.195 0-11.314a7.923 7.923 0 0 1 2.06-1.483 10.027 10.027 0 0 0 2.89 7.848 9.972 9.972 0 0 0 7.848 2.891 8.036 8.036 0 0 1-1.484 2.059z" class="astro-3ef6ksr2"></path> </svg> <svg xmlns="http://www.w3.org/2000/svg" id="sun-svg" class="astro-3ef6ksr2"> <path d="M6.993 12c0 2.761 2.246 5.007 5.007 5.007s5.007-2.246 5.007-5.007S14.761 6.993 12 6.993 6.993 9.239 6.993 12zM12 8.993c1.658 0 3.007 1.349 3.007 3.007S13.658 15.007 12 15.007 8.993 13.658 8.993 12 10.342 8.993 12 8.993zM10.998 19h2v3h-2zm0-17h2v3h-2zm-9 9h3v2h-3zm17 0h3v2h-3zM4.219 18.363l2.12-2.122 1.415 1.414-2.12 2.122zM16.24 6.344l2.122-2.122 1.414 1.414-2.122 2.122zM6.342 7.759 4.22 5.637l1.415-1.414 2.12 2.122zm13.434 10.605-1.414 1.414-2.122-2.122 1.414-1.414z" class="astro-3ef6ksr2"></path> </svg> </button> </li> </ul> </nav> </div> </div> <div class="mx-auto max-w-3xl px-4 astro-3ef6ksr2"> <hr class="border-skin-line astro-3ef6ksr2" aria-hidden> </div> </header> <main id="main-content" class=" astro-hsp6otuf"> <h1 class="astro-hsp6otuf">Search</h1> <p class="astro-hsp6otuf">Search any article ...</p> <style>astro-island,astro-slot,astro-static-slot{display:contents}</style>
10<script>(()=>{var e=async t=>{await(await t())()};(self.Astro||(self.Astro={})).load=e;window.dispatchEvent(new Event("astro:load"));})();;(()=>{var v=Object.defineProperty;var A=(c,s,a)=>s in c?v(c,s,{enumerable:!0,configurable:!0,writable:!0,value:a}):c[s]=a;var d=(c,s,a)=>(A(c,typeof s!="symbol"?s+"":s,a),a);var u;{let c={0:t=>m(t),1:t=>a(t),2:t=>new RegExp(t),3:t=>new Date(t),4:t=>new Map(a(t)),5:t=>new Set(a(t)),6:t=>BigInt(t),7:t=>new URL(t),8:t=>new Uint8Array(t),9:t=>new Uint16Array(t),10:t=>new Uint32Array(t)},s=t=>{let[e,n]=t;return e in c?c[e](n):void 0},a=t=>t.map(s),m=t=>typeof t!="object"||t===null?t:Object.fromEntries(Object.entries(t).map(([e,n])=>[e,s(n)]));customElements.get("astro-island")||customElements.define("astro-island",(u=class extends HTMLElement{constructor(){super(...arguments);d(this,"Component");d(this,"hydrator");d(this,"hydrate",async()=>{var f;if(!this.hydrator||!this.isConnected)return;let e=(f=this.parentElement)==null?void 0:f.closest("astro-island[ssr]");if(e){e.addEventListener("astro:hydrate",this.hydrate,{once:!0});return}let n=this.querySelectorAll("astro-slot"),r={},l=this.querySelectorAll("template[data-astro-template]");for(let o of l){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(r[o.getAttribute("data-astro-template")||"default"]=o.innerHTML,o.remove())}for(let o of n){let i=o.closest(this.tagName);i!=null&&i.isSameNode(this)&&(r[o.getAttribute("name")||"default"]=o.innerHTML)}let h;try{h=this.hasAttribute("props")?m(JSON.parse(this.getAttribute("props"))):{}}catch(o){let i=this.getAttribute("component-url")||"<unknown>",b=this.getAttribute("component-export");throw b&&(i+=` (export ${b})`),console.error(`[hydrate] Error parsing props for component ${i}`,this.getAttribute("props"),o),o}let p;await this.hydrator(this)(this.Component,h,r,{client:this.getAttribute("client")}),this.removeAttribute("ssr"),this.dispatchEvent(new CustomEvent("astro:hydrate"))});d(this,"unmount",()=>{this.isConnected||this.dispatchEvent(new CustomEvent("astro:unmount"))})}disconnectedCallback(){document.removeEventListener("astro:after-swap",this.unmount),document.addEventListener("astro:after-swap",this.unmount,{once:!0})}connectedCallback(){if(!this.hasAttribute("await-children")||document.readyState==="interactive"||document.readyState==="complete")this.childrenConnectedCallback();else{let e=()=>{document.removeEventListener("DOMContentLoaded",e),n.disconnect(),this.childrenConnectedCallback()},n=new MutationObserver(()=>{var r;((r=this.lastChild)==null?void 0:r.nodeType)===Node.COMMENT_NODE&&this.lastChild.nodeValue==="astro:end"&&(this.lastChild.remove(),e())});n.observe(this,{childList:!0}),document.addEventListener("DOMContentLoaded",e)}}async childrenConnectedCallback(){let e=this.getAttribute("before-hydration-url");e&&await import(e),this.start()}async start(){let e=JSON.parse(this.getAttribute("opts")),n=this.getAttribute("client");if(Astro[n]===void 0){window.addEventListener(`astro:${n}`,()=>this.start(),{once:!0});return}try{await Astro[n](async()=>{let r=this.getAttribute("renderer-url"),[l,{default:h}]=await Promise.all([import(this.getAttribute("component-url")),r?import(r):()=>()=>{}]),p=this.getAttribute("component-export")||"default";if(!p.includes("."))this.Component=l[p];else{this.Component=l;for(let y of p.split("."))this.Component=this.Component[y]}return this.hydrator=h,this.hydrate},e,this)}catch(r){console.error(`[astro-island] Error hydrating ${this.getAttribute("component-url")}`,r)}}attributeChangedCallback(){this.hydrate()}},d(u,"observedAttributes",["props"]),u))}})();</script>
10<astro-island uid="Z1D39oS" prefix="r0" component-url="/_astro/SearchBar.BbJkDkDz.js" component-export="default" renderer-url="/_astro/client.D9Vng9vH.js" props="{"searchList":[1,[[0,{"title":[0,"ä½¿ç¨ Jest æµè¯æ¡æ¶ï¼å®ç° 100% çæµè¯è¦çç"],"description":[0],"data":[0,{"title":[0,"ä½¿ç¨ Jest æµè¯æ¡æ¶ï¼å®ç° 100% çæµè¯è¦çç"],"pubDate":[3,"2024-04-07T00:00:00.000Z"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Test"],[0,"Jest"]]]}],"slug":[0,"jest-100-percent-coverage"]}],[0,{"title":[0,"ä¿®å¤ Firebase 模æå¨æ æ³è¿è¡æå"],"description":[0,"Firebase login"],"data":[0,{"title":[0,"ä¿®å¤ Firebase 模æå¨æ æ³è¿è¡æå"],"pubDate":[3,"2024-03-19T00:00:00.000Z"],"description":[0,"Firebase login"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Firebase"],[0,"Proxy"]]]}],"slug":[0,"firebase-login"]}],[0,{"title":[0,"å端æ§è½ä¼åï¼SPA 页é¢ç§å¼"],"description":[0,"The SPA page opens in seconds"],"data":[0,{"title":[0,"å端æ§è½ä¼åï¼SPA 页é¢ç§å¼"],"pubDate":[3,"2020-04-04T00:00:00.000Z"],"description":[0,"The SPA page opens in seconds"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Performance"]]]}],"slug":[0,"the-spa-page-opens-in-seconds"]}],[0,{"title":[0,"éé
Dark Mode"],"description":[0,"å®ç°éé
Dark Mode çæ¹æ³"],"data":[0,{"title":[0,"éé
Dark Mode"],"pubDate":[3,"2019-12-22T00:00:00.000Z"],"description":[0,"å®ç°éé
Dark Mode çæ¹æ³"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"CSS"]]]}],"slug":[0,"how-to-apply-dark-mode"]}],[0,{"title":[0,"ä½¿ç¨ Create-React-App å¼å Chrome æ©å±"],"description":[0,"Use Create-React-App to develop Chrome extensions"],"data":[0,{"title":[0,"ä½¿ç¨ Create-React-App å¼å Chrome æ©å±"],"pubDate":[3,"2019-07-07T00:00:00.000Z"],"description":[0,"Use Create-React-App to develop Chrome extensions"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"React"],[0,"Chrome"]]]}],"slug":[0,"develop-a-chrome-extension"]}],[0,{"title":[0,"é»å®¢ä¸å¯ä¸ç¥çå®å¾åæ³å"],"description":[0,"hacker laws"],"data":[0,{"title":[0,"é»å®¢ä¸å¯ä¸ç¥çå®å¾åæ³å"],"pubDate":[3,"2019-05-16T00:00:00.000Z"],"description":[0,"hacker laws"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Hacker"]]]}],"slug":[0,"hacker-laws-zh"]}],[0,{"title":[0,"ä½ åä¹ä¸ç¨ä½¿ç¨ ReduxãMobxãFlux çç¶æç®¡çäº"],"description":[0,"You don't have to use React state management anymore"],"data":[0,{"title":[0,"ä½ åä¹ä¸ç¨ä½¿ç¨ ReduxãMobxãFlux çç¶æç®¡çäº"],"pubDate":[3,"2019-05-08T00:00:00.000Z"],"description":[0,"You don't have to use React state management anymore"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"React"]]]}],"slug":[0,"you-do-not-have-to-use-react-state-management-anymore"]}],[0,{"title":[0,"åå®¢ä½¿ç¨ utterances ä½ä¸ºè¯è®ºç³»ç»"],"description":[0,"Bloggers use utterances as a commenting system"],"data":[0,{"title":[0,"åå®¢ä½¿ç¨ utterances ä½ä¸ºè¯è®ºç³»ç»"],"pubDate":[3,"2019-05-04T00:00:00.000Z"],"description":[0,"Bloggers use utterances as a commenting system"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Blog"]]]}],"slug":[0,"utterances-as-a-commenting-system"]}],[0,{"title":[0,"Hugo + Github Pages æå»ºä¸ªäººå客"],"description":[0,"Hugo plus Github Pages set up a personal blog"],"data":[0,{"title":[0,"Hugo + Github Pages æå»ºä¸ªäººå客"],"pubDate":[3,"2019-04-27T00:00:00.000Z"],"description":[0,"Hugo plus Github Pages set up a personal blog"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Github Pages"],[0,"Blog"]]]}],"slug":[0,"hugo-set-up-a-personal-blog"]}],[0,{"title":[0,"è§£å³ Mac launchpad å¯å¨å° Gitter 徿 æ æ³å é¤çé®é¢"],"description":[0,"Resolves an issue where the Mac launchpad Gitter icon could not be deleted"],"data":[0,{"title":[0,"è§£å³ Mac launchpad å¯å¨å° Gitter 徿 æ æ³å é¤çé®é¢"],"pubDate":[3,"2019-04-25T00:00:00.000Z"],"description":[0,"Resolves an issue where the Mac launchpad Gitter icon could not be deleted"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Mac"]]]}],"slug":[0,"mac-gitter-icon-could-not-be-deleted"]}],[0,{"title":[0,"React ä¸ React-Native 使ç¨åä¸ä¸ª meteor åå°"],"description":[0,"React uses the same meteor backend as React-Native"],"data":[0,{"title":[0,"React ä¸ React-Native 使ç¨åä¸ä¸ª meteor åå°"],"pubDate":[3,"2019-04-21T00:00:00.000Z"],"description":[0,"React uses the same meteor backend as React-Native"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"React"],[0,"React Native"],[0,"Meteor"]]]}],"slug":[0,"meteor-as-a-backend"]}],[0,{"title":[0,"ä¸è¡å½ä»¤æ´æ°ææ npm ä¾èµå
"],"description":[0,"A one-line command updates all npm dependencies"],"data":[0,{"title":[0,"ä¸è¡å½ä»¤æ´æ°ææ npm ä¾èµå
"],"pubDate":[3,"2019-04-21T00:00:00.000Z"],"description":[0,"A one-line command updates all npm dependencies"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"NPM"]]]}],"slug":[0,"updates-all-npm-dependencies"]}],[0,{"title":[0,"vue cli 3.x 项ç®é¨ç½²å° Github Pages"],"description":[0,"The Vue CLI 3.x project is deployed to GitHub Pages"],"data":[0,{"title":[0,"vue cli 3.x 项ç®é¨ç½²å° Github Pages"],"pubDate":[3,"2019-04-16T00:00:00.000Z"],"description":[0,"The Vue CLI 3.x project is deployed to GitHub Pages"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Vue"],[0,"Github Pages"]]]}],"slug":[0,"the-vue-cli-project-is-deployed-to-github-pages"]}],[0,{"title":[0,"è§£å³ macOS HomeBrew ä¸è½½ç¼æ
¢çé®é¢"],"description":[0,"Resolves slow macOS HomeBrew downloads"],"data":[0,{"title":[0,"è§£å³ macOS HomeBrew ä¸è½½ç¼æ
¢çé®é¢"],"pubDate":[3,"2019-04-13T00:00:00.000Z"],"description":[0,"Resolves slow macOS HomeBrew downloads"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Proxy"],[0,"Mac"]]]}],"slug":[0,"fix-home-brew-slow-downloads"]}],[0,{"title":[0,"Vue/cli 3.0 ä½¿ç¨ svg-sprite-loader å è½½æ¬å° SVG æä»¶"],"description":[0,"Vue/cli 3.0 uses svg-sprite-loader to load local SVG files"],"data":[0,{"title":[0,"Vue/cli 3.0 ä½¿ç¨ svg-sprite-loader å è½½æ¬å° SVG æä»¶"],"pubDate":[3,"2019-04-03T00:00:00.000Z"],"description":[0,"Vue/cli 3.0 uses svg-sprite-loader to load local SVG files"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Vue"],[0,"SVG"]]]}],"slug":[0,"load-local-svg-files"]}],[0,{"title":[0,"æä¸ºä»ä¹æ¨èä½ ä½¿ç¨kindle"],"description":[0,"Why I recommend you to use Kindle"],"data":[0,{"title":[0,"æä¸ºä»ä¹æ¨èä½ ä½¿ç¨kindle"],"pubDate":[3,"2019-01-31T00:00:00.000Z"],"description":[0,"Why I recommend you to use Kindle"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Reading"],[0,"Kindle"]]]}],"slug":[0,"
10why-i-recommend-you-to-use-kindle"]}],[0,{"title":[0,"Node.js ç§åä¸è½½å¨"],"description":[0,"Node.js torrent downloader"],"data":[0,{"title":[0,"Node.js ç§åä¸è½½å¨"],"pubDate":[3,"2018-10-11T00:00:00.000Z"],"description":[0,"Node.js torrent downloader"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Node.js"],[0,"Downloader"]]]}],"slug":[0,"nodejs-torrent-downloader"]}],[0,{"title":[0,"Node.js å¤çæ¬å®è£ "],"description":[0,"Node.js Multi-version installation"],"data":[0,{"title":[0,"Node.js å¤çæ¬å®è£ "],"pubDate":[3,"2018-10-01T00:00:00.000Z"],"description":[0,"Node.js Multi-version installation"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"Node.js"]]]}],"slug":[0,"nodejs-multi-version-installation"]}],[0,{"title":[0,"è§£å³ React-Native mac10.14.4 è¿è¡æ¥é error Failed to build iOS project"],"description":[0,"Resolved the error message \"Failed to build iOS project\" when running React-Native mac10.14.4"],"data":[0,{"title":[0,"è§£å³ React-Native mac10.14.4 è¿è¡æ¥é error Failed to build iOS project"],"pubDate":[3,"2018-02-24T00:00:00.000Z"],"description":[0,"Resolved the error message \"Failed to build iOS project\" when running React-Native mac10.14.4"],"author":[0,"Steve Xu"],"draft":[0,false],"tags":[1,[[0,"React Native"],[0,"Mac"]]]}],"slug":[0,"failed-to-build-ios-project"]}]]]}" ssr="" client="load" opts="{"name":"SearchBar","value":true}" await-children=""><label class="relative block"><span class="absolute inset-y-0 left-0 flex items-center pl-2 opacity-75"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true"><path d="M19.023 16.977a35.13 35.13 0 0 1-1.367-1.384c-.372-.378-.596-.653-.596-.653l-2.8-1.337A6.962 6.962 0 0 0 16 9c0-3.859-3.14-7-7-7S2 5.141 2 9s3.14 7 7 7c1.763 0 3.37-.66 4.603-1.739l1.337 2.8s.275.224.653.596c.387.363.896.854 1.384 1.367l1.358 1.392.604.646 2.121-2.121-.646-.604c-.379-.372-.885-.866-1.391-1.36zM9 14c-2.757 0-5-2.243-5-5s2.243-5 5-5 5 2.243 5 5-2.243 5-5 5z"></path></svg><span class="sr-only">Search</span></span><input class="block w-full rounded border border-skin-fill 11 border-opacity-40 bg-skin-fill py-3 pl-10 12 pr-3 placeholder:italic placeholder:text-opacity-75 13 focus:border-skin-accent focus:outline-none" placeholder="Search for anything..." type="text" name="search" autoComplete="off" value=""/></label><ul></ul><!--astro:end--></astro-island> </main> <footer class="mt-auto astro-sz7xmlte"> <div class="mx-auto max-w-3xl px-0 astro-sz7xmlte"> <hr class="border-skin-line astro-sz7xmlte" aria-hidden> </div> <div class="footer-wrapper astro-sz7xmlte"> <div class="social-icons flex astro-xfej6wit"> <a href="https://github.com/nusr/nusr.github.io" class="group inline-block hover:text-skin-accent link-button astro-xfej6wit" title="Steve Xu on Github" target="_blank"> <svg viewBox="0 0 16 16" aria-hidden="true" width="32" height="32" astro-icon="social/github"><path 14 fill="currentColor" 15 d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.012 8.012 0 0 0 16 8c0-4.42-3.58-8-8-8z" 16 ></path></svg> <span class="sr-only astro-xfej6wit">Steve Xu on Github</span> </a>
16<a href="/rss.xml" class="group inline-block hover:text-skin-accent link-button astro-xfej6wit" title="Steve Xu RSS" target="_blank"> <svg viewBox="0 0 1024 1024" aria-hidden="true" width="32" height="32"><path 17 fill="currentColor" 18 d="M42.666667 853.333333a128 128 0 1 1 256 0 128 128 0 0 1-256 0z m938.666666 128h-178.773333c0-418.986667-340.906667-759.893333-759.893333-759.893333V42.666667c517.546667 0 938.666667 421.12 938.666666 938.666666z m-298.666666 0h-182.826667c0-252.074667-205.098667-457.130667-457.173333-457.130666V341.333333c352.896 0 640 287.104 640 640z"></path></svg> <span class="sr-only astro-xfej6wit">Steve Xu RSS</span> </a><a href="https://twitter.com/stevenusr" class="group inline-block hover:text-skin-accent link-button astro-xfej6wit" title="Steve Xu on Twitter" target="_blank"> <svg 19 xmlns="http://www.w3.org/2000/svg" 20 class="icon-tabler" 21 stroke-linecap="round" 22 stroke-linejoin="round" 23 > 24 <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> 25 <path d="M22 4.01c-1 .49 -1.98 .689 -3 .99c-1.121 -1.265 -2.783 -1.335 -4.38 -.737s-2.643 2.06 -2.62 3.737v1c-3.245 .083 -6.135 -1.395 -8 -4c0 0 -4.182 7.433 4 11c-1.872 1.247 -3.739 2.088 -6 2c3.308 1.803 6.913 2.423 10.034 1.517c3.58 -1.04 6.522 -3.723 7.651 -7.742a13.84 13.84 0 0 0 .497 -3.753c-.002 -.249 1.51 -2.772 1.818 -4.013z"></path> 26 </svg> <span class="sr-only astro-xfej6wit">Steve Xu on Twitter</span> </a><a href="mailto:[email protected]" class="group inline-block hover:text-skin-accent link-button astro-xfej6wit" title="Send an email to Steve Xu" target="_blank"> <svg 27 xmlns="http://www.w3.org/2000/svg" 28 class="icon-tabler" 29 stroke-linecap="round" 30 stroke-linejoin="round" 31 > 32 <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> 33 <rect x="3" y="5" width="18" height="14" rx="2"></rect> 34 <polyline points="3 7 12 13 21 7"></polyline> 35 </svg> <span class="sr-only astro-xfej6wit">Send an email to Steve Xu</span> </a> </div> <div class="copyright-wrapper astro-sz7xmlte"> <span class="astro-sz7xmlte">Copyright © 2024</span> <span class="separator astro-sz7xmlte"> | </span> <span class="astro-sz7xmlte">All rights reserved.</span> <span class="separator astro-sz7xmlte"> | </span> <span class="astro-sz7xmlte">Powered by <a href="https://astro.build" target="_blank" class="astro-sz7xmlte">Astro</a></span> </div> </div> </footer>
35<script src="/toggle-theme.js" async></script>
35
35<script async src="https://www.google-analytics.com/analytics.js"></script>
35
35<script async>(function(){const id = "UA-138883536-1"; 36 37 window.ga = 38 window.ga || 39 function () { 40 (window.ga.q = window.ga.q || []).push(arguments); 41 }; 42 window.ga.l = +new Date(); 43 window.ga("create", id, "auto"); 44 window.ga("set", "anonymizeIp", true); 45 window.ga("send", "pageview"); 46})();</script>
46
46<script async>(function(){const apiKey = "da1a9b67ea6a904027cfc8b581c0086c"; 47 48 !(function () { 49 "use strict"; 50 !(function (e, t) { 51 var n = e.amplitude || { _q: [], _iq: {} }; 52 if (n.invoked) 53 e.console && 54 console.error && 55 console.error("Amplitude snippet has been loaded."); 56 else { 57 var r = function (e, t) { 58 e.prototype[t] = function () { 59 return ( 60 this._q.push({ 61 name: t, 62 args: Array.prototype.slice.call(arguments, 0), 63 }), 64 this 65 ); 66 }; 67 }, 68 s = function (e, t, n) { 69 return function (r) { 70 e._q.push({ 71 name: t, 72 args: Array.prototype.slice.call(n, 0), 73 resolve: r, 74 }); 75 }; 76 }, 77 o = function (e, t, n) { 78 e[t] = function () { 79 if (n) 80 return { 81 promise: new Promise( 82 s(e, t, Array.prototype.slice.call(arguments)), 83 ), 84 }; 85 }; 86 }, 87 i = function (e) { 88 for (var t = 0; t < m.length; t++) o(e, m[t], !1); 89 for (var n = 0; n < g.length; n++) o(e, g[n], !0); 90 }; 91 n.invoked = !0; 92 var u = t.createElement("script"); 93 (u.type = "text/javascript"), 94 (u.integrity = 95 "sha384-x0ik2D45ZDEEEpYpEuDpmj05fY91P7EOZkgdKmq4dKL/ZAVcufJ+nULFtGn0HIZE"), 96 (u.crossOrigin = "anonymous"), 97 (u.async = !0), 98 (u.src = 99 "https://cdn.amplitude.com/libs/analytics-browser-2.0.0-min.js.gz"), 100 (u.onload = function () { 101 e.amplitude.runQueuedFunctions || 102 console.log("[Amplitude] Error: could not load SDK"); 103 }); 104 var a = t.getElementsByTagName("script")[0]; 105 a.parentNode.insertBefore(u, a); 106 for ( 107 var c = function () { 108 return (this._q = []), this; 109 }, 110 p = [ 111 "add", 112 "append", 113 "clearAll", 114 "prepend", 115 "set", 116 "setOnce", 117 "unset", 118 "preInsert", 119 "postInsert", 120 "remove", 121 "getUserProperties", 122 ], 123 l = 0; 124 l < p.length; 125 l++ 126 ) 127 r(c, p[l]); 128 n.Identify = c; 129 for ( 130 var d = function () { 131 return (this._q = []), this; 132 }, 133 f = [ 134 "getEventProperties", 135 "setProductId", 136 "setQuantity", 137 "setPrice", 138 "setRevenue", 139 "setRevenueType", 140 "setEventProperties", 141 ], 142 v = 0; 143 v < f.length; 144 v++ 145 ) 146 r(d, f[v]); 147 n.Revenue = d; 148 var m = [ 149 "getDeviceId", 150 "setDeviceId", 151 "getSessionId", 152 "setSessionId", 153 "getUserId", 154 "setUserId", 155 "setOptOut", 156 "setTransport", 157 "reset", 158 "extendSession", 159 ], 160 g = [ 161 "init", 162 "add", 163 "remove", 164 "track", 165 "logEvent", 166 "identify", 167 "groupIdentify", 168 "setGroup", 169 "revenue", 170 "flush", 171 ]; 172 i(n), 173 (n.createInstance = function (e) { 174 return (n._iq[e] = { _q: [] }), i(n._iq[e]), n._iq[e]; 175 }), 176 (e.amplitude = n); 177 } 178 })(window, document); 179 })(); 180 window.amplitude.init(apiKey); 181})();</script>
181
181<script defer src="https://eu.umami.is/script.js" data-website-id="6ca6aa2c-2898-47e1-8747-6c29b3c1626c"></script>
181 </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.