一份2021年03月14日的信息流提炼
每天学点机器学习
Python编程和数值方法:工程师和科学家指南
原文:Python Programming and Numerical Methods: A Guide for Engineers and Scientists
第25章 介绍机器学习
机器学习,顾名思义,就是试图让计算机具备学习能力,让计算机能够从数据或者过去的经验中学习。机器学习算法在我们生活中的很多地方都有应用,你可能没有意识到。例如,你智能手机上的语音助手,ATM机识别存款支票,你的电子邮件提供商自动将好的邮件和垃圾邮件分开,自动驾驶汽车在没有司机的情况下行驶,在一些安检处进行面部识别,还有很多例子
机器学习的类型

基本两个大类,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
-
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 - 设置一个用户
-
配置容器使用无权用户是防止特权升级攻击的最佳方式。
-
# 方法1:使用 -u option,例如: docker run -u 4000 alpine # 方法2:在Dockerfile中添加用户,例如: FROM alpine RUN groupadd -r myuser && useradd -r -g myuser myuser <HERE DO WHAT YOU HAVE TO DO AS A ROOT USER LIKE INSTALLING PACKAGES ETC.> USER myuser
-
-
RULE #3 - 限制能力(只授予容器所需的特定能力)。
- Linux内核能力是一组可以被特权者使用的权限。Docker,默认情况下,只运行一个能力子集。记住不要使用
--privileged标志运行容器--这将会把所有的Linux内核功能添加到容器中。例如docker run --cap-drop all --cap-add CHOWN alpine
- Linux内核能力是一组可以被特权者使用的权限。Docker,默认情况下,只运行一个能力子集。记住不要使用
-
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:<number_of_restarts>)、最大文件描述符数量(--ulimit nofile=<number>)和最大进程数量(--ulimit nproc=<number>)。
- 避免DoS攻击的最好方法是限制资源。你可以限制内存、CPU、最大重启次数(
-
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 - 使用静态分析工具
- 检测具有已知漏洞的容器 - 使用静态分析工具扫描图像。
- 免费
- 检测Kubernetes中的错误配置。
- 检测Docker中的错误配置。
-
RULE #10 - 至少将日志设置为INFO级别。
- 在docker-compose中配置日志级别。
docker-compose --log-level info up
- 在docker-compose中配置日志级别。
-
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
- 架构(Architecture),教程(Tutorials),参考(Reference)
- C4 model: 可视化软件架构。4级表达:系统上下文,容器,组件,代码。
- 分享一次完整的源码阅读过程
- 首先熟悉官方文档
- 找到核心代码的位置,从入口文件开始,一步步看
- 遇到看不懂的地方可以先打个备注,源码不是一遍就能看懂的