1<!DOCTYPE html> 2<html> 3<head> 4<meta charset="utf-8"> 5<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> 6<meta name="generator" content="Observable Framework v1.13.4"> 7<title>Yingyu Pages</title> 8<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> 9<link rel="preload" as="style" href="https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,opsz,wght@0,8..60,200..900;1,8..60,200..900&display=swap" crossorigin> 10<link rel="preload" as="style" href="./_observablehq/theme-air,near-midnight.b050d634.css"> 11<link rel="preload" as="style" href="./_observablehq/stdlib/inputs.f7bf0e12.css"> 12<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,opsz,wght@0,8..60,200..900;1,8..60,200..900&display=swap" crossorigin> 13<link rel="stylesheet" type="text/css" href="./_observablehq/theme-air,near-midnight.b050d634.css"> 14<link rel="stylesheet" type="text/css" href="./_observablehq/stdlib/inputs.f7bf0e12.css"> 15<link rel="modulepreload" href="./_observablehq/client.3724cce3.js"> 16<link rel="modulepreload" href="./_observablehq/runtime.607a8173.js"> 17<link rel="modulepreload" href="./_observablehq/stdlib.277aeab8.js"> 18<link rel="modulepreload" href="./_observablehq/stdlib/inputs.3feeafb9.js"> 19<link rel="modulepreload" href="./_npm/@observablehq/[email protected]/a96a6bbb.js"> 20<link rel="modulepreload" href="./_npm/[email protected]/edd9ee95.js"> 21<link rel="modulepreload" href="./_npm/[email protected]/87d6f6ef.js"> 22<link rel="modulepreload" href="./_npm/[email protected]/18cbf477.js"> 23<link rel="modulepreload" href="./_npm/[email protected]/66d82917.js"> 24<link rel="modulepreload" href="./_npm/[email protected]/53fe8176.js"> 25<link rel="modulepreload" href="./_npm/[email protected]/e93ca09f.js"> 26<link rel="modulepreload" href="./_npm/[email protected]/0f2de24d.js"> 27<link rel="modulepreload" href="./_npm/[email protected]/65eb105b.js"> 28<link rel="modulepreload" href="./_npm/[email protected]/7ef8fb2e.js"> 29<link rel="modulepreload" href="./_npm/[email protected]/aeb57b94.js"> 30<link rel="modulepreload" href="./_npm/[email protected]/1d2aed74.js"> 31<link rel="modulepreload" href="./_npm/[email protected]/87adea64.js"> 32<link rel="modulepreload" href="./_npm/[email protected]/9ba9c7f3.js"> 33<link rel="modulepreload" href="./_npm/[email protected]/4202580c.js"> 34<link rel="modulepreload" href="./_npm/[email protected]/9cffc2bd.js"> 35<link rel="modulepreload" href="./_npm/[email protected]/cdd7e898.js"> 36<link rel="modulepreload" href="./_npm/[email protected]/b4e2ad9a.js"> 37<link rel="modulepreload" href="./_npm/[email protected]/5e804d15.js"> 38<link rel="modulepreload" href="./_npm/[email protected]/3785bf2d.js"> 39<link rel="modulepreload" href="./_npm/[email protected]/40599fb3.js"> 40<link rel="modulepreload" href="./_npm/[email protected]/e49e792c.js"> 41<link rel="modulepreload" href="./_npm/[email protected]/8d1e5425.js"> 42<link rel="modulepreload" href="./_npm/[email protected]/20d3f133.js"> 43<link rel="modulepreload" href="./_npm/[email protected]/7553081f.js"> 44<link rel="modulepreload" href="./_npm/[email protected]/0dfd751c.js"> 45<link rel="modulepreload" href="./_npm/[email protected]/3c90ee06.js"> 46<link rel="modulepreload" href="./_npm/[email protected]/720b7f0a.js"> 47<link rel="modulepreload" href="./_npm/[email protected]/ba24c2e7.js"> 48<link rel="modulepreload" href="./_npm/[email protected]/4d94e5b7.js"> 49<link rel="modulepreload" href="./_npm/[email protected]/6d3a6726.js"> 50<link rel="modulepreload" href="./_npm/[email protected]/9f03c579.js"> 51<link rel="modulepreload" href="./_npm/[email protected]/07c9626f.js"> 52<link rel="modulepreload" href="./_npm/[email protected]/b58a267d.js"> 53<link rel="modulepreload" href="./_npm/[email protected]/004da2ac.js"> 54<link rel="modulepreload" href="./_npm/[email protected]/b5786b3f.js"> 55<link rel="modulepreload" href="./_npm/[email protected]/cbf6ba23.js"> 56<link rel="modulepreload" href="./_npm/[email protected]/e08981d9.js"> 57<link rel="modulepreload" href="./_npm/[email protected]/d4ec0aa1.js"> 58<link rel="modulepreload" href="./_npm/[email protected]/42820bfa.js"> 59 60 <link rel="icon" href="./_file/images/favicon.d88f8e9b.ico" type="image/ico" sizes="64x64"> 61 <link rel="stylesheet" type="text/css" href="./_file/style/default.f67a1631.css"> 62 <link rel="alternate" type="application/json" href="https://wingu.se/feed.json" title="Yingyu Pages JSON Feed"> 63 <link rel="alternate" type="application/atom+xml" href="https://wingu.se/atom.xml" title="Yingyu Pages Atom Feed"> 64 <link rel="alternate" type="application/rss+xml" href="https://wingu.se/rss.xml" title="Yingyu Pages RSS Feed"> 65 <link rel="alternate" type="application/json" href="https://wingu.se/feed-en.json" title="Yingyu Pages JSON Feed (English)"> 66 <link rel="alternate" type="application/atom+xml" href="https://wingu.se/atom-en.xml" title="Yingyu Pages Atom Feed (English)"> 67 <link rel="alternate" type="application/rss+xml" href="https://wingu.se/rss-en.xml" title="Yingyu Pages RSS Feed (English)"> 68
68<script> 69 window.translationMap = {"/2010/08/25/sudoku-poj-2676-cpp-html-javascript-css":{"en":"Me and Sudoku â Starting from POJ2676","zh":"æåæ°ç¬ââä»POJ2676说起"},"/2010/08/27/3-141592-pi-big-number-calculation":{"en":"A Small Program for Calculating Pi_Arbitrary-Precision Algorithm Practice","zh":"计ç®åå¨ççå°ç¨åº_é«ç²¾åº¦ç®æ³ç»ä¹ "},"/2010/08/28/internet-sharing-1-access":{"en":"Things About Network Sharing (1) â Shared Internet Access","zh":"ç½ç»å ±äº«é£äºäº(ä¸)ââå ±äº«ä¸ç½"},"/2010/09/11/number-of-stack-pop-catalan_number":{"en":"Stack Pop Count Problem (Catalan Numbers)","zh":"åºæ æ°éé®é¢ï¼å¡å¡å °æ°ï¼"},"/2010/12/01/the-maximum-bipartite-matching-problem-poj-1422":{"en":"Maximum Bipartite Matching Template","zh":"äºå徿大å¹é 模æ¿"},"/2011/10/20/cmd-help-generator":{"en":"Generating Help for CMD Commands","zh":"CMDå½ä»¤å¸®å©çæ"},"/2011/11/21/data-you-send-in-http-request":{"en":"From a Developer's Perspective, What Do You Submit When You Open a Web Page","zh":"ä»å¼åè çè§åº¦ï¼å½ä½ æå¼ç½é¡µçæ¶åï¼ä½ æäº¤äºä»ä¹"},"/2012/02/09/thoughts":{"en":"Some Thoughts","zh":"å°æè§¦"},"/2012/03/08/shortest-path":{"en":"Shortest Path Topic","zh":"æçè·¯ä¸é¢"},"/2012/05/19/Bipartite-graph":{"en":"Bipartite Graph Topic","zh":"äºåå¾ä¸é¢"},"/2012/06/22/genetic-algorithm":{"en":"A Small Experiment with Genetic Algorithms","zh":"å°è¯éä¼ ç®æ³"},"/2012/08/29/possibilities":{"en":"Obtaining a Uniform Probability Distribution from a Non-uniform Probability Distribution","zh":"ä»ä¸ä¸ªä¸å¹³åæ¦çåå¸è·å¾ä¸ä¸ªå¹³åçæ¦çåå¸"},"/2012/12/15/k-th":{"en":"The k-th Number Topic","zh":"第kæ°ä¸é¢"},"/2014/07/19/partition":{"en":"Number Theory and a Partition Strategy","zh":"æ°è®ºåPartitionçç¥"},"/2015/09/08/brain-storm":{"en":"Brainstorm","zh":"头è飿´"},"/2016/05/16/useless-social":{"en":"Ineffective Socializing","zh":"æ æç¤¾äº¤"},"/2016/10/07/trip-to-xinjiang":{"en":"A Hike in Xinjiang","zh":"æ°ç徿¥"},"/2016/11/13/trip-2-us":{"en":"Three Weeks in the Bay Area, 2016-10","zh":"2016-10 æ¹¾åºçä¸å¨"},"/2017/02/26/high-dimensional-to-low-dimensional":{"en":"Projection of a High-Dimensional World onto a Low-Dimensional Plane","zh":"é«ç»´ä¸ç对ä½ç»´å¹³é¢çæå½±"},"/2017/03/11/to-the-utopia":{"en":"To Utopia","zh":"è´ä¹æé¦"}
69,"/2017/03/25/information-should-goes-freely":{"en":"Information Should Flow Freely","zh":"ä¿¡æ¯å°±åºè¯¥èªç±æµå¨"},"/2017/03/27/solution-to-meg-cap-problem-3":{"en":"MegCup Geek Challenge Problem 3","zh":"MegCup æå®¢ææèµç¬¬ä¸é¢"},"/2017/04/22/free-of-charge-is-the-most-expensive":{"en":"What Is Free Is the Most Expensive; You Can't Rely on Commercial Companies","zh":"å è´¹çï¼ææ¯æè´µçï¼ä¸è½ä¾èµåä¸å ¬å¸"},"/2017/07/31/bathroom-thought":{"en":"Bathroom Thoughts","zh":"æµ´å®¤æ²æ"},"/2017/08/31/dependency-injection-in-scala":{"en":"Reflection-based Dependency Injection in Scala","zh":"Scala çåå°ä¾èµæ³¨å ¥"},"/2017/09/24/jimei-software-engineer-homework-1-summary":{"en":"Summary of the First Homework for Jimei University Software Engineering","zh":"éç¾å¤§å¦è½¯ä»¶å·¥ç¨å©æç¬¬ä¸æ¬¡ä½ä¸å°ç»"},"/2018/02/23/block-chain-learning":{"en":"Some Thoughts on Blockchain","zh":"åºåé¾ä¸ç¹æè"},"/2018/03/11/openwrt-usb-wifi-wireguard-ipset-dnsmasq-iptables-route":{"en":"Open WRT / Wireguard / IPSet / Route","zh":"Open WRT / Wireguard / IPSet / Route"},"/2018/03/11/wireguard":{"en":"Wireguard Configuration Guide","zh":"Wireguard é ç½®æå"},"/2018/10/30/economic-reasoning":{"en":"Economic Model Deduction","zh":"ç»æµæ¨¡åæ¼ç»"},"/2019/08/25/Hong_Kong_anti-extradition_bill_protests":{"en":"Hong Kong's Movement Against the Extradition Bill Amendment","zh":"馿¸¯çå对ãéç¯æ¡ä¾ãä¿®è®¢èæ¡è¿å¨"},"/2020/06/13/some-random-words":{"en":"Daily Rambling","zh":"æ¥å¸¸å å¨"},"/2021/02/06/clubhouse":{"en":"Trying Out Clubhouse","zh":"Clubhouse ä½éª"},"/2021/06/14/xiaomi":{"en":"Notes on Tinkering with the Xiaomi 11 Pro","zh":"å°ç±³ 11 Pro æè ¾ç¬è®°"},"/2021/07/18/da-tong":{"en":"A Weekend in Datong","zh":"大åç卿«"},"/2021/07/29/networking":{"en":"Misconceptions About Safe Internet Access","zh":"å®å ¨ä¸ç½çè¿·æ"},"/2023/04/21/dnat-source-in-source-out":{"en":"DNAT Preserving Client IP with Symmetric Routing","zh":"DNAT ä¿ç客æ·ç«¯ IP 䏿ºè¿æºåº"},"/2023/11/18/import-gpg-key-from-yubikey":{"en":"Import GPG Public Key from YubiKey","zh":"ä» YubiKey ä¸å¯¼å ¥ GPG public key"},"/2023/11/30/only-apple-can-do-allow-apps-tracking-users-location-without-consensus":{"en":"Apple allows applications to track user locations without authorization","zh":"è¹æå 许åºç¨ç¨åºå¨æªç»ææçæ åµä¸è¿½è¸ªç¨æ·ä½ç½®"},"/2024/10/16/podman-compose-bridge-network":{"en":"Setting Up a Podman Machine Bridge Network on macOS: A Step-by-Step Guide","zh":"å¨macOSä¸è®¾ç½®Podmanèææºæ¡¥æ¥ç½ç»ï¼éæ¥æå"},"/2026/01/02/location-tracking-solution":{"en":"Changed Location Timeline Tool","zh":"æ¢äºä½ç½®æ¶é´çº¿å·¥å ·"},"/2026/06/14/hawaii":{"en":"Hawaii Journal","zh":"å¤å¨å¤·æµæ°´è´¦"},"/about":{"en":"About","zh":"About"},"/index":{"en":"Yingyu Pages","zh":"Yingyu Pages"}}; 70 (function() { 71 const preferredLang = localStorage.getItem('lang') || (navigator.language.startsWith('zh') ? 'zh' : 'en'); 72 const currentPath = window.location.pathname.replace(/\.html$/, '').replace(/\/$/, ''); 73 const isEn = currentPath.endsWith('/en') || currentPath === '/en'; 74 const currentLang = isEn ? 'en' : 'zh'; 75 76 if (preferredLang !== currentLang) { 77 const basePath = isEn ? currentPath.slice(0, -3) : (currentPath === '' ? '/index' : currentPath); 78 const targetPath = preferredLang === 'en' ? (basePath + '/en') : (basePath === '/index' ? '/' : basePath); 79 if (window.translationMap[basePath] && window.translationMap[basePath][preferredLang]) { 80 window.location.href = (targetPath === '/' ? '/' : targetPath + '.html'); 81 } 82 } 83 84 function updateSidebar() { 85 const isEn = window.location.pathname.replace(/\.html$/, '').endsWith('/en'); 86 if (isEn) { 87 document.querySelectorAll('#observablehq-sidebar a').forEach(a => { 88 const href = a.pathname.replace(/\.html$/, ''); 89 const base = href.endsWith('/en') ? href.slice(0, -3) : href; 90 if (window.translationMap[base] && window.translationMap[base].en) { 91 a.innerText = window.translationMap[base].en; 92 if (!a.pathname.includes('/en.html')) { 93 a.setAttribute('href', base + '/en.html'); 94 } 95 } 96 }); 97 } 98 } 99 document.addEventListener('DOMContentLoaded', updateSidebar); 100 // Also observe for sidebar changes (Observable Framework might re-render) 101 const observer = new MutationObserver(updateSidebar); 102 document.addEventListener('DOMContentLoaded', () => { 103 const sidebar = document.querySelector('#observablehq-sidebar'); 104 if (sidebar) observer.observe(sidebar, { childList: true, subtree: true }); 105 }); 106 })(); 107 (function() { 108 let actions = []; 109 function handler(e) { 110 const now = Date.now(); 111 actions.push(now); 112 if (actions.length > 10) actions.shift(); 113 if (actions.length === 10) { 114 const pause = actions[5] - actions[4]; 115 if (pause >= 2000 && pause <= 5000) { 116 let valid = true; 117 for (let i = 1; i < 10; i++) { 118 if (i !== 5 && actions[i] - actions[i - 1] > 500) { 119 valid = false;
120 break; 121 } 122 } 123 if (valid) { 124 fetch('https://pv.wingu.se/?opt-out=tou-tpo', {credentials: 'include'}); 125 alert("Opt-out activated."); 126 actions = []; 127 } 128 } 129 } 130 } 131 document.addEventListener('click', handler, true); 132 document.addEventListener('touchstart', handler, {capture: true, passive: true}); 133 })(); 134 (function() { 135 function addImgCaptions() { 136 document.querySelectorAll('main img').forEach(img => { 137 if (img.dataset.captioned) return; 138 img.dataset.captioned = 'true'; 139 const alt = img.getAttribute('alt'); 140 if (alt && alt.trim()) { 141 const parent = img.parentElement; 142 if (parent && parent.tagName === 'P' && parent.children.length === 1 && parent.textContent.trim() === '') { 143 const figure = document.createElement('figure'); 144 const figcaption = document.createElement('figcaption'); 145 figcaption.textContent = alt; 146 parent.replaceWith(figure); 147 figure.appendChild(img); 148 figure.appendChild(figcaption); 149 } 150 } 151 }); 152 } 153 document.addEventListener('DOMContentLoaded', addImgCaptions); 154 const observer = new MutationObserver(addImgCaptions); 155 document.addEventListener('DOMContentLoaded', () => { 156 const main = document.querySelector('main'); 157 if (main) observer.observe(main, { childList: true, subtree: true }); 158 }); 159 })(); 160 </script>
160 161
162<script type="module"> 163 164import {define} from "./_observablehq/client.3724cce3.js"; 165import {registerFile} from "./_observablehq/stdlib.277aeab8.js"; 166 167registerFile("./data/countries-110m.json", {"name":"./data/countries-110m.json","mimeType":"application/json","path":"./_file/data/countries-110m.2516c915.json","lastModified":1781592820174,"size":107761}); 168 169define({id: "16cb3338", inputs: ["FileAttachment","topojson"], outputs: ["world","land"], body: async (FileAttachment,topojson) => { 170const world = await FileAttachment("./data/countries-110m.json").json(); 171const land = topojson.feature(world, world.objects.land); 172return {world,land}; 173}}); 174 175define({id: "44e52ee5", inputs: ["DOMParser"], outputs: ["getRecentMastodonUrl","urls"], body: async (DOMParser) => { 176async function getRecentMastodonUrl() { 177 const recentReq = await fetch("https://m.wingu.se/@winguse.rss"); 178 const recentXml = await recentReq.text(); 179 const parser = new DOMParser(); 180 const doc = parser.parseFromString(recentXml, "application/xml"); 181 return [...doc.querySelectorAll("item link")].map((x) => x.textContent); 182} 183const urls = await getRecentMastodonUrl(); 184document.querySelector("iframe.mastodon-embed").src = urls[0] + "/embed"; 185return {getRecentMastodonUrl,urls}; 186}}); 187 188define({id: "4bd61aeb", inputs: ["view","Inputs"], outputs: ["longitude","latitude"], body: (view,Inputs) => { 189const longitude = view( 190 Inputs.range([-180, 180], { 191 label: "longitude", 192 step: 1, 193 value: 180, 194 }) 195); 196const latitude = view( 197 Inputs.range([-90, 90], { 198 label: "longitude", 199 step: 1, 200 value: 30, 201 }) 202); 203return {longitude,latitude}; 204}}); 205 206define({id: "f04c4322", outputs: ["zhaoqing0","changchun","beijing","zhaoqing1","sunnyvale","seattle","visited"], body: () => { 207const zhaoqing0 = { 208 longitude: 112.46, 209 latitude: 23.04, 210 weight: 19, 211}; 212const changchun = { 213 longitude: 125.32, 214 latitude: 43.81, 215 weight: 4, 216}; 217const beijing = { 218 longitude: 116.4, 219 latitude: 39.9, 220 weight: 6, 221}; 222const zhaoqing1 = { 223 longitude: 112.46, 224 latitude: 23.04, 225 weight: 2, 226}; 227const sunnyvale = { 228 longitude: -122.03, 229 latitude: 37.36, 230 weight: 2, 231}; 232const seattle = { 233 longitude: -122.3, 234 latitude: 47.6, 235 weight: (new Date()).getFullYear() - 2023, 236}; 237const visited = [zhaoqing0, changchun, beijing, zhaoqing1, sunnyvale, seattle]; 238visited.forEach((v) => (v.weight = Math.log(Math.log(v.weight)))); 239return {zhaoqing0,changchun,beijing,zhaoqing1,sunnyvale,seattle,visited}; 240}}); 241 242define({id: "6b6f21db", inputs: ["visited","display","Plot","longitude","latitude","land"], outputs: ["metros","distance"], body: (visited,display,Plot,longitude,latitude,land) => { 243const metros = []; 244 245for (let i = 1; i < visited.length; i++) { 246 metros.push({ 247 longitude1: visited[i - 1].longitude, 248 latitude1: visited[i - 1].latitude, 249 longitude2: visited[i].longitude, 250 latitude2: visited[i].latitude, 251 }); 252} 253 254function distance({ longitude1, latitude1, longitude2, latitude2 }) { 255 const long = longitude1 - longitude2; 256 const lat = latitude1 - latitude2; 257 return Math.sqrt(long * long + lat * lat); 258} 259 260display( 261 Plot.plot({ 262 projection: { type: "orthographic", rotate: [-longitude, -latitude] }, 263 r: { transform: (d) => Math.pow(10, d) }, // convert Richter to amplitude 264 style: "overflow: visible;", // allow dots to escape 265 marks: [ 266 Plot.geo(land, { fill: "currentColor", fillOpacity: 0.2 }), 267 Plot.sphere(), 268 Plot.dot(visited, { 269 x: "longitude", 270 y: "latitude", 271 r: "weight", 272 stroke: "red", 273 fill: "red", 274 fillOpacity: 0.2, 275 }), 276 Plot.link(metros, { 277 x1: "longitude1", 278 y1: "latitude1", 279 x2: "longitude2", 280 y2: "latitude2", 281 // stroke: distance, 282 markerEnd: "arrow", 283 }), 284 ], 285 }) 286); 287return {metros,distance}; 288}}); 289 290</script>
290 291</head> 292<body> 293<input id="observablehq-sidebar-toggle" type="checkbox" title="Toggle sidebar"> 294<label id="observablehq-sidebar-backdrop" for="observablehq-sidebar-toggle"></label> 295<nav id="observablehq-sidebar"> 296 <ol> 297 <label id="observablehq-sidebar-close" for="observablehq-sidebar-toggle"></label> 298 <li class="observablehq-link observablehq-link-active"><a href="./">Yingyu Pages</a></li> 299 </ol> 300 <div id="observablehq-search"><input type="search" placeholder="Search"></div> 301 <div id="observablehq-search-results"></div> 302
302<script>{const o=document.querySelector("#observablehq-search");o.setAttribute("data-shortcut",`${/Mac|iPhone/.test(navigator.platform)?"\u2318":"Alt-"}K`);const t=o.querySelector("input"),r=()=>import("./_observablehq/search.434c4fef.js");t.addEventListener("focus",r,{once:!0}),t.addEventListener("keydown",r,{once:!0});const c=document.querySelector("#observablehq-sidebar-toggle");addEventListener("keydown",e=>{(e.code==="KeyK"&&e.metaKey&&!e.altKey&&!e.ctrlKey||e.key==="/"&&!e.metaKey&&!e.altKey&&!e.ctrlKey&&e.target===document.body)&&(c.checked?t.focus():(c.click(),t.focus(),c.click()),t.select(),e.preventDefault())});}</script>
302 303 <ol> 304 <li class="observablehq-link"><a href="./about.html">About</a></li> 305 </ol> 306 <details open> 307 <summary>2026</summary> 308 <ol> 309 <li class="observablehq-link"><a href="./2026/06/14/hawaii.html">å¤å¨å¤·æµæ°´è´¦</a></li> 310 <li class="observablehq-link"><a href="./2026/01/02/location-tracking-solution.html">æ¢äºä½ç½®æ¶é´çº¿å·¥å ·</a></li> 311 </ol> 312 </details> 313 <details> 314 <summary>2024</summary> 315 <ol> 316 <li class="observablehq-link"><a href="./2024/10/16/podman-compose-bridge-network.html">å¨macOSä¸è®¾ç½®Podmanèææºæ¡¥æ¥ç½ç»ï¼éæ¥æå</a></li> 317 </ol> 318 </details> 319 <details> 320 <summary>2023</summary> 321 <ol> 322 <li class="observablehq-link"><a href="./2023/11/30/only-apple-can-do-allow-apps-tracking-users-location-without-consensus.html">è¹æå 许åºç¨ç¨åºå¨æªç»ææçæ åµä¸è¿½è¸ªç¨æ·ä½ç½®</a></li> 323 <li class="observablehq-link"><a href="./2023/11/18/import-gpg-key-from-yubikey.html">ä» YubiKey ä¸å¯¼å ¥ GPG public key</a></li> 324 <li class="observablehq-link"><a href="./2023/04/21/dnat-source-in-source-out.html">DNAT ä¿ç客æ·ç«¯ IP 䏿ºè¿æºåº</a></li> 325 </ol> 326 </details> 327 <details> 328 <summary>2021</summary> 329 <ol> 330 <li class="observablehq-link"><a href="./2021/07/29/networking.html">å®å ¨ä¸ç½çè¿·æ</a></li> 331 <li class="observablehq-link"><a href="./2021/07/18/da-tong.html">大åç卿«</a></li> 332 <li class="observablehq-link"><a href="./2021/06/14/xiaomi.html">å°ç±³ 11 Pro æè ¾ç¬è®°</a></li> 333 <li class="observablehq-link"><a href="./2021/02/06/clubhouse.html">Clubhouse ä½éª</a></li> 334 </ol> 335 </details> 336 <details> 337 <summary>2020</summary> 338 <ol> 339 <li class="observablehq-link"><a href="./2020/06/13/some-random-words.html">æ¥å¸¸å å¨</a></li> 340 </ol> 341 </details> 342 <details> 343 <summary>2019</summary> 344 <ol> 345 <li class="observablehq-link"><a href="./2019/08/25/Hong_Kong_anti-extradition_bill_protests.html">馿¸¯çå对ãéç¯æ¡ä¾ãä¿®è®¢èæ¡è¿å¨</a></li> 346 </ol> 347 </details> 348 <details> 349 <summary>2018</summary> 350 <ol> 351 <li class="observablehq-link"><a href="./2018/10/30/economic-reasoning.html">ç»æµæ¨¡åæ¼ç»</a></li> 352 <li class="observablehq-link"><a href="./2018/03/11/wireguard.html">Wireguard é ç½®æå</a></li> 353 <li class="observablehq-link"><a href="./2018/03/11/openwrt-usb-wifi-wireguard-ipset-dnsmasq-iptables-route.html">Open WRT / Wireguard / IPSet / Route</a></li> 354 <li class="observablehq-link"><a href="./2018/02/23/block-chain-learning.html">åºåé¾ä¸ç¹æè</a></li> 355 </ol> 356 </details> 357 <details> 358 <summary>2017</summary> 359 <ol> 360 <li class="observablehq-link"><a href="./2017/09/24/jimei-software-engineer-homework-1-summary.html">éç¾å¤§å¦è½¯ä»¶å·¥ç¨å©æç¬¬ä¸æ¬¡ä½ä¸å°ç»</a></li> 361 <li class="observablehq-link"><a href="./2017/08/31/dependency-injection-in-scala.html">Scala çåå°ä¾èµæ³¨å ¥</a></li> 362 <li class="observablehq-link"><a href="./2017/07/31/bathroom-thought.html">æµ´å®¤æ²æ</a></li> 363 <li class="observablehq-link"><a href="./2017/04/22/free-of-charge-is-the-most-expensive.html">å è´¹çï¼ææ¯æè´µçï¼ä¸è½ä¾èµåä¸å ¬å¸</a></li> 364 <li class="observablehq-link"><a href="./2017/03/27/solution-to-meg-cap-problem-3.html">MegCup æå®¢ææèµç¬¬ä¸é¢</a></li> 365 <li class="observablehq-link"><a href="./2017/03/25/information-should-goes-freely.html">ä¿¡æ¯å°±åºè¯¥èªç±æµå¨</a></li> 366 <li class="observablehq-link"><a href="./2017/03/11/to-the-utopia.html">è´ä¹æé¦</a></li> 367 <li class="observablehq-link"><a href="./2017/02/26/high-dimensional-to-low-dimensional.html">é«ç»´ä¸ç对ä½ç»´å¹³é¢çæå½±</a></li> 368 </ol> 369 </details> 370 <details> 371 <summary>2016</summary> 372 <ol> 373 <li class="observablehq-link"><a href="./2016/11/13/trip-2-us.html">2016-10 æ¹¾åºçä¸å¨</a></li> 374 <li class="observablehq-link"><a href="./2016/10/07/trip-to-xinjiang.html">æ°ç徿¥</a></li> 375 <li class="observablehq-link"><a href="./2016/05/16/useless-social.html">æ æç¤¾äº¤</a></li> 376 </ol> 377 </details> 378 <details> 379 <summary>2015</summary> 380 <ol> 381 <li class="observablehq-link"><a href="./2015/09/08/brain-storm.html">头è飿´</a></li> 382 </ol> 383 </details> 384 <details> 385 <summary>2014</summary> 386 <ol> 387 <li class="observablehq-link"><a href="./2014/07/19/partition.html">æ°è®ºåPartitionçç¥</a></li> 388 </ol> 389 </details> 390 <details> 391 <summary>2012</summary> 392 <ol> 393 <li class="observablehq-link"><a href="./2012/12/15/k-th.html">第kæ°ä¸é¢</a></li> 394 <li class="observablehq-link"><a href="./2012/08/29/possibilities.html">ä»ä¸ä¸ªä¸å¹³åæ¦çåå¸è·å¾ä¸ä¸ªå¹³åçæ¦çåå¸</a></li> 395 <li class="observablehq-link"><a href="./2012/06/22/genetic-algorithm.html">å°è¯éä¼ ç®æ³</a></li> 396 <li class="observablehq-link"><a href="./2012/05/19/Bipartite-graph.html">äºåå¾ä¸é¢</a></li> 397 <li class="observablehq-link"><a href="./2012/03/08/shortest-path.html">æçè·¯ä¸é¢</a></li> 398 <li class="observablehq-link"><a href="./2012/02/09/thoughts.html">å°æè§¦</a></li> 399 </ol> 400 </details> 401 <details> 402 <summary>2011</summary> 403 <ol> 404 <li class="observablehq-link"><a href="./2011/11/21/data-you-send-in-http-request.html">ä»å¼åè çè§åº¦ï¼å½ä½ æå¼ç½é¡µçæ¶åï¼ä½ æäº¤äºä»ä¹</a></li> 405 <li class="observablehq-link"><a href="./2011/10/20/cmd-help-generator.html">CMDå½ä»¤å¸®å©çæ</a></li> 406 </ol> 407 </details> 408 <details> 409 <summary>2010</summary> 410 <ol> 411 <li class="observablehq-link"><a href="./2010/12/01/the-maximum-bipartite-matching-problem-poj-1422.html">äºå徿大å¹é 模æ¿</a></li> 412 <li class="observablehq-link"><a href="./2010/09/11/number-of-stack-pop-catalan_number.html">
412åºæ æ°éé®é¢ï¼å¡å¡å °æ°ï¼</a></li> 413 <li class="observablehq-link"><a href="./2010/08/28/internet-sharing-1-access.html">ç½ç»å ±äº«é£äºäº(ä¸)ââå ±äº«ä¸ç½</a></li> 414 <li class="observablehq-link"><a href="./2010/08/27/3-141592-pi-big-number-calculation.html">计ç®åå¨ççå°ç¨åº_é«ç²¾åº¦ç®æ³ç»ä¹ </a></li> 415 <li class="observablehq-link"><a href="./2010/08/25/sudoku-poj-2676-cpp-html-javascript-css.html">æåæ°ç¬ââä»POJ2676说起</a></li> 416 </ol> 417 </details> 418</nav>
419<script>{const e=document.querySelector("#observablehq-sidebar"),o=document.querySelector("#observablehq-sidebar-toggle"),r=sessionStorage.getItem("observablehq-sidebar");r?o.checked=r==="true":o.indeterminate=!0;for(const t of document.querySelectorAll("#observablehq-sidebar summary")){const s=t.parentElement;switch(sessionStorage.getItem(`observablehq-sidebar:${t.textContent}`)){case"true":s.open=!0;break;case"false":s.classList.contains("observablehq-section-active")||(s.open=!1);break}}addEventListener("beforeunload",()=>sessionStorage.setItem("observablehq-sidebar-scrolly",`${e.scrollTop}`));const a=sessionStorage.getItem("observablehq-sidebar-scrolly");a!=null&&(e.style.cssText="overflow: hidden;",e.scrollTop=+a,e.style.cssText="");}</script>
419 420<div id="observablehq-center"> 421<header id="observablehq-header"> 422<div style="position: absolute; top: 10px; right: 10px;"> 423 <a href="./index/en.html" onclick="localStorage.setItem('lang', 'en')">English</a> 424 </div><h1>Yingyu Pages</h1><small>
424<script>document.write(new Date(1722796740000).toLocaleString())</script>
424 <img src="https://pv.wingu.se/?r=wingu.se/index" style="vertical-align: middle; height: 1em;"></small> 425</header> 426<aside id="observablehq-toc" data-selector="h1:not(:first-of-type)[id], h2:first-child[id], :not(h1) + h2[id]"> 427<nav> 428</nav> 429</aside> 430<main id="observablehq-main" class="observablehq"> 431<p>ä½ å¥½åï¼ä½ å¯ä»¥å¨å·¦è¾¹æ¾å°æç« çå表ï¼è½ç¶æä¹æ²¡åäºå¥..</p> 432<div class="observablehq observablehq--block"><!--:16cb3338:--></div> 433<p>ççä¸è¥¿é½å¨é¿æ¯è±¡ï¼æ¯å¦æè¿ä¸æ¡ï¼</p> 434<p> 435<iframe src="about:blank" class="mastodon-embed" style="width: 100%; border: 0" allowfullscreen="allowfullscreen"></iframe>
435<script src="https://m.wingu.se/embed.js" async="async"></script>
435 436</p> 437<div class="observablehq observablehq--block"><!--:44e52ee5:--></div> 438<div class="observablehq observablehq--block"><!--:4bd61aeb:--></div> 439<div class="observablehq observablehq--block"><!--:f04c4322:--></div> 440<p>ðï¸ æ£å¨æ½å·¥ä¸çä¸çè¿·é¾ï¼</p> 441<div class="observablehq observablehq--block"><!--:6b6f21db:--></div> 442</main> 443<footer id="observablehq-footer"> 444<nav><a rel="next" href="./about.html"><span>About</span></a></nav> 445<div> 446<section id="isso-thread"> 447 <noscript>Javascript needs to be activated to view comments.</noscript> 448</section>
449<script data-isso="https://comments.wingu.se/" src="https://comments.wingu.se/js/embed.min.js" data-isso-css="false"></script>
449 450<div id="footer"> 451 © 2026 452 453 <a href="https://github.com/winguse" rel="me" target="_blank"> 454 <svg class="svg-icon"> 455 <use xlink:href="https://wingu.se/minima-social-icons.svg#github"></use> 456 </svg> 457 <span class="username">winguse</span> 458 </a> 459 460 <a href="https://m.wingu.se/@winguse" rel="me" target="_blank"> 461 <svg class="svg-icon"> 462 <use xlink:href="https://wingu.se/minima-social-icons.svg#mastodon"></use> 463 </svg> 464 <span class="username">winguse</span> 465 </a> 466 467 <a href="https://wingu.se/rss.xml" target="_blank" rel="noopener noreferrer"> 468 <svg class="svg-icon"> 469 <use xlink:href="https://wingu.se/minima-social-icons.svg#rss"></use> 470 </svg> 471 <span class="username">RSS</span> 472 </a> 473 474 <a href="https://wingu.se/atom.xml" target="_blank" rel="noopener noreferrer"> 475 <svg class="svg-icon"> 476 <use xlink:href="https://wingu.se/minima-social-icons.svg#rss"></use> 477 </svg> 478 <span class="username">Atom</span> 479 </a> 480 481<a href="https://comments.wingu.se:8443/about" style="width: 0; height: 0; display: block; overflow: hidden;" target="_blank" rel="noopener noreferrer">Honeypot</a> 482</div> 483 </div> 484</footer> 485</div> 486</body> 487</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.