<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
    >
<channel>
    <title>V2EX</title>
    <atom:link href="https://blog.v2ex.com/rss.xml" rel="self" type="application/rss+xml" />
    <link>https://blog.v2ex.com/</link>
    <description><![CDATA[
    <p>All about <a href="https://www.v2ex.com">V2EX</a>. Built with <a href="https://planetable.xyz/">Planet</a>.</p>

    ]]></description>
    
    
    <item>
        <title>V2EX &#x65B0;&#x7684;&#x6D4B;&#x8BD5;&#x670D;&#x53CA; Passkey &#x652F;&#x6301;</title>
        <link>https://blog.v2ex.com/3A3EE61B-852B-43D8-B2A5-16390A7D49E8/</link>
        <guid>https://blog.v2ex.com/3A3EE61B-852B-43D8-B2A5-16390A7D49E8/</guid>
        <pubDate>Mon, 18 May 2026 01:37:23 -0700</pubDate>
        
        
        <description><![CDATA[
            <ul> 
 <li>V2EX 部署了一个新的测试服 <a href="https://edge.v2ex.com">https://edge.v2ex.com</a></li> 
 <li>登录后可以在 <a href="https://edge.v2ex.com/settings/passkey">https://edge.v2ex.com/settings/passkey</a> 添加和管理 Passkey。</li> 
 <li>如果是通过 Solana 登录的用户，添加或删除 Passkey 时需要钱包签名。</li> 
 <li>如果是密码或 Google 登录的用户，添加或删除 Passkey 时需要输入当前 V2EX 密码。如果 Google 登录账号从未设置过 V2EX 密码，可以通过 <a href="https://www.v2ex.com/forgot">https://www.v2ex.com/forgot</a> 设置。</li> 
 <li><a href="https://edge.v2ex.com/signin">https://edge.v2ex.com/signin</a> 登录页面会在当前浏览器支持 Passkey 时显示 Passkey 登录按钮。</li> 
</ul>
        ]]></description>
    </item>
    
    <item>
        <title>Shared Purpose</title>
        <link>https://blog.v2ex.com/4FDD0D84-C878-4991-9F1E-F2090C66F577/</link>
        <guid>https://blog.v2ex.com/4FDD0D84-C878-4991-9F1E-F2090C66F577/</guid>
        <pubDate>Wed, 16 Jul 2025 15:11:42 -0700</pubDate>
        
        <itunes:image href="https://blog.v2ex.com/shared-purpose/balajis.png" />    
        
        
        <description><![CDATA[
            <p>Last year, the handful of moderators at V2EX, including me, were dealing with massive spam every day. It was emotionally taxing, as every time I had to do something, I felt that my time should have a better use than this.</p> 
<p>So I made a decision to turn the website into invite-only. New accounts can only be activated with an invite code. Invite codes can only be created with gold coins, an offchain virtual currency system that has been running on the website since 2010.</p> 
<p>It reduced spam to almost zero, as now it takes much more effort for spammers to create new accounts. However, some new users were unable to participate because they knew no one who could create an invite for them.</p> 
<p>Also in September last year, I played with a new product called Pump and created a <a href="https://dexscreener.com/solana/ctxhhwbovttrf1kc4zwfz8zf8bnw78n2uur3ozx5vfkb" target="_blank">coin</a> with it. Everything on Pump looked so crazy, so after I created the coin, I did not give too much thought to it at that time.</p> 
<p>Several months passed. A lot of crazier things happened in real life.</p> 
<p>This year I read this post on Farcaster by balajis.eth:</p> 
<p><a href="https://farcaster.xyz/balajis.eth/0x8a740c74">https://farcaster.xyz/balajis.eth/0x8a740c74</a></p> 
<img width="617" alt="balajis" src="https://blog.v2ex.com/4FDD0D84-C878-4991-9F1E-F2090C66F577/balajis.png" /> 
<p>His theory is: a token can give a community shared purpose.</p> 
<p>So I decided to do something to see the theory working.</p> 
<p>I started to buy my own Pump while working on adding Phantom/Glow support to the website. I was testing how different coin/Solana levels would work best with several use cases. Then at one point, people watching onchain activities noticed my activities, and they pushed the coin to what it is right now.</p> 
<p>Now we have over 1000 onchain holders, and more than 400 of them linked their addresses to V2EX after we launched the <a href="https://www.v2ex.com/signup" target="_blank">Sign in with Solana</a> feature.</p> 
<p>I can feel that shared purposes are forming. Thank you <a href="https://x.com/balajis" target="_blank">@balajis</a> and everyone holding the coin.</p>
        ]]></description>
    </item>
    
    <item>
        <title>VXNA</title>
        <link>https://blog.v2ex.com/42387C5D-2714-4017-9E2B-17FBB5178103/</link>
        <guid>https://blog.v2ex.com/42387C5D-2714-4017-9E2B-17FBB5178103/</guid>
        <pubDate>Fri, 07 Jun 2024 02:05:48 -0700</pubDate>
        
        <itunes:image href="https://blog.v2ex.com/vxna/vxna.png" />    
        
        
        <description><![CDATA[
            <p><a href="https://www.v2ex.com/xna" target="_blank">VXNA</a> 是 V2EX 的一个新功能——博客聚合器。如果你有自己的博客网站，那么可以在 <a href="https://www.v2ex.com/" target="_blank">VXNA</a> 节点申请被收录。如果被收录，那么就会被定期聚合到 V2EX 首页。</p> 
<img src="https://blog.v2ex.com/42387C5D-2714-4017-9E2B-17FBB5178103/vxna.png" alt="VXNA" /> 
<p>V2EX 的用户群，可能是整个互联网上拥有自建博客网站比例最高的。因此，能够提供这样的一种促进信息流动的方式，让 V2EX 首页的流量，能够分流到用户自己的博客网站，在 2024 年及往后的日子里，这是一件值得做的事情。</p> 
<h2>关于 VXNA 这个名字</h2> 
<p>这个名字致敬的是 2000 年初的两个网站：</p> 
<ul> 
 <li>MXNA - Macromedia XML News Aggregator</li> 
 <li>BXNA - Blueidea XML News Aggregator</li> 
</ul> 
<p>MXNA 是 Macromedia 推出的一个博客聚合器（曾经的网址是 weblogs.macromedia.com/mxna），用来聚合和 Macromedia 开发者和设计师社区有关的博客内容。在被 Adobe 收购之前，Macromedia 推出过一系列非常棒的开发工具，比如 ColdFusion，Flash，Dreamweaver，JRun，HomeSite，你很可能曾经用过。</p> 
<img src="https://blog.v2ex.com/42387C5D-2714-4017-9E2B-17FBB5178103/mxna2.png" alt="MXNA 2.0" /> 
<p>而 BXNA 是当时（2000 年初）中国有影响力的开发者和设计师社区蓝色理想推出的类似的博客聚合器，曾经的网址是 blog.blueidea.com。</p> 
<img src="https://blog.v2ex.com/42387C5D-2714-4017-9E2B-17FBB5178103/bxna.png" alt="BXNA" /> 
<p>上面提到的两个曾经的网址，可以通过 <a href="https://archive.org/" target="_blank">Internet Archive</a> 的网页时光机看到曾经的样子。</p> 
<p>在 MXNA/BXNA 最活跃的 2000 年初，Twitter 和 Instagram 这样的内容平台尚未诞生。很多想在 Internet 上分享内容的作者，维护着自己的博客，然后通过各种聚合器来找到社区和自己感兴趣的内容。</p> 
<h2>如何拥有一个自己的博客网站</h2> 
<p>如何拥有并且持续维护一个自己的博客网站，可能并不是一件容易的事情。因为首先你可能会需要一个自己的域名，或者是到某个平台上申请一个账号。如果是自己的域名，那么你甚至还需要购买服务器及搭建运行博客的程序。或者是把自己的域名指向到支持的平台。而如果要持续维护，那么每年会需要给域名及其他服务付费。</p> 
<p>V2EX 的博客 <a href="https://blog.v2ex.com/" target="_blank">blog.v2ex.com</a> 使用的是另外一种做法——一个运行在 macOS 上的原生应用 <a href="https://github.com/Planetable/Planet" target="_blank">Planet</a>。Planet 里包括了静态网站生成器、两栏的 Markdown 编辑器、模版管理、及 IPFS 节点。使用 Planet 构建的网站，可以直接发布成一个 IPFS 网络上可以被访问的名称 IPNS，比如 blog.v2ex.com 的 IPNS 地址是：</p> 
<p>k51qzi5uqu5dkczezx3wje1dizdk7rta8uc50a5o9ix4wmzqniacrdbfapt8cf</p> 
<p>然后这个地址可以通过这些网关地址打开：</p> 
<ul> 
 <li><a href="https://k51qzi5uqu5dkczezx3wje1dizdk7rta8uc50a5o9ix4wmzqniacrdbfapt8cf.eth.sucks/">https://k51qzi5uqu5dkczezx3wje1dizdk7rta8uc50a5o9ix4wmzqniacrdbfapt8cf.eth.sucks/</a></li> 
 <li><a href="https://k51qzi5uqu5dkczezx3wje1dizdk7rta8uc50a5o9ix4wmzqniacrdbfapt8cf.ipfs2.eth.limo/">https://k51qzi5uqu5dkczezx3wje1dizdk7rta8uc50a5o9ix4wmzqniacrdbfapt8cf.ipfs2.eth.limo/</a></li> 
</ul> 
<p>如果你在本地电脑上安装了 IPFS Desktop 或者 Planet（内置了 IPFS 节点），那么你甚至可以通过 localhost 来打开这个地址（假设你本地的 IPFS gateway 端口是 18181）：</p> 
<p><a href="http://127.0.0.1:18181/ipns/k51qzi5uqu5dkczezx3wje1dizdk7rta8uc50a5o9ix4wmzqniacrdbfapt8cf/">http://127.0.0.1:18181/ipns/k51qzi5uqu5dkczezx3wje1dizdk7rta8uc50a5o9ix4wmzqniacrdbfapt8cf/</a></p> 
<img src="https://blog.v2ex.com/42387C5D-2714-4017-9E2B-17FBB5178103/localhost.png" alt="localhost" /> 
<p>当使用这种方式构建博客网站时，不需要申请域名或者购买服务器，也不需要在任何平台上注册用户名，只需要启动 Planet，然后保持 Planet 运行，就可以在 IPFS 的 P2P 网络上发布网站。</p> 
<h2>后续开发计划</h2> 
<p>VXNA 会是一个被持续更新的项目，这是后续的一些开发计划：</p> 
<ul> 
 <li><input type="checkbox" disabled /> 每 24 小时，从所有内容源中随机选取一个，然后在 V2EX 首页右侧展示。</li> 
 <li><input type="checkbox" disabled /> 每个被收录的内容源，在 V2EX 上应该有一个自己的 page。原作者可以通过这个 page 做一些操作，比如取消收录或者触发一个会被立刻开始的抓取。在作者刚完成了一些内容更新时可能会需要的功能。</li> 
 <li><input type="checkbox" disabled /> 抓取过程中，如果某个内容源上出现了持续的问题，应该有一种提醒机制。</li> 
</ul>
        ]]></description>
    </item>
    
    <item>
        <title>V2EX &#x7684; RSS &#x8F93;&#x51FA;</title>
        <link>https://blog.v2ex.com/83F9D05A-BD28-49F1-8106-FFF63920C532/</link>
        <guid>https://blog.v2ex.com/83F9D05A-BD28-49F1-8106-FFF63920C532/</guid>
        <pubDate>Tue, 24 Oct 2023 01:03:18 -0700</pubDate>
        
        <itunes:image href="https://blog.v2ex.com/rss/feeder-extension.png" />    
        
        
        <description><![CDATA[
            <p>V2EX 的几乎所有内容，都可以通过 RSS 订阅。这个文档描述的是几种不同类型内容的 URL 规则。及我们推荐的一些 RSS 相关的软件。</p> 
<h2>节点</h2> 
<p>V2EX 通过节点的概念来组织内容，每个主题只会属于唯一的一个节点。节点的最新内容可以通过 RSS 订阅。URL 规则是这样的：</p> 
<p>比如当你访问「<a href="https://www.v2ex.com/go/programmer">程序员</a>」节点时，这个节点的首页地址是：</p> 
<p><a href="https://www.v2ex.com/go/programmer">https://www.v2ex.com/go/programmer</a></p> 
<p>对应的 RSS 地址是：</p> 
<p><a href="https://www.v2ex.com/feed/programmer.xml">https://www.v2ex.com/feed/programmer.xml</a></p> 
<p>同时也支持 <a href="https://jsonfeed.org">JSON Feed</a> 格式：</p> 
<p><a href="https://www.v2ex.com/feed/programmer.json">https://www.v2ex.com/feed/programmer.json</a></p> 
<h2>用户</h2> 
<p>也可以用 RSS 来订阅用户的最新内容。比如如果你想订阅用户 <a href="https://www.v2ex.com/member/Livid">Livid</a> 的最新主题，那么可以使用下面这样的地址：</p> 
<p><a href="https://www.v2ex.com/feed/member/Livid.xml">https://www.v2ex.com/feed/member/Livid.xml</a></p> 
<h2>首页话题聚合</h2> 
<p>V2EX 的全站首页上有几个不同的 tab，用来将一类接近的话题汇聚成一个时间轴。比如这是所有关于技术内容的首页 tab 的地址：</p> 
<p><a href="https://www.v2ex.com/?tab=tech">https://www.v2ex.com/?tab=tech</a></p> 
<p>对应的 RSS 地址是：</p> 
<p><a href="https://www.v2ex.com/feed/tab/tech.xml">https://www.v2ex.com/feed/tab/tech.xml</a></p> 
<h2>全站首页最新内容</h2> 
<p>这个 RSS 地址是每天 V2EX 所有的新主题：</p> 
<p><a href="https://www.v2ex.com/index.xml">https://www.v2ex.com/index.xml</a></p> 
<h2>RSS 客户端</h2> 
<p>如果你使用的是 Apple 系统，那么我们推荐 NetNewsWire。这是一款设计优雅，同时所有 Swift 代码开源的 RSS 客户端：</p> 
<p><a href="https://www.netnewswire.com/">https://www.netnewswire.com/</a></p> 
<p><img src="https://blog.v2ex.com/83F9D05A-BD28-49F1-8106-FFF63920C532/netnewswire.png" alt="" /></p> 
<p>如果你正在使用或者打算学习 Swift 编程，NetNewsWire 的代码库是一个很好的学习对象。</p> 
<p>NetNewsWire 的高性能让人印象深刻。即使有上万的未读条目，用起来也完全不卡。背后的支撑是 <a href="https://github.com/Ranchero-Software/RSDatabase">RSDatabase</a> 项目。</p> 
<p>同时 NetNewsWire 的开发者们还是新标准 <a href="https://jsonfeed.org">JSON Feed</a> 的发起者。</p> 
<h2>Chrome 插件</h2> 
<p>Feeder 的 Chrome 插件可以把 RSS 渲染成一个好看的预览格式：</p> 
<p><a href="https://chromewebstore.google.com/detail/rss-feed-reader/pnjaodmkngahhkoihejjehlcdlnohgmp?pli=1">https://chromewebstore.google.com/detail/rss-feed-reader/pnjaodmkngahhkoihejjehlcdlnohgmp?pli=1</a></p> 
<p>同时也可以在 Chrome 的工具栏里提供一个快速的查看自己订阅源最新内容的按钮。</p> 
<p><img src="https://blog.v2ex.com/83F9D05A-BD28-49F1-8106-FFF63920C532/feeder-extension.png" alt="" /></p> 
<hr /> 
<p>当 RSS 这样的收发信息的方式能够被更充分地用起来的时候，V2EX 或许就只是一个信息的暂存地，意义在于帮助了信息的流动过程，仅此而已。如果有很多个这样的暂存地存在，<strong>信息的主要阅读和交互过程并不强依赖某个特定暂存地的功能</strong>，那或许可以开启一些非常有趣的新的未来的可能性。</p>
        ]]></description>
    </item>
    
    <item>
        <title>CodeLauncher</title>
        <link>https://blog.v2ex.com/92850E1D-1BBF-4B20-B8AB-2CF3D8F87066/</link>
        <guid>https://blog.v2ex.com/92850E1D-1BBF-4B20-B8AB-2CF3D8F87066/</guid>
        <pubDate>Fri, 19 May 2023 04:01:37 -0700</pubDate>
        
        
        <description><![CDATA[
            <p><a href="https://cl.v2ex.pro/">https://cl.v2ex.pro/</a></p>
        ]]></description>
    </item>
    
    <item>
        <title>GameDB</title>
        <link>https://blog.v2ex.com/62D60149-5D0E-4A5E-B140-1782648F3A57/</link>
        <guid>https://blog.v2ex.com/62D60149-5D0E-4A5E-B140-1782648F3A57/</guid>
        <pubDate>Fri, 19 May 2023 03:59:37 -0700</pubDate>
        
        
        <description><![CDATA[
            <p><a href="https://www.v2ex.com/gamedb">https://www.v2ex.com/gamedb</a></p>
        ]]></description>
    </item>
    
    <item>
        <title>V2EX x nftychat NFT Airdrop Phase II</title>
        <link>https://blog.v2ex.com/B3982DEA-F9AC-4F1F-B552-550C9FE57A15/</link>
        <guid>https://blog.v2ex.com/B3982DEA-F9AC-4F1F-B552-550C9FE57A15/</guid>
        <pubDate>Sat, 25 Mar 2023 18:41:29 -0700</pubDate>
        
        <itunes:image href="https://blog.v2ex.com/B3982DEA-F9AC-4F1F-B552-550C9FE57A15/78bf2108f2cb09e5107c70815ec337fb.png" />    
        
        
        <description><![CDATA[
            <img width="100%" alt="V2EX x nftychat" src="https://blog.v2ex.com/B3982DEA-F9AC-4F1F-B552-550C9FE57A15/78bf2108f2cb09e5107c70815ec337fb.png" /> 
<p>感谢 V 友们的热情支持，感谢 nftychat 团队，这次合作向大家空投的由 wixi.eth 设计的 NFT 头像已经发放完成。具体的发放名单可以看下面的这个 txt 文件里的地址。</p> 
<ul> 
 <li><a href="v2ex nft polygon drop.txt">空投地址列表</a></li> 
</ul> 
<hr /> 
<p><strong>Q: 我已经收到了空投，但是在我的 OpenSea 主页上看不到？</strong></p> 
<p>A: Polygon 上收到的空投，可能会被 OpenSea 自动隐藏。你可以点击自己的主页，然后 More -&gt; Hidden 里找到，然后选中之后 Unhide 。</p> 
<p><strong>Q: 在 nftychat 上设置头像时无法搜到这款 NFT ？</strong></p> 
<p>A: nftychat 上的个人的 collection 信息是每 6 个小时或者登录时刷新。所以可以 Log Out 然后再重新登录就可以看到。</p> 
<hr /> 
<p>V2EX 在 nftychat 上的社区，是 V2EX 的一个全新的拓展——为 V 友们提供一种新的即时聊天的体验。同时 nftychat 是一个只支持 Sign in with Ethereum 登录的社区，你将可以在这里获得各种最新的 web3 体验。如果你打算学习和 web3 有关的一系列新 API，这里也将会是一个很好的入口。</p> 
<p><strong>Q: 如何加入？</strong></p> 
<p>A: <a href="https://nftychat.xyz/community/e767e0b">https://nftychat.xyz/community/e767e0b</a></p>
        ]]></description>
    </item>
    
    <item>
        <title>V2EX x nftychat NFT Airdrop Phase I</title>
        <link>https://blog.v2ex.com/8E2B682D-85E4-4B03-9293-744743A020EB/</link>
        <guid>https://blog.v2ex.com/8E2B682D-85E4-4B03-9293-744743A020EB/</guid>
        <pubDate>Thu, 16 Mar 2023 21:52:23 -0700</pubDate>
        
        <itunes:image href="https://blog.v2ex.com/8E2B682D-85E4-4B03-9293-744743A020EB/78bf2108f2cb09e5107c70815ec337fb.png" />    
        
        
        <description><![CDATA[
            <img width="100%" alt="V2EX x nftychat" src="https://blog.v2ex.com/8E2B682D-85E4-4B03-9293-744743A020EB/78bf2108f2cb09e5107c70815ec337fb.png" /> 
<p>上周，V2EX 在 nftychat 上开通了一个新的聊天社区。nftychat 提供的是一种类似 Discord 的体验，不同的是 nftychat 只支持使用 Ethereum 账号登录，所以也可以说 nftychat 是一款更 crypto-native/web3 体验的 Discord 。这是我们当时的 announcement 主题：</p> 
<p><a href="https://www.v2ex.com/t/920829">https://www.v2ex.com/t/920829</a></p> 
<p>因为 nftychat 只支持用 NFT 作为头像，而部分进来的 V 友之前从来没有接触过这块。所以 nftychat 社区和 V2EX 现在会一起做一个 NFT 的空投活动，让大家可以获得一款由 nftychat 团队设计的 Polygon 网络上的 NFT 。</p> 
<p>目前我们已经向第一批进来的最活跃的部分 V 友，尤其是在 nftychat 社区的<a href="https://nftychat.xyz/355/13505">「分享创造」</a>聊天室里发布过作品的 V 友空投。</p> 
<ul> 
 <li>airyland.eth</li> 
 <li>timqian.eth</li> 
 <li>touxi.eth</li> 
 <li>zoops.eth</li> 
 <li>busyforking.eth</li> 
 <li>ethotc.eth</li> 
 <li>0xf1b98B6af2F422e91ab42F05024A288adDA55289</li> 
 <li>0xf35FCFD6eaC6644d81025e116167F7d04AE5F8C8</li> 
 <li>fluxgate.eth</li> 
 <li>liubenben.eth</li> 
 <li>bobjiang.eth</li> 
 <li>0xc899c41da47A42d9eF29E0B71fe47F5bAEfDb674</li> 
</ul> 
<p>之后，我们还会在接下来 3 月 25 日这周进行第二次更大规模的空投。数据依据会是满足下面任一：</p> 
<ul> 
 <li>在 nftychat 的<a href="https://nftychat.xyz/355/13505">「分享创造」</a>聊天室里发布作品</li> 
 <li>有设置过 ENS 用户名</li> 
 <li>在 nftychat 上的<a href="https://nftychat.xyz/355/13507">「 Planet 」</a>聊天室里分享的 ENS 或者 IPNS 地址上有 Planet 搭建的网站</li> 
 <li>在其他聊天室里的有意义的内容分享 :)</li> 
</ul> 
<p>谢谢大家的参与。如果你对这块有兴趣，那希望这件事情或许能够成为你接下来去了解一系列新 API 、新社区的起点。如果没有兴趣，也没关系，世界很大，人最终还是只能在自己真正感兴趣、有热情的事物上才能持久，你不会错过什么的。</p> 
<hr /> 
<h3>关于一些技术细节的 FAQ</h3> 
<p><strong>Q: 我已经收到了空投，但是在我的 OpenSea 主页上看不到？</strong></p> 
<p>A: Polygon 上收到的空投，可能会被 OpenSea 自动隐藏。你可以点击自己的主页，然后 More -&gt; Hidden 里找到，然后选中之后 Unhide 。</p> 
<p><strong>Q: 在 nftychat 上设置头像时无法搜到这款 NFT ？</strong></p> 
<p>A: nftychat 上的个人的 collection 信息是每 6 个小时或者登录时刷新。所以可以 Log Out 然后再重新登录就可以看到。</p> 
<hr /> 
<p><strong>Q: 如何加入？</strong></p> 
<p>A: <a href="https://nftychat.xyz/community/e767e0b">https://nftychat.xyz/community/e767e0b</a></p> 
<hr /> 
<p><strong>More FAQ:</strong></p> 
<p><a href="https://blog.v2ex.com/58706DEF-4638-4B14-8560-CCD22AD9857F/">https://blog.v2ex.com/58706DEF-4638-4B14-8560-CCD22AD9857F/</a></p>
        ]]></description>
    </item>
    
    <item>
        <title>CodeLauncher</title>
        <link>https://blog.v2ex.com/D815393A-D9F3-4C65-AB1D-B76D6C664D61/</link>
        <guid>https://blog.v2ex.com/D815393A-D9F3-4C65-AB1D-B76D6C664D61/</guid>
        <pubDate>Fri, 10 Mar 2023 03:52:26 -0800</pubDate>
        
        <itunes:image href="https://blog.v2ex.com/D815393A-D9F3-4C65-AB1D-B76D6C664D61/CodeLauncher-screenshot-2.png" />    
        
        
        <description><![CDATA[
            <p><a href="https://cl.v2ex.pro">CodeLauncher</a> 是 V2EX 在 2022 年初推出的一款 macOS 上的开发者工具。不过那个时候这个博客 <a href="https://blog.v2ex.com">blog.v2ex.com</a> 还不存在（因为那个时候 <a href="https://planetable.xyz">Planet</a> 还没有上线），所以 CodeLauncher 还没有在这个博客上介绍过。</p> 
<p>无论你是前端还是后端开发者，你可能都会需要和命令行工具打交道。比如 <code>yarn</code> 这样的工具，已经是很多前端项目的标配。于是你可能已经在用某种代码片段管理工具，把这些时不时需要用到的命令行指令存起来，然后需要用到的时候复制粘贴。如果有这样一款工具，不仅可以保存这些常用命令，甚至还可以保存工作目录位置，环境变量，甚至查看实时的输出？这就是 CodeLauncher 做的事情，帮助你管理你经常需要用到的命令行，及查看输出。</p> 
<img width="1012" alt="CodeLauncher screenshot 1" src="https://blog.v2ex.com/D815393A-D9F3-4C65-AB1D-B76D6C664D61/CodeLauncher-screenshot-1.webp" /> 
<p>比如 CodeLauncher 的网站 <a href="https://cl.v2ex.pro">cl.v2ex.pro</a> 是使用静态网站生成器 <a href="https://www.getzola.org/">Zola</a> 驱动，如果要实时预览更改，需要在工作目录下启动 <code>zola serve</code> 这条指令。传统做法是打开 Terminal，然后 <code>cd</code> 到工作目录，然后敲入 <code>zola serve</code>。而通过 CodeLauncher 配置之后，一键就可以启动并查看输出：</p> 
<img width="1012" alt="CodeLauncher-screenshot-2" src="https://blog.v2ex.com/D815393A-D9F3-4C65-AB1D-B76D6C664D61/CodeLauncher-screenshot-2.png" /> 
<p>如果你之前在服务器上用过 <a href="http://supervisord.org">supervisord</a> 这样的进程管理系统（Process Control System），你会发现 CodeLauncher 与之概念接近，但提供的是一个完全图形化界面的使用体验。</p> 
<hr /> 
<ul> 
 <li>网站 <a href="https://cl.v2ex.pro">https://cl.v2ex.pro</a></li> 
 <li>源代码 <a href="https://github.com/v2ex/launcher">https://github.com/v2ex/launcher</a></li> 
</ul>
        ]]></description>
    </item>
    
    <item>
        <title>FAQ</title>
        <link>https://blog.v2ex.com/657CF579-EB7E-4467-B9B7-32F2EF35272F/</link>
        <guid>https://blog.v2ex.com/657CF579-EB7E-4467-B9B7-32F2EF35272F/</guid>
        <pubDate>Mon, 06 Mar 2023 00:15:13 -0800</pubDate>
        
        
        <description><![CDATA[
            <h2>V2EX 是什么意思？</h2> 
<p><a href="https://www.v2ex.com/" target="_blank">V2EX</a> 是 way to explore 和 way too extreme 的缩写。前者是我们每天都产生的探索世界的好奇心，而后者，是我们将一件事情做到极致的态度和决心。</p> 
<h2>V2EX 的主题是什么？</h2> 
<p>V2EX 是一个专业的技术社区。这里存在的主要意义是帮助会员们解决具体技术问题。同时，这里也是一个大家可以获得更多机会和反馈的地方——你可以在这里 <a href="https://www.v2ex.com/go/jobs" target="_blank">发布招聘</a>，或是 <a href="https://www.v2ex.com/go/create" target="_blank">发布作品</a>。当然，这里也可以帮助你把自己不再需要的电子产品，<a href="https://www.v2ex.com/go/all4all" target="_blank">找到新的主人</a>。</p> 
<p>如果这是你第一次来到 V2EX，请花一些时间看一下我们的 <a href="https://www.v2ex.com/go/guide" target="_blank">使用指南</a> 节点的内容。</p> 
<h2>如何联系 V2EX？</h2> 
<p>如果你发现了网站的问题，或是你的账号遇到了难以解决的问题，可以发送邮件到 <a href="mailto:support@v2ex.com">support@v2ex.com</a>。</p> 
<h2>我可以在这里推广自己的网站么？</h2> 
<p>我们非常欢迎创业者在这里发布自己的新作品。但是如果你在这里注册一个账号，就是为了将自己网站上的链接一个一个搬运过来的话，请停止这样做。</p> 
<h2>如何发图？</h2> 
<p>你可以把图片上传到 <a href="https://imgur.com">imgur</a>，然后直接把类似 <a href="http://i.imgur.com/iCH2RvP.jpg">http://i.imgur.com/iCH2RvP.jpg</a> 这样的链接放入主题正文，然后就会显示为图片。目前我们同样也支持显示微博的图片（sinaimg.cn）。</p> 
<p>或者你可以考虑使用 <a href="https://www.v2ex.com/i/about" target="_blank">V2EX Image Hosting</a> 功能提供的永久图片存储。</p> 
<h2>V2EX 的节点是什么？</h2> 
<p>节点（Node）是 V2EX 用来对内容进行归类的概念。我们认为所有发布到 V2EX 的信息，都应该以尽可能精确的方式对其进行归类。我们相信，带有越多准确元信息的信息，也就会越有用。</p> 
<p>除了节点，我们也使用自动标签对信息进行分类。</p> 
<p>欢迎进一步了解更多：<a href="https://www.v2ex.com/help/node" target="_blank">节点指南</a></p> 
<h2>我在这里看到了一些不感兴趣的信息怎么办？</h2> 
<p>V2EX 提供了多种帮助你过滤信息的方式，你可以选择忽略一个主题或者回复，忽略掉的内容就再也不会出现在你的时间轴中。或者你也可以选择屏蔽，被屏蔽的会员所发的内容，也不会出现在你的时间轴中。并且，即使对方 @ 你，你也不会再收到提醒。</p> 
<h2>我是否可以编辑或者移动自己的主题？</h2> 
<p>在主题发布之后的 300 秒内，你可以自由地编辑自己的主题，或者将其移动到其他节点。但是在 300 秒（5 分钟）之后，就不可以再进行这些操作了。对于编辑的限制是为了让大家对发表在 V2EX 的言论更加负责。</p> 
<h2>我是否可以编辑自己的回复？</h2> 
<p>回复在发表之后就不可以再进行任何编辑。因此，建议大家在按下发布按钮之前，仔细阅读一下以确保没有错别字或者不友善的表达方式。</p> 
<h2>我是否可以删除自己的回复？</h2> 
<p>在 V2EX，回复一旦发布，就不再可以删除和编辑。这个规则的设立，是为了创造一个所有人对自己说过的话更加负责的社区氛围。</p> 
<h2>我是否可以删除自己的主题？</h2> 
<p>如果你创建的主题没有收到过任何来自其他人的回复，那就可以。请在 <a href="https://www.v2ex.com/go/chamber" target="_blank">/go/chamber</a> 节点提出你的删除请求。</p> 
<p>已经有回复的主题，在 V2EX 是不会被删除的。</p> 
<p>Spam，人身攻击，隐私泄漏及违法内容，肯定会被删除。</p> 
<h2>为什么我发布的主题被移动了节点？</h2> 
<p>你发布的主题可能会被管理员或者自动规则移动节点。比如，如果一个讨论职场话题的主题被发到 <a href="https://www.v2ex.com/go/jobs">/go/jobs</a> 那么可能会被管理员移动到 <a href="https://www.v2ex.com/go/career">/go/career</a> 以进行更准确的分类。如果一个账号经常将主题发布到错误节点，那么可能会收到降权。</p> 
<h2>我不想再继续使用我的账号？</h2> 
<p>如果你不想再继续使用，请使用注册邮箱发送一封标题为「退出」的邮件到 <a href="mailto:support@v2ex.com">support@v2ex.com</a>，我们收到之后就会处理。退出之后，用户名会被释放并有可能被其他人注册。</p>
        ]]></description>
    </item>
    
    <item>
        <title>V2EX Community on nfty chat</title>
        <link>https://blog.v2ex.com/58706DEF-4638-4B14-8560-CCD22AD9857F/</link>
        <guid>https://blog.v2ex.com/58706DEF-4638-4B14-8560-CCD22AD9857F/</guid>
        <pubDate>Fri, 03 Mar 2023 01:57:07 -0800</pubDate>
        
        <itunes:image href="https://blog.v2ex.com/58706DEF-4638-4B14-8560-CCD22AD9857F/Screenshot%202023-03-03%20at%201.12.36%20AM.png" />    
        
        
        <description><![CDATA[
            <p>一直在思考要不要给 V2EX 建一个 Discord 服务器。但是感觉 Discord 太过于臃肿，而且如果要实现一些和 crypto 社区有关的集成，需要很多插件。另外就是由于 Discord 的体量和登录方式，spammer 泛滥也是一个问题。</p> 
<p>直到发现了 <a href="https://nftychat.xyz">nftychat.xyz</a> 这个轻巧优雅，非常 crypto-native 的产品，在用了一段时间之后，决定，开始吧。</p> 
<p><a href="https://nftychat.xyz/community/e767e0b">https://nftychat.xyz/community/e767e0b</a></p> 
<img width="1215" alt="V2EX on nfty chat" src="https://blog.v2ex.com/58706DEF-4638-4B14-8560-CCD22AD9857F/Screenshot 2023-03-03 at 1.12.36 AM.png" /> 
<hr /> 
<p>这里是一些常见问题解答：</p> 
<h3>为什么要在 nfty chat 上建立这个社区？</h3> 
<p>nfty chat 能够提供一种和 V2EX 主站非常不同的实时聊天体验。同时，因为目前 nfty chat 只支持 Sign In with Ethereum (SIWE) 登录，也就是 Web3 登录，因此进来的用户至少都对 MetaMask 或者 WalletConnect 有了解和使用经验，于是这个社区里就会更容易讨论 crypto 相关话题。而 crypto 相关话题如果是在 V2EX 主站讨论，就很容易沉帖。</p> 
<p>但是，长篇的技术话题讨论，尤其是涉及代码的，并不适合在聊天室，V2EX 主站或者 GitHub 依然会是更有效的方式。</p> 
<h3>用什么账号登录？</h3> 
<p>用 <a href="https://metamask.io/">MetaMask</a> 以太坊钱包，或者手机上的 <a href="https://rainbow.me">Rainbow</a> 以太坊钱包，都可以登录。</p> 
<h3>是否有手机版本？</h3> 
<p>目前有 iOS TestFlight 版本：</p> 
<p><a href="https://testflight.apple.com/join/LrNCUDRG">https://testflight.apple.com/join/LrNCUDRG</a></p> 
<h3>如何让用户名不是钱包地址而是昵称？</h3> 
<p>注册一个 ENS 然后绑定：</p> 
<p><a href="https://app.ens.domains/">https://app.ens.domains/</a></p> 
<h3>如何设置头像？</h3> 
<p>如果你钱包里有 NFT，就可以用 NFT 作为头像。</p> 
<h3>界面上的 gm 是什么？</h3> 
<p>gm = good morning</p> 
<p>也是每日签到按钮。</p> 
<p>也可以理解为币圈变化快，每一天都是全新一天的感觉。</p> 
<h3>这个 blog.v2ex.com 是用什么搭建的？</h3> 
<p>这是一个用 <a href="https://planetable.xyz">Planet</a> 搭建的博客。<a href="https://github.com/Planetable/Planet">Planet 是一个开源的 macOS 原生应用</a>，可以生成静态网站并通过自带的 IPFS 节点发布到 P2P 网络。</p>
        ]]></description>
    </item>
    
    <item>
        <title>Giscus</title>
        <link>https://blog.v2ex.com/DDD36C78-E6BF-4171-816B-883E2B4E14C1/</link>
        <guid>https://blog.v2ex.com/DDD36C78-E6BF-4171-816B-883E2B4E14C1/</guid>
        <pubDate>Fri, 20 Jan 2023 23:14:06 -0800</pubDate>
        
        
        <description><![CDATA[
            <p><a href="https://giscus.app/">Giscus</a> 是一个基于 GitHub API 的评论系统。</p> 
<p>在 <a href="https://planetable.xyz">Planet</a> 项目开始之后，对于如何在其中实现评论，设想过几个不同的方案。比如通过 PubSub，或者通过检测 mutual follow 关系。但是，这件事情的难点在于，如何能够在一种去中心化的环境里，实现一种用户已经熟悉了的评论体验。因为评论这件事情的本质——是在公网上有这样的一个接口，所有人都可以按照一定规则把数据发进去，然后可以实时看到处理之后的聚合结果。这样的体验依赖于一个稳定在线的 single source of truth。但是如果是在一个所有节点都不一定在线的环境里，如果 single source of truth 不是 24x7 在线的，那么实现起来就会很不同。</p> 
<p>但至少对于这个博客来说，挂上一个由 GitHub API 驱动的评论系统，我想是可以接受的。V2EX 的主要使用群体是程序员，而 GitHub 也是大部分程序员都一定会使用的一个工具。</p>
        ]]></description>
    </item>
    
    <item>
        <title>&#x7ED1;&#x5B9A; IPNS &#x5185;&#x5BB9;&#x5230;&#x4F20;&#x7EDF;&#x57DF;&#x540D; blog.v2ex.com</title>
        <link>https://blog.v2ex.com/EA7C9A0D-133C-4416-9C55-919AB7350FCC/</link>
        <guid>https://blog.v2ex.com/EA7C9A0D-133C-4416-9C55-919AB7350FCC/</guid>
        <pubDate>Mon, 16 Jan 2023 11:44:48 -0800</pubDate>
        
        <itunes:image href="https://blog.v2ex.com/EA7C9A0D-133C-4416-9C55-919AB7350FCC/brave-ipns.png" />    
        
        
        <description><![CDATA[
            <p>现在大家可以通过这个传统域名访问到这个博客了：</p> 
<p><a href="https://blog.v2ex.com/">https://blog.v2ex.com/</a></p> 
<p>这样的将 IPFS/IPNS 内容绑定到传统域名的方案已经存在很多年了。但是，其中的一个关键部分，之前的主要提供者是 Cloudflare 的 IPFS Gateway。不知为何，这个 Gateway 在过去一年的时间里，大部分时候都是非常不可用的状态，即使是在 Cloudflare 将这个 <a href="https://www.cloudflare.com/web3/">Web3 Gateway</a> 以付费服务的方式提供之后。</p> 
<p>而 ENS 之外的生态系统里，目前又暂时不存在像 <a href="https://olivida.eth.limo/4B412A73-9C15-4E62-BFC6-157E2D28D0C1/">ETH.LIMO</a> 这样的高可用的项目。所以，目前大概只能自建了。不过也不复杂，如果你之前有 Linux 和 NGINX 的使用经验，那个原理和过程还挺简单的。大概就是以下 3 个步骤：</p> 
<ol> 
 <li>为域名增加 DNSLink 记录。</li> 
 <li>在 Linux 服务器上安装 Kubo 并进行一些必要的设置。</li> 
 <li>为域名搭建一个源站给 CDN。</li> 
</ol> 
<h2>为域名增加 DNSLink 记录</h2> 
<p>以本博客为例，第一步是从 Planet 里 Copy IPNS 获得这样的一个 k51 开头的字符串：</p> 
<img width="389" alt="Copy IPNS" src="https://blog.v2ex.com/EA7C9A0D-133C-4416-9C55-919AB7350FCC/v2ex-copy-ipns.png" /> 
<pre><code class="language-txt">k51qzi5uqu5dkczezx3wje1dizdk7rta8uc50a5o9ix4wmzqniacrdbfapt8cf
</code></pre> 
<p>假设我们要绑定到 blog.v2ex.com 这个域名，那么我们需要为 _dnslink.blog.v2ex.com 增加这样一条 TXT 类型的 DNS 记录：</p> 
<pre><code class="language-txt">dnslink=/ipns/k51qzi5uqu5dkczezx3wje1dizdk7rta8uc50a5o9ix4wmzqniacrdbfapt8cf
</code></pre> 
<p>在完成这步之后，其实所有的公网上的 IPFS Gateway 就已经可以找到这个博客了，比如：</p> 
<ul> 
 <li><a href="https://ipfs.io/ipns/blog.v2ex.com" target="_blank"></a><a href="https://ipfs.io/ipns/blog.v2ex.com">https://ipfs.io/ipns/blog.v2ex.com</a></li> 
</ul> 
<p>或者在 Brave 浏览器里直接用 <code>ipns://blog.v2ex.com</code> 也可以打开。</p> 
<img width="770" alt="Brave IPNS" src="https://blog.v2ex.com/EA7C9A0D-133C-4416-9C55-919AB7350FCC/brave-ipns.png" /> 
<p>这种在浏览器地址栏里看到新协议的感觉。😊</p> 
<p>我们的目标是让这个 IPNS 通过传统域名和传统浏览器也可以访问，所以我们还需要继续为它搭建一个源站。</p> 
<h2>在 Linux 服务器上安装 Kubo 并进行一些必要的设置</h2> 
<p>Kubo，也就是 Go 版本的 IPFS 实现的最新版本，可以从这里下载：</p> 
<p><a href="https://github.com/ipfs/kubo/releases" target="_blank"></a><a href="https://github.com/ipfs/kubo/releases">https://github.com/ipfs/kubo/releases</a></p> 
<p>第一次运行前，需要初始化，我们选择以 server 配置进行初始化：</p> 
<pre><code>ipfs init --profile=server
</code></pre> 
<p>然后就可以启动了，这里我们打开了和 PubSub 有关的两个试验选项。推荐用 supervisor 或者 systemd 做成常驻服务。</p> 
<pre><code>ipfs daemon --enable-pubsub-experiment --enable-namesys-pubsub
</code></pre> 
<h2>为域名搭建一个源站给 CDN</h2> 
<p>Kubo 启动之后，在 localhost 上就会多一个神奇的 8080 端口。这个端口是可以响应 HTTP 的 Host header 的，也就是说，如果你运行下面的这条指令，就可以拿到这个博客的首页：</p> 
<pre><code>curl -H "Host: blog.v2ex.com" http://127.0.0.1:8080/
</code></pre> 
<p>所以，借助 Kubo 对虚拟主机头的支持，我们可以这样配置一个 NGINX 源站：</p> 
<pre><code>upstream ipfs_backend {
    server 127.0.0.1:8080;
    keepalive 4;
}

server {
    listen 80;
    listen [::]:80;
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    # SSL
    include /etc/nginx/ssl/v2ex.com.conf;

    server_name blog.v2ex.com;
    access_log /var/log/nginx/blog.v2ex.com.log;

    location / {
        proxy_cache awesome;
        proxy_pass_header Server;
        proxy_http_version 1.1;
        proxy_set_header Host "blog.v2ex.com";
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header Via "Planetable";
        proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504 http_403 http_404;
        proxy_cache_valid 200 60s;
        proxy_pass http://ipfs_backend;
    }
}
</code></pre> 
<p>在根目录的 nginx.conf 的 http {} 段落中加入缓存目录的配置：</p> 
<pre><code>proxy_cache_path /data/s levels=1:2 keys_zone=awesome:1024m max_size=8g inactive=28d;
proxy_temp_path /data/t 1 2;
</code></pre> 
<p>这样我们就获得了一个可以给 CDN，比如 Cloudflare 使用的，能够响应 blog.v2ex.com 请求的 http/https 源站。</p> 
<hr /> 
<p>如果你能够读到这里，那你肯定是对这个话题相当感兴趣了。那我们再把这件事情继续扩展一下：假设你做了一个类似 ENS 的区块链域名项目，你想提供一个类似 ETH.LIMO 那样的 dWeb 网关，那么会还需要什么？这里是一个大致的 To Do 清单。</p> 
<h2>DNS-over-HTTPS 服务器</h2> 
<p>你需要为你的区块链域名项目实现一个 DoH 服务器，也就是通过 HTTP 协议提供的 DNS 查询服务。比如这是 ETH.LIMO 项目为 ENS 实现的：</p> 
<p><a href="https://dns.eth.limo/dns-query">https://dns.eth.limo/dns-query</a></p> 
<p>然后你可以这样来发起查询：</p> 
<pre><code>curl --http2 -H "accept: application/dns-json" "https://dns.eth.limo/dns-query?name=vitalik.eth"
</code></pre> 
<p>会拿到一个这样的结果：</p> 
<pre><code class="language-json">{
  "Status": "0",
  "RD": false,
  "RA": false,
  "AD": false,
  "CD": false,
  "TC": false,
  "Question": [
    {
      "type": 16,
      "name": "vitalik.eth"
    }
  ],
  "Answer": [
    {
      "type": 16,
      "name": "vitalik.eth",
      "data": "dnslink=/ipfs/QmWxRwMg3bHyJxfAuPnUky2yNgNt51qmZqC99Ffenjxa94/",
      "ttl": 600
    }
  ]
}
</code></pre> 
<p>实际上就是这个 DoH 服务器把 ENS 设定里的 content hash，当作一条 DNSLink 的 TXT 记录返回了。</p> 
<p>有了这样的一个 DoH 服务器之后，Kubo 在配置中支持你把指定的域名后缀用定制的 DoH 服务器解析。</p> 
<p>如果你打算写代码来实现这个 DoH 服务，那么并不需要支持所有类型的 DNS 查询，只要能用 TXT 类型返回 DNSLink 记录就可以了。</p> 
<p>相关文档：</p> 
<p><a href="https://github.com/ipfs/kubo/blob/master/docs/config.md#dns">https://github.com/ipfs/kubo/blob/master/docs/config.md#dns</a></p> 
<p>假设你的区块链域名项目的后缀叫做 <code>.ape</code>，支持用户设定类似 EIP-1577 那样的 content hash，在 <a href="https://dns.example.com/dns-query">https://dns.example.com/dns-query</a> 上运行了一个能够解析 .ape 的 DoH 服务器，那么你就可以把这样的配置加入到 Kubo 的 config 中：</p> 
<pre><code>{
  "DNS": {
    "Resolvers": {
      "ape.": "https://dns.example.com/dns-query"
    }
  }
}
</code></pre> 
<p>然后，只要对之前提到的那个 NGINX 配置文件稍作改造，用 Lua 模块获得用户请求的 .ape 域名，然后加上正确的 proxy_set_header Host 发向配置好了 DoH 服务器的 Kubo upstream，那么一个类似 ETH.LIMO 的 dWeb Gateway 就这样初步搭建好了。</p> 
<p>下面这个是一个用 Python Flask 框架写的可以解析 .bit 区块链域名的 DoH 服务器：</p> 
<p><a href="https://github.com/v2ex/dweb-dns">https://github.com/v2ex/dweb-dns</a></p>
        ]]></description>
    </item>
    
    <item>
        <title>Chrome &#x548C; Safari &#x5728;&#x8BBE;&#x8BA1;&#x4E0A;&#x7684;&#x4E24;&#x4E2A;&#x5C0F;&#x7EC6;&#x8282;&#x7684;&#x5DEE;&#x5F02;</title>
        <link>https://blog.v2ex.com/04BFF737-192D-4489-A3B7-C247FADDB19C/</link>
        <guid>https://blog.v2ex.com/04BFF737-192D-4489-A3B7-C247FADDB19C/</guid>
        <pubDate>Mon, 09 Jan 2023 06:25:49 -0800</pubDate>
        
        <itunes:image href="https://blog.v2ex.com/04BFF737-192D-4489-A3B7-C247FADDB19C/chrome-responsive-design.png" />    
        
        
        <description><![CDATA[
            <p>有时候，当我们在网站上看到一些有趣图片想要保存到本地。</p> 
<p>这是 Chrome 的右键菜单：</p> 
<img width="455" alt="Chrome Right Click" src="https://blog.v2ex.com/04BFF737-192D-4489-A3B7-C247FADDB19C/chrome-right-click.png" /> 
<p>这是 Safari 的右键菜单：</p> 
<img width="449" alt="Safari Right Click" src="https://blog.v2ex.com/04BFF737-192D-4489-A3B7-C247FADDB19C/safari-right-click.png" /> 
<p>Safari 比 Chrome 多了一个直接保存到 Downloads 文件夹的选项。</p> 
<p>如果你就是想把文件放到 <code>~/Downloads</code> 里然后再做进一步处理的话，Safari 直接提供了 <code>Save Image to Downloads</code> 的选项，因此你一次点击就可以完成这个操作。而如果要在 Chrome 里完成同样的操作，即使你上次选择的保存位置已经是 <code>/~Downloads</code>，那也会比 Safari 多至少一次点击。如果在 Chrome 里你的上次保存位置不是 Downloads，那么就会需要手动切换回 Downloads，那就是更多次点击了。</p> 
<hr /> 
<p>当我们在为一个网站做各种设备宽度的适配，也就是 Responsive Design 时，作为现代浏览器，Chrome 和 Safari 都为这样的调试提供了切换到不同设备的功能。</p> 
<p>这是 Chrome 的设备切换方式。首先点击 Dimension，然后选择要切换的设备。两次点击可以完成切换：</p> 
<img width="610" alt="Chrome Responsive Design" src="https://blog.v2ex.com/04BFF737-192D-4489-A3B7-C247FADDB19C/chrome-responsive-design.png" /> 
<p>这是 Safari 的 Responsive Design。直接列出了常用设备和宽度，一次点击可以完成切换：</p> 
<img width="765" alt="Safari Responsive Design" src="https://blog.v2ex.com/04BFF737-192D-4489-A3B7-C247FADDB19C/safari-responsive-design.png" />
        ]]></description>
    </item>
    
    <item>
        <title>Hello World</title>
        <link>https://blog.v2ex.com/AAFDE85B-BAB7-4F22-9F95-D1435175D15B/</link>
        <guid>https://blog.v2ex.com/AAFDE85B-BAB7-4F22-9F95-D1435175D15B/</guid>
        <pubDate>Fri, 16 Sep 2022 02:39:24 -0700</pubDate>
        
        <itunes:image href="https://blog.v2ex.com/AAFDE85B-BAB7-4F22-9F95-D1435175D15B/planet-markdown.png" />    
        
        
        <description><![CDATA[
            <p>感谢 <a href="https://did.id/">.bit</a> 创始人 <a href="https://jarvis.bit.cc">jarvis.bit</a> 把 v2ex.bit 转给我，于是 V2EX 的博客终于可以开始写了。</p> 
<p>程序员写博客，很大的一块乐趣和动力是可以折腾这个写博客的工具😄。所以首先介绍一下 v2ex.bit 博客背后的工具和技术。</p> 
<h2>Planet</h2> 
<ul> 
 <li>Web <a href="https://planetable.xyz/">https://planetable.xyz/</a></li> 
 <li>GitHub <a href="https://github.com/Planetable/Planet">https://github.com/Planetable/Planet</a></li> 
</ul> 
<p>Planet 是一个 macOS 上的原生应用。你可以把它理解为是一个带图形界面的静态网站生成器。可以用来构建一个博客。</p> 
<img width="1256" alt="planet" src="https://blog.v2ex.com/AAFDE85B-BAB7-4F22-9F95-D1435175D15B/planet.png" /> 
<p>编辑内容的时候使用的是一个两栏的 Markdown 编辑器，除了可以插入图片，视频和音频文件也是可以的。</p> 
<img width="941" alt="planet-markdown" src="https://blog.v2ex.com/AAFDE85B-BAB7-4F22-9F95-D1435175D15B/planet-markdown.png" /> 
<p>这个工具特别的是自带了 IPFS 服务器。因此可以把生成的静态网站直接发布为 IPNS 记录。然后这条 IPNS 记录可以用来绑定到支持 IPNS 的区块链域名上，比如 .eth 或者 .bit。</p> 
<p>目前这个博客就绑定到了 v2ex.bit 上。</p> 
<p>但目前，这些区块链域名和常规域名不太一样的是，如果你直接拿到普通浏览器里访问，是打不开的。所以目前还需要借助公共网关，比如 <a href="https://app.did.id/explorer?inviter=v2ex.bit">.bit</a> 的公共网关地址是在域名背后加上 site，也就是这样就可以在普通浏览器里访问这个博客了：</p> 
<p><a href="https://v2ex.bit.site">https://v2ex.bit.site</a></p> 
<p><strong>于是，用 Planet 写的博客，内容的权威版本是存在作者自己的电脑上，通过本地运行的 IPFS 节点对 Internet 提供服务。而域名是在区块链的智能合约里。内容和域名都没有被控制在一家商业公司的服务器上。云在这样的架构里是非必要的。</strong></p> 
<p>以上是关于这个博客背后的工具的介绍。</p> 
<p>下面我们聊聊 V2EX。</p> 
<h2>V2EX</h2> 
<p>大家现在看到的 <a href="https://www.v2ex.com/">V2EX</a> 上线于 2010 年 4 月 25 日。最早是一个只支持手机访问的，单栏设计的，非常简单的 BBS。话题主要关于编程、设计、游戏、硬件、Apple 等等 cyber 内容。</p> 
<p>在持续存在了超过十年之后，网站大致形成了某种稳定的场域或者说默契。而作为这个网站的维护者，我们的愿望就是想让这其中某些让人感到怀旧的因素，能够就这么一直存在下去。而能够一直存在下去的东西，往往都是简单但是同时又能够持续提供实用用途，这也是我们希望 V2EX 能够保持的：设计上简单，同时能够让使用者从其中找到一些有用的因素。</p>
        ]]></description>
    </item>
    
</channel>
</rss>
