Python优点

Python有哪些技术上的优点

1.6 Python 有哪些技术上的优点

显然,这是开发者关心的问题。如果你目前还没有程序设计背景,接下来的这些章节可能会显得有些令人费解:别担心,在本书中我们将会对这些内容逐一做出详细解释。那么对于开发者来说,这将是对Python 一些*优的技术特性的快速介绍。

面向对象

从根本上讲,Python 是一种面向对象的语言。它的类模块支持多态、操作符重载和多重继承等高级概念,并且以Python 特有的简洁的语法和类型,OOP 十分易于使用。事实上,即使你不懂这些术语,仍会发现学习Python 比学习其他OOP 语言要容易得多。

除了作为一种强大的代码构建和重用手段以外,Python 的OOP 特性使它成为面向对象系统语言如C++ 和Java 的理想脚本工具。例如,通过适当的粘接代码,Python 程序可以对C++ 、Java 和C# 的类进行子类的定制。

OOP 是Python 的一个选择而已,这一点非常重要。不必强迫自己立马成为一个面向对象高手,你同样可以继续深入学习。就像C++ 一样,Python 既支持面向对象编程也支持面向过程编程的模式。如果条件允许的话,其面向对象的工具即刻生效。这对处于预先设计阶段的策略开发模式十分有用。

免费

Python 的使用和分发是完全免费的。就像其他的开源软件一样,例如,Tcl 、Perl 、Linux 和Apache 。你可以从Internet 上免费获得Python 系统的源代码。复制Python ,将其嵌入你的系统或者随产品一起发布都没有任何限制。实际上,如果你愿意的话,甚至可以销售它的源代码。

但请别误会:”免费”并不代表”无支持”。恰恰相反,Python 的在线社区对用户需求的响应和商业软件一样快。而且,由于Python 完全开放源代码,提高了开发者的实力,并产生了一个很大的专家团队。尽管学习研究或改变一个程序语言的实现并不是对每一个人来说都那么有趣,但是当你知道还有源代码作为*终的帮助和无尽的文档资源是多么的令人欣慰。你不需要去依赖商业厂商。

Python 的开发是由社区驱动的,是Internet 大范围的协同合作努力的结果。这个团体包括Python 的创始者Guido van Rossum:Python 社区内公认的”终身的慈善独裁者”[Benevolent Dictator for Life (BDFL) ] 。Python 语言的改变必须遵循一套规范的有约束力的程序(称作PEP 流程),并需要经过规范的测试系统和BDFL 进行彻底检查。值得庆幸的是,正是这样使得Python 相对于其他语言可以保守地持续改进。

可移植

Python 的标准实现是由可移植的ANSI C 编写的,可以在目前所有的主流平台上编译和运行。例如,如今从PDA 到超级计算机,到处可以见到Python 在运行。Python 可以在下列平台上运行(这里只是部分列表):

Linux 和UNIX 系统。

微软Windows 和DOS (所有版本)。

Mac OS (包括OS X 和Classic )。

BeOS 、OS/2 、VMS 和QNX 。

实时操作系统,例如,VxWorks 。

Cray 超级计算机和IBM 大型机。

运行Palm OS 、PocketPC 和Linux 的PDA 。

运行Windows Mobile 和Symbian OS 的移动电话。

游戏终端和iPod 。

还有更多。

除了语言解释器本身以外,Python 发行时自带的标准库和模块在实现上也都尽可能地考虑到了跨平台的移植性。此外,Python 程序自动编译成可移植的字节码,这些字节码在已安装兼容版本Python 的平台上运行的结果都是相同的。

这些意味着Python 程序的核心语言和标准库可以在Linux 、Windows 和其他带有Python 解释器的平台无差别的运行。大多数Python 外围接口都有平台相关的扩展(例如,COM 支持Windows ),但是核心语言和库在任何平台都一样。就像之前我们提到的那样,Python 还包含了一个叫做Tkinter 的Tk GUI 工具包,它可以使Python 程序实现功能完整的无需做任何修改即可在所有主流GUI 平台运行的用户图形界面。

功能强大

从特性的观点来看,Python 是一个混合体。它丰富的工具集使它介于传统的脚本语言(例如,Tcl 、Scheme 和Perl )和系统语言(例如,C、C++ 和Java) 之间。Python 提供了所有脚本语言的简单和易用性,并且具有在编译语言中才能找到的高级软件工程工具。不像其他脚本语言,这种结合使Python 在长期大型的开发项目中十分有用。下面是一些Python 工具箱中的工具简介。

动态类型Python 在运行过程中随时跟踪对象的种类,不需要代码中关于复杂的类型和大小的声明。事实上,你将在第6章中看到,Python 中没有类型或变量声明这回事。因为Python 代码不是约束数据的类型,它往往自动地应用了一种广义上的对象。

自动内存管理Python 自动进行对象分配,当对象不再使用时将自动撤销对象(”垃圾回收”),当需要时自动扩展或收缩。Python 能够代替你进行底层的内存管理。

大型程序支持为了能够建立更大规模的系统,Python 包含了模块、类和异常等工具。这些工具允许你组织系统为组件,使用OOP 重用并定制代码,并以一种优雅的方式处理事件和错误。

内置对象类型Python 提供了常用的数据结构作为语言的基本组成部分。例如,列表(list )、字典(dictionary )、字符串(string )。我们将会看到,它们灵活并易于使用。例如,内置对象可以根据需求扩展或收缩,可以任意地组织复杂的信息等。

内置工具为了对以上对象类型进行处理,Python 自带了许多强大的标准操作,包括合并(concatenation )、分片(slice )、排序(sort )和映射(mapping )等。

库工具为了完成更多特定的任务,Python 预置了许多预编码的库工具,从正则表达式匹配到网络都支持。Python 的库工具在很多应用级的操作中发挥作用。

第三方工具由于Python 是开放源代码的,它鼓励开发者提供Python 内置工具之外的预编码工具。从网络上,可以找到COM 、图像处理、CORBA ORB 、XML 、数据库等很多免费的支持工具。

除了这一系列的Python 工具外,Python 保持了相当简洁的语法和设计。综合这一切得到的就是一个具有脚本语言所有可用性的强大编程工具。

可混合

Python 程序可以以多种方式轻易地与其他语言编写的组件”粘接”在一起。例如,Python 的C语言API 可以帮助Python 程序灵活地调用C程序。这意味着可以根据需要给Python 程序添加功能,或者在其他环境系统中使用Python 。例如,将Python 与C或者C++ 写成的库文件混合起来,使Python 成为一个前端语言和定制工具。就像之前我们所提到过的那样,这使Python 成为一个很好的快速原型工具;首先出于开发速度的考虑,系统可以先使用Python 实现,之后转移至C,根据不同时期性能的需要逐步实现系统。

使用简单

运行Python 程序,只需要简单地键入Python 程序并运行就可以了。不需要其他语言(例如,C或C++ )所必须的编译和链接等中间步骤。Python 可立即执行程序,这形成了一种交互式编程体验和不同情况下快速调整的能力,往往在修改代码后能立即看到程序改变后的效果。

当然,开发周期短仅仅是Python 易用性的一方面的体现。Python 提供了简洁的语法和强大的内置工具。实际上,Python 曾有种说法叫做”可执行的伪代码”。由于它减少了其他工具常见的复杂性,当实现相同的功能时,用Python 程序比采用C、C++ 和Java 编写的程序更为简单、小巧,也更灵活。

Python 是工程,不是艺术

当Python 于20 世纪90 年代初期出现在软件舞台上时,曾经引发其拥护者和另一个受欢迎脚本语言Perl 的拥护者之间的冲突,但现今已成为经典的争论。我们认为今天这种争论令人厌倦,也没有根据,开发人员都很聪明,可以找到他们自己的结论。然而,这是我在培训课程上时常被问到的问题之一,所以在此对这个话题说几句话,似乎是合适的。

故事是这样的:你可以用Python 做到一切用Perl 能做到的事,但是,做好之后,还可以阅读自己的程序代码。就是因为这样,两者的领域大部分重叠,但是,Python 更专注于产生可读性的代码。就大多数人而言,Python 强化了可读性,转换为了代码可重用性和可维护性,使得Python 更适合用于不是写一次就丢掉的程序。Perl 程序代码很容易写,但是很难读。由于多数软件在*初的创建后都有较长的生命周期,所以很多人认为Python 是一种更有效的工具。

这个故事反应出两个语言的设计者的背景,并体现出了人们选择使用Python 的一些主要原因。Python 的创立者所受的是数学家的训练,因此,他创造出来的语言具有高度的统一性,其语法和工具集都相当一致。再者,就像数学一样,其设计也具有正交性(orthogonal ),也就是这门语言大多数组成部分都遵循一小组核心概念。例如,一旦掌握Python 的多态,剩下的就只是细节而已。

与之相对比,Perl 语言的创立者是语言学家,而其设计反应了这种传统。Perl 中,相同任务有很多方式可以完成,并且语言材料的交互对背景环境敏感,有时还有相当微妙的方式,就像自然语言那样。就像著名的Perl 所说的格言:”完成的方法不止一种。”有了这种设计,Perl 语言及其用户社群在编写代码时,就一直在鼓励表达式的自由化。一个人的Perl 代码可能和另一个人的完全不同。事实上,编写独特、充满技巧性的代码,常常是Perl 用户之间的骄傲来源。

但是,任何做过任何实质性的代码维护工作的人,应该都可以证实,表达式自由度是很棒的艺术,但是,对工程来说就令人厌恶了。在工程世界中,我们需要*小化功能集和可预测性。在工程世界中,表达式自由度会造成维护的噩梦。不止一位Perl 用户向我们透漏过,太过于自由的结果通常就是程序很容易重头写起,但修改起来就不是那么容易了。

