CodingTour
ARTS #191 | AI 生成网站图片

by ogen.ai

Algorithm

本周选择的算法题是:Invert Binary Tree

use std::rc::Rc;
use std::cell::RefCell;
impl Solution {
    pub fn invert_tree(root: Option<Rc<RefCell<TreeNode>>>) -> Option<Rc<RefCell<TreeNode>>> {
        if let Some(node) = &root {
            let mut node = node.borrow_mut();
            let left = node.left.take();
            let right = node.right.take();
            node.left = Self::invert_tree(right);
            node.right = Self::invert_tree(left);
        }
        root
    }
}

Review

How to Write Technical Documentation With Empathy

作者在这篇文章中介绍了关于文档的三个话题:

  • 文档的分类
  • 文档在协作层面的作用
  • 如何写好文档

作者对文档的分类是比较有洞察的,共分为四种:

  • 教程 - 新人需要知道什么,通常教程应该是一段简要概述,详细细节放到引用链接里
  • How-to - 这类文档应该假设读者具备基础知识和背景,不需要解释概念。因此应当在文档开头明确说明读者要知道什么,然后引导读者在文档中索引各种信息
  • 技术文档 - 是关于如何操作机器/系统的文档,比如描述类、方法和 API,告诉用户如何使用它们,这类文档读起来通常会显得乏味。需要注意的是,技术文档一定要搭配例子:
  • 解释类文档 - 就像这篇文章尝试解释文档的类型和侧重点一样,解释类文档主要是说明概念,并且大多会配上图表,以帮助读者理解 “why”。解释类文档的副作用:有时候读者并不需要真正理解 “why”,但通过让读者阅读解释类文档,可以增强读者对作者的满意度,使他们乐于使用作者提供的产品和服务

从协作层面看,文档和现实中的直接对话、email 等有一个非常不同的区别:文档是先发制人地回答问题,以预料到有人可能会问什么

值得一看~

Tip

重新认识 awk 命令: AWK command in Unix/Linux with examples

Share

分享如何利用 Rime 输入法快速输入当天日期/时间~

想借助 Rime 的原生定制能力实现起来是比较困难的,但好在 librime-lua 提高了 Rime 的扩展能力,简单说可以将 librime-lua 视为 Rime 的插件控制器,只要写一段简单的 Lua 脚本就能自定义功能集成进 Rime 宿主程序中,接下来我们描述下具体方法。

由于 modules.cc#L38rime.lua 文件作为了统一入口,所以 Lua 脚本也要写在 rime.lua 里,例:

-- rime.lua

function date_translator(input, seg)

    -- 日期格式说明:

    -- %a	abbreviated weekday name (e.g., Wed)
    -- %A	full weekday name (e.g., Wednesday)
    -- %b	abbreviated month name (e.g., Sep)
    -- %B	full month name (e.g., September)
    -- %c	date and time (e.g., 09/16/98 23:48:10)
    -- %d	day of the month (16) [01-31]
    -- %H	hour, using a 24-hour clock (23) [00-23]
    -- %I	hour, using a 12-hour clock (11) [01-12]
    -- %M	minute (48) [00-59]
    -- %m	month (09) [01-12]
    -- %p	either "am" or "pm" (pm)
    -- %S	second (10) [00-61]
    -- %w	weekday (3) [0-6 = Sunday-Saturday]
    -- %W	week number in year (48) [01-52]
    -- %x	date (e.g., 09/16/98)
    -- %X	time (e.g., 23:48:10)
    -- %Y	full year (1998)
    -- %y	two-digit year (98) [00-99]
    -- %%	the character `%´

    -- 输入完整日期
    if (input == "datetime") then
        yield(Candidate("date", seg.start, seg._end, os.date("%Y-%m-%d %H:%M:%S"), ""))
    end

    -- 输入日期
    if (input == "date") then
        --- Candidate(type, start, end, text, comment)
        yield(Candidate("date", seg.start, seg._end, os.date("%Y-%m-%d"), ""))
        yield(Candidate("date", seg.start, seg._end, os.date("%Y/%m/%d"), ""))
        yield(Candidate("date", seg.start, seg._end, os.date("%Y.%m.%d"), ""))
        yield(Candidate("date", seg.start, seg._end, os.date("%Y年%m月%d日"), ""))
        yield(Candidate("date", seg.start, seg._end, os.date("%m-%d-%Y"), ""))
    end

    -- 输入时间
    if (input == "time") then
        --- Candidate(type, start, end, text, comment)
        yield(Candidate("time", seg.start, seg._end, os.date("%H:%M"), ""))
        yield(Candidate("time", seg.start, seg._end, os.date("%Y%m%d%H%M%S"), ""))
        yield(Candidate("time", seg.start, seg._end, os.date("%H:%M:%S"), ""))
    end

    -- 输入星期
    -- -- @JiandanDream
    -- -- https://github.com/KyleBing/rime-wubi86-jidian/issues/54
    if (input == "week") then
        local weekTab = {'日', '一', '二', '三', '四', '五', '六'}
        yield(Candidate("week", seg.start, seg._end, "周"..weekTab[tonumber(os.date("%w")+1)], ""))
        yield(Candidate("week", seg.start, seg._end, "星期"..weekTab[tonumber(os.date("%w")+1)], ""))
        yield(Candidate("week", seg.start, seg._end, os.date("%A"), ""))
        yield(Candidate("week", seg.start, seg._end, os.date("%a"), "缩写"))
        yield(Candidate("week", seg.start, seg._end, os.date("%W"), "周数"))
    end

    -- 输入月份英文
    if (input == "month") then
        yield(Candidate("month", seg.start, seg._end, os.date("%B"), ""))
        yield(Candidate("month", seg.start, seg._end, os.date("%b"), "缩写"))
    end
end

然后在给 *.schema.yamltranslators 添加 lua_translator@date_translator 即可,这样一来在 lua 中实现的 date translator 就像一个原生的 C++ translator 一样。

重新部署后应该就能看到效果了。

进一步,将原 rime.lua 中的内容放到 {用户配置文件根目录}/lua/date.lua 中,然后调整 rime.lua 的内容:

-- rime.lua

date_translator = require("date")

将插件内容拆分到不同的模块后,各个插件的内聚性更强、更易于维护。