Algorithm
本周选择的算法题是:Subsets
规则如下:
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
Solution
很简单、直观的两个解法。
迭代
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ans = [[]]
for num in nums:
ans += [subset + [num] for subset in ans]
return ans
回溯
class Solution:
def subsets(self, nums: List[int]) -> List[List[int]]:
ans = []
n = len(nums)
def trace(index, curr):
ans.append(curr)
for i in range(index, n):
trace(i + 1, curr + [nums[i]])
trace(0, [])
return ans
Review
Reproducible and Contained CI Builds on Mac OS without Virtualization
macOS 下的几种环境打包方法:
- 基于 VMWare、VirtualBox 等虚拟机 - 资源占用太多,影响机器性能
- 基于黑苹果打包镜像 - 可以分布式部署,但是稳定性不好,维护麻烦
- 基于 Nix 将环境依赖做成分发包 - 文中提到的方法
- Docker Toolbox - 本质上是还是基于 VirtualBox
- Docker Desktop - 基于苹果的 Hypervisor.framework 框架,原生的虚拟化支持,对硬件有要求,可以通过执行命令
sysctl kern.hv_support
检查当前机器是否支持 - Anka - 也是基于苹果的
Hypervisor.framework
框架
Tip
Medium
有可以白嫖的插件:Medium Unlimited
Share
Docker 踩坑记录
前段时间将 Android 的 CI 环境做成了 Docker 镜像,以方便维护,观察了一段时间觉得特别好用,粗略记录一下过程。
安装 Docker
跟着官方文档走: 传送门。
大多数配置可以提前统一设置好,如:
- 环境变量
- SSH
- git config
- 必要的缓存,减少恢复时长
- 其他依赖包
基本上能跑起来了。
selinux 踩坑
很快遇到了磁盘空间不够的问题,于是想着转移 docker 镜像存储的位置,照着这篇文档做就行:传送门。
然后 Run Image 就报错了:
file:///bin/bash: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
排查了一段时间后发现是 selinux 的问题:
- https://github.com/Project-OSRM/osrm-backend/issues/5294
- https://github.com/moby/moby/issues/7318
了解 selinux:
- https://www.arhea.net/posts/2020-04-28-selinux-for-containers.html
- https://jaosorior.dev/2018/selinux-and-docker-notes/
selinux 安全策略设置:
- https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux_atomic_host/7/html/managing_containers/managing_storage_with_docker_formatted_containers
解决后再次 Run Image 成功。