<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
  <channel>
    <title>吕立青的博客</title>
    <link>https://blog.jimmylv.info</link>
    <description>想做产品，却误入程序世界爱上写作的摄影师。</description>
    
      <item>
        <title>Gingko Writer：在 AI 随便生成 20 万字的时代，"生而为人"该如何写作？</title>
        <link>https://blog.jimmylv.info/2024-02-08-gingko-writer-human-writing-ai-generation-era/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2024-02-08-gingko-writer-human-writing-ai-generation-era/</guid>
        <pubDate>Thu, 08 Feb 2024 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;这篇文章是使用 Gingko Writer 所写的，题图中 Gingko 的布局跟 Timestripe 视图是我思考的”引子”，从而开篇穿插了一大段「目标与执行」在 AI 背景下的关系重建。但重点依然是，Gingko 如何更好地围绕目标 Output 写作输出呢？让你的想法”写”出来，”放”到位。当然最后，别忘了人与 AI 在情感上的最大不同。&lt;/p&gt;

  &lt;p&gt;P.S. 这篇文章是由一个真实的人写的，来自真实大脑所激发的想法和创造力。我希望你使用 AI 自动总结这篇文章时，不会过度”模糊化”。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;始于目标忠于执行&quot;&gt;始于”目标”，忠于执行&lt;/h2&gt;

&lt;p&gt;在重度（每天多次）使用 Roam Research 和 Timestripe 数年之后，最近又重逢 Gingko Writer 的布局和交互，真的是深得我心。我才意识到，原来 Timestripe 这个我用了2年多的目标管理软件，似乎也可以用Gingko就能完全替代了？&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/editor/u_/cn1enptb34ten0fq3cag&quot; alt=&quot;Timestripe Timeline View&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Timestripe 的界面设计和细节，可以参考 @Miobowl 所写的这篇 &lt;a href=&quot;https://sspai.com/post/83944&quot;&gt;Timestripe：什么样的待办软件才是最贴近生活的人生规划器 - 少数派&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Telegram、Timestripe、Roam Research、Readwise Reader，对我来说分别是灵感（idea 数据）、目标（goal 数据）、笔记（note 数据）、资料（refs 数据）的集合，由此可见，我还缺少了一个系统性的输出工具，即写作（opus 数据）。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/editor/u_/cn1enqdb34tenbpc03a0&quot; alt=&quot;Roam Research Sidebar&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我在 Timestripe 设置了每日目标，然后通过日历同步到 Zapier 或 n8n，然后自动触发任务执行并汇总到 Roam Research，从而我可以在 Daily Notes 当中校对目标的结果并推进下一步，日拱一卒。我在之前的&lt;a href=&quot;https://www.bilibili.com/video/BV1YM4y1Y7Rm?t=1273.0&quot;&gt;直播&lt;/a&gt;分享过一个 Import Google Calendar 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[roam/js]]&lt;/code&gt; 插件，所以Timestripe 里面安排的目标都会&lt;strong&gt;手动&lt;/strong&gt; pull 到 Roam Research 里面，每天一次就够了。后续对于目标的修改和完成的记录也是发生在 Roam Research，我的过程笔记 notes 都在Roam Research。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/2024/02/07/4a36abf4fde3350027bca2858f6d7dc1.png&quot; alt=&quot;OKRs Visualization&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这里面其实暗合了 OKRs 的思路。只有当我将人生、年月季度的 Objective 自上而下拆分到每一天的执行，然后自下而上的输入（Roam Research 过程笔记），才是有可能真正去实现目标。我需要思考的如何去&lt;strong&gt;执行目标之下的任务&lt;/strong&gt;，而且更应该思考如何&lt;strong&gt;更好地完成目标而非任务本身&lt;/strong&gt;。&lt;/p&gt;

&lt;h2 id=&quot;任务的执行交由-ai&quot;&gt;任务的”执行”交由 AI&lt;/h2&gt;

&lt;p&gt;围绕目标之后的输入 Input 和输出 Output，让我收获了更有价值的成就感。但大语言模型的到来，破坏了这种获得感，LLM 天生擅长于”文字游戏”，AIGC 内容生成在输出端以降维打击之势碾压了人类。在频繁使用 ChatGPT 等 AI 工具之后，不自觉会把人类的弱点跟 AI 的优点对比，直面人本身的弱点的同时，还需要直面 AI 本身强于人的优点。这个过程那是真的难受，于是真正”作为人”的写作需要另外的工具。&lt;/p&gt;

&lt;p&gt;对了，由于 Timestripe 我还彻底弃用了 Things3，我发现我没有管任务了，因为我的核心思考是：AI 时代 task 不重要了，至少 task 不应该是”人”来主导执行。在操作层面上，顶多在 Timestripe 里面记录一个 subgoal 子目标，而非 task。&lt;/p&gt;

&lt;p&gt;所以，我更多的是在考虑如何将 Timestripe 的目标与 AI 联动，AI Agent 现在的规划能力偏弱，在核心领域人类的任务拆解能力尚处于绝对优势。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/2024/02/07/f8c0116422f323dcd1af11550301c300.png&quot; alt=&quot;AI Agent Workflow&quot; /&gt;&lt;/p&gt;

&lt;p&gt;可以说，今后人的价值就在于做好任务拆解，把任务的颗粒度控制在合适的大小，AI是能够批量化、自动化高质量完成的；与此同时，在人机协同的和谐配合之后，对于个人来说，构建知识库、以及快速构建知识库的能力很重要。基于知识库的 RAG，以及如何调取 API、RPA 等第三方软硬件能力。&lt;/p&gt;

&lt;p&gt;我之前转发过 @Yangyi 一条很酷的 &lt;a href=&quot;https://twitter.com/YangyixxVvvv/status/1751404989262836223&quot;&gt;Tweet&lt;/a&gt;，也许可以开一个课程：《基于 LLM 与 RAG 的 AI 时代超级个体》（感兴趣的朋友可以评论或私信我了，众筹众筹 🐶），围绕软件和媒体，通过 AI Agent 自动化 build &amp;amp; sell，打造闭环，赋能个体 🤣&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;杠杆率最高的：&lt;/strong&gt; 开发超级酷的 AI 应用
&lt;strong&gt;杠杆率第二高的：&lt;/strong&gt; 做贼有意思的视频&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/editor/u_/cn1enrlb34tenbpc03b0&quot; alt=&quot;Skyline&apos;s Xiaohongshu GPTs&quot; /&gt;&lt;/p&gt;

&lt;p&gt;另外一方面，当 OpenAI 的 GPTs 可以让每一个都轻松构建私人助理，那么知识库的&lt;strong&gt;质量&lt;/strong&gt;就尤为重要了，甚至是直接决定了后续 RAG 或 Workflow 执行流程的质量，而非单纯的 prompt 就能教会 LLM 那大学生水平的大脑。@Skyline 的实践经验在于：人工&lt;strong&gt;来&lt;/strong&gt;把控源头的精确，而让 AI &lt;strong&gt;去&lt;/strong&gt;负责细节的调控。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;精确获取高质量的官方信息源，而非玄学小红书运营防雷内容&lt;/li&gt;
  &lt;li&gt;加入高质量的付费内容，将实战专家的可验证规模化经验作为补充&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;回归正题gingko-让想法写出来放到位&quot;&gt;回归正题：Gingko 让想法”写”出来，”放”到位&lt;/h2&gt;

&lt;p&gt;Gingko 官网的 Slogan 是 Let Your Writing Flow，也就是让你的想法自由地流淌到位。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Let your ideas flow freely into place，自然而然地形成，流动到妙手偶得的位置。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;“文章本天成，妙手偶得之。” —— 南宋陆游《文章》&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/editor/u_/cn1enqlb34ten5sgivo0&quot; alt=&quot;Gingko Flow View&quot; /&gt;&lt;/p&gt;

&lt;p&gt;张玉新老师在群里说推广 TB 很有成就感，于是又推广了一下小众的 Gingko，他在人生尺度的记录，从逻辑维度看，都在 TheBrain 中；从时间看，都在 Gingko。建议看看张玉新老师的记录示例 &lt;a href=&quot;https://gingkoapp.com/2021-pub&quot;&gt;https://gingkoapp.com/2021-pub&lt;/a&gt; 和关于《学习之道》的分享 &lt;a href=&quot;https://gingkoapp.com/art-of-learning&quot;&gt;https://gingkoapp.com/art-of-learning&lt;/a&gt; ，从而感受一下 Gingko到底是算什么形式？大纲？列表？卡片？可能只有对着屏幕边画边说，才能讲清楚。&lt;/p&gt;

&lt;p&gt;Gingko 主要是在你面对一项重大的写作项目（比如论文、专栏、出书等），或者试图将生活的各个方面都整合在一起时，问题在于：你会如何进行组织呢？&lt;/p&gt;

&lt;p&gt;你可能会在纸上先写一个最简单的列表？或者是用一个数字化笔记，比如在 Roam Research 从大纲开始写层级？或者说，拿起一叠纸质索引卡？先随便写，然后再自由组合起来？&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;那么，为什么不同时选择上述所有的选项呢？&lt;/strong&gt; Gingko 创造了一个简洁界面，让你可以同时使用列表、大纲和卡片。这带来了自由，你可以从任何一种形式开始，灵感闪现一张卡片，或者深度思考几条核心观点，又或者发现了卡片之后的关联关系。这种自由和专注，形成了 Flow。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/2024/02/07/de86788129677bb39d18626582cabba3.gif&quot; alt=&quot;Gingko Writing Demo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;就像我作为程序员，特别偏好于使用键盘快捷键，而在 Gingko 当中卡片的导航、链接和展示都可以纯键盘实现，再次保障了 Flow 的流淳。&lt;/p&gt;

&lt;p&gt;作为软件工程师的Patrick也提到，这是曾经遇到的唯一一种写作方式，它让自己能够一次性将所有想法表达出来，并同时保持有条不紊。我觉得这比 Emacs 或 Vim 模式下的诸多扩展，多了一层可视化的思维展开。&lt;/p&gt;

&lt;h2 id=&quot;gingko-对于其他写作模式的融合&quot;&gt;Gingko 对于其他写作模式的融合&lt;/h2&gt;

&lt;p&gt;Gingko 作者，开篇就提到了”攻读博士学位很痛苦。”为什么？对于任何写过论文、小说或其他大作品的人来说，（组块）大小在保持专注力方面很重要。我尝试了各种文字处理软件、大纲工具、思维导图、维基和tiddlywikis……&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; 在于层次结构的力量，也就是将主题和子主题层层分解，有助于将信息分成可管理的部分。并且在 Roam Research 这类软件当中，可以非常自由调整父子主题的位置，即指代了层级和同级的关系，并且还能轻松合并同类项。Roam Research 还可以同层级展开或折叠节点，在深入某个局部的同时，保持对整体结构的鸟瞰。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TiddlyWikis 的价值&lt;/strong&gt; 在于通过使用卡片或内容块来获得专注。慢慢地，使用一个卡片的层次结构的想法开始形成，而且不隐藏任何卡片。每个卡片或内容块都可以视为一个独立的单元，用户可以直观地将其组织和排列。当你专注于一个个小的信息单元，而不必同时处理大量的内容，这种分块的方式有助于减少认知负荷，更容易专注于当前的写作任务或主题。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/2024/02/07/article/239ba12885720adbe2d56c12f3d4dc32&quot; alt=&quot;Gingko Card Organization&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Gingko 在 UI 设计上是通过灰度来高亮正在编辑的卡片及其左侧的父级卡片，&lt;strong&gt;但同时也会显示其他所有层级的内容&lt;/strong&gt;，只不过会降低灰度从而弱化存在感；&lt;/p&gt;

&lt;p&gt;更重要的是，会自动将当前编辑内容始终处于屏幕的最中间，就像《使命召唤》游戏中的飞机轰炸视角但始终瞄准，从而极大提高了专注度。Gingko Writer 能够让你自动做到总是在写小组块内容，即”卡片”，这是取得进展的唯一途径：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Break your work into small chunks.&lt;/strong&gt; 将你的工作分成小块。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Focus on one at a time.&lt;/strong&gt; 一次只专注于一个。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;让-gingko-专注于写作输出&quot;&gt;让 Gingko 专注于写作输出&lt;/h2&gt;

&lt;p&gt;就如同 Gingko 重构后的新网址 (writer) 一样，&lt;a href=&quot;https://gingkowriter.com&quot;&gt;https://gingkowriter.com&lt;/a&gt; 我目前也是让 Gingko 专注于写作输出 (writing)，跟 Roam Research 的过程笔记作为输入，简直绝配！这篇文章的创作就是一次试验罢了，想法和资料的整理在 Roam Research，但是结构成品是在 Gingko，写起来非常愉快。&lt;/p&gt;

&lt;p&gt;Gingko 跟 Roam Research 比还差一个 card ref，如果也能直接”穿针引线”的话，那简直就是绝，但我觉得可以互为补充。Roam Research 强于记录，但是写作输出则是另外一条逻辑，Roam Research 反而过于发散而无法专注。写作应该化网状为线性，根据 Gingko 作者的初心（写论文），我觉得 Gingko 在系统性输出上会更友好。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/2024/02/07/bf0d798bf1adf11c2ca6ebc10d91351a.png&quot; alt=&quot;Abandoned Roam Column&quot; /&gt;&lt;/p&gt;

&lt;p&gt;也不确定，反正我之前在Roam Research尝试写专栏文章（此处愧对 @Sainho 少数派编辑），单篇篇幅动辄就是几万字了，没法看，最后导致我直接放弃咯 🤣&lt;/p&gt;

&lt;p&gt;Roam Research 的灵活度与发散主要体现在 block ref（块引用），block embed（块嵌入）用得飞起，结果就是上下文插入过多，主线就不够清晰了，大纲 Outliner 这种其实也不适合项目或任务管理，甚至也不适合写作（成品输出），我现在也很少 all in one 甚至杜绝 all in one Roam Research。或者说，已经断了执念all in one 任意一款软件啦，哈哈哈&lt;/p&gt;

&lt;p&gt;群友 @赣中 在讨论很多 APP 的功能视图都能在 Roam Research 实现，包括 Timestripe和 Gingko，我之前做的「&lt;a href=&quot;https://github.com/JimmyLv/styled-roam&quot;&gt;Roam卡片式主题&lt;/a&gt;」灵感就来自于 Gingko；但是 Roam 不固化 Pattern，终端用户是没法用的。就像你要开发个应用，你把字段设计好了，存 DB 数据库里了，然后你跟用户说你会写 SQL 吧，你自己查吧，应用层面的 UI 咱就不做了。&lt;/p&gt;

&lt;p&gt;其实对于工具的选择还是因人而异，Roam Research 的根基 pattern 就是 outliner，这是我用得最顺手的 pattern（模式），也许跟每个人的大脑偏好有关：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;基础层级：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;有些人的pattern可能是folder&lt;/li&gt;
  &lt;li&gt;有些人的pattern可能是tags&lt;/li&gt;
  &lt;li&gt;有些人的pattern可能是mindmap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;更高阶的：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;有些人的pattern可能是TheBrain的父子兄&lt;/li&gt;
  &lt;li&gt;有些人的pattern可能是Excalidraw自由白板&lt;/li&gt;
  &lt;li&gt;有些人的pattern可能是纸笔，自带边界限制&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/2024/02/07/5599fcac757949bf27b48806e6a0aa00.png&quot; alt=&quot;Heptabase Pattern&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Heptabase 原名 Project Meta，就是你所说的定义好字段，然后推出一堆的 Meta Apps（现在官方也有3、4个咯），本质上就是结构化数据之上的pattern，即应用。&lt;/p&gt;

&lt;h2 id=&quot;以人为本实践出喜欢&quot;&gt;以”人”为本，实践出”喜欢”&lt;/h2&gt;

&lt;p&gt;如果要说”最”喜欢的某种 pattern，那其实就只能选一种，但凡宣称所有 pattern 都支持的，可以灵活供选择的都是骗子。或者说，在最合适的场景下，应该选择最合适的 pattern 吧！或者换个角度来说，”人”相较于 AI 所能探寻的情绪价值是更重要的，”喜欢”本身就需要实践和时间。越用越喜欢的工具，哪怕忍受它的各种问题，一定是因为它那 20% 最特别的地方吸引了最独特品味的你。&lt;/p&gt;

&lt;p&gt;哪怕是 Gingko，也有不同的用户用在不同的场景中，衍生出了不同的 pattern。大家可以看看官网中的 &lt;a href=&quot;https://gingkoapp.com/p/examples/&quot;&gt;Examples - Gingko App&lt;/a&gt; 里面有论文写作，也有 GTD 的示例。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/2024/02/07/6e6a36b08b50556d8108323c5995c648.png&quot; alt=&quot;Full-Screen Editing&quot; /&gt;&lt;/p&gt;

&lt;p&gt;最后，总结一下在写这篇文章时，使用 Gingko 的几个严重问题：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;无法插入图片（不支持任何附件，纯 Markdown 语法）&lt;/li&gt;
  &lt;li&gt;如果使用 md &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;![]()&lt;/code&gt; 插入图片，拖拽就会失效（由于图片显示时的尺寸刷新问题)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;当然，使用 Gingko 也有几个爽点：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;focused 的感觉真的强，特别是淡化其他卡片和居中当前卡片的显示效果&lt;/li&gt;
  &lt;li&gt;移动+合并卡片等快捷键，使用Alt+方向键，真的舒服，卡片在指尖流动！&lt;/li&gt;
  &lt;li&gt;全屏编辑的效果，Shift+Enter，让人瞬间 focus 的同时保留了上下文。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;那么，朋友们！等我先实践一波：Input 都放 Roam Research、Output 都在 Gingko，看看我能不能疯狂输出几篇文章？也欢迎留言与我交流，这篇文章的可读性，是否会比我之前的文章更好一些呢？&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;相关阅读：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://sspai.com/post/80910&quot;&gt;序章：为什么都 2023 年了，我还在用 Roam Research 写笔记？&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;table&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;[年度征文&lt;/td&gt;
          &lt;td&gt;超越效率：10x 提升阅读体验后，我有哪些反思？](https://sspai.com/post/78124)&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;table&gt;
      &lt;tbody&gt;
        &lt;tr&gt;
          &lt;td&gt;[年度征文&lt;/td&gt;
          &lt;td&gt;我是如何艰难地克服「效率成瘾」的？](https://sspai.com/post/71518)&lt;/td&gt;
        &lt;/tr&gt;
      &lt;/tbody&gt;
    &lt;/table&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sspai.com/post/66033&quot;&gt;思想，在树上生长：树状结构 VS 网状结构，如何搭建你的知识体系？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
      </item>
    
      <item>
        <title>序章：为什么都 2023 年了，我还在用 Roam Research 写笔记？</title>
        <link>https://blog.jimmylv.info/2023-07-11-why-still-using-roam-research-2023-introduction/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2023-07-11-why-still-using-roam-research-2023-introduction/</guid>
        <pubDate>Tue, 11 Jul 2023 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;展信佳，&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;曾经有无数新的笔记工具摆在我面前，我没有珍惜，等我失去的时候，我才后悔莫及，人世间最痛苦的事莫过于此。如果上天能够再给我一次机会，我会对那个笔记工具说三个字：我选你。如果非要为这个选择作出一个解释，我希望是……这份信。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;笔记工具市场roam-research-的模仿者&quot;&gt;笔记工具市场：Roam Research 的模仿者&lt;/h2&gt;

&lt;p&gt;在工具层面，同类型对比时，唯一的对手只有 Logseq，同为 Clojure &amp;amp; ClojureScript 开发，文学编程的默契”同源”。而且 Logseq 是开源的，融资额 400w 美元，现金充裕，生态很好，之前的 Roam Research 大V Ramses Oudt 被雇佣专门做 Marketing，最新官网的描述也很棒：Logseq: A privacy-first, open-source knowledge base.&lt;/p&gt;

&lt;p&gt;Obsidian，作为最先的模仿者，但是选择了 Markdown 文件作为载体，所以受限很多，跟 Logseq 相比而言，在数据格式上并不占优。Logseq 和 Obsidian 都主打 local-first，私有化数据，就像 Obsidian 的口号：A second brain, for you, forever.&lt;/p&gt;

&lt;p&gt;但是对于普通用户来说，并不关心背后的 Markdown 或者是 Datalog 数据库，所以依然需要同步，自选方案当然有，比如 iCloud，但是 Apple 确实拉胯，导致基于文件系统的同步体验着实很差，并且经常可能出错。&lt;/p&gt;

&lt;h2 id=&quot;商业化变现obsidian-publish-和-logseq-pro&quot;&gt;商业化变现：Obsidian Publish 和 Logseq Pro&lt;/h2&gt;

&lt;p&gt;于是乎，Logseq 和 Obsidian 这对难兄难弟都选择推出了自己的 Pro 服务，即自带云同步。Obsidian 更甚，基于 Markdown 的好处在于面向文档，于是 Obsidian Publish 孕育而生，作为内容的托管服务，取代博客，且模仿了 Andy’s Working Notes 样式，名为「数字花园」。只不过，同样价格很贵。&lt;/p&gt;

&lt;p&gt;Logseq 本身是开源的，且天然支持 Git，从而程序员群体比较偏爱它。同时，爱折腾的程序员们，自然会更容易找到公开发布的方案，也更愿意为它开发插件。需要注意的是，Obsidian 本身并不开源，但它的插件生态和开发者文档做得很好。于是，诸多插件如雨后春笋般涌现，产品体验也随之走向了崩坏，原因也很简单：插件不考虑宿主，更不考虑用户。&lt;/p&gt;

&lt;h2 id=&quot;本地化-vs-云端化新兴的云笔记工具们&quot;&gt;本地化 vs. 云端化：新兴的云笔记工具们&lt;/h2&gt;

&lt;p&gt;说完了本地化的两款代表笔记工具之后，基于云的 Roam Research 模仿者，值得一提的就只有两款：RemNote 和 Tana。RemNote 依托于靠谱的科学研究，较为重视 Remember Note 的相关产品设计，比如 Flashcard 等机制，对学生来说价值更高。&lt;/p&gt;

&lt;p&gt;当然，继双链的概念大热之后，市场上既有的类似产品也随之跟上，最典型的比如 Workflowy 是我看好的一名选手。多年的功能开发之后，却保持了极简，着实不易。双向链接的引用，取名为 mirrors 也比较贴切，跟 Notion 的 synced block 有异曲同工之妙，但也仅限于此了。&lt;/p&gt;

&lt;p&gt;而 Tana 则是新的搅局者，第二大脑的作者 Tiago Forte 称之为 “the new Roam”，而社区更倾向于将其描述为 Notion + Roam Research 的孩子。Tana 的早期起势非常高调，社区大 V 们纷纷高潮，奔走相告，再加上邀请制一码难求，期待值非常高，堪比 Arc 浏览器。&lt;/p&gt;

&lt;h2 id=&quot;ai-的崛起chatgpt-和-new-bing-带来的挑战与机遇&quot;&gt;AI 的崛起：ChatGPT 和 New Bing 带来的挑战与机遇&lt;/h2&gt;

&lt;p&gt;但是，就如 ChatGPT 所引发的一波高潮之后，微软祭出 New Bing 大杀器，让直接集成 ChatGPT 的 Edge 浏览器大杀四方。Arc 浏览器在功能层面上的创新显得微不足道，AI 加持的新生产力工具，才是未来的革命性创新。&lt;/p&gt;

&lt;p&gt;New Bing 弥补了 GPT-3 缺失实时网络搜索结果的缺憾，聚合总结的效果更加震撼。并且，Edge 浏览器中的 New Bing 能够直接与网页的内容直接进行交互，让 ChatGPT 根据用户实时浏览的内容进行智能问答。众所众知，浏览器作为互联网的入口，所浏览的内容不局限于网页，同样可以作用于 PDF、图片等其他内容，因此想象空间更为巨大。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/2023/07/07/article/bbdf32f837f31ceba20595dedf189303?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;笔记工具对比&quot; /&gt;&lt;/p&gt;

&lt;p&gt;由此，微软所打出的 New Bing 搜索引擎 + New Edge 浏览器，让这两个领域都占据先手优势的谷歌猝不及防，已有的 Google 搜索和 Google Chrome，不得不开始跟上脚步和踩准节拍。好玩的是，谷歌联合创始人拉里·佩奇（Larry Page）和谢尔盖·布林（Sergey Brin）都被紧急召回，更频繁地参与到公司业务当中，布林甚至亲自下场为谷歌聊天机器人Bard写代码。然而被给予厚望的先发产品 Bard，还是在发布会演示时就立马栽了跟头。&lt;/p&gt;

&lt;h2 id=&quot;思维链路roam-research-的独特价值与使用感受&quot;&gt;思维链路：Roam Research 的独特价值与使用感受&lt;/h2&gt;

&lt;p&gt;现在，让我回过头重新选择工具的话，我依然对 Roam Research 寄予厚望。并不是因为我曾经一次性充值了 5 年 believer 的所谓信仰，也不是因为我已经退出微信群运营的 RoamCN 社区，曾经的 #roamcult 社区狂热早已退散。&lt;/p&gt;

&lt;p&gt;但如同我的实践感受一样，有一种莫名的集体潜意识让我意识到，社区也在慢慢发现 Roam Research 确实做得更好。并且，使用的人也在慢慢回流，不光是因为他们在 Logseq 或 Obsidian 等其他地方碰了壁，也是因为对笔记本身这件事情的理解。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/2023/07/07/article/c0e1b27e23f5953c478b937c127ef8ee?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;Roam Research 的独特价值&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我确信，如果自己不曾坚持使用 Roam Research，我也不会发现在深层级的功能设计和操作细节之下，隐藏的所谓”思维链路”是多么重要，更无法悟得卢曼与卡片盒”沟通”的真谛。才明白，原来 Roam Research 一直在这里，扮演着最好的”沟通对象”角色，哪怕已经有了 ChatGPT 这样更加智能的”提问对象”。&lt;/p&gt;

&lt;h2 id=&quot;chatgpt-vs-写作为什么选择卡片写作而非直接问-ai&quot;&gt;ChatGPT vs. 写作：为什么选择卡片写作而非直接问 AI？&lt;/h2&gt;

&lt;p&gt;相比之下，AI 看似智能的直给，恰恰剥夺了思考的乐趣。直给答案，代表着丝滑，同样也意味着没有摩擦。但由于缺少了必要难度，大脑无法加强存储难度，反而培养了一种遇事不决，先问 AI 的惰性，因为提取难度更高，大脑总是会选择那条最小阻力之路。&lt;/p&gt;

&lt;p&gt;「不写，就无法思考。」代表着就是通过写作的方式来刻意制造摩擦，游戏化就是主动克服本来不必要的麻烦，但是麻烦也不能太大，总不能一来就去打终极 BOSS。于是，笔记要选择从写卡片开始，这是给自我反馈的最佳方式，也是滑板鞋在地板上摩擦的乐趣所在，时尚！&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;我的滑板鞋时尚时尚最时尚
回家的路上我情不自禁
摩擦 摩擦
在这光滑的地上摩擦&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;从双向链接到视觉化白板笔记工具们的新探索&quot;&gt;从双向链接到视觉化白板：笔记工具们的新探索&lt;/h2&gt;

&lt;p&gt;除了笔记要卡片化这一共识以外，大家对双向链接本身的迷思陷入最深，自动化双链后，用户会不自觉地吐槽知识图谱未能成型，笔记厂商们则假惺惺地对图谱做做优化。但除了更难看之外，也开始做起了视觉化白板，便是摸到了新的方向，也将其纳为了商业化变现的 Pro 功能，既引得了用户们的欢呼，更赢得了投资者的期待。&lt;/p&gt;

&lt;p&gt;对于视觉化白板，开头提到的那对难兄难弟 Logseq 和 Obsidian 分别称之为 Whiteboard 和 Canvas，简称 WC。我始终不确定白板的价值，只能将其拆分阶段为”小白板”和”大白板”，前者用于灵感阶段，后者用于梳理知识结构？可能吧，只是不同阶段理应使用不同的工具。&lt;/p&gt;

&lt;p&gt;如果真的 All in 了视觉化白板，那肯定不得不提 Heptabase，内测一年多了，功能迭代飞速，每周发版从未间断。但不知为何，为了减少摩擦的白板功能，始终摩擦力巨大让人用不起来，这也变成了共识。是不是白板本身就错了呢？&lt;/p&gt;

&lt;h2 id=&quot;视觉化白板框架与灵活度如何取舍的平衡之道&quot;&gt;视觉化白板：框架与灵活度如何取舍的平衡之道&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://cdnfile.sspai.com/2023/07/07/article/c22edbd8f9a72a3f7a88b1d575301d30?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;视觉化白板&quot; /&gt;&lt;/p&gt;

&lt;p&gt;关键点在于，”大白板”和”小白板”之间，存在一个概念叫做”框架白板”，白板的灵活度本身就是汝之蜜糖，彼之砒霜。框架对应思维模型，思维导图如果算一种的话，那么它也算是一种自带框架的”白板”。&lt;/p&gt;

&lt;p&gt;所以，在框架和灵活度之间取得平衡的，当属最老牌的第二大脑软件 TheBrain，本身就具备了父子兄三种层级的自由链接，还兼顾了大纲和思维导图的模式。更值得一提的是，使用 TB14 版本的用户，依然念念不忘 TB8 版本的扩展视图，可以称之为弥补白板灵活度的天花板，只要梳理过白板上节点关系时，尝试过拖拽节点，就会意识到它的价值所在。&lt;/p&gt;

&lt;p&gt;TheBrain 的大纲视图，区别于 Roam Research 的大纲有一个很重要的点，它的连线，本质上是可活动的。连线可变更，所以灵活性高于子弹节点本身的移动。因此，TheBrain 更适合作为知识结构的持续迭代，在在不断梳理的过程中，断开链接，清理那些大脑自以为是的跳跃式联想。&lt;/p&gt;

&lt;p&gt;而另一方面，学海无涯生有涯，我只能关注我所能关注的，TheBrain 在帮助梳理个人目标领域（Areas）的同时，不断让自己意识到能力的范围。因为，搭建结构的同时也是在塑造知识的边界，你需要积累更有限，但是更有用的知识卡片。&lt;/p&gt;

&lt;h2 id=&quot;后续可能的拖更计划&quot;&gt;后续（可能的🙈）拖更计划&lt;/h2&gt;
</description>
      </item>
    
      <item>
        <title>【番外】Roam Research 数据备份与共享：本地联动 Hookmark、DEVONthink、Obsidian 等笔记工具</title>
        <link>https://blog.jimmylv.info/2023-06-12-%E7%95%AA%E5%A4%96-roam-research-%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E5%85%B1%E4%BA%AB-%E6%9C%AC%E5%9C%B0%E8%81%94%E5%8A%A8-hookmark-devonthink-obsidian-%E7%AD%89%E7%AC%94%E8%AE%B0%E5%B7%A5%E5%85%B7/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2023-06-12-%E7%95%AA%E5%A4%96-roam-research-%E6%95%B0%E6%8D%AE%E5%A4%87%E4%BB%BD%E4%B8%8E%E5%85%B1%E4%BA%AB-%E6%9C%AC%E5%9C%B0%E8%81%94%E5%8A%A8-hookmark-devonthink-obsidian-%E7%AD%89%E7%AC%94%E8%AE%B0%E5%B7%A5%E5%85%B7/</guid>
        <pubDate>Mon, 12 Jun 2023 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/75924e4f0a2426c556042c07657bd381.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;bibigpt-ai-摘要&quot;&gt;BibiGPT AI 摘要&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://b.jimmylv.cn/video/BV168411Z71m&quot;&gt;【漫游生产力】Roam Research 数据安全与备份 &lt;/a&gt;，这个视频介绍了如何对Roam Research进行数据安全备份，并支持联动 Hookmark、DEVONthink、Obsidian、Logseq 等本地工具。&lt;/p&gt;

&lt;h2 id=&quot;精华亮点&quot;&gt;精华亮点&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;🔑作为卡片盒，Roam Research的数据安全备份非常重要。&lt;/li&gt;
  &lt;li&gt;📁每天对当天的直播进行回顾和复盘，思考迭代改进。&lt;/li&gt;
  &lt;li&gt;☁️在云端对笔记内容进行备份，GitHub Action简单易用。&lt;/li&gt;
  &lt;li&gt;🌉本地双向链接和备份，数据安全和同步有保障。&lt;/li&gt;
  &lt;li&gt;🚀使用Hook、DEVONthink、Obsidian和Logseq等工具带来更多联动的可能性。
#BibiGPT &lt;a href=&quot;https://b.jimmylv.cn&quot;&gt;https://b.jimmylv.cn&lt;/a&gt; @吕立青_JimmyLv&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;0-直播复盘&quot;&gt;0. 直播复盘&lt;/h2&gt;
&lt;p&gt;大家晚上好，欢迎来到立青的直播间。这是一个21天的Roam Productivity直播挑战，我会逐一介绍Roam Research的使用方式和我的一些心得。&lt;/p&gt;

&lt;p&gt;昨天我们讲了Roam Research的登录注册以及一些样式优化和插件等等。今天我们继续讲数据安全的重要性，作为你的笔记软件、第二大脑和卡片盒，Roam Research需要合理地规划笔记数据的备份。&lt;/p&gt;

&lt;p&gt;每天直播结束后，我都会回顾当天的内容。这是一个简单的框架，分为well、less well和suggestion。我会在群里征求大家的意见，如果有听众朋友对整场直播或我以往的B站视频有任何反馈，都可以在评论区留言。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/3583372e31bbdc84a6d04c1bc3766bc5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;首先，让我们来看看well的部分。其实昨天是第零天，今天才是正式开始。昨天勇敢地迈出了第一步，期待我能坚持21天。&lt;/p&gt;

&lt;p&gt;另一个是我剪出了视频，昨天大家可以在B站上观看。剪辑的工作流是我不断优化过的，因为如果我直接手动剪辑，会非常痛苦。直播大概一小时15分钟左右，最终成品只有40分钟左右。这中间的空白部分是工具自动剪辑掉的，我使用的工具可以识别口癖等，大大提高了剪辑速度。因此，在昨天晚上，也就是今天凌晨，大家能够看到昨天直播的回放视频。这不仅仅是一个回放，我把视频里的空白或冗余部分全部剪掉，这样录播比直播更棒。直播的好处是你可以直接给我反馈，然后我可以针对性地回答问题。&lt;/p&gt;

&lt;p&gt;在“less well”方面，第一个是未直播视频号。我原本想同步直播，但发现验证之后它竟然无法开播。另外一个问题是在剪辑视频时我的IDE没有关闭，占据了大量内存，导致视频卡顿。今天我会注意这个问题。昨天我发现有一段录屏，在我实际操作演示时并没有展现出来，会让听众感到奇怪，今天我已经修正了这个问题。&lt;/p&gt;

&lt;p&gt;昨天的直播确实也超时了15分钟，这个15分钟在当时直播的时候并没有太大感觉，但大家可以想象一下，我每多录10分钟，背后的剪辑时间也会成倍增加。直播时长越长，剪辑视频时长就越长，也就意味着今后我还会将视频转成文字稿，那么文字稿也会变得更长，这其实是有连带作用的。&lt;/p&gt;

&lt;p&gt;最后是“suggestion”建议方面，我会及时收集群友和听众们的反馈，当然我也会在自己的视频中学习。来自群友的一个视角是，对于小白用户来说，大家都还不熟悉Roam Research，所以我应该更多地从用户的角度考虑，应该怎样介绍Roam Research，以及如何把每一堂课的范围缩小到更小。比方说，昨天就超纲讲了一些内容，比如roam/css和roam/js等。&lt;/p&gt;

&lt;p&gt;总之，每天持续不断地迭代，基于上一天的反馈进行改进，从而每天这小小的5分钟可能会让我在21天之后变得更加流畅，或者成为一个熟练的直播 Up 主。&lt;/p&gt;

&lt;h2 id=&quot;1-本地备份-local-graph&quot;&gt;1. 本地备份 Local Graph&lt;/h2&gt;
&lt;p&gt;今天的主题是备份。昨天我们提到了offline模式，也就是我们有一个本地数据库，我直接新建了一个panda3 专门用来做演示。今天我想给大家讲的就是备份文件的后缀是edn，这个文件其实是每次保存在你的本地的，我们可以称之为第一层的备份。后面我还会讲到云端备份，以及如何联动其他的工具软件，甚至还能够共享发布，借助于AI对话等等。&lt;/p&gt;

&lt;p&gt;另外，如果你把某一张图片直接拖入Roam Research的界面，比方说我现在就接上一张图，我通过一个拖拉拽的方式拖到这边，你看到它直接就上传了。它的速度其实比我们使用网页版要快得多得多。我们可以看一下它的路径是什么。它的路径其实是一个本地路径。我们可以通过审查元素的方式查看图片的具体位置。我们可以看到它实际上是Roam Research在本地启动了一个localhost 3333端口的本地静态资源服务器，从而我们可以通过连接的方式直接访问到这张图片。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/f45ff121b98b471e05c04203caab3274.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;相对应的，如果我们打开Roam Research并且拖入一个PDF，比方说我们直接拖入这本PDF《架构之美》，我们可以看到它也是正常显示的。我们还可以对它进行标注，不过等到之后再来做具体的讲解。我们可以首先看一下，它同样是一个类似的路径。如果我们把这个路径直接复制，替换刚刚我们图片的路径，你可以看到，它同样能够正常打开，并且能够显示对应的目录等等。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/c9d85d7ce63b0dc8958f6c1d7b8e428a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这就意味着，如果我们可以再试一下，再拖入一张图片，速度非常快。那么我们可以得出一个推论，这些图片绝对是存储在本地的某个位置的。注意，我们在右上角选择导出，然后查看对应的备份的时候，就可以直接打开本地文件的相应路径。而这个路径里面，其实就已经包括了刚刚自动备份的每一个edn文件。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/6d2bf2076763a766a465a92716c527a9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;相应的，我们可以查看图片上传所对应的一个文件夹，文件路径叫做 local-graph-uploads 。你可以看到里面有对应的几个本地文件的路径。你可以看到我的pandas3，也就是刚刚上传的这些文件，都被存储到了这里。这两个MP4文件是成功了的，只是可能由于UI卡顿，它没有做显示。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/24e7712dc373907ef6654c91a8bb5aa4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;通过演示，方便大家理解Roam Research本地文件的管理方式，从而可以做一些有趣的设置。&lt;/p&gt;

&lt;h2 id=&quot;11-一切皆文件联动-hookmark&quot;&gt;1.1 一切皆文件：联动 Hookmark&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/8e3c7420bac587070e860482640b08be.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;比如，我们可以做到一件有趣的事情：使用坚果云或其他工具，直接备份整个 uploads 文件夹。这样，你既备份了 backup 里面Graph的 edn 文件，又备份了所有图片的相关备份，包括 PDF、MP3、MP4 等等各种类型。你可以上传或拖拽到整个 graph 里面的内容。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/9891e91e3fbbd2a74cf6cb82425512e2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;另外，如果你在使用 Typora 写 Markdown 时不想操心图片的位置，可以把每次插入图片的路径修改成让 local-graph-uploads 这个文件夹。这是一个非常 tricky 的小技巧，但奇妙之处在于，比如在 Typora 这样的工具中，每次上传图片时，可以 copy 到某一个路径。我们可以选择 copy 到 Roam Research 对应的 graph 的路径，这样你所有的本地文件就是使用同一份了。这意味着我们可以在本地把所有内容通过文件的方式管理起来，直接把所有本地的内容全部连接到一起。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/342df77864a71923373367516952628b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;当然，我们也使用 Hookmark 把路径关联到 hook 中，然后可以通过 hook 直接在这边新建一个新的 Markdown 文件。这个 Markdown 文件与下面的 uploads 文件夹 hook 到一起，也就是说本地的文件相互链接。这样做的好处是，如果我做视频需要用到一些素材，我可以把截图直接拖入到 Roam Research，然后可以查看到对应的图片的路径。但这个路径，它是发生在对应的位置，我并不知道它实际的路径是什么。我们可以用 hook 直接生成一个 Markdown 的 URL，然后贴回到这个位置。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/540182d2cb96517c8e5f702f51f57a16.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;当然，最理想的情况下是，如果 hook 能够直接把这个链接变成一个图片的链接，它也能正常显示的话，那就是终极目标了。现在我们可以通过这种方式，把所有的文件链接起来。当我直接在这边按下快捷键 q ，就可以直接打开对应的图片了。&lt;/p&gt;

&lt;p&gt;这些文件，我们可以在本地把所有的文件都整理和 hook 到一起。所以我们可以在系统级实现双向链接，就是这个文件夹和文件 Markdown 文件相互链接。我也可以从这个文件直接跳回到对应的文件夹，在 Roam Research 里面又可以直接跳转到 TheBrain 里面某一个对应的知识点。&lt;/p&gt;

&lt;p&gt;这是一个稍微有点炫技的演示，但是终究是想让大家理解一下，如果你做了全部的本地化之后，你的数据安全或备份就能够做到极致。你可以把这些文件进行云盘的备份，或者定期转移到磁盘，或者上传到 GitHub 等云端的位置。&lt;/p&gt;

&lt;p&gt;另外，每一个 Graph 自动备份的 edn 文件实际上是 ClojureScript 的一个特有的格式，但是实质上跟一个 JSON 的格式差不太多。如果你想在本地做格式的转换，可以通过一些脚本，直接把它变成 Markdown 或者是可读的一些格式。&lt;/p&gt;

&lt;h2 id=&quot;2-云端备份-github-action&quot;&gt;2. 云端备份 GitHub Action&lt;/h2&gt;
&lt;p&gt;讲完本地备份，让我们再使用一种更轻松、更简单的方式进行云端备份，可以让我通过云端备份获得所有markdown文件并存储至本地。&lt;/p&gt;

&lt;p&gt;具体实现方法在这个代码库： &lt;a href=&quot;https://github.com/JimmyLv/roam2github-actions/actions&quot;&gt;https://github.com/JimmyLv/roam2github-actions/actions &lt;/a&gt;我基于国外网友的一个项目进行了一些改造，使其支持了图片备份。但是如果要做到极致，可以参考群友的另一个项目，叫做RoamFilebaseBackup。&lt;/p&gt;

&lt;p&gt;首先，我可以创建一个Github Action，自动备份markdown文件。这个markdown文件存储在我的私有库中。这里的Action是一个public的仓库。这里有一个Action脚本，它每两个小时会对我的所有Roam Research内容进行导出。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/9fd3555d769ab17c9161545431a56c22.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这个导出脚本实际上是在模拟我们在网页端的鼠标、键盘操作。比如，我们可以手动操作一下，点击”export”，然后在导出时选择edn文件，导出到任意的位置。而这个脚本其实做的事情是一样的。&lt;/p&gt;

&lt;p&gt;你可以看到我的仓库 GitHub Action中有一个Roam Backup的脚本，这里面其实就是模拟了一些具体的click操作，比方说它click extracting或者是formatting，你可以看到它其实下载了Roam Research的一个zip文件，然后把这个文件进行提取，提取之后，把这里的 EDN 文件进行了格式化，导出成Markdown 文件。&lt;/p&gt;

&lt;h2 id=&quot;3-联动devonthink-其他笔记工具&quot;&gt;3. 联动DEVONthink &amp;amp;其他笔记工具&lt;/h2&gt;
&lt;p&gt;导出完成后，你就可以在我的仓库中看到一个名为Roam Backup的文件夹。这个文件夹中存储了我所有的EDN文件、JSON文件和Markdown文件。你可以简单地打开它们，就可以看到所有关于我的文件都存储在这里，包括Daily Note、Project以及我执行的项目或者一些关键的页面等等。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/1bf002453d84d20a05da0574d47dd9de.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;通过备份Markdown文件到GitHub之后，接着可以使用脚本通过 git pull 的方式将GitHub的Git仓库拉取到本地。我们可以在本地通过Obsidian直接打开这样一个文件夹。所有Markdown文件都可以被Obsidian直接预览。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/266f9c508b2e0987b9ce8cbfbdb2d793.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;当然，使用DEVONthink也可以打开这些文件，可以直接在DEVONthink里面进行预览。速度非常之快，因为它是纯本地化的。如果没有使用DEVONthink，我们也可以直接在Markdown里面打开Obsidian。通过打开Obsidian，然后选择对应的仓库，在左上角选择对应的备份的文件夹，就可以在这里直接打开预览它了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/71a56f4d972f44f6355d4366e3efe796.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;备份好的 Markdown 文件也可以通过Alfred的快速查找的功能查找。在本地使用Typora打开也很方便。所以，我们可以基于本地文件直接预览Roam Research里面的所有内容。一旦文件化之后，一切皆文件，我们就可以使用任意的软件或工具去打开它。&lt;/p&gt;

&lt;p&gt;那么在这个时候，我们会有一个疑问：这个文件是怎么自动同步到本地的Obsidian呢？&lt;/p&gt;

&lt;h2 id=&quot;31-xbar-自动拉取-github-仓库&quot;&gt;3.1 xbar 自动拉取 GitHub 仓库&lt;/h2&gt;
&lt;p&gt;比如，在 Roam Research 中写好内容后，我们怎样直接将其拉取到本地呢？下面来介绍一下 Xbar 工具。它是一个菜单栏工具，可以自定义菜单栏功能。例如 Xbar 在每个功能菜单中，可以选择性输出一个字符或者图标，图标对应的就是设置好的插件，用于执行脚本。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/22d0ede2cecdf0598ce9730140a31ccb.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;打开 Xbar 插件浏览器，里面包含了各种脚本。备份所用的脚本是 Roam Research 的 GitHub 仓库的 git pull 自动拉取功能，自动将其拉取到本地文件夹。例如，定期将 Roam Backup 文件夹进行本地拉取。可以通过点击每 30 分钟这样的方式设置执行频率。设置好后，它就会每 30 分钟执行脚本。这样，我们就能定期将文件从 GitHub 拉取到本地文件夹，然后可以在 Obsidian 或 DEVONthink 中打开，甚至还可以在 Logseq 中打开。&lt;/p&gt;

&lt;h2 id=&quot;4-共享发布集体智慧&quot;&gt;4. 共享发布：集体智慧&lt;/h2&gt;
&lt;p&gt;最后，我们还可以使用Logseq将Roam Research中的某些页面发布到线上。Logseq能够实现数字花园的概念，你可以将大量笔记导出为HTML格式，然后使用Logseq获得双向数字花园的感觉。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/687b80637ac855fae57ff5d124df45af.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我甚至对页面滚动进行了优化处理，使其横向展开，这样我们就可以横向滚动查看相应的内容。我们可以一次性打开多个内容，横向查看每个内容下面的内容和链接的引用。总之，这样我们就有了数字花园的笔记空间。当然，Logseq的知识图谱也可以正常显示。每次切换时，它都会展示更细致的图表。&lt;/p&gt;

&lt;p&gt;当我们在云端备份Roam Research的内容并将其同步到本地时，甚至将本地文件发布到云端时，我们就拥有了一个公开的数字花园。信息和卡片笔记都在不断地流转。当然，这纯粹是从技术层面解决问题，我们不应该过度关注这些技术细节，而是应该思考这些技术如何帮助我们更好地分享和沉淀笔记。关于这些内容，我将在后面的直播课程中详细讲解。&lt;/p&gt;

&lt;p&gt;我们之前也在实践中尝试过共同编辑 &lt;a href=&quot;https://jimmylv.gitbook.io/roamcn/&quot;&gt;#RoamCN Graph &lt;/a&gt;并共享同一份公共图谱或知识库。我之前还尝试过将其发布到Github上。我们整理了很多 Roam Research 教程和插件，只不过大部分信息可能已经过时了，所以接下来有可能重新启动这个计划。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/a2af3d589d1b3b1c4c05b4f5f5a9e491.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;关键点在于，我们可以在 GitBook 页面的右上角使用搜索按钮，通过AI进行智能问答。我们可以问一下“Roam Research周报是什么”，就会看到它下面出现了很多感兴趣的内容。我们还可以点击“什么是Roam Research”，让它智能回答。我们希望构建一个公共的知识库，对于小白用户来说，可以直接提问，人工智能会汇总相关的知识点，然后给出一个非常简要的答案。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/80f5688f6e1d83f70594f55a94718ba9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;彩蛋bibigpt-例行节目&quot;&gt;彩蛋：BibiGPT 例行节目&lt;/h2&gt;
&lt;p&gt;好了，今天的内容到这里就结束了。总结一下，我们还介绍了Roam Research备份的Markdown文件如何与DEVONthink、Obsidian和Logseq进行联动，并介绍了Xbar这个工具，它可以帮助我们快速地将文件拉到本地或发布Logseq的数字花园。虽然在技术层面上比较复杂，但是通过直播已经有了基本的视频素材，后面只需要把我要讲述的逻辑串联起来就好了。希望我们可以共同建立一个笔记工具的集体数字花园。&lt;/p&gt;

&lt;p&gt;最后一个惊喜，我想跟大家一起回顾 BibiGPT 里每天最热门的视频。在 BibiGPT 里，我做了一个最热门视频的总结，每天都会有一个往期最热的总结。BibiGPT 还统计了全站整体最热门的视频，也就是总共被总结了1000多次、几千次的总排行榜，包括之前 GPT-4 的视频或者是我讲解 BibiGPT 的视频。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/e4ce376e22b7f00aae9031c57609f33a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;大家还可以通过 &lt;a href=&quot;https://b.jimmylv.cn/popular/rss.xml&quot;&gt;订阅 BibiGPT RSS &lt;/a&gt;，查看每一期的最热门视频来获取最新更新。例如，我们可以看看昨天 6 月 5 日的热门视频，查看哪些视频在昨天的总结中次数最多。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/48f7a73013ac188b9de88eac54b9c15f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;第二个视频讲解立体几何的四大模型，以及与之相关的几何问题。讲解了高考的立体几何，也提到了立体几何里面可以借助具体的四大模型，然后衍生出来的几何题目，在理解题目来源的基础上，对外接球球心的计算。所以，我们可以直接点进去，看具体的内容。我怀疑它这里的字幕，应该是有一些不对的。所以，它的识别应该是有一些错误的。我们可以回顾一下，它的这个视频的字幕。你也可以看到思维导图了，但是对于我们想看的内容，我们还可以针对性地提出自己的问题。比方说，明天就高考了，在这里也预祝一下高考的朋友们能够顺利取得好的分数，虽然我的观众们不可能还会参加高考。&lt;/p&gt;

&lt;p&gt;那我们随便来问一下，明天就要高考了，请告诉我最需要记忆的立体几何模型吧。这个其实就是演示说，针对于你感兴趣的知识源，你可以直接向视频进行提问。BibiGPT AI 会自动根据你所提出的问题来对内容进行解答。它得出了一个相对来说比较完整的一个答案。我们还可以直接点击出处，跳转到对应的位置。你可以看到 24 分 28 秒的时候，它讲述的内容其实就包括追的外界球问题或者是集合体的外界球等等。我们可以直接从这个位置来对想看的内容进行跳转。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/12aee6d9fda05e2d7366f8f4b416a40b.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如果我们在明天就要高考了，我们最需要记忆的模型是特殊集合体，比方说长方体、正方体、长角体等等，然后研究集合体的外周、外界球问题，我们要确定集合体的特殊图形，然后集中对应的模型。如果遇到有很多直角的锥，可以往长方体方向去补，在考试中如果遇到了正方形 ABCD，我们需要去搞清楚它是什么样的特殊集合体，一般算出它的长度和角度后就可以知道它是由什么样的集合体衍生出来的。它甚至还提到了，如果还有不确定的地方，可以参考模拟题和高考题。&lt;/p&gt;

&lt;p&gt;第三个是我不了解的领域，但它是 Blender 3D 建模 0 基础入门公开课程的一部分。视频长度为16分53秒，被浓缩成了一个简短的概述，介绍了 Blender 界面的基本操作和场景对象的快捷操作。它还包括一些亮点，例如如何操作鼠标、如何使用快捷键和小键盘数字以及如何演示具体场景。这是全 B 厂最用心的 Blender 3D 建模 0 基础入门开发课程。&lt;/p&gt;

&lt;p&gt;让我们继续回顾一下当天的热门视频。其实我还是比较好奇，大家在平台上会去看哪些各种各样的视频的。比方说，这里第三个视频是通胀率全球第一的黎巴嫩，到底是什么样的视频，有 21 次的总结。这里提到黎巴嫩通胀率居全球第一，达到了 269%。可能是因为基督教和穆斯林之间的宗教平衡非常脆弱。下面也会给到一些 highlight，也就是亮点。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/e3d42ae968ee3de36beca368e611512d.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在 BibiGPT 重新生成总结有个小 tips，我稍微改一下这里的句子长短，因为不然的话，他会用之前的缓存，这个缓存其实是骗了。所以我们就修改一下句子的长短，让他重新生成一个我们想要看到的更准确的摘要。&lt;/p&gt;

&lt;p&gt;好，我们就过下一个视频。下一个视频又讲到了荧光定量的 PCR 原理与分析方法。这个是我可能完全不懂的领域了。还有一个就是，当离开大厂后该如何创业，具体是来自于沈帅波的采访。这边也提到了一些视频当中的亮点。第 6 个视频是讲的南洋和襄阳的经济发展差距，抖音和微信在社交领域的竞争，京东与当当签订战略合作协议等等。最后一个是关于军事的一个合集。&lt;/p&gt;

&lt;h2 id=&quot;bibigpt-重新兼容-apikey--open-api-的规划&quot;&gt;BibiGPT 重新兼容 apikey &amp;amp; Open API 的规划&lt;/h2&gt;
&lt;p&gt;目前我是重新兼容了使用自己的 API Key 的功能，所以当你有自己的 API Key 的话，你可以直接填到这里的展开的输入框当中，然后点击保存。注意不要点击激活，激活的是我在平台上售卖的 license key，这其实是一种老的方式，我会考虑把它直接弃掉。目前购买市场是直接可以自动充值的，不用填写任何的 license key。&lt;/p&gt;

&lt;p&gt;但是如果你有自己的 OpenAI sk-xxxxx 的 apikey 的话，你可以直接填到这儿，就可以直接使用了。目前是不收费、免费使用的，不过由于之前有人在恶意的爬我的接口，所以做了每天 20 次的一个限制。如果你有遇到了，可以直接跟我私信。也是为了防止服务器资源被滥用。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/dfd1f120dec90d5308c809ba71ed2c84.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这位朋友提到了，能不能通过离线API来使用网页。其实，我是有想做一个功能的，就是对于每个用户，会生成一个自定义的open API。比方说， /open/summarize ，然后summarize比方说你可以加上URL等于一个网页，但这个接口现在还没有。我只是示例这个意思，然后通过这样一个URL，每个用户都会有一个独一无二的URL。&lt;/p&gt;

&lt;p&gt;比方说对于我自己来说， /open/summarize/123 ，通过这样一个路径，你就可以直接访问到对应的阶层数据，也就是总结后的结果。之后每一位用户都可以有自己的一个独立的API，所以你可以有很多好玩的地方，比方说你可以通过Alfred直接通过比方说BB加入一个B站或YouTube的链接，你就可以直接通过API的方式调用到整个网站的一个内容。&lt;/p&gt;

&lt;p&gt;从而每个用户都会有自己的一个独立的Open API的一个URL，然后后面加上URL，比方说是B站的一个链接或者是网页的一个链接，你就可以获得这样一个总结的结果，甚至包括字幕的列表等等。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-12/81/d0c8f6e912e09673cac5312e8f6558a5.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;有了这样的方式之后，好玩的地方还很多，比方说你可以批量总结的N个视频，或者是你可以跟你的笔记软件直接集成，比如可以在Roam Research直接通过一种方式，比方说通过 bb 快捷触发一个弹窗，加上一个链接，然后我们就可以直接在下方获得这个视频的总结，这样我们就可以直接在不离开笔记软件的同时来调用总结的接口。所以，这是之后我必须要实现的一个功能，也请大家敬请期待啦。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;那么，今天的视频就到这里了。算是完成了我所有想讲的内容。虽然一路上还是有些磕磕碰碰，但是很开心大家陪我度过了过去的一小时26分钟。非常非常感谢！如果有不好的地方，确实也是因为真的没有准备，我都是在之前大概半小时开始做PPT。但在前期，还是会在脑子里不断地去过一些我要讲的内容了。&lt;/p&gt;

&lt;p&gt;总之，这是我想逼自己的一种创作方式，就是我直接把我要创作的内容通过直播的方式讲出来，并且立下了公开的flag，21天我不坚持也不行。&lt;/p&gt;

&lt;p&gt;所以，我们就来看看在每天的这种反思和迭代当中，会不会让我的直播变得更加顺畅。所以之后应该会变得越来越好的，至少这一点上还是比较有信心的。&lt;/p&gt;

&lt;p&gt;好，那么今天的视频就到这里了，我们明天再见。明天还是同一时间8点到9点，坚持21天直播挑战，咱们下期再见。拜拜。&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>ch0 正式使用 Roam Research 之前</title>
        <link>https://blog.jimmylv.info/2023-06-07-ch0-%E6%AD%A3%E5%BC%8F%E4%BD%BF%E7%94%A8-roam-research-%E4%B9%8B%E5%89%8D/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2023-06-07-ch0-%E6%AD%A3%E5%BC%8F%E4%BD%BF%E7%94%A8-roam-research-%E4%B9%8B%E5%89%8D/</guid>
        <pubDate>Wed, 07 Jun 2023 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/013344212111b6c6734076dddb8f2fe2.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;bibigptai-总结视频文章&quot;&gt;【BibiGPT】AI 总结视频/文章&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://b.jimmylv.cn/video/BV1Uk4y1H7cr&quot;&gt;【Roam 漫游生产力】ch0 正式使用 Roam Research 之前 &lt;/a&gt;，本视频分享了Roam Research这款笔记工具的使用，并介绍了如何利用该工具提高效率。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;亮点 Highlights&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;📝 Roam Research是一款极简的笔记工具，适合归纳整理各类知识&lt;/li&gt;
  &lt;li&gt;💡 使用Roam Research之前需要了解的基础概念和主题、插件&lt;/li&gt;
  &lt;li&gt;🎨 可以通过各种插件和主题自定义Roam Research的界面外观&lt;/li&gt;
  &lt;li&gt;✍️ 挑战21天每天直播输出的习惯，提高自己的知识创作工作流效率&lt;/li&gt;
  &lt;li&gt;🤝 通过直播快速输出草稿，可以获得新的反馈和灵感，从而不断完善创作流程
#BibiGPT AI 学习助理 &lt;a href=&quot;https://b.jimmylv.cn&quot;&gt;https://b.jimmylv.cn&lt;/a&gt;&lt;a href=&quot;https://b.jimmylv.cn/&quot;&gt; &lt;/a&gt;@吕立青_JimmyLv&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;0-缘起&quot;&gt;0. 缘起&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/5d4969bd51c598d4f812672f73f58c26.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;大家好，欢迎来到立青的直播间。今天我要开始21天的直播挑战，主题是Roam Productivity（漫游生产力）。&lt;/p&gt;

&lt;p&gt;Roam是Roam Research这款笔记工具的简称，也意味着漫游。对于像我这样注意力不集中的人来说，这个词非常贴切。我们常常在不同的工具之间漫游，或者把工具当成玩具，而不是追求效率。&lt;/p&gt;

&lt;p&gt;例如，有朋友问我为什么不用Tana，但对于我来说现在的Tana只是一款非常厉害的玩具，每天都在刺激着我，给我许多灵感和感官上的刺激。&lt;/p&gt;

&lt;p&gt;但是Roam Research不同，我今天在群里跟大家开玩笑说“梦回2019”，其实是在说2019年Roam Research长什么样子。现在Roam Research依然是长这个样子，4年的稳定不变让它成为了最好用的工具，因为稳定才是工具的最大价值。&lt;/p&gt;

&lt;p&gt;因此，今天是21天挑战的第0天，第0章。在正式使用Roam Research之前，我希望讲解一下为什么Roam Research是最好用的工具，为什么我要在Roam Research里重新设置我的卢曼卡片盒。我会讲到Roam Research的一些非常基础的东西，比如注册登录。当然，这里会有一些非常不一样的技巧和经验，包括使用时如何具体去搭建对应的主题和插件。&lt;/p&gt;

&lt;p&gt;当我们把笔记工具作为我们的第二大脑或者是我们的卡片盒。它的数据安全非常重要，甚至应该放在第一优先级上。需要考虑的事情，也就是我们如何做好备份，备份应该分等级来进行部署。第三最后一个则是，我一系列直播当中会有持续不断的一个彩蛋，那么就敬请期待了。好，那么非常感谢大家的到来，那么我们就正式进入正题。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/89d58909fdd97a8b89351e89c84ff30f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;01-依然选择-roam-research&quot;&gt;0.1 依然选择 Roam Research&lt;/h2&gt;
&lt;p&gt;首先，我想谈谈这个系列直播的缘起。我在制作一个Notion AI的视频课程，并在过程中持续一个月的纠结、拖延、后悔焦虑等等真实的情绪。这让我意识到，如果一个人憋着写东西，做视频是非常痛苦的，且很难让我直接把它做出来。因此，我想「越痛苦的事情越要早做，越痛苦的事情越要频繁做」。我当时在看《持续交付》这本书时，一位软件开发前辈告诉我们，这就像持续集成和持续部署的原则，如果只需要记住一句话，那就是这句话：「越痛苦的事情越要早做」。&lt;/p&gt;

&lt;p&gt;持续集成是将你本地的代码持续不断地与主干分支，也就是线上的代码进行集成，以便提前发现问题。持续部署是将你的生产代码持续不断地部署到线上环境。这个过程是非常痛苦的。如果你手动部署过你的代码，你就会发现你需要去搭环境，需要准备各种各样的依赖等等。千万不要等到你要上线的前一天才去做这样的事情。我们应该提前去做持续集成、持续部署，这就意味着我们要从第一天，从第一行代码的时候，就应该把你的生产环境准备好，通过持续集成的方式，让你每写的一条新代码都能够发布到线上环境。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/c04951415bfcf149f769cf275c2c2c8e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;目前这种非常痛苦的创作流程是我急剧想要解决的问题。我想从第 1 天，甚至是第 0 天，也就是今天这样一个试验的直播当中来分享我想要分享的东西。&lt;/p&gt;

&lt;p&gt;Roam Research是我在2022年筹划要做的一个系列课程。但是由于各种原因，我一直没有输出我想要输出的内容。所以今天的第一个主题是，重新设置我的卢曼笔记卡片盒，而我的卡片盒工具依然选择使用Roam Research。&lt;/p&gt;

&lt;p&gt;我已经写好了前两章，但由于各种原因，自己不断的拖延、懊悔等等，终究没有完成这样一个事情。具体为什么2023年到来了，我仍在使用Roam Research，而市面上有各种仿效者，如Obsidian、Logseq、Tana等等，以及我提到了AI的崛起等等，这其实都有进一步的思考。我一直在思考这些可视化白板，以及笔记工具与AI的结果给我们带来的价值。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/e80a1c23f1b4f140c6245d277119fcd7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;最重要的是如何笔记工具构建卢曼卡片盒，而笔记工具远比卡片盒的概念边界要小得多，因为我们真正想要的是卡片盒这样一个能够持续沟通的朋友，支援未来的自己。&lt;/p&gt;

&lt;p&gt;我会在后面的系列直播中讲解「卡片盒」这个重要的概念。&lt;/p&gt;

&lt;h2 id=&quot;02-快速输出-roam-直播系列的大纲&quot;&gt;0.2 快速输出 Roam 直播系列的大纲&lt;/h2&gt;
&lt;p&gt;顺便说一下，我使用Roam Research快速地写出PPT大纲，导出并转换为Keynote。这个流程对我来说很快速，也非常适合知识创作。之后我会分享这个流程，这样我们只需要在Roam Research里写内容，不用再关心格式或PPT样式等问题。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/8909e213b84782bebefe4869512ce52f.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;iA Writer最近发布了一款非常好用的产品，叫做iA Presenter。它可以快速生成各种好看的PPT主题，让你专注于内容本身。如果你使用Roam Research，可以通过风暴、大纲整理、导出Markdown，再转成Keynote的方式来实现同样的理念。iA Presenter具有很高的灵活性，可以通过大标题、小标题或分割符的方式快速将文章转化为PPT，也可以通过Markdown语法快速插入图片。在后续的直播中，我们会详细介绍这个工具。尽管我个人不熟悉这样的开发创作工具，但我之前已经实践了一整套东西。iA Presenter用户体验确实做得非常好，例如它对于自适应处理图片的功能就非常棒。iA Presenter还有演示模式和多种导出方式，包括导出PDF和导出PPT。如果需要二次修改，可以使用iA Presenter导出PPT来进行迭代，这样至少可以在初期专注于你的内容。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/00158cb6239c92c90b35b2eeaba90fcc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;对于我来说，在前期我已经把这个直播大纲做了一个完整的展示，包括第一部分讲的工具基础，也就是我分成了 ABC 三种知识类型（工具A/理论B/场景C 应用+元知识）。&lt;/p&gt;

&lt;p&gt;首先，A 代表工具基础，在第一部分我会主要讲述工具的一些基础，比如让你设计的每日笔记，双向链接，页引用，块引用（block template），以及 query 和 filter 等等这些基础概念。然后在第二部分，我会讲到卡片盒笔记法或者是管理看板等等这样的一些理论，也就是 B+A 理论，结合具体的工具基础来进行具体的讲解。&lt;/p&gt;

&lt;p&gt;对于第三部分，会引入 C 的部分，也就是具体的场景，因为我们不管学习、输出或者说使用工具，都需要具体的场景，也就是我们真正要去干活。你不能只是磨刀而不干活，所以我们就会在具体的场景当中，比如在阅读笔记的时候，或者是写作输出的时候，或者是你在晨间日记的时候，讲解如何利用工具来做具体的实践。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/0c1b5f50b95e989effb86dffd54efeb0.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;对于这些大纲中的内容，我会以每天一次的直播方式进行输出。我在直播的时候不会有太多的废话，你可以看到我有很多停顿，但是我一定是想好了才会说出这样一句话。所以我可以在后期剪辑时，通过工具很方便地把空白无声部分直接剪辑掉，而且通过 BibiGPT 可以非常快速地整理出文章或者视频的概要，以及我可以非常快速地把我的文字稿转成能够阅读的图文，图片来自于我的视频，具体的文字就来自于视频稿。这个在我之前的群里也有小量的分享。&lt;/p&gt;

&lt;h2 id=&quot;正式使用-roam-research-之前&quot;&gt;正式使用 Roam Research 之前&lt;/h2&gt;

&lt;h2 id=&quot;roam-注册登录&quot;&gt;Roam 注册/登录&lt;/h2&gt;
&lt;p&gt;现在我们进入第一部分，也就是Roam Research最基础的部分：注册、登录以及我们会重点讲的主题和插件等等。我今天会完整地把我的重新搭建的方式给大家演示一遍，因为大家现在看到的是我已经设置好的，包括各种各样的快捷键，包括各种各样的主题等等。Roam Research 默认的主题也不太好看。&lt;/p&gt;

&lt;p&gt;在第二部分中，我将重新设置Roam Research卡片盒。我在这里创建了很多内容，可以重新打开它。首先，我想分享一个非常巧妙的小技巧，当我的邮箱不够用时怎么办。最简单的一个办法是在邮箱的后面加上一个加号，再加上任意的数字，比如1234等等。我之前用过加 &lt;a href=&quot;https://mailto:jimmy.jinglv@gmail.com&quot;&gt;jimmy.jinglv+1@gmail.com &lt;/a&gt;，所以我在这里使用 &lt;a href=&quot;https://mailto:jimmy.jinglv@gmail.com&quot;&gt;jimmy.jinglv+2@gmail.com &lt;/a&gt;。我们将创建一个新的帐户，然后单击注册。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/658750b0f13c4b063eacbb6c4d8a561c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;初次进入 Roam Research 的界面，你需要单击试用才能正式进入笔记页面，必须填写信用卡信息才能进入。可以先绑定你的信用卡。在31天结束之前，我们可以取消具体的信用卡。&lt;/p&gt;

&lt;p&gt;另外，我再教大家一个小的绕过方法，就是我们可以直接在开发者工具的 console 中输入 location.href = “ &lt;a href=&quot;https://roamresearch.com/#/offline/Panda&quot;&gt;https://roamresearch.com/#/offline/Panda&lt;/a&gt; “ ，就可以在本地创建一个 Graph。&lt;/p&gt;

&lt;p&gt;由于之前我在本地存在同名的 Graph，因此它失败了。让我现在使用的是 Panda3，这是一个新的 Graph 的名称。我们可以直接进入，而且它是免费的。因此，当我们第一次进入本地 Graph 时，需要设置备份地址。对于备份地址，我们可以随意选择。你可以选择每天或每小时进行备份，或者你也可以在本地文件中查看具体的备份文件。但是，由于我之前使用的是 Panda，所以它失效了，不能正确跳转。我刚刚改成了 location.href = “ &lt;a href=&quot;https://roamresearch.com/#/offline/Panda&quot;&gt;https://roamresearch.com/#/offline/Panda&lt;/a&gt; 3” ，它就可以正确进入了。&lt;/p&gt;

&lt;h2 id=&quot;最佳主题插件-roam-studio&quot;&gt;最佳主题插件 Roam Studio&lt;/h2&gt;
&lt;p&gt;打开 Roam Research 界面后，你会发现与我之前展示的主题样式有很大的不同。所以我们进入第二阶段，重新设置主题和内容。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/00bac751750da97d70df464a47e6899a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;为了 1:1 还原它，我需要登录我之前在 Safari 上的账户。有一个小技巧，当迁移内容时，可以先建立一个测试的 Graph。这样，当你把所有的插件和主题都迁移好后，我们可以再次在你的崭新的 Graph 里面进行设置。因为这样可以避免很多冗余的操作。比如，当你遇到了问题，不小心把你整个 Graph 的数据搞没了，那么其实是得不偿失的。&lt;/p&gt;

&lt;p&gt;因此，在设置完这个内容后，你可以在自己的全新 Graph 里面去设置，这样既不会伤害你之前的一些笔记数据，也不会因这些数据束手束脚。这就像在软件开发中，我们在测试环境中使用一些模拟数据来进行提前测试一样。&lt;/p&gt;

&lt;h2 id=&quot;快速选择一个基础主题&quot;&gt;快速选择一个基础主题&lt;/h2&gt;
&lt;p&gt;如何设置非常好看的 Roam Research 主题呢？让我们进入具体的设置环节。首先我们要选择一个主题作为基础，然后在这个基础之上，我们再做一些选项上的配置。最推荐的是 Roam Studio 这个插件。而它的 Graph 主题是非常好的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/ea91aed59ce9271ce056dea31e2d4708.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;回到刚刚新建的 Graph，在左侧边栏看到这里有一个 Roam Depot 应用商店，我们可以在这里搜索 Roam Studio。直接点击下载即可。你会发现整个界面都发生了变化，并且支持黑暗主题。我们可以在这边打开设置，再点击 extension 的 setting。里面有 Roam Studio 的一个基础主题。基础主题对于我来说，我会选择这个 graph。但它最近也推出了一个叫 Things 主题，也就是非常好用的 GTD 工具 Things3 的一个主题。&lt;/p&gt;

&lt;p&gt;我还是直接还原到我正在用的 Craft 主题，并且，我更喜欢它的亮色的主题。右上角有一个按钮，你可以一点就是进行切换。它有三种模式，首先是月亮，也就是黑暗主题。还有一个新兴的方式是自动切换，因为你会根据系统级的黑暗主题的设置而自动变换。因为现在是晚上，所以它自动变成了黑色。我个人偏好白色主题，而 Roam Studio 的小细节非常多的，比如当我们输入 /today 或者是 /tomorrow，它会有一个小小的 icon，设置之后，日期图标也出现了，整个图标变得非常好看，它的背景颜色也有一些小小的变化。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/95f4aac224d3c147a462de0e18316d9e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;另外我会对它的标题进行一个设置，因为默认情况下，它的标题其实是差别不大的。我们可以通过 markdown 的方式来进行变化。你也可以按下快捷键，然后对它进行变化。其实二级标题和三级标题本质上没有太大的区别，只有大小的区别。如果你的内容非常多，其实这个差别就不大了。所以通常来说，我会把层级进行更明显的区分。这个也是在使用大纲笔记的时候，大家会常常忽略的一点。&lt;/p&gt;

&lt;p&gt;其实标题和大纲的层级都不宜过多，这可能也是 Roam Research 里面为什么只设计了三层层级的原因。我通常来说，会把一颗树形结构进行拍平。这也就意味着，当我们的思维不断的深入和发散之后，我们还是要回归到线性的表达，也就是通过一级标题、二级标题、三级标题以及 page 这个层级的东西来进行归纳整理。这个整理其实是逼迫自己能够不断去提炼知识和抽象知识的。&lt;/p&gt;

&lt;p&gt;相应的，我会把标题的颜色进行一个变化，一级标题我会改成蓝色，二级标题我会把它改成更浅的一个颜色，三级标题就不会去变动它了。这样的话就会变得更加清晰，但内容变多的时候，其实就会变得非常有用。比方说我们在今天的大纲当中，我就设计了一级标题和二级标题，这是非常基础的一些内容，但是其实是反映了我们如何使用工具的一个偏好。&lt;/p&gt;

&lt;h2 id=&quot;界面样式的配置选项&quot;&gt;界面样式的配置选项&lt;/h2&gt;
&lt;p&gt;首先，我会改变 Roam Research 界面上的主题图标。这是我开发前端 UI 时最喜欢的图标库之一。当你点击后，你会发现所有的图标都变了，更小的图标更讨喜。&lt;/p&gt;

&lt;p&gt;左上角和左下角的图标和入口也可以隐藏。例如，Graph 知识图谱中的双向链接对我来说是最没用的，所以为什么不隐藏它呢？我们可以在这里进行隐藏。我们可以滚动到最底部，它的可配置项非常多，包括每个块或标记的颜色，以及日期按钮等。它之前没有显示按钮的原因是我们需要手动开启。&lt;/p&gt;

&lt;p&gt;默认情况下，我们的搜索在最顶部，但这个入口非常碍眼，所以我经常把它移动到中间。我们可以用快捷键打开搜索内容，例如输入Roam Research，然后回到 Daily Notes，然后再通过 Shift 打开 [[Roam Research]] ，这样就会产生搜索侧边栏，它可以进行实时变化，例如搜索Roam，可以同时搜到 Roam Research 和 Roam Studio。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://jimmylv.feishu.cn/space/api/box/stream/download/asynccode/?code=YzJiZWI2OTRiNzIyY2E5MTY0YTIyOTdmOWYzMGI5ODdfUXc5QXBnaklhdllReUoyRkpsZlV6Y1FaWmtOZ1NacERfVG9rZW46UzlPR2JKRWdjbzk0R3N4VFh6WGNjeE13bmtlXzE2ODYxMDY1Mzk6MTY4NjExMDEzOV9WNA&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;除了 Roam Studio 这个主题插件以外，我还要介绍必备的一些插件，我们可以逐一进行设置。有了这些插件，我相信可以极大地提高笔记效率或生产力效率。&lt;/p&gt;

&lt;p&gt;当你写下一些笔记后，再加上时间戳，例如明天继续8点直播，后面就会加上明天的日期。当我们真正到了明天，我们就会看到，我们在今天写下这样一条备忘。我们也可以快速将其设置为待办事项，然后将其标记为已完成。这就是所谓的双向链接，你可以在现在的时间安排一个未来的时间点，而真正到了未来，当明天变成今天时，我们就会看到今天的过去，也就是昨天所发生的事情。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/4033a46869db844a4a0e2fea2a624cb4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;除了Roam Studio的这些设置外，也可以自行进行一些修改，例如按照你的偏好进行修改。当我们去掉顶部边框时，整个页面变得非常简洁，而我习惯性保留一个边界，因为我觉得这是一种更好的视觉化区分。对于空的块，我通常会将其隐藏，产生一个视觉上的间隔，这种简单明了的区分非常好用。左边的Roam Research的Logo也可以隐藏。如果追求极致，可以跟着我一步一步进行具体设置。&lt;/p&gt;

&lt;p&gt;因为我每天可能都需要几个小时使用Roam Research，所以即使有一丝的干扰也是无法忍受的。当你真正使用一款工具时，一定会把各种细节打磨到极致。不能小看这些细节设置，我认为可以极大地提高笔记效率或生产力效率。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://jimmylv.feishu.cn/space/api/box/stream/download/asynccode/?code=MGUwZWUyNGQ2NzRlNTgwNTlhNmIxOGZmN2YzZjYyOTBfQVZtNjNrVUNvY2VkeTY3dUlXRXBFM0I0ZWw3eVhQSnNfVG9rZW46QUV5cGJXc0s3b2ZiVm54YVJMdmM3MEJZbjlmXzE2ODYxMDY1Mzk6MTY4NjExMDEzOV9WNA&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;让我们在应用商店搜索 “Hide/Show Left Sidebar Buttons”，它是一个隐藏左侧边栏按钮的插件，隐藏日记笔记的按钮或没有用的 Graph 按钮。我们还可以隐藏所有页面，这个我通常不会用，而是选择自建一个卡片盒的入口。往往查看所有页面是没有任何价值的。可以隐藏快捷键或其他按钮，例如日记笔记的入口，因为我通常用快捷键 Shift+Ctrl+D 打开它。现在左侧边栏非常简洁，只有一个Roam Depot商店的入口，设置好插件后我连这个入口都会隐藏掉。&lt;/p&gt;

&lt;h2 id=&quot;小试牛刀通过-roamcss-修改界面样式&quot;&gt;小试牛刀：通过 roam/css 修改界面样式&lt;/h2&gt;
&lt;p&gt;左边这里有一个Roam Research的logo，我其实也非常想把它去掉，但是没有现成的插件可以做到这一点。于是我们可以通过 roam/css 手动隐藏它。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/cae7679422f924f839b2b1e67f26673c.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;具体方法是，打开DevTool的设置，找到RoamSidebarLogo的ID，将其复制。这会带我们进入Roam Research的另一种能力，可能略微超出范围，但我们可以先解释一下。打开roam/css并在新页面中打开它，我们可以在这里输入CSS并将刚刚的ID输入进去，然后选择 display: none 。这不会立即生效，因为我们还需要另一件事情：一个动态块叫做roam/css。将对应的CSS放在roam/css下面，然后看看它的描述，它告诉我们是否要在整个Roam Research应用程序中应用以下代码。这段代码将影响整个页面的样式，所以我们选择确定。现在，你可以看到左下角的按钮已经消失了。&lt;/p&gt;

&lt;p&gt;这是Roam Research所有插件或周边能力的一个体现。所有插件都是通过HTML、CSS和JavaScript等Web开发基础自动处理的，这只是小菜一碟，将左边的logo隐藏起来本质上是通过CSS的方式进行的，只是这里稍微试了一下魔法。&lt;/p&gt;

&lt;h2 id=&quot;快捷入口的侧边栏定制&quot;&gt;快捷入口的侧边栏定制&lt;/h2&gt;
&lt;p&gt;对于 Roam Research 主题的颜值设置，我认为基本上满意了。除了左边、右边和顶部的一些设置外，我们还可以对整个页面进行一些定制。例如，我们经常打开Roam Research这样的页面，我们可以将其添加到快捷方式，这样它就会出现在左侧快捷方式的侧边栏中。然后我们可以将其隐藏，当我们将鼠标悬停在此处时，它将显示相应的快捷入口，这样你可以快速进入你想要的页面。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/55c0ce784bfb56a7d8cfdd60cc3293f1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;通常，我会在整个设置中放入这几个东西，比如Zettelkasten或卡片盒，所谓卡片盒的一个入口。这里有一个小插件，我们可以看到Zettelkasten页面中有多少个块、多少个字符，以及下面我们坚持写了多少天等等。这个数据可能不准确，所以我们将分享这个插件以进行设置。但基本上，我只有这几个东西：待办事项、笔记中心和记录。&lt;/p&gt;

&lt;p&gt;但实际上，我更倾向于在右侧边栏中自定义这个侧边栏，因为Roam Research确实一个非常重要的功能就是这边的快捷方式，不能通过快捷键快速打开。所以我们直接放弃了整个左边的侧边栏，而通过右边的侧边栏进行自定义。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/7565ad3d82f596237df1e78e6a3b329a.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;例如，我自己定义了记录、笔记中心和Zettelkasten的入口，通过Vim模式进行快速切换和设置，可以非常快速地打开我想要打开的部分。我想打开NoteHub，只需按下w即可；我想打开我的Zettelkasten，只需按下q即可。然后按下L，即Vim模式中的 hjkl ，我们可以快速调整上下左右和大纲树状层级之间的关系。我们可以看到之前积累的一些卡片，可以对其进行设置。今天讲的内容在之前的设置中都有所积累，例如我提到的 [[“颜值至上”，让Roam Research变得更美观]] 这张卡片。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/0322c51b5212e0f9ebe6b92f5aa12591.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这里会关联我使用的一些样式以及我需要做的一些必要操作，例如隐藏工具栏和侧边栏，不必要的功能按钮，选择Roam Studio主题作为基础，然后通过配置来修改具体的一些细节。此外，Roam Research移动端存在一个横向滚动的问题，我们可以通过CSS进行快速修正，这也是一个非常核心的点，即当某个需求无法满足时，你可以自定义去完善它，而实现方式也足够简单，因为在Roam Research中，每个块都是一个积木块，所以我们可以在右侧边栏中通过Sidebar页面直接对其进行处理和整合，从而轻松进入 Project、NoteHub和Zettelkasten 等页面。&lt;/p&gt;

&lt;h2 id=&quot;必不可少的两款-roam-depot-插件&quot;&gt;必不可少的两款 Roam Depot 插件&lt;/h2&gt;
&lt;p&gt;以下是两款插件，我觉得非常非常有用，如果没有它们，我会特别特别难受。&lt;/p&gt;

&lt;h2 id=&quot;roamjstoolkit-使用-vim-快速操作&quot;&gt;roam/js/toolkit 使用 Vim 快速操作&lt;/h2&gt;
&lt;p&gt;首先是Toolkit，它是一个快捷键导航工具，使用 roam/js/toolkit 可以开启Vim模式，其中有很多基础的快捷键，比如按I进行编辑，按G回到顶部，按L回到Sidebar，按1进入编辑标题的方式等。再按回车键完成编辑。按V可以按下D进行复制，然后按下P进行粘贴。这些基础操作一旦熟悉，就会变成你的习惯。这些习惯会让你更快地处理其他需要思考的事情，而不是被UI操作所干扰。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/56eb3b2d1ae303e35571906a876a6020.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;下面是快速设置的步骤。我们可以创建一个页面，叫做 roam/js/toolkit 然后粘贴以下 JavaScript 代码，注意需要使用代码块的形式。顺便说一下，在 Roam Research 当中，页面标题的斜杠 / 也是一种命名空间的概念，我们可以把JS和CSS分别放到Roam这个下面。对于 roam/js 来说，可以用有不同的插件。&lt;/p&gt;

&lt;p&gt;对于 roam/js/toolkit 插件，我自己还做了定制化，包括一些具体的细节优化和快捷键修改。我们可以在右上角直接export一次性导出，变成一个JSON文件。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/169e6854b6f5d4e05dc19bb697e6a2b4.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这个 JSON 文件我会分享给大家，从而你同样也可以非常快速地通过右上角import。打开刚刚下载的JSON文件后，也许会发现 roam/js/toolkit 跟已有页面已经重名了，但是没关系，我们可以依然选择导入，它会将两个页面进行合并，然后导入之后，你就可以看到这边有一个import的标签，下面就是我们所导入的界面。而这个页面当中对应的快捷键和CSS优化都已经发现在这里了。所以我们就点击yes到，现在我们就有了具体的这样一些跳转了。我们可以非常快速的打开侧边栏，通过这种方式直接快速的进行跳转。&lt;/p&gt;

&lt;h2 id=&quot;roamjsbulletpaths-思维链路&quot;&gt;roam/js/bulletpaths 思维链路&lt;/h2&gt;
&lt;p&gt;第二款插件是思维链路 roam/js/bulletpaths ，它是当你Focus到某一个Block时看到的彩色链路。比如，当我在写第二章时想要结构化双向链接，我就希望之前的父级-子级的思维链路能够保留下来。&lt;/p&gt;

&lt;p&gt;我们可以看一下 [[Zettelkasten]] 这样一个页面。当我们现在正在讲 Roam Research 的插件列表，你会发现它的链路实际上是当我在设置自己的卢曼卡片笔记盒的时候，如何使用让我设置的卡片笔记，我会有这些卡片列表，也就是插件列表。而当我们在这边如果再次看到，这里有两个双向链接的时候，也是非常重要的，就当我们点击它，如果我们展开它，然后我们可以再展开一层，其实在这个里面也有两个非常重要的视觉化效果。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/2d9a8be1f056309d45dd1cc5e8394a14.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;首先是这张卡片所关联的父级卡片，它是怎么关联的，而另外就是黄色的背景，就是当我们在这边展开之后，每一个页面下面的黄色背景，就意味着这个局部的内容是隶属于这两个父级节点当中的部分内容。&lt;/p&gt;

&lt;p&gt;这些细节的可视化也是非常重要的。双向链接并不是说显示在一张图上，就是双向链接的，而是在两棵树上，你可以理解成这个节点同时分布在两棵树上面，而这两棵树之间是存在一个平衡关系的，并且通过这样一个节点。这就类似于两棵树，它有两个树叉，叉到了一起，然后形成一个贯通的回路，就像一只小松鼠，它可以从 Zettelkasten 卡片盒这个树跳跃到我正在所做的直播项目这个树上，所以我就可以把这两个部分给串联起来了。这是一个非常小的细节，但是我觉得离开它是绝对不可能的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/ff9ef9ef3bee82db60d1ef4355a4d950.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;以上是我刚刚所说的精选的两个插件，它们对于我来说是必须被设置的。除了这两个以外，其他的内容相对来说可以不安装，但是如果少了这两个，我是绝对无法允许的。&lt;/p&gt;

&lt;p&gt;现在你可以使用以下两个 JSON 文件进行快速的设置。回到你的graph，在import把刚刚的这个JSON文件进行导入。导入之后在今日笔记下方这里有一个import的入口，所以我们就点击它，来这边点击允许。允许之后，我们就可以来看一下，它是否有了这样一个可视化的效果。没有就刷新一下，那么有了这样一个层级之后，我们就可以看到这里是我的subtitle1，然后subtitle2。从而这样的可视化就变得非常清楚了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/fdbece120187f4b5c996a7a8a5e6bc5e.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;有了这样一个层级之后，加上Vim模式，我可以非常快便通过 hjkl 和 i 方便地插入内容，也可以非常快速地在不同的数值之间进行跳跃。我可以直接从H1跳到H2跳到H3，可以直接从subtitle2这个树叶的位置，然后直接回到最上级的位置。然后可以进行缩进，直接缩入到subtitle2，然后又可以回到上级。&lt;/p&gt;

&lt;h2 id=&quot;预告第二大脑数据安全与备份&quot;&gt;预告：「第二大脑」数据安全与备份&lt;/h2&gt;
&lt;p&gt;那么接下来第三部分就留到明天来讲了，就是数据安全和备份。其实在开头，我已经做了本地化的自动备份了，并且给大家演示了 Offline 模式的一个具体用法。还有就是我们要做好云端备份。这里有我在用的一个 GitHub Action 的脚本，具体效果就不给大家演示了。&lt;/p&gt;

&lt;p&gt;也有群友@ideapply，他做了一个 Roam Research 的备份脚本 &lt;a href=&quot;https://github.com/ideapply/RoamFirebaseBackup&quot;&gt;https://github.com/ideapply/RoamFirebaseBackup &lt;/a&gt;，甚至能够备份 Roam Research 所有的附件，包括图片和 PDF。应该是相对来说更好的一个方案。&lt;/p&gt;

&lt;p&gt;而另外就是我们在备份之后，其实也可以做一个共享发布。这个我们就留到后续再来说。甚至可以通过 GitBook 来进行一个公开发布，所以我们可以做 SEO，搜索引擎也可以搜索内容。&lt;/p&gt;

&lt;p&gt;最后，GitBook 最近出了 AI 检索对话功能，这也就意味着，大家共创的这个 graph 也有了 AI 加持。大家可以通过提问的方式进行交互，所以这是一种机器智慧。好，那么由于时间有限，这个彩蛋环节可能就不做演示了，我们就作为以后的例行节目再来揭晓。&lt;/p&gt;

&lt;h2 id=&quot;探索漫游的知识创作流程&quot;&gt;探索漫游的知识创作流程&lt;/h2&gt;
&lt;p&gt;首先，我觉得这个系列的直播肯定不是为了所谓的流量或者其他一些目的。我做这个直播是为了逼迫自己快速输出和创作内容。通过这个直播方式我也想开始并继续坚持。如果我能坚持第一天，那么我希望我能坚持第二天，第三天，一直到第二十一天，最后我们做一个完美的收官。&lt;/p&gt;

&lt;p&gt;我也想检验自己的音视频输出能力，能否非常快速地将视频转换成图文。虽然图文和视频都各自有其优点，但现在显而易见的是，视频的缺点在于我们无法快速地跳到自己想看的位置。因此，通过 BibiGPT 等 AI 工具，我们能够直接跳到自己想看的位置，或者由 BibiGPT AI 先来进行一次性的总结，然后我们再来判断这个视频是否是自己感兴趣的。这些都是从消费者的角度来考虑的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-06-07/81/85826a6771ef5abe1462411740953de7.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;对于创作者，也就是我尝试开始的这个直播系列，我们来探索一下：在创作者端能否通过 AI 快速输出来提高创作效率？&lt;/p&gt;

&lt;p&gt;视频其实是一种草稿。我在 B 站发出来的视频其实都是我随手录的，没有非常详细的脚本，也没有非常精良的制作，实际上都属于我的一个草稿，一个半成品。但是在 Tiago 打造的《第二大脑》这本书中，也重点提到了，我们要做 WIPs 中间产物的封包。&lt;/p&gt;

&lt;p&gt;虽然我们现在即时输出的是草稿，但也值得尽早地分享出来，然后去与大家讨论，又会产生新的想法，从而你可以更好地去迭代自己的产品或灵感。灵感或草稿并没有那么重要，重要的是，你可以借助这些草稿获得一些新的反馈，从而让它打磨得更好。&lt;/p&gt;

&lt;p&gt;今天的视频就到这里了，让我们明天再见，希望我能坚持 21 天，养成一个习惯，逼迫自己搞定自己的知识创作流程。下期再见，拜拜！&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://noto.so/37ff63e6fbda4aa2bfa19f79a7753f71&quot;&gt;raw&lt;/a&gt;&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>《Roam Research DISS》“你在用双链，他也在用双链”</title>
        <link>https://blog.jimmylv.info/2023-02-16-roam-research-diss-%E4%BD%A0%E5%9C%A8%E7%94%A8%E5%8F%8C%E9%93%BE-%E4%BB%96%E4%B9%9F%E5%9C%A8%E7%94%A8%E5%8F%8C%E9%93%BE/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2023-02-16-roam-research-diss-%E4%BD%A0%E5%9C%A8%E7%94%A8%E5%8F%8C%E9%93%BE-%E4%BB%96%E4%B9%9F%E5%9C%A8%E7%94%A8%E5%8F%8C%E9%93%BE/</guid>
        <pubDate>Thu, 16 Feb 2023 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;yo~ shout out to this shit&lt;/p&gt;

&lt;p&gt;时间回到2020，回头看&lt;/p&gt;

&lt;p&gt;由你 掀起一波 Cult 宗教感&lt;/p&gt;

&lt;p&gt;2022 你的教徒 全都一起上&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;

&lt;p&gt;社区为你的付出都感到不甘&lt;/p&gt;

&lt;p&gt;忘了 Shamer 当初给你做推广&lt;/p&gt;

&lt;p&gt;那副路线图 Believer 也无法高攀&lt;/p&gt;

&lt;p&gt;反过来把 Logseq 的 feature 原样照搬&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;这首 Diss 写完，我只需要打开系统便签&lt;/p&gt;

&lt;p&gt;学 Steve，学 Musk，学 Web3&lt;/p&gt;

&lt;p&gt;学到的只有暴脾气的标杆&lt;/p&gt;

&lt;p&gt;不如直接去 Tesla 公关上班&lt;/p&gt;

&lt;p&gt;万亿市值也能被你直接完蛋&lt;/p&gt;

&lt;p&gt;学生善良 录了视频年费照样承担&lt;/p&gt;

&lt;p&gt;手动审批申请单 变相定价不嫌麻烦&lt;/p&gt;

&lt;p&gt;更不想提那 Graph 视图有多破烂&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;

&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;圈完钱 留下用户不管 冤枉心酸&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;

&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;你在用双链，他也在用双链&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;你那不是 ADHD 只是工作浮浅&lt;/p&gt;

&lt;p&gt;#StudyWithMe 直播一起成长&lt;/p&gt;

&lt;p&gt;跟着 Tim 学习 4 点就起床&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;

&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;“你看我的图谱多美观” （脑子聪明又可爱～）&lt;/p&gt;

&lt;p&gt;你们都有知识图谱多领先，谁对知识做了贡献&lt;/p&gt;

&lt;hr /&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;
</description>
      </item>
    
      <item>
        <title>ch1 写下来：从每日笔记开始，坚持写下去</title>
        <link>https://blog.jimmylv.info/2023-02-16-ch1-%E5%86%99%E4%B8%8B%E6%9D%A5-%E4%BB%8E%E6%AF%8F%E6%97%A5%E7%AC%94%E8%AE%B0%E5%BC%80%E5%A7%8B-%E5%9D%9A%E6%8C%81%E5%86%99%E4%B8%8B%E5%8E%BB/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2023-02-16-ch1-%E5%86%99%E4%B8%8B%E6%9D%A5-%E4%BB%8E%E6%AF%8F%E6%97%A5%E7%AC%94%E8%AE%B0%E5%BC%80%E5%A7%8B-%E5%9D%9A%E6%8C%81%E5%86%99%E4%B8%8B%E5%8E%BB/</guid>
        <pubDate>Thu, 16 Feb 2023 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;展信佳，&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;市面上这么多笔记软件，它们互相混战，最后谁能胜出倒也无所谓。而作为用户的我们，更关心自己的高效产出。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;-从来就没有人从零开始&quot;&gt;🥚 从来就没有人从零开始&lt;/h2&gt;
&lt;p&gt;你需要的是打造一个系统，帮助自己「尽快地」开始产出。拿我自己来说，经常需要做视频、写文章、做课程乃至写代码、做产品，其实最难的部分是如何开始：只要开始了，就已经胜利了 50%。&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;li&gt;腾不出时间，一直在拖延，用刷剧、看电影等方式来消磨自己的焦虑。由于未能真正推进项目，自己反而又变得更加焦虑了？
那么，为什么你迟迟没有开始？因为你直接面对的是「一张白纸」。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;-认识新的白纸daily-notes&quot;&gt;📝 认识新的白纸：Daily Notes&lt;/h2&gt;
&lt;p&gt;其实，你不需要，也不可能完全从一张白纸开始。从零开始把论文写作拆成很多个步骤，开始逐一地展开，he，这只是单纯的幻想。积累知识并不是线性的过程，而是一个「非线性」的过程，散落在每天的日常当中。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://static.xiaobot.net/file/2023-02-16/81/a96c2c4de84033f8d41db3f3275be5d8.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;那么，如何将知识收集到一起，形成针对于具体项目的「思维链路」呢？以对外演讲这个重要项目为例，管它三七二十一，先记录个 30 天的 Daily Notes，写下你所有的思考和收集的信息，那么 30 天之后，等待你的就不再是一张白纸。&lt;/p&gt;

&lt;p&gt;之后，你只需要找到一个安静的地方，戴上耳机，打开番茄钟计时，在 Roam Research 快速生成一套模板，开始写作。填空式写作，因为你需要的内容已经准备好，接下来只需要在每个子标题下面，把你收集的内容有序填空即可。&lt;/p&gt;

&lt;h2 id=&quot;-想法纷飞daily-note-是你自由思考的白纸&quot;&gt;💭 想法纷飞：Daily Note 是你自由思考的白纸&lt;/h2&gt;
&lt;p&gt;哪怕你没有去看过往的每日笔记，时间也没有被浪费，因为写的这个过程就是在帮助你思考 —— 写的过程就是你思考的过程。建立一套日常的写作工作流，通过写笔记来思考，让记下来的笔记可以成为之后写文章、做项目的基础。&lt;/p&gt;

&lt;p&gt;每天都是崭新的一天，Daily Note 每天也都是崭新的一张白纸，你可以不停地去写“我在干什么、写什么，在想什么和读了什么，以及看到别人说了什么”，尽情倾倒自己脑海中的想法。&lt;/p&gt;

&lt;p&gt;只有当你真正写下来，才可以让想法呈现于纸上，才可以去基于纸上来思考。大脑并没有多大的工作记忆容量，需要外部的辅助工具，来帮助你自由地、发散地、无止境地去探索自己的想法。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“不写，就无法思考。”（卢曼 1992,53） —— &lt;a href=&quot;https://book.douban.com/subject/35503571/&quot;&gt;《卡片笔记写作法》&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;-roam-research手指不离开键盘的思考空间&quot;&gt;📓 Roam Research：手指不离开键盘的思考空间&lt;/h2&gt;
&lt;p&gt;另一方面，为什么我选择在 Roam Research 来做这件事情，而不是 Obsidian。因为前者对 Daily Note 的设计和思考是非常好的，好的工具自带方法论，并且 Daily Note 是随着 Roam Research 的兴起才被其他软件所借鉴。&lt;/p&gt;

&lt;p&gt;它是结合了时间维度的笔记工具，并不只是为你增加更多的功能，而是帮助你减少对当前思考的干扰。打开 Roam Research，你只需要面对 Daily Note 这张白纸，写下自己的任意想法，此时你根本就不需要知道什么是双向链接，也不需要知道其它任何功能。&lt;/p&gt;

&lt;p&gt;你就把它当成一张张连续的白纸，尽可能减少页面跳转、鼠标移动、材料引用、动画刷新等工具行为，避免对大脑的思考造成干扰。结合我在使用的 &lt;a href=&quot;https://github.com/roam-unofficial/roam-toolkit#vim-style-keyboard-shortcuts&quot;&gt;Vim 模式&lt;/a&gt;快捷键，快速跳转，随意打开想要查看的任意内容。作为一名程序员，我将其描述为一种「在写代码的时候手指不离开键盘」的爽快感。我的思考没有任何干扰，但能创造无限结构。&lt;/p&gt;

&lt;p&gt;不知不觉，Roam Research 让我坚持写了三年多的每日笔记。其实，只要哪个软件能够让你坚持「写下去」，它就是最棒的！你心目中的“它”又是谁呢？&lt;/p&gt;

&lt;h2 id=&quot;-订阅更新升职加薪&quot;&gt;&lt;strong&gt;🔔 订阅更新，升职加薪：&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://xiaobot.net/p/jimmylv&quot;&gt;[[间歇日记的最佳实践]]&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://xiaobot.net/p/jimmylv&quot;&gt;[[给自己安一个“动力马达”]]&lt;/a&gt;&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>超越效率：10x 提升阅读体验后，我有哪些反思？</title>
        <link>https://blog.jimmylv.info/2023-02-14-beyond-efficiency-reflections-on-10x-improvement-in-reading-experience/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2023-02-14-beyond-efficiency-reflections-on-10x-improvement-in-reading-experience/</guid>
        <pubDate>Tue, 14 Feb 2023 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;这篇文章同步发表于&lt;a href=&quot;https://sspai.com/post/78124&quot;&gt;少数派年度征文&lt;/a&gt;，活动评奖依赖用户反馈数据的奖金结算机制，充电、收藏和阅读量都将不同程度地影响文章的最终排名与稿酬倍率。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;如果你喜欢这篇文章或内容对你帮助，请尽量跳转到&lt;a href=&quot;https://sspai.com/post/78124&quot;&gt;少数派网站&lt;/a&gt;通过充电、收藏或评论等方式表达你的支持与赞赏。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/096760e1a3ceec1000bed060121691d6.jpeg?imageMogr2/auto-orient/quality/95/thumbnail/!1420x708r/gravity/Center/crop/1420x708/interlace/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;哈喽，大家新年快乐！#立青与佳# 祝您和您家人✨💘✨2023年🌟新的一年里🎵✨✨好运连连，平安幸福🍎💯🏮兔年吉祥🐇🌹&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;少数派年度征文截稿在即，趁此良机，我刚好想要总结和分享一下「我的效率系统 2022 升级版」，内容包括：&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;li&gt;GPT-3 人工智能赋能的生产力工具&lt;/li&gt;
  &lt;li&gt;重新思考 Roam Research 的价值&lt;/li&gt;
  &lt;li&gt;任务管理和目标管理的反思&lt;/li&gt;
  &lt;li&gt;白板的作用，以及各大笔记工具在 2022 年对白板的支持。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;由于篇幅和时间有限，这篇文章只能涉及前 2 个话题（阅读篇），如果你感觉对某个话题很感兴趣，不如先来点一波&lt;a href=&quot;https://space.bilibili.com/37648256&quot;&gt;关注&lt;/a&gt;。对于其他话题的细节，可以看我在 B 站的往期视频，在视频中能够找到更多有价值的信息。&lt;/p&gt;

&lt;h2 id=&quot;引言我的年度关键词-幸运&quot;&gt;引言：我的年度关键词 ——「幸运」&lt;/h2&gt;

&lt;p&gt;面对新的一年，我的情绪跟股票市场一样，也是高波动，高分化。去年我的投资收益率大概在 16%，只不过是负的，🐶。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/ae60593da48a7966d7776efbf6f3ec8a?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;但这其实是一种幸运，因为它让我可以有机会去把握「机会」，尽管我可能还没来得及做好充分的准备。跟股票市场的两轮暴跌类似，2022 年度我的心情也是两次暴涨，两次暴跌，所以总结下来，我对年度关键词「幸运」有了更深的理解：&lt;strong&gt;幸运不仅仅意味着要把握机会，也可能伴随着失去幸运的可能&lt;/strong&gt;。只有努力再努力，才能让自己的实力配得上所获得的「幸运」。&lt;/p&gt;

&lt;p&gt;另外，去年我的 B 站关注数突破了5000，总计发布83个视频，累计时长22小时，而这背后所花费的录制和剪辑的时间至少是10倍以上啦。令人唏嘘的是，&lt;strong&gt;近一年的 B 站总收益是668.33元，不足少数派的一篇稿费&lt;/strong&gt;，🤣 这_更加_鼓励我要继续努力。所以，非常感谢看我的文章和视频的各位，也特别感谢2022年新关注的4334位小伙伴，希望你可以和我一起，用努力来获得幸运，迎接新的一年！&lt;/p&gt;

&lt;h2 id=&quot;碎片化阅读化零为整80---20&quot;&gt;碎片化阅读（化零为整）80% -&amp;gt; 20%&lt;/h2&gt;

&lt;p&gt;Readwise Reader 是我在 2022 年自我评选的最佳软件产品，我用四象限图表的方式总结了它和其他 APP 的区别，可以看到 Readwise Reader 属于「学习（认知）」部分，我愿称之为年度最好用的现代化阅读器，它是碎片化阅读的完美兜底。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/2407aa69726e96484285d91d750b7535?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我的效率系统2022年度总结&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;我之前做过开箱视频和移动端使用的相关视频，点击链接即可查看：&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1ie4y1m7xQ/&quot;&gt;【开箱】最好用的现代化阅读器，Readwise Reader All In One&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1zG41177v4/&quot;&gt;【备份】Readwise 笔记联动，Obsidian 同步至本地，DEVONthink 索引归档&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1WG4y1972x/&quot;&gt;【更新】最好用的阅读器 Readwise Reader 移动端 v2.0（上篇）- iOS 版本&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV15g411W7fK/&quot;&gt;【年度】最好用的阅读器 Readwise 本体 &amp;amp; Reader 移动端 iPad 版本（下篇）&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1VK411r75K&quot;&gt;【茶话会】&lt;/a&gt;「&lt;a href=&quot;https://www.bilibili.com/video/BV1VK411r75K&quot;&gt;我的年度 App&lt;/a&gt;」&lt;a href=&quot;https://www.bilibili.com/video/BV1VK411r75K&quot;&gt;，讨论 AI 加持的阅读 &amp;amp; 笔记工具&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1k84y1e7fW/&quot;&gt;【年度】我的效率系统 2022 升级版（阅读篇）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Readwise Reader 本身有一个 Feed 流的概念，能够帮助我把微信公众号、少数派、B 站、博客、Newsletter，甚至是 Twitter List 里的内容统一汇总到 Reader 里。我将之前订阅的 RSS 内容全部迁移过来了，下图包括我所有 Feeds RSS 订阅源（Subscribed），而 Reader 甚至还能根据你的订阅源智能推荐新的信息源（Suggested）。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/e14671359154fb3b0db003f19e5d4262?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;将所有信息源统一收纳之后，我就可以通过 Reader 的「每日摘要」卡片式筛选自己想要读的内容，然后保存在 Library 里。我还可以根据作者和对应的域名进行筛选，比如可以通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;domain:sspai.com&lt;/code&gt; 筛选出所有从少数派来的文章。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/b337e5cfc502edf68e9256816cb4c340?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;特别的是，当我看到一篇关于 MarginNote 的少数派&lt;strong&gt;付费内容&lt;/strong&gt;，通过浏览器端插件直接保存时，它可以备份完整的文章和对应的图片。进入精读的阶段，当我在 Reader 中进行文章高亮，右侧会有一个 Notebook 的列表，所高亮的内容也会实时同步到 Readwise 本体。我最喜欢的是精读时的纯键盘操作，可以通过上下左右的快捷键快速跳转文章段落，以及按下 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;h&lt;/code&gt; 或 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n&lt;/code&gt; 进行内容的高亮（highlight）或笔记（note），并且支持在整个文档层级完成笔记记录、加标签、打开原网页、归档等快捷操作。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/cd27fb086cdfdb2edc4fb677ad161c45?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在阅读高亮完毕后，我就可以跳转到 Readwise 查看所记录的所有卡片，编辑或添加更多的笔记内容，甚至可以制成类似 Anki 的闪卡，通过提问的方式总结知识卡片。Readwise 会每天提醒我回顾这些卡片，从而形成阅读的闭环，持续不断的反馈帮助我将卡片内容内化到大脑当中。&lt;/p&gt;

&lt;p&gt;另外，使用 Readwise 还有一个好处，它会把笔记内容自动同步到笔记软件，比如我在 Readwise 里加了 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#favorite&lt;/code&gt; 标签，也会自动同步到 Roam Research 方便筛选。而在查看笔记时，还可以通过 highlight 链接直接回到原文出处。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/3dbeef09967862c3d0c1e1602e42090e?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;同时，Reader 的&lt;a href=&quot;https://www.bilibili.com/video/BV1WG4y1972x/&quot;&gt;手机端体验&lt;/a&gt;也非常好，能够快速地将内容在移动端保存到 Reader 中。此外，它还支持其他文件类型，比如电子书支持 Epub、PDF 文件甚至支持文字重排、Email 支持 Newsletter 和 Twitter Thread 等，非常值得一试。&lt;/p&gt;

&lt;p&gt;总结一下，对于碎片化阅读，虽然信息源多且繁杂，但是借助于好用的汇总和筛选工具，比如 Readwise Reader，可以「化零为整」，我们只需要 20% 的时间就能系统化地处理自己的碎片化信息。&lt;/p&gt;

&lt;h2 id=&quot;书本阅读渐进式总结20---80&quot;&gt;书本阅读（渐进式总结）20% -&amp;gt; 80%&lt;/h2&gt;

&lt;p&gt;因此，这也就引出了下一个话题：书本阅读。我想特别提一点我的反思：在 Reader 聚合了「碎片化阅读」之后，反而又让我重新更加重视「读书」了，更应该阅读的应该是书籍。&lt;/p&gt;

&lt;p&gt;每当我打开 Reader 的 Home 页面时，看到自己未读完的内容、最近添加的内容、可快速阅读的内容，以及信息流中新出现的信息。此时，我会有意识地将书籍放在 Reader 主页的第一个位置，看到自己更应该去做的是「书本阅读」，而不是所谓的「碎片化阅读」。因为相比之下，当你看到可以阅读书籍时，你会发现书籍会给你更多有价值的体系性内容。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/86bf486f6687fc4d05a465d0af421e84?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;书籍阅读的渐进式总结流程&quot;&gt;书籍阅读的渐进式总结流程&lt;/h3&gt;

&lt;p&gt;但是，这又引出了一个新的问题：什么是更好的书籍阅读 Workflow？我认为，更好的书籍阅读发生在 MarginNote 中，使用 MarginNote 可以很好地结合渐进式总结。那么，什么是渐进式总结？&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/c33a6e0f6c3c4bebf05486cdb7a27bf1?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Tiago 的 CODE 框架是一种更加明确的提取和总结方式，它由 Capture（捕获）、Organize（组织）、Distill（提取）、Express（表达）四个阶段组成，而在 Distill 阶段的渐进式总结 Workflow 中，每个层级的筛选过程和提取比例都是逐步降低的。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;第一层是 Note，通过加粗高亮的方式对原文内容进行筛选，并以视觉化的方式标注出来；&lt;/li&gt;
  &lt;li&gt;第二层是 Mini Summary，用自己做一个简短的总结，然后跟自己的其他笔记 Remix，最终变成属于自己的东西；&lt;/li&gt;
  &lt;li&gt;第三层是 Q&amp;amp;A，提问的方式来对关键概念进行总结，最终混合出属于自己的知识结构。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L 先生的 INK-P 也是一套类似的理论，只要&lt;strong&gt;总结它们的原则和关键点，最终提取属于自己的，适用于自己的框架&lt;/strong&gt;，就可以让类似的知识框架为自己所用。&lt;/p&gt;

&lt;h2 id=&quot;marginnote-阅读笔记流程演示&quot;&gt;MarginNote 阅读笔记流程演示&lt;/h2&gt;

&lt;p&gt;接下来，我会逐步演示一下我在 MarginNote 里面是怎么阅读的。MarginNote 对阅读和学习的支持非常好，借助 MarginNote 的「学习模式」，可以方便地完成渐进式总结的流程。我发现很多 MarginNote 的小细节，真的很贴心，比如 iPad 和 macOS 的联动，可以快速推送笔记，并且打开的笔记在书中的位置是完全统一的。&lt;/p&gt;

&lt;p&gt;以终为始，我会先带你看看阅读笔记的最终形态是什么样子的？打开 MarginNote，以我正在看的《第二大脑》为例，左边是一个思维导图，右边是这本书。另一个模式是学习模式，点击某一张卡片，就会跳转到对应的 PDF 位置。&lt;strong&gt;最终的笔记成品是以一个个问题组织起来的，就像爆竹的引线，将一颗颗爆竹🧨串联在一起。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/2d15d9ffedf51b033cc31f00ae966d34?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;完成对书本的阅读和学习之后，我会将 MarginNote 的笔记导出到我的笔记软件，完成统一的知识汇总。在 Roam Research 中有类似的一个大纲结构，对应 MarginNote 里面的思维导图，展开可以看到一些概念，比如书中所提到的「中间产物」或「知识资产」，都是以问题的方式组织起来的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/1b2fc05bba53d765f268a08a36985bc1?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在 Roam Research 中，我还可以通过 &lt;a href=&quot;https://sspai.com/link?target=https%3A%2F%2Fgithub.com%2Fdigitalmaster%2Froam-memo&quot;&gt;Roam Memo&lt;/a&gt; 插件，间隔回顾对应的卡片内容，比如「什么是中间产物？」。只需要给 Block 加上 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#memo&lt;/code&gt; 标签即可，这是插件所需要识别的标识符。如果我对问题的答案已经很了解，可以对它进行反馈，根据反馈指定下一次 Review 的时间，比如选择 Hard，就会明天提醒再次 Review。右上角的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Past Due&lt;/code&gt; 会标注是否错过 Review 时间。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/542ca146fbd8dffecccf7b29657c5fa6?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;当然，如果对卡片内容记得不是特别清楚了，可以点击链接，直接回到 MarginNote 所对应的卡片位置和原文位置。&lt;/p&gt;

&lt;h3 id=&quot;q1-如何梳理书籍的知识结构&quot;&gt;Q1: 如何梳理书籍的知识结构？&lt;/h3&gt;

&lt;p&gt;以《程序员修炼之道》这本书为例，我打开的是 PDF 文件，因为 MarginNote 支持的功能会比 Epub 格式更多。在学习模式里面，你可以直接导入整本书的目录结构，从而生成一个思维导图，但问题在于，这还是以原作者的知识框架来整理内容的，而不是你自己的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/f644cfaee0ba37844f08524b973df0ae?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;其实，按照作者的结构来组织内容，还是按照自己的结构来组织内容，这其实是没有标准答案的。&lt;strong&gt;如果你对某个领域完全没有框架性的基础概念，你可以先学习一遍作者的结构&lt;/strong&gt;，也就是把原书的 TOC 目录放进思维导图。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/a39dc61c31683285e306a6d9b13edb74?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;但如果你对这个领域已经有了属于自己的初步认识，你就可以在这里选择只按照文档（By Document）进行自动摘录。此时每当我摘录一条，它就会存在整个文档的框框里面，而不会出现在之前的目录结构下面。所以，我一般就会把知识点概念单独摘录出来，把目录删掉，然后从书中找到自己感兴趣的部分，比如「正交性」的概念，就对它所在的关键文本进行高亮。&lt;/p&gt;

&lt;h3 id=&quot;q2-阅读时遇到新概念怎么办&quot;&gt;Q2: 阅读时遇到新概念怎么办？&lt;/h3&gt;

&lt;p&gt;重点来了，阅读时，我还会打开「学习模式」的 Title Link（标题字典），并且在文档中打开 Recall Mode（回顾模式），从而在阅读的过程中，就开始回想所提取的新概念。&lt;/p&gt;

&lt;p&gt;高亮之后，打开大纲模式，选择 Emphasize（强调），并且选中强调会同步到标题。此时，点击「正交性」这个词，它会自动同步到卡片标题上。而所有文中出现「正交性」这个关键词的地方，都会有一个小小的下划线。点击它，在左边的大纲中，就会出现词的具体解释，而在右边 PDF 的划线高亮段落中，&lt;strong&gt;所有关于「正交性」的词语都会隐藏起来，让你通过回想强化一次「提取强度」。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/62cf8545a92c9046de49bad73236a517?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;更神奇的是，当我在其他地方划上高亮之后，也选中「正交」作为它的标题，那么点击「正交」这个词，会发现关于这个词的解释会有两个出处，可以直接点击它，分别跳转到不同的原文位置。&lt;/p&gt;

&lt;p&gt;比如，「正交」的系统能获得两个最主要的收益：提高&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;生产力&lt;/code&gt;和降低&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;风险&lt;/code&gt;。因此，我就可以把&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;生产力&lt;/code&gt;和&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;风险&lt;/code&gt;标注起来，从而使文章中出现的概念彼此相互链接。比如，我可以看到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;风险&lt;/code&gt;与&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;正交&lt;/code&gt;系统有关，它是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;正交&lt;/code&gt;系统的收益之一。特别是当我想要查看关键概念出处时，就可以方便地快速查看。如果对卡片内容仍然不能理解，就可以点击它回到当时你所划线的文章内容。因此，通过这样一个过程，我就能够&lt;strong&gt;在阅读时把文章中的许多关键概念组织起来&lt;/strong&gt;。&lt;/p&gt;

&lt;h3 id=&quot;q3-如何组织书中的新概念&quot;&gt;Q3: 如何组织书中的新概念？&lt;/h3&gt;

&lt;p&gt;就像我前面提到的，我会通过问题的方式来组织我的思维导图或者叫大纲，所以我就会在这里添加 Q 作为问题的前缀。（当你做笔记的时候，你可以把右边稍微缩小一点。）比如，新建一个问题：「Q:: 正交性的好处是什么？」这样&lt;strong&gt;按照你自己的思维链路，通过自己大脑里的提问方式来组织内容的表述&lt;/strong&gt;：「好处就是提高&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;生产力&lt;/code&gt;和降低&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;风险&lt;/code&gt;。」&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;正交性促进了重用，特别是当两个组件的职责相对单一时，正交性的价值就提高了。因为一个组件能做 M 件独特的事情，另一个组件能做 N 件事情，如果它们是正交的，它们就能够组合起来完成 M 乘以 N 件事情。&lt;/p&gt;

  &lt;p&gt;所以，正交组件在组合过程中，单个组件单元的性价比就提高了。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;同样的，当我遇到了一个新的概念叫做「组合」，那么我就可以给这张高亮的卡片，手动加上一个标题：组合，从而书中所有出现「组合」的地方就会被划线高亮出来。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/775f5b95471156279b7879b6c44f1bb0?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;q4-笔记如何导出到-roam-research&quot;&gt;Q4: 笔记如何导出到 Roam Research？&lt;/h3&gt;

&lt;p&gt;完成阅读之后，我就会把这些内容复制放到 Roam Research 里面，但是如果直接复制，你会发现有个小问题：它是不带 MarginNote 的链接的。所以这个时候，我会借助印象笔记作为一个中转，每本书导出一遍的频率倒也还可以忍受，仪式感满满 😉。&lt;/p&gt;

&lt;p&gt;另外需要注意的是，当你是英文系统，并且 MarginNote 也是英文版的时候，你登录的是 Evernote，而不是国内的印象笔记。 只需要在 iPad 上或者把 MarginNote 改成中文语言即可，在系统设置 language 里面，你可以添加增加 MarginNote，把语言改成简体。这样，当你重启之后，整个 MarginNote 就会变成中文，当你去导出的时候，它就会登录的是印象笔记。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/bb9e03dd1f2390c28dfa3cea3310f5b9?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;导出的时候，你可以不用附上原文的文档，也不用附上脑图。保存的笔记很快就会出现在印象笔记，我只需要选中它们，复制到 Roam Research 当中。所有的 MarginNote 的链接都会保留下来，&lt;strong&gt;一张一张的卡片以问题的方式组织起来，而通过链接可以非常快速地回到原文所对应的位置&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/104e22ccb89ce012491640e5b903072e?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;q5-如何间隔复习笔记卡片&quot;&gt;Q5: 如何间隔复习笔记卡片？&lt;/h3&gt;

&lt;p&gt;接下来，我就会批量的把这些问题加上对应的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#memo&lt;/code&gt; 标签。通过 Roam Research 的 &lt;a href=&quot;https://sspai.com/link?target=https%3A%2F%2Fgithub.com%2Ffbgallet%2Froam-extension-find-replace&quot;&gt;Find &amp;amp; Replace&lt;/a&gt; 插件，我可以按下 Ctrl + S 再找到刚刚的两个 Q，然后替换为将两个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Q::&lt;/code&gt; 作为前缀，然后将 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#memo&lt;/code&gt; 作为后缀。这样就可以通过双向链接的特性，变成 Roam Research 所能识别的 attribute 属性页面。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/7d02214a2a97a664e77d08edb13db313?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;此时当我点击打开 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[Q]]&lt;/code&gt; 页面，你就可以看到我之前所有的加了问题的笔记卡片。接下来，还需要去设置 &lt;a href=&quot;https://sspai.com/link?target=https%3A%2F%2Fgithub.com%2Fdigitalmaster%2Froam-memo&quot;&gt;MEMO 插件&lt;/a&gt;，额外增加 2 个标签，将 Q 和 memo 增加进来，作为 MEMO 卡片的标识符。这样，当我点击 Review 插件，选择下拉框，里面就会出现 Q 和 memo，点击查看所有的跟刚刚的卡片所对应的卡片内容。每张卡片，还会显示一个面包屑，从而我可以快速查看当前这张卡片的出处。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/22d6aa87ee9c9e9c71243ab01d0a7d95?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;q6-如何在阅读时-remix-自己的旧笔记&quot;&gt;Q6: 如何在阅读时 Remix 自己的旧笔记？&lt;/h3&gt;

&lt;p&gt;在 MarginNote 阅读时，你还可以快速添加自己的评论。比如，当我们意识到「正交性」的价值时，你可以把正交性概念加上双链符号，并且将它与脑海中的其他概念相互联系起来。比如，我会想到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[正交性]]&lt;/code&gt;与笔记的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[原子化]]&lt;/code&gt;非常类似，都可以用来增加笔记的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[可复用性]]&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/801603ffec923bae421c8dbdb473ffe1?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;可想而知，我在 MarginNote 所添加的笔记双链，导出到 Roam Research 后会自动跟已有的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[原子化]]&lt;/code&gt; 页面链接起来，从而我就可以查看&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[原子化]]&lt;/code&gt;在我之前的笔记系统中有哪些相关内容。&lt;/p&gt;

&lt;p&gt;比如，这里的原子化和之前我所做的另一个视频&lt;a href=&quot;https://www.bilibili.com/video/BV1BG411b786/&quot;&gt;《【效率思维】顺理成&lt;/a&gt;「&lt;a href=&quot;https://www.bilibili.com/video/BV1BG411b786/&quot;&gt;章&lt;/a&gt;」&lt;a href=&quot;https://www.bilibili.com/video/BV1BG411b786/&quot;&gt;：卡片化写作与原子化设计》&lt;/a&gt;就链接起来了。此时，我就可以&lt;strong&gt;再次回顾它，并且关联出一些相关的概念&lt;/strong&gt;，也完成了我们刚刚所说的 Remix 混合的一个步骤。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/e69209af7b95bd6de635fcc516ba1305.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;好，以上就是我在 MarginNote 到 Roam Research 的一个渐进式总结。这只是一个非常简单的演示，不过我特意通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Q: 小标题提问？&lt;/code&gt; 的方式将内容组织起来了，也算是一个不断实践的亲身示范。&lt;/p&gt;

&lt;p&gt;当我在 MarginNote 里面读书，在阅读过程中，就会&lt;strong&gt;通过高亮文本和提取关键概念，不断通过标题链接链接相关的知识点&lt;/strong&gt;。而当我把笔记导入到 Roam Research 之后，又可以通过双链符号以及页面属性功能来进行间隔重复。&lt;/p&gt;

&lt;h2 id=&quot;总结书本阅读的重要性&quot;&gt;总结：书本阅读的重要性&lt;/h2&gt;

&lt;p&gt;作为年度征文，我向你尽可能详细地介绍了「碎片化阅读」和「书本阅读」的整个流程。更多的操作细节可以参考&lt;a href=&quot;https://www.bilibili.com/video/BV1k84y1e7fW/&quot;&gt;我的视频&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;本文从文章篇幅上，就刻意强调了「书本阅读」的重要性，😛。当我们把碎片化阅读和书本阅读摆在一起时，优先级自然浮现出来。从书本中学习，从经典中学习还是会更加重要一点，哪怕碎片内容可能占据了 80%，但我们的重心仍然应该是花 &lt;strong&gt;80% 的时间去阅读书籍 📚&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;对于「碎片化阅读」，虽然可能信息量更多，时效性更强，但借助于好用的聚合与筛选工具，比如 &lt;a href=&quot;https://sspai.com/link?target=https%3A%2F%2Freadwise.io%2Fi%2Fjimmy908&quot;&gt;Readwise Reader&lt;/a&gt;，我们只需要 20% 的时间就能够系统化地处理自己的碎片化信息，「化零为整」批量化处理，留出那属于自己的 &lt;strong&gt;80% 时间去阅读书籍 📚&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2023/02/05/article/ddb27b8325985f996dac9042e2e84cf0?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;题外话：因为录制的过程就是我思考的过程，时间相对会比较长，所以我想把它拍成几个视频来进行讲解。目前来看，至少需要三个视频才能够完整地讲完，然后再通过 Notion AI 转成文章，手动插图，然后才会有类似这篇文章的成品。&lt;/p&gt;

&lt;p&gt;如果大家对之后的卡片盒笔记、人工智能、Roam Research 插件、任务管理、目标管理以及白板等话题感兴趣，可以帮我在少数派「充电、收藏、关注」三连啦，特别重要的是留下一个属于你的脚步：&lt;a href=&quot;https://sspai.com/post/71518&quot;&gt;「己所欲，施于人」&lt;/a&gt;，为自己留下一个评论。&lt;/p&gt;

&lt;p&gt;好啦，我的 2022 年度征文 Part 1 就到这里了，谢谢大家，我们下次再见，拜拜 👋。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;这篇文章同步发表于&lt;a href=&quot;https://sspai.com/post/78124&quot;&gt;少数派年度征文&lt;/a&gt;，活动评奖依赖用户反馈数据的奖金结算机制，充电、收藏和阅读量都将不同程度地影响文章的最终排名与稿酬倍率。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;如果你喜欢这篇文章或内容对你帮助，请尽量跳转到&lt;a href=&quot;https://sspai.com/post/78124&quot;&gt;少数派网站&lt;/a&gt;通过充电、收藏或评论等方式表达你的支持与赞赏。&lt;/p&gt;
&lt;/blockquote&gt;
</description>
      </item>
    
      <item>
        <title>如何克服精神内耗与对抗分心？</title>
        <link>https://blog.jimmylv.info/2022-09-20-How-to-Fight-Distraction/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2022-09-20-How-to-Fight-Distraction/</guid>
        <pubDate>Tue, 20 Sep 2022 00:00:00 +0000</pubDate>
        <description>&lt;h1 id=&quot;如何克服精神内耗与对抗分心&quot;&gt;如何克服精神内耗与对抗分心&lt;/h1&gt;

&lt;p&gt;本文为你介绍一个此前的热门话题 —— 精神内耗。&lt;/p&gt;

&lt;p&gt;7 月份的时候，我发了一条 B 站动态，说是要分享「如何使用 Roam Research 克服精神内耗」。很多朋友都说这期视频是值得去做的，但我又在不断内耗当中，继续思考而迟迟没有动手。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/09/12/02ea8f4f3187bb82207d6a4b0c525632.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://t.bilibili.com/687434229234008083&quot;&gt;写作本文的契机&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;最近在看尼尔·埃亚尔（Nir Eyal）的新书&lt;a href=&quot;https://book.douban.com/subject/35826855/&quot;&gt;《不可打扰》&lt;/a&gt;时，又对「精神内耗」这个话题产生了新的感悟。&lt;/p&gt;

&lt;p&gt;尼尔·埃亚尔是&lt;a href=&quot;https://book.douban.com/subject/27030507/&quot;&gt;《上瘾》&lt;/a&gt;这本书的作者，之前他在书中所讲的是「让用户养成使用习惯的四大产品逻辑」，如今所有的 App 都想让你对它上瘾，或多或少都有基于这本书的几个观点。&lt;/p&gt;

&lt;p&gt;而相反地，作为行为设计学的导师，尼尔·埃亚尔也提供了另外一个角度，即我们作为个人，如何去避免被这些抖音之类的 App 吸引注意力而「分心」。上瘾在本质上跟精神内耗是有很多类似的地方，本文我将分享自己关于精神内耗的 4 个应对策略。&lt;/p&gt;

&lt;p&gt;进入正文之前，我先稍微偏个题，本文的大纲是结合了 L 先生的几个有效的方法，共同构成的。那么这份大纲是如何在 Roam Research 中产生的呢？推荐给你一个好用的方法 —— 我在思考某个话题，或者是看一本书之前，会带着自己的问题（比如，如何克服精神内耗？）首先写下自己的想法，再去看你要读的材料&lt;strong&gt;。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/09/12/a988c3c40ffa3d3ff46cc3e9fdecd30d.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;比方说当时我就写下了自己的四个想法：使用 Roam Research 写下来、尽快进入下一阶段、冥想、任务驱动。然后呢，我再去读 L 先生关于有效克服精神内耗的方法，我相应地再去做阅读笔记，将文章里面提到的四个方法，跟之前自己所写下的四个角度进行对比。&lt;/p&gt;

&lt;p&gt;你会发现大差不差的，我自己想的 4 个方法竟然跟 L 先生提出的 4 个方法是非常类似的，只是它们的顺序有所不同。从而，我就进一步通过 block reference 将它们关联了起来，相当于打通了自己的知识跟学到的知识的关联。&lt;/p&gt;

&lt;p&gt;这也就是双链笔记的最重要的使用场景，没有之一。&lt;/p&gt;

&lt;h2 id=&quot;一我是可以选择的接纳-记录-回顾-行动--写下来&quot;&gt;一、我是可以选择的：接纳-记录-回顾-行动 👉 [[写下来]]&lt;/h2&gt;

&lt;p&gt;当你产生精神内耗的时候，是非常正常的状态。首先你就是去接纳它，接受它。&lt;/p&gt;

&lt;p&gt;人类大脑有一种思维模式叫做「默认模式网络」（DMN: default mode network 的缩写），也就是我们的大脑在什么都不干的情况下，也是在不断运转中的。当你的脑袋里面产生很多的想法或者是负面的想法是非常非常正常的，这是生活的常态，所以你要尝试去接受它。&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;ol&gt;
  &lt;li&gt;第一个就是百无聊赖（boredom）。当我们不去做事情的时候，自然而然地就会产生一种无聊的状态。有一个有趣的实验，房间里空无一人，只有一台微电流电机设备让参与者可以电击自己。那你会想，如果你在这间房间里面，你会无聊到电击自己吗？而实验结果表明，当参与者处于这样无事可做的房间里的时候，67%的男性和 25% 的女性会选择电击自己，甚至有人还会多次尝试。所以说，人类啊这个有趣的物种，哪怕非常好奇地去尝试电击自己，都不愿意在房间里面无所事事。&lt;/li&gt;
  &lt;li&gt;而第二个方面是负性偏向（negativity bias）。比如说，你失去 50 块钱的痛苦，会比你获得 100 块钱的快乐的程度更高。因为消极事件比中性或积极事件更有影响力，需要得到更多的关注。原因也很简单，因为负性偏向会给我们进化带来优势，需要永远识别风险，让这些负性的事件最先被关注。&lt;/li&gt;
  &lt;li&gt;第三个是反刍思维（rumination）。当我们遇到不愉快，我们总是会在脑海里面一遍一遍地回想自己做过的事情，别人对我们做过的事情；或者去憧憬未来那些你想做但还没有来得及做的事情。反反复复，不断纠结于过去和未来，难以释怀，这就是一种反刍思维。我们总是在自我批评，消极地将现状与未尽的目标进行对比，或者是哪怕你做地很好了，你也会不断地反问自己，为什么我不能够做得更好呢。这同样是一种进化的特质，通过反思来找到纠正问题的方法。但凡事都有个度，如果我们一直在寻找错误的根源或其他的解决方法，又造成了另外一种让自己难受的精神内耗。&lt;/li&gt;
  &lt;li&gt;前面提到的百无聊赖、负性偏向和反刍思维都会让我们分心。但第四个心理因素可能才是最残酷的，它就是享乐适应（hedonic adaptation）。无论生活中发生任何事情，你当时有多么地快乐，都会非常快速地回到一切如常的原点。比方说你梦想自己工资能够达到 1 万，但是你真的工资到达 1 万之后，你很快就会适应这种感觉。下个月再发工资的时候，并不会让你变得更加更快乐。即使带来了快乐，这种快乐也会昙花一现地转瞬即逝。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;在大脑 DMN 这种默认的运行状态当中，不满足和不适感会激发我们去不断进化。曾经这种不满足给我们人类带来了进步，如今也让我们犯下了错误。所以，首先要接受这种精神内耗的或者叫分心的感觉。分心只是我们试图逃避不适感的一种方式。当你精神内耗或者遇到负面想法的时候，你首先接受它是正常的。其次你可以记录下来，专门在 Roam Research 里面写下来自己的这些负面的想法。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/09/12/1dcf7d67cfe51bde215e52b0e9e23d50.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;及时地记录自己的负面想法（你可以尝试&lt;a href=&quot;https://www.bilibili.com/video/BV19S4y1v768&quot;&gt;「间歇日记」&lt;/a&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;img src=&quot;https://cdn.sspai.com/2022/09/12/d6c7949fc3f1eb9f1cd935796bf6cdb7.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Unsplash: green leaf on water flow&lt;/p&gt;

&lt;p&gt;另外，对抗分心的一种方式是给自己设置一个阀值，「阀限时刻」指的是我们生活中从一件事情切换到另外一件事情的过渡。比方说你在等红绿灯的时候，就会不自觉地拿起手机，或者是当你用浏览器打开标签页，但因为网速的原因加载过长就感到厌烦了，从而你不自觉地就打开微博或者 Twitter 去刷其他的内容了。&lt;/p&gt;

&lt;p&gt;对于这种切换的过渡时刻，你就可以给自己设一个缓冲阈值，比方 10 分钟，当你产生不适的感觉的时候，不要立马去拿手机或者去刷 Twitter。而是使用「十分钟规则」的技巧，对自己说，「等过了 10 分钟之后我再去刷」。如果过了 10 分钟之后，你仍然有去做某件事情的冲动，那你就去做。但这种情况并不多见，一般在时间段过去之后，你就能够去做自己真正想做的事情了。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;如果你以一种温和的状态、温和的态度去关注消极情绪的时候，消极情绪往往会消失得无影无踪。与此同时，你的积极情绪也会不断增长，有足够的动力去完成你当前想做的事情了。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;永远记得，「我是可以选择的」。首先接纳，记录，重新审视内心的想法，接下来就开始行动或者回归行动。&lt;/p&gt;

&lt;h2 id=&quot;二正念觉察呼吸内观想法--冥想&quot;&gt;二、正念，觉察呼吸；内观想法 👉 [[冥想]]&lt;/h2&gt;

&lt;p&gt;注意力本质上是一种能力，日常你可以通过冥想的方式来训练自己的注意力。意志力并不是一种有限的资源，而是类似于一种情绪的东西。&lt;/p&gt;

&lt;p&gt;实验结果表明，只有那些认为意志力是一种有限资源的受试者，才会出现自我精神损耗的迹象。比方说，我的印象中，在死亡笔记这部动漫里面，L 经常会通过吃糖的方式来提高自己的注意力。我之前也一直以为吃糖或补充葡萄糖就能够让自己更加专注。但其实这是一种心理行为，只有当那些人「以为自己喝了加糖的柠檬水可以提高自己注意力」的时候，才能够真正地增强自己的意志力。由于他们认为糖对自己有影响，吃糖才会产生一种心理安慰，从而就更有动力去做眼前的事情了。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/09/12/89e2378da6eaf28a814b7c53e4f6fc1e.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&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;再介绍一个非常简单的调节方法，就是「觉察呼吸」。当你产生内耗的情绪的时候，你可以亲自试一试：找一个舒适的位置，闭上眼睛，采取 10 秒左右的呼吸，把注意力放到你的呼吸上面，体会呼吸过程中的感觉。不要去管脑海中来来回回的想法，也不要去抑制它们。跟前面提到的「溪流浮叶」想象法也是一样的，想象让自己坐在一条缓缓流动的小溪边，有许多的树叶顺着这条小溪顺流而下，每片叶子都代表着你的想法，它可以是一段记忆、词语，一种担忧，一幅画面。想象自己坐在岸边，看着这些眼前的每片浮叶，打着旋儿漂流而下。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/09/12/d4fbc4ef924db6e7c2f0d36eff973ac3.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Unsplash: woman sitting on cliff overlooking mountains during daytime&lt;/p&gt;

&lt;p&gt;注意，这跟发呆还不太一样，严格意义上来说，发呆并不算冥想，也不等同于冥想。其实，我对冥想粗浅的理解就是 yes and let it go（确认，然后就让它随风而去）。冥想最初源自佛教，而正念是 1979 年由巴卡金博士把这种修习的方式从宗教属性里面剥离出来的。从而，正念指的就是有意识的觉察，专注于当下这一刻，而不附加任何主观的评判。正念摆脱了宗教的性质，结合一些医学研究才提出了 Mindfulness 觉知的概念。&lt;/p&gt;

&lt;p&gt;发呆的时候你的思绪是飘散的，注意力也是分散的。前面提到的 DMN 默认网络模式本质上就是一种发呆的状态，也就是我们的大脑在什么都不干的情况下，它在默认地运转发呆。而冥想是一种锻炼大脑的方式，需要你主动地觉察你在脑海中不停冒出的念头。&lt;/p&gt;

&lt;p&gt;所以，冥想本质上激活的是「任务积极网络」（TPN: task positive network），而对于 DMN 活跃的人来说，如果他们想要集中注意力去专注工作，那么 DMN 默认模式就会不断地去跟 TPN 专注模式争夺注意力资源，从而造成了更多的精神内耗。&lt;/p&gt;

&lt;p&gt;通俗来说，冥想是手动挡，你需要主动地去觉察自己的想法，而发呆则是大脑的自动挡。&lt;/p&gt;

&lt;p&gt;所以，在你做正念冥想的时候，并不是需要完全去消除各种念头，而是去觉察这些念头就好了。就像呼吸一样，你无法停止你的呼吸，但是你可以去观察它，觉察它，并且对这些念头保持非评判的态度。正念就是有意识的觉察，专注于当下这一刻，而不附加任何主观的评判，从而可以帮助到你缓解压力和调解情绪。&lt;/p&gt;

&lt;p&gt;我们可以在日常的训练当中，去培养自己专注于特定想法的能力，而不要任由 DMN 默认网络模式来主宰自己的大脑。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;接下来进入视频的下半部分&lt;/strong&gt;：我会继续分享剩下的 2 个方法，帮助你去提高精神内耗的对抗能力，特别是该如何专注于当下正在做的事情而不会轻易分心。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/09/12/dbd3b8263a3e2a9eff54dde9a97090c3.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/av687930649&quot;&gt;如何克服精神内耗与对抗分心（视频版：下篇）&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;三提高注意力需求多任务切换保持兴趣--拆解&quot;&gt;三、提高注意力需求，多任务切换保持兴趣 👉 [[拆解]]&lt;/h2&gt;

&lt;p&gt;第 3 个对抗精神内耗的策略是提高注意力需求，保持对大脑注意力的转换和饱和。&lt;/p&gt;

&lt;p&gt;那么，什么是注意力饱和呢？简单来说，工作的时候我们为什么会分心？最关键的原因就是我们手头所做的事情无法 100% 地吸引我们的注意力，大脑对它没有足够的兴趣。在注意力不够饱和的情况下，大脑就会产生闲置的注意力资源，从而这些资源会由大脑主动地自动激活了 DMN 默认网络模式，从而使你的注意力从外部的目标转向了内部损耗。&lt;/p&gt;

&lt;p&gt;解决的办法，当然就是提高你对手头在做的事情的注意力需求，从而让注意力达到饱和，这样大脑就不会再去主动激活默认网络模式。&lt;/p&gt;

&lt;h3 id=&quot;通过录制视频抢占大脑注意力&quot;&gt;通过录制视频抢占大脑注意力&lt;/h3&gt;

&lt;p&gt;第一个我觉得还不错的办法，就是通过录视频的方式（或者更进一步以直播的形式），让自己无法停止手头正在输出的过程。录制视频时，你需要在意画面里的头像，或者是正在所处的软件界面等各种情况。这种类似于直播面对面的方式，就是一种非常好的抢占注意力的方式，能够帮助到我更加专注于当前知识输出的任务。由不得自己去想那么多，你必须尽可能把当前这件事情做完。&lt;/p&gt;

&lt;p&gt;通过录视频的方式，可以高强度抢占大脑注意力，防止分心乱逛。深度工作的主要障碍则是将注意力转移到某种浮浅事物上的冲动，从而我们要克服这种障碍，需要刻意练习来避免干扰，高度专注于当前的任务。制作视频，就是这样一种刻意的练习，何乐而不为。&lt;/p&gt;

&lt;p&gt;同时，在我使用录制软件时，会在左上角有一处计时的时间显示。从而我就知道，当前视频的录制花了多少时间，让我有意识地意识到自己的注意力正在何处。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/09/12/04eee06fa7a6b62cdec27b570d76dd18.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;多任务同时推进保持项目切换&quot;&gt;多任务同时推进，保持项目切换&lt;/h3&gt;

&lt;p&gt;第二个增加注意力饱和的方式，则是多任务同时推进，保持项目的切换。&lt;a href=&quot;https://m.douban.com/book/subject/24839553/&quot;&gt;《拖拉一点也无妨》&lt;/a&gt;这本书专门讲了这件事情，叫做「结构化拖延」。来自斯坦福教授的高效拖延术，让你的拖延也变得高效，这个概念在 2011 年还得到了搞笑诺贝尔文学奖，非常地有意思。这本书的总页数都没超过 120 页，所以推荐大家（~在拖延的时候~）拿来读一读。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/09/12/a34e357260fae61f888949c8b4a78c53.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://t.bilibili.com/691248198808764419?spm_id_from=333.999.0.0&quot;&gt;真正有效的战拖小书&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;结构化拖延，指的就是你用一件事情去拖延另外一件事情，哪怕你没完成任务 A 但是你却完成了任务 B。当你在多个任务之间切换的时候，你要保证的是这件事情能够百分百地吸引你的注意力。这跟卢曼的&lt;a href=&quot;https://sspai.com/post/67770&quot;&gt;跟着兴趣走&lt;/a&gt;是一样的，你需要让自己的大脑尽可能的有兴趣地去做当前手头上的工作，同样是一样的哄骗大脑的套路。&lt;/p&gt;

&lt;p&gt;举个例子，在你工作的时候，如果手头在做的事情并不需要花费太多的注意力，那就可以打开多个项目。从项目 1 工作一段时间，切换到项目 2，再工作一段时间，再切换到项目 3，….，让自己的注意力永远保持饱和。换句话说，让你的大脑对当前项目持续地保持百分百的兴趣。&lt;/p&gt;

&lt;p&gt;当你持续地处理同一件任务，过了一段时间后，大脑必定会对它失去新鲜感而感到疲劳，因为你对当前事情已经有了足够的掌握。注意力就会有一部分被闲置出来，从而特别容易造成分心。而此时你要做的，就是用另外一件事情把注意力再次地吸引过来，避免它转向内部，去反刍那些负面的想法。&lt;/p&gt;

&lt;p&gt;L 先生还介绍了另外一个有趣的清单，叫做问题清单，里面记录一些需要持续思考做出决策的一些问题。在碎片时间里，当你无所事事的时候，为了不让注意力转向内部的精神内耗，就可以打开问题清单，随便挑一个问题，开始思考，让它来占据自己的注意力。这跟费曼的 12 个问题也是非常类似的，费曼的原话是，「你需要 12 个最喜欢的问题，让它们不断出现在你的脑海里」。虽然这些问题大部分时间都在休眠，但是当你注意力不够饱和的时候，你就可以用这 12 个问题去占据你的注意力，让你重新燃起兴趣。另外一方面，每当你看到一个新的技能或知识点的时候，你也可以用自己这 12 个最喜欢的问题去测试它，看看是否对 12 个问题的答案有所帮助。&lt;/p&gt;

&lt;h3 id=&quot;tab--enter-细化分解进入下一阶段&quot;&gt;Tab + Enter 细化分解，进入下一阶段&lt;/h3&gt;

&lt;p&gt;第三个避免分心的方法叫做「细化分解」。如果说，你对当前的项目或者目标已经产生不了足够多的兴趣时，我最重要的建议是，你一定要尽快地进入到知识点或者项目的下一阶段。&lt;/p&gt;

&lt;p&gt;比方说，如果你在学知识，那么你就尽可能快地从一级目录学到二级目录，或者是你从当前学科尽快地学到该学科下一层级的子学科。如果你是在做项目，那么就尽可能进入到具体实现的那一层面，比方从功能需求尽快进入到写代码的过程。或者如果你是在写文章，那么就尽快地从大纲阶段进入到写二级标题的阶段。这时候你会发现有更多的细节需要去补充，比方说之前积累的卡片可以快速地摘录过来，或者是这些卡片还需要梳理一个最佳的行文逻辑。&lt;/p&gt;

&lt;p&gt;在这里我给你一个口诀，叫做 Tab + Enter 细化分解。尽快地去细化分解，也就是在推进当前项目的过程，不要停留在宏观，但是又要随时能够回到宏观。举个例子，我来为你_细化_一下「Tab + Enter」：细化和分解并不是同一个意思，在一个大纲式的软件中，细化是 Enter，分解是 Tab。琢磨一下，比方说当我按下 Enter 的时候，我就是在细化当前的项目。&lt;/p&gt;

&lt;p&gt;以本文要解决的问题为例，当我按下 Enter 的时候，我就是在细化问题。我可以把这样一个大问题进行拆解，变成了更细的一些子问题：「什么是精神内耗？为什么要克服精神内耗？克服内耗的好处是什么？」等等。如果我再对每一项按下 Tab，就是进行更细的分解，比如说将「什么是精神内耗？」再分解为「精神是什么？内耗又是什么？」，内耗就是内部的损耗。从而我们就可以持续地把问题进行拆解。「精神是什么？」精神在这里指的就是大脑的思维方式，从而我们就引入了 DMN 默认模式网络和 TPN 专注网络等一些概念。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/09/12/0c911b84287960fd378257a159453690.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;就像这样，快速地进入到当前项目的下一阶段，你就知道你正在深挖问题的核心，并且让你的大脑燃起了新的兴趣点，大脑希望知道下一层级的子问题，寻找更细节的答案。&lt;/p&gt;

&lt;p&gt;提高注意力的需求，让你的大脑注意力持续保持饱和的状态，通过多任务切换的方式保持大脑对当前项目的兴趣。只有当你的大脑对自己正在做的事情产生百分百的兴趣，你才不会有闲置的资源去关心那些内部不断冒出的想法。所以说，我们大脑也是需要被不断哄着去做事情的。&lt;/p&gt;

&lt;h2 id=&quot;四尽管去做优先去做默认去做--行动&quot;&gt;四、尽管去做，优先去做，默认去做 👉 [[行动]]&lt;/h2&gt;

&lt;p&gt;我们可以刻意地通过任务驱动的方式培养自己的成就感受能力，也就是让自己意识到自己已经完成了很多工作，「你已经相当厉害啦」。因为只有去做，才能够去产生成就感，从小开始持续积累自己的成就感，再去挑战大的。&lt;/p&gt;

&lt;p&gt;从前面的分析当中，你可以看到精神内耗的主要问题就是它消耗了我们的动机。动机就是行动的动力，当你缺少了动力，当然就没有那么想去行动了。但是，这句话反过来也是成立的，要克服这种精神内耗，最有效的方式就是去积累自己行动的动力，通过培养自己去行动的习惯。当你行动了，自然就能够获得更多的能量，有了更多的动力了。&lt;/p&gt;

&lt;p&gt;原则，就是你做事的价值观。你可以设置一个非常简单粗暴的原则：如果一件事情你想不到特别有力的不去做的原因，那么就优先选择去做。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/09/12/fa75f789e921affc5e9625ef56a02de8.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Unsplash: Nike #just do it text&lt;/p&gt;

&lt;p&gt;如果你不去做，眼前的项目就永远都是未知，你就永远得不到一些要去做的动力，项目也永远不会得到解决。而根据上文所提到的「反刍思维」，这件事情就会一直停留在你的记忆里面。随着 DMN 默认模式网络的激活，就会进一步地占据你的认知资源。让你不停地去想，不停地去纠结，不停地内耗。而只有当你去行动了，你才会真正地把这些未知变成已知，把不确定变成确定，让这些想法都可以得到安放和处置，不再干扰你当下的思考，让你的大脑启动 TPN 专注模式。&lt;/p&gt;

&lt;p&gt;所以说，现在就动起手来，直接通过 Tab + Enter 的方式在 Roam Research 里面进行细化分解，而这种大纲式的组织结构会成为你的有力助手。大纲的树状结构可以让你不断地放大缩小，就像我经常提到的，Roam Research 就像有焦距的镜头，有微距也有广角，可以看到整棵树的全局或细节。&lt;/p&gt;

&lt;p&gt;行动是你开启正向反馈循环的第一步。很多时候当你去真正行动了，你就会发现原来所恐惧的东西并没有那么可怕。自己先前对她的所有情绪，包括猜测、担忧、焦虑等等，很多都是不必要的。这跟前文「我是可以选择的」第一小节当中，所提到的各种内部的情绪和不适感是相关的，你会发现大脑所产生的这些负面想法都很正常，但没有必要。&lt;/p&gt;

&lt;p&gt;你可以亲自试试，重新审视一下当时所记录下的负面想法：「它是真实的吗？」它不是真实的；「它发生的可能性大吗？」可能性并不大；「我有没有办法可以应对它呢？」我行动了我就可以应对它了。&lt;/p&gt;

&lt;p&gt;所以，尽管去做，优先去做，默认去做，这就是你开始克服自我怀疑和恐惧的第一步，也是你摆脱精神内耗的第一步。&lt;/p&gt;

&lt;h2 id=&quot;总结&quot;&gt;总结&lt;/h2&gt;

&lt;p&gt;我们所有人，每个人都是可以选择的，牢记默念「我是可以选择的」。我们选择接受自己的精神内耗，这只不过是我们大脑的默认工作模式。在漫长的人类进化过程当中，不断反思，不断进步的特征帮助我们的祖先生存下来，我们应该合理地去利用这种思维特征。&lt;/p&gt;

&lt;p&gt;与此同时，我们在日常生活中，也可以通过正念的方式去觉察自己内心的各种想法，积累自己的注意力资源。而在真正做事的时候，为了避免分心，你可以尽可能提高当前任务的注意力需求，并且通过多任务切换的方式让自己的大脑保持兴趣。只有当你对当前任务的注意力足够投入的时候，你才不会分心去做其它事情。只有当你的注意力足够饱和的时候，大脑才不会启动精神内耗的过程。&lt;/p&gt;

&lt;p&gt;最后，当然就是行动起来，给自己设立一个原则，尽管去做，优先就去做，默认就去做！&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;如果你觉得这篇文章（本期视频）还不错的话，请一键三连，如果可以分享的话就更好啦。之后我会给大家做更多相对软一点的知识讲解类的视频，当然也会伴随更多的软件实操的硬核一点的视频。我们下次再见！&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;对了，这篇文章同样是遵循了「先录视频，再写文章」的&lt;strong&gt;知识输出工作流&lt;/strong&gt;。我在录制视频发布 &lt;a href=&quot;https://www.bilibili.com/video/BV11b4y1n7L4&quot;&gt;B 站&lt;/a&gt; 之后，会通过飞书妙记的语音识别自动化生成文章初稿，再配合我记录下来的大纲进行初步修改。至此，文章基本的结构已经成型，我只需要再去补充跟它有关的一些内容和插图，插图可以直接来自我视频的截图，就能非常快速地产出这篇文章啦。&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>【双向链接的前世今生】上都计划与 Roam Research 思维工具</title>
        <link>https://blog.jimmylv.info/2022-05-01-bidirectional-link-past-and-present-project-xanadu-and-roam-research/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2022-05-01-bidirectional-link-past-and-present-project-xanadu-and-roam-research/</guid>
        <pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate>
        <description>&lt;ul&gt;
  &lt;li&gt;（后续）修订版：&lt;a href=&quot;https://jimmylv.noto.so/xanadu&quot;&gt;https://jimmylv.noto.so/xanadu&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;少数派：🔗 &lt;a href=&quot;https://sspai.com/post/72995&quot;&gt;https://sspai.com/post/72995&lt;/a&gt; 🔗&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;对我来说，我在很久之前就一直在探索知识管理、任务管理，这方面是我一直以来非常热衷的兴趣点。本文是我&lt;strong&gt;第一次系统性地介绍双向链接是什么&lt;/strong&gt;，会先为你讲述 &lt;strong&gt;Roam 的 3 个故事&lt;/strong&gt;，然后专注于解释 Roam Research&lt;strong&gt;最核心的 1 个功能&lt;/strong&gt;：双向链接（当然，Roam 还有很多其他好玩的地方）。最后，我会介绍&lt;strong&gt;自己的 2 个应用场景&lt;/strong&gt;，以及什么是 Tools for Thought 和为什么你需要一款思维工具？&lt;/p&gt;

&lt;h1 id=&quot;一roam-的-3-个故事源自上都计划&quot;&gt;&lt;strong&gt;一、Roam 的 3 个故事，源自上都计划&lt;/strong&gt;&lt;/h1&gt;

&lt;h3 id=&quot;故事-1ted-nelson-失落的超文本--上都计划project-xanadu&quot;&gt;&lt;strong&gt;故事 1：@Ted Nelson 失落的超文本 —— 上都计划（Project Xanadu）&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;第一个故事其实是 Ted Nelson（泰德·尼尔森）的故事，上都计划（Project Xanadu）。&lt;strong&gt;1963 年，信息技术先驱、《Computer Lib / Dream Machines》作者 Ted Nelson 发明了「超文本」（hypertext）这一概念。&lt;/strong&gt;但是，此时的超文本跟我们现在所讲的 HTTP 超文本传输协议大相径庭。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/f739d301585145f141d930ff9f8086c2?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/f739d301585145f141d930ff9f8086c2?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在 Ted Nelson 构想的超文本系统中，我们访问的所有的网页或者叫文本，都应该是相互链接的。Xanadu（上都）是一个拥有很富文学意涵的字，马可·波罗（Marco Polo）在他的自传里提到 Shan-Du，指的是忽必烈汗元帝国的夏季之都。1965 年，Ted Nelson 将他发起的超文字构想，依照柯立芝的诗命名为「仙那度计划」（Project Xanadu），因为他认为仙那度是&lt;strong&gt;「一个记忆永远不会被遗忘的神奇地方」&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;但它最终跟我们现在听到的超文本系统是非常不一样的。&lt;strong&gt;1991 年，Tim Berners-Lee（蒂姆·伯纳斯-李）在欧洲粒子物理研究所工作时，提出了一套新的协议超文本传输协议&lt;/strong&gt;（The Hypertext Transfer Protocol，即 HTTP），并且定义了超文本标记语言（HyperText Markup Language，即 HTML），然后才有了 HTTP 1/2 的实现。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/6d51b04daf8286de54441bc7f8b1c8ca?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/6d51b04daf8286de54441bc7f8b1c8ca?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在 HTTP 这套系统里面，其实每一个事物都是有对应的一个统一资源标识符（URL）。但是你有没有想过，&lt;strong&gt;我们每次通过链接点进去，从 A 网页到达 B 网页，那我们又怎么从 B 回到 A 呢？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;在 1991 年之后，基于 HTTP 协议的整个网络我们称之为它为万维网（World Wide Web，即 WWW），这都是我们非常熟悉的概念了，Tim Berners-Lee 也因此被称之为万维网之父。并且，在万维网上诞生了 Google、Amazon、Meta 等一系列大型互联网公司，使其易于连接和交易。&lt;/p&gt;

&lt;p&gt;但是，Tim Berners-Lee 在一系列的连锁事件中，他也开始指责这些公司用广告的名义破坏了网络，凭借平台积累了过多的权力，因此创办了「Inrupt」公司和 Solid 项目，&lt;strong&gt;试图通过建立一个让用户控制自己数据的平台来「重塑互联网」&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/41d988e419e445db2dec9501c9d624a5?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/41d988e419e445db2dec9501c9d624a5?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;而对于 84 岁的 Ted Nelson 来说，「上都计划」是他一直以来的初心，他的个人梦想，直到 2014 年发布了第一个试用版本。「上都计划」的试用版本可以通过这个网页链接 &lt;a href=&quot;https://xanadu.com/xanademos/MoeJusteOrigins.html&quot;&gt;https://xanadu.com&lt;/a&gt; 进入，你将看到一篇宇宙学的文章。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/76e5da8e672d168577dd21980651fd6d?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/76e5da8e672d168577dd21980651fd6d?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;网页的左右两边分别有不同颜色的划分，重点来说中间的这篇文章，其实它是引用了很多其他文章里面的内容。所以，&lt;strong&gt;在 Ted Nelson 最开始的愿景中，就期望通过双向链接在浏览网页的同时，能够把引用不同文章里的高亮能够互相引用起来。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;不同颜色的高亮其实就表达了一种引用关系。当然「上都计划」除了这个引用关系的描述以外，还会有其他的一些构想，比如说版本管理或者增量出版等等，文本就不多作具体介绍了。&lt;/p&gt;

&lt;p&gt;从 1963 年到 2014 年，「上都计划」才发布了它的第一个版本对吧？但是大家有没有想过，它竟然也是发布在万维网上的一个 URL 链接，也就是说&lt;strong&gt;连 Ted Nelson 的最初版本都还是不得已借助于 HTTP 协议来传播，基于万维网去实现它的第一个发布版本。&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;故事-2conor-与-roam-research-双向链接笔记思考工具&quot;&gt;&lt;strong&gt;故事 2：@Conor 与 Roam Research 双向链接笔记/思考工具&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/da943fc3721bb0e1df40b6459fde1da0?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/da943fc3721bb0e1df40b6459fde1da0?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;第二个故事就要讲到 Conor，也就是 Roam Research 的创始人，他在 2019 年的时候推出了 Roam Research，掀起了双向链接笔记工具的浪潮。但其实在 Roam 的官网上，一直将 Roam Research 称之为一个「网状思维工具」。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/49c31b272b13899126e7efc2bba66f8a?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/49c31b272b13899126e7efc2bba66f8a?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;首先，Roam 是可以在一定程度上模拟前文提到的「上都计划」，不同页面之间可以相互链接，与此同时也有社区的&lt;a href=&quot;https://twitter.com/i/status/1272600877493137408&quot;&gt;设计师 Azlen&lt;/a&gt; 在 Roam Research 里面实现了 Block 块与块之间能够互相链接的可视化，不同的页面之间会有段落和段落之间的联系，而这些联系通过高亮的方式链接起来。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/7a389c191c86d497bd16c2c6df98b5ce.gif&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/7a389c191c86d497bd16c2c6df98b5ce.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV17Y4y1h7u8?spm_id_from=333.999.0.0&quot;&gt;Azlen Roam Style: “parallel pages, visibly connected”&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;那在 2019 年推出 Roam 之后，2020 年双链笔记最火热的同时，特别是资本也是非常狂热的，Roam Research A 轮融资 900 万美元，估值两亿多美元，最新的&lt;a href=&quot;https://www.enterprisetech30.com/&quot;&gt;这个报道&lt;/a&gt;，显示的总计融资应该是 1240 万美元。&lt;/p&gt;

&lt;p&gt;虽然体量很小，但是 Roam Research 却受到了资本的狂热的追捧，有十几家公司及个人参与了 Roam 的 A 轮融资，包括 Stripe 联合创始人 Patrick 和 John Collison、True Ventures 和 Lux Capital 等非常知名的一些资本。&lt;/p&gt;

&lt;p&gt;当然，除了狂热的资本以外，Roam 也拥有一个非常狂热的社区，我们通常来说都称之它为 #roamcult 类似宗教的一个概念。这里有一个蛋糕，就是用户自行制作的 Roam Research 界面的蛋糕。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/9edf899450a3a0329b4e15c2cb86970a?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/9edf899450a3a0329b4e15c2cb86970a?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;然后与此同时，甚至还有人把 Roam Research 的 LOGO&lt;strong&gt;𐃏&lt;/strong&gt; 符号纹到了身上或者腿上，我至少在推特上见过 5 个这样的狂热份子。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/ce06c1211e789a66476b70208db9ea47?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/ce06c1211e789a66476b70208db9ea47?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;故事-3jimmylv-与-roamcn-社区探索未来工作&quot;&gt;&lt;strong&gt;故事 3：@JimmyLv 与 RoamCN 社区，“探索未来工作”&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;第三个故事是我自己的一个故事，我其实是在 2019 年初次知道双向链接，遇见 Roam Research，然后在 2020 年跟另外两个区块链领域的小伙伴（Jessie、Victor）共同创立了 &lt;a href=&quot;https://github.com/JimmyLv/roam-cn.github.io&quot;&gt;RoamCN 中文社区&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/f4a70297fe40826c75570c05b945133d?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/f4a70297fe40826c75570c05b945133d?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;前文提到我自己的兴趣点，关注知识管理已经很长时间了，而 Roam Research 提供的双向链接刚好解答了我探索已久的困惑。与此同时，在中文社区，特别是对于我自己而言，我也在寻找很多的一些同路者，大家一起来学习探讨新的工具，一个极具突破性的工具。所以，我就不断地在使用这款工具来管理我的日常，不管是做项目或者是写文章、做视频等等。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1m44y1V7EG?spm_id_from=333.999.0.0&quot;&gt;「逍遥漫游，即时创作」&lt;/a&gt;是我最近在合桃派的一次直播，也是我使用 Roam Research 两年多的经验总结，分享的内容会比较详细啦，也可以推荐大家去看看。另外在 B 站上面，我有做过六十多个视频，也是一个不断输出不断学习的一个过程。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/0d0f950993efe4007c65d640ace2ad7a.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/0d0f950993efe4007c65d640ace2ad7a.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;特别好玩的是，&lt;strong&gt;在 2020 年我也因为对 Roam Research 的探索和学习，积累了一些工作机会&lt;/strong&gt;。包括当时我去阿里，跟面试官聊的时候也聊到了 Roam Research，而在 2022 年 2 月 22 号，我加入了一家纯远程办公的公司（&lt;a href=&quot;https://parabol.co/&quot;&gt;Parabol.co&lt;/a&gt;），开启了新的「完全在家办公」的工作方式。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/07/80552fbdf009246ace297c2f130f1350.gif&quot; alt=&quot;https://cdn.sspai.com/2022/05/07/80552fbdf009246ace297c2f130f1350.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.parabol.co/&quot;&gt;Parabol.co - Build the Future of Work&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;所以说，Roam Research 这样一款新工具不光是承接了我自己的一个兴趣，也让我有了一个“探索未来工作”的机会。其实我也是非常感激这些机会，特别是我遇到了很多非常好玩有趣的人，特别是像字节跳动、小米、微软、阿里巴巴的高层（我平常不可能接触到的那种）都注意到了双向链接，并且推进了相关产品的研发。&lt;/p&gt;

&lt;p&gt;这三个故事分享完，我们可以对双向链接有了一个基本脉络，&lt;strong&gt;双向链接这个概念它并不新颖&lt;/strong&gt;，其实在 1963 年就由 Ted Nelson 发布了「超文本」（hypertext）一词，此时超文本的原本概念就已经包含了相互链接。而&lt;strong&gt;直到 2022 年 Roam Research 推出之后，双向链接的概念才被普通人接触到&lt;/strong&gt;，包括印象笔记等等这样的很多知识管理工具都开始跟进设计。&lt;/p&gt;

&lt;h1 id=&quot;二roam-的-1-个核心双向链接&quot;&gt;&lt;strong&gt;二、Roam 的 1 个核心：[[双向链接]]&lt;/strong&gt;&lt;/h1&gt;

&lt;p&gt;接下来我会介绍在 Roam Research 里面，双向链接到底是一个什么东西，以及我为什么会对双向链接以及社区为什么会对双向链接如此的热衷。&lt;/p&gt;

&lt;h3 id=&quot;0-思想即技术-thought-as-a-technology&quot;&gt;&lt;strong&gt;0. 思想即技术 Thought as a Technology&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;首先想给大家介绍一个概念，就是「思想即技术」。在我们没有这个高速摄像机的时候，我们会怎么样去描述一个子弹穿过某些物体的呢？其实我们是没有任何手段去描述它或者说去观察这个过程的。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/b391583bf40650e39475d4c6dfa5d2cc?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/b391583bf40650e39475d4c6dfa5d2cc?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;在高速摄影机出现之后，我们就相当于有了一种新的认知元素。&lt;a href=&quot;http://michaelnielsen.org/&quot;&gt;Michael Nielsen&lt;/a&gt; 物理学家在 &lt;a href=&quot;https://cognitivemedium.com/tat/index.html&quot;&gt;Thought as a Technology&lt;/a&gt; 这篇文章提到 Tools for Thought 就是思维层面的工具，当我们拥有了一个新的认知元素，就可以在更低维度或者说在不同的维度去观察，那些以前我们觉得非常习以为常的一些元素，或者是概念、事物。&lt;/p&gt;

&lt;p&gt;就像唐·诺曼提到，&lt;strong&gt;人们其实高估了自己独立思考的能力&lt;/strong&gt;。我们的大脑如果没有像双向链接这样的思维工具作为外部的辅助，我们的思考、推理其实都是会受到限制的。那如果我们有了这样能够提高认知能力的外界辅助工具，我相信大家的这种思考或者是推理能力都会得到提升。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;唐·诺曼，全球最具影响力的设计师，《设计心理学》的作者，苹果的前用户体验架构师，在他的《Things That Make Us Smart 让我们变聪明的事情: 在机器时代捍卫人类属性》一书中提到：「人们高估了独立思考的能力。 没有外部帮助，记忆、思维和推理都会受到限制… …真正的力量来自于设计能够提高认知能力的外部辅助设备。」&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;1-页引用-时空隧道&quot;&gt;&lt;strong&gt;1. 页引用 [[]]，“时空隧道”&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;Roam Research 的第一个概念就是页引用，大家接触双向链接之后最常见的双中括号的符号就是页引用。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/14c2ba4427203452534e47577e5fc725?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/14c2ba4427203452534e47577e5fc725?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如图所示，首先我们在 [[October 12th, 2019]] 页面上写下了自己的一些想法，然后我们可以通过双括号的方式直接新建一个页面 [[Grant Proposal v3]]，然后从这个页面上就可以直接跳转过去。而在 [[Grant Proposal v3]] 页面下方会显示对应的一个反向链接，&lt;strong&gt;所谓的双向链接就是包括正向链接和反向链接。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;如果说大家对这个概念不是特别了解，我就抽象了一个相对来说更熟悉的一个概念，叫「时空隧道」。比如说你可以从今天穿越到 50 年之后或者是 3 年之前&lt;strong&gt;（时间）&lt;/strong&gt;，或者从今天穿越到一个对应的页面，你还可以在不同的页面当中进行穿梭&lt;strong&gt;（空间）&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;文字解释起来非常苍白，我在下方准备了一个视频，从任意的地方打开一个传送门，就可以直接穿越过去，这在一些解密游戏里面是非常常见的。比如说上方的锯齿机关就要压到你，进入传送门就直接从这一端穿越到了另外一端，恭喜通关。&lt;/p&gt;

&lt;iframe src=&quot;https://player.bilibili.com/player.html?aid=981148661&amp;amp;bvid=BV1W44y1372M&amp;amp;cid=590201730&amp;amp;page=1&quot; title=&quot;iframe embed&quot; height=&quot;467px&quot; width=&quot;100%&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;这个就很像&lt;strong&gt;奇异博士的超能力，能够直接打开一个时空门或者叫哆啦 A 梦的任意门，你就可以随意地从时间上和空间上进行一个穿梭。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;好，这是第一个双向链接的一个解释，特别是在 Roam Research 里双向链接的用途之一。当然页引用还有其他用途，我会在第三部分，也就是我自己的两个使用场景上给大家具体去解释。&lt;/p&gt;

&lt;h3 id=&quot;2-块引用-蜘蛛丝&quot;&gt;&lt;strong&gt;2. 块引用 (())，“蜘蛛丝”&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;下一个双向链接的应用场景就是块引用。比如说我们在一个页面上有很多很多的节点或者叫段落，我们在写文章的时候，会期望把另外一个页面上的某一个段落直接摘录过来。&lt;/p&gt;

&lt;p&gt;那就可以&lt;strong&gt;通过两个圆括号 (()) 直接把对应的段落 “拉”过来&lt;/strong&gt;，比如说我用圆括号搜索刚刚写的「页引用」内容，你会发现它可以搜索到之前我写过的所有内容，然后直接把它拉过来。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/fdf84391cb9a6aada7e81155fa29888e.gif&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/fdf84391cb9a6aada7e81155fa29888e.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;相应的，在块级别右上角有一个 reference 的数字，如果点一下就会发现又回到了刚刚讲页引用的出处，建立了块级别的「时空隧道」，也就是段落级别或者叫 Block 块级别的一个双向链接。&lt;/p&gt;

&lt;p&gt;块级别的双向链接，我更期望说用“蜘蛛丝”的具体概念来给大家映射一下，或者叫类比一下。比如说我们想要拿到一个东西，我们并不需要直接跑到那个页面上去，而是&lt;strong&gt;直接通过圆括号 (()) 的方式直接就把它拉过来了，就像蜘蛛侠弹出蜘蛛丝，然后就把这个内容来拉过来&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/7463a06f6f9020c5d07b6aa994c9986f?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/7463a06f6f9020c5d07b6aa994c9986f?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;3-动态块-乐高马达&quot;&gt;&lt;strong&gt;3. 动态块 ``，“乐高马达”&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;下一个在 Roam Research 里面的概念是「动态块」，比如说我在视频中最开始的时候有提到过一个计时器，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;就是通过花括号&lt;/code&gt; 的方式直接创建出来的。&lt;/p&gt;

&lt;p&gt;我可以把「动态块」类比成「乐高马达」，乐高这家公司确实&lt;del&gt;X&lt;/del&gt;炸天，乐高机械组 1:1 比例完整还原全球时速最快的量产超跑——BUGATTI CHIRON。布加迪首席试车员更将这辆独一无二的超跑开上了跑道，真正意义上实现了机械传动的无限可能，完成了“让积木跑起来”的惊艳挑战。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/83b8783a0ef7380433a6a946bd83cffe?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/83b8783a0ef7380433a6a946bd83cffe?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;那么这辆车里面是用到了真正的「乐高马达」，因为乐高其实会有动态的和静态的两种，我们平常接触到的可能都是静态的，但其实是有一些动态的模块可以作为马达来使用的，从而你可以创作出更多的好玩的东西。&lt;/p&gt;

&lt;p&gt;那这里我给大家举一个具体的例子，比如说我可以通过花括号加上一个 video 的特殊标识 ``，然后再输入视频的链接，这个 block 就会变成了一个动态的，可以显示 YouTube 视频的「动态块」，从而还可以播放视频，插入时间戳记录笔记，进行功能上的交互。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/7ff5a38e79db8d152727d3891cfc8404.gif&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/7ff5a38e79db8d152727d3891cfc8404.gif&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;为什么说-roam-research-是一款思维工具而非笔记工具&quot;&gt;&lt;strong&gt;为什么说 Roam Research 是一款思维工具，而非笔记工具？&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;所以说，&lt;strong&gt;Roam Research 被称之为一款思维工具&lt;/strong&gt;，而不仅仅只是一款笔记工具的原因就在于&lt;strong&gt;基于 Block 的可编程性&lt;/strong&gt;。首先就是前文提到的每一个 block 每一个段落都可以单独去拖动和处理，并且它可以单独显示，单独执行，可以被引用，可以被拉取。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;万物皆可 Block&lt;/strong&gt; 这个概念在使用 Roam Research 之前也有很多工具，包括 Notion、Microsoft Loop 等等，不得不说 &lt;a href=&quot;https://www.microsoft.com/en-us/microsoft-loop?ms.url=microsoftcommicrosoft-loop&quot;&gt;Loop&lt;/a&gt; 的宣传片确实是让我垂涎欲滴等了好久，确实做得非常非常漂亮，也是我 2022 年最期待的一个产品之一。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/ea6b7fe2981d82767d0ccc8bc6d641bc.gif&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/ea6b7fe2981d82767d0ccc8bc6d641bc.gif&quot; /&gt;&lt;/p&gt;

&lt;p&gt;每一个元素都是可以单独拖拽、编辑和显示，并且具有很强的可交互性，你就可以像搭建乐高一样去搭建属于自己的知识操作系统，可以实现看板、 Table 等等各种各样的子系统，让它们去帮助你去做任务管理、知识管理等工作。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;而 Roam Research 在使用体验上最大的特点，就在于它让我们写作跟“写代码”一样&lt;/strong&gt;，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[]]&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(())&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;。我们只需要通过简单的中括号 `[[]]` 去跳转到之前记录下的一些笔记页面或者叫卡片标题；我们可以通过圆括号 `(())` 来搜索之前包含关键词的一些段落内容；最后，我们还可以用花括号&lt;/code&gt; 来实现一些特殊用途的动态元素，比如说前文提到的番茄钟，就会变成了一个时间的按钮，我可以点击它，然后进行一个倒计时。&lt;/p&gt;

&lt;h1 id=&quot;三我的-2-个应用场景输入输出&quot;&gt;&lt;strong&gt;三、我的 2 个应用场景：输入/输出&lt;/strong&gt;&lt;/h1&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/ae89324a1ebc3e5ed818887da292a824?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/ae89324a1ebc3e5ed818887da292a824?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;首先，我们需要有一种思维的辅助工具，比如说像高速摄像机一样，&lt;strong&gt;当我们拥有了双向链接这样一个思考工具，或者叫新的认知元素，就能辅助我们在思维上有所提升，辅助你去思考，辅助你去推理。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;「时空隧道」我们可以从今天跳到明天，跳到 50 年之后，也可以用它来串联起不同概念之间的一个联系。比如说我在准备这一次分享内容的时候，其实是有关联到到之前的一些页面的，比如说「探索未来工作」这个页面，跟今天要讲的内容就是串联起来的。这样产生的一个局部的知识图谱，就是双向链接的一个可视化效果。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/a0940c3c677d9b241f7ac1f75849dbaa?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/a0940c3c677d9b241f7ac1f75849dbaa?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;而当我们使用块引用的时候，我们可以把不同页面的段落快速地组装起来，像搭乐高一样把积木块搭起来，那就可以用到「蜘蛛丝」去快速拉取自己想要调取的内容。&lt;/p&gt;

&lt;p&gt;另外还可以通过「乐高马达」来实现知识的编程，Roam Research 内的 Block 并不是静态的，而是可能能够像乐高里面的马达一样“转动”起来。&lt;/p&gt;

&lt;p&gt;所以，拥有了这样一款思维工具，我们应该怎么样去使用它呢？接下来就进入到我的下一个话题，就是我是怎么去使用 Roam Research，怎么样在具体的场景中去使用它。&lt;/p&gt;

&lt;p&gt;通过最简单的输入、输出模型将其分为两个部分，&lt;strong&gt;第一个是输入，我是怎么读书记笔记的，第二个则是怎么样高效地去产出，用自己的卡片盒快速地产出我要分享的内容、我要写的文章等等&lt;/strong&gt;。&lt;/p&gt;

&lt;h3 id=&quot;1-逍遥输入---读书记笔记&quot;&gt;&lt;strong&gt;1. 逍遥输入 - 读书、记笔记&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;所以，第一部分我会来讲读书记笔记的过程。可能之前大家都已经听说过卡片盒笔记法，甚至还有本书叫《卡片笔记写作法》，书中有一个最核心的观点，就是「不写，就无法思考」。那我们可以以读这本书为例，来简单讲解一下阅读+记笔记的过程。&lt;/p&gt;

&lt;iframe src=&quot;https://player.bilibili.com/player.html?aid=726118391&amp;amp;bvid=BV1NS4y1Y749&amp;amp;cid=588113838&amp;amp;page=1&amp;amp;t=1138&quot; title=&quot;iframe embed&quot; height=&quot;467px&quot; width=&quot;100%&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;点击跳转时间戳 18:58&lt;a href=&quot;https://www.bilibili.com/video/BV1NS4y1Y749?t=1138&quot;&gt;https://www.bilibili.com/video/BV1NS4y1Y749?t=1138&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;（这一段的文字描述同样过于苍白，还是推荐大家去看我在视频中的演示，我尽力了，🤣）&lt;/p&gt;

&lt;p&gt;首先，我会新建一个单独的 Graph 来存放要读的书，《卡片笔记写作法》就是其中一本。那么在读书的时候，双向链接可以怎么样帮助到我们呢？比如说我们在读第一章的时候遇到一些概念，以「心流」概念为例，我就可以给[[心流]]加上中括号，也就是双向链接。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/7b9f1d68a12c60f9bbf15256e3ec5107?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/7b9f1d68a12c60f9bbf15256e3ec5107?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;此时我再点进[[心流]]这个页面，我就可以点开 Unlinked References 看到跟「心流」相关的内容，也就是在这本书里面的其他章节也提到了心流这个概念。所以说，&lt;strong&gt;每当我遇到了一些新的概念，我就会把新的概念加上中括号，从而就可以探索性地去发现这本书里面有哪些跟这个内容相关的。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;如果将这个过程总结一下的话，区别于以前「线性地」根据章节去读这本书的过程，&lt;strong&gt;相反，我们其实是在跟作者进行一个交流，然后在交流的时候，还原作者脑海中原来的「网状结构」。&lt;/strong&gt;认知科学家史蒂芬·平克曾经说过，他是从写作者的角度来说的：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;「写作之难，在于将网状的思想，通过树状的句法，用线性的文字展开。」&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;每当作者写成一本书，写成一篇文章，其实是&lt;strong&gt;将自己在大脑中原本互相链接的网状结构，必须只能「局限性地」通过文字这种的线性方式进行展开。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;所以，当我们在 Roam Research 阅读一本书的时候，就更像是在与作者跨时空交流，根据自己的兴趣点向作者提问。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/f8346771ba0d47aecd22ad6c3c63338e?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/f8346771ba0d47aecd22ad6c3c63338e?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;而我在提问交流的同时，我会使用 roam/comments 功能记录下自己的「闪念笔记」。这些笔记一方面会自动记录到某一天的 Daily Note，从而我&lt;strong&gt;可以通过「时间隧道」穿越到当时我读这本书的那一天&lt;/strong&gt;。另一方面，也可以&lt;strong&gt;通过「空间隧道」穿越到我当时读这部分的具体内容是什么&lt;/strong&gt;，以及当时我的想法灵感是什么。&lt;/p&gt;

&lt;p&gt;当我通过双向链接回到到原文对应段落的位置时，我又可以重新去查看它的上下文。&lt;strong&gt;划重点，这里有个很重要的概念就在于&lt;a href=&quot;https://sspai.com/post/69387&quot;&gt;「上下文」&lt;/a&gt;。&lt;/strong&gt;当我根据自己的笔记无法得知当时我在阅读的是哪部分的时候，我可以通过双向链接的反向链接直接回到当时读书的这个出处，从而我能够去得知当时在书中原有的意思是什么。&lt;/p&gt;

&lt;p&gt;这基本上就是跟&lt;strong&gt;一个作者&lt;/strong&gt;在&lt;strong&gt;一本书&lt;/strong&gt;里面交流的过程。其实我还有个想法，期望以一个主题阅读的方式去同时读&lt;strong&gt;多本书&lt;/strong&gt;的，在《如何阅读一本书》中称之为「检视阅读」。如果说，我把&lt;strong&gt;多本书&lt;/strong&gt;同时导入到 Roam Research 里面，比如说把认知科学的一些书全部放到一块儿呢？&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/3fc2a9663f92ca59c2ac26d5e7c99b3a.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/3fc2a9663f92ca59c2ac26d5e7c99b3a.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&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;全部导入到 Roam Research 里面，是不是就像&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;img src=&quot;https://cdn.sspai.com/2022/05/02/f01fb2f64407b486333aa0861327f7f0.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/f01fb2f64407b486333aa0861327f7f0.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;2-高效产出---卡片盒块引用&quot;&gt;&lt;strong&gt;2. 高效产出 - 卡片盒、块引用&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;接下来我再讲第二个部分就是高效产出。当我们在读书、记笔记之后，我更希望的是能够高效产出。我在记完笔记卡片之后，会将卡片放入卡片盒，通常来说我会将卡片盒一直显示在侧边栏，里面存放了非常非常多的卡片内容。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/78dfe249dc0cabee0fbb94fc7e8bb56b.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/78dfe249dc0cabee0fbb94fc7e8bb56b.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;卡片笔记我会通过一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;#关键词&lt;/code&gt;+`` 的方式组织起来，&lt;strong&gt;最最重要的是右边的引用符号，显示的数字代表着我有几个地方关联起了这张卡片，也就是说这些知识卡片就是相互链接的，形成了一个网状结构。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/912871400e0422fa04bfbdc4a804f348?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/912871400e0422fa04bfbdc4a804f348?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;那么，当我需要产出或者写文章的时候，我就可以利用「块引用」，非常方便地去创建草稿，再基于草稿内容，我就能非常方便地去修改最终的产出。&lt;/p&gt;

&lt;iframe src=&quot;https://player.bilibili.com/player.html?aid=726118391&amp;amp;bvid=BV1NS4y1Y749&amp;amp;cid=588113838&amp;amp;page=1&amp;amp;t=1550&quot; title=&quot;iframe embed&quot; height=&quot;467px&quot; width=&quot;100%&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;点击跳转时间戳 25:50&lt;a href=&quot;https://www.bilibili.com/video/BV1NS4y1Y749?t=1550&quot;&gt;https://www.bilibili.com/video/BV1NS4y1Y749?t=1550&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;（同样，这一段的文字描述同样过于苍白，还是推荐大家去看我在视频中的演示，我尽力了，🤣）&lt;/p&gt;

&lt;p&gt;比如说我要做一个分享，就会在卡片盒里面去寻找相关的卡片，可以通过 Alt + 鼠标直接把卡片内容从侧边栏的卡片盒拖入当前的项目页面。&lt;strong&gt;借助于卡片盒，可以非常快速地生成我想分享的一些内容，然后再对内容进行一个改写。这样产出文章的速度是非常之快的，且符合「快写慢改」的认知写作模式。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;比如说我在 B 站做视频，也会采用这样的过程来快速产出这个大纲，再把它通过录屏的方式讲解出来，而产出的视频又可以&lt;a href=&quot;https://www.bilibili.com/video/BV1rq4y1i7Kr/&quot;&gt;通过语音识别自动生成文稿&lt;/a&gt;，再对其进行润色就能产生一篇高质量文章。&lt;/p&gt;

&lt;p&gt;另外，在我平常做项目的时候，其实也会使用类似的非线性方式。比如说我最近新上手公司的技术栈，我之前是没有用过 GraphQL 和 Relay 相关的一些技术。&lt;strong&gt;那么，首先我需要理解问题，再去确定它的验收条件，在一个非线性的模式下去边学边做 Learning by Doing。&lt;/strong&gt;在这个例子中，首先我去学习什么是 Suspense，什么是 Entrypoint 模式，在学习的过程中会遇到很多很棒的文章，又会边读边做笔记，从而就是这样磕磕碰碰「非线性」地去完成开发需求。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/e57267cf3caf57c601536507cd615514?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/e57267cf3caf57c601536507cd615514?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;总结一个框架叫做「人、事、果」，因为在整个开发的过程当中，比如说我会提到一些人或者一些事，比如说我会在很多提到同事 @Matt，而我每次只需要进入到 [[@Matt]] 这个页面，Roam 就会自动汇总我总共跟他有哪些联系，比如说我哪天跟他有 1:1 会议，或者是我需要有什么东西想要寻求他的帮助，就可以批量地一次性解决。&lt;/p&gt;

&lt;p&gt;其实，&lt;strong&gt;「人、事、果」就是可以把人、事情和结果全部都链接起来&lt;/strong&gt;，就很像一些在线协同工具，像飞书、钉钉、Microsoft Teams 都在尝试将组织、文档和目标链接起来，但可能都没有做到真正的双向链接。这样的话，公司在评估项目结果的时候，就可以看到有哪些人参与进来了，然后有哪些事情（“一事一文档”）被完成了，并且这这些事情所对应的人和目标其实也是非常清晰的。&lt;/p&gt;

&lt;p&gt;所以，双向链接在这样的使用场景下，是能够帮助我们去了解&lt;strong&gt;关于某个项目、某个人或者某个目标更多的上下文，并且只有链接在一起，才构成了一个完整的上下文。&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;最重要的是积累模板eg-九宫格&quot;&gt;&lt;strong&gt;最重要的是，积累模板：e.g. 九宫格&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;另外就是做决策，我们讲高效产出或者叫输出，&lt;strong&gt;「输出」并不一定是写文章或者是做视频，其实更大的作用是帮助你去做出更好的决策。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;我平常会积累一些模板，&lt;strong&gt;每当我需要做一个决定，第一件事情应该去扩充自己的可选项。&lt;/strong&gt;面对选择，其实不只有 A 或者 B 这两个选项，而是有更多可能的选项。比如说当我思考直播分享要不要开摄像头，原本的答案可能只有「开」和「不开」这两个选项，但其实我还可以思考一下，摄像头是不是买好一点？或者我可以开美颜？甚至是换上正式一点的衣服？&lt;/p&gt;

&lt;p&gt;当我思考了更多的可能性，最终的决定可能是「换上正式的衣服，再开一个美颜」。这样的话，是不是比我们最开始选择「开与不开」的某一个选项会更加好一点的？&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/article/bbc5d4c0b28f8acc24422396a19ad3a2?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/article/bbc5d4c0b28f8acc24422396a19ad3a2?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;最重要的是，Roam Research 是一个思考工具，而思考需要模型或者模板的辅助。&lt;/strong&gt;我们在整个产出过程当中应该多去积累自己的一些知识晶体，也就是知识的沉淀，并且在实际中去不断运用它，迭代它。&lt;/p&gt;

&lt;p&gt;我在 roam/templates 和 &lt;a href=&quot;https://roamjs.com/extensions/smartblocks&quot;&gt;roam/js/smartblocks&lt;/a&gt; 里面积累了很多的自动化模板，比如说写文章、晨间日记、每日计划、Weekly Review 或者是深度工作的时候，都可以有一些模板。这其实是一种&lt;strong&gt;「思维算法」（ Algorithms of Thought），也是一种思考的自动化。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这些积累的模板是我的一个外置辅助，也就是刚刚提到的思考工具，就像高速摄像机一样，能够辅助我去做更好的内容产出，或者说加速我做事的过程。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/413374a412a0e7212705856319ea27d0.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/413374a412a0e7212705856319ea27d0.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;再举一个例子叫九宫格。通常来说我会用九宫格的方式去思考要完成的项目，这次演讲的过程也是用九宫格快速地做出来的，&lt;strong&gt;「中心」就是我的主题&lt;/strong&gt;：「做一场贼有意思的直播」，再通过南东北西这样的方式&lt;strong&gt;建立一个大纲式的「初心」&lt;/strong&gt;，最后从西南、西北、东北、东南四个角这样的方式来&lt;strong&gt;补充细节，也就是「细心」&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;这样的思考框架，可以帮助我更快地去思考，并且考虑整个产出的全面性。九宫格是我觉得非常有用的思考方式之一，而&lt;strong&gt;只要日常不断积累和迭代思考的模板，就能通过模板加速你输入和输出的效率。&lt;/strong&gt;&lt;/p&gt;

&lt;h1 id=&quot;为什么是我believer-of-tools-for-thought&quot;&gt;&lt;strong&gt;为什么是我？Believer of Tools for Thought&lt;/strong&gt;&lt;/h1&gt;

&lt;p&gt;在前文的九宫格规划截图中，我就提到了我最希望的是认识更多的人，能够跟大家互相去学习和交流。因为我非常喜欢的一句话，&lt;strong&gt;「在成长的同时帮助他人成长，在学习的同时帮助他人学习」&lt;/strong&gt;。学习和知识管理是息息相关的，这也是我在最开始的时候提到我为什么对学习方法和知识管理这件事情非常的热忱。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/c594f0a4c0a73954c4c13ab93dd1cf26.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/c594f0a4c0a73954c4c13ab93dd1cf26.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;而 Roam Research 就是目前最好用的双向链接笔记工具，没有之一。我也是买了它 5 年的 Believer 版本，500 美元也就是一次性付费人民币 3000 多，但我所获得的成长价值已经远超于此。&lt;/p&gt;

&lt;p&gt;另外，我也做了很多相关的视频，有兴趣的话大家可以&lt;a href=&quot;https://space.bilibili.com/37648256&quot;&gt;去 B 站上关注一波&lt;/a&gt;。如果大家对知识管理感兴趣，想要跟我交流，也可以加我的&lt;a href=&quot;https://jimmylv.noto.so/roam#98288bff51c646f6aa0899649cbc89cc&quot;&gt;微信&lt;/a&gt;。另外我在&lt;a href=&quot;https://sspai.com/u/jimmylv/posts&quot;&gt;少数派&lt;/a&gt;上也有很多文章都是讲 Roam Research 以及思考工具和知识管理相关的，大家也可以去查看一下。&lt;/p&gt;

&lt;h1 id=&quot;彩蛋如果浏览器能够直接内置双链笔记呢&quot;&gt;&lt;strong&gt;彩蛋：如果，浏览器能够直接内置双链笔记呢？&lt;/strong&gt;&lt;/h1&gt;

&lt;p&gt;我在探索双向链接的过程中，一直在纳闷&lt;strong&gt;为什么浏览器就没有动力去实现网页之间的双向链接呢？&lt;/strong&gt;直到我看到了 &lt;a href=&quot;https://beamapp.co/&quot;&gt;Beam&lt;/a&gt;，我在&lt;a href=&quot;https://www.bilibili.com/video/BV1iY4y1Y7z5/&quot;&gt;B 站视频&lt;/a&gt;中介绍了这个内置双链笔记的新型浏览器，有一个非常顺畅的交互体验在于，按住 Alt 可以直接对网页内容进行摘录，并且可以选择摘录到某一个页面。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/009b62a368ded4ab4d2cb0e7b2dfc29f.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/009b62a368ded4ab4d2cb0e7b2dfc29f.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;但是，我在视频中也吐槽了为什么 Beam 浏览器没有做到极致，是因为&lt;strong&gt;当我们回到「被摘录的网页」时，Beam 在右侧并没有任何地方去显示我在针对这个网页所做的笔记。&lt;/strong&gt;它虽然建立了摘录笔记的快捷方式，但遗憾的是也未能做到反向的链接，而这其实是实现了至少在我个人层面，我觉得最有价值的一个功能。&lt;/p&gt;

&lt;p&gt;如果现阶段有浏览器能够实现任意网页和任意笔记之间的双向链接，我愿称之为“Dream Browser”！目前来看，Microsoft Edge 的集锦功能最有希望，毕竟已经有了一定的基础。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;如果能够实现「个人」的笔记跟「互联网」的网页之间的互相链接，那么也就回到了我最初所讲的「上都计划」，Ted Nelson 的最终愿景可能算是在一定程度上得以实现。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/05/02/ad0677affff48a2db900ab240081d28e.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;https://cdn.sspai.com/2022/05/02/ad0677affff48a2db900ab240081d28e.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这绝对是非常非常牛逼的一件事情，也是 Ted Nelson 在 1963 年最初的构想里面，就思考过和想要做的「一个记忆永远不会被遗忘的神奇地方」。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;只是，互联网是人类历史的一段弯路吗？&lt;/strong&gt;&lt;/p&gt;

&lt;h1 id=&quot;参考资料&quot;&gt;&lt;strong&gt;参考资料&lt;/strong&gt;&lt;/h1&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1NS4y1Y749/?spm_id_from=333.788&quot;&gt;视频版【双向链接的前世今生】上都计划与 Roam Research 思维工具&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://help.flomoapp.com/thinking/pkm.html&quot;&gt;@少楠 - 🗄 个人知识管理指南 flomo 101&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/22015922&quot;&gt;@离线杂志 - Issue 23 上都计划——失落的超文本 - 知乎&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/142356397&quot;&gt;@Conor 革命性思维工具：Roam Research 白皮书 - 知乎&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://zhuanlan.zhihu.com/p/49058762&quot;&gt;“万维网之父”年过花甲创业，皆因对互联网现状的震惊和失望 - 知乎&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.huxiu.com/article/350854.html&quot;&gt;互联网是人类历史的一段弯路吗？-虎嗅网&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
      </item>
    
      <item>
        <title>我是如何艰难地克服「效率成瘾」的？</title>
        <link>https://blog.jimmylv.info/2022-02-18-Efficiency-Thinking-01-How-Did-I-Struggle-To-Overcome-Efficiency-Addiction/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2022-02-18-Efficiency-Thinking-01-How-Did-I-Struggle-To-Overcome-Efficiency-Addiction/</guid>
        <pubDate>Fri, 18 Feb 2022 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;作为一个效率工具爱好者，也是一个效率产品的从业者，天然地就会去把玩各种各样的 App 或者是软件。我还记得我在大学的时候有打开 Firefox 的扩展商店，玩各种各样的插件，甚至连玩插件都能够玩上一个通宵，当然这是非常不健康的。&lt;/p&gt;

&lt;p&gt;而到了工作以后，我还是会定期下载手机上的 App 来玩，很多时候都会去应用商店里面试用各种各样新鲜的 App，经常会找限免或者是“最美应用”这样的平台去发现新的效率工具，后来越来越&lt;strong&gt;意识到自己陷入了「效率成瘾」&lt;/strong&gt;或者是叫 Productivity Porn（效率色情），于是开始自己寻找药方。&lt;/p&gt;

&lt;h2 id=&quot;药方-1玩具属性-vs-工具属性&quot;&gt;&lt;strong&gt;药方 1：玩具属性 vs 工具属性&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;效率色情（aka 生产力色情）这个词最早出现于&lt;a href=&quot;https://www.dedao.cn/course/article?id=R2Mo65zY4QZ3VnmoGEKqEdNAa98jGB&amp;amp;source=search&quot;&gt;《生活黑客》&lt;/a&gt;这本书，书中写到 Porn 这样一个词，&lt;strong&gt;其实是「对某件事情上瘾」的一种描述&lt;/strong&gt;，不只是说对色情内容上瘾，而是你对其他的内容像是生产力工具，或者是各种各样的时间管理方法的无止限追求，都可以称之为 Porn。&lt;/p&gt;

&lt;p&gt;比如说武侠或者是枪战动作片，其实也是一种 Pron，就像我们去电影院看的商业片，其实最重要的卖点就是那些在赛道上的追逐戏或者是动作类的打斗戏，&lt;strong&gt;让我们自己产生一种代入感，就像自己能够拥有主角那样的能力。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;那么类比来说，当我们使用效率工具的时候，就很可能认为当自己掌握某项工具的时候，会像其他使用该工具的人那样厉害。但现实往往会打你的脸，哪怕你用上最贵的 GTD 工具 OmniFocus 或者是笔记软件 Roam Research，你可能&lt;strong&gt;依然只是在把它当成一个玩具，而不是真正把它作为一个工具。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/dc194a8af83fb768176b8f84d574a84c.jpg?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV12Z4y1f7jr?spm_id_from=333.999.0.0&quot;&gt;【效率工具01】OmniFocus 4.0 初印象&lt;/a&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;strong&gt;区分当前自己是在「玩玩具」还是在「用工具」&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;当我们在「玩玩具」的时候，你就可以用这段时间尽可能地去发现更多的应用，去探索更多的可能性。比如说&lt;a href=&quot;https://sspai.com/&quot;&gt;少数派&lt;/a&gt;里面就有很多的文章会教大家如何去使用工具，或者就像大家看 VLOG 或者是测评类的视频时，其实你也是在一种玩的属性，因为这个时候你也会将自己代入进去，而这个时候&lt;strong&gt;其实你只需要享受玩具或者是看别人玩玩具的快乐就好&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/3bf5fdffeb146cf2ffb645bb2b579180.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;而当你在「用工具」的时候，&lt;strong&gt;你最重要的事情还是要把事情做完，真正的 Getting Things Done。&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;药方-2create-before-consume&quot;&gt;&lt;strong&gt;药方 2：Create Before Consume&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;我每天都会使用 RSS 或者是 Twitter 来刷各种各样的信息，很多时候我就会问自己：这些信息都只是我的消费品，那当我去消费这些信息的时候，我能得到什么呢？或者说&lt;strong&gt;更重要的是在我消费它之前，我自己能不能先输出内容呢？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/1dcd59b13421bfd842f6240e542f53ac.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Feedly 和 Twitter（with &lt;a href=&quot;https://twemex.app/&quot;&gt;Twemex&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;因为现在是 Web 2.0 时代，所有的平台都在鼓励创作者在他们的平台上创作，而平台通过智能推荐算法来引诱人们去消费它的信息，&lt;strong&gt;创造属于平台的商业价值，尽可能地赚取你的注意力&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;在这个流量经济时代，你会发现最典型的就是宠物、小孩以及性（打擦边球）这类信息在抖音或 TikTok 盛行。为什么呢？因为它是一个注意力驱动的商业时代，&lt;strong&gt;《注意力商人》的工作模式就是收割观众的注意力，向观众投放广告&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;而观众不会永远被动，早晚都要反击。其实办法也很简单，就是要在你消费之前去创作，Create Before You Consume。我特别期待于 Web 3.0 的到来，所以我们应该尽可能的 Publish More，就像我在读文章的时候，我也会想：&lt;strong&gt;当我看了这篇文章准备消费下一篇文章的时候，我对当前内容有没有什么评价呢？&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;其实我也就会直接在作者的文章下面进行评论，比如说&lt;a href=&quot;https://sspai.com/post/70635&quot;&gt;我的知识管理工具 - 少数派&lt;/a&gt;这篇文章提到了作者的一个工作流，使用到 Cubox、Flomo 以及思源笔记。那我就在评论区做了一个总结：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/d39c3d6fbd55927556edf09fe09fad73.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;那么就这样一段话，我会把它直接放到这篇文章的评论区，当然我也会把它保存下来，放到 Telegram，通过 &lt;a href=&quot;https://github.com/JimmyLv/telegroam&quot;&gt;telegroam&lt;/a&gt;（Telegram + Roam） 直接发送到 Roam Research 里面。&lt;/p&gt;

&lt;p&gt;还有更多的时候是跟作者进行交流，作者发表文章就是想要获得读者的反馈，就像我在&lt;a href=&quot;https://sspai.com/post/70641&quot;&gt;2021 —— 我的工作流定型过程 - 少数派&lt;/a&gt;另一篇文章下面也有所评论，作者总结了自己的一个工具流，那么当我读完之后，我也会直接告诉作者我从他的文章当中学到了什么：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/a2f237b7742c0429ee58c66064d7420c.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这也是一个即时的输出。我将自己的笔记法称之为「春夏秋冬」笔记法，春天播种收集，夏天除草规整，秋天收获输出，冬天储藏归档，通常来说也会引起作者的更多讨论。&lt;/p&gt;

&lt;p&gt;我们也可以从哲学角度来说，当你需要消费内容的时候，你也需要别人来创作；而当你创作内容的时候，也会期望其他人的注意力和互动。那么 &lt;strong&gt;Create Before You Consume 其实就是「己所欲，施于人」&lt;/strong&gt;。&lt;/p&gt;

&lt;h2 id=&quot;药方-3重器轻用自由组合&quot;&gt;&lt;strong&gt;药方 3：“重器轻用”，自由组合&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;“重器轻用”其实是张玉新老师（&lt;a href=&quot;https://xbeta.info/&quot;&gt;善用佳软&lt;/a&gt;）提出来的一点，我们已经见识到了各种各样的工具，每一款工具都有它的独特的地方。我之前有在&lt;a href=&quot;https://www.bilibili.com/video/BV1Gp4y1B7ec&quot;&gt;Roam Newsletter 漫游研究所周报 #2020W52&lt;/a&gt;这一期里面提到过：&lt;strong&gt;我们之所以用某一款工具，一定是因为它那 20% 特别吸引我们&lt;/strong&gt;，那么此时我们就只需要用好它最重要的 20% 的功能即可。&lt;/p&gt;

&lt;p&gt;就像在 Roam Research 里面，我最喜欢的是它的 block reference 块引用，比如说我可以通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(())&lt;/code&gt; 来找到任意可以引用的内容，然后还直接把我需要引用的内容快速地粘过来，然后打上我想要的标签。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/9e37727360933a16b8e188fffd4f317a.gif&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;就像 Tim Ferriss 提到，我们在 2022 这个新年之际，不要去做那么多的新年愿望，雄心勃勃地觉得自己新的一年会有新的改变。但其实这么多年过去了，今年是什么样，去年是什么样，有多大差别难道你自己还不清楚吗？所以说大家&lt;strong&gt;应该多做 Past Year Reviews（PYR）也就是过去一年的回顾，少做 New Year Resolutions 新年愿望。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;所以说，再举个用好重器 20% 功能的例子，对于 DEVONthink 来说，我觉得它最重要的就是 Search 搜索功能。比如说我通过 Alfred 的 DEVONthink 插件快速输入「重器轻用」，然后我就可以搜到在 DEVONthink 里面所有关于「重器轻用」的信息。而这个&lt;strong&gt;搜索速度是极快的&lt;/strong&gt;，并且在右侧边栏，你可以看到搜索结果有一个展现的区域，让你快速知道哪些地方有相关文字的一个出处。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/ec4881b8a11fa21e056a8456a0f1de0a.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV1Ai4y1o7jN?spm_id_from=333.999.0.0&quot;&gt;DEVONthink 极致搜索体验&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;其实我就能找到之前所有提到该内容的地方，而这个地方的“快”是非常重要的。我常常把 DEVONthink 比作是一栋楼当中的地下室或者是楼阁，当我们需要找什么内容的时候，我们能够非常快速地去找。虽然说平常不会去楼阁里面翻东西，但&lt;strong&gt;只要它搜索起来很快，你就能够快速地去找到想要的内容。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;就像我今天要分享的内容，其实是在我看一篇文章的时候，快速记录下的跟文章有关的一些想法，而这些&lt;strong&gt;灵感会自动通过 Diigo 同步到 DEVONthink 里面&lt;/strong&gt;。从而当我回顾时，我就可以通过 DEVONthink 重新打开这篇原文查看当时划线的位置。&lt;/p&gt;

&lt;p&gt;当然，你也知道在 Diigo 里面也有大纲的功能，并且你可以直接把正在读的文章高亮，直接转化到 Diigo 的大纲编辑器里面。但为什么我不去用它呢？因为它虽然有，但是做得并不够极致。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/5c4922eaf1009fa2775a4127cd3002f5.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;而我通过 Diigo + DEVONthink + Roam Research 这样的工具可以自由地组合，我就可以用好每个软件最特色的 20% 的功能。而自由组合这一点其实就来自 &lt;a href=&quot;https://zh.wikipedia.org/wiki/Unix哲学&quot;&gt;UNIX 哲学&lt;/a&gt;：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;每个程序只做一件事，做好它&lt;/li&gt;
  &lt;li&gt;多个程序相互组合，共同完成复杂任务&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;总结一下，如果你想克服效率成瘾，不要去追求一个软件 All in One，而是&lt;strong&gt;用好每一个软件最有特色的 20%，然后通过自由组合的方式，把各自的功能发挥到极致&lt;/strong&gt;。你要知道，你的最终目的是为了产出，Create Before You Consume。&lt;/p&gt;

&lt;h2 id=&quot;药方-4流程化标准化自动化&quot;&gt;&lt;strong&gt;药方 4：流程化、标准化、自动化&lt;/strong&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;举一个 DEVONthink 的用例，比方说当我每次需要去切换视图显示在左边还是右边的时候，DEVONthink 默认的快捷键是 ⌘+5/6/7，显然不是很好按，而它默认的 ⌘+1/2/3 我却一般用不到它。所以我就可以通过 BetterTouchTool 映射 DEVONthink 的快捷键操作，比如按下 ⌘+ 1，我希望把它转换成 ⌘+5，以此类推。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/dc506a79a1e500f1769766ee0947940b.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;首先，我们要去&lt;strong&gt;总结自己常用的一些操作，然后把自己的操作标准化出来&lt;/strong&gt;，从而我们可以通过一些像 BetterTouchTool 这样的自动化工具来保存你的自动化流程。&lt;/p&gt;

&lt;p&gt;在 DEVONthink 里面，最常用到的有两个自动化功能，一个是 Workspace。比如说，我总是需要打开我的“高亮视图”，回顾我所有的网页高亮，此时按下快捷键 ⌘ + Enter 就会跳转到下一个我收藏过的，但还没有阅读的内容。&lt;/p&gt;

&lt;p&gt;我可以通过 Workspace 来保存这个自定义的“高亮视图”，在我平常用的时候并不会打开它，但每次我需要启动它的时候，我只需要在菜单栏选中“高亮视图”或按下快捷键，DEVONthink 就会完全变成另外一种形态。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/4a2d93ce50b3199123e3ac46bcaf70f2.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;另外一个 DEVONthink 的自动化功能是 Smart Rules，比方说我要 filter 所有重复的内容，或者是我可以自己新建很多自动化的规则，让它自动帮我去做一些原本手工需要做的事情，比如自动将网页转成 Markdown 格式。&lt;/p&gt;

&lt;p&gt;再举一个更直观的例子给大家介绍一下。Keysmith 这个软件很神奇，我们可以创建一个工作流，并且你可以录制它，&lt;strong&gt;录制的时候可以模拟你所有的鼠标点击事件或者是快捷键操作&lt;/strong&gt;。然后当你再次运行它的时候，你就会发现它可以帮你自动执行这些操作。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/8cd21b001aed436874deb6e5e36be6f0.gif&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Keysmith 自动记录内容至 Telegroam&lt;/p&gt;

&lt;p&gt;比方说我正在阅读文章内容，只需要按下快捷键，Keysmith 就会帮我自动打开 Telegram 然后把网页的 Markdown 链接粘贴到输入框内容。而这个时候我只需要再粘贴一遍我复制的内容，再写下我自己的留言发送过去就可以完成一个速记。&lt;/p&gt;

&lt;p&gt;而 Telegram 所有的内容其实都会保存到我的 Roam Research 里面，所以这就是借助于工具来帮助我快速达到自己想达到的一些目的，&lt;strong&gt;特别是收集 Fleeting Note 的时候一定要是“唯快不破”，因为灵感往往“稍纵即逝”。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;类似这样速记或者阅读的流程，我们都可以先把它流程化出来。通常来说，你可以用看板来标识每个阶段，比如说 Todo、Doing、Done。然后，你再去想哪些地方可以改进，哪些地方可以优化，从而&lt;strong&gt;减少每个流程之间的重复步骤，也就是我们要尽可能减少工具的不必要操作&lt;/strong&gt;，提高效率其实就是减少浪费。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/5e4fce14f9a3d2db801c457176af1cd1.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;药方-5建立防崩溃机制&quot;&gt;&lt;strong&gt;药方 5：建立“防崩溃”机制&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;克服效率成瘾的最后一点，你还需要一个“防崩溃”机制。对我来说，最为典型的一个机制就是 Daily Notes。它让我意识到，&lt;strong&gt;每天都是崭新的一天，而这崭新的一天能够帮助我重新开始。&lt;/strong&gt;不管昨天做得有多烂，我今天面对的都是一张白纸，而这张白纸等待我去书写，写下新的内容。&lt;/p&gt;

&lt;p&gt;我一天当中会先以 Objectives 也就是目标为核心来写下我所有的内容，另外还有一项是前文演示过的 Quick Capture。也就是说，我在手机端 Telegram 里面记录下的内容，会自动同步到 Daily Notes 的 Quick Capture 这一项。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/5708f2beb46e90f36ef37be073ac60b7.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我的 Daily Notes，每天都是一个崭新的开始&lt;/p&gt;

&lt;p&gt;就像今天看到的 Twitter 内容，或者是我记录下的一些网页摘抄内容，或者是我在手机端的一些想法，或者是刚刚给大家演示的测试部分，都会自动放到我的 Daily Note 里面。而&lt;strong&gt;每一天都是这样一个崭新的开始，避免我的自我管理系统陷入混乱，从而容易崩溃。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;另外一个机制是 P.A.R.A 中的 Archive，归档这个概念的意义其实也是非常非常重要的。就像我会把所有内容都归档到我的 DEVONthink 里面，我可以看到我所有的推文、所有的笔记，然后也可以看到我所有的网页高亮，还有我发布过的博客或者是 Newsletter 都会归档到我的 DEVONthink 里面。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/e7b4b62b3038d3123d734dadf4e8b6a6.png?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;博客内容自动归档至 DEVONthink&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;只有当你归档之后，一切才可以安心，也就是你可以防止自己陷入系统的混乱而崩溃&lt;/strong&gt;。而“防崩溃”这个概念之所以重要，也是意在帮我们创建一个对外的接口，只要接口不变，内部一定程度的混乱是可以接受的。&lt;/p&gt;

&lt;p&gt;这里的类比其实很有趣，当我在 DEVONthink 里面搜索时，经常会搜到一些其他领域毫不相干的一些内容。比如说我会搜到“防崩溃”来自领域驱动设计软件架构里面的一个概念，但其实“防崩溃”这个概念最开始是我在读少数派的&lt;a href=&quot;https://sspai.com/series/73&quot;&gt;信息管理专栏&lt;/a&gt;里面看到的。当然，防崩溃层在软件架构里面其实也是非常典型的，我们可以把防崩溃层看作是客户模型的一个服务，它抽象了我们在一个范围内会如何去使用，它可以被理解为一个适配器，而这样一个适配器在包装之后就可以安全地裹住过往。&lt;/p&gt;

&lt;p&gt;还有一个概念叫&lt;strong&gt;“安全网”，就像我们在高速路上会遇到旁边的滑坡，而这些滑坡上往往会通过铁丝网的方式固定住山坡的泥土，防止它崩溃下来&lt;/strong&gt;。虽然这些“泥土”可能已经很散很乱，但是没关系，我们可以有勇气重新开始，每天都是一个崭新的开始。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/article/65cf53e2e645b4fa2e16465eb694d961?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;提前预测山体滑坡！瑞士用无人机提高铁路安全性&quot; /&gt;&lt;/p&gt;

&lt;p&gt;防止山体滑坡的“安全网”&lt;/p&gt;

&lt;h2 id=&quot;效率成瘾药方总结&quot;&gt;&lt;strong&gt;「效率成瘾」药方总结&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;好，那么我已经把整个一篇文章“讲”完啦（&lt;a href=&quot;https://www.bilibili.com/video/BV11b4y1n7L4?spm_id_from=333.999.0.0&quot;&gt;为什么是讲呢？因为还有 B 站长视频版 🐶&lt;/a&gt;），最后让我们来总结一下。&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;第一个药方是&lt;strong&gt;玩具属性 vs 工具属性&lt;/strong&gt;：我们要破除工具的执念。好的工具虽然会让我们有一种“代入感”，好像自己拥有了这样一个工具之后就会变得很厉害。但其实只有把它真正地当成工具用起来，才能够真正地推进项目，改变你的生活。玩的时候就好好玩，用的时候就要发挥工具的极致。&lt;/li&gt;
  &lt;li&gt;第二个药方是 &lt;strong&gt;Create Before You Consume&lt;/strong&gt;：我们要尽可能在消费之前创作属于自己的东西，要更多地去发布，更早地去发布。那么创造其实是为了得到你自己更想消费的东西，也就是己所欲，先施于人。&lt;/li&gt;
  &lt;li&gt;第三个药方是&lt;strong&gt;重器轻用，自由组合&lt;/strong&gt;：我们不要去想着在一款软件工具上 All in One，而是要用好每一款工具的最具特色的 20%，然后通过自由组合的方式让他们能够彼此配合起来。同时也呼应了第一点，我们也可以去尽可能使用更多的工具，满足自己的工具贪玩的心态。&lt;/li&gt;
  &lt;li&gt;第四个药方是&lt;strong&gt;流程化、标准化、自动化&lt;/strong&gt;：当我们使用了各种各样的工具相互配合之后，我们要将它基于写作或者任务管理、目标管理等等的流程梳理出来，将它们标准化起来，形成 SOP。这样你才更有可能通过自动化工具将它们组合起来，每次做事情的时候就能够直达目标，减少不必要的浪费。我推荐大家可以用看板的方式把它梳理出来，然后尽可能缩短从第一步到最后一步的步骤。&lt;/li&gt;
  &lt;li&gt;最后一个药方则是&lt;strong&gt;建立防崩溃机制&lt;/strong&gt;：我们通过 Daily Notes 的方式来让自己意识到每天都是一个崭新的开始，不用去担忧过往，过往都被安全地包裹了起来，让我们更加有勇气地出发。不管过去怎么样没关系，今天我们可以再次做到自己想做的事情，自己选择成为什么样的自己。&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;彩蛋one-more-thing&quot;&gt;&lt;strong&gt;彩蛋：One More Thing&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;这篇文章参加少数派的&lt;a href=&quot;https://sspai.com/post/70693&quot;&gt;2021&lt;/a&gt;&lt;a href=&quot;https://sspai.com/post/70693&quot;&gt; 年度征文&lt;/a&gt;，也是我为了&lt;strong&gt;打造令人满意的个人知识工作流&lt;/strong&gt;所做的一次尝试，也就是「先录视频，再写文章」。&lt;/p&gt;

&lt;p&gt;录制视频发布 &lt;a href=&quot;https://www.bilibili.com/video/BV11b4y1n7L4&quot;&gt;B 站&lt;/a&gt; 之后，再通过视频的语音自动化识别的方式产生的文稿，配合我记录下来的关键点而自动导出为一篇文章。至此，文章基本的结构已经成型，我只需要去补充跟它有关的一些内容和插图，插图可以直接来自我视频的截图，从而非常快速地产出这篇文章。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2022/02/18/ce01d6d5cbc48a39cfe9ee18e8921a51.jpg?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;img&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.bilibili.com/video/BV11b4y1n7L4?spm_id_from=333.999.0.0&quot;&gt;【效率思维01】我是如何艰难地克服「效率成瘾」的？&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;那么我们下次再见，不要忘记三连 + 关注（少数派也要哦，年度征文要看数据的啦 👁），谢谢你！❤️&lt;/p&gt;

</description>
      </item>
    
      <item>
        <title>“罗马不是一天建成的”：Roam Research 101 系列之每日笔记与页面引用</title>
        <link>https://blog.jimmylv.info/2021-07-18-roam-research-101-daily-notes-and-page-references/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2021-07-18-roam-research-101-daily-notes-and-page-references/</guid>
        <pubDate>Sun, 18 Jul 2021 00:00:00 +0000</pubDate>
        <description>&lt;h2 id=&quot;零roam-research-101-系列的初衷&quot;&gt;零、Roam Research 101 系列的初衷&lt;/h2&gt;

&lt;p&gt;欢迎来到 Roam Research 宫殿，&lt;strong&gt;Roam 的门槛其实很低，但是天花板特别高&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/article/547bf543c5edba8f858eb359c6246032?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Pantheon 罗马万神殿 “天使的设计”&lt;/p&gt;

&lt;p&gt;最近一直在思考如何升级漫游研究所 &lt;a href=&quot;https://jimmylv.substack.com/&quot;&gt;Roam Newsletter&lt;/a&gt;（🆓 Substack 邮件订阅）的内容形式，想要更好地组织关于思维工具和知识创造的内容。&lt;/p&gt;

&lt;p&gt;而且现在中文社区还没有一份完整的 Roam Research 系列教程，#roamcult 的社区氛围反而又难住了部分初学者。&lt;/p&gt;

&lt;h3 id=&quot;01-roam-的低门槛和高天花板&quot;&gt;0.1 Roam 的低门槛和高天花板&lt;/h3&gt;

&lt;p&gt;关于低门槛的内容，我想仿照 @少楠 的 &lt;a href=&quot;https://help.flomoapp.com/about-101&quot;&gt;Flomo 101 学院&lt;/a&gt; 做一个 101 系列，包括 Roam Research 入门干货和自我管理与知识创造的基本原则。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;因为许多时候我们需要改变的不是工具，而是我们使用工具的思维方式。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;突破天花板的事情，作为程序员的我一直都比较热衷，各种主题、插件玩得不亦乐乎，还有跟其他软件之间的互连互通，通过自动化相互联动。&lt;/p&gt;

&lt;p&gt;当然，伴随 Roam 101 诞生与成长的，还有 RoamCN 微信群和 #roamcult 社区，我相信讨论能够激发出实际的知识创造的需求，以终为始，你能学到什么？我能得到什么？&lt;/p&gt;

&lt;h3 id=&quot;02-自带方法论的工具才是好工具&quot;&gt;0.2 自带方法论的工具才是好工具&lt;/h3&gt;

&lt;p&gt;我一直想写的都是带有普适性的&lt;a href=&quot;https://sspai.com/u/jimmylv/posts&quot;&gt;文章&lt;/a&gt;，重点不在于工具，而在于使用工具背后的方法论和相关理论的最佳实践。甚至我有一个认识：自带方法论的工具才是好工具，就像我的 GTD 其实就是跟着 OmniFocus 学的，哪怕我最后并没有使用 OmniFocus。&lt;/p&gt;

&lt;p&gt;虽然说一个厉害的人，有自己方法论的人用什么工具都可以，哪怕只是纸笔也能疯狂输出，但问题在于大部分人只是普通人。&lt;/p&gt;

&lt;p&gt;工具在一定程度上给普通人赋能，就像自动驾驶等技术革命总是想让我们的生活变得更好，让我们的就业变得更充分，让人类的创造力得到更大的释放，人类没有必要去从事那些重复性的苦力型工作。&lt;/p&gt;

&lt;h3 id=&quot;03-关于-roam-101-专栏的内容规划&quot;&gt;0.3 关于 Roam 101 专栏的内容规划&lt;/h3&gt;

&lt;p&gt;Roam 101 系列的每一篇文章大概会包括 3 个部分：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Roam 官方邮件组的新手教程，我采取的方式是意译而非直译，切换上下文并结合实际使用场景练习（Context 上下文是使用 Roam Research 时最重要的概念）&lt;/li&gt;
  &lt;li&gt;结合新出版的&lt;a href=&quot;https://weread.qq.com/web/reader/3d8326d072552e803d87c41kc81322c012c81e728d9d180&quot;&gt;《卡片笔记写作法》&lt;/a&gt;书中的内容来谈一谈我的个人体会，即关于卢曼的卡片盒笔记法相关读书笔记的摘要（Context 语境同样是 #Zettelkasten 最重要的概念之一）&lt;/li&gt;
  &lt;li&gt;我在 Roam Research 中有关「&lt;a href=&quot;https://mp.weixin.qq.com/mp/appmsgalbum?__biz=MzA4NDAxNjIxMg==&amp;amp;action=getalbum&amp;amp;album_id=1369021746099322881&amp;amp;scene=173&amp;amp;subscene=&amp;amp;sessionid=0&amp;amp;enterid=1626606352&amp;amp;from_msgid=2647919498&amp;amp;from_itemidx=1&amp;amp;count=3&amp;amp;nolastread=1#wechat_redirect&quot;&gt;自我管理和知识创造&lt;/a&gt;」的最佳实践，就像现在这篇文章就是在 Roam 里面完成了卡片素材收集、大纲组织和正文书写等输出流程。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;虽然是 Roam Research 专属，但依旧期望给使用不同工具的你以启示，比如 &lt;a href=&quot;https://www.yuque.com/deerain/gannbs/hb0gsd&quot;&gt;MOC: Map of Contents - 管理链接而非本体&lt;/a&gt;这个概念，让我意识手动创建位置固定的图像的重要性。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/article/031123a6efe8abac8f42815d5e832021?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;既是我对 Roam Research 自动生成的双向链接 Graph 无用性的反思，也是更重视 Diagram 手动画图功能的开始。更有趣的是《卡片笔记写作法》中也有关于“文字是固定化结构的图像”的描述，也让我对中文方块字有了不一样的认识和理解。&lt;/p&gt;

&lt;p&gt;让我和你保持“好奇心”，开始接下来的旅程吧！&lt;/p&gt;

&lt;h2 id=&quot;一罗马不是一天建成的每日笔记和页面引用&quot;&gt;一、“罗马不是一天建成的”：每日笔记和页面引用&lt;/h2&gt;

&lt;p&gt;虽说“罗马不是一天建成的”，但用十天的时间来打造属于你自己的罗马（Roam），听起来感觉怎么样呢？&lt;/p&gt;

&lt;p&gt;Roam Research 101 系列就是想要帮助你学习 Roam 的所有主要功能，加入少数派专栏和 RoamCN 中文社区微信群参与互动，我相信你很快就会像 #roamcult 专业人士一样使用 Roam。&lt;/p&gt;

&lt;p&gt;唯一的秘诀是：不要退缩，只要开始写！剩下的事情由 Roam Research 来做。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/fa893656432d69c9ebaf3f5edf8864cc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;11-daily-notes-每日笔记&quot;&gt;1.1 Daily Notes 每日笔记&lt;/h3&gt;

&lt;p&gt;当你打开 Roam Research Graph 数据库时，首先映入眼帘的是 “Daily Notes”：一个空白的页面，上面是今天的日期，比如 [[July 16th, 2021]]。&lt;/p&gt;

&lt;p&gt;那么你该怎么做呢？开始写呗！&lt;/p&gt;

&lt;p&gt;你可以把 Daily Notes 每日笔记当成每天的独立空间，“每天都是一个崭新的开始”，在这里开始写下你的所思所想和所见所闻。没错，以前你会在其他任何地方，想要记下的任何东西都可以放进来，不要有任何压力：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Ideas 以前会记到笔记本里的想法，或者是涂鸦在便签纸上的想法&lt;/li&gt;
  &lt;li&gt;Emails 以前放在草稿箱里的电子邮件&lt;/li&gt;
  &lt;li&gt;Word 文档中的论文或摘要&lt;/li&gt;
  &lt;li&gt;Videos 哔哩哔哩或 YouTube 视频&lt;/li&gt;
  &lt;li&gt;Notes 备忘录，或是保存在 IM 应用中的“文件传输助手” 😉&lt;/li&gt;
  &lt;li&gt;Tasks 你会在手机应用中记录的任务&lt;/li&gt;
  &lt;li&gt;……&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;12-outliner-平平无奇的大纲视图&quot;&gt;1.2 Outliner “平平无奇”的大纲视图&lt;/h3&gt;

&lt;p&gt;Roam Research 拥有最好的大纲式编辑体验，我确实太过于喜欢“放大缩小”这个概念，就像摄影镜头焦距变化一样，我可以进入细节，但也可以着眼于全局。&lt;/p&gt;

&lt;p&gt;大纲式笔记的子弹形式，加上缩进和不缩进的可能性，可以帮助你轻松构建一些“结构”。但是在最开始的时候，你没有必要按照任何层次或模板进一步组织。&lt;/p&gt;

&lt;p&gt;“结构”、“联系”、“模式”将自下而上地出现：而且每天都是新的迭代！&lt;/p&gt;

&lt;p&gt;网络化思维的魔力，将会由 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[]]&lt;/code&gt; 这个魔力符号来开启…&lt;/p&gt;

&lt;h3 id=&quot;13-page-references-页面引用&quot;&gt;1.3 Page References 页面引用&lt;/h3&gt;

&lt;p&gt;将单词或短语（甚至是 Emoji 😍 表情符号！）放在一对方括号 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[]]&lt;/code&gt;之间，就可以创建一个指向新创建 Page 页面的[[双向链接]]。&lt;/p&gt;

&lt;p&gt;当你通过点击链接进入页面时，你会在页面底部看到，该页面被引用的所有地方。&lt;/p&gt;

&lt;p&gt;假设你在不同的情境下创建了&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[睡眠]]&lt;/code&gt;这个页面：当你早上写日记的时候，当你阅读一篇关于睡眠健康的文章的时候，当你计划下一次自驾旅行的时候。所有这些引用都会以其原始语境（Context）出现在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[睡眠]]&lt;/code&gt;页面的底部。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/6708c84e66a63f347e4026992bbcaaaf.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;14-还有一些小贴士&quot;&gt;1.4 还有一些小贴士&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;在搜索栏中输入 Page 页面名称来快速创建新的 Page 页面。&lt;/li&gt;
  &lt;li&gt;按 &lt;strong&gt;Shift+鼠标&lt;/strong&gt; 点击一个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[]]&lt;/code&gt;链接，可以在右侧 Sidebar 打开一个页面。&lt;/li&gt;
  &lt;li&gt;通过右键点击每个 Block 前的圆点，可以探索 Block 的格式化（即每个项目的信息）。&lt;/li&gt;
  &lt;li&gt;输入&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/&lt;/code&gt;触发下拉菜单选择 “Current Time”命令，可以给你的想法快速打上时间戳。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;二卡片笔记写作法-读书笔记极简实操&quot;&gt;二、《卡片笔记写作法》 读书笔记极简实操&lt;/h2&gt;

&lt;h3 id=&quot;21-小挑战一&quot;&gt;2.1 小挑战一&lt;/h3&gt;

&lt;p&gt;这里有一个挑战，你可以亲自尝试一下，往后的每一小节都会包含一个复杂程度越来越高的新挑战。&lt;/p&gt;

&lt;p&gt;现在开始每天的日记练习，在你的每日笔记中写下 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[晨间日记]]&lt;/code&gt; 页面（或任何其他标签）然后添加你的想法。&lt;/p&gt;

&lt;p&gt;对于我自己来说，我觉得最有用的是间歇日记，每次停下来就写“间歇日记”：时间戳+感谢+行动。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/6232c7b555ce9c90995f85c5101545a9.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;未来使人焦虑，过去使人抑郁。可以说是间歇日记的记录方式配合 Roam Research，治愈了我的 抑郁 和 焦虑。 同时，跟大家推荐一下相关的 3 本书：&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;读书时最受用的一些概念，你也可以随手记录到 Daily Notes 每日笔记里面，一元化笔记 + 卢曼 卡片盒笔记法，一元化笔记可转化为具体的永久笔记放入卡片盒。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/3db8107b00fc8258c6fc14a74a20af49.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;via @Innis 😉&lt;/p&gt;

&lt;h3 id=&quot;22-闪念笔记项目笔记永久笔记-示例&quot;&gt;2.2 闪念笔记、项目笔记、永久笔记 示例&lt;/h3&gt;

&lt;p&gt;《卡片笔记写作法》所提到的几个概念，跟 Daily Notes 每日笔记最相关的，应该是闪念笔记（Fleeting Notes）。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/6b46698bf25a50c275ae9f06107eb5ad.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;对于我来说，如果当下是有足够多的时间并且手边有电脑打开 Roam Research，那就无须闪念；如果当下是在读书的话， 直接记录的就是文献笔记，而读书的时候一定要拿上一支笔写写画画，我目前使用的是 iPad + Apple Pencil 的电子化组合。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;闪念笔记（Fleeting Notes）其实是可以不记的，只是信息的提醒，可以用任何一种方式来写，最后会在一两天内被扔进垃圾桶。&lt;/li&gt;
  &lt;li&gt;项目笔记（Project Notes）只与某一特定项目有关，保存在特定项目的文件夹内，项目结束后可丢弃或存档。比如说，在 Roam Research 里面可以把当前的写作文章作为项目，我可以同时开启多个项目，跟着自己的兴趣走。&lt;/li&gt;
  &lt;li&gt;永久笔记（Permanent Notes）我更愿意用 Evergreen Notes（常青笔记）来称呼它，这种笔记以一种永久可理解的方式、标准的格式包含了必要的信息，并且永远不会被扔掉。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/967cd6d2d0812f2c1f19e8aa049337ae.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;不过这里只是一个简要的介绍，后续的文章会再结合实例，仔细来讲讲卡片笔记写作法的每一个环节。&lt;/p&gt;

&lt;h3 id=&quot;23-好的工具帮助你减少对主要工作的干扰&quot;&gt;2.3 好的工具，帮助你减少对主要工作的干扰&lt;/h3&gt;

&lt;p&gt;好的工具并不是为你增加更多的功能，而是帮助你减少对主要工作的干扰。&lt;/p&gt;

&lt;p&gt;你的主要工作是思考，而 Roam Research 就像一张张白纸，尽可能减少了页面跳转、鼠标移动、材料引用、动画刷新等功能或工具行为对思考的干扰。&lt;/p&gt;

&lt;p&gt;对，就是写代码时“手指不离开键盘”般的爽快感。思考无干扰，但能创造无限结构。&lt;/p&gt;

&lt;p&gt;同理，一个好的方法论也能帮助你减少对主要工作的干扰。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/hashtag/Zettelkasten?src=hashtag_click&quot;&gt;Zettelkasten&lt;/a&gt; 闪念笔记 &lt;strong&gt;Fleeting&lt;/strong&gt; (Literature) Notes 是为了在你忙于阅读时快速捕捉想法，不打断你的阅读流程专注于一段文字。&lt;/p&gt;

&lt;p&gt;此时在记录笔记时，要非常简短，要有极强的选择性，要使用自己的文字。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;More is unnecessary, less is impossible. 多了没必要，少了不可能。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;24-什么是原则书中有哪些受用的原则&quot;&gt;2.4 什么是原则？书中有哪些受用的原则？&lt;/h3&gt;

&lt;p&gt;瑞·达利欧在&lt;a href=&quot;https://weread.qq.com/web/reader/848324405e0fe08483ab6a4ka87322c014a87ff679a21ea&quot;&gt;《原则》&lt;/a&gt;中传递的最重要的东西是一种以原则为基础的生活方式，是它帮助我们发现真相是什么，并据此如何行动。而其中最重要的便是拥有属于自己的原则，而《卡片笔记写作法》这本书同样帮助我构建了关于知识管理和知识创造的宗旨和原则。&lt;/p&gt;

&lt;p&gt;举个例子：在挑选记录闪念笔记的工具时，我历经了从“一个人的 Twitter” 到 Roam Research 自带的 Quick Capture 功能，再到 Drafts vs Flomo 等 App 的漫长过程，最后基于书中“减少选择”的原则由此选定了系统默认的 Notes 备忘录。&lt;/p&gt;

&lt;p&gt;特别是 iPadOS 15 为备忘录加入了非常重要的一项新功能 QuickNote 在全局右下角可以快速呼出 QuickNote，用户可以在这里进行手写、打字记录，Quick Note 窗口同样支持 Live Text 快速识别文本的功能，还可以左右轻扫快速浏览不同的 Quick Note。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/16/068c523934c472bdc579fb259aa830f5.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;如果创建的 Quick Note 存在网页链接或者应用中的文本高亮内容，点击 Quick Note 还可以快速跳转至相应 App 中的特定内容位置快速定位进行查看，也就是说 Apple 在系统层面实现了双向链接，直接做到了天花板级别的用户体验。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/b85822b7231df5bbf284da5d2bc3e8a1.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;对于使用其他非 Apple 生态系统的同学，也可以基于“减少选择”的原则，推荐直接使用 Edge 浏览器的集锦功能即可。&lt;/p&gt;

&lt;h2 id=&quot;三我在-roam-research-里面的实践&quot;&gt;三、我在 Roam Research 里面的实践&lt;/h2&gt;

&lt;p&gt;我在之前写过的 Obsidian 文章&lt;a href=&quot;https://sspai.com/post/60802&quot;&gt;从卡片链接到大脑联想，基于 Obsidian 的卡片盒笔记法实践&lt;/a&gt;中引用过：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;「人们高估了独立思考的能力。 没有外部帮助，记忆、思维和推理都会受到限制… …真正的力量来自于设计能够提高认知能力的外部辅助设备。」&lt;/p&gt;

  &lt;p&gt;—— 唐·诺曼，全球最具影响力的设计师，《设计心理学》的作者，苹果的前用户体验架构师《Things That Make Us Smart 让我们变聪明的科技: 在机器时代捍卫人类属性》&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;继 Obsidian 之后，Roam Research 是更好的一款能帮我提高认知能力的外部辅助设备，也可以称之为“第二大脑”，我会谈一谈为什么会在接触 Obsidian 之后再次选择 Roam Research 的背后原因。&lt;/p&gt;

&lt;p&gt;最重要的原因在于，Roam Research 可以将文本的颗粒度拆分得更细。组块（&lt;strong&gt;block&lt;/strong&gt;）是认知科学上的一个常用概念，而 Roam 每一个文本组块（Block）正是这个概念的具象化。我们都知道，当你记忆一个手机号码时，比如，&lt;a href=&quot;tel:13912345678&quot;&gt;&lt;strong&gt;13912345678&lt;/strong&gt;&lt;/a&gt;，很难直接记住。当你把它拆成&lt;a href=&quot;tel:139-1234-5678&quot;&gt;&lt;strong&gt;139-1234-5678&lt;/strong&gt;&lt;/a&gt;这样三个组块时，就更容易记忆。&lt;/p&gt;

&lt;h3 id=&quot;31-第二大脑的抽象与再具象化&quot;&gt;3.1 第二大脑的“抽象与再具象化”&lt;/h3&gt;

&lt;p&gt;《卡片笔记写作法》 在书中提到关于“抽象与再具象化”的片段：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;要想与思想共舞，我们首先要通过抽象和再具体化的手段，把想法从原来的上下文中剥离出来。只有通过抽象和再具体化，我们才能将想法应用于独特的且总是不同的现实世界（Loewenstein, 2010）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;这句话给我的启示同样是对 Obsidian 能做的事情进行抽象化，根据方法论寻找一款思考工具（A note-taking tool for networked thought）才是我的目的，而 Roam Research 则是符合这一愿景的再具象化，满足我对于笔记工具诉求的最佳输出方式。&lt;/p&gt;

&lt;p&gt;我们在做文献笔记，并将其转换成符合卡片盒内上下文形式的时候，同样需要考虑这么做，将原文中的内容进行抽象化，然后再具象化到卡片盒内&lt;strong&gt;你&lt;/strong&gt;所关注的主题。&lt;/p&gt;

&lt;h3 id=&quot;32-关注已完成而非未完成&quot;&gt;&lt;strong&gt;3.2 关注已完成而非未完成&lt;/strong&gt;&lt;/h3&gt;

&lt;p&gt;前文我们已经接触到了如何记录间歇日记和读书笔记，不过都是以 Daily Notes 为入口记录的一元笔记。有了这些时间戳的闪念笔记，我通过 [[roam/js]] 插件把 Daily Notes 按时间顺序显示为一个 &lt;a href=&quot;https://www.bilibili.com/video/BV19U4y1x7sb&quot;&gt;Calendar 日历视图&lt;/a&gt;，用于更好地回顾我过去所记下的笔记。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/61fd43e743938f49b8673b2f6224ff4f.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这会让你&lt;strong&gt;更关注已完成而非未完成&lt;/strong&gt;。现阶段所有的任务管理工具都是围绕未完成来做的，对于已完成事项的利用价值远远不够。而在 Roam Research 中所记下的间隙日记，你做事情是为了获取洞见，而不仅仅只是把事情做完。&lt;/p&gt;

&lt;p&gt;哪怕是 Review，之前的我也总是在回顾那些未完成的项。从而导致自己很焦虑，与此同时我们也总是在自责，回避型人格，中国的传统家庭教育少了太多的鼓励。其实间歇日记或感恩日记，都是让自己重新关注那些已完成的东西，比如 Things 3 里面的 log 日志页面或 Flomo 的&lt;a href=&quot;https://help.flomoapp.com/advance/notes-graph&quot;&gt;热力图&lt;/a&gt; 都让自己知道自己有多棒。持续积累素材到自己的数字花园，以此为动力，心情愉悦，马达轰鸣。&lt;/p&gt;

&lt;h3 id=&quot;33-roam-research-乃写作的最佳后厨-&quot;&gt;3.3 Roam Research 乃写作的“最佳后厨 ”&lt;/h3&gt;

&lt;p&gt;Roam Research 是文本类知识创作的最佳后厨，大纲式的编辑体验极佳，无往而不利。理想情况下，我认真筛选/整理/管理 Daily Notes 里面的内容放到卡片盒，精心编辑我的收藏内容，其目的都是为了在 Roam Research 里面方便调用，配合 Roam 最佳后厨专心负责拼装。或许，相比之下，我的 DEVONthink 更像是地下室，或者楼阁，一般不会去找，但如果要翻找，也能方便地搜索。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/565a375b13cde1a6026f54934b098729.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我的 📝 Zettelkasten 卡片盒&lt;/p&gt;

&lt;p&gt;那么接下来我会演示一下如何在 Roam Research 的具体页面中进行输出，只有知识创造才能发挥 Roam Research 的最佳价值，比如以本文的创作过程为例，我会创建一个 [[P/Roam Research 101]] 页面，进入某一个页面再进行写作，可以称之为项目笔记（Project Notes）。&lt;/p&gt;

&lt;p&gt;在 Roam Research 里面左侧称之为「主页面」，而「侧边栏」则可以打开多个其他页面，由此进入到第一阶段，在主页面快速记录下自己能够想到的任何相关内容，然后在侧边栏 Sidebar 视图快速打开所需要的所有素材。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/237a8291df3eda7ffeabf2d74c77ed4c.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;将所有素材摆在一起之后，第二阶段便可以通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/diagram&lt;/code&gt; 打开 Roam Research 内置的Diagram视图对内容进行排序处理，以线性的方式顺序排列组合出文章的大纲。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/79817daf0b7c994ac9150c96cd81a8bb.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;通过 Diagram 视图产出大纲&lt;/p&gt;

&lt;p&gt;最后的第三阶段，则是通过树状的句法，用线性的文字展开，即通过逻辑语句完整地描述想要表达的内容。至此，Roam Research 帮助我完成了整个写作流程，快写慢改，一篇文章最终新鲜出炉。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;「写作之难，在于将网状的思想，通过树状的句法，用线性的文字展开」—— 史蒂芬· 平克&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2020/07/19/ad7384ab4a0dfad0b674a17ae88c8b81.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这就是我对于一篇文章的创作流程的理解，即厨房的隐喻，&lt;a href=&quot;https://sspai.com/post/61459&quot;&gt;Mise en place&lt;/a&gt;，在法语中的意思是指「在烹饪前，将所有的材料准备好，摆放在一个地方，让你一眼能看到」。这样做不仅仅是告诉观众需要哪些食材，更重要的是帮助厨师更好更从容地烹饪。厨房是知识型工作的终极隐喻，因为厨师必须在紧张的时间压力下，将精雕细琢的产品提供给苛刻的观众。&lt;/p&gt;

&lt;h2 id=&quot;四结语知识创造而不是知识管理&quot;&gt;四、结语：知识创造而不是知识管理&lt;/h2&gt;

&lt;h3 id=&quot;41-我的-roam-research-使用体验隐喻之-dikiwi-模型&quot;&gt;4.1 我的 Roam Research 使用体验隐喻之 DIKIWI 模型&lt;/h3&gt;

&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;我在少数派[Matrix 圆桌&lt;/td&gt;
      &lt;td&gt;网状结构笔记工具是一阵风吗？](https://sspai.com/post/61886)中就提到了这段 Roam Research 的使用体验隐喻：&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;ul&gt;
  &lt;li&gt;你每天都在河边 Daily Note 玩耍，看着河里的水 [[Information]] 哗啦啦地流&lt;/li&gt;
  &lt;li&gt;你拿出相机拍拍照 Block，每天会有新发现 Zettel，然后带回自己的花园 Digital Garden&lt;/li&gt;
  &lt;li&gt;花园里种着一颗颗的种子 Theme，有些已经长大了，需要修剪 Iteration&lt;/li&gt;
  &lt;li&gt;今天很特别，你在河里遇到了你前天拍过照的一条鱼 [[Insight]]&lt;/li&gt;
  &lt;li&gt;于是你把它带了回去，到花园里摘摘菜 [[Knowledge]]，做成一道糖醋鲤鱼 [[Wisdom]]&lt;/li&gt;
  &lt;li&gt;然后拿出手机拍了张照片，并且分享到了微信群里 [[Impact]]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;为什么是拍照呢？我们能看到的能记住的只能是知识的切片 Flash Card，因此要有 Version 即版本管理的概念，而 Roam 恰恰是支持的。我最喜欢 Roam 的一点就是「一处修改，处处更新」，而不断迭代 Iteration 和持续改进才是学习的关键。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2020/08/04/ebfdcbc37fc4b82e65e6253ed9af8241.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这个隐喻其实就对应着 DIKW 体系，它将数据、信息、知识、智慧纳入到一个金字塔形的层次体系中，从最底层的数据到最上层的智慧，它们之间既有联系，又有区别，同时整个过程也是双向通道，自下而上让数据加工成信息，再提炼为知识，最终形成智慧。也可以是自上而下，通过智慧消费产生知识、信息，最后又可以落到最底层的数据上。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://www.pngkey.com/png/detail/216-2167363_the-continuum-of-understanding-knowledge-management-cognitive-pyramid.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;42-没有写作就无法思考&quot;&gt;4.2 “没有写作，就无法思考”&lt;/h3&gt;

&lt;p&gt;卢曼说，“没有写作，就无法思考”。本质上，思考就是一种链接，而驱动我的原动力就是好奇心和创造点什么。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“创造力只是将事物联系起来。当你向有创造力的人询问他们是如何做某件事时，他们会感到有点内疚，因为他们认为自己并没有真的在创造性地做事，只是看到了一些东西而已。”（史蒂夫·乔布斯）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;其实《卡片笔记写作法》对我最大的启发倒不是什么 Process 工作流，而是莫大的一种鼓舞：跟着兴趣走。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/07/18/29ecc5eb97959aa09899d1d17f52ff14.JPEG?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>创造的自由：低代码开发的时代，人人都是创新者</title>
        <link>https://blog.jimmylv.info/2021-05-31-the-freedom-to-create-low-code-application/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2021-05-31-the-freedom-to-create-low-code-application/</guid>
        <pubDate>Mon, 31 May 2021 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;阿里云智能总裁张建锋在 &lt;a href=&quot;http://www.geekpark.net/news/279047&quot;&gt;2021 阿里云峰会&lt;/a&gt;上提到：“低代码开发时代，人人都是创新者，你只要最了解自己的业务，就能去创建应用，实现业务数字化。”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;前言谁是我们的敌人谁是我们的朋友&quot;&gt;前言：“谁是我们的敌人？谁是我们的朋友？”&lt;/h2&gt;

&lt;p&gt;互联网信息化高速发展的今天，一边是万亿市值互联网企业造富神话不断，另一边是六亿人均月收入仅 1000 元左右（李克强总理在 2020 疫情期间 &lt;a href=&quot;http://www.xinhuanet.com/politics/2020-06/22/c_1126144559.htm&quot;&gt;十三届全国人大三次会议记者会&lt;/a&gt; 语重心长地强调）。&lt;/p&gt;

&lt;p&gt;“谁是我们的敌人？谁是我们的朋友？” 周末在读毛选，一开篇就被震撼了！区分敌人和朋友，就是要抓主要矛盾，现在中国社会的主要矛盾是科技创新的速度（vs 美国） 赶不上人口红利的下降速度。每年都在下降的劳动力，反而倒逼产业创新，企业数字化、工业机器人和人工智能替换大量劳动力，才能加快或保持之前的生产效率。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/05/31/article/8364cb99cc4d5112125ffe9f186f6e23?imageView2/2/w/1120/q/90/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;（劳动年龄人口持续减少，劳动力成本快速提升）&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;在互联网应用领域，特别是移动互联网，我们走在了世界和时代的最前沿。然而在面向传统企业的数字化转型时，广大中小企业依旧停留在纸质化流程办公阶段，稍有信息化意识的企业，也仅是在大量使用 Excel 或类 Excel 软件。“未来十年，最大的确定性就是数字化技术的普及，整个社会经济和生活必将全面数字化。“&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/05/31/article/7a61be67565ece17d76aa686a86d4c1c?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;我们需要更多软件的搭建者而不仅仅是软件的用户&quot;&gt;我们需要更多软件的搭建者，而不仅仅是软件的用户&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;“The real computer revolution hasn’t happened yet.”&lt;br /&gt;
“真正的计算机革命尚未发生。” —— 艾伦·凯（Alan Kay）&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;不管技术如何改变了我们的生活，仍然只有&lt;strong&gt;极少数人&lt;/strong&gt;拥有软件开发所需的编程技能。当大多数人面对一个可以通过编程来快速解决的问题时，你不得不求助于其他拥有该技能的&lt;strong&gt;极少数人&lt;/strong&gt;。想象一下，如果有更多的人拥有搭建自定义软件的工具，可以成为软件的开发者，而不仅仅是软件的用户呢？&lt;/p&gt;

&lt;p&gt;我特别喜欢 Airtable 这句 &lt;strong&gt;“&lt;/strong&gt;&lt;a href=&quot;https://twitter.com/airtable/status/1305491922258071554?s=20&quot;&gt;&lt;strong&gt;We need more software builders, not just users.&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;”&lt;/strong&gt; 本质上，每个行业都有其专属的业务逻辑，使用更小的细颗粒度组件配合低代码开发，无需编码或只需少量代码就可以快速生成应用程序。&lt;strong&gt;只有这样，才是真正的计算机革命。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.craft.do/user/full/98bc5ddd-065d-16cd-a57f-317aefefea72/doc/64460AC9-F413-4800-874F-A9F1D998CD08/6E818C98-705C-4308-8B5A-A4F77E93E268_2?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;作为一款具有高自由度的 SaaS 产品，Airtable 期待造就更多软件的搭建者，而不仅仅是软件的使用者。任何人 —— 即使没有技术培训 —— 都可以创建完全符合需求的个性化&lt;strong&gt;应用程序&lt;/strong&gt;，并受益于彼此共享的软件社区和平台生态。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;阿里云智能总裁张建锋在 &lt;a href=&quot;http://www.geekpark.net/news/279047&quot;&gt;2021 阿里云峰会&lt;/a&gt;上提到：“低代码开发时代，人人都是创新者，你只要最了解自己的业务，就能去创建应用，实现业务数字化。”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;这类 SaaS 产品，不只是帮助个人或企业搭建一个自己的内容或管理平台。产品的目标将通过解耦，把现有的产品打碎为最小的颗粒度，然后像乐高积木一样进行组件化、模块化的拼接，而这和我们打造自身知识管理体系的思路是一脉相承的。&lt;/p&gt;

&lt;p&gt;就像笔记软件（Roam Research、Notion）中的 Block 一样，可视化编辑器则将基础组件和业务组件拆得更细，比如商品页面上的每一个元素都可以拆分组合，元素的交互逻辑、数据指标等等都拆分成最小的颗粒度，然后通过一个中台来统一管理，由运营专家或业务专家来搭建页面和逻辑形成功能，最终交付给客户的是一个个可执行的业务功能模块。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://res.craft.do/user/full/98bc5ddd-065d-16cd-a57f-317aefefea72/doc/CD6F1F04-0767-453E-93D8-4B229A7466A7/C7CD235F-3BA2-4A06-AC27-AEBCD3D309FE_2/Gl8aFW.jpeg?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;（中美 SaaS 公司市值对比，客户习惯需要进一步培养，且依赖资源市场）&lt;/p&gt;

&lt;h3 id=&quot;数据之间的联想能力是软件难以取代人脑的地方&quot;&gt;数据之间的联想能力，是软件难以取代人脑的地方&lt;/h3&gt;

&lt;p&gt;通过工具给用户赋能的产品很多，Notion 就被网友戏称为「新一代的 QQ 空间」。Notion、Roam Research、Airtable、Coda、钉钉文档、飞书文档、Vika 维格表、黑帕云等一系列产品，本质上都是一个简易的数据库，比传统的 Excel 更为方便的能展示不同维度直接信息的区分，还有数据的互相引用能够打破传统表格之间的数据孤岛。&lt;/p&gt;

&lt;p&gt;对于中小企业老板乃至个体经济来说，其业务流程大部分都可以通过表格+表单的方式进行流转。一方面，通用型表格然后辅以丰富的模板就能够快速搭建我们现在想要做的系统，类似积木块无代码编码（&lt;a href=&quot;http://www.geekpark.net/news/279047&quot;&gt;low-code&lt;/a&gt; 低代码平台）；另一方面，这类表格还可以根据字段自动生成表单收集器，这样就可以方便录入数据，应用之间还可以相互连接，实现数据互通。&lt;/p&gt;

&lt;p&gt;数据间的互相引用，也特别像知识管理关于「分类 or 标签」的分歧，现在大家都在谈论双向链接，谈论网状笔记，其实这些都只是展现形态，更重要的其实也就是&lt;strong&gt;打破信息茧房，知识壁垒&lt;/strong&gt;。让知识流动起来比单纯让知识建立联系，可能会更重要，也更能激发远程联想和创造力。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;数据之间的联想能力，是任何软件系统都难以取代人脑的地方&lt;/strong&gt;，如何把非结构化的信息通过结构化的方式表现出来，也是最难的地方。不确定性，可能才是真正创造力的来源；如果一切都是固定的程式，那这个世界就失去了生机。 —— @一顾&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;数据的可复用性与数据可视化&quot;&gt;数据的可复用性与数据可视化&lt;/h2&gt;

&lt;p&gt;前文提到表格类似于乐高积木块，最小单元是 Cell 细颗粒度，基于更细的颗粒度才能实现信息/数据的复用，才能激发使用者的远程联想和创意，从而促进复杂决策，跨领域寻找解决方案。&lt;/p&gt;

&lt;p&gt;Roam Research 创始人 Conor 就经常在 Twitter 提及 &lt;a href=&quot;https://twitter.com/search?q=from:Conaw%20excel&quot;&gt;Excel&lt;/a&gt;，并且讨论过一系列关于 Excel 优弱点的 &lt;a href=&quot;https://twitter.com/Conaw/status/1206096644556517376?s=20&quot;&gt;Thread&lt;/a&gt;。并且，连 Roam 的技术面试题都是打造一个小型 Excel，相关 Tweet &lt;a href=&quot;https://twitter.com/Conaw/status/1332814451368624129?s=20&quot;&gt;“One of our interview prompts is building a tiny excel”&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;Roam Research 将笔记的最小单元视为 Block，而这种基于 Block 的深层技术优势让我们看到了各种可能性，在 Roam 的基本概念里，&lt;strong&gt;页面&lt;/strong&gt;只是一种特殊类型的&lt;strong&gt;块（block）&lt;/strong&gt;，&lt;strong&gt;页面（page）&lt;/strong&gt;和&lt;strong&gt;段落（paragraph）&lt;/strong&gt;一视同仁，两者都是 &lt;strong&gt;Blocks&lt;/strong&gt;。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Roam 数据库就像一片森林&lt;/strong&gt;。每一页都是一棵树。树的根是页面（page），树的枝干是更高层次的段落（paragraphs）；树的叶子（block）就是嵌套在页面（page）最深层次的段落（paragraphs）。 —— &lt;a href=&quot;https://sspai.com/post/65426&quot;&gt;深度解析 Roam 数据结构 —— 为什么 Roam 远不只是一个笔记应用 - 少数派&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;在&lt;a href=&quot;https://m.douban.com/book/subject/35006892/&quot;&gt;《程序员修炼之道：通向务实的最高境界》&lt;/a&gt;这本书中被归纳为一个概念叫&lt;strong&gt;正交性&lt;/strong&gt;，组件越小越好，越有组合的可能性，只有当组件拆分越细，越有优化的可能性，性能越好。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;假设一个组件能做 M 件独特的事情，另一个能做 N 件。&lt;/li&gt;
  &lt;li&gt;如果它们是正交的，组合起来就能做 M×N 件事。如果两个组件不正交，有重叠之处，结果就少一些。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;组合正交组件能获得相当微妙的生产力提升，在正交组件不断组合的过程中，单个单元的性价比提高了。&lt;/p&gt;

&lt;h3 id=&quot;根据反馈来不断改进不断迭代-build-measure-learn&quot;&gt;根据反馈来不断改进，不断迭代 Build-Measure-Learn&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;我们亲眼见证了人类历史上最重要的转换。&lt;br /&gt;
最卓越的管理思想家之一，彼得·德鲁克（Peter Drucker）：“这是历史上第一次，人们可以做出自己的选择，而且是越来越多的人可以做出选择。&lt;strong&gt;这是第一次，他们不得不自我管理。&lt;/strong&gt; ”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;“而社会完全没有对此做好准备。”&lt;/strong&gt; 从知识付费的焦虑就可以看到，我们每个人充斥着对时间管理和知识管理的渴望，但是好像缺少了点什么？可视化反馈，我们需要打造一个属于自己的以作品为导向的个人管理系统。我在&lt;a href=&quot;https://blog.jimmylv.info/2017-06-30-serverless-in-action-build-personal-reading-statistics-system/&quot;&gt;Serverless 实战：打造个人阅读追踪系统&lt;/a&gt;这篇文章提到过，稍后阅读永远读不完的痛点 —— 缺乏追踪：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;随着时间的推移，Instapaper 里面的文章将会变得越来越多，就像我们在代码中所注释的 TODO: 可能就变成了 Never Do，稍后读也是一样地被人广为诟病：Read it Later = Read Never。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://res.craft.do/user/full/98bc5ddd-065d-16cd-a57f-317aefefea72/doc/CD6F1F04-0767-453E-93D8-4B229A7466A7/26F7882D-F65E-4656-963F-0F7213266877_2/Image.jpeg?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;我发现文章堆积的一个永恒痛点，即&lt;strong&gt;没有有效的方式追踪自己的阅读需求与能力，其核心原因就是因为读完的速度赶不上添加的速度&lt;/strong&gt;。从而没办法可视化出来评估自己的阅读进度，合理安排阅读计划，也就没办法给予自己适当的奖励，进而失去了阅读的动力。&lt;/p&gt;

&lt;h3 id=&quot;数据驱动抓住引领性指标提升滞后性指标&quot;&gt;数据驱动：抓住引领性指标，提升滞后性指标&lt;/h3&gt;

&lt;p&gt;在《深度工作》这本书中所提到的原则 2：抓住&lt;strong&gt;引领性指标&lt;/strong&gt;，指的就是引导你将注意力转化到提升短期内可以控制的行为上，并对长期目标带来积极影响，从而最终提升&lt;strong&gt;滞后性指标&lt;/strong&gt;。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;通过引领性指标来衡量自己的成功程度，能够及时改变有助于滞后性指标的新行为。比如说滞后性指标是提升面包房的客户满意度，而&lt;strong&gt;引领性指标，就是接受免费试吃样品的客户数量。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;对个人来说，更好的引领性指标记分板就是这个人当前的深度工作时间，可以帮助一个个体专注于深度工作。&lt;/p&gt;

&lt;p&gt;你也可以每天统计一个指标 —— 「自我决定指数」。计算你一天中，完全兴趣驱动，没有任何外在动机驱使的时间所占比例。扔掉那些无聊的应酬，长期坚持去做一些跟利益无关的兴趣爱好，比如读书或写作。&lt;strong&gt;读书与写作本身就是享受，你并不需要得到格外什么，多年后，你反而得到最多。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;其实就跟测试驱动开发（TDD）和精益创业一样，我们需要更多的关注人的本身，做适应性计划而非预测型计划。不是做了适应性计划就是敏捷，而是聚焦价值，持续改进，「以人为本」。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;预测型计划：传统的计划方式，典型的表现形式是甘特图，提前计划好什么时间做什么事情，A 依赖 B，B 就要放在 A 的后面。&lt;/li&gt;
  &lt;li&gt;适应性计划：环境越不确定，越需要边走边看，这时过于详细的计划，就是浪费。较好的做法是，做一个比较粗的计划，把近期的计划做细一点，然后定期去回顾并调整计划。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src=&quot;https://gblobscdn.gitbook.com/assets%2F-LquCgGNObzQ8HY5Og1P%2F-M0fdOVAMxVPGr4ZIDSv%2F-M0fdPAAEzFlG3atVyoW%2Fadaptive-planning.png?alt=media?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;敏捷开发之 Adaptive Planning&lt;/p&gt;

&lt;h2 id=&quot;你的下一个软件应用未必是程序&quot;&gt;“你的下一个软件应用，未必是程序”&lt;/h2&gt;

&lt;p&gt;程序的模块化，一方面得益于笔记型软件的不断升级与推陈出新，另一方面，也有对新型双链笔记软件 Roam Research 的批评，比如在少数派文章 &lt;a href=&quot;https://sspai.com/post/65141&quot;&gt;你的下一个应用，未必是程序&lt;/a&gt;提到的“套娃”：&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;很多用 Roam 批注 Roam 教程，用 Zettelkasten 管理 Zettelkasten 心得的圆环套圆环场面，可谓当代版的邯郸学步。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;即使真要关注逻辑和组织结构，也应是积累了一定数量的素材后再考虑的事。但大多数用户的实际情况是连记笔记的习惯都不曾有。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;当然，现阶段&lt;a href=&quot;https://sspai.com/post/65273&quot;&gt;请不要神化双链笔记 - 少数派&lt;/a&gt;。&lt;strong&gt;所有方法都有其适用范围，卡片盒笔记法有优势也有局限&lt;/strong&gt;。Roam Research 所提供的网络关系图最终可能都会变成一团乱麻：&lt;strong&gt;双向链接被吹捧过度，它所提倡的扁平化也非万灵药&lt;/strong&gt;。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“我能想到的场景是，用来发现与其他笔记关联最多的、付出精力最多的核心笔记。但这在日常使用中，并非一个高频需求，更像一个定期的分析回顾。因此这个网络看似酷炫，实际帮助不大。”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/02/26/dbb6126b6787198533a8f1601abaf2b6.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;创造的自由软件的矛与盾并不矛盾&quot;&gt;创造的自由，软件的“矛与盾”并不矛盾&lt;/h3&gt;

&lt;p&gt;对于任何方法论或工具，都不要走向极端，而是走向融合（两者相击取其强，“矛与盾”并不矛盾）。我既要用到 矛 的锋利，也要用到 盾 的保护，即“小孩子才做选择，而我全都要”。&lt;/p&gt;

&lt;p&gt;作为一个创造软件的程序员，而另一方面作为软件的用户，我的软件使用心得一直都是&lt;a href=&quot;https://twitter.com/hashtag/Unix%E5%93%B2%E5%AD%A6?src=hashtag_click&quot;&gt;Unix 哲学&lt;/a&gt;：做好一件事；接口拼接组合。比如说&lt;a href=&quot;https://twitter.com/hashtag/%E5%88%86%E5%B8%83%E5%BC%8FGTD?src=hashtag_click&quot;&gt;#分布式 GTD&lt;/a&gt;的概念，要实施 &lt;a href=&quot;https://twitter.com/hashtag/GTD?src=hashtag_click&quot;&gt;GTD&lt;/a&gt; 或是 &lt;a href=&quot;https://twitter.com/hashtag/Zettelkasten?src=hashtag_click&quot;&gt;Zettelkasten&lt;/a&gt;，并不一定要 All in One，而是：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;使用多个软件配合，挑选各个领域的强者，取其功能精粹，把 20% 核心功能发挥到极致即可，打组合拳。&lt;/li&gt;
  &lt;li&gt;反复练习，优化工作流，克制抵御工具的诱惑才最最要，或者要刻意区分软件的工具属性和“玩具”属性。&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;其实“软件”的分类或许不再重要，「软件」强调「非物理」的属性，可以指可执行的代码、也可以指不用于执行的文档等；其中可执行、用于完成实际任务的才是「应用」，而一个应用可能是由无数个只具有&lt;strong&gt;抽象功能的程序模块&lt;/strong&gt;组成的。 —— &lt;a href=&quot;https://sspai.com/post/65141&quot;&gt;你的下一个应用，未必是程序 - 少数派&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;同样的，如果现有软件可以满足我的需求，我就直接用。如果没有，那我就可以自己创造一款软件：我可以利用某个软件的思路，在同一个 Airtable-like 表格产品的不同场景里面实现它。&lt;/p&gt;

&lt;h3 id=&quot;自带方法论的软件才是好工具&quot;&gt;自带“方法论”的软件才是好工具&lt;/h3&gt;

&lt;p&gt;比如社区有人会&lt;a href=&quot;https://thesweetsetup.com/using-roam-research-for-gtd-style-task-management/&quot;&gt;在 Roam Research 重新实现 OmniFocus&lt;/a&gt;，但其实更重要的永远都是方法论，e.g. GTD -&amp;gt; RoamToDo 思想在前，工具在后。甚至我们的目标是进入&lt;a href=&quot;https://insights.thoughtworks.cn/agile-coach/&quot;&gt;守破离&lt;/a&gt;的第三阶段“离”：在更高层次得到新的认识并总结，自创新招数另辟出新境界。&lt;/p&gt;

&lt;p&gt;我之前有尝试用 Roam Research 来做 #燃烧清单（Burn List） 或者是实现&lt;a href=&quot;https://book.douban.com/subject/27177909/&quot;&gt;单核工作法&lt;/a&gt;。Burn List 的概念可以参考我派文章：&lt;a href=&quot;https://sspai.com/post/61456&quot;&gt;用一张白纸就能完成的任务管理——用完就「烧」的 Burner List - 少数派&lt;/a&gt;，文章作者 @DrSelfie 原本是通过 Notion 来实现的燃烧清单，后续直接自己上手开发了产品 &lt;a href=&quot;https://brnrlist.com/&quot;&gt;BRNR List&lt;/a&gt;，而我当然就选择借助 Roam 生态 #Roam42 的 LIVE PREVIEW 和 DAILY NOTES POPUP 功能，同样实现了类似功能。&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;比如，你完全没有必要接受 &lt;a href=&quot;https://hey.com/pricing/&quot;&gt;HEY email 的高昂定价&lt;/a&gt;，也不妨试试看它聚焦待回复邮件、严格筛选来件、「钉」住常用信息等特色功能，然后在传统邮箱中通过过滤规则、旗标等功能变通实现。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/02/20/article/0a1456e8ad01db29f7076445d226d7ea?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;「偷师学艺」，借鉴其他工具的方法论创造属于自己的软件&lt;/p&gt;

&lt;h3 id=&quot;模板即软件而且是可个性化定制的软件&quot;&gt;模板即软件，而且是可个性化定制的软件&lt;/h3&gt;

&lt;p&gt;随着各种个性化的业务需求，丰富的模板（市场）就显得非常重要，因为模板即软件，而且是一种可进一步个性化定制的软件，因为你能够根据模块改造属于自己的软件。&lt;/p&gt;

&lt;p&gt;模板同样意味着经验分享，即隐性知识的传递。这是一个富媒体时代，通过视频的形式能够极大得丰富信息传递的带宽，将某些无法口述或通过书面方式传递的匠艺完成传达。&lt;/p&gt;

&lt;p&gt;另一方面，通过定制软件的方式，直接将知识附着于软件本身也是一种领域知识传递的方式，所以表格附件的支持也变得非常重要。比如说对于个人来说，管理文档文件等知识管理场景，或者是对于企业来说，财务/库存的电子收据等场景也需要考虑全面。毕竟，在全面细粒度数据化之前，我们还需要文件这种形态来作为中间件。&lt;/p&gt;

&lt;h3 id=&quot;数据管理表格的多种软件视图&quot;&gt;数据管理表格的多种“软件”视图&lt;/h3&gt;

&lt;p&gt;一条条的数据记录，通过视图改变数据视角，让关心的数据显示更加直观、简洁、美观，同时实现数据可视化。Dashboard（e.g. 销售额）其实就提供了 “BOSS” 视图，通过 Cube （维度 + 度量） BI 分析，可以为企业做到一定程度的决策支持：比如在价格调控上可以有更加精细化的数字化手段等。&lt;/p&gt;

&lt;p&gt;对于个人来说，比较有趣的是@空谷在 &lt;a href=&quot;https://sspai.com/post/65406&quot;&gt;Airtable + Wolai：打造量身定制的价值投资系统 - 少数派&lt;/a&gt; 这篇文章中提到了使用 Airtable 的 Query 和 CURD 等 API 的配合使用来追踪股票涨跌，帮助自己从数据库中发现价值洼地，让本来静态的笔记变成变成一个「活」的页面。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://cdn.sspai.com/2021/03/08/fc575a768e4fdc9a11f14356794c62b8.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;作为行业从业者最后的感叹总结&quot;&gt;作为行业从业者，最后的感叹（总结）&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;“‌ 普通人最应该学习的技能应该是 Excel，‌‌ 而程序员最应该学习的应该是 MySQL。” —— 鲁迅&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;作为一名程序员，敏捷开发的目标是更快地交付有价值的可工作的软件。为此，它有一个指标来度量这个「更快」，那就是 Lead Time，它度量的是一个 idea 从提出被验证，到最终上生产环境面对用户的时间。显然，这个时间越短，软件获得反馈的时间就越短，对价值的验证就越快发生。&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;img src=&quot;https://assets.wuyuan.io/common-template/img/all/1/teslafactory.png?imageView2/2/w/1120/q/40/interlace/1/ignore-error/1&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;特斯拉的无人工厂，汽车制造工厂已经拥有了纯自动化的硬件流水线，那么软件呢？&lt;/p&gt;

&lt;h2 id=&quot;one-more-thing&quot;&gt;One more thing.&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;今年的“十四五”两会期间，和一些代表年年坚持相同的提案不同，科技公司的大佬们每年的发言紧跟时代热点，过去几年是云计算、新基建，今年的&lt;a href=&quot;https://www.geekpark.net/news/274603&quot;&gt;主题已经换成了芯片、自动驾驶和科技适老化&lt;/a&gt;。&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;雷军重点提到了科技适老化，而作为子女，也是可以通过创造软件来帮助父母更好得生活，来达到提醒和协助的作用。比如提醒父母吃药，或者是帮忙打理家里的生意等等，就跟当年父母和我们一起搭乐高积木一样，让我们和父母一起来搭建软件吧！&lt;/p&gt;

&lt;p&gt;愿我们每个人，都能成为 &lt;strong&gt;software builders, not just users.&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;
</description>
      </item>
    
      <item>
        <title>如何把 Roam Research 安利给你的另一半？ | Roam Newsletter 漫游研究所周报 2021W12</title>
        <link>https://blog.jimmylv.info/2021-03-22-roam-newsletter-RoamCN2021W12/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2021-03-22-roam-newsletter-RoamCN2021W12/</guid>
        <pubDate>Mon, 22 Mar 2021 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;&lt;a href=&quot;https://twitter.com/i/status/1370639423658811392&quot;&gt;Tweet&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/Jimmy_JingLv&quot;&gt;@Jimmy_JingLv&lt;/a&gt; on [[March 13th, 2021]]:&lt;/p&gt;

&lt;p&gt;📮 Roam Newsletter 漫游研究所周报 #2021W12&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;#RoamCN2021W12 #RoamCN #WeeklyNewsletter&lt;/li&gt;
  &lt;li&gt;#roamcult #LearnInPublic #LearnWithJimmy #Zettelkasten&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/cn_roam&quot;&gt;@cn_roam&lt;/a&gt; &lt;a href=&quot;https://twitter.com/RoamResearch&quot;&gt;@RoamResearch&lt;/a&gt; &lt;a href=&quot;http://roamcult.vip&quot;&gt;roam-cn/roamcult.vip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-我一直在寻找的-chrome-插件支持将-roam-research-一直悬停在浏览器侧边栏&quot;&gt;#[[Roam 插件]] 我一直在寻找的 Chrome 插件，支持将 Roam Research 一直悬停在浏览器侧边栏&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamresearchFR/status/1370531473594408963?s=20&quot;&gt;https://twitter.com/roamresearchFR/status/1370531473594408963?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-roam42-支持新的-jump-nav-命令能够快速跳转到父级或同级相邻-block&quot;&gt;#[[Roam 插件]] #Roam42 支持新的 Jump nav 命令，能够快速跳转到父级或同级相邻 Block&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1370637978121428992?s=20&quot;&gt;https://twitter.com/roamhacker/status/1370637978121428992?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术-基于-puppeteer-实现的-roam-research-私有-api&quot;&gt;#[[Roam 技术]] 基于 puppeteer 实现的 Roam Research 私有 API&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/artpi/status/1299754234863390720?s=20&quot;&gt;https://twitter.com/artpi/status/1299754234863390720?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术-在-html-元素添加-data-link-uid-属性能够极大地方便开发者对-block-内容进行查询或修改&quot;&gt;#[[Roam 技术]] 在 HTML 元素添加 data-link-uid 属性，能够极大地方便开发者对 Block 内容进行查询或修改&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1370864539386970112?s=20&quot;&gt;https://twitter.com/roamhacker/status/1370864539386970112?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术-roamrender-将直接支持渲染-react-组件直接通过-javascript-运行代码即可&quot;&gt;#[[Roam 技术]] {roam/render} 将直接支持渲染 React 组件，直接通过 JavaScript 运行代码即可&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1368312682504458243?s=20&quot;&gt;https://twitter.com/roamhacker/status/1368312682504458243?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-可视化的数据处理流程代码和结果共同展现&quot;&gt;#[[Roam 周边]] 可视化的数据处理流程，代码和结果共同展现&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/_paulshen/status/1371213300080336897?s=20&quot;&gt;https://twitter.com/_paulshen/status/1371213300080336897?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-roam-是专为网状思维而设计的笔记工具作者的使用经验分享&quot;&gt;#[[Roam 用例]] Roam 是专为网状思维而设计的笔记工具，作者的使用经验分享&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/adam_keesling/status/1196864429695987713?s=20&quot;&gt;https://twitter.com/adam_keesling/status/1196864429695987713?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-roam-research-ocr-插件能够直接对图片内容进行文本识别&quot;&gt;#[[Roam 插件]] Roam Research OCR 插件，能够直接对图片内容进行文本识别&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/MitchSchwartzCo/status/1321632468735270914?s=20&quot;&gt;https://twitter.com/MitchSchwartzCo/status/1321632468735270914?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/cococ_rr/status/1371333171023855617?s=20&quot;&gt;https://twitter.com/cococ_rr/status/1371333171023855617?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-每天都是崭新的开始daily-notes-使用体验&quot;&gt;#[[Roam 用例]] 每天都是崭新的开始，Daily Notes 使用体验&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/wirtzdan/status/1371352813725487105?s=20&quot;&gt;https://twitter.com/wirtzdan/status/1371352813725487105?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-在-roam-research-中学习语言的工作流&quot;&gt;#[[Roam 用例]] 在 Roam Research 中学习语言的工作流&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/TheIndLang/status/1371206275774697474?s=20&quot;&gt;https://twitter.com/TheIndLang/status/1371206275774697474?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-作者指导学员使用-roam-research-的经验分享&quot;&gt;#[[Roam 用例]] 作者指导学员使用 Roam Research 的经验分享&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/rjnestor/status/1371597262426673156?s=20&quot;&gt;https://twitter.com/rjnestor/status/1371597262426673156?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-社区-roam-research-生日蛋糕-&quot;&gt;#[[Roam 社区]] Roam Research 生日蛋糕 🎂&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/ahmedlhanafy/status/1371227669858283525?s=20&quot;&gt;https://twitter.com/ahmedlhanafy/status/1371227669858283525?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-roam-research-系列教程之-3通过-roam-在上下文中漫游&quot;&gt;#[[Roam 教程]] Roam Research 系列教程之 3：通过 Roam 在上下文中漫游&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/kvistgaard/status/1370427396478930944?s=20&quot;&gt;https://twitter.com/kvistgaard/status/1370427396478930944?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-roam-research-健身健康知识公开-graph&quot;&gt;#[[Roam 用例]] Roam Research 健身健康知识公开 Graph&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/tombielecki/status/1371955773434044419?s=20&quot;&gt;https://twitter.com/tombielecki/status/1371955773434044419?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-roam42-smartblocks-新命令支持垂直和水平的屏幕布局控制类似-tmux-的窗口管理体验&quot;&gt;#[[Roam 插件]] #Roam42 #SmartBlocks 新命令，支持垂直和水平的屏幕布局控制，类似 Tmux 的窗口管理体验&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/PascalPrecht/status/1371855289285246977?s=20&quot;&gt;https://twitter.com/PascalPrecht/status/1371855289285246977?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-不断迭代内容产出的形式推文---博客---视频&quot;&gt;#[[Roam 洞见]] 不断迭代内容产出的形式：推文 -&amp;gt; 博客 -&amp;gt; 视频&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/cortexfutura/status/1372248564752125955?s=20&quot;&gt;https://twitter.com/cortexfutura/status/1372248564752125955?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-如何像-power-user-一样进行上下文切换&quot;&gt;#[[Roam 用例]] “如何像 Power User 一样进行上下文切换”&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1372279886119907333?s=20&quot;&gt;https://twitter.com/roamhacker/status/1372279886119907333?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-梦想中的文字处理器类似语法大爆炸的效果&quot;&gt;#[[Roam 周边]] 梦想中的“文字处理器”，类似语法大爆炸的效果&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/elzr/status/1372391789332725763?s=20&quot;&gt;https://twitter.com/elzr/status/1372391789332725763?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-roam-research-就是创作者的想法乐高&quot;&gt;#[[Roam 洞见]] Roam Research 就是创作者的“想法乐高”&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/JESSCATE93/status/1372718805957234691?s=20&quot;&gt;https://twitter.com/JESSCATE93/status/1372718805957234691?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-通过-smartblocks-自动移动-block-的位置&quot;&gt;#[[Roam 插件]] 通过 #SmartBlocks 自动移动 Block 的位置&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1372806097933717506?s=20&quot;&gt;https://twitter.com/roamhacker/status/1372806097933717506?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-生态-在-roam-research-里面直接制作和发布-newsletter&quot;&gt;#[[Roam 生态]] 在 Roam Research 里面直接制作和发布 Newsletter&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamreads/status/1372585116619317252?s=20&quot;&gt;https://twitter.com/roamreads/status/1372585116619317252?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-workflowy-终于支持图片和文件附件&quot;&gt;#[[Roam 周边]] Workflowy 终于支持图片和文件附件&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/WorkFlowy/status/1372581468770201600?s=20&quot;&gt;https://twitter.com/WorkFlowy/status/1372581468770201600?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-生态-zoteroroam-更新支持从-zotero-跳转至-roam-页面&quot;&gt;#[[Roam 生态]] zoteroRoam 更新，支持从 Zotero 跳转至 Roam 页面&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/AlixLahuec/status/1372384259969851394?s=20&quot;&gt;https://twitter.com/AlixLahuec/status/1372384259969851394?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-模板-关于会议讨论和项目计划的有用模板&quot;&gt;#[[Roam 模板]] 关于会议讨论和项目计划的有用模板&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/henry_cck/status/1372783124451524615?s=20&quot;&gt;https://twitter.com/henry_cck/status/1372783124451524615?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-adhdd-最佳治疗方案是使用-roam-research&quot;&gt;#[[Roam 洞见]] #ADHDd 最佳治疗方案是使用 Roam Research&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1263036306654785536?s=20&quot;&gt;https://twitter.com/Conaw/status/1263036306654785536?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-社区-作者分享自己如何把-roam-research-安利给自己老婆的有趣故事&quot;&gt;#[[Roam 社区]] 作者分享自己如何把 Roam Research 安利给自己老婆的有趣故事&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/MarcKoenig_/status/1372994139059580932?s=20&quot;&gt;https://twitter.com/MarcKoenig_/status/1372994139059580932?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-25-分钟的-roam-research-技巧分享&quot;&gt;#[[Roam 教程]] 25 分钟的 Roam Research 技巧分享&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/MarcKoenig_/status/1361457957431615488?s=20&quot;&gt;https://twitter.com/MarcKoenig_/status/1361457957431615488?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-把-roam-research-内容快速变成-slides&quot;&gt;#[[Roam 插件]] 把 Roam Research 内容快速变成 Slides&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/danfinlay/status/1373033177707470850?s=20&quot;&gt;https://twitter.com/danfinlay/status/1373033177707470850?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-写作能够有助于研究让读者和自己都能有所收获且有更多的突破&quot;&gt;#[[Roam 洞见]] 写作能够有助于研究，让读者和自己都能有所收获，且有更多的突破&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/danfinlay/status/1373033177707470850?s=20&quot;&gt;https://twitter.com/danfinlay/status/1373033177707470850?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-用好-roam-research-20的基础功能就能享受-80的好处&quot;&gt;#[[Roam 教程]] 用好 Roam Research 20%的基础功能，就能享受 80%的好处&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/pcsoundscaping/status/1373265546637156352?s=20&quot;&gt;https://twitter.com/pcsoundscaping/status/1373265546637156352?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-使用间隔重复-sr-进行学习的魔力&quot;&gt;#[[Roam 教程]] 使用间隔重复 SR 进行学习的魔力&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1373750089680875531?s=20&quot;&gt;https://twitter.com/roamhacker/status/1373750089680875531?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-图谱-知识管理第二大脑的双向链接动态变化图&quot;&gt;#[[Roam 图谱]] 知识管理第二大脑的双向链接动态变化图&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/pietronickl/status/1373632884830056454?s=20&quot;&gt;https://twitter.com/pietronickl/status/1373632884830056454?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术-从想法到项目作者分享自己如何创造-roam-excalidraw-画图插件&quot;&gt;#[[Roam 技术]] 从想法到项目，作者分享自己如何创造 Roam Excalidraw 画图插件&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/zsviczian/status/1373712129694560260?s=20&quot;&gt;https://twitter.com/zsviczian/status/1373712129694560260?s=20&lt;/a&gt;&lt;/blockquote&gt;
</description>
      </item>
    
      <item>
        <title>事物间丰富的关联，是我们抽象、感知和思考的重要部分 | Roam Newsletter 漫游研究所周报 2021W11</title>
        <link>https://blog.jimmylv.info/2021-03-13-roam-newsletter-RoamCN2021W11/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2021-03-13-roam-newsletter-RoamCN2021W11/</guid>
        <pubDate>Sat, 13 Mar 2021 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;&lt;a href=&quot;https://twitter.com/i/status/1369207465053581317&quot;&gt;Tweet&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/Jimmy_JingLv&quot;&gt;@Jimmy_JingLv&lt;/a&gt; on [[March 9th, 2021]]:&lt;/p&gt;

&lt;p&gt;📮 Roam Newsletter 漫游研究所周报 #2021W11&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;#RoamCN2021W11 #RoamCN #WeeklyNewsletter&lt;/li&gt;
  &lt;li&gt;#roamcult #LearnInPublic #LearnWithJimmy #Zettelkasten&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/cn_roam&quot;&gt;@cn_roam&lt;/a&gt; &lt;a href=&quot;https://twitter.com/RoamResearch&quot;&gt;@RoamResearch&lt;/a&gt; &lt;a href=&quot;http://roamcult.vip&quot;&gt;roam-cn/roamcult.vip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-blocks-in-roam-research-系列视频帮助你了解什么是-blockpage-和-block-的类型block-是-roam-research-的基石trees-in-the-forest&quot;&gt;#[[Roam 教程]] “Blocks in Roam Research” 系列视频，帮助你了解什么是 Block，Page 和 Block 的类型，“Block” 是 Roam Research 的基石，[[Trees in the forest]]&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1369522658677776384?s=20&quot;&gt;https://twitter.com/roamhacker/status/1369522658677776384?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术-roam-research-api-已支持-write-写操作从技术上来说可以做很多有趣的插件和集成操作比如说做一个类似-flomoplus-的数据导入插件-githubcomjimmylvroam-plus&quot;&gt;#[[Roam 技术]] Roam Research API 已支持 Write 写操作，从技术上来说可以做很多有趣的插件和集成操作！比如说做一个类似 FlomoPlus 的数据导入插件 &lt;a href=&quot;https://github.com/JimmyLv/roam-plus&quot;&gt;github.com/JimmyLv/roam-plus&lt;/a&gt;&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1352553777790902274?s=20&quot;&gt;https://twitter.com/roamhacker/status/1352553777790902274?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-历史-conor-关于-roam-research-最初的想法来源超链接-hypertext-之父-ted-nelson-上都计划&quot;&gt;#[[Roam 历史]] Conor 关于 Roam Research 最初的想法来源，“超链接 Hypertext” 之父 Ted Nelson 上都计划&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/azlenelza/status/1272600877493137408?s=20&quot;&gt;https://twitter.com/azlenelza/status/1272600877493137408?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1369509424654557187?s=20&quot;&gt;https://twitter.com/Conaw/status/1369509424654557187?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-生态-codex-编辑器想要打造的是-知识工作者的操作系统the-knowledge-workers-os&quot;&gt;#[[Roam 生态]] Codex 编辑器想要打造的是 知识工作者的操作系统（the Knowledge Worker’s OS）&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/codexeditor/status/1369515923262992384?s=20&quot;&gt;https://twitter.com/codexeditor/status/1369515923262992384?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技巧-通过特定域名查询关键词-&quot;&gt;#[[Roam 技巧]] 通过特定域名查询关键词 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;}&lt;/code&gt;&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RobertHaisfield/status/1343911948526612480?s=20&quot;&gt;https://twitter.com/RobertHaisfield/status/1343911948526612480?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技巧-通过--查找特定代码段甚至包括特定语言的代码段&quot;&gt;#[[Roam 技巧]] 通过 ``` 查找特定代码段，甚至包括特定语言的代码段&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RobertHaisfield/status/1369420330968743941?s=20&quot;&gt;https://twitter.com/RobertHaisfield/status/1369420330968743941?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-直接在-roam-research-里面运行-python-代码-alt--enter-可运行当前代码块alt--shift--enter-可运行当前笔记本中的所有代码块&quot;&gt;#[[Roam 插件]] 直接在 Roam Research 里面运行 Python 代码， Alt + Enter 可运行当前代码块，Alt + Shift + Enter 可运行当前笔记本中的所有代码块。&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/adam_krivka/status/1367932251959353347?s=20&quot;&gt;https://twitter.com/adam_krivka/status/1367932251959353347?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-通过-roam-research-学习希腊语能够主动发现语言中的常见构造&quot;&gt;#[[Roam 用例]] 通过 Roam Research 学习希腊语，能够主动发现语言中的常见构造&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/KyleStratis/status/1369378108583927830?s=20&quot;&gt;https://twitter.com/KyleStratis/status/1369378108583927830?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-conor-引用孙子兵法的机不可失来解释-roam-为什么没有-roadmap&quot;&gt;#[[Roam 洞见]] Conor 引用孙子兵法的「机不可失」来解释 Roam 为什么没有 Roadmap&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1369364863772921862?s=20&quot;&gt;https://twitter.com/Conaw/status/1369364863772921862?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-社区-第二届-roamsummit-roam-峰会美国东部时间-3-月-13-日星期六下午-2-点主题是探索-roam-编写的书籍&quot;&gt;#[[Roam 社区]] 第二届 #RoamSummit Roam 峰会，美国东部时间 3 月 13 日，星期六，下午 2 点，主题是探索 Roam 编写的书籍&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RoamBrain/status/1369357631194796040?s=20&quot;&gt;https://twitter.com/RoamBrain/status/1369357631194796040?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-roam-weather-smartblock可动态插入天气卡片并支持手动更新&quot;&gt;#[[Roam 插件]] Roam Weather SmartBlock，可动态插入天气卡片，并支持手动更新&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1369274865123999749?s=20&quot;&gt;https://twitter.com/roamhacker/status/1369274865123999749?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术-使用新的-filesystem-api-可以使-roamresearch-能够直接编辑本地的博客-markdown-文件&quot;&gt;#[[Roam 技术]] 使用新的 Filesystem API 可以使 &lt;a href=&quot;https://twitter.com/RoamResearch&quot;&gt;@RoamResearch&lt;/a&gt; 能够直接编辑本地的博客 Markdown 文件&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/adam_krivka/status/1368524087639826432?s=20&quot;&gt;https://twitter.com/adam_krivka/status/1368524087639826432?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-何时在-roam-research-中使用页面标签或属性&quot;&gt;#[[Roam 教程]] 何时在 Roam Research 中使用页面，标签或属性？&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/yak_collective/status/1369230545125793793?s=20&quot;&gt;https://twitter.com/yak_collective/status/1369230545125793793?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-使用-flowchartfun-可以直接通过文本生成-五行-关系图&quot;&gt;#[[Roam 周边]] 使用 &lt;a href=&quot;http://flowchart.fun&quot;&gt;flowchart.fun&lt;/a&gt; 可以直接通过文本生成 五行 关系图&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/SteveYang331/status/1369543055922126849?s=20&quot;&gt;https://twitter.com/SteveYang331/status/1369543055922126849?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-费曼学习法写作即是思考&quot;&gt;#[[Roam 洞见]] 费曼学习法，写作即是思考&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1369667930850537477?s=20&quot;&gt;https://twitter.com/roamhacker/status/1369667930850537477?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-使用间歇日记替代-to-do-list-提高效率&quot;&gt;#[[Roam 教程]] 使用间歇日记替代 To-Do List 提高效率&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1369917340847116289?s=20&quot;&gt;https://twitter.com/roamhacker/status/1369917340847116289?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-roamjs-插件-todo-爆炸效果快去把事情搞定吧&quot;&gt;#[[Roam 插件]] [[roam/js]] 插件 TODO 爆炸效果，快去把事情搞定吧！&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/artpi/status/1362813924802977797?s=20&quot;&gt;https://twitter.com/artpi/status/1362813924802977797?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-roam-research-最棒的一点在于-composability可组合性&quot;&gt;#[[Roam 洞见]] Roam Research 最棒的一点在于 Composability（可组合性）&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/artpi/status/1358432819027058695?s=20&quot;&gt;https://twitter.com/artpi/status/1358432819027058695?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-事物之间丰富的联系relationships-connections是人们抽象感知和思考的重要部分--tednelson&quot;&gt;#[[Roam 洞见]] 事物之间丰富的联系(relationships, connections)是人们抽象、感知和思考的重要部分 —— @TedNelson&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1369543916832190469?s=20&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1369543916832190469?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-想看看一篇天体物理学论文是如何诞生的吗&quot;&gt;#[[Roam 周边]] 想看看一篇天体物理学论文是如何诞生的吗？&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/realscientists/status/1369995661253480450?s=20&quot;&gt;https://twitter.com/realscientists/status/1369995661253480450?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-60s-极简-roam-research-教程第-8-期-block-reference&quot;&gt;#[[Roam 教程]] 60s 极简 Roam Research 教程，第 8 期 Block Reference&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/markmcelroy/status/1370356478599704576?s=20&quot;&gt;https://twitter.com/markmcelroy/status/1370356478599704576?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-通过-telegram-bot-自动发送内容到-roam-research-daily-notes&quot;&gt;#[[Roam 插件]] 通过 Telegram Bot 自动发送内容到 Roam Research Daily Notes&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/arn4v/status/1370405473367695360?s=20&quot;&gt;https://twitter.com/arn4v/status/1370405473367695360?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam--roamcult-学术界-discord-社区academia-roamana&quot;&gt;#[[Roam ]] #roamcult 学术界 Discord 社区，Academia Roamana&lt;/h3&gt;

&lt;p&gt;https://roamresearch.com/#/app/AcademiaRoamana&lt;/p&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/cortexfutura/status/1369740588015378433?s=20&quot;&gt;https://twitter.com/cortexfutura/status/1369740588015378433?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-在-roam-research-做计划真的很简单问自己三个问题我想完成什么我将如何开始有没有什么障碍-woop&quot;&gt;#[[Roam 用例]] 在 Roam Research 做计划真的很简单：问自己三个问题：我想完成什么？我将如何开始？有没有什么障碍？ [[WOOP]]&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/cortexfutura/status/1370325041578131458?s=20&quot;&gt;https://twitter.com/cortexfutura/status/1370325041578131458?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/cortexfutura/status/1370325020774428675?s=20&quot;&gt;https://twitter.com/cortexfutura/status/1370325020774428675?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-生态roamgarden-数字花园也将支持-块折叠-功能&quot;&gt;#[[Roam 生态]]&lt;a href=&quot;http://roam.garden&quot;&gt;roam.garden&lt;/a&gt; 数字花园也将支持 块折叠 功能&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/VladyslavSitalo/status/1370249616885653506?s=20&quot;&gt;https://twitter.com/VladyslavSitalo/status/1370249616885653506?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-磨刀记得砍柴&quot;&gt;#[[Roam 洞见]] 磨刀记得砍柴&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/760mph/status/1370063171814297600?s=20&quot;&gt;https://twitter.com/760mph/status/1370063171814297600?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-系列-thread-tweets--什么是-roam-research-的-block&quot;&gt;#[[Roam 教程]] 系列 Thread Tweets —— 什么是 Roam Research 的 Block？&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1364296274468614151?s=20&quot;&gt;https://twitter.com/roamhacker/status/1364296274468614151?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技巧-multibar-可以快速折叠文章段落roam-页面标题也可以加上背景图片-d&quot;&gt;#[[Roam 技巧]] Multibar 可以快速折叠文章段落，Roam 页面标题也可以加上背景图片 :D&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1370041146169294853?s=20&quot;&gt;https://twitter.com/roamhacker/status/1370041146169294853?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-如果页面滚动时其他部分的文本只是被压缩了--即保持可见状态但不会消失在屏幕外这样既能突出显示又能直接显示搜索字词的缩略图&quot;&gt;#[[Roam 洞见]] 如果页面滚动时，其他部分的文本只是被压缩了 —— 即保持可见状态但不会消失在屏幕外，这样既能突出显示又能直接显示搜索字词的缩略图&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/azlenelza/status/1370159999691919364?s=20&quot;&gt;https://twitter.com/azlenelza/status/1370159999691919364?s=20&lt;/a&gt;&lt;/blockquote&gt;
</description>
      </item>
    
      <item>
        <title>【译】Roam Research 自定义组件 —— 跟 {{roam/render}} 来一次亲密接触！</title>
        <link>https://blog.jimmylv.info/2021-03-10-a-closer-look-at-roamrender-zh-translation/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2021-03-10-a-closer-look-at-roamrender-zh-translation/</guid>
        <pubDate>Wed, 10 Mar 2021 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;https://roamresearch.com/&quot;&gt;Roam Research&lt;/a&gt; 采用的是 Clojure 技术栈的 &lt;a href=&quot;https://docs.datomic.com/on-prem/query/query.html&quot;&gt;Datomic&lt;/a&gt;/&lt;a href=&quot;https://github.com/tonsky/datascript&quot;&gt;datascript&lt;/a&gt; &lt;a href=&quot;https://zh.wikipedia.org/wiki/Datalog&quot;&gt;Datalog&lt;/a&gt; 数据库，能够将内容同步到不同的设备，并管理非常复杂的撤销操作，还能够支持各种程度的自定义组件和插件功能定制，方便开发者利用 &lt;a href=&quot;https://reagent-project.github.io/&quot;&gt;Reagent&lt;/a&gt; 渲染组件，并支持与 JavaScript 互操作。本文就将硬核解析 Roam 背后原理，发掘 Roam 基于 Block 的深层技术优势，帮助你迎接 Roam API 时代的到来！&lt;/p&gt;

  &lt;p&gt;原文地址：&lt;a href=&quot;https://www.zsolt.blog/2021/02/a-closer-look-at-roamrender.html&quot;&gt;A closer look at {roam/render}&lt;/a&gt; —— Zsolt Viczián&lt;/p&gt;
&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-gYoZl5j7qPc/YDqm3n30tJI/AAAAAAAAxsU/ngw1DveOti8V8CmcNI2hqP44zI1Vd6dIwCLcBGAsYHQ/w640-h548/swiss-army-knife.jpg&quot; alt=&quot;Swiss Army Knife&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Roam 就好像一把优秀的瑞士军刀，竟然包含一个完整的 ClojureScript 开发环境。在过去两周里，我逐渐熟悉了 ` {&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{roam/render}&lt;/code&gt;} `。这篇文章可以算作我自己的笔记，总结整理一下我的所见所学。&lt;/p&gt;

&lt;p&gt;这篇文章是针对开发者和 Roam 黑客的。如果你还不属于这些阵营，你很可能会对这些内容感到吃力。&lt;/p&gt;

&lt;p&gt;我并不是一个 Web 开发者，React、Clojure、Reagent 和 Datalog 对我来说完全是崭新的事物。我是一个典型的无知者无畏的终端用户，我知道如何构建一个基于宏的庞然大物，但却无法保持其健壮/可测试/可维护。在玩&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/render&lt;/code&gt;的过程中，有一次我几乎把我的整个 roam 数据库都毁掉了 —— 这与&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/render&lt;/code&gt;无关，一切都是因为我太笨了。请谨慎尝试我的结论和例子，欢迎在评论中分享更好的解决方案，或者联系我进行勘误。&lt;/p&gt;

&lt;h2 id=&quot;什么是-roamrender&quot;&gt;什么是 roam/render?&lt;/h2&gt;

&lt;p&gt;` {&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{roam/render}&lt;/code&gt;} `是&lt;a href=&quot;https://www.roamresearch.com/&quot;&gt;Roam&lt;/a&gt;中用于构建自定义组件的原生特性。这些组件可以是简单的表格、计算器、滑块，也可以是复杂的交互式工具，比如数据透视表、图表、流程图等。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/render&lt;/code&gt; 也是一个使用 Reagent 在 ClojureScript 中实现的 React 组件。你可以使用 Datalog 在 Roam 的 Datomic Graph 中访问你的数据。&lt;/p&gt;

&lt;p&gt;其实就在几周前，以上两句话中的每一个单词对我来说都是陌生的。让我们先来快速看看每个词的意思：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;React&lt;/strong&gt;是一个用于构建用户界面的 JavaScript 库。&lt;a href=&quot;https://reactjs.org/tutorial/tutorial.html&quot;&gt;*&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Clojure&lt;/strong&gt;(/ˈkloʊʒər/, 很像 Closure 闭包的拼写)是一种支持动态类型和函数式编程的 Lisp 方言。和其他 Lisp 方言一样，Clojure 将代码视为数据，并有一个 Lisp 宏系统。&lt;a href=&quot;https://en.wikipedia.org/wiki/Clojure&quot;&gt;*&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;ClojureScript&lt;/strong&gt;是一个针对 JavaScript 的&lt;a href=&quot;http://clojure.org/&quot;&gt;Clojure&lt;/a&gt;编译器。&lt;a href=&quot;https://clojurescript.org/&quot;&gt;*&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Reagent&lt;/strong&gt;是一个 React 的 ClojureScript 封装。它可以帮助你轻松创建 React 组件。Reagent 有三个主要的功能，使其易于使用：使用函数创建&lt;a href=&quot;https://purelyfunctional.tv/guide/reagent/js-comp&quot;&gt;React 组件&lt;/a&gt;，使用&lt;a href=&quot;https://purelyfunctional.tv/guide/reagent/hiccup&quot;&gt;Hiccup 生成 HTML&lt;/a&gt;，以及在&lt;a href=&quot;https://purelyfunctional.tv/guide/reagent/atoms&quot;&gt;Reagent Atoms&lt;/a&gt;中存储状态。Reagent 可以让你写出简洁可读的 React 代码。&lt;a href=&quot;https://purelyfunctional.tv/guide/reagent/what-is-reagent&quot;&gt;*&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Hiccup&lt;/strong&gt;是一个用于呈现 HTML 的 Clojure 库。它使用 vectors 来表示元素，使用 maps 来表示元素的属性。&lt;a href=&quot;https://github.com/weavejester/hiccup#:~:text=Hiccup%20is%20a%20library%20for,to%20represent%20an%20element%27s%20attributes.&quot;&gt;*&lt;/a&gt; 试着玩一玩&lt;a href=&quot;http://html2hiccup.buttercloud.com/&quot;&gt;HTML2Hiccup&lt;/a&gt;，可以帮助你更好地了解 hiccup 的工作原理。另外，你也可以直接在 Roam 中输入 hiccup，只要在一个空块中输入&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:hiccup [:code &quot;Hellow World!&quot;]&lt;/code&gt;，看看会发生什么。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Atoms&lt;/strong&gt;是 Clojure 中的一种数据类型，它提供了一种管理共享、同步、独立状态的方法。一个 Atom 就像其他编程语言中的任何引用类型一样。Atom 的主要用途是保存 Clojure 的不可变数据结构。 &lt;a href=&quot;https://www.tutorialspoint.com/clojure/clojure_atoms.htm#:~:text=Advertisements,is%20changed%20with%20swap!&quot;&gt;*&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Datomic&lt;/strong&gt;是一种新型数据库。Datomic 不是将数据收集到表格和字段中，而是由&lt;strong&gt;Datoms&lt;/strong&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[entity-id attribute value transaction-id]&lt;/code&gt; 建立。这种架构为改变和扩展数据库 Schema 提供了高度的灵活性，而不会影响现有的代码。&lt;a href=&quot;https://www.zsolt.blog/2021/01/Roam-Data-Structure-Query.html&quot;&gt;*&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Datalog&lt;/strong&gt;是一种基于 Prolog 的声明式、基于形式逻辑的查询语言。&lt;a href=&quot;https://www.igi-global.com/dictionary/datalog/6908&quot;&gt;*&lt;/a&gt;我分享了一些简单的 Datalog 实例，在&lt;a href=&quot;https://roamresearch.com/#/app/Zsolt-Blog/page/WUn5PuTDV&quot;&gt;这里&lt;/a&gt;查看如何生成 Roam Graph 有关的基本统计数据。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;入门指南&quot;&gt;入门指南&lt;/h2&gt;

&lt;h3 id=&quot;开启自定义组件&quot;&gt;开启自定义组件&lt;/h3&gt;

&lt;p&gt;自定义组件功能默认是禁用的。在你搞事情之前，你必须在用户设置中启用它。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-_Hg13x-YJpk/YDqp3Lt3mKI/AAAAAAAAxsc/mIDnT1SoXwcIQ3FnKWZai4DHWNPVVHCvQCLcBGAsYHQ/w640-h468/user-settings.jpg&quot; alt=&quot;enable custom components in user settings&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;hello-world&quot;&gt;Hello World!&lt;/h3&gt;

&lt;p&gt;你可以通过在 Block 中添加以下代码来嵌入 roam/render: ` {&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{roam/render: ((block-ref))}&lt;/code&gt;} ` 其中 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-ref&lt;/code&gt; 指的是你的脚本代码的块引用。脚本代码必须至少有一个函数。如果这个 Block 有多个函数，那么在组件创建时只会调用最后一个函数。&lt;/p&gt;

&lt;p&gt;被引用的代码块必须包含一个设置为 Clojure 类型的代码块。代码块的创建是通过使用三个反引号 ` ``` ` 来完成的。如果你不知道键盘上的反引号键在哪里，你也可以使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/&lt;/code&gt;菜单，然后选择 Clojure Code Block。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-MYRuH2resf0/YDqxC6MnBbI/AAAAAAAAxss/aOXSimG-DIsC9wVDRuszOIIhIfRQJmwBwCLcBGAsYHQ/w640-h360/HelloWorldRoamRender.gif&quot; alt=&quot;Hello World Roam Render Demo&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;一步一步来&quot;&gt;一步一步来&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;在一个新的 Block 中输入：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt; {&lt;/code&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{roam/render：((...))}} &lt;/code&gt;。&lt;/li&gt;
  &lt;li&gt;当你开始在双括号之间打字时，Roam 会弹出 “search for blocks”。选择 “Create as block below”。这将在你当前 Block 下面创建一个 Block，并自动在括号之间放置一个块引用。&lt;/li&gt;
  &lt;li&gt;导航到新的 Block，并添加两个额外的反引号``来创建一个代码块。&lt;/li&gt;
  &lt;li&gt;将代码的语言设置为 Clojure。&lt;/li&gt;
  &lt;li&gt;最好给每个组件都有自己的命名空间&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(ns myns.1)&lt;/code&gt;，虽然 Hello World 没有它也能工作。这将为你在以后的探索省去很多头疼的问题，因为当同名的函数相互竞争时，调试会让人非常头大。我遵循一个简单的模式，按顺序给我的测试命名空间编号。当我准备好了一个组件，我才会给它自己合适的命名空间。&lt;/li&gt;
  &lt;li&gt;代码块应该至少有一个函数：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(defn hello-world [])&lt;/code&gt;。&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[:div&quot;...&quot;]&lt;/code&gt; hiccup 这种写法等价于 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;div&amp;gt;Hello World&amp;lt;/div&amp;gt;&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blogpost.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;hello-world&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Hello World&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;恭喜你！你已经使用 ClojureScript 成功创建了你的第一个 Roam 组件！现在你应该看到 Hello World 出现在代码上方的 Block 中。&lt;/p&gt;

&lt;h3 id=&quot;接收-input-参数&quot;&gt;接收 input 参数&lt;/h3&gt;

&lt;p&gt;当你开始为实际用例构建组件的时候，你很快就会意识到，如何知道当前组件正在运行的 Block 的 ID 呢？你需要这个 ID 来创建能够感知上下文的组件，即它们需要知道自己选择在哪个 Page 上，上级或上级有哪些 Block 等等。&lt;/p&gt;

&lt;p&gt;我花了好几天的时间才发现如何做到这一点。我想让你省点力气! 当一个组件被调用时，Roam 会把 block-id 作为第 0 个参数传递给主函数（注意：你代码块中的最后一个函数）。当然，Roam 还会传递当你调用组件时，所输入的其他任何参数。&lt;/p&gt;

&lt;p&gt;在新的 Block 输入下面的脚本，将产生以下输出。(当然，请注意，当你在自己的 Graph 中尝试这个脚本时，Block 的 ID &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;((Vy8uEQJiL))&lt;/code&gt;会有所不同，所以对应的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-uid&lt;/code&gt; “eR7tRno7B “也会不同。)&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; roam/render: &lt;span class=&quot;o&quot;&gt;((&lt;/span&gt;Vy8uEQJiL&lt;span class=&quot;o&quot;&gt;))&lt;/span&gt; 10 &lt;span class=&quot;s2&quot;&gt;&quot;input 1&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;input&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;vector&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;with&quot;&lt;/span&gt; 5 &lt;span class=&quot;s2&quot;&gt;&quot;elements&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;:key1 &lt;span class=&quot;s2&quot;&gt;&quot;this is a map&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;key2&quot;&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;value 2&quot;&lt;/span&gt; :key3 15&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;1 2 3&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;#{&quot;a&quot; &quot;b&quot; &quot;c&quot;} } }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-pD3eddnuTxM/YD0yQX3I1WI/AAAAAAAAxu0/-b0LRqDcc8I0b_f4wNc9hm31Uk89QwdiACLcBGAsYHQ/s16000/Arguments%2Bexample.jpg&quot; alt=&quot;datatypes / arguments example&quot; /&gt;&lt;/p&gt;

&lt;p&gt;这里的内容很多。让我们借此机会学习一下 Clojure 数据结构。我正在向自定义组件传递六个参数。除了这六个参数之外，Roam 默认将 block-uid 作为第一个参数传递。如果你想深入了解 Clojure 数据结构，我推荐这篇&lt;a href=&quot;_COPY11@daniel.oliver.king/getting-work-done-in-clojure-the-building-blocks-39ad82796926&quot;&gt;文章&lt;/a&gt;。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;第 0 个参数是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-uid&lt;/code&gt;。它是作为一个单一元素的 map 传递的。&lt;/li&gt;
  &lt;li&gt;接下来，我添加到组件的第一个参数是一个 integer 整数。我可以简单地把它作为一个数字传递给组件。&lt;/li&gt;
  &lt;li&gt;然后是一个 string 字符串。Clojure 只接受双 “引号” 标记的字符串。单个 ‘引号’（单引号）有不同的含义。使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;&lt;/code&gt;会产生一个不被计算的形态，下文还会提到如何在 datalog 查询中使用单引号。&lt;/li&gt;
  &lt;li&gt;第三个输入参数是一个 vector。请注意，在 Clojure 中，你可以用空格隔开一个 vector 的多个元素。这个 vector 总共有四个元素，三个字符串，一个整数。&lt;/li&gt;
  &lt;li&gt;接下来是一个有三个 keys-values 的 map。你可以使用 “string” 作为 key，就像在 JavaScript 对象中一样，然而，Clojure 还提供了使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:keywords&lt;/code&gt; 作为 key 的方式。关键词以 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:&lt;/code&gt; 冒号开头。你可以使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;,&lt;/code&gt; 逗号来分隔 key-value 键值对，但这不是必须的。注意在输入中我没有使用逗号。&lt;/li&gt;
  &lt;li&gt;第五个参数（Arg 4）是一个 list 列表。列表的主要用途是表示未被计算的代码，在你进行元编程时，用来编写&lt;strong&gt;生成或操作&lt;/strong&gt;其他代码的代码。&lt;/li&gt;
  &lt;li&gt;最后一个参数是一个 set 集合。set 和 vector 很像，关键的区别是 set 中的每个值都是唯一的。同样根据设计，set 中每一项的顺序是任意的。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;代码本身是自解释的。你应该注意到我是如何使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[:b]&lt;/code&gt;，相当于&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;b&amp;gt;...&amp;lt;/b&amp;gt;&lt;/code&gt; 用来表示粗体文本。&lt;a href=&quot;https://clojuredocs.org/clojure.core/map-indexed&quot;&gt;clojure.core/map-indexed&lt;/a&gt;将把输入向量 args 中的每个元素传给匿名函数&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;fn[i n]&lt;/code&gt;，其中&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;i&lt;/code&gt;是索引号，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;n&lt;/code&gt;是正在处理的 vector 的当前元素。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blogpost.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Number of arguments received: &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;map-indexed&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Arg &quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;: &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;现在我们知道第 0 个参数总是带有 block-uid 的 map，我们可以稍微修改一下我们的代码，将 block-uid 接收到一个专用变量中。这是我在所有组件中使用的 “standard” 主函数声明。 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(defn main [{:keys [block-uid]} &amp;amp; args]&lt;/code&gt;。将前面的例子用标准 main 函数稍微改写一下，就会变成这样。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blogpost.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:keys&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block-uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;The block-uid is: &quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block-uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:br&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Number of arguments received: &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;map-indexed&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Arg &quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;: &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;一个简单的-reagent-表单&quot;&gt;一个简单的 Reagent 表单&lt;/h2&gt;

&lt;p&gt;Reagent 是表单交互的关键。它们允许你根据用户输入的数据，动态地改变组件的 HTML 渲染，无论是组件本身还是在 Graph 中的 Page 页面。&lt;/p&gt;

&lt;p&gt;为了理解下一个例子，你首先需要了解 Clojure 变量。Clojure 中的所有变量都是不可变的，这意味着它们是作为常量创建的。变量可以有不同的作用域，也就是说，你可以在命名空间的层次上定义变量，或者只是在一个函数中定义变量。但是一旦设置，它们的值就不能改变。&lt;/p&gt;

&lt;p&gt;有几个方法可以绕过这种不可变性。其中之一是通过使用 atoms。 atom 的工作原理我就不深究了(顺便说一句，就算我想解释也解释不清楚)，Atom 就是对一个值的引用。使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;swap!&lt;/code&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;reset!&lt;/code&gt;可以把这个引用改成一个新的值。在&lt;a href=&quot;https://clojuredocs.org/clojure.core/swap!&quot;&gt;clojure.core/swap!&lt;/a&gt;中，你可以在给 Atom 分配新的值之前访问它的前一个值，在&lt;a href=&quot;https://clojuredocs.org/clojure.core/reset!&quot;&gt;clojure.core/reset!&lt;/a&gt;中，你只需给 Atom 分配一个新的值，而不用去管它的前一个值。&lt;/p&gt;

&lt;p&gt;在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/render&lt;/code&gt;中，我使用&lt;a href=&quot;http://reagent-project.github.io/docs/master/reagent.core.html#var-atom&quot;&gt;reagent.core/atom&lt;/a&gt;而不是&lt;a href=&quot;https://clojuredocs.org/clojure.core/atom&quot;&gt;clojure.core/atom&lt;/a&gt;。Reagent atoms 与普通 atoms 完全一样，只是它们会跟踪&lt;a href=&quot;https://clojuredocs.org/clojure.core/deref&quot;&gt;derefs&lt;/a&gt;（即访问它们的值）。Reagent 组件如果 derefs（解引用）发现其中的值发生变化，就会自动重新渲染。在实践中，这就意味着你可以根据数据的变化动态地改变组件。&lt;/p&gt;

&lt;p&gt;我们将构建一个简单的表单，只包含一个输入字段。当你在 Graph 中输入一个页面的名称时，这个表单就会返回该页面的 UID。例如，你可以用这个来创建一个直接超链接到你的页面，URL 格式为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;https://roamresearch.com/#/app/YOUR-GRAPH/page/9char-UID&lt;/code&gt;。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blogpost.3&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:require&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reagent.core&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:as&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;roam.datascript&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:as&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;query-list&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;rd/q&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?e&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:node/title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?e&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;r/atom&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;TODO&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:on-change&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;reset!&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;-target&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;-value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))}]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:br&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;query-list&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;有几件事值得解释一下：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;请注意命名空间声明下的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:require&lt;/code&gt;块。这些是我们代码中引用的命名空间。我稍后会分享一个简单的组件，你可以用它来探索 Roam 中所有可用的命名空间。使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:as&lt;/code&gt;你可以指定一个别名来引用你代码中的命名空间。&lt;/li&gt;
  &lt;li&gt;在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;query-list&lt;/code&gt;函数中，我们使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam.datascript&lt;/code&gt;(rd) 命名空间中的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;q&lt;/code&gt;函数执行一个简单的数据记录 query。请注意查询&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;[:find ?uid .&lt;/code&gt;开头的单引号 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&apos;&lt;/code&gt;。另外，请注意&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?uid&lt;/code&gt;后面的点 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.&lt;/code&gt;。这个点 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.&lt;/code&gt; 将查询的结果转换为一个标量。我在这里使用它，是因为我想要找一个单一的 uid 值作为函数返回值。&lt;/li&gt;
  &lt;li&gt;依然是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;query-list&lt;/code&gt; 函数，请注意我们没有在函数的结尾有一个类似于 JavaScript 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;return&lt;/code&gt;的语句。在 Clojure 中，函数中最后一次调用的结果总是被返回。由于&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;query-list&lt;/code&gt;只包含一次调用，所以在执行 query 时，将直接返回&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;rd/q&lt;/code&gt;的结果。&lt;/li&gt;
  &lt;li&gt;请注意，在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;main&lt;/code&gt;函数中，&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;x&lt;/code&gt; 被定义为一个初始值为 “TODO” 的 Reagent atom。将声明放在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(fn[]&lt;/code&gt;后面的匿名函数之外，可以确保在创建组件时，只会设置一次 atom，而不是在每一次往 INPUT 框输入任何文本时，都将其重置为默认值。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;以上是由&lt;a href=&quot;https://twitter.com/Conaw?s=20&quot;&gt;Conor&lt;/a&gt;的一个例子改编的。你可以在 Roam help 数据库 &lt;a href=&quot;https://roamresearch.com/#/app/help/page/Tbl1U8OFT&quot;&gt;这里&lt;/a&gt; 找到 Conor 的版本。我的解决方案和 Conor 的解决方案之间的一个关键区别是，他使用的是&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam.datascript.reactive&lt;/code&gt;，而不是仅仅使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam.datascript&lt;/code&gt;。在这个具体的例子中，从我的理解来看它们是没有区别。如果我的理解是正确的，Datascript reactive 提供了一种创建查询的方法，当其结果集发生变化时，它可以自动识别。它们可以用于创建交互式组件，比如&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt; {&lt;/code&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{table}&lt;/code&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;} &lt;/code&gt;。&lt;/p&gt;

&lt;h2 id=&quot;如何存储组件的属性值&quot;&gt;如何存储组件的属性值&lt;/h2&gt;

&lt;p&gt;当你重新打开页面或关闭并重新打开 Roam 时，组件会被重新初始化。在大多数情况下，你会希望以某种方式存储组件的属性，这样当你下次打开页面时，你会发现组件处于你离开时的状态。&lt;/p&gt;

&lt;p&gt;你可以选择将信息写入 Block 中，并决定写入哪一个 Block。你可以写到嵌套在组件下的 Block ，或者写到一个工具页面上的 Block 里面，例如&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[[my component/data]]&lt;/code&gt; 或者更新执行组件的那个 Block。最后一种选择涉及更新&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt; {&lt;/code&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{roam/render: ((block-UID)) }&lt;/code&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;} &lt;/code&gt;与 input 参数，这与我们在前面的例子中打印 input 参数的方式有些类似。我将在一个非常简单的例子中演示如何做到这一点。&lt;/p&gt;

&lt;p&gt;顺便说一下，我用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;datascript.core&lt;/code&gt;做了一个实验，将自定义实体写入到 Roam 数据库。我也能够执行查询，但是没有找到一种方法让 Roam 保存更改。手动编辑自定义实体到 EDN 文件中是可行的（&lt;a href=&quot;https://twitter.com/zsviczian/status/1353772383186923520?s=20&quot;&gt;演示&lt;/a&gt;），所以使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;datascript&lt;/code&gt;添加自定义实体应该也是可行的。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blogpost.4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:require&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;roam.datascript&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:as&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rd&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;roam.block&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:as&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;clojure.string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:as&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block-uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;code-ref&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;rd/q&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                              &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                              &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                         	     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                            &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block-uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;str&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;re-find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;\({2}.{9}\){2}&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args-str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;str/join&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;render-string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;str/join&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;block/update&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block-uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
               &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;render-string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}})))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:keys&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block-uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;some-value&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;string&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;value&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:strong&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;args: &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;str/join&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:br&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:button&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:draggable&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:on-click&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block-uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;some-value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Save&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这个组件将保存 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;some-value&lt;/code&gt; 的值。在这个例子中，为了简单起见，它是硬编码的，但当然，你可以构建任何你想要的数据结构来代替 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;some-value&lt;/code&gt;。请注意以下几点：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;我的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;save&lt;/code&gt; 函数是在 main 函数中按钮的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:on-click&lt;/code&gt;事件中调用的。在我的实验中，每次组件改变其值时自动调用 save 的效果并不好，因为每次覆盖&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt; {&lt;/code&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{roam/render: ((block-UID))}&lt;/code&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;} &lt;/code&gt;的时候，组件都会重新初始化，使得无法填写表单，或者通过交互的方式使用组件。&lt;/li&gt;
  &lt;li&gt;我在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;save&lt;/code&gt; 函数中定义了三个变量。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code-ref&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;arg-str&lt;/code&gt;和&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;render-string&lt;/code&gt;。&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;code-ref&lt;/code&gt;将保存 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-string&lt;/code&gt; 的当前值，因为我在执行 datalog 查询的时候，会读取&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/string&lt;/code&gt;属性的当前值，并通过&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-uid&lt;/code&gt;过滤。&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-&amp;gt;&amp;gt;&lt;/code&gt;是一个函数，它通过一组 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(str)&lt;/code&gt;和&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(re-find)&lt;/code&gt; 的形式来执行表达式。它的唯一目的是让代码更易读。&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;re-find&lt;/code&gt;中的正则表达式会找到&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt; {&lt;/code&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{roam/render: &lt;/code&gt;后面的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;((block-UID))&lt;/code&gt;。&lt;/li&gt;
  &lt;li&gt;一旦&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;render-string&lt;/code&gt;准备好了，我就调用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roamAlphaAPI&lt;/code&gt; 的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block/update&lt;/code&gt; 将 Block 更新为我的 string 文本。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;下面是这段代码的运行情况：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-fZDfcBqlUMo/YDukLKjvecI/AAAAAAAAxts/7g_W38iayWkVrXrv4VDDSQm6we2K1JO8QCLcBGAsYHQ/w640-h360/2021-02-28%2B15-08-39.gif&quot; alt=&quot;Saving state&quot; /&gt;&lt;/p&gt;

&lt;p&gt;似乎还有一种方法，可以使用 Reagent 在 Form-3 Components 中所提供的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:component-will-unmount&lt;/code&gt;事件处理器，来触发保存组件。虽然我还没有尝试过这种方法，但根据文档，这应该提供了一种方法来存储组件的属性，当你导航到不同的页面时，它就会从当前视图中消失。如果你对此感兴趣，你可以阅读&lt;a href=&quot;https://purelyfunctional.tv/guide/reagent/what-is-reagent&quot;&gt;这里&lt;/a&gt;。&lt;/p&gt;

&lt;h2 id=&quot;如何与-javascript-互操作&quot;&gt;如何与 Javascript 互操作&lt;/h2&gt;

&lt;p&gt;ClojureScript 提供了一种调用 JavaScript 函数的简单方法。当你想访问 DOM document 属性或函数时，这就非常实用了。比如调用 roam42 函数或创建一个 JavaScript 钩子来处理&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/render&lt;/code&gt;组件的数据（可以节省你学习 Clojure 的时间）。&lt;/p&gt;

&lt;p&gt;第一个例子是返回页面的 location 位置。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blogpost.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;js/document&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;-location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;-href&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;请注意 JavaScript DOM &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;document&lt;/code&gt; 是如何使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;js/document&lt;/code&gt;访问的。&lt;/p&gt;

&lt;p&gt;属性是用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-property&lt;/code&gt;符号来访问的。用于访问对象属性的 JavaScript &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.&lt;/code&gt; 点符号，需要转化为嵌套的小括号，每个括号都调用下一个属性或函数。&lt;/p&gt;

&lt;p&gt;使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;-&amp;gt;&lt;/code&gt;可以使代码更易读，特别是在属性链特别长的时候。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blogpost.6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;js/document&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.-location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.-href&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;现在，我们将再做一遍上面的 Reagent 表单简单示例 (blogpost.3)，但是将&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(defn query-list [x]&lt;/code&gt;替换为 JavaScript 来执行我们的 datalog 查询。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-eTvAeqQy-j0/YDuy4ETGNRI/AAAAAAAAxt0/YIxJZv7JezsId_dcbfZDD247-mfTHyUXgCLcBGAsYHQ/w640-h422/javascript%2Binterop.jpg&quot; alt=&quot;javascript interoperability&quot; /&gt;&lt;/p&gt;

&lt;p&gt;下面是 ClojureScript 的代码。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blogpost.7&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:require&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
   &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reagent.core&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:as&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;r/atom&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;TODO&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:input&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:value&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
       &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:on-change&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;reset!&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;-target&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;-value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))}]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:br&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.myDemoFunction&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;js/window&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以及 ` {&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{roam/js}&lt;/code&gt;} ` 的代码。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;&apos;myDemoFunction&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;roamAlphaAPI.q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                          &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                          &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?e&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:node/title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                                 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?e&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如果你想把多个变量传给 JavaScript，你可以在函数调用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(.myFunction js/window variable-1, @an-atom, block-uid)&lt;/code&gt;之后简单地列出这些变量。&lt;/p&gt;

&lt;h2 id=&quot;roam-已有的命名空间&quot;&gt;Roam 已有的命名空间&lt;/h2&gt;

&lt;p&gt;在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/render&lt;/code&gt; 中有以下命名空间。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Clojure:&lt;/strong&gt; cljs.pprint, clojure.core, clojure.edn, clojure.pprint, clojure.repl, clojure.set, clojure.string, clojure.template, clojure.walk。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Roam:&lt;/strong&gt; roam.block, roam.datascript, roam.datascript.reactive, roam.page, roam.right-sidebar, roam.user, roam.util。&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;其他：&lt;/strong&gt; datascript.core、reagent.core。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这段代码将列出每个命名空间中所有可用的函数。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blogpost.8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:strong&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pr-str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;pr-str&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ns-publics&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;seq&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))]])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;into&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;-&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;all-ns&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;ns-name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))))])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;tips-和技巧&quot;&gt;Tips 和技巧&lt;/h2&gt;

&lt;h3 id=&quot;一些有用的链接&quot;&gt;一些有用的链接&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/bbatsov/clojure-style-guide&quot;&gt;A community coding style guide for the Clojure programming language&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://clojure.org/api/cheatsheet&quot;&gt;Clojure - Cheatsheet&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://clojuredocs.org/&quot;&gt;Community-Powered Clojure Documentation and Examples&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.freecodecamp.org/news/here-is-a-quick-overview-of-the-similarities-and-differences-between-clojurescript-and-javascript-c5bd51c5c007/&quot;&gt;A visual overview of the similarities and differences between ClojureScript and JavaScript&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.zsolt.blog/2021/01/Roam-Data-Structure-Query.html&quot;&gt;My blogpost on Roam Datalog&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.datomic.com/on-prem/query/query.html&quot;&gt;Datomic Queries and Rules&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://cljdoc.org/d/datascript/datascript/1.0.4/api/datascript.core&quot;&gt;datascript.core - datascript 1.0.4&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://purelyfunctional.tv/guide/reagent/what-is-reagent&quot;&gt;ClojureScript + Reagent Tutorial with Code Examples&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://purelyfunctional.tv/guide/clojure-collections/&quot;&gt;Clojure Data Structures Tutorial with Code Examples&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://roamresearch.com/#/app/Zsolt-Blog/page/ZaQLABByl&quot;&gt;My growing list of roam/render examples in the Roam help database&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://lwhorton.github.io/2018/10/20/clojurescript-interop-with-javascript.html#property-access&quot;&gt;Clojurescript Interop With Javascript&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@daniel.oliver.king/getting-work-done-in-clojure-the-building-blocks-39ad82796926&quot;&gt;Getting Work Done in Clojure: The Building Blocks&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://html2hiccup.buttercloud.com/&quot;&gt;HTML2Hiccup - An HTML to Hiccup converter for Clojure and ClojureScript&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;下面是我自己写的一些组件，因为我在继续深入研究&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/render&lt;/code&gt;。请在你的测试/开发 Graph 中尝试它，一定要格外小心。虽然我相信这些例子，应该可以在不损坏你的数据库的前提下工作，但如果出了问题，我概不负责哦……&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://roamresearch.com/#/app/Zsolt-Blog/page/LXWC4CgKj&quot;&gt;A configurable roam/render form with a javascript hook&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://roamresearch.com/#/app/Zsolt-Blog/page/HSJjyWEZJ&quot;&gt;An alternative table component&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://roamresearch.com/#/app/Zsolt-Blog/page/npT41MApz&quot;&gt;A query component for free text sibling query&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你也可以随意浏览我的 Graph，里面有很多有关 Clojure 和 Reagent 成功和不成功的尝试。我会尽量把成功/不成功的解决方案都标出来。&lt;/p&gt;

&lt;h3 id=&quot;调用组件&quot;&gt;调用组件&lt;/h3&gt;

&lt;p&gt;` {&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{roam/render: ((block-UID))}&lt;/code&gt;} &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;引用组件的形式不是很友好。它需要点击几次才能得到 &lt;/code&gt;block-uid` 并将其插入到渲染的 Block 中。我发现了两种选择。&lt;/p&gt;

&lt;p&gt;你可以在 roam/templates 中创建一个简单的本地漫游模板，然后在那里用一个友好的名字添加你的组件。然后，当你需要它时，你可以使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;;;template-name&lt;/code&gt;将组件插入到你的文档中。&lt;/p&gt;

&lt;p&gt;你也可以 Hack 一下 block 的 UIDs。我在&lt;a href=&quot;https://twitter.com/zsviczian/status/1365606725924044808?s=20&quot;&gt;这里&lt;/a&gt;提供了一个解决方案。这将允许你用更友好的名字来创建组件，比如我的 query 查询组件。 ` {&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{roam/render: ((str_query))}&lt;/code&gt;} `。&lt;/p&gt;

&lt;h3 id=&quot;前置声明&quot;&gt;前置声明&lt;/h3&gt;

&lt;p&gt;这个让我头疼了几个小时。 Clojure 采用的是单通道（single-pass）编译。这意味着，如果一个函数在声明之前被调用，编译器会抛出一个错误。在某些情况下，不可能按照函数的使用顺序来声明函数，比如在涉及两个函数的迭代中。这时&lt;a href=&quot;https://clojuredocs.org/clojure.core/declare&quot;&gt;clojure.core/declare&lt;/a&gt;就很用了，你可以做一个正向声明，编译器就会知道，在这之后会有这个函数的定义。&lt;/p&gt;

&lt;h3 id=&quot;输出-roam-的原生链接&quot;&gt;输出 Roam 的原生链接&lt;/h3&gt;

&lt;p&gt;如果你正在构建组件，当你想输出 Roam 原生链接时将会遇到一个问题。你可以直接点击链接，就会打开页面。你也可以&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shift-click&lt;/code&gt;的链接，就会在侧边栏中打开页面。我发现有三种方法可以实现输出这种可工作的链接。&lt;/p&gt;

&lt;p&gt;最简单的方法是使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roamAlphaAPI&lt;/code&gt;创建一个 Block，并在这个 Block 字符串中放置一个&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;page link&lt;/code&gt;或&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block-ref&lt;/code&gt;。这将转换为一个正确的 Roam 链接。&lt;/p&gt;

&lt;p&gt;另一种方法是创建一个包含 Roam 查询的 Block，并在查询参数中包含你想显示的链接：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt; {&lt;/code&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{query: {or: page linkblock-ref}&lt;/code&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;} &lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;由于 Roam 在几天前发布了&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam.right-sidebar&lt;/code&gt;命名空间，现在可以完全模仿 Roam 原生链接了。我还没有时间去试验这第三个选项，但它看起来是可行的。&lt;/p&gt;

&lt;p&gt;如果你对此感兴趣，不妨到我的&lt;a href=&quot;https://roamresearch.com/#/app/Zsolt-Blog/page/BLY329mUQ&quot;&gt;Graph&lt;/a&gt;中看看，也许从写这篇文章的时候起，我已经实现了解决方案。 我将创建一个响应点击事件的 Reagent 组件。在点击时，我将把浏览器导航到一个类似于下面 JavaScript 例子的链接。在&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;shift-click&lt;/code&gt;时，我将使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam.right-sidebar&lt;/code&gt;来打开链接。&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;getRoamLink&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;if &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;includes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/page/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;origin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;uid&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
      &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;substring&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;origin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;/page/&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&apos;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;uid&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;debug-调试&quot;&gt;Debug 调试&lt;/h3&gt;

&lt;p&gt;我使用的是以下代码进行调试。通过将 slient 开关转为 true，我可以禁用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;console.log&lt;/code&gt;调试信息。可能无需多言，input 参数只是为了这个例子。&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-q78IoneVJZw/YDvVFub1BsI/AAAAAAAAxuc/HTTM5Pb-AeszM9mJZ0mBgkvOcPxVcDLrQCLcBGAsYHQ/w640-h210/debug-demo.jpg&quot; alt=&quot;Debug demo&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-atzVxLEWhv4/YDvUJ8om7MI/AAAAAAAAxuQ/dZeN-6kZ3aIkh6dpDV75eU3Oa3YpEBYNwCLcBGAsYHQ/w640-h252/console.jpg&quot; alt=&quot;console.log&quot; /&gt;&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ns&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;blogpost.9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;def&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;silent&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;if-not&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;silent&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;.-log&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;js/console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)))&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;defn&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[{&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:keys&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block-uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;(main)  block-uid: &quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;block-uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;  args: &quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:div&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;debug demo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;一些限制&quot;&gt;一些限制&lt;/h2&gt;

&lt;p&gt;基于 Roam 是一个笔记应用这个前提，拥有 ClojureScript 环境当然很牛逼。但是，就像瑞士军刀的微型锯子一样，在某些情况下，它是很方便的。但如果你想砍一棵树，请去买一把电锯。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/render&lt;/code&gt; 有两个巨大的限制。它没有文档，更重要的是，它缺乏适当的调试工具。它确实会将一些错误信息输出到控制台日志中，如果有一致的调试信息，就有可能追踪到错误，但它严重缺乏基本的调试功能，如 breakpoints、watches 等等。当你排除 ClojureScript 代码故障时，就会比本来要花费的时间要长很多。&lt;/p&gt;

&lt;p&gt;比较好的一点是，你可以将代码分别放到兄弟层级的 Block，这样就可以更好地添加注释了，利用中间的 Block 加入流程图、解释等，有点类似于 Python 中的 Jupiter Notebook。但是，你无法将可能频繁使用的函数，放到同一个共享的命名空间，以便在组件之间重用。我尝试将引用共享名称空间的 Block 作为组件的同级 Block，但不起作用。一个变通的办法是把所有组件的源代码放在同一个页面上，并放到同一个命名空间中。这样做是可行的，但如果你有很多组件，恐怕会变得很乱。这也会让你很难跟其他人共享组件。&lt;/p&gt;

&lt;p&gt;Datascript 也有一些限制。你不能创建自己的&lt;a href=&quot;http://www.learndatalogtoday.org/chapter/6&quot;&gt;转换函数&lt;/a&gt;。你不能在 Roam 数据库中创建自定义实体。还有一些 Clojure 命名空间和函数缺失。例如，&lt;a href=&quot;https://clojuredocs.org/clojure.string/lower-case&quot;&gt;clojure.string/lower-case&lt;/a&gt;无法使用。我想使用小写字母来支持对大小写不敏感的搜索，幸运的是，实际情况下配合 &lt;a href=&quot;https://clojuredocs.org/clojure.core/re-find&quot;&gt;clojure.core/re-find&lt;/a&gt;与&lt;a href=&quot;https://clojuredocs.org/clojure.core/re-pattern&quot;&gt;clojure.core/re-pattern&lt;/a&gt; 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(?i)&lt;/code&gt; flag 有一个可以变通的方法。&lt;/p&gt;

&lt;h2 id=&quot;最终结论&quot;&gt;最终结论&lt;/h2&gt;

&lt;p&gt;在笔记应用中拥有一个 Clojure 执行环境绝对是很酷的。但是，如果没有相应的调试工具和文档，开发组件的效率其实非常低。&lt;/p&gt;

&lt;p&gt;比较好的一点是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/render&lt;/code&gt; 和 ClojureScript 可以用来输出渲染自定义组件，比如表单、数据透视表和其他交互工具。&lt;/p&gt;

&lt;p&gt;基于我现有的知识，其实与 JavaScript 互操作似乎是最好的方式。你可以使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam/render&lt;/code&gt;，顾名思义，渲染输出的部分，然后你可以使用 JavaScript 来构建应用程序的逻辑部分。如果这样做的话，你就可以同时得到两个世界里最棒的部分了。你可以在 Reagent 中轻松地渲染响应式组件，这样就是在一个真正的开发环境中，使用满足需求的调试工具完成大部分的开发工作。此外，你可以使用你已经熟悉的语言进行开发（假设你已经具备了 JS 技能），你还能够在 JavaScript 中创建可重用的代码，这样还可以跟其他人共享复用代码。&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>为什么说 Roam 远不只是一个笔记应用 | Roam Newsletter 漫游研究所周报 2021W10</title>
        <link>https://blog.jimmylv.info/2021-03-09-roam-newsletter-RoamCN2021W10/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2021-03-09-roam-newsletter-RoamCN2021W10/</guid>
        <pubDate>Tue, 09 Mar 2021 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;&lt;a href=&quot;https://twitter.com/i/status/1366580913170046980&quot;&gt;Tweet&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/Jimmy_JingLv&quot;&gt;@Jimmy_JingLv&lt;/a&gt; on [[March 2nd, 2021]]:&lt;/p&gt;

&lt;p&gt;📮 Roam Newsletter 漫游研究所周报 #2021W10&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;#RoamCN2021W10 #RoamCN #WeeklyNewsletter&lt;/li&gt;
  &lt;li&gt;#roamcult #LearnInPublic #LearnWithJimmy #Zettelkasten -&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/cn_roam&quot;&gt;@cn_roam&lt;/a&gt; &lt;a href=&quot;https://twitter.com/RoamResearch&quot;&gt;@RoamResearch&lt;/a&gt; &lt;a href=&quot;http://roamcult.vip&quot;&gt;roam-cn/roamcult.vip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-增强版-pdf-扩展作者分享了他的学术阅读工作流&quot;&gt;#[[Roam 插件]] 增强版 PDF 扩展，作者分享了他的学术阅读工作流&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/cococ_rr/status/1366654227506991105?s=20&quot;&gt;https://twitter.com/cococ_rr/status/1366654227506991105?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-学术论文阅读的五个步骤文献管理论文阅读与瞬时笔记写作永久笔记写作永久笔记管理笔记回顾&quot;&gt;#[[Roam 用例]] 学术论文阅读的五个步骤：文献管理、论文阅读与瞬时笔记写作、永久笔记写作、永久笔记管理、笔记回顾&lt;/h3&gt;

&lt;p&gt;“双向链接的自动呈现大大简化了我的工作流，也加强了我构建网状知识库的意识。 ”&lt;/p&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1366674785636208644&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1366674785636208644&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-特性-右上角添加了可调整内容区域大小的按钮&quot;&gt;#[[Roam 特性]] 右上角添加了可调整内容区域大小的按钮&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1368969582917132289?s=20&quot;&gt;https://twitter.com/roamhacker/status/1368969582917132289?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-生态-airtable-标语我们需要更多的软件开发者而不仅仅是用户&quot;&gt;#[[Roam 生态]] @Airtable 标语：我们需要更多的软件开发者，而不仅仅是用户&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/airtable/status/1305491922258071554?s=20&quot;&gt;https://twitter.com/airtable/status/1305491922258071554?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术-roam-research-面试题之一就是打造一个小型-excel&quot;&gt;#[[Roam 技术]] Roam Research 面试题之一就是打造一个小型 Excel&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1332814451368624129?s=20&quot;&gt;https://twitter.com/Conaw/status/1332814451368624129?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-readwise--roam-集成的演示视频&quot;&gt;#[[Roam 周边]] Readwise + Roam 集成的演示视频&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RoamResearch/status/1367976244403261444?s=20&quot;&gt;https://twitter.com/RoamResearch/status/1367976244403261444?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-特性-roam-research-删除页面时提示当前页面的引用数量&quot;&gt;#[[Roam 特性]] Roam Research 删除页面时，提示当前页面的引用数量&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1368171019861647360?s=20&quot;&gt;https://twitter.com/roamhacker/status/1368171019861647360?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术craftdocsapp-写作软件的实现非常优秀基于-macos-catalyst-跨平台原生应用&quot;&gt;#[[Roam 技术]]&lt;a href=&quot;https://twitter.com/craftdocsapp&quot;&gt;@craftdocsapp&lt;/a&gt; 写作软件的实现非常优秀，基于 macOS Catalyst 跨平台原生应用&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/andy_matuschak/status/1324769586697269249?s=20&quot;&gt;https://twitter.com/andy_matuschak/status/1324769586697269249?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-跨-block-思维导图的概念实现配合-stick-blocks-map-插件使用很有-ginkgo-那个感觉&quot;&gt;#[[Roam 插件]] 跨 Block 思维导图的概念实现，配合 Stick Blocks Map 插件使用很有 Ginkgo 那个感觉&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;https://www.craft.do/s/wzKthqKQEz5NoM/b/451806EB-72C0-40E5-AE80-6D2AD32222E5/Block_Map&quot;&gt;https://www.craft.do/s/wzKthqKQEz5NoM/b/451806EB-72C0-40E5-AE80-6D2AD32222E5/Block_Map&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1367367351369400320?s=20&quot;&gt;https://twitter.com/roamhacker/status/1367367351369400320?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-直接从大纲式纯文本生成-graph-图例&quot;&gt;#[[Roam 周边]] 直接从大纲式纯文本生成 Graph 图例&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/SteveYang331/status/1367432144654495751?s=20&quot;&gt;https://twitter.com/SteveYang331/status/1367432144654495751?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-知识管理-魔幻新词语&quot;&gt;#[[Roam 洞见]] #知识管理 魔幻新词语&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1367394277530230791?s=20&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1367394277530230791?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-可直接与-roam-research-交互的播客笔记软件&quot;&gt;#[[Roam 周边]] 可直接与 Roam Research 交互的播客笔记软件&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/jgoodhcg/status/1364225811709120512?s=20&quot;&gt;https://twitter.com/jgoodhcg/status/1364225811709120512?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-书籍-使用-roam-research-进行专业的项目管理&quot;&gt;#[[Roam 书籍]] 使用 Roam Research 进行专业的项目管理&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Roamfu/status/1358766013215502340?s=20&quot;&gt;https://twitter.com/Roamfu/status/1358766013215502340?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-特性-roam-research-新增命令面板功能可直接通过-cmdp-快速执行命令&quot;&gt;#[[Roam 特性]] Roam Research 新增命令面板功能，可直接通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Cmd+P&lt;/code&gt; 快速执行命令&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1367354454316621824?s=20&quot;&gt;https://twitter.com/roamhacker/status/1367354454316621824?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件roamjscom-新扩展timeline-模式-roamjstimeline-可用来可视化特殊标签的事件时间线比如-deadline&quot;&gt;#[[Roam 插件]]&lt;a href=&quot;http://roamjs.com&quot;&gt;roamjs.com&lt;/a&gt; 新扩展：Timeline 模式 [[roam/js/timeline]] 可用来可视化特殊标签的事件时间线，比如 #Deadline&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/dvargas92495/status/1367249990171656192?s=20&quot;&gt;https://twitter.com/dvargas92495/status/1367249990171656192?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-课程-学术笔记课程正式开课&quot;&gt;#[[Roam 课程]] 学术笔记课程正式开课&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/LaptopLifeLisa/status/1367113625022967809?s=20&quot;&gt;https://twitter.com/LaptopLifeLisa/status/1367113625022967809?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-特性-roam-research-官方内置的自动备份功能再也不用担心数据丢失啦&quot;&gt;#[[Roam 特性]] Roam Research 官方内置的自动备份功能，再也不用担心数据丢失啦&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Raz0r/status/1367308205701926913?s=20&quot;&gt;https://twitter.com/Raz0r/status/1367308205701926913?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-生态-flomo-plus-支持多种国内常用软件的笔记或高亮内容&quot;&gt;#[[Roam 生态]] Flomo Plus 支持多种国内常用软件的笔记或高亮内容&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/plidezus/status/1367297192763879425?s=20&quot;&gt;https://twitter.com/plidezus/status/1367297192763879425?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-使用-roam-research-网格-css-制作漫画&quot;&gt;#[[Roam 用例]] 使用 Roam Research 网格 CSS 制作漫画&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/z9sx7wox/status/1366825424932790272?s=20&quot;&gt;https://twitter.com/z9sx7wox/status/1366825424932790272?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-记忆-vs-理解&quot;&gt;#[[Roam 洞见]] 记忆 vs 理解&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/visualizevalue/status/1366812844050759684?s=20&quot;&gt;https://twitter.com/visualizevalue/status/1366812844050759684?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术-译深度解析-roam-数据结构--为什么-roam-远不只是一个笔记应用&quot;&gt;#[[Roam 技术]] 【译】深度解析 Roam 数据结构 —— 为什么 Roam 远不只是一个笔记应用&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1369206733122367489?s=20&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1369206733122367489?s=20&lt;/a&gt;&lt;/blockquote&gt;
</description>
      </item>
    
      <item>
        <title>【译】深度解析 Roam 数据结构 —— 为什么 Roam 远不只是一个笔记应用</title>
        <link>https://blog.jimmylv.info/2021-03-08-Roam-Data-Structure-Query-zh-translation/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2021-03-08-Roam-Data-Structure-Query-zh-translation/</guid>
        <pubDate>Mon, 08 Mar 2021 00:00:00 +0000</pubDate>
        <description>&lt;blockquote&gt;
  &lt;p&gt;随着 &lt;a href=&quot;https://roamresearch.com/&quot;&gt;Roam Research&lt;/a&gt; 的大热，双向链接和基于 Block 的笔记软件层出不穷，而他们（&lt;a href=&quot;https://hulunote.com/&quot;&gt;葫芦笔记&lt;/a&gt;、&lt;a href=&quot;https://logseq.com/&quot;&gt;logseq&lt;/a&gt;、&lt;a href=&quot;https://github.com/athensresearch/athens&quot;&gt;Athens&lt;/a&gt;）无一例外都采用了 Clojure 技术栈的 &lt;a href=&quot;https://docs.datomic.com/on-prem/query/query.html&quot;&gt;Datomic&lt;/a&gt;/&lt;a href=&quot;https://github.com/tonsky/datascript&quot;&gt;datascript&lt;/a&gt; &lt;a href=&quot;https://zh.wikipedia.org/wiki/Datalog&quot;&gt;Datalog&lt;/a&gt; 数据库，这不免让我感到好奇想要深入探索一番。本文就将硬核解析 Roam 背后原理，发掘 Roam 基于 Block 的深层技术优势，帮助你迎接 Roam API 时代的到来！&lt;/p&gt;

  &lt;p&gt;原文地址：&lt;a href=&quot;https://www.zsolt.blog/2021/01/Roam-Data-Structure-Query.html&quot;&gt;Deep Dive Into Roam’s Data Structure - Why Roam is Much More Than a Note Taking App&lt;/a&gt; —— Zsolt Viczián&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;你想不想知道以下问题的答案？&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;你的 Graph 笔记库中最长的段落是那一段？&lt;/li&gt;
  &lt;li&gt;上周你编辑或者创建了哪些页面？&lt;/li&gt;
  &lt;li&gt;你的笔记库中总共有多少段文字？&lt;/li&gt;
  &lt;li&gt;在某个给定的命名空间下你总共有哪些页面？（例如：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;meetings/&lt;/code&gt;）&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;（译注：问题 1 可通过 &lt;a href=&quot;https://chrome.google.com/webstore/category/extensions?hl=en&quot;&gt;Roam Portal Chrome 插件&lt;/a&gt; 查看，问题 2 可查看 &lt;a href=&quot;https://roam42.com&quot;&gt;#Roam42&lt;/a&gt; DB Stats，但本文将帮助你深入理解插件背后的原理。）&lt;/p&gt;

&lt;p&gt;Roam Research 是一个全功能型数据库，相信你已经用上了 ` {&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;{query:}&lt;/code&gt;} ` 的查询方法，但其实远不止如此，你还可以问它更多的问题。这篇文章会让你对 Roam 的底层数据结构基础有一个很好的理解。&lt;/p&gt;

&lt;p&gt;上周我一直在深入研究 Roam 的数据结构，玩得非常开心，也学到了很多。这篇总结写给我自己，也分享给你，我尝试通过写作来加深我对 Roam 的理解程度。如果你发现这太过于技术向了，很抱歉，我会尽力用一种容易理解的方式来传达信息，从最基本的概念慢慢过渡到更为复杂的概念。&lt;/p&gt;

&lt;p&gt;在我的探索过程中，我还构建了一组用于查询的 SmartBlocks，和相应的几个查询示例，你可以在&lt;a href=&quot;https://www.zsolt.blog/2021/01/Roam-Data-Structure-Query.html#querySB&quot;&gt;这里&lt;/a&gt;找到它。虽然你不一定想要了解具体细节，但也会发现这些例子非常有趣。&lt;/p&gt;

&lt;p&gt;随着我的深入，我对 Roam Research 的赞叹就更进一步，我也愈发相信 Roam 一定能够占领市场。在不久的将来，Roam 将以全文的形式保存你我所读到的一切：笔记、书籍和文章摘要等等，都将能够方便地追溯其原始出处，只需在一个系统中点击即可访问。“Roam” 未来可期！&lt;/p&gt;

&lt;p&gt;我的文章也参考了很多极具价值的文章和参考资料。我特别想分享以下的几篇文章，如果你读了我的概述发现还想了解更多，那我强烈建议你继续探索：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.learndatalogtoday.org/&quot;&gt;Learn Datalog Today!&lt;/a&gt; by Jonas Enlund&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.putyourleftfoot.in/introduction-to-the-roam-alpha-api&quot;&gt;Introduction to the Roam Alpha API - Put Your Left Foot&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://davidbieber.com/snippets/2020-12-22-datalog-queries-for-roam-research/&quot;&gt;Datalog Queries for Roam Research&lt;/a&gt; by David Bieber&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.datomic.com/on-prem/query.html&quot;&gt;Datomic Queries and Rules - Datomic&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.infoq.com/articles/Datomic-Information-Model/&quot;&gt;The Datomic Information Model (infoq.com)&lt;/a&gt; by Rich Hickey, the author of Clojure and designer of Datomic&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://roam42.glitch.me/common/commonDatalog.js&quot;&gt;Roam42 Source Code&lt;/a&gt;, by &lt;a href=&quot;https://twitter.com/roamhacker&quot;&gt;@RoamHacker&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://clojuredocs.org/clojure.core&quot;&gt;clojure.core namespace - ClojureDoc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://clojuredocs.org/clojure.string&quot;&gt;clojure.string namespace - ClojureDocs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;而这篇文章，将会提到以上文章都没有涵盖的两个点：&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;对 Roam Research 数据结构的详细讨论，包括非常基础和复杂的介绍&lt;/li&gt;
  &lt;li&gt;一套基于 #42SmartBlocks 可以在 Roam 中执行高阶查询。如果你对基础部分不感兴趣，想要直接看 SmartBlock 部分的话，&lt;a href=&quot;https://www.zsolt.blog/2021/01/Roam-Data-Structure-Query.html#querySB&quot;&gt;点击跳转&lt;/a&gt;。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;让我们开始吧！期望你像我一样享受这次旅程！&lt;/p&gt;

&lt;h2 id=&quot;基本概念&quot;&gt;基本概念&lt;/h2&gt;

&lt;p&gt;Roam 基于 Datomic 数据库构建。简而言之，一个 Datom 是一个独立的 fact，它是一个带值的属性，包括四个元素：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Entity ID 实体 ID&lt;/li&gt;
  &lt;li&gt;Attribute 属性&lt;/li&gt;
  &lt;li&gt;Value 值&lt;/li&gt;
  &lt;li&gt;Transaction ID 交易 ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;你可以把 Roam 想象成一组扁平化的 Datoms 集合，看起来就像这样：&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;&amp;lt;e-id&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;&amp;lt;attribute&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;			        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;&amp;lt;tx-id&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/children&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 			            &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870917&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/children&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 			            &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870939&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	    &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;01-19-2021&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	        &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870916&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:node/title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;January 19th, 2021&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870916&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/order&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 			            &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870917&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/page&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 			            &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870918&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/parents&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 			            &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870918&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/refs&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;6&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 			            &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870920&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;check Projects&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;    	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870919&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	    &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;r61dfi2ZH&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; 	    	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870917&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;共享相同事务 id 的 Datoms 就是在同一个事务中添加的。其中，这种基于事务的方法使 Roam 能够将内容同步到不同的设备，并管理非常复杂的撤销操作。&lt;/p&gt;

&lt;p&gt;具有相同 &lt;strong&gt;entity-id&lt;/strong&gt; 的 Datoms 就是同一个 Block 的 facts。&lt;/p&gt;

&lt;p&gt;如果你想基于块引用来查询一个 Block 的 &lt;strong&gt;entity-id&lt;/strong&gt;，你就可以写:&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?e-id&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?e-id&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;r61dfi2ZH&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;从上面的数据可以看出，这个查询将返回值 5。&lt;/p&gt;

&lt;h3 id=&quot;attributes-属性&quot;&gt;Attributes 属性&lt;/h3&gt;

&lt;p&gt;Roam 使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/&lt;/code&gt; 属性来存储关于&lt;strong&gt;段落（paragraphs）&lt;/strong&gt;和&lt;strong&gt;页面（pages）&lt;/strong&gt;的 facts。&lt;strong&gt;页面&lt;/strong&gt;和&lt;strong&gt;段落&lt;/strong&gt;之间有一些细微的差别，我在一分钟内就会解释。但是，你必须理解的基本概念是，&lt;strong&gt;页面&lt;/strong&gt;只是一种特殊类型的&lt;strong&gt;块（block）&lt;/strong&gt;。大多数情况下，Roam 将&lt;strong&gt;页面（page）&lt;/strong&gt;和&lt;strong&gt;段落（paragraph）&lt;/strong&gt;一视同仁。两者都是 &lt;strong&gt;Blocks&lt;/strong&gt;。&lt;/p&gt;

&lt;h4 id=&quot;区块-block-的两个-id&quot;&gt;区块 Block 的两个 ID&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Hidden ID 隐藏 ID：&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这个 &lt;strong&gt;entity-id&lt;/strong&gt; 才是真正的 block-id，即使它在 Roam 用户界面是看不到的。这是用于将数据库中的信息绑定在一起的 ID。Entity ID 标识了有关 Block 的 facts，描述了父子层级关系和对 Block 的引用。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Public ID 公共 ID：&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;公共 ID 是&lt;strong&gt;段落（paragraph）&lt;/strong&gt;的块引用，例如 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;GGv3cyL6Y&lt;/code&gt;，或者是&lt;strong&gt;页面（pages）&lt;/strong&gt; 的 Page Title（页面标题）。请注意，页面（pages）还有一个 UID，长度也为九个字符串 —— 非常类似于块引用。例如，你可以使用它们来构造指向 Graph 中特定页面的 URLs。&lt;/p&gt;

&lt;p&gt;（译者注：比如现在这篇文章在 Roam Research URL 中的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;/page/mdz6JIWDD&lt;/code&gt; &lt;a href=&quot;https://roamresearch.com/#/app/Note-Tasking/page/mdz6JIWDD&quot;&gt;https://roamresearch.com/#/app/Note-Tasking/page/mdz6JIWDD&lt;/a&gt;）&lt;/p&gt;

&lt;h4 id=&quot;所有区块的公共属性&quot;&gt;所有区块的公共属性&lt;/h4&gt;

&lt;p&gt;每个块都有以下属性：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/uid&lt;/code&gt; 公共 ID，即 9 个字符长的块引用&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:create/email&lt;/code&gt; 创建块的作者 Email 地址&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:create/time&lt;/code&gt; 以毫秒为单位的时间，纪元计时(1970 年 1 月 1 日 UTC/GMT 午夜)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:edit/email&lt;/code&gt; 编辑该块的作者 Email 地址&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:edit/time&lt;/code&gt; 最新一次块的编辑时间&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;		&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;p6qzzKa-u&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;     &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870940&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:create/email&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;foo@gmail.com&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870940&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:create/time&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1611058803997&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;   &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870940&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:edit/email&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;		&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;foo@gmail.com&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870940&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:edit/time&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;		&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1611058996600&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;   &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870949&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;森林中的树木trees-in-the-forest&quot;&gt;森林中的树木（Trees in the forest）&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;Roam 数据库就像一片森林&lt;/strong&gt;。每一页都是一棵树。树的根是&lt;strong&gt;页面（page）&lt;/strong&gt;，树的枝干是更高层次的&lt;strong&gt;段落（paragraphs）&lt;/strong&gt;；树的&lt;strong&gt;叶子（block）&lt;/strong&gt;就是嵌套在&lt;strong&gt;页面（page）&lt;/strong&gt;最深层次的&lt;strong&gt;段落（paragraphs）&lt;/strong&gt;。&lt;/p&gt;

&lt;div class=&quot;language-shell highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Page
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Branch
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Branch
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Leaf
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Leaf
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Leaf
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Branch
    &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Branch
      &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Leaf
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Branch
  &lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; Leaf
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;对于每个&lt;strong&gt;段落（paragraph）&lt;/strong&gt;，Roam 总是创建两个指针。 子级 Block 使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/parents&lt;/code&gt; 引用其父级的 &lt;strong&gt;entity-id&lt;/strong&gt;，父级则使用: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/children&lt;/code&gt; 引用其子级的 &lt;strong&gt;entity-id&lt;/strong&gt;。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/children&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870917&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/parents&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;	&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;536870918&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;父级会在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/children&lt;/code&gt; 属性中保留其子级的列表。这个列表&lt;strong&gt;&lt;em&gt;只会&lt;/em&gt;&lt;/strong&gt;包含其直系后代的 &lt;strong&gt;entity-id&lt;/strong&gt;，而不包括隔代的孙辈。一个 Page 只会将 Page 顶层的段落（paragraphs）作为子段落列出来，而不会列出嵌套的段落（paragraphs）。类似地，段落将只列出嵌套在它下面的块（block），而不是嵌套在嵌套块下面的块。嵌套中最低层级的 Block 块（叶子）则没有 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/children&lt;/code&gt; 属性。&lt;/p&gt;

&lt;p&gt;子级同样会在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/parents&lt;/code&gt; 属性中保留其父级的列表。与 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/children&lt;/code&gt; 相反的是，父级列表包括&lt;strong&gt;&lt;em&gt;所有&lt;/em&gt;&lt;/strong&gt;祖先的 &lt;strong&gt;entity-id&lt;/strong&gt;，即祖父母、曾祖父母等。嵌套的&lt;strong&gt;段落（paragraphs）&lt;/strong&gt;将包含对父&lt;strong&gt;段落（paragraphs）&lt;/strong&gt;和&lt;strong&gt;页面（page）&lt;/strong&gt;的引用。&lt;strong&gt;页面&lt;/strong&gt;的顶层&lt;strong&gt;段落（paragraphs）&lt;/strong&gt;在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/parents&lt;/code&gt; 属性中具有&lt;strong&gt;页面（page）&lt;/strong&gt;的 &lt;strong&gt;entity-id&lt;/strong&gt;，而嵌套在另一段落下的&lt;strong&gt;段落（paragraphs）&lt;/strong&gt;将具有更高层级段落的 &lt;strong&gt;entity-id&lt;/strong&gt; 和当前&lt;strong&gt;页面（page）&lt;/strong&gt;的 &lt;strong&gt;entity-id&lt;/strong&gt;。&lt;/p&gt;

&lt;h4 id=&quot;页面-page-独有属性&quot;&gt;页面 Page 独有属性&lt;/h4&gt;

&lt;p&gt;所有的页面都有标题属性，而没有任何段落会有标题。&lt;/p&gt;

&lt;p&gt;如果要查找数据库中的所有页面，则需要查询 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:node/title&lt;/code&gt;，因为此属性只包含页面的值。通过执行以下查询，你将得到一个包含两列的表格：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?p&lt;/code&gt; 参数下每个页面的 &lt;strong&gt;entity-id&lt;/strong&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?title&lt;/code&gt; 参数下每个页面的标题。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:node/title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;如果你还希望查到每个页面的九个字符的 UID，例如，要构造指向该页面的链接，则需要通过 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/uid&lt;/code&gt; 属性来查找 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?p&lt;/code&gt; &lt;strong&gt;entity-id&lt;/strong&gt;。下面是 query 查询语句的样子。注意 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?p&lt;/code&gt; 是如何出现在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;where&lt;/code&gt; 子句的两种模式中的。这告诉查询引擎查找同一实体的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;title&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;uid&lt;/code&gt;。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:node/title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;段落-paragraph-的独有属性&quot;&gt;段落 Paragraph 的独有属性&lt;/h4&gt;

&lt;p&gt;每个段落都有以下属性：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/page&lt;/code&gt; 页面上的每个段落，不管它们的嵌套级别如何，都会引用他们的页面&lt;strong&gt;entity-id&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/order&lt;/code&gt; 这是页面中块的顺序，或者是段落下嵌套的级别。你需要对这个值进行排序，以便按照适当的顺序检索出现在文档中的段落&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/string&lt;/code&gt; 块的内容&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/parents&lt;/code&gt; 段落的祖先们。对于顶层段落，它就是当前的页面。对于嵌套的段落，该属性会列出通向（包括）页面的所有祖先。&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;其他可选属性&quot;&gt;其他&lt;strong&gt;可选属性&lt;/strong&gt;&lt;/h4&gt;

&lt;p&gt;Roam 只会在你改变特定块的默认值时才会设置这些属性（只存在于数据库中的段落），例如，你将块的文本对齐方式从左对齐改为居中。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:children/view-type&lt;/code&gt; 指定如何显示块的子元素。可识别的值是“列表”模式、“文档”模式、“编号”模式&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/heading&lt;/code&gt; 你可以将块的标题级别设置为 H1、 H2 或 H3。允许的值是 1,2,3&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/props&lt;/code&gt; 这是 Roam 存储图像或 iframe 的大小、slider（滑块）的位置、 Pomodoro 番茄计时器设置等信息的地方&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/text-align&lt;/code&gt; 段落对齐的方式。值为“左”、“中间”、“右”、“对齐”&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;roam-数据结构&quot;&gt;Roam 数据结构&lt;/h4&gt;

&lt;p&gt;如果你想知道如何查找数据库中存在哪些属性，我有一个好消息！使用一个简单的查询，你就可以列出数据库中的所有属性：&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?Namespace&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?Attribute&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?Attribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;namespace&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?Attribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?Namespace&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;以下就是所有属性的列表。说实话，上面的查询不会对值进行排序，也不会创建最后一列。我在可下载的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;roam.json&lt;/code&gt; 文件中包含了稍微高级一点的查询版本，它将可用于排序。我在 &lt;a href=&quot;http://clojure.core/&quot;&gt;clojure.core&lt;/a&gt; 文档中找到了&lt;a href=&quot;https://clojuredocs.org/clojure.core/namespace&quot;&gt;namespace&lt;/a&gt; 函数。&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Namespace&lt;/th&gt;
      &lt;th&gt;Attribute&lt;/th&gt;
      &lt;th&gt;:Namespace/Attribute&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;attrs&lt;/td&gt;
      &lt;td&gt;lookup&lt;/td&gt;
      &lt;td&gt;:attrs/lookup&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;children&lt;/td&gt;
      &lt;td&gt;:block/children&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;heading&lt;/td&gt;
      &lt;td&gt;:block/heading&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;open&lt;/td&gt;
      &lt;td&gt;:block/open&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;order&lt;/td&gt;
      &lt;td&gt;:block/order&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;page&lt;/td&gt;
      &lt;td&gt;:block/page&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;parents&lt;/td&gt;
      &lt;td&gt;:block/parents&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;props&lt;/td&gt;
      &lt;td&gt;:block/props&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;refs&lt;/td&gt;
      &lt;td&gt;:block/refs&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;string&lt;/td&gt;
      &lt;td&gt;:block/string&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;text-align&lt;/td&gt;
      &lt;td&gt;:block/text-align&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;block&lt;/td&gt;
      &lt;td&gt;uid&lt;/td&gt;
      &lt;td&gt;:block/uid&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;children&lt;/td&gt;
      &lt;td&gt;view-type&lt;/td&gt;
      &lt;td&gt;:children/view-type&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;create&lt;/td&gt;
      &lt;td&gt;email&lt;/td&gt;
      &lt;td&gt;:create/email&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;create&lt;/td&gt;
      &lt;td&gt;time&lt;/td&gt;
      &lt;td&gt;:create/time&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;edit&lt;/td&gt;
      &lt;td&gt;email&lt;/td&gt;
      &lt;td&gt;:edit/email&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;edit&lt;/td&gt;
      &lt;td&gt;seen-by&lt;/td&gt;
      &lt;td&gt;:edit/seen-by&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;edit&lt;/td&gt;
      &lt;td&gt;time&lt;/td&gt;
      &lt;td&gt;:edit/time&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;entity&lt;/td&gt;
      &lt;td&gt;attrs&lt;/td&gt;
      &lt;td&gt;:entity/attrs&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;log&lt;/td&gt;
      &lt;td&gt;id&lt;/td&gt;
      &lt;td&gt;:log/id&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;node&lt;/td&gt;
      &lt;td&gt;title&lt;/td&gt;
      &lt;td&gt;:node/title&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;page&lt;/td&gt;
      &lt;td&gt;sidebar&lt;/td&gt;
      &lt;td&gt;:page/sidebar&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;user&lt;/td&gt;
      &lt;td&gt;color&lt;/td&gt;
      &lt;td&gt;:user/color&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;user&lt;/td&gt;
      &lt;td&gt;display-name&lt;/td&gt;
      &lt;td&gt;:user/display-name&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;user&lt;/td&gt;
      &lt;td&gt;email&lt;/td&gt;
      &lt;td&gt;:user/email&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;user&lt;/td&gt;
      &lt;td&gt;photo-url&lt;/td&gt;
      &lt;td&gt;:user/photo-url&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;user&lt;/td&gt;
      &lt;td&gt;settings&lt;/td&gt;
      &lt;td&gt;:user/settings&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;user&lt;/td&gt;
      &lt;td&gt;uid&lt;/td&gt;
      &lt;td&gt;:user/uid&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;vc&lt;/td&gt;
      &lt;td&gt;blocks&lt;/td&gt;
      &lt;td&gt;:vc/blocks&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;version&lt;/td&gt;
      &lt;td&gt;id&lt;/td&gt;
      &lt;td&gt;:version/id&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;version&lt;/td&gt;
      &lt;td&gt;nonce&lt;/td&gt;
      &lt;td&gt;:version/nonce&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;version&lt;/td&gt;
      &lt;td&gt;upgraded-nonce&lt;/td&gt;
      &lt;td&gt;:version/upgraded-nonce&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;window&lt;/td&gt;
      &lt;td&gt;filters&lt;/td&gt;
      &lt;td&gt;:window/filters&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;window&lt;/td&gt;
      &lt;td&gt;id&lt;/td&gt;
      &lt;td&gt;:window/id&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;queries-查询&quot;&gt;Queries 查询&lt;/h2&gt;

&lt;p&gt;如果你对如何编写 Roam 查询语句感兴趣，那么你应该仔细阅读 &lt;a href=&quot;http://www.learndatalogtoday.org/&quot;&gt;Learn Datalog Today&lt;/a&gt; 的九个章节。它的内容非常有趣，且包含对应的练习。&lt;/p&gt;

&lt;p&gt;接下来，我将几乎逐字逐句地引用教程中的几段话，当然会改变例子以适用于 Roam。其余的内容，请访问上面的教程。&lt;/p&gt;

&lt;p&gt;我还推荐以下 Stuart Halloway 的 YouTube 视频，它在 11 分钟内总结了 Datomic Datalog 查询语言的关键特性。&lt;/p&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/bAilFQdaiHk&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h3 id=&quot;核心概念&quot;&gt;核心概念&lt;/h3&gt;

&lt;p&gt;查询是一个以 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:find&lt;/code&gt; 关键字开头的矢量，后面跟着一个或多个模式变量(以 ? 符号开头，e.g. &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?title&lt;/code&gt;)。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;find&lt;/code&gt; 子句之后是 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:where&lt;/code&gt; 子句，它将查询限制在与给定的数据模式（data patterns）相匹配的 datoms 上。而使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;_&lt;/code&gt; 符号作为通配符，则表示你希望忽略的数据模式部分。&lt;/p&gt;

&lt;p&gt;例如，如果你想根据一个段落的块引用来查找文本，你需要这样写：&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;r61dfi2ZH&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;根据本文章开头表格里面的例子，这个查询将返回 “Check Projects”&lt;/p&gt;

&lt;p&gt;这里需要注意的是，模式变量&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?b&lt;/code&gt;在两个数据模式中都会使用。当一个模式变量在多个地方使用时，查询引擎要求它在每个地方都绑定为相同的值。因此，这个查询只会找到具有 uid &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;r61dfi2ZH&lt;/code&gt;的块的字符串。&lt;/p&gt;

&lt;p&gt;一个实体的 datoms 可能出现在不同命名空间的属性中。例如，如果我想找到包含&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;r61dfi2ZH&lt;/code&gt;段落的页面的标题，我会编写以下查询。请注意，我首先读取页面的 &lt;strong&gt;entity-id&lt;/strong&gt; 的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?block/page&lt;/code&gt; 属性，并将其存储在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?p&lt;/code&gt; 当中。 然后，我用它来定位页面的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?note/title&lt;/code&gt; 和 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?block/uid&lt;/code&gt;。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;r61dfi2ZH&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/page&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:node/title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;考虑到上面的例子，这将返回 &lt;strong&gt;“January 19th, 2021”&lt;/strong&gt; 和 &lt;strong&gt;“01-19-2021”&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:in&lt;/code&gt; 子句为查询提供了输入参数，这与编程语言中的函数或方法参数的作用非常相似。以下是上一个查询的样子，注意其中有一个用于 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_reference&lt;/code&gt; 的输入参数。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block_ref&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block_ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/page&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:node/title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?p&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;这个查询需要两个参数。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$&lt;/code&gt;就是当前数据库本身（隐含值，如果没有指定&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:in&lt;/code&gt;子句），&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_ref&lt;/code&gt;则可能是段落的块引用。&lt;/p&gt;

&lt;p&gt;你可以使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;window.roamAlphaAPI.q(query,block_ref);&lt;/code&gt; 执行上述操作。如果没有为 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;$&lt;/code&gt; 提供值，则查询引擎将隐式假定的是默认数据库。因为你将只查询你自己的 Roam 数据库，所以没有必要声明数据库。&lt;strong&gt;也许一旦 Roam 提供了跨数据库的链接，这将会变得非常有趣！&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;现在我将跳过本教程，以涵盖在 Roam 中稍有不同的几个主题。如果你对你错过了什么感兴趣，请阅读我&lt;a href=&quot;http://www.learndatalogtoday.org/chapter/3&quot;&gt;跳过&lt;/a&gt;的详细教程。有一个关于元组、集合和关系（Tuples, Collections, and Relations）非常有用的讨论，它们提供了执行逻辑 OR 和 AND 操作的方法。&lt;/p&gt;

&lt;h3 id=&quot;predicates-断言&quot;&gt;Predicates 断言&lt;/h3&gt;

&lt;p&gt;断言子句可以过滤结果集，只包括断言返回 true 的结果。在 Datalog 中，你可以使用任何 Clojure 函数或 Java 方法作为谓词函数。根据我的经验，在 Roam JavaScript 的实现中，Java 函数是不可用的，只有少数 Clojure 函数可以使用。&lt;/p&gt;

&lt;p&gt;除了&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clojure.core&lt;/code&gt;命名空间之外，Clojure 函数必须是完全命名空间限定的。遗憾的是，在核心命名空间之外，我只找到了几个在 Roam 中能用的函数。这些函数包括&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clojure.string/includes?&lt;/code&gt;、&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clojure.string/starts-with?&lt;/code&gt;和&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;clojure.string/ends-with?&lt;/code&gt;。另外一些来自核心命名空间的有用函数包括，返回属性命名空间的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;namespace&lt;/code&gt; 和返回字符串长度的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;count&lt;/code&gt;。一些无处不在的断言，也可以在没有命名空间限定的情况下使用，比如&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;&amp;lt;, &amp;gt;, &amp;lt;=, &amp;gt;=, =, not=, !=&lt;/code&gt;等等。&lt;/p&gt;

&lt;p&gt;这里有两个使用断言的例子。第一个函数指的是根据 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;block_reference&lt;/code&gt; 计算段落中的字符数。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?size&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block_ref&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block_ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?size&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;第二个列出了在给定日期之后修改的所有 Blocks。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block_ref&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?start_of_day&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:edit/time&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?time&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?start_of_day&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block_ref&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?b&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;transformation-转换函数&quot;&gt;Transformation 转换函数&lt;/h3&gt;

&lt;p&gt;遗憾的是，我无法让转换功能在 JavaScript 中工作。只有当您在桌面上安装了 Datalog 数据库，并加载 Roam.EDN 进行进一步的操作时，这些功能才有可能工作。&lt;/p&gt;

&lt;p&gt;唯一可用的变通方法是在查询后对结果进行后处理。下面的例子将过滤页面标题，以大小写不敏感的方式查找文本片段 (“temp”)，然后按字母顺序对结果进行排序。此查询将返回包括 “Template”、”template”、”Temporary”、”attempt “等词的页面。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?page&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:node/title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        	     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?page&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;let&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;results&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;window.roamAlphaAPI.q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;query&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                     &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;.filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;item,index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;.toLowerCase&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;.indexOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;ss&quot;&gt;&apos;temp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&apos;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                     &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;.sorta,b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;.localeCompare&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;aggregates-聚合&quot;&gt;Aggregates 聚合&lt;/h3&gt;

&lt;p&gt;Aggregates，则可以像预期的那样工作。有许多可用的 Aggregates，包括&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sum、max、min、avg、count&lt;/code&gt;。你可以在&lt;a href=&quot;https://souffle-lang.github.io/aggregates&quot;&gt;这里&lt;/a&gt;阅读更多关于 Aggregates 的信息。&lt;/p&gt;

&lt;p&gt;例如，如果你不知道某个属性的用途，或者不知道允许使用哪些值，只需查询数据库就可以找到现有的值。下一个例子列出了&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:children/view-type&lt;/code&gt;的值。需要注意的是，如果你只在 Graph 中使用 bullet 列表模式，查询将只返回一个值：”bullet”。我使用了独特的 Aggregates 函数，如果没有这个函数，我将得到一个可能有数千个值的列表，每个指定了视图类型的块都有一行。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;distinct&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:children/view-type&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?type&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;rules-规则&quot;&gt;Rules 规则&lt;/h3&gt;

&lt;p&gt;你可以将查询的可重用部分抽象为规则，给它们起有意义的名称，然后忘记其实现细节，就像你可以使用自己喜欢的编程语言编写函数一样。&lt;/p&gt;

&lt;p&gt;Roam 中一个典型的规则例子是祖先规则。这些规则利用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/children&lt;/code&gt;来遍历嵌套块的树。一个简单的祖先规则是这样的。这条规则基于 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?parent&lt;/code&gt; &lt;strong&gt;entity-id&lt;/strong&gt; 来寻找 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?child&lt;/code&gt;。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[[(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?child&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?parent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?parent&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/children&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?child&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;第一个矢量称为规则的 head，其中第一个符号就是规则的名称。规则的其余部分称为 body。&lt;/p&gt;

&lt;p&gt;你可以用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(...)&lt;/code&gt;或&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[...]&lt;/code&gt;将其括起来，但常规的做法是用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(...)&lt;/code&gt;来帮助你的眼睛区分 head 和 body 的规则，也可以区分规则调用（rule invocations）和正常的数据模式（data patterns），我们将在下面看到示例。&lt;/p&gt;

&lt;p&gt;你可以将规则看作一种函数，但请记住，这是逻辑编程，因此我们可以使用相同的规则，根据子 &lt;strong&gt;entity-id&lt;/strong&gt; 找到父实体，根据父 &lt;strong&gt;entity-id&lt;/strong&gt; 找到子实体。&lt;/p&gt;

&lt;p&gt;换句话说，你可以在 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(ancestor ?child ?parent)&lt;/code&gt; 中使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?parent&lt;/code&gt;和&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?child&lt;/code&gt;作为输入和输出。如果你既不提供值，你将得到数据库中所有可能的组合。如果你为其中一个或两个都提供值，它将如你所期望的那样限制查询返回的结果。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?parent&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?parent&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/children&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;现在就变成了：&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?parent&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?parent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?c&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/string&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:in&lt;/code&gt;子句中的&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;%&lt;/code&gt;符号代表规则。&lt;/p&gt;

&lt;p&gt;乍一看，这似乎并不是一个巨大的成就。但是，规则是可以嵌套的。通过扩展上面的规则，你可以使它不仅返回子树，而且返回&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?parent&lt;/code&gt;下的整个子树。规则可以包含其他规则，也可以自己递归调用。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[[(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?child&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?parent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?parent&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/children&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?child&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?child&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?grand_parent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?parent&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/children&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?child&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?parent&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?grand_parent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;例如，我们现在可以使用这条规则来计算一个给定块的所有子孙数量。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;n&quot;&gt;window.roamAlphaAPI.q&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
     &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:in&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?ancestor_uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?ancestor_uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    	      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?ancestor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hAfIHN6Gi&quot;&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;,rule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;c1&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;当然，在这个例子中，我们最好使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:block/parent&lt;/code&gt;属性，这样可以使查询更加简单。&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;hAfIHN6Gi&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
         &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?ancestor&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
         &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?block&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/parents&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?ancestor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;pull-拉&quot;&gt;Pull 拉&lt;/h3&gt;

&lt;p&gt;这篇文章已经太长，而且技术性太强。出于这个原因，我完全省略了关于(pull ) requests 的讨论 —— 尽管在 roam.json 中的例子中，我将会提到一部分。&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(pull ?e [*])&lt;/code&gt;是一种强大的从数据库中获取数据的方法。如果你想了解更多，这里有两个值得阅读的参考文献。&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://docs.datomic.com/on-prem/pull.html&quot;&gt;Datomic Pull in the Datomic On-Prem Documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.putyourleftfoot.in/introduction-to-the-roam-alpha-api&quot;&gt;Introduction to the Roam Alpha API&lt;/a&gt; on Put Your Left Foot.&lt;/p&gt;

&lt;h2 id=&quot;roam-查询-smartblock&quot;&gt;Roam 查询 SmartBlock&lt;/h2&gt;

&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/wjIMRD-JKfU&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;我们可以在 SmartBlocks 内和浏览器中的开发者工具控制台中运行查询。然而，结果很难查看，因为它们是以嵌套的 JSONs 等晦涩的数据结构返回的。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2021 年 1 月 28 日更新：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;同时我了解到，你也可以在 Roam 中使用块中的 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:q&lt;/code&gt; 命令原生运行简单的查询。试试下面的命令：&lt;/p&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;no&quot;&gt;:q&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:node/title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;它不会像我的 SmartBlock 一样显示拉动或有页面链接，但仍然非常酷……&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2021 年 2 月 22 日进一步更新&lt;/strong&gt;：&lt;/p&gt;

&lt;p&gt;我使用 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:q&lt;/code&gt; 创建了一个长长的统计查询样本清单。你可以在&lt;a href=&quot;https://roamresearch.com/#/app/Zsolt-Blog/page/WUn5PuTDV&quot;&gt;这里&lt;/a&gt;找到它们。&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;我想让查询体验更加方便，并将其集成到 Roam 中。因此，我创建了一组 SmartBlocks，它们可以帮助将查询嵌入到你的 Roam 页面中，就像你在文档中包含的任何其他组件一样。&lt;/p&gt;

&lt;p&gt;这里是可以导入到 Roam Graph 中的 &lt;a href=&quot;https://zsviczian.github.io/DatomicQuery.zip&quot;&gt;DatomicQuery.JSON&lt;/a&gt; 文件链接。包括两个页面，SmartBlocks 和大量查询示例。继续阅读，可以了解如何使用它们。&lt;/p&gt;

&lt;p&gt;你可以选择简单查询和高级查询。简单查询不接受输入参数，也不能包含规则。当然，你可以直接在查询中包含输入参数，你可以在下面的例子中看到。而高级查询则可以给你更充分的灵活性。&lt;/p&gt;

&lt;h3 id=&quot;页面链接与日期链接&quot;&gt;页面链接与日期链接&lt;/h3&gt;

&lt;p&gt;我做的 SmartBlock 可以把 query 查询结果格式化变成表格。它使用&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;::hiccup&lt;/code&gt;在单个 Block 中返回结果，这样就可以避免在 Graph 中创建不必要的 Block。还有个额外的好处是，我加上了一些简单的显示逻辑，将页面标题（&lt;strong&gt;page titles&lt;/strong&gt;）转换为可点击的页面链接（URL），可以将时间转成相对应的 Daily Notes 页面的链接。&lt;/p&gt;

&lt;p&gt;要使用页面链接功能，你需要以一种特殊的方式生成查询：&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;通过在字段名后面添加&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;:name&lt;/code&gt;来指定标题字段，例如：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?title:name&lt;/code&gt;。&lt;/li&gt;
  &lt;li&gt;将 uid 放在紧跟&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?title:name&lt;/code&gt;字段的后面，并在字段名的末尾加上&lt;strong&gt;:uid&lt;/strong&gt;，指定相应的 uid。例如：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?title:uid&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;在字段末尾添加&lt;strong&gt;:date&lt;/strong&gt;，指定一个你想转换为 Daily Notes 页面链接的字段，例如：&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;?time:date&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-clojure highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:find&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?time&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:date&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
 &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:where&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?page&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:node/title&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?page&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:block/uid&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:uid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?page&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:edit/time&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?time&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[(&lt;/span&gt;&lt;span class=&quot;nf&quot;&gt;clojure.string/starts-with?&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;?title&lt;/span&gt;&lt;span class=&quot;no&quot;&gt;:name&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;roam/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)]]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-VNB4S3MOD_g/YA0io8W56uI/AAAAAAAAxTk/LGE9q7Bk0ycEolXBq8x4BlzFsOmz7AOVwCLcBGAsYHQ/s16000/query%2Bexample.png&quot; alt=&quot;Query example&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;pull-表达式&quot;&gt;Pull 表达式&lt;/h3&gt;

&lt;p&gt;SmartBlock 还会将嵌套的结果显示为一个表格，在表格里显示得更整齐。当你执行包含&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(pull )&lt;/code&gt;语句的查询时，它的结果其实是一棵树，而不是一张表。所以我按照下面的逻辑来呈现查询结果。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;我会把结果集的顶层显示为表格的行，值为列。&lt;/li&gt;
  &lt;li&gt;结果集中的嵌套层会交替以列或行的方式呈现。&lt;/li&gt;
  &lt;li&gt;为了避免结果集过大，MAXROWS 默认设置为 40。在高级查询中，你可以更改这个数字。&lt;/li&gt;
  &lt;li&gt;在嵌套层，我使用 MAXROWS/4 来限制显示的行数。即使这样设置，生成的表格也可以达到数百行。(40x10x10x…)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这是一个 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(pull )&lt;/code&gt; 结果所显示的表格。只拉取 1 个层级的深度：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-isR-Snvo9Vg/YA00iDSvjBI/AAAAAAAAxTw/MRQeXRwN0Dkfwbcz7vw8LlsbHNuefQ_4QCLcBGAsYHQ/w640-h418/pull%2Bexample%2B-%2Bon%2Blevel.png&quot; alt=&quot;Pull example - 1 level deep&quot; /&gt;&lt;/p&gt;

&lt;p&gt;拉取 2 个层级的深度：&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://1.bp.blogspot.com/-RQNXGtfv4Ow/YA01Ud0L2cI/AAAAAAAAxT4/SeFvXSug7noxbfO3AzrPP83ssjIvdVzFQCLcBGAsYHQ/w600-h640/pull%2Bexample%2B-%2Bfull%2Bdepth.png&quot; alt=&quot;Pull 2 levels deep&quot; /&gt;&lt;/p&gt;

&lt;h3 id=&quot;query-查询模板&quot;&gt;Query 查询模板&lt;/h3&gt;

&lt;p&gt;要为你的查询生成模板，请运行相应的 &lt;a href=&quot;https://roamresearch.com/#/app/Zsolt-Blog/page/WUn5PuTDV&quot;&gt;Roam42 SmartBlock&lt;/a&gt;。&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Datomic simple-template 简单模板&lt;/li&gt;
  &lt;li&gt;Datomic advanced-template 高级模板&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;一旦准备好你的查询，只需按下嵌套在查询下的按钮即可执行。&lt;/p&gt;

&lt;h2 id=&quot;结束语&quot;&gt;结束语&lt;/h2&gt;

&lt;p&gt;经过一周的时间，我还没有成为这方面的专家。如果我写的东西很傻，比如我的查询或 SmartBlock 有错误的话，请告诉我。你可以在下面的评论中联系我，或者在 Twitter 上&lt;a href=&quot;https://twitter.com/zsviczian&quot;&gt;@zsviczian&lt;/a&gt;。&lt;/p&gt;

&lt;p&gt;另外，我很想了解你是如何使用从这篇文章中学到的知识，以及如何使用 SmartBlock 的。请分享你的想法和成果。谢谢你！&lt;/p&gt;
</description>
      </item>
    
      <item>
        <title>承认错误是成功的关键，帮助自己快速发现并纠正错误 | Roam Newsletter 漫游研究所周报 2021W08</title>
        <link>https://blog.jimmylv.info/2021-03-02-roam-newsletter-RoamCN2021W08/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2021-03-02-roam-newsletter-RoamCN2021W08/</guid>
        <pubDate>Tue, 02 Mar 2021 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;&lt;a href=&quot;https://twitter.com/i/status/1362241563095535619&quot;&gt;Tweet&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/Jimmy_JingLv&quot;&gt;@Jimmy_JingLv&lt;/a&gt; on [[February 18th, 2021]]:&lt;/p&gt;

&lt;p&gt;📮 Roam Newsletter 漫游研究所周报 #2021W08&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;#RoamCN2021W08 #RoamCN #WeeklyNewsletter&lt;/li&gt;
  &lt;li&gt;#roamcult #LearnInPublic #LearnWithJimmy #Zettelkasten&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/cn_roam&quot;&gt;@cn_roam&lt;/a&gt; &lt;a href=&quot;https://twitter.com/RoamResearch&quot;&gt;@RoamResearch&lt;/a&gt; &lt;a href=&quot;http://roamcult.vip&quot;&gt;roam-cn/roamcult.vip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-使用纯-css-实现-mindmap-思维导图&quot;&gt;#[[Roam 插件]] 使用纯 CSS 实现 MindMap 思维导图&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1363768292767277060?s=20&quot;&gt;https://twitter.com/Conaw/status/1363768292767277060?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术-通过解决问题来学习-clojure-是最好的方式作者为-4clojure-问题列表做了一个-roam-research-版本方便学习和做笔记&quot;&gt;#[[Roam 技术]] 通过解决问题来学习 Clojure 是最好的方式；作者为 &lt;a href=&quot;https://twitter.com/4clojure&quot;&gt;@4clojure&lt;/a&gt; 问题列表做了一个 Roam Research 版本，方便学习和做笔记。&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/lucca_dev/status/1365675332490174476?s=20&quot;&gt;https://twitter.com/lucca_dev/status/1365675332490174476?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-社区-roambookclub3-读书活动大家使用同样的-zettelkasten-做笔记的方式相互链接非常有趣不是魔术而是革命&quot;&gt;#[[Roam 社区]] #RoamBookClub3 读书活动，大家使用同样的 #Zettelkasten 做笔记的方式，相互链接，非常有趣：不是魔术，而是革命&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/beauhaan/status/1341105734910500866?s=20&quot;&gt;https://twitter.com/beauhaan/status/1341105734910500866?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/beauhaan/status/1366512170163388420?s=20&quot;&gt;https://twitter.com/beauhaan/status/1366512170163388420?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-基于-block-的-roam-research甚至可以做到将某个-block-ref-的所有使用之处一次性全部替换为-page&quot;&gt;#[[Roam 用例]] 基于 Block 的 Roam Research，甚至可以做到将某个 block ref 的所有使用之处，一次性全部替换为 Page&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RobertHaisfield/status/1366015624535678976?s=20&quot;&gt;https://twitter.com/RobertHaisfield/status/1366015624535678976?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-社区-roam-峰会在-youtube-上直播讨论现在可以回放&quot;&gt;#[[Roam 社区]] Roam 峰会在 YouTube 上直播讨论，现在可以回放&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1365693147267948548?s=20&quot;&gt;https://twitter.com/roamhacker/status/1365693147267948548?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-为了你爱的事情你得去做一些不喜欢的事情&quot;&gt;#[[Roam 洞见]] 为了你爱的事情，你得去做一些不喜欢的事情&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/beauhaan/status/1366252629739917313?s=20&quot;&gt;https://twitter.com/beauhaan/status/1366252629739917313?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术--将是继-smartblock-之后-roam-research-最酷的东西作者将两周的研究成果汇集成文章和视频&quot;&gt;#[[Roam 技术]] `` 将是继 #SmartBlock 之后 Roam Research 最酷的东西，作者将两周的研究成果汇集成文章和视频&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1366120087007199237?s=20&quot;&gt;https://twitter.com/roamhacker/status/1366120087007199237?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-roam-research-卡片式看板模式&quot;&gt;#[[Roam 插件]] Roam Research 卡片式看板模式&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/calhistorian/status/1366049865625604097?s=20&quot;&gt;https://twitter.com/calhistorian/status/1366049865625604097?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/calhistorian/status/1366049768938512387?s=20&quot;&gt;https://twitter.com/calhistorian/status/1366049768938512387?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-工具已死思想永存&quot;&gt;#[[Roam 洞见]] 工具已死，思想永存！&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/SteveYang331/status/1366034567736352777?s=20&quot;&gt;https://twitter.com/SteveYang331/status/1366034567736352777?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-自下而上网络树状结构-vs-网状结构&quot;&gt;#[[Roam 洞见]] 「自下而上」网络：树状结构 vs 网状结构&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;- [blog.jimmylv.info/2020-11-16-roa…](https://blog.jimmylv.info/2020-11-16-roam-newsletter-RoamCN2020W47/)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1365952091093573635?s=20&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1365952091093573635?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-仿-github-提交记录的-roam-research-历史记录插件&quot;&gt;#[[Roam 插件]] 仿 GitHub 提交记录的 Roam Research 历史记录插件&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1365805362553573377?s=20&quot;&gt;https://twitter.com/Conaw/status/1365805362553573377?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-marginnote-高亮导出至-roam-research赏金-150&quot;&gt;#[[Roam 插件]] MarginNote 高亮导出至 Roam Research，赏金 $150&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RoamBounties/status/1366506981926735880?s=20&quot;&gt;https://twitter.com/RoamBounties/status/1366506981926735880?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-社区-结对阅读活动我觉得中文社区也可以搞起来加上直播讨论的形式ping-pong-交替阅读章节然后分享自己读的部分听别人讲自己没读的部分&quot;&gt;#[[Roam 社区]] 结对阅读活动，我觉得中文社区也可以搞起来，加上直播讨论的形式。Ping-Pong 交替阅读章节：然后分享自己读的部分，听别人讲自己没读的部分。&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/beauhaan/status/1366559404137607169?s=20&quot;&gt;https://twitter.com/beauhaan/status/1366559404137607169?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-roam-portal-搜索支持正则表达式且支持中文搜索只是字符统计页面暂未能支持中文&quot;&gt;#[[Roam 插件]] Roam Portal 搜索支持正则表达式，且支持中文搜索，只是字符统计页面暂未能支持中文&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/DharamKapila/status/1365770361086873607?s=20&quot;&gt;https://twitter.com/DharamKapila/status/1365770361086873607?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-roam-block-或-page-的-hangman-填空模式用于背诵记忆-attribute-属性值尝试-3-次失败后可自动显示答案&quot;&gt;#[[Roam 插件]] Roam Block 或 Page 的 Hangman 填空模式，用于背诵记忆 attribute 属性值，尝试 3 次失败后可自动显示答案。&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/DharamKapila/status/1365770303285125121?s=20&quot;&gt;https://twitter.com/DharamKapila/status/1365770303285125121?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-少即是多-如果我有更多的时间我把文字写得更短--古罗马哲学家-西塞罗&quot;&gt;#[[Roam 洞见]] 少即是多 “如果我有更多的时间，我把文字写得更短。” —— 古罗马哲学家 西塞罗&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/visualizevalue/status/1364631907217072137?s=20&quot;&gt;https://twitter.com/visualizevalue/status/1364631907217072137?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-不要独自用餐-链接人际网络&quot;&gt;#[[Roam 洞见]] 《不要独自用餐》 链接人际网络&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1358990734741807107?s=20&quot;&gt;https://twitter.com/Conaw/status/1358990734741807107?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-roam-research-移动端正在开发中conor-想要在-2-月底完成-mobile-设计&quot;&gt;#[[Roam 周边]] Roam Research 移动端正在开发中，Conor 想要在 2 月底完成 Mobile 设计&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1357927790906019843?s=20&quot;&gt;https://twitter.com/Conaw/status/1357927790906019843?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-conor-称赞-obsidian并指出相较于文档编辑器roam-research-更接近于-excel&quot;&gt;#[[Roam 洞见]] Conor 称赞 Obsidian，并指出相较于文档编辑器，Roam Research 更接近于 Excel&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1365099819115577344?s=20&quot;&gt;https://twitter.com/Conaw/status/1365099819115577344?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-roam42-现在支持数据统计-graph-db-stats&quot;&gt;#[[Roam 插件]] #Roam42 现在支持数据统计 “Graph DB Stats”&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1363155957728092163?s=20&quot;&gt;https://twitter.com/roamhacker/status/1363155957728092163?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-roam-research-正在进入冷静期似乎狂热的顶峰已经过去啦&quot;&gt;#[[Roam 洞见]] Roam Research 正在进入冷静期，似乎狂热的顶峰已经过去啦？&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/fortelabs/status/1232718617298366464?s=20&quot;&gt;https://twitter.com/fortelabs/status/1232718617298366464?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-承认错误是成功的关键&quot;&gt;#[[Roam 洞见]] 承认错误是成功的关键&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1365110296260407296?s=20&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1365110296260407296?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-没有什么是完美的&quot;&gt;#[[Roam 洞见]] 没有什么是完美的&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/visualizevalue/status/1364958238014332930?s=20&quot;&gt;https://twitter.com/visualizevalue/status/1364958238014332930?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-动态-roam--render-alpha-功能未来可期可让根据代码和-graph-数据来构建自己的-roam-组件例如看板或-query甚至支持-mdx&quot;&gt;#[[Roam 动态]] [[roam / render]] Alpha 功能未来可期，可让根据代码和 Graph 数据来构建自己的 Roam 组件（例如看板或 Query，甚至支持 mdx&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1364772643136700417?s=20&quot;&gt;https://twitter.com/Conaw/status/1364772643136700417?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-roam-research-学术写作的课程介绍&quot;&gt;#[[Roam 用例]] Roam Research 学术写作的课程介绍&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/wshuyi/status/1364758849719255044?s=20&quot;&gt;https://twitter.com/wshuyi/status/1364758849719255044?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-生态-记忆工具-neuracache-支持简单的-csv-文件-qa-内容导入&quot;&gt;#[[Roam 生态]] 记忆工具 @NeuraCache 支持简单的 .csv 文件 Q&amp;amp;A 内容导入&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/neuracache/status/1364579994652008450?s=20&quot;&gt;https://twitter.com/neuracache/status/1364579994652008450?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-漫游-60-秒教程每集只探索一个基本概念&quot;&gt;#[[Roam 教程]] 《漫游 60 秒》教程，每集只探索一个基本概念&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RoamBrain/status/1364565118919598081?s=20&quot;&gt;https://twitter.com/RoamBrain/status/1364565118919598081?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-写作的-67-点好处我只是很讨厌数字化的标题党谁让人脑喜欢数字呢-&quot;&gt;#[[Roam 洞见]] 写作的 67 点好处（我只是很讨厌「数字化」的标题党，谁让人脑喜欢数字呢 🔢）&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/seanwes/status/1363866752342364160?s=20&quot;&gt;https://twitter.com/seanwes/status/1363866752342364160?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-roam-research-开源版本-athens-正式发布&quot;&gt;#[[Roam 周边]] Roam Research 开源版本 Athens 正式发布&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/AthensResearch/status/1364380119763013636?s=20&quot;&gt;https://twitter.com/AthensResearch/status/1364380119763013636?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-ipad-上的写作环境搭建自动化部署&quot;&gt;#[[Roam 周边]] iPad 上的写作环境搭建，自动化部署&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/aravindballa/status/1364494177266921474?s=20&quot;&gt;https://twitter.com/aravindballa/status/1364494177266921474?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-unix-哲学-做好一件事接口拼接组合&quot;&gt;#[[Roam 洞见]] #Unix 哲学 做好一件事；接口拼接组合&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1364431350837641223?s=20&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1364431350837641223?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边netnewswire-60-测试版试用体验报告无法取代我的刷推体验&quot;&gt;#[[Roam 周边]]&lt;a href=&quot;https://twitter.com/NetNewsWire&quot;&gt;@netnewswire&lt;/a&gt; 6.0 测试版试用体验报告，无法取代我的刷推体验&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1364214900466196482?s=20&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1364214900466196482?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-trello-支持四种全新的看板查看模式时间轴日历表格仪表板&quot;&gt;#[[Roam 周边]] Trello 支持四种全新的看板查看模式（时间轴、日历、表格、仪表板）&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1364212886042681347?s=20&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1364212886042681347?s=20&lt;/a&gt;&lt;/blockquote&gt;
</description>
      </item>
    
      <item>
        <title>写作时感到的痛苦，是理清思想的痛苦 | Roam Newsletter 漫游研究所周报 2021W07</title>
        <link>https://blog.jimmylv.info/2021-02-18-roam-newsletter-RoamCN2021W07/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2021-02-18-roam-newsletter-RoamCN2021W07/</guid>
        <pubDate>Thu, 18 Feb 2021 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;&lt;a href=&quot;https://twitter.com/i/status/1358420097279291392&quot;&gt;Tweet&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/Jimmy_JingLv&quot;&gt;@Jimmy_JingLv&lt;/a&gt; on [[February 7th, 2021]]:&lt;/p&gt;

&lt;p&gt;📮 Roam Newsletter 漫游研究所周报 #2021W07 - #RoamCN2021W07 #RoamCN #WeeklyNewsletter - #roamcult #LearnInPublic #LearnWithJimmy #Zettelkasten - &lt;a href=&quot;https://twitter.com/cn_roam&quot;&gt;@cn_roam&lt;/a&gt; &lt;a href=&quot;https://twitter.com/RoamResearch&quot;&gt;@RoamResearch&lt;/a&gt; &lt;a href=&quot;http://roamcult.vip&quot;&gt;roam-cn/roamcult.vip&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-思想家的-11-项思考技能knowledge-able-而非-information-full&quot;&gt;#[[Roam 洞见]] 思想家的 11 项思考技能：knowledge-able 而非 information-full&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/cabreraresearch/status/1361148595127410692?s=20&quot;&gt;https://twitter.com/cabreraresearch/status/1361148595127410692?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-生态-作者打造自己的-neno-stands-for-network-of-notes-系统创建知识的可视化地图&quot;&gt;#[[Roam 生态]] 作者打造自己的 NENO (stands for “network of notes”) 系统，创建知识的可视化地图&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/szimr/status/1360614041601921027?s=20&quot;&gt;https://twitter.com/szimr/status/1360614041601921027?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/szimr/status/1360614061323530241?s=20&quot;&gt;https://twitter.com/szimr/status/1360614061323530241?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技巧-父子-block-之间的路径可视化写作时可展现思维延展的实时反馈-ref-path-scope-highlight&quot;&gt;#[[Roam 技巧]] 父子 Block 之间的路径可视化，写作时可展现思维延展的实时反馈 [[ref path scope highlight]]&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RobertHaisfield/status/1362208990680150016?s=20&quot;&gt;https://twitter.com/RobertHaisfield/status/1362208990680150016?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-教程-在-roam-research-中实施敏捷产品管理-roamagile&quot;&gt;#[[Roam 教程]] 在 Roam Research 中实施敏捷产品管理 #RoamAgile&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/zsviczian/status/1358378780654452736?s=20&quot;&gt;https://twitter.com/zsviczian/status/1358378780654452736?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-写作时感到的痛苦是理清思想的痛苦--david-perell&quot;&gt;#[[Roam 洞见]] 写作时感到的痛苦，是理清思想的痛苦。 —— David Perell&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1359712526418669572?s=20&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1359712526418669572?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-一个人的-twitter给未来写作积累素材&quot;&gt;#[[Roam 洞见]] 一个人的 Twitter，给未来写作积累素材&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jimmy_JingLv/status/1226747957740892160?s=20&quot;&gt;https://twitter.com/Jimmy_JingLv/status/1226747957740892160?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-洞见-完成一件事情最有效的方法就是去做这件事情&quot;&gt;#[[Roam 洞见]] 完成一件事情最有效的方法就是，“去做这件事情”&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/butchersbot/status/1361794068909617153?s=20&quot;&gt;https://twitter.com/butchersbot/status/1361794068909617153?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-twitter-将-newsletter-提供商-revue-添加至左侧导航菜单&quot;&gt;#[[Roam 周边]] Twitter 将 Newsletter 提供商 @Revue 添加至左侧导航菜单&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/nishuang/status/1361866704901599234?s=20&quot;&gt;https://twitter.com/nishuang/status/1361866704901599234?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-周边-随着-clubhouse-的火热twitter-也正式推出-spaces-聊天室功能&quot;&gt;#[[Roam 周边]] 随着 #Clubhouse 的火热，Twitter 也正式推出 Spaces 聊天室功能&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/nishuang/status/1362218037760454659?s=20&quot;&gt;https://twitter.com/nishuang/status/1362218037760454659?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-父子-block-之间的路径可视化追溯当前编辑-block-的所有上一级想法&quot;&gt;#[[Roam 插件]] 父子 Block 之间的路径可视化，追溯当前编辑 Block 的所有上一级想法&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/azlenelza/status/1359586814894350337?s=20&quot;&gt;https://twitter.com/azlenelza/status/1359586814894350337?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件roamjscom-twitter-插件现在支持直接从-roam-research-发送-tweet并且支持嵌入式附件比如图片甚至-gif-动图&quot;&gt;#[[Roam 插件]]&lt;a href=&quot;http://roamjs.com&quot;&gt;roamjs.com&lt;/a&gt; Twitter 插件现在支持直接从 Roam Research 发送 Tweet，并且支持嵌入式附件，比如图片甚至 GIF 动图&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/dvargas92495/status/1362188518202765313?s=20&quot;&gt;https://twitter.com/dvargas92495/status/1362188518202765313?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-选择-roam-research-的契机以及为什么这会是一次变革式体验&quot;&gt;#[[Roam 用例]] 选择 Roam Research 的契机，以及为什么这会是一次变革式体验？&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/calhistorian/status/1362183904375934978?s=20&quot;&gt;https://twitter.com/calhistorian/status/1362183904375934978?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技巧-在-vivaldi-浏览器使用-roam-research平铺所有-roam-research-内容尽情漫游&quot;&gt;#[[Roam 技巧]] 在 Vivaldi 浏览器使用 Roam Research，平铺所有 Roam Research 内容，尽情漫游&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/jonmccull/status/1361974056057200640?s=20&quot;&gt;https://twitter.com/jonmccull/status/1361974056057200640?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-技术-roam-research-底层使用-datomic--datascript-数据库&quot;&gt;#[[Roam 技术]] Roam Research 底层使用 Datomic / Datascript 数据库&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/houshuang/status/1361990006039076865?s=20&quot;&gt;https://twitter.com/houshuang/status/1361990006039076865?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-用例-在-roam-research-中使用重要紧急-艾森豪威尔-2x2-矩阵&quot;&gt;#[[Roam 用例]] 在 Roam Research 中使用“重要/紧急” 艾森豪威尔 2x2 矩阵&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/itsjustmath/status/1361913007639420930?s=20&quot;&gt;https://twitter.com/itsjustmath/status/1361913007639420930?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-社区-roam-峰会将-roam-社区最聪明的头脑聚集在一起分享讨论和辩论最佳实践和方法&quot;&gt;#[[Roam 社区]] Roam 峰会，将 Roam 社区最聪明的头脑聚集在一起，分享、讨论和辩论最佳实践和方法。&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RoamBrain/status/1361740547329826818?s=20&quot;&gt;https://twitter.com/RoamBrain/status/1361740547329826818?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-插件-roam-research-纯-css-实现-daily-notes-日程看板&quot;&gt;#[[Roam 插件]] Roam Research 纯 CSS 实现 Daily Notes 日程看板&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RoamBounties/status/1361496666587750405?s=20&quot;&gt;https://twitter.com/RoamBounties/status/1361496666587750405?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;roam-社区-roamgames-第二回合冠军诞生用于奖励社区的优秀插件和内容&quot;&gt;#[[Roam 社区]] #RoamGames 第二回合冠军诞生，用于奖励社区的优秀插件和内容&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Conaw/status/1361908943677583361?s=20&quot;&gt;https://twitter.com/Conaw/status/1361908943677583361?s=20&lt;/a&gt;&lt;/blockquote&gt;
</description>
      </item>
    
      <item>
        <title>RoamResearch 的革命性，在于恢复用户对自己注意力的控制权 | Roam Newsletter 漫游研究所周报 2021W06</title>
        <link>https://blog.jimmylv.info/2021-02-07-roam-newsletter-RoamCN2021W06/</link>
        <guid isPermaLink="true">https://blog.jimmylv.info/2021-02-07-roam-newsletter-RoamCN2021W06/</guid>
        <pubDate>Sun, 07 Feb 2021 00:00:00 +0000</pubDate>
        <description>&lt;p&gt;&lt;a href=&quot;https://twitter.com/i/status/1356415974388371457&quot;&gt;Tweet&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/Jimmy_JingLv&quot;&gt;@Jimmy_JingLv&lt;/a&gt; on [[February 2nd, 2021]]:&lt;/p&gt;

&lt;p&gt;📮 Roam Newsletter 漫游研究所周报 #2021W06 - #RoamCN2021W06 #RoamCN #WeeklyNewsletter - #roamcult #LearnInPublic #LearnWithJimmy #Zettelkasten - &lt;a href=&quot;https://twitter.com/cn_roam&quot;&gt;@cn_roam&lt;/a&gt; &lt;a href=&quot;https://twitter.com/RoamResearch&quot;&gt;@RoamResearch&lt;/a&gt; &lt;a href=&quot;http://roamcult.vip&quot;&gt;roam-cn/roamcult.vip&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;roam-洞见-感谢这个时代给我们这么丰富的工具&quot;&gt;#[[Roam 洞见]] 感谢这个时代给我们这么丰富的工具&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/wanglei001/status/1358368407435894785?s=20&quot;&gt;https://twitter.com/wanglei001/status/1358368407435894785?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-洞见-放下包袱尽管去做不要害怕失败&quot;&gt;#[[Roam 洞见]] 放下包袱，尽管去做，不要害怕失败。&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/butchersbot/status/1357988989412769793?s=20&quot;&gt;https://twitter.com/butchersbot/status/1357988989412769793?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-洞见-如何礼貌地求一个-clubhouse-邀请码&quot;&gt;#[[Roam 洞见]] 如何“礼貌地“求一个 #Clubhouse 邀请码？&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Linmiv/status/1357572269070024704?s=20&quot;&gt;https://twitter.com/Linmiv/status/1357572269070024704?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-洞见-厚积薄发台上一分钟台下十年功&quot;&gt;#[[Roam 洞见]] 厚积薄发，“台上一分钟，台下十年功”&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/visualizevalue/status/1356967484604248064?s=20&quot;&gt;https://twitter.com/visualizevalue/status/1356967484604248064?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-周边logseq-支持通过-hashtag-修改-block-样式&quot;&gt;#[[Roam 周边]]&lt;a href=&quot;https://twitter.com/logseq&quot;&gt;@logseq&lt;/a&gt; 支持通过 #hashtag 修改 Block 样式&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/hrdcrpxxx/status/1358387950451572738?s=20&quot;&gt;https://twitter.com/hrdcrpxxx/status/1358387950451572738?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-洞见-internet-10-是基于赢利目的而创建的吸引用户的注意力就是全部而-roamresearch-则是革命性的因为它可以恢复用户对自己注意力的控制权&quot;&gt;#[[Roam 洞见]] Internet 1.0 是基于赢利目的而创建的：吸引用户的注意力就是全部；而 &lt;a href=&quot;https://twitter.com/RoamResearch&quot;&gt;@RoamResearch&lt;/a&gt; 则是革命性的，因为它可以恢复用户对自己注意力的控制权。&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jeanvaljean689/status/1358405723957338112?s=20&quot;&gt;https://twitter.com/Jeanvaljean689/status/1358405723957338112?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-教程-作者从-evernote-迁移至-roamresearch-在-roam-里彼此链接而不再归档于文件夹&quot;&gt;#[[Roam 教程]] 作者从 @Evernote 迁移至 &lt;a href=&quot;https://twitter.com/RoamResearch&quot;&gt;@RoamResearch&lt;/a&gt; 在 #Roam 里彼此链接，而不再归档于文件夹。&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/jeremycaplan/status/1358152523090124802?s=20&quot;&gt;https://twitter.com/jeremycaplan/status/1358152523090124802?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-脑洞-如何没有键盘文本编辑器会是什么样的&quot;&gt;#[[Roam 脑洞]] 如何没有键盘，文本编辑器会是什么样的？&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/azlenelza/status/1331623011049500678?s=20&quot;&gt;https://twitter.com/azlenelza/status/1331623011049500678?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-脑洞-如何利用直观的视觉思维以非常轻松的方式表达什么叫脑洞&quot;&gt;#[[Roam 脑洞]] 如何利用直观的视觉思维，以非常轻松的方式表达什么叫脑洞？&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/z9sx7wox/status/1358274864407273474?s=20&quot;&gt;https://twitter.com/z9sx7wox/status/1358274864407273474?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-用例-通过-previousnext-链接来给自己的-block-内容导航&quot;&gt;#[[Roam 用例]] 通过 Previous/Next 链接来给自己的 Block 内容导航&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/maskys_/status/1358037060930523136?s=20&quot;&gt;https://twitter.com/maskys_/status/1358037060930523136?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-生态-readwise-支持-ios-桌面小组件可用于复习&quot;&gt;#[[Roam 生态]] @Readwise 支持 iOS 桌面小组件，可用于复习&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/readwiseio/status/1357790007524790272?s=20&quot;&gt;https://twitter.com/readwiseio/status/1357790007524790272?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-生态-roam42-的-live-preview-和-daily-notes-popup-功能介绍与使用教程我之前有尝试用来做-燃烧清单&quot;&gt;#[[Roam 生态]] #Roam42 的 LIVE PREVIEW 和 DAILY NOTES POPUP 功能介绍与使用教程。（我之前有尝试用来做 #[[燃烧清单]]）&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1358133104297324545?s=20&quot;&gt;https://twitter.com/roamhacker/status/1358133104297324545?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-主题-the-observer-观察者模式有助于创造力&quot;&gt;#[[Roam 主题]] “The Observer” 观察者模式，有助于创造力&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/rcvd_io/status/1358326206660304906?s=20&quot;&gt;https://twitter.com/rcvd_io/status/1358326206660304906?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-主题-作者为-roam-research-打造了模块化-css-system-20&quot;&gt;#[[Roam 主题]] 作者为 Roam Research 打造了模块化 CSS System 2.0&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/rcvd_io/status/1358131650526339075?s=20&quot;&gt;https://twitter.com/rcvd_io/status/1358131650526339075?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-协作-roam-多人模式插件如何在-roam-里面进行聊天或异步的头脑风暴&quot;&gt;#[[Roam 协作]] Roam 多人模式插件，如何在 Roam 里面进行聊天或异步的头脑风暴&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/houshuang/status/1355324543913648130?s=20&quot;&gt;https://twitter.com/houshuang/status/1355324543913648130?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-生态-如何通过-roam42-smartblocks-直接获取-hypothesis-中的高亮内容&quot;&gt;#[[Roam 生态]] 如何通过 #Roam42 SmartBlocks 直接获取 &lt;a href=&quot;http://Hypothes.is&quot;&gt;Hypothes.is&lt;/a&gt; 中的高亮内容&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/roamhacker/status/1358048556024750080?s=20&quot;&gt;https://twitter.com/roamhacker/status/1358048556024750080?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-技巧-roam-70-快捷键汇总-cheatsheet&quot;&gt;#[[Roam 技巧]] Roam 70+ 快捷键汇总 #CheatSheet&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/bjosephburch/status/1357972106114445314?s=20&quot;&gt;https://twitter.com/bjosephburch/status/1357972106114445314?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-用例-如何直接在-roam-阅读-pdf-的工作流&quot;&gt;#[[Roam 用例]] 如何直接在 Roam 阅读 PDF 的工作流&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/RoamResearch/status/1357929861805789187?s=20&quot;&gt;https://twitter.com/RoamResearch/status/1357929861805789187?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-协作-作者使用-roam-管理分布式创业公司关于团队协作的-9-件事情&quot;&gt;#[[Roam 协作]] 作者使用 Roam 管理分布式创业公司，关于团队协作的 9 件事情&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/MatMcGann/status/1357893347373846533?s=20&quot;&gt;https://twitter.com/MatMcGann/status/1357893347373846533?s=20&lt;/a&gt;&lt;/blockquote&gt;

&lt;h3 id=&quot;roam-用例-在-roam-里面通过-iframe-直接嵌入另一个-roam-graph-的内容-无限套娃&quot;&gt;#[[Roam 用例]] 在 Roam 里面通过 iframe 直接嵌入另一个 Roam Graph 的内容 #[[无限套娃]]&lt;/h3&gt;

&lt;blockquote&gt;&lt;a href=&quot;https://twitter.com/Jeanvaljean689/status/1357883692685824001?s=20&quot;&gt;https://twitter.com/Jeanvaljean689/status/1357883692685824001?s=20&lt;/a&gt;&lt;/blockquote&gt;
</description>
      </item>
    
  </channel>
</rss>