<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>我的博客</title>
    <link>/</link>
    <description>Recent content on 我的博客</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 09 Nov 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Hello World</title>
      <link>/posts/hello-world/</link>
      <pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate>
      <guid>/posts/hello-world/</guid>
      <description>&lt;p&gt;第一个 post！博客跑喺 Cloudflare Pages 上面，全球 CDN 直出。&lt;/p&gt;
&lt;h2 id=&#34;测试标题&#34;&gt;测试标题&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;支持 Markdown&lt;/li&gt;
&lt;li&gt;代码块：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;呢篇系示范文章，之后直接喺 &lt;code&gt;content/posts/&lt;/code&gt; 加 &lt;code&gt;.md&lt;/code&gt; 文件再跑 &lt;code&gt;deploy.sh&lt;/code&gt; 就得更新。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;
&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;
&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;console.log(&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;hello again&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
    </item>
    <item>
      <title>整咗個 Cloudflare 多人電子白板</title>
      <link>/posts/2026-11-09-cf-whiteboard/</link>
      <pubDate>Mon, 09 Nov 2026 00:00:00 +0000</pubDate>
      <guid>/posts/2026-11-09-cf-whiteboard/</guid>
      <description>&lt;p&gt;用 Cloudflare Workers + Durable Objects 寫咗個&lt;strong&gt;多人實時電子白板&lt;/strong&gt;，開個房間、把連結發出去，大家就可以一齊畫。&lt;/p&gt;
&lt;p&gt;源碼開放喺 GitHub：&lt;a href=&#34;https://github.com/crazysarah/cf-whiteboard&#34;&gt;crazysarah/cf-whiteboard&lt;/a&gt;，&lt;code&gt;wrangler deploy&lt;/code&gt; 一分鐘就開到自己嗰塊板。用法：房間名放喺 hash（&lt;code&gt;https://&amp;lt;你的域&amp;gt;/#房間名&lt;/code&gt;），同一個 hash 就係同一塊板。&lt;/p&gt;
&lt;h2 id=&#34;點解要自己寫一個&#34;&gt;點解要自己寫一個&lt;/h2&gt;
&lt;p&gt;市面嘅白板工具（Miro、Excalidrawlive 嗰啲）要麼要註冊、要麼有牆。自己寫一個：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;零註冊&lt;/strong&gt;：開連結就畫，房間名即開即用&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一個房間 = 一個 Durable Object&lt;/strong&gt;：DO 係全球單實例強一致，天生就啱做房間狀態&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WebSocket 用 Hibernation API&lt;/strong&gt;：空房間唔佔 CPU 時間，hibernated 狀態免費——唔使驚養個白板燒錢&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;筆畫歷史存 DO 內置 SQLite&lt;/strong&gt;：每 3 筆落盤，重新打開仲喺度（上限 5000 筆，舊嘅自動清）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;截圖直接貼上牆&lt;/strong&gt;：方便貼參考圖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一邊傾一邊畫&lt;/strong&gt;：WebRTC 語音 P2P，DO 只轉發 SDP/ICE 信令，媒體流唔過 CF——&lt;strong&gt;零成本&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;架構一句話&#34;&gt;架構一句話&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/room/&amp;lt;name&amp;gt;&lt;/code&gt; 路由到同名 Durable Object；WebSocket 常駐但 hibernated（唔使 CPU 時間）；歷史入 SQLite；語音走 P2P 信令通道。&lt;/p&gt;
&lt;h2 id=&#34;已知取捨&#34;&gt;已知取捨&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;清空係廣播式：任何人按清空，全房清掉（undo 栈留返做後續）&lt;/li&gt;
&lt;li&gt;坐標係視口坐標，唔同屏幕比例睇到嘅畫面比例可能唔同（縮放適配後續加）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有興趣可以直接開個房試下，或者攞源碼去 &lt;code&gt;wrangler deploy&lt;/code&gt; 一分鐘開埋自己嗰塊板。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
