<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>zevth</title><description>数字世界的造梦者</description><link>https://zevth.work/</link><language>zh_CN</language><item><title>用 WebGL 着色器创造数字艺术：从零开始的 Shader 编程之旅</title><link>https://zevth.work/posts/shader-art-with-webgl/</link><guid isPermaLink="true">https://zevth.work/posts/shader-art-with-webgl/</guid><description>着色器（Shader）是 GPU 上运行的小程序，能在毫秒内为数百万像素计算颜色。本文带你从最简单的 fragment shader 开始，逐步创造出流动的渐变、有机的噪声纹理和赛博朋克风格的视觉特效。</description><pubDate>Mon, 15 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;为什么学 Shader？&lt;/h2&gt;
&lt;p&gt;在这个 AI 生成一切的时代，手写 Shader 似乎是最后的「手工活」。但正是这种精确到像素的控制力，让你能创造出任何 AI 都无法预测的视觉效果。&lt;/p&gt;
&lt;h2&gt;你的第一个 Shader&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;void mainImage(out vec4 fragCoord, in vec2 uv) {
    vec3 col = 0.5 + 0.5 * cos(iTime + uv.xyx + vec3(0, 2, 4));
    fragCoord = vec4(col, 1.0);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;仅仅五行代码，就能在屏幕上渲染出流动的彩虹渐变。这就是 Shader 的魔力——用数学表达美。&lt;/p&gt;
&lt;h2&gt;噪声：有机感的秘密&lt;/h2&gt;
&lt;p&gt;Perlin 噪声和 Simplex 噪声是创造自然纹理的基石。云朵、大理石、火焰——这些都可以用噪声函数组合出来。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;float noise(vec2 p) {
    vec2 i = floor(p);
    vec2 f = fract(p);
    f = f * f * (3.0 - 2.0 * f);
    float a = hash(i);
    float b = hash(i + vec2(1.0, 0.0));
    float c = hash(i + vec2(0.0, 1.0));
    float d = hash(i + vec2(1.0, 1.0));
    return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;实战：赛博朋克城市天际线&lt;/h2&gt;
&lt;p&gt;结合噪声、SDF（有符号距离场）和后期处理，我们可以创造出一个迷幻的赛博朋克城市轮廓...&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「在像素的海洋里，每个数学公式都是一首诗。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;Shader 编程的学习曲线陡峭，但回报巨大。建议从 Shadertoy 开始练习，每天写一个小 shader，三个月后你会发现自己看待视觉世界的方式完全不同了。&lt;/p&gt;
</content:encoded></item><item><title>设计系统不是组件库：我理解的 Design System 哲学</title><link>https://zevth.work/posts/design-system-philosophy/</link><guid isPermaLink="true">https://zevth.work/posts/design-system-philosophy/</guid><description>很多团队把 Design System 等同于一套 UI 组件库。但真正的设计系统是一套关于「如何做决策」的语言——从颜色间距到动效节奏，从组件 API 到文档规范，它是团队共识的代码化表达。</description><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;误解：Design System = 组件库&lt;/h2&gt;
&lt;p&gt;打开很多团队的「设计系统」仓库，你会看到一堆 Button、Input、Modal 组件。这些当然重要，但它们只是设计系统的冰山一角。&lt;/p&gt;
&lt;h2&gt;设计系统的三层结构&lt;/h2&gt;
&lt;h3&gt;1. 设计令牌（Design Tokens）&lt;/h3&gt;
&lt;p&gt;最底层是设计决策的原子化表达：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:root {
  --color-primary: oklch(65% 0.25 250);
  --space-md: clamp(1rem, 0.92rem + 0.4vw, 1.25rem);
  --duration-fast: 150ms;
  --ease-out-expo: cubic-bezier(0.16, 1, 0.3, 1);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这些 token 不属于任何组件，但所有组件都依赖它们。&lt;/p&gt;
&lt;h3&gt;2. 模式语言（Pattern Language）&lt;/h3&gt;
&lt;p&gt;如何处理表单验证的错误状态？什么时候用 Toast 而不是 Modal？分页和无限滚动怎么选？这些模式是团队的「默契」。&lt;/p&gt;
&lt;h3&gt;3. 组件实现（Components）&lt;/h3&gt;
&lt;p&gt;最后才是具体的组件代码。它应该是前两层的自然产物。&lt;/p&gt;
&lt;h2&gt;好的设计系统像方言&lt;/h2&gt;
&lt;p&gt;一个好的设计系统让团队成员能用简短的术语精确表达复杂的设计意图：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「这个表单的错误反馈用 inline-validate 模式，token 用 --color-danger-500，动效用 --ease-spring。」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;三句话，零歧义。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;不要急于写组件。先把设计决策梳理清楚，用 token 固化下来，用模式语言建立共识。组件只是这些决策的最终表达。&lt;/p&gt;
</content:encoded></item><item><title>在巴厘岛写代码的第 100 天：数字游民的真实与幻象</title><link>https://zevth.work/posts/digital-nomad-reflections/</link><guid isPermaLink="true">https://zevth.work/posts/digital-nomad-reflections/</guid><description>社交媒体上的数字游民生活：海景咖啡厅、椰子树下的 MacBook、日落时分的冲浪。真实的数字游民生活：WiFi 不稳定、时区会议、孤独感、以及在异国他乡寻找归属感的漫长旅程。</description><pubDate>Sun, 05 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;Day 1: 天堂&lt;/h2&gt;
&lt;p&gt;抵达 Canggu 的第一天，一切都是滤镜里的样子。稻田边的 co-working space，手冲咖啡，来自世界各地的开发者。我在 Instagram 发了一张照片，配文「办公室」。&lt;/p&gt;
&lt;h2&gt;Day 30: 裂缝&lt;/h2&gt;
&lt;p&gt;新鲜感褪去后，现实开始露出真面目。WiFi 在暴雨天频繁断线，和国内团队的会议要在凌晨两点开。最要命的是——你开始想念楼下那家沙县小吃。&lt;/p&gt;
&lt;h2&gt;Day 60: 适应&lt;/h2&gt;
&lt;p&gt;我开始建立自己的节奏。早上六点起床，在最安静的时段写最需要专注的代码。下午去健身房，晚上参加 co-working space 的社区活动。学会了用 Grab 点外卖，学会了用印尼语砍价。&lt;/p&gt;
&lt;h2&gt;Day 100: 清醒&lt;/h2&gt;
&lt;p&gt;数字游民不是一种「更好的生活方式」，它只是一种「不同的生活方式」。它有自己的 trade-off：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;你获得了：&lt;/strong&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;strong&gt;你失去了：&lt;/strong&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;h2&gt;给想尝试的人&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;先试一个月，不要一上来就买半年的公寓&lt;/li&gt;
&lt;li&gt;选有成熟 co-working space 的城市&lt;/li&gt;
&lt;li&gt;保持和国内团队的沟通频率&lt;/li&gt;
&lt;li&gt;学会独处，但不要孤立自己&lt;/li&gt;
&lt;li&gt;记住：你随时可以回去，这不是一条不归路&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;「自由的代价是不确定性。接受这一点，你就自由了。」&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item></channel></rss>