> 一份2021年03月14日的信息流提炼 ### 每天学点机器学习 #### Python编程和数值方法:工程师和科学家指南 原文:[Python Programming and Numerical Methods: A Guide for Engineers and Scientists](https://news.ycombinator.com/item?id=26164879) ##### 第25章 介绍机器学习 机器学习,顾名思义,就是试图让计算机具备学习能力,让计算机能够从数据或者过去的经验中学习。机器学习算法在我们生活中的很多地方都有应用,你可能没有意识到。例如,你智能手机上的语音助手,ATM机识别存款支票,你的电子邮件提供商自动将好的邮件和垃圾邮件分开,自动驾驶汽车在没有司机的情况下行驶,在一些安检处进行面部识别,还有很多例子 ###### 机器学习的类型 ![](https://pythonnumericalmethods.berkeley.edu/_images/25.01.01-types-of-ML.jpg) 基本两个大类,Supervised 和 Unsupervised 。中文翻译过来是监督学习和无监督学习。这里觉得日语的翻译更为直观:有教师的学习和无教师的学习。 Supervised: 数据分类和数据预测(回归)。 Unsupervised: 聚类,降维。这里的理解是聚类是为了学习隐藏特征进行分类,降维是为了降低数据的理解难度也方便可视化。 ###### 机器学习的组成 - representation 数据的表示 - tunable model 可调模型 - optimization algorithm 优化算法来调整模型 - trained model 训练完成的模型 ---- 很有趣的是在HN下一个关于python的评论: >在过去的十几年里,我一直是数值/科学计算领域的一个奇葩,因为我大多拒绝使用 Python 进行严肃的数值编程。 > >Python社区在制作一套科学软件方面做得非常出色。数值库和绘图在Python中非常出色。Sympy和Sage都是非常有野心的,在我看来,是相当成功的项目。那么问题出在哪里呢? > >长久性和稳定性。随你怎么嘲笑它,但老掉牙的FORTRAN代码,以及在过去20年里的C和C++,是严肃的科学应用的基石。Python通常不是。 > >显然,我是一个 "程序员的程序员",不过这可能是一个暗示,为什么Lisp仍然不适合科学家使用。大多数科学家不知道或不关心堆栈分配是什么。 ### 每天学点运维 #### Docker安全攻略 原文:[Docker Security Cheat Sheet](https://news.ycombinator.com/item?id=26446337) - RULE #0 - 保持Host和Docker更新 - 为了防止已知的、容器逃逸的漏洞,这些漏洞通常会升级到root/administrator权限,给Docker Engine和Docker Machine打补丁是至关重要的。容器(不同于虚拟机)与主机共享内核,因此在容器内执行的内核漏洞会直接攻击主机内核。 - RULE #1 - 不要暴露Docker守护进程套接字(即使是对容器) - 不要启用tcp Docker daemon socket。如果你在运行docker daemon时使用-H tcp://0.0.0.0:XXX或类似情况,你就会暴露出对Docker daemon的未加密和未认证的直接访问。 - 不要将/var/run/docker.sock暴露给其他容器。 - RULE #2 - 设置一个用户 - 配置容器使用无权用户是防止特权升级攻击的最佳方式。 - ```bash # 方法1:使用 -u option,例如: docker run -u 4000 alpine # 方法2:在Dockerfile中添加用户,例如: FROM alpine RUN groupadd -r myuser && useradd -r -g myuser myuser USER myuser ``` - RULE #3 - 限制能力(只授予容器所需的特定能力)。 - Linux内核能力是一组可以被特权者使用的权限。Docker,默认情况下,只运行一个能力子集。记住不要使用`--privileged`标志运行容器--这将会把所有的Linux内核功能添加到容器中。例如 `docker run --cap-drop all --cap-add CHOWN alpine` - RULE #4 - 增加-no-new-privileges标志 - 始终以 `--security-opt=no-new-privileges` 运行 docker 映像,以防止使用 setuid 或 setgid 二进制文件升级权限。 - RULE #6 - 使用Linux安全模块(seccomp、AppArmor或SELinux) - 首先,不要禁用默认的安全配置文件!可以考虑使用seccomp或AppArmor等安全配置文件。 - RULE #7 - 限制资源(内存、CPU、文件描述符、进程、重启) - 避免DoS攻击的最好方法是限制资源。你可以限制内存、CPU、最大重启次数(`--restart=on-failure:`)、最大文件描述符数量(`--ulimit nofile=`)和最大进程数量(`--ulimit nproc=`)。 - RULE #8 - 将文件系统和卷设置为只读 - 使用`--read-only`标志以只读文件系统运行容器。例如`docker run --read-only alpine sh -c 'echo "whatever" > /tmp' ` - 如果容器内的应用程序需要临时保存一些东西,可以将 --read-only 标志和 --tmpfs 结合起来,像这样。`docker run --read-only --tmpfs /tmp alpine sh -c 'echo "whatever" > /tmp/file` - 此外,如果volume仅用于读取,将它们挂载为只读,它可以通过附加`:ro`到`-v`。`docker run -v volume-name:/path/in/container:ro alpine` - RULE #9 - 使用静态分析工具 - 检测具有已知漏洞的容器 - 使用静态分析工具扫描图像。 - 免费 - [Clair](https://github.com/coreos/clair) - [Trivy](https://github.com/knqyf263/trivy) - 检测Kubernetes中的错误配置。 - [kubeaudit](https://github.com/Shopify/kubeaudit) - [kubesec.io](https://kubesec.io/) - [kube-bench](https://github.com/aquasecurity/kube-bench) - 检测Docker中的错误配置。 - [inspec.io](https://www.inspec.io/docs/reference/resources/docker/) - [dev-sec.io](https://dev-sec.io/baselines/docker/) - RULE #10 - 至少将日志设置为INFO级别。 - 在docker-compose中配置日志级别。`docker-compose --log-level info up` - Rule #11 - 在构建时对Docker文件进行过滤 - 在编写Docker文件时,可以通过遵循一些最佳实践来防止许多问题。在构建管道中添加一个安全interter作为步骤,可以很好地避免进一步的麻烦。一些值得检查的问题是 - 确保指定了`USER`指令 - 确保基础镜像有固定版本。 - 确保操作系统包有固定版本。 - 使用`COPY`, 避免 `ADD` - 避免使用`apt/apk`升级。 - 避免在`RUN`指令中使用`curl`。 > HN评论:运行Docker容器的时候加上`--read-only`,迫使你对所有可写数据使用显式可写卷/绑定挂载......这不仅仅是安全方面的好处,你还可以避免整类问题,比如: > > - 最小化 "docker重启"(保留overlayfs的变化)和容器重新创建(将overlayfs恢复到镜像状态)之间的差异。 > > - 容器重新部署时数据意外丢失,因为数据意外地被写入覆盖层fs而不是卷。 > > - `/var/lib/docker`中的磁盘空间意外耗尽,因为数据被写在卷外。 > > - 过多的overlayfs写入引起的性能问题(存储驱动程序和/var/lib/docker不一定是为IO性能设计的)。 ### 其他值得阅读 - ASK HN: 你是怎样写文档的?[Ask HN: How Do You Write Documentation](https://news.ycombinator.com/item?id=26446692) - 架构(Architecture),教程(Tutorials),参考(Reference) - [C4 model](https://c4model.com/): 可视化软件架构。4级表达:系统上下文,容器,组件,代码。 - [分享一次完整的源码阅读过程](https://juejin.cn/post/6922616138169843725#heading-0) - 首先**熟悉官方文档** - 找到核心代码的位置,从入口文件开始,一步步看 - 遇到看不懂的地方可以先打个备注,源码不是一遍就能看懂的