考虑一下:当人们在作画或雕塑时,他们是为自己做,为了纯粹美学考虑。其他人日后去修改图画或雕像的可能性很低。这是艺术和工程之间关键的差异。当人们在编写软件时,他们不是为自己写。事实上,他们甚至不是专门为计算机写的。而实际上,优秀的程序员知道,代码是为下一个会阅读它而进行维护或重用的人写的。如果那个人无法理解代码,在现实的开发场景中,就毫无用处了。

这就是很多人认为Python *有别于Perl 这类描述语言的地方。因为Python 的语法模型几乎会强迫用户编写可读的代码,所以Python 程序会引导他们往完整的软件开发循环流程前进。此外,因为Python 强调了诸如有限互动、统一性、规则性以及一致性这些概念,因此,会更进一步促进代码在首次编写后能够长期使用。

长期以来,Python 本身专注于代码质量,提高了程序员的生产力,以及程序员的满意度。Python 程序员也变得富有创意,以后就知道,语言本身的确对某些任务提供了多种解决办法。不过,本质上,Python 鼓励优秀的工程的方式,是其他脚本语言通常所不具备的。

至少,这是许多采用Python 的人之间所具有的共识。当然,你应该要自行判断这类说法,也就是通过了解Python 提供了什么给你。为了帮助你们入门,让我们进行下一章的学习吧。

简单易学

这一部分引出了本书的重点:相对于其他编程语言,Python 语言的核心是惊人的简单易学。实际上,你可以在几天内(如果你是有经验的程序员,或许只需要几个小时)写出不错的Python 代码。这对于那些想学习语言可以在工作中应用的专业人员来说是一个好消息,同样对于那些使用Python 进行定制或控制系统的终端用户来说也是一个好消息。如今,许多系统依赖于终端用户可以很快地学会Python 以便定制其代码的外围工具,从而提供较少的支持甚至不提供支持。尽管Python 还是有很多高级编程工具,但不论对初学者还是行家高手来说,Python 的核心语言仍是相当简单的。

名字来源于Monty Python

Python 名字的来源这不算是一项技术,但是,这似乎是令人很惊讶、保护得很好的秘密,而我们希望把它全盘托出。尽管Python 世界中都是蟒蛇的图标,但事实是,Python 创立者Guido van Rossum 是以BBC 喜剧Monty Python’s Flying Circus 来命名的。他是Monty Python 的大影迷,而很多软件开发人员也是(事实上,这两个领域似乎有种对称)。

这给Python 代码的例子加入一种幽默的特质。比如,一般来说,传统常规的变量名为”foo “和”bar “,在Python 的世界中变成了”spam “和”eggs “。而有时出现的”Brian “、”ni “、”shrubbery “等也是这样来的。这种方式甚至很大程度上影响了Python 社区:Python 会议上的演讲往往叫做”The Spanish Inquisition “。

当然,如果你熟悉这个幽默剧的话,所有这些你都会觉得很有趣,否则就没那么有意思了。你没有必要为了理解引自Monty Python (也许本书中你就会找到)的例子而刻意去熟悉这一串剧情,但是至少你现在应该知道它们的来源。

NAS服务器和文件服务器区别

NAS服务器和文件服务器各方面优劣对比,现在市面上出现了很多的NAS服务器品牌,看来这个市场还是很有前景的,今天我们就对普通的文件服务器及NAS服务器做一下简单的对比。
网络附加存储(NetworkAttached Server,缩写为NAS)将储存设备连接到现有网络上,提供数据和文件服务。与客户通信通常采用NFS、CIFS协议。
NAS服务器和文件服务器的对比
文件服务器主要任务则是为网络上的计算机提供多样化的服务,如在文件共享及处理、网页发布、FTP、电子邮件服务等方面有明显的优势,这主要得益于文件服备器通常是采取高性能的CPU,与NAS相比它在数据备份、数据安全等方面并不占优势,原因有以下几点:
1)文件服务器进行备份时,备份文件和原始文件一起存放在同一套系统中,无法分担风险,特别是防止灾难性后果的发生;
2)文件服务器因要提供多样化的服务,从而造成自身安全性不足,任何一处服务的漏洞都可能遭受黑客的攻击而导致数据的泄露或者丢失;
3)文件服务器自身操作系统的不稳定性会影响数据的安全性;
4)文件服务器的备份工作需要专业人员进行操作,必须有良好的备份意识,并且需要对机器进行定期维护;
5)文件服务器易受计算机病毒影响;
6)不能实时备份客户端操作系统,若客户端计算机正在使用则不能进行操作系统的备份工作;
7)耗电发热量大,一台文件服务器的整机功耗大约在300~400W之间,故此也造成文件服务器对工作环境要求比较高。
由此可以看到,文件服务器虽然能提供备份的功能,但却存在很多不安全的因素。而NAS则是为存储备份而优化的系统
小结:
如果你是家庭或小企业,对文件共享及备份的需求,数据湾建议使用NAS服务器,这可以低成本有效的共享文件,备份文件。但如果你企业有一定规模,建议使用NAS及Windwos服务器协同使用,Widnwos 的活动目录可以有效的,跨系统的为整个企业提供高效的用户管理方案。可能初期投入成本较高,但在提高企业整体的工作效率,提高企业的职员因IT管理不到位,而带来不必要的经济损失,这种损失是看不见的。其实大家看看为什么那些大企业,跨国企业会投入那么高的成本来建设IT系统,就是可有效的提高工作效率,从而实现长时间的降低运营成本。

大麦云原生边缘计算探索,让观众剧院看戏也能实现个性化

1、背景

近年来,我国文化产业蓬勃发展,文化产业价值年均增速远高于同期 GDP 增速,尽管中 国演出市场在开放竞争中逐步规范有序,但目前仍处于起步和培育阶段,尚不够完善和成熟。尤其在演出场馆基础设施、管理运营等方面参差不齐。

一方面,国内大规模兴建剧场,但是却不重视开展剧场相关管理和服务标准的建立,造成目前中国的剧场硬件设施世界一流,管理与服务却远落后于发达国家。另一方面,随着现场演出形式的变化,兴起了许多独特的演出场地。当前,对场馆的精细化、分层运营已经成为促进现场服务升级的核心抓手。

2、痛点

演出场馆的基础设施、热门 IP 等诸多因素都可能导致演出现场出现无网或弱网问题,在这种情况下如何保障核验、摄像头监控等现场服务可用是技术首先要解决的问题。

面向 AI 与 IoT 结合为代表的未来发展方向,通过收集海量数据形成的消费者/用户画像可以使终端设备更加智能、更为“主动”地为消费者提供个性化服务。需要对现场类型众多、形态不一的智能设备形成通信互联、数据共享、能力互通的“联合体”,为用户提供智能场馆服务。如何保证海量数据处理的时效性和有效性,是面向业务发展要解决的问题。

%title插图%num

目前,在无网和弱网的现场环境下提供现场服务是通过单机应用部署的方式,面临的问题 如下:

  1. 为保障单机应用服务可用、可靠需要在本地搭建集群;
  2. 同样的业务逻辑,本地和云端研发体系不统一,导致架构冗余、研发效率低、发布周期长,降低了业务的迭代效率。%title插图%num

    ①IDC 服务和本地服务代码级复用低;

    ②本地服务单机部署,无高可用性保障;

    ③本地服务依赖本地数据库,跟 IDC 数据库结构可能不一致。

     

    针对新型的场馆的智能服务需求,譬如 LIVEHOUSE,基于现场观演人群定向提供个性化服务,现有的计算架构在数据时效性和有效性方面不足以支撑。

    3、解决方案

    基于上述的痛点,现场的整体解决方案,从有效支持 12 个月内的业务和运营的发展,具有 6 个月内创造和技术*的可能性,及加速研发同学专业化能力的聚焦沉淀和创新孵化,降低体力劳动强度。

    1. 边缘计算

    边缘计算是网络中*靠近物或数据源头融合网络、计算、存储、应用核心能力的分布式开放平台,就近提供边缘智能服务。在更靠近终端的网络边缘上提供服务是边缘计算*大的特点。在数据处理的时效性与有效性方面成为云计算的有力补充。对于这样的设计,能满足大麦现场业务在智能核验、设备管控、业务监控等方面的关键需求。

    %title插图%num阿里云边缘云原生的产品化落地——ACK@Edge(云边一体的云原生标准 k8s 托管服务), 支持海量边缘网关节点接入,深度融合 IoT 云端市场、云端 FaaS、消息、运维等服务,提供针 对边缘实例的 DevOps 能力,*大的提升边缘的应用分发及部署运维的效率。

    为了让现场更简单、业务更高效,需要将原来单机应用+ IDC 的集中式部署架构,演进到 云+边缘计算的统一架构,这就需要我们能够有一种方式来统一管理 IDC 应用服务器和现场众多的边缘节点。通过边缘 k8s 架构,统一管理云与边缘的节点,实现了应用发布和弹性扩缩容的统一。通过弹性能力节省机器成本;现场终端就近访问边缘节点,解决现场弱网/无网、现场 视频监控端到端的网络延迟等诸多问题。

    2. 云边端协同

    云计算与边缘计算是现场数字化转型的两大重要支持。云计算与边缘计算在技术定义上具 有差别,使他们所使用的场景有所差异。云计算适用非实时、长周期数据、业务决策场景,边缘计算在实时性、短周期数据、本地决策等场景方面表现更为优异。因而,娱乐现场数字化转 型需要云计算与边缘计算的支持。

    阿里云在两大边缘计算领域 CDN 和 IoT 深耕已久,边缘规模和业务复杂度的日益攀升带来了不小的效能问题。阿里云容器服务和 IoT 业务团队联合推出 Kubernetes Edge 定制版本,作为 云上 IoT 边缘托管服务底座,支持海量边缘网关节点接入,深度融合 IoT 云端市场、云端 FaaS、 消息、运维等服务。在这个过程中在这个过程中,云原生让 IoT 托管如虎添翼。在大麦现场业务中尝试使用,如图 2 所示云边端分层结构也日益显现。

    %title插图%num①本地和云端应用统一容器化部署运行环境;

    ②适配不同的网络环境,终端灵活选择本地或云端服务;

    ③边缘节点优先处理过程数据计算,核心业务数据同步云端。

    %title插图%num

  3. 4、未来随着 5G 技术的广泛应用、云计算与边缘计算在数字化转型的支持,加快了数字技术在文娱行业现场服务领域的应用。譬如无纸化、人脸识别等智能核验、智能泊车、客群识别等技术逐渐成为智慧娱乐现场新标配。在用户需求不断提升及产业服务不断完善的背景下,未来以安全可靠、优质体验和全链路服务建立的服务平台构筑大麦的行业壁垒。

