海康服务器到处的bin配置文件怎么按需求修改求大神f1

5514人阅读
& & & Windows上编译ffmpeg完整过程,包括编译x264、SDL、faac。在Windows上编译ffmpeg需要用MinGW+msys,本专题用于记录编译过程中遇到的各种问题及解决方法,:
一、下载准备
准备编译过程所需的工具和源码。
(1). MinGW&& MSYS&
(2).&Yasm&
(4).&X264&
(5).&FFmpeg&
二、MinGW+MSYS安装
最新版本MinGW安装工具mingw-get-setup.exe内部已经集成了msys工具:
配置MSYS支持GCC编译:
开始安装:
安装MSYS-1.0.11.exe(我们在后面的安装过程中发现,上述安装的msys gcc版本比较低,编译SDL的时候会出错),在安装过程中会让配置已安装的MinGW路径,如:C:/MinGW:
三、yasm支持
从步骤一中将下载来的yasm可执行文件,改名为yasm.exe,放在Windows\System32中。
四、编译SDL
解压下载的SDL源码包,例如放到D:\ffmpeg1.2\SDL-1.12.15目录,msys进入SDL目录,依次执行:
./configure -–prefix=/usr/local/SDL
make install
五、编译x264
解压下载的x264源码包,例如放到D:\ffmpeg1.2\x264目录,msys进入x264目录,依次执行:
./configure
--enable-shared –-disable-asm -–prefix=/usr/local/x264
make install
六、重新部署环境
地址是:,在这个页面上点击Download下载那个zip文件。下载完成后,直接安装,我使用的是默认路径。(这个文件比较大,是MinGW+MSYS的合并安装包,下载并安装后,把C:\msys\1.0\bin文件夹复制出来,备份保存);
默认路径为:C:\minGW和C:\msys\1.0
2、配置环境变量
右击“我的电脑”-》属性-》高级-》环境变量
按如图操作,在PATH的编辑框最后加上C:\MinGW\bin
注意用“;”与前面的隔开
三、下载MSYS
下载后,还是默认安装,安装前不用卸载前面第一步中安装的版本,也就是把第一步的版本给覆盖掉;
在安装结束的时候会提出DOS提示窗口:
最后一句为:
Do you wish to continue with the post install? [yn ]
输入n,结束安装。
四、将在第一步中提取出来的bin文件夹内容,复制到C:\msys\1.0\bin文件夹下覆盖现在的文件;
七、编译faac
解压下载的faac源码包,例如放到D:\ffmpeg1.2\faac目录,msys进入faac目录,依次执行:
./bootstrap
./configure --enable-shared –-disable-static -–prefix=/usr/local/faac
make install
八、部署MinGW-w64
从http://jaist.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/installer/mingw-w64-install.exe 下载MinGW-w64,安装在C:/mingw-w64/,然后修改c:\msys\etc\fstab文件中路径,将MinGW路径配置成:C:/mingw-w64/mingw32。
九、编译ffmpeg
解压下载的ffmpeg0.9.0源码包,例如放到D:\ffmpeg1.2\ffmpeg0.9.0目录,msys进入ffmpeg目录,依次执行:
./configure --enable-shared --disable-static --enable-memalign-hack --enable-libx264 --enable-gpl &--enable-nonfree --enable-libfaac --prefix=/usr/local/ffmpeg9.0
make install
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1201220次
积分:11638
积分:11638
排名:第1508名
原创:169篇
转载:163篇
评论:379条
babosa(a)easydarwin.org
(3)(32)(23)(6)(27)(23)(15)(14)(6)(6)(11)(6)(1)(1)(8)(16)(13)(8)(12)(6)(7)(12)(6)(6)(3)(2)(2)(1)(5)(3)(2)(3)(1)(3)(5)(1)(2)(2)(2)(4)(2)(1)(1)(3)(1)(1)(1)(1)(3)(2)(3)(1)(2)(1)网站已改版,请使用新地址访问:
HKVideoRec 接收自定义编码的海康威视硬盘录像机视频流 Capture 捕捉/采集 238万源代码下载- www.pudn.com
&文件名称: HKVideoRec
& & & & &&]
&&所属分类:
&&开发工具: Delphi
&&文件大小: 236 KB
&&上传时间:
&&下载次数: 20
&&提 供 者:
&详细说明:接收自定义编码的海康威视硬盘录像机视频流-Receive custom coding Hikvision DVR video streaming
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&HKVideoRec\Bin\Config.ini&&..........\...\HKVideoRec.exe&&..........\DMUnit.dcu&&..........\DMUnit.ddp&&..........\DMUnit.dfm&&..........\DMUnit.pas&&..........\DMUnit.~ddp&&..........\DMUnit.~dfm&&..........\DMUnit.~pas&&..........\HKVideoRec.cfg&&..........\HKVideoRec.dof&&..........\HKVideoRec.dpr&&..........\HKVideoRec.res&&..........\HKVideoRec.~dpr&&..........\MainUnit.dcu&&..........\MainUnit.ddp&&..........\MainUnit.dfm&&..........\MainUnit.pas&&..........\MainUnit.~ddp&&..........\MainUnit.~dfm&&..........\MainUnit.~pas&&..........\plaympeg4.dcu&&..........\plaympeg4.pas&&..........\plaympeg4.~pas&&..........\Bin&&HKVideoRec
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站238万海量源码库中尽情搜索:
&[] - 基于emgu的人脸识别程序,在实际使用中很好用,能够识别出人脸的位置,并用正方形标注!
&[] - 详细描述java设计模式的书籍。值得java程序员一读,可以对设计模式有一个清晰的认识。
&[] - 采用delphi实现海康客户端,可以通过海康服务器使用。
&[] - delphi 数字硬盘录像监控系统,包括了数字地图编辑,云台控制,录像回放等功能,只要安装好采集卡的驱动程序,就可以使用了。
&[] - 本程序是参考海康卫视提供的SDK开发包,在视频的显示。
支持DS-40xxHC系列板卡。
全部源码压缩包
&[] - 连接到海康威视硬盘录像机并且在窗口中显示图像
&[] - 海康威视硬盘录像机视频TCP发送端,采用SOCKET&figure&&img src=&https://pic3.zhimg.com/v2-4bed4ad08e2_b.jpg& data-rawwidth=&1200& data-rawheight=&800& class=&origin_image zh-lightbox-thumb& width=&1200& data-original=&https://pic3.zhimg.com/v2-4bed4ad08e2_r.jpg&&&/figure&&blockquote&&p&全文共 6953 字,读完需 8 分钟,速读需 2 分钟。翻译自:RingStack 的文章 &a href=&https://link.zhihu.com/?target=https%3A//blog.risingstack.com/10-best-practices-for-writing-node-js-rest-apis/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&10 Best Practices for Writing Node.js REST APIs | @RisingStack&/a&,英文好的同学可以直接阅读原文,译文较原文有删节,。&/p&&/blockquote&&p&Node.js 除了用来编写 WEB 应用之外,还可以用来编写 API 服务,我们在本文中会介绍编写 Node.js Rest API 的最佳实践,包括如何命名路由、进行认证和测试等话题,内容摘要如下:&/p&&blockquote&&ol&&li&正确使用 HTTP Method 和路由&/li&&li&正确的使用 HTTP 状态码&/li&&li&使用 HTTP Header 来发送元数据&/li&&li&为 REST API 挑选合适的框架&/li&&li&要对 API 进行黑盒测试&/li&&li&使用基于 JWT 的无状态的认证机制&/li&&li&学会使用条件请求机制&/li&&li&拥抱接口调用频率限制(Rate-Limiting)&/li&&li&编写良好的 API 文档&/li&&li&对 API 技术演化保持关注&/li&&/ol&&/blockquote&&h2&1. 正确使用 HTTP Method 和路由&/h2&&p&试想你正要构建一个 API 用来创建、更新、获取、删除用户,对于这些操作,HTTP 规范里面已经有了现成的操作:POST、PUT、GET、DELETE,建议直接使用他们来描述接口的行为。&/p&&p&至于路由的命名,应该使用名词或名词性短语来作为资源标识符,比如上文提到的用户管理的例子,路由就应该长这样:&/p&&ul&&li&POST /users 或者 PUT /users/:id 用来创建新用户;&/li&&li&GET /users 用来获取用户列表;&/li&&li&GET /users/:id 用来获取单个用户;&/li&&li&PATCH /users/:id 用来更新用户信息;&/li&&li&DELETE /users/:id 用来删除用户;&/li&&/ul&&h2&2. 正确的使用 HTTP 状态码&/h2&&p&如果服务器端在请求处理的过程中出错了,你必须设置正确的响应状态码,具体如下:&/p&&ul&&li&2xx,表示一切正常;&/li&&li&3xx,表示资源位置已经更改;&/li&&li&4xx,表示因为客户端错误而导致请求无法被处理,比如参数校验没通过;&/li&&li&5xx,表示因为服务器错误导致请求无法被处理,比如服务端抛了异常;&/li&&/ul&&p&如果你使用 express,设置状态码非常简单:res.status(500).send({ error: 'Internal server error happend' }),如果使用了 restify,也是类似的:res.status(201)。&/p&&p&如果想看完整的 HTTP 状态码,&a href=&https://link.zhihu.com/?target=https%3A//en.wikipedia.org/wiki/List_of_HTTP_status_codes& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&点击这里&/a&。&/p&&h2&3. 使用 HTTP Header 来发送元数据&/h2&&p&如果想要发送关于响应体数据的元数据,可以使用 Header ,Header 可以包含的常见元数据包括如下几类:&/p&&ul&&li&分页信息;&/li&&li&频率限制信息;&/li&&li&认证信息;&/li&&/ul&&p&如果你需要在 Header 中发送自定义的元数据,最好的做法是在 Header 名称前面加 X,例如,需要发送 CSRF Token 的时候,实际的 Header 应该命名为:X-CSRF-Token,然而,这种 Header 在 &a href=&https://link.zhihu.com/?target=https%3A//tools.ietf.org/html/rfc6648& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&RFC 6648&/a& 中已经被废弃了。API 在设置自定义 Header 的时候还要尽可能避免命名冲突,比如为了达到这个目的OpenStack 为所有 API 的自定义 Header 都加上了 OpenStack 的前缀:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&OpenStack-Identity-Account-ID
OpenStack-Networking-Host-Name
OpenStack-Object-Storage-Policy
&/code&&/pre&&/div&&p&需要注意的是,虽然 HTTP 规范中没有规定 Header 的大小,但是 Node.js 中 Header 的大小被限制在了 80KB。官方原文如下:&/p&&blockquote&&p&不要让 HTTP Header ,包括其中状态码那行的整体大小超过 HTTP_MAX_Header_SIZE,这样做的目的是为了防御基于 Header 的 DDOS 攻击。&a href=&https://link.zhihu.com/?target=https%3A//github.com/nodejs/node/blob/dba82c50a1eba368d8cba95b57d0/deps/http_parser/http_parser.c%23L143& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&点击这里&/a&&/p&&/blockquote&&h2&4. 为 REST API 挑选合适的框架&/h2&&p&根据你的实际场景挑选合适的框架是非常重要的,Node.js 中的框架大致介绍如下:&/p&&h3&Express、Koa、HAPI&/h3&&p&&a href=&https://link.zhihu.com/?target=http%3A//expressjs.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Express&/a&、&a href=&https://link.zhihu.com/?target=http%3A//koajs.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Koa&/a&、&a href=&https://link.zhihu.com/?target=http%3A//hapijs.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&HAPI&/a& 主要是用来构建浏览器 WEB 应用,因为他们都支持服务端模板渲染,虽然这只是他们众多功能中的一个。如果你的应用需要提供用户界面,那么这三个就是不错的选择。&/p&&h3&Restify&/h3&&p&而 &a href=&https://link.zhihu.com/?target=http%3A//restify.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Restify&/a& 是专门用来创建符合 REST 规范的服务的,他诞生的目的就是帮你构建严格意义上的、可维护的 API 服务。Restify 内置了所有请求处理函数的 &a href=&https://link.zhihu.com/?target=http%3A//dtrace.org/blogs/about/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&DTrace&/a& 支持。并且已经被 &a href=&https://link.zhihu.com/?target=https%3A//npmjs.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&npm&/a& 和 &a href=&https://link.zhihu.com/?target=https%3A//netflix.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&netflix&/a& 用来在生产环境提供重要的服务。&/p&&h2&5. 要对 API 进行黑盒测试&/h2&&p&测试 API 的最好办法是对他们进行黑盒测试,黑盒测试是一种不关心应用内部结构和工作原理的测试方法,测试时系统任何部分都不应该被 mock。&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//www.npmjs.com/package/supertest& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&supertest&/a& 是可以用来对接口进行黑盒测试的模块之一,下面是基于测试框架 &a href=&https://link.zhihu.com/?target=https%3A//mochajs.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&mocha&/a& 编写的一个测试用例,该用例的目的是检查接口是否能返回单条的用户数据:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&const request = require('supertest')
describe('GET /user/:id', function() {
it('returns a user', function() {
// newer mocha versions accepts promises as well
return request(app)
.get('/user')
.set('Accept', 'application/json')
.expect(200, {
name: 'John Math'
&/code&&/pre&&/div&&p&可能有人会问:API 服务所连接的数据库里面的数据是如何写进去的呢?&/p&&p&通常来说,你写测试的时候,要尽可能不对系统状态做假设,然而在某些场景下,你需要准确的知道系统当前所处的状态以增加更多的断言来提高测试覆盖率。如果你有这种需求,你可以试用如下的方法对数据库进行预填充:&/p&&ul&&li&选择生产环境数据的子集来运行黑盒测试;&/li&&li&运行黑盒测试之前把手工构造的数据填充到数据库中。&/li&&/ul&&p&此外,有了黑盒测试并不意味着不需要单元测试,针对 API 的&a href=&https://link.zhihu.com/?target=https%3A//blog.risingstack.com/node-hero-node-js-unit-testing-tutorial/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&单元测试&/a&还是需要编写的。&/p&&h2&6. 使用基于 JWT 的无状态的认证机制&/h2&&p&因为 Rest API 必须是无状态的,因此认证机制也需要是无状态的,而基于 JWT(JSON Web Token) 的认证机制是无状态认证机制中的最佳解决方案。&/p&&p&JWT 的认证机制包含三部分:&/p&&ol&&li&Header:包含 token 的类型和哈希算法;&/li&&li&payload:包含声明信息;&/li&&li&signature:JWT 实际上并不是对 payload 进行加密,只是对其做了签名;&/li&&/ol&&p&为 API 添加基于 JWT 的认证机制也非常的简单,比如下面的代码:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&const koa = require('koa');
const jwt = require('koa-jwt');
const app = koa();
app.use(jwt(
secret: 'very-secret'
// Protected middleware
app.use(function*()
// content of the token will be available on this.state.user
this.body = { secret: '42' }
&/code&&/pre&&/div&&p&有了如上的代码,你的 API 就有了 JWT 的保护。如果要访问这种被保护的接口,需要使用 Authorization Header 来提供 token,比如:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&curl --Header &Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ& my-website.com
&/code&&/pre&&/div&&p&你可能注意到了,JWT 模块并不依赖任何数据存储层,这是因为 token 本身是可以单独被校验的,token 里面的 payload 甚至可以包含 token 的签名时间、有效期限。&/p&&p&此外,你还需要确保,所有的 API 接口只能通过更安全的 HTTPS 链接来访问。&/p&&h2&7. 学会使用条件请求机制&/h2&&p&条件请求机制是基于不同的 Header 表现出不同的行为的机制,可以认为这些 Header 就是请求处理方式的先决条件,如果条件满足,请求处理方式就会有所不同。&/p&&p&可以利用这些 Header 检测服务器上的资源版本是否匹配特定的资源版本,这些 Header 的取值可以是如下的内容:&/p&&ul&&li&资源的最后修改时间;&/li&&li&资源的标签(随资源变化而变化);&/li&&/ul&&p&具体来说:&/p&&ul&&li&Last-Modified:标识资源的最新修改时间;&/li&&li&Etag:标识资源的标签;&/li&&li&If-Modified-Since:结合 Last-Modified Header 使用;&/li&&li&If-Non-Match:结合 Etag 使用;&/li&&/ul&&p&下面来看一个实际的例子:&/p&&p&客户端不知道 doc 资源的任何版本,所以请求时即不能提供 If-Modified-Since,也不能提供 If-Non-Match 两个 Header,然后服务端在响应中会增加 Etag 和 Last-Modified 两个 Header。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-1cfec6ddf1eb815b8e0b8d4_b.jpg& data-rawwidth=&741& data-rawheight=&265& class=&origin_image zh-lightbox-thumb& width=&741& data-original=&https://pic3.zhimg.com/v2-1cfec6ddf1eb815b8e0b8d4_r.jpg&&&/figure&&br&&p&接下来,客户端再次请求相同的资源的时候,就可以带上 If-Modified-Since 和 If-Non-Match 这两个 Header 了,然后如果服务器端会检查资源是否修改,如果没有修改,直接返回 304 - Not Modified 状态码,而不重复发送资源的内容。&/p&&br&&figure&&img src=&https://pic2.zhimg.com/v2-853a717f2d71ff5ff7c27a_b.jpg& data-rawwidth=&741& data-rawheight=&265& class=&origin_image zh-lightbox-thumb& width=&741& data-original=&https://pic2.zhimg.com/v2-853a717f2d71ff5ff7c27a_r.jpg&&&/figure&&h2&8. 拥抱接口调用频率限制(Rate-Limiting)&/h2&&p&频率限制是用来控制调用方有对接口发起请求的次数,为了让你的 API 用户知道他们还剩下多少余额,可以设置下面的 Header:&/p&&ul&&li&X-Rate-Limit-Limit:特定时间段内允许的最多请求次数;&/li&&li&X-Rate-Limit-Remaining:特定时间段内剩余的请求次数;&/li&&li&X-Rate-Limit-Reset:什么时候请求频率限制次数会重置;&/li&&/ul&&p&大多数的 WEB 框架都支持上面这些 Header,如果内置不支持,也可以找到插件来支持,比如,如果你使用了 koa,可以使用 &a href=&https://link.zhihu.com/?target=https%3A//github.com/koajs/ratelimit& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&koa-rate-limit&/a&。&/p&&p&需要注意的是,不同的 API 服务提供商频率限制的时间窗差异会很大,比如 GitHub 是 60 分钟,而 Twitter 是 15 分钟。&/p&&h2&9. 编写良好的 API 文档&/h2&&p&编写 API 的目的当然是让别人使用并受益,提供良好的接口文档至关重要。下面这两个开源项目可以帮你创建 API 文档:&/p&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//apiblueprint.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&API Blueprint&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=http%3A//swagger.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Swagger&/a&&/li&&/ul&&p&如果你愿意使用第三方文档服务商,可以考虑 &a href=&https://link.zhihu.com/?target=https%3A//apiary.io/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Apiary&/a&。&/p&&h2&10. 对 API 技术演化保持关注&/h2&&p&过去几年中,API 技术方案领域出现了两种新的查询语言,分别是 Facebook 的 GraphQL 和 Netflix 的 Falcor,为什么需要他们呢?&/p&&p&试想这种 API 接口请求:/org/1/space/2/docs/1/collaborators?include=email&page=1&limit=10,类似的情况会让 API 很快失控,如果你希望所有接口能返回类似的响应格式,那么 GraphQL 和 Falcor 就能帮你解决这个问题。&/p&&p&&strong&关于 GraphQL&/strong&:&/p&&blockquote&&p&GraphQL 是一种用于 API 的查询语言,也是一种基于现有数据处理数据查询的运行时。GraphQL 为您的 API 中的数据提供了一个完整和可理解的描述,使用户能够准确地询问他们需要什么,使得随着时间推移的 API 演化更容易,GraphQL 还有强大的开发工具支持。 到&a href=&https://link.zhihu.com/?target=http%3A//graphql.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&/a&阅读更多。&/p&&/blockquote&&p&&strong&关于 Falcor&/strong&:&/p&&blockquote&&p&Falcor 是支撑着 Netflix UI 的创新数据平台。Falcor 允许你将所有后端数据建模为 Node.js 服务商的单个虚拟 JSON 对象。在客户端可以使用熟悉的 JavaScript 操作、处理远程JSON对象。如果你知道你的数据,你就知道你的 API 长啥样。 到&a href=&https://link.zhihu.com/?target=https%3A//netflix.github.io/falcor& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&这里&/a&阅读更多。&/p&&/blockquote&&h2&能带来灵感的优秀 API 设计&/h2&&p&如果你正在开发 Rest API 或者准备改进老版本的 API,这里收集了几个在线上提供服务、设计优秀并且非常直接借鉴的 API:&/p&&ul&&li&&a href=&https://link.zhihu.com/?target=https%3A//developer.github.com/v3/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub API&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//www.twilio.com/docs/api/rest& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Twilio API&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//stripe.com/docs/api& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Stripe API&/a&&/li&&li&&a href=&https://link.zhihu.com/?target=https%3A//developers.digitalocean.com/documentation/v2/%23introduction& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Digital Ocean API&/a&&/li&&/ul&&p&希望读到这里的同学对如何用 Node.js 编写良好的 API 有更好的理解,如果有建议,欢迎评论中提出。&/p&&h3&One More Thing&/h3&&p&想读到更多类似内容?请订阅我的专栏&a href=&https://zhuanlan.zhihu.com/feweekly& class=&internal&&《前端周刊,让你在前端领域跟上时代的脚步》&/a&,或者扫描本文封面中的二维码订阅微信号。&br&&/p&&p&Happy Hacking&/p&
全文共 6953 字,读完需 8 分钟,速读需 2 分钟。翻译自:RingStack 的文章 ,英文好的同学可以直接阅读原文,译文较原文有删节,。Node.js 除了用来编写 WEB 应用之外,还可以用来编写 API …
&p&看到这个问题我必须拿出我收藏多年,不到关键时刻不示人的计算机之神:Ravindrababu Ravula,数据结构和算法、编译原理、操作系统、计算机网络全都懂,懂还就算了,讲课还非常棒!&/p&&figure&&img src=&https://pic2.zhimg.com/v2-fef7694c9edf10c32d2439_b.png& data-rawwidth=&1117& data-rawheight=&626& class=&origin_image zh-lightbox-thumb& width=&1117& data-original=&https://pic2.zhimg.com/v2-fef7694c9edf10c32d2439_r.png&&&/figure&&p&&a href=&//link.zhihu.com/?target=https%3A//www.youtube.com/channel/UCJjC1hn78yZqTf0vdTC6wAQ& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&youtube.com/channel/UCJ&/span&&span class=&invisible&&jC1hn78yZqTf0vdTC6wAQ&/span&&span class=&ellipsis&&&/span&&i class=&icon-external&&&/i&&/a&&/p&&p&很久之前因为工作原因需要一点编译原理的知识,但是本科上课的知识已经忘光了(其实上课的时候也没怎么认真听懂)。然后就上 Youtube 搜了一下,找到这位帅气的印度小哥。怀着试一下的心态看了几分钟,然后发现:&b&根本停不下来&/b&!就一口气把 Parser 相关的知识全听完了,隔天消化一下,后续就写出了人生第一个 Parser,并且应用到了前端的模版引擎当中。虽然我不知道他的名字怎么念,但是我知道他讲课是在太棒了。&/p&&p&给你讲解 Parser 的分类:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-a5b4ef654ac91_b.png& data-rawwidth=&1242& data-rawheight=&652& class=&origin_image zh-lightbox-thumb& width=&1242& data-original=&https://pic2.zhimg.com/v2-a5b4ef654ac91_r.png&&&/figure&&p&Top-down Parsing 的工作原理:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-87dc532fb_b.png& data-rawwidth=&1126& data-rawheight=&631& class=&origin_image zh-lightbox-thumb& width=&1126& data-original=&https://pic2.zhimg.com/v2-87dc532fb_r.png&&&/figure&&p&通过大量的白板演算实例教你怎么算 First 和 Follow 集,直到教到你懂为止:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6990abab4af7ba2a180b_b.png& data-rawwidth=&1263& data-rawheight=&647& class=&origin_image zh-lightbox-thumb& width=&1263& data-original=&https://pic4.zhimg.com/v2-6990abab4af7ba2a180b_r.png&&&/figure&&p&一步步教你 Parsing Table:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-822d0ba1bdb764ea5fde7f549c99a512_b.png& data-rawwidth=&1213& data-rawheight=&628& class=&origin_image zh-lightbox-thumb& width=&1213& data-original=&https://pic3.zhimg.com/v2-822d0ba1bdb764ea5fde7f549c99a512_r.png&&&/figure&&p&通过实际白板代码推演递归下降的 LL(1) Parser,告诉你每一步代码做了什么,每一步的程序状态是怎么样的,教到你懂为止:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-21c9af1bbcdf7f36cb4ef_b.png& data-rawwidth=&600& data-rawheight=&313& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic1.zhimg.com/v2-21c9af1bbcdf7f36cb4ef_r.png&&&/figure&&p&我这里当然省略了 Ravula 老师讲课的很多细节。这位名字我不会念的老师讲课细致、逻辑清晰,有条不紊,难的地方通过大量实例一步步讲解,不含糊,让人如痴如醉欲罢不能,以至于我现在写简单的 Parser 都是直接怼 EBNF 直接开撸。然后我回忆了一下本科给我们讲编译原理的那位老先生,原来当年听不懂课除了跟我智商低有关系以外,还跟讲课的人有很大的关系啊!&/p&&p&不轻易间点看了 Ravula 老师的主页,发现他不仅仅懂编译原理,而且懂几乎所有计算机学科相关的基础课程,包括数据结构和算法、编译原理、操作系统、计算机网络:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-d2a231dfa9205_b.png& data-rawwidth=&1081& data-rawheight=&862& class=&origin_image zh-lightbox-thumb& width=&1081& data-original=&https://pic2.zhimg.com/v2-d2a231dfa9205_r.png&&&/figure&&br&&figure&&img src=&https://pic3.zhimg.com/v2-679c9c388adfb21d1e266f3cd53958e2_b.png& data-rawwidth=&1079& data-rawheight=&826& class=&origin_image zh-lightbox-thumb& width=&1079& data-original=&https://pic3.zhimg.com/v2-679c9c388adfb21d1e266f3cd53958e2_r.png&&&/figure&&p&这些个好东西这么多年来我都是偷偷看的,我发现国内很少人知道他。可能是跟你得学会怎么听印度口音的英文才能听他讲课有关系[捂脸](不过不用怕,Youtube 的字幕就好了,但是也是英文字幕)。&/p&&p&当然小哥也不是万能的,有些地方还是需要有一点知识储备才能听懂,所以最好是能够结合一些资料来配合着看最佳。&/p&&p&UPDATE:评论区好多朋友都说看过小哥的 KMP、后缀树等,看来我对小哥还是知之甚少。&/p&&p&UPDATE:很多朋友问有没有中文字幕,讲道理应该是没有的。最猴还是能习惯一下听英文,配合着 Youtube 的英文字幕其实还可以,毕竟来来去去就那几个词。习惯听英文,新世界的大门会向你敞开。&/p&&p&UPDATE:有朋友说怎么开字幕,这里有个 CC 啊,点他啊&/p&&figure&&img src=&https://pic2.zhimg.com/v2-8bf97f291a560bb3d0f855_b.png& data-rawwidth=&241& data-rawheight=&127& class=&content_image& width=&241&&&/figure&&p&PS:小哥能不能给我点广告费。&/p&&p&UPDATE: 有些朋友说听不懂...那我也很绝望啊,我还能怎么办&/p&
看到这个问题我必须拿出我收藏多年,不到关键时刻不示人的计算机之神:Ravindrababu Ravula,数据结构和算法、编译原理、操作系统、计算机网络全都懂,懂还就算了,讲课还非常棒!很久之前因为工…
&blockquote&&p&本文来自 WeRead 团队博客:&br&&a href=&https://link.zhihu.com/?target=http%3A//wereadteam.github.io/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&wereadteam.github.io/&/span&&span class=&invisible&&&/span&&/a&&/p&&/blockquote&&p& iOS 签名机制挺复杂,各种证书,Provisioning Profile,entitlements,CertificateSigningRequest,p12,AppID,概念一堆,也很容易出错,本文尝试从原理出发,一步步推出为什么会有这么多概念,希望能有助于理解 iOS App 签名的原理和流程。&/p&&h2&目的&/h2&&p& 先来看看苹果的签名机制是为了做什么。在 iOS 出来之前,在主流操作系统(Mac/Windows/Linux)上开发和运行软件是不需要签名的,软件随便从哪里下载都能运行,导致平台对第三方软件难以控制,盗版流行。苹果希望解决这样的问题,在 iOS 平台对第三方 APP 有绝对的控制权,一定要保证每一个安装到 iOS 上的 APP 都是经过苹果官方允许的,怎样保证呢?就是通过签名机制。&/p&&h2&非对称加密&/h2&&p& 通常我们说的签名就是数字签名,它是基于非对称加密算法实现的。对称加密是通过同一份密钥加密和解密数据,而非对称加密则有两份密钥,分别是公钥和私钥,用公钥加密的数据,要用私钥才能解密,用私钥加密的数据,要用公钥才能解密。&/p&&p& 简单说一下常用的非对称加密算法 RSA 的数学原理,理解简单的数学原理,就可以理解非对称加密是怎么做到的,为什么会是安全的:&/p&&ol&&li&&p&选两个质数p和q相乘得出一个大整数n,例如 p=61,q=53,n=pq=3233&/p&&/li&&li&&p&选 1-n 间的随便一个质数e,例如 e = 17&/p&&/li&&li&&p&经过一系列数学公式,算出一个数字d,满足:&br&a. 通过n和e这两个数据一组数据进行数学运算后,可以通过n和d去反解运算,反过来也可以。&br&b. 如果只知道n和e,要推导出d,需要知道p和q,也就是要需要把 n 因数分解。&/p&&/li&&/ol&&p& 上述的(n,e)这两个数据在一起就是公钥,(n,d)这两个数据就是私钥,满足用公钥加密,私钥解密,或反过来公钥加密,私钥解密,也满足在只暴露公钥(只知道n和e)的情况下,要推导出私钥(n,d),需要把大整数n因数分解。目前因数分解只能靠暴力穷举,而n数字越大,越难以用穷举计算出因数p和q,也就越安全,当n大到二进制 1024 位或 2048 位时,以目前技术要破解几乎不可能,所以非常安全。&/p&&p& 若对数字d是怎样计算出来的感兴趣,可以搜索这两篇文章:RSA 算法原理(一)(二)&/p&&h2&数字签名&/h2&&p& 现在知道了有非对称加密这东西,那数字签名是怎么回事呢?&/p&&p& 数字签名的作用是我对某一份数据打个标记,表示我认可了这份数据(签了个名),然后我发送给其他人,其他人可以知道这份数据是经过我认证的,数据没有被篡改过。&/p&&p& 有了上述非对称加密算法,就可以实现这个需求:&/p&&figure&&img src=&https://pic3.zhimg.com/v2-e223e9de9f7bba26e477d57_b.jpg& data-rawwidth=&855& data-rawheight=&663& class=&origin_image zh-lightbox-thumb& width=&855& data-original=&https://pic3.zhimg.com/v2-e223e9de9f7bba26e477d57_r.jpg&&&/figure&&ol&&li&&p&首先用一种算法,算出原始数据的摘要。需满足 a.若原始数据有任何变化,计算出来的摘要值都会变化。 b.摘要要够短。这里最常用的算法是MD5。&/p&&/li&&li&&p&生成一份非对称加密的公钥和私钥,私钥我自己拿着,公钥公布出去。&/p&&/li&&li&&p&对一份数据,算出摘要后,用私钥加密这个摘要,得到一份加密后的数据,称为原始数据的签名。把它跟原始数据一起发送给用户。&/p&&/li&&li&&p&用户收到数据和签名后,用公钥解密得到摘要。同时用户用同样的算法计算原始数据的摘要,对比这里计算出来的摘要和用公钥解密签名得到的摘要是否相等,若相等则表示这份数据中途没有被篡改过,因为如果篡改过,摘要会变化。&/p&&/li&&/ol&&p& 之所以要有第一步计算摘要,是因为非对称加密的原理限制可加密的内容不能太大(不能大于上述 n 的位数,也就是一般不能大于 1024 位/ 2048 位),于是若要对任意大的数据签名,就需要改成对它的特征值签名,效果是一样的。&/p&&p& 好了,有了非对称加密的基础,知道了数字签名是什么,怎样可以保证一份数据是经过某个地方认证的,来看看怎样通过数字签名的机制保证每一个安装到 iOS 上的 APP 都是经过苹果认证允许的。&/p&&h2&最简单的签名&/h2&&p& 要实现这个需求很简单,最直接的方式,苹果官方生成一对公私钥,在 iOS 里内置一个公钥,私钥由苹果后台保存,我们传 App 上 AppStore 时,苹果后台用私钥对 APP 数据进行签名,iOS 系统下载这个 APP 后,用公钥验证这个签名,若签名正确,这个 APP 肯定是由苹果后台认证的,并且没有被修改过,也就达到了苹果的需求:保证安装的每一个 APP 都是经过苹果官方允许的。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-9f728da2fe6aef_b.jpg& data-rawwidth=&777& data-rawheight=&394& class=&origin_image zh-lightbox-thumb& width=&777& data-original=&https://pic2.zhimg.com/v2-9f728da2fe6aef_r.jpg&&&/figure&&p& 如果我们 iOS 设备安装 APP 只有从 AppStore 下载这一种方式的话,这件事就结束了,没有任何复杂的东西,只有一个数字签名,非常简单地解决问题。&/p&&p& 但实际上因为除了从 AppStore 下载,我们还可以有三种方式安装一个 App:&/p&&ol&&li&&p&开发 App 时可以直接把开发中的应用安装进手机进行调试。&/p&&/li&&li&&p&In-House 企业内部分发,可以直接安装企业证书签名后的 APP。&/p&&/li&&li&&p&AD-Hoc 相当于企业分发的限制版,限制安装设备数量,较少用。&/p&&/li&&/ol&&p& 苹果要对用这三种方式安装的 App 进行控制,就有了新的需求,无法像上面这样简单了。&/p&&h2&新的需求&/h2&&p& 我们先来看第一个,开发时安装APP,它有两个个需求:&/p&&ol&&li&&p&安装包不需要传到苹果服务器,可以直接安装到手机上。如果你编译一个 APP 到手机前要先传到苹果服务器签名,这显然是不能接受的。&/p&&/li&&li&&p&苹果必须对这里的安装有控制权,包括&br&a.经过苹果允许才可以这样安装。&br&b.不能被滥用导致非开发app也能被安装。&/p&&/li&&/ol&&p& 为了实现这些需求,iOS 签名的复杂度也就开始增加了。&/p&&p& 苹果这里给出的方案是使用了双层签名,会比较绕,流程大概是这样的:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-1e8430adda21f7ba590fc8_b.jpg& data-rawwidth=&1443& data-rawheight=&718& class=&origin_image zh-lightbox-thumb& width=&1443& data-original=&https://pic1.zhimg.com/v2-1e8430adda21f7ba590fc8_r.jpg&&&/figure&&ol&&li&&p&在你的 Mac 开发机器生成一对公私钥,这里称为公钥L,私钥L。L:Local&/p&&/li&&li&&p&苹果自己有固定的一对公私钥,跟上面 AppStore 例子一样,私钥在苹果后台,公钥在每个 iOS 设备上。这里称为公钥A,私钥A。A:Apple&/p&&/li&&li&&p&把公钥 L 传到苹果后台,用苹果后台里的私钥 A 去签名公钥 L。得到一份数据包含了公钥 L 以及其签名,把这份数据称为证书。&/p&&/li&&li&&p&在开发时,编译完一个 APP 后,用本地的私钥 L 对这个 APP 进行签名,同时把第三步得到的证书一起打包进 APP 里,安装到手机上。&/p&&/li&&li&&p&在安装时,iOS 系统取得证书,通过系统内置的公钥 A,去验证证书的数字签名是否正确。&/p&&/li&&li&&p&验证证书后确保了公钥 L 是苹果认证过的,再用公钥 L 去验证 APP 的签名,这里就间接验证了这个 APP 安装行为是否经过苹果官方允许。(这里只验证安装行为,不验证APP 是否被改动,因为开发阶段 APP 内容总是不断变化的,苹果不需要管。)&/p&&/li&&/ol&&h2&加点东西&/h2&&p& 上述流程只解决了上面第一个需求,也就是需要经过苹果允许才可以安装,还未解决第二个避免被滥用的问题。怎么解决呢?苹果再加了两个限制,一是限制在苹果后台注册过的设备才可以安装,二是限制签名只能针对某一个具体的 APP。&/p&&p& 怎么加的?在上述第三步,苹果用私钥 A 签名我们本地公钥 L 时,实际上除了签名公钥 L,还可以加上无限多数据,这些数据都可以保证是经过苹果官方认证的,不会有被篡改的可能。&/p&&figure&&img src=&https://pic4.zhimg.com/v2-b2ac845baf125cc3a4a900_b.jpg& data-rawwidth=&1468& data-rawheight=&827& class=&origin_image zh-lightbox-thumb& width=&1468& data-original=&https://pic4.zhimg.com/v2-b2ac845baf125cc3a4a900_r.jpg&&&/figure&&p& 可以想到把 允许安装的设备 ID 列表 和 App对应的 AppID 等数据,都在第三步这里跟公钥L一起组成证书,再用苹果私钥 A 对这个证书签名。在最后第 5 步验证时就可以拿到设备 ID 列表,判断当前设备是否符合要求。根据数字签名的原理,只要数字签名通过验证,第 5 步这里的设备 IDs / AppID / 公钥 L 就都是经过苹果认证的,无法被修改,苹果就可以限制可安装的设备和 APP,避免滥用。&/p&&h2&最终流程&/h2&&p& 到这里这个证书已经变得很复杂了,有很多额外信息,实际上除了 设备 ID / AppID,还有其他信息也需要在这里用苹果签名,像这个 APP 里 iCloud / push / 后台运行 等权限苹果都想控制,苹果把这些权限开关统一称为 Entitlements,它也需要通过签名去授权。&/p&&p& 实际上一个“证书”本来就有规定的格式规范,上面我们把各种额外信息塞入证书里是不合适的,于是苹果另外搞了个东西,叫 Provisioning Profile,一个 Provisioning Profile 里就包含了证书以及上述提到的所有额外信息,以及所有信息的签名。&/p&&p& 所以整个流程稍微变一下,就变成这样了:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-779c5beca262fbd0da75c26ca1f84b55_b.jpg& data-rawwidth=&1480& data-rawheight=&997& class=&origin_image zh-lightbox-thumb& width=&1480& data-original=&https://pic4.zhimg.com/v2-779c5beca262fbd0da75c26ca1f84b55_r.jpg&&&/figure&&p& 因为步骤有小变动,这里我们不辞啰嗦重新再列一遍整个流程:&/p&&ol&&li&&p&在你的 Mac 开发机器生成一对公私钥,这里称为公钥L,私钥L。L:Local&/p&&/li&&li&&p&苹果自己有固定的一对公私钥,跟上面 AppStore 例子一样,私钥在苹果后台,公钥在每个 iOS 设备上。这里称为公钥A,私钥A。A:Apple&/p&&/li&&li&&p&把公钥 L 传到苹果后台,用苹果后台里的私钥 A 去签名公钥 L。得到一份数据包含了公钥 L 以及其签名,把这份数据称为证书。&/p&&/li&&li&&p&在苹果后台申请 AppID,配置好设备 ID 列表和 APP 可使用的权限,再加上第③步的证书,组成的数据用私钥 A 签名,把数据和签名一起组成一个 Provisioning Profile 文件,下载到本地 Mac 开发机。&/p&&/li&&li&&p&在开发时,编译完一个 APP 后,用本地的私钥 L 对这个 APP 进行签名,同时把第④步得到的 Provisioning Profile 文件打包进 APP 里,文件名为 embedded.mobileprovision,把 APP 安装到手机上。&/p&&/li&&li&&p&在安装时,iOS 系统取得证书,通过系统内置的公钥 A,去验证 embedded.mobileprovision 的数字签名是否正确,里面的证书签名也会再验一遍。&/p&&/li&&li&&p&确保了 embedded.mobileprovision 里的数据都是苹果授权以后,就可以取出里面的数据,做各种验证,包括用公钥 L 验证APP签名,验证设备 ID 是否在 ID 列表上,AppID 是否对应得上,权限开关是否跟 APP 里的 Entitlements 对应等。&/p&&/li&&/ol&&p& 开发者证书从签名到认证最终苹果采用的流程大致是这样,还有一些细节像证书有效期/证书类型等就不细说了。&/p&&h2&概念和操作&/h2&&p& 上面的步骤对应到我们平常具体的操作和概念是这样的:&/p&&ol&&li&&p&第 1 步对应的是 keychain 里的 “从证书颁发机构请求证书”,这里就本地生成了一堆公私钥,保存的 CertificateSigningRequest 就是公钥,私钥保存在本地电脑里。&/p&&/li&&li&&p&第 2 步苹果处理,不用管。&/p&&/li&&li&&p&第 3 步对应把 CertificateSigningRequest 传到苹果后台生成证书,并下载到本地。这时本地有两个证书,一个是第 1 步生成的,一个是这里下载回来的,keychain 会把这两个证书关联起来,因为他们公私钥是对应的,在XCode选择下载回来的证书时,实际上会找到 keychain 里对应的私钥去签名。这里私钥只有生成它的这台 Mac 有,如果别的 Mac 也要编译签名这个 App 怎么办?答案是把私钥导出给其他 Mac 用,在 keychain 里导出私钥,就会存成 .p12 文件,其他 Mac 打开后就导入了这个私钥。&/p&&/li&&li&&p&第 4 步都是在苹果网站上操作,配置 AppID / 权限 / 设备等,最后下载 Provisioning Profile 文件。&/p&&/li&&li&&p&第 5 步 XCode 会通过第 3 步下载回来的证书(存着公钥),在本地找到对应的私钥(第一步生成的),用本地私钥去签名 App,并把 Provisioning Profile 文件命名为 embedded.mobileprovision 一起打包进去。这里对 App 的签名数据保存分两部分,Mach-O 可执行文件会把签名直接写入这个文件里,其他资源文件则会保存在 _CodeSignature 目录下。&/p&&/li&&/ol&&p& 第 6 - 7 步的打包和验证都是 Xcode 和 iOS 系统自动做的事。&/p&&p& 这里再总结一下这些概念:&/p&&ol&&li&&strong&证书&/strong&:内容是公钥或私钥,由其他机构对其签名组成的数据包。&/li&&li&&strong&Entitlements&/strong&:包含了 App 权限开关列表。&/li&&li&&strong&CertificateSigningRequest&/strong&:本地公钥。&/li&&li&&strong&p12&/strong&:本地私钥,可以导入到其他电脑。&/li&&li&&strong&Provisioning Profile&/strong&:包含了 证书 / Entitlements 等数据,并由苹果后台私钥签名的数据包。&/li&&/ol&&h2&其他发布方式&/h2&&p& 前面以开发包为例子说了签名和验证的流程,另外两种方式 In-House 企业签名和 AD-Hoc 流程也是差不多的,只是企业签名不限制安装的设备数,另外需要用户在 iOS 系统设置上手动点击信任这个企业才能通过验证。&/p&&p& 而 AppStore 的签名验证方式有些不一样,前面我们说到最简单的签名方式,苹果在后台直接用私钥签名 App 就可以了,实际上苹果确实是这样做的,如果去下载一个 AppStore 的安装包,会发现它里面是没有 embedded.mobileprovision 文件的,也就是它安装和启动的流程是不依赖这个文件,验证流程也就跟上述几种类型不一样了。&/p&&p& 据猜测,因为上传到 AppStore 的包苹果会重新对内容加密,原来的本地私钥签名就没有用了,需要重新签名,从 AppStore 下载的包苹果也并不打算控制它的有效期,不需要内置一个 embedded.mobileprovision 去做校验,直接在苹果用后台的私钥重新签名,iOS 安装时用本地公钥验证 App 签名就可以了。&/p&&p& 那为什么发布 AppStore 的包还是要跟开发版一样搞各种证书和 Provisioning Profile?猜测因为苹果想做统一管理,Provisioning Profile 里包含一些权限控制,AppID 的检验等,苹果不想在上传 AppStore 包时重新用另一种协议做一遍这些验证,就不如统一把这部分放在 Provisioning Profile 里,上传 AppStore 时只要用同样的流程验证这个 Provisioning Profile 是否合法就可以了。&/p&&p& 所以 App 上传到 AppStore 后,就跟你的 证书 / Provisioning Profile 都没有关系了,无论他们是否过期或被废除,都不会影响 AppStore 上的安装包。&/p&&p& 到这里 iOS 签名机制的原理和主流程大致说完了,希望能对理解苹果签名和排查日常签名问题有所帮助。&/p&&h2&P.S.一些疑问&/h2&&p& 最后这里再提一下我关于签名流程的一些的疑问。&/p&&h4&企业证书&/h4&&p& 企业证书签名因为限制少,在国内被广泛用于测试和盗版,&a href=&https://link.zhihu.com/?target=http%3A//fir.im& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&fir.im&/span&&span class=&invisible&&&/span&&/a& / 蒲公英等测试平台都是通过企业证书分发,国内一些市场像 PP 助手,爱思助手,一部分安装手段也是通过企业证书重签名。通过企业证书签名安装的 App,启动时都会验证证书的有效期,并且不定期请求苹果服务器看证书是否被吊销,若已过期或被吊销,就会无法启动 App。对于这种助手的盗版安装手段,苹果想打击只能一个个吊销企业证书,并没有太好的办法。&/p&&p& 这里我的疑问是,苹果做了那么多签名和验证机制去限制在 iOS 安装 App,为什么又要出这样一个限制很少的方式让盗版钻空子呢?若真的是企业用途不适合上 AppStore,也完全可以在 AppStore 开辟一个小的私密版块,还是通过 AppStore 去安装,就不会有这个问题了。&/p&&h4&AppStore 加密&/h4&&p& 另一个问题是我们把 App 传上 AppStore 后,苹果会对 App 进行加密,导致 App 体积增大不少,这个加密实际上是没卵用的,只是让破解的人要多做一个步骤,运行 App 去内存 dump 出可执行文件而已,无论怎样加密,都可以用这种方式拿出加密前的可执行文件。所以为什么要做这样的加密呢?想不到有什么好处。&/p&&h4&本地私钥&/h4&&p& 我们看到前面说的签名流程很绕很复杂,经常出现各种问题,像有 Provisioning Profile 文件但证书又不对,本地有公钥证书没对应私钥等情况,不理解原理的情况下会被绕晕,我的疑问是,这里为什么不能简化呢?还是以开发证书为例,为什么一定要用本地 Mac 生成的私钥去签名?苹果要的只是本地签名,私钥不一定是要本地生成的,苹果也可以自己生成一对公私钥给我们,放在 Provisioning Profile 里,我们用里面的私钥去加密就行了,这样就不会有 CertificateSigningRequest 和 p12 的概念,跟本地 keychain 没有关系,不需要关心证书,只要有 Provisioning Profile 就能签名,流程会减少,易用性会提高很多,同时苹果想要的控制一点都不会少,也没有什么安全问题,为什么不这样设计呢?&/p&&p& 能想到的一个原因是 Provisioning Profile 在非 AppStore 安装时会打包进安装包,第三方拿到这个 Provisioning Profile 文件就能直接用起来给他自己的 App 签名了。但这种问题也挺好解决,只需要打包时去掉文件里的私钥就行了,所以仍不明白为什么这样设计。&/p&&br&&p&更多精彩内容欢迎关注&a href=&https://link.zhihu.com/?target=https%3A//bugly.qq.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&腾讯 Bugly&/a&的微信公众账号:&br&&figure&&img src=&https://pic4.zhimg.com/3f2c1b1ff77fcedf3fb54616_b.jpg& class=&content_image&&&/figure&&/p&&p&&a href=&https://link.zhihu.com/?target=https%3A//bugly.qq.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&腾讯 Bugly&/a&是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条 &a href=&https://link.zhihu.com/?target=https%3A//bugly.qq.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Crash&/a& 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的 iOS, Android 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!&/p&
本文来自 WeRead 团队博客:
iOS 签名机制挺复杂,各种证书,Provisioning Profile,entitlements,CertificateSigningRequest,p12,AppID,概念一堆,也很容易出错,本文尝试从原理出发,一步步推出为什么会有这么多概念,希望能有…
&figure&&img src=&https://pic3.zhimg.com/v2-4bef5d339bb7c9d_b.jpg& data-rawwidth=&652& data-rawheight=&419& class=&origin_image zh-lightbox-thumb& width=&652& data-original=&https://pic3.zhimg.com/v2-4bef5d339bb7c9d_r.jpg&&&/figure&前些日子,知乎发布了2016年度一百问:&a href=&https://club.zhihu.com/2017/top100/?utm_campaign=club2017&utm_source=zhihu&utm_medium=recommand&utm_division=zhishiqingnian&utm_content=column& class=&internal&&知乎 2016 年度一百问&/a& ,它涵盖了 2016 年知乎上最热门的 100 个讨论。有了问题,大家自然会想到回答,2016年度最热的回答是什么?或许对于问题,大家更愿意看到高赞/高收藏的回答。&p&考虑到整理整个知乎社区的所有高赞回答是没有意义的,所以这里将会按照话题分开统计;为了方便大家阅读使用,全文将按照各种语言分开进行整理。&b&回答的选取规则是:回答时间在2016年,在各编程语言回答中排名前10的回答。&/b&&/p&&br&&p&&figure&&img src=&http://pic2.zhimg.com/v2-4bef5d339bb7c9d_b.png& data-rawwidth=&652& data-rawheight=&419& class=&origin_image zh-lightbox-thumb& width=&652& data-original=&http://pic2.zhimg.com/v2-4bef5d339bb7c9d_r.png&&&/figure&&b&&i&&u&1、Python - 2016年度回答&/u&&/i&&/b&&/p&&p&&i&1.1赞同最多的前5个回答&/i&&/p&&p&7904 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Python 的练手项目有哪些值得推荐?&/a&&/p&&p&5946 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何系统地自学 Python? - 知乎用户的回答 - 知乎&/a&&/p&&p&5430 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&零基础应该选择学习 Java、PHP 还是 Python?&/a&&/p&&p&5082 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Python 的练手项目有哪些值得推荐?&/a&&/p&&p&3137 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何入门 Python 爬虫? - 挖数的回答 - 知乎&/a&&/p&&p&&i&1.2收藏最多的前5个回答&/i&&/p&&p&21943 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Python 的练手项目有哪些值得推荐?&/a&&/p&&p&16632 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何系统地自学 Python? - 知乎用户的回答 - 知乎&/a&&/p&&p&11522 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Python 的练手项目有哪些值得推荐?&/a&&/p&&p&8222 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&零基础应该选择学习 Java、PHP 还是 Python?&/a&&/p&&p&4858 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Excel 的 VBA 现在还算是办公利器吗?&/a&&/p&&br&&p&&b&&i&&u&2、Java - 2016年度回答&/u&&/i&&/b&&/p&&p&&i&2.1赞同最多的前5个回答&/i&&/p&&p&5430 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&零基础应该选择学习 Java、PHP 还是 Python?&/a&&/p&&p&2677 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&在北京做Java开发如何月薪达到两万,需要技术水平达到什么程度? - 匿名用户的回答 - 知乎&/a&&/p&&p&2263 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&java初学者,如何学习java? - 天天向上的回答 - 知乎&/a&&/p&&p&2077 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&为什么程序代码被编译成机器码就不能跨平台运行? - 知乎用户的回答 - 知乎&/a&&/p&&p&1893 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Java 的开发效率究竟比 C++ 高在哪里?&/a&&/p&&p&&i&2.2收藏最多的前5个回答&/i&&/p&&p&4399 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&在北京做Java开发如何月薪达到两万,需要技术水平达到什么程度? - 匿名用户的回答 - 知乎&/a&&/p&&p&2105 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&java初学者,如何学习java? - 天天向上的回答 - 知乎&/a&&/p&&p&1811 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&当你学会了什么之后感觉自己的编程算是入门了? - chapman zhang 的回答 - 知乎&/a&&/p&&p&1746 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&零基础应该选择学习 Java、PHP 还是 Python?&/a&&/p&&p&1712 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何去阅读并学习一些优秀的开源框架的源码? - phodal 的回答 - 知乎&/a&&/p&&br&&p&&b&&i&&u&3、JavaScript - 2016年度回答&/u&&/i&&/b&&/p&&p&&i&3.1赞同最多的前5个回答&/i&&/p&&p&2382 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Web 前端怎样入门? - 颜什么都不记得适的回答 - 知乎&/a&&/p&&p&2015 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何入门微信小程序开发,有哪些学习资料? - 初雪的回答 - 知乎&/a&&/p&&p&1847 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&有哪些短小却令人惊叹的 JavaScript 代码?&/a&&/p&&p&1544 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&为什么vue的更新记录不能有中文,中文文档也一直滞后? - 尤雨溪的回答 - 知乎&/a&&/p&&p&1491 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&关于后端程序员写前端用什么框架更好? - 毛文强的回答 - 知乎&/a&&/p&&p&&i&3.2收藏最多的前5个回答&/i&&/p&&p&5458 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Web 前端怎样入门? - 颜什么都不记得适的回答 - 知乎&/a&&/p&&p&4962 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何入门微信小程序开发,有哪些学习资料? - 初雪的回答 - 知乎&/a&&/p&&p&3360 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何入门微信小程序开发,有哪些学习资料? - 贺嘉的回答 - 知乎&/a&&/p&&p&2105 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&关于后端程序员写前端用什么框架更好? - 毛文强的回答 - 知乎&/a&&/p&&p&1951 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&关于 JavaScript 的好书有哪些?&/a&&/p&&br&&p&&b&&i&&u&4、C - 2016年度回答&/u&&/i&&/b&&/p&&p&&i&4.1赞同最多的前5个回答&/i&&/p&&p&4141 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&学会了 C 语言真的可以开发出很多东西吗?&/a&&/p&&p&2386 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&你用 C 语言做过哪些有意思的事?&/a&&/p&&p&2257 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Windows 上最小的“HelloWorld.exe”能有多小?&/a&&/p&&p&2167 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&对于一个大一计科新生,有什么代码行数在500~1000的程序(c语言)可以试着写来练手? - 童晶的回答 - 知乎&/a&&/p&&p&2077 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&为什么程序代码被编译成机器码就不能跨平台运行? - 知乎用户的回答 - 知乎&/a&&/p&&p&&i&4.2收藏最多的前5个回答&/i&&/p&&p&8712 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&学会了 C 语言真的可以开发出很多东西吗?&/a&&/p&&p&3160 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&对于一个大一计科新生,有什么代码行数在500~1000的程序(c语言)可以试着写来练手? - 童晶的回答 - 知乎&/a&&/p&&p&1882 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&你用 C 语言做过哪些有意思的事?&/a&&/p&&p&1387 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&怎么能让LOL在运行中闪退? - 郝艺益的回答 - 知乎&/a&&/p&&p&1278 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何阅读《深入理解计算机系统》这本书? - 等灯等灯的回答 - 知乎&/a&&/p&&br&&p&&b&&i&&u&5、C++ - 2016年度回答&/u&&/i&&/b&&/p&&p&&i&5.1赞同最多的前5个回答&/i&&/p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&Java 的开发效率究竟比 C++ 高在哪里?&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&计算机领域有哪些像《鸟哥的Linux私房菜》这样通俗易懂的学习资料? - vczh 的回答 - 知乎&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何在一个月内提高C++水平? - 空明流转的回答 - 知乎&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&学习分布式系统需要怎样的知识? - 马超的回答 - 知乎&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&C++ 难在哪? - 灵剑的回答 - 知乎&/a&&p&&i&5.2收藏最多的前5个回答&/i&&/p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&计算机领域有哪些像《鸟哥的Linux私房菜》这样通俗易懂的学习资料? - vczh 的回答 - 知乎&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&学习分布式系统需要怎样的知识? - 马超的回答 - 知乎&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&计算机领域有哪些像《鸟哥的Linux私房菜》这样通俗易懂的学习资料? - 罗文益的回答 - 知乎&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何塑造一个拿的出手的 GitHub 账号?&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何去阅读并学习一些优秀的开源框架的源码? - phodal 的回答 - 知乎&/a&&br&&p&&b&&i&&u&6、PHP - 2016年度回答&/u&&/i&&/b&&/p&&p&&i&6.1赞同最多的前5个回答&/i&&/p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&零基础应该选择学习 Java、PHP 还是 Python?&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&学PHP最快要多久? 学习路线?要不要报培训班?&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&大部分已经干了两三年的程序员水平是怎样的? - 知乎用户的回答 - 知乎&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&感觉技术提高很慢,怎么安抚浮躁的情绪? - 匿名用户的回答 - 知乎&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&27岁想转python,是否值得? - 知乎用户的回答 - 知乎&/a&&p&&i&6.2收藏最多的前5个回答&/i&&/p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&零基础应该选择学习 Java、PHP 还是 Python?&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&学PHP最快要多久? 学习路线?要不要报培训班?&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&新手应该如何学习 PHP 语言?&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&感觉技术提高很慢,怎么安抚浮躁的情绪? - 匿名用户的回答 - 知乎&/a&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&php 程序员,来北京一个星期了还没有找到工作,怎么办?&/a&&p&&i&&u&&b&7、Swift - 2016年度回答&/b&&/u&&/i&&br&&/p&&p&&i&7.1&/i&&i&赞同最多的前5个回答&/i&&/p&&p&1354 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&阿里、百度和腾讯为什么不学谷歌、苹果甚至 Mozilla 开发一种新的语言?&/a&&/p&&p&217 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何系统地自学 Swift 语言并学会 iOS 开发?&/a&&/p&&p&178 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&阿里、百度和腾讯为什么不学谷歌、苹果甚至 Mozilla 开发一种新的语言?&/a&&/p&&p&155 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Objective-C 输出函数 NSLog 里的 log 是什么缩写?&/a&&/p&&p&136 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&iOS开发包含哪些内容? - 彭先僧的回答 - 知乎&/a&&/p&&br&&p&&i&7.2&/i&&i&收藏最多的前5个回答&/i&&/p&&p&379 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&阿里、百度和腾讯为什么不学谷歌、苹果甚至 Mozilla 开发一种新的语言?&/a&&/p&&p&99 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何系统地自学 Swift 语言并学会 iOS 开发?&/a&&/p&&p&96 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&阿里、百度和腾讯为什么不学谷歌、苹果甚至 Mozilla 开发一种新的语言?&/a&&/p&&p&27 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&Objective-C 输出函数 NSLog 里的 log 是什么缩写?&/a&&/p&&p&26 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&iOS开发包含哪些内容? - 彭先僧的回答 - 知乎&/a&&/p&&p&&i&&u&&b&8、C# - 2016年度回答&/b&&/u&&/i&&br&&/p&&p&&i&8.1&/i&&i&赞同最多的前5个回答&/i&&/p&&p&545 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&可以用C#编程语言做哪些好玩的东西? - 知乎用户的回答 - 知乎&/a&&/p&&p&479 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&使用Visual Studio写代码有什么十分有用的神奇技巧?&/a&&/p&&p&473 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何系统掌握游戏编程中3D图形学相关的基础? - Milo Yip 的回答 - 知乎&/a&&/p&&p&416 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&c#如何进阶? - 知乎用户的回答 - 知乎&/a&&/p&&p&265 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&可以用C#编程语言做哪些好玩的东西? - steadyfield 的回答 - 知乎&/a&&/p&&p&&i&8.2&/i&&i&收藏最多的前5个回答&/i&&/p&&p&901 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&如何系统掌握游戏编程中3D图形学相关的基础? - Milo Yip 的回答 - 知乎&/a&&/p&&p&845 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&使用Visual Studio写代码有什么十分有用的神奇技巧?&/a&&/p&&p&384 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&可以用C#编程语言做哪些好玩的东西? - 知乎用户的回答 - 知乎&/a&&/p&&p&364 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&c#如何进阶? - 知乎用户的回答 - 知乎&/a&&/p&&p&290 &a href=&https://www.zhihu.com/question//answer/& class=&internal&&二本学生如何获得微软的实习机会? - 陈天宇的回答 - 知乎&/a&&/p&&p&&u&&b&更多文章,关注:&a href=&https://zhuanlan.zhihu.com/passer& class=&internal&&知乎专栏&/a&&/b&&/u&&/p&
前些日子,知乎发布了2016年度一百问: ,它涵盖了 2016 年知乎上最热门的 100 个讨论。有了问题,大家自然会想到回答,2016年度最热的回答是什么?或许对于问题,大家更愿意看到高赞/高收藏的回答。考虑到整理整个知乎社区的所有高赞…
泻药&br&&br&库:为解决某种特定需求的程序功能集合&br&插件:参与程序内部运行环节的一段或多段代码集合&br&扩展:使用程序API扩展程序适用面的一段或多段代码集合&br&组件:可重复使用并且可以和其他对象进行交互的对象&br&控件:提供或实现用户界面功能的组件,控件即组件,反之不一定。
泻药 库:为解决某种特定需求的程序功能集合 插件:参与程序内部运行环节的一段或多段代码集合 扩展:使用程序API扩展程序适用面的一段或多段代码集合 组件:可重复使用并且可以和其他对象进行交互的对象 控件:提供或实现用户界面功能的组件,控件即组件,…
&figure&&img src=&https://pic1.zhimg.com/049b8b71ed249f579f4cdb_b.jpg& data-rawwidth=&1617& data-rawheight=&1080& class=&origin_image zh-lightbox-thumb& width=&1617& data-original=&https://pic1.zhimg.com/049b8b71ed249f579f4cdb_r.jpg&&&/figure&&p&对于前端开发者来说,Chrome 浏览器绝对是开发过程中不可缺少的利器:不仅仅是因为 Chrome 自带的功能强大的 devtool,更是因为 Chrome 有着各种好用的前端语言调试工具以及诸如 EnjoyCSS、LiveReload 等这类能够提高你编码效率的强大扩展。我们就整理了十款前端开发相关的 Chrome 插件,在这里推荐给你。&/p&&p&&b&1. &/b&&b&&a href=&http://link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Vue.js devtools&/a&&/b&&/p&&p&Chrome 开发者工具扩展,用于调试 Vue.js 应用。&/p&&figure&&img src=&http://pic4.zhimg.com/3aa7aeaaef8ab_b.jpg& data-rawwidth=&1280& data-rawheight=&800& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&http://pic4.zhimg.com/3aa7aeaaef8ab_r.jpg&&&/figure&&p&&b&2. &/b&&b&&a href=&http://link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&React Developer Tools&/a&&/b&&/p&&p&React Developer Tools,可以在 Chrome 和 Firefox 开发者工具审查 React 组件的浏览器扩展。&/p&&figure&&img src=&http://pic4.zhimg.com/f57ae67cfaa1feeddbf71f_b.jpg& data-rawwidth=&667& data-rawheight=&523& class=&origin_image zh-lightbox-thumb& width=&667& data-original=&http://pic4.zhimg.com/f57ae67cfaa1feeddbf71f_r.jpg&&&/figure&&p&&b&3. &/b&&b&&a href=&http://link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/angularjs-batarang/ighdmehidhipcmcojjgiloacoafjmpfk& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&AngularJS Batarang&/a&&/b&&/p&&p&AngularJS Batarang 是适用于 Chrome 的 AngularJS WebInspector 扩展。AngularJS Batarang 是开发者工具扩展,用来调试和分析 AngularJS 应用。&/p&&figure&&img src=&http://pic3.zhimg.com/6f3596214ebb1ecd1918e6_b.png& data-rawwidth=&1600& data-rawheight=&1026& class=&origin_image zh-lightbox-thumb& width=&1600& data-original=&http://pic3.zhimg.com/6f3596214ebb1ecd1918e6_r.png&&&/figure&&p&&b&4. &/b&&b&&a href=&http://link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/ng-inspector-for-angularj/aadgmnobpdmgmigaicncghmmoeflnamj& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ng-inspector for AngularJS&/a&&/b&&/p&&p&ng-inspector for AngularJS 是一个在「检查元素」面板中显示当前页面实时 AngularJS 范围层次结构、以及它的控制器或指令与范围相关的浏览器扩展。&/p&&figure&&img src=&http://pic2.zhimg.com/07c3ffec3dafd_b.jpg& data-rawwidth=&1280& data-rawheight=&800& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&http://pic2.zhimg.com/07c3ffec3dafd_r.jpg&&&/figure&&p&&b&5. &/b&&b&&a href=&http://link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/enjoycss/gefdjidjdnjmgbipbbfkmaidbibpkfja& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&EnjoyCSS&/a&&/b&&/p&&p&EnjoyCSS 能够通过图形化的界面帮助你在线生成 CSS3 代码,可谓前端开发者的一大利器。&/p&&figure&&img src=&http://pic4.zhimg.com/a0cbb4f125b663acc3af_b.png& data-rawwidth=&1280& data-rawheight=&800& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&http://pic4.zhimg.com/a0cbb4f125b663acc3af_r.png&&&/figure&&p&&b&6.&/b&&b&&a href=&http://link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/livereload/jnihajbhpnppcggbcgedagnkighmdlei%3Fhl%3Dzh-CN& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LiveReload&/a&&/b&&/p&&p&LiveReload 会监控你指定的目录中文件,如果有文件被更改,它就自动触发浏览器刷新页面,这样我们不用每次修改文件后,都要去按下 F5 刷新页面。&/p&&figure&&img src=&http://pic1.zhimg.com/6bdb0059ddb8b0bbc150b4_b.jpg& data-rawwidth=&640& data-rawheight=&400& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&http://pic1.zhimg.com/6bdb0059ddb8b0bbc150b4_r.jpg&&&/figure&&p&&b&7. &/b&&b&&a href=&http://link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/jsonview/chklaanhfefbnpoihckbnefhakgolnmc%3Fhl%3Dja%26gl%3DJP& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&jSonView&/a&&/b&&/p&&p&很方便地帮助你验证和查看 jSON 文档。&/p&&figure&&img src=&http://pic4.zhimg.com/3b02b6fabec9c79c6b97d857_b.jpg& data-rawwidth=&1280& data-rawheight=&800& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&http://pic4.zhimg.com/3b02b6fabec9c79c6b97d857_r.jpg&&&/figure&&p&&b&8. &/b&&b&&a href=&http://link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/user-agent-switcher-for-c/djflhoibgkdhkhhcedjiklpkjnoahfmg%3Fhl%3Dzh-CN& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&User-Agent Switcher for Chrome&/a&&/b&&/p&&p&有了 User-Agent Switcher for Chrome,只需要一个浏览器插件,你可以随时更换 UA,测试网页的自适应情况,能够帮你很好地提高开发效率。&/p&&figure&&img src=&http://pic4.zhimg.com/01ce1f5e8eb_b.jpg& data-rawwidth=&1240& data-rawheight=&775& class=&origin_image zh-lightbox-thumb& width=&1240& data-original=&http://pic4.zhimg.com/01ce1f5e8eb_r.jpg&&&/figure&&p&&b&9. &/b&&b&&a href=&http://link.zhihu.com/?target=https%3A//chrome.google.com/webstore/detail/page-ruler/jlpkojjdgbllmedoapgfodplfhcbnbpn%3Fhl%3Dzh-CN& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Page Ruler&/a&&/b&&/p&&p&Page Ruler 能够帮你快速查看网页中某个具体控件或者整个网页具体尺寸的情况,,测量网页元素,再也不用打开占据大片空间的「检查元素」窗口了。&/p&&figure&&img src=&http://pic4.zhimg.com/8a8a591d02dcea1545fdf_b.jpg& data-rawwidth=&1280& data-rawheight=&800& class=&origin_image zh-lightbox-thumb& width=&1280& data-original=&http://pic4.zhimg.com/8a8a591d02dcea1545fdf_r.jpg&&&/figure&&p&&b&10. &a href=&http://link.zhihu.com/?target=http%3A//gold.xitu.io/extension/%3Futm_source%3Dextension%26utm_medium%3Dzhihu%26utm_campaign%3D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&掘金 Chrome 插件&/a&&/b&&/p&&p&对于开发者来说,比开发过程更重要的,应该要算平时对于开发资源以及技术文章一点一滴的积累了吧。那么,开发者能够在哪里获取需要的技术内容呢?&/p&&p&过去,你可能需要在 GitHub、Dribbble 等许多网站之间不停地跳转来寻找自己需要的内容,现在,有了掘金 Chrome 插件,只需要一个新标签页面,你所需要的内容,它都能够为你聚合呈现出来,绝对算得上是发现干货的利器。&/p&&figure&&img src=&http://pic3.zhimg.com/8af4df94e03ff55a2b8a_b.png& data-rawwidth=&2880& data-rawheight=&1800& class=&origin_image zh-lightbox-thumb& width=&2880& data-original=&http://pic3.zhimg.com/8af4df94e03ff55a2b8a_r.png&&&/figure&&p&不管怎么说,工具只是我们在开发过程中的辅助工具,探索好用的工具的同时,提升我们自己的开发实力才是最主要的。最后,也祝各位开发者们开发愉快!&/p&
对于前端开发者来说,Chrome 浏览器绝对是开发过程中不可缺少的利器:不仅仅是因为 Chrome 自带的功能强大的 devtool,更是因为 Chrome 有着各种好用的前端语言调试工具以及诸如 EnjoyCSS、LiveReload 等这类能够提高你编码效率的强大扩展。我们就整理了十…
&p&两年一次大更新的 iPhone,今年慢了下来。智能手表明星公司 Pebble 低价卖掉了自己。前两年最热的消费级硬件产品,今年没能带来太大惊喜。&/p&&p&但关乎我们生活细节、促成人类进步的技术没有停下脚步。&/p&&p&新技术以另外的面貌呈现,和人生活的距离更近——Snapchat 那幅酷酷的眼镜可以拍摄短片,它让“智能眼镜”以玩具的视角重新走入日常。&/p&&p&与此同时,还有更多的公司和人在推动更遥远的未来——当 SpaceX 猎鹰 9 号飞船从太空飞行归来,像倒带一样降落在巨大的海上平台时,人类太空探索的进程又前进了一步,这一步来自商业公司而非政府机构。&/p&&p&《好奇心日报》的硬件年度盘点并不局限于那些你可以买得到、摸得到的玩物,也包括大到飞机火箭、小到鞋子汽车等等一切和人类生活有关、真实存在的设备,以及他们背后的技术。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-ccec8fde0b8fae0772f2_b.jpg& data-rawwidth=&750& data-rawheight=&750& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&https://pic3.zhimg.com/v2-ccec8fde0b8fae0772f2_r.jpg&&&/figure&图片来自 Giffy&p&上榜的产品背后,都有一个关于它所处行业的新故事。它可能代表着行业转型,抑或新技术、新机会的到来。&/p&&p&我们根据团队一年来报道所覆盖的各类科技新闻,选出了超过 40 件不同的硬件产品,小到耳机、大到火箭。&/p&&p&之后,我们用下面这个标准为每样产品打分。具体的评分标准包含 5 个维度,每个维度以 10 分制打分:&/p&&ul&&li&设计突破:这里的设计包含产品外观和工业设计,一个好的设计不仅仅是你能看到的部分。&br&&/li&&li&改变行业:该硬件是否推动了一个行业的发展,甚至打破了数十年来的惰性。&br&&/li&&li&技术创新:该硬件是否有技术上的突破。它可以是新技术的研发,也可以是现有技术的巧妙应用。&br&&/li&&li&流行度:出色的硬件产品应该是被人关注的,这样它才会有更大影响和持续的发展。&br&&/li&&li&社会影响:该硬件对大众、对个人能否产生影响。&br&&/li&&/ul&&p&最后,不同生产规模的难度,以及硬件所带来的影响力是截然不同的。我们会根据硬件在各自行业的量产状态,用以上五项得分之和乘以一个权重得出总分(小规模生产减 10%;只有原型机减分 30%)。&/p&&p&最终,我们呈现了排名最靠前的这 10 个产品。&br&&/p&&b&&br&&br&猎鹰 9 号火箭:私营太空探索走在了国家前面&/b&&br&&br&&ul&&li&火箭自动飞回发射台,这是国际空间站以来最大的航天技术突破。&br&&/li&&li&进入太空变得前所未有的廉价。&br&&/li&&/ul&&p&2016 年 4 月 8 日,美国私人航天公司 SpaceX 的猎鹰 9 号火箭进行第 22 次发射。在给国际空间站补给物质之后,第一级火箭在脱离之后再次点火,以垂直的姿态“轻轻”降落在了一艘专门设计的海上驳船上。&/p&&p&自此,全世界第一款真正可以回收的运载火箭完成试验,正式登场,定名猎鹰 9 号全推力版,引起轰动。&/p&&figure&&img src=&https://pic2.zhimg.com/v2-5f1fa4e78b5d620be625a066cba91bdd_b.jpg& data-rawwidth=&750& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&https://pic2.zhimg.com/v2-5f1fa4e78b5d620be625a066cba91bdd_r.jpg&&&/figure&&p&造成轰动的原因很简单,是因为自从罗伯特·戈达德造出第一支火箭直到现在,火箭本身一直都是一次性的东西,猎鹰 9 号改变了一切。&/p&&p&早在 2012 年,SpaceX 的一枚试验火箭“蚱蜢”(Grasshopper)就在社交网络上掀起讨论。在“蚱蜢”点火起飞,之后悬停在空中,最后落在原地的视频下面,很多人表示难以置信:这是视频倒放的效果吗?&/p&&p&2015 年 12 月 21 日,猎鹰 9 号火箭进行第 20 次发射,在一次性将 Orbcomm 的 11 颗小卫星送入轨道轨道之后,火箭的第一级自动飞回了发射场附近的陆上着陆场,以垂直的状态停在了地面上。这次试验其实已经标志着猎鹰 9 号可回收火箭接近完成,而后来成功的海上回收代表着难度更大的成功。&/p&&p&猎鹰 9 号的回收技术是从“蚱蜢”试验火箭发展而来,目的是减少运载火箭的发射成本。过去,多级运载火箭在发射之后,烧光燃料的部份会落回地面变成一堆垃圾,或者沉入海底。在这些一次性的部份里面,有昂贵的液体火箭发动机,也是火箭发射成本高昂的原因之一。&/p&&p&已经退役的美国航天飞机曾经部份实现了这个功能。航天飞机的主燃料箱外挂的固体燃料燃料助推器是可以回收的,回收的方式是降落伞减速然后降落在海上。可以这么做的原因是固体燃料火箭其实类似一个大炮仗,结构简单,所以泡了海水捞起来之后还能用。&/p&&p&但火箭主发动机是昂贵而又娇气的东西。包括猎鹰 9 号火使用的梅林-1D 发动机在内,这种使用煤油-液氧燃料、采用“燃气发生器循环”工作方式的昂贵部件不管是泡水还是摔下来都会导致损坏。但猎鹰 9 号使用翼片和火箭发动机矢量推力控制的降落方式,可以让火箭第一级很温柔地垂直降落在地面上,SpaceX 甚至宣称,未来猎鹰火箭甚至可以做到降落之后不维护,检查之后重新装填燃料就可以再次发射。&/p&&p&实际上,猎鹰 9 号火箭从一开始就以商业化和低成本为目标设计。比如整个火箭家族,包括未来可以去火星的猎鹰重型火箭都只有一个型号的发动机,通过增加发动机数量的方式增加推力。这虽然增加了故障概率,但是因为生产成本更低,所以大幅拉低了发射成本。&/p&&p&按照 SpaceX 的报价,近地轨道载荷超过 22 吨的猎鹰 9 号全推力版的一次发射报价是 6200 万美元,这个价格只有美国德尔塔 4 型火箭 1.7 亿报价的 36%,也比俄罗斯质子-M 型 8000 万到一亿美元的报价更便宜。&/p&&p&回收普及后,猎鹰 9 号的发射成本会更低。&/p&&p&猎鹰 9 号火箭是美国宇航局把近地轨道业务外包给私人公司政策的成果之一,完成了过去所有国家和公司都没有完成的技术成果,甚至让 SpaceX 自己提出的火星计划变得可信很多——想要不依靠举国体制,去火星的票价得有人买得起,这件事才运行的下去。&/p&&blockquote&
设计突破:6/10&br&改变行业:10/10&br&技术创新:10/10&br&流行程度:7/10&br&社会影响:9/10&br&生产规模:量产(100%)&br&&b&总分:84/100&br&&/b&&/blockquote&&br&&b&AirPods:重构了无线耳机应该有的体验&/b&&br&&ul&&li&苹果最好的工业设计之一。&br&&/li&&li&重构了无线耳机体验的每一个细节。&/li&&/ul&&p&一年下来,三场发布会、四大产品线更新,但苹果最创新的产品是这款耳机。&/p&&p&在这之前使用一副蓝牙耳机,一般是这样的过程:对着说明书,学习耳机上的三四个按钮怎么按才能配对。接着打开手机的蓝牙设置、找到新耳机、点击连接。之后每次用完,都得想着把耳机关掉,否则拿起手机接电话时会发现没有声音。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-38fc1c716a63fc_b.jpg& data-rawwidth=&750& data-rawheight=&481& class=&origin_image zh-lightbox-thumb& width=&750& data-original=&https://pic1.zhimg.com/v2-38fc1c716a63fc_r.jpg&&&/figure&&p&&br&拿到 AirPods,这个过程被简化了。打开盒子,点一下手机屏幕上弹出的配对按钮。&/p&&p&AirPods 的每个细节都让你觉得,这可能是无线耳机该有的样子:摘下自动停止音乐播放,打来的电话正常响铃。完全没有线的束缚,用完放回收纳盒就开始充电。&/p&&br&&figure&&img src=&https://pic2.zh}

我要回帖

更多关于 海康视频服务器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信