关于编程语言:MoonBit-新增-运算符引入-super-trait-和-List-字面量机制

MoonBit更新1. 增加了 += 系列语句包含+=、-=、*=、/=,反对运算符重载: fn init { let array = [1,2,3,4] array[2] *= 10 println(array) // [1, 2, 30, 4]}fn init { let mut a = 1 a += 20 println(a) // 21}struct Foo { data : Array[Int]} derive(Debug)fn op_set(self : Foo, index : Int, value : Int) { self.data[index] = value}fn op_get(self : Foo, index : Int) -> Int { self.data[index]}fn init { let foo : Foo = { data: [0,0,0,0] } foo[2] -= 10 debug(foo) // {data: [0, 0, -10, 0]}}2. 当初 toplevel 如果没有顶格会报错如下图所示: ...

March 4, 2024 · 2 min · jiezi

关于编程语言:PythonCSwift或任何其他语言会取代Java吗为什么

很难预测Python,C ++,Swift或任何其余编程语言是否会取代Java作为最受欢迎的语言,但在不久的未来不太可能.以下是一些起因: 受欢迎水平并建设的用法:Java曾经存在了25年以上,并且领有大型且已建设的用户群.它被宽泛用于企业软件开发,Android利用程序开发以及许多其余畛域,这使得它很难替换.只管其余语言在某些畛域可能变得更加风行,但任何繁多语言都不太可能齐全替换Java已建设的用法. 跨平台兼容性:在任何中央"(WORA)办法容许开发人员创立能够在任何平台上运行的应用程序,而无需特定于平台的代码.对于Java来说,这是一个次要劣势,并且依然是开发人员的现实性能.只管其余语言可能更适宜特定平台,但很少有人具备Java的跨平台性能. 继续更新和改良:Java持续倒退并适应一直变动的技术和技术和技术须要.该语言具备一个大型开发社区,该社区始终在致力改善它并增加新性能.这使得任何语言都难以齐全替换Java,因为它持续改善并放弃相关性. 总结,而其余语言可能会取得遍及并成为在某些畛域应用更宽泛的应用,因为其建设的用法,跨平台兼容性以及继续的更新和改良,任何语言都不可能在不久的未来齐全替换Java. 文章转载自:IT宝库

March 6, 2023 · 1 min · jiezi

关于编程语言:KCL-语言-v045-版本发布-更好的编写便利性改进稳定性体验提升与多平台支持

简介KCL 团队很快乐地发表 KCL v0.4.5 版本当初曾经可用!本次公布次要为 KCL 语言编写便利性和稳定性晋升,错误信息改良以及更多平台包含 windows 版本反对以及更多下载方式反对。在 KCL v0.4.5 版本中,用户能够通过编写更少的 KCL 代码打消更多的配置模版;在新版本中提供了初步的 KCL Playground 反对可用于在线免装置编写并运行 KCL 代码;此外此次更新还蕴含多项编译器报错信息优化和谬误修复。 您能够在 KCL v0.4.5 发布页面 或者 KCL 官方网站 取得 KCL 二进制下载链接和更多具体公布信息。 KCL 是一个开源的基于束缚的记录及函数语言,冀望通过成熟的编程语言技术和实际来改良对大量繁冗配置和策略的编写,致力于构建围绕配置的更好的模块化、扩展性和稳定性,更简略的逻辑编写,以及更快的自动化集成和良好的生态延展性。 本文将会介绍 KCL v0.4.5 版本的更新内容以及 KCL 社区的近期动静。 语言更新KCL 语言编写便利性改良反对 Schema 非空属性惰性校验在之前的 KCL 版本中,咱们曾经反对了 schema 属性相互援用(蕴含继承)以及 check 校验表达式的惰性求值与校验能力,在此次版本更新中,咱们反对了更多的 schema 惰性求值能力: Schema 属性非空惰性校验。比方对于下述的 KCL 的代码: schema Spec: id: int value: strschema Config: name?: str spec: Spec = Spec { id = 1 } # 在 KCL v0.4.5 版本之前,这个语句会报属性非空谬误,v0.4.5 版本之后,反对 Schema 非空属性惰性校验能力config = Config { spec.value = "value"}在 v0.4.5 之前的 KCL 版本中,间接执行上述代码会在 schema Config 语句块的 spec: Spec = Spec { 处抛出一个 spec 的 value 属性不能为空的谬误,因为在该处只对 spec 的 id 属性赋值为 1,而没有对 spec 的 value 属性赋值。 ...

February 27, 2023 · 4 min · jiezi

关于编程语言:各个编程语言的优缺点你适合哪个

TIOBE 编程语言排行前10中,各个编程语言的优缺点如下:Python: 长处:易学易用,具备大量的第三方库和工具反对,实用于数据分析、人工智能等畛域。 毛病:运行速度绝对较慢,不适用于须要高性能计算的应用程序。 Java: 长处:具备较好的跨平台性能,实用于大型应用程序的开发,提供了弱小的面向对象编程能力。 毛病:绝对较为繁琐的语法,开发效率绝对较低。 C: 长处:具备很高的性能和可靠性,宽泛用于操作系统和嵌入式零碎等畛域。 毛病:绝对较为底层,编写代码绝对较为繁琐,容易呈现内存透露和指针谬误等问题。 C++: 长处:具备很高的性能和可靠性,宽泛用于游戏和高性能计算等畛域。 毛病:绝对较为简单的语法和编译过程,容易呈现内存透露和指针谬误等问题。 C#: 长处:具备很好的跨平台性能,实用于 Windows 利用程序开发,提供了弱小的面向对象编程能力。 毛病:绝对较为繁琐的语法和编译过程,不适用于其余平台上的利用程序开发。 PHP: 长处:实用于 Web 开发,易于学习和应用,具备大量的第三方库和工具反对。 毛病:绝对较为凌乱的语法,容易呈现安全漏洞。 JavaScript: 长处:实用于 Web 前端开发,易于实现交互性和动态效果,具备大量的第三方库和工具反对。 毛病:在大型项目中保护较为艰难,存在跨浏览器兼容性问题。 R: 长处:实用于数据分析和科学计算,提供了丰盛的统计分析和可视化工具。 毛病:运行速度较慢,不适用于须要高性能计算的应用程序。 Swift: 长处:实用于 iOS 和 macOS 利用程序开发,易于学习和应用,提供了弱小的函数式编程和面向对象编程能力。 毛病:在其余平台上的利用反对绝对较少。 Go: 长处:具备很好的并发性能,实用于网络编程和高并发利用程序开发。 毛病:绝对较为新的语言,不足大量的第三方库和工具反对,不适用于一些较为简单的利用程序开发。 10种编程语言适宜不同类型的人学习Python: 适宜初学者和数据科学家,以及心愿疾速创立原型和小型应用程序的开发者。Java: 适宜企业级应用程序和大型零碎的开发者,以及想要理解面向对象编程的开发者。C: 适宜对底层编程有趣味的开发者,如操作系统和嵌入式零碎开发。C++: 适宜对游戏开发、高性能计算和嵌入式零碎有趣味的开发者。C#: 适宜 Windows 利用程序开发、游戏开发和 Web 开发的开发者,以及想要理解面向对象编程的开发者。PHP: 适宜 Web 开发和服务器端编程的开发者。JavaScript: 适宜 Web 前端开发的开发者,以及想要理解动静网页设计和交互性的开发者。R: 适宜数据科学家和钻研人员,以及须要进行数据分析和可视化的开发者。Swift: 适宜 iOS 和 macOS 利用程序开发的开发者,以及对函数式编程有趣味的开发者。Go: 适宜网络编程和高并发利用程序开发的开发者

February 14, 2023 · 1 min · jiezi

关于编程语言:百度搜索业务交付无人值守实践与探索

作者 | 刘道伟 导读基于危险驱动的交付是百度实际智能测试——感知智能阶段十分重要的钻研方向,基于危险驱动的交付,源于三个现状: 一、不是所有的我的项目都有危险,80%以上的我的项目无任何的关联bug和线上问题。 二、不是所有的测试工作都可能揭错,有效的品质行为(有bug发现的品质行为/所有品质行为)占比十分高。 三、测试人员也有误判的可能,漏测始终存在。 通过以上三个现状,可见如果可能有办法迫近:测该测的我的项目、做该做的品质行为、评危险评得准,那么对测试效力和召回都有极大的帮忙。 接下来咱们将继续登载三篇文章,来揭秘百度实际基于危险驱动的交付的冰山一角: 1、百度搜寻业务交付无人值守实际与摸索:从具体业务实际的角度介绍危险评估在交付无人值守畛域的关键作用。 2、AI技术在基于危险测试模式转型中的利用:从测试全过程的角度介绍各环节以危险思维+AI技术加持的各种利用场景。 3、品质评估模型助力危险决策程度晋升:从思路、计划和模型的角度介绍品质度模型的实现和挑战。 本文先介绍第一篇:百度搜寻业务交付无人值守实际与摸索。 01 引子提起交付无人值守概念,大部分人应该都比拟生疏,呈现上面这些疑难: 什么是交付无人值守?怎么做到交付无人值守?交付无人值守能带来哪些益处?本文就从以上几方面动手,具体介绍一下百度搜寻业务在交付无人值守上一些摸索及实际。 02 无人值守的源起在介绍无人值守之前,能够先理解下交付模式的倒退历程,如下图所示,随着工程能力的一直倒退,交付过程中的测试逐渐从纯手工测试变为半自动化测试或自动化测试。同时在互联网行业麻利开发模式继续倒退,继续集成也随之发展起来,通过将自动化测试工具集成到流水线中,质效工作逐渐左移,大部分的需要研发人员能够通过流水线实现测试、上线工作。咱们把这类研发人员不再须要通过测试人员手工测试,应用流水线即可实现全副测试过程的模式称为研发自主测试,在搜寻业务中,DevOps已成为最次要的交付模式,局部业务需要自主测试比例达到了90%以上。 现实状态下,既然大部分需要已实现自主测试,整个交付过程中应该是不须要消耗测试人员人力,然而现实很饱满,事实却很骨感。下图是在自主测试模式下,测试人员的工作日常,能够看到在整体过程中测试人员工作量仍然比拟大: 1)研发人员流水线执行测试失败,须要测试人员进行问题排查、修复工作稳定性问题、定位是否与代码无关、与研发重复沟通; 2)研发流水线执行实现后,测试人员还须要确认研发的自主测试报告,剖析需要危险,判断是否可准入; 3)交付过程中,存在很多环节须要研发人员和测试人员的沟通及手工操作,如需要的报备、拉分支、公布版本等工作。 是否有技术手段,把交付过程中这些消耗测试人员大量人力的工作由机器代替呢?这就是咱们明天要介绍的无人值守出发点。 03 无人值守的计划在以后交付过程中,次要有以下几个环节对测试人员的依赖水平较大: 决策依赖人:CI代码后须要执行哪些测试工作是动态配置的或齐全人工决策决定的。流程依赖人:交付各环节流程流转依赖研发或测试人员,沟通交互老本高。论断依赖人:流水线无风险剖析能力,测试工作无0/1化论断,准入准出的危险判断依赖集体教训。因而要实现无人值守必须要通过技术手段解决这三个依赖问题,一句话概括就是 “通过智能执行和危险评估能力,实现失败智能运维,过程主动流转,危险智能揭发,整个交付过程无需测试人员人工干预 ”。要真正实现这个指标,首先要满足三个必要的条件:齐备的测试能力、稳固的构建能力以及精准的评估能力,在这些能力的根底上,建设数据采集、危险辨认、危险管制、危险决策等智能化机制,最终实现全环节的无人化。 因为篇幅所限,本文上面先重点介绍三个依赖的根底能力。 3.1 齐备的测试能力 齐备的测试能力是无人值守的根底,齐备即要求流水线的测试工作是全面且无效的。 怎么了解全面?不同类型业务对于测试工作的需要是不同的,全面就是具备对应的业务类型须要的各种测试工作,以百度的工程能力地图服务端要求为例,全面的测试能力即要求下图所示的服务端的各环节的测试工作都具备,能够依据业务的理论需要进行一些变动。 全面测试能力的根底上进一步是无效的,有很多状况下流水线尽管具备了某类型的测试工作,然而这个测试工作是不是可能拦挡问题还依赖测试工作的危险揭发能力,或者依赖测试人员对于测试报告的剖析解读能力。 以搜寻业务的DIFF测试类型为例,DIFF测试就是针对基线版本和测试版本,发送同样的数据,比照返回的数据的字段的不同,判断测试版本是否合乎预期,曾经是以后接口测试和大数据测试中比拟常见的形式。然而DIFF测试工作存在有效性问题,测试工作产出了diff的后果,可能是『乐音』导致的不稳固,可能是代码变动的预期内的,也可能是bug导致的非预期后果,这个危险的判断齐全依赖研发和测试的人工剖析。因而要晋升DIFF测试有效性要解决乐音烦扰的随机diff问题和diff后果0/1剖析问题,随机diff的打消通过后端mock、环境数据一致性、随机diff智能辨认与过滤策略等机制解决,本文不具体开展阐述,重点介绍下diff测试的拟人化剖析能力。 拟人化剖析就是把人工分析测试后果的能力转化的自动化过程,因而要实现拟人化剖析首先要分明人在看到diff测试后果的时候是如何判断的,通过理论调研发现,研发和测试人员在剖析diff测试后果的时候,首先会看批改的代码是否与产出的diff后果字段相关联,如果是关联比拟大就认为是代码导致的,接着会剖析这些字段的业务影响面是否是需要内预期的以及影响面大小,如果是预期内的影响且危险可控即可认为通过,因而拟人化剖析也从上面两个方面进行判断: 1)依据白盒数据+模型+业务逻辑剖析字段是否合乎预期; 2)依据联合业务的数据分析,评估字段影响面危险。 这其中最重要的一点是如何将白盒数据与后果相关联,目前次要采纳了两个伎俩,一个是比拟惯例的业务知识库积淀,通过对业务的常识的梳理及积淀,将研发和测试的集体教训转化为可主动判断的规定,如某些函数的变动可能引起某类的diff,长处是与业务关联比拟严密,准确度更高,毛病是依然过于依赖各个业务的人员的梳理,积淀的效率较低,因而咱们摸索了第二个伎俩,通过工作执行的历史数据,剖析代码变动与字段变动之间的关联关系,离线的建设代码及字段的关联模型,在线阶段通过模型判断字段变动是否是代码导致,再联合字段的业务危险判断最终给出diff测试论断。 通过上述一些伎俩,可能大大的晋升DIFF测试的有效性,也缩小了DIFF测试的人工剖析老本,相似的工作也在性能测试等其它场景发展,即通过技术手段晋升测试工作的危险揭发能力和后果的剖析能力,从而晋升测试工作有效性。 3.2 稳固的构建能力 如果说齐备的测试能力是实现无人值守的根底,稳固的构建能力就是实现无人值守的保障。如果流水线构建频繁失败,就会导致在自主测试过程中,测试人员须要不停的进行失败问题的定位,修复,以及与研发人员的重复的沟通,因而稳固的构建至关重要。如何建设的稳固的构建能力呢?其实能够用线上服务的稳定性建设作为参考,线上服务通常有研发、运维的各种稳定性及监控建设,稳定性可能达到几个9以上,然而线下服务的稳定性通常只有百分之八九十,那为什么不应用线上稳定性建设的规范来进行线下测试能力的建设呢,因而咱们以线上运维的规范,全面晋升了线下构建的稳定性,次要蕴含以下次要工作: 根底依赖治理:流水线稳定性离不开根底依赖的稳定性,这些依赖蕴含机器、实例、测试代码、测试数据、第三方服务等各个方面,因而要晋升稳定性首先要治理这些依赖,如机器的对立治理,测试代码和数据用线上代码的规范治理,第三方服务的SLA保障及容灾等措施。全环节的稳定性保障:全环节即预防、发现、定位、复原、闭环各个环节均建设对应的稳定性能力,如在预防环节,针对构建须要的环境、数据等进行监控,如呈现不可用或缺失等问题提前报警,防止测试工作构建时才发现导致失败;定位环节标准错误码,针对错误码建设主动定位机制,如果定位问题可能主动复原即触发自愈的策略主动触发复原伎俩,缩小失败的人为干涉。构建数字化:通过对构建数据的数字化,实现构建的稳定性度量、刻画、倡议等工作。 3.1 精准的评估能力 有齐备的测试能力和稳固的构建能力,交付的无人值守还有最初的环节须要解决:准入准出的危险如何判断?传统的流程上通常都是由人工评审测试报告的形式对危险进行把控,不仅消耗人力老本,而且判断精确水平齐全依赖集体的教训,新人研发和测试同学常常会呈现判断谬误导致漏测。如何实现主动的危险评估能力呢,咱们采纳了基于品质度模型及规定联合的办法建设评估能力,品质度模型就是将可能影响危险的数据都形象为特色,通过人工标记的历史数据训练为模型,在准入准出阶段通过调用品质度模型的后果给出危险得分,再联合基于业务的规定判断进行综合判断危险,如果危险低则能够主动准入不再须要人工剖析,如果危险为高,再引入人工。 通常特色的蕴含交付过程中的各种数据如代码白盒数据、研发人员画像、研发过程数据、测试工作后果、覆盖率等,如下图所示通过特色的形象、模型训练、模型评估等过程最终实现精准的评估能力,评估能力的准确性依赖于品质度模型选取的特色丰盛水平以及人工标记的数据的准确性。 04 无人值守的收益通过测试能力的继续建设,搜寻业务90%以上的需要都可通过研发自主测试实现,极大晋升测试吞吐的能力。在自主测试的根底上,通过上述的无人值守工作发展,需要无人值守比例曾经达到40%以上,让更多的测试人员的人力从日常的交付工作中释放出来,投入到其它价值更高的工作中,也进一步升高了单需要的交付老本。 ————END————

October 25, 2022 · 1 min · jiezi

关于编程语言:豆瓣评分-90总销量超-17-万册的-R-语言实战书带你轻松掌握数据处理

《R 语言实战》的前言中援用了这样两句话。 要是一本书里没有图画和对话,那还有什么意思呢?——爱丽丝,《爱丽丝梦游仙境》它太神奇了,满载瑰宝,能够让那些聪慧刁滑和粗野胆大的人失去充沛满足;但并不适宜胆大者。——Q,“Q Who?”,《星际迷航:下一代》 第一句想要示意当今统计分析的潮流——一个摸索、展现和了解的交互式过程。第二句话反映了大部分人对 R 的认识:难学。 大数据时代,基于数据和剖析去发现问题,并作出迷信、主观的决策越来越重要。常常听到一个说法:如果你问两个统计学家该如何剖析一个数据集,那你可能会失去三个答案。不过,每个答案都能让你更好地了解数据集。 其实对于一个问题,没有说某种剖析形式是最好的,或者是惟一的。咱们应该本人入手去剖析数据,看看都能失去什么。开源软件 R 曾经成了统计、预测剖析和数据可视化的全球通用语言,能够装置并运行于所有支流平台。它提供了各种用于剖析和了解数据的办法,从最根底的到最前沿的,无所不包,是咱们从大数据中获取有用信息的绝佳帮手! 因为 R 很弱小,利用宽泛,所以泛滥的剖析和绘图函数(超过50 000个)很容易让人望而生畏。但实际上,学习 R 并非无规律可循,只有有适合的领导,你就能够畅游其中!这本《R 语言实战(第2版)》是你熟练掌握 R 的最快路径之一。本书重视实用性,全面而粗疏,既提供了有针对性的教程,又给出了深度解说的示例。新版做了大量更新和修改,新增了近 200 页内容,介绍数据挖掘、预测性剖析和高级编程。有读者评估:周五购买,你在下周一就能写出可运行的程序! 作者介绍写作由来的时候,这点失去了印证。 最出色 R 网站作者的故事多年前,我在申请一个统计征询职位时,第一次遇到了 R。 雇主在正式面试前,发来的资料中问我是否相熟 R。依据猎头的倡议,我立马答复“是的,我很相熟”,而后开始恶补 R。我在统计方面有丰盛的教训,对各种编程语言也不生疏,学习R能有多难?但大失所望。 因为要面试,我要尽可能快的把握这门语言,可是过程中我发现,无论是底层的构造还是各种高级的统计办法,都是由各具体畛域的专家为同行专家编写的。看在线帮忙几乎就是折磨,那不是教程,都是参考手册! 每当我感觉本人曾经对R的构造和性能有足够把握时,就会发现一些闻所未闻的新货色,它们让我感觉本人很渺小。为了解决这些问题,我开始以数据科学家的角度学习R。我开始思考如何能力胜利地解决、剖析和了解数据,包含:获取数据(从各种数据源将数据导入程序);整顿数据(编码缺失值、修复或删除谬误数据、将变量转换成更不便的格局);正文数据(以记住每段数据的含意);总结数据(通过描述性统计量理解数据的详情);数据可视化(一图胜千言);数据建模(解释数据间的关系,测验假如);整顿后果(创立具备出版程度的表格和图形)。 而后,我试图用 R 来实现这些工作。通过传授他人来学习是最好的形式,所以我创立了一个网站(www.statmethods.net),一直把我学到的货色放在下面。 大略一年后,Marjan Bace(Manning的出版人)打电话给我,问我是否写一本对于R的书。那时我曾经写了50篇期刊文章、4份技术手册,以及大量章节的内容,还写了一本对于钻研办法的书,所以我想,写一本对于R的书能有多难? 后果仍然是大失所望。第1版出版一年后,我开始编写第2版。R的平台在不断完善,我想始终跟进。我也想在本书中笼罩更多无关预测性剖析及数据挖掘的内容——这都是大数据时代很火的主题。 最初,我还想加一些对于数据可视化、软件倒退以及动静报告撰写的章节。你当初捧着的这本书是我多年来梦寐以求的。我的初心就是给大家提供一份 R 指南,让你能尽快感触到 R 的弱小以及开源的魅力,不再感到丧气和忧愁。来吧,一起抉择所需的工具,用最优雅、最简洁、最高效的形式来实现工作——那真的很酷! 作者介绍R语言社区驰名学习网站 Quick-R (statmethods.net)的维护者,现为全球化开发与征询公司Management钻研团体研发副总裁。此前,Kabacoff博士是佛罗里达诺瓦东南大学的传授,讲授定量办法和统计编程的研究生课程。Kabacoff还是临床心理学博士、统计参谋,善于数据分析,在衰弱、金融服务、制造业、行为科学、政府和学术界有20余年的钻研和统计征询教训。 互动工夫读了“最出色 R 网站作者的故事”,有没有感觉“面试前的恶补”很相熟?你的面试产生过什么乏味的故事吗?作者说:通过传授他人来学习是最好的形式,你怎么认为呢?在你的技术精进之路上,有没有更好的学习办法分享给大家?欢送在评论区与小伙伴们互动,咱们将选出两位侥幸的小伙伴送出《R语言实战(第2版)》1本! 目前,R 是世界上最风行的数据分析、统计计算及制图语言,是数据挖掘、数据分析人才的必备技能。想要成为备受高科技企业追捧的数据分析师吗?想要科学分析数据并正确决策吗?无妨从本书开始,挑战大数据,用R开始炫酷地统计与剖析数据吧!“清晰而又吸引人,这无疑是学习R最乏味的形式!”——Amos A.Folarin,伦敦大学学院

September 13, 2022 · 1 min · jiezi

关于编程语言:编程语言中索引签名是什么

撰稿:宗喆原文:https://mp.weixin.qq.com/s/Jl...KusionStack: https://github.com/KusionStack/kusionKCLVM: https://github.com/KusionStack/KCLVM1. 背景最近在参加 KusionStack 内置的畛域语言 —— KCL配置语言编译器 的开发,语言的语法中包含一个“索引签名”的概念,在参加社区探讨的时候发现很多小伙伴不明确这个“索引签名”是什么,于是本人也想了一下,发现自己也只是晓得是什么样子,然而不晓得“索引签名”残缺的定义,因而,决定写一篇贴子来梳理一下“索引签名”到底是什么。 2.见名知意首先,索引签名的想法并不神秘陈腐。晚期Windows开发中应该见过相似的编程标准: bool(BOOL) 用b结尾 bIsParentbyte(BYTE) 用by结尾 byFlagshort(int) 用n结尾 nStepCountlong(LONG) 用l结尾 lSumchar(CHAR) 用c结尾 cCount只有看到变量和类成员的名字就晓得其类型,进步了代码类型方面的可读性。然而这种约定并没有积淀到C++语言中,如果语言可能反对定义以b结尾的成员是BOOL类型这种个性就厉害了——这其实就是索引签名的浮夸目标。 先从字面意义上看,“索引签名(index signature)” 蕴含 “索引(index)” 和“签名(signature)”两局部。 2.1 索引(index)从开发人员的角度来看,索引,相似于C语言中指针,它像一个箭头一样能够指向一个特定的事物,出于某些起因咱们可能无奈间接拜访这个事物,或者这个事物与其余的货色混合在一起,间接拜访这个事物可能要在很多其余事物中寻找很久。因而,咱们应用索引指向这个事物,能够了解为咱们在咱们须要的事物上绑了一根线,并且留了一个线头在身边,每当咱们想要应用这个事物的时候,咱们不须要再从一堆事物中去寻找它,只须要拿起这个线头,并顺着这根线就能找到这个特定的事物,这个线头就是"索引 index",并且很显著,一根线不容许分叉绑定两个事物,所以通常大家默认某个事物的"索引 index"是不会再指向另一个事物的。 因而,在开发的过程中,“索引 index”最次要的应用场景就是“在一堆事物中,查找特定的事物”。例如:最常见的数据结构-数组,就是“索引”的一个优良案例。在数组中,索引是一个整形的数字,这个数字是数组中每个元素的地位信息,通过地位,疾速的定位某个数组元素。 int a[3] = [1, 2, 3];// 应用索引0,就能够在1,2,3三个数字中,疾速的找到排在最后面的元素。assert a[0] = 1;assert a[1] = 2;assert a[3] = 3;除了数组,另一个应用索引的数据结构是咱们常见的Hash表,只不过在有些编程语言中将哈希表中的索引叫做key。 hashtable<string, string> a;// "Jack" 就能够视作一个索引,通过名字字符串作为索引,// 在不思考重名的状况下,它指向了一个构造实例 Person("Jack")。a.put("Jack", new Person("Jack"))a.put("Tom", new Person("Tom"))a.put("Lee", new Person("Lee"))再举一个例子,很多编程语言中都存在的构造struct或者类class,也应用到了索引的思维。 // 能够看做是String和Integer的汇合// 如果没有索引,咱们就只晓得Person外部有两个属性,// 一个类型为String示意名字,// 一个为Integer示意年龄。struct Person{ name: String, age: Integer,}Person p = new Person(name: "Jack", age: 10);// 通过索引name咱们可能轻松的获取到Person的名字Jack。assert p.name == "Jack"// 通过索引age咱们可能轻松的获取到Person的年龄10。assert p.age == 10综上,索引能够被看作一个指针,没有具体的格局束缚,只有能惟一的指向一个事物即可,不能具备二义性,即不能指向A的同时又指向B。或者索引也能够看作一个办法,以索引值为参数,返回索引指向的事物。 ...

August 24, 2022 · 3 min · jiezi

关于编程语言:许式伟Go-演进之路

7 月 10 日,一年一度的 ECUG Con 2022 在线上圆满举办。许式伟作为七牛云 CEO、ECUG 社区发起人、Go+ 语言发明人,为大家来带了《Go+ 演进之路》的主题演讲。以下内容依据演讲实录整顿。 大家好,欢送来到 ECUG Con 2022。ECUG 大会从 2007 年开始,到明天曾经第 15 个年头了,我根本每年都会为大家带来演讲。继上届大会之后,往年我想和大家持续分享 Go+ 的相干内容,聊聊 Go+ 的演进之路。咱们会谈谈 Go+ 过来都产生了什么?咱们当初正在做什么?以及咱们将来会怎么持续去进行迭代?  一、Go+ 历史的要害节点纵观 Go+ 的倒退历程,咱们大略会分四个要害的节点。 首先是 v0.5 版本及以前的「史前版本」。因为它过后叫做 qlang,其实和 Go+ 没有关系,所以叫「史前版本」。咱们当初把 qlang 的代码,从 Go+ 移到我集体的 GitHub 上面了。之后是 v0.6 到 v0.7 的原型版本,次要是为了让大家看到 Go+ 到底长什么样,因为它和之前的  qlang 有十分大的不同,qlang 是一个脚本语言,Go+ 实际上是一个动态类型的语言。尔后,咱们从这个原型版本登程,让它可能更加靠近工程的应用。比拟重要的里程碑就是去年 v1.0 版本的公布,Go+ 的指标和代码格调被正式确定下来。尔后,咱们基本上是连续这个指标和它的代码格调继续前进。往年上半年咱们公布了 Go+ 的 1.1 版本,它实际上是 Go+ 的第一个工程化版本,它能够正式用于生产环境。  从 Go+ 1.0 开始,咱们首先提出了「三位一体」的概念,即面向工程,STEM 教育和数据迷信。 实际上咱们谈的是全民编程,也就是人人都能够学编程。在明天咱们能够看到,编程教育在将来,肯定有越来越多的人会把它看作基础学科,和数学、语文、英语没有什么本质区别。这也是为什么 Go+ 会把 STEM 教育作为十分重要的支撑点。 那么 Go+ 1.0 都做到了什么呢?首先是确定了 Go+ 的代码格调,它是以命令行格调为根底,极尽可能去实现低门槛化。咱们心愿 7 到 8 岁的小朋友,就有能力学 Go+。 另外一个很重要的点,是咱们实现了类文件 Beta 版。它实际上试图实现面向对象、畛域常识表白的低门槛化,也就是当初比拟火的低代码畛域。实际上面向对象尽管是好的货色,有助于对世界的形象,然而它也带来了了解上的难度。因而如何去让这些高阶的工程概念低门槛化,Go+ 类文件是在这方面最重要的摸索。 另外 Go+ 1.0 在兼容 Go 语法方面获得了突破性的停顿,这也是它最初被标为 1.0 的起因。咱们在这个版本上,把大部分 Go 语法都实现了比拟好的兼容性,基本上做到了在 Go 根底下来做扩大这样一个最底线的指标。 谈到 Go+ 的指标,大家可能会有十分多的疑难,实际上从方才的指标也能够看出,咱们十分关注低门槛化。那谈到低门槛化,就不得不提 Python 这个语言。Python 的胜利,到底通知人们什么事件呢?  首先第一个重要的点在于,它通知咱们性能并不是最重要的。尽管大家都比拟看重性能,但单从性能来看的话,Python 在脚本语言外面我认为只能算二流,它其实并不快。因为性能其实是能够靠工夫去解决的。语言的生命周期都十分长,Python 到往年曾经有 32 年的历史了,它的性能问题是有机会能够靠工夫来一直迭代解决的。但语言的个性并不能,每一步语言个性的抉择都是将来的包袱。所以从这个视角来看,也心愿大家看待语言,尽量避免唯性能论吧。 第二个点在于,它揭示了对语言来说最重要的是什么?或者说 Python 为什么能胜利?其实我感觉,指标人群的抉择是十分根因的货色。语言的个性跟指标人群的抉择无关,所以语言个性的抉择最重要。Python 从诞生之初,并没有给本人数据迷信语言的定位,它认为应该让语言尽量精简,容易被了解、被学习。它其实是一个少有的低门槛语言,因为在我看来,真正能够称为低门槛的语言并不多。 咱们想一下大家熟知的语言,比如说 Ruby,大家都说它很简洁,然而其实它有十分多的语言魔法。所以它可能很弱小,然而不能称之为易学习。所以在我心目中,能称得上是低门槛的语言 BASIC 算一个,面向教学畛域的 Scratch 算一个,也就是说其实在低门槛畛域进行摸索的语言并没有那么多,但正因为 Python 面向了低门槛,所以它尽管没有将本人定位成数据迷信语言,却成了数据迷信的王者。这其实蛮讥刺的,因为有十分多专一于数据迷信的语言都没有 Python 这么胜利,我认为这背地有十分粗浅的情理。 从全民编程这个大的趋势来说,其实低门槛化是将来语言支流的发展趋势,Python 恰好适应了这个大潮流,使得它明天可能比最后咱们看到的还要胜利。 那么 Python 到底还差什么?  首先从工程的视角来说,Python 这方面比拟弱。谈 Python 有些人会想到 Go,因为从 Python 转向 Go 的程序员也不少,起因就在于 Go 是设计思维最靠近 Python 的工程语言,使用者的心智累赘也是非常低的。然而 Go 语言的设计者心中根本只有工程,大家看 Go 的官网就晓得,它最关怀的一个词是 scale。也就是如何实现一个大型的工程,实现一个代码量十分宏大,然而依然在工程师掌控之中的工程。所以它没有在意低门槛,它在意的是如何去实现工程上的 scale。 所以从这两方面去看, Go+ 既然是面向全民的编程,那么咱们天然会去关注如何把 Go 和 Python 的劣势融在一体,把 Go 的工程能力和 Python 的低门槛化联合。 咱们晓得工程很宏大,去实现更宏大、更简单的零碎也是咱们所关注的,然而 STEM 教育也好,数据迷信也好,更关注的还是如何实现低门槛化。所以工程、STEM 教育、数据迷信三位一体,理论是工程和低门槛的交融,这就是 Go+ 的指标。  它们交融之后的样貌,咱们能够通过上面 Go+ 的代码范例来理解。 上面的这个示例大家可能会想到 Shell 编程,很多程序员可能会感觉 Shell 脚本是比拟低门槛的。它尽管在实现简单工作上比拟难用,然而它从了解上是大家最相熟的,咱们会看到 Go+ 的语法与 Shell 的十分靠近。  咱们再看另外一个例子,就是用 Go+ 去做游戏。下图实际上是两个角色的对话,一个非常简单的游戏,它的代码也是十分简洁的。这里咱们会看到命令行的影子,比方 onStart 这样的语句,是说在程序开始的时候,咱们应该做什么。onMsg 是我收到一个音讯当前要做什么。基本上有 onStart 和 onMsg 这样的事件机制,以及咱们看到外面的代码有 say、有 broadcast(播送音讯)。整个程序的流程,其实是通过事件加上 say 还有播送音讯,这样几个很根底的元素组成。  咱们能够看到这是两个角色的对话。第一个角色在程序开始的时候,说你来自哪里,而后紧接着播送音讯 1。另一个角色收到了音讯 1 后,他就会说我来自英国。而后他再播送音讯 2。角色一收到音讯 2 当前,他就会说你们国家的天气怎么样。这样,整个时序就由音讯驱动,两个角色之间的对话就造成了。这个程序十分简洁,通过它咱们能够看到 Go+ 在表白天然的语义上,有人造劣势,它的代码是十分通俗易懂的。 从这两个例子中咱们也能够看到,Go+ 尽管实际上是 Go 兼容的产物,但它的语法或者说倡议的最佳实际格调,和 Go 是有十分大差别的。它甚至比 Python 还要简洁,因为它抉择了命令行的格调。 这里咱们能够从工程的几个概念来了解。一是命令,它是一段代码的抽象化,最晚期的语言如 FORTRAN,它的命令其实是和函数离开的。当然起初所有的高级语言,基本上都把命令和函数合为一体。但在 Go+ 里,命令和函数从代码格调上来说是有差异的,然而它们背地都是函数。  所以在 Go+ 的代码格调上,咱们抉择了以命令格调为主体。因为命令的了解难度是最低的,小学生就能了解。其次是函数,这个概念初中生根本也就开始接触,比方三角函数。那联合计算机和数学中的函数,将两者相互印证,对初中生而言了解起来难度也不算高。基本上只有了解形参和实参的概念就能够了。 在面向对象中,类、办法这些概念,尽管它的确有助于形象世界,但实际上面向对象编程的了解门槛是最高的。所以 Go+ 其实在竭力防止让程序员用面向对象的写法。实际上在背地咱们会应用面向对象的一些思维,但在语言语法上,咱们尽量避免太过于面向对象化。所以 Go+ 1.0 中咱们看到了它根本奠定了 Go+ 的代码格调和指标。  既然指标和格调都定了,基本上咱们心愿的第一件事件,就是可能实现工程,成为第一个能够用于理论生产环境的版本。为了实现这个指标,从优先级来说最重要的有两件事件。一个是对模块 Module 的反对,大家都晓得 Go 对 Module 反对是很晚的,而 Go+ 在 1.1 版本基本上就兼容了 Go 的模块概念。咱们实现了对模块比拟齐备的反对,和 Go 用起来的体验是十分统一的。另外一个很重要的个性是,咱们实现了 Go 和 Go+ 的混合工程。这对用于生产环境是有十分大的帮忙的。因为大部分程序员面临的第一个问题,就是 Go+ 用来做什么?历史的工程可能是 Go 写的,那如何把它转化成 Go+ 呢?其实不必转,因为你的 Go 工程,就是 Go+ 的工程,你只须要在下面写一些 Go+ 的函数就行了。这样一来,咱们就能够十分轻松地去把 Go+ 用于生产环境。 接下来是提供 c2go 的预览,这是为后续版本服务的,它是一个十分难啃的骨头。咱们也在 Go+ 1.1 版本根本把它实现了。Go+ 反对 C,实际上是援用了 c2go 这个我的项目。咱们在这个版本实现了 c2go 最根底的能力。  咱们看 Go+ 的版本演进,如果说 Go+ 1.0 版本是明指标、定格调,那么 1.1 版本是为了进生产环境。模块也好,Go/Go+ 混合编程也好,其实都是在为进入生产环境打基础。  Go/Go+ 的混合编程,正如我方才提到的,任何一个 Go 工程,只有在其中增加几个 Go+ 的源代码,而后去把 go 的命令换成 gop,就能够失常地去做 Go+ 开发了。这实际上把 Go+ 的应用门槛降到了最低。 二、Go+ 以后节点:v1.2.x  以上是 Go+ 的过来,上面我想和大家分享以后 Go+ 正在做的事件,也就是 Go+ v1.2  版本。这个版本我是把它定义为 Go+ 特色化造成的过程。咱们预计在往年十二月份将 Go+ v1.2 版本正式公布。 咱们说这个版本是特色化造成的过程,次要有这样几个起因。首先是咱们在 1.0 版本中引入的类文件会转正,完结 Beta 过程。类文件是 Go+ 里十分重要的概念。第二个是 c2go,它对 Go+ 后续倒退起着至关重要的作用。咱们心愿 Go+ 的 v1.2 版本可能让 c2go 进入工程化,它的实现标记是至多实现了 sqlite3 的迁徙。 除了这两个很特色的性能外,Go/Go+ 混合编程也将失去加强。目前,Go/Go+ 的混合编程还不反对调用 Go 的泛型。咱们晓得 Go 的 v1.18 版本,引入了十分重要的个性就是泛型,但当初 Go+ 还不反对 Go 的泛型。那咱们在 v1.2 版本也会去反对。咱们不是在 Go+ 里去定义泛型,而是调用 Go 的泛型。 基于这样形式,咱们是让 Go+ 可能对泛型概念有最小化的能力,因为泛型是一个比较复杂的概念,但咱们并不心愿 Go+ 变得特地简单。从久远来看,Go+ 对泛型实际上持十分凋谢的态度,兴许有一天会全面反对泛型,但咱们不会把它看成优先级很高的货色。如果真须要用泛型,咱们心愿是通过和 Go 的混合工程来达到。 咱们接下来重点讲讲这两个特色性能,类文件和 c2go。 先聊类文件。类文件最直白的一个解释,就是咱们用一个文件去定义一个类。下图右侧就是用 Go 去写类的办法,想必大家十分相熟。  咱们先定义一个叫 Rect 的构造体,它有长度和宽度两个成员,那咱们再定义面积的成员办法,那就是长度和高度的乘积,这就是一个非常简单的程序。 用类文件来实现这个能力的话,代码能够见上图左侧。咱们基本上看不到任何面向对象的暗藏。咱们定义了两个全局变量,一个叫宽度,一个叫高度,而后定义一个全局的办法叫面积,它是这两个全局变量的乘积。那这个代码比失常的面向对象代码看起来要简洁很多,非常容易被了解。但实际上它这两个文件是等价的。因为类文件最间接的能力,就是负责把一个看起来像是面向过程的代码,主动变成一个面向对象的办法。因为它没有引入任何新的语法,所以其实对中小学生也绝对容易,不必去学新的常识。  但类文件做的并不只这些。实际上它还可能自定义基类,可能自定义整个程序执行的框架。咱们最近 Go+ 的公众号也重点在谈类文件,大家能够去看一看。Go+ 类文件:DSL vs. SDFGo+ 类文件:ClassFile 机制详解  提到类文件,就须要提到 Go+ 的一个设计哲学:Go+ 不反对畛域专用语言,也就不是不反对 DSL,但 Go+ 却对业余畛域敌对(Specific Domain Friendly)。 为什么说它是业余畛域敌对呢?从上文咱们的举例中来看,第一个例子是 Shell 编程,或者叫 DevOps 的畛域编程。咱们能够看到 Go+ 的代码看起来十分靠近于 Shell 编程。  实际上 Shell 编程更像是 DevOps 的 DSL,咱们很少在 Shell 之外去用这个语言,它只用于十分根底的一些自动化(automation)。然而咱们能够看到,Go+ 实际上是能够让语言自身的代码十分靠近于 DSL,但实际上它却不是 DSL,它是十分正宗的 Go+ 语法。 同样的情理,咱们能够看到在更简单的游戏编程中,Go+ 也是十分的简洁的。而且它不仅简洁,更重要的是它同时也十分弱小,它可能去做相似于《动物大战僵尸》这样比较复杂的游戏。当然咱们没有去做 3D 游戏的引擎,如果要做,那么它仍然是十分精简的 3D 游戏的引擎。  正是因为 Go+ 引入了类文件,让它的语法看起来十分畛域化。这意味着 Go+ 十分长于联合畛域的特色去提炼畛域常识。从而使得 Go+ 利于畛域的开发。 当然咱们类文件当初还在 Beta 的阶段,以后曾经在 2D 的游戏、DevOps 这些畛域做了一些实际。然而毕竟畛域是十分多的,对类文件这个概念来说,最大的挑战是畛域十分多,在无限的几个畛域里试验是不够的,须要有更多的畛域来验证类文件机制的普适性,判断它是否适应各个领域。  另外,咱们还须要革除 Beta 版本类文件外面的一些不必要的束缚。比如说,咱们以后一个业余的畛域只容许有一种工作类,在一些业余畛域里显然很有可能会须要突破这个束缚。所以咱们接下来在 v1.2 版本,会去打消掉相似这样的不必要束缚。咱们心愿可能让一个业余畛域有多种工作类,如此一来它的普适性就会更强。 v1.2 版本的第二个特色性能,就是方才提到 c2go。c2go 的语法可能看起来有点像 cgo,然而它和 cgo 齐全不可同日而语,cgo 用起来大家吐槽十分多,然而用 c2go 会感觉十分爽,因为咱们根本做到了无缝对接 C 语言。 首先,C 语言的代码是不须要通过额定包装的,间接就能够由 Go+ 来调用。其次,咱们让 C 和 Go+ 的类型零碎尽可能统一,极大化地升高了 C 和 Go+ 的对接老本。这样的话两者互相操作,类型上根本不必做转化。比如说在 C 语言外面的 void,就是无返回值、无参数的一个函数,到了 Go+ 里,基本上是一个 func()。那这样一个类型的映射,其实在 cgo 外面是做不到的。因为 cgo 须要做必要的函数调用约定转化,能力实现这样的调用。最初,咱们把 C 翻译之后,它的数据结构内存布局和程序语义尽可能放弃不变。也就是说 C 程序员,对 C 的代码的惯例语义了解依然是正确的。比如说字符串,它是以 '\x00',就是以 0 为结尾的,这些概念到了 Go+ 这边翻译当前,其实它依然是正确的。这样也会有助大家不至于在语义上出现分歧。 从下图的例子中咱们能够看出,通过 c2go 的形式,咱们实现了 C 的简洁调用。  咱们能够看到第一句是 import C,然而它和 Go 的语义是齐全不同的,在 Go+ 里它其实是 C/github.com/goplus/libc 的缩写。那咱们能够看出,这个例子中咱们调用了 2 个 C 函数:printf 和 fprintf,应用了一个 C 变量 stderr。另外还有一个比拟有意思的中央,是字符串,咱们看到在 Go+ 的规范字符串后面写一个 C 前缀,就代表 Go+ 里传入 C 的字符串常量,这实际上是一个 Go+ 的语法。然而有了这个语法当前,会使得在 Go+ 里调用 C 的代码会十分精简,不至于像 cgo 一样,会有一个从 Go 字符串转化成 C 的字符串,并且最初还要开释它这样一个过程。 这是一个十分小的例子,然而咱们能够看到 c2go 在表白上,是可能让大家感觉到如同 C 和 Go 的包是没有区别的。咱们引入 C 的包和引入 Go 的包,根本应用上大差不差。而且在所有的细节上,都会让大家感觉 C 的模块如同就是 Go 的模块,当然同时也是 Go+ 的模块,这是咱们心愿可能达到的最终成果。这也是咱们在 Go+ 里无缝兼容 C 的一个逻辑。 当然以后 c2go 还是一个预览版,它连 Beta 版都算不上。c2go 以后曾经实现了 C 语法 99% 以上的兼容,它没有实现的局部,次要在于规范 C 库的迁徙,它的完成度可能只有 5%,处在十分晚期的阶段。对 c2go 来说,它最次要挑战首先在于跨平台。一方面是 C 规范库(libc)的跨平台,另一方面如何让 c2go 对所有的 C 工程都能够轻松实现跨平台能力,同样是十分重要的能力建设工作。  单从 libc 自身来说,其实无论是 syscall、pthread,都有比拟大的工作量。syscall 当初咱们曾经反对了 mac 版本,但 Linux 和 Windows 还没有反对,那 pthread 就更不用说了,这是咱们接下来工作量最大的一个板块。所以 c2go 接下来最重要的是整个规范 C 库的迁徙,它自身就是比拟宏大的工作。 以上就是以后 Go+ v1.2 版本想要解决的事件,当然还有反对 Go 模板调用的小细节,咱们就不开展了。根本以上几个点形成了 Go+ 的特色能力,无论是类文件,还是对 C 的兼容,以及 Go 和 Go+ 的混合工程,都使得 Go+ 有了十分好的底子。 三、Go+ 将来布局 那么从 Go+ 的将来布局来说,大家都晓得 Go+ 在谈工程和 STEM 教育、数据一体化,实际上到 v1.2 为止,Go+ 在数据迷信畛域做的事件是绝对少的。会有一些十分无限的能力去实现,比方列表解析、range 表达式等等,但谈不上体系化,实际上 Go+ 的数据科学技术栈还是没有的。 所以在 v1.7 这个十分重要的大版本外面,咱们心愿 Go+ 本身数据迷信的技术栈可能造成。而后到 v2.0 又做了一个大的版本越级,咱们心愿 v2.0 这个阶段,要可能反对 Python 语法。当然,不是说在 Go+ 外面去写 Python。实际上跟反对 C 比拟相似,可能让 Go+ 无缝地去 import Python 的包,这样就使得 Python 数据迷信畛域历史的积攒,都能够无缝变成 Go+ 的数据迷信能力。  实际上这两个内容,都是面向数据迷信的。起因在于,从工程和低门槛化的大方向来说,到 v1.2 版本基本上能力曾经齐备。Go+ 基本上不太会去在语法上花很多精力,这一点 Go+ 和 Go 是有十分类似的哲学,咱们认为语法越少越好,而不是越多越好。所以,基本上到了 v1.2 版本当前,Go+ 的语法比拟定型了,咱们不太会加各种稀奇古怪的语法。 然而数据迷信是 Go+ 最初的攻坚战,它并不是简略的一个语法翻新上可能解决的问题。Go 的数据迷信根底能力是比拟薄的,当然也是因为 Go 自身衰亡的工夫比拟短,所以它在服务端的工程实际居多。 那么数据迷信底子这么薄的话,应该怎么办呢?v1.2 版本把 c2go 能力去工程化当前,为最初的数据迷信攻坚战打下了重要根底。因为 Python 的根底是 C,咱们如果对 C 做好了兼容,兼容 Python 就变得更加简略了。  v1.7 版本咱们会关注什么?它的指标实际上是 Go+ 数据科学技术栈的造成,打造 Go+ 本身的数据迷信能力,比方向量、矩阵等一些方面的摸索。实际上即便有了这样的根底能力,它依然还是比拟薄弱的。  如何真正解决这个问题,让本人站在伟人的肩膀上?咱们的构想是通过 c2go 来反对 Python 的数据迷信底座(也就是 C 库那局部),v1.7 版本咱们心愿可能把 Python 的 C 库局部进行兼容,从而走上 Go+ 和 Python 数据迷信能力生态交融的路线。然而这个阶段咱们对 Python 自身不会去做太多思考,次要还是关注 Python 的 C 库局部。  然而到了 v2.0 版本,咱们就开始思考把 Python 的语法也引入进来,让 Python 的包天然地成为 Go+ 生态的一部分。咱们构想在 v2.0 版本,至多要反对 CPython、NumPy、pandas 这三个工程。第一个是 Python 自身,其余两个是最出名的 Python 数据迷信工程,有了它们当前,咱们认为 Go+ 就具备了对数据迷信的根底生态能力。 这里为大家展现这三个工程的代码,列一下代码行的构造。咱们看 Python 自身,大部分底座的代码是 C,然而有 65% 的 Python 的代码其实次要是一些规范库,这个是很容易了解的。然而最外围的能力都是 C 实现的,占 30% 多。  第二个就是 NumPy,NumPy 其实也是一样的做法,它最外围的能力就是 C 写的,还有大量的 C++。然而在这个根底上迭加了一个工具包,是用 Python 本人写的。从这个代码行能够看到,占比根本在 6:3、6:4 的样子。  pandas 构造有十分大的差别,它自身大部分代码是 Python 写的,C 的局部比拟少。基本上到了 v2.0 版本能力比拟好地反对 pandas,v1.7 版本基本上还不太能反对 pandas,但曾经能够反对 NumPy 了。  总结一下 Go+ 的演进之路,咱们的指标是实现工程、STEM 教育、数据迷信的三位一体。这次要还是因为咱们将来的语言,支流趋势是面向全民编程,也就是人人都能够学编程。实际上这个指标很难,但它是将来语言倒退的支流趋势。目前鲜有语言在面向这样的趋势致力,Go+ 能够认为是第一个。  往年内,Go+ 在工程化和低门槛交融的摸索就将告一段落。从明年开始,咱们将对数据迷信发动最初的攻坚战。大家都晓得,Go+ 诞生之初咱们就在谈数据迷信。然而理论真正去执行的时候,数据迷信反而放到最初一点。 起因在于数据迷信真的是比拟难的一件事件,对 Go 来说它的间隔比拟远。然而咱们基本上有了 c2go 的根底,就会发现它对咱们日后去做好数据迷信,会产生很重要的撑持作用。 最初,我置信有了数据迷信的撑持,Go+ 会是举世无双的。它的将来,值得咱们独特期待。  ...

July 15, 2022 · 4 min · jiezi

关于编程语言:2022-年编程语言趋势SwiftKotlin-热度持续增长收入最高的-5-种编程语言竟是它们

随着低代码和无代码平台的衰亡,2022 年编程语言的世界正在悄悄产生着变动。现在,大多数开发人员对最罕用的惯例编程语言有着透彻的理解,但把握不常见的编程语言也能帮忙开发者取得高薪的工作。特地是如软件开发、WEB 开发、利用程序开发等需要一直增多,对于开发者而言一些编程语言热度榜单也值得参考。 近日,不少外网都对 2022 年编程语言各个维度的热度趋势及排名做了盘点,正所谓“明天热门的货色今天可能会不受欢迎”,所以新的编程语言不断涌现,且每一种都有本人的长处和毛病,因而开发人员必须理解它们。 2022 年编程语言趋势其中,一份来自 Serpwizard 的“2022 年编程语言趋势”报告备受开发者关注。该报告以“倒退”的角度来对 2022 年编程语言趋势做了盘点。一起来看看: 1、JavaScript 继续风行多年来,JavaScript 始终是最风行的编程语言之一,2022 年这种状况不太可能扭转。该语言一直倒退,新的框架和库一直公布。这使它成为心愿跟上最新趋势的开发人员的最佳抉择。 2、Python 崛起,2022 年持续风行Python 在近年来越来越受欢迎,并将在 2022 年持续风行。这种语言因其简略的语法和宽泛的规范库而深受开发人员的青睐。因为其弱小的数据分析能力,它在科学界也越来越受欢迎。 3、挪动终端的倒退带动 Swift 和 Kotlin 持续增长现在,应用智能手机和平板电脑的人数比以往任何时候都多,挪动设施市场的持续增长,意味着像 Swift 和 Kotlin 这样的专门用于开发 iOS 和 Android 应用程序的语言可能会持续增长。 4、函数式编程的风行带动 Haskell 和 Scala 成热门函数式编程是一种强调应用函数而不是对象的编程格调。像 Haskell 和 Scala 这样的语言在设计时就思考到了这种范式,并且它们越来越受到重视函数式编程(FP)益处的开发人员的欢送。 5、区块链的衰亡带动 Solidity 等语言衰亡区块链当初是一个热门话题,因为它有可能彻底改变咱们存储和共享数据的形式。尽管这项技术仍处于晚期阶段,但人们对它很感兴趣,这一趋势可能会在2022年继续下去。这可能会导致Solidity等语言的遍及,Solidity用于在以太坊区块链上开发智能合约。 6、Kotlin、Groovy 等代替 JVM 语言更风行Java 虚拟机(JVM)是一个平台,容许开发人员用多种不同的语言编写代码,并在任何有 JVM 实现的零碎上运行。这使得它成为心愿编写一次代码并在任何中央运行的开发人员的风行抉择。近年来,Kotlin、Groovy 和 Clojure 等代替 JVM 语言的风行迅速。随着越来越多的开发人员发现这些语言的益处,这种趋势可能会在 2022 年继续下去。 7、Rust 一直增长Rust 是一种重视安全性、速度和并发性的零碎编程语言。近年来,因为其平安个性变得越来越受欢迎,这使得它非常适合开发低级系统软件。随着越来越多的开发人员发现 Rust 的益处,这种趋势可能会在 2022 年继续下去。 ...

June 30, 2022 · 1 min · jiezi

关于编程语言:KusionStack-开源有感|历时两年打破-隔行如隔山-困境

文|朵晓东(花名:奕杉 ) KusionStack 负责人、蚂蚁团体高级技术专家 在基础设施技术畛域深耕,专一云原生网络、运维及编程语言等技术工作 本文 2580 字 浏览 6 分钟 |前言|本文撰写于 KusionStack 开源前夕,作者有感而发,回顾了团队从 Kusion 我的项目开发之初到现今胜利走上开源之路的艰苦历程。当中既形容了作者及其团队做 Kusion 我的项目的初心和我的项目倒退至今的成绩,也表白了作者本身对团队的由衷感谢,字里行间都散发着真情实感。 KusionStack 是什么? KusionStack 是开源的可编程云原生协定栈! Kusion 一词来源于 fusion (意为交融) ,心愿通过一站式的技术栈交融运维体系的多个角色,晋升运维基础设施的开放性、扩展性,从整体上降本增效。KusionStack 通过定义云原生可编程接入层,提供包含配置语言 KCL、模型界面、自动化工具、最佳实际在内的一整套解决方案,连通云原生基础设施与业务利用,连贯定义和应用基础设施的各个团队,串联利用生命周期的研发、测试、集成、公布各个阶段,服务于云原生自动化零碎建设,减速云原生落地。 PART. 1为了一个现实的运维体系2019 年秋,MOSN 的工作已继续了近两年,期间咱们逐渐实现了在支付宝外围链路的状态验证。整个过程中除了 MOSN 自身面对的种种技术挑战和艰难,所谓的云原生技术红利,实际上也曾经掣肘于运维零碎固化所造成的效率制约。 有一天主管找我吃饭 (下套) ,期间向我形容了他现实中的运维体系: 他心愿 SRE 能通过一种专用语言来编写需要,通过写代码来定义基础设施的状态,而不是破费极大的精力在查看、发现、修复的循环上。基础设施团队则通过提供凋谢的可编程语言和工具撑持不同诉求的 SRE 团队,达到更高的整体 ROI。 我立即意识到这和 Hashicorp 的 Terraform 神之类似 (起初 Hashicorp 在 2021 年底上市,以超过 150 亿美元的市值成为迄今为止市值最高的一次开源 IPO) 。另一方面,不同于 IaaS 交付场景,蚂蚁面对着大量更规模化、复杂度更高的云原生 PaaS 场景,又让我想到了 Google 外部使用专用语言、工具等技术凋谢 Borg[1]运维能力的实际[2],过后感觉这是一个既有意思又有挑战的事[3]。 饭桌上咱们聊了一些思路以及一些还不太确定的挑战,他问我想不想搞一个试试,搞不成也没关系。过后没想太多,饭没吃完就许可了。 PART. 2漫长的学习、摸索与实际隔行如隔山。 没有过语言设计研发的教训,也没有过凋谢自动化零碎设计的教训,我的项目发展之初,咱们就陷入了举步维艰的窘境。 经验了一段漫长工夫的学习、摸索和实际的重复循环之后,我的项目仍旧没有大的起色,更艰难的是咱们岂但要面对蚂蚁外部简单又耦合的场景和问题,还要禁受「这种高度工程化的形式在蚂蚁是否有生存土壤」的质疑。 ...

June 7, 2022 · 1 min · jiezi

关于编程语言:TIOBE-3-月榜单Python-牢据榜首Lua-重返前-20

近日,TIOBE 颁布了 2022 年 3 月的编程语言排行榜。自去年 10 月登顶后,Python 至今仍牢牢占据榜一的地位。而本月值得注意的是:脚本语言 Lua 挤掉了 Groovy ,从新回到了 TIOBE 榜单的前 20 名。 在 2011 年鼎盛时期,Lua 曾短暂进入前 10 名。目前尚不分明它是否会再次回归。但很显著的是,Lua 正在游戏开发市场致力追赶:容易学习,执行速度快,与 C 语言的接口简略,使得 Lua 成为游戏、工作的现实抉择。而其取得成功的驱动力之一来自十分受欢迎的游戏平台 Roblox,它应用 Lua 作为其次要的编程语言。 TIOBE 3 月 TOP 20 编程语言 TOP 10 编程语言 TIOBE 指数走势(2002年-2022年) 21-50 编程语言排名因为这份排名是非官方公布的,因而可能存在脱漏,故仅供参考。 第 51-100 名如下,因为它们之间的数值差别较小,仅以文本模式列出(按字母排序): ABC, ActionScript, Alice, Apex, ATLAS, Bash, bc, BCPL, Boo, Bourne shell, C shell, CL(OS/400), Clipper, CLIPS, CoffeeScript, DCL, DiBOL, Dylan, ECMAScript, Eiffel, Elm, EXEC, F#, Factor, GML, Hack, Harbour, Haxe, Icon, IDL, Io, J#, Korn shell, Ladder Logic, LiveCode, LPC, ML, Monkey, OCaml, OpenCL, Oz, Processing, Q, Racket, REXX, Ring, S-PLUS, Scheme, SPARK, Tcl本月索引中的变动 本月对索引的定义做了以下改变。 ...

March 9, 2022 · 1 min · jiezi

关于编程语言:代码的智能输入法帮你每天多写10行代码

作为有着多年教训的复制粘帖工程师,我感觉对于业务开发,参考已有代码来实现新逻辑是很实在的需要,如果能通过含糊的记忆疾速调用出相应的代码段,而不是手动全局搜寻,应该能肯定水平上进步代码输出的效率。 基于这个想法,开发了一个vscode插件 Code Finder,欢送应用。 应用成果类比中文的智能拼音输入法,咱们输出一个词组,只有通过首字母就能找到最罕用的词组。 如果用这种形式输出代码的话,成果是这样的 CodeFinder 是代码的智能输入法,输出大量字符来疾速实现一行或者多行代码。主动提取以后我的项目的所有代码片段,也能够增加自定义代码片段。反对所有编程语言,比方 Javascript, HTML, CSS, Python, Go, PHP, Vue, React ... 一些外围逻辑的实现代码片段的划分提醒的大部分代码片段来自本地我的项目,所以须要对我的项目源码进行代码片段提取。最开始想从语法和语义来进行分段,发现这是不归路。对于绝大部分编程语言,咱们都会用缩进来表白代码的段落,间接依据代码缩进划分段落就能够了。定义一个简略的规定,前缀空格数量示意层级,低层级的代码行能够和高层级的代码行组成段落。同级的代码行应该属于不同的代码片段。而后递归划分就能够失去各个代码片段了。再聚合雷同的代码片段。 索引和搜寻实质上,这是一个搜寻的问题。对于输出,能够应用Trie树的形式来索引各个代码片段。因为要在本地运行,几十毫秒的工夫内实现搜寻,在代码片段达到一定量级的时候,就可能无奈遍历了,所以引入了剪枝的逻辑,在工夫用完时,抛弃广度遍历过程中匹配状况较差的分支。 跳跃式输出为了缩小对失常输出的烦扰,就要辨别哪些是惯例输出,哪些是对输入法的调用。所以发明了“跳跃式输出”:空格分隔间断输出多个词,疏忽其余符号。如果应用这种不合乎语法规定的省略输出,阐明是用户被动发动,否则认为是惯例输出。跳跃式输出每次都会提醒,而惯例输出只有在十分匹配的状况下才会提醒。

January 17, 2022 · 1 min · jiezi

关于编程语言:搞安全开发都是用什么编程语言

很多小伙伴都在微信上问我:搞平安开发,到底开发个啥,都是用什么编程语言? 明天就来具体说说这个话题,我打算从平安公司研发的产品这个角度来切入,看看都有哪些产品,以及都用到哪些语言。 平安公司的产品研发,次要是上面这些货色,上面别离来说一下。 WAF(Web网站利用防火墙) 数据库网关 防火墙、IDS、IPS NTA(网络流量剖析)SIEM(安全事件剖析核心、态势感知、大数据安全剖析) EDR(终端设备上的安全软件) DLP(数据透露防护) UBA(用户行为剖析)杀毒软件 平安检测沙箱WAFWAF全称Web网站利用防火墙,是一种非凡的防火墙,专门用来爱护Web利用平安的平安产品,次要进攻SQL注入、XSS注入、CSRF、CC攻打之类的网络攻击。 这类产品个别有两个流派。一种是基于底层网络流量来做,一种是基于nginx/openresty这类下层WebServer来做。 基于底层流量剖析引擎的来做的,以 C/C++ 为主。 基于nginx/openresty引擎来做的,以C/C++ 和 Lua为主。 数据库网关和WAF有点相似,但爱护的指标不是Web利用,而是数据库。 毕竟,对于绝大多数互联网公司来说,WebServer和数据库是撑持他们业务中最重要的两个角色,所以守护好这两个货色是必须的! 数据库网关,次要负责进攻对数据库的攻打,检测高危操作,数据安全备份等。 用到的编程语言以C/C++ 和 Java为主。 当初云计算时代,很多公司的业务都放在了云端,这些云计算厂商相应的也都有推出本人的平安防护服务,WAF、数据库网关、DDOS云盾三大件是标准配置。 数据库网关,次要负责进攻对数据库的攻打,检测高危操作,数据安全备份等。 用到的编程语言以C/C++ 和 Java为主。 当初云计算时代,很多公司的业务都放在了云端,这些云计算厂商相应的也都有推出本人的平安防护服务,WAF、数据库网关、DDOS云盾三大件是标准配置。 杀毒软件最常见的,普通人最能间接接触的应该就是安全软件了。 次要波及到的技术有病毒木马剖析、驱动开发,应用的编程语言次要是C、C++。 NTA、防火墙、IDS、IPSNTA就是网路流量剖析的简称,IDS是入侵检测零碎,IPS是入侵进攻零碎。 这类货色,次要是基于网络流量的平安检测和进攻产品。波及到网络抓包、抓包剖析等货色。 一般来说,这类产品对性能要求特地高,因为通常须要解决十分大的流量数据,10Gbps的万兆网络流量剖析是惯例操作。 所以,这部分抓包、剖析比拟底层的引擎根本都是用 C/C++ 来开发。 SIEMSIEM全称Security Information Event Management(平安信息事件管理中心),差不多就是很多公司中的大数据安全剖析零碎、态势感知零碎之类的玩意儿。 那些看起来各种高端大气狂拽炫酷的界面,基本上都是这种产品: 这是一个平安剖析平台,通过会集多方(网络流量、日志、威逼情报、沙箱检测等)产生的数据,并对这些数据进行关联剖析,而后判断有没有平安危险,产生平安告警。 SIEM,基本上很多公司都有,但真正做得好的不多,想要做好,除了数据源的高价值,对剖析算法、算法模型都有十分高的要求,这方面的人才很难找。 这块偏重于业务层的剖析工作,波及各种解决,在我见到的各大公司产品中,次要是Java开发,毕竟Java背地的大数据生态是一大劣势,对于数据挖掘,关联剖析都是严密相干的。 EDR全称终端平安响应零碎,是运行在终端设备上的一套软件。 其实跟咱们常见的杀毒软件很像,除了具备根底的平安进攻性能,爱护主机免受攻打,还会将主机上产生的一些事件汇报到SIEM用于平安剖析。 EDR和杀毒软件相似,也是用 C/C++ 开发。 UBA全称用户行为剖析,是基于EDR、NTA等产品的产生数据之上,用来剖析用户行为的一套零碎。 简略来说,这玩意依据收集到的员工的行为(电脑上的操作、上网数据等),能够剖析出,这个用户是不是异样,有没有干什么好事。 比方某个用户工作工夫微信相干的IP产生的流量十分多,则很有可能判断这家伙下班常常群聊摸鱼~ 这套零碎是一套纯后端系统,个别也是应用Java开发。 DLP全称数据透露防护,也是运行在终端设备上的一套软件,当然也有一些不在终端而以网关模式存在。 不同于杀毒软件和EDR,DLP的次要作用是避免主机上的数据泄露。个别用在一些比拟重要的单位中,员工电脑上的数据十分重要,用于避免窃密事件产生。 次要波及的技术是驱动开发技术,流量剖析技术,用的编程语言也是C/C++。 平安检测沙箱病毒木马和Exploit的剖析,除了传统的基于特色和规定的动态剖析引擎之外,动态分析技术是另一个重要的补充。而动态分析中,则次要是以沙箱剖析为代表。 ...

December 29, 2021 · 1 min · jiezi

关于编程语言:Go语言学习查缺补漏ing-Day6

作者:ReganYue 起源:恒生LIGHT云社区 Go语言学习查缺补漏ing Day6一、构造体嵌套时领有同名办法的状况咱们来看一看上面这段代码代表的含意: package mainimport ( "fmt")type Student struct{}func (s *Student) sayHello() { fmt.Println("sayHello") s.sayBey()}func (s *Student) sayBey() { fmt.Println("sayBey")}type Teacher struct { Student}func (t *Teacher) sayBey() { fmt.Println("teacher sayBey")}func main() { t := Teacher{} t.sayBey()}在这外面有一个嵌套构造体,其中Teacher是内部类型,Student是外部类型。这样就能实现外部属性,也就是这的Student的属性办法,可能被内部类型也就是Teacher领有。当然,内部属性也能够领有本人的属性、办法,如果领有了与外部类型一样名字的办法,那么同名的外部类型的办法就会失去作用。 这个例子的输入后果是什么,我想你应该晓得了: teacher sayBey这个例子中的sayBey()办法就是同名的办法,所以外部类型Student的这个办法会失去作用,调用就是调用Teacher中定义的sayBey()办法。 二、应用defer执行函数的一个注意事项package mainimport ( "fmt")func sayHello(i int) { fmt.Println(i)}func main() { i := 888 defer sayHello(i) i = i + 8888}咱们都晓得defer是在最初执行的,那么你看一看这里输入什么? 答案是:888 为什么呢? 因为程序在运行到 defer sayHello(i)时就把函数中的参数的正本保留,这里保留的参数i的值就为888. 因而,sayHello(i)的后果并不是在主函数完结之前进行,而是在 defer关键字调用时计算的。 怎么解决这个问题呢? 很简略,在defer时应用匿名函数就行了。 ...

December 9, 2021 · 1 min · jiezi

关于编程语言:Go语言学习查缺补漏ing-Day5

作者:ReganYue 起源:恒生LIGHT云社区 Go语言学习查缺补漏ing Day5一、将切片当可变参数传递的一个问题咱们来看一段代码: package mainimport "fmt"func Myfunc(num ...int) { num[0] = 2 total := 0 for _, i := range num { total += i } num[1] = total}func Sum(num ...int) { total := 0 for _, i := range num { total += i } num[1] = total}func main() { i := []int{1, 2, 3} Myfunc(i...) fmt.Println(i) Sum(i...) fmt.Println(i)}这段代码的运行后果是: [2 7 3][2 12 3]是不是很奇怪为什么切片内的值扭转了?其实咱们将切片作为函数参数传递给函数是进行的值传递,所以咱们传递给函数的参数其实是上面这个slice的值拷贝。 type slice struct{ value *int length uint capacity uint }然而,这个slice构造体内的value是一个指针,所以这个slice就算进行了拷贝,它和它的拷贝值都是同一个value,指向同一块区域。 ...

December 8, 2021 · 1 min · jiezi

关于编程语言:字节码引用检测原理与实战

一、字节码与援用检测1.1 Java字节码本章中的字节码重点钻研Java 字节码,Java字节码(Java bytecode)是Java虚拟机执行的一种指令格局。能够通过javap -c -v xxx.class(Class文件门路) 命令来查看一个Class对应的字节码文件,如下图所示: 1.2 字节码检测字节码检测实质就是对.java或.kt文件编译后生成的Class文件进行相干的剖析和检测。在正式介绍字节码剖析在援用检测上的原理与实战前,先介绍下字节码援用检测的技术预研背景。 二、字节码检测技术的预研背景整个预研背景须要先从笔者负责的APP--外销官网APP的软件架构讲起。 2.1 外销官网APP软件架构外销官网APP目前共12个子仓,子仓分别独立编译成AAR文件供APP工程应用,软件架构图如下图所示: APP以下,下层浅蓝色为业务层,两头绿色为组件层,最上层深蓝色为根底框架层: 业务层:位于架构最上层,依据业务线划分的业务模块(比方商城、社区、服务),与产品业务绝对应。组件层:是APP的一些根底性能(比方登录、自降级)和业务专用的组件(比方分享、地址治理、视频播放),提供肯定的复用能力。根底框架层:通过跟业务齐全无关的根底组件(比方三方框架、自行封装的通用能力),提供齐全的复用能力。2.2 外销官网APP客户端开发模式官网APP目前次要分3条业务线,多业务版本并行开发是常态,所以模块化十分必要。官网APP模块化的子仓均已AAR模式供APP应用,且存在下层AAR依赖上层AAR的状况。官网APP模块化分仓优化工作穿插在各业务版本中,各业务版本并行开发,底层仓库不免有批改。官网APP各业务版本并行开发时,个别只会新拉取以后版本须要批改代码的仓库,其余仓库均持续依赖老版本的AAR。2.3 类、办法、属性援用谬误导致的运行时解体假如以下场景: 官网APP5.0版本开发过程中,因为HardWare仓没有业务批改,所以持续应用上个版本4.9.0.0的HardWare(版本开发过程中个别只会从新拉取须要批改的仓库,无需批改的仓库会持续应用老版本),但Core仓有代码批改,所以拉取了新的5.0分支,并批改了相干代码,删除了CoreUtils类中的某个fun1办法,如下图所示: 注:硬件检测模块v4.9.0.0版本AAR中用到了外围仓 CoreUtils.class中的fun1办法,其余仓包含主APP工程均未应用到该fun1办法。请大家思考下,以上场景我的项目编译是否会有问题? 答:编译无问题 APP主仓依赖的是4.9.0.0版本的HardWare仓编译后的AAR文件,这个AAR文件早在4.9版本就编好没动,所以HardWare仓没有编译问题; APP主仓依赖的是5.0.0.0版本的Core仓,HardWare依赖的是4.9.0.0版本的Core仓,最终编译会取Core仓的高版本5.0.0.0版本参加APP工程编译,App仓没有应用被删除的fun1办法,也不存在编译问题。 以上场景我的项目编译实现后运行过程中是否会有问题? 答:有问题。 在APP运行到HardWare仓调用了CoreUtils类中fun1办法的状况下就会呈现运行时解体:Method Not Found。 因为最终参加APP工程编译的是5.0.0.0版本的Core仓,该版本曾经删除了fun1办法,所以会呈现运行时谬误。 实在案例: 1)找不到办法 2)找不到类 所幸以上问题均在开发、测试阶段发现并及时修复掉了,如果流到线上,就是运行到某性能时的必崩场景,将会十分重大。 如果你负责的APP的所有module均是源码依赖,个别状况下如果存在援用问题,编译器会进行提醒,所以个别状况下无需放心(除非依赖的底层sdk存在援用问题),但如果是相似官网这样的软件架构,则须要重点留神。 2.4 现状剖析、思考本地测试过程中已呈现过援用问题导致的运行时异样,这种运行时异样的检测只靠人工是不够的,必须要有自动化的检测工具来进行查看。传统的findBugs、Lint等是代码动态检测工具,是无奈检测出这种潜在的援用问题导致的运行时异样的,动态代码检测无奈解决此问题。所以自研自动化的检测工具火烧眉毛! 三、字节码检测的解决方案如果能在APK编译期间,通过自动化工具对所有JAR、AAR包中每个类做一遍检测,检测其中调用的办法、属性的应用是否存在援用问题,将检测出疑似问题的中央在编译时进行提醒,有必要的状况下间接报错终止编译,并输入谬误日志来揭示开发人员查看,避免问题流入线上呈现运行时异样。 原理:各子仓的Java类(或Kotlin类)在编译成AAR或JAR后,AAR、JAR中会有所有类的Class文件,咱们实际上就是须要对编译后生成的Class文件进行剖析。 如何对Class文件进行字节码剖析? 这里举荐应用 JavaAssist 或 ASM,咱们晓得Android编译过程次要通过Gradle来管制的,要想剖析Class文件字节码,咱们须要实现本人的Gradle Transform,在Transform里对Class字节码进行剖析,这里咱们间接做成Gradle插件。 在编译期间主动剖析Class字节码是否存在办法援用、属性援用、类援用找不到或者以后类无权拜访的问题,发现问题进行编译,并输入相干日志,揭示开发人员剖析,并反对对插件的配置。 到这里,整个计划的主体框架就比拟清晰了,如下图所示: 3.1 办法和属性援用检测原理办法和属性援用问题的辨认: 如何辨认一个办法援用存在问题? 该办法被删除,找不到相干办法名;找不到办法签名雷同的办法,次要是指办法的入参数量、入参类型无奈匹配;办法是非public办法,以后类无权限拜访该办法。如何辨认一个属性(字段)援用存在问题? 该属性被删除,找不到相干属性、字段;属性是非public属性,以后类无权限拜访该属性。权限修饰符阐明: 办法和属性援用的字节码检测:咱们能够利用JavaAssist、ASM等反对字节码操作的库来实现对所有类中办法、属性的扫描,并分析方法调用、属性援用是否存在援用问题。 3.2 办法和属性援用检测实战以下代码均已Kotlin编写,实现Gradle Plugin、Transform具体过程省略,间接上检测性能的代码。办法、字段援用检测: // Gradle Plugin、自定义Transform的局部这里不做赘述// 办法援用检测// 遍历每个类中的 每个办法 (包含构造方法 addBy Qihaoxin)classObj.declaredBehaviors.forEach { ctMethod -> //遍历以后类中所有办法 ctMethod.instrument(object : ExprEditor() { override fun edit(m: MethodCall?) { super.edit(m) //每个办法调用都会回调此办法,在此办法中进行检测 //援用查看性能 try { //这里不是每个办法都须要校验的,过滤掉 咱们不须要解决的 零碎办法,第三方sdk办法 等等 只校验咱们本人的业务逻辑代码 if (ctMethod.declaringClass.name.isNeedCheck()) { return } if (m == null) { throw Exception("MethodCall is null") } //不须要查看的包名 if (m.className.isNotWarn() || classObj.name.isNotWarn()) { return } //method找不到,底层会间接抛异样的,包含办法删除、办法签名不匹配的状况 m.method.instrument(ExprEditor()) //拜访权限检测,该办法非public,且对以后调用这个办法的类是不可见的 if (!m.method.visibleFrom(classObj)) { throw Exception("${m.method.name} 对 ${classObj.name} 这个类是不可见的") } } catch (e: Exception) { e.message?.let { errorInfo += "--办法剖析 Exception Message: ${e.message} \n" } errorInfo += "--办法剖析异样产生在 ${ctMethod.declaringClass.name} 这个类的${m?.lineNumber}行, ${ctMethod.name} 这个办法 \n" errorInfo += "------------------------------------------------\n" isError = true; } } /** * 成员变量调用的剖析次要有: * 变量间接被删掉后找不到的问题 * private变量的只能定义该变量的类试用 * protected变量的可被类本人\子类\同包名的拜访 * */ override fun edit(f: FieldAccess?) { super.edit(f) try { if (f == null) { throw Exception("FieldAccess is null") } //不须要查看的包名 if (f.className.isNotWarn() || classObj.name.isNotWarn()) { return } //这里不必判空,如果field找不到(这个属性被删掉了),底层会间接抛异样NotFoundException val modifiers = f.field.modifiers if (ctMethod.declaringClass.name == classObj.name) { //只解决定义在本类中的办法,不然基类里的办法也会被解决到--会呈现本类理论没拜访基类里的private变量但报错的问题 if (ctMethod.declaringClass.name == classObj.name) { if (!f.field.visibleFrom(classObj)) { throw Exception("${f.field.name} 对 ${classObj.name} 这个类是不可见的") } } } } catch (e: Exception) { e.message?.let { errorInfo += "--字段剖析 Exception Message: ${e.message} \n" } errorInfo += "--字段剖析异样产生在 ${classObj.name} 该类在 ${f?.lineNumber}行,应用 ${f?.fieldName} 这个属性时\n" errorInfo += "------------------------------------------------\n" isError = true } } })}在以上代码实现中,是遍历了所有的办法,对办法内的办法调用、字段拜访进行了检测。那么全局变量如何查看呢? ...

December 7, 2021 · 3 min · jiezi

关于编程语言:Go语言学习查缺补漏ing-Day4

作者:ReganYue 起源:恒生LIGHT云社区 Go语言学习查缺补漏ing Day4一、把握iota的应用请看上面这段代码: package mainimport "fmt"const ( a = iota _ b c = "ReganYue" d d1 e = iota f = iota)func main() { fmt.Println(a, b, c, d, d1, e, f)}思考一下输入后果会是什么? 先不颁布输入后果。先来谈一谈iota,iota是用于给须要自增长常量赋值的标识符。咱们能够用下划线 _来省略掉不想要的值。而咱们两头给变量赋值了,而后如果后续的变量如果不赋值,后续的d,d1的值就会和c一样。然而如果再次给一个变量标记为iota,就又会赋值自增长的值,而且值从这里第一个变量定义时就始终在自增长。 所以输入后果是: 咱们再来看一看iota这个用法: package mainimport "fmt"const ( A, B = iota, iota + 1 C, D E, F)func main() { fmt.Println(A, B, C, D, E, F)}运行后果是: iota是在下一行才进行增长,而不是每个变量都增长。 二、哪些类型的变量能够赋nilvar ( A string = nil B int = nil C interface{} = nil D chan int = nil E float64 = nil F func() = nil G []int = nil H map[int]int = nil I *int = nil)你晓得下面哪些类型的变量能够赋nil值吗? ...

December 7, 2021 · 1 min · jiezi

关于编程语言:Go语言学习查缺补漏ing-Day2

作者:ReganYue 起源:恒生LIGHT云社区 Go语言学习查缺补漏ing Day2一、函数返回参数命名的一个注意事项请大家察看上面这个函数有什么问题吗? func fun(x, y int) (s int, error) { return x * y, nil}尽管这个谬误,在集成开发环境Goland中会有提醒,然而其余的开发工具,比方VS Code就不晓得会不会提醒了。 咱们能够看到这个提醒:函数有命名的返回参数,也有没有命名的返回参数。 这就阐明函数有多个返回值参数时,如果你给一个参数命了名,那么其余参数也必须命名。而且如果给参数命名,那么必须给参数加上括号,无论参数个数是一个还是多个。这里给第一个参数命名为s,而没有给第二个参数命名,所以有谬误。 二、new()和make()有什么不同?在Go SDK中,对new的形容是这样的: // The new built-in function allocates memory. The first argument is a type,// not a value, and the value returned is a pointer to a newly// allocated zero value of that type.func new(Type) *Type它是一个用于分配内存的内置函数,只有一个参数。如果应用这个函数,那么就会返回一个指向一块新开拓内存的指针,这块内存是第一个参数示意的类型的零值。 咱们再来看一看make: // The make built-in function allocates and initializes an object of type// slice, map, or chan (only). Like new, the first argument is a type, not a// value. Unlike new, make's return type is the same as the type of its// argument, not a pointer to it. The specification of the result depends on// the type:// Slice: The size specifies the length. The capacity of the slice is// equal to its length. A second integer argument may be provided to// specify a different capacity; it must be no smaller than the// length. For example, make([]int, 0, 10) allocates an underlying array// of size 10 and returns a slice of length 0 and capacity 10 that is// backed by this underlying array.// Map: An empty map is allocated with enough space to hold the// specified number of elements. The size may be omitted, in which case// a small starting size is allocated.// Channel: The channel's buffer is initialized with the specified// buffer capacity. If zero, or the size is omitted, the channel is// unbuffered.func make(t Type, size ...IntegerType) Type咱们能够理解,make也是分配内存的,然而只能给slice, map 或者 chan分配内存。而且这个make也不返回指针,而是返回你第一个参数代表的类型的值。 ...

December 3, 2021 · 2 min · jiezi

关于编程语言:Go语言学习查缺补漏ing-Day1

作者:ReganYue 起源:恒生LIGHT云社区 Go语言学习查缺补漏ing Day1零、前言因为笔者根底不牢,在应用Go语言的时候常常遇到很多摸不着头脑的问题,所以笔者下定决心好好对Go语言进行查漏补缺,本【Go语言查缺补漏ing】系列次要是帮忙老手Gopher更好的理解Go语言的易错点、重难点。心愿各位看官可能喜爱,点点赞、关注一下呗! 一、多个defer的执行程序package mainimport "fmt"func main() { defer fmt.Println("蠢才第一步") defer fmt.Println("雀氏纸尿裤") defer fmt.Println("战神第一步") defer fmt.Println("盖亚纸尿裤")}咱们在理论我的项目开发中,常常会遇到应用多个defer来进行延时解决的状况,这时候,理解多个defer同时存在的状况下,它们的执行程序就是非常重要的了。 这段代码的运行后果是: 盖亚纸尿裤战神第一步雀氏纸尿裤蠢才第一步也就是说,当多个defer语句并称时,它们遵循后进先出的程序。 二、defer与return的先后执行程序package mainimport "fmt"func main() { fmt.Println("主函数:", d())}func d() int { i:=0 defer func() { i+=10 fmt.Println("先来的defer语句:", i) }() defer func() { i++ fmt.Println("后到的defer语句:", i) }() return i}先看一看执行后果: 后到的defer语句: 1先来的defer语句: 11主函数: 0明确执行程序了吗? 明确的同学这里能够跳过了,我来解说一下,后面讲了defer语句的执行程序是后到先出。所以两个defer中先输入后到defer语句,再输入先来的defer语句。然而主函数输入0,这就阐明返回值是0,这就阐明是先return再执行defer语句。并且留神函数完结是defer实现之后再完结。 三、for...range...创立的是每个元素的正本package mainimport "fmt"func main() { slice := []int{0, 1, 2, 3, 4, 5} m := make(map[int]*int) for key, value := range slice { m[key] = &value } for k, v := range m { fmt.Println("key=",k,"value=",*v) }}先来看一看运行后果,再来具体讲述: ...

December 2, 2021 · 1 min · jiezi

关于编程语言:全球-10-大受欢迎的顶级编程语言与薪资水平

英文原文链接|https://codeburst.io/10-top-programming-languages-in-2019-for-developers-a2921798d652 翻译|杨小二。明天的这篇文章内容能够作为你在抉择学习何种语言时候的一个参考数据,然而不能作为惟一根据,学习编程这种货色,除了企业须要外,本人趣味也很重要,须要两者联合一起来看,这样能力让你的常识技能有用武之地。硬件和软件技术的提高是推动整个互联网技术提高的次要因素。顶尖的编程语言是古代技术与新兴技术的外围组成部分。 明天的开发人员须要学习的编程语言比以往任何时候都要多。同样,许多IT外包公司当初正在应用大量语言来构建所有不同类型的软件应用程序。 对于那些利用这些编程语言满足其需要的人(无论是集体还是企业的),都有多种语言可供选择。因为开发时候,须要把握多种编程语言,因而企业很难在软件开发我的项目时,找到适合的程序员。 而我试图找到一些最无效和最受欢迎的编程语言,供开发人员学习和企业应用。 有哪些顶级编程语言受寰球欢送 在列出针对开发人员和企业的最佳编程语言之前,我想简要介绍一下其钻研工作。因而,这里简要介绍了用于钻研的数据: 1、支出最高的顶级编程语言(摘自《StackOverflow开发人员调查报告2019》和《Indeed》)。数据起源地址:https://insights.stackoverflow.com/survey/2019#top-paying-technologies 寰球薪资程度最高的编程语言截图如下: 留神:语言的受欢迎水平并不取决于开发人员的薪资待遇。同样,为特定需要开发的语言与多少开发人员应用也没有关系。从久远来看,最重要的是开发人员如何造就技能并应用他们曾经把握的语言进行工作。 我钻研这项数据指标,更多的是思考编程语言的薪水程度,但激情同样重要。 2、基于StackOverflow数据考察来看开发人员偏好 在过来的十年中,顶级编程语言的开发越来越集中在使开发人员更容易上手。因而,偏心地将他们对编程语言的青睐作为衡量标准。 3、剖析GitHub上的开发人员流动(排名来自2019年Q1-Q4的GitHut 2.0后果,地址:https://madnight.github.io/gi...)。 自2014年第二季度以来,GitHut的第一个版本没有更新,但就剖析GitHub上的流动而言,GitHut 2.0更具备参考价值。开发人员的流动在帮忙企业确定特定语言/框架或技术堆栈的参考方面施展着巨大作用。企业会亲密关注开发人员的流动,并在此基础上抉择适合的开发语言。 4、2019年1月至2019年12月寰球Google搜寻趋势。 Google是地球上每个开发人员的最好敌人。因而,剖析搜寻趋势并找到开发人员对往年最感兴趣的编程语言的比拟这个问题上,是具备肯定参考价值的,也是绝对偏心的。以下就是,企业在软件开发我的项目时,优先选择应用的一些编程语言: JavaScriptPythonJavaGoElixirRubyKotlinTypeScriptScalaClojure这个数据,也根本与GitHut 2.0的数据统一。截图如下: 1、JavaScript有确切的数据表明,美国JavaScript开发人员的平均工资:每年为109,462美元。在2019年Stack Overflow开发者考察中被公认为最风行的顶级编程语言。GitHub上最风行的编程语言。依据Google趋势数据显示,自去年以来,JavaScript的风行度仿佛有所降落。该语言在2019年1月的评分靠近最高峰,为91分。2019年12月,咱们发现风行度有所降落,JavaScript在100分中仅取得62分。2、Python有确切的数据表明,美国Python开发人员的均匀薪酬:每年117,503美元。依据2019年Stack Overflow开发者考察,Python是最顶级的面向对象编程语言之一,在最受欢迎的顶级编程语言列表中排名第二。在StackOverflow Developer考察中也被公认为最须要的编程语言。GitHub上第二沉闷的编程语言。自2019年初以来,Python的风行度已大大降落。截至2019年12月,该语言在Google趋势中的评分为62分,100分中。而在1月份时该评分为75分。3、Java依据相干数据显示,美国Java开发人员的平均工资:每年101,929美元。作为2019年最令人恐怖的编程语言之一,Java恰好排在第十位。GitHub上排名第三的最沉闷的顶级编程语言。截至2019年1月,Java在Google趋势中取得100分中的89分。2019年12月,该数字降至59分。这一下降可能归因于Python作为代替产品的宽泛应用以及Python与Java之间的强烈竞争。4、C有数据显示,在美国,C语言的程序员,平均工资为每年104,905美元。依据2019年StackOverflow考察,C语言恰好是第四大最令人恐怖的编程语言。C语言在GitHub上排名第八,这是它间断两年放弃的地位。C的受欢迎水平在2019年达到了高峰,并且在整个一年中始终放弃着很高的用户趣味。实际上,TIOBE Index将C评为2019年最受欢迎的编程语言。5、GOGo开发人员的寰球均匀薪资:每年为109,483美元。在美国,应用这种顶级编程语言的均匀年薪为$ 136K。在2019年Stack Overflow开发者考察中,Go是寰球支出第三高的语言。Go编程语言是GitHub上第四沉闷的语言。Go语言在Google搜寻它的受欢迎水平时,在2019年放弃不变。6、SwiftSwift(iOS)开发人员的寰球均匀薪资为$ 59k。依据相干数据显示,在美国,雷同职位的均匀年薪为125,252美元。依据2019年的Stack Overflow开发人员调查报告,Swift是第六大最受欢迎的编程语言。Swift在2019年是GitHub上排名第十的最沉闷的编程语言。Swift在Google搜寻中,它的受欢迎水平在2019年6月达到了最高分,100分。然而它在全年的搜寻量放弃不变。7、Ruby寰球应用Ruby进行开发的程序员均匀薪资:7.6万美元。而美国Ruby开发人员的均匀薪水为12.3万美元。依据2019年Stack Overflow开发者调查报告,Ruby的寰球支出排行榜中,它在第六位。在GitHub最沉闷的顶级编程语言列表中,Ruby全年放弃第12位。Ruby编程语言在2019年1月至4月之间始终放弃其风行顶峰。然而,自5月以来,它开始降落,到12月,用户趣味降落到57分。8、KotlinKotlin的寰球均匀开发薪酬:5.7万美元。在美国,Kotlin开发人员的平均工资为125,000美元。只管Kotlin并不是目前支出最高的语言之一,但因为Google发表Kotlin为Android利用程序开发的官方语言,因而它的需要激增。Kotlin是GitHub上排名第15的最沉闷的顶级编程语言,自去年以来曾经回升了一位。往年Kotlin的受欢迎水平基本上放弃不变。用户对这种语言的趣味在5月份达到高峰。这可能是因为在 2019年,Google发表Kotlin被用作Android利用开发的次要语言所致。9、TypeScript应用TypeScript进行开发的程序员,他的寰球均匀薪资:6万美元。美国的TypeScript开发人员为11.5万美元。依据Stack Overflow开发人员考察,TypeScript是排名第十的最受欢迎的顶级编程语言。在GitHub上,由Microsoft培养的编程语言当初排名第七。依据Google搜寻,TypeScript的风行水平在2019年6月,7月,10月和11月的整个月份达到峰值。今年以来,TypeScript见证了用户趣味的显着增长。10、ScalaScala的寰球均匀开发工资:78k美元。Scala开发人员在美国的均匀薪水为14.3万美元。依据2019年Stack Overflow年度开发人员考察,Scala是美国支出最高的编程语言,也是寰球支出第四高的编程语言。Scala在GitHub上的受欢迎水平在2019年有所降落。它已从2018年在GitHub上排名第12的最沉闷编程语言,回升到过来一年的第17位。Scala在Google搜寻趋势中的受欢迎水平在3月和8月这一段时间达到了高峰。然而,自2019年11月以来,用户对Scala的趣味开始降落。论断编程语言的世界每年都在变动。咱们有一些顶级的编程语言,例如Java和JavaScript,它们在此类列表中简直占据永恒的地位。而后呈现了像Kotlin这样的语言,它们以惊人的速度崛起,并成为迄今为止最受欢迎的编程语言之一。 通过明天的文章的一些数据分析,能够将使你对当今的10种最相干的编程语言有所理解,并可能激发开发人员学习和促成企业应用其中一种语言。 如果你足够怯懦,能够都尝试一下!一般来说,这就是编码和计算机编程的美。你领有晋升实力所需的全副资源后,而最重要的是你在哪里以及如何使用这些编程语言常识。 逆锋起笔是一个专一于程序员圈子的技术平台,你能够播种最新技术动静、最新内测资格、BAT等大厂的教训、精品学习材料、职业路线、副业思维,微信搜寻逆锋起笔关注!

September 19, 2021 · 1 min · jiezi

关于编程语言:伤仲永看完能少走很多弯路一个高中生的自学编程经历

我有很大的钻研技术的激情,往年18。从初中开始,就曾经种下了自在管制电脑这种欲望的种子。到了高一,我第一次从信息技术课本上看到编程二字,并且书上带走一个vb写的画二次函数图像的小例子,然而家里没有电脑,我也没大器重。从高一寒假开始,我领有了一台电脑。我想学习编程,然而电脑没联网,于是我常常从他人家里下载资料软件,回家钻研。 每次都下载一堆的货色,包含网上的教程,他人的教训,大学的课件,还有pdf格局的电子书等等。那时在网上搜编程材料,最多的就是vc vb,看到人家都说vb最简略,所以就选了vb,本人在家钻研了一个月,因为没有接触过编程,一些高级术语都不懂,所以钻研过程坎坎坷坷,最终还只是会一些最根本的语句,用一些根本的控件。 最令我自豪也最令我感到可耻的是我用vb模拟推箱子这个小游戏:在窗体上拖上三个图片框,一个作为目的地,一个作为游动的箱子,一个作为被推的箱子。仅用if else 和赋值语句就根本实现了对推箱子这个游戏的模仿(让我感到可耻的是过后脑子里函数的概念,写了大量反复的代码,要害是也不会用vb写一个函数,学的很垃圾)。 我用vb始终不会调用api,尽管有一些网上的源代码能够参考,然而都看不懂,对于我来说,不懂就意味着什么也不会,什么也做不进去。离高二开学还有十几天的时候,我下载了谭浩强的c语言教程在家钻研。起初发现,用c语言尽管做不出vb那样的窗口 控件(因为一开始都是用控制台的界面学习),然而我感觉很简洁,头脑里能搞清程序的前因后果,不像vb那种面向对象的语言,一个办法就搞定所有,本人都不晓得为什么这样。我对c语言一见倾心,用了3天工夫把谭浩强300多页的ppt看完了(我是跳跃式学习的,大部分感觉都很好了解,少部分也没大弄懂),随后就是多看些例子代码,以及写一些简略的小程序。 高二上学期我利用课余时间看完了吴文虎的《程序设计根底》,这使我在算法和数据结构上有了些进步(从那以后,我才真算是迈进了编程的大门,晓得了学习编程语言最根本的是理解它的变量定义形式,各种流程管制语句,自定义函数,程序入口点,赋值语句根本都一样,还有根本的输入输出函数、库函数等等)。高二上学期我还先后读过《计算机组成原理》(大部分没看懂)《操作系统》(大部分都看懂了) 以及Charles petzold的《Windows程序设计》(初步踏入Windows应用程序编程的大门),高二暑假期间我用vc采纳sdk(也只会sdk编程)编程形式写过一个聊天程序,界面构造很简略,一个窗口,两个编辑框,加上一个发送按钮。暑假快要完结的时候,我又接触了汇编语言。 高二下学期开学前一天早晨,偶然打开了王爽老师的汇编语言教程(为什么是偶然呢?我平时都下载很多材料,这一份看不下去了,再去看另一份,就这样在各种材料的跳跃互补之间,我构建起了本人的常识网络),原本没想学习汇编的,不过看了一部分都看懂了,于是就对它产生了趣味,并且在淘宝上买了一本王爽的《汇编语言》,到学校去钻研(过后心里还一直想着,要是我再学会了汇编语言,那我离高手就又进一步了)。在学校里,我一有空就看王爽的《汇编语言》,越看越带劲,心里深深地拜服王爽老师具体透彻的常识屏蔽的解说形式,本人看齐全能看懂。纸上得来终觉浅,不真枪实弹的写点程序,是夯实不了根底的。回家后,先依照书上的例子用记事本写好了汇编程序,而后用masm等工具编译连贯,本人用Windows自带的debug进行调试,尽管只是一个黑乎乎的运行在保护模式下的一个dos窗口,什么输入也没有,不过能看到本人的数据在debug外面依照本人想的后果正确的运行进去真的很开心。(过后还看些对于编程的小说,比方《疯狂的程序员》《新生之王牌黑客》,后者外面的主人公居然能间接用debug写应用程序,从此我心里就偷偷地通知本人,未来我也要达到这样的指标。当初看来,这简直是不可能的了)起初又用16位的汇编写了个间接读取cmos来显示以后工夫的程序,和底层硬件打交道的过程真的很爽,然而书上还有很多的货色我还都没有实际过,比方间接读写硬盘扇区,开机疏导程序,装置中断程序等等,因为我又迷上了两本书:一本是罗云彬的《Windows32位环境下的汇编语言程序设计》,另一本是我在网上搞到的电子书《黑客防线2009 黑客编程vc专辑》。 【本文配套书籍PDF电子高清版】 高二下学期的下半阶段,我曾经齐全投入到技术学习中去,上课偷偷地看,下课也看,在宿舍里也看,早晨12点之前个别不睡觉,经常因睡眠不足而感到好受,达到了一种走火入魔的境界。看了这两本书,我才意识到,之前所做的货色尽管是在Windows上做的,然而和零碎一点关系都没有。也正是从那时起,我才感到本人步入了Windows的殿堂。也正是因为这,我的问题从高二一退学的班级第10名掉到了30多名。(搞技术的,问题不提也罢) 非常感谢那两本书,让我对神秘的Windows有了一个初步的理解,给了我一些理论的编程例子参考。在读这两本书的过程中,我对c语言和汇编语言的关系理解的更加透彻,这让我当前在写c代码的过程中还能设想出编译后的汇编代码,用od查看,的确是那么回事。第一次学习hook API时,在网上下了一个例子代码,是靠批改输出表来hook的,二话不说,先编译一下看看,果然一次通过(是一个dll的代码)。而后用罗云彬介绍的办法写了个注入dll的程序,拿到虚拟机上一试,果然阻止了工作管理器完结程序(hook的TerminateProcess函数)。然而在物理机上就不行了,初步狐疑是零碎的问题(虚拟机上是xp,物理机上是win7)。起初用od挂上了win7的工作管理器,发现它的输出表里基本没有TerminateProcess这一项,我想它应该不会不调用这一个函数吧,于是下断TerminateProcess,没断着。在持续跟踪调试的过程中发现它原来是间接调用了ntdll里的ZwTerminateProcess函数。既然晓得了原理,那就想对策。起初才晓得,我的办法叫做inline hook。批改机器码来hook函数是我本人想到的,只不过我还不晓得他在这个世界曾经存在而已。 高二的寒假终于到来了,自从步入Windows的殿堂后,我的趣味就多了起来,比如说加壳脱壳,游戏外挂,内核驱动等等。我看郁金香的教程,看《加密与解密》,已经用od手动脱过UPX,ASPack等一些简略的壳,用IDA剖析过论坛里的几个小程序的加密算法,写过QQ对对碰的游戏外挂,还有零散的写过几个win32汇编小程序,都是些搬不上台面的货色。总之就是什么也玩过了,然而什么也钻研的不深,始终停留在初学者的程度。玩过内核,下载的那些介绍内核编程的书也没大看上来,最终也还就是写个hello world之类的内核程序。眼看还有半月就开学了,怎么感觉什么货色也没学到。所以我决定得做点什么。那就写一个远控吧,用c语言,纯sdk编程。这个货色,我也没怎么好好的架构一下,蒙着头就开始了。首先写的是图像传输的,技术含量不高,也就是截取屏幕像素数据,压缩,传送。起初又确定了用一个大的对话框作为软件的主界面,削减了文件治理,文件传输,CMDShell以及文字对话的性能。因为没有架构好,所以每写一个性能,我都要追踪出好多bug,而后顺次毁灭,其实编码的工夫并不多,要害是调试改良上花了很多工夫。高三开学前两天,各个性能如期完成,我把管制端拷到u盘上(纯sdk编程,才大概100k!),到街坊家里去测试。(因为技术含量不够,所以不能穿透内网。而且我家里用的广电的CableModem,不能做端口映射,所以只能作为受控端测试了)。通过测试,除了图像传输有点糟糕外,其余的性能都可用,因为之前在虚拟机上都测试过了。因为是纯sdk编程,界面也很难看,看上去很不讨人喜欢。不管怎么说,这次理论的开发让我体验到了做工程师的感觉,也算是夯实了一次c语言,也为当前的开发增长了教训。 高三开学了,在家长的压力下,我决定好好学一学校内的课程,考一所好点的大学。开学后的一个星期里还能够,起初我总是为我那完好的技术感到惶恐。所以以生病的理由请了假,回家拿手机。从此,我决定利用高三的业余时间好好的钻研内核编程。一开始我看的是《Windows内核平安编程从入门到实际》,这本书介绍的范畴很广,然而都不具体,不过我不大了解的中央大部分都从张帆的《Windows驱动开发详解》以及网络上找到了答案。还有一本比拟好的书《寒江独钓...》,外面的过滤驱动例子解说的也都很具体。当然,我也不可能总是看内核的货色,我须要思维的切换。以前总是用c语言写程序,也没正儿八经的看看c++。 于是先正儿八经的看了看c++,起初在家里又学了一会的BCB,可能简略的用一些根本的控件,学这个的目标次要是疾速的解决界面。起初感觉到用c++找不到设想出汇编代码的感觉,而且在论坛里看到了《c++逆向与反汇编揭秘》这本书,于是就在网上下了一本pdf格局的电子书在手机上看。认真的看了一段时间后,总算对c++的反汇编有了根本的理解。看到网上都用mfc编程,于是我也搞到一本《深入浅出mfc》,粗略看了一段时间,对mfc的机制也有了些浅显的意识。起初到了家里,在百度文库里找了一份 vs2010 mfc教程 比书上的容易了解多了。看了一会就写出了一个基于对话框的加法计算器程序,而且界面也比以前用sdk编程的难看多了。 目前,我正在写一个拦挡窗口创立的程序。内核层hook ShadowSSDT里的NtCreateWindowEx函数,应用层用mfc设计一个基于对话框的界面,可能自定义拦挡规定(依据窗口名,类名,以及窗口大小)。写这个程序的初衷是阻止迅雷酷狗等软件的广告窗口,目标还是为了实际一下学到的货色。我感觉只有做出实用的程序来才算把握了那些常识。返校时我曾经把内核层的代码和应用层的代码都别离写好了,并做了简略的测试,还剩下内核层与应用层的通信代码没写好,下次回家先做完它。(下次回家也就放寒假了,咱们这高三个别都是一个月回家一次。不过为了学习编程,我也常常销假回家。) 这次暑假我也要做一个软件来实际我从书上学到的货色,想来想去,还是要做一个远控(除了这货色,我如同也不晓得要做什么了),不过这次要使用大量的内核编程。(给大家简略的介绍一下这个远控: 用mfc做一个基于对话框的界面,用skin皮肤库丑化界面(之前没用过,现学现用吧)。在内核层要做的有暗藏过程,绕过杀软的函数钩子,清理回调钩子,还有键盘记录。次要的性能有文件治理,文件传输,执行cmd命令,截屏。采纳邮件系统通信(这样能够通过手机发送邮件来进行管制),不要求实时传输的效率。还有,这只是一个初步的构想,用邮件系统通信我还没试过。) 如果暑假里还有足够的工夫,我还得钻研一下免杀。当前还打算本人做几个小游戏的外挂,次要是想进步一下本人的逆向剖析调试能力,然而做这些的根底还是正向的编程教训。 为了学习编程,问题降落,家长也因而而感到悲观,老师也常常找我谈话。发此帖的目标,还是要敌人们帮我顾问一下,我到底是应该持续学习编程,还是拚一年高三的生存来考一个好学校持续深造?有人说在大学里这些货色什么也学不到,然而我总感觉好大学里的学习气氛可能比拟好。我很怅惘,最近始终不能静下心来去学习校内课程。将来的路到底在哪呢?敌人们给点意见吧。

September 3, 2021 · 1 min · jiezi

关于编程语言:啥是CTF新手如何入门CTF

CTF是啥CTF 是 Capture The Flag 的简称,中文咱们叫夺旗赛,其本意是东方的一种传统静止。在较量上两军会相互抢夺旗号,当有一方的旗号已被敌军篡夺,就代表了那一方的战败。在信息安全畛域的 CTF 是说,通过各种攻打手法,获取服务器后寻找指定的字段,或者文件中某一个固定格局的字段,这个字段叫做 flag,其模式个别为 flag{xxxxxxxx},提交到裁判机就能够得分。 信息安全的 CTF 的历史能够说很长了,最早起源于 96 年的 DEFCON 寰球黑客大会 为啥要加入CTF入门浸透,那必定得各种练手对不对?但因为因为 「网络安全法」的颁布,随便扫描别人网站,或非受权浸透测试都有肯定的危险。最近也有个新闻: 说实话,这小伙只是在扫描,攻打都被防火墙拦下了,啥都没弄到,后果还是一样被判刑,堪称是偷鸡不成蚀把米了……所以记住千万不要乱扫国内的网站,尤其是教育、政府类网站。但初入门的同学学习浸透测试没有一个对应的环境也是不行的,而常见的靶机对于小白来说太过简单,很容易不知如何下手。 这个时候 CTF 就非常适合了,CTF 个别是一个题目有一个或几个知识点互相糅合,相对来说目标性比拟强。如果想要领会到平安的成就感和趣味性,促成本人边练边学,CTF 就是一个很好的抉择。 CTF 的类型CTF 题目类型个别分为 Web 浸透、RE 逆向、Misc 杂项、PWN 二进制破绽利用、Crypto 明码破译,有志于浸透测试的同学一开始倡议从 Web 浸透的题目开始,辅以 Misc 杂项和 Crypto 密码学。 CTF 次要分为两种模式,一是解题模式。对于 Web 平安来说,会要求你入侵网站或者靶机,攻打胜利后零碎会显示flag或者在某个目录 文件 数据库寻找 Flag,提交到答题零碎得分。逆向工程题目个别模式是破解注册机、动静调试、dump 内存等等。这些题目能够百度或谷歌他人的解题报告( 关键字:CTF writeup)来认识一下。 这种模式的毛病是相似于“应试教育”,以后的趋势是重视出题难、出题偏,没有思考理论,就跟奥数似的。而且这种模式只有攻打,却没有防守,而在企业中工作更多的还是思考如何防护的问题,这个时候 AWD 攻防赛模式就应运而生了。 二是攻防赛,也叫 AWD(Attack With Defense,攻防兼备)模式。你须要在一场较量里要表演攻打方和防守方,攻者得分,失守者会被扣分。也就是说,攻打他人的靶机能够获取 Flag 分数时,他人会被扣分,同时你也要爱护本人的主机不被他人得分,以防扣分。 这种模式十分强烈,筹备要十分充沛,手上要有短缺的防守计划和 EXP 攻打脚本。我第一次加入这种较量的时候就被人打惨了QWQ,不过前面参赛越多,积攒的教训就会越多。所以说,这种较量不必慌,多打多学多积攒就好了。 CTF 外面也有一血之说,谁第一个交 Flag 能取得分数加成,所以说手快也很重要。不过一般来说是没有别的大佬手快的。 ...

August 18, 2021 · 1 min · jiezi

关于编程语言:别再瞎学安全了八年安全经验分享能让你少走很多弯路

首先思考一个问题:为什么要学平安? 近几年网络安全事件层出不穷,置信大家哪怕没遇到过,但也听过不少了吧。如服务器蒙受入侵被黑,用户帐号被盗;被钓鱼、勒索病毒等,这些一旦产生,对企业而言都是不小的打击。 因而,网络安全不容忽视,同时随着时代的一直倒退,公司对于运维及网络工程师要求也越来越严格。将来越来越吃香的肯定是技能方向广的复合型人才。 网络安全能够说是一条十分好的倒退路线。 往年两会期间,全国政协委员,360团体创始人、董事长周鸿祎提交了对于网络安全行业非凡人才的提案,为宽广白帽子人员争取更好的待遇。 据统计,目前的技术人员只能填满不到1%的缺口!这种供求不均衡间接反映在平安浸透工程师的薪资上,简略来说就是:竞争压力小,薪资还很高。 学习网络安全,其实最重要的是如何能更好的防守与攻打。想要往开发零碎下面倒退,那就学C语言;想要做些厉害的桌面软件,那就学C++;如果往跨平台的企业级利用倒退,那就学Java。 所以抉择一个适宜本人的学习方向,是十分重要的,因为这将决定你接下来到底该如何学习。就像你要买鸿星尔克,后果你走进了耐克的店里,这必定是买不到你想要的优质国货嘛! 为什么学习网络安全?我当初抉择学习网络安全,其实本人也是自觉的,毕竟是转行过去,之前对编程畛域基本不理解。这还得多亏我的那位敌人指导,才少走了很多弯路。他们过后通知我要学习网络安全有以下几点起因: 1.网络安全的劣势网络安全当初都回升到国家层面了,近几年各国网络安全工夫频发,各种黑产。国家在大力发展这行,跟着大方向走准没错! 2、学完网络安全能干什么 网络安全尽管说还有很多人不是很理解,然而网络安全的影响力随着时代的倒退,曾经超过了那些前辈。目前曾经有Web平安工程师,浸透测试,等级爱护,代码审计等等。。利用堪称是十分广。 3、网络安全的薪资待遇 网络安全目前曾经回升到了国家策略级别,这个畛域产生了大量的平安技术岗位需要,就连一般二、三线城市的平安工程师都达到了10-20万的年薪,更别提北、上、广、深这样的一线大城市。 这不比你6/7K的工资香吗? 4、网络安全的行业前景随着5G时代的到来,网络安全回升到了国家策略高度,不多BB,永远跟党走 网络安全该如何学习?其实学习的办法是因人而异的,能够依据本人抉择的方向来调整。上面分享一些我集体的一些学习倡议: 1、抉择好学习指标 只有晓得了本人的学习方向,才明确本人学习网络安全是要达到什么目标,这样能力让本人学习思路更清晰。像网络爬虫、web平安、浸透测试、应急响应、自动化运维、代码审计等这些畛域,你对哪个感兴趣,就往哪方面去深耕,只有用心钻研,能力取得与这个畛域相匹配的能力! 【网络安全零碎学习路线思维导图】2、制订学习打算我集体是把网络安全学习分成了根底、高级、巨匠3个学习阶段: 根底阶段次要学习:Linux根底、系统管理、命令治理、目录常识、文件治理、网络根底、网络协议、HTML、CSS、PHP编程根底、MYSQL等等。 高级阶段次要学习: Web应用程序根底、信息安全、破绽扫描、SQL注入攻打技术、XSS跨站、上传绕过验证、文件包涵破绽、CSRF攻打技术、近程代码执行破绽、XXE原理利用进攻、编辑器破绽、暴力猜解、暴验证码平安、逻辑破绽、业务平安问题 巨匠阶段次要学习: SHELL、脱壳与逆向、区块链、免杀等等 看到这么多要学的,是不是开始头晕眼花了?其实现阶段的你,只须要理解这些是将来要学习的就好了,前面跟着打算一步一步的学,也并没有多艰难。 3、根底肯定要扎实有道是万丈高楼平地起,只有地基牢固了,能力建起万丈高楼(作为转行人员,深受根底不够扎实的苦)。所以学习网安也是一样,只有把基础知识学扎实了,能力让你更好的了解前面的常识,能力在这个畛域深耕上来。所以上面这些根底肯定要熟练掌握: 4、多入手实操 实际是测验实践的惟一形式,依据你在学习期间把握的理论知识,进行实际操作,这样能力理解你的实在能力,能力晓得本人在学习中,有哪些常识把握不够。 5、多结交些平安大佬在学习期间,你必定会遇到本人无奈解决的疑难问题,如果你能有个遇到几个喜爱乐于助人的前辈大佬,让你头疼大半天的问题,兴许他们只用两三句话,就能轻松帮你解决。这一点我本人就深受其益,不论是学习,还是前面找工作,都对我有相当大的帮忙。 最初我是一名浸透测试工程师,分享的都是一些本人的学习经验和干货,对于我的零碎学习路线,和一些实战教程,都打包整顿好了,大家能够点击下方进行白嫖。如果能对你有帮忙,还心愿能帮忙点赞、关注、珍藏,大家的激励,是我分享的能源!(给大家鞠躬了) 【白嫖】

July 31, 2021 · 1 min · jiezi

关于编程语言:TIOBE-7-月榜单发布CJava-和-Python-争夺第一TIOBE-CEO-持续看好-Python

最近,TIOBE 公布了 7 月份编程语言排行榜单,同时本月也是 TIOBE 指数诞生 20 周年。在新一期的榜单中,咱们能够看到 C、Java 和 Python 仍呈三足鼎立之势,不过在这一不变的大趋势中也存在着一些奥妙的变动。 TIOBE 指数诞生 20 年,C、Java 不变的前三TIOBE 指数诞生于 2001 年,最后作为 Paul Jansen 的个人爱好我的项目存在,旨在理解编程语言的需要情况。 在第一份 TIOBE 编程语言排行榜单中,前三甲别离为 Java、C 和 C++。20 年过后,后果惊人地类似,前三名别离是 C、Java 和 Python,C 和 Java 依然位列 top 3。乏味的是,这三种语言的差距逐步放大,第一名 C 语言和第三名 Python 的差距仅为 0.67%,这意味着接下来几个月将迎来强烈竞争。TIOBE CEO Paul Jansen 认为:Python 最有可能夺得冠军,它在数据挖掘和人工智能这些凋敝倒退的畛域占据市场领导位置。 在 TIOBE 5 月榜单中,Python 战败 Java 夺得第二。过后 Paul Jansen 就曾表态:只管与第三名 Java 的差距仅有 0.11%,但咱们有理由置信 Python 将在更长的工夫内放弃第二的地位,甚至有可能在下半年冲击冠军。只管 Python 的亚军地位仅放弃了两个月,但 Paul Jansen 对 Python 的信念仍然不减。 ...

July 6, 2021 · 1 min · jiezi

关于编程语言:5-种前途迷茫的编程语言

译文链接:http://www.codeceo.com/articl...英文原文:5 Programming Languages Marked for Death翻译作者:码农网 – 小峰当初的开发人员都趋向于应用新的编程语言,那么旧的编程语言呢?它们的前途个别是这样两种:依然能够应用,但逐步不受大家欢送;间接齐全死去。和之前的十佳最受欢迎的编程语言相同,本文咱们预测以下这几种编程语言面临着死亡威胁: Perl曾几何时,简直每个人都在应用Perl语言编程。然而那些常常应用的人缓缓地发现,对于这个Perl语言仿佛总是有点不对劲。至多我晓得有这么个叫做“piecemeal”的编程语言,它的创造者仿佛就只是将这个性能堆在另一个性能下面而已,并没有好好思考将它们联合在一起。 事实上,甚至是它的创造者也不得不抵赖这种编程语言是有问题的。通过残缺地革新之后,当初的开发工作开始偏向于应用Perl6,这个大略是在2000年的时候。至于Perl?俨然曾经匿影藏形了!所以齐全没有必要去学习它了。顺便说一句,上面这个“Goodbye World”就是用Perl写的: #!/usr/bin/perlprint “Content-type: text/html\n\n”;print “Goodbye, world!\n”;下面这个例子会进去一个网页。当初的Perl,因为能够作为CGI脚本语言,所以应用的最宽泛的是在生成web页面上。然而为了适应时代的变动,咱们最好还是将Perl语言“弃之如敝履”。 Ruby对于Ruby,能够这么唱“十年之后,我不意识你你不属于我……”。因为就在10年前,Ruby语言堪称是风行一时。它出生于1995年,5年左右达到它的鼎盛时期。如果你常常应用的话,相对会义无反顾地爱上它。然而,像咱们这些学着C语言格调长大的孩子在学习Ruby时往往会感觉有点囧。 上面是用Ruby写的“Goodbye World”: puts ‘Bye bye, Miss American Ruby! Drove my Chevy to the Levie…’puts ’2011 was the day that Ruby died, yeah…’上面是一个用于计算阶乘的例子: def fact(n) if n == 0 1 else n * fact(n-1) endendputs fact(ARGV[0].to_i)我测试了这个例子,来计算1000的阶乘。上面是后果(因为篇幅限度,两头略过了2569个数字): ruby fact.rb 100040238726007709377354370243392300…0000000从各方面来看,Ruby都很好,简直是一片赞誉声……除了Twitter。 在2011年4月,Twitter声称他们曾经将简直大部分的代码都改写过了,以便不用应用Ruby和它的web框架——Ruby on Rails,据他们所说这个平台十分之低效。不过,我想说的是,也正是那一天起,Ruby开始走下坡路,应用的人数也是越来越少。 Visual Basic.NET十年前,我应聘到一个须要重写大量代码的公司,名字我曾经遗记了,次要工作就是将VB6转换为Visual basic.NET。大略就只干了一两个月吧,我就跳槽了:真心太苦楚了。 微软钟爱于BASIC编程语言的扩大能够一路追溯到1991年,那时他们刚刚洽购了来自Alan Cooper的一个十分酷(对于那个时候而言)的可视化编程设计。Alan Cooper初期应用的是别的编程语言,然而比尔盖茨让他换成BASIC语言,因为盖茨认为那是过后最为简略的编程语言。于是乎,赫赫有名的Visual Basic,就从BASIC中衍生进去——对象这一概念以及新的编程技术问世了。 前面又产生了一些很有意思的事件。Borland Delphi的发明引领者,Anders Hejlsberg也到微软工作,并且引领创立了一个新的编程语言——C#。这种编程语言十分相似于Java语言。刚开始的学习或者有点难,然而一旦上手,你相对会对它爱不释手。C#很快就成为了微软的旗舰编程语言。当初的话,在软件行业中,有很多很多须要C#的工作岗位,不少都是高薪聘用的。 ...

June 6, 2021 · 1 min · jiezi

关于编程语言:十大编程语言选择任意一门都不吃亏

如果你是软件开发畛域的老手,那么你会想到的第一个问题是“如何开始?”编程语言有数百种可供选择,然而你怎么发现哪个最适宜你,你的趣味和职业指标又在哪里呢?抉择最佳编程语言以学习的最简略办法之一,是通过市场反应、技术趋势的倒退…浏览下文,你会发现一些用于Web开发,挪动开发,游戏开发等的优良、业余的编程语言。最初,你将分明地理解哪种编程语言能够在将来几年甚至更长时间内帮忙你的职业倒退。让咱们来看一看…… 1、JavaScript现在,如果连JavaScript都不会用,那么你不可能称之为一名合格的软件开发人员。榜单中的第一个是JavaScript,根本无法设想没有JavaScript的软件开发会是怎么的世界。从Stack Overflow的2019年开发人员考察中能够看出,JavaScript曾经间断7年成为开发人员中最受欢迎的语言。过来一年中,大概有75%的人应用了这种语言。 首先,JavaScript是轻量级的,可解释的,并且在前端开发中起着重要作用的一门语言。甚至一些次要的社交媒体平台都认为JavaScript提供了一种轻松创立交互式网页的简便办法,并且是由职业驱动的。最受青眼的是JavaScript,因为它与所有次要浏览器兼容,并且其语法的确很灵便。作为一种前端语言,JavaScript还通过Node.js在服务器端应用。 JavaScript是初学者中最可恶的编程语言。 2、Python这可能会让你感到诧异;python呈现在第二位。在许多考察中,它可能都放在第5上。然而,我肯定会让你置信,这是为什么呢?在我的list中,Python是通用的,用户敌对的编程语言之一。为什么这么说?像Java一样,Python语法清晰,直观并且简直相似于英语。Python的“基于对象”子集相似于JavaScript。依据Stack Overflow的说法,有一个局部说“被采纳或被迁徙,或者迁徙得太早”,宽泛来说,迁徙到python的人靠近42%,这表明它排名第二。 如果你有趣味从事后端开发工作,例如Django –凋谢源代码框架,则是应用python编写的,这使得它易于学习且功能丰富,但却很受欢迎。另外,python具备多种应用程序,使其功能强大。在科学计算,机器学习和工程学等畛域中,Python反对一种编程款式,该款式应用简略的函数和变量,而无需过多地查问类定义。 人生苦短,我用Python! 再者,因为人工智能这几年大热,而python尤其在大数据和人工智能畛域有宽泛的应用。 python自身面向对象语言,具备丰盛和弱小的库,轻松地应用C语言、C++、Cython来编写裁减模块,所以很多称它为“胶水语言”。当然仅仅晓得这些还是不够的。 3、Java如果有人问为什么Java,最常呈现的句子是“写一遍,哪都能够运行” – Java在过来20年来始终是统治性的编程语言。Java是99%面向对象的,并且很弱小,因为Java对象不蕴含对本身内部数据的援用。它比C ++更简略,因为Java应用主动内存调配和垃圾回收。 Java具备高度的跨平台兼容性或平台无关性。因为你能够在任何中央(我指的是所有设施)进行编码,因而能够编译为低级机器代码,最初,能够应用JVM – Java虚拟机(取决于平台)在任何平台上执行。 Java形成了Android操作系统的根底,并抉择了约90%的财产500强公司来制作各种后端应用程序。我会毫不犹豫地采纳由Amazon Web Services和Windows Azure运行的最大的Apache Hadoop数据处理。有许多充沛的理由和宽泛的业务应用程序,领有微小的灵活性,而Java始终是初学者的最爱。 4、C / C++“越老越吃香” – C用不同的形式证实了这句话。C语言于1970年代前期被引入,为编程世界做出了巨大贡献。C是少数几种语言的母语。有些是从C派生的,或者是从其语法,结构和范例(包含Java,Objective-C和C#)启发而来的。 即便在当今,能够看出,每当须要构建高性能应用程序时,C依然是最受欢迎的抉择。Linux OS是基于C的。CPP是C的混合版本。C ++是一种基于C的面向对象的编程语言。因而,在设计更高级别的应用程序时,它比其余办法更可取。 C ++比动静类型的语言具备更好的性能,因为在真正执行代码之前先对代码进行类型查看。开发的外围畛域是虚拟现实,游戏,计算机图形等。 5、PHP这个事实会让你感到十分惊奇,这种语言是为保护Rasmus的个人主页(PHP)而创立的,实际上到明天已占据了寰球83%的网站。PHP代表超文本预处理器,是一种通用编程语言。显然,PHP是一种脚本语言,可在服务器上运行,并且用于创立以HTML编写的网页。它之所以受欢迎,是因为它收费,而且易于设置并且易于新程序员应用。 对于寰球的Web开发人员来说,PHP是一个十分弱小的抉择。它被宽泛用于创立动静网页内容以及网站上应用的图像。因为应用范畴宽泛,因而排名第五。另外,PHP能够很好地用于WordPress CMS(内容管理系统)。 它位于第五的起因之一,是英文PHP升高了网站性能并影响了加载工夫。(无奈) 6、Swift接下来是是Swift。Swift就像它的名字一样晦涩,是Apple Inc.开发的一种通用、凋谢源代码的、已编译的编程语言。如果你正在寻找针对本机iOS或Mac OS应用程序的开发,则Swift就是首选。Swift受Python和Ruby的影响很深,并且被设计为对初学者敌对且易于应用。与它的前一个Objective-C相比,Swift被认为是一种更快,更平安,更易于浏览和调试的工具。 与Objective-C不同,Swift须要更少的代码,相似于天然的英语。因而,来自JavaScript,Java,Python,C#和C ++的现有技术人员能够更轻松地切换到Swift。 除此之外,人才储备无限是它面临的一个挑战。与其余开源语言相比,你四周可能找不到很多Swift开发人员。最近的考察表明,在78,000名受访者中,只有8.1%的人应用Swift,这比其他人要少。并且因为频繁的更新,Swift被认为在每个新版本中都不太稳固。 7、C#(C-shap)C-sharp是Microsoft 2000年开发的功能强大的面向对象的编程语言。C-sharp用于开发桌面应用程序和最近的Windows 8/10应用程序,并且须要.NET框架来运行。微软开发了C#作为Java的竞争对手。实际上,Sun不想让微软的烦扰来扭转Java,于是C#诞生了。 C#具备多种性能,使初学者更容易学习。与C ++相比,代码是统一且合乎逻辑的。因为C#是动态类型的语言,因而在C#中发现错误很容易,因为在将代码转到应用程序之前会先查看代码。 简而言之,它是开发Web应用程序、桌面应用程序的完满抉择,并且在VR,2D和3D游戏中也失去了证实。像Xamarin这样的跨平台工具曾经用C#编写,使其与所有设施兼容。 8、Ruby一种开源的动静编程语言,着重简略性和生产率,于1990年中在日本开发。它的设计主题是简化编程环境并减少乐趣。Ruby在全栈Web框架Ruby on Rails框架中风行。Ruby具备动静类型化的语言,它没有硬性规定,并且是一种高级语言,在很大水平上相似于英语。 简而言之,你能够应用更少的代码来构建应用程序。然而Ruby面临的挑战是动静类型化的语言,它不容易保护,并且灵活性使其运行迟缓。 9、Objective-CObjective-C(ObjC)是一种面向对象的编程语言。Apple将其用于OS X和iOS操作系统及其应用程序编程接口(API)。它开发于1980年代,并在某些最早的操作系统中失去应用。Objective-C是面向对象的通用对象。你能够将其称为混合C,因为它为C编程语言增加了性能。 10、SQLSQL(es-que-el)代表结构化查询语言,是一种用于操作数据库的编程语言。它包含存储,解决和检索存储在关系数据库中的数据。SQL保持数据的准确性和安全性,并且无论其大小如何,都有助于保护数据库的完整性。 明天,SQL已在Web框架和数据库应用程序中应用。如果你精通SQL,则能够更好地把握数据摸索和无效的决策制定。 如果你打算抉择数据库治理作为你的职业,请首先应用C或C++。SQL开发人员的需求量很大,而且薪水也不低。 总结小编举荐初学者如果没有明确的职业指标,那就抉择经得住工夫考验的java吧,无论公司大小,都有用Java之处。当有一门编程教训的根底之后,后续想转其余语言,就绝对容易多了,举荐大家微信搜寻 举荐学java 订阅号,从小白开始学习Java 。

June 5, 2021 · 1 min · jiezi

关于编程语言:50-万行-Go-代码可汗学院抛弃-Python-转向-Go

2019 年 12 月,驰名教育性非营利组织可汗学院发表了一项将后端从新设计为一系列 Go 服务的工程——Goliath,将后端最后应用的 Python 2 语言转换为 Go 语言。近日可汗学院走漏,目前已实现超过 50 万行 Go 代码。 据介绍,在 Goliath 我的项目刚启动时,除了团队运行的验证 Go 语言是更好抉择的试验以外,团队中没有人理解 Go 语言。而当初,可汗学院所有的后端和全栈工程师都应用 Go 语言,目前已有超过 50 万行 Go 代码在生产环境中运行。 为什么会从 Python 转向 Go 呢?可汗学院首席软件架构师 Kevin Dangoor 进行了剖析。 Python 2 达到 EOL 阶段2018 年,Python 团队发表 Python 2.7 的 EOL(停用)日期为 2020 年 1 月 1 日,接下来,将不会有任何更新,也不会再有源码安全补丁。这意味着应用 Python 2 的我的项目面临着迁徙。 对于应用 Python 2 作为后端服务器语言的可汗学院,如何迁徙、抉择何种语言成为事不宜迟。 他们认为从 Python 2 迁徙到 Python 3 并非易事,于是在 Kotlin、Go 等语言中进行抉择,并最终抉择了 Go。起因如下: ...

May 21, 2021 · 1 min · jiezi

关于编程语言:TIOBE-5月榜单Python-再次战胜-Java-回榜二有望冲击-C-语言

最近,TIOBE 公布 5 月份编程语言排行榜,其中最大的变动是 Python 重回第二。 Python 战败 Java 重回第二在 2020 年 11 月 TIOBE 公布的编程语言排行榜中,Python 短暂地取代了 Java 跃居第二,次月,Java 重回第二。而在 TIOBE 刚刚公布的编程语言排行榜中,Python 再次取得第二名的地位。 TIOBE CEO  Paul Jansen 示意:「只管与第三名 Java 的差距仅有 0.11%,但咱们有理由置信 Python 将在更长的工夫内放弃第二的地位,甚至有可能在下半年冲击冠军,因为当初的第一名 C 语言的风行度正在升高。」 TIOBE 5 月编程语言排行榜 top 20。 下图展现了 TOP 10 编程语言 TIOBE 指数走势(2002-2020): Rust、Dart、Julia 稳步回升除此之外,在 5 月排行榜中,Rust 正试图重返前 20(目前排名第 24),Dart 和 Julia 也在稳步前进。 第 21-50 名编程语言排行榜 此外,TIOBE 还列出了排名第 51-100 的编程语言。因为差别较小,该排名仅按字母程序列出: ActionScript, Arc, B4X, bc, Boo, C shell, CFML, Clojure, Common Lisp, Eiffel, Erlang, F#, Hack, Icon, IDL, Inform, Io, J, JScript.NET, Korn shell, Lasso, Maple, MEL, ML, MQL4, MUMPS, NATURAL, OCaml, OpenCL, OpenEdge ABL, Oz, PL/I, PostScript, Pure Data, Q, Racket, Ring, RPG, Scheme, Simulink, Smalltalk, SPARK, SPSS, Stata, Tcl, Vala/Genie, Verilog, XC, Xojo, Zig ...

May 5, 2021 · 1 min · jiezi

关于编程语言:2021Q1-编程语言排行榜JavaScript-开发者最多Rust-增长速度最快

近期,开发者畛域调研公司 SlashData 公布了其《开发者国家排名》第 20 版,其中示意在往年第一季度,JavaScript 依然是最受欢迎的编程语言,领有最多的开发者,但 Rust 已成为增长速度最快的编程语言。 2021Q1 编程语言排行榜:JavaScript 开发者最多,Rust 增长速度最快 SlashData 的考察笼罩了来自 155 个国家/地区的 19,000 多名受访者,与来自 GitHub、RedMonk、StackOverflow 和 Tiobe 的其余语言受欢迎水平排名略有不同。 SlashData 每年进行两次此考察。它的上一次考察预计 JavaScript 社区的规模为 1240 万,其中包含 TypeScript 和 CoffeeScript,它们也基于雷同的 ECMAScript 规范。截止到第一季度完结,人数已增长至 1,380 万。 开发者数量第二的是 Python,人数为 1010 万,排名第三的 Java 为 940 万。这一排名与开发者剖析公司 RedMonk 前不久基于 GitHub 和 StackOverflow 的调研数据雷同。 依据 SlashData 的说法,Python 是开发者人数增长最多的语言,其中 70% 的开发人员专一于应用它进行相干的机器学习工作,这很大水平上应该归功于 Google 的 TensorFlow、Facebook 的 PyTorch 和 NumPy 之类的机器学习库。 对于数据迷信畛域另一话题语言 Rust,SlashData 则示意目前只有 17% 的人应用 Rust,但它却是过来 12 个月中开发者比例增长幅度最高的编程语言,但因为根底数量较低,所以净增数量要低于 Python。 ...

April 28, 2021 · 1 min · jiezi

关于编程语言:自制计算器自制编程语言二

后面介绍了借助yacc和lex自制计算器。《自制计算器(借助yacc和lex)—《自制编程语言》一》本文介绍下不必yacc和lex的实现过程,其实就是本人编写词法解析器和词法分析器来代替yacc和lex。基于C语言实现文中代码为了阐明大多是截图,能够对照行号介绍,不过不必放心,源代码我都传到这里了1.自制词法分析器阐明:本计算器会将换行作为分隔符,把输出宰割成一个个算式。跨复数行的输出无奈被解析。 依据下面的阐明,词法分析器提供一下两个函数: // 将接下来要解析的行置入词法分析器中void set_line(char *line);/* * 从被置入的行中,宰割记号并返回 * 在行尾会返回 END_OF_LINE_TOKEN 这种非凡的记号 */ void get_token(Token *token); get_token()承受的入参是一个Token构造体指针,函数会宰割出记号装入Token构造体并返回。上面是下面两个函数申明和Token构造体的定义: 词法分析器的头文件如下: lexicalanalyzer.h 词法分析器的代码如下图: lexicalanalyzer.c 词法分析器的运行机制为,每传入一行字符串,就会调用一次get_token()并返回分隔号的记号。因为词法分析器须要记下set_line()传入的行,以及该行已解析到的地位,所以设置了动态变量st_line和st_line_pos(第7行和第8行)。 set_line()函数,只是单纯设置st_lin和st_line_pos的值 get_token()负责将记号理论宰割进去,即词法分析器的外围局部。 第16行开始的while语句,会逐个依照字符扫描st_line。 记号中的+、-、*、/四则运算符只占一个字符长度,一旦扫描到间接返回。 数值局部略微简单一些,因为数值由多个字符组成。应用while语句逐字符扫描时,以后扫描的字符很有可能只是一个数值的一部分,所以必须想个办法将合乎数值特色的值暂存起来。为了暂存数值,采纳一个枚举类型LexerStatus*的全局变量status(第12行) LexerStatus枚举的定义在lexicalanalyzer.h中 status的初始状态为INITIAL_STATUS,当遇到0\~9的数字时,这些数字会被放入整数局部(此时状态为为IN_INT_PART_STATUS)中(第59行)。一旦遇到小数点.,status会由IN_INT_PART_STATUS变为DOT_STATUS(第65行)。DOT_STATUS再遇到数字会切换到小数状态IN_FRAC_PART_STATUS(第61行)。在IN_INT_PART_STATUS或IN_FRAC_PART_STATUS的状态下,如果再无数字或小数点呈现,则完结,承受数值并return。 依照下面的解决,词法分析器会齐全排除.5、2..3这样的输出。而从第23行开始解决,除换行以外的空白字符全副会被跳过。 因为是用于计算器的词法分析器,所以只解决了四则远算符和数值。如果须要扩大并能够反对编程语言的话,最好留神以下几个要点1.数值与标识符(如变量名等)能够依照上例的办法通过治理一个以后状态将其解析进去,比方自增运算符就能够设置一个相似IN_INCREMENT_OPERATOR的状态,但这样一来程序会变得简短。因而对于运算符来说,为其筹备一个字符串数组会更好,例如:static char *str_operator_str[] = { "++", "--", "+", "-", // 省略};以后读入的记号能够与这个数组的元素做前向匹配,从而判断记号的品种。指针局部同样须要比特色对象再多读入一个字符用以反叛(比方输出i + 2,就须要将2也读入看看有没有是i++的可能)。做判断时,像上例这样将长的运算符放到数组后面会比拟省事。另外,像if、while这些保留字,比较简单的做法是先将其判断为标识符,之后再去对照表中查找有没有相应的保留字。2.本次的计算器是以行尾单位的,st_line会保留一行中的所有信息,但在当下的编程语言中,换行个别和空白字符是等效的,因而不应该以行尾单位解决,而是从文件中逐字符(getc()等函数)读入解析会更好。上例中用while语句逐字符读取的中央就须要替换为getc()函数来读取。2.自制语法分析器大多程序员即便没自制编程语言的背景,也能猜到词法分析器的运行机制,换成语法分析器就有点毫无脉络了。可能知觉是,只思考计算器程序,将运算符优先级最低的- 、+宰割进去,而后解决*和/,这样的思路根本正确。然而实际操作时会发现,用来保留宰割字符串的空间可能还有其余用处,而退出括号的解决也很难。 yacc版本的计算器应用上面的语法规定: expression /* 表达式的规定 */ : term /* 和项 */ | expression ADD term /* 或 表达式 + 和项 */ | expression SUB term /* 或 表达式 - 和项 */ ;term /* 和项的规定 */ : primary_expression /* 一元表达式 */ | term MUL primary_expression /* 或 和项 * 一元表达式 */ | term DIV primary_expression /* 或 和项 / 一元表达式 */ ;primary_expression /* 一元表达式的规定 */ : DOUBLE_LITERAL /* 实数的字面常量 */ ; 这些语法规定能够用下图这样的语法图来示意: ...

April 7, 2021 · 2 min · jiezi

关于golang:当红开发语言Go真的是未来的技术主流吗

摘要:文将具体介绍 Golang 的语言特点以及它的优缺点和实用场景,带着上述几个疑难,为读者剖析 Go 语言的各个方面,以帮忙初入 IT 行业的程序员以及对 Go 感兴趣的开发者进一步理解这个热门语言。本文分享自华为云社区《大红大紫的 Golang 真的是后端开发中的万能药吗?》,原文作者:Marvin Zhang 。 前言城外的人想进去,城里的人想进去。-- 钱钟书《围城》 随着容器编排(Container Orchestration)、微服务(Micro Services)、云技术(Cloud Technology)等在 IT 行业一直流行,2009 年诞生于 Google 的 Golang(Go 语言,简称 Go)越来越受到软件工程师的欢送和追捧,成为现在煊赫一时的后端编程语言。在用 Golang 开发的软件我的项目列表中,有 Docker(容器技术)、Kubernetes(容器编排)这样的颠覆整个 IT 行业的明星级产品,也有像 Prometheus(监控零碎)、Etcd(分布式存储)、InfluxDB(时序数据库)这样的弱小实用的出名我的项目。当然,Go 语言的应用领域也绝不局限于容器和分布式系统。现在很多大型互联网企业在大量应用 Golang 构建后端 Web 利用,例如今日头条、京东、七牛云等;长期被 Python 统治的框架爬虫畛域也因为简略而易用的爬虫框架 Colly 的崛起而一直受到 Golang 的挑战。Golang 曾经成为了现在大多数软件工程师最想学习的编程语言。下图是 HackerRank 在 2020 年考察程序员技能的相干后果。 那么,Go 语言真的是后端开发人员的救命良药呢?它是否可能无效进步程序员们的技术实力和开发效率,从而帮忙他们退职场上更进一步呢?Go 语言真的值得咱们花大量工夫深刻学习么?本文将具体介绍 Golang 的语言特点以及它的优缺点和实用场景,带着上述几个疑难,为读者剖析 Go 语言的各个方面,以帮忙初入 IT 行业的程序员以及对 Go 感兴趣的开发者进一步理解这个热门语言。 Golang 简介 Golang 诞生于互联网巨头 Google,而这并不是一个偶合。咱们都晓得,Google 有一个 20% 做业余我的项目(Side Project)的企业文化,容许工程师们可能在轻松的环境下发明一些具备颠覆性翻新的产品。而 Golang 也正是在这 20% 工夫中一直孵化进去。Go 语言的创始者也是 IT 界内赫赫有名的行业首领,包含 Unix 外围团队成员 Rob Pike、C 语言作者 Ken Thompson、V8 引擎外围贡献者 Robert Griesemer。Go 语言被公众所熟知还是源于容器技术 Docker 在 2014 年被开源后的爆发式倒退。之后,Go 语言因为其简略的语法以及迅猛的编译速度受到大量开发者的追捧,也诞生了很多优良的我的项目,例如 Kubernetes。 ...

March 27, 2021 · 5 min · jiezi

关于编程语言:借助yacc和lex自制计算器自制编程语言一

《自制编程语言》学习记录,内容根本是摘抄原书其实原书并不是从头讲怎么写一个计算器的,而是上来就给了代码,对着代码解说。计算器代码的名字为mycalc,外部齐全应用double进行运算。 1.根底概念介绍1.1 编程语言的语法解决个别有以下的过程:1.1.1 词法剖析 将源代码宰割成若干个记号(token)的解决。 1.1.2 语法分析 即从记号构建分析树(parse tree)的解决。分析树也叫作语法树(syntax tree)或形象语法树(abstract syntax tree, AST)。 1.1.3 语义剖析 通过语法分析生成的分析树,并不蕴含数据类型等语义信息。因而在语义分析阶段,会检查程序中是否含有语法正确然而存在逻辑问题的谬误。 1.1.4 生成代码 如果是C语言等生成机器码的编译器或Java这样生成字节码的编译器,在分析树构建结束悔恨进入代码生成阶段。 比方如下的代码: if (a == 10) { printf("hoge\n");} else { printf("piyo\n");}执行词法剖析后,将被宰割成如下图所示的记号(token):对此进行语法分析后构建的分析树如下图: 执行词法剖析的程序称为词法分析器(lexical analyzer), lex就是依据词法规定主动生成词法分析器执行语法分析的程序称为解析器(parser),yacc就是能依据语法规定主动生成解析器的程序yacc和lex在mac上曾经预装。1.2 lex: lex 是主动生成词法分析器的工具,通过输出扩大名为.l的文件,输入词法分析器的C语言代码。 词法分析器是将输出的字符串宰割成记号的程序,因而必须首先定义mycalc所用到的记号。 mycalc所用到的记号包含如下: ○ 运算符。在mycalc中能够应用四则运算,即+、-、*、\。 ○ 整数。如1、2、3等。 ○ 实数。如123.456等。 ○ 换行符。一个算式输出后,接着输出换行符就会执行计算,因而这里的换行符也应设置为记号 在lex中,应用正则表达式定义记号。 1.3 yacc: yacc是主动生成语法分析器的工具,输出扩大名为.y的文件,就会输入语法分析器的C语言代码。 2.试做一个计算器mycalc的理论运行成果如下(%是命令提示符): 2.1 为mycalc所编写的输出文件mycalc.l如下(用lex解析): 第11行%%,此行之前的局部叫作定义区块。在定义区块内,能够定义初始状态或者为正则表达式命名。第2行到第9行,应用%{和%}包裹的局部,是想让生成的词法分析器将这个局部代码原样输入。后续程序所需的头文件等都蕴含在这里。比方第3行用#include蕴含进来的y.tab.h头文件,就是之后yacc主动生成的头文件。上面的ADD、SUB、MUL、DIV、CR、DOUBLE_LITERAL等都是在y.tab.h中用#define定义的宏。 第5行到第9行定义了一个名为yywrap()的函数。如果没有这个函数的话,就必须手动链接lex的库文件。第12行到第27行是规定区块。这一部分是应用正则表达式*去形容记号。在规定区块中遵循如下的书写形式:一个正则表达式的前面紧跟若干个空格,后接C代码。如果输出的字符串匹配正则表达式,则执行前面的C代码。第12行到第16行,找到四则运算符以及换行符,而后通过return返回其特色符(就是在y.tab.h的宏定义)。下面提到很屡次记号(token),蕴含三局部含意:对于+或-这样的记号来说,只须要关注其记号品种就能够了,而如果DOUBLE_LITERAL记号,记号的品种和值都必须传递给解析器第17行的正则表达式是一个匹配“数值”的表带是。表达式匹配胜利的后果(即下面列举的记号三要素),“记号的原始字符”会在相应的动作中被名为yytext的全局变量援用。并进一步应用第19行的sscanf()解析对于第17行正则表达式的解释见这里第23行的正则表达式[ \t]是对空格以及制表符进行匹配,对应动作为空,因而能够疏忽每一行的空白字符。第24行的 .会匹配任意一个字符,这里用于检测是否输出了程序不容许的字符。第28行的%%示意规定区块的完结,这之后的代码被称为用户代码区块。用户代码区块能够编写任意的C代码。2.2 为mycalc所辨析的输出文件mycalc.y如下(用yacc解析): 第1行到第5行与lex雷同,应用%{ %}包裹了一些C代码第4行有一句#define YYDEBUG 1,这样将全局变量yydebug设置为一个非零值后会开启Debug模式,能够看到程序运行中语法分析的状态。第6行到第9行申明了记号以及非终结符的类型。非终结符是由多个记号独特形成,即代码证的line_list、line、expression、term这些局部。为了宰割非终结符,非终结符最初都会以一个非凡的记号结尾。这种记号称作终结符第10行到第11行是记号的申明。myclac所用到的记号类型都在这里定义。ADD、SUB、MUL、DIV、CR等记号只须要蕴含记号的类型就能够,而值DOUBLE_LITERAL的记号,其类型被指定为<double_value>。这里的double_value是来自下面代码中%union汇合的一个成员名(第8行)。第12行申明了非终结符的类型。第13行的%%是分界,之后的是规定区块。yacc的规定区块由语法规定以及C语言编写的相应动作两局部形成。语法规定 在yacc中,会应用相似BNF(巴克斯范式)的标准来编写语法规定。将上图的规定代码抽出并正文如下: // 语法规定代码 2-0line_list /* 多行的规定 */ : line /* 单行 */ | line_list line /* 或者是一个多行后接单行 */ ;line /* 单行的规定 */ : expression CR /* 一个表达式后接换行符 */ ;expression /* 表达式的规定 */ : term /* 和项 */ | expression MUL term /* 或 表达式 + 和项 */ | expression SUB term /* 或 表达式 - 和项 */ ;term /* 和项的规定 */ : primary_expression /* 一元表达式 */ | term MUL primary_expression /* 或 和项 * 一元表达式 */ | term DIV primary_expression /* 或 和项 / 一元表达式 */ ;primary_expression /* 一元表达式的规定 */ : DOUBLE_LITERAL /* 实数的字面常量 */ ; 为了看得更分明,能够将愈发规定简化成上面的格局: ...

March 25, 2021 · 4 min · jiezi

关于rust:实践解析丨Rust-内置-traitPartialEq-和-Eq

摘要:Rust 在很多中央应用了 traits, 从十分通俗的操作符重载, 到 Send, Sync 这种十分奥妙的个性。本文分享自华为云社区《Rust 内置 trait 解析:PartialEq 和 Eq》,原文作者:debugzhang Rust 在很多中央应用了 traits, 从十分通俗的操作符重载, 到 Send, Sync 这种十分奥妙的个性。一些 traits 是能够被主动派生的(你只须要写#[derive(Copy, Clone, PartialEq, Eq, Debug, Default, Hash, ...)] 就能失去一个神奇的实现, 它通常是对的。 PartialEq 和 Eq这两个 Traits 的名称实际上来自于抽象代数中的等价关系和部分等价关系,实际上两者的区别仅有一点,即是否在相等比拟中是否满足反身性(Reflexivity)。 PartialEq/// [`eq`]: PartialEq::eq/// [`ne`]: PartialEq::ne#[lang = "eq"]#[stable(feature = "rust1", since = "1.0.0")]#[doc(alias = "==")]#[doc(alias = "!=")]#[rustc_on_unimplemented( message = "can't compare `{Self}` with `{Rhs}`", label = "no implementation for `{Self} == {Rhs}`")]pub trait PartialEq<Rhs: ?Sized = Self> { /// This method tests for `self` and `other` values to be equal, and is used /// by `==`. #[must_use] #[stable(feature = "rust1", since = "1.0.0")] fn eq(&self, other: &Rhs) -> bool; /// This method tests for `!=`. #[inline] #[must_use] #[stable(feature = "rust1", since = "1.0.0")] fn ne(&self, other: &Rhs) -> bool { !self.eq(other) }}如果咱们想比拟某个类型的两个值 x 和 y 是否相等(不等),例如:x == y (x != y),那么咱们就必须为类型实现 PartialEq Trait。 ...

March 23, 2021 · 2 min · jiezi

关于编程语言:程序员专属灯谜大挑战答对六题算你赢

人不知;鬼不觉间,正月十五元宵节就到了,除了吃元宵外,猜灯谜,这个必备娱(zhi)乐(shang)节目,怎么能缺席? Everybody看过去!挑战程序员专属”灯谜“,考验业余能力的时候到了!01.你晓得世上最傲娇的编程语言叫什么吗?A、 Intercal B、 Java C、 C++ D、 Python 答案:A。有一种叫INTERCAL的编程语言,它是一种没有缩略词的编译型语言,被称为世界上最深奥的编程语言之一。它讥刺了其它各种编程语言的各个方面,比方有一些必须应用的关键词:PLEASE(请)、 IGNORE(疏忽)、 FORGET(遗记)……如果你在一段代码里用的“请”字不够多,程序会回绝这段代码。 02.说起404,大家都不生疏,那你晓得为什么无法访问的网站要用404来代替吗?A、 一个叫404的电话 B、 一个叫404的房间 C、一个叫404的卡车 答案:B. 相传互联网的第一架服务器,架设在欧洲核钻研组织的404号房。如果要关上网页,就得向404房的Berners-Lee提交申请,如果他没在房间内,就会呈现「404 not found」。 03.如果你喜好游戏的话,上面4款游戏大作你肯定不会生疏。但你晓得它们和Kubernetes有什么分割吗?以下哪款游戏是最早应用Kubernetes的?A、 Pokémon B、 王者光荣 C、 魔兽世界 D、 塞尔达 答案:A。Pokemon Go 是最风行的宣传 Kubernetes 能力的应用案例。在它公布之前,人们都感觉在线多人游戏会相当的失去追捧。但当它一旦公布,就像火箭一样腾飞,达到了预期流量的 50 倍。通过应用 Kubernetes 作为 Google Cloud 之上的基础设施层,Pokemon Go 能够大规模扩大以满足意想不到的需要。 04.你和你的男闺蜜正在观赏乘风破浪姐姐们的精彩舞蹈,它存储在由三个Master 节点治理的 ChubaoFS 集群中,忽然其中一台坏掉了,男闺蜜放心的问你还能流畅的看到姐姐们吗,你会怎么做?A. 通知他立即买机票,去现场观看 B. 刺激他说你也会跳,并表演给他看 C. 通知他不要放心,三个Master节点都坏掉也不会影响他看小姐姐 D. 告诉机房立即重启集群 答案:C。ChubaoFS的Master节点负责集群资的调度和治理,其实用Raft算法保证数据一致性,坏掉节点数少于总数50%则不会影响其性能,且即便所有Master节点都坏掉也只会影响到Volume的创立和扩容下线等资源调度工作,对已存在Volume上的数据读写不会产生影响。 05.在UNIX零碎中应用的目录构造是A、单级目录构造 B、二级目录构造 C、单纯树形目录构造 D、带链接树形目录构造 答案:这个答案可不能通知你~扫描下方二维码,填写你认为正确的答案,答对即可参加抽奖! 06.TCP/IP 参考模型分为四层:()、网络层、传输层、应用层A、物理层 B、流量管制层 C、会话层 D、网络接口层 答案:这个答案也不能通知你~扫描下方二维码,填写你认为正确的答案,答对即可参加抽奖! 灯谜都不对?不要紧! 扫描下方二维码 在京东云官网注册实现实名认证 ...

March 1, 2021 · 1 min · jiezi

关于编程语言:format不只是格式化

《实战Common Lisp》系列次要讲述在应用Common Lisp时能派上用场的小函数,心愿能为Common Lisp的振兴做一些渺小的奉献。MAKE COMMON LISP GREAT AGAIN。序言写了一段时间的Python后,总感觉它跟Common Lisp(下文简称CL)有亿点点像。例如,Python和CL都反对可变数量的函数参数。在Python中写作 def foo(* args): print(args)而在CL中则写成 (defun foo (&rest args) (print args))Python的语法更紧凑,而CL的语法表意更清晰。此外,它们也都反对关键字参数。在Python中写成 def bar(*, a=None, b=None): print('a={}\tb={}'.format(a, b))而在CL中则是 (defun bar (&key (a nil) (b nil)) (format t "a=~A~8Tb=~A~%" a b))只管CL的&key依然更清晰,但申明参数默认值的语法的确是Python更胜一筹。 仔细的读者可能发现了,在Python中有一个叫做format的办法(属于字符串类),而在CL则有一个叫做format的函数。并且,从下面的例子来看,它们都负责生成格式化的字符串,那么它们有相似之处吗? 答案是否定的,CL的format几乎就是格式化打印界的一股泥石流。 format的根本用法无妨从下面的示例代码动手介绍CL中的format(下文在不引起歧义的状况下,简称为format)的根本用法。首先,它须要至多两个参数: 第一个参数管制了format将会把格式化后的字符串打印到什么中央。t示意打印到规范输入;第二个参数则是本文的配角,名为管制字符串(control-string)。它领导format如何格式化。听起来很神秘,但其实跟C语言的fprintf也没什么差异。 在管制字符串中,个别会有许多像占位符个别的命令(directive)。正如Python的format办法中,有各式各样的format_spec可能格式化对应类型的数据,管制字符串中的命令也有很多种,常见的有: 打印二进制数字的~B,例如(format t "~B" 5)会打印出101;打印八进制数字的~O,例如(format t "~O" 8)会打印出10;打印十进制数字的~D;打印十六进制数字的~X,例如(format t "~X" 161)会打印出A1;打印任意一种类型的~A,个别打印字符串的时候会用到。另外,format的命令也反对参数。在Python中,能够用下列代码打印右对齐的、左侧填充字符0的、二进制模式的数字5 print('{:0>8b}'.format(5))format函数也能够做到同样的事件 (format t "~8,'0B" 5)到这里为止,你可能会感觉format的管制字符串,不过就是将花括号去掉、冒号换成波浪线,以及参数语法不一样的format办法的翻版罢了。 接下来,让咱们进入format的黑科技领域。 format的高级用法进制转换后面列举了打印二、八、十,以及十六进制的命令,但format还反对其它的进制。应用命令~R搭配参数,format能够打印数字从2到36进制的所有状态。 (format t "~3R~%" 36) ; 以 3进制打印数字36,后果为1100(format t "~5R~%" 36) ; 以 5进制打印数字36,后果为 121(format t "~7R~%" 36) ; 以 7进制打印数字36,后果为 51(format t "~11R~%" 36) ; 以11进制打印数字36,后果为 33(format t "~13R~%" 36) ; 以13进制打印数字36,后果为 2A(format t "~17R~%" 36) ; 以17进制打印数字36,后果为 22(format t "~19R~%" 36) ; 以19进制打印数字36,后果为 1H(format t "~23R~%" 36) ; 以23进制打印数字36,后果为 1D(format t "~29R~%" 36) ; 以29进制打印数字36,后果为 17(format t "~31R~%" 36) ; 以31进制打印数字36,后果为 15之所以最大为36进制,是因为十个阿拉伯数字,加上二十六个英文字母正好是三十六个。那如果不给~R加任何参数,会应用0进制吗?非也,format会把数字打印成英文单词 ...

January 30, 2021 · 3 min · jiezi

关于编程语言:OReilly-发布-2021-技术趋势报告Python-最受欢迎低代码是重要趋势

出名计算机图书出版公司 O'Reilly 近日依据其在线学习平台生成的数据公布了一份技术行业发展趋势的剖析报告。 报告指出,Python 曾经成为了最受欢迎的语言,而 JavaScript 的使用量只有 Python 的 20%。低代码和无代码编程将不可避免的扭转编程语言的性质。 另一方面,人工智能畛域和 Web 开发的增长仍在持续。无关云的应用和平安隐衷也都是重点倒退的趋势。 考察背景O’Reilly 对技术行业的趋势剖析是基于其平台生成的数据。O’Reilly 在线学习的使用量始终在稳步增长,思考到 COVID-19 的暴发对技术行业带来的变动,这样的增长趋势并不令人意外。 对技术行业发展趋势的剖析并不是从哪一技术畛域在短期内迅速受到关注和风行来看的,而是通过长期的体现失去的察看。“趋势”和“潮流”不同,潮流通常是一闪而过的,但趋势是在更长的工夫范畴内展示进去的,在这个过程中甚至可能会有倒退的体现,但趋势的倒退是不会进行的,表象的背地有更多参考因素。 从编程语言的应用状况来看,Python 的使用量是最高的,与去年相比还回升了 27%。排在第二位的是 Java,比去年降落了 3%,第三是 C++,比去年回升了 10%。第四和第五别离是 C 和 JavaScript,使用量别离回升了 12% 和 40%。 令人诧异的一点是,JavaScript 尽管排名前五,但使用量却远远落后于 Python 和 Java,只能达到 Python 的 20% 和 Java 的 33%。在前面的排名中,Rust 的增长非常明显,达到了 94%。不过,从一个较小基数开始的 Rust,增长 94% 并不是很难。 从统计数据能够看出,反而是 增长 16% 的 Go 语言曾经分明地确立了本人的位置。作为一种用于并发编程的语言,Rust很可能建设本人的“零碎编程”位置:为云操作构建新的操作系统和工具。作为一种为数学计算而设计的语言 Julia 是一个乏味的未知因素。尽管在过来的一年里,它略有降落,然而咱们对它的长期机会持乐观态度。 咱们不应该将专门用于学习编程语言的题目与利用该语言或应用基于该语言的框架的题目离开应用。毕竟,许多 Java 开发人员应用 Spring,搜寻“ Java”会脱漏内容,而题目中只有“ Spring”这个词。对于 JavaScript 也是如此,它包含 React、 Angular 和 Node.js 框架。在 Python 中,应用最多的库是 PyTorch 和 scikit-learn。下图显示了将 Python、 Java 和 JavaScript 的内容增加到这些语言最重要的框架中时所产生的状况。 ...

January 29, 2021 · 4 min · jiezi

关于编程语言:感悟篇如何写好函数式代码

最近在写代码的时候经常感觉迷茫,到底函数式语言应该如何写代码。immutable 数据结构的益处到底在哪里。为什么我写进去的代码总感觉像是命令式、过程式的。 带着这些纳闷,我又从新开始学习了史上最胜利的函数式语言 ---- SQL。是的你没看错,SQL是一门函数式语言。 在 https://www.sql-ex.ru/ 这个网站上,你能够做很多收费的 SQL 习题,还有收费的排名,十分爽。 而 SQL 外围的语句是很简略的,select, from, where 三板斧,轻轻松松地就能将需要变成查问语句。 例如这样一个问题:Find the model number, speed and hard drive capacity of PCs cheaper than $600 having a 12x or a 24x CD drive. 写进去的 SQL 答案就是: select model, speed, hdfrom PCwhere price < 600 and (cd = '12x' or cd = '24x')几乎就是大白话直译,仍然信达雅齐全。所以咱们总结进去,要写出好的函数式代码,你得设计出好的 DSL,或者是好的形象,好坏的规范就是是否够间接翻译产品的需要。而是否用自然语言形容出需要,也是很考验能力的。所以咱们进一步推出: 要成为一个好的函数式程序员,你须要成为一个好的产品经理。

January 25, 2021 · 1 min · jiezi

关于编程语言:ObjectiveC-之父-Brad-J-Cox-去世他推动了苹果软件生态的发展

据外媒报道,编程语言 Objective-C 之父 Brad J. Cox 博士已于2021 年 1 月 2 日在其家中去世,享年 77 岁。 史蒂夫·乔布斯曾在苹果开发 NeXTSTEP 操作系统时,应用了Objective-C。当初,Objective-C 仍是 OS X 和 iOS 操作系统、及与其相干的 API、Cocoa 和 Cocoa Touch 的次要编程语言。 苹果生态开发者最相熟的编程语言之一Objective-C 是一种通用、高级、面向对象的编程语言。其名称的由来是:在 C 语言主体上退出面向对象的个性。任何 C 语言程序不经批改就能够间接通过 Objective-C 编译器,在 Objective-C 中应用 C 语言代码也是齐全非法的。它扩大了规范的 ANSI C 编程语言,将 Smalltalk 式的消息传递机制退出到 ANSI C 中。目前次要反对的编译器有 GCC 和 Clang(采纳LLVM 作为后端)。 当年,史蒂夫·乔布斯为其新操作系统 NEXTSTEP 授予了 Objective-C 语言许可。Objective-C 成为了苹果生态开发者最相熟的编程语言之一。Objective-C 能够在现存 C 编译器根底上实现,而不须要编写一个全新的编译器,使得它能利用大量现存的C 代码、库、工具和编程思维等资源。 但随着编程语言的一直演进,Objective-C 的毛病也逐步裸露进去,比方不反对命名空间;不反对运算符重载;不反对多重继承;应用动静运行时类型,所有的办法都是函数点用,很多编译时的优化办法都用不到等。因而,近年来,苹果始终想让开发者放弃 Objective-C,转向 Swift。在开发语言排行榜 TIOBE 榜单中,Objective-C 的风行水平指数一路下滑,替代者 Swift 的位次逐步回升。 ...

January 25, 2021 · 1 min · jiezi

关于编程语言:为什么要学编程学习编程的方法是什么

咱们学习编程,然而不肯定要成为程序员。就像每个人都应该学习法律常识,但不是都要成为律师;像每个人都应该学习经济学,然而不是必须成为经济学家;就如同每个人都要学习数学,但不是每个人都要成为数学家。 不同的学科知识给与人们不同的思考形式,这些思维形式贯通着咱们日常生活的点点滴滴,编程自身就是造就一个思维的过程,也能够帮忙咱们把握逻辑思维的能力。上面为大家分享一下学习编程的办法: 1,给本人一个大略的思路,从什么开始?如果你连Windows都不相熟,不要紧,先把Windows操作纯熟吧,不难,只有有心,几天后你也是高手。 2,选一门语言。当初风行的编程语言有很多。见下图,你能看到目前各种语言的应用排行榜。留神,不要跟风,依据本人的状况来抉择学习。 3,重视根底。当初针对很对高级语言有了很多绝对应的IDE,使编程变得傻瓜化,但请不要在初学语言的时候依赖于它们,因为它们帮你做了很多事,其中的很多事咱们得去学习得晓得。要从根底开始,我集体倡议先学习C语言。C语言对于数据类型的描叙全面,分明,明确。  3,C语言是一门面向过程的语言。从数据类型,根本表达式,再到条件语句,循环语句,而后学习函数,再加上一些简略的数组常识,每个知识点多练习几次,这个时候千万不要贪快,肯定要了解透彻其中的原理性的货色。 4.以上的学习,大略你须要2周到一个月的工夫,接下去,你能够着手看看汇编。汇编开始的时候是很难,那些各种各样的寄存器,分段的内存地址,是很难了解,可是这些常识了解了当前,前面的内容就简略了,学习8086的那些指令,再加上一些伪操作,还有DOS和BIOS中断的调用,就可以看懂书上的汇编程序了。看汇编程序后你会深刻明确很多货色,使你更加明确计算机的工作原理。 5.有了汇编的根底,再回到C语言的学习,置信你会很有信念了。这个时候你能够 大略回顾一下C语言中学过的常识,或者是去网站上找几个例子做做,让本人胸中有竹子。而后开始学习C语言中的精髓局部也是难点--指针,学完这个,编程根底就扎实了。 6 .学习数据结构和算法。学习排序、图、树、串、队列、栈、链表、堆等。这个方面的学习很重要,如果这个学好了,对当前进一步学习有十分大的帮忙。 7.学到这里,你会发现,你曾经能够实现一些简略的使用了,比方写一个计算器等等。如果要你写一个日记本,你会吗?当然你能够了,你能够把所有的日记存储在文本中;但如果数据愈来愈大,要怎么治理呢?这个时候咱们就要想到开始学习数据库了。目前咱们用得较多的是Oracle、Sql server,见下图,咱们能够看到很多的数据库以及它们的应用排行。 8.以上常识全副学透了的话,你也算是高手一枚啦。这个时候你能够去学习一些面向对象的编程语言啦,比方C++、C#、Java、PHP等等。这个时候发现学习它们几乎是小菜一碟,因为语法根本一样。说实话,编程次要是把握思维。 学习是一个过程,有时候会很干燥寂寞,但想法是受本人管制的,你如果认为它是高兴的,那它就会是高兴的,因为当咱们成为了高手之后,咱们就能够有很多很多的Money,如下图,你也能够成为“他”。

January 6, 2021 · 1 min · jiezi

关于编程语言:关于动态类型静态类型语言对于数据的理解的一些差别的随想

不是谨严的思考, 只是梳理一下感触, 最近在动静类型动态类型之间切换有点多, 对照思考.我的教训基本上是 js, ts 和 ClojureScript 上边, 再有点 Nim 的应用教训.而后 Go 跟 Haskell 都只是简略尝试过, 没有深刻进去.这些个语言都是主动内存治理的, 所以内存往下深刻的我也不探讨了. 数据的示意动静类型, 介绍数据结构时候说数组, 说字典, 而后就是根本的操作.基本上只是有一个类型构造, 运行时能力判断具体的类型, 但这个对思维模型来说限度少.比方思考一个数组, 就是数组, 什么都能够放进去, 数字, 字符串, 对象, 正则, 嵌套数组也行.在实现层面, 我喜爱叫这个 uni-type, 因为外部就是一个构造蕴含很多信息来示意各种类型.编程的时候, 思考的就是有这么个构造, 有这么个 value, 至于 value 是什么, 动静的, 能够随便放. 动态类型, 思考就很多了, 特地是内存布局方面的,Nim 里边就是 object(相似 struct), seq, array, list, 多种的构造.每个构造会对应的到一个内存的布局的形式. 细节具体怎么布局, 我理解不彻底, 然而模糊地对应上.特地是动态类型编码的时候不同构造之间性能的差异, 比拟容易显露出来.我用错了构造的时候, 数组的中央用链表, 访问速度的差距马上就进去了.而且构造对类型限度明确, int 数组就不能有 string 了, 这个也是显著的. 从业务编码的角度来说, 用动静类型来模仿一些业务逻辑, 通常还是比拟轻易的.而要用动态类型, 常常须要有一些思考, 用怎么样的类型来示意, 受到什么样的限度.定义了构造, 还有怎么拜访怎么遍历的问题.个别说比方 js 性能优化较全面了, 个别场景都不会去思考不同写法的性能差异了,而动态类型, 示意的形式, 拜访的形式, 都比拟容易对性能造成影响.动态类型更贴近机器, 或者说用动态类型, 就更加须要相熟编码器的各种行为, 以便生成高性能代码. ...

December 1, 2020 · 2 min · jiezi

关于编程语言:2020年11月编程语言排行榜20年来-Java-首次跌落至第三

TIOBE 已颁布 2020 年 11 月的编程语言排行榜。自20年前TIOBE指数开始以来,Java和C首次不再占据前两位。 C依然是第一,但当初是Python占据了第二的地位。有人说,Python最近的风行是因为数据挖掘、人工智能和数值计算等畛域的蓬勃发展,但我有本人的认识。我置信Python的风行与个别需要无关。在过来,大多数编程流动都是由软件工程师实现的,然而当初到处都须要编程技能,而且不足优良的软件开发人员。 因而,咱们须要一些非软件工程师能够解决的简略的货色,一些容易学习的货色,疾速的编辑周期和平滑的部署。Python满足了所有这些需要。 Python真的超过了Java!这将是Tiobe编程排行榜在创建以来最大的变动,在晓得该排名从2001年开始,Java始终占据前两名未变。 依据Tiobe的首席执行官Paul Jansen所指出,在过来的20年来,C与Java始终稳剧场前两名。但到现在,已有25年倒退历史的Java普及率靠近“历史最低点”——和2019年10月相比降落4.32%个百分点。 Jansen学生在9月份就放言说,“Java确定遇到了麻烦”,因为Java在当月同比降落3.81个百分点。 而1991年创立的Python,因为受到数据科学家的宽泛应用,包含机器学习的趣味,其受欢迎度正在与日俱进的攀升。 对于TIOBETIOBE编程社区指数(The TIOBE Programming Community index)是编程语言风行度的指标,是依据互联网上有教训的程序员、课程和第三方厂商的数量,并应用搜索引擎(如Google、Bing、Yahoo!)以及Wikipedia、Amazon、YouTube统计出排名数据,只是反映某个编程语言的热门水平,并不能阐明一门编程语言好不好,或者一门语言所编写的代码数量多少。 TIOBE开发语言排行榜 每月更新一次,根据的指数是基于世界范畴内的资深软件工程师和第三方供应商提供,其后果作为以后业内程序开发语言的风行应用水平的无效指标。 该指数能够用来检阅开发者的编程技能是否跟上趋势,或是否有必要作出策略扭转,以及什么编程语言是应该及时把握的。察看认为,该指数反馈的虽并非以后最风行或利用最广的语言,但对世界范畴内开发语言的走势仍具备重要参考意义。 5月份编程语言前20名排行 前十名当中,除了Java 和 Python 排名呈现对调外,其余名次暂无变动。11-20 名间则呈现了较大的变动,其中排名降落的有:Perl(11→12);Ruby(13→15 );MATLAB(15→17);Objective-C(18→19)。 排名回升的有:Groovy(12→11);Go(14→13);Swift(16→14);Assembly language(17→16)。 上月别离排名第 22 和 24 的 Delphi/Object Pascal 和 Transact-SQL 别离以第 18 和 20 的名次进入榜单。Classic Visual Basic 和 PL/SQL 则再次被挤出前 20 榜单。 此前曾上榜四个月的 Rust 自上个月由第 18 名掉至第 25 名后,本月仍未再重回榜单,排名稳固在第 25 名。 TOP 10 编程语言 TIOBE 指数走势(2002-2020) ...

November 6, 2020 · 1 min · jiezi

关于编程语言:从Rust出发开启安全存储之路

疫情过后的夏天,交通开始梗塞,餐厅开始排队,街道开始冷落起来,今日让人焦躁的清静现在却带来了某种安全感,人们压抑已久的心田开始躁动,如《乐夏》第二季,就在这种安全感和躁动中“勉强上线”,让我等离音乐圈九天之外的IT人也躁动了一把……IT人玩音乐仿佛有点不靠谱,但搞技术咱们是认真的。 在竞争日益强烈的科技倒退过程中,抉择正确的计算机编程语言,对于企业和开发人员来讲,十分重要。对于由 Mozilla 开发的重视平安、性能和并发性的编程语言 Rust,门槛之高让很多学习者望而生畏,但它优雅的解决高并发和高安全性零碎问题的能力,成为泛滥开发者中最受欢迎的编程语言,曾经间断四年在 StackOverflow 开发者考察中蝉联“最受开发者青睐的编程语言”。目前谷歌、微软、亚马逊、苹果、甲骨文、三星、Mozilla、Cloudflare、Dropbox 、阿里、腾讯、百度、字节跳动等公司都在应用 Rust。 年老的时候,力量就在于挣脱套路第一个有版本号的 Rust 编译器于 2012 年 1 月公布,第一个稳固版本 Rust 1.0,于 2015 年 5 月 15 日公布。绝对其余计算机编程语言,Rust 是年老的,在性能上,Rust 怀才不遇。其设计指标是要做一门零碎编程语言,具备高安全性、良好的并行性、杰出的模块化设计,这就意味着 Rust 能够用于建造牢靠高效的零碎,因而更加强调安全性、存储器配置、以及并发解决等方面的个性,尤其是并发平安,反对函数式和命令式以及泛型等编程范式的多范式语言,在语法上和 C++ 相似,然而能够在保障性能的同时提供更好的内存平安。 做技术,要找到和他人不一样的力量从久远来看,将来5G、物联网、人工智能将是下一波科技大潮的根底,大量IOT和边缘计算的场景中会呈现巨量的边缘数据,须要满足将来海量设施的平安存储需要,对此安全性、可用性和性能的需要将会不断涌现,Rust 将会在这些场景中大有所为。 平安存储方面的技术迭代须要一门优良的编程语言来进行疾速的原型开发,最根本的如哈希算法、签名算法,到应用大量前沿密码学的成绩,如零常识证实、环签名;其次网络上,把这个带有高安全性软件运行起来,叫运行一个节点。如果寰球有十分多这样的节点,而这些节点在简单网络(公有网络、私有网络)环境下连接成大规模网络,并能够提供对立的数据存储和散发服务,那么它就造成了所谓的平安存储网络。事实中节点之间通过网络连接,环境非常复杂,会有各种路由、专用网络、防火墙、各种协定等,一个节点链接可能须要端口映射,或者应用加密通信技术,或者应用网络穿透等技术,才可能连上其它节点。这就须要 P2P 网络和 24 小时网络服务的高可靠性和高性能 。 Rust 能很好的适配以上特点,同时也具备以下劣势: 性能好,与 C++并驾齐驱;平安,编译期杜绝内存和并发问题,使得软件具备高可靠性;表达能力强,能够进行疾速原型开发,提高效率;与 C 无缝交互,解决密码学库缺失问题(因为很多密码学的库是用 C 写的);生态凋谢,编译器和绝大多数库采纳 MIT/Apache,开发沉闷,停顿快。相比起目前其余计算机语言,用 Rust 编程语言开发平安存储技术再适合不过了。正如一位驰名的程序员已经说过:Pascal 就像衣着紧身衣,C 就像在玩刀,C++就像在玩焚烧的电锯,Rust 就像是衣着爱护配备悬挂在绳子上做跑酷静止。看起来有点可笑,然而能够用它做各种很酷的动作而不挫伤本人。 从 Rust 登程,开启平安存储之路尽管 Rust 间断四年在 StackOverflow 开发者考察中蝉联“最受开发者青睐的编程语言”,但有意思的是,其中 97% 的受访者并未应用过 Rust,他们对 Rust 语言的青睐,仍停留在“想学习”的阶段,而 Netwarps 开发团队将“想学习” Rust 编程语言付诸行动,从当下登程,用 Rust 谱写平安存储技术新的篇章。 ...

August 28, 2020 · 1 min · jiezi

关于编程语言:Go语言入门系列六之再探函数

Go语言入门系列后面的文章: Go语言入门系列(三)之数组和切片Go语言入门系列(四)之map的应用Go语言入门系列(五)之指针和构造体的应用在Go语言入门系列(二)之根底语法总结这篇文章中曾经介绍过了Go语言的函数的根本应用,包含申明、参数、返回值。本文再具体介绍一下函数的其余应用。 1. 变参Go语言的函数除了反对0个或多个参数,还反对不定数量的参数,即变参。申明形式为: func foo(变参名 ...参数类型) 函数类型 { //函数体}上面是一个具体的函数,它接管不定数量的int参数,并返回和: package mainimport "fmt"func add(arg ...int) int { //变参函数 var sum int for _, value := range arg { sum += value } return sum}func main() { sum := add(1, 2, 3, 4) fmt.Println(sum) //10}arg ...int表明add函数接管不定数量的参数,且只能是int类型的。arg是咱们给该变参取的名字,它实际上是一个切片,所以在add函数中能够应用range遍历变量arg。 2. 传值和传指针当咱们调用一个有参函数时,必定会向该函数中传入参数: package mainimport "fmt"//传入一个值,打印它func printX(x int) { fmt.Println(x)}func main() { var a int = 5 printX(a) //向函数中传入参数:变量a}这里有一个问题:咱们真的是把变量a传给了printX函数吗?咱们用两个例子来阐明问题。 2.1. 例1package mainimport "fmt"func plusOne(x int) int { x = x + 1 fmt.Println("执行加一") return x}func main() { a := 5 fmt.Println("a =", a) //应该为5 理论为5 b := plusOne(a) fmt.Println("a =", a) //应该为6 理论为5 fmt.Println("b =", b) //应该为6 理论为6}plusOne函数的作用是把传进来的参数加一,并返回后果。 ...

August 11, 2020 · 2 min · jiezi

关于编程语言:Go语言入门系列五之指针和结构体的使用

Go语言入门系列后面的文章: Go语言入门系列(二)之根底语法总结Go语言入门系列(三)之数组和切片Go语言入门系列(四)之map的应用1. 指针如果你应用过C或C++,那你必定对指针这个概念不生疏。 咱们须要先介绍两个概念:内存和地址。 1.1. 内存和地址咱们写的代码都存储在外存(C盘、D盘)中,比方我存在了D:\Work\Program\go目录下。如果你想要运行你的代码,必须先把你的代码加载进内存中,而后交给CPU执行计算,而CPU计算的后果也会存到内存中。 内存的存取速度快,其中有许多存储单元用来存储数据,CPU能在内存中间接找到这些数据。这是因为内存中的每个地位都有一个举世无双的地址标识。能够把内存看成一幢有许多房间的大楼,每个存储单元是一个房间,存储的数据是房间中的物品,地址就是房间号。 所以对CPU来说,如果想找到某个房间中的物品(从内存中取数据),或者向某个房间中放物品(向内存中存数据),咱们必须晓得房间号(内存地址)。 内存地址通常是一串16进制的数字,如果写代码时存个整数1或取个整数1都须要写这么一串数字,那太麻烦了。所以高级语言为咱们提供了一个便当,用咱们人能记住的“名字”来代替这串数字。 这些“名字”就是变量名。 var a int = 1var b int = 2var c int = 333var d int = 6666变量名和地址的关联由编译器替咱们做,硬件拜访的依然是内存地址。 1.2. 什么是指针?简略地来说,指针也是一个变量,只不过这个变量中存的不是咱们平时用到的1、2、3、"Hello"、true等值,而是其余变量的地址。 之所以取名指针,是因为指针变量b中保留了变量a的地址,咱们能够通过该指针变量b找到变量a,如果画图看起来,看起来就像是指针b指向了变量a。 还能够有指针的指针: 1.3. 指针的应用申明一个指针: var p *int*int示意p是一个int类型指针,p指针中存的是一个int类型变量的地址,这意味着p中不能存其余类型变量的地址。 如何获取某个变量的地址呢?应用操作符&: var a int = 66 //a是值为66的int变量p = &a //将a的地址赋给指针p那么如何依据指针中的地址找到对应的变量呢?应用操作符*: var b = *p //依据p中的值找到a,将其值赋给bfmt.Println(b) //66*p = 99 //依据p中的值找到a,扭转a的值fmt.Println(a) //99肯定要留神指针的初始化,如果不初始化,则指针的的值是其零值——nil。对未初始化的指针赋值,则会出问题: var p *int //只申明,未初始化*p = 12 //报错:invalid memory address or nil pointer dereference起因是指针p中没值,是个nil,天然就无奈依据地址找到变量。如果你想应用指针,必须先确保你的指针中有非法的内存地址才行。该当这样写: ...

August 8, 2020 · 2 min · jiezi

关于编程语言:Go语言入门系列五之指针和结构体的使用

Go语言入门系列后面的文章: Go语言入门系列(二)之根底语法总结Go语言入门系列(三)之数组和切片Go语言入门系列(四)之map的应用1. 指针如果你应用过C或C++,那你必定对指针这个概念不生疏。 咱们须要先介绍两个概念:内存和地址。 1.1. 内存和地址咱们写的代码都存储在外存(C盘、D盘)中,比方我存在了D:\Work\Program\go目录下。如果你想要运行你的代码,必须先把你的代码加载进内存中,而后交给CPU执行计算,而CPU计算的后果也会存到内存中。 内存的存取速度快,其中有许多存储单元用来存储数据,CPU能在内存中间接找到这些数据。这是因为内存中的每个地位都有一个举世无双的地址标识。能够把内存看成一幢有许多房间的大楼,每个存储单元是一个房间,存储的数据是房间中的物品,地址就是房间号。 所以对CPU来说,如果想找到某个房间中的物品(从内存中取数据),或者向某个房间中放物品(向内存中存数据),咱们必须晓得房间号(内存地址)。 内存地址通常是一串16进制的数字,如果写代码时存个整数1或取个整数1都须要写这么一串数字,那太麻烦了。所以高级语言为咱们提供了一个便当,用咱们人能记住的“名字”来代替这串数字。 这些“名字”就是变量名。 var a int = 1var b int = 2var c int = 333var d int = 6666变量名和地址的关联由编译器替咱们做,硬件拜访的依然是内存地址。 1.2. 什么是指针?简略地来说,指针也是一个变量,只不过这个变量中存的不是咱们平时用到的1、2、3、"Hello"、true等值,而是其余变量的地址。 之所以取名指针,是因为指针变量b中保留了变量a的地址,咱们能够通过该指针变量b找到变量a,如果画图看起来,看起来就像是指针b指向了变量a。 还能够有指针的指针: 1.3. 指针的应用申明一个指针: var p *int*int示意p是一个int类型指针,p指针中存的是一个int类型变量的地址,这意味着p中不能存其余类型变量的地址。 如何获取某个变量的地址呢?应用操作符&: var a int = 66 //a是值为66的int变量p = &a //将a的地址赋给指针p那么如何依据指针中的地址找到对应的变量呢?应用操作符*: var b = *p //依据p中的值找到a,将其值赋给bfmt.Println(b) //66*p = 99 //依据p中的值找到a,扭转a的值fmt.Println(a) //99肯定要留神指针的初始化,如果不初始化,则指针的的值是其零值——nil。对未初始化的指针赋值,则会出问题: var p *int //只申明,未初始化*p = 12 //报错:invalid memory address or nil pointer dereference起因是指针p中没值,是个nil,天然就无奈依据地址找到变量。如果你想应用指针,必须先确保你的指针中有非法的内存地址才行。该当这样写: ...

August 8, 2020 · 2 min · jiezi

关于编程语言:Java不可不知的泛型使用

后面的文章: 详解Java的对象创立一文打尽Java继承的相干问题一文打尽Java抽象类和接口的相干问题本文介绍了Java的泛型的根本应用。 1. 为什么应用泛型看上面一个例子: 为了阐明问题,本类写的尽量简陋,请把眼光次要放在类型上。 /** * @author Xing Xiaoguan (xingrenguanxue) */public class MyArrayList { private int[] elementData; private int size = 0; public MyArrayList(int capacity) { elementData = new int[capacity]; } //向数组中增加元素 public void add(int i) { if (size == elementData.length) { throw new IndexOutOfBoundsException("数组已满"); } elementData[size++] = i; } //从数组中依据下标获取元素 public int get(int index) { if (index < 0 || index > size - 1) { throw new IndexOutOfBoundsException("超出范围"); } return elementData[index]; } @Override public String toString() { return "MyArrayList{" + "elementData=" + Arrays.toString(elementData) + '}'; }}该类很简略:有两个成员变量,elementData是一个数组,size是数组中元素的数量。add和get办法能增加和获取元素。 ...

August 7, 2020 · 3 min · jiezi

关于编程语言:Go语言入门系列四之map的使用

本系列后面的文章: Go语言入门系列(一)之Go的装置和应用Go语言入门系列(二)之根底语法总结Go语言入门系列(三)之数组和切片1. 申明map是一种映射,能够将键(key)映射到值(value),格局为:map[keyType]valueType。 申明一个map并初始化它,应用key:value进行初始化: var scores = map[string]int {"数学":100, "语文":90, "Go":100}如果不想间接初始化,能够先申明再应用,留神这样须要应用make函数初始化后能力应用: var scores map[string]intscores = make(map[string]int)为什么这样申明须要应用make函数? map的零值是nil map,没有键,也不能增加键。 var m map[string]int //申明一个m map,它当初默认是nilfmt.Println(m) //map[]m["A"] = 1 //报错:assignment to entry in nil map所以为了不让该map不是nil,须要应用make初始化: var m map[string]int //nilm = make(map[string]int) //初始化m["A"] = 1 //增加元素fmt.Println(m) //map[A:1]当然,不便的短变量申明形式也能用: m := map[string]int {"A":1, "B":2}或者m := make(map[string]int)m["A"] = 1m["B"] = 22. 增删改查(增)减少键值对: scores["数学"] = 100 //向scores这个map增加了键为“数学”,值为100的数据scores["语文"] = 90(删)删除键值对: delete(scores, "语文")(改)批改键值对和减少键值对的语法雷同(当key不存在时为减少,当key存在时为批改): scores["语文"] = 10(查)应用key能够查找到对应的value,会返回两个值,第一个是key对应的value,第二个是布尔值(如果key存在,是true;否则是false)。如果查找的key不存在,则会返回value类型的“零值”: ...

August 5, 2020 · 1 min · jiezi

关于编程语言:Go语言入门系列四之map的使用

本系列后面的文章: Go语言入门系列(一)之Go的装置和应用Go语言入门系列(二)之根底语法总结Go语言入门系列(三)之数组和切片1. 申明map是一种映射,能够将键(key)映射到值(value),格局为:map[keyType]valueType。 申明一个map并初始化它,应用key:value进行初始化: var scores = map[string]int {"数学":100, "语文":90, "Go":100}如果不想间接初始化,能够先申明再应用,留神这样须要应用make函数初始化后能力应用: var scores map[string]intscores = make(map[string]int)为什么这样申明须要应用make函数? map的零值是nil map,没有键,也不能增加键。 var m map[string]int //申明一个m map,它当初默认是nilfmt.Println(m) //map[]m["A"] = 1 //报错:assignment to entry in nil map所以为了不让该map不是nil,须要应用make初始化: var m map[string]int //nilm = make(map[string]int) //初始化m["A"] = 1 //增加元素fmt.Println(m) //map[A:1]当然,不便的短变量申明形式也能用: m := map[string]int {"A":1, "B":2}或者m := make(map[string]int)m["A"] = 1m["B"] = 22. 增删改查(增)减少键值对: scores["数学"] = 100 //向scores这个map增加了键为“数学”,值为100的数据scores["语文"] = 90(删)删除键值对: delete(scores, "语文")(改)批改键值对和减少键值对的语法雷同(当key不存在时为减少,当key存在时为批改): scores["语文"] = 10(查)应用key能够查找到对应的value,会返回两个值,第一个是key对应的value,第二个是布尔值(如果key存在,是true;否则是false)。如果查找的key不存在,则会返回value类型的“零值”: ...

August 5, 2020 · 1 min · jiezi

关于编程语言:RedMonk-2020-年-Q3-编程语言排行公布Python-第二Rust-进入前二十

出名软件行业剖析公司 RedMonk 公布了 2020 年第三季度半年度编程语言排行,这是 RedMonk 往年公布的第二份榜单,上一次是往年 3 月公布的第一季度编程语言排行。 RedMonk 榜单的排名过程做了一些调整,尽管具体的收集形式曾经扭转,但根本过程依然是一样的。RedMonk 从 GitHub 和 Stack Overflow 提取语言排名,并将它们联合起来进行剖析。这种排名办法要关联语言探讨和应用状况,来提取对潜在的将来采纳趋势的见解。 2020 第三季编程语言排行 前二十名排名如下: 1 JavaScript 2 Python 3 Java 4 PHP 5 C ++ 5 C# 7 Ruby 7 CSS 9 TypeScript 10 C 11 Swift 11 Objective-C 13 R 14 Scala 15 Go 15 Shell 17 PowerShell 17 Perl 19 Kotlin 20 Rust 本季度的排名总体上变动较小。 这是否是绝对语言轨迹失常起伏的一部分,目前尚不分明,但 RedMonk 曾经运行了上面探讨的一些初步数据,并将亲密关注趋势的倒退。 Python(0):本季度排名中最引人注目的“赢家”是Python,是第一个独占前两名的非 java 或 JavaScript 语言。 ...

July 28, 2020 · 1 min · jiezi

关于编程语言:Go语言基础语法总结

1. 意识HelloWorld在后面的《Go的装置和应用》这篇文章中曾经写过HelloWorld.go了,当初就来逐行认识一下它。 package mainimport "fmt"func main() { fmt.Println("Hello, World!")}第1行:咱们的Go程序是由包——package形成的,包的申明模式为:package <包名>。该行的意思是:以后HelloWorld.go文件属于main包。 第2行:如果你应用过Java或Python,那你对import必定不生疏。该行的意思是:导入一个名为fmt的包。如果须要导入多个包,有两种写法: import "fmt"import "math"或者应用分组模式同时导入多个包 import ( "fmt" "math/rand")显然第二种应用括号,以分组的模式导入更加不便。 第3行:咱们应用func关键字来申明一个函数,在这个例子中,咱们申明的是main函数。如果你有过其余语言的编程教训,必定相熟main函数的作用:程序的入口。 第4行:咱们的函数内容放在函数的{}中,在该例中,调用了fmt包中的打印办法,由此可见,Golang语言调用函数的办法和Java、Python一样应用小数点:<包名>.<函数名>。 看完这几行简略代码,咱们发现:在Go语言中,并不需要分号;来完结语句。 2. 变量2.1. 命名标准Go语言要求标识符以一个字母或下划线结尾,前面能够跟任意数量的字母、数字、下划线。不能应用关键字作为标识符 辨别大小写,变量num和变量Num是两个变量。 2.2. 申明Go语言的变量申明形式和其余语言(如C、Java、Python)不太一样。 比方,咱们申明一个为int类型的变量a: var a int能够看出,Go语言申明变量的形式为: var <变量名> <变量类型>咱们还能够同时申明多个类型雷同的变量: var <变量名1>, <变量名2>, <变量名3>, ... <变量类型>应用分组同时申明多个类型不同的变量: var ( <变量名1> <变量类型1> <变量名2> <变量类型2> <变量名3> <变量类型3> ...)上面是一个具体的例子: package mainimport "fmt"var i bool//类型在后func main() { var a, b, c int//多个 fmt.Println(i, a, b, c)}2.3. 初始化当咱们申明变量时,能够对其进行初始化。当有初始值时,咱们能够省略变量的类型,变量会依据对应的初始值获取正确的类型。见下例: ...

July 24, 2020 · 4 min · jiezi

打破常规回归直觉-Feel-语言设计

设计背景几年前我在开发多平台的 XyKey 时,因为过后的跨平台计划还未成熟,所以我没有抉择跨平台实现,而是抉择了每个平台都应用官网指定的语言进行开发,为此我接触了 Java/Kotlin(Android)、Swift/OC(iOS)、C#(UWP)。于此同时我本职工作方向是区块链技术,现有支流区块链计划也大量应用了 JS + Go 的组合开发前后端产品。 在不同语言之间来回切换学习之后,我对不同语言表达同一种性能的语法差异性产生了趣味,随后开始了语法设计方面的钻研摸索,最终诞生了 Feel 语言。 语言设计问题之一很多语言外面,函数存在不止一种表达方法。 咱们须要为同样的需要设计不同的语法吗? 以下我举一些我应用过的语言中函数的示意办法,所有的 eg 都是函数。 Go: 大部分时候函数都应用 func 结尾申明,算是一致性比拟好的设计之一,但在 interface 中还是应用了不一样的形容形式。 func eg1(x int) int { return 1}var eg2 = func(x int) int { return 1}type foo struct { eg3 func(int) int}type bar interface { eg4(int) int}C#: 大部分时候都应用了 C 式的形容形式,但在函数类型中应用了反直觉的泛型类型,并且 Lambda 语法也看不出与函数的分割。 int eg1(int x) { Func<int,int> eg2 = (int x) => { return 1; }; return 1;}interface foo { int eg3(int x);}Action<int> eg4;Kotlin: 函数定义、函数类型、Lambda 是三种格调。 ...

July 14, 2020 · 5 min · jiezi

编程语言之美在动静之态在强弱之间分解释编译之道

在很多技术文档、官方介绍,以及各种各样的编程书籍中,都免不了对编程语言做一些介绍,介绍语言的背景、发展历程,设计理念等一大堆开篇立论,在这一大堆理论中,介绍语言类型时往往会有这么几个词显得有些很不一样,比如:动态类型、静态类型、强类型,弱类型、解释型、编译型。 那么这几个类型是什么意思呢,现在市场上流行、曾经流行的编程语言又分别是哪个类型的呢,接下来就来一一看看。 动态类型动态类型语言,是指在运行期间才做数据类型检查的语言。 此类型的编程语言,变量、属性、方法的参数的数据类型以及方法的返回值类型都可以不用指定,他们的数据类型会在首次赋值时被记录下来。此类型的语言有JavaScript、Perl、PHP、Ruby 、Python和VB等等。 静态类型静态类型语言,在编译阶段就做数据类型检查的语言,这点与动态类型语言刚好相反;也就是说这种类型的语言,声明变量时在就要明确指定变量的数据类型;如果没有明确指定,程序就无法通过编译,更加无法运行。 比如:C、C++、C#、Java以及运行JVM的其他语言都是静态类型语言的典型代表。 强类型强类型语言,也称为强类型定义语言,是一种强制数据类型定义的语言。此类语言的变量的数据类型一旦确定,除非发生类型强制转换,否则其数据类型永远不会发生改变。所以,强类型定义语言也是类型安全的语言。 并且还要求所有的变量、属性必须先声明并初始化后才能使用,而且变量、属性、方法的参数以及方法的返回值必须明确指定数据类型,而且即便不同类型的变量之间的类型转换也要严格按照转换规则来执行。如Java、C# 和 Python、C、C++等都是强类型的语言。 虽然强类型定义语言运行速度上比起弱类型语言稍稍逊色一些,但加以优化,也并非不能克服;强类型定义语言由于明确指定数据类型,所有会更加严谨,从而能避免很懂逻辑和语法上的错误。 弱类型弱类型语言,数据类型可以被忽略的语言,这点与强类型定义语言相反;一个变量可以被赋不同数据类型的值。 在定义变量时可以只使用变量修饰符标识其是一个变量即可,而不用考虑其时什么数据类型;同时,一个变量可以赋不同数据类型的值,且不需要明确的数据类型。比如:变量a 首次赋值的数据类型是字符串类型,但在后期根据需要可以把数字类型的值赋给变量a。 弱类型语言如VB 、PHP、JavaScript等。 解释型解释型语言的源代码会在执行到的那一刻才会被语言解释器转换为计算机可执行文件并执行,整个的运行过程会不断的解释,执行;解释,执行...... 即便新的一次运行到已经解释过的程序,解释器也依然还会再次解释,并执行。 这个过程好比,你买了本纯英文的书,但你看不懂,然后去找了英文翻译来辅助你阅读,你想看哪行,他给你翻译哪行;如果你想回头去看之前的内容,他也依然会重新翻译一次,并给到你。 在解释型程序中,程序总是以源代码的形式出现;那么只要有解释器,一个解释型的程序就能很轻易的移植到另一个平台上。还有程序的修改也很方便,因为其是实时解释的,能够实时查看改动的效果。但也会因程序的不断扩大,减慢程序解释的响应速度,往往对计算机性能有一定的要求。 比如:Java、JavaScript、VBScript、Perl、Python等都是解释型语言。Java 因其JVM的跨平台特性,所以Java 也可算是解释型语言。 编译型是指语言的源码需要经过编译器编译,生成计算机(操作系统)的可执行文件,或者计算机指令,才能够被计算机识别,并执行。完成的过程就是:程序员根据需求写出项目源代码,然后把源代码交由编译器将所有源码文件一次性编译,得到可执行文件,这时,就可以把可执行文件通过操作系统运行起来,就能看到实际的运行效果了。 如果用英文书的例子来说明,就是:英文翻译会将整本书翻译后给到你,那么即便想回头去看之前看过的内容,也只需要自行查阅就可以了。 由于程序要经过编译后才能运行,所以其运行速度会比解释型语言要快上不少;编译过程中会进行一些必要的检查,因此也能避免不少错误的发生;但也是因为其运行机制,小小的改动也要重新编译执行,必定会浪费一定的时间。 比如:C、C++、Java,C#、Pascal/Object Pascal(Delphi)、VB等语言都可视为编译型语言。 一些常见的编程语言的类型无类型: 汇编弱类型、静态类型 : C、C++弱类型、动态类型检查: Perl、PHP、JavaScript强类型、静态类型检查 :Java、C#强类型、动态类型检查 :Python, Scheme静态显式类型 :Java、C静态隐式类型 :Ocaml、Haskell 完结,老夫虽不正经,但老夫一身的才华!关注我,获取更多编程科技知识。

July 6, 2020 · 1 min · jiezi

最近迫切应学的编程语言

作者 谢恩铭,公众号「程序员联盟」(微信号:coderhub)。转载请注明出处。原文:http://www.jianshu.com/p/08ca...编程语言之争从来不曾停止,这篇文章绝对不会去讨论哪个语言是最好的(当然了,除了“PHP 是世界上最好的语言”这句“真理”之外)。 插句题外话,不要听一些人说:“编程语言没有好差之分,只有用起来顺不顺手”。这话其实不正确,编程语言就是有好差之分。有些编程语言就是设计得不好,就是不适合一般的应用,就是无人问津。 我想谈谈最近几年我的感受: 我深刻地认识到 Python 是当下迫切应该学习的编程语言。为什么这么说呢?且听我慢慢“因式分解”: Python 很火,非常火。这和人工智能(AI :Artificial Intelligence)有关。Python 有很多优秀的库,特别适合数学运算和科学计算,而人工智能就需要很多计算和一些算法,因此 Python 的很多库比如 Numpy,Pandas,SciPy,等就有用武之地了。而且很多大公司启动了适合人工智能的库或项目,比如 Google 公司发布的开源机器学习库 TensorFlow,Tesla(特斯拉)的 OpenAI,FaceBook 开源的 PyTorch,等等。这些库上层都可以很方便地用 Python 来操作。Google 的 AlphaGo 击败了人类最强围棋(Go)玩家李世石,而 AlphaGo 是基于 Google 的 DeepMind,DeepMind 前不久宣布底层基于 TensorFlow 了。特斯拉的 OpenAI 在单人对抗中击败了人类最强的 Dota 2 影魔选手之一的 Dendi,完整对战视频。当然了,现在 AI 已经可以在星际争霸 2 中战胜人类选手了。 Python 非常容易入门。Python 号称「Battery included」。我们知道 battery 是「电池」的意思,included 是「包含」的意思,因此就是说 Python 简单到「已经包含了电池了」,功能都已经包含在语言里了,直接拿来用即可。其语法实在很简单,基本没有编程经验的孩子几天也可以学会。现在 Python 更是已经被加入幼儿园、中小学的教材中了。Python 几乎可以被应用在任何领域。人工智能、科学计算领域自然不用说,各种成熟的库调用起来极为方便;大数据领域也是 Python 大展拳脚之处;云计算领域 Python 可以发挥实力,比如著名的 Dropbox 就是 Python 写的;用 PyGame 可以进行快速游戏开发;GUI 图形界面编程也不在话下,Matplotlib 这个绘图库可以满足你;嵌入式领域,著名的树莓派(Raspberry Pi)开发板的主要开发语言是 Python;Web 应用有 Django、Flask,等这个 Web 应用框架,可以很快速地开发出绚丽无比的网站;Web 后端 Python 也不甘寂寞,知乎和豆瓣的后台就是 Python 写的;近几年新兴的职业 DevOps (development 和 operations 的组合)一般也用 Python 来写脚本;一些大型项目的构建以及一些小任务的处理,Python 的脚本也能助你快速开发;用 Python 做爬虫程序,可以轻松爬取网络上你想要的内容(当然,请不要干坏事),Python 有很多不错的爬虫库,例如 Scrapy。优越的跨平台性能,几乎所有的操作系统都可以跑起来 Python。Python 既支持面向过程函数式编程也支持面向对象的抽象编程。用 Python 语言编写程序让人很愉快,反正我学习的时候感觉写 Python 的程序有一种快感。Python 非常精简。本身的 API 封装得挺好,因此很多功能不需要我们重新造轮子,直接调用即可。再加上那么多成熟的库,用起来不要太开心。同样实现一个功能,用 C 语言,Java 或 C++ 往往要写很多行代码,Python 只需一行或者几行代码帮你搞定。Python 在 Tiobe 编程语言排行榜的最新一期榜单(2020 年 6 月)中已经位列第 3,仅次于 Java,C语言。虽说这个榜单不能涵盖全部,但也是编程界比较权威的榜单了。可以看出 Python 势头强劲。Python 是解释型语言,因此假如你要做些小测试,或者学习这门语言,将会非常省时间,因为不需要编译,直接解释就可以执行。比如我很喜欢的 Python 的 IDE(集成开发环境),由大名鼎鼎的 Jetbrains 出品的 PyCharm,就让写 Python 程序成了一种享受。Python 的可扩展性很好,开发者可以用 C 语言或者 C++ 编写 Python 的扩展模块,还能将 Python 嵌入到 C/C++ 程序中。著名的 Numpy 就是用 C语言写的。Python 的源代码写得不错。其源代码一开始是用 C 语言写的,Python 的作者使用中立的面向过程的 C 语言,实现了动态面向对象,使得 Python 具备灵活和优雅的特性。Python 的源代码也是值得学习的。推荐一本书,是中国人写的,叫《Python 源码剖析》,作者 陈儒,豆瓣评分 8.7。规范的代码。Python使用强制缩进来保证代码规范性,几乎不需要代码审查。以前学习 C++ 的时候,感觉真是挺难的,主要是 C++ 比较庞杂,东西太多,概念都能把你绕晕了,而且还要考虑指针和内存等等。很多写 C++ 的人其实并没有很好地掌握其精髓,写出来的程序往往非常丑陋,难以扩展和维护。 ...

June 17, 2020 · 1 min · jiezi

彻底弄懂为什么不能把栈上分配的数组字符串作为返回值

背景最近准备一个教程,案例的过程中准备了如下代码碎片,演示解析http scheme #include <stdio.h>#include <stdlib.h>#include <string.h>char *parse_scheme(const char *url){ char *p = strstr(url,"://"); return strndup(url,p-url);}int main(){ const char *url = "http://static.mengkang.net/upload/image/2019/0907/1567834464450406.png"; char *scheme = parse_scheme(url); printf("%s\n",scheme); free(scheme); return 0;}上面是通过strndup的方式,背后也依托了malloc,所以最后也需要free。有人在微信群私信parse_scheme能用char []来做返回值吗?我们知道栈上的数组也能用来存储字符串,那我们可以改写成下面这样吗? char *parse_scheme(const char *url){ char *p = strstr(url,"://"); long l = p - url + 1; char scheme[l]; strncpy(scheme, url, l-1); return scheme;}大多数人都知道不能这样写,因为返回的是栈上的地址,当从该函数返回之后,那段栈空间的操作权也释放了,当再次使用该地址的时候,值就是不确定的了。 那我们今天就一起探讨下出现这样情况的背后的真正原理。 基础预备每个函数运行的时候因为需要内存来存放函数参数以及局部变量等,需要给每个函数分配一段连续的内存,这段内存就叫做函数的栈帧(Stack Frame)。因为是一块连续的内存地址,所以叫帧;为什么叫要加一个栈呢?想必大家都熟悉了函数调用栈,为什么叫函数调用栈呢?比如下面的表达式 array_values(explode(",",file_get_contents(...)));函数的执行顺序是最内层的函数最先执行,然后依次返回执行外层的函数。所以函数的执行就是利用了栈的数据结构,所以就叫栈帧。 x86_64 cpu上的 rbp 寄存器存函数栈底地址,rsp 寄存器存函数栈顶地址。 实验#include <stdio.h>void foo(void){ int i; printf("%d\n", i); i = 666;}int main(void){ foo(); foo(); return 0;}$gcc -g 2.c$./a.out0666为什么第二次调用foo函数输出的结果都是上次函数调用的赋值呢?先看下反汇编之后的代码 ...

October 15, 2019 · 2 min · jiezi

5门前途美好的编程语言

作者 | Nick Kolakowski来源 | 涛哥聊Python前不久, Dice Insights(提供求职消息的技术职业消息服务的网站)研究了 TIOBE 和 RedMonk 的编程语言排名,以及自己网站的招聘信息数据库,得出了5门可能衰落的编程语言。 接着,Dice Insights再次公布了在未来几年使用量飙升的5门编程语言。这些结论是依靠强大的数据推断出来的,得出来的结果,有些是在意料之中,有些可能会让你大跌眼镜,我们一起来看看: 1、Swift 苹果想要把Objective-C淘汰,算起来,Objective-C已经有35年的历史了,一直被用于构建苹果生态系统的应用程序,而今苹果想用Swift替代Objective-C,Swift是苹果五年前发布的语言,根据分析公司RedMonk的长期语言排名,自创建以来,Swift的使用率迅速飙升,能够得到这样的反馈,苹果公司自然很满意。 话虽如此,想要真正淘汰Objective-C也不是那么简单的,这主要是因为在过去的35年里产生的大量遗留代码,但随着苹果打压力度不断加大,Objective-C迟早有一天还是会被淘汰,而Swift会真正成为为苹果应用程序提供动力的中坚力量,此外,苹果跨平台应用支持的计划会加速Swift的发展。 2、Kotlin Kotlin正在崛起,十年前,Kotlin只是俄罗斯的一个岛屿,而今,它还是一门编程语言,Kotlin之所以能一跃成名,都要归功于谷歌将其定义为Android 的“一级”开发语言。 可以说,通过选择Kotlin,谷歌减少了对Java的依赖,而且Java是谷歌和Oracle法律纠纷的原因所在,无论谷歌的律师们是否推动了公司对Kotlin的支持,我们都能看出,许多开发者都很喜欢这门编程语言,因为其灵活的特性。 早在2018年,Pusher就发起了一项开发者调查,数据显示,归功于Android,Kotlin的使用率正在爆发式增长,大部分开发者在他们的工作中或副业的项目中使用Kotlin编程,Pusher还补充道:说到Kotlin最受青睐的特性,大多数开发者表示Kotlin是安全的,80%的开发者喜欢null安全,其次是扩展函数,Java的简化互操作性和数据类。 但是换句话说,Kotlin似乎也没有别的发展空间了,因为这种编程语言很难扩展到Android生态系统之外,拓展到其他领域。 3、Python Python是门庞大的编程语言,被世界各地的开发人员广泛使用,根据TIOBE指数显示,Python的受欢迎程度不断在攀升,甚至对其他编程语言已经产生威胁,而且实际上,人们正不断发现Python的新用途 考虑到Python已经拥有强大的用户基础,而且它被广泛应用于大量的业务当中,因此,Python在短期内消亡的可能性微乎其微,唯一令人疑惑的是,这种编程语言能发展到何种程度,以及下一步它将占领哪些行业。 4、Groovy Groovy在TIOBE排名上的上升得益于广泛的IDE支持、与Java的相似性以及与流行的开源自动化服务器Jenkins的集成。它已经成为许多系统中的“编程语言粘合剂”,所以说,它的未来似乎很光明。 5、TypeScript 在这里,我们将Typescript也称之为编程语言,它是JavaScript的一个超集,一些开发人员认为它并不是一门“完整”的编程语言,因为它可以被转换成JavaScript 。 无论你如何定义它,在RedMonk和GitHub的月度报告上,对Typescript的评级都是快速增长,TIOBE也曾暗示TypeScript甚至开始蚕食JavaScript的市场份额。 不管你是否认为TypeScript是一个“全新改进的”JavaScript,都无法否认很多技术专家认为TypeScript在未来几年还有发展的空间。 以上就是Dice为大家总结出的5门未来前途大好的编程语言,你赞同么? 如果您是以下几种情况之一:1、想了解更多有关大数据分析、数据挖掘、机器学习、人工智能领域内容的好学者;2、职业遭遇瓶颈,想提升自己在数据分析或人工智能领域的硬件技能的在职人士;3、寻求新出路、新突破,有意向转行到数据分析行业或人工智能领域的求职人士;4、对未来摇摆不定,有兴趣想Python、数据分析、人工智能方向发展的在校大学生。可给我们私信留言,我们会在第一时间为您答疑解惑,提供专业而具体的建议! 也可以搜索进入我们的小程序,解锁更多新鲜资讯和优质内容,不要错过哟!

October 14, 2019 · 1 min · jiezi

IEEE-编程语言排行榜201909

9 月 6 日,IEEE Spectrum 更新了第六届顶级编程语言年度互动排名。今年 IEEE Spectrum 进行了重大改革,改变了一些基础指标并简化了排行榜界面。但基本思想和方法与去年仍然相同:将多个来源的数据结合起来,得出编程人员最感兴趣的编程语言。 和去年一样,Python 始终处于领先地位。Python 之所以这么受欢迎,很大程度上是因为存在大量可用的专用库的驱动,特别是在人工智能领域,Keras 库是深度学习开发人员中的重量级人物:Keras 提供了 TensorFlow,CNTK,和 Theano 深度学习框架和工具包。当然,深度学习也不是 Python 的唯一应用方向。 接下来是 Java,C 和 C ++,这三种语言不相上下,尽管 IEEE 调整了指标,但这些竞争者和 Python 之间的距离仍在扩大,C++ 落后 Python 12.5分。(在所有给定的排名中,排名最高的语言为 100 分,排名较低的语言分数以头名为标准依次递减。)数字运算语言 R 排在第五位。尽管 R 语言专业性较高,但由于大数据越来越多,所以近年来它一直很流行。 在前 10 名中,由 MathWorks 开发并用于数值计算的专用语言 Matlab 的出现有些出乎预料,但它只是反映了该语言在硬件工程中的突出地位,特别是那些对通过 MathWorks 的图形化 Simulink 软件包运行模拟或创建控制系统的人。 在前 10 名之下,还有一些值得注意的语言,包括排在 11 位的 Arduino 和 第 12 位的 HTML/CSS。在前几年,一些读者抱怨说两者都不应出现在编程语言列表中。“Arduino”实际上是语言运行的一系列硬件平台的名称,而这种语言应该被称为 Wiring(有时候也被称为 C 或 C++)。在这方面,IEEE 以简单的实用主义为导向:当面对编程问题时,绝大多数 Arduino 开发人员使用诸如“Arduino Code for ...”之类的术语在 Google 进行搜索 —— 而不是使用其他的方法。通过选择更为常用的名字,IEEE 在很大程度上避免了 Arduino 和类似的微控制器上很多内容未被统计的情况。 ...

September 9, 2019 · 1 min · jiezi

Spark内置图像数据源初探

作者:林武康,花名知瑕, 阿里巴巴计算平台事业部EMR团队的高级开发工程师,Apache HUE Contributor, 参与了多个开源项目的研发工作,对于分布式系统设计应用有较丰富的经验,目前主要专注于EMR数据开发相关的产品的研发工作。 概述在Apache Spark 2.4中引入了一个新的内置数据源, 图像数据源.用户可以通过DataFrame API加载指定目录的中图像文件,生成一个DataFrame对象.通过该DataFrame对象,用户可以对图像数据进行简单的处理,然后使用MLlib进行特定的训练和分类计算.本文将介绍图像数据源的实现细节和使用方法. 简单使用先通过一个例子来简单的了解下图像数据源使用方法. 本例设定有一组图像文件存放在阿里云的OSS上, 需要对这组图像加水印,并压缩存储到parquet文件中. 废话不说,先上代码: def main(args: Array[String]): Unit = { val conf = new SparkConf().setMaster("local[*]") val spark = SparkSession.builder() .config(conf) .getOrCreate() val imageDF = spark.read.format("image").load("oss://<bucket>/path/to/src/dir") imageDF.select("image.origin", "image.width", "image.height", "image.nChannels", "image.mode", "image.data") .map(row => { val origin = row.getAs[String]("origin") val width = row.getAs[Int]("width") val height = row.getAs[Int]("height") val mode = row.getAs[Int]("mode") val nChannels = row.getAs[Int]("nChannels") val data = row.getAs[Array[Byte]]("data") Row(Row(origin, height, width, nChannels, mode, markWithText(width, height, BufferedImage.TYPE_3BYTE_BGR, data, "EMR"))) }).write.format("parquet").save("oss://<bucket>/path/to/dst/dir") } def markWithText(width: Int, height: Int, imageType: Int, data: Array[Byte], text: String): Array[Byte] = { val image = new BufferedImage(width, height, imageType) val raster = image.getData.asInstanceOf[WritableRaster] val pixels = data.map(_.toInt) raster.setPixels(0, 0, width, height, pixels) image.setData(raster) val buffImg = new BufferedImage(width, height, imageType) val g = buffImg.createGraphics g.drawImage(image, 0, 0, null) g.setColor(Color.red) g.setFont(new Font("宋体", Font.BOLD, 30)) g.drawString(text, width/2, height/2) g.dispose() val buffer = new ByteArrayOutputStream ImageIO.write(buffImg, "JPG", buffer) buffer.toByteArray }从生成的parquet文件中抽取一条图像二进制数据,保存为本地jpg,效果如下: ...

June 27, 2019 · 3 min · jiezi

编程语言王国的唯一王者

在撰写本文前,我搜索了“我应该学习哪种编程语言”这个词条,发现会产生5.17亿个结果。而每个页面都在滔滔不绝地介绍某种语言相对于其他语言的优势,其中90%会推荐Python或JavaScript。 恕我直言,我并不认同这5.17亿个搜索结果,并建议你最应该学习的第一种编程语言——逻辑。 知道如何编写代码已经不再是一种优势了。市场上充斥着各种培训机构、学习班培训出来的人员,“初级软件开发人员”的职位已经不复存在。要想在今天的市场上取得成功,你不但需要知道如何编码,并且还需要学会运用逻辑思维模式。 1.我的第一节计算机科学课我第一次接触“计算机科学”是在我十年级的选修课。上课第一天,我欣喜地看到我面前有各种各样的冰淇淋和各种圣代配料。在我们都坐下之后,我的老师宣布: “今天,我们要制作圣代。有一个条件:你必须写一份关于如何准备圣代的具体说明,然后我就会照着做。” 当然没问题,我想,这简直是一件轻而易举的事儿。然后在不到一分钟的时间里,我就草草记下了一套“完美”的圣代制作指南: 然后,我的“老师”(嗯,我愿意用这个可爱的比喻称呼我电脑)做出了我所见过的最准确的讽刺表演——她开始恶狠狠地戳冰淇淋盒盖,但无法穿透它坚硬的外表。 “好吧,首先取下盖子,”我说,仿佛急切地想要享受一顿美食。 “你没有向我提供那些指示,所以,很不幸,没能给你做一个圣代,下一个!” 2.快进到#2号尝试 这次我确信我有打开盒盖这个条件了。我甚至在添加每个项目到我的杰作前,就已经确保它们都被打开了。 她打开盖子,舀了三勺黑莓冰淇淋,把它们放进碗里。从这一步看,起码我的新生圣代开始诞生了。 紧接着,她打开热巧克力,把两个汤匙放入我的碗里。不是两汤匙的热巧克力,请注意——是两个现实中的汤匙,没有热巧克力。 看起来我又一次没做到给予足够具体的指令! 当全部都完成之后,我得到了一碗冰淇淋,上面放着两个金属勺子、一坨鲜奶油和大约300片糖屑。 到这个时候,我终于明白了:计算机是一个纯粹的逻辑实体。它没有上下文,也没有假设。它对一组非常具体的指令做出响应,并最终在Terminal中运行。 我最终制定的冗长却必要的圣代制作指南: 最后一个步骤非常重要,因为如果没有这个步骤她将会开始吃掉我的圣代。 这就是计算机编程的现实情景。请为计算机提供密集的详细指令集。本质上来说,这就是所有编程语言分解成的指令。 3.软件开发职业道路软件开发现在已经到了不能作为一个单独的行业来讨论的地步,就像“软件开发人员”这个职位名称太宽泛一样。两名开发人员在拥有不连贯的技能集的情况下可以看作是具有相同市场竞争力,这意味着在开发中,职业生涯不仅仅是取决于编码的能力。熟练的开发人员拥有一种与编程无关的通用属性——逻辑。 最好的开发者是批判性思维的专家。这是至关重要的,因为大多数软件项目都是没有文档记录的、支离破碎的灾难。它们需要一个批判性的思考者来拼凑信息,并在需要的时候填补空白。落后的开发者是那些不能将这些点连接起来的开发人员。 所有这一切都归结于另一个大胆的声明: 计算机科学的基本原理对于编码能力是至关重要的,而且将永远是至关重要的。 流行语言随潮流而变化。框架变得过时,企业通过混合技术来应对不断变化的需求。唯一不变的是什么?基本原理——这就是他们的定义! 4.如何提高逻辑思维对于那些无法深入思考的人来说,请考虑使用这些工具来提高您的编程批判性思维: 了解您的运行时间复杂度 程序的运行时间复杂度也称为Big-O ,可以表示为在任何实例上执行的与输入大小(n)相关的步骤的数量。首先,请始终监视您的程序的运行时间。 了解您的数据结构 数据结构是每个复杂程序的核心。知道在什么场景中使用哪种结构本身就是一门艺术。数据结构与运行时间复杂度直接相关,因为选择错误的结构会使程序陷入停顿。数组查找是 O(n) ,这意味着随着输入的大小增加,使用数组的开销也会增加。散列查找O(1),因此无论所述散列中的键数是多少,散列键的查找时间都将是恒定的。 我曾经有一些候选人认为数组的搜索时间比散列更快。这就是一个警告我不要雇佣他们的直接信号——因此,请了解你的数据结构。 读/看/听 像Udemy,Pluralsight和CodeAcademy等网站是学习一门新的编程语言的绝佳资源。要了解基础知识,请参阅有关通用工程概念、最佳实践和编码风格的书籍。工程师们最强烈推荐的书籍是《Design Patterns》,《Refactoring, Code Complete, Clean Code》, 和 《The Pragmatic Programmer》等。最后,每个工程师都应该在他们的办公桌上保留一份《Introduction to Algorithms》,并妥善保存。 实践! 不曾疯狂练习拉小提琴,就不可能成为一名小提琴大师。像HackerRank,CodeWars,CoderByte,TopCoder和LeetCode这样的网站上有成千上万个挑战问题,旨在测试您对数据结构和算法的了解。我发现使用这些网站的最佳方法是自己尝试解决问题,并将解决方案放在Github上,然后查看该问题的顶级解决方案,看看其他人是如何解决的。这就引出了我的最后一点建议: 查看其他人的代码 在软件开发过程中,您可能犯的最大错误就是单独行动。软件开发在很大程度上是一项众包工作。我们一起建立标准,一起犯错误,并随着时间的推移(通过多次失败)来学习什么是有效的。花时间阅读熟练的开发人员的代码总是有回报的。只要确保它是好的代码。 我能给你留下的最好建议就是永远不要为你所知道的事情感到羞耻。正如我所提到的,这个行业规模庞大,有着庞大到可怕的语言,内容密集。需要花费大量的时间和精力来进行理解和学习。获得熟练则需要更多的努力,并且需要花费更多的精力来达到精通。 当我到达那里时,我会告诉你的。 扫码关注京东云开发者社区,每天都有精彩行业信息哦!

June 25, 2019 · 1 min · jiezi

编程语言Python-的参数传递返回值浅拷贝深拷贝

作者:LogM 本文原载于 https://segmentfault.com/u/logm/articles ,不允许转载~ 1. Python 的参数传递Python的参数传递,无法控制引用传递还是值传递。对于不可变对象(数字、字符、元组等)的参数,更类似值传递;对于可变对象(列表、字典等),更类似引用传递。 def fun1(n): print(n) # n在没修改前,指向的地址和main函数中n指向的地址相同 n = 20 # n在修改后,指向的地址发生改变,相当于新建了一个值为20的参数ndef fun2(l): print(l) # l在没修改前,指向的地址和main函数中l指向的地址相同 l = [5,6,7,8,9] # l在修改后,指向的地址和main函数中l指向的地址仍相同,此时main函数中l的值也会改变if __name__=="__main__": n = 10 l = [1,2,3,4,5] fun1(n) fun2(l) print(n) # n的值还是10 print(l) # l的值在fun2()中已经被改变2. Python 的返回值Python的返回值,无法控制引用传递还是值传递。对于不可变对象(数字、字符、元组等)的参数,更类似值传递;对于可变对象(列表、字典等),更类似引用传递。 str1 = 'hi'l1 = [1,2,3,4,5]def fun1(): return str1def fun2(): return l1str2 = fun1() # 此时,str1 和 str2 的指向地址是相同的str2 = 'hello' # 修改后,str2 指向的地址发生改变,相当于新建了一个值为`hello`的变量l2 = fun2() # 此时,l1 和 l2 的指向地址是相同的l2 = [6,7,8,9] # 修改后,l2 指向的地址仍相同,修改 l2 会影响到 l13. Python 的浅拷贝和深拷贝对于不可变对象(数字、字符、元组等),直接赋值的结果和深拷贝一致;对于可变对象(列表、字典等),直接赋值、浅拷贝、深拷贝结果不同。 ...

June 23, 2019 · 1 min · jiezi

阿里云新品发布周刊第13期链路追踪-Tracing-Analysis-商业化首发

点击订阅新品发布会!新产品、新版本、新技术、新功能、价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布链路追踪 Tracing Analysis 商业化首发2019年6月12日15时,阿里云链路追踪 Tracing Analysis 商业化首发,全链路跟踪,成本是自建链路追踪系统的1/5或更少。支持多语言应用接入,支持开源生态。源自阿里巴巴内部的 EagleEye,帮助开发者快速分析和诊断分布式应用架构下的性能瓶颈。 查看产品 产品文档 阿里云生活物联网平台3.0发布2019年6月6日,阿里云生活物联网平台3.0发布,助力智能家电“中国造、全球卖”。在物联网行业蓬勃发展的大潮中,阿里云IoT致力于将物理世界数字化,构建了云端一体化的平台,为智能生活、智能工业、智慧城市等各行业提供助力。阿里云发布生活物联网平台(飞燕平台)3.0,为行业合作伙伴提供安全、稳定、高扩展、低成本的智能生活解决方案,同时还将通过阿里云的全球化部署助力中国企业出海,共同打造物联网的生态。 查看产品 产品文档 视频地址:https://yunqivedio.alicdn.com... 产品动态新功能:性能测试 - SLA定义支持服务端指标发布。 查看产品 查看文档 通过SLA管理中的SLA规则设置,特别是本次发布的ECS/RDS/SLB三款产品的个性化指标的异常条件设置(比如SLB的丢弃连接数的最大值)来及时提示压测中的异常及马上停止压测的操作。SLA推出服务端(ECS/RDS/SLB)指标的集成和设置能力,方便设置服务端的异常边界指标以便及时报警和停止压测。新功能:DataV数据可视化 - DataV节点编程功能发布。 查看产品 查看文档 通过节点编程功能,可以实现组件之间的事件和动作,开发出具有复杂交互的可视化应用,极大的扩大了DataV的适用场景和边界独立的节点式编程界面,可以通过拖拽的方式,实现组件之间的事件和动作配置,只需要编写少量的代码。并提供日志监测工具,帮助用户监控开发过程中各组件和事件的运行状况体验优化:云数据库 POLARDB - 云数据库 POLARDB 白名单分组功能发布。 查看产品 POLARDB支持创建最多50个IP 白名单分组,便于管理不同的访问源体验优化:云解析 PrivateZone - PrivateZone提升DNS查询性能上限。 查看产品 PrivateZone提升DNS查询性能上限,取消同一VPC每秒5万次DNS查询限制、每台ECS域名查询上限提升至5000次/秒。体验优化:短信服务 - 短信服务概览页入口优化。 查看产品 优化整个概览页页面,界面结构更加清晰,提升用户使用体验和操作效率增加国内消息的监控和告警信息增加快捷操作入口,帮助客户可以快速的定位签名、模板等产品功能最新发布:2019年6月5日15时,阿里云DataV专业版全新上线,搭载节点式编程功能,可实现更灵活的数据与页面交互配置。此外,该版本还加入了子账号独立工作空间管理、高级数据交互组件包、组件自定义开发等功能,适合高灵活性、高定制化场景的数据可视化应用制作。 查看产品 产品文档 技术解读1、阿里云DataV专业版发布,为可视化创造更多可能!2、威胁快报|挖矿团伙8220进化,rootkit挖矿趋势兴起3、Istio on ACK集成生态(1): 集成TSDB助力可观测性存储!4、如何利用边缘计算,实现低延时、高质量的互动课堂体验? 你优秀,你来说!高可用系统的全链路追踪成难题?看看这款黑科技吧! 点击订阅! 本文作者:云攻略小攻原文链接  本文为云栖社区原创内容,未经允许不得转载。

June 12, 2019 · 1 min · jiezi

阿里云新品发布周刊第12期

点击订阅新品发布会!新产品、新版本、新技术、新功能、价格调整,评论在下方,下期更新!关注更多内容,了解更多 最新发布DataV专业版 重磅发布会2019年6月5日15时,阿里云DataV专业版全新上线,搭载节点式编程功能,可实现更灵活的数据与页面交互配置。此外,该版本还加入了子账号独立工作空间管理、高级数据交互组件包、组件自定义开发等功能,适合高灵活性、高定制化场景的数据可视化应用制作。 查看产品 产品文档 阿里云容器服务ACK 升级亮相2019年5月30日,阿里云容器服务ACK升级发布,全力保护全球百万级容器的运行安全,国内唯一进入Gartner竞争格局的公有云容器平台。依托超高性能的企业级容器运行平台,实现面向应用的异构资源统一管理。值得一提,其Terway网络插件相比社区方案性能优化20%。 查看产品 产品文档 视频地址:https://yunqivedio.alicdn.com... 产品动态新产品:数据库专家服务 - 数据库专家服务公测。 查看产品 以工具与数据库专业技能结合的方式,给客户提供云数据库产品本身能力范围之外的专业的数据库专家服务,主要包括:紧急救援,健康诊断,性能调优,护航保障,Oracle迁移等服务;可应用于在使用数据库时,由于误操作等行为导致了数据库不可访问、或者数据丢失等情况;随着业务的不断增长,数据库变的越来越慢,阻碍了你业务的进一步发展;业务做活动大促,而又担心数据库的稳定性影响大促活动的开展;打算脱离Oracle而尝试其他类型的数据库。新地域/可用区:弹性公网IP - EIP绑定弹性网卡支持多EIP网卡可见模式。 查看产品 查看文档 开放区域:华北2(北京)、华北3(张家口)、新加坡、德国(法兰克福)、印度(孟买)新地域/可用区:DDoS高防IP - 新BGP高防新增华南电信清洗节点。 查看产品 查看文档 开放区域:华南电信新功能:Web应用防火墙 - ACL功能优化。 查看产品 查看文档 支持同一个ACL规则中添加多个IP或者IP地址段。新功能:CDN - 阿里云CDN支持Brotli压缩。 查看产品 查看文档 Brotli是开源的一种新型压缩算法。开启该功能后,下载性能会比Gzip性能提升约15~25%。最新发布:2019年5月29日15时,阿里云云数据库 MySQL 8.0 重磅发布,2倍以上性能提升,SQL窗口函数、JSON扩展语法等企业级新功能震撼上市!主要从技术层面介绍MySQL 8.0的优势和与过去版本对比。从MySQL社区的发展和阿里云对于开源社区贡献的一贯态度进行阐述,表明阿里云一直以来对于开源的支持和贡献,并基于此次8.0的发布,重申对于开源的贡献和影响。阐述产品和商业规划角度阐述本次发布的MySQL 8.0的意义,并且阐述RDS MySQL8.0的产品形态和未来产品发展的构想。 查看产品 产品文档 技术解读1、为更强大而生的开源关系型数据库来了!阿里云RDS for MySQL 8.0 正式上线!2、MySQL 8.0 技术详解3、阿里PB级Kubernetes日志平台建设实践!4、什么是最佳的视频用户体验?阿里云视频体验优化实践之路5、基于大数据的舆情分析系统架构 - 架构篇6、达摩院首席数据库科学家李飞飞:云原生新战场,我们如何把握先机? 你优秀,你来说!【阿里云新品发布】DataV数据可视化专业版,为可视化创造更多可能 本文作者:云攻略小攻 原文链接  本文为云栖社区原创内容,未经允许不得转载。

June 6, 2019 · 1 min · jiezi

RustCon-Asia-实录-Rust-在国内某视频网站的应用

作者介绍:hawkingrei(王维真),中间件高级开发工程师,开源爱好者,TiDB & TiKV Contributor。WaySLOG(雪松),Rust 铁粉一枚,专注中间件,bug creator。 本文根据 hawkingrei & WaySLOG 在 首届 RustCon Asia 大会 上的演讲整理。 今天我们会和大家聊聊 Rust 在我们公司的二三事,包括在公司产品里面用的两个工具,以及雪松(WaySLOG)做的 Cache Proxy —— Aster 的一些经验。 <center>图 1</center> 十年前,我司刚刚成立,那时候其实很多人都喜欢用 PHP 等一些动态语言来支持自己的早期业务。用动态语言好处在于开发简单,速度快。但是动态语言对代码质量、开发的水平的要求不是很高。所以我来到公司以后的第一个任务就是把我们的 PHP 改写成 Golang 业务。在我看了当时 PHP 的代码以后的感受是:动态语言一时爽,代码重构火葬场。因为早期我司还是个人网站,PHP 代码质量比较差,代码比较随意,整套系统做在了一个单体的软件里,我们称这个软件是一个全家桶,所有的业务都堆在里面,比较恶心。所以导致早期我司的服务质量也是非常差,观众给我们公司一个绰号叫「小破站」。 但是随着规模越来越大,还上市了,如果还停留在「小破站」就十分不妥,因此我们开始用 Golang 对服务进行一些改进,包括开发一些微服务来稳定我们的业务。通过这些改造也获得了很好的一个效果,因为 Golang 本身非常简洁,是一个带 GC 的语言,同时还提供了 goroutine 和 channel 一些功能,可以很方便的实现异步操作。但随着业务规模变大,也出现了一些 Golang 无法支持的一些情况。于是,我们将目光转向了 Rust。 1. Remote CacheRemote Cache 是我们第一个 Rust 服务。该服务是我们公司内部的一套 Cache 服务。 在具体介绍这个服务之前,先介绍一下背景。首先在我们内部,我们的代码库并不像普通的一些公司一个项目一个库,我们是大仓库,按语言分类,把所有相同语言的一个业务代码放到一个仓库里,同时在里面还会封装一些同一种语言会用到的基础库,第三方的依赖放在一个库里面。这样所有的业务都放在一个仓库,导致整个仓库的体积非常巨大,编译也会花很多的时间,急需优化。 <center>图 2</center> 此时,我们用到了两个工具—— Bazel 和 Gradle,这两个编译工具自带了 Remote Cache 功能。比如你在一台机器上编译以后,然后换了台机器,你还可以重新利用到上次编译的一个中间结果继续编译,加快编译的速度。 ...

June 4, 2019 · 4 min · jiezi

MySQL-80-技术详解

MySQL 8.0 简介MySQL 5.7 到 8.0,Oracle 官方跳跃了 Major Version 版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上大步前行,全新 Data Dictionary 设计,支持 Atomic DDL,全新的版本升级策略,安全和账号管理加强,InnoDB 功能增强等,目前小版本已经 release 到 8.0.16,新的功能仍然在持续推出。RDS MySQL 8.0 产品是阿里云推出的 MySQL 系列云产品之一,使用完全兼容 MySQL 8.0 的阿 里云 AliSQL 8.0 分支,除了官方在 MySQL 8.0 推出的全新功能外,AliSQL 沉淀了许多在 Alibaba 集团电商业务和云上几十万客户在使用 MySQL 过程中遇到的问题和需求,以此来加固AliSQL, 提升 AliSQL 的性能和稳定性。下面分别对 MySQL 8.0 和 AliSQL 8.0 相关的版本和功能做简短的介绍: MySQL 8.0 版本更新1. 数据字典 MySQL 8.0 摒弃了 Server Layer 定义的 FRM 文件和其它非事务表,使用了一组 InnoDB 表来 保存数据字典,支持事务特性。 ...

May 30, 2019 · 2 min · jiezi

使用Python构建自定义新闻源

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:12min 要创建自定义新闻Feed模型,我们需要可以训练的数据。这些培训数据将被输入模型,以教它区分我们感兴趣的文章和我们不感兴趣的文章。 在本文中,我们将学习构建自定义新闻语料库并分别注释与兴趣相对应的大量文章。 创建受监督的训练数据集在我们在新闻文章中创建我们的品味模型之前,我们需要培训数据。这些培训数据将被输入我们的模型,以教它区分我们感兴趣的文章和我们不感兴趣的文章。要构建此语料库,我们需要注释大量符合这些兴趣的文章。对于每篇文章,我们将其标记为“y”或“n”。这将表明该文章是否是我们希望在我们的日常摘要中发送给我们的文章。 为简化此过程,我们将使用Pocket应用程序。Pocket是一个应用程序,允许您保存故事以供稍后阅读。您只需安装浏览器扩展,然后在希望保存故事时单击浏览器工具栏中的Pocket图标。该文章将保存到您的个人存储库中。Pocket的一个重要功能就是它的用途,能够使用您选择的标签保存文章。我们将使用此功能将有趣的文章标记为“y”,将非有趣的文章标记为“n”。 安装Pocket Chrome扩展程序我们在这里使用谷歌浏览器,但其他浏览器应该类似。对于Chrome,请进入Google App Store并查找“扩展”部分: 点击蓝色的添加到Chrome按钮。如果您已有帐户,请登录,如果您还没有帐户,请继续注册(免费)。完成后,您应该会在浏览器的右上角看到Pocket图标。它将显示为灰色,但是一旦有想要保存的文章,您可以单击它。保存文章后,它将变为红色,如下图所示。 右上角可以看到灰色图标。 单击图标时,它会变为红色,表示文章已保存。 开始保存您遇到的所有文章。用“y”标记有趣的标签,用“n”标记非有趣的标签。这将需要一些工作。你的最终结果只会和训练集一样好,所以你需要为数百篇文章做这件事。如果您在保存文章时忘记标记文章,则可以随时访问该网站http://www.get.pocket.com,在其中标记。 使用Pocket API检索故事既然您已经将文章保存到Pocket,那么下一步就是检索它们。为此,我们将使用Pocket API。您可以通过https:// ge tpocket.com/developer/apps/new注册一个帐户。单击左上角的“ 创建新应用程序 ”并填写详细信息以获取API密钥。确保单击所有权限,以便添加,更改和检索文章。 填写完成并提交后,您将收到您的消费者密钥。您可以在“ 我的应用”下的左上角找到此信息。这将看起来像下面的屏幕,但显然有一个真正的键: 设置完成后,您就可以继续下一步,即设置授权。它要求您输入您的使用者密钥和重定向URL。重定向网址可以是任何内容。在这里,我使用了我的Twitter帐户: import requestsauth_params = {'consumer_key': 'MY_CONSUMER_KEY', 'redirect_uri':'https://www.twitter.com/acombs'}tkn = requests.post('https://getpocket.com/v3/oauth/request',data=auth_params)tkn.content您将看到以下输出: 输出将包含下一步所需的代码。将以下内容放在浏览器栏中: https://getpocket.com/auth/au... ect_uri = https% 3A // www.twitter.com / acombs 如果您将重定向网址更改为您自己的网址,请确保对其进行网址编码。这有很多资源。一种选择是使用Python库urllib,另一种是使用免费的在线源。 此时,您应该看到授权屏幕。继续并批准它,我们可以继续下一步: ...

May 15, 2019 · 2 min · jiezi

程序员画像十年沉浮

十年,转瞬即逝,人生进入下半场。众生皆苦,万相本无。且看风云变幻,慢品苦辣酸甜。小姐姐味道微信公众号首发。小胡,拼搏者小胡很久没有笑过了。他在房价的次高点买了套超出自己承受能力的房子,紧接着老婆失业了,失业以后脾气变得特别的不好。他每天都下班很晚,最近终于鼓足勇气换了份离家近的工作,来省下每天的车费。他的技术很好,别人也是这么评价,但这次跳槽他并没有涨多少薪。心里乱乱的老觉得堵,家里环境太压抑,老母亲最近又和老婆掐了起来。他依然每天很晚下班,心烦了就工作。老板看在眼里,给他颁发了一个拼搏者奖杯。今天团建后他开车回家,天很晚,他把头顶在方向盘上呆了很久。推开车门,他静静伫立一刹,把一个包装袋随手扔进垃圾桶。里面是他刚得的奖杯。小苗,全栈培训讲师小苗很久之前就看透了it行业。别人要淘金,他偏要卖淘金的工具。在工作2年之后,通过被培训,他果断进入培训行业,一直到现在,还出了不少书。他可以算是一个全栈培训讲师,懂的东西多如牛毛,就是不深。“深了也没有用,简单才有市场。有能力自学的谁来培训呀”。小吴咧嘴一笑,他刚给自己镶上了金牙,灯光照耀下显得异常夺目。小包,BAT梦小包的学校不好,所以他很自卑,但还是有两把刷子的,所以业绩很好。他的大部分工作都是小公司经历,所以他觉得缺少点什么。随着年龄的增加,他觉得到了去大公司镀金的最后期限。但天不遂人愿,总有这样或者那样的事牵牵绊绊。准备了很多次面试,都不对口。他觉得在过去的这些公司,技术应该算是上等了,实在不明白这些BAT公司为什么死抠一些冷门而且明显用不着的技术。这些公司也贱,见到他这种小公司摸打滚爬的人,就像猫见了老鼠一样,想要尽情蹂躏一番,感受一下高高在上的感觉。“看来我只适合在小公司混啊”,小包回头按了下车钥匙,几米远的保时捷车灯亮了几下。小殷,佛学院的梦想对于一个不善言语的俗人来说,龙泉寺一直是小殷的一个梦想归宿,但这样的组织比Bat门槛还要高,要能力还要学历。小殷修了硕士,参读经书,在一个低很多档次的寺庙一呆就是五年,希望未来的某刻能结佛缘。“世人笑我太疯癫,我笑他人看不穿”。他昨天刚结婚,才休息2天,今天就要上班了。小刘,公司终结者“我干倒了这么多家公司”,每次小刘说到这里,都惨笑着伸出手,打着手势。这其中的背后意义,是小刘每次工作理想的破灭。哦,这当然是骗人的,因为每次都有赔偿金。他选的很准,每次想要弄点期权实现财务自由,可惜结果都不得愿。他的技术并不差,只是运气衰。面试填表的时候,在离职原因那一栏,他都不好意思下手,只能随意编几个说法。“我要认真准备”,小刘不怀好意的笑笑,“进阿里看看”。小姐姐味道微信公众号首发。小李,理想的路上“无论是干啥,哪怕是卖海鲜,都不会干这一行了”。小李每天都这么想。可工作太忙了,登上公司的电梯,行尸走肉般送到自己的座位,小李就开始了一天忙碌的生活。空闲时候,他喜欢逛知乎,看怎么快速赚钱的话题。回了家累的又什么都不想干,只好刷下抖音什么的。时间匆匆流过,每天他都想着单干,但第二天依然灰溜溜的穿衣上班。小李觉得,干这一行,就要了解自己的优势。他的优势就是技术,所以还得花时间学习一些烂七八糟的技术,那些叫做视野的东西。“我还没准备妥当”,他每次都这么安慰自己,“万无一失的时候我就自己干”。小万,互联网暴发户“风口、风口,都是风口”,小万笑呵呵的说,“我就是那头猪”。刚毕业,小万找工作就遇到不少的障碍。他只会两种语言的hello world。一个是c,一个是java。随着每次碰壁,小万的态度变的无所谓起来,他进了一个刚成立的小作坊,工作内容就是整理excel,只要饱自己就行。公司也实行过一些非人类的制度,但想到出去后还要找工作,就坚持了下来。没想到,公司在短短5年时间里就上市了,作为头部员工,他获得了不菲的回报。他的编程水平也有进步,现在会四门语言的hello world了。小江,坚持是无谓的等待小江终于明白了一个道理。如果你看好一家公司,就一直待下去,和它一直成长。苦也好,酸也罢,不亢不卑,不离不弃。得出这个结论,是因为小江前几家公司都上市了,前同事都分了不少。每次都在他离职后不久,而且是在经济好像要出现问题的时候。他的这家公司,据说也是独角兽。虽然从前年就有离职的打算,但还是咬牙坚持了下来。他要好好的待下去,套现,走人。但也会焦虑,和他一块来的小王,已经被劝退了,那点赔偿都不够塞牙缝的。“坚持就是胜利,我和它死磕到底”,小江用梳子打磨着自己脱发的前额,看着镜中的自己,说。小阮,收租快乐小阮找这份工作,完全是因为无聊。自从村里农改拆迁划入市区之后,他就辞职出去旅游了。最后见识到更加有钱的人的生活,认识到自己的差距后,也实在是玩腻了,就找了份工作打打牙祭。他花了很长时间,写了非常精美的微信小程序,开了个公众号,用来收租。房客想要租房,首先得关注他的公众号。同村的七大姑八大婶有了钱以后,基本上也不着家了,他就都揽过来,替他们打点、收租,仅收取部分管理费。“这群狗日的租客,老想着沾便宜”。他用力拍了下键盘,夹着的香烟烟灰四散,烫的小阮尖声叫骂。小姐姐味道微信公众号首发。小甄,奶爸小甄真是幸福,朋友们都这么说。小甄的老婆特别牛,但孩子没人带,所以他就辞职在家带娃。这一带就带了三年。他其实挺喜欢写代码的,但程序员工资还是低了点。比起天天在家带娃做饭,他还是比较怀念写代码。自从辞职后,他就只用python了,主要是做一些爬虫性的脚本,分析一些问题。他庆幸自己懂互联网,所以抖音的号也做起来了。作为一个男人,他最怕老婆有外遇,那样他就一无所有了,所以变着花样讨好老婆。但他还是有些担心,所以总是偷偷学python。“过几年我就去做人工智能”,小甄嘿嘿的笑起来。小冯,兔子的艺术企业大了,就要讲价值观。就像养狗一样,要有规矩。这时候,一些符合价值观,但没有能力的人,就上台表演了。小冯深谙职场潜规则,老板表演他拍照,老板群里发言他点赞,老板提要求他表决心,就是不干活。工作不就是crud么,他看的是编程之外的东西。兔子本来就是一种悠闲的生物,他只是想要自己的一颗胡萝卜而已。“我是马云眼中的兔子,是他们逼我这样的”。小冯对自己的定位直言不讳。小艾,自由职业者小艾实在是不喜欢天天挤着公交去上班的生活,所以他辞职,做了一个自由职业者。小公司做事,大公司做人,自由职业者做什么呢?他什么都做,哪里有钱,哪里就是他的靶子。股市火的时候,他炒股。比特币火的时候,他炒币。更多的是接一些不痛不痒的活儿,勉强度日。即使这样,也是基本收个首付款,尾款根本就回不来。最近他很焦躁。到处都在割韭菜,收入不增反减,他已经考虑再次打工了。“我是没认识到自己的能力和资源”,小艾不无感慨的说,“其他人做这一行,应该比我做的好”。小吴,工作+旅行有没有想过另外一种生活?每年换一个城市去工作,游览完毕后轻轻的走,不带走一片云彩。小吴就是这样,当他没钱花了,就去工作。大部分时间,他都在旅行。平均每一年,他就到一个美丽的城市落脚,去品味小城的故事。在这过程中,他选了几个比较好的城市,都购置了房产。去年为了还贷款,还变卖了一套。“爸爸”,有一天一个女人带着孩子费尽周折找到他。他头疼的很,而且感觉自己老了。接下来何去何从,他又一次产生了迷茫。哦,那是梦的感觉。小裴,职业经理人一步一步往上爬,最终成为职业经理人,是很多人的梦想。小裴很早就有这样的管理意识,他认识到自己的专业能力很容易遇到瓶颈,也认识到仅靠一己之力,并不能完成高大上的目标,所以他做的准备很早。他的努力的目标可能和大多数程序员的不同,他培养的是影响力。这些还不够,他还缺少经理人生涯中最重要的一环:有点说得过去的成绩。可他现在还没有,这也是他一直在这家中型公司一直待到现在的原因。努力不如借势,等公司名头响了,他就会更加值钱。“没有成绩,我比你们还要焦虑”。他有时掏心窝子和几个亲信说,但看着他们躲闪的眼神,他不认为有人能懂他。小宋,自己的事业公司管理,要向传销看齐。小宋悟道之后,就经常和人分享自己的高见。皇天不负有心人,经过多年的摸打滚爬,小宋终于找到了自己的事业。有了自己的商业模式之后,他就很少写代码了,但经常画图进行公司的架构设计。他现在非常痴迷一种画饼的技术,他的家里供着关公。这些二流子程序员完全不知道架构的最高境界就是架构组织和商业模式。小宋曲高和寡,经常有种高处不胜寒的感觉。”有些事情,你知道就好,千万不要讲出来“。他的好朋友劝他。朋友的身价已经很高了,这样的劝告很有价值,所以他最近收敛了很多。小丁,精彩的生活早晨6点钟,小丁一天的生活开始了。他喜欢跑步、登山、吉他、美食,就是不喜欢读书。小丁的每一天都安排的满满的,他不是科班出身,大学是学兽医的,鬼使神差的做了写代码的工作,主要还是因为工资高点。没办法,人聪明,编程需要的能力起点又低,小丁感觉这样的工作是为他量身定做的。“工作是配角,生活才是主角”。每次看到同事加班,小丁就忍不住劝阻。哦对了,老板马上就结婚了,他马上就可以正式的喊一声姐夫了。小汪,孤独的行者小汪的收入并不低,但他觉得很不幸福。高不成低不就的想法,养成了了目前单身还有点自卑的他。他本来就不喜欢捣鼓代码这份工作,最近项目老出乱子,经常被批,心理也越来越封闭。他下班时间不喜欢有人打扰,女孩子都不行。他养了三只猫,非常温顺。养猫不同于养狗,不用出去溜,他喜欢和它们呆在一起点个外卖醉生梦死的感觉。“这个问题我不知道”,小汪放下工作手机。猫咪脊背上毛发传来的柔软触感,让他舒服的眯起了眼睛。小祝,三线城市的希望小祝对爱情看的很重,所以他现在呆在这个三线城市中。鸟不拉屎说不上,起码还是有些禽类的。修电脑的,就是亲戚对他的认知。虽然在小地方,他可是有理想的,但一身本事只用了3成,就触碰到天花板了。过去几年,干倒了好几家公司,大多数是老板跑了。他现在正在琢磨动用关系,找点外包弄点外快什么的。“互联网红利该下沉一下到三四线城市了,机会是给有准备的人”,盯着大街墙壁上油漆未干的红标语,小祝依然充满希望。小郑,二线城市的焦虑“别飘了。你爸拖关系给你找了个工作“。距离母亲5年前给他打电话,小郑在现在的单位已经呆了4年了。活少不累,每天就是喝茶谈心。代码什么的他已经忘光了,但偶尔,他还会怀念起在帝都通宵调试代码的岁月,那激情澎湃的时光。“在哪混啊,都是为他人做嫁衣裳”。有时候,他凝视着夜空,不经意间还会深深的叹口气。主要还是混的不太好。小吴,国外技术专家幸亏当时走出国门。小吴每次想到这里,都会对自己翘起大拇指。他是典型的技术男,也不想走什么管理路线。随着自己的技术越来越精湛,研究的内容越来越深入,资历也越来越深。相比较起来,国内的同僚就落魄的多了。“现在,我可以干我喜欢的事情。或许等我老了,会回到我的家乡生活的“,小吴说,他在几年前就拿了绿卡。小雷,东南亚彩博小雷应该是走出国门里面最惨的那一批。当年,为了赚点快钱,他兴高采烈的接受了东南亚某公司的offer。结果,一封闭就是3年。在那里,他承受了超过国内三倍的工作强度,并且没有人身自由,心灵也受到了摧残。经过一系列努力,他终于在去年逃了出来,一分钱都没拿到。“现在,我真的能够坦然面对各种不平。世界上有很多灰暗地带,我只关心怎么去躲避“。 他直视着远方,他的眼睛非常有神。小关,赚钱的逻辑小关的父母都在新加坡,他每年都要飞去看望几次。在国内,他也算得上是留过学的高等人才了,当然走的是不同的路线。刚读了某名校的EMBA,然后找枪手出了几本专业的书籍。这么优秀,他还是非常的忙碌,每天只睡6小时。随着在几个大企业镀金完毕,他也顺利的注册了自己的公司。“越脏越臭的地方,机会越大“。父母想要他出国发展,他一句话就能说服。小孟,就喜欢外包比起其他程序员,小孟一直做外包,他喜欢这份工作。对于职场,他有自己的生存法则。他专找能够出差,而且补助高的工作,顺便游山玩水。他还兼职开了个网店,所以不能上网的封闭式环境他是不去的。车补、饭补、住宿,这些会搞的都是有油水的。他最看重的是每年能够连续休息一个月以上,想怎么happy就怎么happy。“赚那么多钱干什么啊,反正房子又买不起”,小孟甚至连房子都不租,他一直在出差。哦,他还喜欢去相亲,目的不是结婚的那种。小邬,心中的天平小邬算是这座城市的成功人士了。通过帮忙打理亲戚的一家公司,他的人生已经开挂,薪资是远高于其他同龄人的。自己的亲戚天天飞来飞去,一年也来不了几次。最近他学精了,招了个职业经理人前来帮忙,自己偷偷躲在办公室抱着电脑,不知道在捣鼓些啥。“我哪点不如他啊,不就是靠运气么”。某天醉酒后,他嘴里小声呢喃着。小顾,我爱996小顾的生活压力是比较大的,几乎是月光。他和妻子都是独子,双方父母多病,都没有短期死亡的迹象,不是贡献者没有退休金。更要命的是没和老婆控制好,生了3个娃。他在这家996的公司已经很长时间了,以至于他非常希望996合法化。他现在已经很少参与开发了,天天是一堆琐事,对外面的世界充满了恐惧。“我虽然已经财务自由了,但我还是不服输,我天天下班这么晚,就是想要为理想拼搏“。小顾每次开会,都要给下属打鸡血。服输俩字,出卖了他。小谢,羊毛党薅羊毛不犯法。在进局子之前,小谢也这么想,但没想到这次的动静这么大。有奖励的地方,就有利可图。小谢入这一行时间较早,从养号到变现,整个流程都颇为熟悉。这些年来,他都比较小心,虽然也有些被反薅的经历。但每个月,还是会为他带来不菲的收益。这次主要是太贪心,金额有点大,竟然也用了自己的支付宝账号,被别人顺藤摸瓜找到了。"我没觉得做错了什么,都是为了生活,我有什么错?“。小谢被拘留后很不服气。他正想着怎么做更隐秘的黑产。小孟,转产品技术转产品是非常容易的,还有不少优势。正因为这个理由,同时基于对代码的厌恶,小孟在三年前就转了产品。可他有硬伤。他不太喜欢和人交流,只会默默的在背后画原型图;被怼的时候,他会特别生气,以至于一整天的心情都不好;他觉得每天都被那么多繁琐的破事给牵绊,开会、交流、项目管理,真的很烦。“我的性格就不适合工作”,他把玩着手中的签字笔,“可我没这种命”。最近他在看javascript,他觉得前端应该会更简单一些。小高,一直走下坡路小高的职业路最近一直不顺,但十年前也曾达到过巅峰。想当年,他是所有同学里最风光无限的。回忆起他的第一次离职,他称为激流勇退。结果离职后,除了公司光环,啥都没有。他接着带着暴富的梦想去创业,接连黄了好几家。重回大公司的他,不得已只能做些普通的研发工作。最近更加凄惨,领导闲他的年龄大,性价比不高,正在慢慢孤立他。他研究孙子兵法,研究毛泽东理论,觉得是因为自己创业的几年把履历给弄坏了。“人生是场持久战,鹿死谁手未可知”。他咬了口手中的煎饼果子,咽下时能看到喉结的耸动。小崔,会跳的猿终于在这家公司干慢两年了。小崔舒了口气,他已经成功的挑战了自己。过去这十年,大多数时候,每隔半年就会跳糟一次,几乎没超过1年的,公司多的自己都不能够一口气说清。刚开始的时候,他傻不拉几全部都写上,结果简历厚厚的长长的吓人。后来,他才学会了合并这些经历,最近的这些工作找的就比较顺利。他从中得到不少好处,最明显的是薪资,翻了几翻。人又聪明,知识技能并没有拉下。“我就奇了怪了,他们看重的到底是能力还是经历”。小崔有时候会很纳闷。小关,专职割韭菜小关的技术是非常棒的,但他的薪资一般。因缘巧合,认识一个做区块链的老板,一拍即合。除了结婚,他从来没穿过西服。老板亲自带人来接,去照相馆照了张非常帅的照片,放在了公司官网上。他的眼睛炯炯有神,自信而有魅力,他是公司的CTO,是精英。但韭菜涨的有点慢,他就开直播,以技术的角度来解析区块链的好处。老板则以投资的角度讲解ICO的魅力。他好想吃一张喷香喷香的韭菜饼啊。“不赌一把,你都不知道自己的底线在哪里”。小关若有所思。小贝,上车容易下车难贝总,是大家对小贝的称呼。他们不知道,这称呼后所带的无奈。小贝是四年前到的这家公司。鉴于看好公司的发展模式,他技术入股,老板承诺了股份,但并没有签署任何协议。2年前,公司因财务紧张,在领导的忽悠下,他先后投入了200w资金,这部分老板倒是给他折合成书面股份了,但占比很小。每次和老板谈他的技术入股股份,老板都闪烁其词,他也不好追问。但看到网上越来越多的毁约,他的心头也有不少焦虑。他的履历并不算好,上市前老板透露有美化一下管理层的需求,他就更加担心。“我要离职,他起码得把200w资金的股份给我吧。况且,我们的交情...”小贝现在开始研究法律书籍了。小钟,猝死小钟兢兢业业的工作,他是最努力的那一个。公司有绩效机制,他想多赚点钱。楼下是地铁,公司楼下也是,直通的那种。他已经好几个月没见过太阳了。有一天晚上公司出了生产事故,他的手机叮叮叮响个不停,但他再也没有起床。死在了家里,据说是猝死。“公司压榨员工,必须给出合理的赔偿”!,小钟的爱人双眼欲泪,旁边小推车里躺着他们一岁的儿子,好奇的看着这个世界。前几天,他还刚给儿子买了《少儿学编程》系列,这是他最后的期望。END人生的目的从来不是享受,也不是承受,而是体验。你的每一次选择,都有自己的理由。你的每一个理由,都会让你热泪盈眶。 分享本人13年Java开发经验及产品研发经验,BAT背景,曾在多家知名企业担任技术总监、企业方案选型首席顾问,先后从事内核开发、大型Java系统架构设计和物联网系统架构设计开发,精通复杂业务技术方案选型、架构、核心难点攻关,对于java语言及项目有非常深入的理解和丰富的实操经验,热爱前沿技术,乐于进行技术分享与技术探讨。本人13年Java开发经验及产品研发经验,BAT背景,曾在多家知名企业担任技术总监、企业方案选型首席顾问,先后从事内核开发、大型Java系统架构设计和物联网系统架构设计开发,精通复杂业务技术方案选型、架构、核心难点攻关,对于java语言及项目有非常深入的理解和丰富的实操经验,热爱前沿技术,乐于进行技术分享与技术探讨。

May 15, 2019 · 1 min · jiezi

现代IM系统中的消息系统架构-架构篇

前言 IM全称是『Instant Messaging』,中文名是即时通讯。在这个高度信息化的移动互联网时代,生活中IM类产品已经成为必备品,比较有名的如钉钉、微信、QQ等以IM为核心功能的产品。当然目前微信已经成长为一个生态型产品,但其核心功能还是IM。还有一些非以IM系统为核心的应用,最典型的如一些在线游戏、社交应用,IM也是其重要的功能模块。可以说,IM系统已经是任何一个带有社交属性的应用需要具备的基础功能,网络上对于这类系统的设计与实现的讨论也越来越多。 IM系统在互联网初期即存在,其基础技术架构在这十几年的发展中更新迭代多次,从早期的CS、P2P架构,到现在后台已经演变为一个复杂的分布式系统,涉及移动端、网络通信、协议、安全、存储和搜索等技术的方方面面。IM系统中最核心的部分是消息系统,消息系统中最核心的功能是消息的同步、存储和检索: 消息的同步:将消息完整的、快速的从发送方传递到接收方,就是消息的同步。消息同步系统最重要的衡量指标就是消息传递的实时性、完整性以及能支撑的消息规模。从功能上来说,一般至少要支持在线和离线推送,高级的IM系统还支持『多端同步』。消息的存储:消息存储即消息的持久化保存,传统消息系统通常只能支持消息在接收端的本地存储,数据基本不具备可靠性。现代消息系统能支持消息在服务端的在线存储,功能上对应的就是『消息漫游』,消息漫游的好处是可以实现账号在任意端登陆查看所有历史消息。消息的检索:消息一般是文本,所以支持全文检索也是必备的能力之一。传统消息系统通常来说也是只能支持消息的本地检索,基于本地存储的消息数据来构建。而现在消息系统在能支持消息的在线存储后,也具备了消息的『在线检索』能力。本篇文章内容主要涉及IM系统中的消息系统架构,会介绍一种基于阿里云表格存储Tablestore的Timeline模型构建的消息系统。基于Tablestore Timeline构建的现代消息系统,能够同时支持消息系统的众多高级特性,包括『多端同步』、『消息漫游』和『在线检索』。在性能和规模上,能够做到全量消息云端存储和索引,百万TPS写入以及毫秒级延迟的消息同步和检索能力。 之后我们会继续发表两篇文章,来更详细介绍Tablestore Timeline模型概念及使用: 模型篇:详细介绍Tablestore Timeline模型的基本概念和基础数据结构,并结合IM系统进行基本的建模。实现篇:会基于Tablestore Timeline实现一个具备『多端同步』、『消息漫游』和『在线检索』这些高级功能的简易IM系统,并共享我们的源代码。传统架构 vs 现代架构 传统架构下,消息是先同步后存储。对于在线的用户,消息会直接实时同步到在线的接收方,消息同步成功后,并不会在服务端持久化。而对于离线的用户或者消息无法实时同步成功时,消息会持久化到离线库,当接收方重新连接后,会从离线库拉取所有未读消息。当离线库中的消息成功同步到接收方后,消息会从离线库中删除。传统的消息系统,服务端的主要工作是维护发送方和接收方的连接状态,并提供在线消息同步和离线消息缓存的能力,保证消息一定能够从发送方传递到接收方。服务端不会对消息进行持久化,所以也无法支持消息漫游。消息的持久化存储及索引同样只能在接收端本地实现,数据可靠性极低。 现代架构下,消息是先存储后同步。先存储后同步的好处是,如果接收方确认接收到了消息,那这条消息一定是已经在云端保存了。并且消息会有两个库来保存,一个是消息存储库,用于全量保存所有会话的消息,主要用于支持消息漫游。另一个是消息同步库,主要用于接收方的多端同步。消息从发送方发出后,经过服务端转发,服务端会先将消息保存到消息存储库,后保存到消息同步库。完成消息的持久化保存后,对于在线的接收方,会直接选择在线推送。但在线推送并不是一个必须路径,只是一个更优的消息传递路径。对于在线推送失败或者离线的接收方,会有另外一个统一的消息同步方式。接收方会主动的向服务端拉取所有未同步消息,但接收方何时来同步以及会在哪些端来同步消息对服务端来说是未知的,所以要求服务端必须保存所有需要同步到接收方的消息,这是消息同步库的主要作用。对于新的同步设备,会有消息漫游的需求,这是消息存储库的主要作用,在消息存储库中,可以拉取任意会话的全量历史消息。消息检索的实现依赖于对消息存储库内消息的索引,通常是一个近实时(NRT,near real time)的索引构建过程,这个索引同样是在线的。 以上就是传统架构和现代架构的一个简单的对比,现代架构上整个消息的同步、存储和索引流程,并没有变复杂太多。现代架构的实现本质上是把传统架构内本地存储和索引都搬到云上,最大挑战是需要集中管理全量消息的存储和索引,带来的好处是能实现多端同步、消息漫游以及在线检索。可以看到现代架构中最核心的就是两个消息库『消息同步库』和『消息存储库』,以及对『消息存储库』的『消息索引』的实现,接下来我们逐步拆解这几个核心的设计和实现。 基础模型 在深入讲解消息系统的设计和实现之前,需要对消息系统内的几个基本概念和基础模型有一个理解。网上分析的很多的不同类型的消息系统实现,实现差异上主要在消息同步和存储的方案上,在消息的数据模型上其实有很大的共性。围绕数据同步模型的讨论主要在『读扩散』、『写扩散』和『混合模式』这三种方案,目前还没有更多的选择。而对于数据模型的抽象,还没有一个标准的定义。 本章节会介绍下表格存储Tablestore提出的Timeline模型,这是一个对消息系统内消息模型的一个抽象,能简化和更好的让开发者理解消息系统内的消息同步和存储模型,基于此模型我们会再深入探讨消息的同步和存储的选择和实现。 Timeline模型 Timeline是一个对消息抽象的逻辑模型,该模型会帮助我们简化对消息同步和存储模型的理解,而消息同步库和存储库的设计和实现也是围绕Timeline的特性和需求来展开。 如图是Timeline模型的一个抽象表述,Timeline可以简单理解为是一个消息队列,但这个消息队列有如下特性: 每条消息对应一个顺序ID:每个消息拥有一个唯一的顺序ID(SequenceId),队列消息按SequenceId排序。新消息写入能自动分配递增的顺序ID,保证永远插入队尾:Timeline中是根据同步位点也就是顺序ID来同步消息,所以需要保证新写入的消息数据的顺序ID绝对不能比已同步的消息的顺序ID还小,否则会导致数据漏同步,所以需要支持对新写入的数据自动分配比当前已存储的所有消息的顺序ID更大的顺序ID。新消息写入也能自定义顺序ID,满足自定义排序需求:上面提到的自动分配顺序ID,主要是为了满足消息同步的需求,消息同步要求消息是根据『已同步』或是『已写入』的顺序来排序。而消息的存储,通常要求消息能根据会话顺序来排序,会话顺序通常由端的会话来决定,而不是服务端的同步顺序来定,这是两种顺序要求。支持根据顺序ID的随机定位:可根据SequenceId随机定位到Timeline中的某个位置,从这个位置开始正序或逆序的读取消息,也可支持读取指定顺序ID的某条消息。支持对消息的自定义索引:消息体内数据根据业务不同会包含不同的字段,Timeline需要支持对不同字段的自定义索引,来支持对消息内容的全文索引,或者是任意字段的灵活条件组合查询。消息同步可以基于Timeline很简单的实现,图中的例子中,消息发送方是A,消息接收方是B,同时B存在多个接收端,分别是B1、B2和B3。A向B发送消息,消息需要同步到B的多个端,待同步的消息通过一个Timeline来进行交换。A向B发送的所有消息,都会保存在这个Timeline中,B的每个接收端都是独立的从这个Timeline中拉取消息。每个接收端同步完毕后,都会在本地记录下最新同步到的消息的SequenceId,即最新的一个位点,作为下次消息同步的起始位点。服务端不会保存各个端的同步状态,各个端均可以在任意时间从任意点开始拉取消息。 消息存储也是基于Timeline实现,和消息同步唯一的区别是,消息存储要求服务端能够对Timeline内的所有数据进行持久化,并且消息采用会话顺序来保存,需要自定义顺序ID。 消息检索基于Timeline提供的消息索引来实现,能支持比较灵活的多字段索引,根据业务的不同可有自由度较高的定制。 消息存储模型 如图是基于Timeline的消息存储模型,消息存储要求每个会话都对应一个独立的Timeline。如图例子所示,A与B/C/D/E/F均发生了会话,每个会话对应一个独立的Timeline,每个Timeline内存有这个会话中的所有消息,消息根据会话顺序排序,服务端会对每个Timeline进行持久化存储,也就拥有了消息漫游的能力。 消息同步模型 消息同步模型会比消息存储模型稍复杂一些,消息的同步一般有读扩散(也叫拉模式)和写扩散(也叫推模式)两种不同的方式,分别对应不同的Timeline物理模型。 如图是读扩散和写扩散两种不同同步模式下对应的不同的Timeline模型,按图中的示例,A作为消息接收者,其与B/C/D/E/F发生了会话,每个会话中的新的消息都需要同步到A的某个端,看下读扩散和写扩散两种模式下消息如何做同步。 读扩散:消息存储模型中,每个会话的Timeline中保存了这个会话的全量消息。读扩散的消息同步模式下,每个会话中产生的新的消息,只需要写一次到其用于存储的Timeline中,接收端从这个Timeline中拉取新的消息。优点是消息只需要写一次,相比写扩散的模式,能够大大降低消息写入次数,特别是在群消息这种场景下。但其缺点也比较明显,接收端去同步消息的逻辑会相对复杂和低效。接收端需要对每个会话都拉取一次才能获取全部消息,读被大大的放大,并且会产生很多无效的读,因为并不是每个会话都会有新消息产生。写扩散:写扩散的消息同步模式,需要有一个额外的Timeline来专门用于消息同步,通常是每个接收端都会拥有一个独立的同步Timeline(或者叫收件箱),用于存放需要向这个接收端同步的所有消息。每个会话中的消息,会产生多次写,除了写入用于消息存储的会话Timeline,还需要写入需要同步到的接收端的同步Timeline。在个人与个人的会话中,消息会被额外写两次,除了写入这个会话的存储Timeline,还需要写入参与这个会话的两个接收者的同步Timeline。而在群这个场景下,写入会被更加的放大,如果这个群拥有N个参与者,那每条消息都需要额外的写N次。写扩散同步模式的优点是,在接收端消息同步逻辑会非常简单,只需要从其同步Timeline中读取一次即可,大大降低了消息同步所需的读的压力。其缺点就是消息写入会被放大,特别是针对群这种场景。Timeline模型不会对选择读扩散还是写扩散做约束,而是能同时支持两种模式,因为本质上两种模式的逻辑数据模型并无差别,只是消息数据是用一个Timeline来支持多端读还是复制到多个Timeline来支持多端读的问题。针对IM这种应用场景,消息系统通常会选择写扩散这种消息同步模式。IM场景下,一条消息只会产生一次,但是会被读取多次,是典型的读多写少的场景,消息的读写比例大概是10:1。若使用读扩散同步模式,整个系统的读写比例会被放大到100:1。一个优化的好的系统,必须从设计上去平衡这种读写压力,避免读或写任意一维触碰到天花板。所以IM系统这类场景下,通常会应用写扩散这种同步模式,来平衡读和写,将100:1的读写比例平衡到30:30。当然写扩散这种同步模式,还需要处理一些极端场景,例如万人大群。针对这种极端写扩散的场景,会退化到使用读扩散。一个简单的IM系统,通常会在产品层面限制这种大群的存在,而对于一个高级的IM系统,会采用读写扩散混合的同步模式,来满足这类产品的需求。采用混合模式,会根据数据的不同类型和不同的读写负载,来决定用写扩散还是读扩散。 典型架构设计 如图是一个典型的消息系统架构,架构中包含几个重要组件: 端:作为消息的发送和接收端,通过连接消息服务器来发送和接收消息。消息服务器:一组无状态的服务器,可水平扩展,处理消息的发送和接收请求,连接后端消息系统。消息队列:新写入消息的缓冲队列,消息系统的前置消息存储,用于削峰填谷以及异步消费。消息处理:一组无状态的消费处理服务器,用于异步消费消息队列中的消息数据,处理消息的持久化和写扩散同步。消息存储和索引库:持久化存储消息,每个会话对应一个Timeline进行消息存储,存储的消息建立索引来实现消息检索。消息同步库:写扩散形式同步消息,每个用户的收件箱对应一个Timeline,同步库内消息不需要永久保存,通常对消息设定一个生命周期。新消息会由端发出,通常消息体中会携带消息ID(用于去重)、逻辑时间戳(用于排序)、消息类型(控制消息、图片消息或者文本消息等)、消息体等内容。消息会先写入消息队列,作为底层存储的一个临时缓冲区。消息队列中的消息会由消息处理服务器消费,可以允许乱序消费。消息处理服务器对消息先存储后同步,先写入发件箱Timeline(存储库),后写扩散至各个接收端的收件箱(同步库)。消息数据写入存储库后,会被近实时的构建索引,索引包括文本消息的全文索引以及多字段索引(发送方、消息类型等)。对于在线的设备,可以由消息服务器主动推送至在线设备端。对于离线设备,登录后会主动向服务端同步消息。每个设备会在本地保留有最新一条消息的顺序ID,向服务端同步该顺序ID后的所有消息。 总结 本篇文章主要介绍了现代IM系统中消息系统所需要具备的能力,对比了传统架构和现代架构。为方便接下来的深入探讨,介绍了表格存储Tablestore推出的Timeline模型,以及在IM系统中消息存储和消息同步模型的基本概念和策略,最后介绍了一个典型的架构**本人13年Java开发经验及产品研发经验,BAT背景,曾在多家知名企业担任技术总监、企业方案选型首席顾问,先后从事内核开发、大型Java系统架构设计和物联网系统架构设计开发,精通复杂业务技术方案选型、架构、核心难点攻关,对于java语言及项目有非常深入的理解和丰富的实操经验,热爱前沿技术,乐于进行技术分享与技术探讨。本人13年Java开发经验及产品研发经验,BAT背景,曾在多家知名企业担任技术总监、企业方案选型首席顾问,先后从事内核开发、大型Java系统架构设计和物联网系统架构设计开发,精通复杂业务技术方案选型、架构、核心难点攻关,对于java语言及项目有非常深入的理解和丰富的实操经验,热爱前沿技术,乐于进行技术分享与技术探讨**

May 15, 2019 · 1 min · jiezi

Python列表和Dictionary简介

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:11min 列表由于Python的存在,列表在编码时有许多不同的用途,并且可以在列表上执行许多不同的操作。在本文中,您将只学习列表的一些用法。 首先,重要的是要注意列表是通过为其分配名称并将列表中的项目放在方括号[]内来实现的。在Python shell中,键入三个列表,每行一个: fruit = ['apple', 'banana', 'kiwi', 'dragonfruit']years = [2012,  2013,  2014,  2015]students_in_class = [30,  22,  28,  33] 您刚输入的列表中包含特定类型的数据。但是,列表的一个很好的特性是它们可以混合同一列表中的数据类型。例如,我制作了这个组合字符串和整数的列表: computer_class = ['Cynthia', 78, 42, 'Raj', 98, 24, 35, 'Kadeem', 'Rachel']现在我们已经制作了列表,我们可以通过多种方式获取列表的内容。实际上,一旦创建了一个列表,计算机就会记住列表的顺序,并且该命令会保持不变,直到它被有目的地更改为止。我们看到维护列表顺序的最简单方法是在我们已经制作的列表上运行测试。 Python列表的第一项总是被计算为0(0)。那么,对于我们的第一个测试,让我们看看要求0项是否能得到第一项。使用我们的水果列表,我们将在print语句中输入列表的名称,然后添加数字为0的方括号[]: print(fruit[0])你的输出将是apple,因为apple是我们之前创建的列表中的第一个水果。 因此,我们有证据表明Python中的计数确实从0开始。现在,我们可以尝试在水果列表中打印第四个项目。您会注意到我们在打印命令中输入了3。这是因为第一项从0开始。在Python shell中键入以下代码: print(fruit[3])你的结果是什么?你有没有想到龙果是答案?如果是这样,那么,您正在学习计算列表中的项目。如果没有,请记住列表中的第一项是0项。通过练习,您将更好地计算Python列表中的项目。 对于额外的练习,请使用我们之前制作的其他列表,并尝试通过更改以下代码行中的数字来打印列表中的不同项目: print(list_name[item_number])如果代码显示list_name,请写入要使用的列表的名称。如果代码显示item_number,请写下要打印的项目编号。请记住,列表从0开始计数。 更改列表 - 添加和删除信息即使列表具有顺序,也可以更改列表。可以将项目添加到列表,从列表中删除或在列表中更改。同样,有很多方法可以与列表进行交互。我们在这里只讨论一些,但您可以随时阅读Python文档以获取更多信息。 例如,要将项添加到我们的水果列表中,我们可以使用名为list.append()的方法。要使用此方法,请键入列表的名称,点,方法名称附加,然后键入要包含在其中的项目的括号。如果该项是字符串,请记住使用单引号。键入以下代码以将橙色添加到我们所做的水果列表中:   fruit.append('orange')然后,打印水果列表以查看橙色已添加到列表中:     print(fruit) ...

May 14, 2019 · 1 min · jiezi

Java开发必须要掌握的20个核心技术

JVM相关(重点)对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很深,对此里面的概念有一些简单的了解即可。不过对于一个有着3年以上Java经验的资深开发者来说,不会JVM几乎是不可接受的。JVM作为java运行的基础,很难相信对于JVM一点都不了解的人可以把java语言吃得很透。我在面试有超过3年Java经验的开发者的时候, JVM几乎就是一个必问的问题了。当然JVM不是唯一决定技术能力好坏的面试问题,但是可以佐证java开发能力的高低。在JVM这个大类中,我认为需要掌握的知识有:JVM内存模型和结构GC原理,性能调优调优:Thread Dump, 分析内存结构class 二进制字节码结构, class loader 体系 , class加载过程 , 实例创建过程方法执行过程Java各个大版本更新提供的新特性(需要简单了解) Java的运行这条可能出看很简单,java程序的运行谁不会呢?不过很多时候, 我们只是单纯通过IDE去执行java程序,底层IDE又是如何执行java程序呢?很多人并不了解。这个知识点是最最基本的java开发者需要掌握的,第一个肯定是教你如何在命令行中执行java程序,但是很多人一旦把java学完了,IDE用上了,就把这个都忘了。为什么强调要知道这个呢,知道了java最纯粹的启动方式之后,你才能在启动出问题的时候,去分析当时启动的目录多少,执行命名如何,参数如何,是否有缺失等。这样有利于你真正开发中去解决那些奇奇怪怪的可能和环境相关的问题。在这里需要掌握的知识有:javac 编译java文件为 class 文件java 命令的使用, 带package的java类如何在命令行中启动java程序涉及到的各个路径(classpath, java。library。path, java运行的主目录等) 数据类型(重点)这条没有什么好多说的,无非就是Java中的基本类型和对象类型的掌握。可以再了解一些JDK如何自动转换方面的知识,包括装箱拆箱等,还要注意避免装箱之后的类型相等的判断。主要知识点:基本类型: int, long, float, double, boolean 。。。对应的对象类型: Integer 等类型到基本类型的转换, 装箱和拆箱Object类型: equals, hashcodeString 类型的特点 对象和实例在这方面,开发者需要了解class和instance的概念以及之间的差别, 这是java面向对象特性的一个基础。主要知识点有:Class和 Instance 的概念Instance 创建的过程:无继承:分配内存空间, 初始化变量, 调用构造函数有继承:处理静态动作, 分配内存空间, 变量定义为初始值 , 从基类->子类, 处理定义处的初始化, 执行构造方法需要注意的点:静态属性等从基类->子类进行初始化默认无参构造方法相关的特性 访问控制这也是java封装特性的一个基础,需要掌握的有:public protected default private 对于class, method, field 的修饰作用。 流程控制Java 流程控制的基础, 虽然有些语法不一定很常用,但是都需要了解,并且在合适的地方使用它们。需要掌握的有:if, switch, loop, for, while 等流程控制的语法。 面向对象编程的概念(重点)这是一个java的核心概念,对于任何java开发者都需要熟练掌握。Java中很多特性或者说知识点都是和java面向对象编程概念相关的。在我的理解,一个好的开发者不仅仅需要了解这些特性(知识点)本身。也更需要知道这些对象在java的面向对象编程概念中是如何体现出来的,这样更有利于开发者掌握java这门开发语言,以及其他面向对象编程的语言。在这里只是简单罗列了一下,主要的知识点包括有:面向对象三大特性:封装,继承,多态;各自的定义概念,有哪些特性体现出来,各自的使用场景静态多分派,动态单分派的概念重载的概念和使用继承:接口多实现,基类单继承抽象,抽象类,接口多态:方法覆盖的概念和使用接口回调 static静态属性在java日常开发中也是经常使用,需要了解和 static 关键字相关的用法,还有和其他关键字的配合使用, 如是否可以和 abstract, final 等关键字联合使用。主要需要掌握的有:静态属性的定义,使用,以及类加载时如何初始化静态方法的定义和使用静态类的定义和使用静态代码块的定义和初始化时机基础知识点这里主要罗列一些散落的,没有系统归类的一些java知识点。在日常的开发中用到也不少。 这块内容其实还有很多,目前只是暂时归纳了这几个在这里:包括有:equalshashcodetring/stringbufferfinalfinallyfinalize9.集合框架(重点)这个是一个需要多加掌握的部分,做java开发,可以说没有不用到集合框架的,这很重要,这里整理的Java集合面试题及答案你必须都要清楚。但是这里的知识点并不难,但是对于集合最好要了解内部的实现方式,因为这样有助于你在各个不同的场景选择适合的框架来解决问题,比如有1W个元素的集合,经常要进行contains判断操作,知道了集合的特性或者内部实现,就很容易做出正确的选择。这里包括了如下内容(并发相关不包含在内):集合框架的体系: 基础Collection ,Map具体集合实现的内容, List ,Set ,Map 具体的实现,内部结构, 特殊的方法, 适用场景等集合相关的工具类 Collections 等的用法10.异常框架异常在java的开发中可能没有那么被重视,异常处理的最佳实战详细说明了。一般遇到异常,直接上抛,或者随便catch一下处理之后对于程序整体运行也没有什么大的影响。不过在企业级设计开发中, 异常的设计与处理的好坏,往往就关系着这个系统整体的健壮性。一个好的系统的异常对于开发者来说,处理应该统一,避免各处散落很多异常处理逻辑;对于系统来说,异常应该是可控的,并且是易于运维的,某些异常出现后,应该有应对的方法,知道如何运维处理,所以虽然异常框架很简单,但是对于整个企业级应用开发来说,异常处理是很重要的,处理好异常就需要了解Java中的异常体系。这部分需要掌握的知识点不多,主要就是:异常的体系:ThrowableExceptionRuntimeExceptionErrorRuntimeException 和 一般 Exception 的区别, 具体处理方法等 ...

May 13, 2019 · 1 min · jiezi

使用Python正则表达式操作文本数据

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:7min 什么是正则表达式正则表达式,是简单地字符的序列,可指定特定的搜索模式。正则表达式已存在很长一段时间,并且它本身就是计算机科学的一个领域。 在 Python中,使用Python的内置re模块处理正则表达式操作 。在本节中,我将介绍创建正则表达式并使用它们的基础知识。您可以使用以下步骤实现正则表达式: 指定模式字符串。将模式字符串编译为正则表达式对象。使用正则表达式对象在字符串中搜索模式。可选:从字符串中提取匹配的模式。编写和使用正则表达式在Python中创建正则表达式的第一步是导入re 模块: import rePython正则表达式使用模式字符串表示,模式字符串是指定所需搜索模式的字符串。在最简单的形式中,模式字符串只能由字母,数字和空格组成。以下模式字符串表示精确字符序列的搜索查询。您可以将每个角色视为一个单独的模式。在后面的例子中,我将讨论更复杂的模式: import repattern_string = "this is the pattern"下一步是将模式字符串处理为Python可以使用的对象,以便搜索模式。这是使用re模块的compile()方法完成的。的编译()方法将图案字符串作为参数并返回一个正则表达式对象: import repattern_string = "this is the pattern" regex = re.compile(pattern_string)获得正则表达式对象后,可以使用它在搜索字符串中搜索模式字符串中指定的模式。搜索字符串只是您要在其中查找模式的字符串的名称。要搜索模式,可以使用regex对象的search()方法,如下所示: import repattern_string = "this is the pattern" regex = re.compile(pattern_string)match = regex.search("this is the pattern")如果模式字符串中指定的模式位于搜索字符串中,则search()方法将返回匹配对象。否则,它返回None数据类型,这是一个空值。 由于Python相当松散地解释了True和False值,因此搜索函数的结果可以像if语句中的布尔值一样使用,这可能相当方便: ....match = regex.search("this is the pattern") if match:print("this was a match!")这个模式应该产生一个匹配,因为它与模式字符串中指定的模式完全匹配。如果在搜索字符串的任意位置找到模式,搜索函数将生成匹配,如下所示: ...

May 13, 2019 · 2 min · jiezi

对比学习Golang-VS-Python3

Golang和Python都是目前在各自领域最流行的开发语言之一。 Golang其高效而又友好的语法,赢得了很多后端开发人员的青睐,最适用于高并发网络编程的语言之一。 Python不用说,TIOBE排行榜的前十常驻居民,现在已经稳定在前五了。在机器学习、AI、数据分析领域成为必学语言。 两门编程语言在语法上都有各自的特点,而且都易学易用。 本文对比这两门语言目的不是争谁优谁略,只是为了对比学习,适合掌握Python想学Go或者掌握Go想学Python的同学们参考。 Go和Python,一个是静态语言一个是动态语言,从各个方面来看,都有根本性的差异,所以,文中很多内容不进行深入的比较了,我们只从程序员最直观的语法面做对比。 为了便于阅读,文中涉及代码都采用尽量简单的语句呈现 字符编码PythonPython中默认的编码格式是 ASCII 格式,程序文件中如果包含中文字符(包括注释部分)需要在文件开头加上 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了 Golang原生支持Unicode 保留字(关键字)Python30个关键字 and exec notassert finally orbreak for passclass from printcontinue global raisedef if returndel import tryelif in whileelse is withexcept lambda yieldGolang25个关键字 break default func interface selectcase defer go map structchan else goto package switchconst fallthrough if range typecontinue for import return var注释Python# 单行注释'''多行注释多行注释'''"""多行注释多行注释"""Golang//单行注释/*多行注释多行注释*/变量赋值PythonPython是动态语言,所以在定义变量的时候不需要申明类型,直接使用即可。Python会根据值判断类型。 name = "Zeta" # 字符串变量age = 38 # 整数income = 1.23 # 浮点数多变量赋值 ...

May 13, 2019 · 5 min · jiezi

使用Python进行异常处理

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:10min 本文所涉及知识点 Python中有哪些异常 ?使用try ... except子句控制程序流通过处理异常来处理常见问题创建和使用自定义异常类在直接进入代码并解决这些问题之前,让我们首先了解异常是什么以及处理异常是什么意思。 什么是异常?异常是Python中的对象。它为我们提供了有关在程序执行期间检测到的错误的信息。在调试应用程序时注意到的错误是未处理的异常,因为我们没有这些异常。在本文后面,您将学习处理这些异常的技巧。 在早期回溯中看到的ValueError和IndexError异常是Python中内置异常类型的示例 。在下一节中,您将了解Python支持的其他一些内置异常 。 最常见的异常让我们快速回顾一些最常遇到的异常。最简单的方法是尝试运行一些错误的代码,让它报告错误回溯的问题!启动Python解释器并编写以下代码: 以下是一些异常情况: 正如您所看到的,代码的每一行都会抛出一个带有异常类型的错误回溯(突出显示)。这些是Python中的一些内置异常。Python提供BaseException作为所有内置异常的基类。但是,大多数内置异常不直接继承BaseException。相反,它们是从一个名为Exception的类派生而来的,而这个类又继承自BaseException。处理程序退出的内置异常(例如,SystemExit)直接从BaseException派生。您还可以创建自己的异常类作为Exception的子类。您将在本文后面了解到这一点。 异常处理到目前为止,我们已经看到了异常的发生方式 现在,是时候学习如何使用try ... except子句来处理这些异常。以下伪代码显示了try ... except子句的一个非常简单的示例: 我们来看看前面的代码片段: · 首先,程序尝试执行try子句中的代码。 · 在执行期间,如果出现错误(如果发生异常),它将跳出此try子句。try块中的其余代码不会被执行。 · 然后,它在except子句中查找适当的异常处理程序并执行它。 这里使用的 except子句是通用的。它将捕获try子句中发生的所有类型的异常。而不是拥有这个“全能”处理程序,更好的做法是捕获您预期的错误并编写特定于这些错误的异常处理代码。例如,try子句中的代码可能会抛出AssertionError。您可以编写特定的异常处理程序,而不是使用universal except子句,如下所示: 在这里,我们有一个except子句专门处理AssertionError。它还意味着除了AssertionError之外的任何错误都将作为未处理的异常漏掉。为此,我们需要使用不同的异常处理程序定义多个except子句。但是,在任何时候,只会调用一个异常处理程序。用一个例子可以更好地解释这一点。我们来看看下面的代码片段: 该试块调用solve_something() 。此函数接受一个数字作为用户输入,并断言该数字大于零。如果断言失败,它会直接跳转到处理程序,但AssertionError除外。 在另一个场景中,如果> 0,则执行solve_something()中的其余代码。您会注意到未定义变量x,这会导致NameError。此异常由另一个异常子句处理,但NameError除外。同样,您可以为预期的错误定义特定的异常处理程序。 提高并重新提出异常Python中的raise关键字用于强制发生异常。换句话说,它引发了一个异常。语法很简单; 只需打开Python解释器并输入: >>> raise AssertionError("some error message")这会产生以下错误回溯: Traceback (most recent call last): File "", line 1, in AssertionError : some error message在某些情况下,我们需要重新引发异常。假设,在try子句中,您有一个将数字除以零的表达式。在普通算术中,这个表达没有意义。这是一个错误!这会导致程序引发一个名为ZeroDivisionError的异常。如果没有异常处理代码,程序将只打印错误消息并终止。 ...

May 13, 2019 · 1 min · jiezi

Java设计模式11享元模式

一、适用场景 内存属于稀缺资源,不能随意浪费。如果在一个系统中有很多个完全相同或相似的对象,我们就可以使用享元模式,让他们共享一份内存即可,不必每个都去实例化对象,从而节省内存空间。 二、模式核心 享元模式以共享的方式高效的支持大量细粒度对象的重用。享元对象能做到共享的关键是区分了内部状态和外部状态。 内部状态:可以共享,不会随环境改变而改变。外部状态:不可以共享,会随环境改变而改变。 围棋例子: 每一个围棋棋子都是一个对象,并都有如下属性: 三、享元模式结构 UM类图: FlyWeight抽象享元类:通常是一个接口或抽象类,声明公共方法,这些方法可以向外界提供对象的内部状态,设置外部状态。 UnsharedConcreteFlyWeight非共享享元类:不能被共享的子类可以设计为非共享享元类。 ConcreteFlyWeight具体享元类:为内部状态提供成员变量进行存储。 FlyWeightFactory享元工厂类:创建并管理享元对象,享元池一般设计为键值对。 围棋代码示例: FlyWeight抽象享元类: public interface ChessFlyWeight { String getColor();//获取颜色,内部状态 void display(Coordinate c);//展示位置,外部状态} UnSharedConcreteFlyweight 非共享享元类: /** * 外部状态:棋子坐标位置 */public class Coordinate { private int x,y; public Coordinate(int x, int y) { super(); this.x = x; this.y = y; } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; }}ConcreteFlyWeight具体享元类: ...

May 12, 2019 · 1 min · jiezi

从0开始Go语言用Golang搭建网站

实践是最好的学习方式零基础通过开发Web服务学习Go语言 本问适合有一定编程基础,但是没有Go语言基础的同学。 也就是俗称的“骗你”学Go语言系列。 这是一个适合阅读的系列,我希望您能够在车上、厕所、餐厅都阅读它,涉及代码的部分也是精简而实用的。 学习需要动机Go语言能干什么?为什么要学习Go语言? 本系列文章,将会以编程开发中需求最大、应用最广的Web开发为例,一步一步的学习Go语言。当看完本系列,您能够清晰的了解Go语言Web开发的基本原理,您会惊叹于Go语言的简洁、高效和新鲜。 结果反馈才能让你记住《刻意练习》一书中说,学习需要及时反馈结果,才能提高学习体验。 本系列文章的每一节,都会包含一段可运行的有效代码,跟着内容一步一步操作,你可以在你自己的计算机上体验每一句代码的作用。 不要学习不需要的东西文章围绕范例为核心,介绍知识点。文中不罗列语法和关键字,当您还不知道它们用来干什么时,反而会干扰您的注意力。 希望您在阅读本系列文章后,对Go语言产生更多的学习欲望,成为一名合格的Gopher Gopher:原译是囊地鼠,也就是Go语言Logo的那个小可爱;这里特指Go程序员给自己的昵称。如何10分钟搭建Go开发环境1.下载Go语言安装文件访问Go语言官方网站下载页面: https://golang.org/dl 可以看到官网提供了Microsoft Windows、Apple MacOS、Linux和Source下载。 直接下载对应操作系统的安装包。 [图片上传失败...(image-591890-1557632893071)] 2.和其他软件一样,根据提示安装3.配置环境变量在正式使用Go编写代码之前,还有一个重要的“环境变量”需要配置:“$GOPATH” GOPATH环境变量指定工作区的位置。如果没有设置GOPATH,则假定在Unix系统上为$HOME/go,在Windows上为 %USERPROFILE%\go。如果要将自定义位置用作工作空间,可以设置GOPATH环境变量。GOPATH环境变量是用于设置Go编译可以执行文件、包源码以及依赖包所必要的工作目录路径,Go1.11后,新的木块管理虽然可以不再依赖 $GOPATH/src,但是依然需要使用 $GOPATH/pkg 路径来保存依赖包。 首先,创建好一个目录用作GOPATH目录 然后设置环境变量 GOPATH: Linux & MacOS: 导入环境变量 $ export GOPATH=$YOUR_PATH/go 保存环境变量 $ source ~/.bash_profile Windows: 控制面板->系统->高级系统设置->高级->环境变量设置 $GOPATH设置好后,它是一个空目录,当在开发工作中执行go get、go install命令后, $GOPATH所指定的目录会生成3个子目录: bin:存放 go install 编译的可执行二进制文件pkg:存放 go install 编译后的包文件,就会存放在这里src:存放 go get 命令下载的源码包文件4.检查环境打开命令行工具,运行 $ go env 如果你看到类似这样的结果,说明Go语言环境安装完成. GOARCH="amd64"GOBIN=""GOCACHE="/Users/zeta/Library/Caches/go-build"GOEXE=""GOFLAGS=""GOHOSTARCH="amd64"GOHOSTOS="darwin"GOOS="darwin"GOPATH="/Users/zeta/workspace/go"GOPROXY="https://goproxy.io"GORACE=""GOROOT="/usr/local/go"GOTMPDIR=""GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"GCCGO="gccgo"CC="clang"CXX="clang++"CGO_ENABLED="1"GOMOD=""CGO_CFLAGS="-g -O2"CGO_CPPFLAGS=""CGO_CXXFLAGS="-g -O2"CGO_FFLAGS="-g -O2"CGO_LDFLAGS="-g -O2"PKG_CONFIG="pkg-config"GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/7v/omg2000000000000019/T/go-build760324613=/tmp/go-build -gno-record-gcc-switches -fno-common"5.选择一款趁手的编辑器或IDE现在很多通用的编辑器或IDE都支持Go语言比如 ...

May 12, 2019 · 4 min · jiezi

小白教程一小时上手最流行的前端框架vue

前言 vue是现在很火的一个前端MVVM框架,它以数据驱动和组件化的思想构建,与angular和react并称前端三大框架。相比angular和react,vue更加轻巧、高性能、也很容易上手。大家也可以移步vue官网,看一下它的介绍和核心功能介绍。简单粗暴的理解就是:用vue开发的时候,就是操作数据,然后vue就会处理,以数据驱动去改变DOM。使用vue,我们可以集中精力于如何处理数据上,数据改变后,页面显示也会随之改变。相比jquery那种操作DOM元素的开发方式,能有效提高开发效率,个人觉得有接近两三倍的提升。 一、 安装 我们可以通过npm或者直接引入script标签两种方式来安装vue。这里为了方便说明,采用第二种方式,我们只需要在html页面引入标签即可。个人测试开发可以使用bootcdn的资源。 <script src="https://cdn.bootcss.com/vue/2.6.10/vue.min.js"></script>二、核心思想 “数据绑定”是vue的核心思想,这里笔者举一个hello world例子来说明这种思想。 html代码 <div id="app"> <p>{{ message }}</p> <input v-model="message"></div>javascript代码 new Vue({ el: '#app', data: { message: 'Hello Vue!' }})页面效果 我们在html代码里面设置了一个id为“app”的div,然后在javascript里面实例化了一个属性el为“#app”的vue对象,表示这个vue对象用来处理该div的显示。 接着在vue对象的data属性里面设置了一个message字段,把这个字段和页面的p元素和input元素双向绑定起来。 这样只要message字段改变,p元素的内容就会改变。只要input的输入内容改变,message字段就会改变,从而导致p元素的内容改变。所以我们改变页面中输入框的值,p元素里面的内容也随之改变。 三、vue实例基本组成 new Vue({ el: '#app', data: { message: 'Hello Vue!', url: 'www.salasolo.com' }, methods:{ showMsg: function(){ alert(this.message) }, jumpUrl: function(){ location.href = this.url } },})可以看到,一个vue实例有三个基本的属性,el属性用来指定绑定的页面容器,data属性里面存放页面展示的数据,methods放置页面调用的一些方法。 四、数据绑定 使用下面的语法可以将页面元素的内容和vue实例的data属性里面的字段绑定起来。 1.文本 <span>消息: {{ message }}</span>2.原始html <span v-html="htmlCode"></span>3.列表 <span v-for="item in list">{{item}}</span>4.条件 ...

May 10, 2019 · 1 min · jiezi

当智能家居走进特殊人群阿里程序员与他的梦想改造

如果你看过《梦想改造家》,那你一定会对那位被称为“神之手”的日本设计师本间贵史记忆犹新。特别是2年前,他为一个僵硬病症家庭改造46m²老屋的故事,更是感动了无数网友。 为了能真正帮助这个不幸的家庭,让日渐年迈的妈妈既能外出工作谋生,又能放心家里即将失去自理能力的儿子,本间贵史不仅亲自到这个家里照顾病人小李,细心记录他的日常习惯和不便,还跑到医院去了解这种疾病的症状与变化。 最终,他考虑到病人不同患病阶段的需求,设计出相应的房屋功能,为这对相依为命的母子带去了一个“奇迹”。 从这期节目中,我们可以看到,本间贵史的执着与匠心不仅让小李的生活更加便捷舒适,也为他和母亲增添了生活的希望与勇气。这种意义是远非精美的装修、单纯的金钱所能比拟的,可以说本间贵史是一位当之无愧的“梦想改造家”。 而在荧屏之外,同样有一群人,他们也在为了让人们生活得更加幸福,让这个世界更加美好而努力进行着自己的独特“设计”。 来自阿里云的代立晨便是其中的一位“梦想改造家”。 (一)初识代立晨,人们往往会对他的职业名称颇感兴趣——解决方案架构师。 而用他自己的话来介绍就是:“我现在在做物联网的解决方案实验室,这个实验室就是给(物联网)行业里面输出各种各样的创新的方案。” 由于工作的性质,代立晨需要及时去了解生活中潜在的问题或特殊人群的需求,以期用互联网思维和技术提供最佳的创新方案。 正因为如此,早在2011年就加入了W3C的信息无障碍工作组(国际Web无障碍领域的领先标准化组织)的他一直在关注信息无障碍领域的进展。 “这个工作组实际上主要是在为盲人群体做无障碍服务,比如让盲人也可以去使用网页等。”所以在日常的生活与工作中,代立晨也格外关注盲人群体,总希望为他们的生活无障碍贡献一份力。 而在2018年初,一次和朋友的偶然谈话给了他极大的启发。以“物联网能不能给视觉障碍群体做一些事情?”这个问题为开端,他和朋友两人经过激烈的思想碰撞和讨论,终于找到了能为盲人提供的可行性创新方案——“智能家居”系统研发。 如今市场上的智能家居,绝大多数只停留在通过手机和智能音箱控制智能设备的阶段,而远没有实现真正意义上的高度自动化。 对代立晨来说,这是一个不容忽视的问题,因为高度自动化对普通人来说可能只是一个体验上的优化,但对与盲人来说将会是水和空气,能够大大减少他们的生活负担。所以他和朋友当即决定要为盲人设计、优化一个真正能够帮助他们的智能家居系统。 项目发起后,一个有着开发工程师和视觉设计师的小团队很快就组建了起来。而这个五人小组成立后的第一件事,便是将代立晨的家作为“试验田”,进行自动化的改造。在此过程中,他们一边克服技术问题,一边将体验一步步推向极致。 将一个个感应器布置在家中的各个角落,形成一个完善立体的智能网络系统。 与此同时,团队也与中央电视台的《秘密大改造》栏目取得了联系,准备将这套智能家居系统搬上荧幕让更多人了解。 而团队的荧幕首秀,则是要为一位来自四川的视障人士大川的家进行改造。 (二)“我们是视障,不是智障。” “我们是视障,不是智障。”每次回想起大川这句无可奈何的解释,代立晨仍旧感触良多。 受先天基因的影响,大川在30多岁时突然被夺去了视力,视力微弱的他甚至连上厕所、开关灯、空调设置温度等看似简单的动作都举步维艰,因而也受到了许多人的误解。 代立晨则希望改变人们的这种错误看法:“社会上有不少人会去关注、关心视障人士,但他们却总会把视障人士视为生活不能自理的人。大川认为不是这样,我也认为不应该是这样的……视障人士只是有自己生活方式,视觉障碍让他们没办法跟普通人的生活一样,但是他们绝不是生活不能自理。” 因此,在对大川家的改造的过程中,代立晨始终站在视障人士的角度进行思考,给予大川最大的尊重和理解,希望为他创造出一个能认识、陪伴、照顾他的家。 “为盲人做自动化就是让他不用去找遥控器,不用去开灯,减少他在家里的走动。” 代立晨和团队成员们为此付出了很多努力,最终也带来了非一般的成效: 无需开灯,只要在房间内行走,沿墙边分布的灯带就会自动亮起来引导主人。 智能窗帘会在室外温度达到设置的阈值时自动合上,而到了太阳即将下山时又会自动拉开。 经过改造的语音空调可以摆脱使用者被遥控器的束缚,只需一声语音指令就能自动调到想要的温度。 而比起各种指令的方便下达与执行,这套智能家居系统的优势更在于它的真正自动化运行。它能记录主人喜欢的亮度、温度以及家电的开关习惯,既能接收指令,又能自动运行。 相比于很多不会“自主思考”的智能家居,代立晨和他的团队与其说是在改造房子,不如说是给系统中的家电装上了“大脑”。 面对这套为自己量身定做的智能家居系统,大川在收房时露出了惊喜与认可的表情。这一刻,整个团队沉浸在喜悦之中。 然而这并不是智能家居项目的终点,代立晨和团队中的其他“梦想改造家”们已经注意到了另一个需求人群——老年人。 (三)“我们认为现在生活节奏越来越快,客观上子女很难亲自照顾老人,所以我们想设计一个能帮助看护人减轻负担的系统。” 在代立晨看来,想要减轻老人看护人的负担,就必须通过两个途径:系统提醒与系统评分。 一是在老人出现异常的时候进行系统提醒。 例如等老人过了时间还没有吃药(配备的智能药箱可以记录是否被打开)、出门超过一定时间后还没有回来等异常情况发生时,智能家居系统就会给看护人发送一个手机APP的推送,提醒看护人及时联系老人。 二是每天对老人全天的行为进行评分。 如果说老人经常晚睡早起、或者吃药时间总是提前或靠后等,系统都会对这些非危险性行为进行监测评估。 而看护人只要花些许时间看一下评分报告,再大致浏览一下所有监控点,就能知道老人的大体生活情况了。 “我觉得让看护人主动打电话提醒老人吃药的方式,会比在客厅放置一个音箱提醒吃药要好得多”,智能家居并非冰冷的机械指令,他更希望通过互联网的即时技术来为家人之间重构沟通的桥梁。 与此同时,家住武汉的独居老人崔兴礼和曹雪梅夫妇走进入团队的视野。 原来,老人崔兴礼在6年前被诊断出了阿尔兹海默症,疾病让这位曾建造过南京长江大桥的优秀工程师失去了智力和记忆。如今的他已经连自己的名字都不记得并且经常走失,而由于工作的原因,子女们也不能常伴父母左右,只有妻子曹雪梅每天寸步不离地照顾崔兴礼。 而对这一切看在眼里,忧在心里的孙女贝贝向乐于助人的阿里云工程师们求助,希望科技能够帮助自己的爷爷奶奶安享晚年。 崔兴礼和曹雪梅夫妇走进浙江卫视《智造将来》节目,讲述智能家居如何改变了他们的生活。 这次,团队又为老人定制了一整套独一无二的远程看护方案,通过智能家居系统与手机APP的配合,所有家人都可以时刻观测到老人在家里的所有行为,而崔兴礼所佩戴的智能手环会监测他的身体指数和定位,防止老人再走丢。 这一切地出发点都是为了给予老人更好的生活保障,以及增加家人间的互相关怀与联系。团队又一次用科技改变了生活,也用实事证明:科技不仅无处不在,而且温暖人心。 (四)智能家居项目发起于2018年3月21日,正是春回大地万物复苏的春分之时,如今已经一岁的她也像春姑娘一般温暖了许多需要帮助的家庭。 “我们始终希望能利用互联网技术去帮助更多的特殊人群,为他们设计一些市面上没有却能方便他们日常生活的产品,真正帮助他们有尊严地生活。目前我们也正在跟深圳信息无障碍协会一起做些新的研究,未来期待有更多人能参与进来,和我们一起来完成这件事情。”当被问到如何看待项目的现在与未来时,代立晨如此坚定而期待地答道。 给这个社会带来一种全新的方案,真正帮助到那些特殊群体,始终是他和整个团队不懈努力的方向和目标。 更令人欣慰的是,在“智能家居”项目越来越受到人们的关注与欢迎的同时,阿里巴巴其他公益项目或活动都呈现出欣欣向荣的发展态势。更多需要关注和关怀的特殊人群都可以在针对自己的公益项目中寻求帮助。 “钉钉信息无障碍”让视障群体可以像正常人一样公平平等地进入职场,与“智能家居”项目遥相呼应,为视障群体开拓更大的社会活动空间。 “养虾米”致力于帮助贫困家庭的听障儿童进行人工耳蜗植入手术,给听障儿童一个有声世界。 ...

May 10, 2019 · 1 min · jiezi

spring-boot介绍及使用详解

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。 Spring boot的特点 创建独立的Spring应用程序嵌入的Tomcat,无需部署WAR文件简化Maven配置自动配置Spring提供生产就绪型功能,如指标,健康检查和外部配置绝对没有代码生成和对XML没有要求配置Spring boot的优点 spring boot 可以支持你快速的开发出 restful 风格的微服务架构 自动化确实方便,做微服务再合适不过了,单一jar包部署和管理都非常方便。只要系统架构设计合理,大型项目也能用,加上nginx负载均衡,轻松实现横向扩展 spring boot 要解决的问题, 精简配置是一方面, 另外一方面是如何方便的让spring生态圈和其他工具链整合(比如redis, email, elasticsearch) Spring boot的使用 1、maven配置文件 <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.springboot.sample</groupId> <artifactId>spring-boot-sample</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> <name>spring-boot-sample</name> <description>Spring Boot Sample Web Application</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.2.RELEASE</version> <relativePath /> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- MYSQL --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- Spring Boot JDBC --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>2、application类 ...

May 4, 2019 · 2 min · jiezi

Java-Web基础ActionService-Dao三层的功能划分

Action/Service/DAO简介:      Action是管理业务(Service)调度和管理跳转的。       Service是管理具体的功能的。       Action只负责管理,而Service负责实施。       DAO只完成增删改查,虽然可以1-n,n-n,1-1关联,模糊、动态、子查询都可以。但是无论多么复杂的查询,dao只是封装增删改查。至于增删查改如何去实现一个功能,dao是不管的。       总结这三者,通过例子来解释:       Action像是服务员,顾客点什么菜,菜上给几号桌,都是ta的职责;       Service是厨师,action送来的菜单上的菜全是ta做的;       Dao是厨房的小工,和原材料打交道的事情全是ta管。       相互关系是,小工(dao)的工作是要满足厨师(service)的要求,厨师要满足服务员(action)转达的客户(页面用户)的要求,服务员自然就是为客户服务喽。       现在最基本的分层方式,结合了SSH架构。Model层就是对应的数据库表的实体类。Dao层是使用了Hibernate连接数据库、操作数据库(增删改查)。Service层:引用对应的Dao数据库操作。Action层:引用对应的Service层,在这里结合Struts的配置文件,跳转到指定的页面,当然也能接受页面传递的请求数据,也可以做些计算处理。       以上的Hibernate, Struts,都需要注入到Spring的配置文件中,Spring把这些联系起来,成为一个整体。 三大框架Struts/Hibernate/Spring      简单地说:      Struts——控制用的;      Hibernate——操作数据库的;      Spring——解耦用的。      详细地说:       Struts在SSH框架中起控制的作用,其核心是Controller,即ActionServlet,而ActionServlet的核心就是Struts-config.xml,主要控制逻辑关系的处理。       Hibernate是数据持久化层,是一种新的对象、关系的映射工具,提供了从Java类到数据表的映射,也提供了数据查询和恢复等机制,大大减少数据访问的复杂度。把对数据库的直接操作,转换为对持久对象的操作。 ...

May 4, 2019 · 1 min · jiezi

Golang研学如何掌握并用好defer延迟执行

defer:在函数A内用defer关键字调用的函数B会在在函数A return后执行。 先看一个基础的例子,了解一下defer的效果 func main() { fmt.Println("in main func:", foo())}func foo() int { i := 0 defer fmt.Println("in defer :", i) i = 1000 fmt.Println("in foo:", i) return i+24}这段代码运行后会打印出 in foo: 1000in defer : 0in main func: 1024变量i初始化为0,defer指定fmt.Println函数延迟到return后执行,最后main函数调用foo打印返回值。 有什么用途?函数中会申明使用很多变量资源,函数结束时,我们通常会对它们做一些处理:销毁、释放(例如数据库链接、文件句柄、流)。 一般情况下,我们会在return语句之前处理这些事情。 但是,如果函数中包含多个return,这些处理我们需要在每个return之前都操作一次,实际工作中经常出现遗漏,代码维护时也很麻烦。 例如,在不用defer的时候,代码可能会这样写: func foo(i int) int { if i > 100 { fmt.Println("不是期待的数字") return 0 } if i < 50 { fmt.Println("不是期待的数字") return 0 } return i}使用defer后,代码可以这样写 ...

May 4, 2019 · 2 min · jiezi

实例详解Spring-MVC入门使用

MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller).通过分层使开发的软件结构更清晰,从而达到开发效率的提高,可维护性和扩展性得到提高.Spring提供的MVC框架是在J2EE Web开发中对MVC模式的一个实现,本文通过实例讲解一下Spring MVC 的使用. 先来看一个HTTP request在Spring的MVC框架是怎么被处理的:(图片来源于Spring in Action) 1,DispatcherServlet是Spring MVC的核心,它的本质是一个实现了J2EE标准中定义的HttpServlet,通过在web.xml配置<servlet-mapping>,来实现对request的监听. <servlet> <servlet-name>springTestServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springTestServlet</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>** 以.do结尾的request都会由springTestServlet来处理.2,3,当接受到request的时候,DispatcherServlet根据HandlerMapping的配置(HandlerMapping的配置文件默认根据<servlet-name>的值来决定,这里会读取springTestServlet-servlet.xml来获得HandlerMapping的配置信息),调用相应的Controller来对request进行业务处理. <bean id="simpleUrlMapping"class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> <property name="mappings"> <props> <prop key="/login.do">loginController</prop> </props> </property> </bean> <bean id="loginController"class="com.test.spring.mvc.contoller.LoginController"> <propertyname="sessionForm"> <value>true</value> </property> <propertyname="commandName"> <value>loginCommand</value> </property> <property name="commandClass"> <value>com.test.spring.mvc.commands.LoginCommand</value> </property> <property name="authenticationService"> <refbean="authenticationService"/> </property> <propertyname="formView"> <value>login</value> </property> <propertyname="successView"> <value>loginDetail</value> </property> </bean>** 以login.do结尾的request由loginController来处理.<property name="formView">配置的是Controller接收到HTTP GET请求的时候需要显示的逻辑视图名,本例是显示login.jsp,<property name="successView">配置的是在接收到HTTP POST请求的时候需要显示的逻辑视图名,在本例中即login.jsp提交的时候需要显示名为loginDetail的逻辑视图.4,Controller进行业务处理之后,返回一个ModelAndView对象.return new ModelAndView(getSuccessView(),"loginDetail",loginDetail);5,6,DispatcherServlet根据ViewResolver的配置(本例是在springTestServlet-servlet.xml文件中配置)将逻辑view转换到真正要显示的View,如JSP等. <bean id="viewResolver"class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass"> <value>org.springframework.web.servlet.view.JstlView</value> </property> <property name="prefix"> <value>/jsp/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean>**其作用是将Controller中返回的ModleAndView解析到具体的资源(JSP文件),如上例中的return new ModelAndView(getSuccessView();按照上面ViewResolver配置,会解析成/jsp/loginDetail.jsp.规则为prefix+ModelAndView的第二个参数+suffix.示例的完整代码如下: ...

April 29, 2019 · 2 min · jiezi

为什么许多程序员和设计师更喜欢用MAC而不是windows

MAC、windows和Linux谁更好已经成为了一个“千古难题”,就像从前的梗,“PHP是世界上最好的语言”一样,三大操作系统的用户各执一词,谁也不能说服谁。当然Linux用户趋向和其他两种用户完全不同,对于程序员、极客、专业人士而言更为友好,但对于普通用户来说门槛太高且实用性不佳,所以Linux及其忠实用户大多数时间也都是不与世俗争长短的状态,所以今天我们就来说说剩下的两个系统,MAC和Windows。 说到这两个操作系统,想必各位看官老爷都不陌生,一个是苹果PC产品搭载的桌面操作系统,另一个则是微软出品、陪伴我们二十余年的大众桌面操作系统,二者之间的争斗也从windows诞生就开始,一直持续了二十年余之久,大多数用户都会选择Windows作为自己的主要使用系统,但也有一部分程序员和设计师在使用windows的同时也在使用MAC系统,并且使用mac的场景往往是工作的时候,也就是用MAC作为生产工具,这是为什么呢? 首先我们来普及一下MAC和Windows的软件管理机制。Windows在安装软件的时候,我们都非常清楚安装过程中要写入注册表,这个原因是Windows的软件安装模式是先将安装包解压到指定位置,然后通过注册表写入来给这些文件赋予“身份证”,也就是该软件允许在本台电脑中获得权限并使用的权利,Windows也会记住这个软件,这样的安装方式是从win98年代就有的,机制也一直没有变化,优势在于这样的方式兼容性要更好,同时单个程序能够实现的功能也更多;但换来这些的同时也因为大量的文件分布在文件夹中,运行软件时多个文件同时运作,导致线程占用和资源占用更大,而失去了绝对稳定的运行效率。 MAC的软件管理机制可以简称为“沙箱”机制。在MAC软件安装中,所有的软件都是一个独立的程序文件,安装时没有任何解压、写入的步骤,将整个文件拖入application就可以直接使用,而在需要卸载的时候把该文件直接删除就可以了,这样做带来的好处是软件运行的稳定性极佳,同时软件因为封装紧密,不会出现文件损坏等特殊情况,所以MAC作为生产工具来说是一个非常可靠的选择;但这样的做法同样也有问题,那就是由于单一文件运行软件的机制在部分多平台的软件中无法实现全部功能移植,所以相对windows 的软件功能可能会略少。 然后我们再来说一下MAC和windows的防病毒能力。这个单独拿出来说对Windows似乎有些不公平,但事实上这确实是MAC非常大的优点。Windows因为每个程序能够获得的权限几乎是纯粹看用户想不想给予它权限,从软件权限获取难度上来看Windows是非常松散的,毕竟从最开始的系统设定上就是这样,虽然从vista开始加入了管理员运行这样的通道,以保证平时状态下不给予软件重要的权限,但相比MAC来说还是不够严谨。 MAC强悍的防病毒能力有两方面,第一方面MAC系统给予软件的权限并不多,用过IOS的人应该都清楚,在IOS 8之前苹果是没有第三方输入法的,原因就是对软件的权限审核非常严格,MAC也一样,甚至在某些软件上更夸张,什么类型的软件只能获得这类软件基本的权限,所以病毒、流氓软件根本不够格拿到权限,也就没法干坏事;当然还有第二点,那就是MAC在全球市场范围内的份额太小,windows才是主流,病毒肯定会针对市场大且相对而言更好下手的windows制作,所以MAC很少受到病毒困扰,就是因为MAC这块石头“又臭又硬”。 最后是MAC的文件管理机制。相比Windows混乱的文件管理机制,MAC因为文件管理内核和格式都要成熟许多,且在多年前就已经开始使用固态硬盘,所以文件碎片要比Windows少了许多;同时MAC的文件管理模式并没有像Windows一样给用户提供一个专门的资源管理器来让用户到处翻找文件,它系统的设定在最开始就不需要用户对硬盘进行分区,而事实证明MAC的文件稳定程度、磁盘格式的出色使得MAC根本不需要分区。 其实对于MAC比Windows更适合做创作类生产工具还有许多原因,例如MAC独占专业软件更好用云云,因为篇幅限制只能够简单概括,大家还知道哪些原因可以在评论区说出来哦。**写在最后程序员小伙伴们可以关注我一波,以后带来更精彩的**

April 28, 2019 · 1 min · jiezi

何为数据库连接池其工作原理是什么

连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务。         连接池的主要优点有以下三个方面。         第一、减少连接创建时间。连接池中的连接是已准备好的、可重复使用的,获取后可以直接访问数据库,因此减少了连接创建的次数和时间。         第二、简化的编程模式。当使用连接池时,每一个单独的线程能够像创建一个自己的JDBC连接一样操作,允许用户直接使用JDBC编程技术。         第三、控制资源的使用。如果不使用连接池,每次访问数据库都需要创建一个连接,这样系统的稳定性受系统连接需求影响很大,很容易产生资源浪费和高负载异常。连接池能够使性能最大化,将资源利用控制在一定的水平之下。连接池能控制池中的连接数量,增强了系统在大量用户应用时的稳定性。         下面,简单的阐述下连接池的工作原理。          连接池技术的核心思想是连接复用,通过建立一个数据库连接池以及一套连接使用、分配和管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁建立、关闭的开销。         连接池的工作原理主要由三部分组成,分别为连接池的建立、连接池中连接的使用管理、连接池的关闭。         第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。         第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:         当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给客户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没达到就重新创建一个连接给请求的客户;如果达到就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。         当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。         该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。         第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。        **写在最后程序员小伙伴们可以关注我一波,以后带来更精彩的**

April 28, 2019 · 1 min · jiezi

一份还热乎的蚂蚁金服面经已拿Offer附答案

本文来自我的知识星球的球友投稿,他在最近的校招中拿到了蚂蚁金服的实习生Offer,整体思路和面试题目由作者——泽林提供,部分答案由Hollis整理自知识星球《Hollis和他的朋友们》中「直面Java」板块。 经历了漫长一个月的等待,终于在前几天通过面试官获悉已被蚂蚁金服录取,这期间的焦虑、痛苦自不必说,知道被录取的那一刻,一整年的阴霾都一扫而空了。 笔者面的是阿里的Java研发工程师岗,面试流程是3轮技术面+1轮hr面。 意外的一面一面的时候大概是3月12号,面完等了差不多半个月才突然接到二面面试官的电话。一面可能是简历面,所以问题比较简单。 ArrayList和LinkedList区别 ArrayList 是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组. LinkedList 是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList. 当然,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据和运算量很小,那么对比将失去意义. 什么情况会造成内存泄漏 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点: 首先,这些对象是可达的,即在有向图中,存在通路可以与其相连; 其次,这些对象是无用的,即程序以后不会再使用这些对象。 如果对象满足这两个条件,这些对象就可以判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。 什么是线程死锁,如何解决 产生死锁的条件有四个: 1.互斥条件:所谓互斥就是进程在某一时间内独占资源。 2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。 3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。 4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 线程死锁是因为多线程访问共享资源,由于访问的顺序不当所造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。 要解决死锁,可以从死锁的四个条件出发,只要破坏了一个必要条件,那么我们的死锁就解决了。在java中使用多线程的时候一定要考虑是否有死锁的问题哦。 红黑树是什么?怎么实现?时间复杂度 红黑树(Red-Black Tree,简称R-B Tree),它一种特殊的二叉查找树。 红黑树是特殊的二叉查找树,意味着它满足二叉查找树的特征:任意一个节点所包含的键值,大于等于左孩子的键值,小于等于右孩子的键值。 除了具备该特性之外,红黑树还包括许多额外的信息。 红黑树的每个节点上都有存储位表示节点的颜色,颜色是红(Red)或黑(Black)。 红黑树的特性: (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。 (4) 如果一个节点是红色的,则它的子节点必须是黑色的。 (5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。 关于它的特性,需要注意的是: 第一,特性(3)中的叶子节点,是只为空(NIL或null)的节点。 第二,特性(5),确保没有一条路径会比其他路径长出俩倍。因而,红黑树是相对是接近平衡的二叉树。 具体实现代码这里不贴了,要实现起来,需要包含的基本操作是添加、删除和旋转。在对红黑树进行添加或删除后,会用到旋转方法。旋转的目的是让树保持红黑树的特性。旋转包括两种:左旋 和 右旋。 红黑树的应用比较广泛,主要是用它来存储有序的数据,它的查找、插入和删除操作的时间复杂度是O(lgn)。 TCP三次握手 三次握手(three times handshake;three-way handshake)所谓的“三次握手”即对每次发送的数据量是怎样跟踪进行协商使数据段的发送和接收同步,根据所接收到的数据量而确定的数据确认数及数据发送、接收完毕后何时撤消联系,并建立虚连接。 为了提供可靠的传送,TCP在发送新的数据之前,以特定的顺序将数据包的序号,并需要这些包传送给目标机之后的确认消息。TCP总是用来发送大批量的数据。当应用程序在收到数据后要做出确认时也要用到TCP。 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。 突如其来的二面一面的时候大概是3月12号,面完等了差不多半个月才突然接到二面面试官的电话。 介绍项目 Storm怎么保证一致性 Storm是一个分布式的流处理系统,利用anchor和ack机制保证所有tuple都被成功处理。如果tuple出错,则可以被重传,但是如何保证出错的tuple只被处理一次呢?Storm提供了一套事务性组件Transaction Topology,用来解决这个问题。 Transactional Topology目前已经不再维护,由Trident来实现事务性topology,但是原理相同。 参考:https://cloud.tencent.com/info/5721fb4532f6a72ed2e563f9449fd025.html 说一下hashmap以及它是否线程安全 ...

April 26, 2019 · 2 min · jiezi

首届-RustCon-Asia-圆满落幕Lets-Rust-the-World

4 月 23 日,为期 4 天的 RustCon Asia 在北京圆满落幕,300 余位来自中国、美国、加拿大、德国、俄罗斯、印度、澳大利亚等国家和地区的 Rust 爱好者参加了本次大会。作为 Rust 亚洲社区首次「大型网友面基 Party」,本届大会召集了 20 余位海内外顶尖 Rust 开发者讲师,为大家带来一天半节奏紧凑的分享和两天 Workshop 实操辅导,内容包括 Rust 在分布式数据存储、安全领域、搜索引擎、嵌入式 IoT、图像处理等等跨行业、跨领域的应用实践。 会后我们收到了很多小伙伴们的反馈,大家纷纷表示干货密集,诚意满满,而且通过 Workshop 和很多大神面对面讨论交流,非常受益。 “这次参加 RustCon Asia 非常直观的感受到了 Rust 开发的应用早已渗透到我们的生活中,以前跟朋友推广 Rust 的时候总是说不出什么杀手级应用,现在总算有些可以说了!”来自宝岛台湾的 Weihang Lo 表示这次大会有两个热情的东道主,更有许多赞助好伙伴,让整个大会品质非常高,“参会的小伙伴们热情、不藏私,让人看到了中国技术发展与交流真的非常蓬勃,大家都是 Learning by Sharing,整体技术能力也很高。台上的所有讲师,每一个都技术了得,面对很多问题都能从容应答,技术人员若能如此,夫复何求?”从新加坡赶来参会的 Alan 说:“这个大会非常专业,我也认识了很多朋友。 我最喜欢的 Talk 是 Zimon Dai 的,他给我们这些做 APP 的人带来很多新的看法,来自俄罗斯讲师 Ilya Baryshnikov 分享了自己如何在工作中使用 Rust,让我受到了启发,整个会场气氛很热闹,交流很顺畅。我参加了好几个 Workshop,Nick 的 Worskhop 对我有很大帮助,Parity 的 Workshop 让我知道怎么创造一个区块链……” 看到大家能够学到干货受到启发、与老朋友聚会同时又结识了新朋友,作为本届 RustCon Asia 的主办方之一,我们感到非常欣慰。其实自从使用 Rust 构建分布式 Key-Value 数据库 TiKV 以来,PingCAP 与 Rust 社区就保持了非常紧密的联系,非常有幸见证了 Rust 亚洲社区成熟、壮大。同时也很欣喜的看到 Rust 在各个行业和领域应用的蓬勃之势,希望今后能看到 Rust 在各行各业遍地开花,Let's Rust the World! ...

April 26, 2019 · 1 min · jiezi

零基础如何学Python小白学Python需要多久

目前市场上对于Python开发人才的需求与日递增,所以很多人都会选择去学Python。那如果是零基础又该如何学Python呢?小白学Python需要多久呢?下面,小编就与大家来看一下! 零基础的新手应该如何系统化的学习Python开发 第一、必须有一个老师给自己讲解,带着学习 这样首先是可以少走很多的弯路,不至于一个小小的问题,就困扰了一天的时间,可能明白人的一句话你就明白,但是自己想可能需要一天的时间,或许最后还是搞不懂。 如果你想要学好Python可以加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织学习有可学习有困难或者想获取Python资料请加Python学习Q群629440234,互相学习,互相分享学习资料第二、需要有一个明确而且系统的学习规划 比如你今天学习什么内容,而且今天学习的内容跟着什么案例练习,如果你学习JAVA只是看看免费的视频,那我劝你还是不要浪费时间,必须跟着大量的案例,反正练习,对于一个知识点才可以真正的掌握。 第三、明确的学习路线图 一个明确的学习路线图,每一个阶段有相应的学习时间。 第四、做好长时间学习思想准备 学习过程是循序渐进的过程,你的基础部分看完了,之后肯定会忘一部分,自己以为看明白了,等到用时候发现自己还是不知道怎么用,这是必经的过程,这时候再回去复习基础知识应该有更深入的认识,所以要做好长时间学习思想准备,不要因此放弃,不要急于求成。 第五、尝试用python解决我们项目中遇到的一些问题 要想更好得掌握python,我们的学习不能只是停留在学习语法阶段。我们可以尝试用python解决我们项目中遇到的一些问题,如果项目不是用python开发的,那我们可以想想能不能用python制作一些项目组可以使用的一些工具(utility),通过这些工具简化 项目组成员的任务,提高我们的工作效率。 每天的编码必不可少,既然选择学习编程,学习Python,坚持编码应该是必须做到的 第六、学习目标要明确 我们为什么学习Python?高薪?升职?知道自己要什么,知道自己做什么,怎么做,这个很重要。 学会Python需要多长时间? 如果是自学,从零基础开始学习Python的话,依照每个人理解能力的不同,大致上需要半年到一年半左右的时间。 当然,如果有其它编程语言的经验,入门还是非常快的,大概需要2~3个月可以对上手Python语言编写一些简单的应用。 无论是新手还是有一定基础的朋友,有一个有经验的人带着自己学习,或者参加Python培训课程,都会1个月左右入门,3个月左右对Python有一个全面系统的了解,达到自己动手编程解决问题的能力。 精通Python需要多长时间? 任何知识都是基础入门比较快,达到精通的程序是需要时日的,这是一个逐渐激烈的过程。 精通任何一门编程语言,都需要通过大量的实践来积累经验,解决遇到的各种疑难问题,看别人的源码,分享自己的分码的这个过程,才能够精通Python的方方面面。从编程的一开始,就应该不断的动手去编写代码,不停的去实践,不停的去修改,不停的总结经验,最终才能熟能生巧,达到精通。 一个对Python程序能算的上精通的程序员,对同样一个问题,他知道很多种解决问题的方法,并能从中选择最有效率的方法! 学习Python可以从事哪些职位? 1、网站后端程序员:使用它单间网站,后台服务比较容易维护; 2、自动化运维:自动化处理大量的运维任务; 3、数据分析师:快速开发快速验证,分析数据得到结果; 4、游戏开发者:一般是作为游戏脚本内嵌在游戏中; 5、自动化测试:编写为简单的实现脚本,运用在Selenium/lr中,实现自动化; 6、网站开发:借助django,flask框架自己搭建网站。

April 26, 2019 · 1 min · jiezi

Google面试问题指南使用Python删除重复出现的字符

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:5min 当下,谷歌的面试时常被程序员提及。有时,面试能让我们发挥最好的一面,从而获得我们想要的职位。本文我们将讨论一个可能出现在Google面试中的经典问题。 愿码提示:如果您是编码老手,您可能已经知道如何解决这个问题!如果你经验较浅,那么你一定会从本文中受益。问题给定一个字符串作为输入,删除任何重复出现的字符,并返回新字符串。 正如我们从上面的例子中看到的那样,输出是“abc”,因为我们删除了第二个'a','b'和'c'。首先,让我们在Python 2.7中设置我们的功能。 def deleteReoccurringCharacters(string):为了解决这个问题,我们将使用一个名为HashSet的特定数据结构。 您可以将集合视为与数组类似,但有两个主要例外。 这是完全无序的它不能包含重复项因为它是无序的,我们还需要一个空字符串来存储我们按顺序添加到集合中的字符。这将是我们返回的字符串。我们来设置一下 def deleteReoccurringCharacters(string): seenCharacters = set() outputString = ''现在我们已经建立了我们需要的数据结构,让我们再来谈谈我们的算法。由于集合在内存中的工作方式,它的查找时间复杂度为0(1)。这意味着我们可以用它来检查我们是否已经访问过一个角色! 我们的算法遍历初始字符串中的所有字符并执行以下操作:第1步:检查角色是否已经在我们的设置中第2歩:如果它不在集合中,则将其添加到集合中并将其附加到字符串让我们看看代码中的内容 for char in string: if char not in seenCharacters: seenCharacters.add(char) outputString += char我们不必担心“else”情况,因为我们不需要处理重复出现的字符本身。现在剩下要做的就是返回outputString。这是完成的代码的样子: def deleteReoccurringCharacters(string): seenCharacters = set() outputString = '' for char in string: if char not in seenCharacters: seenCharacters.add(char) outputString += char return outputString如果这是一次面试,招聘人员会问你时间和空间的复杂性。我们来分析一下。 ...

April 25, 2019 · 1 min · jiezi

使用Python挖掘GitHub的流行趋势上

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:10min 在本文中,我们将探讨如何利用Python的强大功能来收集和处理来自GitHub的数据并使其准备好分析。 GitHub采用广泛使用的版本控制方法,通过在编程领域实现社交网络功能,将编码提升到最高水平。GitHub允许您创建代码存储库并提供多种协作功能,错误跟踪,功能请求,任务管理和维基。它拥有大约2000万用户和5700万个代码库(来源:维基百科)。这些统计数据很容易证明这是程序员最具代表性的平台。它也是几个开源项目的平台,这些项目为软件开发领域做出了巨大贡献。假设GitHub使用了最新的编程工具和技术,分析GitHub可以帮助我们检测最流行的技术。存储库在GitHub上的受欢迎程度是通过它从社区收到的提交数量来评估的。我们将在本文中使用GitHub API来收集具有最多提交数量的存储库的数据,然后发现其中最流行的技术。 范围和流程GitHub API允许我们获取有关用户提交的公共代码存储库的信息。它涵盖了许多开源,教育和个人项目。我们的重点是找到过去几个月的趋势技术和编程语言,并与过去几年的存储库进行比较。我们将收集有关存储库的所有元信息,例如: Name:存储库的名称Description:存储库的描述Watchers:人们关注存储库并获得有关其活动的通知Forks :用户将存储库克隆到自己的帐户Open Issues:提交的有关存储库的问题我们将使用这些数据,定性和定量信息的组合,来识别最新趋势和微弱信号。该过程可以通过下图中显示的步骤表示: 获取数据在使用API之前,我们需要设置授权。API允许您访问所有公开可用的数据,但某些端点需要用户权限。您可以使用应用程序设置创建具有某些特定范围访问权限的新令牌。范围取决于您的应用程序的需求,例如访问用户电子邮件,更新用户配置文件等。 密码授权仅在某些情况下需要,例如用户授权的应用程序访问。在这种情况下,您需要提供用户名或电子邮件以及密码。所有API访问均通过HTTPS进行,并可从https://api.github.com/ 域访问。所有数据都以JSON的形式发送和接收。 速率限制GitHub Search API旨在帮助查找特定项(存储库,用户等)。速率限制策略允许每次搜索最多1,000个结果。对于使用基本身份验证,OAuth或客户端ID和密钥的请求,您每分钟最多可以发出30个请求。对于未经身份验证的请求,速率限制允许您每分钟最多发出10个请求。 连接到GitHubGitHub提供了一个搜索端点,它返回与查询匹配的所有存储库。随着我们的进展,在分析的不同步骤中,我们将更改变量q(查询)的值。在第一部分中,我们将检索自2017年1月1日以来创建的所有存储库,然后我们将比较前几年的结果。 首先,我们初始化一个空列表结果,该结果存储有关存储库的所有数据。其次,我们使用API所需的参数构建get请求。我们每个请求只能获得100个结果,因此我们必须使用分页技术来构建完整的数据集。 results = []q = "created:>2017-01-01"def search_repo_paging(q):url = 'https://api.github.com/search/repositories'params = {'q' : q, 'sort' : 'forks', 'order': 'desc', 'per_page' : 100}while True:res = requests.get(url,params = params)result = res.json()results.extend(result['items'])params = {}try:url = res.links['next']['url']except:break在第一个请求中,我们必须将所有参数传递给请求中的方法。然后,我们为每个下一页创建一个新请求,可以在链接中找到包含所有其他参数的资源的完整链接。这就是我们清空params词典的原因。GET res.links'next'. res.  重复该操作,直到字典中没有下一页键。对于其他数据集,我们修改搜索查询的方式是从前几年检索存储库。例如,要从2015年获取数据,我们定义以下查询:res.links  q = "created:2015-01-01..2015-12-31"为了找到合适的存储库,API提供了大量的查询参数。使用限定符系统可以高精度地搜索存储库。从主搜索参数q开始,我们有以下选项: ...

April 25, 2019 · 2 min · jiezi

Python作为人工智能首选编程语言你能了解多少呢

为何人工智能(AI)首选Python?读完这篇文章你就知道了。我们看谷歌的TensorFlow基本上所有的代码都是C++和Python,其他语言一般只有几千行 。如果讲运行速度的部分,用C++,如果讲开发效率,用Python,谁会用Java这种高不成低不就的语言搞人工智能呢?Python虽然是脚本语言,但是因为容易学,迅速成为科学家的工具(MATLAB也能搞科学计算,但是软件要钱,且很贵),从而积累了大量的工具库、架构,人工智能涉及大量的数据计算,用Python是很自然的,简单高效。Python有非常多优秀的深度学习库可用,现在大部分深度学习框架都支持Python,不用Python用谁?人生苦短,就用Python。如果你想要学好Python可以加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织学习有可学习有困难或者想获取Python资料请加Python学习Q群629440234,互相学习,互相分享学习资料 python现在的确已经很火了,这已是一个不需要争论的问题。如果说三年前,Matlab、Scala、R、Java 和 还各有机会,局面尚且不清楚,那么三年之后,趋势已经非常明确了,特别是前两天 Facebook 开源了 PyTorch 之后,Python 作为 AI 时代头牌语言的位置基本确立,未来的悬念仅仅是谁能坐稳第二把交椅。 不过市场上还有一些杂音。最近一个有意学习数据科学的朋友跟我说,她的一个朋友建议她从 Java 入手,因为 Hadoop 等大数据基础设施是用 Java 写的。 Python作为人工智能首选编程语言,你能了解多少呢?在这里我要明确表个态,对于希望加入到 AI 和大数据行业的开发人员来说,把鸡蛋放在 Python 这个篮子里不但是安全的,而且是必须的。或者换个方式说,如果你将来想在这个行业混,什么都不用想,先闭着眼睛把 Python 学会了。当然,Python不是没有它的问题和短处,你可以也应该有另外一种甚至几种语言与 Python 形成搭配,但是Python 将坐稳数据分析和 AI 第一语言的位置,这一点毫无疑问。 我甚至认为,由于 Python 坐稳了这个位置,由于这个行业未来需要大批的从业者,更由于Python正在迅速成为全球大中小学编程入门课程的首选教学语言,这种开源动态脚本语言非常有机会在不久的将来成为第一种真正意义上的编程世界语。下面分享一个python实现人工智能的代码的脚本,进行AI人工智能python实现人机对话: Python作为人工智能首选编程语言,你能了解多少呢?【实现思路】 AIML AIML由Richard Wallace发明。他设计了一个名为 A.L.I.C.E. (Artificial Linguistics Internet Computer Entity 人工语言网计算机实体) 的机器人,并获得了多项人工智能大奖。有趣的是,图灵测试的其中一项就在寻找这样的人工智能:人与机器人通过文本界面展开数分钟的交流,以此查看机器人是否会被当作人类。 本文就使用了Python语言调用AIML库进行智能机器人的开发。 本系统的运作方式是使用Python搭建服务端后台接口,供各平台可以直接调用。然后客户端进行对智能对话api接口的调用,服务端分析参数数据,进行语句的分析,最终返回应答结果。 当前系统前端使用HTML进行简单地聊天室的设计与编写,使用异步请求的方式渲染数据。 【开发及部署环境】 开发环境:Windows 7 ×64 英文版 JetBrains PyCharm 2017.1.3 x64 测试环境:Windows 7 ×64 英文版 部分代码: Python作为人工智能首选编程语言,你能了解多少呢?Python作为人工智能首选编程语言,你能了解多少呢?Python作为人工智能首选编程语言,你能了解多少呢?这是部分代码展示。如果十五年之后,所有40岁以下的知识工作者,无分中外,从医生到建筑工程师,从办公室秘书到电影导演,从作曲家到销售,都能使用同一种编程语言进行基本的数据处理,调用云上的人工智能 API,操纵智能机器人,进而相互沟通想法,那么这一普遍编程的协作网络,其意义将远远超越任何编程语言之争。目前看来,Python 最有希望担任这个角色。 ...

April 25, 2019 · 1 min · jiezi

对编程零概念如何接触学习python

Python 是一种面向对象、解释型计算机程序设计语言,由Guido van Rossum 于1989年底发明,第一个公开发行版发行于1991年,Python 源代码同样遵循GPL(GNU General Public License)协议。Python 语法简洁而清晰,具有丰富和强大的类库。 对编程零概念,如何接触学习python?我们通常称 Python 为胶水语言,他能够轻松的把其他语言编写的模块联结在一起(特别是C/C++),正式因为 Python 有着简洁优雅,开发效率高的优点,它被广泛应用于网站开发,网络编程,图形处理,科学计算,机器学习,网络爬虫等等。Python学习关注,但是也是因为 Python 的用处太过于广泛,这就导致了很多的小白并不能明确自己的学习方向导致自己学的很杂乱,造成了技能范围广但是并没有什么高度的情况,所以我们要明确自己的学习方向,我们归纳了一下,学习Python可以做以下几个方向的工作:如果你想要学好Python可以加入一个组织,这样大家学习的话就比较方便,还能够共同交流和分享资料,给你推荐一个学习的组织学习有可学习有困难或者想获取Python资料请加Python学习Q群629440 234,互相学习,互相分享学习资料 对编程零概念,如何接触学习python?在不同方向上,有不同的技能需求。选择自己最爱的方向学,才能早日跳坑。我们就给大家说一下后端开发方向的学习路线,按我整理的路线勤奋学习,相信你不日就会拥有 Python 后端开发的能力。 对编程零概念,如何接触学习python?值得庆幸的是,专门介绍软件,工具及网站服务的技术Blog上CarlCheo绘制了一张图表,告诉你该怎么开始伟大的码农航道。 对编程零概念,如何接触学习python?第一阶段:Python入门 数据类型 流程控制 常用模块 函数、迭代器、装饰器 递归、迭代、反射 面向对象编程 更高级的技能就不说了,最起码这几个你必须得烂熟于心。 这一阶段在我看来没什么难度, 不过面向对象编程的思想需要仔细体会。 第二阶段:WEB前端基础 学习一点前端的内容,既然我们要从事 Web方 向的开发,那么 Web 开发肯定是离不开前端页面的,虽然说企业都有专职的前端工程师,但是我们要求后端工程师也需要具备一定的前端知识,这对提升你的综合竞争力有很大的帮助,而且 HTML 相较于 Python 要简单一些,有助于树立你的学习信心,如果一开始就被难到了,那相信你的学习热情马上就会被浇灭的。 Html/CSS 基础 Dom 编程 原生 JS 学习 JQuery、EasyUi、AngulaJS Ajax 异步加载 Highchart 画图 Bootstrap 第三阶段:网络编程 Socket C/S编程、Twisted 异步网络框架 多线程、多进程、携程 gevent 、selectpollepoll FTP 服务器开发 批量命令、文件分布工具 RabbitMQ 消息队列、SqlAlchemy ORM ...

April 24, 2019 · 1 min · jiezi

15个Python库让你学习数据科学更轻松

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:10min 在过去的五年中,Python已成为数据科学界的一大热门 。因此,它正在慢慢接管R--“统计学术语” - 作为许多工具的首选工具。最近发布的Stack Overflow Developer Survey 2018表明, Python是下一个重要的编程语言,它在业界的应用将不断增加。Python的崛起令人震惊,但并不令人惊讶。它的通用性,再加上效率和易用性,使您可以更轻松地构建数据科学。您还可以使用丰富的Python库来处理所有与数据科学相关的任务,从基本的Web抓取到训练深度学习模型等复杂的任务 。在本文中,我们将介绍一些最流行和最广泛使用的Python库及其应用领域。 网页抓取在网络浏览器的帮助下,网络抓取是使用HTTP协议从网络上流行的信息提取技术。两种最常用的Web抓取工具是基于Python的。 1.Beautiful SoupBeautiful Soup是一个流行的Python库,用于从HTML和XML文件中提取信息。它提供了一种独特,简便的方法来导航,搜索和修改已分析的数据,从而可以节省您不必要的工作时间。它适用于Python的两个版本,即2.7和3.x,并且非常易于使用。 愿码提示Beautiful Soup网址:https://pypi.org/project/beau...2.ScrapyScrapy是一个用Python编写的免费开源框架。虽然开发用于Web抓取,但它也可以用作常规Web爬虫程序并使用不同的API提取数据。遵循Django等框架的“不要重复自己”的理念 ,Scrapy包含一组自包含的爬虫,每个爬虫都遵循具体目标的特定指令。 愿码提示Scrapy网址:https://scrapy.org/ 科学计算与数据分析可以说是最常见的数据科学任务,通过为数据处理和分析以及数学计算提供独特的库,从而证明了对数据科学家来说非常有价值。 3.NumPyNumPy是Python中最受欢迎的科学计算库,它是用于科学计算的更大的Python堆栈的一部分,称为SciPy(下面讨论)。除了在线性代数和其他数学函数中的用途之外,它还可以用作具有任意数据类型的通用数据的多维容器或数组。 NumPy集成了无缝语言(如C / C ++),并且由于它支持多种数据类型,因此它也适用于各种数据库。 愿码提示NumPy网址:http://www.numpy.org/ 4.SciPySciPy是一个基于Python的框架,包含用于数学,科学计算和数据分析的开源库 。SciPy库是用于高级数学计算,统计等的算法和工具的集合。SciPy堆栈包含以下库:· NumPy - 用于数值计算的Python包· SciPy - SciPy堆栈的核心软件包之一,用于信号处理,优化和高级统计· matplotlib - 用于数据可视化的流行Python库· SymPy - 符号数学和代数库· pandas - 用于数据操作和分析的Python库· iPython - 用于运行基于Python的代码的交互式控制台 愿码提示SciPy网址:https://www.scipy.org/index.html 5.Pandaspandas是一个广泛使用的Python包,提供有效数据操作和分析的数据结构和工具。它是一种广泛使用的定量分析工具,在算法交易和风险分析中发现了很多应用。拥有庞大的专用用户社区,定期更新pandas以获得新的API更改,性能更新和错误修复。 愿码提示pandas网址:https://pandas.pydata.org/ 机器学习和深度学习Python在实现高效的机器学习和深度学习模型方面胜过所有其他语言 ,仅凭借其多样化,有效且易于使用的库集。在本节中,我们将看到一些最流行和最常用的Python库,用于机器学习和深度学习: 6.Scikit-learnscikit-learn是用于数据挖掘,分析和机器学习的最流行的Python库。它使用NumPy,SciPy和matplotlib的功能构建,并且在商业上可用。您可以使用scikit-learn实现各种机器学习技术,例如分类,回归,集群等且非常易于安装。 愿码提示scikit-learn网址:https://scikit-learn.org/stable/ 7.TensorflowTensorflow是一个基于Python的框架,用于使用多个CPU或GPU进行有效的机器学习和深度学习。由Google支持,最初由Google Brain的研究团队开发,是世界上广泛使用的机器智能框架。它得到了大量活跃用户的支持,并且正在广泛应用于各种工业领域的先进机器学习,从制造和零售到医疗保健和智能汽车。 愿码提示Tensorflow网址:https://www.tensorflow.org/ 8.KerasKeras是一个基于Python的神经网络API,提供了一个简化的界面,可以轻松地训练和部署您的深度学习模型。它支持各种深度学习框架,如Tensorflow,Deeplearning4j和CNTK且非常人性化,遵循模块化方法,支持基于CPU和GPU的计算。如果您想让深度学习过程更简单有效,那么这个库绝对值得一试! 愿码提示Keras网址:https://keras.io/ 9.PyTorchPyTorch是Python深度学习系列的最新成员之一,它是一个具有强大GPU支持的神经网络建模库。尽管仍处于测试阶段,但该项目得到了Facebook和Twitter等大人物的支持。PyTorch建立在另一个流行的深度库Torch的架构之上,以实现更高效的张量计算和动态神经网络的实现。 愿码提示PyTorch网址:https://pytorch.org/ 自然语言处理自然语言处理涉及设计处理,解释和分析人类语言,口头或书面的系统。Python提供了独特的库,用于执行各种任务,例如使用结构化和非结构化文本,预测分析等等。 10.NLTKNLTK是一个流行的语言处理Python库。它为各种NLP任务提供了易于使用的界面,例如文本分类,标记化,文本解析,语义推理等等。它是一个开源的,社区驱动的项目,并且支持Python 2和Python 3。 ...

April 23, 2019 · 1 min · jiezi

阿里云首次在ASPLOS19发布重磅论文揭秘帮助ECS快速迭代的热升级技术

摘要: 阿里云首次在ASPLOS上发表论文,第24届ACM编程语言和操作系统(ASPLOS'19),于2019年4月13日至17日,在普罗维登斯召开,阿里云高级技术专家郑晓代表团队在会上发表了技术报告。第24届ACM编程语言和操作系统(ASPLOS'19),于2019年4月13日至17日,在普罗维登斯召开,阿里云高级技术专家郑晓代表团队在会上发表了技术报告。 论文主题为《Fast and Scalable VMM Live Upgrade in Large Cloud Infrastructure》,作者是张献涛,郑晓,沈益斌等。这篇论文被计算机系统结构的顶级会议ASPLOS'19接受,是业界对于VMM热升级这项突破性技术的认可。 论文ACM下载地址:https://dl.acm.org/citation.cfm?id=3304034PDF下载地址:https://yq.aliyun.com/download/3532 该论文系统的阐述了当前云计算领域面临的基础架构带业务热升级问题。提出了一种新型的,比热迁移更行之有效的方法,特别适合超大规模集群范围的使用,解决了困扰云计算行业多年的问题。该方案在阿里云大规模采用,服务百万级别的客户虚拟机数量。论文解决了在客户业务不中断的情况下以毫秒级的速度更换底层虚拟化组件。 阿里云热升级技术特点决定了可以同时热升级任意数量任意规格的虚拟机,并且升级时间恒定。更难得的是,在业界尚未有异构计算设备热迁移方案的情况下,阿里云热升级技术同时支持异构计算等以设备直通方式工作的虚拟机。帮助ECS在过去五年进行了快速的升级迭代,保障了产品和业务的快速奔跑。 ASPLOS(编程语言和操作系统的体系结构支持会议)会议全称为ACM International Conference on Architectural Support for Programming Languages and Operating Systems,是综合体系结构、编程语言和操作系统三个方向的计算机系统领域顶级会议,为CCF A类会议。从1982年创办至今的三十多年里,ASPLOS推动了多项计算机系统技术的发展,包括(但不限于)RISC、RAID、大规模多处理器、Cluster架构和网络存储等。 本文作者:阿里云头条阅读原文 本文为云栖社区原创内容,未经允许不得转载。

April 23, 2019 · 1 min · jiezi

关于Python的未来

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码Python是世界上发展最快的编程语言。今年的Stack Overflow调查结果显示,Python增长的速度如此之快,它是一种可访问且功能强大的语言,足以解决从统计到构建API等各个领域的问题。那么Python的未来是怎样的?它将如何发展以满足不断增长的工程师和分析师群体的需求? Python将衍生出其他更专业的语言Steve Holden,全球压力指数首席技术官,前PSF主席兼董事 :我不确定语言的发展方向。在我看来,Python现在处于足够复杂的阶段。Python并没有像我认为的Java环境那样膨胀。在那个成熟的层次上,我认为Python的思想更有可能衍生出其他的,也许更专业的,针对特定应用领域的语言。我不希望所有程序员都使用Python,语言的选择应以实用为依据。 我从来都不是一个推动变革的人。足够多的聪明人已经在考虑这个问题了。因此,当我认为事情变得有点太深奥时,我通常会潜伏在Python-Dev上,偶尔从消费者的角度插入一个观点。 Python社区的需求将影响语言未来的发展方向Carol Willing,Python基金会前任主任,CPython核心开发人员,Project Jupyter研究软件工程师: 我想我们将继续看到Python的科学编程部分的增长。因此,支持Python作为语言和异步稳定性的性能将继续发展。除此之外,我认为Python是一种非常强大而可靠的语言。即使你今天停止开发,Python也是一种非常好的语言。Python社区的需求将反馈到Python并影响语言的发展方向。移动开发长期以来一直是Python的致命弱点。我希望BeeWare的一些东西可以帮助进行交叉编译。但如果有需要,Python可以帮你解决。 我认为这种语言将继续朝着Python 3的方向发展。一些大的代码库,比如Instagram,现在已经从Python 2转换为3,虽然有很多Python 2.7代码仍在生产中,但有很大的进步,由Instagram共同完成,他们在PyCon 2017主题演讲中分享了这些内容。 围绕Python 3和测试工具的越来越多,公司将一些遗留代码迁移到Python 3的风险较小,因为它具有商业意义。它会因公司而异,但在某些时候,业务需求(如安全性和可维护性)将开始推动向Python 3的更大迁移。如果您要开始一个新项目,那么Python 3是最佳选择。新项目,特别是在查看微服务和人工智能时,将进一步推动人们使用Python 3。 构建大型Python代码库的组织正在采用类型注释来帮助新开发人员Barry Warsaw,LinkedIn的Python基金会团队成员,GNU Mailman的前项目负责人: 在某些方面,很难预测Python的发展方向。我已经参与Python已有23年了,而且我无法在1994年预测到今天的计算世界会是什么样子。 我关注的是手机、物联网设备,以及今天计算的整个图景,包括云等。所以即使是5年后,也没有真正的方法来预测Python会是什么样子。 我确实认为Python的未来仍然很光明,但是我认为Python,尤其是CPython,它是用C语言实现Python的,有很多挑战,任何存在了这么久的语言都将面临一些挑战。Python是在90年代被发明出来解决问题的,现在的计算世界已经不同了,而且还将变得更加不同。Python面临的挑战包括性能和多核或多线程应用程序。肯定有人在从事这方面的工作,Python的其他实现可能会像PyPy、Jython或IronPython一样涌现出来。 除了各种实现所面临的挑战之外,Python作为一种语言还有一个优势,那就是它可以随着人类的规模扩展。例如,您可以让一个人在他们的笔记本上编写一些脚本来解决他们遇到的特定问题,Python也可以扩展到一个小型开源项目,可能有10或15人参与。Python可以扩展到数百名从事大型项目的人员,或者数千名从事大型软件项目的人员。 Python作为一种语言的另一个惊人的优势在于,新的开发人员可以轻松地进入,轻松的学习并快速提高工作效率。他们可以为他们以前从未见过的项目提取全新的Python源代码,深入学习并轻松快速地掌握它。随着Python在人类尺度上的扩展存在一些挑战,我觉得这些问题正在通过类型注释来解决。 在非常大的Python项目中,包含初级开发人员和高级开发人员,初级开发人员要理解如何使用现有库或应用程序可能需要花费大量的精力,因为它们来自一种更静态类型的语言,因此,许多正在构建大型Python代码库的组织都采用了类型注释,这可能不是为了提高应用程序的性能,而是为了帮助新开发人员入门。我认为这对于帮助Python在人类规模上继续扩展大有帮助。 对我来说,Python语言的扩展能力和Python社区的友好特性是使Python即使在23年后仍然具有吸引力的两个因素。如果我们解决了其中一些技术上的限制,这些是完全可以做到的,那么我们实际上是在为Python未来20年的成功和发展做准备。

April 22, 2019 · 1 min · jiezi

学习Python编程的书籍Top7

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:9minPython是最受欢迎且不断增长的编程语言之一,主要是因为它的简单性和广泛的适用性可以解决一系列问题。不论是初学者还是有经验丰富的开发人员都希望能够熟练地使用Python。初级Python书籍《Learning Python》作者:Fabrizio Romano本书探讨了编程的基本知识,涵盖了数据结构,同时详细说明了如何操作。它讨论程序中的控制流,并教你如何编写干净和可重用的代码。揭示了不同的编程范例,并向您展示了如何优化性能以及如何有效地调试代码。本书内容长达450页,涵盖了十二个经过深思熟虑的章节。您将掌握关于Pyqt的函数、内存管理和GUI应用程序开发等相关内容。关于作者Fabrizio有十多年开发软件的经验。他拥有帕多瓦大学的计算机科学工程硕士学位,同时也是一名经过认证的Scrum硕士。他曾在EuroPython和Skillsmatter上发表了演讲。采取的方法这本书很容易理解,并采用了一个示例驱动的方法。当你读完本书时,你将能够用Python构建一个网站。即使是新手也可以毫不费力地遵循这些示例。《Learning Python》作者:Mark Lutz这是关于Python的最畅销书籍之一,适合初学者以及已经具备使用其他语言经验的开发人员。虽然这本书超过1,500页,涵盖41个章节的内容,但其内容清晰易读,在必要时提供了很好的示例。您将看到从python语法到函数、模块、oop等等的深入内容。关于作者自1992年以来一直使用Python。他是世界着名的Python培训师,并为大约4,000名学生教授了近260个虚拟和现场Python课程。采取的方法这本书附有有用的插图,测验和练习,涵盖了最近在现代Python中变得越来越普遍的一些高级语言功能。中级Python书籍《Modern Python Cookbook》作者:Steven Lott对于那些已经精通Python编程的人来说,这是一本很好的书。本书旨在帮助开发人员解决他们在应用程序开发过程中遇到的最常见问题 。本书分为824页,分为13章,涵盖与数据结构,OOP,函数式编程以及统计编程相关的问题的解决方案。关于作者Steven拥有超过40年的编程经验,其中十多年来一直使用Python。他写了几本关于Python的书,并创建了一些教程视频。史蒂文的写作风格令人羡慕,因为他既能吸引读者的注意力,又能通过他的书传授大量的知识。他也是一个非常热情的演讲者,尤其是在分享知识方面。采取的方法本书采用基于配方的方法; 介绍Python开发人员面临的一些最常见的问题,并提供快速有用的解决方案。这本书描述了方式和原因,将使您能够使用灵活的日志记录、强大的配置、命令行选项、自动单元测试和良好的文档创建应用程序。《Python Crash Course》作者:Eric Matthes这实际上介于初级和中级之间,采用了快节奏,无懈可击的方法。如果您是编程小白,那将很难理解。这本书长560页,涵盖20章。它涵盖了从NumPy和matplotlib等Python库到构建2D游戏甚至是数据和可视化工作的主题。总而言之,它是一个完整的包!关于作者Eric Matthes是一名高中数学和科学老师。他有超过十年的编程经验,是一位教学爱好者,总是愿意分享他的知识。他每年秋天都会教授“编程入门”课程。采取的方法这本书有很多项目可供选择,以满足广大读者计划使用Python解决编程问题的需求,仔细地涵盖了Python 2和3。《Fluent Python》作者:Luciano Ramalho本书将带您了解Python的核心语言特性和库,并向您展示如何在同一时间缩短、加快和提高代码的可读性。这本书共有近800页,共21章。关于作者Luciano Ramalho是Python软件基金会的成员,也是巴西第一个黑客空间Garoa Hacker Clube的联合创始人。自1998年以来,他一直在使用Python。他曾在巴西媒体,银行和政府部门教授Python Web开发,并在PyCon US,OSCON,PythonBrazil和FISL上发表演讲。采取的方法这本书主要是基于语言特性,这些特性要么是Python独有的,要么在许多其他流行的语言中找不到。它涵盖了核心语言和一些库。它有一个非常全面的方法,几乎涉及pythonic语言的每一个方面。高级Python书籍《The Hitchhiker’s Guide to Python》作者:Kenneth Reitz & Tanya Schlusser这不是一本教Python的书。相反,这本书向有经验的开发人员展示了在何处、何时以及如何使用Python来解决问题。本书包含一系列最佳实践列表以及如何将这些实践应用到实际的Python项目中。它的重点是为编写好的Python代码提供很好的建议。它分为11章共338页。关于作者Kenneth Reitz是Python Software Foundation的成员。直到最近,他还是Heroku的Python产品所有者。他是多个会议的知名演讲者。Tanya是一位独立顾问,拥有超过二十年的六种语言经验。她是芝加哥Python用户组,芝加哥PyLadies的积极成员,并且还为学生和行业分析师提供 数据科学培训。采取的方法本书讨论了构建Python应用程序的最佳工具和技术。它是一本关于最佳实践的书,涵盖了如何编写和发布高质量代码,并且非常有见地。本书专注于数据持久性,数据操作,Web,CLI和性能等功能的python库/框架。《Secret Recipes of the Python Ninja》作者:Cody Jackson这是一本独一无二的书。同样,本书不会教你Python编程,相反它会向你展示一些你可能不知道的Python的技巧。在将近400页的篇幅中,这本书通过研究模块的实际工作方式,揭示了与标准库实现相关的秘密。你会在CPython解释器之类的网站上找到有趣的话题,这是一个秘密黑客的宝库,没有多少程序员知道,Pypy项目,并且探索最新版本的PEP来发现一些有趣的黑客。关于作者Cody Jackson是一位退伍军人,也是IT商业管理咨询公司Socius Consulting的创始人。自1994年以来,他一直从事科技行业。他是一位自学成才的Python程序员,也是“使用Python学习编程”一系列书的作者。他总是充满了改进编码方式的想法和方法,并通过本书准确地传递了内容。采取的方法本书采用基于配方的方法,在您面前提出问题,然后向您展示如何使用Python来解决它。无论您是Python新手还是专家,您都可以在本书中找到有趣的内容。很容易理解,并且没有花时间进行冗长的解释。关于学习Python,你有什么更好地推荐吗?请在下方留言

April 19, 2019 · 1 min · jiezi

终极讲师介绍:集齐 27 位讲师召唤亚洲首届 Rust 开发者大会!

RustCon Asia 进入倒计时!就在这个周六,将有 300+ 位开发者齐聚北京,参加亚洲最大的 Rust 语言开发者大会 RustCon Asia。此次大会几乎将聚集全部 Rust 中国社区的资深开发者和已在生产环境应用的中国本土的 Rust 项目,以及来自亚洲之外的欧洲、澳洲、北美的顶尖开发者们。大家都约好面基了吗?时间:4 月 20 -23 日大会地点: 北京朝阳区广顺南大街 8 号 · 北京望京凯悦大酒店Workshop 地点: 北京朝阳区大望京科技商务园区浦项中心A座之前我们发布了「大神面基指南(一)」介绍了 8 位明星讲师,今天我们继续为大家介绍 19 位重量级讲师和他们的议题,快来看看有没有你感兴趣的吧!ALEX:资深软件工程师,企业独立咨询师,技术书籍译者、作者Alex 将会在 RustCon Asia 进行两场主题分享。在 talk 环节,Alex 将会为大家介绍 Rust 基础,主题为「How to learn Rust efficiently」,听完后想必会对“Rust 学习曲线高”的真正原因有所了解。在 workshop 环节,Alex 将会带来「Rapid Development of RESTful microservices using actix-web and diesel」主题分享,在该分享中,会以 TodoList 为例,讲讲使用 Actix-web 和 Diesel 来实现微服务接口服务。ROBOTXY:阿里妈妈,Rust 开发工程师Robotxy 将跟大家分享当前他正在做的手淘首焦混竞项目,在高性能、高稳定性的需求场景下使用 Rust 的实践经验。该项目到目前为止已经稳定运营两年多,还经历过双十一的考验。在这个过程中,遇到了很多的问题, 必然是大家学习借鉴 Rust 在生产环境中的好案例。ZIMON DAI:阿里云城市大脑,Rust 开发工程师本次大会上,将会分享 Actor 系统。Actor 系统是 Rust 目前流行的应用方向(如 actix)。Zimon 用 Rust 编写了分布式的 Actor 系统框架 UPS,并在此基础上开发大规模的运算系统。这次大会上,他将会着重分享设计分布式的 Actor 系统中的几个关键技术问题。听完这个 talk,想必大家也可以轻松编写出符合自己需要的简单 Actor 系统。而且,据说很快开源。WAYSLOG:Bilibili 高级中间件开发工程师Wayslog 将会在本次 RustCon Asia 大会带来两个主题分享。在 talk 环节,他将会分享「Rust at Bilibili 」,介绍 Bilibili 在应用 Rust 过程中遇到的问题和处理方法。据说,只要胆子大, 他可以手把手教你写 Rust。在 workshop 环节,Wayslog 则会带大家一起做一个简单的 RESP parser。OLIVIA HUGGER:RustBridge 组织者在 workshop 中,Olivia 将会手把手教大家编写 Rust。第一部分重点介绍 Rust 语言的语法和语义,并将 Rust 与其他语言的编程概念联系起来,特别是流行的脚本语言,如 JavaScript 或 Ruby。然后还会有一个交互式演示, 以及使用 Rustling 进行指导和自我指导练习。丁羽:北京大学计算机博士,X-Lab 高级安全研究员本次 RustCon Asia,丁羽会和孙茗珅会在 Workshop 上,围绕「Build a Secure and Trusted Framework in Rust」深入介绍用 Rust 构建一个安全可信框架,一步步引导大家学习和讨论。此次 X-Lab Workshop 将会在两个方面带大家一起玩 Rust:SGX 和 Trustzone。丁羽和孙茗珅老师会就可信任计算理论和硬件辅助信任执行引擎做介绍,然后就是 hands on 时间!带大家在 Rust+SGX 和 Rust+Trustzone 编程实践和最后的讨论!有兴趣的同学请做好功课哦。Ilya Baryshnikov:Rust 开发工程师在 talk 环节,Ilya 将介绍 WebAssembly 提供几个在 React + three.js app 中的「heavy computations」实例,并且比较 JS 和 Rust 的性能。然后,Ilya 将会分享 Rust 和 WebAssembly 运用到 App 中的经验。带大家一起讨论 wasm-bindgen 库将会如何帮助你与 JS 世界通信,并且减少引用。在 workshop 环节,Ilya 将会讨论更多关于 Rust 和 WebAssembly 的细节,并且就两个主题:moving computations to WASM 和 DOM maniputations 深入交流。Gautam Dhameja:作家,Rust 开发工程师本次大会,Gautam 将会为我们带来主题为「Building a blockchain using Rust with Parity Substrate」的 Workshop。在这个 workshop 中,Gautam 会教大家学习使用 Rust 来构建一个自定义、高效和模块化的区块链,包括 Substrate 框架介绍,如何使用其进行开发以及案例演示。XIDORN QUAN:Mozillian,Gecko developer在这次 RustCon Asia 大会上,Xidorn 将会给大家带来「Re: Zero-writing a custom derive」的主题分享。自定义派生代码对于新入门的开发者来说是一个挑战,但不得不说是一个非常有用的工具,可以让人们在完成更多事情的同时编写更少的代码,在 Servo 样式系统中被广泛使用。这次主题分享将简要介绍如何在 Servo 样式系统中使用自定义派生代码,并描述如何从头开发自定义派生代码。HAWKINGREI:Bilibili 中间件开发工程师在主题演讲环节,Hawkingrei 将会分享 Bilibili 在应用 Rust 过程中遇到的问题和处理方法。在 workshop 环节,他将和 Wayslog 老师一起学手把手带大家学习 Rust ffi,从入门到精通,使你可以 bindgen 任何 c/c++ 库,同时可以对 c/c++ 进行一定的包装。DRIFTLUO:Rust 开发工程师P2P 是区块链网络的基础,是不应被忽视的部分。这次大会上,Driftluo 将介绍 P2P 项目库,从初衷到实现的过程,以及未来的发展、可能遇到的障碍。宁志伟:秘猿科技研究员,编程语言爱好者在本次大会中,志伟将为我们带来「Rust at Cryptape」的 Workshop,同时,志伟欢迎所有对 Rust 感兴趣伙伴的参与。如果您对区块链感兴趣,也可以在 workshop 过程中,和志伟进行讨论。另外,志伟会和 Ana 一起主持此次大会哦!屈鹏:TiKV 研发工程师这次 RustCon Asia 大会,屈鹏将带来的主题为「Futures in TiKV」演讲。Rust 凭借出色的编译期内存管理及对 C 的无缝兼容成为系统编程的最佳候选者。屈鹏所在的团队使用 Rust 从零开始研发了整个 TiKV,其中大量的并行处理逻辑都基于 futures-rs 库。本次演讲中,屈鹏将会介绍 futures-rs 在 TiKV 中的基本用法,以及如何自行构建类似的并发模型等较高级的主题。唐威:Parity 开发工程师,SputnikVM 和 Rux microkernel 的作者,ETC 团队的 Rust 开发者在本次演讲中,唐威将会和我们分享他实现 libsecp256k1 的经验。libsecp256k1 是一个在 no_std 环境中运行的纯 Rust 代码库,它能提供完整的 secp256k1 签名和验证功能。WISH:TiKV 研发工程师SHIRLY:TiKV 核心开发工程师Wish 将会和 Shirly一起带来「Integrate rust-prometheus into your application」主题演讲。而在 workshop 中,他们将以 Rust 编写的简单 Web 服务器为例,教开发者如何使用 Rust-prometheus 连续收集应用程序的指标。Ana(hoverbear):TiKV 高级数据库工程师,终身开源贡献者在 RustCon Asia,Ana 将与秘猿科技研究员宁志伟一起主持这次 Rust 社区大会。Ana 是一个对开源社区、技术、教育充满热情的人,Ana 也很爱交朋友,记得在 RustCon Asia 寻找 Ana,并且成为好友吧~唐刘:PingCAP 首席架构师大会的第一位开场讲师就是唐刘老师,据说他会比较含蓄收敛地说一下 Rust in PingCAP,TiKV 从无到有再到逐渐壮大的过程,包括参与贡献的社区伙伴们和过去的面基活动,以及当前 PingCAP 正在做的系列课程等等,给大家暖暖场。吕国宁:RubyChina 的管理员,Ruby Conf China 主办者这一次,作为 RustCon Asia 的发起者和组织者之一,想必 Daniel 也能感受到当年发起 Ruby Conf China 那一份美好的触动。这回在 Rust 社区大会上 Daniel 将会给大家带来主题为「Why RustCon Asia」开场演讲,从一个开源社区长期贡献者和管理者的角度来看当前的 Rust 社区。让我们一起期待 Daniel 会给大家带来怎样的时代感悟吧~此次 RustCon Asia 大会为期四天,包括 20 日全天和 21 日上午的主题演讲和 22-23 日的多个主题 workshop 环节。其中主题演讲讲师来自于国内外资深 Rust 开发者和社区活跃贡献者;workshop 主题将覆盖到 Rust 开发入门和成熟技术栈或产品的实战操作和演示。大会马上到来,小伙伴们敬请期待吧~活动时间:4 月 20-23 日大会地点:北京朝阳区广顺南大街 8 号北京望京凯悦酒店Workshop 地点:北京朝阳区大望京科技商务园区浦项中心A座目前 RustCon Asia 还有少量余票,点击【这里】购买。大会官网:https://rustcon.asia/Twitter @RustConAsia ...

April 19, 2019 · 2 min · jiezi

像数据科学家一样思考:12步指南(下)

摘要: 数据科学家思维到底是什么样的?这篇文章告诉你!像数据科学家一样思考:12步指南(上)像数据科学家一样思考:12步指南(中)第三阶段-完成一旦产品构建完成,你仍然需要做一些事情来使项目更加成功并使你的未来生活更轻松。那么我们如何完成数据科学项目呢?10-交付产品完成阶段的第一步是产品交付。为了创建可以交付给客户的有效产品,首先必须了解客户的观点。其次,你需要选择最佳的方式将项目成果反馈给客户。最后,你必须选择要包含在产品中的信息和结果以及要放弃的内容。在产品创建和交付过程中做出好的选择可以大大提高项目的成功机会。沟通媒介可以采取多种形式。在数据科学中,产品最重要的一个方面是客户是否积极参与产品并且能够使用产品来回答多种可能的问题。具体的沟通媒介有很多方式:向客户提交结果可能是最简单的选项,其中包括文本、表格、图表和其他信息,这些信息可以解决你的项目要回答的部分或全部问题。在一些数据科学项目中,数据集的分析和结果也可用项目原始数据范围之外的数据,其中可能包括原始数据生成的数据、其他不同来源的类似数据、或由于某种原因尚未分析的其他数据。在这种情况下,如果你可以为客户创建可以执行分析新数据集并生成结果的分析工具,对客户有所帮助。同时客户可以有效地使用此分析工具,并继续在将来和各种(但类似的)数据集中回答他们的主要问题,这是最好的情况。如果你想提供比分析工具更好的产品,你可能需要构建某种类型的完整的应用程序。如果你正在考虑提供交互式图形应用程序,那么你必须设计,构建和部署它。通常,这些都不是一项小任务。如果你希望应用程序具有许多功能并且具有灵活性,那么设计它并构建它将变得更加困难。除了决定提供结果的媒介外,你还必须决定它将包含哪些结果。有些结果和内容可能是包含的明显选择,但对于其他信息位,可能不那么明显。通常,你希望包含尽可能多的有用信息和尽可能多的结果,但你希望避免客户可能误解或误用你选择包含的结果。在许多情况下,这可以是微妙的平衡,并且它在很大程度上取决于具体项目以及客户和其他人对结果的知识和经验。11-进行修订产品交付后,我们会在初步反馈后继续修改产品。一旦客户开始使用该产品,就有可能出现一系列全新的问题。尽管你付出了最大努力,但你可能没有预料到客户使用产品的方式的各个方面。即使产品完成了它应该做的事情,你的客户和用户也可能不会做这些事情并且有效地完成这些工作。通常很难从客户、用户或其他任何人那里获得建设性的反馈。因此一些数据科学家提供完产品后就会忘记它们,一些数据科学家提供产品后会选择等待客户提供反馈。进行产品修订可能会非常棘手,找到合适的解决方案和实施策略取决于你遇到的问题类型以及你需要更改以解决问题的方法。如果在整个项目过程中,你始终保持对不确定性和许多可能结果的认识,那么你发现自己现在面临的结果与你之前预期的结果不同可能就不足为奇了。但是,如果你一直勤奋,问题很小,修复相对容易。一旦你发现产品出现问题并弄清楚如何修复产品,仍然需要决定是否修复产品。一些人最初的倾向是每个问题都需要解决,这不一定是真的。如果有理由可以说服你不想进行修复问题,那就需要慎重考虑了,因为如果选择盲目地修复发现的每个问题,那一定会花费大量的时间和精力。12-结束项目数据科学过程的最后一步是将其包装起来。随着数据科学项目的结束,似乎所有的工作都已完成,剩下的就是修复任何剩余的错误,然后才能完全停止思考并继续下一个。但在完成项目调试之前,你可以采取一些措施来增加未来成功的机会,无论是扩展同一个项目还是完全不同的项目。现在有两种方法可以增加你未来成功的机会。一种方法是确保在将来的任何时候你都可以轻松地再次获取该项目并重做、扩展或修改它。通过这样做,你将增加在后续项目中获得成功的机会,所以,你需要从现在开始开始挖掘项目材料和代码并记下你用什么做的或者你是怎么做到的。最实用的方法是通过文档和存储。提高未来项目成功率的第二种方法是尽可能多地从这个项目中学习,并将这些知识带到每个未来的项目中。通过进行项目分解,你可以从中梳理出有用的知识,这包括审查旧目标、旧计划、技术选择、团队协作等。是否可以应用于未来项目,通过项目回溯在事后进行思考,可以帮助发现有用的知识,使你能够以不同的方式做事,并在下次更好。不确定性充斥在我们每个人工作的方方面面,记住过去给你带来问题的所有不确定因素,可以防止类似的事情再次发生。从数据到分析再到项目目标,几乎任何事情都可能在短时间内发生变化。了解所有可能性不仅是一项艰巨的挑战,而且几乎是不可能的。良好的数据科学家和伟大的数据科学家之间的区别在于能够预见可能出现的问题并做好准备。结论数据科学仍然具有新领域的光环。它的大多数组成部分:统计学、软件开发、基于证据的问题解决等等,这些可能是属于旧领域的知识,但数据科学似乎是这些部分的新组合成新的东西。数据科学的核心并不关心特定的数据库实现或编程语言,即使这些对于从业者来说是必不可少的,其核心应该是数据内容,给定项目的目标以及用于实现这些目标的数据分析方法之间的相互作用。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

April 17, 2019 · 1 min · jiezi

Python到底能做什么?

来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时间:11min如果您正在考虑学习Python,或者已经开始学习它,那么您可能会问:“我使用Python到底能做什么?”这是一个很难回答的问题,因为Python有很多应用程序。但随着时间的推移,我发现Python有三个主要的流行应用程序:Web开发数据科学 - 包括机器学习,数据分析和数据可视化脚本Web开发最近基于Python的Web框架(如Django和Flask)在Web开发中变得非常流行。我为什么需要一个Web框架?这是因为Web框架使构建通用后端逻辑变得更容易。这包括将不同的URL映射到Python代码块,处理数据库以及生成用户在其浏览器上看到的HTML文件。我应该使用哪个Python Web框架?Django和Flask是两个最流行的Python Web框架。如果是刚入门,建议你使用其中一个。Django和Flask有什么区别?主要对比:· Flask提供简单,灵活和细粒度控制。它是非特定的(它可以让你决定如何实现它)。· Django提供了一个包罗万象的体验:您可以获得管理面板,数据库接口,ORM [对象关系映射]以及开箱即用的应用程序和项目的目录结构。你应该选择:· Flask,如果您专注于体验和学习机会,或者您想要更多地控制使用哪些组件(例如您想要使用哪些数据库以及如何与它们进行交互)。· Django,如果你专注于最终产品,特别是如果你正在开发一个直接的应用程序,如新闻网站,电子商店或博客,你希望总是有一个单一的,显而易见的方式来做事情。换句话说,如果你是初学者,Flask可能是一个更好的选择,因为它需要处理的组件更少。此外,如果您想要更多自定义,Flask是更好的选择。另一方面,如果你想要直接构建一些东西,Django更符合你的需求。数据科学 - 包括机器学习,数据分析和数据可视化首先,机器学习是什么?解释机器学习的最佳方法是给你一个简单的例子。假设您想要开发一个程序来自动检测图片中的内容。因此,如下图(图1),您希望程序识别出它是一只狗。鉴于下面的另一个(图2),您希望程序识别它是一个桌子。你可能会说,好吧,我可以写一些代码来做到这一点。例如,如果图片中有很多浅棕色像素,那么我们可以说它是一只狗。或者,您可以弄清楚如何检测图片中的边缘。然后,你可能会说,如果有很多直边,那么它就是一张桌子。但是,这种方法很快变得棘手。如果照片中有一只没有棕色头发的白狗怎么办?如果图片只显示表格的圆形部分怎么办?这就是机器学习的切入点。机器学习通常实现一种自动检测给定输入中的模式的算法。你可以给机器学习算法给1000张狗的照片和1000张桌子的照片。然后,它将学习狗和桌子之间的区别。当你给它一张狗或桌子的新图片时,它将能够识别它是哪一个。我认为这有点类似于婴儿学习新事物的方式。宝宝怎么知道一件事看起来像狗,另一件看起来像一张桌子?可能来自一堆例子。你可能没有明确地告诉婴儿,“如果有毛茸茸的东西,有浅棕色的头发,那么它可能是一只狗。”你可能会说,“那是一只狗。这也是一只狗。这是一张桌子。那个也是一张桌子。“机器学习算法的工作方式大致相同。您可以将相同的想法应用于:· 推荐系统(想想YouTube,亚马逊和Netflix)· 人脸识别· 语音识别等应用程序。您可能听说过的流行机器学习算法包括:· 神经网络· 深度学习· 支持向量机· 随机森林您可以使用上述任何算法来解决我之前解释过的图片标注问题。用于机器学习的Python有流行的机器学习库和Python框架。其中两个最受欢迎的是scikit-learn和TensorFlow。· scikit-learn附带了一些内置的更流行的机器学习算法。我在上面提到了其中一些。· TensorFlow更像是一个底层库,允许您构建自定义机器学习算法。如果您刚开始使用机器学习项目,我建议您先从scikit-learn开始。如果你开始遇到效率问题,那么我会开始研究TensorFlow。我该如何掌握机器学习?要掌握机器学习基础知识,我会推荐斯坦福大学或加州理工学院的机器学习课程。请注意,您需要微积分和线性代数的基本知识才能理解这些课程中的一些知识点。然后,用Kaggle练习所学到的东西。这是一个人们竞争为特定问题构建最佳机器学习算法的网站。他们也为初学者提供了很好的教程。那么数据分析和数据可视化呢?列举一个简单的例子:假设您正在为一家在线销售某些产品的公司工作。作为数据分析师,您可以绘制这样的条形图。从这张图中,我们可以看出,男性购买了超过400个单位的产品,女性在这个特定的星期天购买了约350个单位的产品。作为数据分析师,您可能会对这种差异提出一些可能的解释。一个明显可能的解释是,这种产品比起女性更受男性欢迎。另一种可能的解释可能是样本量太小而且这种差异只是偶然造成的。而另一种可能的解释可能是,男性倾向于仅在周日因某种原因购买该产品。为了理解这些解释中的哪一个是正确的,您可以绘制另一个像这样的图。我们不是仅显示星期日的数据,而是查看整整一周的数据。如您所见,从这张图中,我们可以看到这种差异在不同的日子里非常一致。从这个小小的分析中,你可以得出结论,对这种差异最有说服力的解释是,这种产品更容易受到男性的欢迎,而不是女性。如果你看到像这样的图表怎么办?那么,是什么解释了周日的差异?你可能会说,也许男人往往只是因为某种原因在周日购买更多的这种产品。或者,也许只是巧合,周日男人买了更多。所以,这是一个说明数据分析在现实世界中可能是什么样子的简化的例子。使用Python进行数据分析/可视化Matplotlib是最受欢迎的数据可视化库之一。· 很容易上手· 其他一些图书馆,如Seaborn,都是以它为基础的。因此,学习matplotlib将有助于您以后学习这些其他库。我应该如何使用Python学习数据分析/可视化?首先应该了解数据分析和可视化的基础知识,然后从Coursera和Khan Academy等网站学习统计数据的基础知识也会有所帮助。脚本什么是脚本?脚本通常是指编写旨在自动执行简单任务的小程序。举个例子:我曾经在日本的一家小型创业公司工作,我们有一个电子邮件支持系统。这是一个系统,让我们回答客户通过电子邮件发送给他们的问题。当我在那里工作时,我的任务是计算包含某些关键字的电子邮件的数量,以便我们分析收到的电子邮件。我们可以手动完成它,但是,我编写了一个简单的程序/简单脚本来自动执行此任务。实际上,我们当时使用Ruby,但Python也是这类任务的好语言。Python适合这种类型的任务,主要是因为它具有相对简单的语法并且易于编写。用它写一些小东西并测试它也很快。嵌入式应用程序Python可以与Rasberry Pi一起使用。是硬件爱好者中的一种流行应用。游戏您可以使用名为PyGame的库来开发游戏,但它并不是最流行的游戏引擎。你可以用它来建立一个爱好项目,但如果你对游戏开发很认真的话,我个人不会选择它。相反,建议开始使用Unity与C#,这是最受欢迎的游戏引擎之一。它允许您为许多平台构建游戏,包括Mac,Windows,iOS和Android。桌面应用程序您可以使用Tkinter制作一个Python,但它似乎也不是最受欢迎的选择。相反,似乎Java,C#和C ++等语言更受欢迎。最近,一些公司也开始使用JavaScript来创建桌面应用程序。例如,Slack的桌面应用程序是用Electron构建的。它允许您使用JavaScript构建桌面应用程序。就个人而言,如果我正在构建一个桌面应用程序,我会使用JavaScript选项。它允许您重用Web版本中的一些代码(如果有的话)。Python 3还是Python 2?推荐Python 3,因为它更现代,而且在这一点上它是一个更受欢迎的选项。备注:关于后端代码与前端代码的说明(以防您不熟悉这些术语):假设您想制作像Instagram这样的东西。然后,您需要为要支持的每种类型的设备创建前端代码。您可以使用,例如:· 适用于iOS的Swift· 适用于Android的Java· 用于Web浏览器的JavaScript每组代码都将在每种类型的设备/浏览器上运行。这将是一组代码,用于确定应用程序的布局如何,单击按钮时的外观等等。但是,您仍然需要能够存储用户的信息和照片。您需要将它们存储在服务器上,而不仅仅存储在用户的设备上,以便每个用户的关注者都可以查看他/她的照片。这是后端代码/服务器端代码的用武之地。您需要编写一些后端代码来执行以下操作:· 跟踪谁在追随谁· 压缩照片,以免占用太多存储空间· 在发现功能中向每个用户推荐照片和新帐户因此,这是后端代码和前端代码之间的区别。顺便说一下,Python并不是编写后端/服务器端代码的唯一好选择。还有许多其他流行的选择,包括基于JavaScript 的Node.js。

April 16, 2019 · 1 min · jiezi

像数据科学家一样思考:12步指南(中)

像数据科学家一样思考:12步指南(上)7-工程产品下一步是建立统计软件。如果统计是分析和从数据中得出结论的框架,那么软件就是将这个框架付诸行动的工具。数据科学家必须为任何项目做出许多软件选择。如果你有一个喜欢的软件,这通常是一个不错的选择,但是有充分的理由去挑选别的东西。如果你是数据科学或统计软件的新手,或许很难找到一个起点。电子表格和基于GUI的应用程序通常是执行任何类型数据分析的首选。特别是如果数据是表格形式的,例如CSV,并且数据不是太多,那么在电子表格中开始分析就很容易了。此外,如果你需要进行的计算并不复杂,那么电子表格甚至可以涵盖项目的所有软件需求。这里常用的软件工具包括Excel、SPSS、Stata、SAS和Minitab。学习这些中级工具之一的编程语言可能是学习真正的编程语言的一个很好的一步,这些语言本身就非常有用。特别是SAS在统计行业中拥有广泛的追随者,学习它的语言本身就是一个合理的目标。MATLAB是一种专有的软件环境和编程语言,而且MATLAB的成本相当高。有些人决定在一个名为Octave的开源项目中复制它。随着Octave的成熟,它在可用功能和功能方面越来越接近MATLAB。除了使用附加软件包(工具箱)的代码之外,用MATLAB编写的绝大多数代码都可以在Octave中工作,反之亦然。总的来说,MATLAB和Octave非常适合在信号处理、通信、图像处理和优化等方面使用大型矩阵的工程师(特别是电气工程师)。R语言是基于贝尔实验室S编程语言创建的。它是开源的,但其许可证比Python和Java等其他流行语言更具限制性,特别是你正在构建商业软件产品时。与MATLAB相比,R中更容易加载和处理不同类型的数据。MATLAB擅长处理表格数据,但一般来说,对于包含标题、混合列类型(整数,小数,字符串等)、JSON和数据库查询的表,R更好。R的另一个优点是开源,开发人员可以更轻松地在他们认为合适的地方为语言和包开发做出贡献。这些开源贡献帮助R大幅增长并扩展了与其他软件工具的兼容性。CRAN网站提供了数以千计的R包,你可以找到你想要进行的分析类型的软件包,这是R语言的最大优势。MATLAB也有包,但不是很多,尽管它们通常非常好。总体而言,对于统计学家和其他追求数据探索性工作而不是在软件行业中构建生产软件的人来说,R是一个不错的选择。Python是一种功能强大的语言,可用于编写脚本和创建生产软件。它更适合非统计任务,例如与其他软件服务集成,创建API和Web服务以及构建应用程序。可能因为Python最初是一种通用编程语言,它有一个强大的面向对象设计框架。尽管Python最初并不是一种专门用于统计的语言,但有些人已经为Python开发了几个软件包,这些软件包提升了它的统计能力,现在足够与R和MATLAB竞争。在使用向量、数组和矩阵时,数值方法的numpy包是必不可少的。软件包scipy和scikit-learn在优化、集成、集群、回归、分类和机器学习等功能中很受欢迎。使用了这三个软件包,Python可以与R和MATLAB的核心功能相媲美,在某些领域,例如机器学习,Python似乎在数据科学家中更受欢迎。对于数据处理,pandas已经变得非常受欢迎。然而,数据科学中最著名的Python包之一是Natural Language Toolkit(NLTK)。它是自然语言处理(NLP)中最受欢迎和最强大的工具。如果有人正在从Twitter、新闻源、电子邮件语料库或其他地方解析和分析文本,那么他们很可能已经使用了NLTK。总的来说,Python非常适合想要进行一些数据科学以及其他一些纯粹的非统计软件开发的人。虽然Java不是脚本语言,不太适合探索性的数据科学,但Java是软件应用程序开发中最著名的语言之一,因此它经常用于分析应用程序开发。导致Java不利于探索性数据科学的许多原因使其更有利于应用程序开发。Java对于探索性数据科学来说并不是很好,但它对于基于数据科学的大规模或生产代码来说非常有用。Java有许多统计库,可用于从优化到机器学习,其中许多都是由Apache Software Foundation提供和支持的。在选择统计软件工具时,请牢记以下标准:灵活性:除了能够执行你想要的主要统计分析之外,如果统计工具可以执行一些相关方法,通常也会有所帮助。通常你会发现你选择的方法并不像你希望的那样好,而且你在这个过程中学到的东西会让你相信一种不同的方法可能会更好。良好的文档:除了常用之外,统计软件工具应该有全面而有用的文档。如果你无法找到一些重要问题的答案,例如如何配置进行线性回归的输入或如何格式化机器学习功能,这是一个不好的迹象。如果大问题的答案不在文档中,那么找到你将不可避免地遇到的更具体问题的答案就更难了。专用:某些软件工具或其软件包是为特定目的而构建的,之后又添加了其他功能。例如,MATLAB和R中的矩阵代数例程在构建语言时是主要关注的问题,因此可以安全地假设它们是全面且健壮的。相比之下,矩阵代数在初始版本的Python和Java中并不是主要关注的问题,因此这些功能稍后以包和库的形式添加。互操作性:如果你正在使用数据库,那么使用可以直接与数据库交互的工具会很有帮助。如果你要根据结果构建Web应用程序,则可能需要选择支持Web框架的工具或者至少可以使用JSON或其他一些Web友好格式导出数据的工具。如果你将在各种类型的计算机上使用统计工具,那么你将希望该软件能够在各种操作系统上运行。许可证:如果你将商业软件用于商业目的,那么使用学术或学生许可这样做具有法律风险。将商业软件(无论是否经过修改)出售给其他人而不确认许可证是否禁止此类软件也是危险的。8-优化产品接下来我们就需要使用补充软件优化产品。我们在上一步中创建的软件工具可以是多功能的,但它们本质上是统计的。软件可以做的不仅仅是统计数据,特别是,有许多工具可用于有效地存储,管理和移动数据。有些可以使计算和分析的每个方面都更快且更容易管理。这里有4种流行的软件,可以使你作为数据科学家的工作更轻松。数据库很常见,在项目期间跨越不同数据库的可能性相当高,特别是如果你要使用其他人的数据。但是,当然不是仅仅接触,而是自己建立一个数据库来帮助你完成项目。最常见的两种类型是关系型(SQL)和非关系型(NoSQL,ElasticSearch),与将数据存储在计算机的文件系统上相比,数据库具有许多优势。大多数情况下,数据库可以提供对数据的任意访问且比文件系统更快,并且它们还可以通过冗余方式扩展,这种方式优于文件系统扩展。高性能计算(HPC)是一个通用术语,适用于需要进行大量计算并且希望尽快完成计算的情况。你可以选择使用超级计算机,计算机集群或图形处理单位(它们非常适合执行高度可并行化的计算)。如果你有权访问,那么HPC是等待PC计算所有需要计算的东西的好选择。使用HPC产品的好处有很多,但是在你选择之前你必须要衡量一下成本。最大的云服务提供商主要是大型科技公司,例如阿里巴巴、谷歌和微软等公司在向公众开放之前都已经拥有大量的计算和存储资源。但他们并不总是将资源用到最大负荷,因此他们决定出租过剩的产能并扩大其收益,结果证明这是一系列有利可图的商业决策。提供的服务通常大致相当于个人计算机,计算机集群或本地网络的功能。所有这些可以在世界各地的地理区域中获得,可通过在线连接和标准连接协议访问,以及通常是Web浏览器界面。如果你没有足够的资源来充分满足你的数据科学需求,你可以选择尝试购买云服务。最后,你可以尝试大数据技术:Hadoop,HBase和Hive等。大数据技术的设计不是为了移动数据,而是当数据集处于非常大的规模时,利用大数据技术可以节省大量的时间和金钱。每当计算任务受数据传输限制时,大数据可以提高效率。但是,与本章中描述的其他技术相比,大数据系统软件需要花费一些精力。9-执行计划构建阶段的最后一步是执行产品的构建计划。大多数软件工程师可能熟悉构建复杂软件的试验和磨难,但他们可能不熟悉构建处理可疑质量数据的软件的难度。另一方面,统计人员知道拥有脏数据的情况,但可能没有建立更高质量软件的经验。同样,与项目相关的不同角色的每个人可能拥有各种经验,并为不同的事情做好准备。如果你是一名统计学家,你会知道有脏数据,而且你知道偏差和夸大结果的重要性。但你可能没有太多经验来构建业务软件,特别是生产软件。你应该咨询具有实践经验的软件工程师,以了解如何提高软件的稳健性。如果你是软件工程师,你知道开发生命周期是什么样的,并且你知道如何在部署和交付之前测试软件。但是你可能不了解数据,无论你在软件设计和开发方面有多好,数据最终都会以你从未想过的方式破坏你的应用程序。这需要在构建软件时采用新的思维模式以及对错误有容忍度,因为它们会频繁地发生。你应该咨询精通预测和处理有问题数据的统计人员,例如异常值,缺失值。如果你刚开始从事数据科学,没有丰富的统计学或软件工程经验,如果你可以向他们解释你的项目和目标,那么有经验的人可以向你提供一些可靠的建议。作为一个初学者,你在这个过程阶段有职责来弥补经验的不足。如果你只是该项目的一个团队成员,那么沟通和协调是至关重要的。你不必了解团队中发生的所有事情,但有必要明确目标和期望,并确保有人管理整个团队。设计计划应包含多个路径和选项,所有这些都取决于项目的结果、目标和期限。无论计划有多好,随着项目的进展,总有可能对其进行修订。即使你考虑到所有不确定因素并且意识到每一种可能的结果,计划范围之外的事情也可能会发生变化。计划需要改变的最常见原因是新信息从项目外部的来源出现,并且计划的一个或多个路径发生变化或目标本身发生变化。随着项目的进展,你通常会看到越来越多的结果积累,让你有机会确保它们符合你的期望。一般而言,在涉及统计的数据科学项目中,期望基于统计显著性的概念或基于这些结果的实际有用性概念。统计意义和实际有用性通常密切相关,当然不是相互排斥的。作为项目计划的一部分,你可能包含了在统计分析结果中达到某种准确性或重要性的目标,实现这些目标将被视为该项目的成功。本文作者:【方向】阅读原文本文为云栖社区原创内容,未经允许不得转载。

April 15, 2019 · 1 min · jiezi

在 RustCon Asia 开启之前,聊聊 Rust 中国社区那些事

亚洲首届 RustCon Asia 将在 4 月 20 日于北京开启(也就是下周六啦~),大会为期 4 天,包括 20 日全天和 21 日上午的主题演讲以及 22-23 日的多个主题 workshop 环节。随着大会渐渐临近,很多小伙伴已经兴奋的搓搓手了,不如今天来聊聊 Rust 中国社区的成长史,再打一波鸡血?Rust 在中国2012 年 1 月 24 日,在中国最大的问答社区「知乎」,名为“题叶”的网友,创建了 「Rust(编程语言)」话题,那时候这门语言还无人问津。2013 年 9 月 16 日,这个知乎栏目的 Logo 才被换成 Rust 的符号, 2016 年增加了对 Rust 的中文介绍,期间陆陆续续添加了一些子话题,发展至今已经有 8000+ 的关注量。而在最新出炉的 Stack Overflow 开发者调查中,Rust 连续 4 年成为最受开发者喜爱的编程语言(https://insights.stackoverflow.com/survey/2019)。这里不得不提到项目方对社区的支持,中国的 Rust 开发者所熟知的两家公司 PingCAP 和秘猿科技一直在致力于 Rust 的推广。2017 年 4 月,PingCAP 在北京举办了 Rust Meetup,邀请到两位 Rust 团队核心成员 Alex Crichton、Brian Anderson,和 PingCAP 首席架构师唐刘一起,与 100 余位 Rust 中国社区的小伙伴进行了深入交流。同年 10 月,PingCAP 邀请 web 框架 Rocket 的作者 Sergio Benitez,首次为中国小伙伴深入介绍这个在 Rust 社区颇受欢迎的 web 框架。通过这两次 Meetup,越来越多的中国社区小伙伴被 Rust 语言所吸引,并开始用 Rust 折腾自己的“小天地”。2018 年的 11 月 7 日,秘猿科技在杭州举办了第一场以 Rust 语言为主题的线下活动,Bilibili 在线直播达到了 2000+ 人同时观看。在杭州的冬季,这一次直播,再次点燃了 Rust 中国社区。2018 年,F001 的新书《深入浅出 Rust》发布,这是第一本正式出版发行的中文原创 Rust 书籍,覆盖了 Rust 大部分的初级和中级知识点。2019 年 1 月 1 日,张汉东老师完成了《Rust 编程之道》的出版,目前在京东上累计评价 700+。另外张汉东老师早期参与运营了 Rust 中文社区,并在Rust.CC 论坛、GitHub 、语雀订阅开通了 Rust 日报。社区小伙伴的加入之后,Rust 日报小组正式成立,不断为大家收集更多海内外最新的开发和社区上的各种信息。除了官方的社区阵地,Rust 社区自发的 This Week in Rust、Rust 日报以及 Slack、Discord 平台上的各地 Rust 小组、微信& QQ 交流群等各种组织也在增长和活跃;国内外知名企业、初创公司在 Rust 应用上的实践文章和书籍出版数量也在不断增长……越来越多的人在自发推进 Rust 语言的快速成长和应用实践,作为一个用来设计取代 C++ 的编程语言,Rust 在未来还将有非常广阔的拓展空间。RustCon Asia 的到来4 月 20 日,在中国北京,秘猿科技和 PingCAP 将携手开启中国首届 Rust 社区大会 —— RustCon Asia。在去年参加完 RustFest 的时候我们遇到了很多 Rust 社区的朋友,获得了来自这些社区的朋友们和 Mozilla 的支持。中国社区的小伙伴激动地说,他最喜欢的两家公司联手了!随着 Rust 的社区的扩大,Rust 语言本身的优势让其在生产环境的应用快速丰富起来,我们看到大大小小的公司都在尝试和实践。在 RustCon Asia,你将看到很多优秀 Rust 项目:蚂蚁金服时序数据库阿里云城市大脑淘宝广告推荐算法字节跳动用 Rust 实现 im sdk百度 X-Lab:Rust-SGXBilibili 中间件知乎搜索引擎秘猿科技的许可链 CITAPingCAP 用 Rust 开发 TiKV公链项目 Nervos、Holochain百度安全实验室的 MesaLink ……这一次,小伙伴们将有机会深度接触来自海内外的二十七位讲师。有社区小伙伴回复说,他觉得 讲师介绍系列 很不错,认真看了每个人的背景故事之后,发现这些讲师比他想象中的更厉害,还有同学说,今天的 Rust 社区很有当年 Ruby 社区的感觉,充满了奇人异事。RustCon Asia 的开启让我们看到 Rust 社区其实比我们想象的更加壮大。这一次,来自国内外的相聚(大型粉丝见面会),一天半的主题演讲和两天三场同时进行的 workshop,相信大家一定会收获到自己想要的知识、近距离接触这些技术大牛,这将是 Rust 中国社区发展史上的重要时刻。一起拥抱 Rust!大会已进入一周倒计时,我们在这里提前感谢前来现场的讲师们、参会的社区小伙伴们,以及此次大会的金牌赞助商百度 X-Lab 和铜牌赞助商量子链、SNZ,以及各位帮助推广的小伙伴们,感谢大家对此次大会的支持!百度 X-Lab官网:https://anquan.baidu.com/百度安全以技术开源、专利共享、标准驱动为理念,联合互联网公司、安全厂商、终端制造商、 高校及科研机构, 推动 AI 时代的安全生态建设,让全行业享受更安全的 AI 所来带来的变革。量子链官网:https://qtum.org/zhQtum 量子链是一个开源区块链项目,是建立在 UTXO 模型之上、采用 PoS 共识机制和去中心化治理机制、且兼容多虚拟机的价值传输网络和智能合约平台。通过打造商业化智能合约、创造可信去中心化应用和提供企业级区块链服务全方位赋能商业生态。SNZ官网:Snzholding.comSNZ 是一家快速发展的加密资产基金、咨询机构和社区建设者。SNZ 团队由一群工程师,技术推广人员和企业家组成,他们对区块链技术抱有一致的信念。SNZ 的使命是发现有价值的项目,为团队带来资源,为生态系统做出贡献。团队正尽最大努力帮助伟大的项目在中国发展业务,并将当地项目和社区与海内外同行连接起来。活动时间:4 月 20-23 日活动地点:北京 · 朝阳广顺南大街 8 号北京望京凯悦酒店大会官网:https://rustcon.asia/Twitter @RustConAsia购票地址:https://www.huodongxing.com/event/6479456003900 ...

April 15, 2019 · 2 min · jiezi

Rust 实战 - 使用套接字联网API (一)

虽然标准库已经封装好了 TcpListener 和TcpStream 等基础api,但作为Rust 的爱好者,我们可以去一探究竟。本文假设你已经对 Rust 和 Linux 操作系统有了一定了解。在 Linux 上 Rust 默认会链接的系统的 libc 以及一些其他的库,这就意味着,你可以直接使用libc中的函数。比如,你可以使用 gethostname 获取你电脑的 “hostname”:use std::os::raw::c_char;use std::ffi::CStr;extern { pub fn gethostname(name: *mut c_char, len: usize) -> i32;}fn main() { let len = 255; let mut buf = Vec::<u8>::with_capacity(len); let ptr = buf.as_mut_ptr() as *mut c_char; unsafe { gethostname(ptr, len); println!("{:?}", CStr::from_ptr(ptr)); }}解释一下上面的代码。extren 表示“外部块(External blocks)”,用来申明外部非 Rust 库中的符号。我们需要使用 Rust 以外的函数,比如 libc ,就需要在 extren 中将需要用到的函数定义出来,然后就可以像使用本地函数一样使用外部函数,编译器会负责帮我们转换,是不是很方便呢。但是,调用一个外部函数是unsafe的,编译器不能提供足够的保证,所以要放到unsafe块中。如果外部函数有可变参数,可以这么申明:extern { fn foo(x: i32, …);}不过 Rust 中的函数目前还不支持可变参数。实际上,这里应该是 extern “C” { .. },因为默认值就是"C",我们就可以将其省略。还有一些其他的可选值,因为这里不会用到,暂且不讨论,你可以去这儿这儿查看。再来说说类型。“gethostname” 函数在 C 头文件中的原型是:int gethostname(char name, size_t len);在 Linux 64位平台上,C中的int对应于Rust中的int,size_t对应Rust中的usize,但C中的char与Rust中的char是完全不同的,C中的char始终是i8或者u8,而 Rust 中的char是一个unicode标量值。你也可以去标准库查看。对于指针,Rust 中的裸指针 与C中的指针几乎是一样的,Rust的mut对应C的普通指针,*const 对应C的const指针。因此我们将类型一一对应,函数的参数名称不要求一致。pub fn gethostname(name: *mut i8, len: usize) -> i32;但是,我们后面会使用CStr::from_ptr()将C中的字符串转换为 Rust 本地字符串,这个函数的定义是:pub unsafe fn from_pt<‘a>(ptr: *const c_char) -> &‘a CStr为了“好看”一点,我就写成了c_char,但是,c_char只是i8的别名,你写成i8也没有问题的。type c_char = i8;你可以看这里。不过,如果你要是考虑跨平台的话,可能需要吧 i32 换成 std::os::raw::c_int,并不是所有平台上C中的int都对应Rust中的i32。不过,如果你没有一一对应类型,一定程度上是可行的,如果没有发生越界的话。比如像这样:use std::os::raw::c_char;use std::ffi::CStr;extern { pub fn gethostname(name: *mut c_char, len: u16) -> u16;}fn main() { let len = 255; let mut buf = Vec::<u8>::with_capacity(len); let ptr = buf.as_mut_ptr() as *mut c_char; unsafe { gethostname(ptr, len as u16); println!("{:?}", CStr::from_ptr(ptr)); }}我把 size_t 和 int 都对应成了 u16,这段代码是可以编译通过,并正确输出你的hostname的,但我建议,你最好是将类型一一对应上,以减少一些不必要的麻烦。当然,你把那个 *mut c_char 换成 *mut i32,也没问题,反正都是个指针,你可以试试:use std::os::raw::c_char;use std::ffi::CStr;extern { pub fn gethostname(name: *mut i32, len: u16) -> u16;}fn main() { let len = 255; let mut buf = Vec::<u8>::with_capacity(len); let ptr = buf.as_mut_ptr() as *mut i32; unsafe { gethostname(ptr, len as u16); println!("{:?}", CStr::from_ptr(ptr as *const i8)); }}你还可以把 Vec::<u8>换成Vec::<i32> 看看结果。int gethostname(char *name, size_t len) 这个函数,是接收一个char数组和数组长度,也可以说成接收缓冲区和接收缓冲区的最大长度。我是创建了一个容量为255的Vec<u8>,将其可变指针转换为裸指针。你也可以创建可以长度为255的u8数组,也没有问题: let len = 255; let mut buf = [0u8; 255]; let ptr = buf.as_mut_ptr() as *mut i32; unsafe { gethostname(ptr, len as u16); println!("{:?}", CStr::from_ptr(ptr as *const i8)); }为什么这样可以,因为Rust的Slice和Vec的底层内存布局,跟C是一样的。(注意,Rust中Slice与Array的关系,就像&str与str的关系)。我们可以看看Vec和Slice在源码中的定义:pub struct Vec<T> { buf: RawVec<T>, len: usize,}pub struct RawVec<T, A: Alloc = Global> { ptr: Unique<T>, cap: usize, a: A,}pub struct Unique<T: ?Sized> { pointer: *const T, _marker: PhantomData<T>,}struct FatPtr<T> { data: const T, len: usize,}Vec是一个结构体,里面包含buf和len两个字段,len用来表示Vec的长度,buf又指向另一个结构体RawVec,其中有三个字段,第三个字段a是一个Tarit,不占内存。cap用来表示Vec的容量,ptr指向另一个结构体Unique,其中的pointer字段就是一个裸指针了,_marker是给编译器看的一个标记,也不占内存,暂时不讨论这个,你可以去看文档。Slice的结构更简单,就一个裸指针和长度。虽然RawVec和Unique在标准库外部是不可见的,但我们还是能用一定的“手段”取出里面值,那就是定义一个内存布局跟Vec一样的结构体,“强行”转换。#[derive(Debug)]struct MyVec<T> { ptr: mut T, cap: usize, len: usize}我定义了一个叫做MyVec的结构体,忽略了Vec中两个不占用内存的字段,他们的内存布局是相同的,在64位平台上都是24(ptr占8个,另外两个usize个8个)个字节。你可以试试:#[derive(Debug)]struct MyVec<T> { ptr: mut T, cap: usize, len: usize}println!("{:?}", std::mem::size_of::<Vec<u8>>());println!("{:?}", std::mem::size_of::<MyVec<u8>>());我先创建一个Vec<u8>,拿到Vec<u8>的裸指针const Vec<u8>,再将const Vec<u8>转换为const MyVec<u8>,之后,解引用,就能得到MyVec<u8>了。不过,解引裸指针是unsafe的,要谨慎!!! 你还可以看看标准库中讲述pointer的文档。fn main() { let vec = Vec::<u8>::with_capacity(255); println!(“vec ptr: {:?}”, vec.as_ptr()); #[derive(Debug)] struct MyVec<T> { ptr: *mut T, cap: usize, len: usize } let ptr: *const Vec<u8> = &vec; let my_vec_ptr: *const MyVec<u8> = ptr as _; unsafe { println!("{:?}", *my_vec_ptr); }}然后编译运行,是否可以看到类似下面的输出呢:vec ptr: 0x557933de6b40MyVec { ptr: 0x557933de6b40, cap: 255, len: 0 }你可以看到,我们调用vec.as_ptr()得到的就是Vec内部的那个裸指针。对于std::mem::size_of 相等的两个类型,你也可以使用std::mem::transmute 这个函数转换,跟上面的通过裸指针间接转换,几乎是等效的,只是会多加一个验证,如果两个类型size_of不相等的话,是无法通过编译的。这个函数是unsafe的。你还可以继续尝试,比如把Vec<u8>转换为长度为3(或者更小更大)的usize数组,像是这样:fn main() { let vec = Vec::<u8>::with_capacity(255); println!(“vec ptr: {:?}”, vec.as_ptr()); let ptr: *const Vec<u8> = &vec; unsafe { let aaa_ptr: *const [usize; 2] = ptr as _; println!("{:?}", (*aaa_ptr)[0] as *const u8); }}不过,由于Rust中Vec的扩容机制,这段代码是存在一定问题的:fn main() { let len = 255; let mut buf = Vec::<u8>::with_capacity(len); let ptr = buf.as_mut_ptr() as *mut c_char; unsafe { gethostname(ptr, len); println!("{:?}", CStr::from_ptr(ptr)); } println!("{:?}", buf);}虽然获取到了正确的主机名,但是之后你打印buf会发现,buf是空的,这个问题留给你去探究。你已经看到,Rust已经变得“不安全”,这又不小心又引入了另一个话题–《 Meet Safe and Unsafe》。不过,还是尽快回归正题,等之后有机会再说这个话题。说起套接字API,主要包括TCP、UDP、SCTP相关的函数,I/O复用函数和高级I/O函数。其中大部分函数Rust标准里是没有的,如果标准库不能满足你的需求,你可以直接调用libc中的函数。实际上,标准库中,网络这一块,也基本是对libc中相关函数的封装。先从TCP开始。TCP套接字编程主要会涉及到socket、connect、bind、listen、accept、close、getsockname、getpeername等函数。先来看看这些函数的定义:// socket 函数用来指定期望的通信协议类型,并返回套接字描述符int socket(int family, int type, int protocol); // 成功返回监听描述符。用来设置监听,出错为-1// family是表示socket使用的协议类型,对于TCP,通常设置为 AF_INET 或AF_INET6,表示IPv4和IPv6// type是创建的套接字类型,TCP是字节流套接字,所以这里设置为SOCK_STREAM,可选的值还有// SOCK_DGRAM用于UDP,SOCK_SEQPACKET用于SCTP// protocol协议的标识,可以设置为0,让系统选择默认值。可选的值有IPPROTO_TCP、IPPROTO_UDP、IPPROTO_SCTP// connect 函数被客户端用来联立与TCP服务器的连接int connect(int sockfd, const struct sockaddr *servaddr, socklen_t addrlen); // 成功返回0 ,出错为-1// sockfd 是由 socket 函数返回的套接字描述符,第二和第三个参数分别指向一个指向套接字地址结构的指针和该指针的长度// bind 函数把一个本地协议地址赋予一个套接字。int bind(int sockfd, const struct sockaddr *myaddr, socklen_t addrlen); // 成功返回0 ,出错为-1// 第二个和第三个参数分别是指向特点于协议的地址结构的指针和指针的长度// listen 函数把一个未连接的套接字转换成一个被动套接字,指示内核应接受指向该套接字的连接请求。int listen(int sockfd, int backlog); // 成功返回0 ,出错为-1// 第二个参数指定内核该为相应套接字排队的最大连接个数。// accept 函数由TCP服务器调用,用于从已完成连接的队列头返回下一个已完成的连接。int accept(int sockfd, struct sockaddr *cliaddr, socklen_t *addrlen); // 成功返回非负描述符,错误返回-1// 第二个和第三个参数用来返回客户端的协议地址和该地址的大小// close 用来关闭套接字,并终止TCP连接int close(int sockfd); // 成功返回0 ,出错为-1// getsockname 和 getpeername 函数返回与某个套接字关联的本地协议地址和外地协议地址int getsockname(int sockfd,struct sockaddr *localaddr,socklen_t *addrlen); // 成功返回0 ,出错为-1int getpeername(int sockfd,struct sockaddr *peeraddr,socklen_t *addelen); // 成功返回0 ,出错为-1还有一对常见的函数,read 和 write 用于读写数据。另外还有三对高级I/O函数,recv/send、readv/writev和recvmsg/sendmsg等需要的时候再加。ssize_t read(int fd, void *buf, size_t count);ssize_t write(int fd, const void *buf, size_t count);除了函数外,还有几个常量和sockaddr这个结构体。常量我们需要在Rust这边定义出来,只定义出需要的:const AF_INET: i32 = 2;const AF_INET6: i32 = 10;const SOCK_STREAM: i32 = 1;const IPPROTO_TCP: i32 = 6;除了sockaddr外,还有几个与之相关的结构体,他们在C中的定是:struct sockaddr{ unsigned short int sa_family; // 地址族 unsigned char sa_data[14]; // 包含套接字中的目标地址和端口信息};struct sockaddr_in{ sa_family_t sin_family; uint16_t sin_port; struct in_addr sin addr; char sin_zero[8];};struct in_addr{ In_addr_t s_addr;};struct sockaddr_in6{ sa_family_t sin_family; in_port_t sin6_port; uint32_t sin6_flowinfo; struct in6_addr sin6_addr; uint32_t sin6_scope_id;};struct in6_addr{ uint8_t s6_addr[16]};struct sockaddr_storage { sa_family_t ss_family; // address family // all this is padding, implementation specific, ignore it: char __ss_pad1[_SS_PAD1SIZE]; int64_t __ss_align; char __ss_pad2[_SS_PAD2SIZE];};然后,需要在Rust中定义出布局相同的结构体:#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct sockaddr { pub sa_family: u16, pub sa_data: [c_char; 14],}#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct sockaddr_in { pub sin_family: u16, pub sin_port: u16, pub sin_addr: in_addr, pub sin_zero: [u8; 8],}#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct in_addr { pub s_addr: u32,}#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct sockaddr_in6 { pub sin6_family: u16, pub sin6_port: u16, pub sin6_flowinfo: u32, pub sin6_addr: in6_addr, pub sin6_scope_id: u32,}#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct in6_addr { pub s6_addr: [u8; 16],}#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct sockaddr_storage { pub ss_family: u16, _unused: [u8; 126]}你需要在结构体前面加一个#[repr(C)]标签,以确保结构体的内存布局跟C一致,因为,Rust结构体的内存对齐规则,可能跟C是不一样的。#[derive(Debug, Clone, Copy)] 不是必须的。对于最后一个结构体sockaddr_storage,我也很迷,我不知道在Rust中如何定义出来,但是我知道它占128个字节,然后我就定义一个长度为126的u8数组,凑够128位。接下来,继续把那几个函数定义出来:extern { pub fn socket(fanily: i32, ty: i32, protocol: i32) -> i32; pub fn connect(sockfd: i32, servaddr: *const sockaddr, addrlen: u32) -> i32; pub fn bind(sockfd: i32, myaddr: *const sockaddr, addrlen: u32) -> i32; pub fn listen(sockfd: i32, backlog: i32); pub fn accept(sockfd: i32, cliaddr: *mut sockaddr, addrlen: u32) -> i32; pub fn close(sockfd: i32) -> i32; pub fn getsockname(sockfd: i32, localaddr: *mut sockaddr, addrlen: *mut u32) -> i32; pub fn getpeername(sockfd: i32, peeraddr: *mut sockaddr, addrlen: *mut u32) -> i32; pub fn read(fd: i32, buf: *mut std::ffi::c_void, count: usize) -> isize; pub fn write(fd: i32, buf: const std::ffi::c_void, count: usize) -> isize;}对于read 和 write 里的参数buf类型void, 可以使用标准库提供的 std::ffi::c_void,也可以是mut u8/*const u8,像是下面这样:pub fn read(fd: i32, buf: *mut u8, count: usize) -> isize;pub fn write(fd: i32, buf: *const u8, count: usize) -> isize;或者,既然void本身是个“动态类型”,也可以传个其他类型的指针进去的,之后你可以试试,不过可能会有点危险。看看目前的代码:use std::os::raw::c_char;use std::ffi::c_void;pub const AF_INET: i32 = 2;pub const AF_INET6: i32 = 10;pub const SOCK_STREAM: i32 = 1;pub const IPPRPTO_TCP: i32 = 6;#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct sockaddr { pub sa_family: u16, pub sa_data: [c_char; 14],}#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct sockaddr_in { pub sin_family: u16, pub sin_port: u16, pub sin_addr: in_addr, pub sin_zero: [u8; 8],}#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct in_addr { pub s_addr: u32,}#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct sockaddr_in6 { pub sin6_family: u16, pub sin6_port: u16, pub sin6_flowinfo: u32, pub sin6_addr: in6_addr, pub sin6_scope_id: u32,}#[repr(C)]#[derive(Debug, Clone, Copy)]pub struct in6_addr { pub s6_addr: [u8; 16],}#[repr(C)]#[derive(Clone, Copy)]pub struct sockaddr_storage { pub ss_family: u16, _unused: [u8; 126]}extern { pub fn socket(fanily: i32, ty: i32, protocol: i32) -> i32; pub fn connect(sockfd: i32, servaddr: *const sockaddr, addrlen: u32) -> i32; pub fn bind(sockfd: i32, myaddr: *const sockaddr, addrlen: u32) -> i32; pub fn listen(sockfd: i32, backlog: i32); pub fn accept(sockfd: i32, cliaddr: *mut sockaddr, addrlen: *mut u32) -> i32; pub fn close(sockfd: i32) -> i32; pub fn getsockname(sockfd: i32, localaddr: *mut sockaddr, addrlen: *mut u32) -> i32; pub fn getpeername(sockfd: i32, peeraddr: *mut sockaddr, addrlen: *mut u32) -> i32; pub fn read(fd: i32, buf: *mut std::ffi::c_void, count: usize) -> isize; pub fn write(fd: i32, buf: *const std::ffi::c_void, count: usize) -> isize;}然后,我们可以写一个简单的服务器和客户端程序:服务器监听一个地址,客户端连接服务器,然后向服务器发送“Hello, server!”,服务器回应“Hi,client!”,客户端收到后断开连接。fn main() { use std::io::Error; use std::mem; use std::thread; use std::time::Duration; thread::spawn(|| { // server unsafe { let socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if socket < 0 { panic!(“last OS error: {:?}”, Error::last_os_error()); } let servaddr = sockaddr_in { sin_family: AF_INET as u16, sin_port: 8080u16.to_be(), sin_addr: in_addr { s_addr: u32::from_be_bytes([127, 0, 0, 1]).to_be() }, sin_zero: mem::zeroed() }; let result = bind(socket, &servaddr as *const sockaddr_in as *const sockaddr, mem::size_of_val(&servaddr) as u32); if result < 0 { println!(“last OS error: {:?}”, Error::last_os_error()); close(socket); } listen(socket, 128); loop { let mut cliaddr: sockaddr_storage = mem::zeroed(); let mut len = mem::size_of_val(&cliaddr) as u32; let client_socket = accept(socket, &mut cliaddr as *mut sockaddr_storage as *mut sockaddr, &mut len); if client_socket < 0 { println!(“last OS error: {:?}”, Error::last_os_error()); break; } thread::spawn(move || { loop { let mut buf = [0u8; 64]; let n = read(client_socket, &mut buf as *mut _ as *mut c_void, buf.len()); if n <= 0 { break; } println!("{:?}", String::from_utf8_lossy(&buf[0..n as usize])); let msg = b"Hi, client!"; let n = write(client_socket, msg as *const _ as *const c_void, msg.len()); if n <= 0 { break; } } close(client_socket); }); } close(socket); } }); thread::sleep(Duration::from_secs(1)); // client unsafe { let socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if socket < 0 { panic!(“last OS error: {:?}”, Error::last_os_error()); } let servaddr = sockaddr_in { sin_family: AF_INET as u16, sin_port: 8080u16.to_be(), sin_addr: in_addr { s_addr: u32::from_be_bytes([127, 0, 0, 1]).to_be() }, sin_zero: mem::zeroed() }; let result = connect(socket, &servaddr as *const sockaddr_in as *const sockaddr, mem::size_of_val(&servaddr) as u32); if result < 0 { println!(“last OS error: {:?}”, Error::last_os_error()); close(socket); } let msg = b"Hello, server!"; let n = write(socket, msg as *const _ as *const c_void, msg.len()); if n <= 0 { println!(“last OS error: {:?}”, Error::last_os_error()); close(socket); } let mut buf = [0u8; 64]; let n = read(socket, &mut buf as mut _ as mut c_void, buf.len()); if n <= 0 { println!(“last OS error: {:?}”, Error::last_os_error()); } println!("{:?}", String::from_utf8_lossy(&buf[0..n as usize])); close(socket); }}调用外部函数是unsafe的,我为了简单省事,暂时把代码放到了一个大的unsafe {} 中,之后我们再把他们封装成safe的API。为了方便测试,我把服务器程序放到了一个线程里,然后等待1秒后,再让客户端建立连接。std::io::Error::last_os_error 这个函数,是用来捕获函数操作失败后,内核反馈给我们的错误。在调用bind 和 connect 函数时,先要创建sockaddr_in结构体,端口(sin_port)和IP地址(s_addr) 是网络字节序(big endian),于是我调用了u16和u32的to_be()方法将其转换为网络字节序。u32::from_be_bytes 函数是将[127u8, 0u8, 0u8, 1u8] 转换为u32整数,由于我们看到的已经是大端了,转换回去会变成小端,于是后面又调用了to_be(),你也可以直接u32::from_le_bytes([127, 0, 0, 1])。然后使用了std::mem::zeroed 函数创建一个[0u8; 8] 数组,你也可以直接[0u8; 8],在这里他们是等效的。接着,我们进行强制类型转换,将&sockaddr_in 转换为const sockaddr_in类型,又继续转换为const sockaddr,如果你理解了一开始“gethostname”那个例子话,这里应该很好理解。这里还可以简写成&servaddr as *const _ as *const _,编译器会自动推导类型。在调用accept函数时,先创建了一个mut sockaddr_storage,同样进行类型转换。之所以用sockaddr_storage 而不是sockaddr_in和sockaddr_in6是因为sockaddr_storage这个通用结构足够大,能承载sockaddr_in和sockaddr_in6等任何套接字的地址结构,因此,我们如果把套接bind到一个IPv6地址上的话,这里的代码是不需要修改的。我还是用std::mem::zeroed 函数初始化sockaddr_storage,它的结构我也很迷惑,所以就借助了这个函数,这个函数是unsafe的,使用的时候要小心。你也可以继续尝试这个函数:let mut a: Vec<u8> = unsafe { std::mem::zeroed() };a.push(123);println!("{:?}", a);在read 和 write 时,同样要类型转换。很多时候,类型根本“强不起来”。OK,这一节的内容就先到这里。 ...

April 14, 2019 · 7 min · jiezi

在Python中实现机器学习功能的4种方法

在Python中实现机器学习功能的4种方法来源 | 愿码(ChainDesk.CN)内容编辑愿码Slogan | 连接每个程序员的故事网站 | http://chaindesk.cn愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。官方公众号 | 愿码 | 愿码服务号 | 区块链部落免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码本文阅读时长:13min在本文中,我们将介绍从数据集中选择要素的不同方法; 并使用Scikit-learn(sklearn)库讨论特征选择算法的类型及其在Python中的实现 :单变量特征选择递归特征消除(RFE)主成分分析(PCA)特征选择 (feature importance)单变量特征选择统计测试可用于选择与输出变量具有最强关系的那些特征。scikit-learn库提供SelectKBest类,可以与一组不同的统计测试一起使用,以选择特定数量的功能。以下示例使用chi平方(chi ^ 2)统计检验非负特征来选择Pima Indians糖尿病数据集中的四个最佳特征:#Feature Extraction with Univariate Statistical Tests (Chi-squared for classification)#Import the required packages#Import pandas to read csv import pandas#Import numpy for array related operations import numpy#Import sklearn’s feature selection algorithmfrom sklearn.feature_selection import SelectKBest#Import chi2 for performing chi square test from sklearn.feature_selection import chi2#URL for loading the dataseturl =“https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians diabetes/pima-indians-diabetes.data”#Define the attribute namesnames = [‘preg’, ‘plas’, ‘pres’, ‘skin’, ’test’, ‘mass’, ‘pedi’, ‘age’, ‘class’]#Create pandas data frame by loading the data from URLdataframe = pandas.read_csv(url, names=names)#Create array from data valuesarray = dataframe.values#Split the data into input and targetX = array[:,0:8]Y = array[:,8]#We will select the features using chi squaretest = SelectKBest(score_func=chi2, k=4)#Fit the function for ranking the features by scorefit = test.fit(X, Y)#Summarize scores numpy.set_printoptions(precision=3) print(fit.scores_)#Apply the transformation on to datasetfeatures = fit.transform(X)#Summarize selected features print(features[0:5,:])每个属性的分数和所选的四个属性(分数最高的分数):plas,test,mass和age。每个功能的分数:[111.52 1411.887 17.605 53.108 2175.565 127.669 5.393181.304]特色:[[148. 0. 33.6 50. ][85. 0. 26.6 31. ][183. 0. 23.3 32. ][89. 94. 28.1 21. ][137. 168. 43.1 33. ]]递归特征消除(RFE)RFE通过递归删除属性并在剩余的属性上构建模型来工作。它使用模型精度来识别哪些属性(和属性组合)对预测目标属性的贡献最大。以下示例使用RFE和逻辑回归算法来选择前三个特征。算法的选择并不重要,只要它技巧性和一致性:#Import the required packages#Import pandas to read csv import pandas#Import numpy for array related operations import numpy#Import sklearn’s feature selection algorithm from sklearn.feature_selection import RFE#Import LogisticRegression for performing chi square test from sklearn.linear_model import LogisticRegression#URL for loading the dataseturl =“https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians-dia betes/pima-indians-diabetes.data”#Define the attribute namesnames = [‘preg’, ‘plas’, ‘pres’, ‘skin’, ’test’, ‘mass’, ‘pedi’, ‘age’, ‘class’]#Create pandas data frame by loading the data from URLdataframe = pandas.read_csv(url, names=names)#Create array from data valuesarray = dataframe.values#Split the data into input and targetX = array[:,0:8]Y = array[:,8]#Feature extractionmodel = LogisticRegression() rfe = RFE(model, 3)fit = rfe.fit(X, Y)print(“Num Features: %d”% fit.n_features_) print(“Selected Features: %s”% fit.support_) print(“Feature Ranking: %s”% fit.ranking_)执行后,我们将获得:Num Features: 3Selected Features: [ True False False False False True True False]Feature Ranking: [1 2 3 5 6 1 1 4]您可以看到RFE选择了前三个功能,如preg,mass和pedi。这些在support_数组中标记为True,并在ranking_数组中标记为选项1。主成分分析(PCA)PCA使用线性代数将数据集转换为压缩形式。通常,它被认为是数据简化技术。PCA的一个属性是您可以选择转换结果中的维数或主成分数。在以下示例中,我们使用PCA并选择三个主要组件:#Import the required packages#Import pandas to read csv import pandas#Import numpy for array related operations import numpy#Import sklearn’s PCA algorithmfrom sklearn.decomposition import PCA#URL for loading the dataseturl =“https://archive.ics.uci.edu/ml/machine-learning-databases/pima-indians diabetes/pima-indians-diabetes.data”#Define the attribute namesnames = [‘preg’, ‘plas’, ‘pres’, ‘skin’, ’test’, ‘mass’, ‘pedi’, ‘age’, ‘class’]dataframe = pandas.read_csv(url, names=names)#Create array from data valuesarray = dataframe.values#Split the data into input and targetX = array[:,0:8]Y = array[:,8]#Feature extractionpca = PCA(n_components=3) fit = pca.fit(X)#Summarize componentsprint(“Explained Variance: %s”) % fit.explained_variance_ratio_print(fit.components_)您可以看到转换后的数据集(三个主要组件)与源数据几乎没有相似之处:Explained Variance: [ 0.88854663 0.06159078 0.02579012][[ -2.02176587e-03 9.78115765e-02 1.60930503e-02 6.07566861e-029.93110844e-01 1.40108085e-02 5.37167919e-04 -3.56474430e-03][ -2.26488861e-02 -9.72210040e-01 -1.41909330e-01 5.78614699e-02 9.46266913e-02 -4.69729766e-02 -8.16804621e-04 -1.40168181e-01[ -2.24649003e-02 1.43428710e-01 -9.22467192e-01 -3.07013055e-01 2.09773019e-02 -1.32444542e-01 -6.39983017e-04 -1.25454310e-01]]特征选择 (feature importance)特征重要性是用于使用训练有监督的分类器来选择特征的技术。当我们训练分类器(例如决策树)时,我们会评估每个属性以创建分裂; 我们可以将此度量用作特征选择器。让我们详细了解它。随机森林是最受欢迎的 机器学习方法之一,因为它们具有相对较好的准确性,稳健性和易用性。它们还提供了两种直接的特征选择方法 - 平均降低杂质和平均降低精度。随机森林由许多决策树组成。决策树中的每个节点都是单个要素上的条件,旨在将数据集拆分为两个,以便类似的响应值最终出现在同一个集合中。选择(局部)最佳条件的度量称为杂质。对于分类,它通常是基尼系数杂质或信息增益/熵,对于回归树,它是方差。因此,当训练树时,可以通过每个特征减少树中的加权杂质的程度来计算它。对于森林,可以对每个特征的杂质减少进行平均,并且根据该度量对特征进行排序。让我们看看如何使用随机森林分类器进行特征选择,并评估特征选择前后分类器的准确性。我们将使用Otto数据集。该数据集描述了超过61,000种产品的93个模糊细节,这些产品分为10个产品类别(例如,时装,电子产品等)。输入属性是某种不同事件的计数。目标是将新产品的预测作为10个类别中每个类别的概率数组,并使用多类对数损失(也称为交叉熵)来评估模型。我们将从导入所有库开始:#Import the supporting libraries#Import pandas to load the dataset from csv filefrom pandas import read_csv#Import numpy for array based operations and calculationsimport numpy as np#Import Random Forest classifier class from sklearnfrom sklearn.ensemble import RandomForestClassifier#Import feature selector class select model of sklearn from sklearn.feature_selection import SelectFromModel np.random.seed(1)让我们定义一种方法将数据集拆分为训练和测试数据; 我们将在训练部分训练我们的数据集,测试部分将用于评估训练模型:#Function to create Train and Test set from the original dataset def getTrainTestData(dataset,split):np.random.seed(0) training = [] testing = []np.random.shuffle(dataset) shape = np.shape(dataset)trainlength = np.uint16(np.floor(splitshape[0]))for i in range(trainlength): training.append(dataset[i])for i in range(trainlength,shape[0]): testing.append(dataset[i])training = np.array(training) testing = np.array(testing)return training,testing我们还需要添加一个函数来评估模型的准确性; 它将预测和实际输出作为输入来计算百分比准确度:#Function to evaluate model performancedef getAccuracy(pre,ytest): count = 0for i in range(len(ytest)):if ytest[i]==pre[i]: count+=1acc = float(count)/len(ytest)return acc这是加载数据集的时间。我们将加载train.csv文件; 此文件包含超过61,000个训练实例。我们将在我们的示例中使用50000个实例,其中我们将使用35,000个实例来训练分类器,并使用15,000个实例来测试分类器的性能:#Load dataset as pandas data framedata = read_csv(’train.csv’)#Extract attribute names from the data framefeat = data.keys()feat_labels = feat.get_values()#Extract data values from the data framedataset = data.values#Shuffle the datasetnp.random.shuffle(dataset)#We will select 50000 instances to train the classifierinst = 50000#Extract 50000 instances from the datasetdataset = dataset[0:inst,:]#Create Training and Testing data for performance evaluationtrain,test = getTrainTestData(dataset, 0.7)#Split data into input and output variable with selected featuresXtrain = train[:,0:94] ytrain = train[:,94] shape = np.shape(Xtrain)print(“Shape of the dataset “,shape)#Print the size of Data in MBsprint(“Size of Data set before feature selection: %.2f MB”%(Xtrain.nbytes/1e6))我们在这里注意数据大小; 因为我们的数据集包含大约35000个具有94个属性的训练实例; 我们的数据集的大小非常大。让我们来看看:Shape of the dataset (35000, 94)Size of Data set before feature selection: 26.32 MB如您所见,我们的数据集中有35000行和94列,超过26 MB数据。在下一个代码块中,我们将配置随机林分类器; 我们将使用250棵树,最大深度为30,随机要素的数量为7.其他超参数将是sklearn的默认值:#Lets select the test data for model evaluation purposeXtest = test[:,0:94] ytest = test[:,94]#Create a random forest classifier with the following Parameterstrees = 250max_feat = 7max_depth = 30min_sample = 2clf = RandomForestClassifier(n_estimators=trees,max_features=max_feat,max_depth=max_depth,min_samples_split= min_sample, random_state=0,n_jobs=-1)#Train the classifier and calculate the training timeimport timestart = time.time() clf.fit(Xtrain, ytrain) end = time.time()#Lets Note down the model training timeprint(“Execution time for building the Tree is: %f”%(float(end)- float(start)))pre = clf.predict(Xtest)Let’s see how much time is required to train the model on the training dataset:Execution time for building the Tree is: 2.913641#Evaluate the model performance for the test dataacc = getAccuracy(pre, ytest)print(“Accuracy of model before feature selection is %.2f”%(100acc))我们模型的准确性是:特征选择前的模型精度为98.82正如您所看到的,我们正在获得非常好的准确性,因为我们将近99%的测试数据分类到正确的类别中。这意味着我们正在对15,000个正确类中的14,823个实例进行分类。那么,现在我的问题是:我们是否应该进一步改进?好吧,为什么不呢?如果可以的话,我们肯定会寻求更多的改进; 在这里,我们将使用功能重要性来选择功能。如您所知,在树木构建过程中,我们使用杂质测量来选择节点。选择具有最低杂质的属性值作为树中的节点。我们可以使用类似的标准进行特征选择。我们可以更加重视杂质较少的功能,这可以使用sklearn库的feature_importances_函数来完成。让我们找出每个功能的重要性:#Once我们培养的模型中,我们的排名将所有功能的功能在拉链(feat_labels,clf.feature_importances_):print(feature)(‘id’, 0.33346650420175183)(‘feat_1’, 0.0036186958628801214)(‘feat_2’, 0.0037243050888530957)(‘feat_3’, 0.011579217472062748)(‘feat_4’, 0.010297382675187445)(‘feat_5’, 0.0010359139416194116)(‘feat_6’, 0.00038171336038056165)(‘feat_7’, 0.0024867672489765021)(‘feat_8’, 0.0096689721610546085)(‘feat_9’, 0.007906150362995093)(‘feat_10’, 0.0022342480802130366)正如您在此处所看到的,每个要素都基于其对最终预测的贡献而具有不同的重要性。我们将使用这些重要性分数来排列我们的功能; 在下面的部分中,我们将选择功能重要性大于0.01的模型训练功能:#Select features which have higher contribution in the final predictionsfm = SelectFromModel(clf, threshold=0.01) sfm.fit(Xtrain,ytrain)在这里,我们将根据所选的特征属性转换输入数据集。在下一个代码块中,我们将转换数据集。然后,我们将检查新数据集的大小和形状:#Transform input datasetXtrain_1 = sfm.transform(Xtrain) Xtest_1 = sfm.transform(Xtest)#Let’s see the size and shape of new dataset print(“Size of Data set before feature selection: %.2f MB”%(Xtrain_1.nbytes/1e6))shape = np.shape(Xtrain_1)print(“Shape of the dataset “,shape)Size of Data set before feature selection: 5.60 MB Shape of the dataset (35000, 20)你看到数据集的形状了吗?在功能选择过程之后,我们只剩下20个功能,这将数据库的大小从26 MB减少到5.60 MB。这比原始数据集减少了约80%。在下一个代码块中,我们将训练一个新的随机森林分类器,它具有与之前相同的超参数,并在测试数据集上进行测试。让我们看看修改训练集后得到的准确度:#Model training timestart = time.time() clf.fit(Xtrain_1, ytrain) end = time.time()print(“Execution time for building the Tree is: %f”%(float(end)- float(start)))#Let’s evaluate the model on test datapre = clf.predict(Xtest_1) count = 0acc2 = getAccuracy(pre, ytest)print(“Accuracy after feature selection %.2f”%(100*acc2))Execution time for building the Tree is: 1.711518 Accuracy after feature selection 99.97你能看到!! 我们使用修改后的数据集获得了99.97%的准确率,这意味着我们在正确的类中对14,996个实例进行了分类,而之前我们只正确地对14,823个实例进行了分类。这是我们在功能选择过程中取得的巨大进步; 我们可以总结下表中的所有结果:评估标准在选择特征之前选择功能后功能数量9420数据集的大小26.32 MB5.60 MB训练时间2.91秒1.71秒准确性98.82%99.97%上表显示了特征选择的实际优点。您可以看到我们显着减少了要素数量,从而降低了数据集的模型复杂性和维度。尺寸减小后我们的训练时间缩短,最后,我们克服了过度拟合问题,获得了比以前更高的精度。如果您发现这篇文章很有用,记得转发~ ...

April 12, 2019 · 4 min · jiezi

对话Ruby创始人松本行弘、阿里高级技术专家朴灵!

4月25日,云栖社区联合阿里云国际站,特别邀请了Ruby创始人Matz(松本行弘)、阿里云高级技术专家朴灵,来为开发者们分享干货。在本次活动上可以了解到Ruby语言最新的动态,Ruby和新语言golang在性能方面的差别。听听Matz畅谈他对云原生发展的看法,了解下他最近的动向。可以听到阿里云高级技术专家朴灵分享阿里云在开发语言上的动向,以及对于开发者的支持。马上免费报名围观:https://yq.aliyun.com/live/920?utm_content=g_1000050058活动议程:讲师介绍及演讲内容:讲师:松本行弘(MatsumotoYukihiro)1965年生。日本鸟取县米子市出身。毕业于筑波大学第三学群情报学类。Ruby程序设计语言的创始人。在“株式会社网络应用通信研究所”担任特别研究员,“一般财团法人Ruby ”担任理事长等多种职务。中学二年级时,在父亲的口袋型电脑 Sharp PC-1210 上以 Basic 写了第一个程式。 1984 年进入筑波大学第三学群资讯(情报)学类。大学其中两年休学,从事基督教传教工作。 大学时在程式语言研究室,1990 年毕业。1993年以来,一直从事Ruby的设计与开发。 1997 年开始,在「株式会社 Network 应用通信研究所」担任特别研究员,专注开发 Ruby。著书:「物件导向Script语言Ruby」(与石冢圭树共同著作),「RubyDesktopReference」,「软体工匠(ソフトウェアの匠)」等。 自称「语言otaku」(语言宅男)。演讲内容:For Matsumoto san’s topic:Introduce the most recent Ruby progress and roadmap, especially on comparison of new language like Go-lang especially performanceBest practise/approach to ruby with cloud native trend讲师:朴灵(田永强)阿里云高级技术专家,负责阿里云多语言SDKs&Tools工作。“深入浅出Node.js”作者,曾经是一个Node.js贡献者 。GitHub ID:JacksonTian田永强,文艺型码农,就职于阿里云基础产品事业部,Node.js布道者,写了多篇文章介绍Node.js的细节。活跃于CNode社区,是线下会议NodeParty的组织者和JSConf China(沪JS和京JS)的组织者之一。热爱开源,多个Node.js模块的作者。叩首问路,码梦为生。演讲内容:阿里巴巴的技术栈ruby sdk 的现状 和未来的计划阿里巴巴在serverless和cloud 的实践马上免费报名围观:https://yq.aliyun.com/live/920?utm_content=g_1000050058本文作者:山哥在这里阅读原文本文为云栖社区原创内容,未经允许不得转载。

April 2, 2019 · 1 min · jiezi