CodingTour
ARTS #154

Algorithm

本周选择的算法题是:Permutations II

规则

Given a collection of numbers, nums, that might contain duplicates, return all possible unique permutations in any order.

Example 1:

Input: nums = [1,1,2]
Output:
[[1,1,2],
 [1,2,1],
 [2,1,1]]

Example 2:

Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

Constraints:

  • 1 <= nums.length <= 8
  • -10 <= nums[i] <= 10

Solution

class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        perms = [[]]
        for num in nums:
            perms = [p[:i] + [num] + p[i:] for p in perms for i in range((p + [num]).index(num) + 1)]
        return perms

Review

Don’t Start a No-Code Business

作者从商业竞争力角度对无代码进行的分析。

简单来说就是如果你的想法可以在无代码的情况下完成,那么不会编程的人自然很容易模仿,或者出现很多复制品,这表示不太可能建立一个没有代码的十亿美元公司/业务。其次,无代码仅仅是快速验证想法的手段,如果想法本身不靠谱,那么无代码也只是让失败预期来的更快而已,当然了,这不是无代码的错。

从服务成本角度看,如果某一天业务规模发展到了要服务数百万用户的情况(指技术产品),那么扩展 & 添加功能、优化代码以便充分利用硬件(云或自有服务器),降低成本并加快执行速度就是不得不做的事情,在该情况下,从无代码迁移到最佳代码,势必会积累沉重的技术债务。

那无代码的应用场景在哪呢?要知道无代码仅仅是众多技术手段中的一种,并不是技术发展的最终目标,核心还是看通过无代码能创造出什么样的东西,特别是对“企业家”而言,如果更重要的是营销策略而不是类似 Dropbox 这样的软件,那么无代码仍然可以在较长周期内发挥较大的作用。

企业家的想法、愿景才是更重要的。

Tip

一个可以在终端优雅操作 JSON 的小工具: fx

Share

launchd vs cron

launchdcron 是计划任务程序,cron 支持 Linux/macOS,launchd 仅支持 macOS。

简单对比下它们的能力。

cron

cron 的语法:

比如:

$ 50 23 * * 0 diskutil repairVolume /Volumes/MacHD

表示每周日的 23点50分 进行宗卷修复操作。

cron 也支持重定向输出:

$ 50 23 * * 0 diskutil repairVolume /Volumes/MacHD > /tmp/stdout.log 2> /tmp/stderr.log

> 重定向输出到 /tmp/stdout.log>2 重定向错误输出到 /tmp/stderr.log

展示 cron 任务列表:

$ crontab -l
...

删除所有的任务:

$ crontab -r

cron 守护进程会搜索 crontab 文件,然后 cron 每分钟循环一次,检查 crontab 文件中的每个命令以确定其是否应在这一分钟执行。

另外,如果 cron 在指定的执行时间到达时,电脑处于关机或休眠状态,则只能等下一个指定时间到来时才能触发执行。

launchd

launchd 是苹果的一个开源项目,提供的能力多于 cron,但不同于 cronlaunchd 使用 plist 描述任务项:

基础能力差不多,不过 launchd 可以很方便的调试任务:

$ launchctl list
-  ...
# 调试
$ launchctl start 服务名
# 停止服务
$ launchctl stop 服务名
# 输入服务
$ launchctl load /path/to/plist
# 卸载服务
$ launchctl unload /path/to/plist

launchd 支持的子命令很多:

此外,如果到了任务需要执行的时间,而计算机处于关机或休眠的状态,它会在计算机重新可用时自动将任务添加到执行队列;如果错过了很多次,也只会执行一次。

launchd 在 macOS 上除了提供定时任务的能力外,还在引入启动 macOS 的过程中发挥了作用:

  • 内核初始化后,会加载 launchd
  • launchd 扫描 /System/Library/LaunchDaemons/Library/LaunchDaemons,然后加载 login 窗口

总结

launchd 是苹果建议的替代工具,并在系统层面提供了额外的增强:

能力cronlaunchd
定时任务支持支持
调试不支持,只能重置任务时间支持
热重载支持需要重新 unload + load
关机 & 休眠不支持支持
网络触发不支持支持
新增文件不支持支持
崩溃后重新执行不支持支持

计划任务可以通过简单的设置节省大量的时间,如果在日常工作每天省出 5 分钟,全年将节省超过 30 小时~