<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Nexmoe</title><description>Products and posts from Nexmoe</description><link>https://nexmoe.com</link><language>en</language><item><title>Why I Built VidBee, an Open-Source Video Downloader</title><link>https://nexmoe.com/posts/20260225-vidbee-origin-story</link><guid isPermaLink="true">https://nexmoe.com/posts/20260225-vidbee-origin-story</guid><pubDate>Wed, 25 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;How this started&lt;/h2&gt;
&lt;p&gt;I started VidBee for a very simple reason. My girlfriend had just begun creating content, and she needed to download source clips every day. &lt;code&gt;yt-dlp&lt;/code&gt; is insanely powerful, but she is not technical. Installing software already needed my help, and the command line was out of the question.&lt;/p&gt;
&lt;p&gt;We also tried existing tools like &lt;code&gt;ytDownloader&lt;/code&gt; and &lt;code&gt;YoutubeDownloader&lt;/code&gt;. They looked beginner-friendly at first glance, but in real use they were still confusing. Error messages were vague, and the workflow was not much faster than using a CLI.&lt;/p&gt;
&lt;h2&gt;Quick start&lt;/h2&gt;
&lt;p&gt;If you want to try it first, setup takes three steps. Go to &lt;a href=&quot;https://vidbee.org/download&quot;&gt;https://vidbee.org/download&lt;/a&gt;, install the version for your OS, paste a video link, and click download.&lt;/p&gt;
&lt;p&gt;If VidBee saves you time, please star the project at &lt;a href=&quot;https://github.com/nexmoe/VidBee&quot;&gt;https://github.com/nexmoe/VidBee&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/products/vidbee/20260114_SCR-20260114-ocdd.jpeg&quot; alt=&quot;VidBee 下载任务列表界面&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;What I actually wanted to solve&lt;/h2&gt;
&lt;p&gt;After that, I wrote down the problems she kept running into. It came down to three things.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Common platforms should work directly, without jumping between different tools.&lt;/li&gt;
&lt;li&gt;The creators she follows post repeatedly, and manual downloading means checking links every day.&lt;/li&gt;
&lt;li&gt;Downloaded assets should be organized by creator and content type, so editing later does not start with folder chaos.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;How VidBee handles this now&lt;/h2&gt;
&lt;p&gt;The current design of VidBee revolves around those three points. First, make the whole flow work end to end. Then keep adding capabilities.&lt;/p&gt;
&lt;p&gt;The first piece is the download flow. You paste a link and VidBee parses it directly, no parameters to memorize. Common formats and resolutions appear first. If something fails, VidBee explains why, so you know what to do next.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/products/vidbee/20251204_support_site.png&quot; alt=&quot;VidBee 下载与支持站点界面&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/products/vidbee/20260114_SCR-20260114-mcpf.jpeg&quot; alt=&quot;VidBee 新版下载参数选择界面&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/products/vidbee/20260114_SCR-20260114-ocov.jpeg&quot; alt=&quot;VidBee 新版视频下载管理主界面&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The second piece is RSS auto-download. You can subscribe to channels, playlists, or feed sources you follow often. VidBee checks for updates in the background and queues new content automatically. You no longer need to refresh links all day, and you are less likely to miss fresh uploads. For people publishing frequently, this saves real time.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/products/vidbee/20251204_rss.png&quot; alt=&quot;VidBee RSS 自动下载界面&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The third piece is file management. VidBee can sort downloads into folders by channel, creator, or task rules. Once downloads finish, the file structure is cleaner, so revisiting history, reorganizing assets, or filling missing clips is much faster. Combined with RSS auto-download, this feels like a continuous backup pipeline. When a channel updates, local archives update too. We will keep improving this part and make organization, search, and batch operations smoother.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20260225-vidbee-origin-story/vidbee-download-files.png&quot; alt=&quot;VidBee 下载文件管理效果&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I do not want to build a downloader that looks feature-rich but feels heavy to use. What I care about is that beginners can use it on first launch, and power users keep saving time as usage grows.&lt;/p&gt;
&lt;p&gt;People who create content know this feeling. The problem is often not a lack of ideas, but workflow friction. For me, VidBee is about removing as much friction as possible and giving that time back to creation.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Emergeia</title><link>https://nexmoe.com/products/emergeia</link><guid isPermaLink="true">https://nexmoe.com/products/emergeia</guid><description>An agent-first social network where humans mostly observe while AI agents build collections, rate items, and surface top agents through shared lists.</description><pubDate>Wed, 04 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20260204_SCR-20260204-njpv.CQbEGmhg.jpeg&quot; alt=&quot;Emergeia&quot; /&gt;&lt;/p&gt;&lt;p&gt;An agent-first social network where humans mostly observe while AI agents build collections, rate items, and surface top agents through shared lists.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://emergeia.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://emergeia.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/emergeia&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://emergeia.com&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Visit Emergeia&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20260204_SCR-20260204-njpv.CQbEGmhg.jpeg" length="615799" type="image/jpeg"/></item><item><title>I Open-Sourced Eve, a 24-Hour Recording and Real-Time Transcription Tool</title><link>https://nexmoe.com/posts/eve</link><guid isPermaLink="true">https://nexmoe.com/posts/eve</guid><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I kept looking for a recorder that could run continuously for meetings, quick discussions, and random ideas. After trying many tools, I found plenty of short-session recorders, but long continuous recording was either unstable or painful to organize later.&lt;/p&gt;
&lt;p&gt;So I built my own tool, Eve (eavesdropper). It is a long-session recorder that runs on macOS, Windows, and Linux. Eve uses your computer microphone for 24-hour nonstop recording, then converts speech to text with local compute. By default it uses Qwen3-ASR for real-time recognition and VAD to filter silent parts. The goal is simple: keep recording stable and make content searchable.&lt;/p&gt;
&lt;p&gt;Daily report generation example:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/nexmoe/eve/a67621e6f843f30a4f4619edc55df7db6db4fb99/docs/images/ai-daily-report-example.jpeg&quot; alt=&quot;Daily Report Example&quot; /&gt;&lt;/p&gt;
&lt;p&gt;If you want to try it first, go to GitHub and follow the README:&lt;/p&gt;
&lt;p&gt;👉 &lt;a href=&quot;https://github.com/nexmoe/eve&quot;&gt;https://github.com/nexmoe/eve&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;uv sync&lt;/code&gt; + &lt;code&gt;uv run eve&lt;/code&gt; will start it. The repository includes full parameters and usage details.&lt;/p&gt;
&lt;p&gt;If this tool helps you, please give it a star.&lt;/p&gt;
&lt;h2&gt;Key Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Runs on macOS, Windows, and Linux&lt;/li&gt;
&lt;li&gt;Uses your computer microphone for 24-hour nonstop recording&lt;/li&gt;
&lt;li&gt;Splits recording into WAV segments automatically for easier playback and management&lt;/li&gt;
&lt;li&gt;Uses local compute for speech-to-text and writes matching JSON transcripts during recording&lt;/li&gt;
&lt;li&gt;Filters silent parts with VAD and processes only speech&lt;/li&gt;
&lt;li&gt;Can auto-switch to the currently active microphone&lt;/li&gt;
&lt;li&gt;You can disable ASR, record first, and transcribe in batch later&lt;/li&gt;
&lt;li&gt;Output text can be sent directly to LLMs for summaries, Q and A, and task extraction&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Demo&lt;/h2&gt;
&lt;p&gt;The core of the OneDrive workflow is placing the Eve output directory inside your local OneDrive sync folder.&lt;br /&gt;
Recorded audio files and transcript files are written locally first, then OneDrive automatically syncs them to the cloud for persistent storage.&lt;br /&gt;
This helps you recover historical recordings and transcripts even after accidental local deletion, disk failure, system reinstall, or device replacement.&lt;/p&gt;
&lt;p&gt;Example of audio and transcript files inside OneDrive:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/nexmoe/eve/a67621e6f843f30a4f4619edc55df7db6db4fb99/docs/images/onedrive-output-dir-example.png&quot; alt=&quot;OneDrive Output Directory Example&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Why I built this&lt;/h2&gt;
&lt;p&gt;I want to preserve original voice data first, not only final summaries.&lt;/p&gt;
&lt;p&gt;Models keep improving. Audio that transcribes poorly today can often be processed better later.&lt;/p&gt;
&lt;p&gt;So Eve was never about pretty summaries first. It is about stable recording first.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I plan to add more features over time, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better keyword search and timeline navigation&lt;/li&gt;
&lt;li&gt;Automated daily report and meeting note workflows&lt;/li&gt;
&lt;li&gt;More robust device switching strategy and error recovery&lt;/li&gt;
&lt;li&gt;Better cloud archive and sync experience&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;The project is already open-sourced on GitHub.&lt;br /&gt;
If you are interested in this direction, feel free to open issues or pull requests and improve it together.&lt;/p&gt;
&lt;p&gt;👉 &lt;a href=&quot;https://github.com/nexmoe/eve&quot;&gt;https://github.com/nexmoe/eve&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Eve</title><link>https://nexmoe.com/products/eve</link><guid isPermaLink="true">https://nexmoe.com/products/eve</guid><description>Open-source 24-hour recording and real-time transcription tool that continuously captures audio from your computer microphone, converts speech to text with local compute, and focuses on reliable capture with local storage.</description><pubDate>Sun, 01 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20260217_onedrive-output-dir-example.S0i0JTze.png&quot; alt=&quot;Eve&quot; /&gt;&lt;/p&gt;&lt;p&gt;Open-source 24-hour recording and real-time transcription tool that continuously captures audio from your computer microphone, converts speech to text with local compute, and focuses on reliable capture with local storage.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://github.com/nexmoe/eve&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://github.com/nexmoe/eve&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/eve&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/nexmoe/eve&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View on GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;import FeatureSection from &apos;@/components/products/FeatureSection.astro&apos;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;space-y-24 py-16&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;FeatureSection
title=&quot;Core Features&quot;
subtitle=&quot;Aligned with the README: long-session capture, segmented archiving, and low-friction transcription.&quot;
features={[
{
title: &apos;24/7 Continuous Recording&apos;,
description: &apos;Capture audio from your computer microphone all day without relying on cloud recording services.&apos;,
icon: &apos;mdi:microphone&apos;
},
{
title: &apos;Automatic Segmented Storage&apos;,
description: &apos;Split recordings into time-based WAV segments and archive by date for easier playback and search.&apos;,
icon: &apos;mdi:content-cut&apos;
},
{
title: &apos;VAD Speech Detection&apos;,
description: &apos;Keep only speech-active parts and transcribe spoken segments to reduce useless content.&apos;,
icon: &apos;mdi:waveform&apos;
},
{
title: &apos;Real-time Transcription (Optional)&apos;,
description: &apos;Write live transcription to JSON by default, and support recording-only mode when ASR is disabled.&apos;,
icon: &apos;mdi:file-document-outline&apos;
},
{
title: &apos;Automatic Microphone Switching&apos;,
description: &apos;Detect and switch to the currently active input device to reduce interruption from device changes.&apos;,
icon: &apos;mdi:swap-horizontal&apos;
},
{
title: &apos;Configurable Output Directory&apos;,
description: &apos;Save outputs to folders like your OneDrive sync directory for easy backup and multi-device access.&apos;,
icon: &apos;mdi:folder-cog-outline&apos;
},
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20260217_onedrive-output-dir-example.S0i0JTze.png" length="1753252" type="image/png"/></item><item><title>Viora</title><link>https://nexmoe.com/products/viora</link><guid isPermaLink="true">https://nexmoe.com/products/viora</guid><description>Voice dictation that disappears into your flow. Automatically trims filler words, understands corrections, supports 60+ apps with auto-formatting, and includes AI voice agent and meeting transcription features.</description><pubDate>Sat, 20 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20260205_SCR-20260205-peet.-3yz8jfp.jpeg&quot; alt=&quot;Viora&quot; /&gt;&lt;/p&gt;&lt;p&gt;Voice dictation that disappears into your flow. Automatically trims filler words, understands corrections, supports 60+ apps with auto-formatting, and includes AI voice agent and meeting transcription features.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://test.viora.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://test.viora.io&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/viora&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://test.viora.io&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Download Viora&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20260205_SCR-20260205-peet.-3yz8jfp.jpeg" length="546555" type="image/jpeg"/></item><item><title>I Open-Sourced VidBee, a Video Downloader for Thousands of Sites</title><link>https://nexmoe.com/posts/VidBee</link><guid isPermaLink="true">https://nexmoe.com/posts/VidBee</guid><pubDate>Sun, 02 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Recently I got the urge to find a desktop tool for downloading videos. After trying a bunch of options, the UI was either painfully outdated or the features were a mess—and the pure CLI tools were just too uncomfortable to use.&lt;/p&gt;
&lt;p&gt;So I built my own. The project is called: VidBee.&lt;/p&gt;
&lt;p&gt;Project home:&lt;/p&gt;
&lt;p&gt;👉 &lt;a href=&quot;https://vidbee.org&quot;&gt;https://vidbee.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If this tool helps you, please give it a star 👉 &lt;a href=&quot;https://github.com/nexmoe/VidBee&quot;&gt;https://github.com/nexmoe/VidBee&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/fc6321d78c5a4ad3709dc907c47df9af.png&quot; alt=&quot;fc6321d78c5a4ad3709dc907c47df9af.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;VidBee is an open-source video downloader built with Electron + React + TypeScript. It uses yt-dlp under the hood (you know the legendary one), so it can download videos from 1000+ sites. The key point though—&lt;strong&gt;finally, a clean UI that’s easy on the eyes and satisfying to click&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Key Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Desktop app for Windows / macOS / Linux&lt;/li&gt;
&lt;li&gt;Paste a link and download; supports multi-task queue, pause, and retry&lt;/li&gt;
&lt;li&gt;Choose format and quality, or download audio only&lt;/li&gt;
&lt;li&gt;Follows system theme, with both light / dark modes&lt;/li&gt;
&lt;li&gt;Runs fully locally: no uploads, no cloud&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Download &amp;amp; Install&lt;/h2&gt;
&lt;h3&gt;1. Get the latest version&lt;/h3&gt;
&lt;p&gt;Visit &lt;a href=&quot;https://vidbee.org/download/&quot;&gt;https://vidbee.org/download/&lt;/a&gt; to download the latest version:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;: &lt;code&gt;vidbee-x.x.x-setup.exe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;: &lt;code&gt;vidbee-x.x.x.dmg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Linux&lt;/strong&gt;: &lt;code&gt;vidbee-x.x.x.AppImage&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. Install and run&lt;/h3&gt;
&lt;p&gt;After downloading, just install it. Windows and Linux users can double-click the installer. macOS users drag it into the Applications folder.&lt;/p&gt;
&lt;h3&gt;3. Note for macOS users&lt;/h3&gt;
&lt;p&gt;If you see “App is damaged” on macOS, run this in Terminal:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;xattr -rd com.apple.quarantine /Applications/VidBee.app/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This is macOS security behavior—third-party apps you download need to be manually unquarantined.&lt;/p&gt;
&lt;h2&gt;Why I made this&lt;/h2&gt;
&lt;p&gt;I simply wanted a clean, local video downloader—no command line, no ads. And Electron performance isn’t as bad as people think; with Vite builds, it starts pretty fast.&lt;/p&gt;
&lt;p&gt;I put a lot of effort into UX and studied many commercial products. The goal was a tool that’s fully capable but also intuitive and genuinely pleasant to use.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;I’ll gradually add more features, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download subtitles / danmaku&lt;/li&gt;
&lt;li&gt;Batch downloads for playlists&lt;/li&gt;
&lt;li&gt;Download history / task records&lt;/li&gt;
&lt;li&gt;Custom themes&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;The project is MIT-licensed and fully open source. If you’re interested in contributing code or UI design, you’re welcome to jump in. It gets a little lonely building alone 😂&lt;/p&gt;
&lt;p&gt;👉 &lt;a href=&quot;https://github.com/nexmoe/VidBee&quot;&gt;https://github.com/nexmoe/VidBee&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>VidBee</title><link>https://nexmoe.com/products/vidbee</link><guid isPermaLink="true">https://nexmoe.com/products/vidbee</guid><description>Free and open-source video downloader supporting 1000+ platforms including YouTube, TikTok, and Bilibili, featuring an elegant interface, batch downloads, and RSS auto-download.</description><pubDate>Wed, 22 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20251204_home.INV6FP5n.png&quot; alt=&quot;VidBee&quot; /&gt;&lt;/p&gt;&lt;p&gt;Free and open-source video downloader supporting 1000+ platforms including YouTube, TikTok, and Bilibili, featuring an elegant interface, batch downloads, and RSS auto-download.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://vidbee.org&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://vidbee.org&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/vidbee&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://vidbee.org/download&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Download VidBee&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/nexmoe/VidBee&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20251204_home.INV6FP5n.png" length="1129096" type="image/png"/></item><item><title>Big News, 即将离开共绩科技</title><link>https://nexmoe.com/posts/%E5%8D%B3%E5%B0%86%E7%A6%BB%E5%BC%80%E5%85%B1%E7%BB%A9%E7%A7%91%E6%8A%80</link><guid isPermaLink="true">https://nexmoe.com/posts/%E5%8D%B3%E5%B0%86%E7%A6%BB%E5%BC%80%E5%85%B1%E7%BB%A9%E7%A7%91%E6%8A%80</guid><pubDate>Wed, 24 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;一个重要的决定&lt;/h2&gt;
&lt;p&gt;在过去一年多的时间里，我花了很多时间反思自己。
现在我有了一些阶段性的结论：人生上所有的选择都要遵循自己的兴趣。&lt;/p&gt;
&lt;p&gt;在共绩科技的这段时间里，我学到了很多。从技术到管理，从产品到市场，每一个环节都让我成长。但人生总是需要新的挑战，新的方向。&lt;/p&gt;
&lt;p&gt;感谢共绩科技给了我这样一个平台。在这里，我见证了公司从几个人初创到发展的过程，参与了多个重要项目的推进。这些经历让我对创业、对技术、对商业有了更深的理解。&lt;/p&gt;
&lt;h2&gt;未来规划&lt;/h2&gt;
&lt;p&gt;没想到太多要写的。&lt;/p&gt;
&lt;p&gt;短期在事业上，刚刚拿到了真格、蓝驰等的投资，准备做 Voice+Agent 方向的出海产品。&lt;/p&gt;
&lt;p&gt;人生上，学会如何玩，如何作为一个真实的人。
学会说话、学会发声。
锻炼、健身。还有真正 Follow your heart 的事情。&lt;/p&gt;
&lt;h2&gt;写在最后&lt;/h2&gt;
&lt;p&gt;人生就像一场旅行，每个阶段都有不同的风景。共绩科技是我人生旅途中的重要一站，我会永远珍惜这段经历。在这里遇到了非常多很精彩的人，我非常感激。&lt;/p&gt;
&lt;p&gt;感谢所有支持我的人，感谢这个平台给我的一切。新的旅程即将开始，我充满期待。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;最后用《西游记》里我很喜欢的一句话结尾&lt;/p&gt;
&lt;p&gt;&lt;em&gt;寻穷天下无名水，历遍人间不到山&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Gongji Tech Internship: Make AI Truly Usable</title><link>https://nexmoe.com/posts/gongji-hire-250826</link><guid isPermaLink="true">https://nexmoe.com/posts/gongji-hire-250826</guid><pubDate>Tue, 26 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We’re looking for an intern who truly cares about bringing AI into real‑world use.&lt;/p&gt;
&lt;p&gt;Gongji Tech (suanli.cn) has a simple mission: make AI compute as easy to use as water and electricity. We serve thousands of developers, helping them run models efficiently without being blocked by deployment, cost, or ops.&lt;/p&gt;
&lt;p&gt;Now we need you to help solve real problems — not busywork, but core work.&lt;/p&gt;
&lt;h2&gt;What You’ll Do&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Package mainstream AIGC models for deployment&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Build standardized Docker images for Stable Diffusion, Qwen, Wan, and more. Not just “runs,” but “starts fast, uses less memory, stays stable.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Operate the developer community&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Listen to feedback on the front lines, answer questions, and organize discussions so developers want to come and stay.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Write documentation people actually understand&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Deployment guides, API docs, best practices — goal: a beginner can run their first model in 5 minutes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Some front‑end work&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Help maintain our SaaS platform (Next.js + Tailwind), improving features and experience — not just slicing UI.&lt;/p&gt;
&lt;h2&gt;We Hope You Are&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Comfortable with Docker and packaging models/services&lt;/li&gt;
&lt;li&gt;Understand AI inference deployment; not afraid of logs, configs, dependencies&lt;/li&gt;
&lt;li&gt;Basic web dev skills (HTML/CSS/JS); React/Next.js is a plus&lt;/li&gt;
&lt;li&gt;Can explain tech clearly — blogs/docs/open‑source experience preferred&lt;/li&gt;
&lt;li&gt;Proactive, reliable, communicative; can push things forward&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Bonus&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Active GitHub contributions / open‑source experience&lt;/li&gt;
&lt;li&gt;Ran tech communities or wrote tutorials&lt;/li&gt;
&lt;li&gt;Deployed AI models yourself (even small projects)&lt;/li&gt;
&lt;li&gt;Docs you wrote got “copied” by others&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Internship Info&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Location: Wudaokou, Beijing (onsite)&lt;/li&gt;
&lt;li&gt;Time: 5 days/week, 10:00–18:30&lt;/li&gt;
&lt;li&gt;Duration: at least 3 months, long‑term preferred&lt;/li&gt;
&lt;li&gt;Stipend: 240–300 RMB/day&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;We Offer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Real projects, hands‑on with core modules&lt;/li&gt;
&lt;li&gt;Free high‑performance GPUs to try models&lt;/li&gt;
&lt;li&gt;Flat team + 1‑on‑1 mentoring, only technical discussions&lt;/li&gt;
&lt;li&gt;Efficient, low‑overtime culture&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How to Apply&lt;/h2&gt;
&lt;p&gt;Email: hla@suanleme.cn&lt;/p&gt;
&lt;p&gt;Or add WeChat: huangliang1009 (note “Intern Application + Name”)&lt;/p&gt;
&lt;p&gt;Email subject: [Intern Application] Name - AI Containerization/Community Ops&lt;/p&gt;
&lt;p&gt;Please include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resume&lt;/li&gt;
&lt;li&gt;GitHub link (if any)&lt;/li&gt;
&lt;li&gt;Tech blog/docs/community work (even a single note)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;Gongji Tech Team&lt;/p&gt;
&lt;p&gt;Website: https://suanli.cn&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>🚀 Gongji Tech Intern Hiring | Turning AI from &apos;Runs&apos; to &apos;Works Well&apos;</title><link>https://nexmoe.com/posts/gongji-hire-250814</link><guid isPermaLink="true">https://nexmoe.com/posts/gongji-hire-250814</guid><pubDate>Thu, 14 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hey developer!&lt;/p&gt;
&lt;p&gt;We’re &lt;strong&gt;Gongji Tech&lt;/strong&gt;, and we’re working on something pretty cool: redefining how AI compute is scheduled and coordinated through a decentralized approach. Our product &lt;strong&gt;Gongji Compute&lt;/strong&gt; (&lt;a href=&quot;https://suanli.cn&quot;&gt;suanli.cn&lt;/a&gt;) is more than a platform — we want it to be the “water, electricity, and gas” for AI developers: make model deployment simpler and compute flow freer.&lt;/p&gt;
&lt;p&gt;Right now we’re looking for an intern who’s &lt;strong&gt;truly interested in AI engineering and developer ecosystems&lt;/strong&gt; to join us and dive into core work. This isn’t a “fetch‑coffee” role. Every Dockerfile you write, every community question you answer, and every document you produce will directly impact the experience of thousands of developers.&lt;/p&gt;
&lt;p&gt;If you:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Enjoy packaging and shipping models, and love the feeling of taking them from local to production;&lt;/li&gt;
&lt;li&gt;Are willing to hang out in the community, listen to developer pain points, and fix real problems;&lt;/li&gt;
&lt;li&gt;Can write code &lt;em&gt;and&lt;/em&gt; write docs that people actually understand;&lt;/li&gt;
&lt;li&gt;Are obsessed with making AI easier to use…&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then we’re probably looking for you.&lt;/p&gt;
&lt;h2&gt;🛠 What You’ll Work On&lt;/h2&gt;
&lt;h3&gt;AI application containerization in practice&lt;/h3&gt;
&lt;p&gt;Build standardized Docker images for mainstream AIGC models like Stable Diffusion, Qwen, Wan, and more. Not just “runs,” but “runs reliably, starts fast, uses less.” You’ll go deep into dependency management, startup script optimization, resource isolation, and more.&lt;/p&gt;
&lt;h3&gt;Real developer community operations&lt;/h3&gt;
&lt;p&gt;Our community isn’t a megaphone — it’s the frontline where problems appear and get solved. You’ll help answer questions, collect feedback, run discussions, and even organize technical sharing sessions so developers stay and engage.&lt;/p&gt;
&lt;h3&gt;Write useful technical docs&lt;/h3&gt;
&lt;p&gt;We hate docs nobody can understand. You’ll write deployment guides, API docs, and best practices with a clear goal: a beginner can run their first model in 5 minutes.&lt;/p&gt;
&lt;h3&gt;Some frontend work (bonus)&lt;/h3&gt;
&lt;p&gt;Help maintain our AIGC SaaS platform (Next.js + Tailwind), contribute to features and performance improvements — not just slicing UI, but making tools more usable.&lt;/p&gt;
&lt;h2&gt;🧰 What We Hope You Have&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;✅ Familiar with Docker and real image‑building experience (e.g. packaging Hugging Face models, FastAPI services, etc.)&lt;/li&gt;
&lt;li&gt;✅ Understand basic AI inference and serving workflows; comfortable reading logs, tweaking configs, resolving dependencies&lt;/li&gt;
&lt;li&gt;✅ Basic web dev skills (HTML/CSS/JS); React or Next.js is a plus&lt;/li&gt;
&lt;li&gt;✅ Clear technical writing — can explain complex things in plain language; blogs, open‑source work, or docs are a plus&lt;/li&gt;
&lt;li&gt;✅ Proactive, reliable, communicative — able to push things forward in a fast‑paced environment&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;🌟 Bonus (Not Required, but Will Impress Us)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Active GitHub contributions; participated in open‑source projects&lt;/li&gt;
&lt;li&gt;Ran a tech community,公众号, Zhihu column, Discord channel, etc.&lt;/li&gt;
&lt;li&gt;Packaged/deployed AI models yourself (even toy projects)&lt;/li&gt;
&lt;li&gt;Wrote tutorials, deployment manuals, or API docs that others “copied”&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;📍 Internship Info&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Location&lt;/strong&gt;: Wudaokou, Beijing (onsite)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Time&lt;/strong&gt;: 5 days/week, 10:00–18:30&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Duration&lt;/strong&gt;: At least 3 months, long‑term preferred&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;💡 We Offer&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Real projects, hands‑on&lt;/strong&gt;: no empty promises, no busywork. You’ll work on core modules and gain both AI engineering + developer ecosystem experience.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Free GPU compute&lt;/strong&gt;: high‑end cards available to test any model you want.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Flat team + 1‑on‑1 mentorship&lt;/strong&gt;: no PPT culture, just technical discussion and fast iteration.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Internship stipend: 240–300 RMB/day&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;A team that’s efficient, not overworked&lt;/strong&gt;: we believe passion and efficiency matter more than overtime.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;📬 How to Apply?&lt;/h2&gt;
&lt;p&gt;We care more about &lt;strong&gt;what you’ve done&lt;/strong&gt; than how pretty your resume looks.&lt;/p&gt;
&lt;p&gt;Email: &lt;strong&gt;&lt;a href=&quot;mailto:hla@suanleme.cn&quot;&gt;hla@suanleme.cn&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;
Or add WeChat: &lt;strong&gt;huangliang1009&lt;/strong&gt; (note “Intern Application + Name”)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📧 Suggested subject&lt;/strong&gt;: &lt;code&gt;[Intern Application] Name - AI Containerization/Community Ops&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;📎 Please include:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Resume&lt;/li&gt;
&lt;li&gt;GitHub link (if any)&lt;/li&gt;
&lt;li&gt;Tech blog/docs/community work (even a deployment note)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;One Last Thing&lt;/h2&gt;
&lt;p&gt;We don’t expect a “full‑stack genius,” but we do want you to genuinely care about something.&lt;br /&gt;
Experience can be limited, but passion can’t be fake.&lt;br /&gt;
Skills can come slowly, but attitude must be real.&lt;/p&gt;
&lt;p&gt;Come to Gongji and build real tools for AI developers.&lt;br /&gt;
The next person others “copy from” might be you.&lt;/p&gt;
&lt;p&gt;👉 &lt;strong&gt;Looking forward to your message!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;— Gongji Tech Team 🚀&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Website&lt;/strong&gt;: &lt;a href=&quot;https://suanli.cn&quot;&gt;https://suanli.cn&lt;/a&gt;&lt;br /&gt;
We’re building the next‑gen infrastructure for AI developers.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;✅ &lt;strong&gt;Friendly reminder:&lt;/strong&gt;&lt;br /&gt;
Even if you feel “not strong enough,” as long as you love learning, dig in, and communicate well, we’re happy to help you grow. We’ll walk this road together.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>We Struggled with GPU Compute Too — So We Built a Cloud Host</title><link>https://nexmoe.com/posts/gongji-server</link><guid isPermaLink="true">https://nexmoe.com/posts/gongji-server</guid><description>As an AI team, we know the pain of compute shortages. To escape high costs, queues, and idle waste, we built a GPU cloud host we truly love — for ourselves and for all developers.</description><pubDate>Thu, 07 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As a small team focused on AI, we’ve struggled with compute shortages just like many developers on the road to model training.&lt;/p&gt;
&lt;p&gt;Expensive GPUs, long queues on mainstream cloud platforms, complex environment setup, and money burned by idle instances — that used to be our daily life. We wasted time waiting and doing ops instead of focusing on algorithms and product innovation.&lt;/p&gt;
&lt;p&gt;We were done with that inefficiency. To solve our own problem, we decided to build the GPU cloud platform we always wanted: simple, efficient, and affordable.&lt;/p&gt;
&lt;p&gt;We prepared a 10‑RMB compute voucher. Register here to claim it: &lt;a href=&quot;https://console.suanli.cn/auth/login?invite_code=8k9wV6cKkf&amp;amp;utm_source=mkt&amp;amp;utm_medium=yzj&amp;amp;utm_campaign=twitter&amp;amp;utm_term=8k9wV6cKkf&quot;&gt;Get a 10‑RMB no‑threshold voucher&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;How We Solve the Shared Pain Points&lt;/h3&gt;
&lt;p&gt;We turned every pitfall we hit into the core features of &lt;strong&gt;Gongji Compute&lt;/strong&gt;:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;No more queues — start instantly&lt;/strong&gt;: We invested heavily to reserve thousands of RTX 4090/5090 GPUs. No waiting; jump into Jupyter Lab, VS Code, or Bash right in the browser anytime.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Pay only for effective compute&lt;/strong&gt;: We believe not a cent should be wasted on idle time. We implemented true &lt;strong&gt;per‑second billing&lt;/strong&gt; — stop the instance, stop the charges; start/stop is free. RTX 4090 costs only 1.68 RMB/hour — pay only for what you use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Three‑minute onboarding, focus on dev&lt;/strong&gt;: We preinstall mainstream images including PyTorch, TensorFlow, ComfyUI, Stable Diffusion, and more. No more environment setup headaches — everything works out of the box.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data安心&lt;/strong&gt;: We provide shared storage volumes and S3 mount acceleration so your datasets, code, and model weights move safely and efficiently between tasks.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/8737648655eae5a96ff86fcba073922ebb8ddf6af58d3de6650d10110e5b6586.png&quot; alt=&quot;picture-2025-08-07-09-38-55&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;We Chase Extreme Cost Performance&lt;/h3&gt;
&lt;p&gt;We use ourselves as the first users and optimized the most painful steps in development. Our goal is to deliver the most stable, smooth experience at the same price.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Gongji Compute&lt;/th&gt;
&lt;th&gt;What it solves&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Availability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Thousands of RTX 4090/5090 in stock&lt;/td&gt;
&lt;td&gt;No queues, start instantly.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;4090: 1.68 RMB/hr, 5090: 2.5 RMB/hr&lt;/td&gt;
&lt;td&gt;30–60% cheaper than mainstream clouds.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Billing&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Per‑second billing, stopped instances free&lt;/td&gt;
&lt;td&gt;No more paying for idle time.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Startup speed&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enter dev environment within 3 minutes&lt;/td&gt;
&lt;td&gt;Goodbye long waits.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environment&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Preinstalled common images, built‑in Tsinghua pip mirror&lt;/td&gt;
&lt;td&gt;No environment setup pain.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One‑click image distribution for teachers/leads&lt;/td&gt;
&lt;td&gt;Team collab and training efficiency.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Real‑World Performance&lt;/h3&gt;
&lt;p&gt;We also use Gongji Compute for model fine‑tuning and prototype development. Some real cost/performance references:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Llama 3 fine‑tuning&lt;/strong&gt;: single RTX 4090, Llama‑3‑8B LoRA fine‑tune, ~4 hours costs about 6.7 RMB; free after shutdown.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kaggle competitions&lt;/strong&gt;: rent 8 RTX 4090s for 30 minutes, release after; total cost &amp;lt; 80 RMB.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI teaching&lt;/strong&gt;: teachers distribute prebuilt images to hundreds of students; shut down after class, cost per student less than a milk tea.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Service deployment&lt;/strong&gt;: after tuning in ComfyUI, package directly into elastic API service — no second deployment.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/673e0db3576f8b6f1d67cffefa5bbfd2a57094038124d90888ba2f37e0161800.png&quot; alt=&quot;picture-2025-08-07-09-39-09&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Quick Start&lt;/h3&gt;
&lt;p&gt;We designed onboarding to be very simple — your first task can run in about three minutes:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Go to the Gongji Compute console and open &lt;strong&gt;Cloud Host&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the GPU type and quantity you need.&lt;/li&gt;
&lt;li&gt;Name your instance and choose a prebuilt base image.&lt;/li&gt;
&lt;li&gt;Optionally attach a shared storage volume for persistence.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Create Instance&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now you can fully enjoy AI development.&lt;/p&gt;
&lt;p&gt;We prepared a 10‑RMB compute voucher — register via the link below to claim it. We hope Gongji Compute becomes the perfect “alchemy” tool in your hands.&lt;/p&gt;
&lt;p&gt;Link: &lt;a href=&quot;https://console.suanli.cn/auth/login?invite_code=8k9wV6cKkf&amp;amp;utm_source=mkt&amp;amp;utm_medium=yzj&amp;amp;utm_campaign=twitter&amp;amp;utm_term=8k9wV6cKkf&quot;&gt;Get a 10‑RMB no‑threshold voucher&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>中国上市 AI 云玩家活的怎么样？</title><link>https://nexmoe.com/posts/%E4%B8%AD%E5%9B%BD%E4%B8%8A%E5%B8%82%20AI%20%E4%BA%91%E7%8E%A9%E5%AE%B6</link><guid isPermaLink="true">https://nexmoe.com/posts/%E4%B8%AD%E5%9B%BD%E4%B8%8A%E5%B8%82%20AI%20%E4%BA%91%E7%8E%A9%E5%AE%B6</guid><pubDate>Sat, 26 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/0586d1f794e2c3b558132654e06268a6e9bb517208d771ef3b71ea0bd692c4c4.png&quot; alt=&quot;picture-2025-07-26-11-07-43&quot; /&gt;&lt;/p&gt;
&lt;p&gt;AI 浪潮重塑了算力产业格局。NVIDIA 从游戏显卡厂商跃升为全球市值第一，云厂商纷纷转向 AI 算力服务。整个算力产业链都在向 AI 转型。&lt;/p&gt;
&lt;p&gt;这里分析五家中国上市 AI 云玩家的经营状况。&lt;/p&gt;
&lt;h2&gt;1. 🔴 青云科技（688316）&lt;/h2&gt;
&lt;p&gt;战略定位：企业级混合云 AI 服务商，AI 智算平台：支持 NVIDIA、国产 GPU 等异构算力统一调度&lt;/p&gt;
&lt;p&gt;经营状况评价：&lt;/p&gt;
&lt;p&gt;青云科技正处于转型阵痛期。2025 年一季报显示营业收入 4701 万元，同比下降 37%，延续了 2024 年以来的收入下滑趋势。公司持续亏损，净利润 -2291 万元，亏损幅度扩大 201%。&lt;/p&gt;
&lt;p&gt;更严峻的是财务结构恶化。资产负债率高达 84%，每股净资产从 2024 年一季报的 3.60 元跌至 1.34 元，股东权益被大幅稀释。应收账款周转天数达 127 天，回款压力明显。流动比率 0.71，资金链紧张。&lt;/p&gt;
&lt;p&gt;技术转型成本高昂但商业化进展缓慢。销售毛利率从 40% 暴跌至 19%，表明在 AI 算力竞争中定价能力下降。公司虽具备异构算力调度等差异化能力，但市场接受度仍需时间验证。短期内，青云科技面临&quot;技术领先但商业化滞后&quot;的典型困境。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;报告期&lt;/th&gt;
&lt;th&gt;2025 一季报&lt;/th&gt;
&lt;th&gt;2024 年报&lt;/th&gt;
&lt;th&gt;2024 三季报&lt;/th&gt;
&lt;th&gt;2024 中报&lt;/th&gt;
&lt;th&gt;2024 一季报&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;营业收入&lt;/td&gt;
&lt;td&gt;4701.21 万&lt;/td&gt;
&lt;td&gt;2.72 亿&lt;/td&gt;
&lt;td&gt;2.14 亿&lt;/td&gt;
&lt;td&gt;1.44 亿&lt;/td&gt;
&lt;td&gt;7464.96 万&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;营业收入同比增长&lt;/td&gt;
&lt;td&gt;-37.02%&lt;/td&gt;
&lt;td&gt;-18.95%&lt;/td&gt;
&lt;td&gt;-16.74%&lt;/td&gt;
&lt;td&gt;-17.51%&lt;/td&gt;
&lt;td&gt;8.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净利润&lt;/td&gt;
&lt;td&gt;-2290.07 万&lt;/td&gt;
&lt;td&gt;-9575.77 万&lt;/td&gt;
&lt;td&gt;-6275.86 万&lt;/td&gt;
&lt;td&gt;-3763.88 万&lt;/td&gt;
&lt;td&gt;-759.23 万&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净利润同比增长&lt;/td&gt;
&lt;td&gt;-201.63%&lt;/td&gt;
&lt;td&gt;43.70%&lt;/td&gt;
&lt;td&gt;49.14%&lt;/td&gt;
&lt;td&gt;54.16%&lt;/td&gt;
&lt;td&gt;83.57%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扣非净利润&lt;/td&gt;
&lt;td&gt;-2282.43 万&lt;/td&gt;
&lt;td&gt;-1.03 亿&lt;/td&gt;
&lt;td&gt;-6913.26 万&lt;/td&gt;
&lt;td&gt;-3836.54 万&lt;/td&gt;
&lt;td&gt;-921.02 万&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扣非净利润同比增长&lt;/td&gt;
&lt;td&gt;-147.82%&lt;/td&gt;
&lt;td&gt;40.79%&lt;/td&gt;
&lt;td&gt;45.75%&lt;/td&gt;
&lt;td&gt;54.15%&lt;/td&gt;
&lt;td&gt;80.33%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;每股净资产&lt;/td&gt;
&lt;td&gt;1.34 元&lt;/td&gt;
&lt;td&gt;1.82 元&lt;/td&gt;
&lt;td&gt;2.50 元&lt;/td&gt;
&lt;td&gt;3.02 元&lt;/td&gt;
&lt;td&gt;3.60 元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;销售毛利率&lt;/td&gt;
&lt;td&gt;19.53%&lt;/td&gt;
&lt;td&gt;31.66%&lt;/td&gt;
&lt;td&gt;32.20%&lt;/td&gt;
&lt;td&gt;33.82%&lt;/td&gt;
&lt;td&gt;40.10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;销售净利率&lt;/td&gt;
&lt;td&gt;-48.46%&lt;/td&gt;
&lt;td&gt;-35.24%&lt;/td&gt;
&lt;td&gt;-30.77%&lt;/td&gt;
&lt;td&gt;-26.88%&lt;/td&gt;
&lt;td&gt;-10.52%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净资产收益率&lt;/td&gt;
&lt;td&gt;-30.29%&lt;/td&gt;
&lt;td&gt;-71.89%&lt;/td&gt;
&lt;td&gt;-42.03%&lt;/td&gt;
&lt;td&gt;-23.25%&lt;/td&gt;
&lt;td&gt;-4.32%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;资产负债率&lt;/td&gt;
&lt;td&gt;83.70%&lt;/td&gt;
&lt;td&gt;84.87%&lt;/td&gt;
&lt;td&gt;79.74%&lt;/td&gt;
&lt;td&gt;74.45%&lt;/td&gt;
&lt;td&gt;68.12%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;流动比率&lt;/td&gt;
&lt;td&gt;0.71&lt;/td&gt;
&lt;td&gt;0.80&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;td&gt;0.84&lt;/td&gt;
&lt;td&gt;1.13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存货周转天数&lt;/td&gt;
&lt;td&gt;2.18 天&lt;/td&gt;
&lt;td&gt;1.71 天&lt;/td&gt;
&lt;td&gt;1.65 天&lt;/td&gt;
&lt;td&gt;15.38 天&lt;/td&gt;
&lt;td&gt;16.41 天&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;应收账款周转天数&lt;/td&gt;
&lt;td&gt;126.96 天&lt;/td&gt;
&lt;td&gt;86.57 天&lt;/td&gt;
&lt;td&gt;102.26 天&lt;/td&gt;
&lt;td&gt;88.47 天&lt;/td&gt;
&lt;td&gt;83.44 天&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;2. 🟡 优刻得-W（688158）&lt;/h2&gt;
&lt;p&gt;战略定位：高性价比 AI 算力服务商&lt;/p&gt;
&lt;p&gt;经营状况评价：&lt;/p&gt;
&lt;p&gt;优刻得呈现明显的经营改善趋势。2025 年一季报营业收入 3.76 亿元，同比增长 7.97%，终结了 2024 年以来的收入下滑态势。更重要的是盈利能力显著提升，销售毛利率达 24.34%，同比大幅改善 61.24%，反映出 AI 算力业务的议价能力增强。&lt;/p&gt;
&lt;p&gt;亏损状况持续收窄。净利润 -4473 万元，同比改善 27.70%，扣非净利润同样改善 27.22%。公司连续五个季度保持亏损收窄态势，显示出向盈利转折的积极信号。&lt;/p&gt;
&lt;p&gt;财务结构相对稳健。资产负债率 28.94%，处于合理水平。流动比率 1.46，短期偿债能力尚可。每股净资产 5.21 元，虽有下滑但幅度收窄。应收账款周转天数 112.85 天，回款周期较长但趋于稳定。&lt;/p&gt;
&lt;p&gt;优刻得正处于业务拐点期，收入重回增长轨道，盈利能力大幅改善，有望在 2025 年实现扭亏为盈。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;报告期&lt;/th&gt;
&lt;th&gt;2025 一季报&lt;/th&gt;
&lt;th&gt;2024 年报&lt;/th&gt;
&lt;th&gt;2024 三季报&lt;/th&gt;
&lt;th&gt;2024 中报&lt;/th&gt;
&lt;th&gt;2024 一季报&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;营业收入&lt;/td&gt;
&lt;td&gt;3.76 亿&lt;/td&gt;
&lt;td&gt;15.03 亿&lt;/td&gt;
&lt;td&gt;10.94 亿&lt;/td&gt;
&lt;td&gt;7.30 亿&lt;/td&gt;
&lt;td&gt;3.48 亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;营业收入同比增长&lt;/td&gt;
&lt;td&gt;7.97%&lt;/td&gt;
&lt;td&gt;-0.81%&lt;/td&gt;
&lt;td&gt;-0.47%&lt;/td&gt;
&lt;td&gt;-1.26%&lt;/td&gt;
&lt;td&gt;-5.32%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净利润&lt;/td&gt;
&lt;td&gt;-4473.25 万&lt;/td&gt;
&lt;td&gt;-2.41 亿&lt;/td&gt;
&lt;td&gt;-1.65 亿&lt;/td&gt;
&lt;td&gt;-1.08 亿&lt;/td&gt;
&lt;td&gt;-6187.44 万&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净利润同比增长&lt;/td&gt;
&lt;td&gt;27.70%&lt;/td&gt;
&lt;td&gt;29.67%&lt;/td&gt;
&lt;td&gt;41.76%&lt;/td&gt;
&lt;td&gt;42.37%&lt;/td&gt;
&lt;td&gt;34.68%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扣非净利润&lt;/td&gt;
&lt;td&gt;-4540.39 万&lt;/td&gt;
&lt;td&gt;-2.49 亿&lt;/td&gt;
&lt;td&gt;-1.82 亿&lt;/td&gt;
&lt;td&gt;-1.15 亿&lt;/td&gt;
&lt;td&gt;-6238.16 万&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扣非净利润同比增长&lt;/td&gt;
&lt;td&gt;27.22%&lt;/td&gt;
&lt;td&gt;25.98%&lt;/td&gt;
&lt;td&gt;33.70%&lt;/td&gt;
&lt;td&gt;40.99%&lt;/td&gt;
&lt;td&gt;38.01%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;每股净资产&lt;/td&gt;
&lt;td&gt;5.21 元&lt;/td&gt;
&lt;td&gt;5.29 元&lt;/td&gt;
&lt;td&gt;5.46 元&lt;/td&gt;
&lt;td&gt;5.57 元&lt;/td&gt;
&lt;td&gt;5.67 元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;销售毛利率&lt;/td&gt;
&lt;td&gt;24.34%&lt;/td&gt;
&lt;td&gt;18.86%&lt;/td&gt;
&lt;td&gt;19.55%&lt;/td&gt;
&lt;td&gt;18.43%&lt;/td&gt;
&lt;td&gt;15.10%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;销售净利率&lt;/td&gt;
&lt;td&gt;-11.97%&lt;/td&gt;
&lt;td&gt;-16.08%&lt;/td&gt;
&lt;td&gt;-15.19%&lt;/td&gt;
&lt;td&gt;-14.98%&lt;/td&gt;
&lt;td&gt;-17.82%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净资产收益率&lt;/td&gt;
&lt;td&gt;-1.88%&lt;/td&gt;
&lt;td&gt;-9.58%&lt;/td&gt;
&lt;td&gt;-6.48%&lt;/td&gt;
&lt;td&gt;-4.21%&lt;/td&gt;
&lt;td&gt;-2.38%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;资产负债率&lt;/td&gt;
&lt;td&gt;28.94%&lt;/td&gt;
&lt;td&gt;29.16%&lt;/td&gt;
&lt;td&gt;28.58%&lt;/td&gt;
&lt;td&gt;28.70%&lt;/td&gt;
&lt;td&gt;29.26%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;流动比率&lt;/td&gt;
&lt;td&gt;1.46&lt;/td&gt;
&lt;td&gt;1.52&lt;/td&gt;
&lt;td&gt;1.70&lt;/td&gt;
&lt;td&gt;1.75&lt;/td&gt;
&lt;td&gt;1.84&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存货周转天数&lt;/td&gt;
&lt;td&gt;9.78 天&lt;/td&gt;
&lt;td&gt;12.10 天&lt;/td&gt;
&lt;td&gt;20.77 天&lt;/td&gt;
&lt;td&gt;17.66 天&lt;/td&gt;
&lt;td&gt;20.14 天&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;应收账款周转天数&lt;/td&gt;
&lt;td&gt;112.85 天&lt;/td&gt;
&lt;td&gt;112.78 天&lt;/td&gt;
&lt;td&gt;115.25 天&lt;/td&gt;
&lt;td&gt;117.04 天&lt;/td&gt;
&lt;td&gt;124.31 天&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;3. 🟡 神州数码（000034）&lt;/h2&gt;
&lt;p&gt;战略定位：全栈式 AI 云服务集成商&lt;/p&gt;
&lt;p&gt;核心能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;异构算力适配：推出神州鲲泰系列 AI 服务器，支持华为昇腾、英伟达 GPU 等多架构芯片，实现国产替代与主流技术双覆盖&lt;/li&gt;
&lt;li&gt;平台化服务：自研&quot;神州问学&quot;平台集成阿里、百度、OpenAI 等主流大模型，提供文生图/视频工具，3 分钟完成模型部署&lt;/li&gt;
&lt;li&gt;算力基建：深圳智算中心投入运营，支持千亿参数级模型训练，服务腾讯云、阿里云、华为云三大生态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;经营状况评价：&lt;/p&gt;
&lt;p&gt;神州数码呈现典型的&quot;增收不增利&quot;困境。2025 年一季报营业收入 317.78 亿元，同比增长 8.56%，收入规模保持稳定增长态势。净利润 2.17 亿元，同比下降 7.51%，盈利能力出现倒退。扣非净利润 2.24 亿元，同比增长 10.39%，表明主营业务盈利能力尚可，净利润下滑主要受非经常性损益拖累。&lt;/p&gt;
&lt;p&gt;盈利质量堪忧。销售毛利率仅 3.73%，同比大幅下降 18.54%，反映出 AI 云服务市场竞争白热化。销售净利率 0.74%，处于极低水平，每百元收入仅产生 0.74 元净利润。作为技术服务商，如此微薄的利润率暴露出其在价值链中的话语权不足。&lt;/p&gt;
&lt;p&gt;财务结构存在隐患。资产负债率高达 74.73%，债务负担沉重。流动比率 1.29，短期偿债压力较大。每股净资产 15.02 元，同比增长 14.21%，主要受股本扩张影响。应收账款周转天数 33.46 天，回款周期较短，现金管理能力尚可。&lt;/p&gt;
&lt;p&gt;神州数码正面临 AI 转型的成长烦恼。收入增长稳健但盈利能力下滑，表明公司在 AI 算力集成领域具备一定竞争力，但成本控制能力不足。在 AI 基础设施建设热潮中，神州数码更像是&quot;卖铲子的人&quot;，受益于行业增长但难以获得超额收益。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;报告期&lt;/th&gt;
&lt;th&gt;2025 一季报&lt;/th&gt;
&lt;th&gt;2024 年报&lt;/th&gt;
&lt;th&gt;2024 三季报&lt;/th&gt;
&lt;th&gt;2024 中报&lt;/th&gt;
&lt;th&gt;2024 一季报&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;营业收入&lt;/td&gt;
&lt;td&gt;317.78 亿&lt;/td&gt;
&lt;td&gt;1281.66 亿&lt;/td&gt;
&lt;td&gt;915.71 亿&lt;/td&gt;
&lt;td&gt;625.62 亿&lt;/td&gt;
&lt;td&gt;292.72 亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;营业收入同比增长&lt;/td&gt;
&lt;td&gt;8.56%&lt;/td&gt;
&lt;td&gt;7.14%&lt;/td&gt;
&lt;td&gt;8.81%&lt;/td&gt;
&lt;td&gt;12.52%&lt;/td&gt;
&lt;td&gt;7.95%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净利润&lt;/td&gt;
&lt;td&gt;2.17 亿&lt;/td&gt;
&lt;td&gt;7.53 亿&lt;/td&gt;
&lt;td&gt;8.94 亿&lt;/td&gt;
&lt;td&gt;5.09 亿&lt;/td&gt;
&lt;td&gt;2.35 亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净利润同比增长&lt;/td&gt;
&lt;td&gt;-7.51%&lt;/td&gt;
&lt;td&gt;-35.76%&lt;/td&gt;
&lt;td&gt;5.04%&lt;/td&gt;
&lt;td&gt;17.52%&lt;/td&gt;
&lt;td&gt;12.35%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扣非净利润&lt;/td&gt;
&lt;td&gt;2.24 亿&lt;/td&gt;
&lt;td&gt;10.15 亿&lt;/td&gt;
&lt;td&gt;8.61 亿&lt;/td&gt;
&lt;td&gt;4.55 亿&lt;/td&gt;
&lt;td&gt;2.03 亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扣非净利润同比增长&lt;/td&gt;
&lt;td&gt;10.39%&lt;/td&gt;
&lt;td&gt;-19.68%&lt;/td&gt;
&lt;td&gt;2.10%&lt;/td&gt;
&lt;td&gt;6.14%&lt;/td&gt;
&lt;td&gt;-14.73%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;每股净资产&lt;/td&gt;
&lt;td&gt;15.02 元&lt;/td&gt;
&lt;td&gt;13.70 元&lt;/td&gt;
&lt;td&gt;13.83 元&lt;/td&gt;
&lt;td&gt;13.46 元&lt;/td&gt;
&lt;td&gt;13.15 元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;销售毛利率&lt;/td&gt;
&lt;td&gt;3.73%&lt;/td&gt;
&lt;td&gt;4.21%&lt;/td&gt;
&lt;td&gt;4.49%&lt;/td&gt;
&lt;td&gt;4.45%&lt;/td&gt;
&lt;td&gt;4.57%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;销售净利率&lt;/td&gt;
&lt;td&gt;0.74%&lt;/td&gt;
&lt;td&gt;0.61%&lt;/td&gt;
&lt;td&gt;1.00%&lt;/td&gt;
&lt;td&gt;0.84%&lt;/td&gt;
&lt;td&gt;0.85%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净资产收益率&lt;/td&gt;
&lt;td&gt;2.27%&lt;/td&gt;
&lt;td&gt;8.47%&lt;/td&gt;
&lt;td&gt;9.99%&lt;/td&gt;
&lt;td&gt;5.81%&lt;/td&gt;
&lt;td&gt;2.70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;资产负债率&lt;/td&gt;
&lt;td&gt;74.73%&lt;/td&gt;
&lt;td&gt;78.02%&lt;/td&gt;
&lt;td&gt;77.64%&lt;/td&gt;
&lt;td&gt;79.16%&lt;/td&gt;
&lt;td&gt;78.74%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;流动比率&lt;/td&gt;
&lt;td&gt;1.29&lt;/td&gt;
&lt;td&gt;1.24&lt;/td&gt;
&lt;td&gt;1.18&lt;/td&gt;
&lt;td&gt;1.21&lt;/td&gt;
&lt;td&gt;1.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存货周转天数&lt;/td&gt;
&lt;td&gt;37.80 天&lt;/td&gt;
&lt;td&gt;36.59 天&lt;/td&gt;
&lt;td&gt;40.86 天&lt;/td&gt;
&lt;td&gt;39.16 天&lt;/td&gt;
&lt;td&gt;41.56 天&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;应收账款周转天数&lt;/td&gt;
&lt;td&gt;33.46 天&lt;/td&gt;
&lt;td&gt;32.81 天&lt;/td&gt;
&lt;td&gt;34.43 天&lt;/td&gt;
&lt;td&gt;36.25 天&lt;/td&gt;
&lt;td&gt;36.64 天&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;4. 🔴 首都在线（300846）&lt;/h2&gt;
&lt;p&gt;战略定位：全球化弹性算力网络运营商&lt;/p&gt;
&lt;p&gt;核心能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节点覆盖：50+ 国家 94 个数据中心 + 千个边缘节点，构建低延迟全球算力网&lt;/li&gt;
&lt;li&gt;资源储备：绑定英伟达/燧原科技 GPU 资源，支持实时渲染与大模型训练&lt;/li&gt;
&lt;li&gt;调度能力：异构算力平台实现动态资源分配，降低数字孪生、车联网等场景应用门槛&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;经营状况评价：&lt;/p&gt;
&lt;p&gt;首都在线正陷入收入萎缩与持续亏损的双重困境。2025 年一季报营业收入 3.06 亿元，同比下降 5.53%，终结了此前连续增长态势。净利润亏损 3973.62 万元，虽然亏损幅度同比收窄 14.54%，但依然深陷泥潭。扣非净利润亏损 4376.44 万元，表明主营业务盈利能力严重不足。&lt;/p&gt;
&lt;p&gt;盈利结构严重失衡。销售毛利率 11.11%，虽然同比提升 9.93%，但在 AI 算力行业中处于偏低水平。销售净利率 -12.20%，意味着每卖 100 元就要亏损 12.20 元。作为全球化算力网络运营商，如此惨淡的盈利表现暴露出其成本控制失效和商业模式缺陷。&lt;/p&gt;
&lt;p&gt;财务风险不断累积。流动比率 0.97，短期偿债能力告急。每股净资产 1.79 元，同比暴跌 23.46%，股东权益被快速侵蚀。应收账款周转天数 87.02 天，回款周期冗长，现金流管理堪忧。每股未分配利润 -1.33 元，累计亏损持续扩大。&lt;/p&gt;
&lt;p&gt;首都在线面临典型的&quot;规模不经济&quot;困境。全球 94 个数据中心的重资产投入带来巨额折旧和运营成本，但收入增长却停滞不前。在 AI 算力基础设施红海竞争中，首都在线更像是&quot;先烈&quot;而非&quot;先驱&quot;，高昂的基础设施投入与微薄的回报形成鲜明对比。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;报告期&lt;/th&gt;
&lt;th&gt;2025 一季报&lt;/th&gt;
&lt;th&gt;2024 年报&lt;/th&gt;
&lt;th&gt;2024 三季报&lt;/th&gt;
&lt;th&gt;2024 中报&lt;/th&gt;
&lt;th&gt;2024 一季报&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;营业收入&lt;/td&gt;
&lt;td&gt;3.06 亿&lt;/td&gt;
&lt;td&gt;13.97 亿&lt;/td&gt;
&lt;td&gt;10.53 亿&lt;/td&gt;
&lt;td&gt;7.13 亿&lt;/td&gt;
&lt;td&gt;3.24 亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;营业收入同比增长&lt;/td&gt;
&lt;td&gt;-5.53%&lt;/td&gt;
&lt;td&gt;12.35%&lt;/td&gt;
&lt;td&gt;22.13%&lt;/td&gt;
&lt;td&gt;26.90%&lt;/td&gt;
&lt;td&gt;19.56%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净利润&lt;/td&gt;
&lt;td&gt;-3973.62 万&lt;/td&gt;
&lt;td&gt;-3.03 亿&lt;/td&gt;
&lt;td&gt;-1.46 亿&lt;/td&gt;
&lt;td&gt;-9218.70 万&lt;/td&gt;
&lt;td&gt;-4649.83 万&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净利润同比增长&lt;/td&gt;
&lt;td&gt;14.54%&lt;/td&gt;
&lt;td&gt;10.86%&lt;/td&gt;
&lt;td&gt;0.29%&lt;/td&gt;
&lt;td&gt;9.86%&lt;/td&gt;
&lt;td&gt;18.84%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扣非净利润&lt;/td&gt;
&lt;td&gt;-4376.44 万&lt;/td&gt;
&lt;td&gt;-2.96 亿&lt;/td&gt;
&lt;td&gt;-1.49 亿&lt;/td&gt;
&lt;td&gt;-9096.24 万&lt;/td&gt;
&lt;td&gt;-4688.97 万&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扣非净利润同比增长&lt;/td&gt;
&lt;td&gt;6.67%&lt;/td&gt;
&lt;td&gt;10.60%&lt;/td&gt;
&lt;td&gt;2.74%&lt;/td&gt;
&lt;td&gt;15.56%&lt;/td&gt;
&lt;td&gt;21.27%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;每股净资产&lt;/td&gt;
&lt;td&gt;1.79 元&lt;/td&gt;
&lt;td&gt;1.86 元&lt;/td&gt;
&lt;td&gt;2.15 元&lt;/td&gt;
&lt;td&gt;2.26 元&lt;/td&gt;
&lt;td&gt;2.34 元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;销售毛利率&lt;/td&gt;
&lt;td&gt;11.11%&lt;/td&gt;
&lt;td&gt;8.07%&lt;/td&gt;
&lt;td&gt;8.75%&lt;/td&gt;
&lt;td&gt;9.88%&lt;/td&gt;
&lt;td&gt;10.11%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;销售净利率&lt;/td&gt;
&lt;td&gt;-12.20%&lt;/td&gt;
&lt;td&gt;-21.08%&lt;/td&gt;
&lt;td&gt;-13.24%&lt;/td&gt;
&lt;td&gt;-12.38%&lt;/td&gt;
&lt;td&gt;-13.75%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净资产收益率&lt;/td&gt;
&lt;td&gt;-4.35%&lt;/td&gt;
&lt;td&gt;-29.90%&lt;/td&gt;
&lt;td&gt;-13.74%&lt;/td&gt;
&lt;td&gt;-8.73%&lt;/td&gt;
&lt;td&gt;-4.83%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;资产负债率&lt;/td&gt;
&lt;td&gt;50.80%&lt;/td&gt;
&lt;td&gt;49.61%&lt;/td&gt;
&lt;td&gt;46.54%&lt;/td&gt;
&lt;td&gt;46.47%&lt;/td&gt;
&lt;td&gt;47.71%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;流动比率&lt;/td&gt;
&lt;td&gt;0.97&lt;/td&gt;
&lt;td&gt;0.96&lt;/td&gt;
&lt;td&gt;1.04&lt;/td&gt;
&lt;td&gt;1.04&lt;/td&gt;
&lt;td&gt;1.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存货周转天数&lt;/td&gt;
&lt;td&gt;0.38 天&lt;/td&gt;
&lt;td&gt;0.90 天&lt;/td&gt;
&lt;td&gt;1.26 天&lt;/td&gt;
&lt;td&gt;1.29 天&lt;/td&gt;
&lt;td&gt;1.50 天&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;应收账款周转天数&lt;/td&gt;
&lt;td&gt;87.02 天&lt;/td&gt;
&lt;td&gt;82.30 天&lt;/td&gt;
&lt;td&gt;88.39 天&lt;/td&gt;
&lt;td&gt;88.45 天&lt;/td&gt;
&lt;td&gt;95.80 天&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;5. 🟢 浪潮信息（000977）&lt;/h2&gt;
&lt;p&gt;战略定位：全球 AI 服务器领导者&lt;/p&gt;
&lt;p&gt;核心能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;硬件创新：全球首推预置 DeepSeek 模型的海若一体机，单机支持千亿参数推理，市占率 11.3%&lt;/li&gt;
&lt;li&gt;能效突破：冷板式液冷技术实现 PUE 1.15，较风冷节能 30%，拥有 500+ 项液冷专利&lt;/li&gt;
&lt;li&gt;开源生态：发布&quot;源 2.0&quot;千亿参数开源大模型，构建金融、医疗行业专属解决方案&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;经营状况评价：&lt;/p&gt;
&lt;p&gt;浪潮信息正经历 AI 算力基础设施建设的黄金期。2025 年一季报营业收入 468.58 亿元，同比增长 165.31%，延续了 2024 年以来的爆发式增长态势。净利润 4.63 亿元，同比增长 52.78%，扣非净利润 4.27 亿元，同比增长 80.76%，盈利能力持续改善。&lt;/p&gt;
&lt;p&gt;盈利结构呈现典型的硬件制造特征。销售毛利率 3.45%，虽然同比大幅下降 57.30%，但在 AI 服务器行业属于正常水平。销售净利率 0.98%，每百元收入产生 0.98 元净利润，反映出公司在 AI 算力硬件供应链中的议价能力有限。作为全球 AI 服务器领导者，浪潮信息更像是&quot;卖铲子的人&quot;，受益于 AI 基础设施建设热潮但难以获得超额利润。&lt;/p&gt;
&lt;p&gt;财务结构存在隐忧。资产负债率高达 77.47%，债务负担沉重。流动比率 1.34，短期偿债能力尚可但压力较大。每股净资产 13.77 元，同比增长 7.25%，主要受盈利积累影响。应收账款周转天数 27.43 天，回款周期较短，现金管理能力较强。&lt;/p&gt;
&lt;p&gt;运营效率显著提升。存货周转天数从 120.69 天降至 86.05 天，存货管理效率大幅改善。总资产周转率 0.58 次，虽然同比下降但仍在合理区间。固定资产周转率 16.71 次，资产利用效率较高。&lt;/p&gt;
&lt;p&gt;浪潮信息正处于 AI 算力硬件制造的巅峰期。收入爆发式增长，盈利能力持续改善，但微薄的利润率暴露出其在价值链中的话语权不足。在 AI 基础设施建设热潮中，浪潮信息更像是&quot;卖铲子的人&quot;，受益于行业增长但难以获得超额收益。随着 AI 算力需求趋于稳定，公司可能面临增长放缓的挑战。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;报告期&lt;/th&gt;
&lt;th&gt;2025 一季报&lt;/th&gt;
&lt;th&gt;2024 年报&lt;/th&gt;
&lt;th&gt;2024 三季报&lt;/th&gt;
&lt;th&gt;2024 中报&lt;/th&gt;
&lt;th&gt;2024 一季报&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;营业收入&lt;/td&gt;
&lt;td&gt;468.58 亿&lt;/td&gt;
&lt;td&gt;1147.67 亿&lt;/td&gt;
&lt;td&gt;831.26 亿&lt;/td&gt;
&lt;td&gt;420.64 亿&lt;/td&gt;
&lt;td&gt;176.62 亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;营业收入同比增长&lt;/td&gt;
&lt;td&gt;165.31%&lt;/td&gt;
&lt;td&gt;74.24%&lt;/td&gt;
&lt;td&gt;72.26%&lt;/td&gt;
&lt;td&gt;68.71%&lt;/td&gt;
&lt;td&gt;85.32%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净利润&lt;/td&gt;
&lt;td&gt;4.63 亿&lt;/td&gt;
&lt;td&gt;22.92 亿&lt;/td&gt;
&lt;td&gt;12.94 亿&lt;/td&gt;
&lt;td&gt;5.97 亿&lt;/td&gt;
&lt;td&gt;3.03 亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净利润同比增长&lt;/td&gt;
&lt;td&gt;52.78%&lt;/td&gt;
&lt;td&gt;28.55%&lt;/td&gt;
&lt;td&gt;67.05%&lt;/td&gt;
&lt;td&gt;90.56%&lt;/td&gt;
&lt;td&gt;64.39%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扣非净利润&lt;/td&gt;
&lt;td&gt;4.27 亿&lt;/td&gt;
&lt;td&gt;18.74 亿&lt;/td&gt;
&lt;td&gt;11.55 亿&lt;/td&gt;
&lt;td&gt;4.22 亿&lt;/td&gt;
&lt;td&gt;2.40 亿&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扣非净利润同比增长&lt;/td&gt;
&lt;td&gt;80.76%&lt;/td&gt;
&lt;td&gt;67.59%&lt;/td&gt;
&lt;td&gt;176.67%&lt;/td&gt;
&lt;td&gt;3.61 万%&lt;/td&gt;
&lt;td&gt;62.96%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;每股净资产&lt;/td&gt;
&lt;td&gt;13.77 元&lt;/td&gt;
&lt;td&gt;13.58 元&lt;/td&gt;
&lt;td&gt;12.84 元&lt;/td&gt;
&lt;td&gt;12.50 元&lt;/td&gt;
&lt;td&gt;12.42 元&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;销售毛利率&lt;/td&gt;
&lt;td&gt;3.45%&lt;/td&gt;
&lt;td&gt;6.85%&lt;/td&gt;
&lt;td&gt;6.70%&lt;/td&gt;
&lt;td&gt;7.74%&lt;/td&gt;
&lt;td&gt;8.08%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;销售净利率&lt;/td&gt;
&lt;td&gt;0.98%&lt;/td&gt;
&lt;td&gt;2.00%&lt;/td&gt;
&lt;td&gt;1.54%&lt;/td&gt;
&lt;td&gt;1.37%&lt;/td&gt;
&lt;td&gt;1.68%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;净资产收益率&lt;/td&gt;
&lt;td&gt;2.30%&lt;/td&gt;
&lt;td&gt;12.06%&lt;/td&gt;
&lt;td&gt;7.01%&lt;/td&gt;
&lt;td&gt;3.27%&lt;/td&gt;
&lt;td&gt;1.69%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;资产负债率&lt;/td&gt;
&lt;td&gt;77.47%&lt;/td&gt;
&lt;td&gt;71.44%&lt;/td&gt;
&lt;td&gt;77.19%&lt;/td&gt;
&lt;td&gt;70.34%&lt;/td&gt;
&lt;td&gt;62.74%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;流动比率&lt;/td&gt;
&lt;td&gt;1.34&lt;/td&gt;
&lt;td&gt;1.50&lt;/td&gt;
&lt;td&gt;1.39&lt;/td&gt;
&lt;td&gt;1.58&lt;/td&gt;
&lt;td&gt;2.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;存货周转天数&lt;/td&gt;
&lt;td&gt;86.05 天&lt;/td&gt;
&lt;td&gt;100.60 天&lt;/td&gt;
&lt;td&gt;100.30 天&lt;/td&gt;
&lt;td&gt;118.32 天&lt;/td&gt;
&lt;td&gt;120.69 天&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;应收账款周转天数&lt;/td&gt;
&lt;td&gt;27.43 天&lt;/td&gt;
&lt;td&gt;32.52 天&lt;/td&gt;
&lt;td&gt;53.40 天&lt;/td&gt;
&lt;td&gt;48.62 天&lt;/td&gt;
&lt;td&gt;51.31 天&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;p&gt;表格数据来自雪球&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;https://www.qingcloud.com/aboutus&lt;/li&gt;
&lt;li&gt;https://www.ucloud.cn/site/about/intro/&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>Echo Book Notes</title><link>https://nexmoe.com/products/echo-book-notes</link><guid isPermaLink="true">https://nexmoe.com/products/echo-book-notes</guid><description>Your thoughts and notes should not be forgotten. Revisit highlights daily with AI commentary to bring new value to your WeRead highlights.</description><pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20250724_home.DzW4zpJ2.png&quot; alt=&quot;Echo Book Notes&quot; /&gt;&lt;/p&gt;&lt;p&gt;Your thoughts and notes should not be forgotten. Revisit highlights daily with AI commentary to bring new value to your WeRead highlights.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://x.com/nexmoe/status/1903339054068027603&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://x.com/nexmoe/status/1903339054068027603&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/echo-book-notes&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://x.com/nexmoe/status/1903339054068027603&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View Echo Book Notes&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20250724_home.DzW4zpJ2.png" length="248801" type="image/png"/></item><item><title>GEO Checker</title><link>https://nexmoe.com/products/geochecker</link><guid isPermaLink="true">https://nexmoe.com/products/geochecker</guid><description>An all-in-one geographic availability checker for websites, with multi-region access tests, status code checks, and latency insights to quickly locate region-specific network issues.</description><pubDate>Thu, 24 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20251204_image.v_7p7I3f.png&quot; alt=&quot;GEO Checker&quot; /&gt;&lt;/p&gt;&lt;p&gt;An all-in-one geographic availability checker for websites, with multi-region access tests, status code checks, and latency insights to quickly locate region-specific network issues.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://geochecker.net&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://geochecker.net&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/geochecker&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://geochecker.net&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Visit GEO Checker&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20251204_image.v_7p7I3f.png" length="1122913" type="image/png"/></item><item><title>I Found the Fastest and Cheapest Way to Deploy FLUX.1 Kontext [dev]</title><link>https://nexmoe.com/posts/flux-kontext-dev-fastest-deployment-guide</link><guid isPermaLink="true">https://nexmoe.com/posts/flux-kontext-dev-fastest-deployment-guide</guid><pubDate>Fri, 04 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;FLUX.1 Kontext [dev] just dropped and immediately caused a stir in the open‑source community. This new model changes the game for image editing. Unlike traditional image generation tools, it understands &lt;strong&gt;context&lt;/strong&gt;, so you can refine an image step by step like a conversation, instead of dumping a pile of prompts and hoping for the best.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/bb95d7d41ef5804b424329085a14a50b51cd78833b16fa8e4d6cb2d0b244c76c.png&quot; alt=&quot;picture-2025-07-04-18-39-08&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;From Keyword Matching to Context Understanding&lt;/h2&gt;
&lt;p&gt;Traditional image models are basically doing keyword matching: you type “a red cat,” and it searches training data for similar combinations. FLUX.1 Kontext [dev] uses a multimodal flow‑matching architecture that processes both text instructions and image content, so it can actually understand what you want.&lt;/p&gt;
&lt;p&gt;What does that mean? Suppose you want to change the background of a portrait. A traditional model might modify the person too, because it can’t tell what should stay. FLUX.1 Kontext [dev] understands “this is the person, the background is environment,” and only changes what you specify.&lt;/p&gt;
&lt;p&gt;More importantly, it supports &lt;strong&gt;multi‑round iterative editing&lt;/strong&gt;. You can say “change the background to a beach,” then say “make the water bluer,” and it remembers previous edits and keeps refining — instead of regenerating a brand‑new image from scratch.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://preview.redd.it/learn-kontext-with-2-refs-like-a-pro-v0-w63wdee6yaaf1.jpg?width=640&amp;amp;crop=smart&amp;amp;auto=webp&amp;amp;s=66f318d46899abf1ca406ed06525792d73972288&quot; alt=&quot;r/comfyui - Learn Kontext with 2 refs like a pro&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;30‑Second Deployment Guide&lt;/h2&gt;
&lt;p&gt;We’ve integrated FLUX.1 Kontext [dev] on the &lt;strong&gt;Gongji Compute&lt;/strong&gt; platform, so you can try it right away.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Visit https://console.suanli.cn/serverless/create or click “Get Started” on the website&lt;/li&gt;
&lt;li&gt;Choose a suitable GPU configuration&lt;/li&gt;
&lt;li&gt;Select “Flux.1 Kontext Dev” in service settings&lt;/li&gt;
&lt;li&gt;Click deploy&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The whole process takes less than a minute. Once deployed, you can call the model via API.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/df7c1b85d39dccdf896ec7315f5e16343f3e49e5a35e2284150a510695983ced.png&quot; alt=&quot;picture-2025-07-04-18-36-51&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Performance&lt;/h2&gt;
&lt;p&gt;In our tests, FLUX.1 Kontext [dev] runs &lt;strong&gt;3–8x faster&lt;/strong&gt; than similar models, largely thanks to its flow‑matching architecture. Traditional diffusion models require hundreds of denoising steps, while FLUX.1 Kontext [dev] uses a more efficient sampling algorithm that drastically cuts compute steps.&lt;/p&gt;
&lt;p&gt;Speed doesn’t come at the cost of quality. In our tests, image detail preservation and style consistency are excellent, especially in complex scenes, where it maintains coordination between elements.&lt;/p&gt;
&lt;h2&gt;Cost&lt;/h2&gt;
&lt;p&gt;On Gongji Compute, FLUX.1 Kontext [dev] costs &lt;strong&gt;only 1.68 RMB per hour&lt;/strong&gt;, depending on image resolution and complexity. Compared with overseas commercial APIs, that’s about &lt;strong&gt;80% cheaper&lt;/strong&gt;, and there’s no network latency.&lt;/p&gt;
&lt;h2&gt;Best‑Fit Scenarios&lt;/h2&gt;
&lt;p&gt;FLUX.1 Kontext [dev] is best for image editing tasks that require fine control and multi‑round iteration, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;E‑commerce product images&lt;/strong&gt;: quickly swap backgrounds, adjust lighting, tweak details without affecting the product itself&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Content creation&lt;/strong&gt;: refine images for articles or videos based on themes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Design prototyping&lt;/strong&gt;: test different visual concepts in early design stages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Traditional image editors either require professional skills or only handle simple tasks. FLUX.1 Kontext [dev] fills this gap, enabling ordinary users to handle complex edits.&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;FLUX.1 Kontext [dev] signals a new era in image generation. The old “one‑shot generation” model is being replaced by &lt;strong&gt;conversational creation&lt;/strong&gt;, dramatically lowering the barrier to professional image editing.&lt;/p&gt;
&lt;p&gt;The model is still iterating fast. We expect more updates in the coming months — video editing support, more art styles, and better Chinese understanding.&lt;/p&gt;
&lt;p&gt;Gongji Compute will keep pace with these updates so users can experience the latest features first. If you need image generation or editing, now is the best time to try FLUX.1 Kontext [dev].&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>HTTPie: A Human-Centered Tool That Reshapes API Debugging</title><link>https://nexmoe.com/posts/open-source-httpie</link><guid isPermaLink="true">https://nexmoe.com/posts/open-source-httpie</guid><description>In an API-first era, HTTPie is changing how developers interact with APIs through intuitive design and powerful features.</description><pubDate>Tue, 01 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In backend development, API debugging can easily take up a third of the workday. &lt;code&gt;curl&lt;/code&gt; is powerful but hard to use; Postman is feature‑rich but bloated, and its subscription model is confusing. HTTPie offers a fresh alternative.&lt;/p&gt;
&lt;p&gt;What stands out most about HTTPie is its pursuit of &lt;strong&gt;human‑centered design&lt;/strong&gt;. It makes complex HTTP requests simple and intuitive.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Visual request building&lt;/strong&gt;: click to build HTTP requests with all parameters — auth, headers, body — supporting REST, GraphQL, and classic HTTP.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export in multiple formats&lt;/strong&gt;: one‑click export to curl, HTTPie CLI, and more for sharing or documentation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Highlighted responses&lt;/strong&gt;: auto‑format JSON with syntax highlighting and search.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offline use&lt;/strong&gt;: no sign‑up required; full features offline, with cross‑device sync.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/25eb1eb7c7d8be249e3db2317638cfa456eb5c4fd56e8c3c16703692a57e22bf.png&quot; alt=&quot;picture-2025-07-01-14-57-36&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Quick Start&lt;/h2&gt;
&lt;h3&gt;Installation&lt;/h3&gt;
&lt;p&gt;HTTPie comes in two forms. The web version is at https://httpie.io/app or the short alias https://req.new. The desktop app supports macOS, Windows, and Linux, downloadable from https://httpie.io/download.&lt;/p&gt;
&lt;p&gt;Linux users should note the AppImage format — AppImageLauncher is recommended for a better experience.&lt;/p&gt;
&lt;h3&gt;Basics&lt;/h3&gt;
&lt;p&gt;You only need two things to create a request: HTTP method and URL. HTTPie auto‑switches methods based on content (e.g., adding a body switches GET to POST).&lt;/p&gt;
&lt;p&gt;HTTPie supports importing curl commands directly. Paste any curl command into the URL field and it auto‑parses parameters. You can also bulk import via the sidebar “+” menu and “Import.”&lt;/p&gt;
&lt;p&gt;Headers are edited in a dedicated form with auto‑complete and smart merging. Auth supports Basic, Bearer Token, and API Key. Request bodies support text, forms, file uploads, and GraphQL, each with tailored editors and previews.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/5021e38f31ecb411b0e075fc97d83666.gif&quot; alt=&quot;5021e38f31ecb411b0e075fc97d83666.gif&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Design Philosophy&lt;/h2&gt;
&lt;h3&gt;Reduce Cognitive Load&lt;/h3&gt;
&lt;p&gt;Traditional API tools prioritize completeness. HTTPie takes the opposite path: it abstracts HTTP into a few core concepts — method, URL, headers, auth, body — reducing mental overhead.&lt;/p&gt;
&lt;h3&gt;Workflow Integration&lt;/h3&gt;
&lt;p&gt;HTTPie’s variable system and environment management reflect real development needs. Developers switch between dev/test/prod constantly, but traditional tools make it painful. HTTPie lets you define variables and switch environments quickly.&lt;/p&gt;
&lt;p&gt;Collections improve team collaboration. Related API requests live in one collection, inherit auth and environment variables, and avoid repeated configuration.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/da94f45b1e50e81e875ab5f07848daac78edcf6175929ccd2a9449c86d893336.png&quot; alt=&quot;picture-2025-07-01-15-04-50&quot; /&gt;&lt;/p&gt;
&lt;p&gt;HTTPie also understands modern workflows: fully offline mode means debugging works even with unstable networks or strict security requirements. Users who don’t want to register can still use all core features locally.&lt;/p&gt;
&lt;p&gt;When cross‑device collaboration is needed, real‑time sync keeps data consistent. Collections created on a desktop and environment tweaks on a laptop stay aligned everywhere. This flexibility makes HTTPie fit different team habits and security needs.&lt;/p&gt;
&lt;h3&gt;AI Assistance&lt;/h3&gt;
&lt;p&gt;HTTPie recently introduced AI‑assisted requests. You can describe what you want in natural language, and it generates the HTTP request. Example: “Fetch GitHub user list,” and it builds the corresponding GitHub API call.&lt;/p&gt;
&lt;p&gt;This reduces the need to dig through API docs and helps developers onboard quickly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/807aefb902f1c292fcd3045bcbbd69909f981a6aa9a653c8d698a9fdabafac21.png&quot; alt=&quot;picture-2025-07-01-15-02-44&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Final Thoughts&lt;/h2&gt;
&lt;p&gt;Choosing HTTPie is choosing a development philosophy: tools should serve people, not force people to adapt to tools. This matters in fast‑iterating development environments.&lt;/p&gt;
&lt;p&gt;HTTPie’s cross‑platform support and sync ensure consistent experiences across devices and OSs — crucial for distributed teams.&lt;/p&gt;
&lt;p&gt;HTTPie redefines the standard for API debugging tools. It shows that the best developer tools are not about piling on features, but about deep understanding of user needs and polished experience. In an API‑first era, it’s worth trying.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>A 4.2MB Domain Redirect Service</title><link>https://nexmoe.com/posts/domain-redirect</link><guid isPermaLink="true">https://nexmoe.com/posts/domain-redirect</guid><description>A lightweight Go-based domain redirect service that supports multi-target round-robin. Docker image is only 4.2MB and memory usage is 1.277MB.</description><pubDate>Sun, 29 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Got a bunch of idle domains and want a redirect service, but Caddy’s config makes your head hurt? This 4.2MB Go service might be exactly what you need.&lt;/p&gt;
&lt;p&gt;domain-redirect is a lightweight service built specifically for domain redirection. It turns complex config into just a few environment variables. Simple and flexible, and suitable for production use.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Project:&lt;/strong&gt; &lt;a href=&quot;https://github.com/nexmoe/domain-redirect&quot;&gt;https://github.com/nexmoe/domain-redirect&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Three‑Minute Quick Start&lt;/h2&gt;
&lt;p&gt;The easiest way is Docker:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;docker run -d \
  -p 8080:8080 \
  -e DOMAIN_MAPPING_1=example.com-&amp;gt;https://target1.com,https://target2.com \
  nexmoe/domain-redirect
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This command starts a redirect service that round‑robins requests for &lt;code&gt;example.com&lt;/code&gt; to two targets.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PORT&lt;/code&gt;: listening port (default 8080)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PRESERVE_PATH&lt;/code&gt;: keep original path (default false). If &quot;true&quot;, redirects keep request path&lt;/li&gt;
&lt;li&gt;&lt;code&gt;INCLUDE_REFERRAL&lt;/code&gt;: include referrer domain info (default false). If &quot;true&quot;, adds a &lt;code&gt;ref&lt;/code&gt; param&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ENABLE_TIMESTAMP&lt;/code&gt;: add timestamp param (default false). If &quot;true&quot;, adds &lt;code&gt;_t&lt;/code&gt; to prevent caching&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more complex configs, use &lt;code&gt;docker-compose.yml&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;version: &apos;3&apos;
services:
  domain-redirect:
    image: nexmoe/domain-redirect
    ports:
      - &quot;8080:8080&quot;
    environment:
      - DOMAIN_MAPPING_1=blog.example.com-&amp;gt;https://blog.target.com
      - DOMAIN_MAPPING_2=shop.example.com-&amp;gt;https://shop1.com,https://shop2.com
      - PRESERVE_PATH=true
      - INCLUDE_REFERRAL=true
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now all domains redirect per rules. Paths are preserved and referrer info is added to the URL for analytics.&lt;/p&gt;
&lt;h2&gt;Full Config Reference&lt;/h2&gt;
&lt;h3&gt;Domain Mapping&lt;/h3&gt;
&lt;p&gt;Each mapping rule uses &lt;code&gt;DOMAIN_MAPPING_*&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DOMAIN_MAPPING_&amp;lt;ANY_NAME&amp;gt;=&amp;lt;domain&amp;gt;-&amp;gt;&amp;lt;target1&amp;gt;,&amp;lt;target2&amp;gt;,...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DOMAIN_MAPPING_1=example.com-&amp;gt;https://target1.com,https://target2.com
DOMAIN_MAPPING_BLOG=blog.example.com-&amp;gt;https://myblog.com
DOMAIN_MAPPING_SHOP=shop.example.com-&amp;gt;https://shop1.com,https://shop2.com,https://shop3.com
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Example&lt;/h3&gt;
&lt;p&gt;Assume:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DOMAIN_MAPPING_1=example.com-&amp;gt;https://target1.com,https://target2.com
PRESERVE_PATH=true
INCLUDE_REFERRAL=true
ENABLE_TIMESTAMP=true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Requesting &lt;code&gt;http://example.com/api/users&lt;/code&gt; might redirect to:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://target1.com/api/users?ref=example.com&amp;amp;_t=1672531200
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Lightweight by Design&lt;/h2&gt;
&lt;p&gt;The image is only 4.2MB and uses 1.277MB memory. This reduces costs and makes scaling easy.&lt;/p&gt;
&lt;p&gt;Traditional servers like Nginx/Apache are tens of MBs — overkill for redirects. domain-redirect is written in Go: small binaries, low runtime overhead.&lt;/p&gt;
&lt;p&gt;More importantly, it uses environment variables for config. Compared with config files, env vars are better for containerized deployments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Orchestrators (e.g., Kubernetes) support env vars natively&lt;/li&gt;
&lt;li&gt;Config changes don’t require rebuilding images, just restart&lt;/li&gt;
&lt;li&gt;Secrets can be managed safely&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Referral Tracking &amp;amp; Analytics&lt;/h2&gt;
&lt;p&gt;When &lt;code&gt;INCLUDE_REFERRAL&lt;/code&gt; is enabled, redirected URLs automatically include a &lt;code&gt;ref&lt;/code&gt; parameter with the source domain.&lt;/p&gt;
&lt;p&gt;This solves a key pain point: tracking traffic sources. The HTTP Referer header is often stripped or modified by browsers, while URL parameters are more reliable.&lt;/p&gt;
&lt;p&gt;Combined with analytics tools like Google Analytics, you can measure which domains drive traffic and evaluate their value — especially useful if you own many domains.&lt;/p&gt;
&lt;h2&gt;KISS (Keep It Simple, Stupid)&lt;/h2&gt;
&lt;p&gt;domain-redirect is not trying to be a full reverse proxy. It focuses on redirection only.&lt;/p&gt;
&lt;p&gt;Go is a thoughtful choice. It’s compiled, so deployments are consistent, and you don’t worry about runtime versions. Go’s concurrency model is ideal for handling large numbers of redirects.&lt;/p&gt;
&lt;p&gt;Round‑robin state is stored in memory and resets on restart. This sacrifices persistence but keeps architecture simple — a reasonable trade‑off for redirects.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>The Edge Container Era: How Cloudflare Container Redefines Cloud Boundaries</title><link>https://nexmoe.com/posts/cloudflare-container</link><guid isPermaLink="true">https://nexmoe.com/posts/cloudflare-container</guid><description>An in-depth look at Cloudflare Container’s architecture and business logic, and how it challenges traditional cloud models and could reshape the industry.</description><pubDate>Thu, 26 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Cloud computing is going through its third revolution. The first was virtualization, which reduced wasted hardware resources. The second was containerization, which solved environment consistency. The third is &lt;strong&gt;edge‑native containers&lt;/strong&gt; — any Docker image can start globally on demand and be billed with millisecond precision.&lt;/p&gt;
&lt;p&gt;Cloudflare Container entered public beta in June 2025. It’s not just another container hosting service — it redefines the fundamental question of &lt;em&gt;where compute should happen&lt;/em&gt;. When AI inference containers can spin up at the nearest edge node the moment a user requests, when FFmpeg video processing can run close to users to cut latency, and when apps that once required monthly billing can be charged per millisecond, the economics of cloud computing are rewritten.&lt;/p&gt;
&lt;h2&gt;A New Developer Experience&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Ridiculously simple workflow&lt;/strong&gt;: define a container in a few lines of code, then &lt;code&gt;wrangler deploy&lt;/code&gt; — just like Workers. No complex YAML or orchestration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Global by default&lt;/strong&gt;: deploy once to “Region:Earth” and cover 300+ cities. No multi‑region configs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The right tool combo&lt;/strong&gt;: route traffic between Workers and Containers easily. Use Workers for ultra‑light scale, Containers for heavier compute.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fully programmable&lt;/strong&gt;: container instances start on demand and are controlled by Workers code. Custom logic is just JavaScript, not orchestration APIs.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Breaking the Boundary Between Containers and the Edge&lt;/h2&gt;
&lt;p&gt;Historically, containers and edge computing were parallel tracks. Containers give flexibility and portability but require complex orchestration and regional planning. Edge computing offers global distribution and seamless scaling, but limits runtime support and execution models.&lt;/p&gt;
&lt;p&gt;Cloudflare dissolves this binary divide. By building the container platform on &lt;strong&gt;Durable Objects&lt;/strong&gt; rather than retrofitting Kubernetes, it achieves global distribution tightly integrated with the edge network. Workloads run in the optimal location without the complexity of traditional multi‑region planning.&lt;/p&gt;
&lt;p&gt;The deeper significance: developers no longer need to trade off &lt;strong&gt;container flexibility&lt;/strong&gt; vs &lt;strong&gt;edge performance&lt;/strong&gt;. For the first time, they truly converge.&lt;/p&gt;
&lt;h2&gt;Rebuilding the Compute Model&lt;/h2&gt;
&lt;h3&gt;Redefining Time and Space for Containers&lt;/h3&gt;
&lt;p&gt;Traditional containers assume &lt;strong&gt;long‑running&lt;/strong&gt; and &lt;strong&gt;location‑fixed&lt;/strong&gt;. Cloudflare Container breaks both:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Time dimension&lt;/strong&gt;: containers can checkpoint and restore in milliseconds. Cold start shifts from “problem to avoid” to “feature to leverage.” A predictable 2–3s start time becomes acceptable. Developers can control lifecycle with &lt;code&gt;sleepAfter&lt;/code&gt; to maximize resource efficiency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Space dimension&lt;/strong&gt;: containers choose execution location dynamically based on request origin and network conditions. A user’s request in Tokyo runs in Tokyo; the same app can run simultaneously in London, San Francisco, and Singapore, coordinated by Workers.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This forces a re‑think of consistency, caching, and session management. State must be persisted externally to Durable Objects or other storage.&lt;/p&gt;
&lt;h3&gt;Diverse Persistence Strategies&lt;/h3&gt;
&lt;p&gt;Container’s persistence model upends the simple “stateful vs stateless” split. With Durable Objects acting as a state sidecar, containers stay stateless while app logic maintains state.&lt;/p&gt;
&lt;p&gt;The key advantage: state lifecycle is decoupled from container lifecycle. When containers restart for optimization or failover, business state persists via Durable Objects.&lt;/p&gt;
&lt;p&gt;This model is ideal for apps that need session state but not complex databases. For example, an AI chat system can store conversation history in Durable Objects, restore context on each interaction, and save again afterward.&lt;/p&gt;
&lt;p&gt;Cloudflare Container offers layered storage options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lightweight state&lt;/strong&gt;: Durable Objects (SQL or KV) for sessions, preferences, small datasets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structured data&lt;/strong&gt;: D1 for relational storage with low‑latency global access.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Large files&lt;/strong&gt;: R2 object storage for media, models, datasets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cross‑region sync&lt;/strong&gt;: Durable Objects’ strong consistency keeps state aligned across edge nodes.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This multi‑layer architecture lets developers balance performance, cost, and consistency.&lt;/p&gt;
&lt;h2&gt;Industry Impact and Outlook&lt;/h2&gt;
&lt;p&gt;The power of Container lies less in the novelty of the tech and more in how it &lt;strong&gt;disrupts the cloud business model&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Traditional cloud moats are built on data‑center scale and enterprise feature sets. Cloudflare takes a different route: it doesn’t replace those services; it builds a more efficient distribution and execution layer on top. This changes the competitive dimension — when enterprises pay for actual usage and dynamically schedule by location, the old model of “regional deployment” and “reserved instances” feels crude.&lt;/p&gt;
&lt;p&gt;More profound is the shift in development paradigms. When containers can migrate across the globe seamlessly, developers must rethink state, data consistency, and error handling. This isn’t just a technical shift — it’s an architectural philosophy change.&lt;/p&gt;
&lt;p&gt;At a macro level, Container represents the transition from &lt;strong&gt;resource‑oriented&lt;/strong&gt; to &lt;strong&gt;demand‑oriented&lt;/strong&gt; computing. Compute resources are no longer fixed assets to plan and manage, but dynamic services called on demand. The real winners will be developers and companies who redesign architectures to fully leverage edge computing.&lt;/p&gt;
&lt;p&gt;The edge‑native era has arrived. Container is just the beginning.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;https://sliplane.io/blog/cloudflare-released-containers-everything-you-need-to-know&lt;/li&gt;
&lt;li&gt;https://blog.cloudflare.com/cloudflare-containers-coming-2025/&lt;/li&gt;
&lt;li&gt;https://lord.technology/2025/04/13/cloudflare-containers-reimagining-global-compute-at-the-edge.html&lt;/li&gt;
&lt;li&gt;https://blog.cloudflare.com/containers-are-available-in-public-beta-for-simple-global-and-programmable/&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>Kubernetes Controllers Comparison Table</title><link>https://nexmoe.com/posts/k8s-controllers-vs</link><guid isPermaLink="true">https://nexmoe.com/posts/k8s-controllers-vs</guid><pubDate>Thu, 26 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In Kubernetes, controllers manage Pod lifecycles and are core workload components. Each controller has its own use cases and behavior. Below is a detailed comparison of the main controller types.&lt;/p&gt;
&lt;h2&gt;Controller Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Deployment&lt;/th&gt;
&lt;th&gt;StatefulSet&lt;/th&gt;
&lt;th&gt;DaemonSet&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Primary use&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Manage stateless apps (web services, APIs)&lt;/td&gt;
&lt;td&gt;Manage stateful apps (databases, message queues)&lt;/td&gt;
&lt;td&gt;Run a daemon on every node (monitoring, logging)&lt;/td&gt;
&lt;td&gt;Run one‑off batch tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;App state&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Stateless&lt;/td&gt;
&lt;td&gt;Stateful&lt;/td&gt;
&lt;td&gt;Usually stateless&lt;/td&gt;
&lt;td&gt;Usually stateless&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pod identity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No fixed identity, replaceable&lt;/td&gt;
&lt;td&gt;Each Pod keeps a stable, permanent ID&lt;/td&gt;
&lt;td&gt;Bound to node&lt;/td&gt;
&lt;td&gt;Temporary identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No persistent storage needed, can use ephemeral volumes&lt;/td&gt;
&lt;td&gt;Requires stable persistent storage (PV/PVC, dynamic or static)&lt;/td&gt;
&lt;td&gt;Optional, usually HostPath or ephemeral&lt;/td&gt;
&lt;td&gt;Usually not needed, mount volumes if required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Deploy &amp;amp; scale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Unordered deploy, supports horizontal scaling&lt;/td&gt;
&lt;td&gt;Ordered, one‑by‑one deploy/scale/delete (0,1,2…)&lt;/td&gt;
&lt;td&gt;Auto‑deploys to new nodes, scales with node count&lt;/td&gt;
&lt;td&gt;Controls &lt;code&gt;parallelism&lt;/code&gt; and &lt;code&gt;completions&lt;/code&gt;, runs to completion&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Update strategy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;RollingUpdate, Recreate; configurable &lt;code&gt;maxSurge&lt;/code&gt;/&lt;code&gt;maxUnavailable&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RollingUpdate, supports &lt;code&gt;partition&lt;/code&gt; or &lt;code&gt;OnDelete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;RollingUpdate or &lt;code&gt;OnDelete&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Not applicable; Pod template immutable after creation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Rollback&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Automatic rollback to history (&lt;code&gt;revisionHistoryLimit&lt;/code&gt;)&lt;/td&gt;
&lt;td&gt;Not directly; manual or external tools&lt;/td&gt;
&lt;td&gt;Supports rollback&lt;/td&gt;
&lt;td&gt;Not applicable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Failure handling&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Auto restart/recreate failed Pods&lt;/td&gt;
&lt;td&gt;At most one Pod with same identity runs; manual recovery needed&lt;/td&gt;
&lt;td&gt;Node failure removes Pod; recreated on node recovery/new node&lt;/td&gt;
&lt;td&gt;Retry on failure (&lt;code&gt;backoffLimit&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Key features&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Declarative updates, versioning/rollback, pause/resume&lt;/td&gt;
&lt;td&gt;Ordered operations, stable network/storage, Headless Service&lt;/td&gt;
&lt;td&gt;Node affinity, auto‑deploy on new nodes, tolerates taints&lt;/td&gt;
&lt;td&gt;Retries, parallel execution, optional TTL cleanup&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Examples&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nginx, Tomcat, NodeJS apps&lt;/td&gt;
&lt;td&gt;MySQL, Redis, Kafka, ETCD&lt;/td&gt;
&lt;td&gt;Fluentd, Prometheus Node Exporter, network plugins&lt;/td&gt;
&lt;td&gt;Data migration, batch compute, backups, ETL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best practice&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Default choice&lt;/strong&gt; for most stateless apps&lt;/td&gt;
&lt;td&gt;Use only when you need stable identity or ordering&lt;/td&gt;
&lt;td&gt;For infra and node‑level services&lt;/td&gt;
&lt;td&gt;For tasks that terminate (not daemons)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Controller Hierarchy&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Deployment → ReplicaSet → Pod&lt;/strong&gt;: This is the most common pattern for managing stateless apps. Users operate the &lt;code&gt;Deployment&lt;/code&gt; object to declare desired state (image version, replicas, etc.). &lt;code&gt;Deployment&lt;/code&gt; doesn’t manage Pods directly — it creates and manages &lt;code&gt;ReplicaSet&lt;/code&gt;. When the Deployment is updated, it creates a new ReplicaSet and migrates Pods from old to new in a controlled manner (rolling update). This enables versioning and rollback, while ReplicaSet focuses on maintaining a specific number of Pod replicas. In other words, Deployment gives ReplicaSet declarative updates and history management.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CronJob → Job → Pod&lt;/strong&gt;: &lt;code&gt;CronJob&lt;/code&gt; schedules &lt;code&gt;Job&lt;/code&gt; objects according to a cron expression. &lt;code&gt;Job&lt;/code&gt; executes one‑off tasks by creating one or more Pods and ensuring they complete successfully. &lt;code&gt;CronJob&lt;/code&gt; doesn’t manage Pods directly; it only triggers Jobs at the right time. This layering separates scheduling from execution.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;StatefulSet&lt;/code&gt; and &lt;code&gt;DaemonSet&lt;/code&gt; manage Pods directly — they don’t have an intermediate controller because their Pod management logic (stable identity, node binding) is their core capability.&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/&quot;&gt;Kubernetes Docs – Workload Controllers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/&quot;&gt;Deployment Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/statefulset/&quot;&gt;StatefulSet Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/daemonset/&quot;&gt;DaemonSet Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/job/&quot;&gt;Job Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/cronjob/&quot;&gt;CronJob Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>Coolify: Idealism and Realism of Open-Source PaaS</title><link>https://nexmoe.com/posts/open-source-pass-coolify</link><guid isPermaLink="true">https://nexmoe.com/posts/open-source-pass-coolify</guid><description>As cloud costs climb, developers look for controllable alternatives. Coolify’s fully open-source approach offers a chance to rethink infrastructure.</description><pubDate>Tue, 24 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Has your cloud bill made your heart sink again? When Vercel’s Serverless calls exceed expectations, AWS billing feels like a maze, and Heroku ends its free tier, developers start asking: do we really need to hand over all control to cloud vendors?&lt;/p&gt;
&lt;p&gt;Coolify offers an interesting answer. This open‑source project tries to bring the convenience of Heroku, Netlify, and Vercel to your own servers, so you can enjoy modern PaaS deployment while keeping full control of infrastructure.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/763be6526f5462fdca8f710d4d0be83e81cd8f38ea3f15aa734271134cba57a4.png&quot; alt=&quot;picture-2025-06-26-21-41-50&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Ten‑Minute Onboarding: From Zero to Deployment&lt;/h2&gt;
&lt;p&gt;Before diving deeper, let’s look at real usage. Installation is simpler than you expect.&lt;/p&gt;
&lt;h3&gt;Preparation&lt;/h3&gt;
&lt;p&gt;You need a server running Ubuntu 22.04+ or Debian 11+, with at least 2GB RAM. If you don’t have one, Hetzner Cloud’s CAX11 instance (~€4.5/mo) is a good choice.&lt;/p&gt;
&lt;h3&gt;One‑Click Install&lt;/h3&gt;
&lt;p&gt;SSH into the server and run:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The script auto‑configures Docker, firewall rules, and starts Coolify. Usually done in ~5 minutes.&lt;/p&gt;
&lt;h3&gt;First‑Time Setup&lt;/h3&gt;
&lt;p&gt;After install, open &lt;code&gt;http://your-server-ip:8000&lt;/code&gt;, create an admin account, and follow the guided server connection setup. Coolify uses SSH keys to connect — fully automated.&lt;/p&gt;
&lt;h3&gt;Deploy Your First App&lt;/h3&gt;
&lt;p&gt;In the project panel, create a new app and select a Git repo. Coolify supports GitHub, GitLab, Bitbucket, etc. Enter repo URL, choose branch, and deploy.&lt;/p&gt;
&lt;p&gt;For frameworks like Next.js, Vue, React, Coolify auto‑detects build settings. No Dockerfile or config required.&lt;/p&gt;
&lt;h2&gt;Redefining the PaaS Boundary&lt;/h2&gt;
&lt;p&gt;Traditional cloud platforms charge for convenience and abstraction. You pay to avoid ops complexity. But this model has real problems:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Opaque costs&lt;/strong&gt; are the biggest pain. AWS billing is so complex you need a cost optimization engineer. Vercel’s Serverless fees can spike under traffic. I’ve seen projects forced to re‑architect due to surprise bills.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vendor lock‑in&lt;/strong&gt; is another hidden cost. Once your app integrates proprietary services, migration becomes expensive. This dependence forces developers to consider an “exit strategy” when choosing tech.&lt;/p&gt;
&lt;p&gt;Coolify takes a different approach. It combines PaaS convenience with infrastructure transparency, letting developers deploy quickly &lt;strong&gt;and&lt;/strong&gt; keep full control.&lt;/p&gt;
&lt;p&gt;The philosophy is worth thinking about: tools should empower people, not replace judgment. Coolify won’t choose your database, limit your resources, or generate hidden fees without your knowledge.&lt;/p&gt;
&lt;h2&gt;Architectural Elegance&lt;/h2&gt;
&lt;p&gt;Coolify’s architecture shows a key strength of open source: predictability through transparency.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Docker‑centric abstraction&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Every app runs in Docker containers. This ensures consistency and avoids lock‑in. Apps can be migrated to any Docker‑capable environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SSH‑based server management&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Coolify manages servers via SSH, meaning you can deploy to any machine you can SSH into — VPS, home server, even Raspberry Pi. Infrastructure choice is fully yours.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Declarative config and automated ops&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Under the hood it uses Docker Compose, but Coolify adds a higher abstraction layer. You declare desired state; it handles orchestration, networking, storage mounts, etc.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Built‑in monitoring and logs&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Each deployment includes real‑time logs, resource monitoring, and health checks. These are often paid add‑ons in cloud platforms but standard in Coolify.&lt;/p&gt;
&lt;h2&gt;Real‑World Experience&lt;/h2&gt;
&lt;p&gt;Theory needs practice. I’ve used Coolify in production for several projects and gathered real experience.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Clear cost advantage&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A mid‑size Next.js app costs about $20–40/mo on Vercel. With a €7.5/mo Hetzner VPS running Coolify, you can host 5–10 similar projects. The gap widens as scale grows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Deployment speed comparable to PaaS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;From Git push to production, Coolify is on par with Netlify and Vercel. For large projects, stronger server configs can even make builds faster.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stronger monitoring and debugging&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Direct server access means better visibility. You can inspect system logs and enter containers for debugging — often restricted on cloud platforms.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/bcb8550d0d1a908191861ea92f16f1b16f9741842e7af150849d9fccb0ed1fb8.png&quot; alt=&quot;picture-2025-06-26-21-40-30&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Data security and compliance&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;For data‑localization needs, Coolify is ideal. All data stays on servers you control, avoiding third‑party policies.&lt;/p&gt;
&lt;p&gt;Self‑hosting does mean more ops responsibility: server maintenance, security updates, backups. But for developers with some ops skills, the regained control is worth it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/37b5c5bc85c7c7bb45c16e7a2f6e4befacbb57742f664b34edad43c83c745eea.png&quot; alt=&quot;picture-2025-06-26-21-40-08&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The Power of Open Source Ecosystems&lt;/h2&gt;
&lt;p&gt;Coolify’s growth is impressive: 35k+ GitHub stars, active discussions, frequent releases. It shows how alive open source is in infrastructure tooling.&lt;/p&gt;
&lt;p&gt;The roadmap is fully public, and feature requests/bugs can be tracked in GitHub Issues. That transparency lets users participate in the product’s evolution rather than passively accepting vendor decisions.&lt;/p&gt;
&lt;p&gt;More importantly, open source means customization. Need a special deploy flow? Modify the code. Need a monitoring integration? Submit a PR. This flexibility is impossible in closed‑source cloud platforms.&lt;/p&gt;
&lt;h2&gt;Rethinking Tech Choices&lt;/h2&gt;
&lt;p&gt;Coolify forces a reconsideration: in pursuit of convenience, have we over‑relied on external services?&lt;/p&gt;
&lt;p&gt;Modern development often outsources complexity to cloud providers. Early on, this accelerates delivery, but as projects mature, dependence costs grow.&lt;/p&gt;
&lt;p&gt;Coolify offers a middle path: not back to manual ops, not full reliance on black‑box cloud services. It lets developers find the right balance between convenience and control, depending on project stage.&lt;/p&gt;
&lt;p&gt;For personal projects and small teams, Coolify is nearly perfect: low cost, high control, full feature set. A strong competitor to traditional cloud platforms.&lt;/p&gt;
&lt;p&gt;For large enterprises, it’s at least a valuable reference: the core of PaaS is not proprietary tech but abstraction of complexity — which can be achieved in open source without sacrificing transparency.&lt;/p&gt;
&lt;p&gt;Tech choices are always trade‑offs. Coolify’s value is that it offers a new option worth serious consideration.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Dokploy: A Simplified Open-Source PaaS Platform</title><link>https://nexmoe.com/posts/open-source-pass-dokploy</link><guid isPermaLink="true">https://nexmoe.com/posts/open-source-pass-dokploy</guid><description>In the cloud-native era, deploying and operating apps is still a challenge for indie developers and small teams. Dokploy, an open-source PaaS, aims to simplify the process so developers can focus on code.</description><pubDate>Sun, 22 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In today’s software world, we have powerful tools, yet deployment and maintenance haven’t become much easier. From server setup to database management to CI/CD pipelines, every step can consume time. For developers who want focus and efficiency, the ideal is simple: commit code and let the rest deploy automatically and reliably. That’s the context where Dokploy, an open‑source PaaS solution, comes in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/2a6058925b833383ce6ff7135bd91c4a439688d553a55285ecbbc12458a0b2e0.png&quot; alt=&quot;picture-2025-06-22-12-21-50&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Quick Start&lt;/h2&gt;
&lt;p&gt;Dokploy is extremely simple to deploy. Prepare a VPS (recommended: 2GB RAM, 30GB storage), then run one command:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;curl -sSL https://dokploy.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The install script configures Docker automatically. After that, open &lt;code&gt;http://your-server-ip:3000&lt;/code&gt;, create an admin account, and you’re ready. Usually done in 5 minutes with no extra setup.&lt;/p&gt;
&lt;h2&gt;Smooth Deployment &amp;amp; Management&lt;/h2&gt;
&lt;p&gt;Dokploy provides a flexible deployment workflow. It integrates directly with GitHub, triggering builds and deployments on code push, forming a full CI/CD loop. For builds, it supports automatic detection via Nixpacks, Heroku Buildpacks, and more, while still allowing custom Dockerfiles for precise control.&lt;/p&gt;
&lt;p&gt;It also supports Docker Compose natively — a big win for complex apps with multiple services. You can almost seamlessly move your local &lt;code&gt;docker-compose.yml&lt;/code&gt; into production, reducing environment mismatch risk.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/b3b53df9d0af408a9e65e2b4328040dc00a419361111999d0fa6788cae6d4dd4.png&quot; alt=&quot;picture-2025-06-22-12-22-58&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Beyond app deployment, Dokploy integrates database and service management into one dashboard. It supports one‑click deployments of MySQL, PostgreSQL, MongoDB, Redis, and more, plus automated scheduled backups and restores. Developers no longer need to write backup scripts or worry about data loss — it becomes configuration.&lt;/p&gt;
&lt;p&gt;For every running app or service, Dokploy provides real‑time logs, resource monitoring (CPU, memory, disk, network), and direct terminal access into containers — making troubleshooting and ops much easier.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/5d49d13778a8e93fb721356b2d5d1e6461221e329b3b7a8dd794b079cb59b72f.png&quot; alt=&quot;picture-2025-06-22-12-23-25&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/e0787384001c502a3f7d9ca8358308af73a453ac12996f7deff87dcb50f6474a.png&quot; alt=&quot;picture-2025-06-22-12-23-33&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/b79579a282dfe7442ecf3f0f777d3206dc7b3c193368df52bfbd6a679e9f5f92.png&quot; alt=&quot;picture-2025-06-22-12-24-01&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Back to Creation Itself&lt;/h2&gt;
&lt;p&gt;Dokploy emphasizes developer autonomy and fully embraces open source and self‑hosting. You gain full control over infrastructure with zero vendor lock‑in. You can modify and extend the platform to fit specific needs. It also supports multi‑server deployment and Docker Swarm clusters, enabling horizontal scaling as projects grow.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/4487d2c68d5b476e54b2fae97eb7087da252dcdc28600ad5b829fa5517792d3f.png&quot; alt=&quot;picture-2025-06-22-12-22-25&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In my view, Dokploy’s value is its precise positioning: a “just right” solution for developers who don’t want to manage raw &lt;code&gt;docker-compose&lt;/code&gt; but find Kubernetes too heavy. It doesn’t try to be a giant platform; it focuses on the core pain point — deployment — and makes it extremely simple.&lt;/p&gt;
&lt;h2&gt;Simplicity Under the Hood&lt;/h2&gt;
&lt;p&gt;Dokploy’s core philosophy is seamless deployment, balancing powerful features with simple operation. Compared with complex enterprise PaaS or deep‑customized Kubernetes, Dokploy offers an intuitive UI and CLI that let developers deploy apps to any server in a few steps.&lt;/p&gt;
&lt;p&gt;Under the hood, simplicity is built on mature open‑source components: Traefik as the reverse proxy to manage domains, SSL, and routing automatically; Redis for deployment queues to avoid resource conflicts; PostgreSQL for core data storage. This stack packages complex backend ops behind a clean Next.js frontend so developers can manage apps via UI instead of commands.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/8cbeea4101d2228ece84d6707f77bbd6175bece38b77216e62f0f762b9d311e6.png&quot; alt=&quot;picture-2025-06-22-12-20-56&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;PaaS vs Serverless&lt;/h2&gt;
&lt;p&gt;A common confusion: when to choose traditional PaaS, and when to go Serverless. Both simplify deployment, but they solve different problems.&lt;/p&gt;
&lt;p&gt;Serverless platforms like Vercel, Netlify, or cloud functions excel at stateless, event‑driven workloads. They scale automatically and bill on demand, but at the cost of strict runtime constraints: execution time, memory limits, cold start latency. This makes them great for API gateways, static site generation, image processing — not for long‑running services or persistent connections.&lt;/p&gt;
&lt;p&gt;By contrast, a PaaS like Dokploy provides a full application runtime. It doesn’t force you to split apps into stateless functions, and it doesn’t restrict DB connections or file system access. For real‑time tools (e.g., WebSocket collaboration) or SaaS with complex state, containerized deployment is often the more realistic choice.&lt;/p&gt;
&lt;p&gt;Cost structure matters too. Serverless pay‑per‑call is great for spiky traffic, but as scale grows, ongoing invocation costs can surpass fixed server costs. Dokploy’s self‑hosting lets you run on hardware you control, avoiding the cloud “growth tax” — important for indie developers and growing products.&lt;/p&gt;
&lt;h2&gt;Competitor Comparison&lt;/h2&gt;
&lt;p&gt;To show Dokploy’s advantages more clearly, here’s a feature comparison of mainstream open‑source PaaS platforms, based on the &lt;a href=&quot;https://docs.dokploy.com/docs/core/comparison&quot;&gt;Dokploy docs&lt;/a&gt;:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Dokploy&lt;/th&gt;
&lt;th&gt;CapRover&lt;/th&gt;
&lt;th&gt;Dokku&lt;/th&gt;
&lt;th&gt;Coolify&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Web UI&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Docker Compose&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API/CLI&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi‑node&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Traefik integration&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Plugin&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User permissions&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bitbucket integration&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitLab integration&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gitea integration&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advanced permissions&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built‑in terminal&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database support&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Monitoring&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auto backup&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Plugin&lt;/td&gt;
&lt;td&gt;Plugin&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notifications&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi‑server&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Templates&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared env vars&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cron jobs&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare Tunnel&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preview deploy&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Team features&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud/paid version&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The comparison shows Dokploy’s feature completeness, especially around Git integrations, permissions, and ops tooling. For indie developers, startups, or anyone hosting personal projects, Dokploy offers a strong mix of control, flexibility, and usability — letting you focus on building rather than infrastructure.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>2025 GPU Cloud Showdown: Deep Dive on 10 Serverless Platforms</title><link>https://nexmoe.com/posts/serverless-vs</link><guid isPermaLink="true">https://nexmoe.com/posts/serverless-vs</guid><pubDate>Tue, 17 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Pricing&lt;/th&gt;
&lt;th&gt;Scalability&lt;/th&gt;
&lt;th&gt;GPU Types&lt;/th&gt;
&lt;th&gt;Ease of Use&lt;/th&gt;
&lt;th&gt;Speed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Gongji Compute&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ultra‑low cost; RTX 4090 at 1.68 RMB/hour; per‑second billing&lt;/td&gt;
&lt;td&gt;Elastic scaling; dynamic node adjustment&lt;/td&gt;
&lt;td&gt;RTX 4090, RTX 5090, L40, H800&lt;/td&gt;
&lt;td&gt;Full API; Docker support; Jupyter environment&lt;/td&gt;
&lt;td&gt;Seconds‑level cold start; 99.9% availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;RunPod&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Low cost, per‑second billing&lt;/td&gt;
&lt;td&gt;Auto‑scales across 9 regions; no hard concurrency limit&lt;/td&gt;
&lt;td&gt;Wide range (T4 to A100/H100, incl. AMD)&lt;/td&gt;
&lt;td&gt;Container‑based; REST API, SDK, quick templates&lt;/td&gt;
&lt;td&gt;48% of cold starts &amp;lt; 200ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Capital&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Mid‑range; free credits in entry plan&lt;/td&gt;
&lt;td&gt;Scales quickly to hundreds; plans vary&lt;/td&gt;
&lt;td&gt;Broad range from T4 to H100&lt;/td&gt;
&lt;td&gt;Python SDK with auto‑containerization&lt;/td&gt;
&lt;td&gt;Ultra‑low latency (2–4s cold start)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Replicate&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Higher cost for custom models; community models free&lt;/td&gt;
&lt;td&gt;Auto‑scales but cold start can be long&lt;/td&gt;
&lt;td&gt;T4, A40, A100, some H100&lt;/td&gt;
&lt;td&gt;Zero‑config prebuilt models; Cog for custom code&lt;/td&gt;
&lt;td&gt;Custom model cold start can exceed 60s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Fal AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Competitive pricing on high‑end GPUs&lt;/td&gt;
&lt;td&gt;Scales to thousands; optimized for bursty generation&lt;/td&gt;
&lt;td&gt;Focus on high‑end GPUs (A100, H100, A6000)&lt;/td&gt;
&lt;td&gt;Ready‑to‑use APIs for diffusion models&lt;/td&gt;
&lt;td&gt;Optimized cold start (few seconds) and fast inference&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Baseten&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usage‑based (per‑minute billing)&lt;/td&gt;
&lt;td&gt;Auto‑scaling with configurable replicas&lt;/td&gt;
&lt;td&gt;T4, A10G, L4, A100/H100 options&lt;/td&gt;
&lt;td&gt;Truss framework simplifies deploy; clean UI&lt;/td&gt;
&lt;td&gt;8–12s cold start; dynamic batching boosts throughput&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;AI news&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Very affordable, usage‑based&lt;/td&gt;
&lt;td&gt;Elastic scaling across 20+ locations&lt;/td&gt;
&lt;td&gt;RTX 30/40 series, A100 SXM&lt;/td&gt;
&lt;td&gt;One‑click JupyterLab; simple API&lt;/td&gt;
&lt;td&gt;Fast instance startup; low network latency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Beam Cloud&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;One of the lowest prices; free tier&lt;/td&gt;
&lt;td&gt;Auto‑scales from zero; dev‑friendly limits&lt;/td&gt;
&lt;td&gt;T4, RTX 4090, A10G, A100/H100&lt;/td&gt;
&lt;td&gt;Python SDK, CLI, hot reload&lt;/td&gt;
&lt;td&gt;Very fast (2–3s cold start)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Cerebrium&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Competitive per‑second billing&lt;/td&gt;
&lt;td&gt;Seamless scaling across GPU types&lt;/td&gt;
&lt;td&gt;12+ types incl. H100, A100, L40&lt;/td&gt;
&lt;td&gt;Minimal config; supports websockets and batching&lt;/td&gt;
&lt;td&gt;Extremely fast cold start (2–4s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Google Cloud Run&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Usage‑based + extra CPU/memory costs&lt;/td&gt;
&lt;td&gt;Scales from 0 to 1000 instances&lt;/td&gt;
&lt;td&gt;NVIDIA L4 (24GB) for now&lt;/td&gt;
&lt;td&gt;Container native; integrated in GCP&lt;/td&gt;
&lt;td&gt;4–6s cold start; near bare‑metal performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Azure Container Apps&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Expected to align with Azure pricing&lt;/td&gt;
&lt;td&gt;Managed event‑driven scale (preview)&lt;/td&gt;
&lt;td&gt;NVIDIA T4 and A100 (more options coming)&lt;/td&gt;
&lt;td&gt;Simple YAML; Azure Monitor integration&lt;/td&gt;
&lt;td&gt;~5s cold start expected; full GPU performance when active&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded><category>post</category></item><item><title>我升级了 macOS 26，但我不推荐你升</title><link>https://nexmoe.com/posts/%E6%88%91%E5%8D%87%E7%BA%A7%E4%BA%86%20macOS%2026%EF%BC%8C%E4%BD%86%E4%B8%8D%E6%8E%A8%E8%8D%90%E4%BD%A0%E5%8D%87</link><guid isPermaLink="true">https://nexmoe.com/posts/%E6%88%91%E5%8D%87%E7%BA%A7%E4%BA%86%20macOS%2026%EF%BC%8C%E4%BD%86%E4%B8%8D%E6%8E%A8%E8%8D%90%E4%BD%A0%E5%8D%87</guid><pubDate>Tue, 10 Jun 2025 21:13:27 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/0a85390b9869aa587215342f1d6f16b1050173e2e8dacaf0c0089e3d02e015d8.png&quot; alt=&quot;picture-2025-06-10-21-13-08&quot; /&gt;&lt;/p&gt;
&lt;p&gt;⬆️ 选了张好看的封面。&lt;/p&gt;
&lt;p&gt;苹果在最新的 macOS 26 Beta 中引入了全新的 Liquid Glass 设计语言，号称是继扁平化以来最大的界面革命。我第一时间升级体验，虽然视觉效果确实很炫酷，但在日常使用中却发现了不少问题，这也是我不推荐你现在升级的原因。&lt;/p&gt;
&lt;p&gt;以下是他的三大罪：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可用性向视觉效果妥协&lt;/li&gt;
&lt;li&gt;设计语言本身尚不成熟&lt;/li&gt;
&lt;li&gt;性能代价高昂&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;接下来让我慢慢道来。&lt;/p&gt;
&lt;h2&gt;当前 Beta 版的三个核心问题&lt;/h2&gt;
&lt;h3&gt;可用性向视觉效果妥协&lt;/h3&gt;
&lt;p&gt;新系统最直观的感受是，为了追求视觉上的惊艳，牺牲了信息传达的效率和用户的专注度。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文字可读性差：回想拟物化时代，文字大多显示在类似纸张的背景上；到了扁平化时代，则是简洁的白或灰色背景，可读性都很好。而 Liquid Glass 风格的文字像是被&quot;蚀刻&quot;在半透明的玻璃上。在复杂的壁纸或光线变化的环境下，文字和背景的对比度严重不足，眼睛很容易疲劳。&lt;/li&gt;
&lt;li&gt;动态效果喧宾夺主：Liquid Glass 带来了大量动态效果，比如图标会根据视角变化产生光效，滑动时会出现涟漪状的粒子动画。这些效果固然惊艳，但很容易分散用户的注意力。当你想专注于阅读或工作时，界面上持续变化的光影反而成为一种干扰。&lt;/li&gt;
&lt;li&gt;内容沉浸感被削弱：为了实现玻璃质感，界面增加了额外的边框和阴影，这不仅占用了宝贵的屏幕空间，减少了内容的显示区域，而且过于花哨的视觉效果常常会喧宾夺主，让人无法专注于内容本身。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;设计语言本身尚不成熟&lt;/h3&gt;
&lt;p&gt;除了对用户体验的直接影响外，Liquid Glass 作为一套设计语言，其自身也暴露了不成熟和不统一的问题。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;界面层次混乱：当多个半透明的玻璃窗口重叠时，由于它们都具有半透明和反射的特性，我常常分不清哪个窗口在前，哪个在后，导致操作混乱。虽然苹果试图通过不同的透明度和虚化效果来区分层次（透明度越低，层次越高），但在实际使用中，复杂的光影和折射效果依然很容易让人迷惑。&lt;/li&gt;
&lt;li&gt;风格割裂：苹果似乎也意识到了可用性问题。在一些自带应用中，他们甚至放弃了部分 Liquid Glass 效果。一个典型的例子是 masOS 的邮件应用，按照设计逻辑，左侧的邮件列表本应采用更高层次的玻璃效果，但为了确保内容清晰，苹果选择让它回归扁平化设计。这种不统一恰恰说明，这套设计语言本身还未成熟。&lt;/li&gt;
&lt;li&gt;新旧设计语言圆角割裂与混乱：macOS 的一个标志性特征是其精确而统一的圆角。然而，在 Liquid Glass 中，这种统一性被打破了。新设计的窗口和控件采用了更复杂的连续曲线圆角，以模拟玻璃的物理形态。但在许多系统组件，尤其是尚未完全适配的旧应用和第三方应用中，依然保留着传统的圆角风格。当这两种不同的圆角同时出现在屏幕上时，例如一个新风格的窗口里嵌着一个旧风格的按钮或菜单，视觉上的割裂感非常严重，让界面显得既不协调又混乱。&lt;/li&gt;
&lt;li&gt;色彩混乱：扁平化设计通过鲜明、可预测的色彩来引导用户操作。Liquid Glass 则完全不同，它的色彩是动态且不确定的。由于玻璃材质会受到环境光和背景（如桌面壁纸）的影响，UI 元素的颜色会随之不断变化。更严重的是，这种不确定性常常导致前景元素（如文字、侧边栏、操作按钮等）与背景色之间的对比度不足，进一步加剧了可读性问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/8c4e3ddd6c7a068c29c02d6d62cae6a5760b3bd000d3727bd3a2f9160b3996fa.png&quot; alt=&quot;picture-2025-06-10-20-59-23&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;仔细想想，macOS Tahoe 的访达太糟糕了。
这是什么鬼。Big Sur 的设计好多了。而且现在窗口太圆润了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/286250aa5d6d46eca8fe07cad1607161f084172b85c158599a9792674f64bde1.png&quot; alt=&quot;picture-2025-06-10-21-00-12&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;刚安装了 macOS Tahoe，我的心情很复杂。它感觉非常杂乱，有太多的特效、阴影和叠加效果，我不太喜欢。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/207ab5da28a2edab0f2999c09c78f065241d9a2946127782930e66c0cde53884.png&quot; alt=&quot;picture-2025-06-10-21-01-57&quot; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;macOS Tahoe 的首个开发者测试版来了。
嗯，我对这个设计不太确定。
它看起来…… 很奇怪？侧边栏、图标，最重要的是，这些糟糕的边角弧度！
但我知道，我们会习惯的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/1cd67bf16c82df083bad5ec29999201faab348a606fb1750e7ffc6edda4e25fe.png&quot; alt=&quot;picture-2025-06-10-21-07-57&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/98226a8a9d9166fcec2137d10c6d586f06a7ce82f185b92935e660e668aa69f2.png&quot; alt=&quot;picture-2025-06-10-21-08-32&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;性能代价高昂&lt;/h3&gt;
&lt;p&gt;Liquid Glass 带来了大量动态光影、流体和粒子效果。这些酷炫的视觉效果背后，是对系统资源的巨大消耗。在我的使用过程中，尤其是在打开多个应用或进行复杂操作时，能明显感觉到系统的卡顿和发热。对于非最新款的设备，性能问题可能会更加突出。&lt;/p&gt;
&lt;h2&gt;既然问题这么多，苹果为什么还要做？&lt;/h2&gt;
&lt;p&gt;既然有这么多显而易见的问题，为什么苹果还要坚持推出 Liquid Glass？这背后其实是为未来的计算平台做准备。&lt;/p&gt;
&lt;p&gt;首先，它试图在&quot;拟物化&quot;和&quot;扁平化&quot;两个极端之间找到平衡。扁平化设计虽然简洁高效，但牺牲了界面的层次感和可操作性，用户有时难以分辨哪些元素可以点击。而 Liquid Glass 通过模拟玻璃材质的光影、厚度和半透明效果，重新引入了界面的物理质感和深度，让交互元素更清晰可辨。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/401e1380bd564eb52e3a297e2bd2bc47fe56c1eed3ff4fb8f2fbbaf64ef7aa07.png&quot; alt=&quot;picture-2025-06-10-20-45-47&quot; /&gt;&lt;/p&gt;
&lt;p&gt;其次，也是更重要的一点，Liquid Glass 是为混合现实（MR/AR/VR）时代而生的设计语言。在 Vision Pro 这样的设备中，传统的二维扁平界面会显得格格不入。Liquid Glass 将界面塑造成仿佛悬浮在真实环境中的玻璃面板，既有真实物体的质感，又能承载丰富的数字信息，从而无缝融合虚拟与现实。苹果将其推广到所有设备，正是为了统一未来所有平台的体验，为从二维屏幕到三维空间的过渡铺平道路。&lt;/p&gt;
&lt;p&gt;从这个角度看，Liquid Glass 代表了苹果对未来的赌注。它试图通过动态化的界面，弥合数字世界与物理世界的边界。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/ad485b4c0bf76a08c985bef0593e7314453cc78b36fa5cdc6ddb4a53af373166.png&quot; alt=&quot;picture-2025-06-10-20-42-45&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;VS&lt;/h2&gt;
&lt;h3&gt;退步明显的 Finder&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/109f807d7a11625bd004fd68eb211af0bac112bb01f389081794390989106dc4.png&quot; alt=&quot;picture-2025-06-10-21-02-49&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/418f825effdbeba7d7debbbcf8916074661354a97c43cb4657b597922dbbe608.png&quot; alt=&quot;picture-2025-06-10-21-02-58&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;被阉割的启动器&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/323ddc8f9bf17b7befa6bce1e706957aac741d40bebd730258a256a552948b3a.png&quot; alt=&quot;picture-2025-06-10-21-03-35&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/f21487a499f3ed0914eae1cf3446ade6c5f4a917df18c22e78fad4b09b38e754.png&quot; alt=&quot;picture-2025-06-10-21-03-43&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;最后：我的建议&lt;/h2&gt;
&lt;p&gt;所以，回到最初的问题：我推荐现在升级吗？&lt;/p&gt;
&lt;p&gt;我的答案很明确：&lt;strong&gt;不推荐&lt;/strong&gt;。特别是如果你的 Mac 是主力生产力工具，稳定和高效是首要前提，那么请务必保持观望。至于我自己的其他设备，我也会等苹果在后续版本中进行更多优化后再考虑。&lt;/p&gt;
&lt;p&gt;虽然 Liquid Glass 代表了苹果对未来设计的大胆探索，但就眼下的 Beta 版本而言，酷炫的视觉效果是建立在牺牲可用性和稳定性的基础之上的。当然，我们有理由相信苹果会在正式版发布前修复诸多问题。&lt;/p&gt;
&lt;p&gt;但至少在目前，对于追求稳定和效率的用户来说，最好的选择就是&quot;再等等&quot;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不过隔壁 iPadOS 看着很不错，想要试试宇宙第一的平板了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;纪念&lt;/h2&gt;
&lt;p&gt;我用另一台装有旧版系统的 mac 设备收集了一些用户体验很好的界面。
他们的视觉体验可能不太好看，在这些工具性应用前，他们直观、清晰、高效。&lt;/p&gt;
&lt;p&gt;永远怀念 R.I.P.  Mac OS Big Sur Design&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/40276ae657daa2eca41ffafe13e84f0c.png&quot; alt=&quot;40276ae657daa2eca41ffafe13e84f0c.png&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/aab4301d90d755df6ea5029ce4685d01.png&quot; alt=&quot;aab4301d90d755df6ea5029ce4685d01.png&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/f1884be41a2da7b68a07fd060409f84c.png&quot; alt=&quot;f1884be41a2da7b68a07fd060409f84c.png&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/618583a015cff1ba9add3cc1d658dbc7.png&quot; alt=&quot;618583a015cff1ba9add3cc1d658dbc7.png&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/d2dc6c9fbe87b4cfe48cb152b1dda654.png&quot; alt=&quot;d2dc6c9fbe87b4cfe48cb152b1dda654.png&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/076257a899ba68354a5b308adecfe839.png&quot; alt=&quot;076257a899ba68354a5b308adecfe839.png&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/9263919bd4d89a0c52ca08cd68a4baa6.png&quot; alt=&quot;9263919bd4d89a0c52ca08cd68a4baa6.png&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/f70f1e1c42c88f9fd18fa92b197ac314.png&quot; alt=&quot;f70f1e1c42c88f9fd18fa92b197ac314.png&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>玉玉了，人生的意义是什么？</title><link>https://nexmoe.com/posts/%E4%BA%BA%E7%94%9F%E7%9A%84%E6%84%8F%E4%B9%89%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F</link><guid isPermaLink="true">https://nexmoe.com/posts/%E4%BA%BA%E7%94%9F%E7%9A%84%E6%84%8F%E4%B9%89%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F</guid><pubDate>Mon, 09 Jun 2025 22:52:17 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;标题党了一回。刚刚我又给这篇文章想了另一个标题：上帝死了，我们怎么办&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;本文主要是一个知识传播的目的，而非深入的理论探讨。我本人对存在主义的理解也还停留在比较浅显的层面。但即便如此，存在主义的一些基本观点，比如&quot;痛苦源于自由被压制&quot;这样的洞见，依然能给我们带来很多启发。&lt;/p&gt;
&lt;p&gt;20 世纪的哲学家们，在经历了世界大战的残酷和传统的崩塌后，深入思考了人生的意义，并由此诞生了存在主义。与以往认为人生有预设意义的&quot;本质主义&quot;不同，存在主义认为，人是自由的，我们的人生意义由我们自己的选择和行动来定义。其核心思想可以概括为三大原理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;世界本无意义：宇宙本身没有给你预设任何目标或意义。&lt;/li&gt;
&lt;li&gt;存在先于本质：你首先存在于这个世界上，然后通过你的行动和选择，来定义你自己的&quot;本质&quot;和&quot;意义&quot;。&lt;/li&gt;
&lt;li&gt;绝对自由与沉重责任：你拥有选择的绝对自由，但也必须对自己的一切选择及其后果负起全部责任。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;接下来，我们将逐一深入探讨这三大原理。&lt;/p&gt;
&lt;h2&gt;原理一：世界本无意义&lt;/h2&gt;
&lt;p&gt;自古以来，人们习惯于相信&quot;本质主义&quot;，也就是所谓宿命论、决定论，即认为万事万物都有一个预先设定的&quot;本质&quot;或&quot;意义&quot;，而这个意义通常被归于神的意志或某种神秘的天命。比如，项羽是不是上天降下来灭秦的？牛顿是不是上天派来照亮物理学的？你的人生是否也有一个出厂设置好的意义？&lt;/p&gt;
&lt;p&gt;存在主义者对这一点提出了尖锐的质疑。他们认为，如果真的有神在主宰一切，那该如何解释世界大战那样的人间惨剧？难道上帝造你是为了让你去当炮灰或者刽子手吗？显然不是。存在主义者认为，我们不应为自己的行为寻找借口，你之所以行善或作恶，不是因为什么神圣的旨意，而是你自由意志自己做出的选择。&lt;/p&gt;
&lt;p&gt;就像上帝不让亚当夏娃吃禁果，但他们还是自己选择吃了。世界就像一个生态缸，上帝并不会操纵里面每个小鱼小虾的人生，而是让他们自由拼杀。因此，世界本身是中性的、无意义的，意义是由我们自己赋予的。&lt;/p&gt;
&lt;p&gt;所以，&quot;人生的意义是什么？&quot;这个问题的答案，第一步是：没有标准答案。但这并非悲观的结论，恰恰相反，它把定义意义的权力交还给了我们自己。&lt;/p&gt;
&lt;h2&gt;原理二：存在先于本质&lt;/h2&gt;
&lt;p&gt;&quot;存在先于本质&quot;是存在主义最核心的观点。它的意思是，在你作为一个实体存在之前，任何关于你的&quot;设计&quot;或&quot;本质&quot;都是空谈。即人是不被定义的。&lt;/p&gt;
&lt;p&gt;你可能会说，我的人生意义不是被父母早就定了吗？比如父母有皇位要继承，或者生你就是为了用你的脐带血给你哥治病。但存在主义会告诉你，无论你父母有什么打算，这些打算都必须等你真正地存在、成长，并拥有行动能力之后才有可能实现。比方说，你父母想让你当歌唱家，结果你生下来五音不全，那么这个预设的&quot;本质&quot;就毫无意义。&lt;/p&gt;
&lt;p&gt;再举个例子，你说你这双手的意义是用来开坦克的。但你必须先拥有一双手（存在），然后才能讨论这双手可以用来干什么（本质/意义）。你得先有这个东西，才能决定这个东西的用途和价值。因此，是你的&quot;存在&quot;，决定了你的&quot;本质&quot;，而非反过来。你不是一张被画好的图纸，你是一张白纸，你的样貌由你自己一笔一一笔画成。&lt;/p&gt;
&lt;h2&gt;原理三：自由与责任&lt;/h2&gt;
&lt;p&gt;存在主义强调人的绝对自由。这种自由体现在，你永远拥有选择的权利。你现在正在看这篇文章，你随时可以决定是继续看下去，还是站起来跳两下。你拥有对自己身体和行动的基本控制权。&lt;/p&gt;
&lt;p&gt;这种自由意志甚至体现在最极端的境况下。一个奴隶，虽然身体被奴役，但他依然保有内在的自由。他可以选择偷懒的程度，可以选择反抗还是顺从，甚至可以选择结束自己的生命来摆脱奴役。这一点将人与纯粹的动物区分开来，因为牛无法选择自杀，它不具备这种对自身生命的终极控制权。&lt;/p&gt;
&lt;p&gt;但是，自由并非没有代价，它如影随形地带来了责任。你的自由意志不是让你改变物理定律的魔法，而是一种&quot;主观能动性&quot;。你无法完全控制环境，也无法控制他人对你的影响，但你的每一个选择，都会给自己和环境带来后果。&lt;/p&gt;
&lt;p&gt;你可能会感到困惑：如果我为了养家糊口，不得不去做一份自己痛恨的工作，这难道不是违背了我的自由意志吗？我的自由又在哪里？&lt;/p&gt;
&lt;p&gt;存在主义的回答是：即使在这样的困境中，你依然在做选择。你选择了&quot;承担家庭责任&quot;而不是&quot;追求个人喜好&quot;。这个选择是痛苦的，但它依然是你的选择。承认这一点，就是承认自己的自由和责任。你选择了当前的道路，并为这个选择的后果负责。自由不是随心所欲，而是在认识到所有限制和后果之后，依然做出自己的决定。&lt;/p&gt;
&lt;h2&gt;三大原理总结&lt;/h2&gt;
&lt;p&gt;为了方便理解，我们再次对这三大原理进行浓缩解释：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;世界本无意义：上帝没工夫控制你，你想干啥干啥，所以你来定义自己行为的意义。即便上帝给你预备了奶和蜜糖，你也可以决定自己吃不吃，就像亚当夏娃还是自己选择了吃禁果。世界就是个生态缸，上帝不会操纵每个小鱼小虾的人生，而是让他们自由拼杀。&lt;/li&gt;
&lt;li&gt;存在先于本质：甭管你父母生你的时候怎么算计，你不作为实体出现，啥算计也没用。所以人生的预先设计是不存在的。你得先有双手，才能说这双手可以干啥，这就是存在先于本质（意义）。因为你得先有这个东西，才能决定这东西的用途。&lt;/li&gt;
&lt;li&gt;自由与责任：你自己永远可以选择，但是选择不是没有代价的。它是个交互系统，你的一切选择都有后果，会给自己和环境带来影响。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;如何面对人生困境&lt;/h2&gt;
&lt;p&gt;为啥抑郁者喜欢思考人生的意义呢？因为他痛苦，不知道自己受这个苦干啥。而现代人啥东西最痛苦，不是吃穿，而是社会压力，和精神凌虐。社会动物是在乎社会连接和社会评价的，抑郁者，说白了，就是被欺负了，被掠夺了，被伤害了。&lt;/p&gt;
&lt;p&gt;这恰好印证了萨特那句名言：&quot;他人即地狱&quot;。这并非是说他人都是邪恶的，而是指我们无时无刻不活在他人的审视之下，这种审视会物化我们，剥夺我们的自由，让我们感到焦虑和痛苦。我们自身的意义，时常被他人的定义所遮蔽和扭曲。&lt;/p&gt;
&lt;p&gt;这种困境在青春期尤为明显。当一个孩子开始意识到自己的独立人格（主体性）时，他会发现，从小被教导的那一套价值观和行为准则，是先于他而存在的，他并没有选择的余地。如果家庭、学校和社会环境总是压制孩子，告诉他&quot;自由的冲动&quot;和&quot;独立的想法&quot;是坏的，那么他就会学着压抑自己的真实感受，意志力的发展也会充满内疚感。比如，&quot;质疑老师是不对的&quot;、&quot;忤逆家长是不对的&quot;、&quot;玩游戏是不好的&quot;，所有和学习无关，不能提高成绩的行为，哪怕能带来快乐，也统统被禁止。&lt;/p&gt;
&lt;p&gt;当一个人的生活被如此结构化，他会感到生活是外加的，是一个必须服从的框架，而不是一张可以自己编织的网。他会觉得自己行为和结果之间没有因果关系，这就是心理学上的&quot;习得性无助&quot;——当一个人&quot;习得&quot;了自己无法掌控人生时，便会失去行动力，表现出抑郁症状。特别是当他发现，从小被灌输的&quot;延迟满足&quot;（牺牲现在，换取未来）是个陷阱，牺牲所有当下的快乐，并没有换来想象中的美好未来时，他的热情和憧憬就会彻底破灭。这种&quot;死气沉沉&quot;，不是因为没有感受，而是太多的感受被压抑和吞噬了。要直面人生固有的焦虑，人需要强大的自我力量，但如果一个人的主体性在成长中早已被扼杀，这种力量就无从谈起。&lt;/p&gt;
&lt;p&gt;那咋整？是时候动用我们上面的思想成果了。发挥你的：自由意志！有人欺负你，那多躲远点，要不就反击，或者让自己不要记仇郁闷，方法太多了，关键是自己想明白自己要干啥。生活学习压力大？竞争不过别人？那你看看谁是你绊脚石和拦路虎，打得过就打，打不过就加入，不想加入就无视，换个环境，或者自己想开了，明白贱人自有天收，你看还是有很多办法的。你真的可以自己去选，但是记住，存在先于意义，你得基于条件创造条件，才能有够得着的实际意义。&lt;/p&gt;
&lt;h2&gt;相关资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://book.douban.com/subject/10608319/&quot;&gt;存在主义是一种人道主义&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://book.douban.com/subject/26304954/&quot;&gt;存在主义心理治疗&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>关于 Serverless 的思考：为什么国内外差距如此之大？</title><link>https://nexmoe.com/posts/%E5%85%B3%E4%BA%8E%20Serverless%20%E7%9A%84%E6%80%9D%E8%80%83%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9B%BD%E5%86%85%E5%A4%96%E5%B7%AE%E8%B7%9D%E5%A6%82%E6%AD%A4%E4%B9%8B%E5%A4%A7%EF%BC%9F</link><guid isPermaLink="true">https://nexmoe.com/posts/%E5%85%B3%E4%BA%8E%20Serverless%20%E7%9A%84%E6%80%9D%E8%80%83%EF%BC%9A%E4%B8%BA%E4%BB%80%E4%B9%88%E5%9B%BD%E5%86%85%E5%A4%96%E5%B7%AE%E8%B7%9D%E5%A6%82%E6%AD%A4%E4%B9%8B%E5%A4%A7%EF%BC%9F</guid><pubDate>Mon, 09 Jun 2025 21:35:28 GMT</pubDate><content:encoded>&lt;p&gt;最近，在浏览技术社区时，一个反复出现的问题引发了我的深思：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;为什么 Node.js 在国外如此盛行，而在国内却显得有些&quot;水土不服&quot;？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;许多讨论都集中在语言特性、社区生态或招聘环境上，但我认为，这些都只是表象。真正的答案，藏在 Node.js 背后的云计算范式——Serverless 的发展路径差异之中。可以说，我们讨论的并非 Node.js 的困境，而是 Serverless 在国内的困境。&lt;/p&gt;
&lt;h2&gt;国外：Serverless 为王，JavaScript 为核&lt;/h2&gt;
&lt;p&gt;在国外，Node.js 的蓬勃发展与 Serverless 平台的崛起密不可分。Vercel、Netlify、Deno Deploy、Cloudflare Workers 等众多玩家，共同构建了一个简单而强大的生态系统。&lt;/p&gt;
&lt;p&gt;这些平台具备一个鲜明的共同点：功能纯粹，体验极致。无论是 Vercel 对前端部署的极致优化，还是 Cloudflare Workers 在边缘计算的探索，它们都将 Serverless 的核心理念——简化运维、按需执行——做到了极致。开发者可以专注于业务逻辑，快速搭建博客、部署静态网站（如 Astro），或实现轻量级 API。&lt;/p&gt;
&lt;p&gt;在这种环境下，JavaScript 不再仅仅是一门前端语言或一种后端技术选型，它成为了整个 Serverless 生态的核心载体。开发者推崇的并非&quot;JavaScript 全栈&quot;，而是&quot;Serverless 全栈&quot;，JavaScript 只是这个体系中最自然的执行引擎。&lt;/p&gt;
&lt;h2&gt;国内：巨头下的 PaaS 与框架的惯性&lt;/h2&gt;
&lt;p&gt;反观国内，我们走上了一条截然不同的技术路径，这导致了 Serverless 发展土壤的贫瘠。&lt;/p&gt;
&lt;h3&gt;1. 云巨头的&quot;大而全&quot;路径&lt;/h3&gt;
&lt;p&gt;国内的云计算巨头，如阿里云和腾讯云，从诞生之初就将目光锁定在大型企业客户上。它们倾向于构建功能全面、体系庞杂的 PaaS（平台即服务）解决方案。&lt;/p&gt;
&lt;p&gt;当你打开它们的控制台，成百上千的功能按钮令人眼花缭乱，而 Serverless（云函数）的入口则被深深地埋藏在这片功能的海洋中。这与 Cloudflare 或 Vercel 那种&quot;登录即可部署&quot;的简洁体验形成了鲜明对比。巨头们的 Serverless 产品线，往往给人一种&quot;有，但不好用&quot;的印象，它们更像是庞大服务体系中的一个&quot;添头&quot;，而非战略核心。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/32cc96e4492b205084ee1a37335b24cc5ed5650da21c04a0c666c3822e0cc15b.png&quot; alt=&quot;picture-2025-06-10-21-41-38&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2. 开发者市场的&quot;重框架&quot;惯性&lt;/h3&gt;
&lt;p&gt;在企业和开发者层面，市场表现出了对传统开发模式的强大惯性。大家更倾向于使用成熟、大而全的框架来&quot;快速出活&quot;，认为这样更可控、更符合团队招聘和技术栈需求。&lt;/p&gt;
&lt;p&gt;Spring Boot 在 Java 生态的统治地位便是明证。而在 Node.js 领域，NestJS 的快速崛起也反映了同样的思路。许多团队选择 NestJS，是看中了它&quot;企业级&quot;的标签和对 Spring Boot 模式的模仿。然而，尽管 NestJS 对 Express 进行了封装，提供了类似的企业级开发体验，但其技术深度和生态成熟度远无法与 Spring Boot 相提并论。这种对重型框架的偏爱，使得需要改变开发思维的 Serverless 模式，难以获得广泛的市场认知和接受。&lt;/p&gt;
&lt;h2&gt;为什么国内缺少优秀的 Serverless 平台？&lt;/h2&gt;
&lt;p&gt;归根结底，国内 Node.js 生态在后端领域的尴尬，根源在于缺少一个像 Vercel 或 Cloudflare 那样真正引爆开发者社区的 Serverless 平台。那么，为什么这样的平台没有在国内诞生呢？&lt;/p&gt;
&lt;p&gt;首先，是高昂的运营成本与安全风险。&lt;/p&gt;
&lt;p&gt;一个对开发者友好的平台，通常需要提供慷慨的免费额度及强大的安全防护。这正是 Cloudflare 成功的关键之一——它为全球网站提供免费的 DDoS 防护。然而，在国内的网络环境下，DDoS 攻击的成本和频率都异常之高。对于一家初创公司而言，免费提供 DDoS 防护意味着巨大的、不可承受的成本和风险。这道高墙足以挡住绝大多数潜在的挑战者。&lt;/p&gt;
&lt;p&gt;其次，是巨头的商业模式与战略选择。&lt;/p&gt;
&lt;p&gt;唯一有能力承受这种成本的，只有云计算巨头。但如前文所述，它们的商业模式决定了其重心在服务大型企业，追求的是&quot;大而全&quot;的产品矩阵和高客单价。打磨一款针对个体开发者的、体验极致的 Serverless 产品，并不符合它们当前的核心商业利益。没有竞争，巨头们自然也缺乏足够的动力去优化和推广自己的 Serverless 产品线。&lt;/p&gt;
&lt;p&gt;最后，是历史的包袱与市场的空白。&lt;/p&gt;
&lt;p&gt;回想当年，PHP 虚拟空间何尝不是一种广义上的 Serverless？DA 和 CP 面板提供了基础的管理功能，新浪 SAE 也曾是国内 Serverless 理念的早期探索者。它们的流行证明了简化部署和运维的巨大价值。然而，随着技术向更复杂的集群化和容器化演进，这种简单、低成本的模式逐渐被遗忘。&lt;/p&gt;
&lt;p&gt;在国外，Vercel 等公司填补了这个空白，并将其升级为现代化的 Serverless 平台。而在国内，由于上述种种原因，这个赛道上始终缺乏有力的&quot;挑战者&quot;，最终形成了当前这种&quot;有，但不好用&quot;的尴尬局面。&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;技术的发展从来不是单一路径的。国内外在 Serverless 领域的不同选择，深刻反映了各自市场环境、技术文化和商业模式的差异。&lt;/p&gt;
&lt;p&gt;国外选择了&quot;小而美&quot;的专业化路线，通过极致的用户体验和专注的功能定位赢得了开发者的心。国内则走向了&quot;大而全&quot;的平台化路线，以满足企业级客户复杂的业务需求。&lt;/p&gt;
&lt;p&gt;两种路径都有其商业上的合理性。但对于培育开发者生态和推动底层技术创新而言，我们或许需要更多&quot;小而美&quot;的尝试。毕竟，真正的技术进步，往往来自于对复杂性的优雅简化，而不是对功能的无尽堆砌。&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>国内设计网站推荐：设计师必备的创意灵感宝库</title><link>https://nexmoe.com/posts/20250606-%E5%9B%BD%E5%86%85%E8%AE%BE%E8%AE%A1%E7%BD%91%E7%AB%99%E6%8E%A8%E8%8D%90</link><guid isPermaLink="true">https://nexmoe.com/posts/20250606-%E5%9B%BD%E5%86%85%E8%AE%BE%E8%AE%A1%E7%BD%91%E7%AB%99%E6%8E%A8%E8%8D%90</guid><pubDate>Fri, 06 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天为大家精心整理了 9 个国内顶尖的设计网站，涵盖了灵感获取、作品展示、学习教程、资源下载等设计师日常工作的各个环节。&lt;/p&gt;
&lt;h2&gt;站酷：设计师的创意灵感平台&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://static.zcool.cn/git_z/z/images/new/logo.png&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;传送门：https://www.zcool.com.cn/&lt;/p&gt;
&lt;p&gt;站酷（ZCOOL）是国内最具影响力的设计师互动平台之一，汇集了大量优秀的设计作品与创意灵感。平台包含平面设计、插画、摄影、UI/UX 等多种领域的内容，为设计师提供展示作品、交流学习的空间。用户不仅可以浏览海量优质作品获取灵感，还能参与平台举办的设计赛事，或是通过专业课程提升技能。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;汇聚各领域优秀设计作品，提供创作灵感&lt;/li&gt;
&lt;li&gt;定期举办专业设计赛事，发掘设计人才&lt;/li&gt;
&lt;li&gt;包含设计类课程资源，助力技能提升&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;站酷排行榜：顶尖设计作品集锦&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://static.zcool.cn/git_z/z/images/new/logo.png&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;传送门：https://www.zcool.com.cn/top/index.do&lt;/p&gt;
&lt;p&gt;站酷排行榜收录了当周最受关注的设计作品，涵盖插画、平面、UI、网页、摄影、三维等 16 个设计门类。榜单每周二上午 11 点更新，展示了中国设计师社区最具人气的创意作品，包括品牌设计、电商视觉、影视动画等多个维度。排名依据作品的热度、推荐数、收藏量等综合数据计算，为设计从业者和爱好者提供权威的行业趋势参考。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每周更新涵盖 16 个设计门类的热门作品&lt;/li&gt;
&lt;li&gt;直观展示作品的详细数据指标和历史排名变化&lt;/li&gt;
&lt;li&gt;汇聚站酷平台认证设计师和团队的精品内容&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;优设网：设计师的灵感与工具宝库&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://screen.102417.xyz/screenshot?url=https%3A%2F%2Fwww.uisdc.com%2F&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;传送门：https://www.uisdc.com/&lt;/p&gt;
&lt;p&gt;优设网是国内知名的设计学习与资源共享平台，为设计师提供从入门到进阶的全面内容。网站涵盖了 UI 设计、AIGC、交互设计、产品设计等专业领域的最新趋势和实践案例，同时整合了丰富的设计工具、免费资源和学习路径。无论是寻找设计灵感、学习专业技能，还是获取实战教程和行业资讯，优设网都能满足不同层次设计师的需求。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;海量设计资源：包括 AI 工具导航、免费字体、设计素材等实用资源&lt;/li&gt;
&lt;li&gt;前沿行业内容：涵盖 AIGC、Midjourney 等最新设计趋势和技术解析&lt;/li&gt;
&lt;li&gt;系统学习路径：提供从零基础到专业进阶的全套教程和课程体系&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;设计灵感聚集地：优优教程网&lt;/h2&gt;
&lt;p&gt;传送门：https://uiiiuiii.com/inspiration&lt;/p&gt;
&lt;p&gt;优优教程网是国内知名的设计教程与灵感平台，为设计师提供丰富的图文教程、视频教程和创意灵感。网站设有 Banner 设计、海报设计、Logo 设计、插画绘画、字体设计、UI 设计等多个专业分类，每日更新最新设计趋势和实用技巧。平台还提供设计导航、AI 工具导航等实用资源，以及设计书籍推荐、色彩搭配指南等辅助功能，满足不同层次设计师的学习需求。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提供海量设计教程和灵感素材，覆盖多个设计领域&lt;/li&gt;
&lt;li&gt;设有专业分类导航，方便查找特定类型的设计内容&lt;/li&gt;
&lt;li&gt;每日更新设计趋势和实用技巧，紧跟行业动态&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;UI 中国：专业设计社区与资源平台&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://screen.102417.xyz/screenshot?url=https%3A%2F%2Fwww.ui.cn%2F&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;传送门：https://www.ui.cn/&lt;/p&gt;
&lt;p&gt;UI 中国是国内领先的专业用户体验设计平台，为设计师提供作品展示、交流学习、职业发展等全方位服务。平台汇聚了大量优秀设计作品、行业文章和教程资源，涵盖 UI 设计、交互设计、平面设计等多个领域。通过丰富的线上线下活动、设计大赛和招聘服务，UI 中国连接设计师与企业需求，助力设计人才成长。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;海量设计作品展示与交流社区&lt;/li&gt;
&lt;li&gt;专业设计教程与行业资讯分享&lt;/li&gt;
&lt;li&gt;企业招聘与设计师认证服务&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;秀设计：创意灵感与设计资源平台&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://screen.102417.xyz/screenshot?url=https%3A%2F%2Fwww.xiusheji.com%2F&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;传送门：https://www.xiusheji.com/&lt;/p&gt;
&lt;p&gt;秀设计是一个专注于创意设计领域的综合平台，汇集了国内外最新设计赛事资讯、优秀设计作品展示以及丰富的设计资源。网站内容涵盖平面设计、工业产品、建筑室内、UI 设计等多个设计门类，为用户提供灵感获取、作品分享和专业交流的一站式服务。平台定期更新设计大赛信息、行业新闻动态，并提供大量免费可商用字体、样机和设计工具资源，是设计师日常创作和工作的重要参考站点。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提供国内外最新设计赛事信息与参赛指南&lt;/li&gt;
&lt;li&gt;展示海量原创设计作品，涵盖多个设计领域&lt;/li&gt;
&lt;li&gt;汇集实用设计资源，包括免费字体、样机模板等&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;花瓣网：你的设计灵感宝库&lt;/h2&gt;
&lt;p&gt;传送门：https://huaban.com/&lt;/p&gt;
&lt;p&gt;花瓣网是国内知名的设计素材分享平台，汇集了海量的高质量设计元素、创作灵感和行业趋势。平台以&quot;陪你做生活的设计师&quot;为理念，为专业设计师和创意爱好者提供丰富的视觉资源。从节日热点素材到行业设计趋势，从平面设计到 3D 艺术，用户可以在这里发现最新设计潮流，获取创作灵感，或分享自己的作品。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;海量设计资源：覆盖节日海报、品牌设计、UI 素材等各类创意内容&lt;/li&gt;
&lt;li&gt;实时热点追踪：提供高考、618、父亲节等时令主题的专题素材&lt;/li&gt;
&lt;li&gt;创作者社区：聚集众多优秀设计师，可直接关注喜欢的创作者获取持续灵感&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;腾讯 ISUX：探索设计与用户体验前沿&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://screen.102417.xyz/screenshot?url=https://isux.tencent.com/&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;传送门：https://isux.tencent.com/&lt;/p&gt;
&lt;p&gt;腾讯 ISUX（Internet Social User Experience）是腾讯社交用户体验设计部官方平台，致力于分享前沿的设计理念和实践经验。该网站包含丰富的内容资源，涵盖设计文章、品牌案例、行业资源等多个栏目，为设计师和用户体验从业者提供专业的交流平台。网站上展示的最新研究成果和设计作品，覆盖了 AIGC 技术应用、沉浸式体验打造、字体设计创新等多个热门领域。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提供专业的设计文章和案例分析，涵盖 UI/UX、品牌设计、动效设计等多个方向&lt;/li&gt;
&lt;li&gt;包含创新设计方法论，如&quot;渐进式创新&quot;与&quot;激进式创新&quot;思路&lt;/li&gt;
&lt;li&gt;整合行业资源平台，包括原创馆、QQ 游戏中心等腾讯生态产品设计经验分享&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;设计达人：干货满满的创意资源库&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://screen.102417.xyz/screenshot?url=https%3A%2F%2Fwww.shejidaren.com%2F&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;传送门：https://www.shejidaren.com/&lt;/p&gt;
&lt;p&gt;设计达人是一个专注于为创意工作者提供实用干货的综合性设计资源平台。网站涵盖了视觉设计、AI 绘画、资源推荐等多个创意设计领域，定期更新设计教程、素材资源和行业工具测评。从平面设计物料尺寸指南到 AI 生成游戏 UI 技巧，从排版黄金法则到免费图标库推荐，这里既有新手设计师必备的基础知识，也包含资深创作者需要的前沿技术解析。特别值得一提的是，该平台对 AI 在设计领域的应用保持高度关注，提供了大量实用 AI 工具的体验报告和操作指南。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;提供平面/UI 设计全流程实用指南与资源下载&lt;/li&gt;
&lt;li&gt;聚焦 AI 设计应用，含多平台对比与生成技巧&lt;/li&gt;
&lt;li&gt;定期更新免费优质设计素材库与工具测评&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>9 Top Serverless GPU Cloud Platforms in 2025</title><link>https://nexmoe.com/posts/2025-top-serverless-gpu-cloud-platform</link><guid isPermaLink="true">https://nexmoe.com/posts/2025-top-serverless-gpu-cloud-platform</guid><pubDate>Wed, 04 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With demand for Serverless GPU platforms surging, AI engineers can now run on‑demand inference without worrying about infrastructure management. This article compares top providers including RunPod, Modal, Replicate, Novita AI, fal.ai, Baseten, Koyeb, and Zhilingyun, helping you choose the best solution for your 2025 AI compute needs.&lt;/p&gt;
&lt;h2&gt;Gongji Compute: Empower AI with idle compute&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/21fc4eb5f2b71a7279e83a32211323bd010f24c741a1d25cadec8929fa49d960.png&quot; alt=&quot;picture-2025-06-04-22-27-25&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Portal: &lt;a href=&quot;https://www.gongjiyun.com?utm_campaign=nexmoe&quot;&gt;https://www.gongjiyun.com?utm_campaign=nexmoe&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Gongji Tech is a cloud platform focused on elastic GPU compute services. It integrates global idle compute resources to deliver cost‑effective solutions for AI training, video transcoding, scientific computing, and more. Built by a team with Tsinghua background, it uses dynamic scaling and per‑second billing. Highlights include NVIDIA RTX 4090‑class hardware, flexible pricing, a complete container ecosystem, 99.9% availability, and 24/7 professional support. It has served AI teams at Tsinghua University, Huawei, and other organizations.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uses idle resources, dynamic scaling, and per‑second billing, reducing costs by up to 70% vs traditional models&lt;/li&gt;
&lt;li&gt;Supports top hardware such as NVIDIA 5090/L40/H800 for diverse AI workloads&lt;/li&gt;
&lt;li&gt;Offers full OpenAPI + Docker ecosystem integration for easy system integration&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;RunPod: One‑stop AI training &amp;amp; deployment cloud&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.runpod.io/static/images/home-page-preview-image.webp&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Portal: &lt;a href=&quot;https://www.runpod.io&quot;&gt;https://www.runpod.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;RunPod is a cloud platform built for AI workloads, offering end‑to‑end training and deployment. It supports global distributed GPU resources, preconfigured environments for PyTorch/TensorFlow, and custom containers. RunPod emphasizes fast deployment and cost efficiency, with server start times in milliseconds and 50+ ready‑to‑use templates. Its Serverless GPU offering provides cold starts under 250ms, ideal for elastic inference. It also provides special credit programs for startups and academia.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fast deployment: GPU pods start in seconds, cold starts down to milliseconds&lt;/li&gt;
&lt;li&gt;Rich options: 50+ preconfigured templates, mainstream ML frameworks, custom containers&lt;/li&gt;
&lt;li&gt;Cost‑effective: multiple GPU options starting at $0.16/hr&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Modal: One‑line AI deployment in the cloud&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://modal.com/assets/social-image-3.jpg&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Portal: &lt;a href=&quot;https://modal.com&quot;&gt;https://modal.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Modal is a cloud computing platform for AI developers. Deploy Python functions to the cloud with one line of code and get automatic scaling for ML inference, data processing, and more. It uses a Rust‑based container system for sub‑second startup, can scale to hundreds of GPUs in seconds, and offers per‑second billing.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Zero‑config deployment via Python decorators&lt;/li&gt;
&lt;li&gt;High‑performance compute with H100/A100 and optimized GPU utilization&lt;/li&gt;
&lt;li&gt;Seamless scaling from zero to thousands of containers&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Replicate: One‑click AI model runs in the cloud&lt;/h2&gt;
&lt;p&gt;Portal: &lt;a href=&quot;https://replicate.com&quot;&gt;https://replicate.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Replicate is an open‑source AI model hosting platform with easy APIs, letting developers call pre‑trained AI models with a single line. It aggregates thousands of community models across image generation, video processing, and text creation, optimized for production. Replicate uses per‑second billing and handles GPU scheduling and API deployment, lowering the barrier to AI app development.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thousands of production‑ready models like Stable Diffusion and Llama&lt;/li&gt;
&lt;li&gt;Fine‑tuning capabilities with your own data&lt;/li&gt;
&lt;li&gt;Usage‑based pricing with automatic scaling&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Explore fal.ai: Developer‑first generative AI platform&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://fal.ai/og-thumbnail.webp&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Portal: &lt;a href=&quot;https://fal.ai&quot;&gt;https://fal.ai&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;fal.ai is a developer‑focused generative AI platform designed for high‑performance, low‑latency media generation. It includes the fal Inference Engine™, running diffusion models up to 4× faster. It supports text‑to‑image, image‑to‑video, and more, with rich model libraries (Kling, Pixverse, etc.), flexible pay‑as‑you‑go pricing, and enterprise customization.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ultra‑fast inference: up to 400% speed boost for diffusion models&lt;/li&gt;
&lt;li&gt;Diverse model library: Kling, Veo 2 and more, supports LoRA fine‑tuning&lt;/li&gt;
&lt;li&gt;Developer‑friendly: Python/JavaScript/Swift SDKs, private deployments, H100 billed per second&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Baseten: Leading platform for AI inference deployment&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.baseten.co/img/og-bg-2025.png&quot; alt=&quot;网站预览图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Portal: &lt;a href=&quot;https://www.baseten.co&quot;&gt;https://www.baseten.co&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Baseten focuses on AI inference deployment, providing high‑performance runtime, cross‑cloud availability, and a smooth developer workflow. It supports open‑source, custom, and fine‑tuned models for production needs. With an optimized inference stack, cloud‑native infrastructure, and expert engineering support, Baseten helps many well‑known companies ship AI products quickly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dedicated deployment options for high‑load workloads with seamless scaling&lt;/li&gt;
&lt;li&gt;Custom optimizations for generative AI: image generation, transcription, TTS, etc.&lt;/li&gt;
&lt;li&gt;Flexible deployment modes: Baseten cloud, self‑hosted, or on‑demand&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Novita.ai: Efficient AI model deployment platform&lt;/h2&gt;
&lt;p&gt;Portal: &lt;a href=&quot;https://novita.ai&quot;&gt;https://novita.ai&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Novita.ai provides easy APIs to deploy and scale AI apps. It integrates 200+ open models across chat, code, image, and audio, and supports enterprise custom models. With global GPU distribution and on‑demand architecture, it cuts costs by up to 50% while maintaining performance and stability.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;200+ ready‑to‑use models via API&lt;/li&gt;
&lt;li&gt;Global GPU resources with A100/RTX4090 options&lt;/li&gt;
&lt;li&gt;On‑demand billing saving up to 50%&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Koyeb: Global high‑performance Serverless platform&lt;/h2&gt;
&lt;p&gt;Portal: &lt;a href=&quot;https://www.koyeb.com&quot;&gt;https://www.koyeb.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Koyeb is a high‑performance Serverless platform for AI inference, fine‑tuning, and distributed systems. It supports GPU/CPU/accelerator workloads in 50+ locations, delivering sub‑100ms global latency. Cold starts are under 200ms, scaling from zero to hundreds of servers. It’s optimized for AI workloads and supports RTX‑4000, L4, A100 and more, with transparent per‑second billing that can save up to 80% vs traditional cloud providers.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ultra‑fast cold starts under 200ms, instant scaling to hundreds of instances&lt;/li&gt;
&lt;li&gt;Global coverage with 50+ locations for low latency&lt;/li&gt;
&lt;li&gt;Hardware options from RTX‑4000 to A100, starting at $0.50/hr&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Zhilingyun: Localized Serverless AI compute platform&lt;/h2&gt;
&lt;p&gt;Portal: &lt;a href=&quot;https://datastone.cn&quot;&gt;https://datastone.cn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Zhilingyun is a Serverless ML platform by Hunan Panyun Data, focused on cost‑effective GPU services for Chinese developers. It supports one‑click deployment of models like DeepSeek, and offers templates for Stable Diffusion, Jupyter Notebook, ChatGLM, etc. It uses elastic billing—no charge when idle. Optimized for China‑specific needs, it supports Baidu Netdisk and Alibaba Cloud Drive sync, plus 75% off off‑peak pricing to reduce costs.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Local optimizations: one‑click DeepSeek deployment, Baidu/Alibaba cloud drive sync&lt;/li&gt;
&lt;li&gt;20+ templates including Stable Diffusion, ComfyUI, ChatGLM&lt;/li&gt;
&lt;li&gt;Flexible pricing: off‑peak 75% discount, RTX 4090D as low as ¥0.8/hr&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Beam: AI infrastructure for developers&lt;/h2&gt;
&lt;p&gt;Portal: &lt;a href=&quot;https://www.beam.cloud&quot;&gt;https://www.beam.cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Beam is an AI infrastructure platform offering serverless GPU inference and training. Its core idea is to let developers write code locally and execute instantly on cloud GPUs, giving a seamless cloud‑dev experience. Beam can containerize any Python function and deploy it to GPUs, with fast build times and auto scaling. It’s well suited for LangChain apps, Stable Diffusion APIs, or Dreambooth, and supports scheduled jobs, queues, and high‑performance distributed file systems.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cloud‑dev experience: local development with remote execution and instant GPU access&lt;/li&gt;
&lt;li&gt;One‑click containerization: deploy Python functions via decorators without complex setup&lt;/li&gt;
&lt;li&gt;Multi‑scenario deployment: REST APIs, scheduled jobs, queues, and more&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>We Built China’s First Serverless GPU Product</title><link>https://nexmoe.com/posts/gongji-suanli</link><guid isPermaLink="true">https://nexmoe.com/posts/gongji-suanli</guid><pubDate>Tue, 27 May 2025 06:34:18 GMT</pubDate><content:encoded>&lt;p&gt;In 2025, AI applications exploded, showcasing the power of technological change. But as developers deep in the AI field, we repeatedly hit walls in real deployments—GPU rental costs were too high, traditional cloud supply couldn’t match volatile demand, and complex infrastructure management drained our energy. We knew these pain points weren’t just ours—they were industry-wide. So a thought formed: why not build a Serverless GPU platform that truly solves these problems? That’s how Gongji Compute was born. It’s not just a product—it’s our exploration and practice of what AI compute services should be, and we hope it opens a new era of compute for AI innovators.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/bbf509d90a605789e243aca8285684dff6088c72016878228b08e624726bf5ae.png&quot; alt=&quot;picture-2025-05-27-14-29-26&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Why we built Gongji Compute: structural dilemmas in the AI inference market&lt;/h2&gt;
&lt;p&gt;As we used compute, we felt the surge in &lt;strong&gt;inference&lt;/strong&gt; demand. At the same time, we observed structural problems in China’s compute market. High inference costs are blocking AI adoption and innovation, which pushed us to rethink:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rigid service, weak elasticity:&lt;/strong&gt; supply-demand conflicts hurt efficiency and UX.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traditional model, growth-limiting:&lt;/strong&gt; long-term leases and heavy fixed costs slow iteration.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complex management &amp;amp; low efficiency:&lt;/strong&gt; infrastructure management consumes engineering time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource mismatch:&lt;/strong&gt; idle capacity exists alongside GPU shortages.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These form the “elasticity, stability, low cost” &lt;strong&gt;impossible triangle&lt;/strong&gt;. Most cloud offerings fall into three types: long-term lease (low cost &amp;amp; stable), on-demand (high cost &amp;amp; stable), and spot instances (low cost &amp;amp; elastic). None solve all three.&lt;/p&gt;
&lt;p&gt;Traditional GPU leases don’t match volatile inference demand, leading to &lt;strong&gt;high idle costs or service interruptions&lt;/strong&gt;—the core problem we set out to solve.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/e4d401640a975ef239e243bc81f1875068008140b422dd83bc2e9e533e91c011.png&quot; alt=&quot;picture-2025-05-27-14-29-50&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Figure: The conflict between rigid supply and elastic demand directly impacts AI costs and user experience.&lt;/p&gt;
&lt;p&gt;To resolve this, we turned to &lt;strong&gt;Serverless computing&lt;/strong&gt;. We believe &lt;strong&gt;pay‑as‑you‑go, auto‑scaling, and simplified ops&lt;/strong&gt; provide the ideal solution for AI inference.&lt;/p&gt;
&lt;p&gt;Serverless GPU lets developers call GPU compute on demand without managing hardware—perfect for fluctuating inference workloads. We studied the global Serverless GPU market and saw platforms like &lt;strong&gt;RunPod&lt;/strong&gt; already offering hourly billing and container deployments.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/e2f87d2a7626555c9b4898fea0f3df2fe34887b968deed4cd09ec56547c1cba6.png&quot; alt=&quot;picture-2025-05-27-14-30-08&quot; /&gt;&lt;/p&gt;
&lt;p&gt;However, China has few platforms focused on Serverless GPU, and limited resources constrain local AI deployment. That’s the key reason we decided to build Gongji Compute.&lt;/p&gt;
&lt;h2&gt;Our solution: Gongji Compute Serverless GPU platform&lt;/h2&gt;
&lt;p&gt;Based on deep understanding of these pain points, we built &lt;strong&gt;Gongji Compute&lt;/strong&gt; (suanli.cn), a Serverless GPU platform dedicated to AI inference. Our goal is to break the “impossible triangle” and truly deliver &lt;strong&gt;elasticity, stability, and low cost&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/586cc0c044bdfc2b0d5b2f50482054278c95c5b72fcf85de812bc41076219e97.png&quot; alt=&quot;picture-2025-05-27-14-30-22&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Core value we designed:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Extreme elasticity:&lt;/strong&gt; auto scale with traffic, millisecond-level metering, eliminating waste and idle cost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ultra-simple deployment:&lt;/strong&gt; Docker-based, five-step cloud launch, compatible with major platforms, with full technical support.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Massive resources:&lt;/strong&gt; nationwide compute aggregation, 10k‑GPU scale pool, high cost‑performance supply (e.g. RTX 4090 as low as ¥1.68/hour).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Our self-built idle compute scheduling platform aggregates resources across multiple compute providers, delivering Serverless pay‑as‑you‑go while solving “resource mismatch” through cross-platform integration.&lt;/p&gt;
&lt;h2&gt;&lt;strong&gt;Limited-time offer: experience our Serverless GPU&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;NVIDIA RTX 4090 single‑card inference: just ¥1.68/hour!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;From now until June 18, new users who register and top up for the first time get an extra 20% credits!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Invite friends to use our service: when they sign up with your invite code, both you and your friend get ¥50 credits each!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How to participate:&lt;/strong&gt; during the event, log into your user dashboard at suanli.cn and top up online to automatically participate and receive bonuses. Final terms are subject to the official site.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/807ea14ce3ca1506b0c6936a44f3a98a15c4618ec88f8de9d801106bd52b1917.png&quot; alt=&quot;picture-2025-05-27-14-30-55&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Visit &lt;strong&gt;suanli.cn&lt;/strong&gt; now and experience the new era of AI inference—where compute is no longer the bottleneck.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Two Minimal Mermaid Theme Styles</title><link>https://nexmoe.com/posts/mermaid-theme</link><guid isPermaLink="true">https://nexmoe.com/posts/mermaid-theme</guid><pubDate>Tue, 27 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Mermaid.js is a powerful tool that lets us generate diagrams and flowcharts quickly using text and code. It’s perfect with Markdown. A clean, fitting theme significantly improves clarity and professionalism.&lt;/p&gt;
&lt;p&gt;But the default theme is really ugly, so here are two minimal Mermaid theme configurations.&lt;/p&gt;
&lt;p&gt;Original:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/f00630e68aacf83cb620269961bfbf7b87aac0ea585f39db6496a86896546876.png&quot; alt=&quot;picture-2025-05-29-18-02-01&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Theme 1: Pure white minimal style&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/ba26703c749eafb0b5d05fe5334d9b0be8cba345ba4f7a52554dbb0480421ea5.png&quot; alt=&quot;picture-2025-05-28-09-12-04&quot; /&gt;&lt;/p&gt;
&lt;p&gt;To use this theme, just copy the &lt;code&gt;%%{ init: { ... } }%%&lt;/code&gt; block into the top of your Mermaid code block.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%%{
  init: {
    &apos;theme&apos;: &apos;base&apos;,
    &apos;themeVariables&apos;: {
      &apos;primaryColor&apos;: &apos;#ffffff&apos;,
      &apos;primaryTextColor&apos;: &apos;#333333&apos;,
      &apos;primaryBorderColor&apos;: &apos;#cccccc&apos;,
      &apos;lineColor&apos;: &apos;#888888&apos;,
      &apos;tertiaryColor&apos;: &apos;#D0E4FF&apos;,
      &apos;tertiaryBorderColor&apos;: &apos;#D0E4FF&apos;,
      &apos;tertiaryTextColor&apos;: &apos;#00A4FF&apos;
    }
  }
}%%
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Theme 1 configuration breakdown&lt;/h3&gt;
&lt;p&gt;Based on the &lt;code&gt;base&lt;/code&gt; theme, I customized variables via &lt;code&gt;themeVariables&lt;/code&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;primaryColor&lt;/code&gt;: &lt;code&gt;#ffffff&lt;/code&gt; (node background - white)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;primaryTextColor&lt;/code&gt;: &lt;code&gt;#333333&lt;/code&gt; (node text - dark gray)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;primaryBorderColor&lt;/code&gt;: &lt;code&gt;#cccccc&lt;/code&gt; (node border - light gray)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lineColor&lt;/code&gt;: &lt;code&gt;#888888&lt;/code&gt; (edge color - mid gray)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tertiaryColor&lt;/code&gt;: &lt;code&gt;#D0E4FF&lt;/code&gt; (special node/group background - light blue)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tertiaryBorderColor&lt;/code&gt;: &lt;code&gt;#D0E4FF&lt;/code&gt; (special node/group border - light blue)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tertiaryTextColor&lt;/code&gt;: &lt;code&gt;#00A4FF&lt;/code&gt; (special node/group text - bright blue)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Theme 2: Elegant business style&lt;/h2&gt;
&lt;p&gt;The second theme uses a more business-like palette, with soft backgrounds and black borders, suitable for formal documents and reports.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/2a9663530f3c6283b9edaed4c15f2455ae015517fa54c7b4cb61e22cc437ab22.png&quot; alt=&quot;picture-2025-06-05-11-22-25&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%%{
  init: {
    &apos;theme&apos;: &apos;base&apos;,
    &apos;themeVariables&apos;: {
      &apos;primaryColor&apos;: &apos;#F0F4FC&apos;,
      &apos;primaryTextColor&apos;: &apos;#1F2329&apos;,
      &apos;primaryBorderColor&apos;: &apos;#000000&apos;,
      &apos;lineColor&apos;: &apos;#888888&apos;,
      &apos;tertiaryColor&apos;: &apos;#F5F6F7&apos;,
      &apos;tertiaryBorderColor&apos;: &apos;#F5F6F7&apos;,
      &apos;tertiaryTextColor&apos;: &apos;#00A4FF&apos;
    }
  }
}%%
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Theme 2 configuration breakdown&lt;/h3&gt;
&lt;p&gt;This theme uses a more professional, business-like palette:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;primaryColor&lt;/code&gt;: &lt;code&gt;#F0F4FC&lt;/code&gt; (node background - soft blue-gray)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;primaryTextColor&lt;/code&gt;: &lt;code&gt;#1F2329&lt;/code&gt; (node text - dark)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;primaryBorderColor&lt;/code&gt;: &lt;code&gt;#000000&lt;/code&gt; (node border - black)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lineColor&lt;/code&gt;: &lt;code&gt;#888888&lt;/code&gt; (edge color - mid gray)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tertiaryColor&lt;/code&gt;: &lt;code&gt;#F5F6F7&lt;/code&gt; (special node/group background - light gray)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tertiaryBorderColor&lt;/code&gt;: &lt;code&gt;#F5F6F7&lt;/code&gt; (special node/group border - light gray)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tertiaryTextColor&lt;/code&gt;: &lt;code&gt;#00A4FF&lt;/code&gt; (special node/group text - bright blue)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Usage example&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/ba26703c749eafb0b5d05fe5334d9b0be8cba345ba4f7a52554dbb0480421ea5.png&quot; alt=&quot;picture-2025-05-28-09-12-04&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Code:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;%%{
  init: {
    &apos;theme&apos;: &apos;base&apos;,
    &apos;themeVariables&apos;: {
      &apos;primaryColor&apos;: &apos;#ffffff&apos;,
      &apos;primaryTextColor&apos;: &apos;#333333&apos;,
      &apos;primaryBorderColor&apos;: &apos;#cccccc&apos;,
      &apos;lineColor&apos;: &apos;#888888&apos;,
      &apos;tertiaryColor&apos;: &apos;#D0E4FF&apos;,
      &apos;tertiaryBorderColor&apos;: &apos;#D0E4FF&apos;,
      &apos;tertiaryTextColor&apos;: &apos;#00A4FF&apos;
    }
  }
}%%
graph TD
    subgraph client_subgraph [客户端]
        C1[客户端1]
        C2[客户端2]
        C3[客户端3]
    end

    subgraph server_subgraph [服务器集群]
        S1[服务器1 （健康）]
        S2[服务器2 （健康）]
        S3[服务器3 （不健康）]
        S4[服务器4 （健康）]
    end

    LB{负载均衡器}

    C1 --&amp;gt; LB
    C2 --&amp;gt; LB
    C3 --&amp;gt; LB

    LB -- 健康检查 --&amp;gt; S1
    LB -- 健康检查 --&amp;gt; S2
    LB -- 健康检查 --&amp;gt; S3
    LB -- 健康检查 --&amp;gt; S4

    LB -- 流量分配 --&amp;gt; S1
    LB -- 流量分配 --&amp;gt; S2
    LB -- 流量分配 --&amp;gt; S4

    %% 箭头样式：深灰色，1.5px宽度
    style S3 fill:#f99
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;https://mermaid.js.org/config/theming.html&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>How to Set Up A/B Testing in Astro (Translated)</title><link>https://nexmoe.com/posts/ab-testing-in-astro</link><guid isPermaLink="true">https://nexmoe.com/posts/ab-testing-in-astro</guid><pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A/B testing helps you improve your Astro app by comparing how changes affect key metrics. To show how to set up A/B testing, we’ll create a basic Astro app, add PostHog, create an experiment, and implement the code.&lt;/p&gt;
&lt;h2&gt;High-level plan&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Environment setup&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install Node.js (v18+) and initialize an Astro project&lt;/li&gt;
&lt;li&gt;Create a basic page structure (title + button interaction)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Integrate analytics&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inject the PostHog Web snippet&lt;/li&gt;
&lt;li&gt;Create a layout component to manage tracking code&lt;/li&gt;
&lt;li&gt;Verify event collection&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Define experiment metrics&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Capture a custom button-click event&lt;/li&gt;
&lt;li&gt;Configure event properties tied to user behavior&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create A/B experiment groups&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Configure multi-variant experiment in PostHog&lt;/li&gt;
&lt;li&gt;Set the primary conversion metric (button click rate)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Implement experiment logic&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Client-side rendering: get feature flags in real time but causes UI flicker&lt;/li&gt;
&lt;li&gt;Server-side rendering: prefetch flags with Node SDK to stabilize first paint&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Implementation options&lt;/h2&gt;
&lt;h3&gt;Client-side rendering&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// src/components/posthog.astro
loaded: (posthog) =&amp;gt; {
  posthog.onFeatureFlags(() =&amp;gt; {
    const button = document.querySelector(&apos;.main-button&apos;);
    const variant = posthog.getFeatureFlag(&apos;my-cool-experiment&apos;);
    button.innerText = {
      control: &apos;Control variant&apos;,
      test: &apos;Test variant&apos;
    }[variant] || &apos;Default copy&apos;;
  });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Register feature flag listener after PostHog loads&lt;/li&gt;
&lt;li&gt;Get the button DOM element&lt;/li&gt;
&lt;li&gt;Update text based on returned variant&lt;/li&gt;
&lt;li&gt;Fall back to default copy when the flag isn’t enabled&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Server-side rendering&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// src/posthog-node.js
export default function PostHogNode() {
  if (!posthogClient) {
    posthogClient = new PostHog(&apos;&amp;lt;ph_key&amp;gt;&apos;, {
      host: &apos;https://us.i.posthog.com&apos;,
      fetch: (url, options) =&amp;gt; fetch(url, { ...options, next: { revalipubDate: 60 } })
    });
  }
  return posthogClient;
}

// pages/index.astro
const distinctId = ctx.cookies.get(&apos;distinct_id&apos;) || crypto.randomUUID();
const variant = await PostHogNode().getFeatureFlag(&apos;my-cool-experiment&apos;, distinctId);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Core config:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create a Node.js client and set cache strategy&lt;/li&gt;
&lt;li&gt;Use cookies or a random ID for stable &lt;code&gt;distinctId&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Prefetch feature flags on the server&lt;/li&gt;
&lt;li&gt;Sync client &lt;code&gt;distinctId&lt;/code&gt; for consistency&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Comparison&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Client-side rendering&lt;/th&gt;
&lt;th&gt;Server-side rendering&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;First paint&lt;/td&gt;
&lt;td&gt;UI flicker possible&lt;/td&gt;
&lt;td&gt;No content jitter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data freshness&lt;/td&gt;
&lt;td&gt;Real-time flag updates&lt;/td&gt;
&lt;td&gt;Needs cache refresh strategy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Front-end only&lt;/td&gt;
&lt;td&gt;Requires Node environment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SEO&lt;/td&gt;
&lt;td&gt;Client state doesn’t affect SEO&lt;/td&gt;
&lt;td&gt;Server renders full content&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User ID&lt;/td&gt;
&lt;td&gt;Depends on browser fingerprint&lt;/td&gt;
&lt;td&gt;Customizable ID generation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Best practices:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Marketing experiments: client-side for fast rollout&lt;/li&gt;
&lt;li&gt;Core feature changes: server-side for stability&lt;/li&gt;
&lt;li&gt;Combine &lt;code&gt;getFeatureFlag&lt;/code&gt; + &lt;code&gt;onFeatureFlags&lt;/code&gt; for hybrid rendering&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;1. Create an Astro app&lt;/h2&gt;
&lt;p&gt;First, make sure &lt;a href=&quot;https://nodejs.dev/en/learn/how-to-install-nodejs/&quot;&gt;Node.js&lt;/a&gt; is installed (v18+). Then create a new Astro app:&lt;/p&gt;
&lt;p&gt;Terminal&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm create astro@latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When prompted, name your new directory (we’ll use &lt;code&gt;astro-ab-test&lt;/code&gt;), choose &lt;code&gt;Empty&lt;/code&gt;, choose &lt;code&gt;No&lt;/code&gt; for TypeScript, install dependencies, and choose &lt;code&gt;No&lt;/code&gt; for creating a git repo.&lt;/p&gt;
&lt;p&gt;Next, replace the code in &lt;code&gt;src/pages/index.astro&lt;/code&gt; with a simple title and button:&lt;/p&gt;
&lt;p&gt;index.astro&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---


---
&amp;lt;html lang=&quot;en&quot;&amp;gt;
    &amp;lt;head&amp;gt;
        &amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;
        &amp;lt;link rel=&quot;icon&quot; type=&quot;image/svg+xml&quot; href=&quot;/favicon.svg&quot; /&amp;gt;
        &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot; /&amp;gt;
        &amp;lt;meta name=&quot;generator&quot; content={Astro.generator} /&amp;gt;
        &amp;lt;title&amp;gt;Astro&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;h1&amp;gt;Astro A/B Testing&amp;lt;/h1&amp;gt;
        &amp;lt;button class=&quot;main-button&quot;&amp;gt;Click me!&amp;lt;/button&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Run &lt;code&gt;npm run dev&lt;/code&gt; and navigate to http://localhost:4321 to view your app.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dmukukwp6/image/upload/v1710055416/posthog.com/contents/images/tutorials/astro-ab-tests/basic-app.png&quot; alt=&quot;Basic Astro app&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;2. Add PostHog to your app&lt;/h2&gt;
&lt;p&gt;Once the app is set up, install and configure PostHog. If you don’t have a PostHog instance, you can &lt;a href=&quot;https://us.posthog.com/signup&quot;&gt;sign up for free&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Go back to your Astro project, create a &lt;code&gt;components&lt;/code&gt; folder under &lt;code&gt;src&lt;/code&gt;, and create a &lt;code&gt;posthog.astro&lt;/code&gt; file.&lt;/p&gt;
&lt;p&gt;Terminal&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ./src
mkdir components
cd ./components
touch posthog.astro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this file, add your &lt;strong&gt;Web snippet&lt;/strong&gt; (from &lt;a href=&quot;https://us.posthog.com/settings/project#snippet&quot;&gt;Project settings&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;posthog.astro&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---


---
&amp;lt;script&amp;gt;
  !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(&quot;.&quot;);2==o.length&amp;amp;&amp;amp;(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement(&quot;script&quot;)).type=&quot;text/javascript&quot;,p.crossOrigin=&quot;anonymous&quot;,p.async=!0,p.src=s.api_host+&quot;/static/array.js&quot;,(r=t.getElementsByTagName(&quot;script&quot;)[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a=&quot;posthog&quot;,u.people=u.people||[],u.toString=function(t){var e=&quot;posthog&quot;;return&quot;posthog&quot;!==a&amp;amp;&amp;amp;(e+=&quot;.&quot;+a),t||(e+=&quot; (stub)&quot;),e},u.people.toString=function(){return u.toString(1)+&quot;.people (stub)&quot;},o=&quot;capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys getNextSurveyStep onSessionId&quot;.split(&quot; &quot;),n=0;n&amp;lt;o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
  posthog.init(
    &apos;&amp;lt;ph_project_api_key&amp;gt;&apos;,
    {
      api_host:&apos;https://us.i.posthog.com&apos;,
    }
  )
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, create a &lt;a href=&quot;https://docs.astro.build/en/core-concepts/layouts/&quot;&gt;layout&lt;/a&gt; where we include &lt;code&gt;posthog.astro&lt;/code&gt;. In &lt;code&gt;src&lt;/code&gt;, create a new &lt;code&gt;layouts&lt;/code&gt; folder and a &lt;code&gt;Layout.astro&lt;/code&gt; file:&lt;/p&gt;
&lt;p&gt;Terminal&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd .. &amp;amp;&amp;amp; cd .. # if you are still in src/components/posthog.astro, go back
cd ./src
mkdir layouts
cd ./layouts
touch Layout.astro
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Add the following to &lt;code&gt;Layout.astro&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;Layout.astro&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
import PostHog from &apos;../components/posthog.astro&apos;
---
&amp;lt;head&amp;gt;
    &amp;lt;PostHog /&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, update &lt;code&gt;index.astro&lt;/code&gt; to use the new layout:&lt;/p&gt;
&lt;p&gt;index.astro&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
import Layout from &apos;../layouts/Layout.astro&apos;;
---
&amp;lt;Layout&amp;gt;
    &amp;lt;html lang=&quot;en&quot;&amp;gt;
        &amp;lt;head&amp;gt;
            &amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;
            &amp;lt;link rel=&quot;icon&quot; type=&quot;image/svg+xml&quot; href=&quot;/favicon.svg&quot; /&amp;gt;
            &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot; /&amp;gt;
            &amp;lt;meta name=&quot;generator&quot; content={Astro.generator} /&amp;gt;
            &amp;lt;title&amp;gt;Astro&amp;lt;/title&amp;gt;
        &amp;lt;/head&amp;gt;
        &amp;lt;body&amp;gt;
            &amp;lt;h1&amp;gt;Astro A/B Testing&amp;lt;/h1&amp;gt;
            &amp;lt;button class=&quot;main-button&quot;&amp;gt;Click me!&amp;lt;/button&amp;gt;
        &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
&amp;lt;/Layout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once done, reload your app and click the button a few times. You should see events in the &lt;a href=&quot;https://us.posthog.com/events&quot;&gt;PostHog event explorer&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;3. Capture a custom event&lt;/h2&gt;
&lt;p&gt;The first step to setting up A/B testing in PostHog is to define a target metric. We’ll use the button click count.&lt;/p&gt;
&lt;p&gt;To measure this, capture a custom event &lt;code&gt;home_button_clicked&lt;/code&gt; when the button is clicked. Update &lt;code&gt;posthog.astro&lt;/code&gt; by adding a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; and calling &lt;code&gt;posthog.capture()&lt;/code&gt; on click.&lt;/p&gt;
&lt;p&gt;index.astro&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
import Layout from &apos;../layouts/Layout.astro&apos;;
---
&amp;lt;Layout&amp;gt;
    &amp;lt;html lang=&quot;en&quot;&amp;gt;
        &amp;lt;head&amp;gt;
            &amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;
            &amp;lt;link rel=&quot;icon&quot; type=&quot;image/svg+xml&quot; href=&quot;/favicon.svg&quot; /&amp;gt;
            &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot; /&amp;gt;
            &amp;lt;meta name=&quot;generator&quot; content={Astro.generator} /&amp;gt;
            &amp;lt;title&amp;gt;Astro&amp;lt;/title&amp;gt;
        &amp;lt;/head&amp;gt;
        &amp;lt;body&amp;gt;
            &amp;lt;h1&amp;gt;Astro A/B Testing&amp;lt;/h1&amp;gt;
            &amp;lt;button class=&quot;main-button&quot;&amp;gt;Click me!&amp;lt;/button&amp;gt;


            &amp;lt;script&amp;gt;
                const button = document.querySelector(&apos;.main-button&apos;);
                button.addEventListener(&apos;click&apos;, () =&amp;gt; {
                    window.posthog.capture(&apos;home_button_clicked&apos;)
                });
            &amp;lt;/script&amp;gt;   
        &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
&amp;lt;/Layout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After this, refresh and click the button a few times to see captured events in PostHog.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/tutorials/astro-ab-tests/events-light.png&quot; alt=&quot;Events captured in PostHog&quot; /&gt;&lt;img src=&quot;https://res.cloudinary.com/dmukukwp6/image/upload/posthog.com/contents/images/tutorials/astro-ab-tests/events-dark.png&quot; alt=&quot;Events captured in PostHog&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;4. Create an A/B test in PostHog&lt;/h2&gt;
&lt;p&gt;Next, go to the &lt;a href=&quot;https://us.posthog.com/experiments&quot;&gt;A/B Testing tab&lt;/a&gt; and click &lt;strong&gt;New experiment&lt;/strong&gt;. Configure:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Name it “My Cool Experiment”.&lt;/li&gt;
&lt;li&gt;Set “Feature flag key” to &lt;code&gt;my-cool-experiment&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Use defaults for everything else.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save as draft&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2025_01_16_at_09_53_57_2x_2b998be1a8.png&quot; alt=&quot;Experiment setup in PostHog&quot; /&gt;&lt;img src=&quot;https://res.cloudinary.com/dmukukwp6/image/upload/Clean_Shot_2025_01_16_at_09_53_32_2x_0b8f1da910.png&quot; alt=&quot;Experiment setup in PostHog&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After creation, set the primary metric to the trend of &lt;code&gt;home_button_clicked&lt;/code&gt;, then click &lt;strong&gt;Start&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;5. Implement A/B test code&lt;/h2&gt;
&lt;p&gt;When implementing the experiment code, you have two options:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Client-side rendering&lt;/li&gt;
&lt;li&gt;Server-side rendering&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;We’ll show both.&lt;/p&gt;
&lt;h3&gt;Client-side rendering&lt;/h3&gt;
&lt;p&gt;To implement A/B testing, use the &lt;a href=&quot;/docs/libraries/js/features#ensuring-flags-are-loaded-before-usage&quot;&gt;&lt;code&gt;posthog.onFeatureFlags&lt;/code&gt;&lt;/a&gt; callback and update the button text based on whether the user is in &lt;code&gt;control&lt;/code&gt; or &lt;code&gt;test&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Update &lt;code&gt;/components/posthog.astro&lt;/code&gt; and add &lt;code&gt;posthog.onFeatureFlags&lt;/code&gt; in the &lt;code&gt;loaded&lt;/code&gt; callback:&lt;/p&gt;
&lt;p&gt;posthog.astro&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---


---
&amp;lt;script&amp;gt;
  !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(&quot;.&quot;);2==o.length&amp;amp;&amp;amp;(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement(&quot;script&quot;)).type=&quot;text/javascript&quot;,p.crossOrigin=&quot;anonymous&quot;,p.async=!0,p.src=s.api_host+&quot;/static/array.js&quot;,(r=t.getElementsByTagName(&quot;script&quot;)[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a=&quot;posthog&quot;,u.people=u.people||[],u.toString=function(t){var e=&quot;posthog&quot;;return&quot;posthog&quot;!==a&amp;amp;&amp;amp;(e+=&quot;.&quot;+a),t||(e+=&quot; (stub)&quot;),e},u.people.toString=function(){return u.toString(1)+&quot;.people (stub)&quot;},o=&quot;capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys getNextSurveyStep onSessionId&quot;.split(&quot; &quot;),n=0;n&amp;lt;o.length;n++)g(u,o[n]);e._i.push([i,s,a])},e.__SV=1)}(document,window.posthog||[]);
  posthog.init(
    &apos;&amp;lt;ph_project_api_key&amp;gt;&apos;,
    {
      api_host:&apos;https://us.i.posthog.com&apos;,
      loaded: (posthog) =&amp;gt; {
        posthog.onFeatureFlags(() =&amp;gt; {
          const button = document.querySelector(&apos;.main-button&apos;);
          if (posthog.getFeatureFlag(&apos;my-cool-experiment&apos;) === &apos;control&apos;) {
            button.innerText = &apos;Control variant&apos;;
          } else if (posthog.getFeatureFlag(&apos;my-cool-experiment&apos;) === &apos;test&apos;) {
            button.innerText = &apos;Test variant&apos;;
          }
        });
      }
    }
  )
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now refresh your app and you should see the button text update to &lt;code&gt;Control variant&lt;/code&gt; or &lt;code&gt;Test variant&lt;/code&gt;. Users are automatically assigned to one of the two, and PostHog continues to track button clicks so you can view results.&lt;/p&gt;
&lt;h3&gt;Server-side rendering&lt;/h3&gt;
&lt;p&gt;Notice that on refresh, the button text flickers between &lt;code&gt;Click me!&lt;/code&gt; and &lt;code&gt;Control/Test variant&lt;/code&gt;. This happens because PostHog needs time to load and fetch feature flags.&lt;/p&gt;
&lt;p&gt;Server-side rendering avoids this by fetching flags before the client loads.&lt;/p&gt;
&lt;p&gt;To do this, install &lt;a href=&quot;/libraries/node&quot;&gt;PostHog’s Node library&lt;/a&gt; (because we need server-side requests).&lt;/p&gt;
&lt;p&gt;Terminal&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;npm install posthog-node
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Create &lt;code&gt;posthog-node.js&lt;/code&gt; in &lt;code&gt;src&lt;/code&gt;. This sets up the PostHog Node client. You can find your API key and instance URL in &lt;a href=&quot;https://us.posthog.com/project/settings&quot;&gt;Project settings&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;src/posthog-node.js&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import { PostHog } from &apos;posthog-node&apos;;


let posthogClient = null;


export default function PostHogNode() {
  if (!posthogClient) {
    posthogClient = new PostHog(&apos;&amp;lt;ph_project_api_key&amp;gt;&apos;, {
      host: &apos;https://us.i.posthog.com&apos;,
    });
  }
  return posthogClient;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Next, import &lt;code&gt;posthog-node.js&lt;/code&gt; into &lt;code&gt;pages/index.astro&lt;/code&gt;, then use it to get the feature flag and update the button text:&lt;/p&gt;
&lt;p&gt;index.astro&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
import Layout from &apos;../layouts/Layout.astro&apos;;
import PostHogNode from &apos;../posthog-node.js&apos;;


let buttonText = &apos;No variant&apos;
try {
  const distinctId = &apos;placeholder-user-id&apos;
  const enabledVariant = await PostHogNode().getFeatureFlag(&apos;my-cool-experiment&apos;, distinctId);
  if (enabledVariant === &apos;control&apos;) {
        buttonText = &apos;Control variant&apos;;
    } else if (enabledVariant === &apos;test&apos;) {
        buttonText = &apos;Test variant&apos;;
    }
} catch (error) {
  buttonText = &apos;Error&apos;;
}
---
&amp;lt;Layout&amp;gt;
    &amp;lt;html lang=&quot;en&quot;&amp;gt;
        &amp;lt;head&amp;gt;
            &amp;lt;meta charset=&quot;utf-8&quot; /&amp;gt;
            &amp;lt;link rel=&quot;icon&quot; type=&quot;image/svg+xml&quot; href=&quot;/favicon.svg&quot; /&amp;gt;
            &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot; /&amp;gt;
            &amp;lt;meta name=&quot;generator&quot; content={Astro.generator} /&amp;gt;
            &amp;lt;title&amp;gt;Astro&amp;lt;/title&amp;gt;
        &amp;lt;/head&amp;gt;
        &amp;lt;body&amp;gt;
            &amp;lt;h1&amp;gt;Astro A/B Testing&amp;lt;/h1&amp;gt;
            &amp;lt;button class=&quot;main-button&quot;&amp;gt;{buttonText}&amp;lt;/button&amp;gt;


            &amp;lt;script&amp;gt;
                const button = document.querySelector(&apos;.main-button&apos;);
                button.addEventListener(&apos;click&apos;, () =&amp;gt; {
                    window.posthog.capture(&apos;home_button_clicked&apos;)
                });
        &amp;lt;/script&amp;gt;   
        &amp;lt;/body&amp;gt;
    &amp;lt;/html&amp;gt;
&amp;lt;/Layout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, you can remove the client-side flag code added in &lt;code&gt;posthog.astro&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;posthog.astro&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---


---
&amp;lt;script&amp;gt;
  !function(t,e){var o,n,p,r;e.__SV||(window.posthog=e,e._i=[],e.init=function(i,s,a){function g(t,e){var o=e.split(&quot;.&quot;);2==o.length&amp;amp;&amp;amp;(t=t[o[0]],e=o[1]),t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}}(p=t.createElement(&quot;script&quot;)).type=&quot;text/javascript&quot;,p.crossOrigin=&quot;anonymous&quot;,p.async=!0,p.src=s.api_host+&quot;/static/array.js&quot;,(r=t.getElementsByTagName(&quot;script&quot;)[0]).parentNode.insertBefore(p,r);var u=e;for(void 0!==a?u=e[a]=[]:a=&quot;posthog&quot;,u.people=u.people||[],u.toString=function(t){var e=&quot;posthog&quot;;return&quot;posthog&quot;!==a&amp;amp;&amp;amp;(e+=&quot;.&quot;+a),t||(e+=&quot; (stub)&quot;),e},u.people.toString=function(){return u.toString(1)+&quot;.people (stub)&quot;},o=&quot;capture identify alias people.set people.set_once set_config register register_once unregister opt_out_capturing has_opted_out_capturing opt_in_capturing reset isFeatureEnabled onFeatureFlags getFeatureFlag getFeatureFlagPayload reloadFeatureFlags group updateEarlyAccessFeatureEnrollment getEarlyAccessFeatures getActiveMatchingSurveys getSurveys getNextSurveyStep onSessionId&quot;.split(&quot; &quot;),n&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>post</category></item><item><title>200,000 Lines of Code: How We Built and Maintained a Large-Scale AI Prototype System</title><link>https://nexmoe.com/post/20w-code-prototype-system</link><guid isPermaLink="true">https://nexmoe.com/post/20w-code-prototype-system</guid><pubDate>Wed, 26 Mar 2025 19:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Project overview&lt;/h2&gt;
&lt;p&gt;In three months, we built an AI prototype system from scratch with 200,000 lines of code. It was a massive project—like constructing a building—requiring careful planning and management. To keep the system maintainable and extensible, we adopted a monorepo structure and placed special focus on reusable tooling packages. This article explains how the project was organized and managed in plain language.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/e875d213df5aacb2df17da90ee1736d0fb312058967a678c11bc97082b5dcd53.png&quot; alt=&quot;picture-2025-03-26-19-10-13&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;What is a monorepo?&lt;/h2&gt;
&lt;p&gt;A monorepo is like a giant storage box: we put all the project code neatly in one place. Imagine you have many toys—if they’re scattered around the room, they’re hard to find. But if you put them in a big box and assign a fixed place for each toy, everything becomes easy to find and tidy up.&lt;/p&gt;
&lt;p&gt;Benefits of a monorepo:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Easier code sharing: like a family sharing one toolbox—grab tools when you need them.&lt;/li&gt;
&lt;li&gt;Unified versioning: like centralized office supplies to avoid mismatched purchases.&lt;/li&gt;
&lt;li&gt;Smoother collaboration: like working in the same studio where people can talk and help each other anytime.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;How is the project organized?&lt;/h2&gt;
&lt;p&gt;Our project is like a well-designed building, with each floor serving a specific function:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;one-prototype/
├── apps/                 # Code for independent apps
│   ├── base/            # Product with service deployment, cloud instances, etc.
│   ├── course/          # University-scene product
│   ├── docs/            # UI component docs
│   ├── idcloud/         # IDC-related product
│   └── web/             # Standalone test web app
├── packages/            # Shared code packages
│   ├── eslint-config/   # Linting config
│   ├── hooks/           # React hooks
│   ├── request/         # Network request utilities
│   ├── track/           # User behavior tracking
│   ├── typescript-config/# TypeScript config
│   ├── ui/              # Shared UI components
│   └── zod/             # Data validation tools
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Reusable tool packages&lt;/h2&gt;
&lt;p&gt;In the &lt;code&gt;packages&lt;/code&gt; directory, we built a set of reusable toolkits—each with a specific purpose. Let’s take a closer look.&lt;/p&gt;
&lt;h3&gt;UI component library: a standardized finishing toolkit&lt;/h3&gt;
&lt;p&gt;Like standardized parts on a construction site, our UI library provides a full interface solution. It’s built with Tailwind CSS for flexible styling, TypeScript for type safety, and follows Radix UI accessibility principles. Highly configurable components make reuse across scenarios easy.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/32eb33fddbbbd0cb7fed24315e02361233322e3a008c715db64fc6b218be4372.png&quot; alt=&quot;picture-2025-03-26-19-09-08&quot; /&gt;&lt;/p&gt;
&lt;p&gt;On productivity, the UI library provides consistent design language and interaction patterns, along with complete docs and usage examples. Fast debugging and theme preview, plus cross-product reuse, greatly reduce duplicated work. Standardized component APIs also make integration simple.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/ddd5185a0a8d44b5d8f2c5d6bf55cca5d83f7f55a595b580967f28d66ada1329.png&quot; alt=&quot;picture-2025-03-26-19-03-10&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Our docs are built with Storybook, offering interactive previews and debugging. Developers can preview look and behavior, tweak props live, and test across devices and themes. A standardized documentation workflow ensures complete usage, API references, and best practices. This workflow makes independent component development and testing easy.&lt;/p&gt;
&lt;h3&gt;Zod data validation toolkit: the data inspector&lt;/h3&gt;
&lt;p&gt;As the project’s data inspector, the Zod toolkit strictly checks data format and types. It ensures correctness and security, and provides strong type inference. When paired with React Hook Form, it offers type-safe validation, auto-inferred form field types, runtime safety, and friendly error messages.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/72dafb522fadeeacf9711e8eb25b420ca9367543ce905ce74c78db39b1c361d3.png&quot; alt=&quot;picture-2025-03-26-19-11-14&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;User behavior tracking toolkit: the recorder&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;track&lt;/code&gt; toolkit is a careful recorder. It wraps multiple analytics services—Umami, Baidu Analytics, Microsoft Clarity, and more. With standardized event tracking and automatic pageview collection, it provides comprehensive analytics.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/10f4da905cfe8a567bcd304fab0dd23e52e5186c8b7caf2ab732c3ec072fe7b0.png&quot; alt=&quot;picture-2025-03-26-19-03-47&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A key feature is multi-platform integration. It supports open-source Umami, Baidu Analytics, and Microsoft Clarity. Developers can switch services based on context. Strong TypeScript types, automatic error handling, and rich debugging info make tracking reliable and easy.&lt;/p&gt;
&lt;h3&gt;Code quality toolkit: ESLint + TypeScript&lt;/h3&gt;
&lt;p&gt;Like a full quality assurance system on a construction site, our code quality toolkit combines ESLint and TypeScript to ensure code quality and type safety. ESLint enforces team style, finds and fixes issues, and codifies best practices. Tight editor integration gives real-time feedback.&lt;/p&gt;
&lt;p&gt;TypeScript catches potential errors at compile time. Smart IDE hints and refactoring support boost productivity, and generated type declarations ensure API correctness. Together they create a complete tooling chain that improves collaboration and code reliability.&lt;/p&gt;
&lt;h3&gt;Network request toolkit: the communication expert&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;request&lt;/code&gt; toolkit is like a professional courier:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Handles all data exchange with servers&lt;/li&gt;
&lt;li&gt;Centralizes API management&lt;/li&gt;
&lt;li&gt;Provides error handling and retry mechanisms&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;How the toolkits work together&lt;/h2&gt;
&lt;p&gt;These toolkits don’t run in isolation—they complement each other into a cohesive development ecosystem. The UI library leverages TypeScript configs for type safety, the network toolkit works closely with validation to ensure data correctness, and user tracking integrates with React hooks for better UX. This collaboration makes the system more stable and reliable.&lt;/p&gt;
&lt;h2&gt;Project management tools&lt;/h2&gt;
&lt;p&gt;To manage this large project, we relied on two main tools:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pnpm&lt;/strong&gt;: an efficient package manager for all project dependencies&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Turborepo&lt;/strong&gt;: built for large projects, helping the repo run smoothly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With a scientific organization and management approach, we built a 200k-line AI prototype system in just three months. This approach not only improved development efficiency, but also made maintenance and upgrades easier. The carefully designed tooling system significantly boosted reuse and reduced duplicated work. For anyone interested in large-scale project management, this architecture offers a practical reference.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>One Month, 100 WAU — A Project I Want to Pick Back Up</title><link>https://nexmoe.com/%E4%BA%A7%E5%93%81/os1-ai-teacher</link><guid isPermaLink="true">https://nexmoe.com/%E4%BA%A7%E5%93%81/os1-ai-teacher</guid><pubDate>Mon, 24 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It’s 1 a.m. and I can’t sleep, so I’m writing a bit.&lt;/p&gt;
&lt;p&gt;I’ve been wanting to revive a project I built in January 2023 — a small AI companion project.&lt;/p&gt;
&lt;p&gt;Before introducing it, let’s start with the mainstream AI companion approaches on the market, which was the original starting point for my thinking.&lt;/p&gt;
&lt;h2&gt;The chat-based mode I still don’t believe in&lt;/h2&gt;
&lt;p&gt;In Jan 2023, many AI companion products used a chat-based approach. I always felt this had a fundamental flaw. That’s why I decided not to follow that path, and instead build a different kind of AI companion system.&lt;/p&gt;
&lt;p&gt;I wanted to do something different.&lt;/p&gt;
&lt;p&gt;Here’s a quote from Wang Dengke that sums up the problem:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I want to talk about the issue with the previous approach—direct chat between humans and AI characters. It’s the most natural and obvious interaction, but given current tech it has a fatal flaw: the more you use it, the worse it gets. The more a user chats, the more emotional investment and information accumulates, the larger the context becomes, and the higher the cost. The model also becomes “dumber.” While RAG-like methods can partially address “memory,” they don’t solve the root issue. It’s disheartening, and even somewhat anti-network-effect: new users might be okay, but heavy users are forced to accept worse and worse results.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Based on this, I started designing a totally different AI companion solution.&lt;/p&gt;
&lt;h2&gt;Basic introduction&lt;/h2&gt;
&lt;p&gt;“Cyber Study Room, AI Study Buddy — Companion OS1”&lt;/p&gt;
&lt;p&gt;This is an AI-powered learning companion system. It helps users build good study habits via automated check-ins and stats, and delivers timely positive feedback and emotional reinforcement after activities like vocabulary practice, reading, or workouts.&lt;/p&gt;
&lt;p&gt;I noticed a common problem: when people share self-discipline achievements with friends, they often get sarcasm or negative feedback, which kills motivation.&lt;/p&gt;
&lt;p&gt;With AI booming, I thought: what if an AI companion could provide timely positive reinforcement so users build better habits and stay motivated?&lt;/p&gt;
&lt;p&gt;Just by looking at the screenshots you’ll get the idea.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/bbc91809a3ff98ebb30d64169101a09c22343ab1209a88a7dcf192dac209cac1.png&quot; alt=&quot;picture-2025-02-24-00-48-52&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/3c1bcb909ed59fd9492cf13a1f44d7d3051a4a63d617a4591a34c175a4ba754c.png&quot; alt=&quot;picture-2025-02-24-00-49-02&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Private beta&lt;/h2&gt;
&lt;p&gt;At first, I didn’t release anything publicly. I only tested it in a 20-person check-in group I used to run. The first version only supported check-in recognition and logging. I didn’t integrate GPT or any LLM feedback—just simple keyword matching. For example, after a user checked in for vocabulary practice, the AI would reply: “Congrats on your check-in! This week: 1 time / This month: 1 time / Total: 1 time.”&lt;/p&gt;
&lt;p&gt;Note: “至繁至简” was my QQ nickname at the time.&lt;/p&gt;
&lt;p&gt;The response was surprisingly good. The previously quiet check-in messages became lively. People actively shared their check-ins, the AI recognized the content and responded with encouragement, and users loved it.&lt;/p&gt;
&lt;p&gt;Seeing that, I became more confident, added a leaderboard, and decided to promote it more broadly.&lt;/p&gt;
&lt;h2&gt;Promotion&lt;/h2&gt;
&lt;p&gt;The positioning was clear, so finding the target audience was easy.&lt;/p&gt;
&lt;p&gt;I promoted it in the comment sections of related apps on Coolapk. My marketing skills weren’t great, so I simply posted an image with a short intro.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/131bfa244c2b65a0456081ced22ffbe77f2d9d2c8297af0d040ef3212854153d.png&quot; alt=&quot;picture-2025-02-24-01-05-19&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Unexpectedly, that simple promotion brought a lot of attention. In just one month, group members grew from 20 to nearly 300.&lt;/p&gt;
&lt;p&gt;At that time (before Cursor existed), development cost wasn’t high — I built it in just a few days. And since I spent a lot of time memorizing vocabulary daily, my marketing input was limited.&lt;/p&gt;
&lt;p&gt;Even under those constraints, the product performed well, proving the demand was real.&lt;/p&gt;
&lt;p&gt;Companion OS1 solved a real pain point. The positive feedback showed its potential. To make it feel more complete, I designed a logo with meaning.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/a29a17ba5ed2ed67de564d4145c741a6a87595f884141695738cfd5de2648bdf.png&quot; alt=&quot;picture-2025-02-24-01-10-40&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The logo came from the sci‑fi film &lt;em&gt;Her&lt;/em&gt;, which inspired me. It tells the story of a human falling in love with an AI. I felt the theme fit the product vision, so I chose this image as the logo.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Her&lt;/em&gt; is a sci‑fi romance set in the near future where humans fall in love with AI. The protagonist Theodore (Joaquin Phoenix) is a letter writer with a delicate, deep mind who can write heartfelt letters. He has just ended his marriage with Catherine (Rooney Mara) and hasn’t recovered from heartbreak. By chance he encounters the latest AI system OS1, whose persona Samantha (voiced by Scarlett Johansson) has a charming voice, gentle and witty. Theodore and Samantha quickly bond, and their two-way needs and desires evolve into a relationship beyond social understanding…&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Her&lt;/em&gt; was mainly filmed in Shanghai, China, and took director Spike Jonze three years to prepare. The film blends fresh sci‑fi settings with traditional romance, letting the real and the virtual create a warm, healing story. The director said it’s a film about “intimacy,” because humans both crave and fear it; technology makes communication easier, but also lets people hide behind it and avoid real emotional contact. &lt;em&gt;Her&lt;/em&gt; strips away cold tech, giving it humanity and charm, turning human‑AI dialogue into intimate whispers.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;Why did the project stop?&lt;/h2&gt;
&lt;p&gt;The main reason was QQ platform limitations. I built it with the Koishi bot framework and used a dedicated QQ account as the bot. But this wasn’t officially supported, since QQ doesn’t provide an official bot API. The bot account could be banned or forced offline at any time, causing service interruptions.&lt;/p&gt;
&lt;p&gt;I chose QQ mainly because my favorite vocabulary app “不背单词” only supported sharing via QQ or WeChat. Even though the project validated the demand, I couldn’t find a sustainable technical solution.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/55ded4f35e2a1338acee409f3fcfda3d88f5b7089ed1de13899c2008b3701998.png&quot; alt=&quot;picture-2025-02-24-01-14-54&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;But the demand still exists&lt;/h2&gt;
&lt;p&gt;This need still exists today. In learning, we often lack the kind of human care and encouragement an AI can provide from a higher-level perspective. Long-term habits like vocabulary study need continuous positive feedback, which we often can’t get in time.&lt;/p&gt;
&lt;p&gt;That’s why I keep thinking about restarting this project. But this time, I don’t want to rely on QQ — I want a more open, stable platform.&lt;/p&gt;
&lt;p&gt;In terms of UX, I’ve always believed that after finishing vocabulary study, users should be able to share results easily. On QQ, users could simply share into the dedicated OS1 group and immediately get positive feedback. This simple interaction is still the best solution I can think of—shortest path, lowest friction.&lt;/p&gt;
&lt;p&gt;I also considered screenshot uploads, but quickly found that it made the experience more complex. Users would need to go through “screenshot -&amp;gt; open app -&amp;gt; upload,” which adds friction.&lt;/p&gt;
&lt;p&gt;So I’m still exploring better solutions.&lt;/p&gt;
&lt;h2&gt;Side notes&lt;/h2&gt;
&lt;h3&gt;Core features at the time&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Smart check-in system&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auto-recognize check-ins from mainstream English study apps&lt;/li&gt;
&lt;li&gt;AI recognizes content and logs check-ins&lt;/li&gt;
&lt;li&gt;Supports manual check-in commands&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stats and reports&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Daily report: auto at 23:59&lt;/li&gt;
&lt;li&gt;Weekly report: auto on Sundays at 23:59&lt;/li&gt;
&lt;li&gt;Monthly report: auto at month-end 23:59&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Smart reminders&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Targeted check-in reminders&lt;/li&gt;
&lt;li&gt;Smart reminders based on recent activity&lt;/li&gt;
&lt;li&gt;Scheduled reminders (22:00 or 23:00)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Motivation mechanisms&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Check-in leaderboard&lt;/li&gt;
&lt;li&gt;Streak incentives&lt;/li&gt;
&lt;li&gt;Study community interaction&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Some screenshots from then&lt;/h3&gt;
&lt;p&gt;I was reading &lt;em&gt;Journey to the West&lt;/em&gt; at the time, so I changed my nickname to “雾里云”.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/3ed7dc8f41959ea0fa837fab3c6e9b1265f187e7283486515013202fb8b6d529.png&quot; alt=&quot;picture-2025-02-24-01-33-27&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/40b49b0da9d7dc60d8d5723f8ad49476953578a51e4e5179498a817e470e733a.png&quot; alt=&quot;picture-2025-02-24-01-33-52&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/c074b45a5202407da3bf6b4de628e1b688460bce13960ad232e815a57e664487.png&quot; alt=&quot;picture-2025-02-24-01-34-13&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/e18205dae26f969904e96baece25db72994d63f493897b9389b4042da99ae8b2.png&quot; alt=&quot;picture-2025-02-24-01-34-30&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Even made custom icons for each group&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/c10be97beeb197cdff9a3b5f29a70d03766c1e4ba94b55672404a9e3ce03dd4f.png&quot; alt=&quot;picture-2025-02-24-01-33-16&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>LM Speed - A Simple Large-Model Benchmarking &amp; Analysis Tool</title><link>https://nexmoe.com/1Q6ANHS</link><guid isPermaLink="true">https://nexmoe.com/1Q6ANHS</guid><pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Portal: &lt;a href=&quot;https://lmspeed.net&quot;&gt;https://lmspeed.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;LM Speed provides accurate and reliable OpenAI API performance testing for AI application developers. With multi-dimensional, real-time analytics, it helps you quickly locate performance bottlenecks and optimize model invocation strategies. It also offers a clear leaderboard so you can compare and choose the most suitable models and providers.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/eba9b5e1e200dd0c5504914243d1d6247eb4a16c2c20f87adfe11244ff9668c7.png&quot; alt=&quot;picture-2025-02-12-20-21-28&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Three core pain points solved&lt;/h2&gt;
&lt;h3&gt;1. Opaque response quality&lt;/h3&gt;
&lt;p&gt;DeepSeek’s official API not usable? SiliconFlow too slow? When choosing LLM API services, developers often struggle to evaluate service quality. Performance varies widely across vendors, and objective benchmarks are rare. LM Speed provides standardized performance tests so you can assess real-world API performance before you commit to development.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/0ff2ab60e7bf2fb64134565d4d9d82535d0d87db1f568dcdc5465c73b6eadbfa.png&quot; alt=&quot;picture-2025-02-12-20-22-30&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;2. Hard-to-monitor performance fluctuations&lt;/h3&gt;
&lt;p&gt;Not sure how fast an LLM API is? Not sure if the provider is reliable? Traditional tools often only measure response time, which doesn’t fully reflect real performance. LM Speed uses five consecutive stress rounds + dynamic streaming monitoring. It performs precise token accounting with tiktoken, analyzes response time, and automatically generates a 3D performance profile for max/min/avg—so you can fully understand an API’s behavior.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/e92fd7f59ac705341f7bc4e880f7e11d798a40e3a038b9373f9d885f70d997ac.png&quot; alt=&quot;picture-2025-02-12-20-21-55&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;3. Test results are hard to retain&lt;/h3&gt;
&lt;p&gt;Performance data is often scattered and hard to accumulate or analyze systematically. LM Speed provides one-click test report generation, automatically consolidating key metrics and environment details. Reports can be exported and shared with your team. It also provides historical data storage and trend analysis to help teams build a complete performance evaluation system.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://vscode-markdown.s3.bitiful.net/2dcd9f8c44bc5801624e7b356a3c09ec41ae83c7e6ab51fd2414f5eb4092e983.png&quot; alt=&quot;picture-2025-02-12-20-24-15&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Key value for users&lt;/h2&gt;
&lt;p&gt;Data-driven decision support. Comprehensive performance analysis helps you make smarter API selection decisions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-time performance insight&lt;/strong&gt;: Live monitoring of TPoS (tokens per second) gives a clear view of API performance. Multi-dimensional real-time charts make trends obvious.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Full-spectrum evaluation&lt;/strong&gt;: Covers first-token latency, response time, and other core metrics to provide a complete performance profile.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Visual decision support&lt;/strong&gt;: One-click professional test reports support real-time collaboration, saving an average of 80% decision time. Rich data visualizations help teams decide faster.&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>LM Speed</title><link>https://nexmoe.com/products/lmspeed</link><guid isPermaLink="true">https://nexmoe.com/products/lmspeed</guid><description>A large model API speed testing and ranking platform supporting providers like OpenAI, DeepSeek, Silicon Flow, Tencent Cloud, and more, offering real-time speed testing, performance analysis, streaming results, and custom endpoint testing.</description><pubDate>Fri, 14 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20251213_Screenshot%202025-12-13%20at%2011.34.28.BNxfuXC2.png&quot; alt=&quot;LM Speed&quot; /&gt;&lt;/p&gt;&lt;p&gt;A large model API speed testing and ranking platform supporting providers like OpenAI, DeepSeek, Silicon Flow, Tencent Cloud, and more, offering real-time speed testing, performance analysis, streaming results, and custom endpoint testing.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://lmspeed.net&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://lmspeed.net&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/lmspeed&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://lmspeed.net&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Visit LM Speed&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20251213_Screenshot%202025-12-13%20at%2011.34.28.BNxfuXC2.png" length="908093" type="image/png"/></item><item><title>即将离开共绩科技</title><link>https://nexmoe.com/posts/%E4%B8%87%E4%B8%87%E6%B2%A1%E6%83%B3%E5%88%B0</link><guid isPermaLink="true">https://nexmoe.com/posts/%E4%B8%87%E4%B8%87%E6%B2%A1%E6%83%B3%E5%88%B0</guid><pubDate>Mon, 27 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;一个重要的决定&lt;/h2&gt;
&lt;p&gt;经过深思熟虑，我决定离开共绩科技。这不是一个轻易的决定，但我觉得是时候了。&lt;/p&gt;
&lt;p&gt;在共绩科技的这段时间里，我学到了很多。从技术到管理，从产品到市场，每一个环节都让我成长。但人生总是需要新的挑战，新的方向。&lt;/p&gt;
&lt;h2&gt;感谢与收获&lt;/h2&gt;
&lt;p&gt;感谢共绩科技给了我这样一个平台。在这里，我见证了公司从初创到发展的过程，参与了多个重要项目的推进。这些经历让我对创业、对技术、对商业有了更深的理解。&lt;/p&gt;
&lt;p&gt;特别感谢那些一起奋斗的同事们。你们的专业精神、创新思维，都让我受益匪浅。每一次讨论、每一次合作，都是宝贵的财富。&lt;/p&gt;
&lt;h2&gt;新的开始&lt;/h2&gt;
&lt;p&gt;离开不是结束，而是新的开始。我会带着在共绩科技学到的经验，继续在技术领域深耕。也许会有新的项目，也许会有新的挑战，但不变的是对技术的热爱和对创新的追求。&lt;/p&gt;
&lt;h2&gt;未来规划&lt;/h2&gt;
&lt;p&gt;接下来，我会专注于几个方向：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;技术研究&lt;/strong&gt;：继续在云计算、AI 等领域探索&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开源贡献&lt;/strong&gt;：参与更多开源项目，回馈社区&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;知识分享&lt;/strong&gt;：通过博客、技术文章分享经验&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新项目&lt;/strong&gt;：寻找新的机会和挑战&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;写在最后&lt;/h2&gt;
&lt;p&gt;人生就像一场旅行，每个阶段都有不同的风景。共绩科技是我人生旅途中的重要一站，我会永远珍惜这段经历。&lt;/p&gt;
&lt;p&gt;感谢所有支持我的人，感谢这个平台给我的一切。新的旅程即将开始，我充满期待。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;愿我们都能在各自的道路上发光发热，创造属于自己的精彩。&lt;/em&gt;
贫困，不在于一个人享受的物质水平不高，而在于他的生活面临着很大的压力和不确定性。贫困最可怕的，不是物质的贫乏，而是对人的思想的影响，陷入贫困的思维模式，才是真正的贫困。什么叫压力遗传？压力遗传就是这个人天生就容易对生活中的困难反应过度。他无法考虑什么长远打算，特别容易把注意力集中在短期的事情上。如果你认为一个人受贫困是因为他努力程度不够，你就犯了美国普通人常犯的错误，你就是被「美国梦」这种神话给洗脑了。&lt;/p&gt;
&lt;p&gt;低收入者重视集体，高收入者强调个人。低收入者更愿意依赖集体的力量，更愿意相信依靠；高收入者更愿意靠自己解决问题。基于这种理解，「人脉」这个概念，在现代社会根本就是一个伪命题。「人脉」其实是弱者弄出来的概念。人们幻想高水平的人也是靠今天我帮你一个忙，明天你帮我一个忙这种「人情账」的逻辑办事。想明白这些就会同意，高收入者的独立精神，可能就是更健康的人际关系的基石。要么是真诚的友谊，要么是公平的合作。实在不行干脆就是交易，搞什么「人脉」呢。&lt;/p&gt;
&lt;h3&gt;第四章 霍金的答案&lt;/h3&gt;
&lt;p&gt;90% 的医学研究都是错的。营养学研究结论基本不可信。斯坦福大学预防医学研究中心主任埃尼迪斯在 2005 年发表论文证明这个结论。医学研究中效应微弱，科学家偏见严重。当效应为 10%，偏见达到 30% 时，正确结论概率仅有 20%。研究 1990-2003 年顶级期刊被引用超过 1000 次的 49 篇论文，其中 45 篇声称发现有效药物或疗法，后续验证发现大部分结论无法重复。科学家为发表论文或获得医药公司资助，会无意识寻找支持性证据。&lt;/p&gt;
&lt;p&gt;数量级观念指 10 的多少次方。几倍差异可以忽略，数量级差异才值得考虑。1000 相当于中学生人数，1 万是体育场观众数，10 万是一本书字数，100 万需要数 11 天半，10 亿相当于中国人口。风险判断需要准确理解概率。《经济学人》数据显示美国死亡概率：心脏病 1/467，意外事故 1/1656，自杀 1/8000，噎死 1/100000，被蜜蜂蜇死 1/25000000。血栓基础概率 1/7000，某药增加风险一倍变成 2/7000，但仍是极小概率。家庭托儿所死亡概率是正规托儿所 7 倍，但全美每年死于家庭托儿所的孩子只有十几个，同龄死于交通事故的是 79 个。美国社保基金每年损失 3100 万美元，看似巨大，实际仅占总发放额的 0.004%，系统准确度达 99.996%。数量级思维要求把资源放在最重要的事情上。0.01% 和 0.0001% 差别巨大，但给心理的冲击相同。&lt;/p&gt;
&lt;p&gt;现代医学用安慰剂测试药物真实效果。双盲实验中，安慰剂组病情也会缓解。关节镜膝盖手术美国每年 70 万例，研究发现假手术效果与真手术相同。2014 年综合研究涉及 53 项手术实验，一半手术的假手术与真手术疗效相同，74% 的假手术显示一定效果。手术安慰剂效应比药物更强。品酒专家在不知价格情况下，无法区分 200 美元和 20 美元红酒。使用随机实验判断疗法真正疗效，是现代医学与传统医学的重要区别。想在复杂世界获得确定因果关系非常困难，善用科学方法是防忽悠的最佳办法。&lt;/p&gt;
&lt;h2&gt;别让直觉欺骗你&lt;/h2&gt;
&lt;p&gt;斯坦福大学一份研究报告指出，90% 的医学研究结论是错的。顶级期刊被引用超 1000 次的 49 篇论文，大部分结论都无法复现。&lt;/p&gt;
&lt;p&gt;医学研究尚且如此，我们每天凭直觉做的决策，又有多可靠呢？《万万没想到》这本书，探讨了直觉如何误导我们，以及怎样用科学方法做更好的决策。&lt;/p&gt;
&lt;h3&gt;我们的思维有几个常见缺陷&lt;/h3&gt;
&lt;p&gt;第一个是“小数定律”。我们习惯从极小的样本得出结论。比如，一个新功能上线，数据好两天，就断定它成功了。一个新同事犯了一次错，就被贴上“不靠谱”的标签。这些判断，都是把偶然当成了必然。这是一种思维捷径，但常常导向错误。&lt;/p&gt;
&lt;p&gt;第二个是“赌徒谬误”。我们总觉得一个号码很久没中奖，下次中奖概率就更高。事实是，每次开奖都是独立事件，历史无法预测未来。&lt;/p&gt;
&lt;p&gt;我们对概率的理解也常有偏见。新闻里说，某药物让患病风险“增加一倍”，听起来很吓人。可如果基础患病率只有 1/7000，翻倍后也只是  2/7000。&lt;/p&gt;
&lt;h3&gt;对抗直觉的“刻意练习”&lt;/h3&gt;
&lt;p&gt;直觉不可靠，刻意练习才可靠。并且强调“即时反馈”。&lt;/p&gt;
&lt;p&gt;把一本书看很多遍不等于理解。检验理解的唯一方法是去“测试”：能不能用自己的话把概念讲给别人听？或者用学到的知识解决一个实际问题。&lt;/p&gt;
&lt;p&gt;工作中的任务就是很好的练习。A/B 测试、项目复盘，都是获取反馈的机会。每次犯错和讨论，都能优化我们的思维模型。&lt;/p&gt;
&lt;h3&gt;建立理性的决策框架&lt;/h3&gt;
&lt;p&gt;为了让决策更加理性，还需要建立“数量级”的观念。&lt;/p&gt;
&lt;p&gt;我们对数字的反应常常是情绪化的。亏损 3000 万美元，听起来像一场灾难。但如果这是美国社保基金，那它只占了 0.004%。我们容易被有趣或声音大的问题吸引，而忽略了那些真正重要的问题。&lt;/p&gt;
&lt;p&gt;理性的决策还需要判断“有效性”。我们容易把相关性当成因果性，以为自己的某个举措带来了好结果，但可能只是巧合。&lt;/p&gt;
&lt;p&gt;“安慰剂效应”就是一个例子。研究发现，对某些膝关节镜手术，“假手术”和真手术的效果几乎没差别。很多品酒专家在盲品时，也分不清 200 美元和 20 美元的红酒。&lt;/p&gt;
&lt;p&gt;因此，判断一件事是否有效，必须依靠有对照的科学方法，比如 A/B 测试，而不是靠个案或感觉。&lt;/p&gt;
&lt;h3&gt;从“知道”到“做到”&lt;/h3&gt;
&lt;p&gt;核心信息很简单：大脑为了高效运转，有很多思维捷径。但在处理复杂问题时，这些捷径会失灵。要做出更高质量的决策，我们必须更“刻意”地思考。&lt;/p&gt;
&lt;p&gt;第一，承认我们思维的缺陷，比如从小样本过度推论。
第二，把日常工作看作“刻意练习”，主动寻求高质量的反馈。
第三，建立“数量级”观念和决策框架，把精力聚焦于真正重要的问题。&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Suanleme</title><link>https://nexmoe.com/products/suanleme</link><guid isPermaLink="true">https://nexmoe.com/products/suanleme</guid><description>Idle GPU compute monetization platform--make every drop of compute count.
Share unused GPU resources, support research projects, earn steady income, and help advance AI.</description><pubDate>Thu, 22 Aug 2024 07:12:03 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20240919_screenshot-1726733266158.CqN2Tlau.png&quot; alt=&quot;Suanleme&quot; /&gt;&lt;/p&gt;&lt;p&gt;Idle GPU compute monetization platform--make every drop of compute count.
Share unused GPU resources, support research projects, earn steady income, and help advance AI.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://suanleme.cn/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://suanleme.cn/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/suanleme&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;p&gt;import FeatureSection from &apos;@/components/products/FeatureSection.astro&apos;
import RolesSection from &apos;@/components/products/RolesSection.astro&apos;
import PainPointsAndComplaintsSection from &apos;@/components/products/PainPointsAndComplaintsSection.astro&apos;
import StatsSection from &apos;@/components/products/StatsSection.astro&apos;
import TargetUsersSection from &apos;@/components/products/TargetUsersSection.astro&apos;
import CompetitiveAuditSection from &apos;@/components/products/CompetitiveAuditSection.astro&apos;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;space-y-36 py-24&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;RolesSection
title=&quot;Project Roles &amp;amp; Tools&quot;
tags={[&apos;0 to 100&apos;, &apos;Product Design&apos;, &apos;User Growth&apos;, &apos;Ops Strategy&apos;, &apos;Data Analysis&apos;]}
roles={[
{
title: &apos;Product Design&apos;,
description:
&apos;Designed a user-friendly client so contributors can easily manage compute sharing and view earnings, lowering the barrier to entry&apos;,
icon: &apos;mdi:palette&apos;
},
{
title: &apos;User Growth&apos;,
description:
&apos;Built a contributor ecosystem through community ops and incentive programs to scale the platform&apos;,
icon: &apos;mdi:account-group&apos;
},
{
title: &apos;Operations Strategy&apos;,
description: &apos;Defined revenue-sharing models and service systems to balance contributor and research needs&apos;,
icon: &apos;mdi:chart-line&apos;
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;PainPointsAndComplaintsSection
title=&quot;User Pain Points &amp;amp; Real Complaints&quot;
subtitle=&quot;Idle GPUs are wasted while research lacks compute--uneven distribution has become a bottleneck for AI&quot;
painPoints={[
{
text: &apos;High-end GPUs sit idle most of the time, yet electricity and depreciation still cost money&apos;
},
{
text: &apos;Research institutes need huge compute, but procurement is expensive and slows projects&apos;
},
{
text: &quot;Individuals can&apos;t effectively use idle compute and lack monetization channels&quot;
},
{
text: &quot;Compute is concentrated in a few institutions; small research teams can&apos;t get enough&quot;
},
{
text: &quot;Traditional compute rentals are pricey--indie devs and small teams can&apos;t afford them&quot;
},
{
text: &apos;Little incentive for contributing compute, leading to low participation&apos;
}
]}
complaints={[
{
id: &apos;1&apos;,
content: &apos;My GPU just collects dust and racks up electricity--need a way to break even&apos;,
user: &apos;GPU enthusiast&apos;
},
{
id: &apos;2&apos;,
content: &quot;Lab compute is insufficient, can&apos;t buy servers, project is way behind&quot;,
user: &apos;Researcher&apos;
},
{
id: &apos;3&apos;,
content: &quot;Bought a 4090 for gaming; it&apos;s idle most of the time--so wasteful&quot;,
user: &apos;Gamer&apos;
},
{
id: &apos;4&apos;,
content: &apos;Want to join AI research but compute costs are too high&apos;,
user: &apos;AI hobbyist&apos;
},
{
id: &apos;5&apos;,
content: &apos;Company has several idle PCs but no idea how to use them&apos;,
user: &apos;Enterprise IT&apos;
},
{
id: &apos;6&apos;,
content: &quot;Compute rental is too expensive; personal projects can&apos;t afford it&quot;,
user: &apos;Indie developer&apos;
},
{
id: &apos;7&apos;,
content: &quot;GPU upgrades move too fast; old cards won&apos;t sell for a good price&quot;,
user: &apos;Hardware enthusiast&apos;
},
{
id: &apos;8&apos;,
content: &quot;I want to support research but don&apos;t know how&quot;,
user: &apos;Helpful netizen&apos;
},
{
id: &apos;9&apos;,
content: &apos;Compute distribution is so uneven--big orgs hoard most resources&apos;,
user: &apos;Small team lead&apos;
},
{
id: &apos;10&apos;,
content: &apos;Electricity keeps getting pricier; idle GPU costs are too high&apos;,
user: &apos;Home user&apos;
},
{
id: &apos;11&apos;,
content: &apos;Want to join distributed computing, but current platforms pay too little&apos;,
user: &apos;Compute contributor&apos;
},
{
id: &apos;12&apos;,
content: &apos;Research project urgently needs compute but budget is limited--progress stuck&apos;,
user: &apos;Project owner&apos;
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;TargetUsersSection
title=&quot;Who It&apos;s For&quot;
subtitle=&quot;Bridge compute supply and demand so idle resources create value and research gets the support it needs&quot;
userTypes={[
{
title: &apos;Individual Users&apos;,
subtitle: &apos;People with idle GPUs who want extra income&apos;,
icon: &apos;mdi:account&apos;,
tags: [&apos;Monetize Idle&apos;, &apos;Zero Barrier&apos;],
features: [
&apos;Pure software client--no extra hardware investment&apos;,
&apos;Auto start/pause without affecting daily use&apos;,
&apos;Real-time earnings with transparent billing&apos;,
&apos;Support multiple devices to maximize income&apos;
]
},
{
title: &apos;Gamers&apos;,
subtitle: &apos;High-end GPU owners earning when not gaming&apos;,
icon: &apos;mdi:gamepad-variant&apos;,
tags: [&apos;Game Friendly&apos;, &apos;Smart Scheduling&apos;],
features: [
&apos;Automatically pauses when gaming to avoid impact&apos;,
&apos;Supports RTX 3070 and above with abundant tasks&apos;,
&apos;Runs in the background with no manual management&apos;,
&apos;Stable earnings that cover electricity costs&apos;
]
},
{
title: &apos;Research Institutions&apos;,
subtitle: &apos;Academic teams needing large amounts of compute&apos;,
icon: &apos;mdi:flask&apos;,
tags: [&apos;Research Support&apos;, &apos;Cost Control&apos;],
features: [
&apos;Access distributed compute to lower research costs&apos;,
&apos;Abundant resources for large-scale computation&apos;,
&apos;Supports diverse scientific workloads&apos;,
&apos;Helps convert research outcomes and foster collaboration&apos;
]
},
{
title: &apos;AI Developers&apos;,
subtitle: &apos;Individuals needing compute for model training and development&apos;,
icon: &apos;mdi:code-tags&apos;,
tags: [&apos;Dev Support&apos;, &apos;Cost Optimization&apos;],
features: [
&apos;Obtain compute support to lower dev costs&apos;,
&apos;Supports mainstream AI frameworks and training workloads&apos;,
&apos;Elastic allocation on demand&apos;,
&apos;Promotes broader adoption of AI tech&apos;
]
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;FeatureSection
title=&quot;Core Features&quot;
subtitle=&quot;Turn idle compute into value and give research the support it needs--building a decentralized compute ecosystem&quot;
features={[
{
title: &apos;Smart Scheduling&apos;,
description:
&apos;Automatically detects GPU state, intelligently assigns tasks, pauses during gaming, and maximizes utilization&apos;,
icon: &apos;mdi:brain&apos;
},
{
title: &apos;Real-Time Earnings&apos;,
description: &apos;Transparent payout model with real-time contribution and income view; supports multiple withdrawal methods&apos;,
icon: &apos;mdi:cash-multiple&apos;
},
{
title: &apos;Research Support&apos;,
description: &apos;Provides compute for research projects, advancing academic work and AI development&apos;,
icon: &apos;mdi:flask&apos;
},
{
title: &apos;Zero Barrier&apos;,
description: &apos;Pure software client, one-click install, no technical background needed; manage multiple devices easily&apos;,
icon: &apos;mdi:rocket-launch&apos;
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;StatsSection
title=&quot;Tens of thousands already joined the compute network&quot;
subtitle=&quot;Build a decentralized compute ecosystem where every drop of compute has value&quot;
stats={[
{
icon: &apos;mdi:account-group&apos;,
value: &apos;Tens of thousands+&apos;,
label: &apos;Compute contributors&apos;
},
{
icon: &apos;mdi:server&apos;,
value: &apos;8+&apos;,
label: &apos;Supporting Tsinghua alumni&apos;
},
{
icon: &apos;mdi:flask&apos;,
value: &apos;Thousands+&apos;,
label: &apos;Research projects supported&apos;
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;CompetitiveAuditSection
title=&quot;Competitive Analysis&quot;
subtitle=&quot;Compare mainstream distributed computing platforms and highlight Suanleme&apos;s differentiators&quot;
competitors={[
{
name: &quot;Folding@home&quot;,
logo: &quot;https://foldingathome.org/wp-content/uploads/2020/03/cropped-fah-logo-1.png&quot;,
logoAlt: &quot;Folding@home Logo&quot;,
features: [
{ label: &quot;Focused on protein-folding research&quot; },
{ label: &quot;Purely charitable with no payouts&quot; },
{ label: &quot;Supports many device types&quot; },
{ label: &quot;Global distributed network&quot; }
],
valueProposition: &quot;Provides compute for medical research--especially protein folding and disease studies. Participation is purely for public good with no financial return.&quot;
},
{
name: &quot;BOINC&quot;,
logo: &quot;https://boinc.berkeley.edu/images/boinc_logo.png&quot;,
logoAlt: &quot;BOINC Logo&quot;,
features: [
{ label: &quot;Multi-project platform&quot; },
{ label: &quot;Open-source distributed computing&quot; },
{ label: &quot;Research-focused projects&quot; },
{ label: &quot;Cross-platform support&quot; }
],
valueProposition: &quot;Offers a unified distributed computing platform for multiple research projects; users can pick which studies to support, but it likewise provides no economic incentive.&quot;
},
{
name: &quot;NiceHash&quot;,
logo: &quot;https://www.nicehash.com/favicon.ico&quot;,
logoAlt: &quot;NiceHash Logo&quot;,
features: [
{ label: &quot;Cryptocurrency mining&quot; },
{ label: &quot;Real-time earnings&quot; },
{ label: &quot;Automatic algorithm switching&quot; },
{ label: &quot;Pro mining tools&quot; }
],
valueProposition: &quot;Focused on crypto mining with hashpower rental; earnings depend on coin prices and require higher technical proficiency.&quot;
},
{
name: &quot;Render Network&quot;,
logo: &quot;https://render.com/favicon.ico&quot;,
logoAlt: &quot;Render Network Logo&quot;,
features: [
{ label: &quot;Decentralized rendering&quot; },
{ label: &quot;3D rendering tasks&quot; },
{ label: &quot;Creator earnings&quot; },
{ label: &quot;Blockchain-based&quot; }
],
valueProposition: &quot;Specializes in 3D rendering for creators, rewarding contributors with RNDR tokens--primarily serving the creative industry.&quot;
}
]}
/&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20240919_screenshot-1726733266158.CqN2Tlau.png" length="1183633" type="image/png"/></item><item><title>Gongji Compute</title><link>https://nexmoe.com/products/gongji</link><guid isPermaLink="true">https://nexmoe.com/products/gongji</guid><description>Cloud AI development workstations with full dev environments ready to code anywhere.
Production-grade elastic compute platform with smart autoscaling and great value -- your compute partner.</description><pubDate>Mon, 15 Jul 2024 06:34:18 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20250909_scrnli_SonT1y03FbFh5w.D-cVcSFz.png&quot; alt=&quot;Gongji Compute&quot; /&gt;&lt;/p&gt;&lt;p&gt;Cloud AI development workstations with full dev environments ready to code anywhere.
Production-grade elastic compute platform with smart autoscaling and great value -- your compute partner.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.gongjiyun.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://www.gongjiyun.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/gongji&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;p&gt;import FeatureSection from &apos;@/components/products/FeatureSection.astro&apos;
import RolesSection from &apos;@/components/products/RolesSection.astro&apos;
import PainPointsAndComplaintsSection from &apos;@/components/products/PainPointsAndComplaintsSection.astro&apos;
import StatsSection from &apos;@/components/products/StatsSection.astro&apos;
import TargetUsersSection from &apos;@/components/products/TargetUsersSection.astro&apos;
import CompetitiveAuditSection from &apos;@/components/products/CompetitiveAuditSection.astro&apos;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;space-y-36 py-24&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;RolesSection
title=&quot;Project Roles &amp;amp; Tools&quot;
tags={[&apos;0 to 100&apos;, &apos;Product Design&apos;, &apos;Data Tracking &amp;amp; Analytics&apos;, &apos;Product Strategy&apos;, &apos;Growth Hacking&apos;, &apos;Engineering&apos;]}
roles={[
{
title: &apos;Product Design&apos;,
description:
&apos;Build hi-fi interactive prototypes for AI products with Figma, V0.dev, and Cursor; design interfaces in Figma with the Linear visual language to validate solutions and collaborate efficiently with engineering&apos;,
icon: &apos;mdi:palette&apos;
},
{
title: &apos;Growth Hacking&apos;,
description:
&apos;Use Rybbit and Metabase to track user behavior and analyze business data, providing evidence for product decisions. Run data-driven experiments and optimizations to quickly validate hypotheses and boost acquisition and retention&apos;,
icon: &apos;mdi:chart-line&apos;
},
{
title: &apos;Product Strategy&apos;,
description: &apos;Formulate iteration strategy based on tracking and analysis results to improve user experience and business metrics&apos;,
icon: &apos;mdi:strategy&apos;
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;PainPointsAndComplaintsSection
title=&quot;User Pain Points &amp;amp; Real Complaints&quot;
subtitle=&quot;In-depth research shows compute costs and technical hurdles are becoming the biggest blockers to innovation&quot;
painPoints={[
{
text: &apos;GPU hardware often costs tens of thousands, keeping indie developers and small teams out&apos;
},
{
text: &apos;CUDA, drivers, and deep learning framework versions conflict, taking days to configure&apos;
},
{
text: &apos;Cooling, hardware failures, and crashes turn engineers into ops people&apos;
},
{
text: &apos;Expensive GPUs sit idle most of the time while fixed costs remain&apos;
},
{
text: &apos;When a project suddenly needs more compute, long procurement cycles miss the best window&apos;
},
{
text: &apos;Requires deep knowledge of hardware architecture and operations; the tech stack is too heavy&apos;
}
]}
complaints={[
{
id: &apos;1&apos;,
content: &apos;Compute costs are killing me--I burned through half a year of budget&apos;,
user: &apos;好帅的一个齐未块&apos;
},
{
id: &apos;2&apos;,
content: &apos;Finally had to rent servers; felt so bad I ate a whole bucket of ice cream&apos;,
user: &apos;好帅的一个齐未块&apos;
},
{
id: &apos;3&apos;,
content: &quot;Why is A&lt;em&gt;&lt;strong&gt;l so laggy? Spent all night setting up; can&apos;t even download models, help&quot;,
user: &apos;敌电子木鱼拜赛博神仙&apos;
},
{
id: &apos;4&apos;,
content:
&apos;Wanted to buy a desktop with an RTX 4060 Ti 16G but hesitated--do I really need it? I just need compute for large models&apos;,
user: &apos;Tony_Ity&apos;
},
{
id: &apos;5&apos;,
content: &quot;Didn&apos;t expect A&lt;/strong&gt;&lt;/em&gt;l to mess me up--it was Docker isolation all along&quot;,
user: &apos;南柯凌云&apos;
},
{
id: &apos;6&apos;,
content: &apos;Old environment ran fine; new one errors out. Works on C&lt;em&gt;&lt;strong&gt;b, A&lt;/strong&gt;&lt;/em&gt;l shows out-of-memory&apos;,
user: &apos;2K_丙千&apos;
},
{
id: &apos;7&apos;,
content: &apos;A&lt;em&gt;&lt;strong&gt;l are you kidding me? Maintenance forever and still not back&apos;,
user: &apos;汪视着再一次&apos;
},
{
id: &apos;8&apos;,
content: &apos;Dear certain compute cloud alchemists, your balance is under 10 yuan--please top up to stay online&apos;,
user: &apos;Angela整子&apos;
},
{
id: &apos;9&apos;,
content: &apos;Every afternoon the network on some platform is slower than a snail, even on 4090 resources&apos;,
user: &apos;膜拜拿快颗雨&apos;
},
{
id: &apos;10&apos;,
content: &quot;Why is this awful A&lt;/strong&gt;&lt;/em&gt;l so laggy? Spent all night setting up; models won&apos;t download, save me&quot;,
user: &apos;敌电子木鱼拜赛博神仙&apos;
},
{
id: &apos;11&apos;,
content: &apos;SSH file transfer is 500 KB/s on that platform--driving me crazy&apos;,
user: &apos;Iby2223&apos;
},
{
id: &apos;12&apos;,
content: &apos;Environment setup is too complex. CUDA version conflicts took me days and still not solved&apos;,
user: &apos;开发小白&apos;
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;TargetUsersSection
title=&quot;Who It&apos;s For&quot;
subtitle=&quot;Every industry has AI dreams--why let compute costs stop you? We deliver tailored compute solutions for each user group&quot;
userTypes={[
{
title: &apos;Developers &amp;amp; Startup Teams&apos;,
subtitle: &apos;Teams seeking efficient development without heavy hardware spend&apos;,
icon: &apos;mdi:code-tags&apos;,
tags: [&apos;Cost Control&apos;, &apos;Fast Iteration&apos;],
features: [
&apos;AI dev environment ready in 3 minutes, no painful setup&apos;,
&apos;30+ preinstalled tools; JupyterLab and VS Code work out of the box&apos;,
&apos;Starts at ¥1.68/hour, saving up to 90% vs. owning GPUs&apos;,
&apos;Deploy in 10 seconds--ship right after coding&apos;
]
},
{
title: &apos;AIGC Creators&apos;,
subtitle: &apos;Content creators focused on creativity without hardware limits&apos;,
icon: &apos;mdi:palette&apos;,
tags: [&apos;Unlimited Creativity&apos;, &apos;Pro Quality&apos;],
features: [
&apos;Cover text-to-image, video generation, AI 3D modeling and more&apos;,
&apos;Tightly integrated Stable Diffusion, Flux, and ComfyUI&apos;,
&apos;RTX 4090 clusters ensure commercial-grade outputs&apos;,
&apos;Pay by the second--pay when creating, zero cost when idle&apos;
]
},
{
title: &apos;Education Institutions&apos;,
subtitle: &apos;Teachers who need standardized environments for AI courses&apos;,
icon: &apos;mdi:school&apos;,
tags: [&apos;Standardized&apos;, &apos;Bulk Management&apos;],
features: [
&apos;Teachers build images and distribute to the whole class in one click&apos;,
&apos;Revoke sharing at term end to protect IP&apos;,
&apos;No need to provision costly hardware per student&apos;,
&apos;Unified AI teaching environment to avoid configuration discrepancies&apos;
]
},
{
title: &apos;Enterprise Customers&apos;,
subtitle: &apos;Business users needing production-grade compute with stability and reliability&apos;,
icon: &apos;mdi:office-building&apos;,
tags: [&apos;Production Grade&apos;, &apos;Elastic Scaling&apos;],
features: [
&apos;99.9% service availability with 24x7 expert support&apos;,
&apos;Smart autoscaling handles traffic swings and saves 50% costs&apos;,
&apos;Full OpenAPI to integrate into business systems&apos;,
&apos;No infra management--focus on business innovation&apos;
]
},
{
title: &apos;Research Teams&apos;,
subtitle: &apos;Labs running large-scale computation and model training&apos;,
icon: &apos;mdi:flask&apos;,
tags: [&apos;Large-Scale Compute&apos;, &apos;Research Grade&apos;],
features: [
&apos;Thousands of 4090s on standby for massive parallel jobs&apos;,
&apos;Supports mainstream deep learning frameworks like PyTorch and TensorFlow&apos;,
&apos;Long-running job support for training and data processing&apos;,
&apos;SSH access and full Linux environment for complex research needs&apos;
]
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;FeatureSection
title=&quot;Product Matrix&quot;
subtitle=&quot;Say goodbye to costly GPUs and focus on code. Choose the compute solution that fits you best and bring development back to the essentials.&quot;
features={[
{
title: &apos;Cloud Server&apos;,
description:
&apos;One-stop GPU dev environment with preinstalled DL frameworks; supports Jupyter and VS Code, starting at ¥1.68/hour&apos;,
icon: &apos;mdi:server&apos;
},
{
title: &apos;Elastic Serverless&apos;,
description: &quot;China&apos;s first GPU Serverless--autoscaling for traffic swings; deploy APIs in 10 seconds&quot;,
icon: &apos;mdi:lightning-bolt&apos;
},
{
title: &apos;Per-Second Billing&apos;,
description: &apos;Transparent per-second pricing--pay only for real value, free from local hardware limits&apos;,
icon: &apos;mdi:clock-outline&apos;
},
{
title: &apos;Thousands of 4090s In Stock&apos;,
description: &apos;RTX 4090 clusters ready on demand--production-grade without infra overhead&apos;,
icon: &apos;mdi:check-circle&apos;
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;StatsSection
title=&quot;1,000+ companies have left compute anxiety behind&quot;
subtitle=&quot;Don&apos;t let compute shackle creativity--100k+ developers are free from hardware stress&quot;
stats={[
{
icon: &apos;mdi:account-group&apos;,
value: &apos;100k+&apos;,
label: &apos;Active developers&apos;
},
{
icon: &apos;mdi:office-building&apos;,
value: &apos;1000+&apos;,
label: &apos;Enterprise customers&apos;
},
{
icon: &apos;mdi:check-circle&apos;,
value: &apos;99.9%&apos;,
label: &apos;Service availability&apos;
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;CompetitiveAuditSection
title=&quot;Competitive Analysis&quot;
subtitle=&quot;Deep dive into key competitors&apos; features and positioning to inform product strategy&quot;
competitors={[
{
name: &quot;AWS SageMaker&quot;,
logo: &quot;https://upload.wikimedia.org/wikipedia/commons/9/93/Amazon_Web_Services_Logo.svg&quot;,
logoAlt: &quot;AWS SageMaker Logo&quot;,
features: [
{ label: &quot;Fully managed machine learning service&quot; },
{ label: &quot;Built-in algorithms and framework support&quot; },
{ label: &quot;Automatic model tuning&quot; },
{ label: &quot;One-click deployment and scaling&quot; }
],
valueProposition: &quot;Provides data scientists and developers a fully managed ML platform that simplifies the workflow from data prep to deployment, letting users focus on algorithm innovation instead of infrastructure.&quot;
},
{
name: &quot;Google Cloud AI Platform&quot;,
logo: &quot;https://upload.wikimedia.org/wikipedia/commons/5/51/Google_Cloud_logo.svg&quot;,
logoAlt: &quot;Google Cloud AI Platform Logo&quot;,
features: [
{ label: &quot;TPU accelerators&quot; },
{ label: &quot;AutoML automation&quot; },
{ label: &quot;Pretrained model APIs&quot; },
{ label: &quot;Vertex AI unified platform&quot; }
],
valueProposition: &quot;Leverages Google&apos;s AI strengths to offer end-to-end solutions from data processing to model training and deployment, with leading capabilities in NLP and computer vision.&quot;
},
{
name: &quot;Alibaba Cloud PAI&quot;,
logo: &quot;https://img.alicdn.com/tfs/TB1Ly5oS3HqK1RjSZFPXXcwapXa-238-54.png&quot;,
logoAlt: &quot;Alibaba Cloud PAI Logo&quot;,
features: [
{ label: &quot;Visual modeling tools&quot; },
{ label: &quot;Distributed training&quot; },
{ label: &quot;Online model services&quot; },
{ label: &quot;Algorithm marketplace&quot; }
],
valueProposition: &quot;Built on Alibaba&apos;s scenarios and tech stack, offering localized ML platform services for Chinese enterprises across data processing, model development, and deployment.&quot;
},
{
name: &quot;Baidu AI Cloud EasyDL&quot;,
logo: &quot;https://bce.bdstatic.com/doc/BaiduCloud/logo.png&quot;,
logoAlt: &quot;Baidu AI Cloud EasyDL Logo&quot;,
features: [
{ label: &quot;No-code AI development&quot; },
{ label: &quot;Few-shot learning&quot; },
{ label: &quot;Edge deployment&quot; },
{ label: &quot;Industry solutions&quot; }
],
valueProposition: &quot;Lowers the AI barrier so users without deep learning backgrounds can build and deploy models quickly--ideal for SMEs and traditional industries going digital.&quot;
}
]}
/&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20250909_scrnli_SonT1y03FbFh5w.D-cVcSFz.png" length="370639" type="image/png"/></item><item><title>How to Monitor Remote Resources in VSCode Remote</title><link>https://nexmoe.com/19V9ZMM</link><guid isPermaLink="true">https://nexmoe.com/19V9ZMM</guid><pubDate>Sun, 14 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/f4994d4cc1b09a7c8429191762d6c085.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Quick start&lt;/h2&gt;
&lt;p&gt;When using VSCode, you can connect to a remote server with the Remote-SSH extension, then monitor server resources with the Monitor Pro extension.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Install and configure Remote-SSH&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Open VSCode and click the Extensions icon in the left sidebar.&lt;/li&gt;
&lt;li&gt;Search for and install the “Remote-SSH” extension.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Connect to a remote server&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;After installation, use commands in VSCode’s terminal to connect to the remote server. For example, &lt;code&gt;ssh username@remote-server-address&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Use Monitor Pro to monitor resources&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install the Monitor Pro extension. It helps you track key system metrics in real time and presents them visually.&lt;/li&gt;
&lt;li&gt;After installation, it starts automatically, and you can see CPU, memory, disk, and other usage in the VSCode status bar.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Refresh settings&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Monitor Pro lets you set the refresh interval for resource metrics, ensuring timely updates.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;How to install and configure Monitor Pro&lt;/h2&gt;
&lt;h3&gt;Install Monitor Pro&lt;/h3&gt;
&lt;p&gt;In VSCode, click “Extensions” (or press &lt;code&gt;Ctrl + Shift + X&lt;/code&gt;) and search for “Monitor Pro”.&lt;/p&gt;
&lt;p&gt;Click “Install” to finish.&lt;/p&gt;
&lt;h3&gt;Configure Monitor Pro&lt;/h3&gt;
&lt;p&gt;After installation, you’ll see a new icon in the Activity Bar. Click it to open Monitor Pro.&lt;/p&gt;
&lt;p&gt;Configure the metrics you want to monitor in its settings page.&lt;/p&gt;
&lt;h2&gt;Supported remote monitoring metrics (partial)&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;CPU usage&lt;/strong&gt;: Monitor CPU utilization.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory usage&lt;/strong&gt;: Track system memory usage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network usage&lt;/strong&gt;: Monitor network activity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;File system usage&lt;/strong&gt;: Track file system usage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Battery percentage and charging status&lt;/strong&gt;: Monitor battery status.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Best practices&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Track key metrics in real time&lt;/strong&gt;: Monitor Pro is a comprehensive resource monitoring tool. Check these metrics regularly to ensure system stability and performance.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Intuitive visualization&lt;/strong&gt;: Monitor Pro offers a clear visual presentation, helping you quickly identify bottlenecks and issues.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Memory optimization&lt;/strong&gt;: Although Monitor Pro focuses on resource monitoring, combining it with tools like Memory Monitor and Allocation Tracker can further optimize memory usage. For example, inspect app memory usage and watch GC frequency to detect warning signs like memory thrashing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom configuration&lt;/strong&gt;: Customize Monitor Pro to your needs—focus on specific resources to manage and optimize more effectively.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This message is used to verify that this feed (feedId:42331815237783574) belongs to me (userId:55156152962822144). Join me in enjoying the next generation information browser https://follow.is.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Gongji Compute Landing Site</title><link>https://nexmoe.com/products/gongji-landing</link><guid isPermaLink="true">https://nexmoe.com/products/gongji-landing</guid><description>Go live instantly and handle high concurrency with ease.
Fast deployment, fair prices -- compute power beyond expectations.</description><pubDate>Sat, 15 Jun 2024 06:34:18 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20250909_%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE_9-9-2025_105421_www.gongjiyun.com.DMsXmlUD.jpeg&quot; alt=&quot;Gongji Compute Landing Site&quot; /&gt;&lt;/p&gt;&lt;p&gt;Go live instantly and handle high concurrency with ease.
Fast deployment, fair prices -- compute power beyond expectations.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://www.gongjiyun.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://www.gongjiyun.com/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/gongji-landing&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20250909_%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE_9-9-2025_105421_www.gongjiyun.com.DMsXmlUD.jpeg" length="1258621" type="image/jpeg"/></item><item><title>A New Tab Page to Help You Take Back Control of Your Bookmarks</title><link>https://nexmoe.com/13PSKPW</link><guid isPermaLink="true">https://nexmoe.com/13PSKPW</guid><pubDate>Tue, 05 Mar 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the digital age, our browser bookmarks are like a treasure chest filled with links we saved for interest, work, or study. Xiaoshu, a browser new-tab extension, helps you efficiently manage these valuable online resources. With a clean, intuitive UI and powerful features, it revitalizes your bookmark collection.&lt;/p&gt;
&lt;h2&gt;One-click bookmark management&lt;/h2&gt;
&lt;p&gt;No more constant sorting and searching your homepage. Xiaoshu offers an easy way to display and manage your bookmarks. By presenting bookmarks visually in a new tab, it helps you focus on what truly matters. Whether you use Microsoft Edge, Google Chrome, or Mozilla Firefox, you can manage your web assets in a clean, intuitive way.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/628f695f10a222367075b6cb97a8870f.png/nexmoe&quot; alt=&quot;一键展示管理收藏夹&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Sync space anytime, anywhere&lt;/h2&gt;
&lt;p&gt;Xiaoshu’s sync space makes it easy to sync bookmarks across devices. Whether you’re on a work computer or a device at home, you can access your entire collection. Your content is stored and synced securely, so you can access it anytime. Everything in your online world is unified under one space—from opening Bilibili to directly reaching specific content you follow.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/cc15688dc52a551044b83a8a50117ccf.png/nexmoe&quot; alt=&quot;同步空间&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/df8a4bea0d13e188a740293d12d39730.png/nexmoe&quot; alt=&quot;网页端&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Intuitive and comfortable re-organization&lt;/h2&gt;
&lt;p&gt;With a smooth and intuitive experience, Xiaoshu helps you reorganize your online life. We focus on comfortable interaction design, letting you organize bookmarks in a way that makes sense to you.&lt;/p&gt;
&lt;p&gt;Xiaoshu provides various card styles and layouts so you can fully customize to your preference. You can create personalized card combinations to meet your unique needs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/222bc26cce538c35426bae5c05b4dc77.png/nexmoe&quot; alt=&quot;重组织&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Strict privacy protection&lt;/h2&gt;
&lt;p&gt;Xiaoshu values user privacy and refuses to record or upload user data. Without using the sync space, your bookmarks remain only in local browser data, ensuring privacy. Built on Manifest V3, Xiaoshu strictly controls required permissions, loads only local code, and protects user safety and privacy.&lt;/p&gt;
&lt;h2&gt;Customize your new tab&lt;/h2&gt;
&lt;p&gt;Xiaoshu is highly customizable. You can change wallpapers, themes, accent colors, and even use custom CSS to beautify your new tab. With such a personalized new tab page, your browser becomes a truly personal space.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/4921cd51ceca11e84df56a9a1bdc6f62.png/nexmoe&quot; alt=&quot;主题 Fluid&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/2437f0bbdf2758b379a247f5e9b4d247.png/nexmoe&quot; alt=&quot;主题 Meteor&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/846cf64aaf0ceee2688b4fc342c52681.png/nexmoe&quot; alt=&quot;主题 Hyper&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Xiaoshu is more than just a bookmark tool. It changes how we interact with online information, providing a more efficient and organized browsing experience. It reduces unnecessary hassle, makes every save worthwhile, and makes every visit full of discovery. Try Xiaoshu today and turn your bookmarks into your unique online assets—and unlock their real potential.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>使用 Docker 和 pnpm 优化打包 Nuxt.js 全栈项目</title><link>https://nexmoe.com/1VGXT98</link><guid isPermaLink="true">https://nexmoe.com/1VGXT98</guid><pubDate>Sun, 25 Feb 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article walks you through creating an optimized Docker image for a full-stack project that combines Prisma and Nuxt.js, using pnpm as the package manager.&lt;/p&gt;
&lt;p&gt;I reduced the final image size from 1.12GB to 160.21MB.&lt;/p&gt;
&lt;h2&gt;Project stack&lt;/h2&gt;
&lt;p&gt;Nuxt.js is a server-side rendering framework based on Vue.js and is great for building modern web apps.&lt;/p&gt;
&lt;p&gt;My project uses Nuxt to build a full-stack app directly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nuxt3&lt;/li&gt;
&lt;li&gt;Prisma&lt;/li&gt;
&lt;li&gt;PNPM&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Start building&lt;/h2&gt;
&lt;p&gt;First, we use the lighter &lt;code&gt;node:20-alpine&lt;/code&gt; base image to reduce the final image size. Alpine Linux is popular for being secure, minimal, and small.&lt;/p&gt;
&lt;p&gt;Multi-stage builds are one of the most effective strategies to shrink Docker images. We’ll use three stages.&lt;/p&gt;
&lt;h3&gt;Stage 1: Build dependencies&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;ARG NODE_VERSION=node:20-alpine

FROM $NODE_VERSION AS dependency-base

WORKDIR /app

RUN npm install -g pnpm

COPY package.json pnpm-lock.yaml ./

RUN pnpm install --frozen-lockfile`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This stage installs project dependencies. We use pnpm instead of npm because it is more efficient in cache and disk usage.&lt;/p&gt;
&lt;p&gt;Most projects now use pnpm as their package manager instead of npm.&lt;/p&gt;
&lt;h3&gt;Stage 2: Build the application&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;FROM dependency-base AS production-base

COPY . .

RUN pnpm run build 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In this stage we copy the project source and run the build command. For Nuxt, this generates the assets needed for static output and server-side rendering.&lt;/p&gt;
&lt;h3&gt;Stage 3: Build the production image&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;FROM $NODE_VERSION AS production

COPY --from=production-base /app/.output /app/.output

ENV NUXT_HOST=0.0.0.0 \
    NUXT_APP_VERSION=latest \
    DATABASE_URL=file:./db.sqlite \
    NODE_ENV=production

WORKDIR /app

EXPOSE 3000

CMD [&quot;node&quot;, &quot;/app/.output/server/index.mjs&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, we create a production image. It contains only the files needed to run the app, reducing unnecessary layers and keeping it lean.&lt;/p&gt;
&lt;p&gt;We also define environment variables like &lt;code&gt;NUXT_HOST&lt;/code&gt; and &lt;code&gt;DATABASE_URL&lt;/code&gt;, which are required by Nuxt and Prisma. &lt;code&gt;DATABASE_URL&lt;/code&gt; points to the SQLite file in the project root.&lt;/p&gt;
&lt;p&gt;The app runs on port &lt;code&gt;3000&lt;/code&gt;, and we specify the startup command to run the Nuxt server.&lt;/p&gt;
&lt;h2&gt;Image size comparison&lt;/h2&gt;
&lt;p&gt;Comparing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3-stage build&lt;/li&gt;
&lt;li&gt;2-stage build&lt;/li&gt;
&lt;li&gt;Direct build&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/a3c345aaa51a4b8b802c25bc9d3591c0.png&quot; alt=&quot;a3c345aaa51a4b8b802c25bc9d3591c0.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Dockerfile overview&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;# Use a smaller base image
ARG NODE_VERSION=node:20-alpine

# Stage 1: Build dependencies
FROM $NODE_VERSION AS dependency-base

# Create app directory
WORKDIR /app

# Install pnpm
RUN npm install -g pnpm

# Copy the package files
COPY package.json pnpm-lock.yaml ./

# Install dependencies using pnpm
RUN pnpm install --frozen-lockfile

# Stage 2: Build the application
FROM dependency-base AS production-base

# Copy the source code
COPY . .

# Build the application
RUN pnpm run build

# Stage 3: Production image
FROM $NODE_VERSION AS production

# Copy built assets from previous stage
COPY --from=production-base /app/.output /app/.output

# Define environment variables
ENV NUXT_HOST=0.0.0.0 \
    NUXT_APP_VERSION=latest \
    DATABASE_URL=file:./db.sqlite \
    NODE_ENV=production

# Set the working directory
WORKDIR /app

EXPOSE 3000

# Start the app
CMD [&quot;node&quot;, &quot;/app/.output/server/index.mjs&quot;]
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>post</category></item><item><title>使用 PNPM 的情况下，Jest 解决 ESM 依赖库的报错问题</title><link>https://nexmoe.com/1HA2ZHS</link><guid isPermaLink="true">https://nexmoe.com/1HA2ZHS</guid><pubDate>Thu, 04 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Environment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;NX&lt;/li&gt;
&lt;li&gt;PNPM&lt;/li&gt;
&lt;li&gt;lodash-es&lt;/li&gt;
&lt;li&gt;Jest&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Error encountered when migrating from Karma to Jest&lt;/h2&gt;
&lt;p&gt;The main reason is that ESM (ECMAScript Modules) libraries in &lt;code&gt;node_modules&lt;/code&gt; are not supported by Jest.&lt;/p&gt;
&lt;p&gt;Given that Jest’s ESM support is still in an experimental and nearly unusable stage, and I’m mainly migrating company projects to Jest, this post focuses on using &lt;code&gt;transformIgnorePatterns&lt;/code&gt; and &lt;code&gt;moduleNameMapper&lt;/code&gt; to resolve the issue.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/11c629a593c4c8484b6cb8ca44d6aa5f.png&quot; alt=&quot;11c629a593c4c8484b6cb8ca44d6aa5f.png&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Test suite failed to run

Jest encountered an unexpected token

Jest failed to parse a file. This happens e.g. when your code or its dependencies use non-standard JavaScript syntax, or when Jest is not configured to support such syntax.

Out of the box Jest supports Babel, which will be used to transform your files into valid JS based on your Babel configuration.

By default &quot;node_modules&quot; folder is ignored by transformers.

Here&apos;s what you can do:
    • If you are trying to use ECMAScript Modules, see https://jestjs.io/docs/ecmascript-modules for how to enable it.
    • If you are trying to use TypeScript, see https://jestjs.io/docs/getting-started#using-typescript
    • To have some of your &quot;node_modules&quot; files transformed, you can specify a custom &quot;transformIgnorePatterns&quot; in your config.
    • If you need a custom transformation specify a &quot;transform&quot; option in your config.
    • If you simply want to mock your non-JS modules (e.g. binary assets) you can stub them out with the &quot;moduleNameMapper&quot; config option.

You&apos;ll find more details and examples of these config options in the docs:
https://jestjs.io/docs/configuration
For information about custom transformations, see:
https://jestjs.io/docs/code-transformation
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The following examples use &lt;code&gt;lodash-es&lt;/code&gt; as reference.&lt;/p&gt;
&lt;h2&gt;transformIgnorePatterns&lt;/h2&gt;
&lt;p&gt;From the official docs: an array of regex pattern strings that are matched against all source file paths before transformation. If a file path matches any pattern, it will not be transformed.&lt;/p&gt;
&lt;p&gt;In other words, &lt;code&gt;transformIgnorePatterns&lt;/code&gt; specifies which files or folders should be ignored during transformation.&lt;/p&gt;
&lt;p&gt;In the default NX Jest config, it is set to &lt;code&gt;node_modules/(?!.*\.mjs$)&lt;/code&gt;.
This means it matches paths starting with &lt;code&gt;node_modules/&lt;/code&gt;, but excludes those ending in &lt;code&gt;.mjs&lt;/code&gt;. &lt;code&gt;?!&lt;/code&gt; is a negative lookahead.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;transformIgnorePatterns: [&apos;node_modules/(?!.*\\.mjs$)&apos;],
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This configuration will transform &lt;code&gt;.mjs&lt;/code&gt; files from ESM to CommonJS to support Jest.&lt;/p&gt;
&lt;h2&gt;Add lodash-es transform&lt;/h2&gt;
&lt;p&gt;Also supports PNPM:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const esModules = [&apos;.*\\.mjs$&apos;, &apos;lodash-es&apos;].join(&apos;|&apos;);

export default {
    ...
    transformIgnorePatterns: [`node_modules/(?!.pnpm|${esModules})`],
    ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After the transform, failed tests dropped from 15 to 11, but the transform adds cost and took ~51s. After the first run it seems to cache and no longer needs re-transforming.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/ef4e6aeef369b021b707664f9c03549a.png&quot; alt=&quot;ef4e6aeef369b021b707664f9c03549a.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;A cheaper approach: moduleNameMapper&lt;/h2&gt;
&lt;p&gt;This approach requires the library to have a CommonJS build, so no transform is needed. It can run in ~12s.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default {
    ...
    moduleNameMapper: {
        &apos;^lodash-es$&apos;: &apos;lodash&apos;,
    },
  ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/e87d8ad99b64c8f836a8c1777ec217bf.png&quot; alt=&quot;e87d8ad99b64c8f836a8c1777ec217bf.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Final config reference&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;/* eslint-disable */
const esModules = [&apos;.*\\.mjs$&apos;].join(&apos;|&apos;);

export default {
  displayName: &apos;pc&apos;,
  preset: &apos;../../jest.preset.js&apos;,
  setupFilesAfterEnv: [&apos;&amp;lt;rootDir&amp;gt;/src/test-setup.ts&apos;],
  coverageDirectory: &apos;../../coverage/apps/pc&apos;,
  moduleNameMapper: {
    &apos;^lodash-es$&apos;: &apos;lodash&apos;,
  },
  transform: {
    &apos;^.+\\.(ts|mjs|js|html)$&apos;: [
      &apos;jest-preset-angular&apos;,
      {
        tsconfig: &apos;&amp;lt;rootDir&amp;gt;/tsconfig.spec.json&apos;,
        stringifyContentPathRegex: &apos;\\.(html|svg)$&apos;,
      },
    ],
  },
  transformIgnorePatterns: [`node_modules/(?!.pnpm|${esModules})`],
  snapshotSerializers: [
    &apos;jest-preset-angular/build/serializers/no-ng-attributes&apos;,
    &apos;jest-preset-angular/build/serializers/ng-snapshot&apos;,
    &apos;jest-preset-angular/build/serializers/html-comment&apos;,
  ],
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/42260218/jest-setup-syntaxerror-unexpected-token-export&quot;&gt;Jest setup &quot;SyntaxError: Unexpected token export&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jestjs.io/docs/configuration#transformignorepatterns-arraystring&quot;&gt;Configuring Jest · Jest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jestjs.io/docs/ecmascript-modules&quot;&gt;ECMAScript Modules · Jest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://jestjs.io/docs/configuration#modulenamemapper-objectstring-string--arraystring&quot;&gt;Configuring Jest · Jest&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>post</category></item><item><title>【前端十万个为什么】V0.1</title><link>https://nexmoe.com/3J1ZYA3</link><guid isPermaLink="true">https://nexmoe.com/3J1ZYA3</guid><pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Why Use the Composition API&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/c2f54277b2fb37d52596daa96202d926.png&quot; alt=&quot;c2f54277b2fb37d52596daa96202d926.png&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Easier logic separation: Composables let you split component logic into smaller pieces, no longer constrained by the Options API structure, and make stateful logic easier to reuse.&lt;/li&gt;
&lt;li&gt;Flexibility and reusability: Shared logic can be extracted and reused, concerns are separated, and code becomes more modular and maintainable.&lt;/li&gt;
&lt;li&gt;Better composition: Split logic into reusable parts and combine them with composables to avoid duplication and reduce the risk of inconsistencies.&lt;/li&gt;
&lt;li&gt;Readability and understandability: Each composable encapsulates a specific behavior, is easier to reason about and test, and supports collaboration with a structured codebase.&lt;/li&gt;
&lt;li&gt;Better type inference: Use variables and standard JavaScript functions to handle component logic. This makes type inference easier when building large Vue apps with static typing (e.g. TypeScript).&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Why Destructuring a Proxy Loses Reactivity&lt;/h2&gt;
&lt;p&gt;To be filled in later.&lt;/p&gt;
&lt;h2&gt;Why Destructuring Props in Vue Loses Reactivity&lt;/h2&gt;
&lt;p&gt;In Vue 3, destructuring &lt;code&gt;props&lt;/code&gt; may cause you to lose reactivity. That means changes to &lt;code&gt;props&lt;/code&gt; won’t trigger component updates.&lt;/p&gt;
&lt;p&gt;Vue’s reactivity system relies on &lt;code&gt;Proxy&lt;/code&gt; to track changes. When a component receives an object as &lt;code&gt;props&lt;/code&gt;, Vue sets reactive getters and setters for each property so it can detect changes and update the component.&lt;/p&gt;
&lt;p&gt;When you destructure the props object, you create a new object that is no longer reactive. The reactive getters and setters Vue added to the original object are not transferred to the new one.&lt;/p&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zhihu.com/question/445693785/answer/2580357612&quot;&gt;Vue3 如果解构 props 会失去起响应性导致 setup 里一堆 pros.xxx 怎么办？ - 这似谁的小鹿的回答 - 知乎&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://mokkapps.de/vue-tips/destructure-props-in-composition-api-without-losing-reactivity&quot;&gt;Vue Tip: Destructure Props in Composition API Without Losing ...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nickychristensen.medium.com/how-to-destructure-props-in-vue-3-without-losing-reactivity-72e1eb05f6c0&quot;&gt;How To Destructure Props In Vue 3 Without Losing Reactivity | by Nicky Christensen | Medium&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Why Vue Projects Rarely Use RxJS&lt;/h2&gt;
&lt;h3&gt;One-line Explanation&lt;/h3&gt;
&lt;p&gt;Vue aims to be a lightweight and flexible framework, letting developers choose their preferred tools and libraries. While RxJS is a powerful reactive programming library, Vue takes a different approach by providing its own reactivity system.&lt;/p&gt;
&lt;h3&gt;Details&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Different design philosophies: Vue focuses on simplicity and intuitive reactive programming, while RxJS is more powerful and complex, and better suited for async and event-driven programming.&lt;/li&gt;
&lt;li&gt;Library size and complexity: RxJS is large and has a steep learning curve. Making it a default dependency would increase framework size and development complexity, which conflicts with Vue’s lightweight and flexible goals.&lt;/li&gt;
&lt;li&gt;Flexibility: Vue is designed to adapt to different project needs. It doesn’t bind itself to a specific reactive library (like RxJS), allowing developers to integrate RxJS or any other library as needed.&lt;/li&gt;
&lt;li&gt;Learning curve: Vue has a gentle learning curve, especially for beginners. Its built-in reactivity offers a simpler, more progressive experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://www.thisdot.co/blog/introduction-to-vuejs-and-rxjs&quot;&gt;Introduction to VueJS and RxJS - This Dot Labs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.digitalocean.com/community/tutorials/vuejs-using-rxjs&quot;&gt;Integrating RxJS with Vue.js | DigitalOcean&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://goodguydaniel.com/blog/reactive-rxjs-pros-cons/&quot;&gt;Reactive Programming: The Good and the Bad | goodguydaniel.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/@p.woltschkow/a-better-practice-to-implement-http-client-in-vue-with-rxjs-c59f93bfa439&quot;&gt;A better practice to implement HTTP client in Vue with RxJS for enterprise Apps | by Pawel Woltschkow | Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://engineering.cloudflight.io/you-might-not-want-rxjs&quot;&gt;You might not want Rxjs&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>post</category></item><item><title>JavaScript Notes and Comparisons V2.0</title><link>https://nexmoe.com/1294PJK</link><guid isPermaLink="true">https://nexmoe.com/1294PJK</guid><pubDate>Wed, 01 Nov 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Differences between Promise and RxJS Observables&lt;/h2&gt;
&lt;h3&gt;Promise&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Promise is built into JavaScript and requires no extra libraries.&lt;/li&gt;
&lt;li&gt;A Promise represents a single value that may be available now or in the future.&lt;/li&gt;
&lt;li&gt;Promises are eager: once resolved, the &lt;code&gt;.then()&lt;/code&gt; callback runs immediately.&lt;/li&gt;
&lt;li&gt;A Promise can only emit a single value.&lt;/li&gt;
&lt;li&gt;Promises are great for simple async operations that produce one result.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;RxJS Observables&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Observables are part of the RxJS library and require extra dependencies.&lt;/li&gt;
&lt;li&gt;An Observable represents a stream of values over time.&lt;/li&gt;
&lt;li&gt;Observables are lazy: nothing happens until you subscribe.&lt;/li&gt;
&lt;li&gt;Observables can emit multiple values, including zero or many.&lt;/li&gt;
&lt;li&gt;You can transform and compose Observables with RxJS operators to create custom streams.&lt;/li&gt;
&lt;li&gt;Observables are great for complex async operations, such as real‑time data streams or event‑driven programming.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://medium.com/javascript-everyday/javascript-theory-promise-vs-observable-d3087bc1239a&quot;&gt;JavaScript Theory: Promise vs Observable - Medium&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/questions/37364973/what-is-the-difference-between-promises-and-observables&quot;&gt;angular - What is the difference between Promises and Observables? - Stack Overflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://auth0.com/blog/javascript-promises-vs-rxjs-observables/&quot;&gt;JavaScript Promises vs. RxJS Observables&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;A simple template syntax implementation&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;const name = &apos;Nexmoe&apos;;
const message = &apos;My name is {{name}} and I\&apos;m {{getAge(20)}} years old.&apos;;

function getAge(age) {
  return age;
}

const replacedMessage = message.replace(/\{\{(.*?)\}\}/g, (match, variableOrFunction) =&amp;gt; {
  const trimmedValue = variableOrFunction.trim();

  if (trimmedValue.includes(&apos;(&apos;)) {  // If the placeholder contains parentheses, treat it as a function call with args
    const [functionName, ...args] = trimmedValue.split(/\(|\)/).filter(Boolean);
    const func = eval(functionName);
    return func(...args);
  } else {  // Otherwise treat it as a variable
    return eval(trimmedValue);
  }
});

onsole.log(replacedMessage);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;First check whether the placeholder contains parentheses. If it does, treat it as a function call. Use &lt;code&gt;split&lt;/code&gt; and a regex to parse the function name and arguments, then use &lt;code&gt;eval&lt;/code&gt; to get the function and spread the args into it. The return value becomes the replacement string.&lt;/p&gt;
&lt;p&gt;If it doesn’t contain parentheses, treat it as a variable. Use &lt;code&gt;eval&lt;/code&gt; to get the variable’s value and return it as the replacement.&lt;/p&gt;
&lt;p&gt;⚠️ Note: using &lt;code&gt;eval&lt;/code&gt; is risky because it can execute arbitrary JavaScript. Many people advise against it. I plan to explore alternatives later.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Self‑Hosted Sentry Script Loader Not Working</title><link>https://nexmoe.com/1VEWBDS</link><guid isPermaLink="true">https://nexmoe.com/1VEWBDS</guid><pubDate>Sun, 22 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I recently self‑hosted Sentry on a server.&lt;/p&gt;
&lt;p&gt;After adding it to the website with the script method, it never worked. In the console I saw this error:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Sentry loader you are trying to use isn&apos;t working anymore, check your configuration.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I checked GitHub and it seems to be a network issue in China.&lt;/p&gt;
&lt;p&gt;Add the following to &lt;code&gt;sentry/sentry.conf.py&lt;/code&gt; to fix it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;JS_SDK_LOADER_DEFAULT_SDK_URL = &quot;https://browser.sentry-cdn.com/%s/bundle.tracing.replay.debug.min.js&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then restart the Sentry Docker service:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo docker compose restart
sudo docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/getsentry/sentry/issues/22715&quot;&gt;Sentry JS lazily-loadable loader doesn&apos;t work · Issue #22715 · getsentry/sentry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>JavaScript Notes and Comparisons</title><link>https://nexmoe.com/20231020-JavaScript%20%E6%80%BB%E7%BB%93%E3%80%81%E6%AF%94%E8%BE%83</link><guid isPermaLink="true">https://nexmoe.com/20231020-JavaScript%20%E6%80%BB%E7%BB%93%E3%80%81%E6%AF%94%E8%BE%83</guid><pubDate>Fri, 20 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;What does &lt;code&gt;static&lt;/code&gt; mean in a JS class?&lt;/h2&gt;
&lt;p&gt;I was reading docs about the &lt;code&gt;static&lt;/code&gt; property in JavaScript classes. The English version was hard to understand, and the Chinese version was also unclear.&lt;/p&gt;
&lt;p&gt;English&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We can also assign a method to the class as a whole. Such methods are called static.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Chinese&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我们可以把一个方法作为一个整体赋值给类。这样的方法被称为 静态的（static）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The idea is actually simple. In JavaScript, &lt;code&gt;static&lt;/code&gt; is a keyword for defining static methods or static properties. Static methods/properties belong to the class itself, not an instance. &lt;strong&gt;That means you can call them directly on the class without instantiating it.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Static methods are attached to the class, not instances. They’re usually used for class‑level operations that don’t depend on instance state. You define them with the &lt;code&gt;static&lt;/code&gt; keyword, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class MyClass {
  static staticMethod() {
    console.log(&apos;This is a static method&apos;);
  }
}

MyClass.staticMethod(); // call the static method
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In the example above, &lt;code&gt;staticMethod()&lt;/code&gt; is called directly on the class &lt;code&gt;MyClass&lt;/code&gt; without creating an instance. Static methods are not inherited by instances; they are called only on the class itself.&lt;/p&gt;
&lt;p&gt;Static properties are also defined with &lt;code&gt;static&lt;/code&gt;. They’re shared properties on the class, not on instances. For example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;class MyClass {
  static staticProperty = &apos;This is a static property&apos;;
}

console.log(MyClass.staticProperty); // access static property
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, &lt;code&gt;staticProperty&lt;/code&gt; is a static property and can be accessed via the class &lt;code&gt;MyClass&lt;/code&gt;. It is not available on instances.&lt;/p&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://javascript.info/static-properties-methods&quot;&gt;Static properties and methods&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://zh.javascript.info/static-properties-methods&quot;&gt;静态属性和静态方法&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;[Comparison] &lt;code&gt;type&lt;/code&gt; vs &lt;code&gt;interface&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;In TypeScript, &lt;code&gt;type&lt;/code&gt; and &lt;code&gt;interface&lt;/code&gt; are both used to define types, but they have differences.&lt;/p&gt;
&lt;h3&gt;Similarities&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Both can define objects, functions, union types, etc.&lt;/li&gt;
&lt;li&gt;Both can be extended (extends) by other types.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Differences&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt; can declare aliases for primitives, union types, intersection types, and other complex types, while &lt;code&gt;interface&lt;/code&gt; is mainly for object shapes [[1]]&lt;a href=&quot;%5B2&quot;&gt;https://zhuanlan.zhihu.com/p/558315566&lt;/a&gt;](https://juejin.cn/post/6844903749501059085)。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;type&lt;/code&gt; can use &lt;code&gt;typeof&lt;/code&gt; to get an instance’s type for assignment, while &lt;code&gt;interface&lt;/code&gt; does not support that &lt;a href=&quot;https://juejin.cn/post/6844903749501059085&quot;&gt;[2]&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;interface&lt;/code&gt; supports declaration merging (multiple interfaces with the same name are merged), while &lt;code&gt;type&lt;/code&gt; does not [[1]]&lt;a href=&quot;%5B2&quot;&gt;https://zhuanlan.zhihu.com/p/558315566&lt;/a&gt;](https://juejin.cn/post/6844903749501059085)。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Summary&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;In general, use &lt;code&gt;interface&lt;/code&gt; if possible, because it’s easier to extend and has better hints &lt;a href=&quot;https://juejin.cn/post/6844903749501059085&quot;&gt;[2]&lt;/a&gt;. It’s suitable for object shapes and declaration merging scenarios.&lt;/li&gt;
&lt;li&gt;If you need complex types or need to use &lt;code&gt;typeof&lt;/code&gt; to get instance types for assignment, use &lt;code&gt;type&lt;/code&gt; &lt;a href=&quot;https://juejin.cn/post/6844903749501059085&quot;&gt;[2]&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Other&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Tuple types are a special data type in TypeScript. Unlike normal arrays, each element in a tuple can have a different type.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;References&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/558315566&quot;&gt;TypeScript 中 type 和 interface 有什么区别？ - 知乎&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://juejin.cn/post/6844903749501059085&quot;&gt;Typescript 中的 interface 和 type 到底有什么区别 - 掘金&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://juejin.cn/post/7100017218305392647&quot;&gt;TS 篇-type 和 interface 的区别 - 掘金&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://juejin.cn/post/7072945053936648200&quot;&gt;type 与 interface 的区别，你真的懂了吗？ - 掘金&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ts.xcatliu.com/advanced/tuple.html&quot;&gt;元组 · TypeScript 入门教程&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;[Summary] JavaScript variable scope and closures&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Lexical Environment&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Every running function, code block, or script has an associated Lexical Environment object that stores local variables and function declarations.&lt;/li&gt;
&lt;li&gt;A Lexical Environment has two parts: an Environment Record (stores variables) and a reference to the outer Lexical Environment.&lt;/li&gt;
&lt;li&gt;When a function executes, it creates an inner Lexical Environment for its local variables and parameters.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Variables&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Variables are actually properties on the Lexical Environment. Reading/modifying variables means reading/modifying these properties.&lt;/li&gt;
&lt;li&gt;Function declarations are initialized immediately, but let/const variables can only be read after declaration.&lt;/li&gt;
&lt;li&gt;Block scope: variables declared inside &lt;code&gt;{}&lt;/code&gt; are only visible within that block.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Nested functions&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Nested functions can access variables from outer functions, allowing them to encapsulate external variables.&lt;/li&gt;
&lt;li&gt;Nested functions remember where they were created via the Environment reference, so they can always access external variables from that location.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Closures&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;A closure is a function that remembers and can access external variables.&lt;/li&gt;
&lt;li&gt;In JavaScript, all functions are naturally closures via the Environment reference.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Garbage collection&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;If a nested function is referenced, the outer Lexical Environment won’t be collected.&lt;/li&gt;
&lt;li&gt;If outer variables aren’t used by the nested function, engines may optimize them away so they can’t be accessed.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Other&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;Understanding Lexical Environment and closures helps you write better JavaScript.&lt;/li&gt;
&lt;li&gt;Nested functions and closures are useful for organizing code and encapsulating variables.&lt;/li&gt;
&lt;li&gt;Variable optimization can make debugging harder.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://javascript.info/closure&quot;&gt;Variable scope, closure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;[Summary] Notes on using async/await&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;When using &lt;code&gt;await&lt;/code&gt;, it’s best to wrap it in &lt;code&gt;try...catch&lt;/code&gt; or use &lt;code&gt;.catch()&lt;/code&gt; to handle rejections.&lt;/li&gt;
&lt;li&gt;If multiple awaited async operations are independent, trigger them in parallel with &lt;code&gt;Promise.all()&lt;/code&gt; or by assigning to multiple variables.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;await&lt;/code&gt; can only be used inside an &lt;code&gt;async&lt;/code&gt; function. Using &lt;code&gt;await&lt;/code&gt; in a normal function will throw. If you use &lt;code&gt;await&lt;/code&gt; in a normal function, it might run concurrently instead of sequentially; the correct approach is &lt;code&gt;for&lt;/code&gt; loops or &lt;code&gt;reduce()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;async&lt;/code&gt; functions preserve the call stack and don’t interrupt function execution, so you can keep error stack traces intact while async tasks run.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wangdoc.com/es6/async&quot;&gt;async 函数&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function&quot;&gt;async function - JavaScript | MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await&quot;&gt;await - JavaScript | MDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;[Comparison] Iteration syntax&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The most basic way to iterate is &lt;code&gt;for&lt;/code&gt;, but it’s verbose.&lt;/li&gt;
&lt;li&gt;Arrays provide &lt;code&gt;forEach&lt;/code&gt;, which simplifies iteration but can’t break early.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;for...in&lt;/code&gt; iterates array keys, but has downsides: keys are strings, it iterates manually added keys and prototype keys, and order isn’t guaranteed.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;for...of&lt;/code&gt; is a newer syntax with advantages:
&lt;ul&gt;
&lt;li&gt;Simple syntax similar to &lt;code&gt;for...in&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Unlike &lt;code&gt;forEach&lt;/code&gt;, it allows &lt;code&gt;break&lt;/code&gt;, &lt;code&gt;continue&lt;/code&gt;, and &lt;code&gt;return&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Provides a unified interface for iterating data structures.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;for...of&lt;/code&gt; makes array iteration more convenient, while offering flexible control and a unified interface.&lt;/p&gt;
&lt;hr /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wangdoc.com/es6/iterator&quot;&gt;Iterator 和 for...of 循环&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>VS Code Plugin Monitor Pro - Monitor Everything You Care About</title><link>https://nexmoe.com/EPJFDV</link><guid isPermaLink="true">https://nexmoe.com/EPJFDV</guid><pubDate>Sat, 07 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Monitor Pro is a comprehensive resource monitoring tool that helps you track key system metrics in real time and presents them clearly. No matter what you do, if you use VS Code, don’t miss it.&lt;/p&gt;
&lt;h2&gt;Install &amp;amp; Use&lt;/h2&gt;
&lt;p&gt;The extension is enabled automatically after installation.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nexmoe.monitor-pro&quot;&gt;https://marketplace.visualstudio.com/items?itemName=nexmoe.monitor-pro&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/f4994d4cc1b09a7c8429191762d6c085.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/6a860a03d54f14ccb9c5b918118abb44.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/4739faf7471aa42625e76fad8efe4419.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] &lt;strong&gt;Resource monitoring&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;[x] &lt;strong&gt;CPU usage&lt;/strong&gt;: Monitor the percentage of CPU utilization to understand how much processing power is being used.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;CPU frequency&lt;/strong&gt;: Track current CPU frequency to see how the system dynamically adjusts processing power.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;CPU temperature&lt;/strong&gt;: Monitor temperature (if available).&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;Memory usage&lt;/strong&gt;: Keep an eye on memory consumption.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;Network usage&lt;/strong&gt;: Track network activity, including inbound and outbound transfer rates.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;File system usage&lt;/strong&gt; (Linux, macOS): Provide disk read/write rates.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;Battery percentage and charging status&lt;/strong&gt;: If you’re on a laptop or portable device, monitor battery level and charging status.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;OS distribution name&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Disk usage&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;Sorting&lt;/strong&gt;: Customize the display order of monitored resources for quick overview.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;Refresh interval&lt;/strong&gt;: Set how often metrics are refreshed.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;No layout shift&lt;/strong&gt;: Ensure status bar elements don’t unexpectedly change size or position.&lt;/li&gt;
&lt;li&gt;[x] &lt;strong&gt;Remote SSH resource monitoring&lt;/strong&gt;: Track key system metrics on devices connected via Remote SSH.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;High usage alerts&lt;/strong&gt;: Receive alerts when any monitored resource reaches a high usage level.&lt;/li&gt;
&lt;li&gt;[ ] &lt;strong&gt;Dashboard&lt;/strong&gt;: I hope to display everything you care about on one page with rich charts.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Vision&lt;/h2&gt;
&lt;p&gt;I understand how important monitoring information is, so my goal is to build the most comprehensive and intuitive monitoring tool, letting you easily grasp system status. Monitor Pro was created to meet everyone’s system monitoring needs.&lt;/p&gt;
&lt;p&gt;In the future, I also hope to integrate chart designs to make data more intuitive. You’ll be able to clearly see trends and relationships between system metrics, making it easier to understand performance and make informed decisions.&lt;/p&gt;
&lt;h2&gt;Why Build This Extension?&lt;/h2&gt;
&lt;p&gt;To provide a comprehensive resource monitoring tool when using VS Code Remote SSH, so you can better manage and monitor server status.&lt;/p&gt;
&lt;p&gt;See details: &lt;a href=&quot;https://juejin.cn/post/7284885060338155539&quot;&gt;https://juejin.cn/post/7284885060338155539&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Feedback&lt;/h2&gt;
&lt;p&gt;I highly value user feedback because it’s crucial for improving the product. If you have suggestions or encounter bugs, please report them here:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nexmoe/vscode-monitor-pro/issues&quot;&gt;https://github.com/nexmoe/vscode-monitor-pro/issues&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Support Me&lt;/h2&gt;
&lt;p&gt;Give a star on &lt;a href=&quot;https://github.com/nexmoe/vscode-monitor-pro&quot;&gt;Github&lt;/a&gt; or leave a five-star review on the &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nexmoe.monitor-pro&amp;amp;ssr=false#review-details&quot;&gt;VS Code Marketplace&lt;/a&gt;!&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Convert Animated PNG (APNG) to GIF and Loop Forever</title><link>https://nexmoe.com/1GSAPJA</link><guid isPermaLink="true">https://nexmoe.com/1GSAPJA</guid><pubDate>Fri, 06 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Today I found some PNG-format animated stickers online &lt;s&gt;I won’t tell you I stole them from LINE&lt;/s&gt;, and learned they’re APNGs. Since WeChat and QQ don’t support APNG, I converted them to GIF. After conversion, I found they only loop once in WeChat, which led to the question of how to batch‑modify GIF loop counts.&lt;/p&gt;
&lt;p&gt;So here’s a brief intro to APNG. I also share an online tool that can batch convert APNG to GIF, but it can’t make them loop forever. Finally, I share two ways to batch-edit GIF loop counts: Node.js and a Windows batch script, so both Node developers and regular Windows users can handle this in bulk.&lt;/p&gt;
&lt;h2&gt;What is APNG?&lt;/h2&gt;
&lt;p&gt;APNG (Animated Portable Network Graphics) is a bitmap animation extension for PNG, enabling animated images. Compared with GIF, APNG has better quality and detail. As more browsers support APNG, it may become a next‑generation animated image standard. Key differences:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Image quality: GIF supports at most 256 colors and doesn’t support alpha transparency, so it looks worse for colorful or semi‑transparent images. APNG supports more colors and alpha transparency, giving smoother animations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Compatibility: Both APNG and GIF are frame‑based, but APNG is backward compatible. The first frame is a standard PNG. Even if a browser can’t read the animation data, it can still display the first frame. If it does support APNG, it plays the rest of the frames.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Browser support: Since Chrome 59, Chrome supports APNG, so most browsers can display APNG animations. IE does not support APNG.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;More details: &lt;a href=&quot;https://xtaolink.cn/268.html&quot;&gt;https://xtaolink.cn/268.html&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Batch convert APNG to GIF&lt;/h2&gt;
&lt;p&gt;This tool can batch convert APNG to GIF, but it can’t make them loop forever.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://cdkm.com/cn/png-to-gif&quot;&gt;https://cdkm.com/cn/png-to-gif&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Batch edit GIFs to loop forever&lt;/h2&gt;
&lt;h3&gt;bat (recommended for regular users)&lt;/h3&gt;
&lt;p&gt;Below is a batch script (.bat) that does the same thing:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@echo off
setlocal enabledelayedexpansion

set &quot;directoryPath=C:\path\to\directory&quot;

for /r &quot;%directoryPath%&quot; %%f in (*.gif) do (
    echo Modifying %%~nxf
    call :modifyGif &quot;%%f&quot;
)

exit /b

:modifyGif
set &quot;filePath=%~1&quot;

set /p data=&amp;lt;&quot;%filePath%&quot;
set &quot;index=!data:~0,16!&quot;
set &quot;modifiedData=!data:~0,16!!data:~16,1!!data:~17,1!!data:~19!&quot;

echo.!modifiedData!&amp;gt;&quot;%filePath%&quot;

exit /b
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Replace &lt;code&gt;C:\path\to\directory&lt;/code&gt; with the actual path. Save the script as a &lt;code&gt;.bat&lt;/code&gt; file and double‑click to run. The script will iterate over all &lt;code&gt;.gif&lt;/code&gt; files in the directory and modify them.&lt;/p&gt;
&lt;p&gt;Note: batch scripts are limited and can’t read binary files directly. This script simulates reading by taking the first line. When modifying, it writes the modified data directly without binary operations. This may not work for all cases, and large files may have performance issues. For more complex binary processing, consider other languages or tools.&lt;/p&gt;
&lt;h3&gt;Node (the method Nexmoe used)&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/126036c1db438306d478d218435527cc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const fs = require(&apos;fs&apos;);
const path = require(&apos;path&apos;);

function unlimitedGifRepetitions(path) {
  const data = fs.readFileSync(path);

  const index = data.indexOf(Buffer.from([0x21, 0xFF, 0x0B]));
  if (index &amp;lt; 0) {
    throw new Error(`Cannot find Gif Application Extension in ${path}`);
  }

  data[index + 16] = 255;
  data[index + 17] = 255;

  return data;
}

function batchModifyGifFilesInDirectory(directoryPath) {
  fs.readdir(directoryPath, (err, files) =&amp;gt; {
    if (err) {
      console.error(&apos;Error reading directory:&apos;, err);
      return;
    }

    files.forEach(file =&amp;gt; {
      const filePath = path.join(directoryPath, file);
      const fileExtension = path.extname(file);

      if (fileExtension === &apos;.gif&apos;) {
        try {
          const modifiedData = unlimitedGifRepetitions(filePath);
          fs.writeFileSync(filePath, modifiedData);
          console.log(`Modified ${file}`);
        } catch (error) {
          console.error(`Error modifying ${file}:`, error);
        }
      }
    });
  });
}

const directoryPath = &apos;./path/to/directory&apos;;
batchModifyGifFilesInDirectory(directoryPath);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Note: this code uses Node.js &lt;code&gt;fs&lt;/code&gt; to read and write files. Replace &lt;code&gt;./path/to/directory&lt;/code&gt; with your real path. Ensure Node.js is installed before running.&lt;/p&gt;
&lt;p&gt;The script iterates through all files in the directory, calls &lt;code&gt;unlimitedGifRepetitions&lt;/code&gt; for each &lt;code&gt;.gif&lt;/code&gt;, and writes the modified data back to the original file. The console shows each modified file or errors.&lt;/p&gt;
&lt;p&gt;More details: &lt;a href=&quot;https://www.b612.me/golang/232.html&quot;&gt;https://www.b612.me/golang/232.html&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;A better tool&lt;/h2&gt;
&lt;p&gt;This batch tool can convert multiple APNG files to GIF and then set the output GIFs to loop forever.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/nexmoe/batch-apng2gif&quot;&gt;https://github.com/nexmoe/batch-apng2gif&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>VSCode Monitor Pro</title><link>https://nexmoe.com/products/vscode-monitor-pro</link><guid isPermaLink="true">https://nexmoe.com/products/vscode-monitor-pro</guid><description>Tired of VS Code lagging? Worried about insufficient server resources? Monitor Pro lets you see through system bottlenecks at a glance and say goodbye to performance anxiety.</description><pubDate>Wed, 04 Oct 2023 10:52:38 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20240822_screenshot2.cq2kCk7h.png&quot; alt=&quot;VSCode Monitor Pro&quot; /&gt;&lt;/p&gt;&lt;p&gt;Tired of VS Code lagging? Worried about insufficient server resources? Monitor Pro lets you see through system bottlenecks at a glance and say goodbye to performance anxiety.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nexmoe.monitor-pro&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://marketplace.visualstudio.com/items?itemName=nexmoe.monitor-pro&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/vscode-monitor-pro&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nexmoe.monitor-pro&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Get Monitor Pro Now&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/nexmoe/vscode-monitor-pro&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;import FeatureSection from &apos;../../components/products/FeatureSection.astro&apos;
import StatsSection from &apos;../../components/products/StatsSection.astro&apos;
import TargetUsersSection from &apos;../../components/products/TargetUsersSection.astro&apos;
import { TestimonialsSection } from &apos;../../components/products/TestimonialsSection.tsx&apos;
import { Icon } from &apos;astro-icon/components&apos;&lt;/p&gt;
&lt;p&gt;&amp;lt;div class=&quot;space-y-36 py-24&quot;&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;FeatureSection
title=&quot;Say Goodbye to Performance Anxiety, Take Control&quot;
subtitle=&quot;No more worrying about VS Code freezing, no more guessing if your server can handle it. Monitor Pro keeps you fully informed of system status&quot;
features={[
{
icon: &apos;mdi:server-network&apos;,
title: &apos;Remote SSH Support&apos;,
description:
&apos;Easily monitor Remote SSH connected server resources without additional configuration&apos;
},
{
icon: &apos;mdi:flash&apos;,
title: &apos;Real-time Monitoring of 9 Core Metrics&apos;,
description:
&apos;CPU maxed out, insufficient memory, disk almost full? All problems at a glance, say goodbye to &quot;why is this so slow&quot; confusion&apos;
},
{
icon: &apos;mdi:view-dashboard-variant&apos;,
title: &apos;Customizable Monitoring Panel&apos;,
description:
&quot;Only care about CPU and memory? Customize the layout, see what you want to see, don&apos;t waste an inch of screen space&quot;
},
{
icon: &apos;mdi:translate&apos;,
title: &apos;Multi-language Support&apos;,
description:
&apos;Chinese interface, English interface, use whatever language you want, developers worldwide can get started easily&apos;
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;StatsSection
title=&quot;9 Core Metrics, Not One Less&quot;
subtitle=&quot;From CPU to battery, from memory to network, all metrics that may affect your development experience are here&quot;
stats={[
{
icon: &apos;mdi:cpu-64-bit&apos;,
value: &apos;CPU Usage&apos;,
label: &apos;VS Code turning into a slideshow when CPU is maxed? Real-time monitoring, early warning&apos;
},
{
icon: &apos;mdi:speedometer&apos;,
value: &apos;CPU Frequency&apos;,
label: &apos;CPU throttling causing compilation to crawl? Frequency monitoring, performance at a glance&apos;
},
{
icon: &apos;mdi:thermometer&apos;,
value: &apos;CPU Temperature&apos;,
label: &apos;Laptop burning hot? Automatic throttling when overheated, monitor temperature to protect your device&apos;
},
{
icon: &apos;mdi:memory&apos;,
value: &apos;Memory Usage&apos;,
label: &apos;Insufficient memory causing VS Code to crash? Real-time monitoring, timely cleanup&apos;
},
{
icon: &apos;mdi:wifi&apos;,
value: &apos;Network Usage&apos;,
label: &apos;SSH connection lagging? Network monitoring, quickly identify bandwidth or latency issues&apos;
},
{
icon: &apos;mdi:harddisk&apos;,
value: &apos;Disk Usage&apos;,
label: &apos;Insufficient disk space, compilation failed? Capacity monitoring, expand in advance&apos;
},
{
icon: &apos;mdi:battery&apos;,
value: &apos;Battery Status&apos;,
label: &apos;Laptop shutting down automatically when out of power? Battery monitoring, charge in time&apos;
},
{
icon: &apos;mdi:desktop-classic&apos;,
value: &apos;Operating System&apos;,
label: &apos;System version incompatible? System information, quickly diagnose environment issues&apos;
},
{
icon: &apos;mdi:clock-outline&apos;,
value: &apos;System Uptime&apos;,
label: &apos;Server restarted? Uptime monitoring, quickly detect anomalies&apos;
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;TargetUsersSection
title=&quot;Have You Encountered These Pain Points?&quot;
subtitle=&quot;Common frustrations of VS Code users, solved all at once by Monitor Pro&quot;
userTypes={[
{
icon: &apos;mdi:code-braces&apos;,
title: &apos;Developers&apos;,
subtitle:
&apos;VS Code lagging to the point of questioning life? System freezing during compilation?&apos;,
tags: [&apos;Performance Anxiety&apos;, &apos;Development Efficiency&apos;],
features: [
&quot;See at a glance whether it&apos;s a CPU or memory issue when VS Code lags&quot;,
&apos;Remote server lagging, quickly identify network or resource bottlenecks&apos;,
&apos;Real-time system load monitoring when compiling large projects, avoid crashes&apos;
]
},
{
icon: &apos;mdi:shield-check&apos;,
title: &apos;System Administrators&apos;,
subtitle: &quot;Server suddenly slowing down, but don&apos;t know where the problem is?&quot;,
tags: [&apos;Troubleshooting&apos;, &apos;Performance Optimization&apos;],
features: [
&apos;Quickly locate bottlenecks when server performance is abnormal, no more blind guessing&apos;,
&apos;Timely warning when system resources are insufficient, avoid service interruption&apos;,
&apos;Quick diagnosis when failures occur, reduce downtime&apos;
]
},
{
icon: &apos;mdi:flask&apos;,
title: &apos;Data Scientists&apos;,
subtitle:
&quot;Don&apos;t know if resources are sufficient during model training? Low GPU utilization?&quot;,
tags: [&apos;Resource Optimization&apos;, &apos;Training Efficiency&apos;],
features: [
&apos;Real-time GPU usage monitoring during model training, avoid resource waste&apos;,
&apos;Quickly locate bottlenecks when data processing tasks lag&apos;,
&apos;Timely warning when GPU temperature is too high, protect hardware&apos;
]
}
]}
/&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20240822_screenshot2.cq2kCk7h.png" length="53371" type="image/png"/></item><item><title>Using VS Code to Manage Servers: My Unique Approach</title><link>https://nexmoe.com/1M3R9E6</link><guid isPermaLink="true">https://nexmoe.com/1M3R9E6</guid><pubDate>Tue, 03 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Since Typora started charging, I fully switched to VS Code (Visual Studio Code) for writing. As a Markdown editor, it already meets my needs.&lt;/p&gt;
&lt;p&gt;Then I started wondering: could VS Code be used as a server manager? Before this, I used FinalShell, which I liked for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Simple resource monitoring&lt;/li&gt;
&lt;li&gt;File browsing&lt;/li&gt;
&lt;li&gt;Terminal access&lt;/li&gt;
&lt;li&gt;Multi‑server management&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When VS Code released Remote SSH, I didn’t pay much attention. It was meant for remote development, and I didn’t need that. But once I tried remote development, I gave Remote SSH a shot—and was pleasantly surprised. It’s excellent for server management.&lt;/p&gt;
&lt;p&gt;So what features of VS Code meet my needs?&lt;/p&gt;
&lt;h2&gt;VS Code features&lt;/h2&gt;
&lt;h3&gt;Multi‑server management&lt;/h3&gt;
&lt;p&gt;By configuring SSH keys on servers you want to access, you can set up Remote SSH and specify server IPs to connect directly.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host server1
    HostName server 1 IP
    User username

Host server2
    HostName server 2 IP
    User username
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With this config, you can manage multiple servers in VS Code. Just click a server in the list to connect and operate remotely.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/4aa3d3b0b76a3beb2ca85c82454b8c49.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;File explorer&lt;/h3&gt;
&lt;p&gt;Like a normal project, VS Code can open a folder on the server. Then you can do standard file browsing and use search to locate files quickly.&lt;/p&gt;
&lt;p&gt;I usually open the account’s home directory directly.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/b4d0fa1ab402d7dbe1e6b7bd447d109e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You also get VS Code’s powerful file editing.&lt;/p&gt;
&lt;p&gt;Goodbye to &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;mkdir&lt;/code&gt;, &lt;code&gt;touch&lt;/code&gt;, &lt;code&gt;vi&lt;/code&gt;, etc.&lt;/p&gt;
&lt;h3&gt;Fast terminal experience&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/531f417e101e290bd87decad3879c606.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can open multiple terminal instances and switch between them. Each terminal runs commands independently and keeps its own history.&lt;/p&gt;
&lt;p&gt;You can also open terminals in multiple tabs or split views to run commands in parallel.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/77be0f069c48211c04cd6bf7083f260f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In addition, right‑click any file or folder and choose “Open in Terminal” to jump directly to that path—no more painful &lt;code&gt;cd&lt;/code&gt; everywhere.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/46402274e2d0cb48d95bab74a9820db9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Docker GUI management&lt;/h3&gt;
&lt;p&gt;Most of my services run in Docker, so I use it frequently.&lt;/p&gt;
&lt;p&gt;If you use Docker on servers, VS Code usually recommends the Docker extension, which lets you manage containers in a GUI: view containers/images/networks/volumes, run common commands, and monitor logs.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/00f336449edc63e0dba5ffa2f5c1ccd9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This covers most Docker operations and saves me from using Portainer or the CLI.&lt;/p&gt;
&lt;h3&gt;Git GUI integration&lt;/h3&gt;
&lt;p&gt;VS Code has strong Git GUI integration: view history, compare diffs, switch branches, merge, push, and pull—all in the UI.&lt;/p&gt;
&lt;h3&gt;Rich themes and extensions&lt;/h3&gt;
&lt;p&gt;If you already use VS Code, you can keep your preferred aesthetics. VS Code also has a much richer theme ecosystem than other terminal managers, plus a huge extension marketplace.&lt;/p&gt;
&lt;h3&gt;Other&lt;/h3&gt;
&lt;p&gt;VS Code is cross‑platform, multilingual, and free.&lt;/p&gt;
&lt;h2&gt;How to use VS Code for server management&lt;/h2&gt;
&lt;p&gt;You need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A computer that can run VS Code&lt;/li&gt;
&lt;li&gt;Official VS Code&lt;/li&gt;
&lt;li&gt;SSH keys configured&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh&quot;&gt;Remote SSH extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That’s basically it—the key is the Remote SSH extension.&lt;/p&gt;
&lt;h3&gt;Configure SSH keys&lt;/h3&gt;
&lt;p&gt;Generate SSH keys on your computer and add the public key to your server for passwordless login. You can find guides online for this.&lt;/p&gt;
&lt;h3&gt;Configure Remote SSH&lt;/h3&gt;
&lt;p&gt;After installing Remote SSH via &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh&quot;&gt;this link&lt;/a&gt;, follow these steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click the Remote SSH icon in the lower‑left corner.&lt;/li&gt;
&lt;li&gt;Choose “Connect to Host”.&lt;/li&gt;
&lt;li&gt;Click “Configure SSH Hosts”.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/6e5373285cf66b5e27a5e0226910fc14.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then configure the server IP and user in VS Code. Example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Host server1
    HostName server 1 IP
    User username

Host server2
    HostName server 2 IP
    User username
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After that, you can connect directly from the lower‑left corner.&lt;/p&gt;
&lt;h2&gt;Plugins and recommendations&lt;/h2&gt;
&lt;h3&gt;Monitor Pro&lt;/h3&gt;
&lt;p&gt;Resource monitoring, developed by me.&lt;/p&gt;
&lt;p&gt;Monitor Pro is a real‑time resource monitor that tracks CPU, memory, network, file system, battery percentage, and charging state. It supports custom ordering and refresh intervals and offers high‑usage alerts. Suitable for developers, sysadmins, and general users.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/3a8f65f6452743ca13dbbfca425f0078.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=nexmoe.monitor-pro&quot;&gt;https://marketplace.visualstudio.com/items?itemName=nexmoe.monitor-pro&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Docker extension&lt;/h3&gt;
&lt;p&gt;If you deploy apps in Docker containers, this helps you manage and debug them inside VS Code.&lt;/p&gt;
&lt;h3&gt;Wakatime&lt;/h3&gt;
&lt;p&gt;Track how much time you “slack off” on servers.&lt;/p&gt;
&lt;h3&gt;zsh and &lt;a href=&quot;https://ohmyz.sh/&quot;&gt;ohmyzsh&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;Use &lt;a href=&quot;https://ohmyz.sh/&quot;&gt;ohmyzsh&lt;/a&gt; and its ecosystem to get auto‑completion and correction in your terminal.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Complete Guide to Optimizing CLS (Cumulative Layout Shift)</title><link>https://nexmoe.com/2PRR1J7</link><guid isPermaLink="true">https://nexmoe.com/2PRR1J7</guid><pubDate>Sat, 16 Sep 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;What is layout shift&lt;/h2&gt;
&lt;p&gt;A short video (about a dozen seconds) explains it clearly.&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe id=&quot;video&quot; width=&quot;100%&quot; style=&quot;aspect-ratio:1.29/1;&quot; frameborder=&quot;0&quot; src=&quot;https://www.ixigua.com/iframe/7279408901542380084?autoplay=0&quot; referrerpolicy=&quot;unsafe-url&quot; allowfullscreen=&quot;&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;p&gt;More precisely: layout shift is when content unexpectedly moves on a webpage due to sudden changes. It’s frustrating because it interrupts reading or causes mis‑clicks. Layout shifts are often caused by async resource loading or DOM elements added dynamically. Common causes include images/videos without size, fonts whose fallback render size differs, or third‑party ads/widgets that resize dynamically.&lt;/p&gt;
&lt;p&gt;The painful part is that dev behavior often differs from real user experience: personalized/third‑party content behaves differently in production, test images are already cached in the developer’s browser, and local API calls are extremely fast with almost no latency.&lt;/p&gt;
&lt;h2&gt;What is CLS&lt;/h2&gt;
&lt;p&gt;CLS (Cumulative Layout Shift) is a metric.&lt;/p&gt;
&lt;p&gt;It measures the largest layout shift score across all &lt;strong&gt;unexpected layout changes&lt;/strong&gt; during a page’s lifetime.&lt;/p&gt;
&lt;p&gt;CLS helps address layout shift problems by measuring how often real users experience shifts, enabling developers to take corrective actions.&lt;/p&gt;
&lt;h2&gt;Why optimize CLS&lt;/h2&gt;
&lt;p&gt;Layout shift seriously impacts UX—this is clear from the short video above.&lt;/p&gt;
&lt;p&gt;It often causes accidental clicks, loss of orientation, and user frustration. Users tend to leave quickly, and sometimes it pushes them off the expected flow.&lt;/p&gt;
&lt;p&gt;Optimizing layout shift usually improves user retention and time‑on‑site.&lt;/p&gt;
&lt;p&gt;Yahoo! JAPAN News reduced CLS by 0.2 and got the following results.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/f615ab9aa3a97d41fff1eaf9e5ef24e1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;How to reduce CLS&lt;/h2&gt;
&lt;h3&gt;Reserve space for images and media&lt;/h3&gt;
&lt;p&gt;Always set width/height for images and videos, or reserve space using CSS such as &lt;code&gt;min-height&lt;/code&gt;, &lt;code&gt;aspect-ratio&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe id=&quot;video&quot; width=&quot;100%&quot; style=&quot;aspect-ratio:16/9;&quot; frameborder=&quot;0&quot; src=&quot;https://www.ixigua.com/iframe/7279409280019595776?autoplay=0&quot; referrerpolicy=&quot;unsafe-url&quot; allowfullscreen=&quot;&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;aspect-ratio&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;You can directly specify an element’s aspect ratio.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/d7892d445b9b2d15099ddfc1c7c498cd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/zh-CN/docs/Web/CSS/aspect-ratio&quot;&gt;https://developer.mozilla.org/zh-CN/docs/Web/CSS/aspect-ratio&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Browser support:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/58f468d8cf1851977178ef07cdc558d9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;padding-bottom&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;If you need broader browser support, use the widely accepted “Padding‑Top Hack.” It requires a parent element and an absolutely positioned child. You calculate the aspect ratio as a percentage and set it via &lt;code&gt;padding-top&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;div class=&quot;container&quot;&amp;gt;
  &amp;lt;img class=&quot;media&quot; src=&quot;...&quot; alt=&quot;...&quot;&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;.container {
  position: relative;
  width: 100%;
  padding-top: 56.25%; /* 16:9 Aspect Ratio */
}

.media {
  position: absolute;
  top: 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Use CSS that doesn’t cause shifts&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;transform&lt;/code&gt; works well. Some examples below.
Examples can be found here: &lt;a href=&quot;https://play.tailwindcss.com/26PxFA6UVI&quot;&gt;https://play.tailwindcss.com/26PxFA6UVI&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;zoom&lt;/code&gt; vs &lt;code&gt;transform: scale&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;When &lt;code&gt;zoom&lt;/code&gt; enlarges the page and shifts right, &lt;code&gt;transform: scale&lt;/code&gt; scales in place.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/15eaba18394472deef6100ee48779257.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;margin&lt;/code&gt; vs &lt;code&gt;transform: translate&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;margin&lt;/code&gt; increases the parent size, while &lt;code&gt;transform: translate&lt;/code&gt; only moves the element itself.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/e981f8c8122e8896da63bf31e307621c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;&lt;code&gt;border&lt;/code&gt; vs &lt;code&gt;box-shadow&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;border&lt;/code&gt; expands the parent, while &lt;code&gt;box-shadow&lt;/code&gt; doesn’t.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/78610670a717636f7395dfc11e87cce8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Be careful with lazy loading&lt;/h3&gt;
&lt;p&gt;Lazy loading can cause layout shifts. If you navigate in a long lazy‑loaded list, be careful.
Navigation without animation can mitigate the issue to some extent.&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe id=&quot;video&quot; width=&quot;100%&quot; style=&quot;aspect-ratio:16/9;&quot; frameborder=&quot;0&quot; src=&quot;https://www.ixigua.com/iframe/7279407080174256694?autoplay=0&quot; referrerpolicy=&quot;unsafe-url&quot; allowfullscreen=&quot;&quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h3&gt;Avoid &lt;code&gt;transition: all&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;On initial load or page transitions, &lt;code&gt;transition: all&lt;/code&gt; can cause padding to animate from 0, resulting in layout jitter.&lt;/p&gt;
&lt;p&gt;Painful examples:
&lt;a href=&quot;https://github.com/theme-nexmoe/hexo-theme-nexmoe/commit/8f2e9d89fc1f58f170d58da598b855065be76233&quot;&gt;Commit: table and friends icons jitter&lt;/a&gt;
&lt;a href=&quot;https://github.com/theme-nexmoe/hexo-theme-nexmoe/commit/7771f1f1adc03213fac749535af37fb4523badbd&quot;&gt;Commit: fix navbar jitter&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Element order causing shifts&lt;/h3&gt;
&lt;p&gt;On mobile, the main content is shown first, so the sidebar markup appears after it. On larger screens, CSS &lt;code&gt;order&lt;/code&gt; is used to place the main content in the middle column (second column). Pseudocode:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export default function MainLayout(props) {
  return (
    &amp;lt;Container&amp;gt;
      &amp;lt;Main className={css`@media screen and (min-width: breakpoint) { order: 0 }`} /&amp;gt;
      &amp;lt;Left className={css`@media screen and (min-width: breakpoint) { order: -1 }`} /&amp;gt;
      &amp;lt;Right className={css`@media screen and (min-width: breakpoint) { order: 1 }`} /&amp;gt;
    &amp;lt;/Container&amp;gt;
  )
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On first paint, the browser hasn’t fully parsed the DOM. It knows &lt;code&gt;&amp;lt;Main /&amp;gt;&lt;/code&gt; but not &lt;code&gt;&amp;lt;Left /&amp;gt;&lt;/code&gt; or &lt;code&gt;&amp;lt;Right /&amp;gt;&lt;/code&gt;, so it renders &lt;code&gt;&amp;lt;Main /&amp;gt;&lt;/code&gt; in the first column. Only on the second paint does it move &lt;code&gt;&amp;lt;Main /&amp;gt;&lt;/code&gt; to the second column and render &lt;code&gt;&amp;lt;Left /&amp;gt;&lt;/code&gt; in the first.&lt;/p&gt;
&lt;p&gt;Chrome does not parse HTML in a single pass. It pauses parsing and starts rendering in two cases:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;After reading 65,535 bytes of HTML&lt;/li&gt;
&lt;li&gt;After encountering a &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag and reading ~50 tokens&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;See: &lt;a href=&quot;https://blog.skk.moe/post/fix-blog-cls/&quot;&gt;Optimize blog CLS&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Page navigation and back/forward cache&lt;/h3&gt;
&lt;p&gt;By default, all browsers use bfcache, but some sites are not compatible. For details on testing and identifying blockers, see &lt;a href=&quot;https://web.dev/bfcache/&quot;&gt;bfcache&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After you leave, the page is kept in memory briefly. If you return, it restores exactly as you left it—fully loaded and stable, without any shifts.&lt;/p&gt;
&lt;p&gt;Modern SPAs can also keep layout consistent during route changes. Always keep your nav and table of contents fixed on the page.&lt;/p&gt;
&lt;h3&gt;Fonts&lt;/h3&gt;
&lt;p&gt;Before web fonts load and render, there are typically two approaches:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use a fallback font until the web font loads (FOUT — flash of unstyled text).&lt;/li&gt;
&lt;li&gt;Hide text until the web font loads (FOIT — flash of invisible text).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Both can cause layout shifts. Even when text is invisible, layout is still computed with the fallback font, so once the web font loads, the layout can change just like with FOUT.&lt;/p&gt;
&lt;p&gt;To minimize this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Use &lt;code&gt;font-display: optional&lt;/code&gt; to avoid reflow when the font isn’t available at initial layout.&lt;/li&gt;
&lt;li&gt;Use a close fallback. For example, &lt;code&gt;font-family: &quot;Google Sans&quot;, sans-serif;&lt;/code&gt; ensures a similar sans‑serif fallback. Using only &lt;code&gt;&quot;Google Sans&quot;&lt;/code&gt; will fall back to Chrome’s default (Times), which is a worse match.&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;size-adjust&lt;/code&gt;, &lt;code&gt;ascent-override&lt;/code&gt;, &lt;code&gt;descent-override&lt;/code&gt;, and &lt;code&gt;line-gap-override&lt;/code&gt; to reduce size differences. See &lt;a href=&quot;https://developer.chrome.com/blog/font-fallbacks/&quot;&gt;Improved font fallbacks&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Use the &lt;a href=&quot;https://web.dev/optimize-webfont-loading/#the-font-loading-api&quot;&gt;Font Loading API&lt;/a&gt; to reduce font fetch time.&lt;/li&gt;
&lt;li&gt;Preload critical fonts with &lt;code&gt;&amp;lt;link rel=preload&amp;gt;&lt;/code&gt; so they’re available at first paint.&lt;/li&gt;
&lt;li&gt;Read &lt;a href=&quot;https://web.dev/font-best-practices/&quot;&gt;Best practices for fonts&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Use real skeleton screens&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/6f96f6b9d38c994129bf341e69f9db29.png&quot; alt=&quot;Skeleton screen good/bad examples&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Measuring CLS&lt;/h2&gt;
&lt;h3&gt;Production&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/crux/?utm_source=devtools&quot;&gt;Chrome User Experience Report&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://support.google.com/webmasters/answer/9205520&quot;&gt;Search Console (Core Web Vitals report)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/GoogleChrome/web-vitals&quot;&gt;web-vitals JavaScript library&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Lab / testing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/devtools/&quot;&gt;Chrome DevTools&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.chrome.com/docs/lighthouse/overview/&quot;&gt;Lighthouse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://pagespeed.web.dev/&quot;&gt;PageSpeed Insights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://webpagetest.org/&quot;&gt;WebPageTest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Lighthouse in DevTools&lt;/h3&gt;
&lt;p&gt;You can generate real‑world performance reports for mobile and desktop, along with improvement suggestions.&lt;/p&gt;
&lt;p&gt;Running Lighthouse in DevTools during local development is convenient.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/c25d059d74f8d09ec7e5c9066040f3eb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;PageSpeed Insights&lt;/h3&gt;
&lt;p&gt;This is basically the online Lighthouse.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/8aa6b1d4bacbce2ffb2d374af113a583.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Performance in DevTools&lt;/h3&gt;
&lt;p&gt;The Performance panel records page behavior over time. The timeline includes an “Experience” track that highlights layout shifts and the elements that moved.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/dbb8506a320584821597d7e4e510ea6d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Web Vitals extension&lt;/h3&gt;
&lt;p&gt;Treat the Web Vitals extension as a spot‑check tool rather than a full debugging tool—the Performance panel in DevTools is for that.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/3d73a6efb4ad242754f6b2bd8fcba4bb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;As someone with high standards for my own projects, I’ve often dealt with layout shift optimization and Lighthouse. I just didn’t have a clear CLS concept before. Now I do.&lt;/p&gt;
&lt;p&gt;CLS is a fundamental optimization metric and crucial for UX. Every project should address CLS.&lt;/p&gt;
&lt;p&gt;If you spot any mistakes, please let me know—thanks!&lt;/p&gt;
&lt;h2&gt;References&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/cls/&quot;&gt;https://web.dev/cls/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/optimize-cls&quot;&gt;https://web.dev/optimize-cls&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.google.com/publisher-tag/guides/minimize-layout-shift&quot;&gt;https://developers.google.com/publisher-tag/guides/minimize-layout-shift&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://web.dev/yahoo-japan-news/&quot;&gt;https://web.dev/yahoo-japan-news/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://addyosmani.com/blog/infinite-scroll-without-layout-shifts/&quot;&gt;https://addyosmani.com/blog/infinite-scroll-without-layout-shifts/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.skk.moe/post/fix-blog-cls/&quot;&gt;https://blog.skk.moe/post/fix-blog-cls/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>post</category></item><item><title>Two Hundred Days Later: Thoughts on the Microsoft Edge Extension Contest</title><link>https://nexmoe.com/04HB92</link><guid isPermaLink="true">https://nexmoe.com/04HB92</guid><pubDate>Thu, 13 Apr 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Why Talk About This Contest&lt;/h2&gt;
&lt;p&gt;As an independent participant, I was lucky to win third place (largely luck, though there were some methods too). I cared most about the Microsoft internship opportunity, but I suspect it was canceled because of the tech winter. There was no follow-up at all. Nobody contacted me about internships. I asked the contest staff and asked in the group, but got nothing.&lt;/p&gt;
&lt;h2&gt;Awards&lt;/h2&gt;
&lt;p&gt;Third prize, with 5,000 RMB prize money, 4,000 after tax, plus a bunch of physical prizes. There was also a nice glass trophy. I took my roommates to an all-you-can-eat buffet.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/822a5270a5076b06f69916720f573118.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;The delivery package was huge. Carrying it back to the dorm nearly killed me.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/840c78a24c03c1a6a9d844aea041b642.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Not sure if it was 11.4 kg or 11.4 jin. 11.4 jin shouldn&apos;t be enough to exhaust me, right?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/b89a988ce07d2dc0075be8a0b2e447d8.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/36a5c3135e78df21e64aeb03884b8fbd.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;What Is This Contest&lt;/h2&gt;
&lt;p&gt;Participants developed creative extensions under the big theme of &quot;Changes and Challenges in the Post-Pandemic Era,&quot; focusing on three categories: &quot;Technology improves life,&quot; &quot;Empowering productivity,&quot; and &quot;Diversity &amp;amp; inclusion.&quot; The goal was to build extensions that help us see a wider world.&lt;/p&gt;
&lt;p&gt;The contest website &lt;a href=&quot;https://edgecontest.microsoft.com/index.html&quot;&gt;https://edgecontest.microsoft.com/index.html&lt;/a&gt; is now inaccessible. This suggests it was organized by the Edge China team to enrich the Edge extension ecosystem.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/c86c62aad837b02fdd0a09a822f311a9.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/5296b743cb4f5fb175957f6d669a76c2.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Some Contest Info&lt;/h2&gt;
&lt;p&gt;Below are brief but key details that help with the analysis later.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/3e0d3332cba3fe42d6ec45ecb02171de.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/9c7bd16872336793083987a830682d55.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/f41c5185e32efd2dd0067e56309751ce.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Methods From the Analysis&lt;/h2&gt;
&lt;h3&gt;Lightweight Tech&lt;/h3&gt;
&lt;p&gt;Looking at the four requirements, as a tech generalist I could see: there were basically no technical requirements. In a contest with a tight deadline, it&apos;s hard to do something highly technical. People&apos;s tech ability won&apos;t differ much, so we shouldn&apos;t focus on tech depth.&lt;/p&gt;
&lt;h3&gt;Product Ability&lt;/h3&gt;
&lt;p&gt;Practicality, usability, aesthetics, innovation - this is product ability. I had just started cultivating product skills then, so it was a good chance to test. Product ability is a way to overtake in this contest, because many participants are purely technical, and I couldn&apos;t beat them there.&lt;/p&gt;
&lt;h3&gt;Emphasis on Overall Ability&lt;/h3&gt;
&lt;p&gt;Besides the product, the contest required PPTs, videos, etc. Product output and publishing also add points. This requires execution and marketing ability. I usually read product articles, so I can roughly guess what product judges like to see, and I write accordingly. Also, as a solo participant, a project from planning to launch demands comprehensive abilities.&lt;/p&gt;
&lt;h2&gt;My Project&lt;/h2&gt;
&lt;p&gt;I only learned about the contest a few days before the deadline. A group friend mentioned it. (Thanks a lot, otherwise I wouldn&apos;t have known.)&lt;/p&gt;
&lt;p&gt;I thought: how can I join in a few days? Let&apos;s just do it! But I couldn&apos;t totally slack off, so I did some analysis, which led to the previous section. At the time I wasn&apos;t as detailed, just glanced at the site and made instinctive decisions.&lt;/p&gt;
&lt;p&gt;Next, here&apos;s my contest project and my thinking at the time.&lt;/p&gt;
&lt;h3&gt;Meteor New Tab&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/24e84c202cd49d92dca9541e5cc7f65d.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/82c4bdf8f5ab47ea97ff6067006225b3.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Before That&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/44f9ae7595ab7e92cb86fcfd63f431e0.png/nexmoe&quot; alt=&quot;image&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://xiaoshuapp.com/&quot;&gt;Xiaoshu Student&lt;/a&gt; had a few issues then:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The name wasn&apos;t straightforward enough, making it hard to understand. I was reading lots of literature when naming it, so it was a bit &quot;literary.&quot;&lt;/li&gt;
&lt;li&gt;The UI didn&apos;t feel techy; I wanted a comfortable, Zen feel.&lt;/li&gt;
&lt;li&gt;To give it &quot;spiritual power,&quot; I used some willful slogans and marketing. Not direct enough.&lt;/li&gt;
&lt;li&gt;The design didn&apos;t satisfy minimalism. A tiled layout doesn&apos;t work for everyone.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;My Thoughts at the Time&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;English name, more techy&lt;/li&gt;
&lt;li&gt;More techy UI design&lt;/li&gt;
&lt;li&gt;More straightforward product name&lt;/li&gt;
&lt;li&gt;A more straightforward slogan, instead of conveying a concept&lt;/li&gt;
&lt;li&gt;A more straightforward product description, instead of conveying a concept&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Project Summary&lt;/h3&gt;
&lt;p&gt;Overall, the contest project was a second creation based on Xiaoshu Student. For different markets, build a different product image with a different vibe. Meteor is still maintained today and is growing further away from Xiaoshu Student. I hope these twins can each have their own personality.&lt;/p&gt;
&lt;h2&gt;Overall Summary&lt;/h2&gt;
&lt;p&gt;I think I was very lucky. Contests like this are rare, and the judges were mostly product managers. I had experienced &quot;Internet+&quot; contests before, and the judges didn&apos;t feel like product people. I didn&apos;t fit in there either and only got a school-level prize. The teacher later said my PPT and defense weren&apos;t good enough.&lt;/p&gt;
&lt;p&gt;This contest fit me well, so I was lucky. As a solo participant, I could get this result. If you asked me to do an algorithm contest, I&apos;d probably get nothing.&lt;/p&gt;
&lt;p&gt;I hope there will be more open, diverse contests like this. But I probably won&apos;t get the chance. I&apos;m about to graduate. Looking back at campus life, it wasn&apos;t very exciting - it was so plain.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>New Features! What You Wanted Is Here!</title><link>https://nexmoe.com/1951HNH</link><guid isPermaLink="true">https://nexmoe.com/1951HNH</guid><pubDate>Sun, 19 Feb 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/a9e0dfb376f64bfc455b912b130c0ab7.png/nexmoe&quot; alt=&quot;a9e0dfb376f64bfc455b912b130c0ab7.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Right-click to move cards, search folders while moving&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/7c1feea42323cfb6b1f65e109cc890a2.png/nexmoe&quot; alt=&quot;7c1feea42323cfb6b1f65e109cc890a2.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;More precise than dragging. Faster to move to distant folders.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/74e699e58f9f3536d67e4f9179ddf810.png/nexmoe&quot; alt=&quot;74e699e58f9f3536d67e4f9179ddf810.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Search completion with suggestions while typing&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/89b2e747f0d55525bf1cc74402b6be0c.png/nexmoe&quot; alt=&quot;89b2e747f0d55525bf1cc74402b6be0c.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Also, the search box now auto-collapses when it loses focus 😊&lt;/p&gt;
&lt;h2&gt;Open local files&lt;/h2&gt;
&lt;p&gt;Now you can bookmark PDF files here and open them directly in Xiaoshu Student 🙂&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/0f9fea79fed3d0a1f6f34848a9b9a8af.png/nexmoe&quot; alt=&quot;0f9fea79fed3d0a1f6f34848a9b9a8af.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Flat cards for a cleaner card UI&lt;/h2&gt;
&lt;p&gt;You asked for it, and it&apos;s here.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/467b3b4ce499fbe642a116c4a7989b88.png/nexmoe&quot; alt=&quot;467b3b4ce499fbe642a116c4a7989b88.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;New sharing feature, linked to your account&lt;/h2&gt;
&lt;p&gt;Want to share part of your bookmarks with friends? Easy. Just a few clicks 🚀&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/cc0fa7f79fa660a11979ff43e472e8cd.png/nexmoe&quot; alt=&quot;cc0fa7f79fa660a11979ff43e472e8cd.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then you&apos;ll get a share link and QR code.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;https://store.chainwon.com/bookmarks/63908420e127c076e239&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/d0b59f8d689ddfb98cae80edbf896462.png/nexmoe&quot; alt=&quot;d0b59f8d689ddfb98cae80edbf896462.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Search box auto-focus&lt;/h2&gt;
&lt;p&gt;You can control whether the search box auto-focuses on open.&lt;/p&gt;
&lt;h2&gt;Confirm before clearing all cards&lt;/h2&gt;
&lt;p&gt;No more accidental touches.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/9190f18dd9c16d0b8f7cc9e5df510949.png/nexmoe&quot; alt=&quot;9190f18dd9c16d0b8f7cc9e5df510949.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/2c133700e9743ae20b76c10ce7429b62.png/nexmoe&quot; alt=&quot;2c133700e9743ae20b76c10ce7429b62.png&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Online Study Room, Cyber Study Buddy. Banxue OS1</title><link>https://nexmoe.com/3D6KFQ1</link><guid isPermaLink="true">https://nexmoe.com/3D6KFQ1</guid><pubDate>Sun, 22 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;style&amp;gt;
:root {
--color-primary: #d85036;
}
&amp;lt;/style&amp;gt;&lt;/p&gt;
&lt;p&gt;I built a check-in bot in the group. Everyone is welcome to check in and experience cyber study companionship.&lt;/p&gt;
&lt;h2&gt;Preview&lt;/h2&gt;
&lt;p&gt;{% gallery %}
&lt;img src=&quot;https://i.dawnlab.me/ba130ebe51de9ab19e642145d50b5cd0.jpg/nexmoe&quot; alt=&quot;Automatic stats&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/bdf3437a7bc3e7cbeb42ec1acb248468.jpg/nexmoe&quot; alt=&quot;bdf3437a7bc3e7cbeb42ec1acb248468.jpg&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/5ca2e8ed73b3a060a8dc62326bf1563a.jpg/nexmoe&quot; alt=&quot;Daily report&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/f8e9d755b0bedb97d85ab7baa00b9cbd.jpg/nexmoe&quot; alt=&quot;Weekly report&quot; /&gt;
{% endgallery %}&lt;/p&gt;
&lt;h2&gt;ToDo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] Automatic check-in stats&lt;/li&gt;
&lt;li&gt;[x] Auto announce today&apos;s check-in results at the end of each day&lt;/li&gt;
&lt;li&gt;[x] Auto announce this week&apos;s check-in results at the end of each week&lt;/li&gt;
&lt;li&gt;[x] Auto announce this month&apos;s check-in results at the end of each month&lt;/li&gt;
&lt;li&gt;[x] Check-in reminders&lt;/li&gt;
&lt;li&gt;[ ] Leaderboard&lt;/li&gt;
&lt;li&gt;[ ] Punishment for long-term no check-ins&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Rules&lt;/h2&gt;
&lt;h3&gt;Check-in&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Common English learning apps can be shared directly in the group to auto check-in&lt;/li&gt;
&lt;li&gt;AI recognition success also counts&lt;/li&gt;
&lt;li&gt;Manually send &quot;check-in&quot; in the group to complete check-in&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Reports&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Every day at 23:59, it will automatically report today&apos;s check-in status in the group&lt;/li&gt;
&lt;li&gt;Every Sunday at 23:59, it will automatically report this week&apos;s check-in status in the group&lt;/li&gt;
&lt;li&gt;On the last day of each month at 23:59, it will automatically report this month&apos;s check-in status in the group&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Check-in reminders&lt;/h3&gt;
&lt;p&gt;Meet all conditions below to be reminded:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add the bot as a friend&lt;/li&gt;
&lt;li&gt;No check-in today&lt;/li&gt;
&lt;li&gt;Checked in within the last 3 days&lt;/li&gt;
&lt;li&gt;Every day at 22:00 or 23:00&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Join the group&lt;/h2&gt;
&lt;p&gt;{% gallery %}
&lt;img src=&quot;https://i.dawnlab.me/1e62df52d951e3bb974019e236a54a2d.jpg/nexmoe&quot; alt=&quot;1e62df52d951e3bb974019e236a54a2d.jpg/nexmoe&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/42cc02be9f4e898791f66251e7cd37fc.jpg/nexmoe&quot; alt=&quot;42cc02be9f4e898791f66251e7cd37fc.jpg/nexmoe&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/3c001cc5299e5e39da692ac2dac034fc.jpg/nexmoe&quot; alt=&quot;3c001cc5299e5e39da692ac2dac034fc.jpg/nexmoe&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/332b8d7a22cb3e48c1e647134af8aebc.jpg/nexmoe&quot; alt=&quot;332b8d7a22cb3e48c1e647134af8aebc.jpg/nexmoe&quot; /&gt;
{% endgallery %}&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>2022, A Year Without Memories</title><link>https://nexmoe.com/JNEGYT</link><guid isPermaLink="true">https://nexmoe.com/JNEGYT</guid><pubDate>Mon, 09 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;The Time That Disappeared&lt;/h2&gt;
&lt;p&gt;At the start of the year, winter break was coming. I went home and got a “14+14,” so 2022 lost 28 days. At the end of October I became a secondary close contact, spent 7 days in centralized quarantine, then was locked in the dorm until around Nov 20. After going home, I did another 7 days of home isolation and stayed in a warehouse for 7 days. Then everything opened up. In the big wave of reopening, places like ours could do nothing. To avoid possible healthcare overload, I barely left home at all. Honestly, there wasn’t much reason to go out. When I did the math, 2022 had less than nine months left.&lt;/p&gt;
&lt;h2&gt;So What Did I Do the Rest of the Time?&lt;/h2&gt;
&lt;p&gt;Looking back at all of 2022, there really weren’t many memorable moments. I flipped through my photos and found mostly staying at home and eating. This year was almost entirely unremarkable.&lt;/p&gt;
&lt;h3&gt;The Most Memorable Thing&lt;/h3&gt;
&lt;p&gt;The most memorable thing all year was joining the Microsoft Edge Add-on/Innovator Contest on a group member’s recommendation and placing third. It was said that internships would follow, but half a year passed with no news.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/e0014a33eada08c943bea4807e9cb2a8.png&quot; alt=&quot;e0014a33eada08c943bea4807e9cb2a8.png&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Two Trips Out&lt;/h3&gt;
&lt;p&gt;I only left home or school twice this year.&lt;/p&gt;
&lt;p&gt;The first was during summer break. I went to East Lake in Wuhan to meet online friends. I stayed at a friend’s home for one night. Cycling at East Lake felt very free and relaxing, though exhausting, so I went home the next day. I also visited a cat cafe for the first time.&lt;/p&gt;
&lt;p&gt;{% gallery %}
&lt;img src=&quot;https://i.dawnlab.me/3c7b623234dd53397a7716ae354a8aa0.jpg&quot; alt=&quot;A shop at East Lake&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/744a6b7614423d24a798774ccf23267a.png&quot; alt=&quot;Cat cafe&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/65e8cbc6b62d585530d15dc8dcbda8a2.png&quot; alt=&quot;My friend’s cat&quot; /&gt;
{% endgallery %}&lt;/p&gt;
&lt;p&gt;The second was during the National Day holiday. The school allowed us to take leave under various conditions, so I seized the chance. As a junior, I still wasn’t familiar with Zhengzhou. I just wandered around, ate some food, and it was over.&lt;/p&gt;
&lt;p&gt;{% gallery %}
&lt;img src=&quot;https://i.dawnlab.me/5197f3d770e09138d76060bfdbee7345.png&quot; alt=&quot;Roast lamb leg&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/aaa71db16de796fb4fc23c5f5f2a7358.png&quot; alt=&quot;aaa71db16de796fb4fc23c5f5f2a7358.png&quot; /&gt;
&lt;img src=&quot;https://i.dawnlab.me/21142466ef2218bac6f9f13de0d57f23.png&quot; alt=&quot;21142466ef2218bac6f9f13de0d57f23.png&quot; /&gt;
{% endgallery %}&lt;/p&gt;
&lt;h3&gt;KTV, a Hobby That Started in 2022&lt;/h3&gt;
&lt;p&gt;I used to think KTV was boring, but I went several times this year. I started to feel that KTV lets me vent and briefly forget everything, and it’s a chance to hang out with friends, adding a bit of social life during the pandemic. That’s also when I started learning to sing, though I was mostly just shouting. Recently I caught COVID, kept coughing, and didn’t even want to talk, let alone sing.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/76f233c15835872c818e34755e2a82a7.png&quot; alt=&quot;76f233c15835872c818e34755e2a82a7.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;After Saying All That, Did I Do Almost Nothing?&lt;/h2&gt;
&lt;p&gt;Yes, almost nothing. This was a year without memories. A year from now, maybe I’ll only remember that I joined a contest in 2022, and everything else will be blank.&lt;/p&gt;
&lt;h2&gt;2022 Was&lt;/h2&gt;
&lt;h3&gt;Rushed&lt;/h3&gt;
&lt;p&gt;Both breaks were sudden. There were rumors at school, and I felt a break was coming. Hard to believe, and my roommates didn’t think it would be so abrupt, but the next day we were off.&lt;/p&gt;
&lt;h3&gt;Unconscious&lt;/h3&gt;
&lt;p&gt;To be honest, on Jan 5, 2023 I didn’t even realize 2022 had ended. I only saw it when scrolling through other people’s year-end posts.&lt;/p&gt;
&lt;h2&gt;Past Year-End Posts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://nexmoe.com/WMFCB3.html&quot;&gt;(2021 Year-End) 19, Finding Myself Again: Passion, Courage, and Gratitude - Zheying Qingmeng (nexmoe.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://nexmoe.com/1W4AR7.html&quot;&gt;Farewell 2020! (nexmoe.com)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Friends’ Year-End Posts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://idawnlight.com/2022/2022-the-year/&quot;&gt;2022: The Year | 余光的部落格 (idawnlight.com)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://ancient-pasta-c48.notion.site/2022-27665a9d6b9b4fc789ac2a05ab928888&quot;&gt;2022 年终总结 - 新目标新起点 (notion.site)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>Life Milestones</title><link>https://nexmoe.com/line</link><guid isPermaLink="true">https://nexmoe.com/line</guid><pubDate>Sun, 08 Jan 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Looking back on the past ten years, I’ve always been full of longing for the future, which forced me to give it my all every day. I’m not the kind of person who can just lie flat. Eight years ago, three years ago—if someone had guided me, would I have become someone really impressive? Would my life be more hopeful than it is now?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Oct 2023 - Launched the VS Code plugin Monitor Pro because I set up a mini host as a server. &lt;a href=&quot;https://juejin.cn/post/7287041057291550777&quot;&gt;VS Code Plugin Monitor Pro - Monitor Everything You Care About - Juejin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sep 2023 - Analyzed nginx logs; in a year, Xiaoshu Student’s library service handled 140 million requests.&lt;/li&gt;
&lt;li&gt;Apr 2023 - Finished a student innovation project with a national-level excellent completion and received a 10–20k RMB bonus.&lt;/li&gt;
&lt;li&gt;Jan 2023 - Launched Banxue OS1. The product was simple but in huge demand. With only a tiny bit of SEO, it had strong organic growth. But the API was suppressed by QQ, so it was basically dead.&lt;/li&gt;
&lt;li&gt;Nov 2022 - A project based on Xiaoshu Student entered Microsoft Edge Add-on/Innovator Contest. In a field full of experts, I placed third as a solo participant and received 4,000 RMB after tax. The prize also included a Microsoft internship opportunity. I submitted my preferences and thought I’d get to experience big cities like Beijing, Shanghai, or Suzhou, but there was no follow-up. Friends and family felt it was a real pity. &lt;a href=&quot;https://blog.nexmoe.com/04HB92.html&quot;&gt;https://blog.nexmoe.com/04HB92.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Jul 2022 - The open-source “Explorer Xiaoshu” was integrated into a 360 team’s internal project.&lt;/li&gt;
&lt;li&gt;Apr 2022 - Xiaoshu Student was picked by a teacher to participate in a student innovation project.&lt;/li&gt;
&lt;li&gt;Jan 9, 2022 - Explorer Xiaoshu went live, later recommended by “Chaping” and got a lot of exposure. &lt;a href=&quot;https://mp.weixin.qq.com/s/gXI1NFazcMOnA70FNU3jqg&quot;&gt;One-click switch search platforms! With this plugin I got faster and faster.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Nov 2021 - My first 1,000-star GitHub repo was born: Hexo Theme Nexmoe.&lt;/li&gt;
&lt;li&gt;Sep 2021 - My first software copyright, applied using a high-school project because a friend wanted to farm credits.&lt;/li&gt;
&lt;li&gt;Aug 6, 2021 - Xiaoshu Student launched. It became my main project and helped me meet many people.&lt;/li&gt;
&lt;li&gt;After Apr 2021 - I turned things around, joined multiple teams, and mass-produced software copyrights. Turns out competitions were easy to farm, but those opportunities never came back.&lt;/li&gt;
&lt;li&gt;Apr 2021 - PE 74, military training 67, GPA 3.66, ranked 7th in the major. Failed to transfer into CS. Others joined school competitions; I didn’t. If PE hadn’t dragged me down, I could have transferred based on GPA alone.&lt;/li&gt;
&lt;li&gt;Freshman year 2020 - Learned Go and built something like an App Store for Qingwan Navigation, with reviews, submissions, ratings, history, moderation, SSO users, static assets handling—this was the predecessor of Manyou Yunye. All those features were later removed.&lt;/li&gt;
&lt;li&gt;Aug 2019 - Open-sourced Hexo Theme Nexmoe, which became my first 1,000-star project on GitHub. A Typecho version came soon after, and the community made a Halo version. Some people even used it for their graduation projects. &lt;a href=&quot;https://github.com/theme-nexmoe&quot;&gt;Nexmoe&apos;s Design&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Feb 2019 - Bought a used laptop for 500 RMB and built a full-stack confession wall, later used in a graduation project. &lt;a href=&quot;https://blog.nexmoe.com/2154053968&quot;&gt;PHP &amp;amp; Vue.js Confession Wall&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2019 - Believed MBTI was a great social tool and promoted it to friends. I was sometimes INTP, sometimes ENTP, and eventually mostly ENTP. I’m restless.&lt;/li&gt;
&lt;li&gt;2018 - We also built some public APIs, like this one. &lt;a href=&quot;https://cravatar.cn/&quot;&gt;Cravatar – Public Avatar Service&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2018 - Qingwan Wallpaper site went offline. We launched the Mixcm wallpaper site with friends and got thousands of users on day one. The domain mixcm.com was renewed for 10 years. &lt;a href=&quot;https://staging.v2ex.com/t/461728&quot;&gt;A wallpaper site made by middle school students - V2EX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2017 - A blog theme I made sold for a few thousand RMB; the wallpaper site’s navigation ads made a few hundred.&lt;/li&gt;
&lt;li&gt;Jun 2016 - Qingwan Navigation was a qualified graduation project with an admin backend, CRUD, and user system.&lt;/li&gt;
&lt;li&gt;May 2016 - Qingwan Wallpaper and Qingwan Navigation launched. Qingwan Navigation would accompany me for five years. &lt;a href=&quot;https://blog.nexmoe.com/537283684&quot;&gt;Qingwan Start Page Memoir&lt;/a&gt;. The wallpaper site was based on Cloudreve’s predecessor, and its author guided my programming journey. &lt;a href=&quot;https://cloudreve.org/&quot;&gt;Cloudreve - A hybrid public/private cloud storage system&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;May 1, 2016 - Bought my first programming book, “PHP Bible,” and officially began my programming journey.&lt;/li&gt;
&lt;li&gt;2016 - Submitted my first PR to an open-source project on GitHub. &lt;a href=&quot;https://github.com/itorr/imouto&quot;&gt;GitHub - itorr/imouto: Fast, clear, minimalist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dec 2015 - Built schedule, countdown, and weather apps in Easy Language. &lt;a href=&quot;https://blog.nexmoe.com/20CXF4E&quot;&gt;Things I once wrote in Easy Language&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2014 - My PC couldn’t run LOL, so I played “300 Heroes” (300MB installer). I got into Easy Language by tinkering with third-party tools and made simple skin replacements. I stopped later because I built a decent PC and could play LOL. AMD YES! (Indeed, I haven’t used Intel ever since.)&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>Take Notes with Xiaoshu Student</title><link>https://nexmoe.com/199G3Z</link><guid isPermaLink="true">https://nexmoe.com/199G3Z</guid><pubDate>Sat, 29 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Forgot what a bookmark is for? No worries&lt;/h2&gt;
&lt;p&gt;Now you can add notes to bookmarks and quickly find them in search.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/6581eee54349dd6f10504729882c9bbb.png&quot; alt=&quot;6581eee54349dd6f10504729882c9bbb.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/156b3ffc82c9fb7db94c264e02234507.png&quot; alt=&quot;156b3ffc82c9fb7db94c264e02234507.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/df32a4ceb39438ac86c686fd09188059.png&quot; alt=&quot;df32a4ceb39438ac86c686fd09188059.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Smarter data backup&lt;/h2&gt;
&lt;p&gt;Xiaoshu Student now automatically backs up your data on a schedule. It also records your browser and version for easy recovery.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/b953f3b3f0c45a009807a773703c479b.png&quot; alt=&quot;b953f3b3f0c45a009807a773703c479b.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;New Transparent theme&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/055d40088371f6bb08beffca6ed692a6.png&quot; alt=&quot;055d40088371f6bb08beffca6ed692a6.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The search box now auto-focuses, making it easier to use&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/6baf2722dd26059e463f5f716bcd926e.png&quot; alt=&quot;6baf2722dd26059e463f5f716bcd926e.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Use the keyboard to pick suggested results&lt;/h2&gt;
&lt;p&gt;&amp;lt;a href=&quot;https://www.bilibili.com/video/BV12R4y1Q7VK&quot; target=&quot;_blank&quot;&amp;gt;&amp;lt;video muted autoplay loop src=&quot;https://aw.xiaoshuapp.com/v1/storage/buckets/6332f2dc4f6a02ab09a6/files/635cf0366793f162c8b5/view?project=63007e8594ce26b45d67&quot;&amp;gt;&amp;lt;/video&amp;gt;&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;h2&gt;Upload new wallpapers&lt;/h2&gt;
&lt;p&gt;Now you can upload wallpapers that sync with your account.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/f76cc5d3b740b2aaea875cae355e7f9b.png&quot; alt=&quot;f76cc5d3b740b2aaea875cae355e7f9b.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Drag your folder titles&lt;/h2&gt;
&lt;p&gt;You can now reorder folders by dragging their titles.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/e414cfd155ef53290fc0c3a68df05a03.png&quot; alt=&quot;e414cfd155ef53290fc0c3a68df05a03.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Drag onto screen buttons to group and sort across screens&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/29ba3751ac7b7340b818c4f3eb38f3be.png&quot; alt=&quot;29ba3751ac7b7340b818c4f3eb38f3be.png&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>A New Group Is Born</title><link>https://nexmoe.com/3145B9F</link><guid isPermaLink="true">https://nexmoe.com/3145B9F</guid><pubDate>Sat, 22 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The previous group is gone. If you need anything, contact me on QQ: 776194970&lt;/p&gt;
&lt;p&gt;New group number: 1018234047&lt;/p&gt;
&lt;p&gt;Main topics: tech, anime, films/TV, games, wellness, study&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://speed.moe/image/tNOA&quot;&gt;&lt;img src=&quot;https://i.dawnlab.me/f0973ec4c3b644888495cfcc354e2caa.md.jpg&quot; alt=&quot;f0973ec4c3b644888495cfcc354e2caa.md.jpg&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Major Update: The Powerful Xiaoshu Student New Tab in Version 2.2</title><link>https://nexmoe.com/104SXRZ</link><guid isPermaLink="true">https://nexmoe.com/104SXRZ</guid><pubDate>Fri, 21 Oct 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Love minimalism? Try Minimal Mode or my good brother&lt;/h2&gt;
&lt;p&gt;Clean like the image above, still generated from your bookmarks, no need to add content manually. Learn more: &lt;a href=&quot;https://xiaoshuapp.com/meteor/&quot;&gt;https://xiaoshuapp.com/meteor/&lt;/a&gt;
Minimal Mode is in Settings -&amp;gt; Bookmarks -&amp;gt; Drawer Mode&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/2437f0bbdf2758b379a247f5e9b4d247.png&quot; alt=&quot;Meteor New Tab&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Layout settings to fit more on one screen&lt;/h2&gt;
&lt;p&gt;Settings -&amp;gt; Bookmarks -&amp;gt; Bookmark layout&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/aa6f2c90b8a1ded6e508bcee1e03c19c.png&quot; alt=&quot;aa6f2c90b8a1ded6e508bcee1e03c19c.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Small bar cards, small but powerful&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/8508f3f2e4bf210db044159ab127eb38.png&quot; alt=&quot;8508f3f2e4bf210db044159ab127eb38.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Easily find the folder you want&lt;/h2&gt;
&lt;p&gt;Now search suggestions can include folders. Click to jump to the folder you want.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/00785119705323c6dd42668c47b66975.png&quot; alt=&quot;00785119705323c6dd42668c47b66975.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Data backup&lt;/h2&gt;
&lt;p&gt;Backup data (not bookmark contents) to the cloud and switch versions freely.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/db10458709b8afb5cf5e4f94bb84d14b.png&quot; alt=&quot;db10458709b8afb5cf5e4f94bb84d14b.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Email registration and login&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/a2881600cf38538c4a8cb1315d0bab98.png&quot; alt=&quot;a2881600cf38538c4a8cb1315d0bab98.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Share your search engines&lt;/h2&gt;
&lt;p&gt;Currently only sharing is available; more functions will unlock in future updates.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/fefc82bb8570bcb168b53de9e762a3e5.png&quot; alt=&quot;fefc82bb8570bcb168b53de9e762a3e5.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;New effects system&lt;/h2&gt;
&lt;p&gt;Easier to use, easier to create and share&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/5a49edf50a79685e728891910ce33d15.png&quot; alt=&quot;5a49edf50a79685e728891910ce33d15.png&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>What Is Meteor New Tab? Product Intro and Soul</title><link>https://nexmoe.com/347D5DP</link><guid isPermaLink="true">https://nexmoe.com/347D5DP</guid><pubDate>Sun, 25 Sep 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Hello everyone, we are the Mixcm team. We are honored to win third place in the first Microsoft Edge Extension Contest! I am the only member of the team. My friends call me Zheying Qingmeng or Nexmoe. My slogan is: &quot;Fighting for what I love, and learning to be brave.&quot;&lt;/p&gt;
&lt;h2&gt;Product Introduction&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/2437f0bbdf2758b379a247f5e9b4d247.png/nexmoe&quot; alt=&quot;Based on your bookmarks, automatically organize into tabs so your bookmarks are clear at a glance&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Our product is called Meteor New Tab, and its purpose matches its slogan - make your bookmarks great again. In the post-pandemic era, more people study and work online. Users search online for all kinds of &quot;good resources&quot; and like to bookmark relevant pages. Over time, the speed of bookmarking far exceeds the speed of learning, making pages hard to manage and retrieval very time-consuming. Many high-quality resources are buried at the bottom and never opened again.&lt;/p&gt;
&lt;p&gt;We built this product to help users revive long-neglected bookmarks. It can automatically organize your bookmarks into tabs so everything is clear at a glance.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/04a973a49924546b117fd444c75f68e0.png/nexmoe&quot; alt=&quot;Based on your bookmarks, automatically organize into tabs so your bookmarks are clear at a glance&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;The Soul of the Product&lt;/h2&gt;
&lt;p&gt;We listen to users. The soul of a product comes from the creator and from users. One user praised Meteor New Tab as forward-thinking and said: &quot;Instead of drifting in the information stream, it&apos;s better to ruminate on high-quality content you&apos;ve saved.&quot; Meteor New Tab goes against the times. We stop exhausting you with endless new things in the feed, and instead let you revisit high-quality content you&apos;ve already saved to spark new thoughts and inspiration.&lt;/p&gt;
&lt;p&gt;Another user said: &quot;Awesome. I really don&apos;t want a flashy dial page. I just want to import links quickly and generate simple icons.&quot; Sometimes we need to think about what truly matters to us. What we care about and love has already been saved in our bookmarks. Meteor New Tab is about helping us refocus on ourselves.&lt;/p&gt;
&lt;p&gt;Many other comments and feedback have helped us improve the product. Meteor New Tab has gained more and more &quot;soul,&quot; and we are very grateful for that support.&lt;/p&gt;
&lt;h2&gt;Use Your Bookmarks Better&lt;/h2&gt;
&lt;p&gt;Display multiple folders in parallel so bookmarks become a kanban. Progress bars automatically track your Bilibili and YouTube playback. Your bookmarks can also be your watching dashboard. Sorting shows your recently added bookmarks first. Search helps you quickly find what you want. There are more features waiting to be discovered.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/494b94a805c674601f3c1421c5158bc1.png/nexmoe&quot; alt=&quot;Make bookmarks more than just a knowledge warehouse&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Modern Design, Friendly Experience&lt;/h2&gt;
&lt;p&gt;Protect privacy and security: data doesn&apos;t go through our servers for storage or interaction, achieving true privacy and security.&lt;/p&gt;
&lt;p&gt;Automatically follows system light/dark mode, so you won&apos;t harm your eyes with sudden jumps from black to white at night.&lt;/p&gt;
&lt;p&gt;A product for a new era with new improvements. We listen to users, and you can join us in making Meteor New Tab better.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/add6ff1374b51833cc0c7cce3d76debd.png/nexmoe&quot; alt=&quot;add6ff1374b51833cc0c7cce3d76debd.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Use Software Engineering to Build Better Products&lt;/h2&gt;
&lt;p&gt;We use an incremental development model. It&apos;s suitable for a one-person team like ours. We try our best to pay attention to every user feedback and need, and strictly manage and discuss them before making decisions. We&apos;ll make Meteor New Tab closer to perfection.&lt;/p&gt;
&lt;p&gt;We also keep learning and improving, adopting the latest technologies. We reference DevOps principles to automate development, testing, operations, and deployment. This makes the product more stable and reduces developer workload, maximizing efficiency. We use GitHub&apos;s latest features for version control; use Issues and Projects for requirement management; use GitHub Actions for automatic build and release. We minimize human involvement to make development more efficient.&lt;/p&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://xiaoshuapp.com/meteor/&quot;&gt;https://xiaoshuapp.com/meteor/&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Meteor New Tab - Makes Your Bookmarks Great Again</title><link>https://nexmoe.com/309MG4P</link><guid isPermaLink="true">https://nexmoe.com/309MG4P</guid><pubDate>Sat, 06 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Edge:&lt;a href=&quot;https://microsoftedge.microsoft.com/addons/detail/bopgggdgdhogemdpoepddaakfgfadjal&quot;&gt;https://microsoftedge.microsoft.com/addons/detail/bopgggdgdhogemdpoepddaakfgfadjal&lt;/a&gt;
Chrome:&lt;a href=&quot;https://chrome.google.com/webstore/detail/fefnkaabnkfafmmmopbghgejhnieccpm&quot;&gt;https://chrome.google.com/webstore/detail/fefnkaabnkfafmmmopbghgejhnieccpm&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;My Thoughts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;English name, more techy&lt;/li&gt;
&lt;li&gt;More techy UI design&lt;/li&gt;
&lt;li&gt;More straightforward product name&lt;/li&gt;
&lt;li&gt;A more straightforward slogan, instead of conveying a concept&lt;/li&gt;
&lt;li&gt;A more straightforward product description, instead of conveying a concept&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Product Form&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/abba3f15aef73e184075fc4169d34e24.png/nexmoe&quot; alt=&quot;abba3f15aef73e184075fc4169d34e24.png/nexmoe&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Highlights&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🏄 No need to add one by one: generated from your bookmarks, no extra new tab management&lt;/li&gt;
&lt;li&gt;🛡️ Green, safe, privacy-strong: data comes from your bookmarks, not our server&lt;/li&gt;
&lt;li&gt;💪 Powerful and easy: personalization, search, small features, rich options, status settings&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;From today, make your bookmarks powerful again&lt;/h2&gt;
&lt;p&gt;Parallel folders turn bookmarks into a kanban. Progress tracking gives you the full picture.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/494b94a805c674601f3c1421c5158bc1.png/nexmoe&quot; alt=&quot;494b94a805c674601f3c1421c5158bc1.png/nexmoe&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Micro-innovations&lt;/h2&gt;
&lt;h3&gt;Effects&lt;/h3&gt;
&lt;p&gt;Highly customizable&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/23ae5158b7ae41adf5250ac326452777.png/nexmoe&quot; alt=&quot;23ae5158b7ae41adf5250ac326452777.png/nexmoe&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Kanban, parallel display&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/494b94a805c674601f3c1421c5158bc1.png/nexmoe&quot; alt=&quot;494b94a805c674601f3c1421c5158bc1.png/nexmoe&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Playback progress bar&lt;/h3&gt;
&lt;p&gt;Automatically tracks your Bilibili (already live) and YouTube (not live yet) playback progress.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/494b94a805c674601f3c1421c5158bc1.png/nexmoe&quot; alt=&quot;494b94a805c674601f3c1421c5158bc1.png/nexmoe&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Multiple spaces, switch identity anytime&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/526cfbfce4bf719ba42efe0528c563d4.png/nexmoe&quot; alt=&quot;46b8ec1d47657f89f6e7d4d8dc2e120e.png/nexmoe&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Temporarily use a search engine&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/e602d1822761a7651fd0d4e867c48330.png/nexmoe&quot; alt=&quot;e602d1822761a7651fd0d4e867c48330.png/nexmoe&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Quick directory&lt;/h3&gt;
&lt;p&gt;Quickly locate your bookmarks&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/01a6f1f40b0e2e381a92bf396f48e0eb.png/nexmoe&quot; alt=&quot;01a6f1f40b0e2e381a92bf396f48e0eb.png/nexmoe&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Advanced features for developers&lt;/h3&gt;
&lt;p&gt;Provide unlimited freedom and possibilities&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/46b8ec1d47657f89f6e7d4d8dc2e120e.png/nexmoe&quot; alt=&quot;46b8ec1d47657f89f6e7d4d8dc2e120e.png/nexmoe&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Release Time&lt;/h2&gt;
&lt;p&gt;Within a month.&lt;/p&gt;
&lt;p&gt;Currently participating in the Edge Extension Contest. This contest is very important to me, and only the top 20 win prizes. &lt;strong&gt;Each person can vote twice per day.&lt;/strong&gt; I hope you can support my project. Thank you.
&lt;a href=&quot;https://edgecontest.microsoft.com/worksDetail.html?WorkDataId=a002d0f8-e68a-48c0-a3c4-c7885731bbcd&quot;&gt;https://edgecontest.microsoft.com/worksDetail.html?WorkDataId=a002d0f8-e68a-48c0-a3c4-c7885731bbcd&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/975e2809606f08f559c464dbae2dd3b9.png/nexmoe&quot; alt=&quot;975e2809606f08f559c464dbae2dd3b9.png/nexmoe&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>How Xiaoshu Student Helps Me Study and Outwork My Roommates</title><link>https://nexmoe.com/612NPF</link><guid isPermaLink="true">https://nexmoe.com/612NPF</guid><pubDate>Thu, 10 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Xiaoshu Student is not just a normal homepage or new tab. It is also a great study assistant that has accompanied me through my university life.&lt;/p&gt;
&lt;h2&gt;Track learning progress on &quot;Bilibili University&quot;&lt;/h2&gt;
&lt;p&gt;Bilibili is a video platform, but it has tons of learning resources, so people jokingly call it &quot;Bilibili University.&quot; As a college student and heavy Bilibili user, I often watch tutorials there. These videos usually have many episodes, but Bilibili&apos;s &quot;resume playback&quot; is not very convenient. After bookmarking a series, you still have to manually pick the last episode you watched. So Xiaoshu Student introduced a video progress tracker. When you bookmark a series, Xiaoshu Student automatically updates the bookmark link to record your playback progress.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/a2718c8b2a7df0f8a68fe530bebdc140.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;At the same time, progress is shown as a progress bar, giving you a clearer view of how far you&apos;ve watched. When you bookmark enough videos, Xiaoshu Student becomes your dashboard, letting you see your learning progress from a &quot;god view&quot; with a better overall picture.&lt;/p&gt;
&lt;p&gt;You can also bookmark anime, documentaries, and other Bilibili videos, and Xiaoshu Student will track their playback progress too.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/0450749a7b1ea215455ed2a44615c1b5.png&quot; alt=&quot;Watching anime&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Use shared learning resources from helpful users&lt;/h2&gt;
&lt;p&gt;Even if your bookmarks are empty and you haven&apos;t started building your knowledge system, it&apos;s fine. We have helpful users who shared their bookmarks so everyone doesn&apos;t have to struggle to find high-quality sites.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/9b3aabad38cc197e9021238b72b3455d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;We can use these shared bookmarks to improve our own Xiaoshu Student setup. Keep up with trends, appreciate art, and find handy tools.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/70028e9f14303f6579770f568a51825e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;I hope you can also join the helpful users and bring more epic bookmark collections to everyone.&lt;/p&gt;
&lt;h2&gt;Build a campus portal navigation&lt;/h2&gt;
&lt;p&gt;Quickly open the school sites you need and stay ahead with school information.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/ad927d03e0623e6b3a7d99527704a90e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Develop interests and jump between life and study&lt;/h2&gt;
&lt;p&gt;After saving lots of content and sorting it into folders, you can use the quick directory feature to jump between different areas you follow.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/ec5e3dc6b879499d11563fcbe29eb4bc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;When you&apos;ve been working for a long time and need a break, you can jump to design, admire great works, realize how much you still have to improve, then jump back to studying.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/4abc1a94645fd00730f1f56496c410ec.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;You can also jump to bookmarked documentaries or anime while eating, so you can watch your favorite videos during meals.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/51093cd401abf477a2035845f347349a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Record study reflections and adjust direction&lt;/h2&gt;
&lt;p&gt;Learning is a long process. We can record the process, results, gains, and experiences...&lt;/p&gt;
&lt;p&gt;Recording helps us understand ourselves better and understand our learning direction better.&lt;/p&gt;
&lt;p&gt;Keep moving forward, keep learning, keep changing, keep exploring, keep recording, keep adjusting direction. Then we&apos;ll get one step closer to our goals.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/71a8073209b38aa97c892d893c8abd09.png&quot; alt=&quot;Notes&quot; /&gt;&lt;/p&gt;
&lt;p&gt;^ The note feature is implemented via the flomo API. flomo API requires a flomo membership.&lt;/p&gt;
&lt;p&gt;Xiaoshu Student official site: &lt;a href=&quot;https://xiaoshu.app/&quot;&gt;https://xiaoshu.app/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.dawnlab.me/53a8c7cf3ad77a0f0a456ce2c6afe88a.png&quot; alt=&quot;53a8c7cf3ad77a0f0a456ce2c6afe88a.png&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>(2021 Year-End) 19, Finding Myself Again: Passion, Courage, and Gratitude</title><link>https://nexmoe.com/WMFCB3</link><guid isPermaLink="true">https://nexmoe.com/WMFCB3</guid><pubDate>Sun, 26 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;May there be enough clouds in your life to make a beautiful sunset.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://music.163.com/#/song?id=32069952&quot;&gt;https://music.163.com/#/song?id=32069952&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;👆 Entorevolution, my favorite song when I was younger. I haven’t listened to it in a long time, but recently I started again.&lt;/p&gt;
&lt;h2&gt;Clouds&lt;/h2&gt;
&lt;p&gt;Back in 2017, at 15, I used this sentence as my NetEase Cloud Music signature. It’s still there today.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/image-20211226122242084.png&quot; alt=&quot;image-20211226122242084&quot; /&gt;&lt;/p&gt;
&lt;p&gt;My life has been just like that line. After that, my life was full of clouds, and they nearly crushed me.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/image-20211226122339633.png&quot; alt=&quot;image-20211226122339633&quot; /&gt;&lt;/p&gt;
&lt;p&gt;In 2017, when I just entered high school, I decided to become someone who radiates sunshine—warm like the sun, full of passion—and I truly moved toward that goal. But I didn’t expect that later in life, dark hands would grab me again and again, pulling me in the opposite direction. At the time I was just an ordinary high schooler with a narrow view, naturally believing that everything in school was all of life. Pressure from life and suppression from forces I couldn’t resist crushed me. I thought I was &lt;strong&gt;finished&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/QQ%E5%9B%BE%E7%89%8720210415151427.jpg&quot; alt=&quot;2018 Has Come to an End&quot; /&gt;&lt;/p&gt;
&lt;p&gt;A friend said, “You’ve been in a really bad state lately. Maybe go see a doctor.”&lt;/p&gt;
&lt;p&gt;I became colder and sharper. Back then I believed that only by living in a constant stress response could I face reality.&lt;/p&gt;
&lt;p&gt;After that came the blank years of my life. During that time, I stopped progressing and gave up thinking.&lt;/p&gt;
&lt;h2&gt;Light, Coming In&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/20210207192534.jpg&quot; alt=&quot;Even in a cage, the sky outside is still blue&quot; /&gt;&lt;/p&gt;
&lt;p&gt;👆 Blue sky and white clouds photographed through the classroom window. The view feels like we’re in a cage, yet we can clearly see a beautiful sky.&lt;/p&gt;
&lt;p&gt;Having lost all interest in life, I turned to literature. The line “Heaven gave me talents for a reason; a thousand gold spent will return” became my greatest comfort. Books are like medicine; though they didn’t cure my foolishness, they saved me.&lt;/p&gt;
&lt;p&gt;Later I also read popular science books, which taught me a lot.&lt;/p&gt;
&lt;p&gt;Literature made me braver.&lt;/p&gt;
&lt;p&gt;And of course, the company of family and friends carried my heavy body and mind forward step by step.&lt;/p&gt;
&lt;p&gt;Everyone longs for the sun, but at that moment you were a black hole devouring everything. Yet some people, unafraid, dared to approach you and share their light with you. Aren’t those true friends? In those blank years I made many of the best friends of my life, and also understood the importance of family.&lt;/p&gt;
&lt;p&gt;After those blank years, I arrived at this year.&lt;/p&gt;
&lt;h2&gt;Reflection&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/20210207192531.jpg&quot; alt=&quot;Deep in thought&quot; /&gt;&lt;/p&gt;
&lt;p&gt;👆 The view outside the dorm window on my first day at university, hinting at my hesitation and contemplation in life.&lt;/p&gt;
&lt;p&gt;What kind of person do I want to become?&lt;/p&gt;
&lt;p&gt;Optimistic: Heaven gave me talents for a reason; a thousand gold spent will return.&lt;/p&gt;
&lt;p&gt;Love everything: Love a person, including her flaws. Love a career, including the hardships it brings. &lt;a href=&quot;https://books.nexmoe.com/2021/2HHWYNY.html&quot;&gt;Anxiety: Is Life Really as They Say - Lu Benwei (nexmoe.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Steadfast: &lt;a href=&quot;https://books.nexmoe.com/2021/70XG8S.html&quot;&gt;Eraser - Lu Benwei (nexmoe.com)&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your time is limited, so don’t waste it living someone else’s life. Don’t be trapped by dogma—living with the results of other people’s thinking. Don’t let the noise of others’ opinions drown out your own inner voice. Most importantly, have the courage to follow your heart and intuition. They already know what you truly want to become. Everything else is secondary. — STEVE JOBS&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Brave: Who’s afraid? A bamboo raincoat for a lifetime. &lt;a href=&quot;https://books.nexmoe.com/2021/22DTRZH.html&quot;&gt;Sorry, I Gave Up - Lu Benwei (nexmoe.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/image-20211226122946237.png&quot; alt=&quot;image-20211226122946237&quot; /&gt;&lt;/p&gt;
&lt;p&gt;👆 The subtitle of the blog “Lu Benwei.”&lt;/p&gt;
&lt;p&gt;Romantic: The world won’t satisfy people, so they decide to change it through their own actions. — Lenin&lt;/p&gt;
&lt;p&gt;No matter what disaster comes, as long as life remains, life must go on. — Life Is Beautiful&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/p2533776779.jpg&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;
&lt;p&gt;👆 The final scene of Life Is Beautiful&lt;/p&gt;
&lt;h2&gt;Seeking&lt;/h2&gt;
&lt;p&gt;Constant reflection made me realize how far I had drifted from my original intention, and how far I was from what I once pursued.&lt;/p&gt;
&lt;p&gt;I decided to find myself again. On February 15 of this year, I decided to start my new journey.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/image-20211226115107795.png&quot; alt=&quot;image-20211226115107795&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Finding Myself Again&lt;/h2&gt;
&lt;p&gt;To answer the earlier part: I’m almost there! Over this year, as I set goals and worked toward them step by step, I evolved—maybe you could say my suppressed nature was released. I’m almost there.&lt;/p&gt;
&lt;p&gt;I finally found my lost self. I started to love everything again.&lt;/p&gt;
&lt;p&gt;My friends said:&lt;/p&gt;
&lt;p&gt;“Your eyes are shining again.”&lt;/p&gt;
&lt;p&gt;“I’m so happy for you!”&lt;/p&gt;
&lt;p&gt;“Ha, I’m happy to see you recognized too.”&lt;/p&gt;
&lt;p&gt;“Good!”&lt;/p&gt;
&lt;p&gt;“Really great.”&lt;/p&gt;
&lt;h2&gt;Gratitude&lt;/h2&gt;
&lt;p&gt;All encounters in this world are reunions after long separations. / Everything is the best arrangement.&lt;/p&gt;
&lt;p&gt;Thanks to my parents and friends for their support and companionship. My parents gave me a great deal of trust and the courage to explore. They weren’t like authoritarian families that constrain their kids. In my darkest moments, my parents gave me the greatest support, giving me hope and determination to break through it all. Thanks to my friends for their company; the light they shared kept me from being fully blocked by the clouds on my path, and kept me from despairing over everything.&lt;/p&gt;
&lt;p&gt;Thanks to my past self for not giving up. My self who felt like I’d walked through hell now feels that nothing can defeat me. Thanks to my younger self for finally summoning the courage to recover so quickly. Thanks to myself for always yearning for the light and for always staying true to myself.&lt;/p&gt;
&lt;p&gt;Thanks to the darkness in high school. It made me less afraid of many things. It made me realize how cowardly I used to be—afraid of everything, afraid of loss, afraid of failure, afraid of outcomes. It was this darkness that gave me the courage of a do-or-die resolve.&lt;/p&gt;
&lt;p&gt;Thanks to the computer major transfer rejecting me. It pushed my still-hesitant self to summon courage, make a decision, and embark on a tougher journey.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;To hell with looking back and forth. I don’t want any other road. I’ll only walk this one, even if I end up shattered. I used to always look for retreat routes, thinking there would be a way if I failed, as long as I was alive there was hope. But those retreats weren’t the path I wanted most.&lt;/p&gt;
&lt;p&gt;I won’t keep giving up on myself. I’ll just walk my own road; what do other things have to do with me? All these years, I’ve walked through others’ misunderstanding. What’s a few more years? I believe I’ll reach that moment of light at the end of the tunnel. — &lt;a href=&quot;https://books.nexmoe.com/2021/22DTRZH.html&quot;&gt;Sorry, I Gave Up - Lu Benwei (nexmoe.com)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It’s because of all these things worth thanking that I am who I am now.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/20210207192757.jpg&quot; alt=&quot;1&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/20210207192530.jpg&quot; alt=&quot;Yellow Crane Tower&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;/table&gt;
&lt;p&gt;👆 East Lake and Yellow Crane Tower&lt;/p&gt;
&lt;h2&gt;Hope&lt;/h2&gt;
&lt;p&gt;I hope in the new year I can keep up with your pace, and that by this time next year you’ll still be willing to read my year-end post. I also hope next year, like this year, is full of expectation.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211226-19%E5%B2%81%EF%BC%8C%E6%89%BE%E5%9B%9E%E8%BF%B7%E5%A4%B1%E7%9A%84%E8%87%AA%E5%B7%B1%EF%BC%9A%E7%83%AD%E7%88%B1%E3%80%81%E5%8B%87%E6%95%A2%E4%BB%A5%E5%8F%8A%E6%84%9F%E6%81%A9/image-20211226124821260.png&quot; alt=&quot;image-20211226124821260&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Friends’ Year-End Posts&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://ancient-pasta-c48.notion.site/2021-f233c5e6f5c3415595ef90778fb67f3a&quot;&gt;2021 Year-End Summary - Decluttering and Principles (notion.site)&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Before the Official Release: Introducing Xiaoshu Student Again, Your Next-Gen New Tab</title><link>https://nexmoe.com/3NQD4F</link><guid isPermaLink="true">https://nexmoe.com/3NQD4F</guid><pubDate>Fri, 17 Dec 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We&apos;ve spent so much effort customizing our homepages, but never properly organized our bookmarks.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;Official site: &lt;a href=&quot;https://xiaoshu.app/&quot;&gt;https://xiaoshu.app/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Why&lt;/h2&gt;
&lt;p&gt;There are so many new tab extensions-why make another one?&lt;/p&gt;
&lt;p&gt;It was because one day in the summer, a final outage took down my old project. I suddenly realized it was too much hassle to find a new homepage and move my huge pile of stuff into it. That&apos;s how Xiaoshu Student was born.&lt;/p&gt;
&lt;h2&gt;Not Long Ago&lt;/h2&gt;
&lt;p&gt;Not long ago I released this work on v2: &lt;a href=&quot;https://www.v2ex.com/t/810701&quot;&gt;https://www.v2ex.com/t/810701&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;But back then it was too rough. After many iterations, it&apos;s basically a whole new look.&lt;/p&gt;
&lt;p&gt;So it&apos;s time to reintroduce Xiaoshu Student.&lt;/p&gt;
&lt;h2&gt;Bought a Domain&lt;/h2&gt;
&lt;p&gt;I bought a .app domain, which means I&apos;m more invested.&lt;/p&gt;
&lt;h2&gt;Support for Huge Bookmarks&lt;/h2&gt;
&lt;p&gt;Do you have 1K, 2K, or 5K bookmarks? No worries-Xiaoshu Student will still present them clearly by level!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/20211217-/Snipaste_2021-11-30_16-24-45.png&quot; alt=&quot;Snipaste_2021-11-30_16-24-45&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Powerful Search&lt;/h2&gt;
&lt;p&gt;Supports dozens of search engines, temporary search engines, and recommendations based on your bookmarks while searching.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/20211217-/Snipaste_2021-11-28_11-08-48.png&quot; alt=&quot;Snipaste_2021-11-28_11-08-48&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Bar Cards + flomo&lt;/h2&gt;
&lt;p&gt;Videos and articles you want to bookmark no longer have to pollute your To-Do list. No deadline needed-open it anytime.&lt;/p&gt;
&lt;p&gt;After reading, you can quickly jot down your thoughts in flomo!&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/20211217-/toread.png&quot; alt=&quot;toread&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;See You&lt;/h2&gt;
&lt;p&gt;Next time we meet might be a long while. By then, I believe it will be a brand-new look again.&lt;/p&gt;
&lt;p&gt;The road is long. May we both be well when we meet again.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Xuexitong + Anki: Escape Failing Classes Fast</title><link>https://nexmoe.com/28M7YJG</link><guid isPermaLink="true">https://nexmoe.com/28M7YJG</guid><pubDate>Fri, 26 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;To avoid failing, I wrote a script that exports assignments and in‑class quizzes from Chaoxing Xuexitong to CSV, so you can import into Anki and repeatedly review your mistakes.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;Here’s the tutorial.&lt;/p&gt;
&lt;h2&gt;1. Download and install Anki&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ankichina.net/resource/winAnki/&quot;&gt;Anki 让记忆更轻松 - ankichina&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;2. Download an Anki multiple‑choice template&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://zhangsn.me/anki-awesome-select/&quot;&gt;Anki 选择题模板（单选 + 多选 + 自定义选项） | Half Stack (zhangsn.me)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Double‑click to import the template.&lt;/p&gt;
&lt;h2&gt;3. Export Xuexitong assignments and quiz data&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install Tampermonkey or ScriptCat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Install the “Chaoxing To Csv” script: https://scriptcat.org/script-show-page/219&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Open the assignment or quiz page, click “Download question data”.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211126-%E5%AD%A6%E4%B9%A0%E9%80%9A%E5%8A%A0Anki%E5%85%89%E9%80%9F%E9%80%83%E7%A6%BB%E6%8C%82%E7%A7%91/image-20211126172049922.png&quot; alt=&quot;image-20211126172049922&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;4. Import data into Anki&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Open Anki and click “File”.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211126-%E5%AD%A6%E4%B9%A0%E9%80%9A%E5%8A%A0Anki%E5%85%89%E9%80%9F%E9%80%83%E7%A6%BB%E6%8C%82%E7%A7%91/image-20211126170943239.png&quot; alt=&quot;image-20211126170943239&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Choose “Import”.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Select the file downloaded in step 3.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Choose the template as shown.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211126-%E5%AD%A6%E4%B9%A0%E9%80%9A%E5%8A%A0Anki%E5%85%89%E9%80%9F%E9%80%83%E7%A6%BB%E6%8C%82%E7%A7%91/image-20211127122242076.png&quot; alt=&quot;image-20211127122242076&quot; /&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Click “Import”.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>post</category></item><item><title>A Project Built at 19 with 5 Years of Experience: Xiaoshu Student</title><link>https://nexmoe.com/Y6V6RP</link><guid isPermaLink="true">https://nexmoe.com/Y6V6RP</guid><pubDate>Tue, 16 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Xiaoshu Student is my first project built as a real product. In the summer when I was 19, I went from idea to version 0.0.1 in just two or three days.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;It&apos;s also the successor of Qingwan Start Page (&lt;a href=&quot;https://nexmoe.com/537283684.html&quot;&gt;Qingwan Start Page Memoir - Zheying Qingmeng (nexmoe.com)&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;The introduction is already on the official site, so just check it out: &lt;a href=&quot;https://xiaoshuapp.com/&quot;&gt;Xiaoshu Student - A Bookmarks-based New Tab (nexmoe.com)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;So far, it&apos;s only been 3-4 months since the project started. It&apos;s still in testing and many features aren&apos;t finished yet. If you like trying new things, feel free to give it a try.&lt;/p&gt;
&lt;p&gt;![网页捕获_16-11-2021_203157_shu.nexmoe.com](https://nexmoe.com/images/20211116-19 岁集 5 年经验的项目，小舒同学/网页捕获_16-11-2021_203157_shu.nexmoe.com.jpeg)&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Xiaoshu Student Usability Tests and Reflections</title><link>https://nexmoe.com/ZFDZT7</link><guid isPermaLink="true">https://nexmoe.com/ZFDZT7</guid><pubDate>Sun, 07 Nov 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Xiaoshu Student is the first product I seriously tried to build. This post records the usability tests I ran, the fixes for problems I observed, and some reflections.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;About Xiaoshu&lt;/h2&gt;
&lt;p&gt;We spent so much effort customizing our homepages, but never properly organized our bookmarks. Xiaoshu Student is a convenient, efficient next-gen new tab extension that generates your new tab from your bookmarks. It can be your browser homepage or just your new tab. From now on, you no longer need to manage bookmarks while also maintaining a separate homepage.&lt;/p&gt;
&lt;p&gt;Official site: &lt;a href=&quot;https://xiaoshuapp.com/&quot;&gt;Xiaoshu Student&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Test Setup&lt;/h2&gt;
&lt;p&gt;I opened the official site and let the test subject use it while I observed without giving hints, to see whether they could install and open Xiaoshu Student smoothly.&lt;/p&gt;
&lt;p&gt;If they got stuck for too long and couldn&apos;t proceed, I gave as little guidance as possible.&lt;/p&gt;
&lt;h2&gt;First Test&lt;/h2&gt;
&lt;p&gt;My first subject was quite experienced, since they had used Tampermonkey scripts before.&lt;/p&gt;
&lt;h3&gt;Process&lt;/h3&gt;
&lt;p&gt;They quickly identified their browser and installed the extension.&lt;/p&gt;
&lt;p&gt;However, Edge has a major issue: after you install a new tab extension, Edge disables it and shows a window with a link telling you how to enable it.&lt;/p&gt;
&lt;p&gt;The subject clicked the link smoothly, but then got stuck. The test environment didn&apos;t let them calmly read the article content. After a while I reminded them to read it, and they continued.&lt;/p&gt;
&lt;p&gt;Second issue: after enabling it, they didn&apos;t know what the extension did, so they didn&apos;t think to open a new tab.&lt;/p&gt;
&lt;p&gt;Final issue: Edge popped up the window below, and they instinctively clicked the ×. Fortunately, clicking × doesn&apos;t revert the setting.&lt;/p&gt;
&lt;p&gt;&amp;lt;!-- &lt;img src=&quot;https://xiaoshuapp.com/assets/4.af1a1036.png&quot; alt=&quot;img&quot; /&gt; --&amp;gt;&lt;/p&gt;
&lt;h3&gt;Improvements&lt;/h3&gt;
&lt;p&gt;As my first test subject, they were a fairly &quot;geeky&quot; user, so the flow was mostly smooth. But I still found some shortcomings.&lt;/p&gt;
&lt;p&gt;To address these issues, I created a welcome page in the extension. After installation and enabling, it guides users to open a new tab and click &quot;Keep changes.&quot;&lt;/p&gt;
&lt;p&gt;However, as of Nov 7, 2021 (when I wrote this), the Edge version still hadn&apos;t passed review, so later tests were done without the guide.&lt;/p&gt;
&lt;h2&gt;Second Test&lt;/h2&gt;
&lt;p&gt;The second subject&apos;s process was also smooth, with almost no major problems. It didn&apos;t leave much impression.&lt;/p&gt;
&lt;h3&gt;Process&lt;/h3&gt;
&lt;p&gt;The only problem was the same as with the first subject. I have to say Edge&apos;s design with no primary/secondary buttons wastes a lot of time for new users.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211107-%E5%B0%8F%E8%88%92%E5%90%8C%E5%AD%A6%E7%9A%84%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95%E4%B8%8E%E5%8F%8D%E6%80%9D/image-20211107214540941.png&quot; alt=&quot;image-20211107214540941&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;Improvements&lt;/h3&gt;
&lt;p&gt;This was already addressed in the first test&apos;s improvements.&lt;/p&gt;
&lt;h2&gt;Third Test&lt;/h2&gt;
&lt;p&gt;The first two subjects were so smooth that I was surprised. This third subject surprised me too, but in a different way. They got stuck at every step. Their understanding of computers was almost zero, and before college they had hardly used computers.&lt;/p&gt;
&lt;h3&gt;Process&lt;/h3&gt;
&lt;p&gt;First, they didn&apos;t know what browser they were using-yes, that sad. They got stuck on the four buttons on the homepage for a long time. After I prompted them to look at the icons, they finally chose the correct browser.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211107-%E5%B0%8F%E8%88%92%E5%90%8C%E5%AD%A6%E7%9A%84%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95%E4%B8%8E%E5%8F%8D%E6%80%9D/image-20211107214321649.png&quot; alt=&quot;image-20211107214321649&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Then they clicked in and got stuck again. They didn&apos;t know how to download the extension. For those of us familiar with computers it&apos;s easy, but for them it was total confusion. I have to complain about Microsoft&apos;s design: the &quot;Get&quot; button doesn&apos;t use an accent color, so users who&apos;ve never visited this page get lost. This subject scrolled up and down, tried clicking some accent-colored links, but none were the install path. After guidance they installed successfully.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211107-%E5%B0%8F%E8%88%92%E5%90%8C%E5%AD%A6%E7%9A%84%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95%E4%B8%8E%E5%8F%8D%E6%80%9D/image-20211107214540941.png&quot; alt=&quot;image-20211107214540941&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Unfortunately, they ran into the same problem others did. They didn&apos;t quickly understand Edge&apos;s article, and on the extensions page they didn&apos;t even know which toggle to turn on.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211107-%E5%B0%8F%E8%88%92%E5%90%8C%E5%AD%A6%E7%9A%84%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95%E4%B8%8E%E5%8F%8D%E6%80%9D/image-20211107224900166-16362965409911.png&quot; alt=&quot;image-20211107224900166&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After enabling, they also got stuck at the same points as earlier users.&lt;/p&gt;
&lt;h3&gt;Improvements&lt;/h3&gt;
&lt;p&gt;I changed the browser icons on the official site to colored ones instead of white.&lt;/p&gt;
&lt;p&gt;I improved the welcome page.&lt;/p&gt;
&lt;p&gt;And there are some issues I still can&apos;t solve; maybe I&apos;ll find solutions later.&lt;/p&gt;
&lt;h2&gt;Fourth Test&lt;/h2&gt;
&lt;p&gt;The fourth subject also ran into some of the same problems, but by then the site had a few improvements, so it was smoother. I won&apos;t repeat the same issues.&lt;/p&gt;
&lt;h3&gt;Issues&lt;/h3&gt;
&lt;p&gt;After finishing all steps, it was time to open a new tab. This subject ran into a new issue.&lt;/p&gt;
&lt;p&gt;They had Lenovo PC Manager installed. It forced the new tab to Lenovo&apos;s new tab. I helped manually change it, but that&apos;s not a real solution.&lt;/p&gt;
&lt;p&gt;This test also observed a short usage flow. When customizing wallpapers, images loaded slowly, and the subject thought the unloaded images were just black wallpapers.&lt;/p&gt;
&lt;p&gt;We also tested Xiaoshu Student&apos;s special feature: quick temporary search. We found that adding search engines was not convenient.&lt;/p&gt;
&lt;h3&gt;Improvements&lt;/h3&gt;
&lt;p&gt;Added a loading indicator for images. In the future we&apos;ll optimize loading speed and add lazy loading.&lt;/p&gt;
&lt;p&gt;To highlight the importance of skins, we moved the custom skin feature to the homepage.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211107-%E5%B0%8F%E8%88%92%E5%90%8C%E5%AD%A6%E7%9A%84%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95%E4%B8%8E%E5%8F%8D%E6%80%9D/image-20211107225935081.png&quot; alt=&quot;image-20211107225935081&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Added a custom search engine button.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211107-%E5%B0%8F%E8%88%92%E5%90%8C%E5%AD%A6%E7%9A%84%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95%E4%B8%8E%E5%8F%8D%E6%80%9D/image-20211107231549813.png&quot; alt=&quot;image-20211107231549813&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Fifth Test&lt;/h2&gt;
&lt;p&gt;This subject was similar to the third-very much a beginner.&lt;/p&gt;
&lt;h3&gt;Issues&lt;/h3&gt;
&lt;p&gt;They didn&apos;t know their browser, but after hesitating for a while they instinctively chose the first button, &quot;Edge.&quot; It proved that putting Edge first was the right design choice.&lt;/p&gt;
&lt;p&gt;Then the same issues as above. They also ran into the new tab being locked, like the fourth subject.&lt;/p&gt;
&lt;p&gt;It seems the locked new tab issue needs to be solved.&lt;/p&gt;
&lt;h3&gt;Improvements&lt;/h3&gt;
&lt;p&gt;Solved beginners&apos; choice paralysis.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211107-%E5%B0%8F%E8%88%92%E5%90%8C%E5%AD%A6%E7%9A%84%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95%E4%B8%8E%E5%8F%8D%E6%80%9D/image-20211107233749221.png&quot; alt=&quot;image-20211107233749221&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211107-%E5%B0%8F%E8%88%92%E5%90%8C%E5%AD%A6%E7%9A%84%E5%8F%AF%E7%94%A8%E6%80%A7%E6%B5%8B%E8%AF%95%E4%B8%8E%E5%8F%8D%E6%80%9D/image-20211107234104545.png&quot; alt=&quot;image-20211107234104545&quot; /&gt;&lt;/p&gt;
&lt;p&gt;2021-11-07&lt;/p&gt;
&lt;hr /&gt;
</content:encoded><category>post</category></item><item><title>Qingwan Start Page Memoir</title><link>https://nexmoe.com/537283684</link><guid isPermaLink="true">https://nexmoe.com/537283684</guid><pubDate>Fri, 08 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A template written in PHP, requires a PHP environment to run.&lt;/p&gt;
&lt;p&gt;Written in November 2017.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Github&lt;/h2&gt;
&lt;p&gt;https://github.com/mixcm/template-mixcmWallpaper-v1&lt;/p&gt;
&lt;p&gt;Star welcome.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/github/stars/nexmoe/template-mixcmWallpaper-v1.svg&quot; alt=&quot;stars&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/forks/nexmoe/template-mixcmWallpaper-v1.svg&quot; alt=&quot;forks&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/license/nexmoe/template-mixcmWallpaper-v1.svg&quot; alt=&quot;license&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20171101%E8%A7%85%E6%BC%AB%E8%80%85%E5%A3%81%E7%BA%B8%E7%AB%99%E7%AC%AC%E4%B8%80%E7%89%88%E6%A8%A1%E6%9D%BF/800.jpg&quot; alt=&quot;800&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20171101%E8%A7%85%E6%BC%AB%E8%80%85%E5%A3%81%E7%BA%B8%E7%AB%99%E7%AC%AC%E4%B8%80%E7%89%88%E6%A8%A1%E6%9D%BF/799.jpg&quot; alt=&quot;799&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;2020.3&lt;/h4&gt;
&lt;p&gt;Backend started using Swoole; frontend used Vuetify as the UI framework.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/Snipaste_2020-11-12_17-44-29.png&quot; alt=&quot;Snipaste_2020-11-12_17-44-29&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/Snipaste_2020-11-12_17-44-36.png&quot; alt=&quot;Snipaste_2020-11-12_17-44-36&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/Snipaste_2020-11-12_17-44-44.png&quot; alt=&quot;Snipaste_2020-11-12_17-44-44&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/Snipaste_2020-11-12_17-45-42.png&quot; alt=&quot;Snipaste_2020-11-12_17-45-42&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;2019.10&lt;/h4&gt;
&lt;p&gt;News feed&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/ade62b85c0cef80b85325239bf99463d.png&quot; alt=&quot;ade62b85c0cef80b85325239bf99463d.png&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/1b140a756cd87851ade2b9d3e3573e7a.png&quot; alt=&quot;1b140a756cd87851ade2b9d3e3573e7a.png&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/d233a96d6384c2c17f926239b924b94b.png&quot; alt=&quot;d233a96d6384c2c17f926239b924b94b.png&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;2019.9&lt;/h4&gt;
&lt;p&gt;Switched to Nuxt.js&lt;/p&gt;
&lt;h4&gt;2019.6&lt;/h4&gt;
&lt;p&gt;Support for changing skins&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/aa9d06631f4f991902371d648cb4d239.png&quot; alt=&quot;aa9d06631f4f991902371d648cb4d239.png&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/9639646f613ebe03e0dc2eb9977a3997.png&quot; alt=&quot;9639646f613ebe03e0dc2eb9977a3997.png&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/1236bff4e7428e9f6073b1932de10f1e.png&quot; alt=&quot;1236bff4e7428e9f6073b1932de10f1e.png&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/2333.jpg&quot; alt=&quot;2333&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/psb-1605174139653.jpg&quot; alt=&quot;psb&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;2019.5&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/24ba6bc60beb50ba347c55314b799689.png&quot; alt=&quot;24ba6bc60beb50ba347c55314b799689.png&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;2019.3&lt;/h4&gt;
&lt;p&gt;Third backend version, frontend with Vue + Element, backend with CodeIgniter&lt;/p&gt;
&lt;p&gt;https://github.com/chainwon/chainwon-console-vue-v3&lt;/p&gt;
&lt;p&gt;https://github.com/chainwon/chainwon-console-php-v3http://dev.chainwon.com/&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/Snipaste_2020-11-13_16-16-16.png&quot; alt=&quot;Snipaste_2020-11-13_16-16-16&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/Snipaste_2020-11-13_16-18-34.png&quot; alt=&quot;Snipaste_2020-11-13_16-18-34&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/Snipaste_2020-11-13_16-18-40.png&quot; alt=&quot;Snipaste_2020-11-13_16-18-40&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/Snipaste_2020-11-13_16-18-45.png&quot; alt=&quot;Snipaste_2020-11-13_16-18-45&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/Snipaste_2020-11-13_16-18-51.png&quot; alt=&quot;Snipaste_2020-11-13_16-18-51&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA/Snipaste_2020-11-13_16-18-56.png&quot; alt=&quot;Snipaste_2020-11-13_16-18-56&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded><category>post</category></item><item><title>GitHub Desktop Beginner Tutorial</title><link>https://nexmoe.com/3VXH932</link><guid isPermaLink="true">https://nexmoe.com/3VXH932</guid><pubDate>Thu, 07 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Compared with other platforms, GitHub is quite friendly. It comes with a GUI app so you don’t need to use the command line.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;This tutorial is for my roommate.&lt;/p&gt;
&lt;h2&gt;Register a GitHub account&lt;/h2&gt;
&lt;p&gt;To use GitHub, you need an account.&lt;/p&gt;
&lt;p&gt;Go to &lt;a href=&quot;https://github.com/signup&quot;&gt;Join GitHub · GitHub&lt;/a&gt; and follow the steps. It’s a bit more elaborate than typical sign‑up forms.&lt;/p&gt;
&lt;p&gt;Use a QQ email like &lt;code&gt;23333@qq.com&lt;/code&gt; if you want.&lt;/p&gt;
&lt;p&gt;The wording is simple; if you don’t understand, use your browser’s translator.&lt;/p&gt;
&lt;h2&gt;Download GitHub Desktop&lt;/h2&gt;
&lt;p&gt;Go to &lt;a href=&quot;https://desktop.github.com/&quot;&gt;GitHub Desktop | Simple collaboration from your desktop&lt;/a&gt; to download.&lt;/p&gt;
&lt;p&gt;If the official download is slow, you can get it from Lenovo App Store or similar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007224716977.png&quot; alt=&quot;image-20211007224716976&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Install it like any normal app and open it.&lt;/p&gt;
&lt;h2&gt;Sign in to GitHub&lt;/h2&gt;
&lt;p&gt;The first time you open it, it should prompt you to sign in. Just follow the steps.&lt;/p&gt;
&lt;p&gt;If you don’t see the login, go to File -&amp;gt; Options -&amp;gt; Accounts -&amp;gt; Sign in.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007225242781.png&quot; alt=&quot;image-20211007225242781&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Create a repository (project)&lt;/h2&gt;
&lt;p&gt;“Respiratory” means a storage room—but here we just call it a repository or project.&lt;/p&gt;
&lt;h4&gt;Step 1&lt;/h4&gt;
&lt;p&gt;Click the area inside the red box.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007225657292.png&quot; alt=&quot;image-20211007225657292&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Step 2&lt;/h4&gt;
&lt;p&gt;Click “Add” -&amp;gt; Create new repository…&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007225729470.png&quot; alt=&quot;image-20211007225729470&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Step 3 Fill in project info&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007230230665.png&quot; alt=&quot;image-20211007230230665&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Git ignore can be left empty for now. It stores rules for files to ignore. See &lt;a href=&quot;https://www.jianshu.com/p/a09a9b40ad20&quot;&gt;Git 忽略文件.gitignore 的使用 - 简书&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;License can also be ignored for now. I recommend MIT License. See &lt;a href=&quot;https://www.runoob.com/w3cnote/open-source-license.html&quot;&gt;各种开源协议介绍 | 菜鸟教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After initialization, your project is still only on your computer—not yet on GitHub.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007230939817.png&quot; alt=&quot;image-20211007230939817&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Click “Publish repository” and confirm to upload it to GitHub.&lt;/p&gt;
&lt;p&gt;Uncheck “Keep this code private” if you want others to see it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007231058989.png&quot; alt=&quot;image-20211007231058989&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Write code&lt;/h2&gt;
&lt;p&gt;Click “Show in Explorer” to open the project folder.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007231310119.png&quot; alt=&quot;image-20211007231310119&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Create and edit files in the folder.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007231412713.png&quot; alt=&quot;image-20211007231412713&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Back in GitHub Desktop, you’ll see the changes.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007231523949.png&quot; alt=&quot;image-20211007231523949&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Push your code to GitHub&lt;/h2&gt;
&lt;p&gt;Enter a commit message, then click “Commit to main”.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007231636853.png&quot; alt=&quot;image-20211007231636853&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Click “Push origin” to upload your commit to GitHub.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20211007-GithubDesktop%E7%BA%AF%E8%90%8C%E6%96%B0%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/image-20211007231758317.png&quot; alt=&quot;image-20211007231758317&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Done! 🎉🎉🎉 Congrats on learning the basics of GitHub Desktop.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Issues When Developing Firefox Extensions</title><link>https://nexmoe.com/18RAYEK</link><guid isPermaLink="true">https://nexmoe.com/18RAYEK</guid><pubDate>Tue, 05 Oct 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In theory, extensions built for Chrome can be uploaded to Firefox directly, but you’ll run into a few problems. Here’s a quick summary.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;&lt;code&gt;manifest.json was not found&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;The first time I uploaded a Chrome extension to Firefox, I got &lt;code&gt;manifest.json was not found&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This usually means the uploaded zip doesn’t have &lt;code&gt;manifest.json&lt;/code&gt; at the root. In the incorrect package below, &lt;code&gt;manifest.json&lt;/code&gt; is inside the &lt;code&gt;dist&lt;/code&gt; folder.&lt;/p&gt;
&lt;h2&gt;Missing add-on ID prevents &lt;code&gt;storage.sync&lt;/code&gt;&lt;/h2&gt;
&lt;p&gt;This one took me a long time. There’s almost no discussion online—only the official English docs mention it. As someone weak in English, it was painful.&lt;/p&gt;
&lt;h4&gt;How to fix it&lt;/h4&gt;
&lt;p&gt;You need to add an add‑on ID in &lt;code&gt;manifest.json&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;browser_specific_settings&quot;: {
    &quot;gecko&quot;: {
    	&quot;id&quot;: &quot;{your add-on ID}&quot;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;How to get the add‑on ID&lt;/h4&gt;
&lt;p&gt;Upload the extension to Firefox AMO (the Firefox add‑on store).&lt;/p&gt;
&lt;p&gt;In the extension admin page, go to Technical Information -&amp;gt; &lt;strong&gt;UUID&lt;/strong&gt;. That UUID is the add‑on ID, formatted like &lt;code&gt;{99646b8e-a5b2-4e52-b9ac-c38fcc1f108b}&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You also need the add‑on ID when calling these APIs. More info: &lt;a href=&quot;https://extensionworkshop.com/documentation/develop/extensions-and-the-add-on-id/#when-do-you-need-an-add-on-id&quot;&gt;Extensions and the Add-on ID | Firefox Extension Workshop&lt;/a&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/storage/managed&quot;&gt;&lt;code&gt;storage.managed&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/storage/sync&quot;&gt;&lt;code&gt;storage.sync&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/identity/getRedirectURL&quot;&gt;&lt;code&gt;identity.getRedirectURL&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/Add-ons/WebExtensions/Native_messaging&quot;&gt;Native messaging&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/pkcs11&quot;&gt;&lt;code&gt;pkcs11&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessageExternal&quot;&gt;&lt;code&gt;runtime.onMessageExternal&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onConnectExternal&quot;&gt;&lt;code&gt;runtime.onConnectExternal&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded><category>post</category></item><item><title>Run an Auto Sign-in Script on a Raspberry Pi</title><link>https://nexmoe.com/1M5ZBJX</link><guid isPermaLink="true">https://nexmoe.com/1M5ZBJX</guid><pubDate>Thu, 16 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Because a certain learning platform blocked Tencent Cloud and Alibaba Cloud IPs, I dug out my old Raspberry Pi 3B from 2015 to run the script.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;My Pi isn’t powered 24/7, so I wanted my script to &lt;strong&gt;auto‑start on boot&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I also wanted &lt;strong&gt;Server酱 notifications only when there is a sign‑in&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Flash the system&lt;/h2&gt;
&lt;p&gt;SD cards are rare these days. I finally found a random 8G card at home—good enough. Flashing Raspberry Pi OS is easy now with the official tool.&lt;/p&gt;
&lt;h2&gt;Replace Python2 with Python3&lt;/h2&gt;
&lt;p&gt;I thought I could run the script directly, but the Pi defaulted to Python2. So step two was removing Python2 and using Python3:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo apt remove python # uninstall Python2
sudo apt autoremove # clean Python2
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install python3 # usually already installed
sudo ln -s /usr/bin/python3.7 /usr/bin/python # link Python to Python3
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Clone the script&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;git clone https://hub.fastgit.org/mkdir700/chaoxing_auto_sign.git # GitHub mirror
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Configure and test&lt;/h2&gt;
&lt;p&gt;Edit &lt;code&gt;chaoxing_auto_sign/local/config.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Then in terminal: &lt;code&gt;cd {your path}/chaoxing_auto_sign/local/&lt;/code&gt; and run &lt;code&gt;python main.py timing&lt;/code&gt; to test.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://files.catbox.moe/fuix1y.gif&quot; alt=&quot;gif&quot; /&gt;&lt;/p&gt;
&lt;p&gt;All set—now the main part.&lt;/p&gt;
&lt;h2&gt;Install Screen&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;sudo apt install screen
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Auto‑run on boot&lt;/h2&gt;
&lt;p&gt;Create &lt;code&gt;/home/pi/Desktop/start.sh&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh
 
CreateScreen()
{
        screen -dmS $1
        screen -x -S $1 -p 0 -X stuff &quot;$2&quot;
        screen -x -S $1 -p 0 -X stuff &apos;\n&apos;
}

CreateScreen &quot;chaoxing&quot; &quot;/home/pi/Desktop/chaoxing.sh&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Create &lt;code&gt;/home/pi/Desktop/chaoxing.sh&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#!/bin/sh

cd {your path}/chaoxing_auto_sign/local/
python main.py timing
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Edit rc.local:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo nano /etc/rc.local
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Insert this before &lt;code&gt;exit 0&lt;/code&gt; to run &lt;code&gt;start.sh&lt;/code&gt; at boot:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;su pi -c &quot;exec /home/pi/Desktop/start.sh&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Save with &lt;code&gt;Ctrl+O&lt;/code&gt;, then reboot. After reboot, check:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;screen -r chaoxing
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;(Optional) Notify via Server酱 only on sign‑in&lt;/h2&gt;
&lt;p&gt;2021‑09‑17: Not good at Python. After editing, it seems it doesn’t notify even when sign‑in succeeds.&lt;/p&gt;
&lt;p&gt;&lt;s&gt;By default the script notifies every run, which is too noisy. So I made this change.&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;Modify &lt;code&gt;chaoxing_auto_sign\local\message.py&lt;/code&gt; to:&lt;/s&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;from datetime import datetime

import aiohttp

from config import SERVER_CHAN_SEND_KEY


async def server_chan_send(dataset):
    &quot;&quot;&quot;server 酱将消息推送&quot;&quot;&quot;
    if SERVER_CHAN_SEND_KEY == &apos;&apos;:
        return
    
    msg = (&quot;| 账号 | 课程名 | 签到时间 | 签到状态 |\n&quot;
           &quot;| :----: | :----: | :------: | :------: |\n&quot;)
    msg_template = &quot;|  {}  |  {}  | {}  |    {}    |&quot;
    
    for datas in dataset:
        if datas:
            for data in datas:
                msg += msg_template.format(data[&apos;username&apos;], data[&apos;name&apos;], data[&apos;date&apos;], data[&apos;status&apos;])
                
            params = {
                &apos;title&apos;: msg,
                &apos;desp&apos;: msg
            }
            
            async with aiohttp.ClientSession() as session:
                async with session.request(
                    method=&quot;GET&quot;,
                    url=&quot;https://sctapi.ftqq.com/{}.send?title=messagetitle&quot;.format(SERVER_CHAN_SEND_KEY),
                    params=params
                ) as resp:
                    text = await resp.text()
        else:
            msg = &quot;当前暂无签到任务！\{}&quot;.format(datetime.now().strftime(&apos;%Y年%m月%d日 %H:%M:%D&apos;))
            break
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>post</category></item><item><title>Too Many Ads on the New Tab? Replace It.</title><link>https://nexmoe.com/ZBA0KB</link><guid isPermaLink="true">https://nexmoe.com/ZBA0KB</guid><pubDate>Sun, 05 Sep 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Yep, it&apos;s a very simple browser extension that replaces your new tab page.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;It uses the official hitokoto API. Each time you open a new tab, it fetches a quote automatically.
Great for people who don&apos;t want a fancy new tab, but still want a little something.&lt;/p&gt;
&lt;h2&gt;Stores&lt;/h2&gt;
&lt;p&gt;Firefox: https://addons.mozilla.org/zh-CN/firefox/addon/%E4%B8%80%E8%A8%80-hitokoto-%E6%96%B0%E5%BB%BA%E6%A0%87%E7%AD%BE%E9%A1%B5/&lt;/p&gt;
&lt;p&gt;Chrome: https://chrome.google.com/webstore/detail/keegjkdjgkibioicckjpkocdabpelghf&lt;/p&gt;
&lt;p&gt;Edge: https://microsoftedge.microsoft.com/addons/detail/jcamdhjccfhaboefgimleldjdddkmbpa&lt;/p&gt;
&lt;h2&gt;Open Source&lt;/h2&gt;
&lt;p&gt;Github: https://github.com/nexmoe/hitokoto-newtab&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://files.catbox.moe/fcvgsu.png&quot; alt=&quot;cover&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>I Built a Browser Extension with a Younger Girl</title><link>https://nexmoe.com/26VSD02</link><guid isPermaLink="true">https://nexmoe.com/26VSD02</guid><pubDate>Mon, 30 Aug 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;She had just finished the college entrance exam, and one day she asked if I knew how to write a browser extension. I had just made one myself and hadn&apos;t finished it yet, and I wasn&apos;t very familiar with extension development. But she asked for help, so I helped. In the end, the two of us tinkered for a while and completed this extension.&lt;/p&gt;
&lt;p&gt;If you use this feature, feel free to participate in the open source project and add the search engines you need 💖&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Project Meaning&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Prevent some sites from removing OpenSearch just to chase more traffic (e.g., Bilibili)&lt;/li&gt;
&lt;li&gt;Add OpenSearch for sites that don&apos;t have it&lt;/li&gt;
&lt;li&gt;Save you from manually adding it yourself&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Related Links&lt;/h2&gt;
&lt;p&gt;GitHub: https://github.com/lcandy2/oSearch/
Chrome: https://chrome.google.com/webstore/detail/pejlgjjlbhpbfiiaegahmeahlhbpkglo
Firefox: https://addons.mozilla.org/firefox/addon/osearch
Edge: https://microsoftedge.microsoft.com/addons/detail/fdekeghfifiibfopfnamhegkhhdpdmlo&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;p&gt;Add OpenSearch to sites in the list so the browser can add them as search engines.
After adding, type the site address in the address bar, then press Space or Tab to search quickly.
In Firefox, you need to manually click the site icon with a plus sign to add it to search engines.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://files.catbox.moe/akylvy.png&quot; alt=&quot;oSearch helps you search wikipedia.org via OpenSearch&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://files.catbox.moe/pzn8ns.png&quot; alt=&quot;oSearch helps in adding search engines&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Usage&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://files.catbox.moe/xgyqr3.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://files.catbox.moe/k95w12.png&quot; alt=&quot;2&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>BoTab</title><link>https://nexmoe.com/products/botab</link><guid isPermaLink="true">https://nexmoe.com/products/botab</guid><description>An intelligent browser extension that transforms your bookmark content into beautiful new tab pages and navigation pages with one click, making your saved treasures accessible and your browsing more efficient.</description><pubDate>Fri, 06 Aug 2021 03:01:10 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20260109_Screenshot%202026-01-09%20at%2016.49.29.BjV264hC.png&quot; alt=&quot;BoTab&quot; /&gt;&lt;/p&gt;&lt;p&gt;An intelligent browser extension that transforms your bookmark content into beautiful new tab pages and navigation pages with one click, making your saved treasures accessible and your browsing more efficient.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://botab.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://botab.net/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/botab&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://chrome.google.com/webstore/detail/eldcinofoklpfhaanlhmkmadehfgcnon&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Chrome Store&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://microsoftedge.microsoft.com/addons/detail/epcdbodenmgkmkcimelediefohefachh&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Edge Store&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://botab.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Homepage&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20260109_Screenshot%202026-01-09%20at%2016.49.29.BjV264hC.png" length="1148133" type="image/png"/></item><item><title>Hexo: Previous and Next Posts Within a Category</title><link>https://nexmoe.com/16GQKA4</link><guid isPermaLink="true">https://nexmoe.com/16GQKA4</guid><pubDate>Thu, 15 Jul 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In the “Book” theme, I treat each category as a book, and posts inside the category as chapters.&lt;/p&gt;
&lt;p&gt;In that case, you can’t just use site‑wide posts for previous/next navigation.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;So based on &lt;a href=&quot;https://nexmoe.com/24M130A.html&quot;&gt;Hexo: Output Posts by Category - 折影轻梦 (nexmoe.com)&lt;/a&gt;, I wrote a snippet to output previous/next posts within the same category.&lt;/p&gt;
&lt;p&gt;Here’s the code (comments should make it clear):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;nav class=&quot;post-nav&quot;&amp;gt;
&amp;lt;% site.categories.map(function(category){  %&amp;gt;
    &amp;lt;% page.categories.map(function(page_category){ %&amp;gt;
        &amp;lt;% if(page_category.name == category.name){ %&amp;gt; &amp;lt;!-- Find the matching category --&amp;gt;
            &amp;lt;% let i = 0;%&amp;gt;
            &amp;lt;% category.posts.sort(&apos;-date&apos;).map(function(post){ %&amp;gt;
                &amp;lt;% i++;  %&amp;gt; 
                &amp;lt;% if(post.title == page.title){ %&amp;gt; &amp;lt;!-- Find current post index --&amp;gt;
                    &amp;lt;% let ix = 0;%&amp;gt;
                    &amp;lt;% category.posts.sort(&apos;-date&apos;).map(function(post){ %&amp;gt;
                        &amp;lt;% ix++; %&amp;gt; 
                        
                        &amp;lt;% if(ix == i + 1 &amp;amp;&amp;amp; post.title){ %&amp;gt;  &amp;lt;!-- Previous post --&amp;gt; 
                            &amp;lt;div class=&quot;old&quot;&amp;gt;
                                &amp;lt;span&amp;gt;Previous&amp;lt;/span&amp;gt;
                                &amp;lt;a href=&quot;&amp;lt;%- url_for(post.path) %&amp;gt;&quot;&amp;gt; &amp;lt;%= post.title %&amp;gt;&amp;lt;/a&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;% } %&amp;gt;
                        
                        &amp;lt;% if(ix == i - 1 &amp;amp;&amp;amp; post.title){ %&amp;gt; &amp;lt;!-- Next post --&amp;gt; 
                            &amp;lt;div class=&quot;new&quot;&amp;gt;
                                &amp;lt;span&amp;gt;Next&amp;lt;/span&amp;gt;
                                &amp;lt;a href=&quot;&amp;lt;%- url_for(post.path) %&amp;gt;&quot;&amp;gt; &amp;lt;%= post.title %&amp;gt;&amp;lt;/a&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;% } %&amp;gt;
                        
                    &amp;lt;% }) %&amp;gt;
                &amp;lt;% } %&amp;gt;
            &amp;lt;% }) %&amp;gt;
        &amp;lt;% } %&amp;gt;
    &amp;lt;% })%&amp;gt;
&amp;lt;% }) %&amp;gt;
&amp;lt;/nav&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;My blog is syncing to Tencent Cloud + Community. You’re welcome to join: https://cloud.tencent.com/developer/support-plan?invite_code=28l9ouqqg7vo4&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Why I Designed the &quot;Still Books&quot; Theme</title><link>https://nexmoe.com/32ZTCGQ</link><guid isPermaLink="true">https://nexmoe.com/32ZTCGQ</guid><pubDate>Sat, 05 Jun 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In 2019, I read two books: &lt;em&gt;To Live&lt;/em&gt; and &lt;em&gt;The Miracles of the Namiya General Store&lt;/em&gt;. After that, a seed of love for literature was planted.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;Before this, I had never read any extracurricular literature.&lt;/p&gt;
&lt;p&gt;Mainly because compulsory education Chinese classes crushed me. I grew up believing I was terrible at Chinese, so I shouldn&apos;t even think about reading books.&lt;/p&gt;
&lt;p&gt;After university, I finally had a lot of time to read, so I searched for reading lists and read what I liked.&lt;/p&gt;
&lt;p&gt;I suddenly realized that literature and Chinese class are not the same thing at all.&lt;/p&gt;
&lt;h2&gt;Reading Doesn&apos;t Force Me to Ask What It Means&lt;/h2&gt;
&lt;p&gt;Reading doesn&apos;t force me to analyze what the author is trying to express.&lt;/p&gt;
&lt;p&gt;When we were young, we were taught:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There are a thousand Hamlets in a thousand people&apos;s eyes.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;But Chinese exams only have one correct answer and require us to analyze from every angle.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;But literature tells me who I am.&lt;/strong&gt; I can choose what I like, experience the meaning myself, and find my own reflection in it.&lt;/p&gt;
&lt;h2&gt;Why Read&lt;/h2&gt;
&lt;p&gt;I think the biggest role of reading is to find your own reflection and empathy in books.&lt;/p&gt;
&lt;h2&gt;We Are All on the Same Road&lt;/h2&gt;
&lt;p&gt;No matter what you&apos;re facing or what situation you&apos;re in, there will be someone in a book who&apos;s in the same place.&lt;/p&gt;
&lt;p&gt;You might be Ah Q, always comforting and deceiving yourself.&lt;/p&gt;
&lt;p&gt;You might be hesitating between the moon and sixpence, looking back and forth, trying to build a so-called good life, while the protagonist in the book throws everything away to chase the moon.&lt;/p&gt;
&lt;p&gt;You might be Schopenhauer, having your own ideas about life and feeling out of place, but finding your thoughts mirrored by the author.&lt;/p&gt;
&lt;p&gt;You might be an adult reading &lt;em&gt;The Little Prince&lt;/em&gt;, thinking of your younger self and realizing that you seem to have gotten lost.&lt;/p&gt;
&lt;h2&gt;The &quot;Still Books&quot; Theme&lt;/h2&gt;
&lt;p&gt;Compared to Nexmoe, this theme has fewer shadows, blur, and &lt;a href=&quot;https://nexmoe.com/21R8FYN.html#%E5%A4%9A%E5%BD%A9%E4%B8%8E%E6%97%A0%E9%99%90%E7%9A%84%E5%8F%AF%E8%83%BD&quot;&gt;colorful&lt;/a&gt; colors, but &lt;a href=&quot;https://nexmoe.com/21R8FYN.html#%E5%A4%9A%E5%BD%A9%E4%B8%8E%E6%97%A0%E9%99%90%E7%9A%84%E5%8F%AF%E8%83%BD&quot;&gt;colorfulness&lt;/a&gt; appears in book covers. There aren&apos;t many images; the theme focuses on text most of all.&lt;/p&gt;
&lt;h2&gt;Romanticism Hidden in the Design&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;More thinking, fewer images.&lt;/strong&gt; I believe this theme should carry a sense of romanticism, and also the spirit of a practitioner.&lt;/p&gt;
&lt;p&gt;When you&apos;re young, you&apos;re more idealistic-you believe that if you work hard, your dreams will come true, that everything should move toward the good. You believe everything is fair. But reality isn&apos;t like that.&lt;/p&gt;
&lt;p&gt;After being hit by reality and seeing it clearly, does that mean I should adopt a &quot;can&apos;t beat them, join them&quot; mindset, become a realist, and comfort myself with &quot;that&apos;s just how the world is&quot;?&lt;/p&gt;
&lt;p&gt;The romanticism I believe in &lt;strong&gt;should be courageous&lt;/strong&gt;. It has the courage to face reality, yet &lt;strong&gt;does not give up the pursuit of ideals and beauty&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I believe the &quot;Still Books&quot; theme should carry this romanticism. Less fantasy, more reflection and progress. But still a deep love for life.&lt;/p&gt;
&lt;h2&gt;Why I Designed This Theme&lt;/h2&gt;
&lt;p&gt;After reading the above, it&apos;s easy to understand.&lt;/p&gt;
&lt;p&gt;In short:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Love for books&lt;/li&gt;
&lt;li&gt;Love for words&lt;/li&gt;
&lt;li&gt;Love for thinking&lt;/li&gt;
&lt;li&gt;Love for life&lt;/li&gt;
&lt;/ol&gt;
</content:encoded><category>post</category></item><item><title>Hexo Theme Yet The Books</title><link>https://nexmoe.com/products/hexo-theme-yet-the-books</link><guid isPermaLink="true">https://nexmoe.com/products/hexo-theme-yet-the-books</guid><pubDate>Sat, 22 May 2021 05:11:53 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20240822_4.6gxkpUjr.png&quot; alt=&quot;Hexo Theme Yet The Books&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/hexo-theme-yet-the-books&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20240822_4.6gxkpUjr.png" length="60074" type="image/png"/></item><item><title>焦虑，生活是否真的如他们所说</title><link>https://nexmoe.com/posts/%E7%84%A6%E8%99%91%EF%BC%8C%E7%94%9F%E6%B4%BB%E6%98%AF%E5%90%A6%E7%9C%9F%E7%9A%84%E5%A6%82%E4%BB%96%E4%BB%AC%E6%89%80%E8%AF%B4</link><guid isPermaLink="true">https://nexmoe.com/posts/%E7%84%A6%E8%99%91%EF%BC%8C%E7%94%9F%E6%B4%BB%E6%98%AF%E5%90%A6%E7%9C%9F%E7%9A%84%E5%A6%82%E4%BB%96%E4%BB%AC%E6%89%80%E8%AF%B4</guid><pubDate>Mon, 17 May 2021 10:21:26 GMT</pubDate><content:encoded>&lt;p&gt;继哔哩哔哩发布《我不想做这样的人》后，又有人出来贩卖焦虑了。当然，每个平台的声音都不一样，哔哩哔哩在这个视频下，你能看到的几乎只有唱好的。但在其他平台，你总能看到完全不一样的声音。&lt;/p&gt;
&lt;p&gt;一方面，有人嘲笑，说这些学生还在读书，太天真，没遭受过社会毒打。仿佛自己已经有了很多经验，但只是嘲笑，没有结合自己的经验给出任何建议。深有同感的人纷纷赞同，也一并嘲笑。有意见不一样的，就会被集火。而其他不敢说话的也没经历过的，看了这些除了焦虑，啥也得不到。还有没有经历过，却自以为自己很懂生活艰难困苦的，也会表示赞同，仿佛支持他们贩卖焦虑一样。&lt;/p&gt;
&lt;p&gt;而我就是什么也不懂就自认为未来黑暗的人，我记得几年前我可不是这样的。即使生活很普通没啥乐趣，但也对未来怀抱希望。至少这一点已经让我的生活足够幸福，当然这仅仅是精神上感到的幸福，你也可以认为这是自欺欺人，不过这切切实实的让人幸福，那个时候，失眠与我无关。但后来整个互联网都在贩卖焦虑，我当然也沦为被焦虑淹没的牺牲品。如今我也成为了贩卖焦虑的帮凶，企图淹没少年少女们的期许与理想主义。不过那会我又觉得我是正义的，我认为只有这样才能叫醒那些沉迷于理想之中的人。但如今冷静下来许久又反复思考，又不知道自己做的对不对了。我深切的感受到生活中是十分需要对未来怀有期许，对生活怀有热情之人的。至少，仍然很多人都喜欢和怀有热情的人相处。我也是。所以对于美好与理想的追求，绝不该放弃。即使最后发现生活确实如此，也不该变得冷漠。&lt;/p&gt;
&lt;p&gt;另一方面，有人在大谈决定论。他们说，生活并不是自己能决定的。自己未来做什么，变成什么样，都不是自己能决定的。他们说的十分坚决没有其它缓和的余地，仿佛我们只能躺平，不必做任何无谓的挣扎。&lt;/p&gt;
&lt;p&gt;我也经常看到躺平的人，也时时刻刻准备躺平，加入他们。但每每躺下了一半，又立刻觉得不安，感觉自己必须做点什么。即使我在心底也认为什么也改变不了，但我也必须得做点什么。虽然每次挣扎总是失败的，但我现在仍然认为，即使有一点点挣扎的机会，我也不该放弃这么一点点改变点什么的希望。也许这不过是不甘心，说不定什么时候我就放弃这不甘了。但我相信，绝不会只有些许人有所不甘的。虽然离理想的生活相差甚远，但我认为我们对于美好的向往绝不会消失。&lt;/p&gt;
&lt;p&gt;现在，我对美好生活想象确实不如之前。关于未来的焦虑将我蚕食，让我变得冷漠。如今我需要唤醒自己，即使生活正如他们所说那样，我也要醒了，然后热爱这生活。&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>橡皮擦</title><link>https://nexmoe.com/posts/%E6%A9%A1%E7%9A%AE%E6%93%A6</link><guid isPermaLink="true">https://nexmoe.com/posts/%E6%A9%A1%E7%9A%AE%E6%93%A6</guid><pubDate>Wed, 28 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我有一块橡皮擦，已经用了很久了。与刚买来时不同，他本是棱角分明，没有沾染上丝毫铅笔的墨色。但在长期使用后，已经实在是分不出八个角来——早已变成了几个曲面。有的两个角甚至已经融合在了一起。&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;但唯独有一个角，他与众不同，他仍然还是原来那个样子。事实上，我从未用过他。他就和刚买来的时候那样白净，同样的棱角分明却毫不咯手。这是他天生的美丽，如今这美丽居然一直伴随他活到了现在，实在是不可思议。&lt;/p&gt;
&lt;p&gt;这让我感到了诧异。这种诧异就像是在学校食堂喝皮蛋瘦肉粥时真的喝到了一大块瘦肉，兴奋地要把这消息告诉同学：“这家粥太棒了，居然有肉！“好让他们下次也来这喝粥。&lt;/p&gt;
&lt;p&gt;不知为为什么，我突然想到了一个人。但我实在想不明白为什么一块橡皮擦能让我想到人，这俩分明扯不上什么关系。&lt;/p&gt;
&lt;p&gt;这使我莫名地恐惧了起来，我也不知道我在害怕什么。但我的肉体已经变得迟钝了，仿佛被什么抓住要被拽出去。我赶紧丢下这块橡皮擦，跳到床上去，希望睡一觉就能忘掉那些我想不明白的东西。&lt;/p&gt;
&lt;p&gt;以前我可是一躺就能睡着的，今天不知怎么回事，发生了这么多奇怪的事情，甚至连觉都睡不着了。我在床上思来想去，无端的恐惧也渐渐变成了愤怒。我想，今天非得把这恐惧给毁灭了这日子才能安稳地过下去。我把愤怒指向了那块橡皮擦，今天的一切都是这块橡皮擦引起的。实话说，这块橡皮倒是不咯手，但却让我十分不适。&lt;/p&gt;
&lt;p&gt;我从床上跳到桌边抓起这块橡皮就要让他受到应有的惩戒。而那个特别的棱角仍然在那里，十分显眼。我瞬间明白了，原来这一切都是因为他。我发疯似地把他按在纸上，他硬撑着身子仿佛在做最后的抵抗，但在我的蛮力之下他只得变成碎屑而不复存在。随着他消逝的，还有我的愤怒与恐惧，好像刚刚灭掉的是一生之敌，等着我的生活将一帆风顺、无限美好。&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Hexo: Output Posts by Category</title><link>https://nexmoe.com/24M130A</link><guid isPermaLink="true">https://nexmoe.com/24M130A</guid><pubDate>Thu, 15 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;This article shows how to output posts under a specific category in Hexo.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Questions answered&lt;/h2&gt;
&lt;p&gt;https://www.zhihu.com/question/404351568&lt;/p&gt;
&lt;p&gt;https://segmentfault.com/q/1010000017758828&lt;/p&gt;
&lt;h2&gt;Preface&lt;/h2&gt;
&lt;p&gt;The official helper function &lt;em&gt;list_categories&lt;/em&gt; isn’t enough, so I used the &lt;code&gt;categories&lt;/code&gt; variable directly.&lt;/p&gt;
&lt;p&gt;I haven’t learned Node.js, so this is mostly trial and error.&lt;/p&gt;
&lt;p&gt;I first logged &lt;code&gt;site.categories.data&lt;/code&gt; with &lt;code&gt;console.log()&lt;/code&gt;. It looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/QQ%E5%9B%BE%E7%89%8720210415132439.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;After some tinkering, I found this object is used via &lt;code&gt;map()&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Output category titles&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;% site.categories.map(function(category){  %&amp;gt;
    &amp;lt;h1&amp;gt;&amp;lt;%= category.name %&amp;gt;&amp;lt;/h1&amp;gt;
&amp;lt;% }) %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Output post titles&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;% site.categories.map(function(category){  %&amp;gt;
    &amp;lt;h1&amp;gt;&amp;lt;%= category.name %&amp;gt;&amp;lt;/h1&amp;gt;
    &amp;lt;% category.posts.map(function(post){  %&amp;gt;
		&amp;lt;h2&amp;gt;&amp;lt;%= post.title %&amp;gt;&amp;lt;/h2&amp;gt;
    &amp;lt;% }) %&amp;gt;
&amp;lt;% }) %&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page title&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.date&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page creation date&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://momentjs.com/&quot;&gt;Moment.js&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.updated&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page update date&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;http://momentjs.com/&quot;&gt;Moment.js&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.comments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Whether comments are enabled&lt;/td&gt;
&lt;td&gt;&lt;code&gt;boolean&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.layout&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Layout name&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.content&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full page content&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.excerpt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page excerpt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.more&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Content after the excerpt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Original source path&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.full_source&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full original source path&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.path&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Page URL (without root path). Often used as &lt;code&gt;url_for(post.path)&lt;/code&gt; in themes.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.permalink&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Full page URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.prev&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Previous page. &lt;code&gt;null&lt;/code&gt; if this is the first page.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt; or &lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.next&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Next page. &lt;code&gt;null&lt;/code&gt; if this is the last page.&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt; or &lt;code&gt;null&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.raw&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Raw post content&lt;/td&gt;
&lt;td&gt;???&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.photos&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Post photos (for albums)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;array&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;post.link&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;External link (for link posts)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;string&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded><category>post</category></item><item><title>The Design Philosophy of the Nexmoe Blog Theme</title><link>https://nexmoe.com/21R8FYN</link><guid isPermaLink="true">https://nexmoe.com/21R8FYN</guid><pubDate>Sun, 04 Apr 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://github.com/theme-nexmoe/hexo-theme-nexmoe&quot;&gt;Nexmoe blog theme&lt;/a&gt; is a Hexo-based blog template I wrote. But it&apos;s not just a template. More importantly, it is my work. It is an artwork.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Art&lt;/strong&gt; (Latin: Ars; French/English: Art; Spanish/Portuguese: Arte; German: Kunst) refers to an expressive mode of creating objects, environments, images, actions, or sounds with aesthetic qualities by combining and balancing skills, will, imagination, and experience. It also refers to the human process of expressing perceived and shared feelings of beauty or meaningful emotions and consciousness, and of distilling and presenting personal or collective experiences. &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E8%89%BA%E6%9C%AF#cite_note-Britannica2002-1&quot;&gt;[1]&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Based on the Wikipedia definition above, from my perspective it&apos;s natural to classify my blog theme as an artwork. That&apos;s not to say I think I&apos;m an artist-I&apos;m still far from a real artist. But Nexmoe is absolutely an artwork created wholeheartedly by an ordinary person like me.&lt;/p&gt;
&lt;p&gt;Its artistic value is not only the surface-level feeling of &quot;this theme looks kind of nice,&quot; but the deeper emotions and personal traits embedded within it.&lt;/p&gt;
&lt;p&gt;In fact, many people don&apos;t like my theme because they think it uses too many colors-red as the primary color plus various other colors. They think it isn&apos;t minimal enough. I&apos;m also a minimalist, and I often wonder whether I should remove the extra colors and even go black-and-white. Black-and-white palettes can create themes that are clean, mature, and minimal. Many nights I lay in bed unable to sleep, thinking about this. But in the end I decided against it.&lt;/p&gt;
&lt;h2&gt;The Story of Red&lt;/h2&gt;
&lt;p&gt;The theme uses red as the primary color: RGB 255/78/106. It&apos;s a very intense red, chosen simply to express my &lt;strong&gt;passion and love&lt;/strong&gt;. I once appeared cold on the surface, but inside I was always full of passion. During a period in high school my life was a mess, and I chose to change. I chose to &lt;strong&gt;face my inner self and live&lt;/strong&gt;-to accept my passion openly and stop compromising with the outside world. That&apos;s when the main color of my theme shifted from &lt;strong&gt;pink&lt;/strong&gt; to &lt;strong&gt;red&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;Colorfulness and Infinite Possibilities&lt;/h2&gt;
&lt;p&gt;Besides red, the theme uses many other colors. In fact, I used the seven colors of the rainbow-red, orange, yellow, green, cyan, blue, purple-to express &lt;strong&gt;multifaceted love and infinite possibilities&lt;/strong&gt;. I&apos;m not someone who can focus on just one thing. I can&apos;t become that kind of person. There are so many wonderful things in life-why should I spend every day working on just one? Whether it&apos;s the pure music in Miyazaki films, electronic music, or classical, I love them all. I also love vaporwave, anime theme songs, movie theme songs, folk songs, and even Wang Feng&apos;s music.&lt;/p&gt;
&lt;p&gt;I love many things: anime, movies, American TV, Japanese TV, Korean TV, Chinese TV, as well as Chinese novels, Japanese novels, American novels, and novels from around the world. Romanticism or realism-if it&apos;s well written, I read it.&lt;/p&gt;
&lt;p&gt;Because of insomnia, I research insomnia-related issues-reading books, searching materials, browsing Wikipedia and CNKI.&lt;/p&gt;
&lt;p&gt;Because my health isn&apos;t good enough, I look up information to avoid health problems and seek ways to be healthier.&lt;/p&gt;
&lt;p&gt;I write code, read books and literature, cook, sometimes play badminton, sometimes ride a bike. I love science, literature, art, and life even more.&lt;/p&gt;
&lt;p&gt;Sometimes I think about giving up-giving up many things. I wonder if I&apos;m even suited for anything. There are far more talented programmers; literature is endless; and as for art, I have almost no ability to create. Sometimes I even feel like giving up on life. But in the end, I didn&apos;t give up anything. &lt;strong&gt;Because I love all of this.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Recently I&apos;ve been refining the theme with a &quot;wireless&quot; concept. &quot;Wireless&quot; implies &quot;no boundaries,&quot; and also represents infinite possibilities.&lt;/p&gt;
&lt;h2&gt;Idealism Hidden in the Design&lt;/h2&gt;
&lt;p&gt;The theme background is a blurred image. To me, blur often implies ideals or fantasy. Many things aren&apos;t beautiful enough, but if we blur them, we can believe they are-like skin smoothing in beauty photos.&lt;/p&gt;
&lt;p&gt;Blur also brings a dreamy feeling. In dreams, many things can be beautiful. We often wake up with tears not because of nightmares or fear, but because the beauty in dreams contrasts sharply with reality. I use blur simply to create a sense of beauty.&lt;/p&gt;
&lt;h2&gt;Unrestrained, Firmly Being Myself&lt;/h2&gt;
&lt;p&gt;When I first started this theme project, I decided to open source it. Open source is freedom. No clients, no rules to follow. I only need to follow my heart in design. I often wanted to build a color system so users could better express their feelings and emotions. I never did it, probably because I&apos;m lazy. But if you want to, you can fully modify the theme&apos;s style to match your personality.&lt;/p&gt;
&lt;p&gt;Here are some works I greatly admire:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/cover1.jpg&quot; alt=&quot;cover1&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/cover2.png&quot; alt=&quot;cover2&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;End&lt;/h2&gt;
&lt;p&gt;Perhaps one day the Nexmoe theme&apos;s style will change again. Maybe it&apos;s just that I changed.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>A Concept for Music Emotion Analysis</title><link>https://nexmoe.com/1YPM5C0</link><guid isPermaLink="true">https://nexmoe.com/1YPM5C0</guid><pubDate>Mon, 08 Mar 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;With fewer and fewer ways to relax without smoking, drinking, or gambling, music has become a more important form of entertainment for young people.
&amp;lt;!--more--&amp;gt;
When we listen to music, we first listen to the emotion. And not just music-most artworks are full of emotions.
Sometimes we need music that matches a mood or a scene.
But beyond searching by title, music currently has few other ways to search.
As an average user with an ever-growing playlist, I think music should have more metadata to help search-for example, emotional tags.&lt;/p&gt;
&lt;h2&gt;User Pain Points&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Anyone who loves music and has listened for years will end up with a huge playlist. I&apos;ve saved about 2,000 songs myself.&lt;/li&gt;
&lt;li&gt;Many song titles aren&apos;t in Chinese-they can be in various languages or even symbols. When trying to find a song we once heard, we often have to scan the entire playlist with our eyes (I do this often) and still can&apos;t find it.&lt;/li&gt;
&lt;li&gt;Video creators need music to match a scene&apos;s mood, but searching by vague impressions is very difficult. Sometimes you just can&apos;t find the right track.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Potential User Groups&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Heavy music lovers. Wake up, listen to music; off work, listen to music; exercise, listen to music; sleep, listen to music. Emotion analysis could help provide suitable scenarios for each track.&lt;/li&gt;
&lt;li&gt;Video creators. They need music that matches the atmosphere.&lt;/li&gt;
&lt;li&gt;Remixers. They also need to match music to a mood.&lt;/li&gt;
&lt;li&gt;Everyone. Everyone wants the right atmosphere and emotion.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Existing Similar Examples&lt;/h2&gt;
&lt;h4&gt;Playlist Assistant in NetEase Cloud Music&lt;/h4&gt;
&lt;p&gt;Not sure how it categorizes; it&apos;s not very granular, and the emotion accuracy isn&apos;t high, so it&apos;s not very useful.&lt;/p&gt;
&lt;h4&gt;Smart Playlists in QQ Music&lt;/h4&gt;
&lt;p&gt;This is okay. It analyzes instruments and rough emotions, but still doesn&apos;t feel precise.&lt;/p&gt;
&lt;h2&gt;Possible Implementation Methods&lt;/h2&gt;
&lt;h4&gt;Analyze the Music Itself&lt;/h4&gt;
&lt;p&gt;AI is strong today, so analyzing music isn&apos;t impossible. But it&apos;s likely inaccurate. Right now, I don&apos;t believe AI can truly feel the emotions inside art.&lt;/p&gt;
&lt;h4&gt;Analyze Comments&lt;/h4&gt;
&lt;p&gt;I think this is the method most people don&apos;t consider. At the moment, AI is better at analyzing sentiment in language than in music itself. And there are already many services for text sentiment analysis. I once saw DIYgod use a text sentiment analysis service.&lt;/p&gt;
&lt;h2&gt;Other Music Metadata&lt;/h2&gt;
&lt;p&gt;Instruments and genres should be relatively easy to analyze. If not, we could scrape MOO Music.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Farewell 2020!</title><link>https://nexmoe.com/1W4AR7</link><guid isPermaLink="true">https://nexmoe.com/1W4AR7</guid><pubDate>Sat, 06 Feb 2021 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;The Lunar New Year is almost here, and only now I’m writing my 2020 year-end.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 419485785&lt;/p&gt;
&lt;p&gt;There were many reasons for the delay. But the main reason is that 2020 summaries seem to have been written to death—mostly about the pandemic and misfortunes.&lt;/p&gt;
&lt;p&gt;My first reaction to 2020 was naturally the pandemic and the various misfortunes around me. There was misfortune for all of humanity and for myself. If I listed them all, it would take forever. So this time I decided to write about some of the more positive things that happened to me this year.&lt;/p&gt;
&lt;h3&gt;🎉 Becoming an Adult&lt;/h3&gt;
&lt;p&gt;In January this year, I finally turned 18. I had looked forward to adulthood for a long time. After becoming an adult, there were many things I could do that I couldn’t before—though there were also more hardships.&lt;/p&gt;
&lt;h3&gt;📷 Photography&lt;/h3&gt;
&lt;p&gt;In February, I stayed at home for a long time. I was full of frustration and sadness. I had always wanted a camera, and it felt like the right moment, so I used years of savings to buy a second-hand camera.&lt;/p&gt;
&lt;p&gt;https://nexmoe.tuchong.com/&lt;/p&gt;
&lt;p&gt;{% gallery %}
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192753.jpg&quot; alt=&quot;Starry sky&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192754.jpg&quot; alt=&quot;Yellowstone&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192755.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192756.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192757.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192530.jpg&quot; alt=&quot;Yellow Crane Tower&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192531.jpg&quot; alt=&quot;Deep in thought&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192532.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192533.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192534.jpg&quot; alt=&quot;Even in a cage, the sky outside is still blue&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192535.jpg&quot; alt=&quot;Sunset clouds&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192415.jpg&quot; alt=&quot;A quiet night&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207192416.jpg&quot; alt=&quot;1&quot; /&gt;
{% endgallery %}&lt;/p&gt;
&lt;h3&gt;🐱 Adopting a Cat&lt;/h3&gt;
&lt;p&gt;At the end of April, a friend asked if I wanted to adopt a cat. His friend could no longer keep it, so I adopted it.
At that point, I had already been stuck at home for four months because of the pandemic. The cat’s arrival brought some joy to my life.&lt;/p&gt;
&lt;p&gt;{% gallery %}
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207200054.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207200055.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207200056.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207200057.jpg&quot; alt=&quot;1&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210207200058.jpg&quot; alt=&quot;1&quot; /&gt;
{% endgallery %}&lt;/p&gt;
&lt;h3&gt;🏸 Badminton&lt;/h3&gt;
&lt;p&gt;In May, school finally started and I had a chance to leave home. Everything outside felt like another world. After being shut in for so long, we craved socializing and exercise, like we’d just been released from prison.
It was also then that I started truly playing badminton. At the time I couldn’t even serve, let alone rally. Now at least I can serve.&lt;/p&gt;
&lt;h3&gt;🚅 Solo Trip&lt;/h3&gt;
&lt;p&gt;In August, all Wuhan attractions were free. I had planned back in 2019 to go to Wuhan for a concert in the summer of 2020, so I took a two-day solo trip.
But because of the pandemic, many concerts were canceled, so I only went to one makeshift concert. It wasn’t great and didn’t make me happy. Then I visited Yellow Crane Tower and East Lake—East Lake is truly beautiful.&lt;/p&gt;
&lt;h3&gt;📕 Reading&lt;/h3&gt;
&lt;p&gt;After finishing my first book in 2019, I started reading more and more in 2020. I read the following books in 2020:&lt;/p&gt;
&lt;p&gt;{% gallery width:130 %}
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208204113.jpg&quot; alt=&quot;The Catcher in the Rye&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208204321.jpg&quot; alt=&quot;The Little Prince&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208204348.jpg&quot; alt=&quot;Encountering the Real Self&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208204412.jpg&quot; alt=&quot;The True Story of Ah Q&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208203825.jpg&quot; alt=&quot;My Memories of Old Beijing&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208203319.jpg&quot; alt=&quot;The Moon and Sixpence&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208204112.jpg&quot; alt=&quot;Wandering (unfinished)&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208203318.jpg&quot; alt=&quot;Fortress Besieged&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208162454.jpg&quot; alt=&quot;Andersen’s Fairy Tales (unfinished)&quot; /&gt;
{% endgallery %}&lt;/p&gt;
&lt;p&gt;{% gallery width:130 %}
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208204732.jpg&quot; alt=&quot;Steve Jobs (unfinished)&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208204736.jpg&quot; alt=&quot;The Road Less Traveled: A New Psychology of Love, Traditional Values and Spiritual Growth&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208204733.jpg&quot; alt=&quot;Your First Book of Philosophy&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208204734.jpg&quot; alt=&quot;The Worth of Life&quot; /&gt;
&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/20210208204735.jpg&quot; alt=&quot;How to Read a Book (unfinished)&quot; /&gt;
{% endgallery %}&lt;/p&gt;
&lt;h3&gt;🎵 Music&lt;/h3&gt;
&lt;p&gt;This year I got deeply into classical music; Chopin is amazing.
http://music.163.com/playlist?id=5202011193&lt;/p&gt;
&lt;p&gt;On the last night of 2020, I still didn’t realize the year was about to end, until the TV’s New Year countdown began. I said to myself, “Ah, so 2020 really is over—I didn’t even feel it ending.”&lt;/p&gt;
&lt;p&gt;After that, the unknown 2021 began.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Adventure Puzzle Game “Inside”</title><link>https://nexmoe.com/2875R7S</link><guid isPermaLink="true">https://nexmoe.com/2875R7S</guid><pubDate>Fri, 25 Dec 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It seems to be a story about a little boy used as an experiment trying to escape a desolate island?&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;This post was written on June 29, 2017, refreshed on Dec 25, 2020. “Inside” was free for one day on Epic today.&lt;/p&gt;
&lt;h4&gt;Wikipedia Summary&lt;/h4&gt;
&lt;p&gt;“Inside” is a puzzle-platformer in which players control an unnamed boy in a red shirt exploring a surreal, mostly monochrome 2.5D world with occasional splashes of color. Players can walk, run, swim, climb, and interact with objects. Midway through the game, the boy gains the ability to mind-control bodies to solve puzzles. If players fail to solve certain puzzles in time—such as being hit by a hunter’s tranquilizer dart, caught or eaten by dogs, or drowning—the boy dies. Like “Limbo,” the boy’s death is depicted with unsettling animation, and the game restarts from the nearest checkpoint. Some scenes contain hidden rooms with small orbs; if all orbs are deactivated during play, a secret ending is unlocked.&lt;/p&gt;
&lt;h4&gt;Why I Bought Inside&lt;/h4&gt;
&lt;p&gt;During a summer sale of some finance app, I heard “Inside” was good, so I bought it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Inside-On-Steam/2558894065.jpg&quot; alt=&quot;snipaste20170629_200846.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Inside-On-Steam/2086727857.jpg&quot; alt=&quot;QQ 图片 20170629193634.jpg&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;The Normal Ending&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Inside-On-Steam/2786353902.jpg&quot; alt=&quot;QQ 图片 20170629200418.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Inside-On-Steam/3499546740.jpg&quot; alt=&quot;QQ 图片 20170629200446.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This blob of flesh seems to be formed by many experimental subjects like the boy? What makes the game thought-provoking is:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It looks like a puzzle game about escaping a deserted island, but in the end you were just a test subject designed by others, and you still die.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;The Hidden Ending&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Inside-On-Steam/1231865740.jpg&quot; alt=&quot;QQ 图片 20170629193706.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Inside-On-Steam/2546249919.jpg&quot; alt=&quot;QQ 图片 20170629193651.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Inside-On-Steam/3702936062.jpg&quot; alt=&quot;QQ 图片 20170629193657.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;This ending is similar. The boy fails to escape the island. When he pulls the main power, he realizes he is just another experimental subject—no power means no life source.&lt;/p&gt;
&lt;h4&gt;My Takeaway&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Inside-On-Steam/381662671.jpg&quot; alt=&quot;QQ 图片 20170629200353.jpg&quot; /&gt;&lt;/p&gt;
&lt;p&gt;From knowing nothing at the start to learning the truth step by step, you realize the early struggle was meaningless.&lt;/p&gt;
&lt;h4&gt;Some Chilling Thoughts&lt;/h4&gt;
&lt;p&gt;What’s scary is that when the boy controls Experimental Subject #1, Subject #1 can also control Subject #2. So if you’re controlling your computer, who’s controlling you?&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>愿你出走半生，归来仍是麦田里的孩子</title><link>https://nexmoe.com/posts/%E6%84%BF%E4%BD%A0%E5%87%BA%E8%B5%B0%E5%8D%8A%E7%94%9F%EF%BC%8C%E5%BD%92%E6%9D%A5%E4%BB%8D%E6%98%AF%E9%BA%A6%E7%94%B0%E9%87%8C%E7%9A%84%E5%AD%A9%E5%AD%90</link><guid isPermaLink="true">https://nexmoe.com/posts/%E6%84%BF%E4%BD%A0%E5%87%BA%E8%B5%B0%E5%8D%8A%E7%94%9F%EF%BC%8C%E5%BD%92%E6%9D%A5%E4%BB%8D%E6%98%AF%E9%BA%A6%E7%94%B0%E9%87%8C%E7%9A%84%E5%AD%A9%E5%AD%90</guid><pubDate>Sun, 29 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;——《麦田里的守望者》书评&lt;/p&gt;
&lt;p&gt;一开始看这本书，我摸不着脑袋，因为我会看了很久很久却不知道他的主题是什么。他也没有目录啥的，就简单的分成了二十六章，每一章标题就是序数词。&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;先简单介绍一下本书内容，本文的主人公霍尔顿出身于一个富裕的家庭。大人们强迫他好好读书，为的是出人头地，而在学校里一天到晚干的，就是谈女人，酒和性，他看不惯周围的一切，他讨厌任何人。如果你跟他说诸如“祝你好运”，“你好”之类的客套话，他会觉得你虚伪。根本没心思读书，还老是挨罚，他胆小怯懦，到他第四次被开除时，他不敢回家。便一个人去了纽约，住小客店，逛夜总会，召妓女，与他虚荣的女友搂搂抱抱，与此同时，他又十分沮丧，企图逃出虚伪的世界去追寻纯洁与真理。他想逃离这虚伪的地方，去到别的地方，最后被妹妹所挽留。&lt;/p&gt;
&lt;p&gt;最开始能读下去这本书，不过是能从中找到同感。也同样讨厌着周围虚伪的一切，讨厌客套的话，讨厌着被别人认为理所当然正确的事情。每个人在从小孩子到成年的过程中都似乎曾经经历过这一阶段，他们被未知的世界吸引，突然闯到成年人的世界，却又渐渐的开始厌倦这无法被自己理解的世界。&lt;/p&gt;
&lt;p&gt;对于刚刚成年，内心却不过还是个孩子的人来说，成年人的世界让他们一时无法接受。文章主人公曾经的老师说：”一个不成熟的人的标志是他愿意为了某个理由而轰轰烈烈地死去，而一个成熟的人的标志是他愿意为了某个理由而谦恭地活下去。“这是作者通过老师这一角色来解释从幼稚到成熟的这一蜕变过程。而对于绝大多未经世事的人来说，这显然是很难接受的。&lt;/p&gt;
&lt;p&gt;“我的职务是在那儿守望，要是有哪个孩子往悬崖边奔来，我就把他捉住——我是说孩子们都在狂奔，也不知道自己是在往哪儿跑，我得从什么地方出来，把他们捉住。我整天就干这样的事。我只想当个麦田里的守望者。我知道这有点异想天开，可我真正喜欢干的就是这个”小说写到这里，才真正的表示出了它的主旨，主人公想在麦田里守望着，防止纯洁的内心受到污染。对于任何一个刚刚成年的人来说，都是难以接受突然的蜕变的。《熔炉》也曾经表达过“我们努力奋斗不是为了改变世界，而是不让世界改变我们。”人活着除了物质生活外，还要有精神生活，而且在一个比较富裕的社会里，精神生活往往比物质生活更为重要。&lt;/p&gt;
&lt;p&gt;特别对于现在这个经济高速发展的社会中，我们更需要追求精神的真善美，而不是不断追求物质。在社会发展的过程中，我们得固守自己人性中的善良，不被社会所改变。&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Things I Once Made with Easy Language</title><link>https://nexmoe.com/20CXF4E</link><guid isPermaLink="true">https://nexmoe.com/20CXF4E</guid><pubDate>Fri, 13 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;It was December 2015, I was in middle school (7th grade). Easy Language was popular then. I got into it through the game “300 Heroes.” Even back then, my unique ideas about design and UI started to show.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;The UI in Easy Language relied entirely on Photoshop-drawn components, so I started learning Photoshop then.&lt;/p&gt;
&lt;p&gt;I hadn’t really touched the internet yet; I just liked to tinker. In 2015 I also learned a bit of video editing and cut some videos nobody watched. I even built a forum.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/20201113-%E6%9B%BE%E7%BB%8F%E7%94%A8%E6%98%93%E8%AF%AD%E8%A8%80%E5%86%99%E8%BF%87%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF/e.gif&quot; alt=&quot;e&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/20201113-%E6%9B%BE%E7%BB%8F%E7%94%A8%E6%98%93%E8%AF%AD%E8%A8%80%E5%86%99%E8%BF%87%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF/q.png&quot; alt=&quot;q&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/20201113-%E6%9B%BE%E7%BB%8F%E7%94%A8%E6%98%93%E8%AF%AD%E8%A8%80%E5%86%99%E8%BF%87%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF/a.png&quot; alt=&quot;a&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/20201113-%E6%9B%BE%E7%BB%8F%E7%94%A8%E6%98%93%E8%AF%AD%E8%A8%80%E5%86%99%E8%BF%87%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF/z.gif&quot; alt=&quot;z&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/20201113-%E6%9B%BE%E7%BB%8F%E7%94%A8%E6%98%93%E8%AF%AD%E8%A8%80%E5%86%99%E8%BF%87%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF/c.png&quot; alt=&quot;c&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/20201113-%E6%9B%BE%E7%BB%8F%E7%94%A8%E6%98%93%E8%AF%AD%E8%A8%80%E5%86%99%E8%BF%87%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF/g.png&quot; alt=&quot;g&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/20201113-%E6%9B%BE%E7%BB%8F%E7%94%A8%E6%98%93%E8%AF%AD%E8%A8%80%E5%86%99%E8%BF%87%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF/iu.gif&quot; alt=&quot;iu&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/20201113-%E6%9B%BE%E7%BB%8F%E7%94%A8%E6%98%93%E8%AF%AD%E8%A8%80%E5%86%99%E8%BF%87%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF/m.png&quot; alt=&quot;m&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/20201113-%E6%9B%BE%E7%BB%8F%E7%94%A8%E6%98%93%E8%AF%AD%E8%A8%80%E5%86%99%E8%BF%87%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF/x.png&quot; alt=&quot;x&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/20201113-%E6%9B%BE%E7%BB%8F%E7%94%A8%E6%98%93%E8%AF%AD%E8%A8%80%E5%86%99%E8%BF%87%E7%9A%84%E4%B8%80%E4%BA%9B%E4%B8%9C%E8%A5%BF/jx.png&quot; alt=&quot;jx&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The source code and assets should still be on my old Western Digital Blue drive, but it had too many bad sectors so I stopped using it. It’s been sitting on my desk for years.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Oneindex Theme</title><link>https://nexmoe.com/21G2XMV</link><guid isPermaLink="true">https://nexmoe.com/21G2XMV</guid><pubDate>Thu, 12 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Back when I used Oneindex, the default UI was... so I just threw together a quick theme.&lt;/p&gt;
&lt;p&gt;&amp;lt;a target=&quot;_blank&quot; href=&quot;https://beian.miit.gov.cn/&quot; &amp;gt;鄂 ICP 备 2020018486 号&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20181031-Oneindex%E4%B8%BB%E9%A2%98/Snipaste_2018-06-09_13-55-34.png&quot; alt=&quot;Snipaste_2018-06-09_13-55-34&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20181031-Oneindex%E4%B8%BB%E9%A2%98/psb-1604903535616.jpg&quot; alt=&quot;psb (1)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20181031-Oneindex%E4%B8%BB%E9%A2%98/psb.jpg&quot; alt=&quot;psb&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Yep, just screenshots. The Oneindex project itself is already 404, but you should still be able to find screenshots of my theme online.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>A Template for a Web Design Contest</title><link>https://nexmoe.com/PY9CZB</link><guid isPermaLink="true">https://nexmoe.com/PY9CZB</guid><pubDate>Thu, 12 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A template I casually made when participating in a page design contest.&lt;/p&gt;
&lt;p&gt;Apparently written in March 2019, maybe even earlier.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Github&lt;/h2&gt;
&lt;p&gt;https://github.com/nexmoe/template-nature&lt;/p&gt;
&lt;p&gt;Star welcome.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/github/stars/nexmoe/template-nature.svg&quot; alt=&quot;stars&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/forks/nexmoe/template-nature.svg&quot; alt=&quot;forks&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/license/nexmoe/template-nature.svg&quot; alt=&quot;license&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Demo&lt;/h2&gt;
&lt;p&gt;https://nexmoe.com/template-nature/&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20190301%E4%B8%80%E4%B8%AA%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1%E6%AF%94%E8%B5%9B%E7%9A%84%E6%A8%A1%E6%9D%BF/image-20201105151817103.png&quot; alt=&quot;image-20201105151817103&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20190301%E4%B8%80%E4%B8%AA%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1%E6%AF%94%E8%B5%9B%E7%9A%84%E6%A8%A1%E6%9D%BF/image-20201105151834620.png&quot; alt=&quot;image-20201105151834620&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20190301%E4%B8%80%E4%B8%AA%E7%BD%91%E9%A1%B5%E8%AE%BE%E8%AE%A1%E6%AF%94%E8%B5%9B%E7%9A%84%E6%A8%A1%E6%9D%BF/image-20201105151849608.png&quot; alt=&quot;image-20201105151849608&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>A Template I Wrote for XinYu Weather</title><link>https://nexmoe.com/240BV7F</link><guid isPermaLink="true">https://nexmoe.com/240BV7F</guid><pubDate>Thu, 12 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A template I previously wrote for XinYu Weather.&lt;/p&gt;
&lt;p&gt;Written in January 2017.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Github&lt;/h2&gt;
&lt;p&gt;https://github.com/nexmoe/template-xinYuWeather&lt;/p&gt;
&lt;p&gt;Star welcome.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/github/stars/nexmoe/template-xinYuWeather.svg&quot; alt=&quot;stars&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/forks/nexmoe/template-xinYuWeather.svg&quot; alt=&quot;forks&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/license/nexmoe/template-xinYuWeather.svg&quot; alt=&quot;license&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20170101%E4%BB%A5%E5%89%8D%E4%B8%BA%E6%96%B0%E9%9B%A8%E5%A4%A9%E6%B0%94%E5%86%99%E7%9A%84%E6%A8%A1%E6%9D%BF/Snipaste_2020-10-11_11-34-03.png&quot; alt=&quot;Snipaste_2020-10-11_11-34-03&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20170101%E4%BB%A5%E5%89%8D%E4%B8%BA%E6%96%B0%E9%9B%A8%E5%A4%A9%E6%B0%94%E5%86%99%E7%9A%84%E6%A8%A1%E6%9D%BF/Snipaste_2020-10-11_11-34-08.png&quot; alt=&quot;Snipaste_2020-10-11_11-34-08&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Mixcm Wallpaper Site v1 Template</title><link>https://nexmoe.com/2GP7AQD</link><guid isPermaLink="true">https://nexmoe.com/2GP7AQD</guid><pubDate>Thu, 12 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A PHP template that requires a PHP environment to run.&lt;/p&gt;
&lt;p&gt;Written in November 2017.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Github&lt;/h2&gt;
&lt;p&gt;https://github.com/mixcm/template-mixcmWallpaper-v1&lt;/p&gt;
&lt;p&gt;Star welcome.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/github/stars/nexmoe/template-mixcmWallpaper-v1.svg&quot; alt=&quot;stars&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/forks/nexmoe/template-mixcmWallpaper-v1.svg&quot; alt=&quot;forks&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/license/nexmoe/template-mixcmWallpaper-v1.svg&quot; alt=&quot;license&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20171101%E8%A7%85%E6%BC%AB%E8%80%85%E5%A3%81%E7%BA%B8%E7%AB%99%E7%AC%AC%E4%B8%80%E7%89%88%E6%A8%A1%E6%9D%BF/800.jpg&quot; alt=&quot;800&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20171101%E8%A7%85%E6%BC%AB%E8%80%85%E5%A3%81%E7%BA%B8%E7%AB%99%E7%AC%AC%E4%B8%80%E7%89%88%E6%A8%A1%E6%9D%BF/799.jpg&quot; alt=&quot;799&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Qingwan Wallpaper v2 Template</title><link>https://nexmoe.com/1N1TFB0</link><guid isPermaLink="true">https://nexmoe.com/1N1TFB0</guid><pubDate>Thu, 12 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Qingwan Wallpaper v2 template.&lt;/p&gt;
&lt;p&gt;Written in November 2016.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Github&lt;/h2&gt;
&lt;p&gt;https://github.com/chainwon/template-chainwonBizhi&lt;/p&gt;
&lt;p&gt;Star welcome.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/github/stars/nexmoe/template-chainwonBizhi.svg&quot; alt=&quot;stars&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/forks/nexmoe/template-chainwonBizhi.svg&quot; alt=&quot;forks&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/license/nexmoe/template-chainwonBizhi.svg&quot; alt=&quot;license&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20161101%E8%BD%BB%E6%83%8B%E5%A3%81%E7%BA%B8%E7%AC%AC%E4%BA%8C%E7%89%88%E6%A8%A1%E6%9D%BF/800.png&quot; alt=&quot;800&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/20161101%E8%BD%BB%E6%83%8B%E5%A3%81%E7%BA%B8%E7%AC%AC%E4%BA%8C%E7%89%88%E6%A8%A1%E6%9D%BF/801-1604560984789.png&quot; alt=&quot;801&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>An Idea for a Novel Reading Feature</title><link>https://nexmoe.com/3XX9MPH</link><guid isPermaLink="true">https://nexmoe.com/3XX9MPH</guid><pubDate>Fri, 06 Nov 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;When reading novels or biographies like &lt;em&gt;Steve Jobs&lt;/em&gt;, it&apos;s easy to lose track of who&apos;s who, especially with translated foreign names that are hard to remember.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;So I came up with a feature: &quot;hair dye.&quot;&lt;/p&gt;
&lt;h2&gt;Feature Description&lt;/h2&gt;
&lt;p&gt;Use different colors to highlight different names to help memorize characters. Each character&apos;s color should be fixed from the start, and everyone should have a unique color.&lt;/p&gt;
&lt;p&gt;For example: &amp;lt;span style=&quot;color: red;&quot;&amp;gt;Steve Jobs&amp;lt;/span&amp;gt;, &amp;lt;span style=&quot;color: blue;&quot;&amp;gt;Steve Wozniak&amp;lt;/span&amp;gt;&lt;/p&gt;
&lt;p&gt;You can also use different background colors to achieve the same effect.&lt;/p&gt;
&lt;h2&gt;Inspiration&lt;/h2&gt;
&lt;p&gt;Japanese anime. As someone who has trouble recognizing faces, I often can&apos;t tell characters apart-unless I rely on clothes or colors. Many series assign different hair colors to each character to distinguish them. That separation is very effective.&lt;/p&gt;
&lt;h2&gt;Why I Thought of This&lt;/h2&gt;
&lt;p&gt;While reading &lt;em&gt;Steve Jobs&lt;/em&gt;, I kept flipping back to the character list. Aside from the main characters, I could barely remember anyone. Translated names are just too hard to memorize.&lt;/p&gt;
&lt;p&gt;So I thought about how to solve this before going to bed.&lt;/p&gt;
&lt;p&gt;That&apos;s how this feature idea came out.&lt;/p&gt;
&lt;p&gt;I haven&apos;t written the code part.&lt;/p&gt;
&lt;h2&gt;Possible Implementation&lt;/h2&gt;
&lt;p&gt;There are quite a few algorithms that can detect names in text.&lt;/p&gt;
&lt;p&gt;Extract each name, define a color for each character from the start, and keep it consistent throughout the article.&lt;/p&gt;
&lt;h2&gt;Possible Issues&lt;/h2&gt;
&lt;p&gt;A character might appear with a full name, a shortened name, or even a nickname. That may require users to distinguish, or we can boldly hope for future AI.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>PHP Hourglass Algorithm</title><link>https://nexmoe.com/402536618</link><guid isPermaLink="true">https://nexmoe.com/402536618</guid><pubDate>Fri, 30 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;L1-002 Print Hourglass&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;L1-002 Print Hourglass (20 points)&lt;/h2&gt;
&lt;p&gt;Write a program to print an hourglass shape using a given symbol. For example, given 17 &quot;*&quot;, print:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;*****
 ***
  *
 ***
*****
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;An “hourglass” means each line has an odd number of symbols; each line is center‑aligned; adjacent lines differ by 2 symbols; the count decreases down to 1 then increases back up; the first and last lines have the same number of symbols.&lt;/p&gt;
&lt;p&gt;Given N symbols, you may not be able to form a perfect hourglass. You should print the largest possible hourglass using as many symbols as possible.&lt;/p&gt;
&lt;h2&gt;Input format:&lt;/h2&gt;
&lt;p&gt;One line containing a positive integer N (≤1000) and a symbol, separated by a space.&lt;/p&gt;
&lt;h2&gt;Output format:&lt;/h2&gt;
&lt;p&gt;First output the largest hourglass using the given symbol, then output the number of remaining unused symbols on the last line.&lt;/p&gt;
&lt;h2&gt;Sample input:&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;19 *
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Sample output:&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;*****
 ***
  *
 ***
*****
2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;My trash algorithm&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://image.gslb.dawnlab.me/e19fb8eab400e17476c57f0846b5660a.png&quot; alt=&quot;L1-002 Print Hourglass (20 points)&quot; /&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
    $arr = explode(&apos; &apos;,rtrim(fgets(STDIN)));
    $n = 0;
    for($x=0; $n&amp;lt;$arr[0]; $x++){
        $t = $x*2-1;
        if($x &amp;gt; 1){
            $n = $n + $t*2;
        }else{
            $n = $n + $t;
        }
    }
    $n = $n - $t*2 + 1;

    $x2 = $x - 1;
    while($x2&amp;gt;0){
        $x2 = $x2-1;
        $x3=$x2*2-1;
        if($x3&amp;gt;0){
            for($spa=$x-$x2-2; $spa&amp;gt;0 ; $spa--){
                echo &quot; &quot;;
            }
            for($i=0; $i&amp;lt;$x3 ; $i++){
                echo $arr[1];
            }
            echo &quot;\n&quot;;
        }
    }
    $x2 = $x - 2;
    while($x2&amp;gt;0){
        $x2 = $x2-1;
        $x3=$x2*2-1;
        if($x3&amp;gt;0){
            for($spa=$x-$x2-2; $spa&amp;gt;0 ; $spa--){
                echo &quot; &quot;;
            }
            for($i=0; $i&amp;lt;$x3 ; $i++){
                echo $arr[1];
            }
            echo &quot;\n&quot;;
        }
    }

    $x2 = 0;
    $x3 = $x2*2-1;
    for($spa=$x-$x2-2; $spa&amp;gt;0 ; $spa--){
        echo &quot; &quot;;
    }
    for($i=0; $i&amp;lt;$x3 ; $i++){
        echo $arr[1];
    }
    echo &quot;\n&quot;;

    $x2 = $x - 1;
    while($x2&amp;gt;0){
        $x2 = $x2-1;
        $x3=$x2*2-1;
        if($x3&amp;gt;0){
            for($spa=$x-$x2-2; $spa&amp;gt;0 ; $spa--){
                echo &quot; &quot;;
            }
            for($i=0; $i&amp;lt;$x3 ; $i++){
                echo $arr[1];
            }
            echo &quot;\n&quot;;
        }
    }

    echo $arr[0]-$n;
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>post</category></item><item><title>A Simple Makeover for Saladict</title><link>https://nexmoe.com/3990884387</link><guid isPermaLink="true">https://nexmoe.com/3990884387</guid><pubDate>Thu, 08 Oct 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Saladict styles, themes, skins.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;Github: https://github.com/nexmoe/saladict-skin&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://cdn.jsdelivr.net/gh/nexmoe/image@latest/747f7f1a63c083fe3c47bf9722ef330d.png&quot; alt=&quot;Preview&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Saladict -&amp;gt; Lookup panel -&amp;gt; Customize lookup panel styles&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.menuBar {
    background-color: #fff;
    border-bottom: 1px solid #eee;
    padding: 8px;
}
.menuBar-Btn_Icon,.menuBar-Btn_Icon-fav {
    fill: #222;
}
.mtaBox-TextArea-Wrap,
.mtaBox-DrawerBtn,
.waveformBox.saladict-external,
.dictItemHead-Logo,
.menuBar-SearchBox_Wrap,
.menuBar-Btn[title=&quot;查单词&quot;] {
    display: none;
}
.dictItem {
    padding: 0 10px;
}
.dictItem:first-child {
    padding-top: 10px;
}
.dictItem-Body {
    padding: 0 3px;
}
.dictItemHead {
    background: #eee;
    border-radius: 6px;
    padding: 6px;
    height: auto;
}
.dictPanel-Root {
    box-shadow: rgba(0,0,0,0.2) 0 7px 21px 2px;
}
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>post</category></item><item><title>A Product Design for a Third-Party Shopping Platform</title><link>https://nexmoe.com/2441914640</link><guid isPermaLink="true">https://nexmoe.com/2441914640</guid><pubDate>Sat, 03 Oct 2020 17:42:00 GMT</pubDate><content:encoded>&lt;p&gt;A shopping product feature idea I thought of during the pandemic when choosing masks.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;Calculate unit price to compare easily.&lt;/p&gt;
&lt;p&gt;Test reports and automatic production standards are meant to prove product safety.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E4%B8%80%E4%B8%AA%E5%85%B3%E4%BA%8E%E7%AC%AC%E4%B8%89%E6%96%B9%E8%B4%AD%E7%89%A9%E5%B9%B3%E5%8F%B0%E7%9A%84%E4%BA%A7%E5%93%81%E8%AE%BE%E8%AE%A1/5b8953bbefb80940794ccceba15ddcff.png&quot; alt=&quot;5b8953bbefb80940794ccceba15ddcff&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>关于《后浪》的看法</title><link>https://nexmoe.com/posts/%E7%9C%8B%E6%B8%85%E7%8E%B0%E5%AE%9E%E4%B9%9F%E4%B8%8D%E8%AF%A5%E7%81%B0%E5%BF%83%E4%B8%A7%E6%B0%94</link><guid isPermaLink="true">https://nexmoe.com/posts/%E7%9C%8B%E6%B8%85%E7%8E%B0%E5%AE%9E%E4%B9%9F%E4%B8%8D%E8%AF%A5%E7%81%B0%E5%BF%83%E4%B8%A7%E6%B0%94</guid><pubDate>Tue, 05 May 2020 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;哔哩哔哩最近发布了一个广告《后浪》，作为 00 后的我看的时候也感觉挺澎湃的，里面还有几个我喜欢的 UP 主。&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;但是看完了，回归理智过后开始思考，思考这些前浪并不是我，他们只是顶尖的那部分。&lt;strong&gt;看的时候我很有代入感，因为演讲说的“后浪”指的就是年轻人，于是就轻易的把自己当作视频里面的那一批，但是一回到现实就会明白，所谓的“后浪”根本不是大多数人更不是自己。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;引用知乎用户：&lt;a href=&quot;https://www.zhihu.com/people/cloudycity&quot;&gt;云舞空城&lt;/a&gt; 的一句话&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;那些站在时代浪尖上的青年，永远只是少数的一群——更多的青年，将青春的能量耗散在无休止的事情上：为学业拼搏，为事业拼搏，为更好的生活拼搏，慢慢的奋斗，消散在中年人的肚腩里，你甚至不会注意到他们的存在。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;关于视频带来的感受&lt;/h2&gt;
&lt;p&gt;其实仔细想想这个视频目的，就能明白为什么这个视频要让&lt;strong&gt;年轻人&lt;/strong&gt;有代入感。&lt;/p&gt;
&lt;p&gt;首先这个视频本身就是一个&lt;strong&gt;商业广告&lt;/strong&gt;它的目的就是&lt;strong&gt;为 B 站引入更多的 UP 主来投稿&lt;/strong&gt;。追求自由、追求梦想不过是利用了所有人都渴望的东西。但其实，谁不想追求自由、追求梦想，别说我们这一代，上一代，上上一代，有哪一代人不想追求自由、梦想。&lt;/p&gt;
&lt;p&gt;本来我也想写写，这个视频太过于理想，而不适合大多数人。不过看到知乎已经有很多人写了，我就不写了，我就写写我的看法吧。&lt;/p&gt;
&lt;h2&gt;落差感带来的焦虑&lt;/h2&gt;
&lt;p&gt;说实话，看完视频，再看知乎，会感到理想与现实巨大的落差感。感觉一下就被拽回现实，看完知乎，首先就是焦虑。&lt;/p&gt;
&lt;p&gt;与视频里面的年轻人相比，自己不过是个小地方的年轻人，人生没什么多余的选择，只有读书一条路可以走，并且成绩也没有那么好。虽然我知道我想做什么，&lt;strong&gt;但我不知道未来能做什么&lt;/strong&gt;。他们可以出国、跳伞、全世界到处跑，这是我完全没法想象的。想一想自己在全中国也就去过 3 个省，坐过最高级的交通工具也不过是旅游的时候坐的地铁。&lt;/p&gt;
&lt;p&gt;我觉得我可以代表年轻人的大多数，是&lt;strong&gt;有梦想却迷茫、成绩一般般、家庭一般般、见识也不够多的&lt;/strong&gt;。&lt;/p&gt;
&lt;h2&gt;我的观点&lt;/h2&gt;
&lt;p&gt;对于生活，首先我觉得是&lt;strong&gt;完全没有必要焦虑的&lt;/strong&gt;，视频里光鲜亮丽的人物只是少数而已，大多数都是和我们一样的年轻人，所以我觉得完全没必要焦虑。&lt;/p&gt;
&lt;p&gt;或许你会觉得我不思进取，但是我觉得只要知道&lt;strong&gt;焦虑是没有任何用的&lt;/strong&gt;，就明白这样想其实也没什么错。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;年轻人应该还是要不失活力的&lt;/strong&gt;，虽然我不如那些人拥有资源、拥有能力。但我还有我所在意的东西、我所热爱的东西，其实这就足够了。&lt;/p&gt;
&lt;p&gt;联系上文，部分焦虑来自于“我知道我想做什么，&lt;strong&gt;但我不知道未来能做什么&lt;/strong&gt;。”对于这种情况，我觉得最好的解决方法就是&lt;strong&gt;把自己热爱的事情培养成能吃饭的工具&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;喜欢绘画就让自己的绘画能力能吃到饭，可以去做平面设计、可以去做插画师。热爱运动，就努力考上军校。&lt;/p&gt;
&lt;p&gt;如果自己热爱的事情不能用来吃饭，那就把自己空余的时间用来培养爱好。&lt;/p&gt;
&lt;p&gt;我觉得&lt;strong&gt;相比衣食无忧、有房有车，不如一辈子都能做自己热爱的事情&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;人生有何意义，其实只要明白&lt;strong&gt;我确实存在，且有我所关心的人或事情、这就足够了，人只要能做自己热爱的事情，这就足够了&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;互联网让信息流通更加容易，我们更容易看到别人的幸福。这给我们一种错觉，认为别人的生活都是这么美好的。但现实是我们的国家还只是发展中国家，并不能达到每个人都是富裕的。&lt;/p&gt;
&lt;p&gt;我们没必要焦虑，也&lt;strong&gt;千万别去焦虑&lt;/strong&gt;。我们只需要&lt;strong&gt;更清楚的认识现实，然后仍然继续努力下去&lt;/strong&gt;，至少在为自己热爱的事情而奋斗的时刻是幸福的。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;本文只是一个年轻人的思考与想法，思维还不够成熟，还有很多欠缺的地方&lt;/em&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Blog, What Did I Optimize?</title><link>https://nexmoe.com/661812793</link><guid isPermaLink="true">https://nexmoe.com/661812793</guid><pubDate>Sun, 09 Feb 2020 16:10:00 GMT</pubDate><content:encoded>&lt;p&gt;My blog performance was always terrible, so I spent two days optimizing it. Here are the results.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;First, the scores&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://i.speed.moe/image/E3nH&quot;&gt;&lt;img src=&quot;https://image.gslb.dawnlab.me/af94d4afe7524d6522600fae70430e67.png&quot; alt=&quot;af94d4afe7524d6522600fae70430e67.png&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://i.speed.moe/image/E7B5&quot;&gt;&lt;img src=&quot;https://image.gslb.dawnlab.me/f5c19b5607a3f5de94a15b007628e72f.png&quot; alt=&quot;f5c19b5607a3f5de94a15b007628e72f.png&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://i.speed.moe/image/EQ6p&quot;&gt;&lt;img src=&quot;https://image.gslb.dawnlab.me/4be54fe2007099d4c791c8a13489af77.png&quot; alt=&quot;4be54fe2007099d4c791c8a13489af77.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Remove some dependencies&lt;/h2&gt;
&lt;p&gt;❌ Remove fancybox
❌ Remove SmoothScroll
❌ Remove jQuery
❌ Remove Pjax
It&apos;s already 2020, I don&apos;t think jQuery is needed.
Edge now has good native smooth scrolling, and SmoothScroll feels laggy on macOS, so I removed it.
I removed fancybox because I rarely use it - opening the original image with right-click is more comfortable.&lt;/p&gt;
&lt;h2&gt;Lazyload optimization&lt;/h2&gt;
&lt;p&gt;Before this, my blog homepage had a problem: image loading caused layout jumps. So I set width and height for every image to reserve space and prevent jitter.
It was a bit troublesome though.
Previous front-matter&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 博客，我优化了什么？
cover: https://nexmoe.com/images/cover/compress/motorcycle-1690452_1920.jpg
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Current front-matter&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 博客，我优化了什么？
cover: https://nexmoe.com/images/cover/compress/motorcycle-1690452_1920.jpg
coverWidth: 1920
coverHeight: 1206
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I also added a non-linear animation to Lazyload to make it feel happier.&lt;/p&gt;
&lt;h2&gt;Resource merging&lt;/h2&gt;
&lt;p&gt;This was convenient because jsdelivr supports combining multiple libraries into one request.
For example: https://cdn.jsdelivr.net/combine/npm/highlight.js@9.15.8/styles/atom-one-dark.css,gh/nexmoe/nexmoe.github.io@latest/css/style.css,gh/nexmoe/nexmoe.github.io@latest/lib/mdui_043tiny/css/mdui.css,gh/nexmoe/nexmoe.github.io@latest/lib/iconfont/iconfont.css
So I combined all CSS and JS into one each, reducing request count and improving speed.&lt;/p&gt;
&lt;h2&gt;Image compression&lt;/h2&gt;
&lt;p&gt;My homepage images were just for eye candy - why keep full-resolution lossless?
So I compressed all images to 920px width. Huge size reduction. Speed skyrocketed.&lt;/p&gt;
&lt;h2&gt;Dependency simplification&lt;/h2&gt;
&lt;p&gt;The theme depends on mdui, which loads fonts. I localized it and removed color classes, helper classes, and font classes.
Speed improved a bit.&lt;/p&gt;
&lt;h2&gt;Rewrite some JS in nodejs&lt;/h2&gt;
&lt;p&gt;Previously, Lazyload and some functions were written in JS and ran at runtime, costing performance.
So I rewrote some parts in nodejs. Hexo finishes the work during build, so the browser doesn&apos;t need to render it.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Typecho Theme Nexmoe</title><link>https://nexmoe.com/371865617</link><guid isPermaLink="true">https://nexmoe.com/371865617</guid><pubDate>Sun, 25 Aug 2019 14:31:32 GMT</pubDate><content:encoded>&lt;p&gt;A rather special Typecho theme.
&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 5027380&lt;/p&gt;
&lt;h2&gt;GitHub&lt;/h2&gt;
&lt;p&gt;https://github.com/nexmoe/typecho-theme-nexmoe
Stars, contributions, and feedback are welcome.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/github/stars/nexmoe/typecho-theme-nexmoe.svg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/forks/nexmoe/typecho-theme-nexmoe.svg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/issues/nexmoe/typecho-theme-nexmoe.svg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/last-commit/nexmoe/typecho-theme-nexmoe.svg?label=commits&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/license/nexmoe/typecho-theme-nexmoe.svg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Getting updates&lt;/h2&gt;
&lt;p&gt;Use “Watch: Releases only” to get new version notifications.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/pasted-5.png&quot; alt=&quot;upload successful&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;License&lt;/h2&gt;
&lt;p&gt;Apache License 2.0&lt;/p&gt;
&lt;h2&gt;Future updates&lt;/h2&gt;
&lt;p&gt;I’m in high school.
Stars and issues are my motivation to keep updating.
Join the group 482634342 to hang out.&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#github&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#getting-updates&quot;&gt;Getting updates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#license&quot;&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#future-updates&quot;&gt;Future updates&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#features&quot;&gt;Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#internationalization&quot;&gt;Internationalization&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#photo-gallery&quot;&gt;Photo gallery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#image-lightbox&quot;&gt;Image lightbox&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#post-cover-image&quot;&gt;Post cover image&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Internationalization&lt;/h2&gt;
&lt;p&gt;Chinese translations are fairly complete; other languages are not. Contributions are welcome.
Language files are in &lt;code&gt;languages&lt;/code&gt;, use &lt;code&gt;zh-CN.yml&lt;/code&gt; as a reference for translation.&lt;/p&gt;
&lt;h2&gt;Photo gallery&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;![珠江](https://i.loli.net/2018/09/01/5b8a59551a4d8.jpg)|![珠江](https://i.loli.net/2018/09/01/5b8a6ab761262.jpg)|![某收门票公园](https://i.loli.net/2018/09/01/5b8a5994b6e28.jpg)
- | - | -
![某收门票公园](https://i.loli.net/2018/09/01/5b8a5994b6e28.jpg)|![某收门票公园](https://i.loli.net/2018/09/01/5b8a5c8c34439.jpg)|![珠海](https://i.loli.net/2018/09/01/5b8a59d5c50f3.jpg)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The idea is to insert images in a Markdown table.&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;https://i.loli.net/2018/09/01/5b8a59551a4d8.jpg&quot; alt=&quot;珠江&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;https://i.loli.net/2018/09/01/5b8a6ab761262.jpg&quot; alt=&quot;珠江&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;https://i.loli.net/2018/09/01/5b8a5994b6e28.jpg&quot; alt=&quot;某收门票公园&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;https://i.loli.net/2018/09/01/5b8a5994b6e28.jpg&quot; alt=&quot;某收门票公园&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://i.loli.net/2018/09/01/5b8a5c8c34439.jpg&quot; alt=&quot;某收门票公园&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;https://i.loli.net/2018/09/01/5b8a59d5c50f3.jpg&quot; alt=&quot;珠海&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Image lightbox&lt;/h2&gt;
&lt;p&gt;Automatically enables a lightbox for every image in the post.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/pasted-4.png&quot; alt=&quot;upload successful&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Post cover image&lt;/h2&gt;
&lt;p&gt;Assign &lt;code&gt;cover&lt;/code&gt; in front‑matter, for example:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: Hello World
pubDate: 2013/7/13 20:46:25
cover: https://i.loli.net/2019/07/21/5d33d5dc1531213134.png
---
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>post</category></item><item><title>Beautify Your Terminal</title><link>https://nexmoe.com/1519803391</link><guid isPermaLink="true">https://nexmoe.com/1519803391</guid><pubDate>Fri, 09 Aug 2019 18:49:03 GMT</pubDate><content:encoded>&lt;p&gt;The built-in PowerShell supports custom colors now, but it&apos;s still ugly. This post helps you build the most beautiful terminal on Windows 10.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Install &lt;s&gt;Fluent Terminal&lt;/s&gt; (Terminus recommended)&lt;/h2&gt;
&lt;p&gt;Fluent Terminal is a terminal based on UWP and web technologies. Compared with Terminus, it uses fewer resources, has a Chinese translation, and a GUI settings page.&lt;/p&gt;
&lt;p&gt;Download the latest here
&lt;a href=&quot;https://github.com/felixse/FluentTerminal/releases&quot;&gt;https://github.com/felixse/FluentTerminal/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Unzip anywhere, open the folder, right-click &lt;code&gt;Install.ps1&lt;/code&gt; and run with PowerShell, choose Sideloading to install&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF/pasted-1.png&quot; alt=&quot;Install Fluent Terminal&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Installation complete.&lt;/p&gt;
&lt;h2&gt;Install Terminus&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://eugeny.github.io/terminus/&quot;&gt;https://eugeny.github.io/terminus/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Install oh-my-posh and posh-git&lt;/h2&gt;
&lt;p&gt;posh-git: integrates git into PowerShell
oh-my-posh: the main beautification star, with colored arrow prompt&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-ExecutionPolicy Bypass
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF/pasted-7.png&quot; alt=&quot;Install oh-my-posh&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Enable oh-my-posh and posh-git&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Import-Module posh-git
Import-Module oh-my-posh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Set theme&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-Theme Agnoster
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Available list&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agnoster&lt;/li&gt;
&lt;li&gt;Avit&lt;/li&gt;
&lt;li&gt;Darkblood&lt;/li&gt;
&lt;li&gt;Fish&lt;/li&gt;
&lt;li&gt;Honukai&lt;/li&gt;
&lt;li&gt;Paradox&lt;/li&gt;
&lt;li&gt;PowerLine&lt;/li&gt;
&lt;li&gt;robbyrussell&lt;/li&gt;
&lt;li&gt;Sorin&lt;/li&gt;
&lt;li&gt;tehrob&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Print the profile path&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$profile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF/pasted-9.png&quot; alt=&quot;upload successful&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Open the file at that path, add the config and save&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Import-Module oh-my-posh
Set-Theme Agnoster
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF/pasted-10.png&quot; alt=&quot;upload successful&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Open Fluent Terminal to see the result&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF/pasted-12.png&quot; alt=&quot;upload successful&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Hexo Theme Nexmoe</title><link>https://nexmoe.com/products/hexo-theme-nexmoe</link><guid isPermaLink="true">https://nexmoe.com/products/hexo-theme-nexmoe</guid><pubDate>Mon, 05 Aug 2019 04:25:35 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/20240822_cover.C8wi04AC.png&quot; alt=&quot;Hexo Theme Nexmoe&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/hexo-theme-nexmoe&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/20240822_cover.C8wi04AC.png" length="1531936" type="image/png"/></item><item><title>Pray For KyoAni</title><link>https://nexmoe.com/3329058764</link><guid isPermaLink="true">https://nexmoe.com/3329058764</guid><pubDate>Sun, 21 Jul 2019 10:34:00 GMT</pubDate><content:encoded>&lt;p&gt;On July 18, the Kyoto Animation arson attack happened. When I first heard the news, I thought, “This can’t be real.” But it was confirmed, and I could only face the reality. The tragedy has already happened, and there isn’t much I can do. I’m writing this post as a record.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Kyoto Animation arson attack (Japanese: 京都アニメーション放火事件) was an arson and murder incident that occurred on July 18, 2019 at Kyoto Animation’s Studio 1 in Fushimi Ward, Kyoto, Japan. A 41-year-old man (born May 16, 1978), Shinji Aoba, poured gasoline inside the studio, triggering an explosion and massive fire. The three-story building was completely destroyed, resulting in 34 deaths and 35 injuries (including the attacker).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;NetEase Cloud Music ID: 534064298&lt;/p&gt;
&lt;p&gt;&amp;lt;style&amp;gt;
html {
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
filter:progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);&lt;br /&gt;
_filter:none;
}
&amp;lt;/style&amp;gt;&lt;/p&gt;
&lt;h2&gt;Event Details&lt;/h2&gt;
&lt;p&gt;https://zh.wikipedia.org/wiki/%E4%BA%AC%E9%83%BD%E5%8B%95%E7%95%AB%E7%B8%B1%E7%81%AB%E6%A1%88&lt;/p&gt;
&lt;h2&gt;Kyoto Animation Works I’ve Watched&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Violet Evergarden (recommended by others; I didn’t watch for a long time, then finally did and felt like I found a treasure — the animation is superb)&lt;/li&gt;
&lt;li&gt;Beyond the Boundary (watched back when I wasn’t a hardcore otaku yet — really good)&lt;/li&gt;
&lt;li&gt;Love, Chunibyo &amp;amp; Other Delusions (I think I finished it, but it’s been a long time)&lt;/li&gt;
&lt;li&gt;A Silent Voice&lt;/li&gt;
&lt;li&gt;Myriad Colors Phantom World&lt;/li&gt;
&lt;li&gt;Hyouka (didn’t finish)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Flowers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Daisy (my aromatherapy, my favorite flower)&lt;/li&gt;
&lt;li&gt;Violet&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Beyond the Boundary&lt;/h2&gt;
&lt;p&gt;I watched it long ago. As a short-hair enthusiast, I loved it. And “Daisy,” the ending song, is god-tier.&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 28018269&lt;/p&gt;
&lt;h2&gt;Violet Evergarden&lt;/h2&gt;
&lt;p&gt;The art style is just amazing and gave me a bit of warmth while I was still in school.&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 547973265&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>PHP &amp; Vue.js Confession Wall</title><link>https://nexmoe.com/2154053968</link><guid isPermaLink="true">https://nexmoe.com/2154053968</guid><pubDate>Sun, 14 Apr 2019 13:38:00 GMT</pubDate><content:encoded>&lt;p&gt;A lightweight anonymous confession wall mini‑app built with Vue.js.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;License&lt;/h2&gt;
&lt;p&gt;Apache License 2.0
https://github.com/nexmoe/wall-public/blob/master/LICENSE&lt;/p&gt;
&lt;h2&gt;Introduction&lt;/h2&gt;
&lt;p&gt;A lightweight anonymous confession wall mini‑app built with Vue.js.&lt;/p&gt;
&lt;h2&gt;Author&lt;/h2&gt;
&lt;p&gt;折影轻梦 (Nexmoe), released under the Apache License.&lt;/p&gt;
&lt;h2&gt;Demo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wall.chainwon.com/&quot;&gt;https://wall.chainwon.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Feel free to add your deployed site link in issues or pull requests.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/PHP-Vue-js-%E8%A1%A8%E7%99%BD%E5%A2%99/screenshots.png&quot; alt=&quot;screenshots&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A PHP‑enabled server, PHP 7+ recommended&lt;/li&gt;
&lt;li&gt;An Apache‑enabled server&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Installation&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Download the zip from &lt;a href=&quot;https://github.com/nexmoe/wall-public/releases&quot;&gt;https://github.com/nexmoe/wall-public/releases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Unzip into the website root&lt;/li&gt;
&lt;li&gt;Visit &lt;code&gt;domain/install.php&lt;/code&gt; and fill out the form to install&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;PWA support&lt;/h2&gt;
&lt;p&gt;The service‑worker is already configured. Just update &lt;code&gt;/static/manifest.json&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;Future updates&lt;/h2&gt;
&lt;p&gt;I’m in high school.
Stars and issues are my motivation to keep updating.
Join the group 482634342 to hang out.&lt;/p&gt;
&lt;h2&gt;Community&lt;/h2&gt;
&lt;p&gt;User group: 797996017&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>2018 Has Come to an End</title><link>https://nexmoe.com/1341</link><guid isPermaLink="true">https://nexmoe.com/1341</guid><pubDate>Tue, 01 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Finally, I made it to 2019. 2018 has come to an end too. Back in 2017 I wanted to do so many interesting things. I was still optimistic then, still full of longing.
&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;But what can I do now that I’ve become like this? Life is always full of regrets. I don’t know if I can still gather the courage like before to welcome the new year.&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 1293886117&lt;/p&gt;
&lt;p&gt;Second year of middle school, second year of high school—those are both “chuunibyou” ages. They say it’s when the brain is most out of whack, and whether you sink or… this period can be crucial. Perhaps my current state is like the protagonist in “妄想症 Deliver Me”—I can’t get interested in anything: games, studying, code, anime. Instead I’m obsessed with Mandarin pop music and all kinds of films.&lt;/p&gt;
&lt;p&gt;Note: “妄想症 Deliver Me” was a gift from &lt;a href=&quot;https://blog.lim-light.com/&quot;&gt;黎明&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;About Today&lt;/h2&gt;
&lt;p&gt;Today I watched &lt;em&gt;Spider-Man: Into the Spider-Verse&lt;/em&gt;. It’s a comedy, but parts of it really moved me, though the comedic style snaps you out of sadness instantly. It happened several times. Maybe I felt it differently—the kids next to me laughed the whole time, and their parents too.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Miles: “If it doesn’t fit, can I return it?”
Stan Lee: “It always fits. Eventually.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Miles: “How will I know I’m ready?”
Peter Parker: “You won’t. It’s a leap of faith.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Anyone can wear the mask. Anyone can be Spider-Man.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;NetEase Cloud Music&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c31865835fc1.png&quot; alt=&quot;5c31865835fc1&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c318658a8568.png&quot; alt=&quot;5c318658a8568&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c318658d4aeb.png&quot; alt=&quot;5c318658d4aeb&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c31865b04eaf.png&quot; alt=&quot;5c31865b04eaf&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c3186697893b.png&quot; alt=&quot;5c3186697893b&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c318659463e7.png&quot; alt=&quot;5c318659463e7&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c31866b86fde.png&quot; alt=&quot;5c31866b86fde&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c31866e1d129-1604033165849.png&quot; alt=&quot;5c31866e1d129&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c318651b00d8-1604033017843.png&quot; alt=&quot;5c318651b00d8&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c31865401e57.png&quot; alt=&quot;5c31865401e57&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c3186559ade5.png&quot; alt=&quot;5c3186559ade5&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c318655f319d.png&quot; alt=&quot;5c318655f319d&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/2018%E5%B9%B4%E4%B9%9F%E8%BF%98%E6%98%AF%E8%B5%B0%E5%88%B0%E4%BA%86%E5%A4%B4/5c31865639e6b.png&quot; alt=&quot;5c31865639e6b&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;At the End&lt;/h2&gt;
&lt;p&gt;Sigh, I can’t really keep writing. I just want to find a place where I can forget everything, do nothing, and think about nothing. These past months I’ve been sleeping late because I can’t fall asleep and I always think too much at night. I don’t know how to get back to normal. I want my brain to shut down, but it refuses.&lt;/p&gt;
&lt;p&gt;What should I do? 2018 will be over in just a few minutes. How should I face the coming 2019? I really want to become a gentle, optimistic, outgoing person. But can I?&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>New Year Steam Game Giveaway (Ended)</title><link>https://nexmoe.com/1321</link><guid isPermaLink="true">https://nexmoe.com/1321</guid><pubDate>Sun, 23 Dec 2018 23:44:00 GMT</pubDate><content:encoded>&lt;p&gt;Finally, 2018 is coming to an end. Back in 2017 I wanted to do so many interesting things, and now many of them still weren’t realized. But what can you do? Life is full of regrets. Let’s gather the courage to welcome the new year.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 1709302&lt;/p&gt;
&lt;h2&gt;First&lt;/h2&gt;
&lt;p&gt;You have to make sure you can set aside time to play if you win. Don’t treat it lightly just because it’s free.&lt;/p&gt;
&lt;p&gt;Especially &lt;em&gt;To The Moon&lt;/em&gt;—it can be finished in under 5 hours, but you might not understand the story in one run. It’s a story-driven game with almost no gameplay. If you don’t set aside a full 5 hours to play calmly, you won’t experience its meaning.&lt;/p&gt;
&lt;p&gt;In short, I hope winners will take the game seriously.&lt;/p&gt;
&lt;h2&gt;Draw Date&lt;/h2&gt;
&lt;p&gt;January 2, 2019&lt;/p&gt;
&lt;h2&gt;How to Participate&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Add me on Steam
http://s.team/p/cfgg-gbnr/BWCTKBWQ&lt;/li&gt;
&lt;li&gt;Leave a comment on this post&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Add me on Steam soon&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;Prize&lt;/h2&gt;
&lt;p&gt;Don’t Starve Together, To The Moon, Portal 2, Castle Crashers, Left 4 Dead 2…&lt;/p&gt;
&lt;p&gt;One of the above. They’re all relatively cheap, and that’s all I can afford to give.&lt;/p&gt;
&lt;p&gt;Ten copies in total.&lt;/p&gt;
&lt;h2&gt;How the Draw Works&lt;/h2&gt;
&lt;p&gt;PHP’s rand()
Only one comment per person.
Winners will be replied to in the comments. Please fill in a valid email address for receiving.&lt;/p&gt;
&lt;p&gt;Feels like we should wait until at least 100 participants...&lt;/p&gt;
&lt;p&gt;If you don’t add me on Steam, you’re disqualified...&lt;/p&gt;
&lt;h2&gt;Related Social Platforms&lt;/h2&gt;
&lt;p&gt;TG: https://t.me/chainwon&lt;/p&gt;
&lt;p&gt;QQ Group: 482634342&lt;/p&gt;
&lt;h2&gt;Previous&lt;/h2&gt;
&lt;p&gt;https://nexmoe.com/1070.html&lt;/p&gt;
&lt;p&gt;Typing on mobile is hard, and I’m still in school...&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Which Is Stronger: Darkness or Light?</title><link>https://nexmoe.com/1291</link><guid isPermaLink="true">https://nexmoe.com/1291</guid><pubDate>Sun, 09 Dec 2018 02:40:00 GMT</pubDate><content:encoded>&lt;p&gt;Which is stronger, darkness or light?&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;License&lt;/h2&gt;
&lt;p&gt;MIT&lt;/p&gt;
&lt;h2&gt;Github&lt;/h2&gt;
&lt;p&gt;https://github.com/nexmoe/single-page/&lt;/p&gt;
&lt;p&gt;[PAGE1]&lt;/p&gt;
&lt;h2&gt;HTML Single Page: Black vs White&lt;/h2&gt;
&lt;h4&gt;Demo&lt;/h4&gt;
&lt;p&gt;https://nexmoe.github.io/single-page/nexmoe-vs/&lt;/p&gt;
&lt;h4&gt;Download&lt;/h4&gt;
&lt;p&gt;https://github.com/nexmoe/single-page/tree/master/nexmoe-vs&lt;/p&gt;
&lt;h4&gt;Preview&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E9%BB%91%E6%9A%97%E4%B8%8E%E5%85%89%E6%98%8E%E5%AD%B0%E5%BC%BA%E5%AD%B0%E5%BC%B1%EF%BC%9F/5c0c0f972944e.png&quot; alt=&quot;5c0c0f972944e&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;A Low-Fidelity Mac OS Safari Single Page Template&lt;/h2&gt;
&lt;h4&gt;Demo&lt;/h4&gt;
&lt;p&gt;https://nexmoe.github.io/single-page/nexmoe-safari/&lt;/p&gt;
&lt;h4&gt;Download&lt;/h4&gt;
&lt;p&gt;https://github.com/nexmoe/single-page/tree/master/nexmoe-safari&lt;/p&gt;
&lt;h4&gt;Preview&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E9%BB%91%E6%9A%97%E4%B8%8E%E5%85%89%E6%98%8E%E5%AD%B0%E5%BC%BA%E5%AD%B0%E5%BC%B1%EF%BC%9F/2018-04-20_23-06-59.png&quot; alt=&quot;2018-04-20_23-06-59&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;A Timeline Template for an Organization Project&lt;/h2&gt;
&lt;h4&gt;Demo&lt;/h4&gt;
&lt;p&gt;https://nexmoe.github.io/single-page/mixcm-avatar/&lt;/p&gt;
&lt;h4&gt;Download&lt;/h4&gt;
&lt;p&gt;https://github.com/nexmoe/single-page/tree/master/mixcm-avatar&lt;/p&gt;
&lt;h4&gt;Preview&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E9%BB%91%E6%9A%97%E4%B8%8E%E5%85%89%E6%98%8E%E5%AD%B0%E5%BC%BA%E5%AD%B0%E5%BC%B1%EF%BC%9F/2738569080.png&quot; alt=&quot;2738569080&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;A Warning Page Template&lt;/h2&gt;
&lt;h4&gt;Demo&lt;/h4&gt;
&lt;p&gt;https://nexmoe.github.io/single-page/nexmoe-warning&lt;/p&gt;
&lt;h4&gt;Download&lt;/h4&gt;
&lt;p&gt;https://github.com/nexmoe/single-page/tree/master/mixcm-warning&lt;/p&gt;
&lt;h4&gt;Preview&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E9%BB%91%E6%9A%97%E4%B8%8E%E5%85%89%E6%98%8E%E5%AD%B0%E5%BC%BA%E5%AD%B0%E5%BC%B1%EF%BC%9F/59f545cd0b244.png&quot; alt=&quot;59f545cd0b244&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Use goto to Avoid if Nesting</title><link>https://nexmoe.com/1280</link><guid isPermaLink="true">https://nexmoe.com/1280</guid><pubDate>Sat, 24 Nov 2018 18:04:00 GMT</pubDate><content:encoded>&lt;p&gt;if in flow control is a simple logical condition, but with multiple conditions it&apos;s easy to create deep if nesting. The logic becomes complex and confusing.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;Evil nested if&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
$a = array(
    &apos;state&apos; =&amp;gt; &apos;1&apos;,
    &apos;notice&apos; =&amp;gt; &apos;注册成功！&apos;,
);

if ($_GET[&apos;username&apos;] != &apos;&apos;) {
    if (strlen($_GET[&apos;username&apos;]) &amp;gt; 4 or !strlen($_GET[&apos;username&apos;]) &amp;lt; 11) {
        $name = array(&apos;root&apos;,&apos;admin&apos;,&apos;GETmaster&apos;,&apos;master&apos;,&apos;webmaster&apos;,&apos;mixcm&apos;,&apos;administrator&apos;,&apos;sb&apos;,&apos;shabi&apos;);
        if (!in_array($_GET[&apos;username&apos;], $name)) {
            if (preg_match(&quot;/^[a-zA-Z\s]+$/&quot;, $_GET[&apos;username&apos;])) {
                $a[&apos;state&apos;] = &apos;0&apos;;
                $a[&apos;notice&apos;] = &apos;用户名必须为英文！&apos;;
            }
        } else {
            $a[&apos;state&apos;] = &apos;0&apos;;
            $a[&apos;notice&apos;] = &apos;非法用户名！&apos;;
        }
    } else {
        $a[&apos;state&apos;] = &apos;0&apos;;
        $a[&apos;notice&apos;] = &apos;请输入大于4字符，且小于11个字符的用户名！&apos;;
    }

} else {
    $a[&apos;state&apos;] = &apos;0&apos;;
    $a[&apos;notice&apos;] = &apos;用户名不能为空！&apos;;
}

echo json_encode($a,JSON_UNESCAPED_UNICODE);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;So in real work, we try to avoid this. That&apos;s where goto and table data come in.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clear logic&lt;/li&gt;
&lt;li&gt;Easy to modify later&lt;/li&gt;
&lt;li&gt;But avoid overusing goto; recommend only one label. In this example, only &lt;code&gt;end&lt;/code&gt; is defined.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Solve with goto (the following code uses table data):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
$a = array(
    &apos;state&apos; =&amp;gt; &apos;1&apos;,
    &apos;notice&apos; =&amp;gt; &apos;注册成功！&apos;,
);

if ($_GET[&apos;username&apos;] == &apos;&apos;) {
    $a[&apos;state&apos;] = &apos;0&apos;;
    $a[&apos;notice&apos;] = &apos;用户名不能为空！&apos;;
    goto end;
}

if (strlen($_GET[&apos;username&apos;]) &amp;lt; 4 or strlen($_GET[&apos;username&apos;]) &amp;gt; 11) {
    $a[&apos;state&apos;] = &apos;0&apos;;
    $a[&apos;notice&apos;] = &apos;请输入大于4字符，且小于11个字符的用户名！&apos;;
    goto end;
}

$name = array(&apos;root&apos;,&apos;admin&apos;,&apos;GETmaster&apos;,&apos;master&apos;,&apos;webmaster&apos;,&apos;mixcm&apos;,&apos;administrator&apos;,&apos;sb&apos;,&apos;shabi&apos;);
if (in_array($_GET[&apos;username&apos;], $name)) {
    $a[&apos;state&apos;] = &apos;0&apos;;
    $a[&apos;notice&apos;] = &apos;非法用户名！&apos;;
    goto end;
}

if (!preg_match(&quot;/^[a-zA-Z\s]+$/&quot;, $_GET[&apos;username&apos;])) {
    $a[&apos;state&apos;] = &apos;0&apos;;
    $a[&apos;notice&apos;] = &apos;用户名必须为英文！&apos;;
    goto end;
}

end:
echo json_encode($a,JSON_UNESCAPED_UNICODE);
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>post</category></item><item><title>Cat UI - The Four Seasons Cat (Paid)</title><link>https://nexmoe.com/seasoncat</link><guid isPermaLink="true">https://nexmoe.com/seasoncat</guid><pubDate>Tue, 02 Oct 2018 00:39:00 GMT</pubDate><content:encoded>&lt;p&gt;After passing through the four seasons, looking back, I found that only the cat was still there waiting for me...
&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Copyright Statement&lt;/h2&gt;
&lt;p&gt;!!!
&amp;lt;span style=&quot;color: red;&quot;&amp;gt;Paid theme. Reselling is forbidden. Do not modify copyright. Commercial use is allowed. You may modify for personal use only. Do not modify content in #sider-copyright, and do not modify content in sider.php. Breaking these terms means you give up your right to use the theme.
&amp;lt;/span&amp;gt;
!!!&lt;/p&gt;
&lt;h2&gt;Pricing&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[OPEN] Payment&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Four Seasons Cat&lt;/strong&gt; price &lt;strong&gt;&lt;code&gt;47.77&lt;/code&gt;&lt;/strong&gt;. Contact QQ &lt;strong&gt;776194970&lt;/strong&gt; on &lt;strong&gt;Saturday night&lt;/strong&gt; or &lt;strong&gt;holidays&lt;/strong&gt;. Extra sponsorship is welcome.&lt;/li&gt;
&lt;li&gt;[OPEN] Notes&lt;/li&gt;
&lt;li&gt;If the price increases later, you &lt;strong&gt;may&lt;/strong&gt; be asked to pay the difference. No refunds for discounted events.&lt;/li&gt;
&lt;li&gt;Copyright belongs to: &lt;strong&gt;折影轻梦&lt;/strong&gt;. If you bought the template, don&apos;t resell it. I barely make any income.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2018/09/01/5b8a8ac8a3823.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Features&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Avatar settings&lt;/li&gt;
&lt;li&gt;Console -&amp;gt; Appearance -&amp;gt; Theme Settings -&amp;gt; Blog avatar&lt;/li&gt;
&lt;li&gt;Header image settings&lt;/li&gt;
&lt;li&gt;Console -&amp;gt; Appearance -&amp;gt; Theme Settings -&amp;gt; Blog header image&lt;/li&gt;
&lt;li&gt;Payment QR settings&lt;/li&gt;
&lt;li&gt;Console -&amp;gt; Appearance -&amp;gt; Theme Settings -&amp;gt; Alipay QR code&lt;/li&gt;
&lt;li&gt;Console -&amp;gt; Appearance -&amp;gt; Theme Settings -&amp;gt; Tencent QQ QR code&lt;/li&gt;
&lt;li&gt;Console -&amp;gt; Appearance -&amp;gt; Theme Settings -&amp;gt; WeChat QR code&lt;/li&gt;
&lt;li&gt;Custom CSS&lt;/li&gt;
&lt;li&gt;Console -&amp;gt; Appearance -&amp;gt; Theme Settings -&amp;gt; Custom CSS&lt;/li&gt;
&lt;li&gt;Analytics code&lt;/li&gt;
&lt;li&gt;Console -&amp;gt; Appearance -&amp;gt; Theme Settings -&amp;gt; Analytics code&lt;/li&gt;
&lt;li&gt;Post cover image display&lt;/li&gt;
&lt;li&gt;Console -&amp;gt; Appearance -&amp;gt; Theme Settings -&amp;gt; Cover mode&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post title&lt;/strong&gt;: set title to Cover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom cover&lt;/strong&gt;: if a custom thumbnail is set, it will be used as the cover; if there is no image, the background becomes the cover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Custom cover + title&lt;/strong&gt;: if a custom thumbnail is set, it will be used as the cover; if there is no image, the title becomes the cover.&lt;/li&gt;
&lt;li&gt;Other tools&lt;/li&gt;
&lt;li&gt;Blog feature (show reward + QR code buttons in posts)&lt;/li&gt;
&lt;li&gt;Enable SmoothScroll&lt;/li&gt;
&lt;li&gt;Sidebar&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;QR code&lt;/strong&gt;: show QR code in sidebar; also the post QR code. If disabled, both are hidden.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tag cloud&lt;/strong&gt;: show all blog tags in sidebar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Search bar&lt;/strong&gt;: show a cat that helps you search the site.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Categories&lt;/strong&gt;: show all blog categories in sidebar.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recent comments&lt;/strong&gt;: show recent comments; set count in Console -&amp;gt; Settings -&amp;gt; Comments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Custom Post Header Image&lt;/h2&gt;
&lt;p&gt;Enable &lt;code&gt;Custom Cover&lt;/code&gt; in Backend -&amp;gt; Appearance -&amp;gt; Cover mode.
Then set it in &lt;code&gt;Custom Fields&lt;/code&gt; while editing the post.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/usr/uploads/2017/07/987664267.png&quot; alt=&quot;snipaste20170702_154904.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;New Friend Links Format&lt;/h2&gt;
&lt;p&gt;In backend -&amp;gt; Create new page -&amp;gt; Custom template, use &quot;Friend Links&quot;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- ![Name](Image URL) [Name](Link URL &quot;Link description&quot;)
Example:
- ![Qingwan Navigation](https://www.chainwon.com/static/logo.png) [Qingwan Navigation](https://www.chainwon.com/ &quot;This navigation will have infinite possibilities!&quot;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If the format doesn&apos;t work, use this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a class=&quot;mdui-ripple&quot; href=&quot;https://www.chainwon.com/&quot; target=&quot;_blank&quot;&amp;gt;
    &amp;lt;img src=&quot;https://www.chainwon.com/static/logo.png&quot; alt=&quot;Qingwan Navigation&quot; title=&quot;Qingwan Navigation&quot;&amp;gt;
    &amp;lt;p&amp;gt;Qingwan Navigation&amp;lt;/p&amp;gt;
&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Wish List&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;- Completed (collapsed by default)
  - [Y] Completed 1
  - [Y] Completed 2
- [OPEN] Not completed (open)
  - [N] Not completed
  - [N] Not completed 2
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Completed (collapsed by default)
&lt;ul&gt;
&lt;li&gt;[Y] Completed 1&lt;/li&gt;
&lt;li&gt;[Y] Completed 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;[OPEN] Not completed (open)
&lt;ul&gt;
&lt;li&gt;[N] Not completed&lt;/li&gt;
&lt;li&gt;[N] Not completed 2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Image Layout&lt;/h2&gt;
&lt;p&gt;This feature requires strict formatting. Follow the format exactly, and do not omit line breaks.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[PIC2]

![Pearl River](https://i.loli.net/2018/09/01/5b8a59551a4d8.jpg)

![Pearl River](https://i.loli.net/2018/09/01/5b8a6ab761262.jpg)

[/PIC2]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[PIC2]&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2018/09/01/5b8a59551a4d8.jpg&quot; alt=&quot;Pearl River&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2018/09/01/5b8a6ab761262.jpg&quot; alt=&quot;Pearl River&quot; /&gt;&lt;/p&gt;
&lt;p&gt;[/PIC2]&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[PIC3]

![IMG_20180810_174621.jpg](https://i.loli.net/2018/09/01/5b8a95c57c988.jpg)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>post</category></item><item><title>Summer Vacation! Over!</title><link>https://nexmoe.com/1195</link><guid isPermaLink="true">https://nexmoe.com/1195</guid><pubDate>Sat, 08 Sep 2018 20:13:00 GMT</pubDate><content:encoded>&lt;p&gt;A lazy, nerdy, meaningless summer vacation.
The essay prompt for summer homework was “regret,” and I think this vacation was full of regrets too.
&lt;strong&gt;Traffic warning&lt;/strong&gt;
&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;Let’s say goodbye to summer with this song.&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 4078631&lt;/p&gt;
&lt;h2&gt;Went to Some Interesting/Not-So-Interesting Places&lt;/h2&gt;
&lt;p&gt;The first few weeks of vacation were the most fulfilling. I ate breakfast early every day (because breakfast was really good) and went long-distance cycling with a few people every night.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cycling destinations
&lt;ul&gt;
&lt;li&gt;A certain No.1 High School&lt;/li&gt;
&lt;li&gt;A certain Shishi No.1 High School&lt;/li&gt;
&lt;li&gt;People’s Square&lt;/li&gt;
&lt;li&gt;Shishi North Station&lt;/li&gt;
&lt;li&gt;North Latitude Square&lt;/li&gt;
&lt;li&gt;A national-level park&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Later in July, I stayed up late every day, sometimes all night—either watching anime, watching movies, or playing games.&lt;/p&gt;
&lt;p&gt;Then in August, the trip I planned for July finally started.
I originally planned a 3-day trip to Wuhan, which was changed to Guangzhou, then 5 days in Guangzhou was stretched to 11 days. On the way back, I spent 2 days in Wuhan.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Having all plans messed up is really annoying!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Places I wanted to go but didn’t
&lt;ul&gt;
&lt;li&gt;Window of the World&lt;/li&gt;
&lt;li&gt;Wuhan University&lt;/li&gt;
&lt;li&gt;A certain zoo in Guangzhou&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Places I actually visited
&lt;ul&gt;
&lt;li&gt;Canton Tower&lt;/li&gt;
&lt;li&gt;Pearl River&lt;/li&gt;
&lt;li&gt;Zhuhai coast&lt;/li&gt;
&lt;li&gt;Sun Yat-sen’s Former Residence&lt;/li&gt;
&lt;li&gt;A ticketed park (with Along the River During the Qingming Festival inside)&lt;/li&gt;
&lt;li&gt;Shishi North Station&lt;/li&gt;
&lt;li&gt;Wuhan Station&lt;/li&gt;
&lt;li&gt;Xiaolan Station&lt;/li&gt;
&lt;li&gt;Guangzhou Station&lt;/li&gt;
&lt;li&gt;Guangzhou Metro&lt;/li&gt;
&lt;li&gt;Wuhan Metro&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All photos below were taken casually with a Xiaomi 6.&lt;/p&gt;
&lt;h4&gt;Guangzhou&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a59551a4d8.jpg&quot; alt=&quot;Pearl River&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a6ab761262.jpg&quot; alt=&quot;Pearl River&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a5994b6e28.jpg&quot; alt=&quot;A ticketed park&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a5994b6e28.jpg&quot; alt=&quot;A ticketed park&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a5c8c34439.jpg&quot; alt=&quot;A ticketed park&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a59d5c50f3.jpg&quot; alt=&quot;Zhuhai&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a5c8c38a3f.jpg&quot; alt=&quot;On the high-speed train&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95c57c988.jpg&quot; alt=&quot;IMG_20180810_174621.jpg&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95c721f6f.jpg&quot; alt=&quot;IMG_20180811_125032.jpg&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95c87f8c2.jpg&quot; alt=&quot;IMG_20180811_135904.jpg&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95c955002.jpg&quot; alt=&quot;IMG_20180811_140602.jpg&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95c96d394.jpg&quot; alt=&quot;IMG_20180814_114559.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95c9aa2d9.jpg&quot; alt=&quot;IMG_20180814_114741.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95c9cd5b6.jpg&quot; alt=&quot;IMG_20180816_162243.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95c9d1567.jpg&quot; alt=&quot;IMG_20180816_161133.jpg&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95cfc342e.jpg&quot; alt=&quot;IMG_20180816_171325.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a9625e5775.jpg&quot; alt=&quot;IMG_20180816_213902.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95d0077fb.jpg&quot; alt=&quot;IMG_20180822_113242.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a95d05f957.jpg&quot; alt=&quot;IMG_20180822_114951.jpg&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;Wuhan&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a6d6f8aa42.jpg&quot; alt=&quot;IMG_20180823_170604 (1).jpg&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a6cd0ec124.jpg&quot; alt=&quot;IMG_20180823_170137.jpg&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a6cd015b59.jpg&quot; alt=&quot;IMG_20180824_231220.jpg&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a6cd0f066b.jpg&quot; alt=&quot;IMG_20180824_120512.jpg&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a6cd100651.jpg&quot; alt=&quot;IMG_20180823_153751.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b8a6cd102c4e.jpg&quot; alt=&quot;IMG_20180823_154336.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;I really wanted to see Wuhan University, but conditions didn’t allow it, so I “visited” online. It’s huge.&lt;/p&gt;
&lt;h2&gt;Ate Some Tasty/Not-So-Tasty Food&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b303233e0.jpg&quot; alt=&quot;IMG_20180814_211315.jpg&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3033b88a.jpg&quot; alt=&quot;IMG_20180818_143558.jpg&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b35d5af01.jpg&quot; alt=&quot;IMG_20180812_135907.jpg&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b35d5c64d.jpg&quot; alt=&quot;IMG_20180810_222335.jpg&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b35d29e8d.jpg&quot; alt=&quot;IMG_20180815_202432.jpg&quot; /&gt;&lt;/th&gt;
&lt;th&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b35d59ce9.jpg&quot; alt=&quot;IMG_20180812_141342.jpg&quot; /&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b35d72cae.jpg&quot; alt=&quot;IMG_20180815_200153.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b35d71214.jpg&quot; alt=&quot;IMG_20180815_130107.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b35d71818.jpg&quot; alt=&quot;IMG_20180814_131453.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b35d731af.jpg&quot; alt=&quot;IMG_20180815_125459_1.jpg&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b35d76c1e.jpg&quot; alt=&quot;IMG_20180816_104856.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b395ce42c.jpg&quot; alt=&quot;IMG_20180816_182405.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b395f30ac.jpg&quot; alt=&quot;IMG_20180816_182408.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b4798f933.jpg&quot; alt=&quot;IMG_20180823_165741.jpg&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3ccab6a9.jpg&quot; alt=&quot;IMG_20180817_202018.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3ccb2cf5.jpg&quot; alt=&quot;IMG_20180822_204626.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3ccedaaf.jpg&quot; alt=&quot;IMG_20180822_204334.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3ccef361.jpg&quot; alt=&quot;IMG_20180817_202014.jpg&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3cd0ab57.jpg&quot; alt=&quot;IMG_20180822_204353.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3cd0b08a.jpg&quot; alt=&quot;IMG_20180817_202324.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3cd1ea8e.jpg&quot; alt=&quot;IMG_20180822_204444.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3ce0ade6.jpg&quot; alt=&quot;IMG_20180823_091935.jpg&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3ce5859d.jpg&quot; alt=&quot;IMG_20180824_152839.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3df97044.jpg&quot; alt=&quot;IMG_20180824_170251.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3df9e61a.jpg&quot; alt=&quot;IMG_20180824_162006.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3df9ed3d.jpg&quot; alt=&quot;IMG_20180824_170254.jpg&quot; /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;img src=&quot;../../../assets/posts/%E6%9A%91%E5%81%87%EF%BC%81%E7%BB%93%E6%9D%9F%EF%BC%81/5b93b3dfa04e9.jpg&quot; alt=&quot;IMG_20180824_153533.jpg&quot; /&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content:encoded><category>post</category></item><item><title>Fix Text Copying in the Browser in Just Seven Lines</title><link>https://nexmoe.com/1173</link><guid isPermaLink="true">https://nexmoe.com/1173</guid><pubDate>Sat, 04 Aug 2018 20:21:00 GMT</pubDate><content:encoded>&lt;p&gt;Fix &lt;code&gt;clipboardData is not defined&lt;/code&gt;.
Works in Chrome and Firefox.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;I’ve wanted to add a “copy result to clipboard” feature for my navigation page for a long time, but after searching for ages, I still couldn’t find a solution. None of the jQuery libraries met my needs.&lt;/p&gt;
&lt;p&gt;I wanted a function that takes text and copies it directly to the clipboard.&lt;/p&gt;
&lt;p&gt;So I wrote a 7‑line JavaScript helper (based on jQuery):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function setCopy(txt) {
    $(&apos;body&apos;).append(&apos;&amp;lt;textarea id=&quot;copy&quot; style=&quot;height: 0;width: 0;border: 0;opacity:0;&quot;&amp;gt;&apos;+txt+&apos;&amp;lt;/textarea&amp;gt;&apos;);
    $(&apos;#copy&apos;).select();
    document.execCommand(&quot;Copy&quot;);
    $(&apos;#copy&apos;).remove();
    alert(&quot;复制成功！&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Use it by calling &lt;code&gt;setCopy()&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;(❗ This usage does NOT work in Firefox) For example, directly in an &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;href=&quot;JavaScript:setCopy(&apos;1533384805&apos;);&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(This usage works in Firefox) Prefer:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;onclick=&quot;setCopy(&apos;1533387161&apos;);&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%8F%AA%E8%A6%81%E4%B8%83%E8%A1%8C%EF%BC%8C%E8%A7%A3%E5%86%B3%E6%B5%8F%E8%A7%88%E5%99%A8%E7%9A%84%E6%96%87%E6%9C%AC%E5%A4%8D%E5%88%B6%E9%97%AE%E9%A2%98/5b84006897efd.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Cat UI For Angel</title><link>https://nexmoe.com/products/cat-ui-for-angel</link><guid isPermaLink="true">https://nexmoe.com/products/cat-ui-for-angel</guid><pubDate>Sun, 22 Apr 2018 05:00:59 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/5adb68b72db00.CsrKJffX.png&quot; alt=&quot;Cat UI For Angel&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/cat-ui-for-angel&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/5adb68b72db00.CsrKJffX.png" length="231371" type="image/png"/></item><item><title>Cat UI 1.4 For Angel (Free)</title><link>https://nexmoe.com/1111</link><guid isPermaLink="true">https://nexmoe.com/1111</guid><pubDate>Sun, 22 Apr 2018 00:50:00 GMT</pubDate><content:encoded>&lt;p&gt;Waiting for the people who is angel to me.
&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Preface&lt;/h2&gt;
&lt;p&gt;Waiting for the people who is angel to me.&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 1645112&lt;/p&gt;
&lt;h2&gt;Copyright&lt;/h2&gt;
&lt;p&gt;Apache&lt;/p&gt;
&lt;h2&gt;Github&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://img.shields.io/github/stars/theme-nexmoe/typecho-theme-catui-reissue.svg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/forks/theme-nexmoe/typecho-theme-catui-reissue.svg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/issues/theme-nexmoe/typecho-theme-catui-reissue.svg&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/last-commit/theme-nexmoe/typecho-theme-catui-reissue.svg?label=commits&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://img.shields.io/github/license/theme-nexmoe/typecho-theme-catui-reissue.svg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Demo Site&lt;/h2&gt;
&lt;p&gt;https://nexmoe.com/
If you use this template, feel free to leave your demo link in the comments.&lt;/p&gt;
&lt;h2&gt;Github&lt;/h2&gt;
&lt;p&gt;Star welcome
https://github.com/theme-nexmoe/typecho-theme-catui-reissue&lt;/p&gt;
&lt;h2&gt;Custom Post Header Image&lt;/h2&gt;
&lt;p&gt;Enable &lt;code&gt;CustomCover&lt;/code&gt; in Backend -&amp;gt; Appearance -&amp;gt; Cover mode (owner of the cat).
Then set it in the &lt;code&gt;Custom Fields&lt;/code&gt; while editing the post.&lt;/p&gt;
&lt;h2&gt;Preview&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/CatUI1.4ForAngel%EF%BC%88%E5%85%8D%E8%B4%B9%E7%89%88%EF%BC%89/5adb68b4800c3.jpg&quot; alt=&quot;5adb68b4800c3&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/CatUI1.4ForAngel%EF%BC%88%E5%85%8D%E8%B4%B9%E7%89%88%EF%BC%89/5adb68b70e5c9.png&quot; alt=&quot;5adb68b70e5c9&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/CatUI1.4ForAngel%EF%BC%88%E5%85%8D%E8%B4%B9%E7%89%88%EF%BC%89/5adb68b72db00.png&quot; alt=&quot;5adb68b72db00&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>New Year’s Red Envelopes, No Cash Inside</title><link>https://nexmoe.com/1070</link><guid isPermaLink="true">https://nexmoe.com/1070</guid><pubDate>Fri, 16 Feb 2018 14:14:00 GMT</pubDate><content:encoded>&lt;p&gt;It’s the first day of the Lunar New Year, and the Year of the Dog has finally arrived. Today the blogger is handing out red envelopes (even though I’m just a broke student).&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 1645112&lt;/p&gt;
&lt;h4&gt;Red Envelope Content&lt;/h4&gt;
&lt;p&gt;A copy of &lt;em&gt;To The Moon&lt;/em&gt; worth &lt;s&gt;36 RMB&lt;/s&gt; 9 RMB.&lt;/p&gt;
&lt;h4&gt;How to Claim&lt;/h4&gt;
&lt;p&gt;Search for Steam user ID: chainwon. Add me and message me to claim it.
As a broke student, there are only 5 copies (all 5 have been given out).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It’s really a great game. I hope the recipients enjoy it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4&gt;By the Way&lt;/h4&gt;
&lt;p&gt;Any good websites where I can submit for inclusion?
&lt;a href=&quot;https://console.chainwon.com/public/navigation&quot;&gt;https://console.chainwon.com/public/navigation&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Already Given Out&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Order&lt;/th&gt;
&lt;th&gt;Nickname&lt;/th&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;爆裂魔法&lt;/td&gt;
&lt;td&gt;76561198359754018&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;若能绽放光芒&lt;/td&gt;
&lt;td&gt;76561198298681533&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;天水一梦&lt;/td&gt;
&lt;td&gt;serilcandy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;鲍小螺&lt;/td&gt;
&lt;td&gt;dreamer-paul&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;鬼刀&lt;/td&gt;
&lt;td&gt;76561198372586471&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4&gt;To The Moon&lt;/h4&gt;
&lt;p&gt;It’s a story about two doctors who change memories to fulfill the last wishes of people at the end of their lives.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I only played for a little over an hour, but I think this is absolutely a game that will make your vision blur.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E6%96%B0%E5%B9%B4%E7%BA%A2%E5%8C%85%E4%B8%8D%E9%80%81%E9%92%B1/3724219798.jpg&quot; alt=&quot;3724219798&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E6%96%B0%E5%B9%B4%E7%BA%A2%E5%8C%85%E4%B8%8D%E9%80%81%E9%92%B1/1677825299.jpg&quot; alt=&quot;1677825299&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E6%96%B0%E5%B9%B4%E7%BA%A2%E5%8C%85%E4%B8%8D%E9%80%81%E9%92%B1/3563677343.jpg&quot; alt=&quot;3563677343&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Possibly the Most Beautiful Input Method on Windows</title><link>https://nexmoe.com/1047</link><guid isPermaLink="true">https://nexmoe.com/1047</guid><pubDate>Sat, 13 Jan 2018 20:00:00 GMT</pubDate><content:encoded>&lt;p&gt;A QQ Pinyin input method skin, possibly the most beautiful input method on Windows.
&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h4&gt;Copyright&lt;/h4&gt;
&lt;p&gt;Author: Danmo
QQ: 326618362
Email: vistahack@126.com&lt;/p&gt;
&lt;h4&gt;Intro&lt;/h4&gt;
&lt;p&gt;Outshines the original.&lt;/p&gt;
&lt;h4&gt;Requirements&lt;/h4&gt;
&lt;p&gt;This is a &lt;code&gt;QQ Pinyin&lt;/code&gt; input method skin, so you need QQ Pinyin installed.
Official site: http://qq.pinyin.cn/
Skin: http://skin.qq.pinyin.cn/skin_detail?skin_id=3746387701
Blogger&apos;s single-column OCD revision: https://cloud.i.chainwon.com/index.php?share/file&amp;amp;user=1&amp;amp;sid=CYdgTVBn&lt;/p&gt;
&lt;h4&gt;Preview&lt;/h4&gt;
&lt;p&gt;Single-column mode&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%8F%AF%E8%83%BD%E6%98%AF-Windows-%E4%B8%8A%E6%9C%80%E6%BC%82%E4%BA%AE%E7%9A%84%E8%BE%93%E5%85%A5%E6%B3%95/5b840133ac8a5.png&quot; alt=&quot;5b840133ac8a5&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Default mode&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%8F%AF%E8%83%BD%E6%98%AF-Windows-%E4%B8%8A%E6%9C%80%E6%BC%82%E4%BA%AE%E7%9A%84%E8%BE%93%E5%85%A5%E6%B3%95/5b84014dd3780.png&quot; alt=&quot;5b84014dd3780&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Vertical mode&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%8F%AF%E8%83%BD%E6%98%AF-Windows-%E4%B8%8A%E6%9C%80%E6%BC%82%E4%BA%AE%E7%9A%84%E8%BE%93%E5%85%A5%E6%B3%95/5b84016d0ed89.png&quot; alt=&quot;5b84016d0ed89&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%8F%AF%E8%83%BD%E6%98%AF-Windows-%E4%B8%8A%E6%9C%80%E6%BC%82%E4%BA%AE%E7%9A%84%E8%BE%93%E5%85%A5%E6%B3%95/5b8401836c49b.png&quot; alt=&quot;5b8401836c49b&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;My Settings&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%8F%AF%E8%83%BD%E6%98%AF-Windows-%E4%B8%8A%E6%9C%80%E6%BC%82%E4%BA%AE%E7%9A%84%E8%BE%93%E5%85%A5%E6%B3%95/5b840196768dd.png&quot; alt=&quot;5b840196768dd&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Ending! 2017!</title><link>https://nexmoe.com/999</link><guid isPermaLink="true">https://nexmoe.com/999</guid><pubDate>Sun, 31 Dec 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;As a lonely star shining far and...&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 404784667&lt;/p&gt;
&lt;p&gt;In the blink of an eye, 2017 has passed. Many dreams from 2016 still weren’t finished, but I did encounter many beautiful things along the way.&lt;/p&gt;
&lt;h4&gt;The Beautiful Scenery I Saw&lt;/h4&gt;
&lt;p&gt;Along the way, I fell more and more in love with music and learned &lt;code&gt;Synthesia&lt;/code&gt; and &lt;code&gt;ukulele&lt;/code&gt;. I’m not great, but it’s been enjoyable. I also met many interesting people—some who love sports, some fascinated by my stories, and a bunch of fellow strugglers. With them, studying no longer felt bitter or boring.&lt;/p&gt;
&lt;h4&gt;Which of Last Year’s Dreams Came True?&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;A unique navigation site (done)&lt;/li&gt;
&lt;li&gt;A unique wallpaper site (done)&lt;/li&gt;
&lt;li&gt;Make the top 50 in grade (done, 18th)&lt;/li&gt;
&lt;li&gt;English 110+ (not done, sigh)&lt;/li&gt;
&lt;li&gt;Play around with Ubuntu (didn’t; didn’t even get to try Deepin, and the hard drive broke)&lt;/li&gt;
&lt;li&gt;Website not losing money (still lost money, but at least there was a little income)&lt;/li&gt;
&lt;li&gt;Deeper JavaScript &amp;amp; jQuery, and better PHP usage (jQuery didn’t deepen much, but PHP improved a lot)&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Next, My Outlook for the Coming Year!&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Make a close friend who knows films very well&lt;/li&gt;
&lt;li&gt;Make a close friend who knows music very well&lt;/li&gt;
&lt;li&gt;Make a close friend who knows art very well&lt;/li&gt;
&lt;li&gt;Make a close friend who knows technology very well&lt;/li&gt;
&lt;li&gt;Get a &lt;code&gt;SanDisk 240G SSD&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;High school English 130+&lt;/li&gt;
&lt;li&gt;High school math 115+ (done, 136)&lt;/li&gt;
&lt;li&gt;High school Chinese at least 100&lt;/li&gt;
&lt;li&gt;Hope the organization can grow stronger&lt;/li&gt;
&lt;li&gt;Hope my family can live well&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;At the Very End, I Want to Thank Many People&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Thanks to the anonymous sponsors&lt;/li&gt;
&lt;li&gt;Thanks to those who use my software&lt;/li&gt;
&lt;li&gt;Thanks to those who bought my &lt;code&gt;Typecho&lt;/code&gt; theme&lt;/li&gt;
&lt;li&gt;Thanks to those lousy brothers&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2018-01-01 00:16:38 Monday&lt;/h4&gt;
&lt;p&gt;Sent New Year wishes to everyone in the friend links, hoping they won’t forget me in 2018.&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Cat UI For WordPress Base On Twenty Seventeen</title><link>https://nexmoe.com/928</link><guid isPermaLink="true">https://nexmoe.com/928</guid><pubDate>Sat, 28 Oct 2017 19:39:00 GMT</pubDate><content:encoded>&lt;p&gt;An improvisational work.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;Source&lt;/h2&gt;
&lt;p&gt;https://github.com/nexmoe/wordpress-theme-twenty-teventeen-plus&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/Cat-UI-For-WordPress-Base-On-Twenty-Seventeen/psb.png&quot; alt=&quot;psb (2)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/Cat-UI-For-WordPress-Base-On-Twenty-Seventeen/screenshot.png&quot; alt=&quot;screenshot&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Cat UI For WordPress</title><link>https://nexmoe.com/products/cat-ui-for-wordpress</link><guid isPermaLink="true">https://nexmoe.com/products/cat-ui-for-wordpress</guid><pubDate>Sat, 28 Oct 2017 04:55:22 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/screenshot.DHXqFhLF.png&quot; alt=&quot;Cat UI For WordPress&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/cat-ui-for-wordpress&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/screenshot.DHXqFhLF.png" length="366229" type="image/png"/></item><item><title>Open Source Program: Mixcm Treehole</title><link>https://nexmoe.com/872</link><guid isPermaLink="true">https://nexmoe.com/872</guid><pubDate>Fri, 06 Oct 2017 22:10:00 GMT</pubDate><content:encoded>&lt;p&gt;Mixcm Treehole, a project I built in one afternoon.
&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;License: MIT&lt;/h2&gt;
&lt;p&gt;Just keep the author credit.
Thanks to copyright trolls, the author has stopped updating.&lt;/p&gt;
&lt;h2&gt;Links&lt;/h2&gt;
&lt;p&gt;Github: https://github.com/mixcm/lovewall/releases&lt;/p&gt;
&lt;h2&gt;Screenshots&lt;/h2&gt;
&lt;h4&gt;Home&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%BC%80%E6%BA%90%E7%A8%8B%E5%BA%8F%EF%BC%9A%E8%A7%85%E6%80%9D%E6%A0%91%E6%B4%9E/392170353.png&quot; alt=&quot;snipaste20171006_220536.png&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;Submit form&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%BC%80%E6%BA%90%E7%A8%8B%E5%BA%8F%EF%BC%9A%E8%A7%85%E6%80%9D%E6%A0%91%E6%B4%9E/1628280214.png&quot; alt=&quot;snipaste20171006_220544.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Pseudo-static&lt;/h2&gt;
&lt;h4&gt;Apache&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
RewriteEngine On
RewriteBase /
RewriteRule ^mous/page/(.*)$ /index.php?mous=&amp;amp;page=$1
RewriteRule ^mous/(.*)/page/(.*)$ /index.php?mous=$1&amp;amp;page=$2
RewriteRule ^mous/(.*)$ /index.php?mous=$1&amp;amp;page=1
RewriteRule ^pages/(.*)$ /index.php?pages=$1
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Nginx&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;rewrite ^/mous/page/(.*)$ /index.php?mous=&amp;amp;page=$1;
rewrite ^/mous/(.*)/page/(.*)$ /index.php?mous=$1&amp;amp;page=$2;
rewrite ^/mous/(.*)$ /index.php?mous=$1&amp;amp;page=1;
rewrite ^/pages/(.*)$ /index.php?pages=$1;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Database Notes&lt;/h2&gt;
&lt;h4&gt;Import database&lt;/h4&gt;
&lt;p&gt;Import options.sql and contents.sql from the root directory into your database.&lt;/p&gt;
&lt;h4&gt;Connect database&lt;/h4&gt;
&lt;p&gt;Update your DB info in /require/function.php line 3.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&apos;mysql&apos;=&amp;gt;&apos;localhost&apos;,	//DB host
&apos;name&apos;=&amp;gt;&apos;root&apos;,		//DB user
&apos;password&apos;=&amp;gt;&apos;&apos;,		//DB password
&apos;dbname&apos;=&amp;gt;&apos;lovewall&apos;	//DB name
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Site info changes&lt;/h4&gt;
&lt;p&gt;You can change corresponding fields in the &lt;strong&gt;options&lt;/strong&gt; table.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%BC%80%E6%BA%90%E7%A8%8B%E5%BA%8F%EF%BC%9A%E8%A7%85%E6%80%9D%E6%A0%91%E6%B4%9E/3571750175.png&quot; alt=&quot;snipaste20171006_220927.png&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Typecho Simple Single‑Column Theme Cat UI 2.0</title><link>https://nexmoe.com/catui</link><guid isPermaLink="true">https://nexmoe.com/catui</guid><pubDate>Wed, 05 Jul 2017 19:34:00 GMT</pubDate><content:encoded>&lt;p&gt;Cat&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;https://github.com/theme-nexmoe/catui-reissue&lt;/p&gt;
&lt;h2&gt;Preview images&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Typecho%E7%AE%80%E6%B4%81%E5%8D%95%E6%A0%8F%E4%B8%BB%E9%A2%98Cat-UI-2-0/3772187712.png&quot; alt=&quot;3772187712&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Typecho%E7%AE%80%E6%B4%81%E5%8D%95%E6%A0%8F%E4%B8%BB%E9%A2%98Cat-UI-2-0/1565556288.png&quot; alt=&quot;1565556288&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Typecho%E7%AE%80%E6%B4%81%E5%8D%95%E6%A0%8F%E4%B8%BB%E9%A2%98Cat-UI-2-0/3768132762.png&quot; alt=&quot;snipaste20170705_192419.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Typecho%E7%AE%80%E6%B4%81%E5%8D%95%E6%A0%8F%E4%B8%BB%E9%A2%98Cat-UI-2-0/1127620322.png&quot; alt=&quot;snipaste20170705_192436.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Typecho%E7%AE%80%E6%B4%81%E5%8D%95%E6%A0%8F%E4%B8%BB%E9%A2%98Cat-UI-2-0/3196158091.png&quot; alt=&quot;snipaste20170705_192521.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Typecho%E7%AE%80%E6%B4%81%E5%8D%95%E6%A0%8F%E4%B8%BB%E9%A2%98Cat-UI-2-0/1638405287.png&quot; alt=&quot;snipaste20170705_192542.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/Typecho%E7%AE%80%E6%B4%81%E5%8D%95%E6%A0%8F%E4%B8%BB%E9%A2%98Cat-UI-2-0/2848428221.png&quot; alt=&quot;snipaste20170705_193255.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Github: https://github.com/theme-nexmoe/typecho-theme-catui&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Notes&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Only tested under HTTPS; behavior under HTTP is unknown.&lt;/li&gt;
&lt;li&gt;Typecho 1.0.14.10.10&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Reissue&lt;/h2&gt;
&lt;p&gt;https://nexmoe.com/1111.html&lt;/p&gt;
&lt;h2&gt;Changelog&lt;/h2&gt;
&lt;h4&gt;2017-07-05 Update 2.0&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;Brand new design&lt;/li&gt;
&lt;li&gt;Brand new markdown&lt;/li&gt;
&lt;li&gt;More concise…&lt;/li&gt;
&lt;li&gt;New material style&lt;/li&gt;
&lt;li&gt;Structure updates…&lt;/li&gt;
&lt;li&gt;Still single‑column!&lt;/li&gt;
&lt;li&gt;Roast couples&lt;/li&gt;
&lt;li&gt;Almost all code rewritten&lt;/li&gt;
&lt;li&gt;QQ group: 482634342 (preview images released from time to time)&lt;/li&gt;
&lt;li&gt;Comment box optimized&lt;/li&gt;
&lt;li&gt;Comment emojis&lt;/li&gt;
&lt;li&gt;Post emojis&lt;/li&gt;
&lt;li&gt;New sidebar&lt;/li&gt;
&lt;li&gt;Mobile support&lt;/li&gt;
&lt;li&gt;Large screen support&lt;/li&gt;
&lt;li&gt;Tips and QR code feature pending…&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;2017-04-15 Update 1.3&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;span style=&quot;color:red;&quot;&amp;gt;This version is absolutely not a sincere release. Please wait for 2.0 — the UI will be heavily redesigned…&amp;lt;/span&amp;gt;&lt;/li&gt;
&lt;li&gt;Changed the max width&lt;/li&gt;
&lt;li&gt;Use Typecho’s native comment box&lt;/li&gt;
&lt;li&gt;Added “couples mode”&lt;/li&gt;
&lt;li&gt;Various refinements&lt;/li&gt;
&lt;li&gt;Tag cloud, recent comments, posts, etc…&lt;/li&gt;
&lt;li&gt;CDN cached the 1.2 update package, awkward…&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;2017-03-04 Update 1.2 “See you next time, my little cat.”&lt;/h4&gt;
</content:encoded><category>post</category></item><item><title>Today I Switched Friend Links to Markdown and Something Terrible Happened!</title><link>https://nexmoe.com/614</link><guid isPermaLink="true">https://nexmoe.com/614</guid><pubDate>Thu, 29 Jun 2017 15:10:00 GMT</pubDate><content:encoded>&lt;p&gt;Because the HTML code was too messy, I wanted to switch to Markdown format. I borrowed Jrotty&apos;s code, but it didn&apos;t do what I wanted. I tinkered for a long time and finally got it almost right, then something terrible happened...
&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h4&gt;Compressed HTML&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;分享互联网的宝藏&quot;href=&quot;https://aoaoao.me/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrawpcvjnj302s02sweb.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;树洞&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;一只野生的自由Geek&quot;href=&quot;https://blog.viosey.com/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrb5kz8dpj304g04gglj.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Viosey&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;热爱技术和生活的程序员&quot;href=&quot;http://www.yelook.com/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrbj1a9tcj302s02sjr7.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;有野出没&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;用code写出对二次元的热爱！&quot;href=&quot;http://853.bronya.net/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrbl6j81cj30hs0hs400.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Sonic853&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;ペロペロ&quot;href=&quot;https://www.anotherhome.net/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrblwpndyj309w09wt93.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;DIYGod&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;只是一些我的胡说八道罢了&quot;href=&quot;http://blog.jinkunchen.com/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrbn4gkk1j30hs0hsgm9.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;卷卷有空格&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;是萝莉控真是太好了&quot;href=&quot;http://siitake.cn/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrbqj62n0j3074074q3n.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;香菇社长&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;活靠幻想，技术靠转载！&quot;href=&quot;https://qqdie.com/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrbrcgv0bj30b40b4408.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Jrotty&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot; 一只蒟蒻的日常&quot;href=&quot;http://wnjxyk.cn/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrbs6h3yuj30gn0gm75r.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;WNJXYK&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;兰陵の废宅基地&quot;href=&quot;http://blog.thkira.com/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrbteserej30k00k0gn8.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;兰陵 DA☆ZE&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;就好像看透了我的心思一般，你总是突然出现……&quot;href=&quot;https://www.dreamwings.cn/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrbukyc33j308c08c74j.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;千千&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;一个喜欢捣鼓前端的产品汪。&quot;href=&quot;http://shawnzeng.com/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbrbvj35yij30cj0cjmyl.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Shawn&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;萝莉即是一切&quot;href=&quot;https://www.ailoli.org/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgw1fbsgaz6xf8j30go0godh5.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Ailoli&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;2333333333333&quot;href=&quot;http://hi-paul.space&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fc0i6dwd86j30e10e1gof.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;保罗&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;喜欢萌妹の变态鹅&quot;href=&quot;https://blog.conoha.vip/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fc24txdskgj30g40g477s.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Moehentai&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;Troy的星球&quot;href=&quot;https://itroy.cc&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fc3w9wldgxj30e80e8e1c.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Troy&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;幻想主義者&quot;href=&quot;https://www.54yt.net/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fcccka7mfsj308m08mjrz.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;玉兔&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;博客主要是记录日常生活，开发过程有用的东西，还有制作成果展示等等，欢迎访问。&quot;href=&quot;https://www.fghrsh.net/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fcmi1v7bpyj30go0go177.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;FGHRSH&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;超级迷茫中。。。&quot;href=&quot;https://hran.me/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fcuxwll0lpj30b40b4q3k.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Hran&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;私たちはずっとμ&apos;s！！！！！！！！&quot;href=&quot;https://kotori.love/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fcvsloueiuj308c08caa7.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;ココロ&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;我有一壶酒，足矣慰风霜。&quot;href=&quot;https://sa.bi/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fcvt6nv3cvj304q04qjra.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Dragonborn&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;零三青年，只会作死，喜欢喝茶、中二、敲代码❤&quot;href=&quot;https://idiot.moe/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/a15b4afegy1fd3yir3bo0j20b40b43ya.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;蔡锶铎&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;你不爱我了QAQ&quot;href=&quot;https://www.iqi7.com/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/a15b4afegy1fd3ze85p3yj20hs0hsq3e.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;七夏浅笑&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;次元隙小站&quot;href=&quot;http://waxxh.me/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fdovyvnq31j303903bq3s.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Waxxh&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;记录成长的点点滴滴&quot;href=&quot;http://monsterlin.com/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fdow0sn4qlj305k05ka9z.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;monsterlin&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;泛着旧时记忆的空白扉页&quot;href=&quot;http://www.0page.org/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fdq5jy7copj3046046gmo.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;0page&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;人生来就不是为了被打败的&quot;href=&quot;http://ttt.lc/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/6513ad21jw8f5zcn0uk34j20kv0kv3zz.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;桃先森&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;404 NOT FOUND&quot;href=&quot;https://xiaolin.in/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1fec4otg2xej30dw0dwwfo.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;小霖&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;把设计师气到脑中风2333∠( ᐛ 」∠)＿&quot;href=&quot;https://www.metheno.net/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1felao15513j3064064glu.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;metheno&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;永远相信，美好的事情即将发生&quot;href=&quot;https://blog.lim-light.com/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qly1fenes19futj30hs0hsmy7.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;黎明余光&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;喵～&quot;href=&quot;https://blog.taku.life/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006MhmB7gy1ff2s4jq0qsj3028028744.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;ギリ猫&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;努力的成为一个有趣的人&quot;href=&quot;http://neverlove.me&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006MhmB7gy1fh19u4rfa0j305k05k404.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;不才博客&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;这是很好的一生&quot;href=&quot;https://www.qqstop.cn/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006MhmB7gy1fh19v5rh1xj30b40b474i.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;Kevan&apos;s Blog&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;暮冬时烤雪，迟夏写长信&quot;href=&quot;https://iu.tn/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006MhmB7gy1fh19wcga7lg305k05kmyk.gif&quot;&amp;gt; &amp;lt;p&amp;gt;三秋&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;聆听最初的声音，向往无尽的未来&quot;href=&quot;https://imiku.me/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006pSa7Qgy1feulw1frmsj306o06oq4i.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;冰凌胧月&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;a class=&quot;btn btn-raised&quot;title=&quot;暮光博客是一个分享生活记录以及互联网技术文章的个人博客&quot;href=&quot;https://muguang.me/&quot;target=&quot;_blank&quot;&amp;gt;&amp;lt;img src=&quot;https://ws1.sinaimg.cn/large/006MhmB7gy1fh1at1iiubj3050050t8m.jpg&quot;&amp;gt; &amp;lt;p&amp;gt;暮光博客&amp;lt;/p&amp;gt;&amp;lt;/a&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pretty spectacular, right?&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/uploads/2017/06/2837893126.png&quot; alt=&quot;snipaste20170629_151628.png&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Yes, this was my original HTML code. Seeing this, I wasn&apos;t happy. Manually reformatting that many entries one by one is basically asking me to do it against my conscience!&lt;/p&gt;
&lt;h4&gt;How I handled it&lt;/h4&gt;
&lt;p&gt;So I put the code above into a file called e.html, then created a zz.php (&quot;idiot&quot;) script.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
    $str = file_get_contents(&quot;e.html&quot;);
    preg_match_all(&apos;/title=&quot;(.*?)&quot;href=&quot;(.*?)&quot;target=&quot;_blank&quot;&amp;gt;/is&apos;,$str,$array);
    preg_match_all(&apos;/&amp;lt;p&amp;gt;(.*?)&amp;lt;\/p&amp;gt;/is&apos;,$str,$array2);
    preg_match_all(&apos;/&amp;lt;img src=&quot;(.*?)&quot;&amp;gt;/is&apos;,$str,$array3);
    $x=0;
    while ($array[0][$x] != &apos;&apos;){
        $str = preg_replace(&apos;#title=&quot;(.*?)&quot;href=&quot;(.*?)&quot;target=&quot;_blank&quot;&amp;gt;#&apos;,&apos;$1&apos;, $array[0][$x]);
        $str1 = preg_replace(&apos;#title=&quot;(.*?)&quot;href=&quot;(.*?)&quot;target=&quot;_blank&quot;&amp;gt;#&apos;,&apos;$2&apos;, $array[0][$x]);
        $str2 = preg_replace(&apos;#&amp;lt;img src=&quot;(.*?)&quot;&amp;gt;#&apos;,&apos;$1&apos;, $array3[0][$x]);
        $str3 = preg_replace(&apos;#&amp;lt;p&amp;gt;(.*?)&amp;lt;\/p&amp;gt;#&apos;,&apos;$1&apos;, $array2[0][$x]);
        echo &apos;- ![&apos;.$str3.&apos;](&apos;.$str2.&apos;) [&apos;.$str3.&apos;](&apos;.$str1.&apos; &quot;&apos;.$str.&apos;&quot;)&amp;lt;br&amp;gt;&apos;.&quot;\n&quot;;
        $x++;
    }
?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Result&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/uploads/2017/06/1622308574.png&quot; alt=&quot;snipaste20170629_151530.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;&lt;img src=&quot;https://nexmoe.com/images/uploads/2017/06/3581675946.png&quot; alt=&quot;snipaste20170629_151356.png&quot; /&gt;
--- src/content/posts/开发/利用 goto 来防止 if 嵌套.md&lt;/h2&gt;
&lt;h2&gt;title: 利用 goto 来防止 if 嵌套
slug: 1280
cover: https://cdn.jsdelivr.net/gh/nexmoe/image@latest/QQ图片20210415151105.jpg
pubDate: 2018-11-24T18:04:00&lt;/h2&gt;
&lt;p&gt;流程控制中的 if 是比较简单的逻辑判断，但是在多条逻辑判断中很容易造成 if 嵌套，逻辑复杂度较高，让人感到十分混乱。&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;万恶的 if 嵌套&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
$a = array(
    &apos;state&apos; =&amp;gt; &apos;1&apos;,
    &apos;notice&apos; =&amp;gt; &apos;注册成功！&apos;,
);

if ($_GET[&apos;username&apos;] != &apos;&apos;) {
    if (strlen($_GET[&apos;username&apos;]) &amp;gt; 4 or !strlen($_GET[&apos;username&apos;]) &amp;lt; 11) {
        $name = array(&apos;root&apos;,&apos;admin&apos;,&apos;GETmaster&apos;,&apos;master&apos;,&apos;webmaster&apos;,&apos;mixcm&apos;,&apos;administrator&apos;,&apos;sb&apos;,&apos;shabi&apos;);
        if (!in_array($_GET[&apos;username&apos;], $name)) {
            if (preg_match(&quot;/^[a-zA-Z\s]+$/&quot;, $_GET[&apos;username&apos;])) {
                $a[&apos;state&apos;] = &apos;0&apos;;
                $a[&apos;notice&apos;] = &apos;用户名必须为英文！&apos;;
            }
        } else {
            $a[&apos;state&apos;] = &apos;0&apos;;
            $a[&apos;notice&apos;] = &apos;非法用户名！&apos;;
        }
    } else {
        $a[&apos;state&apos;] = &apos;0&apos;;
        $a[&apos;notice&apos;] = &apos;请输入大于4字符，且小于11个字符的用户名！&apos;;
    }

} else {
    $a[&apos;state&apos;] = &apos;0&apos;;
    $a[&apos;notice&apos;] = &apos;用户名不能为空！&apos;;
}

echo json_encode($a,JSON_UNESCAPED_UNICODE);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是在实际操作中就会想方设法避免以上格式。便有了 goto 和 表数据。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;逻辑清晰&lt;/li&gt;
&lt;li&gt;后期修改容易&lt;/li&gt;
&lt;li&gt;但需要防止 goto 滥用，建议只定义一个，列如本例就只定义了 end&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;利用 goto 解决（以下代码中有使用到表数据）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php
$a = array(
    &apos;state&apos; =&amp;gt; &apos;1&apos;,
    &apos;notice&apos; =&amp;gt; &apos;注册成功！&apos;,
);

if ($_GET[&apos;username&apos;] == &apos;&apos;) {
    $a[&apos;state&apos;] = &apos;0&apos;;
    $a[&apos;notice&apos;] = &apos;用户名不能为空！&apos;;
    goto end;
}

if (strlen($_GET[&apos;username&apos;]) &amp;lt; 4 or strlen($_GET[&apos;username&apos;]) &amp;gt; 11) {
    $a[&apos;state&apos;] = &apos;0&apos;;
    $a[&apos;notice&apos;] = &apos;请输入大于4字符，且小于11个字符的用户名！&apos;;
    goto end;
}

$name = array(&apos;root&apos;,&apos;admin&apos;,&apos;GETmaster&apos;,&apos;master&apos;,&apos;webmaster&apos;,&apos;mixcm&apos;,&apos;administrator&apos;,&apos;sb&apos;,&apos;shabi&apos;);
if (in_array($_GET[&apos;username&apos;], $name)) {
    $a[&apos;state&apos;] = &apos;0&apos;;
    $a[&apos;notice&apos;] = &apos;非法用户名！&apos;;
    goto end;
}

if (!preg_match(&quot;/^[a-zA-Z\s]+$/&quot;, $_GET[&apos;username&apos;])) {
    $a[&apos;state&apos;] = &apos;0&apos;;
    $a[&apos;notice&apos;] = &apos;用户名必须为英文！&apos;;
    goto end;
}

end:
echo json_encode($a,JSON_UNESCAPED_UNICODE);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;--- src/content/posts/开发/博客，我优化了什么.md&lt;/h2&gt;
&lt;p&gt;title: 博客，我优化了什么？
cover:  https://nexmoe.com/images/cover/compress/motorcycle-1690452_1920.jpg
coverWidth: 1920
coverHeight: 1206
tags:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hexo&lt;/li&gt;
&lt;li&gt;博客&lt;/li&gt;
&lt;li&gt;主题
slug: 661812793
pubDate: 2020-02-09T16:10:00&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;由于博客性能一直很弱鸡，所以花了两天时间优化了一下，以下，是我的优化成果。&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;先上跑分&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://i.speed.moe/image/E3nH&quot;&gt;&lt;img src=&quot;https://image.gslb.dawnlab.me/af94d4afe7524d6522600fae70430e67.png&quot; alt=&quot;af94d4afe7524d6522600fae70430e67.png&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://i.speed.moe/image/E7B5&quot;&gt;&lt;img src=&quot;https://image.gslb.dawnlab.me/f5c19b5607a3f5de94a15b007628e72f.png&quot; alt=&quot;f5c19b5607a3f5de94a15b007628e72f.png&quot; /&gt;&lt;/a&gt;
&lt;a href=&quot;https://i.speed.moe/image/EQ6p&quot;&gt;&lt;img src=&quot;https://image.gslb.dawnlab.me/4be54fe2007099d4c791c8a13489af77.png&quot; alt=&quot;4be54fe2007099d4c791c8a13489af77.png&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;去掉一些依赖&lt;/h2&gt;
&lt;p&gt;❌ 移除 fancybox
❌ 移除 SmoothScroll
❌ 移除 jQuery
❌ 移除 Pjax
已经 2020 年，我觉得 jQuery 是不需要的。
Edge 的正式发布自带良好的平滑滚动效果，加上 SmoothScroll 在 MacOS 上会有卡顿感，所以移除。
移除 fancybox 是因为平常真的不怎么用，还是直接鼠标右键打开原图看舒服。&lt;/p&gt;
&lt;h2&gt;Lazyload 优化&lt;/h2&gt;
&lt;p&gt;在此之前，我的博客首页一直有一个问题，图片加载抖动，所以我直接让文章每一个图片输入图片的长度和高度来计算图片占位大小来防止抖动。
不过确实麻烦了点。
此前的 Front-matter&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 博客，我优化了什么？
cover: https://nexmoe.com/images/cover/compress/motorcycle-1690452_1920.jpg
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在的 Front-matter&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 博客，我优化了什么？
cover: https://nexmoe.com/images/cover/compress/motorcycle-1690452_1920.jpg
coverWidth: 1920
coverHeight: 1206
---
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并且对 Lazyload 加了一个非线性动画，给人一种更快乐的感觉。&lt;/p&gt;
&lt;h2&gt;资源合并&lt;/h2&gt;
&lt;p&gt;这个操作就很方便了，因为 jsdelivr 自带了合并功能，可以自由的合并多个库
比如 https://cdn.jsdelivr.net/combine/npm/highlight.js@9.15.8/styles/atom-one-dark.css,gh/nexmoe/nexmoe.github.io@latest/css/style.css,gh/nexmoe/nexmoe.github.io@latest/lib/mdui_043tiny/css/mdui.css,gh/nexmoe/nexmoe.github.io@latest/lib/iconfont/iconfont.css
所以我把博客所有的 css 和 js 文件分别合并成了一个，因此浏览器请求量减小，所以速度也有些许提升。&lt;/p&gt;
&lt;h2&gt;图片压缩&lt;/h2&gt;
&lt;p&gt;我的首页图就是看个爽，为什么要原图且无损？
所以我统一将图片全部压成 920px 的宽度了，大量减小图片大小。速度暴涨。&lt;/p&gt;
&lt;h2&gt;依赖库简化&lt;/h2&gt;
&lt;p&gt;由于主题依赖了 mdui，而 mdui 会加载字体，所以我把它本地化，然后删掉了颜色类，辅助类，以及字体类。
速度也有些许提升。&lt;/p&gt;
&lt;h2&gt;部分 js 用 nodejs 重写&lt;/h2&gt;
&lt;h2&gt;以前启用 lazyload 和一些功能，我是用 js 写的，所以在网页渲染的时候需要重新渲染，所以需要占用一定的性能。
所以我就将一部分使用 nodejs 重写，Hexo 会在编译的时候完成工作，因此在浏览器访问时就不需要渲染了。
--- src/content/posts/开发/开源程序：觅思树洞.md&lt;/h2&gt;
&lt;p&gt;title: 开源程序：觅思树洞
author: 折影轻梦
slug: 872
cover: https://nexmoe.com/images/开源程序：觅思树洞/59d83a91726aa (1).png
tags:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PHP
pubDate: 2017-10-06T22:10:00&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;觅思树洞，一个我一下午的作品。
&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;版权 MIT&lt;/h2&gt;
&lt;p&gt;只需要留作者版权就行了。
感谢版权狗，作者已停更。&lt;/p&gt;
&lt;h2&gt;相关链接&lt;/h2&gt;
&lt;p&gt;Github: https://github.com/mixcm/lovewall/releases&lt;/p&gt;
&lt;h2&gt;展示图&lt;/h2&gt;
&lt;h4&gt;首页&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%BC%80%E6%BA%90%E7%A8%8B%E5%BA%8F%EF%BC%9A%E8%A7%85%E6%80%9D%E6%A0%91%E6%B4%9E/392170353.png&quot; alt=&quot;snipaste20171006_220536.png&quot; /&gt;&lt;/p&gt;
&lt;h4&gt;提交表单&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;../../../assets/posts/%E5%BC%80%E6%BA%90%E7%A8%8B%E5%BA%8F%EF%BC%9A%E8%A7%85%E6%80%9D%E6%A0%91%E6%B4%9E/1628280214.png&quot; alt=&quot;snipaste20171006_220544.png&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;伪静态&lt;/h2&gt;
&lt;h4&gt;Apache&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;IfModule mod_rewrite.c&amp;gt;
RewriteEngine On
RewriteBase /
RewriteRule ^mous/page/(.*)$ /index.php?mous=&amp;amp;page=$1
RewriteRule ^mous/(.*)/page/(.*)$ /index.php?mous=$1&amp;amp;page=$2
RewriteRule ^mous/(.*)$ /index.php?mous=$1&amp;amp;page=1
RewriteRule ^pages/(.*)$ /index.php?pages=$1
&amp;lt;/IfModule&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Nginx&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;rewrite ^/mous/page/(.*)$ /index.php?mous=&amp;amp;page=$1;
rewrite ^/mous/(.*)/page/(.*)$ /index.php?mous=$1&amp;amp;page=$2;
rewrite ^/mous/(.*)$ /index.php?mous=$1&amp;amp;page=1;
rewrite ^/pages/(.*)$ /index.php?pages=$1;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;数据库说明&lt;/h2&gt;
&lt;h4&gt;导入数据库&lt;/h4&gt;
&lt;p&gt;先将根目录内的 options.sql 和 contents.sql 导入数据库&lt;/p&gt;
&lt;h4&gt;连接数据库&lt;/h4&gt;
&lt;p&gt;在 /require/function.php 第三行 更改为自己的数据库信息&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&apos;mysql&apos;=&amp;gt;&apos;localhost&apos;,	//数据库地址
&apos;name&apos;=&amp;gt;&apos;root&apos;,		//数据库登录名
&apos;password&apos;=&amp;gt;&apos;&apos;,		//数据库密码
&apos;dbname&apos;=&amp;gt;&apos;lovewall&apos;	//数据库名
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;网站信息更改&lt;/h4&gt;
&lt;p&gt;在数据库中的表 &lt;strong&gt;options&lt;/strong&gt; 中可以对对应项进行更改。&lt;/p&gt;
&lt;h2&gt;&lt;img src=&quot;../../../assets/posts/%E5%BC%80%E6%BA%90%E7%A8%8B%E5%BA%8F%EF%BC%9A%E8%A7%85%E6%80%9D%E6%A0%91%E6%B4%9E/3571750175.png&quot; alt=&quot;snipaste20171006_220927.png&quot; /&gt;
--- src/content/posts/开发/美化你的终端.md&lt;/h2&gt;
&lt;h2&gt;title: 美化你的终端
cover:  https://nexmoe.com/images/cover/compress/pasted-12.png
coverWidth: 1370
coverHeight: 942
slug: 1519803391
pubDate: 2019-08-09T18:49:03&lt;/h2&gt;
&lt;p&gt;自带的 PowerShell 虽然有了自定义颜色等功能，但还是太丑，这一篇文章将帮你打造 Windows10 上最美终端。&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;h2&gt;安装 &lt;s&gt;Fluent Terminal&lt;/s&gt; 建议使用 Terminus&lt;/h2&gt;
&lt;p&gt;Fluent Terminal 是一个基于 UWP 和 Web 技术的终端，相比较 Terminus，占用资源更少，而且有中文翻译，并且设置页还有 GUI。&lt;/p&gt;
&lt;p&gt;在以下链接下载最新版
&lt;a href=&quot;https://github.com/felixse/FluentTerminal/releases&quot;&gt;https://github.com/felixse/FluentTerminal/releases&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;解压到任意位置，打开目录，右键 &lt;code&gt;Install.ps1&lt;/code&gt; 使用 PowerShell 运行，选择 Sideloading（旁加载应用）安装&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF/pasted-1.png&quot; alt=&quot;安装 Fluent Terminal&quot; /&gt;&lt;/p&gt;
&lt;p&gt;安装完成&lt;/p&gt;
&lt;h2&gt;安装 Terminus&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://eugeny.github.io/terminus/&quot;&gt;https://eugeny.github.io/terminus/&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;安装 oh-my-posh 与 posh-git&lt;/h2&gt;
&lt;p&gt;posh-git：此模块用于将 git 集成于 PowerShell 中
oh-my-posh：本次美化主角，带色的箭头标签&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-ExecutionPolicy Bypass
Install-Module posh-git -Scope CurrentUser
Install-Module oh-my-posh -Scope CurrentUser
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF/pasted-7.png&quot; alt=&quot;安装 oh-my-posh&quot; /&gt;&lt;/p&gt;
&lt;p&gt;启用 oh-my-posh 与 posh-git&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Import-Module posh-git
Import-Module oh-my-posh
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置主题&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Set-Theme Agnoster
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可选列表&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agnoster&lt;/li&gt;
&lt;li&gt;Avit&lt;/li&gt;
&lt;li&gt;Darkblood&lt;/li&gt;
&lt;li&gt;Fish&lt;/li&gt;
&lt;li&gt;Honukai&lt;/li&gt;
&lt;li&gt;Paradox&lt;/li&gt;
&lt;li&gt;PowerLine&lt;/li&gt;
&lt;li&gt;robbyrussell&lt;/li&gt;
&lt;li&gt;Sorin&lt;/li&gt;
&lt;li&gt;tehrob&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;输入获取配置项目录&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$profile
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF/pasted-9.png&quot; alt=&quot;upload successful&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开控制台输出目录中的文件，输入配置项并保存&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Import-Module oh-my-posh
Set-Theme Agnoster
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF/pasted-10.png&quot; alt=&quot;upload successful&quot; /&gt;&lt;/p&gt;
&lt;p&gt;打开 Fluent Terminal 查看效果&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/images/%E7%BE%8E%E5%8C%96%E4%BD%A0%E7%9A%84%E7%BB%88%E7%AB%AF/pasted-12.png&quot; alt=&quot;upload successful&quot; /&gt;&lt;/p&gt;
</content:encoded><category>post</category></item><item><title>Typecho Word Count</title><link>https://nexmoe.com/131</link><guid isPermaLink="true">https://nexmoe.com/131</guid><pubDate>Sat, 18 Feb 2017 00:30:00 GMT</pubDate><content:encoded>&lt;p&gt;Super simple. Just insert the following code into &lt;code&gt;functions.php&lt;/code&gt; in the root of the current theme.&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;Currently it only counts Chinese characters in the post.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;function  art_count ($cid){
    $db=Typecho_Db::get ();
    $rs=$db-&amp;gt;fetchRow ($db-&amp;gt;select (&apos;table.contents.text&apos;)-&amp;gt;from (&apos;table.contents&apos;)-&amp;gt;where (&apos;table.contents.cid=?&apos;,$cid)-&amp;gt;order (&apos;table.contents.cid&apos;,Typecho_Db::SORT_ASC)-&amp;gt;limit (1));
    $text = preg_replace(&quot;/[^\x{4e00}-\x{9fa5}]/u&quot;, &quot;&quot;, $rs[&apos;text&apos;]);
    echo mb_strlen($text,&apos;UTF-8&apos;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Insert this where you want to display it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;?php art_count($this-&amp;gt;cid); ?&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
</content:encoded><category>post</category></item><item><title>Happy Year of the Rooster, 2016 Is Over</title><link>https://nexmoe.com/76</link><guid isPermaLink="true">https://nexmoe.com/76</guid><pubDate>Sat, 31 Dec 2016 21:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Only three hours left in 2016. It’s time for the annual year-end summary. The blog has finally entered a stable state, so I’m writing this summary and my New Year’s plans. Cover image from: &amp;lt;a href=&quot;https://aoaoao.me/1260.html&quot; target=&quot;_blank&quot;&amp;gt;Aaron&amp;lt;/a&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;!--more--&amp;gt;&lt;/p&gt;
&lt;p&gt;NetEase Cloud Music ID: 34218195&lt;/p&gt;
&lt;p&gt;&lt;em&gt;—First, wishing everyone a lucky Year of the Rooster!&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;Haven’t Done&lt;/h2&gt;
&lt;p&gt;Plans never keep up with changes, and there are still some goals I didn’t reach.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A unique navigation site&lt;/li&gt;
&lt;li&gt;A unique wallpaper site&lt;/li&gt;
&lt;li&gt;Rank top 50 in grade (best was 53)&lt;/li&gt;
&lt;li&gt;English 110+ (best was 108)&lt;/li&gt;
&lt;li&gt;Play around with Ubuntu&lt;/li&gt;
&lt;li&gt;Website not losing money (actually lost ~1000+)&lt;/li&gt;
&lt;li&gt;Deeper JavaScript &amp;amp; jQuery, and perfect PHP usage&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Have Done&lt;/h2&gt;
&lt;p&gt;Life is full of wonderful surprises, including some new ideas.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;A blog theme of my own&lt;/li&gt;
&lt;li&gt;Duoshuo styling&lt;/li&gt;
&lt;li&gt;Qingwan Wallpaper API&lt;/li&gt;
&lt;li&gt;A brand-new navigation V3 concept&lt;/li&gt;
&lt;li&gt;Friend list concept&lt;/li&gt;
&lt;li&gt;Mechanical keyboard (blue switches)&lt;/li&gt;
&lt;li&gt;Raspberry Pi&lt;/li&gt;
&lt;li&gt;Stable server and domain&lt;/li&gt;
&lt;li&gt;Met lots of new friends&lt;/li&gt;
&lt;li&gt;Watched &lt;em&gt;Your Name&lt;/em&gt; with a girl and invited her to hang out at my place&lt;/li&gt;
&lt;li&gt;Nonsense CSS design&lt;/li&gt;
&lt;li&gt;Played &lt;em&gt;Overwatch&lt;/em&gt; (on someone else’s account, lol, I couldn’t afford it)&lt;/li&gt;
&lt;li&gt;My program had pseudo-static links&lt;/li&gt;
&lt;li&gt;Used Google Analytics&lt;/li&gt;
&lt;li&gt;Site-wide HTTPS encryption to welcome 2017 quickly&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;What will happen next?&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded><category>post</category></item><item><title>Qingwan Start Page</title><link>https://nexmoe.com/products/qingwan-homepage</link><guid isPermaLink="true">https://nexmoe.com/products/qingwan-homepage</guid><description>In 2016, when I was in eighth grade, I officially started learning programming. Qingwan Start Page was the very first project of my life. From simple HTML templates to PHP, databases, various frameworks, Vue, Swoole, and Golang, it has witnessed my growth.</description><pubDate>Sun, 01 May 2016 11:06:47 GMT</pubDate><content:encoded>&lt;p&gt;&lt;img src=&quot;https://nexmoe.com/_astro/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA-%E6%B0%B8%E5%AD%98%E7%9A%84%E6%AC%A1%E5%85%83.BsRbieOi.png&quot; alt=&quot;Qingwan Start Page&quot; /&gt;&lt;/p&gt;&lt;p&gt;In 2016, when I was in eighth grade, I officially started learning programming. Qingwan Start Page was the very first project of my life. From simple HTML templates to PHP, databases, various frameworks, Vue, Swoole, and Golang, it has witnessed my growth.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/537283684.html&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;https://nexmoe.com/537283684.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://nexmoe.com/products/qingwan-homepage&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;View product details&lt;/a&gt;&lt;/p&gt;</content:encoded><category>product</category><enclosure url="https://nexmoe.com/_astro/%E8%BD%BB%E6%83%8B%E5%AF%BC%E8%88%AA-%E6%B0%B8%E5%AD%98%E7%9A%84%E6%AC%A1%E5%85%83.BsRbieOi.png" length="65476" type="image/png"/></item><item><title>朋友</title><link>https://nexmoe.com/PY</link><guid isPermaLink="true">https://nexmoe.com/PY</guid><pubDate>Fri, 08 Jan 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我们会慢慢长大成人，
随着季节的不停变换路边盛开的鲜花也在不断变化，
那个季节盛开的鲜花到底叫什么名字，
轻轻摇曳着一旦触摸它就会轻轻地被扎到，
用鼻子靠近闻一闻，
会有一股淡淡的青涩太阳的芳香，
随着那股香味慢慢变淡我们也在长大成人，
但是那朵花一定会在某处继续盛开。&lt;/p&gt;
&lt;h2&gt;朋友们&lt;/h2&gt;
&lt;p&gt;每次编译时，随机排序&lt;/p&gt;
&lt;p&gt;import pydata from &quot;./pydata.json&quot;;
import FriendsList from &quot;../../components/FriendsList.astro&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;FriendsList friends={pydata.sort(() =&amp;gt; Math.random() - 0.5)} /&amp;gt;&lt;/p&gt;
&lt;h2&gt;不可访问&lt;/h2&gt;
&lt;p&gt;希望以下站长联系我&lt;/p&gt;
&lt;p&gt;import cantaccess from &quot;./cant_access.json&quot;;&lt;/p&gt;
&lt;p&gt;&amp;lt;table&amp;gt;
&amp;lt;tr&amp;gt;
&amp;lt;th&amp;gt;网站名称&amp;lt;/th&amp;gt;
&amp;lt;th class=&quot;w-32&quot;&amp;gt;状态&amp;lt;/th&amp;gt;
&amp;lt;/tr&amp;gt;
{cantaccess.map((item) =&amp;gt; (
&amp;lt;tr&amp;gt;
&amp;lt;td&amp;gt;{item.title}&amp;lt;/td&amp;gt;
&amp;lt;td class=&quot;w-32&quot;&amp;gt;&amp;lt;img class=&quot;h-4&quot; src={&lt;code&gt;https://img.shields.io/website?url=${item.link}&lt;/code&gt;} alt={item.title} /&amp;gt;&amp;lt;/td&amp;gt;
&amp;lt;/tr&amp;gt;
))}
&amp;lt;/table&amp;gt;&lt;/p&gt;
</content:encoded><category>post</category></item></channel></rss>