服务器伪装信息修改法

测试的服务器:redhat7.0,redhat7.1,mandrake7.1

本文主要讨论linux服务器的伪装,对于Sun、hp等可以查找相关资料,本文只提供思路。

前言:为什么要伪装?

动物伪装,为了逃避天敌,或为了更好的获取猎物。

人伪装,使你不知他的底细。

服务器伪装,目的是要使攻击者很难搜集到服务器真正的信息,使他的进一步攻击造成难度,进而起到一定的保护作用,当然还有更深的用法,等着你去发现。

正文:

1. Telnet信息伪装

首先看一次telnet过程:

[yxg@localhost yxg]$ telnet xx.xx.xx.xx

Trying xx.xx.xx.xx…

Connected to xxxx.

Escape character is ^].

Red Hat Linux release 7.1 (Seawolf)

Kernel 2.4.2-2 on an i686

login:

从中可以看到操作系统为Red Hat Linux release 7.1,内核版本2.4.2-2,计算机为:intel686。攻击者得到这些信息就可以用相应的攻击程序。所以我们不能告诉他们真正的情况。

telnet信息存放于/etc/issue.net

[root@database /etc]# cat issue.net

Red Hat Linux release 7.1 (Seawolf)

Kernel 2.4.2-2 on an i686

修改它成为你想要的任何字符,甚至什么也不要。

我的改为Sun的提示:

[yxg@localhost yxg]$ cat /etc/issue.net

SunOS 8.0

要注意必要的空行,改完和伪装的对象比较,直到一模一样才行。

对于本机的用户,提示信息在/etc/issue,改不改随你。

注意:如果你想重启后issue.net内容不变,修改/etc/rc.local,在这些行前加#

# This will overwrite /etc/issue at every boot. So, make any changes you

# want to make to /etc/issue here or you will lose them when you reboot.

# echo “” > /etc/issue

# echo “$R” >> /etc/issue

# echo “Kernel $(uname -r) on $a $SMP$(uname -m)” >> /etc/issue

# cp -f /etc/issue /etc/issue.net

# echo >> /etc/issue

2. ftp信息伪装

现在有很多对于wu-ftp的攻击程序,所以我就拿wu-ftp作例子。

先看一下ftp的过程:

[yxg@localhost yxg]$ ftp xx.xx.xx.xx

Connected to xxxx.

220 database FTP server (Version wu-2.6.1-16) ready.

如果想要不显示出wu-ftp,可以有多种方法。

其一:

察看in.ftpd就能发现版本号写在了程序中

[root@database /root]# strings /usr/sbin/in.ftpd

………………….

/var/log/lastlog

Could not write %.100s: %.100s

Version wu-2.6.1-16

你可以用16进制编辑器修改版本的字符串,改为proftp什么的,保准有人会上当。

其二:

/etc/ftpaccess里有两个参数

指示参数:greeting full | brief | terse

greeting text

允许控制远程用户登陆进来以后,给用户多少信息及信息内容。

banner

banner消息是在用户名和密码以前显示给用户的。

3. 修改telnet和ftp的默认端口号

有很多扫描器并不是逐个端口扫描的,所以来个乾坤大挪移来使扫描失效。

具体是修改/etc/services 或者是/etc/inetd.conf。

4. 操作系统指纹伪装

nmap等扫描器能通过操作系统指纹判断操作系统类型,所以我们要采取一些策略保护自己。现在有一些工具可以修改操作系统指纹,像fpf等,fpf可以在www.xfocus.org下载,它是一个lkm,加载到内核中,可以模拟很多操作系统。当然你可能要对源程序进行修改,也可以加入一些新的功能,如自动隐藏等。

5. 改装uname

如果不幸被一个攻击者闯入,它可以用uname来获取真正的操作系统信息,然后来个本地溢出,你就哭吧。

所以我们要修改uname的源程序,使它显示我们想要它显示的内容。

打开uname.c,找到如下行:

print_element (PRINT_SYSNAME, name.sysname);//操作系统名如linux

print_element (PRINT_NODENAME, name.nodename);//主机名

print_element (PRINT_RELEASE, name.release);//发行版本,如:2.2.16-22

print_element (PRINT_VERSION, name.version);//

print_element (PRINT_MACHINE, name.machine);//机器类型,如i686

print_element (PRINT_PROCESSOR, processor);//处理器类型

知道怎么改吧,不知道?提示一下,如果要显示操作系统为SunOS,替换*行为:

print_element(PRINT_SYSNAME,”SunOS”);

编译后,运行./uname –s,就会显示SunOS

当然你应该把每一项都进行修改,使人看不出破绽。

*后把改好的uname拷到/bin目录。

我在修改时还加了一个-Y的参数,目的是显示真正的信息,给自己看的。默认显示修改过的信息。

6. 其他一些杂项

建议你尽量关掉不必要的服务,对于开放的其他服务要仔细检查,使它不至于有泄密的信息。

不同操作系统的shell提示符也不太一样,尽量修改的和伪装目标一致。

结束语:

当然,要想保证服务器安全,这一点是远远不够的,它只能减小被攻击成功的概率。

iOS App上架流程

一、前言:
作为一名iOS开发者,把开发出来的App上传到App Store是必须的。下面就来详细介绍一下具体流程。

二、准备:
一个已付费的开发者账号(账号类型分为个人(Individual)、公司(Company)、企业(Enterprise)、高校(University)四种类型,每年资费分别为$99、$99、$299、免费。)。
一个已经开发完成的项目。
三、检查:
你的Xcode必须是正式版的,beta版本的Xcode是不能上传项目的。
请确认你安装的Xcode是从App Store或者是开发者网站下载的,而不是从其它渠道获取的安装包安装的,因为非官方途径下载的Xcode可能带有XcodeGhost 病毒。如何检查?

检查方法

四、生成发布证书
打开苹果开发者中心:https://developer.apple.com
打开后点击:Member Center

1.苹果开发者中心

下面输入已付款过的Apple账号和密码登录(如果你的电脑已经保存了密码,会直接进入)

开发者登录账号
2.点击:Certificates, Identifiers & Profiles (专门生成证书,绑定Bundle Id,绑定device设备,生成描述文件的地方)

Member Center
3.点击Certificates生成证书

(1)选择iOS, tvOS, watchOS
(2)选择All
(3)点击右上角新添加证书

添加新证书1
(4)由于是做App上传,选择生产证书(选择App Store and Ad Hoc)

选择App Store and Ad Hoc

注意:一个开发者账号只能创建(1-2个开发(测试)证书,2-3个生产(发布)证书),如果你的App Store Ad Hoc 前面的按钮不能选择,则代表你的这个账号无法再创建新的生产证书了。
解决方法:

从共同使用这个账号的人电脑上生成.p12文件,导入自己的电脑。(尽量不要执行下面第2步)
如果你想生成的话,把现有的删除一个(建议删除时间比较靠前的)。注意:如果删除一个证书,那么正在使用这个证书的人将不能再使用了,除非重新生成,然后利用.p12重新导入自己的电脑里!
注意:如果你想删除证书,执行下面步骤,否则略过。

删除证书
然后接上上图,生产证书部分继续

生成证书2

生成证书3

生成证书4
5.上传CSR文件去获取证书(CSR文件需要我们到本机钥匙串里去创建)

(1)在Launchpad的其他里面,点击钥匙串访问弹出如下界面

其他

钥匙串访问
(2)工具栏选择钥匙串访问->证书助理->从证书颁发机构请求证书…

请求证书

证书信息
(3)将CSR文件保存到MAC磁盘的某个位置(这里我选择的是桌面,进行存储)

存储证书

点击完成

CertificateSigningRequest.certSigningRequest 文件
6.然后回到浏览器,点击choose File..

选择CSR文件
7.选择创建好的:CertificateSigningRequest.certSigningRequest 文件,点击选取

选取CSR文件

点击Generate上传证书

上传CSR证书
8.跳转到如下界面,点击 DownLoad 下载生成的证书(cer后缀的文件),然后点击Done,你创建的发布证书就会存储在帐号中。

下载生成的证书

cer后缀的文件
注意:这个证书只能下载一次。点击下载后,关闭页面后就不能再回到下载页面了。
如果不需要给别的电脑使用,则直接跳过下面附加项,跳转到第五步(绑定Bundle Identifier)

