PageSourceSearch

https://diygod.cc/posts/

html diygod.cc collected 2026-09-24 20:51:45 UTC 828,618 bytes, 472 lines download raw bytes

1<!DOCTYPE html><html lang="zh-CN" data-astro-cid-yu3cdcui> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content="写代码是热爱,写到世界充满爱!"><title>文章</title><link rel="preconnect" href="https://www.googletagmanager.com">
vendor: 63 bytes, line 1
1<script async src="https://www.googletagmanager.com/gtag/js?id=
1G-PL7S2LX8EX
vendor: 11 bytes, line 1
1"></script>
1<script>const gaId = "G-PL7S2LX8EX";
2window.dataLayer = window.dataLayer || [];
3function gtag(){dataLayer.push(arguments);}
4gtag('js', new Date());
5gtag('config', gaId);</script>
5<link rel="icon" type="image/x-icon" href="/favicon.ico"><link rel="stylesheet" href="/_astro/_slug_.BO2eiwd2.css">
6<link rel="stylesheet" href="/_astro/_slug_.CdTi_Fns.css">
6<script type="module" src="/_astro/page.DsfK6RKs.js"></script>
6</head> <body class="antialiased bg-white dark:bg-neutral-950" data-astro-cid-yu3cdcui> <div class="absolute w-full h-auto" style="z-index:-1"> <div class="absolute top-0 left-0 w-1/2 h-auto bg-neutral-100 dark:bg-neutral-800"> <div class="absolute inset-0 z-30 w-full h-full pointer-events-none bg-gradient-to-tl from-white dark:from-neutral-950 from-50% via-90% to-100% via-transparent to-transparent"></div> <div class="flex flex-col w-full h-full border-t border-l divide-y divide-dashed divide-neutral-300 dark:divide-neutral-700 border-neutral-300 dark:border-neutral-900"> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divide-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divide-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divide-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divide-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divi
6de-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divide-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> </div> </div> <div class="absolute top-0 right-0 w-1/2 h-auto bg-neutral-100 dark:bg-neutral-800"> <div class="absolute inset-0 z-30 w-full h-full pointer-events-none bg-gradient-to-tr from-white dark:from-neutral-950 from-50% via-90% to-100% via-trans
6parent to-transparent"></div> <div class="flex flex-col w-full h-full border-t border-l divide-y divide-dashed divide-neutral-300 dark:divide-neutral-700 border-neutral-300 dark:border-neutral-900"> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divide-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divide-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divide-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divide-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divide-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> <div class="relative flex w-full divide-x h-[30px] sm:h-[45px] md:h-[60px] xl:h-[88px] divi
6de-neutral-300 dark:divide-neutral-700 divide-dashed"> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> <div class="w-full h-auto bg-white dark:bg-neutral-950 aspect-square {classes}"></div> </div> </div> </div> </div> <!-- This is an invisible div with relative position so that it takes up the height of the menu (because menu is absolute/fixed) --><div class="relative w-full h-20 opacity-0 pointer-events-none"></div> <header id="header" class="absolute top-0 z-50 w-full h-20"> <div class="flex items-center justify-between h-full max-w-5xl pl-6 pr-4 mx-auto border-b border-l-0 border-r-0 border-transparent select-none lg:border-r lg:border-l lg:rounded-b-xl"> <a href="/" class="h-5 text-base group relative z-30 flex items-center space-x-2 text-black dark:text-white font-semibold"> <img src="/favicon.ico" alt="DIYgod" width="20" height="20" decoding="async" class="size-5 object-contain"> <span class="text-nowrap">Hi, DIYgod</span> </a> <div id="mobileMenuBackground" onclick="closeMobileMenu()" class="fixed inset-0 z-20 hidden w-screen h-screen duration-300 ease-out bg-white/90 dark:bg-neutral-950/90"></div> <nav class="relative z-30 flex flex-row-reverse justify-start w-full text-sm sm:justify-end text-neutral-500 dark:text-neutral-400 sm:flex-row"> <div id="openMenu" class="flex flex-col items-end justify-center w-6 h-6 ml-4 cursor-pointer sm:hidden"> <svg class="w-8 h-8 dark:text-neutral-200" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" stroke="currentColor"><path d="M4 8h16M4 16h16"></path></svg> </div> <div id="closeMenu" class="flex flex-col items-end justify-center hidden w-6 h-6 ml-4 -translate-x-1 cursor-pointer sm:hidden">
6 <svg class="w-6 h-6 text-neutral-600 dark:text-neutral-200" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" stroke="currentColor"><path d="M6 18L18 6M6 6l12 12"></path></svg> </div> <div id="menu" class="fixed top-[75px] ease-out duration-300 sm:top-0 w-full left-0 sm:py-0 pt-7 pb-4 dm:mx-0 left-0 z-40 flex-col items-end justify-start hidden w-full h-auto text-sm sm:text-base sm:h-auto sm:relative sm:flex-row sm:flex sm:text-sm sm:w-auto sm:pr-0 sm:pt-0"> <div class="absolute inset-0 top-0 right-0 block w-full h-full px-3 sm:hidden"> <div class="relative w-full h-full bg-white border border-dashed border-neutral-300 dark:border-neutral-700 backdrop-blur-sm rounded-xl dark:bg-neutral-950"></div> </div> <a href="/" class="relative flex items-center justify-center w-full px-3 py-2 font-medium tracking-wide text-center duration-200 ease-out sm:py-0 sm:mb-0 md:w-auto hover:text-neutral-900 dark:hover:text-white"> 首页 </a><a href="/posts" class="relative flex items-center justify-center w-full px-3 py-2 font-medium tracking-wide text-center duration-200 ease-out sm:py-0 sm:mb-0 md:w-auto hover:text-neutral-900 dark:hover:text-white"> 文章 </a><a href="/projects" class="relative flex items-center justify-center w-full px-3 py-2 font-medium tracking-wide text-center duration-200 ease-out sm:py-0 sm:mb-0 md:w-auto hover:text-neutral-900 dark:hover:text-white"> 项目 </a><a href="/friends" class="relative flex items-center justify-center w-full px-3 py-2 font-medium tracking-wide text-center duration-200 ease-out sm:py-0 sm:mb-0 md:w-auto hover:text-neutral-900 dark:hover:text-white"> 友邻 </a><a href="/about" class="relative flex items-center justify-center w-full px-3 py-2 font-medium tracking-wide text-center duration-200 ease-out sm:py-0 sm:mb-0 md:w-auto hover:text-neutral-900 dark:hover:text-white"> 关于 </a> </div> <div class="relative flex items-center" id="langSwitcher"> <button type="button" class="flex items-center gap-1.5 px-3 font-medium tracking-wide text-neutral-500 dark:text-neutral-400 hover:text-neutral-900 dark:hover:text-white transition-colors duration-200" id="langToggle" aria-haspopup="true" aria-expanded="false" aria-label="Switch language"> <svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg"> <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 20c.9-3.068 2.116-6.272 3.689-9.118a.92.92 0 0 1 1.622 0C17.884 13.728 19.1 16.932 20 20m-7.65-3h6.3M4 6h5m0 0h3M9 6V4m3 2h2m-2 0c0 2.39-1.071 4.78-3 6.744m0 0C7.7 14.066 6.012 15.195 4 16m5-3.256C7.887 11.61 7.06 10.335 6.559 9M9 12.744c1 1.018 2.23 1.92 3.662 2.65"></path> </svg> <svg class="w-3 h-3 transition-transform hidden sm:block" id="langChevron" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path> </svg> </button> <div id="langDropdown" class="absolute right-0 top-full mt-2 w-28 bg-white dark:bg-neutral-900 border border-neutral-200 dark:border-neutral-700 rounded-lg shadow-lg opacity-0 invisible transition-all duration-200 z-50"> <a href="/posts/" class="block px-4 py-2 text-sm rounded-t-lg bg-neutral-100 dark:bg-neutral-800 text-neutral-900 dark:text-white font-medium">
7中文
8</a> <a href="/en/posts/" class="block px-4 py-2 text-sm rounded-b-lg text-neutral-600 dar
8k:text-neutral-300 hover:bg-neutral-50 dark:hover:bg-neutral-800">
9English
10</a> </div> </div> 
10<script>
11  const langSwitcher = document.getElementById("langSwitcher");
12  const langToggle = document.getElementById("langToggle");
13  const langDropdown = document.getElementById("langDropdown");
14  const langChevron = document.getElementById("langChevron");
15
16  let isOpen = false;
17
18  function toggleDropdown() {
19    isOpen = !isOpen;
20    if (isOpen) {
21      langDropdown.classList.remove("opacity-0", "invisible");
22      langDropdown.classList.add("opacity-100", "visible");
23      langChevron.classList.add("rotate-180");
24      langToggle.setAttribute("aria-expanded", "true");
25    } else {
26      langDropdown.classList.add("opacity-0", "invisible");
27      langDropdown.classList.remove("opacity-100", "visible");
28      langChevron.classList.remove("rotate-180");
29      langToggle.setAttribute("aria-expanded", "false");
30    }
31  }
32
33  langToggle.addEventListener("click", (e) => {
34    e.stopPropagation();
35    toggleDropdown();
36  });
37
38  document.addEventListener("click", (e) => {
39    if (!langSwitcher.contains(e.target) && isOpen) {
40      toggleDropdown();
41    }
42  });
43
44  document.addEventListener("keydown", (e) => {
45    if (e.key === "Escape" && isOpen) {
46      toggleDropdown();
47    }
48  });
49</script>
49 <div id="darkToggle" class="relative items-center pl-6 ml-4 font-medium tracking-wide cursor-pointer text-neutral-800 group dark:text-white hidden"> <div class="absolute left-0 flex items-center justify-center w-6 h-6 overflow-hidden border-b border-transparent horizon group-hover:border-neutral-600"> <svg class="absolute w-6 h-6 transition duration-700 transform ease" id="sun" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" stroke="currentColor"><path d="M12 3v1m0 16v1m9-9h-1M4 12H3m15.364 6.364l-.707-.707M6.343 6.343l-.707-.707m12.728 0l-.707.707M6.343 17.657l-.707.707M16 12a4 4 0 11-8 0 4 4 0 018 0z"></path></svg> <svg class="absolute hidden w-6 h-6 transition duration-700 transform ease" id="moon" fill="none" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewBox="0 0 24 24" stroke="currentColor"><path d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path></svg> </div> <span class="hidden sm:inline-block"> <span id="dayText" class="ml-2">Day mode</span> <span id="nightText" class="hidden ml-2">Night mode</span> </span> </div> </nav> </div> </header>  <section class="relative z-20 max-w-4xl mx-auto my-12 px-7 lg:px-0"> <div class="relative z-20 w-full mx-auto lg:mx-0"> <h2 class="text-2xl font-bold tracking-tight text-neutral-900 dark:text-neutral-100 sm:text-3xl lg:text-4xl"> 文章 </h2>
49 <p class="mt-3 text-sm leading-6 text-neutral-600 dark:text-neutral-400 sm:mt-4 lg:mt-6 sm:leading-7 lg:leading-8 sm:text-base lg:text-lg">  </p> </div> <div class="z-50 flex flex-col w-full gap-4 my-8"> <label class="sr-only" for="searchInput">搜索关键词</label> <div class="relative"> <input id="searchInput" type="search" name="q" placeholder="从文章标题和内容中查找关键词" class="w-full px-4 py-3 text-sm border border-dashed rounded-xl outline-none bg-white/70 dark:bg-neutral-900/70 border-neutral-300 dark:border-neutral-700 focus:border-neutral-500 focus:dark:border-neutral-500" autocomplete="off"> <div class="absolute inset-y-0 right-3 flex items-center text-neutral-400 dark:text-neutral-500 pointer-events-none"> <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor" class="w-4 h-4"> <path stroke-linecap="round" stroke-linejoin="round" d="m21 21-3.5-3.5m0 0A7.5 7.5 0 1 0 5 5a7.5 7.5 0 0 0 12.5 12.5Z"></path> </svg> </div> </div> <div class="text-xs text-neutral-500 dark:text-neutral-400"> <span id="resultsCount">89</span> 篇文章
50</div> <div id="searchEmpty" class="hidden text-sm text-neutral-600 dar
50k:text-neutral-400">
51没有匹配的文章,换个关键词试试。
52</div> <div id="searchResults" class="flex flex-col items-stretch w-full gap-5"> <div data-post-slug="2025" data-post-link="/2025" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2025" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 2025 重新定义的生活 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
52 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>AI 生产力革命与迷茫、迎来新生命、努力搞钱、不合时宜的开源思维、赛博生活</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2025年12月25日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93" class="hover:underline decoration-dashed underline-offset-4">#年终总结</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/cover.C24HauLY_269oFg.webp" alt="2025 重新定义的生活" loading="lazy" decoding="async" fetchpriority="auto" width="1919" height="1079" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="europe-travel" data-post-link="/europe-travel" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/europe-travel" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 欧洲旅游VLOG | 巴塞罗那 罗马 梵蒂冈 威尼斯 米兰 苏黎世 因特拉肯 巴黎 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
52 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>2022年12月...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2025年12月20日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/vlog" class="hover:underline decoration-dashed underline-offset-4">#vlog</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/cover.BLf3RScM_Z1cjLo6.webp" alt="欧洲旅游VLOG | 巴塞罗那 罗马 梵蒂冈 威尼斯 米兰 苏黎世 因特拉肯 巴黎" loading="lazy" decoding="async" fetchpriority="auto" width="3840" height="2160" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="beancount" data-post-link="/beancount" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/beancount" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 上古神器 Beancount:Crypto 与 AI 时代的复式记账终极方案 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
52 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>很多时候我们觉得记账麻烦,并不是 UI 不够漂亮、交互不够顺滑,而是记账方法不够科学。当方法足够科学时,你甚至不需要 UI,一个 CLI + 几个纯文本文件 + 一套清晰语法,就能把财务世界描述得非常准确</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2025年12月12日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/fava-1.C8Cigb3S_1D95z3.webp" alt="上古神器 Beancount:Crypto 与 AI 时代的复式记账终极方案" loading="lazy" decoding="async" fetchpriority="auto" width="2956" height="2006" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="6-year-of-rsshub" data-post-link="/6-year-of-rsshub" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/6-year-of-rsshub" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 一个六岁开源项目的崩溃与新生 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
52 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>我有一个维护了六年的开源项目—— RSSHub,它正在面临崩溃
53
54表面上,它有接近 30k Stars、900 多 Contributors、每月 3 亿多次请求和数不清的用户、每月几十刀的赞助、有源源不断的 issue 和 pr、代码几乎每天更新,非常健康和充满活力</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2024年3月10日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/QmUofaeyjsm8F65Z93HQxYLxFYzCZN9LimW5Q5y91zTTfQ.ToFKWVTB_2jfA2s.webp" alt="一个六岁开源项目的崩溃与新生" loading="lazy" decoding="async" fetchpriority="auto" width="1770" height="676" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="palworld" data-post-link="/palworld" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/palworld" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 和帕鲁生活在一起的两周 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
54 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>哪个小男孩没幻想过生活在这样一个充满宝可梦伙伴的世界,它们能听懂且愿意倾听我们说话,有着不同的特点和强大的技能,而且都很可爱,我们可以跟它们睡觉吃饭、并肩作战探索世界,永远不再孤独,不管是谁都可以找到最适合自己的宝可梦</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2024年2月18日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/QmSSQnJ3wRPuyGGP7VzBkGq91vN6Ybs3KSQxKM6NKSWpEF.B3YmnQAi_Zr3xSd.webp" alt="和帕鲁生活在一起的两周" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1080" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="twitter-ddos" data-post-link="/twitter-ddos" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/twitter-ddos" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> Twitter 对开源项目发起 DDoS 攻击 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
54 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>Twitter 被马斯克收购后,从去年 8 月开始,他们对开源第三方集成和第三方客户端进行了一系列明里暗里的打压和攻击,这样做是为了阻止用户通过非官方客户端访问和使用 Twitter,来增加公司的广告和会员营收</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2024年1月28日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/QmZAGWbWRjadtgCAF6SoAgmRb3jMi4JfEatucSbEeQ1Gf7.CxJhkFJD_166IEW.webp" alt="Twitter 对开源项目发起 DDoS 攻击" loading="lazy" decoding="async" fetchpriority="auto" width="3840" height="2705" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="unified-markdown" data-post-link="/unified-markdown" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/unified-markdown" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 如何优雅编译一个 Markdown 文档 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
54 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>Markdown 是一种广泛使用的轻量级标记语言,允许人们使用易读易写的纯文本格式编写文档,也是 xLog 主要使用的文章格式,本文就以 xLog Flavored Markdown 为例来说明如何优雅地解析一个 Markdown 文档</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2024年1月18日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/QmYJmmuE1zCbdEXUpWL7T9ECqv6pqrtJrukqMcZarvgcQj.bxr-BC8d_Z2lJoX6.webp" alt="如何优雅编译一个 Markdown 文档" loading="lazy" decoding="async" fetchpriority="auto" width="2880" height="1620" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2023" data-post-link="/2023" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2023" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 2023 平稳过渡 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
54 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>&lt;/2023&gt;
55&lt;2024&gt;
56
57发小觉得今年经历了巨大的变化,从苏格兰搬到新加坡,从未婚到已婚,从一家两口变成了一家三口,但我觉得都在预料之中,所以感觉还算很平稳</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2024年1月8日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93" class="hover:underline decoration-dashed underline-offset-4">#年终总结</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/QmQYb5iJNqQVmi3rHUZbfMQhebJwYXp84QVnTiEHxXGZjg.D-cbUcqp_1FdKTH.webp" alt="2023 平稳过渡" loading="lazy" decoding="async" fetchpriority="auto" width="8192" height="4608" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="10k-twitter-accounts" data-post-link="/10k-twitter-accounts" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/10k-twitter-accounts" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 轻松创建一万个 Twitter 账号 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
57 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>Twitter 在 8 月决定了全面限制公开访问和 API 接口,导致第三方集成均无法再正常工作。开放用户数据被绑架成私人敛财工具,曾经的 Open Web 标杆 Twitter 竟沦落到这种境地,数字奴隶制在最不应该的地方出现,令人唏嘘</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年12月15日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/QmckDsXfXzc7SXt3adb3mYHypPg1wvF55kjcsrys9tL216.fiZ2JE5D_Zx9JGq.webp" alt="轻松创建一万个 Twitter 账号" loading="lazy" decoding="async" fetchpriority="auto" width="4512" height="2538" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="uk-travel-edinburgh" data-post-link="/uk-travel-edinburgh" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/uk-travel-edinburgh" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 英国旅游VLOG | 爱丁堡圣诞节 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
57 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>2021年12月拍摄...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年9月26日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/vlog" class="hover:underline decoration-dashed underline-offset-4">#vlog</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeih7hnjiwgbdr7ir7ry6nlhqoyzxj6ssqswrhzbvkxfir3jplkk77y.R4aOcANr_2Q8Wl.webp" alt="英国旅游VLOG | 爱丁堡圣诞节" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1200" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="rsshub-with-warp" data-post-link="/rsshub-with-warp" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/rsshub-with-warp" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 优雅使用 Cloudflare WARP 应对  RSSHub 反爬难题 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
57 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>🕊️ 本文送给更开放的互联网 起因是看到 @geekbb 介绍 Warp 的推文。尽管 Warp 已经发布了很长时间,就保护 IP 隐私而言,它并没有 iCloud Private Relay 好用,我也没有魔法上网的需求。但是我突然意识到,我还是有隐藏 IP 的需求。
58
59在开…</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年8月17日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreigrpjhr6oshromzjunxhj6jaqivggdcstkfhutqgfbhh7fztgtioq.oBkXR87V_uWAmo.webp" alt="优雅使用 Cloudflare WARP 应对  RSSHub 反爬难题" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1080" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="xlog-portfolios" data-post-link="/xlog-portfolios" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/xlog-portfolios" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 在博客融入一个跨平台作品集 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
59 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>长久以来# 我一直将个人博客视为一个理想的展示个人 IP 的 “个人网站”,而不仅仅是发布文章的平台。我曾在 2014 年初学编程时使用 WordPress 建站 《世界,你好!》;入了前端坑后,在 2017 年我转向了 Hexo 《做了一点微小的改动》;Web3 飞升后…</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年8月7日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeib3styadsi5pwwq2dir72nnitfhs5d6jjhpgsd5rq5sh33yqt5fzq.DIUmTN79_xpxaX.webp" alt="在博客融入一个跨平台作品集" loading="lazy" decoding="async" fetchpriority="auto" width="4014" height="2438" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="gf-bathroom" data-post-link="/gf-bathroom" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/gf-bathroom" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 女友浴室沉思录,非正常录音 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
59 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>偷录的女友洗澡哼哼,太可爱了
60
61你也觉得可爱的话请去推特夸夸 justjustjustcc
62
63求个一键三连...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年7月21日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreih6b6e4tl64cnz2amvvfz2qobv5qnmyaybofqmje2wzvfhdm2c7lu.DhxD1ppb_1msYhy.webp" alt="女友浴室沉思录,非正常录音" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1080" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="say-no-to-newsletter" data-post-link="/say-no-to-newsletter" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/say-no-to-newsletter" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 对 Newsletter 说不 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
63 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>衰退无处不在,这是很正常的现象。人们自然而然地更倾向于短平快的消费方式。然而,我一直无法忍受的一种奇怪趋势是,在一些地方,人们将 RSS 抛弃,转而使用 Newsletter。</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年7月12日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreibegqpbw5t22dgwoxgw2lm6vz4ha2fhrt4g2zruvt3yhz6eatmeya.CN9UhCq6_Z6W2Vl.webp" alt="对 Newsletter 说不" loading="lazy" decoding="async" fetchpriority="auto" width="768" height="768" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="anime-2023-april" data-post-link="/anime-2023-april" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/anime-2023-april" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 4 月新番太好看了!吹爆! </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
63 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>今年从 1 月就一直没什么好看的作品,到了 4 月突然爆发,让我非常激动。现在播出过半了,是时候好好说说感受了 以下当然不能囊括 4 月所有的好作品,因为实在太多了,只是说一说符合我口味的几部,按我个人的喜爱程度来排序
64
65以下会包含大量剧透,还没看的小伙伴请酌情观看
66
67鬼灭之刃刀匠…</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年5月24日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeiafziunuervleanhd7j7at22vbc2gv2tgzv5xit3gtgd7xaela2bi.BlHS4z-6_Z1PGbaf.webp" alt="4 月新番太好看了!吹爆!" loading="lazy" decoding="async" fetchpriority="auto" width="3005" height="4096" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="webworker-xlog" data-post-link="/webworker-xlog" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/webworker-xlog" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 和 xlog.app 的作者 DIYgod 聊区块链和博客平台、前端学习和生活感悟 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
67 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>新一期播客来啦!本期我们邀请到了 xlog.app 背后的作者 DIYGOD 一起聊聊他做的区块链博客平台,以及背后的选型考量和有趣的故事。除了科普背后用的 web3.0 技术细节,我们还对选型进行一番大讨论!也对 yy 的个人生活向往不已!欢迎来 xlog 一起写博客,听播客!...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年5月9日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreihn7rxtraotsx2giwtpco4dwn4gln7hxxrafwopqd2gud5mqqbse4.BbVebUUG_2a3Mus.webp" alt="和 xlog.app 的作者 DIYgod 聊区块链和博客平台、前端学习和生活感悟" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1440" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="software-update" data-post-link="/software-update" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/software-update" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 我得了软件更新强迫症 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
67 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>我必须让身边所有软件都保持最新版本,就像走路不能踩到地砖缝缝一样,没有意义,但也危害不大,所以我放任它发展</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年4月8日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeidy2jmclbfvtlgv2fluz2rglny7wkbdbyd3y4teqnmibp36y6ihrq.DwskSqLX_2qxwwX.webp" alt="我得了软件更新强迫症" loading="lazy" decoding="async" fetchpriority="auto" width="2040" height="1824" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="dystopian-anime" data-post-link="/dystopian-anime" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/dystopian-anime" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 令我痛心的三部反乌托邦动漫 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
67 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>四月对我而言是一个充满悲伤的月份。尽管《四月是你的谎言》已经过去了很多年,但每当看到「四月」这两个字,仍会立刻触发我的 PTSD,再加上今天我刚读完一本反乌托邦题材的小说《来自新世界》。多种思绪糅杂在一起,让我不禁回想起了那些令我痛心的「重量级」反乌托邦动漫</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年4月2日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeih6nkyowhmksth75szqli34g4e3aphwcfrlt32oseauzeyrdfjria.DwWDqGa5_2c4E3M.webp" alt="令我痛心的三部反乌托邦动漫" loading="lazy" decoding="async" fetchpriority="auto" width="1196" height="1570" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="do-you-want-to-dance" data-post-link="/do-you-want-to-dance" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/do-you-want-to-dance" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 你你你你要跳舞吗? </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
67 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>看微小微的视频有三个阶段,刚开始大脑会瞬间被疯狂溢出的快乐猛烈冲击,开始嘴角上扬,眼睛瞪大,理智被快乐占据;然后是羞耻,大脑在颤抖抖抖抖抖,残存的理智让你羞耻得想关掉视频,但这时候已经晚了,身体无法承受的超量快乐让你无法行动,让你继续“人生中最漫长的三分钟”;最后视频结束,你会震惊,为什么!为什么会在大庭广众做这种事!为什么会这么羞耻这么尴尬!为什么我看完了!为什么我这么快乐!</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年3月2日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeiey7atdgk7cmji3zqoquqy3yowyf5zj3zk7zrm2nt3ujsro45aw5e.C5OTVL9H_Z9qepw.webp" alt="你你你你要跳舞吗?" loading="lazy" decoding="async" fetchpriority="auto" width="1425" height="890" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2022" data-post-link="/2022" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2022" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 2022 年终总结 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
67 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>相比国内的魔幻日常,今年在苏格兰的生活还是很安稳的</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2023年1月12日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93" class="hover:underline decoration-dashed underline-offset-4">#年终总结</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeieowx3ddxwiedrlgckrohchscdiomz3yi2snrxnvjlwypxf6nxpsu.B72JBUwA_Zuj5pw.webp" alt="2022 年终总结" loading="lazy" decoding="async" fetchpriority="auto" width="1284" height="1442" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="new-stuff-2022-black-friday" data-post-link="/new-stuff-2022-black-friday" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/new-stuff-2022-black-friday" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 新玩意 | 2022 黑五买了啥? </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
67 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>受少数派 新玩意系列 启发,我也分享下我近期黑五购买的新玩意。</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2022年11月30日 · <a href="/category/%E6%96%B0%E7%8E%A9%E6%84%8F" class="hover:underline decoration-dashed underline-offset-4">新玩意</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeiaeqxvbsgxnjfyl42abn4xehudoyqvzxosgmgjbcltuumy74pxa7e.DVaopGVi_T56Ds.webp" alt="新玩意 | 2022 黑五买了啥?" loading="lazy" decoding="async" fetchpriority="auto" width="3369" height="2995" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="scottish-residents-can-move-around-downstairs" data-post-link="/scottish-residents-can-move-around-downstairs" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/scottish-residents-can-move-around-downstairs" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 苏格兰居民可下楼活动 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
67 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>今天距离圣诞节正好还有一个月,但格拉斯哥主街上早早就布置了很多圣诞节装饰和圣诞节期间专属的游乐设施,我家对面的一家小博物馆也为今年的圣诞节专门建了个滑雪场兼圣诞集市</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2022年11月25日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeifeebnfxocslchhulbuss2axinwgxu2mar2wyf72wy5g6fk7xtfqe.DEvLA-b8_2rz0oM.webp" alt="苏格兰居民可下楼活动" loading="lazy" decoding="async" fetchpriority="auto" width="3072" height="2048" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="flowers-for-algernon" data-post-link="/flowers-for-algernon" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/flowers-for-algernon" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 《献给阿尔吉侬的花束》读书分享 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
67 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>上个季度读的书中最喜欢的一本,分类是科幻小说,但重点在于探讨成长、人生意义的人文话题。</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2022年10月9日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeif2fp6xiwdkevvm5item7ngurdyg55xldkogdw4yj7yqqamazcbpm.bytoqmyB_Z1HjfFD.webp" alt="《献给阿尔吉侬的花束》读书分享" loading="lazy" decoding="async" fetchpriority="auto" width="1000" height="1448" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="xlog" data-post-link="/xlog" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/xlog" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 第一个开源链上博客系统 xLog </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
67 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>我的个人博客已经运行了接近 9 年,跟着我慢慢发展,现在几乎已经成为了我的个人发展史,折腾博客也从很久以前就成为了我的一个爱好,但随着对 Hexo 的越来越不满,我决定做一个更现代化的全新的博客系统</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2022年9月23日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E6%96%B0%E5%9D%91" class="hover:underline decoration-dashed underline-offset-4">#新坑</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreidazbwui2bqm6crk54qadjwvfjycvxzojwuakyfn4q5aitvlr773a.BFNgZCi9_1sBibh.webp" alt="第一个开源链上博客系统 xLog" loading="lazy" decoding="async" fetchpriority="auto" width="1542" height="630" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="uk-travel-lake-district" data-post-link="/uk-travel-lake-district" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/uk-travel-lake-district" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 英国旅游VLOG | 英格兰湖区 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
67 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>🗓 2022 年 4 月 10 日 - 2022 年 4 月 14 日
68📍 The Lake District in North West England...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2022年7月26日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/vlog" class="hover:underline decoration-dashed underline-offset-4">#vlog</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeicholfzwqpl3dpqdt6shhbzptdntj4obd4lk5vudvou32g6ojrjfu.DiZKcDGS_Z2g03gf.webp" alt="英国旅游VLOG | 英格兰湖区" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1080" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="obsidian" data-post-link="/obsidian" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/obsidian" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 基于 Obsidian 的生活记录系统 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
68 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>正如我在 2020 年终总结 中提到,我一直在用 Notion 写子弹笔记,现在它有了亿点点不一样,现在我们就来重新窥探一下我目前的生活记录系统</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2022年7月9日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeibmsjjzstiylsmrkmgn5xa2ppoyoqdpazxzuzpkomkdydsb2utbli.txWJUQ2A_2uC4Mk.webp" alt="基于 Obsidian 的生活记录系统" loading="lazy" decoding="async" fetchpriority="auto" width="3168" height="2474" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="uk-travel-hp" data-post-link="/uk-travel-hp" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/uk-travel-hp" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 英国旅游VLOG | 发小带你逛哈利波特制片厂 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
68 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>🗓 2022 年 4 月 19 日
69📍 Warner Bros. Studio Tour London - The Making of Harry Potter...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2022年6月27日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/vlog" class="hover:underline decoration-dashed underline-offset-4">#vlog</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeiadoujzv3crd7nes3rmo5adn4677xdizfv6gnccx5afzlh32k6b7y.BoxQGNVZ_1FSchN.webp" alt="英国旅游VLOG | 发小带你逛哈利波特制片厂" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1080" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="unidata" data-post-link="/unidata" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/unidata" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 💡 Unidata - 提供人类友好的 Web3 数据的便捷访问 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
69 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>Web3 的魅力在于数据属于用户自己,但由于区块链低效的效率和设计,再加上数据格式标准的缺失,访问和展示自己或用户的 Web3 数据是一件极度困难的事情。所以我做了开源项目 [Unidata](https://unidata.app/),给 Web3 开发者提供人类友好的 Web3 数据的便捷访问。...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2022年5月6日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E6%96%B0%E5%9D%91" class="hover:underline decoration-dashed underline-offset-4">#新坑</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreia6rkmk4isy3emsmi6irq52la6o5w7shzmaysegavtacqhqv3bvdi.Dzl30VCH_Z1zTKtP.webp" alt="💡 Unidata - 提供人类友好的 Web3 数据的便捷访问" loading="lazy" decoding="async" fetchpriority="auto" width="1296" height="564" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="job" data-post-link="/job" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/job" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> RSS3 提供最酷最理想最自由的开源远程工作 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
69 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>&gt; “如果有天堂,那一定是图书馆的模样。那里信息自由地流通,书籍自由地出版,人与人自由地讨论。”
70
71人类生产,传播和分发信息的权利不应该被掌握在任何数据和互联网平台手中,这是属于数字人类的基本权利
72
73我们都意识到现在互联网还与这种理想相差甚远,如果你愿意为它做出亿点点改变,一起来吧 🌍
74
75&lt;!--...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2021年11月12日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeigbpf3scjdikprruh25nbnlx37tdol4mchqleti5frqsx7joguriu.BMW2KYFd_ix2Im.webp" alt="RSS3 提供最酷最理想最自由的开源远程工作" loading="lazy" decoding="async" fetchpriority="auto" width="1546" height="1097" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2020" data-post-link="/2020" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2020" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 2020 年终总结 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
75 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>今年对很多人来说都是非同寻常的一年,对我更是如此
76
77### 🦠 新冠疫情
78
791 月爆发的新冠疫情直到今天还在持续,疫情初期的恐慌和绝望还历历在目:1 月 20 日一夜之间全国的口罩和板蓝根双黄连被抢购一空、互联网完全被负面疫情话题占据、感染人数像火箭一样猛增、前线防护用品严重紧缺、专家组成员被感染...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2021年1月1日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93" class="hover:underline decoration-dashed underline-offset-4">#年终总结</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeie4dklkwdhw7ch3hcrucsj4oanecti53px7i454kaeeihkyjsfjy4.Dxo1x2e3_1hdTFo.webp" alt="2020 年终总结" loading="lazy" decoding="async" fetchpriority="auto" width="2722" height="3247" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="paragliding" data-post-link="/paragliding" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/paragliding" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 带发小和粗粗一起滑翔伞!起飞! </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
79 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>十一跟发小和粗粗一起自驾去了滑翔伞,起飞瞬间太刺激了,为了那一刻长途跋涉也值了第一次露脸 vlog ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 求三连,求转发!...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2020年11月1日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/vlog" class="hover:underline decoration-dashed underline-offset-4">#vlog</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreico3akse545lv45vbuj3wcsfzhx7tn24y3nr3irhdv47hevzztcqe.7QQEg93f_2uG6K.webp" alt="带发小和粗粗一起滑翔伞!起飞!" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1200" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="my-last-fight-against-this-world" data-post-link="/my-last-fight-against-this-world" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/my-last-fight-against-this-world" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 我与这个世界的最后一次抗争 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
79 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>执法部门喜欢和稀泥、民众欠缺法律意识、人与人之间缺乏最基本的尊重是发生这种事的根本原因,这些问题短期内根本无解,类似事情只会屡见不鲜</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2020年8月2日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeie7n5selvxxmcnow26g67zuwdlkvuijv7kehqcb3fu3cwmrwzbbqi.2KzBWz-b_2F1xa.webp" alt="我与这个世界的最后一次抗争" loading="lazy" decoding="async" fetchpriority="auto" width="1000" height="611" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="web-debugging-proxy" data-post-link="/web-debugging-proxy" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/web-debugging-proxy" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 科学的 Web 调试代理实践 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
79 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>前端经常需要一些特殊的调试环境,这时有一个科学的 Web 调试代理工具(以下称代理工具)显得尤其重要
80
81我用的第一个代理工具是 [Charles](https://www.charlesproxy.com/),功能多但缺点也很明显,笨重、配置麻烦,爬
82
83后来换到了 [Zan Proxy](https...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2020年5月14日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeigvagrzmrtqktce5wnch25qm72mrpw2rq2j2bcamnl3pv4subuava.ByM1Ij1e_LWkYI.webp" alt="科学的 Web 调试代理实践" loading="lazy" decoding="async" fetchpriority="auto" width="3360" height="1718" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="animal-crossing" data-post-link="/animal-crossing" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/animal-crossing" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 我的动森日记 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
83 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>DIY 对这里的生活绝对有很大的帮助!</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2020年3月23日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreihutu2gbtogslyg6677fewizdimmyhhemk5s5yadodjnevklycl7m.BhIbT_bh_1ndNg9.webp" alt="我的动森日记" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1080" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="handshake" data-post-link="/handshake" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/handshake" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 一份特别的开源项目赞助 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
83 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>![handshake1](./attachments/bafkreibgobuhtieyi3tqa2qi4snkknsl44ravaloosstprvjbc3xaznh5a.jpeg)
84
85七夏姐姐在群里分享了一个[帖子链接](https://www.v2ex.com/t/645480),大意是 ~...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2020年2月20日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreibgobuhtieyi3tqa2qi4snkknsl44ravaloosstprvjbc3xaznh5a.Ch9HGEn0_1lSzuz.webp" alt="一份特别的开源项目赞助" loading="lazy" decoding="async" fetchpriority="auto" width="1410" height="628" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="painting-nezuko" data-post-link="/painting-nezuko" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/painting-nezuko" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 【临摹】祢豆子 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
85 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>原图:https://weibo.com/5251489751/IbMlieN4K...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2020年2月7日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E7%94%BB%E7%94%BB" class="hover:underline decoration-dashed underline-offset-4">#画画</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreifc6kkl2jyppcq5235funnqtmcak3glzxfhmr7ga6mibiivgvppl4.Bvc-vTzH_Z1tKJeb.webp" alt="【临摹】祢豆子" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1200" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2019" data-post-link="/2019" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2019" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 2019 我做了什么 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
85 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>2019 已经结束了,在这里回顾一下 2019 我做了什么
86
87## 开源
88
89![2019-4](./attachments/bafkreihqbkyh3whizlp44iq4xnr45bdvetgsnnis6iemsbmxvbrhdrseeq.jpeg)
90
91虽然维护的项目有保持健康的成长,但没有做什...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2020年1月2日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93" class="hover:underline decoration-dashed underline-offset-4">#年终总结</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreihqbkyh3whizlp44iq4xnr45bdvetgsnnis6iemsbmxvbrhdrseeq.B7Bzwp4q_Z2EERa.webp" alt="2019 我做了什么" loading="lazy" decoding="async" fetchpriority="auto" width="1958" height="496" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="android" data-post-link="/android" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/android" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 我家 Android 初养成 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
91 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>最近把用了两年的 iPhone X 换成了 Redmi K20 Pro,体验一下 Android 自由香甜的空气
92
93&lt;p&gt;&lt;img style=&quot;width: 100%; max-width: 300px&quot; src=&quot;./attachments/bafkreigdo5h6km6mcagm4jfx3l...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2019年11月24日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreigdo5h6km6mcagm4jfx3lhny5bkbm7cauo4oyfvludoxuk372jwoy.DmaLqlmb_1eYgdw.webp" alt="我家 Android 初养成" loading="lazy" decoding="async" fetchpriority="auto" width="1079" height="1533" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="rsshub-radar" data-post-link="/rsshub-radar" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/rsshub-radar" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> RSSHub Radar — 订阅一个 RSS 源不应该这么难 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
93 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>![rsshub-radar5](./attachments/bafkreiab5apfpx6odikfppeoblfsi7owzrwtgulnxor2vbd74ohnz2ht6i.jpeg)
94
95&gt; 如果你问我,RSSHub 能否改变 RSS 的命运,我也不晓得,但我晓得,不认命,就是 RSSHub...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2019年8月6日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E6%96%B0%E5%9D%91" class="hover:underline decoration-dashed underline-offset-4">#新坑</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreiab5apfpx6odikfppeoblfsi7owzrwtgulnxor2vbd74ohnz2ht6i.Dw-A55A7_Z1gHumS.webp" alt="RSSHub Radar — 订阅一个 RSS 源不应该这么难" loading="lazy" decoding="async" fetchpriority="auto" width="2560" height="731" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="pn532" data-post-link="/pn532" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/pn532" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 小米手环 4 NFC 模拟加密卡探索 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
95 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>小米手环 4 NFC 版一发售就迫不及待找黄牛买了一只
96
97手环的 NFC 主要有三个功能:小爱同学、公交卡、模拟门禁卡
98
99结果手环的小爱同学很难用,功能缺失、反应慢[还老骂我](https://twitter.com/DIYgod/status/1141718298658086913),上海公交也不...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2019年6月28日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreihdrrmhivc6vjkhtwbstj2s53noq2brghan7fvtil7fsjed47pumq.B8ngCDoG_jmY8Y.webp" alt="小米手环 4 NFC 模拟加密卡探索" loading="lazy" decoding="async" fetchpriority="auto" width="2250" height="2436" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="download-webhook" data-post-link="/download-webhook" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/download-webhook" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 优雅地下载我的B站投币视频 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
99 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>下载B站视频很简单,you-get 一行命令的事,但我已经懒到命令都不想输了,如果投币之后 NAS 可以自己去下载就好了
100
101&lt;style&gt;
102twitter-widget {
103    margin: 0 auto !important;
104}
105&lt;/style&gt;
106&lt;blockquote class=&quot;tw...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2019年6月2日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreifzgbuqcfqsqcpp3gsttgwj7ddkkgipjq2aojvkc3qrf2mgo2yr6a.DbLQo_H2_Z5Cmu1.webp" alt="优雅地下载我的B站投币视频" loading="lazy" decoding="async" fetchpriority="auto" width="3360" height="1720" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="ohmyrss" data-post-link="/ohmyrss" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/ohmyrss" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 我有特别的 RSS 使用技巧 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
106 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>大家都知道 RSS 是一种用来消息聚合的格式规范,有着更高的阅读效率、更好的阅读体验、可以掌握主动权等等优点。
107
108本文不会介绍 RSS 的各种好处和各式各样的阅读器,因为相关网络资料已经足够多了。这里我介绍一下怎样充分挖掘 RSS 的使用价值,因为它的用途一直被大家低估。
109
110## 阅读器
111
112从最简单...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2019年5月13日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreia2qs3hugcjppvgn64c572i427ezlnrww3tqcenjl7asna6csrxsq.J5mdJrcC_2fLKk0.webp" alt="我有特别的 RSS 使用技巧" loading="lazy" decoding="async" fetchpriority="auto" width="2678" height="1852" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="rsshub-1year" data-post-link="/rsshub-1year" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/rsshub-1year" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> RSSHub 一周年开发可视化 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
112 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>RSSHub — 万物皆可 RSS
113https://github.com/DIYgod/RSSHub
114
115- 视频基于 2018 年 4 月 - 2019 年 4 月的 commit 记录,使用 Gource 绘制
116- BGM: トリカゴ...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2019年4月26日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreigc55yddemx6zyi2gpp4raoozh7x2bde3g6tdaecdqb3g4uedc3xm.bIYTNF0I_2371NX.webp" alt="RSSHub 一周年开发可视化" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1080" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="mai-tour" data-post-link="/mai-tour" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/mai-tour" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 《青春猪头少年不会梦到兔女郎学姐》圣地巡礼 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
116 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/episode/31yuCkRxJqYD4eSEtOyMiB?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;152&quot; ...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2019年4月12日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeibip5i7yvpahj24san4s6gdmwp3chne2x77aou4suht5vv6f2hfwu.BlY0Suak_Z2vGXoD.webp" alt="《青春猪头少年不会梦到兔女郎学姐》圣地巡礼" loading="lazy" decoding="async" fetchpriority="auto" width="2872" height="1401" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="headlesschrome" data-post-link="/headlesschrome" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/headlesschrome" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> HeadlessChrome 自动化测试探索 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
116 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>埋点一直是B站 HTML5 播放器开发和测试过程中的一个痛点,埋点的种类和接口参数很多,测试很麻烦也很容易出错
117
118虽然测试很麻烦,但它们的规则都很简单,比如点击或 hover 一个按钮、错误上报、播放和性能上报,那么能不能通过自动化的 E2E 测试来代替这些又繁琐又机械化又容易出错的测试工作呢?
119
120...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2019年3月18日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreibw3mvo3a3ohiwp3uy2mglkyq4g7eiwz6l5qk5toa75cwvjsdli6y.6QpamkLX_Z495JC.webp" alt="HeadlessChrome 自动化测试探索" loading="lazy" decoding="async" fetchpriority="auto" width="2400" height="1857" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2018" data-post-link="/2018" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2018" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 2018 年终总结 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
120 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>2018,无所事事又带点丧的一年,感觉很对不起 23 岁这个年纪,要跟自己说声对不起了
121
122## 开源
123
124今年 4 月开坑了 [RSSHub](https://github.com/DIYgod/RSSHub),让自己学到了的很多东西,认识了很多人,算是今年为数不多的有趣的事情之一了
125
126[APlaye...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年12月31日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E5%B9%B4%E7%BB%88%E6%80%BB%E7%BB%93" class="hover:underline decoration-dashed underline-offset-4">#年终总结</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreihqok6ayl7fgjxgyis5xvcedyx273jbtnxmvrr6u6h7uwbypk2rma.VGsviSXH_XbeBi.webp" alt="2018 年终总结" loading="lazy" decoding="async" fetchpriority="auto" width="2110" height="596" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="nas" data-post-link="/nas" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/nas" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 从零开始的 NAS 生活 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
126 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>很早就想组一个家庭 NAS 设备,趁着这次双十一,在京东买了一台群晖 DS218play 和一块酷狼 4T 硬盘,已经用了两天了,我的感受是:
127
128**爽爆**
129
130## 使用
131
132目前常用的有下面几个功能
133
134### Time Machine
135
136![nas1](./attachments/bafkreid...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年11月8日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreidvl4x46g6q5xhu7hkiemgzyblf2a2h2yezq6iqgokwofgsncgosq.DFD8XhAM_Z1IPlbE.webp" alt="从零开始的 NAS 生活" loading="lazy" decoding="async" fetchpriority="auto" width="1336" height="880" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="cp2018sp" data-post-link="/cp2018sp" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/cp2018sp" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> C94 &amp; CP2018SP 参展日记 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
136 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>C94 和 CP2018SP 不是同一天,但都是同人展,时间又很近,就写在一起了
137
138## C94
139
140Comic Market,全球最大的同人展,8 月 10 日在东京举办,我当然没钱去,三天都在 Twitter 云参展,口水流了一地
141
142托朋友到 Aniplex 展台买了矢吹健太朗的 darling ...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年8月26日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeidte4gjslowcnxfzqtwfn5y4e3htbz55ieu26khl57uwb4hhixek4.CYY02Fhs_Zi7WQH.webp" alt="C94 &#38; CP2018SP 参展日记" loading="lazy" decoding="async" fetchpriority="auto" width="2928" height="1601" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="cj2018" data-post-link="/cj2018" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/cj2018" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 2018 ChinaJoy 参展日记 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
142 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>8月4日去了 ChinaJoy,人还是一如既往的多
143
144AC 娘真可爱,舔爆
145
146第二次拍 vlog,然后拍完懒得剪,还是 Freddy 帮我剪的,我在视频里真可爱
147
148&lt;iframe id=&quot;dogePlayerFrame&quot; src=&quot;https://player.dogecloud.com/web/p...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年8月10日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreihxje6xkzxslea5oybkxbffehuqefwtbkdmfgtp4eovitbrmk5z7m.DRuhzP3g_Z1mug3P.webp" alt="2018 ChinaJoy 参展日记" loading="lazy" decoding="async" fetchpriority="auto" width="3265" height="2448" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="bw2018" data-post-link="/bw2018" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/bw2018" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 2018 bw &amp; bml 参展日记 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
148 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>7月21日和22日去了 bw 和 bml,面基了一万个人,py 通红
149
150### BILIBILI WORLD
151
1522233 真可爱,舔爆
153
154第一次拍 vlog,然后拍完懒得剪,还是 Freddy 帮我剪的
155
156&lt;iframe id=&quot;dogePlayerFrame&quot; src=&quot;https://playe...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年8月6日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeich7einf6hdm4t5f6rlaucwsfd6lvd2pyeyafvozqobvvhvsjxwlm.DoK3O2cn_1Nd9yX.webp" alt="2018 bw &#38; bml 参展日记" loading="lazy" decoding="async" fetchpriority="auto" width="3265" height="2448" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="painting-02" data-post-link="/painting-02" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/painting-02" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 【临摹】02 - pixiv </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
156 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>原图:DARLING in the FRANXX EP#04 00:16:48...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年6月9日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E7%94%BB%E7%94%BB" class="hover:underline decoration-dashed underline-offset-4">#画画</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/69178118.Be5v6F6m_OHl3N.webp" alt="【临摹】02 - pixiv" loading="lazy" decoding="async" fetchpriority="auto" width="1200" height="630" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="polymer" data-post-link="/polymer" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/polymer" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> Polymer 初体验 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
156 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>作为开发者,我们都知道组件化、标准化和代码复用的重要性,前端也从未停止过对前端组件化的尝试,产生了各式各样的组件化技术,从 Vue React 等前端框架,到 webpack 这样的全站打包工具
157
158但前端一直缺乏这样一个模块化标准和浏览器级别的原生组件化方案
159
160Web Components 是 WH...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年5月30日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div>  </div> </div><div data-post-slug="goodnight" data-post-link="/goodnight" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/goodnight" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 早安晚安自动化 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
160 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>上一集:[女朋友的微博情绪监控](https://diygod.me/2920/)
161
162发小一直很喜欢说早安晚安(当然是我说给她),但我经常会忘记,最近灵机一动,想出来这样一个科学高效方便快捷稳定地说早安晚安的办法:
163
164把微信挂在服务器上,每天固定时间,自动执行发送早晚安文本消息的命令!
165
166代码很简单...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年4月25日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreig52xbbytdog3amaevevnjww3sirqr66mxaiwdggalq57zuul5djm.BLXsQbrD_Z2qJXzX.webp" alt="早安晚安自动化" loading="lazy" decoding="async" fetchpriority="auto" width="352" height="344" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="rsshub" data-post-link="/rsshub" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/rsshub" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> RSSHub - 使用 RSS 连接全世界 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
166 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>**[项目地址](https://github.com/DIYgod/RSSHub)**
167
168## 介绍
169
170RSSHub 是一个轻量、易于扩展的 RSS 生成器,可以给任何奇奇怪怪的内容生成 RSS 订阅源
171
172当前支持列表:
173
174- bilibili
175  - 番剧
176  - UP 主投稿
177  - UP 主...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年4月13日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E6%96%B0%E5%9D%91" class="hover:underline decoration-dashed underline-offset-4">#新坑</a>  </span>  </div> </div>  </div> </div><div data-post-slug="2018-bao-zou-yu-ren-jie" data-post-link="/2018-bao-zou-yu-ren-jie" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2018-bao-zou-yu-ren-jie" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 2018 暴走 yu 人节参展日记 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
177 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>暴走 yu 人节是暴走漫画首届互动娱乐展会,作为暴走粉当然不能错过,很早就买了票。
178
179总体感觉还是很棒的,嘉宾阵容强大,互动很多(还可以跟王尼玛一起上厕所),诚意满满,但不足也很明显,暴走 yu 人节主要内容集中在主舞台的节目表演,但上海新国际博览中心的现场座位远远不够,感觉还是更适合在类似 BML...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年4月2日 · <a href="/category/%E6%97%A5%E8%AE%B0%E6%9C%AC" class="hover:underline decoration-dashed underline-offset-4">日记本</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeic353ywqcrd36cf3i7gla52dldcumdosiehmmquuxp5mdmast5f7i.1dsBV6AC_88dmM.webp" alt="2018 暴走 yu 人节参展日记" loading="lazy" decoding="async" fetchpriority="auto" width="960" height="4210" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="open-source-project-donation" data-post-link="/open-source-project-donation" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/open-source-project-donation" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 关于开源项目赞助这件事 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
179 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>相信没人做开源项目是为了赚钱,因为它还不如去天桥贴膜赚得快。
180
181但即使没有这种想法,维护一个开源项目也会遇到一些很头疼的现实问题,比如服务器和 CDN 的开销。以 DPlayer 为例,弹幕接口服务器每年需要花费 2000 多块,文档里的视频 CDN 费用每年也需要花费 1500 多块,并且随着用户...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年3月5日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div>  </div> </div><div data-post-slug="darling-in-the-franxx-style" data-post-link="/darling-in-the-franxx-style" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/darling-in-the-franxx-style" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> DARLING in the FRANXX 博客样式 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
181 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>&lt;iframe style=&quot;border-radius:12px&quot; src=&quot;https://open.spotify.com/embed/track/5KAI6nfg3wQRmtwJ0PPaEW?utm_source=generator&quot; width=&quot;100%&quot; height=&quot;152&quot; fr...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年2月5日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeiebhzcewbsmznmjvpd4xodthfd4ygyrjolz4cfzawqohuhiqnqbzi.C9qH0s9y_1Qme3.webp" alt="DARLING in the FRANXX 博客样式" loading="lazy" decoding="async" fetchpriority="auto" width="1920" height="1080" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="web-workers" data-post-link="/web-workers" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/web-workers" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> Web Workers 初体验 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
181 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>[这个视频](https://www.bilibili.com/video/av18682336/)有 15+MB 的 BAS 弹幕脚本需要解析,这会导致页面卡死 7 秒左右的时间,期间 UI 被冻结,体验很糟糕,如果使用 Web Workers 进行优化,把解析放入 Web Workers 执行,...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年1月30日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div>  </div> </div><div data-post-slug="neteasecloudmusic2rss" data-post-link="/neteasecloudmusic2rss" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/neteasecloudmusic2rss" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> NetEaseCloudMusic2RSS — 使用RSS订阅她喜欢的网易云音乐 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
181 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>音乐,人类生活中永恒的主题。音乐可以很大程度上体现一个人的喜好、品味,更是最有力量的情感传输器。
182
183现在快使用RSS订阅我喜欢的网易云音乐吧:[https://api.prprpr.me/necm2rss/playlist/35798529](https://api.prprpr.me/necm2r...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年1月29日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div>  </div> </div><div data-post-slug="bas" data-post-link="/bas" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/bas" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> BAS 高级弹幕 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
183 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>## 写在前面
184
185如果你好奇 B 站的工作有不有趣,或者我来 B 站之后都在做什么,那么这篇文章或许可以解答你的部分疑问。
186
187来 B 站后,除了负责 HTML5 播放器的一些模块、重构和日常维护以外,BAS 高级弹幕算是我半年来负责开发的最大一个项目了。
188
189本文整理自今天在公司的超极电磁波分享(据说...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2018年1月25日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreibddan7hvm4abwwdc5lnu3u2akhu27iyqs5y4xjjwsgxnqtfxvwm4.q_e-jtw1_Z1facbp.webp" alt="BAS 高级弹幕" loading="lazy" decoding="async" fetchpriority="auto" width="594" height="1150" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="best-players-in-hexo" data-post-link="/best-players-in-hexo" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/best-players-in-hexo" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 可能是目前最好用的两个 Hexo 播放器插件 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
189 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>我实在也不是谦虚,这~~可能~~是目前最好用的两个 Hexo 播放器插件,感谢插件作者(给大佬们递女装
190本文只作为演示,使用方法和 issue 请移步 GitHub
191
192&lt;!--more--&gt;
193
194```sh
195npm install hexo-tag-aplayer --save
196```
197
198Hexo 的...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2017年11月29日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div>  </div> </div><div data-post-slug="new-blog" data-post-link="/new-blog" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/new-blog" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 做了一点微小的改动 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
198 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>新的开始,只做了一点微小的改动
199
200### 域名
201
202从 www.anotherhome.net 换成了 diygod.me
203anotherhome.net 起源于高中比较喜欢的一部番《Another》,年代有些久远,现在剧情都已经记不清了
204
205&lt;!--more--&gt;
206
207### 博客程序
208
209从 WordP...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2017年11月26日 · <a href="/category/%E4%BA%8B%E4%BB%B6%E7%B0%BF" class="hover:underline decoration-dashed underline-offset-4">事件簿</a>  </div> </div>  </div> </div><div data-post-slug="hello-world" data-post-link="/hello-world" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/hello-world" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> Hello World </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
209 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>Welcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2017年11月20日 · <a href="/category/%E4%BA%8B%E4%BB%B6%E7%B0%BF" class="hover:underline decoration-dashed underline-offset-4">事件簿</a>  </div> </div>  </div> </div><div data-post-slug="3264" data-post-link="/3264" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/3264" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> bilibili2RSS — 使用 RSS 订阅 bilibili up主和番剧 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
209 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>作为一种过气技术,提供 RSS 订阅源的网站越来越少,每个网站都想把用户尽可能长时间地绑在自己那里,而 RSS 可能会造成负面效果
210
211但在这个内容爆炸时代,只要意识到了「我被信息所绑架」这个问题后,用户自然会想要一种更高级的聚合信息和动态更新解决方案,比如 RSS
212
213这里提供了使用 RSS 订阅 b...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2017年10月17日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div>  </div> </div><div data-post-slug="3207" data-post-link="/3207" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/3207" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 我们走过的 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
213 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>&lt;style&gt;
214    #love-map {
215        width: 100%;
216    }
217
218    #love-time {
219        text-align: center;
220        margin-bottom: 20px;
221        font-size: 14px;...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2017年8月28日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div>  </div> </div><div data-post-slug="3116" data-post-link="/3116" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/3116" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 让咕咕机再次伟大 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
221 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>&lt;style&gt;
222    .gugu-print {
223        display: none;
224        margin-top: 20px;
225    }
226    .gugu-btn {
227        cursor: pointer;
228        border: 1px solid #e...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2017年8月11日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreigpucjepfxkw4valfdlbgedeu6qu6voe4s2sq5paahldwxby3bg3y.CzBsfKkh_2epj0J.webp" alt="让咕咕机再次伟大" loading="lazy" decoding="async" fetchpriority="auto" width="239" height="48" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2978" data-post-link="/2978" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2978" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 现在可以给网红写小纸条表白了! </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
228 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>最近跟我表白的人太多了,所以我买了一个[咕咕机](http://www.memobird.cn),现在访问 [让咕咕机再次伟大](/make-gugu-great-again) 就可以很方便地写小纸条跟我表白了。
229
230比如
231
232![gugu1](./attachments/bafkreigifezih7...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2017年7月2日 · <a href="/category/%E9%97%B2%E8%A8%80%E8%AF%AD" class="hover:underline decoration-dashed underline-offset-4">闲言语</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreigifezih7ru5qmafxzi7viyqnc526old5ztm4abqdrmdm2wpd7iiy.Tkgvh4fe_Zaqe4d.webp" alt="现在可以给网红写小纸条表白了!" loading="lazy" decoding="async" fetchpriority="auto" width="1000" height="1333" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2954" data-post-link="/2954" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2954" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> Service Workers 实现网站加速和离线缓存 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
232 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>最近看到了 Service Workers 这个东西,它可以根据配置为用户缓存网站静态与动态资源:截获用户的所有网络请求,根据缓存配置来决定是从缓存还是网络获取相应资源,从而可以极大提高网页的加载速度。优点有可定制性高、不需要服务端支持、效果显著。
233
234最后的效果就是当你第二次访问我的网站时只会加载大...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2017年3月6日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreid7vp7iprbacehxdgzbpupfoxakjroehwfmkcixvyd56wylyq6ocy.C0_rD-kp_Zm6Thc.webp" alt="Service Workers 实现网站加速和离线缓存" loading="lazy" decoding="async" fetchpriority="auto" width="1938" height="519" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2939" data-post-link="/2939" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2939" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 一只叫酸奶的喵 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
234 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>酸奶是我家新招的猫女仆,她有一个博客:[https://suannai.cat](https://suannai.cat/)
235
236![suannai](./attachments/bafkreibdoc23hzsbypzb7o46edp7kvsr3tmdpjjyolzszdn73ixopabg6a.p...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2017年3月2日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreibdoc23hzsbypzb7o46edp7kvsr3tmdpjjyolzszdn73ixopabg6a.DXfbnke9_PlIQ.webp" alt="一只叫酸奶的喵" loading="lazy" decoding="async" fetchpriority="auto" width="153" height="154" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2920" data-post-link="/2920" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2920" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 女朋友的微博情绪监控 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
236 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>![weibo-negative](./attachments/bafkreiakbgc7a6vrlcuvr2ol4j2qn55nbyojp5kx5xm7yzttjemsmztvfi.jpeg)
237
238就是这样,代码写好了,就差个女朋友了。
239
240最后的效果就是检测某一微博博主新发的微博,如果判断为消极情绪...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2017年2月9日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreiakbgc7a6vrlcuvr2ol4j2qn55nbyojp5kx5xm7yzttjemsmztvfi.B10kkAM8_Z1852uT.webp" alt="女朋友的微博情绪监控" loading="lazy" decoding="async" fetchpriority="auto" width="1197" height="313" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2837" data-post-link="/2837" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2837" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> Weibo2RSS — 使用 RSS 订阅喜欢的微博博主 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
240 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>使用 RSS 订阅喜欢的微博博主(比如我)吧~
241
242Demo:[https://api.prprpr.me/weibo/rss/3306934123](https://api.prprpr.me/weibo/rss/3306934123)
243
244RSS 格式输出一个微博博主最新的 15 条微博,可以使用 ...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2016年11月2日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  </div> </div>  </div> </div><div data-post-slug="2805" data-post-link="/2805" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2805" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 微小微直播回放的 DPlayer 实现 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
244 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>以下为10月19日[微小微](http://weibo.com/u/2025479687)在[一直播](http://m.yizhibo.com/l/n6VHhuJoCbMf41Nx.html)的直播回放(迷妹脸,弹幕也成功扒下来转成 [DPlayer](https://github.com/DIY...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2016年10月20日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreiaczasprthfsm7aoojvv7cz6q7choxxtib76i6nae6khmhqlyttny.CK1BPplr_1Er8XF.webp" alt="微小微直播回放的 DPlayer 实现" loading="lazy" decoding="async" fetchpriority="auto" width="907" height="242" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2770" data-post-link="/2770" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2770" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> WordPress 反垃圾评论大作战 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
244 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>WordPress 垃圾评论一直是超级多超级烦人的,如果没有有效的拦截方案,网站就会瞬间被每天几百条的垃圾评论淹没。
245
246因为是每个 WordPress 站点都无法避免的问题,大家各显神通,做出的解决方案也挺多的,这里总结一下每种方法的特点和利弊:
247
248### 识别垃圾评论
249
250以 Akismet 插件为...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2016年10月10日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div>  </div> </div><div data-post-slug="2648" data-post-link="/2648" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2648" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> DPlayer – 最好看的弹幕播放器送给最好看的宫园薰 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
250 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>&lt;link href=&quot;https://cdn.bootcss.com/dplayer/1.16.0/DPlayer.min.css&quot; rel=&quot;stylesheet&quot;&gt;
251
252&lt;div id=&quot;dplayer1&quot; class=&quot;dplayer&quot;&gt;&lt;/div&gt;
253
254最好看的HTML5弹幕播放器送给最好看的...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2016年8月20日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E6%96%B0%E5%9D%91" class="hover:underline decoration-dashed underline-offset-4">#新坑</a>  </span>  </div> </div>  </div> </div><div data-post-slug="2449" data-post-link="/2449" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2449" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 给喜欢明信片的你 — 一年一度的送明信片活动(已完结) </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
254 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>![postcard2](./attachments/bafybeiaiqckme2x5plfrfpewrbse2g75rgki4biauy44p2wjy4cvw2bpfy.jpeg)
255
256### Q: 我为什么要你的明信片?妈妈说不能随便拿陌生人的东西。
257
258**A:** 你有体验过小确幸的感觉吗?
259...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2016年3月17日 · <a href="/category/%E4%BA%8B%E4%BB%B6%E7%B0%BF" class="hover:underline decoration-dashed underline-offset-4">事件簿</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeiaiqckme2x5plfrfpewrbse2g75rgki4biauy44p2wjy4cvw2bpfy.BZAUcDVj_ldQb6.webp" alt="给喜欢明信片的你 — 一年一度的送明信片活动(已完结)" loading="lazy" decoding="async" fetchpriority="auto" width="2592" height="1936" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2298" data-post-link="/2298" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2298" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 版权狗退散 — 仿知乎复制文本自带版权声明 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
259 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>### 什么鬼?
260
261版权狗退散,妈妈再也不用担心我被侵权了(其实只防君子不防小人)。
262
263类似知乎,在网站复制长度大于42的文本时自动加上这样的版权声明:
264
265```
266著作权归作者所有。
267商业转载请联系作者获得授权,非商业转载请注明出处。
268作者:DIYgod
269链接:https://www.another...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年12月26日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div>  </div> </div><div data-post-slug="2167" data-post-link="/2167" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2167" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> APlayer - 送给小狐狸和小兔子的 HTML5 播放器 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
269 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>小狐狸和小兔子是很好很好的朋友。
270
271一起散步的时候,不巧遇到了猎人。
272
273他们转身就跑,都希望猎人更容易发现自己。
274
275小狐狸跑进了蒲公英群,白色的蒲公英漫天飞起。
276
277小兔子逃进玫瑰花园,红色的玫瑰花瓣散落一地。
278
279从此失散在彼此的世界里。
280
281幸运的是,后来,小狐狸遇到了小王子,小兔子遇见了爱丽丝。
282
283...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年11月16日 · <a href="/category/%E5%88%9B%E4%BD%9C%E9%9B%86" class="hover:underline decoration-dashed underline-offset-4">创作集</a>  · <span class="inline-flex flex-wrap gap-1">  <a href="/tag/%E6%96%B0%E5%9D%91" class="hover:underline decoration-dashed underline-offset-4">#新坑</a>  </span>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafybeidpyzwkqmje3fafy2tpye75hna4znl363duqwmgqejprqpxpvktia.CnrDG1Rk_1pQ2qt.webp" alt="APlayer - 送给小狐狸和小兔子的 HTML5 播放器" loading="lazy" decoding="async" fetchpriority="auto" width="2560" height="7998" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2153" data-post-link="/2153" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2153" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 我藏好了哦 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
283 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>![titlehide](./attachments/bafkreifbosbd4sirfvfzuoxwajzbhvezgybz67uij6kavsel6rhtn2vlz4.png)
284
285在 [Sonic 853](http://853.bronya.net/) 看到的神奇的一幕,一颗赛艇,果断扒来水...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年11月12日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreifbosbd4sirfvfzuoxwajzbhvezgybz67uij6kavsel6rhtn2vlz4.BdghU6q0_uhh7k.webp" alt="我藏好了哦" loading="lazy" decoding="async" fetchpriority="auto" width="1060" height="136" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2125" data-post-link="/2125" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2125" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 论 IFTTT 的正确食用姿势 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
285 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>### 什么是IFTTT
286
287官网:[https://ifttt.com](https://ifttt.com)
288
289这是一个2011年在美国上线的网站,IFTTT 是 _If This Then That_ 的缩写。通俗的来讲,IFTTT 的作用就是如果触发了一件事,则执行设定好的另一件事。
290
291![i...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年11月8日 · <a href="/category/%E5%88%86%E4%BA%AB%E5%A2%83" class="hover:underline decoration-dashed underline-offset-4">分享境</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreigofpqhf776o2j5wgdp432uoyxpkairznjm56ygj4goqb2k6eydri.Bt9busVZ_ZbTAcK.webp" alt="论 IFTTT 的正确食用姿势" loading="lazy" decoding="async" fetchpriority="auto" width="650" height="190" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="2073" data-post-link="/2073" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/2073" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 《JavaScript高级程序设计》读书笔记 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
291 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>莎士比亚曾经说过:“好记性不如烂笔头。”
292
293## 第一章 JavaScript简介
294
295### 1.1 JavaScript简史
296
297### 1.2 JavaScript实现
298
2991. 一个完整的JavaScript实现应该由三个不同的部分组成:核心(ECMAScript)、文档对象模型(DOM)、浏览器...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年8月19日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div>  </div> </div><div data-post-slug="126" data-post-link="/126" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/126" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 百度前端技术学院编码挑战(TASK 0004) </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
299 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>任务4(最终挑战)已经发布,任务deadline是6月10日至6月30日。
300
301TASK 0004 内容:[https://github.com/baidu-ife/ife/tree/master/task/task0004](https://github.com/baidu-ife/ife/tree...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年5月24日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreigzsti7ooqsfhslrwk4e27crmrjhlzgasgm6zfg565snkxlizv6ay.DR8t62Ur_Z2RKq5.webp" alt="百度前端技术学院编码挑战(TASK 0004)" loading="lazy" decoding="async" fetchpriority="auto" width="474" height="601" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="1989" data-post-link="/1989" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/1989" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 百度前端技术学院编码挑战(TASK 0003) </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
301 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>任务3已经发布,初级班的任务时间是从5月7日至5月18日,中级班为4月30日至5月10日。
302
303TASK 0003 内容:[https://github.com/baidu-ife/ife/tree/master/task/task0003](https://github.com/baidu-ife/...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年5月8日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreibkrpsb5w4qexah2eowv2sdbgjftq6sjoayjwtjf2lxamnn75jsca.BxTcaNHT_kOfT6.webp" alt="百度前端技术学院编码挑战(TASK 0003)" loading="lazy" decoding="async" fetchpriority="auto" width="1364" height="793" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="1982" data-post-link="/1982" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/1982" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 百度前端技术学院编码挑战(TASK 0002) </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
303 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>TASK 0002 已经发布,初级班的任务时间是从4月24日至5月7日,中级班为4月18日至4月25日。
304
305TASK 0002 内容:[https://github.com/baidu-ife/ife/tree/master/task/task0002](https://github.com/bai...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年4月24日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreif5xys73v2hg3secbetyag4gyyqkbqv2xmiwqndz3b467o6wifo7y.CQv70RYr_Z1XqtJ8.webp" alt="百度前端技术学院编码挑战(TASK 0002)" loading="lazy" decoding="async" fetchpriority="auto" width="1066" height="300" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="1969" data-post-link="/1969" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/1969" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 百度前端技术学院编码挑战(TASK 0001) </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
305 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>[百度Web前端技术学院](https://github.com/baidu-ife/ife)(Baidu Institute of Front-End Technology简称IFE)是一个由百度EFE团队、百度人力资源部校园招聘组联合出品的、面向在校大学生的前端培训组织,借助百度大量优秀的前端工...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年4月14日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div> <div class="hidden ml-2 size-32 md:block md:ml-7"> <img src="/_astro/bafkreibwbacdy7hulempknxbnw2bw2zmnl5cdci6k75co6trs7t2op2ria.DGcddpcf_1UN45o.webp" alt="百度前端技术学院编码挑战(TASK 0001)" loading="lazy" decoding="async" fetchpriority="auto" width="400" height="223" class="aspect-square object-cover rounded-xl"> </div> </div> </div><div data-post-slug="1826" data-post-link="/1826" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/1826" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 博客又搬新家啦 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
305 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>眼看 Google Adsense 已经100多美元马上就能提现了,加上想买个vps跑Python爬虫,就新入了 Linode 1GB,感觉超爽。
306
307感谢离开恒创这段时间收留我的 [TECHNETCAL](http://technetcal.com/) [音符](https://freedom.mo...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年3月19日 · <a href="/category/%E4%BA%8B%E4%BB%B6%E7%B0%BF" class="hover:underline decoration-dashed underline-offset-4">事件簿</a>  </div> </div>  </div> </div><div data-post-slug="1764" data-post-link="/1764" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/1764" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 一个完整编译器的实现(二) 语法分析 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
307 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>**1 系列说明**
308
309[GitHub地址](https://github.com/DIYgod/Compiler) [各阶段源码](http://www.anotherhome.net/file/compiler/) [各阶段说明集合](http://www.anotherhome.net/175...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年2月16日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div>  </div> </div><div data-post-slug="1754" data-post-link="/1754" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/1754" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 一个完整编译器的实现(一) 词法分析 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
309 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>[GitHub地址](https://github.com/DIYgod/Compiler) [各阶段源码](http://www.anotherhome.net/file/compiler/) [各阶段说明集合](http://www.anotherhome.net/1751)
310
311为了将一个程序从...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年2月5日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div>  </div> </div><div data-post-slug="1751" data-post-link="/1751" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/1751" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 一个完整编译器的实现 </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
311 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>_图灵生机器,机器生汇编,汇编生 C,C 生万物
312(来自知乎用户 Joy Neop)_
313
314本系列将展示一个完整编译器从无到有的实现过程.
315
316目标是从一个C语言的不完全子集翻译到x86汇编语言, 将借助 Lex Yacc LLVM 等工具, 另外暂定实现垃圾回收及面向对象.
317
318全部代码托管在 [Git...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2015年2月1日 · <a href="/category/%E7%A0%94%E4%B9%A0%E5%9D%8A" class="hover:underline decoration-dashed underline-offset-4">研习坊</a>  </div> </div>  </div> </div><div data-post-slug="1" data-post-link="/1" class="relative border border-transparent border-dashed cursor-pointer p-7 group rounded-2xl" tabindex="0"> <div class="absolute inset-0 z-20 w-full h-full duration-300 ease-out bg-white border border-dashed dark:bg-neutral-950 rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:-translate-x-1 group-hover:-translate-y-1"></div> <div class="absolute inset-0 z-10 w-full h-full duration-300 ease-out border border-dashed rounded-2xl border-neutral-300 dark:border-neutral-600 group-hover:translate-x-1 group-hover:translate-y-1"></div> <div class="flex relative z-30 duration-300 ease-out group-hover:-translate-x-1 group-hover:-translate-y-1"> <div class="flex-1"> <h2 class="flex items-center mb-3"> <a href="/1" class="text-lg font-bold leading-tight tracking-tight sm:text-xl dark:text-neutral-100"> 世界,你好! </a> <svg class="group-hover:translate-x-0 flex-shrink-0 translate-y-0.5 -translate-x-1 w-2.5 h-2.5 stroke-current ml-1 transition-all ease-in-out duration-200  transform" viewBox="0 0 13 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"> <g id="svg" transform="translate(0.666667, 2.333333)" stroke="currentColor" stroke-width="2.4"> <g>  <polyline class="transition-all duration-200 ease-out opacity-0 delay-0 group-hover:opacity-100" points="5.33333333 0 10.8333333 5.5 5.33333333 11"></polyline> <line class="transition-all duration-200 ease-out transform -translate-x-1 opacity-0 group-hover:translate-x-0 group-hover:opacity-100 group-hover:ml-0" x1="10.8333333" y1="5.5" x2="0.833333333" y2="5.16666667"></line>  </g> </g> </g> </svg> </h2>
318 <p class="text-sm text-neutral-600 dark:text-neutral-400 line-clamp-3 break-all"> <span>欢迎使用WordPress。这是系统自动生成的演示文章。编辑或者删除它,然后开始您的博客!...</span> </p> <div class="mt-2.5 text-xs font-medium text-neutral-800 dark:text-neutral-300"> 2014年2月9日 · <a href="/category/%E4%BA%8B%E4%BB%B6%E7%B0%BF" class="hover:underline decoration-dashed underline-offset-4">事件簿</a>  </div> </div>  </div> </div> </div> </div> 
318<script id="search-data" type="application/json">[{"slug":"2025","title":"2025 重新定义的生活","tags":["年终总结"],"body":"## AI 生产力革命与迷茫\n\n四年前我准备读研,那时对图像视频处理很感兴趣,所以最开始想学计算机视觉。后来发现传统 CV 已经是夕阳产业,被深度学习全面吊打,于是干脆选了 Artificial Intelligence。\n\n当时只是走马观花学一些概念,没想到不到两年,AI 就彻底爆发。2023 年 3 月 GPT-4 发布,震惊了全世界。到今年,AI 更进一步,开始实打实地改变很多行业的工作方式,也改变了很多人的生活方式。\n\n我作为程序员和插画爱好者,几乎在两个方向同时感受到了冲击。一方面是效率暴涨带来的兴奋,另一方面是越来越强的迷茫,甚至演化成一种存在危机。不是那种轻飘飘的焦虑,而是你突然意识到自己赖以立足的东西正在被改写,而且改写得非常快。\n\n**插画:从多年练习到输入一句话**\n\n原创画师可能是最早被冲击的一批。Stable Diffusion 刚出现时,画师群体曾激烈抵制。可怕的是,再后来就听不见他们的声音了。并不是他们妥协了,而是 AI 作品真的太好、太快,快到很多争论甚至来不及发生就已经失效。\n\n随后有一部分原创画师开始接受 AI,把它当成辅助工具,也有大量使用 AI 的新人涌入,用更低门槛、更高产出的方式加入创作。\n\n创作门槛一路下探,从需要数年的学习与练习,到买一块好显卡折腾几天,再到现在打开网页、输入想法、等几秒钟。更进一步,插画到动画、到视频也在被快速打通。某种意义上,人人都是画师不再是夸张,而更像是正在发生的现实。\n\n**编程:从片段补全到接管项目**\n\n[![](./images/x-1945335801266721237.jpg)](https://x.com/DIYgod/status/1945335801266721237)\n\n程序员这边的变化也许会走向同一个结果,只是没有那么立刻和直观。2022 年大家还在用 GitHub Copilot 做自动补全,今年专用 AI Coding 模型与 vibe coding 工具层出不穷,很多时候已经变成你用自然语言描述需求,AI 写代码、改代码、修 bug、补测试,甚至能产出一个完整项目。\n\n对程序员来说,vibe coding 能把生产力拉高数倍,对非程序员来说,coding 也不再是程序员的专属技能。越来越多人不写一行代码,也能做出精美应用,解决自己的真实需求。编程正在从一种职业技能,变成一种人人都能动手的表达方式。\n\n于是,程序员的工作方式正在被改写。传统意义上那种手写代码的「代码匠人」会越来越少,很多方向会像传统 CV 一样被 AI 替代。我也越来越少亲手写代码了,越来越习惯和编辑器右侧触手可及的 AI 沟通。它完成得又快又好,而且越来越好,从工具到助手,再到一种近乎替代本体的存在。\n\n这种替代感最刺痛的地方在于它并不只替代体力活。它在替代判断、套路、经验和熟练度,也在替代我曾经引以为傲的学习速度。我学到的知识在贬值,我积累的经验在贬值,我拥有的技能在贬值,甚至连智力和创造力也在贬值,而且贬值速度似乎远高于我的成长速度。等程序员岗位真的消亡之后,我的价值在哪里。\n\n[![](./images/x-1945354030839898431.png)](https://x.com/DIYgod/status/1945354030839898431)\n\n但当下程序员显然还是无法被完全替代,也许 AI 也会像摩尔定律一样发展到一定程度会碰壁。现在能做的是好好驾驭这股力量,积极参与这次生产力革命,希望能在其中找到自己的位置和无法被替代的独特价值。\n\n## 迎来新生命\n\n不管 AI 怎么发展,碳基生命孕育新生命的过程,在可预见的将来还无法被硅基生命取代。\n\n知道发小(老婆)怀孕的那一刻,我更多是手足无措。但从那时起,很多心理和生活习惯就悄悄围绕这个即将
318到来的新生命发生变化。\n\n发小的怀孕过程漫长又辛苦。前期孕吐昏天黑地,嗅觉变得异常敏感,平时正常的气味也会难以忍受,喜欢的食物吃不下去,激素让情绪波动更明显。中期好一些,后期肚子越来越大,腰酸背痛、睡眠下降、行动不便,走路都成问题。但发小还是表现出了惊人的坚韧和乐观,承受住了这些考验,还把产检、备产、育儿安排得井井有条。\n\n![](./images/2-4.jpg)\n\n与此同时,我也亲眼见证了生命如何一点点成形:从一个 2mm、模糊不清的小点开始——\n\n![](./images/2-1.jpg)\n\n慢慢初具人形——\n\n![](./images/2-2.jpg)\n\n再到四肢、五官清晰可见,能在肚子里动来动去、打嗝、做体操。几个月来,我几乎无时无刻不在感叹和敬畏生命的神奇,碳基生命扳回一局!\n\n![](./images/2-3.jpg)\n\n终于熬到 7 月 27 日晚上,哈哈(女儿)出生。还没来得及舒一口气,就被告知她血氧持续下降,被紧急转入 NICU 重症监护室观察治疗。\n\n当时一边是发小大手术后意识不清,一边是刚出生的哈哈生死未卜。那一夜大概是我人生最黑暗的时刻。发现自己平时拥有的那些判断力、解决问题的能力、甚至乐观,都在这种时刻毫无用处。唯一能做的就是等,等一个并不确定会到来的好消息。\n\n幸好经过几天治疗,哈哈脱离生命危险,有惊无险,出院回家。\n\n[![](./images/x-1949827364008947806.jpg)](https://x.com/DIYgod/status/1949827364008947806)\n\n[![](./images/x-1951235222676316241.jpg)](https://x.com/DIYgod/status/1951235222676316241)\n\n[![](./images/x-1952376061318377652.jpg)](https://x.com/DIYgod/status/1952376061318377652)\n\n经历过 NICU 之后,生活变得顺利起来,家里有发小和女佣照顾哈哈,哈哈每天都在成长,学会抓东西、翻身,开始有情绪、会认人。她也真的很可爱,每次出门遛娃,路人都会凑过来夸几句。\n\n作为新手爸爸当然会疲惫,但更多的是一种很踏实的幸福感,它不需要被证明,也不需要被解释,它只是会在你抱起她的那一刻变得非常确定。\n\n## 努力搞钱\n\n[![](./images/x-1874129585069318349.jpg)](https://x.com/DIYgod/status/1874129585069318349)\n\n众所周知,孩子是一只四脚吞金兽。一出生还没出院就吞掉了 S$100000,这件事非常直观地刷新了我对现实的理解。\n\n前面说发小怀孕后,我的心理发生了很多变化,其中最关键的就是金钱观的变化。\n\n以前我当然也想赚钱,但总体是够用就行。钱更像是实现爱好、维持生活的手段,而不是最终目的,所以在赚钱这件事上相对懒惰。比如之前选择工作时,我会毫不犹豫放弃双倍薪资的币安而去更符合爱好的哔哩哔哩,又比如四年前 Web3 牛市满地捡钱,我却无动于衷。这也导致我过去在个人财务上一直挺失败。\n\n现在的这种变化有点像从无所谓直接滑到了过度补偿。我开始更在意安全感,也更容易把安全感和金钱绑定,钱对我的优先级被极大提升,我也更清楚地意识到,很多选择的底气最终还是来自现金流和风险承受能力。\n\n今年我开始更主动地投资加密货币。四年前入行 Web3,去年才开始主动买币,这件事本身也挺神奇。过程非常曲折,中间有一段时间亏了很多钱,也买到了很多教训。好在最终结果还不错,而那些教训甚至比阶段性的收益更宝贵。\n\n今年的收益率曲线(实现方法见 [上古神器 Beancount:Crypto 与 AI 时代的复式记账终极方案](/beancount)):\n\n![](./images/3-1.png)\n\n**从凭感觉到有体系**\n\n我的投资经历可以粗略分成两段,以三月为分水岭。\n\n三月之前,我对策略和 K 线这些知识几乎一无所知,也没用任何分析工具,基本凭感觉和情绪买卖,像一种定投,跌了卖点,涨了卖点。因为市场整体向上、波动不算剧烈,所以哪怕闭眼瞎买,收益也还不错,甚至让我有点沾沾自喜。\n\n但赌博最怕的就是一开始给你一点甜头。\n\n后来遇到二月关税战带来的市场恐慌大跌,我损失惨重。我当时的心路大概是这样的:第一段下跌时我觉得是绝佳抄底机会,几乎掏出全部家当抄底;市场继续下跌时我开始心态崩,但还想扛一扛,拒绝止损;第三段更猛时我彻底崩溃,把所有持仓割肉卖掉。结果买在高点ï¼
318Œå–在最低点,市场又很快反弹。\n\n现在回看,我做得稍微对的一点是胆子小,没有上杠杆,否则更惨。更多的是犯了一堆典型错误,没有策略,被情绪控制,大仓位抄底,没有仓位管理,追涨杀跌...\n\n三月之后,我开始系统学习分析方法和工具,开始设置止损止盈、控制仓位、控制情绪,不再盲目抄底和追涨杀跌,慢慢搭起一套更可持续的交易体系,亏的赚回来了,还额外赚了一些,到了今年的 1011 闪崩,或者年底的牛尾行情,这些下跌幅度比二月份更猛,我也没有再明显亏钱。\n\n**工具与策略**\n\n交易平台我主要用 [OKX](https://www.bjwebptyiou.com/join/1876626),手续费低,闲钱用简单赚币和偶尔闪赚做点低风险收益也不错。行情分析主要用 [TradingView](https://cn.tradingview.com/pricing/?share_your_love=DIYgod),功能强大、指标丰富。冷钱包用 [OneKey](https://onekey.so/r/N9AHU3),热门冷钱包安全性都过关,但 OneKey 的操作体验对我来说是断崖领先。\n\n[![](./images/x-1901239258331169099.jpg)](https://x.com/DIYgod/status/1901239258331169099)\n\n至于策略,我现在更像是在不断给自己加护栏,而不是追求某种神奇圣杯。我会提醒自己,无论当下多么有把握,市场都可能上涨,也可能下跌,但是不排除横盘的可能。我会合理安排并经常回顾现金、屯币、风险投资的比例。我宁愿少赚钱也不碰自己不理解、或未经充分博弈的东西,有耐心,理解慢即是快,活下来最重要,所以现在基本只交易 BTC、ETH。\n\n[![](./images/x-2000744194747588621.jpg)](https://x.com/DIYgod/status/2000744194747588621)\n\n我也会严格控制杠杆,绝大多数是 1 倍,最多不超过 3 倍。止损要清晰,愿意认错,不扛单。DeFi 尽量少碰,因为当你不知道理财的利润从哪里来时,说明你就是那个利润。\n\n[![](./images/x-1990353824192843862.jpg)](https://x.com/DIYgod/status/1990353824192843862)\n\n手动交易只看 4 小时以上的中长线,短线交给自动化策略,尽量减少短期情绪的影响。\n\n[![](./images/x-1948375038517727446.jpg)](https://x.com/DIYgod/status/1948375038517727446)\n\n一些片段留念:\n\n[![](./images/x-1972109779322745148.jpg)](https://x.com/DIYgod/status/1972109779322745148)\n[![](./images/x-1959155822518206531.jpg)](https://x.com/DIYgod/status/1959155822518206531)\n[![](./images/x-1993890218555134464.jpg)](https://x.com/DIYgod/status/1993890218555134464)\n[![](./images/x-1962515701245337648.jpg)](https://x.com/DIYgod/status/1962515701245337648)\n[![](./images/x-1937436310995894571.jpg)](https://x.com/DIYgod/status/1937436310995894571)\n\n## 不合时宜的开源思维\n\n相比金钱观的快速转变,我在技术和产品上的观念转得没那么顺利。今年最主要的工作是 Folo。Folo 本身做了很多,新移动端、本地优先架构、AI 等等。但商业化的实施和验证推进太慢,再加上一些现实因素,后来不得不做出一些仓促转型。很多技术上的投入看起来像自娱自乐。更糟的是,团队里也出现过让人头疼的协作问题,甚至有员工离职后的背刺,搞得鸡飞狗跳,还更狗血地牵扯出其他幕后黑手和一串让人哭笑不得的阴谋故事,这里就不展开了。\n\n[![](./images/x-1995843301757604043.jpg)](https://x.com/DIYgod/status/1995843301757604043)\n\n回头看,商业化延迟与转型仓促并非偶然,而是从始至终根深蒂固在我和团队的开源思维和技术思维里。\n\n开源本身当然没有问题。开源是一个很好的方式,用来实现爱好、做 side project、学习新知识。问题在于把过多开源思维混进一个需要严谨商业闭环的产品里,下场往往不会好。因为开源默认的是负收益的热情驱动、社区驱动、长期慢速打磨,而商业默认的是资本驱动、资源有限下的快速取舍。\n\n如果把这种错配具体化,它会体现在很多地方。比如产品会缺少严谨的准备,方向更容易摇摆;用户混入大量低付费意愿人群,后续转型阻力较大;过于看重小众反馈,产品容易被拉向小众方向;团队招募与管理过于宽松,执行力不足、内耗严重;浪费大量时间追求没人在意的技术与设计细节的完美,付出巨大的时间机会成本等等。\n\n[![](./images/x-2003389654951952683.jpg)](https://x.com/DIYgod/status/2003389654951952683)\n\n对我来说,今年像是一堂延迟很久的商业常识课。它并不反对理想,也不反对开源,但它逼着我承认,理想需要边界,热爱需要成本表,选择需要对结果è´
318Ÿè´£ã€‚把这些讲清楚很俗,可它就是现实。\n\n而即使脱离现实,在开源象牙塔之内,对于以个人兴趣为主的开源项目来说,作者的爱好也往往会在长期孤独的维护中,在白嫖者和伸手党的理直气壮中,被一点点消磨殆尽。\n\n[![](./images/x-1932703374283284812.jpg)](https://x.com/DIYgod/status/1932703374283284812)\n\n经历这些事情之后,我开始重新审视开源对我而言究竟意味着什么。我对开源的态度,也从过去的绝对推崇,变成了一种带着警惕甚至轻微 PTSD 的复杂情绪。今后对开源的投入我应该也会更加兼顾现实、克制和有选择性。\n\n## 赛博生活\n\n来点轻松的,按惯例,总结一下今年的书影音游戏和应用。\n\n### 应用\n\n年度应用当然是 Folo。\n\n![](./images/5-1.png)\n![](./images/5-2.png)\n\n它花掉了我今年大部分时间和精力,也留下了一些痛苦回忆。但如果你有稳定的阅读习惯,也有管理信息源的能力,Folo 依然是我心里目前最好的信息聚合应用。\n\n桌面应用(顺便一提:AI 应用比例挺高,6/13):\n\n- Notion Calendar:日历客户端,体验比 Apple Calendar 好不少,UI 也更简洁。\n- Spark:邮件客户端。Spark V2 用了很久,V3 刚出时太难用,换到 Mimestream;但 Mimestream 太贵(一年 50 刀),用了一年又换回 Spark,发现现在已经成熟很多,虽然默认设置依然很反人类,但基本都能在选项里改掉。\n- TickTick:待办事项。\n- ~~ChatGPT Atlas:浏览器。只能算暂时最优解;问题依然很多,尤其 DevTools 太差。我感觉还是应该返璞归真:如果 Chrome 正式支持竖标签页,我就会换回 Chrome。~~\n- Chrome:浏览器。Arc → Dia → ChatGPT Atlas → Chrome,刚写完这篇年终总结 Atlas 自己爆炸了,正好返璞归真了。\n  [![](./images/x-2001635623812370563.jpg)](https://x.com/DIYgod/status/2001635623812370563)\n- Warp:终端。\n- Folo:自己做的阅读器。\n- VSCode:代码编辑器。VSCode → Cursor → Codex 出来后又换回 VSCode。\n- Notion:写日记。早些年就是 Notion,后来看到 Obsidian 插件生态好,换到 Obsidian(见 [基于 Obsidian 的生活记录系统](/obsidian)),但后来发现这些都不重要——写作体验才决定你愿不愿意写、能写多少。Obsidian 受限于 Markdown 能力,始终追不上 Notion,加上 Notion 在 AI 上越投入越多,于是又换回来了。\n- Plex:媒体服务器,看 NAS 上的电影、电视剧和番剧。\n- 网易云音乐:按理说在国外应该用 Spotify,但 Spotify 的推荐实在不对我胃口。网易云音乐又因为版权不提供海外服务,只能在 NAS 跑 UnblockNeteaseMusic 做代理,很麻烦。\n- Telegram / Discord / Slack / WhatsApp / 微信:即时通讯,越来越分散了。\n- [OneKey](https://onekey.so/r/N9AHU3):冷钱包,体验断崖领先(上一节也提过)。\n- Eagle:图片管理。\n- Googly Eyes:一双眼睛。\n  [![](./images/x-1899649650841571686.png)](https://x.com/DIYgod/status/1899649650841571686)\n\nNAS 在跑的服务:\n\n- AdGuard Home:广告屏蔽 + 家庭网络更快的 DNS。\n- Fava:记账,见 [上古神器 Beancount:Crypto 与 AI 时代的复式记账终极方案](/beancount)。\n- Gitea:托管一些不适合公开的代码。\n- Home Assistant:智能家居控制。经常搬家没怎么搞智能家居了,主要用来做备用机充电管理、设备定时开关机。\n- [homepage](https://gethomepage.dev):服务太多,用一个入口集中管理。\n- Nginx Proxy Manager:给各服务分配域名,访问更方便。\n- OpenList:自动下载阿里云盘、PikPak 等保存的内容到 NAS。\n- UnblockNeteaseMusic:让网易云音乐在国外也能用。\n- Uptime Kuma:监控服务可用性。\n- ANI-RSS:追番自动下载订阅番剧。\n- bili-sync:下载哔哩哔哩收藏夹视频到 NAS。\n\n### 电子产品\n\n年度电子产品是 OneKey Pro。\n\n![](./images/5-4.png)\n\n- 雷鸟 V3 让我有点失望。我一直对 Meta 的 AI 眼镜很感兴趣,以为过了这么久,国产竞品会更成熟,结果挺拉的。\n\n  [![](./images/x-1895461087652581702.jpg)](https://x.com/DIYgod/status/1895461087652581702)\n  [![](./images/x-1938871051859173499.jpg)](https://x.com/DIYgod/status/1938871051859173499)\n\n- iPhone 13 mini 已经用了四年多,感觉还能再战几年。\n\n  [![](./images/x-1965676625888235925.jpg)](https://x.com/DIYgod/status/1965676625888235925)\n\n- OPPO Watch X2 倒是很满意。小米手环用腻了,换了一个屏幕更大的智能手表,用起来很顺手。它有全智能和轻智能两种模式,
318全智能是完整 Android,轻智能像大号手环,续航超强,健康功能也不错,还能提醒我高血压风险。\n\n  [![](./images/x-1908104944160555401.jpg)](https://x.com/DIYgod/status/1908104944160555401)\n  [![](./images/x-1921387552634869763.jpg)](https://x.com/DIYgod/status/1921387552634869763)\n\n- 以及 OneKey Pro 和 OneKey Classic 1S Pure。\n\n  [![](./images/x-1926533360794394849.jpg)](https://x.com/DIYgod/status/1926533360794394849)\n\n### 影视\n\n年度影视是《链锯人 总集篇》。\n\n![](./images/5-3.jpg)\n\n节奏比 TV 版好很多,不少拖沓部分被剪掉,整体观感提升明显。真希望鬼灭也能出个总集篇。\n\n今年时间基本都花在 Folo 上了,所以影视数量很惨淡。\n\n番剧:\n\n- 链锯人 剧场版:蕾塞篇(第二喜欢,蕾塞好女人)\n  [![](./images/x-1966451474348507570.jpg)](https://x.com/DIYgod/status/1966451474348507570)\n- 链锯人 总集篇\n- 鬼灭之刃:无限城篇 第一章 猗窝座再袭(专门去电影院看了。可能期望太高,有点失望;对猗窝座无感)\n  [![](./images/x-1956229077934989788.jpg)](https://x.com/DIYgod/status/1956229077934989788)\n- 章鱼噼的原罪(新番里最喜欢)\n  [![](./images/x-1957666854098596130.jpg)](https://x.com/DIYgod/status/1957666854098596130)\n- 永久的黄昏\n- 间谍过家家 第三季\n- 光逝去的夏天\n  [![](./images/x-1941803538507759698.jpg)](https://x.com/DIYgod/status/1941803538507759698)\n- 琉璃的宝石\n- 启示录酒店\n\n电视剧:\n\n- 行尸走肉 1-11 季\n- 怪奇物语 1-4 季(在新加坡环球影城万圣节活动看到怪奇物语主题鬼屋,以为没看过,就补了,结果发现三年前已经看过……)\n- 黑镜 第七季\n- 爱,死亡和机器人 第四季\n- 无耻之徒 1-3 季\n- 长安的荔枝\n- 最后生还者 第二季\n\n电影:\n\n- 浪浪山小妖怪\n- 哪吒之魔童闹海\n\n### 图书与游戏\n\n今年一本书都没看完,略过。\n\n游戏和发小打了几个小时《双影奇境》,还没通关,还打了几天《王者荣耀》,没有其他的了。\n\n## 其他值得一提的\n\n### 健康\n\n去年体检发现肝指标非常差,再这样下去可能要出大问题。之后被发小强制要求 10 点上床,作息规律很多,现在大概是 12 点睡、8 点起。但今年没体检,还不知道指标有没有改善。\n\n哈哈出生后家里有女佣做饭,饮食更健康了。我还戒了碳水,把豆浆当主食,体重轻了 10 斤,但离标准体重还差 10 斤。运动依然几乎没有,不过每天出门遛娃,步数还是多了一点。\n\n另一方面身体机能的衰退也越来越明显。主要体现在精力的下降和已知薄弱部位上。筋膜炎、颈椎病、膝盖疼痛、牙周炎等老毛病都有所加重,精力也大不如从前,今年开始习惯通过外力(咖啡因、牛磺酸)来维持工作效率,但也导致了依赖,尝试停止牛磺酸摄入时就会出现剧烈头痛,只能通过止痛药来缓解。\n\n### 居住\n\n家里多了哈哈之后变得异常拥挤,于是换了更大的房子,从新加坡女皇镇搬到偏远的裕廊西。因为位置更偏,空间更大,房租反而更便宜,自然环境也更好。旁边还有个 Jurong Lake Gardens 的超大国家公园,很适合遛娃。\n\n![](./images/6-1.png)\n\n### 旅游\n\n发小怀孕中期在家憋得快抑郁了,而中期也是相对适合出门的阶段,于是抓紧安排了两个轻松的地方。\n\n**大理**的主题是吃。吃了好多菌子,菌汤超级鲜美,也确实可能有危险。喝之前饭店还会取样,如果中毒要带着样本一起去医院。\n\n[![](./images/x-1907051362036465763.jpg)](https://x.com/justjustjustcc/status/1907051362036465763)\n[![](./images/x-1907053924626072055.jpg)](https://x.com/DIYgod/status/1907053924626072055)\n\n在新加坡可没那么多好吃的。\n\n[![](./images/x-1909977000980385808.jpg)](https://x.com/justjustjustcc/status/1909977000980385808)\n[![](./images/x-1911989885998895249.jpg)](https://x.com/justjustjustcc/status/1911989885998895249)\n\n洱海有一股让人平静的力量。之前跟发小私定终身就是在洱海上,再回来,已经是一家三口了。洱海也见证了我们从发小,到情侣,再到夫妻,再到父母的变化,我对发小的爱也随着时间沉淀越来越深沉。\n\n[![](./images/x-1910216881304392131.jpg)](https://x.com/justjustjustcc/status/1910216881304392131)\n[![](./images/x-1910689980516839724.jpg)](https://x.com/justjustjustcc/status/1910689980516839724)\n[![](./images/x-1911599563041095989.jpg)](https://x.com/DIYgod/status/1911599563041095989)\n\n**巴厘岛**则是彻底放空。找了个豪华度假区,天天游泳、晒太阳,让人短暂地忘记日常的加速。\n\n[![](./images/x-1921916021662765358.jpg)](https://x.com/justjustjustcc/status/1921916021662765358)\n[![](./images/x-1922654327950168089.jpg)](https://x.com/justjustjustcc/status/1922654327950168089)\n[![](./images/x-1921451501660033114.jpg)](https://x.com/DIYgod/status/1921451501660033114)\n\n以及**新加坡环球影城万圣节惊魂夜**。今年有四个主题鬼屋,怪奇物语、新加坡最凶灵之地、道诡异仙、泰国死亡低语者,非常可怕,全程在尖叫。\n\n![](./images/6-2.png)\n\n### 有趣的小事\n\nNAS 坏了一块硬盘,自动强制只读了,但数据没丢。\n\n[![](./images/x-1981460911304167588.
318jpg)](https://x.com/DIYgod/status/1981460911304167588)\n\n过生日到处去薅羊毛。\n\n[![](./images/x-1932084384540102892.jpg)](https://x.com/DIYgod/status/1932084384540102892)\n\n看发小拼乐高。\n\n[![](./images/x-1935675896821899268.jpg)](https://x.com/DIYgod/status/1935675896821899268)\n\n## 2026 愿望\n\n我对 2026 的愿望很朴素。希望身体别再用坏消息提醒我,希望能继续赚到钱,希望能早点拿到新加坡身份,让未来少一些不确定性。\n\n<style>\n  .prose :where(img):not(:where([class~=\"not-prose\"],[class~=\"not-prose\"] *)) {\n    border: 1px solid #eee;\n  }\n</style>"},{"slug":"europe-travel","title":"欧洲旅游VLOG | 巴塞罗那 罗马 梵蒂冈 威尼斯 米兰 苏黎世 因特拉肯 巴黎","tags":["vlog"],"body":"2022年12月"},{"slug":"beancount","title":"上古神器 Beancount:Crypto 与 AI 时代的复式记账终极方案","tags":[],"body":"## 记账\n\n记账这件事,本质上是在回答三个问题:\n\n- 钱从哪来?\n- 钱现在在哪?\n- 钱最后去哪了?\n\n听起来很简单,但只要你的金融活动稍微复杂一点,这三问立刻变成一道「多变量方程」:\n\n- 多个账户:银行卡、支付宝、信用卡、交易所、链上钱包……\n- 多种资产类型:储蓄、贷款、投资……\n- 多种货币:CNY、USD、BTC、各种山寨币……\n- 多个时间维度:分期、预支、借贷……\n\n也正因为如此,我前后换过好几套方案。\n\n2016–2021:网易有钱 - 当时需求很朴素:记人民币收入、储蓄、日常开销。它能自动同步银行流水、支付宝微信账单,对国内场景非常方便。\n\n2021–2024:MoneyWiz - 出国后我需要多币种,并且主要使用英国的银行账户。MoneyWiz 在多币种、海外账户同步上很顺手。\n\n2024:我开始记录加密资产,这时候情况开始非常复杂了,我不只想知道「总额涨了多少」,而是想要:每一笔买入/卖出的明细、不同资产的占比、每日的浮盈浮亏、更严谨的收益率计算。\n\nMoneyWiz 对投资/加密资产支持很有限;我又试了有知有行,它能记录投资前后总额并算收益率,但无法记录到每笔明细,很多价格需要手动维护,浮盈浮亏也无法自动计算。\n\n最后我接触到复式记账和 Beancount,彻底解决了我的问题。\n\n我才意识到,很多时候我们觉得记账麻烦,并不是 UI 不够漂亮、交互不够顺滑,而是记账方法不够科学。当方法足够科学时,你甚至不需要 UI,一个 CLI + 几个纯文本文件 + 一套清晰语法,就能把财务世界描述得非常准确。\n\n---\n\n## 复式记账法\n\n复式记账乍看很反直觉,但一旦掌握,会发现它非常强大和灵活,而且会迫使你用更清晰的方式理解金融活动。\n\n### 五个桶(账户类型)\n\n复式记账会把所有账户归到五类(可以理解成五个装豆子的桶):\n\n- **资产 Assets**:现金、银行存款、有价证券、链上资产……\n- **负债 Liabilities**:信用卡欠款、房贷、车贷……\n- **收入 Income**:工资、奖金、利息……\n- **花费 Expenses**:吃饭、购物、旅行、订阅……\n- **权益 Equity**:调节/归档用的「底座」,例如期初余额、误差修正等\n\n### 所有金融活动都是「桶之间的转移」\n\n- **收入 → 资产**:发工资(收
318入桶减少,资产桶增加)\n- **资产 → 花费**:买东西(资产桶减少,花费桶增加)\n- **负债 → 资产**:借钱(负债桶增加,资产桶增加)\n- **资产 → 负债**:还款(资产桶减少,负债桶减少)\n- **花费 → 资产**:退货(花费桶减少,资产桶增加)\n- **资产 → 收入**:投资亏损(资产桶减少,收入桶减少)\n\n你会发现:按这种符号约定,收入账户的余额经常是负数。这不是 bug,而是记账视角不同。\n\n可以这样想象:把「收入」想成一个装着你一生(过去和未来)劳动成果的桶。每次你拿到工资,其实是在从这个桶里取出一部分,放进你的资产里。你能取的越多,收入桶里的数值就越往负的方向走。\n\n所以收入为负数并不表示「你欠了收入」,只是因为你在从这个桶取出资产。这也涉及到复式记账法的一个核心规则:一笔交易里,所有数字相加必须等于 0。这也是它检验正确性的关键:你少写一笔、写错一位数,系统就会当场报警。\n\n在 Beancount 常见的符号约定下,你会看到类似这样的「会计恒等式」写法:\n\n```\n(收入 + 负债) + (资产 + 花费) = 0\n```\n\n你也可以把它理解为更传统的表达:你赚到的、借来的,最终要么变成你拥有的资产,要么被花掉。\n\n---\n\n## Beancount\n\n[Beancount](https://github.com/beancount/beancount) 是目前我用过最舒服、也最适合复杂财务世界的纯文本复式记账工具。\n\n它不是复式记账软件的开创者,更早的代表是 [Ledger](https://github.com/ledger/ledger)。但 Beancount 在 Ledger 的概念上做了不少改良,也经历了时间的考验(2007 年开始)。\n\n学习 Beancount 最直接的方法是看官方文档:[Getting Started with Beancount](https://docs.google.com/document/d/1P5At-z1sP8rgwYLHso5sEy3u4rMnIUDDgob9Y_BYuWE)、[Beancount Language Syntax](https://docs.google.com/document/d/1wAMVrKIA2qtRGmoVDSUBJGmYZSygUaR0uOMW1GV3YE0),或者看这篇文章也很不错:[Beancount —— 命令行复式簿记 | wzyboy’s blog](https://wzyboy.im/post/1063.html)\n\n这篇博客我不会展开讲语法和使用细节,而是用几个例子让你快速感受 Beancount 的强大之处和为什么说它更适合 Crypto 和 AI 时代。\n\n### 处理复杂交易\n\n使用 Beancount 可以优雅处理复杂交易,以下例子涉及多对多,多账户 + 多人复杂交易,但是可以描述很清楚\n\n```ts\n2016-02-05 * \"饭店\" \"和室友吃饭\"\n  Assets:Cash:Wallet                         -300.00 CNY ; 我用现金支付\n  Assets:Receivables:Bob                     -200.00 CNY ; 室友帮我付的现金\n  Expenses:Food:DiningOut                    +250.00 CNY ; AA 我的一半\n  Assets:Receivables:Bob                     +250.00 CNY ; AA 室友的一半\n```\n\n这里同时发生了:\n\n- 你付了部分现金\n- 室友也付了部分现金\n- AA 分摊\n- 你对室友产生/抵消应收\n\n最后只需要看 `Assets:Receivables:Bob` 余额就可以知道你欠室友多少钱,看 `Expenses:Food:DiningOut` 余额就可以知道每个月吃饭开销花了多少钱。\n\n如果用「单式记账 + 备注」硬堆,后面基本一定算不清,而复式记账把结构直接写出来,之后统计就变得非常自然。\n\n### 处理多币种交易\n\n跨币种交易通常涉及汇率问题,Beancount 也能优雅处理\n\n```ts\n2016-02-10 * \"商店\" \"买东西\"\n Assets:Cash                                 -200.00 USD\n Liabilities:CMB:CreditCards                 -650.00 CNY @@ 100.00 USD\n Expenses:Clothing:Pants                     +150.00 USD\n Expenses:Clothing:Shoes                     +150.00 USD\n```\n\n这类「刷卡以人民币记账、但实际消费以美元计价」的场景,在跨境生活里非常常见。Beancount 的表达方式很直接:用一条记录把两边币种的关系和当时汇率绑定住,之后查询/报表都能基于它继续推导。\n\n### 更适合 Crypto 交易\n\nBeancount 不限制货币单位:USD、CNY、BTC、USDT、甚至任何你自定义的 token 都可以。再配合类似 SQL 的查询工具 `bean-query`,拿来做加密资产投资分析非常顺手。\n\n举一个看起来很复杂,但记录很简洁的例子:\n\n```ts\n2025-07-23 price BTC 1 USD\n\n2025-07-24 * \"OKX\" \"ä¹°BTC\"\n  Assets:Crypto:USD            -150 USD\n  Assets:Crypto:BTC            149 BTC  {1 USD}\n  Expenses:TradingFee:Crypto      1 USD\n\n2025-07-24 * \"OKX\" \"ä¹°BTC\"\n  Assets:Crypto:USD             -60 USD\n  Assets:Crypto:BTC             19 BTC  {3 USD}\n  Expenses:TradingFee:Crypto      3 USD\n\n2025-07-24 * \"OKX\" \"卖BTC\"\n  Assets:Crypto:BTC           -198 BTC  {} @ 2 USD\n  Assets:Crypto:USD             298 USD\n  Income:Investment\n\n2025-07-25 price BTC 4 USD\n```\n\n这个例子里包含了:\n\n- 多次买入,成本不同\n- 手续费\n- 卖出时自动匹配成本(`{}` 让 Beancount 自己去找)\n- 市价(`price`)随时间变化\n\n仅基于这些记录,Beancount 可以自动算出:\n\n- 总收益/已实现收益/未实现收益\n- 各类收益率(例如资金加权收益率 Modified Dietz、时间加权收益率 TWRR、甚至你自定义的任意收益计算)\n\n换句话说:你只负责把事实写清楚,任何复杂计算都可以交给 Beancount。\n\n---\n\n## 我的 Beancount 实践\n\n把账本当代码管理。\n\n### 编辑器\n\n我用 VSCode,配合 [Beancount](https://marketplace.visualstudio.com/items?itemName=Lencerf.beancount)、[Beancount Formatter](https://marketplace.visualstudio.com/items?itemName=dongfg.vscode-beancount-formatter) 和以下配置实现语法高亮、自动补全、错误检查、格式化等。\n\n```json\n{\n  \"beancount.mainBeanFile\": \"main.bean\",\n  \"beancount.runFavaOnActivate\": false,\n  \"beancount.completePayeeNarration\": true,\n  \"beancount.fixedCJKWidth\": true,\n  \"beancount.inputMethods\": [\"pinyin\"],\n  \"beancount.instantAlignment\": false,\n  \"editor.formatOnSave\": true\n}\n```\n\n![](./1.png)\n\n### 项目结构\n\nBeancount 天然支持模块化:不同类型交易拆到不同文件,再 `include` 进主入口ï¼
318Œç»´æŠ¤æˆæœ¬éžå¸¸ä½Žã€‚\n\n```ts\n.\n├── books\n│   ├── 2025\n│   │   ├── 2025.bean\n│   │   ├── cn.bean\n│   │   ├── crypto.bean\n│   │   ├── daily.bean\n│   │   ├── periodic.bean\n│   │   ├── prices.bean\n│   └── books.bean\n├── scripts\n│   ├── importer-dbs-credit.js\n│   ├── importer-dbs-debit.js\n│   ├── importer-okx.js\n├── accounts.bean\n├── commodity.bean\n├── config.pbtxt\n├── dashboards.yaml\n├── main.bean\n```\n\n`main.bean` 是入口文件,集中放配置、插件和 include:\n\n```ts\noption \"title\" \"DIYgod's Book\"\noption \"operating_currency\" \"USD\"\noption \"booking_method\" \"LIFO\"\noption \"account_rounding\" \"Equity:Rounding-Error\"\n\nplugin \"beancount_periodic.recur\"\nplugin \"beancount_periodic.split\"\n\n2024-01-01 custom \"fava-option\" \"auto-reload\" \"true\"\n2024-01-01 custom \"fava-option\" \"default_page\" \"income_statement/?conversion=units&interval=day\"\n\n2024-01-01 custom \"fava-extension\" \"fava_portfolio_returns\" \"{\n  'beangrow_config': 'config.pbtxt',\n}\"\n\n2024-01-01 custom \"fava-extension\" \"fava_dashboards\" \"{\n  'config': 'dashboards.yaml'\n}\"\n\ninclude \"accounts.bean\"\ninclude \"books/books.bean\"\ninclude \"commodity.bean\"\n```\n\n`accounts.bean` 定义所有账户(略去部分):\n\n```ts\n; Expenses 费用 —— 外出就餐、购物、旅行等\n1995-06-09 open Expenses:Food:Restaurant\n; ... 省略若干行 ...\n\n; Income 收入 —— 工资、奖金等\n2020-04-01 open Income:Salary\n; ... 省略若干行 ...\n\n; Assets 资产 —— 现金、银行存款、有价证券等\n2024-01-01 open Assets:Bank:DBS SGD\n2024-01-01 open Assets:Crypto:OKX:BTC BTC\n; ... 省略若干行 ...\n\n; Liabilities 负债 —— 信用卡、房贷、车贷等\n2024-01-01 open Liabilities:Bank:DBS SGD\n; ... 省略若干行 ...\n\n; Equity 权益 —— 用于「存放」某个时间段开始前已有的豆子\n2024-01-01 open Equity:Opening-Balances\n2024-01-01 open Equity:Rounding-Error\n```\n\n`commodity.bean` 定义货币/资产,并用 `price` 指定价格来源(后面会讲自动更新):\n\n```ts\n2025-01-01 commodity USDT\n  name: \"Tether\"\n\n2025-01-01 commodity BTC\n  name: \"Bitcoin\"\n  price: \"USD:coinbase/BTC-USD\"\n\n2025-01-01 commodity USD\n  name: \"United States Dollar\"\n\n2025-01-01 commodity QQQ\n  name: \"NASDAQ-100 Index\"\n  price: \"USD:alphavantage/price:QQQ:USD\"\n```\n\n`books/2025/prices.bean` 用于记录每日价格(自动生成),让持仓浮盈浮亏可被计算:\n\n```ts\n2025-01-01 price BTC 93346.48 USD\n2025-01-02 price BTC 94384.76 USD\n; ... 省略若干行 ...\n```\n\n### 几种常见的 Crypto 交易\n\n下面这些例子来自我的实际习惯:交易不是手填的,而是通过 `scripts/importer-okx.js` 从 OKX 交易记录自动生成。\n\n#### 稳定币现货交易\n\n1)买入:用 USDT ä¹° BTC + 手续费\n\n```ts\n2025-11-14 * \"OKX\" \"Buy BTC with USDT\"\n  Assets:Crypto:OKX:USDT                       -3022.493 USDT\n  Assets:Crypto:OKX:BTC                     0.0302113288 BTC {100000 USDT}\n  Expenses:TradingFee:Crypto:OKX\n```\n\n这里我把手续费留空,让 Beancount 自动补齐(利用「每笔交易加起来为 0」的规则)。\n\n但如果你的 BTC 可能来自 USDT、USDC 等不同稳定币,之后统计收益会涉及汇率与币种转换。为了让分析更统一,我常用一个过渡账户把成本统一成 USD:\n\n```ts\n2025-11-14 * \"OKX\" \"Buy BTC with USDT\"\n  Assets:Crypto:OKX:USDT                       -3022.493 USDT\n  Equity:Exchange                               3022.493 USDT\n  Equity:Exchange                              -3022.493 USDT @ 1 USD\n  Assets:Crypto:OKX:BTC                     0.0302113288 BTC {100000 USD}\n  Expenses:TradingFee:Crypto:OKX\n```\n\n`Equity:Exchange` 的作用很像「统一换算层」:把不同稳定币交易都折算成 USD 口径,后续报表会非常舒服。\n\n2)卖出:卖 BTC 得 USDC + 自动算收益\n\n```ts\n2025-09-18 * \"OKX\" \"Sell BTC for USDC\"\n  Assets:Crypto:OKX:BTC                        -0.
318100011 BTC {} @ 117600 USD\n  Equity:Exchange                         11756.00101788 USD\n  Equity:Exchange                        -11756.00101788 USD @ 1 USDC\n  Assets:Crypto:OKX:USDC                  11756.00101788 USDC\n  Expenses:TradingFee:Crypto:OKX             -5.29258212 USD\n  Income:Investment\n```\n\n- `{} @ 117600 USD`:成本价由 Beancount 自动从历史记录里匹配,卖出价是 117600 USD\n- 多出来的部分进 `Income:Investment`:收益就这样自然出来了\n\n如果你不需要统一换算,也可以简化成:\n\n```ts\n2025-09-18 * \"OKX\" \"Sell BTC for USDC\"\n  Assets:Crypto:OKX:BTC                        -0.100011 BTC {} @ 117600 USDC\n  Assets:Crypto:OKX:USDC                  11756.00101788 USDC\n  Expenses:TradingFee:Crypto:OKX             -5.29258212 USDC\n  Income:Investment\n```\n\n#### 币币现货交易\n\n用 BTC ä¹° ETH\n\n```ts\n2025-08-22 * \"OKX\" \"Buy ETH with BTC\"\n  Assets:Crypto:OKX:BTC            -0.025828016279999998 BTC {} @ 112480.295 USD\n  Equity:Exchange                       2,905.1428904392 USD\n  Equity:Exchange                      -2,905.1428904392 USD\n  Assets:Crypto:OKX:ETH                     0.6820274505 ETH {4224.16 USD}\n  Income:Investment\n  Expenses:TradingFee:Crypto:OKX            0.0001705495 ETH {4224.16 USD}\n```\n\n币币交易的成本/收益更容易乱,但把过程统一到 USD 口径后,就会变得非常清晰:用 BTC 换到的 ETH,有明确的 USD 成本;手续费和之后的收益也能被正确计入。\n\n#### U 本位合约\n\nU 本位合约在交易所内部不是真的卖出 BTC,但为了把盈亏落到资产变化上,我用一个「借币卖出/买回」近似模型来表达:\n\n- 开仓做空:等价于「借 BTC 卖出,换成 USDT」\n- 平仓:等价于「用 USDT 买回 BTC 归还」\n- 盈亏会自然体现在最后多出来(或少了)的部分上\n\n```ts\n2025-12-01 * \"OKX\" \"合约 BTC-USDT 做空开仓\"\n  Assets:Crypto:OKX:Futures:BTC                      -10 BTC @ 100000 USD\n  Equity:Exchange                                1000000 USD\n  Equity:Exchange                               -1000000 USD @ 1 USDT\n  Assets:Crypto:OKX:Futures:USDT                 1000000 USDT\n\n2025-12-10 * \"OKX\" \"合约 BTC-USDT 做空平仓\"\n  Assets:Crypto:OKX:Futures:USDT                 1000000 USDT\n  Equity:Exchange                                1000000 USDT\n  Equity:Exchange                               -1000000 USDT @ 1 USD\n  Assets:Crypto:OKX:Futures:BTC                      -10 BTC {80000 USD}\n  Income:Investment\n```\n\n真实合约还会涉及保证金、资金费、强平、结算币种差异等。更严谨的做法可以继续拆分账户模型,但这套写法已经能在大多数场景里把结果记清楚、算出来。\n\n#### 币本位合约\n\n币本位合约更复杂:仓位通常是「USD 计价的 BTC 价格敞口」,而不是固定数量 BTC。想按每日价格计算浮盈浮亏会很复杂,需要「双账模型」(事实账 + 估值账)。\n\n我目前选择先把它简化成:平仓时手动算出以 BTC 为单位的收益,只记录最终 BTC 变化,只是这样会牺牲当前持仓未实现盈利的数据:\n\n```ts\n2025-11-21 * \"OKX\" \"合约 BTC-USD 1.0\"\n  Income:Investment\n  Assets:Crypto:OKX:BTC                0.007433571994392 BTC {85400 USD}\n```\n\n### 自动化脚本 + AI è®°è´¦\n\n通过自动化脚本和 AI,可以极大简化记账工作量,让「记账」变成「对账」。\n\n**自动生成交易记录**\n\nBeancount 是纯文本,这意味着它天生适合自动化生成记录和更新资产价格。\n\n社区里有很多导入工具,比如:[beangulp](https://github.com/beancount/beangulp)、[smart_importer](https://github.com/beancount/smart_importer)。\n\n但我自己用得最多的还是自写脚本(例如 OKX 的 `scripts/importer-okx.js`、DBS 的 `scripts/importer-dbs.js`)。原理都类似:从接口或者网页获取交易数据 → 转成 Beancount 文本。\n\n对于一些没有接口、甚至没有账单导出的账户(比如我现在用的 Trust),直接截图丢给 AI 识别也很省心:\n\n![](./2.png)\n\n**自动更新价格**\n\nBeancount 本身是离ç
318º¿ç³»ç»Ÿï¼Œä¸ä¼šè‡ªåŠ¨ä»Žäº’è”ç½‘æ‹‰ä»·æ ¼ï¼Œæ‰€ä»¥æˆ‘æ¯å¤©ä¼šæŠŠæœ€æ–°çš„å¸ä»·/股价写进 `books/2025/prices.bean`,让报表能计算当日估值与未实现盈利。\n\n官方提供了开箱即用的 [beanprice](https://github.com/beancount/beanprice),支持 Coinbase、Coinmarketcap、Alphavantage 等来源,一个命令就能更新:\n\n```sh\nbean-price -i --update-rate daily --no-cache main.bean >> books/2025/prices.bean\n```\n\n### AI 分析与可视化\n\n很多人把记账停在「记下来」就结束了,但真正有价值又容易被遗忘的是记录之后如何分析。\n\nBeancount 在分析和可视化能力上非常夸张:\n\n- 可以装插件的 Web 界面:[Fava](https://github.com/beancount/fava)\n- ç±» SQL 查询语言:BQL(Beancount Query Language)\n\n先看一些我常用的效果:\n\n投资品的价格走势图(Fava 自带):\n\n![](./fava-1.png)\n\n不同投资品的收益曲线,以及各种加权收益率(插件 [Fava Portfolio Returns](https://github.com/andreasgerstmayr/fava-portfolio-returns)):\n\n![](./fava-2.png)\n![](./fava-5.png)\n\n特定资产的变化曲线、分布占比、列表(插件 [Fava Dashboards](https://github.com/andreasgerstmayr/fava-dashboards) + 自定义 BQL):\n\n![](./fava-3.png)\n![](./fava-4.png)\n\n更爽的是:现在有了 vibe coding,时代变了。\n现在甚至不需要先学会 BQL 怎么写——可以直接让 AI 写。\n\n比如我会这样提需求:\n\n> 利用 Fava Dashboards 插件,在 dashboards.yaml 编写 BQL 实现一个展示我所有加密货币持仓随时间变化的曲线图。\n\n曾经要折腾好久的个性化财务分析,现在可能就是一句话。\n\n---\n\n## 结语\n\n我用了 Beancount 一年,几乎全部需求都很好得到了满足,非常满意,也在公司内部做过分享。这篇博客就是把分享内容整理成文字,希望能把它推荐给更多人。\n\n我也承认,Beancount 的门槛对大多数人来说不低——它更像「写账本的编程语言」,而不是一个点点点的 App。\n但我同样相信:随着 AI 发展,这些门槛会越来越低。未来每个人都可以用更低成本驾驭这种强大的工具,实现对自己财务的全面掌控。\n\n如果你也正在经历:\n\n- 多币种生活\n- 投资品越来越多\n- 账越记越乱\n- 分析越来越复杂\n\n那我建议你至少花半天时间试试 Beancount。\n它可能会让你第一次觉得:原来我终于能把钱讲清楚了。"},{"slug":"6-year-of-rsshub","title":"一个六岁开源项目的崩溃与新生","tags":[],"body":"我有一个维护了六年的开源项目—— RSSHub,它正在面临崩溃\n\n## 背景\n\n表面上,它有接近 30k Stars、900 多 Contributors、每月 3 亿多次请求和数不清的用户、每月几十刀的赞助、有源源不断的 issue 和 pr、代码几乎每天更新,非常健康和充满活力,但在不可见的地方,持续数年高昂的维护时间成本、每月一千多刀的服务器费用、每天重复繁琐且逐渐积累的维护工作,都让它在崩溃的边缘反复横跳\n\n项目是六年前开发的,不少当时以 Next Generation 为口号的时髦 Node.js 技术栈和依赖库已经成为时代眼泪,现在看非常陈旧,很多现在流行的新技术没法应用,比如 JSX、TypeScript、Serverless 等;它的架构也非常不合理,每个路由的信息散落在多个地方,开发或者变更一个路由需要多处修改,一个地方去注册路由,一个地方去编写路由脚本,一个地方去编写 Radar 规则,一个地方去编写文档......这增加了很多工作量,也很容易出错,之前路由少的时候并不是个问题,但现在已经变得难以忍受\n\n在如此糟糕的基础架构下能保持现状已经是竭尽全力,开发新功能更是无本之木,只会增加以后更新的难度,所以我有时候脑子蹦出的新奇想法也很难实现\n\n要解决这些问题,唯一的办法是使用现代化的框架和新设计的架构来重写内核,但随着路由越来越多,改造成本也越来越高,每个基础改动可能都需要多达数月的工作量,所以虽然问题越来越严重,但秉承着又不是不能用的原则一拖再拖\n\n但这又是不得不做的事情,所以我抽空花了几个月的时间重新设计和重写了它\n\n## 技术栈更新\n\n### koa -> Hono\n\n第一步也是最基础和难度最大的是换掉之前使用的 Web 框架 [koa](https://github.com/koajs/koa),作为六年前流行的下一代 Web 框架,作者早就弃坑了,调研之后决定换用对 JSX、TypeScript、Serverless 支持最好的 [Hono](https://github.com/honojs/hono)\n\n它们的 API 差异很大,需要重写所有中间件和替换所有路由中使用的 koa API\n\n主要改动:\nhttps://github.com/DIYgod/RSSHub/pull/14295\n\n![image](./attachments/QmUBrZkbHVDyfjoMK661QkLiYLnSbBke6quM5SCs2pnFsG.png)\n\nHono 作者也很喜欢这个改造\n\nhttps://twitter.com/yusukebe/status/1762801106340782222\n\n### JavaScript -> TypeScript\n\n改用 TypeScript 可以避免很多类型问题和低级错误,最重要的是可以保证数百名贡献者保持一致难以出错和后续贡献的路由代码质量不至于太糟糕\n\n主要改动:\n\n- https://github.com/DIYgod/RSSHub/pull/14295\n- https://github.com/DIYgod/RSSHub/pull/14632\n\n![image](./attachments/QmePQXUgzwrKKy8bwRNRARMoXYfPe2ShvqYffYRXhWkbtf.png)\n\nhttps://twitter.com/DIYgod/status/1764360942035312879\n\n### CommonJS -> ESM\n\nESM 是几年前一些 Node.js 核心开发者强推的规范,它有一些优点,但最多的是与之前 CommonJS 不兼容带来的生态割裂和功能简化带来的诟病\n\n经过这几年的发展,现在可以说大部分场景勉强可用了,[tsx](https://github.com/privatenumber/tsx) 也为 CommonJS 和 ESM 混用的场景提供了支持\n\n虽然已经尽了最大努力,但还是有一些 CommonJS 代码暂时难以迁移,导致现在只能使用 tsx 运行,与一些 Serverless 比如 Vercel 没法兼容,但也有机会后续慢慢解决\n\n主要改动:\n\n- https://github.com/DIYgod/RSSHub/pull/14619\n- https://github.com/DIYgod/RSSHub/pull/14691\n- https://github.com/DIYgod/RSSHub/pull/14632\n\n![image](./attachments/QmReUSKAH6qZpavbpotTxsdQ3DwH8A6ughVaBnEpk4k3Xy.png)\n\n![image](./attachments/QmTd5sWm6kzZunsv7sQH3djekip5XY44B4LEx3z9XAuvz1.png)\n\n### art-template -> JSX\n\n[art-template](https://github.com/aui/art-template) 是一个支持 koa 的模板引擎,记得六年前还有一个更流行的模板引擎,但是不记得名字了,选用 art-template 是因为那个更流行的我当时没看懂,这个很简单\n\nHono 自带了 JSX 支持,JSX 就不用多介绍了,根正苗红的 JavaScript 的语法扩展,等同于用 React\n\n主要改动:\n\n- https://github.com/DIYgod/RSSHub/commit/3bfdf9427cb8cf063cf7d231ec621278495f5a44\n- https://github.com/DIYgod/RSSHub/commit/94cf0742afa8bf18510ad9ded9b76dcd2ad52c90\n\n### Jest -> Vitest\n\nJest 是曾经流行的测试框架,但是在 ESM 时代到来之后就越来越不行了,对 ESM 的支持一直是实现性「experimental support」,现在更流行的是 Vitest 了\n\n主要改动:\nhttps://github.com/DIYgod/RSSHub/commit/38e42156a0622a2cd09f328d2d60623813b8df28\n\n### Got -> ?\n\n目前使用的 [Got](https://github.com/sindresorhus/got) 也已经是不积极维护的状态了,也没有找到好的替代品,后续也许会换成原生 Fetch 或者自封装的 Fetch,还没有动手\n\n## 新路由标准\n\n我自己能力还是不够的,在与社区开发者们讨论的过程中学习和改进了很多,过程很有意思:https://github.com/DIYgod/RSSHub/issues/14685\n\n主要改动:\nhttps://github.com/DIYgod/RSSHub/pull/14718\n\n![image](./attachments/QmPSFiYa8fKZZuFNcptWSpfGwRFTt1S2nfy9CGHFFUKsqe.png)\n\n### 历史\
318n\n新标准主要为了解决路由信息过于分散的问题,这次应该算第三版\n\n第一版来自 RSSHub 开发阶段,当时没有预见到路由数量会有这么多,所以几乎没什么规划,所有路由在同一个文件中注册,然后再去增加路由脚本和文档,后来这个文件越来越大,很容易冲突,另外所有路由脚本都会在启动阶段被加载,程序性能越来越差\n\n第二版来自 [NeverBehave](https://github.com/NeverBehave) 维护的时期,引入了命名空间,切割了 router.js、radar.js,同命名空间的路由集中在了一个同文件夹中和一个或多个 Markdown 文档中,还实现了懒加载,极大提升了可维护性和性能,但还是会分散在多个文件中,不同文件的信息也容易出现不一致导致错误\n\n### 现在\n\n本次把路由文件分为了两类,namespace.ts 和任意名字的路由文件\n\nnamespace.ts 会通过导出名为 namespace 的对象来定义命名空间的信息\n\n```ts\nimport type { Namespace } from \"@/types\";\n\nexport const namespace: Namespace = {\n  // ...\n};\n```\n\nnamespace 包含的字段通过 TypeScript 限制为\n\n```ts\ninterface Namespace {\n  name: string;\n  url?: string;\n  categories?: string[];\n  description?: string;\n}\n```\n\n这些信息会经过编译后被文档和 RSSHub Radar 利用\n\n路由文件会通过导出名为 route 的对象来定义路由的信息\n\n```ts\nimport { Route } from \"@/types\";\n\nexport const route: Route = {\n  // ...\n};\n```\n\nroute 包含的字段通过 TypeScript 限制为\n\n```ts\ninterface Route {\n  path: string | string[];\n  name: string;\n  url?: string;\n  maintainers: string[];\n  handler: (ctx: Context) => Promise<Data> | Data;\n  example: string;\n  parameters?: Record<string, string>;\n  description?: string;\n  categories?: string[];\n\n  features: {\n    requireConfig?: string[] | false;\n    requirePuppeteer?: boolean;\n    antiCrawler?: boolean;\n    supportRadar?: boolean;\n    supportBT?: boolean;\n    supportPodcast?: boolean;\n    supportScihub?: boolean;\n  };\n  radar?: {\n    source: string[];\n    target?: string;\n  };\n}\n```\n\n之前 route.js mantainer.js radar.js 和文档的信息都被集中在这一个文件中,减少了多处定义也减少了出错的可能\n\n### 实现\n\n实现逻辑就是开发环境通过遍历整个 route 文件夹,找到所有 namespace.ts 和路由文件,读取信息,加载路由,在生成环境使用提前编译好的路径列表来避免遍历和不必要的加载过程,代码在:https://github.com/DIYgod/RSSHub/blob/master/lib/registry.ts\n\n文档也是通过遍历 route 文件夹,找到所有需要的信息然后合成一系列的 Markdown 文件,不再需要手动维护,代码在:https://github.com/DIYgod/RSSHub/blob/master/scripts/workflow/build-routes.ts\n\n当然使用之前路由标准开发的路由都需要迁移到新标准而不是直接放弃掉,已经通过脚本批量抓取整理信息后做了替换,但特别是文档比较混乱也有很多错误,所以抓取的信息也有很多错误,只能在后续逐渐人工修改了\n\n## 未来\n\n通过这一系列改进,RSSHub 终于能够扔掉历史包袱,安心开发新功能了,这里列出我积累的一些想法抛砖引玉:\n\n- 既然 RSSHub 是一个数据集合,用途不一定只有 RSS,JSON 输出功能可以做一些增强,作为通用的 RESTful API 来使用,比如可以提供获取下一页接口或者输出类似 Twitter 关注数的非 feed 数据\n- 用户系统和用户自定义配置,生成自己的私有订阅地址 [#14706](https://github.com/DIYgod/RSSHub/issues/14706)\n- 路由错误通知和健康度检测 [#14712](https://github.com/DIYgod/RSSHub/issues/14712)\n- 与 RSS3 节点的联动和加密货币收益共享 https://twitter.com/rss3_/status/1731822029199094012\n- AI 翻译和摘要\n- 更详细的实例数据分析及反向推导自动推荐的 Radar 规则\n- 与本地浏览器或客户端绑定的 RSSHub 实例,有希望真正解决反爬难题\n- ...\n\n最后,开源是一件很昂贵的事情,RSSHub 能活到现在离不开这些开发者的帮助\n\n[![](./attachments/contributors.svg?width=890)](https://github.com/DIYgod/RSSHub/graphs/contributors)\n\n以及这些赞助的好心人\n\n[![](./attachments/sponsors.wide.svg)](https://github.com/DIYgod/sponsors)\n\n如果 RSSHub 正在帮助ä
318½ ï¼Œä¹Ÿå¸Œæœ›ä½ å¯ä»¥ç§¯æžå‚与进来,为信息自由的未来贡献一份自己的微小力量"},{"slug":"palworld","title":"和帕鲁生活在一起的两周","tags":[],"body":"## 宝可梦幻想\n\n![image](./attachments/QmTbb2WpmvvM9LYr2w4ibhqB5icWMSa4n9hFjXbgbaKBRb.png)\n\n哪个小男孩没幻想过生活在这样一个充满宝可梦伙伴的世界,它们能听懂且愿意倾听我们说话,有着不同的特点和强大的技能,而且都很可爱,我们可以跟它们睡觉吃饭、并肩作战探索世界,永远不再孤独,不管是谁都可以找到最适合自己的宝可梦\n\n这一切早就可以发生,但这一切终究没有发生,宝可梦复杂的版权问题和躺平在功劳簿上的版权公司 Game Freak 让我们的幻想一直也仅仅是幻想\n\n当然也有人说最近的几个新作阿尔宙斯、朱紫比之前好多了,“虽然好多了,但只是臭味稀薄一点的狗屎罢了”,剑盾、阿尔宙斯、朱紫、Pokemon Sleep 游戏时长并不短的宝可梦玩家 DIYgod 义愤填膺地说道\n\n## 帕鲁实现\n\n![image](./attachments/Qmd7qeiygj9veZhTMThe79xzfqyVpu6TEGHk48g8AAEcW3.png)\n\n但只要幻想一直存在,变成现实也只是时间问题,横空出世的幻兽帕鲁给所有宝可梦粉丝带来了一个一本满足的平行幻想世界,终于苦于没有 Windows 的我也专门买了一台 ROG Ally 来沉迷其中\n\n游戏中与帕鲁的互动是前无仅有的,衣食住行战斗探索的过程都与帕鲁深度融入,真的是和帕鲁生活在一起\n\n从刚落地进入初始台地互动就开始了,我们的第一个落脚点不是自己造的,而是跟捣蛋猫一起造的\n\n![image](./attachments/QmTAMciZ4eBo9jbaZVyhPpkZxX3FiYXdMVmkokyk29eT6E.png)\n\n![image](./attachments/QmW4UyojbTFyXjiEmWBNWoGDK5mjZYxbccyMTbbLGfuQuD.png)\n\n再到后来帕鲁包办我们的一切后勤,我们的每一顿大餐,都需要经历播种、浇水、收割、搬运、存储、烹饪,分别由有着不同特长和分工的帕鲁来完成,会制冷的企丸丸去运行冰箱,会喷火的燎火鹿去烹饪\n\n![image](./attachments/Qmc4Y1VHfxckFHXoNE3oD5jgSbSye9SQvMAu1SjexiPSfu.png)\n\n![](./attachments/QmSpSKCts7aQTesNtpgs1gumyYCSq467LYma1FUPZaGpBg.png)\n\n在我们外出探索时,过河骑滑水蛇,赶路骑云海鹿,翻山越岭骑烽歌龙\n\n![image](./attachments/QmdeiQSKuCmFzbocchFz9v6cJk5wqUaN8fWrRhZbojcAn3.png)\n\n![](./attachments/QmaBSZyudw5Bmd3vT3eHbwj1rSyqo6BzWAD8nYeBUr4eKy.png)\n\n在我们战斗时,举着火绒狐充当、喷火器,骑着暴电熊扫射机关枪,甚至虽然不太人道,可以把电棘鼠当作手榴弹扔出去,同时据点里的焰煌在帮我们炼钢造枪,阿努比斯在帮我们手搓子弹\n\n![image](./attachments/QmapqqBNQK5cupXDFJ45CP7yMM4Ye53ncQdrn3qNjZz6os.png)\n\n![](./attachments/QmcF39d24AddScaCMtxDhHhW4Q4N98zMggLmvoSEeRwzLd.png)\n\n从徒手撸树到机关枪横着走ï¼
318Œä»Žæ— äººé—®æ´¥åˆ°äººæ»¡ä¸ºæ‚£ï¼Œåœ¨ä¸çŸ¥ä¸è§‰çš„建造中我已经在帕鲁世界中倾注了太多的感情\n\n从饿着肚子的第一天\n\n![Pal   6_2_2024 下午 9_54_32](./attachments/QmQySkxYV7yPBLLJqJprXq1XJUTfvzjEdQPAsVifHznuL1.jpeg)\n\n到现在\n\n![Pal   19_2_2024 上午 2_45_40](./attachments/QmSSQnJ3wRPuyGGP7VzBkGq91vN6Ybs3KSQxKM6NKSWpEF.jpeg)\n\n![Pal   18_2_2024 上午 12_42_29](./attachments/Qmb6ELDeZYmNNuSh98SqdhZCkyTJdeEmkeyHR9kCxgF78X.jpeg)\n\n## 一些额外的探索\n\n### 数据展示\n\n![image](./attachments/QmVigw528nJrF6z9QanPoqqYnmn2MW6HqEECj5X47jnaAN.png)\n\n毕竟是单机游戏,数据都在本地,可以很方便地做处理\n\n有一个开源项目可以把存档文件解析成 JSON 方便第三方开发和展示 https://github.com/cheahjs/palworld-save-tools\n\n还有一个开源项目可以把 JSON 再生成一个前端页面 https://github.com/zaigie/palworld-server-tool\n\n于是我把存档同步到 NAS 上,再在 NAS 上部署一个展示页面,就可以很方便地查看我的帕鲁们了 https://pal.diygod.me\n\n### 模组\n\n帕鲁有很丰富的社区模组,比如把皮皮鸡变成坤或者把帕鲁变成宝可梦什么的,还有一些可以在不影响游戏平衡的前提下极大提升游戏体验\n\n我用的主要来自一个模组社区 [Nexus Mods](https://www.nexusmods.com/palworld),他们有一个很方便的模组安装和管理工具 [Vortex Mod Manager](https://www.nexusmods.com/about/vortex/),以下是我正在使用的模组\n\n- [Basic MiniMap](https://www.nexusmods.com/palworld/mods/146):增加一个不知道为什么官方没做的感觉很基础的小地图功能,但是记得到设置里把旋转关掉\n\n- [Better Night Light](https://www.nexusmods.com/palworld/mods/550):晚上太眼瞎了,啥都看不见,像得了夜盲症一样,用这个模组可以变亮一些,还改了一个绝美的星空\n\n  ![Pal   18_2_2024 下午 8_05_05](./attachments/QmTTuiLhZRSgbZASC6EqAyB7C2nG2bEoNdXPSRKkb2MsD8.png)\n\n- [Golden Statue of Power](https://www.nexusmods.com/palworld/mods/507):把力量石像变得金灿灿的更有质感\n\n  ![Pal   18_2_2024 下午 9_06_28](./attachments/QmStFjcG2188cZ6RUaaQMXpE8A95AGPnB6CMA77QR6dEXs.jpeg)\n\n- [Play as Zoe](https://www.nexusmods.com/palworld/mods/53) 和 [Hide All Human Hair All female Head All HeadEquip](https://www.nexusmods.com/palworld/mods/353):隐藏掉原有的装扮,自己变成老婆佐伊\n\n- [Paimon Replace DaeDream](https://www.nexusmods.com/palworld/mods/312):把寐魔变成派蒙\n\n  ![Pal   19_2_2024 上午 2_09_33](./attachments/Qmf1WLvt6b6xKjQi2mJeANzPZFE2Ksu4CjpwryHYK6wdLz.jpeg)\n\n- [Pal Analyzer](https://www.nexusmods.com/palworld/mods/336):捕捉前就可以看到帕鲁的属性和特质,掌机需要到设置里改下显示为 always on\n\n  ![Pal   18_2_2024 下午 7_45_54](./attachments/QmVe7gAntvcisk3xVbXcwwBiMYcVrTi2m4QqD1ZySM6x9y.jpeg)\n\n- [Stuck Pal Rescuer](https://www.nexusmods.com/palworld/mods/585):救命模组,据点里的帕鲁经常被 bug 卡住然后饿死,这个模组可以自动检测帕鲁是否卡住并重置\n- [FSR3 支持](https://afdian.net/album/47414d3eb9a111eeb82252540025c377):官方不支持 A 卡的帧生成,用上这个 Roy Ally 可以在中等画质从 40 多帧提升到 70 多帧"},{"slug":"twitter-ddos","title":"Twitter 对开源项目发起 DDoS 攻击","tags":[],"body":"## 背景\n\nTwitter 被马斯克收购后,从去年 8 月开始,他们对开源第三方集成和第三方客户端进行了一系列明里[暗里](https://github.com/zedeus/nitter/issues/1150)的打压和攻击,这样做是为了阻止用户通过非官方客户端访问和使用 Twitter,来增加公司的广告和会员营收\n\n而开源社区中以 Nitter 和 RSSHub 为代表的开源项目并没有放弃向信息自由的努力,通过众多聪明的开源开发者们想出来的一个个奇妙操作([issue](https://github.com/zedeus/nitter/issues/983)),在一轮轮封锁和反封锁的对抗中短暂占了上风,其中最流行的做法是通过 Android 客户端使用的接口功能生成临时账号([细节](https://diygod.cc/10k-twitter-accounts))\n\n## 经过\n\n在两天前(1月26日),许多 Nitter 实例的运行者和开发者报告称,他们正在使用的接口已被封锁。与此**同时**,他们的实例也开始遭受报复性 DDoS 攻击\n\n![image](./attachments/QmZLgt245ohmpFv5jqmZ4EcosbxjZpeG5fq6StX7zuTf3o.png)\n\n![image](./attachments/QmYM5zREJ95DGeE8feJQzr6eKczcZdeWwxuXPW4Z3KMgwN.png)\n\n起初,我并没有太在意这件事情。毕竟,谁会相信 Twitter 官方会做出如此令人不耻且自降身段的 DDoS 行为呢?我对此深感怀疑\n\n然而,昨天当我打开 RSSHub 的 GitHub 仓库时,却意外地发现了以下内容\n\n![image](./attachments/QmNoyG5nPS4RJQUy9dPZc1YeCwgjwfW4oYVh1yZSwjarJE.png)\n\n最近一个月的请求数达到了 4.5 亿,比正常水平高出 50%(正常水平仅为 3 亿多)\n\n然后登录 Cloudflare 查看日志\n\n![image](./attachments/QmfMvo6FFx3ztB65txRavWmz43rhXK6dnbcFwPvcRjKCCw.png)\n\n自从 26 日 0 点(当天官方接口被封锁和 Nitter 遭受 DDoS 攻击)以来,RSSHub也一直遭受大规模的 DDoS 攻击。最近两天,请求量是平时的 170 多倍,每秒约 1 千次请求\n\n尽管数量看起来可怕,但 Cloudflare 出色的缓存功能已经成功缓存了超过 99% 的 DDoS 请求,甚至没有触发报警\n\n![image](./attachments/QmW6rnKNHBTKzwMzVtnjUymMmfVrghtFeh28HfxrBLgK7c.png)\n\nRSSHub 的负载均衡和自动扩容功能非常完善,没有受到太大的压力\n\nhttps://twitter.com/DIYgod/status/1745090590419619865\n\n🤣 就这样一直没有发现\n\n进一步分析发现,所有请求都来自 IP 地址为 139.255.221.98 的设备。这些请求都是针对 `/twitter/keyword` 路由,并且后面跟着一串不同且无意义的参数\n\n![image](./attachments/QmNPdwPzjRfG6XQ6WbGiQR13ztjr3JQjV3Fb4Bu91tGc59.png)\n\n我很清楚为什么只针对 keyword 路由,尽管代码中没有明确表达,但根据我的使用经验,此路由使用的搜索接口受到最严格的访问频率限制,通过攻击该路由可以实现最大化效果。由此可以推断出 DDoS 攻击者也对 Twitter 的接口非常熟悉\n\n虽然无法直接证明是官方人员所为,但各种无法解释的“巧合”已经清楚地表明了事情的真相,马斯克的简单粗暴行事风格也正在深刻影响这家公司\n\n## 影响\n\n进一步封锁 API 和进行 DDoS 攻击这两个操作可以说非常有效\n\nNitter 开发者 zedeus 表示 Nitter 已死\n\n![image](./attachments/QmdEpeYj74uW4Q2NNTuwXrzVCvi1JVjcgDgJz8s1zvSqVp.png)\n\nTwitter Monitor 开发者 MANKA 表示不愿意再浪费时间\n\nhttps://twitter.com/manka_takami/status/1751450519829418342\n\nnitter-status 开发者更æ
318˜¯ç›´æŽ¥æ”¾å‡ºäº†å‘Šåˆ«é¡µé¢\n\n![image](./attachments/QmZN7oZ2UJEnvaNQ5BShiAinCckK7nfL9ajVGrsC5cLETH.png)\n\n看起来就到此为止了吗?不,这远非终点。自由无法被阻挡,我们还有很多事情可以做\n\n![image](./attachments/QmWvACcSj5wEFP4vkvknBZ3d9VgiBwEJd62JqSPWMyMjY3.png)\n\n29日 更新:RSSHub 已经恢复\n\nhttps://twitter.com/DIYgod/status/1751941869616148806"},{"slug":"unified-markdown","title":"如何优雅编译一个 Markdown 文档","tags":[],"body":"Markdown 是一种广泛使用的轻量级标记语言,允许人们使用易读易写的纯文本格式编写文档,也是 [xLog](https://xlog.app) 主要使用的文章格式,本文就以 [xLog Flavored Markdown](https://github.com/Crossbell-Box/xLog/blob/dev/src/markdown/index.ts) 为例来说明如何优雅地解析一个 Markdown 文档\n\n### 架构\n\n解析过程可以用这样一个架构来表示:\n\n```mermaid\nflowchart TB\n  subgraph input\n    Markdown\n  end\n  subgraph unified\n    subgraph remark\n      Markdown:::inputClass --string--> remark-parse:::remarkClass --mdast--> remarkPlugins[remark plugins]:::remarkClass\n      remarkPlugins --mdast--> remark-rehype:::remarkClass & mdast-util-toc:::remarkClass\n    end\n    subgraph rehype\n      remark-rehype --hast--> rehypePlugins[rehype plugins]:::rehypeClass\n      rehypePlugins --hast--> hast-util-to-text:::rehypeClass & hast-util-to-html:::rehypeClass & hast-util-to-jsx-runtime:::rehypeClass\n    end\n    rehypePlugins --hast--> unist-util-visit:::rehypeClass\n  end\n  subgraph output\n    mdast-util-toc --tocResult--> TOC:::inputClass\n    hast-util-to-text --string--> plainText[Plain Text]:::inputClass\n    hast-util-to-html --string--> HTML:::inputClass\n    hast-util-to-jsx-runtime --JSX.Element--> ReactElement[React Element]:::inputClass\n    unist-util-visit --custom--> Metadata:::inputClass\n  end\nstyle input fill:#bbf7d0,stroke:#4ade80,color:#15803d\nclassDef inputClass fill:#22c55e,stroke:#16a34a\nstyle output fill:#bbf7d0,stroke:#4ade80,color:#15803d\nstyle unified fill:#bfdbfe,stroke:#60a5fa,color:#1d4ed8\nstyle remark fill:#fecaca,stroke:#f87171,color:#b91c1c\nclassDef remarkClass fill:#f87171,stroke:#dc2626\nstyle rehype fill:#fef08a,stroke:##facc15,color:#a16207\nclassDef rehypeClass fill:#facc15,stroke:#ca8a04\n```\n\n关键概念:\n\n- [unified](https://github.com/unifiedjs):通过语法树和插件来解析、检查、转换和序列化内容的库\n- [remark](https://github.com/remarkjs):unified 的生态项目之一,由插件驱动的 Markdown 处理库\n- [rehype](https://github.com/rehypejs):unified 的生态项目之一,由插件驱动的 HTML 处理库\n- [mdast](https://github.com/syntax-tree/mdast):remark 使用的用于表示 Markdown 的抽象语法树规范\n- [hast](https://github.com/syntax-tree/hast):rehype 使用的用于表示 HTML 的抽象语法树规范\n\n简单来说就是把 Markdown 文档交给一个 unified 生态的解析器解析成 unified 可识别的语法树,再通过一系列 unified 生态的插件转换为需要的内容,再通过一系列 unified 生态的工具库输出为需要的格式,下面就从 解析、转换、输出 这三个步骤来分别说明\n\n### 解析 Parse\n\n```mermaid\nflowchart TB\n  subgraph input\n    Markdown\n  end\n  subgraph unified\n    subgraph remark\n      Markdown:::inputClass --string--> remark-parse:::remarkClass\n    end\n  end\nstyle input fill:#bbf7d0,stroke:#4ade80,color:#15803d\nclassDef inputClass fill:#22c55e,stroke:#16a34a\nstyle unified fill:#bfdbfe,stroke:#60a5fa,color:#1d4ed8\nstyle remark fill:#fecaca,stroke:#f87171,color:#b91c1c\nclassDef remarkClass fill:#f87171,stroke:#dc2626\n```\n\n> 无论输入是 Markdown、HTML 还是纯文本,都需要将其解析为可操作的格式。这种格式被称为语法树。规范(例如mdast)定义了这样一个语法树的外观。处理器(如mdast的remark)负责创建它们。\n\n最简单的一步,我们需要解析的是 Markdown,所以这里就应该使用 [remark-parse](https://github.com/remarkjs/remark/tree/main/packages/remark-parse) 来把 Markdown 文档编译成 mdast 格式的语法树\n\n对应 [xLog Flavored Markdown](https://github.com/Crossbell-Box/xLog/blob/dev/src/markdown/index.ts) 中的\n\n```ts\nconst processor = unified().use(remarkParse);\n\nconst file = new VFile(content);\nconst mdastTree = processor.parse(file);\n```\n\n### 转换 Transform\n\n```mermaid\nflowchart TB\n  subgraph remark\n    remark-parse:::remarkClass --mdast--> remarkPlugins[remark plugins]:::remarkClass\n    remarkPlugins --mdast--> remark-rehype:::remarkClass\n  end\n  subgraph rehype\n    remark-rehype --hast--> rehypePlugins[rehype plugins]:::rehypeClass\n  end\nstyle remark fill:#fecaca,stroke:#f87171,color:#b91c1c\nclassDef remarkClass fill:#f87171,stroke:#dc2626\nstyle rehype fill:#fef08a,stroke:##facc15,color:#a16207\nclassDef rehypeClass fill:#facc15,stroke:#ca8a04\n```\n\n> 这就是魔法发生的地方。用户组合插件以及它们运行的顺序。插件在此阶段插入并转换和检查它们获得的格式。\n\n这一步最为关键,不仅包含了从 Markdown 到 HTML 的转换,还包含我们想在编译过程中夹带的私货,比如增加一些非标准的语法糖、清理 HTML 防止 XSS、增加语法高亮、嵌入自定义组件等\n\nunified 的插件非常多,更新也比较及时,基本需求几乎都能满足,对于不能满足的特定需求,自己编写转换脚本也
318很容易实现\n\n里面有一个特殊的插件是 remark-rehype,它会把 mdast 语法树转为 hast 语法树,所以在它之前必须使用处理 Markdown 的 remark 插件,在它之后必须使用处理 HTML 的 rehype 插件\n\n[xLog Flavored Markdown](https://github.com/Crossbell-Box/xLog/blob/dev/src/markdown/index.ts) 中就加入了非常多的转换插件\n\n```ts\nconst processor = unified()\n  .use(remarkParse)\n  .use(remarkGithubAlerts)\n  .use(remarkBreaks)\n  .use(remarkFrontmatter, [\"yaml\"])\n  .use(remarkGfm, {\n    singleTilde: false,\n  })\n  .use(remarkDirective)\n  .use(remarkDirectiveRehype)\n  .use(remarkCalloutDirectives)\n  .use(remarkYoutube)\n  .use(remarkMath, {\n    singleDollarTextMath: false,\n  })\n  .use(remarkPangu)\n  .use(emoji)\n  .use(remarkRehype, { allowDangerousHtml: true })\n  .use(rehypeRaw)\n  .use(rehypeIpfs)\n  .use(rehypeSlug)\n  .use(rehypeAutolinkHeadings, {\n    behavior: \"append\",\n    properties: {\n      className: \"xlog-anchor\",\n      ariaHidden: true,\n      tabIndex: -1,\n    },\n    content(node) {\n      return [\n        {\n          type: \"text\",\n          value: \"#\",\n        },\n      ];\n    },\n  })\n  .use(rehypeSanitize, strictMode ? undefined : sanitizeScheme)\n  .use(rehypeTable)\n  .use(rehypeExternalLink)\n  .use(rehypeMermaid)\n  .use(rehypeWrapCode)\n  .use(rehypeInferDescriptionMeta)\n  .use(rehypeEmbed, {\n    transformers,\n  })\n  .use(rehypeRemoveH1)\n  .use(rehypePrism, {\n    ignoreMissing: true,\n    showLineNumbers: true,\n  })\n  .use(rehypeKatex, {\n    strict: false,\n  })\n  .use(rehypeMention);\n\nconst hastTree = pipeline.runSync(mdastTree, file);\n```\n\n下面介绍部分用到的插件\n\n- [remarkGithubAlerts](https://github.com/hyoban/remark-github-alerts):增加 GitHub 风格的 Alerts 语法,[演示](https://xlog.xlog.app/xfm#alerts)\n- [remarkBreaks](https://github.com/remarkjs/remark-breaks):不再需要空一行才能被识别为新的自然段\n- [remarkFrontmatter](https://github.com/remarkjs/remark-frontmatter):支持前置内容(YAML、TOML 等)\n- [remarkGfm](https://github.com/remarkjs/remark-gfm):支持非标准的 GitHub 在原版 Markdown 语法上扩展的一系列[语法](https://github.github.com/gfm/)(但其实这系列语法已经被非常广泛使用,成为了事实意义上的标准)\n- [remarkDirective](https://github.com/remarkjs/remark-directive?tab=readme-ov-file) [remarkDirectiveRehyp](https://github.com/IGassmann/remark-directive-rehype):支持非标准的 Markdown [通用指令提案 ](https://talk.commonmark.org/t/generic-directives-plugins-syntax/444)\n- [remarkMath rehypeKatex](https://github.com/remarkjs/remark-math):支持复杂的数学公式,[演示](https://xlog.xlog.app/xfm#supp
318orts-mathematical-expressions)\n- [rehypeRaw](https://github.com/rehypejs/rehype-raw):支持 Markdown 中夹杂的自定义 HTML\n- rehypeIpfs:自定义插件,为图片、音频、视频支持 `ipfs://` 协议的地址\n- [rehypeSlug](https://github.com/rehypejs/rehype-slug):为标题添加 id\n- [rehypeAutolinkHeadings](https://github.com/rehypejs/rehype-autolink-headings):为标题添加指向自身的链接rel = \"noopener noreferrer\"\n- [rehypeSanitize](https://github.com/rehypejs/rehype-sanitize):清理HTML,用于确保 HTML 安全避免 XSS 攻击\n- rehypeExternalLink:自定义插件,给外部链接添加 `target=\"_blank\"` 和 `rel=\"noopener noreferrer\"`\n- rehypeMermaid:自定义插件,渲染绘图和制表工具 [Mermaid](https://mermaid.js.org/),本文的架构图就是通过 Mermaid 渲染的\n- [rehypeInferDescriptionMeta](https://github.com/rehypejs/rehype-infer-description-meta):用于自动生成文档的描述\n- rehypeEmbed:自定义插件,用于根据链接自动嵌入 YouTube、Twitter、GitHub 等卡片\n- rehypeRemoveH1:自定义插件,用于把 h1 转为 h2\n- [rehypePrism](https://github.com/timlrx/rehype-prism-plus):支持语法高亮\n- rehypeMention:自定义插件,支持 @DIYgod 这样艾特其他 xLog 用户\n\n### 输出 Stringify\n\n```mermaid\nflowchart TB\n  subgraph unified\n    subgraph remark\n      remarkPlugins[remark plugins]:::remarkClass --mdast--> mdast-util-toc:::remarkClass\n    end\n    subgraph rehype\n      rehypePlugins[rehype plugins]:::rehypeClass\n      rehypePlugins --hast--> hast-util-to-text:::rehypeClass & hast-util-to-html:::rehypeClass & hast-util-to-jsx-runtime:::rehypeClass\n    end\n    rehypePlugins --hast--> unist-util-visit:::rehypeClass\n  end\n  subgraph output\n    mdast-util-toc --tocResult--> TOC:::inputClass\n    hast-util-to-text --string--> plainText[Plain Text]:::inputClass\n    hast-util-to-html --string--> HTML:::inputClass\n    hast-util-to-jsx-runtime --JSX.Element--> ReactElement[React Element]:::inputClass\n    unist-util-visit --custom--> Metadata:::inputClass\n  end\nclassDef inputClass fill:#22c55e,stroke:#16a34a\nstyle output fill:#bbf7d0,stroke:#4ade80,color:#15803d\nstyle unified fill:#bfdbfe,stroke:#60a5fa,color:#1d4ed8\nstyle remark fill:#fecaca,stroke:#f87171,color:#b91c1c\nclassDef remarkClass fill:#f87171,stroke:#dc2626\nstyle rehype fill:#fef08a,stroke:##facc15,color:#a16207\nclassDef rehypeClass fill:#facc15,stroke:#ca8a04\n```\n\n> 最后一步是将(调整后的)格式转换为Markdown、HTML或纯文本(可能与输入格式不同!)\n\nunified 的工具库也很多,可以输出各种我们需要的格式\n\n比如 xLog 需要在文章右侧展示自动生成的目录、需要输出纯文本来计算预估阅读时间和生成 AI 摘要、需要生成 HTML 来给 RSS 使用、需要生成 React Element 来渲染到页面、需要提取文章的图片和描述来展示文章卡片,就分别使用了 mdast-util-toc、hast-util-to-text、hast-util-to-html、hast-util-to-jsx-runtime、unist-util-visit 这些工具\n\n对应 [xLog Flavored Markdown](https://github.com/Crossbell-Box/xLog/blob/dev/src/markdown/index.ts) 中的\n\n```ts\n{\n  toToc: () =>\n    mdastTree &&\n    toc(mdastTree, {\n      tight: true,\n      ordered: true,\n    }),\n  toHTML: () => hastTree && toHtml(hastTree),\n  toElement: () =>\n    hastTree &&\n    toJsxRuntime(hastTree, {\n      Fragment,\n      components: {\n        // @ts-expect-error\n        img: AdvancedImage,\n        mention: Mention,\n        mermaid: Mermaid,\n        // @ts-expect-error\n        audio: APlayer,\n        // @ts-expect-error\n        video: DPlayer,\n        tweet: Tweet,\n        \"github-repo\": GithubRepo,\n        \"xlog-post\": XLogPost,\n        // @ts-expect-error\n        style: Style,\n      },\n      ignoreInvalidStyle: true,\n      jsx,\n      jsxs,\n      passNode: true,\n    }),\n  toMetadata: () => {\n    let metadata = {\n      frontMatter: undefined,\n      images: [],\n      audio: undefined,\n      excerpt: undefined,\n    } as {\n      frontMatter?: Record<string, any>\n      images: string[]\n      audio?: string\n      excerpt?: string\n    }\n\n    metadata.excerpt = file.data.meta?.description || undefined\n\n    if (mdastTree) {\n      visit(mdastTree, (node, index, parent) => {\n        if (node.type === \"yaml\") {\n          metadata.frontMatter = jsYaml.load(node.value) as Record<\n            str
318ing,\n            any\n          >\n        }\n      })\n    }\n    if (hastTree) {\n      visit(hastTree, (node, index, parent) => {\n        if (node.type === \"element\") {\n          if (\n            node.tagName === \"img\" &&\n            typeof node.properties.src === \"string\"\n          ) {\n            metadata.images.push(node.properties.src)\n          }\n          if (node.tagName === \"audio\") {\n            if (typeof node.properties.cover === \"string\") {\n              metadata.images.push(node.properties.cover)\n            }\n            if (!metadata.audio && typeof node.properties.src === \"string\") {\n              metadata.audio = node.properties.src\n            }\n          }\n        }\n      })\n    }\n\n    return metadata\n  },\n}\n```\n\n这样我们就优雅地从原始 Markdown 文档开始,获得了我们需要的各种格式的输出\n\n除此之外,我们还能利用解析出的 unified 语法树来编写一个可以左右同步滚动和实时预览的 Markdown 编辑器,可以参考 xLog 的双栏 Markdown 编辑器([代码](https://github.com/Crossbell-Box/xLog/blob/dev/src/components/dashboard/DualColumnEditor.tsx)),有机会我们下次再聊"},{"slug":"2023","title":"2023 平稳过渡","tags":["年终总结"],"body":"import { Tweet } from \"astro-embed\";\n\n```\n</2023>\n<2024>\n```\n\n发小觉得今年经历了巨大的变化,从苏格兰搬到新加坡,从未婚到已婚,从一家两口变成了一家三口,但我觉得都在预料之中,所以感觉还算很平稳\n\n身边的物品最能反映一个人的状态,所以还是跟 2022 一样从年度最佳开始\n\n## 🏆 年度最佳\n\n### 🍿 影视\n\n看过的 28 部动漫和 12 部剧集和 8 部电影:https://movie.douban.com/people/62759792/collect?mode=list\n\n而去年是 19 部动漫和 18 部剧集和 6 部电影,二次元含量显著上升了\n\n**DIY 年度番剧: [《鬼灭之刃 锻刀村篇》](https://movie.douban.com/subject/35769236/)**\n\n![image](./attachments/QmeALWF4gYssxhgPQTpoueFfJve3picwgciJkuqCgwfK3v.png)\n\n
318<script\n  async\n  src=\"https://platform.twitter.com/widgets.js\"\n  charset=\"utf-8\"\n><\/script>\n\n<div class=\"flex gap-2\">\n  <Tweet id=\"https://twitter.com/DIYgod/status/1645271426318979074\" />\n  <Tweet id=\"https://twitter.com/DIYgod/status/1650844643997646852\" />\n</div>\n<div class=\"flex gap-2\">\n  <Tweet id=\"https://twitter.com/DIYgod/status/1653023791759458307\" />\n  <Tweet id=\"https://twitter.com/DIYgod/status/1655603106464387079\" />\n</div>\n\n<Tweet id=\"https://twitter.com/DIYgod/status/1670792856720535554\" />\n\n尽管有数集节奏过缓,然而该剧的燃点皆燃,泪点亦催人泪目,尤以最后以为会是虐人的剧情却华丽逆转为甜蜜结局,令人心潮澎湃,难以自抑\n\n去年最佳是《鬼灭之刃 游郭篇》,今年是《鬼灭之刃 锻刀村篇》,已经可以预料到了明年是《鬼灭之刃 柱训练篇》,希望可以保持下去\n\n除此之外还有《天国大魔境》、《间谍过家家》、《【我推的孩子】》(第一集)、《为美好的世界献上爆焰!》也非常喜欢\n\n**DIY 年度剧集: [《最后生还者 第一季》](https://movie.douban.com/subject/25848328/)**\n\n![image](./attachments/QmWhP9Apd4ZmSbCBAANw7eYgUinidFUXJRTrA6qBVTXbBk.png)\n\n非常还原游戏,又胜于游戏,主角也非常契合角色,完美的一季,HBO 太强了\n\n### 📚 图书\n\n![album_temp_WeRead_2023_Year_In_Review_11704021416](./attachments/QmYsyp1GPc99vb2fFzAp8SsrNURMfuZmWL7GuFbLjLL9ZM.png)\n\n今年看过的 22 本书:\n\n- 《被讨厌的勇气》\n- 《长安的荔枝》\n- 《那些古怪又让人忧心的问题》\n- 《上帝掷骰子吗》\n- 《人类灭绝》\n- 《来自新世界》 (两本)\n- 《莱博维茨的赞歌》\n- 《赡养人类》\n- 《朝闻道》\n- 《埃隆·马斯克传》\n- 《巨人的陨落》(三本)\n- 《世界的凛冬》(三本)\n- 《翦商》(在读)\n- 《自私的基因》(在读)\n- 《一想到还有95%的问题留给人类,我就放心了》(在读)\n- 《猫咪家庭医学大百科》(在读)\n- 《未来简史》(在读)\n\n去年是 9 本,没想到今年不知不觉看了这么多,大部分是旅游和 Boox Leaf 3 的功劳\n\n**DIY 年度图书:[《人类灭绝》](https://book.douban.com/subject/36136689)**\n\n![image](./attachments/QmNXKYPnHEebCHBB5evhthmCrwchPy4nWGJiuYydSQBvq3.png)\n\n差点被奇怪的标题和封面错过,是我看过最悬疑、血腥、脑洞的一本书,作者从三条看似不相关的线分别展开,最后再完美融合,揭露一个最大的阴谋\n\n如果有一天智人不再是地球最聪明的物种,智人一定会毫不犹豫暴露出残忍丛林天性,不一定是因为书里假设的超人类新物种的出现,AI 的技术爆炸也许会让这一天马上到来\n\n非常期待有一天被拍成电视剧\n\n排名第二的是 [《上帝掷骰子吗》](https://book.douban.com/subject/1467022)\n\n读到了很多难以置信的物理知识和猜想,比如空间和时间无法无限分割下去,它们不是连续的;所有观测者死掉的世界都没意义,所以观测者只会一直活下来,无法自杀,无法死亡,所有人都会量子永生;世界是不确定的,世界的底色不是因果律而是概率,上帝是掷骰子的。简直比科幻还要魔幻\n\n排名第三的是[《巨人的陨落》](https://book.douban.com/subject/26698660/)\n\n世纪三部曲中的第一部,是那种开头比较难读下去但是一旦投入进去就无法自拔的书,学到了很多欧洲历史看到了时代变迁\n\n### 🕹️ 好物\n\n**DIY 年度好物: [Boox Leaf 3](https://m.tb.cn/h.5oipXLN?tk=C5hFW6ikj5X)**\n\n![image](./attachments/QmVSM7UeUtUmpXXg7SZjUsLFiWcPsz5kVRKBsTTQ6Anpwf.png)\n\n第一次用电纸书,续航足够长,刷新速度也很快,内置墨水屏版微信读书,让我多看了很多书,缺点就是长时间拿着有点硌小拇指,还好买了 Randy [推荐](https://twitter.com/randyloop/status/1723942659331596587)的手机气囊支架解决了\n\n其他还有一些值得推荐的小东西\n\n[Followcat 猫咪项圈](https://m.tb.cn/h.5MGDbVa?tk=lfvlW6iqb8F)\n\n![image](./attachments/QmQKM6d8oXdMKH5C4eHcHKb5B3KhmADPH4o3hg1eiwLFfc.png)\n\n可以配套一个 [AirTag 壳](https://m.tb.cn/h.5oiFokQ?tk=3WAnW6iqHNQ)装入 AirTag 来定位猫咪,不仅可以预防出门跑丢,在家里不知道藏在哪里的时候也更好找了\n\n博士眼镜\n\n![IMG_5716](./attachments/QmXfP5ZUCGCYYvNYPjccKy3vjgW6qLcy2zUqKGMWBATvxs.jpeg)\n\n线下配眼镜要几千块,一直让我觉得眼镜是个很珍贵的物品,平时需要小心翼翼地保护,但发现差不多的蔡司镜片加镜框线上å
318ªè¦ 200 多,差价很夸张,实际使用也感觉不出什么区别\n\n[索尼 ZV1 M2](https://m.tb.cn/h.5oixsbm?tk=T3sGW6isGfY) [Twitter](https://twitter.com/DIYgod/status/1705977747498217811)\n\n![image](./attachments/QmRh8zZjCG1LMoM4w8m1AHmvA3vtoHoXtpumecKjJxscE4.png)\n\n从第一代 ZV1 换到了第二代,虽然画质没什么升级,但解决了很多痛点,使用体验好了非常多,包括人类可以使用的新版菜单、更适合 vlog 的 18mm 焦距、内置指向性麦克风、视频拍照切换实体按键、USB-C 等\n\n### 👩🏻‍💻 应用\n\n**DIY 年度应用:Arc**\n\n![image](./attachments/QmWMoFbA7tfMa2E3D3wZN5kaANVaZC59aMj9cNnpRMYp8G.png)\n\n竖向标签栏、工作区用了就回不去,而且并不是简单地把标签栏竖过来,很多交互细节还是挺用心的\n\n另外分享一些自己在使用的喜欢的应用\n\n- 邮件客户端:Mimestream\n- 浏览器:Arc\n- 命令行:Warp\n- Docker 管理:OrbStack\n- 时间追踪:Toggl Track\n- 笔记:Obsidian\n- RSS 阅读:RSSHub、Reeder、Miniflux、RSS to Telegram Bot、RSSHub Radar\n- 待办事项:TickTick\n- 图片管理:Eagle\n- 记账:MoneyWiz\n- 影音:Plex、Alist、AutoBangumi、UnblockNeteaseMusic、Xiaoya\n- 自动化:n8n\n- 网站统计:Umami\n- 加密钱包:OneKey、MetaMask\n- 翻译:Bob、沉浸式翻译\n- 广告拦截:AdGuard Home、AdGuard for Mac\n- 截图:Snip\n- 休息提醒:BreakTimer\n- 足迹:世界迷雾\n- 睡眠记录:Pokemon Sleep\n- 应用管理:Homebrew Cask\n\n### 🎮 游戏\n\n**DIY 年度游戏:《塞尔达传说:王国之泪》**\n\n![image](./attachments/QmfHJKLNcBE355yg4QPCW8fPBgTtfapcSa1BnGs9cBMYU2.png)\n\n今年玩的唯一的游戏\n\n## 🧸 生活\n\n### 🏡 饮食居住\n\n<div class=\"flex gap-2\">\n  <Tweet id=\"https://twitter.com/DIYgod/status/1700259244665356348\" />\n  <Tweet id=\"https://twitter.com/DIYgod/status/1722655633449816289\" />\n</div>\n\n11 月从贫瘠的苏格兰来到了生活便利的新加坡,生活质量还是高了一大大大截\n\n- 饮食:跟英国比新加坡简直是天堂,终于有了便宜好吃的外卖和餐厅\n- 住:租房更贵更小了,但多了游泳池和健身房,位置也很好,也算一丝慰藉\n\n### 🛫 旅游\n\n发小去年12月滑雪扭伤了腿,所以前几个月哪都没去\n\n1. 5 月跟 Harry 去 **Lochgelly** 上山徒步 [Twitter](https://twitter.com/DIYgod/status/1654635361333542914)\n\n我和 Harry 背着三大桶水累得在地上爬,发小健步如飞\n\n![image](./attachments/QmZEi8qqKVTVk4CBWiSZJLuUmJuRULtvJ2tfKYNPM5S1WH.png)\n\n![image](./attachments/QmSNZnge6cnQSarn1NLBfmYHAmwazr2FRakPEpk9FvYt8m.png)\n\n![image](./attachments/QmUbHajppmHNTCHsXDXd1t7GLFVHkvcsYVvkp8A7eUjMAR.png)\n\n2. 跟粗粗去了**土耳其** [Twitter](https://x.com/justjustjustcc/status/1662918472567775232) [Twitter](https://x.com/justjustjustcc/status/1663229739195047937) [Twitter](https://x.com/justjustjustcc/status/1663638670224523264) [Twitter](https://x.com/justjustjustcc/status/1664169779433730049) [Twitter](https://x.com/justjustjustcc/status/1664374527906783232) [Twitter](https://x.com/justjustjustcc/status/1665363657885114368) [Twitter](https://x.com/justjustjustcc/status/1666057417283497984)\n\n景区里好玩的很多,山路自驾、游泳、跳海、跳伞、骑马、热气球、晒太阳,大海和热气球风景也超好看,就是价格很感人,景点物价很高,会宰游客,离开景点区域又很贫瘠\n\n带着游泳圈在水里泡了几天,差一点学会了游泳\n\n![image](./attachments/QmdVsr3hV55FBkf1QoZTpfSknHNQWdEaLSmVWcv3CcJKiB.png)\n\n![image](./attachments/QmPAwqwRKhLjbJyuZhu6Ky67yzqVJybA1qCiki587NPXGe.png)\n\n![image](./attachments/QmUxGQVZGPzBET2jqsuQJfAeBgEcWpHqpXxeWFLKXrfBHR.png)\n\n![image](./attachments/QmVA6FhK7SGh8FqJuQvz3yQh1wZr83VTWDtoAVvwauVcyP.png)\n\n![image](./attachments/Qmf9WzubAmztqbcn9zVL1ttHPpkHe4MmGdfx7TprGJcwbH.png)\n\n![image](./attachments/QmNUpvMSrADyktywAysqk93xrd4BV3GC7QkyFuLdKNTiUb.png)\n\n![image](./attachments/QmSZ6L8eUBUK1CNXGAVpgv9jFVUcgeTifbJNBELu6wsSk1.png)\n\n3. 8 月去了**伦敦、剑桥、利兹、约克** [Twitter](https://twitter.com/DIYgod/status/1689040150754467840) [Twitter](https://twitter.com/DIYgod/status/1690727624836829184) [Twitter](https://x.com/justjustjustcc/status/1686787558930366479) [Twitter](https://x.com/justjustjustcc/status/1689427212842274817) [Twitter](https://x.com/justjustjustcc/status/1690731524453208064) [Twitter](https://x.com/justjustjustcc/status/1686787558930366479)\n\n带发小妈妈在英国到处玩\n\n看悲惨世界话剧 Do You Hear the People Sing [Twitter](https://twitter.com/DIYgod/status/1689040150754467840)\n\n![image](./attachments/QmeGS9NfKFdFFRHM9YLiW9k2fEKi2h8H7sAizfuAHSjRiE.png)\n\n唐顿庄园里面 
318Cosplay [Twitter](https://twitter.com/DIYgod/status/1690727624836829184)\n\n![image](./attachments/QmNvVvsdf6fmwxX11QM26yYvLVMm8tSjvbVUxdxUgiM4fG.png)\n\n4. 被 Harry 带着逛了**爱丁堡**神奇的化石店和外科手术博物馆\n\n外科手术博物馆展示了泡在福尔马林中成堆的尸体和各个部位肢体,发小看得津津有味\n\n<div class=\"flex gap-2\">\n  <Tweet id=\"https://twitter.com/justjustjustcc/status/1693011714755711117\" />\n  <Tweet id=\"https://twitter.com/DIYgod/status/1693055863567634692\" />\n</div>\n\n跟 Harry 在爱丁堡海边放火烤棉花糖 [Twitter](https://twitter.com/DIYgod/status/1693049066572128512) [Twitter](https://x.com/justjustjustcc/status/1693011714755711117)\n\n烤棉花糖是外面脆脆的里面软绵绵的很奇妙,Harry 做的酥肉也超级好吃\n\n![image](./attachments/QmX53k43LMKcYJ8LPiJBvNoVsEDYqs2pNuprVyJqVbHxkp.png)\n\n5. 9 月去了**法国、德国、奥地利、匈牙利、捷克**\n\n该玩的都玩了但时间很赶,走马观花\n\n<div class=\"flex gap-2\">\n  <Tweet id=\"https://twitter.com/justjustjustcc/status/1697289338545910061\" />\n  <Tweet id=\"https://twitter.com/justjustjustcc/status/1697944978784231460\" />\n</div>\n<div class=\"flex gap-2\">\n  <Tweet id=\"https://twitter.com/justjustjustcc/status/1699342897185796415\" />\n  <Tweet id=\"https://twitter.com/justjustjustcc/status/1699439673108488398\" />\n</div>\n\n6. 10 月去了**成都、重庆、郑州、乌鲁木齐、上海**\n\n在成都见了[Tyzual](https://twitter.com/TyzuaL) 和 [七夏浅笑](https://www.julydate.com/),去看了大熊猫,在重庆大吃特吃,在乌鲁木齐吃羊肉配皮芽子\n\n成都大熊猫基地\n\n![image](./attachments/QmaWBjs85ZHj5RcE832pU16KGmQJfjgCPRtVCoLqvNZHua.png)\n\n乌鲁木齐的大草原\n\n![image](./attachments/QmW933bQZaUwaqoucF4vfKtG6Pbny2S8crpyQiS11uCyCh.png)\n\n7. 11 月去了**香港**\n\n香港金融科技周见到了很多同事,涨了很多见识,ä¹
318Ÿæ˜¯æˆç«‹äº†ä¸¤å¹´å¤šçš„公司的联合创始人们第一次团聚\n\n![IMG_3450_副本](./attachments/QmadRbsnjhKVi87ek7Ej9s9JbqWkp4JTuRxT1ociZafDp2.png)\n\n### 🤼‍♀️ 社交\n\n今年不但去了很多地方还见了很多朋友\n\n[Harry](https://twitter.com/harrywang9917)、[粗不粗](https://twitter.com/isCuBuCu)、[Tyzual](https://twitter.com/TyzuaL)、[七夏浅笑](https://www.julydate.com/)、[花生](https://pea3nut.info/)、[ch](https://www.chen9.info/)、[Tony](https://github.com/TonyRL)、[Bruce](https://twitter.com/brucexu_eth)、Anni、Atlas、birdring、Dmoo、Jeff、Joshua、Kate、Maggie、Usagi、Yingzi、birdring、yingzi,大部分是同事,都是远程工作见一面着实不容易\n\n### 🐱 家庭\n\n回老家结婚了,过程很累,但看到发小穿上婚纱打扮一番一切都值了 [Twitter](https://twitter.com/DIYgod/status/1709044839638331768)\n\n![4803c6bf4efd14f8a6085d8586cc3aff](./attachments/QmZiK4aBRbHprYYciPqzndjTmuGTqM4tLMQeefc5ZbgJEN.jpeg)\n\n![image](./attachments/QmT5wKGNShmh1iweFXM1CkoNejGpffWYJ4hvkXCPwhUsiJ.png)\n\n一回国就跟酸奶团聚了,还一起来了新加坡 [Twitter](https://twitter.com/DIYgod/status/1701847494144196818)\n\n被问的最多的是“分开了两年多,酸奶还认识你么”,虽然我永远无法知道答案,但从黏人程度来看,我倾向于是认识的\n\n![image](./attachments/QmbQkVriFAYiydYMTfpSWKsYc2B8ErTb5o7JKWXn432asP.png)\n\n### 🏊 技能\n\n**游泳**\n\n从小学过几次,大学还上过游泳课,但都没有学会\n\n如上所述,今年在土耳其旅游时候套个游泳圈泡了几天大海,克服了对游泳的恐惧,大概学会了自由泳的姿势但是不会换气\n\n到新加坡之后又在小区的游泳池泡了几周后完全学会了,现在每天都会跟发小去游泳,运动强度足够大又有水冷,已经是我最喜欢的运动了,感觉之前错过了很多乐趣\n\n![IMG_5549 2 Large](./attachments/Qmf5dgVYhsftEEDMkhGRGqydVVb3Dme682KTMFpGBczCfT.jpeg)\n\n**播客**\n\n<Tweet id=\"https://twitter.com/DIYgod/status/1656211483796045824\" />\n\n为了宣传 xLog,接受了 Web Worker 的邀请录了人生第一次播客,主播辛宝、刘威、小白菜都很专业,过程意外地非常顺利,也没有任何冷场\n\n但是作为一个资深社恐,虽然第一次很顺利,应该也很难鼓起勇气进行下一次了\n\n**打麻将和打掼蛋**\n\n跟着发小各去了一次打麻将和打掼蛋,学会了这两种游戏,但是要说话所以都没有第二次了\n\n### 🌌 印象深刻的日常\n\n过生日发小精心设计的 DIY 诱捕器\n\n<Tweet id=\"https://twitter.com/DIYgod/status/1666957700360486912\" />\n\n过生日 st 送的黑哥哥祝福\n\n<Tweet id=\"https://twitter.com/DIYgod/status/1667124433641779200\" />\n\n在发小学校穿苏格兰裙拍婚纱照\n\n<Tweet id=\"https://twitter.com/DIYgod/status/1690049704791310336\" />\n\n在格拉斯哥参加了发小的毕业典礼\n\n<Tweet id=\"https://twitter.com/DIYgod/status/1732502102868377882\" />\n\n在新加坡过圣诞节\n\n<Tweet id=\"https://twitter.com/DIYgod/status/1738995099336589596\" />\n\n在新加坡跨年看烟花表演,好像还是第一次看这么盛大的烟花表演,之前看过最大的是迪士尼\n\n<Tweet id=\"https://twitter.com/DIYgod/status/1741534082209923239\" />\n\n还有陪发小第一次去看演唱会,第一次去抓娃娃\n\n### 🪄 生活管理\n\n跟去年差不多,主要还是在使用这一套[基于 Obsidian 的生活记录系统](https://diygod.cc/obsidian),现在日记是这样的结构\n\n当天发生的事情、正在进行中的事项、日程表、富兰克林美德表\n\n![image](./attachments/QmTL329Xbbbe87rW1bnhkgSVs4ssgDKpWdW8fPcSfDPFEk.png)\n\n再补充上用 TickTick 的 Habit 来记录每天每周各个 OKR 目标完成得怎么样,用 Toggl Track 记录做各个事情的时间,比之前的在 Obsidian 里 all in one 方便很多\n\n![image](./attachments/QmU45dQx4oYxPMKcEYqybyBG323uZf7hbCuJD3SS5tQCBm.png)\n\n## 🌿 输出\n\n### 👩🏻‍💻 代ç 
318\n\nContributions 快赶上 2019 年巅峰时期了\n\n![contributions](./attachments/QmQfQX6StwMBjpgNrYY8teduUwMYvLfYWdhMiz5LitJHbx.png)\n\n又是没有新项目的一年,今年中前期还是以 xLog 为主,后期也做了一些 RSSHub 和 RSSHub Radar 的工作,和为公司 2024 年的一些转变做准备\n\nxLog 开发得热火朝天([相关 Twitter 列表](<https://twitter.com/search?q=%22xLog%22%20(from:DIYgod)%20until:2023-12-31%20-filter:replies&src=typed_query&f=live>)),成功举办了 10000 刀的创作者激励活动,吸引了大批优秀的创作者,最多时候还每周有十几个社区开发者来贡献代码一起完善 xLog,完成了数不清的 Feature。现在有 3k 多创作者在上面发布了 26k 多高质量内容\n\nRSSHub 重构了文档,让它更容易被维护,改造成了以英文为优先语言;用更现代化的架构 Plasmo 完全重写了 RSSHub Radar,变得更好看更稳定更容易维护,还能自动发布到各大应用商店。现在 RSSHub 官方实例每月承载三亿多次请求,docker 有一千五百多万次下载,RSSHub Radar 有差不多 9 万周活用户\n\n### 📙 文字\n\n这一年文字也非常高产\n\n认真写了 9 篇博客\n\n- [2022 年终总结](https://diygod.cc/2022)\n- [你你你你要跳舞吗?](https://diygod.cc/do-you-want-to-dance)\n- [令我痛心的三部反乌托邦动漫](https://diygod.cc/dystopian-anime)\n- [我得了软件更新强迫症](https://diygod.cc/software-update)\n- [4 月新番太好看了!吹爆!](https://diygod.cc/anime-2023-april)\n- [对 Newsletter 说不](https://diygod.cc/say-no-to-newsletter)\n- [在博客融入一个跨平台作品集](https://diygod.cc/xlog-portfolios)\n- [优雅使用 Cloudflare WARP 应对 RSSHub 反爬难题](https://diygod.cc/rsshub-with-warp)\n- [轻松创建一万个 Twitter 账号](
318https://diygod.cc/10k-twitter-accounts)\n\n水了 243 条 Twitter\n\n[列表](<https://twitter.com/search?f=live&q=(from:DIYgod)%20until:2024-01-01%20since:2023-01-01%20-filter:replies&src=typed_query>)\n\n### 🎥 影音\n\n今年在 B 站发布了两个 Vlog,旅游积攒了好多素材,至少还有 6 个视频还没剪,很惭愧\n\n《女友浴室沉思录,非正常录音》\n\nhttps://www.bilibili.com/video/BV1yz4y147Ht/\n\n《英国旅游VLOG | 爱丁堡圣诞节》\n\nhttps://www.bilibili.com/video/BV1DH4y1m7oJ/\n\n录了一个播客《和 xlog.app 的作者 DIYgod 聊区块链和博客平台、前端学习和生活感悟》\n\nhttps://www.xiaoyuzhoufm.com/episode/645a76f67d934b85051081c8\n\n## 🎊 2024\n\n### ⭐️ OKR\n\n- O1: In excellent health\n  - KR1: Body control, body weight 70kg and body fat 17%\n  - KR2: Early to bed and early to rise, 12:00-8:00\n  - KR3: Healthy Eating, light and less, increase the proportion of white meat and reduce the sugar\n  - KR4: More exercise, at least 3 times per week\n\n- O2: Highly productive like a sow\n  - KR1: Blog, at least 1 blog per month\n  - KR2: Vlog, publish the 6 vlogs from last year\n\n- O3: Knowledge overflows my brain\n  - KR1: Reading, at least 7 hours per week\n  - KR2: Professional learning, at least 5 hours per week\n  - KR3: English learning, at least 5 hours per week\n\n- O4: I am Franklin\n  - KR1: Guarantee 1 virtue per week\n  - KR2: Record virtue status daily\n\n- O5: Run like clockwork\n  - KR1: Write bullet journal daily\n  - KR2: Bookkeep weekly and monthly\n  - KR3: Do things on a daily schedule\n\n- O6: Writing code is like writing the poem of life\n  - KR1: Focused work for at least 7 hours per day\n  - KR2: Actively maintain and contribute to open source projects for at least 3 hours per week\n  - KR3: Develop a new RSS reader using Tauri, with comprehensive support for RSSHub and AI\n\n- O7: Combat inflation\n  - KR1: Achieve a 10% annual return through simple and healthy financial management strategies"},{"slug":"10k-twitter-accounts","title":"轻松创建一万个 Twitter 账号","tags":[],"body":"> Information freedom does not naturally evolve, it degrades.\n> —— [Open Information Manifesto](https://openinformation.eth.limo)\n\nTwitter 在 8 月决定了全面限制公开访问和 API 接口,导致第三方集成均无法再正常工作。开放用户数据被绑架成私人敛财工具,曾经的 Open Web 标杆 Twitter 竟沦落到这种境地,数字奴隶制在最不应该的地方出现,令人唏嘘。这也致使许多用户流向 Fediverse,但社交关系和习惯一旦形成,要让其迅速改变并不易,更多人还是选择了忍受,Musk 也是看穿了这一点才有恃无恐\n\n![](./attachments/QmS29Jh8h2asXHqX1JC8xdasAgF3NbxhDW4P2czB3R58Z8.png)\n![](./attachments/QmQJ81nPmJXxAJNDnBfU8381H3a2wMxTF5ZL72Bg9y3uUk.png)\n![](./attachments/QmUZNLeRLZpQarvLieMSyDbNMZsoPWij4nhHQbYjjNs1F4.png)\n\n然而,我们也不能武断地说 Twitter 封闭,毕竟它仍然开放了一个起步价为**每月 4 万美元**,上限不设的企业 API\n\n![](./attachments/Qmbs7PNBLHJ8EK3fkEHsPtP89AbpnS6iMw8Eg2aW7Jc1DT.png)\n\n什么?你说用不起?\n\n那么你可以像我一样,通过创建一万个账号以绕开封锁\n\n尽管 Twitter 限制了所有公开访问,但我们发现新下载的 Twitter 移动客户端仍可以正常查看用户动态。这为我们提供了潜在的利用方法,通过抓包,我们可以看到客户端是通过请求一系列特殊接口来创建一个权限较低、频率限制严格的临时账号。我们可以用这个账号获取我们需要的大部分数据。然而,这种账号对请求频率的限制非常严格,因此需要大量的这样的账号才能满足基本的使用需求。同时,每个 IP 在一段时间内只能获取一个临时账号,因此我们也需要大量的 IP 代理\n\n具体拆包和抓包过程可以参考 BANKA 的[《怎么爬 Twitter(Android)》](https://blog.nest.moe/posts/how-to-crawl-twitter-with-android)。站在 BANKA 肩膀上,我们可以写出一个这样的注册脚本(来自 [Nitter - Guest Account Branch Deployment](https://github.com/zedeus/nitter/wiki/Guest-Account-Branch-Deployment)):\n\n```sh\n#!/bin/bash\n\nguest_token=$(curl -s -XPOST https://api.twitter.com/1.1/guest/activate.json -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' | jq -r '.guest_token')\n\nflow_token=$(curl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json?flow_name=welcome' \\\n          -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \\\n          -H 'Content-Type: application/json' \\\n          -H \"User-Agent: TwitterAndroid/10.10.0\" \\\n          -H \"X-Guest-Token: ${guest_token}\" \\\n          -d '{\"flow_token\":null,\"input_flow_data\":{\"flow_context\":{\"start_location\":{\"location\":\"splash_screen\"}}}}' | jq -r .flow_token)\n\ncurl -s -XPOST 'https://api.twitter.com/1.1/onboarding/task.json' \\\n          -H 'Authorization: Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F' \\\n          -H 'Content-Type: application/json' \\\n          -H \"User-Agent: TwitterAndroid/10.10.0\" \\\n          -H \"X-Guest-Token: ${guest_token}\" \\\n          -d \"{\\\"flow_token\\\":\\\"${flow_token}\\\",\\\"subtask_inputs\\\":[{\\\"open_link\\\":{\\\"link\\\":\\\"next_link\\\"},\\\"subtask_id\\\":\\\"NextTaskOpenLink\\\"}]}\" | jq -c -r '.subtasks[0]|if(.open_account) then {oauth_token: .open_account.oauth_token, oauth_token_secret: .open_account.oauth_token_secret} else empty end'\n```\n\n以及这样的批量注册脚本(来自我自己):\n\n```js\nconst got = require(\"got\");\nconst { HttpsProxyAgent } = require(\"https-proxy-agent\");\nconst fs = require(\"fs\");\nconst path = require(\"path\");\n\nconst concurrency = 5; // Please do not set it too large to avoid Twitter discovering our little secret\nconst proxyUrl = \"\"; // Add your proxy here\n\nconst baseURL = \"https://api.twitter.com/1.1/\";\nconst headers = {\n  Authorization:\n    \"Bearer AAAAAAAAAAAAAAAAAAAAAFXzAwAAAAAAMHCxpeSDG1gLNLghVe8d74hl6k4%3DRUMF4xAQLsbeBhTSRrCiQpJtxoGWeyHrDb5te2jpGskWDFW82F\",\n  \"User-Agent\": \"TwitterAndroid/10.10.0\",\n};\n\nconst accounts = [];\n\nfunction generateOne() {\n  // eslint-disable-next-line no-async-promise-executor\n  return new Promise(async (resolve) => {\n    const timeout = setTimeout(() =>
318 {\n      // eslint-disable-next-line no-console\n      console.log(`Failed to generate account, continue... timeout`);\n      resolve();\n    }, 30000);\n\n    const agent = {\n      https: proxyUrl && new HttpsProxyAgent(proxyUrl),\n    };\n\n    try {\n      const response = await got.post(`${baseURL}guest/activate.json`, {\n        headers: {\n          Authorization: headers.Authorization,\n        },\n        agent,\n        timeout: {\n          request: 20000,\n        },\n      });\n      const guestToken = JSON.parse(response.body).guest_token;\n\n      const flowResponse = await got.post(\n        `${baseURL}onboarding/task.json?flow_name=welcome`,\n        {\n          json: {\n            flow_token: null,\n            input_flow_data: {\n              flow_context: {\n                start_location: {\n                  location: \"splash_screen\",\n                },\n              },\n            },\n          },\n          headers: {\n            ...headers,\n            \"X-Guest-Token\": guestToken,\n          },\n          agent,\n          timeout: {\n            request: 20000,\n          },\n        },\n      );\n      const flowToken = JSON.parse(flowResponse.body).flow_token;\n\n      const finalResponse = await got.post(`${baseURL}onboarding/task.json`, {\n        json: {\n          flow_token: flowToken,\n          subtask_inputs: [\n            {\n              open_link: {\n                link: \"next_link\",\n              },\n              subtask_id: \"NextTaskOpenLink\",\n            },\n          ],\n        },\n        headers: {\n          ...headers,\n          \"X-Guest-Token\": guestToken,\n        },\n        agent,\n        timeout: {\n          request: 20000,\n        },\n      });\n\n      const account = JSON.parse(finalResponse.body).subtasks[0].open_account;\n\n      if (account) {\n        accounts.push({\n          t: account.oauth_token,\n          s: account.oauth_token_secret,\n        });\n      } else {\n        // eslint-disable-next-line no-console\n        console.log(`Failed to generate account, continue... no account`);\n      }\n    } catch (error) {\n      // eslint-disable-next-line no-console\n      console.log(`Failed to generate account, continue... ${error}`);\n    }\n\n    clearTimeout(timeout);\n    resolve();\n  });\n}\n\n(async () => {\n  const oldAccounts = fs.readFileSync(path.join(__dirname, \"accounts.txt\"));\n  const tokens = oldAccounts.toString().split(\"\\n\")[0].split(\"=\")[1].split(\",\");\n  const secrets = oldAccounts\n    .toString()\n    .split(\"\\n\")[1]\n    .split(\"=\")[1]\n    .split(\",\");\n  for (let i = 0; i < tokens.length; i++) {\n    accounts.push({\n      t: tokens[i],\n      s: secrets[i],\n    });\n  }\n\n  for (let i = 0; i < 1000; i++) {\n    // eslint-disable-next-line no-console\n    console.log(\n      `Generating accounts ${i * concurrency}-${(i + 1) * concurrency - 1}, total ${accounts.length}`,\n    );\n\n    // eslint-disable-next-line no-await-in-loop\n    await Promise.all(Array.from({ length: concurrency }, () => generateOne()));\n    fs.writeFileSync(\n      path.join(__dirname, \"accounts.txt\"),\n      [\n        `TWITTER_OAUTH_TOKEN=${accounts.map((account) => account.t).join(\",\")}`,\n        `TWITTER_OAUTH_TOKEN_SECRET=${accounts.map((account) => account.s).join(\",\")}`,\n      ].join(\"\\n\"),\n    );\n  }\n})();\n```\n\n这些脚本已放到了 RSSHub 仓库: https://github.com/DIYgod/RSSHub/blob/master/scripts/twitter-token/generate.js\n\n在使用前,你需要填入你购买的 IP 代理服务地址。脚本会自动处理超时、请求等错误,并且以 5 并发来自动获取临时账号,当获取到 1000 个账号后将会停止。需注意并发不要设置得过高,我从观察发现,当 Twitter 发现大量请求时会暂停接口一段时间\n\n我购买了 5 家代理服务以进行测试,感觉效果相差无几,选择一个最便宜的服务就可以。通常,最低价的 1G 套餐就足够获取大约几万到十几万个账号了。我目前找到的最便宜的服务是 [proxy-cheap](https://app.proxy-cheap.com/r/4plbks),如果你有更好的选择请告知我\n\n这种方法已经在 Nitter 上稳定运行了一段æ—
318¶é—´ï¼ŒçŽ°åœ¨ä¹Ÿå·²å®žè£…åˆ°äº† RSSHub 及其官方示例上,我们可以宣布与邪恶 Twitter 奴隶主的战争已经阶段性胜利"},{"slug":"uk-travel-edinburgh","title":"英国旅游VLOG | 爱丁堡圣诞节","tags":["vlog"],"body":"2021å¹´12月拍摄"},{"slug":"rsshub-with-warp","title":"优雅使用 Cloudflare WARP 应对  RSSHub 反爬难题","tags":[],"body":"🕊️ 本文送给更开放的互联网\n\n---\n\n起因是看到 @geekbb 介绍 Warp 的[推文](https://twitter.com/geekbb/status/1663443373544583168)。尽管 Warp 已经发布了很长时间,就保护 IP 隐私而言,它并没有 iCloud Private Relay 好用,我也没有魔法上网的需求。但是我突然意识到,我还是有隐藏 IP 的需求。\n\n在开发 RSSHub 的几年中,我发现提供公共 API 的站点非常少,许多站点还会采取严格的反爬控制来限制其平台内容的获取。有些站点会屏蔽同一 IP 发出过多请求,而还有一些站点则会全面屏蔽常见云服务器厂商的 IP 地址。因此,仅仅为了获取最新几条内容更新却变得非常困难。\n\n![lord-of-the-rings-my-precious](./attachments/bafybeiaqqbchfi5zs4kfxjnuhbktmyx3v3jz5g6uodgeaql2d5kf54e4tu.gif)\n\n这种情况需要使用代理,但是专门的爬虫代理通常价格昂贵,性价比极低,如果 Cloudflare WARP 的无限流量和丰富的 IP 资源能被 RSSHub 利用就太棒了。RSSHub 已经支持了通用的代理协议,只要能将 WARP 包装为通用的 proxy 就可以。\n\n![image](./attachments/bafybeidnorcybhjb7lapu5y6zjtnzzffsyrdlfm3fhzcnhtr37u4e677he.png)\n\n虽然无法直接在命令行环境中方便地使用官方客户端,但这么容易想到的点子肯定已经被别人实现过了。我在 GitHub 上找到了一个封装的 Docker。\n\nhttps://github.com/Mon-ius/Docker-Warp-Socks\n\n然后只需要在 RSSHub 的 `docker-compose.yml` 中再添加这样一个 service 来启用代理服务\n\n```yml\nwarp-socks:\n  image: monius/docker-warp-socks:latest\n  privileged: true\n  volumes:\n    - /lib/modules:/lib/modules\n  cap_add:\n    - NET_ADMIN\n    - SYS_ADMIN\n  sysctls:\n    net.ipv6.conf.all.disable_ipv6: 0\n    net.ipv4.conf.all.src_valid_mark: 1\n  healthcheck:\n    test: [\"CMD\", \"curl\", \"-f\", \"https://www.cloudflare.com/cdn-cgi/trace\"]\n    interval: 30s\n    timeout: 10s\n    retries: 5\n```\n\n最后给 RSSHub 加一个 PROXY_URI 环境变量来使用代理\n\n```yml\nPROXY_URI: \"socks5h://warp-socks:9091\"\n```\n\n我选取了一个我经常使用的 hotukdeals 路由(英国版的什么值得买)进行测试。该站点会屏蔽所有 DigitalOcean 的 IP,因此一直处于 403 状态。\n\n![image](./attachments/bafkreihjpcghhfk4nghyczjb2z56zfzf6ompyq3msr7tsdqjx4tlipsxri.png)\n\n加上 WARP 后可顺利访问\n\n![image](./attachments/bafybeiazr6b66xmkpkw5w7ws57nvnmpj2tjx2genfyqq6ibkejafsrpsz4.png)\n\n此外,我发现每次重启 WARP 时,都会输出新的 IP。尽管我没有时间验证,但我感觉 IP 应该会经常自动更改,这对解决反爬是一个好消息。\n\n![image](./attachments/bafkreihsp2oel6zxmvlnkqvezvlwjltnj65iymnodxkqhrvhw6bsftb4pq.png)\n\n还可以进一步自定义 WireGuard 的配置,包括使用付费版 WARP+ 和自定义 endpoint,以获取可能更好的结果。\n\n生成 WireGuard 配置文件可以使用\n\nhttps://github.com/ViRb3/wgcf\n\n刷 WARP+ 流量和筛选 endpoint 可以使用\n\nhttps://github.com/fscarmen/warp\n\n有说法是 WARP+ 的速度并无明显差异([《WARP、WARP+速度对比,以及WARP速度上限》](https://www.nodeseek.com/post-9449-1)),但是是否影响反爬效果还需要进一步验证。\n\n如果一切顺利,RSSHub官方实例中许多严格反爬的路由应该能重新使用。我将在几天内进行验证并在此更新。\n\n![image](./attachments/bafybeibkqr2di6wp7u5tzllu5cd2zwrnirwxhetyeq63s2xl6fruuail5a.png)"},{"slug":"xlog-portfolios","title":"在博客融入一个跨平台作品集","tags":[],"body":"## 长久以来\n\n我一直将个人博客视为一个理想的展示个人 IP 的“个人网站”,而不仅仅是发布文章的平台。我曾在 2014 年初学编程时使用 WordPress 建站 [《世界,你好!》](https://diygod.cc/1);入了前端坑后,在 2017 年我转向了 Hexo [《做了一点微小的改动》](https://diygod.cc/new-blog);Web3 飞升后 2022 年我换成了 xLog [《第一个开源链上博客系统 xLog》](https://diygod.cc/xlog)。然而,无论我使用什么博客系统,一直都存在一个问题,那就是如何优雅地汇集和展示我在其他平台发布的作品,最好还能直接显示外站的数据。我之前通常以文章形式发布作品,并在文章中附上链接ï¼
318Œç„¶è€Œè¿™æ ·åšæ˜¾ç„¶ä¸å¤Ÿä¼˜é›…,读者还需要额外点击链接进行跳转。\n\n## 灵感降临\n\n我在学习达芬奇剪辑时,发现了影视飓风的[网站](https://www.ysjf.com/video-list),它通过外链方式列出了他们在 B 站发布的视频,其中包括标题、封面图、发布时间、播放量等信息。这个发现给了我启发,我完全可以在 xLog 上制作一个装载了我在各个平台作品的作品集,这里面可以有我发布在 B 站的视频、我在 GitHub 上维护的仓库、我参与的小宇宙播客甚至是我在 pixiv 上创作的画作。这样,当人们访问我的博客时,将不只是看到文章,而是会看到更丰富多元的我,这让我的博客更接近一个真正意义上的“个人网站”。\n\n## 下手\n\n想法萌发后,实现就简单了。\n\n1. 对 xLog 后台进行了优化和清晰的分类:文章、页面、作品集,以消除类型增多后可能带来的用户困扰。\n\n![image](./attachments/bafkreibk6hpyyrfv2hna5ljispi3iyocqp4mmgox2vhbrlchzf4loeptbu.png)\n\n2. 设计了一个全新的编辑页,不同于文章和页面,这里只保留封面、标题、摘要、发布时间,并新增外部链接字段。\n\n![image](./attachments/bafybeib3styadsi5pwwq2dir72nnitfhs5d6jjhpgsd5rq5sh33yqt5fzq.png)\n\n3. 实现了作品信息的自动填充功能,减轻了手动输入的负担。这是通过获取链接的 Open Graph 信息实现的,涉及到的字段包括 `og:image` `og:title` `og:description` `og:date`\n\n![image](./attachments/bafkreig7qnhsurgglcmrvpb5rt5adm5zhuhrrdxjomvyoljzkfzu356rt4.png)\n\n4. 把作品展示在首页和独立的[作品集页](https://diygod.cc/portfolios)\n\n![image](./attachments/bafkreigacsag7hyhkkd7m3djpdeqwpfu4kaplmtnbzkhclk6zhbzmrmh24.png)\n\n5. 数据的获取和展示,对于“偷数据”经验丰富的 RSSHub 作者来说,这是得心应手的一环,首先针对 bilibili、小宇宙、GitHub、pixiv、Twitter 这几个平台进行了[抓取](https://github.com/Crossbell-Box/xLog/blob/7634df9359dafbf9e9b28b8ad3bc8b214f4e380f/src/app/api/portfolio-stats/route.ts#L32),获取到播放量和评论数并在 xLog 的卡片上进行展示,同时考虑到源站可能的压力和反爬,我特别设置了足够长的数据缓存。\n\n![image](./attachments/bafybeicsbzoo6qjuimt7ih5g5lf7d5xpwxosuqytvie2ezfujr7szaboze.png)\n\n如今,这个简单实用的小功能已经落地实现了,可以看看我的[作品集页](https://diygod.cc/portfolios),你是否也想要尝试在 xLog 建立属于自己的个人作品集呢?"},{"slug":"gf-bathroom","title":"女友浴室沉思录,非正常录音","tags":[],"body":"偷录的女友洗澡哼哼,太可爱了\n\n你也觉得可爱的话请去推特夸夸 justjustjustcc\n\n求个一键三连"},{"slug":"say-no-to-newsletter","title":"对 Newsletter 说不","tags":[],"body":"![Image](./attachments/bafkreibegqpbw5t22dgwoxgw2lm6vz4ha2fhrt4g2zruvt3yhz6eatmeya.jpeg)\n\n衰退无处不在,这是很正常的现象。人们自然而然地更倾向于短平快的消费方式。然而,我一直无法忍受的一种奇怪趋势是,在一些地方,人们将 RSS 抛弃,转而使用 Newsletter。\n\n本质上,电子邮件是一种私密的双向通信机制,而 RSS 是一种开放的单向通信机制。使用电子邮件进行私密的更新和文章推送是没有意义的,RSS 是更自然的选择。强行将这些功能应用于电子邮件可能会导致许多问题。这些问题让我觉得 Newsletter 就像一个没有能力但却拼命想证明自己的暴君,无法很好达到发布者期望的效果,又过分侵犯了用户的选择和效率。\n\n## 五宗罪\n\n### 封闭限制\n\nRSS 是一种开放协议,它允许用户自主订阅和拉取感兴趣的网站的 RSS 源,获取最新的更新和文章,无需他人的许可。用户还可以通过阅读器的个性化设置自由选择所需内容,并且可以使用多种渠道接收通知,甚至可以使用 Telegram Bot 进行订阅。\n\n![image](./attachments/bafybeih6dnrvjyubz3gu6dufoxa5hkqk7aoxa6rpd3ozxmmbyebrbaubc4.png)\n\n而 Newsletter 是由发布者推送到用户私人邮箱的订阅信息,整个过程依赖于平台方,渠道全程封闭。这种封闭极大地限制了用户的选择权,用户被迫在平台的**许可下**,通过**特定渠道**和**特定格式**接收**固定信息**。\n\n### 繁琐低效\n\n相比之下,RSS 更加简洁高效。订阅源可以集中管理,分类、收藏、订阅和取消订阅的过程也非常简单。\n\n![image](./attachments/bafybeielehptzhv6ggv6q
318nea7kkrotagne5t2nnuy2spqqb2ud3db6kkxa.png)\n\n而 Newsletter 则会将各种各样的邮件混合在一起,非常分散且难以管理。你很难知道自己到底订阅了哪些内容,它们什么时候会突然出现。而且,内容格式也是各种各样的,查看和阅读起来非常混乱,所以你也不能将一篇文章进行收藏,更不用说方便的第三方集成了。\n\n### 信息过载\n\nNewsletter 很难对内容进行有效分类和过滤,又与所有正常邮件混合在一起,需要花费精力手动整理。这很容易导致信息过载和垃圾邮件的问题。\n\n而 RSS 可以很方便地进行分类和过滤,对于不重要的内容,你也可以一键全部标记为已读瞬间解脱,完全没有压力。\n\n![image](./attachments/bafybeicenppar3jfyg2l32e2xihg2ehzmfxtb7wsr4cl7sm3qbidthmnou.png)\n\n![image](./attachments/bafkreih7vahngohsuwrxt6yx7a7h2n745uulx3wsqsguz53q5bdj777244.png)\n\n### 更新周期长\n\n对于RSS的更新虽然不算实时,但一般以小时计,类似RSSHub等自建服务,甚至可以做到每分钟更新。相比之下, Newsletter 的更新周期,以天甚至周月计,明显滞后了许多。\n\n### 隐私和安全风险\n\nRSS的开放性体现在它不需要用户提供个人信息,从而确保了更好的隐私性和安全性。然而,Newsletter 至少需要提供一个邮箱地址,这增加了数据泄露或滥用的风险。更有甚者,电子邮件可能包含恶意链接或附件。\n\n## 也有一些优点\n\n尽管我对 Newsletter 的低效和局限性持批评态度,但我也承认它有其优点,它的流行也有一些合理性,特别是在卖方市场的情况下对于一些发布者来说。Newsletter 可以让他们获得更多的控制权和点击率,可以更容易知道有谁订阅了他们的内容,并通过邮件通知更强烈地唤起用户的注意。\n\n然而,站在用户的角度,我必须明确表示,我更偏爱 RSS。我不愿意以放弃自己的选择权和效率来迎合发布者的控制欲。在我看来,获取信息的权力应该掌握在我自己手中,而非其他人或机构。所以,我在这里对 Newsletter 说不。"},{"slug":"anime-2023-april","title":"4 月新番太好看了!吹爆!","tags":[],"body":"<iframe style=\"border-radius:12px\" src=\"https://open.spotify.com/embed/playlist/0gF2xmTxiBKqtuKWsw2iZG?utm_source=generator\" width=\"100%\" height=\"152\" frameBorder=\"0\" allowfullscreen=\"\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" loading=\"lazy\"></iframe>\n\n今年从 1 月就一直没什么好看的作品,到了4月突然爆发,让我非常激动。现在播出过半了,是时候好好说说感受了\n\n以下当然不能囊括 4 月所有的好作品,因为实在太多了,只是说一说符合我口味的几部,按我个人的喜爱程度来排序\n\n以下会包含大量剧透,还没看的小伙伴请酌情观看\n\n## 鬼灭之刃刀匠村篇\n\n刀匠村是为鬼杀队锻造日轮刀的刀匠们居住的地方,位置及其隐蔽且高度保密,这部讲的是刀匠村被上弦之肆·半天狗和上弦之伍·玉壶找到并发动偷袭,正在刀匠村的炭治郎、恋柱·甘露寺蜜璃、霞柱·时透无一郎、不死川玄弥努力保护刀匠们,对抗上弦的故事\n\n上弦之肆·半天狗这个角色非常有趣,本体又小又丑,非常弱小无助又胆小,总感觉像是来送人头的\n\n![image](./attachments/bafybeiehfggre4rmhgv44esa3x5c54xgq22lrs2sfdjxfbuo6zfdibpwfi.png) ![[BeanSub&FZSD&LoliHouse] Kimetsu no Yaiba - 51 [WebRip 1080p HEVC-10bit AAC ASSx2]-0001](./attachments/bafybeietuj3qkd5jwoenjzt4xeosy7dxqp2rmlxh4ap3otziq7aprnwb6m.jpeg) ![image](./attachments/bafybeia5fgvns4sailpdjztn4ad4tujg5iohyjt6oyouqzqsot4nd6coom.png)\n\n但实际上非常扮猪吃老虎,控制的几个鬼(还不知道他们是什么关系)喜、怒、哀、乐、憎,都非常强,压迫感很足,本体防御力也无敌,被大家排着队砍也砍不死\n\n![image](./attachments/bafybeigfpym4at3p3qmzyate5xoouypvbpupi4er3murnilb5lj5ubsnqy.png) ![image](./attachments/bafybeic62acu5hwf3qxxfuzucthzwswvs6a3suyplk4cyioztwmjw3c73q.png)\n\n弥豆子的表现也很亮眼,鬼化弥豆子超帅\n\nhttps://twitter.com/DIYgod/status/1653023791759458307\n\n![image](./attachments/bafybeib7f35c5wz2wlu2vvercudmnre7xzawloeude3nmpi5jhcfeydej4.png)\n\n![image](./attachments/bafybeic4runt4vsjwbb6may6km6bsu7rd7erggkgdcqiisfnvgjmc6i2xe.png)\n\n还有可爱的蜜璃\n\nhttps://twitter.com/DIYgod/status/1655603106464387079\n\n虽然整体节奏还是略显拖沓,但经过游郭篇的洗礼,我本身预期也很低,目前已经è¿
318œè¿œè¶…出了我的预期,文戏比之前明显少了好多,打斗也更加燃爆,看得非常上头\n\n![image](./attachments/bafybeiauh57lb5vt2pg3d5odirbzzmlgt5uhsisrz2kgtry7ht75xvz63u.png)\n\n![image](./attachments/bafybeihynvoqfnco272dw5lckc5neq33mtkbhz7urdpk4wwec6fbtplnhu.png)\n\n再加上我有粉丝加成,荣登我的周指活排名第一名\n\n谢谢飞碟社款待\n\n| 类别     | 评分/10 |\n| -------- | ------- |\n| 剧情     | 7       |\n| 画面     | 10      |\n| 个人加成 | 10      |\n\n## 为美好的世界献上爆焰!\n\n脑子有问题的红魔族第一天才中二病魔法师慧慧的故事,喜欢的东西是爆裂魔法,特技是爆裂魔法,兴趣是爆裂魔法,唯一的真爱也是爆裂魔法\n\nhttps://twitter.com/DIYgod/status/1643718650392608779\n\n慧慧小时候被一位使用爆裂魔法的巨乳魔法师所救而爱上了爆裂魔法\n\n![[Lilith-Raws] Kono Subarashii Sekai ni Bakuen wo! - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]-0008](./attachments/bafkreia2tjbppxq3wf27ku7ytzwtv77fdbpb7wz5vohtsu3t7cx7or2ooe.jpeg)\n\n虽然爆裂魔法极不实用且难以操纵,是出了名的搞笑魔法,“只有学得上级魔法才能独当一面。爆裂魔法之流不过是搞笑魔法罢了”,但慧慧还是不顾嘲笑,为了爱好而独自努力\n\n![[Lilith-Raws] Kono Subarashii Sekai ni Bakuen wo! - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]-0002](./attachments/bafkreifdwsoilenz6g2xujt75g5qmxfb5cr6ngihw7ff7w755i3syw2deq.jpeg) ![[Lilith-Raws] Kono Subarashii Sekai ni Bakuen wo! - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]-0147](./attachments/bafkreifixqofyang5qup7yqrgnnayg6rqknstm5xd6ahzdijlife7z6nbi.jpeg)\n\n最后使用所有技能点数学到了爆裂魔法\n\n> 比黑色还要黑 暗之漆黑\n> 融合著我之真红吧\n> 觉醒的时刻已经到来\n> 坠入无谬之境界\n> 形成无形之扭曲\n> 出现吧!\n> Explosion!\n\n![[Lilith-Raws] Kono Subarashii Sekai ni Bakuen wo! - 05 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]-0055](./attachments/bafkreid4wj22fbwbhnlktle2ocedrtdea2cnamdhcmhtmsbikq432b4b7y.jpeg)\n\nhttps://twitter.com/DIYgod/status/1653819521034080256\n\n之后的外出冒险也很有趣\n\n![[Lilith-Raws] Kono Subarashii Sekai ni Bakuen wo! - 07 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]-0012](./attachments/bafybeiayozbqela7gvrxligsxsk7aipuwz5f26aqbxep7uf2ty2zsf274q.jpeg)\n\n![[Lilith-Raws] Kono Subarashii Sekai ni Bakuen wo! - 08 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]-0021](./attachments/bafybeibjfz26t4ygjzorm2ktl4xoyw4oohtuzcpcgtqc4a2sovebhotivm.jpeg)\n\n之前看《为美好的世界献上祝福!》就被慧慧的中二吸引了,结果在红魔乡发现慧慧的中二只是一个普通水平,印象最深的是魔法学校最重要的一节课是战斗前要摆什么样的中二姿势\n\n![[Lilith-Raws] Kono Subarashii Sekai ni Bakuen wo! - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]-0096](./attachments/bafkreifel7jvdcybkougjzghz5boyrs4v2wqfos7wunrahwkgvrjiy2pme.jpeg) ![[Lilith-Raws] Kono Subarashii Sekai ni Bakuen wo! - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]-0094](./attachments/bafkreife535lqhho5qvfj33kljus3yw267wsh5zybfs6mbvmtnbymeu26y.jpeg) ![[Lilith-Raws] Kono Subarashii Sekai ni Bakuen wo! - 01 [Baha][WEB-DL][1080p][AVC AAC][CHT][MP4]-0190](./attachments/bafybeia6okdapze2hapgshd64nf7pzp5zstoray3qiorlun274yyavchqe.jpeg)\n\n缺点也是有的,作画穷了点,有不少崩坏的地方,有些画面还是挺出戏的,特别是扎堆在作画全都不要钱一样的 4 月新番中显得更惨了(但还算说得过去)(后面还有个说不过去的)\n\n| 类别     | 评分/10 |\n| -------- | ------- |\n| 剧情     | 8       |\n| 画面     | 6       |\n| 个人加成 | 10      |\n\n## 天国大魔境\n\n刚说的精美作画就来了,从第一集就被震撼到了,不要钱一样的作画,末日废土乌托邦剧情,流畅的打戏完美的运镜,轻松愉快加简单的涩涩又不失紧张刺激的氛围把控,就像完美的考试标准答案一样,刚开始还担心开头质量过于高了后面会不会质量下降,但是完全没有!\n\nhttps://twitter.com/DIYgod/status/1643618955406241799\n\n剧情还没有完全揭秘,现在知道的是成为废墟的日本栖息着一种食人的怪物蛭子,人们艰难地生存着,还有一个号称 “天国” 的乌托邦,被安全的围墙覆盖,里面科技发达,被圈养的孩子们生活富足\n\n墙外很危é
318™©\n\n![image](./attachments/bafybeihslgtimmjxifngmevu2hfy46fkh5hh4okfpigavgsun64izwwlyq.png)\n\n墙内看似天国但剧情暗示了更大的危险\n\n![[SweetSub&LoliHouse] Heavenly Delusion - 05 [WebRip 1080p HEVC-10bit AAC ASSx2]-0006](./attachments/bafkreiad3gcq4cia7f7iot5hg4azctip2hitqtw4iqwqgmckmk5erj6mbm.jpeg) ![image](./attachments/bafybeia5ejiifjgxuhn3vl4jlac2ik265gdxdhzgpdz5k2l652wnjew63q.png)\n\n生活在墙外的主角真流和斩子被托付前往天国寻找和真流长相一样的人,期间遇到了各种各样的人\n\n不愿相信儿子已经变成没有人性的怪物蛭子的母亲,诱骗路人喂给儿子吃,最后被儿子变成的蛭子杀死\n\n![image](./attachments/bafybeig7uiak3ibivii3mpa5pza66hozfmy745zrly4nf4ibp67m6d74sq.png) ![[SweetSub&LoliHouse] Heavenly Delusion - 02 [WebRip 1080p HEVC-10bit AAC ASSx2]-0001](./attachments/bafybeiamfjgkkix3kym6runtvdfo6x3jsbjy5tz62bmf6cx47jtqplgoju.jpeg)\n\n梦想跟看上的客人爱爱来赚大钱的酒店小老板,也会跟骗子强盗合作诱拐冒险者\n\n![image](./attachments/bafybeihhtwkhoa3qjwozkmy2irwoew5qig4xcroarizwzdzuinsr2ho5xm.png) ![image](./attachments/bafybeihzv5khfyd446zqtrxlqbqkffuotljiew3iw2g2zkl57bw3fjppua.png)\n\n做人体实验的冷血医生,又只是一个为了让妻子可以作为人类有尊严死去的痴情男,成功让妻子死去后抱着妻子的尸体自杀\n\n![image](./attachments/bafybeigtyax33asn2m3ldpuprsy4tflbjxfg3nbwrcwzvgegoauuww527u.png) ![image](./attachments/bafybeiblvujalwusay74fff7cp7btdfgm6j6mfwi7qjj6r5mmdcyoo2i4y.png) ![image](./attachments/bafybeihj24e67m7qcn2cxfno33w642ih4vq4hhzdrphnb6ryq5bxhefvke.png)\n\n而义正严词反对人体实验的伦理组织首领只是为了给医生下圈套抢夺资源\n\n![image](./attachments/bafybeifffyoscjc7hg2bpxuflcbcccwuh2etcero7g43ixdtj4wnharj7i.png) ![[SweetSub&LoliHouse] Heavenly Delusion - 08 [WebRip 1080p HEVC-10bit AAC ASSx2]-0013](./attachments/bafybeid4lemdygg2lr5e2mllqss4664777sms67se52d2zwliqs4ezpq5u.jpeg)\n\n每个人都能被不长的篇幅刻画地如此鲜活,在这样的废土世界,努力艰难不择手段地活着,即使罪大恶极也能让我深深理解,感到同情和惋惜\n\n让我对制作组献上最大的敬意,如果排除个人因素,这部作品将是遥遥领先的 4 月霸权\n\n| 类别     | 评分/10 |\n| -------- | ------- |\n| 剧情     | 10      |\n| 画面     | 10      |\n| 个人加成 | 5       |\n\n## 地狱乐\n\n在德川幕府时期,有一个鲜花遍地,蝴蝶翩飞的名为“神仙岛”的地方,前往该岛的调查队只有极少数的残肢和鲜花能够随着小船漂流回来\n\n最强死刑犯忍者画眉丸与处刑人山田浅右卫门佐切一同被派往此岛,寻找不老不死的仙药以换取无罪释放,并在岛上与怪物以及其他死刑犯互相残杀\n\nhttps://twitter.com/DIYgod/status/1643976154435694594\n\n里面的怪物是这样的画风\n\n灶神\n\n![image](./attachments/bafybeifo7tzccvavqcaofs7dniqw22qlevkrniycpz4vg4aq7xexradz5i.png) ![image](./attachments/bafybeih3qzb3kag35pw33tx2ffutlok4t7ek7lknx7kgonbpprbisweu7q.png) ![[BeanSub&FZSD&LoliHouse] Jigokuraku - 05 [WebRip 1080p HEVC-10bit AAC ASSx2]-0035](./attachments/bafybeifn46n6cc5hzl5u7wm4zzlwckuyda4fdvbazc5es3swsy3a4yf7ii.jpeg)\n\n天仙\n\n![[BeanSub&FZSD&LoliHouse] Jigokuraku - 07 [WebRip 1080p HEVC-10bit AAC ASSx2]-0032](./attachments/bafybeiah5azf7vh3ie2eg4lehw2bvnmbuxh2xvjl7pij24byabbbjxthey.jpeg)\n\n被天仙抓到会被炼成丹\n\n![[BeanSub&FZSD&LoliHouse] Jigokuraku - 07 [WebRip 1080p HEVC-10bit AAC ASSx2]-0031](./attachments/bafybeib4nu3c5j2elcfexkxstcetc6sv4csvvr4dup5rptcgs5qtskzovu.jpeg) ![[BeanSub&FZSD&LoliHouse] Jigokuraku - 05 [WebRip 1080p HEVC-10bit AAC ASSx2]-0033](./attachments/bafybeiapymxr6dxgyka2h3triktwup3rnrxl6vezkgymy25wmfwup2rb2m.jpeg)\n\n非常诡异荒诞\n\n每个死囚也都有自己的故事,并不是黑白分明,经历都很有趣\n\n![image](./attachments/bafybeihjg2gkmqyzmglqy4m4vetps7mu5vjgerjqj4cqswtduchnb5ream.png) ![image](./attachments/bafybeidp3vpfl2dt4ztwywrfptbytijgwasj7vsgbji6pexpj57xgh6t34.png)\n\n还出现了一个怪力萝莉\n\n![image](./attachments/bafybeihixl4a2tvsgxxbilh6edtxaqrzabqcvkkhzcrcompqpytkhnynuq.png)\n\n仙药和小岛的真相依然扑朔迷离,后面肯定还会有更诡异更强大的怪物,很期待\n\n| 类别     | 评分/10 |\n| -------- | ------- |\n| 剧情     | 8       |\n| 画面     | 8       |\n| 个人加成 | 0       |\n\n## 【我推的孩子】\n\n妇科男医生和早逝女病人遇难转生为自己单推偶像星野爱的双胞胎孩子阿库亚和露比,三年后星野爱被害身亡,阿库亚立志寻找母亲遇害的真相和真凶,露比梦想着成为母亲那样的偶像,兄妹应对演艺圈的各种纷争和阴谋\n\n一个多小时的首集太惊喜了,像看了一部电影,我觉得可以算得上 4 月最佳单集了\n\nhttps://twitter.com/DIYgod/status/1646495376919101441\n\n但可能是开头调起太高了,期待也拉得很高,后面几集略显平淡了一点,估计是高低高的节奏,现在是憋å¤
318§æ‹›ä¸­ï¼Œæœ€åŽä¼šæœ‰ä¸€ä¸ªè¶…感人哭爆的结局,准备好纸巾了\n\n虽然如此,但如果中间也能再多给星野爱一些画面就更好了\n\n![](./attachments/bafybeiafziunuervleanhd7j7at22vbc2gv2tgzv5xit3gtgd7xaela2bi.jpeg)\n\n另外它的 OP 也超好听,我单曲循环了好几天\n\n<iframe style=\"border-radius:12px\" src=\"https://open.spotify.com/embed/track/7ovUcF5uHTBRzUpB6ZOmvt?utm_source=generator\" width=\"100%\" height=\"152\" frameBorder=\"0\" allowfullscreen=\"\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" loading=\"lazy\"></iframe>\n\n| 类别     | 评分/10 |\n| -------- | ------- |\n| 剧情     | 7       |\n| 画面     | 7       |\n| 个人加成 | 0       |\n\n## 我家的英雄\n\n> 疼爱独生女零花的微不足道上班族‧鸟栖哲雄,某天因为工作关系和开始一个人生活的零花相约见面,却发现她脸上有被殴打的痕迹。在回家的路上,哲雄看见了像是犯人的男人,并尾随在其後。隔天偷偷回到女儿的公寓,结果却发生了使整个家庭的命运为之一变的事件。父亲为了女儿、为了家庭,走上了修罗之道。高潮迭起的悬疑故事开幕。\n\n![image](./attachments/bafybeifzokprfjj2cylkovhioqec2k3lolpwwkkfl7o3jlffgczoppbyba.png)\n\n剧情很精彩,但制作非常非常贫穷,挺可惜的,就是刚才说的说不过去的那个\n\n好在剧情底子非常强,再垃圾的制作也能感受到挺强的紧张感,也能捏着鼻子津津有味地看下去\n\n就不截图了,画面实在看不下去\n\n| 类别     | 评分/10 |\n| -------- | ------- |\n| 剧情     | 8       |\n| 画面     | 1       |\n| 个人加成 | 0       |\n\n## 偶像大师 灰姑娘女孩 U149\n\n> 讲述一群小学生偶像在早期没有制作人、没有工作的情况下,仍然一步步向着梦想前进的故事。\n\n其实也没什么剧情,就是过家家... 但是很可爱,非常刑\n\n![image](./attachments/bafybeidikx3ntdoffjmbxkjnmxbs6useq3nquuosedb7ydc7pljjuqcwkq.png) ![image](./attachments/bafybeigawpdpunemn5qnp75eibl7jj4tyvuh6fb5xij5sn2zwubppwudcy.png) ![image](./attachments/bafybeiehin5biqi7vgivjj42wiqjgrieqz2qqk3lplxfcwko6bfaohbi4i.png) ![image](./attachments/bafybeibtmhi3chreptjafhple45hmcpcey5korb5rujparsx3ksp3p2kda.png) ![image](./attachments/bafybeidmn4ujfd3aonleyzuyux5fjk57l5txr7uikh625pbem6c5ar2hsy.png)\n\n| 类别     | 评分/10 |\n| -------- | ------- |\n| 剧情     | 1       |\n| 画面     | 9       |\n| 个人加成 | 0       |\n\n## 跃动青春\n\n> 岩仓美津未从乡下的小初中,以第一名的成绩考入了东京的高升学率高中。\n> 这位乡村神童心怀完美的人生蓝图、独自来到东京。她成绩优异,却与他人有着独特的距离感,稍显格格不入。\n> 她虽然偶尔会失败,但还是凭借天真的性格一点点打动班上的同学,使他们那各不相同的性格逐渐交叠。\n> 相遇、相知、最终心意相通。\n> 人人都会有心烦和焦躁之时。而无可替代的朋友,定将带来互相理解的契机。\n> 这是个偶有杂音却能让人不知不觉快乐起来的校园生活喜剧!\n\n![image](./attachments/bafybeicmjjmy4ikxgdz2iwvufdamcwjx2c7zler5iiib6llkf7harygqx4.png)\n\n不管是画面还是剧情看着都很舒服,作品本身是非常棒的,喜欢,但这种平淡剧情不是我喜欢的类型,只能简单吹爆\n\n| 类别     | 评分/10 |\n| -------- | ------- |\n| 剧情     | 8       |\n| 画面     | 8       |\n| 个人加成 | -5      |\n\n## 其他\n\n另外还有《机动战士高达 水星的魔女》《我心里危险的东西》《放学后失眠的你》也是我正在追的,但我平时能看番的空闲时间没那么多,这几部进度还没跟上,等我全看完可能会写一篇 4 月新番的总结,有机会到时候再一起说\n\n最后祝大家追番愉快!玩王国之泪之余也不要忘记追番哦!"},{"slug":"webworker-xlog","title":"和 xlog.app 的作者 DIYgod 聊区块链和博客平台、前端学习和生活感悟","tags":[],"body":"新一期播客来啦!本期我们邀请到了 xlog.app 背后的作者 DIYGOD 一起聊聊他做的区块链博客平台,以及背后的选型考量和有趣的故事。除了科普背后用的 web3.0 技术细节,我们还对选型进行一番大讨论!也对 yy 的个人生活向往不已!欢迎来 xlog 一起写博客,听播客ï¼
318"},{"slug":"software-update","title":"我得了软件更新强迫症","tags":[],"body":"我必须让身边所有软件都保持最新版本,就像走路不能踩到地砖缝缝一样,没有意义,但也危害不大,所以我放任它发展\n\n<div style=\"display: none\">\n\n![image](./attachments/bafybeidy2jmclbfvtlgv2fluz2rglny7wkbdbyd3y4teqnmibp36y6ihrq.png)\n\n</div>\n\n## 操作系统和固件\n\n最基础的,大到主力生产力 MacBook,小到吃灰的 Dockcase 扩展坞,都要更新,这是我的 Checklist,基本上靠更新提醒就够了\n\n<div class=\"os-screenshots\">\n\n| 设备            | 截图                                                                                                          |\n| --------------- | ------------------------------------------------------------------------------------------------------------- |\n| MacBook         | ![image](./attachments/bafkreia4qv3x7janwrnrc2sgftnpfrgwlpjynn2tqyzljprhcux6ftka4u.png)                       |\n| NAS             | ![image](./attachments/bafkreielshhsy6qhqf42c7rdctwjrq7377e3sgpcibahd4inlzqdoof2ui.png)                       |\n| 路由器          | ![image](./attachments/bafkreiclxwaxioqu7rbtgqwsr6cpdddqri3cpr6zo4juvnv632agrhptqe.png)                       |\n| iPad            | ![IMG_0531](./attachments/bafybeifnsbxktfk3dboqimfq3jydasui52r4vbufd5mmgmjmkbc7zccy2y.png)                    |\n| iPhone          | ![IMG_6D8DCEB3D457-1](./attachments/bafkreifap6673enxgktotacjexseaviphooirqmuvaapape7qtqx2fwdb4.jpeg)         |\n| 小米手环        | ![IMG_3744](./attachments/bafkreihdqytgocwdb2wnjll6qb5gb6pcpbx3hj5ze6wzpcqofk3a4sqb64.png)                    |\n| 小米家居        | ![IMG_3745](./attachments/bafkreidyu3t5cgtqej7fllrzapxrqt7ly2xwf5fmsl4iiekpgq5fceweua.png)                    |\n| 相机            | ![Pasted image 20220627175100](./attachments/bafkreiflqsqlsppssx3esrezif6ed7vh5hoo4iiuq3rjmdi4gkwfpma7dm.png) |\n| PS5             | ![image](./attachments/bafkreiearr6ztdcv4o6sf6g5sb4ibeaxhpftitcvvvibykervhlbmqgmhq.png)                       |\n| Switch          | ![image](./attachments/bafkreibghmflj7ppy5eonaegf7fika6iau2ws3dqqlpnmu3n5g75ko3gbi.png)                       |\n| Dockcase 扩展坞 | ![Pasted image 20220504125702](./attachments/bafkreieqpxnt7nqr4q6gmvocjctmlfbseca73nkcmz6rharxjbxtz444am.png) |\n\n</div>\n\n## 应用\n\n操作系统下的应用也需要更新\n\n### MacBook\n\nHomebrew Cask 出现之前 macOS 的应用更新一直是一个难题,App Store 的自动更新最好用但是应用很少,曾经困扰了我很久,但现在没问题了\n\n对 macOS 的应用我秉持这样的原则:\n\n- 第一顺位 Web 版,比如:Discord、Slack、Telegram、Spotify\n- 第二顺位 App Store 版\n- 第三顺位 Homebrew\n- 除此之外不安装\n\n其中 Web 版不需要更新,App Store 会自动更新,Homebrew 只需要每天执行下命令\n\n```sh\nbrew update && brew upgrade && brew cu -a -y && brew cleanup\n```\n\n但 App Store 有时候会好几天才能自动更新上,这不能忍,安装上 [mas](https://github.com/mas-cli/mas/) 用命令行触发强制更新,再加上鼠须管的词库更新和 alias,下面就是我的总命令了\n\n```\nalias up=\"brew update && brew upgrade && brew cu -a -y && brew cleanup && mas upgrade && ~/plum/rime-install iDvel/rime-ice:others/recipes/full\"\n```\n\n![image](./attachments/bafybeidy2jmclbfvtlgv2fluz2rglny7wkbdbyd3y4teqnmibp36y6ihrq.png) ![image](./attachments/bafkreib5jf433c5immfnbbl2iw7jflu37bsx2qzti5nqrzuc626l4ugbpu.png)\n\n### NAS\n\n有两部分,群晖的套件会自动更新,Docker 部分用 [Watchtower](https://containrrr.dev/watchtower/) 自动更新\n\n![image](./attachments/bafybeidqgrvewitjql6h5bmthvhox3qrx6bt6cjz2cjb6lbeumatzzt6ua.png)\n\n### 其他\n\niPad 和 iPhone 应用虽然也会自动更新,但也是经常好几天才更新,所以每天早上起床第一件事就是手动刷一下这两个的更新,其他不那么常用的设备就等提醒或自动更新,这个还是能忍的,毕竟我的强迫症还没那么严重\n\n## 插件\n\n应用内的插件也需要更新\n\n### 浏览器\n\n通常会自动更新,但也有遇到卡住几天都没更新的情况,还不是很懂,偶尔会去手动点下 Update,这些是我目前用到的浏览器插件\n\n![image](./attachments/bafybeieiv5pbq4ventminxqj47xgq6fpvjitlqwys7e6jh5tnvnpxzbq7m.png)\n\n### Obsidian\n\nObsidian 的 community plugins 和 themes 都需要更新,官方没有自动更新的方法,可以通过再装一个插件 [Beta Reviewers Auto-update Tester](https://github.com/TfTHacker/obsidian42-brat) 来实现自动更新,这些是我目前用到的 Obsidian 插件\n\n![image](./attachments/bafybeidwzvw5pnbbg3lqt6epzcc6j4vw4ym6ovw5fnzi7wr65nybgs7ne4.png)\n\n### VS Code\n\nVS Code 有很好的自动更新,这些是我目前用到的 VS Code 插件\n\n![image](./attachments/bafybeifrq2nq5pmombxspinznbocpyma75zu3ziqsvopjkchlqt6lete7a.png) ![image](./attachments/bafybeifryhdtrsatvagsjh4dlbqyy5uoduefl2kurkoalwu66lwumrpwam.png)\n\n### Home Assistant\
318n\nHome Assistant 就没那么顺利了,我装了一个 Home Assistant Community Store(HACS) 来获取更多的集成,但它没有自动更新,也没有更新提醒,要点进去才能看到\n\n![image](./attachments/bafkreianfx75qnkwlx6goehbg2lztlx2y4wst7726lmmmopt7igm3m5rle.png)\n\n## 项目依赖\n\n项目的依赖也需要更新,我用 Dependabot 来自动提交依赖更新的 pr,对于有完善自动化测试的项目,比如 RSSHub,就可以再用 [Github Action Merge Dependabot](https://github.com/fastify/github-action-merge-dependabot) 自动合并,一秒都不用多等\n\n```yml\nautomerge:\n  if: github.actor == 'dependabot[bot]' && github.event_name == 'pull_request'\n  needs: [jest, puppeteer, docs, all]\n  runs-on: ubuntu-latest\n  permissions:\n    pull-requests: write\n    contents: write\n  steps:\n    - uses: fastify/github-action-merge-dependabot@v3\n      with:\n        github-token: ${{ secrets.GITHUB_TOKEN }}\n        target: patch\n```\n\n## Changelog\n\n默默更新有时候还是不够的,对一些重要或者感兴趣的软件我会用 RSS 订阅它们的 Changelog,及时了解它们都更新了什么\n\n![image](./attachments/bafybeif2rfphy2hzwwrxe422zeuk4ogpmpsemsgdv34kybelsxhi2loxii.png)\n\n目前想到的只有这些了,习惯了的话检查一遍很快的,就能换来一整天的舒适\n\n不要学我,即使学了也不要说是我教的\n\n<style>\n  .os-screenshots thead th:first-child {\n    width: 10px;\n  }\n  .os-screenshots td > span {\n    height: 100px;\n    display: flex;\n    align-items: center;\n    overflow: hidden;\n  }\n  @media (min-width: 640px) {\n    .os-screenshots td > span {\n      height: 200px;\n    }\n  }\n  .os-screenshots td > span > span {\n    height: auto;\n  }\n</style>"},{"slug":"dystopian-anime","title":"令我痛心的三部反乌托邦动漫","tags":[],"body":"<div style=\"display: none\">\n\n![image](./attachments/bafybeih6nkyowhmksth75szqli34g4e3aphwcfrlt32oseauzeyrdfjria.png)\n\n</div>\n\n> 请欣赏 「DIY 的夺命歌单」\n\n<iframe style=\"border-radius:12px\" src=\"https://open.spotify.com/embed/playlist/1dkOjgIAuwxIG75v6QyrpN?utm_source=generator\" width=\"100%\" height=\"352\" frameBorder=\"0\" allowfullscreen=\"\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" loading=\"lazy\"></iframe>\n\n四月对我而言是一个充满悲伤的月份。尽管《四月是你的谎言》已经过去了很多年,但每当看到「四月」这两个字,仍会立刻触发我的 PTSD,再加上今天我刚读完一本反乌托邦题材的小说《来自新世界》。多种思绪糅杂在一起,让我不禁回想起了那些令我痛心的「重量级」反乌托邦动漫。\n\n## DARLING in the FRANXX\n\n> “如果把动画比作足球的话,这部动画大概就是日本国家队了,就是普通不看足球的人也会期待日本队的表现,也会去谈论足球,所以希望自己的动画也能被这样对待。不单单锦织敦史的粉丝、TRIGGER的粉丝、A-1的粉丝这些平时看动画的观众,希望平时不看动画的观众也能享受这部作品。” — 鸟羽洋典\n\n制片人的这番话一点也不夸张。这部动漫的制作阵容极为豪华,集结了业界的大佬和顶级声优,因此在尚未播出之前就被所有人寄予厚望,以至于还没播出就已被推上神坛。\n\n然而,神作的道路并非顺利。从爱奇艺和B站的霸权争夺,到驾驶姿势引发的女权争议,最后在 B 站 UP 主 Lexburner 的口嗨和群众的恶意举报中达到高潮,赵弹来袭。\n\n<div class=\"full-image\">\n\n![image](./attachments/bafybeifog2nxciblaoszarqqollx7crrj37js74vylca4kcofmh7zmh55e.png)\n\n</div>\n\n这些历史背景现在看来其实都不值一提,只是说明当时的热度和争议之高。毕竟最后还是用作品说话,而这部作品简直太符合我的口味了,反乌托邦的背景、活泼可爱打破常规的02、恰到好处的涩涩、科幻、鬼、悬疑...\n\n<div class=\"full-image\">\n\n![1B89028C35E9F0136C0A628BA6DD978B](./attachments/bafkreifekmvmgn4wbehu6o5pjz2a7aoumdeljbugbvyksm7uf4ab6jcadq.jpeg)\n\n</div>\n\n当时的我茶不思饭不想,在一声声 Darling Darling 中逐渐迷失了自我,每周就指着 Darling 活了,我把博客主题改成了 Darling 的配色和配图
318,头像和名字也换成了Darling,买了手办、画册一切能买的周边,甚至学着画画专门临摹 02,逢人就吹爆,只要看了 Darling 我们就是好朋友种种\n\n![image](./attachments/bafybeic5jsm2rrduqpbspdz4bdc6zhbooi4sw642ds2jgle6yojlsmxedm.png)\n\n![image](./attachments/bafybeibx7moe6hd6xwfpblp2modc3vc255n2ql737nlaspfl3264q4ubqi.png)\n\n再回过神来就是惨绝人寰的烂尾了,就像回应开播时的轰轰烈烈一样,烂得也彻彻底底没有任何余地,但可能是大脑对强烈刺激的自我保护,我现在已经不太记得当时的具体情景了,只记得一个巨大的花嫁扎古噩梦...\n\n这部由如此豪华的制作团队打造的作品,竟然如此令人失望。至今我仍无法理解。\n\n## 约定的梦幻岛\n\n一年后,我又发现了一部绝赞的反乌托邦番剧\n\n<div class=\"full-image\">\n\n![image](./attachments/bafybeiemdmi3mt7umyhw7m5ykreo5g7okf7mbr72mgmhhcqhtzzg5yapt4.png)\n\n</div>\n\n在我吹爆《约定的梦幻岛》第一季的时候就有人提醒我:Darling 尸骨未寒,你怎么敢。我却不以为意,认为这只是巧合。毕竟,梦幻岛是根据广受好评的漫画改编的,有着坚实的剧情基础,与原创动画 Darling 根本不能相提并论,第一季播完我还沾沾自喜:看,这次没事吧。\n\n然而,两年后,第二季开播了。\n\n我仍然清晰地记得刚开播时,我坐在电脑前激动地第一时间观看。然而,越看越觉得不对劲。到了第四集,剧情已经无法挽回。后来我勉强捏着鼻子又看了几集,但发现我的意志力实在不足以支撑我继续观看。\n\n按理说,漫画已经取得成功,剧情不成问题;第一季动画也获得了好评,拥有广泛的粉丝基础。只要按部就班地制作第二季,绝对会成为另一部神作。然而,动画剧情却砍掉了许多原创桥段,换上了毫无逻辑的编剧所编织的剧情。实在难以想象制作过程中究竟发生了什么。\n\n还好,同期播放的巨人稳得很,让我没有过于悲伤。\n\n![image](./attachments/bafybeighcpfcflvojiveaajh53pytcbq5flemml574rddd23ekxi4c4iai.png)\n\n## 进击的巨人\n\n这是一部我从 2013 年一直吹到 2022 年的作品。\n\n![image](./attachments/bafkreidkxmpymstiut6cvi7s2kmteazhy42rnbwbw3rvdqxrcf6hqofnpq.png)\n\n![image](./attachments/bafkreifhr3rvkif2ho44melbwlmqjbi54piw3hhbmf7kxquhbbdj24yeqi.png)\n\n作为一部自 2013 年就开播的动漫,《进击的巨人》在所有动漫中一直拥有极高的地位,堪称元老级存在。许多人正是从这部作品开始入坑看动漫,它是很多人的“启蒙”作品,也是我极力推荐给发小观看的第一部动漫。这部动漫也是根据漫画改编的,但与梦幻岛不同的是,其剧情、设定、丰富度和热度都高出好几个层次。更重要的是,接手最终季制作的 MAPPA 公司在质量和口碑上都绝对令人放心,不会出现梦幻岛那样的问题。它的剧情连载了那么长时间,久经时间考验,也不会出现 Darling 的情况,因此我一直信心满满地放心吹爆。\n\n然而后来的事情许多人都知道了,动画史上空前绝后的恶劣事件发生了。这不是恶搞,不是开玩笑,更不是烂尾,而是一个充满仇恨、对爱、正义和和平的人类主流价值观怀有敌意的精神变态作者,对喜爱他和他的作品的观众进行了深思熟虑、蓄谋已久的极端恶意伤害。呕!\n\n![image](./attachments/bafybeicfnnjqgshf7djgnzl2ijh3wanub7kyuglr66quybc2hz5ffmtk6y.png)\n\n![image](./attachments/bafybeih6nkyowhmksth75szqli34g4e3aphwcfrlt32oseauzeyrdfjria.png)\n\n![image](./attachments/bafybeihk2iaceqsrippstqzvgyzxxm7wf7plwpggrdw474oqo445jngnvu.png)\n\n![image](./attachments/bafkreia3hbujwx5zpxbknjdg5bqjlggqrcjroj5fzentmznafwl4qfn4je.png)\n\n虽然已经过了很久了,但我还是久久无法平静,我恨啊,不仅仅是痛心,更是咬牙切齿的仇恨。\n\n<div class=\"full-image\">\n\n![image](./attachments/bafybeiankuqq3kcs4snzek6zn7upsa4ohxkpe6b3k4rk6jrquuquley5ra.png)\n\n</div>\n\n## 其它\n\n![image](./attachments/bafkreidc5pwwsg3nb75zbyjjcp4njt5kxwvw767mbca2pzagoszws26u5u.png)\n\n![image](./attachments/bafybeigxusikmm5ymmjlwpms2et7zgd7gdahcxb36lrt5mypbi4zojpk6a.png)\n\n![image](./attachments/bafybeid52piuwh5e76i6tb4dkkln65xzszlivwd6zlh27pcrtx5ycdavfy.png)\n![image](./attachments/bafybeiemna4b6tnucxsnvjtvcmggstxflvyavoiu6vjv7yekkv7ipb3rgu.png)\n![image](./attachments/bafybeid52zovvrp4z5mhr3b6jqtufzv2savywuttaihsfl4zkan2x7nrye.png)\n\n<div class=\"half-image\">\n\n![image](./attachments/bafybeifji2bzq5g2anm5zet5ewiibfc5bgto7n6hy2nqyvxjyiri3xjuwq.png)\n\n</div>\n\n当然,这些只是玩梗。\n\n最后,真诚祝愿四月新番开门大吉、一切顺利!\n\n<style>\n.full-image span {\n  max-width: 100% !important;\n}\n.half-image span {\n  max-width: 563px !important;\n}\n</style>"},{"slug":"do-you-want-to-dance","title":"你你你你要跳舞吗?","tags":[],"body":"<div style=\"display: none\">\n\n![image](./attachments/bafybeiey7atdgk7cmji3zqoquqy3yowyf5zj3zk7zrm2nt3ujsro45aw5e.png)\n\n</div>\n\n<div style=\"position: relative; padding-bottom: 56.25%; height: 0px;margin-bottom:20px;\">\n<iframe style=\"position: absolute; top: 0px; left: 0px; width: 100%; height: 100%;\" src=\"//player.bilibili.com/player.html?aid=499541297&bvid=BV1pK411K7J9&cid=234657690&page=1&autoplay=false\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"> </iframe>\n</div>\n\n微小微一直是我最喜欢的 UP 主,没有之一。\n\n记得入坑作是 [【微小微】鬼畜舞蹈 江南皮革厂倒闭了 (纯属好玩)](https://www.bilibili.com/video/BV1vs411Q7m3/),然后又看了一些羞耻的“广场舞”,就是在大庭广众下跳羞耻的舞蹈。看微小微的视频有三个阶段,刚开始大脑会瞬间被疯狂溢出的快乐猛烈冲击,
318开始嘴角上扬,眼睛瞪大,理智被快乐占据;然后是羞耻,大脑在颤抖抖抖抖抖,残存的理智让你羞耻得想关掉视频,但这时候已经晚了,身体无法承受的超量快乐让你无法行动,让你继续“人生中最漫长的三分钟”;最后视频结束,你会震惊,为什么!为什么会在大庭广众做这种事!为什么会这么羞耻这么尴尬!为什么我看完了!为什么我这么快乐!\n\n然而影响还没有结束,你的生活在潜移默化中被治愈了,虽然没有意识到发生了什么,但你对热爱的事物多了一点勇气,对生活多了一点热情,还把简介改成了 “写代码是热爱,写到世界充满爱!”,回过神来,原来是在笨拙模仿微小微的简介 “跳舞是热爱,跳到世界充满爱!”,微小微把舞蹈和快乐跳到了世界各地,你也写开源项目帮助到了世界各地的人。\n\n真是个美好的故事,现在结束了么?(是的话也不会有今天的文章了 🤣\n\n这么自信阳光的女孩子一定从小就闪闪发光,在蜜罐长大的吧,所有人都会这样理所当然地认为,我也是,直到看到了微小微今天发布的视频。\n\n<div style=\"position: relative; padding-bottom: 56.25%; height: 0px;margin-bottom:20px;\">\n<iframe style=\"position: absolute; top: 0px; left: 0px; width: 100%; height: 100%;\" src=\"//player.bilibili.com/player.html?aid=652804160&bvid=BV1LY4y1175J&cid=1033555861&page=1&autoplay=false\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\"> </iframe>\n</div>\n\n泰戈尔说的 “世界以痛吻我,我要报之以歌” 在这里得到了完美的诠释,重新看 “跳舞是热爱,跳到世界充满爱!” 这句话又有了不一样的感受,更加感觉自己只是一个拙劣的模仿者。\n\n正好几个月前看了一本书《被讨厌的勇气》也讲了这样的观点:“决定我们自身的不是过去的经历,而是我们自己赋予经历的意义”。我当时秉持了一些怀疑,现在有了更深的理解。人之所以有不幸并不是因为过去或者环境ï¼
318Œæ›´ä¸æ˜¯å› ä¸ºèƒ½åŠ›ä¸è¶³ï¼Œåªä¸è¿‡æ˜¯ç¼ºä¹å‹‡æ°”ï¼Œç¼ºä¹èŽ·å¾—å¹¸ç¦çš„å‹‡æ°”ã€‚è¿™æ ·çœ‹å¾®å°å¾®æ˜¯æˆ‘è§è¿‡æœ€æœ‰å‹‡æ°”çš„äººï¼Œæˆ‘ä¹Ÿè¦ç»§ç»­æˆé•¿ï¼Œæ›´æœ‰å‹‡æ°”å’Œçƒ­æƒ…ã€‚\n\n我又被鼓舞了,我我我我要跳舞了。"},{"slug":"2022","title":"2022 年终总结","tags":["年终总结"],"body":"相比国内的魔幻日常,今年在苏格兰的生活还是很安稳的\n\n<div style=\"display: none\">\n  \n![image](./attachments/bafybeieowx3ddxwiedrlgckrohchscdiomz3yi2snrxnvjlwypxf6nxpsu.png)\n</div>\n\n## 年度最佳\n\n先从快乐的 DIY 年度最佳颁奖仪式开始吧\n\n### 影视\n\n看过的 19 部动漫和 18 部剧集和 6 部电影:https://movie.douban.com/people/62759792/collect?mode=list\n\n**DIY 年度番剧: 《鬼灭之刃 游郭篇》**\n\n今年动漫神仙打架,《夏日重现》、《来自深渊》、《赛博朋克》、《间谍过家家》、《更衣人偶坠入爱河》、《电锯人》...太多优秀的作品,但其中最喜欢的还是《鬼灭之刃 游郭篇》\n\n鬼灭老粉了,燃点和泪点都很戳我,凯旋而归,谢谢飞碟社款待\n\n<div style=\"max-width: 400px\">\n  \n![image](./attachments/bafybeihj3zoiowq6kmbqtifljmvh2lbb5576dmztyg2xhiy4kkmdvacmje.png)\n</div>\n\n**DIY 年度剧集: 《人民公仆》**\n\n闪闪发光的剧集和主角,但生活永远比戏剧更魔幻,愿世界没有战争\n\n<div style=\"max-width: 400px\">\n  \n![image](./attachments/bafybeia63cwrw7uerdwrgdhtqr7t7jgwurecvnximr2gb7tkfzkfkwbzyq.png)\n</div>\n\n**DIY 年度电影:无**\n\n今年电影看得实在太少了,没有遇到能欧呼一整年程度的电影\n\n### 图书\n\n今年看过的 9 本书:\n\n- 《高效能人士的七个习惯》\n- 《通往奴役之路》\n- 《献给阿尔吉侬的花束》\n- 《黄金时代》\n- 《富兰克林自传》\n- 《黑客与画家》\n- 《永恒的终结》\n- 《人类简史》\n- 《被讨厌的勇气》\n\n虽然数量屈指可数,但相比 2021 年的 1 本还是有了很大的进步,带来的收获和快乐也不少\n\n**DIY 年度图书:《富兰克林自传》**\n\n《富兰克林自传》是对我影响最大的一本,朴实无华的语句中处处透漏着人生智慧和实用主义思想,给我带来了很多思考,其中每日自省的 13 条美德也被我沿用\n\n<div style=\"max-width: 400px\">\n  \n![image](./attachments/bafybeicgcy7dnxmfzt3ih6rzemwoeeutyqlakl2t5drgts5fpuuqyos4xu.png)\n</div>\n\n### 电子产品\n\n**DIY 年度电子产品: 米家PGG颈椎按摩仪**\n\n相比于《颈椎病康复指南》,按摩仪要实用得多, 程序员必备,注意一定是带全身按摩贴的米家 APP 款,腰酸背痛时候的救命神器,反而颈椎按摩功能感觉没那么好用\n\n产品链接:https://www.mi.com/shop/buy/detail?product_id=14282\n\n<div style=\"max-width: 400px\">\n  \n![image](./attachments/bafkreia75z34kqsfrwdnfkrinztayz7pdcmq3ni3qal3xdjnsezvsb6i4a.png)\n</div>\n\n### 应用\n\n**DIY 年度应用:Obsidian**\n\n在 Notion 出 bug 弄丢了我一堆笔记后,我开始寻找本地笔记应用,就这样发现了 Obsidian, 瞬间被它强大的自动化能力和极高的自由度吸引,具体见[《基于 Obsidian 的生活记录系统》](/obsidian)。但缺点也很明显,受限于 Markdown 格式,表格和排版能力比 Notion 弱了很多,本地为主所以协作和分享做得也不够\n\n<div style=\"max-width: 400px\">\n  \n![image](./attachments/bafkreiegnym3kfbwkhblvxo77fk4rsl2plyd3y766npmt77a27cm5el5mu.png)\n</div>\n\n### 游戏\n\n今年玩的游戏:\n\n- 《宝可梦传说 阿尔宙斯》\n- 《最后生还者》\n- 《有氧拳击2》\n- 《艾尔登法环》\n- 《战神》\n\n**DIY 年度游戏:艾尔登法环**\n\n开放世界、魂系,手残也能玩,艾尔登法环是神\n\n印象最深的是狼哥的剧情,实在不忍心,我扭头就跑,强行 happy ending\n\n<div style=\"max-width: 400px\">\n  \n![image](./attachments/bafybeier4bkjeyvk4jepczxebhq7angbjzxeozx6idghras7k7vmpee3ay.png)\n</div>\n\n### 手办\n\n**DIY 年度手办:绊爱 Hello World 金发Ver. 手办**\n\n太可爱了,虽然一直在延期,苦等了两年,等到绊爱本尊都休眠了,但看到实物的一刻一切都值得了\n\n<div style=\"max-width: 400px\">\n  \n![image](./attachments/bafybeigdbhs5p2n6hvxs56rrge74jvgbrcmcs5zvd4vqfcvrpo5xfzhxgu.png)\n</div>\n\n## 生活\n\n去年年底终于结束了异国恋跟发小团聚了,心理健康和生活质量都改善了不少\n\n还有体重\n\n![image](./attachments/bafybeidf7pmxaacebjjjmrsokn4zbwzysuoy42trtqhad2zfzga457wuze.png)\n\n酸奶很遗憾没能带来,各种手续早就准备好了,但一直没等到中英的直航,中介给的最好方案是从马来西亚中转,耗时很
318长,很担心安全就先算了\n\n### 食\n\n英国的食物一直让我很痛苦,但一个人的时候做饭时间效益很低,两个人就不一样了,做饭时间差不多但收益加倍,还省了洗碗的时间\n\n一开始是发小做,但发小实在没什么做饭天赋,还偶尔触发火警,让我又痛苦又害怕,后来就换成了我做\n\n起步是从B站的 [泡厨房的顾小胖](https://space.bilibili.com/474803476) 和 [美食作家王刚R](https://space.bilibili.com/290526283) 学的,刚开始有点手足无措,入门之后发现很多东西都是通用的,还是挺容易的\n\n比较满意的有番茄腊肠焖饭、番茄鸡蛋面疙瘩汤、可乐鸡翅、辣椒炒肉、包菜炒肉、寿喜锅、番茄肉酱芝士意面\n\n![IMG_3404](./attachments/bafybeifeawcab2zn75lv4ypvk4n7znymcbt6yzzunhy3l5ajiay2hbwmoe.jpeg)\n\n### 住\n\n苏格兰租房的法律保障很完善,但找房子特别麻烦,一方面因为房东需要负很多法律责任,就会很谨慎,另一方面苏格兰人口稀少,房子流动性差,再加上今年我所在城市的大学不负责任地扩招了很多很多,狼多肉少\n\n![IMG_2658](./attachments/bafybeidgpckbizbwjthlhnr3aokd4k55qswtrp2qzdurwed5vxql73o55u.png)\n\n在苏格兰正常租房房东一般会要求有比较高的收入、本地担保人、工作证明、公司推荐信、上任房东推荐信、第三方信用检查等等一大堆资料,其中信用检查一般还会要求在英国有 6 个月以上的稳定住所,都满足条件后就有资格申请看房了,看房是必须的,相当于找工作的面试,在双方都满意后,就有资格提交租房申请了,房东在收到足够的申请后,会从中挑选一个最喜欢或条件最好的申请者来租,如果有幸被选中,这才完成了租房的过程\n\n所以过程不是一般的困难,我从 8 月份开始就每天沉浸在各大租房网站,一封封私信一通通电话,周边 Airbnb 都快住遍了,心酸曲折都是寻常,好在结局是好的,终于在 10 月租到了远超预期满意的房子,房东是个很会生活的室内建筑师,布局、装修都超棒,街区安全便利,光线充足,有地暖和大电视,还带一个很好玩的阁楼\n\n### 行\n\n今年被发小拉着去了很多地方\n\n![image](./attachments/bafybeieowx3ddxwiedrlgckrohchscdiomz3yi2snrxnvjlwypxf6nxpsu.png)\n\n**1 月**\n\n在诺丁汉和 Henry 一家过年,放烟花和看鹿打架\n\n![IMG_3424](./attachments/bafybeif46is3vj7nd7w2f3wjvcul6b3b3ljrkfvzqjsxz3rkwet3uybiam.jpeg)\n\n**4 月**\n\n和 Henry 一家在湖区国家公园自驾游\n\n![IMG_3433](./attachments/bafybeidshnc4orn6gg7qwvjshrj6nqmkhfeqt7osmke4keperbrpemmuby.jpeg)\n\n<div style=\"position: relative; padding-bottom: 56.25%;\">\n<iframe style=\"position: absolute; width: 100%; height: 100%; left: 0; top: 0;\" src=\"https://player.bilibili.com/player.html?bvid=BV1UT411E762&autoplay=false\" frameborder=\"no\" scrolling=\"no\"></iframe>\n</div>\n\n接着还去了伦敦\n\n![IMG_3434](./attachments/bafybeihnizv4apd5bble34ym73rvfod2dhv33mln4gc2g3ssgrpc44wctq.jpeg)\n\n<div style=\"position: relative; padding-bottom: 56.25%;\">\n<iframe style=\"position: absolute; width: 100%; height: 100%; left: 0; top: 0;\" src=\"https://player.bilibili.com/player.html?bvid=BV1iv4y1M7iu&autoplay=false\" frameborder=\"no\" scrolling=\"no\"></iframe>\n</div>\n\n**5 月**\n\n曼彻斯特,GAY 街和一家漫画店(当时还不知道链锯人)\n\n![IMG_3421](./attachments/bafybeihqyua44gcd2xaw5wfok7r3hvllkafivhvbu7vbhh6xnb3ehub7he.jpeg)\n\n**7 月**\n\n和 Henry 一家去北爱尔兰和苏格兰高地(这里拖更了一个 vlog)\n\n![IMG_3437](./attachments/bafybeih4atp5urqbcmxsigpbuic2boaru4gvm4ujxzmyeiybtemyoghjta.jpeg)\n\n![IMG_3438](./attachments/bafybeicjsudkb32rq7by2cmxuchmupfxozfkivx4rpguyijdpf4h5mqzfq.jpeg)\n\n跟发小同学去周边爬山和野餐\n\n![image](./attachments/bafybeift7fctmvg32qp4bwcbul5b3jgaxm37sflxhy5r4bgzztfupodv3e.png)\n\n**8 月**\n\n和 Henry 一家、年年去了伯明翰,没去成发小想玩的实弹射击,缩在酒店通宵玩剧本杀\n\n![IMG_2630](./attachments/bafybeibbyvymgu6zsf6ohr652ubvobbo2wiwarn77i2arnplj
318obkp2uoy4.png)\n\n**12 月**\n\n去了利物浦、巴塞罗那,和粗粗去了罗马、梵蒂冈、威尼斯、米兰、苏黎世、因特拉肯、巴黎\n\n在巴塞罗那被偷了手机,但是波盖利亚市场便宜又好吃,好喝的鲜榨果汁只要一欧;在罗马发现意大利的意大利面很难吃;在梵蒂冈过了圣诞节,还第二次得了新冠;威尼斯到处都是水,没有公交车只有公交船;在米兰吃到了很好吃的北京烤鸭,但粗粗作为一个北京人吃得很生气;发小在因特拉肯滑雪扭伤了腿,被几个瑞士好心人从雪山上背着滑下来,取消了冰岛的行程;在巴黎的急诊室跨年;在机场发小作为残疾人享受到了超 VIP 服务...\n\n后面还会补一个 vlog\n\n![IMG_6093](./attachments/bafybeialn2lkq337jemx573tk7t5mruwgmqs2s3ohuhc6cp3br75bft22a.jpeg)\n\n### 一些小事\n\n还有一些让我印象深刻的小事\n\n**1 月**\n\n学校公园的松鼠很亲人,跟可爱的小松鼠击了掌 [Twitter](https://twitter.com/DIYgod/status/1483523439721910273)\n\n![image](./attachments/bafybeifgqexrdpycdps6vjjib4wixuc6tbzy5fbg46qx3wyng6lrhdhkje.png)\n\n**6 月**\n\n感染了新冠,发了几天烧,但也没什么大不了的 [Twitter](https://twitter.com/DIYgod/status/1535961154266271744)\n\n![image](./attachments/bafybeihx3mre7oy64as7puxaxtp3k6helz3sjj6taqfwnmydusecxl2dya.png)\n\n**7 月**\n\n小米 10 Pro 电池鼓包,在英国没地方修,就在淘宝转运了一块第三方电池,成功换上 [Twitter](https://twitter.com/DIYgod/status/1547328083933515784)\n\n![image](./attachments/bafybeieh7wuj4yocc77g6jgvtf5qwie2igj3errajygdkplkf6lkptoj54.png)\n\n**10 月**\n\n空中出现的黑魔标记(奇怪的云)\n\n![image](./attachments/bafybeibqn4g5zy4s72nro2fgre7bcx6vwszw5kiwghu6ec3i4buzuaa32q.png)\n\n**11 月**\n\n送发小上学路上看到了双彩虹 [Twitter](https://twitter.com/DIYgod/status/1589994997553975297)\n\n![image](./attachments/bafybeia3mip5nvsonzckinesgyj7qedbycfcsglsvqvlzh7fbol425hlxe.png)\n\n薅了 20TB 机械硬盘,见[新玩意 | 2022 黑五买了啥?](/new-stuff-2022-black-friday)\n\n![IMG_3012 2](./attachments/bafybeifi2ojmkibc4cs36dsxlwvahn6cbodibchlwcsvraiq4c46fdbcv4.jpeg)\n\n**12 月**\n\n[《苏格兰居民可下楼活动》](/scottish-residents-can-move-around-downstairs) 这篇博客应中国政府要求删除,成为了 “正确的集体记忆” 的一部分\n\n(原来被墙了也会被盯着,也可能被盯得更紧\n\n![image](./attachments/bafybeigvg6vi7lxlt43mmhmsphc442rz3lwgakzaeplw7by35psm2mmv6i.png)\n\n### 生活管理\n\n从 2020 年就开始使用子弹笔记记录每天的生活(见[《2020 年终总结\n》](/2020)、[《基于 Obsidian 的生活记录系统》](/obsidian)),这对我帮助很大,可以帮助我及时了解最近的生活状态,还部分弥补了我记忆力差的缺点\n\n![image](./attachments/bafkreiev7oacb36s7okdhuz3hunrqtr6bi4lsgrnwjzv6ghljdpamk3itm.png)\n\n之前有看到 [新一](https://a-wing.top/) 每周会公开发布自己的[周报](https://twitter.com/search?q=%40_a_wing%20%23%E5%91%A8%E6%8A%A5&src=typed_query&f=live),感觉也是个很好的形式,公开能让自己更认真地对待生活和可以获得一些朋友的反馈,所以也在考虑开始公开写周报或月报\n\n越来越感觉生活记录 all-in-one 不太可行,所以把一些功能分给了 Toggl 和 TickTick,使用 Toggl 记录每个时间点在做什么和某些事项花费了多少时间,使用 TickTick 做任务管理\n\n另外还在使用 Eagle 管理图片(期待下个大版本的插件系统),Anybox 管理书签,MoneyWiz 管理钱\n\n## 生产\n\n今年公司发展得非常快,也面临了很多挑战,变得越来越强了,具体见 [《给RSS3社区的一封信》](https://joshua.xlog.app/gei-RSS3-she-qu-de-yi-feng-xin),很高兴熊市没给我们造成太大的影响,我们还可以继续做喜欢和有意义的事情\n\n公司项目(几乎)都是开源的所以现在也不用分开总结了,这也让今年参与的仓库有很多,有很多有意思的项目,而其中我花了比较多时间和最喜欢的是 xLog,它是一个依托于 Crossbell 区块链的博客平台,所有文章、订阅、评论等都会上链,也是当前博客用的平台ï¼
318Œä½ å¯ä»¥åœ¨é¡µé¢åº•部看到本文的区块链信息\n\n但今年对旧项目的维护缺席了很多,RSSHub 工作不能停所以出钱找了 TonyRL 来做日常维护,而其他项目的维护几乎为零\n\n![contributions (1)](./attachments/bafkreic2k35cislpbi7osoujwwcyv7cnzssj6zixvn7wwoj3353zun6qji.png)\n\n## 2023\n\n在英国的最后一年,下半年会去新加坡了\n\n### 愿望\n\n最大的愿望是可以早日跟酸奶团聚 😭\n\n已经过了身体巅峰年龄,第二愿望是身体健康\n\n### OKR\n\n2023 Q1 的个人 OKR\n\n- O1: In excellent health\n  - KR1: Body control, body weight 70kg and body fat 17%\n  - KR2: Early to bed and early to rise, 12:00-9:00\n  - KR3: Healthy Eating, light and less, increase the proportion of white meat and reduce the sugar\n  - KR4: More exercise, at least 2 times per week\n\n- O2: Highly productive like a sow\n  - KR1: Blog, at least 1 blog per month\n  - KR2: Painting, at least 1 painting per month\n  - KR2: Vlog, at least 1 vlog per two months\n\n- O3: Knowledge overflows my brain\n  - KR1: Reading, at least 7 hours per week\n  - KR2: Professional learning, at least 14 hours per week\n  - KR2: English learning, at least 7 hours per week\n\n- O4: Explore new horizons\n  - KR1: Try 1 new thing per month\n\n- O5: I am Franklin\n  - KR1: Guarantee 1 virtue per week\n  - KR2: Record virtue status daily\n\n- O6: Run like clockwork\n  - KR1: Write bullet journal daily\n  - KR2: Bookkeep weekly and monthly\n  - KR3: Do things on a daily schedule\n\n- O7: Writing code is like writing the poem of life\n  - KR1: Focused work for at least 7 hours per day\n  - KR2: Actively maintain and contribute to open source projects, this week's issue will not be left until next week\n  - KR3: Expand the scope of coding knowledge\n\n🥳 2023 快乐!"},{"slug":"new-stuff-2022-black-friday","title":"新玩意 | 2022 黑五买了啥?","tags":[],"body":"<div style=\"display: none\">\n\n![IMG_3028](./attachments/bafybeiaeqxvbsgxnjfyl42abn4xehudoyqvzxosgmgjbcltuumy74pxa7e.jpeg)\n\n</div>\n\n受少数派 [新玩意系列](https://sspai.com/tag/%E7%BC%96%E8%BE%91%E9%83%A8%E7%9A%84%E6%96%B0%E7%8E%A9%E6%84%8F) 启发,我也分享下我近期黑五购买的新玩意。\n\n其实即使是黑五,英国绝大多数商品也比国内平时贵很多,就图一乐。\n\n## Chromecast with Google TV 4K\n\n- 入手渠道:Amazon\n- 价格:~~£59.99~~ £39.99\n\n![image](./attachments/bafkreidmsjryd2sxvrksgmdhrnk4prryhpdupierqg4ldfees4frnlfauy.png)\n\n租房子时候房东留了一台电视,自带系统功能很少,看流媒体和连 PS5 打打游戏还行,看 NAS 里的视频就不行了。本来对刚更新的 Apple TV 很心动,但看到 Chromecast 直降了 £20,都是看个 4K 视频,四分之一的价格还不是美滋滋,毕竟是 Google 亲儿子,Google TV 系统跟普通 Android TV 也不一样,说不定有惊喜。\n\n![IMG_3092](./attachments/bafybeidkqsw4oroj7r6bwvvz4yj62axpekouxnrc3glrmwgldp7wwsfswe.jpeg)\n\n![IMG_3093](./attachments/bafybeihdwnbuxlcspa3a6dlkgxvte75nmsvuezg2cvykf5zst767q2ht3a.jpeg)\n\n看外观做工还是挺精致的,笑嘻嘻开机之后,还什么都没做,就发现系统响应有明显的延迟和卡顿,笑容逐渐消失。迟疑地下载完 Jellyfin,尝试打开一个 4K 视频之后\n\n电子垃圾,退钱!\n\n![image](./attachments/bafkreigvm54ejnyzcx3qqwxuyonefnar22dcjzvgep25vrvccfcmwlgljq.png)\n\n(我后来又从自己身上找原因,怀疑是不是我视频的码率太高了,就用B站视频试了下,发现就连B站那么低码率的 4K 都播不动,洗不动洗不动)\n\n## Western Digital 20TB 桌面外置硬盘\n\n- 入手渠道:Amazon\n- 价格:~~£304.99~~ £45.99\n\n![image](./attachments/bafkreibxetljogyjszatccqjoguuvfsn7j3caz3xlmp4wxtr34zbvxcype.png)\n\n广受 NAS 用户喜爱的一块硬盘,因为众所周知,虽然它设计上是放桌面上给电脑插线用的,但把它内部的硬盘拆出来给 NAS 用再合适不过了,一方面价格很低,另一方面它的硬件水平与西部数码最高档的企业级 Gold 或 NAS Red Pro 相当 ([reddit](https://www.reddit.com/r/DataHoarder/comments/up2lki/wd_easystore_20tb_shucked_heres_whats_inside/)),除了噪音大点没什么缺点。\n\n就是这两款\n\n![image](./attachments/bafybeie6lldv2oocfcnulhqoafpicd6zkycehqbarwqywa2y7y4jq3j7pm.png)\n\n![image](./attachments/bafybeiel4slaw
3187yxg7rxiziv5t3kwpjywzgkozj7bijm6lsgo6oow53zaa.png)\n\n相比这两款价格 £515.99 和 £545.99 ,它 £304.99 的价格就跟白送一样,所以它一直在我的 [Keepa](https://keepa.com/) 订阅列表里,准备等它再降降价入手。\n\n然后就在某一天早上收到了这条提醒\n\n![image](./attachments/bafybeienimicb4jf23vm5wxapr5zaoggmonhmlaxs66s5rykam7dw2o4ky.png)\n\n£45.99!当然第一反应是怀疑 Keepa 出错了,打开 Amazon,居然是真的\n\n![screenshot-www.amazon.co.uk-2022.11.18-09_45_35](./attachments/bafybeifj7ttdi4y7p6b4layeidl7xpopko6wwivpfhkiugib3ntptvmwiu.png)\n\n没有犹豫,按住激动得颤抖的双手,买了 8 块,至于说为什么只买了 8 块,因为我只有两个账号,最多只能买 8 块。\n\n但后来有 5 块被砍单了,只收到了 3 块。\n\n![IMG_3028](./attachments/bafybeiaeqxvbsgxnjfyl42abn4xehudoyqvzxosgmgjbcltuumy74pxa7e.jpeg)\n\n拆出来硬盘,换掉之前的两块 4T 酷狼。\n\n![IMG_3109](./attachments/bafybeieqinjqgrqjivrhrchyb27s3gwkzk2jkrwtbkxjncpcfyp5v4eytq.jpeg)\n\n![screenshot-192.168.1.233_5000-2022.11.19-19_55_22](./attachments/bafkreigptzqrczgpmtxtrs7ksqdvqm4hjuge3xn7kblztkj3lxlaalt2ga.png)\n\n心满意足。\n\n本来到这里就结束了,就是一个幸运的薅羊毛故事,但是第二天,群晖故障报警。\n\n![image](./attachments/bafkreih5dprbxqs2sckkvlt2jasoq7uj6imns46ecmzx5lyjcprwyqfsqy.png)\n\n硬盘拿出来也有很明显的异响,看起来是没救了,也不知道这还能不能保修,毕竟是薅来的。还好申请售后之后 Amazon 又给我免费寄了一块。\n\n![image](./attachments/bafkreidaombw4p77qkrohuu5xqvatxykq3m6ne3fgtqesvfthiwgfuj4ta.png)\n\n我哭死,Amazon 是什么慈善家。\n\n后来下了点 4K 电影,发现 20T 好像也没多少。\n\n![image](./attachments/bafkreig7s6zadtshtj5wonre4vz4gev4yoz6nhw53xq536gj5grtakuswm.png)\n\n## Plex Lifetime Pass\n\n- 入手渠道:Plex\n- 价格:~~$119.99~~ $68\n\nChromecast 已经被我退了,现在又有了充足的硬盘,问题又来了,怎么在电视上看呢,我再次陷入了迷茫。\n\n我想起了我家那台优秀的超高清蓝光播放器 — PS5,看个 4K 视频肯定不在话下,虽然装不了 Jellyfin 但还好有 Plex。\n\n在群晖装好 Plex 服务端,导入视频,安装 PS5 客户端,购买 Pass。\n\n![image](./attachments/bafkreig4vyfkwzlz3j4qugtkkkyzbsvuulgfx37a6wg7mycwsqiwxwaeki.png)\n\n![image](./attachments/bafybeifxq6x2icxtlvtn7ajfoaalxkc7njvyxtk3rk52pc5cqd2i35dw6u.png)\n\n![image](./attachments/bafybeiffz37i5qclc3qdjnfz6yg62t7yj26opjlsxovoaa5pp5gsgmyn44.png)\n\n![image](./attachments/bafybeih7e374azqx3ir2efg7guculiwv2ifwhqfp7qn7yigx23g2txycuu.png)\n\n虽然 Plex 比较封闭,代码也没有开源,很多商业化内容令人很不放心,但不得不说体验比 Jellyfin 好不少,视频削刮又好又快,客户端体验更好,加载字幕也很方便,也算有弊有利。\n\n## PlayStation 5 DualSense 充电底座\n\n- 入手渠道:Amazon\n- 价格:~~£24.99~~ £16.99\n\n![image](./attachments/bafkreibasj5sr6k3llvlfow3nume7quf5w2gehln664g6rd6milh7c5pga.png)\n\n讨厌家里的充电底座很久了,完全躺平很占空间,还使用插入式充电,每次都要用力往里怼,方向也不顺手,非常不优雅。\n\n![IMG_3104](./attachments/bafybeicripg2lm2kv44x6z2txyjm7553huohmpipmn3e6zgx3etalt643a.jpeg)\n\n官方的就好多了,接触式充电不用费力气随手放上面就可以。\n\n![IMG_3103](./attachments/bafybeif6xvuxu5gcxqvoljvkxsmmrhastmurindpkffmy2jgkwpsobtl2e.jpeg)\n\n## This Works 深度睡眠枕头喷雾\n\n- 入手渠道:Amazon\n- 价格:~~£16.8~~ £13.44\n\n![image](./attachments/bafkreiceg4elk5whigrmtpwga7jw7ztswsh7k53xd236wxnblo4hpmc35u.png)\n\n我一直不喜欢睡觉,最近也在刻意压缩睡眠时间,每天睡 6 个多小时,虽然总体问题不大,但是偶尔会有几天精神不太好,所以买了这东西希望提高一些睡眠质量。\n\n![IMG_3107](./attachments/bafybeic76amjncbxr25vveusbcetklhyq4o3ldvguamfv7d5rxf5iwihwa.jpeg)\n\n官方介绍是薰衣草、洋甘菊和香根草的味道,我其实不知道这些东西是什么味道,实际感受就是草木的味道,给人的感觉是比较清新和柔和,也有令人镇静的感觉(虽然我没法排除心理的影响),我还是挺喜欢的。\n\n目前已经使用了四天,我感觉是有效的,但为了排除心理影响,还是通过小米手环的睡眠数据来验证:\n\n使用前 4 天的深睡比例:(15+21+15+11)/4=15.5(%)\n\n使用后 4 天的深睡比例:(13+19+16+23)/4=17.5(%)\n\n虽然看起来很玄学,数据样本也不够多,但目前看数据确实有提升,再加上我很喜欢这个味道,还是推荐的。\n\n## Crucial 内存 16GB DDR4 3200MHz\n\n- 入手渠道:Amazon\n- 价格:~~£48.49~~ £36.99\n\n![image](./attachments/bafkreicl2k5rxbbszsoelfq76ropvfi24wx66ugpaydx2p2mq46vqznagy.png)\n\nNAS 硬盘变大了内存也不能落下,虽然现在 8G 也够用了,但 Linux 的内存是会全吃满作缓存的,多点总是好的。最重要的是它实在是太便宜了。\n\n![IMG_3097](./attachments/bafybeifb6vbet3h4fxegowokxzr2543xhz53c7pqn7repyuh3pdghkdady.jpeg)\n\n![IMG_3098](./attachments/bafybeihsiuany35rtpxd7dxojuy27wrduop6lciefqjufdjde2ioqjflpm.jpeg)\n\n装上后一共 20G 内存,利用率稳定在 16%。\n\n![image](./attachments/bafkreihjval7jbw5ll3ruiu766nqgazacwhugh5prmfytgijl3vzcqvmji.png)\n\n前后对比。\n\n![image](./attachments/bafkreihdrlwbm7c6x4za67t2u46pdqyymyna2asn2m6ewcysg6gfqifrpm.png)\n\n![IMG_3099](./attachments/bafybeiguad4awjm7iustq5n536bfnz5gmvbpaasmu36iaokynos3cpjlnu.jpeg)\n\n## SanDisk 512GB Ultra microSDXC card\n\n- 入手渠道:Amazon\n- 价格:~~£69.99~~ £34.99\n\n![image](./attachments/bafkreie3rybkglgh5vhnomn3v5pq5paiduxx3zzd4yk3tsjq7mnxjz65uq.png)\n\n它也实在是太便宜了,512GB 容量 150 MB/s 读取速度,相机里的 128GB 存储卡每次出去玩都不够用,换掉。\n\n合影\n\n![IMG_3100](./attachments/bafkreialyh62lqqzcv7vibzddkzo2cqjkvajaoul7xckbymhicsoezihjq.jpeg)\n\n## Cyberpower UT650EIG UPS\n\n- 入手渠道:Amazon\n- 价格:~~£46.94~~ £37.08\n\n![image](./attachments/bafkreibxmdsys2nybryshy2bkqgwyyu7nslgamlulzszm5sudmx34f6uza.png)\n\n上次旁边街道电路维修 NAS 意外断电两次,让我很心痛,看到亚马逊有二手 UPS 卖就买了一台。\n\n首先包装就很伊拉克。\n\n![IMG_3095](./attachments/bafybeicxgmrackwxvpllgxjepz4l3r
318spmbtaigborer2zxzhhc7nruqx5q.jpeg)\n\n插上电源发现无法充电,是坏的 🤡\n\n![IMG_3094](./attachments/bafybeibja2l2dylbtlfgxyd5mefv5bbcl7yotguz3rbbnfe2vnzsyt2j5y.jpeg)\n\n再加上发现它没有 USB 口,无法实现断电 NAS 自动关机,重量也实在是太重了,密度真的就像一块铁,还是以后在国内买吧,退货了。\n\n另外还有不香的香薰蜡烛、椅子、发小买的一堆衣服,就是我今年黑五的全部了,欢迎在评论里也告诉我你最近的新玩意或者留下你的文章链接。"},{"slug":"scottish-residents-can-move-around-downstairs","title":"苏格兰居民可下楼活动","tags":[],"body":"![IMG_3057](./attachments/bafybeifeebnfxocslchhulbuss2axinwgxu2mar2wyf72wy5g6fk7xtfqe.jpeg)\n\n今天距离圣诞节正好还有一个月,但格拉斯哥主街上早早就布置了很多圣诞节装饰和圣诞节期间专属的游乐设施,我家对面的一家小博物馆也为今年的圣诞节专门建了个滑雪场兼圣诞集市。再加上今天是黑色星期五,商店很多折扣,虽然下着雨,还是阻挡不住居民纷纷出门抢购,街上很是热闹,每个人的脸上都挂着买到便宜商品的喜悦。今天又是和平喜悦的一天。\n\n..."},{"slug":"flowers-for-algernon","title":"《献给阿尔吉侬的花束》读书分享","tags":[],"body":"![s28050760](./attachments/bafybeif2fp6xiwdkevvm5item7ngurdyg55xldkogdw4yj7yqqamazcbpm.jpeg)\n\n![](./attachments/bafybeigitxokl5fizzmruvhrajy5fbkmue7ca3sqx7qrlizd67ua7ngvly.png)\n\n上个季度读的书中最喜欢的一本,分类是科幻小说,但重点在于探讨成长、人生意义的人文话题。\n\n故事讲述了在智力提升实验在小鼠阿尔吉侬身上获取成功之后,科学家们对一个智商只有 68 的笨蛋查理进行了手术,查理智商很快提升到了 185 成为了超级天才,又因为实验缺陷再次变成笨蛋的故事,小说通过一篇篇查理笔下的实验日记「进步报告」向读者第一人称讲述了查理从笨蛋到天才又到笨蛋的心路历程和生活的一系列变化。\n\n### 成长\n\n故事中查理的成长来自于智力的提升,从一开始日记充满错别字,生活中处处受人嘲笑和欺凌而不自知,到后来错别字越来越少,句子越来越通顺,学到了越来越多的知识,逐渐开始认识和发掘自己,发现生活的美好和痛苦。\n\n> 有些常识的人都会记得,眼睛的困惑有两种,也来自两种起因,不是因为走出光明,就是因为走进光明所致,不论是人体的眼睛或心灵的眼睛,都是如此。——《理想国》\n\n成长的过程经常是残忍的,查理的经历也是我们成长的过程,我们也有从天真烂漫的童年开始逐渐理解这个世界黑暗面的经历,我们也会同样感到困惑和痛苦。\n\n书中有一段是查理变聪明过程中逐渐想起自己之前受人欺凌,当时却不知道发生了什么,还以为大家在跟他玩耍,查理明白过来之后感到非常悲伤。这让我想起我初中也有类似经历,当时我年龄比其他同学都小,经常被人欺负,但被欺负了还以为是自己“受欢迎”,以为大家就是这样相处的。\n\n成长又是必要的,因为它可以帮助我们认识自己,获得人性尊严和高级快乐。\n\n### 快乐\n\n> 我不知道哪种情况更糟:不了解自我但很快乐,还是实现理想但感到孤独\n\n笨查理在面包店工作,有一群“好朋友”,无忧无虑,感觉整个世界无比美好。但在变聪明过程中,各种问题和痛苦也随着出现,他感到他的工作没有意义,他的“好朋友”也因为无法捉弄他而离他而去,他还回忆起之前被朋友和陌生人嘲笑和捉弄、被家人抛弃的经历,得不到想要的爱情、尊严、存在意义,这些都让他感到痛苦,离快乐越来越远。\n\n快乐是我们生活的追求之一,但讽刺的是人的心智越成熟似乎越难获得快乐,我们在童年更容易获得快乐,长大后明明知道的更多、拥有的更多却变成了痛苦的大人。\n\n对此,我赞同[罗翔的观点](https://www.bilibili.com/video/BV1r7411o7XD/):快乐有质和量的区别,越能体现人性尊严的快乐,越是一种最大的快乐。最求高级快乐的过程中可能会遇到很多困惑和痛苦,但更能体现人性尊严和人生意义,这种快乐也是更强大和持久的。查理满足求知欲后的快乐和成功学会去爱的快乐是之前的傻乐无法相比的。\n\n~~同时我也觉得低级快乐必不可少,这也是为什么我也热衷于看涩图。~~\n\n### 爱情\n\n> 智慧是人类最伟大的恩赐之一,只是在追寻知识的过程中,对爱的追寻往往就被搁在一旁。这是我自己最近发现的结论。我可以把这个假设提供你参考:没有能力给予和接受爱情的智慧,会促成心智与道德上的崩溃,形成神经官能症,甚至精神病。而且我还要说,只知专注在心智本身,以致排除人际关系并因此形成封闭的自我中心,只会导致暴力与痛苦。\n\n最让查理困惑的一件事就是爱情,查理智商逐渐变高,但他面对爱情的无可奈何和困扰却没有改变,他发现了爱情与智商无关。\n\n小说中查理身边出现了两个女人。查理与邻居费伊相处纯粹、充满激情、无所顾虑,看似幸福美好,但费伊在发现查理变笨之后毅然离去。而与教授艾丽斯的感情要复杂得多,这也让查理发现了自己的心理问题,发现自己并没有爱与被爱的能力,真正的爱情与单纯的激情不同,查理与艾丽斯有着更深的羁绊,更愿意为对方做出牺牲,艾丽斯在查理变笨之后不离不弃,查理失去记忆之后最关心的仍然是艾丽斯。作者通过两人的对比深刻地诠释了激情和爱情的区别。\n\n> 艾丽斯又一次来到门口但我说走开我不要见你。她哭了起来我也跟着哭但我不让她进来因为我不要她朝笑我。我告诉她我不在喜欢她而且我在也不要变聪明。这不是真的。我仍然çˆ
318±å¥¹ä»ç„¶æƒ³è¦å˜èªæ˜Žä½†æˆ‘必须这样说才能让她离开。穆尼太太告诉我艾丽斯带了更多钱要来照故我并且付房租。我不要我必须去找工作。\n\n> 今天我做了一件很笨的事我忘了我已经不在纪尼安小姐的成人中心班级上课。我走进去坐在教室后面的老位子上她看到我时表情很怪然后问说查理你都到那里去了。所以我说哈罗纪尼安小姐我今天已准备好要上课只是我弄丢了我们在用的书本。她开始哭起来并且跑出去教室。大家都转头看我而我发现很多人都不是我以前班上的同学。......那就是我为什么要永远离开这里去沃伦之家的原因。我不要在做出这样的事来。我不要纪尼安小姐为我难过。我知到面包店里的每个人都为我难过但我也不要这个。\n\n这段真的绷不住。\n\n### 人生意义\n\n> 我来到这个世上,无非是想要明白些道理,遇见些有趣的事。倘能如我愿,我的一生就算成功。——王小波\n\n日记再次出现错别字,命运残忍地剥夺他所珍惜的光明生活和美好记忆。\n\n虽然查理的结局并不那么美好,崩塌的过程充满痛苦、挣扎和绝望,但他绝不后悔进行了智力提升手术,他学会了爱与被爱,与过去的自己和解,更好地认识了自己,体会到了生活的酸甜苦辣,明白了很多道理,即使这些最终都将消失。就像我们的人生充满意义,即使我们也总有一天会死亡会归于尘土。\n\n> 找到我完整存在的意义,除了要掌握过去,也得知道未来的可能发展,不仅要知道自己来自何方,也得知道会去哪里。虽然我们知道,在迷宫尽头等着我们的是死亡。我现在认为,我在迷宫中选择的道路造就了现在的我。我不只是一件事物,也是种存在方式,众多方式的一种,了解自己选择的道路,以及那些我没踏上的道路,都能够协助我了解自己的转变。\n\n> 纪尼安小姐如果你有机会读到这个请不要为我难过。我很感机我就像你说的得到生命中的弟二次机会。因为我学到很多我以前甚至不知到这世界上真的存在的事情。我很高兴能够看到这些即使只是很短的时间。我很高兴我发现了所有关于我的家人和我的事。好像在我想起他们并且看过他们之前我并没有家人似的但现在我知到我有家人而且我和大家一样也是一个人。\n\n虽然死亡无法避免,但我们可以在阿尔吉侬坟前放上一束花束,证明我们曾经有意义地来过成长过。\n\n💐"},{"slug":"xlog","title":"第一个开源链上博客系统 xLog","tags":["新坑"],"body":"## Talk is cheap\n\nGitHub:https://github.com/Crossbell-Box/xLog\n\n官方实例:https://xlog.app\n\n使用案例\n\n- https://blog.rss3.io/\n- https://blog.diygod.me/\n- https://usagiryu.com/\n- https://crossbell-blog.xlog.app/\n- https://song.xlog.app/\n- https://atlas-thinking.xlog.app/\n\n## 动机\n\n我的[个人博客](https://diygod.me/)已经运行了接近 9 年,跟着我慢慢发展,现在几乎已经成为了我的个人发展史,折腾博客也从很久以前就成为了我的一个爱好,但随着对 Hexo 的越来越不满,我决定做一个更现代化的全新的博客系统。\n\n我不想仅仅满足自己的需要,它需要开源和足够开放,来满足更多人的需求。\n\n我不想让我珍贵的数据被中心化平台绑架,又不想麻烦维护一个数据库或服务器,它需要兼顾数据所有权和便利,所以我选择了区块链。\n\n最后,它需要使用较新的技术栈,提供一个更好的开发和维护体验。\n\n## 功能\n\n区块链,所有博客数据,包括网站é
318…ç½®ã€æ–‡ç« ã€å…³æ³¨ã€è¯„论、点赞等,都由你签名并存储在区块链上,以 NFT 的形式存在,只能由掌管私钥的你自己控制。\n\n> 与 [Mirror.xyz](https://mirror.xyz/) 的区别:狡猾的一点是,Mirror 是通过他们的官方账号而不是用户自己发起的交易把内容存到了链上。这使得用户需要依赖 Mirror 这个中心化平台才能发布和修改自己的内容,内容在链上的控制权也是属于 Mirror 平台而不是用户自己。\n\n![xlog4](./attachments/bafkreidazbwui2bqm6crk54qadjwvfjycvxzojwuakyfn4q5aitvlr773a.png)\n\n丰富的交互,你可以在区块链上关注你喜欢的博客,评论、点赞文章或把文章铸造为 NFT。\n\n![xlog2](./attachments/bafkreigh527mnc7p5w26f2mf3caazlsy36dkutjfhhok6vkphzi4li6tly.png)\n\n高度可定制,自定义域名、导航栏、自定义样式等,当然,它们都是存储在区块链上的。\n\n![xlog3](./attachments/bafybeieqgy3ebpjkikgue6tb4nayypyishoiny6pf5knthwbobn3to6qce.png)\n\n## 技术实现\n\nxLog 基于另一个开源项目 [proselog](https://github.com/proselog/proselog) 开发,使用 Next.js + Tailwind CSS + TypeScript + TanStack Query 构建,有着完善的 SPA、SSR、状态管理和优秀的开发体验。\n\n区块链使用的是专用于社交活动的 EVM 兼容区块链 [Crossbell](https://crossbell.io/),速度更快且无需购买 gas 免费使用。还能与 Crossbell 其他生态项目无缝衔接,比如你就可以在 [Crossbell.io feed](https://crossbell.io/feed) 上以信息流的形式查看你订阅的所有 xLog 的动态。\n\n每个博客都是一个属于你的 NFT,它的配置和文章都以符合 Crossbell 规范的格式存储在 NFT 中。创建一个博客就是 mint 一个 NFT,发布一篇文章或一条评论就是对 NFT 增加一项内容,关注一个博客就是修改你的关注列表 NFT。\n\n它是完全开源的,如果感兴趣可以直接去 GitHub 看源码。\n\n## 存在问题\n\n1. 需要安装一个以太坊钱包才能进行操作,这对没有接触过区块链概念的普通用户可能是一个较大的负担。虽然区块链是一个非常适合的解决方案,但目前区块链在很多普通人眼中已经与割韭菜、炒币画上等号,这更增加了选择区块链作为实现的 xLog 被广泛接受的难度。\n2. 链上操作都是透明和不可撤销的,这导致用户无法真正删除一篇文章,通过区块链历史可以看到文章的修改记录。\n\n## 未来计划\n\n目前还只是一个最小化可用产品,功能可能还不太丰富,但未来会增加主题系统和插件系统,来提供更丰富的样式和功能选择。\n\n另外还计划在获取收益和博客之间的连接上做更多探索,希望可以让写博客(~~而不是折腾博客~~)这件事变得更有趣一些。"},{"slug":"uk-travel-lake-district","title":"英国旅游VLOG | 英格兰湖区","tags":["vlog"],"body":"🗓 2022 å¹´ 4 月 10 日 - 2022 å¹´ 4 月 14 日\n📍 The Lake District in North West England"},{"slug":"obsidian","title":"基于 Obsidian 的生活记录系统","tags":[],"body":"正如我在 [2020 年终总结](/2020) 中提到,我一直在用 Notion 写子弹笔记,现在它有了亿点点不一样,现在我们就来重新窥探一下我目前的生活记录系统\n\n**日记**\n\n![image](./attachments/bafybeibmsjjzstiylsmrkmgn5xa2ppoyoqdpazxzuzpkomkdydsb2utbli.png)\n\n**周记**和**月记**\n\n![image](./attachments/bafybeihh2bollhn2r5c72d4vicl4jyudakiqkowozmwm66zh4rrqjdqssa.png)\n\n**å¹´è®°**\n\n![image](./attachments/bafybeiflctmxmg3fcjijwzdfa5xcaaxafadvvqhasslpsb6ahybg5gtmeu.png)\n\n原 Notion 子弹笔记\n\n<div style=\"width: 50%\" >\n<img src=\"./attachments/bafybeie4dklkwdhw7ch3hcrucsj4oanecti53px7i454kaeeihkyjsfjy4.png\" />\n</div>\n\n受益于 Obsidian 强大的自动化能力和极高的自由度,日/周/月/年笔记通过预设模板自动生成,互相联动,需要手动处理的部分很少\n\n全部文件已上传至 GitHub:<https://github.com/DIYgod/DIYgod-Obsidian-Starter>,包括主题、插件、配置文件、自己定制的样式、模板文件、示例文件等,只是作为一个示例,请根据自己实际情况修改\n\n这些东西乍一看是有一些复杂,但其实用起来很简单,自由度和可扩展性也很强,下面我来详细介绍\n\n## 结构\n\n目录结构如日记图左侧栏所示\n\n```\n├── OKR.md\n└── Journal\n    └── 2022\n        ├── W1\n        |   └── 2022-01-01.md\n        |   └── 2022-W1.md\n        ├── 2022-01.md\n        └── 2022.md\n```\n\n每天会自动在本周的文件夹中生成当天的日记文件 `YYYY-MM-DD.md`,每周会自动新建一个周文件夹 `[W]ww` 和周记 `YYYY-[W]ww.md`,每月会自动生成月记 `YYYY-MM.md`,每年会自动新建一个年文件夹 `YYYY` 和年记 `YYYY.md`(更正:不是自动,仍然需要命令面板手动触发)\n\n这些文件的内容也都是模板预设好的,已经自动填充了日期、本周期 OKR 分数和图表,甚至当天的位置、天气、月相等信息,还留出了记录当天状态和动态的位置\n\n外面有一个 OKR 文件,大概半年更新一次,里面记录这半年的人生目标,其中有一些目标是需要每天持续努力的,日记系统的很大部分就是围绕这些目标来构建的\n\n目录结构主要通过 [Periodic Notes](https://github.com/liamcain/obsidian-periodic-notes) 实现,模板主要通过 [Templater](https://github.com/SilentVoid13/Templater) 和 [Dataview](https://github.com/blacksmithgu/obsidian-dataview) 和核心插件 Templates 实现\n\n## 日记\n\n![image](./attachments/bafybeibmsjjzstiylsmrkmgn5xa2ppoyoqdpazxzuzpkomkdydsb2utbli.png)\n\n### Info\n\nInfo 是自动生成的当天信息,包括指向年月周记和 OKR 的链接,位置、天气、月相等信息\n\n位置、天气、月相信息来自 Templater 的调用系统命令功能\n\n获取位置和天气\n\n```sh\ncurl wttr.in/\"$(curl -s --header \"user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36\" https://api.ip.sb/geoip | /opt/homebrew/bin/jq -r \".city\" | sed 's/ /%20/')\"\\?format=\"%l+%c%t\"\n```\n\n获取月相\n\n```sh\ncurl wttr.in/\"$(curl -s --header \"user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36\" https://api.ip.sb/geoip | /opt/homebrew/bin/jq -r \".city\" | sed 's/ /%20/')\"\\?format=\"%m\"\n```\n\n### OKR Tracker\n\nOKR Tracke 跟踪记录当天当前阶段的 OKR 完成状况,比如 `Sleep:: 10.3` 代表今天睡了 10.3 小时,`Healthy Eating:: 5` 代表今天吃得很健康,`::` 是 Dataview 语法,会给当前页面增加\n\n```js\npage = {\n    ...\n    \"Sleep\": 10.3,\n    \"Healthy Eating\": 5,\n}\n```\n\n这样的属性,方便接下来在周月年记中做分析和处理\n\n其中 O1 KR2 下有一个特殊的列表,通过 API 展示了当天 Toggl Track 数据, Toggl Track 是一个时间记录应用,记录我每天在各项事务中花费的时间,比如看番时间、刷B站时间、工作时间等,这些数据同样可以反映我今天的生产力是否符合预期\n\n### Notes\n\n这里是真正写日记的地方,多数是一些流水账,来弥补我天生糟糕的记忆力,偶尔也会写一些想法\n\n## 周记和月记\n\n![image](./attachments/bafybeihh2bollhn2r5c72d4vicl4jyudakiqkowozmwm66zh4rrqjdqssa.png)\n\n### Jornal List\n\nJornal List 是自动生成的本周/月全部日记的列表,通过 Dataview 实现\n\n获取全部日记\n\n```js\n// Week\nwindow.pages = dv\n  .pages(`\"${dv.current().file.folder}\"`)\n  .where((p) =>\n    p.file.name.match(\n      new RegExp(`${dv.current().file.name.split(\"-\")[0]}-\\\\d{2}-\\\\d{2}`),\n    ),\n  )\n  .sort((p) => p.file.name);\n\n// Month\nwindow.pages = dv\n  .pages()\n  .where((p) =>\n    p.file.name.match(new RegExp(`${dv.current().file.name}-\\\\d{2}`)),\n  )\n  .sort((p) => p.file.name);
318\n```\n\n渲染列表\n\n```js\ndv.paragraph(window.pages.file.link.join(\", \"));\n```\n\n### Summary\n\n这里是月末做总结和反思的地方,对应日记里的 Notes\n\n### OKR Tracker\n\n在这里处理和分析全部日记里的 OKR 数据,最后生成分数,对应日记里的 OKR Tracker\n\n它通过 Dataview 实现,以睡眠为例,≥ 6.5 小时且 ≤ 8.5 小时计为有效睡眠,有效睡眠天数占总天数的百分比即为得分\n\n```js\nlet count = 0;\nlet total = 0;\nfor (let page of window.pages) {\n  if (page[\"Sleep\"]) {\n    count++;\n    if (page[\"Sleep\"] >= 6.5 && page[\"Sleep\"] <= 8.5) {\n      total++;\n    }\n  }\n}\nconst score = ((total / count) * 100).toFixed(2);\ndv.el(\"div\", score + \"%\", {\n  cls:\n    score > 80 ? \"score-class1\" : score > 50 ? \"score-class2\" : \"score-class3\",\n});\n```\n\n再自己加一点 CSS,> 80 分显示为绿色,50-80 分显示为黄色,< 50 分显示为红色,这样就可以很清楚看出本周/月的睡觉情况,图里是黄色区间,不太好但还可以接受,下个月需要多留意\n\n### Statistics\n\n在这里把睡眠和运动数据生成统计图,可以清楚看出睡眠时长还是挺不稳定的,运动天数和时长都很少\n\n统计图通过 [Obsidian Charts](https://github.com/phibr0/obsidian-charts) 绘制,睡眠统计图代码如下\n\n```js\nconst times = [];\nfor (let page of window.pages) {\n  times.push(page[\"Sleep\"]);\n}\n\nconst chartData = {\n  type: \"line\",\n  data: {\n    labels: window.pages.file.name.array(),\n    datasets: [\n      {\n        label: \"Sleep Time\",\n        data: times,\n        pointBackgroun
318dColor: \"#6c40d6\",\n        borderColor: \"#6c40d65c\",\n        tension: 0.4,\n        spanGaps: true,\n      },\n    ],\n  },\n  options: {\n    scales: {\n      y: {\n        type: \"linear\",\n        min: 2,\n        max: 13,\n      },\n    },\n  },\n};\n\nwindow.renderChart(chartData, this.container);\n```\n\n### Finance\n\n本月的财务数据饼状图,通过 MoneyWiz 生成\n\n## 年记\n\n![image](./attachments/bafybeiflctmxmg3fcjijwzdfa5xcaaxafadvvqhasslpsb6ahybg5gtmeu.png)\n\n年记与周记月记相似度也很高,但通过扩大时间尺度,可以得出很多新的有用结论\n\n比如同样的睡眠和运动统计图,在年的尺度里就可以看出我是在 5 月底睡眠开始失控,在这期间运动也中断了,又从 6 月中旬得到缓解\n\n还有新的体重体脂统计图,可以看出我的体重和体脂都在稳步下降,健康状况有明显改善\n\n年记还出现了新的一种热图,记录达到目标的日子,通过 [Heatmap Calendar](https://github.com/Richardsl/heatmap-calendar-obsidian) 绘制,以睡眠为例\n\n```js\nconst calendarData = {\n  entries: [],\n};\n\nconst pages = window.pages\n  .where((p) => p.Sleep && p.Sleep >= 6.5 && p.Sleep <= 8.5)\n  .sort((p) => p.file.name);\n\nfor (let page of pages) {\n  calendarData.entries.push({\n    date: page.file.name,\n    intensity: page.Sleep,\n  });\n}\n\nrenderHeatmapCalendar(this.container, calendarData);\n```\n\n## 局限\n\n子弹笔记有一个很重要的任务清单模块,如上面子弹笔记截图所示,我之前会把一周的任务清单都提前写在笔记里,但现在日记都是当天自动生成,无法提前计划,所以我把任务清单都改用了滴答清单来管理,滴答清单当然也很好用,但是这样就少了与日记的联动,手动添加又会造成很多重复工作,就不是很爽\n\n最后需要注意的是,即使有这样的生活管理系统也不意味着生活就会一切按照预期,就像上面举例的 5 月底睡眠失控事件,一旦放松失控仍会发生,笔记会告诉我生活正在失控,但如何回到正轨和追赶上 OKR 还是要靠自控力和坚持的定期总结、反思和改进"},{"slug":"uk-travel-hp","title":"英国旅游VLOG | 发小带你逛哈利波特制片厂","tags":["vlog"],"body":"🗓 2022 年 4 月 19 日\n📍 Warner Bros. Studio Tour London - The Making of Harry Potter"},{"slug":"unidata","title":"💡 Unidata - 提供人类友好的 Web3 数据的便捷访问","tags":["新坑"],"body":"Web3 的魅力在于数据属于用户自己,但由于区块链低效的效率和设计,再加上数据格式标准的缺失,访问和展示自己或用户的 Web3 数据是一件极度困难的事情。所以我做了开源项目 [Unidata](https://unidata.app/),给 Web3 开发者提供人类友好的 Web3 数据的便捷访问。\n\nEthereum NFT 数据是目前 Web3 最常使用的数据,所以我使用 Ethereum NFT 来举例。<!--more-->\n\n1. Ethereum NFT 使用 EIP-721 标准,它的数据格式非常“灵活”,比如一个 NFT 的图片可能根据发布者不同的喜好使用 `image` `image_url` 或 `animation_url` 等各种不统一的字段,甚至根本不是一个图片,还可能是视频、3D 模型等,这给前端展示带来了很多麻烦。\n\n2. 获取一个地址拥有的全部 Ethereum NFT 也非常麻烦,由于 Ethereum 的设计,想要获取它需要读取这个地址的全部交易记录,而且 Ethereum 不止主网,还有 Polygon、BSC、Arbitrum、fantom、Gnosis 等各种侧链,这对前端是一个不可能的工作,目前各种各样的数据索引服务可以部分解决这个问题,但这些服务返回的数据格式各不相同、功能各有优劣、各支持了不同的链,应该如何选择呢?\n\n针对第一个问题,Unidata 设计了一系列友好和统一的数据格式,分为 Profiles、Links、Assets、Notes 四个部分。Ethereum NFT 属于 Assets 的格式。通过 Unidata 返回的固定的数据格式,前端不再需要做麻烦的适配混乱的数据格式的工作。\n\n另外值得一提的是不止 Ethereum NFT,Unidata 目前还支持了 Solana NFT,Ethereum NFT 和 Solana NFT 的数据格式也是统一的,Unidata 还将继续支持更多的 Assets 来源,他们的格式也都会是统一的。\n\n解决完第一个问题,第二个问题也就很容易解决了。Unidata 的做法是把各个服务返回的数据统一成相同的格式并做聚合。比如 OpenSea 服务支持了主网,Alchemy 服务支持了 Polygon,Moralis 服务支持了 BSC、Arbitrum、fantom,POAP 服务支持了 Gnosis 链的 POAP NFT。通过 Unidata 一行代码就可以同时使用这些服务同时获取到主网、Polygon、BSC、Arbitrum、fantom、POAP 的所有 NFT 了。可以[在这里看在线演示](https://unidata.app/guide/assets/ethereum-nft/#live-demo)。\n\n![image](./attachments/bafkreia6rkmk4isy3emsmi6irq52la6o5w7shzmaysegavtacqhqv3bvdi.png)\n\n除了 Assets,Unidata 还有 Profiles、Links、Notes 三个部分。\n\n[Assets](https://unidata.app/guide/assets/) 目前支持了 Ethereum NFT(Mainnet、Polygon、BSC、Arbitrum、Fantom、Gnosis、POAP)、Solana NFT、Alchemy、Solscan、Moralis、OpenSea。\n\n[Notes](https://unidata.app/guide/notes/) 目前支持了 Mirror Entry、Ethereum NFT Activity(Mainnet、Polygon、BSC、Arbitrum、Fantom、Gnosis、POAP)、RSS3。\n\n[Profiles](https://unidata.app/guide/profiles/) 目前支持了 ENS、Crossbell、Infura。\n\n[Links](https://unidata.app/guide/links/) 目前支持了 CyberConnect。\n\n还有很多正在不断添加中,可以[在文档看目前支持的所有服务和数据源](https://unidata.app/guide/#supported-sources)。\n\n[![GitHub Org's stars](./attachments/Unidata?style=social.svg+xml)](https://github.com/DIYgod/Unidata) [![Discord](./attachments/968954680514342973?label=Discord&logo=discord&style=social.svg+xml)](https://discord.gg/ggrfhdS9Fe) [![Twitter Follow](./attachments/Unidata_?style=social.svg+xml)](https://twitter.com/Unidata_)\n\n![image](./attachments/bafybeicuh3kxrw44ta2cg6emxlx2rm4
318nnuar5lova6locq5cr4637vbni4.png)"},{"slug":"job","title":"RSS3 提供最酷最理想最自由的开源远程工作","tags":[],"body":"> “如果有天堂,那一定是图书馆的模样。那里信息自由地流通,书籍自由地出版,人与人自由地讨论。”\n\n人类生产,传播和分发信息的权利不应该被掌握在任何数据和互联网平台手中,这是属于数字人类的基本权利\n\n我们都意识到现在互联网还与这种理想相差甚远,如果你愿意为它做出亿点点改变,一起来吧 🌍\n\n<!--more-->\n\n## 我们是谁?\n\n我们是 Natural Selection Labs 自然选择实验室,致力于打造一个信息自由流通的互联网\n\n我们**所有作品都会开源**在 GitHub:[https://github.com/NaturalSelectionLabs](https://github.com/NaturalSelectionLabs)\n\n我们致力于信息自由所以当然也会帮助成员自身获得最大的自由度:\n\n我们是个分布式组织,所有成员都是**远程工作**,成员分布在中国、日本、新西兰、英国、美国、加拿大等地,我们鼓励成员自由流通,不管在哪,我们都会尽力提供包括但不限于签证绿卡移民协助和可以在当地自由舒适生活的待遇\n\n我们提倡**弹性工作时间**,喜欢白天睡觉晚上工作或者白天玩耍晚上工作的机械人也完全没问题\n\n我们有足够的资本并对符合我们期望的人才有着最大的尊重和毫不吝啬的待遇\n\n我们成员目前包括业余民谣说唱歌手 [St.Z 桑藤](https://music.163.com/#/artist?id=12701196),会时间穿梭的自由开源追寻者 [Atlas](https://atlasoin.xyz),情商最高的 [Usagi](https://tuzi.moe),最会照顾猫猫和生活的 [Anny](http://zui-c.com) ,42k GitHub Star 的萌新 [DIYgod](https://github.com/DIYgod),把我们聚在一起却天天装菜的 [Joshua](https://joshua.rss3.bio/),一个顶十个什么都会的[糖喵](https://candinya.com),稳重靠谱又捧场的 Albert ,温柔直男嘉多,低调有趣的囧囧 Raina 星阳......\n\n可以点[这里](https://gather.town/invite?token=qK0VM80sY7Aj0-hbBUCLaRt7qg6m55W2)参观我们的线上办公室\n\n![image](./attachments/bafybeigbpf3scjdikprruh25nbnlx37tdol4mchqleti5frqsx7joguriu.png)\n\n## 我们具体在做什么?\n\n喊口号、做梦人人都会,但再远大的理想也需要一步步脚踏实地来实现,这也是为什么我们需要更多志同道合的成员,我们目前做了这些工作,但还有很多工作只靠现有的力量很难完成\n\n### RSS3\n\nRSS3 源于 RSS ,是 Web3 时代的信息流。作为 Web 3.0 时代的信息分发开放协议,它通过提供内容、分发渠道与经济环境,旨在成为未来社交、内容、游戏和电子商务应用的支柱\n\n官网:[https://rss3.io](https://rss3.io)\n\nGitHub:[https://github.com/NaturalSelectionLabs/RSS3](https://github.com/NaturalSelectionLabs/RSS3)\n\n### Web3 Name Service\n\n一个为 Web3 世界提供的兼容包容的用户名服务,致力于兼容所有用户名协议,包括 ENS 和 RNS ,为 RSS3 或任何需要用户名的 Decentralized application 提供基础服务\n\nGitHub:[https://github.com/NaturalSelectionLabs/Web3-Name-Service](https://github.com/NaturalSelectionLabs/Web3-Name-Service)\n\n### Web3 Pass\n\nRSS3 协议 v0.2.x 的落地探索产品\n\n> RSS3 Bio - 你在 Web1 中有个人网站,在 Web2 中有 Twitter 和 Instagram 页面,现在在 Web3 中有 RSS3 Bio\n\n官网:[https://rss3.bio](https://rss3.bio/)\n\nGitHub:[https://github.com/NaturalSelectionLabs/Web3Pass](https://github.com/NaturalSelectionLabs/Web3Pass)\n\n### Re: ID\n\nRSS3 协议 v0.1.x 的落地探索产品\n\n> Re:ID 是一个浏览器扩展,可以将你的推文同步到属于你的基于加密的 RSS3 文件中。\n\n官网:[https://reid.town](https://reid.town/)\n\nGitHub:[https://github.com/NaturalSelectionLabs/Re-ID](https://github.com/NaturalSelectionLabs/Re-ID)\n\n### Revery\n\nRSS3 协议 v0.3.x 的落地探索产品,目前主力开发中\n\nå
318®˜ç½‘å’Œ GitHub 暂无\n\n### RSS3-Hub-Data\n\n在分布式节点上线之前,通过在 GitHub 公开所有 RSS3 用户数据来实现信息自由和公开,截止写这篇文章时有 13000+ 用户,51000+ 条关系,643000+ 条资产,可以在[这里](https://dashboard.rss3.dev/)和[这里](https://github.com/NaturalSelectionLabs/RSS3-Hub-Data/blob/main/statistics/overall.json)查看实时统计数据\n\nGitHub:[https://github.com/NaturalSelectionLabs/RSS3-Hub-Data](https://github.com/NaturalSelectionLabs/RSS3-Hub-Data)\n\n另外还有 RSS3 配套的 SDK 、Hub 、插件等,可以在团队的 [GitHub](https://github.com/NaturalSelectionLabs/RSS3) 找到更多,也可以通过[博客](https://www.notion.so/fcbc0cea4cc4487c88f1872066254bf3)和 [Twitter](https://twitter.com/rss3_) 更多地了解我们\n\n## 我们会给你提供什么?\n\n- 直接参与互联网底层革命、让世界变得更好的机会\n- 与世界顶级的 Web3 项目会面和合作机会\n- 一群有爱且有实力的小伙伴\n- 一个作品**全部开源**的开发方式\n- 一个可以**永远远程**、兼顾诗与远方、时间灵活的工作模式\n- 非常有竞争力,让你远离”生活的苟且“的薪酬\n- 一堆超暖心的神秘福利大礼包\n- 生活、签证、绿卡、移民协助\n- 不限制国籍、爱好或任何个人喜好... LGBTQ+ 群体友好\n- 轻松的氛围。我们为我们的团队创造的文化感到自豪\n- 一个老了之后可以和孙辈讲的故事 :D\n\n## 我们希望你?\n\n- 认同我们的价值观,相信人类能够有并且需要有更健康,更公正的方式来生产,传播和分发信息\n- 对信息自由流通的目标有足够的热情和觉悟\n- 超越同龄人的编程 /设计能力\n- 积极主动、活跃的思维能力,不是期望当个无脑的工作机器、螺丝钉\n- 非常强的学习能力和意愿,可以快速上手未知领域\n- 有足够的勇气挑战陈旧规则和建立新事物\n- 正常人的沟通和合作能力\n- 对 Web3.0 领域有基础的了解和认知\n- 对团队和结果负责,自律,有分析能力,有协作精神\n- 有基本的英语听说读写能力\n- 一份可以让我们更好了解你的简历\n\n## 我们需要的技能?\n\n- **前端**:熟练使用 Vue React 之一;参与过开源项目\n- **全栈**:熟练使用 Vue React 之一;熟练使用 Node.js ;熟练使用 Go 或可以快速上手;参与过开源项目\n- **去中心化系统**: 有密码学计算机网络理论基础,熟练使用 Go Node.js 之一或可以快速上手,关于去中心化系统有独立的想法,如理论、设计、未来、场景等等;参与过开源项目\n- **移动端**:目前只限 iOS 或 Android 高级开发工程师,有能力负责和带领一个完整产品的开发;参与过开源项目\n- **运营**:至少两年全职互联网运营工作经验 参与过分布式、区块链项目的运营|实习、应届 ⇒ 市场营销学、传播学 加分项 conjoint or double major 计算机科学、软件工程\n- **市场**:至少两年全职商业拓展、市场工作经验 参与过分布式、区块链项目的商业拓展、市场工作 | 实习、应届 ⇒ 商业、市场营销 加分项 conjoint or double major 计算机科学、软件工程\n- **设计**:一份漂亮的作品集\n- **行政助理(实习)**:灵活的应变和解决问题的能力,效率极高的聪明人\n\n**简历投递地址: [email protected]**\n\n```\n♛\n    ●          ●\n     '''    ╲╱     '''\n```\n\n我相信你一定会成为最伟大的国王!波吉!"},{"slug":"2020","title":"2020 年终总结","tags":["年终总结"],"body":"今年对很多人来说都是非同寻常的一年,对我更是如此\n\n### 🦠 新冠疫情\n\n1 月爆发的新冠疫情直到今天还在持续,疫情初期的恐慌和绝望还历历在目:1 月 20 日一夜之间全国的口罩和板蓝根双黄连被抢购一空、互联网完全被负面疫情话题占据、感染人数像火箭一样猛增、前线防护用品严重紧缺、专家组成员被感染、武汉封城、阳台上穿着睡衣敲锣救母的女儿、追着救护车撕心裂肺喊妈的姑娘、绝望的方舟医院、躲在家里不敢点外卖吃了几个星期的自热米饭...\n\n与疫情相关的事件也太多了,其中有几件让我印象深刻:吹哨人李文亮被训诫、感染人数被隐瞒、捐给红十字会的防疫物资被优先供应政府官员而不是一线医护人员、#我们要言论自由# 话题在微博昙花一现、一名年轻人在方舟医院病床上读《政治秩序的起源》、国家大力推广“治疗”肺炎的中药制剂、公司在不供应口罩的情况下要求第一天就复工、五个一政策和对留学生的妖魔化、患者被曝光隐私和被网暴...\n\n不过幸运的是,情况也正在好转,国内疫情早已被基本控制住,辉瑞疫苗也在开足马力生äº
318§å¹¶å·²ç»åœ¨è‹±å›½ã€ç¾Žå›½æŠ•入使用,2021 夏季前一定都会好起来的\n\n### 🏝 动物森友会\n\n3 月 19 日动森发售,毫不夸张地说,玩动森的那一个月是我短暂的 25 年生命中最快乐的时光之一,原因不仅在于游戏本身很棒,更重要的是它还让我结识了一大群有趣的朋友(具体内容见[《我的动森日记》](https://diygod.me/animal-crossing/)),每天跟一群朋友到处串门,互送礼物、写信,一起钓鱼、看流星雨、炫耀自己的新衣服,交流大头菜走势,看谁岛上又来了骆驼商人和流星雨、谁岛上又搬进来了可爱的小动物、谁岛上有好看的家具可以摸摸...如果今天没有什么新鲜事,四五个人围着一个火把也可以玩一晚上,不联机时我就自己在岛上漫无目的地转来转去,去找小动物说说话,去小动物家串串门,习惯了现实压力和快节奏生活的我在这里发掘完全不一样的自己\n\n可惜快乐的时光总是很短暂,有游戏的原因,也有玩家们的原因,一个月后,新鲜感褪去,大家逐渐回归现实生活,留给动森的时间越来越少,我也渐渐不再打开动森,跟很多朋友也渐渐失去了联系\n\n虽然知道不可能回到那段时间了,天下没有不散的筵席,道理我都懂,但我还是一直无法释怀,幻想着有一天再次打开动森,岛民和朋友还在那里,什么都没有变\n\n不会奢求不再遇到这种事,只是希望下次再遇到时可以更从容地面对\n\n### 🇬🇧 留学\n\n7 月 12 日早上,一件可怕的事情打破了我短暂两个月的平静生活,两名自如中介趁我睡觉,在自如官方的授权下,用自如官方给的后门密码打开了我的房门并入侵我卧室,名曰做“安全检查”,之后我用尽全力通过舆论、行政和司法途径维权但处处碰壁,遇到了很多魔幻的事情,最后我终于意识到不管怎么努力这件事都不会有一个好结局,所以权衡利弊后我放弃了维权,同时决定移民\n\n当然不是单单被入侵卧室和维权碰壁这一系列事情让我做出移民的决定,它们只是一个导火索,原因有很多,但归根结底都指向同一件事:法治\n\n能保护公民住宅不受侵犯的是法治,能保护劳动者不被 996 ICU 的是法治,能保护新冠患者隐私不被传得满大街的是法治,能保护公民不被口袋罪随意处罚的是法治,能保护公民各项基本权利和自由的也是法治\n\n法治的缺席会导致很多问题,它不仅体现在权利无法得到保障,还体现在民众之间稀缺的法律意识和互相尊重上,而这由于国情的原因是不能够轻易改变的,罗翔曾经在一个节目里说到法治的形成:「很大程度上,法治是自上而下和自下而上结合的过程,法治首先强调权力本身是要受到约束的,然后在这样的一种约束的背景下,慢慢地其他人也会愿意去约束自己,它是一个双向的过程,它不可能是一个单向的」\n\n我很清楚移民意味着什么,它会把我多年的积累化作经济学里的沉没成本,迅速耗尽我工作多年积攒的全部积蓄、使我被迫改变很多爱好和生活习惯、让我失去大部分朋友和人脉,我甚至无法确定它是一个正确的选择,但是,《进击的巨人》第一季也告诉我们:「人若不能有所舍弃,就无法改变现状」,现在正是那需要勇敢的时刻\n\n规划是这样的:英国留学 (→ 英国工作)? → 加拿大工作 → 加拿大绿卡 → 加拿大入籍,最快 2029 年可以完成\n\n这里留个空给 2024 年回答:枫叶卡还顺利么?\n\n- [ ] 顺利\n\n到目前为止一切都很顺利,除了前期规划走了一些弯路,留学准备比我想象中简单得多,现在已经向六所大学提交了申请,在等 offer;发小已经拿到了两个 offer;酸奶约好了寄养在英国的 Henry 家里。明年的这时候应该在英国的某个角落愉快地过圣诞节了吧\n\n在某种程度上,我很庆幸发生了这件事,还好是在 25 岁而不是 35 岁,它让我脱离了危险的舒适区、寻求反思和改变,变得更强大了,正如最近看的《原则》里说的:「有时候,可怕的事情发生在我们身上,它可以毁掉我们,也可以让我们变得更好,这取决于我们如何处理它们」。如果没有遇到这件事,我可能会一直沉迷在现在的舒适区,觉得铁拳永远不会砸到自己,像之前每年的年终总结一样写道:啊,今年又是一事无成也没有什么想法的一年,再加一点凡尔赛式的无病呻吟([《2019 我做了什么》](/2019/)、[《2018 年终总结》](/2018/)),直到最后想改变现状也无力回天了\n\n### 🗓 子弹笔记\n\n没了舒适区,我的生活也变得有条理了起来,我开始了写子弹笔记,定期总结自己做的事情并给下个周期做计划,它大概长这样:\
318n\n![image](./attachments/bafybeie4dklkwdhw7ch3hcrucsj4oanecti53px7i454kaeeihkyjsfjy4.png)\n\n周笔记右上角会写上本周要完成哪些事情,再往下有每天的 To Do List 和 Notes,再往下是一个 Habit Tracker 表格,量化每天的状态,每周结束后在开头写上本周的总结和计划下周要完成哪些事情;每个月结尾写月总结\n\n适时的量化自己,真的是很好的自省方式,特别是对我这种记忆力不好的人,除了使我对自己有了更清晰的认知和反思,它还通过每天的提醒和数据量化帮助我培养了一些好习惯和改掉一些坏习惯\n\n通过做这些事我还懂得了一个道理:要做好一件事或培养一个习惯,最关键是找到自己发自内心的足够强大的驱动力,并不要忘记它,以运动为例,「改善日益糟糕的健康状况,降低猝死风险」的驱动力就比「我要变瘦」有用得多,后者就有很大可能会失败\n\n### 💻 数字生活\n\n**开源**\n\n受自如事件的影响,从 GitHub Contributions Calendar 可以看出 7 月是个很明显的分水岭,7 月后 RSSHub 都是 Henry 在维护\n\n![image](./attachments/bafybeid6tllx7l5oc4ic7jil5cmll5zpmnbek3exwl6wh533cp6gsnd3ee.png)\n\n**NAS**\n\n6 月的时候从群晖 DS2018play 换到了威联通 TS-453Bmini,有了 Docker 可玩性大大变高了\n\n安装了 [Jellyfin](https://jellyfin.org/) 做媒体库,它可以自动生成很详细的元数据,在 Android TV、iPad、Web 上都有着一致且不错的体验\n\n![image](./attachments/bafybeigt7w7ix33ycplwpjpjzrhjctrrotrton43nu3gev2qncpobehxwa.png)\n\n![image](./attachments/bafybeidnclcajrc4m6gpebeon7n5xivgwuaw3lzrk4zcc2tkmh4b3wphnu.png)\n\n![image](./attachments/bafybeig5x67daiiu63u5kyq44m5t4ojoxd6c23julishkh4ktopo3n7q5y.png)\n\n搭了个旁路网关,从而同时支持了路由器级的 Clash 和 AdGuard\n\n![image](./attachments/bafybeib2lra35b3ldb5yx7k4m5yrv6wgzgpmnuiljxb5pmoczsfhuzces4.png)\n\n![image](./attachments/bafybeiggu3cwh3kzo2kllfyoskdwptv2f3ifoh4jjpas23yjkaim3ccm6q.png)\n\n**影视**\n\n看了 29 部电视剧 26 部番剧 16 部电影,完整列表见豆瓣:<https://movie.douban.com/people/62759792/>\n\n年度最佳电视剧是《老友记》《使女的故事》\n\n年度最佳番剧是《进击的巨人》\n\n年度最佳电影无\n\n**游戏**\n\n玩了 16 款游戏,完整列表见豆瓣:<https://www.douban.com/people/62759792/games>\n\n年度最佳是《集合啦!动物森友会》\n\n**Vlog**\n\n做了第一个算得上是 Vlog 的视频:[《带发小和粗粗一起滑翔伞!起飞!》](https://www.bilibili.com/video/BV1pf4y1q782)\n\n后来又趁双十一买了 Sony ZV-1 和一堆配件,打算明年到英国再随缘拍一点 Vlog\n\n### 🪂 现充生活\n\n今年的现充生活非常匮乏,但有几个还是值得一提\n\n十一:跟发小和粗粗去了很多地方玩,7 天居然一天都没闲着,搬家、滑翔伞、迪士尼...\n\n<blockquote class=\"twitter-tweet\"><p lang=\"zh\" dir=\"ltr\">生活的理想就是理想的生活<br>[假期小结] <a href=\"https://t.co/D2ctRhpr2m\">pic.twitter.com/D2ctRhpr2m</a></p>&mdash; justcc (@justjustjustcc) <a href=\"https://twitter.com/justjustjustcc/status/1314332893351563264?ref_src=twsrc%5Etfw\">October 8, 2020</a></blockquote>\n\n<blockquote class=\"twitter-tweet\"><p lang=\"en\" dir=\"ltr\">Now you know why birds are always happy and singing~ <a href=\"https://t.co/oiGiGAzGkR\">pic.twitter.com/oiGiGAzGkR</a></p>&mdash; justcc (@justjustjustcc) <a href=\"https://twitter.com/justjustjustcc/status/1313714188666040320?ref_src=twsrc%5Etfw\">October 7, 2020</a></blockquote>\n\n三体展:有很多三体的令人拍手叫绝的绝妙设计,三体粉一本满足\n\n<blockquote class=\"twitter-tweet\"><p lang=\"zh\" dir=\"ltr\">消灭人类暴政!<br>世界属于三体! <a href=\"https://t.co/aENPVrsJhy\">pic.twitter.com/aENPVrsJhy</a></p>&mdash; justcc (@justjustjustcc) <a href=\"https://twitter.com/justjustjustcc/status/1256859381494214656?ref_src=twsrc%5Etfw\">May 3, 2020</a></blockquote>\n\n做饭:新家有了独立厨房,也为了明年留学提前练习,学着做了一些简单东西,番茄鸡蛋汤、小炒肉、宫保鸡丁、炸酱面、咖喱饭、煎饺、牛排...已经可以养活自己了\n\n### 🎉 致谢\n\n今年是一个承蒙大家关照的一年\n\n感谢发小对这样一个成本巨大且充满自私和不确定的移民决定的无条件支持,我很清楚这个支持需要付出的多么大的牺牲,我不会把它当作理所当然,我会带着这份信任努力下去\n\n感谢发小在今年教到我的一些东西:共情能力、自我意识、及时行乐和积极向上的生活态度,很多方面学得还不够好,还在慢慢学习中\n\n感谢 Henry 对我留学的 360 度全方位帮助,不仅对我前期规划提供了很关键的帮助,让我少走了很多弯路,还对之后的留学准备也提供了很多帮助,还帮助解决了很多后顾之忧,如 RSSHub 的维护、明年酸奶的收养\n\n感谢黑帆、Fallenhh、Uucky 在我准备留学文书遇到困难时主动提供了很多帮助和非常多有用的情报,同样让我少走了很多弯路\n\n感谢一位失而复得的不愿意透露姓名的朋友对我们友情的珍惜和信任\n\n感谢粗粗帮助和陪伴我度过了一个完美的十一假期\n\n感谢跟我一起玩动森的朋友们,陪伴我度过了一段最快乐的时光\n\n感谢为自如事件发声的大家,为我最黑暗的时刻照亮了一束光\n\n&nbsp;\n\n**2021,在这个命运之神把我推向勇敢的时刻,希望我能够像想象中那么勇敢,向着目标前进,前进**\n\n
318<script async src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"><\/script>"},{"slug":"paragliding","title":"带发小和粗粗一起滑翔伞!起飞!","tags":["vlog"],"body":"十一跟发小和粗粗一起自驾去了滑翔伞,起飞瞬间太刺激了,为了那一刻长途跋涉也值了第一次露脸 vlog ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄ 求三连,求转发!"},{"slug":"my-last-fight-against-this-world","title":"我与这个世界的最后一次抗争","tags":[],"body":"在被自如入侵卧室的一周内,我遭受了极大的精神创伤、超过一万元的经济损失和六斤体重,我尝试了我能做的所有事情,多次报警、各种渠道投诉、网络曝光、联系媒体、准备诉讼,我意志坚定、不屈不挠,我发誓一定要让他们付出代价,不解决誓不罢休,我坚信这个事情一定会有一个完美结局\n\n然而现在事情已经过去了 20 多天,我连一句道歉和认错都没得到\n\n我一直在思考,花了这么多精力和金钱,坚持了这么久,我想要的到底是什么?\n\n是为了出一口气?我早就放下了\n是自如公司的道歉?其实我也不稀罕了\n是经济赔偿?我也不缺那点钱\n\n现在我知道答案了,我想要的是继续在这里生活下去的信心\n\n执法部门喜欢和稀泥、民众欠缺法律意识、人与人之间缺乏最基本的尊重是发生这种事的根本原因,这些问题短期内根本无解,类似事情只会屡见不鲜\n\n我失去了这种信心,他们说的是对的,这个世界就是这样,改变不了的,**算了吧**\n\n以上就是我与这个世界的最后一次抗争,明年我可能就去英国读研了,后会有期\n\n![image](./attachments/bafybeie7n5selvxxmcnow26g67zuwdlkvuijv7kehqcb3fu3cwmrwzbbqi.png)"},{"slug":"web-debugging-proxy","title":"科学的 Web 调试代理实践","tags":[],"body":"前端经常需要一些特殊的调试环境,这时有一个科学的 Web 调试代理工具(以下称代理工具)显得尤其重要\n\n我用的第一个代理工具是 [Charles](https://www.charlesproxy.com/),功能多但缺点也很明显,笨重、配置麻烦,爬\n\n后来换到了 [Zan Proxy](https://github.com/youzan/zan-proxy)\n\nZan Proxy 是一个 Node.js 编写的代理工具,跟大杂烩 Charles 不一样,专注于 Web 调试,轻量、配置方便,虽然功能很简单,但对我来说够用了\n\n配置都是在一个 Web 页进行,界面很舒服,我用它做一些简单的转发请求、修改响应头、mock 数据\n\n![image](./attachments/bafybeigvagrzmrtqktce5wnch25qm72mrpw2rq2j2bcamnl3pv4subuava.png)\n\n但随着工作内容的发展,需要的调试环境也越来越复杂,Zan Proxy 已经慢慢不能满足我的需求\n\n&nbsp;\n\n[LightProxy](https://github.com/alibaba/lightproxy) 适时地出现在了我的视野\n\n![image](./attachments/bafybeiakjtha27wln3twegfk5vbrjbq6ylscwpov6hidcm2i7r5ha66ahi.png)\n\nLightProxy 是一款基于 [whistle](https://github.com/avwo/whistle) 的本地代理抓包软件(~~其实直接用 whistle 也差不多~~\n\n下面通过一些我自己使用的规则来介绍它\n\n**请求转发**\n\n```\nplayer.bilibili.com http://127.0.0.1:8080\n\n^*s1.hdslb.com/bfs/static/player/main/video*.js file:///Users/diygod/Code/bilibili/js-common/packages/video/dist/release/video.js\n^*s1.hdslb.com/bfs/static/player/main/video*.js.map file:///Users/diygod/Code/bilibili/js-common/packages/video/dist/release/video.js.map\n```\n\n(1)项目接口和 CDN 都被限制某些域名可以用,所以需要这样一个东西做开发环境\n\n比用 webpack 开一个 80 端口的 server 再绑 hosts 优雅 80 倍\n\n(2)可以用来代理线上文件\n\n把本地编译好的项目文件代理到真实线上环境,这里用到了通配符来匹配路径\n\n**修改响应内容**\n\n```\nm.bilibili.com resAppend://`\n
318<script src=\"https://cdn.jsdelivr.net/npm/eruda\"><\/script>\n
318<script>eruda.init();<\/script>\n`\n```\n\n修改移动端页面的响应内容,让页面加载调试工具 Eruda,方便移动端调试\n\n值得一提的是 whistle 有个很神经病的地方,whistle 本身并不支持这样的行内写法,需要很麻烦地在另一个面板设置 {key} 或者使用本地文件\n\n所以 LightProxy 做了一层转义,把行内代码保存成了一个临时文件,打开 whistle 可以看到实际发给 whistle 的配置是类似这样的\n\n```\nm.bilibili.com resAppend:///var/folders/_l/hbcxcqh522s_vls68417h2m40000gn/T/lightproxy/0-152.txt\n```\n\n**修改响应头**\n\n```\n/.*bilivideo\\.com\\/.*300(\\d){2}\\.m4s/ resHeaders://`{\n    'x-service-module': 'test-video'\n}`\n/.*bilivideo\\.com\\/.*302(\\d){2}\\.m4s/ resHeaders://`{\n    'x-service-module': 'test-audio'\n}`\n/.*bilivideo\\.com\\/.*\\.flv/ resHeaders://`{\n    'x-service-module': 'test-flv'\n}`\n```\n\n这里用了正则来给不同类型的文件匹配不同的规则\n\n**修改 cookie**\n\n```\nm.bilibili.com/video/ resCookies://`{\n    ab: '0000test',\n}`\n```\n\n在移动端修改 cookie 并不是那么方便,所以我用了这个规则,本质上是修改响应头的 `Set-Cookie`\n\n**host 转发**\n\n```\n172.22.33.166 s1.hdslb.com player.bilibili.com static.hdslb.com\n```\n\n除了支持各种匹配模式,还支持传统 hosts 语法规则,[SwitchHosts](https://github.com/oldj/SwitchHosts) 可以扔掉了\n\n**模拟网络异常**\n\n```\n*.bilivideo.com replaceStatus://403 includeFilter://m:get\n\n*.bilivideo.com resSpeed://2000\n\n*.bilivideo.com resDelay://3000\n```\n\n各种模拟网络异常的功能深深戳中了我的痛点\n\n例子中的 `*.bilivideo.com` 匹配 bilibili 视频 CDN 地址\n\n(1)模拟 CDN 状态码,用来调试 CDN 地址超时或异常,没有 LightProxy 的日子里只能在代码里 mock 或很蠢地等很久等视频地址超时\n\n(2)模拟慢速,用来调试卡顿或自动清晰度切换,可以用来代替 Chrome Network Throttling\n\n(3)模拟 CDN 请求超时,用来调试 CDN 拉流超时,没有 LightProxy 的时候只能小心翼翼地控制 Chrome Network Throttling,太小了会导致请求失败,太大了超时又不够长\n\n**Node.js 规则**\n\nLightProxy 还有一个很酷的功能,使用 Node.js 书写规则,以下是官方的一个 demo,我暂时还没有这个功能的使用场景,但就是感觉很酷\n\n```\ngithub.com/alibaba/lightproxy scriptfile://`\n\nexports.handleRequest = async (ctx, next) => {\n   // do sth\n   // ctx.fullUrl 可以获取请求url\n   // ctx.headers 可以获取请求头\n   // ctx.options 里面包含一些特殊的请求头字段,分别可以获取一些额外信息,如请设置的规则等\n   // ctx.method 获取和设置请求方法\n   // const reqBody = await ctx.getReqBody(); 获取请求body的Buffer数据,如果没有数据返回null\n   // const reqText = await ctx.getReqText();  获取请求body的文本,如果没有返回''\n   // const formData = await ctx.getReqForm(); 获取表单对象,如果不是表单,返回空对象{}\n   // ctx.req.body = String| Buffer | Stream | null,修改请求的内容\n   // next方法可以设置next({ host, port });\n   // 只有执行next方法后才可以把正常的请求发送出去\n   const { statusCode, headers } = await next();\n   // do sth\n   // const resBody = yield ctx.getResBody();\n   // const resText = yield ctx.getResText();\n   // ctx.status = 404; 修改响应状态码\n   // ctx.set(headers); 批量修改响应头\n   // ctx.set('x-test', 'abc'); 修改响应头\n   // ctx.body = String| Buffer | Stream | null; 修改响应内容\n   ctx.body = 'test';\n };`\n```\n\n从以上例子中相信大家已经对 LightProxy / whistle 的用法有了自己的理解\n\n&nbsp;\n\n最后还有一个值得一提的事情是,用了这些调试代理工具之后魔法上网怎么办?\n\n调试和魔法上网用的是不同的代理,我是一个面向 Google 编程的人,代理一直切来切去太麻烦,我的做法是系统代理交给 Surge 接管,利用 Surge 分流,新建一个 LightProxy 代理,然后编辑 Surge 规则,只把需要调试的请求分给 LightProxy\n\n![image](./attachments/bafybeie44ij3bf3kxekitbkmafji62rs4udtptl2n26qbx4ltwtbfcyviu.png)\n\n![image](./attachments/bafybeibx7ihnlfxsnqltmrml5arigikpkcsuey5q7u37ybzdapener7fwm.png)\n\n以上就是我目前的 Web 调试代理实践"}
318,{"slug":"animal-crossing","title":"我的动森日记","tags":[],"body":"> DIY 对这里的生活绝对有很大的帮助!\n\n![ac0](./attachments/bafkreihutu2gbtogslyg6677fewizdimmyhhemk5s5yadodjnevklycl7m.jpeg)\n\n~~日记会持续更新,也欢迎加群来我的橙子冰淇淋樱花小提琴岛一起玩: 947956902~~\n\n<style>\nh2 {\n    color: #fc6423 !important;\n}\n</style>\n\n## 第一天 3月19日 上岛第一天,DIY对这里的生活绝对有很大的帮助\n\n今天是上岛第一天!\n\n化妆、选岛、出发!\n\n![ac1-1](./attachments/bafkreibemdaib7lhmclghhige34tx6tbbl2w3vpqlapgipoklmexrelc7e.jpeg)\n\n![ac1-2](./attachments/bafkreiergjghvheei7p4ajzgigk6csbq564jzlwshjr6wbgwoipyacfnlu.jpeg)\n\n![ac1-3](./attachments/bafkreihp524oqxo6oa6jacouetbtpvrocfztv3lpqo7zitvvy2ynfas7ve.jpeg)\n\n用自己最喜欢的几个物品连起来给小岛取了名字:橙子冰淇淋樱花小提琴岛,岛上还有另外两个岛民:小猴天佑和青蛙小睫\n\n![ac1-5](./attachments/bafkreif6fufbybs5agkyodrmnexduzmjtwm5uqu35jnh6eedkyxmtc25ey.jpeg)\n\n搭好了帐篷,也背上了第一个房贷\n\n![ac1-4](./attachments/bafkreia7iebffcwgoht63mgqqemifexpooibtq5mbpwp6cqecxo76cuvha.jpeg)\n\n![ac1-6](./attachments/bafkreic6v6plmmz25ubsczahgkjy4lxatrtpm24ye3rgl7562tlmgxo3iu.jpeg)\n\n钓到第一只鱼、抓到第一只昆虫、第一次被蜜蜂蜇到满脸包\n\n![ac1-8](./attachments/bafkreihytky36gqjp7366caiwnpzgnpb6imzbrlk6alep33y2gmch2ttxu.jpeg)\n\n![ac1-9](./attachments/bafkreifdlpgw6ik6fwscgqjnfk7nh2677gvzy2eyrob7zrizy5iwupttbu.jpeg)\n\n![ac1-10](./attachments/bafkreifqs5pjk7lhooskywv26zfzymyrtobrmxqchnu2xt2oh577boycee.jpeg)\n\nDIY 对这里的生活绝对有很大的帮助!(双关)\n\n![ac1-7](./attachments/bafkreibqnkzwdb5pjlgw5eir6s6lq6t7uvrvoxaggxiovfcppqvtkljk6m.jpeg)\n\n## 第二天 3月20日 机场开放啦,来了好多其他岛的朋友\n\n昨天把第一笔房贷还完了所以今天盖了新房子,但马上又背上了新的房贷\n\n![ac2-1](./attachments/bafkreid2zecwise56qeswcylrtv76sdlnjtqep5xzreni6tzabsvev56za.jpeg)\n\n![ac2-2](./attachments/bafkreiho5ctslmg7e6t2vltiz6mjuifjs5ebi5lfbwivqmjfpamxh73y3i.jpeg)\n\n今天学会了撑杆跳,可以去小河对面玩了,挖到了第一个化石\n\n![ac2-11](./attachments/bafkreibpp3p5nfg6epxdcoe4sr76pybu6frg3unvuxh3yeemnky2qgjpaa.jpeg)\n\n![ac2-10](./attachments/bafkreieucev6h7jicbiy2ux3u7ip2co2np3sixyahvw5p3vd37q2335cbu.jpeg)\n\n今天机场也终于开放了!来了好多其他岛的朋友\n\n![ac2-12](./attachments/bafkreigw7saqmbpd3ckt7eztqecgm6bj3mojhe3pozahfd2nha5tipse7a.jpeg)\n\n![ac2-3](./attachments/bafkreieih7phjzlq5uehnr72doddkr22qi27elnzczkzkf4rp3sitsyb2u.jpeg)\n\n![ac2-5](./attachments/bafkreidgv5rgtczx3yg57r5flhwzvefdwzhw4u4dqfchwbvgjayfqxhltu.jpeg)\n\n![ac2-6](./attachments/bafkreiekz5e2wpjpyfop2qi4heh6zjtsllplu2kfuuh7hogv4ug3izel4e.jpeg)\n\n![ac2-7](./attachments/bafkreie5i6sxykakdkj3d445av2eaxeltvlifnenyfu3pun2ozp4ybkrmm.jpeg)\n\n和银酱联手把小霖抓起来\n\n![ac2-4](./attachments/bafkreiexe2fa2kd43jrmls6jq3a6xagui4mqn5oyftjqr2awnywjhaylp4.jpeg)\n\n追杀 Jemair\n\n![ac2-13](./attachments/bafkreie6k2pu4ijhqf33kcadwbyuogi5ajrfbijea2mgchqgf4gj6y6u5y.jpeg)\n\n青蛙小睫在跟我八卦小霖的小秘密\n\n![ac2-9](./attachments/bafkreif3plvyfi6mfhx32kauqqcjizwogusg5pnzqzfr2lbmu36h2t6rg4.jpeg)\n\n我坐飞机也去了其他无人岛瞎逛,期间还遇到了小熊阿妹,邀请了她来我岛上定居\n\n![ac2-14](./attachments/bafkreifox7zappwulhhfgteqz4vg4fbx4ud3wm6akhaab3mpygqunggrda.jpeg)\n\n晚上在岛上遇到了一只可爱的幽灵幽幽\n\n![ac2-8](./attachments/bafkreidlhcuayzb2wusldpvp5pd2uqj7upqmfby2erhymlgb6tw4v47sxm.jpeg)\n\n## 第三天 3月21日 商店开张啦、遇到海鸥吕游\n\n昨天把第二笔房贷还完了所以今天扩建了房子,但马上又背上了新的房贷(熟悉的剧情),198000 铃钱!\n\n一大早在沙滩上遇到了海鸥吕游,吕游遇难飘到了我家小岛沙滩,帮他打电话给他朋友来接他,但是...真替他担心\n\n![ac3-1](./attachments/bafkreihzt76dj2knqmy4mlr46hbppuoq4xn3x62c4iudyfxjyh54yu626e.jpeg)\n\n![ac3-2](./attachments/bafkreiea4bdioouzhsqjfsggqijjklbj6rayuurg5d52ifj25r7zbq7t2m.jpeg)\n\n半夜来这里钓鱼的时候,看到吕游还在这里等...\n\n![ac3-8](./attachments/bafkreifijyvqnrz7mpqfzfzstsuqifaaexrw7ukvybk4y6lh35p3fojv6u.jpeg)\n\n今天商店开张啦,商店还说明天会有人过来卖大头菜,倒卖可以赚很多钱,哇我要发财了\n\n![ac3-3](./attachments/bafkreihsbeuuwr7qmalwpx3xtjqruabp4ugg77n6iaor72xgw2wppt4zie.jpeg)\n\n找到了一套鬼灭之刃的衣服!\n\n![ac3-4](./attachments/bafkreigcocn6dhzui4ms6iml6vpzbzwx6rjljnagydlshicvshwnifgyua.jpeg)\n\n![ac3-5](./attachments/bafkreiahhwdrkhgxuezgi5t2qvgzb5rcgkt2lkm3lizpvrxjlcvwc6lxxq.jpeg)\n\n![ac3-6](./attachments/bafkreibq3j775paqmnlpwyo3rebsaml5wkbirkb4unq643tog74d4pf3gq.jpeg)\n\n![ac3-7](./attachments/bafkreicffnizo6m4esx3br7dza52gd5aqmlkcoka3pk2don5w66ybfzua4.jpeg)\n\n跟 Jemair 拍照\n\n![ac3-10](./attachments/bafkreifs47bucxuqlkwjiinlyiqwnzu2kadwtgyavahoo3v27mgq5qatyu.jpeg)\n\n跟 Jemair 去一个南半球朋友 Anakin 那里钓鱼,南半球跟北半球季节不同,所以可以钓到好多北半球没有的鱼\n\n![ac3-9](./attachments/bafkreifbld7zwdaqszr23va52etlfjz2xbnbwmb62svogbarvfwhou4hhu.jpeg)\n\n## 第四天 3月22日 新岛民小熊阿妹、博物馆开业啦\n\n在家门口种的花全开了!\n\n![ac4-1](./attachments/bafkreifwmxnx37mwzjgl7o7l54hgfesod6kvkp24jbqurkdbxrad43r4oq.jpeg)\n\n去商店才发现卖大头菜的商人是只有上午才在,去的时候已经走了,痛失一次发财的机会\n\n前天邀请的小熊阿妹搬过来定居了,橙子冰淇淋樱花小提琴岛居民+1!\n\n![ac4-5](./attachments/bafkreiglqfddp6ahybu6o26qgcrh3sro2sar5x3lqkbzfe45bpqmlqv44e.jpeg)\n\n看到银酱家的商店今天在卖抽纸,托他买了一包邮寄过来\n\n![ac4-2](./attachments/bafkreieskxfxe75wh7t7p23enkfndm35dsaolsm4wlvo2myjr2z6gdxhqq.jpeg)\n\n放在家里顿时多了很多生活气息\n\n![ac4-4](./attachments/bafkreiaqijq5k7smhej5ylbjackdsan2japspwqmmyu3ipx67rfqrgcppq.jpeg)\n\n晚上继续去 Anakin 家钓鱼,钓到了一只鲨鱼!\n\n![ac4-3](./attachments/bafkreihqvljbmbfnmz22f6grk5fdcm5rf5roceuwki2yg2dpqovnllrrgy.jpeg)\n\n岛上来了摆摊卖衣服的刺猬娟儿\n\n![ac4-7](./attachments/bafkreifheptuf2bqf75p3nud4xpgdajq7kl63nt4vizyup4sc2biuet55q.jpeg)\n\n博物馆开业啦!里面超级大,布置也超级精美,抓到的鱼、虫子、化石都可以放在里面展览\n\n![ac4-8](./attachments/bafkreig6y2i7dg6hzubs7v5hh3babwvxn5gja2yfdls643eeti3vvjlok4.jpeg)\n\n![ac4-6](./attachments/bafkreift4zaktg3xsxlmozc44vzkg7iqaexkgeukjiee5fevtx7vn47l4a.jpeg)\n\n岛上的第一座桥也完工啦\n\n![ac4-9](./attachments/bafkreidyst7p2wigytjdpnxasraj5vmddlwgttezn4d6wteu6nfhc4ky3m.jpeg)\n\n## 第五天 3月23日 新岛民小狗珮琳\n\n昨天把第三笔房贷还完了所以今天扩建了房子,房子多了一个房间,但马上又背上了新的房贷(熟悉的剧情),348000 铃钱!\n\n小岛迎来了第二名新岛民 —— 小狗珮琳,她好像是一名歌手,期待她的歌声!\n\n![ac5-1](./attachments/bafkreihutzebq5rdjtm22pl3mz3q33zkaibhb6sseoutz3vrhiyq6eo65i.jpeg)\n\n![ac5-2](./attachments/bafkreids6acr2lmbt7uxwudtxmvutnktmnr72gih3lnxnciikmm22yf6l4.jpeg)\n\n吕游又遇难到了我家小岛沙滩,怀疑他被朋友欺凌了...\n\n![ac5-3](./attachments/bafkreiczscj65boohchknfw6ponf5c4sdc233vhbpdftt4ead4egoq6gu4.jpeg)\n\n巴猎邀请我去他的小岛玩,他开了一家摄影棚,说我可以随意在里面拍照\n\n![ac5-4](./attachments/bafkreif2lujctvg37wqfslzwsfu3xzxqjc3ww6ncqwadvh6zdfmmeg7jki.jpeg)\n\n昨天来的小熊阿妹送了我一瓶熏香条!\n\n![ac5-7](./attachments/bafkreiegrqgy2tyuu2ba532kyolqv
318k4myk3mxfsmoeezemvgl2rg7ymk5y.jpeg)\n\n![ac5-8](./attachments/bafkreie3npk5zlt77juznleywqwqhnyqua3gnxnj4zbyp3v45z2467fh2m.jpeg)\n\n![ac5-9](./attachments/bafkreiaumskkhww3esqbqsfqlzmulonkskhu56dtqsth6ksayuu34mplhy.jpeg)\n\n![ac5-10](./attachments/bafkreibgxqvj6lrvcut64jpsemhnya2tvpgz3c4ec5pfv7ybbk3lidj4gu)\n\n做了一个衣柜,可以更方便换衣服了\n\n![ac5-11](./attachments/bafkreicqvwpuvo545xe7ogmpytyknq46t3krrtntajqiwn4wb5uybytccq.jpeg)\n\n挖到了金矿石!虽然还不知道有什么用,但肯定很厉害\n\n![ac5-6](./attachments/bafkreig6w4d4ktoocz6lz7nbczyzi7g7h2lquxmdiq7qufdpog2pq6lmta.jpeg)\n\n钓到了很厉害的皇带鱼和鲷鱼\n\n![ac5-5](./attachments/bafkreif3l7ard2ofcocxgy76nszkeeqdsaz5hesp7tuadv7tffeho5tbbi.jpeg)\n\n![ac5-12](./attachments/bafkreid64rl56q4qmglbtlbrezh3ctpmm5rkldnrsxyww4dx2vrp7iucae.jpeg)\n\n## 第六天 3月24日 新岛民小猫尔光\n\n服务处终于要搬迁了,明天会暂停营业一天\n\n![ac6-1](./attachments/bafkreid7ssqkkcnqaggkaoglih35dz2q4spzwmgkbvog3gc5jfyllldhgq.jpeg)\n\n![ac6-2](./attachments/bafkreib7trbfgfkcsmjd5kqqkfz5am4hj6htbqirtgckfkkgo3e4lx4tmm.jpeg)\n\n小岛搬来了第三名新成员 —— 小猫尔光(尔光、耳光?)\n\n![ac6-3](./attachments/bafkreibvee2wjjmsds4yzwmcugbxhssqyzht4kllrwacm7c2tkxlq5rsnu)\n\n在门口的花田抓到了一只酷蟑螂\n\n![ac6-4](./attachments/bafkreihgkvejq7ojcxirgxzsruar45awwvlzjn5fp6vzyzxhaazexgwcbm.jpeg)\n\n和邻居聊天\n\n![ac6-5](./attachments/bafkreiebv3d7qhpuuckkhov6ppwo7qzqnuuiak36rgh4oxoss4vqv64ule.jpeg)\n\n![ac6-6](./attachments/bafkreig3gsoztzw4nz7emwjffne3rp2wkrc7tpmwyoioeil3cnec3nqwzm.jpeg)\n\n天佑在八卦 Jemair\n\n![ac6-13](./attachments/bafkreibawoiumftyculwhmfswi7frh2w5if4glmbagdaqvre2cnn3y4voe)\n\n![ac6-14](./attachments/bafkreidr5ai6qnumxm6bz4v5b3nwc2gf4qtahv4zchok6bamwjy74lhakq)\n\n![ac6-15](./attachments/bafkreidreenqwdmjje45aosczlpdtcd7qnrzf4p3vvhsq4dojvgciaadri.jpeg)\n\n和小霖去珍珠奶猫家抓鱼,看我们玩得多开心\n\n![ac6-9](./attachments/bafkreig5cycejg2ystdtrgqzggz555sa63xcutdzt2ngynav7hrie4trku.jpeg)\n\n![ac6-11](./attachments/bafkreieqwao3pz3woikq5rw3vlytldn2kfk7z33juxxoyhpzpjrt3uvduu.jpeg)\n\n在珍珠奶猫家钓到了一只超级大的巨骨舌鱼(好奇怪的名字)\n\n![ac6-7](./attachments/bafkreicogmsqajzixlzgzgkkryd7nemgr2ynlajpbbrtc3hczw5j7eomzq)\n\n![ac6-8](./attachments/bafkreiapny4lpogdeez4ayjwxnlgobunapkezoo26zthcdzlcu6tdg6hfu.jpeg)\n\n第二天种的水果树已经结果了,现在岛上 5 种水果全齐啦\n\n![ac6-12](./attachments/bafkreicmneaqw33tv4uswvfvi6k7a33fnwrf3tzw4evzgvdn5uhky5ur4q.jpeg)\n\n## 第七天 3月25日 看流星雨、骆驼商人、新朋友来信\n\n早上起床一出门抓到一只蜜蜂(早起的蜜蜂被我抓)\n\n![ac7-2](./attachments/bafkreiddh6heu5f6tvijrjqdehe64pk4c7ojf7mfke2qlasemurndtfou4)\n\n去商店买了一个爆米花机\n\n![ac7-1](./attachments/bafkreihnk2rv4ov5xw7aecmylpi5nvdjiw7hxuxz57k5k4ev3igdc4arx4.jpeg)\n\n找新岛民收~~保护费~~礼物\n\n![ac7-3](./attachments/bafkreidxuwe2io7k7xcgrndeqnqbsxoyjri5noxg5asgxzdjnksos4xe5e.jpeg)\n\n中午听小霖说 Rememme 家在下流星雨,赶紧坐飞机去看\n\n![ac7-4](./attachments/bafkreih4rayhgu3cxmwfhvgeervd35tj7hu76ecsepidjdouxge6bh5x6e.jpeg)\n\n和大家一起向流星许愿,一定会实现的!\n\n![ac7-5](./attachments/bafkreia6wz52n33av4hqxcplvmdwsq6ciaq6kkphqmi2lii5y3p6epc7hu.jpeg)\n\n![ac7-6](./attachments/bafkreib7sqztd5jvqyct46mqtgcvj74zkzafdhj7ugq6zg4zvzbcueigbu.jpeg)\n\n![ac7-7](./attachments/bafkreidsy3p5pue6r5nmympmezumx3xd2gwwzm7yl6zum7f7uuk2qhwrzm.jpeg)\n\n学会了星星棒的制作方法,据说向流星许愿后的第二天可以在沙滩上捡到星星碎片\n\n![ac7-12](./attachments/bafkreif7m55tep4t7xwkugolzdwcc3knc5hlmhy7ylv32ashrmybafq35e.jpeg)\n\n晚上去两个 NGA 坛友家找骆驼商人买了两套不可思议壁纸和不可思议地毯\n\n![ac7-8](./attachments/bafkreielszcptsl4pmrmzh7bdwzf3hquz5rbhwa24ctrscsh7judhfwsze.jpeg)\n\n![ac7-9](./attachments/bafkreiaayzq7vi7ufa5ixokut43zu6hcqwjapp35stpvqydglpuolztzvy.jpeg)\n\n壁纸和地毯花花绿绿的,会动会发光,很炫酷\n\n![ac7-10](./attachments/bafkreihe5ykpbxgfffga6jmmld5tpboimn4oo7aofoybscp5k2h3pl2rsm)\n\n![ac7-11](./attachments/bafkreiecoiiimcnowzocb57pyqf2nyrpqrzce3jdwjnct2nmzxjwss
318pzkq)\n\n一个叫乐橘乌龙的好友来我家玩,是第一次来,看打扮应该是个小姐姐(不得不说,男孩子和女孩子的穿衣品味差距还是很明显的)\n\n![ac7-13](./attachments/bafkreihhxv542n5z73pbz37xli5chvohjk6gqjsbbu2awf4uzwmpp2djii.jpeg)\n\n正好七夏浅梦和珍珠奶猫也在我家,一起欢迎新朋友\n\n![ac7-14](./attachments/bafkreiher3tvbnikrt74tvwcegafc37yawhcg7uqdolh6bhppgyaa4itie.jpeg)\n\n连我家小动物也很欢迎新朋友\n\n![ac7-15](./attachments/bafkreiaw6g736i7hvcphvd6muiyzpdu7fnjjxb3v2xmrxkkgovyal4rxxu.jpeg)\n\n乐橘乌龙回去之后还给我写了一封信,是同事小姐姐!\n\n![ac7-18](./attachments/bafkreigebf6ks5eswovfvpdtgjdfqzw5md4lryx4auldj3yuqw6a7rqkwu)\n\n给乐橘乌龙回了信\n\n![ac7-19](./attachments/bafkreifhd7b6th2xoie32fxcqvrlu6pxalrih34pk6ifousrb5iowgh62y)\n\n今天认识了好多可爱的新朋友,我陷入了沉思:这里的大家都那么可爱,是因为可爱的人才会来这个世界,还是因为这个世界让大
318家变可爱了?\n\n## 第八天 3月26日 服务处升级、西施惠、出门到处玩\n\n一大早狸克宣布服务处升级好了,而且来了一个新员工 —— 西!!施!!惠!!\n\n![ac8-1](./attachments/bafkreiexrzcrunhljmxic4eusgba5esmfohqiiox6hmp5ebwwv5jfadlhe)\n\n![ac8-2](./attachments/bafkreib4nhizzubjfj4eqmjgyuzglcpnbuzudhuc2skqvvukv7vzmow3g4)\n\n![ac8-5](./attachments/bafkreige3ttdl6pm3drg56whpcv2hfk2nfamim6ylsqjo5l76hhkkrkrtm.jpeg)\n\n狸克想邀请人气歌手 K.K. 来办演唱会,要我建一个露营地\n\n![ac8-3](./attachments/bafkreicorfxzjjffe4xaosqjpvhqv2m5lqo7xmv72jww3bqqxlsyphqhjy.jpeg)\n\n![ac8-25](./attachments/bafkreicb2uwk23qb3mi5in5essa7nrmhkdgfmhblpwr7cicjhbpuwcyeqm.jpeg)\n\n阿妹真可爱\n\n![ac8-6](./attachments/bafkreidgjy2srliwrvhm3suwsjcgbflv4tvawosvete7gv3hbuckqbjj7e)\n\n前两天种的摇钱树长好啦\n\n![ac8-7](./attachments/bafkreigqssvp6x54zdoyxmexvvha5hee2cdxex5zwolfp65oqovsumpgii.jpeg)\n\n中午去乐橘乌龙家交换了好多好看的新家具,有一些明天才能邮寄到,超级喜欢这张大床,可以滚来滚去!\n\n![ac8-23](./attachments/bafkreiftmj7i5bav6i3d6ag2sxenkaimdmycnjy4wf6rrsta62ek5dlc5a.jpeg)\n\n![ac8-22](./attachments/bafybeig63j63r2wju6joosu3l3aroncagdd52peck4cfurxtqhxetjqbay.gif)\n\n晚上去海边玩发现了昨天看流星雨获得的星星\n\n![ac8-9](./attachments/bafkreihutqs7govx4dgxytp3thfyhzoosz6rfombkd2vbcphdvokqdu2gm)\n\n去小霖家玩,Mitt 也在,一起演奏乐器(小霖没有乐器只能在旁边鼓掌 hhhh)\n\n![ac8-10](./attachments/bafkreibzbt2jiltw5eqesmqseim3vo2cbxoztxzfgbyr2ecawaethox5ny)\n\n合照\n\n![ac8-11](./attachments/bafkreigz4pawl6lytzdtthwcw5foic7ewnedupxetcf7fxpx6okykil3fi)\n\n粗粗也来了,再和粗粗照一张\n\n![ac8-12](./attachments/bafkreidjywwos37qfq4ob5aditidtp66ebkspsmy7xkafdcjynwuwkwlfe.jpeg)\n\n![ac8-13](./attachments/bafkreifjbz5gi5yu7lmynnlfg3uprpmuim3em6melfiwmosk2lc6cvfz5e.jpeg)\n\n然后去萨摩家钓鱼,钓到了之前没见过的小龙虾和香鱼\n\n![ac8-14](./attachments/bafkreibrfxffgk7flbnbgdkn5uowrorbar5ttu5tyzgzu2hshl7hczp2qm.jpeg)\n\n![ac8-15](./attachments/bafkreihh5gkxl3q7wherrecnhm5jyxnskgm5xaporyww4xzzx6xiydr3p4)\n\n![ac8-16](./attachments/bafkreihtg6gdplbw5wqtdjqr3vh4v7dkah4qvfcq37od5muv35osml7vlu)\n\n听说银酱家里在下流星雨,赶紧跑去看,在银酱家的山顶上和银酱、珍珠奶猫一起许愿\n\n![ac8-17](./attachments/bafkreifi3f7gkit2bn4ymfu4exwxheucxc7owwc4pwyv6jb4z57ymrmhmy.jpeg)\n\n![ac8-18](./attachments/bafkreigif4pzoxheby6zaa25aqffnqjtiqq4owylhq4llchzdj6vgngjye)\n\n看完流星雨又去了 Rememme 家玩(有时差所以是白天),Mitt 也在\n\n![ac8-19](./attachments/bafkreidnk76gosxilfqfoaazteoyxbz7u5cklfrhceesfuf5jnme7tlule)\n\n![ac8-20](./attachments/bafkreidji4iseni7affwf7f77t6tu52emvw7dbbnbvpcq324nah4ye2g3q)\n\nRememme 家的企鹅达好可爱\n\n![ac8-21](./attachments/bafkreihp4yb6cfzl5u3srmj262eubtcxh2aoefthh4cy5eqj7j53gjvrq4)\n\n回家之后又搬了个家,之前没规划好,跟其他岛民住的太远了,现在打算搬到阿妹家旁边\n\n![ac8-24](./attachments/bafkreifdnn7s4tvrmqwm3qs2d2zq2whaqpjfpcqt3tpptufodsogxu2mre)\n\n今天做了好多事啊,真是充实的一天!\n\n## 第九天 3月27日 采购了好多壁纸和地板\n\n早上广播变成了西施惠!醒来第一个见到的人是西施惠而不是狸克真是太棒了 hhhh\n\n![ac9-32](./attachments/bafkreigphxouhres2k566qof5co6vagkyxyyrw76sa2apnuk4n2yexa754)\n\n出门发现骆驼商人来我家了,买到了超级好看的云朵壁纸和草莓巧克力地板!昨天跟乐橘乌龙摸来的新家具也到了\n\n![ac9-2](./attachments/bafkreieiaep4exalqgzuttthgbbkt6qbtpvhyqz45ns4kywytbxksha7fm)\n\n![ac9-3](./attachments/bafkreifazx4wea7vevmvacb73dltddoh7v4blxg4bg2kpwacvuylxtzgde)\n\n![ac9-22](./attachments/bafkreiarqteodv3dhjl65atj44qwuwfms76yfacwyd2i427ceiwrs7rrkm)\n\n下雨天在石头上抓到了蜗牛\n\n![ac9-4](./attachments/bafkreifbmxudimiu3ojadakglayg2umz6cuqjhcfsyxom23sul7sxas5ii)\n\n中午跟乐橘乌龙、小咩、阿年一起互换家具、互逛商店,又买了好多新的壁纸和地板\n\n![ac9-12](./attachments/bafkreigva3etfdoda4a2ne4llj4pwbsmi7ctkopelss5fvta3vuweyitzm)\n\n![ac9-5](./attachments/bafkreib5aeb4osf5jmlbu2gt5zsprihvh2v2dxuqncokuhvpcs3u4yqlmq)\n\n![ac9-7](./attachments/bafkreicwz766w64yjaoa2syc3xco7trzqpzlo52i6yvmp3hucgoerlvfvu)\n\n![ac9-13](./attachments/bafkreighnc76vi2hfgbgb4g7bd72pliasqnwkh4wmc2ozrwpx55oqz3q2i)\n\n在南半球的阿年家抓到了好多没见过的昆虫\n\n![ac9-6](./attachments/bafkreihwomaqnrklbzittzjjfapqnrk2hpcwm4klj7bvr4f3p22ld4xo5a)\n\n![ac9-8](./attachments/bafkreibalatpwqd4jqaeoeufwe4xwhtlsnahykcec6di5b6fhtqpf2eakm)\n\n![ac9-9](./attachments/bafkreiahmw4xhsb5ev5zyrg562yoxb3nsp5fltyej5fk7k4em7ifj4d3km)\n\n![ac9-10](./attachments/bafkreidlnj3l5zteorkgbkvlyxv3thohcmde5rifjqoyjqoaqe4z3jntdm)\n\n![ac9-11](./attachments/bafkreicijnrlfayrwxhg2kpcux2aqlujdktmnqo72mhrodww3x3pu4x7va)\n\n晚上露营地完工啦\n\n![ac9-15](./attachments/bafkreigdm4ep5iutbpg5wmgnfttokwatjha27strxhgukt34sewnmvxvxa.jpeg)\n\n在广场听小猴天佑唱歌,感觉不太行,还需要多练练啊 hhh\n\n![ac9-16](./attachments/bafkreidlom4u7dussaqg44qfsud2d37k5ruy56e4fqot7vnkcqvacvhxqu)\n\n给可爱的阿妹送了一条好看的小裙子,阿妹回é€
318äº†æˆ‘一件衬衫,过段时间还要请我吃好吃的,不知道是不是只是客气一下\n\n![ac9-17](./attachments/bafkreifuem3l2gnqr5ipqllexy2zpso5lbsuc52tpcegl7m7rqscx7ujyu)\n\n![ac9-18](./attachments/bafkreibsk7metdv3uhkx4h6u6dcbdxwifh7hn34mynucvqexxcuqye42bi)\n\n![ac9-19](./attachments/bafkreicky4qfgbveo6ch5ltn4i5n6oqmllhn6zp2qqrlizo32f24dqm6xq)\n\n在青蛙小睫面前被狼蛛咬了,好丢人\n\n![ac9-27](./attachments/bafkreifaasfquq22vr4ducm7dlcwzfqclbbud5oo5sagwi42e366xisnbi)\n\n又挖到一个金矿石嘻嘻\n\n![ac9-29](./attachments/bafkreiglzj7typywznrd7pn6i4ob2ejziiaxnedcezl4mfpukddhynmfo4)\n\n整理下这两天买到的壁纸和地板,用其中一部分随便搭配了几套组合,感觉最好看的还是今天在自己家买的云朵壁纸和草莓巧克力地板\n\n![ac9-22](./attachments/bafkreiarqteodv3dhjl65atj44qwuwfms76yfacwyd2i427ceiwrs7rrkm)\n\n![ac9-23](./attachments/bafkreibzxehcu7embnxpaxv72lyeufg7hrxuqnh2dezv7m77xykpmlnsoy)\n\n![ac9-21](./attachments/bafkreigaw7ej24jwpc5q27xlq644h6frrhzx6vblsmc7iccfkwyct7fpue)\n\n![ac9-20](./attachments/bafkreigtndsvomiccl4miumw3zkp4ogfwwavwvjdbaizcgfsottqjowy5a.jpeg)\n\n![ac9-24](./attachments/bafkreih7cssbiw5c7bm3ndfai2h77w6iihewbrmwdn7tc42d4cmp3fbsry)\n\n![ac9-25](./attachments/bafkreih7q7fjj332uiw3spwpvq5iyoxebaelfeenirtujzh745upt3hgsy)\n\n![ac9-26](./attachments/bafkreifowjbdmxyvqtqrsmft4mgpnww7xqzamabxlxlnrbmuzacvlmo3da)\n\n## 第十天 3月28日 新岛民可爱多、开辟花田、攒钱买大头菜\n\n![ac10-1](./attachments/bafkreifw4yjb67wx3w7akkk75fg6xzblcz3xnq5cdc4yepr3m6vxbgzsny.jpeg)\n\n早上起床给岛民送小礼物\n\n![ac10-3](./attachments/bafkreie2nv2lsmotlznni7kmael3zuhro47vlrenmjoivyxsxsawjuq6hm)\n\n![ac10-8](./attachments/bafkreiexicz7hm5zzvzipiov2zd7irehebsby6f4t5eufoz5svsnz77ppi)\n\n下午发小可爱多也搬到岛上定居了!\n\n![ac10-4](./attachments/bafkreiedzkl7koaomfkdkim2n6wh5dgz54mytuwivigy3lihhjldemdgay)\n\n被壁咚了\n\n![ac10-5](./attachments/bafkreia35wl6qt5aasdoqimyudb6tnyme3xs6hs4looeiqe5jr4t6awc2i)\n\n一起钓鱼\n\n![ac10-6](./attachments/bafkreicf42c
318x3pcajfsabsgbsysrg4p2rcznfwdmwplj5alnqjmh3f55xy)\n\n傍晚刺猬娟儿找到我说想在岛上开一家裁缝店\n\n![ac10-7](./attachments/bafkreiedere5dtd7f3tzfenc7v2uf6pyjeo6dmztjuxipumposs4ba2vki)\n\n![ac10-19](./attachments/bafkreifcekrw3o5ui2j5vr5rwqwyssrgexbtfd6h2vjid5pnu5ynhlwoq4)\n\n晚上去乐橘乌龙家买和服,然后给她画了画\n\n![ac10-9](./attachments/bafkreieyj7garpia4njn4x3teulqigy22nuhhbfnhx4ccckj4pikvbmmq4)\n\n![ac10-10](./attachments/bafkreicpfl2njvuynqapbpzgiwubkwdbe5w5lt74b73bcxjqcqwmt5wyi4)\n\n又交换到了一些新家具\n\n![ac10-11](./attachments/bafkreigtcgfwgniyybl5z6cpvnx5ocxc32k6aetjceny66wt7pxxvp4u6a)\n\n阿妹也加入了唱歌练习,好听好听\n\n![ac10-12](./attachments/bafkreigklp5uwnouxskvfsu4i5iuib67v2qgcm4hayeo43qztrgvk7hffq)\n\n学到了花朵杂交的方法,花朵杂交可以开出好多新的颜色的花,于是按照方法开辟了一个花田,玫瑰、郁金香、百合\n\n![ac10-14](./attachments/bafkreifllysjvz637sjr75qooesp3r47haz6hgr6imk2y5pyqbmvwnm44y)\n\n想造一个狼蛛岛抓狼蛛赚钱,明天收购大头菜,但搞了好久一直都没成功,好在这过程中有很多意外收获\n\n第一次成功抓到黄蜂\n\n![ac10-15](./attachments/bafkreidsvhidc7lox335hqrmcic4kx7qjxujj7j3un2djqwvwhnezn326a)\n\n![ac10-16](./attachments/bafkreifggn3ku5ka5mtf5aatgdo4c4zcn2xjllcjqctoluf4oaw6t4ic24)\n\n钓到了超级稀有的鲟鱼和锦鲤\n\n![ac10-13](./attachments/bafkreicabdbgdfedjxa2wf6l77342oqrrd7knbbj5qjrnniyqjjeriqasi)\n\n![ac10-17](./attachments/bafkreianglvyfgwwkjugujnzsmyaynolon7yimnv7h2cd762azrkukqgje.jpeg)\n\n钓了这么多,等明天商店开门卖给商店赚钱,大头菜我来啦\n\n![ac10-18](./attachments/bafkreidixdym2dz2uuhk247fh23q7h3ehurpc32gbshd4rnrxousirjlhu)\n\n## 第十一天 3月29日 梭哈大头菜,我们都有美好的未来!\n\n![ac11-1](./attachments/bafkreigpothulzgqkycs262ykg63gd4jciknh7tjevcroicvfinmxney64)\n\n今天是大头菜的一天!我家大头菜 104 铃钱有点贵,所以去银酱家以 95 铃钱的单价买了 4000 棵,花了 38 万,买完之后身上只剩 7000 多铃钱了,梭哈梭哈\n\n![ac11-2](./attachments/bafkreic33nrhwl3khey2de4kqrsw4ccqg4rrdix7fwi7gpvbluy2oxd6w4)\n\n![ac11-3](./attachments/bafkreihws2vphjrsjobuyx6corha2l4kchmgmh2ttklyup2n5mxd266mse)\n\n等一个 600+ 菜价,我们都有美好的未来!\n\n![ac11-6](./attachments/bafkreic7ni7x3nrhbjfflj7os4wrqt4mdj6lnvztzkamhqp4o4fk56soja)\n\n在小岛高地发现了稀有的橙色玫瑰花,正好在这里更新下护照照片\n\n![ac11-4](./attachments/bafkreictv4l72ifctophbtj2nr3mi5vqw6bh5slfntyuorbrt7kzd5rdlq)\n\n![ac11-5](./attachments/bafkreib52bs7hcyhntxmo3cqrheedpsyi3dneecgiaepesftj3gbq5pnha)\n\n学会了把图片转成我的设计\n\n![ac11-7](./attachments/bafkreicwolh5ithbi5nml5trbbf2jhw7ernmq7sxbr55h6ki4gfbjrxrqq)\n\n![ac11-8](./attachments/bafkreifquz4ycmo5tnqir6ck3ivopde6vjmlnxtbt2xbru7ln3lbo4rbwi)\n\n![ac11-9](./attachments/bafkreidnxnwxrwefs2abfoqdbejgj252fvhig2ctaednut22xefh7vsvnm)\n\n![ac11-10](./attachments/bafkreifv4vjpbnewqbgoghrwty3lmsp4z2gqied62ltwspenmfcco4wa4a)\n\n晚上去 16.7 家看流星雨,看满了 200 次\n\n![ac11-12](./attachments/bafkreifb4xnrnhwg4yfhq52cpvi6oqbbhnkldfzj3zpqnkkr7vuq2lswii)\n\n![ac11-11](./attachments/bafkreidancsmz6wy3onlwy7goyxczubyoov6o645cuxy5raercqnffcnyy)\n\n![ac11-14](./attachments/bafkreie6zptvkxomcs66xbamc36ujzr6ur7tzqxdiikgb3kq43lm55phvi)\n\n![ac11-16](./attachments/bafkreieqfsm27wdygg3pfddtbvggeel6q7g5ddbmdjvao2xuah3xljyx64)\n\n去找西施惠聊天、拍照,西施惠真的太可爱了!\n\n![ac11-19](./attachments/bafkreihbgrdrwg3yvggmkm6l4rhdtyfgumve4qezxzno4wgj2pkww6ywoe.jpeg)\n\n发现珮琳在用我白天刚在广场放的麦克风练歌,珮琳这么晚还不睡真是刻苦\n\n![ac11-20](./attachments/bafkreigmhxckwwl72jqs6vuax52vzawfarvzbndg7igtm5i2322d5frmqi)\n\n看到阿妹家灯还亮着,去阿妹家做客,阿妹在看书,那我就躺在床上监督阿妹读书吧\n\n![ac11-21](./attachments/bafkreicg7awxrwqguto7nytxx2zyao6zga5ayil6go5mbk2225hpunl7ve)\n\n## 第十二天 3月30日 裁缝屋开张啦\n\n![ac12-1](./attachments/bafkreihrif5bb77u4u5ckutwsb2uvqyx4gohe4wsldp22byumakidia4je)\n\n广场来了一只叫薛革的狐狸(?),继承娟儿在这摆摊卖东西\n\n![ac12-2](./attachments/bafkreia4h36qte7ggllhklucen4fuisel7xbujxlhxgbc6voc7iaz7t5ae)\n\n害,一点都不好看(才不是因为我梭哈大头菜没钱了)\n\n![ac12-3](./attachments/bafkreiex254orbxivkgrd3ncwabhgp2s2wox5xfny2yp3lfztzu4i2uu74)\n\n裁缝屋开张啦\n\n![ac12-4](./attachments/bafkreihvdo4ncx4ladxymz5gez267acz7g4kjxoxrcecwtk46nfxeixwmy)\n\n裁缝屋的试衣间真是太方便了,虽然没钱还是忍不住配了一套超级仙的衣服\n\n![ac12-5](./attachments/bafkreicx2f7q5zprcrhhv4xodvvwoe3yd7qam3bw5e75whan4kr24glsau.jpeg)\n\n![ac12-9](./attachments/bafkreibqccdzh4aucxi7xipekfvtcd3abz4fmggz5j2ijs4li74e7fxlne)\n\n害,天佑非要找我说话,结果给我传染也打阿嚏了\n\n![ac12-6](./attachments/bafkreidj26oalkillfqyzrxxfel4osfnkzkpkw34kl6qj7dwekosufdpxq)\n\n![ac12-7](./attachments/bafkreiallnk3acqghrb6dpd2udjdladdjnkrljlopwjnylwp72r45q3xmi)\n\n第一次捡到大星星碎片,用它做了一个星星棒\n\n![ac12-8](./attachments/bafkreiatocu7asv4ki4havpmqmnltckbw4rnf7uzod6o2vbx3hmexuh4ci.jpeg)\n\n![ac12-13](./attachments/bafkreiavut2y2vktq7gyzoaqol7xled7wlw6lkat3dyaf7uzujfug
318yqr4i)\n\n和小霖、Mitt、仕麟一起去 16.7 家看流星雨\n\n![ac12-22](./attachments/bafkreidlnkurshwlnoaqpo4fobtwokufnzitzfqry4df5gtdxp5cs6fywm)\n\n![ac12-24](./attachments/bafkreibpdub25432pxtroguau4iji5selgoxy65dx7a6qu66vmhfkn6jsy)\n\n因为打阿嚏被强制隔离了,嘁\n\n![ac12-23](./attachments/bafkreif5ar6chpjokm7hkj63vjvedmssxcv3og6lqymhxycqb3qrcoudry)\n\n16.7 家今天来了龙克斯,好帅的一条龙,可惜不能抱回家\n\n![ac12-25](./attachments/bafkreidbgjhu67ffhnycuki66av4fbapayh3palex35bzg2w2kde2e7tu4.jpeg)\n\n## 第十三天 3月31日 收获了大月亮\n\n![ac13-1](./attachments/bafkreigoaakhqmnrroi63n4uirilbak22k6zyv7gucbfde2sfwo7ux5whe)\n\n我现在每天跟西施惠打完招呼第一件事就是去裁缝屋买衣服,迫不及待去裁缝屋又搭配了几套好看的衣服\n\n![ac13-3](./attachments/bafkreifbazqqxlxmfn6ot77tmhscf7w27fb4cxyr2pnudnn3qg3xsmwdla)\n\n![ac13-7](./attachments/bafkreifff5ue7yebsuamdtqkxl67jfibfgc2md6chuehzkhiob262ggtym)\n\n![ac13-2](./attachments/bafkreiarnxrzc6mz2ppds57kyobfgfhoplg3usna3dj4uarwdpwtc5tbem)\n\n吕游又又又遇难了\n\n![ac13-4](./attachments/bafkreiep22d7yvrjox3bikp5auch3hbv5i2snbz7abxrxe3knxnvwluhrm)\n\n收摇钱树、跟朋友互换小礼物、去朋友家看流星雨\n\n![ac13-5](./attachments/bafkreidy7jy6qnhjkj6zbptlp3p7opmfvb22zdx5amrfmxbk6ckzropxse)\n\n![ac13-6](./attachments/bafkreifkr2bmtj6gnvu7jb6nonu3m6xo2fsr2meqtrw5ag5vhzaepwvlwa.jpeg)\n\n![ac13-8](./attachments/bafkreihc5outuzvudx3fo5hqieequoo2fw6vdtma4qtdq325b22q6mc274)\n\n![ac13-9](./attachments/bafkreihgpcljq5gyp2c37m36lcenhwpmymoxq3dcia7rg6ncrayndraj4u)\n\n最重要的事!今天收获了一个大月亮!!和搭配的云朵地板!!太好看了呜呜呜\n\n月亮是奶猫拿到的图纸,需要 1 个大星星和 15 个小星星,又找 Mitt 要了一个大星星才做出来,太不容易了,云朵地板是从欧皇 16.7 家的骆驼买到的,终于吸到了欧气\n\n![ac13-11](./attachments/bafkreihis7yjktgwbmytmisre2ouj3ewevnrwid6hcndpjunml77aynblq)\n\n![ac13-12](./attachments/bafkreieywtykluhaxv32o77abyz476ldb5vyzlavhplnkcpg4aqijb4ok4)\n\n## 第十四天 4月1日 复活节和樱花季来啦\n\n![ac14-1](./attachments/bafkreieexv76luvaoraudhnrohtbeyudczivyi4sjgv7hhueaiuxj4ikzm.jpeg)\n\n![ac14-2](./attachments/bafkreidz26pokfqat2iabpv47spfgp4cecdlecbc6z6vkgwpsf7y4r4ekq)\n\n![ac14-3](./attachments/bafkreihfegf2lkm4oovs3puabq27hb64rk7rt5kssetxparcgbtiiyctvm)\n\n![ac14-4](./attachments/bafkreicfca7f37rgjabokosz5coppw57bpfzrvrsw3nvuiw443kg6ty2oi)\n\n![ac14-5](./attachments/bafkreicl23vqa3mqaabmahepagl4fqoes2rr3dk4drkuxusun6rmckiv6y)\n\n4 月来临,复活节和樱花季都到了,岛上开满了好看的樱花 🌸\n\n吕游送来了小礼物\n\n![ac14-6](./attachments/bafkreiatxgyzyzo3qom7m2t6ohwf3qqe4j2o6ru56gsscq75mfcathaih4)\n\n遇到了幸运兔蹦蹦,他告诉我岛上藏了 6 种复活节彩蛋,可以用彩蛋做家具\n\n![ac14-10](./attachments/bafkreiaf3fwgpmc3xycl5xpwk5o5b7bjwk4545rvxgn6sewahuiiapdxe4)\n\n![ac14-11](./attachments/bafkreietp4wqm65m66ifj7elzw6grbiew5lbwou7tolwl5ua2ixisjuyuy)\n\n![ac14-12](./attachments/bafkreicucm2uv726ttvu4p6xjywthlyr365imk7piii5rmwxxyf45byg2y)\n\n都被我找到啦,飞天蛋、地面蛋、叶子蛋、岩石蛋、森林蛋、鱼儿蛋\n\n![ac14-7](./attachments/bafkreiby72tjkkrhmvicaxkmucpxb5zbzic2ym76ga74hicvh7w4aoaa4i)\n\n![ac14-9](./attachments/bafkreigo67i4ijbrv5ms4yau23lx4y6egdxrfoois7gjvjy2dguc5p2b4q)\n\n![ac14-13](./attachments/bafkreiev2yfp2yumgzx6f2qaf3eac625rh363rucswmotaab2kcuff5oy4)\n\n![ac14-15](./attachments/bafkreieikp6hei2orfs7z3366f2wwpkqz4sedzfvbkl4vudwydlnn4dsea)\n\n![ac14-32](./attachments/bafkreialx4gujpsovxzfkfpp4u2kparlsxqcmhjxnyj7s66vycefc2dkve)\n\n![ac14-34](./attachments/bafkreihe7dvmkpz6tb2jbf6f3blj7tsg35suyyq274pif2wl6vdnusufja)\n\n岛上还有好多樱花花瓣可以抓\n\n![ac14-19](./attachments/bafkreigirsh5yt56zdk2vavfymklqtlnxdzc4diwjeoxvzew5ayqpwdhkm.jpeg)\n\n![ac14-20](./attachments/bafkreihuul2mpyi6oweddqil4m23rs6make5y4etzlfhnxtnevehd6e2ty.jpeg)\n\n岛上搬来了一只小鹿汤姆\n\n![ac14-21](./attachments/bafkreib5rxxa6lixwcc6dtt5xgz2ejskm4gabeejfjpsm2seqffyvurysa.jpeg)\n\n去眠家里玩发现了一只蟑螂,踩死踩死\n\n![ac14-28](./attachments/bafkreih2zhaiqyttq5rkf34wvwfcn3cmzjncc3aflp5pbivlj5bq753rtq)\n\n![ac14-29](./attachments/bafkreialtni5hdsambo65dfjqodfzltou2odhq5y3bhzxwvitzlzdvy6ia.jpeg)\n\n![ac14-31](./attachments/bafkreifjwzqshnezypsossqojkaud47bbeh54mufefxze2sshxodqemira)\n\n## 第十五天 4月2日 高价卖掉了å¤
318§å¤´èœï¼Œå‘财啦\n\n![ac15-1](./attachments/bafkreibghad3dipjon5e6fplxpeavy6zfsydb7kvhsihf6bcmh2igiq56u)\n\n![ac15-2](./attachments/bafkreif6itpc6ptchtjefpwxbqkjs3g3fupmykwtl6s6ahra5abar6pozy)\n\n西施惠真好看(花痴脸)\n\n解锁了小岛评价系统,西施惠告诉我现在还是最低等级一星,提升等级要增加居民数量\n\n![ac15-3](./attachments/bafkreicgtlnrah57xdq2lyfdifnifszcsnif53kohgqaio42mlzfi7cmta)\n\n![ac15-4](./attachments/bafkreia6qujbm2uq55lcgoe37ovoetjussyabjrrqpje4i6tjq44dsjdwu)\n\n群友贴贴家大头菜涨到了 573,赶紧背上满仓大头菜去贴贴家卖,卖掉了 573 _ 4000 = 2292000 铃钱,算来下净赚 (573 - 95) _ 4000 = 1912000 铃钱!发财啦!!\n\n![ac15-8](./attachments/bafkreifgwnawafy55mpo4cx75ix6oygqflywleytbbrjmqk5vdfgx7zvza)\n\n![ac15-9](./attachments/bafkreieinhiql5jt2cri3vei3bjxqmyduxh3zht2oscs7nqedwphle3l44)\n\n![ac15-10](./attachments/bafkreibgnhsc2pwl2sppmpv3r666sebaoae75chmsktm2rcy4wbobefc3i)\n\n![ac15-11](./attachments/bafkreidd7ikwoll2nxmo3be5arfpg7rce6mszjt6ei6bqr6aoruwqxnq3y)\n\n大肆购物、给朋友送礼物\n\n![ac15-12](./attachments/bafkreiaj7nyuilftjmevtvzoexix4vxkjxqjnsku6tvhjw4jcgyx5kng74.jpeg)\n\n![ac15-15](./attachments/bafkreigo5yrtro5apank76i67nmaspb7733bpx5kfhz2cgacz76xc6v3te)\n\n![ac15-16](./attachments/bafkreihdqgymmslry4hf4nopnqa4rmxlbdqtrxxao32rpndsoipr6i2lpy)\n\n![ac15-17](./attachments/bafkreibph4gcazzlavcmxzsijqlyx2kxxgvuysk6c4r5p4j2nr2n54d3ra)\n\n斥巨资升级房子\n\n![ac15-18](./attachments/bafkreiagsbzoud6srxzhl6enego677ix3yeri334remp5ulytczqyd5yfy)\n\n![ac15-19](./attachments/bafkreidcd7gkqk7ox45xdfmdw6o53sxgfnoedsculuvwaohlqdypw47zzq)\n\n![ac15-20](./attachments/bafkreiapkoug4kolgrrardbo47xqkipql5v2my6xterfvpi6lavegixpuy)\n\n斥巨资建桥\n\n![ac15-21](./attachments/bafkreicftyleqylclgsn4vcsolztmdkv33qmmqpxs3gjvdmz5s7ftkkbke)\n\n![ac15-23](./attachments/bafkreicnxsuc5hjk3eewg5w6umgmxyrnt5rt3y25kb26kaunjpczgqpizm)\n\n![ac15-27](./attachments/bafkreifsua7k45cxdrp4gk7lqzh4w32vscry5gxre3vqth3ovgv5vbhwcy)\n\n![ac15-28](./attachments/bafkreifmj7awadgo67wbponoe6qvf7bu23tqgd3es65xdibckqtuxgldx4)\n\n啊,有钱真好\n\n![ac15-13](./attachments/bafkreiejyp6akjidc6kcku2frryuii5wkruklkgs52ixnvwuufmlghkmui)\n\n![ac15-14](./attachments/bafkreife72beo6uynkrxl7vs4cqxzqkz6eaf6vzinfdce54oahhaz6c3qy)\n\n## 第十六天 4月3日 无题\n\n周五啦,周末愉快哦!\n\n![ac16-3](./attachments/bafkreigzoiozxpnco6j3jk4r35u2nca3n7iiew3d7gcoxhkn6jvqn5tz2a)\n\n![ac16-4](./attachments/bafkreiceugmqld5gatml2crycz64ylluos6ffcxy33k7hhcujhmcmoj4b4)\n\n![ac16-5](./attachments/bafkreifgzltzo7c4vdqfo2uptkun7pktsnab6y2kqnbtqy4mohjqychjve)\n\n继续还今天的房贷,房贷就像一个无底洞\n\n![ac16-6](./attachments/bafkreiafljwdcqhucuiq2zqp
3187gy3vto3ilkzepx6oj74rvwnqycgssrijm)\n\n![ac16-8](./attachments/bafkreifwujseq6gm2rkeugd2vvaytapixwr2o3huykj7hkr5fy5xk4rlba)\n\n![ac16-9](./attachments/bafkreicm6xfotttmqoqpoid6jjhjwwxmook7xufd6n2xamnzqgdboi4d4i)\n\n昨天的桥建好了,今天再建一个\n\n![ac16-10](./attachments/bafkreiaask567ekgi2v57s3x4jeduolmkafvbzqh4dpxdr6ksmd2afscwq)\n\n![ac16-11](./attachments/bafkreid2dyum47gqeil24nbow7z7liuh2cmp3qaizvzh5h5vwwtzjwyw5i)\n\n发小表示很高兴,“是的呢”\n\n![ac16-13](./attachments/bafkreicshm36wk6axigo2mjxqm5a5s34ucuklpcomzfzxi7lcaxygogm7q)\n\n![ac16-14](./attachments/bafkreiathzj4tzhkffyg2svjk2o7uexvabobqkwpiqee4bkpoosk4zwwui)\n\n最喜欢的阿妹跟我说想搬走,我好难过,还是把她留下来了\n\n![ac16-15](./attachments/bafkreidz47fk7nhqwgdgqrnxytnf6n6pb26jihtsv6yuvfewf3qlpdzj6y)\n\n![ac16-16](./attachments/bafkreidbufobpe6yppmalgng63ocvxk4kyatjbyzbvofgnrfliej4jwhfm)\n\n确定这是泡澡桶么?怎么看都是铁锅炖自己吧\n\n![ac16-17](./attachments/bafkreiaaanrpibrgbg4kldqnvbfdqpkjzipu3cgduv7dwxh7re4vuus5wy)\n\n跟 Mitt 小可爱互换礼物\n\n![ac16-18](./attachments/bafkreia5rj4opvqazjizvnyh6zwgx3rkkk4aifxr2kyj2d3gmctuez7pie)\n\n![ac16-29](./attachments/bafkreihc6bwl3pndtwkimreu6qc4j7s6dkdia34hw2pxww7etfuf2fw3oa)\n\n有新朋友来岛上玩,兔非和栗噔噔\n\n![ac16-19](./attachments/bafkreiekrfwpusnvbxblzt5sxvukixpmiio4an725vdh54xtqc7qj6ap64)\n\n![ac16-20](./attachments/bafkreidupvy3thzu3poabzwy6zujplctem25yaupiqyvjtyvj56s4wl6ri)\n\n![ac16-21](./attachments/bafkreidtvaobc37lx7x44ie7myp5fejdsgbxcc4rytqstgqt67oeukbljm)\n\n![ac16-1](./attachments/bafkreihf6g7clq4dv6afez4xs2cgokeewgvfdkeeuievwgdpndqjranmwi)\n\n![ac16-2](./attachments/bafkreibp7yx6xdukespz2q5wfd6bjmiyuvvsnjmvdffx7n2w44kfpxy36y)\n\n这两天攒了好多复活节家具\n\n![ac16-27](./attachments/bafkreidlnergbt2woale4mchwnkrrlncqmlrfhari2umcvr62fhfzal6le)\n\n![ac16-31](./attachments/bafkreicrn4bhbriewoucvu4q6dgsvtrqnj2clulpxiwy4y6u5cjx7ltrl4)\n\n还在朋友家摸到了目前见过的最贵的奢侈品钢琴,虽然昨天发了财但这么贵还是很舍不得\n\n![ac16-28](./attachments/bafkreih32xplppd4gnm6w5c75bik2dienbjf4sskauib64rosrccuhoucy)\n\n## 第十七天 4月4日 无题\n\n![ac17-1](./attachments/bafkreiaj5k7yjogdx55lmkxfcgcy7tje2ouqhwz6n7c2mtteyi6llbfl7y)\n\n![ac17-2](./attachments/bafkreigefvozhw2k7bl6xn6w2b2yvfacinxntpvdkludq4k7tmqpxl4rsi)\n\n周末愉快!\n\n把一个房间改成了乐器房\n\n![ac17-12](./attachments/bafkreib3dl5nfmqomvxojwq7ds27fnjeehrlabveyryhi7dezauj3w2ora)\n\n今天裁缝店有卖很酷的盔甲\n\n![ac17-4](./attachments/bafkreihd4m6otdwmzqtjzh7eds3nmu5rvwihsgusiswcyvsmlbxw6qwi54)\n\n抓到了一只粉粉的蟑螂\n\n![ac17-5](./attachments/bafkreid64dz54gwt27paxcih2skx4xxn5twqoojsoqt7c4czno4gygxyva)\n\n发现这个复活节挂钟整点报时时候会弹出一个可爱的小鸡,然后叽叽叽叽\n\n![ac17-6](./attachments/bafkreiacwyopvxuthcwirdgjpsm5j2byoipf23cddpuduaeozfr64cjxvi)\n\n复活节家具越来越多了,都快摆不下了\n\n![ac17-13](./attachments/bafkreiemo5x2uyckeapghwomru45e5o2cmqjamzcqcqxddzjamodaxu3am.jpeg)\n\n日常跟朋友互送礼物\n\n![ac17-14](./attachments/bafkreihfkuv2wn7cotpkouxmejde2k7dp3cj7pedkgqisafnparngcuq3u)\n\n![ac17-15](./attachments/bafkreiflchkobflzqons56mh5lixc2vnqgomy3r3lw4uwcn32omrn5kyba)\n\n![ac17-16](./attachments/bafkreicig6sgf4k6v5m2qtuteqx4yy3la2jc27i56onypk6tjucbdtycka)\n\n猫头鹰妹妹终于来我家了\n\n![ac17-7](./attachments/bafkreigmeu7jpd4w4xngv6mmldlzwizucw35no262iht5if6r5asmjqp4m)\n\n偷看西施惠,西施惠在嗅嗅\n\n![ac17-8](./attachments/bafkreifi4pibzm2j3ij44ar6gfjsf36bld7owxgtbgm252lwgusxuezcra)\n\n昨天的桥建好了,但今天还是不要还房贷和建桥了,等明天再梭哈大头菜\n\n![ac17-10](./attachments/bafkreigx5fh2o3ef7ruzeufemmxbpj63elgukz6ufgu7yzpdpavjnueh2a)\n\n圈了一块地,好再邀请其他小动物过来定居\n\n![ac17-9](./attachments/bafkreia5jrpmorxujoftl3taywzohbvsx7pp7t4m55kwfjvdncgxbxc25m)\n\n在无人岛遇到一只埃及艳后,emmm,怪怪的,还是不要邀请了\n\n![ac17-11](./attachments/bafkreicojzpmsvwnfc67ulnkamhndi3nk6b7yb7fsuvhj2uo5aygcnqp4a)\n\n## 第十八天 4月5日 充满希望的大头菜日\n\n![ac18-1](./attachments/bafkreifxghafs3ulpx7kdo6ccw5f4hu3g4ewnrwaglyb52o2m4o
318724noam)\n\n今天是充满希望的大头菜日! 这次继续梭哈,买了 3 背包,花了 92 _ 4000 _ 3 = 1104000 铃元,投资这么大,一定要卖个好价格\n\n![ac18-2](./attachments/bafkreigpv3hf3h5gvz7ntskyfnmt57ezduj5gl6tq6uivh5cbb7xds6i4i)\n\n![ac18-3](./attachments/bafkreieu3svjzk535rkz2og6yimg2lo3gqr7ylggypiradhtbkvn4vybma)\n\n![ac18-4](./attachments/bafkreia4jjjxzmmjv46mpl5dhcaq4frwvyjkuxej5nfxyoov6xewyaprha)\n\n到商店买了一套护士姐姐装\n\n![ac18-5](./attachments/bafkreica63gzkd5d4piay6aylim3ijewp3euczswizrdsori67vs7idmkq)\n\n![ac18-6](./attachments/bafkreicrfhysstlqhweebfefrx33hf3tv2xqumcy2r5aeqp4kuv7bh355a)\n\n到无人岛瞎逛,遇到了一个金钱岛,还抓到了皇蛾、鳄龟\n\n![ac18-7](./attachments/bafkreidhe3cw3btp3hp3nnivdouz7vjcjm6anfz6fnut4mbs3xrw2hcnti)\n\n![ac18-8](./attachments/bafkreigd6ovsmacm5l75m5x3cnbvfxyzeqe3sgoipnj66ffyhncsnr55ci)\n\n![ac18-9](./attachments/bafkreicy77sbu7ns2b7xmxhjrh6zv4rfezzicwdbribqybj6ntyn4xjvgi)\n\n![ac18-10](./attachments/bafkreihdl5n6oqzef3dkm3wygvpqkn4rcygwxk6wwyue4zoubkg2thy4ia)\n\n做了一个好看的贝壳门,放在机场门口\n\n![ac18-11](./attachments/bafkreidjjn5crfdx7fbl3gyuvgou3v6qolia2n5dohhttj7lv2p2emxjvm)\n\n## 第十九天 4月6日 新岛民小鹿布鹿斯\n\n![ac19-1](./attachments/bafkreibkuht4fmx53ux7hvvsset3b4yjqb5a4adl6ribqlj3cvp6wmndj4)\n\n![ac19-2](./attachments/bafkreicsgdrfbrbomqacudncraeu7ihbupobbal3lmgvkxurubkrx4vig4)\n\n小岛来了一只叫布鹿斯的小鹿,去拜访一下吧\n\n布鹿斯也太街头了,吓到我了,不要这样啊啊啊,你走你快走\n\n![ac19-5](./attachments/bafkreieirgghg25uhab6qrnptwh2anktq4hx2yfpf5xho7yc7dqxnur5cy)\n\n新朋友 ch 来岛上玩,ch 刚移居,衣服也太丑了,送她几件好康的吧\n\n![ac19-3](./attachments/bafkreihm2a2lunygekmwkjnwhtbtghd2vrux4lmqbr5hhwppti3l7admim)\n\n![ac19-6](./attachments/bafkreify4fc3yd7f2w2fpuwlb5agsn34zvcaxnzuf67cwehbn3e4pimtn4)\n\n还有一个新朋友五花肉\n\n![ac19-16](./attachments/bafkreiftdu5hju3eztcv3imtscybkeohx65qt4xjfbdzzqj6phgto3augu)\n\n买新衣服\n\n![ac19-25](./attachments/bafkreigipen6mfbofo3nkqp2q2enmq6liczusdoiu64jjpqepdt45hniaq)\n\n![ac19-26](./attachments/bafkreidcym2hldy3xd6dlekma3djywxvuy32ct2sotdxxk3km6hdfwsm7e)\n\n![ac19-27](./attachments/bafkreiaft55y4zjor4ht4lushpkg6c46ih3t272p2vqyljjjcwf6jpadqq)\n\n今天小岛也来了流星\n\n![ac19-11](./attachments/bafkreif26pem7s74g4t5i7673tv6qcb7ronjttqti66cmfww273tlwigva)\n\n再装扮一下乐器室\n\n![ac19-12](./attachments/bafkreiaibsds5ykdvo7plefkfpy5dhien4fsia4pkabnclwby35zhykxmu)\n\n找粗粗要了一个比萨斜塔嘻嘻\n\n![ac19-28](./attachments/bafkreicjvkt7wok7kwvc4bczszv4tb3wh3cw2cingct2p6fsp2kmp2zgm4)\n\n![ac19-29](./attachments/bafkreibnwopm2o2estil4trw3sv24s7sfqng5rat4cf2xur6hn5kfpl46u)\n\n露营地来了一只叫西瓜皮的鼠鼠,好可爱\n\n![ac19-7](./attachments/bafkreigfwsovydqxzz6zx55dcwpbufkimos6u3oiwv2wez6mruuj5hdnfu)\n\n西瓜皮拉着我玩了 3 把猜纸牌,都输了...\n\n![ac19-8](./attachments/bafkreih47zaol2n5463andnvuuvdkvgm7egfkfzxnuijrtkfyylvbcsfnu)\n\n![ac19-9](./attachments/bafkreia5rf433oqdcbmn2tyy2hmf62ymgujfzsgh7vqoxs6zafgmuw44we.jpeg)\n\n![ac19-10](./attachments/bafkreic7cznv5rqgclcg6sxygsyoftimi73wdyvavaainfez7pmebjhjqa)\n\n西瓜皮好可爱,想拉她来我岛上定居,但...哼,诸多借口\n\n![ac19-14](./attachments/bafkreihktdxlk2isqsrve3bwafncsqpmfzujpkcmw2f4wwzp4mrwatsx6q)\n\n![ac19-15](./attachments/bafkreigv54ntdjsjvp6eblixges2ugmdolnkl5trcnyxubvj2ftzo3ymna)\n\n![ac19-24](./attachments/bafkreihwfjfxu7vkmcl3ec5ldh4tojhnt3bm2iup32igxobgferfegxjiy)\n\n不要西瓜皮了,我要去找其他小动物\n\n![ac19-17](./attachments/bafkreigcmqia2xbgt5pznm3vfakpsnr33nms5gp5wmufhnrjvvpq2zcczm)\n\n![ac19-18](./attachments/bafkreictvxdut66uo6ha36cd2jum3o25jdsfoqmyqkxrrkedzoagqd6uba)\n\n![ac19-19](./attachments/bafkreiactcfpnl4huizbi5blwznhcqrimwhwnw4hzw2lmnicn5fa5zeg2i)\n\n![ac19-20](./attachments/bafkreicetbcq363hliybyszqmwzl75imgt56j4sg5roj6uja37y55wqlye)\n\n![ac19-21](./attachments/bafkreic2zvvzhp7dm727pxqoew4k35lvvjy27qy2edjbrxdcjw6rajftdi)\n\n感觉都不太对胃口\n\n又遇到了一只鼠鼠,嗯!就她了!\n\n![ac19-22](./attachments/bafkreiak4a5sqa673zawulwbqdnw34qvodi6x3rjni5dzzo5mjjdmp5oga)\n\n![ac19-23](./attachments/bafkreifwtvi465bfxwqbixxhur5jriqn5uxvnyaznoauukuqj5rwmcugle)\n\n## 第二十天 4月7日 新岛民丸子、这次真的暴富了!\n\n![ac20-1](./attachments/bafkreid6qj3hscknna66hk2x7vctqli2ypuhcqdgrpypby6qbc2ydkkdwi)\n\n![ac20-2](./attachments/bafkreifqmk2yey3dwy5vvrioceqrcqf6fi5wikphacwyjpha2lsqemxtl4)\n\n昨天邀请的丸子来啦\n\n![ac20-3](./attachments/bafkreiclnxi7bvok3pavbavdx3sieuzptecubk3pitwjwkagoptl5ex5ma)\n\n中午听说 Mitt 家大头菜 607,è
318µ¶ç´§è·‘去倾销大头菜,把 3 背包的大头菜都卖了,净赚了 (607 - 92) _ 4000 _ 3 = 6180000,这次真的暴富了!钱都装不下了\n\n![ac20-5](./attachments/bafkreibzpjns5p4rhpvdyubshwqpp3tk45jib75e7fg47rrn5i2ldkrmri)\n\n![ac20-29](./attachments/bafkreiae3vagffgfj75upbuzs3fvgxtpfrhekihhwablomxqozzjt54uju.jpeg)\n\n![ac20-7](./attachments/bafkreibr7thg5t7gjgjiy5dvjzz4dfqlazr5db64ercgsujgcwmkknu2cy)\n\n![ac20-10](./attachments/bafkreib4cy2skxtebpux7riktozvmlsygrqgxtmsgylfwjmjipgsbj7y3y)\n\n给大功臣 Mitt 寄一台我岛上最贵的奢侈品钢琴表示感谢\n\n![ac20-8](./attachments/bafkreibdl5ydsyeiu55zo3wjtyqth6bkwr6m4kzqmxkejap6pgm3bjgoea)\n\n![ac20-9](./attachments/bafkreiapd264l674efwyg2qtpdh6iupveflvgwa3bjamg675vmvwsvijem)\n\n今天也收到了很多礼物\n\n![ac20-11](./attachments/bafkreihfpuvu3eqa54se6cktkers7nbr4ynpgndxbknhjspog4x6rkdxgy)\n\n岛上又来了流星\n\n![ac20-12](./attachments/bafkreidh7ub5h3omyri67yrpyxg2aj56hsvk5iwki3uj623jdbfhr7nx7i)\n\n晚上 Mitt 和小霖过来玩\n\n![ac20-14](./attachments/bafkreigapsnadzgyycg42x35ilpbd5ef5cjjpjfsul2sh3qr6ujkqbwiiq)\n\n趁小霖不注意跟 Mitt 睡觉被小霖抓到了\n\n![ac20-13](./attachments/bafkreid2urq5tdxuulh45xhygbjrcdopuvcumsirfe4wau65quyxouwcke)\n\n又趁 Mitt 不注意跟小霖睡觉被 Mitt 抓到了\n\n![ac20-16](./attachments/bafkreid4f4tjko7yuhqbqvfprpyrqq2seuknc2nt3tu3foz3xqmgh5vwci)\n\n![ac20-15](./attachments/bafkreib3rceh3ftoyldcbtjgnn23vw3gxlaieslfpczef6ehuguhdesspa)\n\n暴富了又可以扩建房子了\n\n![ac20-17](./attachments/bafkreieztf6b637xr4566tjhyqjogqbvbo5rqji4dv5xd4tkiynkr2pa3u)\n\n![ac20-18](./attachments/bafkreicqyiarfbs6whwuv2pjncgodc32hdpqpx3jz2o4gfjhxubasmzhka)\n\n西施惠收到了一封信,突然发现这封信是 kk 写的,狸克马上给 kk 打了电话,明天 kk 要来小岛开演唱会了!\n\n![ac20-19](./attachments/bafkreigj7qhkf2ftl67uncrn3etoizjqblzfy7chzffptn3ji54nygh3v4)\n\n![ac20-20](./attachments/bafkreihfilsloack5yjtoj5c3wttxadbpvxjr4j73wd7ls7vibglsfm5ti)\n\n![ac20-21](./attachments/bafkreifrszv6uvqvlicrnk6rcezbvggplxmcbcz75dx2rdiwirbndq66de)\n\n![ac20-22](./attachments/bafkreidurfmxfgywf6godeed66qpkgcptx5zpeki7oxu3ouyrzoccle4xy)\n\n![ac20-23](./attachments/bafkreidctrwjpadp3utgb2zssex6rcpc7rqe7fnnmsvot63aublrsw7xau)\n\n![ac20-24](./attachments/bafkreih3uzmc67vxx7dletlgro5hfv6hmwjowbexh4rioq2xfs4gtwnzwy)\n\n![ac20-25](./attachments/bafkreidqdr7tu2v7q2hz77zrqp4c56pbvkgddzdyfl65sbnjua5rp5qy2y)\n\n![ac20-26](./attachments/bafkreibqvtvc5i3bkvnfheyixn476ezi7hgy26dbugm4g5uighbvviiw3u.jpeg)\n\n期待明天的演唱会\n\n![ac20-27](./attachments/bafkreia6nbghabpggq4fcfmtbrkuworvh5om6dixeaa2ibgyh5vylcysuu)\n\n![ac20-28](./attachments/bafkreibwzahrqtnjhrpknjrhkxasog2rbygnv3z5fq4ajvmhfkbmvjqxze)\n\n## 第二十一天 4月8日 K.K.演唱会\n\n![ac21-1](./attachments/bafkreig4hne5gpibfhy3y76ktoyqb6am5tzokmvcthk2zy47hqq4ut7rnq)\n\n![ac21-2](./attachments/bafkreic57a2hm2kcdlfuie5iz5lsmwjwgx2dnbt7z2lcqlkunhm7qkxyh4)\n\n![ac21-3](./attachments/bafkreicnjcimnllcfo6diofubbid7oapi4iv7brfuj3cztei5vlmj6lctm)\n\nK.K.来开演唱会啦!是一首主题曲《大家集合吧》,好听好听\n\n![ac21-4](./attachments/bafkreidapew3kfvfrr4tl2v63ytgxnl7jk23ytowglv3e2wtdxbqfvwhyy)\n\n![ac21-5](./attachments/bafkreibzggweoscxdujndhmg7x2usdshtc2gjfxqn5l4rln37n7kzxo5qu)\n\n![ac21-6](./attachments/bafkreigg6kws7hu726wx5uw6pjj5efiv7fypiiym35v7x7u3fp5km5vmbm)\n\n![ac21-8](./attachments/bafkreia3ikbjqapq3bl6rpnxx5lp4kxwbdes4j53hkghp5q2alitrn3qsi)\n\n演唱会象征着小岛生活暂告一段落了,进入了一个新阶段\n\n![ac21-11](./attachments/bafkreig2qzoqujrwfuvewrotlzpyb52qsw6vtffcit6pq5xherx57uii5e)\n\n![ac21-12](./attachments/bafkreigr7mmrewxnfja522bxbpmfdcgqdh7sb3ywihoiz4pt5qfeiaxkp4)\n\n狸克允许了改造小岛地形,感觉要进行一个很大的工程\n\n![ac21-9](./attachments/bafkreihwwccibfszoirwcjb7zeadhfc7aqunss6ynxl3mt53te77advbpu)\n\n![ac21-10](./attachments/bafkreiakd2i3zbjwctz742x27oirxk7io6d6fxekpvmqqp7lxgzc4yy7nu)\n\n房子也扩建好了,多了一个超级大的二楼\n\n![ac21-13](./attachments/bafkreife7g3ra5fo7idnmn5fxtpeyplts22aqkr4paixrwb7s7mnlxoi2q)\n\n![ac21-14](./attachments/bafkreid62zyyrnj2crsehman
318hfk52gdufqbme2qyxygiu3brfo7froo4sy)\n\n继续还房贷,还可以扩建一个地下室出来\n\n![ac21-15](./attachments/bafkreid42rivbavvuvfh2633fceywhm2avfivoq4mg5ojcfyr4xwpu2uni)\n\n![ac21-16](./attachments/bafkreidu66kypvqaakmoygptsew4a457bmxt6jvzgrq3lvije6nxflbrte)\n\n日常买衣服\n\n![ac21-17](./attachments/bafkreifhtcxfgvsu3s7t2m2ae4a4sf4fu3pptgdgiv4jorvs3ob76sqnby)\n\n今天好多小动物来广场唱歌,大概是受 K.K. 传染\n\n![ac21-18](./attachments/bafkreifwpruzddkcfy5vosg3rve7cvhkswacewa5fwusw4c4qy5tzmm4y4)\n\n![ac21-19](./attachments/bafkreiccgwes5x2b5xjisrkjb2mdclhudq3sdap6vlvdtpcebempyw5jrq)\n\n![ac21-22](./attachments/bafkreicbw6svjdfpi36xbnp7q6evmvv7bzfp7nxne6zn6la7pebp7kwz6y)\n\n丸子和耳光好像都对这个化石很感兴趣\n\n![ac21-20](./attachments/bafkreihh44jgo77evavergentq4d7xz3nvijr3mvevt2gxklzzy2z6vt7u.jpeg)\n\n![ac21-21](./attachments/bafkreibotg6vgp4r5vblc7bjhuf44jl4s63qe743sa6sjegv6oygyqenom)\n\n晚上去五花肉的岛上玩\n\n![ac21-23](./attachments/bafkreiftcbm5rstb4dvep7p2ywkvpasbjwpfk6f2knzaqv3okb5fb7moia)\n\n![ac21-24](./attachments/bafkreibbp7yeslzvwrnehwspcg6o2xxtzrkwl4pe7kyzuvxpknxqlkoe4e)\n\n![ac21-25](./attachments/bafkreifpu7lpr52bgjkbt5nvwtlk265sbnhvnp27fv57bvnha4ljypqx7q)\n\n![ac21-26](./attachments/bafkreidlxp3lheghjcrxmmycswd6k3en2c5o5eoarnobmqhw2gubj3muzy)\n\n![ac21-27](./attachments/bafkreif4egutfvrlwvgqvamj4h4lzrbbjhrdtqdxljjd6eh7f7epd2a4my)\n\n## 第二十二天 4月9日 我做国王了\n\n![ac22-1](./attachments/bafkreibn6kiv6ihqfq5j4ni6s22b7bxrwpparnbdm6yrb5agatyqpihxsm)\n\n![ac22-2](./attachments/bafkreigsopujwn5m2kl46eka4qcrde6tm3dln4tor2yjawaink33ylzrva.jpeg)\n\n![ac22-3](./attachments/bafkreigwsec7ztoroog5daae4kp6wwyjupo6qhdd2xpgiwhyne4tylmmgy)\n\n今天扩建完成了地下室,已经没法继续扩建了,还有点怀念有房贷还的日子\n\n![ac22-4](./attachments/bafkreibx5zlprz2h7kxnx5aianp7lnqoa37qrhyt7prmyjyq6pt4hx2owe)\n\n诶这不是吕游么,你又来了\n\n![ac22-5](./attachments/bafkreibia2vkjvurymkq3oeqm5hhqqxs5ocg7yajfkov2ubwsh5qbabiti)\n\n![ac22-6](./attachments/bafkreihwz5pnyjrfyl6tr2azew4j6azbejnbrwbv3djj6hh53nrqx6nkyq)\n\n世界那么大,汤姆想去看看,说实话,汤姆刚来的时候并不喜欢怎么他,但过了这么久我已经有感情了,还是舍不得,不许走\n\n![ac22-8](./attachments/bafkreih6z4p2ipdunoy2vc5fvbp54f3hl6lqxg3yucwb5lymye7bxrazue)\n\n![ac22-9](./attachments/bafkreifsdplcttsxdnd2olr4k32p6po4zeyhgalqb7j2ggkzl2rhqwf5xu)\n\n![ac22-10](./attachments/bafkreihoaclmfwb76npg6hlqaozgkfifcmedpvolw42ulx424mauu3xzeq)\n\n布鹿斯家里更奇怪了,不知道布鹿斯打算什么时候去其他地方看看\n\n![ac22-11](./attachments/bafkreide2l3dvnvizssvtwfku4uwhkazbcqo3ydaclqc6tnlz4molyoioi)\n\n阿妹还是可爱\n\n![ac22-12](./attachments/bafkreicojdwjqmsbbutvjvnboznvbgzdaa44la3kqleq33q3rjbybmlrke)\n\n汤姆开始彩虹屁了,嘻嘻\n\n![ac22-14](./attachments/bafkreifeds2m4kn76olzaqj5d6lf7owokrne37xzmdgd3ys4r2svyhfhau)\n\n![ac22-13](./attachments/bafkreihoo2b4y3xsg2wt654lukl4g4zvat3e5t3bkjxdwpv53uhistx7oe)\n\n五花肉给我送了好多东西啊\n\n![ac22-7](./attachments/bafkreigeamseotivofg4kj3fiyiuoylztzvsos2svdtobmc6m6lt6ix4dm)\n\n![ac22-15](./attachments/bafkreid5efgmk2jdbvilsas6yrrsjvrbmuyqjdvsytej2bk2knulvv5ydq)\n\n居然是国王服和王冠!我做国王了哈哈\n\n![ac22-16](./attachments/bafkreieknqjks667d7kjf5celxzlwkntoaltyyye5gpvkdd5vefc6juhny)\n\n## 第二十三天 4月10日 蓝色饭团\n\n![ac23-1](./attachments/bafkreib34xi6cuiirf3hh6zdzziqddisuym6qrrtykduykx2nyl5r4lmim)\n\n今天是周六,K.K.又来岛上唱歌了\n\n![ac23-2](./attachments/bafkreibwhr26mbsm5oiwihwr6fpf3nsliity2px66jump4lrp52jc2iwpm)\n\n今天心情有点不好,点了一首忧郁的歌,K.K.选了《蓝色饭团》\n\n![ac23-5](./attachments/bafkreianerqdyeivvaqxwocyihkpicwiwmrzy2vrfbhtmdk36utgmi626u)\n\n![ac23-3](./attachments/bafkreibbh547qilyzbe4hyobww4g5i2v3kd5ygxslbzmjo54jj6fqjt6q4)\n\n![ac23-4](./attachments/bafkreieh5zssjtwczsz5njj4l7hyxmiw77bzm5zlobtqzqq456auv7wsnm)\n\n超级好听,完整视频在[这里](https://www.bilibili.com/video/BV1ce41147u5/)\n\n## 第二十四天 4月11日 钓鱼大赛\n\n![ac24-1](./attachments/bafkreiemhnoibd6hum4l7yxgzlhet3sojlcnoooieuwvwkevgfo23lmh24)\n\n![ac24-2](./attachments/bafkreicme2ma7g4rvzn2vummh6hkue567aaxtnka2w3s3vnnunuqk7qmx4)\n\n![ac24-3](./attachments/bafkreiaa4h3wbulsi5kz6pdfx7a662zc2hpyly3guh6baean563yeeotwa)\n\n![ac24-4](./attachments/bafkreia27yglwo3muyzsey5lfm6spnesj6vyevlh3kwoarzme3lmuqdisa)\n\n![ac24-5](./attachments/bafkreid6ztbui6oljxqb47aotjapepumurbzz6vk5jbuwguvjtlfyo34cy)\n\n今天有钓鱼大赛哎,还有,可爱的耳光生日快乐!\n\n钓鱼大赛的主办人叫俞司延,名字真不错\n\n![ac24-6](./attachments/bafkreiclzhsoqxnen5flcpznvrezmu6egh6x53csod3sgrvasi6i3nzzc4)\n\n![ac24-7](./attachments/bafkreigpr2j4d363x5u5x6fhj5mvwacd5kjwm2h7ptblayit56zur7xuce)\n\n![ac24-8](./attachments/bafkreif33cep235ev3cf3vngca3hj2ctvsz6vbfnt5ynkyvbg25jz4ijfe)\n\n我试了一下,不用鱼饵 3 分钟最多可以钓上来 5 条\n\n![ac24-9](./attachments/bafkreicgqnnf473qx4ry2momejzpfdhlo5v6upvm4auyvg7ex55cggkhbi)\n\n![ac24-10](./attachments/bafkreifp3jppntlxfnknl7wms5iuk27l53efrormg3miabj27pskb4zu4a)\n\n如果是多人一起钓还有额外的团队点数奖励,所以约了好多人一起钓\n\n一轮结束后大家在排队领点数\n\n![ac24-11](./attachments/bafkreid7eikecciqfzxbneoc6vjup7rij6a6uderum7e
318s5kg6vjgl52vey)\n\n跟朋友们钓了一天鱼,领了好多奖励,很开心, 6 点钓鱼大赛圆满结束\n\n![ac24-12](./attachments/bafkreifky6jwumg337n6dij35g6sfxyuni53pu5s4br64udm2wxvm6ngbe)\n\n晚上 kookxiang 来我岛上玩,一起在我家里演奏乐器\n\n![ac24-13](./attachments/bafkreied7qilank3fuk3cz7bc6s75zvamzdmhy3mmgzcs2fs4aafwedgmq)\n\n## 第二十五天 4月12日 复活节、大头菜日\n\n![ac25-1](./attachments/bafkreihevpxgexhy2w7ieo4rmg3c4z3owecsngyijuxzmjaaoj27uxdjya)\n\n![ac25-2](./attachments/bafkreieqeqpmj4yvpc7ri7c4kwrmkvsg3g2tuok35vcfcu6fuvtxx4piza)\n\n承包这个笑容\n\n![ac25-3](./attachments/bafkreibrm46l3iezbqksjbw6enjuaffzt5nk6wsqxxq54dx366toet5uou)\n\n今天是大头菜日,早上一起床就跑去 Aaron 家收购便宜的大头菜,这次一共买了 90 _ 4000 _ 4 = 1440000 铃钱的大头菜\n\n![ac25-4](./attachments/bafkreigamvisk5i5ous5gm3lydum7k6v6by6jjtwe4xaudxtksd3ha2doe)\n\n![ac25-5](./attachments/bafkreihnhcawb2xqsbw6j34fprbwpoxszfqyco6dqt5xnlru3z6tqhwzwi)\n\n![ac25-6](./attachments/bafkreib263wofqid2p4gmlt5fudlcf3qxvyxajb7hrk7tqmqrnpv3qywsu)\n\n![ac25-14](./attachments/bafkreihh2wmmln6qwe73fi5mmqlrhgj4ta5yuo75lc7ucnj6qjmg5ffh7u)\n\nAaron 家布置得太精致了,偷拍下来回去学一学\n\n![ac25-7](./attachments/bafkreifhns37clb5tuuifsf2zqjauo4lkuj5ylkagpanx2ifjtcaq3hutu)\n\n![ac25-8](./attachments/bafkreiejiakg4etdeexy755bnjzwpagkjx4nrpvnuowjlnjz6wx4ys4kq4)\n\n![ac25-9](./attachments/bafkreig3miuxihcsn3ftbnrzwuebv2bk5wwd5xn5lpsmiamj435xie7r6i)\n\n![ac25-10](./attachments/bafkreic7krn4244v3lvlccswagpdp72hda2yekwragyigthwpndhmnddse)\n\n![ac25-11](./attachments/bafkreihnqoa3azgwdmefivpocnuscu7ses4wlogzhdbt57e6lsw2yyt74e)\n\n![ac25-12](./attachments/bafkreih5jy2vs3wpowlle2zmnzkmomr2nk2rrzxnqoayoqd2yrbe2hob5m)\n\n![ac25-13](./attachments/bafkreiaqp4222bar6jkv5vj627jquia52pga3wamcnouywhj3vyefpaxpa)\n\n收到了昨天钓鱼大赛赢得的银奖杯\n\n![ac25-15](./attachments/bafkreieze5gyyt6fynt4yujagq4y5jwjiocqchcvytlux5qg6bcj3rwvc4)\n\n这个复活节不倒翁还挺好玩的\n\n![ac25-16](./attachments/bafkreigeiypzyros6zktcghklxrhilriq2pdcosyb6grybfoujt5y6ur4y)\n\n发现离蹦蹦比较远的时候蹦蹦会叹气,很沮丧的样子,走近之后又会很开心地蹦蹦跳跳,感觉好可怜,我再也不嫌他烦了\n\n![ac25-17](./attachments/bafkreidrmaui75bv64xjwx6te6nelddhvmjk3co7wnbgfzm2sn4xgjwkgu)\n\n![ac25-18](./attachments/bafkreiebevmefzdorb7rd6of55khdcdt5ycjnp5mb4376ucocnmaezw2em)\n\n原来布鹿斯也发现了,但是不要当着蹦蹦的面说啊喂!蹦蹦就在你后面啊!快不要再说了!\n\n![ac25-20](./attachments/bafkreia7pfmvh6ws6zinjirpvy6axvdkkrsf4taccohc7ptdyjto3cafhi)\n\n![ac25-21](./attachments/bafkreicwilzqmnbd65cvu7vknekqhkos6ljzt4rsdbrd3lxlp44aawftmu)\n\n收到了五花肉的豪华和服架\n\n![ac25-22](./attachments/bafkreib7uxdyojwkv4hv6nvf4abmz34t4v6inpvhyrzj2sjyidmqi5hi2y)\n\n![ac25-23](./attachments/bafkreiasydmzhuinfm3vvp3ipn27o7zn2vua6wygvyjhxyklyc3czw7jyy)\n\n## 第二十六天 4月13日 最棒的礼物\n\n![ac26-1](./attachments/bafkreifvslis6kryo3xym5tfk44pvdswnzsw7urp7v5hjjje4tgvx4q47y)\n\n意外收到了粗粗的礼物,虽然只是一个再普通不过的叶子雨伞,我却被感动得哭了出来\n\n最棒的礼物,我会永远记在心里的\n\n> 早就想送给你这个啦,这是我获得的第一个DIY哦!大猪蹄子~\n\n![ac26-3](./attachments/bafkreiag3rp56bek73duimxkh4j63ov6da7fjedtpqzfko6igpf33tcqxu)\n\n![ac26-4](./attachments/bafkreic7ouhq7qd4we2pg2xd3ahc55ubbnhdztkhrwhoqxpdlwi3bvjfxa)\n\n今天商店在卖一个奇怪的音箱\n\n![ac26-2](./attachments/bafkreiei27zohzmjrppx3wdvicvli2z5ghh5rnydkyav5rgfamamergbia)\n\n噫,在阿妹身上抓到了跳蚤\n\n![ac26-5](./attachments/bafkreidjwwcknyz7yhwmkjtflxt4yisnby5saiao6qdcdqrkkmynpgki7u)\n\n![ac26-6](./attachments/bafkreig6onrt65twfwo2vgnbclieqshbnonrcy54kf7fvl2cabimnuospa)\n\nMitt 岛上的阿一告诉了我一个有趣的事,但我照做了之后 Mitt 表示并没有感到高兴\n\n![ac26-7](./attachments/bafkreicgrzyomrb2i6qj5e2vccz4nilozil4tdc5vl5vpwibcnc6dleeyq)\n\n![ac26-8](./attachments/bafkreif54ri4qg76vfbpmx4flbah2lzdfykqdoijbf7chlwo4hapzkvopu)\n\n![ac26-9](./attachments/bafkreib6isrkvqkdsdb7gjbfxmnuk7sxnalmuo22mdxhlfmnuofs6mk7v4)\n\n谈理想\n\n![ac26-11](./attachments/bafkreiapu22xnsoeyppycueoktsxshlf4eadfsj2r2rd3m5pak4yni4k2a)\n\n![ac26-10](./attachments/bafkreiaavxhapyvtzauwdlzdvdvkdk2hxlktlm6udhxbzezfv5e3mbdx6y)\n\n## 第二十七天 4月14日 大头菜又暴富啦\n\n![ac27-1](./attachments/bafkreibnplk6jfdl6fz74i7j3z7dli3v6gcvzlv5m2taj3dmi7h5dnt3dy)\n\n![ac27-2](./attachments/bafkreicl445pcgourb7yp7sk54delkb4hmh2aqusme2fzxjgjbrcmthwme)\n\n今天薛革来了,有卖一个好看的洛丽塔鞋,适合配小裙子\n\n![ac27-3](./attachments/bafkreicc6ofgj2jegfhznqywf7f24r5zbo3ccraoqmas4lhlpavieunw5q)\n\nMitt 也送来了叶子雨伞,感动\n\n![ac27-4](./attachments/bafkreiakwzmaai2n6u7ihenoxdnr4s6rig43wd4umbhaiwnx7ip4atvskm)\n\n在 Aaron 岛上听到了《K.K.偶像》,超级好听,比《蓝色饭团》不相上下,下次 K.K. 来一定要让他唱一下这首\n\n![ac27-5](./attachments/bafkreiejoii3pi7wncvlrp7z3x5l6npjbnpjrnrpe5j7x5ulp63fqm3sse)\n\n学会了做超酷的月球车\n\n![ac27-6](./attachments/bafkreifhjukgu2cmovv6istgmhomoafblsie5nvivtg6qhns2zfvb4uvce)\n\nJemair 送了好看的银河系地板\n\n![ac27-7](./attachments/bafkreic3fmksu6rx5hw2rapmlhabxqg2u6i3x3mc54xmhoseflvqchmcq4)\n\n半夜 1 点到北美的朋友瑾惶家倾销大头菜,587 铃钱,净赚了 (587 - 90) _ 4000 _ 4 = 7952000 铃钱,我现在是个千万富翁啦!\n\n![ac27-8](./attachments/bafkreia2kcv6oz7epasybfv4rrwfis73chcf4q5qi6oc54adqyubpakery)\n\n![ac27-10](./attachments/bafkreienm365mep4o6atnictezbaf6lqff72w2gp4t7aiejarh4qesbcye)\n\n![ac27-9](./attachments/bafkreicovjstt2xros45qntina3ppvu6jlpbg2znes67kpqf23wylgmgcm)\n\n## 第二十八天 4月15日 黑色玫瑰\n\n![ac28-1](./attachments/bafkreiav55hyrqn4zwc4qsrxf6xbhp2unfv26w3qfkrdtsjolhey77gi3u)\n\n![ac28-2](./attachments/bafkreihraqpq34ozvc7vvcesdsbff4cpfyoahhw5qp7efyx2xexwcmksre)\n\n杂交出来了珍贵的黑色玫瑰\n\n![ac28-3](./attachments/bafkreifm4qhlgsuzj3b5wwujlxn72ux2ouwl2a2c3zn
318df5o45yxoojqrnq)\n\n龙克斯来了\n\n![ac28-4](./attachments/bafkreibfunmuxvo6i5ttagiofuxja7s6jbu2iaaxxxgozgj26dlo5crqqq)\n\n抓了五花肉在岛上打黑工,没有工资,五花肉带了一身护士装过来浇花、拔杂草,嘿嘿\n\n![ac28-9](./attachments/bafkreian2p3tloh3m75kewugfijkp6zly5uvz3zsvvn246cam6hsa6sani)\n\n![ac28-15](./attachments/bafkreibsd7gl5y2qys7gvzplw7chemy6xyzojaifnnrfrti7f5sdojvcmq)\n\n![ac28-12](./attachments/bafkreiafljwbk6npaciqizabawodgmofoesnixkt5sgdeytqwcs2rxu7ve)\n\n## 第二十九天 4月16日 蔡徐坤吊带装\n\n![ac29-1](./attachments/bafkreibmip6lzh5q4p6dzexcme7ejg74zlzreaq5nioslgpvgqhj57a5pa)\n\n昨天委托龙克斯做的螳螂模型到了\n\n![ac29-2](./attachments/bafkreicgvnn4x73s4z2ib5oyg6t3tuhg2g7nor7ynh5vlbldyvplz7ddo4)\n\n在商店里看到了蔡徐坤吊带装\n\n![ac29-3](./attachments/bafkreihzjs7j3stmqebcmjsmlpbnw4spskwwe4trujgnjrhigtsuofrmjm.jpeg)\n\n## 第三十天 4月17日 雷雨天气\n\n![ac30-1](./attachments/bafkreidvlkmdwtnrojya54qitinejf6m4z74mizzpavon2tg5b65dfhrxu)\n\n![ac30-2](./attachments/bafkreibteueatps4jb5y3dwqurxvrpizqoibwftxd2ppp3tzkzgan7lgwe)\n\n收到了 Mitt 非常用心的礼物\n\n![ac30-3](./attachments/bafkreig5lzy6ppawtoy62qtk7lmnbbd6g3mfv3vkg7bju2efcwycvy3p2y)\n\n![ac30-5](./attachments/bafkreia5d7hois5jlyor4wlck6uvkkbln6bzum7mtmso6wpqqsndaxirfy)\n\nWinfred 来之不易的礼物\n\n![ac30-4](./attachments/bafkreihehqp22r5v6wydm6gndho77myo5k634bqklbcyfa6qnhjwd3m32a)\n\n![ac30-6](./attachments/bafkreigclwuxlg5atpk2get3pzfk3n77bmimzxtussd34wybnukeuy3gey)\n\n尝试搭配了几套衣服,但是一般般\n\n![ac30-7](./attachments/bafkreicfekb4esu4inhcxa6r6lxsqf4pfy3lwilbs6sjxewembtncljnhi)\n\n![ac30-8](./attachments/bafkreicselbee43d5x6t5sqqx6j7e6x3cof77crccw2m4ym5rjlvgxcr6e)\n\n![ac30-9](./attachments/bafkreihn5j3l3n7iv7awnb4dgxlz3n2qqsisamvpihburvvedjs2ginrqm)\n\nMitt 岛上来了雷雨天气,冒着坠机危险坐飞机去看\n\n![ac30-11](./attachments/bafkreiaoouv63racqofalvc24m7q4edylv7dc2mlmnecl6nonk4genhrnq)\n\n![ac30-12](./attachments/bafkreicpp4rmpc4l5w7ebxhlbsnwnzsijzrr4niv6enmjh5mstrutpygdy)\n\n回家之后尔光教了我“不好意思”\n\n![ac30-13](./attachments/bafkreiaauyfx7wqa3c3by22f3t33jhjpl75tar6rrassjucvapjc3pufmq)\n\n## 第三十一天 4月18日 K.K.偶像\n\n![ac31-2](./attachments/bafkreiev33ucngcxatewt5ebf7spbkuln4vlih3qhhkboylqzfc26xrwmy)\n\n![ac31-3](./attachments/bafkreih7fshhrp45jvodrxy7y4c55ek3te2tmj7nuobf3lutoehmmznm64)\n\n收到了 Mitt 的黄金手杖,跟我这一身国王套装很配\n\n![ac31-4](./attachments/bafkreifczmxl5paudbftxjnhzcb5qsenlett6g2lhdcknzcrv4sck64q3q)\n\n![ac31-8](./attachments/bafkreia23gigkkc72wgptbibq2vyqt7ls4rq6bbxzlhy7txw5epyb46cqa)\n\n还有 Tyzual 的火箭衣柜、Aaron 的宇航员头盔、Mitt 的超级英雄衣服、Mitt 的黄金弹弓,拥有了第一个金色道具\n\n![ac31-5](./attachments/bafkreiaml7du4liwidphkvrduflx74pp5iofb4scxkgyfgu4he53epqnni)\n\n![ac31-6](./attachments/bafkreicbyxnvks52i57om2ckrhbkh7wgmjnpscptagyhatp5jjzh4zzstu)\n\n![ac31-7](./attachments/bafkreigjep3hbuqudpbdle23noxfmjkki5n7pkjjy4o3h3aazzbbenlb3q)\n\n![ac31-14](./attachments/bafkreiczhzcxdzvq7gsskgoisjtnj3ghx7q3mpa3nu6d6ffapmbx4o6dve)\n\n![ac31-15](./attachments/bafkreih5qkh2w56llz4f7yuu5pq7gpz24lpnl5rdsynmg6sl34zh2ymmqi)\n\n商店在卖恐怖的骨骼标本\n\n![ac31-9](./attachments/bafkreiduia7itdghzphpykqyvhhew5flgl4vvmtzd6ex4sluhimcwbiuoe)\n\n搭配了几套好看的衣服\n\n![ac31-10](./attachments/bafkreiarr72emxwpuhdwvdfeq6i2dzi3rcp5owegdskva7qgca2msgurqa)\n\n![ac31-11](./attachments/bafkreiamqmvlir4hnv4ek6j57iqnu7gebutomsjw3c6wsdcy25dlqhzjie)\n\n![ac31-12](./attachments/bafkreib2kge4n77ql37h32nismtq2rhtewyi5hanhrm3txr7nnvslqpeiu)\n\n今天是周六,K.K.来岛上了,叫 Mitt 过来一起听了上次从 Aaron 岛上听到的心心念的《K.K.偶像》,完整视频在[这里](https://www.bilibili.com/video/BV1vA411b7ip)\n\n![ac31-13](./attachments/bafkreidgtkpn4tvkvmwxgqani3oj3aeej5f5i4zbmfqhthgzlo64tlgq7e)\n\n![ac31-1](./attachments/bafkreigj6voi3kom6cm2su6xvoit4l5pyxh2fnhayac26lvjrewl6exiru)\n\n## 第三十二天 4月19日 布鹿斯要走了\n\n![ac32-1](./attachments/bafkreifxbflaogkl5txvqhu3lzzugmizz3xnk4w6hcx6sza536rgn3srde)\n\n世界那么大,布鹿斯说想去看看,纠结了好久还是同意了,但还是挺不舍的\n\n![ac32-2](./attachments/bafkreih2nr3kkz6usjdvbcisnrposcmhuht2n4tblkpbmljwaeximkpykm)\n\n商店出了一件好看的带家徽和服袴\n\n![ac32-3](./attachments/bafkreig5wviqtn4ojedaxoh3o6vihkgfou46fd4dwyqyuwbq5n327ap3di)\n\n发现了小睫和 K.K.合作的单曲,没想到小睫还有这样的一面,平时完全看不出来\n\n![ac32-4](./attachments/bafkreidl4bwum7uwx5q3bbrnaxhf3x2f5rgg2yawdczdeshxnpuyfmzxri)\n\n收到了昨天 K.K.寄的《K.K.偶像》CD,开心\n\n![ac32-5](./attachments/bafkreib7gzutmuzfyg2bxaavieqob265mw3mbnuf7m2z4b43554mqgkeje)\n\n还有 Mitt 亲手雕刻的木雕鸭\n\n![ac32-6](./attachments/bafkreicgbakbtct2sltncpm3kqfgw4oekho56h4seiktndmawczpzelbqy)\n\n在终端买了 100 件东西,手机可以安装了~~淘宝~~ Nook 购物\n\n![ac32-7](./attachments/bafkreie5eljsg4f7pju27itgtuhbs4gzpx6ih5cb7murkcji7nkf6prwbi)\n\n![ac32-8](./attachments/bafkreibb5ldubl62bmairzmvoqgo4tl2xs3mcgpgwavefptl5ckcsu
318ie5m.jpeg)\n\n![ac32-9](./attachments/bafkreibucepyuzsdrnerj2sxdtekud5x5sz4fg4ubyv6zo7nhbrbnylhly)\n\n![ac32-10](./attachments/bafkreifru7huz4akkfosgqtpryneaimklglwt6ho5dv5argikr442vxmh4)\n\n是太阳雨\n\n![ac32-11](./attachments/bafkreigygwdupgazrm2kqsepxwus6nipckdk4eeegcof7rp65vf52g4nai)\n\n## 第三十三天 4月20日 准备扩建大商店啦\n\n![ac33-1](./attachments/bafkreifakt2ei2peu6qgnyhxb6z43oqwrs7aozomc4uoqp27mxpuunqlfq)\n\n终于满 30 天可以扩建商店啦,心心念了好久\n\n![ac33-2](./attachments/bafkreibt625ahhd7q23rqrusxfjv6f5mejyul5gjymh7iisl26uqwl5ex4)\n\n![ac33-3](./attachments/bafkreigeukns3h3m7gq453h5yvass7eqad6zrewswe457kvybudvx24h6m)\n\n布鹿斯要走了,岛上第一次搬走小动物,有点伤感\n\n![ac33-4](./attachments/bafkreie6lb3gxk4ggqrsspeov6ovuvdbpnfras6tqwd4otdoyf3yofmduq.jpeg)\n\n![ac33-5](./attachments/bafkreiatiohcavp33txlocyk5fjs2s7u4bmu5i33kqstjfvab5dim4otdu)\n\n![ac33-12](./attachments/bafkreigsjmpvqd4wd4mk5sibfr4zutmjlgpnu4pilsyybsi43bl3maufwa)\n\n![ac33-13](./attachments/bafkreiboavxgnh4vaj6gh64yttnyfetwznszftr7y6wpmmy35umykp4nnq)\n\n汤姆很适时地教了我心碎的动作,但好像并没能让我变得积极起来\n\n![ac33-9](./attachments/bafkreif6gl2ukxuxw3but7fwmdvzofxyilefw67dggkm74ltbmzz5orx54)\n\n![ac33-10](./attachments/bafkreihdcmrfgpbex3dq32yk5gds45qvgxgikcpua5axfmwai6jllcbbo4)\n\n![ac33-11](./attachments/bafkreibl2kt5htjyjg4gr435rz7wurjvcrf2b2ikctfvpa7bdudc3u4tpy)\n\n买到了好看的充气沙发和两身衣服\n\n![ac33-6](./attachments/bafkreifozyzcirtvbxpr4vonm7tk5brdo3yx4rjx3fgnj64odmlaii5zci)\n\n![ac33-7](./attachments/bafkreibtv5rkdgu7c3gzo2c52jihqjwpapv7xvjoxbu7j4rr57irguibea)\n\n![ac33-8](./attachments/bafkreigg57727il25wg6rnxfxj7pwuonr2p72mn3w6x7nyagt3q2522cwm)\n\n收到了 Mitt 的礼物\n\n![ac33-14](./attachments/bafkreihcvlas2gr4c26t7jhp47tw4kaykkqpm2oa6njjkf7obwb55w7uny)\n\n在汤圆家玩\n\n![ac33-15](./attachments/bafkreif5jytt62sn54hujbtvvanx3nk4vkwiopfahlwhxzcswnnabxgx2a)\n\n![ac33-16](./attachments/bafkreigjsz7rsg5t7py2gxpdfzvgvd27wwujgujl7vfufyguo5vs6g5wrm)\n\n天佑和珮琳又在吵架...\n\n![ac33-17](./attachments/bafkreigtovmuc6rq7tcx7uz4wktaybg4v2ok3n6zqyfgbowxekoip6jg7y)\n\n## 第三十四天 4月21日 新岛民松鼠小敏\n\n![ac34-1](./attachments/bafkreiev4obrr7sb62zgk6we5foit442e5mdduyiaiw2zmqsk4g6iwjfpu)\n\n露营地来了新朋友\n\n![ac34-2](./attachments/bafkreif2itq4zj7q7o2mtjyqjbnoij3qoeydvgsjxw7hlx2camngotluqy)\n\n大商店在建啦\n\n![ac34-3](./attachments/bafkreigjh7gpmjsdje56eu2ia47qrot47zsxkjflt4u7fe5xsuwiwtzxbq)\n\n![ac34-4](./attachments/bafkreia73epzbnbyas6gbib65f2vs5jiyqiddj27y4qd4hn3ectgoc4dha)\n\n今天的商店\n\n![ac34-5](./attachments/bafkreih5ad3hmuf7d6v322odva4rffuc7bsup7tvxswnupjmxkkr6yty24)\n\n吕游你又来了\n\n![ac34-6](./attachments/bafkreidfj2vac3nm6536vnzzv3ceyyszikhfelw53hbqsrafomlhzpxhc4)\n\n露营地来了一只叫小敏的可爱松鼠,邀请了小敏来岛上定居\n\n![ac34-11](./attachments/bafkreidd4s2yofrxov3mgoq23jfov7bt3gvqym52gtihjxxnskmpcyg7b4)\n\n![ac34-31](./attachments/bafkreihisyvjhv2e7pgm62xg4nh7sadjqocao2zsxwhpugv4rud2hpjfsy)\n\n![ac34-32](./attachments/bafkreia2cxoyfv7eceey3wlnsqttl4yqklpt7eq433jv7ty3lqvayt2owm)\n\n去无人岛上招募新岛民,遇到了好多小动物,最后一个都没邀请,还是小敏最可爱\n\n![ac34-12](./attachments/bafkreibzfaatddobaiemaiyvuav4asorupdq6p654ly2xkbrweftz5znau)\n\n![ac34-13](./attachments/bafkreid2snojuccpb5fpmhrjeox2v4b6bowpebuysx7tgpcsyy4v2qmxlu)\n\n![ac34-14](./attachments/bafkreifzpgll45e6mvq7n55ruq4d34dsqbyflln34x2qmg7epxze5tqkmi)\n\n![ac34-29](./attachments/bafkreig2hjpaps6d3aqwzdvwxfus6v53ls67vqqhlrczy4nnnhcp2kbfpm)\n\n![ac34-30](./attachments/bafkreifmjqwqxblbnnjqiwwqccn6kf7h4pxda4tvxryemar2tef4vtmkoy)\n\n今天是金牛座了,沙滩捡到了金牛座的星星\n\n![ac34-7](./attachments/bafkreidknut54pf5hakkwlf5vrbfi43h5ojgrtfrabbie6cayflx33v4ie.jpeg)\n\nWayne 岛上的戴维教了我黄金墙的做法,还拜访了凶巴巴的古烈,听 Wayne 说古烈来岛上之前是混社会的,难怪\n\n![ac34-8](./attachments/bafkreidjcdjcuzjyt3e3s74skll23bu6q76vnigkxwjqzaso6dnsnvqr7y)\n\n![ac34-9](./attachments/bafkreic4x73e33nfsp3m6hu5qf26hd3oc4ahrtfdoeuoxbju6woqeomrju)\n\nMitt 送的超酷的太空梭\n\n![ac34-10](./attachments/bafkreibd5ynqbdygfyy6qnnlft3n6hk2jawk4enhfopvaxskxeavblcv4u)\n\n钓到了皇带鱼\n\n![ac34-15](./attachments/bafkreifzjrf7qg764cxbqze7gdycx5kfmctgstxydfaacg7h4adlkhu25q)\n\n去五花肉岛上玩,五花肉有超级多的衣服,我最喜欢的还是蔡徐坤套装\n\n![ac34-16](./attachments/bafkreig6vw5q3e35h6ieeibmucubfa5nomzg33fa6mj3x7pncecs2ps5ia)\n\n![ac34-17](./attachments/bafkreifssmexa7sazhvfigcvizxvlddrp7smiqw7hiyr2cepvm3pobiuzy)\n\n![ac34-18](./attachments/bafkreighppik5vdjtqzcko5lt2ol4anci5474zhv7thvdmkg3gbnjefa74)\n\n![ac34-19](./attachments/bafkreie5eueoib2aoehg7tvob3lzi7nixfh7nioqftnzkykes2yzavacuq)\n\n![ac34-20](./attachments/bafkreibmzrwontj4q7ijubdcbolidjd5asnmlr2d66faezcqtdl5vkbj7u)\n\n![ac34-23](./attachments/bafkreigtx3cqw5bugkkhdlswdiuitzpwxdqmmb56dxldgnbyp3peodgvve)\n\n![ac34-24](./attachments/bafkreia52si4g6p676kn6qu2dxun6qoo4gln7ki2vyc2kalueqthynkw7e)\n\n![ac34-25](./attachments/bafkreias5rkvlnxhivmrhdwyfai6ycsubze24pthdvlyxkjtbzgiwgujcu)\n\n![ac34-26](./attachments/bafkreigo5liras2gfqcbl67zxqtmtoci2kiffkf2onfxnrz4nh6h4ptmfq)\n\n![ac34-27](./attachments/bafkreihu4jh26w26aovtomic7tjxtpz3k6c2jgtmal3ctoqqveoiqkdkfu)\n\n![ac34-28](./attachments/bafkreidzv6fef7ly4q4vtgmdeuganaeczhxnv4jejqviiddl4o5zbl6jfm)\n\n## 第三十五天 4月22日 大商店开业啦\n\n![ac35-1](./attachments/bafkreigxmmsxtrfwqbz2skgyg6c5xcelfnmv6dkzdj3w7ld5tkv5u7i54u)\n\n![ac35-2](./attachments/bafkreiefvi2ylfoffqvkoo5tvlxjpx43nusuf2ymralovz4b64tzog5rhy)\n\n![ac35-3](./attachments/bafkreifbf6iwonjev3jxvdp
318d3yc5w6gkkafs2nbs5ui2kap5lnuhlvtzl4)\n\n大商店开业啦,外表也变得更气派了,参加庆祝仪式\n\n![ac35-12](./attachments/bafkreigrk42ht77flpv2lmeubbetxpiirt26beakabwpyorw5eqynnql2i)\n\n进去看看吧,里面宽敞了好多好多\n\n![ac35-6](./attachments/bafkreiazfupue3hfx4falt7zoqmjoh3by4kgpojqezhyvvpz3mtxrwwqva)\n\n豆狸和粒狸终于穿上了新衣服\n\n![ac35-7](./attachments/bafkreic3dssiwzvu4pc5dkveqb44kxhigiqb7gs6bublcyycv572wpeape)\n\n卖的东西也多了,每天多一个很贵的高级商品,还有高级工具卖\n\n![ac35-5](./attachments/bafkreifpiu7rpxny7ssptm3ddghmxbulwzmdn5c7xohqtsftmijt5tl2rq)\n\n汤姆也好喜欢新商店\n\n![ac35-8](./attachments/bafkreickf5sul3nxrab7gylmugkcnstaybgb7gn3oilqzozvwcrgwef2hi)\n\n![ac35-9](./attachments/bafkreierizkt4b7deu7cuxucojvw2d7gpp6d6a3tnm3gymdu3tis7yordq)\n\n小敏搬到岛上来啦,今天真是好事不断\n\n![ac35-11](./attachments/bafkreid4ldjnsmfwomt3z66tbqzebsz4gzxb22eqcdr42avvm4xugbcqka)\n\n服装店有卖超酷的飞行员套装\n\n![ac35-10](./attachments/bafkreie3q4v3aatkohthe4m6g2d2ukim5dumgkzjqst4gjcfxlx6sfabr4)"},{"slug":"handshake","title":"一份特别的开源项目赞助","tags":[],"body":"![handshake1](./attachments/bafkreibgobuhtieyi3tqa2qi4snkknsl44ravaloosstprvjbc3xaznh5a.jpeg)\n\n七夏姐姐在群里分享了一个[帖子链接](https://www.v2ex.com/t/645480),大意是 ~~我,Handshake,有钱,撒币~~ Handshake 特别有钱,现在给 GitHub 上符合要求的开发者送虚拟货币,只要超过 15 个 followers 且上传过 SSH keys 就能领取价值 1000 刀的虚拟货币 HNS,然后可以换成比特币提现\n\n哼,在各种电商平台和电信诈骗的套路中成长起来的我怎么可能上这种当,肯定不是诈骗就是类似拼多多的 100 元提现的套路,我才不会用我高贵的 GitHub 账号做这种事\n\n我对七夏姐姐嗤之以鼻<!--more-->\n\n第二天,我收到了一封垃圾邮件\n\n![handshake2](./attachments/bafkreigmgzhirub5m56662xkq3fjiiuqq5qxhcve7kjpvpyuwghde4yvdi.jpeg)\n\n让我意识到,这件事情,它可能是真的!\n\n然后也看到确实[有人提现成功](https://shidenggui.com/articles/namebase-airdrop)了,原来真的有这种好事\n\n![handshake5](./attachments/bafkreibp52wvkvztzavzfdwzak5ofejrephsjlerv6ix3aqy3at3iq6qpe.jpeg)\n\n七夏姐姐对我嗤之以鼻\n\n## 领取 HNS\n\n按照 [Handshake 官方的说明](https://www.namebase.io/airdrop),生成加密证明、提交到 Handshake 区块链声明 HNS 货币\n\n![handshake3](./attachments/bafkreihpvzko6mmilej353yy646dpagigzerefkb6x5e5rfbakbsrftr64.jpeg)\n\n最后脚本输出了一个 Base64 字符串,提交给 Handshake,领取 HNS\n\n![handshake4](./attachments/bafkreiekbnzolpl2aocqjqzlmftbgoretrc5xbhhjofe4ykzyss3td3ije.png)\n\n等待大约 16 个小时到账\n\n## 兑换比特币\n\n第三天,早上起床发现已经到账了\n\n![handshake6](./attachments/bafkreia5dxb6765ecm7o6u7234xqvqb32ymzxbjiqvdgkv5rmh5he7yqyi.jpeg)\n\n准备把 HNS 换成比特币,发现可能受活动影响,这几天 HNS 价格一直在暴跌,从活动刚开始时的 2000 刀,看到帖子时 1000 刀,领取时 700 刀,到账时 600 刀,写这篇文章时只有 400 刀了\n\n换比特币有两种方式,官方渠道直接兑换和挂在交易所卖出\n\n![handshake8](./attachments/bafybeidxvzd4g723obicdefoeqwze2vupojx56l3gdwl3vvbxeals7vhyi.jpeg)\n\n直接兑换会少很多,所以我选择了挂在交易所卖\n\n卖到了 0.06431673 BTC 并转到 [OKEX](https://www.okex.me/join/1876626) 的 BTC 账户里\n\n![handshake9](./attachments/bafkreihqejme26tfl6a5biyp3wfko3fo3anccmhkvli57vydtyhurehr4m.jpeg)\n\n![handshake10](./attachments/bafkreiadu3xags3qb6k7xx7g4xh6ruv56gazbgaslrvqm4tjvwcvnp5ene.jpeg)\n\n## 兑换人民币\n\n最后通过 [OKEX](https://www.okex.me/join/1876626) 的法币交易卖掉比特币,获得 4370.59 元人民币\n\n![handshake11](./attachments/bafkreifzzbbiq4k4fwimfl372godn7up2gcsesitmatllfwwfosbzlbzom.jpeg)\n\n## 关于这笔钱\n\n因为领取的要求是 GitHub followers,所以我不会把这笔钱当作理所当然,或者跟其他人一样叫它羊毛,而会把这笔钱看作一份特别的开源项目赞助,它将和其他赞助一起被用于支持我投入更多时间到开源项目中和帮助我早日实现成为全职开源作者的理想\n\n感谢 Handshake"},{"slug":"painting-nezuko","title":"【临摹】祢豆子","tags":["画画"],"body":"原图:https://weibo.com/5251489751/IbMlieN4K"},{"slug":"2019","title":"2019 我做了什么","tags":["年终总结"],"body":"2019 已经结束了,在这里回顾一下 2019 我做了什么\n\n## 开源\n\n![2019-4](./attachments/bafkreihqbkyh3whizlp44iq4xnr45bdvetgsnnis6iemsbmxvbrhdrseeq.jpeg)\n\n虽然维护的项目有保持健康的成长,但没有做ä
318»€ä¹ˆæ–°ä¸œè¥¿\n\n**[RSSHub](https://github.com/DIYgod/RSSHub)**\n\n项目总体已经比较稳定了,日常就合一下 pr,修一修小 bug\n\n朴实无华且枯燥的数据:\n\nStar 数达到了 10k+\n\n![2019-1](./attachments/bafkreiecgoyt3ykzcqmxcd2ors3std256tuql74vkgi7t7ae4krdjnepmq.jpeg)\n\n公共服务 rsshub.app 的月请求量达到了 1 亿+\n\n![2019-2](./attachments/bafkreicmn5r7yjwbj7u2sd3yhm6kgmo2e5inhdpy6k6diesup7asnt4ozy.jpeg)\n\n**[RSSHub Radar](https://github.com/DIYgod/RSSHub-Radar)**\n\n2019 唯一的新项目,让订阅 RSS 源变得更简单\n\n在少数派写了介绍文章并获得 Matrix 精选:https://sspai.com/post/56079\n\n朴实无华且枯燥的数据:\n\nChrome Web Store 每周用户数 7000+\n\n![2019-3](./attachments/bafkreiagjkkcyygaluymgsaczs3tihov2tna2hbx22dv7zczjiepug5kba.jpeg)\n\n2020 打算投入更多的时间在开源项目上,不再怠惰于现有项目的日常维护,而是做一些新东西,(可能)有 DPlayer 重构、Telegram Bot 平台、RSS 客户端等\n\n非常感谢 2019 期间的开源赞助者们:[rixCloud](https://rixcloud.app/rsshub)、[期待](https://angelia.codeeer.com/)、[荔枝数码](https://lizhi.io/store)、[快知](https://kzfeed.com/?from=rsshub)、[WeRss](https://werss.app/?utm_source=rsshub)、[面包多](https://mianbaoduo.com/)、[Liuyang](https://github.com/lingllting)、[Sayori Studio](https://t.me/SayoriStudio)、[琚致远](https://www.shaoyaoju.org/)、[Rolly RSS 阅读器](https://www.coolapk.com/apk/239500)、Zuyang、[Eternal Proxy](https://proxy.eternalstudio.cn/?from=rsshub) 和其他 10 名 Patreon 赞助者和 100 多名一次性赞助者,目前每个月开源赞助收入已经可以占到我总收入的 5%-10%,这帮助了我投入更多的时间到开源项目中,也让我离全职开源作者的理想更近了一步\n\n## 足迹\n\n![](./attachments/mai-tour0.jpg.html)\n\n**长途**\n\n日本\n\n完成了 [2018 年终总结](https://diygod.me/2018/)里的最大心愿,去日本看了樱花 🌸,9 天自由行,去了大阪、奈良、京都、东京\n\n2020 打算去俄罗斯的摩尔曼斯克看极光 🌌\n\n**短途**\n\n[BILIBILI WORLD](https://twitter.com/EEEEYHN/status/1180997347972485122)\nChinaJoy\n[洛天依×朗朗演唱会](https://twitter.com/DIYgod/status/1099273603265097728)\n[RSS
318Hub 面基大会](https://twitter.com/DIYgod/status/1081496706577883136)\n[迪士尼万圣节](https://twitter.com/DIYgod/status/1190619091158986752)\n\n跟[滑稽](http://eyhn.in/)、[FHYunCai](https://oxz.me/)、[玩水](https://imjad.cn/)、[Free](https://twitter.com/FreeMagico)、[Henry](https://henry.wang/) 等人面了基\n\n## 技能\n\n🤸‍♀️ HIPHOP 街舞:断断续续上了 7 节大课和 7 节私教课,很累但很有趣的一项技能,可能会继续学下去\n\n📊 记账:从 8 月份开始记账,已经养成习惯了,让我很清楚每个月的钱都花在了哪里\n\n🎨 画画:偶尔会有画画的冲动,但一直没有行动起来,2020 打算重拾这项技能,目标是每个月画一张\n\n## 健康\n\n![2019-5](./attachments/bafkreia2lfggacmw4via2vzb2fjxuzgqvxneg4idkqro2hzn26tyuc6rfm.jpeg)\n\n年初做了一段时间的 keep,没有坚持下来,但最近沉迷了健身环大冒险,健身计划重燃希望\n\n2019 又胖了,2020 希望可以在健身环的帮助下减掉 10 斤\n\n## 感情\n\n<p><img style=\"width: 100%; max-width: 400px\" src=\"./attachments/bafkreiatq2acgzepalb6vxcx42glctxtqr7bewkumlkbkdpwkm4xjudwtm.jpeg\"></p>\n\n发小医院的工作很忙,但休息日都会过来一起玩,现在休息日不再那么无聊了,过完年会搬到一起住,还有可能会订婚\n\n酸奶越来越粘人了,好像一只狗,但是随我越来越胖了,打算给她节食\n\n## 游戏\n\n![2019-6](./attachments/bafkreibw7izqpfdempn6q5ptyihx3ir64f5kzpbih7iyrxvby6ibpp2fze.jpeg)\n\n2019 玩了非常多的游戏,给我增添很多乐趣\n\nPS4:\n\n《地平线:零之曙光》:最佳,[Twitter1](https://twitter.com/DIYgod/status/1165702536667385856) [Twitter2](https://twitter.com/DIYgod/status/1188086500505743360)\n《怪物猎人:世界》&《怪物猎人世界:冰原》:最佳,我还录了几个[游戏实况](https://space.bilibili.com/2267573/channel/detail?cid=91177),但是没什么人看,[Twitter](https://twitter.com/DIYgod/status/1179127591912931328)\n《底特律:变人》\n《最后生还者》\n《巫师3:狂猎》\n《非常英雄》\n《毛线小精灵2》\n\nSwitch:\n\n《健身环大冒险》:最佳\n《塞尔达传说》\n《马力欧和索尼克在 2020 东京奥运会》\n《宝可梦盾》\n《俄罗斯方块99》\n《八方旅人》\n\n~~但自己玩游戏还是有点孤独,所以建了一个一起玩游戏的 QQ 群:947956902,欢迎加入~~\n\n## 影视\n\n![2019-7](./attachments/bafkreig7fssxw6wzr2drpm3wbdm5lx2hpciovx3frpfrfbazcdv7m5zajm.png)\n\n电视剧:\n\n2019 好多质量爆炸的剧,最佳很难选,4 个并列吧\n\n《去他妈的世界》:最佳\n《长安十二时辰》:最佳,[Twitter](https://twitter.com/DIYgod/status/1147730847530803200)\n《爱,死亡和机器人》:最佳\n《亿万》:最佳\n《权力的游戏》:烂尾烂尾烂尾烂尾,气死我了,[Twitter](https://twitter.com/DIYgod/status/1130514418444279808)\n《我,到点下班》\n《切尔诺贝利》\n《全裸导演》\n《兔子共和国》\n《李尸朝鲜》\n《性爱自修室》\n《血疫》\n\n番剧:\n\n不知道是我眼光变了还是业界真的药丸,2019 很少有能看得下去的番\n\n《鬼灭之刃》:最佳,毋庸置疑的 2019 霸权番,吹爆,没看的赶紧看\n《青春猪头少年不会梦到怀梦美少女》\n《约定的梦幻岛》\n《多罗罗》\n《动物狂想曲 / BEASTARS》\n《笨拙之极的上野》\n《流汗吧!健身少女》\n\n部分电影:\n\n电影太多了所以只挑几个印象深刻的\n\n《哪吒之魔童降世》:最佳,我先哭为敬 [Twitter](https://twitter.com/DIYgod/status/1155510269952401408)\n《调音师》:仅次于哪吒\n《半个喜剧》\n《海上钢琴师》\n《少年的你》\n《千与千寻》\n《阿丽塔:战斗天使》\n《疯狂的外星人》\n《流浪地球》\n《银翼杀手》\n《香肠派对》\n\n## 阅读\n\n看书尝试了一个月,尽力了,还是没能成功养成习惯,2020 顺其自然\n\n《写给大家看的设计书》\n《断舍离》\n《三体》\n《一只特立独行的猪》\n\n## 最后\n\n本命年过得惊人的顺利,也大致完成了去年的目标「让自己变得充实有趣起来」,希望 2020 继续保持,同时可以完成上面的几个小目标就更好了,呐\n\n![2019-9](./attachments/bafkreihbuev4z7weno6z6auq3cp7inchms7p2mkin6bzxit6qjqp3uh4cy.jpeg)"},{"slug":"android","title":"我家 Android 初养成","tags":[],"body":"最近把用了两年的 iPhone X 换成了 Redmi K20 Pro,体验一下 Android 自由香甜的空气\n\n<p><img style=\"width: 100%; max-width: 300px\" src=\"./attachments/bafkreigdo5h6km6mcagm4jfx3lhny5bkbm7cauo4oyfvludoxuk372jwoy.jpeg\"></p>\n\n## 解锁 Bootloader\n\n小米手机出厂都是锁 Bootloader 的,需要到[官网](http://www.miui.com/unlock/index.html)下载解锁工具解锁\n\n刷机、ROOT 都需要解锁 Bootloader,这是折腾所有东西的第一步\n\n所以我一拿到手机第一件事就是兴冲冲地连接电脑、下载解锁工具、运行解锁程序:\n\n![android2](./attachments/bafkreigubsr6ir4qnteouuyx5pmdckhozpnop7tgvb6zz2dc3kahcszf3y.jpeg)\n\n![android3](./attachments/bafkreifkhthiufbvouf3iba6zoslxjy5xgmmoiud7l73n5zmp3ku4t6x5u.png)\n\n游戏结束\n\n———————————————————————\n\n7 天后:\n\n![android4](./attachments/bafkreidzmt3otnaz3gfjn3mpddvd6p2huzdwqx6od4mafpugzfocz7toha.png)\n\n## 刷入 TWRP\n\nRecovery 是安卓的恢复系统,类似 [Windows 的 PE](https://docs.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/winpe-intro) 和 [macOS 的恢复功能](https://support.apple.com/zh-cn/HT201314),可以用来系统升级和重置手机\n\n刷入第三方的 Recovery 可以获得更多的功能,比如 Root 和 刷入第三方 ROM\n\n其中 [TWRP](https://twrp.me/) 是一个著名的开源 Recovery 映像,在 TWRP 官网搜索 `Redm
318i K20` 可以看到 TWRP 官方已经提供了对 Redmi K20 Pro 的支持\n\n![android5](./attachments/bafkreighffnrv563m2arvjuv7xwywyxkh2jk7st7t2zcfb3h6qihj2spei.jpeg)\n\n但是因为这篇文章咕咕太久了,我刷 TWRP 的时候官方还没有支持 Redmi K20 Pro,我用的是一位国内开发者 [wzsx150](https://weibo.com/u/6033736159) 适配的 [TWRP 映像](https://weibo.com/ttarticle/p/show?id=2309404160776561631202)\n\n![android6](./attachments/bafkreidpzwmnzazdhcmkfhhhmyetdtvobgmu6fcz5lzdn7d2gxcc2v5kqy.png)\n\nwzsx150 团队提供了非常方便的一键刷入工具,打开 `recovery-twrp一键刷入工具`\n\n![android7](./attachments/bafkreiacthlfe6pephy2wecvv5gldlwljrnonsqmdo3iy7745eowp4bh7u.png)\n\n根据提示下一步下一步\n\n![android8](./attachments/bafkreidevca4belfmvl3dixa2pe6rbuurjocdd2frzhcechdu7yomvglaa.png)\n\n![android9](./attachments/bafkreie63v7q3i2q2uwjfknhlr7q6oxqdwkjjlqp5xjglzkg3arcymt7ye.png)\n\n期间手机重启一次,再启动自动进入了 TWRP,证明刷入成功\n\n![android10](./attachments/bafkreidq55ndjiwbwlh3nm2awkkq65qp5gphseq4hxn6vap2ivgunnsyii.jpeg)\n\n## 刷入 Magisk\n\nMagisk 是一个兼具稳定性和可玩性的神器:作为一个 Root 方案,它能不破坏系统实现无痛 OTA,作为一个插件扩展平台,它又能提供丰富的自定义模块来满足多样化的定制需求\n\n参考阅读:[少数派 - 每个 Android 玩家都不可错过的神器](https://sspai.com/post/53043)\n\nMagisk 同样也是开源项目,在 [GitHub](https://github.com/topjohnwu/Magisk/releases) 上下载最新版的 Magisk 安装包导入手机中,然后点击 TWRP 的 `安装` 按钮,找到 Magisk 安装包,就可以刷入了\n\n![android11](./attachments/bafkreiflzoywfj2vk6ijqddilf73mzl2tnxub6klzlxsfoydxww6zbunly.jpeg)\n\n重启系统后,会发现桌面多了一个 `Magisk Manager`,证明刷入成功\n\n![android12](./attachments/bafkreig66wwxp7w5o633jw2zvyzjpzbxxlabqmxbzjkws7bzvhpmzcjcni.jpeg)\n\n## Magisk\n\n前面准备了那么多,终于可以安装 Magisk 模块了,Magisk 模块非常丰富,网上资料也很多,所以这里只介绍一下我使用的几个模块\n\n<p><img style=\"width: 100%; max-width: 400px\" src=\"./attachments/bafkreibfr3x5o62s6wdvo5xaa6tdkqqlhju7o2haszdq6fdohywolducqq.png\"></p>\n\n筑紫A丸:全局替换系统字体,字体名叫筑紫A丸ゴシック,效果就如图所示,很可爱,介绍和下载在[这里](https://mp.weixin.qq.com/s/zGaX15vRE-ZPoHtAiXawhQ)\n\nGoogle Lens Enabler:欺骗 Google 相册这个设备是一台 Pixel 设备,来开启 Google 智能镜头的功能,然后还有一个重要的额外效果:让 Google 相册拥有无限空间\n\n<p><img style=\"width: 100%; max-width: 400px\" src=\"./attachments/bafkreieooko6b55dwb2s4q7icpf7mctvuhmzhuubnehbu2z4eqmo3cic4e.jpeg\"></p>\n\nRiru - Core:Riru 是一个系列模块,使用 Riru 模块都需要先安装 Riru - Core\n\nRiru - Storage Redirect:存储重定向,几乎所有的 Android 应用都会在我们的手机中储存信息,为此,Android 系统提供了 `/data` 和 `sdcard/Android/data` 这两个目录来进行应用数据文件存放,遗憾的是,很多应用开发者并不会遵从这个规范,这让手机内部储存目录显得极为杂乱且文件管理效率低下,使用 Storage Redirect 能很好地解决上述问题,它将散落于各处的应用私有文件夹重新定位到指定的位置,[这里](https://sr.rikka.app/zh-hans/)有它的官方介绍和文档\n\n<p><img style=\"width: 100%; max-width: 400px\" src=\"./attachments/bafkreifuh7g3hn54jrachug4jx7gf36fm4lafafx5xf2gk4mervfdmn3oa.jpeg\"></p>\n\nTai Chi:太极模块,见下一节\n\n## 太极\n\n介绍太极要先从 Xposed 框架开始\n\n很多人都对 Xposed 的大名有所耳闻,它通过对系统框架的偷天换日,可以修改系统与应用的各种数据,籍此实现无数种可能性,同时也大大地提升了 Android 系统的可玩性,而且有比 Magisk 更丰富的模块\n\n但是 Xposed 框架没有像 Android 系统版本一样能够快速的更新,最新版本å
318œç•™åœ¨äº† Android 8.0/8.1 beta3 版本,对于 Android 9.0/10.0 用户,只能选择第三方实现,现在常用的有[太极](https://taichi.cool/README_CN.html)和 [Edxposed](https://github.com/ElderDrivers/EdXposed) 两种方案\n\n我一开始装的是 Edxposed,但是貌似跟 MIUI 11 有兼容性问题无法使用,所以换了太极\n\n下面是我使用的几个模块:\n\n<p><img style=\"width: 100%; max-width: 400px\" src=\"./attachments/bafkreifd34v6prirt7eahea5lrugmzzrmzzdaato4p55gghly365wlejjm.jpeg\"></p>\n\n大圣净化和去你大爷的内置浏览器非常香\n\n## Google 相机\n\nRedmi K20 Pro 支持 Camera2 API,所以不需要额外折腾就可以安装 Google 相机\n\n国内开发者[阿狗酱](https://weibo.com/u/5213532617)有分享专门为 Redmi K20 Pro 调教的谷歌相机\n\n<p><img style=\"width: 100%; max-width: 400px\" src=\"./attachments/bafkreiftfkft33yg3qyu4lzdoedklwquemtgj4fwgpftn2dnqvggpscuum.jpeg\"></p>\n\n得益于 HDR+ 算法,提升非常明显,Google 真的太强了\n\nMIUI 自带相机 vs Google 相机\n\n![android18](./attachments/bafkreihv433oavqakdyu4g6m24anczsxaqpzw2eocuyugyo42ahfaw33xy.jpeg)\n\niPhone 11 自带相机 vs Google 相机\n\n![android19](./attachments/bafkreie5zz4rq72wvy7wors5kegh62xjb2nr264udf7fraizx7tknqnw3a.jpeg)\n\n综上所述,Android 上很多黑科技确实很香,但整个系统的精致程度、设计感、人性化和软件生态还是跟 iOS 有非常大的差距,这让我痛苦地适应了一个多星期才开始慢慢可以接受,要不是拼多多拆封不给退我可能第二天就换回 iPhone 了\n\n但一旦接受了这种设定,香"},{"slug":"rsshub-radar","title":"RSSHub Radar — 订阅一个 RSS 源不应该这么难","tags":["新坑"],"body":"![rsshub-radar5](./attachments/bafkreiab5apfpx6odikfppeoblfsi7owzrwtgulnxor2vbd74ohnz2ht6i.jpeg)\n\n> 如果你问我,RSSHub 能否改变 RSS 的命运,我也不晓得,但我晓得,不认命,就是 RSSHub 的命。 ——《哪吒之魔童降世》\n\n如果你还不知道 RSS:[《我有特别的 RSS 使用技巧》](https://diygod.me/ohmyrss/)\n如果你还不知道 RSSHub:[《通过 RSSHub 订阅不支持 RSS 的网站》](https://sspai.com/post/47100)\n\n首先最大的 respect 献给 RSSHub 的 [244 名参与者](https://docs.rsshub.app/#contributors)\n\n## 订阅一个 RSS 源太难了\n\n首先需要网站提供了 RSS(这一前提通常就无法满足);然后我们要随缘在页面中找到 RSS 链接;然后复制链接、打开如 Feedly Inoreader 的 RSS 服务、点击添加订阅、粘贴链接、添加\n\n看,顺利订阅一个 RSS 源需要天时(随缘找到了 RSS)地利(网站提供了 RSS)人和(不因为订阅步骤过于麻烦而中途放弃),缺一不可\n\n都 9102 年了,世界不应该这样\n\n## 解决这个问题\n\n为了解决这个问题,RSSHub Radar 诞生了\n\n[Chrome Web Store](https://chrome.google.com/webstore/detail/rsshub-radar/kefjpfngnndepjbopdmoebkipbgkggaa) | [GitHub](https://github.com/DIYgod/RSSHub-Radar)\n\nRSSHub Radar 是 RSSHub 的衍生项目,她是一个可以帮助你快速发现和订阅当前网站 RSS 和 RSSHub 的浏览器扩展\n\n![rsshub-radar1](./attachments/bafkreidfu5khnaty753chph7uzwfk6ynch27qomjqxr6zz7qrloppxy4fq.jpeg)\n\n使用很简单,我们在进入一个新页面时,RSSHub Radar 会**自动检测**当前页面有没有 RSS 和 RSSHub 支持,检测到则会在右下角显示一个角标,如果我们想订阅当前页面的 RSS,点击扩展图标,会弹出一个列表,如图所示,列表有三项内容:**当前页面上的 RSS、适用于当前页面的 RSSHub、适用于当前网站的 RSSHub**,你可以选择复制链接或**一键订阅**到 Feedly Inoreader TinyTinyRSS\n\n![rsshub-radar2](./attachments/bafkreidrikcc7bv2ftf7yysjl7nn2i7g6elthmlhrhmi26tau424qs6orm.jpeg)\n\n设置页允许你使用自建的 RSSHub 域名、设置快捷键、立即更新规则、选择一键订阅到 TinyTinyRSS 还是 Feedly Inoreader、选择是否开启角标提醒等\n\n![r
318sshub-radar3](./attachments/bafkreif6uerx3txtz6zqb6gofb6egp77gaqoan4z4pulqvmyajvpc2ywhq.jpeg)\n\n支持列表列出了当前支持的 RSSHub 规则\n\n## RSSHub Radar 是如何工作的\n\nRSSHub Radar 是开源的,你可以直接去 [GitHub](https://github.com/DIYgod/RSSHub-Radar) 看源码\n\n当我们进入一个新页面时,RSSHub Radar 开始检测当前页面的 RSS 和 RSSHub\n\n**当前页面自带的 RSS**\n\n分析页面中的每个链接显然是不现实的,好在标准中指定了一种特殊 MIME 类型的 link 标签来指明 RSS 链接,`link[type=\"application/rss+xml\"]` 和 `link[type=\"application/atom+xml\"]`,RSSHub Radar 正是通过这个标签来检测页面是否有自带 RSS,具体实现在[这里](https://github.com/DIYgod/RSSHub-Radar/blob/master/src/js/content/utils.js#L14)\n\n**适用于当前页面的 RSSHub**\n\n使用[给定规则](https://github.com/DIYgod/RSSHub/blob/master/assets/radar-rules.js),根据当前页面的 URL 或 DOM 来获取 RSSHub 链接,规则各个字段的具体含义见[文档](https://docs.rsshub.app/joinus/#%E6%8F%90%E4%BA%A4%E6%96%B0%E7%9A%84-rsshub-radar-%E8%A7%84%E5%88%99),具体实现在[这里](https://github.com/DIYgod/RSSHub-Radar/blob/master/src/js/background/utils.js#L111)\n\n每隔 5 个小时从 GitHub 远程更新一次规则\n\n**一键订阅**\n\nFeedly Inoreader TinyTinyRSS 都提供了用于订阅的接口,不同的是 Feedly 需要进入页面确认一下,而另外两个会直接订阅上\n\n比如访问这个 URL 可以快速使用 Feedly 订阅我的博客(需要点 FOLLOW 确认):\nhttps://feedly.com/i/subscription/feed/https://diygod.me/atom.xml\n\n这个 URL 可以快速使用 Inoreader 订阅我的博客:\nhttps://www.inoreader.com/feed/https://diygod.me/atom.xml\n\n## 参与我们\n\n如果你对 RSSHub 感兴趣,欢迎[参与](https://docs.rsshub.app/joinus/)或[支持](https://docs.rsshub.app/support/)我们\n\n最后祝哪吒票房破 50 亿,还没看的一定要去看嗷!\n\n![rsshub-radar4](./attachments/bafybeihvqhxava3iedaqr4hepmi4yp4rh7t5cwiblsc252o4aqonah7k54.gif)"},{"slug":"pn532","title":"小米手环 4 NFC 模拟加密卡探索","tags":[],"body":"小米手环 4 NFC 版一发售就迫不及待找黄牛买了一只\n\n手环的 NFC 主要有三个功能:小爱同学、公交卡、模拟门禁卡\n\n结果手环的小爱同学很难用,功能缺失、反应慢[还老骂我](https://twitter.com/DIYgod/status/1141718298658086913),上海公交也不支持,门禁卡顿时成为了全村人的希望,正好我有两个门禁卡,试着模拟一下吧\n\n![pn5321](./attachments/bafkreihdrrmhivc6vjkhtwbstj2s53noq2brghan7fvtil7fsjed47pumq.jpeg)\n\n这 NFC 一事无成,像极了人生\n\n<!--more-->\n\n第一张是 ID 卡,铁定没救了,希望全在第二张加密 IC 卡上,为了拯救鸡肋的 NFC,我到淘宝买了一个 NFC 读写器 PN532\n\n把加密卡放到 PN532 上读取数据\n\n![pn5322](./attachments/bafybeifetwkz4t27imks7qehsyueao726j4geu3e3gchvclrb24xvoeilu.jpeg)\n\n使用 MifareOne Tool 解卡\n\n![pn5323](./attachments/bafkreiblaxowl5ivyoov7lryyd6y2jsnlqs6x3j5usfplziy3v6vmp63eu.png)\n\n解卡失败...根据网上的说法可能是 PN532 过热导致的,那么哪里最凉快呢?\n\n冰箱\n\n![pn5324](./attachments/bafybeih62s5x3krlt6eypedblie7e26gsvczy3xhclfpzojrldwlhbodv4.jpeg)\n\n经过漫长的等待,成功了\n\n![pn5325](./attachments/bafkreicbhd357ou4tsunxj7sscqhhlgbraso275xzw3petd6z55kgdakwa.png)\n\n得到加密卡数据\n\n![pn5326](./attachments/bafkreihkinyfh3wfg4mstwrvol3sthn65fdm4aszmrsko53cxdeovzt4xi.png)\n\n然后把其中的 0 扇区 0 区块数据写入一张空白卡\n\n![pn5327](./attachments/bafybeigkkros7ctznsiemx4vxu4m32m2g3lhuoiun5p7ygcwo3qi3veqmi.jpeg)\n\n![pn5328](./attachments/bafkreieucl4fwpjdjxfibhhc7f4wx5bj6ymwhh4zawf4hmtur3alxft3fu.png)\n\n然后再把空白卡的数据写入手环\n\n![pn5329](./attachments/bafybeih7etj22q3q2pdnllnjhy55vrza6t4vipgc5lppzslwk5eqgvojoy.jpeg)\n\n![pn53210](./attachments/bafkreic5j2tr5kowlhvbhim6vxl7hhbdei2bt2rnjnaehkfxd64ah7xbpe.jpeg)\n\n这时候手环上就有卡了,但是里面只有 0 扇区 0 区块数据,这时候再把剩下的数据写到手环里就好了\n\n![pn53211](./attachments/bafybeihht6dyahk45oiykp6nmkbc7yzhe6zssucxcgfqhopb3nriavo7la.jpeg)\n\n![pn53212](./attachments/bafkreigfjyhmid7hziiu5dep3n6moomyg26rl76uqz6kgjst4vnttjqtr4.png)\n\n验证:对比原卡和手环卡的数据,\n\n![pn53213](./attachments/bafkreid7fhvunwteq6dvfygx7w2bhmcwlwjb5wb4zi6sbdynnzimxdhlze.png)\n\n![pn53214](./attachments/bafkreifpdxxnb5vf75qpkvh37x6d4irmal6huo63xqnvrwms2likiwmwsu.png)\n\n只有 0 扇区 0 区块的部分数据(厂商号)不同,且 
31815 扇区的加密数据相同,说明已经模拟成功\n\nNFC 终于没白买"},{"slug":"download-webhook","title":"优雅地下载我的B站投币视频","tags":[],"body":"下载B站视频很简单,you-get 一行命令的事,但我已经懒到命令都不想输了,如果投币之后 NAS 可以自己去下载就好了\n\n<style>\ntwitter-widget {\n    margin: 0 auto !important;\n}\n</style>\n<blockquote class=\"twitter-tweet\" data-cards=\"hidden\" data-lang=\"zh-cn\"><p lang=\"zh\" dir=\"ltr\">B站收藏夹一堆失效视频,想做一个收藏后自动下载的小工具🤔<br><br>RSS+IFTTT+Webhooks+ffmpeg?</p><a href=\"https://twitter.com/DIYgod/status/1131898671111450625?ref_src=twsrc%5Etfw\">&mdash; DIYgod (@DIYgod) 2019年5月24日</a></blockquote>\n\n## 设想\n\n整个设想是这样的:投币操作 -> RSS 更新 -> IFTTT 触发 Webhook -> 服务器下载\n\n投币到 RSS 更新可以直接用 [RSSHub](https://docs.rsshub.app/social-media.html#up-%E4%B8%BB%E6%8A%95%E5%B8%81%E8%A7%86%E9%A2%91) 实现,RSS 更新到触发 Webhook 也可以直接在 IFTTT 里配置,整个多米诺骨牌就只缺少 Webhook 到下载这一块\n\n## 行动\n\n于是写了一个简单的小工具 —— [download-webhook](https://github.com/DIYgod/download-webhook),它可以通过一个简单的 post 请求,触发服务器执行 you-get,下载视频到指定目录\n\n## 效果\n\n1. 给咬人猫投币\n\n![download-webhook1](./attachments/bafkreifzgbuqcfqsqcpp3gsttgwj7ddkkgipjq2aojvkc3qrf2mgo2yr6a.jpeg)\n\n2. RSS 更新\n\n![download-webhook2](./attachments/bafkreiaxoj4wyyfj4cagofte4u6jcscyb6a4jjvx3pod554sxhvfj44yiu.jpeg)\n\n3. IFTTT 触发\n\n![download-webhook3](./attachments/bafkreia52bo5moilliyyhmktgivfah3yk6wnzq46pmbx4detgoclkpzw7u.jpeg)\n\n4. download-webhook 收到下载请求\n\n![download-webhook4](./attachments/bafkreihxfgu3cldkfkxmkgvz75wzfjmggulbsx4ew56gwiozhjxyrjoruq.jpeg)\n\n5. 下载完成\n\n![download-webhook5](./attachments/bafkreif7xykx2psfjc5hhkh25bjsmpp2eitkx5fhbzchc5zkmko3dkygne.png)\n\n## 进一步\n\n以上同样适用于自动下载 YouTube \\ Instagram \\ Tumblr 视频、网易云音乐歌曲等,只要 RSSHub 和 you-get 支持\n\n另外对于图片,Webhook URL 参数直接传入图片地址也可以下载,所以也可以轻松实现自动下载 Bing 每日壁纸、甚至 Telegram 的涩图频道(这里就不做推荐了)"},{"slug":"ohmyrss","title":"我有特别的 RSS 使用技巧","tags":[],"body":"大家都知道 RSS 是一种用来消息聚合的格式规范,有着更高的阅读效率、更好的阅读体验、可以掌握主动权等等优点。\n\n本文不会介绍 RSS 的各种好处和各式各样的阅读器,因为相关网络资料已经足够多了。这里我介绍一下怎样充分挖掘 RSS 的使用价值,因为它的用途一直被大家低估。\n\n## 阅读器\n\n从最简单的开始,我们可以看看如何用 RSS 订阅一个博客。\n\n假设你想订阅世界上最可爱的博客 [Hi, DIYgod](https://diygod.me/),巧的是它已经很贴心地提供了 [RSS 地址](https://diygod.me/atom.xml),你只需要找一个适合自己的 RSS 阅读器。\n\n这里有几个推荐:\n\niOS 和 macOS 平台 - Reeder\n\nAndroid 平台 - Palabre 和 FeedMe\n\n打开阅读器,输入链接,点击订阅\n\n![9102rss1](./attachments/bafkreia2qs3hugcjppvgn64c572i427ezlnrww3tqcenjl7asna6csrxsq.png)\n\n![9102rss2](./attachments/bafybeidgh477wcnrn37o4stwvikf4jpzlgy4ptbvjk6lrjn2hccd6njbaa.png)\n\n我们便学会了 RSS 最基础的使用方法。\n\n## 云服务\n\n这时候你可能会发现一些问题。\n\n只有一直开着电脑或手机才能获取到更新,如果勤劳的 DIYgod 一天更新了 100 篇文章,而 RSS 的输出数量是有限的,等一天后再开电脑,这时候阅读器刷新,你只能看到最新的几篇了(当然 DIYgod 不可能一天更新 100 篇,这个例子不是很好)。\n\n还有,你同时在手机和电脑上订阅了 DIYgod,在电脑上看完,手机上还是未读状态,如果订阅了很多内容,这会很糟糕。\n\n所以我们需要一个服务端来同步和刷新 RSS 内容。\n\n其中用的人数最多的是 Feedly 和 Inoreader。\n\n它们固然很好,但我更推荐功能更强自由度更高的自建 [Tiny Tiny RSS](https://github.com/HenryQW/docker-ttrss-plugins)。\n\n自建不仅可以使数据更可控,它还有丰富的插件可以满足各种各样的需求,比如全文内容提取、Fever API 模拟、DOM 操控、繁体转简体。上面提到的阅读器都可以配合它使用。\n\n![9102rss3](./attachments/bafkreiezptmfq26vh53vlxnlr5fiaoii5qtlcvwte6ru5iy67baguphtxe.png)\n\n## RSSHub\n\n看起来很美好,但提供 RSS 订阅的网站实在是太少了,原因很好理解:RSS 不利于网站方的广告投放、隐私搜集、用户存留等商业行为。\n\n我们当然不满于此,于是我发起了 [RSSHub](https://github.com/DIYgod/RSSHub) 项目,项目原理很简单:RSSHub 请求你想要的源站数据,然后把它们以 RSS 格式输出,做到了万物皆
318可 RSS。\n\n经过近 200 名开发者历时一年多的活跃开发,RSSHub 已经支持了 300 多个网站的近 600 种数据,而且这些数字还在快速增长中。\n\n这里分享一部分我常用的路由:\n\n- 什么值得买排行榜:谨慎订阅,它浪费了我不少钱\n\n- 各种老婆的手办更新:闭着眼买就完事了\n\n- 微小微和猫饼的 bilibili 动态\n\n- DIYgod 关注视频动态:DIYgod 关注的 UP 主们的动态,不用刷很蠢的 B 站动态了\n\n- JFlaMusic 的 Youtube 视频\n\n- Dcard 论坛:一个超级有趣的台湾论坛,适合配合 Tiny Tiny RSS 的繁体转简体插件使用\n\n- PlayStation Store 会员限免游戏:再也不怕忘记领免费游戏(虽然领了也不会玩)\n\n- RSSHub 有新路由啦\n\n- himitsu 的 Twitter 动态:NSFW\n\n- 发小的微博:不会再因为错过发小的微博被骂了\n\n- 即刻工作日闹钟设置提醒\n\n- 公众号“微小微”更新\n\n- 豆瓣正在上映的超过 7.5 分的电影\n\n- 知乎热榜\n\n## BT 下载\n\n假设你是一个美剧爱好者,我们可以看看如何用 RSS 来追权利的游戏第 8 季。\n\nRSSHub 有一些支持 BT 下载的路由,比如权利的游戏字幕组源订阅地址为:<https://rsshub.app/zimuzu/resource/10733>,接着我们加一个 filter 参数过滤出第 8 季内容:<https://rsshub.app/zimuzu/resource/10733?filter=S08>。\n\n然后挑选一个正常的 BT 客户端(迅雷不算),我用的是群晖的 Download Station。\n\n把地址添加到 BT 客户端的 RSS 订阅,这样美剧更新后 BT 客户端就会自动把最新一集下载到硬盘里,晚上下班回家打开电视就可以直接看了。\n\n最近我订阅的美剧和日剧\n\n![9102rss4](./attachments/bafkreiaadcqpqkxox6ehgkjpzwb4voqwzlzvuilwqqbvz5fpklwo4lejk4.jpeg)\n\n获取到更新并下载完成群晖会发邮件告诉我\n\n![9102rss5](./attachments/bafkreiebs7nbvf6j3bofwwmcrvlfxfybwhpycwgxnktyvb6fnzb7d5smmq.png)\n\n## 播客\n\n假设你是一个播客爱好者,我们可以看看如何用 RSS 来扩充你的播客库。\n\n播客客户端可以访问 RSS 检查更新,以下载系列中新的集数收听,RSSHub 或 [getpodcast](https://getpodcast.xyz/) 有一些支持播客的 RSS 可以直接使用,比如用 iOS 自带的播客应用订阅一个网易云音乐的 ASMR 电台:\n\n![9102rss6](./attachments/bafkreie6c6xyofmw4xpugwcjvnct46q7ylqb3r6htncy4v5za4yykvqqdm.jpeg)\n\n## 联动\n\nRSS 可以通过 IFTTT 跟各种奇奇怪怪的东西联动。\n\n其中一个使用案例是我的 Telegram 频道:<https://t.me/awesomeDIYgod>,它通过 IFTTT 监听了很多 RSS 更新,有 DIYgod 的博客更新、DIYgod 的扇贝打卡、DIYgod 的 Twitter 更新、DIYgod 喜欢的网易云音乐、DIYgod 的 bilibili 投币视频...\n\n这样你甚至可以很容易实现通过 RSS 控制开关灯、咕咕鸡自动打印小姐姐的微博、把权利的游戏差评自动发推特艾特编剧等等操作,虽然可能没什么用就是了。\n\n6 月 2 日更新:\n\n一次优秀的联动:[《优雅地下载我的B站投币视频》](/download-webhook)\n\n&nbsp;\n\n以上是我列举的几个适合 RSS 使用的场景和方式,现在大家是不是对 “RSS 是一种用来消息聚合的格式规范” 这句话有了更深的理解呢?"},{"slug":"rsshub-1year","title":"RSSHub 一周年开发可视化","tags":[],"body":"RSSHub — 万物皆可 RSS\nhttps://github.com/DIYgod/RSSHub\n\n- 视频基于 2018 å¹´ 4 月 - 2019 å¹´ 4 月的 commit 记录,使用 Gource 绘制\n- BGM: トリカゴ"},{"slug":"mai-tour","title":"《青春猪头少年不会梦到兔女郎学姐》圣地巡礼","tags":[],"body":"<iframe style=\"border-radius:12px\" src=\"https://open.spotify.com/embed/episode/31yuCkRxJqYD4eSEtOyMiB?utm_source=generator\" width=\"100%\" height=\"152\" frameBorder=\"0\" allowfullscreen=\"\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" loading=\"lazy\"></iframe>\n\n之前去日本玩了几天,最后一天没什么事了,初雪说我们去看兔女郎吧\n\n4月7日,清晨 11 点半,我们便早早地起床坐上了前往湘南的 JR,开始了这次《青春猪头少年不会梦到兔女郎学姐》 江之岛 ~ 镰ä
318»“高校前 ~ 七里滨 ~ 藤泽车站 的圣地巡礼之旅\n\n![mai-tour0](./attachments/bafybeibip5i7yvpahj24san4s6gdmwp3chne2x77aou4suht5vv6f2hfwu.jpeg)\n\n## 江之岛\n\n我们从新宿坐 JR 一路南下到了江之岛,还是挺远的,全程花了一个多小时,还好我们起得早,下午 1 点就到了\n\n除了兔女郎学姐之外,江之岛也是诸多动画与日剧的取景圣地,以至于江之岛观光案内所专门有一本动漫巡礼地图\n\n![mai-tour1](./attachments/bafybeia7ovd3um2gl3wwxl7gxu4wmd2hiifhlw7a3rrkpvme5e4crgblyu.jpeg)\n\n上岛之后第一件事就是找麻衣代言的限定桃子味汽水\n\n找了好几台自动售卖机才找到,超级开心,没错了,是学姐的味道!\n\n![mai-tour2](./attachments/bafybeibfiaytedflirnmytd7fzwf6z4j73vzckiw7eqwhyjrtclauaizyq.jpeg)\n\n我可以一口气喝 10 瓶\n\n继续往前走,可以经过江之岛上的诸多神社,动画第 6 话中师傅与学妹参拜的是主干道上的江岛神社\n\n![mai-tour3](./attachments/bafkreihdvedog7ew3acil2fpy3bgjjflvh3uc3ag5oyx3krcbmxeijg4fq.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251081?t=14m36s)\n\n![mai-tour4](./attachments/bafkreieevicwjcabo2c2456erh6vb7im5p4u3utwumfu64fg7uywxwhsg4.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251081?t=14m51s)\n\n![mai-tour5](./attachments/bafkreif72awqq4znqk6ggrz7ne7obzlgabw2bkmcm736rdcjjccwqwywgi.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251081?t=15m28s)\n\n第 6 话剧情高潮的展望台\n\n![mai-tour6](./attachments/bafkreier63gtfntkhr3kxrsjqxwuhftsc2i7xqmsreuzfdwxeex2soywve.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251081?t=16m42s)\n\n![mai-tour7](./attachments/bafkreieueyxyh42n3ep7dbh5xzhacuafhooyj3tbptbngkwuwsuhqzkdn4.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251081?t=15m47s)\n\n然后~~坐电梯~~爬到山顶可以登上一个高塔,塔上可以看到很远\n\n![mai-tour8](./attachments/bafkreigtrmv7ohoesnfn6z4f25wbk23mkc25427kisgulez4edivwmyjhy.jpeg)\n\n江之岛游览完毕后,原路从大桥返回地铁站,会经过一段地下通道\n\n![mai-tour9](./attachments/bafkreigalxnyg2r62fj43ki2fw2hbcm4cey6n7schiodvlc2adlpqavwry.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251081?t=14m02s)\n\n![mai-tour10](./attachments/bafkreihjsbhnhcokvwrf3rqbceqfifurlne4brm4mlqm4u2raanawfifwe.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251081?t=14m07s)\n\n## 镰仓高校前\n\n现在回到江之岛站,坐江之岛电铁线到下一站 —— 镰仓高校前站\n\n江之电是很特别的绿皮火车,一路上的风景特别好,街道、海岸\n\n镰仓高校前站下车,沿着铁路线向腰越方向步行,一分钟便可到达 OP 中最先登场的踢你的肾场景\n\n这里为了拍到场景中一样的火车在路边站了好久,拍完之后惊喜地发现连左边的汽车都惊人的相似\n\n![mai-tour11](./attachments/bafkreiaei7tqz3oqtvj7pqj6fwtm6bxlajrlefptmxx25xaax4kk7s2dz4.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251076?t=58s)\n\n![mai-tour12](./attachments/bafkreidhsuwqwpny7qmlkz5cy25thepj7vuzenas5tbi7oke52ugkxlckm.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251076?t=1m52s)\n\n接着返回镰仓高校前站内,这里是动画第 9 话中,小姨子代替麻衣参加 CM 的摄影拍摄地\n\n![mai-tour13](./attachments/bafkreigkrcii5gjd2rlfosy2heh4vnvf4qeixet52n3v4ja2bjvxsxmcty.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251084?t=18m18s)\n\n![mai-tour14](./attachments/bafkreid5uzff6cwchv2y7c4fcxawuukhwdmh7smz6flkaezyl2xfeeuz4q.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251084?t=18m11s)\n\n在镰仓高校前站向七里滨站方向走一分钟,发现这里有很多小姐姐在拍照,这里正是著名的《灌篮高手》取景地,樱木花道与赤木晴子相遇的铁道口\n\n![mai-tour15](./attachments/bafkreiba5ivdhhfn72i3d33yppldusq75wf5x52ucwxro7437t3bnk2z3m.jpeg)\n\n铁道口对面就是七里滨海滩,站在沙滩上可以看见不远处的江之岛,动画中在沙滩上的诸多场景,皆是取景于此,但是没时间去了\n\n## 七里滨\n\n接着坐江之岛电铁线到下一站,便可以来到动画中出现次数最多的车站 —— 七里滨站\n\n动画中对于七里滨车站超级还原,无论是出入口还是站台内的自动贩卖机,给我一种转头就可以看到麻衣学姐的错觉\n\n![mai-tour16](./attachments/bafkreie6ayvs2ghfc6fbfpurmt6ahbxnkhpki52jzadyc4isjxbnwgwzh4.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251076?t=9m6s)\n\n![mai-tour17](./attachments/bafkreiajeun4ixklvitc36ulhi646mifjjdjfulycaavzozwgazy6bnqwe.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251076?t=8m33s)\n\n![mai-tour18](./attachments/bafkreialuuuyktu36zeov5vceq6jsxslsse3u34zk46jnscmfufbw26whe.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251076?t=8m31s)\n\n![mai-tour19](./attachments/bafkreieneuttjzgbm4eeqsjbw34aorlajuo3o4fsdtc6nzzd2xf3vekbfu.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251076?t=9m33s)\n\n![mai-tour20](./attachments/bafkreidkwz7hq7rjxer53hasgamgbfifxcqqvolofhs3d4huu7fai5wczu.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251080?t=20m5s)\n\n后面还有师傅与学姐上学的峰原高中、ED 中的海岸公园、初次相遇兔女郎的藤泽市综合市民图书馆、和学妹互踢屁股的御所谷公园、师傅打工的餐厅 等众多打卡点,但看时间快要误机了,此次巡礼之旅就到此为止\n\n## 藤泽车站\n\n回东京的时候路过了藤泽车站,师傅上学就是从这里出发,乘坐江之岛电铁线到七里滨站\n\n藤泽车站及其附近还有很多场景,但这时候快误机了,紧张的一批,没时间仔细看了,只随便拍了一张\n\n师傅跟学姐第一次约会迟到的改札口\n\n![mai-tour21](./attachments/bafkreiakpctb47rapxvp7mqvgd635w5oh44jd2pfb547egmkrs46jtubba.jpeg)\n\n[视频直达](https://www.bilibili.com/bangumi/play/ep251076?t=12m29s)\n\n回到东京站拿到行李后向成田机场一路狂奔\n\n在成田特快 Express 上面姬合照\n\n![mai-tour22](./attachments/bafkreig4y6ydx5c67m5vl6qk24u5txp3krmo6j36yrvecduyuwzenkxwr4.jpeg)\n\n赶到机场登机口时候已经开始登机了,还好赶上了,不然再晚 10 分钟只能去初雪家睡了\n\n&nbsp;\n\n下集预告:我们在日本一共玩了 9 天,本文是最后一天的内容,过一两周会剪一个 9 天的 vlog 出来,9 倍的快乐,记得看哟\n\n&nbsp;\n\n巡礼参考攻略:\n\n[‎「舞台めぐり - アニメ聖地巡礼・コンテンツツーリズムアプリ」をApp Storeで](https://itunes.apple.com/jp/app/%E8%88%9E%E5%8F%B0%E3%82%81%E3%81%90%E3%82%8A-%E3%82%A2%E3%83%8B%E3%83%A1%E8%81%96%E5%9C%B0%E5%B7%A1%E7%A4%BC-%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84%E3%83%84%E3%83%BC%E3%83%AA%E3%82%BA%E3%83%A0%E3%82%A2%E3%83%97%E3%83%AA/id680489568)\n\n[《青春猪头少年不会梦到兔女郎学姐》圣地巡礼攻略(详) - 知乎](https://zhuanlan.zhihu.com/p/52373529)\n\n[《青春期笨蛋不会做兔女郎学姐的梦》动画【圣地巡礼】 - 穷游网](https://bbs.qyer.com/thread-3102232-1.html)"},{"slug":"headlesschrome","title":"HeadlessChrome 自动化测试探索","tags":[],"body":"埋点一直是B站 HTML5 播放器开发和测试过程中的一个痛点,埋点的种类和接口参数很多,测试很麻烦也很容易出错\n\n虽然测试很麻烦,但它们的规则都å¾
318ˆç®€å•,比如点击或 hover 一个按钮、错误上报、播放和性能上报,那么能不能通过自动化的 E2E 测试来代替这些又繁琐又机械化又容易出错的测试工作呢?\n\n在一次埋点线上事故后,我花了一天时间做了一些探索,最后效果还不错,在这里做一下简单的总结\n\n## 编写测试脚本\n\n模拟用户操作就需要用到无头浏览器,我采用了 Jest + Puppeteer 的组合\n\nJest 是一个测试框架,Puppeteer 是用来控制 Chrome 或 Chromium\n\n选择 Jest 是因为我对 Jest 最熟悉,然后又找到了一个 preset: [jest-puppeteer](https://github.com/smooth-code/jest-puppeteer),不是必需的,但它可以简化很多 Puppeteer 操作\n\n安装依赖:\n\n```bash\nnpm install --save-dev jest jest-puppeteer puppeteer\n```\n\n测试脚本很简单:\n\n```js\ndescribe(\"log\", () => {\n  beforeAll(async () => {\n    page.goto(\"https://www.bilibili.com/video/av44890855\");\n  });\n\n  it(\"play_screen\", async (done) => {\n    page.on(\"request\", (request) => {\n      if (\n        request\n          .url()\n          .match(\n            /^https:\\/\\/data\\.bilibili\\.com\\/log\\/web\\?play_screen...参数参数/,\n          )\n      ) {\n        done();\n      }\n    });\n    page.click(\"video\");\n  });\n});\n```\n\n让 HeadlessChrome 打开一个播放页,监控页面请求的接口,模拟点击 video 元素,监控到浏览器请求了 play_screen 埋点即测试成功\n\n看起来没什么问题,开开心心地执行了测试,结果 failed\n\n发生了什么?配置 `headless: false` 观看了一下测试过程\n\n![headlesschrome1](./attachments/bafkreibw3mvo3a3ohiwp3uy2mglkyq4g7eiwz6l5qk5toa75cwvjsdli6y.jpeg)\n\n发现是因为检测到浏览器不支持 HTML5 播放器,加载了 Flash 播放器\n\nPuppeteer [文档里说道](https://github.com/GoogleChrome/puppeteer#q-what-features-does-puppeteer-not-support)\n\n> Puppeteer is bundled with Chromium--not Chrome...Puppeteer does not support licensed formats such as AAC or H.264\n\n解决方法也很简单,把 Puppeteer 自带的 Chromium 换成本地的 Chrome\n\n```js\nlaunch: {\n  executablePath: \"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome\";\n}\n```\n\n测试通过\n\n![headlesschrome2](./attachments/bafkreiftvisr7u5qkfdc2ibzhk4pd3k6mniee5m67l3occedblxyojbbku.jpeg)\n\n## Chrome as a service\n\n刚才使用了本地的 Chrome,会依赖本地环境,而且想作为自动化测试跑在测试机上也是不行的\n\n所以我又在测试机上跑了一个 docker 容器:[browserless/chrome](https://hub.docker.com/r/browserless/chrome),它可以把 Chrome 当做一个 service,测试脚本使用 websocket 协议操作 docker 里的 Chrome,这样就避免了依赖本地 Chrome\n\n启动容器:\n\n```bash\ndocker pull browserless/chrome:release-chrome-stable\ndocker run -d -p 3000:3000 browserless/chrome:release-chrome-stable\n```\n\n使用:\n\n```js\nconnect: {\n  browserWSEndpoint: \"ws://localhost:3000\";\n}\n```\n\n## 劫持 js\n\n这样用的是线上版本,根本没有测试本地代码啊!\n\n哦,忘了说了,还需要把线上 js 劫持为本地版本\n\n```js\nawait page.setRequestInterception(true);\n\npage.goto(\"https://www.bilibili.com/video/av44890855\");\npage.on(\"request\", (request) => {\n  if (request.url().match(/player\\.js/)) {\n    request.respond({\n      status: 200,\n      contentType: \"application/javascript\",\n      body: fs.readFileSync(\"dist/release/player.js\").toString(),\n    });\n  } else {\n    request.continue();\n  }\n});\n```"},{"slug":"2018","title":"2018 年终总结","tags":["年终总结"],"body":"2018,无所事事又带点丧的一年,感觉很对不起 23 岁这个年纪,要跟自己说声对不起了\n\n## 开源\n\n今年 4 月开坑了 [RSSHub](https://github.com/DIYgod/RSSHub),让自己学到了的很多东西,认识了很多人,算是今年为数不多的有趣的事情之一了\n\n[APlayer](https://github.com/MoePlayer/APlayer) 和 [DPlayer](https://github.com/MoePlayer/DPlayer) 有半年时间在咕咕咕\n\n2019 期望再开一个 LTS 一年以上的坑,暂时还没什么想法 🤯\n\n![2018-2](./attachments/bafkreihqok6ayl7fgjxgyis5xvcedyx273jbtnxmvrr6u6h7uwbypk2rma.jpeg)\n\n![2018-1](./attachments/bafkreigbagm3g47oixsdroguysmqiotypgltcj6tft3cjzcsng5cdhq5nm.jpeg)\n\n## 足迹\n\n参展:\n\n[暴走 yu 人节](https://diygod.me/2018-bao-zou-yu-ren-jie/)\n[bw & bml](https://diygod.me/bw2018/)\n[ChinaJoy](https://diygod.me/cj2018/)\nCP22\n[CP2018SP](https://diygod.me/cp2018sp/)\nGoogle 开发者大会\nCP23\n\n旅游:\n\n无\n\n漫展都快去烦了,却没意识到今年一次都没出去旅游,2019 要好好制定一下出行计划了,想 3 月底去日本看樱花 🌸,想去成都找阿猫和七夏姐姐吃火锅,想
318去深圳找汤圆逛下腾讯,然后去澳门塔蹦极\n\n![2018-3](./attachments/bafkreic2o7lz4mq7qlotq6vqxt2nmkwnudzhihhavmpzhxhp5jqqxrfqr4.jpeg)\n\n## 技能\n\n🎨 画画:[一](https://twitter.com/DIYgod/status/1005134065412943872) [二](https://twitter.com/DIYgod/status/1006221633470660608) [三](https://twitter.com/DIYgod/status/1011283860930215941),重拾了小学放下的画笔(~~iPad Pencil~~),画画真好玩,可惜 darling 烂尾之后很生气,没什么想画的了,就没能坚持下来,2019 再给我一个画画的动力吧\n\n🤸‍♀️ HIPHOP 街舞:运动强度极大,上完体验课浑身疼了好几天,但是很酷,报了 10 节私教课和 9 节大课,还没开始正式上课,2019 应该可以坚持下来,毕竟挺贵的,这几节课就花了 8000 块左右(两个人)\n\n🎬 vlog:[一](https://diygod.me/bw2018/) [二](https://diygod.me/cj2018/) [三](https://diygod.me/cp2018sp/),买了 Osmo Mobile 2,漫展拍了几次,已经失去兴趣了\n\n🍛 做饭:在室友的指导下做了一盘[小炒肉](https://twitter.com/DIYgod/status/1044928336802136064),比想象中简单嘛\n\n🎃 做南瓜灯:[一](https://twitter.com/DIYgod/status/1057545543252041728) [二](https://twitter.com/DIYgod/status/1057614657169514496),放进灯的一瞬间惊喜地跳了起来,很有成就感,最后一直放烂了才舍得扔\n\n## 健康\n\n12 月才开始健身,一天 keep 一天跑步,结果强度设置太大,喜闻乐见地伤到了,休息一周半了,没意外的话下周会恢复\n\n体重没减下来,但也没增加\n\n早睡:大失败\n\n2019 想把头发染成橘黄色 👩‍🦰\n\n![2018-4](./attachments/bafkreidyxpbq35x6x3eartnu7mfevztp4pl3g756azrszcqoqz6rovyrri.jpeg)\n\n## 游戏\n\n守望先锋练成了一手无敌强的法鸡,但在七夏姐姐不玩了之后也好几个月没玩过了\n\n买了 PS4,肝了 60 多个小时后通关(出新手村)了怪物猎人世界,结尾的 BGM 真好听,通关后又被双爆鳞龙和炎妃龙打自闭了 🤐\n\n堡垒之夜、分手厨房 2、王者荣耀、大表哥 2、跳楼少女、太鼓达人也稍微玩了一下下\n\n![2018-5](./attachments/bafkreicshb4degelmzfohkuowuwv4klzs666ezea26bxbj4ditrmxppnwa.jpeg)\n\n## 影视\n\n话剧:\n\n《乌龙山伯爵》:最佳\n《李茶的姑妈》\n《皇帝的新娘》\n\n电视剧:\n\n《我是大哥大》:最佳\n《保镖》\n《迷雾》\n《逃避虽可耻但有用》\n《黑镜》\n《这份恋情有罪吗!?》\n《无法成为野兽的我们》\n《西部世界》\n《魔法觉醒》\n《人类清除计划》\n\n番剧:\n\n《DARLING in the FRANXX》:最佳(勉强)\n《齐木楠雄的灾难 第二季》\n《青春猪头少年不会梦到兔女郎学姐》\n《千绪的上学路》\n《citrus~柑橘味香气~》\n《工作细胞》\n《路人女主的养成方法》\n《NO GAME NO LIFE》\n《我家女仆有够烦!》\n《進擊的巨人 第三季》\n《凸变英雄》\n《JOJO的奇妙冒险 黄金之风》\n《OVERLORD》\n《博多豚骨拉面团》\n《pop子和pipi美的日常》\n《刻刻》\n\n电影:\n\n太多了,略过\n\n一共 3 部话剧,10 部电视剧,16 部番剧,超出预期 🙋‍♀️\n\n有很多想读的书一本都没读,2019 期望可以多读一些书\n\n![2018-6](./attachments/bafkreies3fxh7urf5kuhwunt4cbhd7jics5kmjze3asqheyqe657var4tq.jpeg)\n\n## 感情\n\n跟酸奶的感情依然很好,她现在就在我旁边睡觉 🐱\n\n跟发小的地理距离变近了,但是...事情变得怪怪的,希望只是暂时的\n\n还有很多想说的,不能写出来\n\n## 最后\n\n去年 ch 在她 23 岁的年终总结里写到\n\n> 现在的年纪\n>\n> 已经是不能再马马虎虎生活工作的年纪了\n>\n> 再也不是心情一好起来 什么都会好起来的年纪\n\n上次看到还不以为意,现在感觉真是一针见血\n\n2019 希望可以活得更认真一点,尽量让自己变得充实有趣起来,但说实话我也没什么信心"},{"slug":"nas","title":"从零开始的 NAS 生活","tags":[],"body":"很早就想组一个家庭 NAS 
318设备,趁着这次双十一,在京东买了一台群晖 DS218play 和一块酷狼 4T 硬盘,已经用了两天了,我的感受是:\n\n**爽爆**\n\n## 使用\n\n目前常用的有下面几个功能\n\n### Time Machine\n\n![nas1](./attachments/bafkreidvl4x46g6q5xhu7hkiemgzyblf2a2h2yezq6iqgokwofgsncgosq.jpeg)\n\n之前用 Time Machine 做备份要一直连着移动硬盘,很麻烦而且容易忘记,经常是 Mac 提醒我已经 10 多天没备份了才想起来插上移动硬盘备份一下,有 NAS 之后可以实现无线和远程备份,在任何地方都可以让 Mac 每小时自动备份到家里的 NAS 里\n\n### BT 下载\n\n![nas2](./attachments/bafkreihslhp7jkexowwnodr3psplblsxptdbbgiq34k32vngowvdyaprwe.jpeg)\n\n使用 RSS 订阅喜欢的番剧或美剧,有更新可以自动下载,或者在公司~~摸鱼~~的时候看到一部喜欢的电影,可以远程登录到家里的群晖,添加 BT 任务,晚上回家就可以直接看了\n\n### 存储\n\n这是 NAS 最基础的功能了,它最大的好处是可以快速在不同设备间共享\n\n比如我在电脑上把樱岛麻衣的照片存到 NAS 里,打开手机可以随时看\n\n![nas3](./attachments/bafkreiawzdtlndpjamroaxnqjrjq44rypjz3blmdvsb2s3v5v7cqghkbt4.jpeg)\n\n再比如我下载了一部日剧,根据我心情的不同,我有可能想坐在桌子前用电脑看,也有可能想躺在床上用 iPad 看\n\n![nas4](./attachments/bafkreic543swlcdjvk4ujstenilfqljshk5tfjyh6h3xfjp7x6knmpzvde.png)\n\n而在有 NAS 之前,我必须把 iPad 用数据线连到电脑上,打开难用的要死的 iTunes,然后把视频拷贝到 iPad 里才能看\n\n## 部署\n\n群晖有一个叫 QuickConnect 的东西,可以分配一个群晖的域名,可以直接用它在公网远程连接\n\n但我想绑定自己的域名,还是折腾了一下,没想到那么麻烦\n\n### 端口转发\n\n为了将外网对应到内网的 NAS 上\n\n家里的电信宽带已经有了公网 IP,设置下端口转发就行了,以为很简单,没想到是个大坑\n\n![nas5](./attachments/bafkreiawy6iujwauiuujqh6j3s5ygol4ceupvxn7sodbp47hgfp6df2oc4.jpeg)\n\n用路由器的 DMZ 功能设置好转发之后,发现没效果,访问公网 IP 返回的是光猫的登录界面,才知道光猫和路由器不是桥接,还需要在光猫上设置转发,尝试了下发现我没有光猫的超级管理员账号,没有权限设置\n\nGoogle 上查到了几种电信光猫的破解方法,试了都无效,凌晨4点多给电信客服打电话,居然有人接...约了早上电信师傅上门处理\n\n早上电信师傅过来给了超级管理员账号\n\n超级管理员账号进了光猫后台,把光猫和路由器设置成桥接后端口转发正常了\n\n### DDNS\n\n为了将动态的公网 IP 映射到我的域名上\n\n![nas6](./attachments/bafkreic3k3b23ob5hft7huhjdudwfpp6mla6tyrucjzawfpsrjhwgd2et4.jpeg)\n\n![nas7](./attachments/bafkreiccmdcgvxhbney7v3o4zjfq52fdfv7vrqoxo7wa4ksl7hpicazjiq.jpeg)\n\n群晖和路由器都带了 DDNS 功能,却发现都不支持 CloudXNS...只能自己动手了\n\n惊喜地发现了这个东西:https://github.com/lixuy/CloudXNS-DDNS-with-BashShell\n\n![nas8](./attachments/bafkreia3hhjbziwtola5gqrc4rt3vujvledlyxgovgoohjkjm6bjknrpme.jpeg)\n\n利用群晖的任务计划功能 10 分钟跑一下这个脚本,实现了 CloudXNS 的 DDNS\n\n### SSL 证书\n\n![nas9](./attachments/bafkreihajrzs55mrbb427pfa7j3fdndjdsdg7bw5rzmwc3ljmjt2etugom.jpeg)\n\n群晖自带了自动从 Let's Encrypt 获取证书的功能,真香\n\n却发现群晖用的验证方式必须用 80 端口,国内根本不能用,真臭\n\n![nas10](./attachments/bafkreicrfkvajsxn5e332dz5n7etkmuholg4bkqq6i2xhctsttbtfhr64a.jpeg)\n\n也找到了解决方案:http://www.up4dev.com/2018/05/29/synology-ssl-wildcard-cert-update/\n\n同样是利用群晖的任务计划功能一个月跑一下这个脚本,解决了 SSL 证书和自动续签\n\n![nas11](./attachments/bafkreibgnztkzvob6kduwxywtupxbl2os4trsjsrzhv4lueumxpfujdssy.jpeg)\n\n最后实现了通过自己的域名 https://nas.diygod.me:2222 远程访问 NAS,细心的小可爱刚才已经在文章第一张图里看到了这个域名"},{"slug":"cp2018sp","title":"C94 & CP2018SP 参展日记","tags":[],"body":"C94 和 CP2018SP 不是同一天,但都是同人展,时间又很近,就写在一起了\n\n## C94\n\nComic Market,全球最大的同人展,8 月 10 日在东京举办,我当然没钱去,三天都在 Twitter 云参展,口水流了一地\n\n托朋友到 Aniplex 展台买了矢吹健太朗的 darling 本子,毕竟官方画师质量超级棒,舔爆!\n\n如果再给我一次机会,我应该会买三本,一本自舔一本收藏一本传教\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/
318player.html?vcode=596384de52393e72&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n&nbsp;\n\n## CP2018SP\n\n出发前发现云台坏了,辣鸡大疆,所以这次没有 vlog 了\n\nComicup,8 月 25 日在上海举办,CP2018SP 规模比今年5月份的 CP22 小了很多,跟 C94 更没法比,全场两个多小时就逛完了,然后实在无聊又重头逛了一遍...\n\n虽然规模小但还是买到了很多喜欢的本子,把遇到的 darling 都买了,舔爆!\n\n![cp2018sp](./attachments/bafybeidte4gjslowcnxfzqtwfn5y4e3htbz55ieu26khl57uwb4hhixek4.jpeg)\n\n对比 CP22\n\n![cp22](./attachments/bafybeiglmdxxw743q423bifqwunjduohsdpthfph5bvd5oicmhc7ceqjoy.jpeg)\n\n出来之后和朋友去吃了牛肉火锅,然后看蚁人,然后又撸串,撸串这家散装的草莓啤酒超级好喝,讨厌喝酒的我都喝了一大杯,看 Freddy 开心得手舞足蹈就知道有多好喝了\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=af7819dc291a5920&userId=17&autoPlay=true&loop=true&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>"},{"slug":"cj2018","title":"2018 ChinaJoy 参展日记","tags":[],"body":"8月4日去了 ChinaJoy,人还是一如既往的多\n\nAC 娘真可爱,舔爆\n\n第二次拍 vlog,然后拍完懒得剪,还是 Freddy 帮我剪的,我在视频里真可爱\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=10c5de157e5129c0&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n![cj1](./attachments/bafkreihxje6xkzxslea5oybkxbffehuqefwtbkdmfgtp4eovitbrmk5z7m.jpeg)\n\n又见到了王尼玛和全体暴走家族成员,但这次心情很复杂\n\n终于买到了之前一直碎碎念的 AC 娘包子头,然后被一万个人问在哪里弄的\n\n~~软磨硬泡求~~拿到了很喜欢的触手直播的毛绒触手,懒得拍照了你们自己想象吧\n\n然后晚上和[绒布球群](https://wj.qq.com/s2/3318631/2970)里的绒布球们吃了饭,第二届绒布球线下py\n\n![cj2](./attachments/bafybeidn2osnqghykw3kyefmrifiomfazpwzqa6afv5so4guzx6ehrwsam.jpeg)"},{"slug":"bw2018","title":"2018 bw & bml 参展日记","tags":[],"body":"7月21日和22日去了 bw 和 bml,面基了一万个人,py 通红\n\n### BILIBILI WORLD\n\n2233 真可爱,舔爆\n\n第一次拍 vlog,然后拍完懒得剪,还是 Freddy 帮我剪的\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=e831056159c1f1a4&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n然后晚上和[绒布球群](https://wj.qq.com/s2/3318631/2970)里的8个绒布球们吃了海底捞,第一届绒布球线下py\n\n说好的都是肥宅,结果一个比一个~~受~~,不对,瘦\n\n小桐桐、李聆歌、Siki、小萌、烷、冰喵、二九、DIYgod、Freddy\n\n![bw1](./attachments/bafybeich7einf6hdm4t5f6rlaucwsfd6lvd2pyeyafvozqobvvhvsjxwlm.jpeg)\n\n### BILIBILI MACRO LINK\n\n白天冒着台风跟可爱的 lwl 面基,带 lwl 逛了B站总部和撸酸奶\n\n![bw2](./attachments/bafybeiet7lz4qh2chakvlkmooetmens2w5gue2aq3zd7rxr6gu3sfpd2he.jpeg)\n\n又跟 [richCloud](https://www.rixcloud.com/) 老板 Zero 撸了串\n\n![bw3](./attachments/bafkreigbtkzbxcsvumluyuotl5akuqaffbd3o7lneikynr4ocwmobi7bru.jpeg)\n\nBML!\n\n![bw4](./attachments/bafybeibvmextx22apkwzfghrr36onpofgl2xqcyulinmwqcamnd2bfvwjm.jpeg)\n\n一进场就被震撼到了,气氛超级嗨,每个人都在用荧光棒伴随节奏打着 call,特别是极乐净土出现的时候,非常激动ï¼
318Œå—“子都要喊哑了\n\n可惜坐的太靠后了,嘉宾的脸都看不清,希望明年可以买得起前面的位子(不要问我为什么公司不发票,用爱发电)"},{"slug":"painting-02","title":"【临摹】02 - pixiv","tags":["画画"],"body":"原图:DARLING in the FRANXX EP#04 00:16:48"},{"slug":"polymer","title":"Polymer 初体验","tags":[],"body":"作为开发者,我们都知道组件化、标准化和代码复用的重要性,前端也从未停止过对前端组件化的尝试,产生了各式各样的组件化技术,从 Vue React 等前端框架,到 webpack 这样的全站打包工具\n\n但前端一直缺乏这样一个模块化标准和浏览器级别的原生组件化方案\n\nWeb Components 是 WHATWG 和 W3C 正在尝试的 Web 组件化方案,为组件化的前端开发提供浏览器级别的支持。它由四项主要技术组成:Shadow DOM、Custom Elements、HTML Import、HTML Template\n\nPolymer 项目是 Google 的基于 Web Components 机制的框架,定位于简单的 Polyfill 和易用性封装,包括数据绑定,模板声明,事件系统等。Google 在去年就已经将其应用到了 YouTube 上\n\nPolymer 3.0 在 20 天前刚刚发布,正好 B 站播放器近期需要重构所有 UI 组件,所以做了这样的一个调研,下文所有 demo 托管在 [polymer-demos](https://github.com/DIYgod/polymer-demos),这些小 demo 只作为一些简单体验,想了解 Polymer 的完整功能建议阅读[官方文档](https://www.polymer-project.org/3.0/docs/devguide/feature-overview)\n\n<!--more-->\n\n## 浏览器支持\n\n目前使用 Web Components 的最大阻碍就是浏览器支持程度低,且 Polyfills 体积相对偏大(90+kb)\n\n目前只有新版 Chrome Opera 和 Safari 可以提供完整的原生支持,具体支持情况可以参考 [caniuse.com](https://caniuse.com/#search=web%20components),使用 [Polyfills](https://github.com/webcomponents/webcomponentsjs) 后可以支持到 Edge IE11+ Firefox Safari9+\n\nPolyfills 有三个主要的文件:\n\n- `webcomponents-bundle.js`: 包含了所有 polyfills\n- `webcomponents-loader.js`: 可以检测浏览器支持情况,然后去加载对应的 polyfills,对有原生支持的浏览器可以减少不必要的浪费\n- `custom-elements-es5-adapter.js`: 注册 Custom Elements 时需要使用 ES6 语法,所以当浏览器不支持 ES6 时需要做额外的处理,再引用这个文件就好了\n\n总的来说兼容最多浏览器的最佳实践是这样的:\n\n```html\n<scirpt src=\"webcompoments-loader.js\"></scirpt>\n<scirpt src=\"custom-elements-es5-adapter.js\"></scirpt>\n
318<script src=\"index.js\"><\/script>\n```\n\n其中 `webcompoments-loader.js` 必须单独引用,`custom-elements-es5-adapter.js` 可以跟 `polymer` 和你的代码用 Webpack 合到一起,但注意 `custom-elements-es5-adapter.js` 不要做额外的编译,其他代码用 babel 编译成 ES5,完整实践可以参考 [polymer-demos](https://github.com/DIYgod/polymer-demos)\n\n## Custom elements\n\n下面尝试定义一个最简单的自定义元素,从 `PolymerElement` 继承一个类,然后传给 `window.customElements.define`\n\n**效果**\n\n{% raw %}\n<demo-custom-elements></demo-custom-elements>\n{% endraw %}\n\n**HTML 代码**\n\n```html\n<demo-custom-elements></demo-custom-elements>\n```\n\n**JS 代码**\n\n```js\nimport { PolymerElement } from \"@polymer/polymer\";\n\nclass DemoCustomElements extends PolymerElement {\n  constructor() {\n    super();\n    this.textContent = `I'm a custom element.`;\n  }\n}\n\nwindow.customElements.define(\"demo-custom-elements\", DemoCustomElements);\n```\n\n## Shadow dom\n\nShadow dom 是一个隐藏、独立的 DOM,它的 HTML CSS 和行为与常规的 DOM 树分离,这样不同的功能不会混在一起,内外的 CSS 也互不影响\n\nShadow dom 不是一个新事物,一直以来,浏览器用它来封装一个元素的内部结构。以 `<video>` 元素为例。你所能看到的只是一个 `<video>` 标签,实际上,在它的 Shadow dom 中包含一系列的按钮和控制器\n\n下面例子中,Shadow dom 里的 p 标签定义了 CSS 属性 `color`,它不会泄露到外部\n\n**效果**\n\n{% raw %}\n\n<style>\n    html {\n        --my-background: #eee;\n    }\n</style>\n\n<demo-shadow-dom></demo-shadow-dom>\n\n<p>I am outside of demo-shadow-dom. Because of encapsulation, demo-shadow-dom's styles won't leak to me.</p>\n{% endraw %}\n\n**HTML 代码**\n\n```html\n<style>\n  html {\n    --my-background: #eee;\n  }\n</style>\n<demo-shadow-dom></demo-shadow-dom>\n<p>\n  I am outside of demo-shadow-dom. Because of encapsulation, demo-shadow-dom's\n  styles won't leak to me.\n</p>\n```\n\n**JS 代码**\n\n```js\nimport { PolymerElement, html } from \"@polymer/polymer\";
318\n\nexport class DemoShadowDom extends PolymerElement {\n  static get template() {\n    return html`\n      <style>\n        p {\n          color: #f5712c;\n          background-color: var(--my-background);\n        }\n      </style>\n      <p>I'm a DOM element.</p>\n      <p>This is my shadow DOM!</p>\n    `;\n  }\n}\n\nwindow.customElements.define(\"demo-shadow-dom\", DemoShadowDom);\n```\n\n## HTML templates\n\n使用 `<template>` 和 `<slot>` 组成 shadow DOM\n\n**效果**\n\n{% raw %}\n<demo-html-template>\n\n<p>I'm a custom slot.</p>\n</demo-html-template>\n{% endraw %}\n\n**HTML 代码**\n\n```html\n<demo-html-template>\n  <p>I'm a custom slot.</p>\n</demo-html-template>\n```\n\n**JS 代码**\n\n```js\nimport { PolymerElement, html } from \"@polymer/polymer\";\nimport \"@polymer/polymer/lib/elements/dom-repeat.js\";\nimport { DemoShadowDom } from \"./demo-shadow-dom\";\n\nclass DemoHTMLTemplate extends DemoShadowDom {\n  constructor() {\n    super();\n\n    this.employees = [\n      {\n        name: \"Blog\",\n        link: \"https://diygod.me\",\n      },\n      {\n        name: \"GitHub\",\n        link: \"https://github.com/DIYgod\",\n      },\n    ];\n  }\n  static get template() {\n    return html`\n      <strong>Template:</strong>\n      <template is=\"dom-repeat\" items=\"{{employees}}\">\n        <p><a href=\"{{item.link}}\">{{item.name}}</a></p>\n      </template>\n      <strong>Slot:</strong>\n      <slot></slot>\n      <strong>Super template:</strong>\n      ${super.template}\n    `;\n  }\n}\n\nwindow.customElements.define(\"demo-html-template\", DemoHTMLTemplate);\n```\n\n## 数据绑定\n\n支持双向的数据绑定,你可以尝试编辑下面的输入框,或者直接在控制台修改属性 `document.querySelector('demo-data').owner1 = 'DIYgay'`,属性改变会即时反映到 DOM 里\n\n**效果**\n\n{% raw %}\n<demo-data owner1=\"DIYgod1\"></demo-data>\n{% endraw %}\n\n**HTML 代码**\n\n```html\n<demo-data owner1=\"DIYgod1\"></demo-data>\n```\n\n**JS 代码**\n\n```js\nimport { PolymerElement, html } from \"@polymer/polymer\";\nimport \"@polymer/iron-input\";\n\nclass DemoData extends PolymerElement {\n  constructor() {\n    super();\n    this.owner3 = \"DIYgod3\";\n  }\n\n  static get properties() {\n    return {\n      owner1: {\n        type: String,\n        value: \"DIYgod\",\n      },\n      owner2: {\n        type: String,\n        value: \"DIYgod2\",\n      },\n    };\n  }\n\n  static get template() {\n    return html`\n      <p>This is <b>[[owner1]]</b>'s element.</p>\n      <p>This is <b>[[owner2]]</b>'s element.</p>\n      <p>This is <b>{{owner3}}</b>'s element.</p>\n      <iron-input bind-value=\"{{owner1}}\">\n        <input is=\"iron-input\" placeholder=\"Your name here...\" />\n      </iron-input>\n    `;\n  }\n}\n\nwindow.customElements.define(\"demo-data\", DemoData);\n```\n\n## 自定义事件\n\n下面我们来给我们的自定义元素定义一个名为 `diygod` 的事件,绑定事件回调的方法跟正常事件一样\n\n**效果**\n\n{% raw %}\n<demo-events></demo-events>\n\n
318<script>\n    document.querySelector('demo-events').addEventListener('diygod', function (e) {\n        alert(e.detail.msg);\n    });\n<\/script>\n\n{% endraw %}\n\n**HTML 代码**\n\n```html\n<demo-events></demo-events>\n
318<script>\n  document\n    .querySelector(\"demo-events\")\n    .addEventListener(\"diygod\", function (e) {\n      alert(e.detail.msg);\n    });\n<\/script>\n```\n\n**JS 代码**\n\n```js\nimport { PolymerElement, html } from \"@polymer/polymer\";\n\nexport class DemoEvents extends PolymerElement {\n  static get template() {\n    return html` <button on-click=\"handleClick\">Kick Me</button> `;\n  }\n\n  handleClick(e) {\n    this.dispatchEvent(\n      new CustomEvent(\"diygod\", {\n        detail: {\n          msg: \"diygod event fired\",\n        },\n      }),\n    );\n  }\n}\n\nwindow.customElements.define(\"demo-events\", DemoEvents);\n```\n\n<scirpt src=\"https://cdn.jsdelivr.net/gh/DIYgod/[email protected]/dist/webcomponents-loader.js\"></scirpt>\n\n
318<script src=\"https://cdn.jsdelivr.net/gh/DIYgod/[email protected]/dist/polymer-demos.js\"><\/script>"},{"slug":"goodnight","title":"早安晚安自动化","tags":[],"body":"上一集:[女朋友的微博情绪监控](https://diygod.me/2920/)\n\n发小一直很喜欢说早安晚安(当然是我说给她),但我经常会忘记,最近灵机一动,想出来这样一个科学高效方便快捷稳定地说早安晚安的办法:\n\n把微信挂在服务器上,每天固定时间,自动执行发送早晚安文本消息的命令!\n\n代码很简单,放在了 [GitHub](https://github.com/DIYgod/GoodNight) 上,具体效果是每天早上 9 点半发一个 “早安”,然后晚上 12 点再发一个 “晚安”。\n\n太好了!以后再也不会忘记说早安晚安了!开心!\n\n![havefun](./attachments/bafkreig52xbbytdog3amaevevnjww3sirqr66mxaiwdggalq57zuul5djm.jpeg)\n\n脚本已经部署到服务器上了,明天早上给发小一个惊喜!\n\n实际使用的效果明天会更新到下面(肯定没问题,稳得很!):"},{"slug":"rsshub","title":"RSSHub - 使用 RSS 连接全世界","tags":["新坑"],"body":"**[项目地址](https://github.com/DIYgod/RSSHub)**\n\n## 介绍\n\nRSSHub 是一个轻量、易于扩展的 RSS 生成器,可以给任何奇奇怪怪的内容生成 RSS 订阅源\n\n当前支持列表:\n\n- bilibili\n  - 番剧\n  - UP 主投稿\n  - UP 主动态\n  - UP 主收藏夹\n  - 分区视频\n- 微博\n  - 博主\n- 网易云音乐\n  - 歌单\n- 掘金\n  - 分类\n- 自如\n  - 房源\n- 快递\n\n<!--more-->\n\n## 参与我们\n\n如果有任何想法或需求,可以在 [issue](https://github.com/DIYgod/RSSHub/issues) 中告诉我们,同时我们欢迎各种 pull requests\n\n可以通过以下途径参与讨论:\n\n- [Telegram 群](https://t.me/rsshub)"},{"slug":"2018-bao-zou-yu-ren-jie","title":"2018 暴走 yu 人节参展日记","tags":[],"body":"暴走 yu 人节是暴走漫画首届互动娱乐展会,作为暴走粉当然不能错过,很早就买了票。\n\n总体感觉还是很棒的,嘉宾阵容强大,互动很多(还可以跟王尼玛一起上厕所),诚意满满,但不足也很明显,暴走 yu 人节主要内容集中在主舞台的节目表演,但上海新国际博览中心的现场座位远远不够,感觉还是更适合在类似 BML 的举办地梅赛德斯-奔驰文化中心这种地方举办。\n\n![bz1](./attachments/bafybeic353ywqcrd36cf3i7gla52dldcumdosiehmmquuxp5mdmast5f7i.jpeg)\n\n上午去得比较晚,逛了下厂商展台
318,没看节目,中午暴走家族在主舞台互动了一波,然后就是下午的节目。\n\n### 醋醋\n\n超级可爱,被圈粉了\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=8bec03c44fed9768&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n::br\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=94d01db8c201e02c&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n### 金馆长\n\n哦哈哈哈哈哈哈\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=2db33acf3779cf0e&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n::br\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=b0edcab2a0eb5b50&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n### 暴走家族\n\n全阵容,激动\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=82f561eaa0c1209b&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n### 咬人猫 赤九玖 有咩酱\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=f90c1e0c6121a82a&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n::br\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=78d10096fc0c1550&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n::br\n\n<iframe id=\"dogePlayerFrame\" src=\"https://player.dogecloud.com/web/player.html?vcode=cb5d5124d3f04a3a&userId=17&autoPlay=false&inFrame=true\" allowfullscreen=\"true\" msallowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\" oallowfullscreen=\"true\" allowtransparency=\"true\" scrolling=\"no\" width=\"728\" height=\"409\" frameborder=\"0\" allow=\"accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture; fullscreen\" referrerPolicy=\"unsafe-url\"></iframe>\n\n### 山下智博\n\n签售会,签名 合照 get√\n\n![bz2](./attachments/bafkreiaiboyiuftix7pu7v4cucnhaormwy4fgij7ei5i2o4eipbrv7g3h4.jpeg)\n\n最后离场的时候还在厕所里遇到了王尼玛,上厕所也带着头套,身边有个工作人员,很激动,呆住了好几秒...发现王尼玛比我矮好多,应该在170以下😂"},{"slug":"open-source-project-donation","title":"关于开源项目赞助这件事","tags":[],"body":"相信没人做开源项目是为了赚钱,因为它还不如去天桥贴膜赚得快。\n\n但即使没有这种想法,维护一个开源项目也会遇到一些很头疼的现实问题,比如服务器和 CDN 的开销。以 DPlayer 为例,弹幕接口服务器每年需要花费 2000 多块,文档里的视频 CDN 费用每年也需要花费 1500 多块,并且随着用户增多这些花费只增不减。\n\n虽然一直在 README 的显著位置挂着赞助方式,但也没抱太大希望,毕竟 DPlayer 用户几乎都是国人,能遇到一个可以描述清楚自己问题的用户就已经很不容易了,结果也不出我所料,一年里零星收到的赞助只不过是杯水车薪。说实话,让我自己承担这些花费我是不乐意的,再加上用户大多是盗版站和小黄站,这曾一度让我产生了弃坑的想法。<!--more-->\n\n后面的事情很多朋友都知道了,[又拍云](https://www.upyun.com/)和[梨享计算](https://pear.hk/)先后赞助了 DPlayer,又拍云赞助了 DPlayer 的全部 CDN 费用,梨享计算则每月提供一笔数量可观的金钱赞助。\n\n一般来说,如果一个团体或企业将开源项目用在商业产品中,那么赞助开源项目有直接的商业上的益处:可以让产品所依赖的框架保持健康并得到积极的维护ã€
318‚不同的是又拍云并没有用到 DPlayer,短期内也不会有任何直接的商业回报,可能更多的是一种情怀,又拍云作为一家商业公司,其不求回报的慷慨赞助是我尤其感动的。\n\n这篇文章当然不是为了号召大家进行赞助或去天桥贴膜,目前两家公司的赞助已经足够人力以外的日常开销,除了赞助,贡献代码、提一个描述清楚的 bug 或意见、一句鼓励、或者仅仅是使用我的开源项目都同样可以让我很开心,这些都是让我继续花时间做开源的动力。\n\n以下硬广:\n\n> [梨享计算](https://pear.hk/)是一家雾计算技术研发商,专注于为用户提供 IaaS 架构、PaaS 平台、SaaS 软件服务。Pear Fog 不仅是跨越网络中心到边缘的资源池,也是新型的 P2P 系统。其中 Fog CDN 在以透明且 Web 友好的方式帮视频厂商降低内容分发成本、提高质量。\n\n> [又拍云](https://www.upyun.com/)是国内知名企业级云服务商,致力于为客户提供一站式的在线业务加速服务,为客户提供对象存储、HTTPS/SSL 证书、多媒体处理(WebP 自适应、H.265 自适应等)、影像识别、文字识别、短视频 SDK、直播 SDK、连麦 SDK 等服务。又拍云拥有 6 个数据处理中心、300 多个国内CDN节点、15 个海外CDN节点、5000 台服务器、5TB 保有带宽,日均请求超过 1000 亿次。"},{"slug":"darling-in-the-franxx-style","title":"DARLING in the FRANXX 博客样式","tags":[],"body":"<iframe style=\"border-radius:12px\" src=\"https://open.spotify.com/embed/track/5KAI6nfg3wQRmtwJ0PPaEW?utm_source=generator\" width=\"100%\" height=\"152\" frameBorder=\"0\" allowfullscreen=\"\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" loading=\"lazy\"></iframe>\n\n**点击<a href=\"javascript:;\" id=\"darling-trigger\">这里</a>切换样式**\n\n{% raw %}\n\n
318<script>\n$('#darling-trigger').click(function () {\n    var $body = $('body');\n    if ($body.hasClass('theme-darling')) {\n        $body.removeClass('theme-darling');\n    }\n    else {\n        $body.addClass('theme-darling');\n    }\n});\n<\/script>\n\n{% endraw %}\n\n救命啊,我被撩到了!\n没错,我就是她的 Darling!\n天哪,世界上怎么会有那么可爱的女孩子!\n我现在只想看 DITF 第五集别的什么都不想干.jpg\n\n![image](./attachments/bafybeiebhzcewbsmznmjvpd4xodthfd4ygyrjolz4cfzawqohuhiqnqbzi.png)"},{"slug":"web-workers","title":"Web Workers 初体验","tags":[],"body":"[这个视频](https://www.bilibili.com/video/av18682336/)有 15+MB 的 BAS 弹幕脚本需要解析,这会导致页面卡死 7 秒左右的时间,期间 UI 被冻结,体验很糟糕,如果使用 Web Workers 进行优化,把解析放入 Web Workers 执行,就可以避免 UI 线程阻塞造成的页面冻结。\n\n<!--more-->\n\n## 单线程\n\n使用 parse 来模拟解析函数\n\n**index.js**\n\n```js\nfunction parse(time) {\n  const start = new Date();\n  while (new Date() - start < time) {}\n  return \"DIYgod\";\n}\nconsole.log(parse(1000));\n```\n\n此时页面会卡死 1s,然后输出一个 'DIYgod'。\n\n## 使用 Web Workers\n\n**index.js**\n\n```js\nconst wk = new Worker(\"worker.js\");\nwk.postMessage(1000);\nwk.addEventListener(\"message\", (e) => {\n  console.log(e.data);\n});\n```\n\n**worker.js**\n\n```js\nfunction parse(time) {\n  const start = new Date();\n  while (new Date() - start < time) {}\n  return \"DIYgod\";\n}\n\nonmessage = function (e) {\n  postMessage(parse(e.data));\n};\n```\n\n这是 Web Workers 的一个最基础用法,index.js 把 1000 传给 worker.js,worker.js 在后台解析 1000 ms,再把结果 'DIYgod' 传回 index.js,这样解析就不会再占用 js 主线程,避免了页面卡死。\n\n## 内嵌 Worker\n\n上一步我们加载了两个 js 文件,index.js 和 worker.js,在 HTML 里引用 index.js,然后 index.js 会加载 worker.js,那么不想创建单独的 Worker 文件怎么办呢?\n\n**index.js**\n\n```js\nconst workerBlob = new Blob(\n  [\n    `function parse (time) {\n    const start = new Date();\n    while(new Date() - start < time) {}\n    return 'DIYgod';\n}\n\nonmessage = function (e) {\n    postMessage(parse(e.data));\n}`,\n  ],\n  { type: \"application/javascript\" },\n);\nconst workerURL = URL.createObjectURL(workerBlob);\n\nconst wk = new Worker(workerURL);\nwk.postMessage(1000);\nwk.addEventListener(\"message\", (e) => {\n  console.log(e.data);\n});\n```\n\nURL.createObjectURL(blob) 会创建一个 DOMString,它包含一个表示 blob 的 URL。\n\n打开控制台的 Network 标签页,你会看到浏览器加载了一个形如 `blob:http://example.com/16215a1e-21d4-450c-b441-070e1981b69d` 的奇怪链接的 js 文件,这个 js 文件的内容正是我们传给 workerBlob 的字符串内容。\n\n这个 URL 是唯一的,且它的生命周期和创建它的窗口中的 document 绑定,只要页面存在,该网址就会一直有效。\n\n## 使用 webpack worker-loader\n\n上一步中我们把 js 代码放在了字符串里,它不能拆分模块,也不利于后期维护,如果项目正在使用 webpack,安装 [worker-loader](https://github.com/webpack-contrib/worker-loader) 可以解决这个问题。\n\n**index.js**\n\n```js\nimport WK from \"worker-loader?inline=true&fallback=false!./worker.js\";\n\nconst wk = new WK();\nwk.postMessage(1000);\nwk.addEventListener(\"message\", (e) => {\n  console.log(e.data);\n});\n```\n\n**worker.js**\n\n```js\nimport Parse from \"./parse.js\";\n\nself.addEventListener(\"message\", (e) => {\n  self.postMessage(Parse(e.data));\n});\n```\n\n**parse.js**\n\n```js\nfunction Parse(time) {\n  const start = new Date();\n  while (new Date() - start < time) {}\n  return \"DIYgod\";\n}\n\nexport default Parse;\n```\n\n只需要使用 worker-loader 引用 worker.js 模块,剩下的 worker-loader 会帮我们自动处理,最后编译的结果类似我们上一步的代码。\n\n对比不使用 Web Workers 时:\n\n**index.js**\n\n```js\nimport Parse from \"./parse.js\";\n\nconsole.log(Parse(1000));\n```\n\n**parse.js(不变)**\n\n```js\nfunction Parse(time) {\n  const start = new Date();\n  while (new Date() - start < time) {}\n  return \"DIYgod\";\n}\nexport default Parse;\n```\n\n这样不用修改原有的解析模块,非侵入式,只需要加个 worker.js 中转模块,再改下调用方法即可,维护起来也很方便。\n\n## 性能\n\n如果我把一个计算放入 4 个 Worker,那么这个计算会快 4 倍?\n\n不,它不仅不会快 4 倍,而且会变得更慢。\n\nWeb Workers 不是为了缩短计算时间,而是为了避免 UI 线程冻结。创建线程、线程调度、传输数据等行为会导致计算变得比单线程稍微更慢一点。\n\n我记录了开头那个视频在不同 Worker 数量下解析 100 条弹幕的时间,7 次记录取平均值:\n\n| Worker 数量  | 0    | 1    | 2    | 3    | 4    | 5    | 6    | 10   |\n| ------------ | ---- | ---- | ---- | ---- | ---- | ---- | ---- | ---- |\n| 平均时间(ms) | 6085 | 8216 | 6310 | 6388 | 6483 | 6317 | 6475 | 7233 |\n\n不使用 Worker 的解析速度最快,1 个 Worker 的速度比其他明显更慢,2 3 4 5 6 个 Worker 速度没有明显差异,但 Worker 数量一直增加速度又会逐渐变慢。\n\n另外又测试了弹幕比较少的视频,结果是 1 2 3 4 5 个 Worker 的速度都差不多。\n\n最后不靠谱地决定使用 2 个 Worker 进行解析。\n\n优化结果妙不可言,不需要等待解析完成才能进行其他操作,ä¹
318Ÿå¯ä»¥ä¸€è¾¹æ’­æ”¾è§†é¢‘一边解析,区别只是播放到没解析好的弹幕不会显示,解析完成才会显示。"},{"slug":"neteasecloudmusic2rss","title":"NetEaseCloudMusic2RSS — 使用RSS订阅她喜欢的网易云音乐","tags":[],"body":"音乐,人类生活中永恒的主题。音乐可以很大程度上体现一个人的喜好、品味,更是最有力量的情感传输器。\n\n现在快使用RSS订阅我喜欢的网易云音乐吧:[https://api.prprpr.me/necm2rss/playlist/35798529](https://api.prprpr.me/necm2rss/playlist/35798529),跟网红 DIYgod 听一样的音乐!\n\n项目名叫 NetEaseCloudMusic2RSS,开源在 [GitHub](https://github.com/DIYgod/NetEaseCloudMusic2RSS)。\n\n另外可以使用相关项目 [Weibo2RSS](https://github.com/DIYgod/Weibo2RSS) 订阅喜欢的微博博主,[bilibili2RSS](https://github.com/DIYgod/bilibili2RSS) 订阅B站UP主、收藏夹、投币视频、番剧、分区等。\n\nRSS 干杯!"},{"slug":"bas","title":"BAS 高级弹幕","tags":[],"body":"## 写在前面\n\n如果你好奇 B 站的工作有不有趣,或者我来 B 站之后都在做什么,那么这篇文章或许可以解答你的部分疑问。\n\n来 B 站后,除了负责 HTML5 播放器的一些模块、重构和日常维护以外,BAS 高级弹幕算是我半年来负责开发的最大一个项目了。\n\n本文整理自今天在公司的超极电磁波分享(据说我还是有史以来年龄最小的讲师(=・ω・=),也算是对这个项目的一个阶段性总结。\n\n<!--more-->\n\n## 什么是 BAS 弹幕\n\nBAS,全称 Bilibili Animation Script,是新一代 bilibili 高级弹幕脚本语言,是一种用来描述高级弹幕样式、交互和动画的文本。\n\nBAS 弹幕是用 BAS 描述的高级弹幕,由元素和动画组成,元素分为文本对象、交互按钮、path 对象,动画分为简单动画、串联动画、并联动画。\n\nBAS 弹幕主要面向字幕君等高端玩家,可以用于字幕、特效、交互应用、游戏、纯弹幕作品等场景。\n\n目前 Web 端已经上线,移动端也基本开发完成,期望在明年的活动或拜年祭中能够用到。\n\n我们做了几个视频来直观展示 BAS 弹幕:\n\n第一个是毛酱大佬做的弹幕 PV:[https://www.bilibili.com/video/av257649/](https://www.bilibili.com/video/av257649/)\n\n第二个是弹幕实现的烂苹果:[https://www.bilibili.com/video/av18682336/](https://www.bilibili.com/video/av18682336/)\n\n第三个是交互按钮的演示:[https://www.bilibili.com/video/av16558829/index_3.html#page=3](https://www.bilibili.com/video/av16558829/index_3.html#page=3) ,另外像哔哩哔哩排行榜周刊这种也是很好的应用场景\n\n字幕应用方面可以很容易实现一个字幕文件转 BAS 之类的工具,今后会继续做这样的事情。\n\n### 几种高级弹幕比较\n\n#### mode7\n\n弹幕通过界面设置,不需要编写代码,使用简单但功能比较局限。\n\n![bas1](./attachments/bafkreibddan7hvm4abwwdc5lnu3u2akhu27iyqs5y4xjjwsgxnqtfxvwm4.jpeg)\n\n#### mode8\n\n即代码弹幕,功能非常强大但需要编写代码,使用复杂、安全性较差,而且只支持 Flash 平台。\n\n![bas2](./attachments/bafkreiapn6kjcnq3qjjidefcev4kochybr73h7vkvclnyu4l42hpadgfki.jpeg)\n\n#### mode9\n\n即 BAS 弹幕,是 mode 7 和 mode 8 的折中方案。\n\n跟 mode 7 相比,mode 9 需要编写脚本,使用稍复杂,但支持交互、图形和更复杂的动画,功能要强大得多。\n\n跟 mode 8 相比,mode 9 简化了语法,改用声明式,使用更简单;更安全,播放器解析实现,不合法脚本不会放行,程序可控,而不是直接操作弹幕;可以跨平台。\n\n![bas3](./attachments/bafkreiafynzwuqgkd32fjtznyzd3hntpoaoiyb7esn7qk6yd22mpxyor5i.jpeg)\n\n## 使用 BAS 弹幕\n\n### 发送权限\n\n首先权限上对 BAS 弹幕的发送权限有着严格的限制,设计上一般用户需要先用硬币购买,然后等待 UP 主确认之后才可以使用,字幕君等有特殊权限的用户才可以直接使用,但目前只开放给字幕君使用,字幕君使用并完善之后再考虑扩大使用场景。\n\n|               | 硬币购买 | UP 主确认 |\n| ------------- | -------- | --------- |\n| 一般会员      | √        | √         |\n| UP 主         | √        | ×         |\n| VIP           | ×        | √         |\n| 字幕君/管理员 | ×        | ×         |\n\n### 发送入口\n\n1. ![bas4](./attachments/bafkreiaidufn3ibfilrogjy2nwozhxn2ncdrt7extngfsdahag7qiqnwyy.jpeg)\n2. ![bas5](./attachments/bafybeicldzkudzhi63f6ibczfapinvogimwp7mqfvj5akwdpzd4ov6dype.jpeg)\n\n注意没有发送权限时入口是隐藏的,这时候可以在[试验室](https://bilibili.github.io/bas/#/playground)中进行尝试。\n\n### 编写脚本\n\n下面我们来尝试编写一些简单的脚本ï¼
318ŒBAS 脚本非常简单,它是一种声明式描述性的脚本,语法易用,保证了对象块和操作块的独立性。\n\n尝试 BAS 弹幕最简单的方法是使用[文档](https://bilibili.github.io/bas)上的例子和试验室,你可以在浏览器新标签页中打开它,跟着例子尝试一些基础用法。\n\n以文本对象为例,一个简单的带渐隐动画的文本对象是这样的:\n\n```\ndef text demo {\n    content = \"BAS\"\n}\nset demo {\n    alpha = 0\n} 5s\n```\n\n这样我们就成功创建了一条渐隐的 BAS 弹幕,看起来很简单,但是 js 在背后做了大量工作,js 会先把 BAS 脚本解析成 js 可识别的对象,应用上默认属性,再把它渲染到播放器里,同时开始动画,这时候就可以在播放器左上角看到一个渐隐的白色文本。\n\n#### 定位\n\n定位也非常简单,BAS 弹幕的定位由弹幕锚点(anchorX anchorY)和舞台位置(x y)共同决定。锚点是弹幕的中心点,(0, 0)为弹幕的左上角,(1, 1)为弹幕的右下角。\n\n```\ndef text tl {\n    content = \"左上\"\n    x = 0\n    y = 0\n    anchorX = 0\n    anchorY = 0\n}\ndef text tr {\n    content = \"右上\"\n    x = 100%\n    y = 0\n    anchorX = 1\n    anchorY = 0\n}\ndef text bl {\n    content = \"左下\"\n    x = 0\n    y = 100%\n    anchorX = 0\n    anchorY = 1\n}\ndef text br {\n    content = \"右下\"\n    x = 100%\n    y = 100%\n    anchorX = 1\n    anchorY = 1\n}\ndef text c {\n    content = \"中心\"\n    x = 50%\n    y = 50%\n    anchorX = 0.5\n    anchorY = 0.5\n}\n```\n\n#### 弹幕舞台\n\n弹幕舞台是弹幕的绘制范围,弹幕舞台默认为视频的真实区域,此外文本对象可以通过 parent 属性把其他文本对象指定为父级元素,以父级元素作为舞台进行绘制,父级元素会影响子级元素的定位、缩放等。\n\n```\ndef text a {\n    content = \"□\"\n    fontSize = 40%\n    x = 0\n    y = 0\n    color = 0xffff00\n}\ndef text b {\n    parent = \"a\"\n    content = \"□\"\n    fontSize = 20%\n    x = 0\n    y = 0\n    color = 0xff00ff\n}\nset a {\n    x = 50%\n    y = 0\n} 2s\nthen set a {} 3s\nset b {\n    y = 50%\n} 3s\nthen set b {} 3s\n```\n\n#### 生命周期\n\n生命周期是 BAS 的另一个重要概念,生命周期是弹幕存活的时间,没有指定 duration 属性时,元素生命周期为动画总时间,没有动画时默认为4s。生命周期结束后元素就会在舞台中被清除。\n\n```\ndef text a {\n    content = \"BAS\"\n}\n```\n\n```\ndef text a {\n    content = \"BAS\"\n    duration = 10s\n}\n```\n\n```\ndef text a {\n    content = \"BAS\"\n}\nset a {} 10s\n```\n\n#### 自适应\n\n位置和字号为百分比值时可以根据舞台大小自适应,可以实现各个平台、不同播放器大小时弹幕的一致性效果,使弹幕在不同情况下相对于视频的位置和大小是固定的,位置坐标为当前舞台宽高 _ 百分比值 px,字号为当前舞台宽度 _ 百分比值 px。\n\n```\ndef text c {\n    content = \"BAS\"\n    x = 50%\n    y = 50%\n    anchorX = 0.5\n    anchorY = 0.5\n    fontSize = 5%\n}\n```\n\n这时候改变播放器大小,弹幕大小也会跟随播放器改变,结果是它相对于视频的位置和大小是固定的。\n\n#### 交互\n\n目前只有交互按钮支持一些简单的点击效果,转跳到视频某个时间点、新窗口打开其他视频等。\n\nseek 按钮:\n\n```\ndef button c {\n    text = \"跳转到30分钟\"\n    x = 35%\n    y = 45%\n    fontSize = 5%\n    textColor = 0xffffff\n    fillColor = 0x80D8FF\n    target = seek {\n        time = 30m\n    }\n}\n```\n\nav 跳转按钮:\n\n```\ndef button c {\n    text = \"av1714157\"\n    x = 35%\n    y = 45%\n    fontSize = 5%\n    textColor = 0xffffff\n    fillColor = 0x80D8FF\n    duration = 2s\n    target = av {\n        av = 1714157\n        page = 1\n        time = 20.5s500ms\n    }\n}\n```\n\nbangumi 跳转按钮:\n\n```\ndef button c {\n    text = \"第22话 春风\"\n    x = 35%\n    y = 45%\n    fontSize = 5%\n    textColor = 0xffffff\n    fillColor = 0x80D8FF\n    duration = 2s\n    target = bangumi {\n        seasonId = 1699\n        episodeId = 8004
3181\n        time = 1m30s\n    }\n}\n```\n\n#### 图形\n\n可以使用 path 对象绘制 svg 图形,d 属性对应 svg 的路径。\n\n```\ndef path p {\n    d = \"M30.828,30.422 18.997,16.260 Z\"\n    viewBox=\"0 0 32 34\"\n    x = 45%\n    y = 45%\n    scale = 3\n    borderWidth = 1\n    borderColor = 0xffffff\n    borderAlpha = 0.8\n    fillColor = 0x00a1d6\n    fillAlpha = 0.8\n}\n```\n\n#### 动画\n\n动画分为简单动画、串联动画、并联动画。\n\n弹幕的属性有可渐变、不可渐变、不可变之分,只有可渐变属性才有正常的动画效果,对非渐变属性设置新值会立即生效,对不可变的属性设值将被忽略。原则上某一属性在一个 set 语句中最多只能出现一次,在实现上,如果多次出现,以最后一次为准。\n\n串联动画以先后顺序运行。\n\n```\ndef text a {\n  content = \"BAS\"\n}\nset a {\n    color = 0x000000\n} 1s\nthen set a {\n    alpha = 0\n} 1s\n```\n\n并联动画同时进行,并联相同属性时,以最后一次为准,之前冲突的动画会被忽略,由于技术限制,x y rotateX rotateY rotateZ scale 视为相同属性。\n\n```\ndef text a {\n  content = \"BAS\"\n}\nset a {\n    color = 0x000000\n}
318 1s\nset a {\n    alpha = 0\n} 1s\n```\n\n## BAS 弹幕的前端实现\n\n从 BAS 脚本到渲染在浏览器的 DOM 元素主要有以下步骤:\n\n1. 将 BAS 脚本解析成 js 对象([https://github.com/aristotle9/as3cc](https://github.com/aristotle9/as3cc))\n2. 应用默认值、计算百分比值\n3. 监控生命周期\n4. 解决属性冲突\n5. 绘制元素、应用样式和动画\n6. 绑定交互事件\n\n### 定位\n\n定位由 BAS 脚本的锚点(anchorX anchorY)和位置(x y)共同决定,实现上使用两个嵌套的 DOM 元素,外部元素定位舞台位置,内部元素定位弹幕锚点,比如一个居中的文本对象:\n\n```\ndef text c {\n    content = \"BAS\"\n    x = 50%\n    y = 50%\n    anchorX = 0.5\n    anchorY = 0.5\n}\n```\n\n渲染出的 DOM 结构大概是这样:\n\n```html\n<div style=\"transform:translate((舞台宽度*50%)px, (舞台高度*50%)px);\">\n  <div style=\"transform:translate(-50%,-50%);\">BAS弹幕</div>\n</div>\n```\n\n### 动画\n\n动画上考虑到浏览器兼容性和易用性,CSS3 的 animation 是最佳的选择,其中涉及属性有:\n\n| 属性                      | 描述                       |\n| :------------------------ | -------------------------- |\n| @keyframes                | 定义动画                   |\n| animation-name            | 对应 @keyframes 动画的名称 |\n| animation-duration        | 动画完成一个周期的时间     |\n| animation-play-state      | 动画运行或者暂停           |\n| animation-timing-function | 动画的速度曲线             |\n\n#### 简单动画\n\n沿用上面的例子:\n\n```\ndef text demo {\n    content = \"BAS\"\n}
318\nset demo {\n    alpha = 0\n} 5s\n```\n\n这样一条 BAS 脚本渲染出的 DOM 结构大概是这样:\n\n```html\n<style>\n  @keyframes a1 {\n    100% {\n      opacity: 0;\n    }\n  }\n</style>\n<div style=\"animation-name:a1;animation-duration:5s;opacity:1;\">BAS</div>\n```\n\nkeyframes 定义动画关键帧,动画结束时透明度为零;animation-duration 对应动画的时间 5s。\n\n#### 并联动画\n\n定义多个keyframes实现多个动画同时运行。\n\n```\ndef text a {\n    content = \"BAS\"\n}\nset a {\n    color = 0x000000\n} 1s\nset a {\n    alpha = 0\n} 1s\n```\n\n```html\n<style>\n  @keyframes a1 {\n    100% {\n      color: #000000;\n    }\n  }\n  @keyframes a2 {\n    100% {\n      opacity: 0;\n    }\n  }\n</style>\n<div\n  style=\"animation-name:a1,a2;animation-duration:1s,1s;opacity:1;color:#ffffff;\"\n>\n  BAS\n</div>\n```\n\n#### 串联动画\n\n使用 animation-delay 错开不同动画开始的时间,实现串联的效果。\n\n```\ndef text a {\n  content = \"BAS\"\n}\nset a {\n    color = 0x000000\n}
318 1s\nthen set a {\n    alpha = 0\n} 1s\n```\n\n```html\n<style>\n  @keyframes a1 {\n    100% {\n      color: #000000;\n    }\n  }\n  @keyframes a2 {\n    0% {\n      color: #000000;\n    }\n    100% {\n      color: #000000;\n      opacity: 0;\n    }\n  }\n</style>\n<div\n  style=\"animation-name:a1,a2;animation-duration:1s,1s;animation-delay:0s,1s;opacity:1;color:#ffffff;\"\n>\n  BAS\n</div>\n```\n\n### 状态控制\n\n#### 开始\n\nanimation-play-state: running\n\n#### 暂停\n\nanimation-play-state: paused\n\n#### 中间状态\n\n设置 animation-delay 为负值就可以实现从某个中间状态开始动画。\n\n比如弹幕的生命周期对应视频的 1s 到 5s,视频跳转到 4s 时,需要设置弹幕 animation-delay 属性为 -1s。\n\n#### 结束\n\n生命周期结束需要及时清除元素,原理是 animation 动画结束会触发 animationend 事件,该事件触发时清除掉元素即可。元素没有动画时需要指定一个空动画。\n\n```html\n<style>\n  @keyframes a1 {\n    100% {\n    }\n  }\n</style>\n```\n\nEnd."},{"slug":"best-players-in-hexo","title":"可能是目前最好用的两个 Hexo 播放器插件","tags":[],"body":"我实在也不是谦虚,这~~可能~~是目前最好用的两个 Hexo 播放器插件,感谢插件作者(给大佬们递女装\n本文只作为演示,使用方法和 issue 请移步 GitHub\n\n<!--more-->\n\n```sh\nnpm install hexo-tag-aplayer --save\n```\n\nHexo 的 [APlayer](https://github.com/MoePlayer/APlayer) 标签插件,由 [@grzhan](https://github.com/grzhan) 维护\n\n{% raw %}\n\n<div class=\"aplayer\" id=\"aplayer1\"></div>\n
318<script>\n$(function () {\n    var ap = new APlayer({\n        element: document.getElementById('aplayer1'),\n        showlrc: 3,\n        theme: '#ad7a86',\n        music: [\n            {\n                title: 'あっちゅ~ま青春!',\n                author: '七森中☆ごらく部',\n                url: 'https://cdn1.diygod.me/yuruyuri.mp3',\n                pic: 'https://cdn1.diygod.me/yuruyuri.jpg',\n                lrc: 'https://cdn1.diygod.me/yuruyuri.lrc'\n            },\n            {\n                title: 'secret base~君がくれたもの~',\n                author: '茅野愛衣',\n                url: 'https://cdn1.diygod.me/secretbase.mp3',\n                pic: 'https://cdn1.diygod.me/secretbase.jpg',\n                lrc: 'https://cdn1.diygod.me/secretbase.lrc'\n            },\n            {\n                title: '回レ!雪月花',\n                author: '小倉唯',\n                url: 'https://cdn1.diygod.me/snowmoonflowers.mp3',\n                pic: 'https://cdn1.diygod.me/snowmoonflowers.jpg',\n                lrc: 'https://cdn1.diygod.me/snowmoonflowers.lrc'\n            }\n        ]\n    });\n    window.aplayers || (window.aplayers = []);\n    window.aplayers.push(ap);\n});\n<\/script>\n{% endraw %}\n\n```sh\nnpm install hexo-tag-dplayer --save\n```\n\nHexo 的 [DPlayer](https://github.com/MoePlayer/DPlayer) 标签插件,由 [@Myer921](https://github.com/Myer921) [@dixyes](https://github.com/dixyes) 维护\n\n{% raw %}\n\n<div class=\"dplayer\" id=\"dplayer1\"></div>\n
318<script>\n$(function () {\n    var dp = new DPlayer({\n        container: document.getElementById('dplayer1'),\n        video:{\n            url: 'https://cdn1.diygod.me/hikarunara.mp4',\n            pic: 'https://cdn1.diygod.me/hikarunara.png',\n            thumbnails: 'https://cdn1.diygod.me/hikarunara_thumbnails.jpg'\n        },\n        danmaku:{\n            id: 'diygodme1',\n            api: 'https://api.diygod.me/dplayer/'\n        }\n    });\n    window.dplayers || (window.dplayers = []);\n    window.dplayers.push(dp);\n});\n<\/script>\n{% endraw %}"},{"slug":"new-blog","title":"做了一点微小的改动","tags":[],"body":"新的开始,只做了一点微小的改动\n\n### 域名\n\n从 www.anotherhome.net 换成了 diygod.me\nanotherhome.net 起源于高中比较喜欢的一部番《Another》,年代有些久远,现在剧情都已经记不清了\n\n<!--more-->\n\n### 博客程序\n\n从 WordPress 换到了 Hexo\nHexo 是基于 Node.js 的静态博客框架,作为一名不会 php 的弱鸡前端,还是 Hexo 用起来更方便\n现在博客托管在 GitHub,用又拍云作 CDN,不用再自己维护服务器了\n\n### 主题\n\n样式基本保持了一致\n基于 [Next](https://github.com/iissnan/hexo-theme-next) 重构了之前使用的 WordPress 主题,取名 [Sagiri](https://github.com/DIYgod/hexo-theme-sagiri),我的主题跟纱雾一样可爱\n除了更可爱,又在原主题基础上加了使用 Webpack 打包 js 的改进和 pjax 的处理\n\n主题虽然开源了,但是属于自用性质的项目,很多应该做成可定制化的地方都没有做,从开源项目的视角来看做得并不好,而我目前又对制作主题并没有太高的兴致,所以使用之前还请慎重考虑\n\n### 博客名\n\n既然域名都换了,博客名就也从 Anotherhome 换成了 Hi, DIYgod\n\n### 评论\n\n没了 WordPress 的原生评论,这个还是挺头疼的,纠结了很久最后选了 disqus,然后把之前的评论都迁移过来了\n想要正常使用需要针对 disq.us | disquscdn.com | disqus.com 启用代理\n\n### 文章\n\n很多老文章已经失去了意义,就删了一大半\n\n### 友链\n\n需要重新申请\n希望先友后链,原则上不再接受不太熟悉的人\n\n### 旧存档\n\nhttps://archive.anotherhome.net\n存档关闭了所有评论,可能会随时挂掉"},{"slug":"hello-world","title":"Hello World","tags":[],"body":"Welcome to [Hexo](https://hexo.io/)! This is your very first post. Check [documentation](https://hexo.io/docs/) for more info. If you get any problems when using Hexo, you can find the answer in [troubleshooting](https://hexo.io/docs/troubleshooting.html) or you can ask me on [GitHub](https://github.com/hexojs/hexo/issues).\n\n## Quick Start\n\n### Create a new post\n\n```bash\n$ hexo new \"My New Post\"\n```\n\nMore info: [Writing](https://hexo.io/docs/writing.html)\n\n<!--more-->\n\n### Run server\n\n```bash\n$ hexo server\n```\n\nMore info: [Server](https://hexo.io/docs/server.html)\n\n### Generate static files\n\n```bash\n$ hexo generate\n```\n\nMore info: [Generating](https://hexo.io/docs/generating.html)\n\n### Deploy to remote sites\n\n```bash\n$ hexo deploy\n```\n\nMore info: [Deployment](https://hexo.io/docs/deployment.html)"},{"slug":"3264","title":"bilibili2RSS — 使用 RSS 订阅 bilibili up主和番剧","tags":[],"body":"作为一种过气技术,提供 RSS 订阅源的网站越来越少,每个网站都想把用户尽可能长时间地绑在自己那里,而 RSS 可能会造成负面效果\n\n但在这个内容爆炸时代,只要意识到了「我被信息所绑架」这个问题后,用户自然会想要一种更高级的聚合信息和动态更新解决方案,比如 RSS\n\n这里提供了使用 RSS 订阅 bilibili up主和番剧的解决方案\n\n订阅up主:[https://api.prprpr.me/bilibili2rss/user/6997378](https://api.prprpr.me/bilibili2rss/user/6997378)\n\n订阅番剧:[https://api.prprpr.me/bilibili2rss/bangumi/6446](https://api.prprpr.me/bilibili2rss/bangumi/6446)\n\n订阅分区:[https://api.prprpr.me/bilibili2rss/partion/33](https://api.prprpr.me/bilibili2rss/partion/33)\n\n项目名叫 bilibili2RSS,开源在 [GitHub](https://github.com/DIYgod/bilibili2RSS)\n\n另外可以使用相关项目 [Weibo2RSS](https://github.com/DIYgod/Weibo2RSS) 订阅喜欢的微博博主\n\nEnjoy!"},{"slug":"3207","title":"我们走过的","tags":[],"body":"<style>\n    #love-map {\n        width: 100%;\n    }\n\n    #love-time {\n        text-align: center;\n        margin-bottom: 20px;\n        font-size: 14px;\n        color: #EF9A9A;\n        display: none;\n    }\n</style>\n\n<div id=\"love-time\">这是我们共同度过的第<span></span></div>\n<div id=\"love-map\"></div>\n\n上面是一些我们一起去过的地方,其中有一个地点标的是 1996 年,这并不是我写错了,那年我 1 岁,我们是邻居,遗憾的是我们对那几年都没有任何记忆了<!--more-->\n\n&nbsp;\n\n之后一晃 13 年,刚上高中,我家搬到了高中旁边的一个小区,一天晚上我妈兴奋地跟我说:你猜我晚上散步遇到了谁?\n\n我肯定是猜不出来的,因为我什么都不记得\n\n再后来发现她跟我一个班,就这样故事继续了\n\n那时候每天放学一起回家,关系很亲密,家长老师都很紧张,以为我们在早恋,但我一直在沉迷学习,实际上什么都没发生,放学路上聊的最多的也是功课,现在想起来甚至有些遗憾\n\n&nbsp;\n\n但有趣的灵魂终会相遇,5 年以后,这个人又被我诱骗成了女票,我们的故事还会继续下去\n\n&nbsp;\n\n回想一下,这些情节居然跟你的名字有一些神似\n\n(是不会放照片的,长相和性格可以脑补扎着单马尾的岁纳京子\n\n
318<script>\n    $('#love-time').show();\n    function love_time() {\n        window.setTimeout(function () {\n            love_time();\n        }, 1000);\n        var BirthDay = new Date(\"5/11/2017 00:00:00\");\n        var today = new Date();\n        var timeold = (today.getTime() - BirthDay.getTime());\n        var msPerDay = 24 * 60 * 60 * 1000;\n        var e_daysold = timeold / msPerDay;\n        var daysold = Math.floor(e_daysold);\n        var e_hrsold = (e_daysold - daysold) * 24;\n        var hrsold = Math.floor(e_hrsold);\n        var e_minsold = (e_hrsold - hrsold) * 60;\n        var minsold = Math.floor((e_hrsold - hrsold) * 60);\n        var seconds = Math.floor((e_minsold - minsold) * 60);\n        $('#love-time span').html(daysold + \"天\" + hrsold + \"小时\" + minsold + \"分\" + seconds + \"秒\");\n    }\n    love_time();\n    function myEcharts() {\n        $('#love-map').height($('#love-map').width() * 0.8)\n        var myChart = echarts.init(document.getElementById(\"love-map\"));\n        var app = {};\n        option = null;\n        var data = [\n                {name: '临沂', value: '1996'},\n                {name: '武汉', value: '2015.12'},\n                {name: '杭州', value: '2017.01'},\n                {name: '上海', value: '2017.02'},\n                {name: '昆明', value: '2017.05'},\n                {name: '大理', value: '2017.05'},\n                {name: '济南', value: '2017.05'},\n                {name: '南京', value: '2020.10'}\n        ];\n        var geoCoordMap = {\n            '临沂':[118.35,35.05],\n            '武汉':[114.31,30.52],\n            '杭州':[120.19,30.26],\n            '上海':[121.48,31.22],\n            '昆明':[102.73,25.04],\n            '大理':[100.225668,25.589449],\n            '济南':[117,36.65],\n            '南京':[118.78,32.04]\n        };
318\n        var convertData = function (data) {\n            var res = [];\n            for (var i = 0; i < data.length; i++) {\n                var geoCoord = geoCoordMap[data[i].name];\n                if (geoCoord) {\n                    res.push({\n                        name: data[i].name,\n                        value: geoCoord.concat(data[i].value)\n                    });\n                }\n            }\n            return res;\n        };\n        option = {\n            backgroundColor: '#A7B1CA',\n            geo: {\n                map: 'china',\n                label: {\n                    emphasis: {\n                        show: false\n                    }\n                },\n                roam: false,\n                itemStyle: {\n                    normal: {\n                        areaColor: '#fff',\n                        borderColor: '#C9CED9'\n                    },\n                    emphasis: {\n                        areaColor: '#DFE0E3'\n                    }\n                }\n            },\n            tooltip: {\n                trigger: 'item',\n                formatter: function (params) {\n                    return params.name + ' - ' + params.value[2];\n                }\n            },\n            series : [\n                {\n                    type: 'effectScatter',\n                    coordinateSystem: 'geo',\n                    data: convertData(data),\n                    symbolSize: 8,\n                    showEffectOn: 'render',\n                    rippleEffect: {\n                        brushType: 'stroke'\n                    },\n                    hoverAnimation: true,\n                    label: {\n                        normal: {\n                            formatter: '{b}',\n                            position: 'right',\n                            fontSize: 14,\n                            show: true\n                        }\n                    },\n                    itemStyle: {\n                        normal: {\n                            color: '#FD8888',\n                            // shadowBlur: 10,\n                            // shadowColor: '#333'\n                        }\n                    }\n                }\n            ]\n        };\n        myChart.setOption(option, true);\n    }\n    if (!window.echarts) {\n        $.getScript('https://cdn.bootcss.com/echarts/3.8.5/echarts.min.js', function () {\n            $.getScript('https://cdn.jsdelivr.net/npm/[email protected]/map/js/china.js', function () {\n                myEcharts();\n            });\n        });\n    }\n    else {\n        myEcharts();\n    }\n<\/script>"},{"slug":"3116","title":"让咕咕机再次伟大","tags":[],"body":"<style>\n    .gugu-print {\n        display: none;\n        margin-top: 20px;\n    }\n    .gugu-btn {\n        cursor: pointer;\n        border: 1px solid #eee;\n        display: inline-block;\n        padding: 5px 10px;\n        background: #fff;\n        border-radius: 4px;\n    }\n    .gugu-login-btn-wrap {\n        text-align: center;\n    }\n    .gugu-login-btn {\n        cursor: pointer;\n    }\n    .gugu-user {\n        display: none;\n        text-align: center;\n    }\n    .gugu-avatar {\n        display: inline-block;\n        height: 50px;\n        width: 50px;\n        background-size: contain;\n        border-radius: 50%;\n    }\n    .gugu-info {\n        padding-top: 25px;\n        font-weight: bold;\n        line-height: 25px;\n    }\n    .gugu-name {\n        font-size: 18px;\n    }\n    .gugu-textarea {\n        width: 100%;\n        height: 100px;\n        font-size: 14px;\n        padding: 10px;\n        box-sizing: border-box;\n    }\n    .gugu-input {\n        width: 100%;\n        font-size: 14px;\n        padding: 10px;\n        box-sizing: border-box;\n    }\n</style>\n\n咕咕机的官方发送平台非常反人类,发送接口没有任何长度和频率限制,又可以匿名发送...所以经常被人刷垃圾信息...群里经常有人反馈但官方就是不改...好在咕咕机是开发接口的\n\n就这样我封装了一个增强ç‰
318ˆ API,开源在 GitHub: [https://github.com/DIYgod/gugu-node-api](https://github.com/DIYgod/gugu-node-api)\n\n特性:强制微博登录、不允许匿名、长度限制、发送频率限制、跨域限制、黑名单机制\n\n好了,点击下面按钮,登录后继续跟我表白吧!\n\n<div class=\"gugu-login-btn-wrap\"><img class=\"no-fancybox gugu-login-btn\" src=\"./attachments/bafkreigpucjepfxkw4valfdlbgedeu6qu6voe4s2sq5paahldwxby3bg3y.png\"></div>\n<div class=\"gugu-user\">\n    <div class=\"gugu-info\">\n        <div class=\"gugu-avatar\"></div>\n        <div class=\"gugu-name\"></div>\n    </div>\n    <div class=\"gugu-btn gugu-logout-btn\">退出登录</div>\n</div>\n<div class=\"gugu-print\">\n    <textarea class=\"gugu-textarea\" placeholder=\"输入文本内容\"></textarea>\n    <div class=\"gugu-btn gugu-send-btn-text\">咕咕文字</div>\n    <input type=\"text\" class=\"gugu-input\" placeholder=\"输入图片地址\">\n    <div class=\"gugu-btn gugu-send-btn-pic\">咕咕图片</div>\n</div>\n
318<script>\nfunction gugushow (data) {\n    $.ajax({\n        url: 'https://api.anotherhome.net/gugu/account',\n        xhrFields: {\n            withCredentials: true\n        },\n        success: function (data) {\n            if (data) {\n                $('.gugu-avatar').css('background-image', 'url(' + data._json.avatar_large.replace('http', 'https') + ')');\n                $('.gugu-name').html('Hi, ' + data.displayName);\n                $('.gugu-user').show();\n                $('.gugu-print').show();\n                $('.gugu-login-btn-wrap').hide();\n            }\n        }\n    });\n}\ngugushow();\n$('.gugu-login-btn').click(function () {\n    window.location.href = 'https://api.anotherhome.net/gugu/login';\n});\n$('.gugu-logout-btn').click(function () {\n    window.location.href = 'https://api.anotherhome.net/gugu/logout';\n});\n$('.gugu-send-btn-text').click(function () {\n    if ($('.gugu-textarea').val()) {\n    $.ajax({\n        url: 'https://api.anotherhome.net/gugu/print',\n        type: 'post',\n        data: JSON.stringify({\n            type: '1',\n            content: $('.gugu-textarea').val()\n        }),\n        xhrFields: {\n            withCredentials: true\n        }
318,\n        success: function (data) {\n            if (data) {\n                if (data.code && data.msg) {\n                    notie('error', data.msg);\n                }\n                else if (data.msg) {\n                    notie('success', data.msg);\n                }\n                else {\n                    notie('error', '打印失败');\n                }\n            }\n            else {\n                notie('error', '打印失败');\n            }\n        },\n        error: function () {\n            notie('error', '打印失败');\n        }\n    });\n    }\n});\n$('.gugu-send-btn-pic').click(function () {\n    $.ajax({\n        url: 'https://api.anotherhome.net/gugu/print',\n        type: 'post',\n        data: JSON.stringify({\n            type: '2',\n            content: $('.gugu-input').val()\n        }),\n        xhrFields: {\n            withCredentials: true\n        },\n        success: function (data) {\n            if (data) {\n                if (data.code && data.msg) {\n                    notie('error', data.msg);\n                }\n                else if (data.msg) {\n                    notie('success', data.msg);\n                }\n                else {\n                    notie('error', '打印失败');\n                }\n            }\n            else {\n                notie('error', '打印失败');\n            }\n        },\n        error: function () {\n            notie('error', '打印失败');\n        }\n    });\n});\n<\/script>"},{"slug":"2978","title":"现在可以给网红写小纸条表白了!","tags":[],"body":"最近跟我表白的人太多了,所以我买了一个[咕咕机](http://www.memobird.cn),现在访问 [让咕咕机再次伟大](/make-gugu-great-again) 就可以很方便地写小纸条跟我表白了。\n\n比如\n\n![gugu1](./attachments/bafkreigifezih7ru5qmafxzi7viyqnc526old5ztm4abqdrmdm2wpd7iiy.jpeg)\n\n就像小时候偷偷在课桌间传递的小纸条一样温暖。\n\n&nbsp;\n\n除此之外,咕咕机还可以做很多有趣的事情:[MEMOBIRD 咕咕机有哪些有趣的玩法?](https://www.zhihu.com/question/39529878)\n\n再加上咕咕机是[开放API](http://open.memobird.cn/)的,又可以连接 [IFTTT](https://ifttt.com/),对一个开发者来说可以做的事情就更多了,比如配合 [Weibo2RSS](https://github.com/DIYgod/Weibo2RSS) 和 IFTTT 还可以用来实时打印喜欢的小姐姐新发的微博。\n\n&nbsp;\n\n今年的送明信片活动也打算用这个来报名,诶嘿嘿。\n\n[hermit autoplay=\"false\" mode=\"circulation\"]netease_songlist#:28445467[/hermit]\n\n以下(给我打印宪法)是错误的用法:\n\n![gugu2](./attachments/bafkreid2d4ll33x5rwxivfoxjx6wmtcp3e65vgoa27iarwhm6vshqgrvzq.jpeg)"},{"slug":"2954","title":"Service Workers 实现网站加速和离线缓存","tags":[],"body":"最近看到了 Service Workers 这个东西,它可以根据配置为用户缓存网站静态与动态资源:截获用户的所有网络请求,根据缓存配置来决定是从缓存还是网络获取相应资源,从而可以极大提高网页的加载速度。优点有可定制性高、不需要服务端支持、效果显著。\n\n最后的效果就是当你第二次访问我的网站时只会加载大约80k 的资源(除去 AdSense 的情况下),这其中包括了所有图片和音频视频,这 80k 主要是 HTML 和我使用的 [DPlayer](https://github.com/DIYgod/DPlayer) 的 API。\n\n![sw4](./attachments/bafkreid7vp7iprbacehxdgzbpupfoxakjroehwfmkcixvyd56wylyq6ocy.jpeg)\n\n![](./attachments/sw4.jpg.html)\n\n甚至可以在断开网络时访问(剪断网线试试吧):\n\n![sw2](./attachments/bafkreibe4zvtcvx3pfcatso7txjtop3sqgcvia5lbquplf73j2ym5efslq.jpeg)\n\n<!--more-->当然局限性也是有的:\n\n只支持 HTTPS,因为可以截获用户的网络请求,需要在一个安全的环境。\n\n兼容性不太好,[点击查看兼容性报告](http://caniuse.com/#search=service%20worker),目前只有 Chrome Firefox Opera 和部分 Android 浏览器 支持。\n\n![sw3](./attachments/bafkreiaaw5w7gshvjl2hffvgavn7nje7myswrxxncz4e6j4q5olby6uapy.jpeg)\n\n使用方法网上有很多教程,这里不赘述了,推荐这几篇吧:\n\n[使用service worker+sw-precache实现网站加速](https://metaquant.org/service%20worker-web%20performance-cache.html)\n\n[使用Service worker实现加速/离线访问静态blog网站](https://yangbo.tech/2017/01/15/2017-01-15-speedy-and-offline-site-by-service-worker/)\n\n[Service Workers 与离ç
318º¿ç¼“å­˜](https://segmentfault.com/a/1190000008491458)"},{"slug":"2939","title":"一只叫酸奶的喵","tags":[],"body":"酸奶是我家新招的猫女仆,她有一个博客:[https://suannai.cat](https://suannai.cat/)\n\n![suannai](./attachments/bafkreibdoc23hzsbypzb7o46edp7kvsr3tmdpjjyolzszdn73ixopabg6a.png)\n\nQ: 你是谁?\nA: 我是酸奶,来自喵星,是个可爱的女孩子,我的铲屎官是 DIYgod,对他好点,他是我罩的。\n\nQ: 你的身世是怎样的?\nA: 我还有6个兄弟姐妹,有一个姐姐([蛋糕](http://blog.zanyuyu.com/tags/%E7%8C%AB/))在[赞鱼鱼](http://weibo.com/zanyuyu)家;2017 å¹´ 2 月 23 日起正式雇佣 DIYgod 为我的铲屎官。\n\nQ: 你多大了?\nA: 50多天了,所以不要把我当一个月的小屁喵看待了。\n\nQ: 你是什么品种的?\nA: 美短,加白,非纯种。\n\nQ: 你最喜欢什么?\nA: 吃肉。"},{"slug":"2920","title":"女朋友的微博情绪监控","tags":[],"body":"![weibo-negative](./attachments/bafkreiakbgc7a6vrlcuvr2ol4j2qn55nbyojp5kx5xm7yzttjemsmztvfi.jpeg)\n\n就是这样,代码写好了,就差个女朋友了。\n\n最后的效果就是检测某一微博博主新发的微博,如果判断为消极情绪就发出警告(手机通知、邮件通知、自动发一条上图那样的微博之类的)。\n\n## 项目地址\n\n[https://github.com/DIYgod/Weibo2RSS](https://github.com/DIYgod/Weibo2RSS) 以 RSS 形式输出消极情绪的微博\n\n[https://github.com/DIYgod/Text2Emotion](https://github.com/DIYgod/Text2Emotion) 分析一å
318¥è¯çš„æƒ…绪值<!--more-->\n\n## 使用方法\n\n消极情绪微博 RSS 配合 IFTTT 使用,具体设置如下图,条件是 RSS 出现新内容,行为是发一条微博通知(也可以改成手机通知或者邮件通知等)。\n\n![negtivewbifttt](./attachments/bafkreihaf5pype6555bus5pa4guhjuxv2g5vqkecii36bi2rwsrt2wvviq.png)\n\n&nbsp;\n\n## 开发过程\n\n下面是我的开发过程。\n\n### 一、分词\n\n这东西自己做不来,所以只好找现成的解决方案,找到了下面几个:\n\n[结巴中文分词](https://github.com/fxsjy/jieba)\n\n[哈工大语言技术平台云](http://www.ltp-cloud.com/)\n\n[新浪云中文分词](http://www.sinacloud.com/doc/sae/python/segment.html)\n\n[讯飞语言云](https://www.xfyun.cn/services/ltp)\n\n[腾讯文智](https://www.qcloud.com/document/product/271)\n\n除了腾讯文智其他都是免费或者开源的,简单比较之后选择了锤子 Big Bang 也在用的讯飞。\n\n### 二、情绪分析\n\n这个关键在于词典,也是找现成的:\n\n[中文情感极性词典 NTUSD](http://www.datatang.com/data/44317)\n\n[大连理工情感词汇本体库](http://大连理工情感词汇本体库)\n\n大连理工的本体库标注了超过两万词语,包括这些词语词性种类、情感类别、情感强度及极性等信息,像下面这样:\n\n![dllgemotion](./attachments/bafkreifvkb5aqdvti7ib6jmknwu7sxpc7uvtsrys46puno2qpncubdwy74.png)\n\n看起来很不错,就选择了这个。\n\n词典下载下来是一个 excel 表格,把它先另存为成 csv 格式,然后就可以导入到 mongodb 数据库里了。\n\n```sh\nmongoimport -d emotion -c emo --type csv --headerline --file emotion.csv\n```\n\n### 三、情绪值计算\n\n把要分析的话进行分词处理,再把每个词语的情绪值进行累加,就可以得出一条微博的情绪值。\n\n这里其实还有很多算法工作可以做,但简单起见,我只是进行了累加。\n\n然后写完发现效果很差,原因是词典内容太少,很多词语都没有,所以很多句子根本判断不出来。\n\n&nbsp;\n\n最后废弃了上面的所有东西,直接使用腾讯文智的收费服务。。。\n\n### 四、应用到微博\n\n抓取微博内容的原理很简单,新浪微博的[微博秀](http://service.weibo.com/widget/widget_blog.php?uid=3306934123)是不需要登录就可以访问的,直接使用 Node.js 解析页面就可以拿到微博内容。\n\n然后对微博内容进行情绪值计算,把消极情绪的微博输出成 RSS。\n\n### 五、监控\n\n输出成 RSS,监控也容易了,其中 [IFTTT](https://ifttt.com) 效果最佳,检测到 RSS 有新内容时,可以触发手机通知、邮件通知、发一条微博等行为。\n\n&nbsp;\n\n以上,其实最大的问题还是:我差个女朋友。"},{"slug":"2837","title":"Weibo2RSS — 使用 RSS 订阅喜欢的微博博主","tags":[],"body":"使用 RSS 订阅喜欢的微博博主(比如我)吧~\n\nDemo:[https://api.prprpr.me/weibo/rss/3306934123](https://api.prprpr.me/weibo/rss/3306934123)\n\nRSS 格式输出一个微博博主最新的 15 条微博,可以使用 RSS 阅读器来获取及时推送,配合 [IFTTT](https://ifttt.com/) 还可以实现更多好玩的功能。\n\n原理:新浪微博的[微博秀](http://service.weibo.com/widget/widget_blog.php?uid=3306934123)是不需要登录就可以访问的,使用 Node.js 解析页面,然后输出 RSS 格式。\n\n使用及搭建方法:见 [GitHub](https://github.com/DIYgod/Weibo2RSS)。"},{"slug":"2805","title":"微小微直播回放的 DPlayer 实现","tags":[],"body":"以下为10月19日[微小微](http://weibo.com/u/2025479687)在[一直播](http://m.yizhibo.com/l/n6VHhuJoCbMf41Nx.html)的直播回放(迷妹脸,弹幕也成功扒下来转成 [DPlayer](https://github.com/DIYgod/DPlayer) 可以识别的格式啦。\n\n视频有时出现卡顿是直播的原因;弹幕总计 15768 条、弹幕文件 1.7 MB,第一条弹幕在 13 秒出现。\n\n一直播弹幕池与 DPlayer 弹幕池互不影响,也可以在下面发弹幕哟。\n\n<!--more-->\n\n<style>\n.dplayer-time {\n    display: inline-block !important;\n}\n</style>\n\n<div class=\"dplayer\" id=\"dplayer4\"></div>\n\n&nbsp;\n\n## 视频及弹幕搬运\n\n直播第二天发现一直播有昨天的回放,开心到晕掉,醒过来之后开始想办法下载视频和弹幕。\n\n### 视频\n\n网上找不到下载一直播视频的工具,只好自己动手,浏览器开发者工具看到页面加载了一个 m3u8 文件,然后就是下载 m3u8 文件里的 354 个视频片段就好了。\n\n写了个 shell 脚本批量下载:\n\n```sh\n#!/bin/bash\nfor k in $( seq 1 354 )\ndo\n   wget http://xxx/${k}.ts\ndone\n```\n\nDPlayer 早就做了对 m3u8 格式的支持,不用对视频片段做任何后续处理。\n\n视频下载完成。\n\n### 弹幕\n\n同样用开发者工具抓包,找到弹幕文件请求的规律。\n\n第一个弹幕片段是 http://xxx?ts=1 ,其他的弹幕片段也只有ts参数不同。然后ts参数的规律是这样的:下一个片段的参数是上一个片段返回值里的最后一个ts值。\n\n知道规律后就写了个 js 脚本来下载弹幕和把弹幕转换成 DPlayer 的格式。\n\n```js\nfunction ajaxDan(ts) {\n  $.ajax({\n    url: `http://xxx?ts=${ts}
318`,\n    success: function (data) {\n      var tli = parseInt(data.data.list[data.data.list.length - 1].ts) + 1;\n      console.log(tli);\n      data.data.list.map(function (i) {\n        dan[index] = {\n          author: \"yizhibon\" + i.nickname,\n          time: parseInt(i.ts) / 1000,\n          text: i.content,\n          color: \"#fff\",\n          type: \"right\",\n        };\n        index++;\n      });\n      ajaxDan(tli);\n    },\n  });\n}\nvar dan = [];\nvar index = 0;\najaxDan(1);\n```\n\n运行结果:536 个视频片段,15768 条弹幕\n\n![wxwlive1](./attachments/bafkreiaczasprthfsm7aoojvv7cz6q7choxxtib76i6nae6khmhqlyttny.jpeg)\n\n然后把弹幕对象字符串化,复制到 json 文件里。\n\n完成。\n\n
318<script src=\"https://cdn.bootcss.com/hls.js/0.8.7/hls.min.js\"><\/script>\n
318<script>\n$(function () {\n    function myDPlayer() {\n        var dp4 = new DPlayer({\n            element: document.getElementById('dplayer4'),\n            autoplay: true,\n            theme: '#FADFA3',\n            loop: true,\n            screenshot: true,\n            video: {\n                url: 'https://cdn1.diygod.me/wxwlive/1019/index.m3u8',\n                pic: 'https://cdn1.diygod.me/wxwlive/1019/poster.png'\n            },\n            danmaku: {\n                id: '02d53ea190dc8583',\n                api: 'https://api.diygod.me/dplayer/',\n                token: 'tokendemo',\n                maximum: 3000,\n                addition: ['https://cdn1.diygod.me/wxwlive/1019/danmaku.json']\n            }\n        });\n        window.dplayers || (window.dplayers = []);\n        window.dplayers.push(dp4);\n    }\n    if (!window.Hls) {\n        $.getScript('https://cdn.bootcss.com/hls.js/0.8.7/hls.min.js', function () {\n            myDPlayer();\n        });\n    }\n    else {\n        myDPlayer();\n    }\n});\n<\/script>"},{"slug":"2770","title":"WordPress 反垃圾评论大作战","tags":[],"body":"WordPress 垃圾评论一直是超级多超级烦人的,如果没有有效的拦截方案,网站就会瞬间被每天几百条的垃圾评论淹没。\n\n因为是每个 WordPress 站点都无法避免的问题,大家各显神通,做出的解决方案也挺多的,这里总结一下每种方法的特点和利弊:\n\n### 识别垃圾评论\n\n以 Akismet 插件为代表,根据评论内容或评论者的信息判断评论是否为垃圾评论,再决定是否拦截。开启后能拦截掉几乎所有垃圾评论,但这种方法最大的缺陷是**误判**,本站之前一直在用 Akismet 插件,误判的概率还是挺大的,即使经常去垃圾箱查看,偶尔一条的正常评论和一大堆垃圾评论一起混在垃圾箱也很容易被遗漏;其次会拖慢提交评论的速度,因为每条评论都要先被发到 Akismet 的国外服务器做识别。\n\n&nbsp;\n\n### 禁止非中文评论\n\n90%以上的垃圾评论都来自国外,所以这种方法可以拦截掉90%以上的垃圾评论,但缺点是无法发送纯表情和类似“2333”、“Thanks”这种正常评论了,而且中文的垃圾评论也无法拦截掉。\n\n&nbsp;\n\n### 修改评论 post 地址\n\n这种方法虽然看起来有点自欺欺人,但效果出奇地好,因为绝大部分的垃圾评论都是智障一样只知道通过 post 网站根目录的 wp-comments-post.php 来提交垃圾评论的。稍微麻烦一点的是 WordPress 每次升级都要重新修改。\n\n&nbsp;\n\n### 人工验证插件\n\n比如拖动解锁、拼图、验证码,效果是不错,但牺牲了用户体验,对小站来说没必要。\n\n&nbsp;\n\n### 设置 token\n\n本站现在换用了这种方法,原理是每次刷新页面,后端都会返回一个不同的 token 放到页面上任意位置,然后在合适的时机用 JavaScript 将 token 填充到一个隐藏的 input 里面,提交评论时将隐藏 input 的值(正常情况是 token)一起提交,后端通过判断该值是否合法来判断评论是不是通过正常途径提交的。虽然这种方法也是可以破解的,但破解难度明显高了很多,更重要的是 token 算法和隐藏 input 的结构容易更改,每次简单的小修改都可以让破解失效。\n\n使用也很简单,将如下代码放到主题的 function.php 即可,代码如下:\n\n```php\n$leonax_magic_lower = 328;  // token 最小值,自己随意修改\n$leonax_magic_upper = 3450709;  // token 最大值,自己随意修改\nfunction leonax_anti_spam_form($fields){\n    global $leonax_magic_lower, $leonax_magic_upper;\n    $leonax_magic = mt_rand($leonax_magic_lower, $leonax_magic_upper);  // 放在页面的token值,是一个随机数,每次都不同\n    $fields['leonax_magic'] = &lt;&lt;&lt;EOT\n        &lt;input type=\"hidden\" id=\"leonax-magic\" name=\"leonax-magic\" value=\"0\"&gt;  // 隐藏的 input\n        &lt;script&gt;
318\n            $(function() {\n                $(\"#comment-content\").on(\"keyup\", function() {  // js 检测到触发 keyup、click 或 touch 事件时填充 token\n                    $(\"#leonax-magic\").val(\"$leonax_magic\");\n                });\n                $('body').on('click touch', function () {\n                    $(\"#leonax-magic\").val(\"$leonax_magic\");\n                });\n            })\n        &lt;/script&gt;\nEOT;\n    return $fields;\n}\nadd_filter('comment_form_default_fields', 'leonax_anti_spam_form');\n\nfunction leonax_anit_spam_caught() {\n    wp_die('&lt;strong&gt;评论失败&lt;/strong&gt;: 垃圾评论什么的去死吧!');\n}\n\nfunction leonax_anti_spam_check( $commentdata ) {\n    $comment_type = '';\n    if ( isset($commentdata['comment_type']) ) {\n        $comment_type = trim($commentdata['comment_type']);\n    }\n\n    if ( ($comment_type == 'pingback') || ($comment_type == 'trackback') ) {\n        return $commentdata;\n    }\n    $content = '';\n    if ( isset($commentdata['comment_content']) ) {\n        $content = trim($commentdata['comment_content']);\n    }\n    if (!strlen($content)) {\n        leonax_anit_spam_caught();\n    }\n\n    global $leonax_magic_lower, $leonax_magic_upper;\n\n    if ( isset($commentdata['user_ID']) &amp;&amp; $commentdata['user_ID'] ) { // 登陆用户不做判断\n        return $commentdata;\n    }\n\n    if ( !isset($_POST['leonax-magic']) ) {\n        leonax_anit_spam_caught();\n    }\n    $magic = intval($_POST['leonax-magic']);\n    if ($magic &lt; $leonax_magic_lower || $magic &gt; $leonax_magic_upper) {  // token 值在上面设置的最大值和最小值之间才合法\n        leonax_anit_spam_caught();\n    }\n    return $commentdata;\n}\n\nadd_filter( 'preprocess_comment' , 'leonax_anti_spam_check' );\n```\n\n以上代码来自 [LEONA+](https://leonax.net/p/6732/block-spam-comments-from-web-page/) 和 [JustYY.com](https://justyy.com/archives/1558)。\n\n&nbsp;\n\n目前只找到这几种方法,欢迎补充。"},{"slug":"2648","title":"DPlayer – 最好看的弹幕播放器送给最好看的宫园薰","tags":["新坑"],"body":"<link href=\"https://cdn.bootcss.com/dplayer/1.16.0/DPlayer.min.css\" rel=\"stylesheet\">\n\n<div id=\"dplayer1\" class=\"dplayer\"></div>\n\n最好看的HTML5弹幕播放器送给最好看的宫园薰。\n\nDPlayer来源于我的毕业设计,DPlayer发布后,我的学生生涯也随之结束。<!--more-->\n\n&nbsp;\n\n**Q:**当初为什么要做一个这么好看的弹幕播放器?\n\n**A:**毕业设计选到的题目。\n\n&nbsp;\n\n**Q:**5月底就在GitHub发布了,为什么直到现在(8月底)才发博客?\n\n**A:**刚开始觉得DPlayer还不太完善,不适合用在生产环境,就没写博客。\n\n&nbsp;\n\n**Q:**所以是又经过了3个月的完善才在博客正式发布的么?\n\n**A:**不是,主要是因为我买了守望先锋...\n\n&nbsp;\n\n**Q:**我也很好看,为什么不送给我?\n\n**A:**可以,那同时送给爱我的70亿人类吧。\n\n&nbsp;\n\n\bGitHub:\n\n[https://github.com/DIYgod/DPlayer](https://github.com/DIYgod/DPlayer)\n\nDemo:\n\n[http://dplayer.js.org](http://dplayer.js.org/)\n\n&nbsp;\n\n**Q:**还有什么想说的么?\n\n**A:**差点忘了最重要的事情:我的战网ID **DIYgod#5922**,加我一起屁股开黑呀!\n\n
318<script>\n    var dp1 = new DPlayer({\n        element: document.getElementById('dplayer1'),\n        autoplay: false,\n        theme: '#FADFA3',\n        loop: true,\n        screenshot: false,\n        preload: 'none',\n        video: {\n            url: 'https://cdn1.diygod.me/若能绽放光芒.mp4',\n            pic: 'https://cdn1.diygod.me/若能绽放光芒.png'\n        },\n        danmaku: {\n            id: '9E2E3368B56CDBB4',\n            api: 'https://api.diygod.me/dplayer/',\n            token: 'tokendemo',\n            maximum: 3000\n        }\n    });\n    window.dplayers || (window.dplayers = []);\n    window.dplayers.push(dp);\n<\/script>"},{"slug":"2449","title":"给喜欢明信片的你 — 一年一度的送明信片活动(已完结)","tags":[],"body":"![postcard2](./attachments/bafybeiaiqckme2x5plfrfpewrbse2g75rgki4biauy44p2wjy4cvw2bpfy.jpeg)\n\n### Q: 我为什么要你的明信片?妈妈说不能随便拿陌生人的东西。\n\n**A:** 你有体验过小确幸的感觉吗?\n\n比如在毫无准备的情况下突然收到一张明信片,上面只有一句话:给喜欢明信片的你。\n\n比如在不抱希望的情况下突然收到迟到好久的明信片。\n\n比如在关系尚浅的情况下看到人家写给你满到要溢出来的文字。\n\n这些你感受过吗?\n\n我感受过,就是通过明信片感受的。\n\n<!--more-->\n\n我是一枚明信片爱好者,每去一个地方,第一件事就是买有关当地自然人文的明信片。\n\n![postcard3](./attachments/bafybeidgnpwa665pgmxse2ztwdg2tvxh4vqsy3suk42ikoixhn7plk4ptq.jpeg)\n\n**但这些卡片的价值,远不止是收藏和炫耀那么简单。**\n\n有那么一瞬,我特别希望不在同一地标的你可以亲眼见证我们的情谊,或是感受到一丝来自陌生人的温暖。\n\n有那么一瞬,我特别希望体验一下慢悠悠的生活方式,一封信,一张明信片,也许是寄给某个挂念的人,也许是寄给正在迷茫不安中的异地好友,也许是寄给神奇情境下认识的某个有好感的朋友。\n\n### Q: 我想要,我怎样才能收到你的明信片?\n\n**A:** 这次我一共定制了100多张明信片(见文章头图),<del>目测足够送了,即使真的不够我会再去打印</del>(我反悔了,改成送完为止),所以**理论上**所有(手快的)人都能收到。\n\n~~除了极少数基友我有预留,其他任何人都可以通过[微博私信](http://weibo.com/anotherhome)、QQ、微信、[邮件](mailto:[email protected])、[Telegram](https://telegram.me/DIYgod) 等方式告诉我你的**真实姓名、昵称、地址(住址必须具体到门牌号,学校必须具体到班级)和邮编**,待我确认(方式如下)之后,你就等着明信片一路翻山越岭去找你吧。~~\n\n&nbsp;\n\n### Q: 我怎么知道你看到了我的明信片申请?\n\n**A:** 我会在文章的最后更新确认列表(只写昵称),预计人会很多,所以申请3天后还未看到你的昵称请再次跟我联系。\n\n&nbsp;\n\n### Q: 我什么时候才能收到你的明信片?\n\n**A:** 少则半个月,多则一辈子。\n\n&nbsp;\n\n### Q: 你用什么快递?\n\n**A:** [明信片 - 维基百科](https://zh.wikipedia.org/wiki/%E6%98%8E%E4%BF%A1%E7%89%87)。\n\n&nbsp;\n\n### Q: 可以多给我几张么?\n\n**A:** 可以,多于一张的部分请按照一张100元的价格[微信或支付宝转账](https://www.anotherhome.net/donate)。\n\n&nbsp;\n\n### Q: 我不喜欢明信片,你可以送我别的东西么?\n\n**A:** 不可以。\n\n&nbsp;\n\n### Q: 你只送明信片,是不是因为你穷?\n\n**A:** 是,欢迎[微信或支付宝转账](https://www.anotherhome.net/donate)。\n\n&nbsp;\n\n### Q: 你刚才说你给了某些人预留,是不是有肮脏的 py 交易?\n\n**A:** ..."},{"slug":"2298","title":"版权狗退散 — 仿知乎复制文本自带版权声明","tags":[],"body":"### 什么鬼?\n\n版权狗退散,妈妈再也不用担心我被侵权了(其实只防君子不防小人)。\n\n类似知乎,在网站复制长度大于42的文本时自动加上这样的版权声明:\n\n```\n著作权归作者所有。\n商业转载请联系作者获得授权,非商业转载请注明出处。\n作者:DIYgod\n链接:https://www.anotherhome.net/\n来源:Anotherhome\n```\n\n### 原理\n\n- 监听copy事件\n\n- 使用 window.getSelection() 获取选中的文本\n\n- 使用 clipboardData.setData 操作剪贴板的内容<!--more-->\n\n### 代码\n\n```js\ndocument.body.addEventListener('copy', function (e) {\n    if (window.getSelection().toString() &amp;&amp; window.getSelection().toString().length &gt; 42) {\n        setClipboardText(e);\n        alert('商业转载请联系作者获得授权,非商业转载请注明出处,谢谢合作。');\n    }\n});\n\nfunction setClipboardText(event) {\n    var clipboardData = event.clipboardData || window.clipboardData;
318\n    if (clipboardData) {\n        event.preventDefault();\n\n        var htmlData = ''\n            + '著作权归作者所有。&lt;br&gt;'\n            + '商业转载请联系作者获得授权,非商业转载请注明出处。&lt;br&gt;'\n            + '作者:DIYgod&lt;br&gt;'\n            + '链接:' + window.location.href + '&lt;br&gt;'\n            + '来源:Anotherhome&lt;br&gt;&lt;br&gt;'\n            + window.getSelection().toString();\n        var textData = ''\n            + '著作权归作者所有。\\n'\n            + '商业转载请联系作者获得授权,非商业转载请注明出处。\\n'\n            + '作者:DIYgod\\n'\n            + '链接:' + window.location.href + '\\n'\n            + '来源:Anotherhome\\n\\n'\n            + window.getSelection().toString();\n\n        clipboardData.setData('text/html', htmlData);\n        clipboardData.setData('text/plain',textData);\n    }\n}\n```\n\n### 已知问题\n\niOS Safari 不兼容 clipboardData.setData() 方法,所以在 iOS Safari 上无效\n\n### 知乎原版\n\n另附知乎原版关键代码,原理类似,感兴趣也可以看看:\n\n```js\nvar lz = function (a, b, c) {\n    function d(a, b) {\n        return [\"著作权归作者所有。\", \"商业转载请联系作者获得授权,非商业转载请注明出处。\", \"作者:\" + b, \"链接:\" + a, \"来源:知乎\", \"\", \"\"]\n    }\n\n    function f(a, b, c) {\n        return \"\\x3cdiv\\x3e\" + d(b, c).join(\"\\x3cbr /\\x3e\") + a + \"\\x3c/div\\x3e\"\n    }\n\n    function g(a) {\n        var g = z.Wq(), m = g &amp;&amp; (0, z.ib)(g.Ed());\n        if (m &amp;&amp; !(42 &gt; m.length)) {\n            if (\"object\" === typeof a.originalEvent.clipboardData &amp;&amp; (a.originalEvent.clipboardData.setData(\"text/html\", f(g.Of(), b, c)), a.originalEvent.clipboardData.setData(\"text/plain\", d(b, c).join(\"\\n\") + m), 0 &lt; a.originalEvent.clipboardData.getData(\"text/plain\").length)) {\n                a.preventDefault();\n                return\n            }\n            if (window.getSelection) {\n                a = g.Of();\n                var n = (0, window.$)(f(a, b, c)).css({position: \"fixed\", left: \"-9999px\"}).appendTo(\"body\");\n                window.getSelection().selectAllChildren(n.get(0));\n                (0, window.setTimeout)(function () {\n                    g.select();\n                    n.remove()\n                }, 200)\n            }\n        }\n    }\n\n    a &amp;&amp; b &amp;&amp; c &amp;&amp; (z.Fa(b, \"http\") || (b = window.location.protocol + \"//\" + window.location.host + b), a.on(\"copy\", g))\n};\n```"},{"slug":"2167","title":"APlayer - 送给小狐狸和小兔子的 HTML5 播放器","tags":["新坑"],"body":"小狐狸和小兔子是很好很好的朋友。\n\n一起散步的时候,不巧遇到了猎人。\n\n他们转身就跑,都希望猎人更容易发现自己。\n\n小狐狸跑进了蒲公英群,白色的蒲公英漫天飞起。\n\n小兔子逃进玫瑰花园,红色的玫瑰花瓣散落一地。\n\n从此失散在彼此的世界里。\n\n幸运的是,后来,小狐狸遇到了小王子,小兔子遇见了爱丽丝。\n\n&nbsp;\n\n**\bGitHub项目主页(喜欢就给个star吧~):**\n\n[https://github.com/DIYgod/APlayer](https://github.com/DIYgod/APlayer)\n\n**Demo:**\n\n[https://www.anotherhome.net/file/APlayer/](https://www.anotherhome.net/file/APlayer/)\n\n**GitHub Trending(热门榜)第8位截图留念2333:**\n\n![APlayerTrending](./attachments/bafybeidpyzwkqmje3fafy2tpye75hna4znl363duqwmgqejprqpxpvktia.png)"},{"slug":"2153","title":"我藏好了哦","tags":[],"body":"![titlehide](./attachments/bafkreifbosbd4sirfvfzuoxwajzbhvezgybz67uij6kavsel6rhtn2vlz4.png)\n\n在 [Sonic 853](http://853.bronya.net/) 看到的神奇的一幕,一颗赛艇,果断扒来水一贴\n\n**原作者:**[成天不高兴的栗山未来](http://chitanda.me/)\n\n**什么鬼:**离开和进入页面时改变title\n\n**原理:**\n\n\b使用了HTML5的Page Visibility API\n\n目前页面可见性API有两个属性,一个事件,如下:\n\ndocument.hidden: Boolean值,表示当前页面可见还是不可见\n\ndocument.visibilityState: 返回当前页面的可见状态,取值有 hidden visible prerender preview\n\nvisibilitychange: 当可见状态改变时候触发的事件\n\n以前\b只知道可以通过 iframe + onblur/onfocus事件 来检测页面可见性,有了这个 API 真是方便优雅了很多啊\n\n**代码:**\n\n```js\nvar OriginTitile = document.title;\nvar titleTime;
318\ndocument.addEventListener(\"visibilitychange\", function () {\n  if (document.hidden) {\n    document.title = \"(つェ⊂)我藏好了哦~ \" + OriginTitile;\n    clearTimeout(titleTime);\n  } else {\n    document.title = \"(*´∇`*) 被你发现啦~ \" + OriginTitile;\n    titleTime = setTimeout(function () {\n      document.title = OriginTitile;\n    }, 2000);\n  }\n});\n```"},{"slug":"2125","title":"论 IFTTT 的正确食用姿势","tags":[],"body":"### 什么是IFTTT\n\n官网:[https://ifttt.com](https://ifttt.com)\n\n这是一个2011年在美国上线的网站,IFTTT 是 _If This Then That_ 的缩写。通俗的来讲,IFTTT 的作用就是如果触发了一件事,则执行设定好的另一件事。\n\n![ifttt](./attachments/bafkreigofpqhf776o2j5wgdp432uoyxpkairznjm56ygj4goqb2k6eydri.png)\n\n结合上图,Recipes 的目的是打通 「this」 和 「that」 两个网络服务,网络服务在这里称为 Channels (频道),前者称为 Trigger Channel (触发器频道),后者称为 Action Channel (动作频道),当触发器频道满足触发条件,那么就会执行动作频道指定的动作。\n\n所以,IFTTT 创建一个「Recipes 流程」的流程如下:选择一个触发器频道,设置它的触发条件,再选择一个动作频道,然后设置它要执行的动作,OK,这样就搞定了。\n\n比如我设置了这样一个Recipes:\n\n![ifttt1](./attachments/bafkreiblr3efj56ubfyc2wvo5gnv2mhd5ajp74xagdhg6627wyaslrci6y.png)\n\n整个Recipe的意思是 _\"**If** new feed item from https://www.anotherhome.net/feed, **then** publish a post to @DIYgod酱\"_。\n\n这样等我这篇文章发布之后,一条微博就会自动发送了。\n\n然而还没完,我还有两个涉及微博的 Recipes:\n\n![ifttt2](./attachments/bafkreiesq52y7tebsvbiquzujwt4hkqei3fjyfiag2exoiw6x4yf3vfe4m.png)\n\n不出意外的话我的 Facebook 和 Twitter 马上都会出现这篇文章的推送。\n\n#### IFTTT可以做什么\n\n目前 IFTTT 所支持的 Channels 也算比较丰富了,如 Feed (RSS)、GitHub、微博、印象笔记、Dropbox、邮件、\bSMS、Gmail、Instagram、Pocket、WordPress、OneDrive、OneNote、Twitter、Facebook、天气预报等等,总数多达230多个。它们之中大多数既可以当触发器,也能作为动ä
318½œæ¥ä½¿ç”¨çš„。\n\n![ifttt3](./attachments/bafkreia432oc5a4ho3gyfkwabsmwhddqig6fwu6d726ky6t6ahab6hbm6a.png)\n\n这里要吐槽一下,230 多个频道里只有一个中国应用,新浪微博,可想国内应用\b有多么小气,“诶,我干嘛要提供接口哇,你把你的服务接到我的平台里就好了”,诺,大家都是这么想的。\n\n另外得益于发布的 Android 版以及 iOS 版的客户端,现在 IFTTT 的频道里不仅仅是一些互联网服务了,它还新增了诸如等手机的联系人、照片、短信、地理位置、通知推送等「频道」,这让 IFTTT 变得更加的实用。\n\n### IFTTT的有趣玩法\n\n这是一个很酷且具有高自由度的服务,你可以利用它做很多很多有趣的事情。而且虽然国内很多服务没有开放API,但我们可以用 RSS 让很多事情变成可能。\n\n- [明天下雨/下雪/低于0摄氏度/高于35摄氏度,给我发一条iOS系统通知](https://ifttt.com/connect/weather/if_notifications)\n\n- 如果[在Facebook上标记](https://ifttt.com/connect/facebook/dropbox)、[在Instagram上点了“喜欢”一张照片](https://ifttt.com/connect/instagram/dropbox),则保存到Dropbox相应文件夹\n\n- [如果有人给我发了一封带附件的\bGmail,则把附件保存在Dropbox](https://ifttt.com/recipes/98759-save-all-your-gmail-attachments-to-dropbox)\n\n- YouTube上喜欢了一个视频,则[分享到Facebook](https://ifttt.com/connect/youtube/facebook)、 [Twitter](https://ifttt.com/connect/youtube/twitter)上并且[保存链接到印象笔记](https://ifttt.com/connect/youtube/evernote)\n\n- [把手机截图图片自动归类到“截图”相册中](https://ifttt.com/recipes/140665-organize-screenshots-in-an-ios-photo-album)\n\n- [每当添加一张照片时,把照片上传到Dropbox](https://ifttt.com/connect/ios_photos/dropbox)\n\n- [当添加一个Google Calendar 事件时,添加一个同样的iPhone 日历事件](https://ifttt.com/connect/google_calendar/ios_reminders)\n\n- 每天晚上提醒我睡觉\n\n&nbsp;\n\n\b另外IFTTT 网站上也有很多网友分享出来的 Recipes 可以供你参考或直接使用。\n\n### 扩展阅读\n\n- [IFTTT - 热门问答 - 知乎](http://www.zhihu.com/topic/19607376)\n\n- [触发你的智能生活:IFTTT 入门 - 少数派](http://sspai.com/25270)\n\n- [iFTTT 入门介绍与简单使用设置教程 - 让互联网服务更加智能自动化地为你工作! | 异次元软件下载](http://www.iplaysoft.com/ifttt.html)\n\n- [你不知道这个叫IFTTT的东西到底有多好玩](http://mp.weixin.qq.com/s?__biz=MzA3NDYwMjk5NQ==&mid=204868306&idx=1&sn=f6f78d5858b6f50cc3c32886b2b74cb3&scene=2&from=timeline&isappinstalled=0#rd)"},{"slug":"2073","title":"《JavaScript高级程序设计》读书笔记","tags":[],"body":"莎士比亚曾经说过:“好记性不如烂笔头。”\n\n## 第一章 JavaScript简介\n\n### 1.1 JavaScript简史\n\n### 1.2 JavaScript实现\n\n1. 一个完整的JavaScript实现应该由三个不同的部分组成:核心(ECMAScript)、文档对象模型(DOM)、浏览器对象模型(BOM)。\n\n2. ECMAScript:提供核心语言功能;DOM:提供访问和操作网页内容的方法和接口;BOM:提供与浏览器交互的方法和接口。\n\n### 1.3 JavaScript版本\n\n&nbsp;\n\n## 第二章 在HTML中使用JavaScript\n\n### 2.1 script元素\n\n1. 标签的位置:为了避免浏览器在呈现页面时出现明显的延迟,现代Web应用程序一般都把全部JavaScript引用放在&lt;body&gt;元素中页面内容的后面。\n\n2. 延迟脚本:defer属性表明脚本在执行时不会影响页面的构造,脚本会被延迟到整个页面都解析完毕后再运行;只适用于外部脚本文件。\n\n```html\n
318<script defer=\"defer\" src=\"example.js\"><\/script>\n```\n\n3. 异步脚本:async属性表示当前脚本不必等待其他脚本,也不必阻塞文档呈现,告诉浏览器立即下载文件,且并不保证标记为async的脚本按照他们的先后顺序执行;只适用于外部脚本文件。\n\n```html\n
318<script async src=\"example1.js\"><\/script>\n
318<script async src=\"example2.js\"><\/script>\n```\n\n### 2.2 嵌入代码与外部文件\n\n### 2.3 文档模式\n\n4. 混杂模式与标准模式;开启标准模式:\n\n```html\n<!-- HTML 5 -->\n<!DOCTYPE html>\n```\n\n### 2.4 noscript元素\n\n&nbsp;\n\n## 第三章 基本概念\n\n### 3.1 语法\n\n1. 区分大小写:ECMAScript中的一切都区分大小写。\n\n2. 严格模式:在严格模式下,ECMAScript 3 中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。在顶部添加如下代码:\n\n```js\n\"use strict\";\n```\n\n### 3.2 关键字和保留字\n\n### 3.3 变量\n\n3. 给未经声明的变量赋值在严格模式下会导致抛出 ReferenceError 错误。\n\n### 3.4 数据类型\n\n4. typeof操作符,用来检测变量的数据类型。\n\n5. 5种简单数据类型:Undefined、Null、Boolean、Number、String;1种复杂数据类型(引用类型):Object。\n\n- Undefined类型:使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。\n\n- Null类型:null值表示一个空对象指针;只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。\n\n- Boolean类型:其他类型转换为Boolean类型,使用函数Boolean()。\n\n- Number类型:其他类型转换为Number类型,常用函数parseInt(),转换字符串时,如果第一个字符不是数字字符或者负号,会返回NaN,第二个参数可选,表示进制\n\n- String类型:字符串是不可变的;其他类型转换为String类型,使用函数toString()或String()或加一个空字符串(1+'')。\n\n- Object类型\n\n创建对象的方法:\n\n```js\nvar o = new Object();\n```\n\n创建Object对象的实例并为其添加属性或方法,就可以创建自定义对象;\n\nObject类型是所有它的实例的基础,具有下列属性和方法:\n\n- constructor:保留着用于创建当前对象的函数即构造函数;\n\n- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在;\n\n- isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型;\n\n- propertyIsEnumerable();toLocaleString();\n\n- toString():返回对象的字符串表示;\n\n- valueOf():返回对象的字符串、数值或布尔值表示;\n\n### 3.5 操作符\n\n6. 在比
318较字符串时,实际比较的是两个字符串中对应位置的每个字符的字符编码值。\n\n```js\n\"23\" < \"3\"; // true\n```\n\n7. 在比较数值和字符串时,字符串都会被被转换成数值,然后再以数值方式与另一个数值比较;如果不能转换成数值,就转换成NaN。\n\n8. 任何操作数与NaN进行比较,结果都是false。\n\n```js\nNaN == NaN; // false\nNaN === NaN; // false\nNaN & gt;\nNaN; // false\nNaN & lt;\nNaN; // false\n```\n\n9. 相等(==) 全等(===):全等只在两个操作数未经转换就相等的情况下返回true。\n\n```js\n\"55\" == 55; // true\n\"55\" === 55; // false\n```\n\n10. 条件操作符\n\n```js\nvariable = boolean_expression ? true_value : false_value;\n```\n\n### 3.6 语句\n\n11. 由于ECMAScript中不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到:\n\n```js\nfor (var i = 0; i &lt; 10; i++) {\n\tvar j = 1;\n}\nconsole.log(i, j);  // 10 1\n```\n\n12. for-in 语句可以用来枚举对象的属性。\n\n```js\nfor (property in expression) {\n  ...\n}\n```\n\n13. break 和 continue 语句与 label 语句联合使用:多发生在循环嵌套的情况下。\n\n```js\nvar num = 0;\n\noutermost:\nfor (var i = 0; i &lt; 10; i++) {\n\tfor (var j = 0; j &lt; 10; j++) {\n\t\tif (i == 5 &amp;&amp; j ==5) {\n\t\t\tbreak outermost;\n\t\t}\n\t\tnum++;\n\t}\n}\n\nconsole.log(num);  // 55\n```\n\n### 3.7 函数\n\n14. 函数参数:参数在内部是用一个数组来表示的,函数接收到的始终都是这个数组,而不关心数组中包含哪些函数;通过arguments对象来访问这个参数数组;命名的参数只提供便利,但不是必需的;arguments对象中的值与对应的命名参数的内存空间是独立的,但它们的值会同步。\n\n```js\nfunction example(name, age) {\n  console.log(\"arguments:\", arguments);\n  console.log(\"name:\", name, \"age:\", age);\n  name = \"DIYgod\";\n  console.log(arguments[0]);\n}\nexample(\"Anotherhome\", \"556\", \"www.anotherhome.net\");\n\n// arguments: [\"Anotherhome\", \"556\", \"www.anotherhome.net\"]\n// name: Anotherhome age: 556\n// DIYgod\n```\n\n&nbsp;\n\n## 第四章 变量、作用域和内存问题\n\n### 4.1 基本类型和引用类型的值\n\n1. 在操作对象时,实际上是在操作对象的引用而不是实际的对象。\n\n2.从一个变量向另一个变量复制基本类型的值时,会创建这个值的一个副本;从一个变量向另一个变量复制引用类型的值时,复制的是指向存储在堆中的一个对象的指针,复制之后两个变量指向同一个对象。\n\n```js\nvar o1 = {};\nvar o2 = o1;\no1.name = \"DIYgod\";\nconsole.log(o2.name); // DIYgod\n\nvar n1 = 1;\nvar n2 = n1;\nn1 = 2;\nconsole.log(n2); // 1\n```\n\n3. 传递参数:参数只能按值传递,参数为对象时,在函数内部访问的是同一个对象。\n\n```js\nfunction setName(o) {\n  o.name = \"DIYgod\";\n  o = {};\n  o.name = \"Anotherhome\";\n}\n\nvar p = {};\nsetName(p);\nconsole.log(p.name); // DIYgod\n```\n\n4. 确定一个值是哪种基本类型可以使用typeof操作符,而确定一个值是哪种引用类型可以使用instanceof操作符。\n\n### 4.2 执行环境及作用域\n\n5. 执行环境有全局执行环境和函数执行环境之分;每个执行环境都有一个与之关联的变量对象;每次进入一个新执行环境,都会创建一个用于搜索变量和函数的作用域链,作用链的前端是当前执行的代码所在的变量环境,最后一个对象是全局执行环境的变量对象。\n\n6. 查询标识符:从作用域链的前端开始,向上逐级查询,找到后搜索结果停止,没有找到则一直追溯到全局环境的变量对象。\n\n### 4.3 垃圾回收\n\n7. 最常用的垃圾搜集方式是标记清除:垃圾回收器在运行时会给存储在内存中的所有变量都加上标记,然后去掉环境中的变量以及被环境中的变量引用的变量的标记,而在此之后还有标记的变量被视为准备删除的变量,因为这些变量无法被访问到了。\n\n8. 优化内存占用:为执行中的代码只保存必要的数据;一旦数据不再有用,最好通过将其值设置为null来释放其引用——解除引用;解除引用的作用是让其值脱离执行环境ï¼
318Œä»¥ä¾¿åžƒåœ¾æœé›†å™¨ä¸‹æ¬¡è¿è¡Œæ—¶å°†å…¶å›žæ”¶ã€‚\n\n&nbsp;\n\n## 第五章 引用类型\n\n### 5.1 Object类型\n\n1. 创建Object实例:使用Object构造函数;对象字面量。\n\n```js\n// new 操作符法\nvar o1 = new Object();\no1.name = \"DIYgod\";\no1.age = 20;\n\n// 对象字面量表示法\nvar o1 = {\n  name: \"DIYgod\",\n  age: 20,\n};\n```\n\n2. 访问对象属性:点表示法;方括号表示法。建议使用点表示法。\n\n```js\n// 点表示法\nconsole.log(o.name);\n\n// 方括号表示法\nconsole.log(o['name']);\n\nvar n = 'name';\nconsole.log(o[n]);\n\nconsole.log(o['first name'];\n```\n\n### 5.2 Array类型\n\n3. 创建数组:使用Array构造函数;使用数组字面量表示法。\n\n```js\nvar a1 = new Array();\nvar a2 = new Array(20);\nvar a3 = new Array(\"red\", \"blue\", \"green\");\n\nvar a4 = [];\nvar a5 = [\"red\", \"blue\", \"green\"];\n```\n\n4. 利用length在末尾添加新项。\n\n```js\nvar a = [\"a\", \"b\"];\na[a.length] = \"c\";\n```\n\n5. 检测数组:Array.isArray()(解决了存在两个以上全局执行环境时instanceof检测结果出错的情况)。\n\n6. 栈方法和队列方法:push()添加一项到数组末尾;pop()移除数组末尾一项;shift()移除数组第一项;unshift();添加一项到数组前端。\n\n7. 重排序\n\n- reverse():反转数组项的顺序。\n\n- sort():默认将数组项转换成字符串然后升序排列。可以接收一个比较函数作为参数。\n\n比较函数接收两个参数,如果第一个参数位于第二个参数之前则返回一个负数,相等则返回0,第二个参数位于第一个参数之前则返回一个负数。\n\n```js\nvar a = [0, 1, 15, 10, 5];\na.sort();\nconsole.log(a); // [0, 1, 10, 15, 5]\n\nfunction compare(value1, value2) {\n  return value1 - value2;\n}\na.sort(compare);\nconsole.log(a); // [0, 1, 5, 10, 15]\n```\n\n8. 操作方法\n\n- concat():添加项\n\n```js\nvar a1 = [\"red\", \"green\", \"blue\"];\nvar a2 = a1.concat(\"yellow\", [\"black\", \"brown\"]);\nconsole.log(a2); // [\"red\", \"green\", \"blue\", \"yellow\", \"black\", \"brown\"]\n```\n\n- slice():截取\n\n```js\nvar a = [\"red\", \"green\", \"blue\", \"yellow\", \"black\", \"brown\"];\nconsole.log(a.slice(1), a.slice(1, 4)); // [\"green\", \"blue\", \"yellow\", \"black\", \"brown\"] [\"green\", \"blue\", \"yellow\"]\n```\n\n- splice():删除插入替换\n\n```js\nvar a = [\"red\", \"green\", \"blue\", \"yellow\", \"black\", \"brown\"];\nconsole.log(a.splice(2, 1), a); // 删除项; [\"blue\"] [\"red\", \"green\", \"yellow\", \"black\", \"brown\"]\nconsole.log(a.splice(1, 0, \"yellow\", \"orange\"), a); // 插入项; [] [\"red\", \"yellow\", \"orange\", \"green\", \"yellow\", \"black\", \"brown\"]\nconsole.log(a.splice(1, 1, \"red\", \"purple\"), a); // 替换项; [\"yellow\"] [\"red\", \"red\", \"purple\", \"orange\", \"green\", \"yellow\", \"black\", \"brown\"]\n```\n\n9. 位置方法:indexOf() lastIndexOf() 接收两个参数:要查找的项和(可选)查找起点位置的索引;indexOf()从前往后查找,lastIndexOf()从后往前查找;返回要查找的项的位置,没找到则返回-1。\n\n```js\nvar a = [\"red\", \"purple\", \"orange\", \"green\", \"red\", \"yellow\", \"black\", \"brown\"];\nconsole.log(a.indexOf(\"red\")); // 0\nconsole.log(a.lastIndexOf(\"red\")); // 4\nconsole.log(a.indexOf(\"red\", 1)); // 4\nconsole.log(a.lastIndexOf(\"red\", 1)); // 0\n```\n\n10. 迭代方法:every() some() filter() map() forEach()。\n\n```js\nvar a = [1, 2, 3, 4, 5, 4, 3, 2, 1];\n\nvar everyResult = a.every(function (item, index, array) {\n\treturn (item &gt; 2);\n});\nconsole.log(everyResult);  // false\n\nvar someResult = a.some(function (item, index, array) {\n\treturn (item &gt; 2);\n});\nconsole.log(someResult);  // true\n\nvar filterResult = a.filter(function (item, index, array) {\n\treturn (item &gt; 2);\n});\nconsole.log(filterResult);  // [3, 4, 5, 4, 3]\n\nvar mapResult = a.map(function (item, index, array) {\n\treturn (item * 2);\n});\nconsole.log(mapResult);
318  // [2, 4, 6, 8, 10, 8, 6, 4, 2]\n\nvar forEachResult = a.forEach(function (item, index, array) {\n\tconsole.log(item);\n});\nconsole.log(forEachResult);  // undefined\n```\n\n11. 归并方法\n\n```js\nvar a = [1, 2, 3, 2, 1];\n\nvar sum1 = a.reduce(function (prev, cur, index, array) {\n  console.log(index); // 1 2 3 4\n  return prev + cur;\n});\nconsole.log(sum1); // 9\n\nvar sum2 = a.reduceRight(function (prev, cur, index, array) {\n  console.log(index); // 3 2 1 0\n  return prev + cur;\n});\nconsole.log(sum2); // 9\n```\n\n### 5.3 Date类型\n\n1. 创建日期对象:月份基于0(一月是0,二月是1...)。\n\n```js\nvar d1 = new Date();\n\nvar d2 = new Date(2015, 2, 5, 17, 55, 55); // 2015å¹´3月5日下午5点55分55秒\n```\n\n2. 获取调用时的日期和时间和毫秒数,可以用来分析代码。\n\n```js\nvar start = Date.now();\ndoSomething();\nvar stop = Date.now();\nvar result = stop - start;\n```\n\n3. 日期格式化方法:local表示以特定于地区的格式显示。\n\n```js\nvar d2 = new Date(2015, 2, 5, 17, 55, 55);\nd2.toString(); // \"Thu Mar 05 2015 17:55:55 GMT+0800 (CST)\"\nd2.toDateString(); // \"Thu Mar 05 2015\"\nd2.toTimeString(); // \"17:55:55 GMT+0800 (CST)\"\nd2.toLocaleString(); // \"2015/3/5 下午5:55:55\"\nd2.toLocaleDateString(); // \"2015/3/5\"\nd2.toLocaleTimeString(); // \"下午5:55:55\"\n```\n\n### 5.4 RegExp类型\n\n1. 创建一个正则表达式:\n\npattern部分是正则表达式\n\nflags,标志,标明正则表达式的行为:g 全局模式;i 不区分大小写;m 多行模式\n\n```js\nvar exp1 = / pattern / flags\nvar exp2 = new RegExp('pattern', 'flags');\n```\n\n2. 实例方法:\n\n- exec():返回第一个匹配项信息的数组,数组第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串;还包含两个额外的属性,index 和 input。\n\n```js\nvar text = \"I'm DIYgod, and this is Anotherhome\";\nvar pattern = /and( this( is)?)?/gi;\nvar matches = pattern.exec(text);\nconsole.log(matches.index); // 12\nconsole.log(matches.input); // I'm DIYgod, and this is Anotherhome\nconsole.log(matches[0]); // and this is\nconsole.log(matches[1]); //  this is\nconsole.log(matches[2]); //  is\n```\n\n- test():在模式与该参数匹配的情况下返回true,否则返回false。\n\n```js\nvar text = \"I'm DIYgod, and this is Anotherhome\";\nvar pattern = /DIYgod/;\nvar matches = pattern.test(text);\nconsole.log(matches); // true\n```\n\n3. RegExp构造函数包含一些属性,适用于作用域中的所有正则表达式,记录一些最近一次正则表达式操作的信息。\n\n### 5.5 Function类型\n\n1. 定义函数,函数实际上是 Function 类型的实例,因此函数也是对象。\n\n```js\n// 使用函数声明语法\nfunction f1(n1, n2) {\n  return n1 + n2;\n}\n\n// 使用函数表达式\nvar f2 = function (n1, n2) {\n  return n1 + n2;\n};\n\n// 使用构造函数,不推荐\nvar f3 = new Function(\"n1\", \"n2\", \"return n1 + n2\");\n```\n\n2. 函数名是一个指向函数对象的指针。\n\n```js\nfunction f1(n1, n2) {\n  return n1 + n2;\n}\nvar f2 = f1;\nf1 = null;\nconsole.log(f2(1, 1)); // 2\n```\n\n3. ECMAScript中没有函数重载。\n\n4. 函数声明与函数表达式的区别:解释器会率先读取函数声明,并使其在执行任何代码之前可用(函数声明提升);函数表达式必须等到解释器执行到它所在行才会真正被解释执行。\n\n```js\nconsole.log(f1(1, 1)); // 2\nfunction f1(n1, n2) {\n  return n1 + n2;\n}\n\nconsole.log(f2(1, 1)); // Uncaught TypeError: f2 is not a function\nvar f2 = function (n1, n2) {\n  return n1 + n2;\n};\n```\n\n5. 函数内部属性\n\n- 函数的arguments对象的callee属性:是一个指针,指向拥有这个arguments对象的函数。可以在递归时减小函数和函数名的耦合。\n\n```js\n// 明显第二种写法更好一些\n\nfunction factorial1 (num) {\n\tif (num &lt;= 1) {\n\t\treturn 1;\n\t}\n\telse {\n\t\treturn num * factorial1(num - 1);\n\t}\n}\n\nfunction factorial2 (num) {\n\tif (num &lt;= 1) {\n\t\treturn 1;\n\t}\n\telse {\n\t\treturn num * arguments.callee(num - 1);\n\t}\n}\n```\n\n- caller属性:保存着当前函数的函数的引用。\n\n```js\nfunction outer() {\n  inner();\n}\nfunction inner() {\n  console.log(arguments.callee.caller); // function outer()...\n}\nouter();\n```\n\n6. 函数属性和方法\n\n- length属性:表示函数希望接收的命名参数的个数。\n\n```js\nfunction f(n1, n2) {\n  return n1 + n2;\n}\nconsole.log(f.length); // 2\n```\n\n- apply() call():用来改变函数的this对象的值。\n\n```js\nwindow.color = \"red\";\nvar o = {\n  color: \"blue\",\n};\n\nfunction sayColor(n1, n2) {\n  console.log(this.color);\n  return n1 + n2;\n}\n\nsayColor(1, 1); // red\no.sayColor = sayColor;\no.sayColor(); // blue\n\n// 使用call和apply可以消除对象与方法的耦合关系\nsayColor.call(window, 1, 1); // red\nsayColor.call(o, 1, 1); // blue\n\nsayColor.apply(window, [1, 1]); // red\nsayColor.apply(o, [1, 1]); // blue\n```\n\n### 5.6 基本包装类型\n\nBoolean类型、Number类型、String类型\n\n暂时跳过\n\n### 5.7 单体内置对象\n\nGlobal对象、Math对象\n\n暂时跳过\n\n&nbsp;\n\n## 第六章 面向对象的程序设计\n\n### 6.1 理解对象\n\n1. 两种属性:数据属性和访问器属性。特性:描述属性的各种特征,是为了实现JavaScript引擎用的,不能直接访问。\n\n- 数据属性,有4个特性:\n\n* [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。\n\n* [[Enumerable]]:表示能否通过 for-in 循环返回属性。\n\n* [[Writeable]]:表示能否修改属性的值。\n\n* [[Value]]:包含这个属性的数据值。\n\n- è
318®¿é—®å™¨å±žæ€§ï¼Œæœ‰4个特性:\n\n* [[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为数据属性。\n\n* [[Enumerable]]:表示能否通过 for-in 循环返回属性。\n\n* [[Get]]:在读取属性时调用的函数。\n\n* [[Set]]:在写入属性时调用的函数。\n\n2. 定义及读取特性:Object.defineProperty() Object.defineProperties() Object.getOwnPropertyDescriptor()\n\n### 6.2 创建对象\n\n1. 工厂模式:虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题。\n\n```js\nfunction createPerson(name, age, job) {\n  var o = new Object();\n  o.name = name;\n  o.age = age;\n  o.job = job;\n  o.sayName = function () {\n    console.log(this.name);\n  };\n  return o;\n}\nvar p1 = createPerson(\"DIYgod\", 20, \"Software Engineer\");\nvar p2 = createPerson(\"Anotherhome\", 2, \"Website\");\n```\n\n2. 构造函数模式。(构造函数应该以大写字母开头)\n\n```js\nfunction Person(name, age, job) {\n  this.name = name;\n  this.age = age;\n  this.job = job;\n  this.sayName = function () {\n    console.log(this.name);\n  };\n}\nvar p1 = new Person(\"DIYgod\", 20, \"Software Engineer\");\nvar p2 = new Person(\"Anotherhome\", 2, \"Website\");\n\n// p1 p2 分别保存着 Person 的一个不同的实例,这两个对象都有一个 constructor 属性,该属性指向Person\nconsole.log(p1.constructor); // function Person(name, age, job) {...\n\nconsole.log(p1 instanceof Object); // true\nconsole.log(p1 instanceof Person); // true\n```\n\n这种方法会经历4个步骤:\n\n- 创建一个新对象\n\n- 将构造函数的作用域赋给新对象(this指向这个新对象)\n\n- 执行构造函数中的代码(为新对象添加属性)\n\n- 返回新对象\n\n构造函数的问题:每个方法都要在每个实例上重新创建一遍。\n\n```js\nconsole.log(p1.sayName === p2.sayName); // false\n```\n\n3. 原型模式:每个函数都有一个 prototype 属性,这个属性是一个指针,指向一个对象(函数的原型对象),这个对象包含可以由该类型的所有实例共享的属性和方法。\n\n```js\n// 组合使用构造函数模式与原型模式\nfunction Person(name, age, job) {\n  this.name = name;\n  this.age = age;\n  this.job = job;\n}\nPerson.prototype.sayName = function () {\n  console.log(this.name);\n};\nvar p1 = new Person(\"DIYgod\", 20, \"Software Engineer\");\nvar p2 = new Person(\"Anotherhome\", 2, \"Website\");\n\nconsole.log(p1.sayName === p2.sayName); // true\n```\n\n- 理解原型对象:\n\n* 只要创建一个新函数,就会根据一组特定的规则为该函数创建一个 prototype 属性,指向原型对象\n\n* 默认所有原型对象都会获得一个 constructor 属性,指向 prototype 属性所在函数\n\n* 调用构造函数创建新实例后,实例将有一个 **proto** 属性,指向构造函数的原型对象,指针叫[[Prototype]],默认原型指向Object\n\n* 实例与构造函数没有直接关系\n\n* 读取属性:搜索先从对象实例本身开始,如果没找到,搜索原型对象\n\n* 使用 isPrototype() 来检测构造函数和实例之间是否有关系\n\n* 使用 hasOwnProperty() 来检测属性存在于实例中还是原型中\n\n- 原型与 in 操作符\n\n```js\n// in操作符会在通过对象能够访问到属性时返回true\nconsole.log(\"name\" in p1); // true\n\n// 枚举属性\nfor (var prop in p1) {\n  console.log(prop); // name age job sayName\n}\n```\n\n- 用对象字面量重写原型对象\n\n```js\nfunction Person() {}\nPerson.prototype = {\n  constructor: Person, // 这里重写了prototype,不再默认有constructor属性\n  name: \"DIYgod\",\n  age: 20,\n};\n```\n\n4. 动态原型模式、寄生构造函数模式、稳妥构造函数模式\n\n### 6.3 继承\n\n5. JavaScript中最常用的继承:组合继承。融合了原型链和构造函数的优点。\n\n```js\nfunction SuperType(name) {\n  this.name = name;\n  this.color = [\"red\", \"blue\", \"green\"];\n}\nSuperType.prototype.sayName = function () {\n  console.log(this.name);\n};\n\nfunction SubType(name, age) {\n  SuperType.call(this, name); // 借用构造函数\n  this.age = age;\n}\nSubType.prototype = new SuperType(); // 原型链\nSubType.prototype.constructor = SubType; // construcotr在上一句中被重写\nSubType.prototype.sayAge = function () {\n  console.log(this.age);\n};\n\nvar instance = new SubType(\"DIYgod\", 20);\ninstance.sayName(); // DIYgod\ninstance.sayAge(); // 20\n```\n\n6. 确定原型和实例的关系。接上例:\n\n```js\nconsole.log(instance instanceof SuperType); // true\nconsole.log(SuperType.prototype.isPrototypeOf(instance)); // true\n```\n\n7. 原型式继承、寄生式继承、寄生组合式继承\n\n## 第七章 函数表达式\n\n### 7.1 递归\n\n### 7.2 闭包\n\n1. 闭包是有权访问另一个函数作用域中的变量的函数。\n\n2. (作用域链见4.2)在外部函数内部定义的内部函数将包含外部函数的活动对象添加到它的作用域中;外部函数执行完毕后,其活动对象不会被销毁,因为内部函数的作用域链仍然在引用这个活动对象;外部函数执行完毕后,内部函数仍然可以访问到其定义的所有变量。\n\n```js\nfunction outer() {\n  var name = \"DIYgod\";\n  return function () {\n    console.log(name);\n  };\n}\nvar inner = outer();\ninner(); // DIYgod\ninner = null; // 解除对outer内部的匿名函数的引用,以便释放内存\n```\n\n3. 闭包只能取得包含函数中任何变量的最后一个值。\n\n```js\nfunction createFunction () {\n\tvar result = [];\n\tfor (var i = 0; i &lt; 10;
318 i++) {\n\t\tresult[i] = function () {\n\t\t\treturn i;\n\t\t}\n\t}\n\treturn result;\n}\nconsole.log(createFunction()[0]());  // 10\nconsole.log(createFunction()[1]());  // 10\n// 返回的都是同一个变量i\n```\n\n4. 匿名函数的this通常会指向window。\n\n```js\nvar name = \"The Window\";\nvar object = {\n  name: \"My Object\",\n  getNameFunc: function () {\n    return function () {\n      return this.name;\n    };\n  },\n};\nconsole.log(object.getNameFunc()()); // The Window\n```\n\n### 7.3 模仿块级作用域\n\n5. 用匿名函数来模仿块级作用域:第一个括号的作用是将函数声明转换成函数表达式(函数声明不能通过后面加括号来调用),第二个括号来调用这个函数。\n\n```js\n(function () {\n  var i = 9;\n  console.log(i); // 9\n})();\nconsole.log(i); // Uncaught ReferenceError: i is not defined\n```\n\n### 7.4 静态对象\n\n6. 任何在函数中定义的变量,都可以认为是私有变量。\n\n7. 有权访问私有变量和私有函数的公有方法称为特权方法。\n\n```js\nfunction MyObject() {\n  // 私有变量和私有函数\n  var privateVariable = \"DIYgod\";\n  function privateFunction() {\n    console.log(\"lalala\");\n  }\n\n  // 特权方法\n  this.publicMethod = function () {\n    console.log(privateVariable);\n    privateFunction();\n  };\n}\nvar o = new MyObject();\no.publicMethod(); // DIYgod lalala\no.privateFunction(); // Uncaught TypeError: o.privateFunction is not a function\n```\n\n...\n\n## 第十三章 事件\n\n### 13.1事件流\n\n1. 事件冒泡:事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点;IE9、FireFox、Chrome 和 Safari 将事件一直冒泡到 window 对象。\n\n2. 事件捕获:由于老版本的浏览器不支持,因此很少有人使用事件捕获。\n\n3. “DOM2级事件”规定的事件流包括三个阶段:事件捕获阶段、处于目标阶段和事件冒泡阶段。\n\n### 
31813.2 事件处理程序\n\n4. HTML事件处理程序:扩展作用域,在函数内部可以像访问局部变量一样访问document及该元素本身的成员,栗子:\n\n```js\n&lt;input type=\"button\" value=\"Click Me\" onclick=\"alert(value)\"&gt;\n```\n\n如果是一个表单输入元素,则作用域中还会包含访问表单元素的入口,栗子:\n\n```js\n&lt;form method=\"post\"&gt;\n    &lt;input type=\"text\" name=\"username\" value=\"\"&gt;\n    &lt;input type=\"button\" value=\"Echo username\" onclick=\"alert(username.value)\"&gt;\n&lt;/form&gt;\n```\n\n缺点:①存在时差问题,解析函数之前就触发事件会引发错误 ②扩展处理程序的作用域链在不同浏览器中会导致不同结果 ③导致HTML和JavaScript代码紧密耦合。\n\n5. DOM0级事件处理程序\n\n```js\n// 绑定事件处理程序\nvar btn = document.getElementById(\"myButton\");\nbtn.onclick = function () {\n  console.log(this.id); // myButton\n};\n\n// 删除事件处理程序\nbtn.onclick = null;\n```\n\n以这种方式添加的事件处理程序会在事件流的冒泡阶段被处理。\n\n6. DOM2级事件处理程序\n\naddEventListener() 和 removeEventListener()\n\n三个参数:要处理的事件名、作为事件处理程序的函数、在捕获阶段调用函数(true)还是在冒泡阶段调用函数(false,默认)\n\n好处是可以添加多个事件处理程序,使用 addEventListener 添加的事件处理程序只能使用 removeEventListener移除,匿名函数无法移除。\n\n7. IE事件处理程序\n\nattachEvent() 和 detachEvent()\n\n```js\nvar btn = document.getElementById(\"myButton\");\nbtn.attachEvent(\"onclick\", function () {\n  console.log(this === window); // myButton\n});\n```\n\n以这种方式添加的事件处理程序会在事件流的冒泡阶段被处理。\n\n### 13.3 事件对象\n\n8. 在触发DOM上的某个事件时,会产生一个事件对象event,这个对象包含着所有与事件有关的信息。只有在事件处理程序执行期间,event对象才会存在,一旦事件处理程序执行完成,event对象就会被销毁。\n\n9. 属性/方法:\n\ncurrentTarget:正在处理事件的那个元素\n\ntarget:事件的目标\n\ntype:事件类型\n\ncancelable:可以阻止特定事件的默认行为\n\npreventDefault():阻止特定事件的默认行为\n\nstopPropagation():停止事件在DOM层次中的传播,即取消进一步的事件捕获或冒泡\n\neventPhase:事件出于事件流的阶段 捕获阶段为1 处于目标对象为2 冒泡阶段为3\n\n### 13.4 事件类型\n\n10. UI事件、焦点事件、鼠标事件、滚轮事件、文本事件、键盘事件、合成事件、变动事件。\n\n&nbsp;\n\n...\n\n## 第二十一章 Ajax与Comet\n\n### 21.1 XMLHttpRequest对象\n\n1. 用法\n\n```js\nvar xhr = new XMLHttpRequest();\nxhr.onreadystatechange = function () {\n\tif (xhr.readState === 4) {\n\t\tif (xhr.status &gt;= 200 &amp;&amp; xhr.status &lt; 300 || xhr.status === 304) {\n\t\t\tconsole.log(xhr.responseText);\n\t\t}\n\t\telse {\n\t\t\tconsole.log('Request was unsuccessful: ' + xhr.status);\n\t\t}\n\t}\n};\nxhr.open('get', 'example.php', true);\nxhr.send(null);\n```\n\n- 创建XHR对象:new XMLHttpRequest();\n\n- open():启动一个请求以备发送;3个参数:请求类型、请求的URL、是否异步发送请求(同步必须等到服务器响应后再继续执行);不会真正发送请求。\n\n- send():发送请求;1个参数:发送的数据;不需要发送数据则必须传入null。\n\n- XHR对象的属性:\n\n* responseText 返回的文本\n\n* status 响应的HTTP状态。\n\n- HTTP状态码:\n\n* 2xx 成功\n\n* 3xx 重定向,304 Not Modified 表示请求的资源没有被修改,可以直接用浏览器中缓存的版本,302 Found 表示请求的资源现在临时从不同的URI响应请求\n\n* 4xx 客户端错误,403 Forbidden,404 Not Found\n\n* 5xx 服务器错误,500 Internal Server Error,503 Service Unavailable。\n\n- XHR的readyState属性:\n\n* 0:未初始化\n\n* 1:启动,已调用open()\n\n* 2:发送,已调用send()\n\n* 3:接收到部分响应数据\n\n* 4:接收到全部响应数据\n\n- readystatechange事件:readystate属性的值由一个值变成另一个值,
318都会触发readystatechange事件。\n\n### 21.4 跨域资源共享\n\n1. CORS:使用自定义的HTTP头部让浏览器与服务器进行沟通,从而决定请求或响应是应该成功还是应该失败。IE中要使用XDR对象实现,其他浏览器XHR对象原生支持。\n\n2. 图像Ping:只能发送GET请求;无法访问服务器的响应文本。\n\n```js\nvar img = new Image();\nimg.onload = img.onerror = function () {\n  console.log(\"Done!\");\n};\nimg.src = \"http://api.hitokoto.us/rand?encode=jsc\";\n```\n\n3. JSONP:两部分组成 回调函数和数据。\n\n```js\nfunction myCallBack(data) {\n  console.log(data.hitokoto); // 像平常的你一样引发奇迹吧-\n}\nvar script = document.createElement(\"script\");\nscript.src = \"http://api.hitokoto.us/rand?encode=jsc&amp;fun=myCallBack\"; // 返回一个包含在函数调用中的JSON,调用了myCallBack函数:myCallBack({\"hitokoto\":\"...\",\"author\":\"...\",....});\ndocument.body.insertBefore(script, document.body.firstChild);\n```\n\n缺点:安全性不可靠;不容易判断请求失败。\n\n&nbsp;\n\n&nbsp;\n\nTo Be Continued..."},{"slug":"126","title":"百度前端技术学院编码挑战(TASK 0004)","tags":[],"body":"任务4(最终挑战)已经发布,任务deadline是6月10日至6月30日。\n\nTASK 0004 内容:[https://github.com/baidu-ife/ife/tree/master/task/task0004](https://github.com/baidu-ife/ife/tree/master/task/task0004)\n\n我做的:[https://github.com/DIYgod/ife-work/tree/master/task0004](https://github.com/DIYgod/ife-work/tree/master/task0004)\n\n在线Demo: [https://www.anotherhome.net/file/ife/task0004](https://www.anotherhome.net/file/ife/task0004)\n\n本次任务断断续续花费了20天(5.20-6.9)的时间。\n\n下面是我做 TASK 0004 过程中的一些记录。\n\n---\n\n### 移动端适配\n\n“往前推2到3年,前端工程师还在忧心忡忡地想,移动互联网时代下,前端是不是没有生存空间了。但今天一看,在我们团队,前端工程师超过一半的工作都是在做移动端的Web或者APP的开发。移动Web或者APP在技术本质上是和做桌面端Web没有本质区别,但是移动端的坑那是非
318常的多,通过学习这部分内容,让你成为一名桌面移动通吃的前端开发工程师。”\n\n要求整个产品为SPA,刚开始完全没思路,看了两天AngularJS,最后还是决定自己实现。\n\n参考Gmail:\n\n![task0004_1](./attachments/bafkreigzsti7ooqsfhslrwk4e27crmrjhlzgasgm6zfg565snkxlizv6ay.jpeg)\n\n![task0004_2](./attachments/bafkreihsdugzhccl7g2w7mbyljt5sxe6lkv4mvxvleudpj7jjgqhpyxz4y.jpeg)\n\n切换到另一个锚点的时候,只显示这个锚点对应的部分,其他部分用 display:none 隐藏起来。但是没看懂具体是怎么实现的。在console里执行 `location.href = '#mn';` 也可以自动修改display,说明是绑定了锚点而不是通过点击事件来切换的。\n\n李胜菊苣告诉我是它通过监听url实现,类似MVC中的路由。感觉自己实现起来挺困难的。。。但是想到了另外一种方法,简单地说就是利用CSS3里的target伪类,demo如下:\n\nSee the Pen [jPMgre](http://codepen.io/DIYgod/pen/jPMgre/) by DIYgod ([@DIYgod](http://codepen.io/DIYgod)) on [CodePen](http://codepen.io).\n\n
318<script src=\"//assets.codepen.io/assets/embed/ei.js\" async=\"\"><\/script>\n\n于是再改改CSS,就轻松实现了移动端的适配。\n\n![task0004_3](./attachments/bafkreie74bxd43dsvxyihabnuhnkxdg4sndhnkgfj6w2q2iqiiwfekxx64.png)\n\n![task0004_4](./attachments/bafkreigs6hs5n5owzphybt7fkqznglsgrupdast74357mw6vkmccc6g3tq.png)\n\n![task0004_5](./attachments/bafkreiga5mnpd6inxea7rnjbrqo7z3ioerhteaxcez5phyayy5vgmshcze.png)\n\n![task0004_6](./attachments/bafkreifasakxzzz626rjnpjl7ztt7t4jdsvjmtp3i3h4hpwx3csyjfsium.png)\n\n又是李胜菊苣带我飞,通过分析张鑫旭菊苣的Mobilebone框架([官网](http://www.mobilebone.org/)),我找到了更好的实现,以上实现作废23333。\n\n原理是这样的:切换锚点时会触发onhashchange事件,所以我就在onhashchange事件上绑定了一个函数,这个函数会记录切换前的锚点和切换后的锚点,通过判断前后锚点来做相应的动作,在切换过程中会给子页面加上 slide out in reverse 中的某几个class,通过这几个class实现滑动效果,具体实现见下面的CSS部分,切换完成后隐藏不需要显示的子页面和清除之前加上的class。就这样。\n\nJS部分:\n\n```js\n/* 滑动效果 */\nwindow.onhashchange = function () {\n    var newHash = location.hash;\n    var oldEle = $('.' + oldHash.substr(1));\n    var newEle = $('.' + newHash.substr(1));\n    if ((oldHash == '#type' &amp;&amp; newHash == '#task') || (oldHash == '#task' &amp;&amp; newHash == '#details') ) {\n        oldEle.className += ' slide out';\n        newEle.className += ' slide in';\n        newEle.style.display = 'block';\n        oldEle.style.display = 'block';\n        setTimeout(function () {\n            newEle.style.display = 'block';\n            oldEle.style.display = 'none';\n            oldEle.className = oldEle.className.replace(/ slide out/, '');\n            newEle.className = newEle.className.replace(/ slide in/, '');\n        }, 225);\n    }\n    else if ((oldHash == '#task' &amp;&amp; newHash == '#type') || (oldHash == '#details' &amp;&amp; newHash == '#task')) {\n        newEle.className += ' slide reverse in';\n        oldEle.className += ' slide reverse out';\n        oldEle.style.display = 'block';\n        newEle.style.display = 'block';\n        setTimeout(function () {\n            oldEle.style.display = 'none';\n            newEle.style.display = 'block';\n            newEle.className = newEle.className.replace(/ slide reverse in/, '');\n            oldEle.className = oldEle.className.replace(/ slide reverse out/, '');\n        }, 225);\n    }\n    oldHash = newHash;\n}\n```\n\nCSS部分:\n\n```css\n/* 滑动效果 from mobilebone */\n.slide.out,\n.slide.in {\n  animation-timing-function: ease-out;\n  animation-duration: 225ms;\n}\n\n.slide.in {\n  animation-name: slideinfromright;\n}\n\n.slide.out {\n  animation-name: slideouttoleft;\n}\n\n.slide.reverse.out {\n  animation-name: slideouttoright;\n}\n\n.slide.reverse.in {\n  animation-name: slideinfromleft;\n}\n\n/* keyframes for slidein from sides */\n@-webkit-keyframes slideinfromright {\n  from {\n    -webkit-transform: translate3d(100%, 0, 0);\n  }\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes slideinfromright {\n  from {\n    transform: translateX(100%);\n  }\n  to {\n    transform: translateX(0);\n  }\n}\n\n@-webkit-keyframes slideinfromleft {\n  from {\n    -webkit-transform: translate3d(-100%, 0, 0);\n  }\n  to {\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n}\n\n@keyframes slideinfromleft {\n  from {\n    transform: translateX(-100%);\n  }\n  to {\n    transform: translateX(0);\n  }\n}\n\n/* keyframes for slideout to sides */\n@-webkit-keyframes slideouttoleft {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n  to {\n    -webkit-transform: translate3d(-100%, 0, 0);\n  }\n}\n\n@keyframes slideouttoleft {\n  from {\n    transform: translateX(0);\n  }\n  to {\n    transform: translateX(-100%);\n  }\n}\n\n@-webkit-keyframes slideouttoright {\n  from {\n    -webkit-transform: translate3d(0, 0, 0);\n  }\n  to {\n    -webkit-transform: translate3d(100%, 0, 0);\n  }\n}\n\n@keyframes slideouttoright {\n  from {\n    transform: translateX(0);\n  }\n  to {\n    transform: translateX(100%);\n  }\n}\n```\n\n更新:实测这种方法在Safari下表现并不好。\n\n再更新:补充上面:这种方法在貌似在移动端的Safari表现并不好,但在Mac端的Safari表现正常。\n\n&nbsp;\n\n### CSS Processing\n\n“CSS语言由于其自身语言设计的问题,加上一些浏览器兼容性问题,往往会使得我们在写它的时候,要写很多冗余代码,或者为了兼容性对同一个样式设定写好几遍。针对这些问题,诞生了CSS预处理和后处理的概念及相关方法、工具。\n\n这些工具和方法帮助我们能够更加高效地书写可维护性更强的CSS代码。”\n\n经过调研,我最后决定使用更广泛的Less。\n\n根据慕课网教程([less即学即用](http://www.imooc.com/learn/102))整理的Less思维导图:\n\n![less](./attachments/bafkreieguecf54tkdpbqzi2qprbiz4vqo6r2czkkhjmuglbgq2urfhzofm.png)\n\nCSS部分重构完毕ï¼
318Œç»ˆäºŽå¯ä»¥å¤ç”¨äº†ï¼ŒDRY (Don't repeat yourself)。\n\n另外结合Grunt使用autoprefixer处理浏览器前缀,简直不能再爽。\n\n&nbsp;\n\n### 安全\n\n“安全是大家经常容易忽视,但其实一旦出现影响会非常大的问题,尤其对于没有经历过企业开发,或者没有踩过坑的同学,如果等到公司工作,做实际项目后非常容易发生安全问题。”\n\n现有程序存在漏洞,比如在任务内容里输入以下内容然后保存,就会执行我们自定义的script脚本。\n\n```html\n<iframe src=javascript:alert('xss');height=0 width=0></iframe>\n```\n\n或\n\n```html\n<img src=\"./attachments/1.html\" onerror=eval(\"\\x61\\x6c\\x65\\x72\\x74\\x28\\x27\\x78\\x73\\x73\\x27\\x29\")>\n```\n\n所以要简单做下 XSS 防护:\n\n大多数情况对用户的输入进行处理,只允许输入合法的值,其它值一概过滤掉。然而更进一步的话,可以对标签进行转换。\n\n对输入的内容做Html encode处理:\n\n```js\nfunction htmlEncode(str) {\n  return str\n    .replace(/&amp;/g, \"&amp;amp;\")\n    .replace(/</g, \"&lt;\")\n    .replace(/>/g, \"&gt;\")\n    .replace(/\"/g, \"&amp;quot;\")\n    .replace(/'/g, \"&amp;#x27;\")\n    .replace(/\\//g, \"&amp;#x2f;
318\")\n    .replace(/\\n/g, \"<br>\");\n}\n```\n\n比如用户输入:\n\n```html\n<iframe src=javascript:alert('xss');height=0 width=0></iframe>\n```\n\n保存后最终存储的会是:\n\n```html\n<iframe\n  src=\"javascript:alert(&amp;#x27;xss&amp;#x27;);height\"\n  =\"0\"\n  width=\"0\"\n></iframe>\n```\n\n之后在展现时浏览器会对这些字符转换成文本内容显示,而不是一段可执行的代码。\n\n另外自带SSL加成2333\n\n&nbsp;\n\n### 性能优化\n\n“在自己做一些小项目时,可能是学校的一些网站项目,流量可能日均都不超过500,而且大多是校园局域网内访问;或者是开发一些实验室的MIS系统,这辈子你都不会去使用你开发的这个系统。在这样一些项目中,性能优化往往会被你忽略。\n\n但是如果你是做一个日均PV数万、数十万、甚至更大的量级,开发的页面会被全国各地,不同网络条件的用户来进行访问。这个时候,性能问题就无法忽视了。在当今的网络条件下,如果你的页面3秒都无法完成首屏渲æ
318Ÿ“,一定会让你的网站流失很多用户。\n\n整个网站的性能优化有很多的环节和工作,大多数时候,不是前端工程师单独就能完成的,尤其在职能划分明确的公司中,往往需要前后端、运维、DBA等多个职位协同完成。所以,在我们的课程中,主要让你了解整个性能优化都涉及哪些方面的工作,同时,我们会专注介绍一些在前端领域可以重点关注的技术点。”\n\n&nbsp;\n\n### 模块化\n\n“对于一个复杂项目,特别是多人协作的复杂项目,如何合理划分模块,如何更加方便地进行模块加载,如何管理模块之间的依赖,是一个项目团队都会面临的问题,目前业界已经有了一些较为普遍的解决方案,如AMD。这个部分希望你能够通过学习JavaScript的模块化,学习如何合理地规划项目模块,合理使用模块化工具来优化你的项目代码结构。”\n\n经过调研,我决定使用RequireJS来实现。\n\n将JS的引用方式改成这样\n\n```html\n
318<script src=\"scripts/require.js\" data-main=\"scripts/main\"><\/script>\n```\n\n再改写下JS,把JS分为四个模块:主模块 gtd util selector。但总感觉分得不太好。。。只能准备答辩时候问下导师了。\n\n其中遇到了一个问题:\n\n有这样一个HTML结构\n\n```html\n<!DOCTYPE html>\n<html>\n  <head>\n    <meta charset=\"UTF-8\" />\n    <title>Demo</title>\n    <style>\n      div {\n        height: 100px;\n        width: 100px;\n        background: #eee;\n        margin: 10px;\n      }\n    </style>\n  </head>\n  <body>\n    <div onclick=\"myClick();\"></div>\n    <div onclick=\"myClick();\"></div>\n    <div onclick=\"myClick();\"></div>\n    
318<script src=\"js/main.js\"><\/script>\n  </body>\n</html>\n```\n\n对其进行模块化改造之后,显而易见的myClick不会再是全局函数,所以无法这样调用。\n\n于是我尝试在模块里进行click事件绑定:\n\n```js\ndefine(function () {\n  function init() {\n    var myDiv = document.getElementsByTagName(\"div\");\n    for (var i = 0; i < myDiv.length; i++) {\n      myDiv[i].addEventListener(\"click\", myClick(myDiv[i]));\n    }\n    myDiv[0].click();\n  }\n\n  function myClick(ele) {\n    ele.innerHTML = ele.innerHTML + \"click\";\n  }\n\n  return {\n    init: init,\n  };\n});\n```\n\n然而喜闻乐见地绑定错了,你们肯定看出来了,但是我当时没看出来,而且由于第5行那句间接调用了myClick(myDiv[i]),让我误以为是第10行调用的结果(这只是个Demo,当时的情况比这个复杂一些,这两句调用的结果的确差不多)。\n\n这样的结果就是click绑定的函数在模块内可以调用(误以为),但在页面中点击却没反应。\n\n然后我自作聪明地进行了一番推理:click事件绑定的myClick函数不是全局函数,只在模块内有效,而在页面中点击时会在全局调用myClick函数,所以没反应。\n\n看似有道理却不是这样的,[在V2EX发帖询问](https://www.v2ex.com/t/196957)之后,热心网友 [7anshuai](http://7anshuai.js.org/) 看出了绑定有误的问题。。\n\n然后改成这样就好了:\n\n```js\ndefine(function () {\n  function init() {\n    var myDiv = document.getElementsByTagName(\"div\");\n    for (var i = 0; i < myDiv.length; i++) {\n      myDiv[i].addEventListener(\"click\", myClick);\n    }\n    myDiv[0].click();\n  }\n\n  function myClick() {\n    this.innerHTML = this.innerHTML + \"click\";\n  }\n\n  return {\n    init: init,\n  };\n});\n```\n\n期间我还尝试过在模块里主动将函数暴露在全局空间里,像这样:\n\n```js\nwindow.myClick = myClick;\n```\n\n虽然有效,但真是烂爆了,幸亏没就这样算了。。。\n\n&nbsp;\n\n**6. 前端工程化**\n\n“业界目前有非常多的前端开发工具,完成一些开发过程中可以自动化完成的工作,提高研发效率,并且可以提高多人协作时的开发过程一致性,提高整个项目的运维效率。”\n\n经过调研,最终决定采用 Yeoman, Bower, Grunt 三个工具结合来进行工程化改造。\n\n根据慕课网教程([Grunt-beginner前端自动化工具](http://www.imooc.com/learn/30))整理的思维导图:![](./attachments/grunt.png.html)\n\n用 Yeoman 新建一个 webapp 项目(需翻墙),安装其他需要的包,改改配置文件,然后就可以享受各种自动化工具带来的无比高效、震撼的体验啦~\n\n我这里主要对代码做了 less编译 处理CSS前缀 HTML、CSS、JS压缩 文件名添加md5值 这几个处理,其中处理前的文件在app文件夹,处理后的文件在disk文件夹。\n\n&nbsp;\n\nDone,等待毕业答辩喽~"},{"slug":"1989","title":"百度前端技术学院编码挑战(TASK 0003)","tags":[],"body":"任务3已经发布,初级班的任务时间是从5月7日至5月18日,中级班为4月30日至5月10日。\n\nTASK 0003 内容:[https://github.com/baidu-ife/ife/tree/master/task/task0003](https://github.com/baidu-ife/ife/tree/master/task/task0003)\n\n我做的:[https://github.com/DIYgod/ife-work/tree/master/task0003](https://github.com/DIYgod/ife-work/tree/master/task0003)\n\n在线Demo: [https://www.anotherhome.net/file/ife/task0003/](https://www.anotherhome.net/file/ife/task0003/)\n\n本次任务累计花费时间10天(5.6-5.16 )\n\n下面是我做 TASK 0003 过程中的一些记录。\n\n---\n\n**1. JavaScript作用域** (参考 [鸟哥:Javascript作用域原理](http://www.laruence.com/2009/05/28/863.html) [理解 JavaScript 作用域和作用域链](http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html))\n\nJavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。\n\nJS 是有预编译的过程的, JS在执行每一段JS代码之前, 都会首先处理var关键字和function定义式(函数定义式和函数表达式)。\n在调用函数执行之前, 会首先创建一个活动对象, 然后搜寻这个函数中的局部变量定义,和函数定义, 将变量名和函数名都做为这个活动对象的同名属性, 对于局部变量定义,变量的值会在真正执行的时候才计算, 此时只是简单的赋为undefined。\n\n对代码优化的启示:\n\n从作用域链的结构可以看出,在运行期上下文的作用域链中,标识符所在的位置越深,读写速度就会越慢。因为全局变量总是存在于运行期上下文作用域链的最末端,因此在标识符解析的时候,查找全局变量是最慢的。所以,在编写代码的时候应尽量少使用全局变量,尽可能使用局部变量。一个好的经验法则是:如果一个跨作用域的对象被引用了一次以上,则先把它存储到局部变量里再使用。\n\n例如下面的代码:\n\n<pre class=\"lang:default decode:true \">function changeColor(){\n    document.getElementById(\"btnChange\").onclick=function(){\n        document.getElementById(\"targetCanvas\").style.backgroundColor=\"red\";\n    };\n}</pre>\n\n这个函数引用了两次全局变量document,查找该å
318˜é‡å¿…须遍历整个作用域链,直到最后在全局对象中才能找到。这段代码可以重写如下:\n\n<pre class=\"lang:default decode:true \">function changeColor(){\n    var doc=document;\n    doc.getElementById(\"btnChange\").onclick=function(){\n        doc.getElementById(\"targetCanvas\").style.backgroundColor=\"red\";\n    };\n}</pre>\n\n这段代码比较简单,重写后不会显示出巨大的性能提升,但是如果程序中有大量的全局变量被从反复访问,那么重写后的代码性能会有显著改善。\n\n&nbsp;\n\n**2. 高度自适应** (参考 [CSS布局奇淫技巧之-高度自适应](http://www.cnblogs.com/2050/archive/2012/07/30/2615260.html))\n\n高度自适应不像宽度自适应那样简单,在兼容浏览器方面也稍微复杂一些。\n\n然而直接写 height: 100%; 并没有什么卵用,要这样做:\n\n<pre class=\"lang:default decode:true \">position: absolute;\ntop: 60px;\nbottom: 0;</pre>\n\n&nbsp;\n\n**3\\. 莫名其妙出现又莫名其妙自己消失的空隙**\n\n事情是这样的,昨天(5月12日)页面一切正常,今天早上起床后并没改动代码,刷新了一下页面,页面居然变了,设置 overflow: scroll CSS属性的元素右侧和下侧都出现了空隙,如图所示:\n\n![task0003_1](./attachments/bafkreibkrpsb5w4qexah2eowv2sdbgjftq6sjoayjwtjf2lxamnn75jsca.jpeg)\n\n![task0003_2](./attachments/bafkreiemtgdhgyhtgcslczg7wwu4qv26rh2vzc4ac5lizml5yu2jsmpv7q.jpeg)\n\n而如果把overflow: scroll属性去掉空隙就消失。测试 Chrome Safari 均出现了这种情况,而且尝试了清空缓存,无解。于是将此时的代码commitå¹¶push到了github。\n\n到了下午,同一标签页,同一页面,刷新,bug自己消失了,而此时代码与上午相比只有很少且无关紧要的改动,再次commitå¹¶push到github(所有改动[在github有记录](https://github.com/DIYgod/ife-work/commit/df0e0bf051852bb1e4593c6dae3ff11cfa9c34ce)),再次截图:\n\n![task0003_3](./attachments/bafkreicuyetvfiwiene2shdc45tvv45juoelm6a6nb277dgtnrqukgytee.jpeg)\n\n注意:两次出现变化后都尝试测试了Chrome和Safari浏览器并清空了缓存。\n\n到此为止毫无头绪并无法重现,实在没办法再深究下去。\n\n猜测是Mac的Bug。\n\n&nbsp;\n\n**4. JavaScript对象与JSON文本的相互转换** (参考 [JavaScript对象与JSON字符串的相互转换](http://blog.csdn.net/yaerfeng/article/details/7292000) [JSON 教程 - W3CSCHOOL](http://www.w3cschool.cc/json/json-tutorial.html))\n\neval函数:JSON文本转换为JavaScript对象;调用JavaScript编辑器;非常快速,但可能会出现安全性问题\n\n<pre class=\"lang:js decode:true\">var obj = eval('(' + JSONTest + ')');</pre>\n\n使用JSON解析器:\n\nJSON.parse 函数:将JSON文本转换为JavaScript对象\n\n<pre class=\"lang:js decode:true\">JSON.parse(text[, reviver])</pre>\n\nJSON.stringify 函数:将JavaScript对象转换为JSON文本\n\n<pre class=\"lang:js decode:true\">JSON.stringify(value[, replacer[, space]])</pre>\n\n&nbsp;\n\n**5. textarea 和 input 大小比预期大了一些**\n\n多谢[李胜](http://www.lishengcn.cn/)的帮助\n\n这个问题其实很简单但我没想到,刚开始挺莫名其妙的,如下:\n\nSee the Pen [RPaJpb](http://codepen.io/DIYgod/pen/RPaJpb/) by DIYgod ([@DIYgod](http://codepen.io/DIYgod)) on [CodePen](http://codepen.io).\n\n
318<script src=\"//assets.codepen.io/assets/embed/ei.js\" async=\"\"><\/script>\n\n问题是textarea和input比设置的宽度多了6px,强迫症看了浑身难受。实际上是因为这两个元素有默认的 2px padding和 1px border,在这两个元素的CSS部分加上\n\n<pre class=\"lang:default decode:true \">padding: 0;\nborder: 0;</pre>\n\n或者更优雅一些\n\n<pre class=\"lang:default decode:true \">-webkit-box-sizing: border-box;\n-moz-box-sizing: border-box;\nbox-sizing: border-box;</pre>\n\n就好了。\n\n&nbsp;\n\n☆ミ(o\\*・ω・)ノ完结散花 等待review"},{"slug":"1982","title":"百度前端技术学院编码挑战(TASK 0002)","tags":[],"body":"TASK 0002 已经发布,初级班的任务时间是从4月24日至5月7日,中级班为4月18日至4月25日。\n\nTASK 0002 内容:[https://github.com/baidu-ife/ife/tree/master/task/task0002](https://github.com/baidu-ife/ife/tree/master/task/task0002)\n\n我做的:[https://github.com/DIYgod/ife-work/tree/master/task0002](https://github.com/DIYgod/ife-work/tree/master/task0002)\n\n在线Demo: [https://www.anotherhome.net/file/ife/task0002/task0002_1.html](https://www.anotherhome.net/file/ife/task0002/task0002_1.html)\n\n本次任务累计花费时间17天(4.19-5.6 )\n\n下面是我做 TASK 0002 过程中的一些记录。<!--more-->\n\n---\n\n**1. JavaScript 的性能优化 **(参考 [JavaScript 的性能优化:加载和执行](http://www.ibm.com/developerworks/cn/web/1308_caiys_jsload/index.html))\n\n· Web 开发人员一般习惯在 &lt;head&gt; 中加载外链的 JavaScript,接着用 &lt;link&gt; 标签用来加载外链的 CSS 文件或者其他页面信息。然而这种常规的做法却隐藏着严重的性能问题——脚本会阻塞页面其他资源的下载。因此推荐将所有&lt;script&gt;标签尽可能放到&lt;body&gt;标签的底部,以尽量减少对整个页面下载的影响。\n\n· 由于每个&lt;script&gt;标签初始下载时都会阻塞页面渲染,所以减少页面包含的&lt;script&gt;标签数量有助于改善这一情况。\n\n· 减少 JavaScript 对性能的影响其他方法见参考。\n\n&nbsp;\n\n**2\\. `==` 与 `===`** (参考 [Javascript中双等号“==”和三等号“===”的区别](http://www.weste.net/2013/3-1/89405.html) [JavaScript里面三个等号和两个等号的区别](http://www.cnblogs.com/litsword/archive/2010/07/22/1782933.html) [JavaScript编码规范](https://github.com/ecomfe/spec/blob/master/javascript-style-guide.md#%E5%BC%BA%E5%88%B6-%E5%9C%A8-equality-expression-%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%B1%BB%E5%9E%8B%E4%B8%A5%E6%A0%BC%E7%9A%84-%E4%BB%85%E5%BD%93%E5%88%A4%E6%96%AD-null-%E6%88%96-undefined-%E6%97%B6%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8--null))\n\n`==`:等于运算,但是不比较值的类型;\n`===`:完全等于运算,不仅比较值,而且还比较值的类型,只有两者一致才为真。\n\n百度JavaScript编码规范也规定:在 Equality Expression 中强制使用类型严格的 `===`。仅当判断 null 或 undefined 时,允许使用 `== null`。因为使用 `===` 可以避免等于判断中隐式的类型转换。\n\n&nbsp;\n\n**3. 类型检测** (参考 [JavaScript编码规范](https://github.com/ecomfe/spec/blob/master/javascript-style-guide.md#%E5%BC%BA%E5%88%B6-%E5%9C%A8-equality-expression-%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%B1%BB%E5%9E%8B%E4%B8%A5%E6%A0%BC%E7%9A%84-%E4%BB%85%E5%BD%93%E5%88%A4%E6%96%AD-null-%E6%88%96-undefined-%E6%97%B6%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8--null) [Javascript数组类型检测:编写更强壮的isArray函数](http://scriptfans.iteye.com/blog/318821) [Javascript 判断函数类型完美解决方案](http://www.jb51.net/article/19841.htm))\n\n通用的简易做法:类型检测优先使用 `typeof`。对象类型检测使用 `instanceof`。null 或 undefined 的检测使用 `== null`\n\n<pre class=\"lang:default decode:true \">// string\ntypeof variable === 'string'\n\n// number\ntypeof variable === 'number'\n\n// boolean\ntypeof variable === 'boolean'\n\n// Function\ntypeof variable === 'function'\n\n// Object\ntypeof variable === 'object'\n\n// RegExp\nvariable instanceof RegExp\n\n// Array\nvariable instanceof Array\n\n// null\nvariable === null\n\n// null or undefined\nvariable == null\n\n// undefined\ntypeof variable === 'undefined'</pre>\n\n判断数组类型:得到对象的字符串表示,然后对比此字符串是否是'[object Array]'\n\n<pre class=\"lang:default decode:true \">function isArray(arr) {\n    return Object.prototype.toString.call(arr) === '[object Array]';\n}</pre>\n\n9.20更新:下面这样也可以\n\n<pre class=\"lang:default decode:true\">function isArray(arr) {\n    return Array.isArray(arr);\n}</pre>\n\n判断函数类型:首先保证测试的对象存在,并将其序列化成含有“function”的字符串,这个是我们检测的基础(fn.constructor != String,fn.constructor != Array, and fn.constructor != RegExp)。另外,我们需要保证声明的函数不是一个DOM节点(fn.nodeName)。然后,我们就可以作toString测试。如果我们将一个函数转换成字符串,在一个浏览器中(fn+\"\")给我们的结果就像这样“function name(){...}”。现在,判断它是否为函数就很简单,仅仅只需要判断字符串中是否包含单词“function”。这很神奇,对于任何有问题的函数,在所有浏览器中都能得到我们所需要的结果。这个函数较之于传统的方法,运行速度有些不尽人意,作者(John Resig
318)建议我们保守使用。\n\n<pre class=\"lang:default decode:true\">function isFunction(fn) {\n        return !!fn\n        &amp;&amp; !fn.nodeName\n        &amp;&amp; fn.constructor != String\n        &amp;&amp; fn.constructor != RegExp\n        &amp;&amp; fn.constructor != Array\n        &amp;&amp; /function/i.test(fn + '');\n}</pre>\n\n9.20更新:上面那种太麻烦,可以类似Array那样判断\n\n<pre class=\"lang:default decode:true\">function isFunction(fn) {\n    return Object.prototype.toString.call(fn) === '[object Function]';\n}</pre>\n\n复制Array的简单做法:\n\n<pre class=\"lang:default decode:true\">var a1 = [1, 2, 3]\nvar a2 = a1.slice(0);</pre>\n\n&nbsp;\n\n**4. 类型转换** (参考 [JavaScript编码规范](https://github.com/ecomfe/spec/blob/master/javascript-style-guide.md#%E5%BC%BA%E5%88%B6-%E5%9C%A8-equality-expression-%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%B1%BB%E5%9E%8B%E4%B8%A5%E6%A0%BC%E7%9A%84-%E4%BB%85%E5%BD%93%E5%88%A4%E6%96%AD-null-%E6%88%96-undefined-%E6%97%B6%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8--null))\n\nnumber -&gt; string:\n\n<pre class=\"lang:default decode:true \">num + '';</pre>\n\nstring -&gt; number:\n\n<pre class=\"lang:default decode:true \">+str;\n\nvar width = '200px';  // 要转换的字符串结尾包含非数字并期望忽略时,使用 parseInt\nparseInt(width, 10);</pre>\n\n-&gt; boolean:\n\n<pre class=\"lang:default decode:true \">var num = 3.14;\n!!num;</pre>\n\nnumber 去除小数点:\n\n<pre class=\"lang:default decode:true \">var num = 3.14;\nMath.ceil(num);</pre>\n\n&nbsp;\n\n**5. 对有序集合进行遍历时,缓存 length** (参考 [JavaScript编码规范](https://github.com/ecomfe/spec/blob/master/javascript-style-guide.md#%E5%BC%BA%E5%88%B6-%E5%9C%A8-equality-expression-%E4%B8%AD%E4%BD%BF%E7%94%A8%E7%B1%BB%E5%9E%8B%E4%B8%A5%E6%A0%BC%E7%9A%84-%E4%BB%85%E5%BD%93%E5%88%A4%E6%96%AD-null-%E6%88%96-undefined-%E6%97%B6%E5%85%81%E8%AE%B8%E4%BD%BF%E7%94%A8--null))\n\n虽然现代浏览器都对数组长度进行了缓存,但对于一些宿主对象和老旧浏览器的数组对象,在每次 length 访问时会动态计算元素个数,此时缓存 length 能有效提高程序性能。\n\n<pre class=\"lang:default decode:true \">for (var i = 0, len = elements.length; i &lt; len; i++) {\n    var element = elements[i];\n    // ......\n}</pre>\n\n&nbsp;\n\n**6\\. document.body.scrollTop与document.documentElement.scrollTop获取滚动条滚动的距离的坑** (参考 [document.body.scrollTop与document.documentElement.scrollTop兼容](http://jo2.org/document-body-scrolltop%E4%B8%8Edocument-documentelement-scrolltop%E5%85%BC%E5%AE%B9/) [用Javascript获取页面元素的位置](http://www.ruanyifeng.com/blog/2009/09/find_element_s_position_using_javascript.html) [火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题](http://www.csdn123.com/html/blogs/20130516/13275.htm))\n\n参考阮一峰的教程写了下面一段:\n\n<pre class=\"lang:default decode:true\">if (document.compatMode == \"BackCompat\"){\n    var elementScrollLeft=document.body.scrollLeft;\n} else {\n    var elementScrollLeft=document.documentElement.scrollLeft; \n}</pre>\n\n没想到遇到了坑,结果elementScrollLeft总是0,调试结果如下:\n\n![task0002_1](./attachments/bafkreif5xys73v2hg3secbetyag4gyyqkbqv2xmiwqndz3b467o6wifo7y.png)\n\n好坑啊,说好的如果有文档声明(即网页第一句的docType)的情况下,document.compatMode 的值等于 \"CSS1compat\",标准浏览器是只认识documentElement.scrollTop的啊。\n\n另外试了一下IE和Firefox,均可认documentElement.scrollTop,chrome的错!\n\n还好document.body.scrollTop与document.documentElement.scrollTop两者有个特点,就是同时只会有一个值生效。比如document.body.scrollTop能取到值的时候,document.documentElement.scrollTop就会始终为0;反之亦然。所以可以这样写:\n\n<pre class=\"lang:default decode:true\">var scrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft;\nvar scrollTop = document.body.scrollTop + document.documentElement.scrollTop;</pre>\n\n&nbsp;\n\n**7\\. 获取所有DOM元素**\n\n突然脑洞大开想到的\n\n<pre class=\"lang:default decode:true \">var ele = document.getElementsByTagName('*');</pre>\n\n&nbsp;\n\n**8\\. 真假判断**\n\n对象总为true,基础类型看是否为空\n\n<pre class=\"lang:js decode:true \">!![]    // true\n!!{}    // true\n!!''    // false\n!!0     // false</pre>
318\n\n容易把空数组误以为是false!\n\n容易把空数组误以为是false!\n\n容易把空数组误以为是false!\n\n重要的事情要说三遍!\n\n&nbsp;\n\n**9. 递归获取所有子元素**\n\n这个是有问题的,只能获取到下一级的子元素:\n\n<pre class=\"lang:default mark:2 decode:true\">var childs = function (element) {\n    var allchilds = [];\n    var childn = element.childNodes;\n    if (childn.length !== 0) {\n        for (var i = 0, len = childn.length; i &lt; len; i++) {\n            allchilds.push(childn[i]);\n            allchilds.concat(childs(childn[i]));\n        }\n    }\n    return allchilds;\n}</pre>\n\n但如果改成这样就能获取所有子元素了:\n\n<pre class=\"lang:default mark:1 decode:true\">var allchilds = [];\nvar childs = function (element) {\n    var childn = element.childNodes;\n    if (childn.length !== 0) {\n        for (var i = 0, len = childn.length; i &lt; len; i++) {\n            allchilds.push(childn[i]);\n            allchilds.concat(childs(childn[i]));  //或者 childs(childn[i]);\n        }\n    }\n    return allchilds;\n}</pre>\n\n<del>第一段代码出现问题的原因未知,已经想一晚上了,并无进展。</del>\n\n另外调试过程中发现的诡异现象:\n\n![task0002_2](./attachments/bafkreib6q7eco4fqx64woandbtoodanjmv3jy3eh7eoljndhadaca2usvi.png)\n\n解释下:递归调用时返回值allchilds是正确的,但返回到上一层时并没有加到上一层的allchilds中。\n\n[月月](http://blog.yueyue.moe/archives/17/) 告诉我这句话有问题!\n\n<pre class=\"lang:default mark:2 decode:true\">allchilds.concat(childs(childn[i]));</pre>\n\nw3school如是说:concat() 方法用于连接两个或多个数组。\n该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。仅仅会返回被连接数组的一个副本。仅仅会返回被连接数组的一个副本。\n\n一切都说通了。。\n\n所以根本不关allchilds声明位置的事,debug的方向一直都不对,要这样改:\n\n<pre class=\"lang:default decode:true \">var childs = function (element) {\n    var allchilds = [];\n    var childn = element.childNodes;\n    if (childn.length !== 0) {\n        for (var i = 0, len = childn.length; i &lt; len; i++) {\n            allchilds.push(childn[i]);\n            allchilds = allchilds.concat(childs(childn[i]));\n        }\n    }\n    return allchilds;\n}</pre>\n\n万万没想到,在 [月月](http://blog.yueyue.moe/archives/17/) [李胜](http://www.lishengcn.cn/) [蛋炒饭](http://blog.wedc.cc/) 的帮助下千辛万苦终于完成了这个小函数。。。\n\n后续:突然想到这样就能轻易获取到\n\n<pre class=\"lang:default decode:true \">element.getElementsByTagName('*');</pre>\n\n已吐血\n\n&nbsp;\n\n**10\\. 数组合并** (参考 [JavaScript concat() 方法](http://www.w3school.com.cn/jsref/jsref_concat_array.asp))\n\n重要的事情要另外单独说。因为被坑惨了。\n\nconcat() 方法用于连接两个或多个数组。\n\n该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。\n\n该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。\n\n该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。\n\n错误用法:\n\n<pre class=\"lang:default decode:true\">arr1.concat(arr2);</pre>\n\n正确用法:\n\n<pre class=\"lang:default decode:true\">arr1 = arr1.concat(arr2);</pre>\n\n&nbsp;\n\n**11\\. 事件代理** (参考 [javascript事件代理](http://www.cnblogs.com/rubylouvre/archive/2009/08/09/1542174.html))\n\n在编程中,如果我们不想或不能够直接操纵目标对象,我们可以利用delegate创建一个代理对象来调用目标对象的方法,从而达到操纵目标对象的目的。毋庸置疑,代理对象要拥有目标对象的引用。\n\n<del>可以用事件代理的方法来优雅地用一个函数代理另一个函数,比如:</del>\n\n<pre class=\"lang:default decode:true\"><del>
318var delegate = function (method) {\n    return function() {\n        return method.apply(null, arguments);\n    }\n}\n\nvar on = delegate(addEvent);\nvar un = delegate(removeEvent);</del></pre>\n\n<del>这样就能优雅地用 on un 函数代理 addEvent removeEvent 函数了。这样实现了目标对象的隐藏,这对于我们保护一些核心对象是非常有用的。</del>\n\n我错了,直接这样就行了。。\n\n&nbsp;\n\n<pre class=\"lang:default decode:true \">var on = addEvent;\nvar un = removeEvent;</pre>\n\n&nbsp;\n\n**12. Object相关** (参考 [js的Object到底是什么呢?](http://www.cnblogs.com/coolicer/archive/2010/10/13/1850131.html))\n\nArray、Boolean、Date、Function、Number等等对象,其实都是从Object来的,它们的祖先都是Object。它们表现不同的语言特性,比如Array有被自动管理的length属性,Boolean只有true或false取值,Date表示时间结构,Function可以被运行,都是它们的原始类型(valueOf)赋予它们的能力。\n\n所以有些有趣的东西:\n\n<pre class=\"lang:default decode:true\">function f() {\n    alert('f1');\n}\nf.c = function() {\n    alert('c1');\n}\n\nf();\nf.c();</pre>\n\n可以给函数设置一个也是函数的属性。\n\n&nbsp;\n\n**13\\. JavaScript正则表达式分组** (参考 [JavaScript 正则表达式 选择、分组和引用](http://www.xiaoxiaozi.com/2009/08/04/1306/))\n\n例:\n\n<pre class=\"lang:default decode:true\">function getCookie(cookieName) {\n    var re = new RegExp(cookieName + '=(.*?)($|;)');\n    return re.exec(document.cookie)[1];\n}</pre>\n\n其中re.exec(document.cookie)是一个数组,第一个元素是正则式所有匹配出的字符,第二个元素是匹配的第一个分组,即第一个括号里的内容:(.\\*?)\n\n分组就就是正则表达式中的子表达式,可以用来获取正则式匹配出的字符串中的特定部分。\n\n9.20更新:当使用构造函数创造正则对象时,需要常规的字符转义规则(在前面加反斜杠 \\)。比如,以下是等价的:\n\n<pre class=\"lang:default decode:true \">var re = new RegExp(\"\\\\w+\");\nvar re = /\\w+/;</pre>\n\n&nbsp;\n\n**14. JavaScript跨域** (参考 [JavaScript跨域总结与解决办法](http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html))\n\nJavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。\n\n具体限制及解决办法见参考。\n\n&nbsp;\n\n**15\\. JavaScript月份多出一** (参考 [JS 中 new Date 怎么就多一个月了?](http://www.cftea.com/c/2010/06/4KJ75KPG9NBFEIA1.asp) [JavaScript——搞甘特图使用 Date 对象时遇到的问题](http://www.cnblogs.com/liuning8023/archive/2012/12/15/2819728.html))\n\n![task0002_4](./attachments/bafkreie74cdr4c27ce6sbxqrfzjznvh2slfhaiswqhex3vqjvrdltzoynq.png)\n\n明明设置的时5月,结果却是6月。\n\n实际中,我们数月份不是从 0 开始,但是 JavaScript 却是从 0 开始。JS中的0月是我们的1月,JS中的1月是我们的2月...\n\n所以设置月份时记得减一,获取月份时记得加一。。\n\n&nbsp;\n\n**15\\. 计时器不会阻塞代码执行**\n\n![task0002_5](./attachments/bafkreibx54dwr6xk6cdtxp6m7hlmo66ppuus5p5azq4num55lgfpbyszcy.png)\n\n我的本意是执行完 a() 再输出b,没想到b先输出了,从这里也可以推测出,计时器并不会阻塞后面语句的执行。\n\n&nbsp;\n\n☆ミ(o\\*・ω・)ノ完结散花 等待review"},{"slug":"1969","title":"百度前端技术学院编码挑战(TASK 0001)","tags":[],"body":"[百度Web前端技术学院](https://github.com/baidu-ife/ife)(Baidu Institute of Front-End Technology简称IFE)是一个由百度EFE团队、百度人力资源部校园招聘组联合出品的、面向在校大学生的前端培训组织,借助百度大量优秀的前端工程师以及丰富的前端知识积累,帮助大学生们更加高效、系统地学习Web前端技术。\n\n百度Web前端技术学院已正式开学,我有幸成为了第一期的初级班学员,可以和菊苣们一起玩耍啦~\n\n想一起学但是没录取的可以加群:438966405\n\n---\n\nTASK 0001 发布,初级班Review提交截止时间为4月23日,中级班为4月16日。\n\nTASK 0001 内容:[https://github.com/baidu-ife/ife/tree/master/task/task0001](https://github.com/baidu-ife/ife/tree/master/task/task0001)(还设置了1-6小节照顾我这样的弱菜,大赞~)\n\n我做的:[https://github.com/DIYgod/ife-work/tree/master/task0001](https://github.com/DIYgod/ife-work/tree/master/task0001)\n\n在线Demo: [https://www.anotherhome.net/file/ife/task0001/](https://www.anotherhome.net/file/ife/task0001/)\n\n本次任务累计花费时间6天(4.13-4.19 )\n\n下面是我做 TASK 0001 过程中的一些记录。\n\n<!--more-->\n\n&nbsp;\n\n**1. position 属性**(参考 [CSS 定位-W3School](http://www.w3school.com.cn/css/css_positioning.as
318p)、[CSS+DIV布局中absolute和relative](http://selfcontroller.iteye.com/blog/1826119))\n\nposition 属性比较重要,但自己看的时候没看很明白,马马虎虎略过了,于是做任务的时候就出了莫名其妙的问题,在蛋炒饭的帮助才发现是因为 position 属性没搞懂。\n\n用自己的话简单总结一下:position属性有四个属性值:static relative absolute fixed。 static 为默认,元素框正常生成,出现在 normal flow 中;relative 使元素框偏移某个距离,原本所占的空间仍保留,也是出现在 normal flow 中;absolute 使元素框跳出 normal flow 完全删除,并相对于其包含块定位,原本所占的空间消失;fixed 同样使元素框跳出 normal flow,相对于浏览器窗口进行定位。\n\n&nbsp;\n\n**2\\. 浮动元素及其后续非浮动元素填充的位置**(参考 [CSS float 浮动属性](http://www.cnblogs.com/polk6/archive/2013/07/25/3142187.html))\n\n当时的情况是这样的:HTML部分:\n\n<pre class=\"lang:default decode:true\">&lt;div id=\"div6\"&gt;\n    &lt;div class=\"div6-a\"&gt;&lt;/div&gt;\n    &lt;div class=\"div6-b\"&gt;&lt;/div&gt;\n    &lt;div class=\"div6-c\"&gt;&lt;/div&gt;\n&lt;/div&gt;</pre>\n\nCSS部分:\n\n<pre class=\"lang:css decode:true\">#div6 {\n    margin-bottom: 10px;\n}\n.div6-a {\n    float: left;\n    width: 50px;\n    height: 50px;\n    background: #f00;\n}\n.div6-b {\n    margin: 0 50px;\n    height: 50px;\n    background: #00f;\n}\n.div6-c {\n    float: right;\n    width: 50px;\n    height: 50px;\n    background: #ff0;\n}</pre>\n\n结果出现问题:\n![TASK0001_2](./attachments/bafkreibwbacdy7hulempknxbnw2bw2zmnl5cdci6k75co6trs7t2op2ria.png)\n\n黄色的C元素跑到下一行去了\n\n尝试了下先把C元素flow到右侧再填充B元素,即:\n\nHTML部分:\n\n<pre class=\"lang:default decode:true\">&lt;div id=\"div6\"&gt;\n    &lt;div class=\"div6-a\"&gt;&lt;/div&gt;\n    &lt;div class=\"div6-c\"&gt;&lt;/div&gt;\n    &lt;div class=\"div6-b\"&gt;&lt;/div&gt;\n&lt;/div&gt;</pre>\n\n达到预期结果: \n![TASK0001_1](./attachments/bafkreic7m3hvzdwwrsmwsmnrl7y7by4tg3nwykbzpij5kcbkcpl6wddjta.png)\n\n原因:浮动元素在文档流空出的位置,由后续的(非浮动)元素填充上去:块级元素直接填充上去,若跟浮动元素的范围发生重叠,浮动元素覆盖块级元素;内联元素则有空隙就插入。\n\n所以加入C元素后再加入B元素时,B元素直接填充到A C元素的同一行;加入B元素后再加入C元素时,由于B元素一行没有空隙,C元素浮动到下一行。\n\n&nbsp;\n\n**3\\. 负边距(negative margin)**(参考 [CSS布局奇淫巧计之-强大的负边距](http://www.cnblogs.com/2050/archive/2012/08/13/2636467.html))\n\n[圣杯布局、双飞翼布局](http://www.imooc.com/wenda/detail/254035)都用了负边距对浮动元素的影响的原理,某个元素虽然写在了后面,但可以通过负边距让它在浏览器显示的时候是在前面的,具体见参考,写得非常好。\n\n&nbsp;\n\n**4. 清除浮动**(参考 [那些年我们一起清除过的浮动](http://www.iyunlu.com/view/css-xhtml/55.html))\n\n做浮动布局那题时,装蓝色方块的红色容器总是显示不出来,用F12看到红色容器的高度不知道为什么变成了0,于是参考双飞翼布局的代码,发现双飞翼布局在父级元素设置了一个 overflow: hidden 的属性,我尝试了一下给红色容器也加上 overflow: hidden 属性,高度居然神奇地可以自适应了,十分不理解。\n\n经过蛋炒饭的指点知道了,子级元素都是 flow 属性的时候,会造成父级元素没有高度,而 overflow: hidden 有清除浮动的效果,所以加上后会使父级恢复高度(overflow: hidden 清除浮动的原理见参考)。\n\n&nbsp;\n\n到此为止,花了两天时间,已经完成了1-6节实战小练习的内容,成果见:[https://www.anotherhome.net/file/ife/task0001-16/task0001.html](https://www.anotherhome.net/file/ife/task0001-16/task0001.html)\n\n下面就是综合练习了,看起来就好难。。\n\n&nbsp;\n\n**5. absolute 元素的定位**(参考 [CSS 中,为什么绝对定位(absolute)的父级元素必须是相对定位(relative)?-知乎](http://www.zhihu.com/question/19926700))\n\n写第七题中导航栏的时候需要用到绝对定位,但绝对定位是相对谁定位呢?之前一直没搞清楚。\n\nabsolute 元素的定位是上溯父级元素,找第一个不是 static 的元素,以其为 absolute 的基准。如果父级元素全都没有设置(static),则里面的绝对定位以 body 定位。\n\n所以一般的做法是将想作为基准的父级元素加上 position: relative 属性。\n\n&nbsp;\n\n**6. 图片的 4px 空白间距**(参考 [Why does container div insist on being slightly larger than its content? -stackoverflow](http://stackoverflow.com/questions/11126685/why-does-container-div-insist-on-being-slightly-larger-than-its-content))\n\n插入顶部图片时候发现了一个很诡异的问题,见图:\n\n图片高度500px\n![TASK0001_3](./attachments/bafkreic54ntz6xptclvviusearvm4vo5eh732c7tyks5zhkbja3jgyddbq.png)\n\n父级高度504px\n![TASK0001_4](./attachments/bafkreietca7vcbmmef7yjxpbbtlg6stobnjrqabc5hw3s72i6ionsyaenq.png)\n\n多出来4px。。。\n\n网上搜了下基本上都是因为设置[inline-block元素才出现的空白间距](http://www.w3cplus.com/css/fighting-the-space-between-inline-block-elements),但我没有inline-block元素呀。但是可以通过类似的方法消除4px间距,我用了设置父元素的字体大小为0的方法解决。\n\n我已经将上述问题的代码化简后传到了服务器上,有兴趣的可以帮我看一下:[https://www.anotherhome.net/file/ife/task0001-7_problem/](https://www.anotherhome.net/file/ife/task0001-7_problem/)\n\nUpdate:多谢 [天然傲娇](http://saintwinkle.com/),原因已了解
318,&lt;img&gt; 默认是inline元素(内联元素、行内元素),计算高度时要加上 line-height 的默认值(4px)。\n\n来自stackoverflow:\n\n> Since an &lt;img&gt; is an inline element by default, it's height is calculated differently as related to the default line-height value.\n>\n> On inline elements, the line-height CSS property specifies the height that is used in the calculation of the line box height.\n>\n> On block level elements, line-height specifies the minimal height of line boxes within the element.\n> &nbsp;\n\n**7. CSS控制DIV两列左右高度一致**(参考 [CSS控制DIV两列左右高度一致](http://www.l3c.cn/plus/view.php?aid=8))\n\ncontent为父级元素,多个post作为子级元素,目的是使post高度保持一致。\n\n<pre class=\"lang:default decode:true\">.content {\n    width: 980px;\n    overflow: hidden;\n}\n\n.post {\n    width: 320px;\n    float: left;\n    margin-bottom: -10000px;\n    padding-bottom: 10000px;\n    background: #fff;\n}</pre>\n\n我是这样理解的:通过 padding-bottom: 10000px,外边距和内边距同时加10000px,再通过 margin: -10000px,内边距同时减10000px,然后,在没达到同一高度时,较长的元素的外边距跟着减小,而较短的元素外边距不变,达到同一高度后,较长元素和较短元素外边距同时减小。结果就高度一致了。\n\n&nbsp;\n\n**8. tr边框**(参考 [CSS如何修改tr边框属性](http://blog.csdn.net/chenssy/article/details/8453495))\n\n像这样在CSS中直接给tr设置边框不起作用,而如果指定td的边框又会有间断的现
318象出现\n\n<pre class=\"lang:default decode:true\">tr {\n    border: 1px  solid #000;\n}</pre>\n\n如果同时给table设置border-collapse属性,tr设置的边框就能出现了\n\n<pre class=\"lang:default decode:true\">table {  \n    border-collapse: collapse;\n}\n\ntr {\n    border: 1px  solid #000;\n}</pre>\n\n原因见参考\n\n&nbsp;\n\n**TASK0001 全部完成:**\n\n第七题 Demo:[https://www.anotherhome.net/file/ife/task0001/](https://www.anotherhome.net/file/ife/task0001/)\n\n1-6题 Demo:[https://www.anotherhome.net/file/ife/task0001-16/task0001.html](https://www.anotherhome.net/file/ife/task0001-16/task0001.html)\n\n&nbsp;\n\n☆ミ(o\\*・ω・)ノ完结散花 等待review\n\n&nbsp;\n\nReview结束,根据导师的建议修改及总结如下:\n\n**9\\. 删除 lang=\"zh-CN\"** (参考 [网页头部的声明应该是用 lang=\"zh\" 还是 lang=\"zh-cn\"?](http://www.zhihu.com/question/20797118))\n\n修改:\n\n<pre class=\"lang:default decode:true \">&lt;head lang=\"zh-CN\"&gt;\n\n&lt;head&gt;</pre>\n\n单一的 zh 和 zh-CN 均属于废弃用法。\n\n看了下百度 淘宝 微博等网站均没有写lang属性,可以放心删掉啦。\n\n&nbsp;\n\n**10\\. 使用h1标签** (参考 [HTML之h1 h2 h3 h4标签知识经验篇 - DIVCSS5](http://www.divcss5.com/html/h328.shtml))\n\n修改:\n\n<pre class=\"lang:default decode:true\">&lt;div class=\"logo\"&gt;\n    &lt;a href=\"index.html\"&gt;&lt;img src=\"img/logo.png\" alt=\"logo\" width=\"200px\"&gt;&lt;/a&gt;\n&lt;/div&gt;\n\n&lt;h1 class=\"logo\"&gt;\n    &lt;a href=\"index.html\"&gt;&lt;img src=\"img/logo.png\" alt=\"logo\" width=\"200px\"&gt;&lt;/a&gt;\n&lt;/h1&gt;</pre>\n\nh1 h2 h3 h4 标题标签常常使用在一个网页中唯一标题、重要栏目、重要标题等情形下。\n\n其中 h1 在一个网页中最好只使用一次,如对一个网页唯一标题使用。\n\n在一个网页中可以适当使用h1 h2 h3 h4标签,有利于网页的重点部分突出,同时也利于搜索引擎排名。\n\n看到淘宝也是这样做的,在logo的代码外包了一个h1标签。\n\n&nbsp;\n\n**11\\. 其他修改**\n\n没想到在a标签上用class,多套了一层div:\n\n<pre class=\"lang:default decode:true \">&lt;div class=\"icon-github\"&gt;\n    &lt;a href=\"https://github.com/DIYgod\" target=\"_blank\"&gt;&lt;img src=\"img/icon-github.png\"&gt;&lt;/a&gt;\n&lt;/div&gt;\n\n&lt;a class=\"icon-github\" href=\"https://github.com/DIYgod\" target=\"_blank\"&gt;&lt;img src=\"img/icon-github.png\"&gt;&lt;/a&gt;</pre>\n\n命名:\n\n<pre class=\"lang:default decode:true\">&lt;div class=\"description\"&gt;\n\n&lt;div class=\"banner\"&gt;</pre>\n\n将&lt;hr&gt;用border代替:\n“不推荐&lt;hr&gt;,用上下容器的border来代替吧\n当我不需要这条线的时候,只需要改变样式即可,不需要改动html”\n\n使用ul li或者dl之类的列表语义的dom。\n\n&nbsp;"},{"slug":"1826","title":"博客又搬新家啦","tags":[],"body":"眼看 Google Adsense 已经100多美元马上就能提现了,加上想买个vps跑Python爬虫,就新入了 Linode 1GB,感觉超爽。\n\n感谢离开恒创这段时间收留我的 [TECHNETCAL](http://technetcal.com/) [音符](https://freedom.moe/) ,还有一个奇葩说是要赞助我然后过几天就把我赶走了的主机商\n\n另外整理了一下友链,移除部分 软件分享类 网赚类 私自移除我的链接 的友链(恕不另行通知,如有疑问请联系我);还有一些貌似死掉的:\n\n<pre class=\"lang:default decode:true \">http://wanan.me/\nhttp://www.12s.me/\nhttp://blog.juanzii.me/\nhttp://www.gazyip.com/\nhttp://blog.aixinyongshi.cn/\nhttp://shana.me/\nhttp://waysmaker.com/</pre>\n\n如果还活着请马上与我联系。\n\n鉴于友链已经多至80多个,为了限制数量,所以友链从此不再来者不拒,新增友链要求如下:\n\n1\\. 无侵权内容,包括但不限于 盗版软件 盗版视频 未署名转载文章,跟我玩得好的允许少量存在(我就是要双重标准,不服咬我呀٩(๑`н´๑)۶)\n2\\. 非 网赚 商业化严重 或以盈利为目的\n3\\. 真正用心去维护\n4\\. 跟我多交流\n5\\. 待补充,还没想好ღ(๑╯◡╰๑ღ)"},{"slug":"1764","title":"一个完整编译器的实现(二) 语法分析","tags":[],"body":"**1 系列说明**\n\n[GitHub地址](https://github.com/DIYgod/Compiler) [各阶段源码](http://www.anotherhome.net/file/compiler/) [各阶段说明集合](http://www.anotherhome.net/1751)\n\n**2 语法分析说明**\n\n语法:组合单词以形成词组 从句 或句子的方法。\n\n经过词法分析,我们已经可以将输入文本识别成一个个的单词,本阶段的目标是将这些单词识别成句子,判断单词的这种组合形式是否符合我们定义的语法。\n\n_2.1 用文法来定义语法_\n\n语法分析需要由递归而获得的额外的è
318¡¨ç¤ºèƒ½åŠ›ï¼Œæ˜¾ç„¶æ­£åˆ™è¡¨è¾¾å¼å·²ç»ä¸èƒ½æ»¡è¶³æˆ‘ä»¬çš„éœ€æ±‚ã€‚\n\n事实上,文法也可以用来描述词法单词的结构,但正则表达式已经可以满足需求,这时使用正则表达式更为简练。\n\n_2.2 LR(1) 分析法_\n\n@%……¥&amp;%#¥太复杂不想说\n\n总之,LR(1) 是一种非常非常强大的分析算法,能够解决很多归约-归约冲突,大多数用上下文无关文法描述其语法的程序设计语言都有一个 LR(1) 文法。<!--more-->\n\n_2.3 使用 Yacc 生成语法分析器_\n\n构造LR(1)分析表的算法简单得足以用计算机来自动完成,而且手工构造十分麻烦无趣,所以使用Yacc是一个明智的决定。\n\n类似Lex,Yacc规范分为三部分\n\n<pre class=\"lang:default decode:true \">%{\n...\n%}\n...\n%%\n...</pre>\n\n第一部分同Lex,包含include和声明\n\n第二部分定义从词法分析中接收的终结符,开始符号,优先级等\n\n第三部分定义文法及语义动作,语法分析阶段只定义文法,语义动作到语义分析时候再完成。\n\n2.3.1 冲突\n\nYacc 选择移近来解决移进-归约冲突,选择使用在文法中先出现的规则来解决归约-归约冲突。\n\n2.3.2 优先级指导\n\n定义优先级是为了解决二义性,这样写文法的时候方便的多。\n\nYacc在第二部分可以假如优先级指导命令\n\n<pre>%left COMMA\n%right PLUSASSIGN MINUSASSIGN TIMESASSIGN DIVIDEASSIGN ASSIGN\n%left OR\n%left AND\n%left EQ NEQ\n%left LE GE LT GT\n%left PLUS MINUS\n%left TIMES DIVIDE MOD\n%right INC DEC NOT\n%left LPAREN RPAREN LBRACK RBRACK</pre>\n\n自上而下优先级降低,left right 说明单词是左结合还是右结合。\n\n**3 具体实现**\n\n语法分析器和改进过的词法分析器源码见文章开头。\n\n进行到本阶段,编译器发展为四个模块:\n\n1.错误处理模块(errormsg.c errormsg.h):用来产生含文件名和行号的报错信息2.常用工具模块(util.c util.h):定义一些常用的函数3.词法分析模块(simplec.lex):通过Lex进行词法分析4.语法分析模块(simplec.yacc):通过Yacc进行语法分析\n\n其中上一阶段的 token.h 已经不再需要,作为代替,Yacc会根据我们写的文法的单词规范自动生成一个与单词相关的头文件 y.tab.h ;parsetest.c是一个驱动程序,正常情况下会输出 Parsing successful!\n\n附:[ANSI C grammar (Lex)](http://www.lysator.liu.se/c/ANSI-C-grammar-l.html) [ANSI C grammar (Yacc)](http://www.lysator.liu.se/c/ANSI-C-grammar-y.html)\n\n&nbsp;\n\n语法分析 Done."},{"slug":"1754","title":"一个完整编译器的实现(一) 词法分析","tags":[],"body":"[GitHub地址](https://github.com/DIYgod/Compiler) [各阶段源码](http://www.anotherhome.net/file/compiler/) [各阶段说明集合](http://www.anotherhome.net/1751)\n\n为了将一个程序从一种语言翻译成另一种语言,编译器必须首先把程序的各种成分拆开,并搞清其结构和含义,然后再用另一种方式把这些成分组合起来。编译器的前端执行分析,后端进行合成。\n\n而分析一般分为3种:词法分析 语法分析 语义分析\n\n本阶段进行的是词法分析,目的是将输入文件分解成一个个独立的词法符号,即单词。\n\n**根据虎书的提示,在本阶段分了三个模块:**\n\n1.错误处理模块(errormsg.c errormsg.h):用来产生含文件名和行号的报错信息2.词法分析模块(lexical.lex token.h):通过Lex进行词法分析3.常用工具模块(util.c util.h):定义一些常用的函数\n\n词法分析模块与错误处理模块:两者通过 errormsg.h 中声明的变量和函数进行通信:EM_tokPos 变量传递每个单词以字符为单位的位置;EM_newline()函数记录行号;EM_error() 输出报错信息。\n\n错误处理模块与常用工具模块:错误处理模块使用 util.h 中声明的 checked_malloc() 分配内存函数\n\n另外还包含了 驱动程序(driver.c)测试文件(test.c) makefile<!--more-->\n\n**下面主要介绍本阶段最重要的词法分析模块。**\n\n**tokens.h**:定义词法单词常量以及yylval\n\n<pre class=\"lang:default decode:true\">typedef union  {\n\tint ival;\n    \tchar cval;\n    \tdouble dval;\n\tstring sval;\n\t} YYSTYPE;\nextern YYSTYPE yylval;</pre>\n\n上述代码定义了yylval,yylval是一个表示不同语义值的集
318合,其中的ival cval dval sval 分别用来保存 整数 字符 浮点数 字符串 单词的语义值。\n\n<pre class=\"lang:default decode:true \"># define ID 128\n... ... ... ...</pre>\n\n这段定义了一些常数,这些常数供 lexical.lex 使用,它们指明被匹配的是何种类型的单词。\n\n**lexical.lex**:Lex的源文件,可以通过Lex生成一个词法分析器\n\nLex是一个可以将正则表达式转换城词法分析器的生成器,它由词法规范生成一个C程序(lex.yy.c)。该规范包含一个正则表达式和一个动作。这个动作将单词类型(可能和其他信息一起)传给编译器的下一处理阶段。\n\n<pre class=\"lang:default decode:true \">%{\n#include &lt;string.h&gt;\n#include \"util.h\"\n#include \"tokens.h\"\n#include \"errormsg.h\"\n\nint charPos=1;              //记录每个单词的位置\n\nint yywrap(void)            //Lex函数, 返回1就停止解析, 可以用来解析多个文件\n{\n    charPos=1;\n    return 1;\n}\n\nvoid adjust(void)           //计算单词位置, 并通过EM_tokPos传给错误信息模块\n{\n    EM_tokPos=charPos;\n    charPos+=yyleng;\n}\n\n%}\n\n%%\n[\" \"\"\\t\"]                   {adjust(); continue;}\n\"\\n\"                        {adjust(); EM_newline(); continue;}\n(\\\")([A-Za-z0-9])*(\\\")      {adjust(); yylval.sval = yytext; return STRING_V;}\nstring                      {adjust(); return STRING;}\n'[A-Za-z0-9]'               {adjust(); yylval.cval = yytext[1]; return CHAR_V;}\nchar                        {adjust(); return CHAR;}\nshort                       {adjust(); EM_error(EM_tokPos, \"暂不支持short类型\");}\n-?[0-9]+                    {adjust(); yylval.ival=atoi(yytext); return INT_V;}\nint                         {adjust(); return INT;}\nunsigned                    {adjust(); EM_error(EM_tokPos, \"暂不支持unsigned类型\");}\nlong                        {adjust(); EM_error(EM_tokPos, \"暂不支持long类型\");}\nfloat                       {adjust(); EM_error(EM_tokPos, \"暂不支持float类型\");}\n-?[0-9]+(\\.[0-9]+)?         {adjust(); yylval.dval = atof(yytext); return DOUBLE_V;}\ndo                          {adjust(); return DO;}\ndouble                      {adjust(); return DOUBLE;}\nstruct                      {adjust(); return STRUCT;}\nunion                       {adjust(); return UNION;}\nvoid                        {adjust(); return VOID;}\nenum                        {adjust(); return ENUM;}\nsigned                      {adjust(); EM_error(EM_tokPos, \"暂不支持signed类型\");}\nconust                      {adjust(); return CONUST;}\nvolatile                    {adjust(); EM_error(EM_tokPos, \"暂不支持volatile\");}\ntypedef                     {adjust(); return TYPEDEF;}\nauto                        {adjust(); EM_error(EM_tokPos, \"暂不支持auto\");}\nregister                    {adjust(); EM_error(EM_tokPos, \"暂不支持register\");}\nstatic                      {adjust(); return STATIC;}\nextern                      {adjust(); return EXTERN;}\nbreak                       {adjust(); return BREAK;}\ncase                        {adjust(); return CASE;}\ncontinue                    {adjust(); return CONTINUE;}\ndefault                     {adjust(); return DEFAULT;}\nelse                        {adjust(); return ELSE;}\nfor                         {adjust(); return FOR;}\ngoto                        {adjust(); return GOTO;}\nif                          {adjust(); return IF;}\nreturn                      {adjust(); return RETURN;}\nswitch                      {adjust(); return SWITCH;}\nwhile                       {adjust(); return WHILE;}\nsizeof                      {adjust(); return SIZEOF;}\n[A-Za-z]+\\[[0-9]+\\]         {adjust(); return ARRAY;}\n[A-Za-z_]([A-Za-z0-9_])*    {adjust(); yylval.sval = yytext; return ID;}\n\",\"                         {adjust(); return COMMA;}\n\":\"                         {adjust(); return COLON;}\n\";\"                         {adjust(); return SEMICOLON;}\n\"(\"                         {adjust(); return LPAREN;}\n\")\"                         {adjust(); return RPAREN;}\n\"[\"                         {adjust(); return LBRACK;}\n\"]\"                         {adjust(); return RBRACK;}\n\"{\"                         {adjust(); return LBRACE;}\n\"}\"                         {adjust(); return RBRACE;}\n\".\"                         {adjust(); return DOT;}\n\"+\"                         {adjust(); return PLUS;}\n\"-\"                         {adjust(); return MINUS;}\n\"*\"                         {adjust(); return TIMES;}\n\"/\"                         {adjust(); return DIVIDE;}\n\"!=\"                        {adjust(); return NEQ;}\n\"==\"                        {adjust(); return ASSIGN;}\n\"=\"                         {adjust(); return EQ;}\n\"&lt;=\"                        {adjust(); return LE;}\n\"&lt;\"                         {adjust(); return LT;}\n\"&gt;=\"                        {adjust(); return GE;}\n\"&gt;\"                         {adjust(); return GT;}\n\"&amp;\"                         {adjust(); return AND;}\n\"|\"                         {adjust(); return OR;}</pre>\n\n第一部分,即位于%{...%}之间的部分,包含有若干由此文件其余部分C代码使用的include和声明。\n\n第二部分,即位于%}...%%之间的部分,包含正则表达式的简写形式和状态说明,比如你可以写上\n\n<pre class=\"lang:default decode:true \">digits    [0-9]+</pre>\n\n那么第三部分中就可以用{digits}代替[0-9]+了。\n\n第三部分,即位于%%后面的部分,包含正则表达式和动作。每个动作返回一个 int 类型的值(token.h定义的常数),指出匹配的是哪一种单词。\n其中有两条匹配的原则来消除二义性:\n规则优先:对于一个特定的最长初始子串,第一个与之匹配的正则式决定这个子串的单词类型;\n最长匹配:通过规则优先确定正则式之后,子串取与正则式匹配的最长的字符串。\n\n几个变量:yytext是正则式匹配的字符串;yyleng是所匹配的字符串的长度;charPos追踪每一个单词的位置,并告知EM_tokPos。\n\n&nbsp;\n\n词法分析 Done."},{"slug":"1751","title":"一个完整编译器的实现","tags":[],"body":"_图灵生机器,机器生汇编,汇编生 C,C 生万物\n(来自知乎用户 Joy Neop)_\n\n本系列将展示一个完整编译器从无到有的实现过程.\n\n目标是从一个C语言的不完全子集翻译到x86汇编语言, 将借助 Lex Yacc LLVM 等工具, 另外暂定实现垃圾回收及面向对象.\n\n全部代码托管在 [GitHub](https://github.com/DIYgod/Compiler).     各阶段的源代码在 [这里](http://www.anotherhome.net/file/compiler/) 查看.\n\n主要参考 虎书(《现代编译原理--C语言实现》), 根据此书, 暂将实现分为11个阶段: 词法分析 语法分析 语义动作 语义分析 栈帧布局 翻译 规范化 指令选择 控制流分析 数据流分析 寄存器分é
318… 代码流出.\n\n已完成:\n\n[《一个完整编译器的实现—词法分析 | Anotherhome》](http://www.anotherhome.net/1754)\n\n[《一个完整编译器的实现—语法分析 | Anotherhome》](http://www.anotherhome.net/1764)\n\nTo be continued..."},{"slug":"1","title":"世界,你好!","tags":[],"body":"欢迎使用WordPress。这是系统自动生成的演示文章。编辑或者删除它,然后开始您的博客!"}]</script>
318 
318<script>
319      const searchInput = document.getElementById("searchInput");
320      const resultsContainer = document.getElementById("searchResults");
321      const emptyState = document.getElementById("searchEmpty");
322      const resultsCount = document.getElementById("resultsCount");
323      const rawData = document.getElementById("search-data")?.textContent || "[]";
324      let parsedIndex = [];
325
326      try {
327        parsedIndex = JSON.parse(rawData);
328      } catch {
329        parsedIndex = [];
330      }
331
332      const indexBySlug = {};
333      parsedIndex.forEach((item) => {
334        indexBySlug[item.slug] = {
335          ...item,
336          searchable: (item.title + " " + (item.tags?.join(" ") || "") + " " + item.body).toLowerCase(),
337        };
338      });
339
340      const cards = Array.from(
341        resultsContainer.querySelectorAll("[data-post-slug]"),
342      );
343
344      cards.forEach((card) => {
345        const targetHref = card.dataset.postLink;
346
347        card.addEventListener("click", (event) => {
348          if (event.target instanceof Element && event.target.closest("a")) {
349            return;
350          }
351
352          if (targetHref) {
353            window.location.href = targetHref;
354          }
355        });
356
357        card.addEventListener("keydown", (event) => {
358          const isActivatingKey = event.key === "Enter" || event.key === " ";
359
360          if (
361            !isActivatingKey ||
362            (event.target instanceof Element && event.target.closest("a"))
363          ) {
364            return;
365          }
366
367          if (targetHref) {
368            event.preventDefault();
369            window.location.href = targetHref;
370          }
371        });
372      });
373
374      const applySearch = (value) => {
375        const query = value.trim().toLowerCase();
376        const terms = query.split(/\\s+/).filter(Boolean);
377        let visible = 0;
378
379        cards.forEach((card) => {
380          const slug = card.dataset.postSlug;
381          const entry = indexBySlug[slug];
382          const matches =
383            terms.length === 0 ||
384            terms.every((term) => entry?.searchable.includes(term));
385
386          card.classList.toggle("hidden", !matches);
387
388          if (matches) {
389            visible += 1;
390          }
391        });
392
393        resultsCount.textContent = visible;
394        emptyState.classList.toggle("hidden", visible !== 0 || terms.length === 0);
395      };
396
397      const params = new URLSearchParams(window.location.search);
398      const initialQuery = params.get("q") || "";
399
400      if (initialQuery) {
401        searchInput.value = initialQuery;
402      }
403
404      applySearch(initialQuery);
405
406      searchInput.addEventListener("input", (event) => {
407        applySearch(event.target.value || "");
408      });
409    </script>
409 </section>  <section class="text-gray-700 bg-white border-t sm:mt-20 dark:bg-neutral-950 border-neutral-200 dark:border-neutral-800"> <div class="container flex flex-col items-center py-8 mx-auto px-7 max-w-7xl sm:flex-row justify-center"> <a href="/" class="h-5 text-base group relative z-30 flex items-center space-x-2 text-black dark:text-white font-semibold"> <img src="/favicon.ico" alt="DIYgod" width="20" height="20" decoding="async" class="size-5 object-contain"> <span class="text-nowrap">Hi, DIYgod</span> </a> <p class="mt-4 text-sm text-neutral-700 dark:text-neutral-100 sm:ml-4 sm:pl-4 sm:border-l sm:border-neutral-300 dark:sm:border-neutral-700 sm:mt-0"> 已运行 4362 天 </p> <p class="mt-4 text-sm text-neutral-700 dark:text-neutral-100 sm:ml-4 sm:pl-4 sm:border-l sm:border-neutral-300 dark:sm:border-neutral-700 sm:mt-0"> © 2026 DIYgod,版权所有,禁止转载,转发需注明出处 </p> <a href="/sitemap.xml" class="mt-4 text-sm text-neutral-700 dark:text-neutral-100 sm:ml-4 sm:pl-4 sm:border-l sm:border-neutral-300 dark:sm:border-neutral-700 sm:mt-0 hover:text-neutral-900 dark:hover:text-neutral-50 transition-colors">
410Sitemap
411</a> </div> </section> <div id="langPrompt" class="fixed bottom-4 right-4 z-50 hidden bg-white dark:bg-neutral-900 border border-neutral-200 dark:border-neutral-700 rounded-xl shadow-xl p-4 w-72" data-astro-cid-auakvm2o> <button id="langPromptClose" class="absolute top-3 right-3 text-neutral-400 hover:text-neutral-600 dar
411k:hover:text-neutral-300 transition-colors" data-astro-cid-auakvm2o> <svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24" data-astro-cid-auakvm2o> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" data-astro-cid-auakvm2o></path> </svg> </button> <div class="flex items-center gap-3 pr-4" data-astro-cid-auakvm2o> <div class="flex-shrink-0 w-10 h-10 flex items-center justify-center rounded-full bg-blue-50 dark:bg-blue-900/30" data-astro-cid-auakvm2o> <svg class="w-5 h-5 text-blue-500" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg" data-astro-cid-auakvm2o> <path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 20c.9-3.068 2.116-6.272 3.689-9.118a.92.92 0 0 1 1.622 0C17.884 13.728 19.1 16.932 20 20m-7.65-3h6.3M4 6h5m0 0h3M9 6V4m3 2h2m-2 0c0 2.39-1.071 4.78-3 6.744m0 0C7.7 14.066 6.012 15.195 4 16m5-3.256C7.887 11.61 7.06 10.335 6.559 9M9 12.744c1 1.018 2.23 1.92 3.662 2.65" data-astro-cid-auakvm2o></path> </svg> </div> <div data-astro-cid-auakvm2o> <p class="text-sm font-medium text-neutral-900 dark:text-white" data-astro-cid-auakvm2o>
412Switch to English?
413</p> <p class="text-xs text-neutral-500 dark:text-neutral-400" data-astro-cid-auakvm2o>
414Your browser is not in Chinese.
415</p> </div> </div> <div class="mt-3 flex items-center gap-2" data-astro-cid-auakvm2o> <button id="langPromptYes" class="flex-1 px-4 py-2 text-sm font-medium text-white bg-blue-500 rounded-lg hover:bg-blue-600 transition-colors" data-astro-cid-auakvm2o>
416Yes
417</button> <button id="langPromptNo" class="flex-1 px-4 py-2 text-sm font-medium text-neutral-600 dar
417k:text-neutral-300 bg-neutral-100 dark:bg-neutral-800 rounded-lg hover:bg-neutral-200 dark:hover:bg-neutral-700 transition-colors" data-astro-cid-auakvm2o>
418No
419</button> </div> <button id="langPromptDismiss" class="mt-2 w-full text-center text-xs text-neutral-400 dark:text-neutral-500 hover:text-neutral-600 dark:hover:text-neutral-300 transition-colors" data-astro-cid-auakvm2o>
420Don't ask again
421</button> </div> 
421<script>
422  (function () {
423    const STORAGE_KEY = "lang-prompt-dismissed";
424    const prompt = document.getElementById("langPrompt");
425
426    // Check if user has dismissed the prompt before
427    if (localStorage.getItem(STORAGE_KEY) === "true") {
428      return;
429    }
430
431    // Check browser language
432    const browserLang = navigator.language || navigator.userLanguage || "";
433    const isChineseBrowser =
434      browserLang.toLowerCase().startsWith("zh") ||
435      browserLang.toLowerCase().includes("chinese");
436
437    // Only show prompt for non-Chinese browsers
438    if (isChineseBrowser) {
439      return;
440    }
441
442    // Show the prompt after a short delay
443    setTimeout(() => {
444      prompt.classList.remove("hidden");
445      prompt.classList.add("animate-slide-up");
446    }, 500);
447
448    // Handle "Yes" button
449    document.getElementById("langPromptYes").addEventListener("click", () => {
450      const currentPath = window.location.pathname;
451      const englishPath = currentPath === "/" ? "/en" : `/en${currentPath}`;
452      window.location.href = englishPath;
453    });
454
455    // Handle "No" button
456    document.getElementById("langPromptNo").addEventListener("click", () => {
457      prompt.classList.add("hidden");
458    });
459
460    // Handle "Don't ask again" button
461    document.getElementById("langPromptDismiss").addEventListener("click", () => {
462      localStorage.setItem(STORAGE_KEY, "true");
463      prompt.classList.add("hidden");
464    });
465
466    // Handle close button
467    document.getElementById("langPromptClose").addEventListener("click", () => {
468      prompt.classList.add("hidden");
469    });
470  })();
471</script>
471  
471<script type="module">window.darkMode=!1;const d=["fixed","h-14"],s=["absolute","h-20"],o=["border-neutral-300/50","bg-white/80","dark:border-neutral-600/40","dark:bg-neutral-900/60","backdrop-blur-2xl"],l=["border-transparent"];let n=null;document.addEventListener("DOMContentLoaded",()=>{n=document.getElementById("header"),localStorage.getItem("dark_mode")&&localStorage.getItem("dark_mode")==="true"?(window.darkMode=!0,a()):i(),stickyHeaderFuncionality(),applyMenuItemClasses(),evaluateHeaderPosition(),m()});window.stickyHeaderFuncionality=()=>{window.addEventListener("scroll",()=>{evaluateHeaderPosition()})};window.evaluateHeaderPosition=()=>{window.scrollY>16?(n.firstElementChild.classList.add(...o),n.firstElementChild.classList.remove(...l),n.classList.add(...d),n.classList.remove(...s),document.getElementById("menu").classList.add("top-[56px]"),document.getElementById("menu").classList.remove("top-[75px]")):(n.firstElementChild.classList.remove(...o),n.firstElementChild.classList.add(...l),n.classList.add(...s),n.classList.remove(...d),document.getElementById("menu").classList.remove("top-[56px]"),document.getElementById("menu").classList.add("top-[75px]"))};document.getElementById("darkToggle").addEventListener("click",()=>{document.documentElement.classList.add("duration-300"),document.documentElement.classList.contains("dark")?(localStorage.removeItem("dark_mode"),i(!0)):(localStorage.setItem("dark_mode",!0),a(!0))});function i(t){document.getElementById("sun").classList.remove("setting"),document.getElementById("moon").classList.remove("rising");let e=0;t&&(e=500,document.getElementById("moon").classList.add("setting")),setTimeout(()=>{document.getElementById("dayText").classList.remove("hidden"),document.getElementById("nightText").classList.add("hidden"),document.getElementById("moon").classList.add("hidden"),document.getElementById("sun").classList.remove("hidden"),t&&(document.documentElement.classList.remove("dark"),document.getElementById("sun").classList.add("rising"))},e)}function a(t){document.getElementById("moon").classList.remove("setting"),document.getElementById("sun").classList.remove("rising");let e=0;t&&(e=500,document.getElementById("sun").classList.add("setting")),setTimeout(()=>{document.getElementById("nightText").classList.remove("hidden"),document.getElementById("dayText").classList.add("hidden"),document.getElementById("sun").classList.add("hidden"),document.getElementById("moon").classList.remove("hidden"),t&&(document.documentElement.classList.add("dark"),document.getElementById("moon").classList.add("rising"))},e)}window.applyMenuItemClasses=()=>{const t=document.querySelectorAll("#menu a");for(let e=0;e<t.length;e++)(t[e].pathname===window.location.pathname||t[e].pathname+"/"===window.location.pathname)&&t[e].classList.add("text-neutral-900","dark:text-white")};function m(){document.getElementById("openMenu").addEventListener("click",()=>{openMobileMenu()}),document.getElementById("closeMenu").addEventListener("click",()=>{closeMobileMenu()})}window.openMobileMenu=()=>{document.getElementById("openMenu").classList.add("hidden"),document.getElementById("closeMenu").classList.remove("hidden"),document.getElementById("menu").classList.remove("hidden"),document.getElementById("mobileMenuBackground").classList.add("opacity-0"),document.getElementById("mobileMenuBackground").classList.remove("hidden"),setTimeout(()=>{document.getElementById("mobileMenuBackground").classList.remove("opacity-0")},1)};window.closeMobileMenu=()=>{document.getElementById("closeMenu").classList.add("hidden"),document.getElementById("openMenu").classList.remove("hidden"),document.getElementById("menu").classList.add("hidden"),document.getElementById("mobileMenuBackground").classList.add("hidden")};</script>
471  
471<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":"80eda129e93f431b873b3cd72548e8a0","r":1,"spa":2}' crossorigin="anonymous"></script>
471
472</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.