PageSourceSearch

https://wingu.se/

html wingu.se collected 2026-09-29 15:08:34 UTC 29,394 bytes, 487 lines download raw bytes

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&amp;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&amp;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.