附加项:生成p12文件在其他电脑上使用这个发布证书
双击安装证书后,打开钥匙串访问,选择安装的证书右键单击

1.安装的发布证书

注意:如果没有导出,可以把这个证书删除,然后重新双击下载的证书文件安装。
导出证书

导出证书
2.存储证书

存储导出的证书

注意:存储的文件格式一定要是.p12
3.设置密码
可以为证书设置密码,也可以不设置密码;如果设置了密码,那么别人安装这个证书的时候就要输入密码,否则无法安装。这里就不设置密码了。

设置密码
4.保存导出的证书

p12发布证书

如果需要在其它电脑上也能发布App,那么就必须要安装这个发布证书。
五、创建App IDs和绑定你的App的Bundle Identifier
回到刚才的页面:https://developer.apple.com/account/ios/identifiers/bundle/bundleList.action

1.点击App IDs,进入如下界面,点击右上角的 + 号

2.点击App IDs
填写App IDs和Bundle Identifier

填写App IDs和Bundle Identifier

注意:

1.上传App使用的Bundle Identifier(不要有-,都是英文+数字)必须是固定的,不能使用占位符。
2.如果你的Bundle Identifier已经在网站上绑定了,如果你又修改了你工程里面这个Bundle Identifier的话,需要重新进入到开发者账号里面绑定。

修改工程的Bundle Identifier

下面选择App中包含的服务,默认有两项,其余的根据自己项目的需求进行选择

App Services
3.点击continue

4.点击Register

5.点击Done

六、生成描述文件(描述文件的作用就是把证书和Bundle Identifier关联起来)
1.找到Provisioning Profiles ,点击All,然后点击右上角 + 号

2.Provisioning Profiles
因为是发布,所以选择下面App Store这个描述文件,点击Continue

选择App Store
3.在App ID 这个选项栏里面找到你刚刚创建的:App IDs(Bundle Identifier) 类型的套装,点击Continue

选择发布项目的Bundle Identifier
4.选择你刚创建的发布证书(或者生成p12文件的那个发布证书),根据自己电脑上的发布证书日期来选择,点击Continue

选择创建的发布证书
5.在Profile Name栏里输入一个名字(这个是PP文件的名字,可随便输入,在这里我用工程名字,便于分别),然后点击Generate

给描述文件起个名字
6.Download生成的PP文件,然后点击Done,双击安装(闪一下就完事了,没其它效果)

Download生成的PP文件

生成的描述文件
六、在App Store开辟空间
1.回到Member Center,点击iTunes Connect

点击iTunes Connect
2.登录开发者账号(还是之前已付费的账号)

Snip20160315_68.png
3.登录成功后,点击我的App

点击我的App
4.点击左上角那个+号,点击新建(注意:我们是iOS App开发,不要选Mac App啦)

新建 App
5.依次按提示填入对应信息(SKU是公司用于做统计数据之类的id,根据公司需求填写),然后点击创建

填写App信息

注意:如果都填好以后,可能会告诉你,你的App名称已经被占用,那么不好意思,你只能改名了!(而且建议大家起名不要往比较出名的App上靠,否则审核可能会被拒*)

6.填写App其它信息

App信息
7.填写价格和销售范围(由于我的开发者账号没有签订纳税合同,所以不能上线收费应用,所以只能暂时免费)

填写价格和销售范围
8.依次把不同尺寸的App截图拉入到对应的里面
需要填写不同尺寸的手机屏幕截图(也就是拿不同尺寸的模拟器运行后,挑出至少3页*多5页进行截图然后拖到响应的区里)(在模拟器Command+S 就可以保存屏幕截图到桌面了)(注意:如果提示拖进去的图片尺寸不对,则把模拟器弄成100%然后再Command 加 S) 尺寸参照表在下面

设置不同尺寸的App截图

尺寸参照图

9.填写App简介

10.按提示依次输入

错误提示:如果上传App 图标失败,提示Alpha错误的话,看下面。
打开你的图标图片,勾掉这个

勾掉这个
11.点击分级后面的编辑,如实填写后,点击完成

分级信息
12.填写审核信息

版本发布就是:(然后*下面选择自动发布的话就是如果审核通过,就自动上传到App Store供人下载)

13.此时这个构建版本还没有生成,我们先把基本信息填写完毕,然后再进入Xcode中把项目打包发送到过来。
注意:填写完一定要点击右上角的保存。

七、在Xcode中打包工程
找到你刚刚下载的发布证书(后缀为.cer)或者p12文件,和PP文件,双击,看起来没反应,但是他们已经加入到你的钥匙串中。

1.在Xcode中选择iOS Device(这里不能选择模拟器),按照下图提示操作

选择iOS Device
2.如果你的应用不支持横屏,把这两个勾去掉

3.查看版本号和构建版本号

4.配置发布证书

注意:如果这里没有黄色叹号,代表你的配置没问题,如果有,那就是证书和描述文件不匹配,或者描述文件里刚才选的Bundle和现在的工程的Bundle Identifier不一致,去develop.apple.com 上找到你的描述文件在确认下绑定的bundle Identifier和你工程是不是一样的?

检查
5.将断点、全局断点,僵尸模式等都要去掉。

6.设置Release模式(Debug是测试的,Release是发布用的)

7.选择 Xcode下 Product 下 Archive(专门用于传项目,或者打包项目)

选择Archive

8.出现下图说明你没有添加开发者账号,点击右下脚Add… 按钮就可以添加

没有添加开发者账号
9.输入付费的开发者账号

输入开发者账号

可能会弹出下面这个界面,如果不弹出,按Command加。

10.然后回到Archive(选择已付费的账号),然后点击Choose

选择已付费的账号

然后等待

等待
11.选择Upload提交

Upload提交
12.如下就代表上传成功,如果出错,请参照iOS App上传项目遇到的问题

上传成功
13.返回ItunesConnect网站上你自己的App信息中查看一下

14.在这个构建版本这里就可以添加代码

点击+号之后选择代码版本

添加构建版本
15.提交以供审核

16.App已经从准备提交,变成正在等待审核状态

正在等待审核状态

Python技术栈

Python后端技术栈

Happiness is a way of travel. Not a destination.

幸福是一种旅行方式。 不是目的地。

1.导航
1.1Python 语言基础
1.语言特点

2.语法基础

3.高级特性

1.2算法与数据结构
1.常用算法和数据结构

2.分析时间和空间复杂度

3.实现常见数据结构和算法

1.3编程范式
1.面向对象编程

2.常用设计模式

3.函数式编程

1.4操作系统
1.常用 Linux

2.进程和线程

3.内存管理

1.5网络编程
1.常用协议 TCP、IP、HTTP

2.Socket 编程基础

3.Python 并发库

1.6数据库
1.MySQL 数据库、索引优化

2.关系型和 NoSQL 的使用场景

3.Redis 缓存(常用的数据类型以及使用场景,底层实现了解会更好)

1.7Python Web框架
1.常用框架的对比,使用 Restful

2.WSGI 原理

3.Web 安全的问题

1.8系统设计
1.设计原则,如何分析

2.后端系统常用的组件(缓存、数据库、消息队列等等)

3.技术选型和实现(短网址服务、Feed 流系统)

1.9技术之外的软实力
1.学习能力

2.业务理解能力,沟通交流能力

3.心态

2.0小扩展-STAR模型
在生活中描述一件事情或者是在面试中描述项目经验,如何让我们的语言更加有条理,逻辑性?可以采用如下的模型进行梳理。

情境(situation)

什么情况下发生的

任务(task)

你是如何明确你的任务的

行动(action)

采取了什么样的行动

结果(result)

结果怎么样?学到了什么?

2.技术栈详解
2.1 Python 语言基础
2.1.1 Python 语言特性
Python 是动态强类型语言,很多人都误认为是弱类型语言,其实是错误的。

动态是指在运行期确定类型(静态则是在编译期确定类型)。强类型指的是在没有强制类型转化前,不允许两种不同类型的变量相互操作(也就是不会发生隐式类型转换)。

2.1.2 Python 作为后端语言的优缺点
为什么使用 Python ?

答:它是一门胶水语言,轮子多,应用广泛;语言灵活,生产力高,是一些创业公司以及外包项目节省时间的首选语言。但是在使用的时候,需要考虑到性能的问题,代码维护问题,以及2和3版本的兼容问题。

2.1.3 Python 其他的重要知识点
鸭子类型简单介绍

曾有一个生动的例子来描述鸭子类型:当看到一只鸟,如果它走起来像鸭子、叫起来像鸭子,游泳的时候也像鸭子,那么我们就称这只鸟是鸭子。它的关注点在对象的行为,而不是类型。比如一些常用对象 file、StringIO、socket 都支持 read/write 方法,我们可以看做类似的对象 file like object;再举个例子,在 Python 中实现了 iter 魔法方法的对象都可以用 for 迭代。

什么是 monkey patch ?

答:所谓的 monkey patch 就是运行时的属性替换。比如我们常用的一个并发库 gevent ,需要将内置的 socket 修改为非阻塞。我们在使用的时候,用到如下的代码:

from gevent import monkey

打补丁,让gevent框架识别耗时操作,比如:time.sleep,网络请求延时
monkey.patch_all()
什么是自省?

答:自省就是在运行时判断一个对象的类型的能力。我们可以通过 type、id和 isinstance 等方法获取对象类型的信息。Inspect 模块提供了更多获取对象信息的函数。

什么是列表和字典推导式?

列表生成式:

my_list = [i for i in range(10) if i % 2 == 0]
字典推导式:

dict1 = {k: v for k, v in zip(a, b)}
特殊的情况:将列表推导式的方括号修改为小括号的时候,会返回一个生成器。

