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
launchd
、cron
是计划任务程序,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
,但不同于 cron
,launchd
使用 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
是苹果建议的替代工具,并在系统层面提供了额外的增强:
能力 | cron | launchd |
---|---|---|
定时任务 | 支持 | 支持 |
调试 | 不支持,只能重置任务时间 | 支持 |
热重载 | 支持 | 需要重新 unload + load |
关机 & 休眠 | 不支持 | 支持 |
网络触发 | 不支持 | 支持 |
新增文件 | 不支持 | 支持 |
崩溃后重新执行 | 不支持 | 支持 |
计划任务可以通过简单的设置节省大量的时间,如果在日常工作每天省出 5 分钟,全年将节省超过 30 小时~