CodingTour
ARTS #71 | 虚拟化

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 成功。