2.1.4 Python 之禅
The Zen of Python 便是著名的Python 之禅,它是由 Tim Peters 编写的关于 Python 编程的准则,我们可以使用下面的代码进行查看:

import this
我们在编程的过程中,如果拿不准的时候可以进行一个参考。

2.2 Python2 和 Python3 的差异
2.2.1 Python2/3 差异
Python3 中做了一些改进,我们需要了解。比如 print 成为了函数;还有编码的问题,Python3 中不再有 Unicode 对象,默认 str 就是 Unicode;除法也有所变化,比如 Python3 除法返回的是浮点数。

Python2 里面是没有类型申明的,Python3 中我们可以添加一个类型注解(type hint),帮助 IDE 实现类型提示以及类型检查(mypy)。Python3 中优化的 super() 方便直接调用父类函数。Python3 中还有一些高级的解包操作,如下面示例:

a, b, *rest = range(10)
上面会将0赋值给 a,将1赋值给 b,然后将剩下的赋值给 rest。

类型检查示例:

In [2]: def fuction(name: str): return ‘hello’ + name
In [3]: fuction(‘Ethan’)
Out[3]: ‘helloEthan’
Python3 限定关键字参数。也就是函数在传参的时候,我们可以通过关键字参数方式,指定参数名传参,避免参数太多时候搞混。

Python3 中重新抛出异常不会丢失栈信息,方便我们去排错(在 Python2 中如果在一个异常中 raise 一个异常,原来的异常就会丢失,Python3 中支持 raise from,保留异常栈信息)。

Python3 中一切都是返回迭代器,比如 range/zip/map/dict.value/etc. are all iterators。

2.2.2 Python3 新增
1.yield from 链接子生成器

2.asyncio 内置库, async、await 原生协程支持异步编程

3.新的内置库 enum(枚举),mock(单测时用),asyncio, ipaddress (处理ip地址)等等。

2.2.3 Python3 改进
1.生成的 pyc 文件统一放到 __pycache__文件夹下。

2.一些内置库的修改。如 urllib,selector(支持select、epoll等Linux底层的一些封装,方便我们统一做一些接口,实现异步IO) 等。

3.一些性能的优化,比如 dict。

2.2.4一些兼容2、3的工具

six 模块。

2to3 等工具转换代码。(脚本工具,将 Python2 转换为 Python3 代码)

__future__模块。在 Python2 中使用 Python3 的函数功能可参照如下代码:

from future import print_fuction
2.3 Python 函数
2.3.1 Python 如何传递参数?
答:Python 其实不是引用传递也不是值传递,而是共享传参(函数形参获得实参中各个引用的副本)。简单的理解一下:

我们在每一次传递参数的时候,形参和实参都指向同一个对象,这样就叫做对象传递,既不是拷贝了一个值,也不是直接去操作这块内存,但是它的结果有两个。对于可变对象来说,我们直接去修改它,对于不可变对象来说,表现就好像 copy 了一个值,然后去修改新的值。

不可变对象好像是传值,可变对象好像是传引用。但是实际是不同的。

2.3.2 Python 可变/不可变对象
1.可变对象:bool、int、float、tuple、str

2.不可变对象:list、set、dict

可变对象作为默认参数的时候,注意默认参数只计算一次。

2.3.3 Python 中 *args 和 **kwargs
函数传递中,他们处理可变参数。如果使用 *args那么会将所有的参数打包成一个 tuple 对象。 **kwargs 则是将所有的关键字参数打包成一个 dict 对象。

2.4 Python 异常机制
2.4.1什么是 Python 的异常?
答:异常就是一种错误处理机制。所有的异常都继承自 BaseException 。举几个和系统相关的异常:SystemExit、KeyboardInterrupt、GeneratorExit(生成器退出的异常)。还有一个异常的基类就是 Exception。

2.4.2使用异常的常见场景
答:网络请求(超时、连接错误);资源访问(权限问题、资源不存在);代码逻辑(越界访问、KeyError等)。

2.4.3处理异常
try:
# 可能会抛出异常的代码
except (Exception1, Exception2) as e:
# 异常处理代码
else:
# 异常没有发生时代码逻辑
finally:
# 无论异常有没有发生都会执行的代码,一般处理资源的关闭和释放。
2.4.4如何自定义异常
1.继承自 Exception 实现自定义异常(想想为什么不是 BaseException)

可以通过查看异常的等级信息,发现如果继承自顶级父类,那么一些常用的异常也没有了,自己需要定义的异常就太多太多,耗费时间。

2.可以给异常加上一些附加信息。

3.通常都是处理一些和业务相关的特定异常(raise MyException)

2.5 Python 性能分析与优化
Python 作为一门脚本语言来说,它的性能一直被诟病。并且由于存在一个臭名昭著的 GIL 导致没有办法充分利用多核,这都限制了 Python 的性能。

2.5.1什么是 CPython GIL?
GIL (Global Interpreter Lock)

1.CPython 解释器的内存管理并不是线程安全的,存在多个线程时,有可能会出现同时修改同一对象,这样容易出现问题。

2.为了保护多线程情况下对 Python 对象的访问,CPython 使用了简单的锁机制避免多个线程同时执行字节码。

缺陷便是没有办法同时利用 CPU 的多核,只有一个线程执行字节码。对于 CPU 密集型的程序来说,影响会比较大。

2.5.2 GIL 的影响
限制了程序的多核执行。

1.同一个时间只能有一个线程执行字节码

2.CPU 密集型程序难以利用多核优势。

3.IO 期间会释放 GIL ,对 IO 密集型程序影响不大。

2.5.3如何规避 GIL 的影响
1.CPU 密集型可以使用多进程 + 进程池的方式充分的利用多核。

2.IO 密集型可以使用多线程或者是协程。

3.使用 cython 扩展(将 Python 程序转化成 C 代码的一个扩展)。

2.5.4 GIL 的实现
CPython 中才会有 GIL ,其他的解释器是没有的。底层的代码逻辑是设置一个ticker,每执行多少个字节码的时候,去检查当前是否有全局解释器锁,如果有那么执行函数释放,让其他的线程去执行;如果没有,就重新获取锁。通俗一点就是每隔一段时间,就会尝试去释放当前线程的锁,让其他线程获取锁并去执行。

2.5.5为什么有了 GIL 之后,还要关注线程安全?
Python中什么操作才是原子的?一步到位执行完的。

1.一个操作如果是一个字节码指令可以完成的就是原子的。

2.原子的是可以保证线程安全的,非原子操作不是线程安全的。

3.使用 dis 操作来分析字节码。

import dis

def update_list(l):
l[0] = 1

dis.dis(update_list)
2.5.6如何剖析程序性能
使用各种 profile 工具(内置或第三方)

1.遵循二八定律,其实大部分的时间耗时在少量的代码上。

2.通过内置的 profile 和 cprofile 等工具衡量程序的运行时间。

3.对于 web 应用来说,使用 pyflame(uber开源) 的火焰图工具分析产品的性能。

2.5.7服务端性能优化措施
web应用一般语言不会成为瓶颈。可以采用如下的一些优化措施:

1.数据结构和算法优化。

2.数据库层:索引优化、慢查询消除、批量操作减少IO、NoSQL的使用。

3.网络IO:批量操作, pipline 操作减少 IO。

4.缓存:使用内存数据库 redis、memcached 等。以此抗一些并发比较高的请求。

5.使用异步的框架或者库如 asyncio 和 celery。

6.对于并发相关的一些请求使用 gevent 协程或者多线程。

2.6 Python 生成器与协程
2.6.1什么是生成器
Generator

1.生成器就是可以生成值的函数。

2.当一个函数里有了 yield 关键字就成了生成器。

3.生成器可以挂起执行并且保持当前执行的状态。

2.6.2基于生成器的协程
Python3 之前没有原生协程,只有基于生成器的协程。

1.pep 342(Coroutines via Enhanced Generators)增强生成器功能。

2.生成器可以通过 yield 暂停执行和产出数据。

3.同时支持 send() 向生成器发送数据和 throw() 向生成器抛异常。

示例:

def coro():
# yield 关键字在 = 右边作为表达式,可以被send值
hello = yield ‘hello’
yield hello
c = coro()

输出 hello,这里调用next产出*个值 hello,之后函数暂停
print(next©)

再次调用 send 发送值,此时hello变量赋值为 world,然后yield 产出hello变量的值 world
print(c.send(‘world’))

之后协程结束,后续再send值会抛出异常StopIteration
2.6.3协程的注意点
1.协程需要使用 send(None) 或者 next(coroutine) 来 『预激』(prime) 才能启动。

2.在 yield 处协程会暂停执行。

3.单独的 yield value 会产出值给对方调用

4.可以通过 coroutine.send(value) 来给协程发送值,发送的值会赋值给 yield 表达式左边的变量 value=yield

5.协程执行完成之后(没有遇到下一个 yield 语句)会抛出 StopIteration 异常。

2.6.4协程装饰器
避免每次都要用 send 预激它。

from functools import wraps
def coroutine(func):
# 这样就不需要每次都用send(None)启动了
# 装饰器:向前执行到*个 yield 表达式,预激func
@wraps(func)
def primer(*args,**kwargs):
gen = func(*args,**kwargs)
next(gen)
return gen
return primer
2.6.5Python3 原生协程
Python3.5 引入 async/await 支持原生协程(native coroutine)

2.7单元测试
2.7.1什么是单元测试
Unit Testing

1.针对程序模块进行正确性检验。

2.一个函数,一个类进行验证。

3.自底向上保证程序正确性。

2.7.2为什么写单元测试
三无代码不可取(无文档、无注释、无单测)

1.保证代码逻辑的正确性(甚至有些采用测试驱动开发(TDD))

2.单测影响设计,易测的代码往往是高内聚低耦合的。

3.回归测试,防止改一处整个服务不可用。

2.7.3单元测试相关的库
1.nose/pytest 较为常用

2.mock 模块用来模拟替换网络请求等

3.coverage 统计测试覆盖率

如何设计测试用例:(等价类划分): 1.正常值功能测试。 2.边界值(比如*大*小,*左*右值) 3.异常值(比如None,空值,非法值)

2.8重点知识
2.8.1 Python 深拷贝与浅拷贝
浅拷贝:对于不可变对象相当于引用赋值;浅拷贝对于可变对象拷贝时只拷贝*层引用。

深拷贝:对于不可变对象同样相当于引用赋值;对于可变对象会逐层进行拷贝。

Python 中浅拷贝的方式:copy 模块的 copy 方法;对象本身的 copy 方法;工厂方法;切片(只对列表有效)。

工厂方法就是直接使用 list 等方法进行修改。 Python 中默认使用的就是浅拷贝方式。
Python技术交流群871458817 免费分享机器学习,爬虫,数据分析等,

2.8.2小结
1.不可变对象在赋值时会开辟新空间

2.可变对象在赋值时,修改一个引用的值,另一个引用也会发生改变。

3.深浅拷贝对不可变对象拷贝时,不开辟新的空间,相当于赋值操作。

4.浅拷贝在拷贝时,只拷贝顶层中的引用,如果元素是可变对象,并且被修改,那么拷贝的对象也会发生变化。

5.深拷贝在拷贝时,会逐层进行拷贝,直到所有的引用都是不可变对象为止。

6.Python 中有多种方式实现浅拷贝,copy 模块的 copy 函数,对象的 copy 函数,工厂方法,切片等。

7.大多数情况下,编写程序时,都是使用浅拷贝,除非有特定的需求。

8.浅拷贝的优点:拷贝速度快,占用空间少,拷贝效率高。
————————————————

服务器外网无法访问,阿里云服务器外网无法访问解决方案,腾讯云外网无法访问

服务器外网无法访问,阿里云服务器外网无法访问解决方案,腾讯云外网无法访问

服务器外网无法访问可能是你外网没对外开放80端口,可以使用PHPWAMP自带的常用工具解决。

怎么知道自己有没有开放80端口呢,可以扫一下,phpwamp自带各种扫法,随便你扫,效率也很高

腾讯云、阿里云、服务器域名无法访问、无法用公网IP访问(一些IDC服务商的服务器80端口默认是不开放的)
该错误的表现:内网正常访问,但是外网确无法访问站点里的网站。
端口扫描可以查看外网是否能通过此端口访问你服务器,通常会有防火墙和安全组规则两层保护。
安全规则组可以在服务器控制台上开启,防火墙可以在你服务器上开启。

阿里云服务器:在安全组规则的设置里面开启80。在服务器使用,记得扫描一下端口,运营商是否关闭端口。
腾讯云服务器:腾讯云后台开放安全组选择放行的端口就可以了。具体设置位置:云服务器-安全组-管理云主机。

强大高效的端口扫描工具,可以查询服务器是否开启80等端口,或者某些敏感端口是否关闭等

默认提供四大扫描方案,1、精准快速扫描 2、多个端口扫描 3、端口范围扫描 4、在线扫描端口

%title插图%num

(右键新标签打开图片可查看高清大图)

注意事项:多个扫描和范围扫描在使用的时候请查询完毕后再切换到其他扫描方式

请问一般开启 HTTPS 延迟增加多少正常?

现在机器无负载,访问相同接口,http 方式为 60ms ~ 80ms,https 方式 140ms ~ 160ms,我个人觉得性能下降挺厉害的,这样算是正常水平么?还是有一些优化我没做的?

针对 SSL 我用了以下优化

开启了 http2
开启了 ssl_stapling ( OCSP Stapling )
开启了 ssl_prefer_server_ciphers
但是感觉作用都不是很明显,各位大佬可以告知一下方向么?

第 1 条附言 · 24 天前
服务器是 Linux + Nginx
测试方法是在 Postman 连续点击 Send 按钮,查看请求成功后的延迟时间
第 2 条附言 · 24 天前
附加一个大佬提供测算延迟的好方法,我又稍微修改了一下,用 http code 代替 curl 输出的内容,输出看起来更简洁了,希望能帮助到检索到这个帖子的人

“`
curl -X GET -w “\nhttp_code: “%{http_code}”, ndns_resolution: %{time_namelookup}, tcp_established: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}, total: %{time_total}\n” \
-o /dev/null “https://www.qq.com” \
-o /dev/null “https://www.qq.com” \
-o /dev/null “https://www.qq.com” \
-o /dev/null “https://www.taobao.com” \
-o /dev/null “https://www.baidu.com”
“`

dzdh 1
dzdh 24 天前
win? linux?
Phishion 2
Phishion 24 天前
@dzdh linux
keyfunc 3
keyfunc 24 天前 ❤️ 1
开启 HTTPS 后客户端与服务器*次通讯会增加延迟的,具体多少不好说,但单独测一次访问的延迟其实没太大意义,加点并发和多次访问,看看效果,H2 的特征对性能提升效果听明显的。
Phishion 4
Phishion 24 天前
@keyfunc 我用 postman 连续点击的 send,延迟就是上面的延迟,还是说我每次 点击 send 都算单独的一次访问?
Zhuzhuchenyan 5
Zhuzhuchenyan 24 天前 ❤️ 2
可以看一下直接 ping 机器的延迟是多少,或者 tcp ping 一下了解一下平均 RTT 是多少,开启 HTTPS 加密带来的性能损失和网络延迟相比可以先忽略

HTTP 理想情况下只需要一次 RTT 的时间就可以发送数据,
HTTPS 理想情况下则多得多,TLS1.2 需要 4 个 RTT 时间,TLS1.3 需要 3 个 RTT 时间。

所以如果本身延迟就很高,那么开启 HTTPS 带来的延迟增长的确也会很高。

是否开启 HTTP2 对解决这个问题没啥帮助,但是对于网站的基准性能会有比较大的提升。
ssl_prefer_server_ciphers 这个选项只是推荐客户端选定你指定的 cipher,毕竟某些 cipher 过时,慢,并且有可能不安全
如果你的证书的 OCSP 服务器没有被墙,那么是否开启 ssl_stapling 对这个问题没有帮助。

我才疏学浅,唯一能建议的是开启 ssl session 重用,SSL-Session-Cache,这个能帮你节省 1 个 RTT 的时间。
watzds 6
watzds 24 天前 via Android ❤️ 1
用长连接,否则网络延迟增加两三倍很正常
Phishion 7
Phishion 24 天前
@Zhuzhuchenyan @watzds 感谢那么晚回复,我服务器在某大厂云的香港服务器,ping 也就 40ms 左右,我在想总不能开启 https 能增加 90ms 延迟,要么我的 postman 点击按钮的验证延迟的测算方法有问题,要么就是配置上的问题,
@watzds 我抓包看 Header Connection: keep-alive 都是默认开启的
Phishion 8
Phishion 24 天前
@keyfunc
@Zhuzhuchenyan
@watzds

经过实验,我发现**一个 curl 命令跑多个链接**的话,只要在一个会话里面,就可以用 keep-alive 长连接,因此跑了 20 多条数据的总时间换算一下延迟确实是忽略不计的,但是用 postman 点击发送或者 **多个 curl 命令,每个 curl 跑 1 个链接**的话,就没有用到 keep-alive,每个都是单独会话

因此我猜想 ssl *次请求都很慢,但是如果是长连接保持,接下来的连接就不用计算证书合法性了,所以还是要在一个会话里才能看出问题。

是否可以这样理解?
MeteorCat 9
MeteorCat 24 天前 via Android
有没有套 cdn ?
lostberryzz 10
lostberryzz 24 天前
TTFB 需要 4.5 个 RTT,也就是 9x 延迟

Phishion 11
Phishion 24 天前
@MeteorCat 套了 cdn,不过我本地修改 hosts 直连的服务器,跟 cdn 没关系,cdn 大概会在原有延迟数字上加 60ms 吧
unixeno 12
unixeno 24 天前 via Android
@Phishion 基本没啥问题,延迟的增加主要就是 ssl 握手产生的,如果重用连接,不仅没有 ssl 握手的开销,也没有 tcp 握手的开销
你可以试一下用浏览器的开发者工具,里面可以看到每个请求的连接建立时间和实际接收数据的时间之类的数据
Phishion 13
Phishion 24 天前
@MeteorCat
@lostberryzz
@unixeno

感谢这么晚回复,我要睡了,你们也早点睡吧,谢谢各位指导!!!
watzds 14
watzds 24 天前 via Android
@Phishion 另外 curl 测试的话还有启动时间开销,我一般是 www.baidu.com test.com test.com
watzds 15
watzds 24 天前 via Android
@Phishion curl -X POST -w “\ndns_resolution: %{time_namelookup}, tcp_established: %{time_connect}, ssl_handshake_done: %{time_appconnect}, TTFB: %{time_starttransfer}, total: %{time_total}\n” -s “https://www.baidu.com” “https://test.com” “https://test.com”
louiswang002 16
louiswang002 24 天前 via iPhone
@Phishion 几位大佬解释的很清楚,http2 默认开启 keep-alive,还可以查一下多路复用。

也可以尝试一下 http3,使用的 quic 协议,0RTT,在建立连接时性能提升不少
zhuzhibin 17
zhuzhibin 24 天前 via iPhone
ssl 开销挺大的 可以做个压测就知道了
Phishion 18
Phishion 24 天前
@watzds 这个不错,比我的抓包目测清楚,感谢!

也谢谢你们的建议

Python技术工程师能力要求?

Python技术工程师能力要求?

Python这门语言近来是越来越火,在国家层面越来越被重视。除了之前热议的加入高考和中小学教育之外,现在连普通大学生也无法逃脱Python的毒手了。

 

今年Python业已加入NCRE(全国计算机等级考试)豪华套餐,与Java、C、C++等传统的强势语言并列。属于Python的首次认证考试将在今年9月进行,考试合格将可获取国家承认的计算机二级认证。

Python已经有了国家级别的认证开始,那么国家认证的Python工程师都有哪些技能要求呢?

首先,我们来看一下这次认证考试的大纲:

基本要求

1.掌握Python语言的基本语法规则。%title插图%num

2.学握不少于2个基本的Python标准库。

3.掌握不少于2个Python第三方库,掌握获取并安装第三方库的方法。

4.能够阅读和分析Python程序。

5.熟练使用IDLE开发环境,能够将脚本程序转变为可执行程序。

6.了解Python计算生态在以下方面(不限于)的主要第三方库名称:网络爬虫、数据分析、数据可视化、机器学习.Web开发等。

考试内容

一、Python语言基本语法元素

1.程序的基本语法元素:程序的格式框架缩进注释、变量、命名、保留字、数据类型、赋值语句引用。

2.基本输人输出函数: input() .eval() 、print()。

3.源程序的书写风格。

4.Python语言的特点。

二、基本数据类型

1.数字类型:整数类型、浮点数类型和复数类型。

2. 数字类型的运算:数值运算操作符、数值运算函数。

3. 字符串类型及格式化:索引切片、基本的format()格式化方法。

4.字符串类型的操作:字符串操作符处理丽数和处理方法。

5.类型判断和类型间转换。

三、程序的控制结构

1. 程序的三种控制结构。

2.程序的分支结构:单分支结构、二分支结构、多分支结构。

3.程序的循环结构:遍历循环、无限循环、break和continue循环控制。

4.程序的异常处理:try-excepl。

四、函数和代码复用

1.函数的定义和使用。

2.函数的参数传递:可选参数传递、参数名称传递、函数的返回值。

3.变量的作用域:局部变量和全局变量。

五、组合数据类型

1.组合数据类型的基本概念。

2. 列表类型:定义、索引、切片。

3.列表类型的操作:列表的操作函数,列表的操作方法。

4.字典类型:定义、索引。

5.字典类型的操作:字典的操作函数,字典的操作方法。

六、文件和数据格式化

1.文件的使用:文件打开;读写和关闭。

2.数据组织的维度:一维数据和二维数据。

3.一维数据的处理:表示.存储和处理。

4.二维数据的处理:表示存储和处理。

5. 采用CSV格式对一二维数据文件的读写。

七、Python计算生态

1.标准库;turtle库(必选) .random库(必选) .time库(可选)。

2.基本的Python内置函数。

3.第三方库的获取和安装。

3.脚本程序转变为可执行程序的第三方库:Pynsaller库(必选)。(小编注:此处出现编号重复,应为第4条)

4.第三方库:jieba库(必选) , wordcloud库(可选)。

5.更广泛的Python计算生态,只要求了解第三方库的名称,不限于以下领域;网络爬虫数据分析、文本处理、数据可视化、用户图形界面、机器学习、Web开发、游戏开发等。

从考纲可以发现,二级考察内容比较简单,但方向非常明确,除去必考的语法之外,偏重于数据、AI这两个方向。在必考的四个Python库中,turtle库用于图形绘制,random库用于随机数生成,jieba库用于中文分词。当然,Python的全能性注定它还会在更多领域大展身手。

不过也必须注意到,NCRE的考察内容还是十分浅显的,即使高分通过也并不意味着你能够成为一名合格的Python工程师。想要成为一名能在企业站稳脚跟的工程师,还需要学习很多。

如果你对web感兴趣,那么你需要掌握Django和Flask框架,这是目前Python Wed开发中*常用到的两个应用框架。

如果是想加入大热的Al大军中,那么你就需要掌握Python的机器学习库scikit-learn,TensorFlow、Keras、Theano、Caffe等机器学习框架,当然你可以只选择其中一个,不要贪多,关于它们各自的区别自行百度。

如果你以后向成为一名爬虫工程师那你就要掌握urllib、urllib2、request、bs4等包,如果是大规模的爬虫你还需要掌握Scrapy等爬虫框架。

*后一个数据科学方面,细化一点主要为数据分析和数据挖掘,这方面*主要有五个包,Pandas、Numpy、Scipy、Matplotlib,scikit-learn,其中Pandas用于数据处理,Numpy和Scipy用于数据的科学化计算,Matplotlib用于数据可视化,*后一个有scikit-learn主要用于数据挖掘算法的实现。

国家准备在Python领域发力的决心一目了然,你准备好迎接这个时代了吗?下边有Python的基础学习资料,可以免费领取。

 

写给大数据从业者:数据科学的5个陷阱与缺陷

*近看新闻,发现数据科学专业已经是北京大学高考入学门槛*高的专业了,其实”Data Science” 这个词性感了快十年了,对互联网行业而言,相当于性感了一个世纪。

从“数据说话”,”DT 时代”,到 “数据中台”,“数据驱动(Data Drive/Data Driven)”,数据体系的不断演进正在持续的改变大家的工作与决策方式;正在不断的革新大家的思维方式;同时也产生了新的商业逻辑,新的发展机会。

1976 年,Pascal 作者 Nikalus Wirth 曰:Algorithms + Data Structures = Programs.

就像之前的“SOA”,“云计算”等概念一样,目前数据科学自身的概念还在不断的变革,各家公司的实践者们一边摸索,一边获利;一边总结,一边布道;当然同时还参杂着很多凑热闹的同志把概念折腾的更加模糊。所以数据科学本身的能力边界,方法论体系,*佳实践等等还没有完善的建立起来,有很多问题没有办法很好的回答。由此就会产生一些迷信和误会,”强行数据“,”随意数据“,”政治正确数据“等等情况比较常见, 无论是实际的操作层面,还是方法层面,都存在着一些不小的误会。这也是我打算总结一下在数据科学实践中存在的陷阱与缺陷的缘由。

这篇分享是根据我自己的工作经验,和对相关资深同事的访谈总结而成。它的正确性受限于我个人的认知水平和目前行业的发展水平,它整理了一些目前可能存在的问题,但未必是长久的道理。希望大家读的时候批判性的看待。抛砖引玉,如果有不同想法欢迎大家跟我随时沟通与验证,结论本身也可以随时更新。

陷阱与缺陷 1:数据质量杀死自动 / 智能决策

网易严选的很多业务,比如风控业务,核心驱动力是数据及算法。我们在风控业务起步的时候就建立了数据算法驱动风控的方法体系,所以能保证很小的团队(3 个人)来支撑严选几十个内外部风险场景,每天执行百万次风险决策。当然,这是数据驱动自动决策 / 智能决策带来的力量。成功的美好,或许会让你按耐不住的想把很多业务运转方式转型过来,但遗憾的是,数据质量保障的缺失会让这一切变成随时会倒塌的空中楼阁!事实上,*大部分组织对数据质量的理解 支撑不了更加自动和智能的决策场景。强行转型与减员增效会让他们原本稳定的业务接近崩溃。

严选风控出现过几次大的故障都跟数据质量紧密相关。今年 8 月份的时候,风控在执行每周误判巡检的时候发现整体疑似误判率增加了 4 倍。*终定位原因是设备号相关的日志内容有些异常。从而导致了相当一部分用户的行为(签到操作)被错误的执行了拦截。

这是一个很有意思的案例。一些关键的决策:比如用户是不是坏人?某个商品要采购多少量?可能会依赖于很不被重视的某个线上日志的一小部分内容。我们的整个质量保障体系很难把视角投入到某个具体应用的某个日志字段在高压力下会不会出错?在传统的应用服务质量保障理念里,日志字段的某个偶尔的小错误,没人会把它当作 Bug,开发人员更不会去关注。但如果你一旦把 数据当作了生产资料如果我们不对应用质量保障的理念和工具进行革新,你的大量的数据分析报告,训练好的算法模型,做出的决策可能很不可靠,因为你的生产资料本身就是垃圾,而古语有言:Garbage in , garbage out。

还有一个惊人的现状是,大量用于生产数据的复杂 SQL 并没有进行真正的测试,甚至,大量的数据系统并不存在一个所谓的测试环境。我们很难像测试线上服务(比如订单系统)那样去测试数据生产过程的正确性。那么这样通过几万行,甚至几十万行(严选)SQL 生产出来的数据到底能不能用?这个问题其实很难回答。

数据的可靠性是组织在转型数据驱动过程中一个非常大的陷阱。

大家都在讨论数据质量的重要性,但是内心又默默觉得这个事情比较低级。因此,我们很少见到有团队会把大量聪明的大脑投入到数据质量的保障上。

除了资源投入的缺失,很多数据团队对数据质量的认知也是各不相同。我曾经跟一位在数据行业从业 15 年,为某知名公司数据体系做出巨大贡献的前辈做过一次深入的沟通,聊起数据质量,”你觉得数据质量是什么?“ 他的回答是:“数据质量,真正需要考虑的是指标一致性。”。瞧瞧,就算是非常资深的同行,他的认知还是不够完整,按他对数据质量的理解,数据的支撑能做到报表给人看,这个层面就很完美了,要落地到战术层,落地到线上自动决策基本不可行(因为数据质量的故障难以像线上程序故障一样快速修复,它是一个持续污染的过程)。

数据做为智能决策的输入,是动态变化的。它没法像代码的依赖那样做静态分析,它的依赖层次动态而不稳定。

陷阱与缺陷 2: 数据科学的”科学”在哪?

数据科学是我们常常说起的一个词,也是形容我们日常工作的一个词,但当我们说起的时候,内心就会有些心虚,就光看到数据了,“科学”在哪里?如果没有”科学“的部分,我们的产出的结论会不会有问题?

这是一个*常见的问题,数据科学的从业者们,不知道什么是”科学“。所以江湖上才会有 SQL Boy, SQL Girl 的称呼。

一个常见的问题是数据指标之间的相关性到底是不是真的相关?我们做数据分析往往能看到很多有趣的相关性,比如*近几个月买了拖鞋的用户,看起来有更大的可能性在*近一个月复购另外一个商品。但是,这个相关性到底是不是真的存在,还是只是偶然的巧合(False Postive)?我们的分析报告很容易对这个问题视而不见。但如果这个相关性本身经不起推敲,它又如何来指导我们的工作呢?数据分析报告难道要靠运气来驱动业务发展么?

就算我们有不错的统计基础,给每个假设都加上了 P Value, 我们往往还很容易把相关性与因果性给搞混。两个事情相关,并不能得出结论说他们之间互为因果。我们需要通过因果分析的方法,为数据之间的相关性提出符合业务逻辑和商业逻辑的解释。

如果数据分析遗漏了因果分析这个过程,就会得出一些奇怪的结论。比如,我们发现较大的用户,买的鞋子一般也是大号。如果缺乏基于业务逻辑的因果分析我们可能会这样指导运营工作:为了让用户的脚变大,我们应该多卖大号的鞋子给他们。

但有的时候,我们很难直接的分析出数据之间的因果关系,很难直观的得出结论,这个时候,我们需要借助科学实验,帮我们更深入的理解我们的业务。

如何去做科学实验,我结合滴滴谢梁大神的观点(谢梁,数据科学中的“科学”),总结如下

  • 通过对数据的敏锐度和业务的熟悉程度,发现和定义问题;
  • 提出结构化,可量化的假设;
  • 设计验证实验。科学与实验是紧密关联的。在严选和很多公司,我们往往利用实验来判断方案的好坏。但是,其实实验更多的是用于帮助我们验证假设,帮我们更加深入的理解我们的用户(著名实验公司今天头条 CEO 说: 更多的时候,AB 测试帮助我们理解用户,而不是帮助我们决策)。设计一个好的实验,并不容易,需要根据假设梳理出要验证的指标,样本集,可控制的因子(往往是流量)。设计实验,需要*强的专业性。
  • 收集与分析数据。分析数据并不仅仅是直观的去看趋势的高低。分析数据首先需要对业务的主要指标及其相关性有清晰的概念,需要把指标之间的相关因子量化,甚至可计算。 我认为是先有结构化、系统化、量化的体系,再有数据分析。所幸的是,结构化的体系我们可以用系统和服务来支撑。 我们团队今年主要在设计与研发的 DIS 系统( 严选数据智能平台),一个主要目标就是解决这个问题。
  • 分析人员需要专业的量化分析能力、统计学能力。
陷阱与缺陷 3: 操纵,误导,数据的民主化不足

数据民主化在国外的数据社区讨论的很多,国内聊的比较少。数据科学家们通过黑魔法制造出一些模型来,然后告诉业务同学该怎么决策,告诉高层业务指标完成的好不好。数据的能力被限制在某一个专业团队,但它的产出却又跟业务紧密相关,这些未知会给业务人员和管理层带来恐惧与不安,数据团队给的结论会不会有可能是被操纵的?会不会有意无意的误导?这些问题会很容易让团队之间滋生不信任。

所以数据民主化不足带来的一个重要问题就是信任问题,那该怎么解决?

严选在一次产技共创会中,有同事提出,要跟业务“谈恋爱”。对于眼下的现实,这确实是解决信任问题的一个好办法。阿里的曾经的数据一把手车品觉老师也说过类似的话:数据同学要会”混,通,晒”,跟业务同吃同行,建立信任,才能互相成功。

但这终究不是一个可规模化和标准化的解决方案 。去年,我们在考虑 2019-2020 年严选数据平台发展的时候,想了很久这个问题。如何去降低数据使用的门槛,让一切更直观和更容易解释?我们开展的一些项目,SQL on AI, Data Intelligence System(DIS),算法平台等,一个共同的目标是 降低数据使用门槛,并通过产品的方式固化甚至可视化数据分析过程。

 陷阱与缺陷 4: 数据预测未来不是理所当然,预测的成功不仅是算法模型

老板们经常会把算法能力简单化:预测的不准?找两个 NB 的算法专家做个模型就能搞定!遗憾的是,现实并不这么简单,你可能找 100 个 NB 的算法专家都没用。

有人见过用算法来预测下一轮双色球中*号码的么?有人用算法来预测接近混沌状态的股市涨落么?作为一个旁观者,你能利用算法来预测意甲的每场比赛成绩么?

有的业务问题本身是无法预测的,因为它跟过去没有关系(比如双色球);有的业务问题预测成本很高,短时间内无法做出有价值的模型(比如预测股市,预测比赛等),需要考虑投入与回报。事实上,很多算法的成功落地应用,不光是需要有合适的模型,还需要大量维度的数据作为生产资料,更关键的是要有一个完善,可靠的 算法工程体系。而后者,往往会被决策者忽略。

决策者在考虑利用算法模型去预测未来时,他需要想明白 投入与产出,组织需要投入的不止是 几位算法大神就行,还需要建设完善的数据基础体系,还需要建设完善的算法工程体系。决策者如果期望数据和算法能发挥突破性的效应,需要有魄力把成本投入到自己目光不能及的地方,比如基础数据体系,比如算法工程。

陷阱与缺陷 5: 空中楼阁 – 基础设施与基础能力的不完备

这个问题比较抽象,对于 BI/ 算法 / 数据产品的同学而言,可能不好理解。不过大家只需要记住:数据的*底层,摇摇欲坠,并不坚实,同样需要一个团队精心守护。

大家在兴奋的玩耍数据,利用数据来驱动业务前进的时候,如果回头望望做 Data Infra 的同学,如果他们告诉你其实你在用的数据能不能真的算出来、有没有算对,他们也没多少信心的时候,你会不会觉得心惊肉跳,会不会觉得人生其实有些虚无?如果大家有机会采访下各个互联网公司,可以问问他们被抱怨*多或者故障*多的技术团队是哪个?相信答案都比较一致:“大数据基础团队”。包括严选的前面几年,这个情况也非常严重(当然现在也没好多少)。数据故障频出,数据产出排期长、节奏慢、不稳定等情况都很常见,很多时候我们是用睡觉时间在做人肉保障。每每回想起来,都会心惊。

这当然并不是因为大数据基础行业的从业者敬业精神不足或者能力不足。而是因为大数据体系其实并没有一个非常坚实的工程基础。

数据的基础设施可靠性不足:数据的采集系统,数据的存储系统,数据的计算系统,数据的分析引擎,这些服务的可靠性相比其他的在线服务低一大截。数据平台每天的定时数据计算服务,比如 Hive,或者 spark,成功率如果有 98%,已经算是很不错了,而线上服务系统,如果可靠率长期在 98% 以下,相关团队的同学很难坚持一年不被优化。就算数据成功的被计算出来了,我们的分析引擎,比如 impala,查询成功率也长期低于 95% 以下,在严选这个数据还要更差一些,impala 的查询失败或者超时,几乎每天都有不少。

计算模型不完备和广泛的误解:大数据的计算有两个模型:Streaming,Batch。两个模型对应的基础设施各自独立发展,谁也不理谁。同时,由于信息流转的速度问题,也有人把这两个模型称为实时计算和离线计算。虽然,Streaming & 实时计算;Batch & 离线计算,在很多现实场景中,存在着一致性,但本质上,它们是两回事。甚至很多从业者也无法清晰的分清楚这些基本概念,把实时计算和流计算等同,这给数据工作带来了巨大的困扰。

为了适配这两个计算模型,很多组织的 Data Infrastructure 团队会有独立的流计算团队和批处理团队;会有实时数仓和离线数仓,会有实时指标和离线指标等等。这些数仓和指标的研发人员存在着割裂,数仓建设方法论、指标定义也不尽相同。维护成本和解释成本都很高,出错几率也很大。很常见的情况是一个业务的数据需求,往往需要拆解成实时和离线两个方案,共同去实现。这个糟糕的局面没有变的更好。

LinkedIn、Uber、阿里等等公司都在尝试做批流融合,严选也在尝试,我们在做计算资源管理和调度层面的融合。但是,融合两种完全不同的计算模型,是一件不美好的事情,直觉上也不大对。我觉得现实的业务问题可能并不是聚焦在批流两种计算模型的不兼容上,而是聚焦在实时和离线两个时间维度上的不兼容。由于历史原因,实时的数据往往需要依赖流计算模式来产生,从而产生了实时计算 == 流计算的误会。而融合实时数据与离线计算,解决起来就容易很多 。而流处理也需要走向更适合它的场景。

其实能总结的问题远不止这些,比如我们会担心“算法替代思考,会不会伤害组织的远见?”、“大规模依赖 A/B 测试做决策,可能会导致运营策略的短视” 等等。