爬下了知乎精华里的所有回答,按赞同数从高到低排名,分享于此。手机看的话可以移步到这里,方便直接用知乎客户端查看,避免浏览器和客户端之间的跳转。
All posts by dotte
Docker:带给现代开发人员的福利
Docker 就像是用于 DevOps 的一把瑞士军刀,这一点已得到充分证明。但 Docker 托管的应用程序容器的用途不仅是在云中部署服务器。Docker 容器还可以在许多常见的开发场景中帮助开发和显著提高生产力。本教程将重点介绍 Docker,了解从开发人员角度讲它有何用途。我将介绍 Docker,解释基本概念和术语,并提供一系列实际的开发示例。
您会看到:
- Docker 可以可简化 Node.js Web 应用程序编码。
- 您可以使用 Docker 在 Apache Tomcat 服务器上快速创建和测试 Java™ Enterprise Edition (Java EE) 应用程序。
- Docker 可以通过 Bottle 框架加快 Python Web 应用程序的编码、测试和开发。
- 您可以通过使用一个 Docker 容器,在几分钟内创建并测试一个具有 NoSQL 数据库后端的完整的三层 Node.js 应用程序。
您可以在单个 Linux 系统上获得所有这些收益,而不会妨碍任何预设的配置。在了解一些示例后,您就能够轻松地运行各种 Docker 容器来提高日常开发工作流中的生产力。
Docker 基础
Docker 是一个容器管理器。容器将应用程序和它的依赖项捆绑在一起。您从一个存储在存储库中的镜像实例化每个容器,在主机操作系统内隔离的虚拟化环境中运行容器。因为虚拟化技术(通常)是轻量型的,所以您可以同时运行多个容器:
您可以使用 Docker 容器管理器执行以下操作:
- 从镜像运行容器
- 检查和操作运行的容器的属性
- 停止运行的容器
- 在运行的容器内执行额外的任务
- 启动或重新启动运行的容器
- 执行其他许多管理任务
容器化的应用程序几乎可以在任何地方运行:桌面 PC 上、服务器上、公共云中,甚至是在一些移动电话上。
Linux 目前是得到最广泛使用和支持的 Docker 平台。Docker 所管理的容器化(轻量型虚拟化)技术在 Linux 平台上最成熟,使用了最新的 Linux 特性,比如 控制组 和 命名空间。
如何运行 Docker
您可以通过 docker
命令行客户端来运行 Docker 容器管理器,该客户端有许多可用的开关和选项。这是运行容器化应用程序镜像(在这个例子中是 MySQL 数据库)的一个简化的命令:
docker run -d mysql:5.5
Docker 项目运行着可公开访问的 Docker Hub。用户可以注册并创建自己的容器化应用程序镜像存储库,然后推送镜像来供大家共同使用。例如,您可以找到 Tomcat 服务器、Node.js 和大多数流行的开源数据库的镜像。Docker Hub 的操作理念与 GitHub 相同,因为应用程序镜像是全球 DevOps 和开发人员社区共享和协同创建的。
举例而言,运行 docker run -d mysql:5.5
命令时,如果还没有将 mysql
(5.5 版)容器化应用程序镜像存储在本地,就会自动从 Docker Hub 拉取(下载)它。
构建容器化应用程序镜像
还可以使用 docker
命令行客户端来构建容器化应用程序镜像。一种方式是从 Dockerfile
构建镜像 — 一个包含如何安装、设置和配置一个应用程序和它的依赖项的说明的文本文件。
使用 docker
命令行客户端构建容器化镜像的另一种方法是以交互方式设计它们。您在一个运行的容器内手动安装和配置一个应用程序和它的依赖项,然后提交容器并保存为镜像。
一个 Docker 镜像包含一些层,每层大体相当于在安装一组应用程序期间写入磁盘的更改。Docker 管理这些层,并帮助在添加或删除这些镜像时高效地存储和重用。举例而言,一个 mysql
镜像中的层可能包含 Linux 操作系统、Perl、共享库、MySQL 安装和一种基本的 MySQL 配置:
从 Dockerfile
构建容器化镜像或设计自定义容器时,通常不会从头开始。相反,您的工作以现有的 Dockerfile
或一个来自 Docker Hub 的镜像为基础。这样,开发人员和操作人员就能够以彼此的工作为基础,协同创建和管理一组有用的镜像。
将镜像发送到镜像存储库(比如 Docker Hub)的命令是 docker push
。下载镜像以供本地使用的命令是 docker pull
。
开始之前
“即使使用 Java、Tomcat、Node.js、Python 和 CouchDB 进行开发,也不需要安装它们中的任何一个。这是在开发工作流中使用 Docker 的美妙之处。”
在开始之前,需要一个安装并运行 Docker 的 Linux 系统。要安装 Docker,可以按照适合您的 Linux 发行版的 安装说明 进行操作。
如果无法直接访问 Linux 系统,可以依靠云。大多数云主机都提供了随时可运行的虚拟服务器或虚拟机,只需几分钟就可以为它们配备 Linux 并(通过 SSH 或基于 Web 的终端)连接到它们。这些主机通常与 Docker 兼容。
本教程中的示例假设您在 Linux 系统上运行 Docker。如果您已经在 Mac OS X 或另一个非 Linux 系统上运行 Docker,您的容器可能会在一个由虚拟机管理程序虚拟化的额外虚拟机(常常为 VirtualBox)内运行。在这种情况下,您需要相应地修改示例中的命令才能继续操作。
检查您的 Docker 版本
运行以下命令来检查您的 Docker 版本:
docker --version
如果您运行 1.8.3 或更高版本,您的系统现在已经设置好。即使使用 Java、Tomcat、Node.js、Python 和 Apache CouchDB 进行开发,也不需要安装或卸载它们中的任何一个。这是在开发工作流中使用 Docker 的美妙之处。
拉取镜像
第一次从 Docker Hub pull
(拉取)一个镜像时,必须将它下载到本地 PC 的存储库。根据您的网络访问速度,下载可能很耗时,但对镜像的后续使用将会很快。
运行以下命令来拉取您将在示例中使用的所有镜像:
docker pull node:0.10.40 docker pull java docker pull tomcat:8 docker pull webratio/ant docker pull python:3.5 docker pull frodenas/couchdb
有关每个镜像的更多信息,请访问 Docker Hub 的 node
、java
、tomcat
、webratio/ant
、python
和 frodenas/couchdb
页面。
现在,在设置完成后,就可以使用 Docker 处理一个 Node.js 应用程序来进行我们的探索了。
快速设置和开发服务器端 JavaScript 代码
代码发行版中的 javascript 目录(参见 下载)包含一个使用 Node.js 编写的网络商店示例应用程序的源代码。该应用程序(最初由 Lauren Schaefer 设计和编写)使用了 Express Web 框架和 Jade Node 模板引擎。(有关这个应用程序的更多信息,请参阅 “Bluemix 基础:将一个示例 Node.js 应用程序部署到云中。”)通过使用 Docker,您可以在您的计算机上使用这个应用程序,无需安装 Node.js 或它的任何依赖项— 或者排除包安装冲突。
主要程序在 app.js 中。CSS 和关联的 JavaScript 文件在 javascript/public/static 中。Jade 模板在 javascript/view 中。
运行以下命令来安装此应用程序的 Node.js 依赖项:
docker run -it --rm --name lllnode -v "$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 npm install
此命令将会启动 Node 容器,将当前应用程序目录挂载到容器中,然后在应用程序上运行 npm install
:
- 基础命令是
docker run � node:0.10.40
,它创建一个容器实例并运行您之前拉取的node:0.10.40
镜像。 -it
开关指定您想要一个前台交互式终端。(备用模式是分离的后台进程,可以使用-d
指定它。)--rm
开关指定执行清理,表示在您退出容器后,Docker 会立即删除它。如果没有指定此开关,该容器会以停止状态持久保存在磁盘上,而且您可以从中断点开始重新启动它。但是,对于忘记删除容器实例的用户而言,重新启动容器是磁盘耗尽的常见来源。如果不使用--rm
,那么任何时候都能运行以下命令来查看您遗留下了多少陈旧的停止容器(数量可能会让您吃惊):docker ps -a
--name lllnode
选项显式命名容器,这对在其他 Docker 命令中引用该容器很有用。如果没有显式命名容器,Docker 会为它分配一个生成的文本名称 — 这个名称通常没什么意义。您还可以通过内部 ID(一个很长、对人类不友好的十六进制字符串)来引用该容器。-v "$PWD":/usr/src/myapp
选项创建一个卷挂载点。将您当前的工作目录 ($PWD
) 挂载为容器内的 /usr/src/myapp。然后可从该容器内访问应用程序的 Node.js 源代码(或您当前的工作目录中可能拥有的其他任何 Node.js 源代码)。-w /usr/src/myapp
选项设置您运行的命令的工作目录。在这个示例中,工作目录更改为挂载的卷。docker run
命令末尾的npm install
命令在工作目录上的容器内运行。最终结果是您通过容器在当前目录上运行npm install
— 而不安装 Node.js 或它的任何前提软件。
在命令输出中,您可以看到 npm
正在运行的所有依赖项:
在安装依赖项后,可以通过容器运行该应用程序。使用此命令(将它键入为一行):
docker run -it --rm --name lllnode --env PORT=8011 --net="host" -v "$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 node app.js
这个命令类似于您之前运行的命令。但请注意,要在容器内运行的命令现在是 node app.js
,它将启动应用程序。
查看 app.js 的内容。您会找到以下行:
var appEnv = cfenv.getAppEnv(); app.listen(appEnv.port, appEnv.bind, function() { console.log("server starting on " + appEnv.url); });
这些行导致 Express Web 服务器在 PORT
环境变量指定的端口上监听。为了在容器中设置此环境变量,您刚运行的 docker
命令使用 --env PORT=8011
选项。
此外,该命令的 --net="host"
选项导致容器使用主机操作系统内部的网络堆栈(仅用于开发用途)。然后该应用程序在主机上的端口 8011 上进行监听。
在浏览器中访问 http://localhost:8011/,您可以在其中看到基于运行的容器的 Lauren’s Lovely Landscapes 印刷品商店:
您随时可以退出容器来修改代码或修复错误,然后再次运行容器— 所有操作在几秒内即可完成,不会让开发环境变得杂乱。
在几秒内从 Node.js 转换为 Java EE
现在您已确信 Docker 只需几秒即可启动并运行一个 Node.js 应用程序,您可能想知道它如何更轻量型地处理一些工作 — 比如 Java EE 开发。很高兴为您解答。
假设您刚刚阅读了我的 “使用 Vaadin 实现全堆栈 Java Web 开发” 教程,并渴望试用我的 Java EE Vaadin 示例。但您没有安装 JDK,而且不想因为花一下午时间笨拙地安装一个 JDK 而将系统弄得一团糟。Docker 可以拯救您!
代码下载 的 java 目录中的 ArticleViewer.war 文件是一个包含来自 Vaadin 教程的多个 Vaadin UI 组件的应用程序。您可以通过 Docker 在 Tomcat 8 服务器上运行 ArticleViewer.war。第一步是从您之前拉取的镜像启动一个 Tomcat 8 容器实例:
docker run -it --rm -p 8888:8080 --name=tomcat_server -v $PWD:/mnt tomcat:8
这个命令现在看起来可能很熟悉。为了更方便引用,容器名为 tomcat_server
。您目前的工作目录在容器内挂载为 /mnt。
-p 8888:8080
选项告诉 Docker 将主机系统的端口 8888 映射到容器的(内部)端口 8080。在 tomcat
镜像的 Dockerfile
中,您可以看到 Tomcat 在容器内的端口 8080 上执行监听。
通过浏览器访问 http://localhost:8888/,您可以在其中看到熟悉的 Tomcat 8 服务器欢迎页面:
请注意您保持容器在交互式模式下运行(通过 -it
开关)。在该模式下,会在标准输出中连续显示日志,以方便开发。
附加到一个运行的 Docker 容器
现在,容器内挂载的目录 /mnt 是您当前的工作目录,ActiveViewer.war 位于该目录中。
将 ActiveViewer.war 从 /mnt 复制到 Tomcat 8 的 webapps 目录,它会在这里自动部署:
docker exec tomcat_server cp /mnt/ArticleViewer.war /usr/local/tomcat/webapps
这一次不需要使用 docker run
命令,因为 tomcat_server
容器已在运行。相反,您连接到运行的容器并运行一个命令。所以您使用了 docker exec
,提供 cp /mnt/ArticleViewer.war /usr/local/tomcat/webapps
命令作为整个命令的最后一部分。
观看 tomcat_server
窗口中的日志,查看来自 ArticleViewer
应用程序部署的日志轨迹。
现在,在浏览器中访问应用程序的 URL(http://localhost:8888/ArticleViewer/)来打开正在运行的应用程序。单击左侧列表中的一篇文章,在右侧查看文章内容:
在继续后面的操作之前,停下来思考片刻。您没有在系统上下载或安装 JDK 或 Tomcat 8。只需几秒即可在一个功能全面的 Tomcat 8 服务器上运行 Vaadin 应用程序的代码 — 这得益于 Docker。
为 Tomcat 8 开发和构建 Java Web 应用程序
您刚才已经看到,可以使用 Docker 轻松地部署用于测试的 Web 应用程序。也可以通过 Docker 同样轻松地从 Java 源代码编译和构建 Web 应用程序 — 同上面一样,无需让您的开发系统变得一团糟或花很长时间安装前提软件。
将目录更改为 代码发行版 中的 java/LaurenLandscapesJava。这个目录中包含您在 Node.js 示例中看到的 Lauren’s Lovely Landscapes 应用程序的一个 Java 版本。(如果想了解该代码的更详细描述,请阅读 “Bluemix 基础:将一个示例 Java 应用程序部署到云中”。)
build.xml 文件是一个标准的 Apache Ant 构建文件,它包含编译代码和构建 WAR 文件的指令。通过使用 webratio Apache Ant 镜像,可以在更改代码后(或其他任何时刻)快速编译和构建 WAR:
docker run -it --rm -v "$PWD":/mnt webratio/ant bash -c 'cd /mnt; ant'
您现在已经熟悉了这个 docker run
命令中的所有内容。该命令在作为 /mnt 挂载在容器内的当前工作目录内运行 Ant 构建工具。Ant 编译 src 子目录中的所有 Java 源代码,然后构建并绑定 WAR 文件,将它作为 lauren.war 放在 dist 子目录中。
将 lauren.war 从 java/LaurenLandscapesJava/dist 目录复制到 java 目录:
cp dist/lauren.war ..
您可以使用此命令将 lauren.war 应用程序部署到 Tomcat 8:
docker exec tomcat_server cp /mnt/lauren.war /usr/local/tomcat/webapps
此命令附加到运行的 tomcat_server
容器,并将 lauren.war 文件复制到 Tomcat 8 的 webapps 子目录中用于自动部署。
现在,在浏览器中访问 http://localhost:8888/lauren/,您可以在其中看到在您的 Docker 化 Tomcat 8 上运行的 Lauren’s Lovely Landscape 的 Java 版本。
从 Java 切换到 Python
假设作为一位多语言开发人员的您希望暂时不执行 Java 编码,探索 Python Bottle Web Framework 提供的可能性。为了帮助您快速探索 Python Web 应用程序开发,避免麻烦的安装和依赖项带来的痛苦,Docker 再次挽救了您。
更改到代码发行版的 python/Laurens.Lovely.Landscapes 目录。该目录中包含 Lauren’s Lovely Landscape 应用程序的 Python 版本 — 为 Bottle Web 框架而编写。模板(.tpl 文件)位于 views 子目录中。(有关该代码的更多信息,请查阅 “Bluemix 和 DevOps Services 简介,第 1 部分:部署和更新一个简单应用程序。”)还可以在关联的 Bluemix DevOps Services 存储库 中找到此代码的一个版本。
运行这个 Python 应用程序 — 而不将 Python 安装在您的系统上— 通过以下 Docker 命令(将它们键入为一行):
docker run -it --rm --name lllpython -p 8000:8000 -v "$PWD":/usr/src/myapp -w /usr/src/myapp python:3.5 python wsgi.py
现在在浏览器中访问 http://localhost:8000/,您可以在其中看到正在运行的 Lauren’s Lovely Landscapes 应用程序的 Python 版本。
在 Python 中开发时,您可以更改代码并重新运行之前的命令来进行测试。运行 Docker 容器就像运行安装在本地的开发工具一样快。
添加和启动一个分离的数据库
大多数现代 Web 应用程序都涉及 3 层:浏览器作为客户端;一个中间层应用服务器,比如 Express、Tomcat 8 或 Bottle;以及一个后端数据库。通过使用 Docker,您可以快速添加一个数据库,无需将它安装在您的开发系统上。
在这个最后的示例中,您将一个 Apache CouchDB 数据库服务器添加到您的开发环境中。您可以使用 CouchDB API(它与 IBM Cloudant NoSQL 数据库完全兼容)在本地测试 CouchDB 或 Cloudant 代码。
更改到源代码发行版中的数据库目录。这个目录中包含 Lauren’s Lovely Landscapes 应用程序的高级 Node.js 版本。此版本从 CouchDB(或 Cloudant)抓取印刷品商店的库存信息。该网络商店依据可用印刷品的库存来动态更改外观。(您可以在 “Bluemix 基础:将 Cloudant NoSQL 数据库添加到您的 Node.js 应用程序中” 中找到该代码的更多信息。)
要启动 Apache CouchDB 的一个实例,可以使用这个 Docker 命令(将它键入为一行):
docker run -d --name couchdb -p 5984:5984 -e COUCHDB_USERNAME=user -e COUCHDB_PASSWORD=abc123 -e COUCHDB_DBNAME=prints -v $PWD/data:/data frodenas/couchdb
该命令使用 COUCHDB_USERNAME
、COUCHDB_PASSWORD
和 COUCHDB_DBNAME
环境变量来配置实例,以便与代码中使用的值匹配。当前的工作目录在容器内挂载为 /data。CouchDB 将数据写入此目录中,使您可以重新启动容器而不丢失数据。
请注意,在这个示例中,您使用了 -d
选项运行该容器,而不是使用 -it --rm
选项。-d
选项启动分离的 CouchDB 实例。您可以使用 docker ps
命令查看所有正在运行的分离的 docket 容器。
接下来安装应用程序的 Node.js 依赖项:
docker run -it --rm --name llldepends -v "$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 npm install
Apache CouchDB 实例还没有任何数据。使用以下命令(将它键入为一行)来运行 dataseeder.js 代码,该代码在 Apache CouchDB 实例中创建一个文档,以便在商店中填充库存:
docker run -it --rm --name dataseeder --net="host" -v "$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 node dataseeder.js
在端口 8011 上运行 lllnode
应用程序:
docker run -it --rm --name lllnode --env PORT=8011 --net="host" -v "$PWD":/usr/src/myapp -w /usr/src/myapp node:0.10.40 node app.js
在浏览器中访问 http://localhost:8011/ 来打开 Lauren’s Lovely Landscapes 商店:
您可以看到澳大利亚的印刷品已脱销。该产品类别突出显示为红色,无法选中。
为了模拟对澳大利亚印刷品补货的过程,您将访问 Apache CouchDB 文档并直接修改库存水平。
Apache CouchDB 提供了一个简单的 GUI(名为 Futon)来访问存储的文档。在浏览器中访问 http://127.0.0.1:5984/_utils/ 来打开 Futon GUI:
在 Futon 中,选择 prints
。打开文档并展开编号为 3 的库存项。双击澳大利亚印刷品以打开文档进行编辑。将 quan
字段从 0
更改到 3
。单击右侧的小型绿色勾号图标,然后单击左上角的 Save Document:
数据库中的数量更新后,在浏览器中重新加载页面 http://localhost:8011/。您可以看到商店现在已屯满货。澳大利亚印刷品不再标记为红色,而且可以选中。
使用 3 层 Web 应用程序时,Docker 简化了中间层应用程序编码的开发工作流,方便了即时本地部署后端数据库来实现测试。
结束语
在这个竞争激烈的时代,您承受不起没有将 Docker 整合进开发工作流中的生活。通过消除反复安装和卸载相互依赖的复杂开发人员包和工具的需求,Docker 可以缩短您的开发时间和探索时间。利用 Docker 来提高您的多语言开发智商,显著提高您的开发生产力。
下载
描述 | 名字 | 大小 |
---|---|---|
代码示例 | code_docker.zip | 22MB |
参考资料
- Docker:在项目网站上了解 Docker 的更多信息。
- Docker Hub:从社区 Docker 镜像存储库拉取镜像或向其贡献您自己的镜像。
- Bottle:探索一个用于 Python 的轻量型 Web 框架 Bottle。
- IBM Containers for Bluemix:了解如何在 IBM Bluemix 上托管的云环境中运行 Docker 容器。
- “用于 Linux on Power Systems 的 Docker”:了解将 Docker 二进制文件安装在 Linux on Power 系统上的步骤。
- developerWorks 上的 Web 开发专区 提供了大量资源。
- 随时关注专注于各种 IBM 产品和 IT 行业主题的开发人员技术活动和网络广播。
- 在 Twitter 上关注 developerWorks。
from:http://www.ibm.com/developerworks/cn/web/wa-docker-polyglot-programmers/index.html?ca=drs-
知道创宇研发技能表v2.2
-
2014/3/9 发布
by @知道创宇(www.knownsec.com) @余弦 & 行之
知道创宇是国内Geek十足且普遍被认为特别有前途的互联网安全公司,
动态请关注微信公众号:Lazy-Thought。
-
说明
-
本技能表为知道创宇研发工程师必备技能
-
聪明的人会根据每个tip自驱动扩展
-
不聪明的,坐等别人手把手的人请绕行,不仅不适合知道创宇,也不适合任何有Geek精神的公司
- 附件标志是我们推荐的附加资源,感谢资源提供者
-
-
通用技能
-
公司与个人
-
公司是盈利性组织
-
个人和公司必须双赢
-
工作
-
在认同公司理念且能够给公司创造足够价值的基础上,为个人发展而工作
-
-
-
沟通、反馈、责任
-
一个无沟通能力的人,要么是天才,要么是不可爱的人
-
反馈要及时
-
避免出问题不反馈,影响进度
-
方式
-
正式的:邮件
-
临时的:QQ等即时通信
-
礼貌的:给个电话、短信
-
-
-
工作有大小,责任心无大小
-
周报的透明
-
意义:大家互相了解工作与心得,有利于自己的判断与成长
-
不是单纯的给领导汇报工作
-
-
-
任务四象限,决定优先级
-
紧急重要
-
重要不紧急
-
紧急不重要
-
不紧急不重要
-
-
新事物的敏感性
-
保持好奇心
-
不要局限在自己的圈子,适当跨界吸收灵感
-
订阅国内外优秀博客/资源,鲜果RSS阅读不错
-
英文很重要
-
-
选择性参与一些必要的会议,听必要的主题,讨论必要的话题
-
-
成长
-
对知识的渴望程度决定了前进动力的大小
- BT常说:「做人一定要狂热!」
- 我说:「一定得贪婪!」
-
不要矫情,不要浮夸!
-
和比你厉害的人在一起,和一流的人工作
-
指点往往是精华
- 杜绝笨蛋爆炸
-
二流的人招进来的人不太可能是一流的
-
-
-
思考
-
批判性思考
-
换位思考
-
- 提问的智慧
-
遇到问题先独立思考,尽最大努力后再提问
-
http://www.wapm.cn/smart-questions/smart-questions-zh.html
-
- 小事心态
-
越基础的事越关键,需要越细心
-
不要一味盲目追求「高级感」,而忽视「小事」/「简单事」/「基础事」
-
基础不牢、地动山摇
-
小事做不好,别提大事
-
- 任务拆分
- 方法论
-
完成一件事有好几条途径,优秀的人的途径最短
-
任务拆分很容易得出做事的方法论
-
好的「方法论」会让你具备更强的「创造力」!
- 时刻问自己:「是否具备创造力?」
-
-
-
牛人姿态
-
即使现在不是牛人,也得具备这样的姿态
-
这种感觉只能意会
-
没有一定扎实内功与远见的人很少有这样的姿态
-
- 完成的定义
-
比如写个POC
-
1. 搞懂了目标Web应用漏洞的原理
-
2. 熟练运用Python各相关模块与机制
-
3. 熟练了解了HTTP协议
-
HTTP请求
-
HTTP响应
-
-
4. 代码写得够规范,让人看起来就是爽
-
5. 程序经过足够的测试
-
黑测试
-
白测试
-
-
6. 及时反馈进度
-
我遇到困难了
-
我搞定了
-
-
7. 更新相关文档,沉淀
-
-
- 熟练的定义
-
比如熟练SQL注入
-
SQL语句这门“语言”能脱离文档顺手写出
-
主流数据库的SQL特有函数、存储过程、机制我都了如指掌
-
MySQL
-
MSSQL
-
Oracel
-
Postgre
-
Access
-
SQLite
-
…
-
-
牛逼的工具我不仅用的顺其自然,源码还读过几遍,我能修改
-
sqlmap
-
…
-
-
我具备创造性,而不仅仅是跟在大牛身后
-
研究出了几个不错的技巧
-
发了几篇不错的Paper
-
对外会议/沙龙等进行了几次分享
-
写出了自己的相关工具,爽
-
-
我实战了N回,遇到了很多奇葩环境,我有足够的信心绕过
-
以上这些之后,这才叫熟练!其他同理
-
-
-
好书推荐
-
推荐理由
-
打通任督二脉的书,怎能不看?
-
任何科学研究最终必须至少到哲学层面,触碰到上帝的脚
-
具体技术类书籍请见“专业技能”相关部分
-
-
鸡汤类
-
黑客与画家
-
印象深刻:设计者的品味
-
好设计是简单的设计
-
抓住本质
-
-
好设计是永不过时的设计
-
如果解决方法是丑陋的,那就肯定还有更好的解决方法,只是还没有发现而已
-
-
好设计是解决主要问题的设计
-
好设计是启发性的设计
-
好设计通常是有点趣味性的设计
-
好设计是艰苦的设计
-
好设计是看似容易的设计
-
好设计是对称的设计
-
好设计是模仿大自然的设计
-
好设计是一种再设计
-
好设计是能够复制的设计
-
好设计往往是奇特的设计
-
好设计是成批出现的
-
好设计常常是大胆的设计
-
-
-
浪潮之巅
-
感受IT帝国的崛起与没落,我们现在站在又一个互联网浪潮之巅
-
-
-
洁癖类
-
重构
-
代码整洁之道
-
代码大全2
-
数学之美
-
-
敏捷类
-
Rework中文版
-
37signals团队的敏捷经验
-
-
高效程序员的45个习惯
-
-
产品类
-
人人都是产品经理
-
结网
-
-
神书
-
自私的基因
-
失控
-
万物由来
-
-
…
-
-
-
专业技能
- 原则
-
至少完整看完与练习好一本书
-
至少过一遍官方文档
-
- 基础必备
-
HTTP抓包与调试
-
Firefox插件
-
Firebug
-
抓包与各种调试
-
-
Tamper Data
-
拦截修改
-
-
Live Http Header
-
重放功能
-
-
Hackbar
-
编码解码/POST提交
-
-
Modify Headers
-
修改头部
-
-
-
Fiddler
-
浏览器代理神器
-
拦截请求或响应
-
抓包
-
重放
-
模拟请求
-
编码解码
-
第三方扩展
-
Watcher
-
Web前端安全的自动审计工具
-
-
-
-
Wireshark
-
各种强大的过滤器语法
-
-
Tcpdump
-
命令行的类Wireshark抓包神器
-
-
Python
-
urllib2
-
打开请求响应调试
-
编辑urllib2的do_open里的h.set_debuglevel
-
改为h.set_debuglevel(1),这时可以清晰看到请求响应数据,包括https
-
-
-
-
-
什么是跳转
-
服务端跳转
-
302
-
<?php header(“Location: 3.php”); ?>
-
-
301
-
<?php header(“HTTP/1.1 301 Moved Permanently”); header(“Location: 2.php”); ?>
-
-
u=urllib2.urlopen(url)后,u.url能得到服务端跳转后的地址
-
urllib2自己的特性
-
所谓的会跟进去
-
-
-
客户端跳转
-
<meta http-equiv=”refresh” content=”0; url=http://www.evilcos.me” />
-
htmlparse解析就行了
-
-
location.href=”http://evilcos.me”;
-
正则(弱),js引擎(王道)
-
-
-
-
Python编码规范
-
入门书
-
Python核心编程2
-
第4章 Python对象
-
完整熟练
-
-
6.8 Unicode
-
完整熟练
-
-
8.11 迭代器和iter()函数
-
完整熟练
-
-
第9章 文件的输入和输出
-
完整熟练
-
-
第10章 错误和异常
-
完整熟练
-
-
第11章 函数和函数式编程
-
完整熟练
-
-
第12章 模块
-
完整熟练
-
-
第14章 执行环境
-
完整熟练
-
-
第15章 正则表达式
- 完整熟练
-
第18章 多线程编程
-
完整熟练
-
-
20.2 使用Python进行Web应用:创建一个简单的Web客户端
-
完整熟练
-
-
-
-
Office能力
-
Word文档编写,看去要专业,尤其对外的
-
Excel里面大量的统计、图表功能,需要善于使用
-
PPT演讲、培训等必备,如何做好PPT?百度一下……
- 进一步
-
yEd
-
Visio
-
FreeMind
-
本技能表就是这个制作
-
-
-
-
熟练VIM
-
算法
-
快排
-
二分
-
-
正则表达式
-
调试工具
- Kodos
- RegexBuddy
-
支持多种语言
-
支持调试优化
-
-
正则图解
-
-
-
研发能力
-
瀑布模型
-
需求->需求分析->设计->开发->测试->上线->运维/运营
-
- 需求分析能力
-
给你一个需求,如何给出一个优美的执行思路——方法论
-
这个能力非常非常非常的关键
-
-
调试能力
-
只要定位出,就没有解决不了的Bugs
-
肉眼看到的都是假象
-
一定要专业的工具与经验配合
-
-
Bugs在哪出现,最终就在哪进行真实模拟调试
-
缩小范围
-
构建自己的测试样例
-
排除网络复杂未知情况
-
-
关联模块一个个排除
-
Python单步调试
-
import pdb;pdb.set_trace()
-
在需要单步调试的地方加上面这句,运行程序后中断在此,然后h查看指令进行一步步细细调试
-
-
粗暴调试:print
-
-
-
敏捷思想
-
快速迭代
-
任务拆细
-
v1原则:定义好v1的目标,快速完成v1为优先
-
习惯Wiki记录,利于沉淀与分享
-
-
-
翻墙
-
SSH隧道
-
本地转发
-
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
-
-
远程转发
-
反弹
-
ssh -R <local port>:<remote host>:<remote port> <SSH hostname>
-
-
动态转发
-
ssh -D <local port> <SSH Server>
-
-
-
Web安全
-
Web服务组件
-
钟馗之眼
-
网络空间搜索引擎
-
大数据,懂的人懂,不懂的人不懂
-
-
组件具有影响面,越底层的组件影响面可能越大
-
安全维度
-
漏洞
-
风险
-
事件
-
-
Web安全标准
-
OWASP
-
WASC
-
我们内部Wiki
-
-
实战环境
-
XSS
-
ks-xsslab_open(内部虚拟机)
-
可以搞通
-
XSS
-
CSRF
-
ClickJacking
-
-
-
-
-
SQL
-
-
SQLI-LABS is a platform to learn SQLI
-
-
-
500多个WSL靶场
-
渗透虚拟机/BT5/Kali
-
海量各类型黑客工具
-
-
-
书
-
黑客攻防技术宝典(Web实战篇)
-
白帽子讲Web安全
-
Web前端黑客技术揭秘
-
我和xisigr自己出品
-
-
SQL注入攻击与防御
-
-
papers
-
BlackHat/Defcon/国内各安全沙龙等Papers需要持续跟进
-
-
研发清单
-
编码环境
-
pip
-
Vagrant
-
tmux/screen
-
vim
-
zsh + oh-my-zsh
-
Python2.7
-
>Django1.4
-
web.py
-
node.js
-
Ubuntu/Gentoo/Centos
-
ipython
-
版本控制
-
git/svn
-
gitlab
-
-
Nginx+uWSGI
-
-
Python
-
官方手册
-
至少过一遍,这都没过一遍,视野会局限
-
行之说:「我没看过Python的书,却熟读官方手册……」
-
-
-
Linux
-
书
-
-
前端
-
书
-
JavaScript DOM编程艺术
-
-
了解DOM
-
这同样是搞好前端安全的必要基础
-
-
库
-
jQuery
-
优秀的插件应该体验一遍,并做些尝试
-
官方文档得过一遍
-
-
ECharts
-
来自百度
-
-
Google API
-
ZoomEye Map组件
-
ZoomEye团队自己基于开源的打造
-
-
AngularJS
-
Google出品的颠覆性前端框架
-
-
Bootstrap
-
应该使用一遍
-
-
-
-
爬虫进阶
-
代理池
-
爬虫「稳定」需要
-
-
网络请求
-
wget/curl
-
urllib2/httplib2/requests
- scrapy
-
-
验证码破解
-
pytesser
-
-
-
调度
-
crontab是最原生的定时调度
-
基于redis实现的分布式调度
-
基于rpyc实现的分布式调度
-
celery/gearman等调度框架
-
-
并发
-
线程池
-
进程内优美的并发方案
-
-
协程
-
进程内另一种优美的并发方案
-
-
多进程
-
os.fork
- multiprocessing
-
-
-
数据结构
-
JSON
-
cPickle
-
protobuf
-
-
数据库
-
MySQL
-
MongoDB
-
Cassandra
-
Hadoop体系
-
Redis
-
Sqlite
-
bsddb
-
-
DevOps
-
SSH证书
-
Fabric
-
SaltStack
-
puppet
-
pssh/dsh
-
-
调试
-
pdb
-
logging
-
Sentry
-
strace/ltrace
-
lsof
-
性能
-
Python内
-
timeit
-
cProfile
-
-
Python外
-
top/htop/free/iostat/vmstat/ifconfig/iftop…
-
-
-
-
算法
-
分词
-
贝叶斯
-
神经元
-
遗传算法
-
聚类/分类
-
…
-
-
持续集成
-
自测试
-
nose
-
-
Jenkins
-
-
协作
-
类似Trello的在线协同平台
-
微信
-
立会
-
-
-
设计思想
-
人人都是架构师:具备架构思想是一件多酷的事
-
实战出真知
-
如何设计
-
松耦合、紧内聚
-
单元与单元属性
-
生产者与消费者
-
结构
-
队列
-
LRU
-
-
分布式
-
存储
-
计算
-
-
资源考虑
-
CPU
-
内存
-
带宽
-
-
粗暴美学/暴力美学
-
大数据,先考虑run it,然后才能知道规律在哪
-
「run it优先」能快速打通整体,洞察问题
-
「run it优先」能摆脱细节(繁枝末节)的束缚
-
「run it优先」能快速迭代出伟大的v1
-
-
一个字总结
-
美
-
-
-
优质资源
-
牛人1,2,3
-
1研究:研究东西,有足够洞察力,研究水准不错
-
2研发:hack idea自己有魄力实现,不懂研发的黑客如同不会游泳的海盗
-
3工程:研发出来的需要实战、需要工程化,否则只是玩具,而不能成为真的武器
-
-
from:http://blog.knownsec.com/Knownsec_RD_Checklist/v2.2.html
refer:Java后端工程师技能树
Open Sourcing a Python Project the Right Way
Most Python developers have written at least one tool, script, library or framework that others would find useful. My goal in this article is to make the process of open-sourcing existing Python code as clear and painless as possible. And I don’t simply mean, “create GitHub repo, git push
, post on Reddit, and call it a day.” By the end of this article, you’ll be able to take an existing code base and transform it into an open source project that encourages both use and contribution.
While every project is different, there are some parts of the process of open-sourcing existing code that are common to all Python projects. In the vein of another popular series I’ve written, “Starting a Django Project The Right Way,” I’ll outline the steps I’ve found to be necessary when open-sourcing a Python project.
数据爬取和数据分析案例
数据爬取:
数据爬取工具或框架:
使用Wget下载整个网站
you-get(Releases · soimort/you-get · GitHub,这里面有各种发布版本)。
刚开始写爬虫用的是urllib2,后来知道了requests,惊为天人。
刚开始解析网页用的是re,后来知道了BeautifulSoup,解析页面不能再轻松。
再后来看别人的爬虫,知道了scrapy,被这个框架惊艳到了。
之后遇到了一些有验证码的网站,于是知道了PIL。但后来知道了opencv,pybrain。当在爬虫中用上人工神经网络识别出验证码,兴奋得守在爬虫旁边看他爬完全站。
再后来知道了threading,知道了celery。(知乎)
数据分析案例:
京东百万记录分析中国人罩杯分布 | 上( 150万数据 密码:guvy)
如何通过房屋租售比来判断房产的价值或泡沫?
你用 Python 做过什么有趣的数据挖掘/分析项目
个人博客: